feat: align conversation state, composer and scoped approvals

This commit is contained in:
dot committed 2026-10-21 03:46:53 +09:00
1 parent 771ca540f7
commit 308b98df23
61 files changed
+1701 -292

No files matched your search

@@ -0,0 +1,29 @@
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})}