sdlc-agent-4-enterprise-server 1.8.1 → 1.8.2
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/README.md +3 -1
- package/dist/modules/orchestration/McpClientManager.js +35 -4
- package/dist/modules/orchestration/McpClientManager.js.map +1 -1
- package/dist/modules/orchestration/health/HealthMonitor.js +1 -1
- package/dist/modules/orchestration/health/HealthMonitor.js.map +1 -1
- package/dist/modules/orchestration/health/__tests__/HealthMonitor.test.js +8 -3
- package/dist/modules/orchestration/health/__tests__/HealthMonitor.test.js.map +1 -1
- package/dist/modules/orchestration/types/health.d.ts +2 -0
- package/dist/modules/orchestration/types/health.js +12 -0
- package/dist/modules/orchestration/types/health.js.map +1 -1
- package/dist/server/routes/admin/mcp.js +6 -4
- package/dist/server/routes/admin/mcp.js.map +1 -1
- package/dist/viewer/admin/index.html +5 -4
- package/package.json +1 -1
- package/src/modules/orchestration/McpClientManager.ts +36 -4
- package/src/modules/orchestration/health/HealthMonitor.ts +1 -1
- package/src/modules/orchestration/health/__tests__/HealthMonitor.test.ts +7 -3
- package/src/modules/orchestration/types/health.ts +13 -0
- package/src/server/routes/admin/mcp.ts +6 -4
- package/src/viewer/admin/index.html +5 -4
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
</p>
|
|
7
7
|
|
|
8
8
|
<p align="center">
|
|
9
|
-
<img src="https://img.shields.io/badge/version-1.
|
|
9
|
+
<img src="https://img.shields.io/badge/version-1.8.2-blue?style=for-the-badge" alt="Version">
|
|
10
10
|
<img src="https://img.shields.io/badge/tools-66+-teal?style=for-the-badge" alt="Tools">
|
|
11
11
|
<img src="https://img.shields.io/badge/node-%3E%3D18-green?style=for-the-badge" alt="Node">
|
|
12
12
|
</p>
|
|
@@ -233,6 +233,8 @@ The embedding model is expected at `.code-intel/models/model.onnx`. Download it:
|
|
|
233
233
|
|
|
234
234
|
| Version | Date | Ticket | Changes |
|
|
235
235
|
|---------|------|--------|---------|
|
|
236
|
+
| 1.8.1 | 2026-07-15 | SA4E-38 | Smart KB Ingest: `mem_smart_ingest` + `mem_smart_ingest_cleanup` tools using local Ollama LLM for semantic evaluation before KB ingestion. ClassifyService + SmartIngestHandler. |
|
|
237
|
+
| 1.8.0 | 2026-07-15 | SA4E-36 | Multi-tenant RBAC: Project isolation via X-Project-Id header, per-user KB scoping, access group permissions, impersonation. |
|
|
236
238
|
| 1.7.0 | 2026-07-15 | SA4E-37 | Health Check & Auto-Reconnect: HealthMonitor (parallel pings), ReconnectManager (exponential backoff + jitter), ConnectionStateTracker (state machine + events), TransportFactory. McpClientManager refactored as Facade. 54 unit tests. |
|
|
237
239
|
| 1.6.0 | 2026-07-15 | SA4E-34 | Multi-database Support: DatabaseAdapter strategy pattern, PostgresAdapter, MysqlAdapter, MigrationService, Admin UI database tab |
|
|
238
240
|
| 1.5.0 | 2026-07-13 | SA4E-125 | Pipeline Refactoring v2-v6: index-based routing, PipelineDefinition in state, sandboxed hot-swap, resolvePhaseIndex() realignment, orphan detection, skip/cancel decisions, 3-layer skip fix, Ghost Context Barrier. LangGraph restructured into core/pipeline/agents/engine/subgraphs/workflow/helpers/hooks/vscode. 13 architecture diagrams. |
|
|
@@ -2,8 +2,10 @@
|
|
|
2
2
|
* McpClientManager — Facade for child MCP server management with health monitoring.
|
|
3
3
|
* SA4E-37: Added health check, auto-reconnect, and connection state tracking.
|
|
4
4
|
*/
|
|
5
|
+
import * as fs from 'fs';
|
|
6
|
+
import * as path from 'path';
|
|
5
7
|
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
6
|
-
import {
|
|
8
|
+
import { PRODUCTION_HEALTH_CONFIG } from './types/health.js';
|
|
7
9
|
import { ConnectionStateTracker } from './health/ConnectionStateTracker.js';
|
|
8
10
|
import { HealthMonitor } from './health/HealthMonitor.js';
|
|
9
11
|
import { ReconnectManager } from './health/ReconnectManager.js';
|
|
@@ -20,7 +22,7 @@ export class McpClientManager {
|
|
|
20
22
|
reconnectManager;
|
|
21
23
|
constructor(logger) {
|
|
22
24
|
this.logger = logger.child({ component: 'McpClientManager' });
|
|
23
|
-
this.healthConfig = { ...
|
|
25
|
+
this.healthConfig = { ...PRODUCTION_HEALTH_CONFIG };
|
|
24
26
|
this.stateTracker = new ConnectionStateTracker(logger);
|
|
25
27
|
this.healthMonitor = new HealthMonitor(logger, {
|
|
26
28
|
getConnectedServers: () => this.getConnectedClients(),
|
|
@@ -34,7 +36,36 @@ export class McpClientManager {
|
|
|
34
36
|
});
|
|
35
37
|
}
|
|
36
38
|
async initializeAll() {
|
|
37
|
-
|
|
39
|
+
const workspace = process.env.CODE_INTEL_WORKSPACE || process.cwd();
|
|
40
|
+
const dataDir = process.env.CODE_INTEL_DATA_DIR || '.code-intel';
|
|
41
|
+
const configPath = path.resolve(workspace, dataDir, 'orchestration.json');
|
|
42
|
+
if (!fs.existsSync(configPath)) {
|
|
43
|
+
this.logger.info({ configPath }, 'No orchestration.json found, skipping child servers');
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
let config;
|
|
47
|
+
try {
|
|
48
|
+
const raw = fs.readFileSync(configPath, 'utf-8');
|
|
49
|
+
config = JSON.parse(raw);
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
this.logger.error({ err, configPath }, 'Failed to read orchestration.json');
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const servers = Object.entries(config.mcpServers || {});
|
|
56
|
+
this.logger.info({ count: servers.length }, 'Connecting child MCP servers');
|
|
57
|
+
for (const [name, serverConfig] of servers) {
|
|
58
|
+
try {
|
|
59
|
+
await this.connectServer(name, serverConfig);
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
this.logger.error({ err, server: name }, 'Failed to connect child server (will retry via health monitor)');
|
|
63
|
+
// Register so health monitor can attempt reconnect later
|
|
64
|
+
if (!this.stateTracker.getState(name))
|
|
65
|
+
this.stateTracker.register(name);
|
|
66
|
+
this.serverConfigs.set(name, serverConfig);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
38
69
|
}
|
|
39
70
|
getProxiedTools() { return this.proxiedTools; }
|
|
40
71
|
getServersStatus() {
|
|
@@ -194,7 +225,7 @@ export class McpClientManager {
|
|
|
194
225
|
this.toolsToServer.set(tool.name, name);
|
|
195
226
|
this.proxiedTools.push({
|
|
196
227
|
name: tool.name, description: tool.description ?? '',
|
|
197
|
-
category:
|
|
228
|
+
category: name, inputSchema: tool.inputSchema,
|
|
198
229
|
});
|
|
199
230
|
}
|
|
200
231
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"McpClientManager.js","sourceRoot":"","sources":["../../../src/modules/orchestration/McpClientManager.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"McpClientManager.js","sourceRoot":"","sources":["../../../src/modules/orchestration/McpClientManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HealthMonitor.js","sourceRoot":"","sources":["../../../../src/modules/orchestration/health/HealthMonitor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,MAAM,OAAO,aAAa;IAChB,UAAU,GAA0C,IAAI,CAAC;IACzD,MAAM,CAAS;IACf,IAAI,CAAoB;IACxB,MAAM,CAAoB;IAElC,YAAY,MAAc,EAAE,IAAuB,EAAE,MAAyB;QAC5E,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO;QAC5B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,wBAAwB,CAAC,CAAC;QAC/E,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACvF,CAAC;IAED,IAAI;QACF,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAO;QAC7B,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAC7C,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC;IAClC,CAAC;IAED,YAAY,CAAC,MAAyB;QACpC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAChD,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO;QAE/B,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CACxE,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAC9B,CAAC;QAEF,MAAM,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IACzC,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,IAAY,EAAE,MAAc;QACnD,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,IAAI,CAAC;gBACjB,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"HealthMonitor.js","sourceRoot":"","sources":["../../../../src/modules/orchestration/health/HealthMonitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,11 @@ function createMockLogger() {
|
|
|
15
15
|
}
|
|
16
16
|
function createMockClient(shouldReject = false) {
|
|
17
17
|
return {
|
|
18
|
+
ping: vi.fn(() => {
|
|
19
|
+
if (shouldReject)
|
|
20
|
+
return Promise.reject(new Error('connection lost'));
|
|
21
|
+
return Promise.resolve({});
|
|
22
|
+
}),
|
|
18
23
|
listTools: vi.fn(() => {
|
|
19
24
|
if (shouldReject)
|
|
20
25
|
return Promise.reject(new Error('connection lost'));
|
|
@@ -74,8 +79,8 @@ describe('HealthMonitor', () => {
|
|
|
74
79
|
await monitor.runCycle();
|
|
75
80
|
expect(deps.onPingSuccess).toHaveBeenCalledWith('s1');
|
|
76
81
|
expect(deps.onPingSuccess).toHaveBeenCalledWith('s2');
|
|
77
|
-
expect(client1.
|
|
78
|
-
expect(client2.
|
|
82
|
+
expect(client1.ping).toHaveBeenCalled();
|
|
83
|
+
expect(client2.ping).toHaveBeenCalled();
|
|
79
84
|
});
|
|
80
85
|
it('should call onPingFailed when client.listTools rejects', async () => {
|
|
81
86
|
const client = createMockClient(true);
|
|
@@ -89,7 +94,7 @@ describe('HealthMonitor', () => {
|
|
|
89
94
|
const config = { ...DEFAULT_HEALTH_CONFIG, pingTimeout: 100 };
|
|
90
95
|
monitor = new HealthMonitor(logger, deps, config);
|
|
91
96
|
const slowClient = {
|
|
92
|
-
|
|
97
|
+
ping: vi.fn(() => new Promise(() => { })),
|
|
93
98
|
};
|
|
94
99
|
deps.getConnectedServers.mockReturnValue(new Map([['s1', slowClient]]));
|
|
95
100
|
const cyclePromise = monitor.runCycle();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HealthMonitor.test.js","sourceRoot":"","sources":["../../../../../src/modules/orchestration/health/__tests__/HealthMonitor.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"HealthMonitor.test.js","sourceRoot":"","sources":["../../../../../src/modules/orchestration/health/__tests__/HealthMonitor.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -56,5 +56,7 @@ export interface ServerConnectionState {
|
|
|
56
56
|
nextRetryAt: string | null;
|
|
57
57
|
}
|
|
58
58
|
export declare const DEFAULT_HEALTH_CONFIG: HealthCheckConfig;
|
|
59
|
+
/** Production-tuned config: longer timeouts for stdio servers, less aggressive failure detection */
|
|
60
|
+
export declare const PRODUCTION_HEALTH_CONFIG: HealthCheckConfig;
|
|
59
61
|
/** Valid state transitions map */
|
|
60
62
|
export declare const VALID_TRANSITIONS: Record<ConnectionState, ConnectionState[]>;
|
|
@@ -13,6 +13,18 @@ export const DEFAULT_HEALTH_CONFIG = {
|
|
|
13
13
|
jitterEnabled: true,
|
|
14
14
|
jitterRange: 0.2,
|
|
15
15
|
};
|
|
16
|
+
/** Production-tuned config: longer timeouts for stdio servers, less aggressive failure detection */
|
|
17
|
+
export const PRODUCTION_HEALTH_CONFIG = {
|
|
18
|
+
interval: 60_000,
|
|
19
|
+
pingTimeout: 15_000,
|
|
20
|
+
failureThreshold: 3,
|
|
21
|
+
initialDelay: 2_000,
|
|
22
|
+
backoffMultiplier: 2,
|
|
23
|
+
maxDelay: 60_000,
|
|
24
|
+
maxRetries: 10,
|
|
25
|
+
jitterEnabled: true,
|
|
26
|
+
jitterRange: 0.2,
|
|
27
|
+
};
|
|
16
28
|
/** Valid state transitions map */
|
|
17
29
|
export const VALID_TRANSITIONS = {
|
|
18
30
|
disconnected: ['connected'],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../../../src/modules/orchestration/types/health.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkEH,MAAM,CAAC,MAAM,qBAAqB,GAAsB;IACtD,QAAQ,EAAE,MAAM;IAChB,WAAW,EAAE,KAAK;IAClB,gBAAgB,EAAE,CAAC;IACnB,YAAY,EAAE,KAAK;IACnB,iBAAiB,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,EAAE;IACd,aAAa,EAAE,IAAI;IACnB,WAAW,EAAE,GAAG;CACjB,CAAC;AAEF,kCAAkC;AAClC,MAAM,CAAC,MAAM,iBAAiB,GAA+C;IAC3E,YAAY,EAAE,CAAC,WAAW,CAAC;IAC3B,SAAS,EAAE,CAAC,WAAW,EAAE,cAAc,CAAC;IACxC,SAAS,EAAE,CAAC,cAAc,CAAC;IAC3B,YAAY,EAAE,CAAC,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,CAAC;IACrE,MAAM,EAAE,CAAC,cAAc,EAAE,cAAc,CAAC;CACzC,CAAC"}
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../../../src/modules/orchestration/types/health.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkEH,MAAM,CAAC,MAAM,qBAAqB,GAAsB;IACtD,QAAQ,EAAE,MAAM;IAChB,WAAW,EAAE,KAAK;IAClB,gBAAgB,EAAE,CAAC;IACnB,YAAY,EAAE,KAAK;IACnB,iBAAiB,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,EAAE;IACd,aAAa,EAAE,IAAI;IACnB,WAAW,EAAE,GAAG;CACjB,CAAC;AAEF,oGAAoG;AACpG,MAAM,CAAC,MAAM,wBAAwB,GAAsB;IACzD,QAAQ,EAAE,MAAM;IAChB,WAAW,EAAE,MAAM;IACnB,gBAAgB,EAAE,CAAC;IACnB,YAAY,EAAE,KAAK;IACnB,iBAAiB,EAAE,CAAC;IACpB,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,EAAE;IACd,aAAa,EAAE,IAAI;IACnB,WAAW,EAAE,GAAG;CACjB,CAAC;AAEF,kCAAkC;AAClC,MAAM,CAAC,MAAM,iBAAiB,GAA+C;IAC3E,YAAY,EAAE,CAAC,WAAW,CAAC;IAC3B,SAAS,EAAE,CAAC,WAAW,EAAE,cAAc,CAAC;IACxC,SAAS,EAAE,CAAC,cAAc,CAAC;IAC3B,YAAY,EAAE,CAAC,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,CAAC;IACrE,MAAM,EAAE,CAAC,cAAc,EAAE,cAAc,CAAC;CACzC,CAAC"}
|
|
@@ -31,14 +31,14 @@ export function createMcpRoutes(ctx) {
|
|
|
31
31
|
const serverToggles = ctx.toolToggles[name] || {};
|
|
32
32
|
const isConnected = clientManager?.isServerConnected?.(name) ?? false;
|
|
33
33
|
const actualToolCount = clientManager?.getServerToolCount?.(name) ?? 0;
|
|
34
|
-
const configTools = cfg.autoApprove || [];
|
|
34
|
+
const configTools = cfg.tools || cfg.autoApprove || [];
|
|
35
35
|
let tools;
|
|
36
36
|
if (isConnected && actualToolCount > 0) {
|
|
37
37
|
const proxied = (clientManager?.getProxiedTools?.() || []).filter((t) => t.category === name);
|
|
38
|
-
tools = proxied.map((t) => ({ name: t.name, enabled: serverToggles[t.name] !== false }));
|
|
38
|
+
tools = proxied.map((t) => ({ name: t.name, description: t.description || '', enabled: serverToggles[t.name] !== false }));
|
|
39
39
|
}
|
|
40
40
|
else
|
|
41
|
-
tools = configTools.map((t) => ({ name: t, enabled: serverToggles[t] !== false }));
|
|
41
|
+
tools = configTools.map((t) => ({ name: t, description: '', enabled: serverToggles[t] !== false }));
|
|
42
42
|
return {
|
|
43
43
|
id: name, name, url: cfg.url || '', type: cfg.type || cfg.transportType || 'stdio',
|
|
44
44
|
transportType: cfg.transportType || cfg.type || 'stdio',
|
|
@@ -54,11 +54,13 @@ export function createMcpRoutes(ctx) {
|
|
|
54
54
|
}
|
|
55
55
|
const allHandlers = ctx.registry?.getToolHandlers?.();
|
|
56
56
|
if (allHandlers) {
|
|
57
|
+
const allDefs = ctx.registry?.getAllToolDefinitions?.() || [];
|
|
58
|
+
const defMap = new Map(allDefs.map((d) => [d.name, d.description || '']));
|
|
57
59
|
const internalTools = Array.from(allHandlers.keys());
|
|
58
60
|
servers.push({
|
|
59
61
|
id: 'code-intel', name: 'code-intel', url: 'internal', type: 'internal',
|
|
60
62
|
transportType: 'internal', command: '', args: [], env: {}, disabled: false,
|
|
61
|
-
status: 'running', tools: internalTools.map((t) => ({ name: t, enabled: true })),
|
|
63
|
+
status: 'running', tools: internalTools.map((t) => ({ name: t, description: defMap.get(t) || '', enabled: true })),
|
|
62
64
|
});
|
|
63
65
|
}
|
|
64
66
|
const allowedServers = permCheck.roleData?.allowedServers;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../../src/server/routes/admin/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAGzD,MAAM,UAAU,SAAS,CAAC,GAAiB,EAAE,QAAgB,EAAE,KAAa,EAAE,OAAe;IAC3F,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC;QAAE,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;IACnE,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1F,IAAI,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,GAAG;QAAE,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAiB;IAC/C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IAEvB,GAAG,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC,CAAC,EAAE,EAAE;QACtC,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,IAAI,YAAY,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC1C,MAAM,SAAS,GAAG,GAAG,CAAC,iBAAiB,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QACtE,IAAI,SAAS,YAAY,QAAQ;YAAE,OAAO,SAAS,CAAC;QACpD,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,uBAAuB,CAAC,CAAC;QAC5F,IAAI,OAAO,GAAU,EAAE,CAAC;QACxB,MAAM,aAAa,GAAG,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,eAAe,CAAC,CAAC;QACjE,MAAM,aAAa,GAAG,aAAa,EAAE,gBAAgB,EAAE,EAAE,CAAC;QAC1D,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC5D,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAgB,EAAE,EAAE;oBACjF,MAAM,aAAa,GAAG,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;oBAClD,MAAM,WAAW,GAAG,aAAa,EAAE,iBAAiB,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC;oBACtE,MAAM,eAAe,GAAG,aAAa,EAAE,kBAAkB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACvE,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../../src/server/routes/admin/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,7 +30,7 @@ const API='/api/admin';
|
|
|
30
30
|
const __urlParams=new URLSearchParams(window.location.search);
|
|
31
31
|
const __projectId=__urlParams.get('projectId')||'';
|
|
32
32
|
let __impersonateUserId=null;
|
|
33
|
-
function api(path,options={}){const token=localStorage.getItem('admin_token')||'';const impHeaders=__impersonateUserId?{'X-Impersonate':__impersonateUserId}:{};const projectHeaders=__projectId?{'X-Project-Id':__projectId}:{};const sep=path.includes('?')?'&':'?';const urlWithProject=__projectId?path+sep+'projectId='+encodeURIComponent(__projectId):path;return fetch(API+urlWithProject,{...options,headers:{'Authorization':'Bearer '+token,'Content-Type':'application/json',...impHeaders,...projectHeaders,...options.headers}}).then(r=>{if(r.status===401){localStorage.removeItem('admin_token');localStorage.removeItem('admin_user');return null;}if(r.status===403){return r.json().then(d=>{showForbidden(d.error||'Access denied');return{__error:true,...d};}).catch(()=>({__error:true,error:'Forbidden'}));}if(!r.ok)return r.json().then(d=>({__error:true,...d})).catch(()=>null);return r.json();}).catch(()=>null);}
|
|
33
|
+
function api(path,options={}){const token=localStorage.getItem('admin_token')||'';if(!token&&!path.includes('/auth/')){return Promise.resolve(null);}const impHeaders=__impersonateUserId?{'X-Impersonate':__impersonateUserId}:{};const projectHeaders=__projectId?{'X-Project-Id':__projectId}:{};const sep=path.includes('?')?'&':'?';const urlWithProject=__projectId?path+sep+'projectId='+encodeURIComponent(__projectId):path;return fetch(API+urlWithProject,{...options,headers:{'Authorization':'Bearer '+token,'Content-Type':'application/json',...impHeaders,...projectHeaders,...options.headers}}).then(r=>{if(r.status===401){localStorage.removeItem('admin_token');localStorage.removeItem('admin_user');if(window.__onAuthExpired)window.__onAuthExpired();return null;}if(r.status===403){return r.json().then(d=>{showForbidden(d.error||'Access denied');return{__error:true,...d};}).catch(()=>({__error:true,error:'Forbidden'}));}if(!r.ok)return r.json().then(d=>({__error:true,...d})).catch(()=>null);return r.json();}).catch(()=>null);}
|
|
34
34
|
|
|
35
35
|
let __lastForbiddenMsg='';function showForbidden(msg){__lastForbiddenMsg=msg;setTimeout(()=>{__lastForbiddenMsg='';},3000);}
|
|
36
36
|
function exportCSV(data,filename){if(!data||data.length===0)return;const keys=Object.keys(data[0]);const csv=[keys.join(','),...data.map(row=>keys.map(k=>{const v=row[k];const s=v==null?'':String(v);return s.includes(',')||s.includes('"')||s.includes('\n')?'"'+s.replace(/"/g,'""')+'"':s;}).join(','))].join('\n');const blob=new Blob([csv],{type:'text/csv'});const url=URL.createObjectURL(blob);const a=document.createElement('a');a.href=url;a.download=filename;a.click();URL.revokeObjectURL(url);}
|
|
@@ -39,7 +39,7 @@ const RULES={DASHBOARD_VIEW:[{name:'exportAllowed',type:'boolean',allowed:[true,
|
|
|
39
39
|
|
|
40
40
|
function LoginPage({onLogin}){const[username,setUsername]=useState('');const[password,setPassword]=useState('');const[error,setError]=useState('');const[loading,setLoading]=useState(false);const handleLogin=async()=>{setError('');setLoading(true);const res=await fetch(API+'/auth/login',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({username,password})});const data=await res.json().catch(()=>null);setLoading(false);if(!res.ok||!data?.token){setError(data?.error||'Login failed');return;}localStorage.setItem('admin_token',data.token);localStorage.setItem('admin_user',JSON.stringify(data.user));onLogin();};return(<div className="login-container"><div className="login-box"><h2>Admin Portal</h2>{error&&<div style={{background:'#fee2e2',color:'#991b1b',padding:'8px 12px',borderRadius:6,marginBottom:12,fontSize:13}}>{error}</div>}<input className="input" placeholder="Username" value={username} onChange={e=>setUsername(e.target.value)} onKeyDown={e=>e.key==='Enter'&&handleLogin()}/><input className="input" type="password" placeholder="Password" value={password} onChange={e=>setPassword(e.target.value)} onKeyDown={e=>e.key==='Enter'&&handleLogin()}/><button className="btn btn-primary" style={{width:'100%'}} onClick={handleLogin} disabled={loading}>{loading?'Logging in...':'Login'}</button></div></div>);}
|
|
41
41
|
|
|
42
|
-
function DashboardPage(){const[stats,setStats]=useState({});const load=()=>{api('/stats').then(d=>{setStats(d||{});});};useEffect(()=>{load();
|
|
42
|
+
function DashboardPage(){const[stats,setStats]=useState({});const intervalRef=useRef(null);const load=()=>{api('/stats').then(d=>{if(d===null){if(intervalRef.current){clearInterval(intervalRef.current);intervalRef.current=null;}return;}setStats(d||{});});};useEffect(()=>{load();intervalRef.current=setInterval(load,30000);return()=>{if(intervalRef.current)clearInterval(intervalRef.current);};},[]);const activity=stats.recentActivity||[];return(<div><div className="header"><h2>Dashboard</h2></div><div className="grid"><div className="card"><h3>KB Entries</h3><div className="value">{(stats.kbEntries||0).toLocaleString()}</div></div><div className="card"><h3>Code Symbols</h3><div className="value">{(stats.codeSymbols||0).toLocaleString()}</div></div><div className="card"><h3>Graph Nodes</h3><div className="value">{(stats.graphTotalNodes||0).toLocaleString()}</div><div style={{fontSize:11,color:'#64748b',marginTop:4}}>{(stats.graphKbNodes||0).toLocaleString()} KB + {(stats.graphCodeNodes||0).toLocaleString()} Code</div></div>{stats.users!==undefined&&<div className="card"><h3>Users</h3><div className="value">{stats.users}</div></div>}<div className="card"><h3>MCP Servers</h3><div className="value">{stats.mcpServers||0}</div></div><div className="card"><h3>Uptime</h3><div className="value" style={{fontSize:20}}>{stats.uptime?.formatted||'--'}</div></div><div className="card"><h3>Memory</h3><div className="value" style={{fontSize:16}}>{stats.memory?.formatted||'--'}</div></div></div><div className="card" style={{marginTop:16}}><h3 style={{marginBottom:12}}>Recent Activity</h3>{activity.length===0?<p style={{color:'#94a3b8',fontSize:13}}>No recent activity</p>:<table><thead><tr><th>Time</th><th>User</th><th>Action</th><th>Resource</th></tr></thead><tbody>{activity.map((a,i)=>(<tr key={i}><td style={{fontSize:12}}>{a.timestamp?new Date(a.timestamp).toLocaleString():'-'}</td><td>{a.username}</td><td><span className="badge badge-blue">{a.action}</span></td><td>{a.resource}{a.resourceId?' / '+a.resourceId:''}</td></tr>))}</tbody></table>}</div></div>);}
|
|
43
43
|
|
|
44
44
|
function KBManagementPage(){const[entries,setEntries]=useState([]);const[total,setTotal]=useState(0);const[page,setPage]=useState(1);const pageSize=20;const[sortBy,setSortBy]=useState('created_at');const[sortDir,setSortDir]=useState('desc');const[filter,setFilter]=useState('');const[tab,setTab]=useState('entries');const[promotions,setPromotions]=useState([]);const[importText,setImportText]=useState('');const[msg,setMsg]=useState('');const[tagEntry,setTagEntry]=useState(null);const[tagInput,setTagInput]=useState('');const[linkEntry,setLinkEntry]=useState(null);const[linkTarget,setLinkTarget]=useState('');
|
|
45
45
|
const load=(p,sb,sd)=>{api('/kb/entries?page='+p+'&pageSize='+pageSize+'&sortBy='+sb+'&sortDir='+sd).then(d=>{if(d&&!d.__error){setEntries(d.entries||[]);setTotal(d.total||0);}});};
|
|
@@ -203,8 +203,8 @@ function MCPServersPage(){const[servers,setServers]=useState([]);const[expanded,
|
|
|
203
203
|
{filtered.map(s=>(<React.Fragment key={s.id||s.name}>
|
|
204
204
|
<tr className={expanded[s.name]?'expanded-row':''}><td><span className="expand-btn" onClick={()=>toggle(s.name)}>{expanded[s.name]?'▼':'▶'}</span></td><td><strong>{s.name}</strong></td><td><span className={'badge '+(s.status==='running'||s.status==='connected'?'badge-green':'badge-red')}>{s.status}</span></td><td>{(s.tools||[]).length}</td><td><button className="btn btn-sm btn-outline" onClick={()=>restart(s.name)}>Restart</button>{' '}<button className="btn btn-sm btn-outline" onClick={()=>startEdit(s)}>Edit</button>{' '}<button className="btn btn-sm btn-outline" onClick={()=>viewLogs(s.name)}>{showLogs===s.name?'Hide Logs':'Logs'}</button>{' '}<button className="btn btn-sm btn-outline" style={{color:'#ef4444'}} onClick={()=>removeServer(s.name)}>Remove</button></td></tr>
|
|
205
205
|
{editServer===s.name&&<tr><td colSpan={5}><div style={{padding:12,background:'#f1f5f9',borderRadius:6}}><div style={{display:'flex',gap:8,marginBottom:8}}><button className={'btn btn-sm '+(editForm._mode!=='json'?'btn-primary':'btn-outline')} onClick={()=>setEditForm(p=>({...p,_mode:'form'}))}>Form</button><button className={'btn btn-sm '+(editForm._mode==='json'?'btn-primary':'btn-outline')} onClick={()=>setEditForm(p=>({...p,_mode:'json',_json:JSON.stringify({url:p.url||undefined,type:p.type||'stdio',command:p.command||undefined,args:p.args&&p.args.length?p.args:undefined,env:p.env&&Object.keys(p.env).length?p.env:undefined,disabled:p.disabled||false},null,2)}))}>JSON</button></div>{editError&&<div style={{background:'#fee2e2',color:'#991b1b',padding:'4px 8px',borderRadius:4,marginBottom:8,fontSize:12}}>{editError}</div>}{editForm._mode==='json'?<div><textarea className="input" style={{height:160,fontFamily:'monospace',fontSize:11,width:'100%'}} value={editForm._json||''} onChange={e=>setEditForm(p=>({...p,_json:e.target.value}))}/><div style={{marginTop:8,display:'flex',gap:6}}><button className="btn btn-primary btn-sm" onClick={()=>{try{const parsed=JSON.parse(editForm._json||'{}');setEditError('');api('/mcp/servers/'+encodeURIComponent(editServer),{method:'PUT',body:JSON.stringify(parsed)}).then(r=>{if(r&&r.__error){setEditError(r.error||'Failed');}else{setEditServer(null);load();}});}catch(e){setEditError('Invalid JSON: '+e.message);}}}>Save JSON</button><button className="btn btn-sm btn-outline" onClick={()=>setEditServer(null)}>Cancel</button></div></div>:<div><div style={{display:'grid',gridTemplateColumns:'1fr 1fr',gap:8}}><div><label style={{fontSize:11}}>Type</label><select className="input" value={editForm.type} onChange={e=>setEditForm(p=>({...p,type:e.target.value}))}><option value="httpStream">HTTP Stream</option><option value="sse">SSE</option><option value="stdio">stdio</option></select></div><div><label style={{fontSize:11}}>{editForm.type==='stdio'?'Command':'URL'}</label><input className="input" value={editForm.type==='stdio'?(editForm.command||''):(editForm.url||'')} onChange={e=>setEditForm(p=>editForm.type==='stdio'?{...p,command:e.target.value}:{...p,url:e.target.value})}/></div>{editForm.type==='stdio'&&<div><label style={{fontSize:11}}>Args (comma-separated)</label><input className="input" value={(editForm.args||[]).join(', ')} onChange={e=>setEditForm(p=>({...p,args:e.target.value?e.target.value.split(',').map(a=>a.trim()):[]}))} /></div>}<div style={{gridColumn:'1/3'}}><label style={{fontSize:11}}>Env Variables (KEY=VALUE per line)</label><textarea className="input" style={{height:50,fontFamily:'monospace',fontSize:11}} value={Object.entries(editForm.env||{}).map(([k,v])=>k+'='+v).join('\n')} onChange={e=>{const env={};e.target.value.split('\n').forEach(line=>{const idx=line.indexOf('=');if(idx>0)env[line.slice(0,idx).trim()]=line.slice(idx+1);});setEditForm(p=>({...p,env}));}}/></div></div><div style={{marginTop:8,display:'flex',gap:6,alignItems:'center'}}><label style={{fontSize:11}}><input type="checkbox" checked={editForm.disabled||false} onChange={e=>setEditForm(p=>({...p,disabled:e.target.checked}))}/> Disabled</label><button className="btn btn-primary btn-sm" onClick={saveEdit}>Save</button><button className="btn btn-sm btn-outline" onClick={()=>setEditServer(null)}>Cancel</button></div></div>}</div></td></tr>}
|
|
206
|
-
{expanded[s.name]&&<tr><td colSpan={5} style={{padding:0}}><div className="sub-table"><div style={{padding:'8px 12px'}}><input className="filter-input" placeholder="Filter tools..." value={toolFilters[s.name]||''} onChange={e=>setToolFilters(p=>({...p,[s.name]:e.target.value}))}/></div><table><thead><tr><th style={{width:40}}>#</th><th>Tool Name</th><th style={{width:80}}>Enabled</th></tr></thead><tbody>
|
|
207
|
-
{(s.tools||[]).filter(t=>{const n=typeof t==='string'?t:t.name;return!(toolFilters[s.name])||n.toLowerCase().includes((toolFilters[s.name]||'').toLowerCase());}).map((t,i)=>{const name=typeof t==='string'?t:t.name;const enabled=typeof t==='object'?t.enabled!==false:true;return(<tr key={name}><td>{i+1}</td><td>{name}</td><td><label className="toggle-switch"><input type="checkbox" checked={enabled} onChange={e=>toggleTool(s.name,name,e.target.checked)}/><span className="toggle-slider"></span></label></td></tr>);})}</tbody></table></div></td></tr>}
|
|
206
|
+
{expanded[s.name]&&<tr><td colSpan={5} style={{padding:0}}><div className="sub-table"><div style={{padding:'8px 12px'}}><input className="filter-input" placeholder="Filter tools..." value={toolFilters[s.name]||''} onChange={e=>setToolFilters(p=>({...p,[s.name]:e.target.value}))}/></div><table><thead><tr><th style={{width:40}}>#</th><th>Tool Name</th><th>Description</th><th style={{width:80}}>Enabled</th></tr></thead><tbody>
|
|
207
|
+
{(s.tools||[]).filter(t=>{const n=typeof t==='string'?t:t.name;return!(toolFilters[s.name])||n.toLowerCase().includes((toolFilters[s.name]||'').toLowerCase());}).map((t,i)=>{const name=typeof t==='string'?t:t.name;const desc=typeof t==='object'?(t.description||''):'';const enabled=typeof t==='object'?t.enabled!==false:true;return(<tr key={name}><td>{i+1}</td><td>{name}</td><td style={{fontSize:12,color:'#64748b',maxWidth:400}}>{desc}</td><td><label className="toggle-switch"><input type="checkbox" checked={enabled} onChange={e=>toggleTool(s.name,name,e.target.checked)}/><span className="toggle-slider"></span></label></td></tr>);})}</tbody></table></div></td></tr>}
|
|
208
208
|
{showLogs===s.name&&<tr><td colSpan={5} style={{padding:0}}><div style={{maxHeight:250,overflow:'auto',background:'#1e293b',borderRadius:6,margin:8,padding:8}}>{(logs[s.name]||[]).length===0?<p style={{color:'#94a3b8',fontSize:12}}>No logs yet</p>:(logs[s.name]||[]).map((l,i)=>(<div key={i} className="log-line"><span className="ts">{new Date(l.timestamp).toLocaleTimeString()}</span><span className={'lvl-'+l.level}>[{l.level}]</span> <span style={{color:'#e2e8f0'}}>{l.message}</span></div>))}</div></td></tr>}
|
|
209
209
|
</React.Fragment>))}
|
|
210
210
|
{filtered.length===0&&<tr><td colSpan={5} style={{textAlign:'center',color:'#94a3b8'}}>No servers</td></tr>}
|
|
@@ -313,6 +313,7 @@ function App(){const[loggedIn,setLoggedIn]=useState(!!localStorage.getItem('admi
|
|
|
313
313
|
const userInfo=JSON.parse(localStorage.getItem('admin_user')||'{}');
|
|
314
314
|
const realPerms=userInfo.permissions||[];
|
|
315
315
|
const canCompare=realPerms.includes('RBAC_MANAGE');
|
|
316
|
+
useEffect(()=>{window.__onAuthExpired=()=>setLoggedIn(false);return()=>{window.__onAuthExpired=null;};},[]);
|
|
316
317
|
useEffect(()=>{if(!loggedIn)return;if(userInfo.forcePasswordChange)setForceChange(true);if(canCompare)api('/users?pageSize=100').then(d=>{if(d&&!d.__error)setUsersList(d.users||[]);});},[loggedIn]);
|
|
317
318
|
if(!loggedIn)return<LoginPage onLogin={()=>setLoggedIn(true)}/>;
|
|
318
319
|
const logout=()=>{api('/auth/logout',{method:'POST'}).finally(()=>{localStorage.removeItem('admin_token');localStorage.removeItem('admin_user');setLoggedIn(false);});};
|
package/package.json
CHANGED
|
@@ -3,12 +3,14 @@
|
|
|
3
3
|
* SA4E-37: Added health check, auto-reconnect, and connection state tracking.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
+
import * as fs from 'fs';
|
|
7
|
+
import * as path from 'path';
|
|
6
8
|
import type { Logger } from 'pino';
|
|
7
9
|
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
8
10
|
import type { ToolDefinition } from '../../types/tool.js';
|
|
9
11
|
import type { ServerConfig } from './McpConfigService.js';
|
|
10
12
|
import type { HealthCheckConfig, ServerStatusEntry, ServerStateChangeCallback, Unsubscribe } from './types/health.js';
|
|
11
|
-
import { DEFAULT_HEALTH_CONFIG } from './types/health.js';
|
|
13
|
+
import { DEFAULT_HEALTH_CONFIG, PRODUCTION_HEALTH_CONFIG } from './types/health.js';
|
|
12
14
|
import { ConnectionStateTracker } from './health/ConnectionStateTracker.js';
|
|
13
15
|
import { HealthMonitor } from './health/HealthMonitor.js';
|
|
14
16
|
import { ReconnectManager } from './health/ReconnectManager.js';
|
|
@@ -27,7 +29,7 @@ export class McpClientManager {
|
|
|
27
29
|
|
|
28
30
|
constructor(logger: Logger) {
|
|
29
31
|
this.logger = logger.child({ component: 'McpClientManager' });
|
|
30
|
-
this.healthConfig = { ...
|
|
32
|
+
this.healthConfig = { ...PRODUCTION_HEALTH_CONFIG };
|
|
31
33
|
this.stateTracker = new ConnectionStateTracker(logger);
|
|
32
34
|
this.healthMonitor = new HealthMonitor(logger, {
|
|
33
35
|
getConnectedServers: () => this.getConnectedClients(),
|
|
@@ -42,7 +44,37 @@ export class McpClientManager {
|
|
|
42
44
|
}
|
|
43
45
|
|
|
44
46
|
async initializeAll(): Promise<void> {
|
|
45
|
-
|
|
47
|
+
const workspace = process.env.CODE_INTEL_WORKSPACE || process.cwd();
|
|
48
|
+
const dataDir = process.env.CODE_INTEL_DATA_DIR || '.code-intel';
|
|
49
|
+
const configPath = path.resolve(workspace, dataDir, 'orchestration.json');
|
|
50
|
+
|
|
51
|
+
if (!fs.existsSync(configPath)) {
|
|
52
|
+
this.logger.info({ configPath }, 'No orchestration.json found, skipping child servers');
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
let config: { mcpServers: Record<string, ServerConfig> };
|
|
57
|
+
try {
|
|
58
|
+
const raw = fs.readFileSync(configPath, 'utf-8');
|
|
59
|
+
config = JSON.parse(raw);
|
|
60
|
+
} catch (err) {
|
|
61
|
+
this.logger.error({ err, configPath }, 'Failed to read orchestration.json');
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const servers = Object.entries(config.mcpServers || {});
|
|
66
|
+
this.logger.info({ count: servers.length }, 'Connecting child MCP servers');
|
|
67
|
+
|
|
68
|
+
for (const [name, serverConfig] of servers) {
|
|
69
|
+
try {
|
|
70
|
+
await this.connectServer(name, serverConfig);
|
|
71
|
+
} catch (err) {
|
|
72
|
+
this.logger.error({ err, server: name }, 'Failed to connect child server (will retry via health monitor)');
|
|
73
|
+
// Register so health monitor can attempt reconnect later
|
|
74
|
+
if (!this.stateTracker.getState(name)) this.stateTracker.register(name);
|
|
75
|
+
this.serverConfigs.set(name, serverConfig);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
46
78
|
}
|
|
47
79
|
|
|
48
80
|
getProxiedTools(): ToolDefinition[] { return this.proxiedTools; }
|
|
@@ -199,7 +231,7 @@ export class McpClientManager {
|
|
|
199
231
|
this.toolsToServer.set(tool.name, name);
|
|
200
232
|
this.proxiedTools.push({
|
|
201
233
|
name: tool.name, description: tool.description ?? '',
|
|
202
|
-
category: '
|
|
234
|
+
category: name as ToolDefinition['category'], inputSchema: tool.inputSchema as unknown as Record<string, unknown>,
|
|
203
235
|
});
|
|
204
236
|
}
|
|
205
237
|
}
|
|
@@ -64,7 +64,7 @@ export class HealthMonitor {
|
|
|
64
64
|
private async pingServer(name: string, client: Client): Promise<void> {
|
|
65
65
|
try {
|
|
66
66
|
await Promise.race([
|
|
67
|
-
client.
|
|
67
|
+
client.ping(),
|
|
68
68
|
this.createTimeout(this.config.pingTimeout),
|
|
69
69
|
]);
|
|
70
70
|
this.deps.onPingSuccess(name);
|
|
@@ -18,6 +18,10 @@ function createMockLogger() {
|
|
|
18
18
|
|
|
19
19
|
function createMockClient(shouldReject = false) {
|
|
20
20
|
return {
|
|
21
|
+
ping: vi.fn(() => {
|
|
22
|
+
if (shouldReject) return Promise.reject(new Error('connection lost'));
|
|
23
|
+
return Promise.resolve({});
|
|
24
|
+
}),
|
|
21
25
|
listTools: vi.fn(() => {
|
|
22
26
|
if (shouldReject) return Promise.reject(new Error('connection lost'));
|
|
23
27
|
return Promise.resolve({ tools: [] });
|
|
@@ -86,8 +90,8 @@ describe('HealthMonitor', () => {
|
|
|
86
90
|
await monitor.runCycle();
|
|
87
91
|
expect(deps.onPingSuccess).toHaveBeenCalledWith('s1');
|
|
88
92
|
expect(deps.onPingSuccess).toHaveBeenCalledWith('s2');
|
|
89
|
-
expect(client1.
|
|
90
|
-
expect(client2.
|
|
93
|
+
expect(client1.ping).toHaveBeenCalled();
|
|
94
|
+
expect(client2.ping).toHaveBeenCalled();
|
|
91
95
|
});
|
|
92
96
|
|
|
93
97
|
it('should call onPingFailed when client.listTools rejects', async () => {
|
|
@@ -104,7 +108,7 @@ describe('HealthMonitor', () => {
|
|
|
104
108
|
monitor = new HealthMonitor(logger, deps, config);
|
|
105
109
|
|
|
106
110
|
const slowClient = {
|
|
107
|
-
|
|
111
|
+
ping: vi.fn(() => new Promise(() => {})),
|
|
108
112
|
} as any;
|
|
109
113
|
|
|
110
114
|
(deps.getConnectedServers as any).mockReturnValue(new Map([['s1', slowClient]]));
|
|
@@ -79,6 +79,19 @@ export const DEFAULT_HEALTH_CONFIG: HealthCheckConfig = {
|
|
|
79
79
|
jitterRange: 0.2,
|
|
80
80
|
};
|
|
81
81
|
|
|
82
|
+
/** Production-tuned config: longer timeouts for stdio servers, less aggressive failure detection */
|
|
83
|
+
export const PRODUCTION_HEALTH_CONFIG: HealthCheckConfig = {
|
|
84
|
+
interval: 60_000,
|
|
85
|
+
pingTimeout: 15_000,
|
|
86
|
+
failureThreshold: 3,
|
|
87
|
+
initialDelay: 2_000,
|
|
88
|
+
backoffMultiplier: 2,
|
|
89
|
+
maxDelay: 60_000,
|
|
90
|
+
maxRetries: 10,
|
|
91
|
+
jitterEnabled: true,
|
|
92
|
+
jitterRange: 0.2,
|
|
93
|
+
};
|
|
94
|
+
|
|
82
95
|
/** Valid state transitions map */
|
|
83
96
|
export const VALID_TRANSITIONS: Record<ConnectionState, ConnectionState[]> = {
|
|
84
97
|
disconnected: ['connected'],
|
|
@@ -31,12 +31,12 @@ export function createMcpRoutes(ctx: AdminContext): Hono {
|
|
|
31
31
|
const serverToggles = ctx.toolToggles[name] || {};
|
|
32
32
|
const isConnected = clientManager?.isServerConnected?.(name) ?? false;
|
|
33
33
|
const actualToolCount = clientManager?.getServerToolCount?.(name) ?? 0;
|
|
34
|
-
const configTools = cfg.autoApprove || [];
|
|
34
|
+
const configTools = cfg.tools || cfg.autoApprove || [];
|
|
35
35
|
let tools: any[];
|
|
36
36
|
if (isConnected && actualToolCount > 0) {
|
|
37
37
|
const proxied = (clientManager?.getProxiedTools?.() || []).filter((t: any) => t.category === name);
|
|
38
|
-
tools = proxied.map((t: any) => ({ name: t.name, enabled: serverToggles[t.name] !== false }));
|
|
39
|
-
} else tools = configTools.map((t: string) => ({ name: t, enabled: serverToggles[t] !== false }));
|
|
38
|
+
tools = proxied.map((t: any) => ({ name: t.name, description: t.description || '', enabled: serverToggles[t.name] !== false }));
|
|
39
|
+
} else tools = configTools.map((t: string) => ({ name: t, description: '', enabled: serverToggles[t] !== false }));
|
|
40
40
|
return {
|
|
41
41
|
id: name, name, url: cfg.url || '', type: cfg.type || cfg.transportType || 'stdio',
|
|
42
42
|
transportType: cfg.transportType || cfg.type || 'stdio',
|
|
@@ -49,11 +49,13 @@ export function createMcpRoutes(ctx: AdminContext): Hono {
|
|
|
49
49
|
}
|
|
50
50
|
const allHandlers = ctx.registry?.getToolHandlers?.();
|
|
51
51
|
if (allHandlers) {
|
|
52
|
+
const allDefs = ctx.registry?.getAllToolDefinitions?.() || [];
|
|
53
|
+
const defMap = new Map(allDefs.map((d: any) => [d.name, d.description || '']));
|
|
52
54
|
const internalTools = Array.from(allHandlers.keys());
|
|
53
55
|
servers.push({
|
|
54
56
|
id: 'code-intel', name: 'code-intel', url: 'internal', type: 'internal',
|
|
55
57
|
transportType: 'internal', command: '', args: [], env: {}, disabled: false,
|
|
56
|
-
status: 'running', tools: internalTools.map((t: unknown) => ({ name: t as string, enabled: true })),
|
|
58
|
+
status: 'running', tools: internalTools.map((t: unknown) => ({ name: t as string, description: defMap.get(t as string) || '', enabled: true })),
|
|
57
59
|
});
|
|
58
60
|
}
|
|
59
61
|
const allowedServers = (permCheck.roleData as { allowedServers?: string[] })?.allowedServers;
|
|
@@ -30,7 +30,7 @@ const API='/api/admin';
|
|
|
30
30
|
const __urlParams=new URLSearchParams(window.location.search);
|
|
31
31
|
const __projectId=__urlParams.get('projectId')||'';
|
|
32
32
|
let __impersonateUserId=null;
|
|
33
|
-
function api(path,options={}){const token=localStorage.getItem('admin_token')||'';const impHeaders=__impersonateUserId?{'X-Impersonate':__impersonateUserId}:{};const projectHeaders=__projectId?{'X-Project-Id':__projectId}:{};const sep=path.includes('?')?'&':'?';const urlWithProject=__projectId?path+sep+'projectId='+encodeURIComponent(__projectId):path;return fetch(API+urlWithProject,{...options,headers:{'Authorization':'Bearer '+token,'Content-Type':'application/json',...impHeaders,...projectHeaders,...options.headers}}).then(r=>{if(r.status===401){localStorage.removeItem('admin_token');localStorage.removeItem('admin_user');return null;}if(r.status===403){return r.json().then(d=>{showForbidden(d.error||'Access denied');return{__error:true,...d};}).catch(()=>({__error:true,error:'Forbidden'}));}if(!r.ok)return r.json().then(d=>({__error:true,...d})).catch(()=>null);return r.json();}).catch(()=>null);}
|
|
33
|
+
function api(path,options={}){const token=localStorage.getItem('admin_token')||'';if(!token&&!path.includes('/auth/')){return Promise.resolve(null);}const impHeaders=__impersonateUserId?{'X-Impersonate':__impersonateUserId}:{};const projectHeaders=__projectId?{'X-Project-Id':__projectId}:{};const sep=path.includes('?')?'&':'?';const urlWithProject=__projectId?path+sep+'projectId='+encodeURIComponent(__projectId):path;return fetch(API+urlWithProject,{...options,headers:{'Authorization':'Bearer '+token,'Content-Type':'application/json',...impHeaders,...projectHeaders,...options.headers}}).then(r=>{if(r.status===401){localStorage.removeItem('admin_token');localStorage.removeItem('admin_user');if(window.__onAuthExpired)window.__onAuthExpired();return null;}if(r.status===403){return r.json().then(d=>{showForbidden(d.error||'Access denied');return{__error:true,...d};}).catch(()=>({__error:true,error:'Forbidden'}));}if(!r.ok)return r.json().then(d=>({__error:true,...d})).catch(()=>null);return r.json();}).catch(()=>null);}
|
|
34
34
|
|
|
35
35
|
let __lastForbiddenMsg='';function showForbidden(msg){__lastForbiddenMsg=msg;setTimeout(()=>{__lastForbiddenMsg='';},3000);}
|
|
36
36
|
function exportCSV(data,filename){if(!data||data.length===0)return;const keys=Object.keys(data[0]);const csv=[keys.join(','),...data.map(row=>keys.map(k=>{const v=row[k];const s=v==null?'':String(v);return s.includes(',')||s.includes('"')||s.includes('\n')?'"'+s.replace(/"/g,'""')+'"':s;}).join(','))].join('\n');const blob=new Blob([csv],{type:'text/csv'});const url=URL.createObjectURL(blob);const a=document.createElement('a');a.href=url;a.download=filename;a.click();URL.revokeObjectURL(url);}
|
|
@@ -39,7 +39,7 @@ const RULES={DASHBOARD_VIEW:[{name:'exportAllowed',type:'boolean',allowed:[true,
|
|
|
39
39
|
|
|
40
40
|
function LoginPage({onLogin}){const[username,setUsername]=useState('');const[password,setPassword]=useState('');const[error,setError]=useState('');const[loading,setLoading]=useState(false);const handleLogin=async()=>{setError('');setLoading(true);const res=await fetch(API+'/auth/login',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({username,password})});const data=await res.json().catch(()=>null);setLoading(false);if(!res.ok||!data?.token){setError(data?.error||'Login failed');return;}localStorage.setItem('admin_token',data.token);localStorage.setItem('admin_user',JSON.stringify(data.user));onLogin();};return(<div className="login-container"><div className="login-box"><h2>Admin Portal</h2>{error&&<div style={{background:'#fee2e2',color:'#991b1b',padding:'8px 12px',borderRadius:6,marginBottom:12,fontSize:13}}>{error}</div>}<input className="input" placeholder="Username" value={username} onChange={e=>setUsername(e.target.value)} onKeyDown={e=>e.key==='Enter'&&handleLogin()}/><input className="input" type="password" placeholder="Password" value={password} onChange={e=>setPassword(e.target.value)} onKeyDown={e=>e.key==='Enter'&&handleLogin()}/><button className="btn btn-primary" style={{width:'100%'}} onClick={handleLogin} disabled={loading}>{loading?'Logging in...':'Login'}</button></div></div>);}
|
|
41
41
|
|
|
42
|
-
function DashboardPage(){const[stats,setStats]=useState({});const load=()=>{api('/stats').then(d=>{setStats(d||{});});};useEffect(()=>{load();
|
|
42
|
+
function DashboardPage(){const[stats,setStats]=useState({});const intervalRef=useRef(null);const load=()=>{api('/stats').then(d=>{if(d===null){if(intervalRef.current){clearInterval(intervalRef.current);intervalRef.current=null;}return;}setStats(d||{});});};useEffect(()=>{load();intervalRef.current=setInterval(load,30000);return()=>{if(intervalRef.current)clearInterval(intervalRef.current);};},[]);const activity=stats.recentActivity||[];return(<div><div className="header"><h2>Dashboard</h2></div><div className="grid"><div className="card"><h3>KB Entries</h3><div className="value">{(stats.kbEntries||0).toLocaleString()}</div></div><div className="card"><h3>Code Symbols</h3><div className="value">{(stats.codeSymbols||0).toLocaleString()}</div></div><div className="card"><h3>Graph Nodes</h3><div className="value">{(stats.graphTotalNodes||0).toLocaleString()}</div><div style={{fontSize:11,color:'#64748b',marginTop:4}}>{(stats.graphKbNodes||0).toLocaleString()} KB + {(stats.graphCodeNodes||0).toLocaleString()} Code</div></div>{stats.users!==undefined&&<div className="card"><h3>Users</h3><div className="value">{stats.users}</div></div>}<div className="card"><h3>MCP Servers</h3><div className="value">{stats.mcpServers||0}</div></div><div className="card"><h3>Uptime</h3><div className="value" style={{fontSize:20}}>{stats.uptime?.formatted||'--'}</div></div><div className="card"><h3>Memory</h3><div className="value" style={{fontSize:16}}>{stats.memory?.formatted||'--'}</div></div></div><div className="card" style={{marginTop:16}}><h3 style={{marginBottom:12}}>Recent Activity</h3>{activity.length===0?<p style={{color:'#94a3b8',fontSize:13}}>No recent activity</p>:<table><thead><tr><th>Time</th><th>User</th><th>Action</th><th>Resource</th></tr></thead><tbody>{activity.map((a,i)=>(<tr key={i}><td style={{fontSize:12}}>{a.timestamp?new Date(a.timestamp).toLocaleString():'-'}</td><td>{a.username}</td><td><span className="badge badge-blue">{a.action}</span></td><td>{a.resource}{a.resourceId?' / '+a.resourceId:''}</td></tr>))}</tbody></table>}</div></div>);}
|
|
43
43
|
|
|
44
44
|
function KBManagementPage(){const[entries,setEntries]=useState([]);const[total,setTotal]=useState(0);const[page,setPage]=useState(1);const pageSize=20;const[sortBy,setSortBy]=useState('created_at');const[sortDir,setSortDir]=useState('desc');const[filter,setFilter]=useState('');const[tab,setTab]=useState('entries');const[promotions,setPromotions]=useState([]);const[importText,setImportText]=useState('');const[msg,setMsg]=useState('');const[tagEntry,setTagEntry]=useState(null);const[tagInput,setTagInput]=useState('');const[linkEntry,setLinkEntry]=useState(null);const[linkTarget,setLinkTarget]=useState('');
|
|
45
45
|
const load=(p,sb,sd)=>{api('/kb/entries?page='+p+'&pageSize='+pageSize+'&sortBy='+sb+'&sortDir='+sd).then(d=>{if(d&&!d.__error){setEntries(d.entries||[]);setTotal(d.total||0);}});};
|
|
@@ -203,8 +203,8 @@ function MCPServersPage(){const[servers,setServers]=useState([]);const[expanded,
|
|
|
203
203
|
{filtered.map(s=>(<React.Fragment key={s.id||s.name}>
|
|
204
204
|
<tr className={expanded[s.name]?'expanded-row':''}><td><span className="expand-btn" onClick={()=>toggle(s.name)}>{expanded[s.name]?'▼':'▶'}</span></td><td><strong>{s.name}</strong></td><td><span className={'badge '+(s.status==='running'||s.status==='connected'?'badge-green':'badge-red')}>{s.status}</span></td><td>{(s.tools||[]).length}</td><td><button className="btn btn-sm btn-outline" onClick={()=>restart(s.name)}>Restart</button>{' '}<button className="btn btn-sm btn-outline" onClick={()=>startEdit(s)}>Edit</button>{' '}<button className="btn btn-sm btn-outline" onClick={()=>viewLogs(s.name)}>{showLogs===s.name?'Hide Logs':'Logs'}</button>{' '}<button className="btn btn-sm btn-outline" style={{color:'#ef4444'}} onClick={()=>removeServer(s.name)}>Remove</button></td></tr>
|
|
205
205
|
{editServer===s.name&&<tr><td colSpan={5}><div style={{padding:12,background:'#f1f5f9',borderRadius:6}}><div style={{display:'flex',gap:8,marginBottom:8}}><button className={'btn btn-sm '+(editForm._mode!=='json'?'btn-primary':'btn-outline')} onClick={()=>setEditForm(p=>({...p,_mode:'form'}))}>Form</button><button className={'btn btn-sm '+(editForm._mode==='json'?'btn-primary':'btn-outline')} onClick={()=>setEditForm(p=>({...p,_mode:'json',_json:JSON.stringify({url:p.url||undefined,type:p.type||'stdio',command:p.command||undefined,args:p.args&&p.args.length?p.args:undefined,env:p.env&&Object.keys(p.env).length?p.env:undefined,disabled:p.disabled||false},null,2)}))}>JSON</button></div>{editError&&<div style={{background:'#fee2e2',color:'#991b1b',padding:'4px 8px',borderRadius:4,marginBottom:8,fontSize:12}}>{editError}</div>}{editForm._mode==='json'?<div><textarea className="input" style={{height:160,fontFamily:'monospace',fontSize:11,width:'100%'}} value={editForm._json||''} onChange={e=>setEditForm(p=>({...p,_json:e.target.value}))}/><div style={{marginTop:8,display:'flex',gap:6}}><button className="btn btn-primary btn-sm" onClick={()=>{try{const parsed=JSON.parse(editForm._json||'{}');setEditError('');api('/mcp/servers/'+encodeURIComponent(editServer),{method:'PUT',body:JSON.stringify(parsed)}).then(r=>{if(r&&r.__error){setEditError(r.error||'Failed');}else{setEditServer(null);load();}});}catch(e){setEditError('Invalid JSON: '+e.message);}}}>Save JSON</button><button className="btn btn-sm btn-outline" onClick={()=>setEditServer(null)}>Cancel</button></div></div>:<div><div style={{display:'grid',gridTemplateColumns:'1fr 1fr',gap:8}}><div><label style={{fontSize:11}}>Type</label><select className="input" value={editForm.type} onChange={e=>setEditForm(p=>({...p,type:e.target.value}))}><option value="httpStream">HTTP Stream</option><option value="sse">SSE</option><option value="stdio">stdio</option></select></div><div><label style={{fontSize:11}}>{editForm.type==='stdio'?'Command':'URL'}</label><input className="input" value={editForm.type==='stdio'?(editForm.command||''):(editForm.url||'')} onChange={e=>setEditForm(p=>editForm.type==='stdio'?{...p,command:e.target.value}:{...p,url:e.target.value})}/></div>{editForm.type==='stdio'&&<div><label style={{fontSize:11}}>Args (comma-separated)</label><input className="input" value={(editForm.args||[]).join(', ')} onChange={e=>setEditForm(p=>({...p,args:e.target.value?e.target.value.split(',').map(a=>a.trim()):[]}))} /></div>}<div style={{gridColumn:'1/3'}}><label style={{fontSize:11}}>Env Variables (KEY=VALUE per line)</label><textarea className="input" style={{height:50,fontFamily:'monospace',fontSize:11}} value={Object.entries(editForm.env||{}).map(([k,v])=>k+'='+v).join('\n')} onChange={e=>{const env={};e.target.value.split('\n').forEach(line=>{const idx=line.indexOf('=');if(idx>0)env[line.slice(0,idx).trim()]=line.slice(idx+1);});setEditForm(p=>({...p,env}));}}/></div></div><div style={{marginTop:8,display:'flex',gap:6,alignItems:'center'}}><label style={{fontSize:11}}><input type="checkbox" checked={editForm.disabled||false} onChange={e=>setEditForm(p=>({...p,disabled:e.target.checked}))}/> Disabled</label><button className="btn btn-primary btn-sm" onClick={saveEdit}>Save</button><button className="btn btn-sm btn-outline" onClick={()=>setEditServer(null)}>Cancel</button></div></div>}</div></td></tr>}
|
|
206
|
-
{expanded[s.name]&&<tr><td colSpan={5} style={{padding:0}}><div className="sub-table"><div style={{padding:'8px 12px'}}><input className="filter-input" placeholder="Filter tools..." value={toolFilters[s.name]||''} onChange={e=>setToolFilters(p=>({...p,[s.name]:e.target.value}))}/></div><table><thead><tr><th style={{width:40}}>#</th><th>Tool Name</th><th style={{width:80}}>Enabled</th></tr></thead><tbody>
|
|
207
|
-
{(s.tools||[]).filter(t=>{const n=typeof t==='string'?t:t.name;return!(toolFilters[s.name])||n.toLowerCase().includes((toolFilters[s.name]||'').toLowerCase());}).map((t,i)=>{const name=typeof t==='string'?t:t.name;const enabled=typeof t==='object'?t.enabled!==false:true;return(<tr key={name}><td>{i+1}</td><td>{name}</td><td><label className="toggle-switch"><input type="checkbox" checked={enabled} onChange={e=>toggleTool(s.name,name,e.target.checked)}/><span className="toggle-slider"></span></label></td></tr>);})}</tbody></table></div></td></tr>}
|
|
206
|
+
{expanded[s.name]&&<tr><td colSpan={5} style={{padding:0}}><div className="sub-table"><div style={{padding:'8px 12px'}}><input className="filter-input" placeholder="Filter tools..." value={toolFilters[s.name]||''} onChange={e=>setToolFilters(p=>({...p,[s.name]:e.target.value}))}/></div><table><thead><tr><th style={{width:40}}>#</th><th>Tool Name</th><th>Description</th><th style={{width:80}}>Enabled</th></tr></thead><tbody>
|
|
207
|
+
{(s.tools||[]).filter(t=>{const n=typeof t==='string'?t:t.name;return!(toolFilters[s.name])||n.toLowerCase().includes((toolFilters[s.name]||'').toLowerCase());}).map((t,i)=>{const name=typeof t==='string'?t:t.name;const desc=typeof t==='object'?(t.description||''):'';const enabled=typeof t==='object'?t.enabled!==false:true;return(<tr key={name}><td>{i+1}</td><td>{name}</td><td style={{fontSize:12,color:'#64748b',maxWidth:400}}>{desc}</td><td><label className="toggle-switch"><input type="checkbox" checked={enabled} onChange={e=>toggleTool(s.name,name,e.target.checked)}/><span className="toggle-slider"></span></label></td></tr>);})}</tbody></table></div></td></tr>}
|
|
208
208
|
{showLogs===s.name&&<tr><td colSpan={5} style={{padding:0}}><div style={{maxHeight:250,overflow:'auto',background:'#1e293b',borderRadius:6,margin:8,padding:8}}>{(logs[s.name]||[]).length===0?<p style={{color:'#94a3b8',fontSize:12}}>No logs yet</p>:(logs[s.name]||[]).map((l,i)=>(<div key={i} className="log-line"><span className="ts">{new Date(l.timestamp).toLocaleTimeString()}</span><span className={'lvl-'+l.level}>[{l.level}]</span> <span style={{color:'#e2e8f0'}}>{l.message}</span></div>))}</div></td></tr>}
|
|
209
209
|
</React.Fragment>))}
|
|
210
210
|
{filtered.length===0&&<tr><td colSpan={5} style={{textAlign:'center',color:'#94a3b8'}}>No servers</td></tr>}
|
|
@@ -313,6 +313,7 @@ function App(){const[loggedIn,setLoggedIn]=useState(!!localStorage.getItem('admi
|
|
|
313
313
|
const userInfo=JSON.parse(localStorage.getItem('admin_user')||'{}');
|
|
314
314
|
const realPerms=userInfo.permissions||[];
|
|
315
315
|
const canCompare=realPerms.includes('RBAC_MANAGE');
|
|
316
|
+
useEffect(()=>{window.__onAuthExpired=()=>setLoggedIn(false);return()=>{window.__onAuthExpired=null;};},[]);
|
|
316
317
|
useEffect(()=>{if(!loggedIn)return;if(userInfo.forcePasswordChange)setForceChange(true);if(canCompare)api('/users?pageSize=100').then(d=>{if(d&&!d.__error)setUsersList(d.users||[]);});},[loggedIn]);
|
|
317
318
|
if(!loggedIn)return<LoginPage onLogin={()=>setLoggedIn(true)}/>;
|
|
318
319
|
const logout=()=>{api('/auth/logout',{method:'POST'}).finally(()=>{localStorage.removeItem('admin_token');localStorage.removeItem('admin_user');setLoggedIn(false);});};
|