sdlc-agent-4-enterprise-server 1.7.0 → 1.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/index.js +11 -1
- package/dist/config/index.js.map +1 -1
- package/dist/server/routes/admin/database.js +5 -1
- package/dist/server/routes/admin/database.js.map +1 -1
- package/dist/viewer/admin/index.html +1 -1
- package/package.json +1 -1
- package/src/config/index.ts +10 -1
- package/src/server/routes/admin/database.ts +5 -1
- package/src/viewer/admin/index.html +1 -1
- package/tests/e2e/admin-api.e2e.test.ts +4 -4
- package/tests/e2e/admin-ui.e2e.test.ts +3 -5
- package/tests/e2e/check-lod.mjs +2 -1
- package/tests/e2e/debug-collapse.mjs +2 -1
- package/tests/e2e/debug-expand.mjs +2 -1
- package/tests/e2e/debug-lod.mjs +2 -1
- package/tests/e2e/debug-realtime.mjs +2 -1
- package/tests/e2e/lod-collapse.e2e.test.ts +1 -3
- package/tests/e2e/mcp-api.e2e.test.ts +2 -4
- package/tests/e2e/multi-tenant.e2e.test.ts +2 -3
- package/tests/e2e/setup/e2e-config.ts +26 -0
- package/tests/e2e/setup/global-setup.ts +131 -0
- package/tests/e2e/test-progressive.mjs +2 -1
- package/tests/e2e/test-user-zoom.mjs +2 -1
- package/tests/e2e/tool-forwarding.e2e.test.ts +1 -2
package/dist/config/index.js
CHANGED
|
@@ -60,6 +60,16 @@ function resolveViewerPort() {
|
|
|
60
60
|
return parseInt(envPort, 10);
|
|
61
61
|
return 3202;
|
|
62
62
|
}
|
|
63
|
+
function resolvePort() {
|
|
64
|
+
const args = process.argv.slice(2);
|
|
65
|
+
const idx = args.indexOf('--port');
|
|
66
|
+
if (idx >= 0 && args[idx + 1])
|
|
67
|
+
return parseInt(args[idx + 1], 10);
|
|
68
|
+
const envPort = process.env['CODE_INTEL_PORT'];
|
|
69
|
+
if (envPort)
|
|
70
|
+
return parseInt(envPort, 10);
|
|
71
|
+
return 48721;
|
|
72
|
+
}
|
|
63
73
|
function loadFileConfig(configPath) {
|
|
64
74
|
try {
|
|
65
75
|
if (fs.existsSync(configPath)) {
|
|
@@ -120,7 +130,7 @@ export function loadConfig(overrides) {
|
|
|
120
130
|
const envDb = process.env['CODE_INTEL_DB'] || 'index.db';
|
|
121
131
|
const dbPath = path.isAbsolute(envDb) ? envDb : path.join(codeIntelDir, envDb);
|
|
122
132
|
const raw = {
|
|
123
|
-
port:
|
|
133
|
+
port: resolvePort(),
|
|
124
134
|
host: process.env.CODE_INTEL_HOST || '0.0.0.0',
|
|
125
135
|
onnxModelPath: process.env.CODE_INTEL_ONNX_MODEL || 'models/model.onnx',
|
|
126
136
|
logLevel: (process.env.CODE_INTEL_LOG_LEVEL || 'info'),
|
package/dist/config/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,7 +29,11 @@ export function createDatabaseRoutes(ctx) {
|
|
|
29
29
|
app.get('/api/admin/database/status', (c) => {
|
|
30
30
|
try {
|
|
31
31
|
const config = configService.load();
|
|
32
|
-
|
|
32
|
+
const engine = config.activeEngine;
|
|
33
|
+
const connParams = engine !== 'sqlite' && config.engines[engine]
|
|
34
|
+
? { host: config.engines[engine].host, port: config.engines[engine].port, username: config.engines[engine].username, database: config.engines[engine].database, ssl: config.engines[engine].ssl }
|
|
35
|
+
: undefined;
|
|
36
|
+
return c.json({ success: true, data: { engine, status: 'connected', details: config.engines.sqlite, connection: connParams, lastMigration: config.migration.lastMigration } });
|
|
33
37
|
}
|
|
34
38
|
catch (err) {
|
|
35
39
|
return c.json({ success: false, error: { code: 'STATUS_ERROR', message: err.message } }, 500);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../../../src/server/routes/admin/database.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,mDAAmD,CAAC;AAC1F,OAAO,EAAE,sBAAsB,EAAE,MAAM,qDAAqD,CAAC;AAC7F,OAAO,EAAE,gBAAgB,EAA0B,MAAM,iDAAiD,CAAC;AAC3G,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACvC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;IACxC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CAChC,CAAC,CAAC;AAEH,IAAI,eAAe,GAA4B,IAAI,CAAC;AAEpD,MAAM,UAAU,oBAAoB,CAAC,GAAiB;IACpD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,aAAa,CAAC,CAAC;IAC3D,MAAM,aAAa,GAAG,IAAI,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAEzD,GAAG,CAAC,GAAG,CAAC,4BAA4B,EAAE,CAAC,CAAC,EAAE,EAAE;QAC1C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC;YACpC,
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../../../src/server/routes/admin/database.ts"],"names":[],"mappings":"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"}
|
|
@@ -252,7 +252,7 @@ function ConfigurationPage(){const[config,setConfig]=useState({});const[history,
|
|
|
252
252
|
const[llmTesting,setLlmTesting]=useState(false);const[llmTestResult,setLlmTestResult]=useState(null);const[showApiKey,setShowApiKey]=useState(false);const[apiKeyInput,setApiKeyInput]=useState('');const[useDefaultUrl,setUseDefaultUrl]=useState(true);const[liveModels,setLiveModels]=useState(null);
|
|
253
253
|
const[dbStatus,setDbStatus]=useState(null);const[dbEngine,setDbEngine]=useState('sqlite');const[dbForm,setDbForm]=useState({host:'localhost',port:5432,username:'',password:'',database:'',ssl:false});const[dbTestResult,setDbTestResult]=useState(null);const[dbTesting,setDbTesting]=useState(false);const[dbMigrating,setDbMigrating]=useState(false);const[dbMigrationProgress,setDbMigrationProgress]=useState(null);const[dbMigrationLog,setDbMigrationLog]=useState([]);
|
|
254
254
|
const fetchModels=async(prov,baseUrl)=>{try{const d=await api('/llm/models?provider='+encodeURIComponent(prov||'')+'&baseUrl='+encodeURIComponent(baseUrl||''));if(d&&!d.__error&&d.models&&d.models.length>0)setLiveModels(d.models);else setLiveModels(null);}catch{setLiveModels(null);}};
|
|
255
|
-
const loadDbStatus=()=>{api('/database/status').then(d=>{if(d&&!d.__error&&d.data){setDbStatus(d.data);setDbEngine(d.data.engine||'sqlite');}});};
|
|
255
|
+
const loadDbStatus=()=>{api('/database/status').then(d=>{if(d&&!d.__error&&d.data){setDbStatus(d.data);setDbEngine(d.data.engine||'sqlite');if(d.data.connection){setDbForm(f=>({...f,host:d.data.connection.host||f.host,port:d.data.connection.port||f.port,username:d.data.connection.username||f.username,database:d.data.connection.database||f.database,ssl:d.data.connection.ssl??f.ssl}));}}});};
|
|
256
256
|
const testDbConnection=async()=>{setDbTesting(true);setDbTestResult(null);try{const d=await api('/database/test-connection',{method:'POST',body:JSON.stringify({engine:dbEngine,...dbForm,port:parseInt(dbForm.port)||5432})});if(d&&!d.__error){setDbTestResult(d);}else{setDbTestResult({success:false,error:d?.error||{message:'Request failed'}});}}catch(e){setDbTestResult({success:false,error:{message:e.message}});}setDbTesting(false);};
|
|
257
257
|
const startMigration=async()=>{setDbMigrating(true);setDbMigrationLog([]);setDbMigrationProgress(null);try{const resp=await fetch((window.__MCP_BASE||'')+'/api/admin/database/migrate',{method:'POST',headers:{'Content-Type':'application/json','Authorization':'Bearer '+localStorage.getItem('admin_token')},body:JSON.stringify({engine:dbEngine,...dbForm,port:parseInt(dbForm.port)||5432})});if(!resp.ok){const err=await resp.json().catch(()=>({error:{message:'Request failed'}}));setDbMigrating(false);setMsg('✗ Migration failed: '+(err?.error?.message||resp.statusText));return;}const reader=resp.body?.getReader();if(!reader){setDbMigrating(false);setMsg('✗ No stream');return;}const decoder=new TextDecoder();let buf='';try{while(true){const{done,value}=await reader.read();if(done)break;buf+=decoder.decode(value,{stream:true});const lines=buf.split('\n');buf=lines.pop()||'';for(const line of lines){if(line.startsWith('data:')){try{const ev=JSON.parse(line.slice(5));setDbMigrationProgress(ev);setDbMigrationLog(l=>[...l,{time:new Date().toLocaleTimeString(),msg:(ev.table||'')+' '+(ev.percent!=null?ev.percent+'%':ev.phase||ev.message||'')}]);}catch{}}}}}catch(streamErr){setMsg('✗ Stream error: '+(streamErr?.message||'connection lost'));}setDbMigrating(false);loadDbStatus();}catch(e){setDbMigrating(false);setMsg('✗ Migration failed: '+e.message);}};
|
|
258
258
|
const cancelMigration=async()=>{await api('/database/migrate/cancel',{method:'POST'});setDbMigrating(false);setMsg('Migration cancelled');};
|
package/package.json
CHANGED
package/src/config/index.ts
CHANGED
|
@@ -67,6 +67,15 @@ function resolveViewerPort(): number {
|
|
|
67
67
|
return 3202;
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
+
function resolvePort(): number {
|
|
71
|
+
const args = process.argv.slice(2);
|
|
72
|
+
const idx = args.indexOf('--port');
|
|
73
|
+
if (idx >= 0 && args[idx + 1]) return parseInt(args[idx + 1], 10);
|
|
74
|
+
const envPort = process.env['CODE_INTEL_PORT'];
|
|
75
|
+
if (envPort) return parseInt(envPort, 10);
|
|
76
|
+
return 48721;
|
|
77
|
+
}
|
|
78
|
+
|
|
70
79
|
function loadFileConfig(configPath: string): Record<string, any> {
|
|
71
80
|
try {
|
|
72
81
|
if (fs.existsSync(configPath)) {
|
|
@@ -126,7 +135,7 @@ export function loadConfig(overrides?: Partial<UnifiedConfig>): UnifiedConfig {
|
|
|
126
135
|
const dbPath = path.isAbsolute(envDb) ? envDb : path.join(codeIntelDir, envDb);
|
|
127
136
|
|
|
128
137
|
const raw = {
|
|
129
|
-
port:
|
|
138
|
+
port: resolvePort(),
|
|
130
139
|
host: process.env.CODE_INTEL_HOST || '0.0.0.0',
|
|
131
140
|
onnxModelPath: process.env.CODE_INTEL_ONNX_MODEL || 'models/model.onnx',
|
|
132
141
|
logLevel: (process.env.CODE_INTEL_LOG_LEVEL || 'info') as any,
|
|
@@ -35,7 +35,11 @@ export function createDatabaseRoutes(ctx: AdminContext): Hono {
|
|
|
35
35
|
app.get('/api/admin/database/status', (c) => {
|
|
36
36
|
try {
|
|
37
37
|
const config = configService.load();
|
|
38
|
-
|
|
38
|
+
const engine = config.activeEngine;
|
|
39
|
+
const connParams = engine !== 'sqlite' && config.engines[engine]
|
|
40
|
+
? { host: config.engines[engine]!.host, port: config.engines[engine]!.port, username: config.engines[engine]!.username, database: config.engines[engine]!.database, ssl: config.engines[engine]!.ssl }
|
|
41
|
+
: undefined;
|
|
42
|
+
return c.json({ success: true, data: { engine, status: 'connected', details: config.engines.sqlite, connection: connParams, lastMigration: config.migration.lastMigration } });
|
|
39
43
|
} catch (err) {
|
|
40
44
|
return c.json({ success: false, error: { code: 'STATUS_ERROR', message: (err as Error).message } }, 500);
|
|
41
45
|
}
|
|
@@ -252,7 +252,7 @@ function ConfigurationPage(){const[config,setConfig]=useState({});const[history,
|
|
|
252
252
|
const[llmTesting,setLlmTesting]=useState(false);const[llmTestResult,setLlmTestResult]=useState(null);const[showApiKey,setShowApiKey]=useState(false);const[apiKeyInput,setApiKeyInput]=useState('');const[useDefaultUrl,setUseDefaultUrl]=useState(true);const[liveModels,setLiveModels]=useState(null);
|
|
253
253
|
const[dbStatus,setDbStatus]=useState(null);const[dbEngine,setDbEngine]=useState('sqlite');const[dbForm,setDbForm]=useState({host:'localhost',port:5432,username:'',password:'',database:'',ssl:false});const[dbTestResult,setDbTestResult]=useState(null);const[dbTesting,setDbTesting]=useState(false);const[dbMigrating,setDbMigrating]=useState(false);const[dbMigrationProgress,setDbMigrationProgress]=useState(null);const[dbMigrationLog,setDbMigrationLog]=useState([]);
|
|
254
254
|
const fetchModels=async(prov,baseUrl)=>{try{const d=await api('/llm/models?provider='+encodeURIComponent(prov||'')+'&baseUrl='+encodeURIComponent(baseUrl||''));if(d&&!d.__error&&d.models&&d.models.length>0)setLiveModels(d.models);else setLiveModels(null);}catch{setLiveModels(null);}};
|
|
255
|
-
const loadDbStatus=()=>{api('/database/status').then(d=>{if(d&&!d.__error&&d.data){setDbStatus(d.data);setDbEngine(d.data.engine||'sqlite');}});};
|
|
255
|
+
const loadDbStatus=()=>{api('/database/status').then(d=>{if(d&&!d.__error&&d.data){setDbStatus(d.data);setDbEngine(d.data.engine||'sqlite');if(d.data.connection){setDbForm(f=>({...f,host:d.data.connection.host||f.host,port:d.data.connection.port||f.port,username:d.data.connection.username||f.username,database:d.data.connection.database||f.database,ssl:d.data.connection.ssl??f.ssl}));}}});};
|
|
256
256
|
const testDbConnection=async()=>{setDbTesting(true);setDbTestResult(null);try{const d=await api('/database/test-connection',{method:'POST',body:JSON.stringify({engine:dbEngine,...dbForm,port:parseInt(dbForm.port)||5432})});if(d&&!d.__error){setDbTestResult(d);}else{setDbTestResult({success:false,error:d?.error||{message:'Request failed'}});}}catch(e){setDbTestResult({success:false,error:{message:e.message}});}setDbTesting(false);};
|
|
257
257
|
const startMigration=async()=>{setDbMigrating(true);setDbMigrationLog([]);setDbMigrationProgress(null);try{const resp=await fetch((window.__MCP_BASE||'')+'/api/admin/database/migrate',{method:'POST',headers:{'Content-Type':'application/json','Authorization':'Bearer '+localStorage.getItem('admin_token')},body:JSON.stringify({engine:dbEngine,...dbForm,port:parseInt(dbForm.port)||5432})});if(!resp.ok){const err=await resp.json().catch(()=>({error:{message:'Request failed'}}));setDbMigrating(false);setMsg('✗ Migration failed: '+(err?.error?.message||resp.statusText));return;}const reader=resp.body?.getReader();if(!reader){setDbMigrating(false);setMsg('✗ No stream');return;}const decoder=new TextDecoder();let buf='';try{while(true){const{done,value}=await reader.read();if(done)break;buf+=decoder.decode(value,{stream:true});const lines=buf.split('\n');buf=lines.pop()||'';for(const line of lines){if(line.startsWith('data:')){try{const ev=JSON.parse(line.slice(5));setDbMigrationProgress(ev);setDbMigrationLog(l=>[...l,{time:new Date().toLocaleTimeString(),msg:(ev.table||'')+' '+(ev.percent!=null?ev.percent+'%':ev.phase||ev.message||'')}]);}catch{}}}}}catch(streamErr){setMsg('✗ Stream error: '+(streamErr?.message||'connection lost'));}setDbMigrating(false);loadDbStatus();}catch(e){setDbMigrating(false);setMsg('✗ Migration failed: '+e.message);}};
|
|
258
258
|
const cancelMigration=async()=>{await api('/database/migrate/cancel',{method:'POST'});setDbMigrating(false);setMsg('Migration cancelled');};
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* E2E API Tests — Admin Portal
|
|
3
|
-
* Tests real HTTP requests against
|
|
4
|
-
* Server
|
|
3
|
+
* Tests real HTTP requests against the E2E test server (dynamic port).
|
|
4
|
+
* Server is started by global-setup with an isolated temp database.
|
|
5
5
|
*
|
|
6
6
|
* Run: npm run test:e2e-api
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import { describe, it, expect, beforeAll, afterAll } from 'vitest';
|
|
10
|
+
import { BASE_URL, API_URL, E2E_PASSWORD } from './setup/e2e-config.js';
|
|
10
11
|
|
|
11
|
-
const
|
|
12
|
-
const API = `${BASE_URL}/api/admin`;
|
|
12
|
+
const API = API_URL;
|
|
13
13
|
|
|
14
14
|
// Admin credentials — sourced from env (vuln-0001: no hardcoded default).
|
|
15
15
|
// Set ADMIN_INITIAL_PASSWORD to match the running server's admin password.
|
|
@@ -1,18 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* E2E UI Tests - Admin Portal (Playwright)
|
|
3
|
-
* Tests browser interactions against
|
|
4
|
-
* Server MUST be running before executing these tests.
|
|
3
|
+
* Tests browser interactions against E2E test server (dynamic port).
|
|
5
4
|
*
|
|
6
5
|
* Run: npm run test:e2e-ui (or: npx playwright test)
|
|
7
6
|
*/
|
|
8
7
|
|
|
9
8
|
import { test, expect, type Page } from '@playwright/test';
|
|
9
|
+
import { BASE_URL, ADMIN_URL, E2E_PASSWORD } from './setup/e2e-config.js';
|
|
10
10
|
|
|
11
|
-
const BASE_URL = 'http://localhost:48721';
|
|
12
|
-
const ADMIN_URL = `${BASE_URL}/admin`;
|
|
13
11
|
// Admin credentials — sourced from env (vuln-0001: no hardcoded default).
|
|
14
12
|
const ADMIN_USERNAME = 'admin';
|
|
15
|
-
const ADMIN_PASSWORD = process.env.ADMIN_INITIAL_PASSWORD ||
|
|
13
|
+
const ADMIN_PASSWORD = process.env.ADMIN_INITIAL_PASSWORD || E2E_PASSWORD;
|
|
16
14
|
|
|
17
15
|
// Helper: login and store token
|
|
18
16
|
async function login(page: Page): Promise<void> {
|
package/tests/e2e/check-lod.mjs
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { chromium } from 'playwright';
|
|
2
|
+
const BASE_URL = `http://localhost:${process.env.E2E_PORT || 48721}`;
|
|
2
3
|
|
|
3
4
|
const browser = await chromium.launch();
|
|
4
5
|
const page = await browser.newPage();
|
|
@@ -6,7 +7,7 @@ page.on('console', msg => { if(msg.text().includes('[LOD]')) console.log('CONSOL
|
|
|
6
7
|
page.on('pageerror', err => console.log('PAGE ERROR:', err.message));
|
|
7
8
|
|
|
8
9
|
// Login
|
|
9
|
-
await page.goto(
|
|
10
|
+
await page.goto(`${BASE_URL}/admin`);
|
|
10
11
|
await page.waitForSelector('.login-box');
|
|
11
12
|
await page.fill('input[placeholder="Username"]', 'admin');
|
|
12
13
|
await page.fill('input[placeholder="Password"]', 'admin');
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { chromium } from 'playwright';
|
|
2
|
+
const BASE_URL = `http://localhost:${process.env.E2E_PORT || 48721}`;
|
|
2
3
|
|
|
3
4
|
const browser = await chromium.launch();
|
|
4
5
|
const page = await browser.newPage();
|
|
5
6
|
page.on('console', msg => { if(msg.text().includes('[LOD]')) console.log('CONSOLE:', msg.text()); });
|
|
6
7
|
|
|
7
|
-
await page.goto(
|
|
8
|
+
await page.goto(`${BASE_URL}/admin`);
|
|
8
9
|
await page.waitForSelector('.login-box');
|
|
9
10
|
await page.fill('input[placeholder="Username"]', 'admin');
|
|
10
11
|
await page.fill('input[placeholder="Password"]', 'admin');
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { chromium } from 'playwright';
|
|
2
|
+
const BASE_URL = `http://localhost:${process.env.E2E_PORT || 48721}`;
|
|
2
3
|
|
|
3
4
|
const browser = await chromium.launch({ headless: false });
|
|
4
5
|
const page = await browser.newPage();
|
|
5
6
|
page.on('console', msg => { if(msg.text().includes('[LOD]')) console.log(msg.text()); });
|
|
6
7
|
|
|
7
|
-
await page.goto(
|
|
8
|
+
await page.goto(`${BASE_URL}/admin`);
|
|
8
9
|
await page.waitForSelector('.login-box');
|
|
9
10
|
await page.fill('input[placeholder="Username"]', 'admin');
|
|
10
11
|
await page.fill('input[placeholder="Password"]', 'admin');
|
package/tests/e2e/debug-lod.mjs
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { chromium } from 'playwright';
|
|
2
|
+
const BASE_URL = `http://localhost:${process.env.E2E_PORT || 48721}`;
|
|
2
3
|
|
|
3
4
|
const browser = await chromium.launch();
|
|
4
5
|
const page = await browser.newPage();
|
|
5
6
|
page.on('console', msg => console.log('CONSOLE:', msg.text()));
|
|
6
7
|
page.on('pageerror', err => console.log('PAGE ERROR:', err.message));
|
|
7
8
|
|
|
8
|
-
await page.goto(
|
|
9
|
+
await page.goto(`${BASE_URL}/admin`);
|
|
9
10
|
await page.waitForSelector('.login-box');
|
|
10
11
|
await page.fill('input[placeholder="Username"]', 'admin');
|
|
11
12
|
await page.fill('input[placeholder="Password"]', 'admin');
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { chromium } from 'playwright';
|
|
2
|
+
const BASE_URL = `http://localhost:${process.env.E2E_PORT || 48721}`;
|
|
2
3
|
|
|
3
4
|
const browser = await chromium.launch({ headless: false });
|
|
4
5
|
const page = await browser.newPage();
|
|
5
6
|
page.on('console', msg => { if(msg.text().includes('[LOD]')) console.log(msg.text()); });
|
|
6
7
|
|
|
7
|
-
await page.goto(
|
|
8
|
+
await page.goto(`${BASE_URL}/admin`);
|
|
8
9
|
await page.waitForSelector('.login-box');
|
|
9
10
|
await page.fill('input[placeholder="Username"]', 'admin');
|
|
10
11
|
await page.fill('input[placeholder="Password"]', 'admin');
|
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* E2E API Tests — MCP Server (KSA-284: Backend MCP Server)
|
|
3
|
-
* Tests real HTTP calls to
|
|
4
|
-
* Server MUST be running before executing these tests.
|
|
3
|
+
* Tests real HTTP calls to the E2E test server (dynamic port).
|
|
5
4
|
*
|
|
6
5
|
* Run: npx vitest run tests/e2e/mcp-api.e2e.test.ts
|
|
7
6
|
*/
|
|
8
7
|
|
|
9
8
|
import { describe, it, expect, beforeAll } from 'vitest';
|
|
10
|
-
|
|
11
|
-
const BASE_URL = 'http://localhost:48721';
|
|
9
|
+
import { BASE_URL } from './setup/e2e-config.js';
|
|
12
10
|
|
|
13
11
|
// ============================================================
|
|
14
12
|
// Setup: Verify server is running
|
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* E2E Multi-Tenant Isolation Tests — KSA-285
|
|
3
3
|
* Tests RBAC permission enforcement, roleData rules, and cross-user isolation.
|
|
4
|
-
* Server MUST be running at http://localhost:48721.
|
|
5
4
|
*
|
|
6
5
|
* Run: npm run test:e2e-api
|
|
7
6
|
*/
|
|
8
7
|
|
|
9
8
|
import { describe, it, expect, beforeAll, afterAll } from 'vitest';
|
|
9
|
+
import { BASE_URL, API_URL } from './setup/e2e-config.js';
|
|
10
10
|
|
|
11
|
-
const
|
|
12
|
-
const API = `${BASE_URL}/api/admin`;
|
|
11
|
+
const API = API_URL;
|
|
13
12
|
|
|
14
13
|
const TEST_ID = Date.now().toString().slice(-6);
|
|
15
14
|
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared E2E test configuration.
|
|
3
|
+
* Port is dynamically assigned by global-setup and written to a temp file.
|
|
4
|
+
* All test files MUST import from here — never hardcode port.
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from 'fs';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
import * as os from 'os';
|
|
9
|
+
|
|
10
|
+
const PORT_FILE = path.join(os.tmpdir(), 'sa4e-e2e-port.txt');
|
|
11
|
+
|
|
12
|
+
function readPort(): number {
|
|
13
|
+
try {
|
|
14
|
+
return parseInt(fs.readFileSync(PORT_FILE, 'utf-8').trim(), 10);
|
|
15
|
+
} catch {
|
|
16
|
+
// Fallback: if running against a manually started server
|
|
17
|
+
return parseInt(process.env.E2E_PORT || '48721', 10);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export const E2E_PORT = readPort();
|
|
22
|
+
export const BASE_URL = `http://localhost:${E2E_PORT}`;
|
|
23
|
+
export const ADMIN_URL = `${BASE_URL}/admin`;
|
|
24
|
+
export const API_URL = `${BASE_URL}/api/admin`;
|
|
25
|
+
export const E2E_PASSWORD = 'test-admin-pw-01';
|
|
26
|
+
export const PORT_FILE_PATH = PORT_FILE;
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* E2E Global Setup — starts a real server with ISOLATED temp database.
|
|
3
|
+
*
|
|
4
|
+
* CRITICAL: Production .code-intel/ is NEVER touched.
|
|
5
|
+
* All data lives in a fresh temp directory that's cleaned up after tests.
|
|
6
|
+
* Port is dynamically assigned (finds a free port) to avoid conflicts.
|
|
7
|
+
*/
|
|
8
|
+
import { spawn, type ChildProcess } from 'child_process';
|
|
9
|
+
import * as net from 'net';
|
|
10
|
+
import * as os from 'os';
|
|
11
|
+
import * as path from 'path';
|
|
12
|
+
import * as fs from 'fs';
|
|
13
|
+
import { PORT_FILE_PATH } from './e2e-config.js';
|
|
14
|
+
|
|
15
|
+
const E2E_PASSWORD = 'test-admin-pw-01';
|
|
16
|
+
const STARTUP_TIMEOUT_MS = 30_000;
|
|
17
|
+
const HEALTH_POLL_INTERVAL_MS = 500;
|
|
18
|
+
|
|
19
|
+
let serverProcess: ChildProcess | null = null;
|
|
20
|
+
let tempDataDir: string | null = null;
|
|
21
|
+
let assignedPort: number = 0;
|
|
22
|
+
|
|
23
|
+
async function findFreePort(): Promise<number> {
|
|
24
|
+
return new Promise((resolve, reject) => {
|
|
25
|
+
const srv = net.createServer();
|
|
26
|
+
srv.listen(0, '127.0.0.1', () => {
|
|
27
|
+
const addr = srv.address() as net.AddressInfo;
|
|
28
|
+
const port = addr.port;
|
|
29
|
+
srv.close(() => resolve(port));
|
|
30
|
+
});
|
|
31
|
+
srv.on('error', reject);
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export async function setup(): Promise<void> {
|
|
36
|
+
// 1. Create isolated temp directory for all DB files
|
|
37
|
+
tempDataDir = fs.mkdtempSync(path.join(os.tmpdir(), 'sa4e-e2e-'));
|
|
38
|
+
console.log(`[E2E Setup] Temp data dir: ${tempDataDir}`);
|
|
39
|
+
|
|
40
|
+
// 2. Find a free port
|
|
41
|
+
assignedPort = await findFreePort();
|
|
42
|
+
console.log(`[E2E Setup] Using free port: ${assignedPort}`);
|
|
43
|
+
|
|
44
|
+
// 3. Write port to temp file so test files can read it
|
|
45
|
+
fs.writeFileSync(PORT_FILE_PATH, String(assignedPort), 'utf-8');
|
|
46
|
+
|
|
47
|
+
// 4. Start server with isolated environment
|
|
48
|
+
const serverEntry = path.resolve(__dirname, '../../../src/index.ts');
|
|
49
|
+
serverProcess = spawn('npx', ['tsx', serverEntry], {
|
|
50
|
+
cwd: path.resolve(__dirname, '../../..'),
|
|
51
|
+
env: {
|
|
52
|
+
...process.env,
|
|
53
|
+
CODE_INTEL_DATA_DIR: tempDataDir,
|
|
54
|
+
CODE_INTEL_WORKSPACE: tempDataDir,
|
|
55
|
+
CODE_INTEL_PORT: String(assignedPort),
|
|
56
|
+
ADMIN_INITIAL_PASSWORD: E2E_PASSWORD,
|
|
57
|
+
NODE_ENV: 'test',
|
|
58
|
+
LOG_LEVEL: 'warn',
|
|
59
|
+
},
|
|
60
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
61
|
+
shell: true,
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
serverProcess.stdout?.on('data', (d) => {
|
|
65
|
+
const line = d.toString();
|
|
66
|
+
if (line.includes('"level":50') || line.includes('"level":40')) {
|
|
67
|
+
process.stderr.write(`[E2E Server] ${line}`);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
serverProcess.stderr?.on('data', (d) => {
|
|
72
|
+
process.stderr.write(`[E2E Server ERR] ${d.toString()}`);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
// 5. Wait for server to become healthy
|
|
76
|
+
await waitForHealth();
|
|
77
|
+
console.log(`[E2E Setup] Server ready on port ${assignedPort}`);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export async function teardown(): Promise<void> {
|
|
81
|
+
// 1. Kill server process
|
|
82
|
+
if (serverProcess) {
|
|
83
|
+
serverProcess.kill('SIGTERM');
|
|
84
|
+
await new Promise<void>((resolve) => {
|
|
85
|
+
const timeout = setTimeout(() => {
|
|
86
|
+
serverProcess?.kill('SIGKILL');
|
|
87
|
+
resolve();
|
|
88
|
+
}, 5000);
|
|
89
|
+
serverProcess?.on('exit', () => { clearTimeout(timeout); resolve(); });
|
|
90
|
+
});
|
|
91
|
+
serverProcess = null;
|
|
92
|
+
console.log('[E2E Teardown] Server stopped');
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// 2. Clean up port file
|
|
96
|
+
try { fs.unlinkSync(PORT_FILE_PATH); } catch { /* ignore */ }
|
|
97
|
+
|
|
98
|
+
// 3. Clean up temp directory (retry on Windows EBUSY)
|
|
99
|
+
if (tempDataDir && fs.existsSync(tempDataDir)) {
|
|
100
|
+
await sleep(1000); // Wait for DB file handles to release on Windows
|
|
101
|
+
try {
|
|
102
|
+
fs.rmSync(tempDataDir, { recursive: true, force: true });
|
|
103
|
+
console.log(`[E2E Teardown] Cleaned temp dir: ${tempDataDir}`);
|
|
104
|
+
} catch (err: any) {
|
|
105
|
+
console.warn(`[E2E Teardown] Could not clean temp dir (EBUSY on Windows is OK): ${err.message}`);
|
|
106
|
+
}
|
|
107
|
+
tempDataDir = null;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
async function waitForHealth(): Promise<void> {
|
|
112
|
+
const start = Date.now();
|
|
113
|
+
while (Date.now() - start < STARTUP_TIMEOUT_MS) {
|
|
114
|
+
try {
|
|
115
|
+
const res = await fetch(`http://localhost:${assignedPort}/health`, {
|
|
116
|
+
signal: AbortSignal.timeout(2000),
|
|
117
|
+
});
|
|
118
|
+
if (res.ok) return;
|
|
119
|
+
} catch {
|
|
120
|
+
// Server not ready yet
|
|
121
|
+
}
|
|
122
|
+
await sleep(HEALTH_POLL_INTERVAL_MS);
|
|
123
|
+
}
|
|
124
|
+
throw new Error(
|
|
125
|
+
`[E2E Setup] Server did not become healthy within ${STARTUP_TIMEOUT_MS}ms`,
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function sleep(ms: number): Promise<void> {
|
|
130
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
131
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { chromium } from 'playwright';
|
|
2
|
+
const BASE_URL = `http://localhost:${process.env.E2E_PORT || 48721}`;
|
|
2
3
|
|
|
3
4
|
const browser = await chromium.launch();
|
|
4
5
|
const page = await browser.newPage();
|
|
@@ -6,7 +7,7 @@ const logs = [];
|
|
|
6
7
|
page.on('console', msg => logs.push(msg.text()));
|
|
7
8
|
page.on('pageerror', err => logs.push('ERROR: ' + err.message));
|
|
8
9
|
|
|
9
|
-
await page.goto(
|
|
10
|
+
await page.goto(`${BASE_URL}/admin`);
|
|
10
11
|
await page.waitForSelector('.login-box');
|
|
11
12
|
await page.fill('input[placeholder="Username"]', 'admin');
|
|
12
13
|
await page.fill('input[placeholder="Password"]', 'admin');
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { chromium } from 'playwright';
|
|
2
|
+
const BASE_URL = `http://localhost:${process.env.E2E_PORT || 48721}`;
|
|
2
3
|
|
|
3
4
|
const browser = await chromium.launch({ headless: false, slowMo: 100 });
|
|
4
5
|
const page = await browser.newPage();
|
|
5
6
|
page.on('console', msg => { if(msg.text().includes('[LOD]') || msg.text().includes('Error')) console.log('>', msg.text()); });
|
|
6
7
|
page.on('pageerror', err => console.log('PAGE ERROR:', err.message));
|
|
7
8
|
|
|
8
|
-
await page.goto(
|
|
9
|
+
await page.goto(`${BASE_URL}/admin`);
|
|
9
10
|
await page.waitForSelector('.login-box');
|
|
10
11
|
await page.fill('input[placeholder="Username"]', 'admin');
|
|
11
12
|
await page.fill('input[placeholder="Password"]', 'admin');
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* E2E Tests — Tool Forwarding (KSA-293: Extension Thin Client)
|
|
3
3
|
* Verifies all 52 expected tools are registered, callable, and return valid responses.
|
|
4
|
-
* Server MUST be running before executing these tests.
|
|
5
4
|
*
|
|
6
5
|
* Run: npx vitest run tests/e2e/tool-forwarding.e2e.test.ts
|
|
7
6
|
*/
|
|
8
7
|
|
|
9
8
|
import { describe, it, expect, beforeAll } from 'vitest';
|
|
9
|
+
import { BASE_URL } from './setup/e2e-config.js';
|
|
10
10
|
|
|
11
|
-
const BASE_URL = process.env.CODE_INTEL_TEST_URL || 'http://127.0.0.1:48721';
|
|
12
11
|
const TEST_TIMEOUT = 30000; // 30s per test for heavy DB queries
|
|
13
12
|
|
|
14
13
|
const EXPECTED_TOOLS = [
|