@jingyi0605/codingns4dsh 0.2.1-rc.2 → 0.2.1-rc.3
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 +6 -4
- package/README.md +6 -6
- package/data/build/dist/bootstrap/dsh-connection-adapter.d.ts +1 -1
- package/data/build/dist/bootstrap/index.d.ts +1 -1
- package/data/build/dist/client/bundle.js +5306 -493
- package/data/build/dist/client/bundle.js.map +1 -1
- package/data/build/dist/client/client.magpie-model-tag.js +155 -5
- package/data/build/dist/client/client.magpie-model-tag.js.map +1 -1
- package/data/build/dist/client/client.native-workspace-store.js +30 -4
- package/data/build/dist/client/client.native-workspace-store.js.map +1 -1
- package/data/build/dist/client/client.transport.js +725 -48
- package/data/build/dist/client/client.transport.js.map +1 -1
- package/data/build/dist/client/desktop-assistant.js +931 -185
- package/data/build/dist/client/feature-requirement.d.ts +43 -0
- package/data/build/dist/client/feature-requirement.d.ts.map +1 -0
- package/data/build/dist/client/feature-requirement.js +105 -0
- package/data/build/dist/client/feature-requirement.js.map +1 -0
- package/data/build/dist/client/features/index.d.ts +1 -0
- package/data/build/dist/client/features/index.d.ts.map +1 -1
- package/data/build/dist/client/features/index.js +3 -0
- package/data/build/dist/client/features/index.js.map +1 -1
- package/data/build/dist/client/features/magpie-management-controls.d.ts +46 -0
- package/data/build/dist/client/features/magpie-management-controls.d.ts.map +1 -0
- package/data/build/dist/client/features/magpie-management-controls.js +759 -0
- package/data/build/dist/client/features/magpie-management-controls.js.map +1 -0
- package/data/build/dist/client/features/magpie-management-page.d.ts +124 -0
- package/data/build/dist/client/features/magpie-management-page.d.ts.map +1 -0
- package/data/build/dist/client/features/magpie-management-page.js +1256 -0
- package/data/build/dist/client/features/magpie-management-page.js.map +1 -0
- package/data/build/dist/client/features/magpie-management.d.ts +7 -0
- package/data/build/dist/client/features/magpie-management.d.ts.map +1 -0
- package/data/build/dist/client/features/magpie-management.js +154 -0
- package/data/build/dist/client/features/magpie-management.js.map +1 -0
- package/data/build/dist/client/features/magpie-mark.d.ts +10 -0
- package/data/build/dist/client/features/magpie-mark.d.ts.map +1 -0
- package/data/build/dist/client/features/magpie-mark.js +21 -0
- package/data/build/dist/client/features/magpie-mark.js.map +1 -0
- package/data/build/dist/client/features/magpie-provider-logo.d.ts +11 -0
- package/data/build/dist/client/features/magpie-provider-logo.d.ts.map +1 -0
- package/data/build/dist/client/features/magpie-provider-logo.js +35 -0
- package/data/build/dist/client/features/magpie-provider-logo.js.map +1 -0
- package/data/build/dist/client/features/subscription-quota-groups.d.ts +193 -0
- package/data/build/dist/client/features/subscription-quota-groups.d.ts.map +1 -0
- package/data/build/dist/client/features/subscription-quota-groups.js +548 -0
- package/data/build/dist/client/features/subscription-quota-groups.js.map +1 -0
- package/data/build/dist/client/git-management.d.ts.map +1 -1
- package/data/build/dist/client/git-management.js +11 -9
- package/data/build/dist/client/git-management.js.map +1 -1
- package/data/build/dist/client/git-panel-styles.js +1 -0
- package/data/build/dist/client/git-panel-styles.js.map +1 -1
- package/data/build/dist/client/index.d.ts +1 -1
- package/data/build/dist/client/index.d.ts.map +1 -1
- package/data/build/dist/client/index.js +1 -1
- package/data/build/dist/client/index.js.map +1 -1
- package/data/build/dist/client/locale.d.ts.map +1 -1
- package/data/build/dist/client/locale.js +7 -0
- package/data/build/dist/client/locale.js.map +1 -1
- package/data/build/dist/client/locales/magpie.d.ts +4 -0
- package/data/build/dist/client/locales/magpie.d.ts.map +1 -0
- package/data/build/dist/client/locales/magpie.js +622 -0
- package/data/build/dist/client/locales/magpie.js.map +1 -0
- package/data/build/dist/client/locales/usage.d.ts.map +1 -1
- package/data/build/dist/client/locales/usage.js +52 -0
- package/data/build/dist/client/locales/usage.js.map +1 -1
- package/data/build/dist/client/magpie-model-tag.d.ts +9 -1
- package/data/build/dist/client/magpie-model-tag.d.ts.map +1 -1
- package/data/build/dist/client/magpie-model-tag.js +15 -3
- package/data/build/dist/client/magpie-model-tag.js.map +1 -1
- package/data/build/dist/client/provider-icons.d.ts +8 -0
- package/data/build/dist/client/provider-icons.d.ts.map +1 -1
- package/data/build/dist/client/provider-icons.js +122 -2
- package/data/build/dist/client/provider-icons.js.map +1 -1
- package/data/build/dist/client/settings-bridge.d.ts +1 -0
- package/data/build/dist/client/settings-bridge.d.ts.map +1 -1
- package/data/build/dist/client/settings-bridge.js +29 -10
- package/data/build/dist/client/settings-bridge.js.map +1 -1
- package/data/build/dist/client/settings-section.d.ts.map +1 -1
- package/data/build/dist/client/settings-section.js +21 -3
- package/data/build/dist/client/settings-section.js.map +1 -1
- package/data/build/dist/client/style.css +224 -221
- package/data/build/dist/client/subscription-slot.d.ts +20 -0
- package/data/build/dist/client/subscription-slot.d.ts.map +1 -1
- package/data/build/dist/client/subscription-slot.js +321 -18
- package/data/build/dist/client/subscription-slot.js.map +1 -1
- package/data/build/dist/dsh-capabilities/client/global-panel-adapter.d.ts +27 -0
- package/data/build/dist/dsh-capabilities/client/global-panel-adapter.d.ts.map +1 -0
- package/data/build/dist/dsh-capabilities/client/global-panel-adapter.js +109 -0
- package/data/build/dist/dsh-capabilities/client/global-panel-adapter.js.map +1 -0
- package/data/build/dist/dsh-capabilities/host/session-title-adapter.d.ts +2 -1
- package/data/build/dist/dsh-capabilities/host/session-title-adapter.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/host/session-title-adapter.js +32 -2
- package/data/build/dist/dsh-capabilities/host/session-title-adapter.js.map +1 -1
- package/data/build/dist/dsh-capabilities/matrix.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/matrix.js +12 -11
- package/data/build/dist/dsh-capabilities/matrix.js.map +1 -1
- package/data/build/dist/dsh-capabilities/routes.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/routes.js +12 -9
- package/data/build/dist/dsh-capabilities/routes.js.map +1 -1
- package/data/build/dist/dsh-capabilities/types.d.ts +1 -1
- package/data/build/dist/dsh-capabilities/types.d.ts.map +1 -1
- package/data/build/dist/dsh-capabilities/types.js.map +1 -1
- package/data/build/dist/host/cli-adapters/acp-cli-driver.d.ts +27 -0
- package/data/build/dist/host/cli-adapters/acp-cli-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/acp-cli-driver.js +88 -13
- package/data/build/dist/host/cli-adapters/acp-cli-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/codex-driver.d.ts +10 -0
- package/data/build/dist/host/cli-adapters/codex-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/codex-driver.js +32 -1
- package/data/build/dist/host/cli-adapters/codex-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/command-code-acp-loader.d.ts +6 -5
- package/data/build/dist/host/cli-adapters/command-code-acp-loader.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/command-code-acp-loader.js +72 -12
- package/data/build/dist/host/cli-adapters/command-code-acp-loader.js.map +1 -1
- package/data/build/dist/host/cli-adapters/command-code-driver.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/command-code-driver.js +26 -1
- package/data/build/dist/host/cli-adapters/command-code-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/dsh-message-projector.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/dsh-message-projector.js +15 -2
- package/data/build/dist/host/cli-adapters/dsh-message-projector.js.map +1 -1
- package/data/build/dist/host/cli-adapters/feature.d.ts +13 -0
- package/data/build/dist/host/cli-adapters/feature.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/feature.js +390 -6
- package/data/build/dist/host/cli-adapters/feature.js.map +1 -1
- package/data/build/dist/host/cli-adapters/grok-driver.js +5 -0
- package/data/build/dist/host/cli-adapters/grok-driver.js.map +1 -1
- package/data/build/dist/host/cli-adapters/magpie-detection.d.ts +72 -0
- package/data/build/dist/host/cli-adapters/magpie-detection.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/magpie-detection.js +298 -0
- package/data/build/dist/host/cli-adapters/magpie-detection.js.map +1 -0
- package/data/build/dist/host/cli-adapters/magpie-management.d.ts +50 -0
- package/data/build/dist/host/cli-adapters/magpie-management.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/magpie-management.js +1268 -0
- package/data/build/dist/host/cli-adapters/magpie-management.js.map +1 -0
- package/data/build/dist/host/cli-adapters/magpie-update.d.ts +59 -0
- package/data/build/dist/host/cli-adapters/magpie-update.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/magpie-update.js +249 -0
- package/data/build/dist/host/cli-adapters/magpie-update.js.map +1 -0
- package/data/build/dist/host/cli-adapters/magpie-usage.d.ts +66 -8
- package/data/build/dist/host/cli-adapters/magpie-usage.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/magpie-usage.js +846 -122
- package/data/build/dist/host/cli-adapters/magpie-usage.js.map +1 -1
- package/data/build/dist/host/cli-adapters/magpie-web.d.ts +54 -0
- package/data/build/dist/host/cli-adapters/magpie-web.d.ts.map +1 -0
- package/data/build/dist/host/cli-adapters/magpie-web.js +407 -0
- package/data/build/dist/host/cli-adapters/magpie-web.js.map +1 -0
- package/data/build/dist/host/cli-adapters/process-utils.d.ts +2 -0
- package/data/build/dist/host/cli-adapters/process-utils.d.ts.map +1 -1
- package/data/build/dist/host/cli-adapters/process-utils.js +4 -0
- package/data/build/dist/host/cli-adapters/process-utils.js.map +1 -1
- package/data/build/dist/host/dsh-gateway-feature.d.ts.map +1 -1
- package/data/build/dist/host/dsh-gateway-feature.js +26 -3
- package/data/build/dist/host/dsh-gateway-feature.js.map +1 -1
- package/data/build/dist/host/features/host-status.d.ts +25 -0
- package/data/build/dist/host/features/host-status.d.ts.map +1 -1
- package/data/build/dist/host/features/host-status.js +60 -6
- package/data/build/dist/host/features/host-status.js.map +1 -1
- package/data/build/dist/host/features/lan-access-dsh.d.ts.map +1 -1
- package/data/build/dist/host/features/lan-access-dsh.js +61 -10
- package/data/build/dist/host/features/lan-access-dsh.js.map +1 -1
- package/data/build/dist/host/features/session-translation-protection.d.ts.map +1 -1
- package/data/build/dist/host/features/session-translation-protection.js +2 -1
- package/data/build/dist/host/features/session-translation-protection.js.map +1 -1
- package/data/build/dist/host/lan-access-dsh.d.ts.map +1 -1
- package/data/build/dist/host/lan-access-dsh.js +6 -2
- package/data/build/dist/host/lan-access-dsh.js.map +1 -1
- package/data/build/dist/host/modules/pwa/pwa-session-notifications.js +2 -1
- package/data/build/dist/host/modules/pwa/pwa-session-notifications.js.map +1 -1
- package/data/build/dist/host/rpc.d.ts +15 -2
- package/data/build/dist/host/rpc.d.ts.map +1 -1
- package/data/build/dist/host/rpc.js +47 -6
- package/data/build/dist/host/rpc.js.map +1 -1
- package/data/build/dist/host/settings.d.ts.map +1 -1
- package/data/build/dist/host/settings.js +5 -0
- package/data/build/dist/host/settings.js.map +1 -1
- package/data/build/dist/shared/contracts/config.d.ts +18 -0
- package/data/build/dist/shared/contracts/config.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/config.js +8 -0
- package/data/build/dist/shared/contracts/config.js.map +1 -1
- package/data/build/dist/shared/contracts/errors.d.ts +2 -2
- package/data/build/dist/shared/contracts/feature.d.ts +7 -0
- package/data/build/dist/shared/contracts/feature.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/magpie-management.d.ts +395 -0
- package/data/build/dist/shared/contracts/magpie-management.d.ts.map +1 -0
- package/data/build/dist/shared/contracts/magpie-management.js +2 -0
- package/data/build/dist/shared/contracts/magpie-management.js.map +1 -0
- package/data/build/dist/shared/contracts/subscription.d.ts +75 -1
- package/data/build/dist/shared/contracts/subscription.d.ts.map +1 -1
- package/data/build/dist/shared/contracts/subscription.js.map +1 -1
- package/data/build/dist/shared/contracts/version.d.ts +4 -4
- package/data/build/dist/shared/contracts/version.js +3 -3
- package/data/build/dist/shared/index.d.ts +2 -1
- package/data/build/dist/shared/index.d.ts.map +1 -1
- package/data/build/dist/shared/index.js +1 -1
- package/data/build/dist/shared/index.js.map +1 -1
- package/data/build/dist/shared/session-title.d.ts.map +1 -1
- package/data/build/dist/shared/session-title.js +10 -4
- package/data/build/dist/shared/session-title.js.map +1 -1
- package/package.json +29 -29
- package/profile/README.md +2 -2
- package/profile/package.json +3 -3
- package/profile/version.json +3 -3
- package/version.json +3 -3
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import { access, constants, readdir, stat } from 'node:fs/promises';
|
|
2
|
+
import { win32, join } from 'node:path';
|
|
3
|
+
import { commandEnvironment, invalidateCommandEnvironment, resolveCommandPath, resolvedCommandPathEntries, runAsyncCommand, WINDOWS, windowsShellInvocation } from './process-utils.js';
|
|
4
|
+
import { spawnSync } from 'node:child_process';
|
|
5
|
+
const MAGPIE_COMMAND = 'magpie';
|
|
6
|
+
const DETECTION_TIMEOUT_MS = 5_000;
|
|
7
|
+
const MAX_VERSION_OUTPUT_BYTES = 256;
|
|
8
|
+
/** 设置页每次渲染都可能读取探测结果;已安装结果短期复用,避免反复拉起 CLI 进程。 */
|
|
9
|
+
const MAX_DETECTION_CACHE_MS = 30_000;
|
|
10
|
+
/** 本机 PATH 里的可执行入口;Windows 上 npm 生成的无扩展名 POSIX shim 不执行。 */
|
|
11
|
+
const EXECUTABLE_ENTRY = /\.(?:exe|com|cmd|bat)$/iu;
|
|
12
|
+
const WINDOWS_LAUNCHER_NAMES = ['magpie.exe', 'magpie.cmd', 'magpie.bat'];
|
|
13
|
+
/** macOS/Linux 包管理器与手动安装的常见目录;只在 PATH 未命中时补充探测。 */
|
|
14
|
+
const POSIX_COMMON_BIN_DIRS = ['/opt/homebrew/bin', '/usr/local/bin', '/opt/local/bin'];
|
|
15
|
+
/**
|
|
16
|
+
* 本机 Magpie 安装探测。
|
|
17
|
+
*
|
|
18
|
+
* 两条平台路径刻意分开:
|
|
19
|
+
* - macOS/Linux:登录 Shell 的完整 PATH(覆盖 Homebrew、nvm、fnm、volta 等用户目录),
|
|
20
|
+
* 再用常见 bin 目录兜底;入口必须是可执行文件。
|
|
21
|
+
* - Windows:`where.exe` 命中的 `.exe/.cmd/.bat` 优先(npm 全局包只有 `.cmd`),
|
|
22
|
+
* 再补 USERPROFILE / APPDATA / LOCALAPPDATA 下的 npm、pnpm、Bun、Volta 全局目录,
|
|
23
|
+
* 以及可能不在 PATH 上的独立安装目录。无扩展名 shim 不执行。
|
|
24
|
+
*/
|
|
25
|
+
export class MagpieInstallDetectionService {
|
|
26
|
+
platform;
|
|
27
|
+
environment;
|
|
28
|
+
resolvePath;
|
|
29
|
+
runVersion;
|
|
30
|
+
listDirectory;
|
|
31
|
+
isExecutable;
|
|
32
|
+
now;
|
|
33
|
+
pathEntries;
|
|
34
|
+
customCommand;
|
|
35
|
+
/** 上次结果;只缓存“已安装”,未安装必须每次重新探测,否则装完还要等缓存过期。 */
|
|
36
|
+
cached = null;
|
|
37
|
+
constructor(options = {}) {
|
|
38
|
+
this.platform = options.platform ?? process.platform;
|
|
39
|
+
this.environment = options.environment ?? process.env;
|
|
40
|
+
this.resolvePath = options.resolvePath ?? ((command, platform) => resolveCommandPathForPlatform(command, platform));
|
|
41
|
+
this.runVersion = options.runVersion ?? ((command, platform) => runMagpieVersion(command, platform));
|
|
42
|
+
this.listDirectory = options.listDirectory ?? defaultListDirectory;
|
|
43
|
+
this.isExecutable = options.isExecutable ?? defaultIsExecutable;
|
|
44
|
+
this.now = options.now ?? Date.now;
|
|
45
|
+
this.pathEntries = options.pathEntries ?? resolvedCommandPathEntries;
|
|
46
|
+
this.customCommand = normalizeCustomCommand(options.customCommand);
|
|
47
|
+
}
|
|
48
|
+
/** 探测本机 Magpie;`force` 表示用户点了“重新检测”,跳过短期缓存。 */
|
|
49
|
+
async detect(request = {}, options = {}) {
|
|
50
|
+
const custom = normalizeCustomCommand(request.commandPath) ?? this.customCommand;
|
|
51
|
+
const key = custom ?? '';
|
|
52
|
+
const cached = this.cached;
|
|
53
|
+
if (cached !== null && cached.key === key && options.force !== true
|
|
54
|
+
&& (custom !== null || this.now() - cached.readAt < MAX_DETECTION_CACHE_MS)) {
|
|
55
|
+
return cached.detection;
|
|
56
|
+
}
|
|
57
|
+
// 手动重新检测要求重新读取登录 Shell 与注册表环境,否则新装的 CLI 仍可能不可见。
|
|
58
|
+
if (options.force === true)
|
|
59
|
+
invalidateCommandEnvironment();
|
|
60
|
+
const detection = custom === null
|
|
61
|
+
? await this.detectAutomatic()
|
|
62
|
+
: await this.detectCandidate(custom, 'custom');
|
|
63
|
+
this.cached = { key, detection, readAt: this.now() };
|
|
64
|
+
return detection;
|
|
65
|
+
}
|
|
66
|
+
/** 启用前使用:入口必须能运行并返回可识别的版本,否则允许的结论不成立。 */
|
|
67
|
+
static isUsable(detection) {
|
|
68
|
+
return detection.installed && detection.command !== null && detection.version !== null;
|
|
69
|
+
}
|
|
70
|
+
async detectAutomatic() {
|
|
71
|
+
const candidates = await this.collectCandidates();
|
|
72
|
+
let failure = null;
|
|
73
|
+
for (const candidate of candidates) {
|
|
74
|
+
const detection = await this.detectCandidate(candidate.command, candidate.source);
|
|
75
|
+
if (detection.installed)
|
|
76
|
+
return detection;
|
|
77
|
+
if (detection.reason !== null && failure === null)
|
|
78
|
+
failure = { command: candidate.command, reason: detection.reason };
|
|
79
|
+
}
|
|
80
|
+
if (failure === null)
|
|
81
|
+
return this.result({ installed: false, source: null, command: null, version: null, reason: null });
|
|
82
|
+
// 入口存在却跑不起来:仍报告入口,让设置页能给出“已安装但不可用”的具体原因,
|
|
83
|
+
// 而不是笼统的“未安装”。
|
|
84
|
+
return this.result({ installed: true, source: null, command: failure.command, version: null, reason: failure.reason });
|
|
85
|
+
}
|
|
86
|
+
async detectCandidate(command, source) {
|
|
87
|
+
const result = await this.runVersion(command, this.platform);
|
|
88
|
+
if (result === null)
|
|
89
|
+
return this.result({ installed: false, source: null, command: null, version: null, reason: null });
|
|
90
|
+
const version = parseMagpieVersion(result.status, result.stdout, result.stderr);
|
|
91
|
+
if (version !== null)
|
|
92
|
+
return this.result({ installed: true, source, command, version, reason: null });
|
|
93
|
+
const reason = result.timedOut
|
|
94
|
+
? 'timeout'
|
|
95
|
+
: result.status === 0 && parseAnyVersion(`${result.stdout}\n${result.stderr}`) === null ? 'version' : 'launch';
|
|
96
|
+
return this.result({ installed: true, source, command, version: null, reason });
|
|
97
|
+
}
|
|
98
|
+
/** 按平台给出候选入口;顺序即优先级,先把能直接运行的入口排在前面。 */
|
|
99
|
+
async collectCandidates() {
|
|
100
|
+
const resolved = await this.resolvePath(MAGPIE_COMMAND, this.platform);
|
|
101
|
+
const ordered = [];
|
|
102
|
+
if (resolved !== null)
|
|
103
|
+
ordered.push({ command: resolved, source: 'path' });
|
|
104
|
+
for (const candidate of this.platform === 'win32' ? await this.windowsCandidates() : await this.posixCandidates()) {
|
|
105
|
+
if (!ordered.some((entry) => sameCommand(entry.command, candidate)))
|
|
106
|
+
ordered.push({ command: candidate, source: 'common-location' });
|
|
107
|
+
}
|
|
108
|
+
return ordered;
|
|
109
|
+
}
|
|
110
|
+
async posixCandidates() {
|
|
111
|
+
const directories = [
|
|
112
|
+
// 登录 Shell 的完整 PATH:覆盖 Homebrew、nvm、fnm、volta 等只在 rc 文件里追加的目录。
|
|
113
|
+
...this.pathEntries().split(':'),
|
|
114
|
+
...POSIX_COMMON_BIN_DIRS,
|
|
115
|
+
...(this.environment.HOME === undefined ? [] : [
|
|
116
|
+
join(this.environment.HOME, '.local', 'bin'),
|
|
117
|
+
join(this.environment.HOME, '.bun', 'bin'),
|
|
118
|
+
join(this.environment.HOME, '.npm-global', 'bin'),
|
|
119
|
+
]),
|
|
120
|
+
];
|
|
121
|
+
const candidates = [];
|
|
122
|
+
for (const directory of uniqueDirectories(directories)) {
|
|
123
|
+
const command = join(directory, MAGPIE_COMMAND);
|
|
124
|
+
if (await this.isExecutable(command, this.platform))
|
|
125
|
+
candidates.push(command);
|
|
126
|
+
}
|
|
127
|
+
return candidates;
|
|
128
|
+
}
|
|
129
|
+
async windowsCandidates() {
|
|
130
|
+
// 注入 Windows 平台时也要拼出 Windows 风格路径,不能用宿主(可能是 POSIX)的 join。
|
|
131
|
+
const root = this.platform === 'win32' && process.platform !== 'win32' ? (value) => value : (value) => win32.normalize(value);
|
|
132
|
+
const home = this.environment.USERPROFILE;
|
|
133
|
+
const appData = this.environment.APPDATA;
|
|
134
|
+
const localAppData = this.environment.LOCALAPPDATA;
|
|
135
|
+
const directories = [
|
|
136
|
+
...(appData === undefined ? [] : [root(`${appData}\\npm`), root(`${appData}\\pnpm`)]),
|
|
137
|
+
...(localAppData === undefined ? [] : [
|
|
138
|
+
root(`${localAppData}\\pnpm`),
|
|
139
|
+
root(`${localAppData}\\Volta\\bin`),
|
|
140
|
+
root(`${localAppData}\\Microsoft\\WinGet\\Links`),
|
|
141
|
+
root(`${localAppData}\\Programs\\Magpie`),
|
|
142
|
+
]),
|
|
143
|
+
...(home === undefined ? [] : [
|
|
144
|
+
root(`${home}\\.bun\\bin`),
|
|
145
|
+
root(`${home}\\.cargo\\bin`),
|
|
146
|
+
root(`${home}\\scoop\\shims`),
|
|
147
|
+
]),
|
|
148
|
+
];
|
|
149
|
+
const candidates = [];
|
|
150
|
+
for (const directory of uniqueDirectories(directories)) {
|
|
151
|
+
candidates.push(...await launchersIn(directory, this.listDirectory));
|
|
152
|
+
}
|
|
153
|
+
return candidates;
|
|
154
|
+
}
|
|
155
|
+
result(value) {
|
|
156
|
+
return {
|
|
157
|
+
installed: value.installed,
|
|
158
|
+
platform: hostPlatform(this.platform),
|
|
159
|
+
source: value.source,
|
|
160
|
+
command: value.command,
|
|
161
|
+
version: value.version,
|
|
162
|
+
reason: value.reason,
|
|
163
|
+
checkedAt: new Date(this.now()).toISOString(),
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/** 解析并规范化用户手工填写的入口;只接受绝对路径,拒绝参数与裸命令名。 */
|
|
168
|
+
export function normalizeCustomCommand(commandPath) {
|
|
169
|
+
if (typeof commandPath !== 'string')
|
|
170
|
+
return null;
|
|
171
|
+
const value = commandPath.trim();
|
|
172
|
+
if (value === '' || value.length > 4096)
|
|
173
|
+
return null;
|
|
174
|
+
if (!/^(?:[A-Za-z]:[\\/]|\\\\|\/)/u.test(value))
|
|
175
|
+
return null;
|
|
176
|
+
// 空白与 shell 元字符都可能把“路径”拆成多个参数或触发展开。
|
|
177
|
+
if (/[\u0000-\u001f\u007f]|["'`$;&|<>\s]/u.test(value))
|
|
178
|
+
return null;
|
|
179
|
+
return value;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* 解析 `magpie --version` 的输出。
|
|
183
|
+
*
|
|
184
|
+
* 只接受 256 字节以内的输出和「magpie <semver>」这一种形态:Magpie 目前输出纯版本号,
|
|
185
|
+
* 解析失败时按“版本不支持”拒绝启用,而不是猜测。
|
|
186
|
+
*/
|
|
187
|
+
export function parseMagpieVersion(status, stdout, stderr) {
|
|
188
|
+
if (status !== 0)
|
|
189
|
+
return null;
|
|
190
|
+
const combined = `${stdout}\n${stderr}`.trim();
|
|
191
|
+
if (Buffer.byteLength(combined, 'utf8') > MAX_VERSION_OUTPUT_BYTES)
|
|
192
|
+
return null;
|
|
193
|
+
return combined.match(/^magpie\s+v?(\d+\.\d+\.\d+)$/u)?.[1] ?? null;
|
|
194
|
+
}
|
|
195
|
+
function parseAnyVersion(output) {
|
|
196
|
+
return output.match(/\d+\.\d+\.\d+/u)?.[0] ?? null;
|
|
197
|
+
}
|
|
198
|
+
function hostPlatform(platform) {
|
|
199
|
+
if (platform === 'darwin')
|
|
200
|
+
return 'macos';
|
|
201
|
+
if (platform === 'win32')
|
|
202
|
+
return 'windows';
|
|
203
|
+
return 'linux';
|
|
204
|
+
}
|
|
205
|
+
function sameCommand(left, right) {
|
|
206
|
+
return WINDOWS ? left.toLowerCase() === right.toLowerCase() : left === right;
|
|
207
|
+
}
|
|
208
|
+
/** PATH 里常见的占位目录(空串、`.`)不参与探测,避免把当前目录当成安装位置。 */
|
|
209
|
+
function uniqueDirectories(directories) {
|
|
210
|
+
const seen = new Set();
|
|
211
|
+
const unique = [];
|
|
212
|
+
for (const raw of directories) {
|
|
213
|
+
const directory = raw.trim();
|
|
214
|
+
if (directory === '' || directory === '.')
|
|
215
|
+
continue;
|
|
216
|
+
const key = WINDOWS ? directory.toLowerCase() : directory;
|
|
217
|
+
if (seen.has(key))
|
|
218
|
+
continue;
|
|
219
|
+
seen.add(key);
|
|
220
|
+
unique.push(directory);
|
|
221
|
+
}
|
|
222
|
+
return unique;
|
|
223
|
+
}
|
|
224
|
+
/** Windows 目录里可启动的 Magpie 入口;`.cmd`/`.bat` 由 shell 包装执行。 */
|
|
225
|
+
async function launchersIn(directory, listDirectory) {
|
|
226
|
+
let entries;
|
|
227
|
+
try {
|
|
228
|
+
entries = await listDirectory(directory);
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
return [];
|
|
232
|
+
}
|
|
233
|
+
const byName = new Map(entries.map((entry) => [entry.toLowerCase(), entry]));
|
|
234
|
+
return WINDOWS_LAUNCHER_NAMES
|
|
235
|
+
.map((name) => byName.get(name))
|
|
236
|
+
.filter((entry) => entry !== undefined && EXECUTABLE_ENTRY.test(entry))
|
|
237
|
+
.map((entry) => win32.join(directory, entry));
|
|
238
|
+
}
|
|
239
|
+
async function defaultListDirectory(directory) {
|
|
240
|
+
return readdir(directory);
|
|
241
|
+
}
|
|
242
|
+
async function defaultIsExecutable(path, platform) {
|
|
243
|
+
try {
|
|
244
|
+
if (!(await stat(path)).isFile())
|
|
245
|
+
return false;
|
|
246
|
+
await access(path, platform === 'win32' ? constants.F_OK : constants.X_OK);
|
|
247
|
+
return true;
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
return false;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* 按平台解析命令;生产环境的 `resolveCommandPath` 读取真实平台,因此注入
|
|
255
|
+
* 其他平台时退回显式探测,保证测试不触发宿主登录 Shell。
|
|
256
|
+
*/
|
|
257
|
+
async function resolveCommandPathForPlatform(command, platform) {
|
|
258
|
+
if (platform === process.platform)
|
|
259
|
+
return resolveCommandPath(command);
|
|
260
|
+
if (platform === 'win32') {
|
|
261
|
+
const root = (process.env.SystemRoot ?? process.env.WINDIR ?? 'C:\\Windows');
|
|
262
|
+
const whereExe = `${root}\\System32\\where.exe`;
|
|
263
|
+
if (!(await defaultIsExecutable(whereExe, 'win32')))
|
|
264
|
+
return null;
|
|
265
|
+
const result = await runAsyncCommand(spawnSync, whereExe, [command], { timeout: 3_000, encoding: 'utf8' }).catch(() => null);
|
|
266
|
+
const hit = `${result?.stdout ?? ''}`.split(/\r?\n/u).map((line) => line.trim()).find((line) => EXECUTABLE_ENTRY.test(line));
|
|
267
|
+
return hit ?? null;
|
|
268
|
+
}
|
|
269
|
+
return null;
|
|
270
|
+
}
|
|
271
|
+
/** 直接运行入口的 `--version`;`.cmd`/`.bat` 在 Windows 上必须经 shell 启动。 */
|
|
272
|
+
async function runMagpieVersion(command, platform) {
|
|
273
|
+
try {
|
|
274
|
+
await access(command, constants.F_OK);
|
|
275
|
+
}
|
|
276
|
+
catch {
|
|
277
|
+
return null;
|
|
278
|
+
}
|
|
279
|
+
try {
|
|
280
|
+
const shell = platform === 'win32' && /\.(?:cmd|bat)$/iu.test(command);
|
|
281
|
+
const invocation = shell ? windowsShellInvocation(command, ['--version']) : { command, args: ['--version'] };
|
|
282
|
+
const result = await runAsyncCommand(spawnSync, invocation.command, [...invocation.args], {
|
|
283
|
+
timeout: DETECTION_TIMEOUT_MS,
|
|
284
|
+
encoding: 'utf8',
|
|
285
|
+
shell: false,
|
|
286
|
+
windowsHide: true,
|
|
287
|
+
env: { ...commandEnvironment(invocation.command), NO_COLOR: '1', FORCE_COLOR: '0' },
|
|
288
|
+
...(shell && WINDOWS ? { windowsVerbatimArguments: true } : {}),
|
|
289
|
+
});
|
|
290
|
+
const error = result.error;
|
|
291
|
+
const timedOut = error?.killed === true || error?.code === 'ETIMEDOUT' || result.signal !== null;
|
|
292
|
+
return { status: result.status, stdout: `${result.stdout ?? ''}`, stderr: `${result.stderr ?? ''}`, timedOut };
|
|
293
|
+
}
|
|
294
|
+
catch {
|
|
295
|
+
return null;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
//# sourceMappingURL=magpie-detection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"magpie-detection.js","sourceRoot":"","sources":["../../../../../src/host/cli-adapters/magpie-detection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { MagpieAccountManagementUpdate, MagpieAccountManagementRecord, MagpieManagementMutationResult, MagpieManagementSnapshot, MagpieProviderManagementRecord, MagpieProviderManagementUpdate, MagpieRoutingGroupManagementRecord, MagpieRoutingGroupManagementUpdate } from '../../shared/contracts/magpie-management.js';
|
|
2
|
+
import { MagpieWebService } from './magpie-web.js';
|
|
3
|
+
export interface MagpieManagementServiceOptions {
|
|
4
|
+
readonly webApi?: Pick<MagpieWebService, 'requestJson'> & Partial<Pick<MagpieWebService, 'requestAssetDataUrl'>>;
|
|
5
|
+
readonly now?: () => number;
|
|
6
|
+
}
|
|
7
|
+
/** Provider, account, and routing-group panels use the authenticated Magpie Web API only. */
|
|
8
|
+
export declare class MagpieManagementService {
|
|
9
|
+
private readonly webApi;
|
|
10
|
+
private readonly now;
|
|
11
|
+
private mutationTail;
|
|
12
|
+
private snapshotCache;
|
|
13
|
+
private snapshotRefresh;
|
|
14
|
+
private readonly providerLogoCache;
|
|
15
|
+
constructor(options?: MagpieManagementServiceOptions);
|
|
16
|
+
readSnapshot(signal?: AbortSignal): Promise<MagpieManagementSnapshot>;
|
|
17
|
+
updateProvider(input: unknown, signal?: AbortSignal): Promise<MagpieManagementMutationResult>;
|
|
18
|
+
updateGroup(input: unknown, signal?: AbortSignal): Promise<MagpieManagementMutationResult>;
|
|
19
|
+
updateAccount(input: unknown, signal?: AbortSignal): Promise<MagpieManagementMutationResult>;
|
|
20
|
+
private enqueueMutation;
|
|
21
|
+
private readWebState;
|
|
22
|
+
private refreshSnapshot;
|
|
23
|
+
private remember;
|
|
24
|
+
private readApi;
|
|
25
|
+
private requestApi;
|
|
26
|
+
/**
|
|
27
|
+
* Inline each provider's Magpie icon, as the subscription page does for its provider cards.
|
|
28
|
+
*
|
|
29
|
+
* Provider rows carry the same `icon` field `/api/usage/quotas` does (`claude-color`,
|
|
30
|
+
* `file:<name>`), so the three views show one logo from one source. A missing icon only
|
|
31
|
+
* costs that row its logo: the Client still falls back to its own icon table.
|
|
32
|
+
*/
|
|
33
|
+
private attachProviderLogos;
|
|
34
|
+
private readProviderLogoDataUrl;
|
|
35
|
+
}
|
|
36
|
+
export declare function parseMagpieWebProviders(value: unknown): {
|
|
37
|
+
readonly records: readonly MagpieProviderManagementRecord[];
|
|
38
|
+
readonly raw: readonly Record<string, unknown>[];
|
|
39
|
+
readonly partial: boolean;
|
|
40
|
+
readonly writesSafe: boolean;
|
|
41
|
+
} | null;
|
|
42
|
+
export declare function parseMagpieWebGroups(value: unknown): {
|
|
43
|
+
readonly groups: readonly MagpieRoutingGroupManagementRecord[];
|
|
44
|
+
readonly raw: readonly Record<string, unknown>[];
|
|
45
|
+
} | null;
|
|
46
|
+
export declare function parseMagpieWebAccounts(quotaValue: unknown, loginUsageValue: unknown, providerValue?: unknown): readonly MagpieAccountManagementRecord[] | null;
|
|
47
|
+
export declare function readProviderUpdate(value: unknown): MagpieProviderManagementUpdate;
|
|
48
|
+
export declare function readGroupUpdate(value: unknown): MagpieRoutingGroupManagementUpdate;
|
|
49
|
+
export declare function readAccountUpdate(value: unknown): MagpieAccountManagementUpdate;
|
|
50
|
+
//# sourceMappingURL=magpie-management.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"magpie-management.d.ts","sourceRoot":"","sources":["../../../../../src/host/cli-adapters/magpie-management.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,6BAA6B,EAC7B,6BAA6B,EAE7B,8BAA8B,EAC9B,wBAAwB,EAGxB,8BAA8B,EAC9B,8BAA8B,EAE9B,kCAAkC,EAClC,kCAAkC,EAEnC,MAAM,6CAA6C,CAAA;AACpD,OAAO,EAAE,gBAAgB,EAAgC,MAAM,iBAAiB,CAAA;AAiChF,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,aAAa,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,qBAAqB,CAAC,CAAC,CAAA;IAChH,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CAC5B;AAWD,6FAA6F;AAC7F,qBAAa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0C;IACjE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAc;IAClC,OAAO,CAAC,YAAY,CAAmC;IAEvD,OAAO,CAAC,aAAa,CAAqF;IAC1G,OAAO,CAAC,eAAe,CAA+C;IACtE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAmC;gBACzD,OAAO,GAAE,8BAAmC;IAKlD,YAAY,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAYrE,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,8BAA8B,CAAC;IA+C7F,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,8BAA8B,CAAC;IAgC1F,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,8BAA8B,CAAC;IA4BlG,OAAO,CAAC,eAAe;YAMT,YAAY;IA0C1B,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,QAAQ;YAIF,OAAO;YAUP,UAAU;IAKxB;;;;;;OAMG;YACW,mBAAmB;YAuBnB,uBAAuB;CAatC;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG;IACvD,QAAQ,CAAC,OAAO,EAAE,SAAS,8BAA8B,EAAE,CAAA;IAC3D,QAAQ,CAAC,GAAG,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IAChD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;CAC7B,GAAG,IAAI,CA0BP;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG;IACpD,QAAQ,CAAC,MAAM,EAAE,SAAS,kCAAkC,EAAE,CAAA;IAC9D,QAAQ,CAAC,GAAG,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;CACjD,GAAG,IAAI,CAcP;AAED,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,OAAO,EACnB,eAAe,EAAE,OAAO,EACxB,aAAa,GAAE,OAAc,GAC5B,SAAS,6BAA6B,EAAE,GAAG,IAAI,CAgBjD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,8BAA8B,CAwBjF;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,kCAAkC,CAqClF;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,6BAA6B,CAU/E"}
|