@sunshaobei/dsh-mcp-manager 3.0.9 → 3.1.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/lib/index.js CHANGED
@@ -69,11 +69,8 @@ function mcpManagerHome() {
69
69
  function mcpManagerFile(fileName) {
70
70
  return join3(mcpManagerHome(), fileName);
71
71
  }
72
- function legacyGlobalConfigFile() {
73
- return join3(dshHome(), ".dsh", EFFECTIVE_CONFIG_FILE_NAME);
74
- }
75
72
  function configFile() {
76
- return mcpManagerFile(EFFECTIVE_CONFIG_FILE_NAME);
73
+ return join3(dshHome(), EFFECTIVE_CONFIG_FILE_NAME);
77
74
  }
78
75
  function userStatePath() {
79
76
  return mcpManagerFile(USER_STATE_FILE_NAME);
@@ -96,11 +93,8 @@ function sourcePrefsPath() {
96
93
  function versionFile() {
97
94
  return mcpManagerFile(VERSION_FILE_NAME);
98
95
  }
99
- function legacyProjectEffectiveConfigFile(projectRoot) {
100
- return join3(projectRoot, PROJECT_CONFIG_DIR_NAME, EFFECTIVE_CONFIG_FILE_NAME);
101
- }
102
96
  function projectConfigFile(projectRoot) {
103
- return join3(projectRoot, PROJECT_CONFIG_DIR_NAME, PACKAGE_DIR, EFFECTIVE_CONFIG_FILE_NAME);
97
+ return join3(projectRoot, PROJECT_CONFIG_DIR_NAME, EFFECTIVE_CONFIG_FILE_NAME);
104
98
  }
105
99
  function legacyProjectConfigFile(projectRoot) {
106
100
  return join3(projectRoot, PROJECT_CONFIG_DIR_NAME, PACKAGE_DIR, PROJECT_CONFIG_FILE_NAME);
@@ -109,9 +103,7 @@ function legacyFile(fileName) {
109
103
  return join3(dshHome(), fileName);
110
104
  }
111
105
  function isProjectConfigFile(path) {
112
- const parent = basename(dirname(path));
113
- return basename(path) === EFFECTIVE_CONFIG_FILE_NAME && // 旧布局:父目录即 .dsh;包分区布局:父目录是 .dsh/dsh-mcp-manager。
114
- (parent === PROJECT_CONFIG_DIR_NAME || parent === PACKAGE_DIR);
106
+ return basename(path) === EFFECTIVE_CONFIG_FILE_NAME && basename(dirname(path)) === PROJECT_CONFIG_DIR_NAME;
115
107
  }
116
108
  function fileMode(file) {
117
109
  const entry = FILE_MODES.find((candidate) => candidate.matches(file));
@@ -154,7 +146,6 @@ var init_paths2 = __esm({
154
146
  };
155
147
  FILE_MODES = [
156
148
  { matches: (path) => path === configFile(), mode: 384 },
157
- { matches: (path) => path === legacyGlobalConfigFile(), mode: 384 },
158
149
  { matches: (path) => path === userStatePath(), mode: 420 },
159
150
  { matches: (path) => dirname(path) === catalogDir(), mode: 420 },
160
151
  { matches: (path) => path === catalogSummaryFile(), mode: 420 },
@@ -390,7 +381,6 @@ __export(interface_exports, {
390
381
  OFFICIAL_MCP_CLIENT_LOG_NAME: () => OFFICIAL_MCP_CLIENT_LOG_NAME,
391
382
  OFFICIAL_MCP_CLIENT_SPECIFIER: () => OFFICIAL_MCP_CLIENT_SPECIFIER,
392
383
  OFFICIAL_SERVER_NAME_PATTERN: () => OFFICIAL_SERVER_NAME_PATTERN,
393
- PACKAGE_DIR: () => PACKAGE_DIR,
394
384
  PACKAGE_DIR_MODE: () => PACKAGE_DIR_MODE,
395
385
  SERVER_NAME_PATTERN: () => SERVER_NAME_PATTERN,
396
386
  STATS_FILE_NAME: () => STATS_FILE_NAME,
@@ -406,9 +396,7 @@ __export(interface_exports, {
406
396
  ensureDir: () => ensureDir,
407
397
  fileMode: () => fileMode,
408
398
  legacyFile: () => legacyFile,
409
- legacyGlobalConfigFile: () => legacyGlobalConfigFile,
410
399
  legacyProjectConfigFile: () => legacyProjectConfigFile,
411
- legacyProjectEffectiveConfigFile: () => legacyProjectEffectiveConfigFile,
412
400
  mcpManagerHome: () => mcpManagerHome,
413
401
  projectConfigFile: () => projectConfigFile,
414
402
  publicToolName: () => publicToolName,
@@ -529,9 +517,8 @@ function sourcePath(id, projectRoot) {
529
517
  return join4(homedir2(), ".dsh", "mcp.json");
530
518
  if (projectRoot === void 0 || projectRoot === "")
531
519
  return null;
532
- if (id === "project-agents")
533
- return join4(projectRoot, ".agents", "mcp.json");
534
- return join4(projectRoot, ".dsh", PACKAGE_DIR, "mcp.json");
520
+ const dir = id === "project-agents" ? ".agents" : ".dsh";
521
+ return join4(projectRoot, dir, "mcp.json");
535
522
  }
536
523
  function readSourceFile(path) {
537
524
  return existsSync(path) ? readFileSync(path, "utf8") : null;
@@ -588,7 +575,6 @@ var init_sources = __esm({
588
575
  "lib/server/config/sources.js"() {
589
576
  "use strict";
590
577
  init_import();
591
- init_interface();
592
578
  SOURCE_IDS = [
593
579
  "global-dsh",
594
580
  "global-agents",
@@ -9251,22 +9237,6 @@ function archive(source) {
9251
9237
  throw new Error(`dsh-mcp-manager: 旧存储文件改名失败:${source}`, { cause });
9252
9238
  }
9253
9239
  }
9254
- async function relocateEffectiveConfigs(deps) {
9255
- if (deps.storePath !== "")
9256
- return;
9257
- const legacy = legacyGlobalConfigFile();
9258
- if (!existsSync10(legacy))
9259
- return;
9260
- const target = configFile();
9261
- const seededEmpty = existsSync10(target) && readFileSync4(target, "utf8") === EMPTY_CONFIG;
9262
- if (existsSync10(target) && !seededEmpty) {
9263
- warnIfDowngraded(legacy, target, deps);
9264
- archive(legacy);
9265
- return;
9266
- }
9267
- await writeFileAtomic(target, readSource(legacy));
9268
- archive(legacy);
9269
- }
9270
9240
 
9271
9241
  // lib/server/upgrade/impl/steps/index.js
9272
9242
  var STEPS = [
@@ -9278,9 +9248,7 @@ var STEPS = [
9278
9248
  // 0.2.7 → 0.2.8 为空步(dsh 0.2.0-rc.2 适配 + 导出面收窄,均不落盘):run 指共享空函数。
9279
9249
  { fromVersion: "0.2.7", targetVersion: "0.2.8", run: tickUpgradeVersion },
9280
9250
  // 0.2.8 → 0.2.9 为空步(本版无 MCP 管理器 home 级存储形态变化):run 指共享空函数。
9281
- { fromVersion: "0.2.8", targetVersion: "0.2.9", run: tickUpgradeVersion },
9282
- // 0.2.9 → 0.2.10:生效配置 .config 归位进包分区目录(全局 + 项目级 JIT)。
9283
- { fromVersion: "0.2.9", targetVersion: "0.2.10", run: relocateEffectiveConfigs }
9251
+ { fromVersion: "0.2.8", targetVersion: "0.2.9", run: tickUpgradeVersion }
9284
9252
  ];
9285
9253
 
9286
9254
  // lib/server/upgrade/impl/version/index.js
@@ -9318,13 +9286,12 @@ var upgradeRunner = createUpgradeRunner("dsh-mcp-manager", runUpgradeChain2);
9318
9286
  // lib/server/upgrade/impl/steps/project-layout.js
9319
9287
  init_interface();
9320
9288
  function settleProjectConfig(root, logger) {
9321
- const deps = {
9289
+ return settleOne(legacyProjectConfigFile(root), projectConfigFile(root), null, {
9322
9290
  logger,
9323
9291
  // settle 路径只用 logger:`storePath` 传空串——takenOver 是 LAYOUT 层的概念,
9324
9292
  // 与项目级无关。
9325
9293
  storePath: ""
9326
- };
9327
- return settleOne(legacyProjectConfigFile(root), projectConfigFile(root), null, deps).then(() => settleOne(legacyProjectEffectiveConfigFile(root), projectConfigFile(root), null, deps));
9294
+ });
9328
9295
  }
9329
9296
  function withSettledProjectConfig(root, logger, useSettled) {
9330
9297
  return settleProjectConfig(root, logger).then(() => useSettled(projectConfigFile(root)));
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * 四个声明来源,默认全部读取:
5
5
  * - 全局:~/.agents/mcp.json 与 ~/.dsh/mcp.json
6
- * - 项目:<项目根>/.agents/mcp.json 与 <项目根>/.dsh/dsh-mcp-manager/mcp.json
6
+ * - 项目:<项目根>/.agents/mcp.json 与 <项目根>/.dsh/mcp.json
7
7
  *
8
8
  * 同名互斥原则:同一个服务器名在多个来源出现时,**只允许一个生效**——
9
9
  * 生效者进入对应 scope 的 store 并连接;落选者不落盘(若其 scope store
@@ -11,4 +11,4 @@ export type { DomainSpec } from "./compose.js";
11
11
  export type { AgentFace, AttachmentsPort, EventsPort, ExposePort, HostContextPort, HostFaces, LoaderPort, LogRecord, LoggerPort, LogsPort, ModelAttachmentRef, ModelContentBlock, ModelInfoPort, MountedPlugin, OfficialPluginModule, PromptPort, RegisterPort, SaveImageInput, ToolsPort, } from "./host-faces.js";
12
12
  export { CONNECT_TIMEOUT_MS, DEFAULT_ANNOUNCE_CATALOG, DEFAULT_CATALOG_MAX_ENTRIES, DEFAULT_TOOL_CALL_TIMEOUT_MS, DISCOVERY_TIMEOUT_MS, LIST_DEFAULT_TOOLS_PER_SERVER, OFFICIAL_MCP_CLIENT_LOG_NAME, OFFICIAL_MCP_CLIENT_SPECIFIER, OFFICIAL_SERVER_NAME_PATTERN, SERVER_NAME_PATTERN, } from "./constants.js";
13
13
  export { publicToolName } from "./tool-names.js";
14
- export { CATALOG_DIR_NAME, CATALOG_SUMMARY_FILE_NAME, CONFIG_FILE_NAME, LEGACY_LAYOUT, PACKAGE_DIR_MODE, STATS_FILE_NAME, USER_STATE_FILE_NAME, VERSION_FILE_NAME, catalogDir, catalogFile, catalogSummaryFile, configFile, directoryMode, fileMode, legacyFile, PACKAGE_DIR, legacyProjectConfigFile, legacyProjectEffectiveConfigFile, legacyGlobalConfigFile, mcpManagerHome, projectConfigFile, statsFile, userStatePath, sourcePrefsPath, versionFile, } from "./paths.js";
14
+ export { CATALOG_DIR_NAME, CATALOG_SUMMARY_FILE_NAME, CONFIG_FILE_NAME, LEGACY_LAYOUT, PACKAGE_DIR_MODE, STATS_FILE_NAME, USER_STATE_FILE_NAME, VERSION_FILE_NAME, catalogDir, catalogFile, catalogSummaryFile, configFile, directoryMode, fileMode, legacyFile, legacyProjectConfigFile, mcpManagerHome, projectConfigFile, statsFile, userStatePath, sourcePrefsPath, versionFile, } from "./paths.js";
@@ -1,5 +1,3 @@
1
- /** 本插件在 DSH home 下的私有目录:按 npm 包名分区,不与其它插件争用根目录。 */
2
- export declare const PACKAGE_DIR = "dsh-mcp-manager";
3
1
  /** 私有目录权限:同机其它用户不得列举本插件的落盘面(与 mcp.json 的 0o600 同族)。 */
4
2
  export declare const PACKAGE_DIR_MODE = 448;
5
3
  /** 目标布局的文件名(迁移契约)。 */
@@ -24,9 +22,7 @@ export declare const LEGACY_LAYOUT: {
24
22
  };
25
23
  /** 本插件私有目录。 */
26
24
  export declare function mcpManagerHome(): string;
27
- /** 旧版全局生效配置(迁移**读面**,新代码不得回写):`<DSH_HOME>/.dsh/dsh-mcp-manager.config`。 */
28
- export declare function legacyGlobalConfigFile(): string;
29
- /** 全局生效配置:`<DSH_HOME>/dsh-mcp-manager/dsh-mcp-manager.config`(互斥同步唯一写面,
25
+ /** 全局生效配置:`<DSH_HOME>/.dsh/dsh-mcp-manager.config`(互斥同步唯一写面,
30
26
  * 含 env 引用与凭据字段,0600)。四个声明来源 mcp.json 不会直接被运行面读取。 */
31
27
  export declare function configFile(): string;
32
28
  /**
@@ -48,9 +44,7 @@ export declare function statsFile(): string;
48
44
  export declare function sourcePrefsPath(): string;
49
45
  /** 存储版本刻度(升级链走到哪一版,不是插件版本——后者读 package.json)。 */
50
46
  export declare function versionFile(): string;
51
- /** 旧版项目级生效配置(迁移**读面**,新代码不得回写):`<项目根>/.dsh/dsh-mcp-manager.config`。 */
52
- export declare function legacyProjectEffectiveConfigFile(projectRoot: string): string;
53
- /** 项目级生效配置:`<项目根>/.dsh/dsh-mcp-manager/dsh-mcp-manager.config`(互斥同步唯一写面)。 */
47
+ /** 项目级生效配置:`<项目根>/.dsh/dsh-mcp-manager.config`(互斥同步唯一写面)。 */
54
48
  export declare function projectConfigFile(projectRoot: string): string;
55
49
  /**
56
50
  * 旧目录形态(迁移**读面**,新代码不得回写):`<项目根>/.dsh/dsh-mcp-manager/mcp.json`。
@@ -15,12 +15,3 @@ export declare function migrateStorageLayout(deps: UpgradeDeps): Promise<void>;
15
15
  * 项目级 just-in-time 迁移(`./project-layout.ts`)复用本函数:同文件内的 `settleOne` 即同一语义。
16
16
  */
17
17
  export declare function settleOne(source: string, target: string, initial: string | null, deps: UpgradeDeps): Promise<void>;
18
- /**
19
- * 0.2.9 → 0.2.10:生效配置 .config 归位进包分区目录——
20
- * 全局 `<DSH_HOME>/.dsh/dsh-mcp-manager.config` → `<DSH_HOME>/dsh-mcp-manager/`。
21
- *
22
- * 不能直接复用 `settleOne`:0.2.5 的迁移可能已在目标落过**版本化空形占位**——那不是用户数据。
23
- * 目标是空占位而源在场时,以源为准覆盖;目标已有真实内容才走「归档源、保目标」的常规语义。
24
- * 用户接管 store(`storePath` 非空)时整项不动。
25
- */
26
- export declare function relocateEffectiveConfigs(deps: UpgradeDeps): Promise<void>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sunshaobei/dsh-mcp-manager",
3
- "version": "3.0.9",
3
+ "version": "3.1.1",
4
4
  "description": "Manage MCP servers (stdio / streamable-http) for dsh web; tools are reached only through four middleware tools. DSH MCP 管理器:Web 侧边栏「MCP」入口,面板按状态分级展示 MCP 服务器(运行中/连接中/已配置/失败),支持快速接入(stdio / streamable-http 表单)与粘贴 mcpServers JSON 导入。已连接服务器的工具一律经中间层工具(ws_mcp_search / ws_mcp_detail / ws_mcp_call / ws_mcp_list)访问:宿主注册名 mcp__<id>__<tool> 是内部标识(id 按 (工作空间, 服务器名) 分配、不可由服务器名推导),不对模型可见,禁止直呼。",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",