1"use strict";(globalThis.webpackChunkwebsite=globalThis.webpackChunkwebsite||[]).push([[4805],{19253(e){e.exports=JSON.parse('{"plugin":{"name":"session-dashboard","description":"Session Analyzer \u2014 per-session analytics for the Hermes desktop app: full page at /session-dashboard with token/cache/cost aggregates, tool-call breakdown, file changes, failure groups, and Ask AI (copies a ready-to-run analysis prompt into a fresh draft chat). Read-only over state.db.","repo":"https://github.com/tommulkins/hermes-plugin-session-analyzer","sha":"f5a880ce8d9c4b3891c0687b4de6f30b93b5da16","shaShort":"f5a880c","tier":"community","category":"desktop","maintainer":"tommulkins","subdir":"","requiresHermes":">=0.20.0","platforms":[],"capabilities":{"providesTools":[],"providesHooks":[],"providesMiddleware":[],"requiresEnv":[]},"docsUrl":"https://github.com/tommulkins/hermes-plugin-session-analyzer","version":"","image":"https://raw.githubusercontent.com/tommulkins/hermes-plugin-session-analyzer/f5a880ce8d9c4b3891c0687b4de6f30b93b5da16/assets/social-preview.png","screenshots":[],"readme":true,"readmeUrl":"https://raw.githubusercontent.com/tommulkins/hermes-plugin-session-analyzer/f5a880ce8d9c4b3891c0687b4de6f30b93b5da16/README.md","maintainerSlug":"tommulkins","installCommand":"hermes plugins install session-dashboard","stars":16,"addedAt":"2026-09-19T02:30:39-07:00","updatedAt":"2026-09-27T23:49:29-07:00"},"readmeHtml":"<h1>Hermes Session Analyzer</h1>\\n<p>Per-session analytics for the <strong>Hermes Desktop</strong> app: tool calls, token/cache\\nusage, spend, files touched, failed calls, search \u2014 plus an <strong>Ask AI</strong> button\\nthat opens a new session analyzing what went wrong and how to improve the next\\none.</p>\\n<p><img src=\\"https://raw.githubusercontent.com/tommulkins/hermes-plugin-session-analyzer/f5a880ce8d9c4b3891c0687b4de6f30b93b5da16/assets/screenshot.png\\" alt=\\"Session Analyzer\\"></p>\\n<p><strong>How to use it well:</strong> the plugin works best as a feedback loop \u2014 analyze a\\nsession, extract the lesson, and turn it into a skill, memory, or a dedicated\\nHermes profile so the next session starts smarter. See\\n<a href=\\"https://github.com/tommulkins/hermes-plugin-session-analyzer/blob/f5a880ce8d9c4b3891c0687b4de6f30b93b5da16/HOW_TO_USE.md\\">HOW_TO_USE.md</a>.</p>\\n<h2>What you get</h2>\\n<ul>\\n<li><strong>Session list</strong> \u2014 title, date, tool count, cost; <strong>Load more</strong> up to 500</li>\\n<li><strong>Search</strong> \u2014 two modes:\\n<ul>\\n<li><strong>Title filter</strong> \u2014 live substring match on title or session id as you\\ntype (searches all sessions)</li>\\n<li><strong>Content search</strong> \u2014 toggle to <code>content</code> for FTS search over message text\\n(the same index Hermes' own session search uses), with <code>>>>snippet<<<</code>\\ncontext per match</li>\\n</ul>\\n</li>\\n<li><strong>Sort</strong> \u2014 <code>recent</code> or <code>worst</code> (most failed tool calls first, red\\n"N failed" badge per row)</li>\\n<li><strong>Per-session detail</strong> \u2014 input/output/cache tokens, spend, duration, message\\ncount, deterministic summary, tool-call breakdown</li>\\n<li><strong>Tool calls</strong> \u2014 per-tool call counts and estimated tokens pushed back into\\ncontext, aligned columns with a labeled header row (<code>tool / calls / ~tokens</code>)</li>\\n<li><strong>Failed calls</strong> \u2014 every failed tool call with its error string, click to\\nexpand and see the tool's arguments <em>and</em> the extracted failure detail\\n(structured error first, ANSI-stripped output tail)</li>\\n<li><strong>Files touched</strong> \u2014 reads and writes, written files highlighted, its own\\nfull-width section below the tool calls</li>\\n<li><strong>Cache-reset / re-bill events</strong> \u2014 model switches, 503 retries, and\\ncompactions each invalidate the prompt cache; each event is listed with a\\none-line plain-language summary of what happened and what it costs you</li>\\n<li><strong>Context growth</strong> \u2014 sparkline of cumulative transcript tokens with the\\nbiggest single jump and the deepest-reasoning turn (annotated with the tools\\nthat ran there), plus one-line explanations of why each matters</li>\\n<li><strong>Repeated calls</strong> \u2014 identical (tool + arguments) calls 3+ times grouped as\\none root-cause problem instead of N failures</li>\\n<li><strong>Session lineage</strong> \u2014 open-session link, and origin labeling (spawned by /\\ncontinuation of / follow-up to) with click-through to the parent</li>\\n<li><strong>Copy session id</strong> \u2014 right-click any session row, or the id line in the\\ndetail panel, or click the copy icon next to it
1</li>\\n<li><strong>Ask AI</strong> \u2014 one click opens a new session with a ready-made analysis\\nprompt (copied to your clipboard). Paste, pick your judge model, send.\\nNo API keys, no config \u2014 it uses your existing Hermes. See\\n<a href=\\"https://github.com/tommulkins/hermes-plugin-session-analyzer/blob/f5a880ce8d9c4b3891c0687b4de6f30b93b5da16/HOW_TO_USE.md\\">HOW_TO_USE.md</a> for what to ask and how to turn the\\nanalysis into lasting changes.</li>\\n</ul>\\n<p><img src=\\"https://raw.githubusercontent.com/tommulkins/hermes-plugin-session-analyzer/f5a880ce8d9c4b3891c0687b4de6f30b93b5da16/assets/subagents.png\\" alt=\\"Subagents\\"></p>\\n<ul>\\n<li><strong>Subagents</strong> \u2014 every subagent spawned by the session: model, status\\n(completed / error), summary, duration, calls, input tokens \u2014 click one to\\njump to its own session detail. Child sessions listed with tool count and\\ncost; unnamed subagent rows are labeled <code>Subagent</code> with their parent id.</li>\\n</ul>\\n<h2>Requirements</h2>\\n<ul>\\n<li>Hermes Desktop (the plugin registers a sidebar row + \u2318K command)</li>\\n<li>macOS / Linux / Windows (any platform Hermes Desktop runs on)</li>\\n</ul>\\n<h2>Install</h2>\\n<p><strong>macOS / Linux:</strong></p>\\n<pre><code class=\\"language-bash\\">git clone https://github.com/tommulkins/hermes-plugin-session-analyzer.git\\ncd hermes-plugin-session-analyzer\\nchmod +x install.sh\\n./install.sh\\n</code></pre>\\n<p><strong>Windows (PowerShell):</strong></p>\\n<pre><code class=\\"language-powershell\\">git clone https://github.com/tommulkins/hermes-plugin-session-analyzer.git\\ncd hermes-plugin-session-analyzer\\npowershell -ExecutionPolicy Bypass -File .\\\\install.ps1\\n</code></pre>\\n<p>The installer copies both halves into your Hermes home \u2014 <code>%LOCALAPPDATA%\\\\hermes</code>\\non Windows, <code>~/.hermes</code> elsewhere (honouring a custom <code>HERMES_HOME</code> if set) \u2014\\nand adds the plugin to <code>plugins.enabled</code> in config.yaml. It is idempotent:\\nsafe to re-run after updates.</p>\\n<p>Then <strong>restart Hermes Desktop</strong> (\u2318Q / quit and reopen) so the backend mounts.</p>\\n<p>Open it via the sidebar <strong>"Session Analyzer"</strong> row (graph icon) or <strong>\u2318K \u2192\\n"Session Analyzer: Open"</strong> (Ctrl+K on Windows).</p>\\n<blockquote>\\n<p>The desktop UI hot-reloads, but the Python backend only mounts at startup \u2014\\nthe restart is required once after installing.</p>\\n</blockquote>\\n<h3>Multiple Hermes profiles</h3>\\n<p>The desktop UI half is shared, but the Python backend is <strong>per-profile</strong>. If\\nyou run Hermes under a profile (e.g. <code>hermes --profile web-dev</code>), the plugin\\nonly works in sessions for that profile once <strong>both</strong> are true:</p>\\n<ol>\\n<li><code>~/.hermes/profiles/<profile>/plugins/session-dashboard/</code> exists (copy it\\nfrom <code>~/.hermes/plugins/session-dashboard/</code>), and</li>\\n<li><code>plugins.enabled</code> in <code>~/.hermes/profiles/<profile>/config.yaml</code> lists\\n<code>session-dashboard</code>.</li>\\n</ol>\\n<p>Without that, the sidebar row appears but every data call fails (the backend\\nnever mounted for that profile). The backend reads that profile's own session\\ndatabase, so a profile sees only its own sessions. Backend changes require a\\nrestart of that profile's Hermes instance.</p>\\n<h2>Install via Hermes</h2>\\n<p>Already have Hermes running? Copy this prompt into a session:</p>\\n<pre><code class=\\"language-text\\">Install the Session Analyzer plugin from https://github.com/tommulkins/hermes-plugin-session-analyzer following the README install instructions (clone and run install.sh), then restart Hermes Desktop so the backend mounts.\\n</code></pre>\\n<h2>Update</h2>\\n<pre><code class=\\"language-bash\\">cd hermes-plugin-session-analyzer\\ngit pull\\nchmod +x install.sh # needed once per fresh clone\\n./install.sh # macOS/Linux \u2014 idempotent, never duplicates config\\npowershell -ExecutionPolicy Bypass -File .\\\\install.ps1 # Windows\\n</code></pre>\\n<p>Restart Hermes Desktop again to pick up backend changes.</p>\\n<h2>Uninstall</h2>\\n<p><strong>macOS / Linux:</strong></p>\\n<pre><code class=\\"language-bash\\">rm -rf ~/.hermes/desktop-plugins/session-dashboard\\nrm -rf ~/.hermes/plugins/session-dashboard\\n</code></pre>\\n<p><strong>Windows (PowerShell):</strong></p>\\n<pre><code class=\\"language-powershell\\">$home = "$env:LOCALAPPDATA\\\\hermes" # or your HERMES_HOME if you set one\\nRemove-Item -Recurse -Force "$home\\\\desktop-plugins\\\\session-dashboard"\\nRemove-Item -Recurse -Force "$home\\\\plugins\\\\session-dashboard"\\n</code></pre>\\n<p>Then remove <code>session-dashboard</code> from <code>plugins.enabled</code> in\\n<code>~/.hermes/config.yaml</code> (or leave it \u2014 a missing plugin is ignored), and\\nrestart Hermes Desktop.</p>\\n<h2>How it works</h2>\\n<p>
1Two cooperating halves, both read-only over the session store\\n(<code>~/.hermes/state.db</code>):</p>\\n<table>\\n<thead>\\n<tr>\\n<th>Half</th>\\n<th>Location</th>\\n<th>What it does</th>\\n</tr>\\n</thead>\\n<tbody>\\n<tr>\\n<td>Desktop plugin</td>\\n<td><code>~/.hermes/desktop-plugins/session-dashboard/plugin.js</code></td>\\n<td>UI: page, sidebar row, \u2318K, drag-resize divider, Ask AI</td>\\n</tr>\\n<tr>\\n<td>Backend API</td>\\n<td><code>~/.hermes/plugins/session-dashboard/dashboard/</code></td>\\n<td>FastAPI routes over <code>state.db</code>: <code>/sessions</code>, <code>/sessions/{id}</code> with token/cost/failure aggregates</td>\\n</tr>\\n</tbody>\\n</table>\\n<p>The backend reads <code>sessions</code>, <code>messages</code>, and <code>session_model_usage</code> tables\\ndirectly \u2014 it never writes. Token, cache, and cost figures are the same\\nnumbers the app records per turn.</p>\\n<p><strong>Ask AI</strong> copies a self-contained analysis prompt to your clipboard and opens\\na fresh draft chat (the app's own new-chat door \u2014 no pre-created session, so\\nownership always resolves). Paste, choose the model, send.</p>\\n<h2>Files</h2>\\n<pre><code>hermes-plugin-session-analyzer/\\n\u251c\u2500\u2500 install.sh # macOS/Linux installer\\n\u251c\u2500\u2500 install.ps1 # Windows installer\\n\u251c\u2500\u2500 desktop/plugin.js # UI (hot-reloads)\\n\u251c\u2500\u2500 dashboard/\\n\u2502 \u251c\u2500\u2500 manifest.json # backend manifest\\n\u2502 \u2514\u2500\u2500 plugin_api.py # FastAPI over state.db\\n\u251c\u2500\u2500 plugin.yaml # native manifest (plugin catalog)\\n\u2514\u2500\u2500 tests/\\n \u251c\u2500\u2500 test_plugin_api.py # unit tests (pytest)\\n \u2514\u2500\u2500 test_acceptance_live.py # acceptance over real state.db\\n</code></pre>\\n<h3>Tests</h3>\\n<pre><code class=\\"language-bash\\">~/.hermes/hermes-agent/venv/bin/pytest tests/ -q # unit + acceptance\\npnpm lint # plugin lint gate (loader traps, packaged-CSS gaps)\\npnpm lint:test # lint rule self-tests\\n</code></pre>\\n<h2>Support</h2>\\n<p>Found a bug, or have an idea for making Session Analyzer better? Open an\\nissue \u2014 we read them all and tag fixes with release versions:</p>\\n<ul>\\n<li><strong>Report issues:</strong> <a href=\\"https://github.com/tommulkins/hermes-plugin-session-analyzer/issues\\">https://github.com/tommulkins/hermes-plugin-session-analyzer/issues</a></li>\\n<li><strong>See releases:</strong> <a href=\\"https://github.com/tommulkins/hermes-plugin-session-analyzer/releases\\">https://github.com/tommulkins/hermes-plugin-session-analyzer/releases</a></li>\\n</ul>\\n<h2>License</h2>\\n<p>MIT</p>","readmeSourceUrl":"https://raw.githubusercontent.com/tommulkins/hermes-plugin-session-analyzer/f5a880ce8d9c4b3891c0687b4de6f30b93b5da16/README.md","author":{"slug":"tommulkins","name":"tommulkins","count":1},"moreByAuthor":[],"generatedAt":"2026-10-02T00:25:15.833563+00:00","starsFetchedAt":"2026-10-01T20:06:03.122684+00:00"}')}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.