@samanhappy/mcphub 1.0.38 → 1.0.40
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/betterAuth.js +23 -0
- package/dist/betterAuth.js.map +1 -1
- package/dist/controllers/smartRoutingController.js +408 -0
- package/dist/controllers/smartRoutingController.js.map +1 -0
- package/dist/dao/CredentialBindingDao.js +5 -0
- package/dist/dao/CredentialBindingDao.js.map +1 -1
- package/dist/dao/CredentialBindingDaoDbImpl.js +7 -0
- package/dist/dao/CredentialBindingDaoDbImpl.js.map +1 -1
- package/dist/db/connection.js +38 -11
- package/dist/db/connection.js.map +1 -1
- package/dist/db/groupSchema.js +2 -2
- package/dist/db/groupSchema.js.map +1 -1
- package/dist/db/repositories/ActivityRepository.js +2 -2
- package/dist/db/repositories/ActivityRepository.js.map +1 -1
- package/dist/db/repositories/BaseRepository.js +4 -1
- package/dist/db/repositories/BaseRepository.js.map +1 -1
- package/dist/db/repositories/BearerKeyRepository.js +3 -1
- package/dist/db/repositories/BearerKeyRepository.js.map +1 -1
- package/dist/db/repositories/BuiltinPromptRepository.js +2 -2
- package/dist/db/repositories/BuiltinPromptRepository.js.map +1 -1
- package/dist/db/repositories/BuiltinResourceRepository.js +2 -2
- package/dist/db/repositories/BuiltinResourceRepository.js.map +1 -1
- package/dist/db/repositories/GroupRepository.js +2 -2
- package/dist/db/repositories/GroupRepository.js.map +1 -1
- package/dist/db/repositories/OAuthClientRepository.js +2 -2
- package/dist/db/repositories/OAuthClientRepository.js.map +1 -1
- package/dist/db/repositories/OAuthTokenRepository.js +3 -1
- package/dist/db/repositories/OAuthTokenRepository.js.map +1 -1
- package/dist/db/repositories/ServerRepository.js +2 -2
- package/dist/db/repositories/ServerRepository.js.map +1 -1
- package/dist/db/repositories/UserConfigRepository.js +2 -2
- package/dist/db/repositories/UserConfigRepository.js.map +1 -1
- package/dist/db/repositories/UserRepository.js +3 -1
- package/dist/db/repositories/UserRepository.js.map +1 -1
- package/dist/db/repositories/VectorEmbeddingRepository.js +35 -3
- package/dist/db/repositories/VectorEmbeddingRepository.js.map +1 -1
- package/dist/middlewares/auth.js +1 -1
- package/dist/middlewares/auth.js.map +1 -1
- package/dist/middlewares/index.js +8 -1
- package/dist/middlewares/index.js.map +1 -1
- package/dist/routes/index.js +4 -0
- package/dist/routes/index.js.map +1 -1
- package/dist/services/mcpOAuthProvider.js +7 -0
- package/dist/services/mcpOAuthProvider.js.map +1 -1
- package/dist/services/mcpService.js +178 -20
- package/dist/services/mcpService.js.map +1 -1
- package/dist/services/principalRuntimeService.js +1 -3
- package/dist/services/principalRuntimeService.js.map +1 -1
- package/dist/services/vectorSearchService.js +29 -10
- package/dist/services/vectorSearchService.js.map +1 -1
- package/dist/utils/cacheUtils.js +345 -1
- package/dist/utils/cacheUtils.js.map +1 -1
- package/dist/utils/packageUpdate.js +242 -0
- package/dist/utils/packageUpdate.js.map +1 -0
- package/dist/utils/serialization.js +14 -2
- package/dist/utils/serialization.js.map +1 -1
- package/dist/utils/serverConfigPersistence.js +18 -0
- package/dist/utils/serverConfigPersistence.js.map +1 -1
- package/dist/utils/upstreamError.js +60 -0
- package/dist/utils/upstreamError.js.map +1 -0
- package/dist/utils/withTimeout.js +25 -0
- package/dist/utils/withTimeout.js.map +1 -0
- package/frontend/dist/assets/{ActivityPage-BZNq-eGE.js → ActivityPage-B5DanW8q.js} +2 -2
- package/frontend/dist/assets/{ActivityPage-BZNq-eGE.js.map → ActivityPage-B5DanW8q.js.map} +1 -1
- package/frontend/dist/assets/CopyClientConfigDialog-C6U6_eyy.js +4 -0
- package/frontend/dist/assets/CopyClientConfigDialog-C6U6_eyy.js.map +1 -0
- package/frontend/dist/assets/{CredentialsPage-7kyDJLsX.js → CredentialsPage-CXK8Xkao.js} +2 -2
- package/frontend/dist/assets/{CredentialsPage-7kyDJLsX.js.map → CredentialsPage-CXK8Xkao.js.map} +1 -1
- package/frontend/dist/assets/Dashboard-LIC6BqIA.js +2 -0
- package/frontend/dist/assets/{Dashboard-CElNx820.js.map → Dashboard-LIC6BqIA.js.map} +1 -1
- package/frontend/dist/assets/EndpointCopy-CeZbEsF2.js +2 -0
- package/frontend/dist/assets/EndpointCopy-CeZbEsF2.js.map +1 -0
- package/frontend/dist/assets/GroupsPage-DwVaRIap.js +33 -0
- package/frontend/dist/assets/GroupsPage-DwVaRIap.js.map +1 -0
- package/frontend/dist/assets/{LoginPage-D23s7oM0.js → LoginPage-CPqSMwWO.js} +2 -2
- package/frontend/dist/assets/{LoginPage-D23s7oM0.js.map → LoginPage-CPqSMwWO.js.map} +1 -1
- package/frontend/dist/assets/{LogsPage-BuQMkmV-.js → LogsPage-eCHGem9T.js} +2 -2
- package/frontend/dist/assets/{LogsPage-BuQMkmV-.js.map → LogsPage-eCHGem9T.js.map} +1 -1
- package/frontend/dist/assets/{MarketPage-g9vEYzIq.js → MarketPage-RqD2-rxq.js} +2 -2
- package/frontend/dist/assets/{MarketPage-g9vEYzIq.js.map → MarketPage-RqD2-rxq.js.map} +1 -1
- package/frontend/dist/assets/{OAuthConsentPage-BiX1lpJR.js → OAuthConsentPage-DJITYpCM.js} +2 -2
- package/frontend/dist/assets/{OAuthConsentPage-BiX1lpJR.js.map → OAuthConsentPage-DJITYpCM.js.map} +1 -1
- package/frontend/dist/assets/{PromptsPage-g8SRFY6s.js → PromptsPage-DQ02iDOJ.js} +2 -2
- package/frontend/dist/assets/{PromptsPage-g8SRFY6s.js.map → PromptsPage-DQ02iDOJ.js.map} +1 -1
- package/frontend/dist/assets/{ResourcesPage-Ddhxi9Sf.js → ResourcesPage-mUU0DVus.js} +2 -2
- package/frontend/dist/assets/{ResourcesPage-Ddhxi9Sf.js.map → ResourcesPage-mUU0DVus.js.map} +1 -1
- package/frontend/dist/assets/ServersPage-DsS8j6tl.js +39 -0
- package/frontend/dist/assets/ServersPage-DsS8j6tl.js.map +1 -0
- package/frontend/dist/assets/SettingsPage-CIeF1sDE.js +12 -0
- package/frontend/dist/assets/SettingsPage-CIeF1sDE.js.map +1 -0
- package/frontend/dist/assets/{StatusDot-CdzMqjTi.js → StatusDot-Bcv2BwIL.js} +2 -2
- package/frontend/dist/assets/{StatusDot-CdzMqjTi.js.map → StatusDot-Bcv2BwIL.js.map} +1 -1
- package/frontend/dist/assets/{ToggleGroup-CJd8X_31.js → ToggleGroup-C_7sDUlr.js} +2 -2
- package/frontend/dist/assets/{ToggleGroup-CJd8X_31.js.map → ToggleGroup-C_7sDUlr.js.map} +1 -1
- package/frontend/dist/assets/{UsersPage-CkP_x9Rt.js → UsersPage-ufaG2-Ag.js} +2 -2
- package/frontend/dist/assets/{UsersPage-CkP_x9Rt.js.map → UsersPage-ufaG2-Ag.js.map} +1 -1
- package/frontend/dist/assets/clipboard-BukcCPLt.js +2 -0
- package/frontend/dist/assets/clipboard-BukcCPLt.js.map +1 -0
- package/frontend/dist/assets/{icons-vendor-VW-UwEhw.js → icons-vendor-CNEaJWqW.js} +79 -59
- package/frontend/dist/assets/icons-vendor-CNEaJWqW.js.map +1 -0
- package/frontend/dist/assets/index-C8aAOWR7.js +3 -0
- package/frontend/dist/assets/{index-Bu4XuAH4.js.map → index-C8aAOWR7.js.map} +1 -1
- package/frontend/dist/assets/index-D4Vy78bV.css +1 -0
- package/frontend/dist/assets/{resourceService-w-cZ31FD.js → resourceService-CN5cMjQ0.js} +2 -2
- package/frontend/dist/assets/{resourceService-w-cZ31FD.js.map → resourceService-CN5cMjQ0.js.map} +1 -1
- package/frontend/dist/assets/{useCostData-C72NC0PQ.js → useCostData-B9XzWVsV.js} +2 -2
- package/frontend/dist/assets/{useCostData-C72NC0PQ.js.map → useCostData-B9XzWVsV.js.map} +1 -1
- package/frontend/dist/assets/useSettingsData-J_hwKZA6.js +2 -0
- package/frontend/dist/assets/{useSettingsData-JTEMu74D.js.map → useSettingsData-J_hwKZA6.js.map} +1 -1
- package/frontend/dist/assets/variableDetection-Dxw0g2ON.js +16 -0
- package/frontend/dist/assets/variableDetection-Dxw0g2ON.js.map +1 -0
- package/frontend/dist/index.html +3 -3
- package/package.json +2 -1
- package/frontend/dist/assets/Dashboard-CElNx820.js +0 -2
- package/frontend/dist/assets/EndpointCopy-8jW5Xtka.js +0 -2
- package/frontend/dist/assets/EndpointCopy-8jW5Xtka.js.map +0 -1
- package/frontend/dist/assets/GroupsPage-dUkvX_iB.js +0 -33
- package/frontend/dist/assets/GroupsPage-dUkvX_iB.js.map +0 -1
- package/frontend/dist/assets/ServersPage-DAmKvrPV.js +0 -39
- package/frontend/dist/assets/ServersPage-DAmKvrPV.js.map +0 -1
- package/frontend/dist/assets/SettingsPage-DZXjQZXS.js +0 -12
- package/frontend/dist/assets/SettingsPage-DZXjQZXS.js.map +0 -1
- package/frontend/dist/assets/icons-vendor-VW-UwEhw.js.map +0 -1
- package/frontend/dist/assets/index-B3OqAhGz.css +0 -1
- package/frontend/dist/assets/index-Bu4XuAH4.js +0 -3
- package/frontend/dist/assets/toolDescription-Dw3sa28K.js +0 -2
- package/frontend/dist/assets/toolDescription-Dw3sa28K.js.map +0 -1
- package/frontend/dist/assets/useSettingsData-JTEMu74D.js +0 -2
- package/frontend/dist/assets/variableDetection-DfhNyFy-.js +0 -16
- package/frontend/dist/assets/variableDetection-DfhNyFy-.js.map +0 -1
package/dist/utils/cacheUtils.js
CHANGED
|
@@ -83,10 +83,39 @@ export const resolveNpxPackageSpecs = (args) => {
|
|
|
83
83
|
* `cowsay@1.5.0` -> `cowsay`, `@scope/pkg@1.2.3` -> `@scope/pkg`, `@scope/pkg`
|
|
84
84
|
* unchanged (its only `@` is the scope marker at position 0).
|
|
85
85
|
*/
|
|
86
|
-
const packageNameFromSpec = (spec) => {
|
|
86
|
+
export const packageNameFromSpec = (spec) => {
|
|
87
87
|
const separator = spec.lastIndexOf('@');
|
|
88
88
|
return separator > 0 ? spec.slice(0, separator) : spec;
|
|
89
89
|
};
|
|
90
|
+
/**
|
|
91
|
+
* Strip the constraint/extras/marker from a PEP 508 uvx package spec:
|
|
92
|
+
* `cowsay==1.2` -> `cowsay`, `cowsay>=1.0` -> `cowsay`, `pkg[extra]` -> `pkg`,
|
|
93
|
+
* `pkg; python_version < "3.12"` -> `pkg`, `pkg @ https://...` -> `pkg`.
|
|
94
|
+
* uvx specs are PEP 508, so the npm-style `@version` strip above does not apply.
|
|
95
|
+
*/
|
|
96
|
+
export const uvxPackageNameFromSpec = (spec) => {
|
|
97
|
+
let name = spec.trim();
|
|
98
|
+
const extras = name.indexOf('[');
|
|
99
|
+
if (extras > 0)
|
|
100
|
+
name = name.slice(0, extras);
|
|
101
|
+
const marker = name.indexOf(';');
|
|
102
|
+
if (marker > 0)
|
|
103
|
+
name = name.slice(0, marker);
|
|
104
|
+
const directReference = name.indexOf(' @ ');
|
|
105
|
+
if (directReference > 0)
|
|
106
|
+
name = name.slice(0, directReference);
|
|
107
|
+
const constraint = name.search(/[<>=~!]/);
|
|
108
|
+
if (constraint > 0)
|
|
109
|
+
name = name.slice(0, constraint);
|
|
110
|
+
return name.trim();
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* Lenient whitelist for package names handed to `npm view` / `uv pip compile`:
|
|
114
|
+
* anything else (a leading `-`, spaces, `=` constraints that failed to strip)
|
|
115
|
+
* is skipped instead of being interpolated into a subprocess argument or a
|
|
116
|
+
* filesystem path. Scoped npm names keep their `/`.
|
|
117
|
+
*/
|
|
118
|
+
export const isValidPackageName = (name) => /^[@a-zA-Z0-9][a-zA-Z0-9@_.\-/]*$/.test(name);
|
|
90
119
|
/**
|
|
91
120
|
* Decide whether one `_npx` entry belongs to the packages being reinstalled.
|
|
92
121
|
*
|
|
@@ -184,6 +213,321 @@ export const clearRunnerCache = async (command, args = []) => {
|
|
|
184
213
|
}
|
|
185
214
|
// uvx: cache refresh is handled via --refresh flag injection in createTransportFromConfig
|
|
186
215
|
};
|
|
216
|
+
/**
|
|
217
|
+
* Get the uv tool install directory (the environments `uv tool install` creates).
|
|
218
|
+
* Platform-aware: honors UV_TOOL_DIR, then XDG_DATA_HOME/uv/tools on posix and
|
|
219
|
+
* %APPDATA%/uv/tools on Windows, matching uv's own defaults.
|
|
220
|
+
*/
|
|
221
|
+
export const getUvToolDir = () => {
|
|
222
|
+
if (process.env.UV_TOOL_DIR)
|
|
223
|
+
return process.env.UV_TOOL_DIR;
|
|
224
|
+
if (process.platform === 'win32') {
|
|
225
|
+
return path.join(process.env.APPDATA || path.join(os.homedir(), 'AppData', 'Roaming'), 'uv', 'tools');
|
|
226
|
+
}
|
|
227
|
+
if (process.env.XDG_DATA_HOME)
|
|
228
|
+
return path.join(process.env.XDG_DATA_HOME, 'uv', 'tools');
|
|
229
|
+
return path.join(os.homedir(), '.local', 'share', 'uv', 'tools');
|
|
230
|
+
};
|
|
231
|
+
/**
|
|
232
|
+
* Get the uv cache directory (where uvx keeps its ephemeral environments).
|
|
233
|
+
* Platform-aware: honors UV_CACHE_DIR, then XDG_CACHE_HOME/uv on posix and
|
|
234
|
+
* %LOCALAPPDATA%/uv/cache on Windows, matching uv's own defaults.
|
|
235
|
+
*/
|
|
236
|
+
export const getUvCacheDir = () => {
|
|
237
|
+
if (process.env.UV_CACHE_DIR)
|
|
238
|
+
return process.env.UV_CACHE_DIR;
|
|
239
|
+
if (process.platform === 'win32') {
|
|
240
|
+
return path.join(process.env.LOCALAPPDATA || path.join(os.homedir(), 'AppData', 'Local'), 'uv', 'cache');
|
|
241
|
+
}
|
|
242
|
+
if (process.env.XDG_CACHE_HOME)
|
|
243
|
+
return path.join(process.env.XDG_CACHE_HOME, 'uv');
|
|
244
|
+
return path.join(os.homedir(), '.cache', 'uv');
|
|
245
|
+
};
|
|
246
|
+
/**
|
|
247
|
+
* Derive the package spec a `uvx` invocation runs, from a server's args.
|
|
248
|
+
*
|
|
249
|
+
* Mirrors uvx's argument shape: a --from PACKAGE option names the package
|
|
250
|
+
* explicitly (and may repeat), otherwise the first bare token is the
|
|
251
|
+
* command/package. Options that take a value are skipped together with their
|
|
252
|
+
* value so their arguments are not mistaken for the package (-p 3.12 is a
|
|
253
|
+
* python version, not a package). Everything after the package is the server's
|
|
254
|
+
* own args.
|
|
255
|
+
*/
|
|
256
|
+
export const resolveUvxPackageSpec = (args) => {
|
|
257
|
+
// Every uvx option that takes a value (from `uvx --help`), long and short
|
|
258
|
+
// forms, so their values are skipped instead of being mistaken for the
|
|
259
|
+
// package. `--from` is handled separately since it names the package.
|
|
260
|
+
const valueOptions = new Set([
|
|
261
|
+
'--from',
|
|
262
|
+
'--with',
|
|
263
|
+
'-w',
|
|
264
|
+
'--with-editable',
|
|
265
|
+
'--with-requirements',
|
|
266
|
+
'-c',
|
|
267
|
+
'--constraints',
|
|
268
|
+
'-b',
|
|
269
|
+
'--build-constraints',
|
|
270
|
+
'--overrides',
|
|
271
|
+
'--env-file',
|
|
272
|
+
'--python-platform',
|
|
273
|
+
'--torch-backend',
|
|
274
|
+
'-p',
|
|
275
|
+
'--python',
|
|
276
|
+
'--index',
|
|
277
|
+
'--default-index',
|
|
278
|
+
'-i',
|
|
279
|
+
'--index-url',
|
|
280
|
+
'--extra-index-url',
|
|
281
|
+
'-f',
|
|
282
|
+
'--find-links',
|
|
283
|
+
'--index-strategy',
|
|
284
|
+
'--keyring-provider',
|
|
285
|
+
'-P',
|
|
286
|
+
'--upgrade-package',
|
|
287
|
+
'--upgrade-group',
|
|
288
|
+
'--resolution',
|
|
289
|
+
'--prerelease',
|
|
290
|
+
'--prerelease-package',
|
|
291
|
+
'--fork-strategy',
|
|
292
|
+
]);
|
|
293
|
+
for (let i = 0; i < args.length; i += 1) {
|
|
294
|
+
const arg = args[i];
|
|
295
|
+
if (arg === '--from') {
|
|
296
|
+
const value = args[i + 1];
|
|
297
|
+
if (value !== undefined)
|
|
298
|
+
return value;
|
|
299
|
+
continue;
|
|
300
|
+
}
|
|
301
|
+
if (arg.startsWith('--from=')) {
|
|
302
|
+
return arg.slice('--from='.length);
|
|
303
|
+
}
|
|
304
|
+
if (valueOptions.has(arg)) {
|
|
305
|
+
i += 1; // skip the option's value
|
|
306
|
+
continue;
|
|
307
|
+
}
|
|
308
|
+
if (arg.startsWith('-')) {
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
// The first bare token is the package; the rest are the server's own args.
|
|
312
|
+
return arg;
|
|
313
|
+
}
|
|
314
|
+
return undefined;
|
|
315
|
+
};
|
|
316
|
+
/**
|
|
317
|
+
* PEP 503 name normalization, matching how pip/uv spell dist-info directories:
|
|
318
|
+
* `mcp-server-fetch` and `mcp_server.fetch` both become `mcp_server_fetch`.
|
|
319
|
+
*/
|
|
320
|
+
export const normalizePackageName = (name) => name.toLowerCase().replace(/[-_.]+/g, '_');
|
|
321
|
+
/**
|
|
322
|
+
* Read the installed version of `packageName` from a python environment root
|
|
323
|
+
* (a uv tool install env or a uvx cache environment). The version lives in
|
|
324
|
+
* the NAME-VERSION.dist-info directory inside site-packages under lib, the
|
|
325
|
+
* same layout pip/uv write everywhere.
|
|
326
|
+
*/
|
|
327
|
+
const scanDistInfoVersion = async (envRoot, packageName) => {
|
|
328
|
+
const normalized = normalizePackageName(packageName);
|
|
329
|
+
let libs;
|
|
330
|
+
try {
|
|
331
|
+
libs = await fs.promises.readdir(path.join(envRoot, 'lib'));
|
|
332
|
+
}
|
|
333
|
+
catch {
|
|
334
|
+
return undefined;
|
|
335
|
+
}
|
|
336
|
+
for (const lib of libs) {
|
|
337
|
+
let files;
|
|
338
|
+
try {
|
|
339
|
+
files = await fs.promises.readdir(path.join(envRoot, 'lib', lib, 'site-packages'));
|
|
340
|
+
}
|
|
341
|
+
catch {
|
|
342
|
+
continue;
|
|
343
|
+
}
|
|
344
|
+
for (const file of files) {
|
|
345
|
+
if (!file.endsWith('.dist-info'))
|
|
346
|
+
continue;
|
|
347
|
+
const base = file.slice(0, -'.dist-info'.length);
|
|
348
|
+
const separator = base.lastIndexOf('-');
|
|
349
|
+
if (separator <= 0)
|
|
350
|
+
continue;
|
|
351
|
+
if (normalizePackageName(base.slice(0, separator)) !== normalized)
|
|
352
|
+
continue;
|
|
353
|
+
const version = base.slice(separator + 1);
|
|
354
|
+
if (version)
|
|
355
|
+
return version;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
return undefined;
|
|
359
|
+
};
|
|
360
|
+
/**
|
|
361
|
+
* List the ephemeral uvx environments uv keeps in its cache. Modern uv stores
|
|
362
|
+
* them under environments-v2/PYHASH/ENVHASH (each a symlink into the archive);
|
|
363
|
+
* older layouts kept the env directly under the cache root. Only the cache
|
|
364
|
+
* layout matters, never npm's — returns [] when nothing is found.
|
|
365
|
+
*/
|
|
366
|
+
const listUvCacheEnvironments = async (cacheDir) => {
|
|
367
|
+
const envsRoot = path.join(cacheDir, 'environments-v2');
|
|
368
|
+
try {
|
|
369
|
+
const pyHashes = await fs.promises.readdir(envsRoot);
|
|
370
|
+
const envs = [];
|
|
371
|
+
for (const pyHash of pyHashes) {
|
|
372
|
+
let entries;
|
|
373
|
+
try {
|
|
374
|
+
entries = await fs.promises.readdir(path.join(envsRoot, pyHash));
|
|
375
|
+
}
|
|
376
|
+
catch {
|
|
377
|
+
continue;
|
|
378
|
+
}
|
|
379
|
+
for (const entry of entries) {
|
|
380
|
+
envs.push(path.join(envsRoot, pyHash, entry));
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
return envs;
|
|
384
|
+
}
|
|
385
|
+
catch {
|
|
386
|
+
// Fallback for older uv layouts without environments-v2.
|
|
387
|
+
try {
|
|
388
|
+
const entries = await fs.promises.readdir(cacheDir);
|
|
389
|
+
const envs = [];
|
|
390
|
+
for (const entry of entries) {
|
|
391
|
+
const candidate = path.join(cacheDir, entry);
|
|
392
|
+
try {
|
|
393
|
+
await fs.promises.access(path.join(candidate, 'pyvenv.cfg'));
|
|
394
|
+
envs.push(candidate);
|
|
395
|
+
}
|
|
396
|
+
catch {
|
|
397
|
+
// Not an environment root (wheels, archives, index caches, ...).
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
return envs;
|
|
401
|
+
}
|
|
402
|
+
catch {
|
|
403
|
+
return [];
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
};
|
|
407
|
+
/**
|
|
408
|
+
* Resolve the package version currently installed for a uvx server.
|
|
409
|
+
*
|
|
410
|
+
* Two homes for a uvx environment are checked, newest-first: uv tool install
|
|
411
|
+
* environments (UV_TOOL_DIR) and the ephemeral environments uvx itself creates
|
|
412
|
+
* in the uv cache. The most recently touched environment that holds the package
|
|
413
|
+
* is the one a fresh uvx spawn would use.
|
|
414
|
+
*/
|
|
415
|
+
export const resolveUvxPackageVersion = async (args) => {
|
|
416
|
+
const spec = resolveUvxPackageSpec(args);
|
|
417
|
+
if (!spec)
|
|
418
|
+
return undefined;
|
|
419
|
+
const packageName = uvxPackageNameFromSpec(spec);
|
|
420
|
+
if (!packageName || !isValidPackageName(packageName))
|
|
421
|
+
return undefined;
|
|
422
|
+
const toolDir = getUvToolDir();
|
|
423
|
+
const cacheDir = getUvCacheDir();
|
|
424
|
+
const candidates = [];
|
|
425
|
+
try {
|
|
426
|
+
candidates.push(...(await fs.promises.readdir(toolDir)).map((entry) => path.join(toolDir, entry)));
|
|
427
|
+
}
|
|
428
|
+
catch {
|
|
429
|
+
// No tool installs yet.
|
|
430
|
+
}
|
|
431
|
+
candidates.push(...(await listUvCacheEnvironments(cacheDir)));
|
|
432
|
+
const withMtime = await Promise.all(candidates.map(async (candidate) => {
|
|
433
|
+
try {
|
|
434
|
+
return { path: candidate, mtime: (await fs.promises.stat(candidate)).mtimeMs };
|
|
435
|
+
}
|
|
436
|
+
catch {
|
|
437
|
+
return undefined;
|
|
438
|
+
}
|
|
439
|
+
}));
|
|
440
|
+
const ordered = withMtime
|
|
441
|
+
.filter((candidate) => candidate !== undefined)
|
|
442
|
+
.sort((a, b) => b.mtime - a.mtime);
|
|
443
|
+
for (const candidate of ordered) {
|
|
444
|
+
const version = await scanDistInfoVersion(candidate.path, packageName);
|
|
445
|
+
if (version)
|
|
446
|
+
return version;
|
|
447
|
+
}
|
|
448
|
+
return undefined;
|
|
449
|
+
};
|
|
450
|
+
/**
|
|
451
|
+
* Read the installed version of `packageName` from an _npx cache entry.
|
|
452
|
+
* Each entry is a private npm install: node_modules/PKG/package.json
|
|
453
|
+
* carries the exact resolved version.
|
|
454
|
+
*/
|
|
455
|
+
const readInstalledPackageVersion = async (entryDir, packageName) => {
|
|
456
|
+
try {
|
|
457
|
+
const pkg = JSON.parse(await fs.promises.readFile(path.join(entryDir, 'node_modules', packageName, 'package.json'), 'utf8'));
|
|
458
|
+
if (typeof pkg?.version === 'string' && pkg.version)
|
|
459
|
+
return pkg.version;
|
|
460
|
+
}
|
|
461
|
+
catch {
|
|
462
|
+
// The package is not installed in this entry, or the manifest is unreadable.
|
|
463
|
+
}
|
|
464
|
+
return undefined;
|
|
465
|
+
};
|
|
466
|
+
/**
|
|
467
|
+
* Resolve the package version currently installed for an npx server.
|
|
468
|
+
*
|
|
469
|
+
* Reuses the same _npx entry matching as the cache clear: npm 11 records the
|
|
470
|
+
* invoked specs as _npx.packages, npm <= 10.9 only writes dependencies. When
|
|
471
|
+
* several entries hold the same package, the most recently modified one is
|
|
472
|
+
* what a fresh npx spawn would use.
|
|
473
|
+
*/
|
|
474
|
+
export const resolveNpxPackageVersion = async (args) => {
|
|
475
|
+
const specs = resolveNpxPackageSpecs(args);
|
|
476
|
+
if (specs.length === 0)
|
|
477
|
+
return undefined;
|
|
478
|
+
const primaryName = packageNameFromSpec(specs[0]);
|
|
479
|
+
if (!primaryName || !isValidPackageName(primaryName))
|
|
480
|
+
return undefined;
|
|
481
|
+
const cacheDir = getNpxCacheDir();
|
|
482
|
+
let entries;
|
|
483
|
+
try {
|
|
484
|
+
entries = await fs.promises.readdir(cacheDir);
|
|
485
|
+
}
|
|
486
|
+
catch {
|
|
487
|
+
return undefined;
|
|
488
|
+
}
|
|
489
|
+
const withMtime = await Promise.all(entries.map(async (entry) => {
|
|
490
|
+
try {
|
|
491
|
+
return { entry, mtime: (await fs.promises.stat(path.join(cacheDir, entry))).mtimeMs };
|
|
492
|
+
}
|
|
493
|
+
catch {
|
|
494
|
+
return undefined;
|
|
495
|
+
}
|
|
496
|
+
}));
|
|
497
|
+
const ordered = withMtime
|
|
498
|
+
.filter((candidate) => candidate !== undefined)
|
|
499
|
+
.sort((a, b) => b.mtime - a.mtime);
|
|
500
|
+
for (const { entry } of ordered) {
|
|
501
|
+
const entryDir = path.join(cacheDir, entry);
|
|
502
|
+
let manifest;
|
|
503
|
+
try {
|
|
504
|
+
manifest = JSON.parse(await fs.promises.readFile(path.join(entryDir, 'package.json'), 'utf8'));
|
|
505
|
+
}
|
|
506
|
+
catch {
|
|
507
|
+
continue;
|
|
508
|
+
}
|
|
509
|
+
if (!entryMatchesSpecs(manifest, specs))
|
|
510
|
+
continue;
|
|
511
|
+
const version = await readInstalledPackageVersion(entryDir, primaryName);
|
|
512
|
+
if (version)
|
|
513
|
+
return version;
|
|
514
|
+
}
|
|
515
|
+
return undefined;
|
|
516
|
+
};
|
|
517
|
+
/**
|
|
518
|
+
* Resolve the package version currently installed for a stdio server launched
|
|
519
|
+
* through npx or uvx, so the dashboard can answer "what version is actually
|
|
520
|
+
* running" (see #1166). Returns undefined for anything else — HTTP/SSE servers,
|
|
521
|
+
* unsupported runners, or packages that have not been installed yet — without
|
|
522
|
+
* throwing.
|
|
523
|
+
*/
|
|
524
|
+
export const resolveRunnerPackageVersion = async (command, args = []) => {
|
|
525
|
+
if (command === 'npx')
|
|
526
|
+
return resolveNpxPackageVersion(args);
|
|
527
|
+
if (command === 'uvx')
|
|
528
|
+
return resolveUvxPackageVersion(args);
|
|
529
|
+
return undefined;
|
|
530
|
+
};
|
|
187
531
|
/**
|
|
188
532
|
* Check if a command binary exists on the system.
|
|
189
533
|
* Uses a 3s timeout to avoid hanging on slow PATH lookups.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cacheUtils.js","sourceRoot":"","sources":["../../src/utils/cacheUtils.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cacheUtils.js","sourceRoot":"","sources":["../../src/utils/cacheUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import os from 'os';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { execFile } from 'child_process';
|
|
5
|
+
import { promisify } from 'util';
|
|
6
|
+
import { logger } from './logger.js';
|
|
7
|
+
import { resolveNpxPackageSpecs, resolveUvxPackageSpec, packageNameFromSpec, uvxPackageNameFromSpec, isValidPackageName, normalizePackageName, } from './cacheUtils.js';
|
|
8
|
+
const execFileAsync = promisify(execFile);
|
|
9
|
+
/** Default freshness window for registry lookups (6h). */
|
|
10
|
+
export const DEFAULT_UPDATE_TTL_MS = 6 * 60 * 60 * 1000;
|
|
11
|
+
/** How long a failed lookup is remembered before being retried (15 min). */
|
|
12
|
+
export const DEFAULT_FAILURE_TTL_MS = 15 * 60 * 1000;
|
|
13
|
+
/** Maximum number of registry subprocesses running at once. */
|
|
14
|
+
export const QUERY_CONCURRENCY_LIMIT = 4;
|
|
15
|
+
/** Subprocess timeout: registry queries run out of band, so give them room. */
|
|
16
|
+
const QUERY_TIMEOUT_MS = 30000;
|
|
17
|
+
const latestCache = new Map();
|
|
18
|
+
const inFlight = new Map();
|
|
19
|
+
/** Simple semaphore so a sweep of N packages never spawns N subprocesses. */
|
|
20
|
+
let activeQueries = 0;
|
|
21
|
+
const queryWaiters = [];
|
|
22
|
+
const acquireQuerySlot = () => {
|
|
23
|
+
const release = () => {
|
|
24
|
+
activeQueries -= 1;
|
|
25
|
+
const next = queryWaiters.shift();
|
|
26
|
+
if (next) {
|
|
27
|
+
activeQueries += 1;
|
|
28
|
+
next();
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
if (activeQueries < QUERY_CONCURRENCY_LIMIT) {
|
|
32
|
+
activeQueries += 1;
|
|
33
|
+
return Promise.resolve(release);
|
|
34
|
+
}
|
|
35
|
+
return new Promise((resolve) => {
|
|
36
|
+
queryWaiters.push(() => resolve(release));
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
const cacheKey = (command, packageName, opts) => `${command}:${packageName}:${opts.npmRegistry ?? ''}:${opts.pythonIndexUrl ?? ''}`;
|
|
40
|
+
/**
|
|
41
|
+
* Parse the output of `npm view <pkg> version`: a single version line.
|
|
42
|
+
*/
|
|
43
|
+
export const parseNpmViewVersion = (stdout) => {
|
|
44
|
+
const line = stdout
|
|
45
|
+
.split('\n')
|
|
46
|
+
.map((entry) => entry.trim())
|
|
47
|
+
.find((entry) => entry.length > 0);
|
|
48
|
+
return line || undefined;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Parse the output of `uv pip compile`: the `NAME==VERSION` line for the
|
|
52
|
+
* requested package. Transitive dependencies also appear as `==` lines, so the
|
|
53
|
+
* package name must match — with PEP 503 normalization on both sides, matching
|
|
54
|
+
* how the dist-info scan spells names (`mcp-server-fetch` / `mcp_server.fetch`).
|
|
55
|
+
*/
|
|
56
|
+
export const parseUvCompileVersion = (stdout, packageName) => {
|
|
57
|
+
const normalizedPackage = normalizePackageName(packageName);
|
|
58
|
+
for (const raw of stdout.split('\n')) {
|
|
59
|
+
const line = raw.trim().split(' ')[0];
|
|
60
|
+
if (!line.includes('=='))
|
|
61
|
+
continue;
|
|
62
|
+
const separator = line.indexOf('==');
|
|
63
|
+
if (normalizePackageName(line.slice(0, separator)) !== normalizedPackage)
|
|
64
|
+
continue;
|
|
65
|
+
const version = line.slice(separator + 2);
|
|
66
|
+
if (version)
|
|
67
|
+
return version;
|
|
68
|
+
}
|
|
69
|
+
return undefined;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Compare two versions for the "update available" hint.
|
|
73
|
+
*
|
|
74
|
+
* Only the numeric core is compared: pre-release (`1.0.0-rc.1`) and build
|
|
75
|
+
* (`1.0.0+build`) suffixes are stripped, and a version whose core has a
|
|
76
|
+
* non-numeric segment is treated as equal (conservative — never claim an
|
|
77
|
+
* update when the comparison is ambiguous). A pre-release `latest` therefore
|
|
78
|
+
* never outranks an installed stable with the same core.
|
|
79
|
+
*/
|
|
80
|
+
export const isNewerVersion = (latest, installed) => {
|
|
81
|
+
const stripV = (version) => version.startsWith('v') ? version.slice(1) : version;
|
|
82
|
+
const core = (version) => stripV(version).split(/[-+]/)[0];
|
|
83
|
+
const latestCore = core(latest);
|
|
84
|
+
const installedCore = core(installed);
|
|
85
|
+
const latestParts = latestCore.split('.');
|
|
86
|
+
const installedParts = installedCore.split('.');
|
|
87
|
+
const length = Math.max(latestParts.length, installedParts.length);
|
|
88
|
+
for (let i = 0; i < length; i += 1) {
|
|
89
|
+
const latestSegment = Number.parseInt(latestParts[i] ?? '0', 10);
|
|
90
|
+
const installedSegment = Number.parseInt(installedParts[i] ?? '0', 10);
|
|
91
|
+
if (Number.isNaN(latestSegment) || Number.isNaN(installedSegment)) {
|
|
92
|
+
return false; // not comparable — do not guess
|
|
93
|
+
}
|
|
94
|
+
if (latestSegment !== installedSegment)
|
|
95
|
+
return latestSegment > installedSegment;
|
|
96
|
+
}
|
|
97
|
+
return false;
|
|
98
|
+
};
|
|
99
|
+
const queryLatestNpmVersion = async (packageName, registry) => {
|
|
100
|
+
try {
|
|
101
|
+
const env = { ...process.env };
|
|
102
|
+
if (registry)
|
|
103
|
+
env.npm_config_registry = registry;
|
|
104
|
+
// On Windows `npm` is the npm.cmd batch wrapper, which execFile cannot
|
|
105
|
+
// launch without a shell (same handling as clearAllCaches). The package
|
|
106
|
+
// name is validated upstream (isValidPackageName), so shell interpolation
|
|
107
|
+
// is not a concern here.
|
|
108
|
+
const execOptions = process.platform === 'win32' ? { shell: true } : {};
|
|
109
|
+
const { stdout } = await execFileAsync('npm', ['view', packageName, 'version'], {
|
|
110
|
+
env,
|
|
111
|
+
timeout: QUERY_TIMEOUT_MS,
|
|
112
|
+
...execOptions,
|
|
113
|
+
});
|
|
114
|
+
return parseNpmViewVersion(stdout);
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
logger.warn(`Failed to query npm registry for ${packageName}`, { error });
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
const queryLatestUvVersion = async (packageName, indexUrl) => {
|
|
122
|
+
// uv pip compile has no stdin-friendly requirement argument, so resolve from
|
|
123
|
+
// a throwaway requirements file. The bare name resolves to the newest version
|
|
124
|
+
// the configured index offers, exactly like `uvx <name>` would install.
|
|
125
|
+
let requirementsFile;
|
|
126
|
+
try {
|
|
127
|
+
requirementsFile = path.join(os.tmpdir(), `mcphub-uv-req-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
128
|
+
await fs.promises.writeFile(requirementsFile, `${packageName}\n`, 'utf8');
|
|
129
|
+
const env = { ...process.env };
|
|
130
|
+
if (indexUrl)
|
|
131
|
+
env.UV_DEFAULT_INDEX = indexUrl;
|
|
132
|
+
const { stdout } = await execFileAsync('uv', ['pip', 'compile', '--no-cache', requirementsFile], { env, timeout: QUERY_TIMEOUT_MS });
|
|
133
|
+
return parseUvCompileVersion(stdout, packageName);
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
logger.warn(`Failed to query uv index for ${packageName}`, { error });
|
|
137
|
+
return undefined;
|
|
138
|
+
}
|
|
139
|
+
finally {
|
|
140
|
+
if (requirementsFile) {
|
|
141
|
+
await fs.promises.rm(requirementsFile, { force: true }).catch(() => undefined);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
const queryLatestPackageVersion = async (command, packageName, opts) => {
|
|
146
|
+
if (command === 'npx')
|
|
147
|
+
return queryLatestNpmVersion(packageName, opts.npmRegistry);
|
|
148
|
+
if (command === 'uvx')
|
|
149
|
+
return queryLatestUvVersion(packageName, opts.pythonIndexUrl);
|
|
150
|
+
return undefined;
|
|
151
|
+
};
|
|
152
|
+
/** Maximum cache entries before stale/oldest entries are evicted. */
|
|
153
|
+
const MAX_CACHE_ENTRIES = 1024;
|
|
154
|
+
/** Evict stale entries; if still over the cap, drop the oldest one. */
|
|
155
|
+
const pruneCache = (now, ttlMs) => {
|
|
156
|
+
for (const [key, entry] of latestCache) {
|
|
157
|
+
if (now - entry.checkedAt >= ttlMs)
|
|
158
|
+
latestCache.delete(key);
|
|
159
|
+
}
|
|
160
|
+
if (latestCache.size <= MAX_CACHE_ENTRIES)
|
|
161
|
+
return;
|
|
162
|
+
let oldestKey;
|
|
163
|
+
let oldestCheckedAt = Infinity;
|
|
164
|
+
for (const [key, entry] of latestCache) {
|
|
165
|
+
if (entry.checkedAt < oldestCheckedAt) {
|
|
166
|
+
oldestCheckedAt = entry.checkedAt;
|
|
167
|
+
oldestKey = key;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (oldestKey !== undefined)
|
|
171
|
+
latestCache.delete(oldestKey);
|
|
172
|
+
};
|
|
173
|
+
/**
|
|
174
|
+
* Query the newest version a registry offers for an npx/uvx package, with a TTL
|
|
175
|
+
* cache (keyed by command + package + configured mirror), in-flight
|
|
176
|
+
* deduplication and a concurrency gate, so a startup sweep of many servers only
|
|
177
|
+
* queries each package once and never spawns a subprocess storm. Failures are
|
|
178
|
+
* negative-cached for a short window. Never throws: registry failures surface
|
|
179
|
+
* as undefined.
|
|
180
|
+
*/
|
|
181
|
+
export const checkPackageUpdate = async (command, args, installedVersion, opts = {}) => {
|
|
182
|
+
const spec = command === 'npx'
|
|
183
|
+
? resolveNpxPackageSpecs(args)[0]
|
|
184
|
+
: command === 'uvx'
|
|
185
|
+
? resolveUvxPackageSpec(args)
|
|
186
|
+
: undefined;
|
|
187
|
+
if (!spec)
|
|
188
|
+
return undefined;
|
|
189
|
+
const packageName = command === 'uvx' ? uvxPackageNameFromSpec(spec) : packageNameFromSpec(spec);
|
|
190
|
+
if (!packageName || !isValidPackageName(packageName))
|
|
191
|
+
return undefined;
|
|
192
|
+
const ttlMs = opts.cacheTtlMs ?? DEFAULT_UPDATE_TTL_MS;
|
|
193
|
+
const failureTtlMs = opts.failureTtlMs ?? DEFAULT_FAILURE_TTL_MS;
|
|
194
|
+
const key = cacheKey(command, packageName, opts);
|
|
195
|
+
const query = opts.queryLatest ?? queryLatestPackageVersion;
|
|
196
|
+
const now = Date.now();
|
|
197
|
+
pruneCache(now, ttlMs);
|
|
198
|
+
const cached = latestCache.get(key);
|
|
199
|
+
if (cached) {
|
|
200
|
+
const age = now - cached.checkedAt;
|
|
201
|
+
const entryTtl = cached.version === undefined ? failureTtlMs : ttlMs;
|
|
202
|
+
if (age < entryTtl) {
|
|
203
|
+
if (cached.version === undefined)
|
|
204
|
+
return undefined; // negative cache hit
|
|
205
|
+
return {
|
|
206
|
+
latestVersion: cached.version,
|
|
207
|
+
updateAvailable: isNewerVersion(cached.version, installedVersion),
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
latestCache.delete(key);
|
|
211
|
+
}
|
|
212
|
+
let pending = inFlight.get(key);
|
|
213
|
+
if (!pending) {
|
|
214
|
+
pending = (async () => {
|
|
215
|
+
const release = await acquireQuerySlot();
|
|
216
|
+
try {
|
|
217
|
+
const version = await query(command, packageName, opts);
|
|
218
|
+
latestCache.set(key, { version, checkedAt: Date.now() });
|
|
219
|
+
return version;
|
|
220
|
+
}
|
|
221
|
+
finally {
|
|
222
|
+
release();
|
|
223
|
+
}
|
|
224
|
+
})().finally(() => {
|
|
225
|
+
inFlight.delete(key);
|
|
226
|
+
});
|
|
227
|
+
inFlight.set(key, pending);
|
|
228
|
+
}
|
|
229
|
+
const latestVersion = await pending;
|
|
230
|
+
if (!latestVersion)
|
|
231
|
+
return undefined;
|
|
232
|
+
return {
|
|
233
|
+
latestVersion,
|
|
234
|
+
updateAvailable: isNewerVersion(latestVersion, installedVersion),
|
|
235
|
+
};
|
|
236
|
+
};
|
|
237
|
+
/** Drop all cached and in-flight lookups (test isolation; the cache is also self-pruning). */
|
|
238
|
+
export const clearPackageUpdateCache = () => {
|
|
239
|
+
latestCache.clear();
|
|
240
|
+
inFlight.clear();
|
|
241
|
+
};
|
|
242
|
+
//# sourceMappingURL=packageUpdate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packageUpdate.js","sourceRoot":"","sources":["../../src/utils/packageUpdate.ts"],"names":[],"mappings":"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"}
|