dsh-bash-terminal-ts 0.4.0 → 0.5.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.en.md +50 -165
- package/README.md +98 -95
- package/cordis.patch.yml +2 -2
- package/dist/client.core.js +46 -39
- package/dist/client.js +47 -40
- package/dsh.plugin.json +4 -4
- package/lib/client.js +148 -0
- package/lib/dsh-types.d.ts +1 -1
- package/lib/index.d.ts +17 -16
- package/lib/index.js +47 -47
- package/lib/terminal.d.ts +24 -1
- package/lib/terminal.js +214 -49
- package/package.json +34 -55
- package/screenshots.json +3 -0
- package/scripts/build-client.mjs +14 -13
- package/src/client.tsx +70 -46
- package/src/dsh-types.ts +1 -1
- package/src/index.ts +47 -47
- package/src/terminal.ts +254 -54
- package/README.ja.md +0 -196
- package/README.ko.md +0 -194
package/dist/client.core.js
CHANGED
|
@@ -23,13 +23,24 @@ __export(client_exports, {
|
|
|
23
23
|
inject: () => inject
|
|
24
24
|
});
|
|
25
25
|
module.exports = __toCommonJS(client_exports);
|
|
26
|
+
var import_react = require("react");
|
|
26
27
|
var import_dsh_client_store = require("@deepseek-ai/dsh-client-store");
|
|
28
|
+
var import_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
|
|
27
29
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
28
30
|
var SETTINGS_NS = "settings.bash-terminal";
|
|
29
31
|
var SETTINGS_NAMESPACE = "bash-terminal";
|
|
32
|
+
var SHELLS = ["powershell", "gitbash", "msys2", "wsl"];
|
|
33
|
+
var ROW_CSS = ".btRow{border-bottom:1px solid var(--dsw-alias-border-l2);align-items:center;gap:8px;padding:16px 0;display:flex}.btRowText{flex-direction:column;flex:1;gap:4px;min-width:0;padding-right:48px;display:flex}.btTitle{color:var(--dsw-alias-label-primary);font-size:14px;font-weight:400;line-height:22px}.btDesc{color:var(--dsw-alias-label-tertiary);font-size:12px;font-weight:400;line-height:18px}.btSelector{background:var(--dsw-alias-bg-module-platform);height:36px;font:inherit;color:var(--dsw-alias-label-primary);cursor:pointer;border:none;border-radius:18px;align-items:center;gap:12px;padding:0 14px;font-size:14px;line-height:22px;display:inline-flex}.btSelector:hover{background:var(--dsw-alias-interactive-bg-hover)}.btChevron{flex:none}";
|
|
34
|
+
if (typeof document !== "undefined" && document.querySelector('style[data-plugin-css="bash-terminal-row"]') === null) {
|
|
35
|
+
const tag = document.createElement("style");
|
|
36
|
+
tag.dataset.plugin = "dsh-bash-terminal";
|
|
37
|
+
tag.dataset.pluginCss = "bash-terminal-row";
|
|
38
|
+
tag.textContent = ROW_CSS;
|
|
39
|
+
document.head.appendChild(tag);
|
|
40
|
+
}
|
|
30
41
|
var zh = {
|
|
31
42
|
"shell.title": "\u9ED8\u8BA4\u7EC8\u7AEF",
|
|
32
|
-
"shell.description": "shell \u5DE5\u5177\u6267\u884C\u547D\u4EE4\u65F6\u4F7F\u7528\u7684\u7EC8\u7AEF
|
|
43
|
+
"shell.description": "shell \u5DE5\u5177\u6267\u884C\u547D\u4EE4\u65F6\u4F7F\u7528\u7684\u7EC8\u7AEF",
|
|
33
44
|
"shell.powershell": "PowerShell",
|
|
34
45
|
"shell.gitbash": "Git Bash",
|
|
35
46
|
"shell.msys2": "MSYS2",
|
|
@@ -37,7 +48,7 @@ var zh = {
|
|
|
37
48
|
};
|
|
38
49
|
var en = {
|
|
39
50
|
"shell.title": "Default terminal",
|
|
40
|
-
"shell.description": "Terminal used by the shell tool
|
|
51
|
+
"shell.description": "Terminal used by the shell tool",
|
|
41
52
|
"shell.powershell": "PowerShell",
|
|
42
53
|
"shell.gitbash": "Git Bash",
|
|
43
54
|
"shell.msys2": "MSYS2",
|
|
@@ -47,49 +58,45 @@ var inject = ["slots", "locale", "settingsScope"];
|
|
|
47
58
|
function ShellPreferenceRow({ t, useStore, setShell }) {
|
|
48
59
|
const shell = useStore((s) => s.shell);
|
|
49
60
|
const writable = useStore((s) => s.writable);
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
61
|
+
const [open, setOpen] = (0, import_react.useState)(false);
|
|
62
|
+
const items = SHELLS.map((id) => ({ id, label: t("shell." + id) }));
|
|
63
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "btRow", children: [
|
|
64
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "btRowText", children: [
|
|
65
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "btTitle", children: t("shell.title") }),
|
|
66
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "btDesc", children: t("shell.description") })
|
|
67
|
+
] }),
|
|
68
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
69
|
+
import_dsh_client_ui_primitives.Menu,
|
|
70
|
+
{
|
|
71
|
+
open,
|
|
72
|
+
onClose: () => setOpen(false),
|
|
73
|
+
items,
|
|
74
|
+
selectedId: shell,
|
|
75
|
+
onSelect: (id) => {
|
|
76
|
+
setOpen(false);
|
|
77
|
+
setShell(id);
|
|
78
|
+
},
|
|
79
|
+
align: "end",
|
|
80
|
+
portal: true,
|
|
81
|
+
anchor: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
82
|
+
"button",
|
|
67
83
|
{
|
|
68
|
-
|
|
84
|
+
type: "button",
|
|
85
|
+
className: "btSelector",
|
|
86
|
+
"aria-haspopup": "menu",
|
|
87
|
+
"aria-expanded": open,
|
|
69
88
|
disabled: !writable,
|
|
70
|
-
|
|
71
|
-
style: {
|
|
72
|
-
fontSize: 14,
|
|
73
|
-
padding: "6px 10px",
|
|
74
|
-
borderRadius: 8,
|
|
75
|
-
border: "1px solid var(--dsw-alias-line-strong, #ccc)",
|
|
76
|
-
background: "var(--dsw-alias-bg-layer-2, #fff)",
|
|
77
|
-
color: "var(--dsw-alias-label-primary, inherit)",
|
|
78
|
-
outline: "none",
|
|
79
|
-
cursor: writable ? "pointer" : "not-allowed",
|
|
80
|
-
maxWidth: 180
|
|
81
|
-
},
|
|
89
|
+
onClick: () => setOpen(!open),
|
|
90
|
+
style: !writable ? { opacity: 0.5, cursor: "not-allowed" } : void 0,
|
|
82
91
|
children: [
|
|
83
|
-
|
|
84
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
85
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: "msys2", children: t("shell.msys2") }),
|
|
86
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: "wsl", children: t("shell.wsl") })
|
|
92
|
+
t("shell." + shell),
|
|
93
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.IconChevronDownOutline14, { className: "btChevron" })
|
|
87
94
|
]
|
|
88
95
|
}
|
|
89
96
|
)
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
);
|
|
97
|
+
}
|
|
98
|
+
)
|
|
99
|
+
] });
|
|
93
100
|
}
|
|
94
101
|
function apply(ctx) {
|
|
95
102
|
ctx.effect(() => ctx.locale.register(SETTINGS_NS, { zh, en }), "bash-terminal: settings dictionaries");
|
package/dist/client.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
window.__ModuleLoader__.load({
|
|
2
|
-
id: "dsh-bash-terminal
|
|
2
|
+
id: "dsh-bash-terminal",
|
|
3
3
|
factory: (require) => {
|
|
4
4
|
var module = { exports: {} };
|
|
5
5
|
var exports = module.exports;
|
|
@@ -28,13 +28,24 @@ __export(client_exports, {
|
|
|
28
28
|
inject: () => inject
|
|
29
29
|
});
|
|
30
30
|
module.exports = __toCommonJS(client_exports);
|
|
31
|
+
var import_react = require("react");
|
|
31
32
|
var import_dsh_client_store = require("@deepseek-ai/dsh-client-store");
|
|
33
|
+
var import_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
|
|
32
34
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
33
35
|
var SETTINGS_NS = "settings.bash-terminal";
|
|
34
36
|
var SETTINGS_NAMESPACE = "bash-terminal";
|
|
37
|
+
var SHELLS = ["powershell", "gitbash", "msys2", "wsl"];
|
|
38
|
+
var ROW_CSS = ".btRow{border-bottom:1px solid var(--dsw-alias-border-l2);align-items:center;gap:8px;padding:16px 0;display:flex}.btRowText{flex-direction:column;flex:1;gap:4px;min-width:0;padding-right:48px;display:flex}.btTitle{color:var(--dsw-alias-label-primary);font-size:14px;font-weight:400;line-height:22px}.btDesc{color:var(--dsw-alias-label-tertiary);font-size:12px;font-weight:400;line-height:18px}.btSelector{background:var(--dsw-alias-bg-module-platform);height:36px;font:inherit;color:var(--dsw-alias-label-primary);cursor:pointer;border:none;border-radius:18px;align-items:center;gap:12px;padding:0 14px;font-size:14px;line-height:22px;display:inline-flex}.btSelector:hover{background:var(--dsw-alias-interactive-bg-hover)}.btChevron{flex:none}";
|
|
39
|
+
if (typeof document !== "undefined" && document.querySelector('style[data-plugin-css="bash-terminal-row"]') === null) {
|
|
40
|
+
const tag = document.createElement("style");
|
|
41
|
+
tag.dataset.plugin = "dsh-bash-terminal";
|
|
42
|
+
tag.dataset.pluginCss = "bash-terminal-row";
|
|
43
|
+
tag.textContent = ROW_CSS;
|
|
44
|
+
document.head.appendChild(tag);
|
|
45
|
+
}
|
|
35
46
|
var zh = {
|
|
36
47
|
"shell.title": "\u9ED8\u8BA4\u7EC8\u7AEF",
|
|
37
|
-
"shell.description": "shell \u5DE5\u5177\u6267\u884C\u547D\u4EE4\u65F6\u4F7F\u7528\u7684\u7EC8\u7AEF
|
|
48
|
+
"shell.description": "shell \u5DE5\u5177\u6267\u884C\u547D\u4EE4\u65F6\u4F7F\u7528\u7684\u7EC8\u7AEF",
|
|
38
49
|
"shell.powershell": "PowerShell",
|
|
39
50
|
"shell.gitbash": "Git Bash",
|
|
40
51
|
"shell.msys2": "MSYS2",
|
|
@@ -42,7 +53,7 @@ var zh = {
|
|
|
42
53
|
};
|
|
43
54
|
var en = {
|
|
44
55
|
"shell.title": "Default terminal",
|
|
45
|
-
"shell.description": "Terminal used by the shell tool
|
|
56
|
+
"shell.description": "Terminal used by the shell tool",
|
|
46
57
|
"shell.powershell": "PowerShell",
|
|
47
58
|
"shell.gitbash": "Git Bash",
|
|
48
59
|
"shell.msys2": "MSYS2",
|
|
@@ -52,49 +63,45 @@ var inject = ["slots", "locale", "settingsScope"];
|
|
|
52
63
|
function ShellPreferenceRow({ t, useStore, setShell }) {
|
|
53
64
|
const shell = useStore((s) => s.shell);
|
|
54
65
|
const writable = useStore((s) => s.writable);
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
66
|
+
const [open, setOpen] = (0, import_react.useState)(false);
|
|
67
|
+
const items = SHELLS.map((id) => ({ id, label: t("shell." + id) }));
|
|
68
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "btRow", children: [
|
|
69
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "btRowText", children: [
|
|
70
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "btTitle", children: t("shell.title") }),
|
|
71
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "btDesc", children: t("shell.description") })
|
|
72
|
+
] }),
|
|
73
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
74
|
+
import_dsh_client_ui_primitives.Menu,
|
|
75
|
+
{
|
|
76
|
+
open,
|
|
77
|
+
onClose: () => setOpen(false),
|
|
78
|
+
items,
|
|
79
|
+
selectedId: shell,
|
|
80
|
+
onSelect: (id) => {
|
|
81
|
+
setOpen(false);
|
|
82
|
+
setShell(id);
|
|
83
|
+
},
|
|
84
|
+
align: "end",
|
|
85
|
+
portal: true,
|
|
86
|
+
anchor: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
87
|
+
"button",
|
|
72
88
|
{
|
|
73
|
-
|
|
89
|
+
type: "button",
|
|
90
|
+
className: "btSelector",
|
|
91
|
+
"aria-haspopup": "menu",
|
|
92
|
+
"aria-expanded": open,
|
|
74
93
|
disabled: !writable,
|
|
75
|
-
|
|
76
|
-
style: {
|
|
77
|
-
fontSize: 14,
|
|
78
|
-
padding: "6px 10px",
|
|
79
|
-
borderRadius: 8,
|
|
80
|
-
border: "1px solid var(--dsw-alias-line-strong, #ccc)",
|
|
81
|
-
background: "var(--dsw-alias-bg-layer-2, #fff)",
|
|
82
|
-
color: "var(--dsw-alias-label-primary, inherit)",
|
|
83
|
-
outline: "none",
|
|
84
|
-
cursor: writable ? "pointer" : "not-allowed",
|
|
85
|
-
maxWidth: 180
|
|
86
|
-
},
|
|
94
|
+
onClick: () => setOpen(!open),
|
|
95
|
+
style: !writable ? { opacity: 0.5, cursor: "not-allowed" } : void 0,
|
|
87
96
|
children: [
|
|
88
|
-
|
|
89
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
90
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: "msys2", children: t("shell.msys2") }),
|
|
91
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: "wsl", children: t("shell.wsl") })
|
|
97
|
+
t("shell." + shell),
|
|
98
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.IconChevronDownOutline14, { className: "btChevron" })
|
|
92
99
|
]
|
|
93
100
|
}
|
|
94
101
|
)
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
);
|
|
102
|
+
}
|
|
103
|
+
)
|
|
104
|
+
] });
|
|
98
105
|
}
|
|
99
106
|
function apply(ctx) {
|
|
100
107
|
ctx.effect(() => ctx.locale.register(SETTINGS_NS, { zh, en }), "bash-terminal: settings dictionaries");
|
package/dsh.plugin.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
-
"id": "dsh-bash-terminal
|
|
3
|
-
"name": "dsh-bash-terminal
|
|
4
|
-
"version": "0.
|
|
2
|
+
"id": "dsh-bash-terminal",
|
|
3
|
+
"name": "dsh-bash-terminal",
|
|
4
|
+
"version": "0.3.18",
|
|
5
5
|
"description": {
|
|
6
6
|
"en": "One shell tool that runs commands through PowerShell, Git Bash, MSYS2 or WSL on Windows, with a user-chosen default terminal in the Web UI settings.",
|
|
7
7
|
"zh": "一个 shell 工具,可在 Windows 上通过 PowerShell / Git Bash / MSYS2 / WSL 执行命令,默认终端在 Web UI 设置中选择。"
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
},
|
|
14
14
|
"license": "MIT",
|
|
15
15
|
"engines": {
|
|
16
|
-
"dsh": ">=0.1.
|
|
16
|
+
"dsh": ">=0.1.5-alpha.1 <0.2.0-0"
|
|
17
17
|
},
|
|
18
18
|
"components": {
|
|
19
19
|
"host": "lib/index.js",
|
package/lib/client.js
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
window.__ModuleLoader__.load({
|
|
2
|
+
id: "dsh-bash-terminal",
|
|
3
|
+
factory: (require) => {
|
|
4
|
+
var module = { exports: {} };
|
|
5
|
+
var exports = module.exports;
|
|
6
|
+
var __defProp = Object.defineProperty;
|
|
7
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
8
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
9
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
10
|
+
var __export = (target, all) => {
|
|
11
|
+
for (var name in all)
|
|
12
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
13
|
+
};
|
|
14
|
+
var __copyProps = (to, from, except, desc) => {
|
|
15
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
16
|
+
for (let key of __getOwnPropNames(from))
|
|
17
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
18
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
19
|
+
}
|
|
20
|
+
return to;
|
|
21
|
+
};
|
|
22
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
23
|
+
|
|
24
|
+
// src/client.tsx
|
|
25
|
+
var client_exports = {};
|
|
26
|
+
__export(client_exports, {
|
|
27
|
+
apply: () => apply,
|
|
28
|
+
inject: () => inject
|
|
29
|
+
});
|
|
30
|
+
module.exports = __toCommonJS(client_exports);
|
|
31
|
+
var import_react = require("react");
|
|
32
|
+
var import_dsh_client_store = require("@deepseek-ai/dsh-client-store");
|
|
33
|
+
var import_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
|
|
34
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
35
|
+
var SETTINGS_NS = "settings.bash-terminal";
|
|
36
|
+
var SETTINGS_NAMESPACE = "bash-terminal";
|
|
37
|
+
var SHELLS = ["powershell", "gitbash", "msys2", "wsl"];
|
|
38
|
+
var ROW_CSS = ".btRow{border-bottom:1px solid var(--dsw-alias-border-l2);align-items:center;gap:8px;padding:16px 0;display:flex}.btRowText{flex-direction:column;flex:1;gap:4px;min-width:0;padding-right:48px;display:flex}.btTitle{color:var(--dsw-alias-label-primary);font-size:14px;font-weight:400;line-height:22px}.btDesc{color:var(--dsw-alias-label-tertiary);font-size:12px;font-weight:400;line-height:18px}.btSelector{background:var(--dsw-alias-bg-module-platform);height:36px;font:inherit;color:var(--dsw-alias-label-primary);cursor:pointer;border:none;border-radius:18px;align-items:center;gap:12px;padding:0 14px;font-size:14px;line-height:22px;display:inline-flex}.btSelector:hover{background:var(--dsw-alias-interactive-bg-hover)}.btChevron{flex:none}";
|
|
39
|
+
if (typeof document !== "undefined" && document.querySelector('style[data-plugin-css="bash-terminal-row"]') === null) {
|
|
40
|
+
const tag = document.createElement("style");
|
|
41
|
+
tag.dataset.plugin = "dsh-bash-terminal";
|
|
42
|
+
tag.dataset.pluginCss = "bash-terminal-row";
|
|
43
|
+
tag.textContent = ROW_CSS;
|
|
44
|
+
document.head.appendChild(tag);
|
|
45
|
+
}
|
|
46
|
+
var zh = {
|
|
47
|
+
"shell.title": "\u9ED8\u8BA4\u7EC8\u7AEF",
|
|
48
|
+
"shell.description": "shell \u5DE5\u5177\u6267\u884C\u547D\u4EE4\u65F6\u4F7F\u7528\u7684\u7EC8\u7AEF",
|
|
49
|
+
"shell.powershell": "PowerShell",
|
|
50
|
+
"shell.gitbash": "Git Bash",
|
|
51
|
+
"shell.msys2": "MSYS2",
|
|
52
|
+
"shell.wsl": "WSL"
|
|
53
|
+
};
|
|
54
|
+
var en = {
|
|
55
|
+
"shell.title": "Default terminal",
|
|
56
|
+
"shell.description": "Terminal used by the shell tool",
|
|
57
|
+
"shell.powershell": "PowerShell",
|
|
58
|
+
"shell.gitbash": "Git Bash",
|
|
59
|
+
"shell.msys2": "MSYS2",
|
|
60
|
+
"shell.wsl": "WSL"
|
|
61
|
+
};
|
|
62
|
+
var inject = ["slots", "locale", "settingsScope"];
|
|
63
|
+
function ShellPreferenceRow({ t, useStore, setShell }) {
|
|
64
|
+
const shell = useStore((s) => s.shell);
|
|
65
|
+
const writable = useStore((s) => s.writable);
|
|
66
|
+
const [open, setOpen] = (0, import_react.useState)(false);
|
|
67
|
+
const items = SHELLS.map((id) => ({ id, label: t("shell." + id) }));
|
|
68
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "btRow", children: [
|
|
69
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "btRowText", children: [
|
|
70
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "btTitle", children: t("shell.title") }),
|
|
71
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "btDesc", children: t("shell.description") })
|
|
72
|
+
] }),
|
|
73
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
74
|
+
import_dsh_client_ui_primitives.Menu,
|
|
75
|
+
{
|
|
76
|
+
open,
|
|
77
|
+
onClose: () => setOpen(false),
|
|
78
|
+
items,
|
|
79
|
+
selectedId: shell,
|
|
80
|
+
onSelect: (id) => {
|
|
81
|
+
setOpen(false);
|
|
82
|
+
setShell(id);
|
|
83
|
+
},
|
|
84
|
+
align: "end",
|
|
85
|
+
portal: true,
|
|
86
|
+
anchor: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
87
|
+
"button",
|
|
88
|
+
{
|
|
89
|
+
type: "button",
|
|
90
|
+
className: "btSelector",
|
|
91
|
+
"aria-haspopup": "menu",
|
|
92
|
+
"aria-expanded": open,
|
|
93
|
+
disabled: !writable,
|
|
94
|
+
onClick: () => setOpen(!open),
|
|
95
|
+
style: !writable ? { opacity: 0.5, cursor: "not-allowed" } : void 0,
|
|
96
|
+
children: [
|
|
97
|
+
t("shell." + shell),
|
|
98
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.IconChevronDownOutline14, { className: "btChevron" })
|
|
99
|
+
]
|
|
100
|
+
}
|
|
101
|
+
)
|
|
102
|
+
}
|
|
103
|
+
)
|
|
104
|
+
] });
|
|
105
|
+
}
|
|
106
|
+
function apply(ctx) {
|
|
107
|
+
ctx.effect(() => ctx.locale.register(SETTINGS_NS, { zh, en }), "bash-terminal: settings dictionaries");
|
|
108
|
+
const scope = ctx.settingsScope.bind({ namespace: SETTINGS_NAMESPACE });
|
|
109
|
+
const store = (0, import_dsh_client_store.defineStore)({
|
|
110
|
+
init: () => ({ shell: "powershell", revision: -1, writable: false }),
|
|
111
|
+
actions: {
|
|
112
|
+
sync: (d, shell, revision, writable) => {
|
|
113
|
+
if (revision !== void 0 && revision <= d.revision) return;
|
|
114
|
+
if (shell !== void 0) d.shell = shell;
|
|
115
|
+
if (revision !== void 0) d.revision = revision;
|
|
116
|
+
if (writable !== void 0) d.writable = writable;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
let bound;
|
|
121
|
+
const push = (snap) => {
|
|
122
|
+
bound?.sync(snap.value?.defaultShell, snap.revision, snap.writable);
|
|
123
|
+
};
|
|
124
|
+
ctx.slots.inject(
|
|
125
|
+
"settings.general.item",
|
|
126
|
+
() => ctx.slots.register(
|
|
127
|
+
{
|
|
128
|
+
name: "settings.general.item",
|
|
129
|
+
id: "bash-terminal-shell",
|
|
130
|
+
order: 20,
|
|
131
|
+
store,
|
|
132
|
+
locale: SETTINGS_NS,
|
|
133
|
+
inject: (actions) => {
|
|
134
|
+
bound = actions;
|
|
135
|
+
push(scope.getSnapshot());
|
|
136
|
+
return { setShell: (value) => void scope.set("defaultShell", value) };
|
|
137
|
+
}
|
|
138
|
+
},
|
|
139
|
+
ShellPreferenceRow
|
|
140
|
+
),
|
|
141
|
+
"bash-terminal: settings row"
|
|
142
|
+
);
|
|
143
|
+
ctx.effect(() => scope.subscribe(() => push(scope.getSnapshot())), "bash-terminal: settings watch");
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
return module.exports;
|
|
147
|
+
}
|
|
148
|
+
});
|
package/lib/dsh-types.d.ts
CHANGED
|
@@ -241,7 +241,7 @@ export interface ApprovalSeam {
|
|
|
241
241
|
request(input: unknown): Promise<unknown>;
|
|
242
242
|
}
|
|
243
243
|
/**
|
|
244
|
-
* The structural context face dsh-bash-terminal
|
|
244
|
+
* The structural context face dsh-bash-terminal programs against: the union
|
|
245
245
|
* of every `ctx.*` member touched by src/index.ts and src/terminal.ts.
|
|
246
246
|
*/
|
|
247
247
|
export interface BashTerminalContext {
|
package/lib/index.d.ts
CHANGED
|
@@ -31,17 +31,18 @@ export declare function candidatePwshPaths(env?: NodeJS.ProcessEnv): string[];
|
|
|
31
31
|
*/
|
|
32
32
|
export declare function candidateGitBashPaths(env?: NodeJS.ProcessEnv): string[];
|
|
33
33
|
/**
|
|
34
|
-
* MSYS2 locations, in preference order: the real `bash.exe` under usr\bin
|
|
35
|
-
* then bin\bash.exe, and `msys2.exe` dead last.
|
|
34
|
+
* MSYS2 locations, in preference order: the real `bash.exe` under usr\bin
|
|
35
|
+
* first, then bin\bash.exe, and `msys2.exe` dead last.
|
|
36
36
|
*
|
|
37
37
|
* msys2.exe is NOT a usable backend for piped execution: it is the console-
|
|
38
38
|
* allocating Cygwin launcher, so a spawn with piped stdio returns exit 0 with
|
|
39
|
-
* zero bytes on both stdout and stderr (measured on
|
|
40
|
-
* Keeping it in the list only as a last-resort
|
|
41
|
-
* config docs reference, but a working
|
|
39
|
+
* zero bytes on both stdout and stderr (measured on this machine against
|
|
40
|
+
* MSYS2 with bash 5.3.15). Keeping it in the list only as a last-resort
|
|
41
|
+
* fallback preserves the path the config docs reference, but a working
|
|
42
|
+
* bash.exe always wins.
|
|
42
43
|
*
|
|
43
|
-
* MSYS2 uses the same Cygwin/MSYS2 runtime as Git Bash, so it cannot run
|
|
44
|
-
* the DSH Windows ACL restricted-token sandbox.
|
|
44
|
+
* MSYS2 uses the same Cygwin/MSYS2 runtime as Git Bash, so it cannot run
|
|
45
|
+
* under the DSH Windows ACL restricted-token sandbox.
|
|
45
46
|
*/
|
|
46
47
|
export declare function candidateMsys2Paths(env?: NodeJS.ProcessEnv): string[];
|
|
47
48
|
export declare function defaultWslPath(env?: NodeJS.ProcessEnv): string;
|
|
@@ -52,16 +53,16 @@ export declare function resolveAllPaths(config?: PathConfig, env?: NodeJS.Proces
|
|
|
52
53
|
export declare function buildArgv(shell: string, command: string, paths: ResolvedPaths, distro?: string): Array<string | undefined>;
|
|
53
54
|
/**
|
|
54
55
|
* Merge the DSH_* environment over the process environment. For WSL, only
|
|
55
|
-
* variables explicitly listed in WSLENV cross the boundary, so every DSH_*
|
|
56
|
-
* appended
|
|
56
|
+
* variables explicitly listed in WSLENV cross the boundary, so every DSH_*
|
|
57
|
+
* key is appended there — and the list is *layered onto* whatever WSLENV the
|
|
58
|
+
* host already had (Windows Terminal exports e.g. `WT_SESSION:WT_PROFILE_ID:`),
|
|
59
|
+
* never rebuilt from scratch: WSLENV is an allow-list, so dropping the
|
|
60
|
+
* inherited entries would silently stop them crossing into WSL.
|
|
57
61
|
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
* wholesale (the PTY path) must pass the inherited value explicitly.
|
|
63
|
-
*
|
|
64
|
-
* @param inheritedWslenv - the WSLENV the child would otherwise inherit.
|
|
62
|
+
* @param inheritedWslenv - the ambient WSLENV to layer onto. Callers that
|
|
63
|
+
* replace the child environment wholesale (the PTY path) must pass
|
|
64
|
+
* `process.env.WSLENV` explicitly, because the ambient value is not visible
|
|
65
|
+
* through `dshEnv`.
|
|
65
66
|
*/
|
|
66
67
|
export declare function buildEnv(shell: string, dshEnv?: Record<string, string>, inheritedWslenv?: string | undefined): Record<string, string | undefined>;
|
|
67
68
|
export interface SpawnResolution {
|