dsh-code-server-app 0.3.52 → 0.3.54
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 +17 -0
- package/assets/extensions/dshcs-editor-bridge/webview/THIRD-PARTY.md +1 -1
- package/lib/child-node.mjs +138 -0
- package/lib/index.js +20 -2
- package/package.json +4 -1
- package/vendor/VENDOR.json +1 -1
package/README.md
CHANGED
|
@@ -481,6 +481,8 @@ pnpm test:client-seat # 设置卡住哪个座位:插件页 plugins.bundle
|
|
|
481
481
|
pnpm test:fullscreen # 打开标签即全屏
|
|
482
482
|
pnpm test:vendored # 重打包表 ↔ 插件依赖表一致(无 npm: 别名 / 无聚合包 / vendored.json 进了 files)
|
|
483
483
|
pnpm test:dsh-resolve # 部署位置表:各平台全局装布局(npm --prefix / nvm / pnpm global / %APPDATA%)都能找到 DSH 部署
|
|
484
|
+
pnpm test:child-node # Electron 宿主(桌面版)下给 IDE 子进程挑真 Node:候选顺序 / 剥离 ELECTRON_RUN_AS_NODE / 找不到时如实退回
|
|
485
|
+
pnpm test:package-files # 发布物白名单守卫:files 里的模块**递归**import 到的本地文件也必须在 files 里(0.3.53 漏 lib/child-node.mjs 的事故)
|
|
484
486
|
pnpm test:installed # 安装冒烟:对**已装进 profile 的产物**做断言(默认 <DSH_HOME>/profiles/web)
|
|
485
487
|
# files 白名单每条都在 / 重打包包在当前平台齐全 / 原生模块无缺失 /
|
|
486
488
|
# 已安装副本能 import / 树在位 —— 仓库回归看不出这一类
|
|
@@ -962,6 +964,21 @@ desktop profile 由 `apps/desktop-host` 把 `/api/*` 交给同一个 `createShar
|
|
|
962
964
|
|
|
963
965
|
## DSH Desktop(无 webServer)
|
|
964
966
|
|
|
967
|
+
- **IDE 子进程必须用真 Node 跑(0.3.53 起;桌面版特有的硬约束)**:DSH Desktop 的宿主进程是
|
|
968
|
+
**Electron 的 Node 模式**(`ELECTRON_RUN_AS_NODE=1`,`process.execPath` = Electron 二进制)。VS Code 的
|
|
969
|
+
`server-main.js` 会注册一段**只在 Electron / `ELECTRON_RUN_AS_NODE` 下生效**的 asar 解析钩子:凡是解析结果
|
|
970
|
+
落在"应用根"之外的包,它就去 `node_modules.asar` 里找,找不到直接抛
|
|
971
|
+
`Cannot find package 'X' within the application resources`。本插件的原生包都是**树外**的 pnpm 目录,
|
|
972
|
+
所以启动路径上的 `@vscode/spdlog` / `@vscode/deviceid` / `@vscode/windows-registry` 三个 ESM import 必被拒
|
|
973
|
+
⇒ launcher 打 `FATAL 加载 VS Code server 失败` ⇒ 面板显示「**code-server 意外退出(exit 2)**」(界面上的
|
|
974
|
+
报错只有栈尾,首行被日志尾部截断,所以看不出是哪个包)。修法:`lib/child-node.mjs` 检测到 Electron 宿主时,
|
|
975
|
+
改用**应用自带的真 Node**(`resources/runtime/primary-runtime/dependencies/node/bin/node.exe`,实测 v24.21.0),
|
|
976
|
+
并把 `ELECTRON_RUN_AS_NODE` 从子进程环境里剥掉;web/CLI 的普通 node 宿主行为一字不变。
|
|
977
|
+
- 试过但不能用的兜底:`VSCODE_DEV=1`(绕过了钩子,却切到 dev 引导路径 → 报 `<树>/lib/vscode/out/bootstrap-import.js` 缺失);
|
|
978
|
+
往树里补 junction(Node 的 ESM 解析会 realpath,链接建在树里也仍被判为"应用根之外")。
|
|
979
|
+
- 回归:`pnpm test:child-node`(9 项)。
|
|
980
|
+
- **与端口冲突的区别**:端口冲突的签名是 `FATAL 监听失败({...}): listen EADDRINUSE`(发生在**加载成功之后**
|
|
981
|
+
绑端口阶段),而上面这个是加载阶段就死 —— 用随机端口(随机端口也会炸)即可区分。
|
|
965
982
|
- host 半部 `inject = ['connection', 'settings']`(**不含 `webServer`**)——desktop profile 关掉了 webserver/web-runtime,
|
|
966
983
|
本插件照常工作;`/api/*` 请求由 Electron `dsh-app://` 协议处理器 → IPC 帧管道 → `createSharedFetchHandler('/api')`。
|
|
967
984
|
- 右侧栏标签、guide 入口框、文件地址认领、设置卡片在 desktop 下与 web 相同(code-server 仍是本机 `http://127.0.0.1:<port>` 的 iframe;
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
| react | 18.3.1 | MIT |
|
|
13
13
|
| react-dom | 18.3.1 | MIT |
|
|
14
14
|
|
|
15
|
-
生成时间:2026-09-
|
|
15
|
+
生成时间:2026-09-18T15:59:04.573Z
|
|
16
16
|
渲染器:@deepseek-ai/dsh-client-ui-primitives@0.1.6-alpha.1(DSH 部署的界面版本:未知)
|
|
17
17
|
设计令牌:@deepseek-ai/dsh-client-ui-theme@0.1.6-alpha.1(11 段)
|
|
18
18
|
KaTeX:已打包(公式排版与 DSH 界面一致)
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* lib/child-node.mjs — 给「VS Code server 子进程」挑一个**真 Node**(0.3.53)。
|
|
3
|
+
*
|
|
4
|
+
* 为什么必须挑:DSH Desktop 的宿主进程是用 **Electron 的 Node 模式**跑的
|
|
5
|
+
* (`ELECTRON_RUN_AS_NODE=1`,`process.execPath` = Electron 二进制;见 harness 的
|
|
6
|
+
* `apps/desktop/src/node-environment.ts` 与 `host-process.ts`)。插件 spawn launcher 时若照旧用
|
|
7
|
+
* `process.execPath`,VS Code 的 server-main 会在启动时注册自己的 ESM 解析钩子,而那段钩子
|
|
8
|
+
* **只在 Electron / ELECTRON_RUN_AS_NODE 下生效**:
|
|
9
|
+
*
|
|
10
|
+
* if (!process.env.ELECTRON_RUN_AS_NODE && !process.versions.electron) return;
|
|
11
|
+
* ...
|
|
12
|
+
* const L = <默认解析结果>;
|
|
13
|
+
* if (!L.startsWith(<应用根>)) { // 树外 → 去 node_modules.asar 找,找不到就抛
|
|
14
|
+
* throw new Error(`Cannot find package '${name}' within the application resources`);
|
|
15
|
+
* }
|
|
16
|
+
*
|
|
17
|
+
* 本插件的原生包是**树外**的 pnpm 目录(`<profile>/node_modules/.pnpm/…`),于是启动路径上的
|
|
18
|
+
* `@vscode/spdlog` / `@vscode/deviceid` / `@vscode/windows-registry` 三个 ESM import 被拒,
|
|
19
|
+
* launcher 打 `FATAL 加载 VS Code server 失败` 后退出 ⇒ 面板显示「code-server 意外退出(exit 2)」。
|
|
20
|
+
* 2026-09-18 实测(同一棵树、同一份 launcher):
|
|
21
|
+
* · Electron(Node 模式)→ 必炸(首行 `Cannot find package '@vscode/spdlog' within the application resources`);
|
|
22
|
+
* · 桌面版自带的 `resources/runtime/primary-runtime/dependencies/node/bin/node.exe`(v24.21.0)→
|
|
23
|
+
* 一次启动成功(`Extension host agent started` + `dshcs-ready`),stderr 全空。
|
|
24
|
+
*
|
|
25
|
+
* 所以这里只做一件事:宿主是 Electron 时**找一个真 Node** 给子进程用,并从子进程环境里删掉
|
|
26
|
+
* `ELECTRON_RUN_AS_NODE`(留着它,真 Node 也会被判成 Electron,钩子照样生效)。普通 node 宿主
|
|
27
|
+
* (web / CLI)原样返回 `process.execPath`,行为一字不变。找不到真 Node 时退回 Electron(与旧行为一致)
|
|
28
|
+
* 并由调用方**明确告警**,不再让人对着 exit 2 猜。
|
|
29
|
+
*
|
|
30
|
+
* 试过但**不能用**的兜底(2026-09-18 实测,别再走一遍):
|
|
31
|
+
* · `VSCODE_DEV=1`:钩子确实被绕过(`s = process.env.VSCODE_DEV ? undefined : …`),但 VS Code 同时切到
|
|
32
|
+
* dev 引导路径,转头就报 `Cannot find module '<树>/lib/vscode/out/bootstrap-import.js'` —— 精简树里没这文件。
|
|
33
|
+
* · 往树内补 junction:Node 的 ESM 解析会 **realpath**(实测 `import.meta.resolve('@vscode/spdlog')` 返回的是
|
|
34
|
+
* pnpm store 路径),所以链接建在树里也仍旧"落在应用根之外",钩子照样拒。
|
|
35
|
+
*
|
|
36
|
+
* 纯路径/环境判断,不碰进程 → 可离线单测(scripts/test-child-node.mjs)。
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
import { existsSync } from 'node:fs';
|
|
40
|
+
import { posix, win32 } from 'node:path';
|
|
41
|
+
|
|
42
|
+
/** 宿主是不是 Electron(含 Node 模式的两个判据)。 */
|
|
43
|
+
export function isElectronHost(versions = process.versions, env = process.env) {
|
|
44
|
+
const flag = env.ELECTRON_RUN_AS_NODE;
|
|
45
|
+
const flagged = typeof flag === 'string' && flag !== '' && flag !== '0' && flag !== 'false';
|
|
46
|
+
return Boolean(versions !== null && versions !== undefined && versions.electron) || flagged;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** 真 Node 的文件名(平台惯例)。 */
|
|
50
|
+
export function nodeBinaryName(platform = process.platform) {
|
|
51
|
+
return platform === 'win32' ? 'node.exe' : 'node';
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* 真 Node 候选表(按优先级)。每条都带 `source` 便于日志/断言。
|
|
56
|
+
* @param options.execPath - 宿主可执行文件(通常是 Electron)。
|
|
57
|
+
* @param options.resourcesPath - Electron 的 `process.resourcesPath`(可能 undefined)。
|
|
58
|
+
* @param options.env - 环境变量(PATH / DSH_DESKTOP_NODE_EXECUTABLE)。
|
|
59
|
+
*/
|
|
60
|
+
export function childNodeCandidates(options = {}) {
|
|
61
|
+
const execPath = typeof options.execPath === 'string' ? options.execPath : process.execPath;
|
|
62
|
+
const env = options.env ?? process.env;
|
|
63
|
+
const platform = options.platform ?? process.platform;
|
|
64
|
+
const resourcesPath = typeof options.resourcesPath === 'string' ? options.resourcesPath : undefined;
|
|
65
|
+
const bin = nodeBinaryName(platform);
|
|
66
|
+
// 路径风格跟着 platform 走(而不是跟着"跑测试的这台机器"),Linux/macOS 形态才测得到
|
|
67
|
+
const paths = platform === 'win32' ? win32 : posix;
|
|
68
|
+
const join = paths.join;
|
|
69
|
+
const out = [];
|
|
70
|
+
const push = (source, path) => {
|
|
71
|
+
if (typeof path !== 'string' || path === '' || path === execPath) return;
|
|
72
|
+
if (out.some((entry) => entry.path === path)) return;
|
|
73
|
+
out.push({ source, path });
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
if (resourcesPath !== undefined) {
|
|
77
|
+
// ① 桌面版当前布局:主运行时自带的 Node(实测 v24.21.0,唯一被验证可用的那条)
|
|
78
|
+
push('app-primary-runtime-node', join(resourcesPath, 'runtime', 'primary-runtime', 'dependencies', 'node', 'bin', bin));
|
|
79
|
+
// ② 旧布局(0.1.5 及更早):应用自带一份 node
|
|
80
|
+
push('app-runtime-node', join(resourcesPath, 'runtime', 'node', bin));
|
|
81
|
+
// ③ 通用布局
|
|
82
|
+
push('app-resources-node', join(resourcesPath, 'node', bin));
|
|
83
|
+
}
|
|
84
|
+
// ④ resourcesPath 拿不到时,从可执行文件旁边推
|
|
85
|
+
push('exec-side-runtime-node', join(paths.dirname(execPath), 'resources', 'runtime', 'primary-runtime', 'dependencies', 'node', 'bin', bin));
|
|
86
|
+
push('exec-side-node', join(paths.dirname(execPath), 'resources', 'runtime', 'node', bin));
|
|
87
|
+
|
|
88
|
+
// ⑤ 上游可能直接给了 node 的路径 —— 只有当它**看起来就是 node 二进制**时才认
|
|
89
|
+
// (实测 `DSH_DESKTOP_NODE_EXECUTABLE` 指向的是 Electron 自身,不能用)
|
|
90
|
+
const hinted = env.DSH_DESKTOP_NODE_EXECUTABLE;
|
|
91
|
+
if (typeof hinted === 'string' && hinted !== '' && /^node(\.exe)?$/i.test(hinted.replace(/\\/g, '/').split('/').pop() ?? '')) {
|
|
92
|
+
push('env-dsh-desktop-node', hinted);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// ⑥ PATH 上的真 Node(跳过应用自己的 resources —— 那里的 `node`/`node.cmd` 是"再调 Electron"的 shim)
|
|
96
|
+
const pathValue = typeof env.PATH === 'string' ? env.PATH : (typeof env.Path === 'string' ? env.Path : '');
|
|
97
|
+
for (const dir of pathValue.split(paths.delimiter)) {
|
|
98
|
+
if (dir === '') continue;
|
|
99
|
+
if (resourcesPath !== undefined && dir.toLowerCase().startsWith(resourcesPath.toLowerCase())) continue;
|
|
100
|
+
push('path-node', join(dir, bin));
|
|
101
|
+
}
|
|
102
|
+
return out;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* 给子进程挑解释器。
|
|
107
|
+
* @returns {{command:string, electronHost:boolean, swapped:boolean, source:string}}
|
|
108
|
+
* · 非 Electron 宿主:`{ command: process.execPath, swapped: false, source: 'host-node' }`(行为不变);
|
|
109
|
+
* · Electron 宿主且找到真 Node:`swapped: true`(调用方须用 childNodeEnv 剥掉 ELECTRON_RUN_AS_NODE);
|
|
110
|
+
* · Electron 宿主但一个候选都不在:`source: 'electron-fallback'`(与旧行为一致,调用方应告警)。
|
|
111
|
+
*/
|
|
112
|
+
export function resolveChildNode(options = {}) {
|
|
113
|
+
const execPath = typeof options.execPath === 'string' ? options.execPath : process.execPath;
|
|
114
|
+
const versions = options.versions ?? process.versions;
|
|
115
|
+
const env = options.env ?? process.env;
|
|
116
|
+
const exists = typeof options.exists === 'function' ? options.exists : existsSync;
|
|
117
|
+
const electronHost = isElectronHost(versions, env);
|
|
118
|
+
if (!electronHost) return { command: execPath, electronHost: false, swapped: false, source: 'host-node' };
|
|
119
|
+
for (const candidate of childNodeCandidates({ execPath, resourcesPath: options.resourcesPath ?? process.resourcesPath, env, platform: options.platform })) {
|
|
120
|
+
try {
|
|
121
|
+
if (exists(candidate.path)) {
|
|
122
|
+
return { command: candidate.path, electronHost: true, swapped: true, source: candidate.source };
|
|
123
|
+
}
|
|
124
|
+
} catch { /* 下一个候选 */ }
|
|
125
|
+
}
|
|
126
|
+
return { command: execPath, electronHost: true, swapped: false, source: 'electron-fallback' };
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* 子进程环境:用真 Node 时**必须**删掉 `ELECTRON_RUN_AS_NODE`,否则 VS Code 的 asar 解析钩子照样生效
|
|
131
|
+
* (钩子的判据是"环境变量或 versions.electron 二者之一")。退回 Electron 时反而要留着它,否则
|
|
132
|
+
* Electron 会当 GUI 应用启动。
|
|
133
|
+
*/
|
|
134
|
+
export function childNodeEnv(resolved, env = process.env) {
|
|
135
|
+
const next = { ...env };
|
|
136
|
+
if (resolved !== null && resolved !== undefined && resolved.swapped === true) delete next.ELECTRON_RUN_AS_NODE;
|
|
137
|
+
return next;
|
|
138
|
+
}
|
package/lib/index.js
CHANGED
|
@@ -54,6 +54,7 @@ import { bridgeEndpointPath, startBridgeListener } from './bridge-ipc.mjs';
|
|
|
54
54
|
import { registerEditorPrompt, registerEditorTools, setPromptLiveProbe } from './bridge-tools.mjs';
|
|
55
55
|
import { deliverEditorPrompt } from './bridge-session.mjs';
|
|
56
56
|
import { dshEntry, dshRequire } from './dsh-resolve.mjs';
|
|
57
|
+
import { childNodeEnv, resolveChildNode } from './child-node.mjs';
|
|
57
58
|
import { registerBridgeObserver } from './bridge-observe.mjs';
|
|
58
59
|
import { createThreadRegistry } from './bridge-thread.mjs';
|
|
59
60
|
import { createApprovalBoard, createApprovalInterceptor, DEFAULT_HOLD_MS, PANEL_OUTCOMES } from './bridge-approval.mjs';
|
|
@@ -1675,13 +1676,30 @@ export async function apply(ctx, config) {
|
|
|
1675
1676
|
// 启动前再自愈一次依赖布局(插件重装/树被替换后可能丢失;幂等且只做存在性检查)
|
|
1676
1677
|
ensureRuntimeLayout();
|
|
1677
1678
|
const isCmd = launch.kind === 'bin' && win32() && /\.cmd$/i.test(launch.command);
|
|
1678
|
-
|
|
1679
|
+
// 解释器:显式 bin 用它的;其余(node 脚本 / 自带 launcher)默认 process.execPath —— 但**宿主是
|
|
1680
|
+
// Electron(Node 模式)时必须换成真 Node**(0.3.53):VS Code 的 server-main 会注册一段只在
|
|
1681
|
+
// Electron/ELECTRON_RUN_AS_NODE 下生效的 asar 解析钩子,它拒绝一切落在"应用根"之外的包,而
|
|
1682
|
+
// 本插件的原生包都在树外的 pnpm 目录里 ⇒ 桌面版必然 `Cannot find package '@vscode/spdlog' …`
|
|
1683
|
+
// ⇒ 面板显示「code-server 意外退出(exit 2)」。详见 lib/child-node.mjs。
|
|
1684
|
+
const childNode = launch.kind === 'bin' ? null : resolveChildNode();
|
|
1685
|
+
const command = launch.kind === 'bin' ? launch.command : childNode.command;
|
|
1679
1686
|
const spawnArgs = launch.kind === 'bin' ? args : [launch.script, ...args];
|
|
1687
|
+
if (childNode !== null && childNode.electronHost) {
|
|
1688
|
+
if (childNode.swapped) {
|
|
1689
|
+
console.log(`[code-server] 宿主是 Electron(Node 模式):改用真 Node 跑 IDE 子进程`
|
|
1690
|
+
+ `(${childNode.source}: ${childNode.command});已从子进程环境剥离 ELECTRON_RUN_AS_NODE`);
|
|
1691
|
+
} else {
|
|
1692
|
+
console.warn('[code-server] 宿主是 Electron(Node 模式),但没找到可用的真 Node —— VS Code 的 asar 解析钩子'
|
|
1693
|
+
+ '会拒绝树外的原生包(@vscode/spdlog / @vscode/deviceid / @vscode/windows-registry 等),'
|
|
1694
|
+
+ 'IDE 很可能以 exit 2 退出。修法:让应用自带的 resources/runtime/primary-runtime/dependencies/node/bin/'
|
|
1695
|
+
+ '或 PATH 上有一个真的 node。');
|
|
1696
|
+
}
|
|
1697
|
+
}
|
|
1680
1698
|
// shell 仅对 .cmd shim(Windows npm 全局包)必要:它必须经 cmd.exe 解析。
|
|
1681
1699
|
// 含空格路径由 spawn 数组传参,不再经 shell 拼接,避免 'C:\Program' 拆分。
|
|
1682
1700
|
proc = spawn(isCmd ? `"${command}"` : command, spawnArgs, {
|
|
1683
1701
|
cwd: cwd ?? process.cwd(),
|
|
1684
|
-
env,
|
|
1702
|
+
env: childNode === null ? env : childNodeEnv(childNode, env),
|
|
1685
1703
|
shell: isCmd,
|
|
1686
1704
|
windowsHide: true,
|
|
1687
1705
|
detached: !win32() && !isCmd,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-code-server-app",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.54",
|
|
4
4
|
"description": "VS Code (from a code-server release) inside DSH: a right-sidebar tab driven by the plugin's own launcher over the in-process VS Code server (lib/launcher.mjs). Since 0.3.0 the bundle also ships an editor bridge (assets/extensions/dshcs-editor-bridge): a read-only channel between the in-tree VS Code extension host and DSH, giving the agent what only the editor knows (unsaved buffers, language-server diagnostics, the active selection) and letting editor gestures drive the session. Since 0.3.22 the ask panel renders that session's new content with DSH's own Markdown renderer (pinned to the deployed DSH UI version); since 0.3.23 it is a full-width dialog with collapsible thinking rows and can answer approval requests in place — the bridge's only non-read-only route (POST /approve, constrained to pending in-process requests and the outcomes allowed-once/rejected; panel-first for 5 minutes, handed back to the official card the moment the panel closes). The tab claims DSH file addresses (dsh-resource://file/**) by file type (setting claimExtensions), so the product's own produced-file chips, delivered-file previews and inline prose mentions open in the workbench. The IDE is a resident surface moved with Element.moveBefore instead of being remounted, so switching sidebar tabs no longer reloads it. Opening the tab switches the right sidebar to fullscreen by default (setting fullscreenOnOpen). Following a workspace switch is lightweight: the workbench re-navigates with the new ?folder= and the IDE process is not restarted (since 0.2.12). Requires a DSH with the right-sidebar services (sidebarRightTabs/sidebarRight, >= 0.1.5-alpha.1); older DSH versions get a single upgrade notice on the settings page and no other UI. Two serving modes: loopback port (default) or same-origin mount on DSH's own webServer (/code-server, protected by ctx.connection.requestRejection). No code-server Node layer, no argon2, no C++ toolchain.",
|
|
5
5
|
"homepage": "https://github.com/jinsiyu/dsh-code-server-app",
|
|
6
6
|
"repository": {
|
|
@@ -46,6 +46,7 @@
|
|
|
46
46
|
"lib/bridge-thread.mjs",
|
|
47
47
|
"lib/bridge-approval.mjs",
|
|
48
48
|
"lib/dsh-resolve.mjs",
|
|
49
|
+
"lib/child-node.mjs",
|
|
49
50
|
"lib/launcher.mjs",
|
|
50
51
|
"lib/serve-dsh.mjs",
|
|
51
52
|
"lib/vendor.js",
|
|
@@ -192,6 +193,8 @@
|
|
|
192
193
|
"test:client-cwd": "node scripts/test-client-bundle-cwd.mjs",
|
|
193
194
|
"test:client-seat": "node scripts/test-client-settings-seat.mjs",
|
|
194
195
|
"test:dsh-resolve": "node scripts/test-dsh-resolve.mjs",
|
|
196
|
+
"test:child-node": "node scripts/test-child-node.mjs",
|
|
197
|
+
"test:package-files": "node scripts/test-package-files.mjs",
|
|
195
198
|
"test:bridge-routes": "node scripts/test-bridge-routes.mjs",
|
|
196
199
|
"test:bridge-extension": "node scripts/test-bridge-extension.mjs",
|
|
197
200
|
"test:webview": "node scripts/test-webview-bundle.mjs",
|
package/vendor/VENDOR.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"vscodeVersion": "1.137.0",
|
|
4
4
|
"productPath": "stable-b11dabdaca0d3369986975be285db92c8795cea5",
|
|
5
5
|
"layout": "vscode-only",
|
|
6
|
-
"preparedAt": "2026-09-
|
|
6
|
+
"preparedAt": "2026-09-18T15:59:04.210Z",
|
|
7
7
|
"source": "registry",
|
|
8
8
|
"node": "v24.20.0",
|
|
9
9
|
"platform": "linux",
|