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 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.7.0-blue?style=for-the-badge" alt="Version">
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 { DEFAULT_HEALTH_CONFIG } from './types/health.js';
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 = { ...DEFAULT_HEALTH_CONFIG };
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
- this.logger.info('Skipping child servers for debugging');
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: 'orchestration', inputSchema: tool.inputSchema,
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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"}
@@ -45,7 +45,7 @@ export class HealthMonitor {
45
45
  async pingServer(name, client) {
46
46
  try {
47
47
  await Promise.race([
48
- client.listTools(),
48
+ client.ping(),
49
49
  this.createTimeout(this.config.pingTimeout),
50
50
  ]);
51
51
  this.deps.onPingSuccess(name);
@@ -1 +1 @@
1
- {"version":3,"file":"HealthMonitor.js","sourceRoot":"","sources":["../../../../src/modules/orchestration/health/HealthMonitor.ts"],"names":[],"mappings":"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"}
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.listTools).toHaveBeenCalled();
78
- expect(client2.listTools).toHaveBeenCalled();
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
- listTools: vi.fn(() => new Promise(() => { })),
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":"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"}
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();const i=setInterval(load,30000);return()=>clearInterval(i);},[]);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>);}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sdlc-agent-4-enterprise-server",
3
- "version": "1.8.1",
3
+ "version": "1.8.2",
4
4
  "description": "Code Intelligence MCP Server — multi-agent SDLC pipeline with semantic memory, code graph, and draw.io integration",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -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 = { ...DEFAULT_HEALTH_CONFIG };
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
- this.logger.info('Skipping child servers for debugging');
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: 'orchestration', inputSchema: tool.inputSchema as unknown as Record<string, unknown>,
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.listTools(),
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.listTools).toHaveBeenCalled();
90
- expect(client2.listTools).toHaveBeenCalled();
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
- listTools: vi.fn(() => new Promise(() => {})),
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();const i=setInterval(load,30000);return()=>clearInterval(i);},[]);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>);}
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);});};