import * as FS from 'node:fs';
import * as CP from 'node:child_process';
import * as Effect from 'effect/Effect';
import * as Layer from 'effect/Layer';
import * as NodeServices from '@effect/platform-node/NodeServices';
import * as NodeCrypto from '@effect/platform-node/NodeCrypto';
import { ProviderEventLoggers } from '@t3tools/provider-core/server/ProviderEventLoggers';
import { AgentScope } from '@t3tools/shared/AgentScope';
import * as PortScanner from './src/preview/PortScanner.ts';
import { ClaudeAgentSdkQueryRunner, layerQueryRunner } from './src/orchestration-v2/Adapters/ClaudeAdapterV2.ts';
const dir = process.argv[2];
const delay = (n) => new Promise(r => setTimeout(r,n));
const log = (s) => console.log(s);
const cli = dir + '/stand-in-cli';
FS.writeFileSync(cli, `#!/usr/bin/env node\nconst cp=require('node:child_process');const fs=require('node:fs');const child=cp.spawn('/bin/sleep',['600'],{detached:true,stdio:'ignore'});fs.writeFileSync(__dirname+'/pids.json',JSON.stringify({cli:process.pid,job:child.pid}));child.unref();setTimeout(()=>process.exit(0),1500);\n`,{mode:0o755});
const inspect = (pids) => {
 const out=CP.spawnSync('ps',['-o','pid=,ppid=,pgid=,stat=,comm=','-p',`${pids.cli},${pids.job}`],{encoding:'utf8'}).stdout.trim();
 log('PID     PPID    PGID    STATE COMMAND'); log(out || '(no matching processes)');
};
const layer=layerQueryRunner.pipe(Layer.provide(PortScanner.layerTest),Layer.provide(Layer.succeed(AgentScope,AgentScope.defaultValue())),Layer.provide(Layer.succeed(ProviderEventLoggers,{native:undefined,canonical:undefined})),Layer.provide(Layer.mergeAll(NodeServices.layer,NodeCrypto.layer)));
await Effect.runPromise(Effect.scoped(Effect.gen(function*(){
 log('Claude process lifecycle: '+process.argv[3]);
 log('Environment: Linux; default no-op AgentScope (macOS lifecycle path)');
 log('Real query runner + SDK; synthetic CLI; no credentials or model calls');
 const runner=yield* ClaudeAgentSdkQueryRunner;
 const session=yield* runner.open({threadId:'proof-thread',providerSessionId:'proof-session',options:{sessionId:'proof-native-session',tools:[],permissionMode:'default',pathToClaudeCodeExecutable:cli}});
 yield* Effect.promise(()=>delay(500));
 const pids=JSON.parse(FS.readFileSync(dir+'/pids.json','utf8'));
 log('\nT+0.5s: CLI running; sleep is in a separate process group'); inspect(pids);
 yield* Effect.promise(()=>delay(4000));
 log('\nT+4.5s: CLI exited naturally 3 seconds ago'); inspect(pids);
 const row=CP.spawnSync('ps',['-o','stat=','-p',String(pids.job)],{encoding:'utf8'}).stdout.trim();
 log(row && !row.startsWith('Z') ? 'OBSERVED: escaped sleep STILL RUNNING (bug)' : 'OBSERVED: escaped sleep STOPPED');
 log('\nClose the session');yield* session.close;
 yield* Effect.promise(()=>delay(500));inspect(pids);
 try{process.kill(pids.job,'SIGKILL');}catch{}
 log('Cleanup complete');
})).pipe(Effect.provide(layer)));
