Files
ycode/scripts/session-factory-alignment-regression.ts
T

30 lines
2.1 KiB
TypeScript

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})}