import test from 'node:test'; import assert from 'node:assert/strict'; import { EventEmitter } from 'node:events'; import { mkdtempSync } from 'node:fs'; import { tmpdir } from 'node:os'; import { join } from 'node:path'; import { startVerifiedProxy } from '../src/runner.mjs'; function fixture(){const root=mkdtempSync(join(tmpdir(),'p1-runner-'));return {root,config:{proxy:{port:18432,binary:join(root,'pin/cli-proxy-api')},dataRoot:join(root,'data')},install:{binary:join(root,'pin/cli-proxy-api'),panel:join(root,'pin/static/management.html')}};} test('runner verifies before spawning and supplies pinned panel and local model without ambient secrets',()=>{const {root,config,install}=fixture();const calls=[],child=new EventEmitter();startVerifiedProxy(config,{env:{HOME:join(root,'home'),MANAGEMENT_PASSWORD:'p1-management',OPENAI_API_KEY:'p1-upstream'},verify:dir=>{calls.push(['verify',dir]);return install;},spawnImpl:(...args)=>{calls.push(['spawn',...args]);return child;}});assert.equal(calls[0][0],'verify');assert.deepEqual(calls[1],['spawn',install.binary,['-config',join(config.dataRoot,'proxy/config.yaml'),'-local-model'],{cwd:join(config.dataRoot,'proxy'),stdio:'inherit',env:{HOME:join(root,'home'),PATH:'/usr/bin:/bin',MANAGEMENT_STATIC_PATH:join(root,'pin/static')}}]);}); test('proxy-start-failed: sync and async spawn failures report code only',()=>{const {config,install}=fixture();assert.throws(()=>startVerifiedProxy(config,{verify:()=>install,spawnImpl:()=>{throw Error('p1-management');}}),e=>e.code==='proxy-start-failed');const child=new EventEmitter(),codes=[];startVerifiedProxy(config,{verify:()=>install,spawnImpl:()=>child,onError:c=>codes.push(c)});child.emit('error',Error('p1-management'));assert.deepEqual(codes,['proxy-start-failed']);}); test('hash refusal prevents spawn and ordinary exit status is propagated',()=>{const {config,install}=fixture();let spawned=false;assert.throws(()=>startVerifiedProxy(config,{verify:()=>{throw Object.assign(Error('proxy-install-invalid'),{code:'proxy-install-invalid'});},spawnImpl:()=>{spawned=true;}}),e=>e.code==='proxy-install-invalid');assert.equal(spawned,false);const child=new EventEmitter(),exits=[];startVerifiedProxy(config,{verify:()=>install,spawnImpl:()=>child,onExit:c=>exits.push(c)});child.emit('exit',7,null);assert.deepEqual(exits,[7]);});