import * as NodeWS from '@effect/platform-node/NodeWS';
import * as NodeServices from '@effect/platform-node/NodeServices';
import { WsRpcGroup, ORCHESTRATION_PROTOCOL_VERSION, ORCHESTRATION_PROTOCOL_HEADER } from '@t3tools/contracts';
import * as Effect from 'effect/Effect';
import * as Layer from 'effect/Layer';
import * as DateTime from 'effect/DateTime';
import { RpcClient, RpcSerialization } from 'effect/rpc';
import { Socket } from 'effect/socket';
import fs from 'node:fs';
import {execFileSync} from 'node:child_process';
const [side,wt,port] = process.argv.slice(2);
const dir=import.meta.dirname+'/'+side;
const token=execFileSync('node',['apps/server/src/bin.ts','auth','session','issue','--base-dir',dir,'--token-only'],{cwd:wt,encoding:'utf8'}).trim().split('\n').at(-1)!;
const origin='http://127.0.0.1:'+port;
const headers={'Authorization':'Bearer '+token,'Content-Type':'application/json',[ORCHESTRATION_PROTOCOL_HEADER]:String(ORCHESTRATION_PROTOCOL_VERSION)};
async function http(path:string,body?:object){const r=await fetch(origin+path,{headers,method:body?'POST':'GET',body:body?JSON.stringify(body):undefined});if(!r.ok)throw new Error(await r.text());return r.json();}
const id=()=>crypto.randomUUID();
const projectId=id(); const threadId=id();
function log(s:string){ console.log(new Date().toISOString()+' '+s); }
await http('/api/projects/mutate',{type:'project.create',commandId:id(),projectId,title:'Merged PR sweep proof',workspaceRoot:dir+'/workspace'});
const ticket=await http('/api/auth/websocket-ticket',{});
await Effect.runPromise(Effect.scoped(Effect.gen(function*(){
 const protocol=yield* Layer.build(RpcClient.layerProtocolSocket().pipe(Layer.provide(Socket.layerWebSocket(origin.replace('http','ws')+'/ws?orchestrationProtocol='+ORCHESTRATION_PROTOCOL_VERSION+'&wsTicket='+encodeURIComponent(ticket.ticket))),Layer.provide(RpcSerialization.layerJson),Layer.provide(NodeWS.layerWebSocketConstructor)));
 const client=yield* RpcClient.make(WsRpcGroup).pipe(Effect.provideContext(protocol));
 yield* client['orchestration.dispatchCommand']({type:'thread.create',commandId:id(),threadId,projectId,title:'Unsettled merged feature branch',createdBy:'user',creationSource:'web',modelSelection:{instanceId:'codex',model:'unused'},runtimeMode:'full-access',interactionMode:'default',branch:'factory/issue-35600',worktreePath:null});
 log('Created feature-branch thread via real RPC; merge and inactivity settlement disabled.');
 for(let tick=0;tick<=200;tick+=10){
  yield* client['server.reportClientActivity']({clientId:'proof-client',clientKind:'web',visible:true,focused:true,recentlyInteracted:true,scopes:[],observedAt:DateTime.nowUnsafe(),ttlMs:45000});
  if(tick%30===0){ const shell=yield* Effect.promise(()=>http('/api/orchestration/shell')); const t=shell.threads?.find((x:any)=>x.id===threadId); log(JSON.stringify({elapsedSeconds:tick,branch:t?.branch,savedPR:t?.branchPullRequest,settledAt:t?.settledAt,settledOverride:t?.settledOverride}));fs.writeFileSync(dir+'/state.json',JSON.stringify(t,null,2)); }
  const lines=fs.existsSync(dir+'/git.jsonl')?fs.readFileSync(dir+'/git.jsonl','utf8').trim().split('\n').filter(Boolean):[];
  log('Git processes observed in isolated feature repository: '+lines.length);
  yield* Effect.sleep('10 seconds');
 }
})).pipe(Effect.provide(NodeServices.layer)));
