Commit Graph
207 Commits
Author SHA1 Message Date
can1357 b279db1790 test: refactored test suites to eliminate time-based sleeps and polling loops
- Replaced time-based sleeps and polling loops with event-driven promise resolvers and fake timers across agent and tool tests.
- Migrated test suites to share in-memory auth storage and fixtures using lifecycle hooks.
- Updated catalog model definitions, metadata, and configurations.
2026-08-13 19:32:22 +02:00
can1357 cd72f22552 fix(lsp): restored overwritten rename target when move fails
- Displace overwritten destination into a temporary sibling directory during workspace renames.
- Restore the displaced file and clean up the temp directory if the main rename operation fails.
2026-08-13 06:05:20 +02:00
can1357 74f5f610c6 fix(lsp): reconciled executed prefix when workspace edit fails partway
- applyWorkspaceEdit takes an onExecuted callback fired after each
  filesystem mutation, so callers hold the executed prefix even when a
  later op throws.
- applyWorkspaceEditWithLsp reconciles overlays/watchers for that prefix
  best-effort before rethrowing the original apply error.
2026-08-13 05:58:40 +02:00
can1357 f52891fb82 fix(lsp): reconciled overlays from executed workspace-edit ops
- applyWorkspaceEdit now returns { applied, executed }; ops skipped via
  ignoreIfExists/ignoreIfNotExists are excluded from executed.
- applyWorkspaceEditWithLsp derives didClose/refresh/watched-file
  notifications from executed ops, so a skipped rename no longer closes
  the old URI overlay or emits phantom Deleted/Created events.
2026-08-13 05:54:28 +02:00
can1357 0af778ea54 Merge PR #8392: fix(lsp): isolate document overlays across sessions (@roboomp) 2026-08-13 05:48:27 +02:00
can1357 d8924d055b Merge PR #8399: fix(lsp): synchronize applied workspace edits (@roboomp) 2026-08-13 05:48:27 +02:00
can1357 2e6d81b528 Merge PR #8395: fix(lsp): roll back rename_file edits when the move fails (@roboomp) 2026-08-13 05:48:00 +02:00
can1357 e3771992a7 Merge PR #8396: fix(lsp): abort rename_file when willRenameFiles fails on a supporting server (@roboomp) 2026-08-13 05:47:21 +02:00
can1357 3bc181d042 Merge PR #8393: fix(lsp): preserve workspace resource options (@roboomp) 2026-08-13 05:46:42 +02:00
can1357 926228a821 Merge PR #8394: fix(lsp): reject unsupported rust-analyzer snippet edits (@roboomp) 2026-08-13 05:46:37 +02:00
can1357 c4bc106486 Merge PR #8397: fix(lsp): fail diagnostics when every applicable server fails (@roboomp) 2026-08-13 05:46:31 +02:00
can1357 3d9649fbfa Merge PR #8391: fix(lsp): correct workspace edit failure handling (@roboomp) 2026-08-13 05:46:26 +02:00
roboomp d1278762f8 fix(lsp): deferred idle reuse until cleanup
Kept closing sessions attached to their server until orphan document closes and pending request cancellations are queued.

Added coverage that reopens the last orphan URI after reuse and verifies the replacement overlay remains active.

Fixes #8371
2026-08-13 03:15:29 +00:00
roboomp fb5c852384 fix(lsp): synchronized applied workspace edits
Reconciled open document overlays and watched files after committed WorkspaceEdits so later semantic requests observe disk state.

Fixes #8372
2026-08-13 03:13:00 +00:00
roboomp a776d9570b fix(lsp): guarded same-file rename against target removal
Skipped destination removal when an overwrite rename resolves both paths to the same inode (case-only rename on case-insensitive filesystems), so the source is no longer deleted before fs.rename runs.

Fixes #8373
2026-08-13 03:10:38 +00:00
roboomp 6381a1daad fix(lsp): pre-validated rename buckets before writing
Reject snippet-formatted or overlapping rename edits across all accepted URIs before applying any, so a later snippet edit cannot leave earlier files half-applied.

