@samanhappy/mcphub 1.0.38 → 1.0.39
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/db/repositories/VectorEmbeddingRepository.js +35 -3
- package/dist/db/repositories/VectorEmbeddingRepository.js.map +1 -1
- package/dist/services/mcpService.js +85 -2
- package/dist/services/mcpService.js.map +1 -1
- package/dist/services/vectorSearchService.js +12 -3
- 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/serverConfigPersistence.js +6 -0
- package/dist/utils/serverConfigPersistence.js.map +1 -1
- package/frontend/dist/assets/{ActivityPage-BZNq-eGE.js → ActivityPage-CDKSVr2I.js} +2 -2
- package/frontend/dist/assets/{ActivityPage-BZNq-eGE.js.map → ActivityPage-CDKSVr2I.js.map} +1 -1
- package/frontend/dist/assets/CopyClientConfigDialog-DYiucK0d.js +4 -0
- package/frontend/dist/assets/CopyClientConfigDialog-DYiucK0d.js.map +1 -0
- package/frontend/dist/assets/{CredentialsPage-7kyDJLsX.js → CredentialsPage-DMJE4uT2.js} +2 -2
- package/frontend/dist/assets/{CredentialsPage-7kyDJLsX.js.map → CredentialsPage-DMJE4uT2.js.map} +1 -1
- package/frontend/dist/assets/Dashboard-Dh_39img.js +2 -0
- package/frontend/dist/assets/{Dashboard-CElNx820.js.map → Dashboard-Dh_39img.js.map} +1 -1
- package/frontend/dist/assets/EndpointCopy-CQmwGXbD.js +2 -0
- package/frontend/dist/assets/EndpointCopy-CQmwGXbD.js.map +1 -0
- package/frontend/dist/assets/GroupsPage-BqscWSfR.js +33 -0
- package/frontend/dist/assets/GroupsPage-BqscWSfR.js.map +1 -0
- package/frontend/dist/assets/{LoginPage-D23s7oM0.js → LoginPage-DcrwvgS6.js} +2 -2
- package/frontend/dist/assets/{LoginPage-D23s7oM0.js.map → LoginPage-DcrwvgS6.js.map} +1 -1
- package/frontend/dist/assets/{LogsPage-BuQMkmV-.js → LogsPage--Blkr-Ni.js} +2 -2
- package/frontend/dist/assets/{LogsPage-BuQMkmV-.js.map → LogsPage--Blkr-Ni.js.map} +1 -1
- package/frontend/dist/assets/{MarketPage-g9vEYzIq.js → MarketPage-DWv18j4V.js} +2 -2
- package/frontend/dist/assets/{MarketPage-g9vEYzIq.js.map → MarketPage-DWv18j4V.js.map} +1 -1
- package/frontend/dist/assets/{OAuthConsentPage-BiX1lpJR.js → OAuthConsentPage-DCKZIMzE.js} +2 -2
- package/frontend/dist/assets/{OAuthConsentPage-BiX1lpJR.js.map → OAuthConsentPage-DCKZIMzE.js.map} +1 -1
- package/frontend/dist/assets/{PromptsPage-g8SRFY6s.js → PromptsPage-DoVmnVnp.js} +2 -2
- package/frontend/dist/assets/{PromptsPage-g8SRFY6s.js.map → PromptsPage-DoVmnVnp.js.map} +1 -1
- package/frontend/dist/assets/{ResourcesPage-Ddhxi9Sf.js → ResourcesPage-B8udCQQR.js} +2 -2
- package/frontend/dist/assets/{ResourcesPage-Ddhxi9Sf.js.map → ResourcesPage-B8udCQQR.js.map} +1 -1
- package/frontend/dist/assets/ServersPage-OLpH1K1I.js +39 -0
- package/frontend/dist/assets/ServersPage-OLpH1K1I.js.map +1 -0
- package/frontend/dist/assets/{SettingsPage-DZXjQZXS.js → SettingsPage-DlK0Jcta.js} +3 -3
- package/frontend/dist/assets/{SettingsPage-DZXjQZXS.js.map → SettingsPage-DlK0Jcta.js.map} +1 -1
- package/frontend/dist/assets/{StatusDot-CdzMqjTi.js → StatusDot-DgDU3plH.js} +2 -2
- package/frontend/dist/assets/{StatusDot-CdzMqjTi.js.map → StatusDot-DgDU3plH.js.map} +1 -1
- package/frontend/dist/assets/{ToggleGroup-CJd8X_31.js → ToggleGroup-11yhmcwY.js} +2 -2
- package/frontend/dist/assets/{ToggleGroup-CJd8X_31.js.map → ToggleGroup-11yhmcwY.js.map} +1 -1
- package/frontend/dist/assets/{UsersPage-CkP_x9Rt.js → UsersPage-BqPEkoIX.js} +2 -2
- package/frontend/dist/assets/{UsersPage-CkP_x9Rt.js.map → UsersPage-BqPEkoIX.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-Bk5sng-h.js} +66 -61
- package/frontend/dist/assets/icons-vendor-Bk5sng-h.js.map +1 -0
- package/frontend/dist/assets/index-D4Vy78bV.css +1 -0
- package/frontend/dist/assets/index-DhzWX9nb.js +3 -0
- package/frontend/dist/assets/{index-Bu4XuAH4.js.map → index-DhzWX9nb.js.map} +1 -1
- package/frontend/dist/assets/{resourceService-w-cZ31FD.js → resourceService-D-PRt7tB.js} +2 -2
- package/frontend/dist/assets/{resourceService-w-cZ31FD.js.map → resourceService-D-PRt7tB.js.map} +1 -1
- package/frontend/dist/assets/{useCostData-C72NC0PQ.js → useCostData-B-uSfiuA.js} +2 -2
- package/frontend/dist/assets/{useCostData-C72NC0PQ.js.map → useCostData-B-uSfiuA.js.map} +1 -1
- package/frontend/dist/assets/useSettingsData-Bk1AwN5F.js +2 -0
- package/frontend/dist/assets/{useSettingsData-JTEMu74D.js.map → useSettingsData-Bk1AwN5F.js.map} +1 -1
- package/frontend/dist/assets/variableDetection-B7Ko56CL.js +16 -0
- package/frontend/dist/assets/variableDetection-B7Ko56CL.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/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
|
@@ -92,14 +92,37 @@ export class VectorEmbeddingRepository extends BaseRepository {
|
|
|
92
92
|
result.model = model;
|
|
93
93
|
return result;
|
|
94
94
|
}
|
|
95
|
+
/**
|
|
96
|
+
* Build the `content_id` predicate that restricts a search to a set of
|
|
97
|
+
* servers. Embeddings are keyed by server: tools as `<serverName>:<toolName>`
|
|
98
|
+
* and the server-level row as `<serverName>`, so one predicate covers both
|
|
99
|
+
* content types. Returns undefined when no restriction applies.
|
|
100
|
+
*/
|
|
101
|
+
buildServerScopeFilter(serverNames) {
|
|
102
|
+
const names = serverNames.filter((name) => typeof name === 'string' && name.length > 0);
|
|
103
|
+
if (names.length === 0) {
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
const parameters = { scopedServerNames: names };
|
|
107
|
+
const clauses = ['vector_embedding.content_id IN (:...scopedServerNames)'];
|
|
108
|
+
names.forEach((name, index) => {
|
|
109
|
+
const key = `scopedServerPrefix${index}`;
|
|
110
|
+
parameters[key] = `${escapeLikePattern(name)}:%`;
|
|
111
|
+
clauses.push(`vector_embedding.content_id LIKE :${key} ESCAPE '\\'`);
|
|
112
|
+
});
|
|
113
|
+
return { clause: `(${clauses.join(' OR ')})`, parameters };
|
|
114
|
+
}
|
|
95
115
|
/**
|
|
96
116
|
* Search for similar embeddings using cosine similarity
|
|
97
117
|
* @param embedding Vector embedding to search against
|
|
98
118
|
* @param limit Maximum number of results (default: 10)
|
|
99
119
|
* @param threshold Similarity threshold (default: 0.7)
|
|
100
120
|
* @param contentTypes Optional content types to filter by
|
|
121
|
+
* @param serverNames Optional server names to restrict the search to. Applied
|
|
122
|
+
* in SQL so that `limit` counts rows the caller can actually use.
|
|
101
123
|
*/
|
|
102
|
-
async searchSimilar(embedding, limit = 10, threshold = 0.7, contentTypes) {
|
|
124
|
+
async searchSimilar(embedding, limit = 10, threshold = 0.7, contentTypes, serverNames) {
|
|
125
|
+
const serverScope = serverNames ? this.buildServerScopeFilter(serverNames) : undefined;
|
|
103
126
|
try {
|
|
104
127
|
// Try using vector similarity operator first
|
|
105
128
|
try {
|
|
@@ -120,6 +143,10 @@ export class VectorEmbeddingRepository extends BaseRepository {
|
|
|
120
143
|
.andWhere('vector_embedding.content_type IN (:...contentTypes)')
|
|
121
144
|
.setParameter('contentTypes', contentTypes);
|
|
122
145
|
}
|
|
146
|
+
// Restrict to the requested servers before the limit is applied
|
|
147
|
+
if (serverScope) {
|
|
148
|
+
query = query.andWhere(serverScope.clause, serverScope.parameters);
|
|
149
|
+
}
|
|
123
150
|
// Execute query
|
|
124
151
|
const results = await query.getRawMany();
|
|
125
152
|
// Return results if successful
|
|
@@ -138,6 +165,10 @@ export class VectorEmbeddingRepository extends BaseRepository {
|
|
|
138
165
|
.where('vector_embedding.content_type IN (:...contentTypes)')
|
|
139
166
|
.setParameter('contentTypes', contentTypes);
|
|
140
167
|
}
|
|
168
|
+
// Restrict to the requested servers before the limit is applied
|
|
169
|
+
if (serverScope) {
|
|
170
|
+
query = query.andWhere(serverScope.clause, serverScope.parameters);
|
|
171
|
+
}
|
|
141
172
|
// Limit results
|
|
142
173
|
query = query.take(limit);
|
|
143
174
|
// Execute query
|
|
@@ -161,13 +192,14 @@ export class VectorEmbeddingRepository extends BaseRepository {
|
|
|
161
192
|
* @param limit Maximum number of results
|
|
162
193
|
* @param threshold Similarity threshold
|
|
163
194
|
* @param contentTypes Optional content types to filter by
|
|
195
|
+
* @param serverNames Optional server names to restrict the search to
|
|
164
196
|
*/
|
|
165
|
-
async searchByText(text, getEmbeddingFunc, limit = 10, threshold = 0.7, contentTypes) {
|
|
197
|
+
async searchByText(text, getEmbeddingFunc, limit = 10, threshold = 0.7, contentTypes, serverNames) {
|
|
166
198
|
try {
|
|
167
199
|
// Get embedding for the search text
|
|
168
200
|
const embedding = await getEmbeddingFunc(text);
|
|
169
201
|
// Search by embedding
|
|
170
|
-
return this.searchSimilar(embedding, limit, threshold, contentTypes);
|
|
202
|
+
return this.searchSimilar(embedding, limit, threshold, contentTypes, serverNames);
|
|
171
203
|
}
|
|
172
204
|
catch (error) {
|
|
173
205
|
logger.error('Error searching by text:', error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VectorEmbeddingRepository.js","sourceRoot":"","sources":["../../../src/db/repositories/VectorEmbeddingRepository.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"VectorEmbeddingRepository.js","sourceRoot":"","sources":["../../../src/db/repositories/VectorEmbeddingRepository.ts"],"names":[],"mappings":"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"}
|
|
@@ -40,7 +40,8 @@ import { assertHostedToolAllowed, filterHostedTools, reserveHostedToolCall, sett
|
|
|
40
40
|
import { formatErrorForLogging, sanitizeStringForLogging, summarizeErrorForLogging, } from '../utils/serialization.js';
|
|
41
41
|
import { addStdioErrorContext, observeStdioStderr } from '../utils/stdioDiagnostics.js';
|
|
42
42
|
import { MCP_APPS_CAPABILITIES, filterModelVisibleTools, hasMcpAppsCapability, isAppOnlyTool, stripMcpAppsMetadata, } from '../utils/mcpApps.js';
|
|
43
|
-
import { supportsCacheRefresh, injectRefreshFlag, clearRunnerCache } from '../utils/cacheUtils.js';
|
|
43
|
+
import { supportsCacheRefresh, injectRefreshFlag, clearRunnerCache, resolveRunnerPackageVersion } from '../utils/cacheUtils.js';
|
|
44
|
+
import { checkPackageUpdate } from '../utils/packageUpdate.js';
|
|
44
45
|
const servers = {};
|
|
45
46
|
import { setupClientKeepAlive } from './keepAliveService.js';
|
|
46
47
|
import { logger } from '../utils/logger.js';
|
|
@@ -754,6 +755,7 @@ export const connected = () => {
|
|
|
754
755
|
};
|
|
755
756
|
// Global cleanup function to close all connections
|
|
756
757
|
export const cleanupAllServers = () => {
|
|
758
|
+
stopPackageUpdateSweep();
|
|
757
759
|
principalRuntimes.invalidate();
|
|
758
760
|
for (const serverInfo of serverInfos) {
|
|
759
761
|
try {
|
|
@@ -1625,6 +1627,8 @@ export const initializeClientsFromSettings = async (isInit, serverName, options)
|
|
|
1625
1627
|
const serverVersion = client.getServerVersion?.();
|
|
1626
1628
|
info.version = serverVersion?.version;
|
|
1627
1629
|
info.instructions = client.getInstructions?.();
|
|
1630
|
+
// Record the resolved npx/uvx package version backing this server.
|
|
1631
|
+
applyResolvedPackageVersion(info, expandedConf);
|
|
1628
1632
|
const capabilities = client.getServerCapabilities();
|
|
1629
1633
|
logger.log('Server capabilities', JSON.stringify(capabilities));
|
|
1630
1634
|
let dataError = null;
|
|
@@ -1847,7 +1851,7 @@ export const getServersInfo = async (page, limit, user) => {
|
|
|
1847
1851
|
}));
|
|
1848
1852
|
const infos = presentedInfos
|
|
1849
1853
|
.filter((info) => requestedServerNames.has(info.name)) // Only include requested servers
|
|
1850
|
-
.map(({ name, version, instructions, owner, visibility, status, tools, prompts, resources, createTime, error, oauth, }) => {
|
|
1854
|
+
.map(({ name, version, packageVersion, latestVersion, updateAvailable, instructions, owner, visibility, status, tools, prompts, resources, createTime, error, oauth, }) => {
|
|
1851
1855
|
const serverConfig = allServers.find((server) => server.name === name);
|
|
1852
1856
|
const enabled = serverConfig ? serverConfig.enabled !== false : true;
|
|
1853
1857
|
const resolvedType = inferServerType(serverConfig);
|
|
@@ -1891,6 +1895,12 @@ export const getServersInfo = async (page, limit, user) => {
|
|
|
1891
1895
|
resources: resourcesWithEnabled,
|
|
1892
1896
|
createTime,
|
|
1893
1897
|
enabled,
|
|
1898
|
+
// Resolved npx/uvx package version + registry update hint (#1166).
|
|
1899
|
+
// Runtime state, kept at the top level like `version` so it can never
|
|
1900
|
+
// be round-tripped into a persisted ServerConfig.
|
|
1901
|
+
...(packageVersion ? { packageVersion } : {}),
|
|
1902
|
+
...(latestVersion ? { latestVersion } : {}),
|
|
1903
|
+
...(updateAvailable !== undefined ? { updateAvailable } : {}),
|
|
1894
1904
|
oauth: oauth || oauthConnected
|
|
1895
1905
|
? {
|
|
1896
1906
|
...(oauth
|
|
@@ -1969,6 +1979,75 @@ export const reconnectServer = async (serverName) => {
|
|
|
1969
1979
|
await initializeClientsFromSettings(false, serverName);
|
|
1970
1980
|
logger.log(`Successfully reconnected server: ${serverName}`);
|
|
1971
1981
|
};
|
|
1982
|
+
/**
|
|
1983
|
+
* Resolve the installed package version for an npx/uvx stdio server and record
|
|
1984
|
+
* it on the live ServerInfo, so the dashboard can answer "what version is
|
|
1985
|
+
* actually running" (see #1166). Also checks the configured registry for a
|
|
1986
|
+
* newer version and marks updateAvailable. Fire-and-forget: best-effort
|
|
1987
|
+
* display data — a resolution failure must never break or delay a connection.
|
|
1988
|
+
*
|
|
1989
|
+
* On any failure the runtime fields are cleared so the UI never shows a stale
|
|
1990
|
+
* version or a stale "update available" hint from an earlier, healthier check.
|
|
1991
|
+
*/
|
|
1992
|
+
const applyResolvedPackageVersion = (info, config) => {
|
|
1993
|
+
const command = config?.command;
|
|
1994
|
+
if (!command || !supportsCacheRefresh(command))
|
|
1995
|
+
return;
|
|
1996
|
+
void (async () => {
|
|
1997
|
+
try {
|
|
1998
|
+
const args = config.args ?? [];
|
|
1999
|
+
const version = await resolveRunnerPackageVersion(command, args);
|
|
2000
|
+
if (!version) {
|
|
2001
|
+
info.packageVersion = undefined;
|
|
2002
|
+
info.latestVersion = undefined;
|
|
2003
|
+
info.updateAvailable = undefined;
|
|
2004
|
+
return;
|
|
2005
|
+
}
|
|
2006
|
+
info.packageVersion = version;
|
|
2007
|
+
const systemConfig = await getSystemConfigDao().get();
|
|
2008
|
+
const update = await checkPackageUpdate(command, args, version, {
|
|
2009
|
+
npmRegistry: systemConfig?.install?.npmRegistry,
|
|
2010
|
+
pythonIndexUrl: systemConfig?.install?.pythonIndexUrl,
|
|
2011
|
+
});
|
|
2012
|
+
if (update?.latestVersion) {
|
|
2013
|
+
info.latestVersion = update.latestVersion;
|
|
2014
|
+
info.updateAvailable = update.updateAvailable;
|
|
2015
|
+
}
|
|
2016
|
+
else {
|
|
2017
|
+
// Registry unreachable or no metadata: hide the hint rather than keep
|
|
2018
|
+
// a stale "update available" from a previous successful check.
|
|
2019
|
+
info.latestVersion = undefined;
|
|
2020
|
+
info.updateAvailable = undefined;
|
|
2021
|
+
}
|
|
2022
|
+
}
|
|
2023
|
+
catch (error) {
|
|
2024
|
+
logger.warn(`Failed to resolve package update for ${info.name}`, { error });
|
|
2025
|
+
info.latestVersion = undefined;
|
|
2026
|
+
info.updateAvailable = undefined;
|
|
2027
|
+
}
|
|
2028
|
+
})();
|
|
2029
|
+
};
|
|
2030
|
+
// Periodically refresh the "update available" flag for npx/uvx servers (#1166).
|
|
2031
|
+
// Each check respects the TTL cache inside checkPackageUpdate, so this only
|
|
2032
|
+
// re-queries packages whose last registry lookup has gone stale. The timer is
|
|
2033
|
+
// unref'd so it never keeps the process alive by itself.
|
|
2034
|
+
//
|
|
2035
|
+
// Note: personal-runtime servers (credential-template bindings) are not part of
|
|
2036
|
+
// `serverInfos` and are therefore not swept here — their flags refresh when a
|
|
2037
|
+
// new per-user connection is created in createPrincipalRuntime instead.
|
|
2038
|
+
const PACKAGE_UPDATE_SWEEP_MS = 6 * 60 * 60 * 1000;
|
|
2039
|
+
const packageUpdateSweepTimer = setInterval(() => {
|
|
2040
|
+
for (const info of serverInfos) {
|
|
2041
|
+
if (!info.config?.command)
|
|
2042
|
+
continue;
|
|
2043
|
+
applyResolvedPackageVersion(info, info.config);
|
|
2044
|
+
}
|
|
2045
|
+
}, PACKAGE_UPDATE_SWEEP_MS);
|
|
2046
|
+
packageUpdateSweepTimer.unref?.();
|
|
2047
|
+
/** Stop the periodic package-update sweep (called on shutdown). */
|
|
2048
|
+
export const stopPackageUpdateSweep = () => {
|
|
2049
|
+
clearInterval(packageUpdateSweepTimer);
|
|
2050
|
+
};
|
|
1972
2051
|
// Reinstall server: clear package cache and reconnect.
|
|
1973
2052
|
// For npx: deletes ~/.npm/_npx before reconnect (--ignore-existing removed in npm 7+).
|
|
1974
2053
|
// For uvx: schedules --refresh flag injection on next spawn via pendingReinstalls Set.
|
|
@@ -2303,6 +2382,8 @@ const ensureServerReady = async (serverInfo) => {
|
|
|
2303
2382
|
serverInfo.version = client.getServerVersion?.()?.version;
|
|
2304
2383
|
serverInfo.instructions = client.getInstructions?.();
|
|
2305
2384
|
serverInfo.config = expandedConf;
|
|
2385
|
+
// Record the resolved npx/uvx package version backing this server.
|
|
2386
|
+
applyResolvedPackageVersion(serverInfo, expandedConf);
|
|
2306
2387
|
serverInfo.status = 'connected';
|
|
2307
2388
|
serverInfo.error = null;
|
|
2308
2389
|
let toolCount = 0;
|
|
@@ -3606,6 +3687,8 @@ const createPrincipalRuntime = async (name, resolvedConfig) => {
|
|
|
3606
3687
|
if (capabilities?.resources)
|
|
3607
3688
|
info.resources = (await client.listResources({}, resolvedConfig.options)).resources.map(normalizeResourceForCache);
|
|
3608
3689
|
info.version = client.getServerVersion()?.version;
|
|
3690
|
+
// Record the resolved npx/uvx package version backing this server.
|
|
3691
|
+
applyResolvedPackageVersion(info, resolvedConfig);
|
|
3609
3692
|
client.onclose = () => {
|
|
3610
3693
|
info.status = 'disconnected';
|
|
3611
3694
|
};
|