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.
Files changed (50) hide show
  1. package/assets/dsh-preview.png +0 -0
  2. package/assets/dsh.ico +0 -0
  3. package/assets/icon.ico +0 -0
  4. package/assets/tray.ico +0 -0
  5. package/assets/tray.png +0 -0
  6. package/core-npm.js +201 -183
  7. package/desktop-plugins.js +86 -0
  8. package/desktop.js +200 -0
  9. package/filemanager-base.js +7 -8
  10. package/filemanager-linux.js +124 -0
  11. package/filemanager.js +4 -7
  12. package/native-notify.js +74 -0
  13. package/node/node +2 -1
  14. package/package.json +1 -1
  15. package/packs/dsh-x-workbench/README.md +61 -0
  16. package/packs/dsh-x-workbench/dspack.json +4 -0
  17. package/packs/dsh-x-workbench/home/skills/agent-browser/LICENSE-APACHE-2.0.txt +202 -0
  18. package/packs/dsh-x-workbench/home/skills/agent-browser/NOTICE.md +6 -0
  19. package/packs/dsh-x-workbench/home/skills/agent-browser/SKILL.md +697 -0
  20. package/packs/dsh-x-workbench/home/skills/agent-browser/references/authentication.md +313 -0
  21. package/packs/dsh-x-workbench/home/skills/agent-browser/references/commands.md +300 -0
  22. package/packs/dsh-x-workbench/home/skills/agent-browser/references/profiling.md +120 -0
  23. package/packs/dsh-x-workbench/home/skills/agent-browser/references/proxy-support.md +194 -0
  24. package/packs/dsh-x-workbench/home/skills/agent-browser/references/session-management.md +201 -0
  25. package/packs/dsh-x-workbench/home/skills/agent-browser/references/snapshot-refs.md +229 -0
  26. package/packs/dsh-x-workbench/home/skills/agent-browser/references/video-recording.md +173 -0
  27. package/packs/dsh-x-workbench/home/skills/agent-browser/templates/authenticated-session.sh +105 -0
  28. package/packs/dsh-x-workbench/home/skills/agent-browser/templates/capture-workflow.sh +69 -0
  29. package/packs/dsh-x-workbench/home/skills/agent-browser/templates/form-automation.sh +62 -0
  30. package/packs/dsh-x-workbench/home/skills/electron/LICENSE-APACHE-2.0.txt +202 -0
  31. package/packs/dsh-x-workbench/home/skills/electron/NOTICE.md +6 -0
  32. package/packs/dsh-x-workbench/home/skills/electron/SKILL.md +243 -0
  33. package/packs/dsh-x-workbench/manifest.json +35 -0
  34. package/perf/patch-hooks.mjs +14 -1
  35. package/perf/plugin-profile.mjs +204 -0
  36. package/perf/register.mjs +4 -0
  37. package/platform.js +2 -1
  38. package/public/booting.html +475 -0
  39. package/public/favicon.ico +0 -0
  40. package/public/favicon.png +0 -0
  41. package/public/icon.png +0 -0
  42. package/public/index.html +9277 -8173
  43. package/public/internal-tabs.js +45 -41
  44. package/public/launcher.css +285 -98
  45. package/public/mascot.js +1 -1
  46. package/public/theme.css +33 -6
  47. package/public/water.js +1 -1
  48. package/registry.js +38 -3
  49. package/server.js +1060 -119
  50. 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
- html[data-color-scheme="dark"] .star-link,
23
- html[data-color-scheme="dark"] .gear-btn { background: #343438; }
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: #222226; }
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 { scrollbar-color: #77787d transparent; }
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 { background: #77787d; background-clip: content-box; }
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-versions/${pkg.version || '0.0.0'}`
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',