@kwonye/mcpx 0.1.93 → 0.1.94
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/dist/adapters/cline.d.ts.map +1 -1
- package/dist/adapters/codex.d.ts.map +1 -1
- package/dist/adapters/kiro.d.ts.map +1 -1
- package/dist/adapters/opencode.d.ts.map +1 -1
- package/dist/adapters/utils/index.d.ts +11 -3
- package/dist/adapters/utils/index.d.ts.map +1 -1
- package/dist/{cli-y7ba5qvr.js → cli-154shqmt.js} +126 -68
- package/dist/{cli-qvkpwy9w.js → cli-9fmn9y72.js} +36 -17
- package/dist/{cli-np0wwh6m.js → cli-csfsg1yf.js} +78 -4
- package/dist/{cli-m2645syd.js → cli-mxmgxdm2.js} +127 -69
- package/dist/{cli-kwyp9ywh.js → cli-n8vt375e.js} +306 -172
- package/dist/{cli-8vxva0cb.js → cli-tk8bggg5.js} +81 -8
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +45 -21
- package/dist/{config-2s5nsm2g.js → config-dtc3c79c.js} +6 -2
- package/dist/core/config-repair.d.ts.map +1 -1
- package/dist/core/config-store.d.ts +3 -0
- package/dist/core/config-store.d.ts.map +1 -0
- package/dist/core/config.d.ts +13 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/daemon.d.ts +1 -1
- package/dist/core/daemon.d.ts.map +1 -1
- package/dist/core/errors.d.ts +18 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/index.d.ts +5 -2
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +81 -6
- package/dist/core/oauth.d.ts.map +1 -1
- package/dist/core/plugin-manager.d.ts.map +1 -1
- package/dist/core/plugin-projections.d.ts +6 -2
- package/dist/core/plugin-projections.d.ts.map +1 -1
- package/dist/core/registry.d.ts +4 -1
- package/dist/core/registry.d.ts.map +1 -1
- package/dist/core/secrets.d.ts.map +1 -1
- package/dist/core/server-auth.d.ts.map +1 -1
- package/dist/core/status.d.ts +1 -0
- package/dist/core/status.d.ts.map +1 -1
- package/dist/core/sync.d.ts +19 -2
- package/dist/core/sync.d.ts.map +1 -1
- package/dist/gateway/server.d.ts +4 -1
- package/dist/gateway/server.d.ts.map +1 -1
- package/dist/{plugin-manager-1sc4b6am.js → plugin-manager-1sjwfnah.js} +4 -4
- package/dist/{registry-mztfy0cz.js → registry-n12thgf2.js} +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/package.json +1 -1
|
@@ -32,6 +32,13 @@ function removeServer(config, name, force = false) {
|
|
|
32
32
|
throw new Error(`Server "${name}" does not exist.`);
|
|
33
33
|
}
|
|
34
34
|
delete config.servers[name];
|
|
35
|
+
if (config.projects) {
|
|
36
|
+
for (const project of Object.values(config.projects)) {
|
|
37
|
+
if (project.disabledServers) {
|
|
38
|
+
project.disabledServers = project.disabledServers.filter((s) => s !== name);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
35
42
|
}
|
|
36
43
|
function updateServer(config, name, spec) {
|
|
37
44
|
validateServerName(name);
|
|
@@ -66,14 +73,18 @@ function ensureGatewayToken(config, secrets) {
|
|
|
66
73
|
try {
|
|
67
74
|
const fileValue = fs.readFileSync(tokenPath, "utf8").trim();
|
|
68
75
|
if (fileValue) {
|
|
69
|
-
secrets.setSecret(secretName, fileValue);
|
|
70
76
|
return fileValue;
|
|
71
77
|
}
|
|
72
78
|
} catch {}
|
|
79
|
+
const storeValue = secrets.getSecret(secretName);
|
|
80
|
+
if (storeValue) {
|
|
81
|
+
ensureParentDir(tokenPath);
|
|
82
|
+
fs.writeFileSync(tokenPath, storeValue, { mode: 384 });
|
|
83
|
+
return storeValue;
|
|
84
|
+
}
|
|
73
85
|
const token = crypto.randomBytes(32).toString("base64url");
|
|
74
86
|
ensureParentDir(tokenPath);
|
|
75
87
|
fs.writeFileSync(tokenPath, token, { mode: 384 });
|
|
76
|
-
secrets.setSecret(secretName, token);
|
|
77
88
|
return token;
|
|
78
89
|
}
|
|
79
90
|
function rotateGatewayToken(config, secrets) {
|
|
@@ -82,7 +93,7 @@ function rotateGatewayToken(config, secrets) {
|
|
|
82
93
|
const tokenPath = getGatewayTokenPath(secretName);
|
|
83
94
|
ensureParentDir(tokenPath);
|
|
84
95
|
fs.writeFileSync(tokenPath, token, { mode: 384 });
|
|
85
|
-
secrets.
|
|
96
|
+
secrets.removeSecret(secretName);
|
|
86
97
|
return token;
|
|
87
98
|
}
|
|
88
99
|
function registerProject(globalConfig, projectPath, name) {
|
|
@@ -111,20 +122,82 @@ function setProjectServerEnabled(globalConfig, projectPath, serverName, enabled)
|
|
|
111
122
|
if (!project) {
|
|
112
123
|
throw new Error(`Project "${resolvedPath}" is not registered.`);
|
|
113
124
|
}
|
|
125
|
+
const serverSpec = globalConfig.servers[serverName];
|
|
126
|
+
if (!serverSpec) {
|
|
127
|
+
throw new Error(`Server "${serverName}" does not exist.`);
|
|
128
|
+
}
|
|
114
129
|
if (!project.disabledServers) {
|
|
115
130
|
project.disabledServers = [];
|
|
116
131
|
}
|
|
117
132
|
if (enabled) {
|
|
118
133
|
project.disabledServers = project.disabledServers.filter((s) => s !== serverName);
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
globalConfig.servers[serverName] = { ...serverSpec, enabled: true };
|
|
134
|
+
if (!isServerEnabled(serverSpec)) {
|
|
135
|
+
return { effective: false, reason: "globally_disabled" };
|
|
122
136
|
}
|
|
123
137
|
} else {
|
|
124
138
|
if (!project.disabledServers.includes(serverName)) {
|
|
125
139
|
project.disabledServers.push(serverName);
|
|
126
140
|
}
|
|
127
141
|
}
|
|
142
|
+
return { effective: true };
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// src/core/errors.ts
|
|
146
|
+
class UpstreamError extends Error {
|
|
147
|
+
code;
|
|
148
|
+
upstream;
|
|
149
|
+
status;
|
|
150
|
+
wwwAuthenticate;
|
|
151
|
+
constructor(upstream, code, message, options) {
|
|
152
|
+
super(message);
|
|
153
|
+
this.name = "UpstreamError";
|
|
154
|
+
this.code = code;
|
|
155
|
+
this.upstream = upstream;
|
|
156
|
+
this.status = options?.status;
|
|
157
|
+
this.wwwAuthenticate = options?.wwwAuthenticate;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
class SecretNotFoundError extends Error {
|
|
162
|
+
code = "secret_missing";
|
|
163
|
+
secretName;
|
|
164
|
+
constructor(secretName) {
|
|
165
|
+
super(`Secret not found: ${secretName}. Run: mcpx secret set ${secretName}`);
|
|
166
|
+
this.name = "SecretNotFoundError";
|
|
167
|
+
this.secretName = secretName;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
var TIMEOUT_RE = /timed out after \d+ms/;
|
|
171
|
+
var UNREACHABLE_PATTERNS = [
|
|
172
|
+
/fetch failed/i,
|
|
173
|
+
/ECONNREFUSED/,
|
|
174
|
+
/ENOTFOUND/,
|
|
175
|
+
/EAI_AGAIN/,
|
|
176
|
+
/socket hang up/,
|
|
177
|
+
/ENOENT/,
|
|
178
|
+
/connect econnrefused/i
|
|
179
|
+
];
|
|
180
|
+
function classifyUpstreamError(upstream, error, wwwAuthenticate) {
|
|
181
|
+
if (error instanceof UpstreamError)
|
|
182
|
+
return error;
|
|
183
|
+
if (error instanceof SecretNotFoundError) {
|
|
184
|
+
return new UpstreamError(upstream, "secret_missing", error.message);
|
|
185
|
+
}
|
|
186
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
187
|
+
const maybeHttpError = error;
|
|
188
|
+
if (maybeHttpError?.code && (maybeHttpError.code === 401 || maybeHttpError.code === 403)) {
|
|
189
|
+
return new UpstreamError(upstream, "auth_required", message, {
|
|
190
|
+
status: maybeHttpError.code,
|
|
191
|
+
wwwAuthenticate
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
if (TIMEOUT_RE.test(message)) {
|
|
195
|
+
return new UpstreamError(upstream, "timeout", message);
|
|
196
|
+
}
|
|
197
|
+
if (UNREACHABLE_PATTERNS.some((p) => p.test(message))) {
|
|
198
|
+
return new UpstreamError(upstream, "unreachable", message);
|
|
199
|
+
}
|
|
200
|
+
return new UpstreamError(upstream, "upstream_error", message);
|
|
128
201
|
}
|
|
129
202
|
|
|
130
203
|
// src/core/secrets.ts
|
|
@@ -240,7 +313,7 @@ class SecretsManager {
|
|
|
240
313
|
return value;
|
|
241
314
|
const secret = this.getSecret(secretName);
|
|
242
315
|
if (!secret)
|
|
243
|
-
throw new
|
|
316
|
+
throw new SecretNotFoundError(secretName);
|
|
244
317
|
return secret;
|
|
245
318
|
}
|
|
246
319
|
rotateLocalToken(secretName = "local_gateway_token") {
|
|
@@ -260,4 +333,4 @@ function readSecretValueFromStdin() {
|
|
|
260
333
|
return content;
|
|
261
334
|
}
|
|
262
335
|
|
|
263
|
-
export { SecretsManager, readSecretValueFromStdin, validateServerName, addServer, removeServer, updateServer, setServerEnabled, getGatewayTokenSecretName, ensureGatewayToken, rotateGatewayToken, registerProject, unregisterProject, setProjectServerEnabled };
|
|
336
|
+
export { UpstreamError, SecretNotFoundError, classifyUpstreamError, SecretsManager, readSecretValueFromStdin, validateServerName, addServer, removeServer, updateServer, setServerEnabled, getGatewayTokenSecretName, ensureGatewayToken, rotateGatewayToken, registerProject, unregisterProject, setProjectServerEnabled };
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAq+DA,wBAAsB,MAAM,CAAC,IAAI,WAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAoE/D"}
|
package/dist/cli.js
CHANGED
|
@@ -30,7 +30,7 @@ import {
|
|
|
30
30
|
startDaemon,
|
|
31
31
|
stopDaemon,
|
|
32
32
|
toSecretRef
|
|
33
|
-
} from "./cli-
|
|
33
|
+
} from "./cli-mxmgxdm2.js";
|
|
34
34
|
import {
|
|
35
35
|
deleteSkill,
|
|
36
36
|
getAdapters,
|
|
@@ -38,17 +38,19 @@ import {
|
|
|
38
38
|
getSkill,
|
|
39
39
|
listSkills,
|
|
40
40
|
loadManagedIndex,
|
|
41
|
+
persistSyncState,
|
|
41
42
|
saveSkill,
|
|
42
43
|
syncAllClients
|
|
43
|
-
} from "./cli-
|
|
44
|
+
} from "./cli-n8vt375e.js";
|
|
44
45
|
import {
|
|
46
|
+
ConfigLoadError,
|
|
45
47
|
loadConfig,
|
|
46
48
|
loadMergedConfig,
|
|
47
49
|
loadProjectConfig,
|
|
48
50
|
resolveActiveConfig,
|
|
49
51
|
saveConfig,
|
|
50
52
|
saveProjectConfig
|
|
51
|
-
} from "./cli-
|
|
53
|
+
} from "./cli-csfsg1yf.js";
|
|
52
54
|
import {
|
|
53
55
|
SecretsManager,
|
|
54
56
|
addServer,
|
|
@@ -58,7 +60,7 @@ import {
|
|
|
58
60
|
removeServer,
|
|
59
61
|
rotateGatewayToken,
|
|
60
62
|
setServerEnabled
|
|
61
|
-
} from "./cli-
|
|
63
|
+
} from "./cli-tk8bggg5.js";
|
|
62
64
|
import {
|
|
63
65
|
getConfigPath,
|
|
64
66
|
getManagedIndexPath,
|
|
@@ -1072,8 +1074,9 @@ async function ensureDaemonIfEnabled(cliPath, secrets) {
|
|
|
1072
1074
|
async function autoSyncManagedEntries(config, cliPath) {
|
|
1073
1075
|
const secrets = new SecretsManager;
|
|
1074
1076
|
await ensureDaemonIfEnabled(cliPath, secrets);
|
|
1075
|
-
const
|
|
1076
|
-
|
|
1077
|
+
const summary = syncAllClients(config, secrets);
|
|
1078
|
+
persistSyncState(summary, config);
|
|
1079
|
+
saveConfig(config);
|
|
1077
1080
|
printSyncSummary(summary, false);
|
|
1078
1081
|
ensureExitCodeForSyncFailures(summary.hasErrors);
|
|
1079
1082
|
}
|
|
@@ -1567,6 +1570,8 @@ async function reconnectGatewayAndSync(cliPath) {
|
|
|
1567
1570
|
process.stdout.write(`${restart.message} pid=${restart.pid} port=${restart.port}
|
|
1568
1571
|
`);
|
|
1569
1572
|
const summary = syncAllClients(config, secrets);
|
|
1573
|
+
persistSyncState(summary, config);
|
|
1574
|
+
saveConfig(config);
|
|
1570
1575
|
printSyncSummary(summary, false);
|
|
1571
1576
|
}
|
|
1572
1577
|
async function setServerEnabledInteractively(rl, serverName, enabled, cliPath) {
|
|
@@ -1915,11 +1920,13 @@ function registerListCommand(parent) {
|
|
|
1915
1920
|
}
|
|
1916
1921
|
function registerSyncCommand(program, cliPath) {
|
|
1917
1922
|
program.command("sync [clients...]").option("--client <id>", "Limit sync to specific client(s), comma-separated or repeated", (value, prev = []) => [...prev, value], []).option("--json", "Output JSON").description("Sync gateway configuration to supported clients (e.g. `mcpx sync claude`)").action(async (clients, options) => {
|
|
1918
|
-
const config =
|
|
1923
|
+
const config = loadConfig();
|
|
1919
1924
|
const targetClients = parseClientList([...clients ?? [], ...options.client ?? []]);
|
|
1920
1925
|
const secrets = new SecretsManager;
|
|
1921
1926
|
await ensureDaemonIfEnabled(cliPath, secrets);
|
|
1922
|
-
const summary = syncAllClients(config, secrets, targetClients);
|
|
1927
|
+
const summary = syncAllClients(config, secrets, { targetClients });
|
|
1928
|
+
persistSyncState(summary, config);
|
|
1929
|
+
saveConfig(config);
|
|
1923
1930
|
printSyncSummary(summary, options.json ?? false);
|
|
1924
1931
|
ensureExitCodeForSyncFailures(summary.hasErrors);
|
|
1925
1932
|
});
|
|
@@ -2309,11 +2316,11 @@ function registerProjectCommands(program, cliPath) {
|
|
|
2309
2316
|
name: projectName,
|
|
2310
2317
|
servers: {}
|
|
2311
2318
|
};
|
|
2312
|
-
const { saveProjectConfig: saveProjectConfig2 } = await import("./config-
|
|
2319
|
+
const { saveProjectConfig: saveProjectConfig2 } = await import("./config-dtc3c79c.js");
|
|
2313
2320
|
saveProjectConfig2(localConfig, targetPath);
|
|
2314
2321
|
process.stdout.write(`Initialized project configuration at: ${targetPath}
|
|
2315
2322
|
`);
|
|
2316
|
-
const { registerProject: registerProject2 } = await import("./registry-
|
|
2323
|
+
const { registerProject: registerProject2 } = await import("./registry-n12thgf2.js");
|
|
2317
2324
|
const globalConfig = loadConfig();
|
|
2318
2325
|
registerProject2(globalConfig, process.cwd(), projectName);
|
|
2319
2326
|
saveConfig(globalConfig);
|
|
@@ -2344,7 +2351,7 @@ function registerProjectCommands(program, cliPath) {
|
|
|
2344
2351
|
process.exit(1);
|
|
2345
2352
|
}
|
|
2346
2353
|
const entry = globalConfig.projects[resolvedPath];
|
|
2347
|
-
const { unregisterProject: unregisterProject2 } = await import("./registry-
|
|
2354
|
+
const { unregisterProject: unregisterProject2 } = await import("./registry-n12thgf2.js");
|
|
2348
2355
|
unregisterProject2(globalConfig, resolvedPath);
|
|
2349
2356
|
saveConfig(globalConfig);
|
|
2350
2357
|
process.stdout.write(`Unregistered project "${entry.name}" (${resolvedPath}) from the global configuration.
|
|
@@ -2358,7 +2365,7 @@ function registerProjectCommands(program, cliPath) {
|
|
|
2358
2365
|
function registerPluginCommands(program, _cliPath) {
|
|
2359
2366
|
const plugin = program.command("plugin").description("Manage plugins");
|
|
2360
2367
|
plugin.command("inspect <source>").description("Inspect plugin manifest and components").action(async (source) => {
|
|
2361
|
-
const { inspectPlugin } = await import("./plugin-manager-
|
|
2368
|
+
const { inspectPlugin } = await import("./plugin-manager-1sjwfnah.js");
|
|
2362
2369
|
try {
|
|
2363
2370
|
const info = await inspectPlugin(source);
|
|
2364
2371
|
process.stdout.write(JSON.stringify(info, null, 2) + `
|
|
@@ -2370,7 +2377,7 @@ function registerPluginCommands(program, _cliPath) {
|
|
|
2370
2377
|
}
|
|
2371
2378
|
});
|
|
2372
2379
|
plugin.command("install <source>").option("--name <name>", "Plugin name").option("--no-enable", "Don't enable plugin after install").description("Install plugin").action(async (source, options) => {
|
|
2373
|
-
const { installPlugin } = await import("./plugin-manager-
|
|
2380
|
+
const { installPlugin } = await import("./plugin-manager-1sjwfnah.js");
|
|
2374
2381
|
try {
|
|
2375
2382
|
const p = await installPlugin(source, {
|
|
2376
2383
|
name: options.name,
|
|
@@ -2385,7 +2392,7 @@ function registerPluginCommands(program, _cliPath) {
|
|
|
2385
2392
|
}
|
|
2386
2393
|
});
|
|
2387
2394
|
plugin.command("approve <name> <component>").description("Approve a plugin component (hooks, mcpServers)").action(async (name, component) => {
|
|
2388
|
-
const { approvePluginComponent } = await import("./plugin-manager-
|
|
2395
|
+
const { approvePluginComponent } = await import("./plugin-manager-1sjwfnah.js");
|
|
2389
2396
|
try {
|
|
2390
2397
|
await approvePluginComponent(name, component);
|
|
2391
2398
|
process.stdout.write(`Approved ${component} for plugin ${name}
|
|
@@ -2397,7 +2404,7 @@ function registerPluginCommands(program, _cliPath) {
|
|
|
2397
2404
|
}
|
|
2398
2405
|
});
|
|
2399
2406
|
plugin.command("prepare <name>").description("Install plugin dependencies").action(async (name) => {
|
|
2400
|
-
const { preparePlugin } = await import("./plugin-manager-
|
|
2407
|
+
const { preparePlugin } = await import("./plugin-manager-1sjwfnah.js");
|
|
2401
2408
|
try {
|
|
2402
2409
|
await preparePlugin(name);
|
|
2403
2410
|
process.stdout.write(`Plugin ${name} prepared
|
|
@@ -2409,7 +2416,7 @@ function registerPluginCommands(program, _cliPath) {
|
|
|
2409
2416
|
}
|
|
2410
2417
|
});
|
|
2411
2418
|
plugin.command("update <name>").description("Update plugin to latest version").action(async (name) => {
|
|
2412
|
-
const { updatePlugin } = await import("./plugin-manager-
|
|
2419
|
+
const { updatePlugin } = await import("./plugin-manager-1sjwfnah.js");
|
|
2413
2420
|
try {
|
|
2414
2421
|
const p = await updatePlugin(name);
|
|
2415
2422
|
process.stdout.write(`Plugin ${name} updated to ${p.version}
|
|
@@ -2421,7 +2428,7 @@ function registerPluginCommands(program, _cliPath) {
|
|
|
2421
2428
|
}
|
|
2422
2429
|
});
|
|
2423
2430
|
plugin.command("uninstall <name>").option("--keep-data", "Keep plugin data after uninstall").description("Uninstall plugin").action(async (name, options) => {
|
|
2424
|
-
const { uninstallPlugin } = await import("./plugin-manager-
|
|
2431
|
+
const { uninstallPlugin } = await import("./plugin-manager-1sjwfnah.js");
|
|
2425
2432
|
try {
|
|
2426
2433
|
await uninstallPlugin(name, options.keepData || false);
|
|
2427
2434
|
process.stdout.write(`Plugin ${name} uninstalled
|
|
@@ -2433,7 +2440,7 @@ function registerPluginCommands(program, _cliPath) {
|
|
|
2433
2440
|
}
|
|
2434
2441
|
});
|
|
2435
2442
|
plugin.command("enable <name>").description("Enable plugin").action(async (name) => {
|
|
2436
|
-
const { enablePlugin } = await import("./plugin-manager-
|
|
2443
|
+
const { enablePlugin } = await import("./plugin-manager-1sjwfnah.js");
|
|
2437
2444
|
try {
|
|
2438
2445
|
await enablePlugin(name);
|
|
2439
2446
|
process.stdout.write(`Plugin ${name} enabled
|
|
@@ -2445,7 +2452,7 @@ function registerPluginCommands(program, _cliPath) {
|
|
|
2445
2452
|
}
|
|
2446
2453
|
});
|
|
2447
2454
|
plugin.command("disable <name>").description("Disable plugin").action(async (name) => {
|
|
2448
|
-
const { disablePlugin } = await import("./plugin-manager-
|
|
2455
|
+
const { disablePlugin } = await import("./plugin-manager-1sjwfnah.js");
|
|
2449
2456
|
try {
|
|
2450
2457
|
await disablePlugin(name);
|
|
2451
2458
|
process.stdout.write(`Plugin ${name} disabled
|
|
@@ -2457,7 +2464,7 @@ function registerPluginCommands(program, _cliPath) {
|
|
|
2457
2464
|
}
|
|
2458
2465
|
});
|
|
2459
2466
|
plugin.command("status [name]").description("Show plugin status").action(async (name) => {
|
|
2460
|
-
const { getPluginStatus, listPlugins } = await import("./plugin-manager-
|
|
2467
|
+
const { getPluginStatus, listPlugins } = await import("./plugin-manager-1sjwfnah.js");
|
|
2461
2468
|
try {
|
|
2462
2469
|
if (name) {
|
|
2463
2470
|
const p = await getPluginStatus(name);
|
|
@@ -2550,8 +2557,25 @@ async function runCli(argv = process.argv) {
|
|
|
2550
2557
|
}
|
|
2551
2558
|
if (process.argv[1] && import.meta.url === pathToFileURL(fs.realpathSync(process.argv[1])).href) {
|
|
2552
2559
|
runCli().catch((error) => {
|
|
2553
|
-
|
|
2560
|
+
if (error instanceof ConfigLoadError) {
|
|
2561
|
+
process.stderr.write(`Config error: ${error.message}
|
|
2562
|
+
`);
|
|
2563
|
+
if (error.backupPath) {
|
|
2564
|
+
process.stderr.write(`Backup saved to: ${error.backupPath}
|
|
2565
|
+
`);
|
|
2566
|
+
}
|
|
2567
|
+
if (error.issues && error.issues.length > 0) {
|
|
2568
|
+
for (const issue of error.issues.slice(0, 5)) {
|
|
2569
|
+
process.stderr.write(` - ${issue}
|
|
2570
|
+
`);
|
|
2571
|
+
}
|
|
2572
|
+
}
|
|
2573
|
+
process.stderr.write(`Fix the config file or restore from backup.
|
|
2554
2574
|
`);
|
|
2575
|
+
} else {
|
|
2576
|
+
process.stderr.write(`${error.message}
|
|
2577
|
+
`);
|
|
2578
|
+
}
|
|
2555
2579
|
process.exit(1);
|
|
2556
2580
|
});
|
|
2557
2581
|
}
|
|
@@ -1,20 +1,24 @@
|
|
|
1
1
|
import {
|
|
2
|
+
ConfigLoadError,
|
|
2
3
|
defaultConfig,
|
|
3
4
|
loadConfig,
|
|
4
5
|
loadMergedConfig,
|
|
5
6
|
loadProjectConfig,
|
|
7
|
+
migrateProjectServers,
|
|
6
8
|
resolveActiveConfig,
|
|
7
9
|
saveConfig,
|
|
8
10
|
saveProjectConfig
|
|
9
|
-
} from "./cli-
|
|
11
|
+
} from "./cli-csfsg1yf.js";
|
|
10
12
|
import"./cli-zjepj3sj.js";
|
|
11
13
|
import"./cli-s4gspqdf.js";
|
|
12
14
|
export {
|
|
13
15
|
saveProjectConfig,
|
|
14
16
|
saveConfig,
|
|
15
17
|
resolveActiveConfig,
|
|
18
|
+
migrateProjectServers,
|
|
16
19
|
loadProjectConfig,
|
|
17
20
|
loadMergedConfig,
|
|
18
21
|
loadConfig,
|
|
19
|
-
defaultConfig
|
|
22
|
+
defaultConfig,
|
|
23
|
+
ConfigLoadError
|
|
20
24
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-repair.d.ts","sourceRoot":"","sources":["../../src/core/config-repair.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAsB,MAAM,aAAa,CAAC;AAsDlE,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,
|
|
1
|
+
{"version":3,"file":"config-repair.d.ts","sourceRoot":"","sources":["../../src/core/config-repair.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAsB,MAAM,aAAa,CAAC;AAsDlE,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAwB3D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-store.d.ts","sourceRoot":"","sources":["../../src/core/config-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AA+C9C,wBAAsB,YAAY,CAAC,CAAC,EAClC,EAAE,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAC1C,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,CAAC,CAAC,CAQZ"}
|
package/dist/core/config.d.ts
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
import { type McpxConfig, type UpstreamServerSpec } from "../types.js";
|
|
2
|
+
export declare class ConfigLoadError extends Error {
|
|
3
|
+
readonly configPath: string;
|
|
4
|
+
readonly backupPath?: string;
|
|
5
|
+
readonly issues?: string[];
|
|
6
|
+
constructor(configPath: string, message: string, issues?: string[]);
|
|
7
|
+
}
|
|
2
8
|
export interface ProjectLocalConfig {
|
|
3
9
|
name?: string;
|
|
4
10
|
servers: Record<string, UpstreamServerSpec>;
|
|
@@ -6,7 +12,9 @@ export interface ProjectLocalConfig {
|
|
|
6
12
|
export declare function defaultConfig(): McpxConfig;
|
|
7
13
|
export declare function loadConfig(configPath?: string): McpxConfig;
|
|
8
14
|
export declare function saveConfig(config: McpxConfig, configPath?: string): void;
|
|
9
|
-
export declare function loadProjectConfig(projectConfigPath: string
|
|
15
|
+
export declare function loadProjectConfig(projectConfigPath: string, options?: {
|
|
16
|
+
strict?: boolean;
|
|
17
|
+
}): ProjectLocalConfig;
|
|
10
18
|
export declare function saveProjectConfig(config: ProjectLocalConfig, projectConfigPath: string): void;
|
|
11
19
|
export declare function loadMergedConfig(configPath?: string): McpxConfig;
|
|
12
20
|
export interface ActiveConfigContext {
|
|
@@ -16,6 +24,10 @@ export interface ActiveConfigContext {
|
|
|
16
24
|
config: McpxConfig;
|
|
17
25
|
save: () => void;
|
|
18
26
|
}
|
|
27
|
+
export declare function migrateProjectServers(config: McpxConfig, projectPath: string): {
|
|
28
|
+
migrated: string[];
|
|
29
|
+
conflicts: string[];
|
|
30
|
+
};
|
|
19
31
|
export declare function resolveActiveConfig(options?: {
|
|
20
32
|
global?: boolean;
|
|
21
33
|
local?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAA6C,KAAK,UAAU,EAAwB,KAAK,kBAAkB,EAAuE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAA6C,KAAK,UAAU,EAAwB,KAAK,kBAAkB,EAAuE,MAAM,aAAa,CAAC;AAK7M,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;gBAEf,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE;CAMnE;AA0GD,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;CAC7C;AAOD,wBAAgB,aAAa,IAAI,UAAU,CAa1C;AAED,wBAAgB,UAAU,CAAC,UAAU,SAAkB,GAAG,UAAU,CAyDnE;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,SAAkB,GAAG,IAAI,CAMjF;AAED,wBAAgB,iBAAiB,CAAC,iBAAiB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,kBAAkB,CAmB/G;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAK7F;AAED,wBAAgB,gBAAgB,CAAC,UAAU,SAAkB,GAAG,UAAU,CA+BzE;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,CA0B1H;AAED,wBAAgB,mBAAmB,CAAC,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,mBAAmB,CAyB5G"}
|
package/dist/core/daemon.d.ts
CHANGED
|
@@ -13,7 +13,7 @@ export interface DaemonStartResult {
|
|
|
13
13
|
port: number;
|
|
14
14
|
message: string;
|
|
15
15
|
}
|
|
16
|
-
export declare function resolveGatewayPort(config: McpxConfig): Promise<number>;
|
|
16
|
+
export declare function resolveGatewayPort(config: McpxConfig, secrets?: SecretsManager): Promise<number>;
|
|
17
17
|
export declare function getDaemonStatus(config: McpxConfig): DaemonStatus;
|
|
18
18
|
export declare function startDaemon(config: McpxConfig, cliPath: string, secrets: SecretsManager): Promise<DaemonStartResult>;
|
|
19
19
|
export declare function stopDaemon(): {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/core/daemon.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/core/daemon.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAK9C,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AA6CD,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAgCtG;AA6BD,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,YAAY,CAmBhE;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA+C1H;AAED,wBAAgB,UAAU,IAAI;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA8ClE;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAG5H;AAED,wBAAgB,cAAc,CAAC,QAAQ,SAAM,GAAG,MAAM,CAQrD;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAqB5G"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type UpstreamErrorCode = "auth_required" | "auth_expired" | "secret_missing" | "unreachable" | "timeout" | "upstream_error";
|
|
2
|
+
export declare class UpstreamError extends Error {
|
|
3
|
+
readonly code: UpstreamErrorCode;
|
|
4
|
+
readonly upstream: string;
|
|
5
|
+
readonly status?: number;
|
|
6
|
+
readonly wwwAuthenticate?: string;
|
|
7
|
+
constructor(upstream: string, code: UpstreamErrorCode, message: string, options?: {
|
|
8
|
+
status?: number;
|
|
9
|
+
wwwAuthenticate?: string;
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
export declare class SecretNotFoundError extends Error {
|
|
13
|
+
readonly code: UpstreamErrorCode;
|
|
14
|
+
readonly secretName: string;
|
|
15
|
+
constructor(secretName: string);
|
|
16
|
+
}
|
|
17
|
+
export declare function classifyUpstreamError(upstream: string, error: unknown, wwwAuthenticate?: string): UpstreamError;
|
|
18
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GACzB,eAAe,GACf,cAAc,GACd,gBAAgB,GAChB,aAAa,GACb,SAAS,GACT,gBAAgB,CAAC;AAErB,qBAAa,aAAc,SAAQ,KAAK;IACtC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;gBAEtB,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE;CAQhI;AAED,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAoB;IACpD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAEhB,UAAU,EAAE,MAAM;CAK/B;AAaD,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,EACd,eAAe,CAAC,EAAE,MAAM,GACvB,aAAa,CA0Bf"}
|
package/dist/core/index.d.ts
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
export { loadConfig, saveConfig, defaultConfig, loadMergedConfig, loadProjectConfig, saveProjectConfig } from "./config.js";
|
|
1
|
+
export { loadConfig, saveConfig, defaultConfig, loadMergedConfig, loadProjectConfig, saveProjectConfig, ConfigLoadError, migrateProjectServers } from "./config.js";
|
|
2
|
+
export { mutateConfig } from "./config-store.js";
|
|
3
|
+
export { UpstreamError, SecretNotFoundError, classifyUpstreamError } from "./errors.js";
|
|
4
|
+
export type { UpstreamErrorCode } from "./errors.js";
|
|
2
5
|
export { parseCliAddCommand, tokenizeCommandLine } from "./add-command.js";
|
|
3
6
|
export { buildEnrichedPath } from "./spawn-env.js";
|
|
4
7
|
export { runOAuthLogin, getOAuthAccessToken, isOAuthReference, oauthReferenceServerName } from "./oauth.js";
|
|
5
8
|
export type { OAuthCodeReceiver } from "./oauth.js";
|
|
6
9
|
export { getDaemonStatus, startDaemon, stopDaemon, restartDaemon, readDaemonLogs, runDaemonForeground } from "./daemon.js";
|
|
7
10
|
export type { DaemonStatus, DaemonStartResult } from "./daemon.js";
|
|
8
|
-
export { syncAllClients, getGatewayUrl } from "./sync.js";
|
|
11
|
+
export { syncAllClients, getGatewayUrl, persistSyncState } from "./sync.js";
|
|
9
12
|
export type { SyncSummary } from "./sync.js";
|
|
10
13
|
export { addServer, removeServer, updateServer, setServerEnabled, setProjectServerEnabled, registerProject, unregisterProject, ensureGatewayToken, rotateGatewayToken } from "./registry.js";
|
|
11
14
|
export { listSkills, getSkill, saveSkill, deleteSkill } from "./skills.js";
|
package/dist/core/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"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"}
|