import assert from 'node:assert/strict' import { build } from 'esbuild' import { mkdtemp, rm } from 'node:fs/promises' import { tmpdir } from 'node:os' import { join } from 'node:path' import { pathToFileURL } from 'node:url' const temp = await mkdtemp(join(tmpdir(), 'ycode-factory-alignment-')) try { const outfile = join(temp, 'factory.mjs') await build({entryPoints:['src/main/session-factory.ts'],outfile,bundle:true,platform:'node',format:'esm',logLevel:'silent',plugins:[{ name:'isolated-factory-ports',setup(b){ b.onResolve({filter:/^\.\/(sessions|models|workspaces)$/},args=>({path:args.path,namespace:'fixture'})) b.onLoad({filter:/.*/,namespace:'fixture'},args=>({loader:'js',contents:args.path==='./sessions' ? 'export const createSession=async(title,context)=>({id:"fixture-session",title,...context});' :args.path==='./models' ? 'export const listModels=async()=>({selectedModelId:"configured-model"}); export const resolveModel=async(id)=>({id});' :'export const listWorkspaces=async()=>({selectedWorkspaceId:"workspace"});export const workspaceRoot=async()=>"/fixture";'})) } }]}) const { createManagedSession } = await import(pathToFileURL(outfile).href) const projects={get:async()=>undefined} const session=await createManagedSession(projects,'first',{permissionMode:'full-access',agentMode:'craft'}) assert.equal(session.permissionMode,'full-access','first session retains explicit full access before any turn') assert.equal(session.modelId,'configured-model') const plan=await createManagedSession(projects,'plan',{permissionMode:'full-access',agentMode:'plan'}) assert.equal(plan.permissionMode,'full-access','saved preference is not overwritten by effective plan restrictions') assert.equal(plan.agentMode,'plan') await assert.rejects(()=>createManagedSession(projects,'bad',{permissionMode:'unexpected'}),/权限模式无效/) console.log('PASS session factory: first-send preference, mode preservation, invalid permission rejection (isolated ports)') } finally {await rm(temp,{recursive:true,force:true})}