12 Commits

Author SHA1 Message Date
b9808a8b1f refactor(daemon): require explicit serverId on all daemon ops
Move all server matching logic to the extension/CLI side. The daemon no
longer calls pickServer() — it receives an explicit serverId (or
serverIds[] for diagnostics) and uses it directly for cache lookup and
server spawning.

Key changes:
- request op requires serverId: string
- diagnostics op requires serverIds: string[] — daemon fans out in
  parallel via Promise.allSettled and returns grouped map
- formatDiagnostics() handles grouped results with per-server headers
  when multiple servers contribute (single-server omits header)
- CLI picks servers locally before calling daemon helpers
- New pickDiagnosticServers() in extension returns all available,
  non-disabled servers matching the file extension

This makes multi-server diagnostics (e.g., typescript-language-server +
oxlint) work naturally — the extension decides which servers to query,
the daemon just executes.
2026-05-04 07:39:03 -04:00
f811efef68 fix(diagnostics): sort by severity before truncating
Errors appear first, then warnings, info, hints. Ensures the most
actionable issues survive the cap instead of being pushed out by
low-priority hints.
2026-05-02 20:24:35 -04:00
01ab10a7d9 feat(references): cap formatted references at 30 with truncation notice
Prevents flooding the context window when a common symbol has hundreds
of references. Shows the first 30 and appends a count of the remainder.
2026-05-02 20:24:27 -04:00
99525ad0ee feat(diagnostics): cap diagnostic output with truncation notice
Add a limit parameter to formatDiagnostics (default 20 for explicit
lsp_diagnostics calls, 10 for auto-check after edit/write). When
truncated, a summary line indicates how many more diagnostics exist.
2026-05-02 20:13:05 -04:00
306771f92a refactor(extension): resolve remaining type narrowing diagnostics
Narrow `unknown` types with explicit casts before `in` operator checks
to avoid "Type '{}' may represent a primitive value" errors. Also fix
getActiveTools() which returns string[] (not object[]), removing the
unnecessary .map((t) => t.name). Brings index.ts to zero diagnostics.
2026-05-02 00:50:16 -04:00
6111321fda fix(extension): suppress warnings for unsupported file types and missing binaries
Move pickServer() into the try-catch in runLsp() so UnsupportedExtensionError
is caught directly. Add message-based fallback in both runLsp() and
runDiagnostics() to handle daemon-wrapped errors that come through as plain
Error instances rather than the original typed exception.

This eliminates spurious 'No LSP server registered' warnings during auto-check
after edit/write on files without LSP support (e.g. .md, .txt, .sh).
2026-05-02 00:42:44 -04:00
9b863168ff fix: handle unhandled promise rejection in background read init 2026-04-30 11:53:43 -04:00
620d9cc70f feat: warm-start LSP server on file read 2026-04-30 11:10:36 -04:00
e131e0e8cd feat: add server control commands (disable, enable, destroy)
Add /lsp-servers, /lsp-disable, /lsp-enable, and /lsp-destroy TUI commands.
Disabled servers are tracked in-memory per-extension-instance; the shared
daemon is never mutated by disable/enable. When all servers are disabled,
LSP tools are removed from the active tool set so the LLM won't attempt them.

Also adds a destroy_server daemon operation that kills running LspClient
entries by server ID or all entries.
2026-04-30 09:48:01 -04:00
7abe4efa02 refactor: replace string-matching error checks with custom error classes 2026-04-30 08:27:13 -04:00
076eee4e96 feat(lsp): add background daemon for language servers 2026-04-29 00:04:06 -04:00
61bca87bba initial commit 2026-04-25 21:06:15 -04:00