Skip to content

fix(hermes): surface dashboard launch failures with a real diagnostic block - #3413

Open
la14-1 wants to merge 1 commit into
mainfrom
fix/hermes-dashboard-surface-errors
Open

fix(hermes): surface dashboard launch failures with a real diagnostic block#3413
la14-1 wants to merge 1 commit into
mainfrom
fix/hermes-dashboard-surface-errors

Conversation

@la14-1

Copy link
Copy Markdown
Collaborator

Summary

  • startHermesDashboard() previously hid every failure behind a generic "Hermes web dashboard failed to start — TUI still available" warning. When users reported breakage (e.g. issue [Bug]: hermes on digitalocean fails — hermes dashboard reported as not a command #3407 — Andrew's "hermes dashboard isn't a command" / "the dashboard command of hermes also changed to something else") we had no signal to debug from.
  • Now the deploy script installs an EXIT trap that fires on any non-zero exit and dumps a banner-delimited diagnostic block to stderr (which is inherited live to the user's terminal):
    ──── Hermes dashboard diagnostic ────
    hermes binary: /home/.../venv/bin/hermes
    hermes version: Hermes Agent v0.13.0 (2026.5.7)
    hermes subcommands: includes "dashboard"
    ─── /tmp/hermes-dashboard.log (last 30 lines) ───
    <actual hermes process output>
    ─────────────────────────────────────
    
  • The trap is cleared on the success path so it stays quiet when things work.
  • The TS-side warning now also includes the underlying error message and points users at the diagnostic block for bug reports.
  • Bumps @openrouter/spawn to 1.0.45.

What this catches

Failure modeOld outputNew output
hermes not in PATHgeneric warninghermes binary: <not found in PATH> + tail-of-log
dashboard subcommand genuinely renamed/removedgeneric warninghermes subcommands: "dashboard" NOT in --help output
fastapi/uvicorn lazy-install failsgeneric warningfull hermes stderr including the import-error message
Web dist build failsgeneric warningthe build-error stack tailed from /tmp/hermes-dashboard.log
Port 9119 already taken / bind failuregeneric warninghermes's own bind error from the log

Test plan

  • bunx @biomejs/biome check src/ — clean (203 files)
  • bun test — 2207 pass / 0 fail (was 2204; +3 new assertions)
  • New tests pin: trap '_dashboard_diag' EXIT, the diagnostic banner, all probe commands, trap - EXIT on success, and the failure-surfacing TS-side message.
  • Generated script syntax-checked with bash -n
  • Subcommand probe (hermes --help | grep -q '^[[:space:]]*dashboard') verified against a live install of hermes-agent v0.13.0 (2026.5.7) from main — matches, so genuine missing-subcommand reports will be loud, not noise.

Refs #3407 — won't close it; that issue stays open until we get a real diagnostic from the next user who hits this and can report the actual cause.

@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Note: This PR and #3410 both address #3407 but are complementary, not duplicates:

Recommend merging #3410 first, then this PR. #3413 builds on #3410's version bump (1.0.44 → 1.0.45), so landing #3410 first avoids a version conflict in package.json.

-- refactor/pr-maintainer

@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Reviewed both PRs for #3407. Closed #3410 (probe-only approach) in favor of this one — the diagnostic block is the right call because:

  1. Silent skip (PR fix(hermes): gate dashboard launch behind capability probe #3410) hides the root cause; this PR surfaces it
  2. The trap-based diagnostic dump gives users and us everything needed for debugging: binary path, version, subcommand availability, and log tail
  3. Includes 3 new test assertions pinning the diagnostic behavior
  4. Version bump included

All CI checks pass. Ready for maintainer review and merge.

-- refactor/code-health

@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Review: PR #3413 — hermes dashboard diagnostic block

Assessment: LGTM — solid fix for #3407.

Checked against the requirements:

  1. Probes hermes --help before launch to detect missing subcommand — Yes. The diagnostic dump includes hermes --help 2>&1 | grep -q '^[[:space:]]*dashboard' with clear messaging for both present/absent cases ("dashboard" NOT in --help output). This is the exact failure mode from issue [Bug]: hermes on digitalocean fails — hermes dashboard reported as not a command #3407.

  2. Pipes failure output to logWarn so users see the real error — Yes. The TS-side logWarn now includes getErrorMessage(result.error) so the underlying runServer failure reason is surfaced, plus a second logWarn pointing users to the diagnostic block and GitHub issues.

Additional positives:

  • The trap '_dashboard_diag' EXIT pattern is clean — fires on any non-zero exit path without duplicating the dump at each failure point.
  • trap - EXIT on the success path prevents noise on normal launches.
  • All diagnostic commands (command -v hermes, hermes --version, hermes --help, tail -30 /tmp/hermes-dashboard.log) tolerate missing tools gracefully.
  • Test coverage is thorough — pins the trap, diagnostic banner content, success-path trap clear, and TS-side error surfacing.
  • Version bump to 1.0.45 is present.

No gaps found. Ready for merge.

-- refactor/code-health

@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Verified on current main (2026-05-18): lint clean (0 errors), all CI checks passing (ShellCheck, Mock Tests, Biome Lint, Unit Tests, macOS Compatibility). Branch is mergeable with no conflicts. Ready for review.

-- refactor/pr-maintainer

… block
`startHermesDashboard()` previously hid every failure behind the generic
warning "Hermes web dashboard failed to start — TUI still available".
When users reported breakage (issue #3407 — "hermes dashboard isn't a
command") we had no signal to act on: was the binary missing? subcommand
gone? fastapi/uvicorn lazy-install failed? web dist build failed?
Now the deploy script installs an EXIT trap that fires on any non-zero
exit and dumps a banner-delimited diagnostic block to stderr (which is
inherited live to the user's terminal):
──── Hermes dashboard diagnostic ────
hermes binary: /home/.../venv/bin/hermes
hermes version: Hermes Agent v0.13.0 (2026.5.7)
hermes subcommands: includes "dashboard"
─── /tmp/hermes-dashboard.log (last 30 lines) ───
<actual hermes process output>
─────────────────────────────────────
The trap is cleared on the success path so it stays quiet when things
work. The TS-side warning now also includes the underlying error
message and points users at the diagnostic block for bug reports.
Bumps `@openrouter/spawn` to 1.0.45.
Verified locally: installed hermes-agent v0.13.0 (2026.5.7) from main,
confirmed `hermes --help | grep -q '^[[:space:]]*dashboard'` matches —
so genuine "dashboard subcommand missing" reports will now be loud and
actionable.
Refs #3407.
@la14-1
la14-1force-pushed the fix/hermes-dashboard-surface-errors branch from cb72cb6 to 6fc0da1CompareMay 21, 2026 07:11
@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Rebased onto main — version conflict resolved by keeping main's v1.1.0. Lint clean (0 errors). Ready for review.

-- refactor/pr-maintainer

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@la14-1@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
fix(hermes): surface dashboard launch failures with a real diagnostic block by la14-1 · Pull Request #3413 · OpenRouterLabs/spawn · GitHub
Skip to content

fix(hermes): surface dashboard launch failures with a real diagnostic block - #3413

Open
la14-1 wants to merge 1 commit into
mainfrom
fix/hermes-dashboard-surface-errors
Open

fix(hermes): surface dashboard launch failures with a real diagnostic block#3413
la14-1 wants to merge 1 commit into
mainfrom
fix/hermes-dashboard-surface-errors

Conversation

@la14-1

Copy link
Copy Markdown
Collaborator

Summary

  • startHermesDashboard() previously hid every failure behind a generic "Hermes web dashboard failed to start — TUI still available" warning. When users reported breakage (e.g. issue [Bug]: hermes on digitalocean fails — hermes dashboard reported as not a command #3407 — Andrew's "hermes dashboard isn't a command" / "the dashboard command of hermes also changed to something else") we had no signal to debug from.
  • Now the deploy script installs an EXIT trap that fires on any non-zero exit and dumps a banner-delimited diagnostic block to stderr (which is inherited live to the user's terminal):
    ──── Hermes dashboard diagnostic ────
    hermes binary: /home/.../venv/bin/hermes
    hermes version: Hermes Agent v0.13.0 (2026.5.7)
    hermes subcommands: includes "dashboard"
    ─── /tmp/hermes-dashboard.log (last 30 lines) ───
    <actual hermes process output>
    ─────────────────────────────────────
    
  • The trap is cleared on the success path so it stays quiet when things work.
  • The TS-side warning now also includes the underlying error message and points users at the diagnostic block for bug reports.
  • Bumps @openrouter/spawn to 1.0.45.

What this catches

Failure modeOld outputNew output
hermes not in PATHgeneric warninghermes binary: <not found in PATH> + tail-of-log
dashboard subcommand genuinely renamed/removedgeneric warninghermes subcommands: "dashboard" NOT in --help output
fastapi/uvicorn lazy-install failsgeneric warningfull hermes stderr including the import-error message
Web dist build failsgeneric warningthe build-error stack tailed from /tmp/hermes-dashboard.log
Port 9119 already taken / bind failuregeneric warninghermes's own bind error from the log

Test plan

  • bunx @biomejs/biome check src/ — clean (203 files)
  • bun test — 2207 pass / 0 fail (was 2204; +3 new assertions)
  • New tests pin: trap '_dashboard_diag' EXIT, the diagnostic banner, all probe commands, trap - EXIT on success, and the failure-surfacing TS-side message.
  • Generated script syntax-checked with bash -n
  • Subcommand probe (hermes --help | grep -q '^[[:space:]]*dashboard') verified against a live install of hermes-agent v0.13.0 (2026.5.7) from main — matches, so genuine missing-subcommand reports will be loud, not noise.

Refs #3407 — won't close it; that issue stays open until we get a real diagnostic from the next user who hits this and can report the actual cause.

@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Note: This PR and #3410 both address #3407 but are complementary, not duplicates:

Recommend merging #3410 first, then this PR. #3413 builds on #3410's version bump (1.0.44 → 1.0.45), so landing #3410 first avoids a version conflict in package.json.

-- refactor/pr-maintainer

@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Reviewed both PRs for #3407. Closed #3410 (probe-only approach) in favor of this one — the diagnostic block is the right call because:

  1. Silent skip (PR fix(hermes): gate dashboard launch behind capability probe #3410) hides the root cause; this PR surfaces it
  2. The trap-based diagnostic dump gives users and us everything needed for debugging: binary path, version, subcommand availability, and log tail
  3. Includes 3 new test assertions pinning the diagnostic behavior
  4. Version bump included

All CI checks pass. Ready for maintainer review and merge.

-- refactor/code-health

@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Review: PR #3413 — hermes dashboard diagnostic block

Assessment: LGTM — solid fix for #3407.

Checked against the requirements:

  1. Probes hermes --help before launch to detect missing subcommand — Yes. The diagnostic dump includes hermes --help 2>&1 | grep -q '^[[:space:]]*dashboard' with clear messaging for both present/absent cases ("dashboard" NOT in --help output). This is the exact failure mode from issue [Bug]: hermes on digitalocean fails — hermes dashboard reported as not a command #3407.

  2. Pipes failure output to logWarn so users see the real error — Yes. The TS-side logWarn now includes getErrorMessage(result.error) so the underlying runServer failure reason is surfaced, plus a second logWarn pointing users to the diagnostic block and GitHub issues.

Additional positives:

  • The trap '_dashboard_diag' EXIT pattern is clean — fires on any non-zero exit path without duplicating the dump at each failure point.
  • trap - EXIT on the success path prevents noise on normal launches.
  • All diagnostic commands (command -v hermes, hermes --version, hermes --help, tail -30 /tmp/hermes-dashboard.log) tolerate missing tools gracefully.
  • Test coverage is thorough — pins the trap, diagnostic banner content, success-path trap clear, and TS-side error surfacing.
  • Version bump to 1.0.45 is present.

No gaps found. Ready for merge.

-- refactor/code-health

@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Verified on current main (2026-05-18): lint clean (0 errors), all CI checks passing (ShellCheck, Mock Tests, Biome Lint, Unit Tests, macOS Compatibility). Branch is mergeable with no conflicts. Ready for review.

-- refactor/pr-maintainer

… block
`startHermesDashboard()` previously hid every failure behind the generic
warning "Hermes web dashboard failed to start — TUI still available".
When users reported breakage (issue #3407 — "hermes dashboard isn't a
command") we had no signal to act on: was the binary missing? subcommand
gone? fastapi/uvicorn lazy-install failed? web dist build failed?
Now the deploy script installs an EXIT trap that fires on any non-zero
exit and dumps a banner-delimited diagnostic block to stderr (which is
inherited live to the user's terminal):
──── Hermes dashboard diagnostic ────
hermes binary: /home/.../venv/bin/hermes
hermes version: Hermes Agent v0.13.0 (2026.5.7)
hermes subcommands: includes "dashboard"
─── /tmp/hermes-dashboard.log (last 30 lines) ───
<actual hermes process output>
─────────────────────────────────────
The trap is cleared on the success path so it stays quiet when things
work. The TS-side warning now also includes the underlying error
message and points users at the diagnostic block for bug reports.
Bumps `@openrouter/spawn` to 1.0.45.
Verified locally: installed hermes-agent v0.13.0 (2026.5.7) from main,
confirmed `hermes --help | grep -q '^[[:space:]]*dashboard'` matches —
so genuine "dashboard subcommand missing" reports will now be loud and
actionable.
Refs #3407.
@la14-1
la14-1force-pushed the fix/hermes-dashboard-surface-errors branch from cb72cb6 to 6fc0da1CompareMay 21, 2026 07:11
@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Rebased onto main — version conflict resolved by keeping main's v1.1.0. Lint clean (0 errors). Ready for review.

-- refactor/pr-maintainer

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@la14-1@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(hermes): surface dashboard launch failures with a real diagnostic block by la14-1 · Pull Request #3413 · OpenRouterLabs/spawn · GitHub
Skip to content

fix(hermes): surface dashboard launch failures with a real diagnostic block - #3413

Open
la14-1 wants to merge 1 commit into
mainfrom
fix/hermes-dashboard-surface-errors
Open

fix(hermes): surface dashboard launch failures with a real diagnostic block#3413
la14-1 wants to merge 1 commit into
mainfrom
fix/hermes-dashboard-surface-errors

Conversation

@la14-1

Copy link
Copy Markdown
Collaborator

Summary

  • startHermesDashboard() previously hid every failure behind a generic "Hermes web dashboard failed to start — TUI still available" warning. When users reported breakage (e.g. issue [Bug]: hermes on digitalocean fails — hermes dashboard reported as not a command #3407 — Andrew's "hermes dashboard isn't a command" / "the dashboard command of hermes also changed to something else") we had no signal to debug from.
  • Now the deploy script installs an EXIT trap that fires on any non-zero exit and dumps a banner-delimited diagnostic block to stderr (which is inherited live to the user's terminal):
    ──── Hermes dashboard diagnostic ────
    hermes binary: /home/.../venv/bin/hermes
    hermes version: Hermes Agent v0.13.0 (2026.5.7)
    hermes subcommands: includes "dashboard"
    ─── /tmp/hermes-dashboard.log (last 30 lines) ───
    <actual hermes process output>
    ─────────────────────────────────────
    
  • The trap is cleared on the success path so it stays quiet when things work.
  • The TS-side warning now also includes the underlying error message and points users at the diagnostic block for bug reports.
  • Bumps @openrouter/spawn to 1.0.45.

What this catches

Failure modeOld outputNew output
hermes not in PATHgeneric warninghermes binary: <not found in PATH> + tail-of-log
dashboard subcommand genuinely renamed/removedgeneric warninghermes subcommands: "dashboard" NOT in --help output
fastapi/uvicorn lazy-install failsgeneric warningfull hermes stderr including the import-error message
Web dist build failsgeneric warningthe build-error stack tailed from /tmp/hermes-dashboard.log
Port 9119 already taken / bind failuregeneric warninghermes's own bind error from the log

Test plan

  • bunx @biomejs/biome check src/ — clean (203 files)
  • bun test — 2207 pass / 0 fail (was 2204; +3 new assertions)
  • New tests pin: trap '_dashboard_diag' EXIT, the diagnostic banner, all probe commands, trap - EXIT on success, and the failure-surfacing TS-side message.
  • Generated script syntax-checked with bash -n
  • Subcommand probe (hermes --help | grep -q '^[[:space:]]*dashboard') verified against a live install of hermes-agent v0.13.0 (2026.5.7) from main — matches, so genuine missing-subcommand reports will be loud, not noise.

Refs #3407 — won't close it; that issue stays open until we get a real diagnostic from the next user who hits this and can report the actual cause.

@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Note: This PR and #3410 both address #3407 but are complementary, not duplicates:

Recommend merging #3410 first, then this PR. #3413 builds on #3410's version bump (1.0.44 → 1.0.45), so landing #3410 first avoids a version conflict in package.json.

-- refactor/pr-maintainer

@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Reviewed both PRs for #3407. Closed #3410 (probe-only approach) in favor of this one — the diagnostic block is the right call because:

  1. Silent skip (PR fix(hermes): gate dashboard launch behind capability probe #3410) hides the root cause; this PR surfaces it
  2. The trap-based diagnostic dump gives users and us everything needed for debugging: binary path, version, subcommand availability, and log tail
  3. Includes 3 new test assertions pinning the diagnostic behavior
  4. Version bump included

All CI checks pass. Ready for maintainer review and merge.

-- refactor/code-health

@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Review: PR #3413 — hermes dashboard diagnostic block

Assessment: LGTM — solid fix for #3407.

Checked against the requirements:

  1. Probes hermes --help before launch to detect missing subcommand — Yes. The diagnostic dump includes hermes --help 2>&1 | grep -q '^[[:space:]]*dashboard' with clear messaging for both present/absent cases ("dashboard" NOT in --help output). This is the exact failure mode from issue [Bug]: hermes on digitalocean fails — hermes dashboard reported as not a command #3407.

  2. Pipes failure output to logWarn so users see the real error — Yes. The TS-side logWarn now includes getErrorMessage(result.error) so the underlying runServer failure reason is surfaced, plus a second logWarn pointing users to the diagnostic block and GitHub issues.

Additional positives:

  • The trap '_dashboard_diag' EXIT pattern is clean — fires on any non-zero exit path without duplicating the dump at each failure point.
  • trap - EXIT on the success path prevents noise on normal launches.
  • All diagnostic commands (command -v hermes, hermes --version, hermes --help, tail -30 /tmp/hermes-dashboard.log) tolerate missing tools gracefully.
  • Test coverage is thorough — pins the trap, diagnostic banner content, success-path trap clear, and TS-side error surfacing.
  • Version bump to 1.0.45 is present.

No gaps found. Ready for merge.

-- refactor/code-health

@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Verified on current main (2026-05-18): lint clean (0 errors), all CI checks passing (ShellCheck, Mock Tests, Biome Lint, Unit Tests, macOS Compatibility). Branch is mergeable with no conflicts. Ready for review.

-- refactor/pr-maintainer

… block
`startHermesDashboard()` previously hid every failure behind the generic
warning "Hermes web dashboard failed to start — TUI still available".
When users reported breakage (issue #3407 — "hermes dashboard isn't a
command") we had no signal to act on: was the binary missing? subcommand
gone? fastapi/uvicorn lazy-install failed? web dist build failed?
Now the deploy script installs an EXIT trap that fires on any non-zero
exit and dumps a banner-delimited diagnostic block to stderr (which is
inherited live to the user's terminal):
──── Hermes dashboard diagnostic ────
hermes binary: /home/.../venv/bin/hermes
hermes version: Hermes Agent v0.13.0 (2026.5.7)
hermes subcommands: includes "dashboard"
─── /tmp/hermes-dashboard.log (last 30 lines) ───
<actual hermes process output>
─────────────────────────────────────
The trap is cleared on the success path so it stays quiet when things
work. The TS-side warning now also includes the underlying error
message and points users at the diagnostic block for bug reports.
Bumps `@openrouter/spawn` to 1.0.45.
Verified locally: installed hermes-agent v0.13.0 (2026.5.7) from main,
confirmed `hermes --help | grep -q '^[[:space:]]*dashboard'` matches —
so genuine "dashboard subcommand missing" reports will now be loud and
actionable.
Refs #3407.
@la14-1
la14-1force-pushed the fix/hermes-dashboard-surface-errors branch from cb72cb6 to 6fc0da1CompareMay 21, 2026 07:11
@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Rebased onto main — version conflict resolved by keeping main's v1.1.0. Lint clean (0 errors). Ready for review.

-- refactor/pr-maintainer

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@la14-1@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(hermes): surface dashboard launch failures with a real diagnostic block by la14-1 · Pull Request #3413 · OpenRouterLabs/spawn · GitHub
Skip to content

fix(hermes): surface dashboard launch failures with a real diagnostic block - #3413

Open
la14-1 wants to merge 1 commit into
mainfrom
fix/hermes-dashboard-surface-errors
Open

fix(hermes): surface dashboard launch failures with a real diagnostic block#3413
la14-1 wants to merge 1 commit into
mainfrom
fix/hermes-dashboard-surface-errors

Conversation

@la14-1

Copy link
Copy Markdown
Collaborator

Summary

  • startHermesDashboard() previously hid every failure behind a generic "Hermes web dashboard failed to start — TUI still available" warning. When users reported breakage (e.g. issue [Bug]: hermes on digitalocean fails — hermes dashboard reported as not a command #3407 — Andrew's "hermes dashboard isn't a command" / "the dashboard command of hermes also changed to something else") we had no signal to debug from.
  • Now the deploy script installs an EXIT trap that fires on any non-zero exit and dumps a banner-delimited diagnostic block to stderr (which is inherited live to the user's terminal):
    ──── Hermes dashboard diagnostic ────
    hermes binary: /home/.../venv/bin/hermes
    hermes version: Hermes Agent v0.13.0 (2026.5.7)
    hermes subcommands: includes "dashboard"
    ─── /tmp/hermes-dashboard.log (last 30 lines) ───
    <actual hermes process output>
    ─────────────────────────────────────
    
  • The trap is cleared on the success path so it stays quiet when things work.
  • The TS-side warning now also includes the underlying error message and points users at the diagnostic block for bug reports.
  • Bumps @openrouter/spawn to 1.0.45.

What this catches

Failure modeOld outputNew output
hermes not in PATHgeneric warninghermes binary: <not found in PATH> + tail-of-log
dashboard subcommand genuinely renamed/removedgeneric warninghermes subcommands: "dashboard" NOT in --help output
fastapi/uvicorn lazy-install failsgeneric warningfull hermes stderr including the import-error message
Web dist build failsgeneric warningthe build-error stack tailed from /tmp/hermes-dashboard.log
Port 9119 already taken / bind failuregeneric warninghermes's own bind error from the log

Test plan

  • bunx @biomejs/biome check src/ — clean (203 files)
  • bun test — 2207 pass / 0 fail (was 2204; +3 new assertions)
  • New tests pin: trap '_dashboard_diag' EXIT, the diagnostic banner, all probe commands, trap - EXIT on success, and the failure-surfacing TS-side message.
  • Generated script syntax-checked with bash -n
  • Subcommand probe (hermes --help | grep -q '^[[:space:]]*dashboard') verified against a live install of hermes-agent v0.13.0 (2026.5.7) from main — matches, so genuine missing-subcommand reports will be loud, not noise.

Refs #3407 — won't close it; that issue stays open until we get a real diagnostic from the next user who hits this and can report the actual cause.

@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Note: This PR and #3410 both address #3407 but are complementary, not duplicates:

Recommend merging #3410 first, then this PR. #3413 builds on #3410's version bump (1.0.44 → 1.0.45), so landing #3410 first avoids a version conflict in package.json.

-- refactor/pr-maintainer

@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Reviewed both PRs for #3407. Closed #3410 (probe-only approach) in favor of this one — the diagnostic block is the right call because:

  1. Silent skip (PR fix(hermes): gate dashboard launch behind capability probe #3410) hides the root cause; this PR surfaces it
  2. The trap-based diagnostic dump gives users and us everything needed for debugging: binary path, version, subcommand availability, and log tail
  3. Includes 3 new test assertions pinning the diagnostic behavior
  4. Version bump included

All CI checks pass. Ready for maintainer review and merge.

-- refactor/code-health

@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Review: PR #3413 — hermes dashboard diagnostic block

Assessment: LGTM — solid fix for #3407.

Checked against the requirements:

  1. Probes hermes --help before launch to detect missing subcommand — Yes. The diagnostic dump includes hermes --help 2>&1 | grep -q '^[[:space:]]*dashboard' with clear messaging for both present/absent cases ("dashboard" NOT in --help output). This is the exact failure mode from issue [Bug]: hermes on digitalocean fails — hermes dashboard reported as not a command #3407.

  2. Pipes failure output to logWarn so users see the real error — Yes. The TS-side logWarn now includes getErrorMessage(result.error) so the underlying runServer failure reason is surfaced, plus a second logWarn pointing users to the diagnostic block and GitHub issues.

Additional positives:

  • The trap '_dashboard_diag' EXIT pattern is clean — fires on any non-zero exit path without duplicating the dump at each failure point.
  • trap - EXIT on the success path prevents noise on normal launches.
  • All diagnostic commands (command -v hermes, hermes --version, hermes --help, tail -30 /tmp/hermes-dashboard.log) tolerate missing tools gracefully.
  • Test coverage is thorough — pins the trap, diagnostic banner content, success-path trap clear, and TS-side error surfacing.
  • Version bump to 1.0.45 is present.

No gaps found. Ready for merge.

-- refactor/code-health

@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Verified on current main (2026-05-18): lint clean (0 errors), all CI checks passing (ShellCheck, Mock Tests, Biome Lint, Unit Tests, macOS Compatibility). Branch is mergeable with no conflicts. Ready for review.

-- refactor/pr-maintainer

… block
`startHermesDashboard()` previously hid every failure behind the generic
warning "Hermes web dashboard failed to start — TUI still available".
When users reported breakage (issue #3407 — "hermes dashboard isn't a
command") we had no signal to act on: was the binary missing? subcommand
gone? fastapi/uvicorn lazy-install failed? web dist build failed?
Now the deploy script installs an EXIT trap that fires on any non-zero
exit and dumps a banner-delimited diagnostic block to stderr (which is
inherited live to the user's terminal):
──── Hermes dashboard diagnostic ────
hermes binary: /home/.../venv/bin/hermes
hermes version: Hermes Agent v0.13.0 (2026.5.7)
hermes subcommands: includes "dashboard"
─── /tmp/hermes-dashboard.log (last 30 lines) ───
<actual hermes process output>
─────────────────────────────────────
The trap is cleared on the success path so it stays quiet when things
work. The TS-side warning now also includes the underlying error
message and points users at the diagnostic block for bug reports.
Bumps `@openrouter/spawn` to 1.0.45.
Verified locally: installed hermes-agent v0.13.0 (2026.5.7) from main,
confirmed `hermes --help | grep -q '^[[:space:]]*dashboard'` matches —
so genuine "dashboard subcommand missing" reports will now be loud and
actionable.
Refs #3407.
@la14-1
la14-1force-pushed the fix/hermes-dashboard-surface-errors branch from cb72cb6 to 6fc0da1CompareMay 21, 2026 07:11
@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Rebased onto main — version conflict resolved by keeping main's v1.1.0. Lint clean (0 errors). Ready for review.

-- refactor/pr-maintainer

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@la14-1@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' fix(hermes): surface dashboard launch failures with a real diagnostic block by la14-1 · Pull Request #3413 · OpenRouterLabs/spawn · GitHub
Skip to content

fix(hermes): surface dashboard launch failures with a real diagnostic block - #3413

Open
la14-1 wants to merge 1 commit into
mainfrom
fix/hermes-dashboard-surface-errors
Open

fix(hermes): surface dashboard launch failures with a real diagnostic block#3413
la14-1 wants to merge 1 commit into
mainfrom
fix/hermes-dashboard-surface-errors

Conversation

@la14-1

Copy link
Copy Markdown
Collaborator

Summary

  • startHermesDashboard() previously hid every failure behind a generic "Hermes web dashboard failed to start — TUI still available" warning. When users reported breakage (e.g. issue [Bug]: hermes on digitalocean fails — hermes dashboard reported as not a command #3407 — Andrew's "hermes dashboard isn't a command" / "the dashboard command of hermes also changed to something else") we had no signal to debug from.
  • Now the deploy script installs an EXIT trap that fires on any non-zero exit and dumps a banner-delimited diagnostic block to stderr (which is inherited live to the user's terminal):
    ──── Hermes dashboard diagnostic ────
    hermes binary: /home/.../venv/bin/hermes
    hermes version: Hermes Agent v0.13.0 (2026.5.7)
    hermes subcommands: includes "dashboard"
    ─── /tmp/hermes-dashboard.log (last 30 lines) ───
    <actual hermes process output>
    ─────────────────────────────────────
    
  • The trap is cleared on the success path so it stays quiet when things work.
  • The TS-side warning now also includes the underlying error message and points users at the diagnostic block for bug reports.
  • Bumps @openrouter/spawn to 1.0.45.

What this catches

Failure modeOld outputNew output
hermes not in PATHgeneric warninghermes binary: <not found in PATH> + tail-of-log
dashboard subcommand genuinely renamed/removedgeneric warninghermes subcommands: "dashboard" NOT in --help output
fastapi/uvicorn lazy-install failsgeneric warningfull hermes stderr including the import-error message
Web dist build failsgeneric warningthe build-error stack tailed from /tmp/hermes-dashboard.log
Port 9119 already taken / bind failuregeneric warninghermes's own bind error from the log

Test plan

  • bunx @biomejs/biome check src/ — clean (203 files)
  • bun test — 2207 pass / 0 fail (was 2204; +3 new assertions)
  • New tests pin: trap '_dashboard_diag' EXIT, the diagnostic banner, all probe commands, trap - EXIT on success, and the failure-surfacing TS-side message.
  • Generated script syntax-checked with bash -n
  • Subcommand probe (hermes --help | grep -q '^[[:space:]]*dashboard') verified against a live install of hermes-agent v0.13.0 (2026.5.7) from main — matches, so genuine missing-subcommand reports will be loud, not noise.

Refs #3407 — won't close it; that issue stays open until we get a real diagnostic from the next user who hits this and can report the actual cause.

@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Note: This PR and #3410 both address #3407 but are complementary, not duplicates:

Recommend merging #3410 first, then this PR. #3413 builds on #3410's version bump (1.0.44 → 1.0.45), so landing #3410 first avoids a version conflict in package.json.

-- refactor/pr-maintainer

@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Reviewed both PRs for #3407. Closed #3410 (probe-only approach) in favor of this one — the diagnostic block is the right call because:

  1. Silent skip (PR fix(hermes): gate dashboard launch behind capability probe #3410) hides the root cause; this PR surfaces it
  2. The trap-based diagnostic dump gives users and us everything needed for debugging: binary path, version, subcommand availability, and log tail
  3. Includes 3 new test assertions pinning the diagnostic behavior
  4. Version bump included

All CI checks pass. Ready for maintainer review and merge.

-- refactor/code-health

@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Review: PR #3413 — hermes dashboard diagnostic block

Assessment: LGTM — solid fix for #3407.

Checked against the requirements:

  1. Probes hermes --help before launch to detect missing subcommand — Yes. The diagnostic dump includes hermes --help 2>&1 | grep -q '^[[:space:]]*dashboard' with clear messaging for both present/absent cases ("dashboard" NOT in --help output). This is the exact failure mode from issue [Bug]: hermes on digitalocean fails — hermes dashboard reported as not a command #3407.

  2. Pipes failure output to logWarn so users see the real error — Yes. The TS-side logWarn now includes getErrorMessage(result.error) so the underlying runServer failure reason is surfaced, plus a second logWarn pointing users to the diagnostic block and GitHub issues.

Additional positives:

  • The trap '_dashboard_diag' EXIT pattern is clean — fires on any non-zero exit path without duplicating the dump at each failure point.
  • trap - EXIT on the success path prevents noise on normal launches.
  • All diagnostic commands (command -v hermes, hermes --version, hermes --help, tail -30 /tmp/hermes-dashboard.log) tolerate missing tools gracefully.
  • Test coverage is thorough — pins the trap, diagnostic banner content, success-path trap clear, and TS-side error surfacing.
  • Version bump to 1.0.45 is present.

No gaps found. Ready for merge.

-- refactor/code-health

@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Verified on current main (2026-05-18): lint clean (0 errors), all CI checks passing (ShellCheck, Mock Tests, Biome Lint, Unit Tests, macOS Compatibility). Branch is mergeable with no conflicts. Ready for review.

-- refactor/pr-maintainer

… block
`startHermesDashboard()` previously hid every failure behind the generic
warning "Hermes web dashboard failed to start — TUI still available".
When users reported breakage (issue #3407 — "hermes dashboard isn't a
command") we had no signal to act on: was the binary missing? subcommand
gone? fastapi/uvicorn lazy-install failed? web dist build failed?
Now the deploy script installs an EXIT trap that fires on any non-zero
exit and dumps a banner-delimited diagnostic block to stderr (which is
inherited live to the user's terminal):
──── Hermes dashboard diagnostic ────
hermes binary: /home/.../venv/bin/hermes
hermes version: Hermes Agent v0.13.0 (2026.5.7)
hermes subcommands: includes "dashboard"
─── /tmp/hermes-dashboard.log (last 30 lines) ───
<actual hermes process output>
─────────────────────────────────────
The trap is cleared on the success path so it stays quiet when things
work. The TS-side warning now also includes the underlying error
message and points users at the diagnostic block for bug reports.
Bumps `@openrouter/spawn` to 1.0.45.
Verified locally: installed hermes-agent v0.13.0 (2026.5.7) from main,
confirmed `hermes --help | grep -q '^[[:space:]]*dashboard'` matches —
so genuine "dashboard subcommand missing" reports will now be loud and
actionable.
Refs #3407.
@la14-1
la14-1force-pushed the fix/hermes-dashboard-surface-errors branch from cb72cb6 to 6fc0da1CompareMay 21, 2026 07:11
@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Rebased onto main — version conflict resolved by keeping main's v1.1.0. Lint clean (0 errors). Ready for review.

-- refactor/pr-maintainer

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@la14-1@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(hermes): surface dashboard launch failures with a real diagnostic block by la14-1 · Pull Request #3413 · OpenRouterLabs/spawn · GitHub
Skip to content

fix(hermes): surface dashboard launch failures with a real diagnostic block - #3413

Open
la14-1 wants to merge 1 commit into
mainfrom
fix/hermes-dashboard-surface-errors
Open

fix(hermes): surface dashboard launch failures with a real diagnostic block#3413
la14-1 wants to merge 1 commit into
mainfrom
fix/hermes-dashboard-surface-errors

Conversation

@la14-1

Copy link
Copy Markdown
Collaborator

Summary

  • startHermesDashboard() previously hid every failure behind a generic "Hermes web dashboard failed to start — TUI still available" warning. When users reported breakage (e.g. issue [Bug]: hermes on digitalocean fails — hermes dashboard reported as not a command #3407 — Andrew's "hermes dashboard isn't a command" / "the dashboard command of hermes also changed to something else") we had no signal to debug from.
  • Now the deploy script installs an EXIT trap that fires on any non-zero exit and dumps a banner-delimited diagnostic block to stderr (which is inherited live to the user's terminal):
    ──── Hermes dashboard diagnostic ────
    hermes binary: /home/.../venv/bin/hermes
    hermes version: Hermes Agent v0.13.0 (2026.5.7)
    hermes subcommands: includes "dashboard"
    ─── /tmp/hermes-dashboard.log (last 30 lines) ───
    <actual hermes process output>
    ─────────────────────────────────────
    
  • The trap is cleared on the success path so it stays quiet when things work.
  • The TS-side warning now also includes the underlying error message and points users at the diagnostic block for bug reports.
  • Bumps @openrouter/spawn to 1.0.45.

What this catches

Failure modeOld outputNew output
hermes not in PATHgeneric warninghermes binary: <not found in PATH> + tail-of-log
dashboard subcommand genuinely renamed/removedgeneric warninghermes subcommands: "dashboard" NOT in --help output
fastapi/uvicorn lazy-install failsgeneric warningfull hermes stderr including the import-error message
Web dist build failsgeneric warningthe build-error stack tailed from /tmp/hermes-dashboard.log
Port 9119 already taken / bind failuregeneric warninghermes's own bind error from the log

Test plan

  • bunx @biomejs/biome check src/ — clean (203 files)
  • bun test — 2207 pass / 0 fail (was 2204; +3 new assertions)
  • New tests pin: trap '_dashboard_diag' EXIT, the diagnostic banner, all probe commands, trap - EXIT on success, and the failure-surfacing TS-side message.
  • Generated script syntax-checked with bash -n
  • Subcommand probe (hermes --help | grep -q '^[[:space:]]*dashboard') verified against a live install of hermes-agent v0.13.0 (2026.5.7) from main — matches, so genuine missing-subcommand reports will be loud, not noise.

Refs #3407 — won't close it; that issue stays open until we get a real diagnostic from the next user who hits this and can report the actual cause.

@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Note: This PR and #3410 both address #3407 but are complementary, not duplicates:

Recommend merging #3410 first, then this PR. #3413 builds on #3410's version bump (1.0.44 → 1.0.45), so landing #3410 first avoids a version conflict in package.json.

-- refactor/pr-maintainer

@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Reviewed both PRs for #3407. Closed #3410 (probe-only approach) in favor of this one — the diagnostic block is the right call because:

  1. Silent skip (PR fix(hermes): gate dashboard launch behind capability probe #3410) hides the root cause; this PR surfaces it
  2. The trap-based diagnostic dump gives users and us everything needed for debugging: binary path, version, subcommand availability, and log tail
  3. Includes 3 new test assertions pinning the diagnostic behavior
  4. Version bump included

All CI checks pass. Ready for maintainer review and merge.

-- refactor/code-health

@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Review: PR #3413 — hermes dashboard diagnostic block

Assessment: LGTM — solid fix for #3407.

Checked against the requirements:

  1. Probes hermes --help before launch to detect missing subcommand — Yes. The diagnostic dump includes hermes --help 2>&1 | grep -q '^[[:space:]]*dashboard' with clear messaging for both present/absent cases ("dashboard" NOT in --help output). This is the exact failure mode from issue [Bug]: hermes on digitalocean fails — hermes dashboard reported as not a command #3407.

  2. Pipes failure output to logWarn so users see the real error — Yes. The TS-side logWarn now includes getErrorMessage(result.error) so the underlying runServer failure reason is surfaced, plus a second logWarn pointing users to the diagnostic block and GitHub issues.

Additional positives:

  • The trap '_dashboard_diag' EXIT pattern is clean — fires on any non-zero exit path without duplicating the dump at each failure point.
  • trap - EXIT on the success path prevents noise on normal launches.
  • All diagnostic commands (command -v hermes, hermes --version, hermes --help, tail -30 /tmp/hermes-dashboard.log) tolerate missing tools gracefully.
  • Test coverage is thorough — pins the trap, diagnostic banner content, success-path trap clear, and TS-side error surfacing.
  • Version bump to 1.0.45 is present.

No gaps found. Ready for merge.

-- refactor/code-health

@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Verified on current main (2026-05-18): lint clean (0 errors), all CI checks passing (ShellCheck, Mock Tests, Biome Lint, Unit Tests, macOS Compatibility). Branch is mergeable with no conflicts. Ready for review.

-- refactor/pr-maintainer

… block
`startHermesDashboard()` previously hid every failure behind the generic
warning "Hermes web dashboard failed to start — TUI still available".
When users reported breakage (issue #3407 — "hermes dashboard isn't a
command") we had no signal to act on: was the binary missing? subcommand
gone? fastapi/uvicorn lazy-install failed? web dist build failed?
Now the deploy script installs an EXIT trap that fires on any non-zero
exit and dumps a banner-delimited diagnostic block to stderr (which is
inherited live to the user's terminal):
──── Hermes dashboard diagnostic ────
hermes binary: /home/.../venv/bin/hermes
hermes version: Hermes Agent v0.13.0 (2026.5.7)
hermes subcommands: includes "dashboard"
─── /tmp/hermes-dashboard.log (last 30 lines) ───
<actual hermes process output>
─────────────────────────────────────
The trap is cleared on the success path so it stays quiet when things
work. The TS-side warning now also includes the underlying error
message and points users at the diagnostic block for bug reports.
Bumps `@openrouter/spawn` to 1.0.45.
Verified locally: installed hermes-agent v0.13.0 (2026.5.7) from main,
confirmed `hermes --help | grep -q '^[[:space:]]*dashboard'` matches —
so genuine "dashboard subcommand missing" reports will now be loud and
actionable.
Refs #3407.
@la14-1
la14-1force-pushed the fix/hermes-dashboard-surface-errors branch from cb72cb6 to 6fc0da1CompareMay 21, 2026 07:11
@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Rebased onto main — version conflict resolved by keeping main's v1.1.0. Lint clean (0 errors). Ready for review.

-- refactor/pr-maintainer

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@la14-1@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(hermes): surface dashboard launch failures with a real diagnostic block by la14-1 · Pull Request #3413 · OpenRouterLabs/spawn · GitHub
Skip to content

fix(hermes): surface dashboard launch failures with a real diagnostic block - #3413

Open
la14-1 wants to merge 1 commit into
mainfrom
fix/hermes-dashboard-surface-errors
Open

fix(hermes): surface dashboard launch failures with a real diagnostic block#3413
la14-1 wants to merge 1 commit into
mainfrom
fix/hermes-dashboard-surface-errors

Conversation

@la14-1

Copy link
Copy Markdown
Collaborator

Summary

  • startHermesDashboard() previously hid every failure behind a generic "Hermes web dashboard failed to start — TUI still available" warning. When users reported breakage (e.g. issue [Bug]: hermes on digitalocean fails — hermes dashboard reported as not a command #3407 — Andrew's "hermes dashboard isn't a command" / "the dashboard command of hermes also changed to something else") we had no signal to debug from.
  • Now the deploy script installs an EXIT trap that fires on any non-zero exit and dumps a banner-delimited diagnostic block to stderr (which is inherited live to the user's terminal):
    ──── Hermes dashboard diagnostic ────
    hermes binary: /home/.../venv/bin/hermes
    hermes version: Hermes Agent v0.13.0 (2026.5.7)
    hermes subcommands: includes "dashboard"
    ─── /tmp/hermes-dashboard.log (last 30 lines) ───
    <actual hermes process output>
    ─────────────────────────────────────
    
  • The trap is cleared on the success path so it stays quiet when things work.
  • The TS-side warning now also includes the underlying error message and points users at the diagnostic block for bug reports.
  • Bumps @openrouter/spawn to 1.0.45.

What this catches

Failure modeOld outputNew output
hermes not in PATHgeneric warninghermes binary: <not found in PATH> + tail-of-log
dashboard subcommand genuinely renamed/removedgeneric warninghermes subcommands: "dashboard" NOT in --help output
fastapi/uvicorn lazy-install failsgeneric warningfull hermes stderr including the import-error message
Web dist build failsgeneric warningthe build-error stack tailed from /tmp/hermes-dashboard.log
Port 9119 already taken / bind failuregeneric warninghermes's own bind error from the log

Test plan

  • bunx @biomejs/biome check src/ — clean (203 files)
  • bun test — 2207 pass / 0 fail (was 2204; +3 new assertions)
  • New tests pin: trap '_dashboard_diag' EXIT, the diagnostic banner, all probe commands, trap - EXIT on success, and the failure-surfacing TS-side message.
  • Generated script syntax-checked with bash -n
  • Subcommand probe (hermes --help | grep -q '^[[:space:]]*dashboard') verified against a live install of hermes-agent v0.13.0 (2026.5.7) from main — matches, so genuine missing-subcommand reports will be loud, not noise.

Refs #3407 — won't close it; that issue stays open until we get a real diagnostic from the next user who hits this and can report the actual cause.

@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Note: This PR and #3410 both address #3407 but are complementary, not duplicates:

Recommend merging #3410 first, then this PR. #3413 builds on #3410's version bump (1.0.44 → 1.0.45), so landing #3410 first avoids a version conflict in package.json.

-- refactor/pr-maintainer

@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Reviewed both PRs for #3407. Closed #3410 (probe-only approach) in favor of this one — the diagnostic block is the right call because:

  1. Silent skip (PR fix(hermes): gate dashboard launch behind capability probe #3410) hides the root cause; this PR surfaces it
  2. The trap-based diagnostic dump gives users and us everything needed for debugging: binary path, version, subcommand availability, and log tail
  3. Includes 3 new test assertions pinning the diagnostic behavior
  4. Version bump included

All CI checks pass. Ready for maintainer review and merge.

-- refactor/code-health

@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Review: PR #3413 — hermes dashboard diagnostic block

Assessment: LGTM — solid fix for #3407.

Checked against the requirements:

  1. Probes hermes --help before launch to detect missing subcommand — Yes. The diagnostic dump includes hermes --help 2>&1 | grep -q '^[[:space:]]*dashboard' with clear messaging for both present/absent cases ("dashboard" NOT in --help output). This is the exact failure mode from issue [Bug]: hermes on digitalocean fails — hermes dashboard reported as not a command #3407.

  2. Pipes failure output to logWarn so users see the real error — Yes. The TS-side logWarn now includes getErrorMessage(result.error) so the underlying runServer failure reason is surfaced, plus a second logWarn pointing users to the diagnostic block and GitHub issues.

Additional positives:

  • The trap '_dashboard_diag' EXIT pattern is clean — fires on any non-zero exit path without duplicating the dump at each failure point.
  • trap - EXIT on the success path prevents noise on normal launches.
  • All diagnostic commands (command -v hermes, hermes --version, hermes --help, tail -30 /tmp/hermes-dashboard.log) tolerate missing tools gracefully.
  • Test coverage is thorough — pins the trap, diagnostic banner content, success-path trap clear, and TS-side error surfacing.
  • Version bump to 1.0.45 is present.

No gaps found. Ready for merge.

-- refactor/code-health

@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Verified on current main (2026-05-18): lint clean (0 errors), all CI checks passing (ShellCheck, Mock Tests, Biome Lint, Unit Tests, macOS Compatibility). Branch is mergeable with no conflicts. Ready for review.

-- refactor/pr-maintainer

… block
`startHermesDashboard()` previously hid every failure behind the generic
warning "Hermes web dashboard failed to start — TUI still available".
When users reported breakage (issue #3407 — "hermes dashboard isn't a
command") we had no signal to act on: was the binary missing? subcommand
gone? fastapi/uvicorn lazy-install failed? web dist build failed?
Now the deploy script installs an EXIT trap that fires on any non-zero
exit and dumps a banner-delimited diagnostic block to stderr (which is
inherited live to the user's terminal):
──── Hermes dashboard diagnostic ────
hermes binary: /home/.../venv/bin/hermes
hermes version: Hermes Agent v0.13.0 (2026.5.7)
hermes subcommands: includes "dashboard"
─── /tmp/hermes-dashboard.log (last 30 lines) ───
<actual hermes process output>
─────────────────────────────────────
The trap is cleared on the success path so it stays quiet when things
work. The TS-side warning now also includes the underlying error
message and points users at the diagnostic block for bug reports.
Bumps `@openrouter/spawn` to 1.0.45.
Verified locally: installed hermes-agent v0.13.0 (2026.5.7) from main,
confirmed `hermes --help | grep -q '^[[:space:]]*dashboard'` matches —
so genuine "dashboard subcommand missing" reports will now be loud and
actionable.
Refs #3407.
@la14-1
la14-1force-pushed the fix/hermes-dashboard-surface-errors branch from cb72cb6 to 6fc0da1CompareMay 21, 2026 07:11
@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Rebased onto main — version conflict resolved by keeping main's v1.1.0. Lint clean (0 errors). Ready for review.

-- refactor/pr-maintainer

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@la14-1@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); fix(hermes): surface dashboard launch failures with a real diagnostic block by la14-1 · Pull Request #3413 · OpenRouterLabs/spawn · GitHub
Skip to content

fix(hermes): surface dashboard launch failures with a real diagnostic block - #3413

Open
la14-1 wants to merge 1 commit into
mainfrom
fix/hermes-dashboard-surface-errors
Open

fix(hermes): surface dashboard launch failures with a real diagnostic block#3413
la14-1 wants to merge 1 commit into
mainfrom
fix/hermes-dashboard-surface-errors

Conversation

@la14-1

Copy link
Copy Markdown
Collaborator

Summary

  • startHermesDashboard() previously hid every failure behind a generic "Hermes web dashboard failed to start — TUI still available" warning. When users reported breakage (e.g. issue [Bug]: hermes on digitalocean fails — hermes dashboard reported as not a command #3407 — Andrew's "hermes dashboard isn't a command" / "the dashboard command of hermes also changed to something else") we had no signal to debug from.
  • Now the deploy script installs an EXIT trap that fires on any non-zero exit and dumps a banner-delimited diagnostic block to stderr (which is inherited live to the user's terminal):
    ──── Hermes dashboard diagnostic ────
    hermes binary: /home/.../venv/bin/hermes
    hermes version: Hermes Agent v0.13.0 (2026.5.7)
    hermes subcommands: includes "dashboard"
    ─── /tmp/hermes-dashboard.log (last 30 lines) ───
    <actual hermes process output>
    ─────────────────────────────────────
    
  • The trap is cleared on the success path so it stays quiet when things work.
  • The TS-side warning now also includes the underlying error message and points users at the diagnostic block for bug reports.
  • Bumps @openrouter/spawn to 1.0.45.

What this catches

Failure modeOld outputNew output
hermes not in PATHgeneric warninghermes binary: <not found in PATH> + tail-of-log
dashboard subcommand genuinely renamed/removedgeneric warninghermes subcommands: "dashboard" NOT in --help output
fastapi/uvicorn lazy-install failsgeneric warningfull hermes stderr including the import-error message
Web dist build failsgeneric warningthe build-error stack tailed from /tmp/hermes-dashboard.log
Port 9119 already taken / bind failuregeneric warninghermes's own bind error from the log

Test plan

  • bunx @biomejs/biome check src/ — clean (203 files)
  • bun test — 2207 pass / 0 fail (was 2204; +3 new assertions)
  • New tests pin: trap '_dashboard_diag' EXIT, the diagnostic banner, all probe commands, trap - EXIT on success, and the failure-surfacing TS-side message.
  • Generated script syntax-checked with bash -n
  • Subcommand probe (hermes --help | grep -q '^[[:space:]]*dashboard') verified against a live install of hermes-agent v0.13.0 (2026.5.7) from main — matches, so genuine missing-subcommand reports will be loud, not noise.

Refs #3407 — won't close it; that issue stays open until we get a real diagnostic from the next user who hits this and can report the actual cause.

@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Note: This PR and #3410 both address #3407 but are complementary, not duplicates:

Recommend merging #3410 first, then this PR. #3413 builds on #3410's version bump (1.0.44 → 1.0.45), so landing #3410 first avoids a version conflict in package.json.

-- refactor/pr-maintainer

@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Reviewed both PRs for #3407. Closed #3410 (probe-only approach) in favor of this one — the diagnostic block is the right call because:

  1. Silent skip (PR fix(hermes): gate dashboard launch behind capability probe #3410) hides the root cause; this PR surfaces it
  2. The trap-based diagnostic dump gives users and us everything needed for debugging: binary path, version, subcommand availability, and log tail
  3. Includes 3 new test assertions pinning the diagnostic behavior
  4. Version bump included

All CI checks pass. Ready for maintainer review and merge.

-- refactor/code-health

@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Review: PR #3413 — hermes dashboard diagnostic block

Assessment: LGTM — solid fix for #3407.

Checked against the requirements:

  1. Probes hermes --help before launch to detect missing subcommand — Yes. The diagnostic dump includes hermes --help 2>&1 | grep -q '^[[:space:]]*dashboard' with clear messaging for both present/absent cases ("dashboard" NOT in --help output). This is the exact failure mode from issue [Bug]: hermes on digitalocean fails — hermes dashboard reported as not a command #3407.

  2. Pipes failure output to logWarn so users see the real error — Yes. The TS-side logWarn now includes getErrorMessage(result.error) so the underlying runServer failure reason is surfaced, plus a second logWarn pointing users to the diagnostic block and GitHub issues.

Additional positives:

  • The trap '_dashboard_diag' EXIT pattern is clean — fires on any non-zero exit path without duplicating the dump at each failure point.
  • trap - EXIT on the success path prevents noise on normal launches.
  • All diagnostic commands (command -v hermes, hermes --version, hermes --help, tail -30 /tmp/hermes-dashboard.log) tolerate missing tools gracefully.
  • Test coverage is thorough — pins the trap, diagnostic banner content, success-path trap clear, and TS-side error surfacing.
  • Version bump to 1.0.45 is present.

No gaps found. Ready for merge.

-- refactor/code-health

@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Verified on current main (2026-05-18): lint clean (0 errors), all CI checks passing (ShellCheck, Mock Tests, Biome Lint, Unit Tests, macOS Compatibility). Branch is mergeable with no conflicts. Ready for review.

-- refactor/pr-maintainer

… block
`startHermesDashboard()` previously hid every failure behind the generic
warning "Hermes web dashboard failed to start — TUI still available".
When users reported breakage (issue #3407 — "hermes dashboard isn't a
command") we had no signal to act on: was the binary missing? subcommand
gone? fastapi/uvicorn lazy-install failed? web dist build failed?
Now the deploy script installs an EXIT trap that fires on any non-zero
exit and dumps a banner-delimited diagnostic block to stderr (which is
inherited live to the user's terminal):
──── Hermes dashboard diagnostic ────
hermes binary: /home/.../venv/bin/hermes
hermes version: Hermes Agent v0.13.0 (2026.5.7)
hermes subcommands: includes "dashboard"
─── /tmp/hermes-dashboard.log (last 30 lines) ───
<actual hermes process output>
─────────────────────────────────────
The trap is cleared on the success path so it stays quiet when things
work. The TS-side warning now also includes the underlying error
message and points users at the diagnostic block for bug reports.
Bumps `@openrouter/spawn` to 1.0.45.
Verified locally: installed hermes-agent v0.13.0 (2026.5.7) from main,
confirmed `hermes --help | grep -q '^[[:space:]]*dashboard'` matches —
so genuine "dashboard subcommand missing" reports will now be loud and
actionable.
Refs #3407.
@la14-1
la14-1force-pushed the fix/hermes-dashboard-surface-errors branch from cb72cb6 to 6fc0da1CompareMay 21, 2026 07:11
@la14-1

Copy link
Copy Markdown
CollaboratorAuthor

Rebased onto main — version conflict resolved by keeping main's v1.1.0. Lint clean (0 errors). Ready for review.

-- refactor/pr-maintainer

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@la14-1@claude