Files
ycode/docs/协作/evidence/B03-01/policy-repro.mjs
T

27 lines
2.9 KiB
JavaScript

import { build } from 'esbuild'
import fs from 'node:fs'
import { spawnSync } from 'node:child_process'
const source=String.raw`
import { ClaudeKernel } from './src/main/agent/claude/claude-kernel'
import { mkdtempSync } from 'node:fs'
import { tmpdir } from 'node:os'
import { join } from 'node:path'
process.env.CLAUDE_TEST_USER_DATA=mkdtempSync(join(tmpdir(),'ycode-full-access-policy-'))
const results=[]
for(const [name,extra] of [
['ordinary',{}],['classifier-false',{classifierApprovable:false}],
['compound-decision',{decisionReasonType:'subcommandResults'}],
['reason-code-present',{decisionReasonCode:'fixture-unspecified-code'}],
['explicit-ask-rule',{matchedAskRule:{source:'fixture',toolName:'Bash',ruleContent:'echo sample'}}]
] as const){
const kernel:any=new ClaudeKernel({sessionId:'fixture',workspaceRoot:process.env.CLAUDE_TEST_USER_DATA!,model:{} as any,permissionMode:'full-access',agentMode:'craft',onSessionId:()=>{}})
const controller=new AbortController();let approvals=0;let details:any
kernel.active={settled:false,request:{runId:'fixture',signal:controller.signal,emit:()=>{},interactions:{approval:async(...args:any[])=>{approvals++;details=args[5];return {kind:'approval',optionId:'allow-once'}}}}}
const result=await kernel.canUseTool('Bash',{command:'echo sample'},{signal:controller.signal,toolUseID:'fixture-tool',description:'Fixture command',...extra})
results.push({case:name,permissionMode:'full-access',agentMode:'craft',approvalCount:approvals,result:result.behavior,requestKind:details?.requestKind})
}
console.log(JSON.stringify({scope:'Offline current host policy with synthetic callback metadata; no SDK query/CLI, no real command execution. Not the raw callback metadata from the user session.',results},null,2))
`
await build({stdin:{contents:source,loader:'ts',resolveDir:process.cwd(),sourcefile:'full-access-review.ts'},outfile:'.tmp/full-access-review/policy.mjs',bundle:true,platform:'node',format:'esm',banner:{js:"import { createRequire } from 'node:module'; const require=createRequire(import.meta.url);"},logLevel:'warning',plugins:[{name:'offline-only',setup(p){p.onResolve({filter:/^(electron|@anthropic-ai\/claude-agent-sdk)$/},args=>({path:args.path,namespace:'offline'}));p.onLoad({filter:/.*/,namespace:'offline'},args=>({loader:'js',contents:args.path==='electron'?`export const app={getPath:()=>process.env.CLAUDE_TEST_USER_DATA,getAppPath:()=>process.cwd()};export const safeStorage={isEncryptionAvailable:()=>false};`:`export const query=()=>{throw Error('SDK execution forbidden in probe')};export const createSdkMcpServer=x=>x;export const tool=(...x)=>x;`}))}}]})
const result=spawnSync(process.execPath,['.tmp/full-access-review/policy.mjs'],{encoding:'utf8',timeout:20000});if(result.stderr)process.stderr.write(result.stderr);fs.writeFileSync('.tmp/full-access-review/policy-results.json',result.stdout);console.log(result.stdout);process.exitCode=result.status??1