Fixes #8376
2026-08-13 03:09:11 +00:00
roboomp fc37f20dea fix(lsp): abort rename_file when willRenameFiles fails on a supporting server
The willRenameFiles loop caught every non-abort, non-method-not-found
error into serverNotes and fell through to fs.rename, so a genuine
failure from a server that supports the request moved the path without
its semantic edits, leaving references dangling. Split client acquisition
from the request, track hard failures, and abort before any mutation when
a supporting server errors. Servers replying method-not-found are still
skipped without blocking.

Fixes #8380
2026-08-13 03:07:16 +00:00
roboomp dce0216bcb fix(lsp): fail diagnostics when every applicable server fails
The direct diagnostics loop caught non-abort server errors without recording them, so a file whose every applicable server failed produced an empty aggregate rendered as OK with success: true — a false-negative hiding a total diagnostics failure.

Track per-file and global success/failure counts: zero successful server responses now yields success: false with an explicit failure line, while partial success still surfaces diagnostics and names the servers that failed.

Fixes #8377
2026-08-13 03:07:07 +00:00
roboomp 4a6519f07f fix(lsp): roll back rename_file edits when the move fails
rename_file wrote server-provided reference edits before creating the
destination parent and moving the source, with no rollback. A failed
mkdir/rename (e.g. EXDEV across mounts, EACCES) left the reference files
rewritten while the source stayed put, violating the atomic "moves file
AND rewrites all imports/references" contract.

Extract applyEditsThenRename in lsp/edits.ts: snapshot each edited file,
apply edits, then mkdir+rename; on failure restore every snapshot before
rethrowing. Rewire the rename_file handler to build the summary and hand
the edits to the helper.

Fixes #8379
2026-08-13 03:05:29 +00:00
roboomp ec7b6ed85c fix(lsp): rejected unsupported snippet text edits
Stopped advertising rust-analyzer snippet edit support and reject unexpected snippet-formatted edits before source is written.

Fixes #8376
2026-08-13 03:04:35 +00:00
roboomp f6e2b6c2e1 fix(lsp): preserved workspace resource options
Propagated CreateFile, RenameFile, and DeleteFile options through workspace edit planning and enforced their overwrite, ignore, and recursive semantics during execution.

Fixes #8373
2026-08-13 03:04:31 +00:00
roboomp 757066e965 fix(lsp): isolated document overlays across sessions
Assigned concurrent mux links separate language-server processes while retaining idle processes for later reuse.

Added regression coverage for session-specific open-document content and updated mux lifecycle expectations.

Fixes #8371
2026-08-13 03:03:36 +00:00
roboomp 448cff19bc fix(lsp): corrected workspace edit failure handling
Advertised abort semantics because multi-file text edits are applied sequentially and cannot satisfy textOnlyTransactional.

Added initialization capability coverage and documented the fix.

Fixes #8375
2026-08-13 03:01:45 +00:00
can1357 b70bb7aced Merge PR #8186: feat(lsp): add Astral ty as built-in Python primary LSP server (@FNDEVVE) 2026-08-13 02:00:50 +02:00
can1357 e56777e138 fix(lsp): rearmed cached idle checker after shutdown 2026-08-11 15:06:16 +02:00
can1357 7b3bd4781b Merge PR #8154: fix(lsp): stop idle checker during shutdown (@MikeeI) 2026-08-11 15:06:16 +02:00
FND 770147c89e feat(lsp): support ty.toml-only projects and fix changelog placement
Address review feedback on #8186:
- add ty.toml to ty rootMarkers so ty.toml-only projects pass the
  loadConfig marker gate (Codex P2, roboomp should-fix)
- add ty.toml to PYTHON_ROOT_MARKERS so project-local .venv/bin/ty
  resolution runs for ty.toml-only projects (roboomp should-fix)
- add a ty.toml-only regression test covering both the detection
  gate and the local venv bin resolution path
- move the changelog entry from the released [16.3.11] section into
  [Unreleased] (roboomp should-fix)
