qlogicagent 2.10.4 → 2.10.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent.js +11 -11
- package/dist/cli.js +343 -343
- package/dist/index.js +262 -262
- package/dist/types/provider-core/builtin-providers.d.ts +3 -5
- package/dist/types/provider-core/index.d.ts +0 -1
- package/dist/types/provider-core/provider-def.d.ts +1 -4
- package/dist/types/provider-core/provider-registry.d.ts +9 -18
- package/dist/types/runtime/infra/model-registry.d.ts +1 -0
- package/package.json +1 -1
- package/dist/types/provider-core/model-catalog.d.ts +0 -82
package/dist/agent.js
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
var
|
|
1
|
+
var qo=Object.defineProperty;var en=(t,e)=>()=>(t&&(e=t(t=0)),e);var tn=(t,e)=>{for(var o in e)qo(t,o,{get:e[o],enumerable:!0})};var Bo={};tn(Bo,{resolveToolEligibility:()=>ds});function ls(t,e){if(as.some(o=>o.test(t)))return!0;if(e)for(let o of e)try{if(new RegExp(o,"i").test(t))return!0}catch{}return!1}function cs(t,e){let o=t.function.name,n=t.meta,i=[];return e.blockedToolNames?.includes(o)?(i.push("policy_blocked"),{level:5,reasons:i}):n?.isReadOnly?(i.push("always_allowed"),{level:1,reasons:i}):n?.requiresApproval?(i.push("approval_required"),{level:4,reasons:i}):n?.isDangerous||ls(o,e.dangerousPatterns)?(i.push("dangerous_tool"),{level:3,reasons:i}):{level:2,reasons:i}}function us(t){switch(t){case 1:return"eligible";case 2:return"eligible";case 3:return"dangerous-notify";case 4:return"approval-required";case 5:return"blocked-by-policy"}}function ds(t,e={}){let o=new Map,n=[],i=[],s=[];for(let l of t){let r=l.function.name,{level:d,reasons:h}=cs(l,e),m=us(d),g={toolName:r,status:m,permissionLevel:d,approvalRequired:d===4,reasonCodes:h};o.set(r,g),d===5?i.push(g):(n.push(l),d===4&&s.push(g))}return{eligibleTools:n,blockedTools:i,approvalRequiredTools:s,eligibilityByName:o}}var as,Wo=en(()=>{"use strict";as=[/^(?:bash|shell|exec|terminal|run_command)$/i,/^(?:write_file|delete_file|move_file|create_directory)$/i,/^(?:git_push|git_reset|git_force)$/i]});function We(t,e,o,n){return{role:"assistant",content:e||null,tool_calls:t,...o&&o.length>0?{thinkingBlocks:o}:{},...n?{reasoning_content:n}:{}}}function G(t,e){let o=e.ok?typeof e.payload=="string"?e.payload:JSON.stringify(e.payload??""):`Error: ${e.error??"Tool execution failed"}`;return{role:"tool",tool_call_id:t,content:o,...!e.ok&&{is_error:!0},...e.toolReferences?.length?{toolReferences:e.toolReferences}:{},...e.imageUrls?.length?{imageUrls:e.imageUrls}:{}}}var nn=/\b(?:daily|weekly|monthly)(?:\/(?:daily|weekly|monthly))* (?:usage )?limit(?:s)?(?: (?:exhausted|reached|exceeded))?\b/i,K={rateLimit:[/rate[_ ]limit|too many requests|429/,"model_cooldown","exceeded your current quota","resource has been exhausted","quota exceeded","resource_exhausted","usage limit",/\btpm\b/i,"tokens per minute","tokens per day"],overloaded:[/overloaded_error|"type"\s*:\s*"overloaded_error"/i,"overloaded",/service[_ ]unavailable.*(?:overload|capacity|high[_ ]demand)|(?:overload|capacity|high[_ ]demand).*service[_ ]unavailable/i,"high demand"],timeout:["timeout","timed out","service unavailable","deadline exceeded","context deadline exceeded","connection error","network error","network request failed","fetch failed","socket hang up",/\beconn(?:refused|reset|aborted)\b/i,/\benotfound\b/i,/\beai_again\b/i,/without sending (?:any )?chunks?/i,/\bstop reason:\s*(?:abort|error|network_error)\b/i,/\breason:\s*(?:abort|error|network_error)\b/i,/\bunhandled stop reason:\s*(?:abort|error|network_error)\b/i],billing:[/["']?(?:status|code)["']?\s*[:=]\s*402\b|\bhttp\s*402\b|\berror(?:\s+code)?\s*[:=]?\s*402\b|\b(?:got|returned|received)\s+(?:a\s+)?402\b|^\s*402\s+payment/i,"payment required","insufficient credits",/insufficient[_ ]quota/i,"credit balance","plans & billing","insufficient balance"],authPermanent:[/api[_ ]?key[_ ]?(?:revoked|invalid|deactivated|deleted)/i,"invalid_api_key","key has been disabled","key has been revoked","account has been deactivated",/could not (?:authenticate|validate).*(?:api[_ ]?key|credentials)/i,"permission_error","not allowed for this organization"],auth:[/invalid[_ ]?api[_ ]?key/,"incorrect api key","invalid token","authentication","re-authenticate","oauth token refresh failed","unauthorized","forbidden","access denied","insufficient permissions","insufficient permission",/missing scopes?:/i,"expired","token has expired",/\b401\b/,/\b403\b/,"no credentials found","no api key found"],format:["string should match pattern","tool_use.id","tool_use_id","messages.1.content.1.tool_use.id","invalid request format",/tool call id was.*must be/i]},sn=/^(?:error[:\s-]+)?billing(?:\s+error)?(?:[:\s-]+|$)|^(?:error[:\s-]+)?(?:credit balance|insufficient credits?|payment required|http\s*402\b)/i,rn=/["']?(?:status|code)["']?\s*[:=]\s*402\b|\bhttp\s*402\b|\berror(?:\s+code)?\s*[:=]?\s*402\b|^\s*402\s+payment/i,an=512,ln=/^(?:http\s*)?(\d{3})(?:\s+([\s\S]+))?$/i;var cn=new Set([500,502,503,504,521,522,523,524,529]),un=["insufficient credits","insufficient quota","credit balance","insufficient balance","plans & billing","add more credits","top up"],dn=["upgrade your plan","upgrade plan","current plan","subscription"],pn=["daily","weekly","monthly"],mn=["try again","retry","temporary","cooldown"],fn=["usage limit","rate limit","organization usage"],gn=["organization","workspace"],hn=["billing period","exceeded","reached","exhausted"],yn=/["']?(?:status|code)["']?\s*[:=]\s*402\b|\bhttp\s*402\b|\berror(?:\s+code)?\s*[:=]?\s*402\b|\b(?:got|returned|received)\s+(?:a\s+)?402\b|^\s*402\s+payment required\b/i,bn=/^(?:error[:\s-]+)?(?:(?:http\s*)?402(?:\s+payment required)?|payment required)(?:[:\s-]+|$)/i;function V(t,e){if(!t)return!1;let o=t.toLowerCase();return e.some(n=>n instanceof RegExp?n.test(o):o.includes(n))}function Tn(t){return V(t,K.format)}function $t(t){return V(t,K.rateLimit)}function _n(t){return V(t,K.timeout)}function xn(t){return nn.test(t)}function je(t){let e=t.toLowerCase();return e?t.length>an?rn.test(e):V(e,K.billing)?!0:sn.test(t)?e.includes("upgrade")||e.includes("credits")||e.includes("payment")||e.includes("plan"):!1:!1}function Dt(t){return V(t,K.authPermanent)}function kn(t){return V(t,K.auth)}function Nt(t){return V(t,K.overloaded)}function H(t,e){return e.some(o=>t.includes(o))}function wn(t){return H(t,un)||H(t,dn)&&t.includes("limit")||t.includes("billing hard limit")||t.includes("hard limit reached")||t.includes("maximum allowed")&&t.includes("limit")}function Cn(t){let e=H(t,pn),o=t.includes("spend limit")||t.includes("spending limit"),n=H(t,gn);return H(t,mn)&&H(t,fn)||e&&(t.includes("usage limit")||o)||e&&t.includes("limit")&&t.includes("reset")||n&&t.includes("limit")&&(o||H(t,hn))}function Sn(t){return t.trim().toLowerCase().replace(bn,"").trim()}function Ft(t){let e=Sn(t);return!e||wn(e)?"billing":$t(e)||Cn(e)?"rate_limit":"billing"}function vn(t){return yn.test(t)?Ft(t):null}function Bt(t){let e=t.match(ln);if(!e)return null;let o=Number(e[1]);return Number.isFinite(o)?{code:o,rest:(e[2]??"").trim()}:null}function Mn(t){if(!t)return!1;let e=t.toLowerCase();return e.includes('"type":"api_error"')&&e.includes("internal server error")}function Rn(t){let e=t.trim();if(!e)return!1;let o=Bt(e);return o?cn.has(o.code):!1}function Wt(t,e){return typeof t!="number"||!Number.isFinite(t)?null:t===402?e?Ft(e):"billing":t===429?"rate_limit":t===401||t===403?e&&Dt(e)?"auth_permanent":"auth":t===408?"timeout":t===503?e&&Nt(e)?"overloaded":"timeout":t===502||t===504?"timeout":t===529?"overloaded":t===400?e&&je(e)?"billing":"format":null}function En(t){if(!t)return!1;let e=t.toLowerCase();return!!(e.includes("unknown model")||e.includes("model not found")||e.includes("model_not_found")||e.includes("not_found_error")||e.includes("does not exist")&&e.includes("model")||e.includes("invalid model")&&!e.includes("invalid model reference")||/models\/[^\s]+ is not found/i.test(t)||/\b404\b/.test(t)&&/not[-_ ]?found/i.test(t))}function An(t){if(!t)return!1;let e=t.toLowerCase();return e.includes("session not found")||e.includes("session does not exist")||e.includes("session expired")||e.includes("session invalid")||e.includes("conversation not found")||e.includes("conversation does not exist")||e.includes("conversation expired")||e.includes("conversation invalid")||e.includes("no such session")||e.includes("invalid session")||e.includes("session id not found")||e.includes("conversation id not found")}function jt(t){if(An(t))return"session_expired";if(En(t))return"model_not_found";let e=vn(t);return e||(xn(t)?je(t)?"billing":"rate_limit":$t(t)?"rate_limit":Nt(t)?"overloaded":Rn(t)?Bt(t.trim())?.code===529?"overloaded":"timeout":Mn(t)?"timeout":Tn(t)?"format":je(t)?"billing":_n(t)?"timeout":Dt(t)?"auth_permanent":kn(t)?"auth":null)}var In={timeout:"RETRYABLE_TRANSIENT",overloaded:"RETRYABLE_TRANSIENT",rate_limit:"RETRYABLE_DEGRADED",auth:"NON_RETRYABLE_AUTH",auth_permanent:"NON_RETRYABLE_AUTH",billing:"NON_RETRYABLE_QUOTA",format:"NON_RETRYABLE_CONTENT",model_not_found:"NON_RETRYABLE_CONTENT",session_expired:"NON_RETRYABLE_CONTENT",unknown:"RETRYABLE_TRANSIENT"},On=new Set(["RETRYABLE_TRANSIENT","RETRYABLE_DEGRADED","TOOL_EXECUTION_FAILED"]);function Y(t,e){let o=Wt(t,e)??(e?jt(e):null);return o?In[o]:typeof t=="number"&&t>=400&&t<500?"NON_RETRYABLE_CONTENT":"RETRYABLE_TRANSIENT"}function Ge(t){return On.has(t)}var Gt=4,oe=class{constructor(e){this.estimateTokens=e}estimateTokens;compress(e,o){let n=[],i=[];for(let m of e)m.role==="system"?n.push(m):i.push(m);let s=o;for(let m of n)s-=this.estimateTokens(m);let l;for(let m of i)if(m.role==="user"){l=m;break}if(l&&(s-=this.estimateTokens(l)),s<=0)return{messages:l?[...n,l]:n,droppedCount:i.length-(l?1:0),strategy:"sliding-window"};let r=[],d=0;for(let m=i.length-1;m>=0;m--){let g=i[m];if(g===l)continue;let M=this.estimateTokens(g);if(s-M<0&&d>=Gt)break;if(s-M<0&&d<Gt){r.unshift(g),d++;continue}s-=M,r.unshift(g),d++}let h=[...n];return l&&!r.includes(l)&&h.push(l),h.push(...r),{messages:h,droppedCount:i.length-(r.length+(l&&!r.includes(l)?1:0)),strategy:"sliding-window"}}};var ne=class{constructor(e=8e3){this.maxToolResultChars=e}maxToolResultChars;compress(e,o){let n=0;return{messages:e.map(s=>s.role!=="tool"||typeof s.content!="string"||s.content.length<=this.maxToolResultChars?s:(n++,{...s,content:Un(s.content,this.maxToolResultChars)})),droppedCount:n,strategy:"tool-result-trim"}}};function Un(t,e){if(t.length<=e)return t;let o=t.slice(0,e);if(t.trimStart().startsWith("{")||t.trimStart().startsWith("[")){let s=Math.max(o.lastIndexOf("},"),o.lastIndexOf("],"),o.lastIndexOf(`}
|
|
2
2
|
`),o.lastIndexOf(`]
|
|
3
3
|
`));if(s>e*.5)return o.slice(0,s+1)+`
|
|
4
4
|
[...truncated: ${t.length-s-1} chars omitted]`}let i=o.lastIndexOf(`
|
|
5
5
|
`);return i>e*.7?o.slice(0,i)+`
|
|
6
6
|
[...truncated: ${t.length-i} chars omitted]`:o+`
|
|
7
|
-
[...truncated: ${t.length-e} chars omitted]`}function
|
|
8
|
-
`).map(g=>g.replace(/^\s*-\s*/,"").trim()).filter(Boolean);if(we(u)===o)return i.name}}catch{}}}catch{}return null}function Yn(t){if(!tt(t))return 0;try{return To(t,{withFileTypes:!0}).filter(e=>e.isDirectory()&&tt(ot(t,e.name,"SKILL.md"))).length}catch{return 0}}function Jn(t,e){return!(!t.ok||t.existingSkillName||!t.multiStep||t.toolCallCount<po||t.distinctToolCount<mo||Date.now()-_o<fo||e?.projectSkillsDir&&(Yn(e.projectSkillsDir)>=uo||e.tools.length>0&&Xn(e.tools,e.projectSkillsDir))||e?.projectRoot&&e.tools.length>0&&!ko(e.projectRoot,e.tools))}function Qn(t){return t.existingSkillName?t.feedback==="negative":!1}function Ce(t,e){return Qn(t)?{type:"skill.improve",skillName:t.existingSkillName,reason:"negative user feedback on existing skill execution"}:Jn(t,e)?(_o=Date.now(),{type:"skill.create",suggestedName:e.suggestedName??`auto-skill-${e.tools.slice(0,3).join("-")}`,description:`Multi-step orchestration using ${e.tools.join(", ")}`,tools:e.tools,stepCount:t.toolCallCount}):null}function wo(t){return t.function&&typeof t.function=="object"&&typeof t.function.name=="string"?t.function.name.trim():typeof t.name=="string"?t.name.trim():""}function Zn(t){return t==="enabled-eligible"||t==="installed-awaiting-approval"}function qn(t){return new Map((t??[]).map(e=>[e.toolName,e]))}function ei(t){if(!t.eligibility?.length)return[...t.tools];let e=qn(t.eligibility);return t.tools.filter(o=>{let n=wo(o);if(!n)return!1;let i=e.get(n);return!i||Zn(i.status)})}function ti(t){let e=[],o=t.compatibility??{},n=t.toolChoice;if(t.thinkingEnabled&&o.requireAutoWhenThinking){let i=typeof n=="object"&&n&&!Array.isArray(n)?String(n.type??""):n;i&&i!=="auto"&&i!=="none"&&(e.push("tool_choice downgraded to auto because thinking mode requires auto/none compatibility."),n="auto")}if(n==="required"&&o.allowRequiredToolChoice===!1){let i=o.requiredFallback??"auto";e.push(`tool_choice=required is not supported by this provider; downgraded to ${i}.`),n=i}if(n&&typeof n=="object"&&!Array.isArray(n)&&n.type==="function"&&o.allowNamedToolChoice===!1){let i=o.namedFallback??"required";e.push(`named tool_choice is not supported by this provider; downgraded to ${i}.`),n=i}return{normalizedToolChoice:n,warnings:e}}function nt(t){let e=ti({toolChoice:t.toolChoice,thinkingEnabled:t.thinkingEnabled,compatibility:t.compatibility}),o=e.normalizedToolChoice,n=[...e.warnings],i=ei({tools:t.tools,eligibility:t.eligibility});if(!o||o==="auto")return{tools:i,normalizedToolChoice:o,warnings:n};if(o==="none")return{tools:[],normalizedToolChoice:"none",warnings:n};if(o==="required"){if(i.length===0)throw new Error("tool_choice=required but no tools were provided");return{tools:i,normalizedToolChoice:"required",extraSystemPrompt:"You must call one of the available tools before responding.",warnings:n}}if(typeof o=="object"&&!Array.isArray(o)&&o.type==="function"){let s=o.function??void 0,a=typeof s?.name=="string"?s.name.trim():"";if(!a)throw new Error("tool_choice.function.name is required");let r=i.filter(u=>wo(u)===a);if(r.length===0)throw new Error(`tool_choice requested unknown tool: ${a}`);return{tools:r,normalizedToolChoice:{type:"function",function:{name:a}},extraSystemPrompt:`You must call the ${a} tool before responding.`,warnings:n}}return{tools:i,normalizedToolChoice:o,warnings:n}}var oi=["stop","aborted","timeout","cancelled","interrupted","error"],ni=["tool_calls","toolCalls","function_call","functionCall","raw_tool_calls","rawToolCalls"];function Co(t){return t==null?[]:typeof t=="string"?t.length>0?[{type:"text",text:t}]:[]:Array.isArray(t)?t:[{type:"text",text:String(t)}]}function ii(t,e){return{...t,content:[...Co(t.content),...Co(e.content)]}}function si(t){if(!t||typeof t!="object")return!1;if(t.function&&typeof t.function=="object"){let e=t.function.name;if(typeof e=="string"&&e.length>0)return!0}return typeof t.name=="string"&&t.name.length>0}function ri(t){return new Set((t??oi).map(e=>e.trim().toLowerCase()))}function ai(t,e){return t?ri(e).has(t.trim().toLowerCase()):!1}function it(t){if(!Array.isArray(t)||t.length===0)return[...t];let e=t.map(r=>{if(r.role==="assistant"&&Array.isArray(r.tool_calls)){let u=r.tool_calls.filter(g=>si(g));return{...r,...u.length>0?{tool_calls:u}:{tool_calls:void 0}}}return{...r}}),o=new Set;for(let r of e)if(!(r.role!=="assistant"||!Array.isArray(r.tool_calls)))for(let u of r.tool_calls)typeof u.id=="string"&&u.id&&o.add(u.id);let n=e.filter(r=>r.role!=="tool"?!0:!!(r.tool_call_id&&o.has(r.tool_call_id))),i=new Set;for(let r of n)r.role==="tool"&&typeof r.tool_call_id=="string"&&r.tool_call_id&&i.add(r.tool_call_id);let s=[];for(let r of n){if(r.role==="assistant"&&Array.isArray(r.tool_calls)&&r.tool_calls.length>0){let u=r.tool_calls.filter(g=>typeof g.id=="string"&&i.has(g.id));if(u.length===0){let{tool_calls:g,...p}=r;p.content!=null&&p.content!==""&&s.push(p);continue}if(u.length<r.tool_calls.length){s.push({...r,tool_calls:u});continue}}s.push(r)}let a=[];for(let r of s){let u=a.length>0?a[a.length-1]:void 0;if(r.role==="user"&&u?.role==="user"){a[a.length-1]=ii(u,r);continue}a.push(r)}return a}function st(t,e){return ai(e?.stopReason,e?.forcedStopReasons)?t.map(o=>{if(o.role!=="assistant")return{...o};let n={...o};for(let i of ni)delete n[i];return n}):[...t]}function rt(t,e){let o=e?.placeholderToolResult??"Error: Tool loop interrupted before the tool result was replayed.",n=new Set;for(let s of t)s.role==="tool"&&typeof s.tool_call_id=="string"&&s.tool_call_id&&n.add(s.tool_call_id);let i=[];for(let s of t)if(i.push({...s}),!(s.role!=="assistant"||!Array.isArray(s.tool_calls)||s.tool_calls.length===0))for(let a of s.tool_calls)typeof a.id!="string"||!a.id||n.has(a.id)||(n.add(a.id),i.push({role:"tool",tool_call_id:a.id,content:o}));return i}function at(t,e){let o=it(t),n=st(o,e);return rt(n,e)}function li(t){let e=new Set,o=new Set;for(let n of t){if(n.role==="assistant"&&Array.isArray(n.tool_calls))for(let i of n.tool_calls)typeof i.id=="string"&&i.id&&e.add(i.id);n.role==="tool"&&typeof n.tool_call_id=="string"&&n.tool_call_id&&o.add(n.tool_call_id)}return[...e].filter(n=>!o.has(n))}function ci(t){let e=new Set;for(let o of t)o.role==="tool"&&typeof o.tool_call_id=="string"&&o.tool_call_id&&e.add(o.tool_call_id);return[...e]}function ui(t){return{round:t.round??0,maxRounds:t.maxRounds,pendingToolCallIds:[...t.pendingToolCallIds??[]],completedToolCallIds:[...t.completedToolCallIds??[]],lastStopReason:t.lastStopReason,replayMessages:[...t.replayMessages??[]]}}function lt(t,e){return{round:t.round+1,maxRounds:t.maxRounds,pendingToolCallIds:[...e.pendingToolCallIds??t.pendingToolCallIds],completedToolCallIds:[...e.completedToolCallIds??t.completedToolCallIds],lastStopReason:e.lastStopReason??t.lastStopReason,replayMessages:[...e.replayMessages??t.replayMessages]}}function ve(t,e){return{round:t.round,maxRounds:t.maxRounds,pendingToolCallIds:[],completedToolCallIds:[...e.completedToolCallIds??t.completedToolCallIds],lastStopReason:e.lastStopReason??t.lastStopReason,replayMessages:[...e.replayMessages??t.replayMessages]}}function Se(t){let e=[],o=it(t.replayMessages);o.length!==t.replayMessages.length&&e.push({kind:"drop-orphan-tool-result",detail:"Removed orphan tool results or invalid assistant tool calls."});let n=st(o,t.options);n.some((s,a)=>s!==o[a])&&e.push({kind:"strip-forced-stop-tool-metadata",detail:"Removed assistant tool-call metadata after forced stop."});let i=rt(n,t.options);return i.length>n.length&&e.push({kind:"inject-placeholder-tool-result",detail:"Injected placeholder tool result for pending tool calls."}),{state:ui({maxRounds:t.maxRounds,round:t.round,lastStopReason:t.lastStopReason,replayMessages:i,pendingToolCallIds:li(i),completedToolCallIds:ci(i)}),recoveryActions:e}}var di=new Set(["main","sdk","agent","compact","hook","verification","side_question"]);function ct(t){return t?di.has(t):!0}function ut(t){return t===429||t===529}function Me(t,e=500,o=32e3){let n=Math.min(e*Math.pow(2,t-1),o);return n+Math.floor(Math.random()*n*.25)}var xr={maxBackoffMs:300*1e3,resetCapMs:360*60*1e3,heartbeatIntervalMs:3e4};function Re(){let t=process.env.QLOGICAGENT_PERSISTENT_RETRY;return t==="1"||t==="true"}var le=class extends Error{constructor(o,n){super(`Model fallback triggered: ${o} -> ${n}`);this.originalModel=o;this.fallbackModel=n;this.name="FallbackTriggeredError"}originalModel;fallbackModel};function dt(t){return{promptTokens:0,hasAttemptedReactiveCompact:!1,currentMaxOutputTokens:t.maxOutputTokens,consecutiveTruncations:0,aborted:t.abortSignal?.aborted??!1}}function pt(t,e){if(t.aborted)return{level:"blocking",usagePercent:100,reason:"budget_exhausted"};let o=e.contextWindowTokens-e.responseBufferTokens-t.currentMaxOutputTokens,n=o>0?t.promptTokens/o*100:100;return t.promptTokens>=o?t.hasAttemptedReactiveCompact||!e.reactiveCompactEnabled?{level:"blocking",usagePercent:n,reason:"prompt_too_long"}:{level:"blocking",usagePercent:n,reason:"prompt_too_long"}:n>=85?{level:"warning",usagePercent:n,remainingTokens:o-t.promptTokens}:{level:"ok"}}function mt(t,e,o){let n=t.message?.toLowerCase()??"",i=t.status??0;return i===413||n.includes("prompt_too_long")||n.includes("context_length_exceeded")?!e.hasAttemptedReactiveCompact&&o.reactiveCompactEnabled?{action:"reactive_compact"}:{action:"abort",reason:"prompt_too_long_unrecoverable"}:i>=500&&i<600?{action:"retry",reason:`server_error_${i}`}:i===429?{action:"retry",reason:"rate_limited"}:i===401||i===403?{action:"abort",reason:"auth_error"}:i===404?{action:"abort",reason:"model_not_found"}:{action:"abort",reason:n||"unknown_error"}}function ft(t,e,o){if(!e.outputEscalationEnabled)return{shouldEscalate:!1,newMax:t.currentMaxOutputTokens};if(t.consecutiveTruncations>=3)return{shouldEscalate:!1,newMax:t.currentMaxOutputTokens};let n=Math.min(t.currentMaxOutputTokens*2,o);return n<=t.currentMaxOutputTokens?{shouldEscalate:!1,newMax:t.currentMaxOutputTokens}:{shouldEscalate:!0,newMax:n}}function gt(t,e){return t.aborted?!0:e.abortSignal?.aborted?(t.aborted=!0,!0):!1}var mi={maxConsecutiveFailures:3,minMessagesAfterCompact:4,targetUsagePercent:50};function ht(){return{consecutiveFailures:0,attemptedThisTurn:!1,lastCompactAt:null,toolsAtLastCompact:[]}}function J(t,e=mi){return!(t.attemptedThisTurn||t.consecutiveFailures>=e.maxConsecutiveFailures)}function yt(t,e){let o=t.get(e.index);o||(o={id:"",name:"",arguments:""},t.set(e.index,o)),e.id&&(o.id=e.id),e.name&&(o.name+=e.name),o.arguments+=e.arguments}import{writeFileSync as Ta,mkdirSync as _a}from"node:fs";import{join as ka}from"node:path";import{randomUUID as Ca}from"node:crypto";import{join as bt}from"node:path";import{homedir as _i,tmpdir as xi}from"node:os";function vo(){return process.env.QLOGICAGENT_HOME??bt(_i()||xi(),".qlogicagent")}function Q(){return process.env.QLOGICAGENT_CACHE_DIR??bt(vo(),"cache")}function So(){return process.env.QLOGICAGENT_DEBUG_LOG_DIR??bt(vo(),"debug-logs")}import{writeFileSync as Na,mkdirSync as Fa}from"node:fs";import{join as ja}from"node:path";import{randomUUID as Ga}from"node:crypto";import{writeFileSync as Ea,mkdirSync as Aa}from"node:fs";import{join as Oa}from"node:path";import{randomUUID as Pa}from"node:crypto";import{writeFileSync as Ya,mkdirSync as Ja}from"node:fs";import{join as Za}from"node:path";import{randomUUID as el}from"node:crypto";var Tt=[{id:"deepseek",name:"DeepSeek",transport:"anthropic-messages",baseUrl:"https://api.deepseek.com/anthropic",apiKeyEnvVars:["DEEPSEEK_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"deepseek-v4-flash",quirks:{useEffortInsteadOfBudget:!0,filterImageBlocks:!0,maxReasoningEffort:"max",supportsPrefixCompletion:!0,supportsThinkingParam:!0,disableThinkingByDefault:!0},models:[{id:"deepseek-v4-flash",name:"DeepSeek V4 Flash",contextWindow:1e6,maxOutput:384e3,toolCall:!0,reasoning:!0,vision:!1,costInput:.14,costOutput:.28,costCacheRead:.0028},{id:"deepseek-v4-pro",name:"DeepSeek V4 Pro",contextWindow:1e6,maxOutput:384e3,toolCall:!0,reasoning:!0,vision:!1,costInput:1.74,costOutput:3.48,costCacheRead:.0145}]},{id:"qwen",name:"Alibaba Qwen (DashScope)",transport:"anthropic-messages",baseUrl:"https://dashscope.aliyuncs.com/apps/anthropic",apiKeyEnvVars:["DASHSCOPE_API_KEY","QWEN_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"qwen3.6-plus",quirks:{supportsThinkingParam:!0,disableThinkingByDefault:!0},models:[{id:"qwen3.6-max-preview",name:"Qwen3.6 Max (Preview)",contextWindow:1e6,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!0,costInput:2,costOutput:8,costCacheRead:.2,costCacheWrite:2.5},{id:"qwen3.6-plus",name:"Qwen3.6 Plus",contextWindow:1e6,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!0,costInput:.5,costOutput:3,costCacheRead:.05,costCacheWrite:.625},{id:"qwen3.6-flash",name:"Qwen3.6 Flash",contextWindow:1e6,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!0,costInput:.1,costOutput:.5,costCacheRead:.01,costCacheWrite:.125},{id:"qwq-plus",name:"QwQ Plus",contextWindow:131072,maxOutput:65536,toolCall:!0,reasoning:!0,reasoningRequired:!0,streamRequired:!0,vision:!1,costInput:.5,costOutput:3,costCacheRead:.05,costCacheWrite:.625},{id:"qwen-max",name:"Qwen Max",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:2,costOutput:6,costCacheRead:.2,costCacheWrite:2.5},{id:"qwen-plus",name:"Qwen Plus",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:.3,costOutput:.85,costCacheRead:.03,costCacheWrite:.375},{id:"qwen-flash",name:"Qwen Flash",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1},{id:"qwen-turbo",name:"Qwen Turbo",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!1,vision:!1},{id:"qwen-vl-max",name:"Qwen VL Max",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!1,vision:!0,costInput:3,costOutput:8.5},{id:"qwen3.5-omni-plus",name:"Qwen3.5 Omni Plus",contextWindow:131072,maxOutput:16384,toolCall:!1,reasoning:!1,streamRequired:!0,vision:!0},{id:"qwen3.5-omni-plus-realtime",name:"Qwen3.5 Omni Plus Realtime",contextWindow:131072,maxOutput:16384,toolCall:!1,reasoning:!1,streamRequired:!0,vision:!0,mediaType:"realtime_audio",mediaCapabilities:{type:"realtime_audio",modalities:["text","audio"],vad:!0,toolCalling:!1}},{id:"qwen-vl-ocr",name:"Qwen VL OCR",contextWindow:131072,maxOutput:4096,toolCall:!1,reasoning:!1,vision:!0,mediaType:"document_parsing",mediaCapabilities:{type:"document_parsing",supportedFormats:["jpg","jpeg","png","bmp","tiff","pdf"],maxFileSizeMB:10}},{id:"qwen3-tts-flash",name:"Qwen3 TTS Flash",contextWindow:32768,maxOutput:16384,toolCall:!1,reasoning:!1,vision:!1,mediaType:"tts",mediaCapabilities:{type:"tts",operations:["text2speech","voice_clone"],maxCharacters:32768,formats:["mp3","wav"]}},{id:"cosyvoice-v2",name:"CosyVoice V2",contextWindow:1e4,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"tts",mediaCapabilities:{type:"tts",operations:["text2speech","voice_clone"],maxCharacters:1e4,formats:["mp3","wav","pcm"]}},{id:"wan2.7-image-pro",name:"Wan 2.7 Image Pro",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image"],sizes:["1024x1024","1280x720","720x1280","2048x2048","3840x2160"]}},{id:"wanx2.1-t2i-turbo",name:"Wan 2.1 Text-to-Image Turbo",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image"],sizes:["1024x1024","720x1280","1280x720"]}},{id:"wan2.7-t2v-plus",name:"Wan 2.7 Text/Image-to-Video Plus",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:15,resolutions:["720P","1080P"]}},{id:"wanx2.1-t2v-turbo",name:"Wan 2.1 Text/Image-to-Video Turbo",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:5,resolutions:["480P","720P"]}},{id:"text-embedding-v4",name:"Text Embedding V4",contextWindow:8192,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"embedding",mediaCapabilities:{type:"embedding",dimensions:1024,maxTokens:8192}},{id:"sensevoice-v1",name:"SenseVoice V1",contextWindow:0,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"stt",mediaCapabilities:{type:"stt",languages:["zh","en","ja","ko","yue"],formats:["wav","mp3","m4a","flac","aac"]}},{id:"wanx-background-generation-v2",name:"Wan Background Generation V2",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"image",mediaCapabilities:{type:"image",operations:["inpainting"],sizes:["1024x1024","1280x720","720x1280"]}},{id:"qwen3-rerank",name:"Qwen3 Rerank",contextWindow:32768,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"rerank",mediaCapabilities:{type:"rerank",maxDocuments:100}}]},{id:"zhipu",name:"Zhipu GLM",group:"zhipu",transport:"anthropic-messages",baseUrl:"https://open.bigmodel.cn/api/anthropic",apiKeyEnvVars:["ZHIPU_API_KEY","GLM_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"glm-5.1",quirks:{filterThinkingBlocks:!0},models:[{id:"glm-5.1",name:"GLM-5.1",contextWindow:2e5,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:6,costOutput:24,costCacheRead:1.3},{id:"glm-5",name:"GLM-5",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:1,costOutput:3.2,costCacheRead:.2},{id:"glm-5-turbo",name:"GLM-5 Turbo",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:.5,costOutput:1,costCacheRead:.1},{id:"glm-4.7",name:"GLM-4.7",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:1,costOutput:3.2,costCacheRead:.2},{id:"glm-4.6",name:"GLM-4.6",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:1,costOutput:3.2,costCacheRead:.2},{id:"glm-4.5-air",name:"GLM-4.5 Air",contextWindow:131072,maxOutput:98304,toolCall:!0,reasoning:!0,vision:!1,costInput:.5,costOutput:1.5,costCacheRead:.1},{id:"glm-4-long",name:"GLM-4 Long",contextWindow:1e6,maxOutput:4096,toolCall:!0,reasoning:!1,vision:!1,costInput:.1,costOutput:.1},{id:"glm-4.7-flash",name:"GLM-4.7 Flash (Free)",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:0,costOutput:0},{id:"glm-4.5-flash",name:"GLM-4.5 Flash (Free)",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:0,costOutput:0},{id:"glm-5v-turbo",name:"GLM-5V Turbo",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!0,costInput:.5,costOutput:1},{id:"glm-4.6v",name:"GLM-4.6V",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!0,costInput:1,costOutput:3.2},{id:"glm-4.6v-flash",name:"GLM-4.6V Flash (Free)",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!1,vision:!0,costInput:0,costOutput:0},{id:"cogview-4-250304",name:"CogView-4",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image"],sizes:["1024x1024","768x1344","864x1152","1344x768","1152x864","1440x720","720x1440"]}},{id:"cogview-3-flash",name:"CogView-3 Flash (Free)",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image"],sizes:["1024x1024","768x1344","864x1152","1344x768","1152x864","1440x720","720x1440"]}},{id:"glm-image",name:"GLM-Image",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image"],sizes:["1280x1280","1568x1056","1056x1568","1472x1088","1088x1472","1728x960","960x1728"]}},{id:"cogvideox-3",name:"CogVideoX-3",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:10,resolutions:["1080p"]}},{id:"cogvideox-flash",name:"CogVideoX Flash (Free)",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:6}},{id:"glm-tts",name:"GLM-TTS",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"tts",mediaCapabilities:{type:"tts",operations:["text2speech"],voices:["tongtong","chuichui","xiaochen","jam","kazi","douji","luodo"],maxCharacters:1024,formats:["wav","pcm"]}},{id:"glm-tts-clone",name:"GLM-TTS Clone",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"voice_clone",mediaCapabilities:{type:"voice_clone",maxSampleDurationSeconds:30,maxSampleSizeMB:10,formats:["wav","mp3"]}},{id:"glm-asr-2512",name:"GLM-ASR-2512",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"stt",mediaCapabilities:{type:"stt",languages:["zh","en"],maxDurationSeconds:30,formats:["wav","mp3"]}},{id:"glm-4-voice",name:"GLM-4-Voice",contextWindow:128e3,maxOutput:16e3,toolCall:!1,reasoning:!1,vision:!1,mediaType:"realtime_audio",mediaCapabilities:{type:"realtime_audio",modalities:["text","audio"],vad:!0,toolCalling:!1}},{id:"glm-realtime-flash",name:"GLM Realtime Flash",contextWindow:128e3,maxOutput:16e3,toolCall:!1,reasoning:!1,vision:!0,mediaType:"realtime_video",mediaCapabilities:{type:"realtime_video",modalities:["text","audio","video"],vad:!0,toolCalling:!1}},{id:"glm-realtime-air",name:"GLM Realtime Air",contextWindow:128e3,maxOutput:16e3,toolCall:!1,reasoning:!1,vision:!0,mediaType:"realtime_video",mediaCapabilities:{type:"realtime_video",modalities:["text","audio","video"],vad:!0,toolCalling:!1}},{id:"embedding-3",name:"Embedding-3",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"embedding",mediaCapabilities:{type:"embedding",dimensions:2048,maxTokens:3072}},{id:"embedding-2",name:"Embedding-2",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"embedding",mediaCapabilities:{type:"embedding",dimensions:1024,maxTokens:512}},{id:"rerank",name:"GLM Rerank",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"rerank",mediaCapabilities:{type:"rerank",maxDocuments:128,maxQueryLength:4096,maxDocumentLength:4096}},{id:"glm-ocr",name:"GLM-OCR",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"document_parsing",mediaCapabilities:{type:"document_parsing",supportedFormats:["pdf","jpg","png"],maxPageCount:100,maxFileSizeMB:50}}]},{id:"zhipu-openai",name:"Zhipu GLM OpenAI",group:"zhipu",transport:"openai-chat",baseUrl:"https://open.bigmodel.cn/api/paas/v4",apiKeyEnvVars:["ZHIPU_API_KEY","GLM_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"glm-5.1",quirks:{supportsReasoningEffort:!0,supportsThinkingParam:!0,supportsToolStream:!0,builtinWebSearch:!0,builtinCodeInterpreter:!0},models:[{id:"glm-5.1",name:"GLM-5.1",contextWindow:2e5,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:6,costOutput:24,costCacheRead:1.3},{id:"glm-5",name:"GLM-5",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:1,costOutput:3.2,costCacheRead:.2},{id:"glm-5-turbo",name:"GLM-5 Turbo",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:.5,costOutput:1,costCacheRead:.1},{id:"glm-4.7",name:"GLM-4.7",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:1,costOutput:3.2,costCacheRead:.2},{id:"glm-4.6",name:"GLM-4.6",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:1,costOutput:3.2,costCacheRead:.2},{id:"glm-4.5-air",name:"GLM-4.5 Air",contextWindow:131072,maxOutput:98304,toolCall:!0,reasoning:!0,vision:!1,costInput:.5,costOutput:1.5,costCacheRead:.1},{id:"glm-4-long",name:"GLM-4 Long",contextWindow:1e6,maxOutput:4096,toolCall:!0,reasoning:!1,vision:!1,costInput:.1,costOutput:.1},{id:"glm-4.7-flash",name:"GLM-4.7 Flash (Free)",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:0,costOutput:0},{id:"glm-4.5-flash",name:"GLM-4.5 Flash (Free)",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:0,costOutput:0},{id:"glm-5v-turbo",name:"GLM-5V Turbo",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!0,costInput:.5,costOutput:1},{id:"glm-4.6v",name:"GLM-4.6V",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!0,costInput:1,costOutput:3.2},{id:"glm-4.6v-flash",name:"GLM-4.6V Flash (Free)",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!1,vision:!0,costInput:0,costOutput:0}]},{id:"zhipu-coding",name:"Zhipu GLM Coding",group:"zhipu",transport:"openai-chat",baseUrl:"https://open.bigmodel.cn/api/coding/paas/v4",apiKeyEnvVars:["ZHIPU_API_KEY","GLM_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"codegeex-4",quirks:{supportsReasoningEffort:!0,supportsThinkingParam:!0,supportsToolStream:!0},models:[{id:"codegeex-4",name:"CodeGeeX-4",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:.1,costOutput:.1}]},{id:"minimax",name:"MiniMax",group:"minimax",transport:"anthropic-messages",baseUrl:"https://api.minimaxi.com/anthropic",apiKeyEnvVars:["MINIMAX_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"MiniMax-M2.7",omitZeroTemperature:!0,quirks:{filterImageBlocks:!0},models:[{id:"MiniMax-M2.7",name:"MiniMax M2.7",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.3,costOutput:1.2,costCacheRead:.06,costCacheWrite:.375},{id:"MiniMax-M2.7-highspeed",name:"MiniMax M2.7 Highspeed",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.3,costOutput:1.2,costCacheRead:.06,costCacheWrite:.375},{id:"MiniMax-M2.5",name:"MiniMax M2.5",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.15,costOutput:.6,costCacheRead:.03,costCacheWrite:.19},{id:"MiniMax-M2.5-highspeed",name:"MiniMax M2.5 Highspeed",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.15,costOutput:.6,costCacheRead:.03,costCacheWrite:.19},{id:"MiniMax-M2.1",name:"MiniMax M2.1 (legacy)",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!1,vision:!1,costInput:.15,costOutput:.6},{id:"MiniMax-M2.1-highspeed",name:"MiniMax M2.1 Highspeed (legacy)",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!1,vision:!1,costInput:.15,costOutput:.6},{id:"MiniMax-M2",name:"MiniMax M2 (legacy)",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!1,vision:!1,costInput:.1,costOutput:.4},{id:"music-2.6",name:"MiniMax Music 2.6",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"music",mediaCapabilities:{type:"music",operations:["text2music"],maxDurationSeconds:300,formats:["mp3","wav"]}},{id:"music-cover",name:"MiniMax Music Cover",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"music",mediaCapabilities:{type:"music",operations:["cover"],maxDurationSeconds:300,formats:["mp3","wav"]}},{id:"MiniMax-Hailuo-2.3",name:"Hailuo 2.3",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:10,resolutions:["768P","1080P"]}},{id:"MiniMax-Hailuo-2.3-Fast",name:"Hailuo 2.3 Fast",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:10,resolutions:["768P","1080P"]}},{id:"MiniMax-Hailuo-02",name:"Hailuo 02",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:10,resolutions:["512P","768P","1080P"]}},{id:"image-01",name:"MiniMax Image 01",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image","img2img"],sizes:["512x512","1024x1024","2048x2048"]}},{id:"image-01-live",name:"MiniMax Image 01 Live",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image"],sizes:["1024x1024"]}},{id:"speech-2.8-hd",name:"MiniMax Speech 2.8 HD",contextWindow:1e4,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"tts",mediaCapabilities:{type:"tts",operations:["text2speech","voice_clone"],formats:["mp3","pcm","flac","wav","opus"]}},{id:"speech-2.8-turbo",name:"MiniMax Speech 2.8 Turbo",contextWindow:1e4,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"tts",mediaCapabilities:{type:"tts",operations:["text2speech","voice_clone"],formats:["mp3","pcm","flac","wav","opus"]}},{id:"voice-clone",aliases:["minimax-voice-clone"],name:"MiniMax Voice Clone",contextWindow:0,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"voice_clone",mediaCapabilities:{type:"voice_clone",maxSampleDurationSeconds:30,maxSampleSizeMB:20,formats:["mp3","wav","m4a"]}}]},{id:"minimax-openai",name:"MiniMax (OpenAI)",group:"minimax",transport:"openai-chat",baseUrl:"https://api.minimaxi.com/v1",apiKeyEnvVars:["MINIMAX_API_KEY"],authType:"bearer",isAggregator:!1,omitZeroTemperature:!0,defaultModel:"MiniMax-M2.7",quirks:{supportsReasoningSplit:!0},models:[{id:"MiniMax-M2.7",aliases:["minimax-m2.7"],name:"MiniMax M2.7",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.3,costOutput:1.2},{id:"MiniMax-M2.7-highspeed",name:"MiniMax M2.7 Highspeed",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.3,costOutput:1.2},{id:"MiniMax-M2.5",name:"MiniMax M2.5",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.15,costOutput:.6},{id:"MiniMax-M2.5-highspeed",name:"MiniMax M2.5 Highspeed",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.15,costOutput:.6},{id:"MiniMax-M2.1",name:"MiniMax M2.1 (legacy)",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!1,vision:!1,costInput:.15,costOutput:.6},{id:"MiniMax-M2.1-highspeed",name:"MiniMax M2.1 Highspeed (legacy)",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!1,vision:!1,costInput:.15,costOutput:.6}]},{id:"moonshot",name:"Moonshot (Kimi)",transport:"openai-chat",baseUrl:"https://api.moonshot.cn",apiKeyEnvVars:["MOONSHOT_API_KEY"],authType:"bearer",isAggregator:!1,omitZeroTemperature:!0,defaultModel:"kimi-k2.6",quirks:{supportsReasoningEffort:!0,supportsThinkingParam:!0,disableThinkingByDefault:!0,builtinWebSearch:!0},models:[{id:"kimi-k2.6",name:"Kimi K2.6",contextWindow:262144,maxOutput:262144,toolCall:!0,reasoning:!0,vision:!0,costInput:.95,costOutput:4,costCacheRead:.16},{id:"kimi-k2.5",name:"Kimi K2.5",contextWindow:262144,maxOutput:262144,toolCall:!0,reasoning:!0,vision:!0,costInput:.8,costOutput:4,costCacheRead:.2},{id:"moonshot-v1-128k",name:"Moonshot V1 128K",contextWindow:131072,maxOutput:8192,toolCall:!0,reasoning:!1,vision:!1,costInput:.84,costOutput:.84}]},{id:"volcengine",name:"Doubao / Volcengine",transport:"volcengine-responses",baseUrl:"https://ark.cn-beijing.volces.com/api",apiKeyEnvVars:["ARK_API_KEY","DOUBAO_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"doubao-seed-2-0-lite-260215",models:[{id:"doubao-seed-2-0-pro-260215",name:"Doubao Seed 2.0 Pro",contextWindow:262144,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!0,costInput:0,costOutput:0},{id:"doubao-seed-2-0-lite-260428",aliases:["doubao-seed-2-0-lite"],name:"Doubao Seed 2.0 Lite (0428)",contextWindow:262144,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!0,costInput:0,costOutput:0},{id:"doubao-seed-2-0-lite-260215",name:"Doubao Seed 2.0 Lite",contextWindow:262144,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!0,costInput:0,costOutput:0},{id:"doubao-seed-2-0-mini-260428",name:"Doubao Seed 2.0 Mini (0428)",contextWindow:262144,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!0,costInput:0,costOutput:0},{id:"doubao-seed-2-0-mini-260215",name:"Doubao Seed 2.0 Mini",contextWindow:262144,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!0,costInput:0,costOutput:0},{id:"doubao-seed-2-0-code-preview-260215",name:"Doubao Seed 2.0 Code Preview",contextWindow:262144,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!0,costInput:0,costOutput:0},{id:"doubao-seed-1-8-251228",name:"Doubao Seed 1.8",contextWindow:262144,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!0,costInput:0,costOutput:0},{id:"doubao-embedding-vision-251215",name:"Doubao Embedding Vision",contextWindow:8192,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"embedding",mediaCapabilities:{type:"embedding",dimensions:2048,maxTokens:8192}},{id:"doubao-seedance-2-0-260128",aliases:["doubao-seedance-2-0"],name:"Doubao Seedance 2.0",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video","video2video","edit","merge","upscale"],maxDurationSeconds:15,resolutions:["480p","720p","1080p"],aspectRatios:["16:9","9:16","1:1"],fps:[24]}},{id:"doubao-seedance-2-0-fast-260128",aliases:["doubao-seedance-2-0-fast"],name:"Doubao Seedance 2.0 Fast",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video","video2video","edit","merge","upscale"],maxDurationSeconds:15,resolutions:["480p","720p"],aspectRatios:["16:9","9:16","1:1"],fps:[24]}},{id:"doubao-seedream-5-0-260128",aliases:["doubao-seedream-5-0"],name:"Doubao Seedream 5.0",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image","img2img"],sizes:["2K"]}},{id:"doubao-seedream-4-5-251128",aliases:["doubao-seedream-4-5"],name:"Doubao Seedream 4.5",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image","img2img"],sizes:["2K"]}},{id:"doubao-seed3d-2-0-260328",aliases:["doubao-seed3d-2-0"],name:"Doubao Seed3D 2.0",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"3d",mediaCapabilities:{type:"3d",operations:["img2_3d"],outputFormats:["glb","obj","usd","usdz"]}},{id:"hyper3d-gen2-260112",aliases:["hyper3d-gen2"],name:"Hyper3D Gen2",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"3d",mediaCapabilities:{type:"3d",operations:["text2_3d","img2_3d"],outputFormats:["glb","obj"]}},{id:"hitem3d-2-0-251223",aliases:["hitem3d-2-0"],name:"HiTem3D 2.0",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"3d",mediaCapabilities:{type:"3d",operations:["img2_3d"],outputFormats:["glb","obj","usd"]}}]},{id:"openai",name:"OpenAI",transport:"openai-responses",baseUrl:"https://api.openai.com",apiKeyEnvVars:["OPENAI_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"gpt-5.5",quirks:{builtinWebSearch:!0,builtinCodeInterpreter:!0,builtinFileSearch:!0},models:[{id:"gpt-5.5",name:"GPT-5.5",contextWindow:105e4,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:5,costOutput:30,costCacheRead:.5},{id:"gpt-5.4",name:"GPT-5.4",contextWindow:105e4,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:2.5,costOutput:15,costCacheRead:.25},{id:"gpt-5.4-mini",name:"GPT-5.4 Mini",contextWindow:4e5,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:.75,costOutput:4.5,costCacheRead:.075},{id:"gpt-5.4-nano",name:"GPT-5.4 Nano",contextWindow:4e5,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:.2,costOutput:1.25,costCacheRead:.02},{id:"gpt-image-2",name:"GPT Image 2",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image","img2img","inpainting"],sizes:["1024x1024","1536x1024","1024x1536","auto"],transparentBackground:!0}},{id:"gpt-realtime-2",name:"GPT Realtime 2",contextWindow:128e3,maxOutput:16e3,toolCall:!0,reasoning:!0,vision:!1,mediaType:"realtime_audio",mediaCapabilities:{type:"realtime_audio",voices:["alloy","ash","ballad","coral","echo","fable","onyx","nova","sage","shimmer"],modalities:["text","audio"],vad:!0,toolCalling:!0}},{id:"gpt-realtime-translate",name:"GPT Realtime Translate",contextWindow:128e3,maxOutput:16e3,toolCall:!1,reasoning:!1,vision:!1,mediaType:"realtime_audio",mediaCapabilities:{type:"realtime_audio",voices:["alloy","ash","ballad","coral","echo","fable","onyx","nova","sage","shimmer"],modalities:["text","audio"],vad:!0,toolCalling:!1}},{id:"gpt-realtime-1.5",name:"GPT Realtime 1.5",contextWindow:128e3,maxOutput:16e3,toolCall:!0,reasoning:!1,vision:!1,mediaType:"realtime_audio",mediaCapabilities:{type:"realtime_audio",voices:["alloy","ash","ballad","coral","echo","fable","onyx","nova","sage","shimmer"],modalities:["text","audio"],vad:!0,toolCalling:!0}},{id:"gpt-realtime-mini",name:"GPT Realtime Mini",contextWindow:128e3,maxOutput:16e3,toolCall:!0,reasoning:!1,vision:!1,mediaType:"realtime_audio",mediaCapabilities:{type:"realtime_audio",voices:["alloy","ash","ballad","coral","echo","fable","onyx","nova","sage","shimmer"],modalities:["text","audio"],vad:!0,toolCalling:!0}}]},{id:"anthropic",name:"Anthropic",transport:"anthropic-messages",baseUrl:"https://api.anthropic.com",apiKeyEnvVars:["ANTHROPIC_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"claude-opus-4-7",quirks:{supportsDocumentVision:!0},models:[{id:"claude-opus-4-7",name:"Claude Opus 4.7",contextWindow:1e6,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:5,costOutput:25,costCacheRead:.5,costCacheWrite:6.25},{id:"claude-opus-4-6",name:"Claude Opus 4.6",contextWindow:1e6,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:5,costOutput:25,costCacheRead:.5,costCacheWrite:6.25},{id:"claude-sonnet-4-6",name:"Claude Sonnet 4.6",contextWindow:1e6,maxOutput:64e3,toolCall:!0,reasoning:!0,vision:!0,costInput:3,costOutput:15,costCacheRead:.3,costCacheWrite:3.75},{id:"claude-sonnet-4-5",name:"Claude Sonnet 4.5",contextWindow:2e5,maxOutput:64e3,toolCall:!0,reasoning:!0,vision:!0,costInput:3,costOutput:15,costCacheRead:.3,costCacheWrite:3.75},{id:"claude-haiku-4-5",name:"Claude Haiku 4.5",contextWindow:2e5,maxOutput:64e3,toolCall:!0,reasoning:!0,vision:!0,costInput:1,costOutput:5,costCacheRead:.1,costCacheWrite:1.25}]},{id:"google",name:"Google Gemini",transport:"gemini-generatecontent",baseUrl:"https://generativelanguage.googleapis.com/v1beta",apiKeyEnvVars:["GOOGLE_API_KEY","GEMINI_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"gemini-3-flash-preview",quirks:{builtinWebSearch:!0,builtinCodeInterpreter:!0,builtinUrlContext:!0,builtinMapsGrounding:!0,builtinFileSearch:!0,supportsDocumentVision:!0},models:[{id:"gemini-3.1-pro-preview",name:"Gemini 3.1 Pro",contextWindow:1048576,maxOutput:65536,toolCall:!0,reasoning:!0,reasoningRequired:!0,vision:!0,costInput:2,costOutput:12},{id:"gemini-3-flash-preview",name:"Gemini 3 Flash",contextWindow:1048576,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!0,costInput:.5,costOutput:3},{id:"gemini-3.1-flash-lite",name:"Gemini 3.1 Flash-Lite",contextWindow:1048576,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!0,costInput:.25,costOutput:1.5},{id:"gemini-3.1-flash-image-preview",name:"Gemini 3.1 Flash Image (Nano Banana 2)",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image","img2img"],sizes:["1024x1024"]}},{id:"gemini-3-pro-image-preview",name:"Gemini 3 Pro Image (Nano Banana Pro)",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image","img2img"],sizes:["1024x1024"]}},{id:"veo-3.1-generate-preview",name:"Veo 3.1 Standard",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:8,resolutions:["720P","1080P","4K"]}},{id:"veo-3.1-fast-generate-preview",name:"Veo 3.1 Fast",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:8,resolutions:["720P","1080P","4K"]}},{id:"veo-3.1-lite-generate-preview",name:"Veo 3.1 Lite",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:8,resolutions:["720P","1080P"]}},{id:"lyria-3-pro-preview",name:"Lyria 3 Pro",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"music",mediaCapabilities:{type:"music",operations:["text2music"],maxDurationSeconds:300,formats:["mp3"]}},{id:"lyria-3-clip-preview",name:"Lyria 3 Clip",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"music",mediaCapabilities:{type:"music",operations:["text2music"],maxDurationSeconds:30,formats:["mp3"]}},{id:"lyria-realtime-exp",name:"Lyria RealTime (Experimental)",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"music_realtime",mediaCapabilities:{type:"music",operations:["realtime"],formats:["wav"]}},{id:"gemini-3.1-flash-tts-preview",name:"Gemini 3.1 Flash TTS",contextWindow:8192,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:1,costOutput:20,mediaType:"tts",mediaCapabilities:{type:"tts",operations:["text2speech"],maxCharacters:8e3,formats:["mp3","wav"]}},{id:"gemini-embedding-2",name:"Gemini Embedding 2 (Multimodal)",contextWindow:8192,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:.2,costOutput:0,mediaType:"embedding",mediaCapabilities:{type:"embedding",dimensions:3072,maxTokens:8192}}]},{id:"openrouter",name:"OpenRouter",transport:"openai-chat",baseUrl:"https://openrouter.ai/api",apiKeyEnvVars:["OPENROUTER_API_KEY"],authType:"bearer",isAggregator:!0,defaultModel:"anthropic/claude-opus-4.7",extraHeaders:{"HTTP-Referer":"https://claw.bot","X-Title":"XiaozhiClaw"},models:[{id:"anthropic/claude-opus-4.7",name:"Claude Opus 4.7 (via OpenRouter)",contextWindow:1e6,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:5,costOutput:25,costCacheRead:.5},{id:"anthropic/claude-opus-4.6",name:"Claude Opus 4.6 (via OpenRouter)",contextWindow:1e6,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:5,costOutput:25,costCacheRead:.5},{id:"deepseek/deepseek-v4-flash",name:"DeepSeek V4 Flash (via OpenRouter)",contextWindow:1048576,maxOutput:393216,toolCall:!0,reasoning:!0,vision:!1,costInput:.14,costOutput:.28,costCacheRead:.028}]},{id:"qwen-coding",name:"Alibaba Qwen (Coding Plan)",transport:"anthropic-messages",baseUrl:"https://coding.dashscope.aliyuncs.com/apps/anthropic",apiKeyEnvVars:["DASHSCOPE_API_KEY","QWEN_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"qwen3-coder-plus",models:[{id:"qwen3-coder-plus",name:"Qwen3 Coder Plus (Coding Plan)",contextWindow:262144,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!1},{id:"qwen3-coder-flash",name:"Qwen3 Coder Flash (Coding Plan)",contextWindow:262144,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!1}]}];import{existsSync as Mi,mkdirSync as Ri,readFileSync as Ei,writeFileSync as Ai}from"node:fs";import{join as Ii}from"node:path";var Oi="https://models.dev/api.json",Ui=3e4,Pi=1440*60*1e3,Li=300*1e3,Eo={deepseek:"deepseek",qwen:"qwen","qwen-coding-plan":"qwen-coding","alibaba-cn":"qwen",zhipuai:"zhipu",minimax:"minimax",moonshot:"moonshot",moonshotai:"moonshot","moonshotai-cn":"moonshot",doubao:"volcengine","bytedance-seed":"volcengine",volcengine:"volcengine",openai:"openai",anthropic:"anthropic",google:"google",openrouter:"openrouter"},ce=class{cache=null;cacheDir;cacheFile;ttlMs;fetching=!1;lastFetchAttempt=0;constructor(e){this.cacheDir=e?.cacheDir??Q(),this.cacheFile=Ii(this.cacheDir,"model_catalog.json"),this.ttlMs=e?.ttlMs??Pi}getModels(e){this.ensureLoaded();let o=this.cache?.providers.get(e);return o?[...o.models.values()]:[]}getModel(e,o){return this.ensureLoaded(),this.cache?.providers.get(e)?.models.get(o)}listProviderIds(){return this.ensureLoaded(),this.cache?[...this.cache.providers.keys()]:[]}getEmbeddingModels(e){return this.ensureLoaded(),this.cache?.embeddingModels.get(e)??[]}getDefaultEmbeddingModel(e){let o=this.getEmbeddingModels(e);return o.filter(i=>i.dimensions>=512)[0]??o[0]}getAllEmbeddingModels(){return this.ensureLoaded(),this.cache?.embeddingModels??new Map}async refreshCatalog(){return this.fetchRemote()}ensureLoaded(){this.cache&&!this.isStale()||(this.cache||this.loadFromDisk(),(!this.cache||this.isStale())&&this.backgroundFetch())}isStale(){return this.cache?Date.now()-this.cache.fetchedAt>this.ttlMs:!0}loadFromDisk(){try{if(!Mi(this.cacheFile))return;let e=Ei(this.cacheFile,"utf8"),o=JSON.parse(e);if(!o.fetchedAt||!o.data)return;this.cache={fetchedAt:o.fetchedAt,providers:Mo(o.data),embeddingModels:Ro(o.data)}}catch{}}saveToDisk(e){try{Ri(this.cacheDir,{recursive:!0});let o=JSON.stringify({fetchedAt:Date.now(),data:e},null,0);Ai(this.cacheFile,o,"utf8")}catch{}}backgroundFetch(){this.fetching||Date.now()-this.lastFetchAttempt<Li||(this.fetching=!0,this.fetchRemote().finally(()=>{this.fetching=!1}))}async fetchRemote(){this.lastFetchAttempt=Date.now();try{let e=await fetch(Oi,{signal:AbortSignal.timeout(Ui),headers:{Accept:"application/json"}});if(!e.ok)return!1;let o=await e.json(),n=Mo(o);return n.size===0?!1:(this.cache={fetchedAt:Date.now(),providers:n,embeddingModels:Ro(o)},this.saveToDisk(o),!0)}catch{return!1}}};function Mo(t){let e=new Map;if(!t||typeof t!="object")return e;for(let[o,n]of Object.entries(t)){let i=Eo[o];if(!i||!n||typeof n!="object")continue;let a=n.models;if(!a||typeof a!="object")continue;let r=e.get(i);r||(r={models:new Map},e.set(i,r));for(let[u,g]of Object.entries(a)){if(!g||typeof g!="object"||r.models.has(u))continue;let p=g,f=typeof p.family=="string"?p.family:"";if(Ao(f,u)||u.toLowerCase().includes("reranker"))continue;let T=p.cost??{},y=p.limit??{},w=p.modalities??{},_=Array.isArray(w.input)?w.input:[],k=Array.isArray(w.output)?w.output:[],P=Di(k,_,u);r.models.set(u,{id:u,name:typeof p.name=="string"?p.name:u,contextWindow:typeof y.context=="number"?y.context:2e5,maxOutput:typeof y.output=="number"?y.output:8192,toolCall:p.tool_call===!0,reasoning:p.reasoning===!0,vision:p.attachment===!0||_.includes("image"),costInput:typeof T.input=="number"?T.input:void 0,costOutput:typeof T.output=="number"?T.output:void 0,costCacheRead:typeof T.cache_read=="number"?T.cache_read:void 0,costCacheWrite:typeof T.cache_write=="number"?T.cache_write:void 0,mediaType:P})}}return e}function Di(t,e,o){if(t.includes("video"))return"video";if(t.includes("image")&&!t.includes("text"))return"image";if(t.includes("audio")&&!t.includes("text"))return"tts";if(t.includes("3d"))return"3d";if(e.includes("video")&&t.includes("text"))return"video_understanding";let n=o.toLowerCase();if(n.includes("tts")||n.includes("speech")||n.includes("cosyvoice"))return"tts";if(n.includes("music")||n.includes("suno"))return"music";if(n.includes("seedream")||n.includes("image")||n.includes("dall"))return"image";if(n.includes("seedance")||n.includes("video"))return"video"}var $i={qwen:[{id:"text-embedding-v3",name:"Text Embedding v3",providerId:"qwen",dimensions:1024,maxInputTokens:8192,costInput:.7,family:"text-embedding"},{id:"text-embedding-v2",name:"Text Embedding v2",providerId:"qwen",dimensions:1536,maxInputTokens:2048,costInput:.7,family:"text-embedding"}],zhipu:[{id:"embedding-3",name:"Embedding-3",providerId:"zhipu",dimensions:2048,maxInputTokens:8192,costInput:.5,family:"text-embedding"},{id:"embedding-2",name:"Embedding-2",providerId:"zhipu",dimensions:1024,maxInputTokens:512,costInput:.5,family:"text-embedding"}],minimax:[{id:"embo-01",name:"embo-01",providerId:"minimax",dimensions:1536,maxInputTokens:4096,costInput:.5,family:"text-embedding"}],volcengine:[{id:"doubao-embedding-vision-251215",name:"Doubao Embedding Vision (Latest)",providerId:"volcengine",dimensions:1024,maxInputTokens:128e3,costInput:.5,family:"text-embedding"},{id:"doubao-embedding-vision-250615",name:"Doubao Embedding Vision",providerId:"volcengine",dimensions:1024,maxInputTokens:128e3,costInput:.5,family:"text-embedding"}],google:[{id:"text-embedding-004",name:"Text Embedding 004",providerId:"google",dimensions:768,maxInputTokens:2048,costInput:.025,family:"text-embedding"},{id:"gemini-embedding-001",name:"Gemini Embedding",providerId:"google",dimensions:3072,maxInputTokens:8192,costInput:0,family:"text-embedding"}]},Ni=new Set(["text-embedding","bge","cohere-embed","plamo"]),Fi=[/embed/i,/^bge-/i,/^gte-/i,/^e5-/i,/multi-qa-/i];function Ao(t,e){return t&&Ni.has(t)?!0:Fi.some(o=>o.test(e))}function Ro(t){let e=new Map;if(!t||typeof t!="object")return e;for(let[o,n]of Object.entries(t)){let i=Eo[o];if(!i||!n||typeof n!="object")continue;let a=n.models;if(!(!a||typeof a!="object"))for(let[r,u]of Object.entries(a)){if(!u||typeof u!="object")continue;let g=u,p=typeof g.family=="string"?g.family:"";if(!Ao(p,r)||r.toLowerCase().includes("reranker"))continue;let f=g.limit??{},T=g.cost??{},y=typeof f.output=="number"?f.output:0,w=typeof f.context=="number"?f.context:512;if(y<=1)continue;let _={id:r,name:typeof g.name=="string"?g.name:r,providerId:i,dimensions:y,maxInputTokens:w,costInput:typeof T.input=="number"?T.input:void 0,family:p},k=e.get(i);k||(k=[],e.set(i,k)),k.push(_)}}for(let o of e.values())o.sort((n,i)=>{let s=n.costInput??0,a=i.costInput??0;return s!==a?s-a:i.dimensions-n.dimensions});for(let[o,n]of Object.entries($i)){let i=e.get(o);(!i||i.length===0)&&e.set(o,[...n])}return e}var Bi={claude:"anthropic",gemini:"google",doubao:"volcengine"},ue=class{builtins=new Map;catalog;overrides=new Map;constructor(e){for(let o of Tt)this.builtins.set(o.id,o);this.catalog=e?.catalog??new ce}applyOverride(e,o){this.overrides.set(e,{...this.overrides.get(e),...o})}getProvider(e){let o=Bi[e]??e,n=this.builtins.get(o),i=this.overrides.get(o);if(!(!n&&!i))return!n&&i?!i.id||!i.transport||!i.baseUrl?void 0:{id:i.id,name:i.name??i.id,transport:i.transport,baseUrl:i.baseUrl,apiKeyEnvVars:i.apiKeyEnvVars??[],authType:i.authType??"bearer",isAggregator:i.isAggregator??!1,defaultModel:i.defaultModel,models:i.models}:n&&!i?n:{...n,...i,models:i.models??n.models}}listProviders(){let e=new Map;for(let[o,n]of this.builtins)e.set(o,n);for(let[o]of this.overrides){let n=this.getProvider(o);n&&e.set(o,n)}return[...e.values()]}listModels(e){let n=this.getProvider(e)?.models??[],i=this.catalog.getModels(e);if(i.length===0)return n;let s=new Map;for(let a of i)s.set(a.id,a);for(let a of n)s.set(a.id,a);return[...s.values()]}getModelInfo(e,o){return this.listModels(e).find(n=>n.id===o)}async refreshCatalog(){return this.catalog.refreshCatalog()}resolveApiKey(e,o){if(o)return o;let n=this.getProvider(e);if(n)for(let i of n.apiKeyEnvVars){let s=process.env[i];if(s?.trim())return s.trim()}}};var de=class{registry;constructor(e){this.registry=e}resolve(e){let o=e.publicModel.trim();if(!o)return[];let n=e.userPreference?.providerIds?new Set(e.userPreference.providerIds):void 0,i=ji(e.requestedProtocol),s=e.capabilities??[],a=[];for(let r of this.registry.listProviders())if(!(n&&!n.has(r.id))&&!(i&&r.transport!==i))for(let u of this.registry.listModels(r.id)){let g=Wi(u,o);if(!g)continue;let p=Hi(r,u);if(s.some(_=>!p.includes(_)))continue;let f=Gi(r,u),T=r.billingChannelKind??zi(f),y=Vi({matchKind:g,requestedTransport:i,requiredCapabilities:s,preferProviderId:e.userPreference?.preferProviderId,preferVariantKind:e.userPreference?.preferVariantKind,purpose:e.purpose,provider:r,variantKind:f,capabilities:p}),w=Ki({matchKind:g,requestedTransport:i,requiredCapabilities:s,preferProviderId:e.userPreference?.preferProviderId,preferVariantKind:e.userPreference?.preferVariantKind,purpose:e.purpose,provider:r,variantKind:f,capabilities:p});a.push({provider:r.id,group:r.group??r.id,publicModel:o,nativeModelId:u.id,displayName:u.name,transport:r.transport,variantKind:f,billingChannelKind:T,capabilities:p,score:w,reasons:y,providerDef:r,modelInfo:u})}return a.sort((r,u)=>u.score!==r.score?u.score-r.score:r.group!==u.group?r.group.localeCompare(u.group):r.provider.localeCompare(u.provider))}resolveBest(e){return this.resolve(e)[0]}};function ji(t){if(t)return t==="openai"?"openai-chat":t==="anthropic"?"anthropic-messages":t}function Wi(t,e){return Io(t.id,e)?"exact":(t.aliases??[]).some(o=>Io(o,e))?"alias":void 0}function Io(t,e){return t.trim().toLowerCase()===e.trim().toLowerCase()}function Gi(t,e){return t.variantKind?t.variantKind:e.mediaType==="realtime_audio"||e.mediaType==="realtime_video"?"realtime":e.mediaType?"media-plan":t.id.includes("coding")||e.id.toLowerCase().includes("coder")||e.id.toLowerCase().includes("codegeex")?"coding-plan":t.transport==="openai-chat"||t.transport==="openai-responses"||t.transport==="volcengine-responses"?"openai-compatible":t.transport==="anthropic-messages"?"anthropic-compatible":"standard"}function zi(t){return t==="coding-plan"||t==="media-plan"?"plan":"paygo"}function Hi(t,e){let o=new Set(t.capabilities??[]);return e.reasoning&&o.add("thinking"),e.vision&&o.add("vision"),e.mediaType&&o.add("media"),(e.mediaType==="realtime_audio"||e.mediaType==="realtime_video")&&o.add("realtime"),e.toolCall&&t.quirks?.supportsToolStream&&o.add("tool_stream"),t.quirks?.supportsReasoningSplit&&o.add("reasoning_split"),(t.quirks?.builtinWebSearch||t.quirks?.builtinCodeInterpreter||t.quirks?.builtinUrlContext)&&o.add("builtin_tools"),(t.id.includes("coding")||e.id.toLowerCase().includes("coder")||e.id.toLowerCase().includes("codegeex"))&&o.add("coding"),[...o].sort()}function Ki(t){let e=100;return e+=t.matchKind==="exact"?25:15,t.requestedTransport&&t.provider.transport===t.requestedTransport&&(e+=20),e+=t.requiredCapabilities.length*15,t.preferProviderId&&t.provider.id===t.preferProviderId&&(e+=50),t.preferVariantKind&&t.variantKind===t.preferVariantKind&&(e+=35),t.purpose==="textGeneration"&&!t.capabilities.includes("media")&&(e+=5),t.purpose==="imageGeneration"&&t.capabilities.includes("media")&&(e+=10),t.purpose==="videoGeneration"&&t.capabilities.includes("media")&&(e+=10),t.capabilities.includes("tool_stream")&&(e+=8),t.capabilities.includes("reasoning_split")&&(e+=8),t.variantKind==="coding-plan"&&(e+=t.provider.id.includes("coding")?12:5),e}function Vi(t){let e=[t.matchKind==="exact"?"model id matched":"public alias matched"];t.requestedTransport&&e.push(`protocol ${t.requestedTransport} matched`);for(let o of t.requiredCapabilities)e.push(`capability ${o} matched`);return t.preferProviderId&&t.provider.id===t.preferProviderId&&e.push("preferred provider matched"),t.preferVariantKind&&t.variantKind===t.preferVariantKind&&e.push("preferred variant matched"),e}var vl=20*1024*1024;import{createHmac as sc,randomUUID as rc}from"node:crypto";import{join as Ac}from"node:path";import{mkdirSync as Oc,appendFileSync as Uc}from"node:fs";var Lc=So();import{mkdir as es,writeFile as ts}from"fs/promises";import{join as Oo}from"path";import{tmpdir as os}from"os";var ns="tool-results",Uo="<persisted-output>",is="</persisted-output>";function Po(){return{seenIds:new Set,replacements:new Map}}function Lo(t){return Oo(os(),"qlogicagent-sessions",t,ns)}async function ss(t){try{await es(Lo(t),{recursive:!0})}catch{}}function rs(t,e){let o=e.replace(/[^a-zA-Z0-9_-]/g,"_");return Oo(Lo(t),`${o}.txt`)}function as(t,e){if(t.length<=e)return{preview:t,hasMore:!1};let n=t.slice(0,e).lastIndexOf(`
|
|
9
|
-
`),i=n>e*.5?n:e;return{preview:t.slice(0,i),hasMore:!0}}function
|
|
7
|
+
[...truncated: ${t.length-e} chars omitted]`}function ze(...t){return{compress(e,o){let n=e,i=0,s=[];for(let l of t){let r=l.compress(n,o);n=r.messages,i+=r.droppedCount,r.droppedCount>0&&s.push(r.strategy)}return{messages:n,droppedCount:i,strategy:s.length>0?s.join("+"):"none"}}}}var zt={modelContextWindow:128e3,targetUsageRatio:.75,minBudget:16e3,maxBudget:12e4};function He(t={}){let e={...zt,...t},o=Math.floor(e.modelContextWindow*e.targetUsageRatio);return Math.max(e.minBudget,Math.min(o,e.maxBudget))}function Ke(t,e){let o=t/e;return o<=.8?"none":o<=1?"trim-only":o<=1.5?"sliding-window":"llm-summarize"}var ie=class{events=[];maxEvents;constructor(e=100){this.maxEvents=e}record(e){this.events.push(e),this.events.length>this.maxEvents&&this.events.shift()}snapshot(){let e=this.events.length;if(e===0)return{totalCompressions:0,totalLlmCalls:0,totalCacheInvalidations:0,averageCompressionRatio:1,averageLatencyMs:0,totalTokensSaved:0,recentEvents:[]};let o=0,n=0,i=0,s=0,l=0;for(let r of this.events)o+=r.tokensBefore>0?r.tokensAfter/r.tokensBefore:1,n+=r.latencyMs,i+=Math.max(0,r.tokensBefore-r.tokensAfter),r.usedLlm&&s++,r.cacheInvalidated&&l++;return{totalCompressions:e,totalLlmCalls:s,totalCacheInvalidations:l,averageCompressionRatio:o/e,averageLatencyMs:n/e,totalTokensSaved:i,recentEvents:this.events.slice(-10)}}reset(){this.events.length=0}},se=class{engines=new Map;activeId;register(e){this.engines.set(e.id,e)}activate(e){return this.engines.has(e)?(this.activeId=e,!0):!1}getActive(){return this.activeId?this.engines.get(this.activeId):void 0}listEngines(){return Array.from(this.engines.values()).map(e=>({id:e.id,label:e.label,active:e.id===this.activeId}))}};function Ht(t){let e=typeof t.content=="string"?t.content:t.content!=null?JSON.stringify(t.content):"";return Math.ceil(e.length/4)}var Pn=new Set(["file_read","read","Read","bash","shell","Bash","grep","search","Grep","grep_search","glob","Glob","file_search","web_search","WebSearch","web_fetch","WebFetch","file_edit","edit","Edit","file_write","write","Write"]),X=class{constructor(e=20,o=Ht){this.preserveRecentCount=e;this.estimateTokens=o}preserveRecentCount;estimateTokens;compress(e,o){if(e.length<=this.preserveRecentCount)return{messages:e,droppedCount:0,strategy:"micro-compact"};let n=e.length-this.preserveRecentCount,i=0,s=0;return{messages:e.map((r,d)=>{if(d>=n||r.role!=="tool"||typeof r.content!="string"||!r.name||!Pn.has(r.name)||r.content.length<=200)return r;let h=this.estimateTokens(r);return s+=h,i++,{...r,content:`[result cleared \u2014 ${r.content.length} chars]`}}),droppedCount:i,strategy:"micro-compact",metrics:i>0?{tokensBefore:0,tokensAfter:0,compressionRatio:0,latencyMs:0,usedLlm:!1,cacheInvalidated:!1}:void 0}}};function Ve(t,e,o=Ht){if(e.size===0)return{messages:t,tokensFreed:0,removedCount:0};let n=0,i=0,s=[];for(let r of t){let d=r.tool_call_id??"";if(d&&e.has(d)){n+=o(r),i++,e.delete(d);continue}s.push(r)}let l=i>0?{role:"system",content:`[${i} messages removed by snip]`}:void 0;return{messages:s,tokensFreed:n,removedCount:i,boundaryMessage:l}}function Xe(){return{stages:[]}}function Ye(t,e,o){let n=o?.thresholdMessages??40;if(t.filter(r=>r.role!=="system").length<=n)return{messages:t,stagedCount:0};let s=Kt(t,e),l=Ln(s,e,n);if(l.length===0)return{messages:s,stagedCount:0};for(let r of l)e.stages.push(r);return s=Kt(t,e),{messages:s,stagedCount:l.length}}function Je(t,e){let o=0;for(let n of e.stages)n.committed||(n.committed=!0,o++);return o===0?{messages:t,committed:0}:{messages:Vt(t,e),committed:o}}function Kt(t,e){return e.stages.filter(n=>n.committed).length===0?t:Vt(t,e)}function Vt(t,e){let o=e.stages.filter(i=>i.committed).sort((i,s)=>s.range[0]-i.range[0]),n=[...t];for(let i of o){let[s,l]=i.range;if(s>=n.length)continue;let r=Math.min(l,n.length),d={role:"system",content:i.summary};n.splice(s,r-s,d)}return n}function Ln(t,e,o){let n=Math.max(0,t.length-Math.floor(o/2)),i=[],s=new Set(e.stages.map(d=>`${d.range[0]}-${d.range[1]}`)),l=-1,r=0;for(let d=0;d<n;d++){let h=t[d];if(h.role==="tool"||h.role==="assistant"&&typeof h.content=="string"&&h.content==="")l<0&&(l=d),r++;else{if(r>=3){let g=`${l}-${l+r}`;s.has(g)||i.push({id:`collapse_${l}_${l+r}`,range:[l,l+r],summary:`[${r} tool results collapsed]`,committed:!1})}l=-1,r=0}}if(r>=3){let d=`${l}-${l+r}`;s.has(d)||i.push({id:`collapse_${l}_${l+r}`,range:[l,l+r],summary:`[${r} tool results collapsed]`,committed:!1})}return i}import{existsSync as qe,readFileSync as ho,writeFileSync as $n,readdirSync as yo,mkdirSync as Dn}from"node:fs";import{join as et,dirname as Nn}from"node:path";var Xt=Math.min(Math.max(1,Number(process.env.TOOL_LOOP_DEFAULT_BUDGET)||25),100),Yt=3,Jt=2,_e=2,Qt=128e3,Zt=13e3,qt=16384,eo=65536,to=3,oo=65536,Qe=500,no=3,io=5e4,so=2e5,Ze=2e3,ro=3e4,ao=3,re=2;var lo=20;var co=3,uo=2,po=300*1e3,mo=3,fo=720*60*60*1e3;var Fs=300*1e3;var Bs=3600*1e3;var Ws=50*1024,js=500*1024,Gs=500*1024*1024,zs=50*1024*1024;var Hs=60*1024;var bo=0;var Fn="skill-patterns.json";function To(t){return et(t,".qlogicagent",Fn)}function Bn(t){let e=To(t);try{return JSON.parse(ho(e,"utf8"))}catch{return{version:1,patterns:{}}}}function go(t,e){let o=To(t);Dn(Nn(o),{recursive:!0}),$n(o,JSON.stringify(e,null,2),"utf8")}function Wn(t){let e=Date.now()-fo;for(let[o,n]of Object.entries(t.patterns))new Date(n.lastSeen).getTime()<e&&delete t.patterns[o]}function _o(t,e){if(e.length===0)return!1;let o=xe(e),n=Bn(t);Wn(n);let i=new Date().toISOString(),s=n.patterns[o];if(s||(s={signature:o,count:0,firstSeen:i,lastSeen:i,promoted:!1},n.patterns[o]=s),s.promoted)return go(t,n),!1;s.count++,s.lastSeen=i;let l=s.count>=mo;return l&&(s.promoted=!0),go(t,n),l}function xe(t){return[...t].sort().join("+")}function jn(t,e){if(!qe(e))return null;let o=xe(t);try{let n=yo(e,{withFileTypes:!0});for(let i of n){if(!i.isDirectory())continue;let s=et(e,i.name,"SKILL.md");try{let r=ho(s,"utf8").match(/^tools:\s*\n((?:\s+-\s+\S+\n?)+)/m);if(r){let d=r[1].split(`
|
|
8
|
+
`).map(h=>h.replace(/^\s*-\s*/,"").trim()).filter(Boolean);if(xe(d)===o)return i.name}}catch{}}}catch{}return null}function Gn(t){if(!qe(t))return 0;try{return yo(t,{withFileTypes:!0}).filter(e=>e.isDirectory()&&qe(et(t,e.name,"SKILL.md"))).length}catch{return 0}}function zn(t,e){return!(!t.ok||t.existingSkillName||!t.multiStep||t.toolCallCount<co||t.distinctToolCount<uo||Date.now()-bo<po||e?.projectSkillsDir&&(Gn(e.projectSkillsDir)>=lo||e.tools.length>0&&jn(e.tools,e.projectSkillsDir))||e?.projectRoot&&e.tools.length>0&&!_o(e.projectRoot,e.tools))}function Hn(t){return t.existingSkillName?t.feedback==="negative":!1}function ke(t,e){return Hn(t)?{type:"skill.improve",skillName:t.existingSkillName,reason:"negative user feedback on existing skill execution"}:zn(t,e)?(bo=Date.now(),{type:"skill.create",suggestedName:e.suggestedName??`auto-skill-${e.tools.slice(0,3).join("-")}`,description:`Multi-step orchestration using ${e.tools.join(", ")}`,tools:e.tools,stepCount:t.toolCallCount}):null}function xo(t){return t.function&&typeof t.function=="object"&&typeof t.function.name=="string"?t.function.name.trim():typeof t.name=="string"?t.name.trim():""}function Kn(t){return t==="enabled-eligible"||t==="installed-awaiting-approval"}function Vn(t){return new Map((t??[]).map(e=>[e.toolName,e]))}function Xn(t){if(!t.eligibility?.length)return[...t.tools];let e=Vn(t.eligibility);return t.tools.filter(o=>{let n=xo(o);if(!n)return!1;let i=e.get(n);return!i||Kn(i.status)})}function Yn(t){let e=[],o=t.compatibility??{},n=t.toolChoice;if(t.thinkingEnabled&&o.requireAutoWhenThinking){let i=typeof n=="object"&&n&&!Array.isArray(n)?String(n.type??""):n;i&&i!=="auto"&&i!=="none"&&(e.push("tool_choice downgraded to auto because thinking mode requires auto/none compatibility."),n="auto")}if(n==="required"&&o.allowRequiredToolChoice===!1){let i=o.requiredFallback??"auto";e.push(`tool_choice=required is not supported by this provider; downgraded to ${i}.`),n=i}if(n&&typeof n=="object"&&!Array.isArray(n)&&n.type==="function"&&o.allowNamedToolChoice===!1){let i=o.namedFallback??"required";e.push(`named tool_choice is not supported by this provider; downgraded to ${i}.`),n=i}return{normalizedToolChoice:n,warnings:e}}function tt(t){let e=Yn({toolChoice:t.toolChoice,thinkingEnabled:t.thinkingEnabled,compatibility:t.compatibility}),o=e.normalizedToolChoice,n=[...e.warnings],i=Xn({tools:t.tools,eligibility:t.eligibility});if(!o||o==="auto")return{tools:i,normalizedToolChoice:o,warnings:n};if(o==="none")return{tools:[],normalizedToolChoice:"none",warnings:n};if(o==="required"){if(i.length===0)throw new Error("tool_choice=required but no tools were provided");return{tools:i,normalizedToolChoice:"required",extraSystemPrompt:"You must call one of the available tools before responding.",warnings:n}}if(typeof o=="object"&&!Array.isArray(o)&&o.type==="function"){let s=o.function??void 0,l=typeof s?.name=="string"?s.name.trim():"";if(!l)throw new Error("tool_choice.function.name is required");let r=i.filter(d=>xo(d)===l);if(r.length===0)throw new Error(`tool_choice requested unknown tool: ${l}`);return{tools:r,normalizedToolChoice:{type:"function",function:{name:l}},extraSystemPrompt:`You must call the ${l} tool before responding.`,warnings:n}}return{tools:i,normalizedToolChoice:o,warnings:n}}var Jn=["stop","aborted","timeout","cancelled","interrupted","error"],Qn=["tool_calls","toolCalls","function_call","functionCall","raw_tool_calls","rawToolCalls"];function ko(t){return t==null?[]:typeof t=="string"?t.length>0?[{type:"text",text:t}]:[]:Array.isArray(t)?t:[{type:"text",text:String(t)}]}function Zn(t,e){return{...t,content:[...ko(t.content),...ko(e.content)]}}function qn(t){if(!t||typeof t!="object")return!1;if(t.function&&typeof t.function=="object"){let e=t.function.name;if(typeof e=="string"&&e.length>0)return!0}return typeof t.name=="string"&&t.name.length>0}function ei(t){return new Set((t??Jn).map(e=>e.trim().toLowerCase()))}function ti(t,e){return t?ei(e).has(t.trim().toLowerCase()):!1}function ot(t){if(!Array.isArray(t)||t.length===0)return[...t];let e=t.map(r=>{if(r.role==="assistant"&&Array.isArray(r.tool_calls)){let d=r.tool_calls.filter(h=>qn(h));return{...r,...d.length>0?{tool_calls:d}:{tool_calls:void 0}}}return{...r}}),o=new Set;for(let r of e)if(!(r.role!=="assistant"||!Array.isArray(r.tool_calls)))for(let d of r.tool_calls)typeof d.id=="string"&&d.id&&o.add(d.id);let n=e.filter(r=>r.role!=="tool"?!0:!!(r.tool_call_id&&o.has(r.tool_call_id))),i=new Set;for(let r of n)r.role==="tool"&&typeof r.tool_call_id=="string"&&r.tool_call_id&&i.add(r.tool_call_id);let s=[];for(let r of n){if(r.role==="assistant"&&Array.isArray(r.tool_calls)&&r.tool_calls.length>0){let d=r.tool_calls.filter(h=>typeof h.id=="string"&&i.has(h.id));if(d.length===0){let{tool_calls:h,...m}=r;m.content!=null&&m.content!==""&&s.push(m);continue}if(d.length<r.tool_calls.length){s.push({...r,tool_calls:d});continue}}s.push(r)}let l=[];for(let r of s){let d=l.length>0?l[l.length-1]:void 0;if(r.role==="user"&&d?.role==="user"){l[l.length-1]=Zn(d,r);continue}l.push(r)}return l}function nt(t,e){return ti(e?.stopReason,e?.forcedStopReasons)?t.map(o=>{if(o.role!=="assistant")return{...o};let n={...o};for(let i of Qn)delete n[i];return n}):[...t]}function it(t,e){let o=e?.placeholderToolResult??"Error: Tool loop interrupted before the tool result was replayed.",n=new Set;for(let s of t)s.role==="tool"&&typeof s.tool_call_id=="string"&&s.tool_call_id&&n.add(s.tool_call_id);let i=[];for(let s of t)if(i.push({...s}),!(s.role!=="assistant"||!Array.isArray(s.tool_calls)||s.tool_calls.length===0))for(let l of s.tool_calls)typeof l.id!="string"||!l.id||n.has(l.id)||(n.add(l.id),i.push({role:"tool",tool_call_id:l.id,content:o}));return i}function st(t,e){let o=ot(t),n=nt(o,e);return it(n,e)}function oi(t){let e=new Set,o=new Set;for(let n of t){if(n.role==="assistant"&&Array.isArray(n.tool_calls))for(let i of n.tool_calls)typeof i.id=="string"&&i.id&&e.add(i.id);n.role==="tool"&&typeof n.tool_call_id=="string"&&n.tool_call_id&&o.add(n.tool_call_id)}return[...e].filter(n=>!o.has(n))}function ni(t){let e=new Set;for(let o of t)o.role==="tool"&&typeof o.tool_call_id=="string"&&o.tool_call_id&&e.add(o.tool_call_id);return[...e]}function ii(t){return{round:t.round??0,maxRounds:t.maxRounds,pendingToolCallIds:[...t.pendingToolCallIds??[]],completedToolCallIds:[...t.completedToolCallIds??[]],lastStopReason:t.lastStopReason,replayMessages:[...t.replayMessages??[]]}}function rt(t,e){return{round:t.round+1,maxRounds:t.maxRounds,pendingToolCallIds:[...e.pendingToolCallIds??t.pendingToolCallIds],completedToolCallIds:[...e.completedToolCallIds??t.completedToolCallIds],lastStopReason:e.lastStopReason??t.lastStopReason,replayMessages:[...e.replayMessages??t.replayMessages]}}function we(t,e){return{round:t.round,maxRounds:t.maxRounds,pendingToolCallIds:[],completedToolCallIds:[...e.completedToolCallIds??t.completedToolCallIds],lastStopReason:e.lastStopReason??t.lastStopReason,replayMessages:[...e.replayMessages??t.replayMessages]}}function Ce(t){let e=[],o=ot(t.replayMessages);o.length!==t.replayMessages.length&&e.push({kind:"drop-orphan-tool-result",detail:"Removed orphan tool results or invalid assistant tool calls."});let n=nt(o,t.options);n.some((s,l)=>s!==o[l])&&e.push({kind:"strip-forced-stop-tool-metadata",detail:"Removed assistant tool-call metadata after forced stop."});let i=it(n,t.options);return i.length>n.length&&e.push({kind:"inject-placeholder-tool-result",detail:"Injected placeholder tool result for pending tool calls."}),{state:ii({maxRounds:t.maxRounds,round:t.round,lastStopReason:t.lastStopReason,replayMessages:i,pendingToolCallIds:oi(i),completedToolCallIds:ni(i)}),recoveryActions:e}}var si=new Set(["main","sdk","agent","compact","hook","verification","side_question"]);function at(t){return t?si.has(t):!0}function lt(t){return t===429||t===529}function Se(t,e=500,o=32e3){let n=Math.min(e*Math.pow(2,t-1),o);return n+Math.floor(Math.random()*n*.25)}var nr={maxBackoffMs:300*1e3,resetCapMs:360*60*1e3,heartbeatIntervalMs:3e4};function ve(){let t=process.env.QLOGICAGENT_PERSISTENT_RETRY;return t==="1"||t==="true"}var ae=class extends Error{constructor(o,n){super(`Model fallback triggered: ${o} -> ${n}`);this.originalModel=o;this.fallbackModel=n;this.name="FallbackTriggeredError"}originalModel;fallbackModel};function ct(t){return{promptTokens:0,hasAttemptedReactiveCompact:!1,currentMaxOutputTokens:t.maxOutputTokens,consecutiveTruncations:0,aborted:t.abortSignal?.aborted??!1}}function ut(t,e){if(t.aborted)return{level:"blocking",usagePercent:100,reason:"budget_exhausted"};let o=e.contextWindowTokens-e.responseBufferTokens-t.currentMaxOutputTokens,n=o>0?t.promptTokens/o*100:100;return t.promptTokens>=o?t.hasAttemptedReactiveCompact||!e.reactiveCompactEnabled?{level:"blocking",usagePercent:n,reason:"prompt_too_long"}:{level:"blocking",usagePercent:n,reason:"prompt_too_long"}:n>=85?{level:"warning",usagePercent:n,remainingTokens:o-t.promptTokens}:{level:"ok"}}function dt(t,e,o){let n=t.message?.toLowerCase()??"",i=t.status??0;return i===413||n.includes("prompt_too_long")||n.includes("context_length_exceeded")?!e.hasAttemptedReactiveCompact&&o.reactiveCompactEnabled?{action:"reactive_compact"}:{action:"abort",reason:"prompt_too_long_unrecoverable"}:i>=500&&i<600?{action:"retry",reason:`server_error_${i}`}:i===429?{action:"retry",reason:"rate_limited"}:i===401||i===403?{action:"abort",reason:"auth_error"}:i===404?{action:"abort",reason:"model_not_found"}:{action:"abort",reason:n||"unknown_error"}}function pt(t,e,o){if(!e.outputEscalationEnabled)return{shouldEscalate:!1,newMax:t.currentMaxOutputTokens};if(t.consecutiveTruncations>=3)return{shouldEscalate:!1,newMax:t.currentMaxOutputTokens};let n=Math.min(t.currentMaxOutputTokens*2,o);return n<=t.currentMaxOutputTokens?{shouldEscalate:!1,newMax:t.currentMaxOutputTokens}:{shouldEscalate:!0,newMax:n}}function mt(t,e){return t.aborted?!0:e.abortSignal?.aborted?(t.aborted=!0,!0):!1}var ai={maxConsecutiveFailures:3,minMessagesAfterCompact:4,targetUsagePercent:50};function ft(){return{consecutiveFailures:0,attemptedThisTurn:!1,lastCompactAt:null,toolsAtLastCompact:[]}}function J(t,e=ai){return!(t.attemptedThisTurn||t.consecutiveFailures>=e.maxConsecutiveFailures)}function gt(t,e){let o=t.get(e.index);o||(o={id:"",name:"",arguments:""},t.set(e.index,o)),e.id&&(o.id=e.id),e.name&&(o.name+=e.name),o.arguments+=e.arguments}import{writeFileSync as ta,mkdirSync as oa}from"node:fs";import{join as ia}from"node:path";import{randomUUID as ra}from"node:crypto";import{join as wo}from"node:path";import{homedir as fi,tmpdir as gi}from"node:os";function hi(){return process.env.QLOGICAGENT_HOME??wo(fi()||gi(),".qlogicagent")}function Co(){return process.env.QLOGICAGENT_DEBUG_LOG_DIR??wo(hi(),"debug-logs")}import{writeFileSync as _a,mkdirSync as xa}from"node:fs";import{join as wa}from"node:path";import{randomUUID as Sa}from"node:crypto";import{writeFileSync as da,mkdirSync as pa}from"node:fs";import{join as fa}from"node:path";import{randomUUID as ha}from"node:crypto";import{writeFileSync as Ia,mkdirSync as Oa}from"node:fs";import{join as Pa}from"node:path";import{randomUUID as $a}from"node:crypto";var yt=[{id:"deepseek",name:"DeepSeek",transport:"anthropic-messages",baseUrl:"https://api.deepseek.com/anthropic",apiKeyEnvVars:["DEEPSEEK_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"deepseek-v4-flash",quirks:{useEffortInsteadOfBudget:!0,filterImageBlocks:!0,maxReasoningEffort:"max",supportsPrefixCompletion:!0,supportsThinkingParam:!0,disableThinkingByDefault:!0},models:[{id:"deepseek-v4-flash",name:"DeepSeek V4 Flash",contextWindow:1e6,maxOutput:384e3,toolCall:!0,reasoning:!0,vision:!1,costInput:.14,costOutput:.28,costCacheRead:.0028},{id:"deepseek-v4-pro",name:"DeepSeek V4 Pro",contextWindow:1e6,maxOutput:384e3,toolCall:!0,reasoning:!0,vision:!1,costInput:1.74,costOutput:3.48,costCacheRead:.0145}]},{id:"qwen",name:"Alibaba Qwen (DashScope)",transport:"anthropic-messages",baseUrl:"https://dashscope.aliyuncs.com/apps/anthropic",apiKeyEnvVars:["DASHSCOPE_API_KEY","QWEN_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"qwen3.6-plus",quirks:{supportsThinkingParam:!0,disableThinkingByDefault:!0},models:[{id:"qwen3.6-max-preview",name:"Qwen3.6 Max (Preview)",contextWindow:1e6,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!0,costInput:2,costOutput:8,costCacheRead:.2,costCacheWrite:2.5},{id:"qwen3.6-plus",name:"Qwen3.6 Plus",contextWindow:1e6,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!0,costInput:.5,costOutput:3,costCacheRead:.05,costCacheWrite:.625},{id:"qwen3.6-flash",name:"Qwen3.6 Flash",contextWindow:1e6,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!0,costInput:.1,costOutput:.5,costCacheRead:.01,costCacheWrite:.125},{id:"qwq-plus",name:"QwQ Plus",contextWindow:131072,maxOutput:65536,toolCall:!0,reasoning:!0,reasoningRequired:!0,streamRequired:!0,vision:!1,costInput:.5,costOutput:3,costCacheRead:.05,costCacheWrite:.625},{id:"qwen-max",name:"Qwen Max",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:2,costOutput:6,costCacheRead:.2,costCacheWrite:2.5},{id:"qwen-plus",name:"Qwen Plus",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:.3,costOutput:.85,costCacheRead:.03,costCacheWrite:.375},{id:"qwen-flash",name:"Qwen Flash",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1},{id:"qwen-turbo",name:"Qwen Turbo",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!1,vision:!1},{id:"qwen-vl-max",name:"Qwen VL Max",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!1,vision:!0,costInput:3,costOutput:8.5},{id:"qwen3.5-omni-plus",name:"Qwen3.5 Omni Plus",contextWindow:131072,maxOutput:16384,toolCall:!1,reasoning:!1,streamRequired:!0,vision:!0},{id:"qwen3.5-omni-plus-realtime",name:"Qwen3.5 Omni Plus Realtime",contextWindow:131072,maxOutput:16384,toolCall:!1,reasoning:!1,streamRequired:!0,vision:!0,mediaType:"realtime_audio",mediaCapabilities:{type:"realtime_audio",modalities:["text","audio"],vad:!0,toolCalling:!1}},{id:"qwen-vl-ocr",name:"Qwen VL OCR",contextWindow:131072,maxOutput:4096,toolCall:!1,reasoning:!1,vision:!0,mediaType:"document_parsing",mediaCapabilities:{type:"document_parsing",supportedFormats:["jpg","jpeg","png","bmp","tiff","pdf"],maxFileSizeMB:10}},{id:"qwen3-tts-flash",name:"Qwen3 TTS Flash",contextWindow:32768,maxOutput:16384,toolCall:!1,reasoning:!1,vision:!1,mediaType:"tts",mediaCapabilities:{type:"tts",operations:["text2speech","voice_clone"],maxCharacters:32768,formats:["mp3","wav"]}},{id:"cosyvoice-v2",name:"CosyVoice V2",contextWindow:1e4,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"tts",mediaCapabilities:{type:"tts",operations:["text2speech","voice_clone"],maxCharacters:1e4,formats:["mp3","wav","pcm"]}},{id:"wan2.7-image-pro",name:"Wan 2.7 Image Pro",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image"],sizes:["1024x1024","1280x720","720x1280","2048x2048","3840x2160"]}},{id:"wanx2.1-t2i-turbo",name:"Wan 2.1 Text-to-Image Turbo",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image"],sizes:["1024x1024","720x1280","1280x720"]}},{id:"wan2.7-t2v-plus",name:"Wan 2.7 Text/Image-to-Video Plus",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:15,resolutions:["720P","1080P"]}},{id:"wanx2.1-t2v-turbo",name:"Wan 2.1 Text/Image-to-Video Turbo",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:5,resolutions:["480P","720P"]}},{id:"text-embedding-v4",name:"Text Embedding V4",contextWindow:8192,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"embedding",mediaCapabilities:{type:"embedding",dimensions:1024,maxTokens:8192}},{id:"sensevoice-v1",name:"SenseVoice V1",contextWindow:0,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"stt",mediaCapabilities:{type:"stt",languages:["zh","en","ja","ko","yue"],formats:["wav","mp3","m4a","flac","aac"]}},{id:"wanx-background-generation-v2",name:"Wan Background Generation V2",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"image",mediaCapabilities:{type:"image",operations:["inpainting"],sizes:["1024x1024","1280x720","720x1280"]}},{id:"qwen3-rerank",name:"Qwen3 Rerank",contextWindow:32768,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"rerank",mediaCapabilities:{type:"rerank",maxDocuments:100}}]},{id:"zhipu",name:"Zhipu GLM",group:"zhipu",transport:"anthropic-messages",baseUrl:"https://open.bigmodel.cn/api/anthropic",apiKeyEnvVars:["ZHIPU_API_KEY","GLM_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"glm-5.1",quirks:{filterThinkingBlocks:!0},models:[{id:"glm-5.1",name:"GLM-5.1",contextWindow:2e5,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:6,costOutput:24,costCacheRead:1.3},{id:"glm-5",name:"GLM-5",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:1,costOutput:3.2,costCacheRead:.2},{id:"glm-5-turbo",name:"GLM-5 Turbo",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:.5,costOutput:1,costCacheRead:.1},{id:"glm-4.7",name:"GLM-4.7",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:1,costOutput:3.2,costCacheRead:.2},{id:"glm-4.6",name:"GLM-4.6",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:1,costOutput:3.2,costCacheRead:.2},{id:"glm-4.5-air",name:"GLM-4.5 Air",contextWindow:131072,maxOutput:98304,toolCall:!0,reasoning:!0,vision:!1,costInput:.5,costOutput:1.5,costCacheRead:.1},{id:"glm-4-long",name:"GLM-4 Long",contextWindow:1e6,maxOutput:4096,toolCall:!0,reasoning:!1,vision:!1,costInput:.1,costOutput:.1},{id:"glm-4.7-flash",name:"GLM-4.7 Flash (Free)",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:0,costOutput:0},{id:"glm-4.5-flash",name:"GLM-4.5 Flash (Free)",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:0,costOutput:0},{id:"glm-5v-turbo",name:"GLM-5V Turbo",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!0,costInput:.5,costOutput:1},{id:"glm-4.6v",name:"GLM-4.6V",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!0,costInput:1,costOutput:3.2},{id:"glm-4.6v-flash",name:"GLM-4.6V Flash (Free)",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!1,vision:!0,costInput:0,costOutput:0},{id:"cogview-4-250304",name:"CogView-4",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image"],sizes:["1024x1024","768x1344","864x1152","1344x768","1152x864","1440x720","720x1440"]}},{id:"cogview-3-flash",name:"CogView-3 Flash (Free)",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image"],sizes:["1024x1024","768x1344","864x1152","1344x768","1152x864","1440x720","720x1440"]}},{id:"glm-image",name:"GLM-Image",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image"],sizes:["1280x1280","1568x1056","1056x1568","1472x1088","1088x1472","1728x960","960x1728"]}},{id:"cogvideox-3",name:"CogVideoX-3",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:10,resolutions:["1080p"]}},{id:"cogvideox-flash",name:"CogVideoX Flash (Free)",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:6}},{id:"glm-tts",name:"GLM-TTS",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"tts",mediaCapabilities:{type:"tts",operations:["text2speech"],voices:["tongtong","chuichui","xiaochen","jam","kazi","douji","luodo"],maxCharacters:1024,formats:["wav","pcm"]}},{id:"glm-tts-clone",name:"GLM-TTS Clone",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"voice_clone",mediaCapabilities:{type:"voice_clone",maxSampleDurationSeconds:30,maxSampleSizeMB:10,formats:["wav","mp3"]}},{id:"glm-asr-2512",name:"GLM-ASR-2512",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"stt",mediaCapabilities:{type:"stt",languages:["zh","en"],maxDurationSeconds:30,formats:["wav","mp3"]}},{id:"glm-4-voice",name:"GLM-4-Voice",contextWindow:128e3,maxOutput:16e3,toolCall:!1,reasoning:!1,vision:!1,mediaType:"realtime_audio",mediaCapabilities:{type:"realtime_audio",modalities:["text","audio"],vad:!0,toolCalling:!1}},{id:"glm-realtime-flash",name:"GLM Realtime Flash",contextWindow:128e3,maxOutput:16e3,toolCall:!1,reasoning:!1,vision:!0,mediaType:"realtime_video",mediaCapabilities:{type:"realtime_video",modalities:["text","audio","video"],vad:!0,toolCalling:!1}},{id:"glm-realtime-air",name:"GLM Realtime Air",contextWindow:128e3,maxOutput:16e3,toolCall:!1,reasoning:!1,vision:!0,mediaType:"realtime_video",mediaCapabilities:{type:"realtime_video",modalities:["text","audio","video"],vad:!0,toolCalling:!1}},{id:"embedding-3",name:"Embedding-3",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"embedding",mediaCapabilities:{type:"embedding",dimensions:2048,maxTokens:3072}},{id:"embedding-2",name:"Embedding-2",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"embedding",mediaCapabilities:{type:"embedding",dimensions:1024,maxTokens:512}},{id:"rerank",name:"GLM Rerank",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"rerank",mediaCapabilities:{type:"rerank",maxDocuments:128,maxQueryLength:4096,maxDocumentLength:4096}},{id:"glm-ocr",name:"GLM-OCR",contextWindow:0,maxOutput:0,toolCall:!1,reasoning:!1,vision:!1,mediaType:"document_parsing",mediaCapabilities:{type:"document_parsing",supportedFormats:["pdf","jpg","png"],maxPageCount:100,maxFileSizeMB:50}}]},{id:"zhipu-openai",name:"Zhipu GLM OpenAI",group:"zhipu",transport:"openai-chat",baseUrl:"https://open.bigmodel.cn/api/paas/v4",apiKeyEnvVars:["ZHIPU_API_KEY","GLM_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"glm-5.1",quirks:{supportsReasoningEffort:!0,supportsThinkingParam:!0,supportsToolStream:!0,builtinWebSearch:!0,builtinCodeInterpreter:!0},models:[{id:"glm-5.1",name:"GLM-5.1",contextWindow:2e5,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:6,costOutput:24,costCacheRead:1.3},{id:"glm-5",name:"GLM-5",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:1,costOutput:3.2,costCacheRead:.2},{id:"glm-5-turbo",name:"GLM-5 Turbo",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:.5,costOutput:1,costCacheRead:.1},{id:"glm-4.7",name:"GLM-4.7",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:1,costOutput:3.2,costCacheRead:.2},{id:"glm-4.6",name:"GLM-4.6",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:1,costOutput:3.2,costCacheRead:.2},{id:"glm-4.5-air",name:"GLM-4.5 Air",contextWindow:131072,maxOutput:98304,toolCall:!0,reasoning:!0,vision:!1,costInput:.5,costOutput:1.5,costCacheRead:.1},{id:"glm-4-long",name:"GLM-4 Long",contextWindow:1e6,maxOutput:4096,toolCall:!0,reasoning:!1,vision:!1,costInput:.1,costOutput:.1},{id:"glm-4.7-flash",name:"GLM-4.7 Flash (Free)",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:0,costOutput:0},{id:"glm-4.5-flash",name:"GLM-4.5 Flash (Free)",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:0,costOutput:0},{id:"glm-5v-turbo",name:"GLM-5V Turbo",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!0,costInput:.5,costOutput:1},{id:"glm-4.6v",name:"GLM-4.6V",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!0,costInput:1,costOutput:3.2},{id:"glm-4.6v-flash",name:"GLM-4.6V Flash (Free)",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!1,vision:!0,costInput:0,costOutput:0}]},{id:"zhipu-coding",name:"Zhipu GLM Coding",group:"zhipu",transport:"openai-chat",baseUrl:"https://open.bigmodel.cn/api/coding/paas/v4",apiKeyEnvVars:["ZHIPU_API_KEY","GLM_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"codegeex-4",quirks:{supportsReasoningEffort:!0,supportsThinkingParam:!0,supportsToolStream:!0},models:[{id:"codegeex-4",name:"CodeGeeX-4",contextWindow:131072,maxOutput:16384,toolCall:!0,reasoning:!0,vision:!1,costInput:.1,costOutput:.1}]},{id:"minimax",name:"MiniMax",group:"minimax",transport:"anthropic-messages",baseUrl:"https://api.minimaxi.com/anthropic",apiKeyEnvVars:["MINIMAX_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"MiniMax-M2.7",omitZeroTemperature:!0,quirks:{filterImageBlocks:!0},models:[{id:"MiniMax-M2.7",name:"MiniMax M2.7",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.3,costOutput:1.2,costCacheRead:.06,costCacheWrite:.375},{id:"MiniMax-M2.7-highspeed",name:"MiniMax M2.7 Highspeed",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.3,costOutput:1.2,costCacheRead:.06,costCacheWrite:.375},{id:"MiniMax-M2.5",name:"MiniMax M2.5",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.15,costOutput:.6,costCacheRead:.03,costCacheWrite:.19},{id:"MiniMax-M2.5-highspeed",name:"MiniMax M2.5 Highspeed",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.15,costOutput:.6,costCacheRead:.03,costCacheWrite:.19},{id:"MiniMax-M2.1",name:"MiniMax M2.1 (legacy)",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!1,vision:!1,costInput:.15,costOutput:.6},{id:"MiniMax-M2.1-highspeed",name:"MiniMax M2.1 Highspeed (legacy)",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!1,vision:!1,costInput:.15,costOutput:.6},{id:"MiniMax-M2",name:"MiniMax M2 (legacy)",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!1,vision:!1,costInput:.1,costOutput:.4},{id:"music-2.6",name:"MiniMax Music 2.6",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"music",mediaCapabilities:{type:"music",operations:["text2music"],maxDurationSeconds:300,formats:["mp3","wav"]}},{id:"music-cover",name:"MiniMax Music Cover",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"music",mediaCapabilities:{type:"music",operations:["cover"],maxDurationSeconds:300,formats:["mp3","wav"]}},{id:"MiniMax-Hailuo-2.3",name:"Hailuo 2.3",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:10,resolutions:["768P","1080P"]}},{id:"MiniMax-Hailuo-2.3-Fast",name:"Hailuo 2.3 Fast",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:10,resolutions:["768P","1080P"]}},{id:"MiniMax-Hailuo-02",name:"Hailuo 02",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:10,resolutions:["512P","768P","1080P"]}},{id:"image-01",name:"MiniMax Image 01",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image","img2img"],sizes:["512x512","1024x1024","2048x2048"]}},{id:"image-01-live",name:"MiniMax Image 01 Live",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image"],sizes:["1024x1024"]}},{id:"speech-2.8-hd",name:"MiniMax Speech 2.8 HD",contextWindow:1e4,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"tts",mediaCapabilities:{type:"tts",operations:["text2speech","voice_clone"],formats:["mp3","pcm","flac","wav","opus"]}},{id:"speech-2.8-turbo",name:"MiniMax Speech 2.8 Turbo",contextWindow:1e4,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"tts",mediaCapabilities:{type:"tts",operations:["text2speech","voice_clone"],formats:["mp3","pcm","flac","wav","opus"]}},{id:"voice-clone",aliases:["minimax-voice-clone"],name:"MiniMax Voice Clone",contextWindow:0,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:0,costOutput:0,mediaType:"voice_clone",mediaCapabilities:{type:"voice_clone",maxSampleDurationSeconds:30,maxSampleSizeMB:20,formats:["mp3","wav","m4a"]}}]},{id:"minimax-openai",name:"MiniMax (OpenAI)",group:"minimax",transport:"openai-chat",baseUrl:"https://api.minimaxi.com/v1",apiKeyEnvVars:["MINIMAX_API_KEY"],authType:"bearer",isAggregator:!1,omitZeroTemperature:!0,defaultModel:"MiniMax-M2.7",quirks:{supportsReasoningSplit:!0},models:[{id:"MiniMax-M2.7",aliases:["minimax-m2.7"],name:"MiniMax M2.7",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.3,costOutput:1.2},{id:"MiniMax-M2.7-highspeed",name:"MiniMax M2.7 Highspeed",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.3,costOutput:1.2},{id:"MiniMax-M2.5",name:"MiniMax M2.5",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.15,costOutput:.6},{id:"MiniMax-M2.5-highspeed",name:"MiniMax M2.5 Highspeed",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!1,costInput:.15,costOutput:.6},{id:"MiniMax-M2.1",name:"MiniMax M2.1 (legacy)",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!1,vision:!1,costInput:.15,costOutput:.6},{id:"MiniMax-M2.1-highspeed",name:"MiniMax M2.1 Highspeed (legacy)",contextWindow:204800,maxOutput:131072,toolCall:!0,reasoning:!1,vision:!1,costInput:.15,costOutput:.6}]},{id:"moonshot",name:"Moonshot (Kimi)",transport:"openai-chat",baseUrl:"https://api.moonshot.cn",apiKeyEnvVars:["MOONSHOT_API_KEY"],authType:"bearer",isAggregator:!1,omitZeroTemperature:!0,defaultModel:"kimi-k2.6",quirks:{supportsReasoningEffort:!0,supportsThinkingParam:!0,disableThinkingByDefault:!0,builtinWebSearch:!0},models:[{id:"kimi-k2.6",name:"Kimi K2.6",contextWindow:262144,maxOutput:262144,toolCall:!0,reasoning:!0,vision:!0,costInput:.95,costOutput:4,costCacheRead:.16},{id:"kimi-k2.5",name:"Kimi K2.5",contextWindow:262144,maxOutput:262144,toolCall:!0,reasoning:!0,vision:!0,costInput:.8,costOutput:4,costCacheRead:.2},{id:"moonshot-v1-128k",name:"Moonshot V1 128K",contextWindow:131072,maxOutput:8192,toolCall:!0,reasoning:!1,vision:!1,costInput:.84,costOutput:.84}]},{id:"volcengine",name:"Doubao / Volcengine",transport:"volcengine-responses",baseUrl:"https://ark.cn-beijing.volces.com/api",apiKeyEnvVars:["ARK_API_KEY","DOUBAO_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"doubao-seed-2-0-lite-260428",models:[{id:"doubao-seed-2-0-pro-260215",aliases:["doubao-seed-2-0-pro"],name:"Doubao Seed 2.0 Pro",contextWindow:262144,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!0,costInput:0,costOutput:0},{id:"doubao-seed-2-0-lite-260428",aliases:["doubao-seed-2-0-lite"],name:"Doubao Seed 2.0 Lite",contextWindow:262144,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!0,costInput:0,costOutput:0},{id:"doubao-seed-2-0-mini-260428",aliases:["doubao-seed-2-0-mini"],name:"Doubao Seed 2.0 Mini",contextWindow:262144,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!0,costInput:0,costOutput:0},{id:"doubao-seed-2-0-code-preview-260215",aliases:["doubao-seed-2-0-code-preview"],name:"Doubao Seed 2.0 Code Preview",contextWindow:262144,maxOutput:131072,toolCall:!0,reasoning:!0,vision:!0,costInput:0,costOutput:0},{id:"doubao-seed-1-8-251228",name:"Doubao Seed 1.8",contextWindow:262144,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!0,costInput:0,costOutput:0},{id:"doubao-embedding-vision-251215",name:"Doubao Embedding Vision",contextWindow:8192,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"embedding",mediaCapabilities:{type:"embedding",dimensions:2048,maxTokens:8192}},{id:"doubao-seedance-2-0-260128",aliases:["doubao-seedance-2-0"],name:"Doubao Seedance 2.0",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video","video2video","edit","merge","upscale"],maxDurationSeconds:15,resolutions:["480p","720p","1080p"],aspectRatios:["16:9","9:16","1:1"],fps:[24]}},{id:"doubao-seedance-2-0-fast-260128",aliases:["doubao-seedance-2-0-fast"],name:"Doubao Seedance 2.0 Fast",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video","video2video","edit","merge","upscale"],maxDurationSeconds:15,resolutions:["480p","720p"],aspectRatios:["16:9","9:16","1:1"],fps:[24]}},{id:"doubao-seedream-5-0-260128",aliases:["doubao-seedream-5-0"],name:"Doubao Seedream 5.0",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image","img2img"],sizes:["2K"]}},{id:"doubao-seedream-4-5-251128",aliases:["doubao-seedream-4-5"],name:"Doubao Seedream 4.5",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image","img2img"],sizes:["2K"]}},{id:"doubao-seed3d-2-0-260328",aliases:["doubao-seed3d-2-0"],name:"Doubao Seed3D 2.0",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"3d",mediaCapabilities:{type:"3d",operations:["img2_3d"],outputFormats:["glb","obj","usd","usdz"]}},{id:"hyper3d-gen2-260112",aliases:["hyper3d-gen2"],name:"Hyper3D Gen2",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"3d",mediaCapabilities:{type:"3d",operations:["text2_3d","img2_3d"],outputFormats:["glb","obj"]}},{id:"hitem3d-2-0-251223",aliases:["hitem3d-2-0"],name:"HiTem3D 2.0",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"3d",mediaCapabilities:{type:"3d",operations:["img2_3d"],outputFormats:["glb","obj","usd"]}}]},{id:"openai",name:"OpenAI",transport:"openai-responses",baseUrl:"https://api.openai.com",apiKeyEnvVars:["OPENAI_API_KEY"],authType:"bearer",isAggregator:!1,defaultModel:"gpt-5.5",quirks:{builtinWebSearch:!0,builtinCodeInterpreter:!0,builtinFileSearch:!0},models:[{id:"gpt-5.5",name:"GPT-5.5",contextWindow:105e4,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:5,costOutput:30,costCacheRead:.5},{id:"gpt-5.4",name:"GPT-5.4",contextWindow:105e4,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:2.5,costOutput:15,costCacheRead:.25},{id:"gpt-5.4-mini",name:"GPT-5.4 Mini",contextWindow:4e5,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:.75,costOutput:4.5,costCacheRead:.075},{id:"gpt-5.4-nano",name:"GPT-5.4 Nano",contextWindow:4e5,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:.2,costOutput:1.25,costCacheRead:.02},{id:"gpt-image-2",name:"GPT Image 2",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image","img2img","inpainting"],sizes:["1024x1024","1536x1024","1024x1536","auto"],transparentBackground:!0}},{id:"gpt-realtime-2",name:"GPT Realtime 2",contextWindow:128e3,maxOutput:16e3,toolCall:!0,reasoning:!0,vision:!1,mediaType:"realtime_audio",mediaCapabilities:{type:"realtime_audio",voices:["alloy","ash","ballad","coral","echo","fable","onyx","nova","sage","shimmer"],modalities:["text","audio"],vad:!0,toolCalling:!0}},{id:"gpt-realtime-translate",name:"GPT Realtime Translate",contextWindow:128e3,maxOutput:16e3,toolCall:!1,reasoning:!1,vision:!1,mediaType:"realtime_audio",mediaCapabilities:{type:"realtime_audio",voices:["alloy","ash","ballad","coral","echo","fable","onyx","nova","sage","shimmer"],modalities:["text","audio"],vad:!0,toolCalling:!1}},{id:"gpt-realtime-1.5",name:"GPT Realtime 1.5",contextWindow:128e3,maxOutput:16e3,toolCall:!0,reasoning:!1,vision:!1,mediaType:"realtime_audio",mediaCapabilities:{type:"realtime_audio",voices:["alloy","ash","ballad","coral","echo","fable","onyx","nova","sage","shimmer"],modalities:["text","audio"],vad:!0,toolCalling:!0}},{id:"gpt-realtime-mini",name:"GPT Realtime Mini",contextWindow:128e3,maxOutput:16e3,toolCall:!0,reasoning:!1,vision:!1,mediaType:"realtime_audio",mediaCapabilities:{type:"realtime_audio",voices:["alloy","ash","ballad","coral","echo","fable","onyx","nova","sage","shimmer"],modalities:["text","audio"],vad:!0,toolCalling:!0}}]},{id:"anthropic",name:"Anthropic",transport:"anthropic-messages",baseUrl:"https://api.anthropic.com",apiKeyEnvVars:["ANTHROPIC_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"claude-opus-4-7",quirks:{supportsDocumentVision:!0},models:[{id:"claude-opus-4-7",name:"Claude Opus 4.7",contextWindow:1e6,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:5,costOutput:25,costCacheRead:.5,costCacheWrite:6.25},{id:"claude-opus-4-6",name:"Claude Opus 4.6",contextWindow:1e6,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:5,costOutput:25,costCacheRead:.5,costCacheWrite:6.25},{id:"claude-sonnet-4-6",name:"Claude Sonnet 4.6",contextWindow:1e6,maxOutput:64e3,toolCall:!0,reasoning:!0,vision:!0,costInput:3,costOutput:15,costCacheRead:.3,costCacheWrite:3.75},{id:"claude-sonnet-4-5",name:"Claude Sonnet 4.5",contextWindow:2e5,maxOutput:64e3,toolCall:!0,reasoning:!0,vision:!0,costInput:3,costOutput:15,costCacheRead:.3,costCacheWrite:3.75},{id:"claude-haiku-4-5",name:"Claude Haiku 4.5",contextWindow:2e5,maxOutput:64e3,toolCall:!0,reasoning:!0,vision:!0,costInput:1,costOutput:5,costCacheRead:.1,costCacheWrite:1.25}]},{id:"google",name:"Google Gemini",transport:"gemini-generatecontent",baseUrl:"https://generativelanguage.googleapis.com/v1beta",apiKeyEnvVars:["GOOGLE_API_KEY","GEMINI_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"gemini-3-flash-preview",quirks:{builtinWebSearch:!0,builtinCodeInterpreter:!0,builtinUrlContext:!0,builtinMapsGrounding:!0,builtinFileSearch:!0,supportsDocumentVision:!0},models:[{id:"gemini-3.1-pro-preview",name:"Gemini 3.1 Pro",contextWindow:1048576,maxOutput:65536,toolCall:!0,reasoning:!0,reasoningRequired:!0,vision:!0,costInput:2,costOutput:12},{id:"gemini-3-flash-preview",name:"Gemini 3 Flash",contextWindow:1048576,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!0,costInput:.5,costOutput:3},{id:"gemini-3.1-flash-lite",name:"Gemini 3.1 Flash-Lite",contextWindow:1048576,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!0,costInput:.25,costOutput:1.5},{id:"gemini-3.1-flash-image-preview",name:"Gemini 3.1 Flash Image (Nano Banana 2)",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image","img2img"],sizes:["1024x1024"]}},{id:"gemini-3-pro-image-preview",name:"Gemini 3 Pro Image (Nano Banana Pro)",contextWindow:4096,maxOutput:1,toolCall:!1,reasoning:!1,vision:!0,costInput:0,costOutput:0,mediaType:"image",mediaCapabilities:{type:"image",operations:["text2image","img2img"],sizes:["1024x1024"]}},{id:"veo-3.1-generate-preview",name:"Veo 3.1 Standard",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:8,resolutions:["720P","1080P","4K"]}},{id:"veo-3.1-fast-generate-preview",name:"Veo 3.1 Fast",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:8,resolutions:["720P","1080P","4K"]}},{id:"veo-3.1-lite-generate-preview",name:"Veo 3.1 Lite",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"video",mediaCapabilities:{type:"video",operations:["text2video","img2video"],maxDurationSeconds:8,resolutions:["720P","1080P"]}},{id:"lyria-3-pro-preview",name:"Lyria 3 Pro",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"music",mediaCapabilities:{type:"music",operations:["text2music"],maxDurationSeconds:300,formats:["mp3"]}},{id:"lyria-3-clip-preview",name:"Lyria 3 Clip",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"music",mediaCapabilities:{type:"music",operations:["text2music"],maxDurationSeconds:30,formats:["mp3"]}},{id:"lyria-realtime-exp",name:"Lyria RealTime (Experimental)",contextWindow:2e3,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,mediaType:"music_realtime",mediaCapabilities:{type:"music",operations:["realtime"],formats:["wav"]}},{id:"gemini-3.1-flash-tts-preview",name:"Gemini 3.1 Flash TTS",contextWindow:8192,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:1,costOutput:20,mediaType:"tts",mediaCapabilities:{type:"tts",operations:["text2speech"],maxCharacters:8e3,formats:["mp3","wav"]}},{id:"gemini-embedding-2",name:"Gemini Embedding 2 (Multimodal)",contextWindow:8192,maxOutput:1,toolCall:!1,reasoning:!1,vision:!1,costInput:.2,costOutput:0,mediaType:"embedding",mediaCapabilities:{type:"embedding",dimensions:3072,maxTokens:8192}}]},{id:"openrouter",name:"OpenRouter",transport:"openai-chat",baseUrl:"https://openrouter.ai/api",apiKeyEnvVars:["OPENROUTER_API_KEY"],authType:"bearer",isAggregator:!0,defaultModel:"anthropic/claude-opus-4.7",extraHeaders:{"HTTP-Referer":"https://claw.bot","X-Title":"XiaozhiClaw"},models:[{id:"anthropic/claude-opus-4.7",name:"Claude Opus 4.7 (via OpenRouter)",contextWindow:1e6,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:5,costOutput:25,costCacheRead:.5},{id:"anthropic/claude-opus-4.6",name:"Claude Opus 4.6 (via OpenRouter)",contextWindow:1e6,maxOutput:128e3,toolCall:!0,reasoning:!0,vision:!0,costInput:5,costOutput:25,costCacheRead:.5},{id:"deepseek/deepseek-v4-flash",name:"DeepSeek V4 Flash (via OpenRouter)",contextWindow:1048576,maxOutput:393216,toolCall:!0,reasoning:!0,vision:!1,costInput:.14,costOutput:.28,costCacheRead:.028}]},{id:"qwen-coding",name:"Alibaba Qwen (Coding Plan)",transport:"anthropic-messages",baseUrl:"https://coding.dashscope.aliyuncs.com/apps/anthropic",apiKeyEnvVars:["DASHSCOPE_API_KEY","QWEN_API_KEY"],authType:"x-api-key",isAggregator:!1,defaultModel:"qwen3-coder-plus",models:[{id:"qwen3-coder-plus",name:"Qwen3 Coder Plus (Coding Plan)",contextWindow:262144,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!1},{id:"qwen3-coder-flash",name:"Qwen3 Coder Flash (Coding Plan)",contextWindow:262144,maxOutput:65536,toolCall:!0,reasoning:!0,vision:!1}]}];var ki={claude:"anthropic",gemini:"google",doubao:"volcengine"},le=class{builtins=new Map;overrides=new Map;constructor(){for(let e of yt)this.builtins.set(e.id,e)}applyOverride(e,o){this.overrides.set(e,{...this.overrides.get(e),...o})}getProvider(e){let o=ki[e]??e,n=this.builtins.get(o),i=this.overrides.get(o);if(!(!n&&!i))return!n&&i?!i.id||!i.transport||!i.baseUrl?void 0:{id:i.id,name:i.name??i.id,transport:i.transport,baseUrl:i.baseUrl,apiKeyEnvVars:i.apiKeyEnvVars??[],authType:i.authType??"bearer",isAggregator:i.isAggregator??!1,defaultModel:i.defaultModel,models:i.models}:n&&!i?n:{...n,...i,models:i.models??n.models}}listProviders(){let e=new Map;for(let[o,n]of this.builtins)e.set(o,n);for(let[o]of this.overrides){let n=this.getProvider(o);n&&e.set(o,n)}return[...e.values()]}listModels(e){return this.getProvider(e)?.models??[]}getModelInfo(e,o){return this.listModels(e).find(n=>n.id===o)}resolveApiKey(e,o){if(o)return o;let n=this.getProvider(e);if(n)for(let i of n.apiKeyEnvVars){let s=process.env[i];if(s?.trim())return s.trim()}}};var ce=class{registry;constructor(e){this.registry=e}resolve(e){let o=e.publicModel.trim();if(!o)return[];let n=e.userPreference?.providerIds?new Set(e.userPreference.providerIds):void 0,i=wi(e.requestedProtocol),s=e.capabilities??[],l=[];for(let r of this.registry.listProviders())if(!(n&&!n.has(r.id))&&!(i&&r.transport!==i))for(let d of this.registry.listModels(r.id)){let h=Ci(d,o);if(!h)continue;let m=Mi(r,d);if(s.some(x=>!m.includes(x)))continue;let g=Si(r,d),M=r.billingChannelKind??vi(g),T=Ei({matchKind:h,requestedTransport:i,requiredCapabilities:s,preferProviderId:e.userPreference?.preferProviderId,preferVariantKind:e.userPreference?.preferVariantKind,purpose:e.purpose,provider:r,variantKind:g,capabilities:m}),S=Ri({matchKind:h,requestedTransport:i,requiredCapabilities:s,preferProviderId:e.userPreference?.preferProviderId,preferVariantKind:e.userPreference?.preferVariantKind,purpose:e.purpose,provider:r,variantKind:g,capabilities:m});l.push({provider:r.id,group:r.group??r.id,publicModel:o,nativeModelId:d.id,displayName:d.name,transport:r.transport,variantKind:g,billingChannelKind:M,capabilities:m,score:S,reasons:T,providerDef:r,modelInfo:d})}return l.sort((r,d)=>d.score!==r.score?d.score-r.score:r.group!==d.group?r.group.localeCompare(d.group):r.provider.localeCompare(d.provider))}resolveBest(e){return this.resolve(e)[0]}};function wi(t){if(t)return t==="openai"?"openai-chat":t==="anthropic"?"anthropic-messages":t}function Ci(t,e){return So(t.id,e)?"exact":(t.aliases??[]).some(o=>So(o,e))?"alias":void 0}function So(t,e){return t.trim().toLowerCase()===e.trim().toLowerCase()}function Si(t,e){return t.variantKind?t.variantKind:e.mediaType==="realtime_audio"||e.mediaType==="realtime_video"?"realtime":e.mediaType?"media-plan":t.id.includes("coding")||e.id.toLowerCase().includes("coder")||e.id.toLowerCase().includes("codegeex")?"coding-plan":t.transport==="openai-chat"||t.transport==="openai-responses"||t.transport==="volcengine-responses"?"openai-compatible":t.transport==="anthropic-messages"?"anthropic-compatible":"standard"}function vi(t){return t==="coding-plan"||t==="media-plan"?"plan":"paygo"}function Mi(t,e){let o=new Set(t.capabilities??[]);return e.reasoning&&o.add("thinking"),e.vision&&o.add("vision"),e.mediaType&&o.add("media"),(e.mediaType==="realtime_audio"||e.mediaType==="realtime_video")&&o.add("realtime"),e.toolCall&&t.quirks?.supportsToolStream&&o.add("tool_stream"),t.quirks?.supportsReasoningSplit&&o.add("reasoning_split"),(t.quirks?.builtinWebSearch||t.quirks?.builtinCodeInterpreter||t.quirks?.builtinUrlContext)&&o.add("builtin_tools"),(t.id.includes("coding")||e.id.toLowerCase().includes("coder")||e.id.toLowerCase().includes("codegeex"))&&o.add("coding"),[...o].sort()}function Ri(t){let e=100;return e+=t.matchKind==="exact"?25:15,t.requestedTransport&&t.provider.transport===t.requestedTransport&&(e+=20),e+=t.requiredCapabilities.length*15,t.preferProviderId&&t.provider.id===t.preferProviderId&&(e+=50),t.preferVariantKind&&t.variantKind===t.preferVariantKind&&(e+=35),t.purpose==="textGeneration"&&!t.capabilities.includes("media")&&(e+=5),t.purpose==="imageGeneration"&&t.capabilities.includes("media")&&(e+=10),t.purpose==="videoGeneration"&&t.capabilities.includes("media")&&(e+=10),t.capabilities.includes("tool_stream")&&(e+=8),t.capabilities.includes("reasoning_split")&&(e+=8),t.variantKind==="coding-plan"&&(e+=t.provider.id.includes("coding")?12:5),e}function Ei(t){let e=[t.matchKind==="exact"?"model id matched":"public alias matched"];t.requestedTransport&&e.push(`protocol ${t.requestedTransport} matched`);for(let o of t.requiredCapabilities)e.push(`capability ${o} matched`);return t.preferProviderId&&t.provider.id===t.preferProviderId&&e.push("preferred provider matched"),t.preferVariantKind&&t.variantKind===t.preferVariantKind&&e.push("preferred variant matched"),e}var ol=20*1024*1024;import{createHmac as $l,randomUUID as Dl}from"node:crypto";import{join as ac}from"node:path";import{mkdirSync as cc,appendFileSync as uc}from"node:fs";var pc=Co();import{mkdir as $i,writeFile as Di}from"fs/promises";import{join as vo}from"path";import{tmpdir as Ni}from"os";var Fi="tool-results",Mo="<persisted-output>",Bi="</persisted-output>";function Ro(){return{seenIds:new Set,replacements:new Map}}function Eo(t){return vo(Ni(),"qlogicagent-sessions",t,Fi)}async function Wi(t){try{await $i(Eo(t),{recursive:!0})}catch{}}function ji(t,e){let o=e.replace(/[^a-zA-Z0-9_-]/g,"_");return vo(Eo(t),`${o}.txt`)}function Gi(t,e){if(t.length<=e)return{preview:t,hasMore:!1};let n=t.slice(0,e).lastIndexOf(`
|
|
9
|
+
`),i=n>e*.5?n:e;return{preview:t.slice(0,i),hasMore:!0}}function Ao(t){return t.includes(Mo)}async function Io(t,e,o){await Wi(o);let n=ji(o,e);try{await Di(n,t,{encoding:"utf-8",flag:"wx"})}catch(l){if(l.code!=="EEXIST")return null}let{preview:i,hasMore:s}=Gi(t,Ze);return{filepath:n,originalSize:t.length,preview:i,hasMore:s}}function Oo(t){let e=`${Mo}
|
|
10
10
|
`;return e+=`Output too large (${t.originalSize} chars). Full output saved to: ${t.filepath}
|
|
11
11
|
|
|
12
|
-
`,e+=`Preview (first ${
|
|
12
|
+
`,e+=`Preview (first ${Ze} bytes):
|
|
13
13
|
`,e+=t.preview,e+=t.hasMore?`
|
|
14
14
|
...
|
|
15
15
|
`:`
|
|
16
|
-
`,e+=
|
|
17
|
-
...[truncated ${t.length-n} chars]`}function ls(t){let e=[],o=[];for(let n of t)n.role==="tool"&&typeof n.content=="string"&&n.tool_call_id?Do(n.content)||o.push({toolCallId:n.tool_call_id,content:n.content,size:n.content.length}):n.role==="assistant"&&o.length>0&&(e.push(o),o=[]);return o.length>0&&e.push(o),e}function cs(t,e){let o=[],n=[],i=[];for(let s of t){let a=e.replacements.get(s.toolCallId);a!==void 0?o.push({...s,replacement:a}):e.seenIds.has(s.toolCallId)?n.push(s):i.push(s)}return{mustReapply:o,frozen:n,fresh:i}}function us(t,e,o){let n=[...t].sort((a,r)=>r.size-a.size),i=[],s=e+t.reduce((a,r)=>a+r.size,0);for(let a of n){if(s<=o)break;i.push(a),s-=a.size}return i}async function Bo(t,e,o,n=ao){let i=ls(t);if(i.length===0)return{messages:t,newlyReplacedCount:0};let s=new Map,a=[];for(let p of i){let{mustReapply:f,frozen:T,fresh:y}=cs(p,e);for(let S of f)s.set(S.toolCallId,S.replacement);if(y.length===0){for(let S of p)e.seenIds.add(S.toolCallId);continue}let w=T.reduce((S,A)=>S+A.size,0),_=y.reduce((S,A)=>S+A.size,0),k=w+_>n?us(y,w,n):[],P=new Set(k.map(S=>S.toolCallId));for(let S of p)P.has(S.toolCallId)||e.seenIds.add(S.toolCallId);k.length>0&&a.push(...k)}if(s.size===0&&a.length===0)return{messages:t,newlyReplacedCount:0};let r=await Promise.all(a.map(async p=>{let f=await $o(p.content,p.toolCallId,o);return{candidate:p,result:f}})),u=0;for(let{candidate:p,result:f}of r){if(e.seenIds.add(p.toolCallId),!f)continue;let T=No(f);s.set(p.toolCallId,T),e.replacements.set(p.toolCallId,T),u++}return s.size===0?{messages:t,newlyReplacedCount:0}:{messages:t.map(p=>{if(p.role!=="tool"||!p.tool_call_id)return p;let f=s.get(p.tool_call_id);return f===void 0?p:{...p,content:f}}),newlyReplacedCount:u}}var ds=new Set(["read_file","file_read","FileRead","grep","Grep","glob","Glob","search","list_dir","find_files","web_fetch","web_search","WebFetch","WebSearch"]),ps=new Set(["bash","execute_command","Bash","shell"]),De=class{tools=[];hasErrored=!1;erroredToolDescription="";discarded=!1;siblingAbortController;progressResolve;config;concurrencySafe;constructor(e){this.config=e,this.concurrencySafe=e.concurrencySafeTools??ds,this.siblingAbortController=new AbortController,e.signal&&e.signal.addEventListener("abort",()=>{this.siblingAbortController.abort("parent_abort")},{once:!0})}discard(){this.discarded=!0}addTool(e){let o=this.concurrencySafe.has(e.function.name);this.tools.push({id:e.id,toolCall:e,status:"queued",isConcurrencySafe:o,results:[],pendingProgress:[]}),this.processQueue()}canExecuteTool(e){let o=this.tools.filter(i=>i.status==="executing"),n=this.config.maxConcurrentTools;return n&&n>0&&o.length>=n?!1:o.length===0||e&&o.every(i=>i.isConcurrencySafe)}async processQueue(){for(let e of this.tools)if(e.status==="queued"){if(this.canExecuteTool(e.isConcurrencySafe))await this.executeTool(e);else if(!e.isConcurrencySafe)break}}getAbortReason(){return this.discarded?"discarded":this.hasErrored?"sibling_error":this.config.signal?.aborted?"user_interrupted":null}getToolDescription(e){let o;try{o=JSON.parse(e.toolCall.function.arguments)}catch{}let n=o?.command??o?.file_path??o?.pattern??"";if(typeof n=="string"&&n.length>0){let i=n.length>40?n.slice(0,40)+"\u2026":n;return`${e.toolCall.function.name}(${i})`}return e.toolCall.function.name}createSyntheticError(e,o){let n=this.erroredToolDescription,i=o==="user_interrupted"?"User rejected tool use":o==="discarded"?"Streaming fallback - tool execution discarded":n?`Cancelled: parallel tool call ${n} errored`:"Cancelled: parallel tool call errored";return{callId:e.id,toolName:e.toolCall.function.name,ok:!1,error:i,message:G(e.id,{ok:!1,error:i})}}async executeTool(e){e.status="executing";let n=(async()=>{let i=this.getAbortReason();if(i){e.results.push(this.createSyntheticError(e,i)),e.status="completed";return}let{toolInvoker:s,hooks:a,sessionId:r,turnId:u,log:g}=this.config,p=e.toolCall.function.name,f=!1,T=e.toolCall.function.arguments;if(a)try{let S=await a.invoke("tool.before_invoke",{sessionId:r,turnId:u,callId:e.id,toolName:p,arguments:ms(T)});if(S.action==="abort"){let A=S.reason??"blocked by policy";g.info(`tool ${p} blocked: ${A}`),e.results.push({callId:e.id,toolName:p,ok:!1,error:A,blocked:!0,blockReason:A,message:G(e.id,{ok:!1,error:A})}),e.status="completed";return}S.action==="continue"&&S.context?.arguments&&(T=JSON.stringify(S.context.arguments))}catch{}let y=await s.invoke(u,p,T,this.siblingAbortController.signal),w=this.getAbortReason();if(w&&!f){e.results.push(this.createSyntheticError(e,w)),e.status="completed";return}let _=!y.error,k=y.result;_&&k&&k.length>5e4&&(k=await Fo(k,e.id,r));let P=G(e.id,{ok:_,payload:k,error:y.error,toolReferences:y.toolReferences,imageUrls:y.imageUrls});_||(f=!0,ps.has(p)&&(this.hasErrored=!0,this.erroredToolDescription=this.getToolDescription(e),this.siblingAbortController.abort("sibling_error"))),a?.invoke(_?"tool.after_invoke":"tool.invoke_failed",{sessionId:r,turnId:u,callId:e.id,toolName:p,ok:_,...y.error?{error:y.error}:{}}).catch(()=>{}),e.results.push({callId:e.id,toolName:p,ok:_,error:y.error,message:P}),e.status="completed"})();e.promise=n,n.finally(()=>{this.processQueue()})}*getCompletedResults(){if(!this.discarded){for(let e of this.tools)if(e.status!=="yielded"){if(e.status==="completed"&&e.results.length>0){e.status="yielded";for(let o of e.results)yield o}else if(e.status==="executing"&&!e.isConcurrencySafe)break}}}async*getRemainingResults(){if(!this.discarded){for(;this.hasUnfinishedTools();){await this.processQueue();for(let e of this.getCompletedResults())yield e;if(this.hasExecutingTools()&&!this.hasCompletedResults()){let e=this.tools.filter(n=>n.status==="executing"&&n.promise).map(n=>n.promise),o=new Promise(n=>{this.progressResolve=n});e.length>0&&await Promise.race([...e,o])}}for(let e of this.getCompletedResults())yield e}}hasCompletedResults(){return this.tools.some(e=>e.status==="completed")}hasExecutingTools(){return this.tools.some(e=>e.status==="executing")}hasUnfinishedTools(){return this.tools.some(e=>e.status!=="yielded")}};function ms(t){try{return JSON.parse(t)}catch{return}}import{readFile as $u}from"node:fs/promises";import*as $ from"node:fs";import{homedir as fs}from"node:os";import{join as jo}from"node:path";import{existsSync as Ru}from"node:fs";var gs=".qlogicagent";function hs(){return process.env.QLOGICAGENT_HOME||jo(fs(),gs)}function Wo(){return jo(hs(),"settings.json")}var $e=class{pools=new Map;runtimeStates=new Map;constructor(e){if(e)for(let o of e){this.pools.set(o.providerId,o);for(let n of o.keys)this.runtimeStates.set(n.id,this.createInitialState())}}acquireKey(e){let o=this.pools.get(e);if(!o||o.keys.length===0)return null;let n=Date.now(),i=this.getHealthyCandidates(o,n);if(i.length===0)return null;let s=this.selectByStrategy(i,o.strategy,n);if(!s)return null;let a=this.runtimeStates.get(s.id);return a.inFlight++,a.totalRequests++,a.lastUsedAt=n,a.requestTimestamps.push(n),{keyId:s.id,apiKey:s.key,providerId:e,release:r=>this.releaseKey(s.id,r)}}releaseKey(e,o){let n=this.runtimeStates.get(e);if(n)if(n.inFlight=Math.max(0,n.inFlight-1),o.success)n.consecutiveErrors=0,n.healthStatus="healthy",o.tokens&&(n.totalTokens+=o.tokens,n.tokenCounts.push(o.tokens));else if(n.consecutiveErrors++,n.lastErrorAt=Date.now(),o.errorCode===429){let i=o.retryAfter?o.retryAfter*1e3:3e4;n.cooldownUntil=Date.now()+i,n.healthStatus="cooldown"}else n.consecutiveErrors>=5?(n.cooldownUntil=Date.now()+6e4,n.healthStatus="cooldown"):n.consecutiveErrors>=3&&(n.healthStatus="degraded")}addProvider(e,o){this.pools.has(e)||this.pools.set(e,{providerId:e,baseUrl:o?.baseUrl,strategy:o?.strategy??"weighted-round-robin",keys:[],rateLimit:o?.rateLimit})}removeProvider(e){let o=this.pools.get(e);if(o){for(let n of o.keys)this.runtimeStates.delete(n.id);this.pools.delete(e)}}addKey(e,o,n){let i=this.pools.get(e);i||(i={providerId:e,strategy:"weighted-round-robin",keys:[]},this.pools.set(e,i));let s=n?.id??crypto.randomUUID(),a={id:s,key:o,label:n?.label,weight:n?.weight??1,enabled:n?.enabled??!0};return i.keys.push(a),this.runtimeStates.set(s,this.createInitialState()),s}removeKey(e){for(let o of this.pools.values()){let n=o.keys.findIndex(i=>i.id===e);if(n!==-1){o.keys.splice(n,1),this.runtimeStates.delete(e);return}}}updateKey(e,o){for(let n of this.pools.values()){let i=n.keys.find(s=>s.id===e);if(i){if(o.label!==void 0&&(i.label=o.label),o.weight!==void 0&&(i.weight=o.weight),o.enabled!==void 0){i.enabled=o.enabled;let s=this.runtimeStates.get(e);s&&(s.healthStatus=o.enabled?"healthy":"disabled")}return}}}setKeyHealth(e,o){let n=this.runtimeStates.get(e);n&&(n.healthStatus=o)}setStrategy(e,o){let n=this.pools.get(e);n&&(n.strategy=o)}setRateLimit(e,o){let n=this.pools.get(e);n&&(n.rateLimit=o)}getPoolStatus(e){let o=this.pools.get(e);return o?this.buildPoolStatus(o):null}getAllStatus(){return[...this.pools.values()].map(e=>this.buildPoolStatus(e))}getProviderIds(){return[...this.pools.keys()]}hasProvider(e){return this.pools.has(e)}hasAvailableKey(e){let o=this.pools.get(e);return o?this.getHealthyCandidates(o,Date.now()).length>0:!1}exportConfig(){return[...this.pools.values()]}reloadConfig(e){let o=new Set;for(let n of e){this.pools.set(n.providerId,n);for(let i of n.keys)o.add(i.id),this.runtimeStates.has(i.id)||this.runtimeStates.set(i.id,this.createInitialState())}for(let n of[...this.pools.keys()])e.some(i=>i.providerId===n)||this.pools.delete(n);for(let n of[...this.runtimeStates.keys()])o.has(n)||this.runtimeStates.delete(n)}createInitialState(){return{inFlight:0,totalRequests:0,totalTokens:0,lastUsedAt:0,lastErrorAt:0,consecutiveErrors:0,cooldownUntil:0,healthStatus:"healthy",requestTimestamps:[],tokenCounts:[]}}getHealthyCandidates(e,o){let n=[];for(let i of e.keys){if(!i.enabled)continue;let s=this.runtimeStates.get(i.id);if(s){if(s.healthStatus==="cooldown")if(o>=s.cooldownUntil)s.healthStatus="healthy",s.consecutiveErrors=0;else continue;s.healthStatus!=="disabled"&&(e.rateLimit?.rpm&&(this.pruneWindow(s.requestTimestamps,o),s.requestTimestamps.length>=e.rateLimit.rpm*.9)||e.rateLimit?.tpm&&(this.pruneWindow(s.tokenCounts,o),s.tokenCounts.reduce((r,u)=>r+u,0)>=e.rateLimit.tpm*.9)||n.push(i))}}return n}selectByStrategy(e,o,n){if(e.length===0)return null;if(e.length===1)return e[0];switch(o){case"weighted-round-robin":return this.weightedRandom(e);case"least-busy":return this.leastBusy(e);case"random":return e[Math.floor(Math.random()*e.length)];default:return this.weightedRandom(e)}}weightedRandom(e){let o=e.reduce((i,s)=>i+s.weight,0),n=Math.random()*o;for(let i of e)if(n-=i.weight,n<=0)return i;return e[e.length-1]}leastBusy(e){let o=1/0,n=e[0];for(let i of e){let a=this.runtimeStates.get(i.id)?.inFlight??0;(a<o||a===o&&i.weight>n.weight)&&(o=a,n=i)}return n}pruneWindow(e,o){let n=o-6e4;for(;e.length>0&&e[0]<n;)e.shift()}buildPoolStatus(e){return{providerId:e.providerId,baseUrl:e.baseUrl,strategy:e.strategy,rateLimit:e.rateLimit,keys:e.keys.map(o=>{let n=this.runtimeStates.get(o.id)??this.createInitialState();return{...o,inFlight:n.inFlight,totalRequests:n.totalRequests,totalTokens:n.totalTokens,lastUsedAt:n.lastUsedAt,lastErrorAt:n.lastErrorAt,consecutiveErrors:n.consecutiveErrors,cooldownUntil:n.cooldownUntil,healthStatus:o.enabled?n.healthStatus:"disabled"}})}}};var ys=["textGeneration","smallModel","stt","tts","imageGeneration","imageUnderstanding","videoGeneration","videoUnderstanding","threeDGeneration","embedding","voiceClone","musicGeneration","realtimeAudio","realtimeVideo"],kt=class{keyPool;coreProviderRegistry=new ue;providerVariantResolver=new de(this.coreProviderRegistry);models=new Map;modelEnabledOverrides=new Map;bindings={};settingsPath;changeListeners=[];constructor(e){this.settingsPath=Wo(),this.keyPool=new $e(e?.providers),e?.models&&this.loadModelState(e.models),e?.bindings&&(this.bindings={...e.bindings})}getActiveModel(e){let o=this.bindings[e];if(!o)return null;let n=this.models.get(o);if(!n||!n.enabled)return null;let i=this.resolveTechnicalVariant(n,e),s=i?.provider??n.provider,a=i?.nativeModelId??n.model,r=this.acquireKeyForProviderVariant(s);if(!r)return null;let{keyHandle:u,keyProviderId:g}=r;return{provider:s,model:a,apiKey:u.apiKey,baseUrl:n.provider===s?n.baseUrl??this.getProviderBaseUrl(s)??this.getProviderBaseUrl(g):this.getProviderBaseUrl(s),keyHandle:u}}peekActiveModel(e){let o=this.bindings[e];return o?this.models.get(o)??null:null}isAvailable(e){let o=this.peekActiveModel(e);return!!o?.enabled&&this.hasAvailableKeyForProviderVariant(o.provider)}resolveModelForPurpose(e){let o=this.peekActiveModel(e);return o?o.model:null}addProvider(e,o){this.keyPool.addProvider(e,o),this.emitChange()}removeProvider(e){this.keyPool.removeProvider(e);for(let[o,n]of this.models)n.provider===e&&this.removeModel(o);this.emitChange()}addKey(e,o,n){let i=this.keyPool.addKey(e,o,n);return this.emitChange(),i}removeKey(e){this.keyPool.removeKey(e),this.emitChange()}updateKey(e,o){this.keyPool.updateKey(e,o),this.emitChange()}setKeyHealth(e,o){this.keyPool.setKeyHealth(e,o),this.emitChange()}setStrategy(e,o){this.keyPool.setStrategy(e,o),this.emitChange()}addModel(e){let o=e.id??`${e.provider}:${e.model}`;return this.models.set(o,{...e,id:o,enabled:this.modelEnabledOverrides.get(o)??e.enabled}),this.emitChange(),o}replaceCatalogModels(e){let o=new Map;for(let n of e)o.set(n.id,{...n,enabled:this.modelEnabledOverrides.get(n.id)??n.enabled});this.models=o;for(let[n,i]of Object.entries(this.bindings))i&&!this.models.has(i)&&delete this.bindings[n];this.emitChange()}migrateModelIds(e){for(let[o,n]of e){let i=this.modelEnabledOverrides.get(o);i!==void 0&&!this.modelEnabledOverrides.has(n)&&this.modelEnabledOverrides.set(n,i),this.modelEnabledOverrides.delete(o);for(let[s,a]of Object.entries(this.bindings))a===o&&(this.bindings[s]=n)}this.emitChange()}removeModel(e){this.models.delete(e),this.modelEnabledOverrides.delete(e);for(let[o,n]of Object.entries(this.bindings))n===e&&delete this.bindings[o];this.emitChange()}enableModel(e){let o=this.models.get(e);o&&(o.enabled=!0),this.modelEnabledOverrides.set(e,!0),this.emitChange()}disableModel(e){let o=this.models.get(e);o&&(o.enabled=!1),this.modelEnabledOverrides.set(e,!1),this.emitChange()}listModels(e){let o=[...this.models.values()];return e?.purpose&&(o=o.filter(n=>n.purposes.includes(e.purpose))),e?.provider&&(o=o.filter(n=>n.provider===e.provider)),e?.enabledOnly&&(o=o.filter(n=>n.enabled)),o}getModel(e){return this.models.get(e)??null}setBinding(e,o){let n=this.models.get(o);if(!n)throw new Error(`Model "${o}" not found in pool.`);if(!n.purposes.includes(e))throw new Error(`Model "${o}" does not support purpose "${e}".`);this.bindings[e]=o,this.emitChange()}removeBinding(e){delete this.bindings[e],this.emitChange()}getBinding(e){let o=this.bindings[e];return o?this.models.get(o)??null:null}getAllBindings(){let e={};for(let o of ys){let n=this.bindings[o];e[o]=n?this.models.get(n)??null:null}return e}getProviderStatus(e){return this.keyPool.getPoolStatus(e)}getAllProviderStatus(){return this.keyPool.getAllStatus()}save(){let e={};try{$.existsSync(this.settingsPath)&&(e=JSON.parse($.readFileSync(this.settingsPath,"utf-8")))}catch{e={}}delete e.provider,delete e.apiKey,delete e.model,delete e.baseUrl;let o={...e,providers:this.keyPool.exportConfig(),models:this.exportModelState(),bindings:{...this.bindings}},n=this.settingsPath.replace(/[/\\][^/\\]+$/,"");$.existsSync(n)||$.mkdirSync(n,{recursive:!0}),$.writeFileSync(this.settingsPath,JSON.stringify(o,null,2),"utf-8")}load(){try{if(!$.existsSync(this.settingsPath))return!1;let e=$.readFileSync(this.settingsPath,"utf-8"),o=JSON.parse(e);return o.providers&&this.keyPool.reloadConfig(o.providers),this.models.clear(),this.modelEnabledOverrides.clear(),o.models&&this.loadModelState(o.models),this.bindings=o.bindings??{},this.emitChange(),!0}catch{return!1}}exportConfig(){return{providers:this.keyPool.exportConfig(),models:this.exportModelState(),bindings:{...this.bindings}}}getTunable(e){try{if(!$.existsSync(this.settingsPath))return;let o=$.readFileSync(this.settingsPath,"utf-8");return JSON.parse(o).tunables?.[e]}catch{return}}getModelInfo(e,o){let n=this.listModels({provider:e}).find(i=>i.model===o);if(n)return{id:n.model,name:n.displayName,contextWindow:n.contextWindow,maxOutput:n.maxOutput,streamRequired:n.streamRequired}}getProviderDefaultModel(e){return this.listModels({provider:e,enabledOnly:!0})[0]?.model??this.listModels({provider:e})[0]?.model}hasConfiguredKeyForProviderVariant(e){return this.providerVariantKeyCandidates(e).some(o=>!!this.keyPool.getPoolStatus(o)?.keys.some(i=>i.enabled))}hasAvailableKeyForProviderVariant(e){return this.providerVariantKeyCandidates(e).some(o=>this.keyPool.hasAvailableKey(o))}listProviderDefs(){return this.keyPool.getAllStatus().map(e=>({id:e.providerId,name:e.providerId,transport:"",baseUrl:e.baseUrl??"",defaultModel:this.getProviderDefaultModel(e.providerId),models:this.listModels({provider:e.providerId}).map(o=>({id:o.model,name:o.displayName,contextWindow:o.contextWindow,maxOutput:o.maxOutput,streamRequired:o.streamRequired}))}))}resolveProviderApiKey(e){return this.getKeyForProvider(e)??void 0}onChange(e){return this.changeListeners.push(e),()=>{let o=this.changeListeners.indexOf(e);o>=0&&this.changeListeners.splice(o,1)}}getKeyForProvider(e){let n=this.acquireKeyForProviderVariant(e)?.keyHandle;if(!n)return null;let i=n.apiKey;return n.release({success:!0}),i}snapshotProviderKeys(){let e={};for(let o of this.keyPool.getAllStatus()){let n=this.getKeyForProvider(o.providerId);n&&(e[o.providerId]=n)}return e}getProviderBaseUrl(e){return this.keyPool.getPoolStatus(e)?.baseUrl}acquireKeyForProviderVariant(e){for(let o of this.providerVariantKeyCandidates(e)){let n=this.keyPool.acquireKey(o);if(n)return{keyHandle:n,keyProviderId:o}}return null}resolveTechnicalVariant(e,o){let n=this.providerVariantKeyCandidates(e.provider).filter(s=>this.hasConfiguredKeyForProviderVariant(s));if(n.length===0)return;let i=this.providerVariantResolver.resolveBest({publicModel:e.model,requestedProtocol:bs(e.transport),purpose:o,userPreference:{providerIds:n}});if(i)return{provider:i.provider,nativeModelId:i.nativeModelId}}providerVariantKeyCandidates(e){let o=[e],n=this.coreProviderRegistry.getProvider(e),i=n?.group??n?.id??e;for(let s of this.coreProviderRegistry.listProviders())(s.group??s.id)===i&&o.push(s.id);return i!==e&&o.push(i),[...new Set(o)]}loadModelState(e){for(let o of e)typeof o.id!="string"||!o.id||typeof o.enabled=="boolean"&&this.modelEnabledOverrides.set(o.id,o.enabled)}exportModelState(){let e=new Map;for(let[o,n]of this.modelEnabledOverrides)e.set(o,n);for(let o of this.models.values())e.set(o.id,o.enabled);return[...e.entries()].map(([o,n])=>({id:o,enabled:n}))}emitChange(){for(let e of this.changeListeners)try{e()}catch{}}},Ne=null;function wt(){return Ne||(Ne=new kt,Ne.load()),Ne}function bs(t){switch(t){case"openai-chat":case"openai-responses":case"anthropic-messages":case"volcengine-responses":return t;default:return}}function St(t){let e=typeof t.content=="string"?t.content:t.content!=null?JSON.stringify(t.content):"";return Math.ceil(e.length/4)}function Ct(t){let e=0;for(let o of t)e+=St(o);return e}var vt={"deepseek-v4-flash":1e6,"deepseek-v4-pro":1e6,"deepseek-chat":1e6,"deepseek-reasoner":1e6,"gpt-4o":128e3,"gpt-4o-mini":128e3,"claude-sonnet-4-20250514":2e5,"claude-3-5-haiku-20241022":2e5,"gemini-3.1-pro-preview":1e6,"gemini-3-flash-preview":1e6,"gemini-3.1-flash-lite":1e6};function Ts(t){if(!t)return 128e3;if(t in vt)return vt[t];let e=t.toLowerCase();for(let[o,n]of Object.entries(vt))if(e.startsWith(o.toLowerCase()))return n;return 128e3}var _s=8e3;var xs=new se(200);var ks=new re;function Go(){return ks}function ws(){return Ke(new ie(_s),new X(20,St),new ne(St))}var Cs=null;function zo(t,e){let o=e?.budget??Ve({modelContextWindow:Ts(e?.model)}),i=(e?.pipeline??ws()).compress(t,o);if(i.droppedCount>0){let s=Ct(t),a=Ct(i.messages);xs.record({timestamp:Date.now(),strategy:i.strategy,tokensBefore:s,tokensAfter:a,droppedCount:i.droppedCount,latencyMs:i.metrics?.latencyMs??0,usedLlm:!1,cacheInvalidated:i.metrics?.cacheInvalidated??!1,tier:Xe(s,o)})}return i.droppedCount>0&&Cs?.(i.droppedCount,Ct(i.messages)),i}function Ho(t,e,o){let n=o-e;return`[Budget] ${Math.round(t)}% used (${e.toLocaleString()} / ${o.toLocaleString()} tokens). ${n.toLocaleString()} tokens remaining. `+(t>=90?"Wrap up your current taskyou are near the token limit.":"Continue workingdo not summarize prematurely.")}var Os=new Set(["write","edit","patch","apply_patch"]);function Us(t){let e=t.split(".").pop()?.toLowerCase()??"";return["png","jpg","jpeg","gif","webp","svg","bmp","ico"].includes(e)?"image":["md","txt","pdf","doc","docx","rtf","html"].includes(e)?"document":["mermaid","mmd","dot","puml","plantuml"].includes(e)?"diagram":["csv","tsv","xlsx","xls"].includes(e)?"table":["ts","tsx","js","jsx","py","rs","go","java","c","cpp","h","cs","rb","sh","sql","json","yaml","yml","toml","xml","css","scss","vue","svelte"].includes(e)?"code":"file"}function Ps(t){let e=t.split(".").pop()?.toLowerCase()??"";return{ts:"typescript",tsx:"typescriptreact",js:"javascript",jsx:"javascriptreact",py:"python",rs:"rust",go:"go",java:"java",c:"c",cpp:"cpp",h:"c",cs:"csharp",rb:"ruby",sh:"shellscript",sql:"sql",json:"json",yaml:"yaml",yml:"yaml",toml:"toml",xml:"xml",html:"html",css:"css",scss:"scss",vue:"vue",svelte:"svelte",md:"markdown"}[e]}var Ls=/^no (matches|files|results) found\.?$|^file not found|^not found|^0 results|^\(exit code \d+, no output\)$/i,Ds=new Set(["search","grep","glob","find","list","read","exec"]);function $s(t){if(!Ds.has(t.toolName))return!1;let e=typeof t.message?.content=="string"?t.message.content.trim():"";return e.length>0&&e.length<200&&Ls.test(e)}function Xo(t,e){for(let o=t.length-1;o>=0;o--){let n=t[o];if(!n||n.role!=="tool")continue;let i=typeof n.content=="string"?n.content:"";if(i.startsWith("Error: "))return i.slice(7).trim()}}function Ns(t){return typeof t=="number"&&Number.isFinite(t)&&t>=1?Math.min(Math.round(t),100):Jt}function Yo(t){let e=t.message.toLowerCase();return t.status===413||e.includes("prompt_too_long")||e.includes("context_length_exceeded")||e.includes("maximum context length")}function Fs(t){return t==="length"||t==="max_tokens"}function Jo(t){let e=t.message.toLowerCase();return(e.includes("image")||e.includes("media")||e.includes("file too large")||e.includes("payload too large"))&&(t.status===413||e.includes("too large")||e.includes("size"))}function Bs(t){let e=t.headers;if(!e)return null;let o=e["retry-after"]??e["Retry-After"];if(!o)return null;let n=parseInt(o,10);return!isNaN(n)&&n>0?n*1e3:null}function js(t){if(t.status!==400)return null;let e=t.message.match(/input length and `max_tokens` exceed context limit: (\d+) \+ (\d+) > (\d+)/);if(!e?.[1]||!e?.[3])return null;let o=parseInt(e[1],10),n=parseInt(e[3],10);if(isNaN(o)||isNaN(n))return null;let i=n-o-1e3;return i>=3e3?i:null}function Ws(t){return t.filter(e=>e.role!=="assistant"?!0:!(typeof e.content=="string"&&e.content.trim()===""))}async function*Qo(t,e,o,n){let{turnId:i,sessionId:s,messages:a,tools:r,model:u,apiKey:g,temperature:p=0,hooks:f,signal:T}=t,y={sessionId:s,turnId:i},w=t.maxTurns??0,_=t.querySource,{resolveToolEligibility:k}=await Promise.resolve().then(()=>(Vo(),Ko)),P=k(r,t.toolEligibilityContext),S=P.eligibleTools;for(let C of P.blockedTools)yield{type:"tool_blocked",turnId:i,callId:"",name:C.toolName,reason:"blocked-by-policy"};if(!S.length){yield*Gs(i,u,a,g,p,T,e,n);return}let A=Ns(t.maxRounds),D={contextWindowTokens:t.contextWindowTokens??qt,responseBufferTokens:eo,maxOutputTokens:t.maxOutputTokens??to,abortSignal:T,reactiveCompactEnabled:!0,outputEscalationEnabled:!0},R=new Set,I=0,me=S,fe,l={messages:[...a],maxOutputTokensRecoveryCount:0,hasAttemptedReactiveCompact:!1,maxOutputTokensOverride:void 0,turnCount:1,transition:void 0,guardState:dt(D),reactiveCompactState:ht(),toolLoopState:Se({maxRounds:A,replayMessages:[...a]}).state,consecutiveFailedRounds:0,finalText:"",totalUsage:{inputTokens:0,outputTokens:0},collapseStore:Je(),currentModel:u,consecutive529Errors:0,consecutiveApiRetries:0,stopHookActive:void 0,lastResponseId:void 0,snipRemovedIds:new Set,contentReplacementState:Po(),budgetContinuationCount:0,lastBudgetDeltaTokens:0,lastBudgetGlobalTokens:0,identicalCallCounts:new Map,toolFailureCounts:new Map,fileReadCounts:new Map},Mt=Math.max(w*5,200),Rt=0;for(;;){if(Rt++,Rt>Mt){n.info(`hard iteration cap reached (${Mt}), forcing completion`);let c=l.finalText||pe(l.messages,n);yield{type:"end",turnId:i,content:c,usage:l.totalUsage,model:l.currentModel};return}let{messages:C,maxOutputTokensRecoveryCount:Z,hasAttemptedReactiveCompact:Vs,maxOutputTokensOverride:Et,turnCount:q,guardState:O,reactiveCompactState:j,collapseStore:Fe}=l,{toolLoopState:N}=l;if(fe){try{let c=await fe;c&&(yield{type:"tool_use_summary",turnId:i,summary:c})}catch{}fe=void 0}if(t.refreshTools&&q>1){let c=t.refreshTools();c!==me&&(me=c,n.debug(`tools refreshed: ${c.length} tools`))}if(gt(O,D)){n.info(`turn aborted by guard at turn ${q}`),yield{type:"error",turnId:i,error:"Turn aborted",code:"ABORTED",usage:l.totalUsage};return}let z=pt(O,D);if(z.level==="blocking"){z.reason==="prompt_too_long"&&J(j)&&(j.attemptedThisTurn=!0,O.hasAttemptedReactiveCompact=!0,n.info(`token budget blocking (${z.reason}), reactive compact needed`),yield{type:"recovery",turnId:i,action:"reactive_compact",detail:"token budget pre-check"}),n.info(`token budget blocking (${z.reason}), ending tool loop`);break}z.level==="warning"&&n.info(`token budget warning: ${z.usagePercent}% used, ${z.remainingTokens} remaining`);let U;{let c=await Bo(C,l.contentReplacementState,s);U=c.messages,c.newlyReplacedCount>0&&(n.info(`tool-result-budget: persisted ${c.newlyReplacedCount} oversized tool results`),yield{type:"recovery",turnId:i,action:"tool_result_budget",detail:`${c.newlyReplacedCount} persisted`})}{let c=Ye(U,l.snipRemovedIds);U=c.messages,c.removedCount>0&&(n.info(`snip: removed ${c.removedCount} messages, freed ~${c.tokensFreed} tokens`),yield{type:"recovery",turnId:i,action:"snip",detail:`${c.removedCount} messages`})}{let d=new X().compress(U,0);d.droppedCount>0&&(U=d.messages,n.info(`microcompact: cleared ${d.droppedCount} old tool results`))}if(U=Qe(U,Fe).messages,O.promptTokens>0){let c=D.contextWindowTokens*.75,d=Go().getActive(),m;d?m=await d.compressAsync(U,c,{model:l.currentModel,sessionId:s}):m=zo(U,{budget:c,model:l.currentModel}),m.droppedCount>0&&(U=m.messages,n.info(`autocompact: ${m.strategy}, dropped ${m.droppedCount}`),yield{type:"recovery",turnId:i,action:"autocompact",detail:`${m.strategy}: ${m.droppedCount} dropped`},l.hasAttemptedReactiveCompact=!1,f?.invoke("context.after_compact",{...y,removedCount:m.droppedCount}).catch(()=>{}))}U=Ws(U);let ge=nt({tools:me,toolChoice:t.toolChoice??"auto"}),ee=Se({maxRounds:A,replayMessages:U,lastStopReason:N.lastStopReason,options:{stopReason:N.lastStopReason}}),At=ge.extraSystemPrompt?[{role:"system",content:ge.extraSystemPrompt},...ee.state.replayMessages]:ee.state.replayMessages;N=ee.state,ee.recoveryActions.length>0&&n.debug(`tool loop recovery: ${ee.recoveryActions.map(c=>c.detail??c.kind).join("; ")}`),n.debug(`turn ${q}, messages: ${At.length}`),f?.invoke("turn.before_inference",{...y,model:l.currentModel}).catch(()=>{});let he=!1,It=[],Ot=new Map,Ut="stop",F,v=null,ye=!1,te=[],L=[];try{for await(let c of e.stream({model:l.currentModel,messages:At,tools:ge.tools,toolChoice:ge.normalizedToolChoice??"auto",temperature:p,maxTokens:(Et??O.currentMaxOutputTokens)||void 0,streamRequired:t.streamRequired,previousResponseId:l.lastResponseId,reasoning:t.reasoning,promptCacheKey:t.promptCacheKey,promptCacheRetention:t.promptCacheRetention,serviceTier:t.serviceTier,openaiBuiltinTools:t.openaiBuiltinTools,maxToolCalls:t.maxToolCalls,parallelToolCalls:t.parallelToolCalls,textVerbosity:t.textVerbosity},g,T))switch(c.type){case"delta":It.push(c.text),he||(yield{type:"delta",turnId:i,text:c.text});break;case"tool_call_delta":he=!0,yt(Ot,c);break;case"reasoning_delta":te.push(c.text);break;case"reasoning_block_complete":c.signature&&L.push({thinking:te.join(""),signature:c.signature}),te.length=0;break;case"usage":F={inputTokens:c.promptTokens,outputTokens:c.completionTokens,reasoningTokens:c.reasoningTokens,cacheRead:c.cacheReadTokens,cacheWrite:c.cacheCreationTokens};break;case"response_id":l.lastResponseId=c.id;break;case"annotations":yield{type:"annotations",turnId:i,annotations:c.annotations};break;case"builtin_tool_status":yield{type:"heartbeat",turnId:i,message:`${c.toolType}: ${c.event}`};break;case"done":Ut=c.finishReason;break}if(he||f?.invoke("turn.after_inference",{...y,model:l.currentModel}).catch(()=>{}),t.postSamplingHooks&&t.postSamplingHooks.length>0){let c=l.currentModel;for(let d of t.postSamplingHooks)try{d({messages:[...U],model:c,sessionId:s})}catch{}}}catch(c){if(c instanceof le&&t.fallbackModel){n.info(`model fallback triggered: ${c.originalModel} \u2192 ${c.fallbackModel}`),yield{type:"recovery",turnId:i,action:"model_fallback",detail:`${c.originalModel} \u2192 ${c.fallbackModel}`},l={...l,currentModel:c.fallbackModel,consecutive529Errors:0,consecutiveApiRetries:0,transition:void 0};continue}let d=c instanceof Error?c.message:String(c),m=typeof c?.status=="number"?c.status:void 0;if(!m&&d&&(d.includes("ECONNRESET")||d.includes("EPIPE"))){let x=(l.consecutiveApiRetries??0)+1;if(x>ae){n.info(`stale connection retry limit reached (${ae}), aborting`),yield{type:"error",turnId:i,error:d,code:"RETRIES_EXHAUSTED",usage:l.totalUsage};return}n.info(`stale connection (${d.includes("ECONNRESET")?"ECONNRESET":"EPIPE"}): retrying`),yield{type:"recovery",turnId:i,action:"stale_connection_retry",detail:d.slice(0,80)},l={...l,consecutiveApiRetries:x,transition:void 0};continue}let h=js({status:m,message:d});if(h!==null){n.info(`max_tokens overflow: adjusting to ${h}`),O.currentMaxOutputTokens=h,l={...l,maxOutputTokensOverride:h,transition:void 0};continue}if(ut(m)){l.consecutive529Errors++;let x=2,E=t.fallbackModel&&l.currentModel!==t.fallbackModel;if(l.consecutive529Errors>x&&!E&&!Re()){n.info(`transient ${m} \xD7 ${l.consecutive529Errors}: hard limit reached, aborting`),yield{type:"error",turnId:i,error:`API unavailable after ${l.consecutive529Errors} consecutive ${m} errors`,code:"API_ERROR",usage:l.totalUsage};return}if(l.consecutive529Errors>=co&&t.fallbackModel&&l.currentModel!==t.fallbackModel){n.info(`529 \xD7 ${l.consecutive529Errors}: triggering fallback to ${t.fallbackModel}`),yield{type:"recovery",turnId:i,action:"model_fallback",detail:`529 \xD7 ${l.consecutive529Errors}`},l={...l,currentModel:t.fallbackModel,consecutive529Errors:0,transition:void 0};continue}if(Re()){let b=Me(l.consecutive529Errors);n.info(`persistent retry: waiting ${b}ms (attempt ${l.consecutive529Errors})`);let M=b;for(;M>0;){if(T?.aborted){yield{type:"error",turnId:i,error:"Aborted during retry wait",code:"ABORTED",usage:l.totalUsage};return}yield{type:"heartbeat",turnId:i,message:`Retrying in ${Math.ceil(M/1e3)}s (${m})`};let B=Math.min(M,lo);await new Promise(We=>setTimeout(We,B)),M-=B}l={...l,transition:void 0};continue}if(ct(_)){let M=Bs({status:m,message:d})??Me(l.consecutive529Errors);n.info(`transient ${m}: retry in ${M}ms`),yield{type:"recovery",turnId:i,action:"retry",detail:`${m} retry in ${M}ms`},await new Promise(B=>setTimeout(B,M)),l={...l,transition:void 0};continue}n.info(`background source ${_}: not retrying ${m}`)}v={status:m,message:d}}if(v&&f?.invoke("turn.after_inference",{...y,model:l.currentModel,response:{error:v.message}}).catch(()=>{}),v)if(Yo(v))ye=!0,n.info(`withheld prompt_too_long error (status=${v.status})`);else if(Jo(v))ye=!0,n.info(`withheld media_size error (status=${v.status})`);else{let c=mt({status:v.status??500,message:v.message},O,D);if(c.action==="reactive_compact"&&J(j)&&(j.attemptedThisTurn=!0,O.hasAttemptedReactiveCompact=!0,yield{type:"recovery",turnId:i,action:"reactive_compact",detail:`API ${v.status??500}: ${v.message}`}),c.action==="retry"){let m=(l.consecutiveApiRetries??0)+1;if(m>ae){n.info(`API retry limit reached (${ae}), aborting`);let h=Y(v.status,v.message);yield{type:"error",turnId:i,error:v.message,code:h,usage:l.totalUsage};return}yield{type:"recovery",turnId:i,action:"retry",detail:c.reason},l={...l,consecutiveApiRetries:m,transition:void 0};continue}let d=Y(v.status,v.message);f?.invoke("stop.failure",{sessionId:s,reason:d,error:v.message}).catch(()=>{}),yield{type:"error",turnId:i,error:v.message,code:d,usage:l.totalUsage};return}F&&(l.totalUsage.inputTokens+=F.inputTokens,l.totalUsage.outputTokens+=F.outputTokens,F.reasoningTokens&&(l.totalUsage.reasoningTokens=(l.totalUsage.reasoningTokens??0)+F.reasoningTokens),F.cacheRead&&(l.totalUsage.cacheRead=(l.totalUsage.cacheRead??0)+F.cacheRead),F.cacheWrite&&(l.totalUsage.cacheWrite=(l.totalUsage.cacheWrite??0)+F.cacheWrite)),F?.inputTokens&&(O.promptTokens=F.inputTokens);let Pt=It.join("");Pt&&(l.finalText=Pt);let W=[...Ot.values()].map(c=>({id:c.id||`tc_${i}_${q}_${Math.random().toString(36).slice(2,8)}`,type:"function",function:{name:c.name,arguments:c.arguments}}));if(W.length===0&&!he){if(ye&&v&&Yo(v)){if(l.transition?.reason!=="collapse_drain_retry"){let m=Ze(U,Fe);if(m.committed>0){n.info(`collapse drain: committed ${m.committed} stages`),yield{type:"recovery",turnId:i,action:"collapse_drain",detail:`${m.committed} stages committed`},l={...l,messages:m.messages,transition:{reason:"collapse_drain_retry",committed:m.committed}};continue}}if(J(j)){j.attemptedThisTurn=!0,O.hasAttemptedReactiveCompact=!0,n.info("withheld 413: reactive compact attempt"),yield{type:"recovery",turnId:i,action:"reactive_compact",detail:"withheld prompt_too_long"},l={...l,hasAttemptedReactiveCompact:!0,transition:{reason:"reactive_compact_retry"}};continue}n.info("withheld 413: recovery exhausted, surfacing error"),f?.invoke("stop.failure",{sessionId:s,reason:"prompt_too_long",error:v.message}).catch(()=>{}),yield{type:"error",turnId:i,error:v.message,code:"PROMPT_TOO_LONG",usage:l.totalUsage};return}if(ye&&v&&Jo(v)){if(J(j)){j.attemptedThisTurn=!0,O.hasAttemptedReactiveCompact=!0,n.info("withheld media error: reactive compact strip-retry"),yield{type:"recovery",turnId:i,action:"reactive_compact",detail:"media error strip-retry"},l={...l,hasAttemptedReactiveCompact:!0,transition:{reason:"reactive_compact_retry"}};continue}n.info("withheld media error: recovery exhausted"),f?.invoke("stop.failure",{sessionId:s,reason:"media_error",error:v.message}).catch(()=>{}),yield{type:"error",turnId:i,error:v.message,code:"IMAGE_ERROR",usage:l.totalUsage};return}if(Fs(Ut)){O.consecutiveTruncations+=1;let m=t.modelMaxOutputTokens??oo,h=ft(O,D,m);if(h.shouldEscalate&&Et===void 0){O.currentMaxOutputTokens=h.newMax,n.info(`max_output_tokens escalate: ${h.newMax} tokens`),yield{type:"recovery",turnId:i,action:"output_escalation",detail:`${h.newMax} tokens`},l={...l,maxOutputTokensOverride:io,transition:{reason:"max_output_tokens_escalate"}};continue}if(Z<no){let x={role:"user",content:"Output token limit hit. Resume directly \u2014 no apology, no recap of what you were doing. Pick up mid-thought if that is where the cut happened. Break remaining work into smaller pieces."};n.info(`max_output_tokens recovery #${Z+1}`),yield{type:"recovery",turnId:i,action:"max_output_tokens_recovery",detail:`attempt ${Z+1}`},l={...l,messages:[...U,x],maxOutputTokensRecoveryCount:Z+1,maxOutputTokensOverride:void 0,transition:{reason:"max_output_tokens_recovery",attempt:Z+1}};continue}n.info("max_output_tokens recovery exhausted, completing with partial content")}else O.consecutiveTruncations=0;if(N=ve(N,{replayMessages:C,lastStopReason:"completed"}),f){let m=await f.invoke("stop",{sessionId:s,reason:"completed"});if(m.action==="prevent"){n.info(`stop hook prevented continuation: ${m.reason??"no reason"}`),yield{type:"end",turnId:i,content:l.finalText,usage:l.totalUsage,model:l.currentModel};return}if(m.action==="abort"){let h=m.reason??"Stop hook requested continuation";n.info(`stop hook blocking: ${h}`);let x={role:"user",content:h},E={role:"assistant",content:l.finalText,...L.length>0&&{thinkingBlocks:[...L]}};l={...l,messages:[...C,E,x],stopHookActive:!0,transition:{reason:"stop_hook_blocking"}};continue}}if(t.tokenBudget&&t.tokenBudget>0&&l.budgetContinuationCount<5){let m=l.totalUsage.inputTokens+l.totalUsage.outputTokens+(l.totalUsage.reasoningTokens??0),h=m/t.tokenBudget*100,x=m-l.lastBudgetGlobalTokens,E=l.budgetContinuationCount>=so&&x<qe&&l.lastBudgetDeltaTokens<qe;if(E&&n.info(`token budget early stop: diminishing returns at ${Math.round(h)}% (delta=${x})`),!E&&h<90){let b=l.budgetContinuationCount+1,M={role:"user",content:Ho(h,m,t.tokenBudget)};n.info(`token budget continuation #${b}: ${Math.round(h)}% used`),yield{type:"recovery",turnId:i,action:"budget_continuation",detail:`${Math.round(h)}% used (#${b})`};let B={role:"assistant",content:l.finalText,...L.length>0&&{thinkingBlocks:[...L]}};l={...l,messages:[...C,B,M],budgetContinuationCount:b,lastBudgetDeltaTokens:x,lastBudgetGlobalTokens:m,transition:{reason:"token_budget_continuation"}};continue}}if(!l.stopHookActive){let m=a.find(b=>b.role==="user"),h=typeof m?.content=="string"?m.content:"",x=/创建文件|生成文件|写入|写一个|建一个|新建|重写|改写|create\s+(a\s+)?file|write\s+(a\s+)?file|make\s+(a\s+)?file|修改|改成|把.*改|文件名叫/i.test(h),E=R.has("write")||R.has("edit");if(x&&!E){if(n.info("AP1 action-verification: user requested file action but no write/edit tool was called, injecting nudge"),I>0){let B=[...C].reverse().find(We=>We.role==="tool");B&&typeof B.content=="string"&&(B.content+=`
|
|
16
|
+
`,e+=Bi,e}async function Uo(t,e,o,n=io){if(t.length<=n||Ao(t))return t;let i=await Io(t,e,o);return i?Oo(i):t.slice(0,n)+`
|
|
17
|
+
...[truncated ${t.length-n} chars]`}function zi(t){let e=[],o=[];for(let n of t)n.role==="tool"&&typeof n.content=="string"&&n.tool_call_id?Ao(n.content)||o.push({toolCallId:n.tool_call_id,content:n.content,size:n.content.length}):n.role==="assistant"&&o.length>0&&(e.push(o),o=[]);return o.length>0&&e.push(o),e}function Hi(t,e){let o=[],n=[],i=[];for(let s of t){let l=e.replacements.get(s.toolCallId);l!==void 0?o.push({...s,replacement:l}):e.seenIds.has(s.toolCallId)?n.push(s):i.push(s)}return{mustReapply:o,frozen:n,fresh:i}}function Ki(t,e,o){let n=[...t].sort((l,r)=>r.size-l.size),i=[],s=e+t.reduce((l,r)=>l+r.size,0);for(let l of n){if(s<=o)break;i.push(l),s-=l.size}return i}async function Po(t,e,o,n=so){let i=zi(t);if(i.length===0)return{messages:t,newlyReplacedCount:0};let s=new Map,l=[];for(let m of i){let{mustReapply:g,frozen:M,fresh:T}=Hi(m,e);for(let w of g)s.set(w.toolCallId,w.replacement);if(T.length===0){for(let w of m)e.seenIds.add(w.toolCallId);continue}let S=M.reduce((w,A)=>w+A.size,0),x=T.reduce((w,A)=>w+A.size,0),C=S+x>n?Ki(T,S,n):[],L=new Set(C.map(w=>w.toolCallId));for(let w of m)L.has(w.toolCallId)||e.seenIds.add(w.toolCallId);C.length>0&&l.push(...C)}if(s.size===0&&l.length===0)return{messages:t,newlyReplacedCount:0};let r=await Promise.all(l.map(async m=>{let g=await Io(m.content,m.toolCallId,o);return{candidate:m,result:g}})),d=0;for(let{candidate:m,result:g}of r){if(e.seenIds.add(m.toolCallId),!g)continue;let M=Oo(g);s.set(m.toolCallId,M),e.replacements.set(m.toolCallId,M),d++}return s.size===0?{messages:t,newlyReplacedCount:0}:{messages:t.map(m=>{if(m.role!=="tool"||!m.tool_call_id)return m;let g=s.get(m.tool_call_id);return g===void 0?m:{...m,content:g}}),newlyReplacedCount:d}}var Vi=new Set(["read_file","file_read","FileRead","grep","Grep","glob","Glob","search","list_dir","find_files","web_fetch","web_search","WebFetch","WebSearch"]),Xi=new Set(["bash","execute_command","Bash","shell"]),Pe=class{tools=[];hasErrored=!1;erroredToolDescription="";discarded=!1;siblingAbortController;progressResolve;config;concurrencySafe;constructor(e){this.config=e,this.concurrencySafe=e.concurrencySafeTools??Vi,this.siblingAbortController=new AbortController,e.signal&&e.signal.addEventListener("abort",()=>{this.siblingAbortController.abort("parent_abort")},{once:!0})}discard(){this.discarded=!0}addTool(e){let o=this.concurrencySafe.has(e.function.name);this.tools.push({id:e.id,toolCall:e,status:"queued",isConcurrencySafe:o,results:[],pendingProgress:[]}),this.processQueue()}canExecuteTool(e){let o=this.tools.filter(i=>i.status==="executing"),n=this.config.maxConcurrentTools;return n&&n>0&&o.length>=n?!1:o.length===0||e&&o.every(i=>i.isConcurrencySafe)}async processQueue(){for(let e of this.tools)if(e.status==="queued"){if(this.canExecuteTool(e.isConcurrencySafe))await this.executeTool(e);else if(!e.isConcurrencySafe)break}}getAbortReason(){return this.discarded?"discarded":this.hasErrored?"sibling_error":this.config.signal?.aborted?"user_interrupted":null}getToolDescription(e){let o;try{o=JSON.parse(e.toolCall.function.arguments)}catch{}let n=o?.command??o?.file_path??o?.pattern??"";if(typeof n=="string"&&n.length>0){let i=n.length>40?n.slice(0,40)+"\u2026":n;return`${e.toolCall.function.name}(${i})`}return e.toolCall.function.name}createSyntheticError(e,o){let n=this.erroredToolDescription,i=o==="user_interrupted"?"User rejected tool use":o==="discarded"?"Streaming fallback - tool execution discarded":n?`Cancelled: parallel tool call ${n} errored`:"Cancelled: parallel tool call errored";return{callId:e.id,toolName:e.toolCall.function.name,ok:!1,error:i,message:G(e.id,{ok:!1,error:i})}}async executeTool(e){e.status="executing";let n=(async()=>{let i=this.getAbortReason();if(i){e.results.push(this.createSyntheticError(e,i)),e.status="completed";return}let{toolInvoker:s,hooks:l,sessionId:r,turnId:d,log:h}=this.config,m=e.toolCall.function.name,g=!1,M=e.toolCall.function.arguments;if(l)try{let w=await l.invoke("tool.before_invoke",{sessionId:r,turnId:d,callId:e.id,toolName:m,arguments:Yi(M)});if(w.action==="abort"){let A=w.reason??"blocked by policy";h.info(`tool ${m} blocked: ${A}`),e.results.push({callId:e.id,toolName:m,ok:!1,error:A,blocked:!0,blockReason:A,message:G(e.id,{ok:!1,error:A})}),e.status="completed";return}w.action==="continue"&&w.context?.arguments&&(M=JSON.stringify(w.context.arguments))}catch{}let T=await s.invoke(d,m,M,this.siblingAbortController.signal),S=this.getAbortReason();if(S&&!g){e.results.push(this.createSyntheticError(e,S)),e.status="completed";return}let x=!T.error,C=T.result;x&&C&&C.length>5e4&&(C=await Uo(C,e.id,r));let L=G(e.id,{ok:x,payload:C,error:T.error,toolReferences:T.toolReferences,imageUrls:T.imageUrls});x||(g=!0,Xi.has(m)&&(this.hasErrored=!0,this.erroredToolDescription=this.getToolDescription(e),this.siblingAbortController.abort("sibling_error"))),l?.invoke(x?"tool.after_invoke":"tool.invoke_failed",{sessionId:r,turnId:d,callId:e.id,toolName:m,ok:x,...T.error?{error:T.error}:{}}).catch(()=>{}),e.results.push({callId:e.id,toolName:m,ok:x,error:T.error,message:L}),e.status="completed"})();e.promise=n,n.finally(()=>{this.processQueue()})}*getCompletedResults(){if(!this.discarded){for(let e of this.tools)if(e.status!=="yielded"){if(e.status==="completed"&&e.results.length>0){e.status="yielded";for(let o of e.results)yield o}else if(e.status==="executing"&&!e.isConcurrencySafe)break}}}async*getRemainingResults(){if(!this.discarded){for(;this.hasUnfinishedTools();){await this.processQueue();for(let e of this.getCompletedResults())yield e;if(this.hasExecutingTools()&&!this.hasCompletedResults()){let e=this.tools.filter(n=>n.status==="executing"&&n.promise).map(n=>n.promise),o=new Promise(n=>{this.progressResolve=n});e.length>0&&await Promise.race([...e,o])}}for(let e of this.getCompletedResults())yield e}}hasCompletedResults(){return this.tools.some(e=>e.status==="completed")}hasExecutingTools(){return this.tools.some(e=>e.status==="executing")}hasUnfinishedTools(){return this.tools.some(e=>e.status!=="yielded")}};function Yi(t){try{return JSON.parse(t)}catch{return}}import{readFile as mu}from"node:fs/promises";import*as D from"node:fs";import{homedir as Ji}from"node:os";import{join as Lo}from"node:path";import{existsSync as iu}from"node:fs";var Qi=".qlogicagent";function Zi(){return process.env.QLOGICAGENT_HOME||Lo(Ji(),Qi)}function $o(){return Lo(Zi(),"settings.json")}var Le=class{pools=new Map;runtimeStates=new Map;constructor(e){if(e)for(let o of e){this.pools.set(o.providerId,o);for(let n of o.keys)this.runtimeStates.set(n.id,this.createInitialState())}}acquireKey(e){let o=this.pools.get(e);if(!o||o.keys.length===0)return null;let n=Date.now(),i=this.getHealthyCandidates(o,n);if(i.length===0)return null;let s=this.selectByStrategy(i,o.strategy,n);if(!s)return null;let l=this.runtimeStates.get(s.id);return l.inFlight++,l.totalRequests++,l.lastUsedAt=n,l.requestTimestamps.push(n),{keyId:s.id,apiKey:s.key,providerId:e,release:r=>this.releaseKey(s.id,r)}}releaseKey(e,o){let n=this.runtimeStates.get(e);if(n)if(n.inFlight=Math.max(0,n.inFlight-1),o.success)n.consecutiveErrors=0,n.healthStatus="healthy",o.tokens&&(n.totalTokens+=o.tokens,n.tokenCounts.push(o.tokens));else if(n.consecutiveErrors++,n.lastErrorAt=Date.now(),o.errorCode===429){let i=o.retryAfter?o.retryAfter*1e3:3e4;n.cooldownUntil=Date.now()+i,n.healthStatus="cooldown"}else n.consecutiveErrors>=5?(n.cooldownUntil=Date.now()+6e4,n.healthStatus="cooldown"):n.consecutiveErrors>=3&&(n.healthStatus="degraded")}addProvider(e,o){this.pools.has(e)||this.pools.set(e,{providerId:e,baseUrl:o?.baseUrl,strategy:o?.strategy??"weighted-round-robin",keys:[],rateLimit:o?.rateLimit})}removeProvider(e){let o=this.pools.get(e);if(o){for(let n of o.keys)this.runtimeStates.delete(n.id);this.pools.delete(e)}}addKey(e,o,n){let i=this.pools.get(e);i||(i={providerId:e,strategy:"weighted-round-robin",keys:[]},this.pools.set(e,i));let s=n?.id??crypto.randomUUID(),l={id:s,key:o,label:n?.label,weight:n?.weight??1,enabled:n?.enabled??!0};return i.keys.push(l),this.runtimeStates.set(s,this.createInitialState()),s}removeKey(e){for(let o of this.pools.values()){let n=o.keys.findIndex(i=>i.id===e);if(n!==-1){o.keys.splice(n,1),this.runtimeStates.delete(e);return}}}updateKey(e,o){for(let n of this.pools.values()){let i=n.keys.find(s=>s.id===e);if(i){if(o.label!==void 0&&(i.label=o.label),o.weight!==void 0&&(i.weight=o.weight),o.enabled!==void 0){i.enabled=o.enabled;let s=this.runtimeStates.get(e);s&&(s.healthStatus=o.enabled?"healthy":"disabled")}return}}}setKeyHealth(e,o){let n=this.runtimeStates.get(e);n&&(n.healthStatus=o)}setStrategy(e,o){let n=this.pools.get(e);n&&(n.strategy=o)}setRateLimit(e,o){let n=this.pools.get(e);n&&(n.rateLimit=o)}getPoolStatus(e){let o=this.pools.get(e);return o?this.buildPoolStatus(o):null}getAllStatus(){return[...this.pools.values()].map(e=>this.buildPoolStatus(e))}getProviderIds(){return[...this.pools.keys()]}hasProvider(e){return this.pools.has(e)}hasAvailableKey(e){let o=this.pools.get(e);return o?this.getHealthyCandidates(o,Date.now()).length>0:!1}exportConfig(){return[...this.pools.values()]}reloadConfig(e){let o=new Set;for(let n of e){this.pools.set(n.providerId,n);for(let i of n.keys)o.add(i.id),this.runtimeStates.has(i.id)||this.runtimeStates.set(i.id,this.createInitialState())}for(let n of[...this.pools.keys()])e.some(i=>i.providerId===n)||this.pools.delete(n);for(let n of[...this.runtimeStates.keys()])o.has(n)||this.runtimeStates.delete(n)}createInitialState(){return{inFlight:0,totalRequests:0,totalTokens:0,lastUsedAt:0,lastErrorAt:0,consecutiveErrors:0,cooldownUntil:0,healthStatus:"healthy",requestTimestamps:[],tokenCounts:[]}}getHealthyCandidates(e,o){let n=[];for(let i of e.keys){if(!i.enabled)continue;let s=this.runtimeStates.get(i.id);if(s){if(s.healthStatus==="cooldown")if(o>=s.cooldownUntil)s.healthStatus="healthy",s.consecutiveErrors=0;else continue;s.healthStatus!=="disabled"&&(e.rateLimit?.rpm&&(this.pruneWindow(s.requestTimestamps,o),s.requestTimestamps.length>=e.rateLimit.rpm*.9)||e.rateLimit?.tpm&&(this.pruneWindow(s.tokenCounts,o),s.tokenCounts.reduce((r,d)=>r+d,0)>=e.rateLimit.tpm*.9)||n.push(i))}}return n}selectByStrategy(e,o,n){if(e.length===0)return null;if(e.length===1)return e[0];switch(o){case"weighted-round-robin":return this.weightedRandom(e);case"least-busy":return this.leastBusy(e);case"random":return e[Math.floor(Math.random()*e.length)];default:return this.weightedRandom(e)}}weightedRandom(e){let o=e.reduce((i,s)=>i+s.weight,0),n=Math.random()*o;for(let i of e)if(n-=i.weight,n<=0)return i;return e[e.length-1]}leastBusy(e){let o=1/0,n=e[0];for(let i of e){let l=this.runtimeStates.get(i.id)?.inFlight??0;(l<o||l===o&&i.weight>n.weight)&&(o=l,n=i)}return n}pruneWindow(e,o){let n=o-6e4;for(;e.length>0&&e[0]<n;)e.shift()}buildPoolStatus(e){return{providerId:e.providerId,baseUrl:e.baseUrl,strategy:e.strategy,rateLimit:e.rateLimit,keys:e.keys.map(o=>{let n=this.runtimeStates.get(o.id)??this.createInitialState();return{...o,inFlight:n.inFlight,totalRequests:n.totalRequests,totalTokens:n.totalTokens,lastUsedAt:n.lastUsedAt,lastErrorAt:n.lastErrorAt,consecutiveErrors:n.consecutiveErrors,cooldownUntil:n.cooldownUntil,healthStatus:o.enabled?n.healthStatus:"disabled"}})}}};var qi=["textGeneration","smallModel","stt","tts","imageGeneration","imageUnderstanding","videoGeneration","videoUnderstanding","threeDGeneration","embedding","voiceClone","musicGeneration","realtimeAudio","realtimeVideo"],_t=class{keyPool;coreProviderRegistry=new le;providerVariantResolver=new ce(this.coreProviderRegistry);models=new Map;modelEnabledOverrides=new Map;bindings={};settingsPath;changeListeners=[];constructor(e){this.settingsPath=$o(),this.keyPool=new Le(e?.providers),e?.models&&this.loadModelState(e.models),e?.bindings&&(this.bindings={...e.bindings})}getActiveModel(e){let o=this.bindings[e];if(!o)return null;let n=this.models.get(o);if(!n||!n.enabled)return null;let i=this.resolveTechnicalVariant(n,e),s=i?.provider??n.provider,l=i?.nativeModelId??n.nativeModelId??n.model,r=this.acquireKeyForProviderVariant(s);if(!r)return null;let{keyHandle:d,keyProviderId:h}=r;return{provider:s,model:l,apiKey:d.apiKey,baseUrl:n.provider===s?n.baseUrl??this.getProviderBaseUrl(s)??this.getProviderBaseUrl(h):this.getProviderBaseUrl(s),keyHandle:d}}peekActiveModel(e){let o=this.bindings[e];return o?this.models.get(o)??null:null}isAvailable(e){let o=this.peekActiveModel(e);return!!o?.enabled&&this.hasAvailableKeyForProviderVariant(o.provider)}resolveModelForPurpose(e){let o=this.peekActiveModel(e);return o?o.model:null}addProvider(e,o){this.keyPool.addProvider(e,o),this.emitChange()}removeProvider(e){this.keyPool.removeProvider(e);for(let[o,n]of this.models)n.provider===e&&this.removeModel(o);this.emitChange()}addKey(e,o,n){let i=this.keyPool.addKey(e,o,n);return this.emitChange(),i}removeKey(e){this.keyPool.removeKey(e),this.emitChange()}updateKey(e,o){this.keyPool.updateKey(e,o),this.emitChange()}setKeyHealth(e,o){this.keyPool.setKeyHealth(e,o),this.emitChange()}setStrategy(e,o){this.keyPool.setStrategy(e,o),this.emitChange()}addModel(e){let o=e.id??`${e.provider}:${e.model}`;return this.models.set(o,{...e,id:o,enabled:this.modelEnabledOverrides.get(o)??e.enabled}),this.emitChange(),o}replaceCatalogModels(e){let o=new Map;for(let n of e)o.set(n.id,{...n,enabled:this.modelEnabledOverrides.get(n.id)??n.enabled});this.models=o;for(let[n,i]of Object.entries(this.bindings))i&&!this.models.has(i)&&delete this.bindings[n];this.emitChange()}migrateModelIds(e){for(let[o,n]of e){let i=this.modelEnabledOverrides.get(o);i!==void 0&&!this.modelEnabledOverrides.has(n)&&this.modelEnabledOverrides.set(n,i),this.modelEnabledOverrides.delete(o);for(let[s,l]of Object.entries(this.bindings))l===o&&(this.bindings[s]=n)}this.emitChange()}removeModel(e){this.models.delete(e),this.modelEnabledOverrides.delete(e);for(let[o,n]of Object.entries(this.bindings))n===e&&delete this.bindings[o];this.emitChange()}enableModel(e){let o=this.models.get(e);o&&(o.enabled=!0),this.modelEnabledOverrides.set(e,!0),this.emitChange()}disableModel(e){let o=this.models.get(e);o&&(o.enabled=!1),this.modelEnabledOverrides.set(e,!1),this.emitChange()}listModels(e){let o=[...this.models.values()];return e?.purpose&&(o=o.filter(n=>n.purposes.includes(e.purpose))),e?.provider&&(o=o.filter(n=>n.provider===e.provider)),e?.enabledOnly&&(o=o.filter(n=>n.enabled)),o}getModel(e){return this.models.get(e)??null}setBinding(e,o){let n=this.models.get(o);if(!n)throw new Error(`Model "${o}" not found in pool.`);if(!n.purposes.includes(e))throw new Error(`Model "${o}" does not support purpose "${e}".`);this.bindings[e]=o,this.emitChange()}removeBinding(e){delete this.bindings[e],this.emitChange()}getBinding(e){let o=this.bindings[e];return o?this.models.get(o)??null:null}getAllBindings(){let e={};for(let o of qi){let n=this.bindings[o];e[o]=n?this.models.get(n)??null:null}return e}getProviderStatus(e){return this.keyPool.getPoolStatus(e)}getAllProviderStatus(){return this.keyPool.getAllStatus()}save(){let e={};try{D.existsSync(this.settingsPath)&&(e=JSON.parse(D.readFileSync(this.settingsPath,"utf-8")))}catch{e={}}delete e.provider,delete e.apiKey,delete e.model,delete e.baseUrl;let o={...e,providers:this.keyPool.exportConfig(),models:this.exportModelState(),bindings:{...this.bindings}},n=this.settingsPath.replace(/[/\\][^/\\]+$/,"");D.existsSync(n)||D.mkdirSync(n,{recursive:!0}),D.writeFileSync(this.settingsPath,JSON.stringify(o,null,2),"utf-8")}load(){try{if(!D.existsSync(this.settingsPath))return!1;let e=D.readFileSync(this.settingsPath,"utf-8"),o=JSON.parse(e);return o.providers&&this.keyPool.reloadConfig(o.providers),this.models.clear(),this.modelEnabledOverrides.clear(),o.models&&this.loadModelState(o.models),this.bindings=o.bindings??{},this.emitChange(),!0}catch{return!1}}exportConfig(){return{providers:this.keyPool.exportConfig(),models:this.exportModelState(),bindings:{...this.bindings}}}getTunable(e){try{if(!D.existsSync(this.settingsPath))return;let o=D.readFileSync(this.settingsPath,"utf-8");return JSON.parse(o).tunables?.[e]}catch{return}}getModelInfo(e,o){let n=this.listModels({provider:e}).find(i=>i.model===o);if(n)return{id:n.model,name:n.displayName,contextWindow:n.contextWindow,maxOutput:n.maxOutput,streamRequired:n.streamRequired}}getProviderDefaultModel(e){return this.listModels({provider:e,enabledOnly:!0})[0]?.model??this.listModels({provider:e})[0]?.model}hasConfiguredKeyForProviderVariant(e){return this.providerVariantKeyCandidates(e).some(o=>!!this.keyPool.getPoolStatus(o)?.keys.some(i=>i.enabled))}hasAvailableKeyForProviderVariant(e){return this.providerVariantKeyCandidates(e).some(o=>this.keyPool.hasAvailableKey(o))}listProviderDefs(){return this.keyPool.getAllStatus().map(e=>({id:e.providerId,name:e.providerId,transport:"",baseUrl:e.baseUrl??"",defaultModel:this.getProviderDefaultModel(e.providerId),models:this.listModels({provider:e.providerId}).map(o=>({id:o.model,name:o.displayName,contextWindow:o.contextWindow,maxOutput:o.maxOutput,streamRequired:o.streamRequired}))}))}resolveProviderApiKey(e){return this.getKeyForProvider(e)??void 0}onChange(e){return this.changeListeners.push(e),()=>{let o=this.changeListeners.indexOf(e);o>=0&&this.changeListeners.splice(o,1)}}getKeyForProvider(e){let n=this.acquireKeyForProviderVariant(e)?.keyHandle;if(!n)return null;let i=n.apiKey;return n.release({success:!0}),i}snapshotProviderKeys(){let e={};for(let o of this.keyPool.getAllStatus()){let n=this.getKeyForProvider(o.providerId);n&&(e[o.providerId]=n)}return e}getProviderBaseUrl(e){return this.keyPool.getPoolStatus(e)?.baseUrl}acquireKeyForProviderVariant(e){for(let o of this.providerVariantKeyCandidates(e)){let n=this.keyPool.acquireKey(o);if(n)return{keyHandle:n,keyProviderId:o}}return null}resolveTechnicalVariant(e,o){let n=this.providerVariantKeyCandidates(e.provider).filter(s=>this.hasConfiguredKeyForProviderVariant(s));if(n.length===0)return;let i=this.providerVariantResolver.resolveBest({publicModel:e.model,requestedProtocol:es(e.transport),purpose:o,userPreference:{providerIds:n}});if(i)return{provider:i.provider,nativeModelId:i.nativeModelId}}providerVariantKeyCandidates(e){let o=[e],n=this.coreProviderRegistry.getProvider(e),i=n?.group??n?.id??e;for(let s of this.coreProviderRegistry.listProviders())(s.group??s.id)===i&&o.push(s.id);return i!==e&&o.push(i),[...new Set(o)]}loadModelState(e){for(let o of e)typeof o.id!="string"||!o.id||typeof o.enabled=="boolean"&&this.modelEnabledOverrides.set(o.id,o.enabled)}exportModelState(){let e=new Map;for(let[o,n]of this.modelEnabledOverrides)e.set(o,n);for(let o of this.models.values())e.set(o.id,o.enabled);return[...e.entries()].map(([o,n])=>({id:o,enabled:n}))}emitChange(){for(let e of this.changeListeners)try{e()}catch{}}},$e=null;function xt(){return $e||($e=new _t,$e.load()),$e}function es(t){switch(t){case"openai-chat":case"openai-responses":case"anthropic-messages":case"volcengine-responses":return t;default:return}}function Ct(t){let e=typeof t.content=="string"?t.content:t.content!=null?JSON.stringify(t.content):"";return Math.ceil(e.length/4)}function kt(t){let e=0;for(let o of t)e+=Ct(o);return e}var wt={"deepseek-v4-flash":1e6,"deepseek-v4-pro":1e6,"deepseek-chat":1e6,"deepseek-reasoner":1e6,"gpt-4o":128e3,"gpt-4o-mini":128e3,"claude-sonnet-4-20250514":2e5,"claude-3-5-haiku-20241022":2e5,"gemini-3.1-pro-preview":1e6,"gemini-3-flash-preview":1e6,"gemini-3.1-flash-lite":1e6};function ts(t){if(!t)return 128e3;if(t in wt)return wt[t];let e=t.toLowerCase();for(let[o,n]of Object.entries(wt))if(e.startsWith(o.toLowerCase()))return n;return 128e3}var os=8e3;var ns=new ie(200);var is=new se;function Do(){return is}function ss(){return ze(new ne(os),new X(20,Ct),new oe(Ct))}var rs=null;function No(t,e){let o=e?.budget??He({modelContextWindow:ts(e?.model)}),i=(e?.pipeline??ss()).compress(t,o);if(i.droppedCount>0){let s=kt(t),l=kt(i.messages);ns.record({timestamp:Date.now(),strategy:i.strategy,tokensBefore:s,tokensAfter:l,droppedCount:i.droppedCount,latencyMs:i.metrics?.latencyMs??0,usedLlm:!1,cacheInvalidated:i.metrics?.cacheInvalidated??!1,tier:Ke(s,o)})}return i.droppedCount>0&&rs?.(i.droppedCount,kt(i.messages)),i}function Fo(t,e,o){let n=o-e;return`[Budget] ${Math.round(t)}% used (${e.toLocaleString()} / ${o.toLocaleString()} tokens). ${n.toLocaleString()} tokens remaining. `+(t>=90?"Wrap up your current taskyou are near the token limit.":"Continue workingdo not summarize prematurely.")}var fs=new Set(["write","edit","patch","apply_patch"]);function gs(t){let e=t.split(".").pop()?.toLowerCase()??"";return["png","jpg","jpeg","gif","webp","svg","bmp","ico"].includes(e)?"image":["md","txt","pdf","doc","docx","rtf","html"].includes(e)?"document":["mermaid","mmd","dot","puml","plantuml"].includes(e)?"diagram":["csv","tsv","xlsx","xls"].includes(e)?"table":["ts","tsx","js","jsx","py","rs","go","java","c","cpp","h","cs","rb","sh","sql","json","yaml","yml","toml","xml","css","scss","vue","svelte"].includes(e)?"code":"file"}function hs(t){let e=t.split(".").pop()?.toLowerCase()??"";return{ts:"typescript",tsx:"typescriptreact",js:"javascript",jsx:"javascriptreact",py:"python",rs:"rust",go:"go",java:"java",c:"c",cpp:"cpp",h:"c",cs:"csharp",rb:"ruby",sh:"shellscript",sql:"sql",json:"json",yaml:"yaml",yml:"yaml",toml:"toml",xml:"xml",html:"html",css:"css",scss:"scss",vue:"vue",svelte:"svelte",md:"markdown"}[e]}var ys=/^no (matches|files|results) found\.?$|^file not found|^not found|^0 results|^\(exit code \d+, no output\)$/i,bs=new Set(["search","grep","glob","find","list","read","exec"]);function Ts(t){if(!bs.has(t.toolName))return!1;let e=typeof t.message?.content=="string"?t.message.content.trim():"";return e.length>0&&e.length<200&&ys.test(e)}function jo(t,e){for(let o=t.length-1;o>=0;o--){let n=t[o];if(!n||n.role!=="tool")continue;let i=typeof n.content=="string"?n.content:"";if(i.startsWith("Error: "))return i.slice(7).trim()}}function _s(t){return typeof t=="number"&&Number.isFinite(t)&&t>=1?Math.min(Math.round(t),100):Xt}function Go(t){let e=t.message.toLowerCase();return t.status===413||e.includes("prompt_too_long")||e.includes("context_length_exceeded")||e.includes("maximum context length")}function xs(t){return t==="length"||t==="max_tokens"}function zo(t){let e=t.message.toLowerCase();return(e.includes("image")||e.includes("media")||e.includes("file too large")||e.includes("payload too large"))&&(t.status===413||e.includes("too large")||e.includes("size"))}function ks(t){let e=t.headers;if(!e)return null;let o=e["retry-after"]??e["Retry-After"];if(!o)return null;let n=parseInt(o,10);return!isNaN(n)&&n>0?n*1e3:null}function ws(t){if(t.status!==400)return null;let e=t.message.match(/input length and `max_tokens` exceed context limit: (\d+) \+ (\d+) > (\d+)/);if(!e?.[1]||!e?.[3])return null;let o=parseInt(e[1],10),n=parseInt(e[3],10);if(isNaN(o)||isNaN(n))return null;let i=n-o-1e3;return i>=3e3?i:null}function Cs(t){return t.filter(e=>e.role!=="assistant"?!0:!(typeof e.content=="string"&&e.content.trim()===""))}async function*Ho(t,e,o,n){let{turnId:i,sessionId:s,messages:l,tools:r,model:d,apiKey:h,temperature:m=0,hooks:g,signal:M}=t,T={sessionId:s,turnId:i},S=t.maxTurns??0,x=t.querySource,{resolveToolEligibility:C}=await Promise.resolve().then(()=>(Wo(),Bo)),L=C(r,t.toolEligibilityContext),w=L.eligibleTools;for(let _ of L.blockedTools)yield{type:"tool_blocked",turnId:i,callId:"",name:_.toolName,reason:"blocked-by-policy"};if(!w.length){yield*Ss(i,d,l,h,m,M,e,n);return}let A=_s(t.maxRounds),$={contextWindowTokens:t.contextWindowTokens??Qt,responseBufferTokens:Zt,maxOutputTokens:t.maxOutputTokens??qt,abortSignal:M,reactiveCompactEnabled:!0,outputEscalationEnabled:!0},R=new Set,I=0,de=w,pe,a={messages:[...l],maxOutputTokensRecoveryCount:0,hasAttemptedReactiveCompact:!1,maxOutputTokensOverride:void 0,turnCount:1,transition:void 0,guardState:ct($),reactiveCompactState:ft(),toolLoopState:Ce({maxRounds:A,replayMessages:[...l]}).state,consecutiveFailedRounds:0,finalText:"",totalUsage:{inputTokens:0,outputTokens:0},collapseStore:Xe(),currentModel:d,consecutive529Errors:0,consecutiveApiRetries:0,stopHookActive:void 0,lastResponseId:void 0,snipRemovedIds:new Set,contentReplacementState:Ro(),budgetContinuationCount:0,lastBudgetDeltaTokens:0,lastBudgetGlobalTokens:0,identicalCallCounts:new Map,toolFailureCounts:new Map,fileReadCounts:new Map},St=Math.max(S*5,200),vt=0;for(;;){if(vt++,vt>St){n.info(`hard iteration cap reached (${St}), forcing completion`);let c=a.finalText||ue(a.messages,n);yield{type:"end",turnId:i,content:c,usage:a.totalUsage,model:a.currentModel};return}let{messages:_,maxOutputTokensRecoveryCount:Q,hasAttemptedReactiveCompact:Es,maxOutputTokensOverride:Mt,turnCount:Z,guardState:O,reactiveCompactState:W,collapseStore:De}=a,{toolLoopState:N}=a;if(pe){try{let c=await pe;c&&(yield{type:"tool_use_summary",turnId:i,summary:c})}catch{}pe=void 0}if(t.refreshTools&&Z>1){let c=t.refreshTools();c!==de&&(de=c,n.debug(`tools refreshed: ${c.length} tools`))}if(mt(O,$)){n.info(`turn aborted by guard at turn ${Z}`),yield{type:"error",turnId:i,error:"Turn aborted",code:"ABORTED",usage:a.totalUsage};return}let z=ut(O,$);if(z.level==="blocking"){z.reason==="prompt_too_long"&&J(W)&&(W.attemptedThisTurn=!0,O.hasAttemptedReactiveCompact=!0,n.info(`token budget blocking (${z.reason}), reactive compact needed`),yield{type:"recovery",turnId:i,action:"reactive_compact",detail:"token budget pre-check"}),n.info(`token budget blocking (${z.reason}), ending tool loop`);break}z.level==="warning"&&n.info(`token budget warning: ${z.usagePercent}% used, ${z.remainingTokens} remaining`);let U;{let c=await Po(_,a.contentReplacementState,s);U=c.messages,c.newlyReplacedCount>0&&(n.info(`tool-result-budget: persisted ${c.newlyReplacedCount} oversized tool results`),yield{type:"recovery",turnId:i,action:"tool_result_budget",detail:`${c.newlyReplacedCount} persisted`})}{let c=Ve(U,a.snipRemovedIds);U=c.messages,c.removedCount>0&&(n.info(`snip: removed ${c.removedCount} messages, freed ~${c.tokensFreed} tokens`),yield{type:"recovery",turnId:i,action:"snip",detail:`${c.removedCount} messages`})}{let u=new X().compress(U,0);u.droppedCount>0&&(U=u.messages,n.info(`microcompact: cleared ${u.droppedCount} old tool results`))}if(U=Ye(U,De).messages,O.promptTokens>0){let c=$.contextWindowTokens*.75,u=Do().getActive(),p;u?p=await u.compressAsync(U,c,{model:a.currentModel,sessionId:s}):p=No(U,{budget:c,model:a.currentModel}),p.droppedCount>0&&(U=p.messages,n.info(`autocompact: ${p.strategy}, dropped ${p.droppedCount}`),yield{type:"recovery",turnId:i,action:"autocompact",detail:`${p.strategy}: ${p.droppedCount} dropped`},a.hasAttemptedReactiveCompact=!1,g?.invoke("context.after_compact",{...T,removedCount:p.droppedCount}).catch(()=>{}))}U=Cs(U);let me=tt({tools:de,toolChoice:t.toolChoice??"auto"}),q=Ce({maxRounds:A,replayMessages:U,lastStopReason:N.lastStopReason,options:{stopReason:N.lastStopReason}}),Rt=me.extraSystemPrompt?[{role:"system",content:me.extraSystemPrompt},...q.state.replayMessages]:q.state.replayMessages;N=q.state,q.recoveryActions.length>0&&n.debug(`tool loop recovery: ${q.recoveryActions.map(c=>c.detail??c.kind).join("; ")}`),n.debug(`turn ${Z}, messages: ${Rt.length}`),g?.invoke("turn.before_inference",{...T,model:a.currentModel}).catch(()=>{});let fe=!1,Et=[],At=new Map,It="stop",F,k=null,ge=!1,ee=[],P=[];try{for await(let c of e.stream({model:a.currentModel,messages:Rt,tools:me.tools,toolChoice:me.normalizedToolChoice??"auto",temperature:m,maxTokens:(Mt??O.currentMaxOutputTokens)||void 0,streamRequired:t.streamRequired,previousResponseId:a.lastResponseId,reasoning:t.reasoning,promptCacheKey:t.promptCacheKey,promptCacheRetention:t.promptCacheRetention,serviceTier:t.serviceTier,openaiBuiltinTools:t.openaiBuiltinTools,maxToolCalls:t.maxToolCalls,parallelToolCalls:t.parallelToolCalls,textVerbosity:t.textVerbosity},h,M))switch(c.type){case"delta":Et.push(c.text),fe||(yield{type:"delta",turnId:i,text:c.text});break;case"tool_call_delta":fe=!0,gt(At,c);break;case"reasoning_delta":ee.push(c.text);break;case"reasoning_block_complete":c.signature&&P.push({thinking:ee.join(""),signature:c.signature}),ee.length=0;break;case"usage":F={inputTokens:c.promptTokens,outputTokens:c.completionTokens,reasoningTokens:c.reasoningTokens,cacheRead:c.cacheReadTokens,cacheWrite:c.cacheCreationTokens};break;case"response_id":a.lastResponseId=c.id;break;case"annotations":yield{type:"annotations",turnId:i,annotations:c.annotations};break;case"builtin_tool_status":yield{type:"heartbeat",turnId:i,message:`${c.toolType}: ${c.event}`};break;case"done":It=c.finishReason;break}if(fe||g?.invoke("turn.after_inference",{...T,model:a.currentModel}).catch(()=>{}),t.postSamplingHooks&&t.postSamplingHooks.length>0){let c=a.currentModel;for(let u of t.postSamplingHooks)try{u({messages:[...U],model:c,sessionId:s})}catch{}}}catch(c){if(c instanceof ae&&t.fallbackModel){n.info(`model fallback triggered: ${c.originalModel} \u2192 ${c.fallbackModel}`),yield{type:"recovery",turnId:i,action:"model_fallback",detail:`${c.originalModel} \u2192 ${c.fallbackModel}`},a={...a,currentModel:c.fallbackModel,consecutive529Errors:0,consecutiveApiRetries:0,transition:void 0};continue}let u=c instanceof Error?c.message:String(c),p=typeof c?.status=="number"?c.status:void 0;if(!p&&u&&(u.includes("ECONNRESET")||u.includes("EPIPE"))){let b=(a.consecutiveApiRetries??0)+1;if(b>re){n.info(`stale connection retry limit reached (${re}), aborting`),yield{type:"error",turnId:i,error:u,code:"RETRIES_EXHAUSTED",usage:a.totalUsage};return}n.info(`stale connection (${u.includes("ECONNRESET")?"ECONNRESET":"EPIPE"}): retrying`),yield{type:"recovery",turnId:i,action:"stale_connection_retry",detail:u.slice(0,80)},a={...a,consecutiveApiRetries:b,transition:void 0};continue}let f=ws({status:p,message:u});if(f!==null){n.info(`max_tokens overflow: adjusting to ${f}`),O.currentMaxOutputTokens=f,a={...a,maxOutputTokensOverride:f,transition:void 0};continue}if(lt(p)){a.consecutive529Errors++;let b=2,E=t.fallbackModel&&a.currentModel!==t.fallbackModel;if(a.consecutive529Errors>b&&!E&&!ve()){n.info(`transient ${p} \xD7 ${a.consecutive529Errors}: hard limit reached, aborting`),yield{type:"error",turnId:i,error:`API unavailable after ${a.consecutive529Errors} consecutive ${p} errors`,code:"API_ERROR",usage:a.totalUsage};return}if(a.consecutive529Errors>=ao&&t.fallbackModel&&a.currentModel!==t.fallbackModel){n.info(`529 \xD7 ${a.consecutive529Errors}: triggering fallback to ${t.fallbackModel}`),yield{type:"recovery",turnId:i,action:"model_fallback",detail:`529 \xD7 ${a.consecutive529Errors}`},a={...a,currentModel:t.fallbackModel,consecutive529Errors:0,transition:void 0};continue}if(ve()){let y=Se(a.consecutive529Errors);n.info(`persistent retry: waiting ${y}ms (attempt ${a.consecutive529Errors})`);let v=y;for(;v>0;){if(M?.aborted){yield{type:"error",turnId:i,error:"Aborted during retry wait",code:"ABORTED",usage:a.totalUsage};return}yield{type:"heartbeat",turnId:i,message:`Retrying in ${Math.ceil(v/1e3)}s (${p})`};let B=Math.min(v,ro);await new Promise(Be=>setTimeout(Be,B)),v-=B}a={...a,transition:void 0};continue}if(at(x)){let v=ks({status:p,message:u})??Se(a.consecutive529Errors);n.info(`transient ${p}: retry in ${v}ms`),yield{type:"recovery",turnId:i,action:"retry",detail:`${p} retry in ${v}ms`},await new Promise(B=>setTimeout(B,v)),a={...a,transition:void 0};continue}n.info(`background source ${x}: not retrying ${p}`)}k={status:p,message:u}}if(k&&g?.invoke("turn.after_inference",{...T,model:a.currentModel,response:{error:k.message}}).catch(()=>{}),k)if(Go(k))ge=!0,n.info(`withheld prompt_too_long error (status=${k.status})`);else if(zo(k))ge=!0,n.info(`withheld media_size error (status=${k.status})`);else{let c=dt({status:k.status??500,message:k.message},O,$);if(c.action==="reactive_compact"&&J(W)&&(W.attemptedThisTurn=!0,O.hasAttemptedReactiveCompact=!0,yield{type:"recovery",turnId:i,action:"reactive_compact",detail:`API ${k.status??500}: ${k.message}`}),c.action==="retry"){let p=(a.consecutiveApiRetries??0)+1;if(p>re){n.info(`API retry limit reached (${re}), aborting`);let f=Y(k.status,k.message);yield{type:"error",turnId:i,error:k.message,code:f,usage:a.totalUsage};return}yield{type:"recovery",turnId:i,action:"retry",detail:c.reason},a={...a,consecutiveApiRetries:p,transition:void 0};continue}let u=Y(k.status,k.message);g?.invoke("stop.failure",{sessionId:s,reason:u,error:k.message}).catch(()=>{}),yield{type:"error",turnId:i,error:k.message,code:u,usage:a.totalUsage};return}F&&(a.totalUsage.inputTokens+=F.inputTokens,a.totalUsage.outputTokens+=F.outputTokens,F.reasoningTokens&&(a.totalUsage.reasoningTokens=(a.totalUsage.reasoningTokens??0)+F.reasoningTokens),F.cacheRead&&(a.totalUsage.cacheRead=(a.totalUsage.cacheRead??0)+F.cacheRead),F.cacheWrite&&(a.totalUsage.cacheWrite=(a.totalUsage.cacheWrite??0)+F.cacheWrite)),F?.inputTokens&&(O.promptTokens=F.inputTokens);let Ot=Et.join("");Ot&&(a.finalText=Ot);let j=[...At.values()].map(c=>({id:c.id||`tc_${i}_${Z}_${Math.random().toString(36).slice(2,8)}`,type:"function",function:{name:c.name,arguments:c.arguments}}));if(j.length===0&&!fe){if(ge&&k&&Go(k)){if(a.transition?.reason!=="collapse_drain_retry"){let p=Je(U,De);if(p.committed>0){n.info(`collapse drain: committed ${p.committed} stages`),yield{type:"recovery",turnId:i,action:"collapse_drain",detail:`${p.committed} stages committed`},a={...a,messages:p.messages,transition:{reason:"collapse_drain_retry",committed:p.committed}};continue}}if(J(W)){W.attemptedThisTurn=!0,O.hasAttemptedReactiveCompact=!0,n.info("withheld 413: reactive compact attempt"),yield{type:"recovery",turnId:i,action:"reactive_compact",detail:"withheld prompt_too_long"},a={...a,hasAttemptedReactiveCompact:!0,transition:{reason:"reactive_compact_retry"}};continue}n.info("withheld 413: recovery exhausted, surfacing error"),g?.invoke("stop.failure",{sessionId:s,reason:"prompt_too_long",error:k.message}).catch(()=>{}),yield{type:"error",turnId:i,error:k.message,code:"PROMPT_TOO_LONG",usage:a.totalUsage};return}if(ge&&k&&zo(k)){if(J(W)){W.attemptedThisTurn=!0,O.hasAttemptedReactiveCompact=!0,n.info("withheld media error: reactive compact strip-retry"),yield{type:"recovery",turnId:i,action:"reactive_compact",detail:"media error strip-retry"},a={...a,hasAttemptedReactiveCompact:!0,transition:{reason:"reactive_compact_retry"}};continue}n.info("withheld media error: recovery exhausted"),g?.invoke("stop.failure",{sessionId:s,reason:"media_error",error:k.message}).catch(()=>{}),yield{type:"error",turnId:i,error:k.message,code:"IMAGE_ERROR",usage:a.totalUsage};return}if(xs(It)){O.consecutiveTruncations+=1;let p=t.modelMaxOutputTokens??eo,f=pt(O,$,p);if(f.shouldEscalate&&Mt===void 0){O.currentMaxOutputTokens=f.newMax,n.info(`max_output_tokens escalate: ${f.newMax} tokens`),yield{type:"recovery",turnId:i,action:"output_escalation",detail:`${f.newMax} tokens`},a={...a,maxOutputTokensOverride:oo,transition:{reason:"max_output_tokens_escalate"}};continue}if(Q<to){let b={role:"user",content:"Output token limit hit. Resume directly \u2014 no apology, no recap of what you were doing. Pick up mid-thought if that is where the cut happened. Break remaining work into smaller pieces."};n.info(`max_output_tokens recovery #${Q+1}`),yield{type:"recovery",turnId:i,action:"max_output_tokens_recovery",detail:`attempt ${Q+1}`},a={...a,messages:[...U,b],maxOutputTokensRecoveryCount:Q+1,maxOutputTokensOverride:void 0,transition:{reason:"max_output_tokens_recovery",attempt:Q+1}};continue}n.info("max_output_tokens recovery exhausted, completing with partial content")}else O.consecutiveTruncations=0;if(N=we(N,{replayMessages:_,lastStopReason:"completed"}),g){let p=await g.invoke("stop",{sessionId:s,reason:"completed"});if(p.action==="prevent"){n.info(`stop hook prevented continuation: ${p.reason??"no reason"}`),yield{type:"end",turnId:i,content:a.finalText,usage:a.totalUsage,model:a.currentModel};return}if(p.action==="abort"){let f=p.reason??"Stop hook requested continuation";n.info(`stop hook blocking: ${f}`);let b={role:"user",content:f},E={role:"assistant",content:a.finalText,...P.length>0&&{thinkingBlocks:[...P]}};a={...a,messages:[..._,E,b],stopHookActive:!0,transition:{reason:"stop_hook_blocking"}};continue}}if(t.tokenBudget&&t.tokenBudget>0&&a.budgetContinuationCount<5){let p=a.totalUsage.inputTokens+a.totalUsage.outputTokens+(a.totalUsage.reasoningTokens??0),f=p/t.tokenBudget*100,b=p-a.lastBudgetGlobalTokens,E=a.budgetContinuationCount>=no&&b<Qe&&a.lastBudgetDeltaTokens<Qe;if(E&&n.info(`token budget early stop: diminishing returns at ${Math.round(f)}% (delta=${b})`),!E&&f<90){let y=a.budgetContinuationCount+1,v={role:"user",content:Fo(f,p,t.tokenBudget)};n.info(`token budget continuation #${y}: ${Math.round(f)}% used`),yield{type:"recovery",turnId:i,action:"budget_continuation",detail:`${Math.round(f)}% used (#${y})`};let B={role:"assistant",content:a.finalText,...P.length>0&&{thinkingBlocks:[...P]}};a={...a,messages:[..._,B,v],budgetContinuationCount:y,lastBudgetDeltaTokens:b,lastBudgetGlobalTokens:p,transition:{reason:"token_budget_continuation"}};continue}}if(!a.stopHookActive){let p=l.find(y=>y.role==="user"),f=typeof p?.content=="string"?p.content:"",b=/创建文件|生成文件|写入|写一个|建一个|新建|重写|改写|create\s+(a\s+)?file|write\s+(a\s+)?file|make\s+(a\s+)?file|修改|改成|把.*改|文件名叫/i.test(f),E=R.has("write")||R.has("edit");if(b&&!E){if(n.info("AP1 action-verification: user requested file action but no write/edit tool was called, injecting nudge"),I>0){let B=[..._].reverse().find(Be=>Be.role==="tool");B&&typeof B.content=="string"&&(B.content+=`
|
|
18
18
|
|
|
19
|
-
\u26A0\uFE0F NOTE: You used shell commands but did not call the write or edit tool to create/modify the file. Shell commands may fail silently or produce incorrect results on this platform. Please use the 'write' tool directly to create the requested file with the correct content.`)}let
|
|
19
|
+
\u26A0\uFE0F NOTE: You used shell commands but did not call the write or edit tool to create/modify the file. Shell commands may fail silently or produce incorrect results on this platform. Please use the 'write' tool directly to create the requested file with the correct content.`)}let y={role:"user",content:I===0?"You described what to do but did not actually call any tool to write or edit a file. Please use the write or edit tool now to perform the requested action. Do not just describe the changes \u2014 actually make them.":"You used shell commands but did not call the write or edit tool to create/modify the file. Shell commands may fail on this platform. Please use the write tool directly to create the requested file with the correct content."},v={role:"assistant",content:a.finalText,...P.length>0&&{thinkingBlocks:[...P]}};a={...a,messages:[..._,v,y],stopHookActive:!0,transition:{reason:"stop_hook_blocking"}};continue}}if(!a.stopHookActive&&I>=3&&R.has("write")){let p=0;for(let f of _){let b=f,E=b.is_error===!0||typeof b.content=="string"&&b.content.startsWith("Error:");b.role==="tool"&&typeof b.content=="string"&&!E&&p++}if(p>=3){n.info("AP3 verification nudge: 3+ files created, injecting completeness check");let f={role:"user",content:"You created multiple files. Before completing, verify: (1) All imports between your files resolve to real exports. (2) No TODO, placeholder, or 'not implemented' stubs remain. (3) Functions that are imported are actually called, not just declared. If everything is correct, confirm completion. If not, fix the issues now."},b={role:"assistant",content:a.finalText,...P.length>0&&{thinkingBlocks:[...P]}};a={...a,messages:[..._,b,f],stopHookActive:!0,transition:{reason:"stop_hook_blocking"}};continue}}if(I>0){let p={ok:!0,toolCallCount:I,distinctToolCount:R.size,multiStep:I>=2,hasSubAgent:!1,feedback:null,existingSkillName:null},f=ke(p,{tools:[...R],projectRoot:t.projectRoot});f&&(yield{type:"skill_instruction",turnId:i,instruction:f})}let u=a.finalText||ue(_,n);yield{type:"end",turnId:i,content:u,usage:a.totalUsage,model:a.currentModel};return}let Yo=P.length===0&&ee.length>0?ee.join(""):void 0;_.push(We(j,a.finalText||void 0,P.length>0?P:void 0,Yo)),N=rt(N,{replayMessages:_,pendingToolCallIds:j.map(c=>c.id),completedToolCallIds:N.completedToolCallIds,lastStopReason:"tool_calls"});let he=a.identicalCallCounts,Ut=[],ye=[],Pt=!1;for(let c of j){let u=`${c.function.name}::${c.function.arguments}`,p=he.get(u)??0;he.set(u,p+1),p+1>Jt?(ye.push(c),Pt||(Pt=!0,n.info(`AP4 blocked: ${c.function.name} repeated ${p+1}x`))):Ut.push(c)}let be=[];for(let c of ye){let u=he.get(`${c.function.name}::${c.function.arguments}`),p=jo(_,c.function.name),f=p?`This exact tool call has been attempted ${u} times. Last error: ${p}. Do not retry. Report this error to the user.`:`This exact tool call has been attempted ${u} times and keeps failing. Do not retry it. Report the issue to the user or try a completely different approach.`,b=G(c.id,{ok:!1,error:f});_.push(b),be.push(c.id),R.add(c.function.name),I++,yield{type:"tool_result",turnId:i,callId:c.id,name:c.function.name,ok:!1,error:f}}if(ye.length>0){let c=jo(_,ye[0].function.name),u={role:"user",content:"Tool calls were blocked because you repeated them with identical arguments too many times. "+(c?`The error was: "${c}". Tell the user about this error. `:"The operation is not working. ")+"Stop retrying and report the result to the user."};_.push(u)}let Te=[],Ne=[];for(let c of Ut)(a.toolFailureCounts.get(c.function.name)??0)>=_e?Ne.push(c):Te.push(c);if(Ne.length>0){for(let u of Ne){let p=a.toolFailureCounts.get(u.function.name),f=`Tool "${u.function.name}" has failed ${p} times this turn with different arguments. The target likely does not exist. Stop trying variations and report the issue to the user.`,b=G(u.id,{ok:!1,error:f});_.push(b),be.push(u.id),R.add(u.function.name),I++,yield{type:"tool_result",turnId:i,callId:u.id,name:u.function.name,ok:!1,error:f},n.info(`AP4-variant blocked: ${u.function.name} failed ${p}x with different args`)}let c={role:"user",content:"Tool calls were blocked because the tool has failed too many times with different arguments. The resource you are looking for does not exist. Stop trying variations and tell the user what happened."};_.push(c)}for(let c of Te){let u=c.function.arguments,p=de.find(f=>f.function.name===c.function.name);if(p?.backfillObservableInput)try{let f=JSON.parse(c.function.arguments),b={...f};p.backfillObservableInput(b),Object.keys(b).some(y=>!(y in f))&&(u=JSON.stringify(b))}catch{}yield{type:"tool_call",turnId:i,callId:c.id,name:c.function.name,arguments:u}}let Jo=new Map(a.toolFailureCounts);try{let c=new Pe({toolInvoker:o,hooks:g,sessionId:s,turnId:i,log:n,signal:M,maxConcurrentTools:t?.maxConcurrentTools});for(let u of Te)c.addTool(u);for await(let u of c.getRemainingResults()){u.blocked&&(yield{type:"tool_blocked",turnId:i,callId:u.callId,name:u.toolName,reason:u.blockReason??"blocked"}),_.push(u.message),be.push(u.callId),R.add(u.toolName),I++;let p=u.ok&&Ts(u);if(!u.ok||p){let y=(a.toolFailureCounts.get(u.toolName)??0)+1;a.toolFailureCounts.set(u.toolName,y)}if(u.ok&&u.toolName==="read"){let E=Te.find(y=>y.id===u.callId);if(E)try{let y=JSON.parse(E.function.arguments),v=y.file_path??y.path??y.filePath??"";if(v){let B=a.fileReadCounts.get(v)??0;a.fileReadCounts.set(v,B+1)}}catch{}}let f=typeof u.message?.content=="string"?u.message.content:"",b=u.ok&&f?f.slice(0,2e3):void 0;if(yield{type:"tool_result",turnId:i,callId:u.callId,name:u.toolName,ok:u.ok,error:u.error,outputPreview:b},u.ok){let E=j.find(y=>y.id===u.callId);if(E){if(u.toolName==="plan_mode")try{let y=JSON.parse(E.function.arguments);y.action==="exit"&&typeof y.plan=="string"&&y.plan.length>0&&(yield{type:"plan_update",turnId:i,slug:"approved-plan",content:y.plan})}catch{}if(fs.has(u.toolName))try{let y=JSON.parse(E.function.arguments),v=typeof y.file_path=="string"?y.file_path:typeof y.filePath=="string"?y.filePath:typeof y.path=="string"?y.path:void 0;v&&(yield{type:"artifact",turnId:i,artifactId:`artifact-${u.callId}`,artifactType:gs(v),title:v.split(/[\\/]/).pop()||v,filePath:v,language:hs(v)})}catch{}}}}}catch(c){let u=c instanceof Error?c.message:String(c);yield{type:"error",turnId:i,error:u,code:"TOOL_EXECUTION_ERROR",usage:a.totalUsage};return}for(let[c,u]of a.toolFailureCounts)u>=_e&&(Jo.get(c)??0)<_e&&_.push({role:"user",content:`Tool "${c}" has now failed/returned empty results ${u} times with different arguments. The target clearly does not exist. Do NOT call "${c}" again. Report the result to the user immediately.`});if(N=we(N,{replayMessages:_,completedToolCallIds:[...N.completedToolCallIds,...be],lastStopReason:"tool_calls"}),t.generateToolUseSummary&&j.length>0){let c=j.map(u=>({name:u.function.name,arguments:u.function.arguments}));pe=t.generateToolUseSummary(c).catch(()=>null)}let Qo=j.length>0&&j.every(c=>{let u=_.find(f=>f?.role==="tool"&&f?.tool_call_id===c.id);if(!u)return!0;let p=u.content;return typeof p=="string"&&p.startsWith("Error: ")}),te=a.consecutiveFailedRounds;if(Qo){if(te+=1,te>=Yt){let c=a.finalText||ue(_,n);n.info(`early exit: ${te} consecutive failed rounds, returning ${a.finalText?"partial":"fallback"} response`),yield{type:"end",turnId:i,content:c,usage:a.totalUsage,model:a.currentModel};return}}else te=0;let Zo=3,Lt=[...a.fileReadCounts.entries()].filter(([,c])=>c>=Zo);if(Lt.length>0){let c=Lt.map(([p])=>p).join(", ");n.info(`AP5: file read cycle detected on ${c}, injecting nudge`);let u={role:"user",content:`You are reading the same files repeatedly (${c}). This indicates a circular dependency or cycle. Stop reading files, summarize your findings so far, and explain the circular structure to the user.`};_.push(u),a.fileReadCounts.clear()}let Fe=Z+1;if(S>0&&Fe>S){if(n.info(`max turns reached (${S}), completing`),g){let u=await g.invoke("stop",{sessionId:s,reason:"max_turns"});if(u.action==="abort"){let p=u.reason??"Stop hook requested continuation after max_turns",f={role:"assistant",content:a.finalText,...P.length>0&&{thinkingBlocks:[...P]}};a={...a,messages:[..._,f,{role:"user",content:p}],stopHookActive:!0,transition:{reason:"stop_hook_blocking"}};continue}}let c=a.finalText||ue(_,n);yield{type:"end",turnId:i,content:c,usage:a.totalUsage,model:a.currentModel};return}if(Fe>A){if(n.info(`tool loop budget exhausted (${A} rounds), returning`),I>0){let u={ok:!0,toolCallCount:I,distinctToolCount:R.size,multiStep:I>=2,hasSubAgent:!1,feedback:null,existingSkillName:null},p=ke(u,{tools:[...R],projectRoot:t.projectRoot});p&&(yield{type:"skill_instruction",turnId:i,instruction:p})}let c=a.finalText||ue(_,n);yield{type:"end",turnId:i,content:c,usage:a.totalUsage,model:a.currentModel};return}a={messages:_,maxOutputTokensRecoveryCount:0,hasAttemptedReactiveCompact:!1,maxOutputTokensOverride:void 0,turnCount:Fe,transition:{reason:"next_turn"},guardState:O,reactiveCompactState:W,toolLoopState:N,consecutiveFailedRounds:te,finalText:a.finalText,totalUsage:a.totalUsage,collapseStore:De,currentModel:a.currentModel,consecutive529Errors:0,consecutiveApiRetries:0,stopHookActive:a.stopHookActive,lastResponseId:a.lastResponseId,snipRemovedIds:a.snipRemovedIds,contentReplacementState:a.contentReplacementState,budgetContinuationCount:0,lastBudgetDeltaTokens:0,lastBudgetGlobalTokens:0,identicalCallCounts:he,toolFailureCounts:a.toolFailureCounts,fileReadCounts:a.fileReadCounts}}}function ue(t,e){let o=[];for(let n=t.length-1;n>=0;n--){let i=t[n];if(i.role==="tool"&&typeof i.content=="string")o.unshift(i.content.slice(0,500));else if(i.role==="assistant"){if(typeof i.content=="string"&&i.content.trim())return e.info("synthesizeFallbackContent: found assistant text, using it"),i.content;break}else break}return o.length>0?(e.info(`synthesizeFallbackContent: synthesized from ${o.length} tool result(s)`),o.join(`
|
|
20
20
|
|
|
21
|
-
`)):""}async function*
|
|
22
|
-
`);
|
|
23
|
-
${R}`})}}this.hooks.invoke("memory.after_recall",{sessionId:e.sessionId,turnId:n,blockCount:
|
|
21
|
+
`)):""}async function*Ss(t,e,o,n,i,s,l,r){let d=[],h;r.debug(`single LLM round, messages: ${o.length}`);for await(let m of l.stream({model:e,messages:o,temperature:i},n,s))switch(m.type){case"delta":d.push(m.text),yield{type:"delta",turnId:t,text:m.text};break;case"usage":h={inputTokens:m.promptTokens,outputTokens:m.completionTokens,reasoningTokens:m.reasoningTokens,cacheRead:m.cacheReadTokens,cacheWrite:m.cacheCreationTokens};break;case"done":break}yield{type:"end",turnId:t,content:d.join(""),usage:h??{inputTokens:0,outputTokens:0},model:e}}var vs={coding:[/(?:bug|error|fix|debug|报错|修复|编译|compile|build|lint)/i,/(?:implement|refactor|重构|实现|代码|code|function|method|class)/i,/(?:test|测试|vitest|jest|断言|assert)/i,/(?:type(?:script)?|接口|interface|generic|泛型)/i,/(?:import|export|module|依赖|package|npm|pnpm)/i,/(?:git|commit|branch|merge|rebase|PR|MR)/i],config:[/(?:deploy|部署|运维|docker|container|kubernetes|k8s)/i,/(?:port|端口|config|配置|env|环境变量|.env)/i,/(?:server|service|daemon|进程|systemd|nginx|redis)/i,/(?:版本|version|upgrade|migrate|迁移)/i,/(?:domain|域名|ssl|cert|证书|DNS)/i],conversation:[/(?:你好|hi|hello|hey|请问|问一下)/i,/(?:我(?:喜欢|偏好|习惯|想)|prefer|I (?:like|want|need))/i,/(?:帮我|help me|能不能|可以吗|would you)/i,/(?:style|风格|format|格式|命名|naming)/i],learning:[/(?:best practice|最佳实践|pattern|模式|惯例|convention)/i,/(?:怎么做|how to|how do|what's the|推荐|recommend)/i,/(?:为什么|why|原因|reason|explain|解释)/i,/(?:lesson|经验|教训|gotcha|pitfall|坑)/i],decision:[/(?:should|应该|选择|choose|decision|决定|trade-?off|权衡)/i,/(?:vs|versus|对比|compare|区别|difference)/i,/(?:architecture|架构|方案|approach|strategy)/i,/(?:pros|cons|优缺点|利弊|好处|坏处)/i],general:[]},Ms={coding:{preferred:["lesson","pattern","fact"],deprioritized:["preference"]},config:{preferred:["fact","decision","lesson"],deprioritized:["preference","skill-learning"]},conversation:{preferred:["preference","fact"],deprioritized:["pattern","skill-learning"]},learning:{preferred:["lesson","pattern","skill-learning"],deprioritized:["preference"]},decision:{preferred:["decision","fact","lesson"],deprioritized:["skill-learning","preference"]},general:{preferred:[],deprioritized:[]}};function Ko(t){if(!t||t.length<5)return{scenario:"general",preferred:[],deprioritized:[],confidence:0};let e=[];for(let[i,s]of Object.entries(vs)){if(i==="general")continue;let l=s.filter(r=>r.test(t)).length;if(l>0){let r=Math.min(1,l/2);e.push({scenario:i,score:r})}}if(e.length===0)return{scenario:"general",preferred:[],deprioritized:[],confidence:0};e.sort((i,s)=>s.score-i.score);let o=e[0];if(o.score<.5)return{scenario:"general",preferred:[],deprioritized:[],confidence:o.score};let n=Ms[o.scenario];return{scenario:o.scenario,preferred:n.preferred,deprioritized:n.deprioritized,confidence:o.score}}var Xo=class{transport;apiKey;toolInvoker;log;hooks;maxRounds;projectRoot;constructor(e){this.transport=e.llmTransport,this.apiKey=e.apiKey,this.toolInvoker=e.toolInvoker,this.log=e.log,this.hooks=e.hooks,this.projectRoot=e.projectRoot,this.maxRounds=Math.min(e.maxRounds??25,100)}async*run(e,o){let{turnId:n,messages:i,tools:s,systemPrompt:l,config:r}=e,d={sessionId:e.sessionId,turnId:n};yield{type:"start",turnId:n},this.hooks?.invoke("turn.submitted",{...d,prompt:i[i.length-1]?.content??void 0}).catch(()=>{});let h=st(i),m=[];if(l&&m.push({role:"system",content:l}),m.push(...h),this.hooks){let T=h.filter(x=>x.role==="user").pop(),S=typeof T?.content=="string"?T.content.slice(0,500):void 0;if(S)try{let x=Ko(S),C=await this.hooks.invoke("memory.before_recall",{sessionId:e.sessionId,turnId:n,query:S,preferredCategories:x.preferred.length>0?x.preferred:void 0,deprioritizedCategories:x.deprioritized.length>0?x.deprioritized:void 0}),L=C?.context?.recalledMemories;if(L&&L.length>0){let A=0,$=[];for(let R of L){let I=(R.text?.length??0)*2;if(A+I>8192)break;$.push(R),A+=I}if($.length>0){let R=$.map(I=>`- ${I.text}`).join(`
|
|
22
|
+
`);m.splice(l?1:0,0,{role:"system",content:`[Recalled memories \u2014 context priority: project-specific facts override general user preferences when they conflict]
|
|
23
|
+
${R}`})}}this.hooks.invoke("memory.after_recall",{sessionId:e.sessionId,turnId:n,blockCount:C?.context?.recalledMemories?.length??0}).catch(()=>{})}catch{}}let g=r?.model??"",M=Math.min(r?.maxRounds??this.maxRounds,100);try{let T=async C=>{let L=xt().resolveModelForPurpose("smallModel");if(!L)return null;try{let w=C.map(R=>`${R.name}(${R.arguments.slice(0,200)})`).join(", "),A=this.transport.stream({model:L,messages:[{role:"system",content:"Summarize the tool usage in ~30 chars, git-commit-subject style. Reply with ONLY the summary, nothing else."},{role:"user",content:w}],tools:[],maxTokens:60},r?.apiKey??this.apiKey),$="";for await(let R of A)R.type==="delta"&&($+=R.text);return $.trim()||null}catch{return null}},S={turnId:n,sessionId:e.sessionId,messages:m,tools:s,model:g,apiKey:r?.apiKey??this.apiKey,temperature:r?.temperature,maxRounds:M,contextWindowTokens:r?.contextWindowTokens,maxOutputTokens:r?.maxOutputTokens,modelMaxOutputTokens:r?.modelMaxOutputTokens,toolChoice:r?.toolChoice,parentDepth:r?.parentDepth,hooks:this.hooks,fallbackModel:r?.fallbackModel,maxTurns:r?.maxTurns,tokenBudget:r?.tokenBudget,maxConcurrentTools:r?.maxConcurrentTools,streamRequired:r?.streamRequired,reasoning:r?.reasoning,promptCacheKey:r?.promptCacheKey,promptCacheRetention:r?.promptCacheRetention,serviceTier:r?.serviceTier,openaiBuiltinTools:r?.openaiBuiltinTools,maxToolCalls:r?.maxToolCalls,parallelToolCalls:r?.parallelToolCalls,textVerbosity:r?.textVerbosity,projectRoot:this.projectRoot,generateToolUseSummary:T,signal:o},x;for await(let C of Ho(S,this.transport,this.toolInvoker,this.log))x=C,yield C;x?.type==="end"?this.hooks?.invoke("turn.completed",{...d}).catch(()=>{}):x?.type==="error"&&this.hooks?.invoke("turn.failed",{...d,code:x.code,error:x.error}).catch(()=>{})}catch(T){if(o?.aborted)this.hooks?.invoke("turn.failed",{...d,code:"ABORTED",error:"Turn aborted"}).catch(()=>{}),yield{type:"error",turnId:n,error:"Turn aborted",code:"ABORTED"};else{let S=T instanceof Error?T.message:String(T),x=typeof T?.status=="number"?T.status:void 0,C=Y(x,S);this.log.error(`turn ${n} error [${C}, retryable=${Ge(C)}]: ${S}`),this.hooks?.invoke("turn.failed",{...d,code:C,error:S}).catch(()=>{}),yield{type:"error",turnId:n,error:S,code:C}}}}};export{Xo as Agent};
|