30 lines
2.1 KiB
TypeScript
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})}
|