@ljwei-stak/dsh-model-router 0.21.0 → 0.21.1
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/.dsh-plugin/client.js +18 -12
- package/.dsh-plugin/shared/official-tool-registry.mjs +5 -3
- package/.dsh-plugin/shared/official-tools-runtime.mjs +1 -0
- package/.dsh-plugin/shared/tool-install-preferences.mjs +11 -3
- package/CHANGELOG.md +7 -0
- package/README.i18n.yaml +2 -2
- package/README.md +5 -5
- package/README.zh.md +5 -5
- package/docs/INSTALLATION_GUIDE.zh.md +12 -12
- package/docs/WORKBENCH_USER_GUIDE.zh.md +5 -3
- package/package.json +1 -1
package/.dsh-plugin/client.js
CHANGED
|
@@ -504,7 +504,7 @@ var OFFICIAL_TOOLS = Object.freeze([
|
|
|
504
504
|
installArgs: [],
|
|
505
505
|
uninstallArgs: [],
|
|
506
506
|
probeExecutables: ["hermes"],
|
|
507
|
-
probeNote: "\u652F\u6301\u5B98\u65B9\u6E90\u7801\u811A\u672C\u5B89\u88C5\uFF1B\
|
|
507
|
+
probeNote: "\u652F\u6301\u5B98\u65B9\u6E90\u7801\u811A\u672C\u5B89\u88C5\uFF1B\u81EA\u5B9A\u4E49\u6E90\u7801\u5B89\u88C5\u5230\u7EDF\u4E00\u6839/hermes-agent\uFF0C\u63D2\u4EF6\u4F7F\u7528\u8BE5\u6E90\u7801\u7684 .hermes/bin \u5165\u53E3\u3002\u914D\u7F6E\u3001\u767B\u5F55\u548C\u5386\u53F2\u4FDD\u7559\u539F\u4F4D\u7F6E\u3002\u684C\u9762/MSIX \u522B\u540D\u6682\u4E0D\u7528\u4E8E\u6B64\u5165\u53E3\u3002\u767B\u5F55\u4F7F\u7528 hermes auth\u3002",
|
|
508
508
|
providerHints: ["hermes", "nousresearch"],
|
|
509
509
|
scriptBinaryNames: Object.freeze(["hermes", "hermes.exe"]),
|
|
510
510
|
installMethods: Object.freeze([
|
|
@@ -512,8 +512,11 @@ var OFFICIAL_TOOLS = Object.freeze([
|
|
|
512
512
|
shell: "bash",
|
|
513
513
|
scriptUrl: "https://hermes-agent.nousresearch.com/install.sh",
|
|
514
514
|
platforms: ["linux", "darwin"],
|
|
515
|
-
supportsInstallDir:
|
|
515
|
+
supportsInstallDir: true,
|
|
516
516
|
sharedDefaultBin: true,
|
|
517
|
+
installDirSubdir: "hermes-agent",
|
|
518
|
+
installDirSuffix: ".hermes/bin",
|
|
519
|
+
installArg: ["--dir"],
|
|
517
520
|
extraArgs: ["--non-interactive"],
|
|
518
521
|
verify: Object.freeze({ mustInclude: ["https://github.com/NousResearch/hermes-agent.git", "hermes_cli/source_completion.py"] }),
|
|
519
522
|
uninstallUnsupportedReason: "\u8BF7\u5728\u5B98\u65B9\u5DE5\u5177\u7EC8\u7AEF\u8FD0\u884C hermes uninstall \u5378\u8F7D\u6E90\u7801\u5B89\u88C5\uFF1B\u4FDD\u7559\u914D\u7F6E\u4E0E\u5386\u53F2\u65F6\u6309\u5411\u5BFC\u9009\u62E9\u3002\u684C\u9762/MSIX \u5B89\u88C5\u8BF7\u4F7F\u7528\u7CFB\u7EDF\u5E94\u7528\u7BA1\u7406\u3002"
|
|
@@ -522,7 +525,10 @@ var OFFICIAL_TOOLS = Object.freeze([
|
|
|
522
525
|
shell: "powershell",
|
|
523
526
|
scriptUrl: "https://hermes-agent.nousresearch.com/install.ps1",
|
|
524
527
|
platforms: ["win32"],
|
|
525
|
-
supportsInstallDir:
|
|
528
|
+
supportsInstallDir: true,
|
|
529
|
+
installDirSubdir: "hermes-agent",
|
|
530
|
+
installDirSuffix: ".hermes/bin",
|
|
531
|
+
installArg: ["-InstallDir"],
|
|
526
532
|
extraArgs: ["-NonInteractive"],
|
|
527
533
|
verify: Object.freeze({ mustInclude: ["https://github.com/NousResearch/hermes-agent.git", "hermes_cli/source_completion.py"] }),
|
|
528
534
|
uninstallUnsupportedReason: "\u8BF7\u5728\u5B98\u65B9\u5DE5\u5177\u7EC8\u7AEF\u8FD0\u884C hermes uninstall \u5378\u8F7D\u6E90\u7801\u5B89\u88C5\uFF1B\u4FDD\u7559\u914D\u7F6E\u4E0E\u5386\u53F2\u65F6\u6309\u5411\u5BFC\u9009\u62E9\u3002\u684C\u9762/MSIX \u5B89\u88C5\u8BF7\u4F7F\u7528\u7CFB\u7EDF\u5E94\u7528\u7BA1\u7406\u3002"
|
|
@@ -12864,7 +12870,7 @@ var xterm_default = `/**
|
|
|
12864
12870
|
`;
|
|
12865
12871
|
|
|
12866
12872
|
// .dsh-plugin/client/host-version.mjs
|
|
12867
|
-
var ROUTER_CLIENT_VERSION = true ? "0.21.
|
|
12873
|
+
var ROUTER_CLIENT_VERSION = true ? "0.21.1" : "";
|
|
12868
12874
|
var STALE_HOST_MESSAGE = "\u63D2\u4EF6\u540E\u53F0\u7248\u672C\u8F83\u65E7\uFF0C\u8BF7\u5B8C\u5168\u9000\u51FA\u5E76\u91CD\u542F Harness\uFF08\u5305\u62EC\u6258\u76D8\u56FE\u6807\uFF09\u540E\u518D\u4F7F\u7528\u3002";
|
|
12869
12875
|
function isMissingRemoteMethod(message) {
|
|
12870
12876
|
const value = String(message ?? "");
|
|
@@ -14575,7 +14581,14 @@ function RouterMainPage({ loadCatalog, settingsScope, listOfficialTools, loadOff
|
|
|
14575
14581
|
void workbench.rerun(runId, packageId, override, choice);
|
|
14576
14582
|
}
|
|
14577
14583
|
}
|
|
14578
|
-
)), /* @__PURE__ */ import_react5.default.createElement("div", { className: "mr-view", role: "tabpanel", id: "mr-panel-models", "aria-labelledby": "mr-tab-models", hidden: view !== "models" }, /* @__PURE__ */ import_react5.default.createElement("div", { className: "mr-view-heading" }, /* @__PURE__ */ import_react5.default.createElement("h2", null, "\u6A21\u578B\u914D\u7F6E"), /* @__PURE__ */ import_react5.default.createElement("p", null, "\u4ECE\u5B98\u65B9\u76EE\u5F55\u9009\u62E9\u8DEF\u7EBF\uFF0C\u8865\u9F50\u6BD4\u8F83\u6240\u9700\u7684\u4EF7\u683C\u3001\u80FD\u529B\u4E0E\u6267\u884C\u65B9\u5F0F\u3002")), /* @__PURE__ */ import_react5.default.createElement("div", { className: "mr-grid mr-model-grid" }, /* @__PURE__ */ import_react5.default.createElement(ModelProfileEditor, { routes, settingsScope, onSaved: invalidatePlan }), /* @__PURE__ */ import_react5.default.createElement("section", { className: "mr-card", "aria-label": "\u6A21\u578B\u76EE\u5F55" }, /* @__PURE__ */ import_react5.default.createElement("div", { className: "mr-card-head" }, /* @__PURE__ */ import_react5.default.createElement("div", null, /* @__PURE__ */ import_react5.default.createElement("h2", { className: "mr-card-title" }, "\u6A21\u578B\u76EE\u5F55"), /* @__PURE__ */ import_react5.default.createElement("p", { className: "mr-card-copy" }, routes.length, " \u6761\u8DEF\u7EBF \xB7 \u53EA\u8BFB\u53D6\u5B98\u65B9\u76EE\u5F55\uFF0C\u4E0D\u8BFB\u53D6 API Key\u3002")), /* @__PURE__ */ import_react5.default.createElement("button", { className: "mr-button mr-button-secondary", type: "button", disabled: catalogState.status === "loading", onClick: refresh }, "\u5237\u65B0")), /* @__PURE__ */ import_react5.default.createElement("div", { className: "mr-card-body" }, catalogState.status === "error" && /* @__PURE__ */ import_react5.default.createElement("div", { className: "mr-error", role: "alert" }, catalogState.error), catalogState.status === "loading" && /* @__PURE__ */ import_react5.default.createElement("div", { className: "mr-empty" }, "\u6B63\u5728\u52A0\u8F7D\u5B98\u65B9\u6A21\u578B\u76EE\u5F55\u2026"), catalogState.status === "ready" && /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, null, /* @__PURE__ */ import_react5.default.createElement("label", { className: "mr-label", htmlFor: "mr-model-search" }, "\u641C\u7D22\u8DEF\u7EBF"), /* @__PURE__ */ import_react5.default.createElement("input", { className: "mr-input mr-search", id: "mr-model-search", value: query, onChange: (event) => setQuery(event.target.value), placeholder: "\u6A21\u578B\u6216\u4F9B\u5E94\u5546" }), /* @__PURE__ */ import_react5.default.createElement(RouteList, { routes, query }), catalogState.catalog?.failures?.length > 0 && /* @__PURE__ */ import_react5.default.createElement("p", { className: "mr-caption" }, catalogState.catalog.failures.length, " \u4E2A\u4F9B\u5E94\u5546\u7684\u76EE\u5F55\u8BFB\u53D6\u5931\u8D25\uFF0C\u8BF7\u5728\u5B98\u65B9\u6A21\u578B\u9875\u68C0\u67E5\u914D\u7F6E\u3002")), /* @__PURE__ */ import_react5.default.createElement("p", { className: "mr-caption", style: { marginTop: 13 } }, "\u76EE\u5F55\u767B\u8BB0\u4E0D\u4EE3\u8868\u51ED\u636E\u6216\u7F51\u7EDC\u5F53\u524D\u53EF\u7528\uFF1B\u56FE\u50CF\u80FD\u529B\u9700\u8981\u5728\u5B9E\u9645\u4F7F\u7528\u524D\u6838\u5BF9\u3002"))))), /* @__PURE__ */ import_react5.default.createElement("div", { className: "mr-view mr-stack", role: "tabpanel", id: "mr-panel-tools", "aria-labelledby": "mr-tab-tools", hidden: view !== "tools" }, /* @__PURE__ */ import_react5.default.createElement("div", { className: "mr-view-heading" }, /* @__PURE__ */ import_react5.default.createElement("h2", null, "\u5B98\u65B9\u5DE5\u5177"), /* @__PURE__ */ import_react5.default.createElement("p", null, "\u7BA1\u7406\u672C\u673A CLI\u3001\u68C0\u67E5\u767B\u5F55\u72B6\u6001\uFF0C\u6216\u6253\u5F00\u4EA4\u4E92\u5F0F\u7EC8\u7AEF\u3002")),
|
|
14584
|
+
)), /* @__PURE__ */ import_react5.default.createElement("div", { className: "mr-view", role: "tabpanel", id: "mr-panel-models", "aria-labelledby": "mr-tab-models", hidden: view !== "models" }, /* @__PURE__ */ import_react5.default.createElement("div", { className: "mr-view-heading" }, /* @__PURE__ */ import_react5.default.createElement("h2", null, "\u6A21\u578B\u914D\u7F6E"), /* @__PURE__ */ import_react5.default.createElement("p", null, "\u4ECE\u5B98\u65B9\u76EE\u5F55\u9009\u62E9\u8DEF\u7EBF\uFF0C\u8865\u9F50\u6BD4\u8F83\u6240\u9700\u7684\u4EF7\u683C\u3001\u80FD\u529B\u4E0E\u6267\u884C\u65B9\u5F0F\u3002")), /* @__PURE__ */ import_react5.default.createElement("div", { className: "mr-grid mr-model-grid" }, /* @__PURE__ */ import_react5.default.createElement(ModelProfileEditor, { routes, settingsScope, onSaved: invalidatePlan }), /* @__PURE__ */ import_react5.default.createElement("section", { className: "mr-card", "aria-label": "\u6A21\u578B\u76EE\u5F55" }, /* @__PURE__ */ import_react5.default.createElement("div", { className: "mr-card-head" }, /* @__PURE__ */ import_react5.default.createElement("div", null, /* @__PURE__ */ import_react5.default.createElement("h2", { className: "mr-card-title" }, "\u6A21\u578B\u76EE\u5F55"), /* @__PURE__ */ import_react5.default.createElement("p", { className: "mr-card-copy" }, routes.length, " \u6761\u8DEF\u7EBF \xB7 \u53EA\u8BFB\u53D6\u5B98\u65B9\u76EE\u5F55\uFF0C\u4E0D\u8BFB\u53D6 API Key\u3002")), /* @__PURE__ */ import_react5.default.createElement("button", { className: "mr-button mr-button-secondary", type: "button", disabled: catalogState.status === "loading", onClick: refresh }, "\u5237\u65B0")), /* @__PURE__ */ import_react5.default.createElement("div", { className: "mr-card-body" }, catalogState.status === "error" && /* @__PURE__ */ import_react5.default.createElement("div", { className: "mr-error", role: "alert" }, catalogState.error), catalogState.status === "loading" && /* @__PURE__ */ import_react5.default.createElement("div", { className: "mr-empty" }, "\u6B63\u5728\u52A0\u8F7D\u5B98\u65B9\u6A21\u578B\u76EE\u5F55\u2026"), catalogState.status === "ready" && /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, null, /* @__PURE__ */ import_react5.default.createElement("label", { className: "mr-label", htmlFor: "mr-model-search" }, "\u641C\u7D22\u8DEF\u7EBF"), /* @__PURE__ */ import_react5.default.createElement("input", { className: "mr-input mr-search", id: "mr-model-search", value: query, onChange: (event) => setQuery(event.target.value), placeholder: "\u6A21\u578B\u6216\u4F9B\u5E94\u5546" }), /* @__PURE__ */ import_react5.default.createElement(RouteList, { routes, query }), catalogState.catalog?.failures?.length > 0 && /* @__PURE__ */ import_react5.default.createElement("p", { className: "mr-caption" }, catalogState.catalog.failures.length, " \u4E2A\u4F9B\u5E94\u5546\u7684\u76EE\u5F55\u8BFB\u53D6\u5931\u8D25\uFF0C\u8BF7\u5728\u5B98\u65B9\u6A21\u578B\u9875\u68C0\u67E5\u914D\u7F6E\u3002")), /* @__PURE__ */ import_react5.default.createElement("p", { className: "mr-caption", style: { marginTop: 13 } }, "\u76EE\u5F55\u767B\u8BB0\u4E0D\u4EE3\u8868\u51ED\u636E\u6216\u7F51\u7EDC\u5F53\u524D\u53EF\u7528\uFF1B\u56FE\u50CF\u80FD\u529B\u9700\u8981\u5728\u5B9E\u9645\u4F7F\u7528\u524D\u6838\u5BF9\u3002"))))), /* @__PURE__ */ import_react5.default.createElement("div", { className: "mr-view mr-stack", role: "tabpanel", id: "mr-panel-tools", "aria-labelledby": "mr-tab-tools", hidden: view !== "tools" }, /* @__PURE__ */ import_react5.default.createElement("div", { className: "mr-view-heading" }, /* @__PURE__ */ import_react5.default.createElement("h2", null, "\u5B98\u65B9\u5DE5\u5177"), /* @__PURE__ */ import_react5.default.createElement("p", null, "\u7BA1\u7406\u672C\u673A CLI\u3001\u68C0\u67E5\u767B\u5F55\u72B6\u6001\uFF0C\u6216\u6253\u5F00\u4EA4\u4E92\u5F0F\u7EC8\u7AEF\u3002")), terminalApi && /* @__PURE__ */ import_react5.default.createElement(
|
|
14585
|
+
CliTerminalCard,
|
|
14586
|
+
{
|
|
14587
|
+
api: terminalApi,
|
|
14588
|
+
health: workbench.health.report,
|
|
14589
|
+
settingsSignature: toolInstallSettingsSignature(settingsScope?.getSnapshot?.()?.value)
|
|
14590
|
+
}
|
|
14591
|
+
), workbench.health.report && !workbench.health.report.onboarding?.completedAt && /* @__PURE__ */ import_react5.default.createElement(
|
|
14579
14592
|
OnboardingBanner,
|
|
14580
14593
|
{
|
|
14581
14594
|
health: workbench.health.report,
|
|
@@ -14605,13 +14618,6 @@ function RouterMainPage({ loadCatalog, settingsScope, listOfficialTools, loadOff
|
|
|
14605
14618
|
void workbench.refreshHealth(true);
|
|
14606
14619
|
}
|
|
14607
14620
|
}
|
|
14608
|
-
), terminalApi && /* @__PURE__ */ import_react5.default.createElement(
|
|
14609
|
-
CliTerminalCard,
|
|
14610
|
-
{
|
|
14611
|
-
api: terminalApi,
|
|
14612
|
-
health: workbench.health.report,
|
|
14613
|
-
settingsSignature: toolInstallSettingsSignature(settingsScope?.getSnapshot?.()?.value)
|
|
14614
|
-
}
|
|
14615
14621
|
)), /* @__PURE__ */ import_react5.default.createElement("div", { className: "mr-view mr-stack", role: "tabpanel", id: "mr-panel-controls", "aria-labelledby": "mr-tab-controls", hidden: view !== "controls" }, /* @__PURE__ */ import_react5.default.createElement("div", { className: "mr-view-heading" }, /* @__PURE__ */ import_react5.default.createElement("h2", null, "\u9884\u7B97\u4E0E\u5B89\u5168"), /* @__PURE__ */ import_react5.default.createElement("p", null, "\u8BBE\u7F6E\u6210\u672C\u4E0E\u8D28\u91CF\u7B56\u7565\uFF0C\u6838\u5BF9\u8BA2\u9605\u8BA1\u8D39\u548C\u6267\u884C\u8FB9\u754C\u3002")), /* @__PURE__ */ import_react5.default.createElement(
|
|
14616
14622
|
CostControlCard,
|
|
14617
14623
|
{
|
|
@@ -428,20 +428,22 @@ export const OFFICIAL_TOOLS = Object.freeze([
|
|
|
428
428
|
installArgs: [],
|
|
429
429
|
uninstallArgs: [],
|
|
430
430
|
probeExecutables: ['hermes'],
|
|
431
|
-
probeNote: '
|
|
431
|
+
probeNote: '支持官方源码脚本安装;自定义源码安装到统一根/hermes-agent,插件使用该源码的 .hermes/bin 入口。配置、登录和历史保留原位置。桌面/MSIX 别名暂不用于此入口。登录使用 hermes auth。',
|
|
432
432
|
providerHints: ['hermes', 'nousresearch'],
|
|
433
433
|
scriptBinaryNames: Object.freeze(['hermes', 'hermes.exe']),
|
|
434
434
|
installMethods: Object.freeze([
|
|
435
435
|
scriptMethod('script-bash', 'curl | bash', {
|
|
436
436
|
shell: 'bash', scriptUrl: 'https://hermes-agent.nousresearch.com/install.sh',
|
|
437
|
-
platforms: ['linux', 'darwin'], supportsInstallDir:
|
|
437
|
+
platforms: ['linux', 'darwin'], supportsInstallDir: true, sharedDefaultBin: true,
|
|
438
|
+
installDirSubdir: 'hermes-agent', installDirSuffix: '.hermes/bin', installArg: ['--dir'],
|
|
438
439
|
extraArgs: ['--non-interactive'],
|
|
439
440
|
verify: Object.freeze({ mustInclude: ['https://github.com/NousResearch/hermes-agent.git', 'hermes_cli/source_completion.py'] }),
|
|
440
441
|
uninstallUnsupportedReason: '请在官方工具终端运行 hermes uninstall 卸载源码安装;保留配置与历史时按向导选择。桌面/MSIX 安装请使用系统应用管理。',
|
|
441
442
|
}),
|
|
442
443
|
scriptMethod('script-powershell', 'irm | iex', {
|
|
443
444
|
shell: 'powershell', scriptUrl: 'https://hermes-agent.nousresearch.com/install.ps1',
|
|
444
|
-
platforms: ['win32'], supportsInstallDir:
|
|
445
|
+
platforms: ['win32'], supportsInstallDir: true,
|
|
446
|
+
installDirSubdir: 'hermes-agent', installDirSuffix: '.hermes/bin', installArg: ['-InstallDir'],
|
|
445
447
|
extraArgs: ['-NonInteractive'],
|
|
446
448
|
verify: Object.freeze({ mustInclude: ['https://github.com/NousResearch/hermes-agent.git', 'hermes_cli/source_completion.py'] }),
|
|
447
449
|
uninstallUnsupportedReason: '请在官方工具终端运行 hermes uninstall 卸载源码安装;保留配置与历史时按向导选择。桌面/MSIX 安装请使用系统应用管理。',
|
|
@@ -594,6 +594,7 @@ export async function assertVendorInstallDirectory(tool, plan, selectedPreferenc
|
|
|
594
594
|
let name
|
|
595
595
|
try { name = JSON.parse(packageText).name } catch { throw new Error('安装目录已有无法核验归属的 package.json,已停止运行官方脚本。') }
|
|
596
596
|
const ownPackage = tool.package || (tool.id === 'stepcode' ? '@step-harness/coding-agent' : '')
|
|
597
|
+
|| (tool.id === 'hermes' ? 'hermes-agent' : '')
|
|
597
598
|
if (!name || name !== ownPackage) throw new Error('安装目录已有其他工具或项目的 package.json,已停止运行官方脚本。')
|
|
598
599
|
}
|
|
599
600
|
for (const other of OFFICIAL_TOOLS) {
|
|
@@ -166,6 +166,10 @@ export function parseInstallPreferences(config = {}, { tools = [], home = '', en
|
|
|
166
166
|
|
|
167
167
|
/** Where a script install puts the binary: the user's directory, else the vendor default. */
|
|
168
168
|
export function scriptInstallDir(tool, preferences, { home = '', env = {}, method } = {}) {
|
|
169
|
+
// Only a chosen root overrides Hermes' source location. Its user home and
|
|
170
|
+
// default global command directory remain owned by the vendor installer.
|
|
171
|
+
if (tool?.id === 'hermes') return preferences?.installDir
|
|
172
|
+
? joinPath(preferences.installDir, method?.installDirSubdir || 'hermes-agent') : ''
|
|
169
173
|
const binaryDir = vendorScriptDir(tool, { home, env, method })
|
|
170
174
|
if (!binaryDir) return ''
|
|
171
175
|
if (preferences?.installDir) return method?.installDirSubdir ? joinPath(preferences.installDir, method.installDirSubdir) : preferences.installDir
|
|
@@ -285,6 +289,9 @@ export function resolveInstallPlan(tool, methodId, preferences = {}, { platform
|
|
|
285
289
|
: target ? [] : installDir
|
|
286
290
|
? [`${method.label} 无法使用自定义安装目录(官方脚本写死了安装路径),将安装到 ${vendorScriptDir(tool, { home, env, method })}。`]
|
|
287
291
|
: []
|
|
292
|
+
if (tool.id === 'hermes' && target) {
|
|
293
|
+
notices.push(`Hermes 源码安装目录:${target};插件启动器目录:${binDir}。配置、登录和历史保留原位置,不迁移现有数据;官方安装器可能更新全局命令使其指向所选源码。`)
|
|
294
|
+
}
|
|
288
295
|
if (method.registryEnv === 'MCODE_NPM_REGISTRY' && preferences.registry && !minimaxScriptRegistry(preferences.registry)) {
|
|
289
296
|
notices.push('MiniMax 官方脚本只接受 https://registry.npmjs.org/ 或 https://registry.npmmirror.com/,本次不改写它的 npm 源。')
|
|
290
297
|
}
|
|
@@ -360,10 +367,11 @@ export function resolveInstallLocation(tool, method, preferences = {}, { home =
|
|
|
360
367
|
if (method.kind === 'script') {
|
|
361
368
|
// A method that cannot honour the configured directory always lands in the
|
|
362
369
|
// vendor's own location, whatever the user typed.
|
|
363
|
-
const
|
|
370
|
+
const target = methodHonoursInstallDir(method)
|
|
364
371
|
? scriptInstallDir(tool, preferences, { home, env, method })
|
|
365
|
-
:
|
|
366
|
-
const
|
|
372
|
+
: ''
|
|
373
|
+
const dir = target || vendorScriptDir(tool, { home, env, method })
|
|
374
|
+
const binDir = target && method.installDirSuffix ? joinPath(target, method.installDirSuffix) : dir
|
|
367
375
|
return { kind: 'script', dir: binDir, installDir: dir, binaries: [...(method.scriptBinaryNames ?? tool.scriptBinaryNames ?? [])] }
|
|
368
376
|
}
|
|
369
377
|
return { kind: 'package-manager', dir: packageManagerBinDir(preferences?.installDir || '', { platform }), installDir: preferences?.installDir || '', binaries: [] }
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.21.1 — 2026-10-18
|
|
4
|
+
|
|
5
|
+
- Honor Hermes custom program directories on Windows and POSIX through the official `-InstallDir` / `--dir` parameter. Place the checkout in the shared root's `hermes-agent` child and bind probes and terminals to its source-local `.hermes/bin` launcher; an old global command cannot satisfy a missing selected installation.
|
|
6
|
+
- Retain existing Hermes configuration, login and history locations. Keep vendor-default discovery when the shared root is empty, preserve old source trees and explain the separate program/data locations. Installation does not migrate user data; the official installer may refresh its global convenience command.
|
|
7
|
+
- Move the official-tools interactive terminal above onboarding and tool maintenance, preserving the existing component and tab/session lifecycle.
|
|
8
|
+
- Add offline directory, installer-argument and selected-entry regressions. Vendor installation and model calls are not part of this release's acceptance.
|
|
9
|
+
|
|
3
10
|
## 0.21.0 — 2026-10-18
|
|
4
11
|
|
|
5
12
|
- Added support for Hermes Agent (NousResearch source installer): includes native Windows PowerShell and POSIX Bash non-interactive flags, vendor-specific launcher and data paths, `hermes auth` authentication flow, and manual uninstall via `hermes uninstall`.
|
package/README.i18n.yaml
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
# README translation pairing for this repository.
|
|
2
2
|
# Reviewed together; Git blob hashes identify the exact synchronized texts.
|
|
3
|
-
README.md:
|
|
4
|
-
README.zh.md:
|
|
3
|
+
README.md: 68dacf84020e0d213120ee9f151640ee2be4a62d
|
|
4
|
+
README.zh.md: 0b6dc3ab7e26e03dd0652f161198f8fa03f19711
|
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
A cost-aware model-routing workbench for **DeepSeek Harness Desktop**. Plan locally, compare configured routes, inspect execution permissions, and run dependent work packages through model APIs or supported official vendor CLIs.
|
|
6
6
|
|
|
7
|
-
Current version: **0.21.
|
|
7
|
+
Current version: **0.21.1** (`@ljwei-stak/dsh-model-router`). Hermes source installs now honor the shared install root without relocating existing user data, and the interactive terminal appears first on the official-tools page. This follows the Hermes/Pi integration and OpenCode V2 package update in 0.21.0. Compatibility remains **DeepSeek Harness Desktop 0.2.0-rc.1 / 0.2.0-rc.2 / 0.2.1-rc.2**. Hermes and Pi do not yet have verified managed runners; real vendor execution evidence remains tied to **0.20.0**, with no new model experiments in this release. The router and [GAL](https://github.com/Alice-Marx/deepseek-harness-galgame) have been independent plugins since 0.12.0.
|
|
8
8
|
|
|
9
9
|
Official CLI teamwork runs packages sequentially with dependency context and no automatic model-directory API fallback. Editable teams explicitly choose the Harness sandbox or the vendor CLI's normal environment. In the latter, Git worktrees collect edits but do not restrict OS access. CLIs retain their configured model unless explicitly mapped. See [real Windows validation and its limits](docs/releases/0.20.0-validation.md).
|
|
10
10
|
|
|
@@ -40,16 +40,16 @@ Generating a route recommendation is local: it does not start a vendor CLI or ma
|
|
|
40
40
|
Open **Plugins → Add plugin** and enter:
|
|
41
41
|
|
|
42
42
|
```text
|
|
43
|
-
@ljwei-stak/dsh-model-router@0.21.
|
|
43
|
+
@ljwei-stak/dsh-model-router@0.21.1
|
|
44
44
|
```
|
|
45
45
|
|
|
46
|
-
Use the official HTTPS npm source `https://registry.npmjs.org/` when a mirror lacks that exact version. Enable the plugin, then fully quit Harness (including its tray process) and restart it. Plugin details should show **0.21.
|
|
46
|
+
Use the official HTTPS npm source `https://registry.npmjs.org/` when a mirror lacks that exact version. Enable the plugin, then fully quit Harness (including its tray process) and restart it. Plugin details should show **0.21.1** and the sidebar should contain **模型路由** (Model Router). A global `npm install -g` alone does not register a Desktop plugin.
|
|
47
47
|
|
|
48
48
|
You can instead install a local `.tgz` archive or its extracted inner `package` directory through the plugin manager. Both must contain `package.json` and `.dsh-plugin`. See [releases](https://github.com/Alice-Marx/dsh-model-router/releases) for archived builds, or build your own checkout below.
|
|
49
49
|
|
|
50
50
|
### Upgrade from the old package name
|
|
51
51
|
|
|
52
|
-
The old name `@ljwei-stak/model-router-galgame` ended at 0.13.0. Remove that plugin entry while retaining your profile/application data, then add `@ljwei-stak/dsh-model-router@0.21.
|
|
52
|
+
The old name `@ljwei-stak/model-router-galgame` ended at 0.13.0. Remove that plugin entry while retaining your profile/application data, then add `@ljwei-stak/dsh-model-router@0.21.1`. Do not keep both entries installed: they share the internal plugin id `model-router-galgame` and tool names. The retained id lets existing router settings and history carry over.
|
|
53
53
|
|
|
54
54
|
For the combined 0.11.x package, back up the profile and export the GAL saves you want to preserve before upgrading. Story playback, artwork, music and saves now belong to the independent `@ljwei-stak/dsh-galgame` package. The detailed save limitations are in [MIGRATION.md](docs/archive/MIGRATION.md).
|
|
55
55
|
|
|
@@ -220,7 +220,7 @@ The CLI team runner is the plugin's own sequential dependency executor. It does
|
|
|
220
220
|
| `pi` | Pi | Official npm/pnpm package and interactive terminal; enter `/login` inside Pi; no verified managed runner |
|
|
221
221
|
| `zcode` | ZCode | Windows; approved `workspace-write` |
|
|
222
222
|
|
|
223
|
-
Hermes uses its [official source installer](https://hermes-agent.nousresearch.com/docs/getting-started/installation) in non-interactive mode, then you run `hermes auth`.
|
|
223
|
+
Hermes uses its [official source installer](https://hermes-agent.nousresearch.com/docs/getting-started/installation) in non-interactive mode, then you run `hermes auth`. A configured shared root places its source in `<root>/hermes-agent`; the plugin binds that checkout's `.hermes/bin` launcher and refuses a different old global copy. Existing configuration, login and history stay in their original Hermes home. Without a shared root, vendor defaults remain in use. The installer may refresh its global convenience command to the selected checkout. Uninstall source installs through `hermes uninstall`. Pi uses [`@earendil-works/pi-coding-agent`](https://github.com/earendil-works/pi/tree/main/packages/coding-agent) through npm/pnpm with `--ignore-scripts` and requires Node.js 22.19 or later. Start `pi`, then enter `/login`. Both tools keep login status unknown until confirmed in their own interface; the plugin does not read their credentials.
|
|
224
224
|
|
|
225
225
|
Installers use fixed official npm packages at each vendor's `@latest`, the vendor's own installer script, or the official publisher-signed Windows ZCode installer. An installation newer than the reported latest is not downgraded. Latest-version lookups are cached for about 12 hours; unavailable lookups leave the version unknown. New vendor releases are not automatically validated by this project. ZCode's installation window still requires you to choose a directory and finish installation.
|
|
226
226
|
|
package/README.zh.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
面向 **DeepSeek Harness Desktop** 的成本感知模型路由工作台。在本地规划任务、比较已配置路线、检查执行权限,并通过模型 API 或支持的厂商官方 CLI 执行有依赖关系的工作包。
|
|
6
6
|
|
|
7
|
-
当前版本:**0.21.
|
|
7
|
+
当前版本:**0.21.1**(`@ljwei-stak/dsh-model-router`)。本版修复 Hermes 源码安装无法使用统一根目录的问题,保留现有用户数据位置,并将官方工具终端放到工具页顶部。沿用 0.21.0 的 Hermes/Pi 接入和 OpenCode V2 包更新。继续兼容 **DeepSeek Harness Desktop 0.2.0-rc.1 / 0.2.0-rc.2 / 0.2.1-rc.2**。Hermes 与 Pi 暂无经过验证的托管执行器;真实厂商执行证据仍见 **0.20.0** 报告,本版未新增模型实测。路由器与 [GAL](https://github.com/Alice-Marx/deepseek-harness-galgame) 自 0.12.0 起已拆分为独立插件。
|
|
8
8
|
|
|
9
9
|
官方 CLI 协作按依赖顺序逐包执行、传递依赖上下文,不会自动回退到模型目录 API。可编辑团队需明确选择 Harness 沙箱或厂商 CLI 正常环境。后者通过 Git worktree 收集修改,但不限制操作系统访问。未显式设置模型映射时,各 CLI 沿用自身配置的模型。参见[真实 Windows 验证及其局限](docs/releases/0.20.0-validation.md)。
|
|
10
10
|
|
|
@@ -40,16 +40,16 @@
|
|
|
40
40
|
打开 **插件 → 添加插件**,输入:
|
|
41
41
|
|
|
42
42
|
```text
|
|
43
|
-
@ljwei-stak/dsh-model-router@0.21.
|
|
43
|
+
@ljwei-stak/dsh-model-router@0.21.1
|
|
44
44
|
```
|
|
45
45
|
|
|
46
|
-
镜像缺少该精确版本时,使用官方 HTTPS npm 源 `https://registry.npmjs.org/`。启用插件,然后完全退出 Harness(包括托盘进程)并重启。插件详情应显示 **0.21.
|
|
46
|
+
镜像缺少该精确版本时,使用官方 HTTPS npm 源 `https://registry.npmjs.org/`。启用插件,然后完全退出 Harness(包括托盘进程)并重启。插件详情应显示 **0.21.1**,侧栏应出现 **模型路由**。仅执行全局 `npm install -g` 不会把插件注册到 Desktop。
|
|
47
47
|
|
|
48
48
|
也可以通过插件管理器安装本地 `.tgz` 压缩包,或解压后的内部 `package` 目录。两者都必须包含 `package.json` 和 `.dsh-plugin`。历史构建见 [Releases](https://github.com/Alice-Marx/dsh-model-router/releases),也可按下文从源码构建。
|
|
49
49
|
|
|
50
50
|
### 从旧包名升级
|
|
51
51
|
|
|
52
|
-
旧名称 `@ljwei-stak/model-router-galgame` 停留在 0.13.0。保留配置档/应用数据,移除旧插件条目,再添加 `@ljwei-stak/dsh-model-router@0.21.
|
|
52
|
+
旧名称 `@ljwei-stak/model-router-galgame` 停留在 0.13.0。保留配置档/应用数据,移除旧插件条目,再添加 `@ljwei-stak/dsh-model-router@0.21.1`。不要同时保留两条插件:它们共用内部插件 id `model-router-galgame` 和工具名。保留该 id 能让现有路由设置与历史记录继续使用。
|
|
53
53
|
|
|
54
54
|
从合包 0.11.x 升级前,先备份配置档,并导出需要保留的 GAL 存档。剧情播放、立绘、音乐与存档现属于独立的 `@ljwei-stak/dsh-galgame`。详细存档限制见 [MIGRATION.md](docs/archive/MIGRATION.md)。
|
|
55
55
|
|
|
@@ -220,7 +220,7 @@ CLI 团队运行器是插件自身的顺序依赖执行器,不控制 Harness
|
|
|
220
220
|
| `pi` | Pi | 官方 npm/pnpm 安装、版本检测、交互终端;启动后输入 `/login`;尚无经过验证的托管执行器 |
|
|
221
221
|
| `zcode` | ZCode | Windows;获批的 `workspace-write` |
|
|
222
222
|
|
|
223
|
-
Hermes 使用[官方源码安装器](https://hermes-agent.nousresearch.com/docs/getting-started/installation)的非交互模式,安装后运行 `hermes auth
|
|
223
|
+
Hermes 使用[官方源码安装器](https://hermes-agent.nousresearch.com/docs/getting-started/installation)的非交互模式,安装后运行 `hermes auth`。设置统一根目录后,源码安装到 `<根目录>/hermes-agent`,插件绑定该源码的 `.hermes/bin` 入口,不会改用其他旧的全局副本。配置、登录和历史仍保留在原 Hermes 数据目录;未设置统一根时沿用厂商默认位置。官方安装器可能将全局便利命令更新为指向所选源码。源码安装请通过 `hermes uninstall` 卸载。Pi 使用 [`@earendil-works/pi-coding-agent`](https://github.com/earendil-works/pi/tree/main/packages/coding-agent),npm/pnpm 安装带 `--ignore-scripts`,要求 Node.js 22.19 及以上。启动 `pi` 后输入 `/login`。这两种工具的登录状态显示为未知,以各自界面为准;插件不会读取它们的凭据。
|
|
224
224
|
|
|
225
225
|
安装器使用各厂商 `@latest` 对应的固定官方 npm 包、厂商自有安装脚本,或带官方发行者签名的 Windows ZCode 安装器。已安装版本高于查询到的最新版本时不降级。最新版本查询约缓存 12 小时;查询不可用时版本保持未知。厂商新版本不会自动获得本项目的验证。ZCode 安装窗口仍需用户选择目录并完成安装。
|
|
226
226
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# DeepSeek Harness Desktop · 独立插件安装与验证
|
|
2
2
|
|
|
3
|
-
模型路由从 **0.12.0** 起独立发布;GAL 是独立的 **0.1.0** 插件。路由 **0.21.
|
|
3
|
+
模型路由从 **0.12.0** 起独立发布;GAL 是独立的 **0.1.0** 插件。路由 **0.21.1** 声明支持官方 **DeepSeek Harness Desktop 0.2.0-rc.1 / 0.2.0-rc.2 / 0.2.1-rc.2**。GAL 的兼容范围以其自身安装包为准。
|
|
4
4
|
|
|
5
|
-
当前路由版本为 **0.21.
|
|
5
|
+
当前路由版本为 **0.21.1**,修复 Hermes 自定义程序目录支持,并将官方工具终端移到工具页顶部;沿用 Hermes/Pi 接入和 OpenCode 官方 V2 包。兼容声明列出已核对的宿主版本,不设置兼容豁免。保留原插件 id、配置与运行记录;安装后完全退出 Harness(包括托盘)再重启。官方终端、ZCode TUI 与统一安装设置继续沿用,公开数据默认关闭。
|
|
6
6
|
|
|
7
7
|
[路由 README](../README.zh.md) · [迁移说明](archive/MIGRATION.md) · [独立 GAL README](https://github.com/Alice-Marx/deepseek-harness-galgame#readme)
|
|
8
8
|
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
| 需求 | 添加插件输入框 | 安装后的入口 |
|
|
12
12
|
| --- | --- | --- |
|
|
13
|
-
| 分析复杂度、按质量和费用选模型、调用官方工具 | `@ljwei-stak/dsh-model-router@0.21.
|
|
13
|
+
| 分析复杂度、按质量和费用选模型、调用官方工具 | `@ljwei-stak/dsh-model-router@0.21.1` | 模型路由 |
|
|
14
14
|
| 剧情、立绘、音乐、存档、自由对话 | `@ljwei-stak/dsh-galgame@0.1.0` | Gal 模块 |
|
|
15
15
|
| 两者都要 | 分别安装上面两个包 | 模型路由 + Gal 模块 |
|
|
16
16
|
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
2. 在“包名、GitHub 仓库地址或本地目录路径”输入框填一个完整包名,例如:
|
|
25
25
|
|
|
26
26
|
```text
|
|
27
|
-
@ljwei-stak/dsh-model-router@0.21.
|
|
27
|
+
@ljwei-stak/dsh-model-router@0.21.1
|
|
28
28
|
```
|
|
29
29
|
|
|
30
30
|
只想安装 GAL 时填写:
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
```
|
|
41
41
|
|
|
42
42
|
4. 核对预览的包名、版本和宿主兼容信息,安装并启用。完全退出 Harness(包括托盘进程)再启动,确保 Host 加载新代码。
|
|
43
|
-
5. 检查插件详情与侧边栏:路由应为 **0.21.
|
|
43
|
+
5. 检查插件详情与侧边栏:路由应为 **0.21.1 / 模型路由**;GAL 应为 **0.1.0 / Gal 模块**。仅装路由时没有 GAL 入口是预期行为。
|
|
44
44
|
|
|
45
45
|
普通用户无需 `npm install -g`,该命令不会把插件注册到当前 Harness profile。
|
|
46
46
|
|
|
@@ -48,13 +48,13 @@
|
|
|
48
48
|
|
|
49
49
|
进入对应 Release 下载 `.tgz`:
|
|
50
50
|
|
|
51
|
-
- [模型路由 Releases](https://github.com/Alice-Marx/dsh-model-router/releases)(也可运行 `npm pack @ljwei-stak/dsh-model-router@0.21.
|
|
51
|
+
- [模型路由 Releases](https://github.com/Alice-Marx/dsh-model-router/releases)(也可运行 `npm pack @ljwei-stak/dsh-model-router@0.21.1` 获取同一安装包)
|
|
52
52
|
- [独立 GAL v0.1.0](https://github.com/Alice-Marx/deepseek-harness-galgame/releases/tag/v0.1.0)
|
|
53
53
|
|
|
54
54
|
在“添加插件”填写下载文件的**绝对路径**,例如:
|
|
55
55
|
|
|
56
56
|
```text
|
|
57
|
-
D:\Plugins\ljwei-stak-dsh-model-router-0.21.
|
|
57
|
+
D:\Plugins\ljwei-stak-dsh-model-router-0.21.1.tgz
|
|
58
58
|
```
|
|
59
59
|
|
|
60
60
|
```text
|
|
@@ -64,7 +64,7 @@ D:\Plugins\ljwei-stak-dsh-galgame-0.1.0.tgz
|
|
|
64
64
|
如附有 `.sha256` 文件,用 PowerShell 计算并比较摘要:
|
|
65
65
|
|
|
66
66
|
```powershell
|
|
67
|
-
Get-FileHash -Algorithm SHA256 -LiteralPath 'D:\Plugins\ljwei-stak-dsh-model-router-0.21.
|
|
67
|
+
Get-FileHash -Algorithm SHA256 -LiteralPath 'D:\Plugins\ljwei-stak-dsh-model-router-0.21.1.tgz'
|
|
68
68
|
Get-FileHash -Algorithm SHA256 -LiteralPath 'D:\Plugins\ljwei-stak-dsh-galgame-0.1.0.tgz'
|
|
69
69
|
```
|
|
70
70
|
|
|
@@ -74,7 +74,7 @@ Get-FileHash -Algorithm SHA256 -LiteralPath 'D:\Plugins\ljwei-stak-dsh-galgame-0
|
|
|
74
74
|
|
|
75
75
|
1. 在旧合并插件的 GAL 播放器导出需要保留的剧情进度,并备份整个 Harness profile。每份 JSON 仅保存**当前剧情状态**,不含所有手动槽、设置、已读记录或本地音乐;重要槽位可依次读档再导出。
|
|
76
76
|
2. 在**同一个 profile**安装独立 `@ljwei-stak/dsh-galgame@0.1.0`。
|
|
77
|
-
3. 0.13.0 起包名改为 `@ljwei-stak/dsh-model-router`(旧包名最后版本为 0.13.0,内容相同,之后不再更新):在插件管理器卸载原 `@ljwei-stak/model-router-galgame`(保留 profile 与应用数据),再添加 `@ljwei-stak/dsh-model-router@0.21.
|
|
77
|
+
3. 0.13.0 起包名改为 `@ljwei-stak/dsh-model-router`(旧包名最后版本为 0.13.0,内容相同,之后不再更新):在插件管理器卸载原 `@ljwei-stak/model-router-galgame`(保留 profile 与应用数据),再添加 `@ljwei-stak/dsh-model-router@0.21.1`。不要两个同时安装(条目 id 与工具名相同);条目 id 未变,路由设置与执行记录会保留。完成两项更新后再玩剧情,避免同时操作旧合并入口和新入口。
|
|
78
78
|
4. 现在路由与 GAL 各有一个入口。独立 GAL 沿用旧存档 localStorage 键,核对当前进度和三槽;更换 profile 或进度未恢复时,先切换到匹配剧目,再导入 JSON 备份。
|
|
79
79
|
5. 后续分别更新需要的插件;只用路由可以不启用或不安装 GAL。保留 profile 与应用数据,卸载插件时不要清理故事数据。
|
|
80
80
|
|
|
@@ -82,7 +82,7 @@ GAL 核心只包含**《回声之城·正篇》**与**《旧城迁移篇:未
|
|
|
82
82
|
|
|
83
83
|
## 5. 模型路由第一次使用
|
|
84
84
|
|
|
85
|
-
工作台自 0.15.0 起分成**任务与执行、模型配置、官方工具、预算与安全**四页;0.21.
|
|
85
|
+
工作台自 0.15.0 起分成**任务与执行、模型配置、官方工具、预算与安全**四页;0.21.1 沿用该布局。切换页面保留安装任务、终端会话和未完成的输入。
|
|
86
86
|
|
|
87
87
|
1. 在 Harness 官方**模型**页配置供应商、模型与凭据。插件读取准确的 `provider/model` 目录,模型档案不保存 API Key。
|
|
88
88
|
2. 在**模型配置**刷新目录,逐条填写自报质量评分、核对过的输入/输出单价(USD / 百万 token)和擅长方向;缺价留空。可选 `cliModel` 必须是该厂商 CLI 已验证接受的名字。可选 LiveBench 名称须准确对应版本与推理档位;它是用户确认的映射,不自动证明实际执行档位。
|
|
@@ -114,7 +114,7 @@ GAL 核心只包含**《回声之城·正篇》**与**《旧城迁移篇:未
|
|
|
114
114
|
| 检查 | 预期 |
|
|
115
115
|
| --- | --- |
|
|
116
116
|
| 路由宿主版本 | 0.2.0-rc.1、0.2.0-rc.2 或 0.2.1-rc.2;包括 `rc` 后缀。 |
|
|
117
|
-
| 路由独立安装 | 0.21.
|
|
117
|
+
| 路由独立安装 | 0.21.1 详情、模型路由入口、目录和模型档案可用;不出现旧合并 GAL 入口。 |
|
|
118
118
|
| GAL 独立安装 | 0.1.0 详情、Gal 模块入口、标题与两部核心剧情可用;不要求安装路由。 |
|
|
119
119
|
| 共同安装 | 两个入口各一份,路由工具和 GAL 播放器均能使用。 |
|
|
120
120
|
| 存档迁移 | 同 profile 可读旧键;跨 profile 用匹配剧目 JSON 导入;旧篇目的数据不覆盖。 |
|
|
@@ -129,7 +129,7 @@ GAL 核心只包含**《回声之城·正篇》**与**《旧城迁移篇:未
|
|
|
129
129
|
|
|
130
130
|
## 8. 开发者从完整源码构建
|
|
131
131
|
|
|
132
|
-
路由需要 Node.js **22.19+** 与 **pnpm 10.34.6**。从完整源码仓库根目录构建;当前源码版本为 0.21.
|
|
132
|
+
路由需要 Node.js **22.19+** 与 **pnpm 10.34.6**。从完整源码仓库根目录构建;当前源码版本为 0.21.1,复现已发布版本时检出对应发布标签。旧版(如 0.15.0)标签保留其当时内容。运行:
|
|
133
133
|
|
|
134
134
|
```powershell
|
|
135
135
|
pnpm install --frozen-lockfile --strict-peer-dependencies
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# 模型路由工作台:配置、规划与实际执行
|
|
2
2
|
|
|
3
|
-
适用版本:`@ljwei-stak/dsh-model-router@0.21.
|
|
3
|
+
适用版本:`@ljwei-stak/dsh-model-router@0.21.1`。声明兼容 DeepSeek Harness Desktop `0.2.0-rc.1 / 0.2.0-rc.2 / 0.2.1-rc.2`。安装与开发见[中文 README](../README.zh.md),旧包迁移见[迁移说明](archive/MIGRATION.md)。
|
|
4
|
+
|
|
5
|
+
0.21.1 支持在统一根目录的 `hermes-agent` 子目录安装 Hermes 源码,插件使用该源码内的独立命令入口;保留现有配置、登录及历史数据的位置。官方工具终端移到本页顶部。
|
|
4
6
|
|
|
5
7
|
0.21.0 新增 Hermes Agent 与 Pi 的安装更新、版本检测及交互终端,OpenCode npm/pnpm 切换至官方 V2 包。Hermes 与 Pi 的登录由各自 CLI 完成,暂不提供经过验证的托管执行器。
|
|
6
8
|
|
|
@@ -164,7 +166,7 @@ MiniMax 官方 Windows 脚本的 `<# ... #>` 是 PowerShell 帮助注释。0.18.
|
|
|
164
166
|
| Gemini CLI | ✓ | — | — | 支持 |
|
|
165
167
|
| OpenCode | ✓ | bash | — | 包管理器支持;脚本固定 ~/.opencode/bin |
|
|
166
168
|
| Step Code | — | bash | PowerShell | 脚本使用根目录/stepcode |
|
|
167
|
-
| Hermes Agent | — | bash | PowerShell |
|
|
169
|
+
| Hermes Agent | — | bash | PowerShell | 源码放统一根/hermes-agent;配置和数据仍保留原位置 |
|
|
168
170
|
| Pi | npm/pnpm | — | — | `@earendil-works/pi-coding-agent`;Node.js ≥22.19,安装带 `--ignore-scripts` |
|
|
169
171
|
| ZCode | — | — | — | 官方 Windows 桌面安装窗口中选择 |
|
|
170
172
|
|
|
@@ -199,7 +201,7 @@ MiniMax 官方 Windows 脚本的 `<# ... #>` 是 PowerShell 帮助注释。0.18.
|
|
|
199
201
|
|
|
200
202
|
终端清单现覆盖全部十二个注册表工具,包含 Hermes Agent、Pi、OpenCode、Step Code 和 Windows ZCode 内置 TUI。“刷新”重新检测安装状态;启动沿用已保存的安装方式与目录,选定副本不存在时会提示,不改用 PATH 上的其他副本。
|
|
201
203
|
|
|
202
|
-
Hermes 安装后运行 `hermes auth`;Pi 启动后输入 `/login`,没有独立的 `pi login` 命令。两者的登录状态显示为未知,插件不读取凭据。Hermes 的 Windows 命令目录默认为 `%LOCALAPPDATA%/hermes/bin`(配置 `HERMES_HOME` 时使用其 `bin` 子目录),POSIX 使用 `~/.local/bin
|
|
204
|
+
Hermes 安装后运行 `hermes auth`;Pi 启动后输入 `/login`,没有独立的 `pi login` 命令。两者的登录状态显示为未知,插件不读取凭据。Hermes 的 Windows 命令目录默认为 `%LOCALAPPDATA%/hermes/bin`(配置 `HERMES_HOME` 时使用其 `bin` 子目录),POSIX 使用 `~/.local/bin`;未设置统一目录时沿用这些厂商命令目录;设置后,源码安装到统一根/hermes-agent,插件绑定其中的 `.hermes/bin` 入口,不迁移现有配置与历史。卸载 Hermes 源码安装请在终端使用 `hermes uninstall`,桌面/MSIX 版使用系统应用管理。
|
|
203
205
|
|
|
204
206
|
已安装 **ZCode 桌面版**时,在 ZCode 工具行的“ZCode TUI 独立配置”填写其桌面目录,例如 `D:/Program Files/ZCode`,点击“保存并刷新 TUI 入口”;留空恢复自动检测。核验成功后在官方工具终端选择 **ZCode TUI(桌面版内置)**,使用现有登录环境自行配置模型和插件。无需额外独立 CLI 安装包。内置 CLI 随桌面版更新;ZCode 行可单独“检查并更新桌面版”或“重新安装桌面版”,在官方窗口完成后重新体检。桌面版本与内置 CLI 版本不同,工具行显示桌面版本。
|
|
205
207
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ljwei-stak/dsh-model-router",
|
|
3
|
-
"version": "0.21.
|
|
3
|
+
"version": "0.21.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Model Router for official DeepSeek Harness Desktop: cost-aware task routing, dependent work packages and official vendor CLI discovery, installation and execution. GAL is available separately as @ljwei-stak/dsh-galgame.",
|
|
6
6
|
"repository": {
|