dsh-vscode-mode 0.15.9 → 0.16.0
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 +5 -4
- package/lib/index.js +67 -17
- package/lib/index.js.map +1 -1
- package/package.json +1 -1
- package/src/dap/discovery.ts +5 -3
- package/src/dap/provider.ts +26 -0
- package/src/lsp/providers.ts +9 -5
- package/src/lsp/server.ts +26 -1
package/README.md
CHANGED
|
@@ -460,18 +460,18 @@ DSH 每次启动监听随机端口,`http://127.0.0.1:<port>` 就是浏览器 o
|
|
|
460
460
|
|
|
461
461
|
官方 `dsh plugin` 方式,三选一。下面以 `web` profile 为例;Desktop 或其他命名
|
|
462
462
|
profile 请替换为实际目标,不要把示例目录当成当前运行 profile。升级前可阅读
|
|
463
|
-
[0.
|
|
463
|
+
[0.16.0 发布说明](docs/release-0.16.0.md);从 0.14.2 或更旧版本升级还须阅读
|
|
464
464
|
[0.14.3 数据迁移与回退说明](docs/release-0.14.3.md)。
|
|
465
465
|
|
|
466
466
|
```bash
|
|
467
467
|
# ① Git 安装(clone + prepare 构建;推荐打固定 tag)
|
|
468
|
-
dsh plugin --profile web add github:Lenonss/DSH_VsCodeMode#v0.
|
|
468
|
+
dsh plugin --profile web add github:Lenonss/DSH_VsCodeMode#v0.16.0
|
|
469
469
|
|
|
470
470
|
# ② npm 注册表(发布到 npm 后)
|
|
471
|
-
dsh plugin --profile web add dsh-vscode-mode@0.
|
|
471
|
+
dsh plugin --profile web add dsh-vscode-mode@0.16.0
|
|
472
472
|
|
|
473
473
|
# ③ GitHub Release tgz 直装(Release asset 可用后)
|
|
474
|
-
dsh plugin --profile web add https://github.com/Lenonss/DSH_VsCodeMode/releases/download/v0.
|
|
474
|
+
dsh plugin --profile web add https://github.com/Lenonss/DSH_VsCodeMode/releases/download/v0.16.0/dsh-vscode-mode-0.16.0.tgz
|
|
475
475
|
```
|
|
476
476
|
|
|
477
477
|
> **DSH 版本政策(0.14.10 起)**:六项 DSH peer 统一声明为 `*`,不再维护逐版
|
|
@@ -809,6 +809,7 @@ Keep All / Undo All 却是亮的。修复:单文件 Keep / Undo 覆盖冲突
|
|
|
809
809
|
完整变更见 [GitHub Releases](https://github.com/Lenonss/DSH_VsCodeMode/releases)。
|
|
810
810
|
近期关键版本:
|
|
811
811
|
|
|
812
|
+
- **v0.16.0**:**C# 智能体体验增强**——C# provider DotRush 优先于 ms-Roslyn(自带 sln 加载与反编译跳转;Roslyn 无 C# Dev Kit 时不加载项目);csharp 握手后自动找工作区根 `.sln` 发 Roslyn 专有 `solution/open`,元数据符号(Unity 引擎/NuGet 程序集)可跳转与 hover;DAP 调试支持 `runtime='dotnet'` 适配器(DotRush monodbg 形态),按 dll runtimeconfig 要求的运行时大版本选择 dotnet。
|
|
812
813
|
- **v0.15.9**:**插件自我更新与可用更新提醒**——设置页「文件与安装」新增更新行:显示当前版本,一键检查 npm 上的最新版本,发现新版后可确认执行自我更新(host 端先卸载再安装插件包,安装失败自动恢复 profile package.json/pnpm-lock.yaml,更新期间页面会短暂断开)。客户端启动后延迟探测新版本,发现可用更新时弹 toast 提醒(每个版本只提醒一次),devForm 开发形态不提醒。详见 [0.15.9 发布说明](docs/release-0.15.9.md)。
|
|
813
814
|
- **v0.15.8**:**跨端「会话不存在」兼容**——桌面端与 Web 端各自运行独立 DSH 实例、会话列表互通但会话仅在一端激活时,另一端文件编辑器不再卡在「文件加载失败:会话不存在 0%」:中央区显示「会话在当前端不可用」终态提示(说明成因、保留重试),资源管理器红条同样替换为友好文案。host 三处会话前置错误文案收敛为 shared 常量,client 按常量识别归类。详见 [0.15.8 发布说明](docs/release-0.15.8.md)。
|
|
814
815
|
- **v0.15.7**:**Lua 成员链跳转与枚举引用**——规避 EmmyLua 标识符词边界解析问题,从引用结果推导跨文件声明;Lua 表字面量枚举键 Ctrl+点击打开引用 Peek,使用处仍按原生定义跳转。真实 GUI 点击尚未完成验收,用户接受此缺口;发布不自动安装或重启当前实例,详见 [0.15.7 发布说明](docs/release-0.15.7.md)。
|
package/lib/index.js
CHANGED
|
@@ -14420,6 +14420,25 @@ function isDeclarationForm(word, queryChain) {
|
|
|
14420
14420
|
*/
|
|
14421
14421
|
const MAX_DOC_VERSION = 2147483647;
|
|
14422
14422
|
/**
|
|
14423
|
+
* 找工作区根目录下的第一个 .sln(字典序)。
|
|
14424
|
+
*
|
|
14425
|
+
* 背景:Roslyn LSP 启动后若收不到 solution/project 通知,会停留在「杂项文件」模式——
|
|
14426
|
+
* 工作区内自有符号可解析,但 Unity 引擎程序集 / NuGet 包等元数据符号的
|
|
14427
|
+
* definition/hover 一律返回空(实测 2026-10-16,GameObject.Find 全空)。
|
|
14428
|
+
* 需在握手后发 Roslyn 专有 `solution/open` 通知加载项目上下文。
|
|
14429
|
+
* @author ddj 2026年10月19号
|
|
14430
|
+
* @param root 工作区根(绝对路径)
|
|
14431
|
+
* @returns sln 绝对路径;根目录无 sln 返回 null
|
|
14432
|
+
*/
|
|
14433
|
+
async function findSolutionFile(root) {
|
|
14434
|
+
try {
|
|
14435
|
+
const names = (await readdir(root)).filter((name) => name.toLowerCase().endsWith(".sln")).sort();
|
|
14436
|
+
return names[0] ? join(root, names[0]) : null;
|
|
14437
|
+
} catch {
|
|
14438
|
+
return null;
|
|
14439
|
+
}
|
|
14440
|
+
}
|
|
14441
|
+
/**
|
|
14423
14442
|
* 使用合法、递增的 Int32 文档版本;旧客户端的毫秒时间戳不能直发给 Roslyn。
|
|
14424
14443
|
* @author ddj 2026年09月24号
|
|
14425
14444
|
* @param incoming 客户端传来的版本
|
|
@@ -14680,7 +14699,11 @@ function createLspServer(spec, root, languageId, logger) {
|
|
|
14680
14699
|
onLog: (line) => log("lsp: " + line)
|
|
14681
14700
|
});
|
|
14682
14701
|
const caps = await client.initialize(rootUri, [rootUri]);
|
|
14683
|
-
if (languageId === "csharp")
|
|
14702
|
+
if (languageId === "csharp") {
|
|
14703
|
+
client.notify("workspace/didChangeConfiguration", { settings: { dotrush: { roslyn: {} } } });
|
|
14704
|
+
const slnPath = await findSolutionFile(root);
|
|
14705
|
+
if (slnPath) client.notify("solution/open", { solution: pathToFileUri(slnPath) });
|
|
14706
|
+
}
|
|
14684
14707
|
capabilities = caps;
|
|
14685
14708
|
return true;
|
|
14686
14709
|
} catch (error) {
|
|
@@ -16104,8 +16127,8 @@ function resolveLuaProvider(manual, home = dshHome()) {
|
|
|
16104
16127
|
});
|
|
16105
16128
|
}
|
|
16106
16129
|
/**
|
|
16107
|
-
* 解析 C# provider(优先级:手动 > 扩展源 > 自动发现;
|
|
16108
|
-
*
|
|
16130
|
+
* 解析 C# provider(优先级:手动 > 扩展源 > 自动发现;DotRush 优先——自带 sln 加载与
|
|
16131
|
+
* 反编译跳转;Roslyn dll 需 dotnet,但无 C# Dev Kit 时不加载项目;或 OmniSharp)。
|
|
16109
16132
|
* @author ddj 2026年08月27号
|
|
16110
16133
|
* @param manual 手动配置
|
|
16111
16134
|
* @param home DSH home(缺省真实;测试可注入临时目录)
|
|
@@ -16127,17 +16150,6 @@ function resolveCSharpProvider(manual, home = dshHome()) {
|
|
|
16127
16150
|
const discovered = candidateCSharpServers(h);
|
|
16128
16151
|
const sdkRoot = findSdkRoot();
|
|
16129
16152
|
const msbuildEnv = sdkRoot ? sdkEnvOf(sdkRoot) : void 0;
|
|
16130
|
-
if (discovered.roslynDll && discovered.dotnet) return {
|
|
16131
|
-
...base,
|
|
16132
|
-
kind: "discover",
|
|
16133
|
-
argv: [
|
|
16134
|
-
discovered.dotnet,
|
|
16135
|
-
discovered.roslynDll,
|
|
16136
|
-
"--stdio"
|
|
16137
|
-
],
|
|
16138
|
-
env: msbuildEnv,
|
|
16139
|
-
ready: true
|
|
16140
|
-
};
|
|
16141
16153
|
let dotrushReason = null;
|
|
16142
16154
|
let provisionMajor;
|
|
16143
16155
|
if (discovered.dotrushDll) {
|
|
@@ -16155,6 +16167,17 @@ function resolveCSharpProvider(manual, home = dshHome()) {
|
|
|
16155
16167
|
dotrushReason = launch.reason;
|
|
16156
16168
|
provisionMajor = major ?? void 0;
|
|
16157
16169
|
}
|
|
16170
|
+
if (discovered.roslynDll && discovered.dotnet) return {
|
|
16171
|
+
...base,
|
|
16172
|
+
kind: "discover",
|
|
16173
|
+
argv: [
|
|
16174
|
+
discovered.dotnet,
|
|
16175
|
+
discovered.roslynDll,
|
|
16176
|
+
"--stdio"
|
|
16177
|
+
],
|
|
16178
|
+
env: msbuildEnv,
|
|
16179
|
+
ready: true
|
|
16180
|
+
};
|
|
16158
16181
|
if (discovered.omnisharpExe) return {
|
|
16159
16182
|
...base,
|
|
16160
16183
|
kind: "discover",
|
|
@@ -22710,7 +22733,8 @@ function listProcesses() {
|
|
|
22710
22733
|
* ~/.vscode-server/extensions、插件扩展目录),读各扩展 package.json 的
|
|
22711
22734
|
* contributes.debuggers[] 声明,解析为 DapAdapterDecl:
|
|
22712
22735
|
* - program 按平台取 windows/linux/osx 覆盖,相对扩展根解析;
|
|
22713
|
-
* - runtime='node' → 由 node 跑 js
|
|
22736
|
+
* - runtime='node' → 由 node 跑 js 入口;runtime='dotnet' → 由 dotnet 跑 dll 入口;
|
|
22737
|
+
* 无 runtime → program 即可执行(args 为清单声明);
|
|
22714
22738
|
* - 同 type 多扩展并存 → 按「清单版本降序(numeric) → 路径升序」取唯一(与 LSP 候选口径一致);
|
|
22715
22739
|
* - 入口不存在 / runtime 不支持 → available=false + reason(如 DotRush 按需下载的 clrdbg,
|
|
22716
22740
|
* 诚实标注不假成功,调用方据此在下拉置灰并提示原因)。
|
|
@@ -22792,9 +22816,9 @@ function declOf(extDir, entry) {
|
|
|
22792
22816
|
const languages = stringsOf(entry.languages);
|
|
22793
22817
|
const resolved = resolveProgram(extDir, entry);
|
|
22794
22818
|
const runtime = typeof entry.runtime === "string" && entry.runtime ? entry.runtime : void 0;
|
|
22795
|
-
const runtimeBad = runtime !== void 0 && runtime !== "node";
|
|
22819
|
+
const runtimeBad = runtime !== void 0 && runtime !== "node" && runtime !== "dotnet";
|
|
22796
22820
|
const available = resolved.available && !runtimeBad;
|
|
22797
|
-
const reason = !resolved.available ? resolved.reason : runtimeBad ? "暂不支持运行时 \"" + runtime + "\"(仅支持 node 与原生可执行)" : void 0;
|
|
22821
|
+
const reason = !resolved.available ? resolved.reason : runtimeBad ? "暂不支持运行时 \"" + runtime + "\"(仅支持 node、dotnet 与原生可执行)" : void 0;
|
|
22798
22822
|
return {
|
|
22799
22823
|
type,
|
|
22800
22824
|
label: typeof entry.label === "string" && entry.label ? entry.label : type,
|
|
@@ -22860,6 +22884,8 @@ function stringsOf(value) {
|
|
|
22860
22884
|
* dsh-vscode-mode host — 调试适配器规格解析:按调试类型从扩展清单声明(discovery)
|
|
22861
22885
|
* 解析 spawn 规格,通用不限定语言:
|
|
22862
22886
|
* - runtime='node' → node 跑 js 入口(emmylua 形态,等价旧 process.execPath 硬编码);
|
|
22887
|
+
* - runtime='dotnet' → dotnet 跑 dll 入口(DotRush monodbg 形态;按 dll runtimeconfig
|
|
22888
|
+
* 要求的运行时大版本找满足的 dotnet,对齐 LSP 侧 dotrushLaunch 口径);
|
|
22863
22889
|
* - 无 runtime → program 即原生可执行(clrdbg/monodbg 形态,args 为清单声明如 --interpreter=vscode);
|
|
22864
22890
|
* - 其它 runtime 明确不支持(decl.available=false 带原因,不做假启动)。
|
|
22865
22891
|
* 旧版仅探测 tangzx.emmylua 两型(attach/new),由清单驱动后自然覆盖并扩展到任意适配器。
|
|
@@ -22888,6 +22914,15 @@ function resolveAdapterSpec(type, force = false, home) {
|
|
|
22888
22914
|
command: process.execPath,
|
|
22889
22915
|
args: [decl.program, ...decl.args]
|
|
22890
22916
|
};
|
|
22917
|
+
if (decl.runtime === "dotnet") {
|
|
22918
|
+
const dotnet = dotnetLaunch(decl.extensionPath, decl.program);
|
|
22919
|
+
if (!dotnet) return null;
|
|
22920
|
+
return {
|
|
22921
|
+
...base,
|
|
22922
|
+
command: dotnet,
|
|
22923
|
+
args: [decl.program, ...decl.args]
|
|
22924
|
+
};
|
|
22925
|
+
}
|
|
22891
22926
|
if (!decl.runtime) return {
|
|
22892
22927
|
...base,
|
|
22893
22928
|
command: decl.program,
|
|
@@ -22895,6 +22930,21 @@ function resolveAdapterSpec(type, force = false, home) {
|
|
|
22895
22930
|
};
|
|
22896
22931
|
return null;
|
|
22897
22932
|
}
|
|
22933
|
+
/**
|
|
22934
|
+
* 为 dotnet 型适配器找启动用 dotnet:优先扩展内置 SDK,其次满足 dll runtimeconfig
|
|
22935
|
+
* 要求的运行时大版本,兜底任意 dotnet(对齐 LSP 侧 dotrushLaunch 口径)。
|
|
22936
|
+
* @author ddj 2026年10月19号
|
|
22937
|
+
* @param extensionPath 扩展根目录
|
|
22938
|
+
* @param program 适配器 dll 绝对路径
|
|
22939
|
+
* @returns dotnet 可执行路径;找不到满足条件的返回 null
|
|
22940
|
+
*/
|
|
22941
|
+
function dotnetLaunch(extensionPath, program) {
|
|
22942
|
+
const sdkDotnet = join(extensionPath, "extension", "Sdk", "dotnet" + (process.platform === "win32" ? ".exe" : ""));
|
|
22943
|
+
if (existsSync(sdkDotnet)) return sdkDotnet;
|
|
22944
|
+
const major = runtimeMajorOf(dirname(program));
|
|
22945
|
+
if (major !== null) return dotnetWithRuntime(major) ?? findDotnet();
|
|
22946
|
+
return findDotnet();
|
|
22947
|
+
}
|
|
22898
22948
|
//#endregion
|
|
22899
22949
|
//#region src/dap/protocol.ts
|
|
22900
22950
|
/** 客户端 → 适配器请求帧构造。 */
|