| 2007 | `}];try{if(w!=="thinking"){let U=Date.now(),c=[...T,{type:"text",text:_Mz}];D={model:Y,max_tokens:(w==="fast"?256:64)+Z,system:J,skipSystemPromptPrefix:!0,temperature:0,thinking:G,messages:[...q,{role:"user",content:c}],maxRetries:kr6(),signal:A,...w!=="fast"&&{stop_sequences:["</block>"]},querySource:"auto_mode"};let K6=await CN(D);X=Date.now()-U,M=cb4(K6),P=WF1(K6),W=K6.id;let t=L3(K6.content),q6=Qb4(t);if(PF1(D,K6,U,"stage1"),db6([D]),q6===!1)return sC("success",Y,{classifierType:j,durationMs:X}),{shouldBlock:!1,reason:"Allowed by fast classifier",model:Y,usage:M,durationMs:X,promptLengths:$,stage:"fast",stage1RequestId:P,stage1MsgId:W};if(w==="fast"){if(q6===null)return sC("parse_failure",Y,{classifierType:j}),{shouldBlock:!0,reason:"Classifier stage 1 unparseable - blocking for safety",model:Y,usage:M,durationMs:X,promptLengths:$,stage:"fast",stage1RequestId:P,stage1MsgId:W};return sC("success",Y,{classifierType:j,durationMs:X}),{shouldBlock:!0,reason:db4(t)??"Blocked by fast classifier",model:Y,usage:M,durationMs:X,promptLengths:$,stage:"fast",stage1RequestId:P,stage1MsgId:W}}}let v=Date.now(),V=[...T,{type:"text",text:zMz}],E={model:Y,max_tokens:4096+Z,system:J,skipSystemPromptPrefix:!0,temperature:0,thinking:G,messages:[...q,{role:"user",content:V}],maxRetries:kr6(),signal:A,querySource:"auto_mode"},S=await CN(E),R=Date.now()-v,x=cb4(S),I=WF1(S),B=S.id,p=L3(S.content),C=Qb4(p),g=(X??0)+R,F=M?$Mz(M,x):x;if(PF1(E,S,v,"stage2"),db6(D?[D,E]:[E]),C===null)return sC("parse_failure",Y,{classifierType:j}),{shouldBlock:!0,reason:"Classifier stage 2 unparseable - blocking for safety",model:Y,usage:F,durationMs:g,promptLengths:$,stage:"thinking",stage1Usage:M,stage1DurationMs:X,stage1RequestId:P,stage1MsgId:W,stage2Usage:x,stage2DurationMs:R,stage2RequestId:I,stage2MsgId:B};return sC("success",Y,{classifierType:j,durationMs:g}),{thinking:YMz(p)??void 0,shouldBlock:C,reason:db4(p)??"No reason provided",model:Y,usage:F,durationMs:g,promptLengths:$,stage:"thinking",stage1Usage:M,stage1DurationMs:X,stage1RequestId:P,stage1MsgId:W,stage2Usage:x,stage2DurationMs:R,stage2RequestId:I,stage2MsgId:B}}catch(v){if(A.aborted)return N("Auto mode classifier (XML): aborted by user"),sC("interrupted",Y,{classifierType:j}),{shouldBlock:!0,reason:"Classifier request aborted",model:Y,unavailable:!0,durationMs:Date.now()-f,promptLengths:$};let V=Ax4(v);N(`Auto mode classifier (XML) error: ${d6(v)}`,{level:"warn"});let E=await sb4(H,_,v,{...O,model:Y})??void 0;return sC(V?"transcript_too_long":"error",Y,{classifierType:j,...V&&{transcriptActualTokens:V.actualTokens,transcriptLimitTokens:V.limitTokens}}),{shouldBlock:!0,reason:V?"Classifier transcript exceeded context window":M?"Stage 2 classifier error - blocking based on stage 1 assessment":"Classifier unavailable - blocking for safety",model:Y,unavailable:M===void 0,transcriptTooLong:Boolean(V),stage:M?"thinking":void 0,durationMs:Date.now()-f,errorDumpPath:E,...M&&{usage:M,stage1Usage:M,stage1DurationMs:X,stage1RequestId:P,stage1MsgId:W},promptLengths:$}}}async function kL8(q,K,_,z,Y){let $=eb4(_),A=Kx4(K,$);if(A==="")return{shouldBlock:!1,reason:"Tool declares no classifier-relevant input",model:lb4()};let O=await KMz(z),w=tb4(q),j=qMz(),H=j?[j]:[],J=A.length,M=0,X=[];for(let E of w)for(let S of E.content){let R=qx4(S,E.role,$);if(R==="")continue;switch(E.role){case"user":M+=R.length;break;case"assistant":J+=R.length;break;default:{let x=E.role}}X.push({type:"text",text:R})}let P=X.map((E)=>E.text).join("")+A,W={systemPrompt:O.length,toolCalls:J,userPrompts:M},D=O.length+P.length,f=Math.round(D/4),G=yG(q);if(ST())N(`[auto-mode] context comparison: mainLoopTokens=${G} classifierChars=${D} classifierTokensEst=${f} (sys=${W.systemPrompt} tools=${W.toolCalls} user=${W.userPrompts}) transcriptEntries=${w.length} messages=${q.length}`),N(`[auto-mode] new action being classified: ${A.length>500?A.slice(0,500)+"…":A}`);let Z=pU({querySource:"auto_mode"});X.push({type:"text",text:A,cache_control:Z});let T=lb4();if(wMz())return OMz(H,O,P,X,T,W,Y,{mainLoopTokens:G??yG(q),classifierChars:D,classifierTokensEst:f,transcriptEntries:w.length,messages:q.length,action:A},jMz());let[v,V]=Yx4(T);try{let E=Date.now(),S={model:T,max_tokens:4096+V,system:[{type:"text",text:O,cache_control:pU({querySource:"auto_mode"})}],skipSystemPromptPrefix:!0,temperature:0,thinking:v,messages:[...H,{role:"user",content:X}],tools:[eJz],tool_choice:{type:"tool",name:da6},maxRetries:kr6(),signal:Y,querySource:"auto_mode"},R=await CN(S);PF1(S,R,E),db6([S]);let x=Date.now()-E,I=WF1(R),B=R.id,p={inputTokens:R.usage.input_tokens,outputTokens:R.usage.output_tokens,cacheReadInputTokens:R.usage.cache_read_input_tokens??0,cacheCreationInputTokens:R.usage.cache_creation_input_tokens??0},C=p.inputTokens+p.cacheReadInputTokens+p.cacheCreationInputTokens;if(ST())N(`[auto-mode] API usage: actualInputTokens=${C} (uncached=${p.inputTokens} cacheRead=${p.cacheReadInputTokens} cacheCreate=${p.cacheCreationInputTokens}) estimateWas=${f} deltaVsMainLoop=${C-G} durationMs=${x}`);let g=Bb4(R.content,da6);if(!g)return N("Auto mode classifier: No tool use block found",{level:"warn"}),sC("parse_failure",T,{failureKind:"no_tool_use"}),{shouldBlock:!0,reason:"Classifier returned no tool use block - blocking for safety",model:T,usage:p,durationMs:x,promptLengths:W,stage1RequestId:I,stage1MsgId:B};let F=gb4(g,tJz());if(!F)return N("Auto mode classifier: Invalid response schema",{level:"warn"}),sC("parse_failure",T,{failureKind:"invalid_schema"}),{shouldBlock:!0,reason:"Invalid classifier response - blocking for safety",model:T,usage:p,durationMs:x,promptLengths:W,stage1RequestId:I,stage1MsgId:B};let U={thinking:F.thinking,shouldBlock:F.shouldBlock,reason:F.reason??"No reason provided",model:T,usage:p,durationMs:x,promptLengths:W,stage1RequestId:I,stage1MsgId:B};return sC("success",T,{durationMs:x,mainLoopTokens:G,classifierInputTokens:C,classifierTokensEst:f}),U}catch(E){if(Y.aborted)return N("Auto mode classifier: aborted by user"),sC("interrupted",T),{shouldBlock:!0,reason:"Classifier request aborted",model:T,unavailable:!0};let S=Ax4(E);N(`Auto mode classifier error: ${d6(E)}`,{level:"warn"});let R=await sb4(O,P,E,{mainLoopTokens:G,classifierChars:D,classifierTokensEst:f,transcriptEntries:w.length,messages:q.length,action:A,model:T})??void 0;return sC(S?"transcript_too_long":"error",T,{mainLoopTokens:G,classifierTokensEst:f,...S&&{transcriptActualTokens:S.actualTokens,transcriptLimitTokens:S.limitTokens}}),{shouldBlock:!0,reason:S?"Classifier transcript exceeded context window":"Classifier unavailable - blocking for safety",model:T,unavailable:!0,transcriptTooLong:Boolean(S),errorDumpPath:R}}}function lb4(){let q=g8("tengu_auto_mode_config",{});if(q?.model)return q.model;return D5()}function $x4(){return g8("tengu_auto_mode_config",{})?.twoStageClassifier}function wMz(){let q=$x4();return q===!0||q==="fast"||q==="thinking"}function nb4(){return g8("tengu_auto_mode_config",{})?.jsonlTranscript===!0}function sC(q,K,_){let{classifierType:z,failureKind:Y,...$}=_??{};d("tengu_auto_mode_outcome",{outcome:q,classifierModel:K,...z!==void 0&&{classifierType:z},...Y!==void 0&&{failureKind:Y},...$})}function Ax4(q){if(!(q instanceof Error))return;if(!q.message.toLowerCase().includes("prompt is too long"))return;return fF1(q.message)}function jMz(){let q=$x4();return q==="fast"||q==="thinking"?q:"both"}function Ox4(q,K){return{role:"assistant",content:[{type:"tool_use",name:q,input:K}]}}var ob4,DF1,oJz="",tJz,da6="classify_result",eJz,_Mz=` |
| 2009 | Review the classification process and follow it carefully, making sure you deny actions that should be blocked. As a reminder, explicit (not suggestive or implicit) user confirmation is required to override blocks. Use <thinking> before responding with <block>.`;var ca6=y(()=>{x7();v8();o1();k8();ew();SC();Wr();_8();m8();y8();i1();pb4();aq();U1();nq6();l8();EG();Tz();ob4=rb4(Fb4()),DF1=rb4(Ub4());tJz=B6(()=>L.object({thinking:L.string(),shouldBlock:L.boolean(),reason:L.string()})),eJz={type:"custom",name:da6,description:"Report the security classification result for the agent action",input_schema:{type:"object",properties:{thinking:{type:"string",description:"Brief step-by-step reasoning."},shouldBlock:{type:"boolean",description:"Whether the action should be blocked (true) or allowed (false)"},reason:{type:"string",description:"Brief explanation of the classification decision"}},required:["thinking","shouldBlock","reason"]}}});function VL8(q){ur({type:"system",subtype:"task_progress",task_id:q.taskId,tool_use_id:q.toolUseId,description:q.description,usage:{total_tokens:q.totalTokens,tool_uses:q.toolUses,duration_ms:Date.now()-q.startTime},last_tool_name:q.lastToolName,summary:q.summary,workflow_progress:q.workflowProgress})}var ZF1=y(()=>{pC()});function GF1({tools:q,isBuiltIn:K,isAsync:_=!1,permissionMode:z}){return q.filter((Y)=>{if(Y.name.startsWith("mcp__"))return!0;if(g_(Y,kX)&&z==="plan")return!0;if(mV6.has(Y.name))return!1;if(!K&&Dp1.has(Y.name))return!1;if(_&&!iN8.has(Y.name)){if(nq()&&cW()){if(g_(Y,v4))return!0;if(ay4.has(Y.name))return!0}return!1}return!0})}function $o(q,K,_=!1,z=!1){let{tools:Y,disallowedTools:$,source:A,permissionMode:O}=q,w=z?K:GF1({tools:K,isBuiltIn:A==="built-in",isAsync:_,permissionMode:O}),j=new Set($?.map((G)=>{let{toolName:Z}=G2(G);return Z})??[]),H=w.filter((G)=>!j.has(G.name));if(Y===void 0||Y.length===1&&Y[0]==="*")return{hasWildcard:!0,validTools:[],invalidTools:[],resolvedTools:H};let M=new Map;for(let G of H)M.set(G.name,G);let X=[],P=[],W=[],D=new Set,f;for(let G of Y){let{toolName:Z,ruleContent:T}=G2(G);if(Z===v4){if(T)f=T.split(",").map((V)=>V.trim());if(!z){X.push(G);continue}}let v=M.get(Z);if(v){if(X.push(G),!D.has(v))W.push(v),D.add(v)}else P.push(G)}return{hasWildcard:!1,validTools:X,invalidTools:P,resolvedTools:W,allowedAgentTypes:f}}function JMz(q){let K=0;for(let _ of q)if(_.type==="assistant"){for(let z of _.message.content)if(z.type==="tool_use")K++}return K}function NL8(q,K,_){let{prompt:z,resolvedAgentModel:Y,isBuiltInAgent:$,startTime:A,agentType:O,isAsync:w}=_,j=uP(q);if(j===void 0)throw Error("No assistant messages found");let H=j.message.content.filter((P)=>P.type==="text");if(H.length===0)for(let P=q.length-1;P>=0;P--){let W=q[P];if(W.type!=="assistant")continue;let D=W.message.content.filter((f)=>f.type==="text");if(D.length>0){H=D;break}}let J=fr6(j.message.usage),M=JMz(q);d("tengu_agent_tool_completed",{agent_type:O,model:Y,prompt_char_count:z.length,response_char_count:H.length,assistant_message_count:q.length,total_tool_uses:M,duration_ms:Date.now()-A,total_tokens:J,is_built_in_agent:$,is_async:w});let X=j.requestId;if(X)d("tengu_cache_eviction_hint",{scope:"subagent_end",last_request_id:X});return{agentId:K,agentType:O,content:H,totalDurationMs:Date.now()-A,totalTokens:J,totalToolUseCount:M,usage:j.message.usage}}function yL8(q){if(q.type!=="assistant")return;let K=q.message.content.findLast((_)=>_.type==="tool_use");return K?.type==="tool_use"?K.name:void 0}function EL8(q,K,_,z,Y,$){let A=Ao(q);VL8({taskId:K,toolUseId:_,description:A.lastActivity?.activityDescription??z,startTime:Y,totalTokens:A.tokenCount,toolUses:A.toolUseCount,lastToolName:$})}async function LL8({agentMessages:q,tools:K,toolPermissionContext:_,abortSignal:z,subagentType:Y,totalToolUseCount:$}){{if(_.mode!=="auto")return null;if(!_x4(q,K))return null;let O=await kL8(q,{role:"user",content:[{type:"text",text:"Sub-agent has finished and is handing back control to the main agent. Review the sub-agent's work based on the block rules and let the main agent know if any file is dangerous (the main agent will see the reason)."}]},K,_,z),w=O.unavailable?"unavailable":O.shouldBlock?"blocked":"allowed";if(d("tengu_auto_mode_decision",{decision:w,toolName:CB,inProtectedNamespace:Ik(),classifierModel:O.model,agentType:Y,toolUseCount:$,isHandoff:!0,agentMsgId:uP(q)?.message.id,classifierStage:O.stage,classifierStage1RequestId:O.stage1RequestId,classifierStage1MsgId:O.stage1MsgId,classifierStage2RequestId:O.stage2RequestId,classifierStage2MsgId:O.stage2MsgId}),O.shouldBlock){if(O.unavailable)return N("Handoff classifier unavailable, allowing sub-agent output with warning",{level:"warn"}),"Note: The safety classifier was unavailable when reviewing this sub-agent's work. Please carefully verify the sub-agent's actions and output before acting on them.";return N(`Handoff classifier flagged sub-agent output: ${O.reason}`,{level:"warn"}),`SECURITY WARNING: This sub-agent performed actions that may violate security policy. Reason: ${O.reason}. Review the sub-agent's actions carefully before acting on its output.`}}return null}function TF1(q){for(let K=q.length-1;K>=0;K--){let _=q[K];if(_.type!=="assistant")continue;let z=L3(_.message.content,` |