2026-10-13 18:24:44 +02:00
'use strict' ;
const { app , BrowserWindow , session } = require ( 'electron' ), assert = require ( 'node:assert/strict' ), fs = require ( 'node:fs' ); app . disableHardwareAcceleration (); app . enableSandbox (); app . setPath ( 'userData' , process . env . SAFETYNET_ADMIN_SMOKE_PROFILE ); let window ; const deadline = setTimeout (()=> app . exit ( 1 ), 55000 ); const evaluate = s => window . webContents . executeJavaScript ( s , true );
async function waitFor ( s ){ for ( let n = 0 ; n < 200 ; n ++ ){ if ( await evaluate ( s )) return ; await new Promise ( r => setTimeout ( r , 60 ));} throw Error ( 'UI state timeout: ' + s + ' | ' + await evaluate ( `document.getElementById('status').textContent` ));}
async function identity ( value ){ await session . defaultSession . cookies . set ({ url : process . env . SAFETYNET_ADMIN_SMOKE_URL , name : 'sn_session' , value , httpOnly : true , sameSite : 'strict' }); await window . loadURL ( process . env . SAFETYNET_ADMIN_SMOKE_URL ); await waitFor ( `!document.getElementById('workspace').hidden&&document.getElementById('reviews-status').textContent.includes('loaded')` );}
async function selectReview (){ await evaluate ( `document.querySelector('#reviews-rows button').click()` ); await waitFor ( `!document.getElementById('independent-review-detail').hidden` );}
async function approve ( version ){ assert . equal ( await evaluate ( `document.getElementById('independent-review-approve').disabled` ), true ); await evaluate ( `document.getElementById('independent-review-confirm').checked=true;document.getElementById('independent-review-confirm').dispatchEvent(new Event('change'));document.getElementById('independent-review-approve').click()` ); await waitFor ( `document.getElementById('policy-version').textContent==='v ${ version } '` );}
async function capture ( file , section ){ await evaluate ( `document.getElementById(' ${ section } ').scrollIntoView();document.getElementById('console-theme').value='dark';document.getElementById('console-theme').dispatchEvent(new Event('change'))` ); await new Promise ( r => setTimeout ( r , 250 )); fs . mkdirSync ( 'artifacts' ,{ recursive : true }); fs . writeFileSync ( file ,( await window . webContents . capturePage ()). toPNG ());}
app . whenReady (). then ( async ()=>{
window = new BrowserWindow ({ show : false , width : 1500 , height : 1100 , webPreferences : { nodeIntegration : false , contextIsolation : true , sandbox : true , offscreen : true , backgroundThrottling : false }});
2026-10-13 18:48:40 +02:00
const proofTraceIds = [], requestsById = new Map (); session . defaultSession . webRequest . onCompleted ({ urls : [ process . env . SAFETYNET_ADMIN_SMOKE_URL + '/api/*' ]}, details =>{ const row = requestsById . get ( details . id ); if ( row ){ row . outcome = 'completed' ; row . statusCode = details . statusCode ;}}); session . defaultSession . webRequest . onErrorOccurred ({ urls : [ process . env . SAFETYNET_ADMIN_SMOKE_URL + '/api/*' ]}, details =>{ const row = requestsById . get ( details . id ); if ( row ) row . outcome = 'failed' ;}); session . defaultSession . webRequest . onBeforeSendHeaders ({ urls : [ process . env . SAFETYNET_ADMIN_SMOKE_URL + '/api/*' ]},( details , callback )=>{ const crypto = require ( 'node:crypto' ), traceId = crypto . randomBytes ( 16 ). toString ( 'hex' ), spanId = crypto . randomBytes ( 8 ). toString ( 'hex' ); const path = new URL ( details . url ). pathname , route = path === '/api/admin/policy' ? '/api/admin/policy' : path === '/api/admin/policy/restore' ? '/api/admin/policy/restore' : /^\/api\/admin\/policy-reviews\/[^/]+\/approve$/ . test ( path ) ? '/api/admin/policy-reviews/:id/approve' : /^\/api\/admin\/policy-history\/[^/]+\/restore$/ . test ( path ) ? '/api/admin/policy-history/:id/restore' : 'other-api' ; const row = { traceId , parentSpanId : spanId , outcome : 'pending' , method : details . method , route }; proofTraceIds . push ( row ); requestsById . set ( details . id , row ); callback ({ requestHeaders : {... details . requestHeaders , traceparent : '00-' + traceId + '-' + spanId + '-01' }});});
await identity ( 'grant-author' ); assert . equal ( await evaluate ( 'typeof require' ), 'undefined' ); for ( const scope of [ 'history:list' , 'history:go' , 'window:state' , 'window:control' ]) assert . deepEqual ( await evaluate ( `(()=>{const field=document.getElementById('agent-scope- ${ scope } ');return {present:!!field,checked:field.checked,disabled:field.disabled};})()` ),{ present : true , checked : false , disabled : false }); await evaluate ( `document.getElementById('agent-enabled').checked=true;document.getElementById('agent-scope-sessions').checked=true;document.getElementById('agent-scope-read').checked=true;document.getElementById('agent-hosts').value='*.company.example';document.getElementById('agent-identity-mode').value='individual';document.getElementById('agent-identity-mode').dispatchEvent(new Event('change'));document.getElementById('agent-grant-add').click();` );
assert . equal ( await evaluate ( `Array.from(document.querySelectorAll('#agent-grants-editor .checks input')).every(x=>!x.checked)` ), true );
2026-10-13 18:24:44 +02:00
await evaluate ( `const box=document.querySelector('#agent-grants-editor>fieldset'),fields=box.querySelectorAll('.grid input,.grid textarea');fields[0].value='research-agent';fields[0].dispatchEvent(new Event('input'));fields[1].value='Research Agent';fields[1].dispatchEvent(new Event('input'));fields[2].checked=true;fields[2].dispatchEvent(new Event('change'));fields[3].value='2099-12-31T23:59:59Z';fields[3].dispatchEvent(new Event('input'));fields[4].value='*.company.example';fields[4].dispatchEvent(new Event('input'));for(const label of box.querySelectorAll('.checks label'))if(['sessions','read'].includes(label.textContent)){const input=label.querySelector('input');input.checked=true;input.dispatchEvent(new Event('change'));}document.getElementById('publish').click()` ); await waitFor ( `document.getElementById('status').textContent.includes('prepared for independent approval')` ); assert . equal ( await evaluate ( `document.getElementById('policy-version').textContent` ), 'v1' ); await selectReview (); assert . equal ( await evaluate ( `document.getElementById('independent-review-approve').disabled` ), true );
assert . equal ( await evaluate ( `fetch('/api/admin/policy-reviews/'+selectedIndependentReview.id+'/approve',{method:'POST',headers:{'content-type':'application/json'},body:JSON.stringify({payloadHash:selectedIndependentReview.payloadHash,expectedVersion:selectedIndependentReview.expectedVersion,approve:true})}).then(r=>r.status)` ), 403 );
await identity ( 'grant-reviewer' ); await selectReview (); const diff = await evaluate ( `document.getElementById('independent-review-diff').textContent` ); for ( const text of [ '/agents/grants' , 'research-agent' , '2099' , 'company.example' , 'sessions' , 'read' , 'generation' ]) assert . ok ( diff . includes ( text ), text ); await capture ( 'artifacts/agent-grants-review-admin.png' , 'independent-review-detail' ); await approve ( 2 );
await identity ( 'grant-auditor' ); assert . equal ( await evaluate ( `document.getElementById('agent-grant-add').disabled&&document.getElementById('agent-identity-mode').disabled` ), true ); assert . equal ( await evaluate ( `Array.from(document.querySelectorAll('#agent-grants-editor input, #agent-grants-editor textarea, #agent-grants-editor button')).every(x=>x.disabled)` ), true );
await identity ( 'grant-author' ); assert . equal ( await evaluate ( `document.querySelector('#agent-grants-editor .grid input').readOnly` ), true ); await evaluate ( `Array.from(document.querySelectorAll('#agent-grants-editor button')).find(x=>x.textContent==='Invalidate previous credentials').click();document.getElementById('publish').click()` ); await waitFor ( `document.getElementById('status').textContent.includes('prepared for independent approval')` ); assert . equal ( await evaluate ( `document.getElementById('policy-version').textContent` ), 'v2' ); await identity ( 'grant-reviewer' ); await selectReview (); assert . ok (( await evaluate ( `document.getElementById('independent-review-diff').textContent` )). includes ( '"generation":2' )); await approve ( 3 );
await identity ( 'grant-author' ); await evaluate ( `document.getElementById('brand-name').value='Unpublished preserved draft';document.getElementById('history-load').click()` ); await waitFor ( `document.querySelectorAll('#history-rows tr').length===3` ); await evaluate ( `document.querySelectorAll('#history-rows button')[1].click()` ); await waitFor ( `!document.getElementById('history-review').hidden` ); assert . equal ( await evaluate ( `document.getElementById('brand-name').value` ), 'Unpublished preserved draft' ); assert . equal ( await evaluate ( `document.getElementById('policy-version').textContent` ), 'v3' ); assert . equal ( await evaluate ( `document.getElementById('history-restore').disabled` ), true ); const history = await evaluate ( `document.getElementById('history-diff-list').textContent` ); assert . ok ( history . includes ( '/agents/grants' )); assert . ok ( history . includes ( 'generation' )); assert . ok (( await evaluate ( `document.getElementById('history-review-summary').textContent` )). includes ( 'does not restore invalidated credentials' )); await capture ( 'artifacts/agent-grants-history-admin.png' , 'history-review' ); await evaluate ( `document.getElementById('history-approve').checked=true;document.getElementById('history-approve').dispatchEvent(new Event('change'));document.getElementById('history-restore').click()` ); await waitFor ( `document.getElementById('status').textContent.includes('prepared for independent approval')` ); assert . equal ( await evaluate ( `document.getElementById('policy-version').textContent` ), 'v3' ); await selectReview (); assert . equal ( await evaluate ( `document.getElementById('independent-review-approve').disabled` ), true ); await identity ( 'grant-reviewer' ); await selectReview (); assert . ok (( await evaluate ( `document.getElementById('independent-review-diff').textContent` )). includes ( 'research-agent' )); await approve ( 4 );
2026-10-13 18:48:40 +02:00
for ( let n = 0 ; n < 100 && proofTraceIds . some ( row => row . outcome === 'pending' ); n ++ ) await new Promise ( r => setTimeout ( r , 50 )); assert . equal ( proofTraceIds . some ( row => row . outcome === 'pending' ), false , 'API requests must settle before telemetry shutdown' );
2026-10-13 18:24:44 +02:00
fs . writeFileSync ( 'artifacts/agent-grants-admin-request-trace-ids.json' , JSON . stringify ( proofTraceIds )); console . log ( 'GRANT_ADMIN_OK' ); clearTimeout ( deadline ); window . destroy (); app . exit ( 0 );
}). catch ( error =>{ console . error ( 'GRANT_ADMIN_FAILED' , error . message ); clearTimeout ( deadline ); window ? . destroy (); app . exit ( 1 );});