docs(B03): trace full-access command approval mismatch from live session
This commit is contained in:
1 parent
f512a0f3fd
commit
69e134671d
5 files changed
+219
No files matched your search
@@ -0,0 +1,26 @@
|
||||
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
|
||||
Reference in new issue
Block a user