hermes-agent/website/docs/user-guide/features
ethernet a632e68a01 fix(lsp): never report stale diagnostics — wait for fresh post-edit data
Slow language servers (tsserver on large projects especially) publish
diagnostics long after an edit. The client's wait/report path had three
holes that together surfaced the PREVIOUS edit's errors as if they were
current ("ghost diagnostics"), sending the agent chasing errors it had
already fixed:

1. open_file only cleared the diagnostic stores on first open — on the
   didChange path (every subsequent edit) stale push/pull entries
   survived.
2. wait_for_diagnostics' predicates were satisfiable by that leftover
   state (`path in _published`, `path in _pull_diagnostics`), so the
   "wait" often returned instantly with old data.
3. diagnostics_for merged the stale push store unconditionally, so even
   a fresh clean pull got the old error merged back in.

Fix: anchor freshness on a per-file didChange timestamp.

- Pull results record their request send-time and are dropped when a
  didChange raced past them; the pull store is invalidated on every
  change, not just first open.
- wait_for_diagnostics now returns bool (fresh data vs timeout), only
  counts pushes published at/after the change (and version >= ours when
  the server echoes versions), and accepts an explicit timeout — the
  user's lsp.wait_timeout config now actually controls the inner wait
  budget instead of only the outer thread-join.
- diagnostics_for(fresh_only=True) excludes stores that predate the
  latest change; all manager report paths use it.
- On timeout the manager returns [] ("no data") instead of stale
  state, logs a WARNING via eventlog, and does NOT mark the server
  broken — slow is not dead.
- seed-on-first-push no longer marks the file published, so the TS
  seed push can't satisfy a waiter.

Tests: new "stale" and "slow_push" mock-server scripts model the slow
tsserver, plus client- and service-level regression tests
(tests/agent/lsp/test_stale_diagnostics.py).
2026-07-20 13:43:36 -04:00
..
_category_.json
…
acp.md
…
api-server.md
…
batch-processing.md
…
browser.md
…
built-in-plugins.md
…
code-execution.md
…
codex-app-server-runtime.md
…
computer-use.md
…
context-files.md
…
context-references.md
…
credential-pools.md
…
cron.md
…
curator.md
…
delegation.md
…
deliverable-mode.md
…
extending-the-dashboard.md
…
fallback-providers.md
…
goals.md
…
honcho.md
…
hooks.md
…
image-generation.md
…
kanban-tutorial.md
…
kanban-worker-lanes.md
…
kanban.md
…
lsp.md
…
mcp.md
…
memory-providers.md
…
memory.md
…
mixture-of-agents.md
…
overview.md
…
personality.md
…
pets.md
…
plugins.md docs: Plugins subcategory under Extending + secret-source plugin guide + 1Password sidebar fix (#59613) 2026-07-06 12:11:31 -07:00
provider-routing.md
…
skills.md
…
skins.md
…
spotify.md
…
subscription-proxy.md
…
tool-gateway.md
…
tool-search.md
…
tools.md
…
tts.md
…
vision.md
…
voice-mode.md
…
web-dashboard.md
…
web-search.md
…
x-search.md
…