Files
deepseek-harness/packages/lsp
Dudu-0223 0f3f0efd9c fix(lsp): address codex review round 2
Further lifecycle/safety hardening of the local provider:
- Tear the instance down when the initialize handshake is aborted, so a
  poisoned pending `ready` can't make later queries for that workspace re-wait.
- Make the serialized-queue wait itself abortable, so a query blocked behind
  hung earlier work can still observe its own timeout.
- Spawn the server detached and signal the whole process group on teardown, so
  helper processes (e.g. tsserver) can't outlive dispose().
- Open the source with O_NOFOLLOW and cap the read at maxDocumentBytes+1, closing
  the symlink-swap and concurrent-grow windows the fd-based read left open.
- Honor an already-aborted signal before any host I/O or startup.
- Validate maxStderrBytes positive at load; surface the retained stderr tail in
  the "language server exited" error so a fatal startup diagnostic is visible.
2026-07-16 13:34:37 +08:00
..

lsp/ - LSP capability family

The language-server capability seam: an abstract LSP interface, a generic stdio provider, and the model-facing lsp tool. All product packages.

Package Role ctx key
lsp/ Abstract LSP seam (provider registry by branded id + extension mapping, per-query selection, vocabulary, LspError) ctx.lsp
lsp-local/ Generic stdio language-server provider (spawn, JSON-RPC, transient-open queries) (registers on ctx.lsp)
tool-lsp/ Model-facing lsp tool (four operations, one-based UTF-16 cursor coordinates) (registers on ctx.tools)

The interface lives at lsp/lsp/. The seam exposes exactly four semantic operations — definition, references, implementation, hover — and no generic JSON-RPC escape hatch, so a provider swap does not change how the model asks for navigation and no protocol payload or unreviewed mutation reaches the model contract. Providers register capabilities, not tools; tool-lsp is the only owner of the model-facing name, schema, prompt guidance, and presentation.

See the LSP capability seam RFC for the design rationale, including why documents open transiently per query, why the local host reads through Node APIs rather than ctx.fs, and why extension ownership is exclusive within one runtime.