2026-08-10 23:23:43 +02:00
FND 4a7da9c0d0 feat(lsp): add Astral ty as built-in Python primary LSP server
Add ty (ty server) to defaults.json behind pyright/basedpyright/pylsp
in primary selection order and ahead of ruff (linter). ty uses the
generic LSP client path with no adapter code; settings.ty pass-through
works via the existing settings field.

- defaults.json: insert ty entry between pylsp and ruff
- lsp-regressions.test.ts: 4 tests (selection order for .py/.pyi,
  auto-detect via $which + pyproject.toml, coexistence with ruff)
- CHANGELOG.md: Added entry under [Unreleased] referencing #4617

Closes #4617
2026-08-10 22:26:02 +02:00
Bonobo e8dd853fa4 fix(lsp): cancel requests after client timeout
Why:
Local timeout cleanup removes pending state but leaves the language server
working on an abandoned request.

Changes:
- Send $/cancelRequest after an issued request reaches its client timeout.
- Preserve the existing timeout error and pending-request cleanup.

Evidence:
- The workspace-readiness regression observes cancellation for the dropped
  status request before polling succeeds.

Refs #8116
2026-08-10 04:07:11 +02:00
Bonobo af83370d82 fix(lsp): stop idle checker during shutdown
Why:
The module-level idle interval remains referenced after every client shuts
down and keeps short-lived hosts alive.

Changes:
- Stop the idle checker before draining active and pending clients.
- Preserve explicit reconfiguration through setIdleTimeout().

Evidence:
- A child-process regression probe exits after shutdown with the checker
  configured.

Refs #8115
2026-08-10 04:06:07 +02:00
can1357 cd4e04e8ee refactor(coding-agent): reduced lsp index to a composition barrel
- src/lsp/index.ts is the explicit ./lsp package entry, yet held 2821 lines of
  warmup, config caching, diagnostics, external build-command workspace
  diagnostics, the writethrough batching subsystem and the LspTool class.
- Those are now servers, diagnostics, workspace-diagnostics, writethrough and
  tool modules; index.ts is 22 lines and re-exports the same public surface.
- configCache and writethroughBatches remain single instances and every tuned
  diagnostics timing constant moved verbatim.
2026-08-08 06:32:01 +02:00
roboomp 8b120cecc5 fix(lsp): normalized published diagnostic uri keys
Canonicalized file URI keys at the diagnostics map boundary so server and client spellings match across percent encoding and Windows casing.

Added regression coverage for equivalent percent-encoded URIs and the marksman Windows drive-letter form.

Fixes #7662
2026-08-04 23:53:08 +00:00
can1357 bc39ffa265 feat: introduced omptype validation package and migrated workspace dependencies
- Introduce `@oh-my-pi/omptype` as a new ArkType-compatible schema validation package featuring a lazy JIT runtime, JSON Schema emission, and compatibility adapters.
- Replace `arktype` across workspace packages and test utilities with `@oh-my-pi/omptype`.
- Add benchmark suites, tests, and documentation for the new validation engine and adapters.
- Update workspace build, test runner, and release configurations to include the new package.
2026-08-03 21:56:48 +02:00
can1357 92b50faacc feat(coding-agent/lsp): implemented lsp multiplexer server and shared daemon lifecycle
- Added an LSP multiplexer server, protocol definitions, and daemon lifecycle management to route traffic across sessions.
- Introduced `lsp.shared` settings configuration and SDK session creation support for shared language servers.
- Migrated shared daemon ensure helpers into a central launch module with updated import references.
- Added comprehensive unit tests and fake LSP server fixtures covering muxing, sharing, caching, and restarts.
2026-08-02 18:15:22 +02:00
Ant39140 af538a1387 Merge remote-tracking branch 'upstream/main' into fix/lsp-batch-stale-replay 2026-07-31 00:16:34 +08:00
Ant39140 f816286725 fix(coding-agent): preserve BOMs in LSP batch flushes 2026-07-30 17:02:16 +08:00
Ant39140 40e09c9491 fix(coding-agent): flush pending LSP batch on write failure 2026-07-30 16:32:15 +08:00
Ant39140 b9804edc1a Merge remote-tracking branch 'upstream/main' into fix/lsp-batch-stale-replay 2026-07-30 16:05:41 +08:00
Ant39140 d112790fc7 fix(coding-agent): prevent stale LSP batch writes 2026-07-30 15:49:22 +08:00
Kyle McCleary d90e54fb09 fix(coding-agent): harden native security workflow 2026-07-29 20:05:57 -07:00
can1357 6527671c3a fix(lsp): sanitize expanded generic output
(cherry picked from commit 1260d0633a5fb533c492f272ee500fec60c46e22)
2026-07-29 23:09:14 +02:00
roboompandcan1357 dca8f44b73 fix(lsp): handled quick exits before reader teardown
Waited briefly for process exit publication after clean stdout EOF so the process handler preserves the real exit code and stderr, while genuine reader errors still tear down immediately.

