debuganything 0.0.0-stage → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/.claude-plugin/plugin.json +15 -0
  2. package/DISCLAIMER.md +101 -0
  3. package/GEMINI.md +97 -0
  4. package/LICENSE +21 -0
  5. package/README.md +283 -2
  6. package/assets/README.md +9 -0
  7. package/assets/debuganything-logo.png +0 -0
  8. package/assets/debuganything-mark-512.png +0 -0
  9. package/dist/chunk-32IDKAZK.js +9 -0
  10. package/dist/chunk-32IDKAZK.js.map +1 -0
  11. package/dist/chunk-5BXTDASF.js +135 -0
  12. package/dist/chunk-5BXTDASF.js.map +1 -0
  13. package/dist/chunk-5RAKTYW5.js +292 -0
  14. package/dist/chunk-5RAKTYW5.js.map +1 -0
  15. package/dist/chunk-7MMXFUUN.js +79 -0
  16. package/dist/chunk-7MMXFUUN.js.map +1 -0
  17. package/dist/chunk-D742WJPT.js +436 -0
  18. package/dist/chunk-D742WJPT.js.map +1 -0
  19. package/dist/chunk-EMR42ZJQ.js +102 -0
  20. package/dist/chunk-EMR42ZJQ.js.map +1 -0
  21. package/dist/chunk-MLDOO673.js +1416 -0
  22. package/dist/chunk-MLDOO673.js.map +1 -0
  23. package/dist/chunk-NFL22T3H.js +309 -0
  24. package/dist/chunk-NFL22T3H.js.map +1 -0
  25. package/dist/chunk-STFC7C5C.js +245 -0
  26. package/dist/chunk-STFC7C5C.js.map +1 -0
  27. package/dist/chunk-VGYXHXTY.js +1015 -0
  28. package/dist/chunk-VGYXHXTY.js.map +1 -0
  29. package/dist/chunk-YY6M5RIJ.js +215 -0
  30. package/dist/chunk-YY6M5RIJ.js.map +1 -0
  31. package/dist/cli.js +254 -0
  32. package/dist/cli.js.map +1 -0
  33. package/dist/docker-ORXYMES4.js +23 -0
  34. package/dist/docker-ORXYMES4.js.map +1 -0
  35. package/dist/hook-QYLLBUNK.js +14 -0
  36. package/dist/hook-QYLLBUNK.js.map +1 -0
  37. package/dist/import-CT55AEEE.js +268 -0
  38. package/dist/import-CT55AEEE.js.map +1 -0
  39. package/dist/investigate-2GFD6EWB.js +102 -0
  40. package/dist/investigate-2GFD6EWB.js.map +1 -0
  41. package/dist/lsof-GBLZJBJR.js +22 -0
  42. package/dist/lsof-GBLZJBJR.js.map +1 -0
  43. package/dist/psmem-UB3VCMG3.js +20 -0
  44. package/dist/psmem-UB3VCMG3.js.map +1 -0
  45. package/dist/report_html-2ENM7HLC.js +99 -0
  46. package/dist/report_html-2ENM7HLC.js.map +1 -0
  47. package/dist/server.js +190 -0
  48. package/dist/server.js.map +1 -0
  49. package/dist/setup-NTPRUTMT.js +265 -0
  50. package/dist/setup-NTPRUTMT.js.map +1 -0
  51. package/dist/target-WJE4WFYA.js +36 -0
  52. package/dist/target-WJE4WFYA.js.map +1 -0
  53. package/gemini-extension.json +9 -0
  54. package/hooks/debuganything-hook.mjs +36 -0
  55. package/hooks/hooks.json +10 -0
  56. package/package.json +85 -3
  57. package/server.json +30 -0
  58. package/skills/debug-anything/SKILL.md +102 -0
  59. package/skills/inspect-product/SKILL.md +138 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tools.ts","../src/readiness.ts","../src/adapters/heap_node.ts","../src/adapters/bpftrace.ts","../src/adapters/index.ts","../src/diff.ts","../src/report.ts"],"sourcesContent":["/**\n * Tool dispatcher shared by the MCP server and the CLI.\n * Core tools (readiness, attach, detach, list_processes, diff_runs, report)\n * live here; everything else goes to the highest-priority ready adapter.\n */\nimport { join } from \"node:path\";\nimport { writeFile } from \"node:fs/promises\";\nimport { ToolArgs, type Readiness, type Session, type Target, type ToolResult } from \"./contracts.js\";\nimport { ResultBuilder, failedResult } from \"./evidence.js\";\nimport { probeReadiness } from \"./readiness.js\";\nimport { createSession, detachSession, loadRun, recordRun, requireAttached, saveSession, loadSession, platform } from \"./session.js\";\nimport { listProcesses, resolveTarget } from \"./target.js\";\nimport { requireConsent, ConsentRequiredError } from \"./safety.js\";\nimport { candidatesFor } from \"./adapters/index.js\";\nimport { diffRuns } from \"./diff.js\";\nimport { renderReport } from \"./report.js\";\n\nconst NO_TARGET: Target = { kind: \"pid\", id: \"-\", host: \"local\" };\n\nlet readinessCache: { at: number; value: Readiness } | null = null;\nexport async function cachedReadiness(maxAgeMs = 30_000): Promise<Readiness> {\n if (readinessCache && Date.now() - readinessCache.at < maxAgeMs) return readinessCache.value;\n const value = await probeReadiness();\n readinessCache = { at: Date.now(), value };\n return value;\n}\n\nexport const TOOL_DESCRIPTIONS: Record<keyof typeof ToolArgs, string> = {\n readiness: \"Report OS, arch, which providers (strace, py-spy, perf, lsof, tcpdump, gdb/lldb, docker...) are usable, what is missing and how to install it, and permission status (ptrace_scope, sudo, SIP). Always call this first.\",\n attach: \"Resolve a target (pid, container, k8s pod, or a command to spawn under capture) and open a session. Returns session_id used by every other tool. Read-only: nothing is modified.\",\n detach: \"Stop any running captures for the session, finalize the report, keep artifacts under ~/.debuganything/sessions/<id>/.\",\n list_processes: \"ps-style list (pid, comm, cpu, mem, user, container) for picking a target. Optional substring filter.\",\n trace_syscalls: \"Linux strace of the target for N seconds: top syscalls by total time and count, slowest individual calls, error counts (ENOENT/EAGAIN/ECONNREFUSED...), blocked waits. Raw log saved as artifact.\",\n profile_cpu: \"CPU profile for N seconds: py-spy (Python), perf (native/Node on Linux), sample (macOS). Returns top frames (self/total), hottest stacks, flamegraph.svg artifact.\",\n dump_stacks: \"Instant snapshot of every thread's stack (py-spy dump / gdb / lldb / Node inspector). The key tool for hangs and deadlocks; flags threads waiting on the same lock.\",\n inspect_sockets: \"lsof/ss view of the target: listening ports, established connections grouped by remote, states (CLOSE_WAIT pileups, TIME_WAIT counts), fd count vs ulimit.\",\n inspect_files: \"Open file descriptors by type, growth over a short window, largest open files, deleted-but-open files (disk full but nothing there).\",\n capture_traffic: \"tcpdump scoped to the target's ports for N seconds (max 30). Per-remote bytes/packets, retransmits, RSTs, DNS queries, TLS SNI. .pcap artifact. REQUIRES consent: true — ask the user first.\",\n snapshot_memory: \"RSS/VSZ sampled over a window; Node: heap snapshot with top retainers by retained size; Python: py-spy dump with locals. Take two and diff_runs them to find what grows.\",\n diff_runs: \"Diff two prior runs of the same tool in this session (e.g. snapshot_memory#1 vs snapshot_memory#2, profile_cpu#1 vs #2): what grew, appeared, disappeared.\",\n container_info: \"docker inspect/stats/top/logs tail for the target container, host pid mapping, cgroup limits: throttled? OOM-killed before? restarts?\",\n report: \"Markdown report of the whole session: findings, evidence excerpts, artifact paths. Optionally written to a file.\",\n import_artifact: \"Analyze raw tool output you captured yourself (e.g. `sudo strace …`, `sudo fs_usage …`, `perf script`, `py-spy dump`, `lsof -F`, `tcpdump -nn -tt -r`) and turn it into the same evidence and findings Debug Anything would produce. Use when Debug Anything could not run the tool (no root, macOS).\",\n};\n\nexport async function runTool(name: string, rawArgs: Record<string, unknown>): Promise<ToolResult> {\n const schema = (ToolArgs as Record<string, (typeof ToolArgs)[keyof typeof ToolArgs]>)[name];\n if (!schema) return failedResult(name, null, NO_TARGET, `unknown tool: ${name}`);\n const parsed = schema.safeParse(rawArgs);\n if (!parsed.success) {\n return failedResult(name, null, NO_TARGET, `invalid arguments: ${parsed.error.issues.map((i) => `${i.path.join(\".\") || \"(root)\"}: ${i.message}`).join(\"; \")}`);\n }\n const args = parsed.data as Record<string, unknown>;\n try {\n switch (name) {\n case \"readiness\":\n return await toolReadiness();\n case \"attach\":\n return await toolAttach(args as { target: string; kind?: Target[\"kind\"] });\n case \"detach\":\n return await toolDetach(args as { session_id: string });\n case \"list_processes\":\n return await toolListProcesses(args as { filter?: string; limit: number });\n case \"diff_runs\":\n return await toolDiffRuns(args as { session_id: string; a: string; b: string });\n case \"report\":\n return await toolReport(args as { session_id: string; out?: string; html?: boolean });\n case \"import_artifact\": {\n const session = await loadSession(String(args.session_id));\n const { importArtifact } = await import(\"./import.js\");\n return await recordRun(session, await importArtifact(session, args as { tool: import(\"./contracts.js\").ImportTool; path: string; duration_s?: number }));\n }\n default:\n return await dispatchAdapter(name, args);\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n const sessionId = typeof args.session_id === \"string\" ? args.session_id : \"\";\n const limitations = err instanceof ConsentRequiredError ? [\"consent required — ask the user, then pass consent: true\"] : [];\n const r = failedResult(name, null, NO_TARGET, msg, limitations);\n return { ...r, session_id: sessionId };\n }\n}\n\nasync function toolReadiness(): Promise<ToolResult> {\n const r = await probeReadiness();\n readinessCache = { at: Date.now(), value: r };\n const b = new ResultBuilder(\"readiness\", null, NO_TARGET);\n const sys = b.evidenceOf(\"readiness\", `${r.os}/${r.arch} node=${r.node} root=${r.is_root} sudo-n=${r.has_sudo_noninteractive} ptrace_scope=${r.permissions.ptrace_scope ?? \"n/a\"} sip=${r.permissions.sip_enabled ?? \"n/a\"}`, {\n os: r.os,\n arch: r.arch,\n kernel: r.kernel,\n node: r.node,\n dea_version: r.dea_version,\n is_root: r.is_root,\n has_sudo_noninteractive: r.has_sudo_noninteractive,\n permissions: r.permissions,\n sessions_dir: r.sessions_dir,\n });\n const prov = b.evidenceOf(\n \"readiness\",\n `${r.providers.filter((p) => p.status === \"ready\").length}/${r.providers.length} providers ready: ${r.providers.map((p) => `${p.name}=${p.status}`).join(\" \")}`,\n r.providers,\n );\n const tools = b.evidenceOf(\"readiness\", `tools available: ${r.tools_available.join(\", \")}`, { available: r.tools_available, unavailable: r.tools_unavailable });\n b.finding(\"info\", `${r.tools_available.length} of 14 tools available on ${r.os}`, [tools, prov]);\n for (const u of r.tools_unavailable) b.limitation(`${u.tool}: ${u.reason}`);\n if (r.os === \"linux\" && r.permissions.ptrace_scope !== null && r.permissions.ptrace_scope >= 1 && !r.is_root) {\n b.finding(\"warn\", `ptrace_scope=${r.permissions.ptrace_scope}: strace/gdb/py-spy can only attach to your own child processes without root`, [sys], \"observed\", \"Fix for this boot: sudo sysctl kernel.yama.ptrace_scope=0 (Debug Anything will not run this for you)\");\n }\n if (r.os === \"linux\" && r.permissions.perf_event_paranoid !== null && r.permissions.perf_event_paranoid > 1 && !r.is_root) {\n b.finding(\"warn\", `perf_event_paranoid=${r.permissions.perf_event_paranoid}: perf cannot profile other users' processes without root`, [sys], \"observed\", \"Fix for this boot: sudo sysctl kernel.perf_event_paranoid=1\");\n }\n if (r.os === \"darwin\" && !r.is_root) {\n b.limitation(\"macOS: attaching py-spy/lldb/sample to processes you did not start usually needs sudo; tcpdump always needs sudo or membership in the access_bpf group\");\n }\n if (r.os === \"win32\") b.limitation(\"Windows is not supported yet (planned: ETW / procdump based adapters)\");\n b.next(\"list_processes\", \"attach\");\n return b.build();\n}\n\nasync function toolAttach(args: { target: string; kind?: Target[\"kind\"] }): Promise<ToolResult> {\n if (platform() === \"win32\") return failedResult(\"attach\", null, NO_TARGET, \"Windows is not supported yet\");\n // For commands we need the session dir before spawning so output can be tee'd.\n const isCommand = (args.kind ?? (await import(\"./target.js\")).guessKind(args.target)) === \"command\";\n let target: Target;\n let session;\n if (isCommand) {\n session = await createSession({ kind: \"command\", id: args.target, host: \"local\" });\n const spawned = await (await import(\"./target.js\")).spawnCommand(args.target, session.dir);\n const { spawned: sp, ...t } = spawned;\n target = t;\n session.target = target;\n session.spawned = sp;\n await saveSession(session);\n } else {\n target = await resolveTarget(args.target, { kind: args.kind });\n session = await createSession(target);\n }\n const b = new ResultBuilder(\"attach\", session, target);\n const ev = b.evidenceOf(\"process\", `attached to ${target.kind} ${target.id}: pid=${target.pid ?? \"?\"} comm=${target.comm ?? \"?\"} runtime=${target.runtime ?? \"?\"} children=${target.pids?.length ?? 0}`, target);\n b.finding(\"info\", `session ${session.id} attached to pid ${target.pid ?? \"?\"} (${target.comm ?? \"unknown\"}, runtime ${target.runtime ?? \"unknown\"})`, [ev]);\n if (!target.pid) b.limitation(\"no host pid for this target on this platform; pid-based tools (strace, py-spy, gdb, lsof) will not work. container_info still works.\");\n if (session.spawned) b.limitation(`spawned command; stdout/stderr tee'd to ${session.spawned.stdout} and ${session.spawned.stderr}`);\n const readiness = await cachedReadiness();\n const next = [\"inspect_sockets\", \"inspect_files\", \"dump_stacks\", \"profile_cpu\", \"snapshot_memory\", \"trace_syscalls\", \"container_info\"].filter((t) => readiness.tools_available.includes(t));\n if (target.kind !== \"container\" && target.kind !== \"pod\") next.splice(next.indexOf(\"container_info\"), next.includes(\"container_info\") ? 1 : 0);\n b.next(...next, \"detach\");\n const result = b.build();\n return recordRun(session, result);\n}\n\nasync function toolDetach(args: { session_id: string }): Promise<ToolResult> {\n const session = await loadSession(args.session_id);\n await detachSession(session);\n const b = new ResultBuilder(\"detach\", session, session.target);\n const md = await renderReport(session);\n const reportPath = join(session.dir, \"report.md\");\n await writeFile(reportPath, md);\n await b.addArtifact(reportPath, \"markdown\", { description: \"session report\" });\n const ev = b.evidenceOf(\"note\", `session ${session.id} detached after ${session.runs.length} run(s); report at ${reportPath}`, { runs: session.runs.map((r) => r.run_id), report: reportPath });\n b.finding(\"info\", `detached; ${session.runs.length} run(s) kept under ${session.dir}`, [ev]);\n return b.build();\n}\n\nasync function toolListProcesses(args: { filter?: string; limit: number }): Promise<ToolResult> {\n const b = new ResultBuilder(\"list_processes\", null, NO_TARGET);\n const procs = await listProcesses(args.filter, args.limit);\n const ev = b.evidenceOf(\n \"process_list\",\n `${procs.length} process(es)${args.filter ? ` matching \"${args.filter}\"` : \"\"}, sorted by cpu then rss`,\n procs.map((p) => ({ pid: p.pid, ppid: p.ppid, user: p.user, cpu: p.cpu, mem: p.mem, rss_kb: p.rss_kb, comm: p.comm, args: p.args.slice(0, 160), container: p.container })),\n );\n if (procs.length === 0) b.finding(\"info\", `no processes match \"${args.filter ?? \"\"}\"`, [ev]);\n else {\n const top = procs[0]!;\n b.finding(\"info\", `top by cpu: pid ${top.pid} ${top.comm} (${top.cpu}% cpu, ${Math.round(top.rss_kb / 1024)} MB rss)`, [ev]);\n }\n b.next(\"attach\");\n return b.build();\n}\n\n/** Resolve \"ref\" or \"<other_session>:<ref>\" — the latter reads a baseline run from another session. */\nasync function loadRunRef(session: Session, ref: string): Promise<{ run: ToolResult; from?: string }> {\n const m = ref.match(/^([\\w-]{6,}):(.+)$/);\n if (m) {\n const other = await loadSession(m[1]!);\n return { run: await loadRun(other, m[2]!), from: other.id };\n }\n return { run: await loadRun(session, ref) };\n}\n\nasync function toolDiffRuns(args: { session_id: string; a: string; b: string }): Promise<ToolResult> {\n const session = await loadSession(args.session_id);\n const [ra, rb] = await Promise.all([loadRunRef(session, args.a), loadRunRef(session, args.b)]);\n const result = await diffRuns(session, ra.run, rb.run);\n if (ra.from || rb.from) result.limitations.push(`cross-session diff: a=${ra.from ?? session.id}, b=${rb.from ?? session.id} — a healthy baseline vs this run; environment may differ between sessions`);\n return recordRun(session, result);\n}\n\nasync function toolReport(args: { session_id: string; out?: string; html?: boolean }): Promise<ToolResult> {\n const session = await loadSession(args.session_id);\n const md = await renderReport(session);\n const b = new ResultBuilder(\"report\", session, session.target);\n const path = join(session.dir, \"report.md\");\n await writeFile(path, md);\n await b.addArtifact(path, \"markdown\", { description: \"session report\" });\n if (args.html) {\n const { renderHtmlReport } = await import(\"./report_html.js\");\n const htmlPath = args.out ? args.out.replace(/\\.(md|html)$/, \"\") + \".html\" : join(session.dir, \"report.html\");\n await writeFile(htmlPath, await renderHtmlReport(session));\n await b.addArtifact(htmlPath, \"log\", { description: \"self-contained HTML report (shareable)\" });\n }\n if (args.out) {\n await writeFile(args.out, md);\n await b.addArtifact(args.out, \"markdown\", { description: \"copy of session report\" });\n }\n const allFindings = [] as Array<{ run: string; severity: string; summary: string }>;\n for (const r of session.runs) {\n try {\n const tr = await loadRun(session, r.run_id);\n for (const f of tr.findings) allFindings.push({ run: r.run_id, severity: f.severity, summary: f.summary });\n } catch {\n /* ignore */\n }\n }\n const ev = b.evidenceOf(\"note\", `report with ${allFindings.length} finding(s) across ${session.runs.length} run(s)`, { findings: allFindings.slice(0, 50), markdown_preview: md.slice(0, 3000) });\n b.finding(\"info\", `report written to ${path}`, [ev]);\n return b.build();\n}\n\nasync function dispatchAdapter(tool: string, args: Record<string, unknown>): Promise<ToolResult> {\n const session = await requireAttached(String(args.session_id));\n requireConsent(tool, args as { consent?: boolean });\n const readiness = await cachedReadiness();\n const { ready, blocked } = candidatesFor(tool, session.target, readiness);\n if (ready.length === 0) {\n const reasons = blocked.map((c) => `${c.adapter.name}: ${c.reason}`);\n const r = failedResult(tool, session, session.target, `no ready adapter for ${tool} on ${readiness.os}${session.target.runtime ? ` (runtime ${session.target.runtime})` : \"\"}`, reasons.length ? reasons : [\"no adapter declares this tool for this platform\"], [\"readiness\"]);\n return recordRun(session, r);\n }\n let last: ToolResult | undefined;\n for (const adapter of ready) {\n const result = await adapter.run(tool, args, { session, target: session.target, readiness });\n last = result;\n if (result.ok) break;\n // Try the next adapter only on \"can't serve\" style failures, not on genuine measured failures.\n if (!/cannot attach|not supported|requires|unsupported|needs/i.test(result.error ?? \"\")) break;\n }\n return recordRun(session, last!);\n}\n","/**\n * Readiness: probe OS, tools on PATH, and permissions. Always works.\n */\nimport { readFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { delimiter, join } from \"node:path\";\nimport { arch, release } from \"node:os\";\nimport { execa } from \"execa\";\nimport type { ProviderReadiness, Readiness, ToolName } from \"./contracts.js\";\nimport { ToolName as ToolNameSchema } from \"./contracts.js\";\nimport { adapters } from \"./adapters/index.js\";\nimport { isRoot } from \"./safety.js\";\nimport { platform, sessionsDir } from \"./session.js\";\nimport { VERSION } from \"./version.js\";\n\nexport function which(binary: string): string | null {\n const paths = (process.env.PATH ?? \"\").split(delimiter).filter(Boolean);\n const extra = platform() === \"darwin\" ? [\"/usr/sbin\", \"/sbin\", \"/opt/homebrew/bin\", \"/usr/local/bin\"] : [\"/usr/sbin\", \"/sbin\", \"/usr/local/bin\"];\n for (const p of [...paths, ...extra]) {\n const full = join(p, binary);\n if (existsSync(full)) return full;\n }\n return null;\n}\n\nasync function readIntFile(path: string): Promise<number | null> {\n try {\n const v = parseInt((await readFile(path, \"utf8\")).trim(), 10);\n return Number.isFinite(v) ? v : null;\n } catch {\n return null;\n }\n}\n\nasync function sudoNonInteractive(): Promise<boolean> {\n if (!which(\"sudo\")) return false;\n try {\n const r = await execa(\"sudo\", [\"-n\", \"true\"], { reject: false, timeout: 3000 });\n return r.exitCode === 0;\n } catch {\n return false;\n }\n}\n\nasync function sipEnabled(): Promise<boolean | null> {\n if (platform() !== \"darwin\") return null;\n try {\n const r = await execa(\"csrutil\", [\"status\"], { reject: false, timeout: 3000 });\n if (/enabled/i.test(r.stdout)) return true;\n if (/disabled/i.test(r.stdout)) return false;\n return null;\n } catch {\n return null;\n }\n}\n\nasync function developerMode(): Promise<boolean | null> {\n if (platform() !== \"darwin\") return null;\n try {\n const r = await execa(\"DevToolsSecurity\", [\"-status\"], { reject: false, timeout: 3000 });\n if (/enabled/i.test(r.stdout)) return true;\n if (/disabled/i.test(r.stdout)) return false;\n return null;\n } catch {\n return null;\n }\n}\n\nasync function linuxCapabilities(): Promise<string[]> {\n if (platform() !== \"linux\") return [];\n try {\n const status = await readFile(\"/proc/self/status\", \"utf8\");\n const m = /CapEff:\\s*([0-9a-f]+)/i.exec(status);\n if (!m) return [];\n const eff = BigInt(\"0x\" + m[1]!);\n const caps: string[] = [];\n if (eff & (1n << 19n)) caps.push(\"CAP_SYS_PTRACE\");\n if (eff & (1n << 13n)) caps.push(\"CAP_NET_RAW\");\n if (eff & (1n << 12n)) caps.push(\"CAP_NET_ADMIN\");\n if (eff & (1n << 21n)) caps.push(\"CAP_SYS_ADMIN\");\n if (eff & (1n << 38n)) caps.push(\"CAP_PERFMON\");\n if (eff & (1n << 39n)) caps.push(\"CAP_BPF\");\n return caps;\n } catch {\n return [];\n }\n}\n\nexport async function probeReadiness(): Promise<Readiness> {\n const os = platform();\n const root = isRoot();\n const [ptraceScope, perfParanoid, sudo, sip, dev, caps] = await Promise.all([\n os === \"linux\" ? readIntFile(\"/proc/sys/kernel/yama/ptrace_scope\") : Promise.resolve(null),\n os === \"linux\" ? readIntFile(\"/proc/sys/kernel/perf_event_paranoid\") : Promise.resolve(null),\n sudoNonInteractive(),\n sipEnabled(),\n developerMode(),\n linuxCapabilities(),\n ]);\n\n const providers: ProviderReadiness[] = [];\n for (const a of adapters) {\n const requires = a.requires.map((b) => ({ binary: b, path: which(b) }));\n const missing = requires.filter((r) => !r.path).map((r) => r.binary);\n let status: ProviderReadiness[\"status\"] = \"ready\";\n const notes: string[] = [];\n if (!a.platforms.includes(os)) status = \"unsupported_platform\";\n else if (a.tools.length === 0) status = \"not_implemented\";\n else if (missing.length) status = \"missing\";\n let base: ProviderReadiness = {\n name: a.name,\n tools: a.tools,\n status,\n requires,\n install_hint: status === \"missing\" ? a.install?.[os] : undefined,\n notes,\n };\n if (a.check && status === \"ready\") {\n base = await a.check(base, { platform: os, isRoot: root, ptraceScope, perfParanoid });\n }\n if (a.runtimes?.length) base.notes.push(`serves ${a.runtimes.join(\"/\")} targets`);\n providers.push(base);\n }\n\n const available = new Set<string>();\n const unavailable = new Map<string, string>();\n for (const t of ToolNameSchema.options as ToolName[]) {\n if ([\"readiness\", \"attach\", \"detach\", \"list_processes\", \"diff_runs\", \"report\", \"import_artifact\"].includes(t)) {\n available.add(t);\n continue;\n }\n const serving = providers.filter((p) => p.tools.includes(t));\n if (serving.some((p) => p.status === \"ready\")) available.add(t);\n else {\n const reasons = serving.map((p) => `${p.name}: ${p.status}${p.install_hint ? ` (${p.install_hint})` : \"\"}`);\n unavailable.set(t, reasons.join(\"; \") || \"no adapter on this platform\");\n }\n }\n\n return {\n os,\n arch: arch(),\n kernel: release(),\n node: process.version,\n dea_version: VERSION,\n is_root: root,\n has_sudo_noninteractive: sudo,\n permissions: {\n ptrace_scope: ptraceScope,\n capabilities: caps,\n sip_enabled: sip,\n developer_mode: dev,\n perf_event_paranoid: perfParanoid,\n },\n providers,\n tools_available: [...available],\n tools_unavailable: [...unavailable].map(([tool, reason]) => ({ tool, reason })),\n sessions_dir: sessionsDir(),\n };\n}\n","/**\n * Node heap adapter: snapshot_memory for Node targets via the inspector\n * protocol. If the target was not started with --inspect, we send SIGUSR1\n * (Node's documented \"activate inspector\" signal), connect over WebSocket to\n * 127.0.0.1:9229, take a HeapProfiler.takeHeapSnapshot, and summarize the top\n * retainers by retained size. The inspector stays enabled on the target\n * afterwards (documented limitation). dump_stacks for Node also uses the\n * inspector (Debugger.pause → call frames) when available.\n */\nimport { createWriteStream } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport type { Adapter, AdapterContext } from \"./types.js\";\nimport type { ToolResult } from \"../contracts.js\";\nimport { ResultBuilder, humanBytes } from \"../evidence.js\";\nimport { runCapped } from \"../safety.js\";\nimport { snapshotMemoryGeneric } from \"./psmem.js\";\nimport { mergeResults } from \"./pyspy.js\";\nimport { targetPids } from \"../target.js\";\n\n// ---------------------------------------------------------------------------\n// Heap snapshot parsing (pure, streaming-free; snapshots up to a few hundred MB)\n// ---------------------------------------------------------------------------\n\nexport interface HeapSummary {\n node_count: number;\n edge_count: number;\n total_size: number;\n byType: Array<{ type: string; count: number; self_size: number }>;\n byName: Array<{ name: string; type: string; count: number; self_size: number }>;\n topRetained: Array<{ name: string; type: string; retained_bytes: number; self_size: number; retainer?: string; idx?: number }>;\n}\n\ninterface HeapSnapshot {\n snapshot: { meta: { node_fields: string[]; node_types: Array<string[] | string>; edge_fields: string[]; edge_types: Array<string[] | string> }; node_count: number; edge_count: number };\n nodes: number[];\n edges: number[];\n strings: string[];\n}\n\n/**\n * Summarize a V8 .heapsnapshot: aggregate by constructor/type (self size) and\n * compute retained size with a dominator-ish approximation (sum of self sizes\n * in a DFS over \"strong\" edges from the top N largest nodes). Pure.\n */\nexport function summarizeHeapSnapshot(json: string, topN = 15): HeapSummary {\n const snap = JSON.parse(json) as HeapSnapshot;\n const nf = snap.snapshot.meta.node_fields;\n const ef = snap.snapshot.meta.edge_fields;\n const nodeTypes = snap.snapshot.meta.node_types[0] as string[];\n const edgeTypes = snap.snapshot.meta.edge_types[0] as string[];\n const NF = nf.length;\n const EF = ef.length;\n const iType = nf.indexOf(\"type\");\n const iName = nf.indexOf(\"name\");\n const iSize = nf.indexOf(\"self_size\");\n const iEdges = nf.indexOf(\"edge_count\");\n const eType = ef.indexOf(\"type\");\n const eName = ef.indexOf(\"name_or_index\");\n const eTo = ef.indexOf(\"to_node\");\n const nodes = snap.nodes;\n const edges = snap.edges;\n const strings = snap.strings;\n const n = nodes.length / NF;\n\n // First edge index per node.\n const firstEdge = new Uint32Array(n + 1);\n for (let i = 0, e = 0; i < n; i++) {\n firstEdge[i] = e;\n e += nodes[i * NF + iEdges]! * EF;\n }\n firstEdge[n] = edges.length;\n\n const byType = new Map<string, { count: number; self_size: number }>();\n const byName = new Map<string, { type: string; count: number; self_size: number }>();\n let total = 0;\n for (let i = 0; i < n; i++) {\n const t = nodeTypes[nodes[i * NF + iType]!] ?? \"?\";\n const nm = strings[nodes[i * NF + iName]!] ?? \"?\";\n const s = nodes[i * NF + iSize]!;\n total += s;\n const bt = byType.get(t) ?? { count: 0, self_size: 0 };\n bt.count++;\n bt.self_size += s;\n byType.set(t, bt);\n const key = t === \"object\" || t === \"closure\" || t === \"array\" ? nm : `(${t})`;\n const bn = byName.get(key) ?? { type: t, count: 0, self_size: 0 };\n bn.count++;\n bn.self_size += s;\n byName.set(key, bn);\n }\n\n // Exact retained size for a bounded candidate set: retained(c) = |reachable(root)| − |reachable(root) without c|\n // (the set c dominates). One BFS per candidate over strong edges; ~100k nodes × ~60 candidates stays well under a second.\n const weakIdx = edgeTypes.indexOf(\"weak\");\n const shortcutIdx = edgeTypes.indexOf(\"shortcut\");\n const traversable = (etIdx: number) => etIdx !== weakIdx && etIdx !== shortcutIdx;\n const strong = new Set([\"property\", \"element\", \"internal\", \"hidden\", \"shortcut\", \"context\"].map((t) => edgeTypes.indexOf(t)).filter((i) => i >= 0));\n const typeOf = (i: number) => nodeTypes[nodes[i * NF + iType]!] ?? \"?\";\n const nameOf = (i: number) => strings[nodes[i * NF + iName]!] ?? \"?\";\n const reach = (skip: number): { count: number; bytes: number } => {\n const visited = new Uint8Array(n);\n const queue = new Int32Array(n);\n let head = 0;\n let tail = 0;\n queue[tail++] = 0;\n visited[0] = 1;\n let bytes = 0;\n let count = 0;\n while (head < tail) {\n const i = queue[head++]!;\n count++;\n bytes += nodes[i * NF + iSize]!;\n for (let e = firstEdge[i]!; e < firstEdge[i + 1]!; e += EF) {\n if (!traversable(edges[e + eType]!)) continue;\n const to = edges[e + eTo]! / NF;\n if (to === skip || visited[to]) continue;\n visited[to] = 1;\n queue[tail++] = to;\n }\n }\n return { count, bytes };\n };\n const full = reach(-1);\n const candidates = new Set<number>();\n const bySelf = Array.from({ length: n }, (_, i) => i).sort((a, b) => nodes[b * NF + iSize]! - nodes[a * NF + iSize]!).slice(0, 30);\n for (const i of bySelf) candidates.add(i);\n // Nodes with the most outgoing edges (big arrays/maps holding many objects).\n const byEdges = Array.from({ length: n }, (_, i) => i).sort((a, b) => nodes[b * NF + iEdges]! - nodes[a * NF + iEdges]!).slice(0, 30);\n for (const i of byEdges) candidates.add(i);\n\n const retained: HeapSummary[\"topRetained\"] = [];\n // Internal backing stores (\"(object elements)\", \"(array)\", shapes, code) are always owned by a visible\n // object that we would list anyway; skip them so the top list names things a developer recognizes.\n const skipTypes = new Set([\"synthetic\", \"hidden\", \"array\", \"code\", \"object shape\", \"number\", \"bigint\", \"symbol\", \"regexp\"]);\n for (const start of candidates) {\n if (start === 0 || skipTypes.has(typeOf(start))) continue;\n if (nameOf(start).startsWith(\"(\") && typeOf(start) !== \"native\") continue;\n const without = reach(start);\n const sum = Math.max(nodes[start * NF + iSize]!, full.bytes - without.bytes);\n retained.push({ name: nameOf(start).slice(0, 80) || `(${typeOf(start)})`, type: typeOf(start), retained_bytes: sum, self_size: nodes[start * NF + iSize]!, idx: start });\n }\n // Retainer for top entries: the first incoming strong edge, preferring named (property/context) edges.\n retained.sort((a, b) => b.retained_bytes - a.retained_bytes);\n const top = retained.slice(0, topN);\n const wanted = new Map<number, HeapSummary[\"topRetained\"][number]>();\n for (const r of top) if (r.idx !== undefined) wanted.set(r.idx, r);\n const best = new Map<number, { score: number; label: string }>();\n for (let i = 0; i < n && wanted.size; i++) {\n for (let e = firstEdge[i]!; e < firstEdge[i + 1]!; e += EF) {\n const to = edges[e + eTo]! / NF;\n const r = wanted.get(to);\n if (!r) continue;\n const etIdx = edges[e + eType]!;\n if (!strong.has(etIdx)) continue;\n const et = edgeTypes[etIdx];\n const en = et === \"element\" || et === \"hidden\" ? `[${edges[e + eName]}]` : strings[edges[e + eName]!] ?? \"?\";\n const ownerName = nameOf(i) || `(${typeOf(i)})`;\n const score = (et === \"context\" ? 3 : et === \"property\" ? 2 : et === \"internal\" ? 1 : 0) + (ownerName.startsWith(\"(\") ? 0 : 1);\n const prev = best.get(to);\n if (!prev || score > prev.score) best.set(to, { score, label: `${ownerName.slice(0, 40)}.${en}` });\n }\n }\n for (const r of top) if (r.idx !== undefined) r.retainer = best.get(r.idx)?.label;\n for (const r of top) delete r.idx;\n return {\n node_count: n,\n edge_count: edges.length / EF,\n total_size: total,\n byType: [...byType].map(([type, v]) => ({ type, ...v })).sort((a, b) => b.self_size - a.self_size),\n byName: [...byName]\n .map(([name, v]) => ({ name, ...v }))\n .sort((a, b) => b.self_size - a.self_size)\n .slice(0, 25),\n topRetained: top,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Inspector client (minimal, no deps: Node 22 has global WebSocket)\n// ---------------------------------------------------------------------------\n\ninterface InspectorTarget {\n id: string;\n webSocketDebuggerUrl: string;\n title?: string;\n url?: string;\n}\n\nexport async function listInspectorTargets(port = 9229, host = \"127.0.0.1\"): Promise<InspectorTarget[]> {\n const ctrl = new AbortController();\n const t = setTimeout(() => ctrl.abort(), 2000);\n try {\n const r = await fetch(`http://${host}:${port}/json/list`, { signal: ctrl.signal });\n if (!r.ok) return [];\n return (await r.json()) as InspectorTarget[];\n } catch {\n return [];\n } finally {\n clearTimeout(t);\n }\n}\n\nclass Cdp {\n private ws: WebSocket;\n private id = 0;\n private pending = new Map<number, { resolve: (v: unknown) => void; reject: (e: Error) => void }>();\n readonly events = new Map<string, Array<(p: unknown) => void>>();\n private constructor(ws: WebSocket) {\n this.ws = ws;\n ws.addEventListener(\"message\", (ev) => {\n const msg = JSON.parse(String(ev.data)) as { id?: number; result?: unknown; error?: { message: string }; method?: string; params?: unknown };\n if (msg.id !== undefined) {\n const p = this.pending.get(msg.id);\n this.pending.delete(msg.id);\n if (!p) return;\n if (msg.error) p.reject(new Error(msg.error.message));\n else p.resolve(msg.result);\n } else if (msg.method) {\n for (const h of this.events.get(msg.method) ?? []) h(msg.params);\n }\n });\n }\n static connect(url: string, timeoutMs = 5000): Promise<Cdp> {\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(url);\n const t = setTimeout(() => {\n ws.close();\n reject(new Error(\"inspector connect timeout\"));\n }, timeoutMs);\n ws.addEventListener(\"open\", () => {\n clearTimeout(t);\n resolve(new Cdp(ws));\n });\n ws.addEventListener(\"error\", () => {\n clearTimeout(t);\n reject(new Error(\"inspector websocket error\"));\n });\n });\n }\n on(method: string, h: (p: unknown) => void): void {\n this.events.set(method, [...(this.events.get(method) ?? []), h]);\n }\n send(method: string, params: Record<string, unknown> = {}, timeoutMs = 30_000): Promise<unknown> {\n const id = ++this.id;\n this.ws.send(JSON.stringify({ id, method, params }));\n return new Promise((resolve, reject) => {\n const t = setTimeout(() => {\n this.pending.delete(id);\n reject(new Error(`${method} timeout`));\n }, timeoutMs);\n this.pending.set(id, {\n resolve: (v) => {\n clearTimeout(t);\n resolve(v);\n },\n reject: (e) => {\n clearTimeout(t);\n reject(e);\n },\n });\n });\n }\n close(): void {\n try {\n this.ws.close();\n } catch {\n /* ignore */\n }\n }\n}\n\n/** Find an inspector endpoint for the pid: known ports first; else SIGUSR1 then retry. Returns ws url or undefined. */\nasync function findInspector(pid: number, b: ResultBuilder, allowSignal: boolean): Promise<{ url: string; port: number } | undefined> {\n const ports = [9229, 9230, 9231, 9222];\n const probe = async () => {\n for (const port of ports) {\n const list = await listInspectorTargets(port);\n const t = list.find((x) => x.webSocketDebuggerUrl);\n if (t) return { url: t.webSocketDebuggerUrl, port };\n }\n return undefined;\n };\n let found = await probe();\n if (found) return found;\n if (!allowSignal) return undefined;\n // Node's documented way to enable the inspector on a running process.\n try {\n process.kill(pid, \"SIGUSR1\");\n b.limitation(`sent SIGUSR1 to pid ${pid} to activate Node's inspector on 127.0.0.1:9229 (it stays enabled until the process exits)`);\n } catch (err) {\n b.limitation(`could not send SIGUSR1 to pid ${pid}: ${(err as Error).message}`);\n return undefined;\n }\n for (let i = 0; i < 10 && !found; i++) {\n await new Promise((r) => setTimeout(r, 300));\n found = await probe();\n }\n return found;\n}\n\nasync function takeHeapSnapshot(url: string, outPath: string): Promise<{ bytes: number; chunks: number }> {\n const cdp = await Cdp.connect(url);\n const file = createWriteStream(outPath);\n let bytes = 0;\n let chunks = 0;\n cdp.on(\"HeapProfiler.addHeapSnapshotChunk\", (p) => {\n const chunk = (p as { chunk: string }).chunk;\n bytes += chunk.length;\n chunks++;\n file.write(chunk);\n });\n try {\n await cdp.send(\"HeapProfiler.enable\");\n await cdp.send(\"HeapProfiler.takeHeapSnapshot\", { reportProgress: false, treatGlobalObjectsAsRoots: true, captureNumericValue: false }, 55_000);\n } finally {\n cdp.close();\n await new Promise<void>((r) => file.end(() => r()));\n }\n return { bytes, chunks };\n}\n\nasync function snapshotMemory(ctx: AdapterContext, args: { heap?: boolean; window_s?: number }): Promise<ToolResult> {\n const base = await snapshotMemoryGeneric(ctx, args);\n if (args.heap === false) return base;\n const { session, target } = ctx;\n const b = new ResultBuilder(\"snapshot_memory\", session, target);\n const pid = target.pid!;\n const insp = await findInspector(pid, b, true);\n if (!insp) {\n b.limitation(\"no Node inspector reachable on 127.0.0.1:9229-9231 and SIGUSR1 did not open one; start the target with --inspect for heap snapshots\");\n return mergeResults(base, b.build(), []);\n }\n const outPath = b.artifactPath(\"heap.heapsnapshot\");\n let took: { bytes: number; chunks: number };\n try {\n took = await takeHeapSnapshot(insp.url, outPath);\n b.limitation(`heap snapshot: ${took.chunks} chunks, ${Math.round(took.bytes / 1024 / 1024)} MB JSON`);\n } catch (err) {\n b.limitation(`heap snapshot failed: ${(err as Error).message}`);\n return mergeResults(base, b.build(), []);\n }\n await b.addArtifact(outPath, \"heapsnapshot\", { description: `V8 heap snapshot via inspector :${insp.port} (open in Chrome DevTools → Memory → Load)` });\n let summary: HeapSummary;\n try {\n summary = summarizeHeapSnapshot(await readFile(outPath, \"utf8\"));\n } catch (err) {\n b.limitation(`could not parse heap snapshot: ${(err as Error).message}`);\n return mergeResults(base, b.build(), []);\n }\n const sumEv = b.evidenceOf(\"heap_summary\", `heap ${humanBytes(summary.total_size)} in ${summary.node_count} objects; by type: ${summary.byType.slice(0, 4).map((t) => `${t.type} ${humanBytes(t.self_size)}`).join(\", \")}`, { name: \"heap_total\", bytes: summary.total_size, objects: summary.node_count, by_type: summary.byType.slice(0, 8) }, { artifact: outPath });\n const nameEv = b.evidenceOf(\"heap_summary\", `by constructor (self size): ${summary.byName.slice(0, 5).map((x) => `${x.name} ${humanBytes(x.self_size)}×${x.count}`).join(\", \")}`, summary.byName.map((x) => ({ name: x.name, type: x.type, count: x.count, bytes: x.self_size })), { artifact: outPath });\n const retEv = b.evidenceOf(\"heap_retainer\", `top retainers: ${summary.topRetained.slice(0, 4).map((r) => `${r.name} (${r.type}) retains ${humanBytes(r.retained_bytes)}${r.retainer ? ` via ${r.retainer}` : \"\"}`).join(\"; \")}`, summary.topRetained.map((r) => ({ name: r.name, type: r.type, retained_bytes: r.retained_bytes, self_size: r.self_size, retainer: r.retainer })), { artifact: outPath });\n const top = summary.topRetained[0];\n if (top && top.retained_bytes > summary.total_size * 0.2 && top.type !== \"synthetic\") {\n b.finding(\"warn\", `${top.name} (${top.type}) retains ${humanBytes(top.retained_bytes)} = ${Math.round((100 * top.retained_bytes) / summary.total_size)}% of the heap${top.retainer ? `, held by ${top.retainer}` : \"\"}`, [retEv, sumEv], \"observed\", \"Take another snapshot_memory after load and diff_runs: if this retainer grows, it is the leak.\");\n }\n const bigArrays = summary.byName.find((x) => x.type === \"array\" || x.name === \"Array\");\n if (bigArrays && bigArrays.self_size > summary.total_size * 0.25) b.finding(\"info\", `arrays hold ${humanBytes(bigArrays.self_size)} (${Math.round((100 * bigArrays.self_size) / summary.total_size)}% of heap)`, [nameEv]);\n b.limitation(`retained sizes are a reachability approximation (shared subgraphs are over-counted); open the .heapsnapshot in Chrome DevTools for exact dominator-tree numbers`);\n b.next(\"snapshot_memory (again, after load)\", \"diff_runs\");\n return mergeResults(base, b.build(), []);\n}\n\n/** dump_stacks for Node through the inspector: pause, read call frames of the main thread, resume. */\nasync function dumpStacks(ctx: AdapterContext): Promise<ToolResult> {\n const { session, target } = ctx;\n const b = new ResultBuilder(\"dump_stacks\", session, target);\n const pid = target.pid!;\n const insp = await findInspector(pid, b, true);\n if (!insp) {\n b.limitation(\"no Node inspector reachable; falling back needs gdb/lldb (native frames only)\");\n return b.fail(\"node inspector not available; cannot attach\").build();\n }\n const cdp = await Cdp.connect(insp.url);\n try {\n const paused = new Promise<unknown>((resolve) => cdp.on(\"Debugger.paused\", resolve));\n await cdp.send(\"Debugger.enable\");\n const t0 = Date.now();\n await cdp.send(\"Debugger.pause\");\n const p = (await Promise.race([paused, new Promise((r) => setTimeout(() => r(undefined), 3000))])) as { callFrames?: Array<{ functionName: string; url: string; location: { lineNumber: number; columnNumber: number } }>; reason?: string } | undefined;\n const pauseLatency = Date.now() - t0;\n if (p) await cdp.send(\"Debugger.resume\").catch(() => undefined);\n else await cdp.send(\"Debugger.disable\").catch(() => undefined);\n const frames = (p?.callFrames ?? []).map((f) => ({ func: f.functionName || \"(anonymous)\", file: f.url.replace(/^file:\\/\\//, \"\") || \"(internal)\", line: f.location.lineNumber + 1 }));\n const userFrames = frames.filter((f) => !/^node:|^\\(internal\\)$/.test(f.file));\n const raw = frames.map((f) => `${f.func} (${f.file}:${f.line})`).join(\"\\n\") || \"(event loop idle: no JS frames on the stack)\";\n const art = await b.writeArtifact(\"node-stack.txt\", raw, \"raw_text\", \"Node main-thread JS stack via inspector Debugger.pause\");\n const ev = b.evidenceOf(\n \"stack\",\n frames.length ? `main thread (pause latency ${pauseLatency} ms): ${frames.slice(0, 4).map((f) => `${f.func}@${f.file.split(\"/\").pop()}:${f.line}`).join(\" ← \")}` : `main thread idle in the event loop (no JS frames after ${pauseLatency} ms)`,\n { thread: \"main\", pause_latency_ms: pauseLatency, frames, user_frames: userFrames.length },\n { artifact: art },\n );\n // Debugger.pause only fires when JS runs. If the loop was idle it fires on the next tick, which is an internal\n // frame reached after a delay — that is NOT evidence of a blocked loop.\n if (userFrames.length && pauseLatency < 100) {\n const f = userFrames[0]!;\n b.finding(\"warn\", `Node main thread is executing ${f.func} (${f.file.split(\"/\").pop()}:${f.line}) — a synchronous task is running on the event loop`, [ev], \"observed\", `Hot JS stack: ${userFrames.slice(0, 5).map((x) => `${x.func}@${x.file.split(\"/\").pop()}:${x.line}`).join(\" ← \")}. Handoff: attach a step debugger (e.g. mcp-debugger) at ${f.file}:${f.func}. Run profile_cpu to see if it is CPU-bound.`);\n } else if (userFrames.length) {\n b.finding(\"info\", `caught the event loop in user code ${userFrames[0]!.func} (${userFrames[0]!.file.split(\"/\").pop()}:${userFrames[0]!.line}) after ${pauseLatency} ms — a tick was running, not necessarily blocked`, [ev], \"observed\");\n } else {\n b.finding(\"info\", `Node main thread was idle in the event loop (first JS tick after ${pauseLatency} ms was ${frames[0] ? `${frames[0].func} in ${frames[0].file}` : \"none\"}) — not stuck in JS; if callers hang, the work is pending on I/O or timers (inspect_sockets, trace_syscalls)`, [ev], \"inferred\");\n }\n b.limitation(\"JS main thread only; worker threads and libuv threadpool are not shown (use gdb/lldb for native threads)\");\n b.next(\"profile_cpu\", \"trace_syscalls\", \"inspect_sockets\");\n return b.build();\n } finally {\n cdp.close();\n }\n}\n\nexport const heapNodeAdapter: Adapter = {\n name: \"node-inspector\",\n tools: [\"snapshot_memory\", \"dump_stacks\"],\n platforms: [\"linux\", \"darwin\"],\n requires: [],\n runtimes: [\"node\"],\n priority: 20,\n check(base) {\n base.notes.push(\"uses Node's inspector protocol; sends SIGUSR1 to enable it if the target was not started with --inspect\");\n return base;\n },\n async run(tool, args, ctx) {\n if (tool === \"snapshot_memory\") return snapshotMemory(ctx, args as { heap?: boolean; window_s?: number });\n if (tool === \"dump_stacks\") return dumpStacks(ctx);\n throw new Error(`node-inspector adapter cannot run ${tool}`);\n },\n};\n\nexport { targetPids, runCapped };\n","/**\n * bpftrace adapter (Linux, optional): a few canned read-only scripts.\n * Not wired to a v0 tool yet — it is listed in readiness as not_implemented so\n * agents see it exists. Scripts are kept here for the next milestone\n * (trace_latency / trace_fd_opens / trace_tcp_retransmits).\n */\nimport type { Adapter } from \"./types.js\";\n\nexport const SCRIPTS = {\n syscall_latency: (pid: number) => `tracepoint:raw_syscalls:sys_enter /pid == ${pid}/ { @s[tid] = nsecs; } tracepoint:raw_syscalls:sys_exit /pid == ${pid} && @s[tid]/ { @us[args->id] = hist((nsecs - @s[tid]) / 1000); delete(@s[tid]); } interval:s:10 { exit(); }`,\n fd_opens: (pid: number) => `tracepoint:syscalls:sys_enter_openat /pid == ${pid}/ { @[str(args->filename)] = count(); } interval:s:10 { exit(); }`,\n tcp_retransmits: () => `kprobe:tcp_retransmit_skb { @[comm] = count(); } interval:s:10 { exit(); }`,\n} as const;\n\nexport const bpftraceAdapter: Adapter = {\n name: \"bpftrace\",\n tools: [],\n platforms: [\"linux\"],\n requires: [\"bpftrace\"],\n install: { linux: \"sudo apt install bpftrace\" },\n async run() {\n throw new Error(\"bpftrace adapter is not implemented in v0\");\n },\n};\n","/**\n * Adapter registry. Each adapter declares the platforms it supports, the\n * binaries it requires, and the tools it serves. Readiness is computed from\n * these declarations; dispatch picks the highest-priority ready adapter whose\n * runtime filter matches the target.\n */\nimport type { Adapter } from \"./types.js\";\nimport type { Readiness, Target } from \"../contracts.js\";\nimport { lsofAdapter } from \"./lsof.js\";\nimport { pyspyAdapter } from \"./pyspy.js\";\nimport { straceAdapter } from \"./strace.js\";\nimport { gdbAdapter } from \"./gdb.js\";\nimport { lldbAdapter } from \"./lldb.js\";\nimport { heapNodeAdapter } from \"./heap_node.js\";\nimport { perfAdapter } from \"./perf.js\";\nimport { tcpdumpAdapter } from \"./tcpdump.js\";\nimport { dockerAdapter } from \"./docker.js\";\nimport { sampleMacosAdapter } from \"./sample_macos.js\";\nimport { bpftraceAdapter } from \"./bpftrace.js\";\nimport { psmemAdapter } from \"./psmem.js\";\nimport { fsUsageAdapter } from \"./fs_usage.js\";\nimport { jvmAdapter } from \"./jvm.js\";\n\nexport const adapters: Adapter[] = [\n jvmAdapter,\n lsofAdapter,\n pyspyAdapter,\n straceAdapter,\n fsUsageAdapter,\n gdbAdapter,\n lldbAdapter,\n heapNodeAdapter,\n psmemAdapter,\n perfAdapter,\n sampleMacosAdapter,\n tcpdumpAdapter,\n dockerAdapter,\n bpftraceAdapter,\n];\n\nexport interface Candidate {\n adapter: Adapter;\n reason?: string;\n}\n\n/** All adapters that could serve `tool` for `target`, ready ones first by priority. */\nexport function candidatesFor(tool: string, target: Target, readiness: Readiness): { ready: Adapter[]; blocked: Candidate[] } {\n const ready: Adapter[] = [];\n const blocked: Candidate[] = [];\n for (const a of adapters) {\n if (!a.tools.includes(tool)) continue;\n const status = readiness.providers.find((p) => p.name === a.name);\n if (a.runtimes && target.runtime && !a.runtimes.includes(target.runtime)) {\n blocked.push({ adapter: a, reason: `serves ${a.runtimes.join(\"/\")} targets, target is ${target.runtime}` });\n continue;\n }\n if (!status || status.status !== \"ready\") {\n blocked.push({ adapter: a, reason: `${status?.status ?? \"unknown\"}${status?.install_hint ? ` — ${status.install_hint}` : \"\"}` });\n continue;\n }\n ready.push(a);\n }\n ready.sort((x, y) => (y.priority ?? 0) - (x.priority ?? 0));\n return { ready, blocked };\n}\n","/**\n * diff_runs: compare two prior ToolResults of the same tool. Generic over the\n * evidence shape: evidence items with array data are keyed by a name-ish field\n * and compared numerically; metrics are compared directly.\n */\nimport type { Session, ToolResult } from \"./contracts.js\";\nimport { ResultBuilder, humanBytes } from \"./evidence.js\";\n\ntype Row = Record<string, unknown>;\n\nconst KEY_FIELDS = [\"name\", \"frame\", \"function\", \"syscall\", \"remote\", \"type\", \"path\", \"fd\", \"state\", \"constructor\", \"key\", \"thread\", \"metric\", \"label\"];\nconst NUM_FIELDS = [\"value\", \"retained_bytes\", \"self_size\", \"bytes\", \"rss_kb\", \"vsz_kb\", \"total_ms\", \"self\", \"total\", \"count\", \"packets\", \"errors\", \"objects\", \"fds\", \"samples\", \"self_pct\", \"total_pct\"];\n\nfunction keyOf(row: Row): string | undefined {\n for (const k of KEY_FIELDS) {\n const v = row[k];\n if (typeof v === \"string\" || typeof v === \"number\") return `${k}=${v}`;\n }\n return undefined;\n}\n\nfunction numericFields(row: Row): Record<string, number> {\n const out: Record<string, number> = {};\n for (const k of NUM_FIELDS) if (typeof row[k] === \"number\") out[k] = row[k] as number;\n return out;\n}\n\nexport interface DiffEntry {\n key: string;\n status: \"grew\" | \"shrank\" | \"appeared\" | \"disappeared\" | \"same\";\n field?: string;\n a?: number;\n b?: number;\n delta?: number;\n}\n\n/** Diff two evidence lists. Pure. */\nexport function diffEvidence(a: ToolResult[\"evidence\"], b: ToolResult[\"evidence\"]): { byKind: Record<string, DiffEntry[]>; metrics: DiffEntry[] } {\n const byKind: Record<string, DiffEntry[]> = {};\n const metrics: DiffEntry[] = [];\n const kinds = new Set([...a.map((e) => e.kind), ...b.map((e) => e.kind)]);\n for (const kind of kinds) {\n const rowsA = new Map<string, Row>();\n const rowsB = new Map<string, Row>();\n const collect = (list: ToolResult[\"evidence\"], into: Map<string, Row>) => {\n for (const e of list.filter((x) => x.kind === kind)) {\n if (Array.isArray(e.data)) {\n for (const r of e.data as Row[]) {\n if (r && typeof r === \"object\") {\n const k = keyOf(r);\n if (k) into.set(k, r);\n }\n }\n } else if (e.data && typeof e.data === \"object\") {\n const r = e.data as Row;\n const nums = numericFields(r);\n if (Object.keys(nums).length) into.set(keyOf(r) ?? e.summary.split(\":\")[0]!, r);\n }\n }\n };\n collect(a, rowsA);\n collect(b, rowsB);\n const entries: DiffEntry[] = [];\n for (const [k, rb] of rowsB) {\n const ra = rowsA.get(k);\n const nb = numericFields(rb);\n if (!ra) {\n const f = Object.keys(nb)[0];\n entries.push({ key: k, status: \"appeared\", field: f, b: f ? nb[f] : undefined });\n continue;\n }\n const na = numericFields(ra);\n const field = Object.keys(nb).find((f) => f in na);\n if (!field) continue;\n const delta = nb[field]! - na[field]!;\n entries.push({ key: k, status: delta > 0 ? \"grew\" : delta < 0 ? \"shrank\" : \"same\", field, a: na[field], b: nb[field], delta });\n }\n for (const [k, ra] of rowsA) {\n if (!rowsB.has(k)) {\n const na = numericFields(ra);\n const f = Object.keys(na)[0];\n entries.push({ key: k, status: \"disappeared\", field: f, a: f ? na[f] : undefined });\n }\n }\n entries.sort((x, y) => Math.abs(y.delta ?? y.b ?? y.a ?? 0) - Math.abs(x.delta ?? x.b ?? x.a ?? 0));\n if (entries.length) {\n if (kind === \"metric\" || kind === \"metric_series\") metrics.push(...entries);\n else byKind[kind] = entries;\n }\n }\n return { byKind, metrics };\n}\n\nexport async function diffRuns(session: Session, a: ToolResult, b: ToolResult): Promise<ToolResult> {\n const rb = new ResultBuilder(\"diff_runs\", session, session.target);\n if (a.tool !== b.tool) rb.limitation(`comparing different tools (${a.tool} vs ${b.tool}); only overlapping evidence kinds are diffed`);\n const { byKind, metrics } = diffEvidence(a.evidence, b.evidence);\n const header = rb.evidenceOf(\"diff\", `${a.run_id ?? a.tool} (${a.started_at ?? \"?\"}) → ${b.run_id ?? b.tool} (${b.started_at ?? \"?\"})`, { a: a.run_id, b: b.run_id, a_started: a.started_at, b_started: b.started_at });\n\n const isBytes = (f?: string) => Boolean(f && /bytes|rss|vsz/.test(f));\n const fmt = (v: number | undefined, f?: string) => (v === undefined ? \"?\" : isBytes(f) ? (f?.includes(\"kb\") ? humanBytes(v * 1024) : humanBytes(v)) : String(Math.round(v * 100) / 100));\n\n if (metrics.length) {\n const ev = rb.evidenceOf(\"diff\", `metrics: ${metrics.slice(0, 6).map((m) => `${m.key} ${fmt(m.a, m.field)}→${fmt(m.b, m.field)}`).join(\", \")}`, metrics.slice(0, 40));\n for (const m of metrics) {\n if (m.status === \"grew\" && m.a && m.delta! / m.a > 0.2) {\n rb.finding(\"warn\", `${m.key} grew ${fmt(m.a, m.field)} → ${fmt(m.b, m.field)} (+${((m.delta! / m.a) * 100).toFixed(0)}%)`, [ev, header]);\n }\n }\n }\n for (const [kind, entries] of Object.entries(byKind)) {\n const grew = entries.filter((e) => e.status === \"grew\").slice(0, 10);\n const appeared = entries.filter((e) => e.status === \"appeared\").slice(0, 10);\n const gone = entries.filter((e) => e.status === \"disappeared\").slice(0, 10);\n const shrank = entries.filter((e) => e.status === \"shrank\").slice(0, 10);\n const ev = rb.evidenceOf(\"diff\", `${kind}: ${grew.length} grew, ${shrank.length} shrank, ${appeared.length} appeared, ${gone.length} disappeared`, { grew, shrank, appeared, disappeared: gone });\n const top = grew[0];\n if (top && top.delta && top.a !== undefined && (top.a === 0 || top.delta / top.a > 0.1)) {\n rb.finding(\n kind === \"heap_retainer\" || kind === \"heap_summary\" ? \"high\" : \"warn\",\n `${kind}: ${top.key} grew ${fmt(top.a, top.field)} → ${fmt(top.b, top.field)}${grew.length > 1 ? ` (and ${grew.length - 1} more grew)` : \"\"}`,\n [ev, header],\n );\n }\n if (appeared.length && !top) rb.finding(\"info\", `${kind}: ${appeared.length} new item(s), e.g. ${appeared[0]!.key}`, [ev, header]);\n }\n if (!metrics.length && Object.keys(byKind).length === 0) {\n rb.finding(\"info\", \"no comparable numeric evidence between the two runs\", [header]);\n rb.limitation(\"diff_runs compares evidence rows keyed by name/frame/syscall/remote/path/etc with numeric fields; these runs had none in common\");\n }\n rb.next(\"report\");\n return rb.build();\n}\n","/** Session → markdown report with findings, evidence excerpts and artifact links. */\nimport { readFile } from \"node:fs/promises\";\nimport type { Session, ToolResult } from \"./contracts.js\";\nimport { redact } from \"./safety.js\";\n\nconst SEV_ICON: Record<string, string> = { high: \"🔴\", warn: \"🟠\", info: \"🔵\" };\n\nexport async function renderReport(session: Session): Promise<string> {\n const runs: ToolResult[] = [];\n for (const r of session.runs) {\n try {\n runs.push(JSON.parse(await readFile(r.file, \"utf8\")) as ToolResult);\n } catch {\n /* skip */\n }\n }\n return renderReportFromRuns(session, runs);\n}\n\n/** Pure renderer, testable. */\nexport function renderReportFromRuns(session: Session, runs: ToolResult[]): string {\n const t = session.target;\n const lines: string[] = [];\n lines.push(`# Debug Anything session ${session.id}`);\n lines.push(\"\");\n lines.push(`- **Target:** ${t.kind} \\`${t.id}\\`${t.pid ? ` (pid ${t.pid}` + (t.comm ? `, ${t.comm}` : \"\") + \")\" : \"\"}${t.runtime ? ` — runtime ${t.runtime}` : \"\"}`);\n lines.push(`- **Host:** ${t.host} (${session.platform})`);\n lines.push(`- **Created:** ${session.created_at}${session.detached_at ? ` · **Detached:** ${session.detached_at}` : \"\"}`);\n lines.push(`- **Runs:** ${runs.length} · **Artifacts dir:** \\`${session.dir}\\``);\n lines.push(\"\");\n\n const all = runs.flatMap((r) => r.findings.map((f) => ({ run: r, f })));\n const order = { high: 0, warn: 1, info: 2 } as const;\n all.sort((a, b) => order[a.f.severity] - order[b.f.severity]);\n lines.push(\"## Findings\");\n lines.push(\"\");\n if (all.length === 0) lines.push(\"_No findings recorded._\");\n for (const { run, f } of all) {\n lines.push(`- ${SEV_ICON[f.severity]} **${f.severity.toUpperCase()}** ${redact(f.summary)} `);\n lines.push(` _${f.confidence}_ · ${run.run_id ?? run.tool} · evidence: ${f.evidence_ids.map((e) => `\\`${run.run_id ?? run.tool}/${e}\\``).join(\", \")}`);\n if (f.detail) lines.push(` ${redact(f.detail)}`);\n }\n lines.push(\"\");\n\n lines.push(\"## Runs\");\n lines.push(\"\");\n for (const r of runs) {\n lines.push(`### ${r.run_id ?? r.tool} — ${r.ok ? \"ok\" : \"FAILED\"} (${r.duration_ms} ms)`);\n lines.push(\"\");\n if (r.error) lines.push(`**Error:** ${redact(r.error)}\\n`);\n if (r.evidence.length) {\n lines.push(\"| id | kind | summary | source |\");\n lines.push(\"|---|---|---|---|\");\n for (const e of r.evidence) {\n const src = e.artifact ? `\\`${shortPath(e.artifact)}\\`${e.lines ? ` L${e.lines[0]}–${e.lines[1]}` : \"\"}` : \"\";\n lines.push(`| ${e.id} | ${e.kind} | ${escapeCell(redact(e.summary))} | ${src} |`);\n }\n lines.push(\"\");\n }\n if (r.limitations.length) {\n lines.push(\"**Limitations:**\");\n for (const l of r.limitations) lines.push(`- ${redact(l)}`);\n lines.push(\"\");\n }\n if (r.artifacts.length) {\n lines.push(\"**Artifacts:**\");\n for (const a of r.artifacts) lines.push(`- \\`${a.path}\\` (${a.kind}, ${a.bytes} bytes${a.truncated ? \", truncated\" : \"\"})`);\n lines.push(\"\");\n }\n if (r.suggested_next.length) lines.push(`_Suggested next:_ ${r.suggested_next.join(\", \")}\\n`);\n }\n lines.push(\"---\");\n lines.push(\"_Generated by DEA (Debug Anything). Every finding above cites evidence ids; raw artifacts are unredacted on disk._\");\n return lines.join(\"\\n\") + \"\\n\";\n}\n\nfunction shortPath(p: string): string {\n const i = p.lastIndexOf(\"/\");\n return i >= 0 ? p.slice(i + 1) : p;\n}\n\nfunction escapeCell(s: string): string {\n return s.replace(/\\|/g, \"\\\\|\").replace(/\\n/g, \" \");\n}\n"],"mappings":"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","names":["join","readFile","readFile","readFile","readFile","join"]}
