procinsh 0.1.2

A local, read-only Linux x86-64 process inspector
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
  <title>procinsh / list</title>
  <link rel="stylesheet" href="/style.css"><script src="/app.js" defer></script>
</head>
<body>
  <header><a href="/" id="brand">procinsh</a><a href="/" id="back" hidden>Back to process list</a></header>
  <main>
    <div id="error" role="alert" hidden></div>
    <section id="explorer">
      <div class="heading"><a href="/space" class="text-button">Open Graph View</a></div>
      <div class="toolbar"><input type="search" id="search" placeholder="Search name, PID, or command…" aria-label="Search processes"><label>Sort <select id="sort"><option value="cpu">CPU ↓</option><option value="rss">RSS ↓</option><option value="pid">PID ↑</option></select></label><span id="process-count" class="muted"></span></div>
      <div class="panel scroll"><table><thead><tr><th>PID</th><th>USER</th><th>CPU</th><th>RSS</th><th>THREADS</th><th>STATE</th><th>NAME / COMMAND</th></tr></thead><tbody id="process-list"></tbody></table></div>
    </section>
    <section id="inspector" hidden>
      <div class="heading"><div><p class="eyebrow" id="identity"></p><h1 id="target-name"></h1><p class="muted command" id="command"></p></div><span class="badge" id="target-status"></span></div>
      <p id="target-error" class="notice" hidden></p>
      <div id="metrics" class="metrics"></div>
      <div class="panel history"><div class="panel-heading"><h2>CPU &amp; memory history</h2><span class="muted">Last 60 seconds · CPU per core</span></div><canvas id="history" height="160" role="img" aria-label="CPU and RSS history over the last 60 seconds"></canvas><div class="legend"><span>● CPU</span><span>● RSS</span><span id="history-scale"></span></div></div>
      <div class="inspector-grid">
        <section class="panel"><div class="panel-heading"><h2>Threads</h2><span id="thread-count" class="muted"></span></div><div class="scroll thread-scroll"><table><thead><tr><th>TID / NAME</th><th>CPU %</th><th>CPU</th><th>STATE</th></tr></thead><tbody id="threads"></tbody></table></div><div id="thread-detail" class="detail muted"></div></section>
        <section class="panel"><div class="panel-heading"><h2>Registers</h2><button id="snapshot">Capture coherent snapshot</button></div><div class="snapshot-controls"><label><input type="checkbox" role="switch" id="auto-snapshot"> Auto capture (1 s)</label><span class="muted" id="auto-snapshot-status" role="status">Auto capture OFF</span></div><p class="muted detail">Each capture briefly pauses all threads.</p><p class="muted detail" id="snapshot-time">Not captured</p><div class="scroll register-scroll"><table><tbody id="registers"></tbody></table></div></section>
        <section class="panel"><div class="panel-heading"><h2>Call Stack</h2><span id="stack-tid" class="muted">Frame pointer</span></div><div id="call-stack" class="stack"><p class="muted">Capture a snapshot to view the call stack.</p></div></section>
        <section class="panel"><div class="panel-heading"><h2>Memory</h2><span class="muted">Read only · current memory</span></div><form id="memory-form" class="toolbar"><input id="address" placeholder="0x0000000000000000" aria-label="Memory address" required><input id="length" type="number" value="256" min="1" max="65536" aria-label="Read length"><button>Read</button></form><p id="memory-info" class="muted detail">Click an address in a mapping or register to read memory.</p><pre id="memory" tabindex="0"></pre></section>
      </div>
      <section class="panel disassembly"><div class="panel-heading"><h2>Disassembly</h2><span class="muted" id="disasm-time">Snapshot · x86-64 / Intel</span></div><p class="muted detail" id="disasm-location">Capture a snapshot to view instructions starting at the selected thread’s RIP.</p><p class="muted detail">→ RIP marks the instruction at capture time. Instructions below are in address order, not execution history.</p><p class="notice detail" id="disasm-error" hidden></p><div class="scroll disasm-scroll"><table><thead><tr><th>POSITION</th><th>ADDRESS</th><th>BYTES</th><th>INSTRUCTION</th></tr></thead><tbody id="disassembly"></tbody></table></div></section>
      <section class="panel maps"><div class="panel-heading"><h2>Memory Maps</h2><span class="muted" id="maps-info">Refresh every 5s</span></div><div class="scroll maps-scroll"><table><thead><tr><th>START / END</th><th>PERM</th><th>RSS</th><th>PSS</th><th>FILE OFFSET</th><th>OBJECT</th></tr></thead><tbody id="maps"></tbody></table></div></section>
      <details class="panel process-detail" id="signals-panel"><summary>Signals</summary><div class="toolbar detail"><button id="signals-refresh">Refresh</button><span class="muted" id="signals-info" role="status">Not captured</span></div><p class="muted detail">Current state, read without pausing the process. Pending signals await delivery; blocked signals have delivery deferred. Ignored signals and registered handlers apply to the whole process. Delivery history and handler addresses are not included. RT uses kernel numbering, which may differ from libc SIGRTMIN.</p><p class="notice detail" id="signals-error" hidden></p><div class="scroll process-detail-scroll"><table><thead><tr><th>SCOPE / STATE</th><th>MASK</th><th>SIGNALS</th></tr></thead><tbody id="signals-entries"></tbody></table></div></details>
      <details class="panel process-detail" id="fds-panel"><summary>Pipe / Socket · Peer processes</summary><div class="toolbar detail"><input type="search" id="fds-search" placeholder="Search FD, PID, protocol, address…" aria-label="Search pipe and socket"><button id="fds-refresh">Refresh</button><span class="muted" id="fds-info" role="status">Not captured</span></div><p class="muted detail">Click a PID to inspect a peer process. Peers and processes sharing the same FD resource are listed separately.</p><p class="muted detail">A point-in-time view without pausing the process. TCP/UDP peers are candidates based on reversed addresses and ports. Peers on remote hosts or in other network namespaces may be unidentified.</p><p class="notice detail" id="fds-error" hidden></p><p class="muted detail" id="fds-warnings" hidden></p><div class="scroll process-detail-scroll"><table><thead><tr><th>FD</th><th>TYPE / ACCESS</th><th>RESOURCE / ADDRESS</th><th>PEER PID / FD</th></tr></thead><tbody id="fds-entries"></tbody></table></div></details>
      <details class="panel process-detail" id="environment-panel"><summary>Environment</summary><div class="toolbar detail"><input type="search" id="environment-search" placeholder="Search name or value…" aria-label="Search environment"><button id="environment-refresh">Refresh</button><span class="muted" id="environment-info" role="status">Not captured</span></div><p class="muted detail">Reads the environment area established at startup. Later changes made by setenv() or similar calls may not be fully reflected.</p><p class="notice detail" id="environment-error" hidden></p><div class="scroll process-detail-scroll"><table><thead><tr><th>NAME</th><th>VALUE</th></tr></thead><tbody id="environment-entries"></tbody></table></div></details>
      <details class="panel process-detail" id="auxv-panel"><summary>Auxiliary Vector</summary><div class="toolbar detail"><button id="auxv-refresh">Refresh</button><span class="muted" id="auxv-info" role="status">Not captured</span></div><p class="muted detail">Values supplied by the kernel at exec time. Click an address to read its current memory.</p><p class="notice detail" id="auxv-error" hidden></p><div class="scroll process-detail-scroll"><table><thead><tr><th>TYPE</th><th>HEX VALUE</th><th>DECIMAL</th><th>DESCRIPTION / STRING</th></tr></thead><tbody id="auxv-entries"></tbody></table></div></details>
    </section>
  </main>
  <footer>procinsh v0.1.0 <span>/proc observation · ptrace snapshot · x86-64</span></footer>
</body>
</html>