@neuralnomads/codenomad-dev 0.20.0-dev-20260923-baf674fc → 0.20.0-dev-20260924-70aae0b1
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/dist/api-types.js.map +1 -1
- package/dist/opencode-update/npm-runtime.js +22 -0
- package/dist/opencode-update/npm-runtime.js.map +1 -0
- package/dist/opencode-update/retired-installation.js +41 -0
- package/dist/opencode-update/retired-installation.js.map +1 -0
- package/dist/opencode-update/retired-installation.test.js +39 -0
- package/dist/opencode-update/retired-installation.test.js.map +1 -0
- package/dist/opencode-update/service.js +4 -3
- package/dist/opencode-update/service.js.map +1 -1
- package/dist/opencode-update/service.test.js +2 -2
- package/dist/opencode-update/service.test.js.map +1 -1
- package/dist/opencode-update/shared-installation.js +8 -5
- package/dist/opencode-update/shared-installation.js.map +1 -1
- package/dist/opencode-update/shared-installation.test.js +4 -2
- package/dist/opencode-update/shared-installation.test.js.map +1 -1
- package/dist/settings/binaries.js +3 -2
- package/dist/settings/binaries.js.map +1 -1
- package/dist/workspaces/spawn.js +7 -2
- package/dist/workspaces/spawn.js.map +1 -1
- package/package.json +1 -1
- package/public/assets/{App-DHe1TgnC.js → App-DXfroBn-.js} +7 -7
- package/public/assets/{App-DHe1TgnC.js.map → App-DXfroBn-.js.map} +1 -1
- package/public/assets/{FilesTab-D8Ik74MT.js → FilesTab-JN0c2Op2.js} +2 -2
- package/public/assets/{FilesTab-D8Ik74MT.js.map → FilesTab-JN0c2Op2.js.map} +1 -1
- package/public/assets/{GitChangesTab-CYn01GSK.js → GitChangesTab-8MxRVYHz.js} +2 -2
- package/public/assets/{GitChangesTab-CYn01GSK.js.map → GitChangesTab-8MxRVYHz.js.map} +1 -1
- package/public/assets/{SplitFilePanel-DxTSWUXW.js → SplitFilePanel-VXkE7jgT.js} +2 -2
- package/public/assets/{SplitFilePanel-DxTSWUXW.js.map → SplitFilePanel-VXkE7jgT.js.map} +1 -1
- package/public/assets/{StatusTab-CLJHjaqS.js → StatusTab-DljyzM07.js} +2 -2
- package/public/assets/{StatusTab-CLJHjaqS.js.map → StatusTab-DljyzM07.js.map} +1 -1
- package/public/assets/{align-justify-DYu1Iipu.js → align-justify-BMi4r2XK.js} +2 -2
- package/public/assets/{align-justify-DYu1Iipu.js.map → align-justify-BMi4r2XK.js.map} +1 -1
- package/public/assets/{bundle-full-DbjjKxlx.js → bundle-full-LgLNZmib.js} +2 -2
- package/public/assets/{bundle-full-DbjjKxlx.js.map → bundle-full-LgLNZmib.js.map} +1 -1
- package/public/assets/{client-state-LGeRE6k3.js → client-state-DTQzqBPJ.js} +2 -2
- package/public/assets/{client-state-LGeRE6k3.js.map → client-state-DTQzqBPJ.js.map} +1 -1
- package/public/assets/{diff-viewer-D_koHVvF.js → diff-viewer-Dxjea-rB.js} +2 -2
- package/public/assets/{diff-viewer-D_koHVvF.js.map → diff-viewer-Dxjea-rB.js.map} +1 -1
- package/public/assets/index-9bba6B1A.js +2 -0
- package/public/assets/index-9bba6B1A.js.map +1 -0
- package/public/assets/index-C5i7ut9u.js +2 -0
- package/public/assets/index-C5i7ut9u.js.map +1 -0
- package/public/assets/index-CLtLzsWy.js +2 -0
- package/public/assets/index-CLtLzsWy.js.map +1 -0
- package/public/assets/index-CTVIWXHZ.js +2 -0
- package/public/assets/index-CTVIWXHZ.js.map +1 -0
- package/public/assets/{index-CXyTJ12Z.js → index-Cgp1TEtC.js} +2 -2
- package/public/assets/{index-CXyTJ12Z.js.map → index-Cgp1TEtC.js.map} +1 -1
- package/public/assets/index-Cqd_P8c4.js +2 -0
- package/public/assets/index-Cqd_P8c4.js.map +1 -0
- package/public/assets/{index-CHztP7Qx.js → index-DTGOXoDH.js} +2 -2
- package/public/assets/{index-CHztP7Qx.js.map → index-DTGOXoDH.js.map} +1 -1
- package/public/assets/index-D_H_gYdX.js +2 -0
- package/public/assets/index-D_H_gYdX.js.map +1 -0
- package/public/assets/index-Dsd7n295.js +2 -0
- package/public/assets/index-Dsd7n295.js.map +1 -0
- package/public/assets/index-DwKq8v48.js +3 -0
- package/public/assets/index-DwKq8v48.js.map +1 -0
- package/public/assets/index-TnTncRlr.js +2 -0
- package/public/assets/index-TnTncRlr.js.map +1 -0
- package/public/assets/index-eb2qu-xk.js +2 -0
- package/public/assets/index-eb2qu-xk.js.map +1 -0
- package/public/assets/{loading-1PhCNPTJ.js → loading-j5J_ghLL.js} +2 -2
- package/public/assets/{loading-1PhCNPTJ.js.map → loading-j5J_ghLL.js.map} +1 -1
- package/public/assets/{main-UjL26F9i.js → main-Cv7E0c7r.js} +7 -7
- package/public/assets/{main-UjL26F9i.js.map → main-Cv7E0c7r.js.map} +1 -1
- package/public/assets/{markdown-BFEzPV6Z.js → markdown-Cg65SCwC.js} +4 -4
- package/public/assets/{markdown-BFEzPV6Z.js.map → markdown-Cg65SCwC.js.map} +1 -1
- package/public/assets/{startup-state-settings-card-X1QA2uNM.js → startup-state-settings-card-DMFtdRoa.js} +2 -2
- package/public/assets/{startup-state-settings-card-X1QA2uNM.js.map → startup-state-settings-card-DMFtdRoa.js.map} +1 -1
- package/public/assets/{terminal-square-BkG0S2-Z.js → terminal-square-DCn_Ac2k.js} +2 -2
- package/public/assets/{terminal-square-BkG0S2-Z.js.map → terminal-square-DCn_Ac2k.js.map} +1 -1
- package/public/assets/{todo-DKme4PqO.js → todo-DyaFCX9E.js} +2 -2
- package/public/assets/{todo-DKme4PqO.js.map → todo-DyaFCX9E.js.map} +1 -1
- package/public/assets/{tool-call-DZIN0BAW.js → tool-call-DlJUX9AW.js} +4 -4
- package/public/assets/{tool-call-DZIN0BAW.js.map → tool-call-DlJUX9AW.js.map} +1 -1
- package/public/assets/{unified-picker-Ml-4x3ux.js → unified-picker-CrW1bp1Y.js} +2 -2
- package/public/assets/{unified-picker-Ml-4x3ux.js.map → unified-picker-CrW1bp1Y.js.map} +1 -1
- package/public/assets/{wrap-text-B_W6fnE7.js → wrap-text-DLR5jp4s.js} +2 -2
- package/public/assets/{wrap-text-B_W6fnE7.js.map → wrap-text-DLR5jp4s.js.map} +1 -1
- package/public/index.html +2 -2
- package/public/loading.html +2 -2
- package/public/sw.js +1 -1
- package/public/sw.js.map +1 -1
- package/dist/opencode-update/managed-installation.js +0 -102
- package/dist/opencode-update/managed-installation.js.map +0 -1
- package/dist/opencode-update/managed-installation.test.js +0 -102
- package/dist/opencode-update/managed-installation.test.js.map +0 -1
- package/public/assets/index-Bme8jj6C.js +0 -2
- package/public/assets/index-Bme8jj6C.js.map +0 -1
- package/public/assets/index-BxPI94Ww.js +0 -2
- package/public/assets/index-BxPI94Ww.js.map +0 -1
- package/public/assets/index-Cm6Bv3OW.js +0 -2
- package/public/assets/index-Cm6Bv3OW.js.map +0 -1
- package/public/assets/index-Cn9xpv8K.js +0 -2
- package/public/assets/index-Cn9xpv8K.js.map +0 -1
- package/public/assets/index-CooBjdE-.js +0 -2
- package/public/assets/index-CooBjdE-.js.map +0 -1
- package/public/assets/index-CvWB7Vfc.js +0 -2
- package/public/assets/index-CvWB7Vfc.js.map +0 -1
- package/public/assets/index-DFCjhysu.js +0 -3
- package/public/assets/index-DFCjhysu.js.map +0 -1
- package/public/assets/index-DR8ddwAP.js +0 -2
- package/public/assets/index-DR8ddwAP.js.map +0 -1
- package/public/assets/index-THD8itHb.js +0 -2
- package/public/assets/index-THD8itHb.js.map +0 -1
- package/public/assets/index-_bmTx26k.js +0 -2
- package/public/assets/index-_bmTx26k.js.map +0 -1
package/dist/workspaces/spawn.js
CHANGED
|
@@ -3,6 +3,7 @@ import { readFileSync, statSync } from "fs";
|
|
|
3
3
|
import path from "path";
|
|
4
4
|
import { OPENCODE_V2_REQUIRED_ERROR_CODE } from "../api-types";
|
|
5
5
|
import { isOpenCodeServiceCommandUnavailable, isOpenCodeServiceHelp } from "./opencode-cli-compatibility";
|
|
6
|
+
import { assertCurrentInstallation } from "../opencode-update/retired-installation";
|
|
6
7
|
export const WINDOWS_CMD_EXTENSIONS = new Set([".cmd", ".bat"]);
|
|
7
8
|
export const WINDOWS_POWERSHELL_EXTENSIONS = new Set([".ps1"]);
|
|
8
9
|
const WSL_UNC_PATH_REGEX = /^\\\\wsl(?:\.localhost|\$)\\([^\\/]+)(?:[\\/](.*))?$/i;
|
|
@@ -30,12 +31,14 @@ export function resolveWslWorkingDirectory(folder, distro) {
|
|
|
30
31
|
return windowsFolder ? { kind: "windows", path: windowsFolder } : null;
|
|
31
32
|
}
|
|
32
33
|
export function buildWindowsSpawnSpec(binaryPath, args, options = {}) {
|
|
34
|
+
assertCurrentInstallation(binaryPath);
|
|
33
35
|
const wslPath = parseWslUncPath(binaryPath);
|
|
34
36
|
if (wslPath) {
|
|
35
37
|
return buildWslSpawnSpec(wslPath, args, options);
|
|
36
38
|
}
|
|
37
39
|
const resolvedCommand = resolveBareWindowsCommand(binaryPath, options) ?? binaryPath;
|
|
38
40
|
const resolvedBinaryPath = resolveWindowsNpmExecutable(resolvedCommand) ?? resolvedCommand;
|
|
41
|
+
assertCurrentInstallation(resolvedBinaryPath);
|
|
39
42
|
const extension = path.win32.extname(resolvedBinaryPath).toLowerCase();
|
|
40
43
|
if (WINDOWS_CMD_EXTENSIONS.has(extension)) {
|
|
41
44
|
const comspec = getWindowsEnvironmentValue(options.env, "COMSPEC") ??
|
|
@@ -71,6 +74,7 @@ export function buildWindowsSpawnSpec(binaryPath, args, options = {}) {
|
|
|
71
74
|
};
|
|
72
75
|
}
|
|
73
76
|
export function buildSpawnSpec(binaryPath, args, options = {}) {
|
|
77
|
+
assertCurrentInstallation(binaryPath, options.env);
|
|
74
78
|
if ((options.platform ?? process.platform) !== "win32") {
|
|
75
79
|
return {
|
|
76
80
|
command: binaryPath,
|
|
@@ -108,6 +112,7 @@ function translateWslPath(args, distro, timeoutMs) {
|
|
|
108
112
|
});
|
|
109
113
|
}
|
|
110
114
|
export function buildServiceLaunchSpec(binaryPath, options = {}) {
|
|
115
|
+
assertCurrentInstallation(binaryPath);
|
|
111
116
|
const platform = options.platform ?? process.platform;
|
|
112
117
|
const wslPath = platform === "win32" ? parseWslUncPath(binaryPath) : null;
|
|
113
118
|
if (wslPath)
|
|
@@ -124,7 +129,7 @@ export function probeBinaryVersion(binaryPath, execute = executeBinaryProbe) {
|
|
|
124
129
|
return parseBinaryVersion(result);
|
|
125
130
|
}
|
|
126
131
|
catch (error) {
|
|
127
|
-
return { valid: false, error: error instanceof Error ? error.message : String(error) };
|
|
132
|
+
return { valid: false, error: error instanceof Error ? error.message : String(error), ...(error.code === "ENOENT" ? { missing: true } : {}) };
|
|
128
133
|
}
|
|
129
134
|
}
|
|
130
135
|
function parseBinaryVersion(result) {
|
|
@@ -161,7 +166,7 @@ export async function probeBinaryVersionAsync(binaryPath) {
|
|
|
161
166
|
return parseBinaryVersion(await executeAsyncBinaryProbe(buildSpawnSpec(binaryPath, ["--version"]), 5_000));
|
|
162
167
|
}
|
|
163
168
|
catch (error) {
|
|
164
|
-
return { valid: false, error: error instanceof Error ? error.message : String(error) };
|
|
169
|
+
return { valid: false, error: error instanceof Error ? error.message : String(error), ...(error.code === "ENOENT" ? { missing: true } : {}) };
|
|
165
170
|
}
|
|
166
171
|
}
|
|
167
172
|
export async function probeOpenCodeBinary(binaryPath, execute = executeAsyncBinaryProbe) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../src/workspaces/spawn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAA;AAC3C,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,OAAO,EAAE,+BAA+B,EAA+B,MAAM,cAAc,CAAA;AAC3F,OAAO,EAAE,mCAAmC,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AAEzG,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;AAC/D,MAAM,CAAC,MAAM,6BAA6B,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;AAE9D,MAAM,kBAAkB,GAAG,uDAAuD,CAAA;AAClF,MAAM,uBAAuB,GAAG,qBAAqB,CAAA;AAyCrD,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IACpD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAA;IAClD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IAC7B,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IAChC,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAE/E,OAAO;QACL,MAAM;QACN,SAAS,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG;KAChE,CAAA;AACH,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,MAAc,EAAE,MAAc;IACvE,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,CAAA;IACzC,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,SAAS,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;IACtH,CAAC;IAED,MAAM,aAAa,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAA;IAClD,OAAO,aAAa,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;AACxE,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,UAAkB,EAAE,IAAc,EAAE,UAAiC,EAAE;IAC3G,MAAM,OAAO,GAAG,eAAe,CAAC,UAAU,CAAC,CAAA;IAC3C,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;IAClD,CAAC;IAED,MAAM,eAAe,GAAG,yBAAyB,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,UAAU,CAAA;IACpF,MAAM,kBAAkB,GAAG,2BAA2B,CAAC,eAAe,CAAC,IAAI,eAAe,CAAA;IAC1F,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,WAAW,EAAE,CAAA;IAEtE,IAAI,sBAAsB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,0BAA0B,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC;YAChE,0BAA0B,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC;YAClD,SAAS,CAAA;QACX,wDAAwD;QACxD,+EAA+E;QAC/E,MAAM,WAAW,GAAG,KAAK,kBAAkB,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAA;QAEjE,OAAO;YACL,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC;YACrC,OAAO,EAAE,EAAE,wBAAwB,EAAE,IAAI,EAAE;YAC3C,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,GAAG,EAAE,OAAO,CAAC,GAAG;SACjB,CAAA;IACH,CAAC;IAED,IAAI,6BAA6B,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QACjD,qDAAqD;QACrD,OAAO;YACL,OAAO,EAAE,gBAAgB;YACzB,IAAI,EAAE,CAAC,YAAY,EAAE,kBAAkB,EAAE,QAAQ,EAAE,OAAO,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAAC;YACxF,OAAO,EAAE,EAAE;YACX,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,GAAG,EAAE,OAAO,CAAC,GAAG;SACjB,CAAA;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE,kBAAkB;QAC3B,IAAI;QACJ,OAAO,EAAE,EAAE;QACX,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,UAAkB,EAAE,IAAc,EAAE,UAAiC,EAAE;IACpG,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,OAAO,EAAE,CAAC;QACvD,OAAO;YACL,OAAO,EAAE,UAAU;YACnB,IAAI;YACJ,OAAO,EAAE,EAAE;YACX,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,GAAG,EAAE,OAAO,CAAC,GAAG;SACjB,CAAA;IACH,CAAC;IAED,OAAO,qBAAqB,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;AACzD,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,MAAc,EACd,MAAc,EACd,uBACE,CAAC,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,KAAK,EAAE,aAAa,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,EACzG,SAAS,GAAG,KAAK;IAEjB,MAAM,SAAS,GAAG,0BAA0B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5D,IAAI,CAAC,SAAS;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5C,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;IACtE,OAAO,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;SACzF,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,CAAA;AACrD,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,MAAc,EACd,MAAc,EACd,qBACE,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,EACrG,SAAS,GAAG,KAAK;IAEjB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAChE,OAAO,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;SAC/E,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,CAAA;AACrD,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAc,EAAE,MAAc,EAAE,SAAiB;IACzE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,QAAQ,CAAC,SAAS,EAAE,CAAC,gBAAgB,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,EAAE;YAC5E,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,IAAI;YACjB,OAAO,EAAE,SAAS;YAClB,SAAS,EAAE,EAAE,GAAG,IAAI;SACrB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IACnE,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,UAAkB,EAClB,UAAiC,EAAE;IAEnC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAA;IACrD,MAAM,OAAO,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACzE,IAAI,OAAO;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,CAAA;IACtF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAA;AACvD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,UAAkB,EAClB,UAA+B,kBAAkB;IAQjD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAA;IACvD,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,cAAc,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC,CAAC,CAAA;QACtD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;QAC5B,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAA;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAA;IACxF,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,MAA4B;IACtD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAE,MAAM,CAAC,KAA+B,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;IAC/I,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAA;QACpC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAA;QACpC,MAAM,QAAQ,GAAG,MAAM,IAAI,MAAM,CAAA;QACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,oBAAoB,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC,CAAC,CAAC,oBAAoB,MAAM,CAAC,MAAM,EAAE,CAAA;QAC/G,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;IAChC,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;SAC5C,KAAK,CAAC,OAAO,CAAC;SACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACpC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;SAC5C,KAAK,CAAC,OAAO,CAAC;SACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAEpC,wEAAwE;IACxE,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAA;IACjD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;IACxB,CAAC;IAED,gFAAgF;IAChF,+EAA+E;IAC/E,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAA;IACvF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAA;AAC3C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,UAAkB;IAC9D,IAAI,CAAC;QAAC,OAAO,kBAAkB,CAAC,MAAM,uBAAuB,CAAC,cAAc,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAA;IAAC,CAAC;IAClH,OAAO,KAAK,EAAE,CAAC;QAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAA;IAAC,CAAC;AAC1G,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,UAAkB,EAClB,UAAoC,uBAAuB;IAE3D,IAAI,CAAC,UAAU;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAA;IACtE,IAAI,CAAC;QACH,0EAA0E;QAC1E,4EAA4E;QAC5E,MAAM,OAAO,GAAG,kBAAkB,CAAC,MAAM,OAAO,CAAC,cAAc,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAA;QACnG,IAAI,CAAC,OAAO,CAAC,KAAK;YAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;QAC/F,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QACzE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,UAAU,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;QACtF,IAAI,MAAM,CAAC,KAAK;YAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,aAAa,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAA;QACxF,IAAI,mCAAmC,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACtE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,aAAa,EAAE,SAAS,EAAE,+BAA+B,EAAE,CAAA;QACvF,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,qBAAqB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;gBACxD,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,aAAa,EAAE;gBACnC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,aAAa,EAAE,CAAA;QACxC,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;QACvF,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QAC1D,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,aAAa,EAAE,KAAK,EAAE,2CAA2C,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,EAAE,CAAA;IACvH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAA;IACxF,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAe,EAAE,SAAiB;IACjE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;YAChC,QAAQ,EAAE,MAAM;YAChB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,OAAO,EAAE,SAAS;YAClB,SAAS,EAAE,EAAE,GAAG,IAAI;YACpB,WAAW,EAAE,IAAI;YACjB,KAAK,EAAE,KAAK;YACZ,wBAAwB,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC;SACzE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC;YACpC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACxE,GAAG,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,MAAM;YACN,MAAM;SACP,CAAC,CAAC,CAAA;IACL,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAe,EAAE,SAAkB;IAC7D,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;QAChD,QAAQ,EAAE,MAAM;QAChB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,OAAO,EAAE,SAAS;QAClB,wBAAwB,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC;KACzE,CAAC,CAAA;IACF,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7D,CAAA;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAgB,EAAE,IAAc,EAAE,OAA8B;IACzF,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,0BAA0B,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAC1G,IAAI,OAAO,CAAC,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CACb,kEAAkE,OAAO,CAAC,MAAM,MAAM,OAAO,CAAC,GAAG,EAAE,CACpG,CAAA;IACH,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,gBAAgB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IAClD,MAAM,mBAAmB,GAAG,gBAAgB,EAAE,IAAI,KAAK,SAAS,CAAA;IAEhE,IAAI,CAAC,mBAAmB,IAAI,gBAAgB,EAAE,IAAI,KAAK,OAAO,EAAE,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAA;IAC7C,CAAC;IAED,IAAI,mBAAmB,EAAE,CAAC;QACxB,MAAM,YAAY,GAAG,oBAAoB,CAAC,gBAAgB,CAAC,CAAA;QAC3D,OAAO,CAAC,IAAI,CACV,QAAQ,EACR,IAAI,EACJ,KAAK,EACL,YAAY,EACZ,sBAAsB,CACvB,CAAA;QACD,IAAI,gBAAgB,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAA;QACrC,CAAC;QACD,OAAO,CAAC,IAAI,CACV,OAAO,CAAC,SAAS,EACjB,GAAG,IAAI,CACR,CAAA;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAA;IACpD,CAAC;IAED,OAAO;QACL,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,EAAE;QACX,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAA;AACH,CAAC;AAED,SAAS,yBAAyB,CAAC,UAAkB,EAAE,OAA8B;IACnF,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAA;IAEjF,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAA;IACtC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAA;IACxC,MAAM,WAAW,GAAG,CAAC,0BAA0B,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;SAChE,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,uBAAuB,CAAC,CAAA;IAC/B,MAAM,UAAU,GAAG,CAAC,0BAA0B,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,uBAAuB,CAAC;SACvF,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;SACpC,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAA;IAE9F,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC;QAC1C,MAAM,SAAS,GAAG,KAAK;YACrB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC;YAChC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC3B,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,UAAU,GAAG,SAAS,EAAE,CAAC,CAAA;YACzE,IAAI,CAAC;gBACH,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE;oBAAE,OAAO,SAAS,CAAA;YACpD,CAAC;YAAC,MAAM,CAAC;gBACP,0CAA0C;YAC5C,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,0BAA0B,CAAC,GAAkC,EAAE,GAAW;IACjF,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAA;IAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,CAAA;IAC7F,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AACvC,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAa;IAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;IAC5B,OAAO,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QAC5E,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtB,CAAC,CAAC,OAAO,CAAA;AACb,CAAC;AAED,SAAS,oBAAoB,CAAC,gBAAiD;IAC7E,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,IAAI,gBAAgB,EAAE,IAAI,KAAK,OAAO,EAAE,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACrB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACrB,CAAC;SAAM,IAAI,gBAAgB,EAAE,IAAI,KAAK,SAAS,EAAE,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAA;QACtC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACrB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IACvB,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AAC3B,CAAC;AAED,SAAS,2BAA2B,CAAC,OAAe;IAClD,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QAAE,OAAO,IAAI,CAAA;IACvF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAC5C,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI;YAAE,OAAO,IAAI,CAAA;QAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAA;QAClF,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAA;QAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;QAC5E,OAAO,QAAQ,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAA;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa;IACzC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAA;IAC1E,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACnE,OAAO,UAAU,CAAA;IACnB,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC","sourcesContent":["import { execFile, spawnSync } from \"child_process\"\nimport { readFileSync, statSync } from \"fs\"\nimport path from \"path\"\n\nimport { OPENCODE_V2_REQUIRED_ERROR_CODE, type BinaryValidationResult } from \"../api-types\"\nimport { isOpenCodeServiceCommandUnavailable, isOpenCodeServiceHelp } from \"./opencode-cli-compatibility\"\n\nexport const WINDOWS_CMD_EXTENSIONS = new Set([\".cmd\", \".bat\"])\nexport const WINDOWS_POWERSHELL_EXTENSIONS = new Set([\".ps1\"])\n\nconst WSL_UNC_PATH_REGEX = /^\\\\\\\\wsl(?:\\.localhost|\\$)\\\\([^\\\\/]+)(?:[\\\\/](.*))?$/i\nconst DEFAULT_WINDOWS_PATHEXT = \".COM;.EXE;.BAT;.CMD\"\n\nexport interface SpawnSpec {\n command: string\n args: string[]\n options: {\n windowsVerbatimArguments?: boolean\n }\n cwd?: string\n env?: NodeJS.ProcessEnv\n}\n\nexport type ServiceLaunchSpec =\n | { kind: \"host\"; binary: string; platform: NodeJS.Platform }\n | { kind: \"wsl\"; distro: string; binary: string }\n\ninterface BuildSpawnSpecOptions {\n cwd?: string\n env?: NodeJS.ProcessEnv\n platform?: NodeJS.Platform\n}\n\ninterface WslPath {\n distro: string\n linuxPath: string\n}\n\nexport type WslWorkingDirectory =\n | { kind: \"linux\"; path: string }\n | { kind: \"windows\"; path: string }\n\ninterface BinaryProbeExecution {\n error?: Error\n status: number | null\n stdout?: string | null\n stderr?: string | null\n}\n\ntype BinaryProbeExecutor = (spec: SpawnSpec, timeoutMs?: number) => BinaryProbeExecution\ntype AsyncBinaryProbeExecutor = (spec: SpawnSpec, timeoutMs: number) => BinaryProbeExecution | Promise<BinaryProbeExecution>\n\nexport function parseWslUncPath(input: string): WslPath | null {\n const normalized = input.trim().replace(/\\//g, \"\\\\\")\n const match = normalized.match(WSL_UNC_PATH_REGEX)\n if (!match) {\n return null\n }\n\n const distro = match[1] ?? \"\"\n const remainder = match[2] ?? \"\"\n const segments = remainder.split(/\\\\+/).filter((segment) => segment.length > 0)\n\n return {\n distro,\n linuxPath: segments.length > 0 ? `/${segments.join(\"/\")}` : \"/\",\n }\n}\n\nexport function resolveWslWorkingDirectory(folder: string, distro: string): WslWorkingDirectory | null {\n const wslFolder = parseWslUncPath(folder)\n if (wslFolder) {\n return wslFolder.distro.toLowerCase() === distro.toLowerCase() ? { kind: \"linux\", path: wslFolder.linuxPath } : null\n }\n\n const windowsFolder = normalizeWindowsPath(folder)\n return windowsFolder ? { kind: \"windows\", path: windowsFolder } : null\n}\n\nexport function buildWindowsSpawnSpec(binaryPath: string, args: string[], options: BuildSpawnSpecOptions = {}): SpawnSpec {\n const wslPath = parseWslUncPath(binaryPath)\n if (wslPath) {\n return buildWslSpawnSpec(wslPath, args, options)\n }\n\n const resolvedCommand = resolveBareWindowsCommand(binaryPath, options) ?? binaryPath\n const resolvedBinaryPath = resolveWindowsNpmExecutable(resolvedCommand) ?? resolvedCommand\n const extension = path.win32.extname(resolvedBinaryPath).toLowerCase()\n\n if (WINDOWS_CMD_EXTENSIONS.has(extension)) {\n const comspec = getWindowsEnvironmentValue(options.env, \"COMSPEC\") ??\n getWindowsEnvironmentValue(process.env, \"COMSPEC\") ??\n \"cmd.exe\"\n // cmd.exe requires the full command as a single string.\n // Using the \"\"<script> <args>\"\" pattern ensures paths with spaces are handled.\n const commandLine = `\"\"${resolvedBinaryPath}\" ${args.join(\" \")}\"`\n\n return {\n command: comspec,\n args: [\"/d\", \"/s\", \"/c\", commandLine],\n options: { windowsVerbatimArguments: true },\n cwd: options.cwd,\n env: options.env,\n }\n }\n\n if (WINDOWS_POWERSHELL_EXTENSIONS.has(extension)) {\n // powershell.exe ships with Windows. (pwsh may not.)\n return {\n command: \"powershell.exe\",\n args: [\"-NoProfile\", \"-ExecutionPolicy\", \"Bypass\", \"-File\", resolvedBinaryPath, ...args],\n options: {},\n cwd: options.cwd,\n env: options.env,\n }\n }\n\n return {\n command: resolvedBinaryPath,\n args,\n options: {},\n cwd: options.cwd,\n env: options.env,\n }\n}\n\nexport function buildSpawnSpec(binaryPath: string, args: string[], options: BuildSpawnSpecOptions = {}): SpawnSpec {\n if ((options.platform ?? process.platform) !== \"win32\") {\n return {\n command: binaryPath,\n args,\n options: {},\n cwd: options.cwd,\n env: options.env,\n }\n }\n\n return buildWindowsSpawnSpec(binaryPath, args, options)\n}\n\nexport function resolveWslServiceDirectory(\n folder: string,\n distro: string,\n translateWindowsPath: (folder: string, distro: string, timeoutMs: number) => string | undefined | Promise<string | undefined> =\n (windowsFolder, wslDistro, timeoutMs) => translateWslPath([\"-au\", windowsFolder], wslDistro, timeoutMs),\n timeoutMs = 5_000,\n): Promise<string | null> {\n const directory = resolveWslWorkingDirectory(folder, distro)\n if (!directory) return Promise.resolve(null)\n if (directory.kind === \"linux\") return Promise.resolve(directory.path)\n return Promise.resolve(translateWindowsPath(directory.path, distro, Math.max(1, timeoutMs)))\n .then((translated) => translated?.trim() || null)\n}\n\nexport function resolveWslHostDirectory(\n folder: string,\n distro: string,\n translateLinuxPath: (folder: string, distro: string, timeoutMs: number) => string | undefined | Promise<string | undefined> =\n (linuxFolder, wslDistro, timeoutMs) => translateWslPath([\"-aw\", linuxFolder], wslDistro, timeoutMs),\n timeoutMs = 5_000,\n): Promise<string | null> {\n if (!path.posix.isAbsolute(folder)) return Promise.resolve(null)\n return Promise.resolve(translateLinuxPath(folder, distro, Math.max(1, timeoutMs)))\n .then((translated) => translated?.trim() || null)\n}\n\nfunction translateWslPath(args: string[], distro: string, timeoutMs: number): Promise<string | undefined> {\n return new Promise((resolve) => {\n execFile(\"wsl.exe\", [\"--distribution\", distro, \"--exec\", \"wslpath\", ...args], {\n encoding: \"utf8\",\n windowsHide: true,\n timeout: timeoutMs,\n maxBuffer: 64 * 1024,\n }, (error, stdout) => resolve(error ? undefined : stdout.trim()))\n })\n}\n\nexport function buildServiceLaunchSpec(\n binaryPath: string,\n options: BuildSpawnSpecOptions = {},\n): ServiceLaunchSpec {\n const platform = options.platform ?? process.platform\n const wslPath = platform === \"win32\" ? parseWslUncPath(binaryPath) : null\n if (wslPath) return { kind: \"wsl\", distro: wslPath.distro, binary: wslPath.linuxPath }\n return { kind: \"host\", binary: binaryPath, platform }\n}\n\nexport function probeBinaryVersion(\n binaryPath: string,\n execute: BinaryProbeExecutor = executeBinaryProbe,\n): {\n valid: boolean\n version?: string\n reported?: string\n error?: string\n missing?: boolean\n} {\n if (!binaryPath) {\n return { valid: false, error: \"Missing binary path\" }\n }\n\n try {\n const spec = buildSpawnSpec(binaryPath, [\"--version\"])\n const result = execute(spec)\n return parseBinaryVersion(result)\n } catch (error) {\n return { valid: false, error: error instanceof Error ? error.message : String(error) }\n }\n}\n\nfunction parseBinaryVersion(result: BinaryProbeExecution): ReturnType<typeof probeBinaryVersion> {\n if (result.error) {\n return { valid: false, error: result.error.message, ...((result.error as NodeJS.ErrnoException).code === \"ENOENT\" ? { missing: true } : {}) }\n }\n\n if (result.status !== 0) {\n const stderr = result.stderr?.trim()\n const stdout = result.stdout?.trim()\n const combined = stderr || stdout\n const error = combined ? `Exited with code ${result.status}: ${combined}` : `Exited with code ${result.status}`\n return { valid: false, error }\n }\n\n const stdoutLines = String(result.stdout ?? \"\")\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n const stderrLines = String(result.stderr ?? \"\")\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n\n // Prefer stdout; fall back to stderr (some tools report version there).\n const reported = stdoutLines[0] ?? stderrLines[0]\n if (!reported) {\n return { valid: true }\n }\n\n // Strip only presentation prefixes. Preserve custom labels and +build metadata:\n // truncating them into a stable version would enable unintended auto-upgrades.\n const version = reported.replace(/^opencode(?:2)?\\s+/i, \"\").replace(/^v(?=\\d+\\.)/i, \"\")\n return { valid: true, version, reported }\n}\n\nexport async function probeBinaryVersionAsync(binaryPath: string): Promise<ReturnType<typeof probeBinaryVersion>> {\n try { return parseBinaryVersion(await executeAsyncBinaryProbe(buildSpawnSpec(binaryPath, [\"--version\"]), 5_000)) }\n catch (error) { return { valid: false, error: error instanceof Error ? error.message : String(error) } }\n}\n\nexport async function probeOpenCodeBinary(\n binaryPath: string,\n execute: AsyncBinaryProbeExecutor = executeAsyncBinaryProbe,\n): Promise<BinaryValidationResult> {\n if (!binaryPath) return { valid: false, error: \"Missing binary path\" }\n try {\n // Neither probe starts a daemon, and both are asynchronous and bounded so\n // opening settings cannot stall the shared backend's requests/event stream.\n const version = parseBinaryVersion(await execute(buildSpawnSpec(binaryPath, [\"--version\"]), 5_000))\n if (!version.valid) return { valid: false, ...(version.error ? { error: version.error } : {}) }\n const versionResult = version.version ? { version: version.version } : {}\n const result = await execute(buildSpawnSpec(binaryPath, [\"service\", \"--help\"]), 5_000)\n if (result.error) return { valid: false, ...versionResult, error: result.error.message }\n if (isOpenCodeServiceCommandUnavailable(result.stdout, result.stderr)) {\n return { valid: false, ...versionResult, errorCode: OPENCODE_V2_REQUIRED_ERROR_CODE }\n }\n if (result.status === 0) {\n return isOpenCodeServiceHelp(result.stdout, result.stderr)\n ? { valid: true, ...versionResult }\n : { valid: false, ...versionResult }\n }\n\n const detail = String(result.stderr ?? \"\").trim() || String(result.stdout ?? \"\").trim()\n const suffix = detail ? `: ${detail.slice(0, 1_024)}` : \"\"\n return { valid: false, ...versionResult, error: `OpenCode service probe exited with code ${result.status}${suffix}` }\n } catch (error) {\n return { valid: false, error: error instanceof Error ? error.message : String(error) }\n }\n}\n\nfunction executeAsyncBinaryProbe(spec: SpawnSpec, timeoutMs: number): Promise<BinaryProbeExecution> {\n return new Promise((resolve) => {\n execFile(spec.command, spec.args, {\n encoding: \"utf8\",\n cwd: spec.cwd,\n env: spec.env,\n timeout: timeoutMs,\n maxBuffer: 64 * 1024,\n windowsHide: true,\n shell: false,\n windowsVerbatimArguments: Boolean(spec.options.windowsVerbatimArguments),\n }, (error, stdout, stderr) => resolve({\n status: error ? (typeof error.code === \"number\" ? error.code : null) : 0,\n ...(error && typeof error.code !== \"number\" ? { error } : {}),\n stdout,\n stderr,\n }))\n })\n}\n\nfunction executeBinaryProbe(spec: SpawnSpec, timeoutMs?: number): BinaryProbeExecution {\n const result = spawnSync(spec.command, spec.args, {\n encoding: \"utf8\",\n cwd: spec.cwd,\n env: spec.env,\n timeout: timeoutMs,\n windowsVerbatimArguments: Boolean(spec.options.windowsVerbatimArguments),\n })\n return {\n status: result.status,\n ...(result.error ? { error: result.error } : {}),\n ...(result.stdout !== null ? { stdout: result.stdout } : {}),\n ...(result.stderr !== null ? { stderr: result.stderr } : {}),\n }\n}\n\nfunction buildWslSpawnSpec(wslPath: WslPath, args: string[], options: BuildSpawnSpecOptions): SpawnSpec {\n const workingDirectory = options.cwd ? resolveWslWorkingDirectory(options.cwd, wslPath.distro) : undefined\n if (options.cwd && !workingDirectory) {\n throw new Error(\n `Unable to translate workspace folder for WSL binary in distro \"${wslPath.distro}\": ${options.cwd}`,\n )\n }\n\n const wslArgs = [\"--distribution\", wslPath.distro]\n const shouldWrapWithShell = workingDirectory?.kind === \"windows\"\n\n if (!shouldWrapWithShell && workingDirectory?.kind === \"linux\") {\n wslArgs.push(\"--cd\", workingDirectory.path)\n }\n\n if (shouldWrapWithShell) {\n const launchScript = buildWslLaunchScript(workingDirectory)\n wslArgs.push(\n \"--exec\",\n \"sh\",\n \"-lc\",\n launchScript,\n \"codenomad-wsl-launch\",\n )\n if (workingDirectory) {\n wslArgs.push(workingDirectory.path)\n }\n wslArgs.push(\n wslPath.linuxPath,\n ...args,\n )\n } else {\n wslArgs.push(\"--exec\", wslPath.linuxPath, ...args)\n }\n\n return {\n command: \"wsl.exe\",\n args: wslArgs,\n options: {},\n env: options.env,\n }\n}\n\nfunction resolveBareWindowsCommand(binaryPath: string, options: BuildSpawnSpecOptions): string | null {\n if (!/^[^\\\\/:]+$/.test(binaryPath) || path.win32.extname(binaryPath)) return null\n\n const env = options.env ?? process.env\n const cwd = options.cwd ?? process.cwd()\n const pathEntries = (getWindowsEnvironmentValue(env, \"PATH\") ?? \"\")\n .split(\";\")\n .map(unquoteWindowsPathEntry)\n const extensions = (getWindowsEnvironmentValue(env, \"PATHEXT\") ?? DEFAULT_WINDOWS_PATHEXT)\n .split(\";\")\n .map((extension) => extension.trim())\n .filter(Boolean)\n .map((extension) => (extension.startsWith(\".\") ? extension : `.${extension}`).toLowerCase())\n\n for (const entry of [cwd, ...pathEntries]) {\n const directory = entry\n ? path.win32.resolve(cwd, entry)\n : path.win32.resolve(cwd)\n for (const extension of extensions) {\n const candidate = path.win32.join(directory, `${binaryPath}${extension}`)\n try {\n if (statSync(candidate).isFile()) return candidate\n } catch {\n // Continue in Windows PATH/PATHEXT order.\n }\n }\n }\n\n return null\n}\n\nfunction getWindowsEnvironmentValue(env: NodeJS.ProcessEnv | undefined, key: string): string | undefined {\n if (!env) return undefined\n const match = Object.keys(env).reverse().find((candidate) => candidate.toUpperCase() === key)\n return match ? env[match] : undefined\n}\n\nfunction unquoteWindowsPathEntry(entry: string): string {\n const trimmed = entry.trim()\n return trimmed.length >= 2 && trimmed.startsWith('\"') && trimmed.endsWith('\"')\n ? trimmed.slice(1, -1)\n : trimmed\n}\n\nfunction buildWslLaunchScript(workingDirectory: WslWorkingDirectory | undefined): string {\n const steps: string[] = []\n\n if (workingDirectory?.kind === \"linux\") {\n steps.push('cd \"$1\"')\n steps.push(\"shift\")\n } else if (workingDirectory?.kind === \"windows\") {\n steps.push('cd \"$(wslpath -au \"$1\")\"')\n steps.push(\"shift\")\n }\n\n steps.push('exec \"$@\"')\n return steps.join(\" && \")\n}\n\nfunction resolveWindowsNpmExecutable(command: string): string | null {\n if (!WINDOWS_CMD_EXTENSIONS.has(path.win32.extname(command).toLowerCase())) return null\n try {\n const script = readFileSync(command, \"utf8\")\n if (script.length > 64 * 1024) return null\n const match = script.match(/[\"'](?:%~dp0|%dp0%)[\\\\/]([^\"'\\r\\n]+\\.exe)[\"']\\s+%\\*/i)\n if (!match?.[1]) return null\n const executable = path.win32.resolve(path.win32.dirname(command), match[1])\n return statSync(executable).isFile() ? executable : null\n } catch {\n return null\n }\n}\n\nfunction normalizeWindowsPath(input: string): string | null {\n const normalized = path.win32.normalize(input.trim().replace(/\\//g, \"\\\\\"))\n if (!normalized) {\n return null\n }\n\n if (/^[A-Za-z]:/.test(normalized) || normalized.startsWith(\"\\\\\\\\\")) {\n return normalized\n }\n\n return null\n}\n"]}
|
|
1
|
+
{"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../src/workspaces/spawn.ts"],"names":[],"mappings":"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","sourcesContent":["import { execFile, spawnSync } from \"child_process\"\nimport { readFileSync, statSync } from \"fs\"\nimport path from \"path\"\n\nimport { OPENCODE_V2_REQUIRED_ERROR_CODE, type BinaryValidationResult } from \"../api-types\"\nimport { isOpenCodeServiceCommandUnavailable, isOpenCodeServiceHelp } from \"./opencode-cli-compatibility\"\nimport { assertCurrentInstallation } from \"../opencode-update/retired-installation\"\n\nexport const WINDOWS_CMD_EXTENSIONS = new Set([\".cmd\", \".bat\"])\nexport const WINDOWS_POWERSHELL_EXTENSIONS = new Set([\".ps1\"])\n\nconst WSL_UNC_PATH_REGEX = /^\\\\\\\\wsl(?:\\.localhost|\\$)\\\\([^\\\\/]+)(?:[\\\\/](.*))?$/i\nconst DEFAULT_WINDOWS_PATHEXT = \".COM;.EXE;.BAT;.CMD\"\n\nexport interface SpawnSpec {\n command: string\n args: string[]\n options: {\n windowsVerbatimArguments?: boolean\n }\n cwd?: string\n env?: NodeJS.ProcessEnv\n}\n\nexport type ServiceLaunchSpec =\n | { kind: \"host\"; binary: string; platform: NodeJS.Platform }\n | { kind: \"wsl\"; distro: string; binary: string }\n\ninterface BuildSpawnSpecOptions {\n cwd?: string\n env?: NodeJS.ProcessEnv\n platform?: NodeJS.Platform\n}\n\ninterface WslPath {\n distro: string\n linuxPath: string\n}\n\nexport type WslWorkingDirectory =\n | { kind: \"linux\"; path: string }\n | { kind: \"windows\"; path: string }\n\ninterface BinaryProbeExecution {\n error?: Error\n status: number | null\n stdout?: string | null\n stderr?: string | null\n}\n\ntype BinaryProbeExecutor = (spec: SpawnSpec, timeoutMs?: number) => BinaryProbeExecution\ntype AsyncBinaryProbeExecutor = (spec: SpawnSpec, timeoutMs: number) => BinaryProbeExecution | Promise<BinaryProbeExecution>\n\nexport function parseWslUncPath(input: string): WslPath | null {\n const normalized = input.trim().replace(/\\//g, \"\\\\\")\n const match = normalized.match(WSL_UNC_PATH_REGEX)\n if (!match) {\n return null\n }\n\n const distro = match[1] ?? \"\"\n const remainder = match[2] ?? \"\"\n const segments = remainder.split(/\\\\+/).filter((segment) => segment.length > 0)\n\n return {\n distro,\n linuxPath: segments.length > 0 ? `/${segments.join(\"/\")}` : \"/\",\n }\n}\n\nexport function resolveWslWorkingDirectory(folder: string, distro: string): WslWorkingDirectory | null {\n const wslFolder = parseWslUncPath(folder)\n if (wslFolder) {\n return wslFolder.distro.toLowerCase() === distro.toLowerCase() ? { kind: \"linux\", path: wslFolder.linuxPath } : null\n }\n\n const windowsFolder = normalizeWindowsPath(folder)\n return windowsFolder ? { kind: \"windows\", path: windowsFolder } : null\n}\n\nexport function buildWindowsSpawnSpec(binaryPath: string, args: string[], options: BuildSpawnSpecOptions = {}): SpawnSpec {\n assertCurrentInstallation(binaryPath)\n const wslPath = parseWslUncPath(binaryPath)\n if (wslPath) {\n return buildWslSpawnSpec(wslPath, args, options)\n }\n\n const resolvedCommand = resolveBareWindowsCommand(binaryPath, options) ?? binaryPath\n const resolvedBinaryPath = resolveWindowsNpmExecutable(resolvedCommand) ?? resolvedCommand\n assertCurrentInstallation(resolvedBinaryPath)\n const extension = path.win32.extname(resolvedBinaryPath).toLowerCase()\n\n if (WINDOWS_CMD_EXTENSIONS.has(extension)) {\n const comspec = getWindowsEnvironmentValue(options.env, \"COMSPEC\") ??\n getWindowsEnvironmentValue(process.env, \"COMSPEC\") ??\n \"cmd.exe\"\n // cmd.exe requires the full command as a single string.\n // Using the \"\"<script> <args>\"\" pattern ensures paths with spaces are handled.\n const commandLine = `\"\"${resolvedBinaryPath}\" ${args.join(\" \")}\"`\n\n return {\n command: comspec,\n args: [\"/d\", \"/s\", \"/c\", commandLine],\n options: { windowsVerbatimArguments: true },\n cwd: options.cwd,\n env: options.env,\n }\n }\n\n if (WINDOWS_POWERSHELL_EXTENSIONS.has(extension)) {\n // powershell.exe ships with Windows. (pwsh may not.)\n return {\n command: \"powershell.exe\",\n args: [\"-NoProfile\", \"-ExecutionPolicy\", \"Bypass\", \"-File\", resolvedBinaryPath, ...args],\n options: {},\n cwd: options.cwd,\n env: options.env,\n }\n }\n\n return {\n command: resolvedBinaryPath,\n args,\n options: {},\n cwd: options.cwd,\n env: options.env,\n }\n}\n\nexport function buildSpawnSpec(binaryPath: string, args: string[], options: BuildSpawnSpecOptions = {}): SpawnSpec {\n assertCurrentInstallation(binaryPath, options.env)\n if ((options.platform ?? process.platform) !== \"win32\") {\n return {\n command: binaryPath,\n args,\n options: {},\n cwd: options.cwd,\n env: options.env,\n }\n }\n\n return buildWindowsSpawnSpec(binaryPath, args, options)\n}\n\nexport function resolveWslServiceDirectory(\n folder: string,\n distro: string,\n translateWindowsPath: (folder: string, distro: string, timeoutMs: number) => string | undefined | Promise<string | undefined> =\n (windowsFolder, wslDistro, timeoutMs) => translateWslPath([\"-au\", windowsFolder], wslDistro, timeoutMs),\n timeoutMs = 5_000,\n): Promise<string | null> {\n const directory = resolveWslWorkingDirectory(folder, distro)\n if (!directory) return Promise.resolve(null)\n if (directory.kind === \"linux\") return Promise.resolve(directory.path)\n return Promise.resolve(translateWindowsPath(directory.path, distro, Math.max(1, timeoutMs)))\n .then((translated) => translated?.trim() || null)\n}\n\nexport function resolveWslHostDirectory(\n folder: string,\n distro: string,\n translateLinuxPath: (folder: string, distro: string, timeoutMs: number) => string | undefined | Promise<string | undefined> =\n (linuxFolder, wslDistro, timeoutMs) => translateWslPath([\"-aw\", linuxFolder], wslDistro, timeoutMs),\n timeoutMs = 5_000,\n): Promise<string | null> {\n if (!path.posix.isAbsolute(folder)) return Promise.resolve(null)\n return Promise.resolve(translateLinuxPath(folder, distro, Math.max(1, timeoutMs)))\n .then((translated) => translated?.trim() || null)\n}\n\nfunction translateWslPath(args: string[], distro: string, timeoutMs: number): Promise<string | undefined> {\n return new Promise((resolve) => {\n execFile(\"wsl.exe\", [\"--distribution\", distro, \"--exec\", \"wslpath\", ...args], {\n encoding: \"utf8\",\n windowsHide: true,\n timeout: timeoutMs,\n maxBuffer: 64 * 1024,\n }, (error, stdout) => resolve(error ? undefined : stdout.trim()))\n })\n}\n\nexport function buildServiceLaunchSpec(\n binaryPath: string,\n options: BuildSpawnSpecOptions = {},\n): ServiceLaunchSpec {\n assertCurrentInstallation(binaryPath)\n const platform = options.platform ?? process.platform\n const wslPath = platform === \"win32\" ? parseWslUncPath(binaryPath) : null\n if (wslPath) return { kind: \"wsl\", distro: wslPath.distro, binary: wslPath.linuxPath }\n return { kind: \"host\", binary: binaryPath, platform }\n}\n\nexport function probeBinaryVersion(\n binaryPath: string,\n execute: BinaryProbeExecutor = executeBinaryProbe,\n): {\n valid: boolean\n version?: string\n reported?: string\n error?: string\n missing?: boolean\n} {\n if (!binaryPath) {\n return { valid: false, error: \"Missing binary path\" }\n }\n\n try {\n const spec = buildSpawnSpec(binaryPath, [\"--version\"])\n const result = execute(spec)\n return parseBinaryVersion(result)\n } catch (error) {\n return { valid: false, error: error instanceof Error ? error.message : String(error), ...((error as NodeJS.ErrnoException).code === \"ENOENT\" ? { missing: true } : {}) }\n }\n}\n\nfunction parseBinaryVersion(result: BinaryProbeExecution): ReturnType<typeof probeBinaryVersion> {\n if (result.error) {\n return { valid: false, error: result.error.message, ...((result.error as NodeJS.ErrnoException).code === \"ENOENT\" ? { missing: true } : {}) }\n }\n\n if (result.status !== 0) {\n const stderr = result.stderr?.trim()\n const stdout = result.stdout?.trim()\n const combined = stderr || stdout\n const error = combined ? `Exited with code ${result.status}: ${combined}` : `Exited with code ${result.status}`\n return { valid: false, error }\n }\n\n const stdoutLines = String(result.stdout ?? \"\")\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n const stderrLines = String(result.stderr ?? \"\")\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n\n // Prefer stdout; fall back to stderr (some tools report version there).\n const reported = stdoutLines[0] ?? stderrLines[0]\n if (!reported) {\n return { valid: true }\n }\n\n // Strip only presentation prefixes. Preserve custom labels and +build metadata:\n // truncating them into a stable version would enable unintended auto-upgrades.\n const version = reported.replace(/^opencode(?:2)?\\s+/i, \"\").replace(/^v(?=\\d+\\.)/i, \"\")\n return { valid: true, version, reported }\n}\n\nexport async function probeBinaryVersionAsync(binaryPath: string): Promise<ReturnType<typeof probeBinaryVersion>> {\n try { return parseBinaryVersion(await executeAsyncBinaryProbe(buildSpawnSpec(binaryPath, [\"--version\"]), 5_000)) }\n catch (error) { return { valid: false, error: error instanceof Error ? error.message : String(error), ...((error as NodeJS.ErrnoException).code === \"ENOENT\" ? { missing: true } : {}) } }\n}\n\nexport async function probeOpenCodeBinary(\n binaryPath: string,\n execute: AsyncBinaryProbeExecutor = executeAsyncBinaryProbe,\n): Promise<BinaryValidationResult> {\n if (!binaryPath) return { valid: false, error: \"Missing binary path\" }\n try {\n // Neither probe starts a daemon, and both are asynchronous and bounded so\n // opening settings cannot stall the shared backend's requests/event stream.\n const version = parseBinaryVersion(await execute(buildSpawnSpec(binaryPath, [\"--version\"]), 5_000))\n if (!version.valid) return { valid: false, ...(version.error ? { error: version.error } : {}) }\n const versionResult = version.version ? { version: version.version } : {}\n const result = await execute(buildSpawnSpec(binaryPath, [\"service\", \"--help\"]), 5_000)\n if (result.error) return { valid: false, ...versionResult, error: result.error.message }\n if (isOpenCodeServiceCommandUnavailable(result.stdout, result.stderr)) {\n return { valid: false, ...versionResult, errorCode: OPENCODE_V2_REQUIRED_ERROR_CODE }\n }\n if (result.status === 0) {\n return isOpenCodeServiceHelp(result.stdout, result.stderr)\n ? { valid: true, ...versionResult }\n : { valid: false, ...versionResult }\n }\n\n const detail = String(result.stderr ?? \"\").trim() || String(result.stdout ?? \"\").trim()\n const suffix = detail ? `: ${detail.slice(0, 1_024)}` : \"\"\n return { valid: false, ...versionResult, error: `OpenCode service probe exited with code ${result.status}${suffix}` }\n } catch (error) {\n return { valid: false, error: error instanceof Error ? error.message : String(error) }\n }\n}\n\nfunction executeAsyncBinaryProbe(spec: SpawnSpec, timeoutMs: number): Promise<BinaryProbeExecution> {\n return new Promise((resolve) => {\n execFile(spec.command, spec.args, {\n encoding: \"utf8\",\n cwd: spec.cwd,\n env: spec.env,\n timeout: timeoutMs,\n maxBuffer: 64 * 1024,\n windowsHide: true,\n shell: false,\n windowsVerbatimArguments: Boolean(spec.options.windowsVerbatimArguments),\n }, (error, stdout, stderr) => resolve({\n status: error ? (typeof error.code === \"number\" ? error.code : null) : 0,\n ...(error && typeof error.code !== \"number\" ? { error } : {}),\n stdout,\n stderr,\n }))\n })\n}\n\nfunction executeBinaryProbe(spec: SpawnSpec, timeoutMs?: number): BinaryProbeExecution {\n const result = spawnSync(spec.command, spec.args, {\n encoding: \"utf8\",\n cwd: spec.cwd,\n env: spec.env,\n timeout: timeoutMs,\n windowsVerbatimArguments: Boolean(spec.options.windowsVerbatimArguments),\n })\n return {\n status: result.status,\n ...(result.error ? { error: result.error } : {}),\n ...(result.stdout !== null ? { stdout: result.stdout } : {}),\n ...(result.stderr !== null ? { stderr: result.stderr } : {}),\n }\n}\n\nfunction buildWslSpawnSpec(wslPath: WslPath, args: string[], options: BuildSpawnSpecOptions): SpawnSpec {\n const workingDirectory = options.cwd ? resolveWslWorkingDirectory(options.cwd, wslPath.distro) : undefined\n if (options.cwd && !workingDirectory) {\n throw new Error(\n `Unable to translate workspace folder for WSL binary in distro \"${wslPath.distro}\": ${options.cwd}`,\n )\n }\n\n const wslArgs = [\"--distribution\", wslPath.distro]\n const shouldWrapWithShell = workingDirectory?.kind === \"windows\"\n\n if (!shouldWrapWithShell && workingDirectory?.kind === \"linux\") {\n wslArgs.push(\"--cd\", workingDirectory.path)\n }\n\n if (shouldWrapWithShell) {\n const launchScript = buildWslLaunchScript(workingDirectory)\n wslArgs.push(\n \"--exec\",\n \"sh\",\n \"-lc\",\n launchScript,\n \"codenomad-wsl-launch\",\n )\n if (workingDirectory) {\n wslArgs.push(workingDirectory.path)\n }\n wslArgs.push(\n wslPath.linuxPath,\n ...args,\n )\n } else {\n wslArgs.push(\"--exec\", wslPath.linuxPath, ...args)\n }\n\n return {\n command: \"wsl.exe\",\n args: wslArgs,\n options: {},\n env: options.env,\n }\n}\n\nfunction resolveBareWindowsCommand(binaryPath: string, options: BuildSpawnSpecOptions): string | null {\n if (!/^[^\\\\/:]+$/.test(binaryPath) || path.win32.extname(binaryPath)) return null\n\n const env = options.env ?? process.env\n const cwd = options.cwd ?? process.cwd()\n const pathEntries = (getWindowsEnvironmentValue(env, \"PATH\") ?? \"\")\n .split(\";\")\n .map(unquoteWindowsPathEntry)\n const extensions = (getWindowsEnvironmentValue(env, \"PATHEXT\") ?? DEFAULT_WINDOWS_PATHEXT)\n .split(\";\")\n .map((extension) => extension.trim())\n .filter(Boolean)\n .map((extension) => (extension.startsWith(\".\") ? extension : `.${extension}`).toLowerCase())\n\n for (const entry of [cwd, ...pathEntries]) {\n const directory = entry\n ? path.win32.resolve(cwd, entry)\n : path.win32.resolve(cwd)\n for (const extension of extensions) {\n const candidate = path.win32.join(directory, `${binaryPath}${extension}`)\n try {\n if (statSync(candidate).isFile()) return candidate\n } catch {\n // Continue in Windows PATH/PATHEXT order.\n }\n }\n }\n\n return null\n}\n\nfunction getWindowsEnvironmentValue(env: NodeJS.ProcessEnv | undefined, key: string): string | undefined {\n if (!env) return undefined\n const match = Object.keys(env).reverse().find((candidate) => candidate.toUpperCase() === key)\n return match ? env[match] : undefined\n}\n\nfunction unquoteWindowsPathEntry(entry: string): string {\n const trimmed = entry.trim()\n return trimmed.length >= 2 && trimmed.startsWith('\"') && trimmed.endsWith('\"')\n ? trimmed.slice(1, -1)\n : trimmed\n}\n\nfunction buildWslLaunchScript(workingDirectory: WslWorkingDirectory | undefined): string {\n const steps: string[] = []\n\n if (workingDirectory?.kind === \"linux\") {\n steps.push('cd \"$1\"')\n steps.push(\"shift\")\n } else if (workingDirectory?.kind === \"windows\") {\n steps.push('cd \"$(wslpath -au \"$1\")\"')\n steps.push(\"shift\")\n }\n\n steps.push('exec \"$@\"')\n return steps.join(\" && \")\n}\n\nfunction resolveWindowsNpmExecutable(command: string): string | null {\n if (!WINDOWS_CMD_EXTENSIONS.has(path.win32.extname(command).toLowerCase())) return null\n try {\n const script = readFileSync(command, \"utf8\")\n if (script.length > 64 * 1024) return null\n const match = script.match(/[\"'](?:%~dp0|%dp0%)[\\\\/]([^\"'\\r\\n]+\\.exe)[\"']\\s+%\\*/i)\n if (!match?.[1]) return null\n const executable = path.win32.resolve(path.win32.dirname(command), match[1])\n return statSync(executable).isFile() ? executable : null\n } catch {\n return null\n }\n}\n\nfunction normalizeWindowsPath(input: string): string | null {\n const normalized = path.win32.normalize(input.trim().replace(/\\//g, \"\\\\\"))\n if (!normalized) {\n return null\n }\n\n if (/^[A-Za-z]:/.test(normalized) || normalized.startsWith(\"\\\\\\\\\")) {\n return normalized\n }\n\n return null\n}\n"]}
|