@@ -0,0 +1,215 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ ResultBuilder,
4
+ humanBytes
5
+ } from "./chunk-5BXTDASF.js";
6
+ import {
7
+ platform
8
+ } from "./chunk-D742WJPT.js";
9
+ import {
10
+ assertSafeIdentifier,
11
+ runCapped
12
+ } from "./chunk-STFC7C5C.js";
13
+
14
+ // src/adapters/docker.ts
15
+ import { readFile } from "fs/promises";
16
+ function parseDockerInspect(raw) {
17
+ try {
18
+ const arr = JSON.parse(raw);
19
+ const obj = Array.isArray(arr) ? arr[0] : arr;
20
+ return obj && typeof obj === "object" ? obj : void 0;
21
+ } catch {
22
+ return void 0;
23
+ }
24
+ }
25
+ function attachInfoFromInspect(d) {
26
+ const argv = [...d.Config?.Entrypoint ?? [], ...d.Config?.Cmd ?? []];
27
+ return {
28
+ id: d.Id.slice(0, 12),
29
+ name: (d.Name ?? "").replace(/^\//, ""),
30
+ image: d.Config?.Image,
31
+ pid: d.State?.Pid ?? 0,
32
+ comm: argv[0]?.split("/").pop(),
33
+ cmdline: argv.join(" ") || void 0,
34
+ running: Boolean(d.State?.Running)
35
+ };
36
+ }
37
+ async function dockerInspectForAttach(name) {
38
+ assertSafeIdentifier(name, "container name");
39
+ const r = await runCapped("docker", ["inspect", name], { timeoutMs: 1e4 });
40
+ if (r.exitCode !== 0) return void 0;
41
+ const d = parseDockerInspect(r.stdout);
42
+ return d ? attachInfoFromInspect(d) : void 0;
43
+ }
44
+ function parseDockerStats(raw) {
45
+ const line = raw.trim().split("\n").find((l) => l.startsWith("{"));
46
+ if (!line) return void 0;
47
+ try {
48
+ const j = JSON.parse(line);
49
+ return {
50
+ cpu_pct: parseFloat(j.CPUPerc ?? "0"),
51
+ mem_usage: j.MemUsage ?? "",
52
+ mem_pct: parseFloat(j.MemPerc ?? "0"),
53
+ net_io: j.NetIO ?? "",
54
+ block_io: j.BlockIO ?? "",
55
+ pids: parseInt(j.PIDs ?? "0", 10)
56
+ };
57
+ } catch {
58
+ return void 0;
59
+ }
60
+ }
61
+ function parseDockerTop(raw) {
62
+ const lines = raw.trim().split("\n").slice(1);
63
+ const out = [];
64
+ for (const l of lines) {
65
+ const m = /^\s*(\d+)\s+(\S+)\s*(.*)$/.exec(l);
66
+ if (m) out.push({ pid: Number(m[1]), comm: m[2], args: m[3] ?? "" });
67
+ }
68
+ return out;
69
+ }
70
+ async function readCgroupStats(pid) {
71
+ try {
72
+ const cg = await readFile(`/proc/${pid}/cgroup`, "utf8");
73
+ const m = /^0::(.*)$/m.exec(cg);
74
+ if (!m) return void 0;
75
+ const base = `/sys/fs/cgroup${m[1]}`;
76
+ const out = {};
77
+ const parse = (text) => {
78
+ for (const line of text.split("\n")) {
79
+ const [k, v] = line.trim().split(/\s+/);
80
+ if (k && v && /^\d+$/.test(v)) out[k] = Number(v);
81
+ }
82
+ };
83
+ for (const f of ["memory.events", "cpu.stat"]) {
84
+ try {
85
+ parse(await readFile(`${base}/${f}`, "utf8"));
86
+ } catch {
87
+ }
88
+ }
89
+ return out;
90
+ } catch {
91
+ return void 0;
92
+ }
93
+ }
94
+ async function containerInfo(ctx) {
95
+ const { session, target } = ctx;
96
+ const b = new ResultBuilder("container_info", session, target);
97
+ const name = target.container?.id ?? target.id;
98
+ if (!target.container) {
99
+ if (platform() === "linux" && target.pid) {
100
+ try {
101
+ const cg = await readFile(`/proc/${target.pid}/cgroup`, "utf8");
102
+ const { containerIdFromCgroup } = await import("./target-WJE4WFYA.js");
103
+ const cid = containerIdFromCgroup(cg);
104
+ if (cid) return containerInfoFor(b, cid, ctx);
105
+ } catch {
106
+ }
107
+ }
108
+ b.limitation("target is not a container (attach with kind=container or a container name to get container_info)");
109
+ return b.fail("not a container target").build();
110
+ }
111
+ return containerInfoFor(b, name, ctx);
112
+ }
113
+ async function containerInfoFor(b, name, _ctx) {
114
+ const [inspectR, statsR, topR, logsR] = await Promise.all([
115
+ runCapped("docker", ["inspect", name], { timeoutMs: 1e4 }),
116
+ runCapped("docker", ["stats", "--no-stream", "--format", "{{json .}}", name], { timeoutMs: 15e3 }),
117
+ runCapped("docker", ["top", name, "-eo", "pid,comm,args"], { timeoutMs: 1e4 }),
118
+ runCapped("docker", ["logs", "--tail", "200", "--timestamps", name], { timeoutMs: 1e4 })
119
+ ]);
120
+ if (inspectR.exitCode !== 0) {
121
+ b.limitation(`docker inspect failed: ${inspectR.stderr.trim()}`);
122
+ return b.fail("docker inspect failed").build();
123
+ }
124
+ const d = parseDockerInspect(inspectR.stdout);
125
+ if (!d) return b.fail("could not parse docker inspect output").build();
126
+ const inspectPath = await b.writeArtifact("inspect.json", inspectR.stdout, "json", "docker inspect");
127
+ const logsText = logsR.stdout + logsR.stderr;
128
+ const logsPath = await b.writeArtifact("logs.txt", logsText, "log", "docker logs --tail 200");
129
+ const st = d.State ?? {};
130
+ const hc = d.HostConfig ?? {};
131
+ const stateEv = b.evidenceOf(
132
+ "container_state",
133
+ `state=${st.Status} running=${st.Running} pid=${st.Pid} oom_killed=${st.OOMKilled} exit=${st.ExitCode} restarts=${d.RestartCount ?? st.RestartCount ?? 0}`,
134
+ { status: st.Status, running: st.Running, host_pid: st.Pid, oom_killed: st.OOMKilled, exit_code: st.ExitCode, started_at: st.StartedAt, finished_at: st.FinishedAt, restart_count: d.RestartCount ?? st.RestartCount, error: st.Error, image: d.Config?.Image },
135
+ { artifact: inspectPath }
136
+ );
137
+ const limits = {
138
+ memory_bytes: hc.Memory || null,
139
+ memory_swap_bytes: hc.MemorySwap || null,
140
+ nano_cpus: hc.NanoCpus || null,
141
+ cpu_quota: hc.CpuQuota || null,
142
+ cpu_period: hc.CpuPeriod || null,
143
+ pids_limit: hc.PidsLimit ?? null,
144
+ restart_policy: hc.RestartPolicy?.Name ?? null
145
+ };
146
+ const limitsEv = b.evidenceOf(
147
+ "cgroup",
148
+ `limits: memory=${hc.Memory ? humanBytes(hc.Memory) : "unlimited"} cpus=${hc.NanoCpus ? (hc.NanoCpus / 1e9).toFixed(2) : hc.CpuQuota && hc.CpuPeriod ? (hc.CpuQuota / hc.CpuPeriod).toFixed(2) : "unlimited"} pids=${hc.PidsLimit ?? "unlimited"}`,
149
+ limits,
150
+ { artifact: inspectPath }
151
+ );
152
+ const stats = parseDockerStats(statsR.stdout);
153
+ let statsEv;
154
+ if (stats) {
155
+ statsEv = b.evidenceOf("metric", `cpu=${stats.cpu_pct}% mem=${stats.mem_usage} (${stats.mem_pct}%) net=${stats.net_io} block=${stats.block_io} pids=${stats.pids}`, stats);
156
+ } else b.limitation("docker stats unavailable (container not running?)");
157
+ const top = parseDockerTop(topR.stdout);
158
+ if (top.length) b.evidenceOf("process_list", `${top.length} process(es) in container; pid1=${top[0]?.comm}`, top.slice(0, 30));
159
+ const ports = Object.entries(d.NetworkSettings?.Ports ?? {}).map(([k, v]) => `${k}\u2192${(v ?? []).map((x) => `${x.HostIp}:${x.HostPort}`).join(",") || "unpublished"}`);
160
+ if (ports.length) b.evidenceOf("socket_summary", `published ports: ${ports.join(" ")}`, ports);
161
+ const logLines = logsText.split("\n");
162
+ const interesting = logLines.filter((l) => /error|exception|fatal|panic|oom|killed|out of memory|traceback|segfault/i.test(l)).slice(-15);
163
+ if (interesting.length) {
164
+ b.evidenceOf("log_excerpt", `${interesting.length} error-ish line(s) in last ${logLines.length} log lines`, interesting, { artifact: logsPath });
165
+ }
166
+ if (platform() === "linux" && st.Pid) {
167
+ const cg = await readCgroupStats(st.Pid);
168
+ if (cg && Object.keys(cg).length) {
169
+ const cgEv = b.evidenceOf("cgroup", `cgroup: oom_kill=${cg.oom_kill ?? 0} oom=${cg.oom ?? 0} throttled=${cg.nr_throttled ?? 0}/${cg.nr_periods ?? 0} periods`, cg);
170
+ if ((cg.oom_kill ?? 0) > 0) b.finding("high", `cgroup reports ${cg.oom_kill} OOM kill(s) for this container`, [cgEv]);
171
+ if ((cg.nr_periods ?? 0) > 0 && (cg.nr_throttled ?? 0) / cg.nr_periods > 0.1) {
172
+ b.finding("warn", `CPU throttled in ${((cg.nr_throttled ?? 0) / cg.nr_periods * 100).toFixed(0)}% of cgroup periods \u2014 the CPU quota is a bottleneck`, [cgEv, limitsEv]);
173
+ }
174
+ }
175
+ } else if (platform() === "darwin") {
176
+ b.limitation("on macOS the Docker VM hides host pids and cgroups; ptrace-based tools cannot attach to container processes from the host \u2014 run Debug Anything inside the container or on a Linux host");
177
+ }
178
+ if (st.OOMKilled) b.finding("high", "container was OOM-killed (State.OOMKilled=true)", [stateEv, limitsEv]);
179
+ if (!st.Running) b.finding("high", `container is not running (status=${st.Status}, exit=${st.ExitCode})`, [stateEv]);
180
+ const restarts = d.RestartCount ?? st.RestartCount ?? 0;
181
+ if (restarts > 0) b.finding("warn", `container has restarted ${restarts} time(s)`, [stateEv]);
182
+ if (stats && hc.Memory && stats.mem_pct > 85) b.finding("warn", `memory at ${stats.mem_pct}% of the ${humanBytes(hc.Memory)} limit \u2014 close to OOM`, [statsEv, limitsEv]);
183
+ if (stats && stats.cpu_pct > 90) b.finding("warn", `container CPU at ${stats.cpu_pct}%`, [statsEv]);
184
+ if (interesting.length) {
185
+ b.finding("info", `recent logs contain ${interesting.length} error-ish line(s) (see evidence)`, [b.evidenceOf("log_excerpt", "error-ish log lines", interesting.slice(-5), { artifact: logsPath })]);
186
+ }
187
+ if (b.findingCount === 0 && st.Running) {
188
+ b.finding("info", `container running${stats ? `, memory ${stats.mem_pct}% of ${hc.Memory ? humanBytes(hc.Memory) : "host"} and cpu ${stats.cpu_pct}%` : ""}, no OOM kill, no restarts`, statsEv ? [stateEv, limitsEv, statsEv] : [stateEv, limitsEv]);
189
+ }
190
+ b.next("snapshot_memory", "profile_cpu", "inspect_sockets");
191
+ return b.build();
192
+ }
193
+ var dockerAdapter = {
194
+ name: "docker",
195
+ tools: ["container_info"],
196
+ platforms: ["linux", "darwin"],
197
+ requires: ["docker"],
198
+ install: { linux: "https://docs.docker.com/engine/install/", darwin: "brew install --cask docker (or Colima/OrbStack)" },
199
+ priority: 10,
200
+ async run(tool, _args, ctx) {
201
+ if (tool !== "container_info") throw new Error(`docker adapter cannot run ${tool}`);
202
+ return containerInfo(ctx);
203
+ }
204
+ };
205
+
206
+ export {
207
+ parseDockerInspect,
208
+ attachInfoFromInspect,
209
+ dockerInspectForAttach,
210
+ parseDockerStats,
211
+ parseDockerTop,
212
+ readCgroupStats,
213
+ dockerAdapter
214
+ };
215
+ //# sourceMappingURL=chunk-YY6M5RIJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/docker.ts"],"sourcesContent":["/**\n * docker adapter: container_info (inspect/stats/logs/top + cgroup limits) and\n * the container → host pid mapping used by attach.\n */\nimport { readFile } from \"node:fs/promises\";\nimport type { Adapter, AdapterContext } from \"./types.js\";\nimport type { ToolResult } from \"../contracts.js\";\nimport { ResultBuilder, humanBytes } from \"../evidence.js\";\nimport { runCapped, assertSafeIdentifier } from \"../safety.js\";\nimport { platform } from \"../session.js\";\n\nexport interface DockerAttachInfo {\n id: string;\n name: string;\n image?: string;\n pid: number;\n comm?: string;\n cmdline?: string;\n running: boolean;\n}\n\nexport interface DockerInspect {\n Id: string;\n Name: string;\n Config?: { Image?: string; Cmd?: string[] | null; Entrypoint?: string[] | null };\n State?: { Status?: string; Running?: boolean; Pid?: number; OOMKilled?: boolean; ExitCode?: number; StartedAt?: string; FinishedAt?: string; Error?: string; RestartCount?: number };\n HostConfig?: { Memory?: number; MemorySwap?: number; NanoCpus?: number; CpuQuota?: number; CpuPeriod?: number; CpuShares?: number; PidsLimit?: number | null; RestartPolicy?: { Name?: string } };\n RestartCount?: number;\n NetworkSettings?: { Ports?: Record<string, Array<{ HostIp: string; HostPort: string }> | null> };\n}\n\n/** Parse `docker inspect` JSON. Pure. */\nexport function parseDockerInspect(raw: string): DockerInspect | undefined {\n try {\n const arr = JSON.parse(raw);\n const obj = Array.isArray(arr) ? arr[0] : arr;\n return obj && typeof obj === \"object\" ? (obj as DockerInspect) : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function attachInfoFromInspect(d: DockerInspect): DockerAttachInfo {\n const argv = [...(d.Config?.Entrypoint ?? []), ...(d.Config?.Cmd ?? [])];\n return {\n id: d.Id.slice(0, 12),\n name: (d.Name ?? \"\").replace(/^\\//, \"\"),\n image: d.Config?.Image,\n pid: d.State?.Pid ?? 0,\n comm: argv[0]?.split(\"/\").pop(),\n cmdline: argv.join(\" \") || undefined,\n running: Boolean(d.State?.Running),\n };\n}\n\nexport async function dockerInspectForAttach(name: string): Promise<DockerAttachInfo | undefined> {\n assertSafeIdentifier(name, \"container name\");\n const r = await runCapped(\"docker\", [\"inspect\", name], { timeoutMs: 10_000 });\n if (r.exitCode !== 0) return undefined;\n const d = parseDockerInspect(r.stdout);\n return d ? attachInfoFromInspect(d) : undefined;\n}\n\n/** Parse `docker stats --no-stream --format json`. Pure. */\nexport interface DockerStats {\n cpu_pct: number;\n mem_usage: string;\n mem_pct: number;\n net_io: string;\n block_io: string;\n pids: number;\n}\nexport function parseDockerStats(raw: string): DockerStats | undefined {\n const line = raw.trim().split(\"\\n\").find((l) => l.startsWith(\"{\"));\n if (!line) return undefined;\n try {\n const j = JSON.parse(line) as Record<string, string>;\n return {\n cpu_pct: parseFloat(j.CPUPerc ?? \"0\"),\n mem_usage: j.MemUsage ?? \"\",\n mem_pct: parseFloat(j.MemPerc ?? \"0\"),\n net_io: j.NetIO ?? \"\",\n block_io: j.BlockIO ?? \"\",\n pids: parseInt(j.PIDs ?? \"0\", 10),\n };\n } catch {\n return undefined;\n }\n}\n\n/** Parse `docker top <c> -eo pid,comm,args` → rows. Pure. */\nexport function parseDockerTop(raw: string): Array<{ pid: number; comm: string; args: string }> {\n const lines = raw.trim().split(\"\\n\").slice(1);\n const out: Array<{ pid: number; comm: string; args: string }> = [];\n for (const l of lines) {\n const m = /^\\s*(\\d+)\\s+(\\S+)\\s*(.*)$/.exec(l);\n if (m) out.push({ pid: Number(m[1]), comm: m[2]!, args: m[3] ?? \"\" });\n }\n return out;\n}\n\n/** Linux cgroup v2 memory.events / cpu.stat for a container's pid. */\nexport async function readCgroupStats(pid: number): Promise<{ oom_kill?: number; oom?: number; max?: number; throttled_usec?: number; nr_throttled?: number; nr_periods?: number } | undefined> {\n try {\n const cg = await readFile(`/proc/${pid}/cgroup`, \"utf8\");\n const m = /^0::(.*)$/m.exec(cg);\n if (!m) return undefined;\n const base = `/sys/fs/cgroup${m[1]}`;\n const out: Record<string, number> = {};\n const parse = (text: string) => {\n for (const line of text.split(\"\\n\")) {\n const [k, v] = line.trim().split(/\\s+/);\n if (k && v && /^\\d+$/.test(v)) out[k] = Number(v);\n }\n };\n for (const f of [\"memory.events\", \"cpu.stat\"]) {\n try {\n parse(await readFile(`${base}/${f}`, \"utf8\"));\n } catch {\n /* ignore */\n }\n }\n return out;\n } catch {\n return undefined;\n }\n}\n\nasync function containerInfo(ctx: AdapterContext): Promise<ToolResult> {\n const { session, target } = ctx;\n const b = new ResultBuilder(\"container_info\", session, target);\n const name = target.container?.id ?? target.id;\n if (!target.container) {\n if (platform() === \"linux\" && target.pid) {\n // Attached by pid; check if it lives in a container.\n try {\n const cg = await readFile(`/proc/${target.pid}/cgroup`, \"utf8\");\n const { containerIdFromCgroup } = await import(\"../target.js\");\n const cid = containerIdFromCgroup(cg);\n if (cid) return containerInfoFor(b, cid, ctx);\n } catch {\n /* ignore */\n }\n }\n b.limitation(\"target is not a container (attach with kind=container or a container name to get container_info)\");\n return b.fail(\"not a container target\").build();\n }\n return containerInfoFor(b, name, ctx);\n}\n\nasync function containerInfoFor(b: ResultBuilder, name: string, _ctx: AdapterContext): Promise<ToolResult> {\n const [inspectR, statsR, topR, logsR] = await Promise.all([\n runCapped(\"docker\", [\"inspect\", name], { timeoutMs: 10_000 }),\n runCapped(\"docker\", [\"stats\", \"--no-stream\", \"--format\", \"{{json .}}\", name], { timeoutMs: 15_000 }),\n runCapped(\"docker\", [\"top\", name, \"-eo\", \"pid,comm,args\"], { timeoutMs: 10_000 }),\n runCapped(\"docker\", [\"logs\", \"--tail\", \"200\", \"--timestamps\", name], { timeoutMs: 10_000 }),\n ]);\n if (inspectR.exitCode !== 0) {\n b.limitation(`docker inspect failed: ${inspectR.stderr.trim()}`);\n return b.fail(\"docker inspect failed\").build();\n }\n const d = parseDockerInspect(inspectR.stdout);\n if (!d) return b.fail(\"could not parse docker inspect output\").build();\n const inspectPath = await b.writeArtifact(\"inspect.json\", inspectR.stdout, \"json\", \"docker inspect\");\n const logsText = logsR.stdout + logsR.stderr;\n const logsPath = await b.writeArtifact(\"logs.txt\", logsText, \"log\", \"docker logs --tail 200\");\n\n const st = d.State ?? {};\n const hc = d.HostConfig ?? {};\n const stateEv = b.evidenceOf(\n \"container_state\",\n `state=${st.Status} running=${st.Running} pid=${st.Pid} oom_killed=${st.OOMKilled} exit=${st.ExitCode} restarts=${d.RestartCount ?? st.RestartCount ?? 0}`,\n { status: st.Status, running: st.Running, host_pid: st.Pid, oom_killed: st.OOMKilled, exit_code: st.ExitCode, started_at: st.StartedAt, finished_at: st.FinishedAt, restart_count: d.RestartCount ?? st.RestartCount, error: st.Error, image: d.Config?.Image },\n { artifact: inspectPath },\n );\n const limits = {\n memory_bytes: hc.Memory || null,\n memory_swap_bytes: hc.MemorySwap || null,\n nano_cpus: hc.NanoCpus || null,\n cpu_quota: hc.CpuQuota || null,\n cpu_period: hc.CpuPeriod || null,\n pids_limit: hc.PidsLimit ?? null,\n restart_policy: hc.RestartPolicy?.Name ?? null,\n };\n const limitsEv = b.evidenceOf(\n \"cgroup\",\n `limits: memory=${hc.Memory ? humanBytes(hc.Memory) : \"unlimited\"} cpus=${hc.NanoCpus ? (hc.NanoCpus / 1e9).toFixed(2) : hc.CpuQuota && hc.CpuPeriod ? (hc.CpuQuota / hc.CpuPeriod).toFixed(2) : \"unlimited\"} pids=${hc.PidsLimit ?? \"unlimited\"}`,\n limits,\n { artifact: inspectPath },\n );\n\n const stats = parseDockerStats(statsR.stdout);\n let statsEv: string | undefined;\n if (stats) {\n statsEv = b.evidenceOf(\"metric\", `cpu=${stats.cpu_pct}% mem=${stats.mem_usage} (${stats.mem_pct}%) net=${stats.net_io} block=${stats.block_io} pids=${stats.pids}`, stats);\n } else b.limitation(\"docker stats unavailable (container not running?)\");\n\n const top = parseDockerTop(topR.stdout);\n if (top.length) b.evidenceOf(\"process_list\", `${top.length} process(es) in container; pid1=${top[0]?.comm}`, top.slice(0, 30));\n\n const ports = Object.entries(d.NetworkSettings?.Ports ?? {}).map(([k, v]) => `${k}→${(v ?? []).map((x) => `${x.HostIp}:${x.HostPort}`).join(\",\") || \"unpublished\"}`);\n if (ports.length) b.evidenceOf(\"socket_summary\", `published ports: ${ports.join(\" \")}`, ports);\n\n // Log tail excerpt: errors and OOM-ish lines.\n const logLines = logsText.split(\"\\n\");\n const interesting = logLines.filter((l) => /error|exception|fatal|panic|oom|killed|out of memory|traceback|segfault/i.test(l)).slice(-15);\n if (interesting.length) {\n b.evidenceOf(\"log_excerpt\", `${interesting.length} error-ish line(s) in last ${logLines.length} log lines`, interesting, { artifact: logsPath });\n }\n\n // cgroup (linux host only)\n if (platform() === \"linux\" && st.Pid) {\n const cg = await readCgroupStats(st.Pid);\n if (cg && Object.keys(cg).length) {\n const cgEv = b.evidenceOf(\"cgroup\", `cgroup: oom_kill=${cg.oom_kill ?? 0} oom=${cg.oom ?? 0} throttled=${cg.nr_throttled ?? 0}/${cg.nr_periods ?? 0} periods`, cg);\n if ((cg.oom_kill ?? 0) > 0) b.finding(\"high\", `cgroup reports ${cg.oom_kill} OOM kill(s) for this container`, [cgEv]);\n if ((cg.nr_periods ?? 0) > 0 && (cg.nr_throttled ?? 0) / cg.nr_periods! > 0.1) {\n b.finding(\"warn\", `CPU throttled in ${(((cg.nr_throttled ?? 0) / cg.nr_periods!) * 100).toFixed(0)}% of cgroup periods — the CPU quota is a bottleneck`, [cgEv, limitsEv]);\n }\n }\n } else if (platform() === \"darwin\") {\n b.limitation(\"on macOS the Docker VM hides host pids and cgroups; ptrace-based tools cannot attach to container processes from the host — run Debug Anything inside the container or on a Linux host\");\n }\n\n // Findings\n if (st.OOMKilled) b.finding(\"high\", \"container was OOM-killed (State.OOMKilled=true)\", [stateEv, limitsEv]);\n if (!st.Running) b.finding(\"high\", `container is not running (status=${st.Status}, exit=${st.ExitCode})`, [stateEv]);\n const restarts = d.RestartCount ?? st.RestartCount ?? 0;\n if (restarts > 0) b.finding(\"warn\", `container has restarted ${restarts} time(s)`, [stateEv]);\n if (stats && hc.Memory && stats.mem_pct > 85) b.finding(\"warn\", `memory at ${stats.mem_pct}% of the ${humanBytes(hc.Memory)} limit — close to OOM`, [statsEv!, limitsEv]);\n if (stats && stats.cpu_pct > 90) b.finding(\"warn\", `container CPU at ${stats.cpu_pct}%`, [statsEv!]);\n if (interesting.length) {\n b.finding(\"info\", `recent logs contain ${interesting.length} error-ish line(s) (see evidence)`, [b.evidenceOf(\"log_excerpt\", \"error-ish log lines\", interesting.slice(-5), { artifact: logsPath })]);\n }\n if (b.findingCount === 0 && st.Running) {\n b.finding(\"info\", `container running${stats ? `, memory ${stats.mem_pct}% of ${hc.Memory ? humanBytes(hc.Memory) : \"host\"} and cpu ${stats.cpu_pct}%` : \"\"}, no OOM kill, no restarts`, statsEv ? [stateEv, limitsEv, statsEv] : [stateEv, limitsEv]);\n }\n b.next(\"snapshot_memory\", \"profile_cpu\", \"inspect_sockets\");\n return b.build();\n}\n\nexport const dockerAdapter: Adapter = {\n name: \"docker\",\n tools: [\"container_info\"],\n platforms: [\"linux\", \"darwin\"],\n requires: [\"docker\"],\n install: { linux: \"https://docs.docker.com/engine/install/\", darwin: \"brew install --cask docker (or Colima/OrbStack)\" },\n priority: 10,\n async run(tool, _args, ctx) {\n if (tool !== \"container_info\") throw new Error(`docker adapter cannot run ${tool}`);\n return containerInfo(ctx);\n },\n};\n"],"mappings":"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","names":[]}