@saptools/cf-inspector 0.9.1 → 0.9.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/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts","../src/cdp/wsTransport.ts","../src/cli.ts","../src/cli/program.ts","../../core/src/package-metadata.ts","../../core/src/records.ts","../../core/src/saptools-paths.ts","../../core/src/self-update/reexec.ts","../../core/src/self-update/policy.ts","../../core/src/self-update/run.ts","../../core/src/self-update/install-location.ts","../../core/src/self-update/installer.ts","../../core/src/self-update/registry.ts","../../core/src/self-update/semver.ts","../../core/src/self-update/state.ts","../../core/src/self-update/commander.ts","../src/cli/commands/attach.ts","../src/inspector/discovery.ts","../src/cli/output.ts","../src/cli/target.ts","../src/cf/tunnel.ts","../src/inspector/session.ts","../src/cdp/client.ts","../src/inspector/conversions.ts","../src/cli/commandTypes.ts","../src/cli/sessionLock.ts","../src/cli/warnings.ts","../src/cli/captureParser.ts","../src/cli/commands/checkBreakpoint.ts","../src/pathMapper.ts","../src/inspector/breakpoints.ts","../src/cli/commands/eval.ts","../src/inspector/runtime.ts","../src/cli/commands/exception.ts","../src/inspector/pause.ts","../src/inspector/fanout.ts","../src/snapshot/evaluation.ts","../src/snapshot/values.ts","../src/snapshot/properties.ts","../src/snapshot/exception.ts","../src/snapshot/objects.ts","../src/snapshot/scopes.ts","../src/snapshot/stack.ts","../src/snapshot/capture.ts","../src/cli/signals.ts","../src/cli/commands/listScripts.ts","../src/cli/commands/log.ts","../src/logpoint/stream.ts","../src/logpoint/condition.ts","../src/logpoint/events.ts","../src/cli/commands/snapshot.ts","../src/cli/commands/watch.ts"],"sourcesContent":["export type CfInspectorErrorCode =\n | \"INVALID_ARGUMENT\"\n | \"INVALID_BREAKPOINT\"\n | \"INVALID_REMOTE_ROOT\"\n | \"INVALID_EXPRESSION\"\n | \"MUTATION_NOT_ALLOWED\"\n | \"SETUP_EVAL_FAILED\"\n | \"INVALID_HIT_COUNT\"\n | \"INVALID_PAUSE_TYPE\"\n | \"BREAKPOINT_DID_NOT_BIND\"\n | \"INSPECTOR_DISCOVERY_FAILED\"\n | \"INSPECTOR_CONNECTION_FAILED\"\n | \"TARGET_ALREADY_DEBUGGED\"\n | \"CDP_REQUEST_FAILED\"\n | \"BREAKPOINT_NOT_HIT\"\n | \"UNRELATED_PAUSE\"\n | \"UNRELATED_PAUSE_TIMEOUT\"\n | \"EVALUATION_FAILED\"\n | \"MISSING_TARGET\"\n | \"ABORTED\";\n\nexport class CfInspectorError extends Error {\n public readonly code: CfInspectorErrorCode;\n public readonly detail?: string;\n\n public constructor(code: CfInspectorErrorCode, message: string, detail?: string) {\n super(message);\n this.name = \"CfInspectorError\";\n this.code = code;\n if (detail !== undefined) {\n this.detail = detail;\n }\n }\n}\n\nexport interface BreakpointLocation {\n readonly file: string;\n readonly line: number;\n}\n\nexport interface RemoteRootLiteral {\n readonly kind: \"literal\";\n readonly value: string;\n}\n\nexport interface RemoteRootRegex {\n readonly kind: \"regex\";\n readonly pattern: string;\n readonly flags: string;\n}\n\nexport interface RemoteRootNone {\n readonly kind: \"none\";\n}\n\nexport type RemoteRootSetting = RemoteRootLiteral | RemoteRootRegex | RemoteRootNone;\n\nexport interface BreakpointHandle {\n readonly breakpointId: string;\n readonly file: string;\n readonly line: number;\n readonly urlRegex: string;\n readonly resolvedLocations: readonly ResolvedLocation[];\n}\n\nexport interface ScriptLocation {\n readonly scriptId: string;\n readonly lineNumber: number;\n readonly columnNumber?: number;\n}\n\nexport interface BreakLocation extends ScriptLocation {\n readonly type?: string;\n}\n\nexport interface ResolvedLocation extends ScriptLocation {\n readonly url?: string;\n}\n\nexport interface GetPossibleBreakpointsOptions {\n readonly start: ScriptLocation;\n readonly end?: ScriptLocation;\n readonly restrictToFunction?: boolean;\n}\n\nexport interface SetBreakpointAtLocationInput {\n readonly location: ScriptLocation;\n readonly condition?: string;\n}\n\nexport interface ExactBreakpointHandle {\n readonly breakpointId: string;\n readonly requestedLocation: ScriptLocation;\n readonly actualLocation: ScriptLocation;\n}\n\nexport interface RemoteObjectInfo {\n readonly type: string;\n readonly subtype?: string;\n readonly className?: string;\n readonly completeness?: \"truncated\" | \"unavailable\";\n readonly value?: unknown;\n readonly unserializableValue?: string;\n readonly description?: string;\n readonly deepSerializedValue?: unknown;\n readonly objectId?: string;\n readonly preview?: unknown;\n readonly customPreview?: unknown;\n}\n\nexport interface StackTraceIdInfo {\n readonly id: string;\n readonly debuggerId?: string;\n}\n\nexport interface StackTraceFrameInfo {\n readonly functionName: string;\n readonly scriptId: string;\n readonly url: string;\n readonly lineNumber: number;\n readonly columnNumber: number;\n}\n\nexport interface StackTraceInfo {\n readonly description?: string;\n readonly callFrames: readonly StackTraceFrameInfo[];\n readonly parent?: StackTraceInfo;\n readonly parentId?: StackTraceIdInfo;\n}\n\nexport interface CallFrameInfo {\n readonly callFrameId: string;\n readonly functionName: string;\n readonly scriptId?: string;\n readonly functionLocation?: ScriptLocation;\n readonly url?: string;\n readonly lineNumber: number;\n readonly columnNumber: number;\n readonly scopeChain: readonly ScopeInfo[];\n readonly thisObject?: RemoteObjectInfo;\n readonly returnValue?: RemoteObjectInfo;\n}\n\nexport interface ScopeInfo {\n readonly type: string;\n readonly objectId?: string;\n readonly object?: RemoteObjectInfo;\n readonly name?: string;\n readonly startLocation?: ScriptLocation;\n readonly endLocation?: ScriptLocation;\n}\n\nexport interface PauseEvent {\n readonly reason: string;\n readonly hitBreakpoints: readonly string[];\n readonly callFrames: readonly CallFrameInfo[];\n readonly receivedAtMs?: number;\n readonly data?: unknown;\n readonly asyncStackTrace?: StackTraceInfo;\n readonly asyncStackTraceId?: StackTraceIdInfo;\n readonly asyncCallStackTraceId?: StackTraceIdInfo;\n}\n\nexport interface VariableSnapshot {\n readonly name: string;\n readonly value: string;\n readonly type?: string;\n readonly children?: readonly VariableSnapshot[];\n readonly truncated?: true;\n readonly originalLength?: number;\n readonly omittedCount?: number;\n}\n\nexport interface ScopeSnapshot {\n readonly type: string;\n readonly variables: readonly VariableSnapshot[];\n readonly truncated?: true;\n readonly omittedCount?: number;\n}\n\nexport interface FrameSnapshot {\n readonly functionName: string;\n readonly url?: string;\n readonly line: number;\n readonly column: number;\n readonly scopes?: readonly ScopeSnapshot[];\n readonly captures?: readonly CapturedExpression[];\n readonly truncated?: true;\n readonly omittedCount?: number;\n}\n\nexport interface CapturedExpression {\n readonly expression: string;\n readonly value?: string;\n readonly type?: string;\n readonly error?: string;\n readonly mutationRisk?: boolean;\n readonly blocked?: true;\n readonly truncated?: true;\n readonly originalLength?: number;\n readonly omittedCount?: number;\n}\n\nexport interface ExceptionSnapshot {\n readonly value?: string;\n readonly type?: string;\n readonly description?: string;\n readonly error?: string;\n readonly truncated?: true;\n readonly originalLength?: number;\n readonly valueOriginalLength?: number;\n readonly descriptionOriginalLength?: number;\n readonly omittedCount?: number;\n}\n\nexport interface SnapshotCaptureResult {\n readonly reason: string;\n readonly hitBreakpoints: readonly string[];\n readonly capturedAt: string;\n readonly topFrame?: FrameSnapshot;\n readonly captures: readonly CapturedExpression[];\n readonly stack?: readonly FrameSnapshot[];\n readonly exception?: ExceptionSnapshot;\n readonly isolate?: InspectorIsolate;\n}\n\nexport interface SnapshotResult extends SnapshotCaptureResult {\n readonly pausedDurationMs: number | null;\n}\n\nexport interface WatchEvent {\n readonly ts: string;\n readonly at: string;\n readonly hit: number;\n readonly reason: string;\n readonly hitBreakpoints: readonly string[];\n readonly topFrame?: FrameSnapshot;\n readonly captures: readonly CapturedExpression[];\n readonly stack?: readonly FrameSnapshot[];\n readonly exception?: ExceptionSnapshot;\n readonly isolate?: InspectorIsolate;\n}\n\nexport type InspectorIsolate =\n | { readonly kind: \"main\" }\n | { readonly kind: \"worker\"; readonly workerId: string };\n\nexport type ArmedCommand = \"snapshot\" | \"watch\" | \"exception\" | \"log\";\n\nexport interface ArmedEvent {\n readonly event: \"breakpoint-armed\";\n readonly schemaVersion: 1;\n readonly command: ArmedCommand;\n readonly sessions: number;\n readonly resolvedLocations: number | null;\n readonly timeoutMs: number | null;\n}\n\nexport interface ScriptInfo {\n readonly scriptId: string;\n readonly url: string;\n readonly startLine?: number;\n readonly startColumn?: number;\n readonly endLine?: number;\n readonly endColumn?: number;\n readonly executionContextId?: number;\n readonly hash?: string;\n readonly buildId?: string;\n readonly executionContextAuxData?: unknown;\n readonly sourceMapURL?: string;\n readonly hasSourceURL?: boolean;\n readonly isModule?: boolean;\n readonly length?: number;\n readonly stackTrace?: StackTraceInfo;\n}\n\nexport interface ListedScriptInfo extends ScriptInfo {\n readonly isolate: InspectorIsolate;\n}\n\nexport interface InspectorConnectOptions {\n readonly port: number;\n readonly host?: string;\n readonly connectTimeoutMs?: number;\n readonly targetIndex?: number;\n readonly workerIndex?: number;\n readonly workerId?: string;\n}\n\nexport type CdpMessage =\n | { readonly id: number; readonly result: unknown }\n | { readonly id: number; readonly error: { readonly code: number; readonly message: string } }\n | { readonly method: string; readonly params: unknown };\n","import { WebSocket } from \"ws\";\n\nimport { CfInspectorError } from \"../types.js\";\n\nimport type { CdpTransport, CdpTransportEventMap } from \"./client.js\";\n\nexport interface WsTransportOptions {\n readonly connectTimeoutMs?: number;\n}\n\nexport async function wsTransportFactory(\n url: string,\n options: WsTransportOptions = {},\n): Promise<CdpTransport> {\n const socket = new WebSocket(url, { perMessageDeflate: false });\n await waitForOpen(socket, url, options.connectTimeoutMs);\n // Keyed by `(event, listener)` — registering the same listener function for\n // two different events must produce two distinct wrappers; otherwise `off`\n // for one event would unsubscribe the wrong wrapper.\n const wrappers = new Map<keyof CdpTransportEventMap, WeakMap<object, (...args: unknown[]) => void>>();\n\n function wrappersFor(event: keyof CdpTransportEventMap): WeakMap<object, (...args: unknown[]) => void> {\n const existing = wrappers.get(event);\n if (existing !== undefined) {\n return existing;\n }\n const created = new WeakMap<object, (...args: unknown[]) => void>();\n wrappers.set(event, created);\n return created;\n }\n\n return {\n send(payload: string): void {\n socket.send(payload);\n },\n close(): void {\n socket.close();\n },\n get readyState(): number {\n return socket.readyState;\n },\n on(event, listener): void {\n const wrapped = wrapListener(event, listener);\n wrappersFor(event).set(listener as object, wrapped);\n socket.on(event, wrapped);\n },\n off(event, listener): void {\n const wrapped = wrappersFor(event).get(listener as object);\n if (!wrapped) {\n return;\n }\n socket.off(event, wrapped);\n },\n };\n}\n\nasync function waitForOpen(socket: WebSocket, url: string, timeoutMs: number | undefined): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n const cleanup = (): void => {\n socket.off(\"open\", onOpen);\n socket.off(\"error\", onError);\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n };\n const onOpen = (): void => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n resolve();\n };\n const onError = (err: Error): void => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n reject(\n new CfInspectorError(\n \"INSPECTOR_CONNECTION_FAILED\",\n `Failed to connect to inspector at ${url}: ${err.message}`,\n ),\n );\n };\n const timer = timeoutMs === undefined ? undefined : setTimeout(() => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n // Absorb the 'error' event that ws emits asynchronously when terminate()\n // races an in-flight handshake. Without this swallower the post-cleanup\n // error becomes an unhandled exception.\n socket.on(\"error\", () => {\n // swallow\n });\n try {\n socket.terminate();\n } catch {\n // best-effort\n }\n reject(\n new CfInspectorError(\n \"INSPECTOR_CONNECTION_FAILED\",\n `WebSocket handshake to ${url} timed out after ${timeoutMs.toString()}ms`,\n ),\n );\n }, timeoutMs);\n socket.once(\"open\", onOpen);\n socket.once(\"error\", onError);\n });\n}\n\nfunction wrapListener<E extends keyof CdpTransportEventMap>(\n event: E,\n listener: CdpTransportEventMap[E],\n): (...args: unknown[]) => void {\n if (event === \"message\") {\n const wrapped = (data: Buffer): void => {\n (listener as CdpTransportEventMap[\"message\"])(data.toString(\"utf8\"));\n };\n return wrapped as (...args: unknown[]) => void;\n }\n if (event === \"close\") {\n const wrapped = (): void => {\n (listener as CdpTransportEventMap[\"close\"])();\n };\n return wrapped as (...args: unknown[]) => void;\n }\n const wrapped = (err: Error): void => {\n (listener as CdpTransportEventMap[\"error\"])(err);\n };\n return wrapped as (...args: unknown[]) => void;\n}\n","import process from \"node:process\";\n\nimport { main } from \"./cli/program.js\";\nimport { CfInspectorError } from \"./types.js\";\n\ntry {\n await main(process.argv);\n} catch (err: unknown) {\n if (err instanceof CfInspectorError) {\n process.stderr.write(`Error [${err.code}]: ${err.message}\\n`);\n if (err.detail !== undefined) {\n process.stderr.write(` detail: ${err.detail}\\n`);\n }\n process.exit(1);\n }\n const message = err instanceof Error ? err.message : String(err);\n process.stderr.write(`Error: ${message}\\n`);\n process.exit(1);\n}\n","import process from \"node:process\";\n\nimport { attachSelfUpdate, readPackageMetadata, registerSelfUpdateCommand } from \"@saptools/core\";\nimport { Command } from \"commander\";\n\nimport type {\n AttachCommandOptions,\n CheckBreakpointCommandOptions,\n EvalCommandOptions,\n ExceptionCommandOptions,\n ListScriptsCommandOptions,\n ListTargetsCommandOptions,\n LogCommandOptions,\n SnapshotCommandOptions,\n WatchCommandOptions,\n} from \"./commandTypes.js\";\nimport { handleAttach } from \"./commands/attach.js\";\nimport { handleCheckBreakpoint } from \"./commands/checkBreakpoint.js\";\nimport { handleEval } from \"./commands/eval.js\";\nimport { handleException } from \"./commands/exception.js\";\nimport { handleListScripts, handleListTargets } from \"./commands/listScripts.js\";\nimport { handleLog } from \"./commands/log.js\";\nimport { handleSnapshot } from \"./commands/snapshot.js\";\nimport { handleWatch } from \"./commands/watch.js\";\n\nfunction applyTargetOptions(\n cmd: Command,\n options: {\n readonly includeTarget?: boolean;\n readonly includeTimeout?: boolean;\n readonly includeWorker?: boolean;\n } = {},\n): Command {\n const withEndpointOptions = cmd\n .option(\"--port <number>\", \"Local port the inspector or tunnel listens on\")\n .option(\"--host <host>\", \"Hostname (default: 127.0.0.1)\", \"127.0.0.1\")\n .option(\"--region <key>\", \"CF region key (required with --app)\")\n .option(\"--api-endpoint <url>\", \"CF API endpoint override for --region\")\n .option(\"--org <name>\", \"CF org name (required with --app)\")\n .option(\"--space <name>\", \"CF space name (required with --app)\")\n .option(\n \"--app <name>\",\n \"CF app name; requires explicit --region/--org/--space (ambient cf target is ignored)\",\n );\n const withTargetOption = options.includeTarget === false\n ? withEndpointOptions\n : withEndpointOptions.option(\n \"--target <index>\",\n \"Inspector target index from /json/list (default: 0)\",\n );\n const withWorkerOption = options.includeWorker === false\n ? withTargetOption\n : withTargetOption\n .option(\"--worker <index>\", \"NodeWorker sub-session index listed by list-targets\")\n .option(\"--worker-id <id>\", \"Stable NodeWorker workerId listed by list-targets\")\n .option(\"--main-only\", \"Attach only to the main isolate and ignore workers\");\n return options.includeTimeout === false\n ? withWorkerOption\n : withWorkerOption.option(\"--timeout <seconds>\", \"Timeout for CF tunnel readiness in seconds (default: 180)\");\n}\n\nconst collectStrings = (value: string, prev: readonly string[] = []): readonly string[] => [\n ...prev,\n value,\n];\n\nconst READY_EVENT_DESCRIPTION =\n \"Emit a versioned breakpoint-armed JSON event on stderr after every current isolate is armed\";\n\n/**\n * Update notices go to stderr like every other diagnostic, except under\n * `--emit-ready-event`, where stderr carries a machine-parsed JSON event and\n * must stay clean; the update itself still happens.\n */\nfunction writeUpdateNotice(argv: readonly string[], line: string): void {\n if (argv.includes(\"--emit-ready-event\")) {\n return;\n }\n process.stderr.write(`cf-inspector: ${line}\\n`);\n}\n\nexport async function main(argv: readonly string[]): Promise<void> {\n const { version } = readPackageMetadata(import.meta.url, \"@saptools/cf-inspector\");\n // Every command first checks npm (at most once an hour) and re-runs itself on a newer release; see `@saptools/core`.\n const selfUpdate = {\n packageName: \"@saptools/cf-inspector\",\n currentVersion: version,\n binName: \"cf-inspector\",\n envPrefix: \"CF_INSPECTOR\",\n notice: (line: string): void => {\n writeUpdateNotice(argv, line);\n },\n };\n const program = new Command();\n program\n .name(\"cf-inspector\")\n .version(version)\n .description(\"Drive a Node.js inspector from the command line — set breakpoints, capture snapshots, evaluate expressions\");\n attachSelfUpdate(program, selfUpdate);\n\n registerSnapshot(program);\n registerLog(program);\n registerWatch(program);\n registerException(program);\n registerCheckBreakpoint(program);\n registerEval(program);\n registerListScripts(program);\n registerListTargets(program);\n registerAttach(program);\n registerSelfUpdateCommand(program, selfUpdate);\n\n await program.parseAsync([...argv]);\n}\n\nfunction registerCheckBreakpoint(program: Command): void {\n applyTargetOptions(\n program.command(\"check-breakpoint\").description(\n \"Report whether a loaded script can break at a file:line location\",\n ),\n )\n .requiredOption(\"--bp <file:line>\", \"Source location to check\")\n .option(\"--remote-root <value>\", \"Path-mapping anchor: literal path or regex:<pattern> / /pattern/flags\")\n .option(\"--no-json\", \"Print a human-readable result instead of JSON\")\n .action(async (opts: CheckBreakpointCommandOptions): Promise<void> => {\n await handleCheckBreakpoint(opts);\n });\n}\n\nfunction registerSnapshot(program: Command): void {\n applyTargetOptions(\n program.command(\"snapshot\").description(\"Set a breakpoint, wait for it to hit, capture expressions, and resume\"),\n { includeTimeout: false },\n )\n .option(\"--bp <file:line>\", \"Breakpoint location (repeatable; first hit wins), e.g. src/handler.ts:42\", collectStrings, [] as readonly string[])\n .option(\"--capture <expr,…>\", \"Top-level comma-separated expressions to evaluate in the paused frame\")\n .option(\"--setup-eval <expr>\", \"Evaluate a global setup expression before breakpoint setup (repeatable)\", collectStrings, [] as readonly string[])\n .option(\"--timeout <seconds>\", \"How long to wait for the breakpoint to hit (default: 30)\")\n .option(\"--max-value-length <chars>\", \"Maximum characters per captured value before truncation (default: 131072)\")\n .option(\"--remote-root <value>\", \"Path-mapping anchor: literal path or regex:<pattern> / /pattern/flags\")\n .option(\"--condition <expr>\", \"Only pause when this JS expression evaluates truthy in the paused frame\")\n .option(\"--hit-count <n>\", \"Only pause after the breakpoint has been hit N or more times\")\n .option(\"--stack-depth <n>\", \"Walk this many call frames when capturing (default: 1, only top frame)\")\n .option(\"--stack-captures <expr,…>\", \"Expressions to evaluate on each call frame in the stack\")\n .option(\"--allow-mutation\", \"Allow mutation-capable captures and native breakpoint conditions to run\")\n .option(\"--include-scopes\", \"Include expanded paused-frame scopes in the snapshot\")\n .option(\"--no-json\", \"Print a human-readable summary instead of JSON\")\n .option(\"--quiet\", \"Suppress progress messages on stderr\")\n .option(\"--ready-event\", READY_EVENT_DESCRIPTION)\n .option(\"--keep-paused\", \"Skip Debugger.resume after capture; Node may resume when this CLI disconnects\")\n .option(\"--fail-on-unmatched-pause\", \"Fail immediately if the target pauses somewhere else\")\n .action(async (opts: SnapshotCommandOptions): Promise<void> => {\n await handleSnapshot(opts);\n });\n}\n\nfunction registerLog(program: Command): void {\n applyTargetOptions(\n program.command(\"log\").description(\"Stream a non-pausing logpoint: log an expression each time a line executes\"),\n )\n .requiredOption(\"--at <file:line>\", \"Logpoint location, e.g. src/handler.ts:42\")\n .requiredOption(\"--expr <expression>\", \"JavaScript expression to log on each hit\")\n .option(\"--remote-root <value>\", \"Path-mapping anchor: literal path or regex:<pattern> / /pattern/flags\")\n .option(\"--duration <seconds>\", \"Stop streaming after N seconds (default: run until SIGINT)\")\n .option(\"--max-events <n>\", \"Stop streaming after emitting N log events\")\n .option(\"--hit-count <n>\", \"Start logging once the line has been hit N or more times\")\n .option(\"--condition <expr>\", \"Only log when this JS expression evaluates truthy on the inspectee\")\n .option(\"--max-value-length <chars>\", \"Maximum characters per log value before truncation (default: 4096)\")\n .option(\"--no-json\", \"Print human-readable lines instead of JSON Lines\")\n .option(\"--ready-event\", READY_EVENT_DESCRIPTION)\n .action(async (opts: LogCommandOptions): Promise<void> => {\n await handleLog(opts);\n });\n}\n\nfunction registerWatch(program: Command): void {\n applyTargetOptions(\n program.command(\"watch\").description(\"Stream a snapshot per breakpoint hit (multi-shot watch); resume between hits\"),\n { includeTimeout: false },\n )\n .option(\"--bp <file:line>\", \"Breakpoint location (repeatable), e.g. src/handler.ts:42\", collectStrings, [] as readonly string[])\n .option(\"--capture <expr,…>\", \"Top-level comma-separated expressions to evaluate per hit\")\n .option(\"--setup-eval <expr>\", \"Evaluate a global setup expression before breakpoint setup (repeatable)\", collectStrings, [] as readonly string[])\n .option(\"--condition <expr>\", \"Only emit hits where this JS expression evaluates truthy\")\n .option(\"--hit-count <n>\", \"Start emitting after the line has been hit N or more times\")\n .option(\"--remote-root <value>\", \"Path-mapping anchor: literal path or regex:<pattern> / /pattern/flags\")\n .option(\"--duration <seconds>\", \"Stop streaming after N seconds (default: run until SIGINT)\")\n .option(\"--max-events <n>\", \"Stop streaming after emitting N watch events\")\n .option(\"--timeout <seconds>\", \"How long to wait for the next hit before giving up (default: 30)\")\n .option(\"--max-value-length <chars>\", \"Maximum characters per captured value before truncation (default: 4096)\")\n .option(\"--stack-depth <n>\", \"Walk this many call frames per hit (default: 1)\")\n .option(\"--stack-captures <expr,…>\", \"Expressions to evaluate on each call frame\")\n .option(\"--allow-mutation\", \"Allow mutation-capable captures and native breakpoint conditions to run\")\n .option(\"--include-scopes\", \"Include expanded paused-frame scopes per hit\")\n .option(\"--no-json\", \"Print human-readable lines instead of JSON Lines\")\n .option(\"--ready-event\", READY_EVENT_DESCRIPTION)\n .action(async (opts: WatchCommandOptions): Promise<void> => {\n await handleWatch(opts);\n });\n}\n\nfunction registerException(program: Command): void {\n applyTargetOptions(\n program.command(\"exception\").description(\"Pause on a thrown exception, capture the value and frame, then resume\"),\n { includeTimeout: false },\n )\n .option(\"--type <state>\", \"Pause type: uncaught (default), caught, or all\")\n .option(\"--capture <expr,…>\", \"Top-level comma-separated expressions to evaluate in the paused frame\")\n .option(\"--remote-root <value>\", \"Path-mapping anchor: literal path or regex:<pattern> / /pattern/flags\")\n .option(\"--timeout <seconds>\", \"How long to wait for an exception (default: 30)\")\n .option(\"--max-value-length <chars>\", \"Maximum characters per captured value before truncation (default: 131072)\")\n .option(\"--stack-depth <n>\", \"Walk this many call frames when capturing (default: 1)\")\n .option(\"--stack-captures <expr,…>\", \"Expressions to evaluate on each call frame in the stack\")\n .option(\"--allow-mutation\", \"Allow mutation-capable capture expressions to run\")\n .option(\"--include-scopes\", \"Include expanded paused-frame scopes in the snapshot\")\n .option(\"--keep-paused\", \"Skip Debugger.resume after capture; Node may resume when this CLI disconnects\")\n .option(\"--no-json\", \"Print a human-readable summary instead of JSON\")\n .option(\"--ready-event\", READY_EVENT_DESCRIPTION)\n .action(async (opts: ExceptionCommandOptions): Promise<void> => {\n await handleException(opts);\n });\n}\n\nfunction registerEval(program: Command): void {\n applyTargetOptions(\n program.command(\"eval\").description(\"Evaluate an expression against the global Runtime\"),\n )\n .requiredOption(\"--expr <expression>\", \"JavaScript expression to evaluate\")\n .option(\"--no-json\", \"Print only the resulting value, not the full CDP envelope\")\n .action(async (opts: EvalCommandOptions): Promise<void> => {\n await handleEval(opts);\n });\n}\n\nfunction registerListScripts(program: Command): void {\n applyTargetOptions(\n program.command(\"list-scripts\").description(\n \"Print scripts from the main isolate and every worker, tagged by isolate\",\n ),\n )\n .option(\"--filter <pattern>\", \"Only include script URLs matching this pattern\")\n .option(\"--no-json\", \"Print scriptId<TAB>url<TAB>isolate instead of JSON\")\n .action(async (opts: ListScriptsCommandOptions): Promise<void> => {\n await handleListScripts(opts);\n });\n}\n\nfunction registerListTargets(program: Command): void {\n applyTargetOptions(\n program.command(\"list-targets\").description(\n \"List raw /json/list targets and nested workers; use --target or --worker on other commands\",\n ),\n { includeTarget: false, includeWorker: false },\n )\n .option(\n \"--no-json\",\n \"Print tab-separated target/worker rows: index, kind, type, title, and URL\",\n )\n .action(async (opts: ListTargetsCommandOptions): Promise<void> => {\n await handleListTargets(opts);\n });\n}\n\nfunction registerAttach(program: Command): void {\n applyTargetOptions(\n program.command(\"attach\").description(\"Connect, fetch the inspector version, and disconnect (smoke-test)\"),\n { includeTarget: false, includeWorker: false },\n )\n .option(\"--no-json\", \"Print a multi-line summary instead of JSON\")\n .action(async (opts: AttachCommandOptions): Promise<void> => {\n await handleAttach(opts);\n });\n}\n","import { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { isRecord, readString } from \"./records.js\";\n\nexport interface PackageMetadata {\n readonly name: string;\n readonly version: string;\n /** Directory that holds the package.json. */\n readonly directory: string;\n}\n\n/**\n * A bundled CLI lives at `<package>/dist/cli.js`; a source file under test at\n * `<package>/src/...`; tsup chunks one level deeper. Six levels covers every\n * layout in this repo with room to spare while still failing fast on a stray\n * file outside any package.\n */\nconst MAX_WALK_UP = 6;\n\n/** Parse `<directory>/package.json`; undefined when missing, unreadable, or not a manifest with name and version. */\nexport function readPackageManifest(directory: string): PackageMetadata | undefined {\n let raw: string;\n try {\n raw = readFileSync(join(directory, \"package.json\"), \"utf8\");\n } catch {\n return;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return;\n }\n if (!isRecord(parsed)) {\n return;\n }\n const name = readString(parsed, \"name\");\n const version = readString(parsed, \"version\");\n if (name === undefined || version === undefined) {\n return;\n }\n return { name, version, directory };\n}\n\n/** Walk up from `startDirectory` to the nearest package.json whose `name` is `expectedName`. */\nexport function findPackageMetadata(startDirectory: string, expectedName: string): PackageMetadata | undefined {\n let current = startDirectory;\n for (let depth = 0; depth < MAX_WALK_UP; depth += 1) {\n const manifest = readPackageManifest(current);\n if (manifest?.name === expectedName) {\n return manifest;\n }\n const parent = dirname(current);\n if (parent === current) {\n return;\n }\n current = parent;\n }\n return;\n}\n\n/**\n * Version and name of the package that owns the calling module, read from its\n * package.json at runtime so `--version` and the self-updater can never drift\n * from the manifest the way a hand-maintained constant does. Throws when the\n * manifest cannot be found: a broken install should fail loudly, not report\n * \"0.0.0\".\n */\nexport function readPackageMetadata(importMetaUrl: string, expectedName: string): PackageMetadata {\n const startDirectory = dirname(fileURLToPath(importMetaUrl));\n const found = findPackageMetadata(startDirectory, expectedName);\n if (found === undefined) {\n throw new Error(`Cannot find the package.json of ${expectedName} above ${startDirectory}`);\n }\n return found;\n}\n","export function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/** A non-empty string field of a parsed JSON object, or undefined when absent or of another type. */\nexport function readString(record: Record<string, unknown>, key: string): string | undefined {\n const value = record[key];\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n","import { chmodSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport const SAPTOOLS_DIR_NAME = \".saptools\";\n/** Relocates every saptools state file at once; packages may still offer their own narrower override. */\nexport const SAPTOOLS_ROOT_ENV = \"SAPTOOLS_ROOT\";\n\nexport function resolveSaptoolsRoot(explicit?: string, env: NodeJS.ProcessEnv = process.env): string {\n if (explicit !== undefined && explicit.length > 0) {\n return explicit;\n }\n const fromEnv = env[SAPTOOLS_ROOT_ENV];\n if (fromEnv !== undefined && fromEnv.length > 0) {\n return fromEnv;\n }\n return join(homedir(), SAPTOOLS_DIR_NAME);\n}\n\n/**\n * Create `directory` (and missing parents) readable by the current user only.\n * Only the leaf has its mode enforced: parents such as `~/.saptools` itself\n * belong to every tool and keep whatever mode they already have.\n */\nexport function ensurePrivateDirectorySync(directory: string): void {\n mkdirSync(directory, { recursive: true, mode: 0o700 });\n try {\n chmodSync(directory, 0o700);\n } catch {\n // Filesystems without POSIX modes (some network mounts, Windows) reject chmod; the directory still exists.\n }\n}\n\n/**\n * Replace `path` atomically: write a sibling temp file with `mode`, then\n * rename it over the target, so a concurrent reader never sees a half-written\n * file and a crash never leaves a truncated one behind.\n */\nexport function writeFileAtomicSync(path: string, data: string, mode = 0o600): void {\n const temp = `${path}.${String(process.pid)}.${Math.random().toString(36).slice(2, 8)}.tmp`;\n try {\n writeFileSync(temp, data, { encoding: \"utf8\", mode });\n try {\n chmodSync(temp, mode);\n } catch {\n // Same as above: best effort where modes are unsupported.\n }\n renameSync(temp, path);\n } catch (error) {\n rmSync(temp, { force: true });\n throw error;\n }\n}\n\n/** Parse a JSON file; a missing or malformed file reads as undefined so corrupt state can never break a command. */\nexport function readJsonFileSync(path: string): unknown {\n let raw: string;\n try {\n raw = readFileSync(path, \"utf8\");\n } catch {\n return;\n }\n try {\n return JSON.parse(raw) as unknown;\n } catch {\n return;\n }\n}\n","import { spawn } from \"node:child_process\";\nimport { constants } from \"node:os\";\n\nimport type { SpawnLike } from \"./process-types.js\";\n\n/** Set on the re-executed process so it can never start a second update. */\nexport const REEXEC_MARKER_ENV = \"SAPTOOLS_SELF_UPDATE_REEXEC\";\n\nexport interface ReexecRequest {\n readonly execPath: string;\n readonly execArgv: readonly string[];\n readonly binPath: string;\n readonly args: readonly string[];\n readonly env: NodeJS.ProcessEnv;\n}\n\n/** Resolves only when the re-executed command has finished and the replacement failed to end this process itself. */\nexport type ReexecImpl = (request: ReexecRequest) => Promise<void>;\n\ntype ExecveLike = (file: string, args: readonly string[], env: NodeJS.ProcessEnv) => never;\n\nexport interface ReexecRuntime {\n readonly platform: NodeJS.Platform;\n readonly execve: ExecveLike | undefined;\n readonly spawnImpl: SpawnLike;\n readonly onSignal: (signal: NodeJS.Signals, handler: (signal: NodeJS.Signals) => void) => void;\n readonly offSignal: (signal: NodeJS.Signals, handler: (signal: NodeJS.Signals) => void) => void;\n readonly kill: (pid: number, signal: NodeJS.Signals) => void;\n readonly exit: (code: number) => void;\n}\n\nconst FORWARDED_SIGNALS: readonly NodeJS.Signals[] = [\"SIGINT\", \"SIGTERM\", \"SIGHUP\"];\n\nfunction nativeExecve(): ExecveLike | undefined {\n return process.execve?.bind(process);\n}\n\nfunction defaultRuntime(): ReexecRuntime {\n return {\n platform: process.platform,\n execve: nativeExecve(),\n spawnImpl: spawn,\n onSignal: (signal, handler): void => {\n process.on(signal, handler);\n },\n offSignal: (signal, handler): void => {\n process.off(signal, handler);\n },\n kill: (pid, signal): void => {\n process.kill(pid, signal);\n },\n exit: (code): void => {\n process.exit(code);\n },\n };\n}\n\nexport function buildReexecArgv(request: ReexecRequest): string[] {\n return [...request.execArgv, request.binPath, ...request.args];\n}\n\nexport function reexecEnvironment(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n return { ...env, [REEXEC_MARKER_ENV]: \"1\" };\n}\n\nfunction signalExitCode(signal: NodeJS.Signals): number {\n const number = constants.signals[signal];\n return 128 + number;\n}\n\n/**\n * Run the same command again on the freshly installed version. On POSIX with\n * Node >= 22.15 the process image is replaced outright (`execve`), so stdin,\n * stdout, the exit code and signals all belong to the new version with no\n * wrapper left behind. Elsewhere a child inherits our stdio, terminal signals\n * are forwarded to it, and we mirror its exit code or signal.\n */\nexport async function reexecProcess(request: ReexecRequest, runtimeOverrides: Partial<ReexecRuntime> = {}): Promise<void> {\n const runtime: ReexecRuntime = { ...defaultRuntime(), ...runtimeOverrides };\n const argv = buildReexecArgv(request);\n const env = reexecEnvironment(request.env);\n\n if (runtime.platform !== \"win32\" && runtime.execve !== undefined) {\n try {\n runtime.execve(request.execPath, [request.execPath, ...argv], env);\n } catch {\n // execve refused (for example EACCES on an odd mount): the child-process route below still works.\n }\n }\n\n await new Promise<void>((resolve, reject) => {\n const child = runtime.spawnImpl(request.execPath, argv, { stdio: \"inherit\", env });\n const forward = (signal: NodeJS.Signals): void => {\n child.kill(signal);\n };\n for (const signal of FORWARDED_SIGNALS) {\n runtime.onSignal(signal, forward);\n }\n const detach = (): void => {\n for (const signal of FORWARDED_SIGNALS) {\n runtime.offSignal(signal, forward);\n }\n };\n child.once(\"error\", (error) => {\n detach();\n reject(error);\n });\n child.once(\"exit\", (code, signal) => {\n detach();\n if (signal === null) {\n runtime.exit(code ?? 1);\n } else {\n runtime.kill(process.pid, signal);\n runtime.exit(signalExitCode(signal));\n }\n resolve();\n });\n });\n}\n","import type { InstallLocation } from \"./install-location.js\";\nimport { REEXEC_MARKER_ENV } from \"./reexec.js\";\n\nexport type UpdatePolicy = \"on\" | \"notify\" | \"off\";\n\nexport const POLICY_ENV = \"SAPTOOLS_AUTO_UPDATE\";\nexport const INTERVAL_ENV = \"SAPTOOLS_UPDATE_INTERVAL_MINUTES\";\nexport const DEBUG_ENV = \"SAPTOOLS_UPDATE_DEBUG\";\nexport const DEFAULT_CHECK_INTERVAL_MINUTES = 60;\nexport const SELF_UPDATE_COMMAND = \"self-update\";\n\nexport interface PolicyDecision {\n readonly policy: UpdatePolicy;\n readonly reason: string;\n /** True when the user set the policy through the environment rather than relying on the default. */\n readonly explicit: boolean;\n}\n\nexport interface ResolvePolicyInput {\n readonly env: NodeJS.ProcessEnv;\n readonly envPrefix?: string;\n readonly location: InstallLocation;\n /** Space-joined command path being run, e.g. `credential list`; empty for the root action. */\n readonly commandPath?: string;\n readonly skipCommands?: readonly string[];\n /** The explicit `self-update` command: ignore the exclusions and CI/test gates, but never the install-location facts. */\n readonly manual?: boolean;\n}\n\nexport function parsePolicy(raw: string | undefined): UpdatePolicy | undefined {\n if (raw === undefined) {\n return;\n }\n const value = raw.trim().toLowerCase();\n if ([\"on\", \"1\", \"true\", \"yes\", \"auto\", \"always\"].includes(value)) {\n return \"on\";\n }\n if ([\"notify\", \"check\"].includes(value)) {\n return \"notify\";\n }\n if ([\"off\", \"0\", \"false\", \"no\", \"never\", \"disabled\"].includes(value)) {\n return \"off\";\n }\n return;\n}\n\n/** `CI=true`, `CI=1`, even `CI=yes` count; `CI=0`, `CI=false` and an empty value do not. */\nexport function isTruthyFlag(raw: string | undefined): boolean {\n return raw !== undefined && ![\"\", \"0\", \"false\", \"no\", \"off\"].includes(raw.trim().toLowerCase());\n}\n\nfunction readExplicitPolicy(env: NodeJS.ProcessEnv, envPrefix: string | undefined): UpdatePolicy | undefined {\n const perPackage = envPrefix === undefined ? undefined : parsePolicy(env[`${envPrefix}_AUTO_UPDATE`]);\n return perPackage ?? parsePolicy(env[POLICY_ENV]);\n}\n\nfunction off(reason: string, explicit: boolean): PolicyDecision {\n return { policy: \"off\", reason, explicit };\n}\n\nfunction notify(reason: string, explicit: boolean): PolicyDecision {\n return { policy: \"notify\", reason, explicit };\n}\n\nfunction locationDecision(location: InstallLocation, explicit: boolean): PolicyDecision | undefined {\n switch (location.kind) {\n case \"local\":\n return off(\"running from a source checkout or linked package, not a package-manager install\", explicit);\n case \"npx\":\n return off(\"running through npx or dlx, which resolves the version on its own\", explicit);\n case \"unknown\":\n return notify(`install location not recognized (${location.detail})`, explicit);\n case \"npm-global\":\n case \"pnpm-global\":\n case \"yarn-global\":\n case \"bun-global\":\n case \"volta\":\n return;\n }\n}\n\n/**\n * Decide what this invocation may do. Order matters: the re-exec marker and\n * the command exclusions are absolute, an explicit `off` wins next, then the\n * environment defaults (CI, test runs) that only an explicit setting\n * overrides, and only then the facts about the install: a checkout can never\n * be upgraded by npm, a read-only prefix can only be announced.\n */\nexport function resolveUpdatePolicy(input: ResolvePolicyInput): PolicyDecision {\n const { env, location } = input;\n const manual = input.manual === true;\n const explicit = readExplicitPolicy(env, input.envPrefix);\n\n if (!manual && isTruthyFlag(env[REEXEC_MARKER_ENV])) {\n return off(\"already re-executed after an update\", false);\n }\n const commandPath = input.commandPath ?? \"\";\n if (!manual && (commandPath === SELF_UPDATE_COMMAND || (input.skipCommands ?? []).includes(commandPath))) {\n return off(`the \"${commandPath}\" command is excluded from automatic updates`, false);\n }\n if (!manual && explicit === \"off\") {\n return off(`${POLICY_ENV} is off`, true);\n }\n if (!manual && explicit === undefined) {\n if (isTruthyFlag(env[\"NO_UPDATE_NOTIFIER\"])) {\n return off(\"NO_UPDATE_NOTIFIER is set\", false);\n }\n if (isTruthyFlag(env[\"CI\"])) {\n return off(\"running in CI\", false);\n }\n if (env[\"NODE_ENV\"] === \"test\") {\n return off(\"NODE_ENV is test\", false);\n }\n }\n const byLocation = locationDecision(location, explicit !== undefined);\n if (byLocation !== undefined) {\n return byLocation;\n }\n if (!location.writable) {\n return notify(\"the install directory is not writable by this user\", explicit !== undefined);\n }\n if (manual) {\n return { policy: \"on\", reason: \"requested explicitly\", explicit: true };\n }\n return explicit === undefined\n ? { policy: \"on\", reason: \"default\", explicit: false }\n : { policy: explicit, reason: `${POLICY_ENV} is ${explicit}`, explicit: true };\n}\n\n/** Minutes between registry checks; `0` checks on every run. Invalid values fall back to the default. */\nexport function resolveCheckIntervalMs(env: NodeJS.ProcessEnv): number {\n const raw = env[INTERVAL_ENV];\n if (raw === undefined) {\n return DEFAULT_CHECK_INTERVAL_MINUTES * 60_000;\n }\n const minutes = Number(raw.trim());\n if (!Number.isFinite(minutes) || minutes < 0) {\n return DEFAULT_CHECK_INTERVAL_MINUTES * 60_000;\n }\n return Math.round(minutes * 60_000);\n}\n","import { spawn } from \"node:child_process\";\nimport { homedir } from \"node:os\";\n\nimport { readPackageManifest } from \"../package-metadata.js\";\nimport { errorMessage } from \"../records.js\";\nimport { resolveSaptoolsRoot } from \"../saptools-paths.js\";\n\nimport { detectInstallLocation } from \"./install-location.js\";\nimport type { InstallLocation } from \"./install-location.js\";\nimport { buildInstallCommand, DEFAULT_INSTALL_TIMEOUT_MS, manualInstallCommand, runInstall } from \"./installer.js\";\nimport { DEBUG_ENV, isTruthyFlag, resolveCheckIntervalMs, resolveUpdatePolicy } from \"./policy.js\";\nimport type { PolicyDecision } from \"./policy.js\";\nimport type { SpawnLike } from \"./process-types.js\";\nimport { reexecProcess } from \"./reexec.js\";\nimport type { ReexecImpl } from \"./reexec.js\";\nimport { DEFAULT_CHECK_TIMEOUT_MS, fetchLatestVersion, readUserNpmrc, resolveRegistryUrl } from \"./registry.js\";\nimport { isNewerRelease } from \"./semver.js\";\nimport {\n acquireUpdateLock,\n clearFailure,\n EMPTY_UPDATE_STATE,\n readUpdateState,\n updateLockPath,\n updateStatePath,\n writeUpdateState,\n} from \"./state.js\";\nimport type { UpdateState } from \"./state.js\";\n\nexport interface SelfUpdateOptions {\n /** npm package name, e.g. `@saptools/cf-metrics`. */\n readonly packageName: string;\n /** The running version, read from package.json (see readPackageMetadata). */\n readonly currentVersion: string;\n /** Executable name used as the prefix of every notice, e.g. `cf-metrics`. */\n readonly binName: string;\n /** Per-package override namespace: `CF_METRICS` honours `CF_METRICS_AUTO_UPDATE`. */\n readonly envPrefix?: string;\n /** Space-joined command paths that must never trigger an update (internal workers, daemons). */\n readonly skipCommands?: readonly string[];\n /** The command being run, supplied by the commander hook. */\n readonly commandPath?: string;\n readonly saptoolsRoot?: string;\n /** Where notices go; defaults to `<binName>: <line>` on stderr. Never stdout. */\n readonly notice?: (line: string) => void;\n /** The explicit `self-update` command: ignore the check interval, backoffs and policy gates. */\n readonly manual?: boolean;\n /** Re-run the command on the new version after installing (default true). */\n readonly reexec?: boolean;\n}\n\nexport interface SelfUpdateRuntime {\n readonly env: NodeJS.ProcessEnv;\n readonly argv: readonly string[];\n readonly execPath: string;\n readonly execArgv: readonly string[];\n readonly platform: NodeJS.Platform;\n readonly homeDirectory: string;\n readonly now: () => Date;\n readonly fetchImpl: typeof fetch;\n readonly spawnImpl: SpawnLike;\n readonly reexecImpl: ReexecImpl;\n readonly checkTimeoutMs: number;\n readonly installTimeoutMs: number;\n readonly realpath?: (path: string) => string;\n readonly isWritable?: (path: string) => boolean;\n readonly exists?: (path: string) => boolean;\n}\n\nexport type SelfUpdateOutcome =\n | { readonly kind: \"skipped\"; readonly reason: string }\n | { readonly kind: \"current\"; readonly latest: string }\n | { readonly kind: \"notified\"; readonly latest: string; readonly reason: string }\n | { readonly kind: \"updated\"; readonly from: string; readonly to: string }\n | { readonly kind: \"failed\"; readonly latest: string; readonly reason: string };\n\nexport interface SelfUpdateStatus {\n readonly packageName: string;\n readonly installed: string;\n readonly location: InstallLocation;\n readonly policy: PolicyDecision;\n readonly registryUrl: string;\n readonly statePath: string;\n readonly latest: string | undefined;\n readonly checkError: string | undefined;\n}\n\n/** After a failed registry call, stay quiet this long instead of paying the timeout on every command. */\nconst FAILURE_BACKOFF_MS = 15 * 60_000;\n/** A version we already announced is not announced again for a day. */\nconst NOTIFY_INTERVAL_MS = 24 * 60 * 60_000;\n/** A version whose install failed is not retried for a day; the notice carries the manual command instead. */\nconst INSTALL_RETRY_BACKOFF_MS = 24 * 60 * 60_000;\n\ninterface Context {\n readonly options: SelfUpdateOptions;\n readonly runtime: SelfUpdateRuntime;\n readonly binPath: string;\n readonly location: InstallLocation;\n readonly decision: PolicyDecision;\n readonly registryUrl: string;\n readonly statePath: string;\n readonly intervalMs: number;\n state: UpdateState;\n readonly notice: (line: string) => void;\n readonly debug: (line: string) => void;\n}\n\nfunction defaultRuntime(): SelfUpdateRuntime {\n return {\n env: process.env,\n argv: process.argv,\n execPath: process.execPath,\n execArgv: process.execArgv,\n platform: process.platform,\n homeDirectory: homedir(),\n now: (): Date => new Date(),\n fetchImpl: fetch,\n spawnImpl: spawn,\n reexecImpl: reexecProcess,\n checkTimeoutMs: DEFAULT_CHECK_TIMEOUT_MS,\n installTimeoutMs: DEFAULT_INSTALL_TIMEOUT_MS,\n };\n}\n\nfunction ageMs(isoTimestamp: string, nowMs: number): number {\n const then = Date.parse(isoTimestamp);\n // A timestamp in the future means the clock moved backwards; treat it as stale so the state self-heals.\n return Number.isNaN(then) || then > nowMs ? Number.POSITIVE_INFINITY : nowMs - then;\n}\n\nfunction detectLocation(options: SelfUpdateOptions, runtime: SelfUpdateRuntime, binPath: string): InstallLocation {\n return detectInstallLocation({\n binPath,\n packageName: options.packageName,\n platform: runtime.platform,\n env: runtime.env,\n ...(runtime.realpath === undefined ? {} : { realpath: runtime.realpath }),\n ...(runtime.isWritable === undefined ? {} : { isWritable: runtime.isWritable }),\n });\n}\n\nfunction createContext(options: SelfUpdateOptions, runtime: SelfUpdateRuntime): Context {\n const { env } = runtime;\n const binPath = runtime.argv[1] ?? \"\";\n const location = detectLocation(options, runtime, binPath);\n const decision = resolveUpdatePolicy({\n env,\n location,\n skipCommands: options.skipCommands ?? [],\n manual: options.manual === true,\n ...(options.envPrefix === undefined ? {} : { envPrefix: options.envPrefix }),\n ...(options.commandPath === undefined ? {} : { commandPath: options.commandPath }),\n });\n const statePath = updateStatePath(resolveSaptoolsRoot(options.saptoolsRoot, env), options.packageName);\n const notice =\n options.notice ??\n ((line: string): void => {\n process.stderr.write(`${options.binName}: ${line}\\n`);\n });\n const debug = isTruthyFlag(env[DEBUG_ENV])\n ? (line: string): void => {\n process.stderr.write(`${options.binName}: [self-update] ${line}\\n`);\n }\n : (): void => {\n // Debug output is off unless SAPTOOLS_UPDATE_DEBUG is set.\n };\n return {\n options,\n runtime,\n binPath,\n location,\n decision,\n registryUrl: resolveRegistryUrl(env, readUserNpmrc(runtime.homeDirectory)),\n statePath,\n intervalMs: resolveCheckIntervalMs(env),\n // Loaded lazily in resolveLatest: a disabled run must not touch ~/.saptools at all.\n state: EMPTY_UPDATE_STATE,\n notice,\n debug,\n };\n}\n\nfunction saveState(ctx: Context): void {\n try {\n writeUpdateState(ctx.statePath, ctx.state);\n } catch (error) {\n ctx.debug(`cannot write ${ctx.statePath}: ${errorMessage(error)}`);\n }\n}\n\n/** The newest published version: from the state file while it is fresh, otherwise from the registry. */\nasync function resolveLatest(ctx: Context): Promise<string | undefined> {\n ctx.state = readUpdateState(ctx.statePath);\n const { state } = ctx;\n const nowMs = ctx.runtime.now().getTime();\n if (ctx.options.manual !== true) {\n if (state.latest !== undefined && state.checkedAt !== undefined && ageMs(state.checkedAt, nowMs) < ctx.intervalMs) {\n ctx.debug(`using cached latest ${state.latest} (checked ${state.checkedAt})`);\n return state.latest;\n }\n if (state.lastFailureAt !== undefined && ageMs(state.lastFailureAt, nowMs) < FAILURE_BACKOFF_MS) {\n ctx.debug(`skipping the registry check after a recent failure: ${state.lastFailureReason ?? \"unknown\"}`);\n return state.latest;\n }\n }\n const result = await fetchLatestVersion(ctx.options.packageName, ctx.registryUrl, {\n fetchImpl: ctx.runtime.fetchImpl,\n timeoutMs: ctx.runtime.checkTimeoutMs,\n userAgent: `${ctx.options.binName}/${ctx.options.currentVersion} saptools-self-update`,\n });\n const at = ctx.runtime.now().toISOString();\n if (result.ok) {\n ctx.state = clearFailure({ ...ctx.state, checkedAt: at, latest: result.latest });\n saveState(ctx);\n return result.latest;\n }\n ctx.state = { ...ctx.state, lastFailureAt: at, lastFailureReason: result.reason };\n saveState(ctx);\n ctx.debug(`registry check failed: ${result.reason}`);\n return ctx.state.latest;\n}\n\nfunction notify(ctx: Context, latest: string, reason: string): SelfUpdateOutcome {\n const nowMs = ctx.runtime.now().getTime();\n const alreadyAnnounced =\n ctx.state.notifiedVersion === latest && ctx.state.notifiedAt !== undefined && ageMs(ctx.state.notifiedAt, nowMs) < NOTIFY_INTERVAL_MS;\n if (!alreadyAnnounced || ctx.options.manual === true) {\n const command = manualInstallCommand(ctx.location.kind, `${ctx.options.packageName}@${latest}`);\n ctx.notice(`${latest} is available (installed ${ctx.options.currentVersion}) but was not installed: ${reason}. Run: ${command}`);\n ctx.state = { ...ctx.state, notifiedVersion: latest, notifiedAt: ctx.runtime.now().toISOString() };\n saveState(ctx);\n }\n return { kind: \"notified\", latest, reason };\n}\n\nfunction recentInstallFailure(ctx: Context, latest: string): string | undefined {\n const attempt = ctx.state.lastInstall;\n if (ctx.options.manual === true || attempt === undefined || attempt.ok || attempt.version !== latest) {\n return;\n }\n if (ageMs(attempt.at, ctx.runtime.now().getTime()) >= INSTALL_RETRY_BACKOFF_MS) {\n return;\n }\n return `the previous attempt failed (${attempt.reason ?? \"unknown reason\"})`;\n}\n\nfunction recordInstall(ctx: Context, latest: string, ok: boolean, reason?: string): void {\n const at = ctx.runtime.now().toISOString();\n ctx.state = { ...ctx.state, lastInstall: reason === undefined ? { version: latest, at, ok } : { version: latest, at, ok, reason } };\n saveState(ctx);\n}\n\nasync function installLatest(ctx: Context, latest: string): Promise<SelfUpdateOutcome | undefined> {\n const command = buildInstallCommand({\n location: ctx.location,\n packageName: ctx.options.packageName,\n version: latest,\n registryUrl: ctx.registryUrl,\n execPath: ctx.runtime.execPath,\n platform: ctx.runtime.platform,\n ...(ctx.runtime.exists === undefined ? {} : { exists: ctx.runtime.exists }),\n ...(ctx.runtime.realpath === undefined ? {} : { realpath: ctx.runtime.realpath }),\n });\n if (command === undefined) {\n return notify(ctx, latest, \"no supported package manager was found for this install\");\n }\n const lock = acquireUpdateLock(updateLockPath(ctx.statePath), ctx.runtime.now());\n if (lock === undefined) {\n ctx.debug(\"another process holds the update lock\");\n return { kind: \"skipped\", reason: \"another process is installing the update\" };\n }\n try {\n ctx.notice(`updating ${ctx.options.currentVersion} -> ${latest} ...`);\n const result = await runInstall(command, { env: ctx.runtime.env, timeoutMs: ctx.runtime.installTimeoutMs, spawnImpl: ctx.runtime.spawnImpl });\n const installed = ctx.location.packageDirectory === undefined ? undefined : readPackageManifest(ctx.location.packageDirectory)?.version;\n const failure = result.ok ? (installed === latest ? undefined : `the installed version is ${installed ?? \"unreadable\"}, not ${latest}`) : result.reason;\n if (failure !== undefined) {\n recordInstall(ctx, latest, false, failure);\n ctx.notice(`update to ${latest} failed (${failure}); continuing with ${ctx.options.currentVersion}. Run: ${command.display}`);\n return { kind: \"failed\", latest, reason: failure };\n }\n recordInstall(ctx, latest, true);\n } finally {\n lock.release();\n }\n return;\n}\n\nasync function upgrade(ctx: Context, latest: string): Promise<SelfUpdateOutcome> {\n const failed = await installLatest(ctx, latest);\n if (failed !== undefined) {\n return failed;\n }\n const outcome: SelfUpdateOutcome = { kind: \"updated\", from: ctx.options.currentVersion, to: latest };\n if (ctx.options.reexec === false) {\n ctx.notice(`updated to ${latest}`);\n return outcome;\n }\n ctx.notice(`updated to ${latest}; re-running the command`);\n try {\n await ctx.runtime.reexecImpl({\n execPath: ctx.runtime.execPath,\n execArgv: ctx.runtime.execArgv,\n binPath: ctx.binPath,\n args: ctx.runtime.argv.slice(2),\n env: ctx.runtime.env,\n });\n } catch (error) {\n ctx.notice(`could not re-run on ${latest} (${errorMessage(error)}); continuing with the already loaded ${ctx.options.currentVersion}`);\n }\n return outcome;\n}\n\nasync function runSelfUpdateUnsafe(options: SelfUpdateOptions, runtime: SelfUpdateRuntime): Promise<SelfUpdateOutcome> {\n const ctx = createContext(options, runtime);\n if (ctx.decision.policy === \"off\") {\n ctx.debug(`off: ${ctx.decision.reason}`);\n return { kind: \"skipped\", reason: ctx.decision.reason };\n }\n const latest = await resolveLatest(ctx);\n if (latest === undefined) {\n return { kind: \"skipped\", reason: \"the latest version is unknown\" };\n }\n if (!isNewerRelease(latest, options.currentVersion)) {\n return { kind: \"current\", latest };\n }\n if (ctx.decision.policy === \"notify\") {\n return notify(ctx, latest, ctx.decision.reason);\n }\n const backoff = recentInstallFailure(ctx, latest);\n if (backoff !== undefined) {\n return notify(ctx, latest, backoff);\n }\n return await upgrade(ctx, latest);\n}\n\n/**\n * Check for, install, and re-run on a newer release. Never throws, never\n * writes to stdout, never prompts, never escalates privileges: whatever goes\n * wrong, the command the user asked for still runs on the installed version.\n */\nexport async function runSelfUpdate(options: SelfUpdateOptions, overrides: Partial<SelfUpdateRuntime> = {}): Promise<SelfUpdateOutcome> {\n const runtime: SelfUpdateRuntime = { ...defaultRuntime(), ...overrides };\n try {\n return await runSelfUpdateUnsafe(options, runtime);\n } catch (error) {\n const reason = errorMessage(error);\n if (isTruthyFlag(runtime.env[DEBUG_ENV])) {\n process.stderr.write(`${options.binName}: [self-update] ${reason}\\n`);\n }\n return { kind: \"skipped\", reason };\n }\n}\n\n/** Everything the `self-update` command reports; performs one fresh registry check. */\nexport async function inspectSelfUpdate(options: SelfUpdateOptions, overrides: Partial<SelfUpdateRuntime> = {}): Promise<SelfUpdateStatus> {\n const runtime: SelfUpdateRuntime = { ...defaultRuntime(), ...overrides };\n const ctx = createContext({ ...options, manual: true }, runtime);\n const result = await fetchLatestVersion(options.packageName, ctx.registryUrl, {\n fetchImpl: runtime.fetchImpl,\n timeoutMs: runtime.checkTimeoutMs,\n userAgent: `${options.binName}/${options.currentVersion} saptools-self-update`,\n });\n return {\n packageName: options.packageName,\n installed: options.currentVersion,\n location: ctx.location,\n policy: resolveUpdatePolicy({\n env: runtime.env,\n location: ctx.location,\n ...(options.envPrefix === undefined ? {} : { envPrefix: options.envPrefix }),\n }),\n registryUrl: ctx.registryUrl,\n statePath: ctx.statePath,\n latest: result.ok ? result.latest : undefined,\n checkError: result.ok ? undefined : result.reason,\n };\n}\n","import { accessSync, constants, realpathSync } from \"node:fs\";\nimport { basename, dirname, join, sep } from \"node:path\";\n\nimport { findPackageMetadata } from \"../package-metadata.js\";\nimport { errorMessage } from \"../records.js\";\n\nexport type InstallKind = \"npm-global\" | \"pnpm-global\" | \"yarn-global\" | \"bun-global\" | \"volta\" | \"npx\" | \"local\" | \"unknown\";\n\nexport interface InstallLocation {\n readonly kind: InstallKind;\n /** Directory holding the CLI's package.json, when it could be found. */\n readonly packageDirectory: string | undefined;\n /** npm global prefix (`npm prefix -g`), npm-global installs only. */\n readonly prefix: string | undefined;\n /** Whether this user can replace the installed files without escalating privileges. */\n readonly writable: boolean;\n readonly detail: string;\n}\n\nexport interface DetectInstallLocationOptions {\n readonly binPath: string;\n readonly packageName: string;\n readonly platform?: NodeJS.Platform;\n readonly env?: NodeJS.ProcessEnv;\n readonly realpath?: (path: string) => string;\n readonly isWritable?: (path: string) => boolean;\n}\n\nconst UPGRADABLE_KINDS: ReadonlySet<InstallKind> = new Set<InstallKind>([\"npm-global\", \"pnpm-global\", \"yarn-global\", \"bun-global\", \"volta\"]);\n\nexport function isUpgradableKind(kind: InstallKind): boolean {\n return UPGRADABLE_KINDS.has(kind);\n}\n\nfunction defaultIsWritable(path: string): boolean {\n try {\n accessSync(path, constants.W_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction toPosix(path: string): string {\n return path.split(sep).join(\"/\");\n}\n\nfunction isPnpmGlobal(posixDirectory: string, env: NodeJS.ProcessEnv): boolean {\n // ~/Library/pnpm/global/5/... (macOS), ~/.local/share/pnpm/global/5/... (Linux), or a custom PNPM_HOME.\n if (posixDirectory.includes(\"/pnpm/global/\")) {\n return true;\n }\n const home = env[\"PNPM_HOME\"];\n return home !== undefined && home.length > 0 && posixDirectory.startsWith(`${toPosix(home).replace(/\\/+$/, \"\")}/global/`);\n}\n\n/** `<node_modules>` that directly holds `<node_modules>/@scope/name` or `<node_modules>/name`. */\nfunction nodeModulesRootOf(packageDirectory: string): string | undefined {\n const parent = dirname(packageDirectory);\n if (basename(parent) === \"node_modules\") {\n return parent;\n }\n const grandparent = dirname(parent);\n return basename(grandparent) === \"node_modules\" ? grandparent : undefined;\n}\n\n/**\n * npm's global layout is `<prefix>/lib/node_modules` on POSIX and\n * `<prefix>/node_modules` on Windows, where the default prefix directory is\n * named `npm`. Anything else under a `node_modules` is a project-local install.\n */\nfunction npmPrefixFor(packageDirectory: string, platform: NodeJS.Platform): string | undefined {\n const nodeModules = nodeModulesRootOf(packageDirectory);\n if (nodeModules === undefined) {\n return;\n }\n const parent = dirname(nodeModules);\n if (platform === \"win32\") {\n return basename(parent).toLowerCase() === \"npm\" ? parent : undefined;\n }\n return basename(parent) === \"lib\" ? dirname(parent) : undefined;\n}\n\nfunction classifyKind(packageDirectory: string, platform: NodeJS.Platform, env: NodeJS.ProcessEnv): InstallKind {\n const posix = toPosix(packageDirectory);\n if (posix.includes(\"/_npx/\") || /\\/dlx-[^/]+\\//.test(posix) || posix.includes(\"/pnpm/dlx/\") || posix.includes(\"/.cache/pnpm/dlx\")) {\n return \"npx\";\n }\n if (posix.includes(\"/.volta/tools/image/packages/\")) {\n return \"volta\";\n }\n if (posix.includes(\"/.bun/install/global/\")) {\n return \"bun-global\";\n }\n if (posix.includes(\"/.config/yarn/global/\") || posix.includes(\"/yarn/global/node_modules/\")) {\n return \"yarn-global\";\n }\n if (isPnpmGlobal(posix, env)) {\n return \"pnpm-global\";\n }\n if (!posix.includes(\"/node_modules/\")) {\n return \"local\";\n }\n return npmPrefixFor(packageDirectory, platform) === undefined ? \"local\" : \"npm-global\";\n}\n\nfunction writableForUpgrade(\n packageDirectory: string,\n prefix: string | undefined,\n platform: NodeJS.Platform,\n isWritable: (path: string) => boolean,\n): boolean {\n // The package itself, its scope folder, the node_modules root (npm rewrites .package-lock.json) and the bin folder all get touched.\n const targets = [packageDirectory, dirname(packageDirectory)];\n const nodeModules = nodeModulesRootOf(packageDirectory);\n if (nodeModules !== undefined) {\n targets.push(nodeModules);\n }\n if (prefix !== undefined) {\n targets.push(platform === \"win32\" ? prefix : join(prefix, \"bin\"));\n }\n return targets.every((target) => isWritable(target));\n}\n\nfunction describe(kind: InstallKind, packageDirectory: string, prefix: string | undefined): string {\n if (kind === \"npm-global\" && prefix !== undefined) {\n return `npm global install under ${prefix}`;\n }\n return `${kind} install at ${packageDirectory}`;\n}\n\nfunction unknownLocation(detail: string): InstallLocation {\n return { kind: \"unknown\", packageDirectory: undefined, prefix: undefined, writable: false, detail };\n}\n\n/**\n * Where does the running CLI come from, and which package manager owns it?\n * Decided from the real path of the executing script, never from PATH or\n * `npm prefix -g`: the install we upgrade must be the one we are running.\n */\nexport function detectInstallLocation(options: DetectInstallLocationOptions): InstallLocation {\n const platform = options.platform ?? process.platform;\n const env = options.env ?? process.env;\n const realpath = options.realpath ?? ((path: string): string => realpathSync(path));\n const isWritable = options.isWritable ?? defaultIsWritable;\n\n let resolvedBin: string;\n try {\n resolvedBin = realpath(options.binPath);\n } catch (error) {\n return unknownLocation(`cannot resolve ${options.binPath}: ${errorMessage(error)}`);\n }\n const manifest = findPackageMetadata(dirname(resolvedBin), options.packageName);\n if (manifest === undefined) {\n return unknownLocation(`no package.json for ${options.packageName} above ${resolvedBin}`);\n }\n\n const packageDirectory = manifest.directory;\n const kind = classifyKind(packageDirectory, platform, env);\n const prefix = kind === \"npm-global\" ? npmPrefixFor(packageDirectory, platform) : undefined;\n const writable = isUpgradableKind(kind) && writableForUpgrade(packageDirectory, prefix, platform, isWritable);\n return { kind, packageDirectory, prefix, writable, detail: describe(kind, packageDirectory, prefix) };\n}\n","import { existsSync, realpathSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nimport { errorMessage } from \"../records.js\";\n\nimport type { InstallKind, InstallLocation } from \"./install-location.js\";\nimport type { SpawnLike } from \"./process-types.js\";\n\nexport interface InstallCommand {\n readonly file: string;\n readonly args: readonly string[];\n /** The equivalent command a human would type; used in notices. */\n readonly display: string;\n}\n\nexport interface BuildInstallCommandOptions {\n readonly location: InstallLocation;\n readonly packageName: string;\n readonly version: string;\n readonly registryUrl: string;\n readonly execPath?: string;\n readonly platform?: NodeJS.Platform;\n readonly exists?: (path: string) => boolean;\n readonly realpath?: (path: string) => string;\n}\n\nexport type InstallResult = { readonly ok: true } | { readonly ok: false; readonly reason: string };\n\nexport interface RunInstallOptions {\n readonly env: NodeJS.ProcessEnv;\n readonly timeoutMs?: number;\n readonly spawnImpl: SpawnLike;\n}\n\n/** A global install of a ~200 KB CLI takes a few seconds; three minutes only matters on a stalled network. */\nexport const DEFAULT_INSTALL_TIMEOUT_MS = 180_000;\n\n/** What to tell a human to run; also the fallback when we cannot upgrade for them. */\nexport function manualInstallCommand(kind: InstallKind, spec: string): string {\n switch (kind) {\n case \"pnpm-global\":\n return `pnpm add -g ${spec}`;\n case \"yarn-global\":\n return `yarn global add ${spec}`;\n case \"bun-global\":\n return `bun add -g ${spec}`;\n case \"volta\":\n return `volta install ${spec}`;\n case \"npm-global\":\n case \"npx\":\n case \"local\":\n case \"unknown\":\n return `npm install -g ${spec}`;\n }\n}\n\ninterface NpmInvocation {\n readonly file: string;\n readonly leadingArgs: readonly string[];\n}\n\n/**\n * Prefer the npm that ships with the node running us (`<bin>/npm` beside\n * `process.execPath`), executed through that same node: PATH may hold a\n * different Node installation whose npm would upgrade a different prefix. On\n * Windows the `.cmd` shim cannot be spawned without a shell, so only the\n * bundled `npm-cli.js` is used there.\n */\nfunction resolveNpmInvocation(\n execPath: string,\n platform: NodeJS.Platform,\n exists: (path: string) => boolean,\n realpath: (path: string) => string,\n): NpmInvocation | undefined {\n const binDirectory = dirname(execPath);\n if (platform === \"win32\") {\n const cli = join(binDirectory, \"node_modules\", \"npm\", \"bin\", \"npm-cli.js\");\n return exists(cli) ? { file: execPath, leadingArgs: [cli] } : undefined;\n }\n const sibling = join(binDirectory, \"npm\");\n if (exists(sibling)) {\n try {\n const target = realpath(sibling);\n return target.endsWith(\".js\") ? { file: execPath, leadingArgs: [target] } : { file: target, leadingArgs: [] };\n } catch {\n // A dangling symlink: fall through to PATH.\n }\n }\n return { file: \"npm\", leadingArgs: [] };\n}\n\nfunction buildNpmCommand(options: BuildInstallCommandOptions, spec: string): InstallCommand | undefined {\n if (options.location.prefix === undefined) {\n return;\n }\n const npm = resolveNpmInvocation(\n options.execPath ?? process.execPath,\n options.platform ?? process.platform,\n options.exists ?? existsSync,\n options.realpath ?? ((path: string): string => realpathSync(path)),\n );\n if (npm === undefined) {\n return;\n }\n return {\n file: npm.file,\n args: [\n ...npm.leadingArgs,\n \"install\",\n \"--global\",\n \"--prefix\",\n options.location.prefix,\n spec,\n \"--registry\",\n options.registryUrl,\n \"--no-fund\",\n \"--no-audit\",\n \"--no-update-notifier\",\n \"--loglevel=error\",\n ],\n display: manualInstallCommand(\"npm-global\", spec),\n };\n}\n\n/** The exact command that upgrades this install in place; undefined when the location cannot be upgraded by us. */\nexport function buildInstallCommand(options: BuildInstallCommandOptions): InstallCommand | undefined {\n const spec = `${options.packageName}@${options.version}`;\n switch (options.location.kind) {\n case \"npm-global\":\n return buildNpmCommand(options, spec);\n case \"pnpm-global\":\n return { file: \"pnpm\", args: [\"add\", \"--global\", spec], display: manualInstallCommand(\"pnpm-global\", spec) };\n case \"yarn-global\":\n return { file: \"yarn\", args: [\"global\", \"add\", spec], display: manualInstallCommand(\"yarn-global\", spec) };\n case \"bun-global\":\n return { file: \"bun\", args: [\"add\", \"--global\", spec], display: manualInstallCommand(\"bun-global\", spec) };\n case \"volta\":\n return { file: \"volta\", args: [\"install\", spec], display: manualInstallCommand(\"volta\", spec) };\n case \"npx\":\n case \"local\":\n case \"unknown\":\n return;\n }\n}\n\nfunction lastLine(text: string): string {\n const lines = text\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n return lines.at(-1) ?? \"\";\n}\n\n/**\n * Run the install with no shell, no stdin, and a hard timeout. Credentials for\n * SAP never reach the package manager, and the child inherits an explicit\n * `SAPTOOLS_AUTO_UPDATE=off` so nothing it runs can start a nested update.\n * `cwd` is the temp directory so a project's `.npmrc` cannot redirect the\n * install of a global tool.\n */\nexport function runInstall(command: InstallCommand, options: RunInstallOptions): Promise<InstallResult> {\n const timeoutMs = options.timeoutMs ?? DEFAULT_INSTALL_TIMEOUT_MS;\n const env: NodeJS.ProcessEnv = { ...options.env, SAPTOOLS_AUTO_UPDATE: \"off\" };\n delete env[\"SAP_EMAIL\"];\n delete env[\"SAP_PASSWORD\"];\n\n return new Promise<InstallResult>((resolve) => {\n let child: ReturnType<SpawnLike>;\n try {\n child = options.spawnImpl(command.file, command.args, { cwd: tmpdir(), env, stdio: [\"ignore\", \"pipe\", \"pipe\"], windowsHide: true });\n } catch (error) {\n resolve({ ok: false, reason: errorMessage(error) });\n return;\n }\n let stderr = \"\";\n child.stderr?.on(\"data\", (chunk: Buffer | string) => {\n stderr = `${stderr}${chunk.toString()}`.slice(-4_000);\n });\n const timer = setTimeout(() => {\n child.kill(\"SIGKILL\");\n }, timeoutMs);\n child.once(\"error\", (error) => {\n clearTimeout(timer);\n resolve({ ok: false, reason: `${command.file}: ${error.message}` });\n });\n child.once(\"close\", (code, signal) => {\n clearTimeout(timer);\n if (code === 0) {\n resolve({ ok: true });\n return;\n }\n const detail = lastLine(stderr);\n const suffix = detail.length > 0 ? `: ${detail}` : \"\";\n resolve({\n ok: false,\n reason:\n signal === null\n ? `${command.display} exited with code ${String(code ?? -1)}${suffix}`\n : `${command.display} was killed by ${signal} after ${String(Math.round(timeoutMs / 1000))}s`,\n });\n });\n });\n}\n","import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nimport { errorMessage, isRecord, readString } from \"../records.js\";\n\nimport { parseSemver } from \"./semver.js\";\n\nexport const DEFAULT_NPM_REGISTRY = \"https://registry.npmjs.org\";\nexport const REGISTRY_ENV = \"SAPTOOLS_NPM_REGISTRY\";\n/**\n * The registry answers in ~0.5 s from Asia; two seconds separates \"slow\" from\n * \"offline or captive portal\" without holding up a 1.5 s command for long.\n */\nexport const DEFAULT_CHECK_TIMEOUT_MS = 2_000;\n\nexport type LatestVersionResult =\n | { readonly ok: true; readonly latest: string }\n | { readonly ok: false; readonly reason: string };\n\nexport interface FetchLatestOptions {\n readonly fetchImpl?: typeof fetch;\n readonly timeoutMs?: number;\n readonly userAgent?: string;\n}\n\nexport function normalizeRegistryUrl(value: string | undefined): string | undefined {\n if (value === undefined) {\n return;\n }\n const trimmed = value.trim().replace(/\\/+$/, \"\");\n if (!/^https?:\\/\\/\\S+$/i.test(trimmed)) {\n return;\n }\n return trimmed;\n}\n\nfunction registryFromNpmrc(text: string | undefined, key: string): string | undefined {\n if (text === undefined) {\n return;\n }\n for (const line of text.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (trimmed.length === 0 || trimmed.startsWith(\"#\") || trimmed.startsWith(\";\")) {\n continue;\n }\n const separator = trimmed.indexOf(\"=\");\n if (separator === -1 || trimmed.slice(0, separator).trim() !== key) {\n continue;\n }\n return trimmed\n .slice(separator + 1)\n .trim()\n .replace(/^\"(.*)\"$/, \"$1\");\n }\n return;\n}\n\n/** `~/.npmrc` as text, or undefined when absent; the project-level `.npmrc` is deliberately ignored (see resolveRegistryUrl). */\nexport function readUserNpmrc(homeDirectory: string): string | undefined {\n try {\n return readFileSync(join(homeDirectory, \".npmrc\"), \"utf8\");\n } catch {\n return;\n }\n}\n\n/**\n * Registry precedence: explicit saptools override, the registry npm itself was\n * configured with when it launched us, the user's `~/.npmrc` (scoped entry\n * first), then npmjs. The current directory's `.npmrc` is ignored on purpose:\n * a project's private registry has nothing to do with where the user's global\n * CLI came from.\n */\nexport function resolveRegistryUrl(env: NodeJS.ProcessEnv, userNpmrc: string | undefined): string {\n const candidates = [\n env[REGISTRY_ENV],\n env[\"npm_config_registry\"],\n registryFromNpmrc(userNpmrc, \"@saptools:registry\"),\n registryFromNpmrc(userNpmrc, \"registry\"),\n ];\n for (const candidate of candidates) {\n const normalized = normalizeRegistryUrl(candidate);\n if (normalized !== undefined) {\n return normalized;\n }\n }\n return DEFAULT_NPM_REGISTRY;\n}\n\ntype JsonResponse =\n | { readonly ok: true; readonly body: unknown }\n | { readonly ok: false; readonly status: number | undefined; readonly reason: string };\n\nasync function fetchJson(\n fetchImpl: typeof fetch,\n url: string,\n headers: Record<string, string>,\n timeoutMs: number,\n): Promise<JsonResponse> {\n try {\n const response = await fetchImpl(url, { headers, signal: AbortSignal.timeout(timeoutMs), redirect: \"follow\" });\n if (!response.ok) {\n return { ok: false, status: response.status, reason: `HTTP ${String(response.status)} from ${url}` };\n }\n const body: unknown = await response.json();\n return { ok: true, body };\n } catch (error) {\n return { ok: false, status: undefined, reason: `${errorMessage(error)} (${url})` };\n }\n}\n\nfunction readLatestTag(body: unknown, nestedUnderDistTags: boolean): string | undefined {\n if (!isRecord(body)) {\n return;\n }\n const tags = nestedUnderDistTags ? body[\"dist-tags\"] : body;\n if (!isRecord(tags)) {\n return;\n }\n const latest = readString(tags, \"latest\");\n return latest !== undefined && parseSemver(latest) !== undefined ? latest : undefined;\n}\n\n/**\n * Ask the registry for the `latest` dist-tag. The dedicated dist-tags endpoint\n * is 18 bytes; registries that do not implement it (some private mirrors) get\n * a second try through the abbreviated packument. A network failure on the\n * first request is not retried: the registry is unreachable, not old.\n */\nexport async function fetchLatestVersion(\n packageName: string,\n registryUrl: string,\n options: FetchLatestOptions = {},\n): Promise<LatestVersionResult> {\n const fetchImpl = options.fetchImpl ?? fetch;\n const timeoutMs = options.timeoutMs ?? DEFAULT_CHECK_TIMEOUT_MS;\n const encoded = encodeURIComponent(packageName);\n const baseHeaders: Record<string, string> = { \"user-agent\": options.userAgent ?? \"saptools-self-update\" };\n\n const distTags = await fetchJson(fetchImpl, `${registryUrl}/-/package/${encoded}/dist-tags`, { ...baseHeaders, accept: \"application/json\" }, timeoutMs);\n if (distTags.ok) {\n const latest = readLatestTag(distTags.body, false);\n return latest === undefined ? { ok: false, reason: \"dist-tags response carries no valid latest version\" } : { ok: true, latest };\n }\n if (distTags.status === undefined) {\n return { ok: false, reason: distTags.reason };\n }\n\n const packument = await fetchJson(\n fetchImpl,\n `${registryUrl}/${encoded}`,\n { ...baseHeaders, accept: \"application/vnd.npm.install-v1+json\" },\n timeoutMs,\n );\n if (!packument.ok) {\n return { ok: false, reason: packument.reason };\n }\n const latest = readLatestTag(packument.body, true);\n return latest === undefined ? { ok: false, reason: \"packument carries no valid latest dist-tag\" } : { ok: true, latest };\n}\n","export interface SemanticVersion {\n readonly major: number;\n readonly minor: number;\n readonly patch: number;\n readonly prerelease: readonly string[];\n}\n\nconst SEMVER_PATTERN =\n /^v?(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$/;\n\nexport function parseSemver(text: string): SemanticVersion | undefined {\n const match = SEMVER_PATTERN.exec(text.trim());\n if (match === null) {\n return;\n }\n const [, major, minor, patch, prerelease] = match;\n if (major === undefined || minor === undefined || patch === undefined) {\n return;\n }\n return {\n major: Number(major),\n minor: Number(minor),\n patch: Number(patch),\n prerelease: prerelease === undefined ? [] : prerelease.split(\".\"),\n };\n}\n\nfunction compareIdentifiers(left: string, right: string): number {\n const leftNumeric = /^\\d+$/.test(left);\n const rightNumeric = /^\\d+$/.test(right);\n if (leftNumeric && rightNumeric) {\n return Math.sign(Number(left) - Number(right));\n }\n // Numeric identifiers always sort before alphanumeric ones (semver 2.0.0 §11).\n if (leftNumeric) {\n return -1;\n }\n if (rightNumeric) {\n return 1;\n }\n if (left === right) {\n return 0;\n }\n return left < right ? -1 : 1;\n}\n\nfunction comparePrerelease(left: readonly string[], right: readonly string[]): number {\n if (left.length === 0 && right.length === 0) {\n return 0;\n }\n // A release outranks any prerelease of the same version.\n if (left.length === 0) {\n return 1;\n }\n if (right.length === 0) {\n return -1;\n }\n for (const [index, identifier] of left.entries()) {\n const other = right[index];\n if (other === undefined) {\n return 1;\n }\n const result = compareIdentifiers(identifier, other);\n if (result !== 0) {\n return result;\n }\n }\n return left.length < right.length ? -1 : 0;\n}\n\nexport function compareSemver(left: SemanticVersion, right: SemanticVersion): number {\n for (const key of [\"major\", \"minor\", \"patch\"] as const) {\n if (left[key] !== right[key]) {\n return left[key] < right[key] ? -1 : 1;\n }\n }\n return comparePrerelease(left.prerelease, right.prerelease);\n}\n\n/**\n * True when `candidate` is a release strictly newer than `current`. A\n * prerelease is never a target: someone who installed 1.2.0 must not be moved\n * onto 1.3.0-beta.1 by a background updater.\n */\nexport function isNewerRelease(candidate: string, current: string): boolean {\n const next = parseSemver(candidate);\n const installed = parseSemver(current);\n if (next === undefined || installed === undefined) {\n return false;\n }\n if (next.prerelease.length > 0) {\n return false;\n }\n return compareSemver(next, installed) > 0;\n}\n","import { closeSync, openSync, rmSync, statSync, utimesSync, writeSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\n\nimport { isRecord, readString } from \"../records.js\";\nimport { ensurePrivateDirectorySync, readJsonFileSync, writeFileAtomicSync } from \"../saptools-paths.js\";\n\nexport interface InstallAttempt {\n readonly version: string;\n readonly at: string;\n readonly ok: boolean;\n readonly reason?: string;\n}\n\nexport interface UpdateState {\n readonly version: 1;\n readonly checkedAt?: string;\n readonly latest?: string;\n readonly lastFailureAt?: string;\n readonly lastFailureReason?: string;\n readonly notifiedVersion?: string;\n readonly notifiedAt?: string;\n readonly lastInstall?: InstallAttempt;\n}\n\ntype UpdateStateDraft = { -readonly [K in keyof UpdateState]: UpdateState[K] };\n\nexport const EMPTY_UPDATE_STATE: UpdateState = { version: 1 };\nexport const UPDATES_DIRECTORY_NAME = \"updates\";\n/** A stuck installer holds the lock this long before another instance may take over. */\nexport const DEFAULT_LOCK_STALE_MS = 10 * 60_000;\n\nconst STRING_FIELDS = [\"checkedAt\", \"latest\", \"lastFailureAt\", \"lastFailureReason\", \"notifiedVersion\", \"notifiedAt\"] as const;\n\n/** `@saptools/cf-metrics` → `saptools__cf-metrics.json`: one file per package, no shared writes between CLIs. */\nexport function updateStateFileName(packageName: string): string {\n return `${packageName.replace(/^@/, \"\").replaceAll(\"/\", \"__\")}.json`;\n}\n\nexport function updateStatePath(saptoolsRoot: string, packageName: string): string {\n return join(saptoolsRoot, UPDATES_DIRECTORY_NAME, updateStateFileName(packageName));\n}\n\nexport function updateLockPath(statePath: string): string {\n return statePath.replace(/\\.json$/, \".lock\");\n}\n\nfunction readInstallAttempt(value: unknown): InstallAttempt | undefined {\n if (!isRecord(value)) {\n return;\n }\n const version = readString(value, \"version\");\n const at = readString(value, \"at\");\n const ok = value[\"ok\"];\n if (version === undefined || at === undefined || typeof ok !== \"boolean\") {\n return;\n }\n const reason = readString(value, \"reason\");\n return reason === undefined ? { version, at, ok } : { version, at, ok, reason };\n}\n\n/** Tolerant read: an unknown, malformed, or older-format file reads as empty state. */\nexport function readUpdateState(path: string): UpdateState {\n const parsed = readJsonFileSync(path);\n if (!isRecord(parsed) || parsed[\"version\"] !== 1) {\n return EMPTY_UPDATE_STATE;\n }\n const draft: UpdateStateDraft = { version: 1 };\n for (const key of STRING_FIELDS) {\n const value = readString(parsed, key);\n if (value !== undefined) {\n draft[key] = value;\n }\n }\n const lastInstall = readInstallAttempt(parsed[\"lastInstall\"]);\n if (lastInstall !== undefined) {\n draft.lastInstall = lastInstall;\n }\n return draft;\n}\n\n/** The same state with a successful check: the failure fields no longer apply. */\nexport function clearFailure(state: UpdateState): UpdateState {\n const next: UpdateStateDraft = { ...state };\n delete next.lastFailureAt;\n delete next.lastFailureReason;\n return next;\n}\n\nexport function writeUpdateState(path: string, state: UpdateState): void {\n ensurePrivateDirectorySync(dirname(path));\n writeFileAtomicSync(path, `${JSON.stringify(state, null, 2)}\\n`, 0o600);\n}\n\nexport interface UpdateLock {\n readonly release: () => void;\n}\n\nfunction tryCreateLock(lockPath: string, now: Date): UpdateLock | undefined {\n let descriptor: number;\n try {\n descriptor = openSync(lockPath, \"wx\", 0o600);\n } catch {\n return;\n }\n try {\n writeSync(descriptor, `${JSON.stringify({ pid: process.pid, at: now.toISOString() })}\\n`);\n } finally {\n closeSync(descriptor);\n }\n // Staleness is judged against the caller's clock, so stamp the file with it rather than the filesystem's.\n utimesSync(lockPath, now, now);\n return {\n release: (): void => {\n rmSync(lockPath, { force: true });\n },\n };\n}\n\nfunction isStaleLock(lockPath: string, now: Date, staleMs: number): boolean {\n try {\n return now.getTime() - statSync(lockPath).mtimeMs > staleMs;\n } catch {\n return false;\n }\n}\n\n/**\n * Exclusive-create lock so two commands started at once install only once;\n * the loser skips the update and runs on the installed version. A lock older\n * than `staleMs` belongs to a crashed installer and is taken over.\n */\nexport function acquireUpdateLock(lockPath: string, now: Date, staleMs = DEFAULT_LOCK_STALE_MS): UpdateLock | undefined {\n ensurePrivateDirectorySync(dirname(lockPath));\n const lock = tryCreateLock(lockPath, now);\n if (lock !== undefined) {\n return lock;\n }\n if (!isStaleLock(lockPath, now, staleMs)) {\n return;\n }\n rmSync(lockPath, { force: true });\n return tryCreateLock(lockPath, now);\n}\n","import type { Command } from \"commander\";\n\nimport { SELF_UPDATE_COMMAND } from \"./policy.js\";\nimport { inspectSelfUpdate, runSelfUpdate } from \"./run.js\";\nimport type { SelfUpdateOptions, SelfUpdateOutcome, SelfUpdateStatus } from \"./run.js\";\nimport { isNewerRelease } from \"./semver.js\";\n\nexport type AttachSelfUpdateOptions = Omit<SelfUpdateOptions, \"commandPath\" | \"manual\" | \"reexec\">;\n\nexport interface SelfUpdateCommandOptions extends AttachSelfUpdateOptions {\n /** Where the status lines go; defaults to stdout. */\n readonly print?: (line: string) => void;\n}\n\n/** `credential list` for a nested subcommand, `` for the root action. */\nexport function commandPathOf(command: Command): string {\n const names: string[] = [];\n let current: Command = command;\n while (current.parent !== null) {\n names.unshift(current.name());\n current = current.parent;\n }\n return names.join(\" \");\n}\n\n/**\n * Run the self-updater before every action of `program`. `--help` and\n * `--version` never reach an action, so they never trigger it; the\n * `self-update` command and `skipCommands` are excluded by the policy.\n */\nexport function attachSelfUpdate(program: Command, options: AttachSelfUpdateOptions): void {\n program.hook(\"preAction\", async (_thisCommand: Command, actionCommand: Command): Promise<void> => {\n await runSelfUpdate({ ...options, commandPath: commandPathOf(actionCommand) });\n });\n}\n\nexport function formatSelfUpdateStatus(status: SelfUpdateStatus): readonly string[] {\n const latest =\n status.latest ?? (status.checkError === undefined ? \"unknown\" : `unknown (${status.checkError})`);\n const install = status.location.packageDirectory === undefined ? status.location.detail : `${status.location.kind} ${status.location.packageDirectory}`;\n return [\n `package=${status.packageName}`,\n `installed=${status.installed}`,\n `latest=${latest}`,\n `policy=${status.policy.policy} (${status.policy.reason})`,\n `install=${install}`,\n `writable=${status.location.writable ? \"yes\" : \"no\"}`,\n `registry=${status.registryUrl}`,\n `state=${status.statePath}`,\n ];\n}\n\nexport function describeOutcome(outcome: SelfUpdateOutcome): string {\n switch (outcome.kind) {\n case \"current\":\n return `current (${outcome.latest} is the newest release)`;\n case \"updated\":\n return `updated ${outcome.from} -> ${outcome.to}`;\n case \"notified\":\n return `not installed (${outcome.reason})`;\n case \"failed\":\n return `failed (${outcome.reason})`;\n case \"skipped\":\n return `skipped (${outcome.reason})`;\n }\n}\n\nasync function runSelfUpdateCommand(options: SelfUpdateCommandOptions, checkOnly: boolean): Promise<void> {\n const print =\n options.print ??\n ((line: string): void => {\n process.stdout.write(`${line}\\n`);\n });\n const status = await inspectSelfUpdate(options);\n for (const line of formatSelfUpdateStatus(status)) {\n print(line);\n }\n if (checkOnly) {\n const verdict = status.latest === undefined ? \"unknown\" : isNewerRelease(status.latest, status.installed) ? \"update-available\" : \"current\";\n print(`result=${verdict}`);\n return;\n }\n const outcome = await runSelfUpdate({ ...options, manual: true, reexec: false });\n print(`result=${describeOutcome(outcome)}`);\n if (outcome.kind === \"failed\") {\n process.exitCode = 1;\n }\n}\n\n/** `<bin> self-update [--check]`: a forced check and install for humans and agents who do not want to wait for the hourly check. */\nexport function registerSelfUpdateCommand(program: Command, options: SelfUpdateCommandOptions): void {\n program\n .command(SELF_UPDATE_COMMAND)\n .description(\"check npm for a newer release and install it now; every other command does this automatically (at most once an hour)\")\n .option(\"--check\", \"report whether a newer release exists without installing it\")\n .action(async (flags: { readonly check?: boolean }): Promise<void> => {\n await runSelfUpdateCommand(options, flags.check === true);\n });\n}\n","import process from \"node:process\";\n\nimport { fetchInspectorVersion } from \"../../inspector/discovery.js\";\nimport type { AttachCommandOptions } from \"../commandTypes.js\";\nimport { writeJson } from \"../output.js\";\nimport { openTarget, resolveTargetWithCurrentCfTarget } from \"../target.js\";\n\nexport async function handleAttach(opts: AttachCommandOptions): Promise<void> {\n const target = await resolveTargetWithCurrentCfTarget(opts);\n const tunnel = await openTarget(target);\n try {\n const version = await fetchInspectorVersion(tunnel.host, tunnel.port, 5_000);\n if (opts.json) {\n writeJson({ host: tunnel.host, port: tunnel.port, ...version });\n return;\n }\n process.stdout.write(\n `Connected to ${tunnel.host}:${tunnel.port.toString()}\\n` +\n ` Browser: ${version.browser}\\n` +\n ` Protocol: ${version.protocolVersion}\\n`,\n );\n } finally {\n await tunnel.dispose();\n }\n}\n","import { request } from \"node:http\";\nimport { performance } from \"node:perf_hooks\";\n\nimport { CfInspectorError } from \"../types.js\";\n\nexport interface InspectorTarget {\n readonly description: string;\n readonly devtoolsFrontendUrl?: string;\n readonly faviconUrl?: string;\n readonly id: string;\n readonly title: string;\n readonly type: string;\n readonly url: string;\n readonly webSocketDebuggerUrl: string;\n}\n\nexport interface InspectorVersion {\n readonly browser: string;\n readonly protocolVersion: string;\n}\n\nexport interface InspectorKeepaliveOptions {\n readonly intervalMs?: number;\n readonly probeTimeoutMs?: number;\n readonly failureThreshold?: number;\n readonly probe?: () => Promise<unknown>;\n}\n\nexport interface InspectorKeepalive {\n readonly failure: Promise<never>;\n cancel(): void;\n}\n\ninterface NodeSystemError extends Error {\n readonly code?: string;\n readonly syscall?: string;\n readonly address?: string;\n readonly port?: number;\n}\n\nclass InvalidDiscoveryPayloadError extends CfInspectorError {}\n\nasync function fetchJson<T>(url: string, timeoutMs: number): Promise<T> {\n const deadline = performance.now() + timeoutMs;\n let lastError: unknown;\n\n while (performance.now() < deadline) {\n try {\n const remainingMs = deadline - performance.now();\n if (remainingMs <= 0) {\n break;\n }\n return await new Promise<T>((resolve, reject) => {\n const req = request(url, { method: \"GET\" }, (res) => {\n const chunks: Buffer[] = [];\n res.on(\"data\", (chunk: Buffer) => {\n chunks.push(chunk);\n });\n res.on(\"end\", () => {\n try {\n resolve(parseJsonResponse(chunks) as T);\n } catch (err: unknown) {\n reject(parseDiscoveryError(url, err));\n }\n });\n res.on(\"error\", (err) => {\n reject(newDiscoveryError(`Inspector discovery response error: ${err.message}`));\n });\n });\n const attemptTimeoutMs = Math.min(2000, remainingMs);\n req.setTimeout(attemptTimeoutMs, () => {\n req.destroy(\n new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Inspector discovery at ${url} timed out after ${timeoutMs.toString()}ms`,\n ),\n );\n });\n req.on(\"error\", (err) => {\n reject(err instanceof CfInspectorError ? err : formatDiscoveryRequestError(url, err));\n });\n req.end();\n });\n } catch (err: unknown) {\n if (err instanceof InvalidDiscoveryPayloadError) {\n throw err;\n }\n lastError = err;\n const now = performance.now();\n if (now < deadline) {\n const sleepMs = Math.min(1000, deadline - now);\n await new Promise((r) => setTimeout(r, sleepMs));\n }\n }\n }\n\n if (lastError instanceof Error) {\n throw lastError;\n }\n throw new CfInspectorError(\"INSPECTOR_DISCOVERY_FAILED\", `Inspector discovery at ${url} timed out after ${timeoutMs.toString()}ms`);\n}\n\nfunction isNodeSystemError(err: unknown): err is NodeSystemError {\n return err instanceof Error;\n}\n\nfunction isConnectionRefusedOrUnreachable(code: string | undefined): boolean {\n return code === \"ECONNREFUSED\" ||\n code === \"ECONNRESET\" ||\n code === \"ETIMEDOUT\" ||\n code === \"EHOSTUNREACH\" ||\n code === \"ENETUNREACH\";\n}\n\nfunction formatEndpoint(url: string, err: NodeSystemError): string {\n if (typeof err.address === \"string\" && typeof err.port === \"number\") {\n return `${err.address}:${err.port.toString()}`;\n }\n const parsed = new URL(url);\n return parsed.host;\n}\n\nfunction formatDiscoveryRequestError(url: string, err: unknown): CfInspectorError {\n const detail = err instanceof Error ? err.message : String(err);\n if (!isNodeSystemError(err) || !isConnectionRefusedOrUnreachable(err.code)) {\n return new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Inspector discovery at ${url} failed: ${detail}`,\n );\n }\n const endpoint = formatEndpoint(url, err);\n return new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Cannot reach Node inspector discovery at ${url}. Nothing is listening on ${endpoint}, or the inspector tunnel is stale/closed. Restart the local inspector or tunnel and retry. If this port came from cf-debugger, stop the stale session and start a fresh tunnel, or run cf-inspector with --app/--region/--org/--space so it can open a tunnel.`,\n detail,\n );\n}\n\nfunction parseJsonResponse(chunks: readonly Buffer[]): unknown {\n const text = Buffer.concat(chunks).toString(\"utf8\");\n return JSON.parse(text) as unknown;\n}\n\nfunction parseDiscoveryError(url: string, err: unknown): CfInspectorError {\n const message = err instanceof Error ? err.message : String(err);\n return new InvalidDiscoveryPayloadError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Failed to parse inspector discovery response from ${url}: ${message}`,\n );\n}\n\nfunction newDiscoveryError(message: string): CfInspectorError {\n return new CfInspectorError(\"INSPECTOR_DISCOVERY_FAILED\", message);\n}\n\nfunction toInspectorTarget(value: unknown, source: string): InspectorTarget {\n if (typeof value !== \"object\" || value === null) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Inspector target is not an object in ${source}`,\n );\n }\n const candidate = value as Record<string, unknown>;\n const webSocketDebuggerUrl = candidate[\"webSocketDebuggerUrl\"];\n if (typeof webSocketDebuggerUrl !== \"string\" || webSocketDebuggerUrl.length === 0) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Inspector target is missing webSocketDebuggerUrl in ${source}`,\n );\n }\n return {\n description: typeof candidate[\"description\"] === \"string\" ? candidate[\"description\"] : \"\",\n id: typeof candidate[\"id\"] === \"string\" ? candidate[\"id\"] : \"\",\n title: typeof candidate[\"title\"] === \"string\" ? candidate[\"title\"] : \"\",\n type: typeof candidate[\"type\"] === \"string\" ? candidate[\"type\"] : \"\",\n url: typeof candidate[\"url\"] === \"string\" ? candidate[\"url\"] : \"\",\n webSocketDebuggerUrl,\n ...(typeof candidate[\"devtoolsFrontendUrl\"] === \"string\"\n ? { devtoolsFrontendUrl: candidate[\"devtoolsFrontendUrl\"] }\n : {}),\n ...(typeof candidate[\"faviconUrl\"] === \"string\" ? { faviconUrl: candidate[\"faviconUrl\"] } : {}),\n };\n}\n\nexport async function discoverInspectorTargets(\n host: string,\n port: number,\n timeoutMs: number,\n): Promise<readonly InspectorTarget[]> {\n const url = `http://${host}:${port.toString()}/json/list`;\n const raw = await fetchJson<unknown>(url, timeoutMs);\n if (!Array.isArray(raw) || raw.length === 0) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `No inspector targets returned from ${url}`,\n );\n }\n return raw.map((entry, idx): InspectorTarget => toInspectorTarget(entry, `${url}[${idx.toString()}]`));\n}\n\nfunction readVersionField(value: Record<string, unknown>, ...keys: readonly string[]): string | undefined {\n for (const key of keys) {\n const entry = value[key];\n if (typeof entry === \"string\" && entry.length > 0) {\n return entry;\n }\n }\n return undefined;\n}\n\nexport async function fetchInspectorVersion(\n host: string,\n port: number,\n timeoutMs: number,\n): Promise<InspectorVersion> {\n const url = `http://${host}:${port.toString()}/json/version`;\n const raw = await fetchJson<unknown>(url, timeoutMs);\n if (typeof raw !== \"object\" || raw === null) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Unexpected /json/version response from ${url}`,\n );\n }\n const value = raw as Record<string, unknown>;\n const browser = readVersionField(value, \"Browser\", \"browser\");\n const protocolVersion = readVersionField(value, \"Protocol-Version\", \"protocolVersion\");\n if (browser === undefined || protocolVersion === undefined) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Unexpected /json/version response from ${url}`,\n );\n }\n return { browser, protocolVersion };\n}\n\nexport function startInspectorKeepalive(\n host: string,\n port: number,\n options: InspectorKeepaliveOptions = {},\n): InspectorKeepalive {\n const intervalMs = options.intervalMs ?? 10_000;\n const probeTimeoutMs = options.probeTimeoutMs ?? 2_000;\n const failureThreshold = options.failureThreshold ?? 3;\n const probe = options.probe ?? (async (): Promise<unknown> =>\n await fetchInspectorVersion(host, port, probeTimeoutMs));\n let cancelled = false;\n let consecutiveFailures = 0;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let rejectFailure: ((error: Error) => void) | undefined;\n const failure = new Promise<never>((_resolve, reject) => {\n rejectFailure = reject;\n });\n const schedule = (): void => {\n if (cancelled) {\n return;\n }\n timer = setTimeout(() => {\n void runProbe();\n }, intervalMs);\n };\n const runProbe = async (): Promise<void> => {\n try {\n await probe();\n consecutiveFailures = 0;\n } catch (error: unknown) {\n consecutiveFailures += 1;\n if (consecutiveFailures >= failureThreshold) {\n cancelled = true;\n const detail = error instanceof Error ? error.message : String(error);\n rejectFailure?.(new CfInspectorError(\n \"INSPECTOR_CONNECTION_FAILED\",\n `Inspector tunnel ${host}:${port.toString()} failed ${failureThreshold.toString()} consecutive keepalive probes and is no longer round-tripping. Retry the command after restarting or investigating the owning tunnel session.`,\n detail,\n ));\n return;\n }\n }\n schedule();\n };\n schedule();\n return {\n failure,\n cancel: (): void => {\n cancelled = true;\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n },\n };\n}\n","import process from \"node:process\";\n\nimport type { LogpointEvent } from \"../logpoint/events.js\";\nimport type {\n ArmedEvent,\n ExceptionSnapshot,\n FrameSnapshot,\n SnapshotResult,\n WatchEvent,\n} from \"../types.js\";\n\ninterface TruncationSummary {\n readonly truncated?: true;\n readonly originalLength?: number;\n readonly omittedCount?: number;\n}\n\nexport function writeProgress(message: string): void {\n process.stderr.write(`[cf-inspector] ${message}\\n`);\n}\n\nexport function writeArmedEvent(\n event: Omit<ArmedEvent, \"event\" | \"schemaVersion\">,\n): void {\n const payload: ArmedEvent = {\n event: \"breakpoint-armed\",\n schemaVersion: 1,\n ...event,\n };\n process.stderr.write(`${JSON.stringify(payload)}\\n`);\n}\n\nexport function writeJson(value: unknown): void {\n process.stdout.write(`${JSON.stringify(value, null, 2)}\\n`);\n}\n\nexport function writeHumanSnapshot(snapshot: SnapshotResult): void {\n const pausedDuration = snapshot.pausedDurationMs === null\n ? \"unknown\"\n : `${snapshot.pausedDurationMs.toFixed(1)}ms`;\n const lines: string[] = [];\n lines.push(\n `Snapshot @ ${snapshot.capturedAt}`,\n ` reason: ${snapshot.reason}`,\n ` isolate: ${formatIsolate(snapshot.isolate)}`,\n ` paused: ${pausedDuration}`,\n );\n if (snapshot.exception !== undefined) {\n appendExceptionLines(lines, snapshot.exception);\n }\n if (snapshot.topFrame) {\n appendFrameLines(lines, snapshot.topFrame);\n }\n if (snapshot.captures.length > 0) {\n lines.push(\" captures:\");\n for (const capture of snapshot.captures) {\n const detail = capture.error ?? capture.value ?? \"undefined\";\n lines.push(` ${capture.expression} = ${renderTruncated(detail, capture)}`);\n }\n }\n if (snapshot.stack !== undefined && snapshot.stack.length > 0) {\n lines.push(\" stack:\");\n for (const frame of snapshot.stack) {\n appendStackFrameLine(lines, frame);\n }\n }\n process.stdout.write(`${lines.join(\"\\n\")}\\n`);\n}\n\nfunction appendFrameLines(lines: string[], frame: FrameSnapshot): void {\n const fnName = frame.functionName.length === 0 ? \"(anonymous)\" : frame.functionName;\n const sourceUrl = frame.url !== undefined && frame.url.length > 0 ? frame.url : \"(unknown)\";\n lines.push(\n ` frame: ${fnName} ${sourceUrl}:${frame.line.toString()}:${frame.column.toString()}`,\n );\n if (frame.truncated === true) {\n lines.push(` scopes: ${truncationLabel(frame)}`);\n }\n if (frame.scopes === undefined) {\n return;\n }\n for (const scope of frame.scopes) {\n const scopeSuffix = scope.truncated === true ? `; ${truncationLabel(scope)}` : \"\";\n lines.push(` scope ${scope.type} (${scope.variables.length.toString()} vars${scopeSuffix}):`);\n for (const variable of scope.variables) {\n lines.push(` ${variable.name} = ${renderTruncated(variable.value, variable)}`);\n }\n }\n}\n\nfunction appendStackFrameLine(lines: string[], frame: FrameSnapshot): void {\n const fnName = frame.functionName.length === 0 ? \"(anonymous)\" : frame.functionName;\n const sourceUrl = frame.url !== undefined && frame.url.length > 0 ? frame.url : \"(unknown)\";\n lines.push(` ${fnName} ${sourceUrl}:${frame.line.toString()}:${frame.column.toString()}`);\n if (frame.captures !== undefined) {\n for (const capture of frame.captures) {\n const detail = capture.error ?? capture.value ?? \"undefined\";\n lines.push(` ${capture.expression} = ${renderTruncated(detail, capture)}`);\n }\n }\n}\n\nfunction appendExceptionLines(lines: string[], exception: ExceptionSnapshot): void {\n if (exception.error !== undefined) {\n lines.push(` exception: !err ${exception.error}`);\n return;\n }\n lines.push(` exception: ${renderExceptionDetail(exception)}`);\n}\n\nexport function writeLogEvent(event: LogpointEvent, json: boolean): void {\n if (json) {\n process.stdout.write(`${JSON.stringify(event)}\\n`);\n return;\n }\n const isolateSuffix = event.isolate === undefined ? \"\" : ` (${formatIsolate(event.isolate)})`;\n if (event.error !== undefined) {\n process.stdout.write(`[${event.ts}] ${event.at}${isolateSuffix} !err ${renderTruncated(event.error, event)}\\n`);\n return;\n }\n process.stdout.write(`[${event.ts}] ${event.at}${isolateSuffix} ${renderTruncated(event.value ?? \"\", event)}\\n`);\n}\n\nexport function writeWatchEvent(event: WatchEvent, json: boolean): void {\n if (json) {\n process.stdout.write(`${JSON.stringify(event)}\\n`);\n return;\n }\n process.stdout.write(\n `[${event.ts}] hit#${event.hit.toString()} ${event.at} (${formatIsolate(event.isolate)})\\n`,\n );\n if (event.exception !== undefined) {\n process.stdout.write(` exception: ${renderExceptionDetail(event.exception)}\\n`);\n }\n for (const capture of event.captures) {\n const detail = capture.error ?? capture.value ?? \"undefined\";\n process.stdout.write(` ${capture.expression} = ${renderTruncated(detail, capture)}\\n`);\n }\n}\n\nfunction formatIsolate(isolate: SnapshotResult[\"isolate\"]): string {\n if (isolate?.kind === \"worker\") {\n return `worker ${isolate.workerId}`;\n }\n return \"main\";\n}\n\nfunction renderExceptionDetail(exception: ExceptionSnapshot): string {\n if (exception.description !== undefined) {\n const originalLength = exception.descriptionOriginalLength;\n return renderTruncated(\n exception.description,\n originalLength === undefined ? {} : { truncated: true, originalLength },\n );\n }\n if (exception.value !== undefined) {\n const originalLength = exception.valueOriginalLength ?? exception.originalLength;\n const summary: TruncationSummary = {\n ...(originalLength === undefined ? {} : { truncated: true, originalLength }),\n ...(exception.omittedCount === undefined\n ? {}\n : { truncated: true, omittedCount: exception.omittedCount }),\n };\n return renderTruncated(exception.value, summary);\n }\n return exception.error ?? \"(unknown)\";\n}\n\nfunction renderTruncated(value: string, summary: TruncationSummary): string {\n if (summary.truncated !== true) {\n return value;\n }\n const visualValue = summary.originalLength === undefined ? value : `${value}…`;\n return `${visualValue} [${truncationLabel(summary)}]`;\n}\n\nfunction truncationLabel(summary: TruncationSummary): string {\n const details: string[] = [];\n if (summary.originalLength !== undefined) {\n details.push(`original ${summary.originalLength.toString()} chars`);\n }\n if (summary.omittedCount !== undefined) {\n details.push(`${summary.omittedCount.toString()} omitted`);\n }\n return details.length === 0 ? \"truncated\" : `truncated: ${details.join(\", \")}`;\n}\n","import {\n type SessionStatus,\n} from \"@saptools/cf-debugger\";\n\nimport { openCfTunnel } from \"../cf/tunnel.js\";\nimport { connectInspector, connectInspectorGroup } from \"../inspector/session.js\";\nimport type { InspectorSession, InspectorSessionGroup } from \"../inspector/types.js\";\nimport { CfInspectorError } from \"../types.js\";\n\nimport { DEFAULT_CF_TIMEOUT_SEC } from \"./commandTypes.js\";\nimport type { SharedTargetOptions, Target } from \"./commandTypes.js\";\nimport { acquireDebugSessionLock } from \"./sessionLock.js\";\nimport { warnOnImplicitInspectorSelection } from \"./warnings.js\";\n\nexport type ProgressReporter = (message: string) => void;\n\nconst CF_TUNNEL_STATUS_MESSAGES = {\n starting: \"Preparing the Cloud Foundry debugger...\",\n \"logging-in\": \"Logging in to Cloud Foundry...\",\n targeting: \"Targeting the Cloud Foundry org and space...\",\n \"ssh-enabling\": \"Enabling SSH for the Cloud Foundry app...\",\n \"ssh-restarting\": \"Restarting the Cloud Foundry app to activate SSH...\",\n signaling: \"Starting the remote Node.js inspector...\",\n tunneling: \"Opening the SSH inspector tunnel...\",\n ready: \"Cloud Foundry inspector tunnel is ready.\",\n stopping: \"Closing the Cloud Foundry inspector tunnel...\",\n stopped: \"Cloud Foundry inspector tunnel closed.\",\n error: \"Cloud Foundry inspector tunnel failed.\",\n} as const satisfies Readonly<Record<SessionStatus, string>>;\n\nexport function formatCfTunnelStatus(status: SessionStatus): string {\n return CF_TUNNEL_STATUS_MESSAGES[status];\n}\n\nexport function parsePositiveInt(raw: string | undefined, label: string): number | undefined {\n if (raw === undefined) {\n return undefined;\n }\n const value = Number.parseInt(raw, 10);\n if (Number.isNaN(value) || value <= 0 || value.toString() !== raw.trim()) {\n throw new CfInspectorError(\"INVALID_ARGUMENT\", `Invalid ${label}: \"${raw}\" — expected a positive integer`);\n }\n return value;\n}\n\nexport interface TargetResolveOptions {\n readonly useTimeoutForTunnel?: boolean;\n}\n\nexport function resolveTarget(opts: SharedTargetOptions, options: TargetResolveOptions = {}): Target {\n const port = parsePositiveInt(opts.port, \"--port\");\n const targetIndex = parseTargetIndex(opts.target);\n const workerIndex = parseSelectionIndex(opts.worker, \"--worker\");\n const workerId = parseWorkerId(opts.workerId);\n const mainOnly = opts.mainOnly === true;\n validateIsolateSelectors(targetIndex, workerIndex, workerId, mainOnly);\n if (port !== undefined) {\n return {\n kind: \"port\",\n port,\n host: opts.host ?? \"127.0.0.1\",\n ...selectionOptions(targetIndex, workerIndex, workerId, mainOnly),\n };\n }\n\n const region = optionalText(opts.region);\n const org = optionalText(opts.org);\n const space = optionalText(opts.space);\n const app = optionalText(opts.app);\n const missingFlags = [\n ...(region === undefined ? [\"--region\"] : []),\n ...(org === undefined ? [\"--org\"] : []),\n ...(space === undefined ? [\"--space\"] : []),\n ...(app === undefined ? [\"--app\"] : []),\n ];\n if (region === undefined || org === undefined || space === undefined || app === undefined) {\n throw new CfInspectorError(\n \"MISSING_TARGET\",\n `Cloud Foundry targeting requires explicit selectors. Missing: ${missingFlags.join(\", \")}. ` +\n \"cf-inspector does not consult ambient `cf target` because it can silently change between runs.\",\n );\n }\n\n return buildCfTarget(\n region,\n optionalText(opts.apiEndpoint),\n org,\n space,\n app,\n parseTunnelTimeout(opts, options),\n targetIndex,\n workerIndex,\n workerId,\n mainOnly,\n );\n}\n\nexport async function resolveTargetWithCurrentCfTarget(\n opts: SharedTargetOptions,\n options: TargetResolveOptions = {},\n): Promise<Target> {\n return await Promise.resolve(resolveTarget(opts, options));\n}\n\nfunction parseTunnelTimeout(opts: SharedTargetOptions, options: TargetResolveOptions): number {\n if (options.useTimeoutForTunnel === false) {\n return DEFAULT_CF_TIMEOUT_SEC;\n }\n return parsePositiveInt(opts.timeout, \"--timeout\") ?? DEFAULT_CF_TIMEOUT_SEC;\n}\n\nfunction parseTargetIndex(raw: string | undefined): number | undefined {\n return parseSelectionIndex(raw, \"--target\");\n}\n\nfunction parseSelectionIndex(raw: string | undefined, label: string): number | undefined {\n if (raw === undefined) {\n return undefined;\n }\n const value = Number.parseInt(raw, 10);\n if (Number.isNaN(value) || value < 0 || value.toString() !== raw.trim()) {\n throw new CfInspectorError(\n \"INVALID_ARGUMENT\",\n `Invalid ${label}: \"${raw}\" — expected a non-negative integer`,\n );\n }\n return value;\n}\n\nfunction targetIndexOption(targetIndex: number | undefined): { readonly targetIndex?: number } {\n return targetIndex === undefined ? {} : { targetIndex };\n}\n\nfunction selectionOptions(\n targetIndex: number | undefined,\n workerIndex: number | undefined,\n workerId?: string,\n mainOnly?: boolean,\n): { readonly targetIndex?: number; readonly workerIndex?: number; readonly workerId?: string; readonly mainOnly?: boolean } {\n return {\n ...targetIndexOption(targetIndex),\n ...(workerIndex === undefined ? {} : { workerIndex }),\n ...(workerId === undefined ? {} : { workerId }),\n ...(mainOnly === true ? { mainOnly: true } : {}),\n };\n}\n\nfunction buildCfTarget(\n region: string,\n apiEndpoint: string | undefined,\n org: string,\n space: string,\n app: string,\n tunnelTimeoutSec: number,\n targetIndex: number | undefined,\n workerIndex: number | undefined,\n workerId: string | undefined,\n mainOnly: boolean,\n): Target {\n return {\n kind: \"cf\",\n region,\n ...(apiEndpoint === undefined ? {} : { apiEndpoint }),\n org,\n space,\n app,\n tunnelTimeoutMs: tunnelTimeoutSec * 1000,\n ...selectionOptions(targetIndex, workerIndex, workerId, mainOnly),\n };\n}\n\nfunction validateIsolateSelectors(\n targetIndex: number | undefined,\n workerIndex: number | undefined,\n workerId: string | undefined,\n mainOnly: boolean,\n): void {\n const workerSelectors = Number(workerIndex !== undefined) + Number(workerId !== undefined);\n if (workerSelectors > 1 || (mainOnly && workerSelectors > 0)) {\n throw new CfInspectorError(\n \"INVALID_ARGUMENT\",\n \"Use only one of --worker, --worker-id, or --main-only.\",\n );\n }\n if (targetIndex !== undefined && workerSelectors === 0 && !mainOnly) {\n return;\n }\n}\n\nfunction optionalText(value: string | undefined): string | undefined {\n const trimmed = value?.trim();\n return trimmed === undefined || trimmed.length === 0 ? undefined : trimmed;\n}\n\nfunction parseWorkerId(value: string | undefined): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n const trimmed = value.trim();\n if (trimmed.length === 0) {\n throw new CfInspectorError(\n \"INVALID_ARGUMENT\",\n \"Invalid --worker-id: expected a non-empty workerId from list-targets\",\n );\n }\n return trimmed;\n}\n\ninterface ResolvedTunnel {\n readonly port: number;\n readonly host: string;\n readonly dispose: () => Promise<void>;\n}\n\nexport async function withSession<T>(\n target: Target,\n fn: (session: InspectorSession, port: number) => Promise<T>,\n reportProgress?: ProgressReporter,\n signal?: AbortSignal,\n): Promise<T> {\n const lock = await acquireDebugSessionLock(target);\n try {\n const tunnel = await openTarget(target, reportProgress, signal);\n let session: InspectorSession | undefined;\n try {\n reportProgress?.(\n `Connecting to the Node.js inspector at ${tunnel.host}:${tunnel.port.toString()}...`,\n );\n session = await connectInspector({\n port: tunnel.port,\n host: tunnel.host,\n ...selectionOptions(target.targetIndex, target.workerIndex),\n ...(target.workerId === undefined ? {} : { workerId: target.workerId }),\n });\n warnOnImplicitInspectorSelection(\n session,\n target.targetIndex !== undefined,\n target.workerIndex !== undefined || target.workerId !== undefined,\n );\n reportProgress?.(\"Inspector session is ready.\");\n return await fn(session, tunnel.port);\n } finally {\n if (session) {\n reportProgress?.(\"Closing the inspector session...\");\n await session.dispose();\n reportProgress?.(\"Inspector session closed.\");\n }\n await tunnel.dispose();\n }\n } finally {\n await lock.release();\n }\n}\n\nexport async function withSessions<T>(\n target: Target,\n fn: (group: InspectorSessionGroup, port: number) => Promise<T>,\n reportProgress?: ProgressReporter,\n signal?: AbortSignal,\n): Promise<T> {\n const lock = await acquireDebugSessionLock(target);\n try {\n const tunnel = await openTarget(target, reportProgress, signal);\n let group: InspectorSessionGroup | undefined;\n try {\n reportProgress?.(\n `Connecting to the Node.js inspector at ${tunnel.host}:${tunnel.port.toString()}...`,\n );\n const autoAttach = target.targetIndex === undefined && target.workerIndex === undefined &&\n target.workerId === undefined && target.mainOnly !== true;\n if (autoAttach) {\n group = await connectInspectorGroup({ port: tunnel.port, host: tunnel.host });\n } else {\n const session = await connectInspector({\n port: tunnel.port,\n host: tunnel.host,\n ...selectionOptions(target.targetIndex, target.workerIndex, target.workerId),\n });\n group = singleSessionGroup(session);\n }\n reportProgress?.(\"Inspector session is ready.\");\n return await fn(group, tunnel.port);\n } finally {\n try {\n if (group !== undefined) {\n const sessionCount = group.list().length;\n reportProgress?.(sessionCount === 1\n ? \"Closing the inspector session...\"\n : `Closing ${sessionCount.toString()} inspector sessions...`);\n await group.dispose();\n reportProgress?.(sessionCount === 1\n ? \"Inspector session closed.\"\n : \"Inspector sessions closed.\");\n }\n } finally {\n await tunnel.dispose();\n }\n }\n } finally {\n await lock.release();\n }\n}\n\nfunction singleSessionGroup(session: InspectorSession): InspectorSessionGroup {\n return {\n targetIndex: session.targetIndex ?? 0,\n targetCount: session.targetCount ?? 1,\n workerDiscoverySupported: session.workerDiscoverySupported ?? false,\n list: (): readonly InspectorSession[] => [session],\n onSession: (listener): (() => void) => {\n listener(session);\n return (): void => undefined;\n },\n onSessionRemoved: (): (() => void) => (): void => undefined,\n onError: (): (() => void) => (): void => undefined,\n dispose: async (): Promise<void> => {\n await session.dispose();\n },\n };\n}\n\nexport async function openTarget(\n target: Target,\n reportProgress?: ProgressReporter,\n signal?: AbortSignal,\n): Promise<ResolvedTunnel> {\n if (target.kind === \"port\") {\n return {\n port: target.port,\n host: target.host,\n dispose: (): Promise<void> => Promise.resolve(),\n };\n }\n reportProgress?.(formatCfTunnelStatus(\"starting\"));\n const tunnel = await openCfTunnel({\n region: target.region,\n ...(target.apiEndpoint === undefined ? {} : { apiEndpoint: target.apiEndpoint }),\n org: target.org,\n space: target.space,\n app: target.app,\n tunnelReadyTimeoutMs: target.tunnelTimeoutMs,\n ...(signal === undefined ? {} : { signal }),\n ...(reportProgress === undefined\n ? {}\n : {\n onStatus: (status: SessionStatus, message?: string): void => {\n reportProgress(message ?? formatCfTunnelStatus(status));\n },\n }),\n });\n return {\n port: tunnel.localPort,\n host: \"127.0.0.1\",\n dispose: async (): Promise<void> => {\n await tunnel.dispose();\n },\n };\n}\n","import { startDebugger } from \"@saptools/cf-debugger\";\nimport type { DebuggerHandle, SessionStatus, StartDebuggerOptions } from \"@saptools/cf-debugger\";\n\nimport { fetchInspectorVersion } from \"../inspector/discovery.js\";\nimport { CfInspectorError } from \"../types.js\";\n\nconst REUSED_TUNNEL_GRACE_MS = 5_000;\n\nexport interface TunnelTarget {\n readonly region: string;\n readonly apiEndpoint?: string;\n readonly org: string;\n readonly space: string;\n readonly app: string;\n readonly process?: string;\n readonly instance?: number;\n readonly nodePid?: number;\n readonly allowSshEnableRestart?: boolean;\n readonly tunnelReadyTimeoutMs?: number;\n readonly preferredPort?: number;\n readonly verbose?: boolean;\n readonly signal?: AbortSignal;\n readonly onStatus?: (status: SessionStatus, message?: string) => void;\n}\n\nexport interface OpenedTunnel {\n readonly localPort: number;\n readonly handle?: DebuggerHandle;\n dispose(): Promise<void>;\n}\n\nfunction targetOptions(\n target: TunnelTarget,\n): Pick<StartDebuggerOptions, \"apiEndpoint\" | \"process\" | \"instance\" | \"nodePid\"> {\n return {\n ...(target.apiEndpoint === undefined ? {} : { apiEndpoint: target.apiEndpoint }),\n ...(target.process === undefined ? {} : { process: target.process }),\n ...(target.instance === undefined ? {} : { instance: target.instance }),\n ...(target.nodePid === undefined ? {} : { nodePid: target.nodePid }),\n };\n}\n\nfunction lifecycleOptions(\n target: TunnelTarget,\n): Pick<\n StartDebuggerOptions,\n \"allowSshEnableRestart\" | \"tunnelReadyTimeoutMs\" | \"preferredPort\" | \"verbose\" | \"signal\" | \"onStatus\"\n> {\n return {\n ...(target.allowSshEnableRestart === undefined ? {} : { allowSshEnableRestart: target.allowSshEnableRestart }),\n ...(target.tunnelReadyTimeoutMs === undefined ? {} : { tunnelReadyTimeoutMs: target.tunnelReadyTimeoutMs }),\n ...(target.preferredPort === undefined ? {} : { preferredPort: target.preferredPort }),\n ...(target.verbose === undefined ? {} : { verbose: target.verbose }),\n ...(target.signal === undefined ? {} : { signal: target.signal }),\n ...(target.onStatus === undefined ? {} : { onStatus: target.onStatus }),\n };\n}\n\nfunction toStartDebuggerOptions(target: TunnelTarget): StartDebuggerOptions {\n return {\n region: target.region,\n org: target.org,\n space: target.space,\n app: target.app,\n ...targetOptions(target),\n ...lifecycleOptions(target),\n };\n}\n\nexport async function openOwnedCfTunnel(target: TunnelTarget): Promise<OpenedTunnel> {\n const opts = toStartDebuggerOptions(target);\n const handle = await startDebugger(opts);\n return {\n localPort: handle.session.localPort,\n handle,\n dispose: async (): Promise<void> => {\n await handle.dispose();\n },\n };\n}\n\nfunction isExistingSessionError(error: unknown): error is Error & { readonly code: \"SESSION_ALREADY_RUNNING\" } {\n return error instanceof Error\n && \"code\" in error\n && error.code === \"SESSION_ALREADY_RUNNING\";\n}\n\nfunction existingTunnelPort(error: unknown): number | undefined {\n if (!isExistingSessionError(error)) {\n return undefined;\n }\n const rawPort = /\\bon port (\\d+)\\b/iu.exec(error.message)?.[1];\n if (rawPort === undefined) {\n return undefined;\n }\n const port = Number.parseInt(rawPort, 10);\n return Number.isInteger(port) && port >= 1 && port <= 65_535 ? port : undefined;\n}\n\nexport async function openCfTunnel(target: TunnelTarget): Promise<OpenedTunnel> {\n try {\n return await openOwnedCfTunnel(target);\n } catch (error: unknown) {\n const localPort = existingTunnelPort(error);\n if (localPort === undefined) {\n throw error;\n }\n try {\n await fetchInspectorVersion(\"127.0.0.1\", localPort, REUSED_TUNNEL_GRACE_MS);\n } catch (livenessError: unknown) {\n const detail = livenessError instanceof Error ? livenessError.message : String(livenessError);\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Another debugger session claims tunnel port ${localPort.toString()}, but its Node inspector did not respond within ${REUSED_TUNNEL_GRACE_MS.toString()}ms. The tunnel may be stale or still finishing setup; retry shortly, or inspect and stop the owning cf-debugger session before opening a fresh tunnel.`,\n detail,\n );\n }\n target.onStatus?.(\"ready\", `Reusing existing tunnel on port ${localPort.toString()}`);\n return { localPort, dispose: (): Promise<void> => Promise.resolve() };\n }\n}\n","import { performance } from \"node:perf_hooks\";\n\nimport { CdpClient, createNodeWorkerClient } from \"../cdp/client.js\";\nimport { CfInspectorError } from \"../types.js\";\nimport type { InspectorConnectOptions, PauseEvent, ScriptInfo } from \"../types.js\";\n\nimport { asString, toPauseEvent, toScriptInfo } from \"./conversions.js\";\nimport { discoverInspectorTargets } from \"./discovery.js\";\nimport type { InspectorTarget } from \"./discovery.js\";\nimport type {\n DebuggerState,\n InspectorSession,\n InspectorSessionGroup,\n InspectorWorkerTarget,\n} from \"./types.js\";\n\nconst DEFAULT_CONNECT_TIMEOUT_MS = 5_000;\nconst DEFAULT_HOST = \"127.0.0.1\";\nconst PAUSE_BUFFER_LIMIT = 32;\nconst WORKER_DISCOVERY_SETTLE_MS = 500;\n\nexport class NodeWorkerDiscovery {\n private readonly workers = new Map<string, InspectorWorkerTarget>();\n private readonly detachListeners: readonly (() => void)[];\n public supported = false;\n private disposed = false;\n private readonly attachedListeners = new Set<(worker: InspectorWorkerTarget) => void>();\n private readonly detachedListeners = new Set<(sessionId: string) => void>();\n\n public constructor(private readonly client: CdpClient) {\n this.detachListeners = [\n client.on(\"NodeWorker.attachedToWorker\", (raw) => {\n const worker = toInspectorWorkerTarget(raw);\n if (worker !== undefined) {\n this.workers.set(worker.sessionId, worker);\n for (const listener of this.attachedListeners) {\n listener(worker);\n }\n }\n }),\n client.on(\"NodeWorker.detachedFromWorker\", (raw) => {\n const sessionId = readField(raw, \"sessionId\");\n if (typeof sessionId === \"string\") {\n this.workers.delete(sessionId);\n for (const listener of this.detachedListeners) {\n listener(sessionId);\n }\n }\n }),\n ];\n }\n\n public async enable(): Promise<void> {\n try {\n await this.client.send(\"NodeWorker.enable\", { waitForDebuggerOnStart: false });\n this.supported = true;\n } catch (error: unknown) {\n if (!isUnsupportedNodeWorkerDomain(error)) {\n throw error;\n }\n }\n }\n\n public list(): readonly InspectorWorkerTarget[] {\n return [...this.workers.values()].sort(compareWorkers);\n }\n\n public onAttached(listener: (worker: InspectorWorkerTarget) => void): () => void {\n this.attachedListeners.add(listener);\n return (): void => {\n this.attachedListeners.delete(listener);\n };\n }\n\n public onDetached(listener: (sessionId: string) => void): () => void {\n this.detachedListeners.add(listener);\n return (): void => {\n this.detachedListeners.delete(listener);\n };\n }\n\n public async waitFor(\n predicate: (workers: readonly InspectorWorkerTarget[]) => InspectorWorkerTarget | undefined,\n timeoutMs = WORKER_DISCOVERY_SETTLE_MS,\n ): Promise<InspectorWorkerTarget | undefined> {\n const existing = predicate(this.list());\n if (existing !== undefined) {\n return existing;\n }\n return await new Promise<InspectorWorkerTarget | undefined>((resolve) => {\n let settled = false;\n const finish = (worker?: InspectorWorkerTarget): void => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n detach();\n resolve(worker);\n };\n const detach = this.onAttached(() => {\n const worker = predicate(this.list());\n if (worker !== undefined) {\n finish(worker);\n }\n });\n const timer = setTimeout(() => {\n finish();\n }, timeoutMs);\n });\n }\n\n public async dispose(): Promise<void> {\n if (this.disposed) {\n return;\n }\n this.disposed = true;\n if (this.supported && !this.client.isClosed) {\n try {\n await this.client.send(\"NodeWorker.disable\");\n } catch {\n // best-effort: the parent inspector may already be closing\n }\n }\n for (const detach of this.detachListeners) {\n detach();\n }\n this.attachedListeners.clear();\n this.detachedListeners.clear();\n }\n}\n\nfunction isUnsupportedNodeWorkerDomain(error: unknown): boolean {\n if (!(error instanceof CfInspectorError) || error.code !== \"CDP_REQUEST_FAILED\") {\n return false;\n }\n return error.detail?.includes('\"code\":-32601') === true;\n}\n\nfunction compareWorkers(left: InspectorWorkerTarget, right: InspectorWorkerTarget): number {\n const leftId = Number.parseInt(left.workerId, 10);\n const rightId = Number.parseInt(right.workerId, 10);\n if (!Number.isNaN(leftId) && !Number.isNaN(rightId) && leftId !== rightId) {\n return leftId - rightId;\n }\n return left.workerId.localeCompare(right.workerId);\n}\n\nfunction toInspectorWorkerTarget(raw: unknown): InspectorWorkerTarget | undefined {\n const sessionId = readField(raw, \"sessionId\");\n const info = readField(raw, \"workerInfo\");\n if (typeof sessionId !== \"string\" || !isUnknownRecord(info)) {\n return undefined;\n }\n const workerId = asString(info[\"workerId\"]);\n if (workerId.length === 0) {\n return undefined;\n }\n return {\n sessionId,\n workerId,\n type: asString(info[\"type\"]),\n title: asString(info[\"title\"]),\n url: asString(info[\"url\"]),\n };\n}\n\nfunction readField(value: unknown, name: string): unknown {\n return isUnknownRecord(value) ? value[name] : void 0;\n}\n\nfunction isUnknownRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nexport async function startNodeWorkerDiscovery(client: CdpClient): Promise<NodeWorkerDiscovery> {\n const discovery = new NodeWorkerDiscovery(client);\n await discovery.enable();\n return discovery;\n}\n\nexport async function connectInspector(options: InspectorConnectOptions): Promise<InspectorSession> {\n const host = options.host ?? DEFAULT_HOST;\n const connectTimeoutMs = options.connectTimeoutMs ?? DEFAULT_CONNECT_TIMEOUT_MS;\n const targets = await discoverInspectorTargets(host, options.port, connectTimeoutMs);\n const targetIndex = options.targetIndex ?? 0;\n const target = targets[targetIndex];\n if (!target) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `No inspector target at index ${targetIndex.toString()} on ${host}:${options.port.toString()} (available: ${targets.length.toString()})`,\n );\n }\n const client = await CdpClient.connect({\n url: target.webSocketDebuggerUrl,\n connectTimeoutMs,\n });\n let workerDiscovery: NodeWorkerDiscovery | undefined;\n try {\n workerDiscovery = await startNodeWorkerDiscovery(client);\n if (options.workerIndex === undefined && options.workerId === undefined) {\n const session = await initSession(client, target, { kind: \"main\" });\n return withWorkerMetadata(session, workerDiscovery, targetIndex, targets.length);\n }\n return await initWorkerSession(\n client,\n workerDiscovery,\n options.workerIndex,\n options.workerId,\n targetIndex,\n targets.length,\n );\n } catch (err: unknown) {\n // The CdpClient is alive (its WS is open) but the inspector handshake\n // failed before we could hand the session to the caller. Dispose so the\n // underlying WS does not leak.\n await workerDiscovery?.dispose();\n client.dispose();\n throw err;\n }\n}\n\nasync function initWorkerSession(\n parent: CdpClient,\n discovery: NodeWorkerDiscovery,\n workerIndex: number | undefined,\n workerId: string | undefined,\n targetIndex: number,\n targetCount: number,\n): Promise<InspectorSession> {\n if (!discovery.supported) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n \"This runtime does not expose the NodeWorker CDP domain; --worker cannot be used. Run list-targets for available raw targets.\",\n );\n }\n const worker = await discovery.waitFor((workers) => workerId === undefined\n ? (workerIndex === undefined ? undefined : workers[workerIndex])\n : workers.find((candidate) => candidate.workerId === workerId));\n if (worker === undefined) {\n const workers = discovery.list();\n const selector = workerId === undefined\n ? `index ${(workerIndex ?? 0).toString()}`\n : `workerId ${JSON.stringify(workerId)}`;\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `No NodeWorker sub-session with ${selector} is currently attached (available: ${workers.length.toString()}). Ensure the worker is alive, then rerun list-targets.`,\n );\n }\n const client = await createNodeWorkerClient(parent, worker.sessionId);\n const session = await initSession(client, workerToInspectorTarget(worker), {\n kind: \"worker\",\n workerId: worker.workerId,\n });\n return withWorkerMetadata(session, discovery, targetIndex, targetCount, workerIndex, parent);\n}\n\nexport async function connectInspectorGroup(\n options: Omit<InspectorConnectOptions, \"workerIndex\" | \"workerId\">,\n): Promise<InspectorSessionGroup> {\n const host = options.host ?? DEFAULT_HOST;\n const connectTimeoutMs = options.connectTimeoutMs ?? DEFAULT_CONNECT_TIMEOUT_MS;\n const targets = await discoverInspectorTargets(host, options.port, connectTimeoutMs);\n const targetIndex = options.targetIndex ?? 0;\n const target = targets[targetIndex];\n if (target === undefined) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `No inspector target at index ${targetIndex.toString()} on ${host}:${options.port.toString()} (available: ${targets.length.toString()})`,\n );\n }\n const parent = await CdpClient.connect({ url: target.webSocketDebuggerUrl, connectTimeoutMs });\n let discovery: NodeWorkerDiscovery | undefined;\n try {\n discovery = await startNodeWorkerDiscovery(parent);\n const main = await initSession(parent, target, { kind: \"main\" });\n const group = new DynamicInspectorSessionGroup(\n parent,\n discovery,\n main,\n targetIndex,\n targets.length,\n );\n await group.initialize();\n return group;\n } catch (error: unknown) {\n await discovery?.dispose();\n parent.dispose();\n throw error;\n }\n}\n\nclass DynamicInspectorSessionGroup implements InspectorSessionGroup {\n private readonly sessions = new Map<string, InspectorSession>();\n private readonly listeners = new Set<(session: InspectorSession) => void>();\n private readonly removedListeners = new Set<(session: InspectorSession) => void>();\n private readonly errorListeners = new Set<(error: Error) => void>();\n private readonly pending = new Set<Promise<void>>();\n private readonly detachedSessionIds = new Set<string>();\n private readonly detachDiscoveryListeners: readonly (() => void)[];\n private initializationError: Error | undefined;\n private initializing = true;\n private disposed = false;\n\n public readonly workerDiscoverySupported: boolean;\n\n public constructor(\n private readonly parent: CdpClient,\n private readonly discovery: NodeWorkerDiscovery,\n main: InspectorSession,\n public readonly targetIndex: number,\n public readonly targetCount: number,\n ) {\n this.workerDiscoverySupported = discovery.supported;\n this.sessions.set(\"main\", main);\n this.detachDiscoveryListeners = [\n discovery.onAttached((worker) => {\n this.queueWorker(worker);\n }),\n discovery.onDetached((sessionId) => {\n void this.detachWorker(sessionId);\n }),\n ];\n }\n\n public async initialize(): Promise<void> {\n for (const worker of this.discovery.list()) {\n this.queueWorker(worker);\n }\n await this.waitForPending();\n this.initializing = false;\n if (this.initializationError !== undefined) {\n throw this.initializationError;\n }\n }\n\n public list(): readonly InspectorSession[] {\n return [...this.sessions.values()];\n }\n\n public onSession(listener: (session: InspectorSession) => void): () => void {\n this.listeners.add(listener);\n for (const session of this.sessions.values()) {\n listener(session);\n }\n return (): void => {\n this.listeners.delete(listener);\n };\n }\n\n public onSessionRemoved(listener: (session: InspectorSession) => void): () => void {\n this.removedListeners.add(listener);\n return (): void => {\n this.removedListeners.delete(listener);\n };\n }\n\n public onError(listener: (error: Error) => void): () => void {\n this.errorListeners.add(listener);\n return (): void => {\n this.errorListeners.delete(listener);\n };\n }\n\n public async dispose(): Promise<void> {\n if (this.disposed) {\n return;\n }\n this.disposed = true;\n for (const detach of this.detachDiscoveryListeners) {\n detach();\n }\n await Promise.allSettled([...this.pending]);\n const sessions = [...this.list()].reverse();\n for (const session of sessions) {\n try {\n await session.dispose();\n } catch {\n // Continue closing every remaining session and the parent transport.\n }\n }\n this.sessions.clear();\n this.listeners.clear();\n this.removedListeners.clear();\n this.errorListeners.clear();\n await this.discovery.dispose();\n this.parent.dispose();\n }\n\n private queueWorker(worker: InspectorWorkerTarget): void {\n if (this.disposed || this.sessions.has(worker.sessionId)) {\n return;\n }\n const pending = this.attachWorker(worker).catch((error: unknown) => {\n const normalized = error instanceof Error ? error : new Error(\"Worker inspector attachment failed\");\n if (this.initializing && this.initializationError === undefined) {\n this.initializationError = normalized;\n }\n for (const listener of this.errorListeners) {\n listener(normalized);\n }\n }).finally(() => {\n this.pending.delete(pending);\n });\n this.pending.add(pending);\n }\n\n private async attachWorker(worker: InspectorWorkerTarget): Promise<void> {\n const client = await createNodeWorkerClient(this.parent, worker.sessionId);\n try {\n const session = await initSession(client, workerToInspectorTarget(worker), {\n kind: \"worker\",\n workerId: worker.workerId,\n });\n if (this.disposed || this.detachedSessionIds.delete(worker.sessionId)) {\n await session.dispose();\n return;\n }\n this.sessions.set(worker.sessionId, session);\n for (const listener of this.listeners) {\n listener(session);\n }\n } catch (error: unknown) {\n client.dispose();\n if (!this.disposed) {\n throw error;\n }\n }\n }\n\n private async detachWorker(sessionId: string): Promise<void> {\n const session = this.sessions.get(sessionId);\n if (session === undefined) {\n this.detachedSessionIds.add(sessionId);\n return;\n }\n this.sessions.delete(sessionId);\n for (const listener of this.removedListeners) {\n listener(session);\n }\n await session.dispose();\n }\n\n private async waitForPending(): Promise<void> {\n while (this.pending.size > 0) {\n await Promise.all([...this.pending]);\n }\n }\n}\n\nfunction withWorkerMetadata(\n session: InspectorSession,\n discovery: NodeWorkerDiscovery,\n targetIndex: number,\n targetCount: number,\n workerIndex?: number,\n parent?: CdpClient,\n): InspectorSession {\n return {\n ...session,\n targetIndex,\n targetCount,\n ...(workerIndex === undefined ? {} : { workerIndex }),\n workerTargets: discovery.list(),\n workerDiscoverySupported: discovery.supported,\n dispose: async (): Promise<void> => {\n await session.dispose();\n await discovery.dispose();\n parent?.dispose();\n },\n };\n}\n\nfunction workerToInspectorTarget(worker: InspectorWorkerTarget): InspectorTarget {\n return {\n description: \"Node worker sub-session\",\n id: worker.workerId,\n title: worker.title,\n type: worker.type,\n url: worker.url,\n webSocketDebuggerUrl: `node-worker://${worker.sessionId}`,\n };\n}\n\nexport interface NodeWorkerTargetsResult {\n readonly supported: boolean;\n readonly workers: readonly InspectorWorkerTarget[];\n}\n\nexport async function discoverNodeWorkerTargets(\n target: InspectorTarget,\n connectTimeoutMs = DEFAULT_CONNECT_TIMEOUT_MS,\n): Promise<NodeWorkerTargetsResult> {\n const client = await CdpClient.connect({ url: target.webSocketDebuggerUrl, connectTimeoutMs });\n let discovery: NodeWorkerDiscovery | undefined;\n try {\n discovery = await startNodeWorkerDiscovery(client);\n return { supported: discovery.supported, workers: discovery.list() };\n } finally {\n await discovery?.dispose();\n client.dispose();\n }\n}\n\nasync function initSession(\n client: CdpClient,\n target: InspectorSession[\"target\"],\n isolate: NonNullable<InspectorSession[\"isolate\"]>,\n): Promise<InspectorSession> {\n const scripts = new Map<string, ScriptInfo>();\n registerScriptTracking(client, scripts);\n const pauseBuffer: PauseEvent[] = [];\n const pauseWaitGate = { active: false };\n const debuggerState: DebuggerState = { paused: false };\n registerPauseTracking(client, scripts, pauseBuffer, pauseWaitGate, debuggerState);\n await client.send(\"Runtime.enable\");\n await client.send(\"Debugger.enable\");\n return createSession(client, target, isolate, scripts, pauseBuffer, pauseWaitGate, debuggerState);\n}\n\nfunction registerScriptTracking(client: CdpClient, scripts: Map<string, ScriptInfo>): void {\n client.on(\"Debugger.scriptParsed\", (raw) => {\n const script = toScriptInfo(raw);\n if (script !== undefined) {\n scripts.set(script.scriptId, script);\n }\n });\n}\n\nfunction registerPauseTracking(\n client: CdpClient,\n scripts: ReadonlyMap<string, ScriptInfo>,\n pauseBuffer: PauseEvent[],\n pauseWaitGate: { active: boolean },\n debuggerState: DebuggerState,\n): void {\n client.on(\"Debugger.paused\", (raw) => {\n const event = toPauseEvent(raw, performance.now(), scripts);\n debuggerState.paused = true;\n debuggerState.currentPause = event;\n if (pauseWaitGate.active) {\n return;\n }\n if (pauseBuffer.length >= PAUSE_BUFFER_LIMIT) {\n pauseBuffer.shift();\n }\n pauseBuffer.push(event);\n });\n client.on(\"Debugger.resumed\", () => {\n debuggerState.paused = false;\n delete debuggerState.currentPause;\n debuggerState.lastResumedAtMs = performance.now();\n });\n}\n\nfunction createSession(\n client: CdpClient,\n target: InspectorSession[\"target\"],\n isolate: NonNullable<InspectorSession[\"isolate\"]>,\n scripts: ReadonlyMap<string, ScriptInfo>,\n pauseBuffer: PauseEvent[],\n pauseWaitGate: { active: boolean },\n debuggerState: DebuggerState,\n): InspectorSession {\n return {\n client,\n target,\n isolate,\n scripts,\n pauseBuffer,\n pauseWaitGate,\n debuggerState,\n dispose: async (): Promise<void> => {\n try {\n await client.send(\"Debugger.disable\");\n } catch {\n // best-effort\n }\n client.dispose();\n },\n };\n}\n\nexport const internalsForTesting = {\n startNodeWorkerDiscovery,\n};\n","import { EventEmitter } from \"node:events\";\n\nimport { CfInspectorError } from \"../types.js\";\n\nconst DEFAULT_REQUEST_TIMEOUT_MS = 60_000;\n\nexport interface CdpTransportEventMap {\n readonly message: (data: string) => void;\n readonly close: () => void;\n readonly error: (err: Error) => void;\n}\n\nexport interface CdpTransport {\n send(payload: string): void;\n close(): void;\n readonly readyState: number;\n on<E extends keyof CdpTransportEventMap>(event: E, listener: CdpTransportEventMap[E]): void;\n off<E extends keyof CdpTransportEventMap>(event: E, listener: CdpTransportEventMap[E]): void;\n}\n\nexport interface CdpTransportFactoryOptions {\n readonly connectTimeoutMs?: number;\n}\n\nexport type CdpTransportFactory = (\n url: string,\n options?: CdpTransportFactoryOptions,\n) => Promise<CdpTransport>;\n\nexport interface CdpClientOptions {\n readonly url: string;\n readonly transportFactory?: CdpTransportFactory;\n readonly requestTimeoutMs?: number;\n readonly connectTimeoutMs?: number;\n}\n\nexport interface CdpWaitOptions<T> {\n readonly timeoutMs: number;\n readonly predicate?: (params: T) => boolean;\n readonly signal?: AbortSignal;\n}\n\ninterface PendingRequest {\n readonly resolve: (value: unknown) => void;\n readonly reject: (error: Error) => void;\n readonly timer: ReturnType<typeof setTimeout>;\n}\n\ninterface ParsedMessage {\n readonly id?: number;\n readonly method?: string;\n readonly result?: unknown;\n readonly params?: unknown;\n readonly error?: { readonly code: number; readonly message: string };\n}\n\ninterface NodeWorkerEventParams {\n readonly sessionId?: unknown;\n readonly message?: unknown;\n}\n\nfunction parseMessage(raw: string): ParsedMessage | undefined {\n try {\n const value: unknown = JSON.parse(raw);\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n return value as ParsedMessage;\n } catch {\n return undefined;\n }\n}\n\nasync function loadDefaultFactory(): Promise<CdpTransportFactory> {\n const mod = await import(\"./wsTransport.js\");\n return mod.wsTransportFactory;\n}\n\nexport class CdpClient {\n private readonly transport: CdpTransport;\n private readonly requestTimeoutMs: number;\n private readonly pending = new Map<number, PendingRequest>();\n private readonly emitter = new EventEmitter();\n private nextId = 1;\n private closed = false;\n private closeReason: Error | undefined;\n\n private readonly handleMessage = (raw: string): void => {\n const parsed = parseMessage(raw);\n if (!parsed) {\n return;\n }\n if (typeof parsed.id === \"number\") {\n this.handleResponse(parsed);\n return;\n }\n if (typeof parsed.method === \"string\") {\n // A throwing listener must not crash the WS message pipeline. Without\n // this guard, EventEmitter rethrows on the first uncaught listener\n // exception and the rest of the dispatch stops — including downstream\n // listeners that need to settle pending requests.\n this.safeEmit(parsed.method, parsed.params);\n this.safeEmit(\"event\", { method: parsed.method, params: parsed.params });\n }\n };\n\n private safeEmit(event: string, payload: unknown): void {\n // EventEmitter.emit re-throws on the first listener's exception and skips\n // the rest. Iterate explicitly so one bad listener does not deny later\n // listeners (e.g. the pause buffer pusher) from observing the event.\n const listeners = this.emitter.listeners(event);\n for (const listener of listeners) {\n try {\n (listener as (payload: unknown) => void)(payload);\n } catch {\n // Listener exceptions are caller bugs; swallow to keep the pipeline alive.\n }\n }\n }\n\n private readonly handleClose = (): void => {\n this.markClosed(new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", \"Inspector connection closed\"));\n };\n\n private readonly handleError = (err: Error): void => {\n this.markClosed(\n err instanceof CfInspectorError\n ? err\n : new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", err.message),\n );\n };\n\n private constructor(transport: CdpTransport, requestTimeoutMs: number) {\n this.transport = transport;\n this.requestTimeoutMs = requestTimeoutMs;\n transport.on(\"message\", this.handleMessage);\n transport.on(\"close\", this.handleClose);\n transport.on(\"error\", this.handleError);\n }\n\n public static async connect(options: CdpClientOptions): Promise<CdpClient> {\n const factory = options.transportFactory ?? (await loadDefaultFactory());\n const factoryOptions: CdpTransportFactoryOptions =\n options.connectTimeoutMs === undefined ? {} : { connectTimeoutMs: options.connectTimeoutMs };\n const transport = await factory(options.url, factoryOptions);\n return new CdpClient(transport, options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS);\n }\n\n public async send<TResult = unknown>(\n method: string,\n params: Record<string, unknown> = {},\n ): Promise<TResult> {\n if (this.closed) {\n throw this.closeReason ?? new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", \"Connection closed\");\n }\n const id = this.nextId++;\n const payload = JSON.stringify({ id, method, params });\n return await new Promise<TResult>((resolve, reject) => {\n const timer = this.createRequestTimer(id, method, reject);\n this.pending.set(id, {\n resolve: (value): void => {\n resolve(value as TResult);\n },\n reject,\n timer,\n });\n this.sendPayload(id, method, payload, timer, reject);\n });\n }\n\n public on(method: string, listener: (params: unknown) => void): () => void {\n this.emitter.on(method, listener);\n return (): void => {\n this.emitter.off(method, listener);\n };\n }\n\n public async waitFor<T = unknown>(\n method: string,\n options: CdpWaitOptions<T> = {\n timeoutMs: this.requestTimeoutMs,\n },\n ): Promise<T> {\n if (this.closed) {\n throw this.closeReason ?? new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", \"Connection closed\");\n }\n if (options.signal?.aborted === true) {\n throw this.createWaitAbortError(method);\n }\n return await this.createEventWait(method, options);\n }\n\n private createEventWait<T>(method: string, options: CdpWaitOptions<T>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n let settled = false;\n let offEvent = (): void => undefined;\n let offClose = (): void => undefined;\n const cleanup = (): void => {\n clearTimeout(timer);\n offEvent();\n offClose();\n options.signal?.removeEventListener(\"abort\", onAbort);\n };\n const resolveOnce = (value: T): void => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n resolve(value);\n };\n const rejectOnce = (error: Error): void => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n reject(error);\n };\n const onAbort = (): void => {\n rejectOnce(this.createWaitAbortError(method));\n };\n const timer = setTimeout(() => {\n rejectOnce(this.createWaitTimeoutError(method, options.timeoutMs));\n }, options.timeoutMs);\n offEvent = this.on(method, (raw) => {\n const params = raw as T;\n if (!this.eventMatches(params, options.predicate)) {\n return;\n }\n resolveOnce(params);\n });\n offClose = this.onClose((error) => {\n rejectOnce(error);\n });\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n if (options.signal?.aborted === true) {\n onAbort();\n }\n });\n }\n\n private eventMatches<T>(params: T, predicate: ((params: T) => boolean) | undefined): boolean {\n if (predicate === undefined) {\n return true;\n }\n try {\n return predicate(params);\n } catch {\n return false;\n }\n }\n\n public onClose(listener: (err: Error) => void): () => void {\n if (this.closed) {\n const reason = this.closeReason ?? new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", \"Connection closed\");\n queueMicrotask(() => {\n listener(reason);\n });\n return (): void => {\n // already closed; nothing to detach\n };\n }\n this.emitter.on(\"__close__\", listener);\n return (): void => {\n this.emitter.off(\"__close__\", listener);\n };\n }\n\n public dispose(): void {\n if (this.closed) {\n return;\n }\n this.transport.off(\"message\", this.handleMessage);\n this.transport.off(\"close\", this.handleClose);\n this.transport.off(\"error\", this.handleError);\n try {\n this.transport.close();\n } catch {\n // best-effort\n }\n this.markClosed(new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", \"Connection disposed\"));\n }\n\n public get isClosed(): boolean {\n return this.closed;\n }\n\n private handleResponse(parsed: ParsedMessage): void {\n const pending = this.pending.get(parsed.id ?? -1);\n if (!pending) {\n return;\n }\n this.pending.delete(parsed.id ?? -1);\n clearTimeout(pending.timer);\n if (parsed.error) {\n pending.reject(\n new CfInspectorError(\n \"CDP_REQUEST_FAILED\",\n `CDP request ${(parsed.id ?? -1).toString()} failed: ${parsed.error.message}`,\n JSON.stringify(parsed.error),\n ),\n );\n return;\n }\n pending.resolve(parsed.result);\n }\n\n private createRequestTimer(\n id: number,\n method: string,\n reject: (error: Error) => void,\n ): ReturnType<typeof setTimeout> {\n return setTimeout(() => {\n this.pending.delete(id);\n reject(\n new CfInspectorError(\n \"CDP_REQUEST_FAILED\",\n `CDP method ${method} timed out after ${this.requestTimeoutMs.toString()}ms`,\n ),\n );\n }, this.requestTimeoutMs);\n }\n\n private createWaitTimeoutError(method: string, timeoutMs: number): CfInspectorError {\n return new CfInspectorError(\n \"BREAKPOINT_NOT_HIT\",\n `Timed out waiting for ${method} after ${timeoutMs.toString()}ms`,\n );\n }\n\n private createWaitAbortError(method: string): CfInspectorError {\n return new CfInspectorError(\"ABORTED\", `Aborted while waiting for ${method}`);\n }\n\n private sendPayload(\n id: number,\n method: string,\n payload: string,\n timer: ReturnType<typeof setTimeout>,\n reject: (error: Error) => void,\n ): void {\n try {\n this.transport.send(payload);\n } catch (err: unknown) {\n clearTimeout(timer);\n this.pending.delete(id);\n const message = err instanceof Error ? err.message : String(err);\n reject(new CfInspectorError(\"CDP_REQUEST_FAILED\", `Failed to send ${method}: ${message}`));\n }\n }\n\n private markClosed(reason: Error): void {\n if (this.closed) {\n return;\n }\n this.closed = true;\n this.closeReason = reason;\n for (const [, pending] of this.pending) {\n clearTimeout(pending.timer);\n pending.reject(reason);\n }\n this.pending.clear();\n this.emitter.emit(\"__close__\", reason);\n this.emitter.removeAllListeners();\n }\n}\n\nclass NodeWorkerTransport implements CdpTransport {\n private readonly emitter = new EventEmitter();\n private readonly detachParentListeners: readonly (() => void)[];\n public readyState = 1;\n\n public constructor(\n private readonly parent: CdpClient,\n private readonly sessionId: string,\n ) {\n this.detachParentListeners = [\n parent.on(\"NodeWorker.receivedMessageFromWorker\", (raw) => {\n this.forwardWorkerMessage(raw);\n }),\n parent.on(\"NodeWorker.detachedFromWorker\", (raw) => {\n this.handleWorkerDetach(raw);\n }),\n parent.onClose((error) => {\n this.closeWithError(error);\n }),\n ];\n }\n\n public send(payload: string): void {\n if (this.readyState !== 1) {\n throw new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", \"Worker inspector session is closed\");\n }\n void this.parent.send(\"NodeWorker.sendMessageToWorker\", {\n sessionId: this.sessionId,\n message: payload,\n }).catch((error: unknown) => {\n const normalized = error instanceof Error ? error : new Error(String(error));\n this.closeWithError(normalized);\n });\n }\n\n public close(): void {\n this.finishClose();\n }\n\n public on<E extends keyof CdpTransportEventMap>(\n event: E,\n listener: CdpTransportEventMap[E],\n ): void {\n this.emitter.on(event, listener);\n }\n\n public off<E extends keyof CdpTransportEventMap>(\n event: E,\n listener: CdpTransportEventMap[E],\n ): void {\n this.emitter.off(event, listener);\n }\n\n private forwardWorkerMessage(raw: unknown): void {\n const params = asNodeWorkerEventParams(raw);\n if (params.sessionId !== this.sessionId || typeof params.message !== \"string\") {\n return;\n }\n this.emitter.emit(\"message\", params.message);\n }\n\n private handleWorkerDetach(raw: unknown): void {\n const params = asNodeWorkerEventParams(raw);\n if (params.sessionId === this.sessionId) {\n this.finishClose();\n }\n }\n\n private closeWithError(error: Error): void {\n if (this.readyState !== 1) {\n return;\n }\n this.emitter.emit(\"error\", error);\n this.finishClose();\n }\n\n private finishClose(): void {\n if (this.readyState !== 1) {\n return;\n }\n this.readyState = 3;\n for (const detach of this.detachParentListeners) {\n detach();\n }\n this.emitter.emit(\"close\");\n this.emitter.removeAllListeners();\n }\n}\n\nfunction asNodeWorkerEventParams(raw: unknown): NodeWorkerEventParams {\n if (!isUnknownRecord(raw)) {\n return {};\n }\n const sessionId = raw[\"sessionId\"];\n const message = raw[\"message\"];\n return {\n ...(typeof sessionId === \"string\" ? { sessionId } : {}),\n ...(typeof message === \"string\" ? { message } : {}),\n };\n}\n\nfunction isUnknownRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nexport async function createNodeWorkerClient(\n parent: CdpClient,\n sessionId: string,\n requestTimeoutMs = DEFAULT_REQUEST_TIMEOUT_MS,\n): Promise<CdpClient> {\n const transport = new NodeWorkerTransport(parent, sessionId);\n return await CdpClient.connect({\n url: `node-worker://${sessionId}`,\n transportFactory: (): Promise<CdpTransport> => Promise.resolve(transport),\n requestTimeoutMs,\n });\n}\n","// cspell:words trustedtype wasmvalue webassemblymemory\nimport type {\n BreakLocation,\n CallFrameInfo,\n PauseEvent,\n RemoteObjectInfo,\n ResolvedLocation,\n ScriptInfo,\n ScriptLocation,\n ScopeInfo,\n StackTraceFrameInfo,\n StackTraceIdInfo,\n StackTraceInfo,\n} from \"../types.js\";\n\nconst INTERNAL_SLOT_SUBTYPES = new Set([\n \"regexp\",\n \"date\",\n \"map\",\n \"set\",\n \"weakmap\",\n \"weakset\",\n \"iterator\",\n \"generator\",\n \"promise\",\n \"typedarray\",\n \"arraybuffer\",\n \"dataview\",\n \"webassemblymemory\",\n \"wasmvalue\",\n \"trustedtype\",\n]);\n\nexport function asString(value: unknown, fallback = \"\"): string {\n return typeof value === \"string\" ? value : fallback;\n}\n\nexport function asNumber(value: unknown, fallback = 0): number {\n return typeof value === \"number\" && Number.isFinite(value) ? value : fallback;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction nonEmptyString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction optionalNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction optionalCoordinate(value: unknown): number | undefined {\n const number = optionalNumber(value);\n return number !== undefined && Number.isSafeInteger(number) && number >= 0\n ? number\n : undefined;\n}\n\nfunction optionalBoolean(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nexport function toScriptLocation(value: unknown): ScriptLocation | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n const scriptId = nonEmptyString(value[\"scriptId\"]);\n const lineNumber = optionalCoordinate(value[\"lineNumber\"]);\n if (scriptId === undefined || lineNumber === undefined) {\n return undefined;\n }\n const rawColumnNumber = value[\"columnNumber\"];\n const columnNumber = optionalCoordinate(rawColumnNumber);\n if (rawColumnNumber !== undefined && columnNumber === undefined) {\n return undefined;\n }\n return columnNumber === undefined\n ? { scriptId, lineNumber }\n : { scriptId, lineNumber, columnNumber };\n}\n\nexport function toResolvedLocations(value: unknown): readonly ResolvedLocation[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.flatMap((entry): ResolvedLocation[] => {\n const location = toScriptLocation(entry);\n if (location === undefined || !isRecord(entry)) {\n return [];\n }\n const url = typeof entry[\"url\"] === \"string\" ? entry[\"url\"] : undefined;\n return [url === undefined ? location : { ...location, url }];\n });\n}\n\nexport function toBreakLocations(value: unknown): readonly BreakLocation[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.flatMap((entry): BreakLocation[] => {\n const location = toScriptLocation(entry);\n if (location === undefined || !isRecord(entry)) {\n return [];\n }\n const type = nonEmptyString(entry[\"type\"]);\n return [type === undefined ? location : { ...location, type }];\n });\n}\n\nfunction remoteCompleteness(subtype: string | undefined): RemoteObjectInfo[\"completeness\"] {\n if (subtype === \"proxy\") {\n return \"unavailable\";\n }\n return subtype !== undefined && INTERNAL_SLOT_SUBTYPES.has(subtype)\n ? \"truncated\"\n : undefined;\n}\n\nfunction optionalOwnField(\n key: string,\n value: Readonly<Record<string, unknown>>,\n): Readonly<Record<string, unknown>> {\n return Object.hasOwn(value, key) ? { [key]: value[key] } : {};\n}\n\nexport function toRemoteObject(value: unknown): RemoteObjectInfo | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n const type = nonEmptyString(value[\"type\"]);\n if (type === undefined) {\n return undefined;\n }\n const subtype = nonEmptyString(value[\"subtype\"]);\n const completeness = remoteCompleteness(subtype);\n return {\n type,\n ...(subtype === undefined ? {} : { subtype }),\n ...optionalTextField(\"className\", value[\"className\"]),\n ...(completeness === undefined ? {} : { completeness }),\n ...optionalOwnField(\"value\", value),\n ...optionalTextField(\"unserializableValue\", value[\"unserializableValue\"]),\n ...optionalTextField(\"description\", value[\"description\"]),\n ...optionalOwnField(\"deepSerializedValue\", value),\n ...optionalTextField(\"objectId\", value[\"objectId\"]),\n ...optionalOwnField(\"preview\", value),\n ...optionalOwnField(\"customPreview\", value),\n };\n}\n\nfunction optionalTextField(\n key: string,\n value: unknown,\n): Readonly<Record<string, string>> {\n return typeof value === \"string\" ? { [key]: value } : {};\n}\n\nfunction toScope(value: unknown): ScopeInfo | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n const type = nonEmptyString(value[\"type\"]);\n if (type === undefined) {\n return undefined;\n }\n const object = toRemoteObject(value[\"object\"]);\n const name = nonEmptyString(value[\"name\"]);\n const startLocation = toScriptLocation(value[\"startLocation\"]);\n const endLocation = toScriptLocation(value[\"endLocation\"]);\n return {\n type,\n ...(name === undefined ? {} : { name }),\n ...(object === undefined ? {} : { object }),\n ...(object?.objectId === undefined ? {} : { objectId: object.objectId }),\n ...(startLocation === undefined ? {} : { startLocation }),\n ...(endLocation === undefined ? {} : { endLocation }),\n };\n}\n\nfunction toScopeChain(value: unknown): readonly ScopeInfo[] {\n return Array.isArray(value)\n ? value.flatMap((entry): ScopeInfo[] => {\n const scope = toScope(entry);\n return scope === undefined ? [] : [scope];\n })\n : [];\n}\n\nfunction resolveCallFrameUrl(\n frame: Readonly<Record<string, unknown>>,\n scripts: ReadonlyMap<string, ScriptInfo> | undefined,\n): string | undefined {\n const direct = nonEmptyString(frame[\"url\"]);\n if (direct !== undefined) {\n return direct;\n }\n const scriptId = toScriptLocation(frame[\"location\"])?.scriptId;\n return scriptId === undefined ? undefined : nonEmptyString(scripts?.get(scriptId)?.url);\n}\n\nfunction toCallFrameMetadata(\n candidate: Readonly<Record<string, unknown>>,\n location: ScriptLocation | undefined,\n scripts: ReadonlyMap<string, ScriptInfo> | undefined,\n): Partial<CallFrameInfo> {\n const functionLocation = toScriptLocation(candidate[\"functionLocation\"]);\n const thisObject = toRemoteObject(candidate[\"this\"]);\n const returnValue = toRemoteObject(candidate[\"returnValue\"]);\n const url = resolveCallFrameUrl(candidate, scripts);\n return {\n ...(location === undefined ? {} : { scriptId: location.scriptId }),\n ...(functionLocation === undefined ? {} : { functionLocation }),\n ...(url === undefined ? {} : { url }),\n ...(thisObject === undefined ? {} : { thisObject }),\n ...(returnValue === undefined ? {} : { returnValue }),\n };\n}\n\nfunction toCallFrame(\n value: unknown,\n scripts: ReadonlyMap<string, ScriptInfo> | undefined,\n): CallFrameInfo | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n const callFrameId = nonEmptyString(value[\"callFrameId\"]);\n if (callFrameId === undefined) {\n return undefined;\n }\n const location = toScriptLocation(value[\"location\"]);\n return {\n callFrameId,\n functionName: asString(value[\"functionName\"]),\n ...toCallFrameMetadata(value, location, scripts),\n lineNumber: location?.lineNumber ?? 0,\n columnNumber: location?.columnNumber ?? 0,\n scopeChain: toScopeChain(value[\"scopeChain\"]),\n };\n}\n\nfunction toCallFrames(\n value: unknown,\n scripts: ReadonlyMap<string, ScriptInfo> | undefined,\n): readonly CallFrameInfo[] {\n return Array.isArray(value)\n ? value.flatMap((entry): CallFrameInfo[] => {\n const frame = toCallFrame(entry, scripts);\n return frame === undefined ? [] : [frame];\n })\n : [];\n}\n\nfunction toStackTraceId(value: unknown): StackTraceIdInfo | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n const id = nonEmptyString(value[\"id\"]);\n if (id === undefined) {\n return undefined;\n }\n const debuggerId = nonEmptyString(value[\"debuggerId\"]);\n return debuggerId === undefined ? { id } : { id, debuggerId };\n}\n\nfunction toStackTraceFrame(value: unknown): StackTraceFrameInfo | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n const scriptId = nonEmptyString(value[\"scriptId\"]);\n if (scriptId === undefined) {\n return undefined;\n }\n return {\n functionName: asString(value[\"functionName\"]),\n scriptId,\n url: asString(value[\"url\"]),\n lineNumber: asNumber(value[\"lineNumber\"]),\n columnNumber: asNumber(value[\"columnNumber\"]),\n };\n}\n\nfunction toStackTrace(value: unknown): StackTraceInfo | undefined {\n if (!isRecord(value) || !Array.isArray(value[\"callFrames\"])) {\n return undefined;\n }\n const callFrames = value[\"callFrames\"].flatMap((entry): StackTraceFrameInfo[] => {\n const frame = toStackTraceFrame(entry);\n return frame === undefined ? [] : [frame];\n });\n const description = nonEmptyString(value[\"description\"]);\n const parent = toStackTrace(value[\"parent\"]);\n const parentId = toStackTraceId(value[\"parentId\"]);\n return {\n callFrames,\n ...(description === undefined ? {} : { description }),\n ...(parent === undefined ? {} : { parent }),\n ...(parentId === undefined ? {} : { parentId }),\n };\n}\n\nexport function toPauseEvent(\n value: unknown,\n receivedAtMs: number,\n scripts?: ReadonlyMap<string, ScriptInfo>,\n): PauseEvent {\n const params = isRecord(value) ? value : {};\n const asyncStackTrace = toStackTrace(params[\"asyncStackTrace\"]);\n const asyncStackTraceId = toStackTraceId(params[\"asyncStackTraceId\"]);\n const asyncCallStackTraceId = toStackTraceId(params[\"asyncCallStackTraceId\"]);\n return {\n reason: asString(params[\"reason\"]),\n hitBreakpoints: Array.isArray(params[\"hitBreakpoints\"])\n ? params[\"hitBreakpoints\"].filter((id): id is string => typeof id === \"string\")\n : [],\n callFrames: toCallFrames(params[\"callFrames\"], scripts),\n receivedAtMs,\n ...(params[\"data\"] === undefined ? {} : { data: params[\"data\"] }),\n ...(asyncStackTrace === undefined ? {} : { asyncStackTrace }),\n ...(asyncStackTraceId === undefined ? {} : { asyncStackTraceId }),\n ...(asyncCallStackTraceId === undefined ? {} : { asyncCallStackTraceId }),\n };\n}\n\nexport function toScriptInfo(value: unknown): ScriptInfo | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n const scriptId = nonEmptyString(value[\"scriptId\"]);\n if (scriptId === undefined) {\n return undefined;\n }\n const stackTrace = toStackTrace(value[\"stackTrace\"]);\n return {\n scriptId,\n url: asString(value[\"url\"]),\n ...optionalNumericField(\"startLine\", value[\"startLine\"]),\n ...optionalNumericField(\"startColumn\", value[\"startColumn\"]),\n ...optionalNumericField(\"endLine\", value[\"endLine\"]),\n ...optionalNumericField(\"endColumn\", value[\"endColumn\"]),\n ...optionalNumericField(\"executionContextId\", value[\"executionContextId\"]),\n ...optionalTextField(\"hash\", value[\"hash\"]),\n ...optionalTextField(\"buildId\", value[\"buildId\"]),\n ...(value[\"executionContextAuxData\"] === undefined\n ? {}\n : { executionContextAuxData: value[\"executionContextAuxData\"] }),\n ...optionalTextField(\"sourceMapURL\", value[\"sourceMapURL\"]),\n ...optionalBooleanField(\"hasSourceURL\", value[\"hasSourceURL\"]),\n ...optionalBooleanField(\"isModule\", value[\"isModule\"]),\n ...optionalNumericField(\"length\", value[\"length\"]),\n ...(stackTrace === undefined ? {} : { stackTrace }),\n };\n}\n\nfunction optionalNumericField(\n key: string,\n value: unknown,\n): Readonly<Record<string, number>> {\n const number = optionalNumber(value);\n return number === undefined ? {} : { [key]: number };\n}\n\nfunction optionalBooleanField(\n key: string,\n value: unknown,\n): Readonly<Record<string, boolean>> {\n const boolean = optionalBoolean(value);\n return boolean === undefined ? {} : { [key]: boolean };\n}\n\nfunction topFrameLocation(pause: PauseEvent): string {\n const top = pause.callFrames[0];\n if (top === undefined) {\n return \"(no call frame)\";\n }\n const url = top.url !== undefined && top.url.length > 0 ? top.url : \"(unknown)\";\n return `${url}:${(top.lineNumber + 1).toString()}:${(top.columnNumber + 1).toString()}`;\n}\n\nexport function pauseDetail(pause: PauseEvent): string {\n return JSON.stringify({\n reason: pause.reason,\n hitBreakpoints: pause.hitBreakpoints,\n topFrame: topFrameLocation(pause),\n });\n}\n","export const DEFAULT_BREAKPOINT_TIMEOUT_SEC = 30;\nexport const DEFAULT_CF_TIMEOUT_SEC = 180;\nexport const DEFAULT_EXCEPTION_TIMEOUT_SEC = 30;\n\nexport interface PortTarget {\n readonly kind: \"port\";\n readonly port: number;\n readonly host: string;\n readonly targetIndex?: number;\n readonly workerIndex?: number;\n readonly workerId?: string;\n readonly mainOnly?: boolean;\n}\n\nexport interface CfTarget {\n readonly kind: \"cf\";\n readonly region: string;\n readonly apiEndpoint?: string;\n readonly org: string;\n readonly space: string;\n readonly app: string;\n readonly tunnelTimeoutMs: number;\n readonly targetIndex?: number;\n readonly workerIndex?: number;\n readonly workerId?: string;\n readonly mainOnly?: boolean;\n}\n\nexport type Target = PortTarget | CfTarget;\n\nexport interface SharedTargetOptions {\n readonly port?: string;\n readonly host?: string;\n readonly region?: string;\n readonly apiEndpoint?: string;\n readonly org?: string;\n readonly space?: string;\n readonly app?: string;\n readonly timeout?: string;\n readonly target?: string;\n readonly worker?: string;\n readonly workerId?: string;\n readonly mainOnly?: boolean;\n}\n\nexport interface SnapshotCommandOptions extends SharedTargetOptions {\n readonly bp: readonly string[];\n readonly capture?: string;\n readonly setupEval?: readonly string[];\n readonly timeout?: string;\n readonly remoteRoot?: string;\n readonly condition?: string;\n readonly hitCount?: string;\n readonly stackDepth?: string;\n readonly stackCaptures?: string;\n readonly maxValueLength?: string;\n readonly json: boolean;\n readonly keepPaused?: boolean;\n readonly failOnUnmatchedPause?: boolean;\n readonly includeScopes?: boolean;\n readonly quiet?: boolean;\n readonly allowMutation?: boolean;\n readonly readyEvent?: boolean;\n}\n\nexport interface EvalCommandOptions extends SharedTargetOptions {\n readonly expr: string;\n readonly json: boolean;\n}\n\nexport interface ListScriptsCommandOptions extends SharedTargetOptions {\n readonly filter?: string;\n readonly json: boolean;\n}\n\nexport interface ListTargetsCommandOptions extends SharedTargetOptions {\n readonly json: boolean;\n}\n\nexport interface LogCommandOptions extends SharedTargetOptions {\n readonly at: string;\n readonly expr: string;\n readonly remoteRoot?: string;\n readonly duration?: string;\n readonly maxEvents?: string;\n readonly hitCount?: string;\n readonly condition?: string;\n readonly maxValueLength?: string;\n readonly json: boolean;\n readonly readyEvent?: boolean;\n}\n\nexport interface AttachCommandOptions extends SharedTargetOptions {\n readonly json: boolean;\n}\n\nexport interface WatchCommandOptions extends SharedTargetOptions {\n readonly bp: readonly string[];\n readonly capture?: string;\n readonly setupEval?: readonly string[];\n readonly condition?: string;\n readonly hitCount?: string;\n readonly remoteRoot?: string;\n readonly duration?: string;\n readonly maxEvents?: string;\n readonly timeout?: string;\n readonly maxValueLength?: string;\n readonly stackDepth?: string;\n readonly stackCaptures?: string;\n readonly includeScopes?: boolean;\n readonly json: boolean;\n readonly allowMutation?: boolean;\n readonly readyEvent?: boolean;\n}\n\nexport interface ExceptionCommandOptions extends SharedTargetOptions {\n readonly type?: string;\n readonly capture?: string;\n readonly stackDepth?: string;\n readonly stackCaptures?: string;\n readonly remoteRoot?: string;\n readonly timeout?: string;\n readonly maxValueLength?: string;\n readonly includeScopes?: boolean;\n readonly keepPaused?: boolean;\n readonly json: boolean;\n readonly allowMutation?: boolean;\n readonly readyEvent?: boolean;\n}\n\nexport interface CheckBreakpointCommandOptions extends SharedTargetOptions {\n readonly bp: string;\n readonly remoteRoot?: string;\n readonly json: boolean;\n}\n","import { execFileSync } from \"node:child_process\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport { constants } from \"node:fs\";\nimport { mkdir, open, readFile, readdir, stat, unlink, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nimport { CfInspectorError } from \"../types.js\";\n\nimport type { Target } from \"./commandTypes.js\";\n\nconst ELECTION_WINDOW_MS = 25;\nconst LOCK_FILE_SUFFIX = \".lock\";\n\ninterface SessionLockMetadata {\n readonly pid: number;\n readonly processStart?: string;\n readonly state: \"pending\" | \"owned\";\n readonly startedAt: string;\n readonly token: string;\n readonly target: string;\n}\n\nexport interface DebugSessionLock {\n readonly path: string;\n release(): Promise<void>;\n}\n\nexport interface DebugSessionLockOptions {\n readonly stateRoot?: string;\n readonly pid?: number;\n readonly now?: () => Date;\n readonly token?: () => string;\n readonly isProcessAlive?: (pid: number) => boolean;\n readonly getProcessStart?: (pid: number) => string | undefined;\n}\n\nexport async function acquireDebugSessionLock(\n target: Target,\n options: DebugSessionLockOptions = {},\n): Promise<DebugSessionLock> {\n const now = options.now ?? (() => new Date());\n const pid = options.pid ?? process.pid;\n const getProcessStart = options.getProcessStart ?? processStart;\n const ownerProcessStart = getProcessStart(pid);\n const token = options.token?.() ?? randomUUID();\n const targetIdentity = debugTargetIdentity(target);\n const key = createHash(\"sha256\").update(targetIdentity).digest(\"hex\");\n const lockRoot = options.stateRoot ?? defaultStateRoot();\n const lockDirectory = join(lockRoot, \"cf-inspector\", \"locks\");\n const ownPath = join(lockDirectory, `${key}.${pid.toString()}.${token}${LOCK_FILE_SUFFIX}`);\n const metadata: SessionLockMetadata = {\n pid,\n ...(ownerProcessStart === undefined ? {} : { processStart: ownerProcessStart }),\n state: \"pending\",\n startedAt: now().toISOString(),\n token,\n target: targetIdentity,\n };\n await mkdir(lockDirectory, { recursive: true, mode: 0o700 });\n const handle = await open(ownPath, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY, 0o600);\n try {\n await handle.writeFile(`${JSON.stringify(metadata)}\\n`, \"utf8\");\n } finally {\n await handle.close();\n }\n\n try {\n await new Promise<void>((resolve) => {\n setTimeout(resolve, ELECTION_WINDOW_MS);\n });\n const contenders = await findLiveContenders(\n lockDirectory,\n key,\n ownPath,\n options.isProcessAlive ?? processIsAlive,\n getProcessStart,\n );\n const owner = contenders.find((candidate) => candidate.state === \"owned\") ??\n contenders\n .filter((candidate) => candidate.state === \"pending\" && candidate.token < token)\n .sort((left, right) => left.token.localeCompare(right.token))[0];\n if (owner !== undefined) {\n throw alreadyDebuggedError(owner);\n }\n await writeLockMetadata(ownPath, { ...metadata, state: \"owned\" });\n } catch (error: unknown) {\n await unlink(ownPath).catch(() => {\n // Best-effort cleanup after a refused or failed acquisition.\n });\n throw error;\n }\n\n let released = false;\n return {\n path: ownPath,\n release: async (): Promise<void> => {\n if (released) {\n return;\n }\n released = true;\n const current = await readLockMetadata(ownPath);\n if (current?.token !== token || current.pid !== pid) {\n return;\n }\n await unlink(ownPath).catch((error: unknown) => {\n if (!isNodeError(error, \"ENOENT\")) {\n throw error;\n }\n });\n },\n };\n}\n\nexport function debugTargetIdentity(target: Target): string {\n const targetIndex = target.targetIndex ?? 0;\n if (target.kind === \"port\") {\n return JSON.stringify({\n kind: \"port\",\n host: normalizeHost(target.host),\n port: target.port,\n targetIndex,\n });\n }\n return JSON.stringify({\n kind: \"cf\",\n region: target.region,\n org: target.org,\n space: target.space,\n app: target.app,\n targetIndex,\n });\n}\n\nfunction defaultStateRoot(): string {\n const configured = process.env[\"CF_INSPECTOR_STATE_DIR\"]?.trim();\n return configured === undefined || configured.length === 0\n ? join(homedir(), \".saptools\")\n : configured;\n}\n\nasync function findLiveContenders(\n lockDirectory: string,\n key: string,\n ownPath: string,\n isProcessAlive: (pid: number) => boolean,\n getProcessStart: (pid: number) => string | undefined,\n): Promise<readonly SessionLockMetadata[]> {\n const prefix = `${key}.`;\n const names = await readdir(lockDirectory);\n const contenders: SessionLockMetadata[] = [];\n for (const name of names) {\n if (!name.startsWith(prefix) || !name.endsWith(LOCK_FILE_SUFFIX)) {\n continue;\n }\n const path = join(lockDirectory, name);\n if (path === ownPath) {\n continue;\n }\n const info = await stat(path).catch(() => {\n // The contender may have released between directory listing and stat.\n });\n const metadata = await readLockMetadata(path) ??\n (info === undefined ? undefined : metadataFromFilename(name, key, info.mtimeMs));\n if (metadata !== undefined) {\n if (ownerIsAlive(metadata, isProcessAlive, getProcessStart)) {\n contenders.push(metadata);\n } else {\n await unlink(path).catch(() => {\n // Another contender may already have reclaimed this stale file.\n });\n }\n continue;\n }\n if (info !== undefined) {\n contenders.push({\n pid: 0,\n state: \"owned\",\n startedAt: new Date(info.mtimeMs).toISOString(),\n token: \"unknown\",\n target: \"unknown\",\n });\n }\n }\n return contenders;\n}\n\nasync function readLockMetadata(path: string): Promise<SessionLockMetadata | undefined> {\n try {\n const parsed: unknown = JSON.parse(await readFile(path, \"utf8\"));\n if (!isRecord(parsed)) {\n return undefined;\n }\n const pid = parsed[\"pid\"];\n const processStart = parsed[\"processStart\"];\n const state = parsed[\"state\"];\n const startedAt = parsed[\"startedAt\"];\n const token = parsed[\"token\"];\n const target = parsed[\"target\"];\n if (\n typeof pid !== \"number\" || !Number.isSafeInteger(pid) || pid <= 0 ||\n (processStart !== undefined && typeof processStart !== \"string\") ||\n (state !== \"pending\" && state !== \"owned\") ||\n typeof startedAt !== \"string\" || Number.isNaN(Date.parse(startedAt)) ||\n typeof token !== \"string\" || token.length === 0 ||\n typeof target !== \"string\" || target.length === 0\n ) {\n return undefined;\n }\n return {\n pid,\n ...(typeof processStart === \"string\" ? { processStart } : {}),\n state,\n startedAt,\n token,\n target,\n };\n } catch {\n return undefined;\n }\n}\n\nasync function writeLockMetadata(path: string, metadata: SessionLockMetadata): Promise<void> {\n await writeFile(path, `${JSON.stringify(metadata)}\\n`, { encoding: \"utf8\", mode: 0o600 });\n}\n\nfunction metadataFromFilename(\n name: string,\n key: string,\n mtimeMs: number,\n): SessionLockMetadata | undefined {\n const match = new RegExp(`^${key}\\\\.(\\\\d+)\\\\.(.+)\\\\${LOCK_FILE_SUFFIX}$`, \"u\").exec(name);\n const rawPid = match?.[1];\n const token = match?.[2];\n if (rawPid === undefined || token === undefined || token.length === 0) {\n return undefined;\n }\n const pid = Number.parseInt(rawPid, 10);\n if (!Number.isSafeInteger(pid) || pid <= 0) {\n return undefined;\n }\n return {\n pid,\n state: \"owned\",\n startedAt: new Date(mtimeMs).toISOString(),\n token,\n target: \"unknown\",\n };\n}\n\nfunction ownerIsAlive(\n metadata: SessionLockMetadata,\n isProcessAlive: (pid: number) => boolean,\n getProcessStart: (pid: number) => string | undefined,\n): boolean {\n if (!isProcessAlive(metadata.pid)) {\n return false;\n }\n const currentStart = getProcessStart(metadata.pid);\n return metadata.processStart === undefined || currentStart === undefined ||\n metadata.processStart === currentStart;\n}\n\nfunction processIsAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n const status = processStatus(pid);\n return !status?.startsWith(\"Z\");\n } catch (error: unknown) {\n return isNodeError(error, \"EPERM\");\n }\n}\n\nfunction processStatus(pid: number): string | undefined {\n return runPs(pid, \"stat=\");\n}\n\nfunction processStart(pid: number): string | undefined {\n return runPs(pid, \"lstart=\");\n}\n\nfunction runPs(pid: number, field: string): string | undefined {\n try {\n const value = execFileSync(\"ps\", [\"-o\", field, \"-p\", pid.toString()], {\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n return value.length === 0 ? undefined : value;\n } catch {\n return undefined;\n }\n}\n\nfunction alreadyDebuggedError(owner: SessionLockMetadata): CfInspectorError {\n const ownerLabel = owner.pid > 0 ? `PID ${owner.pid.toString()}` : \"an unknown process\";\n return new CfInspectorError(\n \"TARGET_ALREADY_DEBUGGED\",\n `Another cf-inspector session (${ownerLabel}, started ${owner.startedAt}) is already actively debugging this target. Concurrent debugging sessions on the same isolate(s) can corrupt each other and disrupt real application traffic, so this attempt was refused rather than queued. Wait for the other session to finish, or confirm that it is gone before retrying; locks from dead processes are reclaimed automatically.`,\n );\n}\n\nfunction normalizeHost(host: string): string {\n const normalized = host.trim().toLowerCase();\n return normalized === \"localhost\" || normalized === \"::1\" ? \"127.0.0.1\" : normalized;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isNodeError(error: unknown, code: string): boolean {\n return error instanceof Error && \"code\" in error && error.code === code;\n}\n","import process from \"node:process\";\n\nimport type { InspectorSession } from \"../inspector/types.js\";\nimport { CfInspectorError } from \"../types.js\";\nimport type { BreakpointHandle, PauseEvent, SnapshotCaptureResult, SnapshotResult } from \"../types.js\";\n\nimport { looksLikeMutation } from \"./captureParser.js\";\n\nexport function warnOnCaptureMutationRisk(\n expressions: readonly string[],\n allowMutation: boolean,\n): void {\n const riskyCount = expressions.filter(looksLikeMutation).length;\n if (riskyCount === 0) {\n return;\n }\n const suffix = allowMutation\n ? \"will run without the V8 side-effect guard because --allow-mutation was passed.\"\n : \"will be checked by the V8 side-effect guard and blocked unless V8 proves them safe; pass --allow-mutation to run them unrestricted.\";\n process.stderr.write(\n `[cf-inspector] warning: ${riskyCount.toString()} capture ` +\n `${riskyCount === 1 ? \"expression looks\" : \"expressions look\"} mutation-capable and ${suffix}\\n`,\n );\n}\n\nexport function enforceNativeConditionMutationPolicy(\n expression: string,\n allowMutation: boolean,\n context: string,\n): void {\n if (!looksLikeMutation(expression)) {\n return;\n }\n if (!allowMutation) {\n throw new CfInspectorError(\n \"MUTATION_NOT_ALLOWED\",\n `${context} looks mutation-capable. Native breakpoint conditions cannot be protected by V8's side-effect guard; pass --allow-mutation to arm it explicitly.`,\n );\n }\n process.stderr.write(\n `[cf-inspector] warning: ${context} looks mutation-capable and will run as a native breakpoint condition; native conditions cannot be side-effect-gated.\\n`,\n );\n}\n\nexport function warnOnMutationRisk(expression: string, context: string): void {\n if (!looksLikeMutation(expression)) {\n return;\n }\n process.stderr.write(\n `[cf-inspector] warning: ${context} looks mutation-capable and will execute against the live inspectee without a side-effect guard.\\n`,\n );\n}\n\nexport function warnOnUnboundBreakpoints(handles: readonly BreakpointHandle[]): void {\n for (const handle of handles) {\n if (handle.resolvedLocations.length === 0) {\n const tsHint = handle.file.endsWith(\".ts\")\n ? \" Hint: Source TS breakpoints may not bind. Try inspecting loaded scripts with list-scripts and target the compiled .js file instead.\"\n : \"\";\n process.stderr.write(\n `[cf-inspector] warning: breakpoint ${handle.file}:${handle.line.toString()} ` +\n `did not bind to any loaded script. Check the path or pass --remote-root. ` +\n `Use 'list-scripts' to inspect what V8 currently has loaded.${tsHint}\\n`,\n );\n }\n }\n}\n\nexport function warnOnImplicitInspectorSelection(\n session: Pick<\n InspectorSession,\n \"targetCount\" | \"targetIndex\" | \"workerTargets\"\n >,\n targetWasExplicit: boolean,\n workerWasExplicit: boolean,\n): void {\n const targetCount = session.targetCount ?? 1;\n const targetIndex = session.targetIndex ?? 0;\n if (!targetWasExplicit && targetCount > 1) {\n process.stderr.write(\n `[cf-inspector] notice: attached to inspector target ${targetIndex.toString()} of ` +\n `${targetCount.toString()}; pass --target <index> to pick another.\\n`,\n );\n }\n const workerCount = session.workerTargets?.length ?? 0;\n if (!workerWasExplicit && workerCount > 0) {\n process.stderr.write(\n `[cf-inspector] notice: attached to the main isolate; ${workerCount.toString()} Node ` +\n `${workerCount === 1 ? \"worker is\" : \"workers are\"} available. ` +\n \"This command is single-isolate by nature; use --worker-id <id> to inspect one worker explicitly.\\n\",\n );\n }\n}\n\nexport function warnOnBoundBreakpointWithoutHit(handles: readonly BreakpointHandle[]): void {\n const boundCount = handles.reduce((count, handle) => {\n return count + handle.resolvedLocations.length;\n }, 0);\n if (boundCount === 0) {\n return;\n }\n process.stderr.write(\n `[cf-inspector] warning: ${boundCount.toString()} breakpoint ` +\n `${boundCount === 1 ? \"location bound\" : \"locations bound\"}, but no hit was observed. ` +\n \"No selected isolate executed the location before the command stopped. Check conditions, hit counts, request traffic, and use check-breakpoint to verify the exact line.\\n\",\n );\n}\n\nexport function roundDurationMs(durationMs: number): number {\n return Math.round(durationMs * 1000) / 1000;\n}\n\nexport function warnOnUnmatchedPause(pause: PauseEvent): void {\n const reason = pause.reason.length > 0 ? pause.reason : \"unknown\";\n process.stderr.write(\n `[cf-inspector] warning: target is paused by another debugger event ` +\n `(${reason} at ${formatPauseLocation(pause)}); waiting for it to resume...\\n`,\n );\n}\n\nexport function withPausedDuration(\n snapshot: SnapshotCaptureResult,\n pausedDurationMs: number | null,\n): SnapshotResult {\n const base: SnapshotResult = {\n reason: snapshot.reason,\n hitBreakpoints: snapshot.hitBreakpoints,\n capturedAt: snapshot.capturedAt,\n pausedDurationMs,\n captures: snapshot.captures,\n };\n const withFrame = snapshot.topFrame === undefined ? base : { ...base, topFrame: snapshot.topFrame };\n const withStack = snapshot.stack === undefined ? withFrame : { ...withFrame, stack: snapshot.stack };\n return snapshot.exception === undefined ? withStack : { ...withStack, exception: snapshot.exception };\n}\n\nfunction formatPauseLocation(pause: PauseEvent): string {\n const top = pause.callFrames[0];\n if (top === undefined) {\n return \"(no call frame)\";\n }\n const url = top.url !== undefined && top.url.length > 0 ? top.url : \"(unknown)\";\n return `${url}:${(top.lineNumber + 1).toString()}:${(top.columnNumber + 1).toString()}`;\n}\n","export function parseCaptureList(raw: string | undefined): readonly string[] {\n if (raw === undefined || raw.trim().length === 0) {\n return [];\n }\n return splitCaptureExpressions(raw);\n}\n\ntype QuoteChar = \"'\" | \"\\\"\" | \"`\";\n\ninterface QuoteScanState {\n quote: QuoteChar | undefined;\n escaped: boolean;\n}\n\ninterface CaptureSplitState extends QuoteScanState {\n parenDepth: number;\n bracketDepth: number;\n braceDepth: number;\n start: number;\n readonly pieces: string[];\n}\n\nfunction isQuoteChar(value: string): value is QuoteChar {\n return value === \"'\" || value === \"\\\"\" || value === \"`\";\n}\n\nfunction consumeQuotedChar(state: QuoteScanState, char: string): boolean {\n if (state.quote === undefined) {\n return false;\n }\n if (state.escaped) {\n state.escaped = false;\n return true;\n }\n if (char === \"\\\\\") {\n state.escaped = true;\n return true;\n }\n if (char === state.quote) {\n state.quote = undefined;\n }\n return true;\n}\n\nfunction stripQuotedText(expression: string): string {\n const state: QuoteScanState = { quote: undefined, escaped: false };\n let stripped = \"\";\n for (const char of expression) {\n if (consumeQuotedChar(state, char)) {\n stripped += \" \";\n continue;\n }\n if (isQuoteChar(char)) {\n state.quote = char;\n stripped += \" \";\n continue;\n }\n stripped += char;\n }\n return stripped;\n}\n\nexport function looksLikeMutation(expression: string): boolean {\n const stripped = stripQuotedText(expression);\n const hasUpdate = /(?:\\+\\+|--)/u.test(stripped);\n const hasAssignment = /(?:\\*\\*=|&&=|\\|\\|=|\\?\\?=|[+\\-*/%&|^]=|(?:^|[^=!<>])=(?!=|>))/u.test(stripped);\n const hasDelete = /\\bdelete\\b/u.test(stripped);\n const hasMutatingMethod = /\\.\\s*(?:push|pop|shift|unshift|splice|sort|reverse|fill|copyWithin|set|add|delete|clear)\\s*\\(/u.test(stripped);\n const hasObjectMutation = /\\bObject\\s*\\.\\s*(?:assign|defineProperty|defineProperties)\\s*\\(/u.test(stripped);\n return hasUpdate || hasAssignment || hasDelete || hasMutatingMethod || hasObjectMutation;\n}\n\nfunction updateCaptureDepth(state: CaptureSplitState, char: string): void {\n if (char === \"(\") {\n state.parenDepth += 1;\n } else if (char === \")\") {\n state.parenDepth = Math.max(0, state.parenDepth - 1);\n } else if (char === \"[\") {\n state.bracketDepth += 1;\n } else if (char === \"]\") {\n state.bracketDepth = Math.max(0, state.bracketDepth - 1);\n } else if (char === \"{\") {\n state.braceDepth += 1;\n } else if (char === \"}\") {\n state.braceDepth = Math.max(0, state.braceDepth - 1);\n }\n}\n\nfunction isTopLevel(state: CaptureSplitState): boolean {\n return state.parenDepth === 0 && state.bracketDepth === 0 && state.braceDepth === 0;\n}\n\nfunction appendCapturePiece(raw: string, state: CaptureSplitState, end: number): void {\n const piece = raw.slice(state.start, end).trim();\n if (piece.length > 0) {\n state.pieces.push(piece);\n }\n}\n\nfunction splitCaptureExpressions(raw: string): readonly string[] {\n const state: CaptureSplitState = {\n escaped: false,\n parenDepth: 0,\n bracketDepth: 0,\n braceDepth: 0,\n quote: undefined,\n start: 0,\n pieces: [],\n };\n for (let idx = 0; idx < raw.length; idx += 1) {\n const char = raw.charAt(idx);\n if (consumeQuotedChar(state, char)) {\n continue;\n }\n if (isQuoteChar(char)) {\n state.quote = char;\n continue;\n }\n updateCaptureDepth(state, char);\n if (char === \",\" && isTopLevel(state)) {\n appendCapturePiece(raw, state, idx);\n state.start = idx + 1;\n }\n }\n appendCapturePiece(raw, state, raw.length);\n return state.pieces;\n}\n","import process from \"node:process\";\n\nimport { getPossibleBreakpoints } from \"../../inspector/breakpoints.js\";\nimport type { InspectorSession } from \"../../inspector/types.js\";\nimport { buildBreakpointUrlRegex, parseBreakpointSpec, parseRemoteRoot } from \"../../pathMapper.js\";\nimport type { BreakLocation, InspectorIsolate } from \"../../types.js\";\nimport type { CheckBreakpointCommandOptions } from \"../commandTypes.js\";\nimport { writeJson } from \"../output.js\";\nimport { resolveTargetWithCurrentCfTarget, withSessions } from \"../target.js\";\n\ninterface ScriptBreakpointCheck {\n readonly isolate: InspectorIsolate;\n readonly scriptId: string;\n readonly url: string;\n readonly locations: readonly BreakLocation[];\n}\n\ninterface BreakpointCheckResult {\n readonly file: string;\n readonly line: number;\n readonly status: \"breakable\" | \"unbreakable\" | \"script-not-loaded\";\n readonly scripts: readonly ScriptBreakpointCheck[];\n}\n\nexport async function handleCheckBreakpoint(\n opts: CheckBreakpointCommandOptions,\n): Promise<void> {\n const target = await resolveTargetWithCurrentCfTarget(opts);\n const location = parseBreakpointSpec(opts.bp);\n const remoteRoot = parseRemoteRoot(opts.remoteRoot);\n const urlRegex = buildBreakpointUrlRegex({ file: location.file, remoteRoot });\n const matcher = new RegExp(urlRegex, \"u\");\n const result = await withSessions(target, async (group): Promise<BreakpointCheckResult> => {\n const checks = (await Promise.all(group.list().map(async (session) =>\n await checkSession(session, matcher, location.line))))\n .flat();\n const status = checks.length === 0\n ? \"script-not-loaded\"\n : (checks.some((check) => check.locations.length > 0) ? \"breakable\" : \"unbreakable\");\n return { file: location.file, line: location.line, status, scripts: checks };\n });\n if (opts.json) {\n writeJson(result);\n return;\n }\n writeHumanCheck(result);\n}\n\nasync function checkSession(\n session: InspectorSession,\n matcher: RegExp,\n requestedLine: number,\n): Promise<readonly ScriptBreakpointCheck[]> {\n const zeroBasedLine = requestedLine - 1;\n const scripts = [...session.scripts.values()].filter((script) => matcher.test(script.url));\n return await Promise.all(scripts.map(async (script): Promise<ScriptBreakpointCheck> => {\n const locations = await getPossibleBreakpoints(session, {\n start: { scriptId: script.scriptId, lineNumber: zeroBasedLine, columnNumber: 0 },\n end: { scriptId: script.scriptId, lineNumber: zeroBasedLine + 1, columnNumber: 0 },\n });\n return {\n isolate: session.isolate ?? { kind: \"main\" },\n scriptId: script.scriptId,\n url: script.url,\n locations: locations.filter((candidate) => candidate.lineNumber === zeroBasedLine),\n };\n }));\n}\n\nfunction writeHumanCheck(result: BreakpointCheckResult): void {\n if (result.status === \"script-not-loaded\") {\n process.stdout.write(\n `${result.file}:${result.line.toString()} does not match any loaded script. ` +\n \"Run list-scripts and check --remote-root/path mapping, or trigger lazy module loading first.\\n\",\n );\n return;\n }\n if (result.status === \"unbreakable\") {\n process.stdout.write(\n `${result.file}:${result.line.toString()} matches a loaded script, but this exact line has no breakable location. Try a neighboring executable line.\\n`,\n );\n return;\n }\n process.stdout.write(`${result.file}:${result.line.toString()} is breakable:\\n`);\n for (const script of result.scripts) {\n for (const location of script.locations) {\n const isolate = script.isolate.kind === \"main\" ? \"main\" : `worker ${script.isolate.workerId}`;\n process.stdout.write(\n ` ${isolate}\\t${script.url}\\tline ${(location.lineNumber + 1).toString()}:` +\n `${((location.columnNumber ?? 0) + 1).toString()}\\n`,\n );\n }\n }\n}\n\nexport const internalsForTesting = { checkSession };\n","import { CfInspectorError } from \"./types.js\";\nimport type { BreakpointLocation, RemoteRootSetting } from \"./types.js\";\n\nconst REGEX_PREFIX = \"regex:\";\n// cspell:ignore dgimsuvy\nconst REGEX_FLAGS_PATTERN = /^[dgimsuvy]*$/;\nconst TS_JS_EXT_PATTERN = /\\.(?:ts|js|mts|mjs|cts|cjs)$/i;\n\nexport function parseBreakpointSpec(input: string): BreakpointLocation {\n const idx = input.lastIndexOf(\":\");\n if (idx <= 0 || idx === input.length - 1) {\n throw new CfInspectorError(\n \"INVALID_BREAKPOINT\",\n `Breakpoint must be in 'file:line' form, received: \"${input}\"`,\n );\n }\n const file = input.slice(0, idx).trim();\n const lineRaw = input.slice(idx + 1).trim();\n const line = Number.parseInt(lineRaw, 10);\n if (!Number.isInteger(line) || line <= 0 || line.toString() !== lineRaw) {\n throw new CfInspectorError(\n \"INVALID_BREAKPOINT\",\n `Breakpoint line must be a positive integer, received: \"${lineRaw}\"`,\n );\n }\n if (file.length === 0) {\n throw new CfInspectorError(\n \"INVALID_BREAKPOINT\",\n `Breakpoint file path is empty in \"${input}\"`,\n );\n }\n return { file, line };\n}\n\nexport function parseRemoteRoot(value: string | undefined): RemoteRootSetting {\n const trimmed = value?.trim();\n if (trimmed === undefined || trimmed.length === 0) {\n return { kind: \"none\" };\n }\n if (trimmed.startsWith(REGEX_PREFIX)) {\n return toRegex(trimmed.slice(REGEX_PREFIX.length), \"\");\n }\n const slashRegex = parseSlashDelimited(trimmed);\n if (slashRegex !== undefined) {\n return toRegex(slashRegex.pattern, slashRegex.flags);\n }\n return { kind: \"literal\", value: stripTrailingSlash(trimmed) };\n}\n\nfunction toRegex(pattern: string, flags: string): RemoteRootSetting {\n return { kind: \"regex\", pattern, flags };\n}\n\nfunction parseSlashDelimited(value: string): { pattern: string; flags: string } | undefined {\n if (!value.startsWith(\"/\")) {\n return undefined;\n }\n const closing = findLastUnescapedSlash(value);\n if (closing <= 0) {\n return undefined;\n }\n const flags = value.slice(closing + 1);\n // Disambiguate with literal paths: a path like \"/home/vcap/app/\" would parse\n // as `/<pattern>/` with empty flags. We require non-empty flags for the\n // slash-delimited form; flagless regexes must use the explicit \"regex:\" prefix.\n if (flags.length === 0 || !REGEX_FLAGS_PATTERN.test(flags)) {\n return undefined;\n }\n return { pattern: value.slice(1, closing), flags };\n}\n\nfunction findLastUnescapedSlash(value: string): number {\n for (let i = value.length - 1; i > 0; i--) {\n if (value[i] === \"/\" && !isEscaped(value, i)) {\n return i;\n }\n }\n return -1;\n}\n\nfunction isEscaped(value: string, idx: number): boolean {\n let backslashes = 0;\n for (let i = idx - 1; i >= 0; i--) {\n if (value[i] === \"\\\\\") {\n backslashes++;\n } else {\n break;\n }\n }\n return backslashes % 2 === 1;\n}\n\nfunction stripTrailingSlash(value: string): string {\n if (value.length > 1 && value.endsWith(\"/\")) {\n return value.slice(0, -1);\n }\n return value;\n}\n\nfunction normalizeRegexRootPattern(pattern: string): string {\n const withoutStartAnchor = pattern.startsWith(\"^\") ? pattern.slice(1) : pattern;\n const withoutEndAnchor =\n withoutStartAnchor.endsWith(\"$\") && !isEscaped(withoutStartAnchor, withoutStartAnchor.length - 1)\n ? withoutStartAnchor.slice(0, -1)\n : withoutStartAnchor;\n return stripTrailingSlash(withoutEndAnchor);\n}\n\nfunction buildFileUrlRegex(embeddedRoot: string, tail: string, separator: \"\" | \"/\"): string {\n return `^file://${embeddedRoot}${separator}${tail}$`;\n}\n\nfunction rootSeparator(rawPattern: string): \"\" | \"/\" {\n return rawPattern.endsWith(\"/\") ? \"\" : \"/\";\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replaceAll(/[.*+?^${}()|[\\]\\\\]/g, String.raw`\\$&`);\n}\n\nfunction normalizeRelative(file: string): string {\n return file.replaceAll(/^[./\\\\]+/g, \"\").replaceAll(\"\\\\\", \"/\");\n}\n\nfunction dropExtension(file: string): { stem: string; matchedExt: boolean } {\n const match = TS_JS_EXT_PATTERN.exec(file);\n if (!match) {\n return { stem: file, matchedExt: false };\n }\n return { stem: file.slice(0, match.index), matchedExt: true };\n}\n\nconst EXT_GROUP = String.raw`\\.(?:ts|js|mts|mjs|cts|cjs)`;\nconst OPTIONAL_EXT_GROUP = String.raw`(?:\\.(?:ts|js|mts|mjs|cts|cjs))?`;\n\nexport interface BuildUrlRegexInput {\n readonly file: string;\n readonly remoteRoot: RemoteRootSetting;\n}\n\nexport function buildBreakpointUrlRegex(input: BuildUrlRegexInput): string {\n const normalized = normalizeRelative(input.file);\n const { stem, matchedExt } = dropExtension(normalized);\n const escapedStem = escapeRegExp(stem);\n const tail = matchedExt ? `${escapedStem}${EXT_GROUP}` : `${escapedStem}${OPTIONAL_EXT_GROUP}`;\n\n switch (input.remoteRoot.kind) {\n case \"none\": {\n return `(?:^|/)${tail}$`;\n }\n case \"literal\": {\n const root = input.remoteRoot.value;\n return buildFileUrlRegex(escapeRegExp(root), tail, rootSeparator(root));\n }\n case \"regex\": {\n const root = normalizeRegexRootPattern(input.remoteRoot.pattern);\n // Wrap the user pattern in a non-capturing group so alternation in the\n // user's regex (e.g. `regex:a|b`) does not bind to the surrounding\n // `^file://` / tail. Without this, the engine would parse the result as\n // `(^file://a)|(b/.../src/...$)`.\n return buildFileUrlRegex(`(?:${root})`, tail, rootSeparator(root));\n }\n }\n}\n","import { buildBreakpointUrlRegex } from \"../pathMapper.js\";\nimport { CfInspectorError } from \"../types.js\";\nimport type {\n BreakLocation,\n BreakpointHandle,\n ExactBreakpointHandle,\n GetPossibleBreakpointsOptions,\n RemoteRootSetting,\n ScriptLocation,\n SetBreakpointAtLocationInput,\n} from \"../types.js\";\n\nimport {\n asString,\n toBreakLocations,\n toResolvedLocations,\n toScriptLocation,\n} from \"./conversions.js\";\nimport type {\n CdpPossibleBreakpointsResult,\n CdpSetBreakpointResult,\n CdpSetExactBreakpointResult,\n InspectorSession,\n SetBreakpointInput,\n} from \"./types.js\";\n\nconst HITS_GLOBAL = \"globalThis.__CFI_HITS\";\nlet counterKeyCounter = 0;\n\nfunction nextCounterKey(file: string, line: number): string {\n counterKeyCounter += 1;\n return `${file}:${line.toString()}:${counterKeyCounter.toString()}`;\n}\n\nfunction validateHitCount(hitCount: number | undefined): number | undefined {\n if (hitCount === undefined) {\n return undefined;\n }\n if (!Number.isInteger(hitCount) || hitCount <= 0) {\n throw new CfInspectorError(\n \"INVALID_HIT_COUNT\",\n `hitCount must be a positive integer, received: ${hitCount.toString()}`,\n );\n }\n return hitCount;\n}\n\nexport function buildHitCountedCondition(\n hitCount: number,\n counterKey: string,\n userCondition: string | undefined,\n): string {\n const keyLiteral = JSON.stringify(counterKey);\n const baseCondition = userCondition !== undefined && userCondition.trim().length > 0\n ? `(${userCondition})`\n : \"true\";\n return [\n \"(function(){\",\n `var m=(${HITS_GLOBAL}=${HITS_GLOBAL}||{});`,\n `var k=${keyLiteral};`,\n \"m[k]=(m[k]||0)+1;\",\n `if(m[k]<${hitCount.toString()})return false;`,\n `return ${baseCondition};`,\n \"})()\",\n ].join(\"\");\n}\n\nfunction resolveCondition(\n input: SetBreakpointInput,\n): string | undefined {\n const condition = input.condition;\n const hitCount = validateHitCount(input.hitCount);\n if (hitCount === undefined) {\n return condition !== undefined && condition.length > 0 ? condition : undefined;\n }\n const counterKey = nextCounterKey(input.file, input.line);\n return buildHitCountedCondition(hitCount, counterKey, condition);\n}\n\nexport async function setBreakpoint(\n session: InspectorSession,\n input: SetBreakpointInput,\n): Promise<BreakpointHandle> {\n const remoteRoot: RemoteRootSetting = input.remoteRoot ?? { kind: \"none\" };\n const urlRegex = buildBreakpointUrlRegex({ file: input.file, remoteRoot });\n const params: Record<string, unknown> = {\n lineNumber: input.line - 1,\n urlRegex,\n };\n const condition = resolveCondition(input);\n if (condition !== undefined) {\n params[\"condition\"] = condition;\n }\n const result = await session.client.send<CdpSetBreakpointResult>(\n \"Debugger.setBreakpointByUrl\",\n params,\n );\n const breakpointId = asString(result.breakpointId);\n if (breakpointId.length === 0) {\n throw new CfInspectorError(\n \"CDP_REQUEST_FAILED\",\n `setBreakpointByUrl did not return a breakpointId for ${input.file}:${input.line.toString()}`,\n );\n }\n return {\n breakpointId,\n file: input.file,\n line: input.line,\n urlRegex,\n resolvedLocations: toResolvedLocations(result.locations),\n };\n}\n\nexport async function removeBreakpoint(\n session: InspectorSession,\n breakpointId: string,\n): Promise<void> {\n await session.client.send(\"Debugger.removeBreakpoint\", { breakpointId });\n}\n\nfunction validateCoordinate(value: number, label: string): void {\n if (!Number.isInteger(value) || value < 0) {\n throw new CfInspectorError(\n \"INVALID_ARGUMENT\",\n `${label} must be a non-negative integer, received: ${value.toString()}`,\n );\n }\n}\n\nfunction validateScriptLocation(location: ScriptLocation, label: string): void {\n if (location.scriptId.trim().length === 0) {\n throw new CfInspectorError(\"INVALID_ARGUMENT\", `${label}.scriptId must not be empty`);\n }\n validateCoordinate(location.lineNumber, `${label}.lineNumber`);\n if (location.columnNumber !== undefined) {\n validateCoordinate(location.columnNumber, `${label}.columnNumber`);\n }\n}\n\nfunction isSameScriptLocation(\n requested: ScriptLocation,\n actual: ScriptLocation,\n): boolean {\n return requested.scriptId === actual.scriptId\n && requested.lineNumber === actual.lineNumber\n && (requested.columnNumber ?? 0) === (actual.columnNumber ?? 0);\n}\n\nexport async function getPossibleBreakpoints(\n session: InspectorSession,\n options: GetPossibleBreakpointsOptions,\n): Promise<readonly BreakLocation[]> {\n validateScriptLocation(options.start, \"start\");\n if (options.end !== undefined) {\n validateScriptLocation(options.end, \"end\");\n if (options.end.scriptId !== options.start.scriptId) {\n throw new CfInspectorError(\"INVALID_ARGUMENT\", \"start and end must refer to the same scriptId\");\n }\n }\n const result = await session.client.send<CdpPossibleBreakpointsResult>(\n \"Debugger.getPossibleBreakpoints\",\n {\n start: options.start,\n ...(options.end === undefined ? {} : { end: options.end }),\n ...(options.restrictToFunction === undefined\n ? {}\n : { restrictToFunction: options.restrictToFunction }),\n },\n );\n if (!Array.isArray(result.locations)) {\n throw new CfInspectorError(\n \"CDP_REQUEST_FAILED\",\n \"Debugger.getPossibleBreakpoints did not return a locations array\",\n );\n }\n return toBreakLocations(result.locations);\n}\n\nexport async function setBreakpointAtLocation(\n session: InspectorSession,\n input: SetBreakpointAtLocationInput,\n): Promise<ExactBreakpointHandle> {\n validateScriptLocation(input.location, \"location\");\n const result = await session.client.send<CdpSetExactBreakpointResult>(\"Debugger.setBreakpoint\", {\n location: input.location,\n ...(input.condition === undefined || input.condition.length === 0\n ? {}\n : { condition: input.condition }),\n });\n const breakpointId = asString(result.breakpointId);\n const actualLocation = toScriptLocation(result.actualLocation);\n const wrongLocation = actualLocation !== undefined\n && !isSameScriptLocation(input.location, actualLocation);\n if (breakpointId.length === 0 || actualLocation === undefined || wrongLocation) {\n if (breakpointId.length > 0) {\n try {\n await removeBreakpoint(session, breakpointId);\n } catch {\n // The invalid binding is already unusable; preserve the validation failure.\n }\n }\n if (wrongLocation) {\n throw new CfInspectorError(\n \"INVALID_BREAKPOINT\",\n \"Debugger.setBreakpoint resolved the breakpoint at a different script, line, or column\",\n );\n }\n throw new CfInspectorError(\n \"CDP_REQUEST_FAILED\",\n \"Debugger.setBreakpoint did not return a breakpointId and actualLocation\",\n );\n }\n return {\n breakpointId,\n requestedLocation: input.location,\n actualLocation,\n };\n}\n","import process from \"node:process\";\n\nimport { evaluateGlobal } from \"../../inspector/runtime.js\";\nimport type { EvalCommandOptions } from \"../commandTypes.js\";\nimport { writeJson } from \"../output.js\";\nimport { resolveTargetWithCurrentCfTarget, withSession } from \"../target.js\";\nimport { warnOnMutationRisk } from \"../warnings.js\";\n\nexport async function handleEval(opts: EvalCommandOptions): Promise<void> {\n warnOnMutationRisk(opts.expr, \"eval --expr\");\n const target = await resolveTargetWithCurrentCfTarget(opts);\n const result = await withSession(target, async (session) => {\n return await evaluateGlobal(session, opts.expr);\n });\n if (opts.json) {\n writeJson(result);\n if (result.exceptionDetails !== undefined) {\n process.exitCode = 1;\n }\n return;\n }\n writeHumanEvalResult(result);\n}\n\nfunction writeHumanEvalResult(result: Awaited<ReturnType<typeof evaluateGlobal>>): void {\n if (result.exceptionDetails !== undefined) {\n const detail =\n typeof result.exceptionDetails.exception?.description === \"string\"\n ? result.exceptionDetails.exception.description\n : (typeof result.exceptionDetails.text === \"string\" ? result.exceptionDetails.text : \"evaluation failed\");\n process.stderr.write(`${detail}\\n`);\n process.exitCode = 1;\n return;\n }\n const inner = result.result;\n if (inner === undefined) {\n process.stdout.write(\"\\n\");\n return;\n }\n if (typeof inner.value === \"string\") {\n process.stdout.write(`${inner.value}\\n`);\n return;\n }\n if (typeof inner.description === \"string\") {\n process.stdout.write(`${inner.description}\\n`);\n return;\n }\n process.stdout.write(`${JSON.stringify(inner.value)}\\n`);\n}\n","import { CfInspectorError } from \"../types.js\";\nimport type { ScriptInfo } from \"../types.js\";\n\nimport type { CdpEvalResult, CdpProperty, InspectorSession } from \"./types.js\";\n\nexport type PauseOnExceptionsState = \"none\" | \"uncaught\" | \"caught\" | \"all\";\n\nexport interface EvaluateOnFrameOptions {\n readonly throwOnSideEffect?: boolean;\n readonly objectGroup?: string;\n}\n\nexport interface StepIntoOptions {\n readonly breakOnAsyncCall?: boolean;\n}\n\nexport async function resume(session: InspectorSession): Promise<void> {\n await session.client.send(\"Debugger.resume\");\n session.debuggerState.paused = false;\n delete session.debuggerState.currentPause;\n}\n\nexport async function setPauseOnExceptions(\n session: InspectorSession,\n state: PauseOnExceptionsState,\n): Promise<void> {\n await session.client.send(\"Debugger.setPauseOnExceptions\", { state });\n}\n\nexport async function setAsyncCallStackDepth(\n session: InspectorSession,\n maxDepth: number,\n): Promise<void> {\n await session.client.send(\"Debugger.setAsyncCallStackDepth\", { maxDepth });\n}\n\nexport async function evaluateOnFrame(\n session: InspectorSession,\n callFrameId: string,\n expression: string,\n options: EvaluateOnFrameOptions = {},\n): Promise<CdpEvalResult> {\n return await session.client.send<CdpEvalResult>(\"Debugger.evaluateOnCallFrame\", {\n callFrameId,\n expression,\n returnByValue: false,\n generatePreview: true,\n silent: true,\n ...(options.throwOnSideEffect === undefined\n ? {}\n : { throwOnSideEffect: options.throwOnSideEffect }),\n ...(options.objectGroup === undefined ? {} : { objectGroup: options.objectGroup }),\n });\n}\n\nexport function isSideEffectRefusal(result: CdpEvalResult): boolean {\n const classNames = [\n result.result?.className,\n result.exceptionDetails?.exception?.className,\n ];\n const descriptions = [\n result.result?.description,\n result.exceptionDetails?.exception?.description,\n ];\n const isEvalError = classNames.includes(\"EvalError\");\n return isEvalError && descriptions.some(\n (description) =>\n typeof description === \"string\" &&\n description.toLowerCase().includes(\"possible side-effect in debug-evaluate\"),\n );\n}\n\nexport async function evaluateGlobal(\n session: InspectorSession,\n expression: string,\n): Promise<CdpEvalResult> {\n return await session.client.send<CdpEvalResult>(\"Runtime.evaluate\", {\n expression,\n returnByValue: false,\n generatePreview: true,\n silent: true,\n });\n}\n\nexport async function runSetupEvals(\n session: InspectorSession,\n expressions: readonly string[],\n): Promise<void> {\n for (const expression of expressions) {\n const result = await evaluateGlobal(session, expression);\n if (result.exceptionDetails !== undefined) {\n throw new CfInspectorError(\n \"SETUP_EVAL_FAILED\",\n exceptionDetailsMessage(result, \"setup evaluation failed\"),\n );\n }\n }\n}\n\nfunction exceptionDetailsMessage(result: CdpEvalResult, fallback: string): string {\n return typeof result.exceptionDetails?.exception?.description === \"string\"\n ? result.exceptionDetails.exception.description\n : (typeof result.exceptionDetails?.text === \"string\"\n ? result.exceptionDetails.text\n : fallback);\n}\n\nexport function listScripts(session: InspectorSession): readonly ScriptInfo[] {\n return [...session.scripts.values()];\n}\n\ninterface CdpCompileResult {\n scriptId?: unknown;\n exceptionDetails?: { text?: unknown; exception?: { description?: unknown } };\n}\n\nexport async function validateExpression(\n session: InspectorSession,\n expression: string,\n): Promise<void> {\n const result = await session.client.send<CdpCompileResult>(\"Runtime.compileScript\", {\n expression,\n sourceURL: \"<cf-inspector-validate>\",\n persistScript: false,\n });\n if (result.exceptionDetails === undefined) {\n return;\n }\n const description =\n typeof result.exceptionDetails.exception?.description === \"string\"\n ? result.exceptionDetails.exception.description\n : (typeof result.exceptionDetails.text === \"string\"\n ? result.exceptionDetails.text\n : \"expression failed to compile\");\n throw new CfInspectorError(\"INVALID_EXPRESSION\", description);\n}\n\nexport async function getProperties(\n session: InspectorSession,\n objectId: string,\n): Promise<readonly CdpProperty[]> {\n const result = await session.client.send<{ result?: unknown }>(\"Runtime.getProperties\", {\n objectId,\n ownProperties: true,\n accessorPropertiesOnly: false,\n generatePreview: true,\n });\n if (!Array.isArray(result.result)) {\n return [];\n }\n return result.result as readonly CdpProperty[];\n}\n\nexport async function getScriptSource(\n session: InspectorSession,\n scriptId: string,\n): Promise<string> {\n if (scriptId.trim().length === 0) {\n throw new CfInspectorError(\"INVALID_ARGUMENT\", \"scriptId must not be empty\");\n }\n const result = await session.client.send<{ readonly scriptSource?: unknown }>(\n \"Debugger.getScriptSource\",\n { scriptId },\n );\n if (typeof result.scriptSource !== \"string\") {\n throw new CfInspectorError(\n \"CDP_REQUEST_FAILED\",\n \"Debugger.getScriptSource did not return scriptSource\",\n );\n }\n return result.scriptSource;\n}\n\nexport async function stepInto(\n session: InspectorSession,\n options: StepIntoOptions = {},\n): Promise<void> {\n await session.client.send(\"Debugger.stepInto\", {\n ...(options.breakOnAsyncCall === undefined\n ? {}\n : { breakOnAsyncCall: options.breakOnAsyncCall }),\n });\n}\n\nexport async function stepOver(session: InspectorSession): Promise<void> {\n await session.client.send(\"Debugger.stepOver\");\n}\n\nexport async function stepOut(session: InspectorSession): Promise<void> {\n await session.client.send(\"Debugger.stepOut\");\n}\n\nexport async function releaseObject(\n session: InspectorSession,\n objectId: string,\n): Promise<void> {\n await session.client.send(\"Runtime.releaseObject\", { objectId });\n}\n\nexport async function releaseObjectGroup(\n session: InspectorSession,\n objectGroup: string,\n): Promise<void> {\n await session.client.send(\"Runtime.releaseObjectGroup\", { objectGroup });\n}\n\nexport type { CdpEvalResult, CdpProperty } from \"./types.js\";\n","import { performance } from \"node:perf_hooks\";\nimport process from \"node:process\";\n\nimport {\n BreakpointFanout,\n resume,\n setPauseOnExceptions,\n} from \"../../inspector/index.js\";\nimport type { InspectorSession, PauseOnExceptionsState } from \"../../inspector/index.js\";\nimport { parseRemoteRoot } from \"../../pathMapper.js\";\nimport { captureSnapshot } from \"../../snapshot/capture.js\";\nimport { DEFAULT_MAX_VALUE_LENGTH } from \"../../snapshot/values.js\";\nimport { CfInspectorError } from \"../../types.js\";\nimport type { RemoteRootSetting, SnapshotResult } from \"../../types.js\";\nimport { parseCaptureList } from \"../captureParser.js\";\nimport { DEFAULT_EXCEPTION_TIMEOUT_SEC } from \"../commandTypes.js\";\nimport type { ExceptionCommandOptions, Target } from \"../commandTypes.js\";\nimport { writeArmedEvent, writeHumanSnapshot, writeJson } from \"../output.js\";\nimport { withTerminationSignal } from \"../signals.js\";\nimport { parsePositiveInt, resolveTargetWithCurrentCfTarget, withSessions } from \"../target.js\";\nimport { roundDurationMs, warnOnCaptureMutationRisk, withPausedDuration } from \"../warnings.js\";\n\nconst VALID_PAUSE_TYPES: readonly PauseOnExceptionsState[] = [\"uncaught\", \"caught\", \"all\"];\n\ninterface PreparedExceptionCommand {\n readonly target: Target;\n readonly state: PauseOnExceptionsState;\n readonly captures: readonly string[];\n readonly remoteRoot: RemoteRootSetting;\n readonly timeoutMs: number;\n readonly maxValueLength: number;\n readonly stackDepth?: number;\n readonly stackCaptures: readonly string[];\n readonly throwOnSideEffect: boolean;\n}\n\nexport async function handleException(opts: ExceptionCommandOptions): Promise<void> {\n const target = await resolveTargetWithCurrentCfTarget(opts, { useTimeoutForTunnel: false });\n const prepared = prepareExceptionCommand(opts, target);\n warnOnCaptureMutationRisk(\n [...prepared.captures, ...prepared.stackCaptures],\n opts.allowMutation === true,\n );\n const result = await withTerminationSignal(async (signal) =>\n await runExceptionCommand(prepared, opts, signal));\n if (opts.json) {\n writeJson(result);\n } else {\n writeHumanSnapshot(result);\n }\n}\n\nfunction prepareExceptionCommand(opts: ExceptionCommandOptions, target: Target): PreparedExceptionCommand {\n const stateRaw = (opts.type ?? \"uncaught\").trim().toLowerCase();\n if (!VALID_PAUSE_TYPES.includes(stateRaw as PauseOnExceptionsState)) {\n throw new CfInspectorError(\n \"INVALID_PAUSE_TYPE\",\n `--type must be one of ${VALID_PAUSE_TYPES.join(\", \")} (received \"${stateRaw}\")`,\n );\n }\n const timeoutSec = parsePositiveInt(opts.timeout, \"--timeout\") ?? DEFAULT_EXCEPTION_TIMEOUT_SEC;\n const maxValueLength = parsePositiveInt(opts.maxValueLength, \"--max-value-length\")\n ?? DEFAULT_MAX_VALUE_LENGTH;\n const stackDepth = parsePositiveInt(opts.stackDepth, \"--stack-depth\");\n return {\n target,\n state: stateRaw as PauseOnExceptionsState,\n captures: parseCaptureList(opts.capture),\n remoteRoot: parseRemoteRoot(opts.remoteRoot),\n timeoutMs: timeoutSec * 1000,\n maxValueLength,\n ...(stackDepth === undefined ? {} : { stackDepth }),\n stackCaptures: parseCaptureList(opts.stackCaptures),\n throwOnSideEffect: opts.allowMutation !== true,\n };\n}\n\nasync function runExceptionCommand(\n command: PreparedExceptionCommand,\n opts: ExceptionCommandOptions,\n signal?: AbortSignal,\n): Promise<SnapshotResult> {\n return await withSessions(command.target, async (group): Promise<SnapshotResult> => {\n const fanout = new BreakpointFanout(group, async (session) => {\n await setPauseOnExceptions(session, command.state);\n return { handles: [] };\n }, [\"exception\", \"promiseRejection\"]);\n let winner: InspectorSession | undefined;\n let preserveWinner = false;\n try {\n await fanout.ready(opts.readyEvent === true\n ? {\n includeNewSessions: true,\n onReady: (outcomes) => {\n if (signal?.aborted === true) {\n return;\n }\n writeArmedEvent({\n command: \"exception\",\n sessions: outcomes.length,\n resolvedLocations: null,\n timeoutMs: command.timeoutMs,\n });\n },\n }\n : {});\n const hit = await fanout.waitForFirst(command.timeoutMs, {\n pauseReasons: [\"exception\", \"promiseRejection\"],\n unmatchedPausePolicy: \"wait-for-resume\",\n }, signal);\n winner = hit.session;\n const pause = hit.pause;\n const pausedStartedAt = pause.receivedAtMs ?? performance.now();\n const snapshot = await captureSnapshot(hit.session, pause, {\n captures: command.captures,\n includeScopes: opts.includeScopes === true,\n maxValueLength: command.maxValueLength,\n ...(command.stackDepth === undefined ? {} : { stackDepth: command.stackDepth }),\n stackCaptures: command.stackCaptures,\n throwOnSideEffect: command.throwOnSideEffect,\n });\n if (opts.keepPaused === true) {\n preserveWinner = true;\n return { ...withPausedDuration(snapshot, null), isolate: hit.session.isolate ?? { kind: \"main\" } };\n }\n const result = await resumeAfterException(hit.session, snapshot, pausedStartedAt);\n return { ...result, isolate: hit.session.isolate ?? { kind: \"main\" } };\n } finally {\n await Promise.allSettled(group.list().map(async (session) => {\n await disablePauseOnExceptionsBestEffort(session);\n }));\n await fanout.cleanup(2_000, preserveWinner ? winner : undefined);\n }\n }, undefined, signal);\n}\n\nasync function resumeAfterException(\n session: InspectorSession,\n snapshot: Awaited<ReturnType<typeof captureSnapshot>>,\n pausedStartedAt: number,\n): Promise<SnapshotResult> {\n try {\n await resume(session);\n return withPausedDuration(snapshot, roundDurationMs(performance.now() - pausedStartedAt));\n } catch {\n process.stderr.write(\n \"[cf-inspector] warning: Debugger.resume failed after exception capture; pausedDurationMs is unknown.\\n\",\n );\n return withPausedDuration(snapshot, null);\n }\n}\n\nasync function disablePauseOnExceptionsBestEffort(session: InspectorSession): Promise<void> {\n try {\n await setPauseOnExceptions(session, \"none\");\n } catch {\n // best-effort: tunnel may be gone\n }\n}\n\nexport const internalsForTesting = {\n prepareExceptionCommand,\n};\n","import { performance } from \"node:perf_hooks\";\n\nimport { CfInspectorError } from \"../types.js\";\nimport type { PauseEvent } from \"../types.js\";\n\nimport { pauseDetail, toPauseEvent } from \"./conversions.js\";\nimport type { CdpPauseParams, InspectorSession, WaitForPauseOptions } from \"./types.js\";\n\nfunction pauseMatches(\n pause: PauseEvent,\n breakpointIds: readonly string[] | undefined,\n pauseReasons: readonly string[] | undefined,\n): boolean {\n if (pauseReasons !== undefined && pauseReasons.length > 0) {\n return pauseReasons.includes(pause.reason);\n }\n if (breakpointIds === undefined || breakpointIds.length === 0) {\n return true;\n }\n return pause.hitBreakpoints.some((id) => breakpointIds.includes(id));\n}\n\nfunction remainingUntil(deadlineMs: number): number {\n return Math.max(0, deadlineMs - performance.now());\n}\n\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted === true) {\n throw new CfInspectorError(\"ABORTED\", \"Aborted while waiting for Debugger.paused\");\n }\n}\n\nfunction hasResumedSincePause(session: InspectorSession, pause: PauseEvent): boolean {\n const pauseAt = pause.receivedAtMs;\n const resumedAt = session.debuggerState.lastResumedAtMs;\n return pauseAt !== undefined && resumedAt !== undefined && resumedAt >= pauseAt;\n}\n\nfunction throwBreakpointTimeout(timeoutMs: number): never {\n throw new CfInspectorError(\n \"BREAKPOINT_NOT_HIT\",\n `Timed out waiting for matching Debugger.paused after ${timeoutMs.toString()}ms`,\n );\n}\n\nfunction throwUnrelatedPauseTimeout(pause: PauseEvent, timeoutMs: number): never {\n throw new CfInspectorError(\n \"UNRELATED_PAUSE_TIMEOUT\",\n `Target stayed paused by another debugger event before this command's breakpoint could hit within ${timeoutMs.toString()}ms`,\n pauseDetail(pause),\n );\n}\n\nasync function waitForUnmatchedPauseToResume(\n session: InspectorSession,\n pause: PauseEvent,\n deadlineMs: number,\n options: WaitForPauseOptions,\n): Promise<void> {\n if (hasResumedSincePause(session, pause)) {\n return;\n }\n const remainingMs = remainingUntil(deadlineMs);\n if (remainingMs <= 0) {\n throwUnrelatedPauseTimeout(pause, options.timeoutMs);\n }\n try {\n await session.client.waitFor(\"Debugger.resumed\", {\n timeoutMs: remainingMs,\n ...(options.signal === undefined ? {} : { signal: options.signal }),\n });\n session.debuggerState.lastResumedAtMs = performance.now();\n } catch (err: unknown) {\n if (err instanceof CfInspectorError && err.code === \"BREAKPOINT_NOT_HIT\") {\n throwUnrelatedPauseTimeout(pause, options.timeoutMs);\n }\n throw err;\n }\n}\n\nasync function handleUnmatchedPause(\n session: InspectorSession,\n pause: PauseEvent,\n options: WaitForPauseOptions,\n deadlineMs: number,\n): Promise<void> {\n if (options.unmatchedPausePolicy === \"fail\") {\n throw new CfInspectorError(\n \"UNRELATED_PAUSE\",\n \"Target paused before this command's breakpoint was reached\",\n pauseDetail(pause),\n );\n }\n if (hasResumedSincePause(session, pause)) {\n return;\n }\n options.onUnmatchedPause?.(pause);\n await waitForUnmatchedPauseToResume(session, pause, deadlineMs, options);\n}\n\nexport async function waitForPause(\n session: InspectorSession,\n options: WaitForPauseOptions,\n): Promise<PauseEvent> {\n throwIfAborted(options.signal);\n const deadlineMs = performance.now() + options.timeoutMs;\n const buffer = session.pauseBuffer;\n while (buffer.length > 0 || remainingUntil(deadlineMs) > 0) {\n throwIfAborted(options.signal);\n while (buffer.length > 0) {\n throwIfAborted(options.signal);\n const buffered = buffer.shift();\n if (buffered === undefined) {\n continue;\n }\n if (pauseMatches(buffered, options.breakpointIds, options.pauseReasons)) {\n return buffered;\n }\n await handleUnmatchedPause(session, buffered, options, deadlineMs);\n }\n const pause = await waitForLivePause(session, options, deadlineMs);\n if (pauseMatches(pause, options.breakpointIds, options.pauseReasons)) {\n return pause;\n }\n await handleUnmatchedPause(session, pause, options, deadlineMs);\n }\n throwBreakpointTimeout(options.timeoutMs);\n}\n\nasync function waitForLivePause(\n session: InspectorSession,\n options: WaitForPauseOptions,\n deadlineMs: number,\n): Promise<PauseEvent> {\n const remainingMs = remainingUntil(deadlineMs);\n if (remainingMs <= 0) {\n throwBreakpointTimeout(options.timeoutMs);\n }\n session.pauseWaitGate.active = true;\n let receivedAtMs: number | undefined;\n let params: CdpPauseParams;\n try {\n params = await session.client.waitFor<CdpPauseParams>(\"Debugger.paused\", {\n timeoutMs: remainingMs,\n ...(options.signal === undefined ? {} : { signal: options.signal }),\n predicate: (): boolean => {\n receivedAtMs = performance.now();\n return true;\n },\n });\n } finally {\n session.pauseWaitGate.active = false;\n }\n return toPauseEvent(params, receivedAtMs ?? performance.now(), session.scripts);\n}\n","import { performance } from \"node:perf_hooks\";\n\nimport type { BreakpointHandle, PauseEvent } from \"../types.js\";\nimport { CfInspectorError } from \"../types.js\";\n\nimport { removeBreakpoint } from \"./breakpoints.js\";\nimport { waitForPause } from \"./pause.js\";\nimport { resume } from \"./runtime.js\";\nimport type { InspectorSession, InspectorSessionGroup, WaitForPauseOptions } from \"./types.js\";\n\nconst DEFAULT_CLEANUP_TIMEOUT_MS = 2_000;\n\nexport interface SessionBreakpointSetup {\n readonly handles: readonly BreakpointHandle[];\n}\n\nexport interface SessionBreakpointOutcome {\n readonly session: InspectorSession;\n readonly setup: SessionBreakpointSetup;\n}\n\nexport interface FanoutReadyOptions {\n readonly includeNewSessions?: boolean;\n readonly onReady?: (outcomes: readonly SessionBreakpointOutcome[]) => void;\n}\n\ninterface SessionRecord {\n readonly session: InspectorSession;\n readonly handles: BreakpointHandle[];\n setup: Promise<void>;\n}\n\nexport interface IsolatePause {\n readonly session: InspectorSession;\n readonly pause: PauseEvent;\n}\n\nexport interface FanoutCleanupSummary {\n readonly attempted: number;\n readonly cleared: number;\n readonly resumed: number;\n}\n\nexport class BreakpointFanout {\n private readonly records = new Map<InspectorSession, SessionRecord>();\n private readonly setupErrors: ((error: unknown) => void)[] = [];\n private readonly detach: () => void;\n private readonly detachRemoved: () => void;\n private readonly detachError: () => void;\n private activeRace: ActivePauseRace | undefined;\n private pauseReasons: readonly string[] = [];\n private pendingSetupError: Error | undefined;\n private preserveReadinessErrors = false;\n\n public constructor(\n group: InspectorSessionGroup,\n setupSession: (\n session: InspectorSession,\n trackHandle: (handle: BreakpointHandle) => void,\n ) => Promise<SessionBreakpointSetup>,\n pauseReasons: readonly string[] = [],\n ) {\n this.pauseReasons = pauseReasons;\n this.detach = group.onSession((session) => {\n const record: SessionRecord = { session, handles: [], setup: Promise.resolve() };\n this.records.set(session, record);\n record.setup = setupSession(session, (handle) => {\n this.trackHandle(session, handle);\n }).then((result) => {\n for (const handle of result.handles) {\n this.trackHandle(session, handle);\n }\n });\n const setup = record.setup;\n setup.catch((error: unknown) => {\n for (const reject of this.setupErrors) {\n reject(error);\n }\n });\n this.activeRace?.add(record);\n });\n this.detachRemoved = group.onSessionRemoved((session) => {\n this.records.delete(session);\n this.activeRace?.remove(session);\n });\n this.detachError = group.onError((error) => {\n if (this.setupErrors.length === 0 && this.pendingSetupError === undefined) {\n this.pendingSetupError = error;\n }\n for (const reject of this.setupErrors) {\n reject(error);\n }\n });\n }\n\n public async ready(options: FanoutReadyOptions = {}): Promise<void> {\n if (options.includeNewSessions !== true) {\n const records = [...this.records.values()];\n await Promise.all(records.map((record) => record.setup));\n options.onReady?.(this.outcomesFor(records));\n return;\n }\n this.preserveReadinessErrors = true;\n const pendingError = this.takePendingSetupError();\n if (pendingError !== undefined) {\n throw pendingError;\n }\n let rejectGroupError: (error: unknown) => void = (): void => undefined;\n const groupError = new Promise<never>((_resolve, reject) => {\n rejectGroupError = reject;\n });\n this.setupErrors.push(rejectGroupError);\n try {\n let stableRecords: readonly SessionRecord[] | undefined;\n while (stableRecords === undefined) {\n const records = [...this.records.values()];\n await Promise.race([\n Promise.all(records.map((record) => record.setup)),\n groupError,\n ]);\n const stable = records.length === this.records.size &&\n records.every((record) => this.records.get(record.session) === record);\n if (stable) {\n stableRecords = records;\n }\n }\n // Run the callback before this promise resolves. A session-registration\n // callback cannot interleave between this stable check and the emitted\n // readiness event on JavaScript's single thread.\n options.onReady?.(this.outcomesFor(stableRecords));\n } finally {\n const index = this.setupErrors.indexOf(rejectGroupError);\n if (index >= 0) {\n this.setupErrors.splice(index, 1);\n }\n }\n }\n\n public trackHandle(session: InspectorSession, handle: BreakpointHandle): void {\n const record = this.records.get(session);\n if (record !== undefined && !record.handles.some((candidate) => candidate.breakpointId === handle.breakpointId)) {\n record.handles.push(handle);\n }\n }\n\n public availableOutcomes(): readonly SessionBreakpointOutcome[] {\n return this.outcomesFor([...this.records.values()]);\n }\n\n private outcomesFor(records: readonly SessionRecord[]): readonly SessionBreakpointOutcome[] {\n return records.map((record) => ({\n session: record.session,\n setup: { handles: record.handles },\n }));\n }\n\n private takePendingSetupError(): Error | undefined {\n const error = this.pendingSetupError;\n this.pendingSetupError = undefined;\n return error;\n }\n\n public async waitForFirst(\n timeoutMs: number,\n options: Omit<WaitForPauseOptions, \"timeoutMs\" | \"breakpointIds\" | \"signal\"> = {},\n signal?: AbortSignal,\n ): Promise<IsolatePause> {\n if (this.activeRace !== undefined) {\n throw new CfInspectorError(\"INVALID_ARGUMENT\", \"A fan-out pause race is already active\");\n }\n const race = new ActivePauseRace(timeoutMs, options, signal);\n this.pauseReasons = options.pauseReasons ?? [];\n this.activeRace = race;\n this.setupErrors.push(race.reject);\n if (this.preserveReadinessErrors) {\n const pendingError = this.takePendingSetupError();\n if (pendingError !== undefined) {\n race.reject(pendingError);\n }\n }\n for (const record of this.records.values()) {\n race.add(record);\n }\n try {\n const winner = await race.result;\n await race.stopAndSettle();\n await this.resumePausedLosers(winner.session);\n return winner;\n } finally {\n this.activeRace = undefined;\n const index = this.setupErrors.indexOf(race.reject);\n if (index >= 0) {\n this.setupErrors.splice(index, 1);\n }\n await race.stopAndSettle();\n }\n }\n\n public async resumePaused(except?: InspectorSession): Promise<number> {\n return await this.resumePausedLosers(except, DEFAULT_CLEANUP_TIMEOUT_MS);\n }\n\n public async cleanup(\n timeoutMs = DEFAULT_CLEANUP_TIMEOUT_MS,\n preservePaused?: InspectorSession,\n ): Promise<FanoutCleanupSummary> {\n this.detach();\n this.detachRemoved();\n this.detachError();\n const deadline = performance.now() + timeoutMs;\n await settleWithin(Promise.allSettled([...this.records.values()].map(async (record) => {\n await record.setup;\n })), remaining(deadline));\n const breakpointEntries = [...this.records.values()].flatMap((record) =>\n record.handles.map((handle) => ({\n session: record.session,\n breakpointId: handle.breakpointId,\n })));\n let cleared = 0;\n const clearWork = Promise.allSettled(breakpointEntries.map(async (entry) => {\n await removeBreakpoint(entry.session, entry.breakpointId);\n cleared += 1;\n }));\n await settleWithin(clearWork, remaining(deadline));\n const resumed = await this.resumePausedLosers(preservePaused, remaining(deadline));\n return { attempted: breakpointEntries.length, cleared, resumed };\n }\n\n private async resumePausedLosers(\n except?: InspectorSession,\n timeoutMs = DEFAULT_CLEANUP_TIMEOUT_MS,\n ): Promise<number> {\n let resumed = 0;\n await settleWithin(Promise.allSettled([...this.records.keys()].map(async (session) => {\n if (\n session === except ||\n session.debuggerState.paused !== true ||\n session.client.isClosed ||\n !this.ownsCurrentPause(session)\n ) {\n return;\n }\n await resume(session);\n session.debuggerState.paused = false;\n resumed += 1;\n })), timeoutMs);\n return resumed;\n }\n\n private ownsCurrentPause(session: InspectorSession): boolean {\n const pause = session.debuggerState.currentPause;\n if (pause === undefined) {\n return false;\n }\n if (this.pauseReasons.includes(pause.reason)) {\n return true;\n }\n const record = this.records.get(session);\n const breakpointIds = new Set(record?.handles.map((handle) => handle.breakpointId) ?? []);\n return pause.hitBreakpoints.some((breakpointId) => breakpointIds.has(breakpointId));\n }\n}\n\nclass ActivePauseRace {\n private readonly controller = new AbortController();\n private readonly waits = new Set<Promise<void>>();\n private settled = false;\n private readonly deadline: number;\n private readonly timeout: ReturnType<typeof setTimeout>;\n private readonly externalSignal: AbortSignal | undefined;\n private readonly onExternalAbort = (): void => {\n this.reject(new CfInspectorError(\"ABORTED\", \"Aborted while waiting for an isolate pause\"));\n this.controller.abort();\n };\n private readonly resolveResult: (winner: IsolatePause) => void;\n private terminalTimeoutError: CfInspectorError | undefined;\n private readonly removedSessions = new Set<InspectorSession>();\n public readonly reject: (error: unknown) => void;\n public readonly result: Promise<IsolatePause>;\n\n public constructor(\n timeoutMs: number,\n private readonly options: Omit<WaitForPauseOptions, \"timeoutMs\" | \"breakpointIds\" | \"signal\">,\n signal?: AbortSignal,\n ) {\n this.externalSignal = signal;\n this.deadline = performance.now() + timeoutMs;\n let resolveResult: ((winner: IsolatePause) => void) | undefined;\n let rejectResult: ((error: unknown) => void) | undefined;\n this.result = new Promise<IsolatePause>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n this.resolveResult = (winner): void => {\n if (this.settled) {\n return;\n }\n this.settled = true;\n resolveResult?.(winner);\n };\n this.reject = (error): void => {\n if (this.settled) {\n return;\n }\n this.settled = true;\n rejectResult?.(error);\n };\n this.timeout = setTimeout(() => {\n this.reject(this.terminalTimeoutError ?? new CfInspectorError(\n \"BREAKPOINT_NOT_HIT\",\n `Timed out waiting for a matching pause in any isolate after ${timeoutMs.toString()}ms`,\n ));\n this.controller.abort();\n }, timeoutMs + 25);\n if (signal !== undefined) {\n if (signal.aborted) {\n this.reject(new CfInspectorError(\"ABORTED\", \"Aborted while waiting for an isolate pause\"));\n } else {\n signal.addEventListener(\"abort\", this.onExternalAbort, { once: true });\n }\n }\n }\n\n public add(record: SessionRecord): void {\n if (this.settled) {\n return;\n }\n const wait = this.wait(record).finally(() => {\n this.waits.delete(wait);\n });\n this.waits.add(wait);\n }\n\n public remove(session: InspectorSession): void {\n this.removedSessions.add(session);\n }\n\n public async stopAndSettle(): Promise<void> {\n clearTimeout(this.timeout);\n this.externalSignal?.removeEventListener(\"abort\", this.onExternalAbort);\n this.controller.abort();\n await Promise.allSettled([...this.waits]);\n }\n\n private async wait(record: SessionRecord): Promise<void> {\n try {\n await record.setup;\n const remainingMs = Math.max(1, this.deadline - performance.now());\n const pause = await waitForPause(record.session, {\n ...this.options,\n timeoutMs: remainingMs,\n breakpointIds: record.handles.map((handle) => handle.breakpointId),\n signal: this.controller.signal,\n });\n record.session.debuggerState.paused = true;\n this.resolveResult({ session: record.session, pause });\n this.controller.abort();\n } catch (error: unknown) {\n if (this.removedSessions.has(record.session)) {\n return;\n }\n if (error instanceof CfInspectorError && error.code === \"UNRELATED_PAUSE_TIMEOUT\") {\n this.terminalTimeoutError = error;\n return;\n }\n if (isExpectedRaceStop(error)) {\n return;\n }\n this.reject(error);\n this.controller.abort();\n }\n }\n}\n\nfunction isExpectedRaceStop(error: unknown): boolean {\n return error instanceof CfInspectorError && (\n error.code === \"ABORTED\" ||\n error.code === \"BREAKPOINT_NOT_HIT\" ||\n error.code === \"UNRELATED_PAUSE_TIMEOUT\"\n );\n}\n\nfunction remaining(deadline: number): number {\n return Math.max(0, deadline - performance.now());\n}\n\nasync function settleWithin<T>(work: Promise<T>, timeoutMs: number): Promise<T | null> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race<T | null>([\n work,\n new Promise<null>((resolve) => {\n timer = setTimeout(() => {\n resolve(null);\n }, timeoutMs);\n }),\n ]);\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n}\n","import type { CdpEvalResult } from \"../inspector/types.js\";\nimport { CfInspectorError } from \"../types.js\";\nimport type { CapturedExpression } from \"../types.js\";\n\nimport {\n DEFAULT_MAX_VALUE_LENGTH,\n formatPrimitive,\n isPrimitive,\n limitValueLength,\n textTruncationFields,\n} from \"./values.js\";\nimport type { LimitedValue } from \"./values.js\";\n\nexport function evalResultToCaptured(\n expression: string,\n result: CdpEvalResult,\n maxValueLength = DEFAULT_MAX_VALUE_LENGTH,\n): CapturedExpression {\n if (result.exceptionDetails !== undefined) {\n const limited = readEvalError(result, maxValueLength);\n return {\n expression,\n error: limited.text,\n ...textTruncationFields(limited),\n };\n }\n const inner = result.result;\n if (!inner) {\n return { expression, error: \"no result returned\" };\n }\n const type = typeof inner.type === \"string\" ? inner.type : undefined;\n const buildCaptured = (rendered: string): CapturedExpression => {\n const limited = limitValueLength(rendered, maxValueLength);\n const base: CapturedExpression = {\n expression,\n value: limited.text,\n ...textTruncationFields(limited),\n };\n return type === undefined ? base : { ...base, type };\n };\n\n if (type === \"string\" && typeof inner.value === \"string\") {\n return buildCaptured(JSON.stringify(inner.value));\n }\n if ((type === \"number\" || type === \"boolean\" || type === \"bigint\") && isPrimitive(inner.value)) {\n return buildCaptured(formatPrimitive(inner.value));\n }\n if (typeof inner.description === \"string\") {\n return buildCaptured(inner.description);\n }\n if (isPrimitive(inner.value)) {\n return buildCaptured(formatPrimitive(inner.value));\n }\n return buildCaptured(\"undefined\");\n}\n\nexport function sideEffectRefusalToCaptured(expression: string): CapturedExpression {\n const error = new CfInspectorError(\n \"MUTATION_NOT_ALLOWED\",\n `V8 blocked the capture expression \"${expression}\" because it may have side effects. Pass --allow-mutation to run it explicitly.`,\n );\n return {\n expression,\n error: `${error.code}: ${error.message}`,\n mutationRisk: true,\n blocked: true,\n };\n}\n\nfunction readEvalError(result: CdpEvalResult, maxValueLength: number): LimitedValue {\n const text =\n typeof result.exceptionDetails?.exception?.description === \"string\"\n ? result.exceptionDetails.exception.description\n : (typeof result.exceptionDetails?.text === \"string\" ? result.exceptionDetails.text : \"evaluation failed\");\n return limitValueLength(text, maxValueLength);\n}\n","import { CfInspectorError } from \"../types.js\";\nimport type { VariableSnapshot } from \"../types.js\";\n\nexport const DEFAULT_MAX_VALUE_LENGTH = 131_072;\nexport const DEFAULT_STREAM_MAX_VALUE_LENGTH = 4_096;\n\nexport interface TruncatedValue {\n readonly text: string;\n readonly truncated: true;\n readonly originalLength: number;\n}\n\nexport interface CompleteValue {\n readonly text: string;\n readonly truncated: false;\n}\n\nexport type LimitedValue = TruncatedValue | CompleteValue;\n\nexport interface TextTruncationFields {\n readonly truncated?: true;\n readonly originalLength?: number;\n}\n\nexport function isPrimitive(value: unknown): value is string | number | boolean | bigint | symbol {\n const t = typeof value;\n return t === \"string\" || t === \"number\" || t === \"boolean\" || t === \"bigint\" || t === \"symbol\";\n}\n\nexport function formatPrimitive(value: string | number | boolean | bigint | symbol): string {\n if (typeof value === \"symbol\") {\n return value.toString();\n }\n if (typeof value === \"bigint\") {\n return `${value.toString()}n`;\n }\n return String(value);\n}\n\nexport function resolveMaxValueLength(value: number | undefined): number {\n if (value === undefined) {\n return DEFAULT_MAX_VALUE_LENGTH;\n }\n if (!Number.isInteger(value) || value <= 0) {\n throw new CfInspectorError(\n \"INVALID_ARGUMENT\",\n `Invalid maxValueLength: ${value.toString()} — expected a positive integer`,\n );\n }\n return value;\n}\n\nexport function limitValueLength(\n raw: string,\n maxValueLength = DEFAULT_MAX_VALUE_LENGTH,\n): LimitedValue {\n if (raw.length <= maxValueLength) {\n return { text: raw, truncated: false };\n }\n return {\n text: raw.slice(0, maxValueLength),\n truncated: true,\n originalLength: raw.length,\n };\n}\n\nexport function textTruncationFields(limited: LimitedValue): TextTruncationFields {\n return limited.truncated\n ? { truncated: true, originalLength: limited.originalLength }\n : {};\n}\n\nfunction parseQuotedString(value: string): string {\n try {\n const parsed: unknown = JSON.parse(value);\n return typeof parsed === \"string\" ? parsed : value;\n } catch {\n return value;\n }\n}\n\nfunction parseNumericIndex(name: string): number | undefined {\n const parsed = Number.parseInt(name, 10);\n if (!Number.isInteger(parsed) || parsed < 0 || parsed.toString() !== name) {\n return undefined;\n }\n return parsed;\n}\n\nfunction scalarFromVariable(variable: VariableSnapshot): unknown {\n const value = variable.value;\n if (variable.type === \"string\") {\n return parseQuotedString(value);\n }\n if (variable.type === \"number\") {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : value;\n }\n if (variable.type === \"boolean\") {\n if (value === \"true\") {\n return true;\n }\n if (value === \"false\") {\n return false;\n }\n }\n if (variable.type === \"undefined\") {\n return \"[undefined]\";\n }\n if (variable.type === \"bigint\") {\n return value;\n }\n return value === \"null\" ? null : value;\n}\n\nfunction isArrayLikeChildren(children: readonly VariableSnapshot[]): boolean {\n let hasNumeric = false;\n for (const child of children) {\n // V8 includes `length` as an own property on arrays; ignore it when\n // deciding whether the children look array-shaped.\n if (child.name === \"length\") {\n continue;\n }\n if (parseNumericIndex(child.name) === undefined) {\n return false;\n }\n hasNumeric = true;\n }\n return hasNumeric;\n}\n\nexport function toStructuredValue(variable: VariableSnapshot): unknown {\n const children = variable.children;\n if (children === undefined || children.length === 0) {\n return scalarFromVariable(variable);\n }\n if (isArrayLikeChildren(children)) {\n const indexed = children.flatMap((child): readonly [number, unknown][] => {\n const index = parseNumericIndex(child.name);\n if (index === undefined) {\n // length entry; not part of the array body\n return [];\n }\n return [[index, toStructuredValue(child)]];\n });\n const maxIndex = Math.max(...indexed.map(([index]) => index));\n const out = Array.from({ length: maxIndex + 1 }, () => null as unknown);\n for (const [index, entry] of indexed) {\n out[index] = entry;\n }\n return out;\n }\n // Mixed numeric + string keys, or pure string keys: keep all children as\n // an object so non-indexed properties are not silently dropped.\n const out: Record<string, unknown> = {};\n for (const child of children) {\n out[child.name] = toStructuredValue(child);\n }\n return out;\n}\n","import { getProperties } from \"../inspector/runtime.js\";\nimport type { CdpProperty, InspectorSession } from \"../inspector/types.js\";\nimport type { VariableSnapshot } from \"../types.js\";\n\nimport {\n formatPrimitive,\n isPrimitive,\n limitValueLength,\n textTruncationFields,\n} from \"./values.js\";\n\nexport const MAX_SCOPE_VARIABLES = 20;\nexport const MAX_CHILD_VARIABLES = 8;\nexport const MAX_VARIABLE_DEPTH = 2;\n\ninterface DescribedProperty {\n value: string;\n type?: string;\n objectId?: string;\n}\n\nexport interface CapturedProperties {\n readonly variables: readonly VariableSnapshot[];\n readonly omittedCount?: number;\n}\n\nfunction buildDescribed(value: string, type: string | undefined, objectId?: string): DescribedProperty {\n const base: DescribedProperty = { value };\n if (type !== undefined) {\n base.type = type;\n }\n if (objectId !== undefined) {\n base.objectId = objectId;\n }\n return base;\n}\n\nexport function describeProperty(prop: CdpProperty): DescribedProperty {\n const value = prop.value;\n if (value === undefined) {\n return { value: \"undefined\" };\n }\n const type = typeof value.type === \"string\" ? value.type : undefined;\n const objectId = typeof value.objectId === \"string\" ? value.objectId : undefined;\n if (type === \"undefined\") {\n return buildDescribed(\"undefined\", type);\n }\n if (type === \"string\" && typeof value.value === \"string\") {\n return buildDescribed(JSON.stringify(value.value), type);\n }\n if (\n (type === \"number\" || type === \"boolean\" || type === \"bigint\" || type === \"symbol\") &&\n isPrimitive(value.value)\n ) {\n return buildDescribed(formatPrimitive(value.value), type);\n }\n if (typeof value.description === \"string\") {\n return buildDescribed(value.description, type, objectId);\n }\n if (isPrimitive(value.value)) {\n return buildDescribed(formatPrimitive(value.value), type);\n }\n if (objectId === undefined) {\n return buildDescribed(\"undefined\", type);\n }\n return buildDescribed(\"[object]\", type, objectId);\n}\n\nfunction isExpandable(type: string | undefined): boolean {\n return type === \"object\" || type === \"function\";\n}\n\nexport async function captureProperties(\n session: InspectorSession,\n objectId: string,\n limit: number,\n depth: number,\n maxValueLength: number,\n): Promise<CapturedProperties> {\n const properties = await getProperties(session, objectId);\n const limited = properties.slice(0, limit);\n const variables = await Promise.all(\n limited.map(async (prop): Promise<VariableSnapshot> => {\n return await captureProperty(session, prop, depth, maxValueLength);\n }),\n );\n const omittedCount = Math.max(properties.length - limited.length, 0);\n return omittedCount === 0 ? { variables } : { variables, omittedCount };\n}\n\nasync function captureProperty(\n session: InspectorSession,\n prop: CdpProperty,\n depth: number,\n maxValueLength: number,\n): Promise<VariableSnapshot> {\n const name = typeof prop.name === \"string\" ? prop.name : \"?\";\n const described = describeProperty(prop);\n const capturedChildren = await capturePropertyChildren(\n session,\n described,\n depth,\n maxValueLength,\n );\n const limited = limitValueLength(described.value, maxValueLength);\n const base: VariableSnapshot = {\n name,\n value: limited.text,\n ...textTruncationFields(limited),\n };\n const withType = described.type === undefined ? base : { ...base, type: described.type };\n const children = capturedChildren?.variables;\n const withChildren = children === undefined || children.length === 0\n ? withType\n : { ...withType, children };\n const omittedCount = capturedChildren?.omittedCount ?? 0;\n return omittedCount === 0\n ? withChildren\n : { ...withChildren, truncated: true, omittedCount };\n}\n\nasync function capturePropertyChildren(\n session: InspectorSession,\n described: DescribedProperty,\n depth: number,\n maxValueLength: number,\n): Promise<CapturedProperties | undefined> {\n if (described.objectId === undefined || !isExpandable(described.type)) {\n return undefined;\n }\n if (depth <= 0) {\n return await countDepthOmissions(session, described.objectId);\n }\n try {\n return await captureProperties(\n session,\n described.objectId,\n MAX_CHILD_VARIABLES,\n depth - 1,\n maxValueLength,\n );\n } catch {\n return undefined;\n }\n}\n\nasync function countDepthOmissions(\n session: InspectorSession,\n objectId: string,\n): Promise<CapturedProperties | undefined> {\n try {\n const properties = await getProperties(session, objectId);\n return properties.length === 0\n ? undefined\n : { variables: [], omittedCount: properties.length };\n } catch {\n return undefined;\n }\n}\n\nexport function countPropertyOmissions(captured: CapturedProperties): number {\n return (captured.omittedCount ?? 0) + captured.variables.reduce((total, variable) => {\n const childOmissions = variable.children === undefined\n ? 0\n : countPropertyOmissions({ variables: variable.children });\n return total + (variable.omittedCount ?? 0) + childOmissions;\n }, 0);\n}\n","import { getProperties } from \"../inspector/runtime.js\";\nimport type { InspectorSession } from \"../inspector/types.js\";\nimport type { ExceptionSnapshot, PauseEvent } from \"../types.js\";\n\nimport {\n captureProperties,\n countPropertyOmissions,\n MAX_SCOPE_VARIABLES,\n MAX_VARIABLE_DEPTH,\n} from \"./properties.js\";\nimport { limitValueLength, toStructuredValue } from \"./values.js\";\nimport type { LimitedValue } from \"./values.js\";\n\ninterface CdpExceptionData {\n readonly type?: unknown;\n readonly description?: unknown;\n readonly value?: unknown;\n readonly objectId?: unknown;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\ninterface MaterializedObject {\n readonly value: string;\n readonly omittedCount: number;\n}\n\nasync function materializeObject(\n session: InspectorSession,\n objectId: string,\n): Promise<MaterializedObject | undefined> {\n try {\n const captured = await captureProperties(\n session,\n objectId,\n MAX_SCOPE_VARIABLES,\n MAX_VARIABLE_DEPTH,\n Number.MAX_SAFE_INTEGER,\n );\n if (captured.variables.length === 0) {\n return undefined;\n }\n const structured: Record<string, unknown> = {};\n for (const variable of captured.variables) {\n structured[variable.name] = toStructuredValue(variable);\n }\n return {\n value: JSON.stringify(structured),\n omittedCount: countPropertyOmissions(captured),\n };\n } catch {\n return undefined;\n }\n}\n\nasync function readPropertyDescription(\n session: InspectorSession,\n objectId: string,\n name: string,\n): Promise<string | undefined> {\n try {\n const properties = await getProperties(session, objectId);\n for (const prop of properties) {\n if (prop.name !== name) {\n continue;\n }\n const value = prop.value;\n if (value === undefined) {\n continue;\n }\n if (typeof value.value === \"string\") {\n return value.value;\n }\n if (typeof value.description === \"string\") {\n return value.description;\n }\n }\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nexport async function captureException(\n session: InspectorSession,\n pause: PauseEvent,\n maxValueLength: number,\n): Promise<ExceptionSnapshot | undefined> {\n if (pause.reason !== \"exception\" && pause.reason !== \"promiseRejection\") {\n return undefined;\n }\n const data = pause.data;\n if (typeof data !== \"object\" || data === null) {\n return { error: \"no exception data attached\" };\n }\n const candidate = data as CdpExceptionData;\n const type = asString(candidate.type);\n const description = asString(candidate.description);\n if (typeof candidate.value === \"string\") {\n return buildResult(type, description, JSON.stringify(candidate.value), maxValueLength);\n }\n if (typeof candidate.value === \"number\" || typeof candidate.value === \"boolean\") {\n return buildResult(type, description, String(candidate.value), maxValueLength);\n }\n const objectId = asString(candidate.objectId);\n if (objectId === undefined) {\n if (description !== undefined) {\n return buildResult(type, description, description, maxValueLength);\n }\n return { error: \"exception data has no objectId or value\" };\n }\n const message = await readPropertyDescription(session, objectId, \"message\");\n const rendered = await materializeObject(session, objectId);\n if (rendered !== undefined) {\n return buildResult(\n type,\n message ?? description,\n rendered.value,\n maxValueLength,\n rendered.omittedCount,\n );\n }\n return buildResult(type, description, description ?? \"[exception]\", maxValueLength);\n}\n\nfunction buildResult(\n type: string | undefined,\n description: string | undefined,\n value: string,\n maxValueLength: number,\n omittedCount = 0,\n): ExceptionSnapshot {\n const limitedValue = limitValueLength(value, maxValueLength);\n const limitedDescription = description === undefined\n ? undefined\n : limitValueLength(description, maxValueLength);\n const base: ExceptionSnapshot = {\n value: limitedValue.text,\n ...exceptionTruncationFields(limitedValue, limitedDescription),\n };\n const withType = type === undefined ? base : { ...base, type };\n const withDescription = limitedDescription === undefined\n ? withType\n : { ...withType, description: limitedDescription.text };\n return omittedCount === 0\n ? withDescription\n : { ...withDescription, truncated: true, omittedCount };\n}\n\nfunction exceptionTruncationFields(\n value: LimitedValue,\n description: LimitedValue | undefined,\n): Pick<\n ExceptionSnapshot,\n \"truncated\" | \"originalLength\" | \"valueOriginalLength\" | \"descriptionOriginalLength\"\n> {\n const valueLength = value.truncated ? value.originalLength : undefined;\n const descriptionLength = description?.truncated === true\n ? description.originalLength\n : undefined;\n const lengths = [valueLength, descriptionLength].filter(\n (length): length is number => length !== undefined,\n );\n if (lengths.length === 0) {\n return {};\n }\n return {\n truncated: true,\n originalLength: Math.max(...lengths),\n ...(valueLength === undefined ? {} : { valueOriginalLength: valueLength }),\n ...(descriptionLength === undefined\n ? {}\n : { descriptionOriginalLength: descriptionLength }),\n };\n}\n","import type { CdpEvalResult, InspectorSession } from \"../inspector/types.js\";\nimport type { CapturedExpression } from \"../types.js\";\n\nimport {\n captureProperties,\n countPropertyOmissions,\n MAX_SCOPE_VARIABLES,\n MAX_VARIABLE_DEPTH,\n} from \"./properties.js\";\nimport {\n limitValueLength,\n textTruncationFields,\n toStructuredValue,\n} from \"./values.js\";\n\nfunction objectIdFromEvalResult(result: CdpEvalResult): string | undefined {\n const inner = result.result;\n if (inner?.type !== \"object\") {\n return undefined;\n }\n const objectId = inner.objectId;\n if (typeof objectId !== \"string\" || objectId.length === 0) {\n return undefined;\n }\n return objectId;\n}\n\ninterface RenderedObjectCapture {\n readonly value: string;\n readonly omittedCount: number;\n}\n\nasync function renderObjectCapture(\n session: InspectorSession,\n objectId: string,\n): Promise<RenderedObjectCapture | undefined> {\n try {\n const captured = await captureProperties(\n session,\n objectId,\n MAX_SCOPE_VARIABLES,\n MAX_VARIABLE_DEPTH,\n Number.MAX_SAFE_INTEGER,\n );\n const structured: Record<string, unknown> = {};\n for (const variable of captured.variables) {\n structured[variable.name] = toStructuredValue(variable);\n }\n return {\n value: JSON.stringify(structured),\n omittedCount: countPropertyOmissions(captured),\n };\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeRenderedObjectCapture(rendered: string, original: string): string | undefined {\n if (rendered === \"{}\" && original !== \"Object\") {\n return undefined;\n }\n if (original.startsWith(\"Array(\") && rendered === \"{\\\"length\\\":0}\") {\n return \"[]\";\n }\n return rendered;\n}\n\nexport async function withSerializedObjectCapture(\n session: InspectorSession,\n expression: string,\n evalResult: CdpEvalResult,\n captured: CapturedExpression,\n maxValueLength: number,\n): Promise<CapturedExpression> {\n if (captured.error !== undefined || captured.value === undefined) {\n return captured;\n }\n const objectId = objectIdFromEvalResult(evalResult);\n if (objectId === undefined) {\n return captured;\n }\n const rendered = await renderObjectCapture(session, objectId);\n if (rendered === undefined) {\n return captured;\n }\n const normalized = normalizeRenderedObjectCapture(rendered.value, captured.value);\n if (normalized === undefined) {\n return captured;\n }\n const limited = limitValueLength(normalized, maxValueLength);\n const base: CapturedExpression = {\n expression,\n value: limited.text,\n ...textTruncationFields(limited),\n ...(captured.type === undefined ? {} : { type: captured.type }),\n };\n return rendered.omittedCount === 0\n ? base\n : { ...base, truncated: true, omittedCount: rendered.omittedCount };\n}\n","import type { InspectorSession } from \"../inspector/types.js\";\nimport type { CallFrameInfo, ScopeSnapshot } from \"../types.js\";\n\nimport {\n captureProperties,\n MAX_SCOPE_VARIABLES,\n MAX_VARIABLE_DEPTH,\n} from \"./properties.js\";\n\nconst MAX_SCOPES = 3;\n\nconst PRIORITY_BY_TYPE: Readonly<Record<string, number>> = {\n local: 0,\n arguments: 1,\n block: 2,\n closure: 3,\n catch: 4,\n with: 5,\n module: 6,\n script: 7,\n};\n\nexport interface CapturedScopes {\n readonly scopes: readonly ScopeSnapshot[];\n readonly omittedCount?: number;\n}\n\nexport function selectScopes(scopeChain: CallFrameInfo[\"scopeChain\"]): CallFrameInfo[\"scopeChain\"] {\n return rankedScopes(scopeChain).slice(0, MAX_SCOPES);\n}\n\nfunction rankedScopes(scopeChain: CallFrameInfo[\"scopeChain\"]): CallFrameInfo[\"scopeChain\"] {\n const eligible = scopeChain.filter((scope) => scope.objectId !== undefined && scope.type !== \"global\");\n return [...eligible]\n .sort((a, b) => priorityOf(a.type) - priorityOf(b.type));\n}\n\nfunction priorityOf(type: string): number {\n return PRIORITY_BY_TYPE[type] ?? Number.MAX_SAFE_INTEGER;\n}\n\nexport async function captureScopes(\n session: InspectorSession,\n frame: CallFrameInfo,\n maxValueLength: number,\n): Promise<CapturedScopes> {\n const ranked = rankedScopes(frame.scopeChain);\n const scopes = ranked.slice(0, MAX_SCOPES);\n const capturedScopes = await Promise.all(\n scopes.map(async (scope): Promise<ScopeSnapshot> => {\n const objectId = scope.objectId;\n if (objectId === undefined) {\n return { type: scope.type, variables: [] };\n }\n try {\n const captured = await captureProperties(\n session,\n objectId,\n MAX_SCOPE_VARIABLES,\n MAX_VARIABLE_DEPTH,\n maxValueLength,\n );\n const base: ScopeSnapshot = { type: scope.type, variables: captured.variables };\n return captured.omittedCount === undefined\n ? base\n : { ...base, truncated: true, omittedCount: captured.omittedCount };\n } catch {\n return { type: scope.type, variables: [] };\n }\n }),\n );\n const omittedCount = Math.max(ranked.length - capturedScopes.length, 0);\n return omittedCount === 0\n ? { scopes: capturedScopes }\n : { scopes: capturedScopes, omittedCount };\n}\n","import { looksLikeMutation } from \"../cli/captureParser.js\";\nimport { evaluateOnFrame, isSideEffectRefusal } from \"../inspector/runtime.js\";\nimport type { InspectorSession } from \"../inspector/types.js\";\nimport type {\n CallFrameInfo,\n CapturedExpression,\n FrameSnapshot,\n} from \"../types.js\";\n\nimport { evalResultToCaptured, sideEffectRefusalToCaptured } from \"./evaluation.js\";\nimport { withSerializedObjectCapture } from \"./objects.js\";\nimport { limitValueLength, textTruncationFields } from \"./values.js\";\n\nexport const DEFAULT_STACK_DEPTH = 1;\nexport const MAX_STACK_DEPTH = 64;\n\nfunction clampDepth(depth: number, frameCount: number): number {\n if (depth <= 0) {\n return 0;\n }\n return Math.min(depth, frameCount, MAX_STACK_DEPTH);\n}\n\nfunction buildBaseFrame(frame: CallFrameInfo): FrameSnapshot {\n const base: FrameSnapshot = {\n functionName: frame.functionName,\n line: frame.lineNumber + 1,\n column: frame.columnNumber + 1,\n };\n return frame.url === undefined ? base : { ...base, url: frame.url };\n}\n\nasync function captureFrameExpression(\n session: InspectorSession,\n callFrameId: string,\n expression: string,\n maxValueLength: number,\n throwOnSideEffect: boolean | undefined,\n): Promise<CapturedExpression> {\n const mutationRisk = throwOnSideEffect === false && looksLikeMutation(expression);\n try {\n const result = await evaluateOnFrame(session, callFrameId, expression, {\n ...(throwOnSideEffect === undefined ? {} : { throwOnSideEffect }),\n });\n if (isSideEffectRefusal(result)) {\n return sideEffectRefusalToCaptured(expression);\n }\n const captured = evalResultToCaptured(expression, result, maxValueLength);\n const serialized = await withSerializedObjectCapture(\n session,\n expression,\n result,\n captured,\n maxValueLength,\n );\n return mutationRisk ? { ...serialized, mutationRisk: true } : serialized;\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n const limited = limitValueLength(message, maxValueLength);\n const captured: CapturedExpression = {\n expression,\n error: limited.text,\n ...textTruncationFields(limited),\n };\n return mutationRisk ? { ...captured, mutationRisk: true } : captured;\n }\n}\n\nasync function captureFrameExpressions(\n session: InspectorSession,\n frame: CallFrameInfo,\n expressions: readonly string[],\n maxValueLength: number,\n throwOnSideEffect: boolean | undefined,\n): Promise<readonly CapturedExpression[]> {\n if (expressions.length === 0) {\n return [];\n }\n return await Promise.all(\n expressions.map((expression) =>\n captureFrameExpression(\n session,\n frame.callFrameId,\n expression,\n maxValueLength,\n throwOnSideEffect,\n ),\n ),\n );\n}\n\nexport interface WalkStackOptions {\n readonly stackDepth: number;\n readonly stackCaptures: readonly string[];\n readonly maxValueLength: number;\n readonly throwOnSideEffect?: boolean;\n}\n\nexport async function walkStack(\n session: InspectorSession,\n callFrames: readonly CallFrameInfo[],\n options: WalkStackOptions,\n): Promise<readonly FrameSnapshot[]> {\n const depth = clampDepth(options.stackDepth, callFrames.length);\n if (depth <= 1) {\n return [];\n }\n const slice = callFrames.slice(0, depth);\n return await Promise.all(\n slice.map(async (frame): Promise<FrameSnapshot> => {\n const base = buildBaseFrame(frame);\n if (options.stackCaptures.length === 0) {\n return base;\n }\n const captures = await captureFrameExpressions(\n session,\n frame,\n options.stackCaptures,\n options.maxValueLength,\n options.throwOnSideEffect,\n );\n return { ...base, captures };\n }),\n );\n}\n","import { looksLikeMutation } from \"../cli/captureParser.js\";\nimport { evaluateOnFrame, isSideEffectRefusal } from \"../inspector/runtime.js\";\nimport type { InspectorSession } from \"../inspector/types.js\";\nimport type {\n CapturedExpression,\n ExceptionSnapshot,\n FrameSnapshot,\n PauseEvent,\n SnapshotCaptureResult,\n} from \"../types.js\";\n\nimport { evalResultToCaptured, sideEffectRefusalToCaptured } from \"./evaluation.js\";\nimport { captureException } from \"./exception.js\";\nimport { withSerializedObjectCapture } from \"./objects.js\";\nimport { describeProperty } from \"./properties.js\";\nimport { captureScopes, selectScopes } from \"./scopes.js\";\nimport { DEFAULT_STACK_DEPTH, walkStack } from \"./stack.js\";\nimport {\n DEFAULT_MAX_VALUE_LENGTH,\n DEFAULT_STREAM_MAX_VALUE_LENGTH,\n limitValueLength,\n resolveMaxValueLength,\n textTruncationFields,\n} from \"./values.js\";\n\nexport interface CaptureSnapshotOptions {\n readonly captures?: readonly string[];\n readonly includeScopes?: boolean;\n readonly maxValueLength?: number;\n readonly stackDepth?: number;\n readonly stackCaptures?: readonly string[];\n readonly throwOnSideEffect?: boolean;\n}\n\nexport async function captureSnapshot(\n session: InspectorSession,\n pause: PauseEvent,\n options: CaptureSnapshotOptions = {},\n): Promise<SnapshotCaptureResult> {\n const maxValueLength = resolveMaxValueLength(options.maxValueLength);\n const top = pause.callFrames[0];\n let topFrame: FrameSnapshot | undefined;\n let captures: CapturedExpression[] = [];\n let stack: readonly FrameSnapshot[] = [];\n if (top) {\n topFrame = {\n functionName: top.functionName,\n ...(top.url === undefined ? {} : { url: top.url }),\n line: top.lineNumber + 1,\n column: top.columnNumber + 1,\n };\n if (options.includeScopes === true) {\n const capturedScopes = await captureScopes(session, top, maxValueLength);\n topFrame = {\n ...topFrame,\n scopes: capturedScopes.scopes,\n ...(capturedScopes.omittedCount === undefined\n ? {}\n : { truncated: true, omittedCount: capturedScopes.omittedCount }),\n };\n }\n captures = await captureExpressions(\n session,\n top.callFrameId,\n options.captures,\n maxValueLength,\n options.throwOnSideEffect,\n );\n stack = await walkStack(session, pause.callFrames, {\n stackDepth: options.stackDepth ?? DEFAULT_STACK_DEPTH,\n stackCaptures: options.stackCaptures ?? [],\n maxValueLength,\n ...(options.throwOnSideEffect === undefined\n ? {}\n : { throwOnSideEffect: options.throwOnSideEffect }),\n });\n }\n const exception = await captureException(session, pause, maxValueLength);\n return buildResult({\n pause,\n topFrame,\n captures,\n stack,\n exception,\n });\n}\n\ninterface BuildResultInput {\n readonly pause: PauseEvent;\n readonly topFrame: FrameSnapshot | undefined;\n readonly captures: readonly CapturedExpression[];\n readonly stack: readonly FrameSnapshot[];\n readonly exception: ExceptionSnapshot | undefined;\n}\n\nfunction buildResult(input: BuildResultInput): SnapshotCaptureResult {\n const base: SnapshotCaptureResult = {\n reason: input.pause.reason,\n hitBreakpoints: input.pause.hitBreakpoints,\n capturedAt: new Date().toISOString(),\n captures: input.captures,\n };\n const withFrame = input.topFrame === undefined ? base : { ...base, topFrame: input.topFrame };\n const withStack = input.stack.length > 0 ? { ...withFrame, stack: input.stack } : withFrame;\n return input.exception === undefined ? withStack : { ...withStack, exception: input.exception };\n}\n\nasync function captureExpressions(\n session: InspectorSession,\n callFrameId: string,\n captures: readonly string[] | undefined,\n maxValueLength: number,\n throwOnSideEffect: boolean | undefined,\n): Promise<CapturedExpression[]> {\n if (captures === undefined || captures.length === 0) {\n return [];\n }\n return await Promise.all(\n captures.map(async (expression): Promise<CapturedExpression> => {\n return await captureExpression(\n session,\n callFrameId,\n expression,\n maxValueLength,\n throwOnSideEffect,\n );\n }),\n );\n}\n\nasync function captureExpression(\n session: InspectorSession,\n callFrameId: string,\n expression: string,\n maxValueLength: number,\n throwOnSideEffect: boolean | undefined,\n): Promise<CapturedExpression> {\n const mutationRisk = throwOnSideEffect === false && looksLikeMutation(expression);\n try {\n const result = await evaluateOnFrame(session, callFrameId, expression, {\n ...(throwOnSideEffect === undefined ? {} : { throwOnSideEffect }),\n });\n if (isSideEffectRefusal(result)) {\n return sideEffectRefusalToCaptured(expression);\n }\n const captured = evalResultToCaptured(expression, result, maxValueLength);\n const serialized = await withSerializedObjectCapture(\n session,\n expression,\n result,\n captured,\n maxValueLength,\n );\n return mutationRisk ? { ...serialized, mutationRisk: true } : serialized;\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n const limited = limitValueLength(message, maxValueLength);\n const captured: CapturedExpression = {\n expression,\n error: limited.text,\n ...textTruncationFields(limited),\n };\n return mutationRisk ? { ...captured, mutationRisk: true } : captured;\n }\n}\n\nexport const internalsForTesting = {\n DEFAULT_MAX_VALUE_LENGTH,\n DEFAULT_STREAM_MAX_VALUE_LENGTH,\n limitValueLength,\n resolveMaxValueLength,\n describeProperty,\n selectScopes,\n evalResultToCaptured,\n};\n","import process from \"node:process\";\n\n/**\n * Run `fn` with a fresh AbortController whose signal aborts on SIGINT/SIGTERM.\n * The handlers are detached on completion so repeated invocations do not leak\n * listeners, and so the next signal restores the default Node behaviour.\n */\nexport async function withTerminationSignal<T>(\n fn: (signal: AbortSignal) => Promise<T>,\n): Promise<T> {\n const abort = new AbortController();\n const onSignal = (): void => {\n abort.abort();\n };\n process.once(\"SIGINT\", onSignal);\n process.once(\"SIGTERM\", onSignal);\n try {\n return await fn(abort.signal);\n } finally {\n process.off(\"SIGINT\", onSignal);\n process.off(\"SIGTERM\", onSignal);\n }\n}\n","import process from \"node:process\";\n\nimport { discoverInspectorTargets } from \"../../inspector/discovery.js\";\nimport type { InspectorTarget } from \"../../inspector/discovery.js\";\nimport { listScripts } from \"../../inspector/runtime.js\";\nimport { discoverNodeWorkerTargets } from \"../../inspector/session.js\";\nimport type { InspectorSession, InspectorWorkerTarget } from \"../../inspector/types.js\";\nimport type { InspectorIsolate, ListedScriptInfo } from \"../../types.js\";\nimport type {\n ListScriptsCommandOptions,\n ListTargetsCommandOptions,\n Target,\n} from \"../commandTypes.js\";\nimport { writeJson } from \"../output.js\";\nimport { openTarget, resolveTargetWithCurrentCfTarget, withSessions } from \"../target.js\";\nimport { warnOnImplicitInspectorSelection } from \"../warnings.js\";\n\ntype ScriptUrlFilter = (url: string) => boolean;\ntype FilterToken = string | { readonly kind: \"wildcard\"; readonly minChars: 0 | 1 };\n\nexport async function handleListScripts(opts: ListScriptsCommandOptions): Promise<void> {\n const target = await resolveTargetWithCurrentCfTarget(opts);\n const filter = compileScriptUrlFilter(opts.filter);\n const scripts = (await withSessions(target, (group) => {\n const sessions = group.list();\n warnOnListScriptsSelection(target, {\n targetCount: group.targetCount,\n targetIndex: group.targetIndex,\n ...(sessions[0]?.workerTargets === undefined\n ? {}\n : { workerTargets: sessions[0].workerTargets }),\n });\n return Promise.resolve(collectListedScripts(sessions));\n }))\n .filter((script) => filter === undefined || filter(script.url));\n if (opts.json) {\n writeJson(scripts);\n return;\n }\n for (const script of scripts) {\n process.stdout.write(\n `${script.scriptId}\\t${script.url}\\t${formatIsolate(script.isolate)}\\n`,\n );\n }\n}\n\nexport function warnOnListScriptsSelection(\n target: Target,\n selection: Pick<InspectorSession, \"targetCount\" | \"targetIndex\" | \"workerTargets\">,\n): void {\n const autoAttach = target.targetIndex === undefined &&\n target.workerIndex === undefined &&\n target.workerId === undefined &&\n target.mainOnly !== true;\n const isolateWasExplicit = autoAttach ||\n target.workerIndex !== undefined ||\n target.workerId !== undefined ||\n target.mainOnly === true;\n warnOnImplicitInspectorSelection(\n selection,\n target.targetIndex !== undefined,\n isolateWasExplicit,\n );\n}\n\nfunction collectListedScripts(sessions: readonly InspectorSession[]): readonly ListedScriptInfo[] {\n return sessions.flatMap((session) => listScripts(session).map((script) => ({\n ...script,\n isolate: session.isolate ?? { kind: \"main\" },\n })));\n}\n\nfunction formatIsolate(isolate: InspectorIsolate): string {\n return isolate.kind === \"worker\" ? `worker:${isolate.workerId}` : \"main\";\n}\n\nexport async function handleListTargets(opts: ListTargetsCommandOptions): Promise<void> {\n const target = await resolveTargetWithCurrentCfTarget(opts);\n const tunnel = await openTarget(target);\n try {\n const targets = await discoverInspectorTargets(tunnel.host, tunnel.port, 5_000);\n const indexedTargets = await buildListedTargets(targets);\n const workerCount = indexedTargets.reduce((count, targetEntry) => {\n return count + targetEntry.workers.length;\n }, 0);\n writeTargetCountSummary(indexedTargets.length, workerCount);\n warnOnMissingWorkers(indexedTargets.length, workerCount, indexedTargets);\n if (opts.json) {\n writeJson(indexedTargets);\n return;\n }\n writeHumanTargets(indexedTargets);\n } finally {\n await tunnel.dispose();\n }\n}\n\ninterface ListedWorkerTarget {\n readonly index: number;\n readonly workerId: string;\n readonly type: string;\n readonly title: string;\n readonly url: string;\n}\n\ninterface ListedInspectorTarget extends InspectorTarget {\n readonly index: number;\n readonly likelyWorker: boolean;\n readonly workerDiscoverySupported: boolean;\n readonly workers: readonly ListedWorkerTarget[];\n}\n\nasync function buildListedTargets(\n targets: readonly InspectorTarget[],\n): Promise<readonly ListedInspectorTarget[]> {\n return await Promise.all(targets.map(async (target, index) => {\n try {\n const workerResult = await discoverNodeWorkerTargets(target);\n return buildListedTarget(target, index, workerResult.supported, workerResult.workers);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n process.stderr.write(\n `[cf-inspector] warning: worker discovery failed for raw target ${index.toString()}: ${message}\\n`,\n );\n return buildListedTarget(target, index, false, []);\n }\n }));\n}\n\nfunction buildListedTarget(\n target: InspectorTarget,\n index: number,\n workerDiscoverySupported: boolean,\n workers: readonly InspectorWorkerTarget[],\n): ListedInspectorTarget {\n return {\n index,\n ...target,\n likelyWorker: looksLikeWorkerTarget(target),\n workerDiscoverySupported,\n workers: workers.map((worker, workerIndex) => ({\n index: workerIndex,\n workerId: worker.workerId,\n type: worker.type,\n title: worker.title,\n url: worker.url,\n })),\n };\n}\n\nfunction looksLikeWorkerTarget(target: InspectorTarget): boolean {\n return `${target.type} ${target.title} ${target.url}`.toLowerCase().includes(\"worker\");\n}\n\nfunction writeTargetCountSummary(targetCount: number, workerCount: number): void {\n process.stderr.write(\n `[cf-inspector] ${targetCount.toString()} raw inspector ` +\n `${targetCount === 1 ? \"target\" : \"targets\"}; ${workerCount.toString()} ` +\n `${workerCount === 1 ? \"worker\" : \"workers\"}.\\n`,\n );\n}\n\nfunction warnOnMissingWorkers(\n targetCount: number,\n workerCount: number,\n targets: readonly ListedInspectorTarget[],\n): void {\n if (targetCount !== 1 || workerCount !== 0) {\n return;\n }\n const supported = targets[0]?.workerDiscoverySupported === true;\n const supportHint = supported\n ? \"NodeWorker discovery is available, but no live worker attached.\"\n : \"This runtime did not expose NodeWorker discovery.\";\n process.stderr.write(\n `[cf-inspector] warning: only the main inspector target is reachable. ${supportHint} ` +\n \"If worker code is expected, ensure the worker is alive and rerun list-targets. \" +\n \"A worker on a separate inspector port is not carried by a single Cloud Foundry tunnel.\\n\",\n );\n}\n\nfunction writeHumanTargets(targets: readonly ListedInspectorTarget[]): void {\n for (const target of targets) {\n const workerLabel = target.likelyWorker ? \"\\tlikely-worker\" : \"\";\n process.stdout.write(\n `${target.index.toString()}\\ttarget\\t${target.type}\\t${target.title}\\t${target.url}${workerLabel}\\n`,\n );\n for (const worker of target.workers) {\n process.stdout.write(\n ` ${worker.index.toString()}\\tworker\\t${worker.type}\\t${worker.title}\\t${worker.url}\\n`,\n );\n }\n }\n}\n\nexport function compileScriptUrlFilter(pattern: string | undefined): ScriptUrlFilter | undefined {\n if (pattern === undefined || pattern.length === 0) {\n return undefined;\n }\n const alternatives = splitPatternAlternatives(pattern)\n .map((alternative) => parseFilterTokens(alternative))\n .filter((tokens) => tokens.length > 0);\n return (url: string): boolean => alternatives.some((tokens) => matchesFilterTokens(url, tokens));\n}\n\nfunction splitPatternAlternatives(pattern: string): readonly string[] {\n const alternatives: string[] = [];\n let current = \"\";\n for (let index = 0; index < pattern.length; index++) {\n const char = pattern[index] ?? \"\";\n if (char === \"\\\\\" && index + 1 < pattern.length) {\n current += `${char}${pattern[index + 1] ?? \"\"}`;\n index++;\n } else if (char === \"|\") {\n alternatives.push(current);\n current = \"\";\n } else {\n current += char;\n }\n }\n alternatives.push(current);\n return alternatives;\n}\n\nfunction parseFilterTokens(pattern: string): readonly FilterToken[] {\n const tokens: FilterToken[] = [];\n let literal = \"\";\n for (let index = 0; index < pattern.length; index++) {\n const char = pattern[index] ?? \"\";\n const nextChar = pattern[index + 1];\n if (char === \"\\\\\" && nextChar !== undefined) {\n literal += nextChar;\n index++;\n } else if (char === \".\" && (nextChar === \"*\" || nextChar === \"+\")) {\n if (literal.length > 0) { tokens.push(literal); }\n literal = \"\";\n tokens.push({ kind: \"wildcard\", minChars: nextChar === \"+\" ? 1 : 0 });\n index++;\n } else {\n literal += char;\n }\n }\n if (literal.length > 0) { tokens.push(literal); }\n return tokens;\n}\n\nfunction matchesFilterTokens(value: string, tokens: readonly FilterToken[]): boolean {\n let position = 0;\n for (const token of tokens) {\n if (typeof token === \"string\") {\n const nextPosition = value.indexOf(token, position);\n if (nextPosition === -1) { return false; }\n position = nextPosition + token.length;\n } else {\n if (token.minChars === 1 && position >= value.length) { return false; }\n position += token.minChars;\n }\n }\n return true;\n}\n","import process from \"node:process\";\n\nimport { validateExpression } from \"../../inspector/runtime.js\";\nimport type { InspectorSession, InspectorSessionGroup } from \"../../inspector/types.js\";\nimport type { LogpointStreamResult } from \"../../logpoint/stream.js\";\nimport { streamLogpoint } from \"../../logpoint/stream.js\";\nimport { parseBreakpointSpec, parseRemoteRoot } from \"../../pathMapper.js\";\nimport { DEFAULT_STREAM_MAX_VALUE_LENGTH } from \"../../snapshot/values.js\";\nimport { CfInspectorError } from \"../../types.js\";\nimport type { LogCommandOptions } from \"../commandTypes.js\";\nimport { writeArmedEvent, writeLogEvent } from \"../output.js\";\nimport { withTerminationSignal } from \"../signals.js\";\nimport { parsePositiveInt, resolveTargetWithCurrentCfTarget, withSessions } from \"../target.js\";\nimport {\n warnOnBoundBreakpointWithoutHit,\n warnOnMutationRisk,\n warnOnUnboundBreakpoints,\n} from \"../warnings.js\";\n\nexport async function handleLog(opts: LogCommandOptions): Promise<void> {\n const target = await resolveTargetWithCurrentCfTarget(opts);\n const location = parseBreakpointSpec(opts.at);\n const remoteRoot = parseRemoteRoot(opts.remoteRoot);\n const durationSec = parsePositiveInt(opts.duration, \"--duration\");\n const maxEvents = parsePositiveInt(opts.maxEvents, \"--max-events\");\n const hitCount = parsePositiveInt(opts.hitCount, \"--hit-count\");\n const maxValueLength = parsePositiveInt(opts.maxValueLength, \"--max-value-length\")\n ?? DEFAULT_STREAM_MAX_VALUE_LENGTH;\n const expression = opts.expr.trim();\n if (expression.length === 0) {\n throw new CfInspectorError(\"INVALID_EXPRESSION\", \"--expr must not be empty\");\n }\n const condition = opts.condition !== undefined && opts.condition.trim().length > 0\n ? opts.condition.trim()\n : undefined;\n warnOnMutationRisk(expression, \"log --expr\");\n if (condition !== undefined) {\n warnOnMutationRisk(condition, \"log --condition\");\n }\n\n await withTerminationSignal(async (signal) => {\n await withSessions(target, async (group) => {\n const result = await runLogGroup(group, {\n location,\n expression,\n remoteRoot,\n ...(durationSec === undefined ? {} : { durationMs: durationSec * 1000 }),\n ...(maxEvents === undefined ? {} : { maxEvents }),\n ...(hitCount === undefined ? {} : { hitCount }),\n ...(condition === undefined ? {} : { condition }),\n maxValueLength,\n json: opts.json,\n emitReadyEvent: opts.readyEvent === true,\n signal,\n });\n writeLogSummary(result.stoppedReason, result.emitted, opts.json);\n }, undefined, signal);\n });\n}\n\ninterface LogGroupOptions {\n readonly location: ReturnType<typeof parseBreakpointSpec>;\n readonly expression: string;\n readonly remoteRoot: ReturnType<typeof parseRemoteRoot>;\n readonly durationMs?: number;\n readonly maxEvents?: number;\n readonly hitCount?: number;\n readonly condition?: string;\n readonly maxValueLength: number;\n readonly json: boolean;\n readonly emitReadyEvent: boolean;\n readonly signal: AbortSignal;\n}\n\ninterface LogGroupResult {\n readonly emitted: number;\n readonly stoppedReason: \"duration\" | \"signal\" | \"transport-closed\" | \"max-events\";\n}\n\nasync function runLogGroup(\n group: InspectorSessionGroup,\n options: LogGroupOptions,\n): Promise<LogGroupResult> {\n const controller = new AbortController();\n const tasks = new Set<Promise<LogpointStreamResult>>();\n const removedSessions = new Set<InspectorSession>();\n const results: LogpointStreamResult[] = [];\n const pendingArming = new Set<InspectorSession>();\n const resolvedLocations = new Map<InspectorSession, number>();\n let fatalError: unknown;\n let emitted = 0;\n let reason: LogGroupResult[\"stoppedReason\"] = \"signal\";\n let sessionRegistrationComplete = false;\n let readyEventEmitted = !options.emitReadyEvent;\n let resolveStop: (() => void) | undefined;\n const stopped = new Promise<void>((resolve) => {\n resolveStop = resolve;\n });\n const finish = (nextReason: LogGroupResult[\"stoppedReason\"]): void => {\n if (controller.signal.aborted) {\n return;\n }\n reason = nextReason;\n controller.abort();\n resolveStop?.();\n };\n const onSignal = (): void => {\n finish(\"signal\");\n };\n options.signal.addEventListener(\"abort\", onSignal, { once: true });\n if (options.signal.aborted) {\n finish(\"signal\");\n }\n const timer = options.durationMs === undefined ? undefined : setTimeout(() => {\n finish(\"duration\");\n }, options.durationMs);\n const detachError = options.emitReadyEvent\n ? group.onError((error) => {\n if (controller.signal.aborted) {\n return;\n }\n fatalError = error;\n finish(\"transport-closed\");\n })\n : (): void => undefined;\n const emitReadyEventIfArmed = (): void => {\n if (\n readyEventEmitted ||\n !sessionRegistrationComplete ||\n pendingArming.size > 0 ||\n resolvedLocations.size === 0 ||\n controller.signal.aborted\n ) {\n return;\n }\n writeArmedEvent({\n command: \"log\",\n sessions: resolvedLocations.size,\n resolvedLocations: [...resolvedLocations.values()].reduce(\n (total, count) => total + count,\n 0,\n ),\n timeoutMs: null,\n });\n readyEventEmitted = true;\n };\n const startSession = (session: InspectorSession): void => {\n if (controller.signal.aborted) {\n return;\n }\n if (!readyEventEmitted) {\n pendingArming.add(session);\n }\n const task = (async (): Promise<LogpointStreamResult> => {\n await validateExpression(session, options.expression);\n if (options.condition !== undefined) {\n await validateExpression(session, options.condition);\n }\n return await streamLogpoint(session, {\n location: options.location,\n expression: options.expression,\n remoteRoot: options.remoteRoot,\n ...(options.hitCount === undefined ? {} : { hitCount: options.hitCount }),\n ...(options.condition === undefined ? {} : { condition: options.condition }),\n maxValueLength: options.maxValueLength,\n signal: controller.signal,\n ...(options.emitReadyEvent\n ? { eventGate: (): boolean => readyEventEmitted }\n : {}),\n onEvent: (event) => {\n if (controller.signal.aborted) {\n return;\n }\n emitted += 1;\n writeLogEvent({ ...event, isolate: session.isolate ?? { kind: \"main\" } }, options.json);\n if (options.maxEvents !== undefined && emitted >= options.maxEvents) {\n finish(\"max-events\");\n }\n },\n onBreakpointSet: (handle) => {\n warnOnUnboundBreakpoints([handle]);\n if (!readyEventEmitted) {\n resolvedLocations.set(session, handle.resolvedLocations.length);\n pendingArming.delete(session);\n emitReadyEventIfArmed();\n }\n },\n });\n })();\n tasks.add(task);\n void task.then(\n (result) => {\n results.push(result);\n if (result.stoppedReason === \"transport-closed\" && !removedSessions.has(session)) {\n finish(\"transport-closed\");\n }\n },\n (error: unknown) => {\n if (\n options.emitReadyEvent &&\n (removedSessions.has(session) || fatalError !== undefined)\n ) {\n return;\n }\n fatalError = error;\n finish(\"transport-closed\");\n },\n ).finally(() => {\n tasks.delete(task);\n });\n };\n const detach = group.onSession(startSession);\n sessionRegistrationComplete = true;\n emitReadyEventIfArmed();\n const detachRemoved = group.onSessionRemoved((session) => {\n removedSessions.add(session);\n if (!readyEventEmitted) {\n if (controller.signal.aborted) {\n pendingArming.delete(session);\n resolvedLocations.delete(session);\n return;\n }\n if (pendingArming.has(session)) {\n fatalError = new CfInspectorError(\n \"INSPECTOR_CONNECTION_FAILED\",\n \"A worker detached before logpoint arming completed; no readiness event was emitted.\",\n );\n finish(\"transport-closed\");\n return;\n }\n resolvedLocations.delete(session);\n emitReadyEventIfArmed();\n }\n });\n try {\n await stopped;\n await Promise.allSettled([...tasks]);\n } finally {\n detach();\n detachRemoved();\n detachError();\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n options.signal.removeEventListener(\"abort\", onSignal);\n }\n if (emitted === 0 && isZeroHitStop(reason)) {\n warnOnBoundBreakpointWithoutHit(results.map((result) => result.handle));\n }\n if (fatalError !== undefined) {\n throw fatalError instanceof Error ? fatalError : new Error(\"Unknown logpoint fan-out failure\");\n }\n return { emitted, stoppedReason: reason };\n}\n\nfunction isZeroHitStop(reason: LogGroupResult[\"stoppedReason\"]): boolean {\n return reason === \"duration\" || reason === \"signal\";\n}\n\nfunction writeLogSummary(stoppedReason: string, emitted: number, json: boolean): void {\n if (json) {\n process.stderr.write(`${JSON.stringify({ stopped: stoppedReason, emitted })}\\n`);\n return;\n }\n process.stderr.write(\n `Stopped (${stoppedReason}); emitted ${emitted.toString()} log ${emitted === 1 ? \"entry\" : \"entries\"}.\\n`,\n );\n}\n\nexport const internalsForTesting = {\n runLogGroup,\n};\n","import { removeBreakpoint, setBreakpoint } from \"../inspector/breakpoints.js\";\nimport type { InspectorSession } from \"../inspector/types.js\";\nimport {\n DEFAULT_STREAM_MAX_VALUE_LENGTH,\n resolveMaxValueLength,\n} from \"../snapshot/values.js\";\nimport { CfInspectorError } from \"../types.js\";\nimport type { BreakpointHandle, BreakpointLocation, RemoteRootSetting } from \"../types.js\";\n\nimport { buildLogpointCondition, generateSentinel } from \"./condition.js\";\nimport { asString, parseLogEvent } from \"./events.js\";\nimport type { ConsoleAPICalledParams, LogpointEvent } from \"./events.js\";\n\nexport type LogpointStopReason =\n | \"duration\"\n | \"signal\"\n | \"transport-closed\"\n | \"max-events\";\n\nexport interface LogpointStreamOptions {\n readonly location: BreakpointLocation;\n readonly expression: string;\n readonly remoteRoot?: RemoteRootSetting;\n readonly durationMs?: number;\n readonly maxEvents?: number;\n readonly hitCount?: number;\n readonly condition?: string;\n readonly maxValueLength?: number;\n readonly signal?: AbortSignal;\n readonly eventGate?: () => boolean;\n readonly onEvent: (event: LogpointEvent) => void;\n readonly onBreakpointSet?: (handle: BreakpointHandle) => void;\n}\n\nexport interface LogpointStreamResult {\n readonly handle: BreakpointHandle;\n readonly sentinel: string;\n readonly emitted: number;\n readonly stoppedReason: LogpointStopReason;\n}\n\nfunction validateMaxEvents(maxEvents: number | undefined): number | undefined {\n if (maxEvents === undefined) {\n return undefined;\n }\n if (!Number.isInteger(maxEvents) || maxEvents <= 0) {\n throw new CfInspectorError(\n \"INVALID_ARGUMENT\",\n `maxEvents must be a positive integer, received: ${maxEvents.toString()}`,\n );\n }\n return maxEvents;\n}\n\nfunction validateHitCount(hitCount: number | undefined): number | undefined {\n if (hitCount === undefined) {\n return undefined;\n }\n if (!Number.isInteger(hitCount) || hitCount <= 0) {\n throw new CfInspectorError(\n \"INVALID_HIT_COUNT\",\n `hitCount must be a positive integer, received: ${hitCount.toString()}`,\n );\n }\n return hitCount;\n}\n\nexport async function streamLogpoint(\n session: InspectorSession,\n options: LogpointStreamOptions,\n): Promise<LogpointStreamResult> {\n const maxEvents = validateMaxEvents(options.maxEvents);\n const hitCount = validateHitCount(options.hitCount);\n const maxValueLength = resolveMaxValueLength(\n options.maxValueLength ?? DEFAULT_STREAM_MAX_VALUE_LENGTH,\n );\n const sentinel = generateSentinel();\n const condition = buildLogpointCondition(sentinel, options.expression, {\n ...(options.condition === undefined ? {} : { predicate: options.condition }),\n ...(hitCount === undefined ? {} : { hitCount }),\n });\n let emitted = 0;\n let maxEventsReached = false;\n let stopMaxEvents: (() => void) | undefined;\n const offEvent = session.client.on(\"Runtime.consoleAPICalled\", (raw) => {\n if (maxEventsReached) {\n return;\n }\n const event = toLogpointEvent(raw, sentinel, options.location, maxValueLength);\n if (event === undefined) {\n return;\n }\n if (options.eventGate?.() === false) {\n return;\n }\n emitted += 1;\n try {\n options.onEvent(event);\n } catch {\n // A throwing onEvent must not stop the stream or skip the max-events\n // check below — that would cause us to overshoot the cap on every throw.\n }\n if (maxEvents !== undefined && emitted >= maxEvents) {\n maxEventsReached = true;\n stopMaxEvents?.();\n }\n });\n\n let handle: BreakpointHandle;\n try {\n handle = await setBreakpoint(session, {\n file: options.location.file,\n line: options.location.line,\n ...(options.remoteRoot === undefined ? {} : { remoteRoot: options.remoteRoot }),\n condition,\n });\n } catch (err: unknown) {\n offEvent();\n throw err;\n }\n options.onBreakpointSet?.(handle);\n\n try {\n const reason = await waitForStop(session, options, (signal) => {\n stopMaxEvents = signal;\n if (maxEventsReached) {\n signal();\n }\n });\n return { handle, sentinel, emitted, stoppedReason: reason };\n } finally {\n offEvent();\n await removeBreakpointBestEffort(session, handle.breakpointId);\n }\n}\n\nfunction toLogpointEvent(\n raw: unknown,\n sentinel: string,\n location: BreakpointLocation,\n maxValueLength: number,\n): LogpointEvent | undefined {\n const params = raw as ConsoleAPICalledParams;\n if (asString(params.type) !== \"log\") {\n return undefined;\n }\n const ts = typeof params.timestamp === \"number\" ? params.timestamp : undefined;\n return parseLogEvent(params.args, sentinel, location, ts, maxValueLength);\n}\n\nasync function removeBreakpointBestEffort(\n session: InspectorSession,\n breakpointId: string,\n): Promise<void> {\n try {\n await removeBreakpoint(session, breakpointId);\n } catch {\n // best-effort: tunnel may be gone\n }\n}\n\nasync function waitForStop(\n session: InspectorSession,\n options: LogpointStreamOptions,\n registerMaxEventsSignal: (signal: () => void) => void,\n): Promise<LogpointStopReason> {\n return await new Promise<LogpointStopReason>((resolve) => {\n let settled = false;\n const finish = (reason: LogpointStopReason): void => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n resolve(reason);\n };\n const timer = options.durationMs === undefined\n ? undefined\n : setTimeout(() => {\n finish(\"duration\");\n }, options.durationMs);\n const offClose = session.client.onClose(() => {\n finish(\"transport-closed\");\n });\n const onAbort = (): void => {\n finish(\"signal\");\n };\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n if (options.signal?.aborted === true) {\n finish(\"signal\");\n }\n registerMaxEventsSignal(() => {\n finish(\"max-events\");\n });\n function cleanup(): void {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n offClose();\n options.signal?.removeEventListener(\"abort\", onAbort);\n }\n });\n}\n","import { randomBytes } from \"node:crypto\";\n\nconst SENTINEL_PREFIX = \"__CFI_LOG_\";\nconst SENTINEL_SUFFIX = \"__\";\n\nexport interface LogpointConditionOptions {\n readonly predicate?: string;\n readonly hitCount?: number;\n readonly counterKey?: string;\n}\n\nconst HITS_GLOBAL = \"globalThis.__CFI_LOG_HITS\";\n\nfunction buildLoggingIife(sentinel: string, expression: string): string {\n return [\n \"(function(){\",\n `var s=${JSON.stringify(sentinel)};`,\n \"try{\",\n `var v=(${expression});`,\n \"var r=typeof v==='string'?v:JSON.stringify(v);\",\n \"console.log(s, r);\",\n \"}catch(e){\",\n \"console.log(s, '!err:'+(e&&e.message?e.message:String(e)));\",\n \"}\",\n \"return false;\",\n \"})()\",\n ].join(\"\");\n}\n\nfunction buildHitGate(hitCount: number, counterKey: string): string {\n const keyLiteral = JSON.stringify(counterKey);\n return [\n \"(function(){\",\n `var m=(${HITS_GLOBAL}=${HITS_GLOBAL}||{});`,\n `var k=${keyLiteral};`,\n \"m[k]=(m[k]||0)+1;\",\n `return m[k]>=${hitCount.toString()};`,\n \"})()\",\n ].join(\"\");\n}\n\nfunction combineGuards(guards: readonly string[]): string | undefined {\n const filtered = guards.filter((guard) => guard.length > 0);\n if (filtered.length === 0) {\n return undefined;\n }\n if (filtered.length === 1) {\n return filtered[0];\n }\n return filtered.map((guard) => `(${guard})`).join(\"&&\");\n}\n\nexport function buildLogpointCondition(\n sentinel: string,\n expression: string,\n options: LogpointConditionOptions = {},\n): string {\n const guards: string[] = [];\n if (options.hitCount !== undefined) {\n const counterKey = options.counterKey ?? sentinel;\n guards.push(buildHitGate(options.hitCount, counterKey));\n }\n const userPredicate = options.predicate?.trim();\n if (userPredicate !== undefined && userPredicate.length > 0) {\n guards.push(`(${userPredicate})`);\n }\n const iife = buildLoggingIife(sentinel, expression);\n const guard = combineGuards(guards);\n if (guard === undefined) {\n return iife;\n }\n return `(${guard})?${iife}:false`;\n}\n\nexport function generateSentinel(): string {\n return `${SENTINEL_PREFIX}${randomBytes(8).toString(\"hex\")}${SENTINEL_SUFFIX}`;\n}\n\nexport { SENTINEL_PREFIX };\n","import {\n DEFAULT_STREAM_MAX_VALUE_LENGTH,\n limitValueLength,\n textTruncationFields,\n} from \"../snapshot/values.js\";\nimport type { BreakpointLocation, InspectorIsolate } from \"../types.js\";\n\nexport interface LogpointEvent {\n readonly ts: string;\n readonly at: string;\n readonly value?: string;\n readonly error?: string;\n readonly raw?: string;\n readonly truncated?: true;\n readonly originalLength?: number;\n readonly isolate?: InspectorIsolate;\n}\n\ninterface CdpRemoteObject {\n type?: unknown;\n value?: unknown;\n}\n\nexport interface ConsoleAPICalledParams {\n type?: unknown;\n args?: unknown;\n timestamp?: unknown;\n}\n\nexport function asString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction readArg(arg: unknown, index: number): string | undefined {\n if (typeof arg !== \"object\" || arg === null) {\n return undefined;\n }\n const candidate = arg as CdpRemoteObject;\n if (candidate.type === \"string\" && typeof candidate.value === \"string\") {\n return candidate.value;\n }\n const isPrimitiveType =\n candidate.type === \"number\" ||\n candidate.type === \"boolean\" ||\n candidate.type === \"bigint\";\n const isPrimitiveValue =\n typeof candidate.value === \"number\" ||\n typeof candidate.value === \"boolean\" ||\n typeof candidate.value === \"bigint\";\n if (isPrimitiveType && isPrimitiveValue) {\n return String(candidate.value);\n }\n return index === 0 ? undefined : \"\";\n}\n\nexport function parseLogEvent(\n rawArgs: unknown,\n sentinel: string,\n location: BreakpointLocation,\n timestamp: number | undefined,\n maxValueLength = DEFAULT_STREAM_MAX_VALUE_LENGTH,\n): LogpointEvent | undefined {\n if (!Array.isArray(rawArgs) || rawArgs.length < 2) {\n return undefined;\n }\n const tag = readArg(rawArgs[0], 0);\n if (tag !== sentinel) {\n return undefined;\n }\n const payload = readArg(rawArgs[1], 1) ?? \"\";\n const ts = new Date(typeof timestamp === \"number\" ? timestamp : Date.now()).toISOString();\n const at = `${location.file}:${location.line.toString()}`;\n if (payload.startsWith(\"!err:\")) {\n const limited = limitValueLength(payload.slice(\"!err:\".length), maxValueLength);\n return {\n ts,\n at,\n error: limited.text,\n ...textTruncationFields(limited),\n };\n }\n return parsePayload(ts, at, payload, maxValueLength);\n}\n\nfunction parsePayload(\n ts: string,\n at: string,\n payload: string,\n maxValueLength: number,\n): LogpointEvent {\n try {\n const parsed: unknown = JSON.parse(payload);\n if (typeof parsed === \"string\") {\n return buildValueEvent(ts, at, parsed, maxValueLength);\n }\n return buildValueEvent(ts, at, JSON.stringify(parsed), maxValueLength);\n } catch {\n return buildValueEvent(ts, at, payload, maxValueLength, true);\n }\n}\n\nfunction buildValueEvent(\n ts: string,\n at: string,\n value: string,\n maxValueLength: number,\n includeRaw = false,\n): LogpointEvent {\n const limited = limitValueLength(value, maxValueLength);\n return {\n ts,\n at,\n value: limited.text,\n ...(includeRaw ? { raw: limited.text } : {}),\n ...textTruncationFields(limited),\n };\n}\n","import { performance } from \"node:perf_hooks\";\nimport process from \"node:process\";\n\nimport {\n BreakpointFanout,\n resume,\n runSetupEvals,\n setBreakpoint,\n validateExpression,\n waitForPause,\n} from \"../../inspector/index.js\";\nimport type { InspectorSession } from \"../../inspector/types.js\";\nimport { parseBreakpointSpec, parseRemoteRoot } from \"../../pathMapper.js\";\nimport { captureSnapshot } from \"../../snapshot/capture.js\";\nimport { DEFAULT_MAX_VALUE_LENGTH } from \"../../snapshot/values.js\";\nimport { CfInspectorError } from \"../../types.js\";\nimport type { BreakpointLocation, RemoteRootSetting, SnapshotResult } from \"../../types.js\";\nimport { parseCaptureList } from \"../captureParser.js\";\nimport { DEFAULT_BREAKPOINT_TIMEOUT_SEC } from \"../commandTypes.js\";\nimport type { SnapshotCommandOptions, Target } from \"../commandTypes.js\";\nimport { writeArmedEvent, writeHumanSnapshot, writeJson, writeProgress } from \"../output.js\";\nimport { withTerminationSignal } from \"../signals.js\";\nimport { parsePositiveInt, resolveTargetWithCurrentCfTarget, withSessions } from \"../target.js\";\nimport type { ProgressReporter } from \"../target.js\";\nimport {\n enforceNativeConditionMutationPolicy,\n roundDurationMs,\n warnOnCaptureMutationRisk,\n warnOnBoundBreakpointWithoutHit,\n warnOnMutationRisk,\n warnOnUnboundBreakpoints,\n warnOnUnmatchedPause,\n withPausedDuration,\n} from \"../warnings.js\";\n\ninterface PreparedSnapshotCommand {\n readonly target: Target;\n readonly setupEvals: readonly string[];\n readonly breakpoints: readonly BreakpointLocation[];\n readonly captures: readonly string[];\n readonly remoteRoot: RemoteRootSetting;\n readonly timeoutMs: number;\n readonly maxValueLength: number;\n readonly condition?: string;\n readonly hitCount?: number;\n readonly stackDepth?: number;\n readonly stackCaptures: readonly string[];\n readonly throwOnSideEffect: boolean;\n}\n\nexport async function handleSnapshot(opts: SnapshotCommandOptions): Promise<void> {\n const target = await resolveTargetWithCurrentCfTarget(opts, { useTimeoutForTunnel: false });\n const prepared = prepareSnapshotCommand(opts, target);\n warnOnCaptureMutationRisk(\n [...prepared.captures, ...prepared.stackCaptures],\n opts.allowMutation === true,\n );\n for (const expression of prepared.setupEvals) {\n warnOnMutationRisk(expression, \"snapshot --setup-eval\");\n }\n const reportProgress = opts.quiet === true ? undefined : writeProgress;\n const result = await withTerminationSignal(async (signal) =>\n await runSnapshotCommand(prepared, opts, reportProgress, signal));\n if (opts.json) {\n writeJson(result);\n } else {\n writeHumanSnapshot(result);\n }\n reportProgress?.(\"Snapshot complete.\");\n}\n\nfunction prepareSnapshotCommand(opts: SnapshotCommandOptions, target: Target): PreparedSnapshotCommand {\n if (opts.bp.length === 0) {\n throw new CfInspectorError(\n \"INVALID_BREAKPOINT\",\n \"At least one --bp <file:line> is required.\",\n );\n }\n const timeoutSec = parsePositiveInt(opts.timeout, \"--timeout\") ?? DEFAULT_BREAKPOINT_TIMEOUT_SEC;\n const maxValueLength = parsePositiveInt(opts.maxValueLength, \"--max-value-length\")\n ?? DEFAULT_MAX_VALUE_LENGTH;\n const condition = opts.condition !== undefined && opts.condition.trim().length > 0\n ? opts.condition.trim()\n : undefined;\n const hitCount = parsePositiveInt(opts.hitCount, \"--hit-count\");\n const stackDepth = parsePositiveInt(opts.stackDepth, \"--stack-depth\");\n const setupEvals = parseSetupEvals(opts.setupEval);\n enforceNativeConditionMutationPolicy(\n condition ?? \"\",\n opts.allowMutation === true,\n \"snapshot --condition\",\n );\n return {\n target,\n setupEvals,\n breakpoints: opts.bp.map((spec) => parseBreakpointSpec(spec)),\n captures: parseCaptureList(opts.capture),\n remoteRoot: parseRemoteRoot(opts.remoteRoot),\n timeoutMs: timeoutSec * 1000,\n ...(condition === undefined ? {} : { condition }),\n maxValueLength,\n ...(hitCount === undefined ? {} : { hitCount }),\n ...(stackDepth === undefined ? {} : { stackDepth }),\n stackCaptures: parseCaptureList(opts.stackCaptures),\n throwOnSideEffect: opts.allowMutation !== true,\n };\n}\n\nasync function runSnapshotCommand(\n command: PreparedSnapshotCommand,\n opts: SnapshotCommandOptions,\n reportProgress?: ProgressReporter,\n signal?: AbortSignal,\n): Promise<SnapshotResult> {\n return await withSessions(command.target, async (group): Promise<SnapshotResult> => {\n if (command.setupEvals.length > 0) {\n const setupCount = command.setupEvals.length;\n reportProgress?.(\n `Running ${setupCount.toString()} setup ${setupCount === 1 ? \"evaluation\" : \"evaluations\"}...`,\n );\n }\n if (command.condition !== undefined) {\n reportProgress?.(\"Validating the breakpoint condition...\");\n }\n const breakpointCount = command.breakpoints.length;\n reportProgress?.(\n `Setting ${breakpointCount.toString()} ${breakpointCount === 1 ? \"breakpoint\" : \"breakpoints\"}...`,\n );\n const fanout = new BreakpointFanout(group, async (session, trackHandle) => {\n await prepareSnapshotSession(session, command);\n return { handles: await setCommandBreakpoints(session, command, trackHandle) };\n });\n let winner: InspectorSession | undefined;\n let preserveWinner = false;\n try {\n const reportArmedSetup = (\n outcomes: Parameters<typeof reportBreakpointOutcomes>[0],\n ): void => {\n if (opts.readyEvent === true && signal?.aborted === true) {\n return;\n }\n if (command.setupEvals.length > 0) {\n reportProgress?.(\"Setup evaluation complete.\");\n }\n if (command.condition !== undefined) {\n reportProgress?.(\"Breakpoint condition is valid.\");\n }\n const setup = reportBreakpointOutcomes(outcomes, reportProgress);\n reportProgress?.(\n `Waiting up to ${(command.timeoutMs / 1000).toString()}s for a breakpoint hit...`,\n );\n if (opts.readyEvent === true && signal?.aborted !== true) {\n writeArmedEvent({\n command: \"snapshot\",\n sessions: setup.sessions,\n resolvedLocations: setup.resolvedLocations,\n timeoutMs: command.timeoutMs,\n });\n }\n };\n if (opts.readyEvent === true) {\n await fanout.ready({\n includeNewSessions: true,\n onReady: reportArmedSetup,\n });\n } else {\n await fanout.ready();\n reportArmedSetup(fanout.availableOutcomes());\n }\n const hit = await fanout.waitForFirst(command.timeoutMs, {\n unmatchedPausePolicy: opts.failOnUnmatchedPause === true ? \"fail\" : \"wait-for-resume\",\n ...(opts.failOnUnmatchedPause === true ? {} : { onUnmatchedPause: warnOnUnmatchedPause }),\n }, signal);\n winner = hit.session;\n const captureCount = command.captures.length;\n reportProgress?.(\n `Breakpoint hit; capturing ${captureCount.toString()} ${captureCount === 1 ? \"expression\" : \"expressions\"}...`,\n );\n const result = await captureSnapshotResult(hit.session, hit.pause, command, opts, reportProgress);\n preserveWinner = opts.keepPaused === true;\n return { ...result, isolate: hit.session.isolate ?? { kind: \"main\" } };\n } catch (error: unknown) {\n if (error instanceof CfInspectorError && (\n error.code === \"BREAKPOINT_NOT_HIT\" || error.code === \"UNRELATED_PAUSE_TIMEOUT\"\n )) {\n const outcomes = fanout.availableOutcomes();\n warnOnBoundBreakpointWithoutHit(outcomes.flatMap((outcome) => outcome.setup.handles));\n }\n throw error;\n } finally {\n const cleanup = await fanout.cleanup(2_000, preserveWinner ? winner : undefined);\n reportProgress?.(\n `Breakpoint cleanup: cleared ${cleanup.cleared.toString()} of ${cleanup.attempted.toString()}; resumed ${cleanup.resumed.toString()} paused losing isolates.`,\n );\n }\n }, reportProgress, signal);\n}\n\nasync function prepareSnapshotSession(\n session: InspectorSession,\n command: PreparedSnapshotCommand,\n): Promise<void> {\n if (command.setupEvals.length > 0) {\n await runSetupEvals(session, command.setupEvals);\n }\n if (command.condition !== undefined) {\n await validateExpression(session, command.condition);\n }\n}\n\nfunction reportBreakpointOutcomes(\n outcomes: readonly {\n readonly session: InspectorSession;\n readonly setup: { readonly handles: readonly Awaited<ReturnType<typeof setBreakpoint>>[] };\n }[],\n reportProgress?: ProgressReporter,\n): BreakpointSetupSummary {\n for (const outcome of outcomes) {\n warnOnUnboundBreakpoints(outcome.setup.handles);\n }\n const boundSessions = outcomes.filter((outcome) =>\n outcome.setup.handles.some((handle) => handle.resolvedLocations.length > 0)).length;\n const locations = outcomes.reduce((total, outcome) => total + outcome.setup.handles.reduce(\n (sessionTotal, handle) => sessionTotal + handle.resolvedLocations.length,\n 0,\n ), 0);\n if (outcomes.length === 1) {\n reportProgress?.(\n `Breakpoint setup complete: ${locations.toString()} resolved ${locations === 1 ? \"location\" : \"locations\"}.`,\n );\n return { sessions: outcomes.length, resolvedLocations: locations };\n }\n reportProgress?.(\n `Breakpoint setup complete: sessions=${outcomes.length.toString()} boundSessions=${boundSessions.toString()} resolvedLocations=${locations.toString()}.`,\n );\n return { sessions: outcomes.length, resolvedLocations: locations };\n}\n\ninterface BreakpointSetupSummary {\n readonly sessions: number;\n readonly resolvedLocations: number;\n}\n\nasync function captureSnapshotResult(\n session: InspectorSession,\n pause: Awaited<ReturnType<typeof waitForPause>>,\n command: PreparedSnapshotCommand,\n opts: SnapshotCommandOptions,\n reportProgress?: ProgressReporter,\n): Promise<SnapshotResult> {\n const pausedStartedAt = pause.receivedAtMs ?? performance.now();\n const snapshot = await captureSnapshot(session, pause, {\n captures: command.captures,\n includeScopes: opts.includeScopes === true,\n maxValueLength: command.maxValueLength,\n ...(command.stackDepth === undefined ? {} : { stackDepth: command.stackDepth }),\n stackCaptures: command.stackCaptures,\n throwOnSideEffect: command.throwOnSideEffect,\n });\n if (opts.keepPaused === true) {\n return withPausedDuration(snapshot, null);\n }\n reportProgress?.(\"Snapshot captured; resuming the target...\");\n return await resumeAfterSnapshot(session, snapshot, pausedStartedAt, reportProgress);\n}\n\nasync function runSnapshotOnSession(\n session: InspectorSession,\n command: PreparedSnapshotCommand,\n opts: SnapshotCommandOptions,\n reportProgress?: ProgressReporter,\n): Promise<SnapshotResult> {\n if (command.setupEvals.length > 0) {\n const setupCount = command.setupEvals.length;\n reportProgress?.(`Running ${setupCount.toString()} setup ${setupCount === 1 ? \"evaluation\" : \"evaluations\"}...`);\n await runSetupEvals(session, command.setupEvals);\n reportProgress?.(\"Setup evaluation complete.\");\n }\n\n if (command.condition !== undefined) {\n reportProgress?.(\"Validating the breakpoint condition...\");\n await validateExpression(session, command.condition);\n reportProgress?.(\"Breakpoint condition is valid.\");\n }\n const breakpointCount = command.breakpoints.length;\n reportProgress?.(\n `Setting ${breakpointCount.toString()} ${breakpointCount === 1 ? \"breakpoint\" : \"breakpoints\"}...`,\n );\n const handles = await setCommandBreakpoints(session, command);\n const resolvedCount = handles.reduce(\n (total, handle) => total + handle.resolvedLocations.length,\n 0,\n );\n reportProgress?.(\n `Breakpoint setup complete: ${resolvedCount.toString()} resolved ${resolvedCount === 1 ? \"location\" : \"locations\"}.`,\n );\n warnOnUnboundBreakpoints(handles);\n reportProgress?.(\n `Waiting up to ${(command.timeoutMs / 1000).toString()}s for a breakpoint hit...`,\n );\n if (opts.readyEvent === true) {\n writeArmedEvent({\n command: \"snapshot\",\n sessions: 1,\n resolvedLocations: resolvedCount,\n timeoutMs: command.timeoutMs,\n });\n }\n const pause = await waitForCommandPause(session, opts, handles, command.timeoutMs);\n const captureCount = command.captures.length;\n reportProgress?.(\n `Breakpoint hit; capturing ${captureCount.toString()} ${captureCount === 1 ? \"expression\" : \"expressions\"}...`,\n );\n const pausedStartedAt = pause.receivedAtMs ?? performance.now();\n const snapshot = await captureSnapshot(session, pause, {\n captures: command.captures,\n includeScopes: opts.includeScopes === true,\n maxValueLength: command.maxValueLength,\n ...(command.stackDepth === undefined ? {} : { stackDepth: command.stackDepth }),\n stackCaptures: command.stackCaptures,\n throwOnSideEffect: command.throwOnSideEffect,\n });\n if (opts.keepPaused === true) {\n reportProgress?.(\"Snapshot captured; leaving the target paused as requested.\");\n return withPausedDuration(snapshot, null);\n }\n reportProgress?.(\"Snapshot captured; resuming the target...\");\n return await resumeAfterSnapshot(session, snapshot, pausedStartedAt, reportProgress);\n}\n\nasync function setCommandBreakpoints(\n session: Parameters<typeof setBreakpoint>[0],\n command: PreparedSnapshotCommand,\n onSet?: (handle: Awaited<ReturnType<typeof setBreakpoint>>) => void,\n): Promise<readonly Awaited<ReturnType<typeof setBreakpoint>>[]> {\n return await Promise.all(\n command.breakpoints.map((bp) =>\n setBreakpoint(session, {\n file: bp.file,\n line: bp.line,\n remoteRoot: command.remoteRoot,\n ...(command.condition === undefined ? {} : { condition: command.condition }),\n ...(command.hitCount === undefined ? {} : { hitCount: command.hitCount }),\n }).then((handle) => {\n onSet?.(handle);\n return handle;\n }),\n ),\n );\n}\n\nasync function waitForCommandPause(\n session: Parameters<typeof waitForPause>[0],\n opts: SnapshotCommandOptions,\n handles: readonly Awaited<ReturnType<typeof setBreakpoint>>[],\n timeoutMs: number,\n): ReturnType<typeof waitForPause> {\n let warnedUnmatchedPause = false;\n try {\n return await waitForPause(session, {\n timeoutMs,\n breakpointIds: handles.map((h) => h.breakpointId),\n unmatchedPausePolicy: opts.failOnUnmatchedPause === true ? \"fail\" : \"wait-for-resume\",\n onUnmatchedPause: (unmatchedPause) => {\n if (warnedUnmatchedPause || opts.failOnUnmatchedPause === true) {\n return;\n }\n warnedUnmatchedPause = true;\n warnOnUnmatchedPause(unmatchedPause);\n },\n });\n } catch (error: unknown) {\n if (\n error instanceof CfInspectorError &&\n (error.code === \"BREAKPOINT_NOT_HIT\" || error.code === \"UNRELATED_PAUSE_TIMEOUT\")\n ) {\n warnOnBoundBreakpointWithoutHit(handles);\n }\n throw error;\n }\n}\n\nasync function resumeAfterSnapshot(\n session: Parameters<typeof resume>[0],\n snapshot: Awaited<ReturnType<typeof captureSnapshot>>,\n pausedStartedAt: number,\n reportProgress?: ProgressReporter,\n): Promise<SnapshotResult> {\n try {\n await resume(session);\n reportProgress?.(\"Target resumed.\");\n return withPausedDuration(snapshot, roundDurationMs(performance.now() - pausedStartedAt));\n } catch {\n process.stderr.write(\n \"[cf-inspector] warning: Debugger.resume failed after snapshot; pausedDurationMs is unknown.\\n\",\n );\n return withPausedDuration(snapshot, null);\n }\n}\n\nfunction parseSetupEvals(raw: unknown): readonly string[] {\n const values: readonly unknown[] = Array.isArray(raw) ? raw : [];\n return values\n .filter((expr): expr is string => typeof expr === \"string\" && expr.trim().length > 0)\n .map((expr) => expr.trim());\n}\n\nexport const internalsForTesting = {\n parseSetupEvals,\n prepareSnapshotCommand,\n runSnapshotCommand,\n runSnapshotOnSession,\n};\n","import { performance } from \"node:perf_hooks\";\nimport process from \"node:process\";\n\nimport { startInspectorKeepalive } from \"../../inspector/discovery.js\";\nimport {\n BreakpointFanout,\n resume,\n runSetupEvals,\n setBreakpoint,\n validateExpression,\n waitForPause,\n} from \"../../inspector/index.js\";\nimport type { InspectorSession, InspectorSessionGroup } from \"../../inspector/types.js\";\nimport { parseBreakpointSpec, parseRemoteRoot } from \"../../pathMapper.js\";\nimport { captureSnapshot } from \"../../snapshot/capture.js\";\nimport { DEFAULT_STREAM_MAX_VALUE_LENGTH } from \"../../snapshot/values.js\";\nimport { CfInspectorError } from \"../../types.js\";\nimport type { BreakpointHandle, BreakpointLocation, RemoteRootSetting, WatchEvent } from \"../../types.js\";\nimport { parseCaptureList } from \"../captureParser.js\";\nimport { DEFAULT_BREAKPOINT_TIMEOUT_SEC } from \"../commandTypes.js\";\nimport type { Target, WatchCommandOptions } from \"../commandTypes.js\";\nimport { writeArmedEvent, writeJson, writeWatchEvent } from \"../output.js\";\nimport { withTerminationSignal } from \"../signals.js\";\nimport { parsePositiveInt, resolveTargetWithCurrentCfTarget, withSessions } from \"../target.js\";\nimport {\n enforceNativeConditionMutationPolicy,\n warnOnBoundBreakpointWithoutHit,\n warnOnCaptureMutationRisk,\n warnOnMutationRisk,\n warnOnUnboundBreakpoints,\n} from \"../warnings.js\";\n\ninterface PreparedWatchCommand {\n readonly target: Target;\n readonly setupEvals: readonly string[];\n readonly breakpoints: readonly BreakpointLocation[];\n readonly captures: readonly string[];\n readonly remoteRoot: RemoteRootSetting;\n readonly perHitTimeoutMs: number;\n readonly durationMs?: number;\n readonly maxEvents?: number;\n readonly maxValueLength: number;\n readonly condition?: string;\n readonly hitCount?: number;\n readonly stackDepth?: number;\n readonly stackCaptures: readonly string[];\n readonly throwOnSideEffect: boolean;\n}\n\ntype WatchStopReason = \"duration\" | \"signal\" | \"max-events\" | \"transport-closed\";\n\nexport async function handleWatch(opts: WatchCommandOptions): Promise<void> {\n const target = await resolveTargetWithCurrentCfTarget(opts, { useTimeoutForTunnel: false });\n const prepared = prepareWatchCommand(opts, target);\n warnOnCaptureMutationRisk(\n [...prepared.captures, ...prepared.stackCaptures],\n opts.allowMutation === true,\n );\n for (const expression of prepared.setupEvals) {\n warnOnMutationRisk(expression, \"watch --setup-eval\");\n }\n let stoppedReason: WatchStopReason = \"signal\";\n let emitted = 0;\n await withTerminationSignal(async (signal) => {\n await withSessions(prepared.target, async (group, port) => {\n const host = prepared.target.kind === \"port\" ? prepared.target.host : \"127.0.0.1\";\n const keepalive = startInspectorKeepalive(host, port);\n const commandAbort = new AbortController();\n const onSignal = (): void => {\n commandAbort.abort();\n };\n signal.addEventListener(\"abort\", onSignal, { once: true });\n let keepaliveError: unknown;\n void keepalive.failure.catch((error: unknown) => {\n keepaliveError = error;\n commandAbort.abort();\n });\n try {\n const result = await runWatchGroup(group, prepared, opts, commandAbort.signal);\n stoppedReason = result.stoppedReason;\n emitted = result.emitted;\n if (keepaliveError !== undefined) {\n throw keepaliveError instanceof Error\n ? keepaliveError\n : new Error(\"Unknown inspector keepalive failure\");\n }\n } finally {\n keepalive.cancel();\n signal.removeEventListener(\"abort\", onSignal);\n }\n }, undefined, signal);\n });\n writeWatchSummary(stoppedReason, emitted, opts.json);\n}\n\nasync function runWatchGroup(\n group: InspectorSessionGroup,\n command: PreparedWatchCommand,\n opts: WatchCommandOptions,\n signal: AbortSignal,\n): Promise<WatchLoopResult> {\n const fanout = new BreakpointFanout(group, async (session, trackHandle) => {\n if (command.setupEvals.length > 0) {\n await runSetupEvals(session, command.setupEvals);\n }\n if (command.condition !== undefined) {\n await validateExpression(session, command.condition);\n }\n const handles = await Promise.all(command.breakpoints.map((bp) =>\n setBreakpoint(session, {\n file: bp.file,\n line: bp.line,\n remoteRoot: command.remoteRoot,\n ...(command.condition === undefined ? {} : { condition: command.condition }),\n ...(command.hitCount === undefined ? {} : { hitCount: command.hitCount }),\n }).then((handle) => {\n trackHandle(handle);\n return handle;\n })));\n warnOnUnboundBreakpoints(handles);\n return { handles };\n });\n let emitted = 0;\n let stoppedReason: WatchStopReason = \"signal\";\n const deadline = computeDeadline(command.durationMs);\n try {\n await fanout.ready(opts.readyEvent === true\n ? {\n includeNewSessions: true,\n onReady: (outcomes) => {\n if (\n signal.aborted ||\n remainingForLoop(deadline, command.perHitTimeoutMs) <= 0\n ) {\n return;\n }\n writeArmedEvent({\n command: \"watch\",\n sessions: outcomes.length,\n resolvedLocations: outcomes.reduce(\n (total, outcome) => total + outcome.setup.handles.reduce(\n (sessionTotal, handle) => sessionTotal + handle.resolvedLocations.length,\n 0,\n ),\n 0,\n ),\n timeoutMs: command.perHitTimeoutMs,\n });\n },\n }\n : {});\n while (!signal.aborted) {\n const remainingMs = remainingForLoop(deadline, command.perHitTimeoutMs);\n if (remainingMs <= 0) {\n stoppedReason = \"duration\";\n break;\n }\n let hit;\n try {\n hit = await fanout.waitForFirst(remainingMs, { unmatchedPausePolicy: \"wait-for-resume\" }, signal);\n } catch (error: unknown) {\n if (error instanceof CfInspectorError && error.code === \"ABORTED\") {\n stoppedReason = \"signal\";\n break;\n }\n if (error instanceof CfInspectorError && (\n error.code === \"BREAKPOINT_NOT_HIT\" || error.code === \"UNRELATED_PAUSE_TIMEOUT\"\n )) {\n if (deadline !== undefined && performance.now() >= deadline) {\n stoppedReason = \"duration\";\n break;\n }\n continue;\n }\n throw error;\n }\n const event = await captureWatchEvent(hit.session, command, hit.pause, emitted + 1, opts);\n emitted += 1;\n writeWatchEvent({ ...event, isolate: hit.session.isolate ?? { kind: \"main\" } }, opts.json);\n try {\n await resume(hit.session);\n hit.session.debuggerState.paused = false;\n } catch {\n process.stderr.write(\"[cf-inspector] warning: Debugger.resume failed during watch.\\n\");\n stoppedReason = \"transport-closed\";\n break;\n }\n if (command.maxEvents !== undefined && emitted >= command.maxEvents) {\n stoppedReason = \"max-events\";\n break;\n }\n }\n if (signal.aborted) {\n stoppedReason = \"signal\";\n }\n } finally {\n const cleanup = await fanout.cleanup();\n process.stderr.write(\n `[cf-inspector] breakpoint cleanup: cleared ${cleanup.cleared.toString()} of ${cleanup.attempted.toString()}; resumed ${cleanup.resumed.toString()} paused isolates.\\n`,\n );\n }\n if (emitted === 0 && (stoppedReason === \"duration\" || stoppedReason === \"signal\")) {\n const outcomes = fanout.availableOutcomes();\n warnOnBoundBreakpointWithoutHit(outcomes.flatMap((outcome) => outcome.setup.handles));\n }\n return { emitted, stoppedReason };\n}\n\nfunction prepareWatchCommand(opts: WatchCommandOptions, target: Target): PreparedWatchCommand {\n if (opts.bp.length === 0) {\n throw new CfInspectorError(\n \"INVALID_BREAKPOINT\",\n \"At least one --bp <file:line> is required.\",\n );\n }\n const perHitTimeoutSec = parsePositiveInt(opts.timeout, \"--timeout\") ?? DEFAULT_BREAKPOINT_TIMEOUT_SEC;\n const durationSec = parsePositiveInt(opts.duration, \"--duration\");\n const maxEvents = parsePositiveInt(opts.maxEvents, \"--max-events\");\n const maxValueLength = parsePositiveInt(opts.maxValueLength, \"--max-value-length\")\n ?? DEFAULT_STREAM_MAX_VALUE_LENGTH;\n const hitCount = parsePositiveInt(opts.hitCount, \"--hit-count\");\n const stackDepth = parsePositiveInt(opts.stackDepth, \"--stack-depth\");\n const condition = opts.condition !== undefined && opts.condition.trim().length > 0\n ? opts.condition.trim()\n : undefined;\n const setupEvals = parseSetupEvals(opts.setupEval);\n enforceNativeConditionMutationPolicy(\n condition ?? \"\",\n opts.allowMutation === true,\n \"watch --condition\",\n );\n return {\n target,\n setupEvals,\n breakpoints: opts.bp.map((spec) => parseBreakpointSpec(spec)),\n captures: parseCaptureList(opts.capture),\n remoteRoot: parseRemoteRoot(opts.remoteRoot),\n perHitTimeoutMs: perHitTimeoutSec * 1000,\n ...(durationSec === undefined ? {} : { durationMs: durationSec * 1000 }),\n ...(maxEvents === undefined ? {} : { maxEvents }),\n maxValueLength,\n ...(condition === undefined ? {} : { condition }),\n ...(hitCount === undefined ? {} : { hitCount }),\n ...(stackDepth === undefined ? {} : { stackDepth }),\n stackCaptures: parseCaptureList(opts.stackCaptures),\n throwOnSideEffect: opts.allowMutation !== true,\n };\n}\n\ninterface WatchLoopResult {\n readonly emitted: number;\n readonly stoppedReason: WatchStopReason;\n}\n\nasync function runWatchLoop(\n session: InspectorSession,\n command: PreparedWatchCommand,\n opts: WatchCommandOptions,\n signal: AbortSignal,\n): Promise<WatchLoopResult> {\n if (command.setupEvals.length > 0) {\n await runSetupEvals(session, command.setupEvals);\n }\n\n if (command.condition !== undefined) {\n await validateExpression(session, command.condition);\n }\n const handles = await Promise.all(\n command.breakpoints.map((bp) =>\n setBreakpoint(session, {\n file: bp.file,\n line: bp.line,\n remoteRoot: command.remoteRoot,\n ...(command.condition === undefined ? {} : { condition: command.condition }),\n ...(command.hitCount === undefined ? {} : { hitCount: command.hitCount }),\n }),\n ),\n );\n warnOnUnboundBreakpoints(handles);\n if (opts.readyEvent === true && !signal.aborted) {\n writeArmedEvent({\n command: \"watch\",\n sessions: 1,\n resolvedLocations: handles.reduce(\n (total, handle) => total + handle.resolvedLocations.length,\n 0,\n ),\n timeoutMs: command.perHitTimeoutMs,\n });\n }\n\n const deadline = computeDeadline(command.durationMs);\n let emitted = 0;\n const state: { stopped: boolean; reason: WatchStopReason } = { stopped: false, reason: \"signal\" };\n\n const setStop = (reason: WatchStopReason): void => {\n if (state.stopped) {\n return;\n }\n state.reason = reason;\n state.stopped = true;\n };\n\n const transportClosed = waitForTransportClose(session);\n transportClosed.promise.then(() => {\n setStop(\"transport-closed\");\n }).catch(() => {\n /* swallowed: best-effort signal */\n });\n\n try {\n while (!state.stopped) {\n if (signal.aborted) {\n setStop(\"signal\");\n break;\n }\n const remainingMs = remainingForLoop(deadline, command.perHitTimeoutMs);\n if (remainingMs <= 0) {\n setStop(\"duration\");\n break;\n }\n const pause = await waitForNextWatchPause(session, handles, remainingMs, signal);\n if (pause === \"signal\") {\n setStop(\"signal\");\n break;\n }\n if (pause === \"timeout\") {\n if (deadline !== undefined && performance.now() >= deadline) {\n setStop(\"duration\");\n break;\n }\n continue;\n }\n const event = await captureWatchEvent(session, command, pause, emitted + 1, opts);\n emitted += 1;\n writeWatchEvent(event, opts.json);\n try {\n await resume(session);\n } catch {\n process.stderr.write(\"[cf-inspector] warning: Debugger.resume failed during watch.\\n\");\n setStop(\"transport-closed\");\n break;\n }\n if (command.maxEvents !== undefined && emitted >= command.maxEvents) {\n setStop(\"max-events\");\n break;\n }\n }\n } finally {\n transportClosed.cancel();\n }\n\n if (emitted === 0 && (state.reason === \"duration\" || state.reason === \"signal\")) {\n warnOnBoundBreakpointWithoutHit(handles);\n }\n return { emitted, stoppedReason: state.reason };\n}\n\nfunction computeDeadline(durationMs: number | undefined): number | undefined {\n if (durationMs === undefined) {\n return undefined;\n }\n return performance.now() + durationMs;\n}\n\nfunction remainingForLoop(deadline: number | undefined, perHitTimeoutMs: number): number {\n if (deadline === undefined) {\n return perHitTimeoutMs;\n }\n const remaining = deadline - performance.now();\n if (remaining <= 0) {\n return 0;\n }\n return Math.min(remaining, perHitTimeoutMs);\n}\n\ninterface TransportClosedHandle {\n readonly promise: Promise<void>;\n cancel(): void;\n}\n\nfunction waitForTransportClose(session: InspectorSession): TransportClosedHandle {\n let cancelled = false;\n let resolve: (() => void) | undefined;\n const promise = new Promise<void>((res) => {\n resolve = res;\n });\n const off = session.client.onClose(() => {\n if (!cancelled) {\n resolve?.();\n }\n });\n return {\n promise,\n cancel: (): void => {\n cancelled = true;\n off();\n resolve?.();\n },\n };\n}\n\nasync function waitForNextWatchPause(\n session: InspectorSession,\n handles: readonly BreakpointHandle[],\n timeoutMs: number,\n signal: AbortSignal,\n): Promise<Awaited<ReturnType<typeof waitForPause>> | \"signal\" | \"timeout\"> {\n if (signal.aborted) {\n return \"signal\";\n }\n try {\n return await waitForPause(session, {\n timeoutMs,\n breakpointIds: handles.map((h) => h.breakpointId),\n unmatchedPausePolicy: \"wait-for-resume\",\n signal,\n });\n } catch (err: unknown) {\n if (err instanceof CfInspectorError) {\n if (err.code === \"ABORTED\") {\n return \"signal\";\n }\n if (err.code === \"BREAKPOINT_NOT_HIT\") {\n return \"timeout\";\n }\n if (err.code === \"UNRELATED_PAUSE_TIMEOUT\") {\n return \"timeout\";\n }\n }\n throw err;\n }\n}\n\nasync function captureWatchEvent(\n session: InspectorSession,\n command: PreparedWatchCommand,\n pause: Awaited<ReturnType<typeof waitForPause>>,\n hit: number,\n opts: WatchCommandOptions,\n): Promise<WatchEvent> {\n const snapshot = await captureSnapshot(session, pause, {\n captures: command.captures,\n includeScopes: opts.includeScopes === true,\n maxValueLength: command.maxValueLength,\n ...(command.stackDepth === undefined ? {} : { stackDepth: command.stackDepth }),\n stackCaptures: command.stackCaptures,\n throwOnSideEffect: command.throwOnSideEffect,\n });\n const at = formatLocation(command, snapshot.topFrame);\n const base: WatchEvent = {\n ts: new Date().toISOString(),\n at,\n hit,\n reason: snapshot.reason,\n hitBreakpoints: snapshot.hitBreakpoints,\n captures: snapshot.captures,\n };\n const withFrame = snapshot.topFrame === undefined ? base : { ...base, topFrame: snapshot.topFrame };\n const withStack = snapshot.stack === undefined ? withFrame : { ...withFrame, stack: snapshot.stack };\n return snapshot.exception === undefined ? withStack : { ...withStack, exception: snapshot.exception };\n}\n\nfunction formatLocation(\n command: PreparedWatchCommand,\n topFrame: { url?: string; line: number } | undefined,\n): string {\n if (topFrame?.url !== undefined) {\n return `${topFrame.url}:${topFrame.line.toString()}`;\n }\n const first = command.breakpoints[0];\n if (first === undefined) {\n return \"(unknown)\";\n }\n return `${first.file}:${first.line.toString()}`;\n}\n\nfunction writeWatchSummary(reason: WatchStopReason, emitted: number, json: boolean): void {\n if (json) {\n process.stderr.write(`${JSON.stringify({ stopped: reason, emitted })}\\n`);\n return;\n }\n process.stderr.write(\n `Stopped (${reason}); emitted ${emitted.toString()} watch ${emitted === 1 ? \"event\" : \"events\"}.\\n`,\n );\n}\n\nfunction parseSetupEvals(raw: unknown): readonly string[] {\n const values: readonly unknown[] = Array.isArray(raw) ? raw : [];\n return values\n .filter((expr): expr is string => typeof expr === \"string\" && expr.trim().length > 0)\n .map((expr) => expr.trim());\n}\n\nexport const internalsForTesting = {\n formatLocation,\n computeDeadline,\n remainingForLoop,\n parseSetupEvals,\n prepareWatchCommand,\n runWatchLoop,\n writeJson,\n};\n"],"mappings":"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","names":["wrapped","process","process","readFileSync","join","request","spawn","homedir","constants","dirname","join","constants","dirname","join","realpathSync","dirname","join","dirname","join","realpathSync","readFileSync","join","readFileSync","join","latest","rmSync","dirname","join","join","dirname","rmSync","defaultRuntime","homedir","spawn","notify","process","fetchJson","process","performance","isRecord","isUnknownRecord","main","performance","constants","homedir","join","isRecord","processStart","process","process","process","process","process","process","process","performance","process","performance","performance","performance","performance","out","asString","buildResult","process","performance","process","process","process","formatIsolate","process","HITS_GLOBAL","asString","validateHitCount","asString","process","performance","process","performance","performance","process","performance","process","performance","process","parseSetupEvals","performance","remaining","process","parseSetupEvals","process","process"]}
1
+ {"version":3,"sources":["../src/types.ts","../src/cdp/wsTransport.ts","../src/cli.ts","../src/cli/program.ts","../../core/src/package-metadata.ts","../../core/src/records.ts","../../core/src/saptools-paths.ts","../../core/src/self-update/reexec.ts","../../core/src/self-update/policy.ts","../../core/src/self-update/run.ts","../../core/src/self-update/install-location.ts","../../core/src/self-update/installer.ts","../../core/src/self-update/registry.ts","../../core/src/self-update/semver.ts","../../core/src/self-update/state.ts","../../core/src/self-update/commander.ts","../../core/src/cloud-logging/instance-discovery.ts","../../core/src/cloud-logging/credential-cache.ts","../../core/src/cloud-logging/result-store.ts","../src/cli/commands/attach.ts","../src/inspector/discovery.ts","../src/cli/output.ts","../src/cli/target.ts","../src/cf/tunnel.ts","../src/inspector/session.ts","../src/cdp/client.ts","../src/inspector/conversions.ts","../src/cli/commandTypes.ts","../src/cli/sessionLock.ts","../src/cli/warnings.ts","../src/cli/captureParser.ts","../src/cli/commands/checkBreakpoint.ts","../src/pathMapper.ts","../src/inspector/breakpoints.ts","../src/cli/commands/eval.ts","../src/inspector/runtime.ts","../src/cli/commands/exception.ts","../src/inspector/pause.ts","../src/inspector/fanout.ts","../src/snapshot/evaluation.ts","../src/snapshot/values.ts","../src/snapshot/properties.ts","../src/snapshot/exception.ts","../src/snapshot/objects.ts","../src/snapshot/scopes.ts","../src/snapshot/stack.ts","../src/snapshot/capture.ts","../src/cli/signals.ts","../src/cli/commands/listScripts.ts","../src/cli/commands/log.ts","../src/logpoint/stream.ts","../src/logpoint/condition.ts","../src/logpoint/events.ts","../src/cli/commands/snapshot.ts","../src/cli/commands/watch.ts"],"sourcesContent":["export type CfInspectorErrorCode =\n | \"INVALID_ARGUMENT\"\n | \"INVALID_BREAKPOINT\"\n | \"INVALID_REMOTE_ROOT\"\n | \"INVALID_EXPRESSION\"\n | \"MUTATION_NOT_ALLOWED\"\n | \"SETUP_EVAL_FAILED\"\n | \"INVALID_HIT_COUNT\"\n | \"INVALID_PAUSE_TYPE\"\n | \"BREAKPOINT_DID_NOT_BIND\"\n | \"INSPECTOR_DISCOVERY_FAILED\"\n | \"INSPECTOR_CONNECTION_FAILED\"\n | \"TARGET_ALREADY_DEBUGGED\"\n | \"CDP_REQUEST_FAILED\"\n | \"BREAKPOINT_NOT_HIT\"\n | \"UNRELATED_PAUSE\"\n | \"UNRELATED_PAUSE_TIMEOUT\"\n | \"EVALUATION_FAILED\"\n | \"MISSING_TARGET\"\n | \"ABORTED\";\n\nexport class CfInspectorError extends Error {\n public readonly code: CfInspectorErrorCode;\n public readonly detail?: string;\n\n public constructor(code: CfInspectorErrorCode, message: string, detail?: string) {\n super(message);\n this.name = \"CfInspectorError\";\n this.code = code;\n if (detail !== undefined) {\n this.detail = detail;\n }\n }\n}\n\nexport interface BreakpointLocation {\n readonly file: string;\n readonly line: number;\n}\n\nexport interface RemoteRootLiteral {\n readonly kind: \"literal\";\n readonly value: string;\n}\n\nexport interface RemoteRootRegex {\n readonly kind: \"regex\";\n readonly pattern: string;\n readonly flags: string;\n}\n\nexport interface RemoteRootNone {\n readonly kind: \"none\";\n}\n\nexport type RemoteRootSetting = RemoteRootLiteral | RemoteRootRegex | RemoteRootNone;\n\nexport interface BreakpointHandle {\n readonly breakpointId: string;\n readonly file: string;\n readonly line: number;\n readonly urlRegex: string;\n readonly resolvedLocations: readonly ResolvedLocation[];\n}\n\nexport interface ScriptLocation {\n readonly scriptId: string;\n readonly lineNumber: number;\n readonly columnNumber?: number;\n}\n\nexport interface BreakLocation extends ScriptLocation {\n readonly type?: string;\n}\n\nexport interface ResolvedLocation extends ScriptLocation {\n readonly url?: string;\n}\n\nexport interface GetPossibleBreakpointsOptions {\n readonly start: ScriptLocation;\n readonly end?: ScriptLocation;\n readonly restrictToFunction?: boolean;\n}\n\nexport interface SetBreakpointAtLocationInput {\n readonly location: ScriptLocation;\n readonly condition?: string;\n}\n\nexport interface ExactBreakpointHandle {\n readonly breakpointId: string;\n readonly requestedLocation: ScriptLocation;\n readonly actualLocation: ScriptLocation;\n}\n\nexport interface RemoteObjectInfo {\n readonly type: string;\n readonly subtype?: string;\n readonly className?: string;\n readonly completeness?: \"truncated\" | \"unavailable\";\n readonly value?: unknown;\n readonly unserializableValue?: string;\n readonly description?: string;\n readonly deepSerializedValue?: unknown;\n readonly objectId?: string;\n readonly preview?: unknown;\n readonly customPreview?: unknown;\n}\n\nexport interface StackTraceIdInfo {\n readonly id: string;\n readonly debuggerId?: string;\n}\n\nexport interface StackTraceFrameInfo {\n readonly functionName: string;\n readonly scriptId: string;\n readonly url: string;\n readonly lineNumber: number;\n readonly columnNumber: number;\n}\n\nexport interface StackTraceInfo {\n readonly description?: string;\n readonly callFrames: readonly StackTraceFrameInfo[];\n readonly parent?: StackTraceInfo;\n readonly parentId?: StackTraceIdInfo;\n}\n\nexport interface CallFrameInfo {\n readonly callFrameId: string;\n readonly functionName: string;\n readonly scriptId?: string;\n readonly functionLocation?: ScriptLocation;\n readonly url?: string;\n readonly lineNumber: number;\n readonly columnNumber: number;\n readonly scopeChain: readonly ScopeInfo[];\n readonly thisObject?: RemoteObjectInfo;\n readonly returnValue?: RemoteObjectInfo;\n}\n\nexport interface ScopeInfo {\n readonly type: string;\n readonly objectId?: string;\n readonly object?: RemoteObjectInfo;\n readonly name?: string;\n readonly startLocation?: ScriptLocation;\n readonly endLocation?: ScriptLocation;\n}\n\nexport interface PauseEvent {\n readonly reason: string;\n readonly hitBreakpoints: readonly string[];\n readonly callFrames: readonly CallFrameInfo[];\n readonly receivedAtMs?: number;\n readonly data?: unknown;\n readonly asyncStackTrace?: StackTraceInfo;\n readonly asyncStackTraceId?: StackTraceIdInfo;\n readonly asyncCallStackTraceId?: StackTraceIdInfo;\n}\n\nexport interface VariableSnapshot {\n readonly name: string;\n readonly value: string;\n readonly type?: string;\n readonly children?: readonly VariableSnapshot[];\n readonly truncated?: true;\n readonly originalLength?: number;\n readonly omittedCount?: number;\n}\n\nexport interface ScopeSnapshot {\n readonly type: string;\n readonly variables: readonly VariableSnapshot[];\n readonly truncated?: true;\n readonly omittedCount?: number;\n}\n\nexport interface FrameSnapshot {\n readonly functionName: string;\n readonly url?: string;\n readonly line: number;\n readonly column: number;\n readonly scopes?: readonly ScopeSnapshot[];\n readonly captures?: readonly CapturedExpression[];\n readonly truncated?: true;\n readonly omittedCount?: number;\n}\n\nexport interface CapturedExpression {\n readonly expression: string;\n readonly value?: string;\n readonly type?: string;\n readonly error?: string;\n readonly mutationRisk?: boolean;\n readonly blocked?: true;\n readonly truncated?: true;\n readonly originalLength?: number;\n readonly omittedCount?: number;\n}\n\nexport interface ExceptionSnapshot {\n readonly value?: string;\n readonly type?: string;\n readonly description?: string;\n readonly error?: string;\n readonly truncated?: true;\n readonly originalLength?: number;\n readonly valueOriginalLength?: number;\n readonly descriptionOriginalLength?: number;\n readonly omittedCount?: number;\n}\n\nexport interface SnapshotCaptureResult {\n readonly reason: string;\n readonly hitBreakpoints: readonly string[];\n readonly capturedAt: string;\n readonly topFrame?: FrameSnapshot;\n readonly captures: readonly CapturedExpression[];\n readonly stack?: readonly FrameSnapshot[];\n readonly exception?: ExceptionSnapshot;\n readonly isolate?: InspectorIsolate;\n}\n\nexport interface SnapshotResult extends SnapshotCaptureResult {\n readonly pausedDurationMs: number | null;\n}\n\nexport interface WatchEvent {\n readonly ts: string;\n readonly at: string;\n readonly hit: number;\n readonly reason: string;\n readonly hitBreakpoints: readonly string[];\n readonly topFrame?: FrameSnapshot;\n readonly captures: readonly CapturedExpression[];\n readonly stack?: readonly FrameSnapshot[];\n readonly exception?: ExceptionSnapshot;\n readonly isolate?: InspectorIsolate;\n}\n\nexport type InspectorIsolate =\n | { readonly kind: \"main\" }\n | { readonly kind: \"worker\"; readonly workerId: string };\n\nexport type ArmedCommand = \"snapshot\" | \"watch\" | \"exception\" | \"log\";\n\nexport interface ArmedEvent {\n readonly event: \"breakpoint-armed\";\n readonly schemaVersion: 1;\n readonly command: ArmedCommand;\n readonly sessions: number;\n readonly resolvedLocations: number | null;\n readonly timeoutMs: number | null;\n}\n\nexport interface ScriptInfo {\n readonly scriptId: string;\n readonly url: string;\n readonly startLine?: number;\n readonly startColumn?: number;\n readonly endLine?: number;\n readonly endColumn?: number;\n readonly executionContextId?: number;\n readonly hash?: string;\n readonly buildId?: string;\n readonly executionContextAuxData?: unknown;\n readonly sourceMapURL?: string;\n readonly hasSourceURL?: boolean;\n readonly isModule?: boolean;\n readonly length?: number;\n readonly stackTrace?: StackTraceInfo;\n}\n\nexport interface ListedScriptInfo extends ScriptInfo {\n readonly isolate: InspectorIsolate;\n}\n\nexport interface InspectorConnectOptions {\n readonly port: number;\n readonly host?: string;\n readonly connectTimeoutMs?: number;\n readonly targetIndex?: number;\n readonly workerIndex?: number;\n readonly workerId?: string;\n}\n\nexport type CdpMessage =\n | { readonly id: number; readonly result: unknown }\n | { readonly id: number; readonly error: { readonly code: number; readonly message: string } }\n | { readonly method: string; readonly params: unknown };\n","import { WebSocket } from \"ws\";\n\nimport { CfInspectorError } from \"../types.js\";\n\nimport type { CdpTransport, CdpTransportEventMap } from \"./client.js\";\n\nexport interface WsTransportOptions {\n readonly connectTimeoutMs?: number;\n}\n\nexport async function wsTransportFactory(\n url: string,\n options: WsTransportOptions = {},\n): Promise<CdpTransport> {\n const socket = new WebSocket(url, { perMessageDeflate: false });\n await waitForOpen(socket, url, options.connectTimeoutMs);\n // Keyed by `(event, listener)` — registering the same listener function for\n // two different events must produce two distinct wrappers; otherwise `off`\n // for one event would unsubscribe the wrong wrapper.\n const wrappers = new Map<keyof CdpTransportEventMap, WeakMap<object, (...args: unknown[]) => void>>();\n\n function wrappersFor(event: keyof CdpTransportEventMap): WeakMap<object, (...args: unknown[]) => void> {\n const existing = wrappers.get(event);\n if (existing !== undefined) {\n return existing;\n }\n const created = new WeakMap<object, (...args: unknown[]) => void>();\n wrappers.set(event, created);\n return created;\n }\n\n return {\n send(payload: string): void {\n socket.send(payload);\n },\n close(): void {\n socket.close();\n },\n get readyState(): number {\n return socket.readyState;\n },\n on(event, listener): void {\n const wrapped = wrapListener(event, listener);\n wrappersFor(event).set(listener as object, wrapped);\n socket.on(event, wrapped);\n },\n off(event, listener): void {\n const wrapped = wrappersFor(event).get(listener as object);\n if (!wrapped) {\n return;\n }\n socket.off(event, wrapped);\n },\n };\n}\n\nasync function waitForOpen(socket: WebSocket, url: string, timeoutMs: number | undefined): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n const cleanup = (): void => {\n socket.off(\"open\", onOpen);\n socket.off(\"error\", onError);\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n };\n const onOpen = (): void => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n resolve();\n };\n const onError = (err: Error): void => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n reject(\n new CfInspectorError(\n \"INSPECTOR_CONNECTION_FAILED\",\n `Failed to connect to inspector at ${url}: ${err.message}`,\n ),\n );\n };\n const timer = timeoutMs === undefined ? undefined : setTimeout(() => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n // Absorb the 'error' event that ws emits asynchronously when terminate()\n // races an in-flight handshake. Without this swallower the post-cleanup\n // error becomes an unhandled exception.\n socket.on(\"error\", () => {\n // swallow\n });\n try {\n socket.terminate();\n } catch {\n // best-effort\n }\n reject(\n new CfInspectorError(\n \"INSPECTOR_CONNECTION_FAILED\",\n `WebSocket handshake to ${url} timed out after ${timeoutMs.toString()}ms`,\n ),\n );\n }, timeoutMs);\n socket.once(\"open\", onOpen);\n socket.once(\"error\", onError);\n });\n}\n\nfunction wrapListener<E extends keyof CdpTransportEventMap>(\n event: E,\n listener: CdpTransportEventMap[E],\n): (...args: unknown[]) => void {\n if (event === \"message\") {\n const wrapped = (data: Buffer): void => {\n (listener as CdpTransportEventMap[\"message\"])(data.toString(\"utf8\"));\n };\n return wrapped as (...args: unknown[]) => void;\n }\n if (event === \"close\") {\n const wrapped = (): void => {\n (listener as CdpTransportEventMap[\"close\"])();\n };\n return wrapped as (...args: unknown[]) => void;\n }\n const wrapped = (err: Error): void => {\n (listener as CdpTransportEventMap[\"error\"])(err);\n };\n return wrapped as (...args: unknown[]) => void;\n}\n","import process from \"node:process\";\n\nimport { main } from \"./cli/program.js\";\nimport { CfInspectorError } from \"./types.js\";\n\ntry {\n await main(process.argv);\n} catch (err: unknown) {\n if (err instanceof CfInspectorError) {\n process.stderr.write(`Error [${err.code}]: ${err.message}\\n`);\n if (err.detail !== undefined) {\n process.stderr.write(` detail: ${err.detail}\\n`);\n }\n process.exit(1);\n }\n const message = err instanceof Error ? err.message : String(err);\n process.stderr.write(`Error: ${message}\\n`);\n process.exit(1);\n}\n","import process from \"node:process\";\n\nimport { attachSelfUpdate, readPackageMetadata, registerSelfUpdateCommand } from \"@saptools/core\";\nimport { Command } from \"commander\";\n\nimport type {\n AttachCommandOptions,\n CheckBreakpointCommandOptions,\n EvalCommandOptions,\n ExceptionCommandOptions,\n ListScriptsCommandOptions,\n ListTargetsCommandOptions,\n LogCommandOptions,\n SnapshotCommandOptions,\n WatchCommandOptions,\n} from \"./commandTypes.js\";\nimport { handleAttach } from \"./commands/attach.js\";\nimport { handleCheckBreakpoint } from \"./commands/checkBreakpoint.js\";\nimport { handleEval } from \"./commands/eval.js\";\nimport { handleException } from \"./commands/exception.js\";\nimport { handleListScripts, handleListTargets } from \"./commands/listScripts.js\";\nimport { handleLog } from \"./commands/log.js\";\nimport { handleSnapshot } from \"./commands/snapshot.js\";\nimport { handleWatch } from \"./commands/watch.js\";\n\nfunction applyTargetOptions(\n cmd: Command,\n options: {\n readonly includeTarget?: boolean;\n readonly includeTimeout?: boolean;\n readonly includeWorker?: boolean;\n } = {},\n): Command {\n const withEndpointOptions = cmd\n .option(\"--port <number>\", \"Local port the inspector or tunnel listens on\")\n .option(\"--host <host>\", \"Hostname (default: 127.0.0.1)\", \"127.0.0.1\")\n .option(\"--region <key>\", \"CF region key (required with --app)\")\n .option(\"--api-endpoint <url>\", \"CF API endpoint override for --region\")\n .option(\"--org <name>\", \"CF org name (required with --app)\")\n .option(\"--space <name>\", \"CF space name (required with --app)\")\n .option(\n \"--app <name>\",\n \"CF app name; requires explicit --region/--org/--space (ambient cf target is ignored)\",\n );\n const withTargetOption = options.includeTarget === false\n ? withEndpointOptions\n : withEndpointOptions.option(\n \"--target <index>\",\n \"Inspector target index from /json/list (default: 0)\",\n );\n const withWorkerOption = options.includeWorker === false\n ? withTargetOption\n : withTargetOption\n .option(\"--worker <index>\", \"NodeWorker sub-session index listed by list-targets\")\n .option(\"--worker-id <id>\", \"Stable NodeWorker workerId listed by list-targets\")\n .option(\"--main-only\", \"Attach only to the main isolate and ignore workers\");\n return options.includeTimeout === false\n ? withWorkerOption\n : withWorkerOption.option(\"--timeout <seconds>\", \"Timeout for CF tunnel readiness in seconds (default: 180)\");\n}\n\nconst collectStrings = (value: string, prev: readonly string[] = []): readonly string[] => [\n ...prev,\n value,\n];\n\nconst READY_EVENT_DESCRIPTION =\n \"Emit a versioned breakpoint-armed JSON event on stderr after every current isolate is armed\";\n\n/**\n * Update notices go to stderr like every other diagnostic, except under\n * `--emit-ready-event`, where stderr carries a machine-parsed JSON event and\n * must stay clean; the update itself still happens.\n */\nfunction writeUpdateNotice(argv: readonly string[], line: string): void {\n if (argv.includes(\"--emit-ready-event\")) {\n return;\n }\n process.stderr.write(`cf-inspector: ${line}\\n`);\n}\n\nexport async function main(argv: readonly string[]): Promise<void> {\n const { version } = readPackageMetadata(import.meta.url, \"@saptools/cf-inspector\");\n // Every command first checks npm (at most once an hour) and re-runs itself on a newer release; see `@saptools/core`.\n const selfUpdate = {\n packageName: \"@saptools/cf-inspector\",\n currentVersion: version,\n binName: \"cf-inspector\",\n envPrefix: \"CF_INSPECTOR\",\n notice: (line: string): void => {\n writeUpdateNotice(argv, line);\n },\n };\n const program = new Command();\n program\n .name(\"cf-inspector\")\n .version(version)\n .description(\"Drive a Node.js inspector from the command line — set breakpoints, capture snapshots, evaluate expressions\");\n attachSelfUpdate(program, selfUpdate);\n\n registerSnapshot(program);\n registerLog(program);\n registerWatch(program);\n registerException(program);\n registerCheckBreakpoint(program);\n registerEval(program);\n registerListScripts(program);\n registerListTargets(program);\n registerAttach(program);\n registerSelfUpdateCommand(program, selfUpdate);\n\n await program.parseAsync([...argv]);\n}\n\nfunction registerCheckBreakpoint(program: Command): void {\n applyTargetOptions(\n program.command(\"check-breakpoint\").description(\n \"Report whether a loaded script can break at a file:line location\",\n ),\n )\n .requiredOption(\"--bp <file:line>\", \"Source location to check\")\n .option(\"--remote-root <value>\", \"Path-mapping anchor: literal path or regex:<pattern> / /pattern/flags\")\n .option(\"--no-json\", \"Print a human-readable result instead of JSON\")\n .action(async (opts: CheckBreakpointCommandOptions): Promise<void> => {\n await handleCheckBreakpoint(opts);\n });\n}\n\nfunction registerSnapshot(program: Command): void {\n applyTargetOptions(\n program.command(\"snapshot\").description(\"Set a breakpoint, wait for it to hit, capture expressions, and resume\"),\n { includeTimeout: false },\n )\n .option(\"--bp <file:line>\", \"Breakpoint location (repeatable; first hit wins), e.g. src/handler.ts:42\", collectStrings, [] as readonly string[])\n .option(\"--capture <expr,…>\", \"Top-level comma-separated expressions to evaluate in the paused frame\")\n .option(\"--setup-eval <expr>\", \"Evaluate a global setup expression before breakpoint setup (repeatable)\", collectStrings, [] as readonly string[])\n .option(\"--timeout <seconds>\", \"How long to wait for the breakpoint to hit (default: 30)\")\n .option(\"--max-value-length <chars>\", \"Maximum characters per captured value before truncation (default: 131072)\")\n .option(\"--remote-root <value>\", \"Path-mapping anchor: literal path or regex:<pattern> / /pattern/flags\")\n .option(\"--condition <expr>\", \"Only pause when this JS expression evaluates truthy in the paused frame\")\n .option(\"--hit-count <n>\", \"Only pause after the breakpoint has been hit N or more times\")\n .option(\"--stack-depth <n>\", \"Walk this many call frames when capturing (default: 1, only top frame)\")\n .option(\"--stack-captures <expr,…>\", \"Expressions to evaluate on each call frame in the stack\")\n .option(\"--allow-mutation\", \"Allow mutation-capable captures and native breakpoint conditions to run\")\n .option(\"--include-scopes\", \"Include expanded paused-frame scopes in the snapshot\")\n .option(\"--no-json\", \"Print a human-readable summary instead of JSON\")\n .option(\"--quiet\", \"Suppress progress messages on stderr\")\n .option(\"--ready-event\", READY_EVENT_DESCRIPTION)\n .option(\"--keep-paused\", \"Skip Debugger.resume after capture; Node may resume when this CLI disconnects\")\n .option(\"--fail-on-unmatched-pause\", \"Fail immediately if the target pauses somewhere else\")\n .action(async (opts: SnapshotCommandOptions): Promise<void> => {\n await handleSnapshot(opts);\n });\n}\n\nfunction registerLog(program: Command): void {\n applyTargetOptions(\n program.command(\"log\").description(\"Stream a non-pausing logpoint: log an expression each time a line executes\"),\n )\n .requiredOption(\"--at <file:line>\", \"Logpoint location, e.g. src/handler.ts:42\")\n .requiredOption(\"--expr <expression>\", \"JavaScript expression to log on each hit\")\n .option(\"--remote-root <value>\", \"Path-mapping anchor: literal path or regex:<pattern> / /pattern/flags\")\n .option(\"--duration <seconds>\", \"Stop streaming after N seconds (default: run until SIGINT)\")\n .option(\"--max-events <n>\", \"Stop streaming after emitting N log events\")\n .option(\"--hit-count <n>\", \"Start logging once the line has been hit N or more times\")\n .option(\"--condition <expr>\", \"Only log when this JS expression evaluates truthy on the inspectee\")\n .option(\"--max-value-length <chars>\", \"Maximum characters per log value before truncation (default: 4096)\")\n .option(\"--no-json\", \"Print human-readable lines instead of JSON Lines\")\n .option(\"--ready-event\", READY_EVENT_DESCRIPTION)\n .action(async (opts: LogCommandOptions): Promise<void> => {\n await handleLog(opts);\n });\n}\n\nfunction registerWatch(program: Command): void {\n applyTargetOptions(\n program.command(\"watch\").description(\"Stream a snapshot per breakpoint hit (multi-shot watch); resume between hits\"),\n { includeTimeout: false },\n )\n .option(\"--bp <file:line>\", \"Breakpoint location (repeatable), e.g. src/handler.ts:42\", collectStrings, [] as readonly string[])\n .option(\"--capture <expr,…>\", \"Top-level comma-separated expressions to evaluate per hit\")\n .option(\"--setup-eval <expr>\", \"Evaluate a global setup expression before breakpoint setup (repeatable)\", collectStrings, [] as readonly string[])\n .option(\"--condition <expr>\", \"Only emit hits where this JS expression evaluates truthy\")\n .option(\"--hit-count <n>\", \"Start emitting after the line has been hit N or more times\")\n .option(\"--remote-root <value>\", \"Path-mapping anchor: literal path or regex:<pattern> / /pattern/flags\")\n .option(\"--duration <seconds>\", \"Stop streaming after N seconds (default: run until SIGINT)\")\n .option(\"--max-events <n>\", \"Stop streaming after emitting N watch events\")\n .option(\"--timeout <seconds>\", \"How long to wait for the next hit before giving up (default: 30)\")\n .option(\"--max-value-length <chars>\", \"Maximum characters per captured value before truncation (default: 4096)\")\n .option(\"--stack-depth <n>\", \"Walk this many call frames per hit (default: 1)\")\n .option(\"--stack-captures <expr,…>\", \"Expressions to evaluate on each call frame\")\n .option(\"--allow-mutation\", \"Allow mutation-capable captures and native breakpoint conditions to run\")\n .option(\"--include-scopes\", \"Include expanded paused-frame scopes per hit\")\n .option(\"--no-json\", \"Print human-readable lines instead of JSON Lines\")\n .option(\"--ready-event\", READY_EVENT_DESCRIPTION)\n .action(async (opts: WatchCommandOptions): Promise<void> => {\n await handleWatch(opts);\n });\n}\n\nfunction registerException(program: Command): void {\n applyTargetOptions(\n program.command(\"exception\").description(\"Pause on a thrown exception, capture the value and frame, then resume\"),\n { includeTimeout: false },\n )\n .option(\"--type <state>\", \"Pause type: uncaught (default), caught, or all\")\n .option(\"--capture <expr,…>\", \"Top-level comma-separated expressions to evaluate in the paused frame\")\n .option(\"--remote-root <value>\", \"Path-mapping anchor: literal path or regex:<pattern> / /pattern/flags\")\n .option(\"--timeout <seconds>\", \"How long to wait for an exception (default: 30)\")\n .option(\"--max-value-length <chars>\", \"Maximum characters per captured value before truncation (default: 131072)\")\n .option(\"--stack-depth <n>\", \"Walk this many call frames when capturing (default: 1)\")\n .option(\"--stack-captures <expr,…>\", \"Expressions to evaluate on each call frame in the stack\")\n .option(\"--allow-mutation\", \"Allow mutation-capable capture expressions to run\")\n .option(\"--include-scopes\", \"Include expanded paused-frame scopes in the snapshot\")\n .option(\"--keep-paused\", \"Skip Debugger.resume after capture; Node may resume when this CLI disconnects\")\n .option(\"--no-json\", \"Print a human-readable summary instead of JSON\")\n .option(\"--ready-event\", READY_EVENT_DESCRIPTION)\n .action(async (opts: ExceptionCommandOptions): Promise<void> => {\n await handleException(opts);\n });\n}\n\nfunction registerEval(program: Command): void {\n applyTargetOptions(\n program.command(\"eval\").description(\"Evaluate an expression against the global Runtime\"),\n )\n .requiredOption(\"--expr <expression>\", \"JavaScript expression to evaluate\")\n .option(\"--no-json\", \"Print only the resulting value, not the full CDP envelope\")\n .action(async (opts: EvalCommandOptions): Promise<void> => {\n await handleEval(opts);\n });\n}\n\nfunction registerListScripts(program: Command): void {\n applyTargetOptions(\n program.command(\"list-scripts\").description(\n \"Print scripts from the main isolate and every worker, tagged by isolate\",\n ),\n )\n .option(\"--filter <pattern>\", \"Only include script URLs matching this pattern\")\n .option(\"--no-json\", \"Print scriptId<TAB>url<TAB>isolate instead of JSON\")\n .action(async (opts: ListScriptsCommandOptions): Promise<void> => {\n await handleListScripts(opts);\n });\n}\n\nfunction registerListTargets(program: Command): void {\n applyTargetOptions(\n program.command(\"list-targets\").description(\n \"List raw /json/list targets and nested workers; use --target or --worker on other commands\",\n ),\n { includeTarget: false, includeWorker: false },\n )\n .option(\n \"--no-json\",\n \"Print tab-separated target/worker rows: index, kind, type, title, and URL\",\n )\n .action(async (opts: ListTargetsCommandOptions): Promise<void> => {\n await handleListTargets(opts);\n });\n}\n\nfunction registerAttach(program: Command): void {\n applyTargetOptions(\n program.command(\"attach\").description(\"Connect, fetch the inspector version, and disconnect (smoke-test)\"),\n { includeTarget: false, includeWorker: false },\n )\n .option(\"--no-json\", \"Print a multi-line summary instead of JSON\")\n .action(async (opts: AttachCommandOptions): Promise<void> => {\n await handleAttach(opts);\n });\n}\n","import { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { isRecord, readString } from \"./records.js\";\n\nexport interface PackageMetadata {\n readonly name: string;\n readonly version: string;\n /** Directory that holds the package.json. */\n readonly directory: string;\n}\n\n/**\n * A bundled CLI lives at `<package>/dist/cli.js`; a source file under test at\n * `<package>/src/...`; tsup chunks one level deeper. Six levels covers every\n * layout in this repo with room to spare while still failing fast on a stray\n * file outside any package.\n */\nconst MAX_WALK_UP = 6;\n\n/** Parse `<directory>/package.json`; undefined when missing, unreadable, or not a manifest with name and version. */\nexport function readPackageManifest(directory: string): PackageMetadata | undefined {\n let raw: string;\n try {\n raw = readFileSync(join(directory, \"package.json\"), \"utf8\");\n } catch {\n return;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return;\n }\n if (!isRecord(parsed)) {\n return;\n }\n const name = readString(parsed, \"name\");\n const version = readString(parsed, \"version\");\n if (name === undefined || version === undefined) {\n return;\n }\n return { name, version, directory };\n}\n\n/** Walk up from `startDirectory` to the nearest package.json whose `name` is `expectedName`. */\nexport function findPackageMetadata(startDirectory: string, expectedName: string): PackageMetadata | undefined {\n let current = startDirectory;\n for (let depth = 0; depth < MAX_WALK_UP; depth += 1) {\n const manifest = readPackageManifest(current);\n if (manifest?.name === expectedName) {\n return manifest;\n }\n const parent = dirname(current);\n if (parent === current) {\n return;\n }\n current = parent;\n }\n return;\n}\n\n/**\n * Version and name of the package that owns the calling module, read from its\n * package.json at runtime so `--version` and the self-updater can never drift\n * from the manifest the way a hand-maintained constant does. Throws when the\n * manifest cannot be found: a broken install should fail loudly, not report\n * \"0.0.0\".\n */\nexport function readPackageMetadata(importMetaUrl: string, expectedName: string): PackageMetadata {\n const startDirectory = dirname(fileURLToPath(importMetaUrl));\n const found = findPackageMetadata(startDirectory, expectedName);\n if (found === undefined) {\n throw new Error(`Cannot find the package.json of ${expectedName} above ${startDirectory}`);\n }\n return found;\n}\n","export function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/** A non-empty string field of a parsed JSON object, or undefined when absent or of another type. */\nexport function readString(record: Record<string, unknown>, key: string): string | undefined {\n const value = record[key];\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n","import { chmodSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport const SAPTOOLS_DIR_NAME = \".saptools\";\n/** Relocates every saptools state file at once; packages may still offer their own narrower override. */\nexport const SAPTOOLS_ROOT_ENV = \"SAPTOOLS_ROOT\";\n\nexport function resolveSaptoolsRoot(explicit?: string, env: NodeJS.ProcessEnv = process.env): string {\n if (explicit !== undefined && explicit.length > 0) {\n return explicit;\n }\n const fromEnv = env[SAPTOOLS_ROOT_ENV];\n if (fromEnv !== undefined && fromEnv.length > 0) {\n return fromEnv;\n }\n return join(homedir(), SAPTOOLS_DIR_NAME);\n}\n\n/**\n * Create `directory` (and missing parents) readable by the current user only.\n * Only the leaf has its mode enforced: parents such as `~/.saptools` itself\n * belong to every tool and keep whatever mode they already have.\n */\nexport function ensurePrivateDirectorySync(directory: string): void {\n mkdirSync(directory, { recursive: true, mode: 0o700 });\n try {\n chmodSync(directory, 0o700);\n } catch {\n // Filesystems without POSIX modes (some network mounts, Windows) reject chmod; the directory still exists.\n }\n}\n\n/**\n * Replace `path` atomically: write a sibling temp file with `mode`, then\n * rename it over the target, so a concurrent reader never sees a half-written\n * file and a crash never leaves a truncated one behind.\n */\nexport function writeFileAtomicSync(path: string, data: string, mode = 0o600): void {\n const temp = `${path}.${String(process.pid)}.${Math.random().toString(36).slice(2, 8)}.tmp`;\n try {\n writeFileSync(temp, data, { encoding: \"utf8\", mode });\n try {\n chmodSync(temp, mode);\n } catch {\n // Same as above: best effort where modes are unsupported.\n }\n renameSync(temp, path);\n } catch (error) {\n rmSync(temp, { force: true });\n throw error;\n }\n}\n\n/** Parse a JSON file; a missing or malformed file reads as undefined so corrupt state can never break a command. */\nexport function readJsonFileSync(path: string): unknown {\n let raw: string;\n try {\n raw = readFileSync(path, \"utf8\");\n } catch {\n return;\n }\n try {\n return JSON.parse(raw) as unknown;\n } catch {\n return;\n }\n}\n","import { spawn } from \"node:child_process\";\nimport { constants } from \"node:os\";\n\nimport type { SpawnLike } from \"./process-types.js\";\n\n/** Set on the re-executed process so it can never start a second update. */\nexport const REEXEC_MARKER_ENV = \"SAPTOOLS_SELF_UPDATE_REEXEC\";\n\nexport interface ReexecRequest {\n readonly execPath: string;\n readonly execArgv: readonly string[];\n readonly binPath: string;\n readonly args: readonly string[];\n readonly env: NodeJS.ProcessEnv;\n}\n\n/** Resolves only when the re-executed command has finished and the replacement failed to end this process itself. */\nexport type ReexecImpl = (request: ReexecRequest) => Promise<void>;\n\ntype ExecveLike = (file: string, args: readonly string[], env: NodeJS.ProcessEnv) => never;\n\nexport interface ReexecRuntime {\n readonly platform: NodeJS.Platform;\n readonly execve: ExecveLike | undefined;\n readonly spawnImpl: SpawnLike;\n readonly onSignal: (signal: NodeJS.Signals, handler: (signal: NodeJS.Signals) => void) => void;\n readonly offSignal: (signal: NodeJS.Signals, handler: (signal: NodeJS.Signals) => void) => void;\n readonly kill: (pid: number, signal: NodeJS.Signals) => void;\n readonly exit: (code: number) => void;\n}\n\nconst FORWARDED_SIGNALS: readonly NodeJS.Signals[] = [\"SIGINT\", \"SIGTERM\", \"SIGHUP\"];\n\nfunction nativeExecve(): ExecveLike | undefined {\n return process.execve?.bind(process);\n}\n\nfunction defaultRuntime(): ReexecRuntime {\n return {\n platform: process.platform,\n execve: nativeExecve(),\n spawnImpl: spawn,\n onSignal: (signal, handler): void => {\n process.on(signal, handler);\n },\n offSignal: (signal, handler): void => {\n process.off(signal, handler);\n },\n kill: (pid, signal): void => {\n process.kill(pid, signal);\n },\n exit: (code): void => {\n process.exit(code);\n },\n };\n}\n\nexport function buildReexecArgv(request: ReexecRequest): string[] {\n return [...request.execArgv, request.binPath, ...request.args];\n}\n\nexport function reexecEnvironment(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n return { ...env, [REEXEC_MARKER_ENV]: \"1\" };\n}\n\nfunction signalExitCode(signal: NodeJS.Signals): number {\n const number = constants.signals[signal];\n return 128 + number;\n}\n\n/**\n * Run the same command again on the freshly installed version. On POSIX with\n * Node >= 22.15 the process image is replaced outright (`execve`), so stdin,\n * stdout, the exit code and signals all belong to the new version with no\n * wrapper left behind. Elsewhere a child inherits our stdio, terminal signals\n * are forwarded to it, and we mirror its exit code or signal.\n */\nexport async function reexecProcess(request: ReexecRequest, runtimeOverrides: Partial<ReexecRuntime> = {}): Promise<void> {\n const runtime: ReexecRuntime = { ...defaultRuntime(), ...runtimeOverrides };\n const argv = buildReexecArgv(request);\n const env = reexecEnvironment(request.env);\n\n if (runtime.platform !== \"win32\" && runtime.execve !== undefined) {\n try {\n runtime.execve(request.execPath, [request.execPath, ...argv], env);\n } catch {\n // execve refused (for example EACCES on an odd mount): the child-process route below still works.\n }\n }\n\n await new Promise<void>((resolve, reject) => {\n const child = runtime.spawnImpl(request.execPath, argv, { stdio: \"inherit\", env });\n const forward = (signal: NodeJS.Signals): void => {\n child.kill(signal);\n };\n for (const signal of FORWARDED_SIGNALS) {\n runtime.onSignal(signal, forward);\n }\n const detach = (): void => {\n for (const signal of FORWARDED_SIGNALS) {\n runtime.offSignal(signal, forward);\n }\n };\n child.once(\"error\", (error) => {\n detach();\n reject(error);\n });\n child.once(\"exit\", (code, signal) => {\n detach();\n if (signal === null) {\n runtime.exit(code ?? 1);\n } else {\n runtime.kill(process.pid, signal);\n runtime.exit(signalExitCode(signal));\n }\n resolve();\n });\n });\n}\n","import type { InstallLocation } from \"./install-location.js\";\nimport { REEXEC_MARKER_ENV } from \"./reexec.js\";\n\nexport type UpdatePolicy = \"on\" | \"notify\" | \"off\";\n\nexport const POLICY_ENV = \"SAPTOOLS_AUTO_UPDATE\";\nexport const INTERVAL_ENV = \"SAPTOOLS_UPDATE_INTERVAL_MINUTES\";\nexport const DEBUG_ENV = \"SAPTOOLS_UPDATE_DEBUG\";\nexport const DEFAULT_CHECK_INTERVAL_MINUTES = 60;\nexport const SELF_UPDATE_COMMAND = \"self-update\";\n\nexport interface PolicyDecision {\n readonly policy: UpdatePolicy;\n readonly reason: string;\n /** True when the user set the policy through the environment rather than relying on the default. */\n readonly explicit: boolean;\n}\n\nexport interface ResolvePolicyInput {\n readonly env: NodeJS.ProcessEnv;\n readonly envPrefix?: string;\n readonly location: InstallLocation;\n /** Space-joined command path being run, e.g. `credential list`; empty for the root action. */\n readonly commandPath?: string;\n readonly skipCommands?: readonly string[];\n /** The explicit `self-update` command: ignore the exclusions and CI/test gates, but never the install-location facts. */\n readonly manual?: boolean;\n}\n\nexport function parsePolicy(raw: string | undefined): UpdatePolicy | undefined {\n if (raw === undefined) {\n return;\n }\n const value = raw.trim().toLowerCase();\n if ([\"on\", \"1\", \"true\", \"yes\", \"auto\", \"always\"].includes(value)) {\n return \"on\";\n }\n if ([\"notify\", \"check\"].includes(value)) {\n return \"notify\";\n }\n if ([\"off\", \"0\", \"false\", \"no\", \"never\", \"disabled\"].includes(value)) {\n return \"off\";\n }\n return;\n}\n\n/** `CI=true`, `CI=1`, even `CI=yes` count; `CI=0`, `CI=false` and an empty value do not. */\nexport function isTruthyFlag(raw: string | undefined): boolean {\n return raw !== undefined && ![\"\", \"0\", \"false\", \"no\", \"off\"].includes(raw.trim().toLowerCase());\n}\n\nfunction readExplicitPolicy(env: NodeJS.ProcessEnv, envPrefix: string | undefined): UpdatePolicy | undefined {\n const perPackage = envPrefix === undefined ? undefined : parsePolicy(env[`${envPrefix}_AUTO_UPDATE`]);\n return perPackage ?? parsePolicy(env[POLICY_ENV]);\n}\n\nfunction off(reason: string, explicit: boolean): PolicyDecision {\n return { policy: \"off\", reason, explicit };\n}\n\nfunction notify(reason: string, explicit: boolean): PolicyDecision {\n return { policy: \"notify\", reason, explicit };\n}\n\nfunction locationDecision(location: InstallLocation, explicit: boolean): PolicyDecision | undefined {\n switch (location.kind) {\n case \"local\":\n return off(\"running from a source checkout or linked package, not a package-manager install\", explicit);\n case \"npx\":\n return off(\"running through npx or dlx, which resolves the version on its own\", explicit);\n case \"unknown\":\n return notify(`install location not recognized (${location.detail})`, explicit);\n case \"npm-global\":\n case \"pnpm-global\":\n case \"yarn-global\":\n case \"bun-global\":\n case \"volta\":\n return;\n }\n}\n\n/**\n * Decide what this invocation may do. Order matters: the re-exec marker and\n * the command exclusions are absolute, an explicit `off` wins next, then the\n * environment defaults (CI, test runs) that only an explicit setting\n * overrides, and only then the facts about the install: a checkout can never\n * be upgraded by npm, a read-only prefix can only be announced.\n */\nexport function resolveUpdatePolicy(input: ResolvePolicyInput): PolicyDecision {\n const { env, location } = input;\n const manual = input.manual === true;\n const explicit = readExplicitPolicy(env, input.envPrefix);\n\n if (!manual && isTruthyFlag(env[REEXEC_MARKER_ENV])) {\n return off(\"already re-executed after an update\", false);\n }\n const commandPath = input.commandPath ?? \"\";\n if (!manual && (commandPath === SELF_UPDATE_COMMAND || (input.skipCommands ?? []).includes(commandPath))) {\n return off(`the \"${commandPath}\" command is excluded from automatic updates`, false);\n }\n if (!manual && explicit === \"off\") {\n return off(`${POLICY_ENV} is off`, true);\n }\n if (!manual && explicit === undefined) {\n if (isTruthyFlag(env[\"NO_UPDATE_NOTIFIER\"])) {\n return off(\"NO_UPDATE_NOTIFIER is set\", false);\n }\n if (isTruthyFlag(env[\"CI\"])) {\n return off(\"running in CI\", false);\n }\n if (env[\"NODE_ENV\"] === \"test\") {\n return off(\"NODE_ENV is test\", false);\n }\n }\n const byLocation = locationDecision(location, explicit !== undefined);\n if (byLocation !== undefined) {\n return byLocation;\n }\n if (!location.writable) {\n return notify(\"the install directory is not writable by this user\", explicit !== undefined);\n }\n if (manual) {\n return { policy: \"on\", reason: \"requested explicitly\", explicit: true };\n }\n return explicit === undefined\n ? { policy: \"on\", reason: \"default\", explicit: false }\n : { policy: explicit, reason: `${POLICY_ENV} is ${explicit}`, explicit: true };\n}\n\n/** Minutes between registry checks; `0` checks on every run. Invalid values fall back to the default. */\nexport function resolveCheckIntervalMs(env: NodeJS.ProcessEnv): number {\n const raw = env[INTERVAL_ENV];\n if (raw === undefined) {\n return DEFAULT_CHECK_INTERVAL_MINUTES * 60_000;\n }\n const minutes = Number(raw.trim());\n if (!Number.isFinite(minutes) || minutes < 0) {\n return DEFAULT_CHECK_INTERVAL_MINUTES * 60_000;\n }\n return Math.round(minutes * 60_000);\n}\n","import { spawn } from \"node:child_process\";\nimport { homedir } from \"node:os\";\n\nimport { readPackageManifest } from \"../package-metadata.js\";\nimport { errorMessage } from \"../records.js\";\nimport { resolveSaptoolsRoot } from \"../saptools-paths.js\";\n\nimport { detectInstallLocation } from \"./install-location.js\";\nimport type { InstallLocation } from \"./install-location.js\";\nimport { buildInstallCommand, DEFAULT_INSTALL_TIMEOUT_MS, manualInstallCommand, runInstall } from \"./installer.js\";\nimport { DEBUG_ENV, isTruthyFlag, resolveCheckIntervalMs, resolveUpdatePolicy } from \"./policy.js\";\nimport type { PolicyDecision } from \"./policy.js\";\nimport type { SpawnLike } from \"./process-types.js\";\nimport { reexecProcess } from \"./reexec.js\";\nimport type { ReexecImpl } from \"./reexec.js\";\nimport { DEFAULT_CHECK_TIMEOUT_MS, fetchLatestVersion, readUserNpmrc, resolveRegistryUrl } from \"./registry.js\";\nimport { isNewerRelease } from \"./semver.js\";\nimport {\n acquireUpdateLock,\n clearFailure,\n EMPTY_UPDATE_STATE,\n readUpdateState,\n updateLockPath,\n updateStatePath,\n writeUpdateState,\n} from \"./state.js\";\nimport type { UpdateState } from \"./state.js\";\n\nexport interface SelfUpdateOptions {\n /** npm package name, e.g. `@saptools/cf-metrics`. */\n readonly packageName: string;\n /** The running version, read from package.json (see readPackageMetadata). */\n readonly currentVersion: string;\n /** Executable name used as the prefix of every notice, e.g. `cf-metrics`. */\n readonly binName: string;\n /** Per-package override namespace: `CF_METRICS` honours `CF_METRICS_AUTO_UPDATE`. */\n readonly envPrefix?: string;\n /** Space-joined command paths that must never trigger an update (internal workers, daemons). */\n readonly skipCommands?: readonly string[];\n /** The command being run, supplied by the commander hook. */\n readonly commandPath?: string;\n readonly saptoolsRoot?: string;\n /** Where notices go; defaults to `<binName>: <line>` on stderr. Never stdout. */\n readonly notice?: (line: string) => void;\n /** The explicit `self-update` command: ignore the check interval, backoffs and policy gates. */\n readonly manual?: boolean;\n /** Re-run the command on the new version after installing (default true). */\n readonly reexec?: boolean;\n}\n\nexport interface SelfUpdateRuntime {\n readonly env: NodeJS.ProcessEnv;\n readonly argv: readonly string[];\n readonly execPath: string;\n readonly execArgv: readonly string[];\n readonly platform: NodeJS.Platform;\n readonly homeDirectory: string;\n readonly now: () => Date;\n readonly fetchImpl: typeof fetch;\n readonly spawnImpl: SpawnLike;\n readonly reexecImpl: ReexecImpl;\n readonly checkTimeoutMs: number;\n readonly installTimeoutMs: number;\n readonly realpath?: (path: string) => string;\n readonly isWritable?: (path: string) => boolean;\n readonly exists?: (path: string) => boolean;\n}\n\nexport type SelfUpdateOutcome =\n | { readonly kind: \"skipped\"; readonly reason: string }\n | { readonly kind: \"current\"; readonly latest: string }\n | { readonly kind: \"notified\"; readonly latest: string; readonly reason: string }\n | { readonly kind: \"updated\"; readonly from: string; readonly to: string }\n | { readonly kind: \"failed\"; readonly latest: string; readonly reason: string };\n\nexport interface SelfUpdateStatus {\n readonly packageName: string;\n readonly installed: string;\n readonly location: InstallLocation;\n readonly policy: PolicyDecision;\n readonly registryUrl: string;\n readonly statePath: string;\n readonly latest: string | undefined;\n readonly checkError: string | undefined;\n}\n\n/** After a failed registry call, stay quiet this long instead of paying the timeout on every command. */\nconst FAILURE_BACKOFF_MS = 15 * 60_000;\n/** A version we already announced is not announced again for a day. */\nconst NOTIFY_INTERVAL_MS = 24 * 60 * 60_000;\n/** A version whose install failed is not retried for a day; the notice carries the manual command instead. */\nconst INSTALL_RETRY_BACKOFF_MS = 24 * 60 * 60_000;\n\ninterface Context {\n readonly options: SelfUpdateOptions;\n readonly runtime: SelfUpdateRuntime;\n readonly binPath: string;\n readonly location: InstallLocation;\n readonly decision: PolicyDecision;\n readonly registryUrl: string;\n readonly statePath: string;\n readonly intervalMs: number;\n state: UpdateState;\n readonly notice: (line: string) => void;\n readonly debug: (line: string) => void;\n}\n\nfunction defaultRuntime(): SelfUpdateRuntime {\n return {\n env: process.env,\n argv: process.argv,\n execPath: process.execPath,\n execArgv: process.execArgv,\n platform: process.platform,\n homeDirectory: homedir(),\n now: (): Date => new Date(),\n fetchImpl: fetch,\n spawnImpl: spawn,\n reexecImpl: reexecProcess,\n checkTimeoutMs: DEFAULT_CHECK_TIMEOUT_MS,\n installTimeoutMs: DEFAULT_INSTALL_TIMEOUT_MS,\n };\n}\n\nfunction ageMs(isoTimestamp: string, nowMs: number): number {\n const then = Date.parse(isoTimestamp);\n // A timestamp in the future means the clock moved backwards; treat it as stale so the state self-heals.\n return Number.isNaN(then) || then > nowMs ? Number.POSITIVE_INFINITY : nowMs - then;\n}\n\nfunction detectLocation(options: SelfUpdateOptions, runtime: SelfUpdateRuntime, binPath: string): InstallLocation {\n return detectInstallLocation({\n binPath,\n packageName: options.packageName,\n platform: runtime.platform,\n env: runtime.env,\n ...(runtime.realpath === undefined ? {} : { realpath: runtime.realpath }),\n ...(runtime.isWritable === undefined ? {} : { isWritable: runtime.isWritable }),\n });\n}\n\nfunction createContext(options: SelfUpdateOptions, runtime: SelfUpdateRuntime): Context {\n const { env } = runtime;\n const binPath = runtime.argv[1] ?? \"\";\n const location = detectLocation(options, runtime, binPath);\n const decision = resolveUpdatePolicy({\n env,\n location,\n skipCommands: options.skipCommands ?? [],\n manual: options.manual === true,\n ...(options.envPrefix === undefined ? {} : { envPrefix: options.envPrefix }),\n ...(options.commandPath === undefined ? {} : { commandPath: options.commandPath }),\n });\n const statePath = updateStatePath(resolveSaptoolsRoot(options.saptoolsRoot, env), options.packageName);\n const notice =\n options.notice ??\n ((line: string): void => {\n process.stderr.write(`${options.binName}: ${line}\\n`);\n });\n const debug = isTruthyFlag(env[DEBUG_ENV])\n ? (line: string): void => {\n process.stderr.write(`${options.binName}: [self-update] ${line}\\n`);\n }\n : (): void => {\n // Debug output is off unless SAPTOOLS_UPDATE_DEBUG is set.\n };\n return {\n options,\n runtime,\n binPath,\n location,\n decision,\n registryUrl: resolveRegistryUrl(env, readUserNpmrc(runtime.homeDirectory)),\n statePath,\n intervalMs: resolveCheckIntervalMs(env),\n // Loaded lazily in resolveLatest: a disabled run must not touch ~/.saptools at all.\n state: EMPTY_UPDATE_STATE,\n notice,\n debug,\n };\n}\n\nfunction saveState(ctx: Context): void {\n try {\n writeUpdateState(ctx.statePath, ctx.state);\n } catch (error) {\n ctx.debug(`cannot write ${ctx.statePath}: ${errorMessage(error)}`);\n }\n}\n\n/** The newest published version: from the state file while it is fresh, otherwise from the registry. */\nasync function resolveLatest(ctx: Context): Promise<string | undefined> {\n ctx.state = readUpdateState(ctx.statePath);\n const { state } = ctx;\n const nowMs = ctx.runtime.now().getTime();\n if (ctx.options.manual !== true) {\n if (state.latest !== undefined && state.checkedAt !== undefined && ageMs(state.checkedAt, nowMs) < ctx.intervalMs) {\n ctx.debug(`using cached latest ${state.latest} (checked ${state.checkedAt})`);\n return state.latest;\n }\n if (state.lastFailureAt !== undefined && ageMs(state.lastFailureAt, nowMs) < FAILURE_BACKOFF_MS) {\n ctx.debug(`skipping the registry check after a recent failure: ${state.lastFailureReason ?? \"unknown\"}`);\n return state.latest;\n }\n }\n const result = await fetchLatestVersion(ctx.options.packageName, ctx.registryUrl, {\n fetchImpl: ctx.runtime.fetchImpl,\n timeoutMs: ctx.runtime.checkTimeoutMs,\n userAgent: `${ctx.options.binName}/${ctx.options.currentVersion} saptools-self-update`,\n });\n const at = ctx.runtime.now().toISOString();\n if (result.ok) {\n ctx.state = clearFailure({ ...ctx.state, checkedAt: at, latest: result.latest });\n saveState(ctx);\n return result.latest;\n }\n ctx.state = { ...ctx.state, lastFailureAt: at, lastFailureReason: result.reason };\n saveState(ctx);\n ctx.debug(`registry check failed: ${result.reason}`);\n return ctx.state.latest;\n}\n\nfunction notify(ctx: Context, latest: string, reason: string): SelfUpdateOutcome {\n const nowMs = ctx.runtime.now().getTime();\n const alreadyAnnounced =\n ctx.state.notifiedVersion === latest && ctx.state.notifiedAt !== undefined && ageMs(ctx.state.notifiedAt, nowMs) < NOTIFY_INTERVAL_MS;\n if (!alreadyAnnounced || ctx.options.manual === true) {\n const command = manualInstallCommand(ctx.location.kind, `${ctx.options.packageName}@${latest}`);\n ctx.notice(`${latest} is available (installed ${ctx.options.currentVersion}) but was not installed: ${reason}. Run: ${command}`);\n ctx.state = { ...ctx.state, notifiedVersion: latest, notifiedAt: ctx.runtime.now().toISOString() };\n saveState(ctx);\n }\n return { kind: \"notified\", latest, reason };\n}\n\nfunction recentInstallFailure(ctx: Context, latest: string): string | undefined {\n const attempt = ctx.state.lastInstall;\n if (ctx.options.manual === true || attempt === undefined || attempt.ok || attempt.version !== latest) {\n return;\n }\n if (ageMs(attempt.at, ctx.runtime.now().getTime()) >= INSTALL_RETRY_BACKOFF_MS) {\n return;\n }\n return `the previous attempt failed (${attempt.reason ?? \"unknown reason\"})`;\n}\n\nfunction recordInstall(ctx: Context, latest: string, ok: boolean, reason?: string): void {\n const at = ctx.runtime.now().toISOString();\n ctx.state = { ...ctx.state, lastInstall: reason === undefined ? { version: latest, at, ok } : { version: latest, at, ok, reason } };\n saveState(ctx);\n}\n\nasync function installLatest(ctx: Context, latest: string): Promise<SelfUpdateOutcome | undefined> {\n const command = buildInstallCommand({\n location: ctx.location,\n packageName: ctx.options.packageName,\n version: latest,\n registryUrl: ctx.registryUrl,\n execPath: ctx.runtime.execPath,\n platform: ctx.runtime.platform,\n ...(ctx.runtime.exists === undefined ? {} : { exists: ctx.runtime.exists }),\n ...(ctx.runtime.realpath === undefined ? {} : { realpath: ctx.runtime.realpath }),\n });\n if (command === undefined) {\n return notify(ctx, latest, \"no supported package manager was found for this install\");\n }\n const lock = acquireUpdateLock(updateLockPath(ctx.statePath), ctx.runtime.now());\n if (lock === undefined) {\n ctx.debug(\"another process holds the update lock\");\n return { kind: \"skipped\", reason: \"another process is installing the update\" };\n }\n try {\n ctx.notice(`updating ${ctx.options.currentVersion} -> ${latest} ...`);\n const result = await runInstall(command, { env: ctx.runtime.env, timeoutMs: ctx.runtime.installTimeoutMs, spawnImpl: ctx.runtime.spawnImpl });\n const installed = ctx.location.packageDirectory === undefined ? undefined : readPackageManifest(ctx.location.packageDirectory)?.version;\n const failure = result.ok ? (installed === latest ? undefined : `the installed version is ${installed ?? \"unreadable\"}, not ${latest}`) : result.reason;\n if (failure !== undefined) {\n recordInstall(ctx, latest, false, failure);\n ctx.notice(`update to ${latest} failed (${failure}); continuing with ${ctx.options.currentVersion}. Run: ${command.display}`);\n return { kind: \"failed\", latest, reason: failure };\n }\n recordInstall(ctx, latest, true);\n } finally {\n lock.release();\n }\n return;\n}\n\nasync function upgrade(ctx: Context, latest: string): Promise<SelfUpdateOutcome> {\n const failed = await installLatest(ctx, latest);\n if (failed !== undefined) {\n return failed;\n }\n const outcome: SelfUpdateOutcome = { kind: \"updated\", from: ctx.options.currentVersion, to: latest };\n if (ctx.options.reexec === false) {\n ctx.notice(`updated to ${latest}`);\n return outcome;\n }\n ctx.notice(`updated to ${latest}; re-running the command`);\n try {\n await ctx.runtime.reexecImpl({\n execPath: ctx.runtime.execPath,\n execArgv: ctx.runtime.execArgv,\n binPath: ctx.binPath,\n args: ctx.runtime.argv.slice(2),\n env: ctx.runtime.env,\n });\n } catch (error) {\n ctx.notice(`could not re-run on ${latest} (${errorMessage(error)}); continuing with the already loaded ${ctx.options.currentVersion}`);\n }\n return outcome;\n}\n\nasync function runSelfUpdateUnsafe(options: SelfUpdateOptions, runtime: SelfUpdateRuntime): Promise<SelfUpdateOutcome> {\n const ctx = createContext(options, runtime);\n if (ctx.decision.policy === \"off\") {\n ctx.debug(`off: ${ctx.decision.reason}`);\n return { kind: \"skipped\", reason: ctx.decision.reason };\n }\n const latest = await resolveLatest(ctx);\n if (latest === undefined) {\n return { kind: \"skipped\", reason: \"the latest version is unknown\" };\n }\n if (!isNewerRelease(latest, options.currentVersion)) {\n return { kind: \"current\", latest };\n }\n if (ctx.decision.policy === \"notify\") {\n return notify(ctx, latest, ctx.decision.reason);\n }\n const backoff = recentInstallFailure(ctx, latest);\n if (backoff !== undefined) {\n return notify(ctx, latest, backoff);\n }\n return await upgrade(ctx, latest);\n}\n\n/**\n * Check for, install, and re-run on a newer release. Never throws, never\n * writes to stdout, never prompts, never escalates privileges: whatever goes\n * wrong, the command the user asked for still runs on the installed version.\n */\nexport async function runSelfUpdate(options: SelfUpdateOptions, overrides: Partial<SelfUpdateRuntime> = {}): Promise<SelfUpdateOutcome> {\n const runtime: SelfUpdateRuntime = { ...defaultRuntime(), ...overrides };\n try {\n return await runSelfUpdateUnsafe(options, runtime);\n } catch (error) {\n const reason = errorMessage(error);\n if (isTruthyFlag(runtime.env[DEBUG_ENV])) {\n process.stderr.write(`${options.binName}: [self-update] ${reason}\\n`);\n }\n return { kind: \"skipped\", reason };\n }\n}\n\n/** Everything the `self-update` command reports; performs one fresh registry check. */\nexport async function inspectSelfUpdate(options: SelfUpdateOptions, overrides: Partial<SelfUpdateRuntime> = {}): Promise<SelfUpdateStatus> {\n const runtime: SelfUpdateRuntime = { ...defaultRuntime(), ...overrides };\n const ctx = createContext({ ...options, manual: true }, runtime);\n const result = await fetchLatestVersion(options.packageName, ctx.registryUrl, {\n fetchImpl: runtime.fetchImpl,\n timeoutMs: runtime.checkTimeoutMs,\n userAgent: `${options.binName}/${options.currentVersion} saptools-self-update`,\n });\n return {\n packageName: options.packageName,\n installed: options.currentVersion,\n location: ctx.location,\n policy: resolveUpdatePolicy({\n env: runtime.env,\n location: ctx.location,\n ...(options.envPrefix === undefined ? {} : { envPrefix: options.envPrefix }),\n }),\n registryUrl: ctx.registryUrl,\n statePath: ctx.statePath,\n latest: result.ok ? result.latest : undefined,\n checkError: result.ok ? undefined : result.reason,\n };\n}\n","import { accessSync, constants, realpathSync } from \"node:fs\";\nimport { basename, dirname, join, sep } from \"node:path\";\n\nimport { findPackageMetadata } from \"../package-metadata.js\";\nimport { errorMessage } from \"../records.js\";\n\nexport type InstallKind = \"npm-global\" | \"pnpm-global\" | \"yarn-global\" | \"bun-global\" | \"volta\" | \"npx\" | \"local\" | \"unknown\";\n\nexport interface InstallLocation {\n readonly kind: InstallKind;\n /** Directory holding the CLI's package.json, when it could be found. */\n readonly packageDirectory: string | undefined;\n /** npm global prefix (`npm prefix -g`), npm-global installs only. */\n readonly prefix: string | undefined;\n /** Whether this user can replace the installed files without escalating privileges. */\n readonly writable: boolean;\n readonly detail: string;\n}\n\nexport interface DetectInstallLocationOptions {\n readonly binPath: string;\n readonly packageName: string;\n readonly platform?: NodeJS.Platform;\n readonly env?: NodeJS.ProcessEnv;\n readonly realpath?: (path: string) => string;\n readonly isWritable?: (path: string) => boolean;\n}\n\nconst UPGRADABLE_KINDS: ReadonlySet<InstallKind> = new Set<InstallKind>([\"npm-global\", \"pnpm-global\", \"yarn-global\", \"bun-global\", \"volta\"]);\n\nexport function isUpgradableKind(kind: InstallKind): boolean {\n return UPGRADABLE_KINDS.has(kind);\n}\n\nfunction defaultIsWritable(path: string): boolean {\n try {\n accessSync(path, constants.W_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction toPosix(path: string): string {\n return path.split(sep).join(\"/\");\n}\n\nfunction isPnpmGlobal(posixDirectory: string, env: NodeJS.ProcessEnv): boolean {\n // ~/Library/pnpm/global/5/... (macOS), ~/.local/share/pnpm/global/5/... (Linux), or a custom PNPM_HOME.\n if (posixDirectory.includes(\"/pnpm/global/\")) {\n return true;\n }\n const home = env[\"PNPM_HOME\"];\n return home !== undefined && home.length > 0 && posixDirectory.startsWith(`${toPosix(home).replace(/\\/+$/, \"\")}/global/`);\n}\n\n/** `<node_modules>` that directly holds `<node_modules>/@scope/name` or `<node_modules>/name`. */\nfunction nodeModulesRootOf(packageDirectory: string): string | undefined {\n const parent = dirname(packageDirectory);\n if (basename(parent) === \"node_modules\") {\n return parent;\n }\n const grandparent = dirname(parent);\n return basename(grandparent) === \"node_modules\" ? grandparent : undefined;\n}\n\n/**\n * npm's global layout is `<prefix>/lib/node_modules` on POSIX and\n * `<prefix>/node_modules` on Windows, where the default prefix directory is\n * named `npm`. Anything else under a `node_modules` is a project-local install.\n */\nfunction npmPrefixFor(packageDirectory: string, platform: NodeJS.Platform): string | undefined {\n const nodeModules = nodeModulesRootOf(packageDirectory);\n if (nodeModules === undefined) {\n return;\n }\n const parent = dirname(nodeModules);\n if (platform === \"win32\") {\n return basename(parent).toLowerCase() === \"npm\" ? parent : undefined;\n }\n return basename(parent) === \"lib\" ? dirname(parent) : undefined;\n}\n\nfunction classifyKind(packageDirectory: string, platform: NodeJS.Platform, env: NodeJS.ProcessEnv): InstallKind {\n const posix = toPosix(packageDirectory);\n if (posix.includes(\"/_npx/\") || /\\/dlx-[^/]+\\//.test(posix) || posix.includes(\"/pnpm/dlx/\") || posix.includes(\"/.cache/pnpm/dlx\")) {\n return \"npx\";\n }\n if (posix.includes(\"/.volta/tools/image/packages/\")) {\n return \"volta\";\n }\n if (posix.includes(\"/.bun/install/global/\")) {\n return \"bun-global\";\n }\n if (posix.includes(\"/.config/yarn/global/\") || posix.includes(\"/yarn/global/node_modules/\")) {\n return \"yarn-global\";\n }\n if (isPnpmGlobal(posix, env)) {\n return \"pnpm-global\";\n }\n if (!posix.includes(\"/node_modules/\")) {\n return \"local\";\n }\n return npmPrefixFor(packageDirectory, platform) === undefined ? \"local\" : \"npm-global\";\n}\n\nfunction writableForUpgrade(\n packageDirectory: string,\n prefix: string | undefined,\n platform: NodeJS.Platform,\n isWritable: (path: string) => boolean,\n): boolean {\n // The package itself, its scope folder, the node_modules root (npm rewrites .package-lock.json) and the bin folder all get touched.\n const targets = [packageDirectory, dirname(packageDirectory)];\n const nodeModules = nodeModulesRootOf(packageDirectory);\n if (nodeModules !== undefined) {\n targets.push(nodeModules);\n }\n if (prefix !== undefined) {\n targets.push(platform === \"win32\" ? prefix : join(prefix, \"bin\"));\n }\n return targets.every((target) => isWritable(target));\n}\n\nfunction describe(kind: InstallKind, packageDirectory: string, prefix: string | undefined): string {\n if (kind === \"npm-global\" && prefix !== undefined) {\n return `npm global install under ${prefix}`;\n }\n return `${kind} install at ${packageDirectory}`;\n}\n\nfunction unknownLocation(detail: string): InstallLocation {\n return { kind: \"unknown\", packageDirectory: undefined, prefix: undefined, writable: false, detail };\n}\n\n/**\n * Where does the running CLI come from, and which package manager owns it?\n * Decided from the real path of the executing script, never from PATH or\n * `npm prefix -g`: the install we upgrade must be the one we are running.\n */\nexport function detectInstallLocation(options: DetectInstallLocationOptions): InstallLocation {\n const platform = options.platform ?? process.platform;\n const env = options.env ?? process.env;\n const realpath = options.realpath ?? ((path: string): string => realpathSync(path));\n const isWritable = options.isWritable ?? defaultIsWritable;\n\n let resolvedBin: string;\n try {\n resolvedBin = realpath(options.binPath);\n } catch (error) {\n return unknownLocation(`cannot resolve ${options.binPath}: ${errorMessage(error)}`);\n }\n const manifest = findPackageMetadata(dirname(resolvedBin), options.packageName);\n if (manifest === undefined) {\n return unknownLocation(`no package.json for ${options.packageName} above ${resolvedBin}`);\n }\n\n const packageDirectory = manifest.directory;\n const kind = classifyKind(packageDirectory, platform, env);\n const prefix = kind === \"npm-global\" ? npmPrefixFor(packageDirectory, platform) : undefined;\n const writable = isUpgradableKind(kind) && writableForUpgrade(packageDirectory, prefix, platform, isWritable);\n return { kind, packageDirectory, prefix, writable, detail: describe(kind, packageDirectory, prefix) };\n}\n","import { existsSync, realpathSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nimport { errorMessage } from \"../records.js\";\n\nimport type { InstallKind, InstallLocation } from \"./install-location.js\";\nimport type { SpawnLike } from \"./process-types.js\";\n\nexport interface InstallCommand {\n readonly file: string;\n readonly args: readonly string[];\n /** The equivalent command a human would type; used in notices. */\n readonly display: string;\n}\n\nexport interface BuildInstallCommandOptions {\n readonly location: InstallLocation;\n readonly packageName: string;\n readonly version: string;\n readonly registryUrl: string;\n readonly execPath?: string;\n readonly platform?: NodeJS.Platform;\n readonly exists?: (path: string) => boolean;\n readonly realpath?: (path: string) => string;\n}\n\nexport type InstallResult = { readonly ok: true } | { readonly ok: false; readonly reason: string };\n\nexport interface RunInstallOptions {\n readonly env: NodeJS.ProcessEnv;\n readonly timeoutMs?: number;\n readonly spawnImpl: SpawnLike;\n}\n\n/** A global install of a ~200 KB CLI takes a few seconds; three minutes only matters on a stalled network. */\nexport const DEFAULT_INSTALL_TIMEOUT_MS = 180_000;\n\n/** What to tell a human to run; also the fallback when we cannot upgrade for them. */\nexport function manualInstallCommand(kind: InstallKind, spec: string): string {\n switch (kind) {\n case \"pnpm-global\":\n return `pnpm add -g ${spec}`;\n case \"yarn-global\":\n return `yarn global add ${spec}`;\n case \"bun-global\":\n return `bun add -g ${spec}`;\n case \"volta\":\n return `volta install ${spec}`;\n case \"npm-global\":\n case \"npx\":\n case \"local\":\n case \"unknown\":\n return `npm install -g ${spec}`;\n }\n}\n\ninterface NpmInvocation {\n readonly file: string;\n readonly leadingArgs: readonly string[];\n}\n\n/**\n * Prefer the npm that ships with the node running us (`<bin>/npm` beside\n * `process.execPath`), executed through that same node: PATH may hold a\n * different Node installation whose npm would upgrade a different prefix. On\n * Windows the `.cmd` shim cannot be spawned without a shell, so only the\n * bundled `npm-cli.js` is used there.\n */\nfunction resolveNpmInvocation(\n execPath: string,\n platform: NodeJS.Platform,\n exists: (path: string) => boolean,\n realpath: (path: string) => string,\n): NpmInvocation | undefined {\n const binDirectory = dirname(execPath);\n if (platform === \"win32\") {\n const cli = join(binDirectory, \"node_modules\", \"npm\", \"bin\", \"npm-cli.js\");\n return exists(cli) ? { file: execPath, leadingArgs: [cli] } : undefined;\n }\n const sibling = join(binDirectory, \"npm\");\n if (exists(sibling)) {\n try {\n const target = realpath(sibling);\n return target.endsWith(\".js\") ? { file: execPath, leadingArgs: [target] } : { file: target, leadingArgs: [] };\n } catch {\n // A dangling symlink: fall through to PATH.\n }\n }\n return { file: \"npm\", leadingArgs: [] };\n}\n\nfunction buildNpmCommand(options: BuildInstallCommandOptions, spec: string): InstallCommand | undefined {\n if (options.location.prefix === undefined) {\n return;\n }\n const npm = resolveNpmInvocation(\n options.execPath ?? process.execPath,\n options.platform ?? process.platform,\n options.exists ?? existsSync,\n options.realpath ?? ((path: string): string => realpathSync(path)),\n );\n if (npm === undefined) {\n return;\n }\n return {\n file: npm.file,\n args: [\n ...npm.leadingArgs,\n \"install\",\n \"--global\",\n \"--prefix\",\n options.location.prefix,\n spec,\n \"--registry\",\n options.registryUrl,\n \"--no-fund\",\n \"--no-audit\",\n \"--no-update-notifier\",\n \"--loglevel=error\",\n ],\n display: manualInstallCommand(\"npm-global\", spec),\n };\n}\n\n/** The exact command that upgrades this install in place; undefined when the location cannot be upgraded by us. */\nexport function buildInstallCommand(options: BuildInstallCommandOptions): InstallCommand | undefined {\n const spec = `${options.packageName}@${options.version}`;\n switch (options.location.kind) {\n case \"npm-global\":\n return buildNpmCommand(options, spec);\n case \"pnpm-global\":\n return { file: \"pnpm\", args: [\"add\", \"--global\", spec], display: manualInstallCommand(\"pnpm-global\", spec) };\n case \"yarn-global\":\n return { file: \"yarn\", args: [\"global\", \"add\", spec], display: manualInstallCommand(\"yarn-global\", spec) };\n case \"bun-global\":\n return { file: \"bun\", args: [\"add\", \"--global\", spec], display: manualInstallCommand(\"bun-global\", spec) };\n case \"volta\":\n return { file: \"volta\", args: [\"install\", spec], display: manualInstallCommand(\"volta\", spec) };\n case \"npx\":\n case \"local\":\n case \"unknown\":\n return;\n }\n}\n\nfunction lastLine(text: string): string {\n const lines = text\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n return lines.at(-1) ?? \"\";\n}\n\n/**\n * Run the install with no shell, no stdin, and a hard timeout. Credentials for\n * SAP never reach the package manager, and the child inherits an explicit\n * `SAPTOOLS_AUTO_UPDATE=off` so nothing it runs can start a nested update.\n * `cwd` is the temp directory so a project's `.npmrc` cannot redirect the\n * install of a global tool.\n */\nexport function runInstall(command: InstallCommand, options: RunInstallOptions): Promise<InstallResult> {\n const timeoutMs = options.timeoutMs ?? DEFAULT_INSTALL_TIMEOUT_MS;\n const env: NodeJS.ProcessEnv = { ...options.env, SAPTOOLS_AUTO_UPDATE: \"off\" };\n delete env[\"SAP_EMAIL\"];\n delete env[\"SAP_PASSWORD\"];\n\n return new Promise<InstallResult>((resolve) => {\n let child: ReturnType<SpawnLike>;\n try {\n child = options.spawnImpl(command.file, command.args, { cwd: tmpdir(), env, stdio: [\"ignore\", \"pipe\", \"pipe\"], windowsHide: true });\n } catch (error) {\n resolve({ ok: false, reason: errorMessage(error) });\n return;\n }\n let stderr = \"\";\n child.stderr?.on(\"data\", (chunk: Buffer | string) => {\n stderr = `${stderr}${chunk.toString()}`.slice(-4_000);\n });\n const timer = setTimeout(() => {\n child.kill(\"SIGKILL\");\n }, timeoutMs);\n child.once(\"error\", (error) => {\n clearTimeout(timer);\n resolve({ ok: false, reason: `${command.file}: ${error.message}` });\n });\n child.once(\"close\", (code, signal) => {\n clearTimeout(timer);\n if (code === 0) {\n resolve({ ok: true });\n return;\n }\n const detail = lastLine(stderr);\n const suffix = detail.length > 0 ? `: ${detail}` : \"\";\n resolve({\n ok: false,\n reason:\n signal === null\n ? `${command.display} exited with code ${String(code ?? -1)}${suffix}`\n : `${command.display} was killed by ${signal} after ${String(Math.round(timeoutMs / 1000))}s`,\n });\n });\n });\n}\n","import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nimport { errorMessage, isRecord, readString } from \"../records.js\";\n\nimport { parseSemver } from \"./semver.js\";\n\nexport const DEFAULT_NPM_REGISTRY = \"https://registry.npmjs.org\";\nexport const REGISTRY_ENV = \"SAPTOOLS_NPM_REGISTRY\";\n/**\n * The registry answers in ~0.5 s from Asia; two seconds separates \"slow\" from\n * \"offline or captive portal\" without holding up a 1.5 s command for long.\n */\nexport const DEFAULT_CHECK_TIMEOUT_MS = 2_000;\n\nexport type LatestVersionResult =\n | { readonly ok: true; readonly latest: string }\n | { readonly ok: false; readonly reason: string };\n\nexport interface FetchLatestOptions {\n readonly fetchImpl?: typeof fetch;\n readonly timeoutMs?: number;\n readonly userAgent?: string;\n}\n\nexport function normalizeRegistryUrl(value: string | undefined): string | undefined {\n if (value === undefined) {\n return;\n }\n const trimmed = value.trim().replace(/\\/+$/, \"\");\n if (!/^https?:\\/\\/\\S+$/i.test(trimmed)) {\n return;\n }\n return trimmed;\n}\n\nfunction registryFromNpmrc(text: string | undefined, key: string): string | undefined {\n if (text === undefined) {\n return;\n }\n for (const line of text.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (trimmed.length === 0 || trimmed.startsWith(\"#\") || trimmed.startsWith(\";\")) {\n continue;\n }\n const separator = trimmed.indexOf(\"=\");\n if (separator === -1 || trimmed.slice(0, separator).trim() !== key) {\n continue;\n }\n return trimmed\n .slice(separator + 1)\n .trim()\n .replace(/^\"(.*)\"$/, \"$1\");\n }\n return;\n}\n\n/** `~/.npmrc` as text, or undefined when absent; the project-level `.npmrc` is deliberately ignored (see resolveRegistryUrl). */\nexport function readUserNpmrc(homeDirectory: string): string | undefined {\n try {\n return readFileSync(join(homeDirectory, \".npmrc\"), \"utf8\");\n } catch {\n return;\n }\n}\n\n/**\n * Registry precedence: explicit saptools override, the registry npm itself was\n * configured with when it launched us, the user's `~/.npmrc` (scoped entry\n * first), then npmjs. The current directory's `.npmrc` is ignored on purpose:\n * a project's private registry has nothing to do with where the user's global\n * CLI came from.\n */\nexport function resolveRegistryUrl(env: NodeJS.ProcessEnv, userNpmrc: string | undefined): string {\n const candidates = [\n env[REGISTRY_ENV],\n env[\"npm_config_registry\"],\n registryFromNpmrc(userNpmrc, \"@saptools:registry\"),\n registryFromNpmrc(userNpmrc, \"registry\"),\n ];\n for (const candidate of candidates) {\n const normalized = normalizeRegistryUrl(candidate);\n if (normalized !== undefined) {\n return normalized;\n }\n }\n return DEFAULT_NPM_REGISTRY;\n}\n\ntype JsonResponse =\n | { readonly ok: true; readonly body: unknown }\n | { readonly ok: false; readonly status: number | undefined; readonly reason: string };\n\nasync function fetchJson(\n fetchImpl: typeof fetch,\n url: string,\n headers: Record<string, string>,\n timeoutMs: number,\n): Promise<JsonResponse> {\n try {\n const response = await fetchImpl(url, { headers, signal: AbortSignal.timeout(timeoutMs), redirect: \"follow\" });\n if (!response.ok) {\n return { ok: false, status: response.status, reason: `HTTP ${String(response.status)} from ${url}` };\n }\n const body: unknown = await response.json();\n return { ok: true, body };\n } catch (error) {\n return { ok: false, status: undefined, reason: `${errorMessage(error)} (${url})` };\n }\n}\n\nfunction readLatestTag(body: unknown, nestedUnderDistTags: boolean): string | undefined {\n if (!isRecord(body)) {\n return;\n }\n const tags = nestedUnderDistTags ? body[\"dist-tags\"] : body;\n if (!isRecord(tags)) {\n return;\n }\n const latest = readString(tags, \"latest\");\n return latest !== undefined && parseSemver(latest) !== undefined ? latest : undefined;\n}\n\n/**\n * Ask the registry for the `latest` dist-tag. The dedicated dist-tags endpoint\n * is 18 bytes; registries that do not implement it (some private mirrors) get\n * a second try through the abbreviated packument. A network failure on the\n * first request is not retried: the registry is unreachable, not old.\n */\nexport async function fetchLatestVersion(\n packageName: string,\n registryUrl: string,\n options: FetchLatestOptions = {},\n): Promise<LatestVersionResult> {\n const fetchImpl = options.fetchImpl ?? fetch;\n const timeoutMs = options.timeoutMs ?? DEFAULT_CHECK_TIMEOUT_MS;\n const encoded = encodeURIComponent(packageName);\n const baseHeaders: Record<string, string> = { \"user-agent\": options.userAgent ?? \"saptools-self-update\" };\n\n const distTags = await fetchJson(fetchImpl, `${registryUrl}/-/package/${encoded}/dist-tags`, { ...baseHeaders, accept: \"application/json\" }, timeoutMs);\n if (distTags.ok) {\n const latest = readLatestTag(distTags.body, false);\n return latest === undefined ? { ok: false, reason: \"dist-tags response carries no valid latest version\" } : { ok: true, latest };\n }\n if (distTags.status === undefined) {\n return { ok: false, reason: distTags.reason };\n }\n\n const packument = await fetchJson(\n fetchImpl,\n `${registryUrl}/${encoded}`,\n { ...baseHeaders, accept: \"application/vnd.npm.install-v1+json\" },\n timeoutMs,\n );\n if (!packument.ok) {\n return { ok: false, reason: packument.reason };\n }\n const latest = readLatestTag(packument.body, true);\n return latest === undefined ? { ok: false, reason: \"packument carries no valid latest dist-tag\" } : { ok: true, latest };\n}\n","export interface SemanticVersion {\n readonly major: number;\n readonly minor: number;\n readonly patch: number;\n readonly prerelease: readonly string[];\n}\n\nconst SEMVER_PATTERN =\n /^v?(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$/;\n\nexport function parseSemver(text: string): SemanticVersion | undefined {\n const match = SEMVER_PATTERN.exec(text.trim());\n if (match === null) {\n return;\n }\n const [, major, minor, patch, prerelease] = match;\n if (major === undefined || minor === undefined || patch === undefined) {\n return;\n }\n return {\n major: Number(major),\n minor: Number(minor),\n patch: Number(patch),\n prerelease: prerelease === undefined ? [] : prerelease.split(\".\"),\n };\n}\n\nfunction compareIdentifiers(left: string, right: string): number {\n const leftNumeric = /^\\d+$/.test(left);\n const rightNumeric = /^\\d+$/.test(right);\n if (leftNumeric && rightNumeric) {\n return Math.sign(Number(left) - Number(right));\n }\n // Numeric identifiers always sort before alphanumeric ones (semver 2.0.0 §11).\n if (leftNumeric) {\n return -1;\n }\n if (rightNumeric) {\n return 1;\n }\n if (left === right) {\n return 0;\n }\n return left < right ? -1 : 1;\n}\n\nfunction comparePrerelease(left: readonly string[], right: readonly string[]): number {\n if (left.length === 0 && right.length === 0) {\n return 0;\n }\n // A release outranks any prerelease of the same version.\n if (left.length === 0) {\n return 1;\n }\n if (right.length === 0) {\n return -1;\n }\n for (const [index, identifier] of left.entries()) {\n const other = right[index];\n if (other === undefined) {\n return 1;\n }\n const result = compareIdentifiers(identifier, other);\n if (result !== 0) {\n return result;\n }\n }\n return left.length < right.length ? -1 : 0;\n}\n\nexport function compareSemver(left: SemanticVersion, right: SemanticVersion): number {\n for (const key of [\"major\", \"minor\", \"patch\"] as const) {\n if (left[key] !== right[key]) {\n return left[key] < right[key] ? -1 : 1;\n }\n }\n return comparePrerelease(left.prerelease, right.prerelease);\n}\n\n/**\n * True when `candidate` is a release strictly newer than `current`. A\n * prerelease is never a target: someone who installed 1.2.0 must not be moved\n * onto 1.3.0-beta.1 by a background updater.\n */\nexport function isNewerRelease(candidate: string, current: string): boolean {\n const next = parseSemver(candidate);\n const installed = parseSemver(current);\n if (next === undefined || installed === undefined) {\n return false;\n }\n if (next.prerelease.length > 0) {\n return false;\n }\n return compareSemver(next, installed) > 0;\n}\n","import { closeSync, openSync, rmSync, statSync, utimesSync, writeSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\n\nimport { isRecord, readString } from \"../records.js\";\nimport { ensurePrivateDirectorySync, readJsonFileSync, writeFileAtomicSync } from \"../saptools-paths.js\";\n\nexport interface InstallAttempt {\n readonly version: string;\n readonly at: string;\n readonly ok: boolean;\n readonly reason?: string;\n}\n\nexport interface UpdateState {\n readonly version: 1;\n readonly checkedAt?: string;\n readonly latest?: string;\n readonly lastFailureAt?: string;\n readonly lastFailureReason?: string;\n readonly notifiedVersion?: string;\n readonly notifiedAt?: string;\n readonly lastInstall?: InstallAttempt;\n}\n\ntype UpdateStateDraft = { -readonly [K in keyof UpdateState]: UpdateState[K] };\n\nexport const EMPTY_UPDATE_STATE: UpdateState = { version: 1 };\nexport const UPDATES_DIRECTORY_NAME = \"updates\";\n/** A stuck installer holds the lock this long before another instance may take over. */\nexport const DEFAULT_LOCK_STALE_MS = 10 * 60_000;\n\nconst STRING_FIELDS = [\"checkedAt\", \"latest\", \"lastFailureAt\", \"lastFailureReason\", \"notifiedVersion\", \"notifiedAt\"] as const;\n\n/** `@saptools/cf-metrics` → `saptools__cf-metrics.json`: one file per package, no shared writes between CLIs. */\nexport function updateStateFileName(packageName: string): string {\n return `${packageName.replace(/^@/, \"\").replaceAll(\"/\", \"__\")}.json`;\n}\n\nexport function updateStatePath(saptoolsRoot: string, packageName: string): string {\n return join(saptoolsRoot, UPDATES_DIRECTORY_NAME, updateStateFileName(packageName));\n}\n\nexport function updateLockPath(statePath: string): string {\n return statePath.replace(/\\.json$/, \".lock\");\n}\n\nfunction readInstallAttempt(value: unknown): InstallAttempt | undefined {\n if (!isRecord(value)) {\n return;\n }\n const version = readString(value, \"version\");\n const at = readString(value, \"at\");\n const ok = value[\"ok\"];\n if (version === undefined || at === undefined || typeof ok !== \"boolean\") {\n return;\n }\n const reason = readString(value, \"reason\");\n return reason === undefined ? { version, at, ok } : { version, at, ok, reason };\n}\n\n/** Tolerant read: an unknown, malformed, or older-format file reads as empty state. */\nexport function readUpdateState(path: string): UpdateState {\n const parsed = readJsonFileSync(path);\n if (!isRecord(parsed) || parsed[\"version\"] !== 1) {\n return EMPTY_UPDATE_STATE;\n }\n const draft: UpdateStateDraft = { version: 1 };\n for (const key of STRING_FIELDS) {\n const value = readString(parsed, key);\n if (value !== undefined) {\n draft[key] = value;\n }\n }\n const lastInstall = readInstallAttempt(parsed[\"lastInstall\"]);\n if (lastInstall !== undefined) {\n draft.lastInstall = lastInstall;\n }\n return draft;\n}\n\n/** The same state with a successful check: the failure fields no longer apply. */\nexport function clearFailure(state: UpdateState): UpdateState {\n const next: UpdateStateDraft = { ...state };\n delete next.lastFailureAt;\n delete next.lastFailureReason;\n return next;\n}\n\nexport function writeUpdateState(path: string, state: UpdateState): void {\n ensurePrivateDirectorySync(dirname(path));\n writeFileAtomicSync(path, `${JSON.stringify(state, null, 2)}\\n`, 0o600);\n}\n\nexport interface UpdateLock {\n readonly release: () => void;\n}\n\nfunction tryCreateLock(lockPath: string, now: Date): UpdateLock | undefined {\n let descriptor: number;\n try {\n descriptor = openSync(lockPath, \"wx\", 0o600);\n } catch {\n return;\n }\n try {\n writeSync(descriptor, `${JSON.stringify({ pid: process.pid, at: now.toISOString() })}\\n`);\n } finally {\n closeSync(descriptor);\n }\n // Staleness is judged against the caller's clock, so stamp the file with it rather than the filesystem's.\n utimesSync(lockPath, now, now);\n return {\n release: (): void => {\n rmSync(lockPath, { force: true });\n },\n };\n}\n\nfunction isStaleLock(lockPath: string, now: Date, staleMs: number): boolean {\n try {\n return now.getTime() - statSync(lockPath).mtimeMs > staleMs;\n } catch {\n return false;\n }\n}\n\n/**\n * Exclusive-create lock so two commands started at once install only once;\n * the loser skips the update and runs on the installed version. A lock older\n * than `staleMs` belongs to a crashed installer and is taken over.\n */\nexport function acquireUpdateLock(lockPath: string, now: Date, staleMs = DEFAULT_LOCK_STALE_MS): UpdateLock | undefined {\n ensurePrivateDirectorySync(dirname(lockPath));\n const lock = tryCreateLock(lockPath, now);\n if (lock !== undefined) {\n return lock;\n }\n if (!isStaleLock(lockPath, now, staleMs)) {\n return;\n }\n rmSync(lockPath, { force: true });\n return tryCreateLock(lockPath, now);\n}\n","import type { Command } from \"commander\";\n\nimport { SELF_UPDATE_COMMAND } from \"./policy.js\";\nimport { inspectSelfUpdate, runSelfUpdate } from \"./run.js\";\nimport type { SelfUpdateOptions, SelfUpdateOutcome, SelfUpdateStatus } from \"./run.js\";\nimport { isNewerRelease } from \"./semver.js\";\n\nexport type AttachSelfUpdateOptions = Omit<SelfUpdateOptions, \"commandPath\" | \"manual\" | \"reexec\">;\n\nexport interface SelfUpdateCommandOptions extends AttachSelfUpdateOptions {\n /** Where the status lines go; defaults to stdout. */\n readonly print?: (line: string) => void;\n}\n\n/** `credential list` for a nested subcommand, `` for the root action. */\nexport function commandPathOf(command: Command): string {\n const names: string[] = [];\n let current: Command = command;\n while (current.parent !== null) {\n names.unshift(current.name());\n current = current.parent;\n }\n return names.join(\" \");\n}\n\n/**\n * Run the self-updater before every action of `program`. `--help` and\n * `--version` never reach an action, so they never trigger it; the\n * `self-update` command and `skipCommands` are excluded by the policy.\n */\nexport function attachSelfUpdate(program: Command, options: AttachSelfUpdateOptions): void {\n program.hook(\"preAction\", async (_thisCommand: Command, actionCommand: Command): Promise<void> => {\n await runSelfUpdate({ ...options, commandPath: commandPathOf(actionCommand) });\n });\n}\n\nexport function formatSelfUpdateStatus(status: SelfUpdateStatus): readonly string[] {\n const latest =\n status.latest ?? (status.checkError === undefined ? \"unknown\" : `unknown (${status.checkError})`);\n const install = status.location.packageDirectory === undefined ? status.location.detail : `${status.location.kind} ${status.location.packageDirectory}`;\n return [\n `package=${status.packageName}`,\n `installed=${status.installed}`,\n `latest=${latest}`,\n `policy=${status.policy.policy} (${status.policy.reason})`,\n `install=${install}`,\n `writable=${status.location.writable ? \"yes\" : \"no\"}`,\n `registry=${status.registryUrl}`,\n `state=${status.statePath}`,\n ];\n}\n\nexport function describeOutcome(outcome: SelfUpdateOutcome): string {\n switch (outcome.kind) {\n case \"current\":\n return `current (${outcome.latest} is the newest release)`;\n case \"updated\":\n return `updated ${outcome.from} -> ${outcome.to}`;\n case \"notified\":\n return `not installed (${outcome.reason})`;\n case \"failed\":\n return `failed (${outcome.reason})`;\n case \"skipped\":\n return `skipped (${outcome.reason})`;\n }\n}\n\nasync function runSelfUpdateCommand(options: SelfUpdateCommandOptions, checkOnly: boolean): Promise<void> {\n const print =\n options.print ??\n ((line: string): void => {\n process.stdout.write(`${line}\\n`);\n });\n const status = await inspectSelfUpdate(options);\n for (const line of formatSelfUpdateStatus(status)) {\n print(line);\n }\n if (checkOnly) {\n const verdict = status.latest === undefined ? \"unknown\" : isNewerRelease(status.latest, status.installed) ? \"update-available\" : \"current\";\n print(`result=${verdict}`);\n return;\n }\n const outcome = await runSelfUpdate({ ...options, manual: true, reexec: false });\n print(`result=${describeOutcome(outcome)}`);\n if (outcome.kind === \"failed\") {\n process.exitCode = 1;\n }\n}\n\n/** `<bin> self-update [--check]`: a forced check and install for humans and agents who do not want to wait for the hourly check. */\nexport function registerSelfUpdateCommand(program: Command, options: SelfUpdateCommandOptions): void {\n program\n .command(SELF_UPDATE_COMMAND)\n .description(\"check npm for a newer release and install it now; every other command does this automatically (at most once an hour)\")\n .option(\"--check\", \"report whether a newer release exists without installing it\")\n .action(async (flags: { readonly check?: boolean }): Promise<void> => {\n await runSelfUpdateCommand(options, flags.check === true);\n });\n}\n","import type { CloudLoggingCfExecutor, CloudLoggingInstance } from \"./types.js\";\n\nconst CLOUD_LOGGING_OFFERING = \"cloud-logging\";\nconst INSTANCES_PAGE_SIZE = 200;\nconst MAX_INSTANCE_PAGES = 20;\nconst INSTANCE_LISTING_FIELDS =\n `&${encodeURIComponent(\"fields[service_plan]\")}=guid,name,relationships.service_offering` +\n `&${encodeURIComponent(\"fields[service_plan.service_offering]\")}=guid,name`;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction readString(record: Record<string, unknown>, key: string): string | undefined {\n const value = record[key];\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction relationshipGuid(resource: Record<string, unknown>, relationship: string): string | undefined {\n const relationships = resource[\"relationships\"];\n const entry = isRecord(relationships) ? relationships[relationship] : undefined;\n const data = isRecord(entry) ? entry[\"data\"] : undefined;\n return isRecord(data) ? readString(data, \"guid\") : undefined;\n}\n\nfunction recordsOf(payload: Record<string, unknown>, ...path: readonly string[]): readonly Record<string, unknown>[] {\n let cursor: unknown = payload;\n for (const key of path) {\n cursor = isRecord(cursor) ? cursor[key] : undefined;\n }\n return Array.isArray(cursor) ? cursor.filter(isRecord) : [];\n}\n\nfunction offeringNamesByPlanGuid(payload: Record<string, unknown>): ReadonlyMap<string, string> {\n const offeringNames = new Map<string, string>();\n for (const offering of recordsOf(payload, \"included\", \"service_offerings\")) {\n const guid = readString(offering, \"guid\");\n const name = readString(offering, \"name\");\n if (guid !== undefined && name !== undefined) {\n offeringNames.set(guid, name);\n }\n }\n const byPlan = new Map<string, string>();\n for (const plan of recordsOf(payload, \"included\", \"service_plans\")) {\n const guid = readString(plan, \"guid\");\n const offeringGuid = relationshipGuid(plan, \"service_offering\");\n const offeringName = offeringGuid === undefined ? undefined : offeringNames.get(offeringGuid);\n if (guid !== undefined && offeringName !== undefined) {\n byPlan.set(guid, offeringName);\n }\n }\n return byPlan;\n}\n\ninterface ManagedInstance extends CloudLoggingInstance {\n readonly offering: string | undefined;\n}\n\nfunction parseInstancesPage(payload: Record<string, unknown>): readonly ManagedInstance[] {\n const offeringByPlan = offeringNamesByPlanGuid(payload);\n const instances: ManagedInstance[] = [];\n for (const resource of recordsOf(payload, \"resources\")) {\n const name = readString(resource, \"name\");\n const guid = readString(resource, \"guid\");\n if (name === undefined || guid === undefined) {\n continue;\n }\n const planGuid = relationshipGuid(resource, \"service_plan\");\n instances.push({ name, guid, offering: planGuid === undefined ? undefined : offeringByPlan.get(planGuid) });\n }\n return instances;\n}\n\nfunction parseListing(raw: string): Record<string, unknown> {\n const parsed: unknown = JSON.parse(raw);\n if (!isRecord(parsed)) {\n throw new Error(\"cf curl /v3/service_instances returned an unexpected shape.\");\n }\n return parsed;\n}\n\n/** Every Cloud Logging service instance in the target's space, via the v3 API. */\nexport async function listCloudLoggingInstances(\n target: { readonly space: string },\n executor: CloudLoggingCfExecutor,\n): Promise<readonly CloudLoggingInstance[]> {\n const spaceGuid = await executor.cfSpaceGuid(target.space, executor.ambientContext);\n const instances: ManagedInstance[] = [];\n let page = 1;\n let hasMore = true;\n while (hasMore && page <= MAX_INSTANCE_PAGES) {\n const raw = await executor.cfCurl(\n `/v3/service_instances?space_guids=${encodeURIComponent(spaceGuid)}&type=managed&per_page=${String(INSTANCES_PAGE_SIZE)}&page=${String(page)}${INSTANCE_LISTING_FIELDS}`,\n executor.ambientContext,\n );\n const payload = parseListing(raw);\n instances.push(...parseInstancesPage(payload));\n const pagination = payload[\"pagination\"];\n const reported = isRecord(pagination) ? pagination[\"total_pages\"] : undefined;\n hasMore = page < (typeof reported === \"number\" && reported > 0 ? reported : 1);\n page += 1;\n }\n return instances.filter((instance) => instance.offering?.toLowerCase() === CLOUD_LOGGING_OFFERING).map(({ name, guid }) => ({ name, guid }));\n}\n\n/** Auto-discover the single Cloud Logging instance in the space, failing closed on 0 or many. */\nexport async function discoverServiceInstance(\n target: { readonly space: string },\n executor: CloudLoggingCfExecutor,\n): Promise<CloudLoggingInstance> {\n const instances = await listCloudLoggingInstances(target, executor);\n if (instances.length > 1) {\n const names = instances.map((instance) => instance.name).join(\", \");\n throw new Error(`Multiple \"${CLOUD_LOGGING_OFFERING}\" service instances found in this space (${names}); pass --service-instance to pick one.`);\n }\n const [only] = instances;\n if (only === undefined) {\n throw new Error(`No \"${CLOUD_LOGGING_OFFERING}\" service instance found in this space. Pass --service-instance to name one explicitly.`);\n }\n return only;\n}\n","import { readdir, rm } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nimport { ensurePrivateDirectorySync, readJsonFileSync, resolveSaptoolsRoot, writeFileAtomicSync } from \"../saptools-paths.js\";\n\nimport type { DashboardsCredential, ResolvedTarget } from \"./types.js\";\n\nconst CACHE_FILE_NAME = \"credentials.json\";\nconst DEFAULT_TTL_MINUTES = 10_080;\nconst AUTO_INSTANCE_SELECTOR = \"auto\";\n\ninterface StoredCredentialEntry {\n readonly region: string;\n readonly apiEndpoint: string;\n readonly org: string;\n readonly space: string;\n readonly instanceSelector: string;\n readonly instance: string;\n readonly source: string;\n readonly dashboardsEndpoint: string;\n readonly username: string;\n readonly password: string;\n readonly cachedAt: string;\n readonly expiresAt: string;\n}\n\ninterface StoredCredentialCache {\n readonly version: 1;\n readonly entries: readonly StoredCredentialEntry[];\n}\n\nexport interface CredentialCacheKey {\n readonly target: ResolvedTarget;\n readonly instanceSelector?: string;\n}\n\nexport interface CredentialCacheOptions {\n /** Which consumer's cache file to use — `~/.saptools/<cliName>/credentials.json`. Required: keeps cf-otel's, cf-metrics's, and cf-log-search's caches from ever colliding. */\n readonly cliName: string;\n readonly saptoolsRoot?: string;\n readonly now?: () => Date;\n readonly ttlMinutes?: number;\n}\n\nexport interface CachedCredentialSummary {\n readonly region: string;\n readonly org: string;\n readonly space: string;\n readonly instance: string;\n readonly source: string;\n readonly dashboardsEndpoint: string;\n readonly cachedAt: string;\n readonly expiresAt: string;\n}\n\nconst EMPTY_CACHE: StoredCredentialCache = { version: 1, entries: [] };\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction cachePath(options: CredentialCacheOptions): string {\n return join(resolveSaptoolsRoot(options.saptoolsRoot), options.cliName, CACHE_FILE_NAME);\n}\n\nfunction isStoredEntry(value: unknown): value is StoredCredentialEntry {\n if (!isRecord(value)) {\n return false;\n }\n const stringKeys: readonly (keyof StoredCredentialEntry)[] = [\n \"region\", \"apiEndpoint\", \"org\", \"space\", \"instanceSelector\", \"instance\", \"source\", \"dashboardsEndpoint\", \"username\", \"password\", \"cachedAt\", \"expiresAt\",\n ];\n return stringKeys.every((key) => {\n return typeof value[key] === \"string\";\n });\n}\n\nfunction readStore(path: string): StoredCredentialCache {\n const parsed = readJsonFileSync(path);\n if (!isRecord(parsed) || parsed[\"version\"] !== 1 || !Array.isArray(parsed[\"entries\"])) {\n return EMPTY_CACHE;\n }\n return { version: 1, entries: parsed[\"entries\"].filter(isStoredEntry) };\n}\n\nfunction writeStore(path: string, store: StoredCredentialCache): void {\n ensurePrivateDirectorySync(dirname(path));\n writeFileAtomicSync(path, `${JSON.stringify(store, null, 2)}\\n`, 0o600);\n}\n\nfunction normalizeEndpoint(apiEndpoint: string): string {\n return apiEndpoint.trim().toLowerCase().replace(/\\/+$/, \"\");\n}\n\nfunction matchesKey(entry: StoredCredentialEntry, key: CredentialCacheKey): boolean {\n if (normalizeEndpoint(entry.apiEndpoint) !== normalizeEndpoint(key.target.apiEndpoint) || entry.org !== key.target.org || entry.space !== key.target.space) {\n return false;\n }\n if (key.instanceSelector === undefined) {\n return entry.instanceSelector === AUTO_INSTANCE_SELECTOR;\n }\n return entry.instance === key.instanceSelector;\n}\n\nfunction isLive(entry: StoredCredentialEntry, nowMs: number): boolean {\n const expires = Date.parse(entry.expiresAt);\n return Number.isFinite(expires) && expires > nowMs;\n}\n\nfunction liveEntries(store: StoredCredentialCache, nowMs: number): readonly StoredCredentialEntry[] {\n return store.entries.filter((entry) => isLive(entry, nowMs));\n}\n\n// eslint-disable-next-line @typescript-eslint/require-await -- async is deliberate: it converts a synchronous throw from readStore into a rejected Promise, matching this function's Promise<...> contract\nexport async function readCachedCredential(key: CredentialCacheKey, options: CredentialCacheOptions): Promise<DashboardsCredential | undefined> {\n const store = readStore(cachePath(options));\n const nowMs = (options.now?.() ?? new Date()).getTime();\n const entry = liveEntries(store, nowMs).find((candidate) => matchesKey(candidate, key));\n if (entry === undefined) {\n return undefined;\n }\n return { dashboardsEndpoint: entry.dashboardsEndpoint, username: entry.username, password: entry.password, source: entry.source, instance: entry.instance };\n}\n\n// eslint-disable-next-line @typescript-eslint/require-await -- async is deliberate: it converts a synchronous throw from writeStore into a rejected Promise, matching this function's Promise<...> contract\nexport async function writeCachedCredential(key: CredentialCacheKey, credential: DashboardsCredential, options: CredentialCacheOptions): Promise<void> {\n const path = cachePath(options);\n const store = readStore(path);\n const now = options.now?.() ?? new Date();\n const ttlMinutes = options.ttlMinutes ?? DEFAULT_TTL_MINUTES;\n const entry: StoredCredentialEntry = {\n region: key.target.region,\n apiEndpoint: key.target.apiEndpoint,\n org: key.target.org,\n space: key.target.space,\n instanceSelector: key.instanceSelector ?? AUTO_INSTANCE_SELECTOR,\n instance: credential.instance,\n source: credential.source,\n dashboardsEndpoint: credential.dashboardsEndpoint,\n username: credential.username,\n password: credential.password,\n cachedAt: now.toISOString(),\n expiresAt: new Date(now.getTime() + ttlMinutes * 60_000).toISOString(),\n };\n const kept = liveEntries(store, now.getTime()).filter((candidate) => !matchesKey(candidate, key));\n writeStore(path, { version: 1, entries: [...kept, entry] });\n}\n\n// eslint-disable-next-line @typescript-eslint/require-await -- async is deliberate: it converts a synchronous throw from writeStore into a rejected Promise, matching this function's Promise<...> contract\nexport async function deleteCachedCredential(key: CredentialCacheKey, options: CredentialCacheOptions): Promise<boolean> {\n const path = cachePath(options);\n const store = readStore(path);\n const kept = store.entries.filter((candidate) => !matchesKey(candidate, key));\n if (kept.length === store.entries.length) {\n return false;\n }\n writeStore(path, { version: 1, entries: kept });\n return true;\n}\n\n// eslint-disable-next-line @typescript-eslint/require-await -- async is deliberate: it converts a synchronous throw from readStore into a rejected Promise, matching this function's Promise<...> contract\nexport async function listCachedCredentials(options: CredentialCacheOptions): Promise<readonly CachedCredentialSummary[]> {\n const store = readStore(cachePath(options));\n const nowMs = (options.now?.() ?? new Date()).getTime();\n return liveEntries(store, nowMs)\n .map((entry) => {\n return { region: entry.region, org: entry.org, space: entry.space, instance: entry.instance, source: entry.source, dashboardsEndpoint: entry.dashboardsEndpoint, cachedAt: entry.cachedAt, expiresAt: entry.expiresAt };\n })\n .sort((left, right) => {\n return `${left.region}/${left.org}/${left.space}/${left.instance}`.localeCompare(`${right.region}/${right.org}/${right.space}/${right.instance}`);\n });\n}\n\nexport async function clearCredentialCache(options: CredentialCacheOptions): Promise<number> {\n const path = cachePath(options);\n const store = readStore(path);\n const nowMs = (options.now?.() ?? new Date()).getTime();\n const count = liveEntries(store, nowMs).length;\n await rm(path, { force: true });\n const directory = dirname(path);\n const prefix = `${CACHE_FILE_NAME}.`;\n let names: readonly string[];\n try {\n names = await readdir(directory);\n } catch {\n return count;\n }\n await Promise.all(\n names\n .filter((name) => name.startsWith(prefix) && name.endsWith(\".tmp\"))\n .map(async (name) => {\n await rm(join(directory, name), { force: true });\n }),\n );\n return count;\n}\n","import { randomBytes } from \"node:crypto\";\nimport { mkdir, readdir, readFile, rename, rm, stat, unlink, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport { resolveSaptoolsRoot } from \"../saptools-paths.js\";\n\nconst RESULT_REF_PATTERN = /^[0-9a-f]{8}$/;\nconst TEMP_REF_PATTERN = /^([0-9a-f]{8})\\.tmp-(\\d+)$/;\nconst MANIFEST_FILE_NAME = \"manifest.json\";\nconst MAX_DATE_MILLIS = 8_640_000_000_000_000;\nconst DEFAULT_TTL_MINUTES = 10_080;\nconst DEFAULT_MAX_BYTES = 256 * 1024 * 1024;\n\ninterface StoredResultSession<TRow> {\n readonly version: 1;\n readonly ref: string;\n readonly createdAt: string;\n readonly expiresAt: string;\n readonly ttlMinutes: number;\n readonly command: string;\n readonly rows: readonly TRow[];\n}\n\nexport interface CreateResultSessionInput<TRow> {\n readonly cliName: string;\n readonly command: string;\n readonly rows: readonly TRow[];\n readonly ttlMinutes?: number;\n}\n\nexport interface ResultStoreOptions {\n readonly cliName: string;\n readonly saptoolsRoot?: string;\n readonly now?: () => Date;\n readonly ref?: string;\n readonly maxBytes?: number;\n}\n\nexport type ResultSession<TRow> = StoredResultSession<TRow>;\n\nexport interface ResultSessionSummary {\n readonly ref: string;\n readonly createdAt: string;\n readonly expiresAt: string;\n readonly command: string;\n readonly rowCount: number;\n}\n\nexport interface PruneOutcome {\n readonly removed: number;\n readonly failed: number;\n readonly retainedRefs: readonly string[];\n readonly strandedRemoved: number;\n}\n\nfunction resultsRoot(options: Pick<ResultStoreOptions, \"cliName\" | \"saptoolsRoot\">): string {\n return join(resolveSaptoolsRoot(options.saptoolsRoot), options.cliName, \"results\");\n}\n\nfunction sessionDirectory(ref: string, options: Pick<ResultStoreOptions, \"cliName\" | \"saptoolsRoot\">): string {\n return join(resultsRoot(options), ref);\n}\n\nfunction manifestPath(ref: string, options: Pick<ResultStoreOptions, \"cliName\" | \"saptoolsRoot\">): string {\n return join(sessionDirectory(ref, options), MANIFEST_FILE_NAME);\n}\n\nfunction resolveRef(value: string | undefined): string {\n const ref = value ?? randomBytes(4).toString(\"hex\");\n if (!RESULT_REF_PATTERN.test(ref)) {\n throw new Error(\"Invalid saved result ref\");\n }\n return ref;\n}\n\nfunction resolveTtl(value: number | undefined): number {\n const ttl = value ?? DEFAULT_TTL_MINUTES;\n if (!Number.isSafeInteger(ttl) || ttl <= 0) {\n throw new Error(\"Result TTL must be a positive safe integer\");\n }\n return ttl;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isStoredSession<TRow>(value: unknown): value is StoredResultSession<TRow> {\n return (\n isRecord(value) &&\n value[\"version\"] === 1 &&\n typeof value[\"ref\"] === \"string\" &&\n typeof value[\"createdAt\"] === \"string\" &&\n typeof value[\"expiresAt\"] === \"string\" &&\n typeof value[\"ttlMinutes\"] === \"number\" &&\n typeof value[\"command\"] === \"string\" &&\n Array.isArray(value[\"rows\"])\n );\n}\n\ntype SessionReadFailure = \"absent\" | \"unreadable\" | \"unrecognized\";\ntype SessionRead<TRow> = { readonly ok: true; readonly session: StoredResultSession<TRow> } | { readonly ok: false; readonly failure: SessionReadFailure };\n\nfunction isMissingPathError(error: unknown): boolean {\n const code = (error as NodeJS.ErrnoException | null)?.code;\n return code === \"ENOENT\" || code === \"ENOTDIR\";\n}\n\nasync function readStoredSession<TRow>(path: string): Promise<SessionRead<TRow>> {\n let text: string;\n try {\n text = await readFile(path, \"utf8\");\n } catch (error) {\n return { ok: false, failure: isMissingPathError(error) ? \"absent\" : \"unreadable\" };\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n return { ok: false, failure: \"unrecognized\" };\n }\n if (isStoredSession<TRow>(parsed)) {\n return { ok: true, session: parsed };\n }\n return { ok: false, failure: \"unrecognized\" };\n}\n\nfunction resolveExpiryMillis(session: StoredResultSession<unknown>): number | undefined {\n const explicit = Date.parse(session.expiresAt);\n if (Number.isFinite(explicit)) {\n return explicit;\n }\n const created = Date.parse(session.createdAt);\n if (!Number.isFinite(created) || !Number.isSafeInteger(session.ttlMinutes) || session.ttlMinutes <= 0) {\n return undefined;\n }\n const derived = created + session.ttlMinutes * 60_000;\n if (Math.abs(derived) > MAX_DATE_MILLIS) {\n return undefined;\n }\n return derived;\n}\n\nasync function listSessionRefs(options: ResultStoreOptions): Promise<readonly string[]> {\n try {\n const entries = await readdir(resultsRoot(options), { withFileTypes: true });\n return entries.filter((entry) => entry.isDirectory() && RESULT_REF_PATTERN.test(entry.name)).map((entry) => entry.name);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return [];\n }\n throw error;\n }\n}\n\nfunction isOwnerAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n return code !== \"ESRCH\";\n }\n}\n\nconst STRANDED_AGE_MS = 24 * 60 * 60 * 1000;\n\n/**\n * Remove `<ref>.tmp-<pid>` directories left behind by an interrupted save.\n * Liveness (`process.kill(pid, 0)`) is the primary gate — real-world\n * measurement (see `.plans` design doc / project memory) found pid reuse\n * rare enough that 100/100 real saves survived a sweep with only the\n * liveness check. The 24h mtime age gate is a fallback for a pid namespace\n * where a live pid in a *different* container reads as dead (`ESRCH`).\n */\nasync function removeStrandedTempDirectories(options: ResultStoreOptions): Promise<number> {\n const root = resultsRoot(options);\n let names: readonly string[];\n try {\n names = await readdir(root);\n } catch {\n return 0;\n }\n let removed = 0;\n for (const name of names) {\n const match = TEMP_REF_PATTERN.exec(name);\n if (match === null) {\n continue;\n }\n const pid = Number(match[2]);\n const path = join(root, name);\n let ageMs: number;\n try {\n ageMs = Date.now() - (await stat(path)).mtimeMs;\n } catch {\n continue;\n }\n if (isOwnerAlive(pid) && ageMs < STRANDED_AGE_MS) {\n continue;\n }\n try {\n await rm(path, { recursive: true, force: true });\n removed += 1;\n } catch {\n // best effort\n }\n }\n return removed;\n}\n\nexport async function createResultSession<TRow>(input: CreateResultSessionInput<TRow>, options: Omit<ResultStoreOptions, \"cliName\"> = {}): Promise<ResultSession<TRow>> {\n const fullOptions: ResultStoreOptions = { ...options, cliName: input.cliName };\n await pruneBestEffort(fullOptions);\n const ref = resolveRef(fullOptions.ref);\n const now = fullOptions.now?.() ?? new Date();\n const ttlMinutes = resolveTtl(input.ttlMinutes);\n const stored: StoredResultSession<TRow> = {\n version: 1,\n ref,\n createdAt: now.toISOString(),\n expiresAt: new Date(now.getTime() + ttlMinutes * 60_000).toISOString(),\n ttlMinutes,\n command: input.command,\n rows: input.rows,\n };\n const serialized = `${JSON.stringify(stored)}\\n`;\n if (Buffer.byteLength(serialized) > (fullOptions.maxBytes ?? DEFAULT_MAX_BYTES)) {\n throw new Error(\"Saved result exceeds the storage limit\");\n }\n const root = resultsRoot(fullOptions);\n const finalDirectory = sessionDirectory(ref, fullOptions);\n const tempDirectory = `${finalDirectory}.tmp-${process.pid.toString()}`;\n await mkdir(root, { recursive: true, mode: 0o700 });\n await rm(tempDirectory, { recursive: true, force: true });\n await mkdir(tempDirectory, { mode: 0o700 });\n try {\n await writeFile(join(tempDirectory, MANIFEST_FILE_NAME), serialized, { encoding: \"utf8\", mode: 0o600 });\n await rename(tempDirectory, finalDirectory);\n } catch (error) {\n await rm(tempDirectory, { recursive: true, force: true });\n throw error;\n }\n return stored;\n}\n\n/** Verify a saved result could be written, without writing one — call before expensive credential discovery so a broken store fails fast. */\nexport async function assertResultStoreWritable(options: ResultStoreOptions): Promise<void> {\n const root = resultsRoot(options);\n const probe = join(root, `.writable-${process.pid.toString()}-${randomBytes(4).toString(\"hex\")}`);\n try {\n await mkdir(root, { recursive: true, mode: 0o700 });\n await writeFile(probe, \"\", { encoding: \"utf8\", mode: 0o600 });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`--save cannot write to the saved-result store at ${root}: ${message}`, { cause: error });\n }\n try {\n await unlink(probe);\n } catch {\n // already proved what it was for\n }\n}\n\nfunction readFailureError(ref: string, failure: SessionReadFailure, options: ResultStoreOptions): Error {\n const path = manifestPath(ref, options);\n switch (failure) {\n case \"absent\": {\n return new Error(\"Saved result not found or expired\");\n }\n case \"unreadable\": {\n return new Error(`Saved result \"${ref}\" exists but could not be read; check permissions on ${path}`);\n }\n case \"unrecognized\": {\n return new Error(`Saved result \"${ref}\" is not in a format this version understands. It has been left in place at ${path}.`);\n }\n }\n}\n\nexport async function readResultSession<TRow>(ref: string, options: ResultStoreOptions): Promise<ResultSession<TRow>> {\n const resolvedRef = resolveRef(ref);\n await pruneBestEffort(options);\n const read = await readStoredSession<TRow>(manifestPath(resolvedRef, options));\n if (!read.ok) {\n throw readFailureError(resolvedRef, read.failure, options);\n }\n const now = (options.now?.() ?? new Date()).getTime();\n const expiry = resolveExpiryMillis(read.session);\n if (expiry === undefined) {\n throw readFailureError(resolvedRef, \"unrecognized\", options);\n }\n if (expiry <= now) {\n throw new Error(\"Saved result not found or expired\");\n }\n return read.session;\n}\n\nexport async function listResultSessions(options: ResultStoreOptions): Promise<readonly ResultSessionSummary[]> {\n await pruneBestEffort(options);\n const refs = await listSessionRefs(options);\n const now = (options.now?.() ?? new Date()).getTime();\n const reads = await Promise.all(refs.map(async (ref) => ({ ref, read: await readStoredSession(manifestPath(ref, options)) })));\n return reads\n .flatMap(({ ref, read }) => {\n if (!read.ok) {\n return [];\n }\n const expiry = resolveExpiryMillis(read.session);\n if (expiry === undefined || expiry <= now) {\n return [];\n }\n return [{ ref, createdAt: read.session.createdAt, expiresAt: read.session.expiresAt, command: read.session.command, rowCount: read.session.rows.length }];\n })\n .sort((left, right) => left.ref.localeCompare(right.ref));\n}\n\nasync function isEmptyDirectory(path: string): Promise<boolean> {\n try {\n return (await readdir(path)).length === 0;\n } catch {\n return false;\n }\n}\n\nexport async function pruneResultSessions(options: ResultStoreOptions): Promise<PruneOutcome> {\n const refs = await listSessionRefs(options);\n const now = (options.now?.() ?? new Date()).getTime();\n let removed = 0;\n let failed = 0;\n const retainedRefs: string[] = [];\n for (const ref of refs) {\n const directory = sessionDirectory(ref, options);\n const read = await readStoredSession(manifestPath(ref, options));\n if (!read.ok && read.failure !== \"absent\") {\n retainedRefs.push(ref);\n continue;\n }\n if (read.ok) {\n const expiry = resolveExpiryMillis(read.session);\n if (expiry === undefined) {\n retainedRefs.push(ref);\n continue;\n }\n if (expiry > now) {\n continue;\n }\n }\n if (!read.ok && !(await isEmptyDirectory(directory))) {\n retainedRefs.push(ref);\n continue;\n }\n try {\n await rm(directory, { recursive: true, force: true });\n removed += 1;\n } catch {\n failed += 1;\n }\n }\n const strandedRemoved = await removeStrandedTempDirectories(options);\n return { removed, failed, retainedRefs, strandedRemoved };\n}\n\nasync function pruneBestEffort(options: ResultStoreOptions): Promise<void> {\n try {\n await pruneResultSessions(options);\n } catch {\n // Intentionally ignored: a broken store must not block save/read/list of an intact session.\n }\n}\n\nexport async function clearResultSessions(options: ResultStoreOptions): Promise<number> {\n const refs = await listSessionRefs(options);\n await Promise.all(refs.map(async (ref) => { await rm(sessionDirectory(ref, options), { recursive: true, force: true }); }));\n return refs.length;\n}\n","import process from \"node:process\";\n\nimport { fetchInspectorVersion } from \"../../inspector/discovery.js\";\nimport type { AttachCommandOptions } from \"../commandTypes.js\";\nimport { writeJson } from \"../output.js\";\nimport { openTarget, resolveTargetWithCurrentCfTarget } from \"../target.js\";\n\nexport async function handleAttach(opts: AttachCommandOptions): Promise<void> {\n const target = await resolveTargetWithCurrentCfTarget(opts);\n const tunnel = await openTarget(target);\n try {\n const version = await fetchInspectorVersion(tunnel.host, tunnel.port, 5_000);\n if (opts.json) {\n writeJson({ host: tunnel.host, port: tunnel.port, ...version });\n return;\n }\n process.stdout.write(\n `Connected to ${tunnel.host}:${tunnel.port.toString()}\\n` +\n ` Browser: ${version.browser}\\n` +\n ` Protocol: ${version.protocolVersion}\\n`,\n );\n } finally {\n await tunnel.dispose();\n }\n}\n","import { request } from \"node:http\";\nimport { performance } from \"node:perf_hooks\";\n\nimport { CfInspectorError } from \"../types.js\";\n\nexport interface InspectorTarget {\n readonly description: string;\n readonly devtoolsFrontendUrl?: string;\n readonly faviconUrl?: string;\n readonly id: string;\n readonly title: string;\n readonly type: string;\n readonly url: string;\n readonly webSocketDebuggerUrl: string;\n}\n\nexport interface InspectorVersion {\n readonly browser: string;\n readonly protocolVersion: string;\n}\n\nexport interface InspectorKeepaliveOptions {\n readonly intervalMs?: number;\n readonly probeTimeoutMs?: number;\n readonly failureThreshold?: number;\n readonly probe?: () => Promise<unknown>;\n}\n\nexport interface InspectorKeepalive {\n readonly failure: Promise<never>;\n cancel(): void;\n}\n\ninterface NodeSystemError extends Error {\n readonly code?: string;\n readonly syscall?: string;\n readonly address?: string;\n readonly port?: number;\n}\n\nclass InvalidDiscoveryPayloadError extends CfInspectorError {}\n\nasync function fetchJson<T>(url: string, timeoutMs: number): Promise<T> {\n const deadline = performance.now() + timeoutMs;\n let lastError: unknown;\n\n while (performance.now() < deadline) {\n try {\n const remainingMs = deadline - performance.now();\n if (remainingMs <= 0) {\n break;\n }\n return await new Promise<T>((resolve, reject) => {\n const req = request(url, { method: \"GET\" }, (res) => {\n const chunks: Buffer[] = [];\n res.on(\"data\", (chunk: Buffer) => {\n chunks.push(chunk);\n });\n res.on(\"end\", () => {\n try {\n resolve(parseJsonResponse(chunks) as T);\n } catch (err: unknown) {\n reject(parseDiscoveryError(url, err));\n }\n });\n res.on(\"error\", (err) => {\n reject(newDiscoveryError(`Inspector discovery response error: ${err.message}`));\n });\n });\n const attemptTimeoutMs = Math.min(2000, remainingMs);\n req.setTimeout(attemptTimeoutMs, () => {\n req.destroy(\n new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Inspector discovery at ${url} timed out after ${timeoutMs.toString()}ms`,\n ),\n );\n });\n req.on(\"error\", (err) => {\n reject(err instanceof CfInspectorError ? err : formatDiscoveryRequestError(url, err));\n });\n req.end();\n });\n } catch (err: unknown) {\n if (err instanceof InvalidDiscoveryPayloadError) {\n throw err;\n }\n lastError = err;\n const now = performance.now();\n if (now < deadline) {\n const sleepMs = Math.min(1000, deadline - now);\n await new Promise((r) => setTimeout(r, sleepMs));\n }\n }\n }\n\n if (lastError instanceof Error) {\n throw lastError;\n }\n throw new CfInspectorError(\"INSPECTOR_DISCOVERY_FAILED\", `Inspector discovery at ${url} timed out after ${timeoutMs.toString()}ms`);\n}\n\nfunction isNodeSystemError(err: unknown): err is NodeSystemError {\n return err instanceof Error;\n}\n\nfunction isConnectionRefusedOrUnreachable(code: string | undefined): boolean {\n return code === \"ECONNREFUSED\" ||\n code === \"ECONNRESET\" ||\n code === \"ETIMEDOUT\" ||\n code === \"EHOSTUNREACH\" ||\n code === \"ENETUNREACH\";\n}\n\nfunction formatEndpoint(url: string, err: NodeSystemError): string {\n if (typeof err.address === \"string\" && typeof err.port === \"number\") {\n return `${err.address}:${err.port.toString()}`;\n }\n const parsed = new URL(url);\n return parsed.host;\n}\n\nfunction formatDiscoveryRequestError(url: string, err: unknown): CfInspectorError {\n const detail = err instanceof Error ? err.message : String(err);\n if (!isNodeSystemError(err) || !isConnectionRefusedOrUnreachable(err.code)) {\n return new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Inspector discovery at ${url} failed: ${detail}`,\n );\n }\n const endpoint = formatEndpoint(url, err);\n return new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Cannot reach Node inspector discovery at ${url}. Nothing is listening on ${endpoint}, or the inspector tunnel is stale/closed. Restart the local inspector or tunnel and retry. If this port came from cf-debugger, stop the stale session and start a fresh tunnel, or run cf-inspector with --app/--region/--org/--space so it can open a tunnel.`,\n detail,\n );\n}\n\nfunction parseJsonResponse(chunks: readonly Buffer[]): unknown {\n const text = Buffer.concat(chunks).toString(\"utf8\");\n return JSON.parse(text) as unknown;\n}\n\nfunction parseDiscoveryError(url: string, err: unknown): CfInspectorError {\n const message = err instanceof Error ? err.message : String(err);\n return new InvalidDiscoveryPayloadError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Failed to parse inspector discovery response from ${url}: ${message}`,\n );\n}\n\nfunction newDiscoveryError(message: string): CfInspectorError {\n return new CfInspectorError(\"INSPECTOR_DISCOVERY_FAILED\", message);\n}\n\nfunction toInspectorTarget(value: unknown, source: string): InspectorTarget {\n if (typeof value !== \"object\" || value === null) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Inspector target is not an object in ${source}`,\n );\n }\n const candidate = value as Record<string, unknown>;\n const webSocketDebuggerUrl = candidate[\"webSocketDebuggerUrl\"];\n if (typeof webSocketDebuggerUrl !== \"string\" || webSocketDebuggerUrl.length === 0) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Inspector target is missing webSocketDebuggerUrl in ${source}`,\n );\n }\n return {\n description: typeof candidate[\"description\"] === \"string\" ? candidate[\"description\"] : \"\",\n id: typeof candidate[\"id\"] === \"string\" ? candidate[\"id\"] : \"\",\n title: typeof candidate[\"title\"] === \"string\" ? candidate[\"title\"] : \"\",\n type: typeof candidate[\"type\"] === \"string\" ? candidate[\"type\"] : \"\",\n url: typeof candidate[\"url\"] === \"string\" ? candidate[\"url\"] : \"\",\n webSocketDebuggerUrl,\n ...(typeof candidate[\"devtoolsFrontendUrl\"] === \"string\"\n ? { devtoolsFrontendUrl: candidate[\"devtoolsFrontendUrl\"] }\n : {}),\n ...(typeof candidate[\"faviconUrl\"] === \"string\" ? { faviconUrl: candidate[\"faviconUrl\"] } : {}),\n };\n}\n\nexport async function discoverInspectorTargets(\n host: string,\n port: number,\n timeoutMs: number,\n): Promise<readonly InspectorTarget[]> {\n const url = `http://${host}:${port.toString()}/json/list`;\n const raw = await fetchJson<unknown>(url, timeoutMs);\n if (!Array.isArray(raw) || raw.length === 0) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `No inspector targets returned from ${url}`,\n );\n }\n return raw.map((entry, idx): InspectorTarget => toInspectorTarget(entry, `${url}[${idx.toString()}]`));\n}\n\nfunction readVersionField(value: Record<string, unknown>, ...keys: readonly string[]): string | undefined {\n for (const key of keys) {\n const entry = value[key];\n if (typeof entry === \"string\" && entry.length > 0) {\n return entry;\n }\n }\n return undefined;\n}\n\nexport async function fetchInspectorVersion(\n host: string,\n port: number,\n timeoutMs: number,\n): Promise<InspectorVersion> {\n const url = `http://${host}:${port.toString()}/json/version`;\n const raw = await fetchJson<unknown>(url, timeoutMs);\n if (typeof raw !== \"object\" || raw === null) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Unexpected /json/version response from ${url}`,\n );\n }\n const value = raw as Record<string, unknown>;\n const browser = readVersionField(value, \"Browser\", \"browser\");\n const protocolVersion = readVersionField(value, \"Protocol-Version\", \"protocolVersion\");\n if (browser === undefined || protocolVersion === undefined) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Unexpected /json/version response from ${url}`,\n );\n }\n return { browser, protocolVersion };\n}\n\nexport function startInspectorKeepalive(\n host: string,\n port: number,\n options: InspectorKeepaliveOptions = {},\n): InspectorKeepalive {\n const intervalMs = options.intervalMs ?? 10_000;\n const probeTimeoutMs = options.probeTimeoutMs ?? 2_000;\n const failureThreshold = options.failureThreshold ?? 3;\n const probe = options.probe ?? (async (): Promise<unknown> =>\n await fetchInspectorVersion(host, port, probeTimeoutMs));\n let cancelled = false;\n let consecutiveFailures = 0;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let rejectFailure: ((error: Error) => void) | undefined;\n const failure = new Promise<never>((_resolve, reject) => {\n rejectFailure = reject;\n });\n const schedule = (): void => {\n if (cancelled) {\n return;\n }\n timer = setTimeout(() => {\n void runProbe();\n }, intervalMs);\n };\n const runProbe = async (): Promise<void> => {\n try {\n await probe();\n consecutiveFailures = 0;\n } catch (error: unknown) {\n consecutiveFailures += 1;\n if (consecutiveFailures >= failureThreshold) {\n cancelled = true;\n const detail = error instanceof Error ? error.message : String(error);\n rejectFailure?.(new CfInspectorError(\n \"INSPECTOR_CONNECTION_FAILED\",\n `Inspector tunnel ${host}:${port.toString()} failed ${failureThreshold.toString()} consecutive keepalive probes and is no longer round-tripping. Retry the command after restarting or investigating the owning tunnel session.`,\n detail,\n ));\n return;\n }\n }\n schedule();\n };\n schedule();\n return {\n failure,\n cancel: (): void => {\n cancelled = true;\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n },\n };\n}\n","import process from \"node:process\";\n\nimport type { LogpointEvent } from \"../logpoint/events.js\";\nimport type {\n ArmedEvent,\n ExceptionSnapshot,\n FrameSnapshot,\n SnapshotResult,\n WatchEvent,\n} from \"../types.js\";\n\ninterface TruncationSummary {\n readonly truncated?: true;\n readonly originalLength?: number;\n readonly omittedCount?: number;\n}\n\nexport function writeProgress(message: string): void {\n process.stderr.write(`[cf-inspector] ${message}\\n`);\n}\n\nexport function writeArmedEvent(\n event: Omit<ArmedEvent, \"event\" | \"schemaVersion\">,\n): void {\n const payload: ArmedEvent = {\n event: \"breakpoint-armed\",\n schemaVersion: 1,\n ...event,\n };\n process.stderr.write(`${JSON.stringify(payload)}\\n`);\n}\n\nexport function writeJson(value: unknown): void {\n process.stdout.write(`${JSON.stringify(value, null, 2)}\\n`);\n}\n\nexport function writeHumanSnapshot(snapshot: SnapshotResult): void {\n const pausedDuration = snapshot.pausedDurationMs === null\n ? \"unknown\"\n : `${snapshot.pausedDurationMs.toFixed(1)}ms`;\n const lines: string[] = [];\n lines.push(\n `Snapshot @ ${snapshot.capturedAt}`,\n ` reason: ${snapshot.reason}`,\n ` isolate: ${formatIsolate(snapshot.isolate)}`,\n ` paused: ${pausedDuration}`,\n );\n if (snapshot.exception !== undefined) {\n appendExceptionLines(lines, snapshot.exception);\n }\n if (snapshot.topFrame) {\n appendFrameLines(lines, snapshot.topFrame);\n }\n if (snapshot.captures.length > 0) {\n lines.push(\" captures:\");\n for (const capture of snapshot.captures) {\n const detail = capture.error ?? capture.value ?? \"undefined\";\n lines.push(` ${capture.expression} = ${renderTruncated(detail, capture)}`);\n }\n }\n if (snapshot.stack !== undefined && snapshot.stack.length > 0) {\n lines.push(\" stack:\");\n for (const frame of snapshot.stack) {\n appendStackFrameLine(lines, frame);\n }\n }\n process.stdout.write(`${lines.join(\"\\n\")}\\n`);\n}\n\nfunction appendFrameLines(lines: string[], frame: FrameSnapshot): void {\n const fnName = frame.functionName.length === 0 ? \"(anonymous)\" : frame.functionName;\n const sourceUrl = frame.url !== undefined && frame.url.length > 0 ? frame.url : \"(unknown)\";\n lines.push(\n ` frame: ${fnName} ${sourceUrl}:${frame.line.toString()}:${frame.column.toString()}`,\n );\n if (frame.truncated === true) {\n lines.push(` scopes: ${truncationLabel(frame)}`);\n }\n if (frame.scopes === undefined) {\n return;\n }\n for (const scope of frame.scopes) {\n const scopeSuffix = scope.truncated === true ? `; ${truncationLabel(scope)}` : \"\";\n lines.push(` scope ${scope.type} (${scope.variables.length.toString()} vars${scopeSuffix}):`);\n for (const variable of scope.variables) {\n lines.push(` ${variable.name} = ${renderTruncated(variable.value, variable)}`);\n }\n }\n}\n\nfunction appendStackFrameLine(lines: string[], frame: FrameSnapshot): void {\n const fnName = frame.functionName.length === 0 ? \"(anonymous)\" : frame.functionName;\n const sourceUrl = frame.url !== undefined && frame.url.length > 0 ? frame.url : \"(unknown)\";\n lines.push(` ${fnName} ${sourceUrl}:${frame.line.toString()}:${frame.column.toString()}`);\n if (frame.captures !== undefined) {\n for (const capture of frame.captures) {\n const detail = capture.error ?? capture.value ?? \"undefined\";\n lines.push(` ${capture.expression} = ${renderTruncated(detail, capture)}`);\n }\n }\n}\n\nfunction appendExceptionLines(lines: string[], exception: ExceptionSnapshot): void {\n if (exception.error !== undefined) {\n lines.push(` exception: !err ${exception.error}`);\n return;\n }\n lines.push(` exception: ${renderExceptionDetail(exception)}`);\n}\n\nexport function writeLogEvent(event: LogpointEvent, json: boolean): void {\n if (json) {\n process.stdout.write(`${JSON.stringify(event)}\\n`);\n return;\n }\n const isolateSuffix = event.isolate === undefined ? \"\" : ` (${formatIsolate(event.isolate)})`;\n if (event.error !== undefined) {\n process.stdout.write(`[${event.ts}] ${event.at}${isolateSuffix} !err ${renderTruncated(event.error, event)}\\n`);\n return;\n }\n process.stdout.write(`[${event.ts}] ${event.at}${isolateSuffix} ${renderTruncated(event.value ?? \"\", event)}\\n`);\n}\n\nexport function writeWatchEvent(event: WatchEvent, json: boolean): void {\n if (json) {\n process.stdout.write(`${JSON.stringify(event)}\\n`);\n return;\n }\n process.stdout.write(\n `[${event.ts}] hit#${event.hit.toString()} ${event.at} (${formatIsolate(event.isolate)})\\n`,\n );\n if (event.exception !== undefined) {\n process.stdout.write(` exception: ${renderExceptionDetail(event.exception)}\\n`);\n }\n for (const capture of event.captures) {\n const detail = capture.error ?? capture.value ?? \"undefined\";\n process.stdout.write(` ${capture.expression} = ${renderTruncated(detail, capture)}\\n`);\n }\n}\n\nfunction formatIsolate(isolate: SnapshotResult[\"isolate\"]): string {\n if (isolate?.kind === \"worker\") {\n return `worker ${isolate.workerId}`;\n }\n return \"main\";\n}\n\nfunction renderExceptionDetail(exception: ExceptionSnapshot): string {\n if (exception.description !== undefined) {\n const originalLength = exception.descriptionOriginalLength;\n return renderTruncated(\n exception.description,\n originalLength === undefined ? {} : { truncated: true, originalLength },\n );\n }\n if (exception.value !== undefined) {\n const originalLength = exception.valueOriginalLength ?? exception.originalLength;\n const summary: TruncationSummary = {\n ...(originalLength === undefined ? {} : { truncated: true, originalLength }),\n ...(exception.omittedCount === undefined\n ? {}\n : { truncated: true, omittedCount: exception.omittedCount }),\n };\n return renderTruncated(exception.value, summary);\n }\n return exception.error ?? \"(unknown)\";\n}\n\nfunction renderTruncated(value: string, summary: TruncationSummary): string {\n if (summary.truncated !== true) {\n return value;\n }\n const visualValue = summary.originalLength === undefined ? value : `${value}…`;\n return `${visualValue} [${truncationLabel(summary)}]`;\n}\n\nfunction truncationLabel(summary: TruncationSummary): string {\n const details: string[] = [];\n if (summary.originalLength !== undefined) {\n details.push(`original ${summary.originalLength.toString()} chars`);\n }\n if (summary.omittedCount !== undefined) {\n details.push(`${summary.omittedCount.toString()} omitted`);\n }\n return details.length === 0 ? \"truncated\" : `truncated: ${details.join(\", \")}`;\n}\n","import {\n type SessionStatus,\n} from \"@saptools/cf-debugger\";\n\nimport { openCfTunnel } from \"../cf/tunnel.js\";\nimport { connectInspector, connectInspectorGroup } from \"../inspector/session.js\";\nimport type { InspectorSession, InspectorSessionGroup } from \"../inspector/types.js\";\nimport { CfInspectorError } from \"../types.js\";\n\nimport { DEFAULT_CF_TIMEOUT_SEC } from \"./commandTypes.js\";\nimport type { SharedTargetOptions, Target } from \"./commandTypes.js\";\nimport { acquireDebugSessionLock } from \"./sessionLock.js\";\nimport { warnOnImplicitInspectorSelection } from \"./warnings.js\";\n\nexport type ProgressReporter = (message: string) => void;\n\nconst CF_TUNNEL_STATUS_MESSAGES = {\n starting: \"Preparing the Cloud Foundry debugger...\",\n \"logging-in\": \"Logging in to Cloud Foundry...\",\n targeting: \"Targeting the Cloud Foundry org and space...\",\n \"ssh-enabling\": \"Enabling SSH for the Cloud Foundry app...\",\n \"ssh-restarting\": \"Restarting the Cloud Foundry app to activate SSH...\",\n signaling: \"Starting the remote Node.js inspector...\",\n tunneling: \"Opening the SSH inspector tunnel...\",\n ready: \"Cloud Foundry inspector tunnel is ready.\",\n stopping: \"Closing the Cloud Foundry inspector tunnel...\",\n stopped: \"Cloud Foundry inspector tunnel closed.\",\n error: \"Cloud Foundry inspector tunnel failed.\",\n} as const satisfies Readonly<Record<SessionStatus, string>>;\n\nexport function formatCfTunnelStatus(status: SessionStatus): string {\n return CF_TUNNEL_STATUS_MESSAGES[status];\n}\n\nexport function parsePositiveInt(raw: string | undefined, label: string): number | undefined {\n if (raw === undefined) {\n return undefined;\n }\n const value = Number.parseInt(raw, 10);\n if (Number.isNaN(value) || value <= 0 || value.toString() !== raw.trim()) {\n throw new CfInspectorError(\"INVALID_ARGUMENT\", `Invalid ${label}: \"${raw}\" — expected a positive integer`);\n }\n return value;\n}\n\nexport interface TargetResolveOptions {\n readonly useTimeoutForTunnel?: boolean;\n}\n\nexport function resolveTarget(opts: SharedTargetOptions, options: TargetResolveOptions = {}): Target {\n const port = parsePositiveInt(opts.port, \"--port\");\n const targetIndex = parseTargetIndex(opts.target);\n const workerIndex = parseSelectionIndex(opts.worker, \"--worker\");\n const workerId = parseWorkerId(opts.workerId);\n const mainOnly = opts.mainOnly === true;\n validateIsolateSelectors(targetIndex, workerIndex, workerId, mainOnly);\n if (port !== undefined) {\n return {\n kind: \"port\",\n port,\n host: opts.host ?? \"127.0.0.1\",\n ...selectionOptions(targetIndex, workerIndex, workerId, mainOnly),\n };\n }\n\n const region = optionalText(opts.region);\n const org = optionalText(opts.org);\n const space = optionalText(opts.space);\n const app = optionalText(opts.app);\n const missingFlags = [\n ...(region === undefined ? [\"--region\"] : []),\n ...(org === undefined ? [\"--org\"] : []),\n ...(space === undefined ? [\"--space\"] : []),\n ...(app === undefined ? [\"--app\"] : []),\n ];\n if (region === undefined || org === undefined || space === undefined || app === undefined) {\n throw new CfInspectorError(\n \"MISSING_TARGET\",\n `Cloud Foundry targeting requires explicit selectors. Missing: ${missingFlags.join(\", \")}. ` +\n \"cf-inspector does not consult ambient `cf target` because it can silently change between runs.\",\n );\n }\n\n return buildCfTarget(\n region,\n optionalText(opts.apiEndpoint),\n org,\n space,\n app,\n parseTunnelTimeout(opts, options),\n targetIndex,\n workerIndex,\n workerId,\n mainOnly,\n );\n}\n\nexport async function resolveTargetWithCurrentCfTarget(\n opts: SharedTargetOptions,\n options: TargetResolveOptions = {},\n): Promise<Target> {\n return await Promise.resolve(resolveTarget(opts, options));\n}\n\nfunction parseTunnelTimeout(opts: SharedTargetOptions, options: TargetResolveOptions): number {\n if (options.useTimeoutForTunnel === false) {\n return DEFAULT_CF_TIMEOUT_SEC;\n }\n return parsePositiveInt(opts.timeout, \"--timeout\") ?? DEFAULT_CF_TIMEOUT_SEC;\n}\n\nfunction parseTargetIndex(raw: string | undefined): number | undefined {\n return parseSelectionIndex(raw, \"--target\");\n}\n\nfunction parseSelectionIndex(raw: string | undefined, label: string): number | undefined {\n if (raw === undefined) {\n return undefined;\n }\n const value = Number.parseInt(raw, 10);\n if (Number.isNaN(value) || value < 0 || value.toString() !== raw.trim()) {\n throw new CfInspectorError(\n \"INVALID_ARGUMENT\",\n `Invalid ${label}: \"${raw}\" — expected a non-negative integer`,\n );\n }\n return value;\n}\n\nfunction targetIndexOption(targetIndex: number | undefined): { readonly targetIndex?: number } {\n return targetIndex === undefined ? {} : { targetIndex };\n}\n\nfunction selectionOptions(\n targetIndex: number | undefined,\n workerIndex: number | undefined,\n workerId?: string,\n mainOnly?: boolean,\n): { readonly targetIndex?: number; readonly workerIndex?: number; readonly workerId?: string; readonly mainOnly?: boolean } {\n return {\n ...targetIndexOption(targetIndex),\n ...(workerIndex === undefined ? {} : { workerIndex }),\n ...(workerId === undefined ? {} : { workerId }),\n ...(mainOnly === true ? { mainOnly: true } : {}),\n };\n}\n\nfunction buildCfTarget(\n region: string,\n apiEndpoint: string | undefined,\n org: string,\n space: string,\n app: string,\n tunnelTimeoutSec: number,\n targetIndex: number | undefined,\n workerIndex: number | undefined,\n workerId: string | undefined,\n mainOnly: boolean,\n): Target {\n return {\n kind: \"cf\",\n region,\n ...(apiEndpoint === undefined ? {} : { apiEndpoint }),\n org,\n space,\n app,\n tunnelTimeoutMs: tunnelTimeoutSec * 1000,\n ...selectionOptions(targetIndex, workerIndex, workerId, mainOnly),\n };\n}\n\nfunction validateIsolateSelectors(\n targetIndex: number | undefined,\n workerIndex: number | undefined,\n workerId: string | undefined,\n mainOnly: boolean,\n): void {\n const workerSelectors = Number(workerIndex !== undefined) + Number(workerId !== undefined);\n if (workerSelectors > 1 || (mainOnly && workerSelectors > 0)) {\n throw new CfInspectorError(\n \"INVALID_ARGUMENT\",\n \"Use only one of --worker, --worker-id, or --main-only.\",\n );\n }\n if (targetIndex !== undefined && workerSelectors === 0 && !mainOnly) {\n return;\n }\n}\n\nfunction optionalText(value: string | undefined): string | undefined {\n const trimmed = value?.trim();\n return trimmed === undefined || trimmed.length === 0 ? undefined : trimmed;\n}\n\nfunction parseWorkerId(value: string | undefined): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n const trimmed = value.trim();\n if (trimmed.length === 0) {\n throw new CfInspectorError(\n \"INVALID_ARGUMENT\",\n \"Invalid --worker-id: expected a non-empty workerId from list-targets\",\n );\n }\n return trimmed;\n}\n\ninterface ResolvedTunnel {\n readonly port: number;\n readonly host: string;\n readonly dispose: () => Promise<void>;\n}\n\nexport async function withSession<T>(\n target: Target,\n fn: (session: InspectorSession, port: number) => Promise<T>,\n reportProgress?: ProgressReporter,\n signal?: AbortSignal,\n): Promise<T> {\n const lock = await acquireDebugSessionLock(target);\n try {\n const tunnel = await openTarget(target, reportProgress, signal);\n let session: InspectorSession | undefined;\n try {\n reportProgress?.(\n `Connecting to the Node.js inspector at ${tunnel.host}:${tunnel.port.toString()}...`,\n );\n session = await connectInspector({\n port: tunnel.port,\n host: tunnel.host,\n ...selectionOptions(target.targetIndex, target.workerIndex),\n ...(target.workerId === undefined ? {} : { workerId: target.workerId }),\n });\n warnOnImplicitInspectorSelection(\n session,\n target.targetIndex !== undefined,\n target.workerIndex !== undefined || target.workerId !== undefined,\n );\n reportProgress?.(\"Inspector session is ready.\");\n return await fn(session, tunnel.port);\n } finally {\n if (session) {\n reportProgress?.(\"Closing the inspector session...\");\n await session.dispose();\n reportProgress?.(\"Inspector session closed.\");\n }\n await tunnel.dispose();\n }\n } finally {\n await lock.release();\n }\n}\n\nexport async function withSessions<T>(\n target: Target,\n fn: (group: InspectorSessionGroup, port: number) => Promise<T>,\n reportProgress?: ProgressReporter,\n signal?: AbortSignal,\n): Promise<T> {\n const lock = await acquireDebugSessionLock(target);\n try {\n const tunnel = await openTarget(target, reportProgress, signal);\n let group: InspectorSessionGroup | undefined;\n try {\n reportProgress?.(\n `Connecting to the Node.js inspector at ${tunnel.host}:${tunnel.port.toString()}...`,\n );\n const autoAttach = target.targetIndex === undefined && target.workerIndex === undefined &&\n target.workerId === undefined && target.mainOnly !== true;\n if (autoAttach) {\n group = await connectInspectorGroup({ port: tunnel.port, host: tunnel.host });\n } else {\n const session = await connectInspector({\n port: tunnel.port,\n host: tunnel.host,\n ...selectionOptions(target.targetIndex, target.workerIndex, target.workerId),\n });\n group = singleSessionGroup(session);\n }\n reportProgress?.(\"Inspector session is ready.\");\n return await fn(group, tunnel.port);\n } finally {\n try {\n if (group !== undefined) {\n const sessionCount = group.list().length;\n reportProgress?.(sessionCount === 1\n ? \"Closing the inspector session...\"\n : `Closing ${sessionCount.toString()} inspector sessions...`);\n await group.dispose();\n reportProgress?.(sessionCount === 1\n ? \"Inspector session closed.\"\n : \"Inspector sessions closed.\");\n }\n } finally {\n await tunnel.dispose();\n }\n }\n } finally {\n await lock.release();\n }\n}\n\nfunction singleSessionGroup(session: InspectorSession): InspectorSessionGroup {\n return {\n targetIndex: session.targetIndex ?? 0,\n targetCount: session.targetCount ?? 1,\n workerDiscoverySupported: session.workerDiscoverySupported ?? false,\n list: (): readonly InspectorSession[] => [session],\n onSession: (listener): (() => void) => {\n listener(session);\n return (): void => undefined;\n },\n onSessionRemoved: (): (() => void) => (): void => undefined,\n onError: (): (() => void) => (): void => undefined,\n dispose: async (): Promise<void> => {\n await session.dispose();\n },\n };\n}\n\nexport async function openTarget(\n target: Target,\n reportProgress?: ProgressReporter,\n signal?: AbortSignal,\n): Promise<ResolvedTunnel> {\n if (target.kind === \"port\") {\n return {\n port: target.port,\n host: target.host,\n dispose: (): Promise<void> => Promise.resolve(),\n };\n }\n reportProgress?.(formatCfTunnelStatus(\"starting\"));\n const tunnel = await openCfTunnel({\n region: target.region,\n ...(target.apiEndpoint === undefined ? {} : { apiEndpoint: target.apiEndpoint }),\n org: target.org,\n space: target.space,\n app: target.app,\n tunnelReadyTimeoutMs: target.tunnelTimeoutMs,\n ...(signal === undefined ? {} : { signal }),\n ...(reportProgress === undefined\n ? {}\n : {\n onStatus: (status: SessionStatus, message?: string): void => {\n reportProgress(message ?? formatCfTunnelStatus(status));\n },\n }),\n });\n return {\n port: tunnel.localPort,\n host: \"127.0.0.1\",\n dispose: async (): Promise<void> => {\n await tunnel.dispose();\n },\n };\n}\n","import { startDebugger } from \"@saptools/cf-debugger\";\nimport type { DebuggerHandle, SessionStatus, StartDebuggerOptions } from \"@saptools/cf-debugger\";\n\nimport { fetchInspectorVersion } from \"../inspector/discovery.js\";\nimport { CfInspectorError } from \"../types.js\";\n\nconst REUSED_TUNNEL_GRACE_MS = 5_000;\n\nexport interface TunnelTarget {\n readonly region: string;\n readonly apiEndpoint?: string;\n readonly org: string;\n readonly space: string;\n readonly app: string;\n readonly process?: string;\n readonly instance?: number;\n readonly nodePid?: number;\n readonly allowSshEnableRestart?: boolean;\n readonly tunnelReadyTimeoutMs?: number;\n readonly preferredPort?: number;\n readonly verbose?: boolean;\n readonly signal?: AbortSignal;\n readonly onStatus?: (status: SessionStatus, message?: string) => void;\n}\n\nexport interface OpenedTunnel {\n readonly localPort: number;\n readonly handle?: DebuggerHandle;\n dispose(): Promise<void>;\n}\n\nfunction targetOptions(\n target: TunnelTarget,\n): Pick<StartDebuggerOptions, \"apiEndpoint\" | \"process\" | \"instance\" | \"nodePid\"> {\n return {\n ...(target.apiEndpoint === undefined ? {} : { apiEndpoint: target.apiEndpoint }),\n ...(target.process === undefined ? {} : { process: target.process }),\n ...(target.instance === undefined ? {} : { instance: target.instance }),\n ...(target.nodePid === undefined ? {} : { nodePid: target.nodePid }),\n };\n}\n\nfunction lifecycleOptions(\n target: TunnelTarget,\n): Pick<\n StartDebuggerOptions,\n \"allowSshEnableRestart\" | \"tunnelReadyTimeoutMs\" | \"preferredPort\" | \"verbose\" | \"signal\" | \"onStatus\"\n> {\n return {\n ...(target.allowSshEnableRestart === undefined ? {} : { allowSshEnableRestart: target.allowSshEnableRestart }),\n ...(target.tunnelReadyTimeoutMs === undefined ? {} : { tunnelReadyTimeoutMs: target.tunnelReadyTimeoutMs }),\n ...(target.preferredPort === undefined ? {} : { preferredPort: target.preferredPort }),\n ...(target.verbose === undefined ? {} : { verbose: target.verbose }),\n ...(target.signal === undefined ? {} : { signal: target.signal }),\n ...(target.onStatus === undefined ? {} : { onStatus: target.onStatus }),\n };\n}\n\nfunction toStartDebuggerOptions(target: TunnelTarget): StartDebuggerOptions {\n return {\n region: target.region,\n org: target.org,\n space: target.space,\n app: target.app,\n ...targetOptions(target),\n ...lifecycleOptions(target),\n };\n}\n\nexport async function openOwnedCfTunnel(target: TunnelTarget): Promise<OpenedTunnel> {\n const opts = toStartDebuggerOptions(target);\n const handle = await startDebugger(opts);\n return {\n localPort: handle.session.localPort,\n handle,\n dispose: async (): Promise<void> => {\n await handle.dispose();\n },\n };\n}\n\nfunction isExistingSessionError(error: unknown): error is Error & { readonly code: \"SESSION_ALREADY_RUNNING\" } {\n return error instanceof Error\n && \"code\" in error\n && error.code === \"SESSION_ALREADY_RUNNING\";\n}\n\nfunction existingTunnelPort(error: unknown): number | undefined {\n if (!isExistingSessionError(error)) {\n return undefined;\n }\n const rawPort = /\\bon port (\\d+)\\b/iu.exec(error.message)?.[1];\n if (rawPort === undefined) {\n return undefined;\n }\n const port = Number.parseInt(rawPort, 10);\n return Number.isInteger(port) && port >= 1 && port <= 65_535 ? port : undefined;\n}\n\nexport async function openCfTunnel(target: TunnelTarget): Promise<OpenedTunnel> {\n try {\n return await openOwnedCfTunnel(target);\n } catch (error: unknown) {\n const localPort = existingTunnelPort(error);\n if (localPort === undefined) {\n throw error;\n }\n try {\n await fetchInspectorVersion(\"127.0.0.1\", localPort, REUSED_TUNNEL_GRACE_MS);\n } catch (livenessError: unknown) {\n const detail = livenessError instanceof Error ? livenessError.message : String(livenessError);\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `Another debugger session claims tunnel port ${localPort.toString()}, but its Node inspector did not respond within ${REUSED_TUNNEL_GRACE_MS.toString()}ms. The tunnel may be stale or still finishing setup; retry shortly, or inspect and stop the owning cf-debugger session before opening a fresh tunnel.`,\n detail,\n );\n }\n target.onStatus?.(\"ready\", `Reusing existing tunnel on port ${localPort.toString()}`);\n return { localPort, dispose: (): Promise<void> => Promise.resolve() };\n }\n}\n","import { performance } from \"node:perf_hooks\";\n\nimport { CdpClient, createNodeWorkerClient } from \"../cdp/client.js\";\nimport { CfInspectorError } from \"../types.js\";\nimport type { InspectorConnectOptions, PauseEvent, ScriptInfo } from \"../types.js\";\n\nimport { asString, toPauseEvent, toScriptInfo } from \"./conversions.js\";\nimport { discoverInspectorTargets } from \"./discovery.js\";\nimport type { InspectorTarget } from \"./discovery.js\";\nimport type {\n DebuggerState,\n InspectorSession,\n InspectorSessionGroup,\n InspectorWorkerTarget,\n} from \"./types.js\";\n\nconst DEFAULT_CONNECT_TIMEOUT_MS = 5_000;\nconst DEFAULT_HOST = \"127.0.0.1\";\nconst PAUSE_BUFFER_LIMIT = 32;\nconst WORKER_DISCOVERY_SETTLE_MS = 500;\n\nexport class NodeWorkerDiscovery {\n private readonly workers = new Map<string, InspectorWorkerTarget>();\n private readonly detachListeners: readonly (() => void)[];\n public supported = false;\n private disposed = false;\n private readonly attachedListeners = new Set<(worker: InspectorWorkerTarget) => void>();\n private readonly detachedListeners = new Set<(sessionId: string) => void>();\n\n public constructor(private readonly client: CdpClient) {\n this.detachListeners = [\n client.on(\"NodeWorker.attachedToWorker\", (raw) => {\n const worker = toInspectorWorkerTarget(raw);\n if (worker !== undefined) {\n this.workers.set(worker.sessionId, worker);\n for (const listener of this.attachedListeners) {\n listener(worker);\n }\n }\n }),\n client.on(\"NodeWorker.detachedFromWorker\", (raw) => {\n const sessionId = readField(raw, \"sessionId\");\n if (typeof sessionId === \"string\") {\n this.workers.delete(sessionId);\n for (const listener of this.detachedListeners) {\n listener(sessionId);\n }\n }\n }),\n ];\n }\n\n public async enable(): Promise<void> {\n try {\n await this.client.send(\"NodeWorker.enable\", { waitForDebuggerOnStart: false });\n this.supported = true;\n } catch (error: unknown) {\n if (!isUnsupportedNodeWorkerDomain(error)) {\n throw error;\n }\n }\n }\n\n public list(): readonly InspectorWorkerTarget[] {\n return [...this.workers.values()].sort(compareWorkers);\n }\n\n public onAttached(listener: (worker: InspectorWorkerTarget) => void): () => void {\n this.attachedListeners.add(listener);\n return (): void => {\n this.attachedListeners.delete(listener);\n };\n }\n\n public onDetached(listener: (sessionId: string) => void): () => void {\n this.detachedListeners.add(listener);\n return (): void => {\n this.detachedListeners.delete(listener);\n };\n }\n\n public async waitFor(\n predicate: (workers: readonly InspectorWorkerTarget[]) => InspectorWorkerTarget | undefined,\n timeoutMs = WORKER_DISCOVERY_SETTLE_MS,\n ): Promise<InspectorWorkerTarget | undefined> {\n const existing = predicate(this.list());\n if (existing !== undefined) {\n return existing;\n }\n return await new Promise<InspectorWorkerTarget | undefined>((resolve) => {\n let settled = false;\n const finish = (worker?: InspectorWorkerTarget): void => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n detach();\n resolve(worker);\n };\n const detach = this.onAttached(() => {\n const worker = predicate(this.list());\n if (worker !== undefined) {\n finish(worker);\n }\n });\n const timer = setTimeout(() => {\n finish();\n }, timeoutMs);\n });\n }\n\n public async dispose(): Promise<void> {\n if (this.disposed) {\n return;\n }\n this.disposed = true;\n if (this.supported && !this.client.isClosed) {\n try {\n await this.client.send(\"NodeWorker.disable\");\n } catch {\n // best-effort: the parent inspector may already be closing\n }\n }\n for (const detach of this.detachListeners) {\n detach();\n }\n this.attachedListeners.clear();\n this.detachedListeners.clear();\n }\n}\n\nfunction isUnsupportedNodeWorkerDomain(error: unknown): boolean {\n if (!(error instanceof CfInspectorError) || error.code !== \"CDP_REQUEST_FAILED\") {\n return false;\n }\n return error.detail?.includes('\"code\":-32601') === true;\n}\n\nfunction compareWorkers(left: InspectorWorkerTarget, right: InspectorWorkerTarget): number {\n const leftId = Number.parseInt(left.workerId, 10);\n const rightId = Number.parseInt(right.workerId, 10);\n if (!Number.isNaN(leftId) && !Number.isNaN(rightId) && leftId !== rightId) {\n return leftId - rightId;\n }\n return left.workerId.localeCompare(right.workerId);\n}\n\nfunction toInspectorWorkerTarget(raw: unknown): InspectorWorkerTarget | undefined {\n const sessionId = readField(raw, \"sessionId\");\n const info = readField(raw, \"workerInfo\");\n if (typeof sessionId !== \"string\" || !isUnknownRecord(info)) {\n return undefined;\n }\n const workerId = asString(info[\"workerId\"]);\n if (workerId.length === 0) {\n return undefined;\n }\n return {\n sessionId,\n workerId,\n type: asString(info[\"type\"]),\n title: asString(info[\"title\"]),\n url: asString(info[\"url\"]),\n };\n}\n\nfunction readField(value: unknown, name: string): unknown {\n return isUnknownRecord(value) ? value[name] : void 0;\n}\n\nfunction isUnknownRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nexport async function startNodeWorkerDiscovery(client: CdpClient): Promise<NodeWorkerDiscovery> {\n const discovery = new NodeWorkerDiscovery(client);\n await discovery.enable();\n return discovery;\n}\n\nexport async function connectInspector(options: InspectorConnectOptions): Promise<InspectorSession> {\n const host = options.host ?? DEFAULT_HOST;\n const connectTimeoutMs = options.connectTimeoutMs ?? DEFAULT_CONNECT_TIMEOUT_MS;\n const targets = await discoverInspectorTargets(host, options.port, connectTimeoutMs);\n const targetIndex = options.targetIndex ?? 0;\n const target = targets[targetIndex];\n if (!target) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `No inspector target at index ${targetIndex.toString()} on ${host}:${options.port.toString()} (available: ${targets.length.toString()})`,\n );\n }\n const client = await CdpClient.connect({\n url: target.webSocketDebuggerUrl,\n connectTimeoutMs,\n });\n let workerDiscovery: NodeWorkerDiscovery | undefined;\n try {\n workerDiscovery = await startNodeWorkerDiscovery(client);\n if (options.workerIndex === undefined && options.workerId === undefined) {\n const session = await initSession(client, target, { kind: \"main\" });\n return withWorkerMetadata(session, workerDiscovery, targetIndex, targets.length);\n }\n return await initWorkerSession(\n client,\n workerDiscovery,\n options.workerIndex,\n options.workerId,\n targetIndex,\n targets.length,\n );\n } catch (err: unknown) {\n // The CdpClient is alive (its WS is open) but the inspector handshake\n // failed before we could hand the session to the caller. Dispose so the\n // underlying WS does not leak.\n await workerDiscovery?.dispose();\n client.dispose();\n throw err;\n }\n}\n\nasync function initWorkerSession(\n parent: CdpClient,\n discovery: NodeWorkerDiscovery,\n workerIndex: number | undefined,\n workerId: string | undefined,\n targetIndex: number,\n targetCount: number,\n): Promise<InspectorSession> {\n if (!discovery.supported) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n \"This runtime does not expose the NodeWorker CDP domain; --worker cannot be used. Run list-targets for available raw targets.\",\n );\n }\n const worker = await discovery.waitFor((workers) => workerId === undefined\n ? (workerIndex === undefined ? undefined : workers[workerIndex])\n : workers.find((candidate) => candidate.workerId === workerId));\n if (worker === undefined) {\n const workers = discovery.list();\n const selector = workerId === undefined\n ? `index ${(workerIndex ?? 0).toString()}`\n : `workerId ${JSON.stringify(workerId)}`;\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `No NodeWorker sub-session with ${selector} is currently attached (available: ${workers.length.toString()}). Ensure the worker is alive, then rerun list-targets.`,\n );\n }\n const client = await createNodeWorkerClient(parent, worker.sessionId);\n const session = await initSession(client, workerToInspectorTarget(worker), {\n kind: \"worker\",\n workerId: worker.workerId,\n });\n return withWorkerMetadata(session, discovery, targetIndex, targetCount, workerIndex, parent);\n}\n\nexport async function connectInspectorGroup(\n options: Omit<InspectorConnectOptions, \"workerIndex\" | \"workerId\">,\n): Promise<InspectorSessionGroup> {\n const host = options.host ?? DEFAULT_HOST;\n const connectTimeoutMs = options.connectTimeoutMs ?? DEFAULT_CONNECT_TIMEOUT_MS;\n const targets = await discoverInspectorTargets(host, options.port, connectTimeoutMs);\n const targetIndex = options.targetIndex ?? 0;\n const target = targets[targetIndex];\n if (target === undefined) {\n throw new CfInspectorError(\n \"INSPECTOR_DISCOVERY_FAILED\",\n `No inspector target at index ${targetIndex.toString()} on ${host}:${options.port.toString()} (available: ${targets.length.toString()})`,\n );\n }\n const parent = await CdpClient.connect({ url: target.webSocketDebuggerUrl, connectTimeoutMs });\n let discovery: NodeWorkerDiscovery | undefined;\n try {\n discovery = await startNodeWorkerDiscovery(parent);\n const main = await initSession(parent, target, { kind: \"main\" });\n const group = new DynamicInspectorSessionGroup(\n parent,\n discovery,\n main,\n targetIndex,\n targets.length,\n );\n await group.initialize();\n return group;\n } catch (error: unknown) {\n await discovery?.dispose();\n parent.dispose();\n throw error;\n }\n}\n\nclass DynamicInspectorSessionGroup implements InspectorSessionGroup {\n private readonly sessions = new Map<string, InspectorSession>();\n private readonly listeners = new Set<(session: InspectorSession) => void>();\n private readonly removedListeners = new Set<(session: InspectorSession) => void>();\n private readonly errorListeners = new Set<(error: Error) => void>();\n private readonly pending = new Set<Promise<void>>();\n private readonly detachedSessionIds = new Set<string>();\n private readonly detachDiscoveryListeners: readonly (() => void)[];\n private initializationError: Error | undefined;\n private initializing = true;\n private disposed = false;\n\n public readonly workerDiscoverySupported: boolean;\n\n public constructor(\n private readonly parent: CdpClient,\n private readonly discovery: NodeWorkerDiscovery,\n main: InspectorSession,\n public readonly targetIndex: number,\n public readonly targetCount: number,\n ) {\n this.workerDiscoverySupported = discovery.supported;\n this.sessions.set(\"main\", main);\n this.detachDiscoveryListeners = [\n discovery.onAttached((worker) => {\n this.queueWorker(worker);\n }),\n discovery.onDetached((sessionId) => {\n void this.detachWorker(sessionId);\n }),\n ];\n }\n\n public async initialize(): Promise<void> {\n for (const worker of this.discovery.list()) {\n this.queueWorker(worker);\n }\n await this.waitForPending();\n this.initializing = false;\n if (this.initializationError !== undefined) {\n throw this.initializationError;\n }\n }\n\n public list(): readonly InspectorSession[] {\n return [...this.sessions.values()];\n }\n\n public onSession(listener: (session: InspectorSession) => void): () => void {\n this.listeners.add(listener);\n for (const session of this.sessions.values()) {\n listener(session);\n }\n return (): void => {\n this.listeners.delete(listener);\n };\n }\n\n public onSessionRemoved(listener: (session: InspectorSession) => void): () => void {\n this.removedListeners.add(listener);\n return (): void => {\n this.removedListeners.delete(listener);\n };\n }\n\n public onError(listener: (error: Error) => void): () => void {\n this.errorListeners.add(listener);\n return (): void => {\n this.errorListeners.delete(listener);\n };\n }\n\n public async dispose(): Promise<void> {\n if (this.disposed) {\n return;\n }\n this.disposed = true;\n for (const detach of this.detachDiscoveryListeners) {\n detach();\n }\n await Promise.allSettled([...this.pending]);\n const sessions = [...this.list()].reverse();\n for (const session of sessions) {\n try {\n await session.dispose();\n } catch {\n // Continue closing every remaining session and the parent transport.\n }\n }\n this.sessions.clear();\n this.listeners.clear();\n this.removedListeners.clear();\n this.errorListeners.clear();\n await this.discovery.dispose();\n this.parent.dispose();\n }\n\n private queueWorker(worker: InspectorWorkerTarget): void {\n if (this.disposed || this.sessions.has(worker.sessionId)) {\n return;\n }\n const pending = this.attachWorker(worker).catch((error: unknown) => {\n const normalized = error instanceof Error ? error : new Error(\"Worker inspector attachment failed\");\n if (this.initializing && this.initializationError === undefined) {\n this.initializationError = normalized;\n }\n for (const listener of this.errorListeners) {\n listener(normalized);\n }\n }).finally(() => {\n this.pending.delete(pending);\n });\n this.pending.add(pending);\n }\n\n private async attachWorker(worker: InspectorWorkerTarget): Promise<void> {\n const client = await createNodeWorkerClient(this.parent, worker.sessionId);\n try {\n const session = await initSession(client, workerToInspectorTarget(worker), {\n kind: \"worker\",\n workerId: worker.workerId,\n });\n if (this.disposed || this.detachedSessionIds.delete(worker.sessionId)) {\n await session.dispose();\n return;\n }\n this.sessions.set(worker.sessionId, session);\n for (const listener of this.listeners) {\n listener(session);\n }\n } catch (error: unknown) {\n client.dispose();\n if (!this.disposed) {\n throw error;\n }\n }\n }\n\n private async detachWorker(sessionId: string): Promise<void> {\n const session = this.sessions.get(sessionId);\n if (session === undefined) {\n this.detachedSessionIds.add(sessionId);\n return;\n }\n this.sessions.delete(sessionId);\n for (const listener of this.removedListeners) {\n listener(session);\n }\n await session.dispose();\n }\n\n private async waitForPending(): Promise<void> {\n while (this.pending.size > 0) {\n await Promise.all([...this.pending]);\n }\n }\n}\n\nfunction withWorkerMetadata(\n session: InspectorSession,\n discovery: NodeWorkerDiscovery,\n targetIndex: number,\n targetCount: number,\n workerIndex?: number,\n parent?: CdpClient,\n): InspectorSession {\n return {\n ...session,\n targetIndex,\n targetCount,\n ...(workerIndex === undefined ? {} : { workerIndex }),\n workerTargets: discovery.list(),\n workerDiscoverySupported: discovery.supported,\n dispose: async (): Promise<void> => {\n await session.dispose();\n await discovery.dispose();\n parent?.dispose();\n },\n };\n}\n\nfunction workerToInspectorTarget(worker: InspectorWorkerTarget): InspectorTarget {\n return {\n description: \"Node worker sub-session\",\n id: worker.workerId,\n title: worker.title,\n type: worker.type,\n url: worker.url,\n webSocketDebuggerUrl: `node-worker://${worker.sessionId}`,\n };\n}\n\nexport interface NodeWorkerTargetsResult {\n readonly supported: boolean;\n readonly workers: readonly InspectorWorkerTarget[];\n}\n\nexport async function discoverNodeWorkerTargets(\n target: InspectorTarget,\n connectTimeoutMs = DEFAULT_CONNECT_TIMEOUT_MS,\n): Promise<NodeWorkerTargetsResult> {\n const client = await CdpClient.connect({ url: target.webSocketDebuggerUrl, connectTimeoutMs });\n let discovery: NodeWorkerDiscovery | undefined;\n try {\n discovery = await startNodeWorkerDiscovery(client);\n return { supported: discovery.supported, workers: discovery.list() };\n } finally {\n await discovery?.dispose();\n client.dispose();\n }\n}\n\nasync function initSession(\n client: CdpClient,\n target: InspectorSession[\"target\"],\n isolate: NonNullable<InspectorSession[\"isolate\"]>,\n): Promise<InspectorSession> {\n const scripts = new Map<string, ScriptInfo>();\n registerScriptTracking(client, scripts);\n const pauseBuffer: PauseEvent[] = [];\n const pauseWaitGate = { active: false };\n const debuggerState: DebuggerState = { paused: false };\n registerPauseTracking(client, scripts, pauseBuffer, pauseWaitGate, debuggerState);\n await client.send(\"Runtime.enable\");\n await client.send(\"Debugger.enable\");\n return createSession(client, target, isolate, scripts, pauseBuffer, pauseWaitGate, debuggerState);\n}\n\nfunction registerScriptTracking(client: CdpClient, scripts: Map<string, ScriptInfo>): void {\n client.on(\"Debugger.scriptParsed\", (raw) => {\n const script = toScriptInfo(raw);\n if (script !== undefined) {\n scripts.set(script.scriptId, script);\n }\n });\n}\n\nfunction registerPauseTracking(\n client: CdpClient,\n scripts: ReadonlyMap<string, ScriptInfo>,\n pauseBuffer: PauseEvent[],\n pauseWaitGate: { active: boolean },\n debuggerState: DebuggerState,\n): void {\n client.on(\"Debugger.paused\", (raw) => {\n const event = toPauseEvent(raw, performance.now(), scripts);\n debuggerState.paused = true;\n debuggerState.currentPause = event;\n if (pauseWaitGate.active) {\n return;\n }\n if (pauseBuffer.length >= PAUSE_BUFFER_LIMIT) {\n pauseBuffer.shift();\n }\n pauseBuffer.push(event);\n });\n client.on(\"Debugger.resumed\", () => {\n debuggerState.paused = false;\n delete debuggerState.currentPause;\n debuggerState.lastResumedAtMs = performance.now();\n });\n}\n\nfunction createSession(\n client: CdpClient,\n target: InspectorSession[\"target\"],\n isolate: NonNullable<InspectorSession[\"isolate\"]>,\n scripts: ReadonlyMap<string, ScriptInfo>,\n pauseBuffer: PauseEvent[],\n pauseWaitGate: { active: boolean },\n debuggerState: DebuggerState,\n): InspectorSession {\n return {\n client,\n target,\n isolate,\n scripts,\n pauseBuffer,\n pauseWaitGate,\n debuggerState,\n dispose: async (): Promise<void> => {\n try {\n await client.send(\"Debugger.disable\");\n } catch {\n // best-effort\n }\n client.dispose();\n },\n };\n}\n\nexport const internalsForTesting = {\n startNodeWorkerDiscovery,\n};\n","import { EventEmitter } from \"node:events\";\n\nimport { CfInspectorError } from \"../types.js\";\n\nconst DEFAULT_REQUEST_TIMEOUT_MS = 60_000;\n\nexport interface CdpTransportEventMap {\n readonly message: (data: string) => void;\n readonly close: () => void;\n readonly error: (err: Error) => void;\n}\n\nexport interface CdpTransport {\n send(payload: string): void;\n close(): void;\n readonly readyState: number;\n on<E extends keyof CdpTransportEventMap>(event: E, listener: CdpTransportEventMap[E]): void;\n off<E extends keyof CdpTransportEventMap>(event: E, listener: CdpTransportEventMap[E]): void;\n}\n\nexport interface CdpTransportFactoryOptions {\n readonly connectTimeoutMs?: number;\n}\n\nexport type CdpTransportFactory = (\n url: string,\n options?: CdpTransportFactoryOptions,\n) => Promise<CdpTransport>;\n\nexport interface CdpClientOptions {\n readonly url: string;\n readonly transportFactory?: CdpTransportFactory;\n readonly requestTimeoutMs?: number;\n readonly connectTimeoutMs?: number;\n}\n\nexport interface CdpWaitOptions<T> {\n readonly timeoutMs: number;\n readonly predicate?: (params: T) => boolean;\n readonly signal?: AbortSignal;\n}\n\ninterface PendingRequest {\n readonly resolve: (value: unknown) => void;\n readonly reject: (error: Error) => void;\n readonly timer: ReturnType<typeof setTimeout>;\n}\n\ninterface ParsedMessage {\n readonly id?: number;\n readonly method?: string;\n readonly result?: unknown;\n readonly params?: unknown;\n readonly error?: { readonly code: number; readonly message: string };\n}\n\ninterface NodeWorkerEventParams {\n readonly sessionId?: unknown;\n readonly message?: unknown;\n}\n\nfunction parseMessage(raw: string): ParsedMessage | undefined {\n try {\n const value: unknown = JSON.parse(raw);\n if (typeof value !== \"object\" || value === null) {\n return undefined;\n }\n return value as ParsedMessage;\n } catch {\n return undefined;\n }\n}\n\nasync function loadDefaultFactory(): Promise<CdpTransportFactory> {\n const mod = await import(\"./wsTransport.js\");\n return mod.wsTransportFactory;\n}\n\nexport class CdpClient {\n private readonly transport: CdpTransport;\n private readonly requestTimeoutMs: number;\n private readonly pending = new Map<number, PendingRequest>();\n private readonly emitter = new EventEmitter();\n private nextId = 1;\n private closed = false;\n private closeReason: Error | undefined;\n\n private readonly handleMessage = (raw: string): void => {\n const parsed = parseMessage(raw);\n if (!parsed) {\n return;\n }\n if (typeof parsed.id === \"number\") {\n this.handleResponse(parsed);\n return;\n }\n if (typeof parsed.method === \"string\") {\n // A throwing listener must not crash the WS message pipeline. Without\n // this guard, EventEmitter rethrows on the first uncaught listener\n // exception and the rest of the dispatch stops — including downstream\n // listeners that need to settle pending requests.\n this.safeEmit(parsed.method, parsed.params);\n this.safeEmit(\"event\", { method: parsed.method, params: parsed.params });\n }\n };\n\n private safeEmit(event: string, payload: unknown): void {\n // EventEmitter.emit re-throws on the first listener's exception and skips\n // the rest. Iterate explicitly so one bad listener does not deny later\n // listeners (e.g. the pause buffer pusher) from observing the event.\n const listeners = this.emitter.listeners(event);\n for (const listener of listeners) {\n try {\n (listener as (payload: unknown) => void)(payload);\n } catch {\n // Listener exceptions are caller bugs; swallow to keep the pipeline alive.\n }\n }\n }\n\n private readonly handleClose = (): void => {\n this.markClosed(new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", \"Inspector connection closed\"));\n };\n\n private readonly handleError = (err: Error): void => {\n this.markClosed(\n err instanceof CfInspectorError\n ? err\n : new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", err.message),\n );\n };\n\n private constructor(transport: CdpTransport, requestTimeoutMs: number) {\n this.transport = transport;\n this.requestTimeoutMs = requestTimeoutMs;\n transport.on(\"message\", this.handleMessage);\n transport.on(\"close\", this.handleClose);\n transport.on(\"error\", this.handleError);\n }\n\n public static async connect(options: CdpClientOptions): Promise<CdpClient> {\n const factory = options.transportFactory ?? (await loadDefaultFactory());\n const factoryOptions: CdpTransportFactoryOptions =\n options.connectTimeoutMs === undefined ? {} : { connectTimeoutMs: options.connectTimeoutMs };\n const transport = await factory(options.url, factoryOptions);\n return new CdpClient(transport, options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS);\n }\n\n public async send<TResult = unknown>(\n method: string,\n params: Record<string, unknown> = {},\n ): Promise<TResult> {\n if (this.closed) {\n throw this.closeReason ?? new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", \"Connection closed\");\n }\n const id = this.nextId++;\n const payload = JSON.stringify({ id, method, params });\n return await new Promise<TResult>((resolve, reject) => {\n const timer = this.createRequestTimer(id, method, reject);\n this.pending.set(id, {\n resolve: (value): void => {\n resolve(value as TResult);\n },\n reject,\n timer,\n });\n this.sendPayload(id, method, payload, timer, reject);\n });\n }\n\n public on(method: string, listener: (params: unknown) => void): () => void {\n this.emitter.on(method, listener);\n return (): void => {\n this.emitter.off(method, listener);\n };\n }\n\n public async waitFor<T = unknown>(\n method: string,\n options: CdpWaitOptions<T> = {\n timeoutMs: this.requestTimeoutMs,\n },\n ): Promise<T> {\n if (this.closed) {\n throw this.closeReason ?? new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", \"Connection closed\");\n }\n if (options.signal?.aborted === true) {\n throw this.createWaitAbortError(method);\n }\n return await this.createEventWait(method, options);\n }\n\n private createEventWait<T>(method: string, options: CdpWaitOptions<T>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n let settled = false;\n let offEvent = (): void => undefined;\n let offClose = (): void => undefined;\n const cleanup = (): void => {\n clearTimeout(timer);\n offEvent();\n offClose();\n options.signal?.removeEventListener(\"abort\", onAbort);\n };\n const resolveOnce = (value: T): void => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n resolve(value);\n };\n const rejectOnce = (error: Error): void => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n reject(error);\n };\n const onAbort = (): void => {\n rejectOnce(this.createWaitAbortError(method));\n };\n const timer = setTimeout(() => {\n rejectOnce(this.createWaitTimeoutError(method, options.timeoutMs));\n }, options.timeoutMs);\n offEvent = this.on(method, (raw) => {\n const params = raw as T;\n if (!this.eventMatches(params, options.predicate)) {\n return;\n }\n resolveOnce(params);\n });\n offClose = this.onClose((error) => {\n rejectOnce(error);\n });\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n if (options.signal?.aborted === true) {\n onAbort();\n }\n });\n }\n\n private eventMatches<T>(params: T, predicate: ((params: T) => boolean) | undefined): boolean {\n if (predicate === undefined) {\n return true;\n }\n try {\n return predicate(params);\n } catch {\n return false;\n }\n }\n\n public onClose(listener: (err: Error) => void): () => void {\n if (this.closed) {\n const reason = this.closeReason ?? new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", \"Connection closed\");\n queueMicrotask(() => {\n listener(reason);\n });\n return (): void => {\n // already closed; nothing to detach\n };\n }\n this.emitter.on(\"__close__\", listener);\n return (): void => {\n this.emitter.off(\"__close__\", listener);\n };\n }\n\n public dispose(): void {\n if (this.closed) {\n return;\n }\n this.transport.off(\"message\", this.handleMessage);\n this.transport.off(\"close\", this.handleClose);\n this.transport.off(\"error\", this.handleError);\n try {\n this.transport.close();\n } catch {\n // best-effort\n }\n this.markClosed(new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", \"Connection disposed\"));\n }\n\n public get isClosed(): boolean {\n return this.closed;\n }\n\n private handleResponse(parsed: ParsedMessage): void {\n const pending = this.pending.get(parsed.id ?? -1);\n if (!pending) {\n return;\n }\n this.pending.delete(parsed.id ?? -1);\n clearTimeout(pending.timer);\n if (parsed.error) {\n pending.reject(\n new CfInspectorError(\n \"CDP_REQUEST_FAILED\",\n `CDP request ${(parsed.id ?? -1).toString()} failed: ${parsed.error.message}`,\n JSON.stringify(parsed.error),\n ),\n );\n return;\n }\n pending.resolve(parsed.result);\n }\n\n private createRequestTimer(\n id: number,\n method: string,\n reject: (error: Error) => void,\n ): ReturnType<typeof setTimeout> {\n return setTimeout(() => {\n this.pending.delete(id);\n reject(\n new CfInspectorError(\n \"CDP_REQUEST_FAILED\",\n `CDP method ${method} timed out after ${this.requestTimeoutMs.toString()}ms`,\n ),\n );\n }, this.requestTimeoutMs);\n }\n\n private createWaitTimeoutError(method: string, timeoutMs: number): CfInspectorError {\n return new CfInspectorError(\n \"BREAKPOINT_NOT_HIT\",\n `Timed out waiting for ${method} after ${timeoutMs.toString()}ms`,\n );\n }\n\n private createWaitAbortError(method: string): CfInspectorError {\n return new CfInspectorError(\"ABORTED\", `Aborted while waiting for ${method}`);\n }\n\n private sendPayload(\n id: number,\n method: string,\n payload: string,\n timer: ReturnType<typeof setTimeout>,\n reject: (error: Error) => void,\n ): void {\n try {\n this.transport.send(payload);\n } catch (err: unknown) {\n clearTimeout(timer);\n this.pending.delete(id);\n const message = err instanceof Error ? err.message : String(err);\n reject(new CfInspectorError(\"CDP_REQUEST_FAILED\", `Failed to send ${method}: ${message}`));\n }\n }\n\n private markClosed(reason: Error): void {\n if (this.closed) {\n return;\n }\n this.closed = true;\n this.closeReason = reason;\n for (const [, pending] of this.pending) {\n clearTimeout(pending.timer);\n pending.reject(reason);\n }\n this.pending.clear();\n this.emitter.emit(\"__close__\", reason);\n this.emitter.removeAllListeners();\n }\n}\n\nclass NodeWorkerTransport implements CdpTransport {\n private readonly emitter = new EventEmitter();\n private readonly detachParentListeners: readonly (() => void)[];\n public readyState = 1;\n\n public constructor(\n private readonly parent: CdpClient,\n private readonly sessionId: string,\n ) {\n this.detachParentListeners = [\n parent.on(\"NodeWorker.receivedMessageFromWorker\", (raw) => {\n this.forwardWorkerMessage(raw);\n }),\n parent.on(\"NodeWorker.detachedFromWorker\", (raw) => {\n this.handleWorkerDetach(raw);\n }),\n parent.onClose((error) => {\n this.closeWithError(error);\n }),\n ];\n }\n\n public send(payload: string): void {\n if (this.readyState !== 1) {\n throw new CfInspectorError(\"INSPECTOR_CONNECTION_FAILED\", \"Worker inspector session is closed\");\n }\n void this.parent.send(\"NodeWorker.sendMessageToWorker\", {\n sessionId: this.sessionId,\n message: payload,\n }).catch((error: unknown) => {\n const normalized = error instanceof Error ? error : new Error(String(error));\n this.closeWithError(normalized);\n });\n }\n\n public close(): void {\n this.finishClose();\n }\n\n public on<E extends keyof CdpTransportEventMap>(\n event: E,\n listener: CdpTransportEventMap[E],\n ): void {\n this.emitter.on(event, listener);\n }\n\n public off<E extends keyof CdpTransportEventMap>(\n event: E,\n listener: CdpTransportEventMap[E],\n ): void {\n this.emitter.off(event, listener);\n }\n\n private forwardWorkerMessage(raw: unknown): void {\n const params = asNodeWorkerEventParams(raw);\n if (params.sessionId !== this.sessionId || typeof params.message !== \"string\") {\n return;\n }\n this.emitter.emit(\"message\", params.message);\n }\n\n private handleWorkerDetach(raw: unknown): void {\n const params = asNodeWorkerEventParams(raw);\n if (params.sessionId === this.sessionId) {\n this.finishClose();\n }\n }\n\n private closeWithError(error: Error): void {\n if (this.readyState !== 1) {\n return;\n }\n this.emitter.emit(\"error\", error);\n this.finishClose();\n }\n\n private finishClose(): void {\n if (this.readyState !== 1) {\n return;\n }\n this.readyState = 3;\n for (const detach of this.detachParentListeners) {\n detach();\n }\n this.emitter.emit(\"close\");\n this.emitter.removeAllListeners();\n }\n}\n\nfunction asNodeWorkerEventParams(raw: unknown): NodeWorkerEventParams {\n if (!isUnknownRecord(raw)) {\n return {};\n }\n const sessionId = raw[\"sessionId\"];\n const message = raw[\"message\"];\n return {\n ...(typeof sessionId === \"string\" ? { sessionId } : {}),\n ...(typeof message === \"string\" ? { message } : {}),\n };\n}\n\nfunction isUnknownRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nexport async function createNodeWorkerClient(\n parent: CdpClient,\n sessionId: string,\n requestTimeoutMs = DEFAULT_REQUEST_TIMEOUT_MS,\n): Promise<CdpClient> {\n const transport = new NodeWorkerTransport(parent, sessionId);\n return await CdpClient.connect({\n url: `node-worker://${sessionId}`,\n transportFactory: (): Promise<CdpTransport> => Promise.resolve(transport),\n requestTimeoutMs,\n });\n}\n","// cspell:words trustedtype wasmvalue webassemblymemory\nimport type {\n BreakLocation,\n CallFrameInfo,\n PauseEvent,\n RemoteObjectInfo,\n ResolvedLocation,\n ScriptInfo,\n ScriptLocation,\n ScopeInfo,\n StackTraceFrameInfo,\n StackTraceIdInfo,\n StackTraceInfo,\n} from \"../types.js\";\n\nconst INTERNAL_SLOT_SUBTYPES = new Set([\n \"regexp\",\n \"date\",\n \"map\",\n \"set\",\n \"weakmap\",\n \"weakset\",\n \"iterator\",\n \"generator\",\n \"promise\",\n \"typedarray\",\n \"arraybuffer\",\n \"dataview\",\n \"webassemblymemory\",\n \"wasmvalue\",\n \"trustedtype\",\n]);\n\nexport function asString(value: unknown, fallback = \"\"): string {\n return typeof value === \"string\" ? value : fallback;\n}\n\nexport function asNumber(value: unknown, fallback = 0): number {\n return typeof value === \"number\" && Number.isFinite(value) ? value : fallback;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction nonEmptyString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction optionalNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction optionalCoordinate(value: unknown): number | undefined {\n const number = optionalNumber(value);\n return number !== undefined && Number.isSafeInteger(number) && number >= 0\n ? number\n : undefined;\n}\n\nfunction optionalBoolean(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nexport function toScriptLocation(value: unknown): ScriptLocation | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n const scriptId = nonEmptyString(value[\"scriptId\"]);\n const lineNumber = optionalCoordinate(value[\"lineNumber\"]);\n if (scriptId === undefined || lineNumber === undefined) {\n return undefined;\n }\n const rawColumnNumber = value[\"columnNumber\"];\n const columnNumber = optionalCoordinate(rawColumnNumber);\n if (rawColumnNumber !== undefined && columnNumber === undefined) {\n return undefined;\n }\n return columnNumber === undefined\n ? { scriptId, lineNumber }\n : { scriptId, lineNumber, columnNumber };\n}\n\nexport function toResolvedLocations(value: unknown): readonly ResolvedLocation[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.flatMap((entry): ResolvedLocation[] => {\n const location = toScriptLocation(entry);\n if (location === undefined || !isRecord(entry)) {\n return [];\n }\n const url = typeof entry[\"url\"] === \"string\" ? entry[\"url\"] : undefined;\n return [url === undefined ? location : { ...location, url }];\n });\n}\n\nexport function toBreakLocations(value: unknown): readonly BreakLocation[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.flatMap((entry): BreakLocation[] => {\n const location = toScriptLocation(entry);\n if (location === undefined || !isRecord(entry)) {\n return [];\n }\n const type = nonEmptyString(entry[\"type\"]);\n return [type === undefined ? location : { ...location, type }];\n });\n}\n\nfunction remoteCompleteness(subtype: string | undefined): RemoteObjectInfo[\"completeness\"] {\n if (subtype === \"proxy\") {\n return \"unavailable\";\n }\n return subtype !== undefined && INTERNAL_SLOT_SUBTYPES.has(subtype)\n ? \"truncated\"\n : undefined;\n}\n\nfunction optionalOwnField(\n key: string,\n value: Readonly<Record<string, unknown>>,\n): Readonly<Record<string, unknown>> {\n return Object.hasOwn(value, key) ? { [key]: value[key] } : {};\n}\n\nexport function toRemoteObject(value: unknown): RemoteObjectInfo | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n const type = nonEmptyString(value[\"type\"]);\n if (type === undefined) {\n return undefined;\n }\n const subtype = nonEmptyString(value[\"subtype\"]);\n const completeness = remoteCompleteness(subtype);\n return {\n type,\n ...(subtype === undefined ? {} : { subtype }),\n ...optionalTextField(\"className\", value[\"className\"]),\n ...(completeness === undefined ? {} : { completeness }),\n ...optionalOwnField(\"value\", value),\n ...optionalTextField(\"unserializableValue\", value[\"unserializableValue\"]),\n ...optionalTextField(\"description\", value[\"description\"]),\n ...optionalOwnField(\"deepSerializedValue\", value),\n ...optionalTextField(\"objectId\", value[\"objectId\"]),\n ...optionalOwnField(\"preview\", value),\n ...optionalOwnField(\"customPreview\", value),\n };\n}\n\nfunction optionalTextField(\n key: string,\n value: unknown,\n): Readonly<Record<string, string>> {\n return typeof value === \"string\" ? { [key]: value } : {};\n}\n\nfunction toScope(value: unknown): ScopeInfo | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n const type = nonEmptyString(value[\"type\"]);\n if (type === undefined) {\n return undefined;\n }\n const object = toRemoteObject(value[\"object\"]);\n const name = nonEmptyString(value[\"name\"]);\n const startLocation = toScriptLocation(value[\"startLocation\"]);\n const endLocation = toScriptLocation(value[\"endLocation\"]);\n return {\n type,\n ...(name === undefined ? {} : { name }),\n ...(object === undefined ? {} : { object }),\n ...(object?.objectId === undefined ? {} : { objectId: object.objectId }),\n ...(startLocation === undefined ? {} : { startLocation }),\n ...(endLocation === undefined ? {} : { endLocation }),\n };\n}\n\nfunction toScopeChain(value: unknown): readonly ScopeInfo[] {\n return Array.isArray(value)\n ? value.flatMap((entry): ScopeInfo[] => {\n const scope = toScope(entry);\n return scope === undefined ? [] : [scope];\n })\n : [];\n}\n\nfunction resolveCallFrameUrl(\n frame: Readonly<Record<string, unknown>>,\n scripts: ReadonlyMap<string, ScriptInfo> | undefined,\n): string | undefined {\n const direct = nonEmptyString(frame[\"url\"]);\n if (direct !== undefined) {\n return direct;\n }\n const scriptId = toScriptLocation(frame[\"location\"])?.scriptId;\n return scriptId === undefined ? undefined : nonEmptyString(scripts?.get(scriptId)?.url);\n}\n\nfunction toCallFrameMetadata(\n candidate: Readonly<Record<string, unknown>>,\n location: ScriptLocation | undefined,\n scripts: ReadonlyMap<string, ScriptInfo> | undefined,\n): Partial<CallFrameInfo> {\n const functionLocation = toScriptLocation(candidate[\"functionLocation\"]);\n const thisObject = toRemoteObject(candidate[\"this\"]);\n const returnValue = toRemoteObject(candidate[\"returnValue\"]);\n const url = resolveCallFrameUrl(candidate, scripts);\n return {\n ...(location === undefined ? {} : { scriptId: location.scriptId }),\n ...(functionLocation === undefined ? {} : { functionLocation }),\n ...(url === undefined ? {} : { url }),\n ...(thisObject === undefined ? {} : { thisObject }),\n ...(returnValue === undefined ? {} : { returnValue }),\n };\n}\n\nfunction toCallFrame(\n value: unknown,\n scripts: ReadonlyMap<string, ScriptInfo> | undefined,\n): CallFrameInfo | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n const callFrameId = nonEmptyString(value[\"callFrameId\"]);\n if (callFrameId === undefined) {\n return undefined;\n }\n const location = toScriptLocation(value[\"location\"]);\n return {\n callFrameId,\n functionName: asString(value[\"functionName\"]),\n ...toCallFrameMetadata(value, location, scripts),\n lineNumber: location?.lineNumber ?? 0,\n columnNumber: location?.columnNumber ?? 0,\n scopeChain: toScopeChain(value[\"scopeChain\"]),\n };\n}\n\nfunction toCallFrames(\n value: unknown,\n scripts: ReadonlyMap<string, ScriptInfo> | undefined,\n): readonly CallFrameInfo[] {\n return Array.isArray(value)\n ? value.flatMap((entry): CallFrameInfo[] => {\n const frame = toCallFrame(entry, scripts);\n return frame === undefined ? [] : [frame];\n })\n : [];\n}\n\nfunction toStackTraceId(value: unknown): StackTraceIdInfo | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n const id = nonEmptyString(value[\"id\"]);\n if (id === undefined) {\n return undefined;\n }\n const debuggerId = nonEmptyString(value[\"debuggerId\"]);\n return debuggerId === undefined ? { id } : { id, debuggerId };\n}\n\nfunction toStackTraceFrame(value: unknown): StackTraceFrameInfo | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n const scriptId = nonEmptyString(value[\"scriptId\"]);\n if (scriptId === undefined) {\n return undefined;\n }\n return {\n functionName: asString(value[\"functionName\"]),\n scriptId,\n url: asString(value[\"url\"]),\n lineNumber: asNumber(value[\"lineNumber\"]),\n columnNumber: asNumber(value[\"columnNumber\"]),\n };\n}\n\nfunction toStackTrace(value: unknown): StackTraceInfo | undefined {\n if (!isRecord(value) || !Array.isArray(value[\"callFrames\"])) {\n return undefined;\n }\n const callFrames = value[\"callFrames\"].flatMap((entry): StackTraceFrameInfo[] => {\n const frame = toStackTraceFrame(entry);\n return frame === undefined ? [] : [frame];\n });\n const description = nonEmptyString(value[\"description\"]);\n const parent = toStackTrace(value[\"parent\"]);\n const parentId = toStackTraceId(value[\"parentId\"]);\n return {\n callFrames,\n ...(description === undefined ? {} : { description }),\n ...(parent === undefined ? {} : { parent }),\n ...(parentId === undefined ? {} : { parentId }),\n };\n}\n\nexport function toPauseEvent(\n value: unknown,\n receivedAtMs: number,\n scripts?: ReadonlyMap<string, ScriptInfo>,\n): PauseEvent {\n const params = isRecord(value) ? value : {};\n const asyncStackTrace = toStackTrace(params[\"asyncStackTrace\"]);\n const asyncStackTraceId = toStackTraceId(params[\"asyncStackTraceId\"]);\n const asyncCallStackTraceId = toStackTraceId(params[\"asyncCallStackTraceId\"]);\n return {\n reason: asString(params[\"reason\"]),\n hitBreakpoints: Array.isArray(params[\"hitBreakpoints\"])\n ? params[\"hitBreakpoints\"].filter((id): id is string => typeof id === \"string\")\n : [],\n callFrames: toCallFrames(params[\"callFrames\"], scripts),\n receivedAtMs,\n ...(params[\"data\"] === undefined ? {} : { data: params[\"data\"] }),\n ...(asyncStackTrace === undefined ? {} : { asyncStackTrace }),\n ...(asyncStackTraceId === undefined ? {} : { asyncStackTraceId }),\n ...(asyncCallStackTraceId === undefined ? {} : { asyncCallStackTraceId }),\n };\n}\n\nexport function toScriptInfo(value: unknown): ScriptInfo | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n const scriptId = nonEmptyString(value[\"scriptId\"]);\n if (scriptId === undefined) {\n return undefined;\n }\n const stackTrace = toStackTrace(value[\"stackTrace\"]);\n return {\n scriptId,\n url: asString(value[\"url\"]),\n ...optionalNumericField(\"startLine\", value[\"startLine\"]),\n ...optionalNumericField(\"startColumn\", value[\"startColumn\"]),\n ...optionalNumericField(\"endLine\", value[\"endLine\"]),\n ...optionalNumericField(\"endColumn\", value[\"endColumn\"]),\n ...optionalNumericField(\"executionContextId\", value[\"executionContextId\"]),\n ...optionalTextField(\"hash\", value[\"hash\"]),\n ...optionalTextField(\"buildId\", value[\"buildId\"]),\n ...(value[\"executionContextAuxData\"] === undefined\n ? {}\n : { executionContextAuxData: value[\"executionContextAuxData\"] }),\n ...optionalTextField(\"sourceMapURL\", value[\"sourceMapURL\"]),\n ...optionalBooleanField(\"hasSourceURL\", value[\"hasSourceURL\"]),\n ...optionalBooleanField(\"isModule\", value[\"isModule\"]),\n ...optionalNumericField(\"length\", value[\"length\"]),\n ...(stackTrace === undefined ? {} : { stackTrace }),\n };\n}\n\nfunction optionalNumericField(\n key: string,\n value: unknown,\n): Readonly<Record<string, number>> {\n const number = optionalNumber(value);\n return number === undefined ? {} : { [key]: number };\n}\n\nfunction optionalBooleanField(\n key: string,\n value: unknown,\n): Readonly<Record<string, boolean>> {\n const boolean = optionalBoolean(value);\n return boolean === undefined ? {} : { [key]: boolean };\n}\n\nfunction topFrameLocation(pause: PauseEvent): string {\n const top = pause.callFrames[0];\n if (top === undefined) {\n return \"(no call frame)\";\n }\n const url = top.url !== undefined && top.url.length > 0 ? top.url : \"(unknown)\";\n return `${url}:${(top.lineNumber + 1).toString()}:${(top.columnNumber + 1).toString()}`;\n}\n\nexport function pauseDetail(pause: PauseEvent): string {\n return JSON.stringify({\n reason: pause.reason,\n hitBreakpoints: pause.hitBreakpoints,\n topFrame: topFrameLocation(pause),\n });\n}\n","export const DEFAULT_BREAKPOINT_TIMEOUT_SEC = 30;\nexport const DEFAULT_CF_TIMEOUT_SEC = 180;\nexport const DEFAULT_EXCEPTION_TIMEOUT_SEC = 30;\n\nexport interface PortTarget {\n readonly kind: \"port\";\n readonly port: number;\n readonly host: string;\n readonly targetIndex?: number;\n readonly workerIndex?: number;\n readonly workerId?: string;\n readonly mainOnly?: boolean;\n}\n\nexport interface CfTarget {\n readonly kind: \"cf\";\n readonly region: string;\n readonly apiEndpoint?: string;\n readonly org: string;\n readonly space: string;\n readonly app: string;\n readonly tunnelTimeoutMs: number;\n readonly targetIndex?: number;\n readonly workerIndex?: number;\n readonly workerId?: string;\n readonly mainOnly?: boolean;\n}\n\nexport type Target = PortTarget | CfTarget;\n\nexport interface SharedTargetOptions {\n readonly port?: string;\n readonly host?: string;\n readonly region?: string;\n readonly apiEndpoint?: string;\n readonly org?: string;\n readonly space?: string;\n readonly app?: string;\n readonly timeout?: string;\n readonly target?: string;\n readonly worker?: string;\n readonly workerId?: string;\n readonly mainOnly?: boolean;\n}\n\nexport interface SnapshotCommandOptions extends SharedTargetOptions {\n readonly bp: readonly string[];\n readonly capture?: string;\n readonly setupEval?: readonly string[];\n readonly timeout?: string;\n readonly remoteRoot?: string;\n readonly condition?: string;\n readonly hitCount?: string;\n readonly stackDepth?: string;\n readonly stackCaptures?: string;\n readonly maxValueLength?: string;\n readonly json: boolean;\n readonly keepPaused?: boolean;\n readonly failOnUnmatchedPause?: boolean;\n readonly includeScopes?: boolean;\n readonly quiet?: boolean;\n readonly allowMutation?: boolean;\n readonly readyEvent?: boolean;\n}\n\nexport interface EvalCommandOptions extends SharedTargetOptions {\n readonly expr: string;\n readonly json: boolean;\n}\n\nexport interface ListScriptsCommandOptions extends SharedTargetOptions {\n readonly filter?: string;\n readonly json: boolean;\n}\n\nexport interface ListTargetsCommandOptions extends SharedTargetOptions {\n readonly json: boolean;\n}\n\nexport interface LogCommandOptions extends SharedTargetOptions {\n readonly at: string;\n readonly expr: string;\n readonly remoteRoot?: string;\n readonly duration?: string;\n readonly maxEvents?: string;\n readonly hitCount?: string;\n readonly condition?: string;\n readonly maxValueLength?: string;\n readonly json: boolean;\n readonly readyEvent?: boolean;\n}\n\nexport interface AttachCommandOptions extends SharedTargetOptions {\n readonly json: boolean;\n}\n\nexport interface WatchCommandOptions extends SharedTargetOptions {\n readonly bp: readonly string[];\n readonly capture?: string;\n readonly setupEval?: readonly string[];\n readonly condition?: string;\n readonly hitCount?: string;\n readonly remoteRoot?: string;\n readonly duration?: string;\n readonly maxEvents?: string;\n readonly timeout?: string;\n readonly maxValueLength?: string;\n readonly stackDepth?: string;\n readonly stackCaptures?: string;\n readonly includeScopes?: boolean;\n readonly json: boolean;\n readonly allowMutation?: boolean;\n readonly readyEvent?: boolean;\n}\n\nexport interface ExceptionCommandOptions extends SharedTargetOptions {\n readonly type?: string;\n readonly capture?: string;\n readonly stackDepth?: string;\n readonly stackCaptures?: string;\n readonly remoteRoot?: string;\n readonly timeout?: string;\n readonly maxValueLength?: string;\n readonly includeScopes?: boolean;\n readonly keepPaused?: boolean;\n readonly json: boolean;\n readonly allowMutation?: boolean;\n readonly readyEvent?: boolean;\n}\n\nexport interface CheckBreakpointCommandOptions extends SharedTargetOptions {\n readonly bp: string;\n readonly remoteRoot?: string;\n readonly json: boolean;\n}\n","import { execFileSync } from \"node:child_process\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport { constants } from \"node:fs\";\nimport { mkdir, open, readFile, readdir, stat, unlink, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nimport { CfInspectorError } from \"../types.js\";\n\nimport type { Target } from \"./commandTypes.js\";\n\nconst ELECTION_WINDOW_MS = 25;\nconst LOCK_FILE_SUFFIX = \".lock\";\n\ninterface SessionLockMetadata {\n readonly pid: number;\n readonly processStart?: string;\n readonly state: \"pending\" | \"owned\";\n readonly startedAt: string;\n readonly token: string;\n readonly target: string;\n}\n\nexport interface DebugSessionLock {\n readonly path: string;\n release(): Promise<void>;\n}\n\nexport interface DebugSessionLockOptions {\n readonly stateRoot?: string;\n readonly pid?: number;\n readonly now?: () => Date;\n readonly token?: () => string;\n readonly isProcessAlive?: (pid: number) => boolean;\n readonly getProcessStart?: (pid: number) => string | undefined;\n}\n\nexport async function acquireDebugSessionLock(\n target: Target,\n options: DebugSessionLockOptions = {},\n): Promise<DebugSessionLock> {\n const now = options.now ?? (() => new Date());\n const pid = options.pid ?? process.pid;\n const getProcessStart = options.getProcessStart ?? processStart;\n const ownerProcessStart = getProcessStart(pid);\n const token = options.token?.() ?? randomUUID();\n const targetIdentity = debugTargetIdentity(target);\n const key = createHash(\"sha256\").update(targetIdentity).digest(\"hex\");\n const lockRoot = options.stateRoot ?? defaultStateRoot();\n const lockDirectory = join(lockRoot, \"cf-inspector\", \"locks\");\n const ownPath = join(lockDirectory, `${key}.${pid.toString()}.${token}${LOCK_FILE_SUFFIX}`);\n const metadata: SessionLockMetadata = {\n pid,\n ...(ownerProcessStart === undefined ? {} : { processStart: ownerProcessStart }),\n state: \"pending\",\n startedAt: now().toISOString(),\n token,\n target: targetIdentity,\n };\n await mkdir(lockDirectory, { recursive: true, mode: 0o700 });\n const handle = await open(ownPath, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY, 0o600);\n try {\n await handle.writeFile(`${JSON.stringify(metadata)}\\n`, \"utf8\");\n } finally {\n await handle.close();\n }\n\n try {\n await new Promise<void>((resolve) => {\n setTimeout(resolve, ELECTION_WINDOW_MS);\n });\n const contenders = await findLiveContenders(\n lockDirectory,\n key,\n ownPath,\n options.isProcessAlive ?? processIsAlive,\n getProcessStart,\n );\n const owner = contenders.find((candidate) => candidate.state === \"owned\") ??\n contenders\n .filter((candidate) => candidate.state === \"pending\" && candidate.token < token)\n .sort((left, right) => left.token.localeCompare(right.token))[0];\n if (owner !== undefined) {\n throw alreadyDebuggedError(owner);\n }\n await writeLockMetadata(ownPath, { ...metadata, state: \"owned\" });\n } catch (error: unknown) {\n await unlink(ownPath).catch(() => {\n // Best-effort cleanup after a refused or failed acquisition.\n });\n throw error;\n }\n\n let released = false;\n return {\n path: ownPath,\n release: async (): Promise<void> => {\n if (released) {\n return;\n }\n released = true;\n const current = await readLockMetadata(ownPath);\n if (current?.token !== token || current.pid !== pid) {\n return;\n }\n await unlink(ownPath).catch((error: unknown) => {\n if (!isNodeError(error, \"ENOENT\")) {\n throw error;\n }\n });\n },\n };\n}\n\nexport function debugTargetIdentity(target: Target): string {\n const targetIndex = target.targetIndex ?? 0;\n if (target.kind === \"port\") {\n return JSON.stringify({\n kind: \"port\",\n host: normalizeHost(target.host),\n port: target.port,\n targetIndex,\n });\n }\n return JSON.stringify({\n kind: \"cf\",\n region: target.region,\n org: target.org,\n space: target.space,\n app: target.app,\n targetIndex,\n });\n}\n\nfunction defaultStateRoot(): string {\n const configured = process.env[\"CF_INSPECTOR_STATE_DIR\"]?.trim();\n return configured === undefined || configured.length === 0\n ? join(homedir(), \".saptools\")\n : configured;\n}\n\nasync function findLiveContenders(\n lockDirectory: string,\n key: string,\n ownPath: string,\n isProcessAlive: (pid: number) => boolean,\n getProcessStart: (pid: number) => string | undefined,\n): Promise<readonly SessionLockMetadata[]> {\n const prefix = `${key}.`;\n const names = await readdir(lockDirectory);\n const contenders: SessionLockMetadata[] = [];\n for (const name of names) {\n if (!name.startsWith(prefix) || !name.endsWith(LOCK_FILE_SUFFIX)) {\n continue;\n }\n const path = join(lockDirectory, name);\n if (path === ownPath) {\n continue;\n }\n const info = await stat(path).catch(() => {\n // The contender may have released between directory listing and stat.\n });\n const metadata = await readLockMetadata(path) ??\n (info === undefined ? undefined : metadataFromFilename(name, key, info.mtimeMs));\n if (metadata !== undefined) {\n if (ownerIsAlive(metadata, isProcessAlive, getProcessStart)) {\n contenders.push(metadata);\n } else {\n await unlink(path).catch(() => {\n // Another contender may already have reclaimed this stale file.\n });\n }\n continue;\n }\n if (info !== undefined) {\n contenders.push({\n pid: 0,\n state: \"owned\",\n startedAt: new Date(info.mtimeMs).toISOString(),\n token: \"unknown\",\n target: \"unknown\",\n });\n }\n }\n return contenders;\n}\n\nasync function readLockMetadata(path: string): Promise<SessionLockMetadata | undefined> {\n try {\n const parsed: unknown = JSON.parse(await readFile(path, \"utf8\"));\n if (!isRecord(parsed)) {\n return undefined;\n }\n const pid = parsed[\"pid\"];\n const processStart = parsed[\"processStart\"];\n const state = parsed[\"state\"];\n const startedAt = parsed[\"startedAt\"];\n const token = parsed[\"token\"];\n const target = parsed[\"target\"];\n if (\n typeof pid !== \"number\" || !Number.isSafeInteger(pid) || pid <= 0 ||\n (processStart !== undefined && typeof processStart !== \"string\") ||\n (state !== \"pending\" && state !== \"owned\") ||\n typeof startedAt !== \"string\" || Number.isNaN(Date.parse(startedAt)) ||\n typeof token !== \"string\" || token.length === 0 ||\n typeof target !== \"string\" || target.length === 0\n ) {\n return undefined;\n }\n return {\n pid,\n ...(typeof processStart === \"string\" ? { processStart } : {}),\n state,\n startedAt,\n token,\n target,\n };\n } catch {\n return undefined;\n }\n}\n\nasync function writeLockMetadata(path: string, metadata: SessionLockMetadata): Promise<void> {\n await writeFile(path, `${JSON.stringify(metadata)}\\n`, { encoding: \"utf8\", mode: 0o600 });\n}\n\nfunction metadataFromFilename(\n name: string,\n key: string,\n mtimeMs: number,\n): SessionLockMetadata | undefined {\n const match = new RegExp(`^${key}\\\\.(\\\\d+)\\\\.(.+)\\\\${LOCK_FILE_SUFFIX}$`, \"u\").exec(name);\n const rawPid = match?.[1];\n const token = match?.[2];\n if (rawPid === undefined || token === undefined || token.length === 0) {\n return undefined;\n }\n const pid = Number.parseInt(rawPid, 10);\n if (!Number.isSafeInteger(pid) || pid <= 0) {\n return undefined;\n }\n return {\n pid,\n state: \"owned\",\n startedAt: new Date(mtimeMs).toISOString(),\n token,\n target: \"unknown\",\n };\n}\n\nfunction ownerIsAlive(\n metadata: SessionLockMetadata,\n isProcessAlive: (pid: number) => boolean,\n getProcessStart: (pid: number) => string | undefined,\n): boolean {\n if (!isProcessAlive(metadata.pid)) {\n return false;\n }\n const currentStart = getProcessStart(metadata.pid);\n return metadata.processStart === undefined || currentStart === undefined ||\n metadata.processStart === currentStart;\n}\n\nfunction processIsAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n const status = processStatus(pid);\n return !status?.startsWith(\"Z\");\n } catch (error: unknown) {\n return isNodeError(error, \"EPERM\");\n }\n}\n\nfunction processStatus(pid: number): string | undefined {\n return runPs(pid, \"stat=\");\n}\n\nfunction processStart(pid: number): string | undefined {\n return runPs(pid, \"lstart=\");\n}\n\nfunction runPs(pid: number, field: string): string | undefined {\n try {\n const value = execFileSync(\"ps\", [\"-o\", field, \"-p\", pid.toString()], {\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n return value.length === 0 ? undefined : value;\n } catch {\n return undefined;\n }\n}\n\nfunction alreadyDebuggedError(owner: SessionLockMetadata): CfInspectorError {\n const ownerLabel = owner.pid > 0 ? `PID ${owner.pid.toString()}` : \"an unknown process\";\n return new CfInspectorError(\n \"TARGET_ALREADY_DEBUGGED\",\n `Another cf-inspector session (${ownerLabel}, started ${owner.startedAt}) is already actively debugging this target. Concurrent debugging sessions on the same isolate(s) can corrupt each other and disrupt real application traffic, so this attempt was refused rather than queued. Wait for the other session to finish, or confirm that it is gone before retrying; locks from dead processes are reclaimed automatically.`,\n );\n}\n\nfunction normalizeHost(host: string): string {\n const normalized = host.trim().toLowerCase();\n return normalized === \"localhost\" || normalized === \"::1\" ? \"127.0.0.1\" : normalized;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isNodeError(error: unknown, code: string): boolean {\n return error instanceof Error && \"code\" in error && error.code === code;\n}\n","import process from \"node:process\";\n\nimport type { InspectorSession } from \"../inspector/types.js\";\nimport { CfInspectorError } from \"../types.js\";\nimport type { BreakpointHandle, PauseEvent, SnapshotCaptureResult, SnapshotResult } from \"../types.js\";\n\nimport { looksLikeMutation } from \"./captureParser.js\";\n\nexport function warnOnCaptureMutationRisk(\n expressions: readonly string[],\n allowMutation: boolean,\n): void {\n const riskyCount = expressions.filter(looksLikeMutation).length;\n if (riskyCount === 0) {\n return;\n }\n const suffix = allowMutation\n ? \"will run without the V8 side-effect guard because --allow-mutation was passed.\"\n : \"will be checked by the V8 side-effect guard and blocked unless V8 proves them safe; pass --allow-mutation to run them unrestricted.\";\n process.stderr.write(\n `[cf-inspector] warning: ${riskyCount.toString()} capture ` +\n `${riskyCount === 1 ? \"expression looks\" : \"expressions look\"} mutation-capable and ${suffix}\\n`,\n );\n}\n\nexport function enforceNativeConditionMutationPolicy(\n expression: string,\n allowMutation: boolean,\n context: string,\n): void {\n if (!looksLikeMutation(expression)) {\n return;\n }\n if (!allowMutation) {\n throw new CfInspectorError(\n \"MUTATION_NOT_ALLOWED\",\n `${context} looks mutation-capable. Native breakpoint conditions cannot be protected by V8's side-effect guard; pass --allow-mutation to arm it explicitly.`,\n );\n }\n process.stderr.write(\n `[cf-inspector] warning: ${context} looks mutation-capable and will run as a native breakpoint condition; native conditions cannot be side-effect-gated.\\n`,\n );\n}\n\nexport function warnOnMutationRisk(expression: string, context: string): void {\n if (!looksLikeMutation(expression)) {\n return;\n }\n process.stderr.write(\n `[cf-inspector] warning: ${context} looks mutation-capable and will execute against the live inspectee without a side-effect guard.\\n`,\n );\n}\n\nexport function warnOnUnboundBreakpoints(handles: readonly BreakpointHandle[]): void {\n for (const handle of handles) {\n if (handle.resolvedLocations.length === 0) {\n const tsHint = handle.file.endsWith(\".ts\")\n ? \" Hint: Source TS breakpoints may not bind. Try inspecting loaded scripts with list-scripts and target the compiled .js file instead.\"\n : \"\";\n process.stderr.write(\n `[cf-inspector] warning: breakpoint ${handle.file}:${handle.line.toString()} ` +\n `did not bind to any loaded script. Check the path or pass --remote-root. ` +\n `Use 'list-scripts' to inspect what V8 currently has loaded.${tsHint}\\n`,\n );\n }\n }\n}\n\nexport function warnOnImplicitInspectorSelection(\n session: Pick<\n InspectorSession,\n \"targetCount\" | \"targetIndex\" | \"workerTargets\"\n >,\n targetWasExplicit: boolean,\n workerWasExplicit: boolean,\n): void {\n const targetCount = session.targetCount ?? 1;\n const targetIndex = session.targetIndex ?? 0;\n if (!targetWasExplicit && targetCount > 1) {\n process.stderr.write(\n `[cf-inspector] notice: attached to inspector target ${targetIndex.toString()} of ` +\n `${targetCount.toString()}; pass --target <index> to pick another.\\n`,\n );\n }\n const workerCount = session.workerTargets?.length ?? 0;\n if (!workerWasExplicit && workerCount > 0) {\n process.stderr.write(\n `[cf-inspector] notice: attached to the main isolate; ${workerCount.toString()} Node ` +\n `${workerCount === 1 ? \"worker is\" : \"workers are\"} available. ` +\n \"This command is single-isolate by nature; use --worker-id <id> to inspect one worker explicitly.\\n\",\n );\n }\n}\n\nexport function warnOnBoundBreakpointWithoutHit(handles: readonly BreakpointHandle[]): void {\n const boundCount = handles.reduce((count, handle) => {\n return count + handle.resolvedLocations.length;\n }, 0);\n if (boundCount === 0) {\n return;\n }\n process.stderr.write(\n `[cf-inspector] warning: ${boundCount.toString()} breakpoint ` +\n `${boundCount === 1 ? \"location bound\" : \"locations bound\"}, but no hit was observed. ` +\n \"No selected isolate executed the location before the command stopped. Check conditions, hit counts, request traffic, and use check-breakpoint to verify the exact line.\\n\",\n );\n}\n\nexport function roundDurationMs(durationMs: number): number {\n return Math.round(durationMs * 1000) / 1000;\n}\n\nexport function warnOnUnmatchedPause(pause: PauseEvent): void {\n const reason = pause.reason.length > 0 ? pause.reason : \"unknown\";\n process.stderr.write(\n `[cf-inspector] warning: target is paused by another debugger event ` +\n `(${reason} at ${formatPauseLocation(pause)}); waiting for it to resume...\\n`,\n );\n}\n\nexport function withPausedDuration(\n snapshot: SnapshotCaptureResult,\n pausedDurationMs: number | null,\n): SnapshotResult {\n const base: SnapshotResult = {\n reason: snapshot.reason,\n hitBreakpoints: snapshot.hitBreakpoints,\n capturedAt: snapshot.capturedAt,\n pausedDurationMs,\n captures: snapshot.captures,\n };\n const withFrame = snapshot.topFrame === undefined ? base : { ...base, topFrame: snapshot.topFrame };\n const withStack = snapshot.stack === undefined ? withFrame : { ...withFrame, stack: snapshot.stack };\n return snapshot.exception === undefined ? withStack : { ...withStack, exception: snapshot.exception };\n}\n\nfunction formatPauseLocation(pause: PauseEvent): string {\n const top = pause.callFrames[0];\n if (top === undefined) {\n return \"(no call frame)\";\n }\n const url = top.url !== undefined && top.url.length > 0 ? top.url : \"(unknown)\";\n return `${url}:${(top.lineNumber + 1).toString()}:${(top.columnNumber + 1).toString()}`;\n}\n","export function parseCaptureList(raw: string | undefined): readonly string[] {\n if (raw === undefined || raw.trim().length === 0) {\n return [];\n }\n return splitCaptureExpressions(raw);\n}\n\ntype QuoteChar = \"'\" | \"\\\"\" | \"`\";\n\ninterface QuoteScanState {\n quote: QuoteChar | undefined;\n escaped: boolean;\n}\n\ninterface CaptureSplitState extends QuoteScanState {\n parenDepth: number;\n bracketDepth: number;\n braceDepth: number;\n start: number;\n readonly pieces: string[];\n}\n\nfunction isQuoteChar(value: string): value is QuoteChar {\n return value === \"'\" || value === \"\\\"\" || value === \"`\";\n}\n\nfunction consumeQuotedChar(state: QuoteScanState, char: string): boolean {\n if (state.quote === undefined) {\n return false;\n }\n if (state.escaped) {\n state.escaped = false;\n return true;\n }\n if (char === \"\\\\\") {\n state.escaped = true;\n return true;\n }\n if (char === state.quote) {\n state.quote = undefined;\n }\n return true;\n}\n\nfunction stripQuotedText(expression: string): string {\n const state: QuoteScanState = { quote: undefined, escaped: false };\n let stripped = \"\";\n for (const char of expression) {\n if (consumeQuotedChar(state, char)) {\n stripped += \" \";\n continue;\n }\n if (isQuoteChar(char)) {\n state.quote = char;\n stripped += \" \";\n continue;\n }\n stripped += char;\n }\n return stripped;\n}\n\nexport function looksLikeMutation(expression: string): boolean {\n const stripped = stripQuotedText(expression);\n const hasUpdate = /(?:\\+\\+|--)/u.test(stripped);\n const hasAssignment = /(?:\\*\\*=|&&=|\\|\\|=|\\?\\?=|[+\\-*/%&|^]=|(?:^|[^=!<>])=(?!=|>))/u.test(stripped);\n const hasDelete = /\\bdelete\\b/u.test(stripped);\n const hasMutatingMethod = /\\.\\s*(?:push|pop|shift|unshift|splice|sort|reverse|fill|copyWithin|set|add|delete|clear)\\s*\\(/u.test(stripped);\n const hasObjectMutation = /\\bObject\\s*\\.\\s*(?:assign|defineProperty|defineProperties)\\s*\\(/u.test(stripped);\n return hasUpdate || hasAssignment || hasDelete || hasMutatingMethod || hasObjectMutation;\n}\n\nfunction updateCaptureDepth(state: CaptureSplitState, char: string): void {\n if (char === \"(\") {\n state.parenDepth += 1;\n } else if (char === \")\") {\n state.parenDepth = Math.max(0, state.parenDepth - 1);\n } else if (char === \"[\") {\n state.bracketDepth += 1;\n } else if (char === \"]\") {\n state.bracketDepth = Math.max(0, state.bracketDepth - 1);\n } else if (char === \"{\") {\n state.braceDepth += 1;\n } else if (char === \"}\") {\n state.braceDepth = Math.max(0, state.braceDepth - 1);\n }\n}\n\nfunction isTopLevel(state: CaptureSplitState): boolean {\n return state.parenDepth === 0 && state.bracketDepth === 0 && state.braceDepth === 0;\n}\n\nfunction appendCapturePiece(raw: string, state: CaptureSplitState, end: number): void {\n const piece = raw.slice(state.start, end).trim();\n if (piece.length > 0) {\n state.pieces.push(piece);\n }\n}\n\nfunction splitCaptureExpressions(raw: string): readonly string[] {\n const state: CaptureSplitState = {\n escaped: false,\n parenDepth: 0,\n bracketDepth: 0,\n braceDepth: 0,\n quote: undefined,\n start: 0,\n pieces: [],\n };\n for (let idx = 0; idx < raw.length; idx += 1) {\n const char = raw.charAt(idx);\n if (consumeQuotedChar(state, char)) {\n continue;\n }\n if (isQuoteChar(char)) {\n state.quote = char;\n continue;\n }\n updateCaptureDepth(state, char);\n if (char === \",\" && isTopLevel(state)) {\n appendCapturePiece(raw, state, idx);\n state.start = idx + 1;\n }\n }\n appendCapturePiece(raw, state, raw.length);\n return state.pieces;\n}\n","import process from \"node:process\";\n\nimport { getPossibleBreakpoints } from \"../../inspector/breakpoints.js\";\nimport type { InspectorSession } from \"../../inspector/types.js\";\nimport { buildBreakpointUrlRegex, parseBreakpointSpec, parseRemoteRoot } from \"../../pathMapper.js\";\nimport type { BreakLocation, InspectorIsolate } from \"../../types.js\";\nimport type { CheckBreakpointCommandOptions } from \"../commandTypes.js\";\nimport { writeJson } from \"../output.js\";\nimport { resolveTargetWithCurrentCfTarget, withSessions } from \"../target.js\";\n\ninterface ScriptBreakpointCheck {\n readonly isolate: InspectorIsolate;\n readonly scriptId: string;\n readonly url: string;\n readonly locations: readonly BreakLocation[];\n}\n\ninterface BreakpointCheckResult {\n readonly file: string;\n readonly line: number;\n readonly status: \"breakable\" | \"unbreakable\" | \"script-not-loaded\";\n readonly scripts: readonly ScriptBreakpointCheck[];\n}\n\nexport async function handleCheckBreakpoint(\n opts: CheckBreakpointCommandOptions,\n): Promise<void> {\n const target = await resolveTargetWithCurrentCfTarget(opts);\n const location = parseBreakpointSpec(opts.bp);\n const remoteRoot = parseRemoteRoot(opts.remoteRoot);\n const urlRegex = buildBreakpointUrlRegex({ file: location.file, remoteRoot });\n // --remote-root's regex mode is an intentional, documented escape hatch (see pathMapper.ts's\n // parseRemoteRoot/toRegex): every other input path here already runs through escapeRegExp, and\n // assertSafeRemoteRootPattern rejects patterns over 200 chars or the classic nested-quantifier\n // ReDoS shape before urlRegex is ever built. Escaping this input — the only sanitizer shape\n // CodeQL's js/regex-injection query recognizes — would defeat the feature's purpose.\n // codeql[js/regex-injection]\n const matcher = new RegExp(urlRegex, \"u\");\n const result = await withSessions(target, async (group): Promise<BreakpointCheckResult> => {\n const checks = (await Promise.all(group.list().map(async (session) =>\n await checkSession(session, matcher, location.line))))\n .flat();\n const status = checks.length === 0\n ? \"script-not-loaded\"\n : (checks.some((check) => check.locations.length > 0) ? \"breakable\" : \"unbreakable\");\n return { file: location.file, line: location.line, status, scripts: checks };\n });\n if (opts.json) {\n writeJson(result);\n return;\n }\n writeHumanCheck(result);\n}\n\nasync function checkSession(\n session: InspectorSession,\n matcher: RegExp,\n requestedLine: number,\n): Promise<readonly ScriptBreakpointCheck[]> {\n const zeroBasedLine = requestedLine - 1;\n const scripts = [...session.scripts.values()].filter((script) => matcher.test(script.url));\n return await Promise.all(scripts.map(async (script): Promise<ScriptBreakpointCheck> => {\n const locations = await getPossibleBreakpoints(session, {\n start: { scriptId: script.scriptId, lineNumber: zeroBasedLine, columnNumber: 0 },\n end: { scriptId: script.scriptId, lineNumber: zeroBasedLine + 1, columnNumber: 0 },\n });\n return {\n isolate: session.isolate ?? { kind: \"main\" },\n scriptId: script.scriptId,\n url: script.url,\n locations: locations.filter((candidate) => candidate.lineNumber === zeroBasedLine),\n };\n }));\n}\n\nfunction writeHumanCheck(result: BreakpointCheckResult): void {\n if (result.status === \"script-not-loaded\") {\n process.stdout.write(\n `${result.file}:${result.line.toString()} does not match any loaded script. ` +\n \"Run list-scripts and check --remote-root/path mapping, or trigger lazy module loading first.\\n\",\n );\n return;\n }\n if (result.status === \"unbreakable\") {\n process.stdout.write(\n `${result.file}:${result.line.toString()} matches a loaded script, but this exact line has no breakable location. Try a neighboring executable line.\\n`,\n );\n return;\n }\n process.stdout.write(`${result.file}:${result.line.toString()} is breakable:\\n`);\n for (const script of result.scripts) {\n for (const location of script.locations) {\n const isolate = script.isolate.kind === \"main\" ? \"main\" : `worker ${script.isolate.workerId}`;\n process.stdout.write(\n ` ${isolate}\\t${script.url}\\tline ${(location.lineNumber + 1).toString()}:` +\n `${((location.columnNumber ?? 0) + 1).toString()}\\n`,\n );\n }\n }\n}\n\nexport const internalsForTesting = { checkSession };\n","import { CfInspectorError } from \"./types.js\";\nimport type { BreakpointLocation, RemoteRootSetting } from \"./types.js\";\n\nconst REGEX_PREFIX = \"regex:\";\n// cspell:ignore dgimsuvy\nconst REGEX_FLAGS_PATTERN = /^[dgimsuvy]*$/;\nconst TS_JS_EXT_PATTERN = /\\.(?:ts|js|mts|mjs|cts|cjs)$/i;\n\n/**\n * `--remote-root regex:...`/`/pattern/flags` lets an operator supply a raw\n * regex on purpose (unlike every other input here, which goes through\n * `escapeRegExp`) — CodeQL correctly flags \"regex built from user input\" on\n * that path. Bounding length and rejecting the classic nested-quantifier\n * shape (`(x+)+`, `(x*)+`, `(x+)*`, ...) is defense-in-depth: this is a local\n * CLI operated by whoever supplies the pattern, not a network-facing input,\n * so the realistic risk is an operator DoS-ing their own debugger session,\n * but a bad pattern should still fail fast with a clear message rather than\n * hang the process.\n */\nconst MAX_REMOTE_ROOT_PATTERN_LENGTH = 200;\nconst NESTED_QUANTIFIER_PATTERN = /\\([^()]*[+*][^()]*\\)[+*]/;\n\nfunction assertSafeRemoteRootPattern(pattern: string): void {\n if (pattern.length > MAX_REMOTE_ROOT_PATTERN_LENGTH) {\n throw new CfInspectorError(\n \"INVALID_REMOTE_ROOT\",\n `--remote-root regex pattern is too long (${pattern.length.toString()} chars, max ${MAX_REMOTE_ROOT_PATTERN_LENGTH.toString()}) — this bounds worst-case backtracking cost`,\n );\n }\n if (NESTED_QUANTIFIER_PATTERN.test(pattern)) {\n throw new CfInspectorError(\n \"INVALID_REMOTE_ROOT\",\n `--remote-root regex pattern \"${pattern}\" contains a nested quantifier (e.g. \"(x+)+\"), which can cause catastrophic backtracking — simplify the pattern`,\n );\n }\n}\n\nexport function parseBreakpointSpec(input: string): BreakpointLocation {\n const idx = input.lastIndexOf(\":\");\n if (idx <= 0 || idx === input.length - 1) {\n throw new CfInspectorError(\n \"INVALID_BREAKPOINT\",\n `Breakpoint must be in 'file:line' form, received: \"${input}\"`,\n );\n }\n const file = input.slice(0, idx).trim();\n const lineRaw = input.slice(idx + 1).trim();\n const line = Number.parseInt(lineRaw, 10);\n if (!Number.isInteger(line) || line <= 0 || line.toString() !== lineRaw) {\n throw new CfInspectorError(\n \"INVALID_BREAKPOINT\",\n `Breakpoint line must be a positive integer, received: \"${lineRaw}\"`,\n );\n }\n if (file.length === 0) {\n throw new CfInspectorError(\n \"INVALID_BREAKPOINT\",\n `Breakpoint file path is empty in \"${input}\"`,\n );\n }\n return { file, line };\n}\n\nexport function parseRemoteRoot(value: string | undefined): RemoteRootSetting {\n const trimmed = value?.trim();\n if (trimmed === undefined || trimmed.length === 0) {\n return { kind: \"none\" };\n }\n if (trimmed.startsWith(REGEX_PREFIX)) {\n return toRegex(trimmed.slice(REGEX_PREFIX.length), \"\");\n }\n const slashRegex = parseSlashDelimited(trimmed);\n if (slashRegex !== undefined) {\n return toRegex(slashRegex.pattern, slashRegex.flags);\n }\n return { kind: \"literal\", value: stripTrailingSlash(trimmed) };\n}\n\nfunction toRegex(pattern: string, flags: string): RemoteRootSetting {\n assertSafeRemoteRootPattern(pattern);\n return { kind: \"regex\", pattern, flags };\n}\n\nfunction parseSlashDelimited(value: string): { pattern: string; flags: string } | undefined {\n if (!value.startsWith(\"/\")) {\n return undefined;\n }\n const closing = findLastUnescapedSlash(value);\n if (closing <= 0) {\n return undefined;\n }\n const flags = value.slice(closing + 1);\n // Disambiguate with literal paths: a path like \"/home/vcap/app/\" would parse\n // as `/<pattern>/` with empty flags. We require non-empty flags for the\n // slash-delimited form; flagless regexes must use the explicit \"regex:\" prefix.\n if (flags.length === 0 || !REGEX_FLAGS_PATTERN.test(flags)) {\n return undefined;\n }\n return { pattern: value.slice(1, closing), flags };\n}\n\nfunction findLastUnescapedSlash(value: string): number {\n for (let i = value.length - 1; i > 0; i--) {\n if (value[i] === \"/\" && !isEscaped(value, i)) {\n return i;\n }\n }\n return -1;\n}\n\nfunction isEscaped(value: string, idx: number): boolean {\n let backslashes = 0;\n for (let i = idx - 1; i >= 0; i--) {\n if (value[i] === \"\\\\\") {\n backslashes++;\n } else {\n break;\n }\n }\n return backslashes % 2 === 1;\n}\n\nfunction stripTrailingSlash(value: string): string {\n if (value.length > 1 && value.endsWith(\"/\")) {\n return value.slice(0, -1);\n }\n return value;\n}\n\nfunction normalizeRegexRootPattern(pattern: string): string {\n const withoutStartAnchor = pattern.startsWith(\"^\") ? pattern.slice(1) : pattern;\n const withoutEndAnchor =\n withoutStartAnchor.endsWith(\"$\") && !isEscaped(withoutStartAnchor, withoutStartAnchor.length - 1)\n ? withoutStartAnchor.slice(0, -1)\n : withoutStartAnchor;\n return stripTrailingSlash(withoutEndAnchor);\n}\n\nfunction buildFileUrlRegex(embeddedRoot: string, tail: string, separator: \"\" | \"/\"): string {\n return `^file://${embeddedRoot}${separator}${tail}$`;\n}\n\nfunction rootSeparator(rawPattern: string): \"\" | \"/\" {\n return rawPattern.endsWith(\"/\") ? \"\" : \"/\";\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replaceAll(/[.*+?^${}()|[\\]\\\\]/g, String.raw`\\$&`);\n}\n\nfunction normalizeRelative(file: string): string {\n return file.replaceAll(/^[./\\\\]+/g, \"\").replaceAll(\"\\\\\", \"/\");\n}\n\nfunction dropExtension(file: string): { stem: string; matchedExt: boolean } {\n const match = TS_JS_EXT_PATTERN.exec(file);\n if (!match) {\n return { stem: file, matchedExt: false };\n }\n return { stem: file.slice(0, match.index), matchedExt: true };\n}\n\nconst EXT_GROUP = String.raw`\\.(?:ts|js|mts|mjs|cts|cjs)`;\nconst OPTIONAL_EXT_GROUP = String.raw`(?:\\.(?:ts|js|mts|mjs|cts|cjs))?`;\n\nexport interface BuildUrlRegexInput {\n readonly file: string;\n readonly remoteRoot: RemoteRootSetting;\n}\n\nexport function buildBreakpointUrlRegex(input: BuildUrlRegexInput): string {\n const normalized = normalizeRelative(input.file);\n const { stem, matchedExt } = dropExtension(normalized);\n const escapedStem = escapeRegExp(stem);\n const tail = matchedExt ? `${escapedStem}${EXT_GROUP}` : `${escapedStem}${OPTIONAL_EXT_GROUP}`;\n\n switch (input.remoteRoot.kind) {\n case \"none\": {\n return `(?:^|/)${tail}$`;\n }\n case \"literal\": {\n const root = input.remoteRoot.value;\n return buildFileUrlRegex(escapeRegExp(root), tail, rootSeparator(root));\n }\n case \"regex\": {\n const root = normalizeRegexRootPattern(input.remoteRoot.pattern);\n // Wrap the user pattern in a non-capturing group so alternation in the\n // user's regex (e.g. `regex:a|b`) does not bind to the surrounding\n // `^file://` / tail. Without this, the engine would parse the result as\n // `(^file://a)|(b/.../src/...$)`.\n return buildFileUrlRegex(`(?:${root})`, tail, rootSeparator(root));\n }\n }\n}\n","import { buildBreakpointUrlRegex } from \"../pathMapper.js\";\nimport { CfInspectorError } from \"../types.js\";\nimport type {\n BreakLocation,\n BreakpointHandle,\n ExactBreakpointHandle,\n GetPossibleBreakpointsOptions,\n RemoteRootSetting,\n ScriptLocation,\n SetBreakpointAtLocationInput,\n} from \"../types.js\";\n\nimport {\n asString,\n toBreakLocations,\n toResolvedLocations,\n toScriptLocation,\n} from \"./conversions.js\";\nimport type {\n CdpPossibleBreakpointsResult,\n CdpSetBreakpointResult,\n CdpSetExactBreakpointResult,\n InspectorSession,\n SetBreakpointInput,\n} from \"./types.js\";\n\nconst HITS_GLOBAL = \"globalThis.__CFI_HITS\";\nlet counterKeyCounter = 0;\n\nfunction nextCounterKey(file: string, line: number): string {\n counterKeyCounter += 1;\n return `${file}:${line.toString()}:${counterKeyCounter.toString()}`;\n}\n\nfunction validateHitCount(hitCount: number | undefined): number | undefined {\n if (hitCount === undefined) {\n return undefined;\n }\n if (!Number.isInteger(hitCount) || hitCount <= 0) {\n throw new CfInspectorError(\n \"INVALID_HIT_COUNT\",\n `hitCount must be a positive integer, received: ${hitCount.toString()}`,\n );\n }\n return hitCount;\n}\n\nexport function buildHitCountedCondition(\n hitCount: number,\n counterKey: string,\n userCondition: string | undefined,\n): string {\n const keyLiteral = JSON.stringify(counterKey);\n const baseCondition = userCondition !== undefined && userCondition.trim().length > 0\n ? `(${userCondition})`\n : \"true\";\n return [\n \"(function(){\",\n `var m=(${HITS_GLOBAL}=${HITS_GLOBAL}||{});`,\n `var k=${keyLiteral};`,\n \"m[k]=(m[k]||0)+1;\",\n `if(m[k]<${hitCount.toString()})return false;`,\n `return ${baseCondition};`,\n \"})()\",\n ].join(\"\");\n}\n\nfunction resolveCondition(\n input: SetBreakpointInput,\n): string | undefined {\n const condition = input.condition;\n const hitCount = validateHitCount(input.hitCount);\n if (hitCount === undefined) {\n return condition !== undefined && condition.length > 0 ? condition : undefined;\n }\n const counterKey = nextCounterKey(input.file, input.line);\n return buildHitCountedCondition(hitCount, counterKey, condition);\n}\n\nexport async function setBreakpoint(\n session: InspectorSession,\n input: SetBreakpointInput,\n): Promise<BreakpointHandle> {\n const remoteRoot: RemoteRootSetting = input.remoteRoot ?? { kind: \"none\" };\n const urlRegex = buildBreakpointUrlRegex({ file: input.file, remoteRoot });\n const params: Record<string, unknown> = {\n lineNumber: input.line - 1,\n urlRegex,\n };\n const condition = resolveCondition(input);\n if (condition !== undefined) {\n params[\"condition\"] = condition;\n }\n const result = await session.client.send<CdpSetBreakpointResult>(\n \"Debugger.setBreakpointByUrl\",\n params,\n );\n const breakpointId = asString(result.breakpointId);\n if (breakpointId.length === 0) {\n throw new CfInspectorError(\n \"CDP_REQUEST_FAILED\",\n `setBreakpointByUrl did not return a breakpointId for ${input.file}:${input.line.toString()}`,\n );\n }\n return {\n breakpointId,\n file: input.file,\n line: input.line,\n urlRegex,\n resolvedLocations: toResolvedLocations(result.locations),\n };\n}\n\nexport async function removeBreakpoint(\n session: InspectorSession,\n breakpointId: string,\n): Promise<void> {\n await session.client.send(\"Debugger.removeBreakpoint\", { breakpointId });\n}\n\nfunction validateCoordinate(value: number, label: string): void {\n if (!Number.isInteger(value) || value < 0) {\n throw new CfInspectorError(\n \"INVALID_ARGUMENT\",\n `${label} must be a non-negative integer, received: ${value.toString()}`,\n );\n }\n}\n\nfunction validateScriptLocation(location: ScriptLocation, label: string): void {\n if (location.scriptId.trim().length === 0) {\n throw new CfInspectorError(\"INVALID_ARGUMENT\", `${label}.scriptId must not be empty`);\n }\n validateCoordinate(location.lineNumber, `${label}.lineNumber`);\n if (location.columnNumber !== undefined) {\n validateCoordinate(location.columnNumber, `${label}.columnNumber`);\n }\n}\n\nfunction isSameScriptLocation(\n requested: ScriptLocation,\n actual: ScriptLocation,\n): boolean {\n return requested.scriptId === actual.scriptId\n && requested.lineNumber === actual.lineNumber\n && (requested.columnNumber ?? 0) === (actual.columnNumber ?? 0);\n}\n\nexport async function getPossibleBreakpoints(\n session: InspectorSession,\n options: GetPossibleBreakpointsOptions,\n): Promise<readonly BreakLocation[]> {\n validateScriptLocation(options.start, \"start\");\n if (options.end !== undefined) {\n validateScriptLocation(options.end, \"end\");\n if (options.end.scriptId !== options.start.scriptId) {\n throw new CfInspectorError(\"INVALID_ARGUMENT\", \"start and end must refer to the same scriptId\");\n }\n }\n const result = await session.client.send<CdpPossibleBreakpointsResult>(\n \"Debugger.getPossibleBreakpoints\",\n {\n start: options.start,\n ...(options.end === undefined ? {} : { end: options.end }),\n ...(options.restrictToFunction === undefined\n ? {}\n : { restrictToFunction: options.restrictToFunction }),\n },\n );\n if (!Array.isArray(result.locations)) {\n throw new CfInspectorError(\n \"CDP_REQUEST_FAILED\",\n \"Debugger.getPossibleBreakpoints did not return a locations array\",\n );\n }\n return toBreakLocations(result.locations);\n}\n\nexport async function setBreakpointAtLocation(\n session: InspectorSession,\n input: SetBreakpointAtLocationInput,\n): Promise<ExactBreakpointHandle> {\n validateScriptLocation(input.location, \"location\");\n const result = await session.client.send<CdpSetExactBreakpointResult>(\"Debugger.setBreakpoint\", {\n location: input.location,\n ...(input.condition === undefined || input.condition.length === 0\n ? {}\n : { condition: input.condition }),\n });\n const breakpointId = asString(result.breakpointId);\n const actualLocation = toScriptLocation(result.actualLocation);\n const wrongLocation = actualLocation !== undefined\n && !isSameScriptLocation(input.location, actualLocation);\n if (breakpointId.length === 0 || actualLocation === undefined || wrongLocation) {\n if (breakpointId.length > 0) {\n try {\n await removeBreakpoint(session, breakpointId);\n } catch {\n // The invalid binding is already unusable; preserve the validation failure.\n }\n }\n if (wrongLocation) {\n throw new CfInspectorError(\n \"INVALID_BREAKPOINT\",\n \"Debugger.setBreakpoint resolved the breakpoint at a different script, line, or column\",\n );\n }\n throw new CfInspectorError(\n \"CDP_REQUEST_FAILED\",\n \"Debugger.setBreakpoint did not return a breakpointId and actualLocation\",\n );\n }\n return {\n breakpointId,\n requestedLocation: input.location,\n actualLocation,\n };\n}\n","import process from \"node:process\";\n\nimport { evaluateGlobal } from \"../../inspector/runtime.js\";\nimport type { EvalCommandOptions } from \"../commandTypes.js\";\nimport { writeJson } from \"../output.js\";\nimport { resolveTargetWithCurrentCfTarget, withSession } from \"../target.js\";\nimport { warnOnMutationRisk } from \"../warnings.js\";\n\nexport async function handleEval(opts: EvalCommandOptions): Promise<void> {\n warnOnMutationRisk(opts.expr, \"eval --expr\");\n const target = await resolveTargetWithCurrentCfTarget(opts);\n const result = await withSession(target, async (session) => {\n return await evaluateGlobal(session, opts.expr);\n });\n if (opts.json) {\n writeJson(result);\n if (result.exceptionDetails !== undefined) {\n process.exitCode = 1;\n }\n return;\n }\n writeHumanEvalResult(result);\n}\n\nfunction writeHumanEvalResult(result: Awaited<ReturnType<typeof evaluateGlobal>>): void {\n if (result.exceptionDetails !== undefined) {\n const detail =\n typeof result.exceptionDetails.exception?.description === \"string\"\n ? result.exceptionDetails.exception.description\n : (typeof result.exceptionDetails.text === \"string\" ? result.exceptionDetails.text : \"evaluation failed\");\n process.stderr.write(`${detail}\\n`);\n process.exitCode = 1;\n return;\n }\n const inner = result.result;\n if (inner === undefined) {\n process.stdout.write(\"\\n\");\n return;\n }\n if (typeof inner.value === \"string\") {\n process.stdout.write(`${inner.value}\\n`);\n return;\n }\n if (typeof inner.description === \"string\") {\n process.stdout.write(`${inner.description}\\n`);\n return;\n }\n process.stdout.write(`${JSON.stringify(inner.value)}\\n`);\n}\n","import { CfInspectorError } from \"../types.js\";\nimport type { ScriptInfo } from \"../types.js\";\n\nimport type { CdpEvalResult, CdpProperty, InspectorSession } from \"./types.js\";\n\nexport type PauseOnExceptionsState = \"none\" | \"uncaught\" | \"caught\" | \"all\";\n\nexport interface EvaluateOnFrameOptions {\n readonly throwOnSideEffect?: boolean;\n readonly objectGroup?: string;\n}\n\nexport interface StepIntoOptions {\n readonly breakOnAsyncCall?: boolean;\n}\n\nexport async function resume(session: InspectorSession): Promise<void> {\n await session.client.send(\"Debugger.resume\");\n session.debuggerState.paused = false;\n delete session.debuggerState.currentPause;\n}\n\nexport async function setPauseOnExceptions(\n session: InspectorSession,\n state: PauseOnExceptionsState,\n): Promise<void> {\n await session.client.send(\"Debugger.setPauseOnExceptions\", { state });\n}\n\nexport async function setAsyncCallStackDepth(\n session: InspectorSession,\n maxDepth: number,\n): Promise<void> {\n await session.client.send(\"Debugger.setAsyncCallStackDepth\", { maxDepth });\n}\n\nexport async function evaluateOnFrame(\n session: InspectorSession,\n callFrameId: string,\n expression: string,\n options: EvaluateOnFrameOptions = {},\n): Promise<CdpEvalResult> {\n return await session.client.send<CdpEvalResult>(\"Debugger.evaluateOnCallFrame\", {\n callFrameId,\n expression,\n returnByValue: false,\n generatePreview: true,\n silent: true,\n ...(options.throwOnSideEffect === undefined\n ? {}\n : { throwOnSideEffect: options.throwOnSideEffect }),\n ...(options.objectGroup === undefined ? {} : { objectGroup: options.objectGroup }),\n });\n}\n\nexport function isSideEffectRefusal(result: CdpEvalResult): boolean {\n const classNames = [\n result.result?.className,\n result.exceptionDetails?.exception?.className,\n ];\n const descriptions = [\n result.result?.description,\n result.exceptionDetails?.exception?.description,\n ];\n const isEvalError = classNames.includes(\"EvalError\");\n return isEvalError && descriptions.some(\n (description) =>\n typeof description === \"string\" &&\n description.toLowerCase().includes(\"possible side-effect in debug-evaluate\"),\n );\n}\n\nexport async function evaluateGlobal(\n session: InspectorSession,\n expression: string,\n): Promise<CdpEvalResult> {\n return await session.client.send<CdpEvalResult>(\"Runtime.evaluate\", {\n expression,\n returnByValue: false,\n generatePreview: true,\n silent: true,\n });\n}\n\nexport async function runSetupEvals(\n session: InspectorSession,\n expressions: readonly string[],\n): Promise<void> {\n for (const expression of expressions) {\n const result = await evaluateGlobal(session, expression);\n if (result.exceptionDetails !== undefined) {\n throw new CfInspectorError(\n \"SETUP_EVAL_FAILED\",\n exceptionDetailsMessage(result, \"setup evaluation failed\"),\n );\n }\n }\n}\n\nfunction exceptionDetailsMessage(result: CdpEvalResult, fallback: string): string {\n return typeof result.exceptionDetails?.exception?.description === \"string\"\n ? result.exceptionDetails.exception.description\n : (typeof result.exceptionDetails?.text === \"string\"\n ? result.exceptionDetails.text\n : fallback);\n}\n\nexport function listScripts(session: InspectorSession): readonly ScriptInfo[] {\n return [...session.scripts.values()];\n}\n\ninterface CdpCompileResult {\n scriptId?: unknown;\n exceptionDetails?: { text?: unknown; exception?: { description?: unknown } };\n}\n\nexport async function validateExpression(\n session: InspectorSession,\n expression: string,\n): Promise<void> {\n const result = await session.client.send<CdpCompileResult>(\"Runtime.compileScript\", {\n expression,\n sourceURL: \"<cf-inspector-validate>\",\n persistScript: false,\n });\n if (result.exceptionDetails === undefined) {\n return;\n }\n const description =\n typeof result.exceptionDetails.exception?.description === \"string\"\n ? result.exceptionDetails.exception.description\n : (typeof result.exceptionDetails.text === \"string\"\n ? result.exceptionDetails.text\n : \"expression failed to compile\");\n throw new CfInspectorError(\"INVALID_EXPRESSION\", description);\n}\n\nexport async function getProperties(\n session: InspectorSession,\n objectId: string,\n): Promise<readonly CdpProperty[]> {\n const result = await session.client.send<{ result?: unknown }>(\"Runtime.getProperties\", {\n objectId,\n ownProperties: true,\n accessorPropertiesOnly: false,\n generatePreview: true,\n });\n if (!Array.isArray(result.result)) {\n return [];\n }\n return result.result as readonly CdpProperty[];\n}\n\nexport async function getScriptSource(\n session: InspectorSession,\n scriptId: string,\n): Promise<string> {\n if (scriptId.trim().length === 0) {\n throw new CfInspectorError(\"INVALID_ARGUMENT\", \"scriptId must not be empty\");\n }\n const result = await session.client.send<{ readonly scriptSource?: unknown }>(\n \"Debugger.getScriptSource\",\n { scriptId },\n );\n if (typeof result.scriptSource !== \"string\") {\n throw new CfInspectorError(\n \"CDP_REQUEST_FAILED\",\n \"Debugger.getScriptSource did not return scriptSource\",\n );\n }\n return result.scriptSource;\n}\n\nexport async function stepInto(\n session: InspectorSession,\n options: StepIntoOptions = {},\n): Promise<void> {\n await session.client.send(\"Debugger.stepInto\", {\n ...(options.breakOnAsyncCall === undefined\n ? {}\n : { breakOnAsyncCall: options.breakOnAsyncCall }),\n });\n}\n\nexport async function stepOver(session: InspectorSession): Promise<void> {\n await session.client.send(\"Debugger.stepOver\");\n}\n\nexport async function stepOut(session: InspectorSession): Promise<void> {\n await session.client.send(\"Debugger.stepOut\");\n}\n\nexport async function releaseObject(\n session: InspectorSession,\n objectId: string,\n): Promise<void> {\n await session.client.send(\"Runtime.releaseObject\", { objectId });\n}\n\nexport async function releaseObjectGroup(\n session: InspectorSession,\n objectGroup: string,\n): Promise<void> {\n await session.client.send(\"Runtime.releaseObjectGroup\", { objectGroup });\n}\n\nexport type { CdpEvalResult, CdpProperty } from \"./types.js\";\n","import { performance } from \"node:perf_hooks\";\nimport process from \"node:process\";\n\nimport {\n BreakpointFanout,\n resume,\n setPauseOnExceptions,\n} from \"../../inspector/index.js\";\nimport type { InspectorSession, PauseOnExceptionsState } from \"../../inspector/index.js\";\nimport { parseRemoteRoot } from \"../../pathMapper.js\";\nimport { captureSnapshot } from \"../../snapshot/capture.js\";\nimport { DEFAULT_MAX_VALUE_LENGTH } from \"../../snapshot/values.js\";\nimport { CfInspectorError } from \"../../types.js\";\nimport type { RemoteRootSetting, SnapshotResult } from \"../../types.js\";\nimport { parseCaptureList } from \"../captureParser.js\";\nimport { DEFAULT_EXCEPTION_TIMEOUT_SEC } from \"../commandTypes.js\";\nimport type { ExceptionCommandOptions, Target } from \"../commandTypes.js\";\nimport { writeArmedEvent, writeHumanSnapshot, writeJson } from \"../output.js\";\nimport { withTerminationSignal } from \"../signals.js\";\nimport { parsePositiveInt, resolveTargetWithCurrentCfTarget, withSessions } from \"../target.js\";\nimport { roundDurationMs, warnOnCaptureMutationRisk, withPausedDuration } from \"../warnings.js\";\n\nconst VALID_PAUSE_TYPES: readonly PauseOnExceptionsState[] = [\"uncaught\", \"caught\", \"all\"];\n\ninterface PreparedExceptionCommand {\n readonly target: Target;\n readonly state: PauseOnExceptionsState;\n readonly captures: readonly string[];\n readonly remoteRoot: RemoteRootSetting;\n readonly timeoutMs: number;\n readonly maxValueLength: number;\n readonly stackDepth?: number;\n readonly stackCaptures: readonly string[];\n readonly throwOnSideEffect: boolean;\n}\n\nexport async function handleException(opts: ExceptionCommandOptions): Promise<void> {\n const target = await resolveTargetWithCurrentCfTarget(opts, { useTimeoutForTunnel: false });\n const prepared = prepareExceptionCommand(opts, target);\n warnOnCaptureMutationRisk(\n [...prepared.captures, ...prepared.stackCaptures],\n opts.allowMutation === true,\n );\n const result = await withTerminationSignal(async (signal) =>\n await runExceptionCommand(prepared, opts, signal));\n if (opts.json) {\n writeJson(result);\n } else {\n writeHumanSnapshot(result);\n }\n}\n\nfunction prepareExceptionCommand(opts: ExceptionCommandOptions, target: Target): PreparedExceptionCommand {\n const stateRaw = (opts.type ?? \"uncaught\").trim().toLowerCase();\n if (!VALID_PAUSE_TYPES.includes(stateRaw as PauseOnExceptionsState)) {\n throw new CfInspectorError(\n \"INVALID_PAUSE_TYPE\",\n `--type must be one of ${VALID_PAUSE_TYPES.join(\", \")} (received \"${stateRaw}\")`,\n );\n }\n const timeoutSec = parsePositiveInt(opts.timeout, \"--timeout\") ?? DEFAULT_EXCEPTION_TIMEOUT_SEC;\n const maxValueLength = parsePositiveInt(opts.maxValueLength, \"--max-value-length\")\n ?? DEFAULT_MAX_VALUE_LENGTH;\n const stackDepth = parsePositiveInt(opts.stackDepth, \"--stack-depth\");\n return {\n target,\n state: stateRaw as PauseOnExceptionsState,\n captures: parseCaptureList(opts.capture),\n remoteRoot: parseRemoteRoot(opts.remoteRoot),\n timeoutMs: timeoutSec * 1000,\n maxValueLength,\n ...(stackDepth === undefined ? {} : { stackDepth }),\n stackCaptures: parseCaptureList(opts.stackCaptures),\n throwOnSideEffect: opts.allowMutation !== true,\n };\n}\n\nasync function runExceptionCommand(\n command: PreparedExceptionCommand,\n opts: ExceptionCommandOptions,\n signal?: AbortSignal,\n): Promise<SnapshotResult> {\n return await withSessions(command.target, async (group): Promise<SnapshotResult> => {\n const fanout = new BreakpointFanout(group, async (session) => {\n await setPauseOnExceptions(session, command.state);\n return { handles: [] };\n }, [\"exception\", \"promiseRejection\"]);\n let winner: InspectorSession | undefined;\n let preserveWinner = false;\n try {\n await fanout.ready(opts.readyEvent === true\n ? {\n includeNewSessions: true,\n onReady: (outcomes) => {\n if (signal?.aborted === true) {\n return;\n }\n writeArmedEvent({\n command: \"exception\",\n sessions: outcomes.length,\n resolvedLocations: null,\n timeoutMs: command.timeoutMs,\n });\n },\n }\n : {});\n const hit = await fanout.waitForFirst(command.timeoutMs, {\n pauseReasons: [\"exception\", \"promiseRejection\"],\n unmatchedPausePolicy: \"wait-for-resume\",\n }, signal);\n winner = hit.session;\n const pause = hit.pause;\n const pausedStartedAt = pause.receivedAtMs ?? performance.now();\n const snapshot = await captureSnapshot(hit.session, pause, {\n captures: command.captures,\n includeScopes: opts.includeScopes === true,\n maxValueLength: command.maxValueLength,\n ...(command.stackDepth === undefined ? {} : { stackDepth: command.stackDepth }),\n stackCaptures: command.stackCaptures,\n throwOnSideEffect: command.throwOnSideEffect,\n });\n if (opts.keepPaused === true) {\n preserveWinner = true;\n return { ...withPausedDuration(snapshot, null), isolate: hit.session.isolate ?? { kind: \"main\" } };\n }\n const result = await resumeAfterException(hit.session, snapshot, pausedStartedAt);\n return { ...result, isolate: hit.session.isolate ?? { kind: \"main\" } };\n } finally {\n await Promise.allSettled(group.list().map(async (session) => {\n await disablePauseOnExceptionsBestEffort(session);\n }));\n await fanout.cleanup(2_000, preserveWinner ? winner : undefined);\n }\n }, undefined, signal);\n}\n\nasync function resumeAfterException(\n session: InspectorSession,\n snapshot: Awaited<ReturnType<typeof captureSnapshot>>,\n pausedStartedAt: number,\n): Promise<SnapshotResult> {\n try {\n await resume(session);\n return withPausedDuration(snapshot, roundDurationMs(performance.now() - pausedStartedAt));\n } catch {\n process.stderr.write(\n \"[cf-inspector] warning: Debugger.resume failed after exception capture; pausedDurationMs is unknown.\\n\",\n );\n return withPausedDuration(snapshot, null);\n }\n}\n\nasync function disablePauseOnExceptionsBestEffort(session: InspectorSession): Promise<void> {\n try {\n await setPauseOnExceptions(session, \"none\");\n } catch {\n // best-effort: tunnel may be gone\n }\n}\n\nexport const internalsForTesting = {\n prepareExceptionCommand,\n};\n","import { performance } from \"node:perf_hooks\";\n\nimport { CfInspectorError } from \"../types.js\";\nimport type { PauseEvent } from \"../types.js\";\n\nimport { pauseDetail, toPauseEvent } from \"./conversions.js\";\nimport type { CdpPauseParams, InspectorSession, WaitForPauseOptions } from \"./types.js\";\n\nfunction pauseMatches(\n pause: PauseEvent,\n breakpointIds: readonly string[] | undefined,\n pauseReasons: readonly string[] | undefined,\n): boolean {\n if (pauseReasons !== undefined && pauseReasons.length > 0) {\n return pauseReasons.includes(pause.reason);\n }\n if (breakpointIds === undefined || breakpointIds.length === 0) {\n return true;\n }\n return pause.hitBreakpoints.some((id) => breakpointIds.includes(id));\n}\n\nfunction remainingUntil(deadlineMs: number): number {\n return Math.max(0, deadlineMs - performance.now());\n}\n\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted === true) {\n throw new CfInspectorError(\"ABORTED\", \"Aborted while waiting for Debugger.paused\");\n }\n}\n\nfunction hasResumedSincePause(session: InspectorSession, pause: PauseEvent): boolean {\n const pauseAt = pause.receivedAtMs;\n const resumedAt = session.debuggerState.lastResumedAtMs;\n return pauseAt !== undefined && resumedAt !== undefined && resumedAt >= pauseAt;\n}\n\nfunction throwBreakpointTimeout(timeoutMs: number): never {\n throw new CfInspectorError(\n \"BREAKPOINT_NOT_HIT\",\n `Timed out waiting for matching Debugger.paused after ${timeoutMs.toString()}ms`,\n );\n}\n\nfunction throwUnrelatedPauseTimeout(pause: PauseEvent, timeoutMs: number): never {\n throw new CfInspectorError(\n \"UNRELATED_PAUSE_TIMEOUT\",\n `Target stayed paused by another debugger event before this command's breakpoint could hit within ${timeoutMs.toString()}ms`,\n pauseDetail(pause),\n );\n}\n\nasync function waitForUnmatchedPauseToResume(\n session: InspectorSession,\n pause: PauseEvent,\n deadlineMs: number,\n options: WaitForPauseOptions,\n): Promise<void> {\n if (hasResumedSincePause(session, pause)) {\n return;\n }\n const remainingMs = remainingUntil(deadlineMs);\n if (remainingMs <= 0) {\n throwUnrelatedPauseTimeout(pause, options.timeoutMs);\n }\n try {\n await session.client.waitFor(\"Debugger.resumed\", {\n timeoutMs: remainingMs,\n ...(options.signal === undefined ? {} : { signal: options.signal }),\n });\n session.debuggerState.lastResumedAtMs = performance.now();\n } catch (err: unknown) {\n if (err instanceof CfInspectorError && err.code === \"BREAKPOINT_NOT_HIT\") {\n throwUnrelatedPauseTimeout(pause, options.timeoutMs);\n }\n throw err;\n }\n}\n\nasync function handleUnmatchedPause(\n session: InspectorSession,\n pause: PauseEvent,\n options: WaitForPauseOptions,\n deadlineMs: number,\n): Promise<void> {\n if (options.unmatchedPausePolicy === \"fail\") {\n throw new CfInspectorError(\n \"UNRELATED_PAUSE\",\n \"Target paused before this command's breakpoint was reached\",\n pauseDetail(pause),\n );\n }\n if (hasResumedSincePause(session, pause)) {\n return;\n }\n options.onUnmatchedPause?.(pause);\n await waitForUnmatchedPauseToResume(session, pause, deadlineMs, options);\n}\n\nexport async function waitForPause(\n session: InspectorSession,\n options: WaitForPauseOptions,\n): Promise<PauseEvent> {\n throwIfAborted(options.signal);\n const deadlineMs = performance.now() + options.timeoutMs;\n const buffer = session.pauseBuffer;\n while (buffer.length > 0 || remainingUntil(deadlineMs) > 0) {\n throwIfAborted(options.signal);\n while (buffer.length > 0) {\n throwIfAborted(options.signal);\n const buffered = buffer.shift();\n if (buffered === undefined) {\n continue;\n }\n if (pauseMatches(buffered, options.breakpointIds, options.pauseReasons)) {\n return buffered;\n }\n await handleUnmatchedPause(session, buffered, options, deadlineMs);\n }\n const pause = await waitForLivePause(session, options, deadlineMs);\n if (pauseMatches(pause, options.breakpointIds, options.pauseReasons)) {\n return pause;\n }\n await handleUnmatchedPause(session, pause, options, deadlineMs);\n }\n throwBreakpointTimeout(options.timeoutMs);\n}\n\nasync function waitForLivePause(\n session: InspectorSession,\n options: WaitForPauseOptions,\n deadlineMs: number,\n): Promise<PauseEvent> {\n const remainingMs = remainingUntil(deadlineMs);\n if (remainingMs <= 0) {\n throwBreakpointTimeout(options.timeoutMs);\n }\n session.pauseWaitGate.active = true;\n let receivedAtMs: number | undefined;\n let params: CdpPauseParams;\n try {\n params = await session.client.waitFor<CdpPauseParams>(\"Debugger.paused\", {\n timeoutMs: remainingMs,\n ...(options.signal === undefined ? {} : { signal: options.signal }),\n predicate: (): boolean => {\n receivedAtMs = performance.now();\n return true;\n },\n });\n } finally {\n session.pauseWaitGate.active = false;\n }\n return toPauseEvent(params, receivedAtMs ?? performance.now(), session.scripts);\n}\n","import { performance } from \"node:perf_hooks\";\n\nimport type { BreakpointHandle, PauseEvent } from \"../types.js\";\nimport { CfInspectorError } from \"../types.js\";\n\nimport { removeBreakpoint } from \"./breakpoints.js\";\nimport { waitForPause } from \"./pause.js\";\nimport { resume } from \"./runtime.js\";\nimport type { InspectorSession, InspectorSessionGroup, WaitForPauseOptions } from \"./types.js\";\n\nconst DEFAULT_CLEANUP_TIMEOUT_MS = 2_000;\n\nexport interface SessionBreakpointSetup {\n readonly handles: readonly BreakpointHandle[];\n}\n\nexport interface SessionBreakpointOutcome {\n readonly session: InspectorSession;\n readonly setup: SessionBreakpointSetup;\n}\n\nexport interface FanoutReadyOptions {\n readonly includeNewSessions?: boolean;\n readonly onReady?: (outcomes: readonly SessionBreakpointOutcome[]) => void;\n}\n\ninterface SessionRecord {\n readonly session: InspectorSession;\n readonly handles: BreakpointHandle[];\n setup: Promise<void>;\n}\n\nexport interface IsolatePause {\n readonly session: InspectorSession;\n readonly pause: PauseEvent;\n}\n\nexport interface FanoutCleanupSummary {\n readonly attempted: number;\n readonly cleared: number;\n readonly resumed: number;\n}\n\nexport class BreakpointFanout {\n private readonly records = new Map<InspectorSession, SessionRecord>();\n private readonly setupErrors: ((error: unknown) => void)[] = [];\n private readonly detach: () => void;\n private readonly detachRemoved: () => void;\n private readonly detachError: () => void;\n private activeRace: ActivePauseRace | undefined;\n private pauseReasons: readonly string[] = [];\n private pendingSetupError: Error | undefined;\n private preserveReadinessErrors = false;\n\n public constructor(\n group: InspectorSessionGroup,\n setupSession: (\n session: InspectorSession,\n trackHandle: (handle: BreakpointHandle) => void,\n ) => Promise<SessionBreakpointSetup>,\n pauseReasons: readonly string[] = [],\n ) {\n this.pauseReasons = pauseReasons;\n this.detach = group.onSession((session) => {\n const record: SessionRecord = { session, handles: [], setup: Promise.resolve() };\n this.records.set(session, record);\n record.setup = setupSession(session, (handle) => {\n this.trackHandle(session, handle);\n }).then((result) => {\n for (const handle of result.handles) {\n this.trackHandle(session, handle);\n }\n });\n const setup = record.setup;\n setup.catch((error: unknown) => {\n for (const reject of this.setupErrors) {\n reject(error);\n }\n });\n this.activeRace?.add(record);\n });\n this.detachRemoved = group.onSessionRemoved((session) => {\n this.records.delete(session);\n this.activeRace?.remove(session);\n });\n this.detachError = group.onError((error) => {\n if (this.setupErrors.length === 0 && this.pendingSetupError === undefined) {\n this.pendingSetupError = error;\n }\n for (const reject of this.setupErrors) {\n reject(error);\n }\n });\n }\n\n public async ready(options: FanoutReadyOptions = {}): Promise<void> {\n if (options.includeNewSessions !== true) {\n const records = [...this.records.values()];\n await Promise.all(records.map((record) => record.setup));\n options.onReady?.(this.outcomesFor(records));\n return;\n }\n this.preserveReadinessErrors = true;\n const pendingError = this.takePendingSetupError();\n if (pendingError !== undefined) {\n throw pendingError;\n }\n let rejectGroupError: (error: unknown) => void = (): void => undefined;\n const groupError = new Promise<never>((_resolve, reject) => {\n rejectGroupError = reject;\n });\n this.setupErrors.push(rejectGroupError);\n try {\n let stableRecords: readonly SessionRecord[] | undefined;\n while (stableRecords === undefined) {\n const records = [...this.records.values()];\n await Promise.race([\n Promise.all(records.map((record) => record.setup)),\n groupError,\n ]);\n const stable = records.length === this.records.size &&\n records.every((record) => this.records.get(record.session) === record);\n if (stable) {\n stableRecords = records;\n }\n }\n // Run the callback before this promise resolves. A session-registration\n // callback cannot interleave between this stable check and the emitted\n // readiness event on JavaScript's single thread.\n options.onReady?.(this.outcomesFor(stableRecords));\n } finally {\n const index = this.setupErrors.indexOf(rejectGroupError);\n if (index >= 0) {\n this.setupErrors.splice(index, 1);\n }\n }\n }\n\n public trackHandle(session: InspectorSession, handle: BreakpointHandle): void {\n const record = this.records.get(session);\n if (record !== undefined && !record.handles.some((candidate) => candidate.breakpointId === handle.breakpointId)) {\n record.handles.push(handle);\n }\n }\n\n public availableOutcomes(): readonly SessionBreakpointOutcome[] {\n return this.outcomesFor([...this.records.values()]);\n }\n\n private outcomesFor(records: readonly SessionRecord[]): readonly SessionBreakpointOutcome[] {\n return records.map((record) => ({\n session: record.session,\n setup: { handles: record.handles },\n }));\n }\n\n private takePendingSetupError(): Error | undefined {\n const error = this.pendingSetupError;\n this.pendingSetupError = undefined;\n return error;\n }\n\n public async waitForFirst(\n timeoutMs: number,\n options: Omit<WaitForPauseOptions, \"timeoutMs\" | \"breakpointIds\" | \"signal\"> = {},\n signal?: AbortSignal,\n ): Promise<IsolatePause> {\n if (this.activeRace !== undefined) {\n throw new CfInspectorError(\"INVALID_ARGUMENT\", \"A fan-out pause race is already active\");\n }\n const race = new ActivePauseRace(timeoutMs, options, signal);\n this.pauseReasons = options.pauseReasons ?? [];\n this.activeRace = race;\n this.setupErrors.push(race.reject);\n if (this.preserveReadinessErrors) {\n const pendingError = this.takePendingSetupError();\n if (pendingError !== undefined) {\n race.reject(pendingError);\n }\n }\n for (const record of this.records.values()) {\n race.add(record);\n }\n try {\n const winner = await race.result;\n await race.stopAndSettle();\n await this.resumePausedLosers(winner.session);\n return winner;\n } finally {\n this.activeRace = undefined;\n const index = this.setupErrors.indexOf(race.reject);\n if (index >= 0) {\n this.setupErrors.splice(index, 1);\n }\n await race.stopAndSettle();\n }\n }\n\n public async resumePaused(except?: InspectorSession): Promise<number> {\n return await this.resumePausedLosers(except, DEFAULT_CLEANUP_TIMEOUT_MS);\n }\n\n public async cleanup(\n timeoutMs = DEFAULT_CLEANUP_TIMEOUT_MS,\n preservePaused?: InspectorSession,\n ): Promise<FanoutCleanupSummary> {\n this.detach();\n this.detachRemoved();\n this.detachError();\n const deadline = performance.now() + timeoutMs;\n await settleWithin(Promise.allSettled([...this.records.values()].map(async (record) => {\n await record.setup;\n })), remaining(deadline));\n const breakpointEntries = [...this.records.values()].flatMap((record) =>\n record.handles.map((handle) => ({\n session: record.session,\n breakpointId: handle.breakpointId,\n })));\n let cleared = 0;\n const clearWork = Promise.allSettled(breakpointEntries.map(async (entry) => {\n await removeBreakpoint(entry.session, entry.breakpointId);\n cleared += 1;\n }));\n await settleWithin(clearWork, remaining(deadline));\n const resumed = await this.resumePausedLosers(preservePaused, remaining(deadline));\n return { attempted: breakpointEntries.length, cleared, resumed };\n }\n\n private async resumePausedLosers(\n except?: InspectorSession,\n timeoutMs = DEFAULT_CLEANUP_TIMEOUT_MS,\n ): Promise<number> {\n let resumed = 0;\n await settleWithin(Promise.allSettled([...this.records.keys()].map(async (session) => {\n if (\n session === except ||\n session.debuggerState.paused !== true ||\n session.client.isClosed ||\n !this.ownsCurrentPause(session)\n ) {\n return;\n }\n await resume(session);\n session.debuggerState.paused = false;\n resumed += 1;\n })), timeoutMs);\n return resumed;\n }\n\n private ownsCurrentPause(session: InspectorSession): boolean {\n const pause = session.debuggerState.currentPause;\n if (pause === undefined) {\n return false;\n }\n if (this.pauseReasons.includes(pause.reason)) {\n return true;\n }\n const record = this.records.get(session);\n const breakpointIds = new Set(record?.handles.map((handle) => handle.breakpointId) ?? []);\n return pause.hitBreakpoints.some((breakpointId) => breakpointIds.has(breakpointId));\n }\n}\n\nclass ActivePauseRace {\n private readonly controller = new AbortController();\n private readonly waits = new Set<Promise<void>>();\n private settled = false;\n private readonly deadline: number;\n private readonly timeout: ReturnType<typeof setTimeout>;\n private readonly externalSignal: AbortSignal | undefined;\n private readonly onExternalAbort = (): void => {\n this.reject(new CfInspectorError(\"ABORTED\", \"Aborted while waiting for an isolate pause\"));\n this.controller.abort();\n };\n private readonly resolveResult: (winner: IsolatePause) => void;\n private terminalTimeoutError: CfInspectorError | undefined;\n private readonly removedSessions = new Set<InspectorSession>();\n public readonly reject: (error: unknown) => void;\n public readonly result: Promise<IsolatePause>;\n\n public constructor(\n timeoutMs: number,\n private readonly options: Omit<WaitForPauseOptions, \"timeoutMs\" | \"breakpointIds\" | \"signal\">,\n signal?: AbortSignal,\n ) {\n this.externalSignal = signal;\n this.deadline = performance.now() + timeoutMs;\n let resolveResult: ((winner: IsolatePause) => void) | undefined;\n let rejectResult: ((error: unknown) => void) | undefined;\n this.result = new Promise<IsolatePause>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n this.resolveResult = (winner): void => {\n if (this.settled) {\n return;\n }\n this.settled = true;\n resolveResult?.(winner);\n };\n this.reject = (error): void => {\n if (this.settled) {\n return;\n }\n this.settled = true;\n rejectResult?.(error);\n };\n this.timeout = setTimeout(() => {\n this.reject(this.terminalTimeoutError ?? new CfInspectorError(\n \"BREAKPOINT_NOT_HIT\",\n `Timed out waiting for a matching pause in any isolate after ${timeoutMs.toString()}ms`,\n ));\n this.controller.abort();\n }, timeoutMs + 25);\n if (signal !== undefined) {\n if (signal.aborted) {\n this.reject(new CfInspectorError(\"ABORTED\", \"Aborted while waiting for an isolate pause\"));\n } else {\n signal.addEventListener(\"abort\", this.onExternalAbort, { once: true });\n }\n }\n }\n\n public add(record: SessionRecord): void {\n if (this.settled) {\n return;\n }\n const wait = this.wait(record).finally(() => {\n this.waits.delete(wait);\n });\n this.waits.add(wait);\n }\n\n public remove(session: InspectorSession): void {\n this.removedSessions.add(session);\n }\n\n public async stopAndSettle(): Promise<void> {\n clearTimeout(this.timeout);\n this.externalSignal?.removeEventListener(\"abort\", this.onExternalAbort);\n this.controller.abort();\n await Promise.allSettled([...this.waits]);\n }\n\n private async wait(record: SessionRecord): Promise<void> {\n try {\n await record.setup;\n const remainingMs = Math.max(1, this.deadline - performance.now());\n const pause = await waitForPause(record.session, {\n ...this.options,\n timeoutMs: remainingMs,\n breakpointIds: record.handles.map((handle) => handle.breakpointId),\n signal: this.controller.signal,\n });\n record.session.debuggerState.paused = true;\n this.resolveResult({ session: record.session, pause });\n this.controller.abort();\n } catch (error: unknown) {\n if (this.removedSessions.has(record.session)) {\n return;\n }\n if (error instanceof CfInspectorError && error.code === \"UNRELATED_PAUSE_TIMEOUT\") {\n this.terminalTimeoutError = error;\n return;\n }\n if (isExpectedRaceStop(error)) {\n return;\n }\n this.reject(error);\n this.controller.abort();\n }\n }\n}\n\nfunction isExpectedRaceStop(error: unknown): boolean {\n return error instanceof CfInspectorError && (\n error.code === \"ABORTED\" ||\n error.code === \"BREAKPOINT_NOT_HIT\" ||\n error.code === \"UNRELATED_PAUSE_TIMEOUT\"\n );\n}\n\nfunction remaining(deadline: number): number {\n return Math.max(0, deadline - performance.now());\n}\n\nasync function settleWithin<T>(work: Promise<T>, timeoutMs: number): Promise<T | null> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race<T | null>([\n work,\n new Promise<null>((resolve) => {\n timer = setTimeout(() => {\n resolve(null);\n }, timeoutMs);\n }),\n ]);\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n}\n","import type { CdpEvalResult } from \"../inspector/types.js\";\nimport { CfInspectorError } from \"../types.js\";\nimport type { CapturedExpression } from \"../types.js\";\n\nimport {\n DEFAULT_MAX_VALUE_LENGTH,\n formatPrimitive,\n isPrimitive,\n limitValueLength,\n textTruncationFields,\n} from \"./values.js\";\nimport type { LimitedValue } from \"./values.js\";\n\nexport function evalResultToCaptured(\n expression: string,\n result: CdpEvalResult,\n maxValueLength = DEFAULT_MAX_VALUE_LENGTH,\n): CapturedExpression {\n if (result.exceptionDetails !== undefined) {\n const limited = readEvalError(result, maxValueLength);\n return {\n expression,\n error: limited.text,\n ...textTruncationFields(limited),\n };\n }\n const inner = result.result;\n if (!inner) {\n return { expression, error: \"no result returned\" };\n }\n const type = typeof inner.type === \"string\" ? inner.type : undefined;\n const buildCaptured = (rendered: string): CapturedExpression => {\n const limited = limitValueLength(rendered, maxValueLength);\n const base: CapturedExpression = {\n expression,\n value: limited.text,\n ...textTruncationFields(limited),\n };\n return type === undefined ? base : { ...base, type };\n };\n\n if (type === \"string\" && typeof inner.value === \"string\") {\n return buildCaptured(JSON.stringify(inner.value));\n }\n if ((type === \"number\" || type === \"boolean\" || type === \"bigint\") && isPrimitive(inner.value)) {\n return buildCaptured(formatPrimitive(inner.value));\n }\n if (typeof inner.description === \"string\") {\n return buildCaptured(inner.description);\n }\n if (isPrimitive(inner.value)) {\n return buildCaptured(formatPrimitive(inner.value));\n }\n return buildCaptured(\"undefined\");\n}\n\nexport function sideEffectRefusalToCaptured(expression: string): CapturedExpression {\n const error = new CfInspectorError(\n \"MUTATION_NOT_ALLOWED\",\n `V8 blocked the capture expression \"${expression}\" because it may have side effects. Pass --allow-mutation to run it explicitly.`,\n );\n return {\n expression,\n error: `${error.code}: ${error.message}`,\n mutationRisk: true,\n blocked: true,\n };\n}\n\nfunction readEvalError(result: CdpEvalResult, maxValueLength: number): LimitedValue {\n const text =\n typeof result.exceptionDetails?.exception?.description === \"string\"\n ? result.exceptionDetails.exception.description\n : (typeof result.exceptionDetails?.text === \"string\" ? result.exceptionDetails.text : \"evaluation failed\");\n return limitValueLength(text, maxValueLength);\n}\n","import { CfInspectorError } from \"../types.js\";\nimport type { VariableSnapshot } from \"../types.js\";\n\nexport const DEFAULT_MAX_VALUE_LENGTH = 131_072;\nexport const DEFAULT_STREAM_MAX_VALUE_LENGTH = 4_096;\n\nexport interface TruncatedValue {\n readonly text: string;\n readonly truncated: true;\n readonly originalLength: number;\n}\n\nexport interface CompleteValue {\n readonly text: string;\n readonly truncated: false;\n}\n\nexport type LimitedValue = TruncatedValue | CompleteValue;\n\nexport interface TextTruncationFields {\n readonly truncated?: true;\n readonly originalLength?: number;\n}\n\nexport function isPrimitive(value: unknown): value is string | number | boolean | bigint | symbol {\n const t = typeof value;\n return t === \"string\" || t === \"number\" || t === \"boolean\" || t === \"bigint\" || t === \"symbol\";\n}\n\nexport function formatPrimitive(value: string | number | boolean | bigint | symbol): string {\n if (typeof value === \"symbol\") {\n return value.toString();\n }\n if (typeof value === \"bigint\") {\n return `${value.toString()}n`;\n }\n return String(value);\n}\n\nexport function resolveMaxValueLength(value: number | undefined): number {\n if (value === undefined) {\n return DEFAULT_MAX_VALUE_LENGTH;\n }\n if (!Number.isInteger(value) || value <= 0) {\n throw new CfInspectorError(\n \"INVALID_ARGUMENT\",\n `Invalid maxValueLength: ${value.toString()} — expected a positive integer`,\n );\n }\n return value;\n}\n\nexport function limitValueLength(\n raw: string,\n maxValueLength = DEFAULT_MAX_VALUE_LENGTH,\n): LimitedValue {\n if (raw.length <= maxValueLength) {\n return { text: raw, truncated: false };\n }\n return {\n text: raw.slice(0, maxValueLength),\n truncated: true,\n originalLength: raw.length,\n };\n}\n\nexport function textTruncationFields(limited: LimitedValue): TextTruncationFields {\n return limited.truncated\n ? { truncated: true, originalLength: limited.originalLength }\n : {};\n}\n\nfunction parseQuotedString(value: string): string {\n try {\n const parsed: unknown = JSON.parse(value);\n return typeof parsed === \"string\" ? parsed : value;\n } catch {\n return value;\n }\n}\n\nfunction parseNumericIndex(name: string): number | undefined {\n const parsed = Number.parseInt(name, 10);\n if (!Number.isInteger(parsed) || parsed < 0 || parsed.toString() !== name) {\n return undefined;\n }\n return parsed;\n}\n\nfunction scalarFromVariable(variable: VariableSnapshot): unknown {\n const value = variable.value;\n if (variable.type === \"string\") {\n return parseQuotedString(value);\n }\n if (variable.type === \"number\") {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : value;\n }\n if (variable.type === \"boolean\") {\n if (value === \"true\") {\n return true;\n }\n if (value === \"false\") {\n return false;\n }\n }\n if (variable.type === \"undefined\") {\n return \"[undefined]\";\n }\n if (variable.type === \"bigint\") {\n return value;\n }\n return value === \"null\" ? null : value;\n}\n\nfunction isArrayLikeChildren(children: readonly VariableSnapshot[]): boolean {\n let hasNumeric = false;\n for (const child of children) {\n // V8 includes `length` as an own property on arrays; ignore it when\n // deciding whether the children look array-shaped.\n if (child.name === \"length\") {\n continue;\n }\n if (parseNumericIndex(child.name) === undefined) {\n return false;\n }\n hasNumeric = true;\n }\n return hasNumeric;\n}\n\nexport function toStructuredValue(variable: VariableSnapshot): unknown {\n const children = variable.children;\n if (children === undefined || children.length === 0) {\n return scalarFromVariable(variable);\n }\n if (isArrayLikeChildren(children)) {\n const indexed = children.flatMap((child): readonly [number, unknown][] => {\n const index = parseNumericIndex(child.name);\n if (index === undefined) {\n // length entry; not part of the array body\n return [];\n }\n return [[index, toStructuredValue(child)]];\n });\n const maxIndex = Math.max(...indexed.map(([index]) => index));\n const out = Array.from({ length: maxIndex + 1 }, () => null as unknown);\n for (const [index, entry] of indexed) {\n out[index] = entry;\n }\n return out;\n }\n // Mixed numeric + string keys, or pure string keys: keep all children as\n // an object so non-indexed properties are not silently dropped.\n const out: Record<string, unknown> = {};\n for (const child of children) {\n out[child.name] = toStructuredValue(child);\n }\n return out;\n}\n","import { getProperties } from \"../inspector/runtime.js\";\nimport type { CdpProperty, InspectorSession } from \"../inspector/types.js\";\nimport type { VariableSnapshot } from \"../types.js\";\n\nimport {\n formatPrimitive,\n isPrimitive,\n limitValueLength,\n textTruncationFields,\n} from \"./values.js\";\n\nexport const MAX_SCOPE_VARIABLES = 20;\nexport const MAX_CHILD_VARIABLES = 8;\nexport const MAX_VARIABLE_DEPTH = 2;\n\ninterface DescribedProperty {\n value: string;\n type?: string;\n objectId?: string;\n}\n\nexport interface CapturedProperties {\n readonly variables: readonly VariableSnapshot[];\n readonly omittedCount?: number;\n}\n\nfunction buildDescribed(value: string, type: string | undefined, objectId?: string): DescribedProperty {\n const base: DescribedProperty = { value };\n if (type !== undefined) {\n base.type = type;\n }\n if (objectId !== undefined) {\n base.objectId = objectId;\n }\n return base;\n}\n\nexport function describeProperty(prop: CdpProperty): DescribedProperty {\n const value = prop.value;\n if (value === undefined) {\n return { value: \"undefined\" };\n }\n const type = typeof value.type === \"string\" ? value.type : undefined;\n const objectId = typeof value.objectId === \"string\" ? value.objectId : undefined;\n if (type === \"undefined\") {\n return buildDescribed(\"undefined\", type);\n }\n if (type === \"string\" && typeof value.value === \"string\") {\n return buildDescribed(JSON.stringify(value.value), type);\n }\n if (\n (type === \"number\" || type === \"boolean\" || type === \"bigint\" || type === \"symbol\") &&\n isPrimitive(value.value)\n ) {\n return buildDescribed(formatPrimitive(value.value), type);\n }\n if (typeof value.description === \"string\") {\n return buildDescribed(value.description, type, objectId);\n }\n if (isPrimitive(value.value)) {\n return buildDescribed(formatPrimitive(value.value), type);\n }\n if (objectId === undefined) {\n return buildDescribed(\"undefined\", type);\n }\n return buildDescribed(\"[object]\", type, objectId);\n}\n\nfunction isExpandable(type: string | undefined): boolean {\n return type === \"object\" || type === \"function\";\n}\n\nexport async function captureProperties(\n session: InspectorSession,\n objectId: string,\n limit: number,\n depth: number,\n maxValueLength: number,\n): Promise<CapturedProperties> {\n const properties = await getProperties(session, objectId);\n const limited = properties.slice(0, limit);\n const variables = await Promise.all(\n limited.map(async (prop): Promise<VariableSnapshot> => {\n return await captureProperty(session, prop, depth, maxValueLength);\n }),\n );\n const omittedCount = Math.max(properties.length - limited.length, 0);\n return omittedCount === 0 ? { variables } : { variables, omittedCount };\n}\n\nasync function captureProperty(\n session: InspectorSession,\n prop: CdpProperty,\n depth: number,\n maxValueLength: number,\n): Promise<VariableSnapshot> {\n const name = typeof prop.name === \"string\" ? prop.name : \"?\";\n const described = describeProperty(prop);\n const capturedChildren = await capturePropertyChildren(\n session,\n described,\n depth,\n maxValueLength,\n );\n const limited = limitValueLength(described.value, maxValueLength);\n const base: VariableSnapshot = {\n name,\n value: limited.text,\n ...textTruncationFields(limited),\n };\n const withType = described.type === undefined ? base : { ...base, type: described.type };\n const children = capturedChildren?.variables;\n const withChildren = children === undefined || children.length === 0\n ? withType\n : { ...withType, children };\n const omittedCount = capturedChildren?.omittedCount ?? 0;\n return omittedCount === 0\n ? withChildren\n : { ...withChildren, truncated: true, omittedCount };\n}\n\nasync function capturePropertyChildren(\n session: InspectorSession,\n described: DescribedProperty,\n depth: number,\n maxValueLength: number,\n): Promise<CapturedProperties | undefined> {\n if (described.objectId === undefined || !isExpandable(described.type)) {\n return undefined;\n }\n if (depth <= 0) {\n return await countDepthOmissions(session, described.objectId);\n }\n try {\n return await captureProperties(\n session,\n described.objectId,\n MAX_CHILD_VARIABLES,\n depth - 1,\n maxValueLength,\n );\n } catch {\n return undefined;\n }\n}\n\nasync function countDepthOmissions(\n session: InspectorSession,\n objectId: string,\n): Promise<CapturedProperties | undefined> {\n try {\n const properties = await getProperties(session, objectId);\n return properties.length === 0\n ? undefined\n : { variables: [], omittedCount: properties.length };\n } catch {\n return undefined;\n }\n}\n\nexport function countPropertyOmissions(captured: CapturedProperties): number {\n return (captured.omittedCount ?? 0) + captured.variables.reduce((total, variable) => {\n const childOmissions = variable.children === undefined\n ? 0\n : countPropertyOmissions({ variables: variable.children });\n return total + (variable.omittedCount ?? 0) + childOmissions;\n }, 0);\n}\n","import { getProperties } from \"../inspector/runtime.js\";\nimport type { InspectorSession } from \"../inspector/types.js\";\nimport type { ExceptionSnapshot, PauseEvent } from \"../types.js\";\n\nimport {\n captureProperties,\n countPropertyOmissions,\n MAX_SCOPE_VARIABLES,\n MAX_VARIABLE_DEPTH,\n} from \"./properties.js\";\nimport { limitValueLength, toStructuredValue } from \"./values.js\";\nimport type { LimitedValue } from \"./values.js\";\n\ninterface CdpExceptionData {\n readonly type?: unknown;\n readonly description?: unknown;\n readonly value?: unknown;\n readonly objectId?: unknown;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\ninterface MaterializedObject {\n readonly value: string;\n readonly omittedCount: number;\n}\n\nasync function materializeObject(\n session: InspectorSession,\n objectId: string,\n): Promise<MaterializedObject | undefined> {\n try {\n const captured = await captureProperties(\n session,\n objectId,\n MAX_SCOPE_VARIABLES,\n MAX_VARIABLE_DEPTH,\n Number.MAX_SAFE_INTEGER,\n );\n if (captured.variables.length === 0) {\n return undefined;\n }\n const structured: Record<string, unknown> = {};\n for (const variable of captured.variables) {\n structured[variable.name] = toStructuredValue(variable);\n }\n return {\n value: JSON.stringify(structured),\n omittedCount: countPropertyOmissions(captured),\n };\n } catch {\n return undefined;\n }\n}\n\nasync function readPropertyDescription(\n session: InspectorSession,\n objectId: string,\n name: string,\n): Promise<string | undefined> {\n try {\n const properties = await getProperties(session, objectId);\n for (const prop of properties) {\n if (prop.name !== name) {\n continue;\n }\n const value = prop.value;\n if (value === undefined) {\n continue;\n }\n if (typeof value.value === \"string\") {\n return value.value;\n }\n if (typeof value.description === \"string\") {\n return value.description;\n }\n }\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nexport async function captureException(\n session: InspectorSession,\n pause: PauseEvent,\n maxValueLength: number,\n): Promise<ExceptionSnapshot | undefined> {\n if (pause.reason !== \"exception\" && pause.reason !== \"promiseRejection\") {\n return undefined;\n }\n const data = pause.data;\n if (typeof data !== \"object\" || data === null) {\n return { error: \"no exception data attached\" };\n }\n const candidate = data as CdpExceptionData;\n const type = asString(candidate.type);\n const description = asString(candidate.description);\n if (typeof candidate.value === \"string\") {\n return buildResult(type, description, JSON.stringify(candidate.value), maxValueLength);\n }\n if (typeof candidate.value === \"number\" || typeof candidate.value === \"boolean\") {\n return buildResult(type, description, String(candidate.value), maxValueLength);\n }\n const objectId = asString(candidate.objectId);\n if (objectId === undefined) {\n if (description !== undefined) {\n return buildResult(type, description, description, maxValueLength);\n }\n return { error: \"exception data has no objectId or value\" };\n }\n const message = await readPropertyDescription(session, objectId, \"message\");\n const rendered = await materializeObject(session, objectId);\n if (rendered !== undefined) {\n return buildResult(\n type,\n message ?? description,\n rendered.value,\n maxValueLength,\n rendered.omittedCount,\n );\n }\n return buildResult(type, description, description ?? \"[exception]\", maxValueLength);\n}\n\nfunction buildResult(\n type: string | undefined,\n description: string | undefined,\n value: string,\n maxValueLength: number,\n omittedCount = 0,\n): ExceptionSnapshot {\n const limitedValue = limitValueLength(value, maxValueLength);\n const limitedDescription = description === undefined\n ? undefined\n : limitValueLength(description, maxValueLength);\n const base: ExceptionSnapshot = {\n value: limitedValue.text,\n ...exceptionTruncationFields(limitedValue, limitedDescription),\n };\n const withType = type === undefined ? base : { ...base, type };\n const withDescription = limitedDescription === undefined\n ? withType\n : { ...withType, description: limitedDescription.text };\n return omittedCount === 0\n ? withDescription\n : { ...withDescription, truncated: true, omittedCount };\n}\n\nfunction exceptionTruncationFields(\n value: LimitedValue,\n description: LimitedValue | undefined,\n): Pick<\n ExceptionSnapshot,\n \"truncated\" | \"originalLength\" | \"valueOriginalLength\" | \"descriptionOriginalLength\"\n> {\n const valueLength = value.truncated ? value.originalLength : undefined;\n const descriptionLength = description?.truncated === true\n ? description.originalLength\n : undefined;\n const lengths = [valueLength, descriptionLength].filter(\n (length): length is number => length !== undefined,\n );\n if (lengths.length === 0) {\n return {};\n }\n return {\n truncated: true,\n originalLength: Math.max(...lengths),\n ...(valueLength === undefined ? {} : { valueOriginalLength: valueLength }),\n ...(descriptionLength === undefined\n ? {}\n : { descriptionOriginalLength: descriptionLength }),\n };\n}\n","import type { CdpEvalResult, InspectorSession } from \"../inspector/types.js\";\nimport type { CapturedExpression } from \"../types.js\";\n\nimport {\n captureProperties,\n countPropertyOmissions,\n MAX_SCOPE_VARIABLES,\n MAX_VARIABLE_DEPTH,\n} from \"./properties.js\";\nimport {\n limitValueLength,\n textTruncationFields,\n toStructuredValue,\n} from \"./values.js\";\n\nfunction objectIdFromEvalResult(result: CdpEvalResult): string | undefined {\n const inner = result.result;\n if (inner?.type !== \"object\") {\n return undefined;\n }\n const objectId = inner.objectId;\n if (typeof objectId !== \"string\" || objectId.length === 0) {\n return undefined;\n }\n return objectId;\n}\n\ninterface RenderedObjectCapture {\n readonly value: string;\n readonly omittedCount: number;\n}\n\nasync function renderObjectCapture(\n session: InspectorSession,\n objectId: string,\n): Promise<RenderedObjectCapture | undefined> {\n try {\n const captured = await captureProperties(\n session,\n objectId,\n MAX_SCOPE_VARIABLES,\n MAX_VARIABLE_DEPTH,\n Number.MAX_SAFE_INTEGER,\n );\n const structured: Record<string, unknown> = {};\n for (const variable of captured.variables) {\n structured[variable.name] = toStructuredValue(variable);\n }\n return {\n value: JSON.stringify(structured),\n omittedCount: countPropertyOmissions(captured),\n };\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeRenderedObjectCapture(rendered: string, original: string): string | undefined {\n if (rendered === \"{}\" && original !== \"Object\") {\n return undefined;\n }\n if (original.startsWith(\"Array(\") && rendered === \"{\\\"length\\\":0}\") {\n return \"[]\";\n }\n return rendered;\n}\n\nexport async function withSerializedObjectCapture(\n session: InspectorSession,\n expression: string,\n evalResult: CdpEvalResult,\n captured: CapturedExpression,\n maxValueLength: number,\n): Promise<CapturedExpression> {\n if (captured.error !== undefined || captured.value === undefined) {\n return captured;\n }\n const objectId = objectIdFromEvalResult(evalResult);\n if (objectId === undefined) {\n return captured;\n }\n const rendered = await renderObjectCapture(session, objectId);\n if (rendered === undefined) {\n return captured;\n }\n const normalized = normalizeRenderedObjectCapture(rendered.value, captured.value);\n if (normalized === undefined) {\n return captured;\n }\n const limited = limitValueLength(normalized, maxValueLength);\n const base: CapturedExpression = {\n expression,\n value: limited.text,\n ...textTruncationFields(limited),\n ...(captured.type === undefined ? {} : { type: captured.type }),\n };\n return rendered.omittedCount === 0\n ? base\n : { ...base, truncated: true, omittedCount: rendered.omittedCount };\n}\n","import type { InspectorSession } from \"../inspector/types.js\";\nimport type { CallFrameInfo, ScopeSnapshot } from \"../types.js\";\n\nimport {\n captureProperties,\n MAX_SCOPE_VARIABLES,\n MAX_VARIABLE_DEPTH,\n} from \"./properties.js\";\n\nconst MAX_SCOPES = 3;\n\nconst PRIORITY_BY_TYPE: Readonly<Record<string, number>> = {\n local: 0,\n arguments: 1,\n block: 2,\n closure: 3,\n catch: 4,\n with: 5,\n module: 6,\n script: 7,\n};\n\nexport interface CapturedScopes {\n readonly scopes: readonly ScopeSnapshot[];\n readonly omittedCount?: number;\n}\n\nexport function selectScopes(scopeChain: CallFrameInfo[\"scopeChain\"]): CallFrameInfo[\"scopeChain\"] {\n return rankedScopes(scopeChain).slice(0, MAX_SCOPES);\n}\n\nfunction rankedScopes(scopeChain: CallFrameInfo[\"scopeChain\"]): CallFrameInfo[\"scopeChain\"] {\n const eligible = scopeChain.filter((scope) => scope.objectId !== undefined && scope.type !== \"global\");\n return [...eligible]\n .sort((a, b) => priorityOf(a.type) - priorityOf(b.type));\n}\n\nfunction priorityOf(type: string): number {\n return PRIORITY_BY_TYPE[type] ?? Number.MAX_SAFE_INTEGER;\n}\n\nexport async function captureScopes(\n session: InspectorSession,\n frame: CallFrameInfo,\n maxValueLength: number,\n): Promise<CapturedScopes> {\n const ranked = rankedScopes(frame.scopeChain);\n const scopes = ranked.slice(0, MAX_SCOPES);\n const capturedScopes = await Promise.all(\n scopes.map(async (scope): Promise<ScopeSnapshot> => {\n const objectId = scope.objectId;\n if (objectId === undefined) {\n return { type: scope.type, variables: [] };\n }\n try {\n const captured = await captureProperties(\n session,\n objectId,\n MAX_SCOPE_VARIABLES,\n MAX_VARIABLE_DEPTH,\n maxValueLength,\n );\n const base: ScopeSnapshot = { type: scope.type, variables: captured.variables };\n return captured.omittedCount === undefined\n ? base\n : { ...base, truncated: true, omittedCount: captured.omittedCount };\n } catch {\n return { type: scope.type, variables: [] };\n }\n }),\n );\n const omittedCount = Math.max(ranked.length - capturedScopes.length, 0);\n return omittedCount === 0\n ? { scopes: capturedScopes }\n : { scopes: capturedScopes, omittedCount };\n}\n","import { looksLikeMutation } from \"../cli/captureParser.js\";\nimport { evaluateOnFrame, isSideEffectRefusal } from \"../inspector/runtime.js\";\nimport type { InspectorSession } from \"../inspector/types.js\";\nimport type {\n CallFrameInfo,\n CapturedExpression,\n FrameSnapshot,\n} from \"../types.js\";\n\nimport { evalResultToCaptured, sideEffectRefusalToCaptured } from \"./evaluation.js\";\nimport { withSerializedObjectCapture } from \"./objects.js\";\nimport { limitValueLength, textTruncationFields } from \"./values.js\";\n\nexport const DEFAULT_STACK_DEPTH = 1;\nexport const MAX_STACK_DEPTH = 64;\n\nfunction clampDepth(depth: number, frameCount: number): number {\n if (depth <= 0) {\n return 0;\n }\n return Math.min(depth, frameCount, MAX_STACK_DEPTH);\n}\n\nfunction buildBaseFrame(frame: CallFrameInfo): FrameSnapshot {\n const base: FrameSnapshot = {\n functionName: frame.functionName,\n line: frame.lineNumber + 1,\n column: frame.columnNumber + 1,\n };\n return frame.url === undefined ? base : { ...base, url: frame.url };\n}\n\nasync function captureFrameExpression(\n session: InspectorSession,\n callFrameId: string,\n expression: string,\n maxValueLength: number,\n throwOnSideEffect: boolean | undefined,\n): Promise<CapturedExpression> {\n const mutationRisk = throwOnSideEffect === false && looksLikeMutation(expression);\n try {\n const result = await evaluateOnFrame(session, callFrameId, expression, {\n ...(throwOnSideEffect === undefined ? {} : { throwOnSideEffect }),\n });\n if (isSideEffectRefusal(result)) {\n return sideEffectRefusalToCaptured(expression);\n }\n const captured = evalResultToCaptured(expression, result, maxValueLength);\n const serialized = await withSerializedObjectCapture(\n session,\n expression,\n result,\n captured,\n maxValueLength,\n );\n return mutationRisk ? { ...serialized, mutationRisk: true } : serialized;\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n const limited = limitValueLength(message, maxValueLength);\n const captured: CapturedExpression = {\n expression,\n error: limited.text,\n ...textTruncationFields(limited),\n };\n return mutationRisk ? { ...captured, mutationRisk: true } : captured;\n }\n}\n\nasync function captureFrameExpressions(\n session: InspectorSession,\n frame: CallFrameInfo,\n expressions: readonly string[],\n maxValueLength: number,\n throwOnSideEffect: boolean | undefined,\n): Promise<readonly CapturedExpression[]> {\n if (expressions.length === 0) {\n return [];\n }\n return await Promise.all(\n expressions.map((expression) =>\n captureFrameExpression(\n session,\n frame.callFrameId,\n expression,\n maxValueLength,\n throwOnSideEffect,\n ),\n ),\n );\n}\n\nexport interface WalkStackOptions {\n readonly stackDepth: number;\n readonly stackCaptures: readonly string[];\n readonly maxValueLength: number;\n readonly throwOnSideEffect?: boolean;\n}\n\nexport async function walkStack(\n session: InspectorSession,\n callFrames: readonly CallFrameInfo[],\n options: WalkStackOptions,\n): Promise<readonly FrameSnapshot[]> {\n const depth = clampDepth(options.stackDepth, callFrames.length);\n if (depth <= 1) {\n return [];\n }\n const slice = callFrames.slice(0, depth);\n return await Promise.all(\n slice.map(async (frame): Promise<FrameSnapshot> => {\n const base = buildBaseFrame(frame);\n if (options.stackCaptures.length === 0) {\n return base;\n }\n const captures = await captureFrameExpressions(\n session,\n frame,\n options.stackCaptures,\n options.maxValueLength,\n options.throwOnSideEffect,\n );\n return { ...base, captures };\n }),\n );\n}\n","import { looksLikeMutation } from \"../cli/captureParser.js\";\nimport { evaluateOnFrame, isSideEffectRefusal } from \"../inspector/runtime.js\";\nimport type { InspectorSession } from \"../inspector/types.js\";\nimport type {\n CapturedExpression,\n ExceptionSnapshot,\n FrameSnapshot,\n PauseEvent,\n SnapshotCaptureResult,\n} from \"../types.js\";\n\nimport { evalResultToCaptured, sideEffectRefusalToCaptured } from \"./evaluation.js\";\nimport { captureException } from \"./exception.js\";\nimport { withSerializedObjectCapture } from \"./objects.js\";\nimport { describeProperty } from \"./properties.js\";\nimport { captureScopes, selectScopes } from \"./scopes.js\";\nimport { DEFAULT_STACK_DEPTH, walkStack } from \"./stack.js\";\nimport {\n DEFAULT_MAX_VALUE_LENGTH,\n DEFAULT_STREAM_MAX_VALUE_LENGTH,\n limitValueLength,\n resolveMaxValueLength,\n textTruncationFields,\n} from \"./values.js\";\n\nexport interface CaptureSnapshotOptions {\n readonly captures?: readonly string[];\n readonly includeScopes?: boolean;\n readonly maxValueLength?: number;\n readonly stackDepth?: number;\n readonly stackCaptures?: readonly string[];\n readonly throwOnSideEffect?: boolean;\n}\n\nexport async function captureSnapshot(\n session: InspectorSession,\n pause: PauseEvent,\n options: CaptureSnapshotOptions = {},\n): Promise<SnapshotCaptureResult> {\n const maxValueLength = resolveMaxValueLength(options.maxValueLength);\n const top = pause.callFrames[0];\n let topFrame: FrameSnapshot | undefined;\n let captures: CapturedExpression[] = [];\n let stack: readonly FrameSnapshot[] = [];\n if (top) {\n topFrame = {\n functionName: top.functionName,\n ...(top.url === undefined ? {} : { url: top.url }),\n line: top.lineNumber + 1,\n column: top.columnNumber + 1,\n };\n if (options.includeScopes === true) {\n const capturedScopes = await captureScopes(session, top, maxValueLength);\n topFrame = {\n ...topFrame,\n scopes: capturedScopes.scopes,\n ...(capturedScopes.omittedCount === undefined\n ? {}\n : { truncated: true, omittedCount: capturedScopes.omittedCount }),\n };\n }\n captures = await captureExpressions(\n session,\n top.callFrameId,\n options.captures,\n maxValueLength,\n options.throwOnSideEffect,\n );\n stack = await walkStack(session, pause.callFrames, {\n stackDepth: options.stackDepth ?? DEFAULT_STACK_DEPTH,\n stackCaptures: options.stackCaptures ?? [],\n maxValueLength,\n ...(options.throwOnSideEffect === undefined\n ? {}\n : { throwOnSideEffect: options.throwOnSideEffect }),\n });\n }\n const exception = await captureException(session, pause, maxValueLength);\n return buildResult({\n pause,\n topFrame,\n captures,\n stack,\n exception,\n });\n}\n\ninterface BuildResultInput {\n readonly pause: PauseEvent;\n readonly topFrame: FrameSnapshot | undefined;\n readonly captures: readonly CapturedExpression[];\n readonly stack: readonly FrameSnapshot[];\n readonly exception: ExceptionSnapshot | undefined;\n}\n\nfunction buildResult(input: BuildResultInput): SnapshotCaptureResult {\n const base: SnapshotCaptureResult = {\n reason: input.pause.reason,\n hitBreakpoints: input.pause.hitBreakpoints,\n capturedAt: new Date().toISOString(),\n captures: input.captures,\n };\n const withFrame = input.topFrame === undefined ? base : { ...base, topFrame: input.topFrame };\n const withStack = input.stack.length > 0 ? { ...withFrame, stack: input.stack } : withFrame;\n return input.exception === undefined ? withStack : { ...withStack, exception: input.exception };\n}\n\nasync function captureExpressions(\n session: InspectorSession,\n callFrameId: string,\n captures: readonly string[] | undefined,\n maxValueLength: number,\n throwOnSideEffect: boolean | undefined,\n): Promise<CapturedExpression[]> {\n if (captures === undefined || captures.length === 0) {\n return [];\n }\n return await Promise.all(\n captures.map(async (expression): Promise<CapturedExpression> => {\n return await captureExpression(\n session,\n callFrameId,\n expression,\n maxValueLength,\n throwOnSideEffect,\n );\n }),\n );\n}\n\nasync function captureExpression(\n session: InspectorSession,\n callFrameId: string,\n expression: string,\n maxValueLength: number,\n throwOnSideEffect: boolean | undefined,\n): Promise<CapturedExpression> {\n const mutationRisk = throwOnSideEffect === false && looksLikeMutation(expression);\n try {\n const result = await evaluateOnFrame(session, callFrameId, expression, {\n ...(throwOnSideEffect === undefined ? {} : { throwOnSideEffect }),\n });\n if (isSideEffectRefusal(result)) {\n return sideEffectRefusalToCaptured(expression);\n }\n const captured = evalResultToCaptured(expression, result, maxValueLength);\n const serialized = await withSerializedObjectCapture(\n session,\n expression,\n result,\n captured,\n maxValueLength,\n );\n return mutationRisk ? { ...serialized, mutationRisk: true } : serialized;\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n const limited = limitValueLength(message, maxValueLength);\n const captured: CapturedExpression = {\n expression,\n error: limited.text,\n ...textTruncationFields(limited),\n };\n return mutationRisk ? { ...captured, mutationRisk: true } : captured;\n }\n}\n\nexport const internalsForTesting = {\n DEFAULT_MAX_VALUE_LENGTH,\n DEFAULT_STREAM_MAX_VALUE_LENGTH,\n limitValueLength,\n resolveMaxValueLength,\n describeProperty,\n selectScopes,\n evalResultToCaptured,\n};\n","import process from \"node:process\";\n\n/**\n * Run `fn` with a fresh AbortController whose signal aborts on SIGINT/SIGTERM.\n * The handlers are detached on completion so repeated invocations do not leak\n * listeners, and so the next signal restores the default Node behaviour.\n */\nexport async function withTerminationSignal<T>(\n fn: (signal: AbortSignal) => Promise<T>,\n): Promise<T> {\n const abort = new AbortController();\n const onSignal = (): void => {\n abort.abort();\n };\n process.once(\"SIGINT\", onSignal);\n process.once(\"SIGTERM\", onSignal);\n try {\n return await fn(abort.signal);\n } finally {\n process.off(\"SIGINT\", onSignal);\n process.off(\"SIGTERM\", onSignal);\n }\n}\n","import process from \"node:process\";\n\nimport { discoverInspectorTargets } from \"../../inspector/discovery.js\";\nimport type { InspectorTarget } from \"../../inspector/discovery.js\";\nimport { listScripts } from \"../../inspector/runtime.js\";\nimport { discoverNodeWorkerTargets } from \"../../inspector/session.js\";\nimport type { InspectorSession, InspectorWorkerTarget } from \"../../inspector/types.js\";\nimport type { InspectorIsolate, ListedScriptInfo } from \"../../types.js\";\nimport type {\n ListScriptsCommandOptions,\n ListTargetsCommandOptions,\n Target,\n} from \"../commandTypes.js\";\nimport { writeJson } from \"../output.js\";\nimport { openTarget, resolveTargetWithCurrentCfTarget, withSessions } from \"../target.js\";\nimport { warnOnImplicitInspectorSelection } from \"../warnings.js\";\n\ntype ScriptUrlFilter = (url: string) => boolean;\ntype FilterToken = string | { readonly kind: \"wildcard\"; readonly minChars: 0 | 1 };\n\nexport async function handleListScripts(opts: ListScriptsCommandOptions): Promise<void> {\n const target = await resolveTargetWithCurrentCfTarget(opts);\n const filter = compileScriptUrlFilter(opts.filter);\n const scripts = (await withSessions(target, (group) => {\n const sessions = group.list();\n warnOnListScriptsSelection(target, {\n targetCount: group.targetCount,\n targetIndex: group.targetIndex,\n ...(sessions[0]?.workerTargets === undefined\n ? {}\n : { workerTargets: sessions[0].workerTargets }),\n });\n return Promise.resolve(collectListedScripts(sessions));\n }))\n .filter((script) => filter === undefined || filter(script.url));\n if (opts.json) {\n writeJson(scripts);\n return;\n }\n for (const script of scripts) {\n process.stdout.write(\n `${script.scriptId}\\t${script.url}\\t${formatIsolate(script.isolate)}\\n`,\n );\n }\n}\n\nexport function warnOnListScriptsSelection(\n target: Target,\n selection: Pick<InspectorSession, \"targetCount\" | \"targetIndex\" | \"workerTargets\">,\n): void {\n const autoAttach = target.targetIndex === undefined &&\n target.workerIndex === undefined &&\n target.workerId === undefined &&\n target.mainOnly !== true;\n const isolateWasExplicit = autoAttach ||\n target.workerIndex !== undefined ||\n target.workerId !== undefined ||\n target.mainOnly === true;\n warnOnImplicitInspectorSelection(\n selection,\n target.targetIndex !== undefined,\n isolateWasExplicit,\n );\n}\n\nfunction collectListedScripts(sessions: readonly InspectorSession[]): readonly ListedScriptInfo[] {\n return sessions.flatMap((session) => listScripts(session).map((script) => ({\n ...script,\n isolate: session.isolate ?? { kind: \"main\" },\n })));\n}\n\nfunction formatIsolate(isolate: InspectorIsolate): string {\n return isolate.kind === \"worker\" ? `worker:${isolate.workerId}` : \"main\";\n}\n\nexport async function handleListTargets(opts: ListTargetsCommandOptions): Promise<void> {\n const target = await resolveTargetWithCurrentCfTarget(opts);\n const tunnel = await openTarget(target);\n try {\n const targets = await discoverInspectorTargets(tunnel.host, tunnel.port, 5_000);\n const indexedTargets = await buildListedTargets(targets);\n const workerCount = indexedTargets.reduce((count, targetEntry) => {\n return count + targetEntry.workers.length;\n }, 0);\n writeTargetCountSummary(indexedTargets.length, workerCount);\n warnOnMissingWorkers(indexedTargets.length, workerCount, indexedTargets);\n if (opts.json) {\n writeJson(indexedTargets);\n return;\n }\n writeHumanTargets(indexedTargets);\n } finally {\n await tunnel.dispose();\n }\n}\n\ninterface ListedWorkerTarget {\n readonly index: number;\n readonly workerId: string;\n readonly type: string;\n readonly title: string;\n readonly url: string;\n}\n\ninterface ListedInspectorTarget extends InspectorTarget {\n readonly index: number;\n readonly likelyWorker: boolean;\n readonly workerDiscoverySupported: boolean;\n readonly workers: readonly ListedWorkerTarget[];\n}\n\nasync function buildListedTargets(\n targets: readonly InspectorTarget[],\n): Promise<readonly ListedInspectorTarget[]> {\n return await Promise.all(targets.map(async (target, index) => {\n try {\n const workerResult = await discoverNodeWorkerTargets(target);\n return buildListedTarget(target, index, workerResult.supported, workerResult.workers);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n process.stderr.write(\n `[cf-inspector] warning: worker discovery failed for raw target ${index.toString()}: ${message}\\n`,\n );\n return buildListedTarget(target, index, false, []);\n }\n }));\n}\n\nfunction buildListedTarget(\n target: InspectorTarget,\n index: number,\n workerDiscoverySupported: boolean,\n workers: readonly InspectorWorkerTarget[],\n): ListedInspectorTarget {\n return {\n index,\n ...target,\n likelyWorker: looksLikeWorkerTarget(target),\n workerDiscoverySupported,\n workers: workers.map((worker, workerIndex) => ({\n index: workerIndex,\n workerId: worker.workerId,\n type: worker.type,\n title: worker.title,\n url: worker.url,\n })),\n };\n}\n\nfunction looksLikeWorkerTarget(target: InspectorTarget): boolean {\n return `${target.type} ${target.title} ${target.url}`.toLowerCase().includes(\"worker\");\n}\n\nfunction writeTargetCountSummary(targetCount: number, workerCount: number): void {\n process.stderr.write(\n `[cf-inspector] ${targetCount.toString()} raw inspector ` +\n `${targetCount === 1 ? \"target\" : \"targets\"}; ${workerCount.toString()} ` +\n `${workerCount === 1 ? \"worker\" : \"workers\"}.\\n`,\n );\n}\n\nfunction warnOnMissingWorkers(\n targetCount: number,\n workerCount: number,\n targets: readonly ListedInspectorTarget[],\n): void {\n if (targetCount !== 1 || workerCount !== 0) {\n return;\n }\n const supported = targets[0]?.workerDiscoverySupported === true;\n const supportHint = supported\n ? \"NodeWorker discovery is available, but no live worker attached.\"\n : \"This runtime did not expose NodeWorker discovery.\";\n process.stderr.write(\n `[cf-inspector] warning: only the main inspector target is reachable. ${supportHint} ` +\n \"If worker code is expected, ensure the worker is alive and rerun list-targets. \" +\n \"A worker on a separate inspector port is not carried by a single Cloud Foundry tunnel.\\n\",\n );\n}\n\nfunction writeHumanTargets(targets: readonly ListedInspectorTarget[]): void {\n for (const target of targets) {\n const workerLabel = target.likelyWorker ? \"\\tlikely-worker\" : \"\";\n process.stdout.write(\n `${target.index.toString()}\\ttarget\\t${target.type}\\t${target.title}\\t${target.url}${workerLabel}\\n`,\n );\n for (const worker of target.workers) {\n process.stdout.write(\n ` ${worker.index.toString()}\\tworker\\t${worker.type}\\t${worker.title}\\t${worker.url}\\n`,\n );\n }\n }\n}\n\nexport function compileScriptUrlFilter(pattern: string | undefined): ScriptUrlFilter | undefined {\n if (pattern === undefined || pattern.length === 0) {\n return undefined;\n }\n const alternatives = splitPatternAlternatives(pattern)\n .map((alternative) => parseFilterTokens(alternative))\n .filter((tokens) => tokens.length > 0);\n return (url: string): boolean => alternatives.some((tokens) => matchesFilterTokens(url, tokens));\n}\n\nfunction splitPatternAlternatives(pattern: string): readonly string[] {\n const alternatives: string[] = [];\n let current = \"\";\n for (let index = 0; index < pattern.length; index++) {\n const char = pattern[index] ?? \"\";\n if (char === \"\\\\\" && index + 1 < pattern.length) {\n current += `${char}${pattern[index + 1] ?? \"\"}`;\n index++;\n } else if (char === \"|\") {\n alternatives.push(current);\n current = \"\";\n } else {\n current += char;\n }\n }\n alternatives.push(current);\n return alternatives;\n}\n\nfunction parseFilterTokens(pattern: string): readonly FilterToken[] {\n const tokens: FilterToken[] = [];\n let literal = \"\";\n for (let index = 0; index < pattern.length; index++) {\n const char = pattern[index] ?? \"\";\n const nextChar = pattern[index + 1];\n if (char === \"\\\\\" && nextChar !== undefined) {\n literal += nextChar;\n index++;\n } else if (char === \".\" && (nextChar === \"*\" || nextChar === \"+\")) {\n if (literal.length > 0) { tokens.push(literal); }\n literal = \"\";\n tokens.push({ kind: \"wildcard\", minChars: nextChar === \"+\" ? 1 : 0 });\n index++;\n } else {\n literal += char;\n }\n }\n if (literal.length > 0) { tokens.push(literal); }\n return tokens;\n}\n\nfunction matchesFilterTokens(value: string, tokens: readonly FilterToken[]): boolean {\n let position = 0;\n for (const token of tokens) {\n if (typeof token === \"string\") {\n const nextPosition = value.indexOf(token, position);\n if (nextPosition === -1) { return false; }\n position = nextPosition + token.length;\n } else {\n if (token.minChars === 1 && position >= value.length) { return false; }\n position += token.minChars;\n }\n }\n return true;\n}\n","import process from \"node:process\";\n\nimport { validateExpression } from \"../../inspector/runtime.js\";\nimport type { InspectorSession, InspectorSessionGroup } from \"../../inspector/types.js\";\nimport type { LogpointStreamResult } from \"../../logpoint/stream.js\";\nimport { streamLogpoint } from \"../../logpoint/stream.js\";\nimport { parseBreakpointSpec, parseRemoteRoot } from \"../../pathMapper.js\";\nimport { DEFAULT_STREAM_MAX_VALUE_LENGTH } from \"../../snapshot/values.js\";\nimport { CfInspectorError } from \"../../types.js\";\nimport type { LogCommandOptions } from \"../commandTypes.js\";\nimport { writeArmedEvent, writeLogEvent } from \"../output.js\";\nimport { withTerminationSignal } from \"../signals.js\";\nimport { parsePositiveInt, resolveTargetWithCurrentCfTarget, withSessions } from \"../target.js\";\nimport {\n warnOnBoundBreakpointWithoutHit,\n warnOnMutationRisk,\n warnOnUnboundBreakpoints,\n} from \"../warnings.js\";\n\nexport async function handleLog(opts: LogCommandOptions): Promise<void> {\n const target = await resolveTargetWithCurrentCfTarget(opts);\n const location = parseBreakpointSpec(opts.at);\n const remoteRoot = parseRemoteRoot(opts.remoteRoot);\n const durationSec = parsePositiveInt(opts.duration, \"--duration\");\n const maxEvents = parsePositiveInt(opts.maxEvents, \"--max-events\");\n const hitCount = parsePositiveInt(opts.hitCount, \"--hit-count\");\n const maxValueLength = parsePositiveInt(opts.maxValueLength, \"--max-value-length\")\n ?? DEFAULT_STREAM_MAX_VALUE_LENGTH;\n const expression = opts.expr.trim();\n if (expression.length === 0) {\n throw new CfInspectorError(\"INVALID_EXPRESSION\", \"--expr must not be empty\");\n }\n const condition = opts.condition !== undefined && opts.condition.trim().length > 0\n ? opts.condition.trim()\n : undefined;\n warnOnMutationRisk(expression, \"log --expr\");\n if (condition !== undefined) {\n warnOnMutationRisk(condition, \"log --condition\");\n }\n\n await withTerminationSignal(async (signal) => {\n await withSessions(target, async (group) => {\n const result = await runLogGroup(group, {\n location,\n expression,\n remoteRoot,\n ...(durationSec === undefined ? {} : { durationMs: durationSec * 1000 }),\n ...(maxEvents === undefined ? {} : { maxEvents }),\n ...(hitCount === undefined ? {} : { hitCount }),\n ...(condition === undefined ? {} : { condition }),\n maxValueLength,\n json: opts.json,\n emitReadyEvent: opts.readyEvent === true,\n signal,\n });\n writeLogSummary(result.stoppedReason, result.emitted, opts.json);\n }, undefined, signal);\n });\n}\n\ninterface LogGroupOptions {\n readonly location: ReturnType<typeof parseBreakpointSpec>;\n readonly expression: string;\n readonly remoteRoot: ReturnType<typeof parseRemoteRoot>;\n readonly durationMs?: number;\n readonly maxEvents?: number;\n readonly hitCount?: number;\n readonly condition?: string;\n readonly maxValueLength: number;\n readonly json: boolean;\n readonly emitReadyEvent: boolean;\n readonly signal: AbortSignal;\n}\n\ninterface LogGroupResult {\n readonly emitted: number;\n readonly stoppedReason: \"duration\" | \"signal\" | \"transport-closed\" | \"max-events\";\n}\n\nasync function runLogGroup(\n group: InspectorSessionGroup,\n options: LogGroupOptions,\n): Promise<LogGroupResult> {\n const controller = new AbortController();\n const tasks = new Set<Promise<LogpointStreamResult>>();\n const removedSessions = new Set<InspectorSession>();\n const results: LogpointStreamResult[] = [];\n const pendingArming = new Set<InspectorSession>();\n const resolvedLocations = new Map<InspectorSession, number>();\n let fatalError: unknown;\n let emitted = 0;\n let reason: LogGroupResult[\"stoppedReason\"] = \"signal\";\n let sessionRegistrationComplete = false;\n let readyEventEmitted = !options.emitReadyEvent;\n let resolveStop: (() => void) | undefined;\n const stopped = new Promise<void>((resolve) => {\n resolveStop = resolve;\n });\n const finish = (nextReason: LogGroupResult[\"stoppedReason\"]): void => {\n if (controller.signal.aborted) {\n return;\n }\n reason = nextReason;\n controller.abort();\n resolveStop?.();\n };\n const onSignal = (): void => {\n finish(\"signal\");\n };\n options.signal.addEventListener(\"abort\", onSignal, { once: true });\n if (options.signal.aborted) {\n finish(\"signal\");\n }\n const timer = options.durationMs === undefined ? undefined : setTimeout(() => {\n finish(\"duration\");\n }, options.durationMs);\n const detachError = options.emitReadyEvent\n ? group.onError((error) => {\n if (controller.signal.aborted) {\n return;\n }\n fatalError = error;\n finish(\"transport-closed\");\n })\n : (): void => undefined;\n const emitReadyEventIfArmed = (): void => {\n if (\n readyEventEmitted ||\n !sessionRegistrationComplete ||\n pendingArming.size > 0 ||\n resolvedLocations.size === 0 ||\n controller.signal.aborted\n ) {\n return;\n }\n writeArmedEvent({\n command: \"log\",\n sessions: resolvedLocations.size,\n resolvedLocations: [...resolvedLocations.values()].reduce(\n (total, count) => total + count,\n 0,\n ),\n timeoutMs: null,\n });\n readyEventEmitted = true;\n };\n const startSession = (session: InspectorSession): void => {\n if (controller.signal.aborted) {\n return;\n }\n if (!readyEventEmitted) {\n pendingArming.add(session);\n }\n const task = (async (): Promise<LogpointStreamResult> => {\n await validateExpression(session, options.expression);\n if (options.condition !== undefined) {\n await validateExpression(session, options.condition);\n }\n return await streamLogpoint(session, {\n location: options.location,\n expression: options.expression,\n remoteRoot: options.remoteRoot,\n ...(options.hitCount === undefined ? {} : { hitCount: options.hitCount }),\n ...(options.condition === undefined ? {} : { condition: options.condition }),\n maxValueLength: options.maxValueLength,\n signal: controller.signal,\n ...(options.emitReadyEvent\n ? { eventGate: (): boolean => readyEventEmitted }\n : {}),\n onEvent: (event) => {\n if (controller.signal.aborted) {\n return;\n }\n emitted += 1;\n writeLogEvent({ ...event, isolate: session.isolate ?? { kind: \"main\" } }, options.json);\n if (options.maxEvents !== undefined && emitted >= options.maxEvents) {\n finish(\"max-events\");\n }\n },\n onBreakpointSet: (handle) => {\n warnOnUnboundBreakpoints([handle]);\n if (!readyEventEmitted) {\n resolvedLocations.set(session, handle.resolvedLocations.length);\n pendingArming.delete(session);\n emitReadyEventIfArmed();\n }\n },\n });\n })();\n tasks.add(task);\n void task.then(\n (result) => {\n results.push(result);\n if (result.stoppedReason === \"transport-closed\" && !removedSessions.has(session)) {\n finish(\"transport-closed\");\n }\n },\n (error: unknown) => {\n if (\n options.emitReadyEvent &&\n (removedSessions.has(session) || fatalError !== undefined)\n ) {\n return;\n }\n fatalError = error;\n finish(\"transport-closed\");\n },\n ).finally(() => {\n tasks.delete(task);\n });\n };\n const detach = group.onSession(startSession);\n sessionRegistrationComplete = true;\n emitReadyEventIfArmed();\n const detachRemoved = group.onSessionRemoved((session) => {\n removedSessions.add(session);\n if (!readyEventEmitted) {\n if (controller.signal.aborted) {\n pendingArming.delete(session);\n resolvedLocations.delete(session);\n return;\n }\n if (pendingArming.has(session)) {\n fatalError = new CfInspectorError(\n \"INSPECTOR_CONNECTION_FAILED\",\n \"A worker detached before logpoint arming completed; no readiness event was emitted.\",\n );\n finish(\"transport-closed\");\n return;\n }\n resolvedLocations.delete(session);\n emitReadyEventIfArmed();\n }\n });\n try {\n await stopped;\n await Promise.allSettled([...tasks]);\n } finally {\n detach();\n detachRemoved();\n detachError();\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n options.signal.removeEventListener(\"abort\", onSignal);\n }\n if (emitted === 0 && isZeroHitStop(reason)) {\n warnOnBoundBreakpointWithoutHit(results.map((result) => result.handle));\n }\n if (fatalError !== undefined) {\n throw fatalError instanceof Error ? fatalError : new Error(\"Unknown logpoint fan-out failure\");\n }\n return { emitted, stoppedReason: reason };\n}\n\nfunction isZeroHitStop(reason: LogGroupResult[\"stoppedReason\"]): boolean {\n return reason === \"duration\" || reason === \"signal\";\n}\n\nfunction writeLogSummary(stoppedReason: string, emitted: number, json: boolean): void {\n if (json) {\n process.stderr.write(`${JSON.stringify({ stopped: stoppedReason, emitted })}\\n`);\n return;\n }\n process.stderr.write(\n `Stopped (${stoppedReason}); emitted ${emitted.toString()} log ${emitted === 1 ? \"entry\" : \"entries\"}.\\n`,\n );\n}\n\nexport const internalsForTesting = {\n runLogGroup,\n};\n","import { removeBreakpoint, setBreakpoint } from \"../inspector/breakpoints.js\";\nimport type { InspectorSession } from \"../inspector/types.js\";\nimport {\n DEFAULT_STREAM_MAX_VALUE_LENGTH,\n resolveMaxValueLength,\n} from \"../snapshot/values.js\";\nimport { CfInspectorError } from \"../types.js\";\nimport type { BreakpointHandle, BreakpointLocation, RemoteRootSetting } from \"../types.js\";\n\nimport { buildLogpointCondition, generateSentinel } from \"./condition.js\";\nimport { asString, parseLogEvent } from \"./events.js\";\nimport type { ConsoleAPICalledParams, LogpointEvent } from \"./events.js\";\n\nexport type LogpointStopReason =\n | \"duration\"\n | \"signal\"\n | \"transport-closed\"\n | \"max-events\";\n\nexport interface LogpointStreamOptions {\n readonly location: BreakpointLocation;\n readonly expression: string;\n readonly remoteRoot?: RemoteRootSetting;\n readonly durationMs?: number;\n readonly maxEvents?: number;\n readonly hitCount?: number;\n readonly condition?: string;\n readonly maxValueLength?: number;\n readonly signal?: AbortSignal;\n readonly eventGate?: () => boolean;\n readonly onEvent: (event: LogpointEvent) => void;\n readonly onBreakpointSet?: (handle: BreakpointHandle) => void;\n}\n\nexport interface LogpointStreamResult {\n readonly handle: BreakpointHandle;\n readonly sentinel: string;\n readonly emitted: number;\n readonly stoppedReason: LogpointStopReason;\n}\n\nfunction validateMaxEvents(maxEvents: number | undefined): number | undefined {\n if (maxEvents === undefined) {\n return undefined;\n }\n if (!Number.isInteger(maxEvents) || maxEvents <= 0) {\n throw new CfInspectorError(\n \"INVALID_ARGUMENT\",\n `maxEvents must be a positive integer, received: ${maxEvents.toString()}`,\n );\n }\n return maxEvents;\n}\n\nfunction validateHitCount(hitCount: number | undefined): number | undefined {\n if (hitCount === undefined) {\n return undefined;\n }\n if (!Number.isInteger(hitCount) || hitCount <= 0) {\n throw new CfInspectorError(\n \"INVALID_HIT_COUNT\",\n `hitCount must be a positive integer, received: ${hitCount.toString()}`,\n );\n }\n return hitCount;\n}\n\nexport async function streamLogpoint(\n session: InspectorSession,\n options: LogpointStreamOptions,\n): Promise<LogpointStreamResult> {\n const maxEvents = validateMaxEvents(options.maxEvents);\n const hitCount = validateHitCount(options.hitCount);\n const maxValueLength = resolveMaxValueLength(\n options.maxValueLength ?? DEFAULT_STREAM_MAX_VALUE_LENGTH,\n );\n const sentinel = generateSentinel();\n const condition = buildLogpointCondition(sentinel, options.expression, {\n ...(options.condition === undefined ? {} : { predicate: options.condition }),\n ...(hitCount === undefined ? {} : { hitCount }),\n });\n let emitted = 0;\n let maxEventsReached = false;\n let stopMaxEvents: (() => void) | undefined;\n const offEvent = session.client.on(\"Runtime.consoleAPICalled\", (raw) => {\n if (maxEventsReached) {\n return;\n }\n const event = toLogpointEvent(raw, sentinel, options.location, maxValueLength);\n if (event === undefined) {\n return;\n }\n if (options.eventGate?.() === false) {\n return;\n }\n emitted += 1;\n try {\n options.onEvent(event);\n } catch {\n // A throwing onEvent must not stop the stream or skip the max-events\n // check below — that would cause us to overshoot the cap on every throw.\n }\n if (maxEvents !== undefined && emitted >= maxEvents) {\n maxEventsReached = true;\n stopMaxEvents?.();\n }\n });\n\n let handle: BreakpointHandle;\n try {\n handle = await setBreakpoint(session, {\n file: options.location.file,\n line: options.location.line,\n ...(options.remoteRoot === undefined ? {} : { remoteRoot: options.remoteRoot }),\n condition,\n });\n } catch (err: unknown) {\n offEvent();\n throw err;\n }\n options.onBreakpointSet?.(handle);\n\n try {\n const reason = await waitForStop(session, options, (signal) => {\n stopMaxEvents = signal;\n if (maxEventsReached) {\n signal();\n }\n });\n return { handle, sentinel, emitted, stoppedReason: reason };\n } finally {\n offEvent();\n await removeBreakpointBestEffort(session, handle.breakpointId);\n }\n}\n\nfunction toLogpointEvent(\n raw: unknown,\n sentinel: string,\n location: BreakpointLocation,\n maxValueLength: number,\n): LogpointEvent | undefined {\n const params = raw as ConsoleAPICalledParams;\n if (asString(params.type) !== \"log\") {\n return undefined;\n }\n const ts = typeof params.timestamp === \"number\" ? params.timestamp : undefined;\n return parseLogEvent(params.args, sentinel, location, ts, maxValueLength);\n}\n\nasync function removeBreakpointBestEffort(\n session: InspectorSession,\n breakpointId: string,\n): Promise<void> {\n try {\n await removeBreakpoint(session, breakpointId);\n } catch {\n // best-effort: tunnel may be gone\n }\n}\n\nasync function waitForStop(\n session: InspectorSession,\n options: LogpointStreamOptions,\n registerMaxEventsSignal: (signal: () => void) => void,\n): Promise<LogpointStopReason> {\n return await new Promise<LogpointStopReason>((resolve) => {\n let settled = false;\n const finish = (reason: LogpointStopReason): void => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n resolve(reason);\n };\n const timer = options.durationMs === undefined\n ? undefined\n : setTimeout(() => {\n finish(\"duration\");\n }, options.durationMs);\n const offClose = session.client.onClose(() => {\n finish(\"transport-closed\");\n });\n const onAbort = (): void => {\n finish(\"signal\");\n };\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n if (options.signal?.aborted === true) {\n finish(\"signal\");\n }\n registerMaxEventsSignal(() => {\n finish(\"max-events\");\n });\n function cleanup(): void {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n offClose();\n options.signal?.removeEventListener(\"abort\", onAbort);\n }\n });\n}\n","import { randomBytes } from \"node:crypto\";\n\nconst SENTINEL_PREFIX = \"__CFI_LOG_\";\nconst SENTINEL_SUFFIX = \"__\";\n\nexport interface LogpointConditionOptions {\n readonly predicate?: string;\n readonly hitCount?: number;\n readonly counterKey?: string;\n}\n\nconst HITS_GLOBAL = \"globalThis.__CFI_LOG_HITS\";\n\nfunction buildLoggingIife(sentinel: string, expression: string): string {\n return [\n \"(function(){\",\n `var s=${JSON.stringify(sentinel)};`,\n \"try{\",\n `var v=(${expression});`,\n \"var r=typeof v==='string'?v:JSON.stringify(v);\",\n \"console.log(s, r);\",\n \"}catch(e){\",\n \"console.log(s, '!err:'+(e&&e.message?e.message:String(e)));\",\n \"}\",\n \"return false;\",\n \"})()\",\n ].join(\"\");\n}\n\nfunction buildHitGate(hitCount: number, counterKey: string): string {\n const keyLiteral = JSON.stringify(counterKey);\n return [\n \"(function(){\",\n `var m=(${HITS_GLOBAL}=${HITS_GLOBAL}||{});`,\n `var k=${keyLiteral};`,\n \"m[k]=(m[k]||0)+1;\",\n `return m[k]>=${hitCount.toString()};`,\n \"})()\",\n ].join(\"\");\n}\n\nfunction combineGuards(guards: readonly string[]): string | undefined {\n const filtered = guards.filter((guard) => guard.length > 0);\n if (filtered.length === 0) {\n return undefined;\n }\n if (filtered.length === 1) {\n return filtered[0];\n }\n return filtered.map((guard) => `(${guard})`).join(\"&&\");\n}\n\nexport function buildLogpointCondition(\n sentinel: string,\n expression: string,\n options: LogpointConditionOptions = {},\n): string {\n const guards: string[] = [];\n if (options.hitCount !== undefined) {\n const counterKey = options.counterKey ?? sentinel;\n guards.push(buildHitGate(options.hitCount, counterKey));\n }\n const userPredicate = options.predicate?.trim();\n if (userPredicate !== undefined && userPredicate.length > 0) {\n guards.push(`(${userPredicate})`);\n }\n const iife = buildLoggingIife(sentinel, expression);\n const guard = combineGuards(guards);\n if (guard === undefined) {\n return iife;\n }\n return `(${guard})?${iife}:false`;\n}\n\nexport function generateSentinel(): string {\n return `${SENTINEL_PREFIX}${randomBytes(8).toString(\"hex\")}${SENTINEL_SUFFIX}`;\n}\n\nexport { SENTINEL_PREFIX };\n","import {\n DEFAULT_STREAM_MAX_VALUE_LENGTH,\n limitValueLength,\n textTruncationFields,\n} from \"../snapshot/values.js\";\nimport type { BreakpointLocation, InspectorIsolate } from \"../types.js\";\n\nexport interface LogpointEvent {\n readonly ts: string;\n readonly at: string;\n readonly value?: string;\n readonly error?: string;\n readonly raw?: string;\n readonly truncated?: true;\n readonly originalLength?: number;\n readonly isolate?: InspectorIsolate;\n}\n\ninterface CdpRemoteObject {\n type?: unknown;\n value?: unknown;\n}\n\nexport interface ConsoleAPICalledParams {\n type?: unknown;\n args?: unknown;\n timestamp?: unknown;\n}\n\nexport function asString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction readArg(arg: unknown, index: number): string | undefined {\n if (typeof arg !== \"object\" || arg === null) {\n return undefined;\n }\n const candidate = arg as CdpRemoteObject;\n if (candidate.type === \"string\" && typeof candidate.value === \"string\") {\n return candidate.value;\n }\n const isPrimitiveType =\n candidate.type === \"number\" ||\n candidate.type === \"boolean\" ||\n candidate.type === \"bigint\";\n const isPrimitiveValue =\n typeof candidate.value === \"number\" ||\n typeof candidate.value === \"boolean\" ||\n typeof candidate.value === \"bigint\";\n if (isPrimitiveType && isPrimitiveValue) {\n return String(candidate.value);\n }\n return index === 0 ? undefined : \"\";\n}\n\nexport function parseLogEvent(\n rawArgs: unknown,\n sentinel: string,\n location: BreakpointLocation,\n timestamp: number | undefined,\n maxValueLength = DEFAULT_STREAM_MAX_VALUE_LENGTH,\n): LogpointEvent | undefined {\n if (!Array.isArray(rawArgs) || rawArgs.length < 2) {\n return undefined;\n }\n const tag = readArg(rawArgs[0], 0);\n if (tag !== sentinel) {\n return undefined;\n }\n const payload = readArg(rawArgs[1], 1) ?? \"\";\n const ts = new Date(typeof timestamp === \"number\" ? timestamp : Date.now()).toISOString();\n const at = `${location.file}:${location.line.toString()}`;\n if (payload.startsWith(\"!err:\")) {\n const limited = limitValueLength(payload.slice(\"!err:\".length), maxValueLength);\n return {\n ts,\n at,\n error: limited.text,\n ...textTruncationFields(limited),\n };\n }\n return parsePayload(ts, at, payload, maxValueLength);\n}\n\nfunction parsePayload(\n ts: string,\n at: string,\n payload: string,\n maxValueLength: number,\n): LogpointEvent {\n try {\n const parsed: unknown = JSON.parse(payload);\n if (typeof parsed === \"string\") {\n return buildValueEvent(ts, at, parsed, maxValueLength);\n }\n return buildValueEvent(ts, at, JSON.stringify(parsed), maxValueLength);\n } catch {\n return buildValueEvent(ts, at, payload, maxValueLength, true);\n }\n}\n\nfunction buildValueEvent(\n ts: string,\n at: string,\n value: string,\n maxValueLength: number,\n includeRaw = false,\n): LogpointEvent {\n const limited = limitValueLength(value, maxValueLength);\n return {\n ts,\n at,\n value: limited.text,\n ...(includeRaw ? { raw: limited.text } : {}),\n ...textTruncationFields(limited),\n };\n}\n","import { performance } from \"node:perf_hooks\";\nimport process from \"node:process\";\n\nimport {\n BreakpointFanout,\n resume,\n runSetupEvals,\n setBreakpoint,\n validateExpression,\n waitForPause,\n} from \"../../inspector/index.js\";\nimport type { InspectorSession } from \"../../inspector/types.js\";\nimport { parseBreakpointSpec, parseRemoteRoot } from \"../../pathMapper.js\";\nimport { captureSnapshot } from \"../../snapshot/capture.js\";\nimport { DEFAULT_MAX_VALUE_LENGTH } from \"../../snapshot/values.js\";\nimport { CfInspectorError } from \"../../types.js\";\nimport type { BreakpointLocation, RemoteRootSetting, SnapshotResult } from \"../../types.js\";\nimport { parseCaptureList } from \"../captureParser.js\";\nimport { DEFAULT_BREAKPOINT_TIMEOUT_SEC } from \"../commandTypes.js\";\nimport type { SnapshotCommandOptions, Target } from \"../commandTypes.js\";\nimport { writeArmedEvent, writeHumanSnapshot, writeJson, writeProgress } from \"../output.js\";\nimport { withTerminationSignal } from \"../signals.js\";\nimport { parsePositiveInt, resolveTargetWithCurrentCfTarget, withSessions } from \"../target.js\";\nimport type { ProgressReporter } from \"../target.js\";\nimport {\n enforceNativeConditionMutationPolicy,\n roundDurationMs,\n warnOnCaptureMutationRisk,\n warnOnBoundBreakpointWithoutHit,\n warnOnMutationRisk,\n warnOnUnboundBreakpoints,\n warnOnUnmatchedPause,\n withPausedDuration,\n} from \"../warnings.js\";\n\ninterface PreparedSnapshotCommand {\n readonly target: Target;\n readonly setupEvals: readonly string[];\n readonly breakpoints: readonly BreakpointLocation[];\n readonly captures: readonly string[];\n readonly remoteRoot: RemoteRootSetting;\n readonly timeoutMs: number;\n readonly maxValueLength: number;\n readonly condition?: string;\n readonly hitCount?: number;\n readonly stackDepth?: number;\n readonly stackCaptures: readonly string[];\n readonly throwOnSideEffect: boolean;\n}\n\nexport async function handleSnapshot(opts: SnapshotCommandOptions): Promise<void> {\n const target = await resolveTargetWithCurrentCfTarget(opts, { useTimeoutForTunnel: false });\n const prepared = prepareSnapshotCommand(opts, target);\n warnOnCaptureMutationRisk(\n [...prepared.captures, ...prepared.stackCaptures],\n opts.allowMutation === true,\n );\n for (const expression of prepared.setupEvals) {\n warnOnMutationRisk(expression, \"snapshot --setup-eval\");\n }\n const reportProgress = opts.quiet === true ? undefined : writeProgress;\n const result = await withTerminationSignal(async (signal) =>\n await runSnapshotCommand(prepared, opts, reportProgress, signal));\n if (opts.json) {\n writeJson(result);\n } else {\n writeHumanSnapshot(result);\n }\n reportProgress?.(\"Snapshot complete.\");\n}\n\nfunction prepareSnapshotCommand(opts: SnapshotCommandOptions, target: Target): PreparedSnapshotCommand {\n if (opts.bp.length === 0) {\n throw new CfInspectorError(\n \"INVALID_BREAKPOINT\",\n \"At least one --bp <file:line> is required.\",\n );\n }\n const timeoutSec = parsePositiveInt(opts.timeout, \"--timeout\") ?? DEFAULT_BREAKPOINT_TIMEOUT_SEC;\n const maxValueLength = parsePositiveInt(opts.maxValueLength, \"--max-value-length\")\n ?? DEFAULT_MAX_VALUE_LENGTH;\n const condition = opts.condition !== undefined && opts.condition.trim().length > 0\n ? opts.condition.trim()\n : undefined;\n const hitCount = parsePositiveInt(opts.hitCount, \"--hit-count\");\n const stackDepth = parsePositiveInt(opts.stackDepth, \"--stack-depth\");\n const setupEvals = parseSetupEvals(opts.setupEval);\n enforceNativeConditionMutationPolicy(\n condition ?? \"\",\n opts.allowMutation === true,\n \"snapshot --condition\",\n );\n return {\n target,\n setupEvals,\n breakpoints: opts.bp.map((spec) => parseBreakpointSpec(spec)),\n captures: parseCaptureList(opts.capture),\n remoteRoot: parseRemoteRoot(opts.remoteRoot),\n timeoutMs: timeoutSec * 1000,\n ...(condition === undefined ? {} : { condition }),\n maxValueLength,\n ...(hitCount === undefined ? {} : { hitCount }),\n ...(stackDepth === undefined ? {} : { stackDepth }),\n stackCaptures: parseCaptureList(opts.stackCaptures),\n throwOnSideEffect: opts.allowMutation !== true,\n };\n}\n\nasync function runSnapshotCommand(\n command: PreparedSnapshotCommand,\n opts: SnapshotCommandOptions,\n reportProgress?: ProgressReporter,\n signal?: AbortSignal,\n): Promise<SnapshotResult> {\n return await withSessions(command.target, async (group): Promise<SnapshotResult> => {\n if (command.setupEvals.length > 0) {\n const setupCount = command.setupEvals.length;\n reportProgress?.(\n `Running ${setupCount.toString()} setup ${setupCount === 1 ? \"evaluation\" : \"evaluations\"}...`,\n );\n }\n if (command.condition !== undefined) {\n reportProgress?.(\"Validating the breakpoint condition...\");\n }\n const breakpointCount = command.breakpoints.length;\n reportProgress?.(\n `Setting ${breakpointCount.toString()} ${breakpointCount === 1 ? \"breakpoint\" : \"breakpoints\"}...`,\n );\n const fanout = new BreakpointFanout(group, async (session, trackHandle) => {\n await prepareSnapshotSession(session, command);\n return { handles: await setCommandBreakpoints(session, command, trackHandle) };\n });\n let winner: InspectorSession | undefined;\n let preserveWinner = false;\n try {\n const reportArmedSetup = (\n outcomes: Parameters<typeof reportBreakpointOutcomes>[0],\n ): void => {\n if (opts.readyEvent === true && signal?.aborted === true) {\n return;\n }\n if (command.setupEvals.length > 0) {\n reportProgress?.(\"Setup evaluation complete.\");\n }\n if (command.condition !== undefined) {\n reportProgress?.(\"Breakpoint condition is valid.\");\n }\n const setup = reportBreakpointOutcomes(outcomes, reportProgress);\n reportProgress?.(\n `Waiting up to ${(command.timeoutMs / 1000).toString()}s for a breakpoint hit...`,\n );\n if (opts.readyEvent === true && signal?.aborted !== true) {\n writeArmedEvent({\n command: \"snapshot\",\n sessions: setup.sessions,\n resolvedLocations: setup.resolvedLocations,\n timeoutMs: command.timeoutMs,\n });\n }\n };\n if (opts.readyEvent === true) {\n await fanout.ready({\n includeNewSessions: true,\n onReady: reportArmedSetup,\n });\n } else {\n await fanout.ready();\n reportArmedSetup(fanout.availableOutcomes());\n }\n const hit = await fanout.waitForFirst(command.timeoutMs, {\n unmatchedPausePolicy: opts.failOnUnmatchedPause === true ? \"fail\" : \"wait-for-resume\",\n ...(opts.failOnUnmatchedPause === true ? {} : { onUnmatchedPause: warnOnUnmatchedPause }),\n }, signal);\n winner = hit.session;\n const captureCount = command.captures.length;\n reportProgress?.(\n `Breakpoint hit; capturing ${captureCount.toString()} ${captureCount === 1 ? \"expression\" : \"expressions\"}...`,\n );\n const result = await captureSnapshotResult(hit.session, hit.pause, command, opts, reportProgress);\n preserveWinner = opts.keepPaused === true;\n return { ...result, isolate: hit.session.isolate ?? { kind: \"main\" } };\n } catch (error: unknown) {\n if (error instanceof CfInspectorError && (\n error.code === \"BREAKPOINT_NOT_HIT\" || error.code === \"UNRELATED_PAUSE_TIMEOUT\"\n )) {\n const outcomes = fanout.availableOutcomes();\n warnOnBoundBreakpointWithoutHit(outcomes.flatMap((outcome) => outcome.setup.handles));\n }\n throw error;\n } finally {\n const cleanup = await fanout.cleanup(2_000, preserveWinner ? winner : undefined);\n reportProgress?.(\n `Breakpoint cleanup: cleared ${cleanup.cleared.toString()} of ${cleanup.attempted.toString()}; resumed ${cleanup.resumed.toString()} paused losing isolates.`,\n );\n }\n }, reportProgress, signal);\n}\n\nasync function prepareSnapshotSession(\n session: InspectorSession,\n command: PreparedSnapshotCommand,\n): Promise<void> {\n if (command.setupEvals.length > 0) {\n await runSetupEvals(session, command.setupEvals);\n }\n if (command.condition !== undefined) {\n await validateExpression(session, command.condition);\n }\n}\n\nfunction reportBreakpointOutcomes(\n outcomes: readonly {\n readonly session: InspectorSession;\n readonly setup: { readonly handles: readonly Awaited<ReturnType<typeof setBreakpoint>>[] };\n }[],\n reportProgress?: ProgressReporter,\n): BreakpointSetupSummary {\n for (const outcome of outcomes) {\n warnOnUnboundBreakpoints(outcome.setup.handles);\n }\n const boundSessions = outcomes.filter((outcome) =>\n outcome.setup.handles.some((handle) => handle.resolvedLocations.length > 0)).length;\n const locations = outcomes.reduce((total, outcome) => total + outcome.setup.handles.reduce(\n (sessionTotal, handle) => sessionTotal + handle.resolvedLocations.length,\n 0,\n ), 0);\n if (outcomes.length === 1) {\n reportProgress?.(\n `Breakpoint setup complete: ${locations.toString()} resolved ${locations === 1 ? \"location\" : \"locations\"}.`,\n );\n return { sessions: outcomes.length, resolvedLocations: locations };\n }\n reportProgress?.(\n `Breakpoint setup complete: sessions=${outcomes.length.toString()} boundSessions=${boundSessions.toString()} resolvedLocations=${locations.toString()}.`,\n );\n return { sessions: outcomes.length, resolvedLocations: locations };\n}\n\ninterface BreakpointSetupSummary {\n readonly sessions: number;\n readonly resolvedLocations: number;\n}\n\nasync function captureSnapshotResult(\n session: InspectorSession,\n pause: Awaited<ReturnType<typeof waitForPause>>,\n command: PreparedSnapshotCommand,\n opts: SnapshotCommandOptions,\n reportProgress?: ProgressReporter,\n): Promise<SnapshotResult> {\n const pausedStartedAt = pause.receivedAtMs ?? performance.now();\n const snapshot = await captureSnapshot(session, pause, {\n captures: command.captures,\n includeScopes: opts.includeScopes === true,\n maxValueLength: command.maxValueLength,\n ...(command.stackDepth === undefined ? {} : { stackDepth: command.stackDepth }),\n stackCaptures: command.stackCaptures,\n throwOnSideEffect: command.throwOnSideEffect,\n });\n if (opts.keepPaused === true) {\n return withPausedDuration(snapshot, null);\n }\n reportProgress?.(\"Snapshot captured; resuming the target...\");\n return await resumeAfterSnapshot(session, snapshot, pausedStartedAt, reportProgress);\n}\n\nasync function runSnapshotOnSession(\n session: InspectorSession,\n command: PreparedSnapshotCommand,\n opts: SnapshotCommandOptions,\n reportProgress?: ProgressReporter,\n): Promise<SnapshotResult> {\n if (command.setupEvals.length > 0) {\n const setupCount = command.setupEvals.length;\n reportProgress?.(`Running ${setupCount.toString()} setup ${setupCount === 1 ? \"evaluation\" : \"evaluations\"}...`);\n await runSetupEvals(session, command.setupEvals);\n reportProgress?.(\"Setup evaluation complete.\");\n }\n\n if (command.condition !== undefined) {\n reportProgress?.(\"Validating the breakpoint condition...\");\n await validateExpression(session, command.condition);\n reportProgress?.(\"Breakpoint condition is valid.\");\n }\n const breakpointCount = command.breakpoints.length;\n reportProgress?.(\n `Setting ${breakpointCount.toString()} ${breakpointCount === 1 ? \"breakpoint\" : \"breakpoints\"}...`,\n );\n const handles = await setCommandBreakpoints(session, command);\n const resolvedCount = handles.reduce(\n (total, handle) => total + handle.resolvedLocations.length,\n 0,\n );\n reportProgress?.(\n `Breakpoint setup complete: ${resolvedCount.toString()} resolved ${resolvedCount === 1 ? \"location\" : \"locations\"}.`,\n );\n warnOnUnboundBreakpoints(handles);\n reportProgress?.(\n `Waiting up to ${(command.timeoutMs / 1000).toString()}s for a breakpoint hit...`,\n );\n if (opts.readyEvent === true) {\n writeArmedEvent({\n command: \"snapshot\",\n sessions: 1,\n resolvedLocations: resolvedCount,\n timeoutMs: command.timeoutMs,\n });\n }\n const pause = await waitForCommandPause(session, opts, handles, command.timeoutMs);\n const captureCount = command.captures.length;\n reportProgress?.(\n `Breakpoint hit; capturing ${captureCount.toString()} ${captureCount === 1 ? \"expression\" : \"expressions\"}...`,\n );\n const pausedStartedAt = pause.receivedAtMs ?? performance.now();\n const snapshot = await captureSnapshot(session, pause, {\n captures: command.captures,\n includeScopes: opts.includeScopes === true,\n maxValueLength: command.maxValueLength,\n ...(command.stackDepth === undefined ? {} : { stackDepth: command.stackDepth }),\n stackCaptures: command.stackCaptures,\n throwOnSideEffect: command.throwOnSideEffect,\n });\n if (opts.keepPaused === true) {\n reportProgress?.(\"Snapshot captured; leaving the target paused as requested.\");\n return withPausedDuration(snapshot, null);\n }\n reportProgress?.(\"Snapshot captured; resuming the target...\");\n return await resumeAfterSnapshot(session, snapshot, pausedStartedAt, reportProgress);\n}\n\nasync function setCommandBreakpoints(\n session: Parameters<typeof setBreakpoint>[0],\n command: PreparedSnapshotCommand,\n onSet?: (handle: Awaited<ReturnType<typeof setBreakpoint>>) => void,\n): Promise<readonly Awaited<ReturnType<typeof setBreakpoint>>[]> {\n return await Promise.all(\n command.breakpoints.map((bp) =>\n setBreakpoint(session, {\n file: bp.file,\n line: bp.line,\n remoteRoot: command.remoteRoot,\n ...(command.condition === undefined ? {} : { condition: command.condition }),\n ...(command.hitCount === undefined ? {} : { hitCount: command.hitCount }),\n }).then((handle) => {\n onSet?.(handle);\n return handle;\n }),\n ),\n );\n}\n\nasync function waitForCommandPause(\n session: Parameters<typeof waitForPause>[0],\n opts: SnapshotCommandOptions,\n handles: readonly Awaited<ReturnType<typeof setBreakpoint>>[],\n timeoutMs: number,\n): ReturnType<typeof waitForPause> {\n let warnedUnmatchedPause = false;\n try {\n return await waitForPause(session, {\n timeoutMs,\n breakpointIds: handles.map((h) => h.breakpointId),\n unmatchedPausePolicy: opts.failOnUnmatchedPause === true ? \"fail\" : \"wait-for-resume\",\n onUnmatchedPause: (unmatchedPause) => {\n if (warnedUnmatchedPause || opts.failOnUnmatchedPause === true) {\n return;\n }\n warnedUnmatchedPause = true;\n warnOnUnmatchedPause(unmatchedPause);\n },\n });\n } catch (error: unknown) {\n if (\n error instanceof CfInspectorError &&\n (error.code === \"BREAKPOINT_NOT_HIT\" || error.code === \"UNRELATED_PAUSE_TIMEOUT\")\n ) {\n warnOnBoundBreakpointWithoutHit(handles);\n }\n throw error;\n }\n}\n\nasync function resumeAfterSnapshot(\n session: Parameters<typeof resume>[0],\n snapshot: Awaited<ReturnType<typeof captureSnapshot>>,\n pausedStartedAt: number,\n reportProgress?: ProgressReporter,\n): Promise<SnapshotResult> {\n try {\n await resume(session);\n reportProgress?.(\"Target resumed.\");\n return withPausedDuration(snapshot, roundDurationMs(performance.now() - pausedStartedAt));\n } catch {\n process.stderr.write(\n \"[cf-inspector] warning: Debugger.resume failed after snapshot; pausedDurationMs is unknown.\\n\",\n );\n return withPausedDuration(snapshot, null);\n }\n}\n\nfunction parseSetupEvals(raw: unknown): readonly string[] {\n const values: readonly unknown[] = Array.isArray(raw) ? raw : [];\n return values\n .filter((expr): expr is string => typeof expr === \"string\" && expr.trim().length > 0)\n .map((expr) => expr.trim());\n}\n\nexport const internalsForTesting = {\n parseSetupEvals,\n prepareSnapshotCommand,\n runSnapshotCommand,\n runSnapshotOnSession,\n};\n","import { performance } from \"node:perf_hooks\";\nimport process from \"node:process\";\n\nimport { startInspectorKeepalive } from \"../../inspector/discovery.js\";\nimport {\n BreakpointFanout,\n resume,\n runSetupEvals,\n setBreakpoint,\n validateExpression,\n waitForPause,\n} from \"../../inspector/index.js\";\nimport type { InspectorSession, InspectorSessionGroup } from \"../../inspector/types.js\";\nimport { parseBreakpointSpec, parseRemoteRoot } from \"../../pathMapper.js\";\nimport { captureSnapshot } from \"../../snapshot/capture.js\";\nimport { DEFAULT_STREAM_MAX_VALUE_LENGTH } from \"../../snapshot/values.js\";\nimport { CfInspectorError } from \"../../types.js\";\nimport type { BreakpointHandle, BreakpointLocation, RemoteRootSetting, WatchEvent } from \"../../types.js\";\nimport { parseCaptureList } from \"../captureParser.js\";\nimport { DEFAULT_BREAKPOINT_TIMEOUT_SEC } from \"../commandTypes.js\";\nimport type { Target, WatchCommandOptions } from \"../commandTypes.js\";\nimport { writeArmedEvent, writeJson, writeWatchEvent } from \"../output.js\";\nimport { withTerminationSignal } from \"../signals.js\";\nimport { parsePositiveInt, resolveTargetWithCurrentCfTarget, withSessions } from \"../target.js\";\nimport {\n enforceNativeConditionMutationPolicy,\n warnOnBoundBreakpointWithoutHit,\n warnOnCaptureMutationRisk,\n warnOnMutationRisk,\n warnOnUnboundBreakpoints,\n} from \"../warnings.js\";\n\ninterface PreparedWatchCommand {\n readonly target: Target;\n readonly setupEvals: readonly string[];\n readonly breakpoints: readonly BreakpointLocation[];\n readonly captures: readonly string[];\n readonly remoteRoot: RemoteRootSetting;\n readonly perHitTimeoutMs: number;\n readonly durationMs?: number;\n readonly maxEvents?: number;\n readonly maxValueLength: number;\n readonly condition?: string;\n readonly hitCount?: number;\n readonly stackDepth?: number;\n readonly stackCaptures: readonly string[];\n readonly throwOnSideEffect: boolean;\n}\n\ntype WatchStopReason = \"duration\" | \"signal\" | \"max-events\" | \"transport-closed\";\n\nexport async function handleWatch(opts: WatchCommandOptions): Promise<void> {\n const target = await resolveTargetWithCurrentCfTarget(opts, { useTimeoutForTunnel: false });\n const prepared = prepareWatchCommand(opts, target);\n warnOnCaptureMutationRisk(\n [...prepared.captures, ...prepared.stackCaptures],\n opts.allowMutation === true,\n );\n for (const expression of prepared.setupEvals) {\n warnOnMutationRisk(expression, \"watch --setup-eval\");\n }\n let stoppedReason: WatchStopReason = \"signal\";\n let emitted = 0;\n await withTerminationSignal(async (signal) => {\n await withSessions(prepared.target, async (group, port) => {\n const host = prepared.target.kind === \"port\" ? prepared.target.host : \"127.0.0.1\";\n const keepalive = startInspectorKeepalive(host, port);\n const commandAbort = new AbortController();\n const onSignal = (): void => {\n commandAbort.abort();\n };\n signal.addEventListener(\"abort\", onSignal, { once: true });\n let keepaliveError: unknown;\n void keepalive.failure.catch((error: unknown) => {\n keepaliveError = error;\n commandAbort.abort();\n });\n try {\n const result = await runWatchGroup(group, prepared, opts, commandAbort.signal);\n stoppedReason = result.stoppedReason;\n emitted = result.emitted;\n if (keepaliveError !== undefined) {\n throw keepaliveError instanceof Error\n ? keepaliveError\n : new Error(\"Unknown inspector keepalive failure\");\n }\n } finally {\n keepalive.cancel();\n signal.removeEventListener(\"abort\", onSignal);\n }\n }, undefined, signal);\n });\n writeWatchSummary(stoppedReason, emitted, opts.json);\n}\n\nasync function runWatchGroup(\n group: InspectorSessionGroup,\n command: PreparedWatchCommand,\n opts: WatchCommandOptions,\n signal: AbortSignal,\n): Promise<WatchLoopResult> {\n const fanout = new BreakpointFanout(group, async (session, trackHandle) => {\n if (command.setupEvals.length > 0) {\n await runSetupEvals(session, command.setupEvals);\n }\n if (command.condition !== undefined) {\n await validateExpression(session, command.condition);\n }\n const handles = await Promise.all(command.breakpoints.map((bp) =>\n setBreakpoint(session, {\n file: bp.file,\n line: bp.line,\n remoteRoot: command.remoteRoot,\n ...(command.condition === undefined ? {} : { condition: command.condition }),\n ...(command.hitCount === undefined ? {} : { hitCount: command.hitCount }),\n }).then((handle) => {\n trackHandle(handle);\n return handle;\n })));\n warnOnUnboundBreakpoints(handles);\n return { handles };\n });\n let emitted = 0;\n let stoppedReason: WatchStopReason = \"signal\";\n const deadline = computeDeadline(command.durationMs);\n try {\n await fanout.ready(opts.readyEvent === true\n ? {\n includeNewSessions: true,\n onReady: (outcomes) => {\n if (\n signal.aborted ||\n remainingForLoop(deadline, command.perHitTimeoutMs) <= 0\n ) {\n return;\n }\n writeArmedEvent({\n command: \"watch\",\n sessions: outcomes.length,\n resolvedLocations: outcomes.reduce(\n (total, outcome) => total + outcome.setup.handles.reduce(\n (sessionTotal, handle) => sessionTotal + handle.resolvedLocations.length,\n 0,\n ),\n 0,\n ),\n timeoutMs: command.perHitTimeoutMs,\n });\n },\n }\n : {});\n while (!signal.aborted) {\n const remainingMs = remainingForLoop(deadline, command.perHitTimeoutMs);\n if (remainingMs <= 0) {\n stoppedReason = \"duration\";\n break;\n }\n let hit;\n try {\n hit = await fanout.waitForFirst(remainingMs, { unmatchedPausePolicy: \"wait-for-resume\" }, signal);\n } catch (error: unknown) {\n if (error instanceof CfInspectorError && error.code === \"ABORTED\") {\n stoppedReason = \"signal\";\n break;\n }\n if (error instanceof CfInspectorError && (\n error.code === \"BREAKPOINT_NOT_HIT\" || error.code === \"UNRELATED_PAUSE_TIMEOUT\"\n )) {\n if (deadline !== undefined && performance.now() >= deadline) {\n stoppedReason = \"duration\";\n break;\n }\n continue;\n }\n throw error;\n }\n const event = await captureWatchEvent(hit.session, command, hit.pause, emitted + 1, opts);\n emitted += 1;\n writeWatchEvent({ ...event, isolate: hit.session.isolate ?? { kind: \"main\" } }, opts.json);\n try {\n await resume(hit.session);\n hit.session.debuggerState.paused = false;\n } catch {\n process.stderr.write(\"[cf-inspector] warning: Debugger.resume failed during watch.\\n\");\n stoppedReason = \"transport-closed\";\n break;\n }\n if (command.maxEvents !== undefined && emitted >= command.maxEvents) {\n stoppedReason = \"max-events\";\n break;\n }\n }\n if (signal.aborted) {\n stoppedReason = \"signal\";\n }\n } finally {\n const cleanup = await fanout.cleanup();\n process.stderr.write(\n `[cf-inspector] breakpoint cleanup: cleared ${cleanup.cleared.toString()} of ${cleanup.attempted.toString()}; resumed ${cleanup.resumed.toString()} paused isolates.\\n`,\n );\n }\n if (emitted === 0 && (stoppedReason === \"duration\" || stoppedReason === \"signal\")) {\n const outcomes = fanout.availableOutcomes();\n warnOnBoundBreakpointWithoutHit(outcomes.flatMap((outcome) => outcome.setup.handles));\n }\n return { emitted, stoppedReason };\n}\n\nfunction prepareWatchCommand(opts: WatchCommandOptions, target: Target): PreparedWatchCommand {\n if (opts.bp.length === 0) {\n throw new CfInspectorError(\n \"INVALID_BREAKPOINT\",\n \"At least one --bp <file:line> is required.\",\n );\n }\n const perHitTimeoutSec = parsePositiveInt(opts.timeout, \"--timeout\") ?? DEFAULT_BREAKPOINT_TIMEOUT_SEC;\n const durationSec = parsePositiveInt(opts.duration, \"--duration\");\n const maxEvents = parsePositiveInt(opts.maxEvents, \"--max-events\");\n const maxValueLength = parsePositiveInt(opts.maxValueLength, \"--max-value-length\")\n ?? DEFAULT_STREAM_MAX_VALUE_LENGTH;\n const hitCount = parsePositiveInt(opts.hitCount, \"--hit-count\");\n const stackDepth = parsePositiveInt(opts.stackDepth, \"--stack-depth\");\n const condition = opts.condition !== undefined && opts.condition.trim().length > 0\n ? opts.condition.trim()\n : undefined;\n const setupEvals = parseSetupEvals(opts.setupEval);\n enforceNativeConditionMutationPolicy(\n condition ?? \"\",\n opts.allowMutation === true,\n \"watch --condition\",\n );\n return {\n target,\n setupEvals,\n breakpoints: opts.bp.map((spec) => parseBreakpointSpec(spec)),\n captures: parseCaptureList(opts.capture),\n remoteRoot: parseRemoteRoot(opts.remoteRoot),\n perHitTimeoutMs: perHitTimeoutSec * 1000,\n ...(durationSec === undefined ? {} : { durationMs: durationSec * 1000 }),\n ...(maxEvents === undefined ? {} : { maxEvents }),\n maxValueLength,\n ...(condition === undefined ? {} : { condition }),\n ...(hitCount === undefined ? {} : { hitCount }),\n ...(stackDepth === undefined ? {} : { stackDepth }),\n stackCaptures: parseCaptureList(opts.stackCaptures),\n throwOnSideEffect: opts.allowMutation !== true,\n };\n}\n\ninterface WatchLoopResult {\n readonly emitted: number;\n readonly stoppedReason: WatchStopReason;\n}\n\nasync function runWatchLoop(\n session: InspectorSession,\n command: PreparedWatchCommand,\n opts: WatchCommandOptions,\n signal: AbortSignal,\n): Promise<WatchLoopResult> {\n if (command.setupEvals.length > 0) {\n await runSetupEvals(session, command.setupEvals);\n }\n\n if (command.condition !== undefined) {\n await validateExpression(session, command.condition);\n }\n const handles = await Promise.all(\n command.breakpoints.map((bp) =>\n setBreakpoint(session, {\n file: bp.file,\n line: bp.line,\n remoteRoot: command.remoteRoot,\n ...(command.condition === undefined ? {} : { condition: command.condition }),\n ...(command.hitCount === undefined ? {} : { hitCount: command.hitCount }),\n }),\n ),\n );\n warnOnUnboundBreakpoints(handles);\n if (opts.readyEvent === true && !signal.aborted) {\n writeArmedEvent({\n command: \"watch\",\n sessions: 1,\n resolvedLocations: handles.reduce(\n (total, handle) => total + handle.resolvedLocations.length,\n 0,\n ),\n timeoutMs: command.perHitTimeoutMs,\n });\n }\n\n const deadline = computeDeadline(command.durationMs);\n let emitted = 0;\n const state: { stopped: boolean; reason: WatchStopReason } = { stopped: false, reason: \"signal\" };\n\n const setStop = (reason: WatchStopReason): void => {\n if (state.stopped) {\n return;\n }\n state.reason = reason;\n state.stopped = true;\n };\n\n const transportClosed = waitForTransportClose(session);\n transportClosed.promise.then(() => {\n setStop(\"transport-closed\");\n }).catch(() => {\n /* swallowed: best-effort signal */\n });\n\n try {\n while (!state.stopped) {\n if (signal.aborted) {\n setStop(\"signal\");\n break;\n }\n const remainingMs = remainingForLoop(deadline, command.perHitTimeoutMs);\n if (remainingMs <= 0) {\n setStop(\"duration\");\n break;\n }\n const pause = await waitForNextWatchPause(session, handles, remainingMs, signal);\n if (pause === \"signal\") {\n setStop(\"signal\");\n break;\n }\n if (pause === \"timeout\") {\n if (deadline !== undefined && performance.now() >= deadline) {\n setStop(\"duration\");\n break;\n }\n continue;\n }\n const event = await captureWatchEvent(session, command, pause, emitted + 1, opts);\n emitted += 1;\n writeWatchEvent(event, opts.json);\n try {\n await resume(session);\n } catch {\n process.stderr.write(\"[cf-inspector] warning: Debugger.resume failed during watch.\\n\");\n setStop(\"transport-closed\");\n break;\n }\n if (command.maxEvents !== undefined && emitted >= command.maxEvents) {\n setStop(\"max-events\");\n break;\n }\n }\n } finally {\n transportClosed.cancel();\n }\n\n if (emitted === 0 && (state.reason === \"duration\" || state.reason === \"signal\")) {\n warnOnBoundBreakpointWithoutHit(handles);\n }\n return { emitted, stoppedReason: state.reason };\n}\n\nfunction computeDeadline(durationMs: number | undefined): number | undefined {\n if (durationMs === undefined) {\n return undefined;\n }\n return performance.now() + durationMs;\n}\n\nfunction remainingForLoop(deadline: number | undefined, perHitTimeoutMs: number): number {\n if (deadline === undefined) {\n return perHitTimeoutMs;\n }\n const remaining = deadline - performance.now();\n if (remaining <= 0) {\n return 0;\n }\n return Math.min(remaining, perHitTimeoutMs);\n}\n\ninterface TransportClosedHandle {\n readonly promise: Promise<void>;\n cancel(): void;\n}\n\nfunction waitForTransportClose(session: InspectorSession): TransportClosedHandle {\n let cancelled = false;\n let resolve: (() => void) | undefined;\n const promise = new Promise<void>((res) => {\n resolve = res;\n });\n const off = session.client.onClose(() => {\n if (!cancelled) {\n resolve?.();\n }\n });\n return {\n promise,\n cancel: (): void => {\n cancelled = true;\n off();\n resolve?.();\n },\n };\n}\n\nasync function waitForNextWatchPause(\n session: InspectorSession,\n handles: readonly BreakpointHandle[],\n timeoutMs: number,\n signal: AbortSignal,\n): Promise<Awaited<ReturnType<typeof waitForPause>> | \"signal\" | \"timeout\"> {\n if (signal.aborted) {\n return \"signal\";\n }\n try {\n return await waitForPause(session, {\n timeoutMs,\n breakpointIds: handles.map((h) => h.breakpointId),\n unmatchedPausePolicy: \"wait-for-resume\",\n signal,\n });\n } catch (err: unknown) {\n if (err instanceof CfInspectorError) {\n if (err.code === \"ABORTED\") {\n return \"signal\";\n }\n if (err.code === \"BREAKPOINT_NOT_HIT\") {\n return \"timeout\";\n }\n if (err.code === \"UNRELATED_PAUSE_TIMEOUT\") {\n return \"timeout\";\n }\n }\n throw err;\n }\n}\n\nasync function captureWatchEvent(\n session: InspectorSession,\n command: PreparedWatchCommand,\n pause: Awaited<ReturnType<typeof waitForPause>>,\n hit: number,\n opts: WatchCommandOptions,\n): Promise<WatchEvent> {\n const snapshot = await captureSnapshot(session, pause, {\n captures: command.captures,\n includeScopes: opts.includeScopes === true,\n maxValueLength: command.maxValueLength,\n ...(command.stackDepth === undefined ? {} : { stackDepth: command.stackDepth }),\n stackCaptures: command.stackCaptures,\n throwOnSideEffect: command.throwOnSideEffect,\n });\n const at = formatLocation(command, snapshot.topFrame);\n const base: WatchEvent = {\n ts: new Date().toISOString(),\n at,\n hit,\n reason: snapshot.reason,\n hitBreakpoints: snapshot.hitBreakpoints,\n captures: snapshot.captures,\n };\n const withFrame = snapshot.topFrame === undefined ? base : { ...base, topFrame: snapshot.topFrame };\n const withStack = snapshot.stack === undefined ? withFrame : { ...withFrame, stack: snapshot.stack };\n return snapshot.exception === undefined ? withStack : { ...withStack, exception: snapshot.exception };\n}\n\nfunction formatLocation(\n command: PreparedWatchCommand,\n topFrame: { url?: string; line: number } | undefined,\n): string {\n if (topFrame?.url !== undefined) {\n return `${topFrame.url}:${topFrame.line.toString()}`;\n }\n const first = command.breakpoints[0];\n if (first === undefined) {\n return \"(unknown)\";\n }\n return `${first.file}:${first.line.toString()}`;\n}\n\nfunction writeWatchSummary(reason: WatchStopReason, emitted: number, json: boolean): void {\n if (json) {\n process.stderr.write(`${JSON.stringify({ stopped: reason, emitted })}\\n`);\n return;\n }\n process.stderr.write(\n `Stopped (${reason}); emitted ${emitted.toString()} watch ${emitted === 1 ? \"event\" : \"events\"}.\\n`,\n );\n}\n\nfunction parseSetupEvals(raw: unknown): readonly string[] {\n const values: readonly unknown[] = Array.isArray(raw) ? raw : [];\n return values\n .filter((expr): expr is string => typeof expr === \"string\" && expr.trim().length > 0)\n .map((expr) => expr.trim());\n}\n\nexport const internalsForTesting = {\n formatLocation,\n computeDeadline,\n remainingForLoop,\n parseSetupEvals,\n prepareWatchCommand,\n runWatchLoop,\n writeJson,\n};\n"],"mappings":"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","names":["wrapped","process","process","readFileSync","join","request","spawn","homedir","constants","dirname","join","constants","dirname","join","realpathSync","dirname","join","dirname","join","realpathSync","readFileSync","join","readFileSync","join","latest","rmSync","dirname","join","join","dirname","rmSync","defaultRuntime","homedir","spawn","notify","dirname","join","readdir","rm","join","process","fetchJson","process","performance","isRecord","isUnknownRecord","main","performance","constants","mkdir","readFile","readdir","stat","unlink","writeFile","homedir","join","isRecord","processStart","process","process","resolveTarget","process","process","process","process","process","performance","process","performance","performance","performance","performance","out","asString","buildResult","process","performance","process","process","process","formatIsolate","process","randomBytes","HITS_GLOBAL","asString","validateHitCount","asString","process","performance","process","performance","performance","process","performance","process","performance","process","parseSetupEvals","performance","remaining","process","parseSetupEvals","process","process"]}