dsh-x-core 0.1.21 → 0.1.23
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/assets/dsh-preview.png +0 -0
- package/assets/dsh.ico +0 -0
- package/assets/icon.ico +0 -0
- package/assets/tray.ico +0 -0
- package/assets/tray.png +0 -0
- package/core-npm.js +201 -183
- package/desktop-plugins.js +86 -0
- package/desktop.js +200 -0
- package/filemanager-base.js +7 -8
- package/filemanager-linux.js +124 -0
- package/filemanager.js +4 -7
- package/native-notify.js +74 -0
- package/node/node +2 -1
- package/package.json +1 -1
- package/packs/dsh-x-workbench/README.md +61 -0
- package/packs/dsh-x-workbench/dspack.json +4 -0
- package/packs/dsh-x-workbench/home/skills/agent-browser/LICENSE-APACHE-2.0.txt +202 -0
- package/packs/dsh-x-workbench/home/skills/agent-browser/NOTICE.md +6 -0
- package/packs/dsh-x-workbench/home/skills/agent-browser/SKILL.md +697 -0
- package/packs/dsh-x-workbench/home/skills/agent-browser/references/authentication.md +313 -0
- package/packs/dsh-x-workbench/home/skills/agent-browser/references/commands.md +300 -0
- package/packs/dsh-x-workbench/home/skills/agent-browser/references/profiling.md +120 -0
- package/packs/dsh-x-workbench/home/skills/agent-browser/references/proxy-support.md +194 -0
- package/packs/dsh-x-workbench/home/skills/agent-browser/references/session-management.md +201 -0
- package/packs/dsh-x-workbench/home/skills/agent-browser/references/snapshot-refs.md +229 -0
- package/packs/dsh-x-workbench/home/skills/agent-browser/references/video-recording.md +173 -0
- package/packs/dsh-x-workbench/home/skills/agent-browser/templates/authenticated-session.sh +105 -0
- package/packs/dsh-x-workbench/home/skills/agent-browser/templates/capture-workflow.sh +69 -0
- package/packs/dsh-x-workbench/home/skills/agent-browser/templates/form-automation.sh +62 -0
- package/packs/dsh-x-workbench/home/skills/electron/LICENSE-APACHE-2.0.txt +202 -0
- package/packs/dsh-x-workbench/home/skills/electron/NOTICE.md +6 -0
- package/packs/dsh-x-workbench/home/skills/electron/SKILL.md +243 -0
- package/packs/dsh-x-workbench/manifest.json +35 -0
- package/perf/patch-hooks.mjs +14 -1
- package/perf/plugin-profile.mjs +204 -0
- package/perf/register.mjs +4 -0
- package/platform.js +2 -1
- package/public/booting.html +475 -0
- package/public/favicon.ico +0 -0
- package/public/favicon.png +0 -0
- package/public/icon.png +0 -0
- package/public/index.html +9277 -8173
- package/public/internal-tabs.js +45 -41
- package/public/launcher.css +285 -98
- package/public/mascot.js +1 -1
- package/public/theme.css +33 -6
- package/public/water.js +1 -1
- package/registry.js +38 -3
- package/server.js +1060 -119
- package/settings.js +78 -1
package/public/theme.css
CHANGED
|
@@ -12,23 +12,33 @@ html[data-color-scheme="dark"] {
|
|
|
12
12
|
--danger: #f0f0f2;
|
|
13
13
|
--switch-off: #66656d;
|
|
14
14
|
--switch-on: #a6a7ad;
|
|
15
|
+
/* 内部标签页那层标签条:要明显比页面底色深,选中的标签(用采样来的页面色)才立得起来,
|
|
16
|
+
同时它的底边和下面是同一个色,接缝看不出来——Edge 暗色就是这个关系(条更深、标签=内容色) */
|
|
17
|
+
--chrome-strip: #0b0b0e;
|
|
18
|
+
/* 设置页左侧导航:比页面底色(--bg #18181b)再深一档,和右侧内容靠色块分开(见 launcher.css) */
|
|
19
|
+
--settings-nav-bg: #111114;
|
|
15
20
|
}
|
|
16
21
|
|
|
22
|
+
/* 标签之间那条小竖线:暗色下也只是"隐约一条",别比标签本身还抢眼(Chromium 用低对比度算这个色) */
|
|
23
|
+
html[data-color-scheme="dark"].internal-tabs.has-tabs { --tab-separator: #33343a; }
|
|
24
|
+
|
|
17
25
|
html[data-color-scheme="dark"] .backdrop {
|
|
18
26
|
background: radial-gradient(ellipse at 24% 10%, #303035, #1c1c21 62%, #151519);
|
|
19
27
|
}
|
|
20
28
|
html[data-color-scheme="dark"] .water-surface { opacity: .96; }
|
|
21
29
|
html[data-color-scheme="dark"] header { background: transparent; }
|
|
22
|
-
|
|
23
|
-
html[data-color-scheme="dark"]
|
|
30
|
+
/* 内部标签页那条要一块自己的底色(比页面深一档),别被上面这条透明掉:同特异性,靠这条更具体 + 更靠后 */
|
|
31
|
+
html[data-color-scheme="dark"].internal-tabs.has-tabs header { background: var(--chrome-strip); }
|
|
32
|
+
/* 齿轮/刷新两种顶栏形态一个样子:静止透明,悬停才用 --accent-soft(暗色那条自己就是深一档的灰),
|
|
33
|
+
所以这里只给 Star 那类有底色的胶囊补深色,别把齿轮也填成一块。 */
|
|
34
|
+
html[data-color-scheme="dark"] .star-link { background: #343438; }
|
|
24
35
|
html[data-color-scheme="dark"] main:not(.home) .shell {
|
|
25
36
|
background: rgba(31, 31, 35, var(--panel-opacity));
|
|
26
37
|
border-color: rgba(116, 116, 122, .78);
|
|
27
38
|
box-shadow: 0 18px 52px rgba(0, 0, 0, .28), 0 3px 12px rgba(0, 0, 0, .16);
|
|
28
39
|
}
|
|
29
|
-
html[data-color-scheme="dark"] .settings-nav { background:
|
|
40
|
+
html[data-color-scheme="dark"] .settings-nav { background: var(--settings-nav-bg); }
|
|
30
41
|
html[data-color-scheme="dark"] #pane-control .card.home { background: rgba(39, 39, 43, var(--panel-opacity)); }
|
|
31
|
-
html[data-color-scheme="dark"] main:not(.home) .settings-nav { background: transparent; }
|
|
32
42
|
html[data-color-scheme="dark"] main:not(.home) .settings-body {
|
|
33
43
|
background: transparent;
|
|
34
44
|
}
|
|
@@ -96,6 +106,9 @@ html[data-color-scheme="dark"] .pack-more-actions .ghost { background: transpare
|
|
|
96
106
|
html[data-color-scheme="dark"] .pack-more-actions .ghost:hover:not(:disabled) { background: var(--accent-soft); border-color: transparent; }
|
|
97
107
|
html[data-color-scheme="dark"] .pack-more-actions .ghost.danger { color: #f2797f; }
|
|
98
108
|
html[data-color-scheme="dark"] .pack-more-actions .ghost.danger:hover:not(:disabled) { background: rgba(225, 29, 72, 0.16); }
|
|
109
|
+
/* 设置页的危险操作按钮跟「更多操作」里的危险项同一套配色(浅色主题那条 #fff1f2 在暗色里太亮) */
|
|
110
|
+
html[data-color-scheme="dark"] .set-control .ghost.danger { color: #f2797f; border-color: rgba(225, 29, 72, 0.35); }
|
|
111
|
+
html[data-color-scheme="dark"] .set-control .ghost.danger:hover:not(:disabled) { background: rgba(225, 29, 72, 0.16); }
|
|
99
112
|
/* 编辑启动项的删除图标钮:悬停铺同款淡玫瑰红(浅色主题那条 #fff1f2 在暗色里太亮) */
|
|
100
113
|
html[data-color-scheme="dark"] .launch-save-actions .launch-delete:hover:not(:disabled) { background: rgba(225, 29, 72, 0.16); border-color: rgba(225, 29, 72, 0.35); }
|
|
101
114
|
html[data-color-scheme="dark"] .ghost:hover:not(:disabled),
|
|
@@ -107,6 +120,10 @@ html[data-color-scheme="dark"] #remove.icon-btn:hover:not(:disabled) {
|
|
|
107
120
|
}
|
|
108
121
|
html[data-color-scheme="dark"] .star-link:hover,
|
|
109
122
|
html[data-color-scheme="dark"] .gear-btn:hover { border-color: #d2d2d6; background: #45454a; box-shadow: none; }
|
|
123
|
+
/* 内部标签页的扁条:暗色下也不留底色,悬停才浮出来(选择器要比上面那条更具体才盖得住) */
|
|
124
|
+
html[data-color-scheme="dark"] .internal-tabs.has-tabs .gear-btn { background: transparent; color: var(--muted); }
|
|
125
|
+
html[data-color-scheme="dark"] .internal-tabs.has-tabs .brand-home:hover,
|
|
126
|
+
html[data-color-scheme="dark"] .internal-tabs.has-tabs .gear-btn:hover { background: #3c3d42; color: var(--accent); }
|
|
110
127
|
html[data-color-scheme="dark"] .primary,
|
|
111
128
|
html[data-color-scheme="dark"] #main.icon-btn,
|
|
112
129
|
html[data-color-scheme="dark"] .self-update,
|
|
@@ -157,12 +174,22 @@ html[data-color-scheme="dark"] .select-panel,
|
|
|
157
174
|
html[data-color-scheme="dark"] .plugin-list,
|
|
158
175
|
html[data-color-scheme="dark"] #log,
|
|
159
176
|
html[data-color-scheme="dark"] .pane,
|
|
160
|
-
html[data-color-scheme="dark"] .settings-nav
|
|
177
|
+
html[data-color-scheme="dark"] .settings-nav,
|
|
178
|
+
html[data-color-scheme="dark"] .launch-modal-fields,
|
|
179
|
+
html[data-color-scheme="dark"] .dialog-body,
|
|
180
|
+
html[data-color-scheme="dark"] .ask-items,
|
|
181
|
+
html[data-color-scheme="dark"] .backup-list { scrollbar-color: #77787d transparent; }
|
|
161
182
|
html[data-color-scheme="dark"] .select-panel::-webkit-scrollbar-thumb,
|
|
162
183
|
html[data-color-scheme="dark"] .plugin-list::-webkit-scrollbar-thumb,
|
|
163
184
|
html[data-color-scheme="dark"] #log::-webkit-scrollbar-thumb,
|
|
164
185
|
html[data-color-scheme="dark"] .pane::-webkit-scrollbar-thumb,
|
|
165
|
-
html[data-color-scheme="dark"] .settings-nav::-webkit-scrollbar-thumb
|
|
186
|
+
html[data-color-scheme="dark"] .settings-nav::-webkit-scrollbar-thumb,
|
|
187
|
+
html[data-color-scheme="dark"] .launch-modal-fields::-webkit-scrollbar-thumb,
|
|
188
|
+
html[data-color-scheme="dark"] .dialog-body::-webkit-scrollbar-thumb,
|
|
189
|
+
html[data-color-scheme="dark"] .ask-items::-webkit-scrollbar-thumb,
|
|
190
|
+
html[data-color-scheme="dark"] .backup-list::-webkit-scrollbar-thumb { background: #77787d; background-clip: content-box; }
|
|
191
|
+
html[data-color-scheme="dark"] .launch-log-text { background: #202024; color: #dddde0; scrollbar-color: #77787d transparent; }
|
|
192
|
+
html[data-color-scheme="dark"] .launch-log-text::-webkit-scrollbar-thumb { background: #77787d; background-clip: content-box; }
|
|
166
193
|
|
|
167
194
|
html[data-color-scheme="dark"] .ask.is-child-dialog { background: transparent; }
|
|
168
195
|
html[data-color-scheme="dark"] .set-row:focus-within { background: transparent; box-shadow: none; }
|
package/public/water.js
CHANGED
|
@@ -94,7 +94,7 @@
|
|
|
94
94
|
const active=()=>!lost&&!document.hidden&&!reduced.matches
|
|
95
95
|
&&!document.documentElement.classList.contains('reduce-motion')
|
|
96
96
|
&&!document.documentElement.classList.contains('launcher-idle')
|
|
97
|
-
&&!document.documentElement.classList.contains('background-hidden');
|
|
97
|
+
&&!document.documentElement.classList.contains('background-hidden')&&!document.documentElement.classList.contains('internal-dsh-active');
|
|
98
98
|
function draw(){
|
|
99
99
|
gl.uniform2f(uniforms.resolution,canvas.width,canvas.height);
|
|
100
100
|
gl.uniform1f(uniforms.time,time);
|
package/registry.js
CHANGED
|
@@ -3,12 +3,12 @@ import { randomBytes } from 'node:crypto'
|
|
|
3
3
|
import { createWriteStream, existsSync } from 'node:fs'
|
|
4
4
|
import { cp, mkdir, open, readdir, rm, stat, writeFile } from 'node:fs/promises'
|
|
5
5
|
import { tmpdir } from 'node:os'
|
|
6
|
-
import { dirname, join } from 'node:path'
|
|
6
|
+
import { delimiter, dirname, join } from 'node:path'
|
|
7
7
|
import { Readable } from 'node:stream'
|
|
8
8
|
import { pipeline } from 'node:stream/promises'
|
|
9
9
|
import { fileURLToPath } from 'node:url'
|
|
10
10
|
import { DEFAULTS, DOWNLOAD_SOURCES, loadSettingsSync } from './settings.js'
|
|
11
|
-
import { RUNTIME_NODE, RUNTIME_NODE_ENV } from './platform.js'
|
|
11
|
+
import { IN_ELECTRON, IS_WINDOWS, RUNTIME_NODE, RUNTIME_NODE_ENV } from './platform.js'
|
|
12
12
|
// 版本列表、tarball 都走带代理的 fetch(见 proxy.js);回环地址它自动直连
|
|
13
13
|
import { netFetch, proxyEnv } from './proxy.js'
|
|
14
14
|
// 版本比较在 version.js(零依赖),这里转出去保持老调用方不用改
|
|
@@ -28,7 +28,7 @@ export function currentRegistry() {
|
|
|
28
28
|
const name = loadSettingsSync().downloadSource
|
|
29
29
|
return DOWNLOAD_SOURCES[name] || DOWNLOAD_SOURCES[DEFAULTS.downloadSource]
|
|
30
30
|
}
|
|
31
|
-
const USER_AGENT = `dsh-
|
|
31
|
+
const USER_AGENT = `dsh-x/${pkg.version || '0.0.0'}`
|
|
32
32
|
let npmReady = null
|
|
33
33
|
|
|
34
34
|
// npm/npx 的 Windows 包装。`node` 落在哪儿随安装方式变:源码运行就是系统 node;打包后
|
|
@@ -245,6 +245,36 @@ export function describeNpmFailure(text) {
|
|
|
245
245
|
.join('\n')
|
|
246
246
|
}
|
|
247
247
|
|
|
248
|
+
/**
|
|
249
|
+
* 跑 npm 的 PATH:postinstall 里写的是裸命令(koffi 的 `node ./cnoke.cjs` 就是),
|
|
250
|
+
* 而我们是用 RUNTIME_NODE 的**绝对路径**起 npm 的 —— 机器上没装 Node.js 时 PATH 里
|
|
251
|
+
* 根本没有 node,装到一半就死在 `'node' 不是内部或外部命令`(0.2.1-rc.5 起 koffi 带
|
|
252
|
+
* 这条脚本,干净的 Windows 上必挂)。
|
|
253
|
+
*
|
|
254
|
+
* 补的是打包时的 node/ 目录(node.cmd 转调 Electron 本体按 node 跑);源码运行没有这个
|
|
255
|
+
* 目录,就退回跑我们的那个 node 所在的目录。**追加到末尾**:自己装了 Node 的机器行为和
|
|
256
|
+
* 以前一模一样,自带运行时只当兜底 —— 和 dsh 子进程的 PATH 排序一致(server.js
|
|
257
|
+
* orderRuntimePaths),用户的工具链仍排在前面。
|
|
258
|
+
*/
|
|
259
|
+
export function withRuntimeNode(pathValue, options = {}) {
|
|
260
|
+
const {
|
|
261
|
+
dir = LOCAL_NODE,
|
|
262
|
+
runtime = RUNTIME_NODE,
|
|
263
|
+
inElectron = IN_ELECTRON,
|
|
264
|
+
sep = delimiter,
|
|
265
|
+
exists = existsSync,
|
|
266
|
+
} = options
|
|
267
|
+
// Electron 本体所在目录里没有 node.exe,只有 node/ 那个包装目录能当兜底。
|
|
268
|
+
// node.exe 是 0.1.19 及以前安装包的布局,和 platform.js runtimeNode() 同一个判断。
|
|
269
|
+
const bundled = IS_WINDOWS
|
|
270
|
+
? exists(join(dir, 'node.cmd')) || exists(join(dir, 'node.exe'))
|
|
271
|
+
: exists(join(dir, 'node'))
|
|
272
|
+
const fallback = bundled ? dir : inElectron ? '' : dirname(runtime)
|
|
273
|
+
const parts = String(pathValue || '').split(sep).filter(Boolean)
|
|
274
|
+
if (!fallback || parts.includes(fallback)) return pathValue
|
|
275
|
+
return [...parts, fallback].join(sep)
|
|
276
|
+
}
|
|
277
|
+
|
|
248
278
|
function runNpm(cli, args, { cwd, onLog, env } = {}) {
|
|
249
279
|
return new Promise((resolve, reject) => {
|
|
250
280
|
const child = spawn(RUNTIME_NODE, ['--require', join(APP_ROOT, 'stdio-unblock.cjs'), cli, ...args], {
|
|
@@ -252,6 +282,11 @@ function runNpm(cli, args, { cwd, onLog, env } = {}) {
|
|
|
252
282
|
env: {
|
|
253
283
|
...process.env,
|
|
254
284
|
...RUNTIME_NODE_ENV,
|
|
285
|
+
// 生命周期脚本里的裸 `node` 只在 PATH 里找,见 withRuntimeNode
|
|
286
|
+
PATH: withRuntimeNode(process.env.PATH),
|
|
287
|
+
// node.cmd 转调 Electron 时认它。外壳早就设过(shell/main.mjs),这里再兜一次:
|
|
288
|
+
// 核心自更新到用户目录后 node/ 就在 data 下,node.cmd 猜不中 DSH.exe 的位置。
|
|
289
|
+
...(IN_ELECTRON ? { DSH_ELECTRON_BIN: process.execPath } : {}),
|
|
255
290
|
npm_config_registry: currentRegistry(),
|
|
256
291
|
...proxyEnv(),
|
|
257
292
|
npm_config_audit: 'false',
|