Commit Graph

33 Commits

Author SHA1 Message Date
YeonGyu-Kim f7af4cd578 Migrate LSP client to vscode-jsonrpc for improved stability (#1095)
* refactor(lsp): migrate to vscode-jsonrpc for improved stability

Replace custom JSON-RPC implementation with vscode-jsonrpc library.
Use MessageConnection with StreamMessageReader/Writer.
Implement Bun↔Node stream bridges for compatibility.
Preserve all existing functionality (warmup, cleanup, capabilities).
Net reduction of ~60 lines while improving protocol handling.

* fix(lsp): clear timeout on successful response to prevent unhandled rejections

---------

Co-authored-by: justsisyphus <justsisyphus@users.noreply.github.com>
2026-01-29 19:48:28 +09:00
yimingll 32113c5ad0 fix(lsp): add data dir to LSP server detection paths (#992)
OpenCode downloads LSP servers (like clangd) to ~/.local/share/opencode/bin,
but isServerInstalled() only checked ~/.config/opencode/bin. This caused
LSP tools to report servers as 'not installed' even when OpenCode had
successfully downloaded them.

Add ~/.local/share/opencode/bin to the detection paths to match OpenCode's
actual behavior.

Co-authored-by: yimingll <yimingll@users.noreply.github.com>
2026-01-23 16:37:40 +09:00
Nguyen Khac Trung Kien 22a5c8e64d fix: respect OPENCODE_CONFIG_DIR environment variable across all config paths
Multiple files were hardcoding ~/.config/opencode paths instead of using
getOpenCodeConfigDir() which respects the OPENCODE_CONFIG_DIR env var.

This broke profile isolation features like OCX ghost mode, where users
set OPENCODE_CONFIG_DIR to a custom path but oh-my-opencode.json and
other configs weren't being read from that location.

Changes:
- plugin-config.ts: Use getOpenCodeConfigDir() directly
- cli/doctor/checks: Use getOpenCodeConfigDir() for auth and config checks
- tools/lsp/config.ts: Use getOpenCodeConfigDir() for LSP config paths
- command loaders: Use getOpenCodeConfigDir() for global command dirs
- hooks: Use getOpenCodeConfigDir() for hook config paths
- config-path.ts: Mark getUserConfigDir() as deprecated
- tests: Ensure OPENCODE_CONFIG_DIR is properly isolated in tests
2026-01-22 12:15:09 +07:00
justsisyphus 98e91e508c fix(lsp): display diagnostics errors as error blocks in TUI
- Changed lsp_diagnostics error handling to throw errors instead of returning strings
- Line 211: Changed from `return output` to `throw new Error(output)`
- Makes errors display as proper error blocks in TUI

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-01-17 18:14:50 +09:00
Kenny 1cb1127e2f Merge pull request #834 from MotorwaySouth9/fix/windows-lsp-doctor-and-detection
fix(lsp): improve Windows server detection and avoid unix 'which' in doctor
2026-01-16 07:24:05 -05:00
justsisyphus 97d15e1d68 refactor: remove legacy tools format, use permission only
BREAKING: Requires OpenCode 1.1.1+

- Remove supportsNewPermissionSystem/usesLegacyToolsSystem checks
- Simplify permission-compat.ts to permission format only
- Unify explore/librarian deny lists: write, edit, task, sisyphus_task, call_omo_agent
- Add sisyphus_task to oracle deny list
- Update agent-tool-restrictions.ts with correct per-agent restrictions
- Clean config-handler.ts conditional version checks
- Update tests for simplified API
2026-01-16 17:11:34 +09:00
justsisyphus 133be9d17c refactor(lsp): clean up lsp_servers references and update prompts to use PascalCase
- Remove dead lsp_servers function from tools.ts
- Update utils.ts to reference LspServers (OpenCode built-in)
- Update AGENTS.md: 7 tools → 3 tools
- Update init-deep.ts prompts to use PascalCase OpenCode tools
- Update refactor.ts prompts to use PascalCase OpenCode tools
2026-01-16 11:35:37 +09:00
MotorwaySouth9 7531b1fd29 test: stub gh cli spawn and refine PATH cleanup 2026-01-16 10:31:53 +08:00
justsisyphus 16398560c1 refactor(lsp): remove lsp_servers - duplicates OpenCode's LspServers
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-01-16 10:33:35 +09:00
MotorwaySouth9 0756bd61f4 test: harden windows lsp test cleanup 2026-01-16 09:02:02 +08:00
MotorwaySouth9 2216885d43 fix(lsp): improve Windows server detection 2026-01-16 08:40:19 +08:00
justsisyphus 6156800262 refactor(lsp): remove duplicate LSP tools already provided by OpenCode
Remove lsp_goto_definition, lsp_find_references, lsp_symbols as they
duplicate OpenCode's built-in LspGotoDefinition, LspFindReferences,
LspDocumentSymbols, and LspWorkspaceSymbols.

Keep oh-my-opencode-specific tools:
- lsp_diagnostics (OpenCode lacks pull diagnostics)
- lsp_servers (server management)
- lsp_prepare_rename / lsp_rename (OpenCode lacks rename)

Clean up associated dead code:
- Client methods: hover, definition, references, symbols, codeAction
- Utils: formatLocation, formatSymbolKind, formatDocumentSymbol, etc.
- Types: Location, LocationLink, SymbolInfo, DocumentSymbol, etc.
- Constants: SYMBOL_KIND_MAP, DEFAULT_MAX_REFERENCES/SYMBOLS

-418 lines removed.
2026-01-16 02:17:00 +09:00
YeonGyu-Kim c39424a76c feat(lsp): add kotlin-ls LSP server support (#782)
Add Kotlin LSP server (kotlin-ls) to the built-in servers catalog,
syncing with OpenCode's server.ts. Includes:
- BUILTIN_SERVERS entry with kotlin-lsp command
- LSP_INSTALL_HINTS entry pointing to GitHub repo
- Extensions: .kt, .kts (already in EXT_TO_LANG)

Co-authored-by: justsisyphus <sisyphus-dev-ai@users.noreply.github.com>
2026-01-14 22:59:18 +09:00
justsisyphus 72fa8f2c65 refactor(lsp): consolidate LSP tools - remove lsp_hover, lsp_code_actions, lsp_code_action_resolve - merge lsp_document_symbols + lsp_workspace_symbols into lsp_symbols with scope parameter - update all references in hooks, templates, and documentation 2026-01-14 17:30:04 +09:00
yimingll 820eb03d4e fix: LSP tools Windows compatibility - use pathToFileURL for proper URI generation (#689) 2026-01-11 19:01:54 +09:00
Arthur Andrade a11008b765 fix(lsp): cleanup orphaned LSP servers on session.deleted (#676)
* fix(lsp): cleanup orphaned LSP servers on session.deleted

When parallel background agent tasks complete, their LSP servers (for
repos cloned to /tmp/) remain running until a 5-minute idle timeout.
This causes memory accumulation with heavy parallel Sisyphus usage,
potentially leading to OOM crashes.

This change adds cleanupTempDirectoryClients() to LSPServerManager
(matching the pattern used by SkillMcpManager.disconnectSession())
and calls it on session.deleted events.

The cleanup targets idle LSP clients (refCount=0) for temporary
directories (/tmp/, /var/folders/) where agent tasks clone repos.

* chore: retrigger CI checks
2026-01-11 11:45:38 +09:00
Sisyphus b83b094db4 feat(lsp): sync LSP catalog with OpenCode (#455)
Add new language servers from OpenCode's server.ts:
- prisma: Prisma schema support (.prisma)
- ocaml-lsp: OCaml language support (.ml, .mli)
- texlab: LaTeX support (.tex, .bib)
- dockerfile: Dockerfile support (.dockerfile)
- gleam: Gleam language support (.gleam)
- clojure-lsp: Clojure support (.clj, .cljs, .cljc, .edn)
- nixd: Nix language support (.nix)
- tinymist: Typst support (.typ, .typc)
- haskell-language-server: Haskell support (.hs, .lhs)

Add new language extensions from OpenCode's language.ts:
- .ets -> typescript
- .lhs -> haskell
- .kt, .kts -> kotlin
- .nix -> nix
- .typ, .typc -> typst
- .prisma -> prisma

Update server IDs to match OpenCode convention:
- Add 'bash' as primary ID (keep bash-ls as legacy alias)
- Add 'terraform' as primary ID (keep terraform-ls as legacy alias)

Closes #454

Co-authored-by: sisyphus-dev-ai <sisyphus-dev-ai@users.noreply.github.com>
2026-01-03 23:48:00 +09:00
adam2am ac5c9f645d fix(lsp): use fileURLToPath for Windows path handling (#281)
Ahoy! The old code be walkin' the plank on Windows, ARRRR! 🏴‍☠️

The Problem (a cursed treasure map):
- LSP returns URIs like file:///C:/path/to/file.ts
- Old code: uri.replace("file://", "") produces /C:/path (INVALID on Windows!)
- Windows needs the leadin' slash removed after file:///

The Fix (proper pirate navigation):
- Import fileURLToPath from node:url (the sacred scroll)
- Add uriToPath() helper function (our trusty compass)
- Replace all 10 occurrences of .replace("file://", "")

This matches how the OpenCode mothership handles it in packages/opencode/src/lsp/client.ts

Now Windows users can sail the LSP seas without crashin' on the rocks! 🦜
2025-12-29 23:02:04 +09:00
adam2am 24c0a2417f fix(lsp): improve isServerInstalled for custom server configs (#282) 2025-12-29 10:22:38 +09:00
Sisyphus 184b1a3286 fix(lsp): improve error messages when LSP server is not installed (#305)
Previously, when an LSP server was configured but not installed, the error
message said "No LSP server configured" which was misleading. Now the
error message distinguishes between:

1. Server not configured at all
2. Server configured but not installed (with installation hints)

The new error messages include:
- Clear indication of whether server is configured vs installed
- Installation commands for each built-in server
- Supported file extensions
- Configuration examples for custom servers

Fixes #304

Co-authored-by: sisyphus-dev-ai <sisyphus-dev-ai@users.noreply.github.com>
2025-12-28 17:38:23 +09:00
Lukin 1f80a99b76 feat: add Claude Code plugin support (#240) 2025-12-27 18:56:40 +09:00
YeonGyu-Kim cb01fc12eb feat(lsp): sync with OpenCode LSP implementation
- Add 50+ extension mappings to EXT_TO_LANG (Clojure, Erlang, F#, Haskell, Scala, OCaml, etc.)
- Add missing BUILTIN_SERVERS: Biome, Oxlint, ty (Python), FSharp, Terraform-ls
- Improve isServerInstalled() to check node_modules/.bin, ~/.config/opencode/bin paths
- Add Windows .exe extension support for command detection
- Fix GitHub issue #118 - LSP servers not being detected

🤖 Generated with assistance of OhMyOpenCode (https://github.com/code-yeongyu/oh-my-opencode)
2025-12-20 13:58:07 +09:00
Matthew DeGarmo 5ab093293f feat(lsp): add bash-language-server to builtin servers (#112) 2025-12-19 11:21:13 +09:00
YeonGyu-Kim 1396138faa Optimize LSP tool descriptions for token efficiency (#71)
* bump up dependencies

* Optimize LSP tool descriptions for token efficiency

- Reduce verbose descriptions to concise versions (~63% character reduction)
- Minimize parameter descriptions (1826 → 671 characters)
- Remove redundant describe() calls for self-explanatory parameters
- Total: ~390 tokens saved from system prompts

🤖 GENERATED WITH ASSISTANCE OF [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode)
2025-12-17 00:16:21 +09:00
YeonGyu-Kim 712ab06a58 fix(lsp): cleanup orphan LSP servers on process exit
Implement cross-platform process cleanup handlers for LSP servers.

Added registerProcessCleanup() method to LSPServerManager that:
- Kills all spawned LSP server processes on process.exit
- Handles SIGINT (Ctrl+C) - all platforms
- Handles SIGTERM (kill signal) - Unix/macOS/Linux
- Handles SIGBREAK (Ctrl+Break) - Windows specific

This prevents LSP servers from becoming orphan processes when opencode terminates unexpectedly.

🤖 GENERATED WITH ASSISTANCE OF [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode)
2025-12-16 21:02:38 +09:00
YeonGyu-Kim 6e0733a48c refactor(lsp): remove unused formatWorkspaceEdit import
🤖 GENERATED WITH ASSISTANCE OF [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode)
2025-12-09 10:36:34 +09:00
YeonGyu-Kim 8f37b987dc fix(lsp): add Push model support and fix JSON LSP diagnostics
- Add diagnosticsStore to capture Push model notifications
- Handle textDocument/publishDiagnostics notifications in processBuffer
- Fix workspace/configuration response for JSON LSP validation
- Add missing language mappings (json, html, css, sh, fish, md, tf)
- diagnostics() now tries Pull first, falls back to Push store
2025-12-08 09:38:00 +09:00
YeonGyu-Kim 4cf2407272 feat(session-recovery): add filesystem-based empty content recovery
- Replace API-based recovery with direct JSON file editing for empty content messages
- Add cross-platform storage path support via xdg-basedir (Linux/macOS/Windows)
- Inject '(interrupted)' text part to fix messages with only thinking/meta blocks
- Update README docs with detailed session recovery scenarios
2025-12-05 23:24:20 +09:00
YeonGyu-Kim fd150750a9 feat(lsp): add result limits to prevent token overflow
- Add DEFAULT_MAX_REFERENCES, DEFAULT_MAX_SYMBOLS, DEFAULT_MAX_DIAGNOSTICS (200 each)
- Apply limits to lsp_find_references, lsp_document_symbols, lsp_workspace_symbols, lsp_diagnostics
- Show truncation warning when results exceed limits
2025-12-05 22:52:33 +09:00
YeonGyu-Kim ff3a7bfee0 refactor(tools): rename all tools to snake_case for consistency 2025-12-04 23:01:16 +09:00
YeonGyu-Kim dc119bc1ed feat(lsp): add rename, code actions, and server connection pooling
- Add LSPServerManager for connection pooling with idle cleanup
- Add lsp_prepare_rename and lsp_rename tools
- Add lsp_code_actions and lsp_code_action_resolve tools
- Add WorkspaceEdit types and applyWorkspaceEdit utility
- Improve LSP client robustness with stderr buffering and process state tracking
2025-12-04 22:40:05 +09:00
YeonGyu-Kim 81869ccaac feat(lsp): add oh-my-opencode.json config support with priority
Config file priority (high to low):
1. ./.opencode/oh-my-opencode.json (project)
2. ~/.config/opencode/oh-my-opencode.json (user)
3. ~/.config/opencode/opencode.json (opencode)
4. builtin servers

LSP servers sorted by source then priority field (higher = preferred)
2025-12-04 21:57:18 +09:00
YeonGyu-Kim 7090fca0fd feat(lsp): add LSP tools integration with workspace/configuration support
- Add 7 LSP tools: hover, goto_definition, find_references, document_symbols, workspace_symbols, diagnostics, servers
- Support multiple LSP servers: typescript, gopls, pyrefly, basedpyright, ruff, rust-analyzer, clangd, sourcekit-lsp, ruby-lsp
- Read LSP config from opencode.json with disabled server support
- Handle server requests: workspace/configuration, client/registerCapability, window/workDoneProgress/create
- Send workspace/didChangeConfiguration after initialized for basedpyright compatibility
- Uint8Array-based buffer for reliable LSP message parsing
2025-12-04 21:54:02 +09:00