| 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=` |