oh-my-opencode 5.0.0-beta.5 → 5.0.0-beta.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -1
- package/dist/cli/index.js +341 -214
- package/dist/cli-node/index.js +341 -214
- package/dist/index.js +1217 -1112
- package/dist/skills/coding-agent-sessions/SKILL.md +3 -2
- package/dist/skills/coding-agent-sessions/references/all-platforms.md +1 -1
- package/dist/skills/coding-agent-sessions/references/senpi.md +4 -4
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +1 -1
- package/dist/tui.js +97 -5
- package/package.json +15 -14
- package/packages/lsp-core/src/lsp/client-wrapper.test.ts +60 -7
- package/packages/lsp-core/src/lsp/client-wrapper.ts +69 -16
- package/packages/lsp-core/src/lsp/workspace-edit-adversarial.test.ts +20 -1
- package/packages/lsp-core/src/tools/diagnostics.ts +3 -3
- package/packages/lsp-core/src/tools/navigation.ts +4 -2
- package/packages/lsp-core/src/tools/rename.ts +4 -2
- package/packages/lsp-core/src/tools/symbols.ts +1 -1
- package/packages/lsp-daemon/dist/cli.js +83 -29
- package/packages/lsp-daemon/dist/client.js +76 -22
- package/packages/lsp-daemon/dist/index.js +81 -27
- package/packages/lsp-tools-mcp/dist/cli.js +76 -22
- package/packages/lsp-tools-mcp/dist/mcp.js +76 -22
- package/packages/lsp-tools-mcp/dist/tools.js +76 -22
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
- package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +90 -4
- package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +90 -4
- package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
- package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
- package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +3 -3
- package/packages/omo-codex/plugin/components/lsp/dist/cli.js +83 -29
- package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
- package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/rules/package.json +1 -1
- package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +24 -12
- package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +24 -12
- package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/directive.md +6 -0
- package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md +6 -0
- package/packages/omo-codex/plugin/components/ulw-loop/directive.md +6 -0
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +3 -2
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/define-goal.md +106 -0
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +1 -0
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/package-lock.json +13 -13
- package/packages/omo-codex/plugin/package.json +1 -1
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +3 -2
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/all-platforms.md +1 -1
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/senpi.md +4 -4
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +1 -1
- package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +6 -0
- package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +3 -2
- package/packages/omo-codex/plugin/skills/ulw-loop/references/define-goal.md +106 -0
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +1 -0
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +39 -16
- package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +3 -2
- package/packages/shared-skills/skills/coding-agent-sessions/references/all-platforms.md +1 -1
- package/packages/shared-skills/skills/coding-agent-sessions/references/senpi.md +4 -4
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/pi_family.py +1 -1
|
@@ -4153,8 +4153,8 @@ function createIdleTimer(idleTimeoutMs, log, onTimeout) {
|
|
|
4153
4153
|
};
|
|
4154
4154
|
}
|
|
4155
4155
|
// ../lsp-core/src/lsp/client-wrapper.ts
|
|
4156
|
-
import { existsSync as existsSync10, statSync as statSync4 } from "node:fs";
|
|
4157
|
-
import { dirname as dirname8, join as join4, resolve as resolve7 } from "node:path";
|
|
4156
|
+
import { existsSync as existsSync10, realpathSync as realpathSync4, statSync as statSync4 } from "node:fs";
|
|
4157
|
+
import { basename as basename3, dirname as dirname8, join as join4, resolve as resolve7 } from "node:path";
|
|
4158
4158
|
|
|
4159
4159
|
// ../lsp-core/src/lsp/server-install-state.ts
|
|
4160
4160
|
import { existsSync as existsSync7, mkdirSync as mkdirSync3, readFileSync as readFileSync4, renameSync as renameSync2, writeFileSync as writeFileSync2 } from "node:fs";
|
|
@@ -4685,32 +4685,86 @@ function isDirectoryPath(filePath) {
|
|
|
4685
4685
|
}
|
|
4686
4686
|
}
|
|
4687
4687
|
function findWorkspaceRoot(filePath) {
|
|
4688
|
-
const
|
|
4688
|
+
const cwd = contextCwd();
|
|
4689
|
+
const abs = resolveReadablePathInsideContext(filePath);
|
|
4689
4690
|
let dir = abs;
|
|
4690
4691
|
if (!isDirectoryPath(dir)) {
|
|
4691
4692
|
dir = dirname8(dir);
|
|
4692
4693
|
}
|
|
4693
|
-
|
|
4694
|
-
while (dir
|
|
4695
|
-
|
|
4696
|
-
|
|
4697
|
-
|
|
4694
|
+
const fallbackRoot = nearestExistingDirectoryInsideContext(dir, cwd) ?? cwd;
|
|
4695
|
+
while (isPathInside(cwd, dir)) {
|
|
4696
|
+
const canonicalDir = existingDirectoryInsideContext(dir, cwd);
|
|
4697
|
+
if (canonicalDir !== undefined) {
|
|
4698
|
+
for (const marker of WORKSPACE_MARKERS) {
|
|
4699
|
+
if (existsSync10(join4(dir, marker))) {
|
|
4700
|
+
return canonicalDir;
|
|
4701
|
+
}
|
|
4698
4702
|
}
|
|
4699
4703
|
}
|
|
4700
|
-
|
|
4704
|
+
if (dir === cwd)
|
|
4705
|
+
break;
|
|
4701
4706
|
dir = dirname8(dir);
|
|
4702
4707
|
}
|
|
4703
|
-
return
|
|
4708
|
+
return fallbackRoot;
|
|
4704
4709
|
}
|
|
4705
|
-
function
|
|
4710
|
+
function resolveReadablePathInsideContext(filePath) {
|
|
4706
4711
|
const cwd = contextCwd();
|
|
4707
4712
|
const abs = resolve7(cwd, filePath);
|
|
4713
|
+
if (isPathInside(cwd, abs))
|
|
4714
|
+
return abs;
|
|
4715
|
+
const rebased = rebaseThroughCanonicalAncestor(abs, cwd);
|
|
4716
|
+
if (rebased !== undefined)
|
|
4717
|
+
return rebased;
|
|
4718
|
+
const canonical = canonicalizeExistingOrNearestAncestor(abs);
|
|
4719
|
+
if (isPathInside(cwd, canonical))
|
|
4720
|
+
return canonical;
|
|
4721
|
+
throw new LspInvalidPathError(`LSP file path must be inside request cwd: ${filePath}`);
|
|
4722
|
+
}
|
|
4723
|
+
function resolvePathInsideContext(filePath) {
|
|
4724
|
+
const cwd = contextCwd();
|
|
4725
|
+
const abs = resolveReadablePathInsideContext(filePath);
|
|
4708
4726
|
const canonical = canonicalizeExistingOrNearestAncestor(abs);
|
|
4709
4727
|
if (!isPathInside(cwd, canonical)) {
|
|
4710
4728
|
throw new LspInvalidPathError(`LSP file path must be inside request cwd: ${filePath}`);
|
|
4711
4729
|
}
|
|
4712
4730
|
return canonical;
|
|
4713
4731
|
}
|
|
4732
|
+
function rebaseThroughCanonicalAncestor(path2, cwd) {
|
|
4733
|
+
let current = path2;
|
|
4734
|
+
const suffix = [];
|
|
4735
|
+
while (true) {
|
|
4736
|
+
if (existsSync10(current)) {
|
|
4737
|
+
const canonical = realpathSync4(current);
|
|
4738
|
+
if (isPathInside(cwd, canonical))
|
|
4739
|
+
return suffix.length === 0 ? canonical : join4(canonical, ...suffix);
|
|
4740
|
+
}
|
|
4741
|
+
const parent = dirname8(current);
|
|
4742
|
+
if (parent === current)
|
|
4743
|
+
return;
|
|
4744
|
+
suffix.unshift(basename3(current));
|
|
4745
|
+
current = parent;
|
|
4746
|
+
}
|
|
4747
|
+
}
|
|
4748
|
+
function existingDirectoryInsideContext(directory, cwd) {
|
|
4749
|
+
if (!existsSync10(directory))
|
|
4750
|
+
return;
|
|
4751
|
+
const canonical = realpathSync4(directory);
|
|
4752
|
+
if (!statSync4(canonical).isDirectory())
|
|
4753
|
+
return;
|
|
4754
|
+
return isPathInside(cwd, canonical) ? canonical : undefined;
|
|
4755
|
+
}
|
|
4756
|
+
function nearestExistingDirectoryInsideContext(directory, cwd) {
|
|
4757
|
+
let current = directory;
|
|
4758
|
+
while (isPathInside(cwd, current)) {
|
|
4759
|
+
const canonical = existingDirectoryInsideContext(current, cwd);
|
|
4760
|
+
if (canonical !== undefined)
|
|
4761
|
+
return canonical;
|
|
4762
|
+
if (current === cwd)
|
|
4763
|
+
return;
|
|
4764
|
+
current = dirname8(current);
|
|
4765
|
+
}
|
|
4766
|
+
return;
|
|
4767
|
+
}
|
|
4714
4768
|
function formatServerLookupError(result) {
|
|
4715
4769
|
if (result.status === "not_installed") {
|
|
4716
4770
|
return formatNotInstalled(result);
|
|
@@ -4781,7 +4835,7 @@ function formatNotInstalled(result) {
|
|
|
4781
4835
|
].join(`
|
|
4782
4836
|
`);
|
|
4783
4837
|
}
|
|
4784
|
-
var
|
|
4838
|
+
var READ_ONLY_TOOLS = new Set([
|
|
4785
4839
|
"diagnostics",
|
|
4786
4840
|
"definition",
|
|
4787
4841
|
"references",
|
|
@@ -4790,7 +4844,7 @@ var READ_ONLY_RETRY_TOOLS = new Set([
|
|
|
4790
4844
|
"prepareRename"
|
|
4791
4845
|
]);
|
|
4792
4846
|
async function withLspClient(filePath, fn, toolName, options = {}) {
|
|
4793
|
-
const absPath = resolvePathInsideContext(filePath);
|
|
4847
|
+
const absPath = READ_ONLY_TOOLS.has(toolName) ? resolveReadablePathInsideContext(filePath) : resolvePathInsideContext(filePath);
|
|
4794
4848
|
if (isDirectoryPath(absPath)) {
|
|
4795
4849
|
throw new LspInvalidPathError("Directory paths are not supported by this LSP tool. " + "Use lsp.diagnostics with a directory path for directory diagnostics.");
|
|
4796
4850
|
}
|
|
@@ -4805,9 +4859,9 @@ async function withLspClient(filePath, fn, toolName, options = {}) {
|
|
|
4805
4859
|
const acquireAndCall = async (allowRetry) => {
|
|
4806
4860
|
const client = await manager.getClient(root, server2, options.signal);
|
|
4807
4861
|
try {
|
|
4808
|
-
return await fn(client, root);
|
|
4862
|
+
return await fn(client, root, absPath);
|
|
4809
4863
|
} catch (err) {
|
|
4810
|
-
if (allowRetry &&
|
|
4864
|
+
if (allowRetry && READ_ONLY_TOOLS.has(toolName) && isLspDeadConnectionError(err)) {
|
|
4811
4865
|
manager.invalidateClient(root, server2.id, client);
|
|
4812
4866
|
return acquireAndCall(false);
|
|
4813
4867
|
}
|
|
@@ -5262,7 +5316,7 @@ async function executeLspDiagnostics(params, signal) {
|
|
|
5262
5316
|
const filePath = requireString(params, "filePath");
|
|
5263
5317
|
const severity = severityFilter(params);
|
|
5264
5318
|
try {
|
|
5265
|
-
const absPath =
|
|
5319
|
+
const absPath = resolveReadablePathInsideContext(filePath);
|
|
5266
5320
|
if (isDirectoryPath(absPath)) {
|
|
5267
5321
|
const extension = inferExtensionFromDirectory(absPath);
|
|
5268
5322
|
if (!extension) {
|
|
@@ -5291,7 +5345,7 @@ async function executeLspDiagnostics(params, signal) {
|
|
|
5291
5345
|
};
|
|
5292
5346
|
return text(output2.output, details2);
|
|
5293
5347
|
}
|
|
5294
|
-
const result = await withLspClient(filePath, async (client) => client.diagnostics(
|
|
5348
|
+
const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.diagnostics(resolvedFilePath, signal), "diagnostics", clientOptions(signal));
|
|
5295
5349
|
if (result.transientError) {
|
|
5296
5350
|
const message = result.transientError.message;
|
|
5297
5351
|
const details2 = {
|
|
@@ -5366,7 +5420,7 @@ async function executeLspGotoDefinition(params, signal) {
|
|
|
5366
5420
|
const line = requireNumber(params, "line");
|
|
5367
5421
|
const character = requireNumber(params, "character");
|
|
5368
5422
|
try {
|
|
5369
|
-
const result = await withLspClient(filePath, async (client) => client.definition(
|
|
5423
|
+
const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.definition(resolvedFilePath, line, character, signal), "definition", clientOptions(signal));
|
|
5370
5424
|
const locations = !result ? [] : Array.isArray(result) ? result : [result];
|
|
5371
5425
|
const details = { filePath, line, character, locations };
|
|
5372
5426
|
if (locations.length === 0)
|
|
@@ -5391,7 +5445,7 @@ async function executeLspFindReferences(params, signal) {
|
|
|
5391
5445
|
const character = requireNumber(params, "character");
|
|
5392
5446
|
const includeDeclaration = optionalBoolean(params, "includeDeclaration") ?? true;
|
|
5393
5447
|
try {
|
|
5394
|
-
const result = await withLspClient(filePath, async (client) => client.references(
|
|
5448
|
+
const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.references(resolvedFilePath, line, character, includeDeclaration, signal), "references", clientOptions(signal));
|
|
5395
5449
|
const references = Array.isArray(result) ? result : [];
|
|
5396
5450
|
const total = references.length;
|
|
5397
5451
|
const truncated = total > DEFAULT_MAX_REFERENCES;
|
|
@@ -5433,7 +5487,7 @@ async function executeLspPrepareRename(params, signal) {
|
|
|
5433
5487
|
const line = requireNumber(params, "line");
|
|
5434
5488
|
const character = requireNumber(params, "character");
|
|
5435
5489
|
try {
|
|
5436
|
-
const result = await withLspClient(filePath, async (client) => client.prepareRename(
|
|
5490
|
+
const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.prepareRename(resolvedFilePath, line, character, signal), "prepareRename", clientOptions(signal));
|
|
5437
5491
|
const details = { filePath, line, character, result };
|
|
5438
5492
|
return text(formatPrepareRenameResult(result), details);
|
|
5439
5493
|
} catch (error) {
|
|
@@ -5454,7 +5508,7 @@ async function executeLspRename(params, signal) {
|
|
|
5454
5508
|
const character = requireNumber(params, "character");
|
|
5455
5509
|
const newName = requireString(params, "newName");
|
|
5456
5510
|
try {
|
|
5457
|
-
const result = await withLspClient(filePath, async (client) => client.rename(
|
|
5511
|
+
const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.rename(resolvedFilePath, line, character, newName, signal), "rename", clientOptions(signal));
|
|
5458
5512
|
const details = { filePath, line, character, newName, apply: result.apply, edit: result.edit };
|
|
5459
5513
|
return text(formatApplyResult(result.apply), details, !result.apply.success);
|
|
5460
5514
|
} catch (error) {
|
|
@@ -5534,7 +5588,7 @@ async function executeLspSymbols(params, signal) {
|
|
|
5534
5588
|
const symbols2 = await withLspClient(filePath, async (client) => client.workspaceSymbols(query, signal), "workspaceSymbols", clientOptions(signal));
|
|
5535
5589
|
return formatSymbolsResult(filePath, scope, symbols2, limit, query);
|
|
5536
5590
|
}
|
|
5537
|
-
const symbols = await withLspClient(filePath, async (client) => client.documentSymbols(
|
|
5591
|
+
const symbols = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.documentSymbols(resolvedFilePath, signal), "documentSymbols", clientOptions(signal));
|
|
5538
5592
|
return formatSymbolsResult(filePath, scope, symbols, limit);
|
|
5539
5593
|
} catch (error) {
|
|
5540
5594
|
const query = optionalString(params, "query");
|
|
@@ -6025,8 +6079,8 @@ function isRetryableTool(name) {
|
|
|
6025
6079
|
return name !== "rename" && name !== "lsp_rename";
|
|
6026
6080
|
}
|
|
6027
6081
|
// src/proxy.ts
|
|
6028
|
-
import { existsSync as existsSync12, realpathSync as
|
|
6029
|
-
import { basename as
|
|
6082
|
+
import { existsSync as existsSync12, realpathSync as realpathSync5 } from "node:fs";
|
|
6083
|
+
import { basename as basename4, delimiter as delimiter4, dirname as dirname9, isAbsolute as isAbsolute5 } from "node:path";
|
|
6030
6084
|
var DEFAULT_STARTUP_TIMEOUT_MS = 1e4;
|
|
6031
6085
|
async function runMcpStdioProxy(options = {}) {
|
|
6032
6086
|
const input = options.input ?? process.stdin;
|
|
@@ -6151,13 +6205,13 @@ function canonicalizePathList(value) {
|
|
|
6151
6205
|
function canonicalizePath(value) {
|
|
6152
6206
|
if (value === undefined || !isAbsolute5(value) || !existsSync12(value))
|
|
6153
6207
|
return value;
|
|
6154
|
-
return
|
|
6208
|
+
return realpathSync5(value);
|
|
6155
6209
|
}
|
|
6156
6210
|
function projectRootFromOpenCodeConfigPath(path2) {
|
|
6157
|
-
if (
|
|
6211
|
+
if (basename4(path2) !== "lsp.json" && basename4(path2) !== "lsp-client.json")
|
|
6158
6212
|
return;
|
|
6159
6213
|
const configDir = dirname9(path2);
|
|
6160
|
-
const configDirName =
|
|
6214
|
+
const configDirName = basename4(configDir);
|
|
6161
6215
|
if (configDirName !== ".opencode" && configDirName !== ".omo")
|
|
6162
6216
|
return;
|
|
6163
6217
|
return dirname9(configDir);
|
|
@@ -3320,8 +3320,8 @@ function createIdleTimer(idleTimeoutMs, log, onTimeout) {
|
|
|
3320
3320
|
};
|
|
3321
3321
|
}
|
|
3322
3322
|
// ../lsp-core/src/lsp/client-wrapper.ts
|
|
3323
|
-
import { existsSync as existsSync9, statSync as statSync3 } from "node:fs";
|
|
3324
|
-
import { dirname as dirname6, join as join4, resolve as resolve7 } from "node:path";
|
|
3323
|
+
import { existsSync as existsSync9, realpathSync as realpathSync4, statSync as statSync3 } from "node:fs";
|
|
3324
|
+
import { basename as basename3, dirname as dirname6, join as join4, resolve as resolve7 } from "node:path";
|
|
3325
3325
|
|
|
3326
3326
|
// ../lsp-core/src/request-context.ts
|
|
3327
3327
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
@@ -4031,32 +4031,86 @@ function isDirectoryPath(filePath) {
|
|
|
4031
4031
|
}
|
|
4032
4032
|
}
|
|
4033
4033
|
function findWorkspaceRoot(filePath) {
|
|
4034
|
-
const
|
|
4034
|
+
const cwd = contextCwd();
|
|
4035
|
+
const abs = resolveReadablePathInsideContext(filePath);
|
|
4035
4036
|
let dir = abs;
|
|
4036
4037
|
if (!isDirectoryPath(dir)) {
|
|
4037
4038
|
dir = dirname6(dir);
|
|
4038
4039
|
}
|
|
4039
|
-
|
|
4040
|
-
while (dir
|
|
4041
|
-
|
|
4042
|
-
|
|
4043
|
-
|
|
4040
|
+
const fallbackRoot = nearestExistingDirectoryInsideContext(dir, cwd) ?? cwd;
|
|
4041
|
+
while (isPathInside(cwd, dir)) {
|
|
4042
|
+
const canonicalDir = existingDirectoryInsideContext(dir, cwd);
|
|
4043
|
+
if (canonicalDir !== undefined) {
|
|
4044
|
+
for (const marker of WORKSPACE_MARKERS) {
|
|
4045
|
+
if (existsSync9(join4(dir, marker))) {
|
|
4046
|
+
return canonicalDir;
|
|
4047
|
+
}
|
|
4044
4048
|
}
|
|
4045
4049
|
}
|
|
4046
|
-
|
|
4050
|
+
if (dir === cwd)
|
|
4051
|
+
break;
|
|
4047
4052
|
dir = dirname6(dir);
|
|
4048
4053
|
}
|
|
4049
|
-
return
|
|
4054
|
+
return fallbackRoot;
|
|
4050
4055
|
}
|
|
4051
|
-
function
|
|
4056
|
+
function resolveReadablePathInsideContext(filePath) {
|
|
4052
4057
|
const cwd = contextCwd();
|
|
4053
4058
|
const abs = resolve7(cwd, filePath);
|
|
4059
|
+
if (isPathInside(cwd, abs))
|
|
4060
|
+
return abs;
|
|
4061
|
+
const rebased = rebaseThroughCanonicalAncestor(abs, cwd);
|
|
4062
|
+
if (rebased !== undefined)
|
|
4063
|
+
return rebased;
|
|
4064
|
+
const canonical = canonicalizeExistingOrNearestAncestor(abs);
|
|
4065
|
+
if (isPathInside(cwd, canonical))
|
|
4066
|
+
return canonical;
|
|
4067
|
+
throw new LspInvalidPathError(`LSP file path must be inside request cwd: ${filePath}`);
|
|
4068
|
+
}
|
|
4069
|
+
function resolvePathInsideContext(filePath) {
|
|
4070
|
+
const cwd = contextCwd();
|
|
4071
|
+
const abs = resolveReadablePathInsideContext(filePath);
|
|
4054
4072
|
const canonical = canonicalizeExistingOrNearestAncestor(abs);
|
|
4055
4073
|
if (!isPathInside(cwd, canonical)) {
|
|
4056
4074
|
throw new LspInvalidPathError(`LSP file path must be inside request cwd: ${filePath}`);
|
|
4057
4075
|
}
|
|
4058
4076
|
return canonical;
|
|
4059
4077
|
}
|
|
4078
|
+
function rebaseThroughCanonicalAncestor(path, cwd) {
|
|
4079
|
+
let current = path;
|
|
4080
|
+
const suffix = [];
|
|
4081
|
+
while (true) {
|
|
4082
|
+
if (existsSync9(current)) {
|
|
4083
|
+
const canonical = realpathSync4(current);
|
|
4084
|
+
if (isPathInside(cwd, canonical))
|
|
4085
|
+
return suffix.length === 0 ? canonical : join4(canonical, ...suffix);
|
|
4086
|
+
}
|
|
4087
|
+
const parent = dirname6(current);
|
|
4088
|
+
if (parent === current)
|
|
4089
|
+
return;
|
|
4090
|
+
suffix.unshift(basename3(current));
|
|
4091
|
+
current = parent;
|
|
4092
|
+
}
|
|
4093
|
+
}
|
|
4094
|
+
function existingDirectoryInsideContext(directory, cwd) {
|
|
4095
|
+
if (!existsSync9(directory))
|
|
4096
|
+
return;
|
|
4097
|
+
const canonical = realpathSync4(directory);
|
|
4098
|
+
if (!statSync3(canonical).isDirectory())
|
|
4099
|
+
return;
|
|
4100
|
+
return isPathInside(cwd, canonical) ? canonical : undefined;
|
|
4101
|
+
}
|
|
4102
|
+
function nearestExistingDirectoryInsideContext(directory, cwd) {
|
|
4103
|
+
let current = directory;
|
|
4104
|
+
while (isPathInside(cwd, current)) {
|
|
4105
|
+
const canonical = existingDirectoryInsideContext(current, cwd);
|
|
4106
|
+
if (canonical !== undefined)
|
|
4107
|
+
return canonical;
|
|
4108
|
+
if (current === cwd)
|
|
4109
|
+
return;
|
|
4110
|
+
current = dirname6(current);
|
|
4111
|
+
}
|
|
4112
|
+
return;
|
|
4113
|
+
}
|
|
4060
4114
|
function formatServerLookupError(result) {
|
|
4061
4115
|
if (result.status === "not_installed") {
|
|
4062
4116
|
return formatNotInstalled(result);
|
|
@@ -4127,7 +4181,7 @@ function formatNotInstalled(result) {
|
|
|
4127
4181
|
].join(`
|
|
4128
4182
|
`);
|
|
4129
4183
|
}
|
|
4130
|
-
var
|
|
4184
|
+
var READ_ONLY_TOOLS = new Set([
|
|
4131
4185
|
"diagnostics",
|
|
4132
4186
|
"definition",
|
|
4133
4187
|
"references",
|
|
@@ -4136,7 +4190,7 @@ var READ_ONLY_RETRY_TOOLS = new Set([
|
|
|
4136
4190
|
"prepareRename"
|
|
4137
4191
|
]);
|
|
4138
4192
|
async function withLspClient(filePath, fn, toolName, options = {}) {
|
|
4139
|
-
const absPath = resolvePathInsideContext(filePath);
|
|
4193
|
+
const absPath = READ_ONLY_TOOLS.has(toolName) ? resolveReadablePathInsideContext(filePath) : resolvePathInsideContext(filePath);
|
|
4140
4194
|
if (isDirectoryPath(absPath)) {
|
|
4141
4195
|
throw new LspInvalidPathError("Directory paths are not supported by this LSP tool. " + "Use lsp.diagnostics with a directory path for directory diagnostics.");
|
|
4142
4196
|
}
|
|
@@ -4151,9 +4205,9 @@ async function withLspClient(filePath, fn, toolName, options = {}) {
|
|
|
4151
4205
|
const acquireAndCall = async (allowRetry) => {
|
|
4152
4206
|
const client = await manager2.getClient(root, server2, options.signal);
|
|
4153
4207
|
try {
|
|
4154
|
-
return await fn(client, root);
|
|
4208
|
+
return await fn(client, root, absPath);
|
|
4155
4209
|
} catch (err) {
|
|
4156
|
-
if (allowRetry &&
|
|
4210
|
+
if (allowRetry && READ_ONLY_TOOLS.has(toolName) && isLspDeadConnectionError(err)) {
|
|
4157
4211
|
manager2.invalidateClient(root, server2.id, client);
|
|
4158
4212
|
return acquireAndCall(false);
|
|
4159
4213
|
}
|
|
@@ -4608,7 +4662,7 @@ async function executeLspDiagnostics(params, signal) {
|
|
|
4608
4662
|
const filePath = requireString(params, "filePath");
|
|
4609
4663
|
const severity = severityFilter(params);
|
|
4610
4664
|
try {
|
|
4611
|
-
const absPath =
|
|
4665
|
+
const absPath = resolveReadablePathInsideContext(filePath);
|
|
4612
4666
|
if (isDirectoryPath(absPath)) {
|
|
4613
4667
|
const extension = inferExtensionFromDirectory(absPath);
|
|
4614
4668
|
if (!extension) {
|
|
@@ -4637,7 +4691,7 @@ async function executeLspDiagnostics(params, signal) {
|
|
|
4637
4691
|
};
|
|
4638
4692
|
return text(output2.output, details2);
|
|
4639
4693
|
}
|
|
4640
|
-
const result = await withLspClient(filePath, async (client) => client.diagnostics(
|
|
4694
|
+
const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.diagnostics(resolvedFilePath, signal), "diagnostics", clientOptions(signal));
|
|
4641
4695
|
if (result.transientError) {
|
|
4642
4696
|
const message = result.transientError.message;
|
|
4643
4697
|
const details2 = {
|
|
@@ -4712,7 +4766,7 @@ async function executeLspGotoDefinition(params, signal) {
|
|
|
4712
4766
|
const line = requireNumber(params, "line");
|
|
4713
4767
|
const character = requireNumber(params, "character");
|
|
4714
4768
|
try {
|
|
4715
|
-
const result = await withLspClient(filePath, async (client) => client.definition(
|
|
4769
|
+
const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.definition(resolvedFilePath, line, character, signal), "definition", clientOptions(signal));
|
|
4716
4770
|
const locations = !result ? [] : Array.isArray(result) ? result : [result];
|
|
4717
4771
|
const details = { filePath, line, character, locations };
|
|
4718
4772
|
if (locations.length === 0)
|
|
@@ -4737,7 +4791,7 @@ async function executeLspFindReferences(params, signal) {
|
|
|
4737
4791
|
const character = requireNumber(params, "character");
|
|
4738
4792
|
const includeDeclaration = optionalBoolean(params, "includeDeclaration") ?? true;
|
|
4739
4793
|
try {
|
|
4740
|
-
const result = await withLspClient(filePath, async (client) => client.references(
|
|
4794
|
+
const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.references(resolvedFilePath, line, character, includeDeclaration, signal), "references", clientOptions(signal));
|
|
4741
4795
|
const references = Array.isArray(result) ? result : [];
|
|
4742
4796
|
const total = references.length;
|
|
4743
4797
|
const truncated = total > DEFAULT_MAX_REFERENCES;
|
|
@@ -4779,7 +4833,7 @@ async function executeLspPrepareRename(params, signal) {
|
|
|
4779
4833
|
const line = requireNumber(params, "line");
|
|
4780
4834
|
const character = requireNumber(params, "character");
|
|
4781
4835
|
try {
|
|
4782
|
-
const result = await withLspClient(filePath, async (client) => client.prepareRename(
|
|
4836
|
+
const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.prepareRename(resolvedFilePath, line, character, signal), "prepareRename", clientOptions(signal));
|
|
4783
4837
|
const details = { filePath, line, character, result };
|
|
4784
4838
|
return text(formatPrepareRenameResult(result), details);
|
|
4785
4839
|
} catch (error) {
|
|
@@ -4800,7 +4854,7 @@ async function executeLspRename(params, signal) {
|
|
|
4800
4854
|
const character = requireNumber(params, "character");
|
|
4801
4855
|
const newName = requireString(params, "newName");
|
|
4802
4856
|
try {
|
|
4803
|
-
const result = await withLspClient(filePath, async (client) => client.rename(
|
|
4857
|
+
const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.rename(resolvedFilePath, line, character, newName, signal), "rename", clientOptions(signal));
|
|
4804
4858
|
const details = { filePath, line, character, newName, apply: result.apply, edit: result.edit };
|
|
4805
4859
|
return text(formatApplyResult(result.apply), details, !result.apply.success);
|
|
4806
4860
|
} catch (error) {
|
|
@@ -4880,7 +4934,7 @@ async function executeLspSymbols(params, signal) {
|
|
|
4880
4934
|
const symbols2 = await withLspClient(filePath, async (client) => client.workspaceSymbols(query, signal), "workspaceSymbols", clientOptions(signal));
|
|
4881
4935
|
return formatSymbolsResult(filePath, scope, symbols2, limit, query);
|
|
4882
4936
|
}
|
|
4883
|
-
const symbols = await withLspClient(filePath, async (client) => client.documentSymbols(
|
|
4937
|
+
const symbols = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.documentSymbols(resolvedFilePath, signal), "documentSymbols", clientOptions(signal));
|
|
4884
4938
|
return formatSymbolsResult(filePath, scope, symbols, limit);
|
|
4885
4939
|
} catch (error) {
|
|
4886
4940
|
const query = optionalString(params, "query");
|
|
@@ -306,8 +306,8 @@ function createIdleTimer(idleTimeoutMs, log, onTimeout) {
|
|
|
306
306
|
};
|
|
307
307
|
}
|
|
308
308
|
// ../lsp-core/src/lsp/client-wrapper.ts
|
|
309
|
-
import { existsSync as existsSync9, statSync as statSync3 } from "node:fs";
|
|
310
|
-
import { dirname as dirname6, join as join4, resolve as resolve7 } from "node:path";
|
|
309
|
+
import { existsSync as existsSync9, realpathSync as realpathSync4, statSync as statSync3 } from "node:fs";
|
|
310
|
+
import { basename as basename3, dirname as dirname6, join as join4, resolve as resolve7 } from "node:path";
|
|
311
311
|
|
|
312
312
|
// ../lsp-core/src/request-context.ts
|
|
313
313
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
@@ -4030,32 +4030,86 @@ function isDirectoryPath(filePath) {
|
|
|
4030
4030
|
}
|
|
4031
4031
|
}
|
|
4032
4032
|
function findWorkspaceRoot(filePath) {
|
|
4033
|
-
const
|
|
4033
|
+
const cwd = contextCwd();
|
|
4034
|
+
const abs = resolveReadablePathInsideContext(filePath);
|
|
4034
4035
|
let dir = abs;
|
|
4035
4036
|
if (!isDirectoryPath(dir)) {
|
|
4036
4037
|
dir = dirname6(dir);
|
|
4037
4038
|
}
|
|
4038
|
-
|
|
4039
|
-
while (dir
|
|
4040
|
-
|
|
4041
|
-
|
|
4042
|
-
|
|
4039
|
+
const fallbackRoot = nearestExistingDirectoryInsideContext(dir, cwd) ?? cwd;
|
|
4040
|
+
while (isPathInside(cwd, dir)) {
|
|
4041
|
+
const canonicalDir = existingDirectoryInsideContext(dir, cwd);
|
|
4042
|
+
if (canonicalDir !== undefined) {
|
|
4043
|
+
for (const marker of WORKSPACE_MARKERS) {
|
|
4044
|
+
if (existsSync9(join4(dir, marker))) {
|
|
4045
|
+
return canonicalDir;
|
|
4046
|
+
}
|
|
4043
4047
|
}
|
|
4044
4048
|
}
|
|
4045
|
-
|
|
4049
|
+
if (dir === cwd)
|
|
4050
|
+
break;
|
|
4046
4051
|
dir = dirname6(dir);
|
|
4047
4052
|
}
|
|
4048
|
-
return
|
|
4053
|
+
return fallbackRoot;
|
|
4049
4054
|
}
|
|
4050
|
-
function
|
|
4055
|
+
function resolveReadablePathInsideContext(filePath) {
|
|
4051
4056
|
const cwd = contextCwd();
|
|
4052
4057
|
const abs = resolve7(cwd, filePath);
|
|
4058
|
+
if (isPathInside(cwd, abs))
|
|
4059
|
+
return abs;
|
|
4060
|
+
const rebased = rebaseThroughCanonicalAncestor(abs, cwd);
|
|
4061
|
+
if (rebased !== undefined)
|
|
4062
|
+
return rebased;
|
|
4063
|
+
const canonical = canonicalizeExistingOrNearestAncestor(abs);
|
|
4064
|
+
if (isPathInside(cwd, canonical))
|
|
4065
|
+
return canonical;
|
|
4066
|
+
throw new LspInvalidPathError(`LSP file path must be inside request cwd: ${filePath}`);
|
|
4067
|
+
}
|
|
4068
|
+
function resolvePathInsideContext(filePath) {
|
|
4069
|
+
const cwd = contextCwd();
|
|
4070
|
+
const abs = resolveReadablePathInsideContext(filePath);
|
|
4053
4071
|
const canonical = canonicalizeExistingOrNearestAncestor(abs);
|
|
4054
4072
|
if (!isPathInside(cwd, canonical)) {
|
|
4055
4073
|
throw new LspInvalidPathError(`LSP file path must be inside request cwd: ${filePath}`);
|
|
4056
4074
|
}
|
|
4057
4075
|
return canonical;
|
|
4058
4076
|
}
|
|
4077
|
+
function rebaseThroughCanonicalAncestor(path, cwd) {
|
|
4078
|
+
let current = path;
|
|
4079
|
+
const suffix = [];
|
|
4080
|
+
while (true) {
|
|
4081
|
+
if (existsSync9(current)) {
|
|
4082
|
+
const canonical = realpathSync4(current);
|
|
4083
|
+
if (isPathInside(cwd, canonical))
|
|
4084
|
+
return suffix.length === 0 ? canonical : join4(canonical, ...suffix);
|
|
4085
|
+
}
|
|
4086
|
+
const parent = dirname6(current);
|
|
4087
|
+
if (parent === current)
|
|
4088
|
+
return;
|
|
4089
|
+
suffix.unshift(basename3(current));
|
|
4090
|
+
current = parent;
|
|
4091
|
+
}
|
|
4092
|
+
}
|
|
4093
|
+
function existingDirectoryInsideContext(directory, cwd) {
|
|
4094
|
+
if (!existsSync9(directory))
|
|
4095
|
+
return;
|
|
4096
|
+
const canonical = realpathSync4(directory);
|
|
4097
|
+
if (!statSync3(canonical).isDirectory())
|
|
4098
|
+
return;
|
|
4099
|
+
return isPathInside(cwd, canonical) ? canonical : undefined;
|
|
4100
|
+
}
|
|
4101
|
+
function nearestExistingDirectoryInsideContext(directory, cwd) {
|
|
4102
|
+
let current = directory;
|
|
4103
|
+
while (isPathInside(cwd, current)) {
|
|
4104
|
+
const canonical = existingDirectoryInsideContext(current, cwd);
|
|
4105
|
+
if (canonical !== undefined)
|
|
4106
|
+
return canonical;
|
|
4107
|
+
if (current === cwd)
|
|
4108
|
+
return;
|
|
4109
|
+
current = dirname6(current);
|
|
4110
|
+
}
|
|
4111
|
+
return;
|
|
4112
|
+
}
|
|
4059
4113
|
function formatServerLookupError(result) {
|
|
4060
4114
|
if (result.status === "not_installed") {
|
|
4061
4115
|
return formatNotInstalled(result);
|
|
@@ -4126,7 +4180,7 @@ function formatNotInstalled(result) {
|
|
|
4126
4180
|
].join(`
|
|
4127
4181
|
`);
|
|
4128
4182
|
}
|
|
4129
|
-
var
|
|
4183
|
+
var READ_ONLY_TOOLS = new Set([
|
|
4130
4184
|
"diagnostics",
|
|
4131
4185
|
"definition",
|
|
4132
4186
|
"references",
|
|
@@ -4135,7 +4189,7 @@ var READ_ONLY_RETRY_TOOLS = new Set([
|
|
|
4135
4189
|
"prepareRename"
|
|
4136
4190
|
]);
|
|
4137
4191
|
async function withLspClient(filePath, fn, toolName, options = {}) {
|
|
4138
|
-
const absPath = resolvePathInsideContext(filePath);
|
|
4192
|
+
const absPath = READ_ONLY_TOOLS.has(toolName) ? resolveReadablePathInsideContext(filePath) : resolvePathInsideContext(filePath);
|
|
4139
4193
|
if (isDirectoryPath(absPath)) {
|
|
4140
4194
|
throw new LspInvalidPathError("Directory paths are not supported by this LSP tool. " + "Use lsp.diagnostics with a directory path for directory diagnostics.");
|
|
4141
4195
|
}
|
|
@@ -4150,9 +4204,9 @@ async function withLspClient(filePath, fn, toolName, options = {}) {
|
|
|
4150
4204
|
const acquireAndCall = async (allowRetry) => {
|
|
4151
4205
|
const client = await manager.getClient(root, server2, options.signal);
|
|
4152
4206
|
try {
|
|
4153
|
-
return await fn(client, root);
|
|
4207
|
+
return await fn(client, root, absPath);
|
|
4154
4208
|
} catch (err) {
|
|
4155
|
-
if (allowRetry &&
|
|
4209
|
+
if (allowRetry && READ_ONLY_TOOLS.has(toolName) && isLspDeadConnectionError(err)) {
|
|
4156
4210
|
manager.invalidateClient(root, server2.id, client);
|
|
4157
4211
|
return acquireAndCall(false);
|
|
4158
4212
|
}
|
|
@@ -4607,7 +4661,7 @@ async function executeLspDiagnostics(params, signal) {
|
|
|
4607
4661
|
const filePath = requireString(params, "filePath");
|
|
4608
4662
|
const severity = severityFilter(params);
|
|
4609
4663
|
try {
|
|
4610
|
-
const absPath =
|
|
4664
|
+
const absPath = resolveReadablePathInsideContext(filePath);
|
|
4611
4665
|
if (isDirectoryPath(absPath)) {
|
|
4612
4666
|
const extension = inferExtensionFromDirectory(absPath);
|
|
4613
4667
|
if (!extension) {
|
|
@@ -4636,7 +4690,7 @@ async function executeLspDiagnostics(params, signal) {
|
|
|
4636
4690
|
};
|
|
4637
4691
|
return text(output2.output, details2);
|
|
4638
4692
|
}
|
|
4639
|
-
const result = await withLspClient(filePath, async (client) => client.diagnostics(
|
|
4693
|
+
const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.diagnostics(resolvedFilePath, signal), "diagnostics", clientOptions(signal));
|
|
4640
4694
|
if (result.transientError) {
|
|
4641
4695
|
const message = result.transientError.message;
|
|
4642
4696
|
const details2 = {
|
|
@@ -4711,7 +4765,7 @@ async function executeLspGotoDefinition(params, signal) {
|
|
|
4711
4765
|
const line = requireNumber(params, "line");
|
|
4712
4766
|
const character = requireNumber(params, "character");
|
|
4713
4767
|
try {
|
|
4714
|
-
const result = await withLspClient(filePath, async (client) => client.definition(
|
|
4768
|
+
const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.definition(resolvedFilePath, line, character, signal), "definition", clientOptions(signal));
|
|
4715
4769
|
const locations = !result ? [] : Array.isArray(result) ? result : [result];
|
|
4716
4770
|
const details = { filePath, line, character, locations };
|
|
4717
4771
|
if (locations.length === 0)
|
|
@@ -4736,7 +4790,7 @@ async function executeLspFindReferences(params, signal) {
|
|
|
4736
4790
|
const character = requireNumber(params, "character");
|
|
4737
4791
|
const includeDeclaration = optionalBoolean(params, "includeDeclaration") ?? true;
|
|
4738
4792
|
try {
|
|
4739
|
-
const result = await withLspClient(filePath, async (client) => client.references(
|
|
4793
|
+
const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.references(resolvedFilePath, line, character, includeDeclaration, signal), "references", clientOptions(signal));
|
|
4740
4794
|
const references = Array.isArray(result) ? result : [];
|
|
4741
4795
|
const total = references.length;
|
|
4742
4796
|
const truncated = total > DEFAULT_MAX_REFERENCES;
|
|
@@ -4778,7 +4832,7 @@ async function executeLspPrepareRename(params, signal) {
|
|
|
4778
4832
|
const line = requireNumber(params, "line");
|
|
4779
4833
|
const character = requireNumber(params, "character");
|
|
4780
4834
|
try {
|
|
4781
|
-
const result = await withLspClient(filePath, async (client) => client.prepareRename(
|
|
4835
|
+
const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.prepareRename(resolvedFilePath, line, character, signal), "prepareRename", clientOptions(signal));
|
|
4782
4836
|
const details = { filePath, line, character, result };
|
|
4783
4837
|
return text(formatPrepareRenameResult(result), details);
|
|
4784
4838
|
} catch (error) {
|
|
@@ -4799,7 +4853,7 @@ async function executeLspRename(params, signal) {
|
|
|
4799
4853
|
const character = requireNumber(params, "character");
|
|
4800
4854
|
const newName = requireString(params, "newName");
|
|
4801
4855
|
try {
|
|
4802
|
-
const result = await withLspClient(filePath, async (client) => client.rename(
|
|
4856
|
+
const result = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.rename(resolvedFilePath, line, character, newName, signal), "rename", clientOptions(signal));
|
|
4803
4857
|
const details = { filePath, line, character, newName, apply: result.apply, edit: result.edit };
|
|
4804
4858
|
return text(formatApplyResult(result.apply), details, !result.apply.success);
|
|
4805
4859
|
} catch (error) {
|
|
@@ -4879,7 +4933,7 @@ async function executeLspSymbols(params, signal) {
|
|
|
4879
4933
|
const symbols2 = await withLspClient(filePath, async (client) => client.workspaceSymbols(query, signal), "workspaceSymbols", clientOptions(signal));
|
|
4880
4934
|
return formatSymbolsResult(filePath, scope, symbols2, limit, query);
|
|
4881
4935
|
}
|
|
4882
|
-
const symbols = await withLspClient(filePath, async (client) => client.documentSymbols(
|
|
4936
|
+
const symbols = await withLspClient(filePath, async (client, _workspaceRoot, resolvedFilePath) => client.documentSymbols(resolvedFilePath, signal), "documentSymbols", clientOptions(signal));
|
|
4883
4937
|
return formatSymbolsResult(filePath, scope, symbols, limit);
|
|
4884
4938
|
} catch (error) {
|
|
4885
4939
|
const query = optionalString(params, "query");
|