Cleared only the matching initialization failure for explicit reloads and added regressions for quick exits, reader errors, ordinary backoff, and immediate reload retries.

Fixes #7041

(cherry picked from commit a76522b759f14421202d4cc437ec611b78be20d1)
2026-07-29 23:09:13 +02:00
roboomp cb55edd60e fix(lsp): honored custom server language ids
Added an optional per-server languageId override and used it for both disk-backed and in-memory didOpen notifications.

Covered config loading and both document-open paths with a fake custom GDScript server.

Fixes #6800
2026-07-27 11:54:29 +00:00
shoucandanghehe cdf373b77d fix(coding-agent): handle asynchronous LSP pipe failures 2026-07-26 23:37:12 +08:00
can1357 b326e79e6e chore: applied formatter and dropped unused catch binding from merged lsp fix 2026-07-23 22:27:08 +02:00
can1357 bbf0402990 fix(coding-agent): surface JSON-RPC error code so -32601 method-not-found is recognized regardless of message text
Codex P2 on #6403: sendRequest rejected with only the server's error
message; a server answering rust-analyzer/reloadWorkspace with code
-32601 but nonstandard text (e.g. "Unknown request") would fail
isMethodNotFoundError and turn lsp reload into a hard error instead of
falling back to the generic reload. Include the code in the rejection
message so the existing -32601 substring check matches. Adds a
regression test with a -32601/"Unknown request" response.
2026-07-23 22:15:23 +02:00
roboomp eeb3fa6ace fix(coding-agent): propagated cancellation from lsp reload instead of false restart
reloadServer caught every error from both fallback mechanisms in bare
catch blocks, so a caller cancel or tool timeout was swallowed and fell
through to `proc.kill(); return "Restarted"` -- reporting a successful
restart while killing the server with no replacement.

- Propagate ToolAbortError/timeout from both the rust-analyzer request
  and the didChangeConfiguration notification fallback.
- Gate the fallback on genuine method-not-found via isMethodNotFoundError
  instead of any error.
- Replace the blind proc.kill with shutdownClientInstance: remove the
  client from the registry by identity and await confirmed process exit,
  surfacing a truthful teardown error when the process outlives the kill.

Fixes #6369
2026-07-23 18:58:15 +00:00
can1357 536d37ac07 Merge PR #5137: perf(coding-agent): avoid cold LSP startup on format-only writes (@wolfiesch) 2026-07-23 11:37:13 +02:00
roboomp 1b6588e520 fix(tools): cap per-tool default timeout with tools.maxTimeout
clampTimeout resolved the per-tool default (bash 300s) whenever the agent
omitted `timeout` and only enforced the tool's own min/max, so the
tools.maxTimeout global ceiling — applied solely in sdk.ts on explicitly
numeric args — was bypassed on the common default-fallback path.

Thread maxTimeout into clampTimeout so the resolved effective timeout,
including the default path, is capped before the per-tool floor/ceiling
apply. Explicit values below the cap still win; maxTimeout <= 0 stays
no-cap. Applied at every call site (bash, eval, browser, debug, lsp,
fetch, and the session-level bash executor), and the bash clamp notice
now names the global ceiling when it is the binding limit.

Fixes #6294
2026-07-22 15:18:27 +00:00
Wolfgang Schoenberger d866532bd1 perf(coding-agent): reduce format-on-write latency 2026-07-21 13:53:52 -07:00