qlogicagent 2.10.5 → 2.10.7
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 +1 -1
- package/dist/cli.js +9 -9
- package/dist/index.js +8 -8
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -11,7 +11,7 @@ var $k=Object.defineProperty;var fi=(o=>typeof require<"u"?require:typeof Proxy<
|
|
|
11
11
|
${m}`}))}if(l.length===0)return o;let d=[...o],u=-1;for(let p=0;p<d.length;p++)d[p].role==="system"&&(u=p);return d.splice(u+1,0,...l),d}function wi(o,e,t=Si){if(e.size===0)return{messages:o,tokensFreed:0,removedCount:0};let n=0,r=0,s=[];for(let a of o){let l=a.tool_call_id??"";if(l&&e.has(l)){n+=t(a),r++,e.delete(l);continue}s.push(a)}let i=r>0?{role:"system",content:`[${r} messages removed by snip]`}:void 0;return{messages:s,tokensFreed:n,removedCount:r,boundaryMessage:i}}var Od,Dn,bn,fo,go,Ld,ho,yo,hv,on,xi=N(()=>{"use strict";Od=4,Dn=class{constructor(e){this.estimateTokens=e}estimateTokens;compress(e,t){let n=[],r=[];for(let d of e)d.role==="system"?n.push(d):r.push(d);let s=t;for(let d of n)s-=this.estimateTokens(d);let i;for(let d of r)if(d.role==="user"){i=d;break}if(i&&(s-=this.estimateTokens(i)),s<=0)return{messages:i?[...n,i]:n,droppedCount:r.length-(i?1:0),strategy:"sliding-window"};let a=[],l=0;for(let d=r.length-1;d>=0;d--){let u=r[d];if(u===i)continue;let p=this.estimateTokens(u);if(s-p<0&&l>=Od)break;if(s-p<0&&l<Od){a.unshift(u),l++;continue}s-=p,a.unshift(u),l++}let c=[...n];return i&&!a.includes(i)&&c.push(i),c.push(...a),{messages:c,droppedCount:r.length-(a.length+(i&&!a.includes(i)?1:0)),strategy:"sliding-window"}}},bn=class{constructor(e=8e3){this.maxToolResultChars=e}maxToolResultChars;compress(e,t){let n=0;return{messages:e.map(s=>s.role!=="tool"||typeof s.content!="string"||s.content.length<=this.maxToolResultChars?s:(n++,{...s,content:fv(s.content,this.maxToolResultChars)})),droppedCount:n,strategy:"tool-result-trim"}}};fo=class{config;constructor(e){this.config={protectedHeadExchanges:e.protectedHeadExchanges,protectedTailMessages:e.protectedTailMessages,summarize:e.summarize,estimateTokens:e.estimateTokens??Si,taskContext:e.taskContext}}compress(e,t){return{messages:e,droppedCount:0,strategy:"head-tail-protected"}}async compressAsync(e,t){let n=Date.now(),{system:r,nonSystem:s}=gv(e),i=e.reduce((I,P)=>I+this.config.estimateTokens(P),0);if(i<=t)return{messages:e,droppedCount:0,strategy:"head-tail-protected"};let a=0,l=0;for(let I=0;I<s.length&&(s[I].role==="user"&&l++,!(l>this.config.protectedHeadExchanges));I++)a=I+1;let c=Math.max(this.config.protectedTailMessages,Math.floor(s.length*.4)),d=Math.max(a,s.length-c);if(d<=a)return{messages:e,droppedCount:0,strategy:"head-tail-protected"};let u=s.slice(0,a),p=s.slice(a,d),m=s.slice(d),h=Dd(p,{taskContext:this.config.taskContext}),f=await this.config.summarize(p,h),y={role:"system",content:`[Conversation summary \u2014 ${p.length} messages compressed]
|
|
12
12
|
|
|
13
13
|
${f}`},b=[...r,...u,y,...m],k=Date.now()-n,x=b.reduce((I,P)=>I+this.config.estimateTokens(P),0);return{messages:b,droppedCount:p.length,strategy:"head-tail-protected",metrics:{tokensBefore:i,tokensAfter:x,compressionRatio:i>0?x/i:1,latencyMs:k,usedLlm:!0,cacheInvalidated:!0}}}},go=class{config;constructor(e){this.config=e}compress(e,t){let n=kr(e),r=this.config.inner.compress(e,t),s=kr(r.messages),i=n!==s&&r.droppedCount>0;return i&&this.config.onCacheInvalidated?.({droppedCount:r.droppedCount,strategy:r.strategy}),{...r,metrics:{...r.metrics??{tokensBefore:0,tokensAfter:0,compressionRatio:0,latencyMs:0,usedLlm:!1},cacheInvalidated:i}}}async compressAsync(e,t){let n=kr(e),r=bo(this.config.inner)?await this.config.inner.compressAsync(e,t):this.config.inner.compress(e,t),s=kr(r.messages),i=n!==s&&r.droppedCount>0;return i&&this.config.onCacheInvalidated?.({droppedCount:r.droppedCount,strategy:r.strategy}),{...r,metrics:{...r.metrics??{tokensBefore:0,tokensAfter:0,compressionRatio:0,latencyMs:0,usedLlm:!1},cacheInvalidated:i}}}},Ld={modelContextWindow:128e3,targetUsageRatio:.75,minBudget:16e3,maxBudget:12e4};ho=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 t=0,n=0,r=0,s=0,i=0;for(let a of this.events)t+=a.tokensBefore>0?a.tokensAfter/a.tokensBefore:1,n+=a.latencyMs,r+=Math.max(0,a.tokensBefore-a.tokensAfter),a.usedLlm&&s++,a.cacheInvalidated&&i++;return{totalCompressions:e,totalLlmCalls:s,totalCacheInvalidations:i,averageCompressionRatio:t/e,averageLatencyMs:n/e,totalTokensSaved:r,recentEvents:this.events.slice(-10)}}reset(){this.events.length=0}},yo=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}))}};hv=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"]),on=class{constructor(e=20,t=Si){this.preserveRecentCount=e;this.estimateTokens=t}preserveRecentCount;estimateTokens;compress(e,t){if(e.length<=this.preserveRecentCount)return{messages:e,droppedCount:0,strategy:"micro-compact"};let n=e.length-this.preserveRecentCount,r=0,s=0;return{messages:e.map((a,l)=>{if(l>=n||a.role!=="tool"||typeof a.content!="string"||!a.name||!hv.has(a.name)||a.content.length<=200)return a;let c=this.estimateTokens(a);return s+=c,r++,{...a,content:`[result cleared \u2014 ${a.content.length} chars]`}}),droppedCount:r,strategy:"micro-compact",metrics:r>0?{tokensBefore:0,tokensAfter:0,compressionRatio:0,latencyMs:0,usedLlm:!1,cacheInvalidated:!1}:void 0}}}});function Ri(){return{stages:[]}}function _i(o,e,t){let n=t?.thresholdMessages??40;if(o.filter(a=>a.role!=="system").length<=n)return{messages:o,stagedCount:0};let s=Nd(o,e),i=bv(s,e,n);if(i.length===0)return{messages:s,stagedCount:0};for(let a of i)e.stages.push(a);return s=Nd(o,e),{messages:s,stagedCount:i.length}}function Ai(o,e){let t=0;for(let n of e.stages)n.committed||(n.committed=!0,t++);return t===0?{messages:o,committed:0}:{messages:$d(o,e),committed:t}}function Nd(o,e){return e.stages.filter(n=>n.committed).length===0?o:$d(o,e)}function $d(o,e){let t=e.stages.filter(r=>r.committed).sort((r,s)=>s.range[0]-r.range[0]),n=[...o];for(let r of t){let[s,i]=r.range;if(s>=n.length)continue;let a=Math.min(i,n.length),l={role:"system",content:r.summary};n.splice(s,a-s,l)}return n}function bv(o,e,t){let n=Math.max(0,o.length-Math.floor(t/2)),r=[],s=new Set(e.stages.map(l=>`${l.range[0]}-${l.range[1]}`)),i=-1,a=0;for(let l=0;l<n;l++){let c=o[l];if(c.role==="tool"||c.role==="assistant"&&typeof c.content=="string"&&c.content==="")i<0&&(i=l),a++;else{if(a>=3){let u=`${i}-${i+a}`;s.has(u)||r.push({id:`collapse_${i}_${i+a}`,range:[i,i+a],summary:`[${a} tool results collapsed]`,committed:!1})}i=-1,a=0}}if(a>=3){let l=`${i}-${i+a}`;s.has(l)||r.push({id:`collapse_${i}_${i+a}`,range:[i,i+a],summary:`[${a} tool results collapsed]`,committed:!1})}return r}var Ud=N(()=>{"use strict"});function pa(){return{maxRoundsLimit:100,defaultMaxRounds:25,defaultTemperature:0,maxToolBudgetCap:100,defaultToolBudget:Pi,maxConsecutiveFailures:Ii,maxIdenticalCallRepeats:Ci,defaultContextWindowTokens:Ei,responseBufferTokens:Mi,defaultMaxOutputTokens:Oi,defaultModelMaxOutputTokens:Di,maxOutputTokensRecoveryLimit:Li,escalatedMaxOutputTokens:Ni,diminishingReturnsThreshold:Tr,diminishingReturnsMinContinuations:$i,defaultMaxResultSizeChars:Ui,maxToolResultsPerMessageChars:ji,toolResultPreviewBytes:wr,heartbeatIntervalMs:Fi,max529Retries:Bi,maxApiRetries:Ln,persistentRetryMaxBackoffMs:kv,persistentRetryResetCapMs:vv,compressionTargetUsageRatio:Sv,compressionMinBudget:Tv,compressionMaxBudget:wv,reactiveCompactMaxFailures:xv,reactiveCompactMinMessages:Rv,reactiveCompactTargetPercent:_v,maxSkillsPerProject:Wi,maxSkillsGlobal:jd,minToolCallsForSkill:Gi,minDistinctToolsForSkill:Hi,skillCreationCooldownMs:Vi,skillInjectionMaxChars:Av,skillInjectionMaxCount:Pv,skillRecallMaxSkills:Ki,skillRecallMaxContentChars:zi,skillRecallCacheTtlMs:qi,maxForkDepth:Yi,maxSessions:Ji,taskSummaryTurnThreshold:Qi,taskSummaryRegenInterval:Zi,maxIncludeDepth:ea,maxInstructionChars:Iv,instructionsMaxFileSize:ta,instructionsMaxDirSize:na,mediaMaxDownloadSize:oa,mediaMaxUploadSize:Cv,mediaDownloadTimeoutMs:ra,acpMaxSpawnRetries:sa,acpRetryBackoffBase:ia,acpRuntimeRestartMax:aa,acpRuntimeRestartBackoffBase:la,taskPollIntervalMs:Ev,taskStoppedDisplayMs:Mv,taskPanelGraceMs:Ov,memoryPrefetchMaxSessionBytes:ca,memoryPrefetchLimitPerRecall:da,memoryMaxSurfacedEntries:ua,dreamMinIntervalHours:Dv,dreamMinSessions:Lv,dreamScanIntervalMs:Nv,idleDreamMinutes:$v,dreamCooldownMs:Uv,dreamMaxDurationMs:jv,teamBudgetTokens:Xi}}var Pi,Ii,Ci,Sr,Ei,Mi,Oi,Di,Li,Ni,Tr,$i,Ui,ji,wr,Fi,Bi,Ln,kv,vv,Sv,Tv,wv,xv,Rv,_v,Wi,jd,Gi,Hi,Vi,Fd,Bd,Av,Pv,Ki,zi,qi,Yi,Xi,Ji,Qi,Zi,Wd,Gd,ea,Iv,ta,na,oa,Cv,ra,sa,ia,aa,la,Ev,Mv,Ov,ca,da,ua,Dv,Lv,Nv,$v,Uv,jv,Ue=N(()=>{"use strict";Pi=Math.min(Math.max(1,Number(process.env.TOOL_LOOP_DEFAULT_BUDGET)||25),100),Ii=3,Ci=2,Sr=2,Ei=128e3,Mi=13e3,Oi=16384,Di=65536,Li=3,Ni=65536,Tr=500,$i=3,Ui=5e4,ji=2e5,wr=2e3,Fi=3e4,Bi=3,Ln=2,kv=3e5,vv=216e5,Sv=.75,Tv=16e3,wv=12e4,xv=3,Rv=4,_v=50,Wi=20,jd=50,Gi=3,Hi=2,Vi=300*1e3,Fd=3,Bd=720*60*60*1e3,Av=4e3,Pv=5,Ki=3,zi=800,qi=300*1e3,Yi=4,Xi=0,Ji=50,Qi=50,Zi=30,Wd=3600*1e3,Gd=200,ea=5,Iv=4e4,ta=50*1024,na=500*1024,oa=500*1024*1024,Cv=50*1024*1024,ra=3e5,sa=2,ia=3e3,aa=3,la=5e3,Ev=1e3,Mv=3e3,Ov=3e4,ca=60*1024,da=10,ua=100,Dv=24,Lv=5,Nv=6e5,$v=30,Uv=144e5,jv=3e5});import{existsSync as ma,readFileSync as Vd,writeFileSync as Fv,readdirSync as Kd,mkdirSync as Bv}from"node:fs";import{join as fa,dirname as Wv}from"node:path";function qd(o){return fa(o,".qlogicagent",Gv)}function Hv(o){let e=qd(o);try{return JSON.parse(Vd(e,"utf8"))}catch{return{version:1,patterns:{}}}}function Hd(o,e){let t=qd(o);Bv(Wv(t),{recursive:!0}),Fv(t,JSON.stringify(e,null,2),"utf8")}function Vv(o){let e=Date.now()-Bd;for(let[t,n]of Object.entries(o.patterns))new Date(n.lastSeen).getTime()<e&&delete o.patterns[t]}function Yd(o,e){if(e.length===0)return!1;let t=xr(e),n=Hv(o);Vv(n);let r=new Date().toISOString(),s=n.patterns[t];if(s||(s={signature:t,count:0,firstSeen:r,lastSeen:r,promoted:!1},n.patterns[t]=s),s.promoted)return Hd(o,n),!1;s.count++,s.lastSeen=r;let i=s.count>=Fd;return i&&(s.promoted=!0),Hd(o,n),i}function xr(o){return[...o].sort().join("+")}function Kv(o,e){if(!ma(e))return null;let t=xr(o);try{let n=Kd(e,{withFileTypes:!0});for(let r of n){if(!r.isDirectory())continue;let s=fa(e,r.name,"SKILL.md");try{let a=Vd(s,"utf8").match(/^tools:\s*\n((?:\s+-\s+\S+\n?)+)/m);if(a){let l=a[1].split(`
|
|
14
|
-
`).map(c=>c.replace(/^\s*-\s*/,"").trim()).filter(Boolean);if(xr(l)===t)return r.name}}catch{}}}catch{}return null}function zv(o){if(!ma(o))return 0;try{return Kd(o,{withFileTypes:!0}).filter(e=>e.isDirectory()&&ma(fa(o,e.name,"SKILL.md"))).length}catch{return 0}}function qv(o,e){return!(!o.ok||o.existingSkillName||!o.multiStep||o.toolCallCount<Gi||o.distinctToolCount<Hi||Date.now()-zd<Vi||e?.projectSkillsDir&&(zv(e.projectSkillsDir)>=Wi||e.tools.length>0&&Kv(e.tools,e.projectSkillsDir))||e?.projectRoot&&e.tools.length>0&&!Yd(e.projectRoot,e.tools))}function Yv(o){return o.existingSkillName?o.feedback==="negative":!1}function vo(o,e){return Yv(o)?{type:"skill.improve",skillName:o.existingSkillName,reason:"negative user feedback on existing skill execution"}:qv(o,e)?(zd=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:o.toolCallCount}):null}var zd,Gv,Xd=N(()=>{"use strict";Ue();zd=0,Gv="skill-patterns.json"});function Jd(o){return o.function&&typeof o.function=="object"&&typeof o.function.name=="string"?o.function.name.trim():typeof o.name=="string"?o.name.trim():""}function Xv(o){return o==="enabled-eligible"||o==="installed-awaiting-approval"}function Jv(o){return new Map((o??[]).map(e=>[e.toolName,e]))}function Qv(o){if(!o.eligibility?.length)return[...o.tools];let e=Jv(o.eligibility);return o.tools.filter(t=>{let n=Jd(t);if(!n)return!1;let r=e.get(n);return!r||Xv(r.status)})}function Zv(o){let e=[],t=o.compatibility??{},n=o.toolChoice;if(o.thinkingEnabled&&t.requireAutoWhenThinking){let r=typeof n=="object"&&n&&!Array.isArray(n)?String(n.type??""):n;r&&r!=="auto"&&r!=="none"&&(e.push("tool_choice downgraded to auto because thinking mode requires auto/none compatibility."),n="auto")}if(n==="required"&&t.allowRequiredToolChoice===!1){let r=t.requiredFallback??"auto";e.push(`tool_choice=required is not supported by this provider; downgraded to ${r}.`),n=r}if(n&&typeof n=="object"&&!Array.isArray(n)&&n.type==="function"&&t.allowNamedToolChoice===!1){let r=t.namedFallback??"required";e.push(`named tool_choice is not supported by this provider; downgraded to ${r}.`),n=r}return{normalizedToolChoice:n,warnings:e}}function ga(o){let e=Zv({toolChoice:o.toolChoice,thinkingEnabled:o.thinkingEnabled,compatibility:o.compatibility}),t=e.normalizedToolChoice,n=[...e.warnings],r=Qv({tools:o.tools,eligibility:o.eligibility});if(!t||t==="auto")return{tools:r,normalizedToolChoice:t,warnings:n};if(t==="none")return{tools:[],normalizedToolChoice:"none",warnings:n};if(t==="required"){if(r.length===0)throw new Error("tool_choice=required but no tools were provided");return{tools:r,normalizedToolChoice:"required",extraSystemPrompt:"You must call one of the available tools before responding.",warnings:n}}if(typeof t=="object"&&!Array.isArray(t)&&t.type==="function"){let s=t.function??void 0,i=typeof s?.name=="string"?s.name.trim():"";if(!i)throw new Error("tool_choice.function.name is required");let a=r.filter(l=>Jd(l)===i);if(a.length===0)throw new Error(`tool_choice requested unknown tool: ${i}`);return{tools:a,normalizedToolChoice:{type:"function",function:{name:i}},extraSystemPrompt:`You must call the ${i} tool before responding.`,warnings:n}}return{tools:r,normalizedToolChoice:t,warnings:n}}var Qd=N(()=>{"use strict"});function Zd(o){return o==null?[]:typeof o=="string"?o.length>0?[{type:"text",text:o}]:[]:Array.isArray(o)?o:[{type:"text",text:String(o)}]}function nS(o,e){return{...o,content:[...Zd(o.content),...Zd(e.content)]}}function oS(o){if(!o||typeof o!="object")return!1;if(o.function&&typeof o.function=="object"){let e=o.function.name;if(typeof e=="string"&&e.length>0)return!0}return typeof o.name=="string"&&o.name.length>0}function rS(o){return new Set((o??eS).map(e=>e.trim().toLowerCase()))}function sS(o,e){return o?rS(e).has(o.trim().toLowerCase()):!1}function ha(o){if(!Array.isArray(o)||o.length===0)return[...o];let e=o.map(a=>{if(a.role==="assistant"&&Array.isArray(a.tool_calls)){let l=a.tool_calls.filter(c=>oS(c));return{...a,...l.length>0?{tool_calls:l}:{tool_calls:void 0}}}return{...a}}),t=new Set;for(let a of e)if(!(a.role!=="assistant"||!Array.isArray(a.tool_calls)))for(let l of a.tool_calls)typeof l.id=="string"&&l.id&&t.add(l.id);let n=e.filter(a=>a.role!=="tool"?!0:!!(a.tool_call_id&&t.has(a.tool_call_id))),r=new Set;for(let a of n)a.role==="tool"&&typeof a.tool_call_id=="string"&&a.tool_call_id&&r.add(a.tool_call_id);let s=[];for(let a of n){if(a.role==="assistant"&&Array.isArray(a.tool_calls)&&a.tool_calls.length>0){let l=a.tool_calls.filter(c=>typeof c.id=="string"&&r.has(c.id));if(l.length===0){let{tool_calls:c,...d}=a;d.content!=null&&d.content!==""&&s.push(d);continue}if(l.length<a.tool_calls.length){s.push({...a,tool_calls:l});continue}}s.push(a)}let i=[];for(let a of s){let l=i.length>0?i[i.length-1]:void 0;if(a.role==="user"&&l?.role==="user"){i[i.length-1]=nS(l,a);continue}i.push(a)}return i}function ya(o,e){return sS(e?.stopReason,e?.forcedStopReasons)?o.map(t=>{if(t.role!=="assistant")return{...t};let n={...t};for(let r of tS)delete n[r];return n}):[...o]}function ba(o,e){let t=e?.placeholderToolResult??"Error: Tool loop interrupted before the tool result was replayed.",n=new Set;for(let s of o)s.role==="tool"&&typeof s.tool_call_id=="string"&&s.tool_call_id&&n.add(s.tool_call_id);let r=[];for(let s of o)if(r.push({...s}),!(s.role!=="assistant"||!Array.isArray(s.tool_calls)||s.tool_calls.length===0))for(let i of s.tool_calls)typeof i.id!="string"||!i.id||n.has(i.id)||(n.add(i.id),r.push({role:"tool",tool_call_id:i.id,content:t}));return r}function ka(o,e){let t=ha(o),n=ya(t,e);return ba(n,e)}var eS,tS,va=N(()=>{"use strict";eS=["stop","aborted","timeout","cancelled","interrupted","error"],tS=["tool_calls","toolCalls","function_call","functionCall","raw_tool_calls","rawToolCalls"]});function iS(o){let e=new Set,t=new Set;for(let n of o){if(n.role==="assistant"&&Array.isArray(n.tool_calls))for(let r of n.tool_calls)typeof r.id=="string"&&r.id&&e.add(r.id);n.role==="tool"&&typeof n.tool_call_id=="string"&&n.tool_call_id&&t.add(n.tool_call_id)}return[...e].filter(n=>!t.has(n))}function aS(o){let e=new Set;for(let t of o)t.role==="tool"&&typeof t.tool_call_id=="string"&&t.tool_call_id&&e.add(t.tool_call_id);return[...e]}function lS(o){return{round:o.round??0,maxRounds:o.maxRounds,pendingToolCallIds:[...o.pendingToolCallIds??[]],completedToolCallIds:[...o.completedToolCallIds??[]],lastStopReason:o.lastStopReason,replayMessages:[...o.replayMessages??[]]}}function Sa(o,e){return{round:o.round+1,maxRounds:o.maxRounds,pendingToolCallIds:[...e.pendingToolCallIds??o.pendingToolCallIds],completedToolCallIds:[...e.completedToolCallIds??o.completedToolCallIds],lastStopReason:e.lastStopReason??o.lastStopReason,replayMessages:[...e.replayMessages??o.replayMessages]}}function Rr(o,e){return{round:o.round,maxRounds:o.maxRounds,pendingToolCallIds:[],completedToolCallIds:[...e.completedToolCallIds??o.completedToolCallIds],lastStopReason:e.lastStopReason??o.lastStopReason,replayMessages:[...e.replayMessages??o.replayMessages]}}function _r(o){let e=[],t=ha(o.replayMessages);t.length!==o.replayMessages.length&&e.push({kind:"drop-orphan-tool-result",detail:"Removed orphan tool results or invalid assistant tool calls."});let n=ya(t,o.options);n.some((s,i)=>s!==t[i])&&e.push({kind:"strip-forced-stop-tool-metadata",detail:"Removed assistant tool-call metadata after forced stop."});let r=ba(n,o.options);return r.length>n.length&&e.push({kind:"inject-placeholder-tool-result",detail:"Injected placeholder tool result for pending tool calls."}),{state:lS({maxRounds:o.maxRounds,round:o.round,lastStopReason:o.lastStopReason,replayMessages:r,pendingToolCallIds:iS(r),completedToolCallIds:aS(r)}),recoveryActions:e}}var eu=N(()=>{"use strict";va()});function Ta(o){return o?cS.has(o):!0}function wa(o){return o===429||o===529}function Ar(o,e=500,t=32e3){let n=Math.min(e*Math.pow(2,o-1),t);return n+Math.floor(Math.random()*n*.25)}function Pr(){let o=process.env.QLOGICAGENT_PERSISTENT_RETRY;return o==="1"||o==="true"}var cS,dM,So,tu=N(()=>{"use strict";cS=new Set(["main","sdk","agent","compact","hook","verification","side_question"]);dM={maxBackoffMs:300*1e3,resetCapMs:360*60*1e3,heartbeatIntervalMs:3e4};So=class extends Error{constructor(t,n){super(`Model fallback triggered: ${t} -> ${n}`);this.originalModel=t;this.fallbackModel=n;this.name="FallbackTriggeredError"}originalModel;fallbackModel}});function xa(o,e){if(e.allowedTools&&e.allowedTools.length>0){let t=new Set(e.allowedTools);return o.filter(n=>t.has(n))}if(e.toolAccessMode==="none")return[];if(e.toolAccessMode==="read-only"){let t=new Set(["file_edit","create_file","write_file","replace_string_in_file","multi_replace_string_in_file","create_directory","delete_file","rename_file","move_file","exec","run_in_terminal","run_command","git_commit","git_push","patch"]);return o.filter(n=>!t.has(n))}return e.canFork?[...o]:o.filter(t=>t!=="agent")}var Ra=N(()=>{"use strict";Ue()});function _a(){return[...nu]}function Ir(o){return nu.find(e=>e.name===o)}var dS,uS,pS,mS,fS,gS,nu,Aa=N(()=>{"use strict";dS={name:"general",label:"General Purpose",description:"A general-purpose sub-agent that can perform any task with full tool access.",maxTurns:200,toolAccessMode:"full",canFork:!1},uS={name:"explore",label:"Explore",description:"Fast read-only codebase exploration. Search files, read code, analyze structure. Cannot write or execute.",maxTurns:50,toolAccessMode:"read-only",allowedTools:["read_file","search","web_search","web_fetch","think","memory","tool_search"],canFork:!1},pS={name:"plan",label:"Plan",description:"Planning mode. Explore, analyze, and produce a structured plan. Cannot write files or execute commands.",maxTurns:80,toolAccessMode:"read-only",allowedTools:["read_file","search","web_search","web_fetch","think","memory","task","tool_search"],canFork:!1},mS={name:"code",label:"Code",description:"A coding sub-agent with full tool access for implementation tasks.",maxTurns:200,toolAccessMode:"full",canFork:!0},fS={name:"research",label:"Research",description:"Web research and information gathering. Searches the web, fetches pages, and synthesizes findings.",maxTurns:30,toolAccessMode:"read-only",allowedTools:["web_search","web_fetch","read_file","search","think","memory"],canFork:!1},gS={name:"verify",label:"Verify",description:"Verification agent. Runs tests, checks build output, validates changes are correct.",maxTurns:40,toolAccessMode:"full",allowedTools:["exec","read_file","search","think"],canFork:!1},nu=[dS,uS,pS,mS,fS,gS]});var ou=N(()=>{"use strict"});function Pa(o){return{promptTokens:0,hasAttemptedReactiveCompact:!1,currentMaxOutputTokens:o.maxOutputTokens,consecutiveTruncations:0,aborted:o.abortSignal?.aborted??!1}}function Ia(o,e){if(o.aborted)return{level:"blocking",usagePercent:100,reason:"budget_exhausted"};let t=e.contextWindowTokens-e.responseBufferTokens-o.currentMaxOutputTokens,n=t>0?o.promptTokens/t*100:100;return o.promptTokens>=t?o.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:t-o.promptTokens}:{level:"ok"}}function Ca(o,e,t){let n=o.message?.toLowerCase()??"",r=o.status??0;return r===413||n.includes("prompt_too_long")||n.includes("context_length_exceeded")?!e.hasAttemptedReactiveCompact&&t.reactiveCompactEnabled?{action:"reactive_compact"}:{action:"abort",reason:"prompt_too_long_unrecoverable"}:r>=500&&r<600?{action:"retry",reason:`server_error_${r}`}:r===429?{action:"retry",reason:"rate_limited"}:r===401||r===403?{action:"abort",reason:"auth_error"}:r===404?{action:"abort",reason:"model_not_found"}:{action:"abort",reason:n||"unknown_error"}}function Ea(o,e,t){if(!e.outputEscalationEnabled)return{shouldEscalate:!1,newMax:o.currentMaxOutputTokens};if(o.consecutiveTruncations>=3)return{shouldEscalate:!1,newMax:o.currentMaxOutputTokens};let n=Math.min(o.currentMaxOutputTokens*2,t);return n<=o.currentMaxOutputTokens?{shouldEscalate:!1,newMax:o.currentMaxOutputTokens}:{shouldEscalate:!0,newMax:n}}function Ma(o,e){return o.aborted?!0:e.abortSignal?.aborted?(o.aborted=!0,!0):!1}var ru=N(()=>{"use strict"});function Oa(){return{consecutiveFailures:0,attemptedThisTurn:!1,lastCompactAt:null,toolsAtLastCompact:[]}}function Nn(o,e=hS){return!(o.attemptedThisTurn||o.consecutiveFailures>=e.maxConsecutiveFailures)}var hS,su=N(()=>{"use strict";hS={maxConsecutiveFailures:3,minMessagesAfterCompact:4,targetUsagePercent:50}});var $n=N(()=>{"use strict";wd();Md();xi();xi();Ud();Xd();Qd();va();eu();tu();Ra();Aa();ou();ru();su()});function Da(o,e){let t=o.get(e.index);t||(t={id:"",name:"",arguments:""},o.set(e.index,t)),e.id&&(t.id=e.id),e.name&&(t.name+=e.name),t.arguments+=e.arguments}var iu=N(()=>{"use strict"});var au=N(()=>{"use strict"});var lu=N(()=>{"use strict"});function Cr(o){return typeof o.deleteVideoTask=="function"&&typeof o.listVideoTasks=="function"}var cu=N(()=>{"use strict"});function du(o){let e=o.usage??o.data?.usage,t=rn(e?.completion_tokens)??rn(e?.completionTokens)??rn(e?.output_tokens)??rn(e?.outputTokens)??rn(e?.total_tokens)??rn(e?.totalTokens)??0,n=rn(e?.total_tokens)??rn(e?.totalTokens)??t;return{completionTokens:t,totalTokens:n,hasUsage:!!e,rawUsage:e}}function rn(o){if(typeof o=="number"&&Number.isFinite(o))return o;if(typeof o=="string"&&o.trim()){let e=Number(o);if(Number.isFinite(e))return e}}var dt,Er=N(()=>{"use strict";dt=class{supportedTypes=["image","video","3d","embedding"];baseUrl;timeoutMs;constructor(e){this.baseUrl=e.baseUrl.replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??18e4}async generate(e,t,n){switch(e.mediaType){case"image":return this.generateImage(e,t,n);case"video":return this.generateVideo(e,t,n);case"3d":return this.generate3D(e,t,n);case"embedding":return this.generateEmbedding(e,t,n);default:throw new Error(`VolcengineMediaTransport: unsupported mediaType "${e.mediaType}"`)}}async generateEmbedding(e,t,n){let r=Date.now(),s=e.text||e.prompt;if(!s)throw new Error("VolcengineMediaTransport: text or prompt is required for embedding");let i=`${this.baseUrl}/embeddings/multimodal`,a={model:e.model||"doubao-embedding-vision-251215",input:[{type:"text",text:s}]},l=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(a),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!l.ok){let m=await l.text().catch(()=>"");throw new Error(`Volcengine embedding error ${l.status}: ${m}`)}let c=await l.json(),u=(Array.isArray(c.data)?c.data:c.data?[c.data]:[]).map(m=>m.embedding).filter(m=>Array.isArray(m)),p=c.usage?.total_tokens??c.usage?.prompt_tokens;return{mediaUrls:[],model:c.model??e.model??"doubao-embedding-vision-251215",durationMs:Date.now()-r,billingUnit:p!==void 0?"per_token":void 0,billingQuantity:p,metadata:{embeddings:u,dimensions:u[0]?.length??0,usage:c.usage}}}canHandle(e){return!!this.supportedTypes.includes(e.mediaType)}async generateImage(e,t,n){let r=Date.now(),s=`${this.baseUrl}/v3/images/generations`,i={model:e.model,prompt:e.prompt,size:e.size??"2K",n:e.n??1,response_format:"url",sequential_image_generation:"disabled",watermark:!0};e.imageUrl&&(i.image=e.imageUrl),e.referenceImages&&e.referenceImages.length>0&&(i.image_urls=e.referenceImages),e.style&&(i.style=e.style),e.quality&&(i.quality=e.quality),e.seed!==void 0&&(i.seed=e.seed),e.guidanceScale!==void 0&&(i.guidance_scale=e.guidanceScale),e.enhancePrompt!==void 0&&(i.enhance_prompt=e.enhancePrompt),e.streamImage&&(i.stream=!0);let a=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(i),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!a.ok){let d=await a.text().catch(()=>"");throw new Error(`Volcengine image API error ${a.status}: ${d}`)}if(e.streamImage&&a.body)return this.parseStreamingImage(a.body,e,r);let c=((await a.json()).data??[]).map(d=>d.url).filter(d=>!!d);return{mediaUrls:c,model:e.model,size:e.size??"1024x1024",durationMs:Date.now()-r,billingUnit:"per_call",billingQuantity:e.n??Math.max(c.length,1),metadata:{billableUnits:{images:e.n??Math.max(c.length,1)},pricingSpec:e.size??"1024x1024"}}}async parseStreamingImage(e,t,n){let r=new TextDecoder,s="",i="",a=e.getReader();try{for(;;){let{done:l,value:c}=await a.read();if(l)break;s+=r.decode(c,{stream:!0});let d;for(;(d=s.indexOf(`
|
|
14
|
+
`).map(c=>c.replace(/^\s*-\s*/,"").trim()).filter(Boolean);if(xr(l)===t)return r.name}}catch{}}}catch{}return null}function zv(o){if(!ma(o))return 0;try{return Kd(o,{withFileTypes:!0}).filter(e=>e.isDirectory()&&ma(fa(o,e.name,"SKILL.md"))).length}catch{return 0}}function qv(o,e){return!(!o.ok||o.existingSkillName||!o.multiStep||o.toolCallCount<Gi||o.distinctToolCount<Hi||Date.now()-zd<Vi||e?.projectSkillsDir&&(zv(e.projectSkillsDir)>=Wi||e.tools.length>0&&Kv(e.tools,e.projectSkillsDir))||e?.projectRoot&&e.tools.length>0&&!Yd(e.projectRoot,e.tools))}function Yv(o){return o.existingSkillName?o.feedback==="negative":!1}function vo(o,e){return Yv(o)?{type:"skill.improve",skillName:o.existingSkillName,reason:"negative user feedback on existing skill execution"}:qv(o,e)?(zd=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:o.toolCallCount}):null}var zd,Gv,Xd=N(()=>{"use strict";Ue();zd=0,Gv="skill-patterns.json"});function Jd(o){return o.function&&typeof o.function=="object"&&typeof o.function.name=="string"?o.function.name.trim():typeof o.name=="string"?o.name.trim():""}function Xv(o){return o==="enabled-eligible"||o==="installed-awaiting-approval"}function Jv(o){return new Map((o??[]).map(e=>[e.toolName,e]))}function Qv(o){if(!o.eligibility?.length)return[...o.tools];let e=Jv(o.eligibility);return o.tools.filter(t=>{let n=Jd(t);if(!n)return!1;let r=e.get(n);return!r||Xv(r.status)})}function Zv(o){let e=[],t=o.compatibility??{},n=o.toolChoice;if(o.thinkingEnabled&&t.requireAutoWhenThinking){let r=typeof n=="object"&&n&&!Array.isArray(n)?String(n.type??""):n;r&&r!=="auto"&&r!=="none"&&(e.push("tool_choice downgraded to auto because thinking mode requires auto/none compatibility."),n="auto")}if(n==="required"&&t.allowRequiredToolChoice===!1){let r=t.requiredFallback??"auto";e.push(`tool_choice=required is not supported by this provider; downgraded to ${r}.`),n=r}if(n&&typeof n=="object"&&!Array.isArray(n)&&n.type==="function"&&t.allowNamedToolChoice===!1){let r=t.namedFallback??"required";e.push(`named tool_choice is not supported by this provider; downgraded to ${r}.`),n=r}return{normalizedToolChoice:n,warnings:e}}function ga(o){let e=Zv({toolChoice:o.toolChoice,thinkingEnabled:o.thinkingEnabled,compatibility:o.compatibility}),t=e.normalizedToolChoice,n=[...e.warnings],r=Qv({tools:o.tools,eligibility:o.eligibility});if(!t||t==="auto")return{tools:r,normalizedToolChoice:t,warnings:n};if(t==="none")return{tools:[],normalizedToolChoice:"none",warnings:n};if(t==="required"){if(r.length===0)throw new Error("tool_choice=required but no tools were provided");return{tools:r,normalizedToolChoice:"required",extraSystemPrompt:"You must call one of the available tools before responding.",warnings:n}}if(typeof t=="object"&&!Array.isArray(t)&&t.type==="function"){let s=t.function??void 0,i=typeof s?.name=="string"?s.name.trim():"";if(!i)throw new Error("tool_choice.function.name is required");let a=r.filter(l=>Jd(l)===i);if(a.length===0)throw new Error(`tool_choice requested unknown tool: ${i}`);return{tools:a,normalizedToolChoice:{type:"function",function:{name:i}},extraSystemPrompt:`You must call the ${i} tool before responding.`,warnings:n}}return{tools:r,normalizedToolChoice:t,warnings:n}}var Qd=N(()=>{"use strict"});function Zd(o){return o==null?[]:typeof o=="string"?o.length>0?[{type:"text",text:o}]:[]:Array.isArray(o)?o:[{type:"text",text:String(o)}]}function nS(o,e){return{...o,content:[...Zd(o.content),...Zd(e.content)]}}function oS(o){if(!o||typeof o!="object")return!1;if(o.function&&typeof o.function=="object"){let e=o.function.name;if(typeof e=="string"&&e.length>0)return!0}return typeof o.name=="string"&&o.name.length>0}function rS(o){return new Set((o??eS).map(e=>e.trim().toLowerCase()))}function sS(o,e){return o?rS(e).has(o.trim().toLowerCase()):!1}function ha(o){if(!Array.isArray(o)||o.length===0)return[...o];let e=o.map(a=>{if(a.role==="assistant"&&Array.isArray(a.tool_calls)){let l=a.tool_calls.filter(c=>oS(c));return{...a,...l.length>0?{tool_calls:l}:{tool_calls:void 0}}}return{...a}}),t=new Set;for(let a of e)if(!(a.role!=="assistant"||!Array.isArray(a.tool_calls)))for(let l of a.tool_calls)typeof l.id=="string"&&l.id&&t.add(l.id);let n=e.filter(a=>a.role!=="tool"?!0:!!(a.tool_call_id&&t.has(a.tool_call_id))),r=new Set;for(let a of n)a.role==="tool"&&typeof a.tool_call_id=="string"&&a.tool_call_id&&r.add(a.tool_call_id);let s=[];for(let a of n){if(a.role==="assistant"&&Array.isArray(a.tool_calls)&&a.tool_calls.length>0){let l=a.tool_calls.filter(c=>typeof c.id=="string"&&r.has(c.id));if(l.length===0){let{tool_calls:c,...d}=a;d.content!=null&&d.content!==""&&s.push(d);continue}if(l.length<a.tool_calls.length){s.push({...a,tool_calls:l});continue}}s.push(a)}let i=[];for(let a of s){let l=i.length>0?i[i.length-1]:void 0;if(a.role==="user"&&l?.role==="user"){i[i.length-1]=nS(l,a);continue}i.push(a)}return i}function ya(o,e){return sS(e?.stopReason,e?.forcedStopReasons)?o.map(t=>{if(t.role!=="assistant")return{...t};let n={...t};for(let r of tS)delete n[r];return n}):[...o]}function ba(o,e){let t=e?.placeholderToolResult??"Error: Tool loop interrupted before the tool result was replayed.",n=new Set;for(let s of o)s.role==="tool"&&typeof s.tool_call_id=="string"&&s.tool_call_id&&n.add(s.tool_call_id);let r=[];for(let s of o)if(r.push({...s}),!(s.role!=="assistant"||!Array.isArray(s.tool_calls)||s.tool_calls.length===0))for(let i of s.tool_calls)typeof i.id!="string"||!i.id||n.has(i.id)||(n.add(i.id),r.push({role:"tool",tool_call_id:i.id,content:t}));return r}function ka(o,e){let t=ha(o),n=ya(t,e);return ba(n,e)}var eS,tS,va=N(()=>{"use strict";eS=["stop","aborted","timeout","cancelled","interrupted","error"],tS=["tool_calls","toolCalls","function_call","functionCall","raw_tool_calls","rawToolCalls"]});function iS(o){let e=new Set,t=new Set;for(let n of o){if(n.role==="assistant"&&Array.isArray(n.tool_calls))for(let r of n.tool_calls)typeof r.id=="string"&&r.id&&e.add(r.id);n.role==="tool"&&typeof n.tool_call_id=="string"&&n.tool_call_id&&t.add(n.tool_call_id)}return[...e].filter(n=>!t.has(n))}function aS(o){let e=new Set;for(let t of o)t.role==="tool"&&typeof t.tool_call_id=="string"&&t.tool_call_id&&e.add(t.tool_call_id);return[...e]}function lS(o){return{round:o.round??0,maxRounds:o.maxRounds,pendingToolCallIds:[...o.pendingToolCallIds??[]],completedToolCallIds:[...o.completedToolCallIds??[]],lastStopReason:o.lastStopReason,replayMessages:[...o.replayMessages??[]]}}function Sa(o,e){return{round:o.round+1,maxRounds:o.maxRounds,pendingToolCallIds:[...e.pendingToolCallIds??o.pendingToolCallIds],completedToolCallIds:[...e.completedToolCallIds??o.completedToolCallIds],lastStopReason:e.lastStopReason??o.lastStopReason,replayMessages:[...e.replayMessages??o.replayMessages]}}function Rr(o,e){return{round:o.round,maxRounds:o.maxRounds,pendingToolCallIds:[],completedToolCallIds:[...e.completedToolCallIds??o.completedToolCallIds],lastStopReason:e.lastStopReason??o.lastStopReason,replayMessages:[...e.replayMessages??o.replayMessages]}}function _r(o){let e=[],t=ha(o.replayMessages);t.length!==o.replayMessages.length&&e.push({kind:"drop-orphan-tool-result",detail:"Removed orphan tool results or invalid assistant tool calls."});let n=ya(t,o.options);n.some((s,i)=>s!==t[i])&&e.push({kind:"strip-forced-stop-tool-metadata",detail:"Removed assistant tool-call metadata after forced stop."});let r=ba(n,o.options);return r.length>n.length&&e.push({kind:"inject-placeholder-tool-result",detail:"Injected placeholder tool result for pending tool calls."}),{state:lS({maxRounds:o.maxRounds,round:o.round,lastStopReason:o.lastStopReason,replayMessages:r,pendingToolCallIds:iS(r),completedToolCallIds:aS(r)}),recoveryActions:e}}var eu=N(()=>{"use strict";va()});function Ta(o){return o?cS.has(o):!0}function wa(o){return o===429||o===529}function Ar(o,e=500,t=32e3){let n=Math.min(e*Math.pow(2,o-1),t);return n+Math.floor(Math.random()*n*.25)}function Pr(){let o=process.env.QLOGICAGENT_PERSISTENT_RETRY;return o==="1"||o==="true"}var cS,uM,So,tu=N(()=>{"use strict";cS=new Set(["main","sdk","agent","compact","hook","verification","side_question"]);uM={maxBackoffMs:300*1e3,resetCapMs:360*60*1e3,heartbeatIntervalMs:3e4};So=class extends Error{constructor(t,n){super(`Model fallback triggered: ${t} -> ${n}`);this.originalModel=t;this.fallbackModel=n;this.name="FallbackTriggeredError"}originalModel;fallbackModel}});function xa(o,e){if(e.allowedTools&&e.allowedTools.length>0){let t=new Set(e.allowedTools);return o.filter(n=>t.has(n))}if(e.toolAccessMode==="none")return[];if(e.toolAccessMode==="read-only"){let t=new Set(["file_edit","create_file","write_file","replace_string_in_file","multi_replace_string_in_file","create_directory","delete_file","rename_file","move_file","exec","run_in_terminal","run_command","git_commit","git_push","patch"]);return o.filter(n=>!t.has(n))}return e.canFork?[...o]:o.filter(t=>t!=="agent")}var Ra=N(()=>{"use strict";Ue()});function _a(){return[...nu]}function Ir(o){return nu.find(e=>e.name===o)}var dS,uS,pS,mS,fS,gS,nu,Aa=N(()=>{"use strict";dS={name:"general",label:"General Purpose",description:"A general-purpose sub-agent that can perform any task with full tool access.",maxTurns:200,toolAccessMode:"full",canFork:!1},uS={name:"explore",label:"Explore",description:"Fast read-only codebase exploration. Search files, read code, analyze structure. Cannot write or execute.",maxTurns:50,toolAccessMode:"read-only",allowedTools:["read_file","search","web_search","web_fetch","think","memory","tool_search"],canFork:!1},pS={name:"plan",label:"Plan",description:"Planning mode. Explore, analyze, and produce a structured plan. Cannot write files or execute commands.",maxTurns:80,toolAccessMode:"read-only",allowedTools:["read_file","search","web_search","web_fetch","think","memory","task","tool_search"],canFork:!1},mS={name:"code",label:"Code",description:"A coding sub-agent with full tool access for implementation tasks.",maxTurns:200,toolAccessMode:"full",canFork:!0},fS={name:"research",label:"Research",description:"Web research and information gathering. Searches the web, fetches pages, and synthesizes findings.",maxTurns:30,toolAccessMode:"read-only",allowedTools:["web_search","web_fetch","read_file","search","think","memory"],canFork:!1},gS={name:"verify",label:"Verify",description:"Verification agent. Runs tests, checks build output, validates changes are correct.",maxTurns:40,toolAccessMode:"full",allowedTools:["exec","read_file","search","think"],canFork:!1},nu=[dS,uS,pS,mS,fS,gS]});var ou=N(()=>{"use strict"});function Pa(o){return{promptTokens:0,hasAttemptedReactiveCompact:!1,currentMaxOutputTokens:o.maxOutputTokens,consecutiveTruncations:0,aborted:o.abortSignal?.aborted??!1}}function Ia(o,e){if(o.aborted)return{level:"blocking",usagePercent:100,reason:"budget_exhausted"};let t=e.contextWindowTokens-e.responseBufferTokens-o.currentMaxOutputTokens,n=t>0?o.promptTokens/t*100:100;return o.promptTokens>=t?o.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:t-o.promptTokens}:{level:"ok"}}function Ca(o,e,t){let n=o.message?.toLowerCase()??"",r=o.status??0;return r===413||n.includes("prompt_too_long")||n.includes("context_length_exceeded")?!e.hasAttemptedReactiveCompact&&t.reactiveCompactEnabled?{action:"reactive_compact"}:{action:"abort",reason:"prompt_too_long_unrecoverable"}:r>=500&&r<600?{action:"retry",reason:`server_error_${r}`}:r===429?{action:"retry",reason:"rate_limited"}:r===401||r===403?{action:"abort",reason:"auth_error"}:r===404?{action:"abort",reason:"model_not_found"}:{action:"abort",reason:n||"unknown_error"}}function Ea(o,e,t){if(!e.outputEscalationEnabled)return{shouldEscalate:!1,newMax:o.currentMaxOutputTokens};if(o.consecutiveTruncations>=3)return{shouldEscalate:!1,newMax:o.currentMaxOutputTokens};let n=Math.min(o.currentMaxOutputTokens*2,t);return n<=o.currentMaxOutputTokens?{shouldEscalate:!1,newMax:o.currentMaxOutputTokens}:{shouldEscalate:!0,newMax:n}}function Ma(o,e){return o.aborted?!0:e.abortSignal?.aborted?(o.aborted=!0,!0):!1}var ru=N(()=>{"use strict"});function Oa(){return{consecutiveFailures:0,attemptedThisTurn:!1,lastCompactAt:null,toolsAtLastCompact:[]}}function Nn(o,e=hS){return!(o.attemptedThisTurn||o.consecutiveFailures>=e.maxConsecutiveFailures)}var hS,su=N(()=>{"use strict";hS={maxConsecutiveFailures:3,minMessagesAfterCompact:4,targetUsagePercent:50}});var $n=N(()=>{"use strict";wd();Md();xi();xi();Ud();Xd();Qd();va();eu();tu();Ra();Aa();ou();ru();su()});function Da(o,e){let t=o.get(e.index);t||(t={id:"",name:"",arguments:""},o.set(e.index,t)),e.id&&(t.id=e.id),e.name&&(t.name+=e.name),t.arguments+=e.arguments}var iu=N(()=>{"use strict"});var au=N(()=>{"use strict"});var lu=N(()=>{"use strict"});function Cr(o){return typeof o.deleteVideoTask=="function"&&typeof o.listVideoTasks=="function"}var cu=N(()=>{"use strict"});function du(o){let e=o.usage??o.data?.usage,t=rn(e?.completion_tokens)??rn(e?.completionTokens)??rn(e?.output_tokens)??rn(e?.outputTokens)??rn(e?.total_tokens)??rn(e?.totalTokens)??0,n=rn(e?.total_tokens)??rn(e?.totalTokens)??t;return{completionTokens:t,totalTokens:n,hasUsage:!!e,rawUsage:e}}function rn(o){if(typeof o=="number"&&Number.isFinite(o))return o;if(typeof o=="string"&&o.trim()){let e=Number(o);if(Number.isFinite(e))return e}}var dt,Er=N(()=>{"use strict";dt=class{supportedTypes=["image","video","3d","embedding"];baseUrl;timeoutMs;constructor(e){this.baseUrl=e.baseUrl.replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??18e4}async generate(e,t,n){switch(e.mediaType){case"image":return this.generateImage(e,t,n);case"video":return this.generateVideo(e,t,n);case"3d":return this.generate3D(e,t,n);case"embedding":return this.generateEmbedding(e,t,n);default:throw new Error(`VolcengineMediaTransport: unsupported mediaType "${e.mediaType}"`)}}async generateEmbedding(e,t,n){let r=Date.now(),s=e.text||e.prompt;if(!s)throw new Error("VolcengineMediaTransport: text or prompt is required for embedding");let i=`${this.baseUrl}/embeddings/multimodal`,a={model:e.model||"doubao-embedding-vision-251215",input:[{type:"text",text:s}]},l=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(a),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!l.ok){let m=await l.text().catch(()=>"");throw new Error(`Volcengine embedding error ${l.status}: ${m}`)}let c=await l.json(),u=(Array.isArray(c.data)?c.data:c.data?[c.data]:[]).map(m=>m.embedding).filter(m=>Array.isArray(m)),p=c.usage?.total_tokens??c.usage?.prompt_tokens;return{mediaUrls:[],model:c.model??e.model??"doubao-embedding-vision-251215",durationMs:Date.now()-r,billingUnit:p!==void 0?"per_token":void 0,billingQuantity:p,metadata:{embeddings:u,dimensions:u[0]?.length??0,usage:c.usage}}}canHandle(e){return!!this.supportedTypes.includes(e.mediaType)}async generateImage(e,t,n){let r=Date.now(),s=`${this.baseUrl}/v3/images/generations`,i={model:e.model,prompt:e.prompt,size:e.size??"2K",n:e.n??1,response_format:"url",sequential_image_generation:"disabled",watermark:!0};e.imageUrl&&(i.image=e.imageUrl),e.referenceImages&&e.referenceImages.length>0&&(i.image_urls=e.referenceImages),e.style&&(i.style=e.style),e.quality&&(i.quality=e.quality),e.seed!==void 0&&(i.seed=e.seed),e.guidanceScale!==void 0&&(i.guidance_scale=e.guidanceScale),e.enhancePrompt!==void 0&&(i.enhance_prompt=e.enhancePrompt),e.streamImage&&(i.stream=!0);let a=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(i),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!a.ok){let d=await a.text().catch(()=>"");throw new Error(`Volcengine image API error ${a.status}: ${d}`)}if(e.streamImage&&a.body)return this.parseStreamingImage(a.body,e,r);let c=((await a.json()).data??[]).map(d=>d.url).filter(d=>!!d);return{mediaUrls:c,model:e.model,size:e.size??"1024x1024",durationMs:Date.now()-r,billingUnit:"per_call",billingQuantity:e.n??Math.max(c.length,1),metadata:{billableUnits:{images:e.n??Math.max(c.length,1)},pricingSpec:e.size??"1024x1024"}}}async parseStreamingImage(e,t,n){let r=new TextDecoder,s="",i="",a=e.getReader();try{for(;;){let{done:l,value:c}=await a.read();if(l)break;s+=r.decode(c,{stream:!0});let d;for(;(d=s.indexOf(`
|
|
15
15
|
`))!==-1;){let u=s.slice(0,d).trim();if(s=s.slice(d+1),!u||u.startsWith(":")||!u.startsWith("data:"))continue;let p=u.slice(5).trim();if(p==="[DONE]")break;try{let h=JSON.parse(p).data?.[0]?.url;h&&(i=h,t.onProgress?.(50,"streaming"))}catch{}}}}finally{a.releaseLock()}return t.onProgress?.(100,"completed"),{mediaUrls:i?[i]:[],model:t.model,size:t.size??"1024x1024",durationMs:Date.now()-n,billingUnit:"per_call",billingQuantity:1,metadata:{billableUnits:{images:1},pricingSpec:t.size??"1024x1024"}}}async generateVideo(e,t,n){let r=Date.now(),s=`${this.baseUrl}/v3/contents/generations/tasks`,i=e.referenceVideos?.length??0,a=e.referenceAudios?.length??0,l=e.referenceImages?.length??0,c=!!(e.imageUrl||l>0);if(i>3)throw new Error(`Seedance 2.0: max 3 reference videos (got ${i}). Total duration must be \u922E?5s.`);if(a>3)throw new Error(`Seedance 2.0: max 3 reference audios (got ${a}). Total duration must be \u922E?5s.`);if(a>0&&!c&&i===0)throw new Error("Seedance 2.0: reference audio cannot be used alone. Provide at least one reference image or video.");if(e.operation==="edit"&&l>9)throw new Error(`Seedance 2.0 video edit: max 9 reference images (got ${l}).`);let d=[];switch(e.draftTaskId&&d.push({type:"draft_task",id:e.draftTaskId}),e.operation){case"multimodal_reference":{if(e.prompt&&d.push({type:"text",text:e.prompt}),e.referenceImages?.length)for(let k=0;k<e.referenceImages.length;k++){let x=e.imageRoles?.[k]??"reference_image";d.push({type:"image_url",image_url:{url:e.referenceImages[k]},role:x})}if(e.referenceVideos?.length)for(let k of e.referenceVideos)d.push({type:"video_url",video_url:{url:k},role:"reference_video"});if(e.referenceAudios?.length)for(let k of e.referenceAudios)d.push({type:"audio_url",audio_url:{url:k},role:"reference_audio"});break}case"extend":{if(e.sourceVideos?.length)for(let k of e.sourceVideos)d.push({type:"video_url",video_url:{url:k},role:"reference_video"});e.prompt&&d.push({type:"text",text:e.prompt});break}case"merge":for(let k of e.sourceVideos??[])d.push({type:"video_url",video_url:{url:k}});e.prompt&&d.push({type:"text",text:e.prompt});break;case"upscale":e.sourceVideos?.[0]&&d.push({type:"video_url",video_url:{url:e.sourceVideos[0]}}),d.push({type:"text",text:e.prompt||"upscale"});break;case"edit":for(let k of e.sourceVideos??[])d.push({type:"video_url",video_url:{url:k},role:"reference_video"});if(e.referenceImages?.length)for(let k of e.referenceImages)d.push({type:"image_url",image_url:{url:k},role:"reference_image"});e.prompt&&d.push({type:"text",text:e.prompt});break;default:{let k=(e.referenceVideos?.length??0)>0,x=(e.referenceAudios?.length??0)>0,I=(e.imageRoles?.length??0)>0;if(k||x||I){if(e.prompt&&d.push({type:"text",text:e.prompt}),e.referenceImages?.length)for(let P=0;P<e.referenceImages.length;P++){let O=e.imageRoles?.[P]??"reference_image";d.push({type:"image_url",image_url:{url:e.referenceImages[P]},role:O})}if(k)for(let P of e.referenceVideos)d.push({type:"video_url",video_url:{url:P},role:"reference_video"});if(x)for(let P of e.referenceAudios)d.push({type:"audio_url",audio_url:{url:P},role:"reference_audio"})}else if(e.referenceImages?.length){for(let P of e.referenceImages)d.push({type:"image_url",image_url:{url:P}});e.prompt&&d.push({type:"text",text:e.prompt})}else e.imageUrl?(d.push({type:"image_url",image_url:{url:e.imageUrl}}),e.prompt&&d.push({type:"text",text:e.prompt})):e.prompt&&d.push({type:"text",text:e.prompt});break}}let u={model:e.model,content:d};e.duration&&(u.duration=e.duration),e.aspectRatio&&(u.ratio=e.aspectRatio),e.resolution&&(u.resolution=e.resolution),e.seed!==void 0&&(u.seed=e.seed),e.fps&&(u.fps=e.fps),e.generateAudio!==void 0&&(u.generate_audio=e.generateAudio),e.watermark!==void 0&&(u.watermark=e.watermark),e.enhancePrompt!==void 0&&(u.enhance_prompt=e.enhancePrompt),e.cameraFixed!==void 0&&(u.camera_fixed=e.cameraFixed),e.returnLastFrame!==void 0&&(u.return_last_frame=e.returnLastFrame),e.serviceTier&&(u.service_tier=e.serviceTier),e.executionExpiresAfterSeconds!==void 0&&(u.execution_expires_after=e.executionExpiresAfterSeconds),e.draft!==void 0&&(u.draft=e.draft),e.safetyIdentifier&&(u.safety_identifier=e.safetyIdentifier),e.callbackUrl&&(u.callback_url=e.callbackUrl),e.videoTools?.length&&(u.tools=e.videoTools.map(k=>({type:k})));let p=await this.submitTask(s,u,t,n),m=await this.pollTask(`${this.baseUrl}/v3/contents/generations/tasks/${p}`,t,n,e.onProgress,p),h=[],f=m.content;typeof f?.video_url=="string"&&h.push(f.video_url);let y=typeof f?.last_frame_url=="string"?f.last_frame_url:void 0,b=du(m);return{mediaUrls:h,model:e.model,durationMs:Date.now()-r,lastFrameUrl:y,taskId:p,billingUnit:"per_token",billingQuantity:b.completionTokens,metadata:{billableUnits:{completion_tokens:b.completionTokens,total_tokens:b.totalTokens},usage:b.rawUsage,usageMissing:!b.hasUsage,pricingSpec:e.resolution??"720p"}}}async generate3D(e,t,n){let r=Date.now(),s=`${this.baseUrl}/v3/contents/generations/tasks`,i=[],a=[];e.outputFormat&&a.push(`--fileformat ${e.outputFormat}`),e.prompt&&a.push(e.prompt),a.length>0&&i.push({type:"text",text:a.join(" ")}),e.imageUrl&&i.push({type:"image_url",image_url:{url:e.imageUrl}});let l={model:e.model,content:i},c=await this.submitTask(s,l,t,n),d=await this.pollTask(`${this.baseUrl}/v3/contents/generations/tasks/${c}`,t,n,e.onProgress,c),u=[],p=d.content;if(typeof p?.video_url=="string"&&u.push(p.video_url),u.length===0&&p)for(let[,f]of Object.entries(p))typeof f=="string"&&/^https?:\/\//.test(f)&&u.push(f);let m=d.output;if(m?.model_urls){let f=m.model_urls;for(let y of Object.values(f))y&&!u.includes(y)&&u.push(y)}if(u.length===0){let f=Object.keys(d),y=p?Object.keys(p):[],b=m?Object.keys(m):[];console.error(`[volcengine-3d] No media URLs found. Response keys: [${f}], content keys: [${y}], output keys: [${b}]`);let k=d.data;if(k?.content){let x=k.content;for(let[,I]of Object.entries(x))typeof I=="string"&&/^https?:\/\//.test(I)&&u.push(I)}}let h=du(d);return{mediaUrls:u,model:e.model,durationMs:Date.now()-r,billingUnit:"per_token",billingQuantity:h.completionTokens,metadata:u.length===0?{billableUnits:{completion_tokens:h.completionTokens,total_tokens:h.totalTokens},usage:h.rawUsage,usageMissing:!h.hasUsage,debugResponseKeys:Object.keys(d),debugContentKeys:p?Object.keys(p):null,debugContentSample:p?JSON.stringify(p).slice(0,500):null,debugOutputKeys:m?Object.keys(m):null,debugResultSample:JSON.stringify(d).slice(0,800)}:{billableUnits:{completion_tokens:h.completionTokens,total_tokens:h.totalTokens},usage:h.rawUsage,usageMissing:!h.hasUsage,pricingSpec:e.outputFormat??"3d"}}}async getTaskStatus(e,t,n){let r=`${this.baseUrl}/v3/contents/generations/tasks/${e}`,s=await fetch(r,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let l=await s.text().catch(()=>"");throw new Error(`Volcengine task status error ${s.status}: ${l}`)}let i=await s.json();return{status:i.status??"unknown",task:i}}async listVideoTasks(e,t,n){let r=new URLSearchParams;t?.after&&r.set("after",t.after),t?.limit&&r.set("limit",String(t.limit)),t?.status&&r.set("status",t.status);let s=r.toString(),i=`${this.baseUrl}/v3/contents/generations/tasks${s?`?${s}`:""}`,a=await fetch(i,{method:"GET",headers:{Authorization:`Bearer ${e}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!a.ok){let l=await a.text().catch(()=>"");throw new Error(`Volcengine list tasks error ${a.status}: ${l}`)}return await a.json()}async deleteVideoTask(e,t,n){let r=`${this.baseUrl}/v3/contents/generations/tasks/${e}`,s=await fetch(r,{method:"DELETE",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let i=await s.text().catch(()=>"");throw new Error(`Volcengine delete task error ${s.status}: ${i}`)}}async uploadFile(e,t,n,r){let s=`${this.baseUrl}/v3/files`,i=new FormData;i.append("file",e instanceof Blob?e:new Blob([e]),n?.filename??"upload"),i.append("purpose",n?.purpose??"user_data");let a=await fetch(s,{method:"POST",headers:{Authorization:`Bearer ${t}`},body:i,signal:r??AbortSignal.timeout(this.timeoutMs)});if(!a.ok){let c=await a.text().catch(()=>"");throw new Error(`Volcengine file upload error ${a.status}: ${c}`)}let l=await a.json();return{id:String(l.id??""),status:String(l.status??"")}}async getFile(e,t,n){let r=`${this.baseUrl}/v3/files/${e}`,s=await fetch(r,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let i=await s.text().catch(()=>"");throw new Error(`Volcengine get file error ${s.status}: ${i}`)}return await s.json()}async listFiles(e,t,n){let r=new URLSearchParams;t?.after&&r.set("after",t.after),t?.limit&&r.set("limit",String(t.limit)),t?.purpose&&r.set("purpose",t.purpose),t?.order&&r.set("order",t.order);let s=r.toString(),i=`${this.baseUrl}/v3/files${s?`?${s}`:""}`,a=await fetch(i,{method:"GET",headers:{Authorization:`Bearer ${e}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!a.ok){let l=await a.text().catch(()=>"");throw new Error(`Volcengine list files error ${a.status}: ${l}`)}return await a.json()}async deleteFile(e,t,n){let r=`${this.baseUrl}/v3/files/${e}`,s=await fetch(r,{method:"DELETE",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let i=await s.text().catch(()=>"");throw new Error(`Volcengine delete file error ${s.status}: ${i}`)}}async submitTask(e,t,n,r){let s=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`},body:JSON.stringify(t),signal:r??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let l=await s.text().catch(()=>"");throw new Error(`Volcengine task submit error ${s.status}: ${l}`)}let i=await s.json(),a=i.id??i.task_id;if(!a)throw new Error("Volcengine task submit: no task_id in response");return a}async pollTask(e,t,n,r,s){let i=Date.now()+6e5,a=0;for(;Date.now()<i;){n?.throwIfAborted();let l=await fetch(e,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!l.ok){let m=await l.text().catch(()=>"");throw new Error(`Volcengine task poll error ${l.status}: ${m}`)}let c=await l.json(),d=c.status;if(d==="succeeded"||d==="complete")return r?.(100,"completed",s),c;if(d==="failed"||d==="cancelled"){let m=c.error?.message??"Task failed";throw new Error(`Volcengine task failed: ${m}`)}a++;let u=Date.now()-(i-6e5),p=Math.min(95,Math.round(u/6e5*100));r?.(p,d??"running",s),await new Promise(m=>setTimeout(m,3e3))}throw new Error("Volcengine task timed out after polling")}}});import{join as La}from"node:path";import{homedir as bS,tmpdir as kS}from"node:os";function uu(){return process.env.QLOGICAGENT_HOME??La(bS()||kS(),".qlogicagent")}function Ft(){return process.env.QLOGICAGENT_CACHE_DIR??La(uu(),"cache")}function pu(){return process.env.QLOGICAGENT_DEBUG_LOG_DIR??La(uu(),"debug-logs")}var Un=N(()=>{"use strict"});import{writeFileSync as vS,mkdirSync as SS}from"node:fs";import{join as mu}from"node:path";import{randomUUID as TS}from"node:crypto";var wS,To,Na=N(()=>{"use strict";Un();wS=18e4,To=class{supportedTypes=["image","tts"];baseUrl;timeoutMs;constructor(e){this.baseUrl=e.baseUrl.replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??wS}async generate(e,t,n){switch(e.mediaType){case"image":return this.generateImage(e,t,n);case"tts":return this.generateTTS(e,t,n);default:throw new Error(`OpenAIMediaTransport: unsupported mediaType "${e.mediaType}"`)}}async generateImage(e,t,n){let r=Date.now(),s=`${this.baseUrl}/v1/images/generations`,i={model:e.model,prompt:e.prompt,n:e.n??1,size:e.size??"1024x1024",response_format:"url"};e.quality&&(i.quality=e.quality),e.style&&(i.style=e.style),e.background&&(i.background=e.background);let a=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(i),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!a.ok){let d=await a.text().catch(()=>"");throw new Error(`OpenAI images API error ${a.status}: ${d}`)}return{mediaUrls:((await a.json()).data??[]).map(d=>d.url).filter(d=>!!d),model:e.model,size:e.size??"1024x1024",durationMs:Date.now()-r}}async generateTTS(e,t,n){let r=Date.now(),s=e.text||e.prompt;if(!s)throw new Error("OpenAIMediaTransport: text or prompt is required for TTS");let i=`${this.baseUrl}/v1/audio/speech`,a={model:e.model||"tts-1",input:s,voice:e.voice??"alloy",response_format:e.audioFormat??"mp3"};e.speed!==void 0&&(a.speed=e.speed);let l=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(a),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!l.ok){let m=await l.text().catch(()=>"");throw new Error(`OpenAI TTS API error ${l.status}: ${m}`)}let c=Buffer.from(await l.arrayBuffer()),d=mu(Ft(),"tts");SS(d,{recursive:!0});let u=`openai-tts-${TS()}.mp3`,p=mu(d,u);return vS(p,c),{mediaUrls:[`file://${p}`],model:e.model||"tts-1",durationMs:Date.now()-r,billingUnit:"per_character",billingQuantity:s.length}}}});var kn,Mr=N(()=>{"use strict";kn=class{supportedTypes=["music","video","tts"];baseUrl;timeoutMs;constructor(e){this.baseUrl=e.baseUrl.replace(/\/anthropic\/?$/,"").replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??6e4}async generate(e,t,n){switch(e.mediaType){case"music":return this.generateMusic(e,t,n);case"video":return this.generateVideo(e,t,n);case"tts":return this.generateTTS(e,t,n);default:throw new Error(`MiniMaxMediaTransport: unsupported mediaType "${e.mediaType}"`)}}async generateTTS(e,t,n){let r=Date.now(),s=e.text??e.prompt;if(!s)throw new Error("MiniMaxMediaTransport: text or prompt is required for TTS");let i=e.audioFormat??"mp3",a=`${this.baseUrl}/v1/t2a_v2`,l={model:e.model||"speech-2.8-turbo",text:s,stream:!1,output_format:"url",voice_setting:{voice_id:e.voice??"male-qn-qingse",speed:e.speed??1,vol:e.metadata?.volume??1,pitch:e.metadata?.pitch??0},audio_setting:{sample_rate:e.metadata?.sampleRate??32e3,bitrate:e.metadata?.bitrate??128e3,format:i,channel:e.metadata?.channel??1}},c=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(l),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!c.ok){let m=await c.text().catch(()=>"");throw new Error(`MiniMax TTS error ${c.status}: ${m}`)}let d=await c.json();if(d.base_resp?.status_code&&d.base_resp.status_code!==0)throw new Error(`MiniMax TTS rejected: ${d.base_resp.status_msg??"unknown"}`);let u=d.data?.audio;if(!u)throw new Error("MiniMax TTS: no audio in response");let p=d.extra_info?.usage_characters??s.length;return{mediaUrls:[u],model:e.model,durationMs:Date.now()-r,billingUnit:"per_character",billingQuantity:p,metadata:{traceId:d.trace_id,status:d.data?.status,extraInfo:d.extra_info,billableUnits:{characters:p}}}}async generateMusic(e,t,n){let r=Date.now(),s=`${this.baseUrl}/v1/music_generation`,i={model:e.model,prompt:e.prompt,output_format:"url"};e.lyrics&&(i.lyrics=e.lyrics),e.duration&&(i.duration=e.duration),(e.isInstrumental||!e.lyrics)&&(i.is_instrumental=!0),e.audioUrl&&(i.audio_url=e.audioUrl),e.lyricsOptimizer&&(i.lyrics_optimizer=!0),(e.audioFormat||e.voice)&&(i.audio_setting={sample_rate:44100,bitrate:256e3,format:e.audioFormat??"mp3"});let a=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(i),signal:n??AbortSignal.timeout(6e5)});if(!a.ok){let m=await a.text().catch(()=>"");throw new Error(`MiniMax music error ${a.status}: ${m}`)}let l=await a.json();if(l.base_resp?.status_code&&l.base_resp.status_code!==0)throw new Error(`MiniMax music rejected: ${l.base_resp.status_msg??"unknown"}`);let c=l.data?.audio??l.audio_file;if(c)return{mediaUrls:[c],model:e.model,durationMs:Date.now()-r,billingUnit:"per_second",billingQuantity:e.duration??0,metadata:{billableUnits:{seconds:e.duration??0}}};let d=l.task_id;if(!d)throw new Error("MiniMax music: no audio_file or task_id in response");let u=`${this.baseUrl}/v1/music_generation/${d}`;return{mediaUrls:(await this.pollTask(u,t,n,e.onProgress,d)).audioUrls,model:e.model,durationMs:Date.now()-r,billingUnit:"per_second",billingQuantity:e.duration??0,metadata:{billableUnits:{seconds:e.duration??0}}}}async pollTask(e,t,n,r,s){let i=Date.now()+6e5;for(;Date.now()<i;){n?.throwIfAborted();let a=await fetch(e,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!a.ok){let u=await a.text().catch(()=>"");throw new Error(`MiniMax music poll error ${a.status}: ${u}`)}let l=await a.json(),c=l.status;if(c==="Success"||c==="Finished"){r?.(100,"completed",s);let u=[];return l.audio_file&&u.push(l.audio_file),{audioUrls:u}}if(c==="Failed"||c==="Cancelled")throw new Error(`MiniMax music task failed: ${l.base_resp?.status_msg??"unknown"}`);let d=Date.now()-(i-6e5);r?.(Math.min(95,Math.round(d/6e5*100)),c??"running",s),await new Promise(u=>setTimeout(u,3e3))}throw new Error("MiniMax music task timed out after polling")}async generateLyrics(e,t,n){let r=`${this.baseUrl}/v1/lyrics_generation`,s=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify({prompt:e}),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let a=await s.text().catch(()=>"");throw new Error(`MiniMax lyrics API error ${s.status}: ${a}`)}let i=await s.json();if(i.base_resp?.status_code&&i.base_resp.status_code!==0)throw new Error(`MiniMax lyrics error: ${i.base_resp.status_msg??"unknown"}`);return i.data?.lyrics??""}async generateVideo(e,t,n){let r=Date.now(),s=`${this.baseUrl}/v1/video_generation`,i={model:e.model||"S2V-01",prompt:e.prompt};if(e.referenceImages?.length&&e.imageRoles){let u=e.imageRoles.includes("first_frame"),p=e.imageRoles.includes("last_frame");if(u&&p){let m=e.imageRoles.indexOf("first_frame"),h=e.imageRoles.indexOf("last_frame");i.first_frame_image=e.referenceImages[m],i.last_frame_image=e.referenceImages[h]}else if(u){let m=e.imageRoles.indexOf("first_frame");i.first_frame_image=e.referenceImages[m]}else i.subject_reference=e.referenceImages.map((m,h)=>({type:"character",image:m}))}else e.imageUrl&&(i.first_frame_image=e.imageUrl);e.callbackUrl&&(i.callback_url=e.callbackUrl);let a=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(i),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!a.ok){let u=await a.text().catch(()=>"");throw new Error(`MiniMax video submit error ${a.status}: ${u}`)}let l=await a.json();if(l.base_resp?.status_code&&l.base_resp.status_code!==0)throw new Error(`MiniMax video rejected: ${l.base_resp.status_msg??"unknown"}`);let c=l.task_id;if(!c)throw new Error("MiniMax video: no task_id in response");let d=await this.pollVideoTask(c,t,n,e.onProgress);return{mediaUrls:d.downloadUrl?[d.downloadUrl]:[],model:e.model||"S2V-01",durationMs:Date.now()-r,taskId:c,billingUnit:"per_second",billingQuantity:e.duration??0,metadata:{billableUnits:{videos:1,seconds:e.duration??0},fileId:d.fileId,width:d.width,height:d.height}}}async pollVideoTask(e,t,n,r){let s=Date.now()+6e5;for(;Date.now()<s;){n?.throwIfAborted();let i=`${this.baseUrl}/v1/query/video_generation?task_id=${encodeURIComponent(e)}`,a=await fetch(i,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!a.ok){let m=await a.text().catch(()=>"");throw new Error(`MiniMax video poll error ${a.status}: ${m}`)}let l=await a.json();if(l.base_resp?.status_code&&l.base_resp.status_code!==0)throw new Error(`MiniMax video task error ${l.base_resp.status_code}: ${l.base_resp.status_msg??""}`);let c=l.status;if(c==="Success"){r?.(100,"completed",e);let m;if(l.file_id)try{m=await this.getFileDownloadUrl(l.file_id,t,n)}catch{}return{fileId:l.file_id,downloadUrl:m,width:l.video_width,height:l.video_height}}if(c==="Fail")throw new Error(`MiniMax video task failed: ${l.base_resp?.status_msg??"unknown"}`);let d=c??"running",u=Date.now()-(s-6e5),p=Math.min(95,Math.round(u/6e5*100));r?.(p,d,e),await new Promise(m=>setTimeout(m,3e3))}throw new Error("MiniMax video task timed out after polling")}async getFileDownloadUrl(e,t,n){let r=`${this.baseUrl}/v1/files/retrieve?file_id=${encodeURIComponent(e)}`,s=await fetch(r,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let l=await s.text().catch(()=>"");throw new Error(`MiniMax file retrieve error ${s.status}: ${l}`)}let a=(await s.json()).file?.download_url;if(!a)throw new Error("MiniMax file retrieve: no download_url in response");return a}async getTaskStatus(e,t,n){let r=`${this.baseUrl}/v1/query/video_generation?task_id=${encodeURIComponent(e)}`,s=await fetch(r,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let c=await s.text().catch(()=>"");throw new Error(`MiniMax task status error ${s.status}: ${c}`)}let i=await s.json(),a=i.status??"unknown";return{status:a==="Success"?"succeeded":a==="Fail"?"failed":a.toLowerCase(),task:i}}async listVideoTasks(e,t,n){return{data:[]}}async deleteVideoTask(e,t,n){throw new Error("MiniMax does not support video task cancellation.")}}});import{writeFileSync as xS,mkdirSync as RS}from"node:fs";import{join as fu}from"node:path";import{randomUUID as _S}from"node:crypto";async function $a(o,e,t){let n=t.durationSeconds??30,r=Date.now(),s=new Or(e),i=[];s.onAudioChunk=l=>{i.push(l.data)};let a=null;s.onError=l=>{a=l};try{await s.connect(o,{model:t.model??"lyria-realtime-exp",prompts:t.prompts,config:t.musicConfig}),t.onProgress?.(5,"connected"),await s.play(),t.onProgress?.(10,"streaming");let l=Date.now()+n*1e3,c=500;for(;Date.now()<l;){if(t.signal?.throwIfAborted(),a)throw a;if(!s.connected)break;let f=Date.now()-r,y=n*1e3,b=Math.min(95,Math.round(10+f/y*85));t.onProgress?.(b,"streaming"),await new Promise(k=>setTimeout(k,c))}s.connected&&await s.stop(),t.onProgress?.(98,"assembling");let d=Buffer.concat(i),u=AS(d,48e3,2,16),p=fu(Ft(),"gemini-music-realtime");RS(p,{recursive:!0});let m=`lyria-rt-${_S()}.wav`,h=fu(p,m);return xS(h,u),t.onProgress?.(100,"completed"),{filePath:`file://${h}`,durationMs:Date.now()-r}}finally{s.close()}}function AS(o,e,t,n){let r=e*t*(n/8),s=t*(n/8),i=o.length,a=Buffer.alloc(44);return a.write("RIFF",0),a.writeUInt32LE(36+i,4),a.write("WAVE",8),a.write("fmt ",12),a.writeUInt32LE(16,16),a.writeUInt16LE(1,20),a.writeUInt16LE(t,22),a.writeUInt32LE(e,24),a.writeUInt32LE(r,28),a.writeUInt16LE(s,30),a.writeUInt16LE(n,32),a.write("data",36),a.writeUInt32LE(i,40),Buffer.concat([a,o])}var Or,Ua=N(()=>{"use strict";Un();Or=class{ws=null;wsUrl;model="models/lyria-realtime-exp";onAudioChunk=null;onFilteredPrompt=null;onError=null;onClose=null;constructor(e){let t=e.baseUrl.replace(/\/+$/,""),n=new URL(t).origin.replace(/^http/,"ws");this.wsUrl=`${n}/ws/google.ai.generativelanguage.v1alpha.GenerativeService.BidiGenerateContent`}async connect(e,t){t.model&&(this.model=t.model.startsWith("models/")?t.model:`models/${t.model}`);let n=`${this.wsUrl}?key=${encodeURIComponent(e)}`,r=new WebSocket(n);this.ws=r,await new Promise((s,i)=>{let a=()=>{r.removeEventListener("error",l),s()},l=()=>{r.removeEventListener("open",a),i(new Error("Lyria RealTime WebSocket connection failed"))};r.addEventListener("open",a,{once:!0}),r.addEventListener("error",l,{once:!0})}),r.addEventListener("message",s=>this.handleMessage(s)),r.addEventListener("error",()=>{this.onError?.(new Error("Lyria RealTime WebSocket error"))}),r.addEventListener("close",()=>{this.ws=null,this.onClose?.()}),this.send({setup:{model:this.model}}),await new Promise(s=>setTimeout(s,100)),await this.setWeightedPrompts(t.prompts),t.config&&await this.setMusicGenerationConfig(t.config)}async setWeightedPrompts(e){this.send({musicInput:{weightedPrompts:e.map(t=>({text:t.text,weight:t.weight}))}})}async setMusicGenerationConfig(e){let t={};e.bpm!==void 0&&(t.bpm=e.bpm),e.density!==void 0&&(t.density=e.density),e.brightness!==void 0&&(t.brightness=e.brightness),e.guidance!==void 0&&(t.guidance=e.guidance),e.scale!==void 0&&(t.scale=e.scale),e.temperature!==void 0&&(t.temperature=e.temperature),e.topK!==void 0&&(t.top_k=e.topK),e.seed!==void 0&&(t.seed=e.seed),e.muteBass!==void 0&&(t.mute_bass=e.muteBass),e.muteDrums!==void 0&&(t.mute_drums=e.muteDrums),e.onlyBassAndDrums!==void 0&&(t.only_bass_and_drums=e.onlyBassAndDrums),e.musicGenerationMode!==void 0&&(t.music_generation_mode=e.musicGenerationMode),e.audioFormat!==void 0&&(t.audio_format=e.audioFormat),e.sampleRateHz!==void 0&&(t.sample_rate_hz=e.sampleRateHz),this.send({musicInput:{musicGenerationConfig:t}})}async play(){this.send({musicInput:{playbackControl:"PLAY"}})}async pause(){this.send({musicInput:{playbackControl:"PAUSE"}})}async stop(){this.send({musicInput:{playbackControl:"STOP"}})}async resetContext(){this.send({musicInput:{playbackControl:"RESET_CONTEXT"}})}close(){this.ws&&this.ws.readyState!==WebSocket.CLOSED&&this.ws.close(),this.ws=null}get connected(){return this.ws!==null&&this.ws.readyState===WebSocket.OPEN}send(e){if(!this.ws||this.ws.readyState!==WebSocket.OPEN)throw new Error("Lyria RealTime session not connected");this.ws.send(JSON.stringify(e))}handleMessage(e){let t;try{t=JSON.parse(typeof e.data=="string"?e.data:e.data.toString())}catch{return}let n=t.serverContent;if(!n)return;let r=n.audioChunks;if(r&&this.onAudioChunk)for(let i of r)i.data&&this.onAudioChunk({data:Buffer.from(i.data,"base64")});let s=n.filteredPrompt;s&&this.onFilteredPrompt?.(s)}}});import{writeFileSync as gu,mkdirSync as hu}from"node:fs";import{join as Dr}from"node:path";import{randomUUID as yu}from"node:crypto";function CS(o,e,t,n){let r=e*t*(n/8),s=t*(n/8),i=o.length,a=Buffer.alloc(44);return a.write("RIFF",0),a.writeUInt32LE(36+i,4),a.write("WAVE",8),a.write("fmt ",12),a.writeUInt32LE(16,16),a.writeUInt16LE(1,20),a.writeUInt16LE(t,22),a.writeUInt32LE(e,24),a.writeUInt32LE(r,28),a.writeUInt16LE(s,30),a.writeUInt16LE(n,32),a.write("data",36),a.writeUInt32LE(i,40),Buffer.concat([a,o])}var PS,IS,ja,wo,Fa=N(()=>{"use strict";Un();Ua();PS=18e4,IS=1e4,ja=6e5,wo=class{supportedTypes=["image","video","music","music_realtime","tts","embedding"];apiBase;timeoutMs;constructor(e){this.apiBase=e.baseUrl.replace(/\/openai\/?$/,"").replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??PS}async generate(e,t,n){switch(e.mediaType){case"image":return this.generateImage(e,t,n);case"video":return this.generateVideo(e,t,n);case"music":return this.generateMusic(e,t,n);case"music_realtime":return this.generateMusicRealtime(e,t,n);case"tts":return this.generateTTS(e,t,n);case"embedding":return this.generateEmbedding(e,t,n);default:throw new Error(`GeminiMediaTransport: unsupported mediaType "${e.mediaType}"`)}}async deleteVideoTask(e,t,n){throw new Error("Gemini does not support deleting video generation tasks")}async listVideoTasks(e,t,n){return{data:[]}}async getTaskStatus(e,t,n){let r=`${this.apiBase}/${e}`,s=await fetch(r,{method:"GET",headers:{"x-goog-api-key":t},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let l=await s.text().catch(()=>"");throw new Error(`Gemini operation query error ${s.status}: ${l}`)}let i=await s.json();return{status:i.done?"completed":"running",task:i}}async generateImage(e,t,n){let r=Date.now(),s=`${this.apiBase}/models/${e.model}:generateContent`,i={responseModalities:["TEXT","IMAGE"]};e.aspectRatio&&(i.aspectRatio=e.aspectRatio);let a={contents:[{parts:[{text:e.prompt}]}],generationConfig:i},l=await this.postJson(s,a,t,n);return{mediaUrls:this.extractInlineImages(l),model:e.model,durationMs:Date.now()-r}}async generateVideo(e,t,n){let r=Date.now(),s=`${this.apiBase}/models/${e.model}:predictLongRunning`,i={prompt:e.prompt};e.imageUrl&&(i.image={inlineData:await this.resolveImageData(e.imageUrl)}),e.referenceImages?.length&&(i.referenceImages=await Promise.all(e.referenceImages.map(async y=>({image:{inlineData:await this.resolveImageData(y)},referenceType:"asset"}))));let a={};e.aspectRatio&&(a.aspectRatio=e.aspectRatio),e.resolution&&(a.resolution=e.resolution),e.duration&&(a.durationSeconds=String(e.duration)),e.n&&(a.numberOfVideos=e.n),e.seed!==void 0&&(a.seed=e.seed);let l={instances:[i]};Object.keys(a).length>0&&(l.parameters=a);let d=(await this.postJson(s,l,t,n)).name;if(!d)throw new Error("Gemini video submit: no operation name in response");let u=d;e.onProgress?.(5,"submitted",u);let h=(await this.pollOperation(d,t,n,e.onProgress,u)).response?.generateVideoResponse?.generatedSamples??[],f=[];for(let y of h)y.video?.uri&&f.push(y.video.uri);return{mediaUrls:f,model:e.model,durationMs:Date.now()-r,taskId:u}}async generateMusic(e,t,n){let r=Date.now(),s=`${this.apiBase}/models/${e.model}:generateContent`,i=[{text:e.prompt}],a={};e.audioFormat==="wav"&&(a.responseModalities=["AUDIO","TEXT"],a.responseFormat={audio:{mimeType:"audio/wav"}});let l={contents:[{parts:i}]};Object.keys(a).length>0&&(l.generationConfig=a);let c=await this.postJson(s,l,t,n);return{mediaUrls:this.extractInlineAudio(c,"gemini-music"),model:e.model,durationMs:Date.now()-r}}async generateMusicRealtime(e,t,n){let r=await $a(t,{baseUrl:this.apiBase},{prompts:[{text:e.prompt,weight:1}],durationSeconds:e.duration??30,musicConfig:{audioFormat:e.audioFormat==="wav"?"pcm16":void 0,sampleRateHz:48e3},model:e.model,signal:n,onProgress:e.onProgress});return{mediaUrls:[r.filePath],model:e.model,durationMs:r.durationMs}}async generateTTS(e,t,n){let r=Date.now(),s=`${this.apiBase}/models/${e.model}:generateContent`,i={responseModalities:["AUDIO"]};e.voice&&(i.speechConfig={voiceConfig:{prebuiltVoiceConfig:{voiceName:e.voice}}});let a={contents:[{parts:[{text:e.text??e.prompt}]}],generationConfig:i},l=await this.postJson(s,a,t,n);return{mediaUrls:this.extractInlineAudio(l,"gemini-tts"),model:e.model,durationMs:Date.now()-r}}async generateEmbedding(e,t,n){let r=Date.now(),s=`${this.apiBase}/models/${e.model}:embedContent`,i={content:{parts:[{text:e.text??e.prompt}]}},a=e.metadata?.outputDimensionality;a!==void 0&&(i.output_dimensionality=a);let l=await this.postJson(s,i,t,n),c=l.embedding?.values??l.embeddings?.[0]?.values??[];return{mediaUrls:[],model:e.model,durationMs:Date.now()-r,metadata:{embedding:c,dimensions:c.length}}}async postJson(e,t,n,r){let s=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json","x-goog-api-key":n},body:JSON.stringify(t),signal:r??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let i=await s.text().catch(()=>"");throw new Error(`Gemini API error ${s.status}: ${i}`)}return s.json()}async pollOperation(e,t,n,r,s){let i=Date.now()+ja;for(;Date.now()<i;){n?.throwIfAborted();let a=`${this.apiBase}/${e}`,l=await fetch(a,{method:"GET",headers:{"x-goog-api-key":t},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!l.ok){let p=await l.text().catch(()=>"");throw new Error(`Gemini operation poll error ${l.status}: ${p}`)}let c=await l.json();if(c.done===!0)return r?.(100,"completed",s),c;if(c.error){let p=c.error;throw new Error(`Gemini video generation failed: ${p.message??JSON.stringify(p)}`)}let d=Date.now()-(i-ja),u=Math.min(95,Math.round(d/ja*100));r?.(u,"running",s),await new Promise(p=>setTimeout(p,IS))}throw new Error("Gemini video generation timed out after polling")}async resolveImageData(e){if(e.startsWith("data:")){let s=e.match(/^data:([^;]+);base64,(.+)$/);if(s)return{mimeType:s[1],data:s[2]}}if(e.startsWith("file://")){let{readFileSync:s}=await import("node:fs"),i=e.replace(/^file:\/\//,""),a=s(i).toString("base64"),l=i.split(".").pop()?.toLowerCase()??"png";return{mimeType:l==="jpg"||l==="jpeg"?"image/jpeg":l==="webp"?"image/webp":"image/png",data:a}}let t=await fetch(e,{signal:AbortSignal.timeout(6e4)});if(!t.ok)throw new Error(`Failed to fetch image ${e}: ${t.status}`);let n=Buffer.from(await t.arrayBuffer());return{mimeType:t.headers.get("content-type")??"image/png",data:n.toString("base64")}}extractInlineImages(e){let t=[],n=Dr(Ft(),"gemini-images");hu(n,{recursive:!0});for(let r of e.candidates??[])for(let s of r.content?.parts??[])if(s.inlineData?.data){let i=s.inlineData.mimeType==="image/png"?"png":s.inlineData.mimeType==="image/webp"?"webp":"jpg",a=`gemini-${yu()}.${i}`,l=Dr(n,a);gu(l,Buffer.from(s.inlineData.data,"base64")),t.push(`file://${l}`)}return t}extractInlineAudio(e,t){let n=[],r=Dr(Ft(),t);hu(r,{recursive:!0});for(let s of e.candidates??[])for(let i of s.content?.parts??[])if(i.inlineData?.data&&i.inlineData.mimeType?.startsWith("audio/")){let a=i.inlineData.mimeType.includes("wav")?"wav":i.inlineData.mimeType.includes("mpeg")||i.inlineData.mimeType.includes("mp3")?"mp3":"pcm",l=Buffer.from(i.inlineData.data,"base64"),c=a==="pcm"?CS(l,24e3,1,16):l,d=`gemini-${yu()}.${a==="pcm"?"wav":a}`,u=Dr(r,d);gu(u,c),n.push(`file://${u}`)}return n}}});function ES(o){return new Promise(e=>setTimeout(e,o))}var Lr,bu=N(()=>{"use strict";Lr=class{supportedTypes=["tts","video","embedding","rerank"];baseUrl;timeoutMs;constructor(e){this.baseUrl=e.baseUrl.replace(/\/apps\/anthropic\/?$/,"").replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??3e4}async generate(e,t,n){if(e.mediaType==="video")return this.generateVideo(e,t,n);if(e.mediaType==="embedding")return this.generateEmbedding(e,t,n);if(e.mediaType==="rerank")return this.generateRerank(e,t,n);if(e.mediaType!=="tts")throw new Error(`QwenMediaTransport: unsupported mediaType "${e.mediaType}"`);return this.generateTTS(e,t,n)}async generateTTS(e,t,n){let r=Date.now(),s=e.text||e.prompt;if(!s)throw new Error("QwenMediaTransport: text or prompt is required for TTS");return(e.model||"").startsWith("cosyvoice")?this.generateCosyVoiceTTS(e,t,n,r,s):this.generateQwenTTS(e,t,n,r,s)}async generateQwenTTS(e,t,n,r,s){let i=`${this.baseUrl}/api/v1/services/aigc/multimodal-generation/generation`,a={model:e.model||"qwen3-tts-flash",input:{text:s,voice:e.voice??"Cherry",language_type:e.metadata?.languageType??"English"}},l=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(a),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!l.ok){let p=await l.text().catch(()=>"");throw new Error(`DashScope Qwen TTS error ${l.status}: ${p}`)}let c=await l.json();if(c.code)throw new Error(`DashScope Qwen TTS rejected: ${c.code}: ${c.message??""}`);let d=c.output?.audio?.url,u=c.usage?.characters??s.length;return{mediaUrls:d?[d]:[],model:e.model||"qwen3-tts-flash",durationMs:Date.now()-r,billingUnit:"per_character",billingQuantity:u,metadata:{usage:c.usage,finishReason:c.output?.finish_reason,requestId:c.request_id}}}async generateCosyVoiceTTS(e,t,n,r,s){let i=`${this.baseUrl}/api/v1/services/audio/tts/SpeechSynthesizer`,a={model:e.model||"cosyvoice-v2",input:{text:s},parameters:{voice:e.voice??"longxiaochun_v2",format:e.audioFormat??"mp3",sample_rate:e.metadata?.sampleRate??24e3}},l=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(a),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!l.ok){let p=await l.text().catch(()=>"");throw new Error(`DashScope CosyVoice TTS error ${l.status}: ${p}`)}let c=await l.json();if(c.code)throw new Error(`DashScope CosyVoice TTS rejected: ${c.code}: ${c.message??""}`);let d=c.output?.audio?.url,u=c.usage?.characters??s.length;return{mediaUrls:d?[d]:[],model:e.model||"cosyvoice-v2",durationMs:Date.now()-r,billingUnit:"per_character",billingQuantity:u,metadata:{usage:c.usage,finishReason:c.output?.finish_reason,requestId:c.request_id}}}async generateEmbedding(e,t,n){let r=Date.now(),s=e.text||e.prompt;if(!s)throw new Error("QwenMediaTransport: text or prompt is required for embedding");let i=`${this.baseUrl}/compatible-mode/v1/embeddings`,a={model:e.model||"text-embedding-v4",input:s};e.metadata?.dimensions&&(a.dimensions=e.metadata.dimensions);let l=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(a),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!l.ok){let p=await l.text().catch(()=>"");throw new Error(`DashScope embedding error ${l.status}: ${p}`)}let c=await l.json(),d=(c.data??[]).map(p=>p.embedding).filter(p=>Array.isArray(p)),u=c.usage?.total_tokens??c.usage?.prompt_tokens;return{mediaUrls:[],model:c.model??e.model??"text-embedding-v4",durationMs:Date.now()-r,billingUnit:u!==void 0?"per_token":void 0,billingQuantity:u,metadata:{embeddings:d,dimensions:d[0]?.length??0,usage:c.usage}}}async generateRerank(e,t,n){let r=Date.now(),s=e.prompt,i=e.metadata?.documents;if(!s)throw new Error("QwenMediaTransport: prompt (query) is required for rerank");if(!Array.isArray(i))throw new Error("QwenMediaTransport: metadata.documents is required for rerank");let a=`${this.baseUrl}/api/v1/services/rerank/text-rerank/text-rerank`,l={model:e.model||"qwen3-rerank",input:{query:s,documents:i},parameters:{}};e.metadata?.topN!==void 0&&(l.parameters.top_n=e.metadata.topN);let c=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(l),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!c.ok){let p=await c.text().catch(()=>"");throw new Error(`DashScope rerank error ${c.status}: ${p}`)}let d=await c.json(),u=d.usage?.total_tokens;return{mediaUrls:[],model:e.model||"qwen3-rerank",durationMs:Date.now()-r,billingUnit:u!==void 0?"per_token":void 0,billingQuantity:u,metadata:{results:(d.output?.results??[]).map(p=>({index:p.index,relevanceScore:p.relevance_score,document:p.document})),usage:d.usage}}}async pollTask(e,t,n,r,s=12e4){let i=Date.now()+s,a=`${this.baseUrl}/api/v1/tasks/${e}`;for(;Date.now()<i;){n?.throwIfAborted(),await ES(2e3);let l=await fetch(a,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!l.ok){let p=await l.text().catch(()=>"");throw new Error(`DashScope TTS poll error ${l.status}: ${p}`)}let c=await l.json();if(c.code)throw new Error(`DashScope poll rejected: ${c.code} \u9225?${c.message??""}`);let d=c.output?.task_status;if(d==="SUCCEEDED"){r?.(100,"completed",e);let p=this.extractMediaUrl(c);return p?[p]:[]}if(d==="FAILED")throw new Error(`DashScope task failed: ${c.message??"unknown error"}`);let u=Date.now()-(i-s);r?.(Math.min(95,Math.round(u/s*100)),d??"running",e)}throw new Error("DashScope task timed out")}async generateVideo(e,t,n){let r=Date.now(),s=e.model||"wan2.1-t2v-turbo",i={prompt:e.prompt};if(e.imageUrl)i.img_url=e.imageUrl;else if(e.referenceImages?.length)if(e.imageRoles){let h=e.imageRoles.indexOf("first_frame"),f=e.imageRoles.indexOf("last_frame");h>=0&&(i.img_url=e.referenceImages[h]),f>=0&&(i.tail_image_url=e.referenceImages[f]);let y=e.imageRoles.map((b,k)=>b==="reference_image"?k:-1).filter(b=>b>=0);y.length>0&&(i.ref_image_url=e.referenceImages[y[0]])}else i.img_url=e.referenceImages[0];let a={};e.duration&&(a.duration=e.duration),e.resolution&&(a.resolution=e.resolution),e.aspectRatio&&(a.ratio=e.aspectRatio),e.metadata?.size&&(a.size=e.metadata.size);let l=`${this.baseUrl}/api/v1/services/aigc/generation/generation`,c={model:s,input:i};Object.keys(a).length>0&&(c.parameters=a);let d=await fetch(l,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`,"X-DashScope-Async":"enable"},body:JSON.stringify(c),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!d.ok){let h=await d.text().catch(()=>"");throw new Error(`DashScope video submit error ${d.status}: ${h}`)}let u=await d.json();if(u.code)throw new Error(`DashScope video submit rejected: ${u.code} \u9225?${u.message??""}`);let p=u.output?.task_id;if(!p)throw new Error("DashScope video submit: no task_id in response");return{mediaUrls:await this.pollTask(p,t,n,e.onProgress,6e5),model:s,durationMs:Date.now()-r,taskId:p}}async getTaskStatus(e,t,n){let r=`${this.baseUrl}/api/v1/tasks/${e}`,s=await fetch(r,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let d=await s.text().catch(()=>"");throw new Error(`DashScope task status error ${s.status}: ${d}`)}let i=await s.json(),l=i.output?.task_status??"unknown";return{status:l==="SUCCEEDED"?"succeeded":l==="FAILED"?"failed":l.toLowerCase(),task:i}}async listVideoTasks(e,t,n){let r=new URLSearchParams;r.set("page_size",String(t?.limit??20)),t?.status&&r.set("status",t.status.toUpperCase());let s=`${this.baseUrl}/api/v1/tasks?${r.toString()}`,i=await fetch(s,{method:"GET",headers:{Authorization:`Bearer ${e}`},signal:n??AbortSignal.timeout(this.timeoutMs)});return i.ok?await i.json():{data:[]}}async deleteVideoTask(e,t,n){throw new Error("DashScope does not support task cancellation.")}extractMediaUrl(e){if(e.output?.video_url)return e.output.video_url;if(e.output?.audio_url)return e.output.audio_url;if(e.output?.results?.[0]?.url)return e.output.results[0].url}}});import{writeFileSync as MS,mkdirSync as OS}from"node:fs";import{join as ku}from"node:path";import{randomUUID as DS}from"node:crypto";function US(o,e){return/^(https?:|data:)/i.test(o)?o:`data:${typeof e?.mimeType=="string"?e.mimeType:"application/pdf"};base64,${o}`}var LS,NS,Nr,$S,xo,vu=N(()=>{"use strict";Un();LS=18e4,NS=3e3,Nr=6e5,$S=new Set(["glm-image"]),xo=class{supportedTypes=["image","video","tts","stt","embedding","voice_clone","document_parsing","rerank"];baseUrl;timeoutMs;constructor(e){this.baseUrl=e.baseUrl.replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??LS}async generate(e,t,n){switch(e.mediaType){case"image":return this.generateImage(e,t,n);case"video":return this.generateVideo(e,t,n);case"tts":return this.generateTTS(e,t,n);case"stt":return this.generateSTT(e,t,n);case"embedding":return this.generateEmbedding(e,t,n);case"voice_clone":return this.generateVoiceClone(e,t,n);case"document_parsing":return this.generateDocumentParsing(e,t,n);case"rerank":return this.generateRerank(e,t,n);default:throw new Error(`ZhipuMediaTransport: unsupported mediaType "${e.mediaType}"`)}}async generateImage(e,t,n){return $S.has(e.model)?this.generateImageAsync(e,t,n):this.generateImageSync(e,t,n)}async generateImageSync(e,t,n){let r=Date.now(),s=`${this.baseUrl}/images/generations`,i={model:e.model,prompt:e.prompt};return e.size&&(i.size=e.size),e.quality&&e.model.startsWith("cogview-4")&&(i.quality=e.quality),{mediaUrls:((await this.postJSON(s,i,t,n)).data??[]).map(d=>d.url).filter(d=>!!d),model:e.model,size:e.size,durationMs:Date.now()-r}}async generateImageAsync(e,t,n){let r=Date.now(),s=`${this.baseUrl}/async/images/generations`,i={model:e.model,prompt:e.prompt};e.size&&(i.size=e.size),e.quality&&(i.quality=e.quality);let l=(await this.postJSON(s,i,t,n)).id;if(!l)throw new Error("Zhipu async image: no task id in response");return{mediaUrls:((await this.pollAsyncResult(l,t,n,e.onProgress)).data??[]).map(p=>p.url).filter(p=>!!p),model:e.model,size:e.size,durationMs:Date.now()-r}}async generateVideo(e,t,n){let r=Date.now(),s=`${this.baseUrl}/videos/generations`,i={model:e.model,prompt:e.prompt};e.imageUrl&&(i.image_url=e.imageUrl),e.size&&(i.size=e.size),e.duration&&(i.duration=e.duration);let l=(await this.postJSON(s,i,t,n)).id;if(!l)throw new Error("Zhipu video generation: no task id in response");return{mediaUrls:((await this.pollAsyncResult(l,t,n,e.onProgress)).video_result??[]).map(p=>p.url).filter(p=>!!p),model:e.model,durationMs:Date.now()-r}}async generateTTS(e,t,n){let r=Date.now(),s=e.text||e.prompt;if(!s)throw new Error("ZhipuMediaTransport: text or prompt required for TTS");let i=`${this.baseUrl}/audio/speech`,a={model:e.model||"glm-tts",input:s};e.voice&&(a.voice=e.voice),e.speed!==void 0&&(a.speed=e.speed),e.audioFormat&&(a.response_format=e.audioFormat);let l=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify(a),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!l.ok){let h=await l.text().catch(()=>"");throw new Error(`Zhipu TTS API error ${l.status}: ${h}`)}let c=Buffer.from(await l.arrayBuffer()),d=ku(Ft(),"tts");OS(d,{recursive:!0});let u=e.audioFormat??"wav",p=`zhipu-tts-${DS()}.${u}`,m=ku(d,p);return MS(m,c),{mediaUrls:[`file://${m}`],model:e.model||"glm-tts",durationMs:Date.now()-r,billingUnit:"per_character",billingQuantity:s.length}}async generateSTT(e,t,n){let r=Date.now();if(!e.audioUrl)throw new Error("ZhipuMediaTransport: audioUrl required for STT");let s=`${this.baseUrl}/audio/transcriptions`,i=await fetch(e.audioUrl,{headers:{"User-Agent":"qlogicagent/1.0"},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!i.ok)throw new Error(`Failed to fetch audio from ${e.audioUrl}`);let a=await i.blob(),l=new FormData;l.append("model",e.model||"glm-asr-2512"),l.append("file",a,"audio.wav");let c=await fetch(s,{method:"POST",headers:{Authorization:`Bearer ${t}`},body:l,signal:n??AbortSignal.timeout(this.timeoutMs)});if(!c.ok){let u=await c.text().catch(()=>"");throw new Error(`Zhipu STT API error ${c.status}: ${u}`)}let d=await c.json();return{mediaUrls:[],model:e.model||"glm-asr-2512",durationMs:Date.now()-r,metadata:{transcription:d.text??""}}}async generateEmbedding(e,t,n){let r=Date.now(),s=e.text||e.prompt;if(!s)throw new Error("ZhipuMediaTransport: text or prompt required for embedding");let i=`${this.baseUrl}/embeddings`,a={model:e.model||"embedding-3",input:s},c=(await this.postJSON(i,a,t,n)).data??[];return{mediaUrls:[],model:e.model||"embedding-3",durationMs:Date.now()-r,metadata:{embeddings:c.map(d=>d.embedding).filter(Boolean)}}}async generateVoiceClone(e,t,n){let r=Date.now();if(!e.audioUrl)throw new Error("ZhipuMediaTransport: audioUrl required for voice_clone (sample audio)");let s=e.text||e.prompt;if(!s)throw new Error("ZhipuMediaTransport: text or prompt required for voice_clone preview input");let i=await fetch(e.audioUrl,{signal:n??AbortSignal.timeout(this.timeoutMs)});if(!i.ok)throw new Error(`Failed to fetch audio sample from ${e.audioUrl}`);let a=await i.blob(),l=new FormData;l.append("purpose","voice-clone-input"),l.append("file",a,"sample.wav");let c=await fetch(`${this.baseUrl}/files`,{method:"POST",headers:{Authorization:`Bearer ${t}`},body:l,signal:n??AbortSignal.timeout(this.timeoutMs)});if(!c.ok){let m=await c.text().catch(()=>"");throw new Error(`Zhipu Voice Clone file upload error ${c.status}: ${m}`)}let d=await c.json();if(d.error)throw new Error(`Zhipu Voice Clone file upload rejected: ${d.error.code??""}: ${d.error.message??""}`);if(!d.id)throw new Error("Zhipu Voice Clone file upload: no file id in response");let u={model:e.model||"glm-tts-clone",voice_name:String(e.metadata?.voiceName??`qlogic_clone_${Date.now()}`),input:s,file_id:d.id,text:typeof e.metadata?.sampleText=="string"?e.metadata.sampleText:void 0},p=await this.postJSON(`${this.baseUrl}/voice/clone`,u,t,n);if(p.error)throw new Error(`Zhipu Voice Clone rejected: ${p.error.code??""}: ${p.error.message??""}`);return{mediaUrls:[],model:e.model||"glm-tts-clone",durationMs:Date.now()-r,metadata:{voiceId:p.voice,previewFileId:p.file_id,previewFilePurpose:p.file_purpose,requestId:p.request_id,sampleFileId:d.id}}}async generateDocumentParsing(e,t,n){let r=Date.now(),s=e.imageUrl||e.audioUrl||e.prompt;if(!s)throw new Error("ZhipuMediaTransport: imageUrl/audioUrl or prompt (data URL) required for document_parsing");let i=`${this.baseUrl}/layout_parsing`,a={model:e.model||"glm-ocr",file:US(s,e.metadata)};e.metadata?.returnCropImages!==void 0&&(a.return_crop_images=e.metadata.returnCropImages),e.metadata?.needLayoutVisualization!==void 0&&(a.need_layout_visualization=e.metadata.needLayoutVisualization),e.metadata?.startPageId!==void 0&&(a.start_page_id=e.metadata.startPageId),e.metadata?.endPageId!==void 0&&(a.end_page_id=e.metadata.endPageId);let c=await this.postJSON(i,a,t,n);return{mediaUrls:[],model:e.model||"glm-ocr",durationMs:Date.now()-r,metadata:{content:c.md_results??"",mdResults:c.md_results??"",layoutDetails:c.layout_details,layoutVisualization:c.layout_visualization,dataInfo:c.data_info,pages:c.data_info?.pages??[],pageCount:c.data_info?.num_pages??c.data_info?.pages?.length??0,usage:c.usage,requestId:c.request_id}}}async generateRerank(e,t,n){let r=Date.now(),s=e.prompt;if(!s)throw new Error("ZhipuMediaTransport: prompt (query) required for rerank");if(!e.metadata?.documents)throw new Error("ZhipuMediaTransport: metadata.documents required for rerank");let i=`${this.baseUrl}/rerank`,a={model:e.model||"rerank",query:s,documents:e.metadata.documents};e.metadata.topN!==void 0&&(a.top_n=e.metadata.topN);let l=await this.postJSON(i,a,t,n);return{mediaUrls:[],model:e.model||"rerank",durationMs:Date.now()-r,metadata:{results:(l.results??[]).map(c=>({index:c.index,relevanceScore:c.relevance_score,document:c.document}))}}}async postJSON(e,t,n,r){let s=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`},body:JSON.stringify(t),signal:r??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let i=await s.text().catch(()=>"");throw new Error(`Zhipu API error ${s.status}: ${i}`)}return s.json()}async pollAsyncResult(e,t,n,r){let s=Date.now()+Nr,i=`${this.baseUrl}/async-result/${encodeURIComponent(e)}`;for(;Date.now()<s;){n?.throwIfAborted();let a=await fetch(i,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!a.ok){let d=await a.text().catch(()=>"");throw new Error(`Zhipu async-result error ${a.status}: ${d}`)}let l=await a.json();if(l.task_status==="SUCCESS")return r?.(100,"completed",e),l;if(l.task_status==="FAIL")throw new Error("Zhipu async task failed");let c=Date.now()-(s-Nr);r?.(Math.min(95,Math.round(c/Nr*100)),l.task_status??"running",e),await new Promise(d=>setTimeout(d,NS))}throw new Error(`Zhipu async task timed out after ${Nr/1e3}s`)}async getTaskStatus(e,t,n){let r=`${this.baseUrl}/async-result/${encodeURIComponent(e)}`,s=await fetch(r,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let c=await s.text().catch(()=>"");throw new Error(`Zhipu task query error ${s.status}: ${c}`)}let i=await s.json(),a=i.task_status??"unknown";return{status:a==="SUCCESS"?"succeeded":a==="FAIL"?"failed":a==="PROCESSING"?"running":a.toLowerCase(),task:i}}async listVideoTasks(e,t,n){return{data:[]}}async deleteVideoTask(e,t,n){throw new Error("Zhipu does not support task cancellation. Tasks complete or timeout automatically.")}async listVoices(e,t){let n=`${this.baseUrl}/voice/list`,r=await fetch(n,{method:"GET",headers:{Authorization:`Bearer ${e}`},signal:t??AbortSignal.timeout(this.timeoutMs)});if(!r.ok){let i=await r.text().catch(()=>"");throw new Error(`Zhipu voice list error ${r.status}: ${i}`)}return((await r.json()).voice_list??[]).map(i=>({voice_id:i.voice_id??i.voice??"",voice_name:i.voice_name??"",status:i.status??""}))}async deleteVoice(e,t,n){let r=`${this.baseUrl}/voice/delete`,s=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify({voice:e}),signal:n??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let i=await s.text().catch(()=>"");throw new Error(`Zhipu voice delete error ${s.status}: ${i}`)}}}});function jS(o){switch(o.mediaType){case"video":return o.operation==="merge"?"merge":o.operation==="upscale"?"upscale":o.operation==="edit"?"edit":o.imageUrl?"img2video":"text2video";case"image":return o.operation==="edit"?"inpainting":o.imageUrl?"img2img":"text2image";case"music":return o.audioUrl?"cover":"text2music";case"music_realtime":return"realtime";case"tts":return"text2speech";case"3d":return o.imageUrl?"img2_3d":"text2_3d";default:return}}function FS(o,e){return!("operations"in o)||!o.operations?!0:o.operations.includes(e)}function BS(o){let e=o.baseUrl;switch(o.id){case"volcengine":return new dt({baseUrl:e});case"openai":return new To({baseUrl:e});case"minimax":return new kn({baseUrl:e});case"google":return new wo({baseUrl:e});case"qwen":return new Lr({baseUrl:e});case"zhipu":return new xo({baseUrl:e.replace(/\/api\/anthropic\/?$/,"/api/paas/v4")});case"zhipu-openai":case"zhipu-coding":return new xo({baseUrl:e.replace(/\/api\/coding\/paas\/v4\/?$/,"/api/paas/v4")});default:return}}var Ro,Su=N(()=>{"use strict";Er();Na();Mr();Fa();bu();vu();Ro=class{registry;transports=new Map;constructor(e){this.registry=e.registry}resolveModelById(e,t,n){let r=this.registry.getProvider(e);if(!r)return;let i=this.registry.listModels(e).find(a=>a.id===t&&a.mediaType===n);if(i)return{providerId:e,providerDef:r,modelInfo:i,mediaType:n}}getTransport(e){let t=this.transports.get(e);if(t)return t;let n=this.registry.getProvider(e);if(!n)return;let r=BS(n);if(r)return this.transports.set(e,r),r}listMediaModels(e){let t=[];for(let n of this.registry.listProviders()){let r=this.registry.listModels(n.id);for(let s of r)s.mediaType&&(!e||s.mediaType===e)&&t.push({providerId:n.id,providerDef:n,modelInfo:s,mediaType:s.mediaType})}return t}findModelInProvider(e,t,n){let r=this.registry.getProvider(e);if(!r)return;let s=this.registry.listModels(e),i=n?jS(n):void 0,a=s.find(l=>l.mediaType!==t?!1:!i||!l.mediaCapabilities?!0:FS(l.mediaCapabilities,i));if(a)return{providerId:e,providerDef:r,modelInfo:a,mediaType:t}}}});var Ba,Wa=N(()=>{"use strict";Ba=[{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 WS,sn,Tu=N(()=>{"use strict";Wa();WS={claude:"anthropic",gemini:"google",doubao:"volcengine"},sn=class{builtins=new Map;overrides=new Map;constructor(){for(let e of Ba)this.builtins.set(e.id,e)}applyOverride(e,t){this.overrides.set(e,{...this.overrides.get(e),...t})}getProvider(e){let t=WS[e]??e,n=this.builtins.get(t),r=this.overrides.get(t);if(!(!n&&!r))return!n&&r?!r.id||!r.transport||!r.baseUrl?void 0:{id:r.id,name:r.name??r.id,transport:r.transport,baseUrl:r.baseUrl,apiKeyEnvVars:r.apiKeyEnvVars??[],authType:r.authType??"bearer",isAggregator:r.isAggregator??!1,defaultModel:r.defaultModel,models:r.models}:n&&!r?n:{...n,...r,models:r.models??n.models}}listProviders(){let e=new Map;for(let[t,n]of this.builtins)e.set(t,n);for(let[t]of this.overrides){let n=this.getProvider(t);n&&e.set(t,n)}return[...e.values()]}listModels(e){return this.getProvider(e)?.models??[]}getModelInfo(e,t){return this.listModels(e).find(n=>n.id===t)}resolveApiKey(e,t){if(t)return t;let n=this.getProvider(e);if(n)for(let r of n.apiKeyEnvVars){let s=process.env[r];if(s?.trim())return s.trim()}}}});function GS(o){if(o)return o==="openai"?"openai-chat":o==="anthropic"?"anthropic-messages":o}function HS(o,e){return wu(o.id,e)?"exact":(o.aliases??[]).some(t=>wu(t,e))?"alias":void 0}function wu(o,e){return o.trim().toLowerCase()===e.trim().toLowerCase()}function VS(o,e){return o.variantKind?o.variantKind:e.mediaType==="realtime_audio"||e.mediaType==="realtime_video"?"realtime":e.mediaType?"media-plan":o.id.includes("coding")||e.id.toLowerCase().includes("coder")||e.id.toLowerCase().includes("codegeex")?"coding-plan":o.transport==="openai-chat"||o.transport==="openai-responses"||o.transport==="volcengine-responses"?"openai-compatible":o.transport==="anthropic-messages"?"anthropic-compatible":"standard"}function KS(o){return o==="coding-plan"||o==="media-plan"?"plan":"paygo"}function zS(o,e){let t=new Set(o.capabilities??[]);return e.reasoning&&t.add("thinking"),e.vision&&t.add("vision"),e.mediaType&&t.add("media"),(e.mediaType==="realtime_audio"||e.mediaType==="realtime_video")&&t.add("realtime"),e.toolCall&&o.quirks?.supportsToolStream&&t.add("tool_stream"),o.quirks?.supportsReasoningSplit&&t.add("reasoning_split"),(o.quirks?.builtinWebSearch||o.quirks?.builtinCodeInterpreter||o.quirks?.builtinUrlContext)&&t.add("builtin_tools"),(o.id.includes("coding")||e.id.toLowerCase().includes("coder")||e.id.toLowerCase().includes("codegeex"))&&t.add("coding"),[...t].sort()}function qS(o){let e=100;return e+=o.matchKind==="exact"?25:15,o.requestedTransport&&o.provider.transport===o.requestedTransport&&(e+=20),e+=o.requiredCapabilities.length*15,o.preferProviderId&&o.provider.id===o.preferProviderId&&(e+=50),o.preferVariantKind&&o.variantKind===o.preferVariantKind&&(e+=35),o.purpose==="textGeneration"&&!o.capabilities.includes("media")&&(e+=5),o.purpose==="imageGeneration"&&o.capabilities.includes("media")&&(e+=10),o.purpose==="videoGeneration"&&o.capabilities.includes("media")&&(e+=10),o.capabilities.includes("tool_stream")&&(e+=8),o.capabilities.includes("reasoning_split")&&(e+=8),o.variantKind==="coding-plan"&&(e+=o.provider.id.includes("coding")?12:5),e}function YS(o){let e=[o.matchKind==="exact"?"model id matched":"public alias matched"];o.requestedTransport&&e.push(`protocol ${o.requestedTransport} matched`);for(let t of o.requiredCapabilities)e.push(`capability ${t} matched`);return o.preferProviderId&&o.provider.id===o.preferProviderId&&e.push("preferred provider matched"),o.preferVariantKind&&o.variantKind===o.preferVariantKind&&e.push("preferred variant matched"),e}var _o,xu=N(()=>{"use strict";_o=class{registry;constructor(e){this.registry=e}resolve(e){let t=e.publicModel.trim();if(!t)return[];let n=e.userPreference?.providerIds?new Set(e.userPreference.providerIds):void 0,r=GS(e.requestedProtocol),s=e.capabilities??[],i=[];for(let a of this.registry.listProviders())if(!(n&&!n.has(a.id))&&!(r&&a.transport!==r))for(let l of this.registry.listModels(a.id)){let c=HS(l,t);if(!c)continue;let d=zS(a,l);if(s.some(f=>!d.includes(f)))continue;let u=VS(a,l),p=a.billingChannelKind??KS(u),m=YS({matchKind:c,requestedTransport:r,requiredCapabilities:s,preferProviderId:e.userPreference?.preferProviderId,preferVariantKind:e.userPreference?.preferVariantKind,purpose:e.purpose,provider:a,variantKind:u,capabilities:d}),h=qS({matchKind:c,requestedTransport:r,requiredCapabilities:s,preferProviderId:e.userPreference?.preferProviderId,preferVariantKind:e.userPreference?.preferVariantKind,purpose:e.purpose,provider:a,variantKind:u,capabilities:d});i.push({provider:a.id,group:a.group??a.id,publicModel:t,nativeModelId:l.id,displayName:l.name,transport:a.transport,variantKind:u,billingChannelKind:p,capabilities:d,score:h,reasons:m,providerDef:a,modelInfo:l})}return i.sort((a,l)=>l.score!==a.score?l.score-a.score:a.group!==l.group?a.group.localeCompare(l.group):a.provider.localeCompare(l.provider))}resolveBest(e){return this.resolve(e)[0]}}});var jn=N(()=>{"use strict"});function JS(o){let e=o.slice(o.lastIndexOf(".")).toLowerCase();return XS[e]||"application/octet-stream"}function ZS(o){return QS.test(o)}async function Ru(o,e,t,n){if(o.startsWith("data:")||!ZS(o))return o;let r=await fetch(o,{signal:n});if(!r.ok)throw new Error(`Failed to fetch local media ${o}: ${r.status}`);let s=Buffer.from(await r.arrayBuffer()),i=eT(o),a=r.headers.get("content-type")||JS(i);return(await e.uploadFile(s,i,a,t,n)).url}function eT(o){try{let t=new URL(o).pathname.split("/").pop();return t&&t.includes(".")?t:"upload"}catch{return"upload"}}var XS,QS,_u=N(()=>{"use strict";XS={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".svg":"image/svg+xml",".bmp":"image/bmp",".avif":"image/avif",".heic":"image/heic",".mp4":"video/mp4",".webm":"video/webm",".mov":"video/quicktime",".avi":"video/x-msvideo",".mkv":"video/x-matroska",".mp3":"audio/mpeg",".wav":"audio/wav",".ogg":"audio/ogg",".aac":"audio/aac",".flac":"audio/flac",".m4a":"audio/mp4",".opus":"audio/opus",".pdf":"application/pdf",".doc":"application/msword",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document",".xls":"application/vnd.ms-excel",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".ppt":"application/vnd.ms-powerpoint",".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation",".txt":"text/plain",".csv":"text/csv",".json":"application/json"};QS=/^https?:\/\/(127\.0\.0\.1|localhost|0\.0\.0\.0|\[::1\])(:\d+)?/i});function z(o){return tT.test(o)}async function ut(o,e){return Ru(o,e.uploadAdapter,e.apiKey,e.signal)}async function $r(o,e){if(o.startsWith("data:")||!z(o))return o;let t=await fetch(o);if(!t.ok)throw new Error(`Failed to fetch local media ${o}: ${t.status}`);let n=Buffer.from(await t.arrayBuffer());if(n.byteLength>nT)throw new Error(`Local media too large for base64 (${(n.byteLength/1024/1024).toFixed(1)}MB). Use file upload API instead.`);return`data:${t.headers.get("content-type")||e||oT(o)};base64,${n.toString("base64")}`}function oT(o){let e=o.split("?")[0].split("#")[0],t=e.slice(e.lastIndexOf(".")).toLowerCase();return{".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".svg":"image/svg+xml",".bmp":"image/bmp",".avif":"image/avif",".heic":"image/heic",".mp4":"video/mp4",".webm":"video/webm",".mov":"video/quicktime",".mp3":"audio/mpeg",".wav":"audio/wav",".ogg":"audio/ogg",".aac":"audio/aac",".flac":"audio/flac",".m4a":"audio/mp4",".opus":"audio/opus",".pdf":"application/pdf"}[t]||"application/octet-stream"}var tT,nT,Fn=N(()=>{"use strict";_u();tT=/^https?:\/\/(127\.0\.0\.1|localhost|0\.0\.0\.0|\[::1\])(:\d+)?/i;nT=20*1024*1024});function At(o){let e=Math.min(1e3*Math.pow(2,o-1),3e4),t=Math.random()*.25*e;return e+t}function Bt(o){return o!=null&&Ga.has(o)}function Pt(o,e){return new Promise((t,n)=>{if(e?.aborted){n(new Error("Request aborted"));return}let r=setTimeout(t,o);e&&e.addEventListener("abort",()=>{clearTimeout(r),n(new Error("Request aborted"))},{once:!0})})}function Wt(o){if(o&&typeof o=="object"){let e=o;if(typeof e.status=="number")return e.status;if(typeof e.statusCode=="number")return e.statusCode;if(e.response&&typeof e.response.status=="number")return e.response.status}return null}var Ga,_t,Bn=N(()=>{"use strict";Ga=new Set([429,529,502,503,504]),_t=9e4});function Ao(o){return o.toLowerCase().startsWith("gpt-5")}function Ur(o){return o.toLowerCase().includes("5.4-nano")}function Po(o){return/^o[1-4](-|$)/.test(o.toLowerCase())}var Ha=N(()=>{"use strict"});function rT(o){switch(o){case"sensitive":return"content_filter";case"model_context_window_exceeded":return"length";case"network_error":return"error";default:return o}}async function sT(o,e,t,n){return o.some(s=>s.audioUrls?.some(z)||s.imageUrls?.some(z))?Promise.all(o.map(async s=>{if(s.role!=="user"&&s.role!=="tool")return s;let i={};if(s.role==="user"&&s.audioUrls?.some(z)&&(i.audioUrls=await Promise.all(s.audioUrls.map(a=>z(a)?$r(a):Promise.resolve(a)))),s.imageUrls?.some(z)){if(!e||!t)throw new Error("FileUploadAdapter required for local image URLs. Configure OSS_ACCESS_KEY_ID/OSS_ACCESS_KEY_SECRET or QLOGICAGENT_HUB_URL.");i.imageUrls=await Promise.all(s.imageUrls.map(a=>z(a)?ut(a,{uploadAdapter:e,apiKey:t,signal:n}):Promise.resolve(a)))}return Object.keys(i).length>0?{...s,...i}:s})):o}function iT(o,e){return o.map(t=>{if(t.role==="user"){let n=t.imageUrls&&t.imageUrls.length>0&&!e.filterImageBlocks,r=t.videoUrls&&t.videoUrls.length>0,s=t.audioUrls&&t.audioUrls.length>0,i=t.fileIds&&t.fileIds.length>0;if(n||r||s||i){let l=[];if(t.content&&l.push({type:"text",text:t.content}),n){let c=t.imageUrls.length>1;for(let d=0;d<t.imageUrls.length;d++){let u=t.imageUrls[d];c&&l.push({type:"text",text:`[Image ${d+1}]`});let p={url:u};t.imageDetail&&(p.detail=t.imageDetail),l.push({type:"image_url",image_url:p})}}if(r)for(let c of t.videoUrls)l.push({type:"video_url",video_url:{url:c}});if(s)for(let c of t.audioUrls){let d=c,u=t.audioFormat??"mp3";if(c.startsWith("data:")){let p=/^data:audio\/([^;]+);base64,(.+)$/.exec(c);p&&(u=p[1]==="mpeg"?"mp3":p[1],d=p[2])}l.push({type:"input_audio",input_audio:{data:d,format:u}})}if(i)for(let c of t.fileIds){let d=c.mimeType||"";if(c.size!=null&&c.size>52428800){let p=`${(c.size/1048576).toFixed(1)}MB`;l.push({type:"text",text:`[Attached: ${c.id} (${d||"unknown"}, ${p})file too large for direct vision, use tools to process]`})}else if(e.supportsDocumentVision&&(d==="application/pdf"||c.id.endsWith(".pdf")))c.id.startsWith("http://")||c.id.startsWith("https://")?l.push({type:"text",text:`[Attached PDF: ${c.id}]`}):l.push({type:"file",file:{file_id:c.id}});else if(c.id.startsWith("http://")||c.id.startsWith("https://")){let p=d?`[Attached: ${c.id} (${d})]`:`[Attached: ${c.id}]`;l.push({type:"text",text:p})}else l.push({type:"file",file:{file_id:c.id}})}return{role:"user",content:l}}return{role:"user",content:t.content??""}}if(t.role==="assistant"){let n={role:"assistant"};return t.thinkingBlocks&&t.thinkingBlocks.length>0&&(n.reasoning_content=t.thinkingBlocks.map(r=>r.thinking).join("")),n.content=t.content??null,t.tool_calls&&t.tool_calls.length>0&&(n.tool_calls=t.tool_calls.map(r=>({id:r.id,type:r.type,function:{name:r.function.name,arguments:r.function.arguments}}))),n}if(t.role==="tool"){if(t.imageUrls&&t.imageUrls.length>0&&!e.filterImageBlocks){let n=[];t.content&&n.push({type:"text",text:t.content});for(let r of t.imageUrls)n.push({type:"image_url",image_url:{url:r}});return{role:"tool",content:n,tool_call_id:t.tool_call_id??""}}return{role:"tool",content:t.content??"",tool_call_id:t.tool_call_id??""}}return{role:t.role,content:t.content??""}})}var Wn,Va=N(()=>{"use strict";jn();Fn();Bn();Ha();Wn=class{baseUrl;extraHeaders;timeoutMs;supportsStreamOptions;omitZeroTemperature;quirks;fileUploadAdapter;cumulativeReasoningLen=0;cumulativeContentLen=0;constructor(e){if(!e.baseUrl)throw new Error("OpenAIChatTransport: baseUrl is required (got empty or undefined)");this.baseUrl=e.baseUrl.replace(/\/+$/,""),this.extraHeaders=e.extraHeaders??{},this.timeoutMs=e.timeoutMs??18e4,this.supportsStreamOptions=e.supportsStreamOptions??!0,this.omitZeroTemperature=e.omitZeroTemperature??!1,this.quirks=e.quirks??{},this.fileUploadAdapter=e.fileUploadAdapter}async*stream(e,t,n){this.cumulativeReasoningLen=0,this.cumulativeContentLen=0;let r=e.prefixMessage&&this.quirks.supportsPrefixCompletion,s=/\/v\d+$/.test(this.baseUrl),i;r?i=`${this.baseUrl}/beta/v1/chat/completions`:s?i=`${this.baseUrl}/chat/completions`:i=`${this.baseUrl}/v1/chat/completions`;let a={model:e.model,messages:iT(await sT(e.messages,this.fileUploadAdapter,t,n),this.quirks),stream:!0};this.supportsStreamOptions&&(a.stream_options={include_usage:!0}),e.tools&&e.tools.length>0&&(a.tools=e.tools,e.toolChoice&&(a.tool_choice=e.toolChoice));let l=!e.disableBuiltinTools,c=!1;if(l&&this.quirks.builtinWebSearch&&a.tools){let f=a.tools;this.quirks.builtinCodeInterpreter?f.push({type:"web_search",web_search:{enable:!0,search_result:!0}}):(f.push({type:"builtin_function",function:{name:"$web_search"}}),c=!0)}l&&this.quirks.builtinCodeInterpreter&&a.tools&&a.tools.push({type:"code_interpreter",code_interpreter:{sandbox:"none"}}),this.quirks.supportsToolStream&&a.tools&&(a.tool_stream=!0);let d=this.quirks.useEffortInsteadOfBudget&&!!e.reasoning,u=e.model.startsWith("kimi-k2.6"),p=Ao(e.model);if(e.temperature!==void 0&&(this.omitZeroTemperature&&e.temperature===0||(p||!Po(e.model)&&!d&&!u)&&(a.temperature=e.temperature)),e.topP!==void 0&&(p||!Po(e.model)&&!d&&!u)&&(a.top_p=e.topP),e.maxTokens!==void 0&&(p||Po(e.model)||e.model.startsWith("kimi-k2")?a.max_completion_tokens=e.maxTokens:a.max_tokens=e.maxTokens),e.reasoning)if(p){let f=e.reasoning.effort==="minimal"?"none":e.reasoning.effort;Ur(e.model)&&(f==="high"||f==="xhigh")&&(f="medium"),a.reasoning={effort:f}}else if(Po(e.model))a.reasoning_effort=e.reasoning.effort;else if(this.quirks.useEffortInsteadOfBudget){a.thinking={type:"enabled"};let f=this.quirks.maxReasoningEffort??"high",y=e.reasoning.effort??"high";a.reasoning_effort=y==="low"||y==="medium"?"high":f}else this.quirks.supportsThinkingParam?(c?a.thinking={type:"disabled"}:this.quirks.supportsToolStream?a.thinking={type:"enabled",clear_thinking:!1}:a.thinking={type:"enabled"},this.quirks.supportsReasoningEffort&&(a.reasoning_effort=e.reasoning.effort)):this.quirks.supportsReasoningEffort?a.reasoning_effort=e.reasoning.effort:a.reasoning=e.reasoning;else c?a.thinking={type:"disabled"}:this.quirks.supportsThinkingParam&&this.quirks.disableThinkingByDefault&&(a.thinking={type:"disabled"});e.structuredOutput&&(e.structuredOutput.mode==="json_object"?a.response_format={type:"json_object"}:e.structuredOutput.mode==="json_schema"&&(a.response_format={type:"json_schema",json_schema:{name:e.structuredOutput.name,strict:e.structuredOutput.strict??!0,schema:e.structuredOutput.schema}})),this.quirks.supportsReasoningSplit&&e.reasoning&&(a.reasoning_split=!0),e.prediction&&p&&(a.prediction=e.prediction),r&&e.prefixMessage&&a.messages.push({role:"assistant",content:e.prefixMessage,prefix:!0});let m={"Content-Type":"application/json",Authorization:`Bearer ${t}`,...this.extraHeaders},h=null;for(let f=0;f<=2;f++){if(n?.aborted)throw new Error("Request aborted");f>0&&h&&await Pt(At(f),n);try{yield*this.fetchAndStream(i,m,a,n);return}catch(y){h=y instanceof Error?y:new Error(String(y));let b=h.message.includes("Stream idle timeout");if(!Bt(Wt(h))&&!b||f===2)throw h}}}async*fetchAndStream(e,t,n,r){let s=AbortSignal.timeout(this.timeoutMs),i=r?AbortSignal.any([r,s]):s,a=await fetch(e,{method:"POST",headers:t,body:JSON.stringify(n),signal:i});if(!a.ok){let c=await a.text().catch(()=>""),d=new Error(`LLM API error ${a.status}: ${c.slice(0,500)}`);throw d.status=a.status,d}if(!a.body)throw new Error("LLM API returned no response body");let l=a.headers.get("content-type")??"";if(l.includes("application/json")&&!l.includes("text/event-stream")){yield*this.handleNonStreamingResponse(a);return}yield*this.parseSSEStreamWithWatchdog(a.body)}async*handleNonStreamingResponse(e){let t=await e.json();t.usage&&(yield{type:"usage",promptTokens:t.usage.prompt_tokens??0,completionTokens:t.usage.completion_tokens??0,reasoningTokens:t.usage.completion_tokens_details?.reasoning_tokens,cacheReadTokens:t.usage.prompt_tokens_details?.cached_tokens});for(let n of t.choices??[]){let r=n.message;if(r){if(r.reasoning_content&&(yield{type:"reasoning_delta",text:r.reasoning_content}),r.content&&(yield{type:"delta",text:r.content}),r.tool_calls)for(let s=0;s<r.tool_calls.length;s++){let i=r.tool_calls[s];yield{type:"tool_call_delta",index:s,id:i.id,name:i.function.name,arguments:i.function.arguments}}n.finish_reason&&(yield{type:"done",finishReason:n.finish_reason})}}}async*parseSSEStreamWithWatchdog(e){let t=new TextDecoder,n="",r=null,s=new AbortController,i=()=>{r&&clearTimeout(r),r=setTimeout(()=>{s.abort()},_t)};try{i();let a=e.getReader();try{for(;;){let{done:l,value:c}=await a.read();if(l)break;if(s.signal.aborted)throw new Error("Stream idle timeout");i(),n+=t.decode(c,{stream:!0});let d;for(;(d=n.indexOf(`
|
|
16
16
|
`))!==-1;){let u=n.slice(0,d).trim();if(n=n.slice(d+1),!u||u.startsWith(":")||!u.startsWith("data: "))continue;let p=u.slice(6);if(p==="[DONE]")return;let m;try{m=JSON.parse(p)}catch{continue}yield*this.processChunk(m)}}}finally{a.releaseLock()}}finally{r&&clearTimeout(r)}}*processChunk(e){if(e.usage&&(yield{type:"usage",promptTokens:e.usage.prompt_tokens??0,completionTokens:e.usage.completion_tokens??0,reasoningTokens:e.usage.completion_tokens_details?.reasoning_tokens,cacheReadTokens:e.usage.prompt_tokens_details?.cached_tokens}),!(!e.choices||e.choices.length===0))for(let t of e.choices){let n=t.delta;if(n){if(n.reasoning_content&&(yield{type:"reasoning_delta",text:n.reasoning_content}),n.reasoning_details){let r=n.reasoning_details.slice(this.cumulativeReasoningLen);r&&(this.cumulativeReasoningLen=n.reasoning_details.length,yield{type:"reasoning_delta",text:r})}if(n.content)if(this.quirks.supportsReasoningSplit){let r=n.content.slice(this.cumulativeContentLen);r&&(this.cumulativeContentLen=n.content.length,yield{type:"delta",text:r})}else yield{type:"delta",text:n.content};if(n.tool_calls)for(let r of n.tool_calls)yield{type:"tool_call_delta",index:r.index,id:r.id,name:r.function?.name,arguments:r.function?.arguments??""};t.finish_reason&&(yield{type:"done",finishReason:rT(t.finish_reason)})}}}async*complete(e,t,n){if(!this.quirks.supportsPrefixCompletion)throw new Error("FIM completion is not supported by this provider");let s=/\/v\d+$/.test(this.baseUrl)?`${this.baseUrl}/beta/completions`:`${this.baseUrl}/beta/v1/completions`,i={model:e.model,prompt:e.prompt,stream:!0,max_tokens:e.maxTokens??4096};e.suffix&&(i.suffix=e.suffix),e.temperature!==void 0&&(i.temperature=e.temperature),e.stop&&(i.stop=e.stop);let a={"Content-Type":"application/json",Authorization:`Bearer ${t}`,...this.extraHeaders},l=AbortSignal.timeout(this.timeoutMs),c=n?AbortSignal.any([n,l]):l,d=await fetch(s,{method:"POST",headers:a,body:JSON.stringify(i),signal:c});if(!d.ok){let h=await d.text().catch(()=>"");throw new Error(`FIM API error ${d.status}: ${h.slice(0,500)}`)}if(!d.body)throw new Error("FIM API returned no response body");let u=new TextDecoder,p="",m=d.body.getReader();try{for(;;){let{done:h,value:f}=await m.read();if(h)break;p+=u.decode(f,{stream:!0});let y;for(;(y=p.indexOf(`
|
|
17
17
|
`))!==-1;){let b=p.slice(0,y).trim();if(p=p.slice(y+1),!b||b.startsWith(":")||!b.startsWith("data: "))continue;let k=b.slice(6);if(k==="[DONE]")return;let x;try{x=JSON.parse(k)}catch{continue}for(let I of x.choices??[])I.text&&(yield{type:"delta",text:I.text}),I.finish_reason&&(yield{type:"done",finishReason:I.finish_reason})}}}finally{m.releaseLock()}}async uploadFile(e,t,n,r,s){let a=/\/v\d+$/.test(this.baseUrl)?`${this.baseUrl}/files`:`${this.baseUrl}/v1/files`,l=new FormData;l.append("file",e,t),l.append("purpose",n);let c=await fetch(a,{method:"POST",headers:{Authorization:`Bearer ${r}`,...this.extraHeaders},body:l,signal:s??AbortSignal.timeout(this.timeoutMs)});if(!c.ok){let u=await c.text().catch(()=>"");throw new Error(`File upload error ${c.status}: ${u}`)}let d=await c.json();return{fileId:d.id??"",filename:d.filename??t,bytes:d.bytes??0}}async getFileInfo(e,t,n){let s=/\/v\d+$/.test(this.baseUrl)?`${this.baseUrl}/files/${encodeURIComponent(e)}`:`${this.baseUrl}/v1/files/${encodeURIComponent(e)}`,i=await fetch(s,{method:"GET",headers:{Authorization:`Bearer ${t}`,...this.extraHeaders},signal:n??AbortSignal.timeout(this.timeoutMs)});if(!i.ok){let l=await i.text().catch(()=>"");throw new Error(`File info error ${i.status}: ${l}`)}let a=await i.json();return{id:a.id??e,filename:a.filename??"",bytes:a.bytes??0,status:a.status??"unknown"}}}});async function aT(o,e,t,n){return o.some(s=>s.audioUrls?.some(z)||s.imageUrls?.some(z))?Promise.all(o.map(async s=>{if(s.role!=="user"&&s.role!=="tool")return s;let i={};if(s.role==="user"&&s.audioUrls?.some(z)&&(i.audioUrls=await Promise.all(s.audioUrls.map(a=>z(a)?$r(a):Promise.resolve(a)))),s.imageUrls?.some(z)){if(!e||!t)throw new Error("FileUploadAdapter required for local image URLs. Configure OSS_ACCESS_KEY_ID/OSS_ACCESS_KEY_SECRET or QLOGICAGENT_HUB_URL.");i.imageUrls=await Promise.all(s.imageUrls.map(a=>z(a)?ut(a,{uploadAdapter:e,apiKey:t,signal:n}):Promise.resolve(a)))}return Object.keys(i).length>0?{...s,...i}:s})):o}function lT(o,e={}){let t=[];for(let n of o){if(n.role==="system"){t.push({role:"developer",content:n.content??""});continue}if(n.role==="user"){let r=n.imageUrls&&n.imageUrls.length>0,s=n.videoUrls&&n.videoUrls.length>0,i=n.audioUrls&&n.audioUrls.length>0,a=n.fileIds&&n.fileIds.length>0;if(r||s||i||a){let c=[];if(r){let d=n.imageUrls.length>1;for(let u=0;u<n.imageUrls.length;u++){let p=n.imageUrls[u];d&&c.push({type:"input_text",text:`[Image ${u+1}]`});let m={type:"input_image",image_url:p};n.imageDetail&&(m.detail=n.imageDetail),c.push(m)}}if(s)for(let d of n.videoUrls)c.push({type:"input_video",video_url:d});if(i)for(let d of n.audioUrls){let u=d,p=n.audioFormat??"mp3";if(d.startsWith("data:")){let m=/^data:audio\/([^;]+);base64,(.+)$/.exec(d);m&&(p=m[1]==="mpeg"?"mp3":m[1],u=m[2])}c.push({type:"input_audio",data:u,format:p})}if(a)for(let d of n.fileIds){let u=d.mimeType||"";if(d.size!=null&&d.size>52428800){let m=`${(d.size/1048576).toFixed(1)}MB`;c.push({type:"input_text",text:`[Attached: ${d.id} (${u||"unknown"}, ${m}) \u2014 file too large for direct vision, use tools to process]`})}else if(e.supportsDocumentVision&&(u==="application/pdf"||d.id.endsWith(".pdf")))d.id.startsWith("http://")||d.id.startsWith("https://")?c.push({type:"input_text",text:`[Attached PDF: ${d.id}]`}):c.push({type:"input_file",file_id:d.id});else if(d.id.startsWith("http://")||d.id.startsWith("https://")){let m=u?`[Attached: ${d.id} (${u})]`:`[Attached: ${d.id}]`;c.push({type:"input_text",text:m})}else c.push({type:"input_file",file_id:d.id})}n.content&&c.push({type:"input_text",text:n.content}),t.push({role:"user",content:c})}else t.push({role:"user",content:n.content??""});continue}if(n.role==="assistant"){if(n.content&&t.push({role:"assistant",content:n.content}),n.tool_calls&&n.tool_calls.length>0)for(let r of n.tool_calls)t.push({type:"function_call",call_id:r.id,name:r.function.name,arguments:r.function.arguments});continue}if(n.role==="tool"){if(!n.tool_call_id)continue;if(n.imageUrls&&n.imageUrls.length>0){let r=[];n.content&&r.push({type:"input_text",text:n.content});for(let s of n.imageUrls)r.push({type:"input_image",image_url:s});t.push({type:"function_call_output",call_id:n.tool_call_id,output:r})}else t.push({type:"function_call_output",call_id:n.tool_call_id,output:n.content??""});continue}}return t}var jr,Au=N(()=>{"use strict";jn();Fn();Bn();Ha();jr=class{baseUrl;extraHeaders;timeoutMs;quirks;fileUploadAdapter;constructor(e){if(!e.baseUrl)throw new Error("OpenAIResponsesTransport: baseUrl is required");this.baseUrl=e.baseUrl.replace(/\/+$/,""),this.extraHeaders=e.extraHeaders??{},this.timeoutMs=e.timeoutMs??18e4,this.quirks=e.quirks??{},this.fileUploadAdapter=e.fileUploadAdapter}async*stream(e,t,n){let s=/\/v\d+$/.test(this.baseUrl)?`${this.baseUrl}/responses`:`${this.baseUrl}/v1/responses`,i=await this.buildRequestBody(e,t,n),a={"Content-Type":"application/json",Authorization:`Bearer ${t}`,...this.extraHeaders},l=null;for(let c=0;c<=2;c++){if(n?.aborted)throw new Error("Request aborted");c>0&&l&&await Pt(At(c),n);try{yield*this.fetchAndStream(s,a,i,n);return}catch(d){l=d instanceof Error?d:new Error(String(d));let u=l.message.includes("Stream idle timeout");if(!Bt(Wt(l))&&!u||c===2)throw l}}}async buildRequestBody(e,t,n){let r={model:e.model,input:lT(await aT(e.messages,this.fileUploadAdapter,t,n),this.quirks),stream:!0};e.conversationId?r.conversation=e.conversationId:e.previousResponseId&&(r.previous_response_id=e.previousResponseId),e.store!==void 0&&(r.store=e.store),e.instructions&&(r.instructions=e.instructions),e.structuredOutput&&(e.structuredOutput.mode==="json_object"?r.text={format:{type:"json_object"}}:r.text={format:{type:"json_schema",name:e.structuredOutput.name,strict:e.structuredOutput.strict??!0,schema:e.structuredOutput.schema}}),e.tools&&e.tools.length>0&&(r.tools=e.tools.map(i=>({type:"function",name:i.function.name,description:i.function.description,parameters:i.function.parameters,strict:!0}))),e.toolChoice!==void 0&&(typeof e.toolChoice=="string"?r.tool_choice=e.toolChoice:r.tool_choice={type:e.toolChoice.type,name:e.toolChoice.name});let s=Ao(e.model);if(!s&&e.temperature!==void 0&&(r.temperature=e.temperature),!s&&e.topP!==void 0&&(r.top_p=e.topP),e.maxTokens!==void 0&&(r.max_output_tokens=e.maxTokens),e.reasoning){let i=e.reasoning.effort==="minimal"?"none":e.reasoning.effort;Ur(e.model)&&(i==="high"||i==="xhigh")&&(i="medium");let a={effort:i};a.summary="auto",a.generate_summary="auto",r.reasoning=a}if(e.prediction&&Ao(e.model)&&(r.prediction=e.prediction),r.truncation="auto",e.promptCacheKey&&(r.prompt_cache_key=e.promptCacheKey),e.promptCacheRetention&&(r.prompt_cache_retention=e.promptCacheRetention),e.serviceTier&&(r.service_tier=e.serviceTier),e.reasoning?.includeEncryptedReasoning&&(e.store===void 0&&(r.store=!1),r.include=["reasoning.encrypted_content"]),e.contextManagement&&(r.context_management=e.contextManagement.edits.map(i=>{let a={type:i.type};return i.type==="clear_thinking"&&i.keep!==void 0?a.keep=i.keep:i.type==="clear_tool_uses"&&(i.trigger&&(a.trigger=i.trigger),i.keep&&(a.keep=i.keep),i.excludeTools&&(a.exclude_tools=i.excludeTools),i.clearToolInput!==void 0&&(a.clear_tool_input=i.clearToolInput)),a})),!e.disableBuiltinTools){let i=r.tools??[],a=r.include??[];if(e.openaiBuiltinTools&&e.openaiBuiltinTools.length>0){for(let c of e.openaiBuiltinTools)i.push({...c});let l=new Set(e.openaiBuiltinTools.map(c=>c.type));l.has("web_search_preview")&&a.push("web_search_call.action.sources"),l.has("file_search")&&a.push("file_search_call.results"),l.has("code_interpreter")&&a.push("code_interpreter_call.outputs"),l.has("computer_use_preview")&&a.push("computer_call_output.output.image_url")}else this.quirks.builtinWebSearch&&(i.push({type:"web_search_preview"}),a.push("web_search_call.action.sources")),this.quirks.builtinCodeInterpreter&&(i.push({type:"code_interpreter"}),a.push("code_interpreter_call.outputs")),this.quirks.builtinFileSearch&&(i.push({type:"file_search"}),a.push("file_search_call.results"));i.length>0&&(r.tools=i),a.length>0&&(r.include=a)}if(e.maxToolCalls!==void 0&&(r.max_tool_calls=e.maxToolCalls),e.parallelToolCalls!==void 0&&(r.parallel_tool_calls=e.parallelToolCalls),e.textVerbosity){let i=r.text??{};i.verbosity=e.textVerbosity,r.text=i}return r}async*fetchAndStream(e,t,n,r){let s=AbortSignal.timeout(this.timeoutMs),i=r?AbortSignal.any([r,s]):s,a=await fetch(e,{method:"POST",headers:t,body:JSON.stringify(n),signal:i});if(!a.ok){let c=await a.text().catch(()=>""),d=new Error(`OpenAI Responses API error ${a.status}: ${c.slice(0,500)}`);throw d.status=a.status,d}if(!a.body)throw new Error("OpenAI Responses API returned no response body");let l=a.headers.get("content-type")??"";if(l.includes("application/json")&&!l.includes("text/event-stream")){yield*this.handleNonStreamingResponse(a);return}yield*this.parseSSEStream(a.body)}async*handleNonStreamingResponse(e){let t=await e.json();if(t.id&&(yield{type:"response_id",id:t.id}),t.usage&&(yield{type:"usage",promptTokens:t.usage.input_tokens??0,completionTokens:t.usage.output_tokens??0,reasoningTokens:t.usage.output_tokens_details?.reasoning_tokens,cacheReadTokens:t.usage.input_tokens_details?.cached_tokens}),t.output)for(let n of t.output){if(n.type==="message"&&n.content)for(let r of n.content)r.type==="output_text"&&(yield{type:"delta",text:r.text??""},r.annotations&&r.annotations.length>0&&(yield{type:"annotations",annotations:r.annotations.map(s=>({...s,type:s.type??"url_citation",url:s.url,title:s.title}))}));if(n.type==="reasoning"&&n.summary)for(let r of n.summary)r.type==="summary_text"&&(yield{type:"reasoning_delta",text:r.text??""});n.type==="function_call"&&(yield{type:"tool_call_delta",index:0,id:n.call_id,name:n.name,arguments:n.arguments??""})}yield{type:"done",finishReason:t.status==="completed"?"stop":t.status??"stop"}}async*parseSSEStream(e){let t=new TextDecoder,n="",r="",s=null,i=new AbortController,a=0,l=new Map,c=()=>{s&&clearTimeout(s),s=setTimeout(()=>{i.abort()},_t)};try{c();let d=e.getReader();try{for(;;){let{done:u,value:p}=await d.read();if(u)break;if(i.signal.aborted)throw new Error("Stream idle timeout");c(),n+=t.decode(p,{stream:!0});let m;for(;(m=n.indexOf(`
|
|
@@ -39,7 +39,7 @@ ${s.executableCode.code}
|
|
|
39
39
|
...
|
|
40
40
|
`:`
|
|
41
41
|
`,e+=YT,e}async function Yu(o,e,t,n=Ui){if(o.length<=n||Ku(o))return o;let r=await zu(o,e,t);return r?qu(r):o.slice(0,n)+`
|
|
42
|
-
...[truncated ${o.length-n} chars]`}function ZT(o){let e=[],t=[];for(let n of o)n.role==="tool"&&typeof n.content=="string"&&n.tool_call_id?Ku(n.content)||t.push({toolCallId:n.tool_call_id,content:n.content,size:n.content.length}):n.role==="assistant"&&t.length>0&&(e.push(t),t=[]);return t.length>0&&e.push(t),e}function ew(o,e){let t=[],n=[],r=[];for(let s of o){let i=e.replacements.get(s.toolCallId);i!==void 0?t.push({...s,replacement:i}):e.seenIds.has(s.toolCallId)?n.push(s):r.push(s)}return{mustReapply:t,frozen:n,fresh:r}}function tw(o,e,t){let n=[...o].sort((i,a)=>a.size-i.size),r=[],s=e+o.reduce((i,a)=>i+a.size,0);for(let i of n){if(s<=t)break;r.push(i),s-=i.size}return r}async function Xu(o,e,t,n=ji){let r=ZT(o);if(r.length===0)return{messages:o,newlyReplacedCount:0};let s=new Map,i=[];for(let d of r){let{mustReapply:u,frozen:p,fresh:m}=ew(d,e);for(let k of u)s.set(k.toolCallId,k.replacement);if(m.length===0){for(let k of d)e.seenIds.add(k.toolCallId);continue}let h=p.reduce((k,x)=>k+x.size,0),f=m.reduce((k,x)=>k+x.size,0),y=h+f>n?tw(m,h,n):[],b=new Set(y.map(k=>k.toolCallId));for(let k of d)b.has(k.toolCallId)||e.seenIds.add(k.toolCallId);y.length>0&&i.push(...y)}if(s.size===0&&i.length===0)return{messages:o,newlyReplacedCount:0};let a=await Promise.all(i.map(async d=>{let u=await zu(d.content,d.toolCallId,t);return{candidate:d,result:u}})),l=0;for(let{candidate:d,result:u}of a){if(e.seenIds.add(d.toolCallId),!u)continue;let p=qu(u);s.set(d.toolCallId,p),e.replacements.set(d.toolCallId,p),l++}return s.size===0?{messages:o,newlyReplacedCount:0}:{messages:o.map(d=>{if(d.role!=="tool"||!d.tool_call_id)return d;let u=s.get(d.tool_call_id);return u===void 0?d:{...d,content:u}}),newlyReplacedCount:l}}var qT,Gu,YT,el=N(()=>{"use strict";Ue();qT="tool-results",Gu="<persisted-output>",YT="</persisted-output>"});function rw(o){try{return JSON.parse(o)}catch{return}}var nw,ow,Vr,Ju=N(()=>{"use strict";$n();el();nw=new Set(["read_file","file_read","FileRead","grep","Grep","glob","Glob","search","list_dir","find_files","web_fetch","web_search","WebFetch","WebSearch"]),ow=new Set(["bash","execute_command","Bash","shell"]),Vr=class{tools=[];hasErrored=!1;erroredToolDescription="";discarded=!1;siblingAbortController;progressResolve;config;concurrencySafe;constructor(e){this.config=e,this.concurrencySafe=e.concurrencySafeTools??nw,this.siblingAbortController=new AbortController,e.signal&&e.signal.addEventListener("abort",()=>{this.siblingAbortController.abort("parent_abort")},{once:!0})}discard(){this.discarded=!0}addTool(e){let t=this.concurrencySafe.has(e.function.name);this.tools.push({id:e.id,toolCall:e,status:"queued",isConcurrencySafe:t,results:[],pendingProgress:[]}),this.processQueue()}canExecuteTool(e){let t=this.tools.filter(r=>r.status==="executing"),n=this.config.maxConcurrentTools;return n&&n>0&&t.length>=n?!1:t.length===0||e&&t.every(r=>r.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 t;try{t=JSON.parse(e.toolCall.function.arguments)}catch{}let n=t?.command??t?.file_path??t?.pattern??"";if(typeof n=="string"&&n.length>0){let r=n.length>40?n.slice(0,40)+"\u2026":n;return`${e.toolCall.function.name}(${r})`}return e.toolCall.function.name}createSyntheticError(e,t){let n=this.erroredToolDescription,r=t==="user_interrupted"?"User rejected tool use":t==="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:r,message:nn(e.id,{ok:!1,error:r})}}async executeTool(e){e.status="executing";let n=(async()=>{let r=this.getAbortReason();if(r){e.results.push(this.createSyntheticError(e,r)),e.status="completed";return}let{toolInvoker:s,hooks:i,sessionId:a,turnId:l,log:c}=this.config,d=e.toolCall.function.name,u=!1,p=e.toolCall.function.arguments;if(i)try{let k=await i.invoke("tool.before_invoke",{sessionId:a,turnId:l,callId:e.id,toolName:d,arguments:rw(p)});if(k.action==="abort"){let x=k.reason??"blocked by policy";c.info(`tool ${d} blocked: ${x}`),e.results.push({callId:e.id,toolName:d,ok:!1,error:x,blocked:!0,blockReason:x,message:nn(e.id,{ok:!1,error:x})}),e.status="completed";return}k.action==="continue"&&k.context?.arguments&&(p=JSON.stringify(k.context.arguments))}catch{}let m=await s.invoke(l,d,p,this.siblingAbortController.signal),h=this.getAbortReason();if(h&&!u){e.results.push(this.createSyntheticError(e,h)),e.status="completed";return}let f=!m.error,y=m.result;f&&y&&y.length>5e4&&(y=await Yu(y,e.id,a));let b=nn(e.id,{ok:f,payload:y,error:m.error,toolReferences:m.toolReferences,imageUrls:m.imageUrls});f||(u=!0,ow.has(d)&&(this.hasErrored=!0,this.erroredToolDescription=this.getToolDescription(e),this.siblingAbortController.abort("sibling_error"))),i?.invoke(f?"tool.after_invoke":"tool.invoke_failed",{sessionId:a,turnId:l,callId:e.id,toolName:d,ok:f,...m.error?{error:m.error}:{}}).catch(()=>{}),e.results.push({callId:e.id,toolName:d,ok:f,error:m.error,message:b}),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 t of e.results)yield t}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),t=new Promise(n=>{this.progressResolve=n});e.length>0&&await Promise.race([...e,t])}}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")}}});import{homedir as sw}from"node:os";import{join as Ae}from"node:path";import{existsSync as iw}from"node:fs";function H(){return process.env.QLOGICAGENT_HOME||Ae(sw(),Ge)}function Qu(){return Ae(H(),"plugins")}function Ht(){return Ae(H(),"skills")}function pt(){return Ae(H(),"settings.json")}function Zu(){return Ae(H(),"plugin-cache")}function ep(){return Ae(H(),"mcp.json")}function tp(){return Ae(H(),"marketplace.json")}function np(){return Ae(H(),"workflows")}function op(){return Ae(H(),"rules")}function Me(o){if(!o)throw new Error("getProjectAgentDir: cwd is required (must not fall back to process.cwd())");return Ae(o,Ge)}function rp(o){return Ae(Me(o),"workflows")}function It(o){return Ae(Me(o),"skills")}function Oo(o){return Ae(Me(o),"INSTRUCTIONS.md")}function Gn(o){return Ae(Me(o),"rules")}function Vt(o){return Ae(Me(o),"sessions")}function sp(o,e){let t=Ae(Me(o),"checkpoints");return e?Ae(t,e):t}function ip(o){return Ae(o,Ge,"hooks")}function ap(o,e){return o.filter(t=>t!==e&&iw(Ae(t,Ge,"skills")))}var Ge,le=N(()=>{"use strict";Ge=".qlogicagent"});var Kr,lp=N(()=>{"use strict";Kr=class{pools=new Map;runtimeStates=new Map;constructor(e){if(e)for(let t of e){this.pools.set(t.providerId,t);for(let n of t.keys)this.runtimeStates.set(n.id,this.createInitialState())}}acquireKey(e){let t=this.pools.get(e);if(!t||t.keys.length===0)return null;let n=Date.now(),r=this.getHealthyCandidates(t,n);if(r.length===0)return null;let s=this.selectByStrategy(r,t.strategy,n);if(!s)return null;let i=this.runtimeStates.get(s.id);return i.inFlight++,i.totalRequests++,i.lastUsedAt=n,i.requestTimestamps.push(n),{keyId:s.id,apiKey:s.key,providerId:e,release:a=>this.releaseKey(s.id,a)}}releaseKey(e,t){let n=this.runtimeStates.get(e);if(n)if(n.inFlight=Math.max(0,n.inFlight-1),t.success)n.consecutiveErrors=0,n.healthStatus="healthy",t.tokens&&(n.totalTokens+=t.tokens,n.tokenCounts.push(t.tokens));else if(n.consecutiveErrors++,n.lastErrorAt=Date.now(),t.errorCode===429){let r=t.retryAfter?t.retryAfter*1e3:3e4;n.cooldownUntil=Date.now()+r,n.healthStatus="cooldown"}else n.consecutiveErrors>=5?(n.cooldownUntil=Date.now()+6e4,n.healthStatus="cooldown"):n.consecutiveErrors>=3&&(n.healthStatus="degraded")}addProvider(e,t){this.pools.has(e)||this.pools.set(e,{providerId:e,baseUrl:t?.baseUrl,strategy:t?.strategy??"weighted-round-robin",keys:[],rateLimit:t?.rateLimit})}removeProvider(e){let t=this.pools.get(e);if(t){for(let n of t.keys)this.runtimeStates.delete(n.id);this.pools.delete(e)}}addKey(e,t,n){let r=this.pools.get(e);r||(r={providerId:e,strategy:"weighted-round-robin",keys:[]},this.pools.set(e,r));let s=n?.id??crypto.randomUUID(),i={id:s,key:t,label:n?.label,weight:n?.weight??1,enabled:n?.enabled??!0};return r.keys.push(i),this.runtimeStates.set(s,this.createInitialState()),s}removeKey(e){for(let t of this.pools.values()){let n=t.keys.findIndex(r=>r.id===e);if(n!==-1){t.keys.splice(n,1),this.runtimeStates.delete(e);return}}}updateKey(e,t){for(let n of this.pools.values()){let r=n.keys.find(s=>s.id===e);if(r){if(t.label!==void 0&&(r.label=t.label),t.weight!==void 0&&(r.weight=t.weight),t.enabled!==void 0){r.enabled=t.enabled;let s=this.runtimeStates.get(e);s&&(s.healthStatus=t.enabled?"healthy":"disabled")}return}}}setKeyHealth(e,t){let n=this.runtimeStates.get(e);n&&(n.healthStatus=t)}setStrategy(e,t){let n=this.pools.get(e);n&&(n.strategy=t)}setRateLimit(e,t){let n=this.pools.get(e);n&&(n.rateLimit=t)}getPoolStatus(e){let t=this.pools.get(e);return t?this.buildPoolStatus(t):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 t=this.pools.get(e);return t?this.getHealthyCandidates(t,Date.now()).length>0:!1}exportConfig(){return[...this.pools.values()]}reloadConfig(e){let t=new Set;for(let n of e){this.pools.set(n.providerId,n);for(let r of n.keys)t.add(r.id),this.runtimeStates.has(r.id)||this.runtimeStates.set(r.id,this.createInitialState())}for(let n of[...this.pools.keys()])e.some(r=>r.providerId===n)||this.pools.delete(n);for(let n of[...this.runtimeStates.keys()])t.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,t){let n=[];for(let r of e.keys){if(!r.enabled)continue;let s=this.runtimeStates.get(r.id);if(s){if(s.healthStatus==="cooldown")if(t>=s.cooldownUntil)s.healthStatus="healthy",s.consecutiveErrors=0;else continue;s.healthStatus!=="disabled"&&(e.rateLimit?.rpm&&(this.pruneWindow(s.requestTimestamps,t),s.requestTimestamps.length>=e.rateLimit.rpm*.9)||e.rateLimit?.tpm&&(this.pruneWindow(s.tokenCounts,t),s.tokenCounts.reduce((a,l)=>a+l,0)>=e.rateLimit.tpm*.9)||n.push(r))}}return n}selectByStrategy(e,t,n){if(e.length===0)return null;if(e.length===1)return e[0];switch(t){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 t=e.reduce((r,s)=>r+s.weight,0),n=Math.random()*t;for(let r of e)if(n-=r.weight,n<=0)return r;return e[e.length-1]}leastBusy(e){let t=1/0,n=e[0];for(let r of e){let i=this.runtimeStates.get(r.id)?.inFlight??0;(i<t||i===t&&r.weight>n.weight)&&(t=i,n=r)}return n}pruneWindow(e,t){let n=t-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(t=>{let n=this.runtimeStates.get(t.id)??this.createInitialState();return{...t,inFlight:n.inFlight,totalRequests:n.totalRequests,totalTokens:n.totalTokens,lastUsedAt:n.lastUsedAt,lastErrorAt:n.lastErrorAt,consecutiveErrors:n.consecutiveErrors,cooldownUntil:n.cooldownUntil,healthStatus:t.enabled?n.healthStatus:"disabled"}})}}}});var cp={};fn(cp,{ALL_PURPOSES:()=>Lo,ModelRegistry:()=>zr,deriveModelPurposes:()=>lw,getModelRegistry:()=>J,resetModelRegistry:()=>aw});import*as et from"node:fs";function J(){return Do||(Do=new zr,Do.load()),Do}function aw(){Do=null}function lw(o){let e=[];switch((!o.mediaType||o.mediaType==="image_understanding"||o.mediaType==="video_understanding")&&e.push("textGeneration"),(o.vision||o.mediaType==="image_understanding")&&e.push("imageUnderstanding"),o.mediaType==="video_understanding"&&e.push("videoUnderstanding"),o.mediaType){case"image":e.push("imageGeneration");break;case"video":e.push("videoGeneration");break;case"tts":e.push("tts");break;case"stt":e.push("stt");break;case"music":case"music_realtime":e.push("musicGeneration");break;case"voice_clone":e.push("voiceClone");break;case"embedding":e.push("embedding");break;case"3d":e.push("threeDGeneration");break;case"realtime_audio":e.push("realtimeAudio");break}return e.includes("textGeneration")&&e.push("smallModel"),[...new Set(e.length>0?e:["textGeneration"])]}function cw(o){switch(o){case"openai-chat":case"openai-responses":case"anthropic-messages":case"volcengine-responses":return o;default:return}}var Lo,zr,Do,mt=N(()=>{"use strict";an();le();lp();Lo=["textGeneration","smallModel","stt","tts","imageGeneration","imageUnderstanding","videoGeneration","videoUnderstanding","threeDGeneration","embedding","voiceClone","musicGeneration","realtimeAudio","realtimeVideo"],zr=class{keyPool;coreProviderRegistry=new sn;providerVariantResolver=new _o(this.coreProviderRegistry);models=new Map;modelEnabledOverrides=new Map;bindings={};settingsPath;changeListeners=[];constructor(e){this.settingsPath=pt(),this.keyPool=new Kr(e?.providers),e?.models&&this.loadModelState(e.models),e?.bindings&&(this.bindings={...e.bindings})}getActiveModel(e){let t=this.bindings[e];if(!t)return null;let n=this.models.get(t);if(!n||!n.enabled)return null;let r=this.resolveTechnicalVariant(n,e),s=r?.provider??n.provider,i=r?.nativeModelId??n.nativeModelId??n.model,a=this.acquireKeyForProviderVariant(s);if(!a)return null;let{keyHandle:l,keyProviderId:c}=a;return{provider:s,model:i,apiKey:l.apiKey,baseUrl:n.provider===s?n.baseUrl??this.getProviderBaseUrl(s)??this.getProviderBaseUrl(c):this.getProviderBaseUrl(s),keyHandle:l}}peekActiveModel(e){let t=this.bindings[e];return t?this.models.get(t)??null:null}isAvailable(e){let t=this.peekActiveModel(e);return!!t?.enabled&&this.hasAvailableKeyForProviderVariant(t.provider)}resolveModelForPurpose(e){let t=this.peekActiveModel(e);return t?t.model:null}addProvider(e,t){this.keyPool.addProvider(e,t),this.emitChange()}removeProvider(e){this.keyPool.removeProvider(e);for(let[t,n]of this.models)n.provider===e&&this.removeModel(t);this.emitChange()}addKey(e,t,n){let r=this.keyPool.addKey(e,t,n);return this.emitChange(),r}removeKey(e){this.keyPool.removeKey(e),this.emitChange()}updateKey(e,t){this.keyPool.updateKey(e,t),this.emitChange()}setKeyHealth(e,t){this.keyPool.setKeyHealth(e,t),this.emitChange()}setStrategy(e,t){this.keyPool.setStrategy(e,t),this.emitChange()}addModel(e){let t=e.id??`${e.provider}:${e.model}`;return this.models.set(t,{...e,id:t,enabled:this.modelEnabledOverrides.get(t)??e.enabled}),this.emitChange(),t}replaceCatalogModels(e){let t=new Map;for(let n of e)t.set(n.id,{...n,enabled:this.modelEnabledOverrides.get(n.id)??n.enabled});this.models=t;for(let[n,r]of Object.entries(this.bindings))r&&!this.models.has(r)&&delete this.bindings[n];this.emitChange()}migrateModelIds(e){for(let[t,n]of e){let r=this.modelEnabledOverrides.get(t);r!==void 0&&!this.modelEnabledOverrides.has(n)&&this.modelEnabledOverrides.set(n,r),this.modelEnabledOverrides.delete(t);for(let[s,i]of Object.entries(this.bindings))i===t&&(this.bindings[s]=n)}this.emitChange()}removeModel(e){this.models.delete(e),this.modelEnabledOverrides.delete(e);for(let[t,n]of Object.entries(this.bindings))n===e&&delete this.bindings[t];this.emitChange()}enableModel(e){let t=this.models.get(e);t&&(t.enabled=!0),this.modelEnabledOverrides.set(e,!0),this.emitChange()}disableModel(e){let t=this.models.get(e);t&&(t.enabled=!1),this.modelEnabledOverrides.set(e,!1),this.emitChange()}listModels(e){let t=[...this.models.values()];return e?.purpose&&(t=t.filter(n=>n.purposes.includes(e.purpose))),e?.provider&&(t=t.filter(n=>n.provider===e.provider)),e?.enabledOnly&&(t=t.filter(n=>n.enabled)),t}getModel(e){return this.models.get(e)??null}setBinding(e,t){let n=this.models.get(t);if(!n)throw new Error(`Model "${t}" not found in pool.`);if(!n.purposes.includes(e))throw new Error(`Model "${t}" does not support purpose "${e}".`);this.bindings[e]=t,this.emitChange()}removeBinding(e){delete this.bindings[e],this.emitChange()}getBinding(e){let t=this.bindings[e];return t?this.models.get(t)??null:null}getAllBindings(){let e={};for(let t of Lo){let n=this.bindings[t];e[t]=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{et.existsSync(this.settingsPath)&&(e=JSON.parse(et.readFileSync(this.settingsPath,"utf-8")))}catch{e={}}delete e.provider,delete e.apiKey,delete e.model,delete e.baseUrl;let t={...e,providers:this.keyPool.exportConfig(),models:this.exportModelState(),bindings:{...this.bindings}},n=this.settingsPath.replace(/[/\\][^/\\]+$/,"");et.existsSync(n)||et.mkdirSync(n,{recursive:!0}),et.writeFileSync(this.settingsPath,JSON.stringify(t,null,2),"utf-8")}load(){try{if(!et.existsSync(this.settingsPath))return!1;let e=et.readFileSync(this.settingsPath,"utf-8"),t=JSON.parse(e);return t.providers&&this.keyPool.reloadConfig(t.providers),this.models.clear(),this.modelEnabledOverrides.clear(),t.models&&this.loadModelState(t.models),this.bindings=t.bindings??{},this.emitChange(),!0}catch{return!1}}exportConfig(){return{providers:this.keyPool.exportConfig(),models:this.exportModelState(),bindings:{...this.bindings}}}getTunable(e){try{if(!et.existsSync(this.settingsPath))return;let t=et.readFileSync(this.settingsPath,"utf-8");return JSON.parse(t).tunables?.[e]}catch{return}}getModelInfo(e,t){let n=this.listModels({provider:e}).find(r=>r.model===t);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(t=>!!this.keyPool.getPoolStatus(t)?.keys.some(r=>r.enabled))}hasAvailableKeyForProviderVariant(e){return this.providerVariantKeyCandidates(e).some(t=>this.keyPool.hasAvailableKey(t))}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(t=>({id:t.model,name:t.displayName,contextWindow:t.contextWindow,maxOutput:t.maxOutput,streamRequired:t.streamRequired}))}))}resolveProviderApiKey(e){return this.getKeyForProvider(e)??void 0}onChange(e){return this.changeListeners.push(e),()=>{let t=this.changeListeners.indexOf(e);t>=0&&this.changeListeners.splice(t,1)}}getKeyForProvider(e){let n=this.acquireKeyForProviderVariant(e)?.keyHandle;if(!n)return null;let r=n.apiKey;return n.release({success:!0}),r}snapshotProviderKeys(){let e={};for(let t of this.keyPool.getAllStatus()){let n=this.getKeyForProvider(t.providerId);n&&(e[t.providerId]=n)}return e}getProviderBaseUrl(e){return this.keyPool.getPoolStatus(e)?.baseUrl}acquireKeyForProviderVariant(e){for(let t of this.providerVariantKeyCandidates(e)){let n=this.keyPool.acquireKey(t);if(n)return{keyHandle:n,keyProviderId:t}}return null}resolveTechnicalVariant(e,t){let n=this.providerVariantKeyCandidates(e.provider).filter(s=>this.hasConfiguredKeyForProviderVariant(s));if(n.length===0)return;let r=this.providerVariantResolver.resolveBest({publicModel:e.model,requestedProtocol:cw(e.transport),purpose:t,userPreference:{providerIds:n}});if(r)return{provider:r.provider,nativeModelId:r.nativeModelId}}providerVariantKeyCandidates(e){let t=[e],n=this.coreProviderRegistry.getProvider(e),r=n?.group??n?.id??e;for(let s of this.coreProviderRegistry.listProviders())(s.group??s.id)===r&&t.push(s.id);return r!==e&&t.push(r),[...new Set(t)]}loadModelState(e){for(let t of e)typeof t.id!="string"||!t.id||typeof t.enabled=="boolean"&&this.modelEnabledOverrides.set(t.id,t.enabled)}exportModelState(){let e=new Map;for(let[t,n]of this.modelEnabledOverrides)e.set(t,n);for(let t of this.models.values())e.set(t.id,t.enabled);return[...e.entries()].map(([t,n])=>({id:t,enabled:n}))}emitChange(){for(let e of this.changeListeners)try{e()}catch{}}},Do=null});import{readFile as dw}from"node:fs/promises";function Sn(o){let e=typeof o.content=="string"?o.content:o.content!=null?JSON.stringify(o.content):"";return Math.ceil(e.length/4)}function Tn(o){let e=0;for(let t of o)e+=Sn(t);return e}function up(o){if(!o)return 128e3;if(o in tl)return tl[o];let e=o.toLowerCase();for(let[t,n]of Object.entries(tl))if(e.startsWith(t.toLowerCase()))return n;return 128e3}function pw(){return J().resolveModelForPurpose("textGeneration")??uw}function mp(){return ol}function mw(o,e){return async(t,n)=>{let r=e?.transport,s=e?.apiKey;if(!r||!s)return o.debug("[context-compression] no LLM transport for summarization \u2014 using sync fallback"),nl(t);try{let i="",a=e?.model??pw();for await(let l of r.stream({model:a,messages:[{role:"system",content:"You are a precise conversation summarizer."},{role:"user",content:n}],maxTokens:2e3,temperature:.3},s,AbortSignal.timeout(3e4)))l.type==="delta"&&(i+=l.text);return i||(o.warn("[context-compression] empty summary response"),nl(t))}catch(i){return o.warn({err:i.message},"[context-compression] summarize call error \u2014 using fallback"),nl(t)}}}function nl(o){let e=[],t=o.filter(s=>s.role==="user"),n=t.slice(0,20).map(s=>{let i=typeof s.content=="string"?s.content:JSON.stringify(s.content??"");return`- [user]: ${i.slice(0,300)}${i.length>300?"...":""}`});e.push(`## User Requests (${t.length} messages)`),e.push(...n);let r=o.filter(s=>s.role==="assistant");if(r.length>0){let s=r.slice(0,10).map(i=>{let a=typeof i.content=="string"?i.content:JSON.stringify(i.content??"");return`- [assistant]: ${a.slice(0,150)}${a.length>150?"...":""}`});e.push("",`## Assistant Responses (${r.length} total)`),e.push(...s)}return e.join(`
|
|
42
|
+
...[truncated ${o.length-n} chars]`}function ZT(o){let e=[],t=[];for(let n of o)n.role==="tool"&&typeof n.content=="string"&&n.tool_call_id?Ku(n.content)||t.push({toolCallId:n.tool_call_id,content:n.content,size:n.content.length}):n.role==="assistant"&&t.length>0&&(e.push(t),t=[]);return t.length>0&&e.push(t),e}function ew(o,e){let t=[],n=[],r=[];for(let s of o){let i=e.replacements.get(s.toolCallId);i!==void 0?t.push({...s,replacement:i}):e.seenIds.has(s.toolCallId)?n.push(s):r.push(s)}return{mustReapply:t,frozen:n,fresh:r}}function tw(o,e,t){let n=[...o].sort((i,a)=>a.size-i.size),r=[],s=e+o.reduce((i,a)=>i+a.size,0);for(let i of n){if(s<=t)break;r.push(i),s-=i.size}return r}async function Xu(o,e,t,n=ji){let r=ZT(o);if(r.length===0)return{messages:o,newlyReplacedCount:0};let s=new Map,i=[];for(let d of r){let{mustReapply:u,frozen:p,fresh:m}=ew(d,e);for(let k of u)s.set(k.toolCallId,k.replacement);if(m.length===0){for(let k of d)e.seenIds.add(k.toolCallId);continue}let h=p.reduce((k,x)=>k+x.size,0),f=m.reduce((k,x)=>k+x.size,0),y=h+f>n?tw(m,h,n):[],b=new Set(y.map(k=>k.toolCallId));for(let k of d)b.has(k.toolCallId)||e.seenIds.add(k.toolCallId);y.length>0&&i.push(...y)}if(s.size===0&&i.length===0)return{messages:o,newlyReplacedCount:0};let a=await Promise.all(i.map(async d=>{let u=await zu(d.content,d.toolCallId,t);return{candidate:d,result:u}})),l=0;for(let{candidate:d,result:u}of a){if(e.seenIds.add(d.toolCallId),!u)continue;let p=qu(u);s.set(d.toolCallId,p),e.replacements.set(d.toolCallId,p),l++}return s.size===0?{messages:o,newlyReplacedCount:0}:{messages:o.map(d=>{if(d.role!=="tool"||!d.tool_call_id)return d;let u=s.get(d.tool_call_id);return u===void 0?d:{...d,content:u}}),newlyReplacedCount:l}}var qT,Gu,YT,el=N(()=>{"use strict";Ue();qT="tool-results",Gu="<persisted-output>",YT="</persisted-output>"});function rw(o){try{return JSON.parse(o)}catch{return}}var nw,ow,Vr,Ju=N(()=>{"use strict";$n();el();nw=new Set(["read_file","file_read","FileRead","grep","Grep","glob","Glob","search","list_dir","find_files","web_fetch","web_search","WebFetch","WebSearch"]),ow=new Set(["bash","execute_command","Bash","shell"]),Vr=class{tools=[];hasErrored=!1;erroredToolDescription="";discarded=!1;siblingAbortController;progressResolve;config;concurrencySafe;constructor(e){this.config=e,this.concurrencySafe=e.concurrencySafeTools??nw,this.siblingAbortController=new AbortController,e.signal&&e.signal.addEventListener("abort",()=>{this.siblingAbortController.abort("parent_abort")},{once:!0})}discard(){this.discarded=!0}addTool(e){let t=this.concurrencySafe.has(e.function.name);this.tools.push({id:e.id,toolCall:e,status:"queued",isConcurrencySafe:t,results:[],pendingProgress:[]}),this.processQueue()}canExecuteTool(e){let t=this.tools.filter(r=>r.status==="executing"),n=this.config.maxConcurrentTools;return n&&n>0&&t.length>=n?!1:t.length===0||e&&t.every(r=>r.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 t;try{t=JSON.parse(e.toolCall.function.arguments)}catch{}let n=t?.command??t?.file_path??t?.pattern??"";if(typeof n=="string"&&n.length>0){let r=n.length>40?n.slice(0,40)+"\u2026":n;return`${e.toolCall.function.name}(${r})`}return e.toolCall.function.name}createSyntheticError(e,t){let n=this.erroredToolDescription,r=t==="user_interrupted"?"User rejected tool use":t==="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:r,message:nn(e.id,{ok:!1,error:r})}}async executeTool(e){e.status="executing";let n=(async()=>{let r=this.getAbortReason();if(r){e.results.push(this.createSyntheticError(e,r)),e.status="completed";return}let{toolInvoker:s,hooks:i,sessionId:a,turnId:l,log:c}=this.config,d=e.toolCall.function.name,u=!1,p=e.toolCall.function.arguments;if(i)try{let k=await i.invoke("tool.before_invoke",{sessionId:a,turnId:l,callId:e.id,toolName:d,arguments:rw(p)});if(k.action==="abort"){let x=k.reason??"blocked by policy";c.info(`tool ${d} blocked: ${x}`),e.results.push({callId:e.id,toolName:d,ok:!1,error:x,blocked:!0,blockReason:x,message:nn(e.id,{ok:!1,error:x})}),e.status="completed";return}k.action==="continue"&&k.context?.arguments&&(p=JSON.stringify(k.context.arguments))}catch{}let m=await s.invoke(l,d,p,this.siblingAbortController.signal),h=this.getAbortReason();if(h&&!u){e.results.push(this.createSyntheticError(e,h)),e.status="completed";return}let f=!m.error,y=m.result;f&&y&&y.length>5e4&&(y=await Yu(y,e.id,a));let b=nn(e.id,{ok:f,payload:y,error:m.error,toolReferences:m.toolReferences,imageUrls:m.imageUrls});f||(u=!0,ow.has(d)&&(this.hasErrored=!0,this.erroredToolDescription=this.getToolDescription(e),this.siblingAbortController.abort("sibling_error"))),i?.invoke(f?"tool.after_invoke":"tool.invoke_failed",{sessionId:a,turnId:l,callId:e.id,toolName:d,ok:f,...m.error?{error:m.error}:{}}).catch(()=>{}),e.results.push({callId:e.id,toolName:d,ok:f,error:m.error,message:b}),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 t of e.results)yield t}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),t=new Promise(n=>{this.progressResolve=n});e.length>0&&await Promise.race([...e,t])}}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")}}});import{homedir as sw}from"node:os";import{join as Ae}from"node:path";import{existsSync as iw}from"node:fs";function H(){return process.env.QLOGICAGENT_HOME||Ae(sw(),Ge)}function Qu(){return Ae(H(),"plugins")}function Ht(){return Ae(H(),"skills")}function pt(){return Ae(H(),"settings.json")}function Zu(){return Ae(H(),"plugin-cache")}function ep(){return Ae(H(),"mcp.json")}function tp(){return Ae(H(),"marketplace.json")}function np(){return Ae(H(),"workflows")}function op(){return Ae(H(),"rules")}function Me(o){if(!o)throw new Error("getProjectAgentDir: cwd is required (must not fall back to process.cwd())");return Ae(o,Ge)}function rp(o){return Ae(Me(o),"workflows")}function It(o){return Ae(Me(o),"skills")}function Oo(o){return Ae(Me(o),"INSTRUCTIONS.md")}function Gn(o){return Ae(Me(o),"rules")}function Vt(o){return Ae(Me(o),"sessions")}function sp(o,e){let t=Ae(Me(o),"checkpoints");return e?Ae(t,e):t}function ip(o){return Ae(o,Ge,"hooks")}function ap(o,e){return o.filter(t=>t!==e&&iw(Ae(t,Ge,"skills")))}var Ge,le=N(()=>{"use strict";Ge=".qlogicagent"});var Kr,lp=N(()=>{"use strict";Kr=class{pools=new Map;runtimeStates=new Map;constructor(e){if(e)for(let t of e){this.pools.set(t.providerId,t);for(let n of t.keys)this.runtimeStates.set(n.id,this.createInitialState())}}acquireKey(e){let t=this.pools.get(e);if(!t||t.keys.length===0)return null;let n=Date.now(),r=this.getHealthyCandidates(t,n);if(r.length===0)return null;let s=this.selectByStrategy(r,t.strategy,n);if(!s)return null;let i=this.runtimeStates.get(s.id);return i.inFlight++,i.totalRequests++,i.lastUsedAt=n,i.requestTimestamps.push(n),{keyId:s.id,apiKey:s.key,providerId:e,release:a=>this.releaseKey(s.id,a)}}releaseKey(e,t){let n=this.runtimeStates.get(e);if(n)if(n.inFlight=Math.max(0,n.inFlight-1),t.success)n.consecutiveErrors=0,n.healthStatus="healthy",t.tokens&&(n.totalTokens+=t.tokens,n.tokenCounts.push(t.tokens));else if(n.consecutiveErrors++,n.lastErrorAt=Date.now(),t.errorCode===429){let r=t.retryAfter?t.retryAfter*1e3:3e4;n.cooldownUntil=Date.now()+r,n.healthStatus="cooldown"}else n.consecutiveErrors>=5?(n.cooldownUntil=Date.now()+6e4,n.healthStatus="cooldown"):n.consecutiveErrors>=3&&(n.healthStatus="degraded")}addProvider(e,t){this.pools.has(e)||this.pools.set(e,{providerId:e,baseUrl:t?.baseUrl,strategy:t?.strategy??"weighted-round-robin",keys:[],rateLimit:t?.rateLimit})}removeProvider(e){let t=this.pools.get(e);if(t){for(let n of t.keys)this.runtimeStates.delete(n.id);this.pools.delete(e)}}addKey(e,t,n){let r=this.pools.get(e);r||(r={providerId:e,strategy:"weighted-round-robin",keys:[]},this.pools.set(e,r));let s=n?.id??crypto.randomUUID(),i={id:s,key:t,label:n?.label,weight:n?.weight??1,enabled:n?.enabled??!0};return r.keys.push(i),this.runtimeStates.set(s,this.createInitialState()),s}removeKey(e){for(let t of this.pools.values()){let n=t.keys.findIndex(r=>r.id===e);if(n!==-1){t.keys.splice(n,1),this.runtimeStates.delete(e);return}}}updateKey(e,t){for(let n of this.pools.values()){let r=n.keys.find(s=>s.id===e);if(r){if(t.label!==void 0&&(r.label=t.label),t.weight!==void 0&&(r.weight=t.weight),t.enabled!==void 0){r.enabled=t.enabled;let s=this.runtimeStates.get(e);s&&(s.healthStatus=t.enabled?"healthy":"disabled")}return}}}setKeyHealth(e,t){let n=this.runtimeStates.get(e);n&&(n.healthStatus=t)}setStrategy(e,t){let n=this.pools.get(e);n&&(n.strategy=t)}setRateLimit(e,t){let n=this.pools.get(e);n&&(n.rateLimit=t)}getPoolStatus(e){let t=this.pools.get(e);return t?this.buildPoolStatus(t):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 t=this.pools.get(e);return t?this.getHealthyCandidates(t,Date.now()).length>0:!1}exportConfig(){return[...this.pools.values()]}reloadConfig(e){let t=new Set;for(let n of e){this.pools.set(n.providerId,n);for(let r of n.keys)t.add(r.id),this.runtimeStates.has(r.id)||this.runtimeStates.set(r.id,this.createInitialState())}for(let n of[...this.pools.keys()])e.some(r=>r.providerId===n)||this.pools.delete(n);for(let n of[...this.runtimeStates.keys()])t.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,t){let n=[];for(let r of e.keys){if(!r.enabled)continue;let s=this.runtimeStates.get(r.id);if(s){if(s.healthStatus==="cooldown")if(t>=s.cooldownUntil)s.healthStatus="healthy",s.consecutiveErrors=0;else continue;s.healthStatus!=="disabled"&&(e.rateLimit?.rpm&&(this.pruneWindow(s.requestTimestamps,t),s.requestTimestamps.length>=e.rateLimit.rpm*.9)||e.rateLimit?.tpm&&(this.pruneWindow(s.tokenCounts,t),s.tokenCounts.reduce((a,l)=>a+l,0)>=e.rateLimit.tpm*.9)||n.push(r))}}return n}selectByStrategy(e,t,n){if(e.length===0)return null;if(e.length===1)return e[0];switch(t){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 t=e.reduce((r,s)=>r+s.weight,0),n=Math.random()*t;for(let r of e)if(n-=r.weight,n<=0)return r;return e[e.length-1]}leastBusy(e){let t=1/0,n=e[0];for(let r of e){let i=this.runtimeStates.get(r.id)?.inFlight??0;(i<t||i===t&&r.weight>n.weight)&&(t=i,n=r)}return n}pruneWindow(e,t){let n=t-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(t=>{let n=this.runtimeStates.get(t.id)??this.createInitialState();return{...t,inFlight:n.inFlight,totalRequests:n.totalRequests,totalTokens:n.totalTokens,lastUsedAt:n.lastUsedAt,lastErrorAt:n.lastErrorAt,consecutiveErrors:n.consecutiveErrors,cooldownUntil:n.cooldownUntil,healthStatus:t.enabled?n.healthStatus:"disabled"}})}}}});var cp={};fn(cp,{ALL_PURPOSES:()=>Lo,ModelRegistry:()=>zr,deriveModelPurposes:()=>lw,getModelRegistry:()=>J,resetModelRegistry:()=>aw});import*as et from"node:fs";function J(){return Do||(Do=new zr,Do.load()),Do}function aw(){Do=null}function lw(o){let e=[];switch((!o.mediaType||o.mediaType==="image_understanding"||o.mediaType==="video_understanding")&&e.push("textGeneration"),(o.vision||o.mediaType==="image_understanding")&&e.push("imageUnderstanding"),o.mediaType==="video_understanding"&&e.push("videoUnderstanding"),o.mediaType){case"image":e.push("imageGeneration");break;case"video":e.push("videoGeneration");break;case"tts":e.push("tts");break;case"stt":e.push("stt");break;case"music":case"music_realtime":e.push("musicGeneration");break;case"voice_clone":e.push("voiceClone");break;case"embedding":e.push("embedding");break;case"3d":e.push("threeDGeneration");break;case"realtime_audio":e.push("realtimeAudio");break}return e.includes("textGeneration")&&e.push("smallModel"),[...new Set(e.length>0?e:["textGeneration"])]}function cw(o){switch(o){case"openai-chat":case"openai-responses":case"anthropic-messages":case"volcengine-responses":return o;default:return}}var Lo,zr,Do,mt=N(()=>{"use strict";an();le();lp();Lo=["textGeneration","smallModel","stt","tts","imageGeneration","imageUnderstanding","videoGeneration","videoUnderstanding","threeDGeneration","embedding","voiceClone","musicGeneration","realtimeAudio","realtimeVideo"],zr=class{keyPool;coreProviderRegistry=new sn;providerVariantResolver=new _o(this.coreProviderRegistry);models=new Map;modelEnabledOverrides=new Map;bindings={};settingsPath;changeListeners=[];constructor(e){this.settingsPath=pt(),this.keyPool=new Kr(e?.providers),e?.models&&this.loadModelState(e.models),e?.bindings&&(this.bindings={...e.bindings})}getActiveModel(e){let t=this.bindings[e];if(!t)return null;let n=this.models.get(t);if(!n||!n.enabled)return null;let r=this.resolveTechnicalVariant(n,e),s=r?.provider??n.provider,i=r?.nativeModelId??n.nativeModelId??n.model,a=this.acquireKeyForProviderVariant(s);if(!a)return null;let{keyHandle:l,keyProviderId:c}=a;return{provider:s,model:i,apiKey:l.apiKey,baseUrl:n.provider===s?n.baseUrl??this.getProviderBaseUrl(s)??this.getProviderBaseUrl(c):this.getProviderBaseUrl(s),keyHandle:l}}peekActiveModel(e){let t=this.bindings[e];return t?this.models.get(t)??null:null}isAvailable(e){let t=this.peekActiveModel(e);return!!t?.enabled&&this.hasAvailableKeyForProviderVariant(t.provider)}resolveModelForPurpose(e){let t=this.peekActiveModel(e);return t?t.model:null}addProvider(e,t){this.keyPool.addProvider(e,t),this.emitChange()}removeProvider(e){this.keyPool.removeProvider(e);for(let[t,n]of this.models)n.provider===e&&this.removeModel(t);this.emitChange()}addKey(e,t,n){let r=this.keyPool.addKey(e,t,n);return this.emitChange(),r}removeKey(e){this.keyPool.removeKey(e),this.emitChange()}updateKey(e,t){this.keyPool.updateKey(e,t),this.emitChange()}setKeyHealth(e,t){this.keyPool.setKeyHealth(e,t),this.emitChange()}setStrategy(e,t){this.keyPool.setStrategy(e,t),this.emitChange()}addModel(e){let t=e.id??`${e.provider}:${e.model}`;return this.models.set(t,{...e,id:t,enabled:this.modelEnabledOverrides.get(t)??e.enabled}),this.emitChange(),t}replaceCatalogModels(e){let t=new Map;for(let n of e)t.set(n.id,{...n,enabled:this.modelEnabledOverrides.get(n.id)??n.enabled});for(let n of this.modelEnabledOverrides.keys())t.has(n)||this.modelEnabledOverrides.delete(n);this.models=t;for(let[n,r]of Object.entries(this.bindings))r&&!this.models.has(r)&&delete this.bindings[n];this.emitChange()}migrateModelIds(e){for(let[t,n]of e){let r=this.modelEnabledOverrides.get(t);r!==void 0&&!this.modelEnabledOverrides.has(n)&&this.modelEnabledOverrides.set(n,r),this.modelEnabledOverrides.delete(t);for(let[s,i]of Object.entries(this.bindings))i===t&&(this.bindings[s]=n)}this.emitChange()}removeModel(e){this.models.delete(e),this.modelEnabledOverrides.delete(e);for(let[t,n]of Object.entries(this.bindings))n===e&&delete this.bindings[t];this.emitChange()}enableModel(e){let t=this.models.get(e);t&&(t.enabled=!0),this.modelEnabledOverrides.set(e,!0),this.emitChange()}disableModel(e){let t=this.models.get(e);t&&(t.enabled=!1),this.modelEnabledOverrides.set(e,!1),this.emitChange()}listModels(e){let t=[...this.models.values()];return e?.purpose&&(t=t.filter(n=>n.purposes.includes(e.purpose))),e?.provider&&(t=t.filter(n=>n.provider===e.provider)),e?.enabledOnly&&(t=t.filter(n=>n.enabled)),t}getModel(e){return this.models.get(e)??null}setBinding(e,t){let n=this.models.get(t);if(!n)throw new Error(`Model "${t}" not found in pool.`);if(!n.purposes.includes(e))throw new Error(`Model "${t}" does not support purpose "${e}".`);this.bindings[e]=t,this.emitChange()}removeBinding(e){delete this.bindings[e],this.emitChange()}getBinding(e){let t=this.bindings[e];return t?this.models.get(t)??null:null}getAllBindings(){let e={};for(let t of Lo){let n=this.bindings[t];e[t]=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{et.existsSync(this.settingsPath)&&(e=JSON.parse(et.readFileSync(this.settingsPath,"utf-8")))}catch{e={}}delete e.provider,delete e.apiKey,delete e.model,delete e.baseUrl;let t={...e,providers:this.keyPool.exportConfig(),models:this.exportModelState(),bindings:{...this.bindings}},n=this.settingsPath.replace(/[/\\][^/\\]+$/,"");et.existsSync(n)||et.mkdirSync(n,{recursive:!0}),et.writeFileSync(this.settingsPath,JSON.stringify(t,null,2),"utf-8")}load(){try{if(!et.existsSync(this.settingsPath))return!1;let e=et.readFileSync(this.settingsPath,"utf-8"),t=JSON.parse(e);return t.providers&&this.keyPool.reloadConfig(t.providers),this.models.clear(),this.modelEnabledOverrides.clear(),t.models&&this.loadModelState(t.models),this.bindings=t.bindings??{},this.emitChange(),!0}catch{return!1}}exportConfig(){return{providers:this.keyPool.exportConfig(),models:this.exportModelState(),bindings:{...this.bindings}}}getTunable(e){try{if(!et.existsSync(this.settingsPath))return;let t=et.readFileSync(this.settingsPath,"utf-8");return JSON.parse(t).tunables?.[e]}catch{return}}getModelInfo(e,t){let n=this.listModels({provider:e}).find(r=>r.model===t);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(t=>!!this.keyPool.getPoolStatus(t)?.keys.some(r=>r.enabled))}hasAvailableKeyForProviderVariant(e){return this.providerVariantKeyCandidates(e).some(t=>this.keyPool.hasAvailableKey(t))}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(t=>({id:t.model,name:t.displayName,contextWindow:t.contextWindow,maxOutput:t.maxOutput,streamRequired:t.streamRequired}))}))}resolveProviderApiKey(e){return this.getKeyForProvider(e)??void 0}onChange(e){return this.changeListeners.push(e),()=>{let t=this.changeListeners.indexOf(e);t>=0&&this.changeListeners.splice(t,1)}}getKeyForProvider(e){let n=this.acquireKeyForProviderVariant(e)?.keyHandle;if(!n)return null;let r=n.apiKey;return n.release({success:!0}),r}snapshotProviderKeys(){let e={};for(let t of this.keyPool.getAllStatus()){let n=this.getKeyForProvider(t.providerId);n&&(e[t.providerId]=n)}return e}getProviderBaseUrl(e){return this.keyPool.getPoolStatus(e)?.baseUrl}acquireKeyForProviderVariant(e){for(let t of this.providerVariantKeyCandidates(e)){let n=this.keyPool.acquireKey(t);if(n)return{keyHandle:n,keyProviderId:t}}return null}resolveTechnicalVariant(e,t){let n=this.providerVariantKeyCandidates(e.provider).filter(s=>this.hasConfiguredKeyForProviderVariant(s));if(n.length===0)return;let r=this.providerVariantResolver.resolveBest({publicModel:e.model,requestedProtocol:cw(e.transport),purpose:t,userPreference:{providerIds:n}});if(r)return{provider:r.provider,nativeModelId:r.nativeModelId}}providerVariantKeyCandidates(e){let t=[e],n=this.coreProviderRegistry.getProvider(e),r=n?.group??n?.id??e;for(let s of this.coreProviderRegistry.listProviders())(s.group??s.id)===r&&t.push(s.id);return r!==e&&t.push(r),[...new Set(t)]}loadModelState(e){for(let t of e)typeof t.id!="string"||!t.id||typeof t.enabled=="boolean"&&this.modelEnabledOverrides.set(t.id,t.enabled)}exportModelState(){let e=new Map;for(let[t,n]of this.modelEnabledOverrides)e.set(t,n);for(let t of this.models.values())e.set(t.id,t.enabled);return[...e.entries()].map(([t,n])=>({id:t,enabled:n}))}emitChange(){for(let e of this.changeListeners)try{e()}catch{}}},Do=null});import{readFile as dw}from"node:fs/promises";function Sn(o){let e=typeof o.content=="string"?o.content:o.content!=null?JSON.stringify(o.content):"";return Math.ceil(e.length/4)}function Tn(o){let e=0;for(let t of o)e+=Sn(t);return e}function up(o){if(!o)return 128e3;if(o in tl)return tl[o];let e=o.toLowerCase();for(let[t,n]of Object.entries(tl))if(e.startsWith(t.toLowerCase()))return n;return 128e3}function pw(){return J().resolveModelForPurpose("textGeneration")??uw}function mp(){return ol}function mw(o,e){return async(t,n)=>{let r=e?.transport,s=e?.apiKey;if(!r||!s)return o.debug("[context-compression] no LLM transport for summarization \u2014 using sync fallback"),nl(t);try{let i="",a=e?.model??pw();for await(let l of r.stream({model:a,messages:[{role:"system",content:"You are a precise conversation summarizer."},{role:"user",content:n}],maxTokens:2e3,temperature:.3},s,AbortSignal.timeout(3e4)))l.type==="delta"&&(i+=l.text);return i||(o.warn("[context-compression] empty summary response"),nl(t))}catch(i){return o.warn({err:i.message},"[context-compression] summarize call error \u2014 using fallback"),nl(t)}}}function nl(o){let e=[],t=o.filter(s=>s.role==="user"),n=t.slice(0,20).map(s=>{let i=typeof s.content=="string"?s.content:JSON.stringify(s.content??"");return`- [user]: ${i.slice(0,300)}${i.length>300?"...":""}`});e.push(`## User Requests (${t.length} messages)`),e.push(...n);let r=o.filter(s=>s.role==="assistant");if(r.length>0){let s=r.slice(0,10).map(i=>{let a=typeof i.content=="string"?i.content:JSON.stringify(i.content??"");return`- [assistant]: ${a.slice(0,150)}${a.length>150?"...":""}`});e.push("",`## Assistant Responses (${r.length} total)`),e.push(...s)}return e.join(`
|
|
43
43
|
`)}function fw(){return ki(new bn(rl),new on(20,Sn),new Dn(Sn))}function dp(o,e){let t=vi(new bn(rl),new on(20,Sn),new fo({protectedHeadExchanges:1,protectedTailMessages:8,summarize:o,estimateTokens:Sn}),new Dn(Sn));return new go({inner:t,estimateTokens:Sn,onCacheInvalidated:e?.onCacheInvalidated})}function fp(o,e){let t=e?.budget??vr({modelContextWindow:up(e?.model)}),r=(e?.pipeline??fw()).compress(o,t);if(r.droppedCount>0){let s=Tn(o),i=Tn(r.messages);pp.record({timestamp:Date.now(),strategy:r.strategy,tokensBefore:s,tokensAfter:i,droppedCount:r.droppedCount,latencyMs:r.metrics?.latencyMs??0,usedLlm:!1,cacheInvalidated:r.metrics?.cacheInvalidated??!1,tier:ko(s,t)})}return r.droppedCount>0&&sl?.(r.droppedCount,Tn(r.messages)),r}async function gw(o,e,t){let n=t??vr({modelContextWindow:up(e.model)}),r=Tn(o),s=ko(r,n),i;switch(s){case"none":i={messages:o,droppedCount:0,strategy:"none"};break;case"trim-only":i=new bn(rl).compress(o,n);break;case"sliding-window":{i=await dp(e.summarize).compressAsync(o,n);break}case"llm-summarize":{let a=e.pipeline??dp(e.summarize);i=bo(a)?await a.compressAsync(o,n):a.compress(o,n);break}}return i.droppedCount>0&&(i={...i,messages:await Ti(i.messages,o,{maxFiles:5,maxTokenBudget:5e4,readFile:async a=>{try{return await dw(a,"utf-8")}catch{return null}}})}),hw(o,i,n),i}function hw(o,e,t){if(e.droppedCount>0||e.metrics?.usedLlm){let n=e.metrics?.tokensBefore||Tn(o),r=e.metrics?.tokensAfter||Tn(e.messages);pp.record({timestamp:Date.now(),strategy:e.strategy,tokensBefore:n,tokensAfter:r,droppedCount:e.droppedCount,latencyMs:e.metrics?.latencyMs??0,usedLlm:e.metrics?.usedLlm??!1,cacheInvalidated:e.metrics?.cacheInvalidated??!1,tier:ko(n,t)})}if(e.droppedCount>0){let n=e.metrics?.tokensAfter||Tn(e.messages);sl?.(e.droppedCount,n)}}function yw(o,e){let t=mw(o,e),n={id:"builtin-compressor",label:"4-Layer Compression Funnel (built-in)",async compressAsync(r,s,i){return gw(r,{budget:s,model:i?.model,sessionId:i?.sessionId,summarize:t},s)}};ol.register(n),ol.activate(n.id),o.info(`[context-compression] registered context engine: ${n.id}`)}function gp(o,e,t){yw(e,t),o.register({point:"context.before_compact",priority:50,label:"context-compression-bridge",handler:(n,r)=>{let s=r.messageCount;return s&&s>0&&e.debug(`[context-compression] before_compact: ${s} messages entering compression`),{action:"continue"}}}),sl=(n,r)=>{e.debug(`[context-compression] after_compact: removed ${n}, ${r} tokens remaining`),o.invoke("context.after_compact",{sessionId:"",turnId:"",removedCount:n,tokenCount:r}).catch(()=>{})}}var tl,rl,uw,pp,ol,sl,il=N(()=>{"use strict";$n();mt();tl={"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};rl=8e3,uw="deepseek-v4-flash";pp=new ho(200),ol=new yo;sl=null});function hp(o,e,t){let n=t-e;return`[Budget] ${Math.round(o)}% used (${e.toLocaleString()} / ${t.toLocaleString()} tokens). ${n.toLocaleString()} tokens remaining. `+(o>=90?"Wrap up your current taskyou are near the token limit.":"Continue workingdo not summarize prematurely.")}var yp=N(()=>{"use strict"});var bp={};fn(bp,{resolveToolEligibility:()=>Tw});function kw(o,e){if(bw.some(t=>t.test(o)))return!0;if(e)for(let t of e)try{if(new RegExp(t,"i").test(o))return!0}catch{}return!1}function vw(o,e){let t=o.function.name,n=o.meta,r=[];return e.blockedToolNames?.includes(t)?(r.push("policy_blocked"),{level:5,reasons:r}):n?.isReadOnly?(r.push("always_allowed"),{level:1,reasons:r}):n?.requiresApproval?(r.push("approval_required"),{level:4,reasons:r}):n?.isDangerous||kw(t,e.dangerousPatterns)?(r.push("dangerous_tool"),{level:3,reasons:r}):{level:2,reasons:r}}function Sw(o){switch(o){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 Tw(o,e={}){let t=new Map,n=[],r=[],s=[];for(let i of o){let a=i.function.name,{level:l,reasons:c}=vw(i,e),d=Sw(l),u={toolName:a,status:d,permissionLevel:l,approvalRequired:l===4,reasonCodes:c};t.set(a,u),l===5?r.push(u):(n.push(i),l===4&&s.push(u))}return{eligibleTools:n,blockedTools:r,approvalRequiredTools:s,eligibilityByName:t}}var bw,kp=N(()=>{"use strict";bw=[/^(?:bash|shell|exec|terminal|run_command)$/i,/^(?:write_file|delete_file|move_file|create_directory)$/i,/^(?:git_push|git_reset|git_force)$/i]});function _w(o){let e=o.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 Aw(o){let e=o.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]}function Cw(o){if(!Iw.has(o.toolName))return!1;let e=typeof o.message?.content=="string"?o.message.content.trim():"";return e.length>0&&e.length<200&&Pw.test(e)}function vp(o,e){for(let t=o.length-1;t>=0;t--){let n=o[t];if(!n||n.role!=="tool")continue;let r=typeof n.content=="string"?n.content:"";if(r.startsWith("Error: "))return r.slice(7).trim()}}function Ew(o){return typeof o=="number"&&Number.isFinite(o)&&o>=1?Math.min(Math.round(o),100):Pi}function Sp(o){let e=o.message.toLowerCase();return o.status===413||e.includes("prompt_too_long")||e.includes("context_length_exceeded")||e.includes("maximum context length")}function Mw(o){return o==="length"||o==="max_tokens"}function Tp(o){let e=o.message.toLowerCase();return(e.includes("image")||e.includes("media")||e.includes("file too large")||e.includes("payload too large"))&&(o.status===413||e.includes("too large")||e.includes("size"))}function Ow(o){let e=o.headers;if(!e)return null;let t=e["retry-after"]??e["Retry-After"];if(!t)return null;let n=parseInt(t,10);return!isNaN(n)&&n>0?n*1e3:null}function Dw(o){if(o.status!==400)return null;let e=o.message.match(/input length and `max_tokens` exceed context limit: (\d+) \+ (\d+) > (\d+)/);if(!e?.[1]||!e?.[3])return null;let t=parseInt(e[1],10),n=parseInt(e[3],10);if(isNaN(t)||isNaN(n))return null;let r=n-t-1e3;return r>=3e3?r:null}function Lw(o){return o.filter(e=>e.role!=="assistant"?!0:!(typeof e.content=="string"&&e.content.trim()===""))}async function*wp(o,e,t,n){let{turnId:r,sessionId:s,messages:i,tools:a,model:l,apiKey:c,temperature:d=0,hooks:u,signal:p}=o,m={sessionId:s,turnId:r},h=o.maxTurns??0,f=o.querySource,{resolveToolEligibility:y}=await Promise.resolve().then(()=>(kp(),bp)),b=y(a,o.toolEligibilityContext),k=b.eligibleTools;for(let j of b.blockedTools)yield{type:"tool_blocked",turnId:r,callId:"",name:j.toolName,reason:"blocked-by-policy"};if(!k.length){yield*Nw(r,l,i,c,d,p,e,n);return}let x=Ew(o.maxRounds),I={contextWindowTokens:o.contextWindowTokens??Ei,responseBufferTokens:Mi,maxOutputTokens:o.maxOutputTokens??Oi,abortSignal:p,reactiveCompactEnabled:!0,outputEscalationEnabled:!0},P=new Set,O=0,$=k,W,S={messages:[...i],maxOutputTokensRecoveryCount:0,hasAttemptedReactiveCompact:!1,maxOutputTokensOverride:void 0,turnCount:1,transition:void 0,guardState:Pa(I),reactiveCompactState:Oa(),toolLoopState:_r({maxRounds:x,replayMessages:[...i]}).state,consecutiveFailedRounds:0,finalText:"",totalUsage:{inputTokens:0,outputTokens:0},collapseStore:Ri(),currentModel:l,consecutive529Errors:0,consecutiveApiRetries:0,stopHookActive:void 0,lastResponseId:void 0,snipRemovedIds:new Set,contentReplacementState:Hu(),budgetContinuationCount:0,lastBudgetDeltaTokens:0,lastBudgetGlobalTokens:0,identicalCallCounts:new Map,toolFailureCounts:new Map,fileReadCounts:new Map},ce=Math.max(h*5,200),de=0;for(;;){if(de++,de>ce){n.info(`hard iteration cap reached (${ce}), forcing completion`);let A=S.finalText||No(S.messages,n);yield{type:"end",turnId:r,content:A,usage:S.totalUsage,model:S.currentModel};return}let{messages:j,maxOutputTokensRecoveryCount:ve,hasAttemptedReactiveCompact:ie,maxOutputTokensOverride:$e,turnCount:ne,guardState:Q,reactiveCompactState:T,collapseStore:F}=S,{toolLoopState:B}=S;if(W){try{let A=await W;A&&(yield{type:"tool_use_summary",turnId:r,summary:A})}catch{}W=void 0}if(o.refreshTools&&ne>1){let A=o.refreshTools();A!==$&&($=A,n.debug(`tools refreshed: ${A.length} tools`))}if(Ma(Q,I)){n.info(`turn aborted by guard at turn ${ne}`),yield{type:"error",turnId:r,error:"Turn aborted",code:"ABORTED",usage:S.totalUsage};return}let Re=Ia(Q,I);if(Re.level==="blocking"){Re.reason==="prompt_too_long"&&Nn(T)&&(T.attemptedThisTurn=!0,Q.hasAttemptedReactiveCompact=!0,n.info(`token budget blocking (${Re.reason}), reactive compact needed`),yield{type:"recovery",turnId:r,action:"reactive_compact",detail:"token budget pre-check"}),n.info(`token budget blocking (${Re.reason}), ending tool loop`);break}Re.level==="warning"&&n.info(`token budget warning: ${Re.usagePercent}% used, ${Re.remainingTokens} remaining`);let he;{let A=await Xu(j,S.contentReplacementState,s);he=A.messages,A.newlyReplacedCount>0&&(n.info(`tool-result-budget: persisted ${A.newlyReplacedCount} oversized tool results`),yield{type:"recovery",turnId:r,action:"tool_result_budget",detail:`${A.newlyReplacedCount} persisted`})}{let A=wi(he,S.snipRemovedIds);he=A.messages,A.removedCount>0&&(n.info(`snip: removed ${A.removedCount} messages, freed ~${A.tokensFreed} tokens`),yield{type:"recovery",turnId:r,action:"snip",detail:`${A.removedCount} messages`})}{let E=new on().compress(he,0);E.droppedCount>0&&(he=E.messages,n.info(`microcompact: cleared ${E.droppedCount} old tool results`))}if(he=_i(he,F).messages,Q.promptTokens>0){let A=I.contextWindowTokens*.75,E=mp().getActive(),L;E?L=await E.compressAsync(he,A,{model:S.currentModel,sessionId:s}):L=fp(he,{budget:A,model:S.currentModel}),L.droppedCount>0&&(he=L.messages,n.info(`autocompact: ${L.strategy}, dropped ${L.droppedCount}`),yield{type:"recovery",turnId:r,action:"autocompact",detail:`${L.strategy}: ${L.droppedCount} dropped`},S.hasAttemptedReactiveCompact=!1,u?.invoke("context.after_compact",{...m,removedCount:L.droppedCount}).catch(()=>{}))}he=Lw(he);let Ut=ga({tools:$,toolChoice:o.toolChoice??"auto"}),g=_r({maxRounds:x,replayMessages:he,lastStopReason:B.lastStopReason,options:{stopReason:B.lastStopReason}}),v=Ut.extraSystemPrompt?[{role:"system",content:Ut.extraSystemPrompt},...g.state.replayMessages]:g.state.replayMessages;B=g.state,g.recoveryActions.length>0&&n.debug(`tool loop recovery: ${g.recoveryActions.map(A=>A.detail??A.kind).join("; ")}`),n.debug(`turn ${ne}, messages: ${v.length}`),u?.invoke("turn.before_inference",{...m,model:S.currentModel}).catch(()=>{});let _=!1,C=[],R=new Map,U="stop",D,M=null,V=!1,ae=[],ee=[];try{for await(let A of e.stream({model:S.currentModel,messages:v,tools:Ut.tools,toolChoice:Ut.normalizedToolChoice??"auto",temperature:d,maxTokens:($e??Q.currentMaxOutputTokens)||void 0,streamRequired:o.streamRequired,previousResponseId:S.lastResponseId,reasoning:o.reasoning,promptCacheKey:o.promptCacheKey,promptCacheRetention:o.promptCacheRetention,serviceTier:o.serviceTier,openaiBuiltinTools:o.openaiBuiltinTools,maxToolCalls:o.maxToolCalls,parallelToolCalls:o.parallelToolCalls,textVerbosity:o.textVerbosity},c,p))switch(A.type){case"delta":C.push(A.text),_||(yield{type:"delta",turnId:r,text:A.text});break;case"tool_call_delta":_=!0,Da(R,A);break;case"reasoning_delta":ae.push(A.text);break;case"reasoning_block_complete":A.signature&&ee.push({thinking:ae.join(""),signature:A.signature}),ae.length=0;break;case"usage":D={inputTokens:A.promptTokens,outputTokens:A.completionTokens,reasoningTokens:A.reasoningTokens,cacheRead:A.cacheReadTokens,cacheWrite:A.cacheCreationTokens};break;case"response_id":S.lastResponseId=A.id;break;case"annotations":yield{type:"annotations",turnId:r,annotations:A.annotations};break;case"builtin_tool_status":yield{type:"heartbeat",turnId:r,message:`${A.toolType}: ${A.event}`};break;case"done":U=A.finishReason;break}if(_||u?.invoke("turn.after_inference",{...m,model:S.currentModel}).catch(()=>{}),o.postSamplingHooks&&o.postSamplingHooks.length>0){let A=S.currentModel;for(let E of o.postSamplingHooks)try{E({messages:[...he],model:A,sessionId:s})}catch{}}}catch(A){if(A instanceof So&&o.fallbackModel){n.info(`model fallback triggered: ${A.originalModel} \u2192 ${A.fallbackModel}`),yield{type:"recovery",turnId:r,action:"model_fallback",detail:`${A.originalModel} \u2192 ${A.fallbackModel}`},S={...S,currentModel:A.fallbackModel,consecutive529Errors:0,consecutiveApiRetries:0,transition:void 0};continue}let E=A instanceof Error?A.message:String(A),L=typeof A?.status=="number"?A.status:void 0;if(!L&&E&&(E.includes("ECONNRESET")||E.includes("EPIPE"))){let re=(S.consecutiveApiRetries??0)+1;if(re>Ln){n.info(`stale connection retry limit reached (${Ln}), aborting`),yield{type:"error",turnId:r,error:E,code:"RETRIES_EXHAUSTED",usage:S.totalUsage};return}n.info(`stale connection (${E.includes("ECONNRESET")?"ECONNRESET":"EPIPE"}): retrying`),yield{type:"recovery",turnId:r,action:"stale_connection_retry",detail:E.slice(0,80)},S={...S,consecutiveApiRetries:re,transition:void 0};continue}let G=Dw({status:L,message:E});if(G!==null){n.info(`max_tokens overflow: adjusting to ${G}`),Q.currentMaxOutputTokens=G,S={...S,maxOutputTokensOverride:G,transition:void 0};continue}if(wa(L)){S.consecutive529Errors++;let re=2,_e=o.fallbackModel&&S.currentModel!==o.fallbackModel;if(S.consecutive529Errors>re&&!_e&&!Pr()){n.info(`transient ${L} \xD7 ${S.consecutive529Errors}: hard limit reached, aborting`),yield{type:"error",turnId:r,error:`API unavailable after ${S.consecutive529Errors} consecutive ${L} errors`,code:"API_ERROR",usage:S.totalUsage};return}if(S.consecutive529Errors>=Bi&&o.fallbackModel&&S.currentModel!==o.fallbackModel){n.info(`529 \xD7 ${S.consecutive529Errors}: triggering fallback to ${o.fallbackModel}`),yield{type:"recovery",turnId:r,action:"model_fallback",detail:`529 \xD7 ${S.consecutive529Errors}`},S={...S,currentModel:o.fallbackModel,consecutive529Errors:0,transition:void 0};continue}if(Pr()){let Z=Ar(S.consecutive529Errors);n.info(`persistent retry: waiting ${Z}ms (attempt ${S.consecutive529Errors})`);let ye=Z;for(;ye>0;){if(p?.aborted){yield{type:"error",turnId:r,error:"Aborted during retry wait",code:"ABORTED",usage:S.totalUsage};return}yield{type:"heartbeat",turnId:r,message:`Retrying in ${Math.ceil(ye/1e3)}s (${L})`};let it=Math.min(ye,Fi);await new Promise(mi=>setTimeout(mi,it)),ye-=it}S={...S,transition:void 0};continue}if(Ta(f)){let ye=Ow({status:L,message:E})??Ar(S.consecutive529Errors);n.info(`transient ${L}: retry in ${ye}ms`),yield{type:"recovery",turnId:r,action:"retry",detail:`${L} retry in ${ye}ms`},await new Promise(it=>setTimeout(it,ye)),S={...S,transition:void 0};continue}n.info(`background source ${f}: not retrying ${L}`)}M={status:L,message:E}}if(M&&u?.invoke("turn.after_inference",{...m,model:S.currentModel,response:{error:M.message}}).catch(()=>{}),M)if(Sp(M))V=!0,n.info(`withheld prompt_too_long error (status=${M.status})`);else if(Tp(M))V=!0,n.info(`withheld media_size error (status=${M.status})`);else{let A=Ca({status:M.status??500,message:M.message},Q,I);if(A.action==="reactive_compact"&&Nn(T)&&(T.attemptedThisTurn=!0,Q.hasAttemptedReactiveCompact=!0,yield{type:"recovery",turnId:r,action:"reactive_compact",detail:`API ${M.status??500}: ${M.message}`}),A.action==="retry"){let L=(S.consecutiveApiRetries??0)+1;if(L>Ln){n.info(`API retry limit reached (${Ln}), aborting`);let G=On(M.status,M.message);yield{type:"error",turnId:r,error:M.message,code:G,usage:S.totalUsage};return}yield{type:"recovery",turnId:r,action:"retry",detail:A.reason},S={...S,consecutiveApiRetries:L,transition:void 0};continue}let E=On(M.status,M.message);u?.invoke("stop.failure",{sessionId:s,reason:E,error:M.message}).catch(()=>{}),yield{type:"error",turnId:r,error:M.message,code:E,usage:S.totalUsage};return}D&&(S.totalUsage.inputTokens+=D.inputTokens,S.totalUsage.outputTokens+=D.outputTokens,D.reasoningTokens&&(S.totalUsage.reasoningTokens=(S.totalUsage.reasoningTokens??0)+D.reasoningTokens),D.cacheRead&&(S.totalUsage.cacheRead=(S.totalUsage.cacheRead??0)+D.cacheRead),D.cacheWrite&&(S.totalUsage.cacheWrite=(S.totalUsage.cacheWrite??0)+D.cacheWrite)),D?.inputTokens&&(Q.promptTokens=D.inputTokens);let oe=C.join("");oe&&(S.finalText=oe);let me=[...R.values()].map(A=>({id:A.id||`tc_${r}_${ne}_${Math.random().toString(36).slice(2,8)}`,type:"function",function:{name:A.name,arguments:A.arguments}}));if(me.length===0&&!_){if(V&&M&&Sp(M)){if(S.transition?.reason!=="collapse_drain_retry"){let L=Ai(he,F);if(L.committed>0){n.info(`collapse drain: committed ${L.committed} stages`),yield{type:"recovery",turnId:r,action:"collapse_drain",detail:`${L.committed} stages committed`},S={...S,messages:L.messages,transition:{reason:"collapse_drain_retry",committed:L.committed}};continue}}if(Nn(T)){T.attemptedThisTurn=!0,Q.hasAttemptedReactiveCompact=!0,n.info("withheld 413: reactive compact attempt"),yield{type:"recovery",turnId:r,action:"reactive_compact",detail:"withheld prompt_too_long"},S={...S,hasAttemptedReactiveCompact:!0,transition:{reason:"reactive_compact_retry"}};continue}n.info("withheld 413: recovery exhausted, surfacing error"),u?.invoke("stop.failure",{sessionId:s,reason:"prompt_too_long",error:M.message}).catch(()=>{}),yield{type:"error",turnId:r,error:M.message,code:"PROMPT_TOO_LONG",usage:S.totalUsage};return}if(V&&M&&Tp(M)){if(Nn(T)){T.attemptedThisTurn=!0,Q.hasAttemptedReactiveCompact=!0,n.info("withheld media error: reactive compact strip-retry"),yield{type:"recovery",turnId:r,action:"reactive_compact",detail:"media error strip-retry"},S={...S,hasAttemptedReactiveCompact:!0,transition:{reason:"reactive_compact_retry"}};continue}n.info("withheld media error: recovery exhausted"),u?.invoke("stop.failure",{sessionId:s,reason:"media_error",error:M.message}).catch(()=>{}),yield{type:"error",turnId:r,error:M.message,code:"IMAGE_ERROR",usage:S.totalUsage};return}if(Mw(U)){Q.consecutiveTruncations+=1;let L=o.modelMaxOutputTokens??Di,G=Ea(Q,I,L);if(G.shouldEscalate&&$e===void 0){Q.currentMaxOutputTokens=G.newMax,n.info(`max_output_tokens escalate: ${G.newMax} tokens`),yield{type:"recovery",turnId:r,action:"output_escalation",detail:`${G.newMax} tokens`},S={...S,maxOutputTokensOverride:Ni,transition:{reason:"max_output_tokens_escalate"}};continue}if(ve<Li){let re={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 #${ve+1}`),yield{type:"recovery",turnId:r,action:"max_output_tokens_recovery",detail:`attempt ${ve+1}`},S={...S,messages:[...he,re],maxOutputTokensRecoveryCount:ve+1,maxOutputTokensOverride:void 0,transition:{reason:"max_output_tokens_recovery",attempt:ve+1}};continue}n.info("max_output_tokens recovery exhausted, completing with partial content")}else Q.consecutiveTruncations=0;if(B=Rr(B,{replayMessages:j,lastStopReason:"completed"}),u){let L=await u.invoke("stop",{sessionId:s,reason:"completed"});if(L.action==="prevent"){n.info(`stop hook prevented continuation: ${L.reason??"no reason"}`),yield{type:"end",turnId:r,content:S.finalText,usage:S.totalUsage,model:S.currentModel};return}if(L.action==="abort"){let G=L.reason??"Stop hook requested continuation";n.info(`stop hook blocking: ${G}`);let re={role:"user",content:G},_e={role:"assistant",content:S.finalText,...ee.length>0&&{thinkingBlocks:[...ee]}};S={...S,messages:[...j,_e,re],stopHookActive:!0,transition:{reason:"stop_hook_blocking"}};continue}}if(o.tokenBudget&&o.tokenBudget>0&&S.budgetContinuationCount<5){let L=S.totalUsage.inputTokens+S.totalUsage.outputTokens+(S.totalUsage.reasoningTokens??0),G=L/o.tokenBudget*100,re=L-S.lastBudgetGlobalTokens,_e=S.budgetContinuationCount>=$i&&re<Tr&&S.lastBudgetDeltaTokens<Tr;if(_e&&n.info(`token budget early stop: diminishing returns at ${Math.round(G)}% (delta=${re})`),!_e&&G<90){let Z=S.budgetContinuationCount+1,ye={role:"user",content:hp(G,L,o.tokenBudget)};n.info(`token budget continuation #${Z}: ${Math.round(G)}% used`),yield{type:"recovery",turnId:r,action:"budget_continuation",detail:`${Math.round(G)}% used (#${Z})`};let it={role:"assistant",content:S.finalText,...ee.length>0&&{thinkingBlocks:[...ee]}};S={...S,messages:[...j,it,ye],budgetContinuationCount:Z,lastBudgetDeltaTokens:re,lastBudgetGlobalTokens:L,transition:{reason:"token_budget_continuation"}};continue}}if(!S.stopHookActive){let L=i.find(Z=>Z.role==="user"),G=typeof L?.content=="string"?L.content:"",re=/创建文件|生成文件|写入|写一个|建一个|新建|重写|改写|create\s+(a\s+)?file|write\s+(a\s+)?file|make\s+(a\s+)?file|修改|改成|把.*改|文件名叫/i.test(G),_e=P.has("write")||P.has("edit");if(re&&!_e){if(n.info("AP1 action-verification: user requested file action but no write/edit tool was called, injecting nudge"),O>0){let it=[...j].reverse().find(mi=>mi.role==="tool");it&&typeof it.content=="string"&&(it.content+=`
|
|
44
44
|
|
|
45
45
|
\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 Z={role:"user",content:O===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."},ye={role:"assistant",content:S.finalText,...ee.length>0&&{thinkingBlocks:[...ee]}};S={...S,messages:[...j,ye,Z],stopHookActive:!0,transition:{reason:"stop_hook_blocking"}};continue}}if(!S.stopHookActive&&O>=3&&P.has("write")){let L=0;for(let G of j){let re=G,_e=re.is_error===!0||typeof re.content=="string"&&re.content.startsWith("Error:");re.role==="tool"&&typeof re.content=="string"&&!_e&&L++}if(L>=3){n.info("AP3 verification nudge: 3+ files created, injecting completeness check");let G={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."},re={role:"assistant",content:S.finalText,...ee.length>0&&{thinkingBlocks:[...ee]}};S={...S,messages:[...j,re,G],stopHookActive:!0,transition:{reason:"stop_hook_blocking"}};continue}}if(O>0){let L={ok:!0,toolCallCount:O,distinctToolCount:P.size,multiStep:O>=2,hasSubAgent:!1,feedback:null,existingSkillName:null},G=vo(L,{tools:[...P],projectRoot:o.projectRoot});G&&(yield{type:"skill_instruction",turnId:r,instruction:G})}let E=S.finalText||No(j,n);yield{type:"end",turnId:r,content:E,usage:S.totalUsage,model:S.currentModel};return}let We=ee.length===0&&ae.length>0?ae.join(""):void 0;j.push(hi(me,S.finalText||void 0,ee.length>0?ee:void 0,We)),B=Sa(B,{replayMessages:j,pendingToolCallIds:me.map(A=>A.id),completedToolCallIds:B.completedToolCallIds,lastStopReason:"tool_calls"});let Ee=S.identicalCallCounts,tn=[],ge=[],jt=!1;for(let A of me){let E=`${A.function.name}::${A.function.arguments}`,L=Ee.get(E)??0;Ee.set(E,L+1),L+1>Ci?(ge.push(A),jt||(jt=!0,n.info(`AP4 blocked: ${A.function.name} repeated ${L+1}x`))):tn.push(A)}let xt=[];for(let A of ge){let E=Ee.get(`${A.function.name}::${A.function.arguments}`),L=vp(j,A.function.name),G=L?`This exact tool call has been attempted ${E} times. Last error: ${L}. Do not retry. Report this error to the user.`:`This exact tool call has been attempted ${E} times and keeps failing. Do not retry it. Report the issue to the user or try a completely different approach.`,re=nn(A.id,{ok:!1,error:G});j.push(re),xt.push(A.id),P.add(A.function.name),O++,yield{type:"tool_result",turnId:r,callId:A.id,name:A.function.name,ok:!1,error:G}}if(ge.length>0){let A=vp(j,ge[0].function.name),E={role:"user",content:"Tool calls were blocked because you repeated them with identical arguments too many times. "+(A?`The error was: "${A}". Tell the user about this error. `:"The operation is not working. ")+"Stop retrying and report the result to the user."};j.push(E)}let Ke=[],ui=[];for(let A of tn)(S.toolFailureCounts.get(A.function.name)??0)>=Sr?ui.push(A):Ke.push(A);if(ui.length>0){for(let E of ui){let L=S.toolFailureCounts.get(E.function.name),G=`Tool "${E.function.name}" has failed ${L} times this turn with different arguments. The target likely does not exist. Stop trying variations and report the issue to the user.`,re=nn(E.id,{ok:!1,error:G});j.push(re),xt.push(E.id),P.add(E.function.name),O++,yield{type:"tool_result",turnId:r,callId:E.id,name:E.function.name,ok:!1,error:G},n.info(`AP4-variant blocked: ${E.function.name} failed ${L}x with different args`)}let A={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."};j.push(A)}for(let A of Ke){let E=A.function.arguments,L=$.find(G=>G.function.name===A.function.name);if(L?.backfillObservableInput)try{let G=JSON.parse(A.function.arguments),re={...G};L.backfillObservableInput(re),Object.keys(re).some(Z=>!(Z in G))&&(E=JSON.stringify(re))}catch{}yield{type:"tool_call",turnId:r,callId:A.id,name:A.function.name,arguments:E}}let Dk=new Map(S.toolFailureCounts);try{let A=new Vr({toolInvoker:t,hooks:u,sessionId:s,turnId:r,log:n,signal:p,maxConcurrentTools:o?.maxConcurrentTools});for(let E of Ke)A.addTool(E);for await(let E of A.getRemainingResults()){E.blocked&&(yield{type:"tool_blocked",turnId:r,callId:E.callId,name:E.toolName,reason:E.blockReason??"blocked"}),j.push(E.message),xt.push(E.callId),P.add(E.toolName),O++;let L=E.ok&&Cw(E);if(!E.ok||L){let Z=(S.toolFailureCounts.get(E.toolName)??0)+1;S.toolFailureCounts.set(E.toolName,Z)}if(E.ok&&E.toolName==="read"){let _e=Ke.find(Z=>Z.id===E.callId);if(_e)try{let Z=JSON.parse(_e.function.arguments),ye=Z.file_path??Z.path??Z.filePath??"";if(ye){let it=S.fileReadCounts.get(ye)??0;S.fileReadCounts.set(ye,it+1)}}catch{}}let G=typeof E.message?.content=="string"?E.message.content:"",re=E.ok&&G?G.slice(0,2e3):void 0;if(yield{type:"tool_result",turnId:r,callId:E.callId,name:E.toolName,ok:E.ok,error:E.error,outputPreview:re},E.ok){let _e=me.find(Z=>Z.id===E.callId);if(_e){if(E.toolName==="plan_mode")try{let Z=JSON.parse(_e.function.arguments);Z.action==="exit"&&typeof Z.plan=="string"&&Z.plan.length>0&&(yield{type:"plan_update",turnId:r,slug:"approved-plan",content:Z.plan})}catch{}if(Rw.has(E.toolName))try{let Z=JSON.parse(_e.function.arguments),ye=typeof Z.file_path=="string"?Z.file_path:typeof Z.filePath=="string"?Z.filePath:typeof Z.path=="string"?Z.path:void 0;ye&&(yield{type:"artifact",turnId:r,artifactId:`artifact-${E.callId}`,artifactType:_w(ye),title:ye.split(/[\\/]/).pop()||ye,filePath:ye,language:Aw(ye)})}catch{}}}}}catch(A){let E=A instanceof Error?A.message:String(A);yield{type:"error",turnId:r,error:E,code:"TOOL_EXECUTION_ERROR",usage:S.totalUsage};return}for(let[A,E]of S.toolFailureCounts)E>=Sr&&(Dk.get(A)??0)<Sr&&j.push({role:"user",content:`Tool "${A}" has now failed/returned empty results ${E} times with different arguments. The target clearly does not exist. Do NOT call "${A}" again. Report the result to the user immediately.`});if(B=Rr(B,{replayMessages:j,completedToolCallIds:[...B.completedToolCallIds,...xt],lastStopReason:"tool_calls"}),o.generateToolUseSummary&&me.length>0){let A=me.map(E=>({name:E.function.name,arguments:E.function.arguments}));W=o.generateToolUseSummary(A).catch(()=>null)}let Lk=me.length>0&&me.every(A=>{let E=j.find(G=>G?.role==="tool"&&G?.tool_call_id===A.id);if(!E)return!0;let L=E.content;return typeof L=="string"&&L.startsWith("Error: ")}),mo=S.consecutiveFailedRounds;if(Lk){if(mo+=1,mo>=Ii){let A=S.finalText||No(j,n);n.info(`early exit: ${mo} consecutive failed rounds, returning ${S.finalText?"partial":"fallback"} response`),yield{type:"end",turnId:r,content:A,usage:S.totalUsage,model:S.currentModel};return}}else mo=0;let Nk=3,Td=[...S.fileReadCounts.entries()].filter(([,A])=>A>=Nk);if(Td.length>0){let A=Td.map(([L])=>L).join(", ");n.info(`AP5: file read cycle detected on ${A}, injecting nudge`);let E={role:"user",content:`You are reading the same files repeatedly (${A}). This indicates a circular dependency or cycle. Stop reading files, summarize your findings so far, and explain the circular structure to the user.`};j.push(E),S.fileReadCounts.clear()}let pi=ne+1;if(h>0&&pi>h){if(n.info(`max turns reached (${h}), completing`),u){let E=await u.invoke("stop",{sessionId:s,reason:"max_turns"});if(E.action==="abort"){let L=E.reason??"Stop hook requested continuation after max_turns",G={role:"assistant",content:S.finalText,...ee.length>0&&{thinkingBlocks:[...ee]}};S={...S,messages:[...j,G,{role:"user",content:L}],stopHookActive:!0,transition:{reason:"stop_hook_blocking"}};continue}}let A=S.finalText||No(j,n);yield{type:"end",turnId:r,content:A,usage:S.totalUsage,model:S.currentModel};return}if(pi>x){if(n.info(`tool loop budget exhausted (${x} rounds), returning`),O>0){let E={ok:!0,toolCallCount:O,distinctToolCount:P.size,multiStep:O>=2,hasSubAgent:!1,feedback:null,existingSkillName:null},L=vo(E,{tools:[...P],projectRoot:o.projectRoot});L&&(yield{type:"skill_instruction",turnId:r,instruction:L})}let A=S.finalText||No(j,n);yield{type:"end",turnId:r,content:A,usage:S.totalUsage,model:S.currentModel};return}S={messages:j,maxOutputTokensRecoveryCount:0,hasAttemptedReactiveCompact:!1,maxOutputTokensOverride:void 0,turnCount:pi,transition:{reason:"next_turn"},guardState:Q,reactiveCompactState:T,toolLoopState:B,consecutiveFailedRounds:mo,finalText:S.finalText,totalUsage:S.totalUsage,collapseStore:F,currentModel:S.currentModel,consecutive529Errors:0,consecutiveApiRetries:0,stopHookActive:S.stopHookActive,lastResponseId:S.lastResponseId,snipRemovedIds:S.snipRemovedIds,contentReplacementState:S.contentReplacementState,budgetContinuationCount:0,lastBudgetDeltaTokens:0,lastBudgetGlobalTokens:0,identicalCallCounts:Ee,toolFailureCounts:S.toolFailureCounts,fileReadCounts:S.fileReadCounts}}}function No(o,e){let t=[];for(let n=o.length-1;n>=0;n--){let r=o[n];if(r.role==="tool"&&typeof r.content=="string")t.unshift(r.content.slice(0,500));else if(r.role==="assistant"){if(typeof r.content=="string"&&r.content.trim())return e.info("synthesizeFallbackContent: found assistant text, using it"),r.content;break}else break}return t.length>0?(e.info(`synthesizeFallbackContent: synthesized from ${t.length} tool result(s)`),t.join(`
|
|
@@ -317,7 +317,7 @@ END;
|
|
|
317
317
|
`)}rerank(e,t){let n=(t?.recencyBoostDays??7)*864e5,r=Date.now(),s=new Set(t?.preferredCategories??[]);return e.map(i=>{let a=i.score,l=i.metadata?.createdAt??0;if(l>0){let d=r-l;d<n&&(a+=.1*(1-d/n))}let c=i.metadata?.accessCount??0;return c>0&&(a+=Math.min(.05,c*.01)),s.size>0&&i.category&&s.has(i.category)&&(a+=.08),{...i,score:Math.min(1,a)}}).sort((i,a)=>a.score-i.score)}async health(){return{status:"healthy",memoryCount:0,dbPath:this.dbPath}}count(e){return this.store.count(this.resolveUserId(e))}async resetUser(e){return this.store.resetUser(this.resolveUserId(e))}close(){this.store.close()}};function tm(o){return new kl(o)}mt();function vl(o){try{let e=gx();if(e){let t={projectRoot:o.projectRoot,userIdPrefix:o.userIdPrefix,embedding:o.embedding,createDatabase:e};return{provider:tm(t),mode:"local"}}}catch(e){return{provider:null,mode:"none",error:`Local provider failed: ${e.message}`}}return{provider:null,mode:"none",error:"better-sqlite3 not available"}}function gx(){try{let e=fx(import.meta.url)("better-sqlite3"),t=e.default??e;if(typeof t!="function")return null;let n=t;return r=>new n(r)}catch{return null}}function Sl(o){let e=process.env.QMEMORY_USER_PREFIX||void 0,n=J().getActiveModel("embedding");if(n){let i={projectRoot:o,userIdPrefix:e,embedding:{strategy:"api",api:{baseUrl:n.baseUrl||"",apiKey:n.apiKey,model:n.model||"text-embedding-3-small"},fallbackStrategy:"onnx"}};return n.keyHandle.release({success:!0}),i}let r=process.env.QMEMORY_EMBEDDING_STRATEGY||"auto",s;if(r==="auto")s=hx();else if(r==="api"){let i=process.env.QMEMORY_EMBEDDING_BASE_URL||void 0,a=process.env.QMEMORY_EMBEDDING_API_KEY||void 0,l=process.env.QMEMORY_EMBEDDING_MODEL||"text-embedding-3-small";i&&a&&(s={strategy:"api",api:{baseUrl:i,apiKey:a,model:l}})}else if(r==="onnx"){let i=process.env.QMEMORY_ONNX_MODEL_ID||void 0;s={strategy:"onnx",onnx:i?{modelId:i}:void 0}}return{projectRoot:o,userIdPrefix:e,embedding:s}}var nm={qwen:["QWEN_API_KEY","DASHSCOPE_API_KEY"],zhipu:["ZHIPU_API_KEY","GLM_API_KEY"],minimax:["MINIMAX_API_KEY"],volcengine:["VOLCENGINE_API_KEY","ARK_API_KEY"],openai:["OPENAI_API_KEY"],google:["GOOGLE_API_KEY","GEMINI_API_KEY"],deepseek:["DEEPSEEK_API_KEY"]};function hx(){let t=J().peekActiveModel("textGeneration")?.provider?.toLowerCase();if(t){let c=yx(t);if(c){let d=bl(t,c);if(d)return{strategy:"api",api:d,fallbackStrategy:"onnx"}}}for(let[c,d]of Object.entries(nm))for(let u of d){let p=process.env[u];if(p){let m=bl(c,p);if(m)return{strategy:"api",api:m,fallbackStrategy:"onnx"}}}let n=process.env.QMEMORY_TEI_URL||process.env.QMEMORY_GPU_ECS_URL,r=process.env.QMEMORY_TEI_FALLBACK_URL,s=process.env.QMEMORY_TEI_KEY||process.env.QMEMORY_GPU_ECS_KEY||"none",i=process.env.QMEMORY_TEI_MODEL||"BAAI/bge-m3",a=parseInt(process.env.QMEMORY_TEI_DIMENSIONS||"1024",10),l=n||r;return l?{strategy:"api",api:{baseUrl:l,apiKey:s,model:i,dimensions:a,format:"openai"},fallbackStrategy:"onnx"}:{strategy:"onnx"}}function yx(o){let e=nm[o];if(e)for(let t of e){let n=process.env[t];if(n)return n}}var ln=class{sessionId;_trustAccepted=!1;_modelUsage=new Map;_totalInputTokens=0;_totalOutputTokens=0;_turnCount=0;_toolCallCount=0;_listeners=new Set;constructor(e){this.sessionId=e}get trustAccepted(){return this._trustAccepted}setTrustAccepted(e){this._trustAccepted=e,this.notifyListeners()}get totalInputTokens(){return this._totalInputTokens}get totalOutputTokens(){return this._totalOutputTokens}get turnCount(){return this._turnCount}get toolCallCount(){return this._toolCallCount}getModelUsage(e){return this._modelUsage.get(e)}getAllModelUsage(){let e={};for(let[t,n]of this._modelUsage)e[t]={...n};return e}addUsage(e,t){this._totalInputTokens+=e.inputTokens,this._totalOutputTokens+=e.outputTokens;let n=this._modelUsage.get(t);n?(n.inputTokens+=e.inputTokens,n.outputTokens+=e.outputTokens,n.cacheRead+=e.cacheRead??0,n.cacheCreation+=e.cacheWrite??0):this._modelUsage.set(t,{inputTokens:e.inputTokens,outputTokens:e.outputTokens,cacheRead:e.cacheRead??0,cacheCreation:e.cacheWrite??0,mediaCalls:0,mediaDurationSeconds:0,mediaCharacters:0}),this.notifyListeners()}addMediaUsage(e,t,n){let r=this._modelUsage.get(e),s=r??{inputTokens:0,outputTokens:0,cacheRead:0,cacheCreation:0,mediaCalls:0,mediaDurationSeconds:0,mediaCharacters:0};switch(r||this._modelUsage.set(e,s),s.mediaCalls+=1,t){case"per_second":s.mediaDurationSeconds+=n;break;case"per_character":s.mediaCharacters+=n;break;case"per_token":s.outputTokens+=n;break}this.notifyListeners()}recordToolCall(){this._toolCallCount++}recordTurnCompleted(){this._turnCount++}createSnapshot(){return{sessionId:this.sessionId,modelUsage:this.getAllModelUsage(),totalInputTokens:this._totalInputTokens,totalOutputTokens:this._totalOutputTokens,turnCount:this._turnCount,lastSavedAt:Date.now()}}restoreFromSnapshot(e){if(e.sessionId!==this.sessionId)return!1;this._totalInputTokens=e.totalInputTokens,this._totalOutputTokens=e.totalOutputTokens,this._turnCount=e.turnCount,this._modelUsage.clear();for(let[t,n]of Object.entries(e.modelUsage))this._modelUsage.set(t,{...n});return this.notifyListeners(),!0}onStateChange(e){return this._listeners.add(e),()=>{this._listeners.delete(e)}}notifyListeners(){for(let e of this._listeners)try{e()}catch{}}};le();Ue();import*as ue from"node:fs";import*as qe from"node:path";var om="transcript.jsonl",qt="metadata.json";function bx(o){return Vt(o)}function qn(o,e){let t=o.replace(/[^a-zA-Z0-9_-]/g,"_");return qe.join(bx(e),t)}function rm(o,e){let t=o.replace(/[^a-zA-Z0-9_-]/g,"_"),n=qe.join(Vt(e),t),r=qe.join(n,qt);if(ue.existsSync(r))return n}function wn(o,e){let t=rm(o,e);if(!t)return null;try{let n=ue.readFileSync(qe.join(t,qt),"utf8");return JSON.parse(n)}catch{return null}}async function Tl(o,e,t,n){let r=qn(o,t);try{await ue.promises.mkdir(r,{recursive:!0});let s={role:e.role,content:e.content,ts:Date.now()};n&&(s.turnId=n);let i=JSON.stringify(s)+`
|
|
318
318
|
`;return await ue.promises.appendFile(qe.join(r,om),i,"utf8"),!0}catch(s){return console.error(`[session-persistence] appendMessage failed for ${o}: ${s.message}`),!1}}async function sm(o,e,t,n){let r=qn(o,n);await ue.promises.mkdir(r,{recursive:!0});let s={};try{let c=await ue.promises.readFile(qe.join(r,qt),"utf8");s=JSON.parse(c)}catch{}let i=new Date().toISOString(),a={sessionId:o,projectId:t.projectId??s.projectId??"",createdAt:t.createdAt??s.createdAt??i,lastActiveAt:i,model:t.model??s.model,cwd:t.cwd??s.cwd,turnCount:e.turnCount,messageCount:t.messageCount??s.messageCount??0,title:t.title??s.title,pinnedAt:t.pinnedAt!==void 0?t.pinnedAt:s.pinnedAt,archivedAt:t.archivedAt!==void 0?t.archivedAt:s.archivedAt,type:t.type??s.type,ownerId:t.ownerId??s.ownerId,groupKey:t.groupKey??s.groupKey,groupName:t.groupName??s.groupName,groupPlatform:t.groupPlatform??s.groupPlatform,sealedAt:t.sealedAt??s.sealedAt,previousSessionId:t.previousSessionId??s.previousSessionId,carryoverSummary:t.carryoverSummary??s.carryoverSummary,totalInputTokens:e.totalInputTokens,totalOutputTokens:e.totalOutputTokens},l=qe.join(r,qt+".tmp");await ue.promises.writeFile(l,JSON.stringify(a,null,2),"utf8"),await ue.promises.rename(l,qe.join(r,qt))}async function tt(o,e,t){let r=rm(o,t)??qn(o,t),s=qe.join(r,qt),i=new Date().toISOString(),a;try{let d=await ue.promises.readFile(s,"utf8");a=JSON.parse(d)}catch{await ue.promises.mkdir(r,{recursive:!0}),a={sessionId:o,projectId:e.projectId??"",createdAt:i,lastActiveAt:i,turnCount:0,messageCount:0,...e};let d=s+".tmp";return await ue.promises.writeFile(d,JSON.stringify(a,null,2),"utf8"),await ue.promises.rename(d,s),a}let l={...a};e.title!==void 0&&(l.title=e.title??void 0),e.pinnedAt!==void 0&&(l.pinnedAt=e.pinnedAt??void 0),e.archivedAt!==void 0&&(l.archivedAt=e.archivedAt??void 0),e.sealedAt!==void 0&&(l.sealedAt=e.sealedAt??void 0),e.previousSessionId!==void 0&&(l.previousSessionId=e.previousSessionId??void 0),e.carryoverSummary!==void 0&&(l.carryoverSummary=e.carryoverSummary??void 0),e.projectId!==void 0&&(l.projectId=e.projectId??l.projectId),e.type!==void 0&&(l.type=e.type??void 0),e.ownerId!==void 0&&(l.ownerId=e.ownerId??void 0),e.groupKey!==void 0&&(l.groupKey=e.groupKey??void 0),e.groupName!==void 0&&(l.groupName=e.groupName??void 0),e.groupPlatform!==void 0&&(l.groupPlatform=e.groupPlatform??void 0),l.lastActiveAt=i;let c=s+".tmp";return await ue.promises.writeFile(c,JSON.stringify(l,null,2),"utf8"),await ue.promises.rename(c,s),l}async function wl(o,e){try{await ue.promises.access(e,ue.constants.R_OK)}catch{return console.error(`[session-persistence] loadSessionForResume: projectRoot not accessible: ${e}`),null}let t=qn(o,e),n=qe.join(t,om),r=qe.join(t,qt),s=[],i=0;try{let d=await ue.promises.readFile(n,"utf8");for(let u of d.split(`
|
|
319
319
|
`))if(u.trim())try{let p=JSON.parse(u);s.push({role:p.role,content:p.content??null})}catch{i++}i>0&&console.warn(`[session-persistence] ${i} corrupt line(s) skipped in ${n}`)}catch{return null}if(s.length===0&&i>0)return console.error(`[session-persistence] Transcript fully corrupt for session ${o}`),null;let a=new Date().toISOString(),l={sessionId:o,projectId:"",createdAt:a,lastActiveAt:a,turnCount:0,messageCount:s.length};try{let d=await ue.promises.readFile(r,"utf8");l=JSON.parse(d)}catch{}let c=s.filter(d=>d.role!=="system");return{metadata:l,messages:c}}async function Et(o=Ji,e){let t=Vt(e),n;try{n=await ue.promises.readdir(t)}catch{return[]}let r=[];for(let s of n){let i=qe.join(t,s,qt);try{let a=await ue.promises.readFile(i,"utf8"),l=JSON.parse(a);r.push({sessionId:l.sessionId,title:l.title,lastActiveAt:l.lastActiveAt,messageCount:l.messageCount,model:l.model,pinnedAt:l.pinnedAt,archivedAt:l.archivedAt,sealedAt:l.sealedAt,projectId:l.projectId,type:l.type,createdAt:l.createdAt,groupKey:l.groupKey,previousSessionId:l.previousSessionId})}catch{}}return r.sort((s,i)=>s.lastActiveAt>i.lastActiveAt?-1:s.lastActiveAt<i.lastActiveAt?1:0),r.slice(0,o)}async function xl(o,e){let t=qn(o,e);await ue.promises.rm(t,{recursive:!0,force:!0})}function kx(o){return o.turnCount<Qi?!1:o.taskSummaryGeneratedAt?o.turnCount-(o.taskSummaryGeneratedAt??0)>=Zi:!0}var vx="Based on the user's message below, generate a very short session title (2-8 Chinese characters or 3-6 English words). The title should capture the main topic or intent. Reply with ONLY the title text, no quotes, no punctuation.";async function im(o,e){if(!o.trim())return null;try{let t=e.transport.stream({model:e.model,messages:[{role:"system",content:vx},{role:"user",content:o.slice(0,500)}],tools:[],maxTokens:30},e.apiKey),n="";for await(let r of t)r.type==="delta"&&(n+=r.text);return n=n.trim().replace(/^["'""'']+|["'""'']+$/g,""),n||null}catch{return null}}async function am(o,e,t,n,r){if(!kx(e))return null;try{let i=t.slice(-20).map(u=>`[${u.role}]: ${typeof u.content=="string"?u.content.slice(0,500):JSON.stringify(u.content).slice(0,500)}`).join(`
|
|
320
|
-
`),a=n.transport.stream({model:n.model,messages:[{role:"system",content:"Generate a concise task summary (~100 words) of what the user is working on in this session. Focus on the goal, key decisions, and current progress. Reply with ONLY the summary."},{role:"user",content:i}],tools:[],maxTokens:200},n.apiKey),l="";for await(let u of a)u.type==="delta"&&(l+=u.text);if(l=l.trim(),!l)return null;let c=qn(o,r),d=qe.join(c,qt);try{let u=await ue.promises.readFile(d,"utf8"),p=JSON.parse(u);p.taskSummary=l,p.taskSummaryGeneratedAt=e.turnCount;let m=d+".tmp";await ue.promises.writeFile(m,JSON.stringify(p,null,2),"utf8"),await ue.promises.rename(m,d)}catch{}return l}catch{return null}}il();import{randomUUID as
|
|
320
|
+
`),a=n.transport.stream({model:n.model,messages:[{role:"system",content:"Generate a concise task summary (~100 words) of what the user is working on in this session. Focus on the goal, key decisions, and current progress. Reply with ONLY the summary."},{role:"user",content:i}],tools:[],maxTokens:200},n.apiKey),l="";for await(let u of a)u.type==="delta"&&(l+=u.text);if(l=l.trim(),!l)return null;let c=qn(o,r),d=qe.join(c,qt);try{let u=await ue.promises.readFile(d,"utf8"),p=JSON.parse(u);p.taskSummary=l,p.taskSummaryGeneratedAt=e.turnCount;let m=d+".tmp";await ue.promises.writeFile(m,JSON.stringify(p,null,2),"utf8"),await ue.promises.rename(m,d)}catch{}return l}catch{return null}}il();import{randomUUID as LL}from"node:crypto";var Sx=3e4;var rs=class{tasks=new Map;listeners=new Set;hooks=null;sessionId="";setHooks(e,t){this.hooks=e,this.sessionId=t}onTaskChange(e){return this.listeners.add(e),()=>this.listeners.delete(e)}notify(e,t){for(let n of this.listeners)try{n(e,t)}catch{}}registerTask(e){this.tasks.set(e.taskId,e),this.notify(e.taskId,e),this.hooks?.invoke("task.created",{sessionId:this.sessionId,taskId:e.taskId,taskType:e.type,label:e.label}).catch(()=>{})}updateTask(e,t){let n=this.tasks.get(e);if(!n)return;let r=t(n);r!==n&&(this.tasks.set(e,r),this.notify(e,r),!os(n.lifecycle)&&os(r.lifecycle)&&this.hooks?.invoke("task.completed",{sessionId:this.sessionId,taskId:r.taskId,taskType:r.type,label:r.label}).catch(()=>{}))}getTask(e){return this.tasks.get(e)}getRunningTasks(){return[...this.tasks.values()].filter(e=>e.lifecycle==="running")}getAllTasks(){return[...this.tasks.values()]}evictTask(e){let t=this.tasks.get(e);t&&os(t.lifecycle)&&(this.tasks.delete(e),this.notify(e,null))}evictStaleTasks(e=Sx){let t=Date.now();for(let[n,r]of this.tasks)os(r.lifecycle)&&r.endedAt&&t-r.endedAt>e&&(this.tasks.delete(n),this.notify(n,null))}};function os(o){return o==="completed"||o==="failed"||o==="cancelled"||o==="timeout"}le();import{watch as Tx}from"node:fs";import{stat as wx}from"node:fs/promises";import{join as lm,relative as xx,resolve as Rx}from"node:path";var _x=[`${Ge}/settings.json`,"INSTRUCTIONS.md",`${Ge}/INSTRUCTIONS.md`,"INSTRUCTIONS.local.md",`${Ge}/rules`],Ax=["INSTRUCTIONS.md","INSTRUCTIONS.local.md",`${Ge}/rules`],Rl=class{watchers=new Map;deps;debounceTimers=new Map;_cwd;constructor(e){this.deps=e,this._cwd=e.projectRoot}get cwd(){return this._cwd}async start(){for(let e of _x){let t=lm(this.deps.projectRoot,e);this.watchPath(t,e)}this.deps.log?.(`file-watcher: watching ${this.watchers.size} paths`)}watchPath(e,t){if(!this.watchers.has(e))try{let n=Tx(e,{persistent:!1,recursive:t.includes("/")?!1:void 0},(r,s)=>{let i=s?lm(e,s):e;this.handleChange(i,r==="rename"?"created":"modified")});n.on("error",()=>{this.watchers.delete(e)}),this.watchers.set(e,n)}catch{}}handleChange(e,t){let n=this.debounceTimers.get(e);n&&clearTimeout(n),this.debounceTimers.set(e,setTimeout(async()=>{this.debounceTimers.delete(e);let r=t;try{await wx(e)}catch{r="deleted"}let s=xx(this.deps.projectRoot,e);this.deps.log?.(`file-watcher: ${r} ${s}`),this.deps.hooks.invoke("file.changed",{sessionId:this.deps.sessionId,filePath:e,changeType:r}).catch(()=>{}),Ax.some(a=>s.includes(a)||e.includes(a))&&this.deps.onInstructionCacheReset?.()},300))}setCwd(e){let t=Rx(e);if(t===this._cwd)return;let n=this._cwd;this._cwd=t,this.deps.hooks.invoke("cwd.changed",{sessionId:this.deps.sessionId,oldCwd:n,newCwd:t}).catch(()=>{}),this.deps.onInstructionCacheReset?.()}stop(){for(let[,e]of this.watchers)e.close();this.watchers.clear();for(let[,e]of this.debounceTimers)clearTimeout(e);this.debounceTimers.clear()}};async function cm(o){let e=new Rl(o);return await e.start(),e}le();Ue();import{readFile as Px,readdir as Ix,stat as Cx}from"node:fs/promises";import{dirname as ss,extname as Ex,isAbsolute as Mx,join as Xn,parse as um,resolve as dm}from"node:path";import{homedir as Ox}from"node:os";var Dx="INSTRUCTIONS.md",Lx="INSTRUCTIONS.local.md",Nx=[".instructions.md"],$x=new Set([".md",".txt",".text",".json",".yaml",".yml",".toml",".xml",".csv",".html",".htm",".css",".scss",".sass",".less",".js",".ts",".tsx",".jsx",".mjs",".cjs",".mts",".cts",".py",".pyi",".pyw",".rb",".erb",".rake",".go",".rs",".java",".kt",".kts",".scala",".c",".cpp",".cc",".cxx",".h",".hpp",".hxx",".cs",".swift",".sh",".bash",".zsh",".fish",".ps1",".bat",".cmd",".env",".ini",".cfg",".conf",".config",".properties",".sql",".graphql",".gql",".proto",".vue",".svelte",".astro",".php",".pl",".pm",".lua",".r",".R",".dart",".ex",".exs",".erl",".hrl",".clj",".cljs",".cljc",".edn",".hs",".lhs",".elm",".ml",".mli",".f",".f90",".f95",".for",".cmake",".make",".makefile",".gradle",".sbt",".rst",".adoc",".asciidoc",".org",".tex",".latex",".lock",".log",".diff",".patch"]);async function Ux(o){try{return await Px(o,"utf-8")}catch{return null}}function jx(o){return o.includes("<!--")?o.replace(/^[ \t]*<!--[\s\S]*?-->[ \t]*$/gm,""):o}function Fx(o){let e=o.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?/);if(!e)return{content:o};let t=e[1],n=o.slice(e[0].length),r=t.match(/^paths:\s*(.+)$/m);if(!r)return{content:n};let s=[],i=r[1].trim();if(i.startsWith("["))try{s=JSON.parse(i)}catch{}else s=i.split(",").map(l=>l.trim()).filter(Boolean);let a=s.map(l=>l.endsWith("/**")?l.slice(0,-3):l).filter(l=>l.length>0&&l!=="**");return{content:n,globs:a.length>0?a:void 0}}function Bx(o,e){let t=new Set,n=/(?:^|\s)@((?:[^\s\\]|\\ )+)/g,s=o.replace(/```[\s\S]*?```/g,"").replace(/`[^`]+`/g,""),i;for(;(i=n.exec(s))!==null;){let a=i[1];if(!a)continue;let l=a.indexOf("#");if(l!==-1&&(a=a.substring(0,l)),!a)continue;a=a.replace(/\\ /g," ");let c;if(a.startsWith("~/"))c=Xn(Ox(),a.slice(2));else if(Mx(a))c=a;else if(a.startsWith("./"))c=dm(ss(e),a);else if(/^[a-zA-Z0-9._-]/.test(a)&&!a.startsWith("@"))c=dm(ss(e),a);else continue;t.add(c)}return[...t]}async function Yn(o,e,t,n=0,r){let s=o.toLowerCase();if(t.has(s)||n>=ea)return[];let i=Ex(o).toLowerCase();if(i&&!$x.has(i))return[];t.add(s);let a=await Ux(o);if(!a?.trim())return[];let{content:l,globs:c}=Fx(a),d=jx(l);if(!d.trim())return[];let u=[],p={path:o,type:e,content:d.trim()};r&&(p.parent=r),c&&(p.globs=c),u.push(p);let m=Bx(l,o);for(let h of m){let f=await Yn(h,e,t,n+1,o);u.push(...f)}return u}async function pm(o,e,t,n,r=new Set){if(r.has(o))return[];r.add(o);let s=[];try{let i=await Ix(o,{withFileTypes:!0});for(let a of i){let l=Xn(o,a.name);if(a.isDirectory())s.push(...await pm(l,e,t,n,r));else if(a.isFile()&&a.name.endsWith(".md")){let c=await Yn(l,e,t);s.push(...c.filter(d=>n?!!d.globs:!d.globs))}}}catch{}return s}async function Wx(o){let e=o,t=um(e).root;for(;e!==t;){try{let n=Xn(e,".git"),r=await Cx(n);if(r.isDirectory()||r.isFile())return e}catch{}e=ss(e)}return null}async function Gx(o,e){let t=[],n=new Set,s=await Wx(o)??um(o).root,i=[],a=o;for(;i.push(a),!(a===s&&a!==o);){let l=ss(a);if(l===a)break;a=l}for(let l of i.reverse()){t.push(...await Yn(Xn(l,Dx),"Project",n));for(let c of Nx)t.push(...await Yn(Xn(l,c),"Project",n));t.push(...await Yn(Oo(l),"Project",n)),t.push(...await pm(Gn(l),"Project",n,!1)),t.push(...await Yn(Xn(l,Lx),"Local",n))}return e&&t.length>0&&e.invoke("instructions.loaded",{sessionId:"",source:o,fileCount:t.length}).catch(()=>{}),t}function mm(o){if(o.length===0)return"";let e="Codebase and user instructions are shown below. Be sure to adhere to these instructions. IMPORTANT: These instructions OVERRIDE any default behavior and you MUST follow them exactly as written.",t=[];for(let n of o){if(!n.content)continue;let r=n.type==="Project"?" (project instructions, checked into the codebase)":n.type==="Local"?" (user's private project instructions, not checked in)":" (user's private global instructions for all projects)";t.push(`Contents of ${n.path}${r}:
|
|
321
321
|
|
|
322
322
|
${n.content.trim()}`)}return t.length>0?`${e}
|
|
323
323
|
|
|
@@ -419,7 +419,7 @@ exit: Leave worktree (keep or remove it).
|
|
|
419
419
|
list: Show all active worktrees.`},name:{type:"string",description:"Worktree/branch name (for enter). Must be kebab-case, max 64 characters. If omitted, auto-generated from task context."},exitAction:{type:"string",enum:["keep","remove"],description:"For exit: 'keep' retains the worktree for later use; 'remove' deletes it."},discardChanges:{type:"boolean",description:"Required true to confirm discarding uncommitted changes when exitAction='remove'. Safety mechanism to prevent data loss."}},required:["action"]},m_=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]?$/;function tf(o){return{name:u_,label:"Git Worktree",description:"Create isolated git worktree branches for parallel development. Each worktree has its own working directory independent of the main branch. Use for: parallel features, safe experimentation, sub-agent isolation. Exit to keep or remove the worktree when done.",parameters:p_,execute:async(e,t)=>{switch(t.action){case"enter":{if(o.isInWorktree())return{content:[{type:"text",text:"Error: already in a worktree. Exit first before entering another."}],details:{type:"worktree",error:"already_in_worktree"}};if(t.name&&!m_.test(t.name))return{content:[{type:"text",text:"Error: name must be kebab-case (a-z, 0-9, hyphens), 2-64 characters."}],details:{type:"worktree",error:"invalid_name"}};let n=await o.enterWorktree(t.name);if(!n.success)return{content:[{type:"text",text:`Error: ${n.error||"failed to create worktree"}`}],details:{type:"worktree",error:n.error}};let r=n.worktree;return{content:[{type:"text",text:[`Entered worktree: ${r.name}`,` Branch: ${r.branch}`,` Path: ${r.path}`,"","Working in isolated branch. Changes here do not affect the main branch.","Use action='exit' when done (keep or remove)."].join(`
|
|
420
420
|
`)}],details:{type:"worktree",action:"enter",name:r.name,branch:r.branch,path:r.path}}}case"exit":{if(!o.isInWorktree())return{content:[{type:"text",text:"Error: not in a worktree."}],details:{type:"worktree",error:"not_in_worktree"}};let n=t.exitAction||"keep";if(n==="remove"){let i=o.currentWorktree?.();if(i&&(i.hasChanges||i.unpushedCommits>0)&&!t.discardChanges){let a=[];return i.hasChanges&&a.push("uncommitted changes"),i.unpushedCommits>0&&a.push(`${i.unpushedCommits} unpushed commit(s)`),{content:[{type:"text",text:`Error: worktree has ${a.join(" and ")}. Set discardChanges=true to confirm removal, or use exitAction='keep'.`}],details:{type:"worktree",error:"has_changes",hasChanges:i.hasChanges,unpushedCommits:i.unpushedCommits}}}}let r=await o.exitWorktree(n,t.discardChanges);return r.success?{content:[{type:"text",text:`Exited worktree. ${n==="keep"?"Worktree kept for later use.":"Worktree removed."}
|
|
421
421
|
Restored to: ${r.previousCwd||"main workspace"}`}],details:{type:"worktree",action:"exit",exitAction:n,previousCwd:r.previousCwd}}:{content:[{type:"text",text:`Error: ${r.error||"failed to exit worktree"}`}],details:{type:"worktree",error:r.error}}}case"list":{let n=await o.listWorktrees();if(!n.worktrees||n.worktrees.length===0)return{content:[{type:"text",text:"No worktrees (only the main working tree)."}],details:{type:"worktree",action:"list",count:0}};let r=[`Worktrees (${n.worktrees.length}):`,""];for(let s of n.worktrees){let i=s.isCurrent?" \u2190 current":"",a=s.hasChanges?" (has changes)":"";r.push(` ${s.name} [${s.branch}]${i}${a}`),r.push(` path: ${s.path}`)}return{content:[{type:"text",text:r.join(`
|
|
422
|
-
`)}],details:{type:"worktree",action:"list",count:n.worktrees.length}}}default:return{content:[{type:"text",text:`Error: unknown action "${t.action}".`}],details:{type:"worktree",error:"unknown_action"}}}}}}le();import{execFile as f_}from"node:child_process";import{promisify as g_}from"node:util";import{join as Rn,resolve as nf,basename as Zl}from"node:path";import{mkdir as cf,rm as df,symlink as h_,readdir as
|
|
422
|
+
`)}],details:{type:"worktree",action:"list",count:n.worktrees.length}}}default:return{content:[{type:"text",text:`Error: unknown action "${t.action}".`}],details:{type:"worktree",error:"unknown_action"}}}}}}le();import{execFile as f_}from"node:child_process";import{promisify as g_}from"node:util";import{join as Rn,resolve as nf,basename as Zl}from"node:path";import{mkdir as cf,rm as df,symlink as h_,readdir as k$,stat as y_}from"node:fs/promises";var Vo=g_(f_),b_=/^[a-zA-Z0-9._-]+$/,of=64;function uf(o){if(o.length>of)throw new Error(`Invalid worktree name: must be ${of} characters or fewer (got ${o.length})`);for(let e of o.split("/")){if(e==="."||e==="..")throw new Error(`Invalid worktree name "${o}": must not contain "." or ".." path segments`);if(!b_.test(e))throw new Error(`Invalid worktree name "${o}": segment must contain only letters, digits, dots, underscores, and dashes`)}}function ec(o){return o.replaceAll("/","+")}function pf(o){return`worktree-${ec(o)}`}var ot=null;async function Ne(o,e){try{let{stdout:t,stderr:n}=await Vo("git",o,{cwd:e??process.cwd(),env:{...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:""},timeout:3e4});return{stdout:t,stderr:n,code:0}}catch(t){let n=t;return{stdout:n.stdout??"",stderr:n.stderr??String(t),code:n.code??1}}}async function Ho(o){let{stdout:e,code:t}=await Ne(["rev-parse","--show-toplevel"],o);return t===0?e.trim():null}async function rf(o){let{stdout:e,code:t}=await Ne(["status","--porcelain"],o);return t!==0?-1:e.trim().split(`
|
|
423
423
|
`).filter(Boolean).length}async function sf(o,e){let{stdout:t,code:n}=await Ne(["rev-list",`origin/${e}..${e}`,"--count"],o);return n!==0?0:parseInt(t.trim(),10)||0}async function mf(o,e,t,n){for(let r of t){if(r.includes("..")||r.startsWith("/")||r.startsWith("\\")){n?.warn(`[worktree] skipping symlink for "${r}": path traversal detected`);continue}let s=Rn(o,r),i=Rn(e,r);try{await h_(s,i,"dir"),n?.info(`[worktree] symlinked ${r} from main repo to worktree`)}catch(a){let l=a.code;l!=="ENOENT"&&l!=="EEXIST"&&n?.warn(`[worktree] failed to symlink ${r} (${l??"unknown"}): ${a}`)}}}async function k_(o,e,t){let{code:n,stderr:r}=await Ne(["sparse-checkout","set","--cone","--",...t],o);if(n!==0)throw await Ne(["worktree","remove","--force",o],e),new Error(`Failed to configure sparse-checkout: ${r}`);let{code:s,stderr:i}=await Ne(["checkout","HEAD"],o);if(s!==0)throw await Ne(["worktree","remove","--force",o],e),new Error(`Failed to checkout sparse worktree: ${i}`);return!0}async function v_(){try{return await Vo("tmux",["-V"],{timeout:5e3}),!0}catch{return!1}}function S_(o,e){return`${Zl(o)}_${e}`.replace(/[/.]/g,"_")}async function T_(o,e){if(!await v_())return null;try{return await Vo("tmux",["new-session","-d","-s",e,"-c",o],{timeout:1e4}),e}catch{return null}}async function af(o){try{return await Vo("tmux",["kill-session","-t",o],{timeout:5e3}),!0}catch{return!1}}async function lf(o,e,t,n){let r=ip(e),s=Rn(r,o);try{if(!(await y_(s)).isFile())return null}catch{return null}try{let{stdout:i,stderr:a}=await Vo(s,[],{cwd:e,env:{...process.env,...t},timeout:3e4});return n?.info(`[worktree] hook ${o} succeeded: ${i.trim()}`),i.trim()||null}catch(i){return n?.warn(`[worktree] hook ${o} failed: ${i}`),null}}async function ff(o,e,t){uf(e);let n=ec(e),r=pf(e),s=Rn(o,".worktrees"),i=Rn(s,n);await cf(s,{recursive:!0});let{code:a,stderr:l}=await Ne(["worktree","add","-B",r,i,"HEAD"],o);return a!==0?(t?.warn(`[worktree] agent worktree creation failed: ${l}`),null):(await mf(o,i,["node_modules"],t),t?.info(`[worktree] agent worktree created: ${e} at ${i}`),{worktreePath:i,branch:r})}async function gf(o,e,t,n){let{code:r}=await Ne(["worktree","remove","--force",e],o);return r!==0&&(await df(e,{recursive:!0,force:!0}).catch(()=>{}),await Ne(["worktree","prune"],o)),await Ne(["branch","-D",t],o),n?.info(`[worktree] agent worktree removed: ${e}`),!0}function hf(o){let{log:e,symlinkDirs:t=["node_modules"],sparsePaths:n}=o;return{async enterWorktree(r){try{let s=Date.now(),i=await Ho();if(!i)return{success:!1,error:"Not in a git repository"};let a=await lf("worktree-create",i,{WORKTREE_NAME:r??""},e);if(a){let $=process.cwd();return process.chdir(a),ot={originalCwd:$,worktreePath:a,worktreeName:r??Zl(a),worktreeBranch:"",hookBased:!0,creationDurationMs:Date.now()-s},{success:!0,worktree:{name:ot.worktreeName,path:a,branch:"",isCurrent:!0,hasChanges:!1,unpushedCommits:0}}}let l=r??`agent-${Date.now().toString(36)}`;uf(l);let c=ec(l),d=pf(l),u=Rn(i,".worktrees"),p=Rn(u,c);await cf(u,{recursive:!0});let{stdout:m}=await Ne(["worktree","list","--porcelain"],i),h=m.split(`
|
|
424
424
|
`).find($=>$.startsWith("worktree ")&&$.includes(c));if(h){let $=h.replace("worktree ","").trim(),W=process.cwd();return process.chdir($),ot={originalCwd:W,worktreePath:$,worktreeName:l,worktreeBranch:d},e.info(`[worktree] resumed existing worktree: ${l} at ${$}`),{success:!0,worktree:{name:l,path:$,branch:d,isCurrent:!0,hasChanges:!1,unpushedCommits:0}}}let f=n&&n.length>0,y=["worktree","add"];f&&y.push("--no-checkout"),y.push("-B",d,p,"HEAD");let{code:b,stderr:k}=await Ne(y,i);if(b!==0)return{success:!1,error:`git worktree add failed: ${k.trim()}`};let x=!1;f&&n&&(await k_(p,i,n),x=!0),await mf(i,p,t,e);let I=process.cwd();process.chdir(p);let P=S_(i,d),O=await T_(p,P);return ot={originalCwd:I,worktreePath:p,worktreeName:l,worktreeBranch:d,tmuxSessionName:O??void 0,creationDurationMs:Date.now()-s,usedSparsePaths:x},e.info(`[worktree] entered: ${l} at ${p}`),{success:!0,worktree:{name:l,path:p,branch:d,isCurrent:!0,hasChanges:!1,unpushedCommits:0}}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}},async exitWorktree(r,s){if(!ot)return{success:!1,error:"Not in a worktree"};try{let i=ot,a=await Ho(i.originalCwd);if(!a)return{success:!1,error:"Original git root not found"};if(r==="remove"){let l=await rf(i.worktreePath),c=await sf(i.worktreePath,i.worktreeBranch);if((l>0||c>0)&&!s)return{success:!1,error:`Worktree has ${l} uncommitted change(s) and ${c} unpushed commit(s). Set discardChanges=true to confirm.`};process.chdir(i.originalCwd),ot=null,i.tmuxSessionName&&await af(i.tmuxSessionName),await lf("worktree-remove",a,{WORKTREE_PATH:i.worktreePath},e);let d=["worktree","remove"];s&&d.push("--force"),d.push(i.worktreePath);let{code:u,stderr:p}=await Ne(d,a);u!==0&&(e.warn(`[worktree] git worktree remove failed: ${p.trim()}, cleaning up manually`),await df(i.worktreePath,{recursive:!0,force:!0}).catch(()=>{}),await Ne(["worktree","prune"],a)),await Ne(["branch","-D",i.worktreeBranch],a),e.info(`[worktree] removed: ${i.worktreeName}`)}else process.chdir(i.originalCwd),i.tmuxSessionName&&await af(i.tmuxSessionName),ot=null,e.info(`[worktree] exited (kept): ${i.worktreeName}`);return{success:!0,previousCwd:i.originalCwd}}catch(i){return{success:!1,error:i instanceof Error?i.message:String(i)}}},async listWorktrees(){try{let{stdout:r,code:s}=await Ne(["worktree","list","--porcelain"]);if(s!==0)return{success:!0,worktrees:[]};let i=[],a=process.cwd(),l=r.split(`
|
|
425
425
|
|
|
@@ -678,7 +678,7 @@ description: ${c}`,i=!0}return i?`---
|
|
|
678
678
|
${a}
|
|
679
679
|
---
|
|
680
680
|
|
|
681
|
-
${l}`:o}import*as Y from"node:fs";import*as te from"node:path";var to="1.0.0",w={PARSE_ERROR:-32700,INVALID_REQUEST:-32600,METHOD_NOT_FOUND:-32601,INVALID_PARAMS:-32602,INTERNAL_ERROR:-32603,TURN_ABORTED:-32e3,TURN_TIMEOUT:-32001,LLM_ERROR:-32010,LLM_AUTH_ERROR:-32011,LLM_RATE_LIMIT:-32012,LLM_QUOTA_EXHAUSTED:-32013,LLM_MODEL_NOT_FOUND:-32014,TOOL_INVOKE_FAILED:-32020,TOOL_TIMEOUT:-32021,PROTOCOL_MISMATCH:-32030};function Vc(o){if(!o||typeof o!="object")return!1;let e=o;return e.jsonrpc==="2.0"&&typeof e.method=="string"&&e.method.length>0}var Sh=["turn.start","turn.delta","turn.end","turn.error","turn.recovery","turn.tool_call","turn.tool_result","turn.tool_blocked","turn.reasoning_delta","turn.approval_request","turn.skill_instruction","turn.ask_user","turn.media_result","turn.media_progress","turn.plan_update","turn.suggestions","turn.sidechain_started","turn.subagent_delta","turn.sidechain_completed","turn.task_updated","turn.todos_updated","turn.exec_progress","turn.usage_update","team.member.notification","session.info","memory.updated","skills.updated","pet.soul_ready","pet.reaction","pet.growth","pet.state","pet.confirm","pet.forged","system.activity"],Th=["solo.progress","solo.agentDelta","solo.agentUsage","solo.agentDiff","solo.evaluation","product.taskStarted","product.taskOutput","product.taskCompleted","product.taskFailed","product.budgetUpdate","product.checkpointed","product.dagTopology","plan.interrupted"],CC=[...Sh,...Th];var kt={INITIALIZE:"initialize",SESSION_NEW:"session/new",SESSION_PROMPT:"session/prompt",SESSION_END:"session/end",SESSION_SET_CONFIG:"session/set_config_option",SESSION_SET_MODEL:"session/set_model",SESSION_SET_MODE:"session/set_mode",SESSION_UPDATE:"session/update",SESSION_REQUEST_PERMISSION:"session/request_permission",FS_READ_TEXT_FILE:"fs/read_text_file",FS_WRITE_TEXT_FILE:"fs/write_text_file"},be={ABORT:"x/abort",DREAM:"x/dream",AGENTS_LIST:"x/agents.list",SOLO_START:"x/solo.start",SOLO_STATUS:"x/solo.status",SOLO_SELECT:"x/solo.select",SOLO_CANCEL:"x/solo.cancel",PRODUCT_CREATE:"x/product.create",PRODUCT_PLAN:"x/product.plan",PRODUCT_CONFIRM:"x/product.confirm",PRODUCT_MESSAGE:"x/product.message",PRODUCT_RESUME:"x/product.resume",PRODUCT_PAUSE:"x/product.pause",PRODUCT_CANCEL:"x/product.cancel",PRODUCT_ROLLBACK:"x/product.rollback",PRODUCT_STATUS:"x/product.status",SOLO_SUBSCRIBE:"x/solo.subscribe",SOLO_MESSAGE:"x/solo.message",SOLO_EVALUATE:"x/solo.evaluate",PRODUCT_SUBSCRIBE:"x/product.subscribe",TEAM_DELEGATE:"x/team.delegate"},vt={AGENT_MESSAGE_CHUNK:"agent_message_chunk",AGENT_THOUGHT_CHUNK:"agent_thought_chunk",TOOL_CALL:"tool_call",TOOL_CALL_UPDATE:"tool_call_update",PLAN:"plan",USAGE_UPDATE:"usage_update",CONFIG_OPTION_UPDATE:"config_option_update",SESSION_INFO_UPDATE:"session_info_update",AVAILABLE_COMMANDS_UPDATE:"available_commands_update"},xe={X_SUBAGENT_STARTED:"x_subagent_started",X_SUBAGENT_DELTA:"x_subagent_delta",X_SUBAGENT_ENDED:"x_subagent_ended",X_MEDIA_RESULT:"x_media_result",X_MEDIA_PROGRESS:"x_media_progress",X_SKILL_INSTRUCTION:"x_skill_instruction",X_RECOVERY:"x_recovery",X_SIDECHAIN_STARTED:"x_sidechain_started",X_SIDECHAIN_COMPLETED:"x_sidechain_completed",X_SUGGESTIONS:"x_suggestions",X_ASK_USER:"x_ask_user",X_SESSION_INFO:"x_session_info",X_MEMORY_UPDATED:"x_memory_updated",X_TEAM_MEMBER_UPDATE:"x_team_member_update",X_SOLO_STARTED:"x_solo_started",X_SOLO_AGENT_FINISHED:"x_solo_agent_finished",X_SOLO_SELECTED:"x_solo_selected",X_PRODUCT_TASK_STARTED:"x_product_task_started",X_PRODUCT_TASK_COMPLETED:"x_product_task_completed",X_PRODUCT_CHECKPOINT:"x_product_checkpoint"};function tr(o){if(!o||typeof o!="object")return!1;let e=o;return e.jsonrpc==="2.0"&&typeof e.method=="string"&&"id"in e}function nr(o){if(!o||typeof o!="object")return!1;let e=o;return e.jsonrpc==="2.0"&&typeof e.method=="string"&&!("id"in e)}function Kc(o){if(!o||typeof o!="object")return!1;let e=o;return e.jsonrpc==="2.0"&&"id"in e&&!("method"in e)}var wh="openai-codex";var
|
|
681
|
+
${l}`:o}import*as Y from"node:fs";import*as te from"node:path";var to="1.0.0",w={PARSE_ERROR:-32700,INVALID_REQUEST:-32600,METHOD_NOT_FOUND:-32601,INVALID_PARAMS:-32602,INTERNAL_ERROR:-32603,TURN_ABORTED:-32e3,TURN_TIMEOUT:-32001,LLM_ERROR:-32010,LLM_AUTH_ERROR:-32011,LLM_RATE_LIMIT:-32012,LLM_QUOTA_EXHAUSTED:-32013,LLM_MODEL_NOT_FOUND:-32014,TOOL_INVOKE_FAILED:-32020,TOOL_TIMEOUT:-32021,PROTOCOL_MISMATCH:-32030};function Vc(o){if(!o||typeof o!="object")return!1;let e=o;return e.jsonrpc==="2.0"&&typeof e.method=="string"&&e.method.length>0}var Sh=["turn.start","turn.delta","turn.end","turn.error","turn.recovery","turn.tool_call","turn.tool_result","turn.tool_blocked","turn.reasoning_delta","turn.approval_request","turn.skill_instruction","turn.ask_user","turn.media_result","turn.media_progress","turn.plan_update","turn.suggestions","turn.sidechain_started","turn.subagent_delta","turn.sidechain_completed","turn.task_updated","turn.todos_updated","turn.exec_progress","turn.usage_update","team.member.notification","session.info","memory.updated","skills.updated","pet.soul_ready","pet.reaction","pet.growth","pet.state","pet.confirm","pet.forged","system.activity"],Th=["solo.progress","solo.agentDelta","solo.agentUsage","solo.agentDiff","solo.evaluation","product.taskStarted","product.taskOutput","product.taskCompleted","product.taskFailed","product.budgetUpdate","product.checkpointed","product.dagTopology","plan.interrupted"],CC=[...Sh,...Th];var kt={INITIALIZE:"initialize",SESSION_NEW:"session/new",SESSION_PROMPT:"session/prompt",SESSION_END:"session/end",SESSION_SET_CONFIG:"session/set_config_option",SESSION_SET_MODEL:"session/set_model",SESSION_SET_MODE:"session/set_mode",SESSION_UPDATE:"session/update",SESSION_REQUEST_PERMISSION:"session/request_permission",FS_READ_TEXT_FILE:"fs/read_text_file",FS_WRITE_TEXT_FILE:"fs/write_text_file"},be={ABORT:"x/abort",DREAM:"x/dream",AGENTS_LIST:"x/agents.list",SOLO_START:"x/solo.start",SOLO_STATUS:"x/solo.status",SOLO_SELECT:"x/solo.select",SOLO_CANCEL:"x/solo.cancel",PRODUCT_CREATE:"x/product.create",PRODUCT_PLAN:"x/product.plan",PRODUCT_CONFIRM:"x/product.confirm",PRODUCT_MESSAGE:"x/product.message",PRODUCT_RESUME:"x/product.resume",PRODUCT_PAUSE:"x/product.pause",PRODUCT_CANCEL:"x/product.cancel",PRODUCT_ROLLBACK:"x/product.rollback",PRODUCT_STATUS:"x/product.status",SOLO_SUBSCRIBE:"x/solo.subscribe",SOLO_MESSAGE:"x/solo.message",SOLO_EVALUATE:"x/solo.evaluate",PRODUCT_SUBSCRIBE:"x/product.subscribe",TEAM_DELEGATE:"x/team.delegate"},vt={AGENT_MESSAGE_CHUNK:"agent_message_chunk",AGENT_THOUGHT_CHUNK:"agent_thought_chunk",TOOL_CALL:"tool_call",TOOL_CALL_UPDATE:"tool_call_update",PLAN:"plan",USAGE_UPDATE:"usage_update",CONFIG_OPTION_UPDATE:"config_option_update",SESSION_INFO_UPDATE:"session_info_update",AVAILABLE_COMMANDS_UPDATE:"available_commands_update"},xe={X_SUBAGENT_STARTED:"x_subagent_started",X_SUBAGENT_DELTA:"x_subagent_delta",X_SUBAGENT_ENDED:"x_subagent_ended",X_MEDIA_RESULT:"x_media_result",X_MEDIA_PROGRESS:"x_media_progress",X_SKILL_INSTRUCTION:"x_skill_instruction",X_RECOVERY:"x_recovery",X_SIDECHAIN_STARTED:"x_sidechain_started",X_SIDECHAIN_COMPLETED:"x_sidechain_completed",X_SUGGESTIONS:"x_suggestions",X_ASK_USER:"x_ask_user",X_SESSION_INFO:"x_session_info",X_MEMORY_UPDATED:"x_memory_updated",X_TEAM_MEMBER_UPDATE:"x_team_member_update",X_SOLO_STARTED:"x_solo_started",X_SOLO_AGENT_FINISHED:"x_solo_agent_finished",X_SOLO_SELECTED:"x_solo_selected",X_PRODUCT_TASK_STARTED:"x_product_task_started",X_PRODUCT_TASK_COMPLETED:"x_product_task_completed",X_PRODUCT_CHECKPOINT:"x_product_checkpoint"};function tr(o){if(!o||typeof o!="object")return!1;let e=o;return e.jsonrpc==="2.0"&&typeof e.method=="string"&&"id"in e}function nr(o){if(!o||typeof o!="object")return!1;let e=o;return e.jsonrpc==="2.0"&&typeof e.method=="string"&&!("id"in e)}function Kc(o){if(!o||typeof o!="object")return!1;let e=o;return e.jsonrpc==="2.0"&&"id"in e&&!("method"in e)}var wh="openai-codex";var i1={anthropic:{providerFamily:"anthropic"},"amazon-bedrock":{providerFamily:"anthropic"},"kimi-coding":{anthropicToolSchemaMode:"openai-functions",anthropicToolChoiceMode:"openai-string-modes",preserveAnthropicThinkingSignatures:!1},mistral:{transcriptToolCallIdMode:"strict9",transcriptToolCallIdModelHints:["mistral","mixtral","codestral","pixtral","devstral","ministral","mistralai"]},openai:{providerFamily:"openai"},[wh]:{providerFamily:"openai"},openrouter:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},opencode:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},kilocode:{providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]}};import{randomUUID as EC}from"node:crypto";var js={PARSE_ERROR:-32700,INVALID_REQUEST:-32600,METHOD_NOT_FOUND:-32601,INVALID_PARAMS:-32602,INTERNAL_ERROR:-32603,PROTOCOL_MISMATCH:-32001,SESSION_NOT_FOUND:-32002,AGENT_BUSY:-32003},Fs=class{transport;handler;verbose;hostCapabilities={};hostSupportsExtendedEvents=!1;hostSupportsExtendedMethods=!1;activeSessionId=null;pendingPermissions=new Map;outboundRequestMap=new Map;constructor(e,t,n){this.transport=e,this.handler=t,this.verbose=n?.verbose??!1}dispatchMessage(e){if(this.isJsonRpcResponse(e))return this.handleResponse(e),!0;if(tr(e)){let t=e;return process.stderr.write(`[acp-server] \u922B?recv id=${String(t.id)} method=${t.method}
|
|
682
682
|
`),this.handleRequest(t),!0}return nr(e)?(this.handleNotification(e),!0):!1}emitSessionUpdate(e,t,n){if(t.startsWith("x_")&&!this.hostSupportsExtendedEvents)return;let r={jsonrpc:"2.0",method:kt.SESSION_UPDATE,params:{sessionId:e,update:{sessionUpdate:t,...n}}};this.transport.send(r)}async requestPermission(e){let t=`perm-${EC().slice(0,8)}`,n={jsonrpc:"2.0",method:kt.SESSION_REQUEST_PERMISSION,params:e,id:t};return new Promise(r=>{this.outboundRequestMap.set(t,e.permissionId),this.pendingPermissions.set(e.permissionId,{resolve:s=>r({optionId:s})}),this.transport.send(n)})}get supportsExtendedEvents(){return this.hostSupportsExtendedEvents}get supportsExtendedMethods(){return this.hostSupportsExtendedMethods}get sessionId(){return this.activeSessionId}async handleRequest(e){let{method:t,params:n,id:r}=e,s=n??{};try{switch(t){case kt.INITIALIZE:await this.onInitialize(r,s);break;case kt.SESSION_NEW:await this.onSessionNew(r,s);break;case kt.SESSION_PROMPT:await this.onSessionPrompt(r,s);break;case kt.SESSION_END:await this.onSessionEnd(r,s);break;case kt.SESSION_SET_CONFIG:await this.onSessionSetConfig(r,s);break;case kt.SESSION_SET_MODEL:await this.handler.handleAcpSessionSetModel(s.sessionId??this.activeSessionId??"",s.modelId??s.model??""),this.sendResult(r,{});break;case kt.SESSION_SET_MODE:await this.handler.handleAcpSessionSetMode(s.sessionId??this.activeSessionId??"",s.modeId??s.mode??""),this.sendResult(r,{});break;case be.ABORT:await this.onAbort(r,s);break;case be.DREAM:await this.onDream(r,s);break;case be.AGENTS_LIST:{let i=await this.handler.handleAcpAgentsList();this.sendResult(r,i);break}case be.SOLO_START:{let i=await this.handler.handleAcpSoloStart(s);this.sendResult(r,i);break}case be.SOLO_STATUS:{let i=await this.handler.handleAcpSoloStatus(s);this.sendResult(r,i);break}case be.SOLO_SELECT:{let i=await this.handler.handleAcpSoloSelect(s);this.sendResult(r,i);break}case be.SOLO_CANCEL:{let i=await this.handler.handleAcpSoloCancel(s);this.sendResult(r,i);break}case be.SOLO_SUBSCRIBE:{let i=await this.handler.handleAcpSoloSubscribe(s);this.sendResult(r,i);break}case be.SOLO_MESSAGE:{let i=await this.handler.handleAcpSoloMessage(s);this.sendResult(r,i);break}case be.SOLO_EVALUATE:{let i=await this.handler.handleAcpSoloEvaluate(s);this.sendResult(r,i);break}case be.PRODUCT_CREATE:{let i=await this.handler.handleAcpProductCreate(s);this.sendResult(r,i);break}case be.PRODUCT_PLAN:{let i=await this.handler.handleAcpProductPlan(s);this.sendResult(r,i);break}case be.PRODUCT_CONFIRM:{let i=await this.handler.handleAcpProductConfirm(s);this.sendResult(r,i);break}case be.PRODUCT_MESSAGE:{let i=await this.handler.handleAcpProductMessage(s);this.sendResult(r,i);break}case be.PRODUCT_PAUSE:{let i=await this.handler.handleAcpProductPause(s);this.sendResult(r,i);break}case be.PRODUCT_RESUME:{let i=await this.handler.handleAcpProductResume(s);this.sendResult(r,i);break}case be.PRODUCT_CANCEL:{let i=await this.handler.handleAcpProductCancel(s);this.sendResult(r,i);break}case be.PRODUCT_ROLLBACK:{let i=await this.handler.handleAcpProductRollback(s);this.sendResult(r,i);break}case be.PRODUCT_STATUS:{let i=await this.handler.handleAcpProductStatus(s);this.sendResult(r,i);break}case be.PRODUCT_SUBSCRIBE:{let i=await this.handler.handleAcpProductSubscribe(s);this.sendResult(r,i);break}case be.TEAM_DELEGATE:{let i=await this.handler.handleAcpTeamDelegate(s);this.sendResult(r,i);break}default:this.sendError(r,js.METHOD_NOT_FOUND,`Unknown method: ${t}`)}}catch(i){this.sendError(r,js.INTERNAL_ERROR,i.message)}}handleNotification(e){this.log(`received notification: ${e.method}`)}handleResponse(e){let t=this.outboundRequestMap.get(e.id);if(t){this.outboundRequestMap.delete(e.id);let n=this.pendingPermissions.get(t);if(n){this.pendingPermissions.delete(t);let r=e.result;n.resolve(r?.optionId??"deny")}}else this.log(`received response for id=${String(e.id)} (no matching outbound request)`)}async onInitialize(e,t){this.hostCapabilities=t.clientCapabilities??{},this.hostSupportsExtendedEvents=this.hostCapabilities.extendedEvents??!1,this.hostSupportsExtendedMethods=this.hostCapabilities.extendedMethods??!1;let n=t.clientInfo?.name??"unknown",r=t.clientInfo?.version??"unknown";this.log(`initialize: host=${n} v=${r}, proto=${String(t.protocolVersion)}, extendedEvents=${this.hostSupportsExtendedEvents}, extendedMethods=${this.hostSupportsExtendedMethods}`);let s=await this.handler.handleAcpInitialize(t);this.sendResult(e,s)}async onSessionNew(e,t){let n=await this.handler.handleAcpSessionNew(t);this.activeSessionId=n.sessionId,this.sendResult(e,n)}async onSessionPrompt(e,t){if(!this.activeSessionId||this.activeSessionId!==t.sessionId){this.sendError(e,js.SESSION_NOT_FOUND,`No active session with id: ${t.sessionId}`);return}let n=await this.handler.handleAcpSessionPrompt(t);this.sendResult(e,n)}async onSessionEnd(e,t){await this.handler.handleAcpSessionEnd(t),this.activeSessionId===t.sessionId&&(this.activeSessionId=null),this.sendResult(e,{})}async onSessionSetConfig(e,t){if(this.activeSessionId!==t.sessionId){this.sendError(e,js.SESSION_NOT_FOUND,`No active session with id: ${t.sessionId}`);return}await this.handler.handleAcpSessionSetConfig(t),this.sendResult(e,{})}async onAbort(e,t){await this.handler.handleAcpAbort(t),this.sendResult(e,{aborted:!0})}async onDream(e,t){let n=await this.handler.handleAcpDream(t);this.sendResult(e,n)}sendResult(e,t){process.stderr.write(`[acp-server] \u922B?send id=${String(e)} result
|
|
683
683
|
`);let n={jsonrpc:"2.0",id:e,result:t};this.transport.send(n)}sendError(e,t,n,r){process.stderr.write(`[acp-server] \u922B?send id=${String(e)} error=${n}
|
|
684
684
|
`);let s={jsonrpc:"2.0",id:e,error:{code:t,message:n,...r!==void 0?{data:r}:{}}};this.transport.send(s)}isJsonRpcResponse(e){if(!e||typeof e!="object")return!1;let t=e;return t.jsonrpc==="2.0"&&"id"in t&&("result"in t||"error"in t)&&!("method"in t)}log(e){this.verbose&&process.stderr.write(`[acp-server] ${e}
|
|
@@ -805,7 +805,7 @@ Content-Disposition: form-data; name="prompt"\r
|
|
|
805
805
|
`)+`\r
|
|
806
806
|
`,u=await fetch(i,{method:"POST",headers:{Authorization:`Bearer ${r}`,"Content-Type":`multipart/form-data; boundary=${l}`},body:d});if(!u.ok){let m=await u.text();a.release({success:!1,errorCode:u.status}),o.id!==void 0&&this.sendResponse(o.id,void 0,{code:w.INTERNAL_ERROR,message:`STT API error (${u.status}): ${m.slice(0,200)}`});return}let p=await u.json();a.release({success:!0}),o.id!==void 0&&this.sendResponse(o.id,{text:p.text??"",model:p.model})}catch(l){a.release({success:!1}),o.id!==void 0&&this.sendResponse(o.id,void 0,{code:w.INTERNAL_ERROR,message:l instanceof Error?l.message:String(l)})}}mt();var ii="\u65E0\u6CD5\u8FDE\u63A5 llmrouter \u6A21\u578B\u76EE\u5F55",po=class extends Error{constructor(e=ii){super(e),this.name="LlmrouterCatalogUnavailableError"}};function ME(){let o=process.env.QLOGIC_LLMROUTER_BASE_URL?.trim().replace(/\/+$/,"");if(!o)throw new po;return o}function OE(){let o={accept:"application/json"},e=process.env.QLOGIC_LLMROUTER_ACCESS_TOKEN?.trim();return e&&(o.authorization=`Bearer ${e}`),o}async function bk(o){let e=ME(),t;try{t=await fetch(`${e}${o}`,{method:"GET",headers:OE(),signal:AbortSignal.timeout(1e4)})}catch{throw new po}if(!t.ok)throw new po;let n=await t.json().catch(()=>null),r=Array.isArray(n)?n:UE(n)&&Array.isArray(n.data)?n.data:null;if(!r)throw new po;return r}async function ai(){return bk("/ext/model-catalog/providers")}async function DE(){return bk("/ext/model-catalog/models")}function yd(o){let e={zhipu:"Zhipu GLM","zhipu-openai":"Zhipu GLM OpenAI","zhipu-coding":"Zhipu GLM Coding",volcengine:"Doubao / Volcengine"};return e[o.id]?e[o.id]:o.displayName??o.name??o.id}function li(o){return o.baseUrl??o.base_url}async function bd(o){return(await ai()).find(t=>t.id===o)??null}async function kd(o){let e=await DE();o.migrateModelIds(LE(e));let t=e.map(NE).filter(n=>!!n);return o.replaceCatalogModels(t),t}function LE(o){let e=new Map;for(let t of o){let n=t.provider??t.owned_by,r=t.public_model??t.publicModel??t.id,s=t.native_model_id??t.nativeModelId??t.id;if(!n||!r||!s)continue;let i=`${n}:${r}`;for(let a of[s,t.id])!a||a===r||e.set(`${n}:${a}`,i)}return e}function NE(o){let e=o.provider??o.owned_by,t=o.public_model??o.publicModel??o.id,n=o.native_model_id??o.nativeModelId??o.id;return!e||!t||!n?null:{id:`${e}:${t}`,provider:e,model:t,displayName:o.display_name??o.displayName??o.name??o.id,purposes:$E(o.purposes,o.category),baseUrl:o.baseUrl??o.base_url,enabled:!0,nativeModelId:n,transport:o.provider_transport??o.providerTransport,contextWindow:o.context_window??o.contextWindow,maxOutput:o.max_output??o.maxOutput,streamRequired:o.stream_required??o.streamRequired,capabilities:o.capabilities,pricing:o.pricing}}function $E(o,e){let t=[...o??[],e].filter(s=>!!s),n=new Set(["textGeneration","smallModel","stt","tts","imageGeneration","imageUnderstanding","videoGeneration","videoUnderstanding","threeDGeneration","embedding","voiceClone","musicGeneration","realtimeAudio","realtimeVideo"]),r=t.filter(s=>n.has(s));return[...new Set(r.length?r:["textGeneration"])]}function UE(o){return!!o&&typeof o=="object"&&!Array.isArray(o)}function jE(o){return o.length<=8?"****":`${o.slice(0,3)}***${o.slice(-4)}`}function ct(o,e,t,n=w.INTERNAL_ERROR){if(e.id!==void 0){if(typeof o.sendError=="function"){o.sendError(e.id,n,t);return}o.sendResponse(e.id,void 0,{code:n,message:t})}}function ci(o,e){ct(o,e,ii)}function FE(o){let e={};for(let t of o)for(let n of t.purposes)e[n]??=[],e[n].push(t);return e}async function vd(){let o=J(),e=await kd(o);return o.save(),e}async function kk(o){try{let e=(await ai()).map(t=>({id:t.id,displayName:yd(t),baseUrl:li(t)??"",modelCount:t.models?.length??0}));o.id!==void 0&&this.sendResponse(o.id,{providers:e})}catch{ci(this,o)}}async function vk(o){let e=o.params;if(!e?.providerId||!e?.key){ct(this,o,"Required: providerId (string), key (string)",w.INVALID_PARAMS);return}let{providerId:t,key:n,label:r}=e;try{let s=await bd(t);if(!s){ct(this,o,`Unknown provider: ${t}`,w.INVALID_PARAMS);return}let i=J();if(i.getProviderStatus(t)?.keys.some(c=>c.key===n)){o.id!==void 0&&this.sendResponse(o.id,{ok:!1,error:"\u8BE5 Key \u5DF2\u5B58\u5728\uFF0C\u65E0\u9700\u91CD\u590D\u6DFB\u52A0"});return}i.addProvider(t,{baseUrl:li(s)});let l=i.addKey(t,n,{label:r});await vd();for(let c of Lo)if(!i.getBinding(c)){let d=i.listModels({purpose:c,provider:t,enabledOnly:!0});d.length>0&&i.setBinding(c,d[0].id)}i.setKeyHealth(l,"healthy"),i.save(),o.id!==void 0&&this.sendResponse(o.id,{ok:!0,keyId:l,providerId:t})}catch(s){let i=s instanceof Error?s.message:ii;ct(this,o,i)}}function Sk(o){let e=o.params;if(!e?.keyId){ct(this,o,"Required: keyId (string)",w.INVALID_PARAMS);return}let t=J();t.removeKey(e.keyId),t.save(),o.id!==void 0&&this.sendResponse(o.id,{ok:!0})}function Tk(o){let e=o.params;if(!e?.keyId||typeof e.enabled!="boolean"){ct(this,o,"Required: keyId (string), enabled (boolean)",w.INVALID_PARAMS);return}let t=J();t.updateKey(e.keyId,{enabled:e.enabled}),t.save(),o.id!==void 0&&this.sendResponse(o.id,{ok:!0})}function wk(o){let e=o.params;if(!e?.modelId||typeof e.enabled!="boolean"){ct(this,o,"Required: modelId (string), enabled (boolean)",w.INVALID_PARAMS);return}let t=J();e.enabled?t.enableModel(e.modelId):t.disableModel(e.modelId),t.save(),o.id!==void 0&&this.sendResponse(o.id,{ok:!0})}async function xk(o){let e=o.params;try{await vd();let t=J(),n=new Set(t.getAllProviderStatus().filter(s=>s.keys.length>0).map(s=>s.providerId)),r=t.listModels({purpose:e?.purpose,provider:e?.provider}).filter(s=>t.hasConfiguredKeyForProviderVariant(s.provider));o.id!==void 0&&this.sendResponse(o.id,{models:r,grouped:FE(r),configuredProviderIds:[...n]})}catch{ci(this,o)}}function Rk(o){let e=o.params;if(!e?.purpose||!e?.modelId){ct(this,o,"Required: purpose (string), modelId (string)",w.INVALID_PARAMS);return}try{let t=J();t.setBinding(e.purpose,e.modelId),t.save(),o.id!==void 0&&this.sendResponse(o.id,{ok:!0})}catch(t){ct(this,o,t instanceof Error?t.message:String(t),w.INVALID_PARAMS)}}function _k(o){let e=o.params;if(!e?.purpose){ct(this,o,"Required: purpose (string)",w.INVALID_PARAMS);return}let t=J(),n=t.getBinding(e.purpose);o.id!==void 0&&this.sendResponse(o.id,{model:n?{id:n.id,provider:n.provider,model:n.model,displayName:n.displayName,purposes:n.purposes,enabled:n.enabled}:null,available:t.isAvailable(e.purpose)})}async function Ak(o){try{let e=await ai(),t=new Map(e.map(a=>[a.id,yd(a)]));await vd();let n=J(),r=n.getAllProviderStatus().map(a=>({providerId:a.providerId,displayName:t.get(a.providerId)??a.providerId,baseUrl:a.baseUrl,keyCount:a.keys.length,healthyKeys:a.keys.filter(l=>l.healthStatus==="healthy"&&l.enabled).length,totalKeys:a.keys.length,keys:a.keys.map(l=>({id:l.id,label:l.label,maskedKey:jE(l.key),enabled:l.enabled,health:l.healthStatus}))})),s=n.getAllBindings(),i={};for(let a of Lo){let l=s[a];i[a]={bound:!!l,modelId:l?.id,modelName:l?.displayName,available:n.isAvailable(a)}}o.id!==void 0&&this.sendResponse(o.id,{providers:r,purposes:i})}catch{ci(this,o)}}async function Pk(o){try{let e=J();e.load(),await kd(e),e.save(),o.id!==void 0&&this.sendResponse(o.id,{ok:!0,catalogRefreshed:!0})}catch{ci(this,o)}}async function Ik(o){let e=o.params;if(!e?.providerId||!e?.apiKey){ct(this,o,"providerId and apiKey required",w.INVALID_PARAMS);return}try{let t=await bd(e.providerId),n=e.baseUrl||(t?li(t):void 0);if(!n){ct(this,o,`Unknown provider: ${e.providerId}`,w.INVALID_PARAMS);return}let r=`${n.replace(/\/$/,"")}/models`,s=await fetch(r,{method:"GET",headers:{Authorization:`Bearer ${e.apiKey}`},signal:AbortSignal.timeout(1e4)});if(s.ok){o.id!==void 0&&this.sendResponse(o.id,{valid:!0,status:s.status});return}let i=await s.text().catch(()=>"");o.id!==void 0&&this.sendResponse(o.id,{valid:!1,status:s.status,error:i.slice(0,500)})}catch(t){let n=t instanceof Error?t.message:String(t);o.id!==void 0&&this.sendResponse(o.id,{valid:!1,status:0,error:n})}}pr();Ys();Zc();Xs();Js();async function Ck(o){let e=this.getActiveProjectRoot(),t=new $t(e),n=t.load();if(n){this.sendNotification("pet.soul_ready",{name:n.name,species:n.species,personality:n.personality,catchphrase:n.catchphrase,stats:n.stats,rarity:n.rarity,breed:n.breed,breedColors:n.breedColors}),o.id!==void 0&&this.sendResponse(o.id,{ok:!0,soul:n});return}let r=this.deviceId??"default-user";try{let s=this.createPetSoulGenerator?.(),i=await t.hatch(r,s);this.sendNotification("pet.soul_ready",{name:i.name,species:i.species,personality:i.personality,catchphrase:i.catchphrase,stats:i.stats,rarity:i.rarity,breed:i.breed,breedColors:i.breedColors}),this.sendNotification("pet.growth",{level:i.level,experience:i.experience,abilities:Ve.getUnlockedAbilities(i.level).map(a=>a.name)}),o.id!==void 0&&this.sendResponse(o.id,{ok:!0,soul:i})}catch(s){o.id!==void 0&&this.sendResponse(o.id,void 0,{code:w.INTERNAL_ERROR,message:s.message??"Failed to hatch pet"})}}async function Ek(o){let t=o.params?.action??"pat",n=this.getActiveProjectRoot(),r=new $t(n),s=r.load();if(!s){o.id!==void 0&&this.sendResponse(o.id,void 0,{code:w.INVALID_PARAMS,message:"Pet not hatched yet"});return}let i=Ve.xpForEvent(`interact.${t}`),{newLevel:a,newXp:l,events:c,statBoosts:d}=Ve.processXpGain(s,i);s.level=a,s.experience=l;for(let[b,k]of Object.entries(d)){let x=b;s.stats[x]=Math.min(10,s.stats[x]+(k??0))}r.updateSoul(s),this.sendNotification("pet.state",{state:"happy"});let u=Ve.getUnlockedAbilities(a).map(b=>b.name),p=Ve.getNextAbility(a);this.sendNotification("pet.growth",{level:a,experience:l,xpNeeded:Ve.xpForLevel(a),abilities:u,nextAbility:p?{name:p.name,level:p.unlockedAtLevel}:void 0});for(let b of c)b.type==="molt"?this.sendNotification("pet.reaction",{text:`\u2728 \u8131\u58F3\u4E86\uFF01\u7B2C ${b.moltStage} \u6B21\u8715\u53D8`,style:"excited"}):b.type==="ability_unlock"&&b.ability&&this.sendNotification("pet.reaction",{text:`\u{1F389} \u89E3\u9501\u65B0\u80FD\u529B\uFF1A${b.ability.name}`,style:"excited"});let m=null,h="excited";try{let b=[],k=this.getActiveProjectRoot?.()??"";if(k){let $=k.split(/[\\/]/).pop()??k;b.push(`\u7528\u6237\u6B63\u5728\u9879\u76EE\u300C${$}\u300D\u4E2D\u5DE5\u4F5C`)}if(this.sessionState){let $=this.sessionState.turnCount??0;$>0&&b.push(`\u672C\u6B21\u4F1A\u8BDD\u5DF2\u8FDB\u884C\u4E86 ${$} \u8F6E\u5BF9\u8BDD`)}if(this.memoryProvider&&this.memoryUserId)try{let $=this.memoryProvider.getActivitySummary(this.memoryUserId,7);if($?.highlights?.length){let W=$.highlights.slice(0,3).map(S=>S.text);b.push(`\u7528\u6237\u8FD1\u671F\u8BB0\u5FC6\u4EAE\u70B9: ${W.join("\uFF1B")}`)}}catch{}let x=new Date().getHours(),I=x<6?"\u6DF1\u591C":x<9?"\u65E9\u6668":x<12?"\u4E0A\u5348":x<14?"\u4E2D\u5348":x<18?"\u4E0B\u5348":x<22?"\u665A\u4E0A":"\u6DF1\u591C";b.push(`\u5F53\u524D\u65F6\u6BB5: ${I}`);let P=t==="pat"?"\u7528\u6237\u6478\u4E86\u6478\u4F60":t==="feed"?"\u7528\u6237\u5582\u4E86\u4F60\u4E1C\u897F":`\u7528\u6237\u5BF9\u4F60\u505A\u4E86\u300C${t}\u300D`;b.push(P);let O=b.join("\u3002");if(this.createSmallLLMCall){let $=this.createSmallLLMCall();if($){let W=await Ks({turnSummary:O,soul:s},$);W&&(m=W.text,h=W.style)}}}catch{}if(!m){let b=Vs("session.created");m=b?.text??null,h=b?.style??"excited"}let f=[],y=new Date().getHours();y>=22||y<6?f.push({label:"\u5E2E\u6211\u6574\u7406\u4ECA\u5929\u7684\u8FDB\u5EA6",action:"summarize-today"}):this.sessionState?.turnCount&&this.sessionState.turnCount>5&&f.push({label:"\u7EE7\u7EED\u521A\u624D\u7684\u5BF9\u8BDD",action:"resume-session"}),t==="click"&&f.push({label:"\u6709\u4EC0\u4E48\u80FD\u5E2E\u4F60\u7684\uFF1F",action:"start-chat"}),m&&this.sendNotification("pet.reaction",{text:m,style:h,actions:f.length>0?f:void 0}),o.id!==void 0&&this.sendResponse(o.id,{ok:!0,action:t,level:a,experience:l,events:c.map(b=>({type:b.type,level:b.level})),reaction:m?{text:m,style:h,actions:f.length>0?f:void 0}:null})}async function Mk(o){let e=this.getActiveProjectRoot(),n=new $t(e).load();if(o.id!==void 0&&this.sendResponse(o.id,{ok:!0,soul:n??null}),n){this.sendNotification("pet.soul_ready",{name:n.name,species:n.species,personality:n.personality,catchphrase:n.catchphrase,stats:n.stats,rarity:n.rarity,breed:n.breed,breedColors:n.breedColors});let r=Ve.getUnlockedAbilities(n.level).map(i=>i.name),s=Ve.getNextAbility(n.level);this.sendNotification("pet.growth",{level:n.level,experience:n.experience,xpNeeded:Ve.xpForLevel(n.level),abilities:r,nextAbility:s?{name:s.name,level:s.unlockedAtLevel}:void 0})}}async function Ok(o){let e=o.params;if(!e?.description&&!e?.imageBase64){o.id!==void 0&&this.sendResponse(o.id,void 0,{code:w.INVALID_PARAMS,message:"Provide description or imageBase64"});return}this.sendNotification("pet.state",{state:"building"}),this.sendNotification("pet.reaction",{text:"\u6B63\u5728\u5B75\u5316\u4F60\u7684\u4E13\u5C5E\u5BA0\u7269...",style:"thinking"});try{let t=e.description?.slice(0,10)??"\u81EA\u5B9A\u4E49\u5BA0\u7269",n=e.description??"";e.imageBase64&&(n=await this.forgeAnalyzeImage(e.imageBase64,e.description),this.sendNotification("pet.reaction",{text:"\u5206\u6790\u5B8C\u6210\uFF0C\u6B63\u5728\u751F\u6210\u9AA8\u67B6...",style:"thinking"}));let r=await this.forgeGenerateSkeleton(n),s=Zt(r),i=ao(s),a=0;for(;i.length>0&&a<2;){a++,this.sendNotification("pet.reaction",{text:`\u9AA8\u67B6\u7F3A\u5C11 ${i.join("\u3001")}\uFF0C\u91CD\u65B0\u751F\u6210 (${a}/${2})...`,style:"thinking",duration:3e3});let m=`\u4E0A\u6B21\u751F\u6210\u7F3A\u5C11\u4EE5\u4E0B\u90E8\u4F4D: ${i.join(", ")}\u3002\u8BF7\u786E\u4FDD\u6240\u6709 id \u5C5E\u6027\u90FD\u5B58\u5728\u3002`;r=await this.forgeGenerateSkeleton(n+`
|
|
807
807
|
|
|
808
|
-
`+m),s=Zt(r),i=ao(s)}i.length>0&&this.sendNotification("pet.reaction",{text:"\u9AA8\u67B6\u4E0D\u5B8C\u6574\uFF0C\u90E8\u5206\u52A8\u753B\u53EF\u80FD\u7F3A\u5931\uFF0C\u7EE7\u7EED\u751F\u6210...",style:"normal",duration:3e3}),this.sendNotification("pet.reaction",{text:"\u9AA8\u67B6\u751F\u6210\u5B8C\u6210\uFF0C\u5F00\u59CB\u6E32\u67D3\u5404\u72B6\u6001...",style:"thinking"});let l=["idle","thinking","working","done","happy","error","sleeping","eating"],c={baseSvg:s,parts:ro(s),colors:io(s),characterDesc:n},d={};for(let m of l)d[m]=so(c,m),this.sendNotification("pet.reaction",{text:`\u6E32\u67D3 ${m} \u72B6\u6001... (${Object.keys(d).length}/${l.length})`,style:"thinking",duration:2e3});let u=dr(d.idle,d,{threshold:6});if(!u.passedAll&&u.retryStates.length>0&&(this.sendNotification("pet.reaction",{text:`\u4E00\u81F4\u6027\u68C0\u67E5\uFF1A${u.retryStates.length} \u4E2A\u72B6\u6001\u9700\u4F18\u5316...`,style:"thinking",duration:3e3}),u.overallScore<4)){let m=ur(n,"all","\u9AA8\u67B6\u7ED3\u6784\u4E0D\u5B8C\u6574\u5BFC\u81F4\u591A\u72B6\u6001\u4E00\u81F4\u6027\u5DEE",1);r=await this.forgeGenerateSkeleton(m);let h={baseSvg:Zt(r),parts:ro(Zt(r)),colors:io(Zt(r)),characterDesc:n};for(let f of l)d[f]=so(h,f)}let p={version:1,name:t,author:"user-generated",created:new Date().toISOString(),generator:"xiaozhi-pet-forge-v2-skeleton",source:{type:e.imageBase64?"image":"text",prompt:e.description},dimensions:{width:200,height:200},states:Object.fromEntries(l.map(m=>[m,{file:`states/${m}.svg`,loop:m!=="done"&&m!=="happy"&&m!=="eating",...m==="done"||m==="happy"?{duration:3e3}:m==="eating"?{duration:4e3}:{}}])),eyeTracking:{enabled:!0,pupils:[".left-eye .pupil",".right-eye .pupil"],maxOffset:3},colors:c.colors,consistency:{score:u.overallScore,method:"skeleton-parameterized"}};ar(p),this.sendNotification("pet.reaction",{text:`\u2705 \u5BA0\u7269\u300C${t}\u300D\u5DF2\u953B\u9020\u5B8C\u6210\uFF01\u4E00\u81F4\u6027\u8BC4\u5206 ${u.overallScore.toFixed(1)}/10`,style:"excited"}),this.sendNotification("pet.state",{state:"done"}),this.sendNotification("pet.forged",{name:t,svgs:d}),o.id!==void 0&&this.sendResponse(o.id,{ok:!0,manifest:p,svgs:d,status:"complete",consistency:{score:u.overallScore,passedAll:u.passedAll}})}catch(t){this.sendNotification("pet.state",{state:"error"}),this.sendNotification("pet.reaction",{text:"\u953B\u9020\u5931\u8D25\u4E86...",style:"normal"}),o.id!==void 0&&this.sendResponse(o.id,void 0,{code:w.INTERNAL_ERROR,message:t.message??"Forge failed"})}}var WE=BE(import.meta.url),GE=WE("../../package.json").version;function HE(o){let e=o.pathname.split("/").filter(Boolean),n=(e[e.length-1]??"").replace(/\.md$/i,"").replace(/[^a-zA-Z0-9_-]/g,"-");return/^(skill|readme|index|install|main)$/i.test(n)&&e.length>=2?e[e.length-2].replace(/[^a-zA-Z0-9_-]/g,"-"):n||""}var Sd=class o{running=!1;activeTurn=null;turnDone=Promise.resolve();verbose;transport;registry;mediaClient;agent=null;lastLlmConfigKey="";currentSessionId="";currentTurnId="";currentHooks=null;mcpManager=null;mcpReady=Promise.resolve();pluginLoader=null;permissionChecker=null;permissionUnregister=null;currentTransport=null;currentApiKey="";currentModel="";currentProvider="";currentBaseUrl="";sessionState=null;currentMediaApiKeys=null;taskStore=new rs;mediaPersistence=new Ds;memoryPrefetchState=Kt();memoryProvider=null;memoryUserId="";lastUserMessageForAutoExtract;lastAssistantMessageForExtract;memdir=null;fileWatcher=null;pendingAskUser=new Map;sessionTaskDomain;acpDetector=new Ps;agentConfigStore=null;soloEvaluator=null;productOrchestrator=null;productPlanner=null;soloProcessManager=null;productProcessManager=null;acpServer=null;acpSessionHistory=new Map;resumedSessionHistory=new Map;idleDreamTimer=null;constructor(e){this.verbose=e.verbose,this.registry=new sn,this.mediaClient=new Ro({registry:this.registry}),J().onChange(()=>{this.lastLlmConfigKey=""});let t=Number(process.env.QLOGICAGENT_IDLE_DREAM_MS);t>0&&(we.dream.idleMinutes=t/6e4);let n=Number(process.env.QLOGICAGENT_DREAM_COOLDOWN_MS);n>=0&&(we.dream.cooldownMs=n),this.transport=e.transport??new $o({verbose:e.verbose}),this.taskStore.onTaskChange((r,s)=>{s&&this.sendNotification("task.updated",{taskId:r,type:s.type,lifecycle:s.lifecycle,label:s.label})}),rg({log:{info:r=>this.log(r),warn:r=>this.log(`[warn] ${r}`),error:r=>this.log(`[error] ${r}`),debug:r=>{e.verbose&&this.log(`[debug] ${r}`)}},onExecProgress:r=>{this.sendNotification("turn.exec_progress",{output:r.output,elapsedTimeSeconds:r.elapsedTimeSeconds,totalLines:r.totalLines,totalBytes:r.totalBytes})}})}getActiveProjectRoot(){let e=Le();return e?.workspaceDir?e.workspaceDir:process.cwd()}setActiveWorkdir(e){e!==this.getActiveProjectRoot()&&(tg(e),this.mediaPersistence.setProjectDir(e))}start(){this.running=!0,this.log("qlogicagent started, waiting for JSON-RPC messages..."),Qp().then(e=>{e.error?this.log(`[warmup] embedding model not available: ${e.error}`):e.modelDownloaded?this.log(`[warmup] embedding model downloaded (${e.dimensions}d)`):e.modelCached&&this.log(`[warmup] embedding model ready (cached, ${e.dimensions}d)`)}).catch(()=>{}),this.transport.onMessage(e=>{if(this.acpServer){if(Kc(e)||nr(e)){this.acpServer.dispatchMessage(e);return}if(tr(e)){let t=e.method;if(t==="initialize"||t.startsWith("session/")||t.startsWith("x/")||t.startsWith("fs/")){this.acpServer.dispatchMessage(e);return}}}if(!Vc(e)){this.log("[warn] ignoring non-request message");return}this.handleMessage(e)}),this.transport.onClose(()=>{this.log("transport closed, shutting down"),this.stop()}),this.transport.start()}stop(){if(this.running){this.running=!1,this.cancelIdleDreamTimer(),this.currentSessionId&&this.currentHooks&&(this.currentHooks.invoke("stop",{sessionId:this.currentSessionId,reason:"shutdown"}).catch(()=>{}),this.currentHooks.invoke("session.ended",{sessionId:this.currentSessionId}).catch(()=>{}));try{ah().catch(()=>{}),this.fileWatcher&&(this.fileWatcher.stop(),this.fileWatcher=null),this.mcpManager&&(this.mcpManager.disconnectAll().catch(()=>{}),this.mcpManager=null),this.permissionUnregister&&(this.permissionUnregister(),this.permissionUnregister=null),this.activeTurn&&(this.activeTurn.abort(),this.activeTurn=null),this.transport.close()}catch(e){this.currentSessionId&&this.currentHooks&&this.currentHooks.invoke("stop.failed",{sessionId:this.currentSessionId,reason:"cleanup_error",error:e.message}).catch(()=>{})}this.log("stopped")}}methodHandlers=new Map([["initialize",e=>this.handleInitialize(e)],["agent.ping",e=>this.handlePing(e)],["thread.turn",e=>ay.call(this,e)],["memory.dream",e=>Zs.call(this,e)],["agent.abort",e=>ry.call(this,e)],["tool.approval.response",e=>sy.call(this,e)],["thread.user_response",e=>iy.call(this,e)],["thread.list",e=>My.call(this,e)],["session.resume",e=>Wy.call(this,e)],["thread.create",e=>Ey.call(this,e)],["session.getInfo",e=>Gy.call(this,e)],["session.create",e=>Oy.call(this,e)],["session.resolve",e=>Dy.call(this,e)],["session.list",e=>Ly.call(this,e)],["session.get",e=>Ny.call(this,e)],["session.getMessages",e=>$y.call(this,e)],["session.update",e=>Uy.call(this,e)],["session.delete",e=>jy.call(this,e)],["session.deleteAll",e=>Fy.call(this,e)],["session.archive",e=>By.call(this,e)],["memory.list",e=>Ub.call(this,e)],["memory.atlas",e=>jb.call(this,e)],["memory.activity",e=>Fb.call(this,e)],["memory.read",e=>Bb.call(this,e)],["memory.write",e=>Wb.call(this,e)],["memory.search",e=>Gb.call(this,e)],["memory.delete",e=>Hb.call(this,e)],["tools.list",e=>Vb.call(this,e)],["media.listModels",e=>fk.call(this,e)],["media.cancel",e=>gk.call(this,e)],["media.status",e=>hk.call(this,e)],["media.stt",e=>yk.call(this,e)],["settings.listProviders",e=>kk.call(this,e)],["settings.addKey",e=>vk.call(this,e)],["settings.removeKey",e=>Sk.call(this,e)],["settings.toggleKey",e=>Tk.call(this,e)],["settings.toggleModel",e=>wk.call(this,e)],["settings.listModels",e=>xk.call(this,e)],["settings.setActiveModel",e=>Rk.call(this,e)],["settings.getActiveModel",e=>_k.call(this,e)],["settings.getOverview",e=>Ak.call(this,e)],["settings.refreshModels",e=>Pk.call(this,e)],["settings.validateKey",e=>Ik.call(this,e)],["provider.list",e=>Kb.call(this,e)],["config.get",e=>zb.call(this,e)],["config.update",e=>qb.call(this,e)],["config.tunables",e=>Yb.call(this,e)],["config.updateTunable",e=>Xb.call(this,e)],["todos.list",e=>Jb.call(this,e)],["tasks.list",e=>Qb.call(this,e)],["tasks.cancel",e=>Zb.call(this,e)],["agents.scan",e=>tk.call(this,e)],["agents.list",e=>nk.call(this,e)],["agents.config",e=>ok.call(this,e)],["agents.setConfig",e=>rk.call(this,e)],["agents.getConfig",e=>sk.call(this,e)],["agents.removeConfig",e=>ik.call(this,e)],["agents.setGateway",e=>ak.call(this,e)],["agents.getGateway",e=>lk.call(this,e)],["agents.processes",e=>dk.call(this,e)],["agents.kill",e=>uk.call(this,e)],["agents.listConfigured",e=>ck.call(this,e)],["agents.getLog",e=>pk.call(this,e)],["agents.testConnection",e=>mk.call(this,e)],["solo.start",e=>Zy.call(this,e)],["solo.status",e=>eb.call(this,e)],["solo.cancel",e=>tb.call(this,e)],["solo.select",e=>nb.call(this,e)],["solo.list",e=>ob.call(this,e)],["solo.delete",e=>rb.call(this,e)],["solo.message",e=>sb.call(this,e)],["solo.evaluate",e=>ib.call(this,e)],["product.plan",e=>ky.call(this,e)],["product.confirm",e=>vy.call(this,e)],["product.message",e=>Sy.call(this,e)],["product.create",e=>Ty.call(this,e)],["product.resume",e=>wy.call(this,e)],["product.pause",e=>xy.call(this,e)],["product.checkpoint",e=>Ry.call(this,e)],["product.status",e=>_y.call(this,e)],["product.list",e=>Ay.call(this,e)],["product.delete",e=>Py.call(this,e)],["product.cancel",e=>Iy.call(this,e)],["product.rollback",e=>Cy.call(this,e)],["project.create",e=>bb.call(this,e)],["project.list",e=>kb.call(this,e)],["project.delete",e=>vb.call(this,e)],["project.purgeAll",e=>Sb.call(this,e)],["project.rename",e=>Tb.call(this,e)],["project.archive",e=>wb.call(this,e)],["project.unarchive",e=>xb.call(this,e)],["project.update",e=>_b.call(this,e)],["project.archiveByGroup",e=>Rb.call(this,e)],["session.switchProject",e=>Hy.call(this,e)],["session.focus",e=>Ky.call(this,e)],["session.moveToProject",e=>zy.call(this,e)],["session.getState",e=>Vy.call(this,e)],["files.list",e=>Ib.call(this,e)],["files.create",e=>Cb.call(this,e)],["files.rename",e=>Eb.call(this,e)],["files.delete",e=>Mb.call(this,e)],["files.gitStatus",e=>Ob.call(this,e)],["instructions.list",e=>Db.call(this,e)],["instructions.read",e=>Lb.call(this,e)],["instructions.write",e=>Nb.call(this,e)],["instructions.delete",e=>$b.call(this,e)],["skills.list",e=>lb.call(this,e)],["skills.activate",e=>cb.call(this,e)],["skills.deactivate",e=>db.call(this,e)],["skills.delete",e=>ub.call(this,e)],["skills.promote",e=>pb.call(this,e)],["skills.stats",e=>mb.call(this,e)],["skills.pin",e=>fb.call(this,e)],["skills.unpin",e=>gb.call(this,e)],["skills.curator",e=>hb.call(this,e)],["skills.lifecycle",e=>yb.call(this,e)],["pet.hatch",e=>Ck.call(this,e)],["pet.interact",e=>Ek.call(this,e)],["pet.status",e=>Mk.call(this,e)],["pet.forge",e=>Ok.call(this,e)],["pet.confirm_response",e=>this.handlePetConfirmResponse(e)]]);handleMessage(e){let t=this.methodHandlers.get(e.method);t?t(e):e.id!==void 0&&this.sendResponse(e.id,void 0,{code:w.METHOD_NOT_FOUND,message:`Unknown method: ${e.method}`})}handleInitialize(e){let t=e.params,n=t?.protocolVersion??"unknown",r=t?.host?.name??t?.hostName??"unknown",s=t?.host?.version??t?.hostVersion??"?",i=n.split(".")[0],a=to.split(".")[0];if(i!==a){this.log(`[initialize] protocol mismatch: host=${n} agent=${to}`),e.id!==void 0&&this.sendResponse(e.id,void 0,{code:w.PROTOCOL_MISMATCH,message:`Protocol version mismatch: host=${n}, agent=${to}`});return}this.log(`[initialize] host=${r} v${s}`),e.id!==void 0&&this.sendResponse(e.id,{protocolVersion:to,agent:{name:"qlogicagent",version:"0.1.0"},capabilities:{tools:Mt().map(l=>l.function.name),streaming:!0,threads:!0,notifications:["turn.start","turn.delta","turn.end","turn.error","turn.recovery","turn.tool_call","turn.tool_result","turn.tool_blocked","turn.reasoning_delta","turn.plan_update","turn.suggestions","turn.subagent_started","turn.subagent_delta","turn.subagent_ended","turn.media_result","turn.todos_updated","task.updated","turn.exec_progress","turn.artifact","tool.approval.request","turn.skill_instruction","turn.ask_user","memory.updated","session.info","permission.rule_updated","team.updated","turn.usage_update","pong"],methods:[..._h]}}),this.ensureDefaultProject()}ensureDefaultProject(){let e=Le();if(e)e.workspaceDir&&this.setActiveWorkdir(e.workspaceDir);else{let t=te.join(H(),"workspaces","default");Y.existsSync(t)||Y.mkdirSync(t,{recursive:!0});let n=Bp(t);md(t),this.setActiveWorkdir(t),this.sendNotification("project.created",{id:n.id,name:n.name,workspaceDir:n.workspaceDir,type:n.type})}this.ensureDefaultProjectDir();{let t=this.getActiveProjectRoot(),n=new Nt(t);n.ensureInitialized(),this.memdir=n}}ensureDefaultProjectDir(){let t=fe().find(n=>n.type==="default"&&n.status==="active");t&&(Y.existsSync(t.workspaceDir)||Y.mkdirSync(t.workspaceDir,{recursive:!0}))}handlePing(e){e.id!==void 0&&this.sendResponse(e.id,{status:"ok"}),this.sendNotification("pong",{})}static SUGGESTION_PROMPT=`[SUGGESTION MODE]
|
|
808
|
+
`+m),s=Zt(r),i=ao(s)}i.length>0&&this.sendNotification("pet.reaction",{text:"\u9AA8\u67B6\u4E0D\u5B8C\u6574\uFF0C\u90E8\u5206\u52A8\u753B\u53EF\u80FD\u7F3A\u5931\uFF0C\u7EE7\u7EED\u751F\u6210...",style:"normal",duration:3e3}),this.sendNotification("pet.reaction",{text:"\u9AA8\u67B6\u751F\u6210\u5B8C\u6210\uFF0C\u5F00\u59CB\u6E32\u67D3\u5404\u72B6\u6001...",style:"thinking"});let l=["idle","thinking","working","done","happy","error","sleeping","eating"],c={baseSvg:s,parts:ro(s),colors:io(s),characterDesc:n},d={};for(let m of l)d[m]=so(c,m),this.sendNotification("pet.reaction",{text:`\u6E32\u67D3 ${m} \u72B6\u6001... (${Object.keys(d).length}/${l.length})`,style:"thinking",duration:2e3});let u=dr(d.idle,d,{threshold:6});if(!u.passedAll&&u.retryStates.length>0&&(this.sendNotification("pet.reaction",{text:`\u4E00\u81F4\u6027\u68C0\u67E5\uFF1A${u.retryStates.length} \u4E2A\u72B6\u6001\u9700\u4F18\u5316...`,style:"thinking",duration:3e3}),u.overallScore<4)){let m=ur(n,"all","\u9AA8\u67B6\u7ED3\u6784\u4E0D\u5B8C\u6574\u5BFC\u81F4\u591A\u72B6\u6001\u4E00\u81F4\u6027\u5DEE",1);r=await this.forgeGenerateSkeleton(m);let h={baseSvg:Zt(r),parts:ro(Zt(r)),colors:io(Zt(r)),characterDesc:n};for(let f of l)d[f]=so(h,f)}let p={version:1,name:t,author:"user-generated",created:new Date().toISOString(),generator:"xiaozhi-pet-forge-v2-skeleton",source:{type:e.imageBase64?"image":"text",prompt:e.description},dimensions:{width:200,height:200},states:Object.fromEntries(l.map(m=>[m,{file:`states/${m}.svg`,loop:m!=="done"&&m!=="happy"&&m!=="eating",...m==="done"||m==="happy"?{duration:3e3}:m==="eating"?{duration:4e3}:{}}])),eyeTracking:{enabled:!0,pupils:[".left-eye .pupil",".right-eye .pupil"],maxOffset:3},colors:c.colors,consistency:{score:u.overallScore,method:"skeleton-parameterized"}};ar(p),this.sendNotification("pet.reaction",{text:`\u2705 \u5BA0\u7269\u300C${t}\u300D\u5DF2\u953B\u9020\u5B8C\u6210\uFF01\u4E00\u81F4\u6027\u8BC4\u5206 ${u.overallScore.toFixed(1)}/10`,style:"excited"}),this.sendNotification("pet.state",{state:"done"}),this.sendNotification("pet.forged",{name:t,svgs:d}),o.id!==void 0&&this.sendResponse(o.id,{ok:!0,manifest:p,svgs:d,status:"complete",consistency:{score:u.overallScore,passedAll:u.passedAll}})}catch(t){this.sendNotification("pet.state",{state:"error"}),this.sendNotification("pet.reaction",{text:"\u953B\u9020\u5931\u8D25\u4E86...",style:"normal"}),o.id!==void 0&&this.sendResponse(o.id,void 0,{code:w.INTERNAL_ERROR,message:t.message??"Forge failed"})}}var WE=BE(import.meta.url);function GE(){for(let o of["../package.json","../../package.json"])try{return WE(o).version}catch{}return"0.0.0"}var HE=GE();function VE(o){let e=o.pathname.split("/").filter(Boolean),n=(e[e.length-1]??"").replace(/\.md$/i,"").replace(/[^a-zA-Z0-9_-]/g,"-");return/^(skill|readme|index|install|main)$/i.test(n)&&e.length>=2?e[e.length-2].replace(/[^a-zA-Z0-9_-]/g,"-"):n||""}var Sd=class o{running=!1;activeTurn=null;turnDone=Promise.resolve();verbose;transport;registry;mediaClient;agent=null;lastLlmConfigKey="";currentSessionId="";currentTurnId="";currentHooks=null;mcpManager=null;mcpReady=Promise.resolve();pluginLoader=null;permissionChecker=null;permissionUnregister=null;currentTransport=null;currentApiKey="";currentModel="";currentProvider="";currentBaseUrl="";sessionState=null;currentMediaApiKeys=null;taskStore=new rs;mediaPersistence=new Ds;memoryPrefetchState=Kt();memoryProvider=null;memoryUserId="";lastUserMessageForAutoExtract;lastAssistantMessageForExtract;memdir=null;fileWatcher=null;pendingAskUser=new Map;sessionTaskDomain;acpDetector=new Ps;agentConfigStore=null;soloEvaluator=null;productOrchestrator=null;productPlanner=null;soloProcessManager=null;productProcessManager=null;acpServer=null;acpSessionHistory=new Map;resumedSessionHistory=new Map;idleDreamTimer=null;constructor(e){this.verbose=e.verbose,this.registry=new sn,this.mediaClient=new Ro({registry:this.registry}),J().onChange(()=>{this.lastLlmConfigKey=""});let t=Number(process.env.QLOGICAGENT_IDLE_DREAM_MS);t>0&&(we.dream.idleMinutes=t/6e4);let n=Number(process.env.QLOGICAGENT_DREAM_COOLDOWN_MS);n>=0&&(we.dream.cooldownMs=n),this.transport=e.transport??new $o({verbose:e.verbose}),this.taskStore.onTaskChange((r,s)=>{s&&this.sendNotification("task.updated",{taskId:r,type:s.type,lifecycle:s.lifecycle,label:s.label})}),rg({log:{info:r=>this.log(r),warn:r=>this.log(`[warn] ${r}`),error:r=>this.log(`[error] ${r}`),debug:r=>{e.verbose&&this.log(`[debug] ${r}`)}},onExecProgress:r=>{this.sendNotification("turn.exec_progress",{output:r.output,elapsedTimeSeconds:r.elapsedTimeSeconds,totalLines:r.totalLines,totalBytes:r.totalBytes})}})}getActiveProjectRoot(){let e=Le();return e?.workspaceDir?e.workspaceDir:process.cwd()}setActiveWorkdir(e){e!==this.getActiveProjectRoot()&&(tg(e),this.mediaPersistence.setProjectDir(e))}start(){this.running=!0,this.log("qlogicagent started, waiting for JSON-RPC messages..."),Qp().then(e=>{e.error?this.log(`[warmup] embedding model not available: ${e.error}`):e.modelDownloaded?this.log(`[warmup] embedding model downloaded (${e.dimensions}d)`):e.modelCached&&this.log(`[warmup] embedding model ready (cached, ${e.dimensions}d)`)}).catch(()=>{}),this.transport.onMessage(e=>{if(this.acpServer){if(Kc(e)||nr(e)){this.acpServer.dispatchMessage(e);return}if(tr(e)){let t=e.method;if(t==="initialize"||t.startsWith("session/")||t.startsWith("x/")||t.startsWith("fs/")){this.acpServer.dispatchMessage(e);return}}}if(!Vc(e)){this.log("[warn] ignoring non-request message");return}this.handleMessage(e)}),this.transport.onClose(()=>{this.log("transport closed, shutting down"),this.stop()}),this.transport.start()}stop(){if(this.running){this.running=!1,this.cancelIdleDreamTimer(),this.currentSessionId&&this.currentHooks&&(this.currentHooks.invoke("stop",{sessionId:this.currentSessionId,reason:"shutdown"}).catch(()=>{}),this.currentHooks.invoke("session.ended",{sessionId:this.currentSessionId}).catch(()=>{}));try{ah().catch(()=>{}),this.fileWatcher&&(this.fileWatcher.stop(),this.fileWatcher=null),this.mcpManager&&(this.mcpManager.disconnectAll().catch(()=>{}),this.mcpManager=null),this.permissionUnregister&&(this.permissionUnregister(),this.permissionUnregister=null),this.activeTurn&&(this.activeTurn.abort(),this.activeTurn=null),this.transport.close()}catch(e){this.currentSessionId&&this.currentHooks&&this.currentHooks.invoke("stop.failed",{sessionId:this.currentSessionId,reason:"cleanup_error",error:e.message}).catch(()=>{})}this.log("stopped")}}methodHandlers=new Map([["initialize",e=>this.handleInitialize(e)],["agent.ping",e=>this.handlePing(e)],["thread.turn",e=>ay.call(this,e)],["memory.dream",e=>Zs.call(this,e)],["agent.abort",e=>ry.call(this,e)],["tool.approval.response",e=>sy.call(this,e)],["thread.user_response",e=>iy.call(this,e)],["thread.list",e=>My.call(this,e)],["session.resume",e=>Wy.call(this,e)],["thread.create",e=>Ey.call(this,e)],["session.getInfo",e=>Gy.call(this,e)],["session.create",e=>Oy.call(this,e)],["session.resolve",e=>Dy.call(this,e)],["session.list",e=>Ly.call(this,e)],["session.get",e=>Ny.call(this,e)],["session.getMessages",e=>$y.call(this,e)],["session.update",e=>Uy.call(this,e)],["session.delete",e=>jy.call(this,e)],["session.deleteAll",e=>Fy.call(this,e)],["session.archive",e=>By.call(this,e)],["memory.list",e=>Ub.call(this,e)],["memory.atlas",e=>jb.call(this,e)],["memory.activity",e=>Fb.call(this,e)],["memory.read",e=>Bb.call(this,e)],["memory.write",e=>Wb.call(this,e)],["memory.search",e=>Gb.call(this,e)],["memory.delete",e=>Hb.call(this,e)],["tools.list",e=>Vb.call(this,e)],["media.listModels",e=>fk.call(this,e)],["media.cancel",e=>gk.call(this,e)],["media.status",e=>hk.call(this,e)],["media.stt",e=>yk.call(this,e)],["settings.listProviders",e=>kk.call(this,e)],["settings.addKey",e=>vk.call(this,e)],["settings.removeKey",e=>Sk.call(this,e)],["settings.toggleKey",e=>Tk.call(this,e)],["settings.toggleModel",e=>wk.call(this,e)],["settings.listModels",e=>xk.call(this,e)],["settings.setActiveModel",e=>Rk.call(this,e)],["settings.getActiveModel",e=>_k.call(this,e)],["settings.getOverview",e=>Ak.call(this,e)],["settings.refreshModels",e=>Pk.call(this,e)],["settings.validateKey",e=>Ik.call(this,e)],["provider.list",e=>Kb.call(this,e)],["config.get",e=>zb.call(this,e)],["config.update",e=>qb.call(this,e)],["config.tunables",e=>Yb.call(this,e)],["config.updateTunable",e=>Xb.call(this,e)],["todos.list",e=>Jb.call(this,e)],["tasks.list",e=>Qb.call(this,e)],["tasks.cancel",e=>Zb.call(this,e)],["agents.scan",e=>tk.call(this,e)],["agents.list",e=>nk.call(this,e)],["agents.config",e=>ok.call(this,e)],["agents.setConfig",e=>rk.call(this,e)],["agents.getConfig",e=>sk.call(this,e)],["agents.removeConfig",e=>ik.call(this,e)],["agents.setGateway",e=>ak.call(this,e)],["agents.getGateway",e=>lk.call(this,e)],["agents.processes",e=>dk.call(this,e)],["agents.kill",e=>uk.call(this,e)],["agents.listConfigured",e=>ck.call(this,e)],["agents.getLog",e=>pk.call(this,e)],["agents.testConnection",e=>mk.call(this,e)],["solo.start",e=>Zy.call(this,e)],["solo.status",e=>eb.call(this,e)],["solo.cancel",e=>tb.call(this,e)],["solo.select",e=>nb.call(this,e)],["solo.list",e=>ob.call(this,e)],["solo.delete",e=>rb.call(this,e)],["solo.message",e=>sb.call(this,e)],["solo.evaluate",e=>ib.call(this,e)],["product.plan",e=>ky.call(this,e)],["product.confirm",e=>vy.call(this,e)],["product.message",e=>Sy.call(this,e)],["product.create",e=>Ty.call(this,e)],["product.resume",e=>wy.call(this,e)],["product.pause",e=>xy.call(this,e)],["product.checkpoint",e=>Ry.call(this,e)],["product.status",e=>_y.call(this,e)],["product.list",e=>Ay.call(this,e)],["product.delete",e=>Py.call(this,e)],["product.cancel",e=>Iy.call(this,e)],["product.rollback",e=>Cy.call(this,e)],["project.create",e=>bb.call(this,e)],["project.list",e=>kb.call(this,e)],["project.delete",e=>vb.call(this,e)],["project.purgeAll",e=>Sb.call(this,e)],["project.rename",e=>Tb.call(this,e)],["project.archive",e=>wb.call(this,e)],["project.unarchive",e=>xb.call(this,e)],["project.update",e=>_b.call(this,e)],["project.archiveByGroup",e=>Rb.call(this,e)],["session.switchProject",e=>Hy.call(this,e)],["session.focus",e=>Ky.call(this,e)],["session.moveToProject",e=>zy.call(this,e)],["session.getState",e=>Vy.call(this,e)],["files.list",e=>Ib.call(this,e)],["files.create",e=>Cb.call(this,e)],["files.rename",e=>Eb.call(this,e)],["files.delete",e=>Mb.call(this,e)],["files.gitStatus",e=>Ob.call(this,e)],["instructions.list",e=>Db.call(this,e)],["instructions.read",e=>Lb.call(this,e)],["instructions.write",e=>Nb.call(this,e)],["instructions.delete",e=>$b.call(this,e)],["skills.list",e=>lb.call(this,e)],["skills.activate",e=>cb.call(this,e)],["skills.deactivate",e=>db.call(this,e)],["skills.delete",e=>ub.call(this,e)],["skills.promote",e=>pb.call(this,e)],["skills.stats",e=>mb.call(this,e)],["skills.pin",e=>fb.call(this,e)],["skills.unpin",e=>gb.call(this,e)],["skills.curator",e=>hb.call(this,e)],["skills.lifecycle",e=>yb.call(this,e)],["pet.hatch",e=>Ck.call(this,e)],["pet.interact",e=>Ek.call(this,e)],["pet.status",e=>Mk.call(this,e)],["pet.forge",e=>Ok.call(this,e)],["pet.confirm_response",e=>this.handlePetConfirmResponse(e)]]);handleMessage(e){let t=this.methodHandlers.get(e.method);t?t(e):e.id!==void 0&&this.sendResponse(e.id,void 0,{code:w.METHOD_NOT_FOUND,message:`Unknown method: ${e.method}`})}handleInitialize(e){let t=e.params,n=t?.protocolVersion??"unknown",r=t?.host?.name??t?.hostName??"unknown",s=t?.host?.version??t?.hostVersion??"?",i=n.split(".")[0],a=to.split(".")[0];if(i!==a){this.log(`[initialize] protocol mismatch: host=${n} agent=${to}`),e.id!==void 0&&this.sendResponse(e.id,void 0,{code:w.PROTOCOL_MISMATCH,message:`Protocol version mismatch: host=${n}, agent=${to}`});return}this.log(`[initialize] host=${r} v${s}`),e.id!==void 0&&this.sendResponse(e.id,{protocolVersion:to,agent:{name:"qlogicagent",version:"0.1.0"},capabilities:{tools:Mt().map(l=>l.function.name),streaming:!0,threads:!0,notifications:["turn.start","turn.delta","turn.end","turn.error","turn.recovery","turn.tool_call","turn.tool_result","turn.tool_blocked","turn.reasoning_delta","turn.plan_update","turn.suggestions","turn.subagent_started","turn.subagent_delta","turn.subagent_ended","turn.media_result","turn.todos_updated","task.updated","turn.exec_progress","turn.artifact","tool.approval.request","turn.skill_instruction","turn.ask_user","memory.updated","session.info","permission.rule_updated","team.updated","turn.usage_update","pong"],methods:[..._h]}}),this.ensureDefaultProject()}ensureDefaultProject(){let e=Le();if(e)e.workspaceDir&&this.setActiveWorkdir(e.workspaceDir);else{let t=te.join(H(),"workspaces","default");Y.existsSync(t)||Y.mkdirSync(t,{recursive:!0});let n=Bp(t);md(t),this.setActiveWorkdir(t),this.sendNotification("project.created",{id:n.id,name:n.name,workspaceDir:n.workspaceDir,type:n.type})}this.ensureDefaultProjectDir();{let t=this.getActiveProjectRoot(),n=new Nt(t);n.ensureInitialized(),this.memdir=n}}ensureDefaultProjectDir(){let t=fe().find(n=>n.type==="default"&&n.status==="active");t&&(Y.existsSync(t.workspaceDir)||Y.mkdirSync(t.workspaceDir,{recursive:!0}))}handlePing(e){e.id!==void 0&&this.sendResponse(e.id,{status:"ok"}),this.sendNotification("pong",{})}static SUGGESTION_PROMPT=`[SUGGESTION MODE]
|
|
809
809
|
Based on the conversation, suggest 1-3 short follow-up actions the user might naturally do next.
|
|
810
810
|
Be specific: "run the tests" beats "continue".
|
|
811
811
|
Stay silent if the next step isn't obvious.
|
|
@@ -840,7 +840,7 @@ ${t?`\u7528\u6237\u8865\u5145\u63CF\u8FF0\uFF1A${t}`:""}
|
|
|
840
840
|
`)}}catch(V){return{success:!1,error:V.message}}},listResources:async v=>{let _=this.mcpManager;return _?(await _.listResources(v)).map(R=>({uri:R.uri,name:R.name,mimeType:R.mimeType,description:R.description,server:R.server})):[]},readResource:async(v,_)=>{let C=this.mcpManager;if(!C)throw new Error("MCP not initialized");return(await C.readResource(v,_)).map(U=>({uri:U.uri,mimeType:U.mimeType,text:U.text}))},authenticate:async()=>({status:"unsupported",message:"OAuth not yet implemented in McpManager"})})),this.mcpReady=this.mcpManager.connectAll().then(()=>{this.mcpManager?.injectTools(),l.info(`[mcp] ${this.mcpManager?.getToolCount()??0} tools from ${this.mcpManager?.getConnectedServers().length??0} servers`)}).catch(v=>{l.warn(`[mcp] connection error: ${v instanceof Error?v.message:v}`)})}let y=[],b=Qu();Y.existsSync(b)&&y.push(b);let k=e?.pluginPaths;if(Array.isArray(k))for(let g of k)typeof g=="string"&&Y.existsSync(g)&&y.push(g);dg(y,l).then(g=>{if(g.length===0)return;this.pluginLoader=new Ts({pluginDirs:g,hookRegistry:d,log:l}),this.pluginLoader.loadAll().then(_=>{l.info(`[plugins] ${_.length} loaded, ${this.pluginLoader?.getPluginSkills().length??0} skills`)}).catch(_=>{l.warn(`[plugins] load error: ${_ instanceof Error?_.message:_}`)});let v=this.pluginLoader;d.register({point:"turn.submitted",handler:async()=>(await v.discoverNew(),await v.refreshActivations(),{action:"continue"}),label:"plugin-activation-refresh",priority:50})}).catch(g=>{l.warn(`[plugins] marketplace resolve error: ${g instanceof Error?g.message:g}`)});let x=e?.permissions,I=xs(x),P=new ws(I);if(I.mode,Le()?.type==="group"){let g=Hf();for(let v of g)P.addRule(v);gc(!0),l.info(`[permissions] group security mode active: ${g.length} rules injected`)}else gc(!1);this.permissionUnregister&&this.permissionUnregister(),this.permissionChecker=new As({ruleEngine:P,hookRegistry:d,auditLogger:new _s(this.getActiveProjectRoot()),sessionId:this.currentSessionId,getTurnId:()=>this.currentTurnId,onRequestApproval:async g=>{if(this.acpServer&&this.acpServer.sessionId)try{let v=await this.acpServer.requestPermission({sessionId:this.acpServer.sessionId,permissionId:g.approvalId,toolCall:{callId:g.callId,toolName:g.toolName,arguments:g.arguments?JSON.stringify(g.arguments):""},message:g.message,options:[{id:"allow",label:"Allow"},{id:"deny",label:"Deny"},{id:"allowAlways",label:"Always allow",persistent:!0}]});return{approvalId:g.approvalId,decision:v.optionId==="allow"||v.optionId==="allowAlways"?"approved":"denied"}}catch{return{approvalId:g.approvalId,decision:"denied"}}if(this.sendNotification("tool.approval.request",{approvalId:g.approvalId,callId:g.callId,toolName:g.toolName,arguments:g.arguments?JSON.stringify(g.arguments):"",message:g.message,suggestions:g.suggestions?.map(v=>`${v.pattern}:${v.behavior}`)}),this.isPetActive()){let v=g.toolName.match(/delete|rm|drop|reset|force/i)?"high":g.toolName.match(/write|exec|bash|shell|move/i)?"medium":"low";this.sendNotification("pet.confirm",{confirmId:g.approvalId,toolName:g.toolName,description:g.message??`\u5141\u8BB8\u6267\u884C ${g.toolName}\uFF1F`,risk:v,timeoutMs:3e4})}return new Promise(()=>{})},onPermissionUpdate:g=>{l.info(`[permissions] rule saved: ${g.pattern} \u2192 ${g.behavior}`),this.sendNotification("permission.rule_updated",{pattern:g.pattern,behavior:g.behavior})},onDenied:(g,v)=>{l.warn(`[permissions] blocked "${g}": ${v}`)}});let $=Mt();this.permissionChecker.setToolMeta($),this.permissionUnregister=this.permissionChecker.register();let W=It(this.getActiveProjectRoot()),S=[W,Ht(),...Array.isArray(e?.skillPaths)?e.skillPaths:[]];Pe(Tg({listSkills:()=>{let g=[];this.pluginLoader&&g.push(...this.pluginLoader.getPluginSkills());let v=e?.skillPaths;if(Array.isArray(v)){for(let _ of v)if(typeof _=="string"){let C=te.basename(_);g.some(R=>R.name===C)||g.push({name:C,source:"gateway",filePath:te.join(_,"SKILL.md"),baseDir:_})}}return g},listSkillsFull:async g=>{let v=[],_=new Set,C=Ht();for(let R of S)try{let U=await Y.promises.readdir(R,{withFileTypes:!0});for(let D of U){if(!D.isDirectory())continue;let M=te.join(R,D.name,"SKILL.md");try{let V=await Y.promises.readFile(M,"utf8"),ae=te.basename(R);if(g&&ae!==g)continue;_.add(ae);let ee=R===C?"global":R===W?"project":"config",me=V.match(/^---\n[\s\S]*?^version:\s*(\S+)/m)?.[1],We=V.startsWith(`---
|
|
841
841
|
`)?V.indexOf("---",4):-1,ge=(We>=0?V.slice(We+3).trimStart():V).split(`
|
|
842
842
|
`).find(jt=>jt.trim()&&!jt.startsWith("#"))?.trim()??`Skill from ${ae}`;v.push({name:D.name,description:ge,category:ae,scope:ee,version:me})}catch{}}}catch{}if(this.pluginLoader)for(let R of this.pluginLoader.getPluginSkills())g&&R.source!==g||(_.add(R.source??"plugin"),v.push({name:R.name,description:`Plugin skill (${R.source})`,category:R.source,scope:"plugin"}));return{skills:v,categories:[..._]}},readSkillContent:async g=>{for(let v of S){let _=te.join(v,g,"SKILL.md");try{return await Y.promises.readFile(_,"utf8")}catch{}}return null},viewSkill:async(g,v)=>{for(let _ of S){let C=v?te.join(_,g,v):te.join(_,g,"SKILL.md");try{let R=await Y.promises.readFile(C,"utf8");return{name:g,content:R}}catch{}}return null},executeSkillSubturn:async(g,v,_,C)=>{let R=`skill_${g}_${wt().slice(0,8)}`,U=this.agent;if(!U)return"[skill] Cannot execute: no LLM provider configured";let D=H(),M=this.currentSessionId??"skill";this.currentHooks?.invoke("subagent.started",{sessionId:M,turnId:R,subagentId:R,agentType:`skill:${g}`}).catch(()=>{});let V=new Set(["skill","agent"]),ae=Mt().filter(Ee=>!V.has(Ee.function.name)),ee=_??`Execute skill "${g}" instructions.`,oe=[],me;for await(let Ee of U.run({turnId:R,sessionId:M,messages:[{role:"user",content:ee}],tools:ae,systemPrompt:v,config:{parentDepth:1,maxRounds:5}},C)){if(Ee.type==="end"&&Ee.content){this.currentHooks?.invoke("subagent.stopped",{sessionId:M,turnId:R,subagentId:R,agentType:`skill:${g}`,reason:"normal"}).catch(()=>{}),Ls(D,g,!0);let tn=Be(D);return Fc(tn,g),He(D,tn),Ee.content}if(Ee.type==="delta"&&Ee.text&&oe.push(Ee.text),Ee.type==="error"){me=Ee.error;break}}if(this.currentHooks?.invoke("subagent.stopped",{sessionId:M,turnId:R,subagentId:R,agentType:`skill:${g}`,reason:me?"error":"normal",error:me}).catch(()=>{}),me)return Ls(D,g,!1),`[skill "${g}"] error: ${me}`;Ls(D,g,!0);let We=Be(D);return Fc(We,g),He(D,We),oe.join("")||`[skill "${g}"] completed (no output)`},manageSkill:async g=>{let v=this.getActiveProjectRoot(),_=It(v),C=te.join(_,g.name),R=te.join(C,"SKILL.md"),U=H();switch(g.action){case"create":{let D=g.content??"",V=Hc(D,g.name,`Skill: ${g.name}`)??D,ae=Us(V,g.name);if(!ae.valid)return{success:!1,message:`Skill validation failed: ${ae.errors.join("; ")}`};let ee=Be(U);if(ee.records[g.name]?.pinned&&Y.existsSync(R))return{success:!1,message:`Skill "${g.name}" is pinned. Unpin it first.`};if(await Y.promises.mkdir(C,{recursive:!0}),await Y.promises.writeFile(R,V,"utf8"),this.sendNotification("turn.skill_instruction",{turnId:`skill-create-${Date.now()}`,instruction:{name:g.name,category:g.category??"learned",content:V,scope:"project"}}),gt(),Qt(ee,g.name,"created"),He(U,ee),this.memoryProvider&&this.memoryUserId){let me=V.split(`
|
|
843
|
-
`).slice(0,3).join(" ").slice(0,200),We=v?te.basename(v):"unknown";this.memoryProvider.ingestExtracted([{text:`Learned skill "${g.name}" in project "${We}": ${me}`,category:"skill-learning"}],this.memoryUserId).catch(()=>{})}let oe=v?` (project-scoped). To make it available across all projects, use: skill promote name:"${g.name}"`:"";return{success:!0,message:`Skill "${g.name}" created${oe}`,path:C}}case"edit":{let D=Be(U);if(D.records[g.name]?.pinned)return{success:!1,message:`Skill "${g.name}" is pinned. Unpin it first.`};let M=g.content??"",ae=Hc(M,g.name)??M;return await Y.promises.writeFile(R,ae,"utf8"),Bc(D,g.name),He(U,D),this.sendNotification("turn.skill_instruction",{turnId:`skill-edit-${Date.now()}`,instruction:{name:g.name,category:g.category??"learned",content:ae,scope:"project"}}),{success:!0,message:`Skill "${g.name}" updated`,path:R}}case"patch":{let D=Be(U);if(D.records[g.name]?.pinned)return{success:!1,message:`Skill "${g.name}" is pinned. Unpin it first.`};let M=await Y.promises.readFile(R,"utf8");if(!g.oldString||!M.includes(g.oldString))return{success:!1,message:"oldString not found in SKILL.md"};let V=M.replace(g.oldString,g.newString??"");return await Y.promises.writeFile(R,V,"utf8"),Bc(D,g.name),He(U,D),this.sendNotification("turn.skill_instruction",{turnId:`skill-patch-${Date.now()}`,instruction:{name:g.name,category:g.category??"learned",content:V,scope:"project"}}),{success:!0,message:`Skill "${g.name}" patched`,path:R}}case"delete":{let D=Be(U);return D.records[g.name]?.pinned?{success:!1,message:`Skill "${g.name}" is pinned. Unpin it first.`}:(await Y.promises.rm(C,{recursive:!0,force:!0}),Ns(D,g.name),He(U,D),this.sendNotification("turn.skill_instruction",{turnId:`skill-delete-${Date.now()}`,instruction:{name:g.name,category:g.category??"learned",action:"delete",scope:"project"}}),gt(),{success:!0,message:`Skill "${g.name}" deleted`})}default:return{success:!1,message:`Unknown action: ${g.action}`}}},promoteSkill:async g=>{let v=It(this.getActiveProjectRoot()),_=te.join(v,g,"SKILL.md");try{await Y.promises.access(_)}catch{return{success:!1,message:`Skill "${g}" not found in project skills. Cannot promote.`}}let C=Ht(),R=te.join(C,g);await Y.promises.mkdir(R,{recursive:!0});let U=te.join(v,g),D=await Y.promises.readdir(U);for(let M of D){let V=await Y.promises.readFile(te.join(U,M));await Y.promises.writeFile(te.join(R,M),V)}return this.sendNotification("turn.skill_instruction",{turnId:`skill-promote-${Date.now()}`,instruction:{name:g,category:"promoted",content:await Y.promises.readFile(_,"utf8"),scope:"global"}}),await Y.promises.rm(U,{recursive:!0,force:!0}),this.sendNotification("turn.skill_instruction",{turnId:`skill-promote-cleanup-${Date.now()}`,instruction:{name:g,category:"learned",action:"delete",scope:"project"}}),gt(),{success:!0,message:`Skill "${g}" promoted to global (user-level) and removed from project scope. It will now be available across all projects.`,path:R}},installSkill:async(g,v)=>{let _;try{if(_=new URL(g),!["http:","https:"].includes(_.protocol))return{success:!1,message:`Invalid URL scheme: ${_.protocol}. Only http/https allowed.`}}catch{return{success:!1,message:`Invalid URL: ${g}`}}let C=v??HE(_);if(!C)return{success:!1,message:"Cannot derive skill name from URL. Please provide 'name' parameter."};try{let R=await fetch(g,{signal:AbortSignal.timeout(3e4)});if(!R.ok)return{success:!1,message:`Download failed: HTTP ${R.status} ${R.statusText}`};let U=R.headers.get("content-length");if(U&&parseInt(U,10)>512e3)return{success:!1,message:"Content too large (>512KB). Skill files should be small markdown documents."};let D=await R.text();if(!D.trim())return{success:!1,message:"Downloaded content is empty."};if(D.length>512e3)return{success:!1,message:"Content too large (>512KB). Skill files should be small markdown documents."};if(D.trimStart().startsWith("<!DOCTYPE")||D.trimStart().startsWith("<html"))return{success:!1,message:"URL returned an HTML page, not a raw markdown file. Use a raw/direct download link."};let M=Ht(),V=te.join(M,C);return await Y.promises.mkdir(V,{recursive:!0}),await Y.promises.writeFile(te.join(V,"SKILL.md"),D,"utf8"),this.sendNotification("turn.skill_instruction",{turnId:`skill-install-${Date.now()}`,instruction:{name:C,category:"installed",content:D,scope:"global"}}),gt(),{success:!0,message:`Skill "${C}" installed from ${_.host}. Available globally across all projects.`,path:V}}catch(R){return{success:!1,message:`Install failed: ${R instanceof Error?R.message:String(R)}`}}}})),Pe(Rg({abortSignal:void 0,currentForkDepth:0,forkAgent:async g=>{let v=Ir(g.agent);if(!v)return{agentId:"",status:"failed",error:`Unknown agent type: ${g.agent}`};if(!this.agent||!this.currentTransport||!this.currentApiKey||!this.currentModel)return{agentId:"",status:"failed",error:"No LLM provider configured"};let _=cn(),C=xa(_,v),U=Mt().filter(oe=>C.includes(oe.function.name)),D=Pl(U,!0),M=g.maxTurns??v.maxTurns??200;if(we.isTeamBudgetExceeded())return{agentId:`fork-${g.agent}-budget-exceeded`,status:"failed",output:void 0,error:we.teamBudgetExceededError(),tokensUsed:0};let V=await Oc({promptMessages:[{role:"user",content:g.prompt}],tools:D,transport:this.currentTransport,toolInvoker:c,apiKey:this.currentApiKey,model:this.currentModel,log:l,hooks:d,forkLabel:`agent-${g.agent}`,maxTurns:M,parentSignal:g.abortSignal,parentDepth:0,onEvent:oe=>{oe.type==="delta"&&oe.text&&this.sendNotification("turn.subagent_delta",{agentType:g.agent,text:oe.text})}}),ae=V.events.filter(oe=>oe.type==="end"&&"content"in oe).map(oe=>oe.content??"").join("")||V.events.filter(oe=>oe.type==="delta"&&"text"in oe).map(oe=>oe.text).join(""),ee=V.totalUsage.inputTokens+V.totalUsage.outputTokens;return we.recordForkTokens(ee),{agentId:`fork-${g.agent}-${wt().slice(0,8)}`,status:V.ok?"completed":"failed",output:ae||void 0,error:V.error,tokensUsed:ee}}}));let ce=pt(),de=new Map([["model",{key:"model",value:this.currentModel??"",type:"string",description:"Default LLM model"}],["language",{key:"language",value:"zh-cn",type:"string",description:"UI / response language"}],["verbose",{key:"verbose",value:this.verbose,type:"boolean",description:"Enable verbose logging"}],["maxRounds",{key:"maxRounds",value:25,type:"number",description:"Default max tool-call rounds per turn"}],["theme",{key:"theme",value:"auto",type:"enum",description:"Color theme",options:["auto","light","dark"]}]]),j=async()=>{try{return JSON.parse(await Y.promises.readFile(ce,"utf8"))}catch{return{}}},ve=async g=>{await Y.promises.mkdir(te.dirname(ce),{recursive:!0}),await Y.promises.writeFile(ce,JSON.stringify(g,null,2),"utf8")};Pe(_g({getConfig:async g=>{let v=de.get(g);if(!v)return{success:!1,error:`Unknown key: ${g}`};let _=await j(),C=g in _?_[g]:v.value;return{success:!0,setting:{...v,value:C,readOnly:Jo.includes(g)}}},setConfig:async(g,v)=>{let _=de.get(g);if(!_)return{success:!1,error:`Unknown key: ${g}`};let C=await j(),R=g in C?C[g]:_.value;return C[g]=v,await ve(C),{success:!0,previousValue:R,setting:{..._,value:v}}},listConfig:async()=>{let g=await j();return{success:!0,settings:[...de.values()].map(_=>({..._,value:_.key in g?g[_.key]:_.value,readOnly:Jo.includes(_.key)}))}},resetConfig:async g=>{let v=de.get(g);if(!v)return{success:!1,error:`Unknown key: ${g}`};let _=await j();return delete _[g],await ve(_),{success:!0,setting:v}},isValidKey:g=>de.has(g)}));let ie=new Map,$e=g=>{let v=/^(\d+)([smhd])$/.exec(g.trim());if(!v)return null;let _=parseInt(v[1],10),C=v[2];return _*({s:1e3,m:6e4,h:36e5,d:864e5}[C]??6e4)},ne=g=>{g.timerId&&clearTimeout(g.timerId);let v=$e(g.schedule);if(!v)return;let _=Date.now(),C=v-_%v||v;g.timerId=setTimeout(()=>{g.lastRunAt=new Date().toISOString(),g.repeat.completed++,g.lastStatus="success",l.info(`[cron] triggered job ${g.id} (${g.name})`),this.sendNotification("system.activity",{category:"cron",level:"info",title:`\u5B9A\u65F6\u4EFB\u52A1\u89E6\u53D1: ${g.name}`,detail:`\u8C03\u5EA6 ${g.scheduleDisplay}\uFF0C\u7B2C ${g.repeat.completed} \u6B21\u6267\u884C`}),g.repeat.times===null||g.repeat.completed<g.repeat.times?ne(g):(g.state="paused",g.enabled=!1,this.sendNotification("system.activity",{category:"cron",level:"info",title:`\u5B9A\u65F6\u4EFB\u52A1\u5B8C\u6210: ${g.name}`,detail:`\u5DF2\u8FBE\u5230\u6700\u5927\u6267\u884C\u6B21\u6570 (${g.repeat.completed}\u6B21)`}))},C),g.nextRunAt=new Date(_+C).toISOString()};Pn(async()=>{for(let g of ie.values())g.timerId&&clearTimeout(g.timerId)}),Pe(Pg({createJob:async g=>{let v=`cron_${wt().slice(0,8)}`,_={id:v,name:g.name??`Job ${v}`,prompt:g.prompt,schedule:g.schedule,scheduleDisplay:g.schedule,state:"scheduled",enabled:!0,repeat:{times:g.repeat??null,completed:0},allowedTools:g.allowedTools};return ie.set(v,_),ne(_),{success:!0,job:{..._,timerId:void 0}}},listJobs:async()=>({success:!0,jobs:[...ie.values()].map(v=>({...v,timerId:void 0}))}),getJob:async g=>{let v=ie.get(g);return v?{success:!0,job:{...v,timerId:void 0}}:{success:!1,error:`Job not found: ${g}`}},updateJob:async(g,v)=>{let _=ie.get(g);return _?(v.prompt!==void 0&&(_.prompt=v.prompt),v.schedule!==void 0&&(_.schedule=v.schedule,_.scheduleDisplay=v.schedule),v.name!==void 0&&(_.name=v.name),v.enabled!==void 0&&(_.enabled=v.enabled,_.state=v.enabled?"scheduled":"paused"),v.repeat!==void 0&&(_.repeat.times=v.repeat),v.allowedTools!==void 0&&(_.allowedTools=v.allowedTools),_.enabled?ne(_):_.timerId&&(clearTimeout(_.timerId),_.timerId=void 0),{success:!0,job:{..._,timerId:void 0}}):{success:!1,error:`Job not found: ${g}`}},deleteJob:async g=>{let v=ie.get(g);return v?(v.timerId&&clearTimeout(v.timerId),ie.delete(g),{success:!0}):{success:!1,error:`Job not found: ${g}`}},pauseJob:async g=>{let v=ie.get(g);return v?(v.state="paused",v.enabled=!1,v.timerId&&(clearTimeout(v.timerId),v.timerId=void 0),{success:!0,job:{...v,timerId:void 0}}):{success:!1,error:`Job not found: ${g}`}},resumeJob:async g=>{let v=ie.get(g);return v?(v.state="scheduled",v.enabled=!0,ne(v),{success:!0,job:{...v,timerId:void 0}}):{success:!1,error:`Job not found: ${g}`}},triggerJob:async g=>{let v=ie.get(g);return v?(v.lastRunAt=new Date().toISOString(),v.repeat.completed++,v.lastStatus="success",{success:!0,job:{...v,timerId:void 0}}):{success:!1,error:`Job not found: ${g}`}},validateSchedule:g=>$e(g)!==null||/^\d{1,2}\s/.test(g)?null:`Invalid schedule: ${g}. Use shorthand (5m, 1h, 1d) or cron expression.`}));let Q=new Map;Pn(async()=>{for(let g of Q.values())g.cleanup();Q.clear()}),Pe(Ig({startMonitor:async g=>{if(Q.has(g.monitorId))return{action:"start",success:!1,error:`Monitor "${g.monitorId}" already exists.`};let v={monitorId:g.monitorId,source:g.source,target:g.target,conditions:g.conditions,startedAt:Date.now(),timeoutSeconds:g.timeoutSeconds,eventCount:0},_=()=>{};if(g.source==="file")try{let C=Y.watch(g.target,{persistent:!1},()=>{v.eventCount++,l.info(`[monitor] file change detected: ${g.target}`)});_=()=>C.close()}catch{return{action:"start",success:!1,error:`Cannot watch: ${g.target}`}}if(g.timeoutSeconds>0){let C=setTimeout(()=>{let U=Q.get(g.monitorId);U&&(U.cleanup(),Q.delete(g.monitorId))},g.timeoutSeconds*1e3),R=_;_=()=>{clearTimeout(C),R()}}return Q.set(g.monitorId,{info:v,cleanup:_}),{action:"start",success:!0,monitorId:g.monitorId}},stopMonitor:async g=>{let v=Q.get(g);return v?(v.cleanup(),Q.delete(g),{action:"stop",success:!0,monitorId:g}):{action:"stop",success:!1,error:`Monitor "${g}" not found.`}},listMonitors:async()=>[...Q.values()].map(g=>g.info)}));let T=new Map,F={info:g=>l.info(g),warn:g=>l.warn(g)},B=new pn({onNotification:(g,v,_)=>{this.sendNotification("team.member.notification",{memberId:g,method:v,params:_})},onStateChange:(g,v)=>{this.sendNotification("team.member.state",{memberId:g,state:v});let _=B.getHandle(g),R=B.getUsageTracker(g)?.getUsage();this.emitAgentStatus(g,v,{missedBeats:B.getMissedBeats(g),lastActivityAt:_?.lastActivityAt,usage:R&&R.totalTokens>0?{inputTokens:R.inputTokens,outputTokens:R.outputTokens,totalTokens:R.totalTokens}:void 0})},onExit:(g,v,_)=>{for(let C of T.values()){let R=C.members.find(U=>U.cwd&&`team-${C.name}-${U.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase()===g.replace(/^team-/,""));R&&(R.isActive=!1)}l.info(`[team] member ${g} exited (code=${v}, signal=${_})`)},onMcpToolCall:(g,v,_)=>this.handleMcpToolCall(g,v,_),log:{info:g=>l.info(g),warn:g=>l.warn(g),debug:g=>l.debug(g)},sessionDir:te.join(H(),"agent-logs")});Pn(async()=>{B.dispose()}),Pe(Cg({createTeam:async g=>{if(T.has(g.teamName))return{success:!1,error:`Team "${g.teamName}" already exists.`};let v=await Ho(),_=[];for(let R of g.members??[]){let U={...R,isActive:!0};if(v){let D=`team-${g.teamName}-${R.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase(),M=await ff(v,D,F);M?(U.worktreePath=M.worktreePath,U.worktreeBranch=M.branch,U.cwd=M.worktreePath,l.info(`[team] provisioned worktree for ${R.name}: ${M.worktreePath}`)):(U.cwd=process.cwd(),l.warn(`[team] worktree provision failed for ${R.name}, using shared cwd`))}else U.cwd=process.cwd();_.push(U)}let C={name:g.teamName,description:g.description,leadId:this.currentSessionId??"default",members:_,createdAt:new Date().toISOString()};T.set(g.teamName,C);for(let R of _){if(!R.cwd)continue;let U=`team-${g.teamName}-${R.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase();try{await B.spawn({memberId:U,name:R.name,cwd:R.cwd,prompt:`You are the "${R.name}" team member. Role: ${R.role}.`,agentType:R.role,verbose:this.verbose}),l.info(`[team] spawned child process for ${R.name} in ${R.cwd}`)}catch(D){l.warn(`[team] failed to spawn child process for ${R.name}: ${D instanceof Error?D.message:String(D)}`),R.isActive=!1}}return this.sendNotification("team.updated",{teamName:g.teamName,action:"created",members:C.members.map(R=>({agentName:R.name,role:R.role,worktreePath:R.worktreePath,pid:B.getHandle(`team-${g.teamName}-${R.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase())?.pid}))}),{success:!0,team:C}},deleteTeam:async g=>{let v=T.get(g);if(!v)return{success:!1,error:`Team "${g}" not found.`};for(let C of v.members){let R=`team-${g}-${C.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase();B.kill(R),B.remove(R)}let _=await Ho();if(_)for(let C of v.members)C.worktreePath&&C.worktreeBranch&&(await gf(_,C.worktreePath,C.worktreeBranch,F),l.info(`[team] cleaned up worktree for ${C.name}: ${C.worktreePath}`));return T.delete(g),this.sendNotification("team.updated",{teamName:g,action:"destroyed",members:[]}),{success:!0}},listTeams:async()=>({success:!0,teams:[...T.values()]}),getTeamStatus:async g=>{let v=T.get(g);if(!v)return{success:!1,error:`Team "${g}" not found.`};let _={};for(let C of v.members){let R=`team-${g}-${C.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase(),U=B.getStatus(R);U&&(C.isActive=U.alive,_[C.name]={mediaProgress:U.mediaProgress,lastToolCall:U.lastToolCall,idleFor:U.idleFor,runningFor:U.runningFor})}return{success:!0,team:v,memberProgress:_}}}));{let g=this.memdir;Pe({name:zg,label:qg,description:Xg,parameters:Yg,execute:async(v,_)=>{let C=await Jg(_,{memdir:g,provider:this.memoryUserId?this.memoryProvider??void 0:void 0,localProvider:this.memoryUserId?this.memoryProvider??void 0:void 0,userId:this.memoryUserId});return{content:[{type:"text",text:C.message}],details:{type:"memory",action:C.action,ok:C.ok}}}})}Np(d,{getMemdir:()=>this.memdir,log:{debug:g=>l.debug(g),warn:g=>l.warn(g)}},this.memoryPrefetchState);{let g=e?.workdir??process.cwd(),v=Dg(g,this.currentSessionId||"default");Pe(Og(v))}Pe(Lg({sendNotification:async g=>(l.info(`[notify] ${g.title??""}: ${g.message}`),{delivered:!0,channel:g.channel??"cli"})})),Pe(Ng({sendMessage:async g=>(l.info(`[send_message] ${g.senderId} \u2192 ${g.to}: ${g.message}`),{success:!0,recipients:[g.to]}),getSenderId:()=>this.currentSessionId??"default",listTeammates:()=>[]}));{let g=e?.workdir??process.cwd(),v,_=()=>(v||(v=di.createContext({...{readFile:async R=>Y.promises.readFile(te.resolve(g,R),"utf8"),writeFile:async(R,U)=>{await Y.promises.writeFile(te.resolve(g,R),U,"utf8")},editFile:async(R,U)=>{let D=await Y.promises.readFile(te.resolve(g,R),"utf8");for(let M of U)D=D.replace(M.oldText,M.newText);return await Y.promises.writeFile(te.resolve(g,R),D,"utf8"),D},exec:async R=>{let U=await import("node:child_process");return new Promise(D=>{U.execFile("bash",["-c",R],{cwd:g,timeout:3e4},(M,V,ae)=>{D({stdout:V?.toString()??"",stderr:ae?.toString()??"",exitCode:M?M.code??1:0})})})},glob:async R=>{try{let{globSync:U}=await import("node:fs");return U(R,{cwd:g})}catch{return[]}},grep:async(R,U)=>{let D=[],M=te.resolve(g,U??".");try{let V=await import("node:child_process"),ae=await new Promise(ee=>{V.execFile("grep",["-rn",R,M,"--include=*"],{timeout:1e4},(oe,me)=>ee(me?.toString()??""))});for(let ee of ae.split(`
|
|
843
|
+
`).slice(0,3).join(" ").slice(0,200),We=v?te.basename(v):"unknown";this.memoryProvider.ingestExtracted([{text:`Learned skill "${g.name}" in project "${We}": ${me}`,category:"skill-learning"}],this.memoryUserId).catch(()=>{})}let oe=v?` (project-scoped). To make it available across all projects, use: skill promote name:"${g.name}"`:"";return{success:!0,message:`Skill "${g.name}" created${oe}`,path:C}}case"edit":{let D=Be(U);if(D.records[g.name]?.pinned)return{success:!1,message:`Skill "${g.name}" is pinned. Unpin it first.`};let M=g.content??"",ae=Hc(M,g.name)??M;return await Y.promises.writeFile(R,ae,"utf8"),Bc(D,g.name),He(U,D),this.sendNotification("turn.skill_instruction",{turnId:`skill-edit-${Date.now()}`,instruction:{name:g.name,category:g.category??"learned",content:ae,scope:"project"}}),{success:!0,message:`Skill "${g.name}" updated`,path:R}}case"patch":{let D=Be(U);if(D.records[g.name]?.pinned)return{success:!1,message:`Skill "${g.name}" is pinned. Unpin it first.`};let M=await Y.promises.readFile(R,"utf8");if(!g.oldString||!M.includes(g.oldString))return{success:!1,message:"oldString not found in SKILL.md"};let V=M.replace(g.oldString,g.newString??"");return await Y.promises.writeFile(R,V,"utf8"),Bc(D,g.name),He(U,D),this.sendNotification("turn.skill_instruction",{turnId:`skill-patch-${Date.now()}`,instruction:{name:g.name,category:g.category??"learned",content:V,scope:"project"}}),{success:!0,message:`Skill "${g.name}" patched`,path:R}}case"delete":{let D=Be(U);return D.records[g.name]?.pinned?{success:!1,message:`Skill "${g.name}" is pinned. Unpin it first.`}:(await Y.promises.rm(C,{recursive:!0,force:!0}),Ns(D,g.name),He(U,D),this.sendNotification("turn.skill_instruction",{turnId:`skill-delete-${Date.now()}`,instruction:{name:g.name,category:g.category??"learned",action:"delete",scope:"project"}}),gt(),{success:!0,message:`Skill "${g.name}" deleted`})}default:return{success:!1,message:`Unknown action: ${g.action}`}}},promoteSkill:async g=>{let v=It(this.getActiveProjectRoot()),_=te.join(v,g,"SKILL.md");try{await Y.promises.access(_)}catch{return{success:!1,message:`Skill "${g}" not found in project skills. Cannot promote.`}}let C=Ht(),R=te.join(C,g);await Y.promises.mkdir(R,{recursive:!0});let U=te.join(v,g),D=await Y.promises.readdir(U);for(let M of D){let V=await Y.promises.readFile(te.join(U,M));await Y.promises.writeFile(te.join(R,M),V)}return this.sendNotification("turn.skill_instruction",{turnId:`skill-promote-${Date.now()}`,instruction:{name:g,category:"promoted",content:await Y.promises.readFile(_,"utf8"),scope:"global"}}),await Y.promises.rm(U,{recursive:!0,force:!0}),this.sendNotification("turn.skill_instruction",{turnId:`skill-promote-cleanup-${Date.now()}`,instruction:{name:g,category:"learned",action:"delete",scope:"project"}}),gt(),{success:!0,message:`Skill "${g}" promoted to global (user-level) and removed from project scope. It will now be available across all projects.`,path:R}},installSkill:async(g,v)=>{let _;try{if(_=new URL(g),!["http:","https:"].includes(_.protocol))return{success:!1,message:`Invalid URL scheme: ${_.protocol}. Only http/https allowed.`}}catch{return{success:!1,message:`Invalid URL: ${g}`}}let C=v??VE(_);if(!C)return{success:!1,message:"Cannot derive skill name from URL. Please provide 'name' parameter."};try{let R=await fetch(g,{signal:AbortSignal.timeout(3e4)});if(!R.ok)return{success:!1,message:`Download failed: HTTP ${R.status} ${R.statusText}`};let U=R.headers.get("content-length");if(U&&parseInt(U,10)>512e3)return{success:!1,message:"Content too large (>512KB). Skill files should be small markdown documents."};let D=await R.text();if(!D.trim())return{success:!1,message:"Downloaded content is empty."};if(D.length>512e3)return{success:!1,message:"Content too large (>512KB). Skill files should be small markdown documents."};if(D.trimStart().startsWith("<!DOCTYPE")||D.trimStart().startsWith("<html"))return{success:!1,message:"URL returned an HTML page, not a raw markdown file. Use a raw/direct download link."};let M=Ht(),V=te.join(M,C);return await Y.promises.mkdir(V,{recursive:!0}),await Y.promises.writeFile(te.join(V,"SKILL.md"),D,"utf8"),this.sendNotification("turn.skill_instruction",{turnId:`skill-install-${Date.now()}`,instruction:{name:C,category:"installed",content:D,scope:"global"}}),gt(),{success:!0,message:`Skill "${C}" installed from ${_.host}. Available globally across all projects.`,path:V}}catch(R){return{success:!1,message:`Install failed: ${R instanceof Error?R.message:String(R)}`}}}})),Pe(Rg({abortSignal:void 0,currentForkDepth:0,forkAgent:async g=>{let v=Ir(g.agent);if(!v)return{agentId:"",status:"failed",error:`Unknown agent type: ${g.agent}`};if(!this.agent||!this.currentTransport||!this.currentApiKey||!this.currentModel)return{agentId:"",status:"failed",error:"No LLM provider configured"};let _=cn(),C=xa(_,v),U=Mt().filter(oe=>C.includes(oe.function.name)),D=Pl(U,!0),M=g.maxTurns??v.maxTurns??200;if(we.isTeamBudgetExceeded())return{agentId:`fork-${g.agent}-budget-exceeded`,status:"failed",output:void 0,error:we.teamBudgetExceededError(),tokensUsed:0};let V=await Oc({promptMessages:[{role:"user",content:g.prompt}],tools:D,transport:this.currentTransport,toolInvoker:c,apiKey:this.currentApiKey,model:this.currentModel,log:l,hooks:d,forkLabel:`agent-${g.agent}`,maxTurns:M,parentSignal:g.abortSignal,parentDepth:0,onEvent:oe=>{oe.type==="delta"&&oe.text&&this.sendNotification("turn.subagent_delta",{agentType:g.agent,text:oe.text})}}),ae=V.events.filter(oe=>oe.type==="end"&&"content"in oe).map(oe=>oe.content??"").join("")||V.events.filter(oe=>oe.type==="delta"&&"text"in oe).map(oe=>oe.text).join(""),ee=V.totalUsage.inputTokens+V.totalUsage.outputTokens;return we.recordForkTokens(ee),{agentId:`fork-${g.agent}-${wt().slice(0,8)}`,status:V.ok?"completed":"failed",output:ae||void 0,error:V.error,tokensUsed:ee}}}));let ce=pt(),de=new Map([["model",{key:"model",value:this.currentModel??"",type:"string",description:"Default LLM model"}],["language",{key:"language",value:"zh-cn",type:"string",description:"UI / response language"}],["verbose",{key:"verbose",value:this.verbose,type:"boolean",description:"Enable verbose logging"}],["maxRounds",{key:"maxRounds",value:25,type:"number",description:"Default max tool-call rounds per turn"}],["theme",{key:"theme",value:"auto",type:"enum",description:"Color theme",options:["auto","light","dark"]}]]),j=async()=>{try{return JSON.parse(await Y.promises.readFile(ce,"utf8"))}catch{return{}}},ve=async g=>{await Y.promises.mkdir(te.dirname(ce),{recursive:!0}),await Y.promises.writeFile(ce,JSON.stringify(g,null,2),"utf8")};Pe(_g({getConfig:async g=>{let v=de.get(g);if(!v)return{success:!1,error:`Unknown key: ${g}`};let _=await j(),C=g in _?_[g]:v.value;return{success:!0,setting:{...v,value:C,readOnly:Jo.includes(g)}}},setConfig:async(g,v)=>{let _=de.get(g);if(!_)return{success:!1,error:`Unknown key: ${g}`};let C=await j(),R=g in C?C[g]:_.value;return C[g]=v,await ve(C),{success:!0,previousValue:R,setting:{..._,value:v}}},listConfig:async()=>{let g=await j();return{success:!0,settings:[...de.values()].map(_=>({..._,value:_.key in g?g[_.key]:_.value,readOnly:Jo.includes(_.key)}))}},resetConfig:async g=>{let v=de.get(g);if(!v)return{success:!1,error:`Unknown key: ${g}`};let _=await j();return delete _[g],await ve(_),{success:!0,setting:v}},isValidKey:g=>de.has(g)}));let ie=new Map,$e=g=>{let v=/^(\d+)([smhd])$/.exec(g.trim());if(!v)return null;let _=parseInt(v[1],10),C=v[2];return _*({s:1e3,m:6e4,h:36e5,d:864e5}[C]??6e4)},ne=g=>{g.timerId&&clearTimeout(g.timerId);let v=$e(g.schedule);if(!v)return;let _=Date.now(),C=v-_%v||v;g.timerId=setTimeout(()=>{g.lastRunAt=new Date().toISOString(),g.repeat.completed++,g.lastStatus="success",l.info(`[cron] triggered job ${g.id} (${g.name})`),this.sendNotification("system.activity",{category:"cron",level:"info",title:`\u5B9A\u65F6\u4EFB\u52A1\u89E6\u53D1: ${g.name}`,detail:`\u8C03\u5EA6 ${g.scheduleDisplay}\uFF0C\u7B2C ${g.repeat.completed} \u6B21\u6267\u884C`}),g.repeat.times===null||g.repeat.completed<g.repeat.times?ne(g):(g.state="paused",g.enabled=!1,this.sendNotification("system.activity",{category:"cron",level:"info",title:`\u5B9A\u65F6\u4EFB\u52A1\u5B8C\u6210: ${g.name}`,detail:`\u5DF2\u8FBE\u5230\u6700\u5927\u6267\u884C\u6B21\u6570 (${g.repeat.completed}\u6B21)`}))},C),g.nextRunAt=new Date(_+C).toISOString()};Pn(async()=>{for(let g of ie.values())g.timerId&&clearTimeout(g.timerId)}),Pe(Pg({createJob:async g=>{let v=`cron_${wt().slice(0,8)}`,_={id:v,name:g.name??`Job ${v}`,prompt:g.prompt,schedule:g.schedule,scheduleDisplay:g.schedule,state:"scheduled",enabled:!0,repeat:{times:g.repeat??null,completed:0},allowedTools:g.allowedTools};return ie.set(v,_),ne(_),{success:!0,job:{..._,timerId:void 0}}},listJobs:async()=>({success:!0,jobs:[...ie.values()].map(v=>({...v,timerId:void 0}))}),getJob:async g=>{let v=ie.get(g);return v?{success:!0,job:{...v,timerId:void 0}}:{success:!1,error:`Job not found: ${g}`}},updateJob:async(g,v)=>{let _=ie.get(g);return _?(v.prompt!==void 0&&(_.prompt=v.prompt),v.schedule!==void 0&&(_.schedule=v.schedule,_.scheduleDisplay=v.schedule),v.name!==void 0&&(_.name=v.name),v.enabled!==void 0&&(_.enabled=v.enabled,_.state=v.enabled?"scheduled":"paused"),v.repeat!==void 0&&(_.repeat.times=v.repeat),v.allowedTools!==void 0&&(_.allowedTools=v.allowedTools),_.enabled?ne(_):_.timerId&&(clearTimeout(_.timerId),_.timerId=void 0),{success:!0,job:{..._,timerId:void 0}}):{success:!1,error:`Job not found: ${g}`}},deleteJob:async g=>{let v=ie.get(g);return v?(v.timerId&&clearTimeout(v.timerId),ie.delete(g),{success:!0}):{success:!1,error:`Job not found: ${g}`}},pauseJob:async g=>{let v=ie.get(g);return v?(v.state="paused",v.enabled=!1,v.timerId&&(clearTimeout(v.timerId),v.timerId=void 0),{success:!0,job:{...v,timerId:void 0}}):{success:!1,error:`Job not found: ${g}`}},resumeJob:async g=>{let v=ie.get(g);return v?(v.state="scheduled",v.enabled=!0,ne(v),{success:!0,job:{...v,timerId:void 0}}):{success:!1,error:`Job not found: ${g}`}},triggerJob:async g=>{let v=ie.get(g);return v?(v.lastRunAt=new Date().toISOString(),v.repeat.completed++,v.lastStatus="success",{success:!0,job:{...v,timerId:void 0}}):{success:!1,error:`Job not found: ${g}`}},validateSchedule:g=>$e(g)!==null||/^\d{1,2}\s/.test(g)?null:`Invalid schedule: ${g}. Use shorthand (5m, 1h, 1d) or cron expression.`}));let Q=new Map;Pn(async()=>{for(let g of Q.values())g.cleanup();Q.clear()}),Pe(Ig({startMonitor:async g=>{if(Q.has(g.monitorId))return{action:"start",success:!1,error:`Monitor "${g.monitorId}" already exists.`};let v={monitorId:g.monitorId,source:g.source,target:g.target,conditions:g.conditions,startedAt:Date.now(),timeoutSeconds:g.timeoutSeconds,eventCount:0},_=()=>{};if(g.source==="file")try{let C=Y.watch(g.target,{persistent:!1},()=>{v.eventCount++,l.info(`[monitor] file change detected: ${g.target}`)});_=()=>C.close()}catch{return{action:"start",success:!1,error:`Cannot watch: ${g.target}`}}if(g.timeoutSeconds>0){let C=setTimeout(()=>{let U=Q.get(g.monitorId);U&&(U.cleanup(),Q.delete(g.monitorId))},g.timeoutSeconds*1e3),R=_;_=()=>{clearTimeout(C),R()}}return Q.set(g.monitorId,{info:v,cleanup:_}),{action:"start",success:!0,monitorId:g.monitorId}},stopMonitor:async g=>{let v=Q.get(g);return v?(v.cleanup(),Q.delete(g),{action:"stop",success:!0,monitorId:g}):{action:"stop",success:!1,error:`Monitor "${g}" not found.`}},listMonitors:async()=>[...Q.values()].map(g=>g.info)}));let T=new Map,F={info:g=>l.info(g),warn:g=>l.warn(g)},B=new pn({onNotification:(g,v,_)=>{this.sendNotification("team.member.notification",{memberId:g,method:v,params:_})},onStateChange:(g,v)=>{this.sendNotification("team.member.state",{memberId:g,state:v});let _=B.getHandle(g),R=B.getUsageTracker(g)?.getUsage();this.emitAgentStatus(g,v,{missedBeats:B.getMissedBeats(g),lastActivityAt:_?.lastActivityAt,usage:R&&R.totalTokens>0?{inputTokens:R.inputTokens,outputTokens:R.outputTokens,totalTokens:R.totalTokens}:void 0})},onExit:(g,v,_)=>{for(let C of T.values()){let R=C.members.find(U=>U.cwd&&`team-${C.name}-${U.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase()===g.replace(/^team-/,""));R&&(R.isActive=!1)}l.info(`[team] member ${g} exited (code=${v}, signal=${_})`)},onMcpToolCall:(g,v,_)=>this.handleMcpToolCall(g,v,_),log:{info:g=>l.info(g),warn:g=>l.warn(g),debug:g=>l.debug(g)},sessionDir:te.join(H(),"agent-logs")});Pn(async()=>{B.dispose()}),Pe(Cg({createTeam:async g=>{if(T.has(g.teamName))return{success:!1,error:`Team "${g.teamName}" already exists.`};let v=await Ho(),_=[];for(let R of g.members??[]){let U={...R,isActive:!0};if(v){let D=`team-${g.teamName}-${R.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase(),M=await ff(v,D,F);M?(U.worktreePath=M.worktreePath,U.worktreeBranch=M.branch,U.cwd=M.worktreePath,l.info(`[team] provisioned worktree for ${R.name}: ${M.worktreePath}`)):(U.cwd=process.cwd(),l.warn(`[team] worktree provision failed for ${R.name}, using shared cwd`))}else U.cwd=process.cwd();_.push(U)}let C={name:g.teamName,description:g.description,leadId:this.currentSessionId??"default",members:_,createdAt:new Date().toISOString()};T.set(g.teamName,C);for(let R of _){if(!R.cwd)continue;let U=`team-${g.teamName}-${R.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase();try{await B.spawn({memberId:U,name:R.name,cwd:R.cwd,prompt:`You are the "${R.name}" team member. Role: ${R.role}.`,agentType:R.role,verbose:this.verbose}),l.info(`[team] spawned child process for ${R.name} in ${R.cwd}`)}catch(D){l.warn(`[team] failed to spawn child process for ${R.name}: ${D instanceof Error?D.message:String(D)}`),R.isActive=!1}}return this.sendNotification("team.updated",{teamName:g.teamName,action:"created",members:C.members.map(R=>({agentName:R.name,role:R.role,worktreePath:R.worktreePath,pid:B.getHandle(`team-${g.teamName}-${R.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase())?.pid}))}),{success:!0,team:C}},deleteTeam:async g=>{let v=T.get(g);if(!v)return{success:!1,error:`Team "${g}" not found.`};for(let C of v.members){let R=`team-${g}-${C.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase();B.kill(R),B.remove(R)}let _=await Ho();if(_)for(let C of v.members)C.worktreePath&&C.worktreeBranch&&(await gf(_,C.worktreePath,C.worktreeBranch,F),l.info(`[team] cleaned up worktree for ${C.name}: ${C.worktreePath}`));return T.delete(g),this.sendNotification("team.updated",{teamName:g,action:"destroyed",members:[]}),{success:!0}},listTeams:async()=>({success:!0,teams:[...T.values()]}),getTeamStatus:async g=>{let v=T.get(g);if(!v)return{success:!1,error:`Team "${g}" not found.`};let _={};for(let C of v.members){let R=`team-${g}-${C.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase(),U=B.getStatus(R);U&&(C.isActive=U.alive,_[C.name]={mediaProgress:U.mediaProgress,lastToolCall:U.lastToolCall,idleFor:U.idleFor,runningFor:U.runningFor})}return{success:!0,team:v,memberProgress:_}}}));{let g=this.memdir;Pe({name:zg,label:qg,description:Xg,parameters:Yg,execute:async(v,_)=>{let C=await Jg(_,{memdir:g,provider:this.memoryUserId?this.memoryProvider??void 0:void 0,localProvider:this.memoryUserId?this.memoryProvider??void 0:void 0,userId:this.memoryUserId});return{content:[{type:"text",text:C.message}],details:{type:"memory",action:C.action,ok:C.ok}}}})}Np(d,{getMemdir:()=>this.memdir,log:{debug:g=>l.debug(g),warn:g=>l.warn(g)}},this.memoryPrefetchState);{let g=e?.workdir??process.cwd(),v=Dg(g,this.currentSessionId||"default");Pe(Og(v))}Pe(Lg({sendNotification:async g=>(l.info(`[notify] ${g.title??""}: ${g.message}`),{delivered:!0,channel:g.channel??"cli"})})),Pe(Ng({sendMessage:async g=>(l.info(`[send_message] ${g.senderId} \u2192 ${g.to}: ${g.message}`),{success:!0,recipients:[g.to]}),getSenderId:()=>this.currentSessionId??"default",listTeammates:()=>[]}));{let g=e?.workdir??process.cwd(),v,_=()=>(v||(v=di.createContext({...{readFile:async R=>Y.promises.readFile(te.resolve(g,R),"utf8"),writeFile:async(R,U)=>{await Y.promises.writeFile(te.resolve(g,R),U,"utf8")},editFile:async(R,U)=>{let D=await Y.promises.readFile(te.resolve(g,R),"utf8");for(let M of U)D=D.replace(M.oldText,M.newText);return await Y.promises.writeFile(te.resolve(g,R),D,"utf8"),D},exec:async R=>{let U=await import("node:child_process");return new Promise(D=>{U.execFile("bash",["-c",R],{cwd:g,timeout:3e4},(M,V,ae)=>{D({stdout:V?.toString()??"",stderr:ae?.toString()??"",exitCode:M?M.code??1:0})})})},glob:async R=>{try{let{globSync:U}=await import("node:fs");return U(R,{cwd:g})}catch{return[]}},grep:async(R,U)=>{let D=[],M=te.resolve(g,U??".");try{let V=await import("node:child_process"),ae=await new Promise(ee=>{V.execFile("grep",["-rn",R,M,"--include=*"],{timeout:1e4},(oe,me)=>ee(me?.toString()??""))});for(let ee of ae.split(`
|
|
844
844
|
`).filter(Boolean).slice(0,100)){let oe=ee.match(/^(.+?):(\d+):(.*)$/);oe&&D.push({file:oe[1],line:parseInt(oe[2]),text:oe[3]})}}catch{}return D},console:{log:(...R)=>R.map(String).join(" ")}},setTimeout,clearTimeout,Promise,JSON,Math,Date,Array,Object,String,Number,Boolean,RegExp,Map,Set,Error,Buffer})),v);Pe(jg({executeInVm:async C=>{let R=Date.now();try{let U=_(),D=await di.runInContext(`(async () => { ${C} })()`,U,{timeout:3e4});return{output:D!==void 0?String(D):"",duration:Date.now()-R}}catch(U){return{output:"",error:U instanceof Error?U.message:String(U),duration:Date.now()-R}}},resetVm:()=>{v=void 0}}))}{let g=e?.workdir??process.cwd();Pe(Fg({executeOperation:async v=>{switch(v.operation){case"goToDefinition":case"findReferences":return{type:"locations",locations:[]};case"hover":return{type:"hover",hover:null};case"documentSymbol":return{type:"symbols",symbols:[]};case"diagnostics":return{type:"diagnostics",diagnostics:[]};case"completion":return{type:"completions",completions:[]};case"signatureHelp":return{type:"signatureHelp",signatures:[]};case"rename":return{type:"rename",edits:[]};case"codeAction":return{type:"codeActions",actions:[]};default:return{type:"locations",locations:[]}}},resolvePath:v=>te.isAbsolute(v)?v:te.resolve(g,v)}))}let Re=e?.workdir??process.cwd(),he=ih({projectRoot:Re,ruleEngine:P,hooks:d,log:g=>l.info(`[settings] ${g}`)});Pn(async()=>{he()}),this.currentSessionId&&d.invoke("session.created",{sessionId:this.currentSessionId}).catch(()=>{}),this.fileWatcher&&this.fileWatcher.stop();let Ut=e?.workdir??process.cwd();return cm({projectRoot:Ut,sessionId:this.currentSessionId,hooks:d,log:g=>l.debug(g),onInstructionCacheReset:gm}).then(g=>{this.fileWatcher=g,Pn(async()=>{this.fileWatcher?.stop()})}).catch(g=>{l.warn(`[file-watcher] init error: ${g instanceof Error?g.message:g}`)}),this.agent=new Hn({llmTransport:a.transport,apiKey:a.apiKey,toolInvoker:c,log:l,hooks:d,maxRounds:e.maxRounds,verbose:this.verbose,projectRoot:this.getActiveProjectRoot()}),this.lastLlmConfigKey=i,this.currentTransport=a.transport,this.currentApiKey=a.apiKey,this.currentModel=n,this.currentProvider=t,this.currentBaseUrl=s??"",this.log(`created Agent (provider: ${t}, model: ${n})`),this.agent}static STATE_TO_STATUS={starting:"spawning",ready:"available",running:"running",completed:"available",failed:"failed",killed:"unavailable"};emitAgentStatus(e,t,n){let r=o.STATE_TO_STATUS[t]??"unavailable",s={agentId:e,status:r};(n?.missedBeats!==void 0||n?.lastActivityAt!==void 0)&&(s.health={missedBeats:n.missedBeats??0,lastActiveAt:n.lastActivityAt?new Date(n.lastActivityAt).toISOString():new Date().toISOString()}),n?.usage&&(s.usage=n.usage),this.sendNotification("agents.status",s)}async handleMcpToolCall(e,t,n){let r=nt(t);if(!r)return`Error: Unknown tool "${t}"`;let s=`mcp_${e}_${wt().slice(0,8)}`;try{return(await r.execute(s,n)).content.map(a=>a.text??"").join(`
|
|
845
845
|
`)||"OK"}catch(i){return`Error: ${i instanceof Error?i.message:String(i)}`}}async ensureAgentConfigStore(){return this.agentConfigStore||(this.agentConfigStore=new Cs(this.getActiveProjectRoot()),await this.agentConfigStore.load(),this.acpDetector.setConfigStore(this.agentConfigStore.getData())),this.agentConfigStore}sendResponse(e,t,n){let r={jsonrpc:"2.0",id:e};n?r.error=n:r.result=t,this.writeStdout(r)}sendNotification(e,t){if(this.acpServer&&this.acpServer.sessionId)Rh(this.acpServer,this.acpServer.sessionId,e,t);else{let n={jsonrpc:"2.0",method:e,params:t};this.writeStdout(n)}e==="turn.end"&&this.resetIdleDreamTimer(),e==="turn.start"&&this.cancelIdleDreamTimer()}writeStdout(e){this.transport.send(e)}log(e){this.verbose&&process.stderr.write(`[qlogicagent] ${e}
|
|
846
|
-
`)}enableIdleDream(e){we.dream.enabled=!0,e&&e>0&&(we.dream.idleMinutes=e),this.resetIdleDreamTimer()}resetIdleDreamTimer(){this.cancelIdleDreamTimer(),we.dream.enabled&&this.currentSessionId&&(this.idleDreamTimer=setTimeout(()=>{this.triggerIdleDream()},we.dream.idleMinutes*6e4),this.idleDreamTimer.unref?.())}cancelIdleDreamTimer(){this.idleDreamTimer&&(clearTimeout(this.idleDreamTimer),this.idleDreamTimer=null)}async triggerIdleDream(){if(Date.now()-we.dream.lastDreamAt<we.dream.cooldownMs){this.log("[dream:idle] Skipped \u2014 cooldown not elapsed");return}let e=this.resolveClientForPurpose("textGeneration");if(!e){this.log("[dream:idle] Skipped \u2014 no LLM transport configured");return}if(this.activeTurn){this.log("[dream:idle] Skipped \u2014 turn in progress");return}this.log("[dream:idle] Triggering idle dream consolidation"),we.dream.lastDreamAt=Date.now(),this.sendNotification("system.activity",{category:"dream",level:"info",title:"\u7A7A\u95F2\u68A6\u5883\u6574\u7406\u89E6\u53D1",detail:`\u7A7A\u95F2 ${we.dream.idleMinutes} \u5206\u949F\u540E\u81EA\u52A8\u89E6\u53D1`});let t=setTimeout(()=>{this.activeTurn&&(this.log("[dream:idle] Aborting \u2014 max duration reached"),this.activeTurn.abort())},we.dream.maxDurationMs);t.unref?.();let n=H(),r=[];try{r=(await Et(20,this.getActiveProjectRoot())).filter(a=>a.sessionId!==this.currentSessionId).map(a=>a.sessionId)}catch{}let s={jsonrpc:"2.0",id:void 0,method:"memory.dream",params:{turnId:`idle-dream-${wt().slice(0,8)}`,sessionId:this.currentSessionId,config:{memoryRoot:n,transcriptDir:te.join(n,"agent-logs"),dreamSessionIds:r,currentSessionTurnCount:this.sessionState?.turnCount??0,model:e.model,apiKey:e.apiKey,force:!1}}};try{await Zs.call(this,s)}finally{clearTimeout(t)}this.resetIdleDreamTimer()}initAcpServer(){let e={handleAcpInitialize:t=>this.acpHandleInitialize(t),handleAcpSessionNew:t=>this.acpHandleSessionNew(t),handleAcpSessionPrompt:t=>this.acpHandleSessionPrompt(t),handleAcpSessionEnd:t=>this.acpHandleSessionEnd(t),handleAcpSessionSetConfig:t=>this.acpHandleSessionSetConfig(t),handleAcpSessionSetModel:(t,n)=>this.acpHandleSessionSetModel(t,n),handleAcpSessionSetMode:(t,n)=>this.acpHandleSessionSetMode(t,n),handleAcpPermissionResponse:(t,n)=>this.acpHandlePermissionResponse(t,n),handleAcpAbort:t=>this.acpHandleAbort(t),handleAcpDream:t=>this.acpHandleDream(t),handleAcpAgentsList:()=>this.acpHandleAgentsList(),handleAcpSoloStart:t=>this.acpHandleSoloStart(t),handleAcpSoloStatus:t=>this.acpHandleSoloStatus(t),handleAcpSoloSelect:t=>this.acpHandleSoloSelect(t),handleAcpSoloCancel:t=>this.acpHandleSoloCancel(t),handleAcpSoloSubscribe:t=>this.acpHandleSoloSubscribe(t),handleAcpSoloMessage:t=>this.acpHandleSoloMessage(t),handleAcpSoloEvaluate:t=>this.acpHandleSoloEvaluate(t),handleAcpProductCreate:t=>this.acpHandleProductCreate(t),handleAcpProductPlan:t=>this.acpHandleProductPlan(t),handleAcpProductConfirm:t=>this.acpHandleProductConfirm(t),handleAcpProductMessage:t=>this.acpHandleProductMessage(t),handleAcpProductPause:t=>this.acpHandleProductPause(t),handleAcpProductResume:t=>this.acpHandleProductResume(t),handleAcpProductCancel:t=>this.acpHandleProductCancel(t),handleAcpProductRollback:t=>this.acpHandleProductRollback(t),handleAcpProductStatus:t=>this.acpHandleProductStatus(t),handleAcpProductSubscribe:t=>this.acpHandleProductSubscribe(t),handleAcpTeamDelegate:t=>this.acpHandleTeamDelegate(t)};this.acpServer=new Fs(this.transport,e,{verbose:this.verbose})}getAcpServer(){return this.acpServer}async acpHandleInitialize(e){let t=e.clientInfo?.name??"unknown";this.log(`[acp] initialize: host=${t}`);let n={extendedEvents:!0,extendedMethods:!0,orchestration:!0,configOptions:[{name:"model",type:"string",description:"LLM model identifier"},{name:"provider",type:"string",description:"LLM provider identifier"},{name:"maxRounds",type:"number",description:"Max tool loop rounds"},{name:"temperature",type:"number",description:"Sampling temperature"}]};return this.ensureDefaultProject(),{protocolVersion:1,agentInfo:{name:"qlogicagent",version:GE},agentCapabilities:n}}async acpHandleSessionNew(e){let t=e.sessionId??wt();return this.log(`[acp] session/new: id=${t}`),this.currentSessionId=t,this.sessionState=new ln(t),this.sessionTaskDomain=void 0,this.memoryPrefetchState=Kt(),e.cwd&&typeof e.cwd=="string"&&this.setActiveWorkdir(e.cwd),this.enableIdleDream(),{sessionId:t}}async acpHandleSessionPrompt(e){let t=wt(),n=e.sessionId,r=e.prompt.map(l=>l.type==="text"?l.text:`[${l.type}]`).join("");if(!r.trim())return this.sendNotification("turn.start",{turnId:t,model:this.currentModel||void 0}),this.sendNotification("turn.end",{turnId:t,content:"",item:{id:`${t}-end`,type:"message",role:"assistant",text:"",createdAt:new Date().toISOString()}}),{stopReason:"end_turn"};let s=this.acpSessionHistory.get(n);s||(s=[],this.acpSessionHistory.set(n,s)),s.push({role:"user",content:r});let i=[...s],a=await this.runAcpTurn(t,n,i);return a.content&&s.push({role:"assistant",content:a.content}),a}async runAcpTurn(e,t,n){let r=new AbortController;this.activeTurn=r,this.sendNotification("turn.start",{turnId:e,model:this.currentModel||void 0});try{let s={model:this.currentModel||void 0,provider:this.currentProvider||void 0,apiKey:this.currentApiKey||void 0,baseUrl:this.currentBaseUrl||void 0},i=this.resolveAgent(s);if(!i)return this.sendNotification("turn.delta",{turnId:e,text:"Error: No LLM provider configured. Configure via ~/.qlogicagent/settings.json or pass provider/apiKey in session config.",item:{id:`${e}-err`,type:"message",role:"assistant",text:"",createdAt:new Date().toISOString()}}),this.sendNotification("turn.end",{turnId:e,content:"",item:{id:`${e}-end`,type:"message",role:"assistant",text:"",createdAt:new Date().toISOString()}}),this.activeTurn=null,{stopReason:"end_turn"};await this.mcpReady;let a=Mt(),l,c="end_turn",d="";for await(let u of i.run({turnId:e,sessionId:t,messages:n,tools:a,config:s},r.signal)){let p=new Date().toISOString();switch(u.type){case"start":break;case"delta":this.sendNotification("turn.delta",{turnId:u.turnId,text:u.text,item:{id:`${e}-delta`,type:"message",role:"assistant",text:u.text,createdAt:p}});break;case"end":u.usage&&(l={inputTokens:u.usage.inputTokens??0,outputTokens:u.usage.outputTokens??0,cacheReadTokens:u.usage.cacheRead,cacheWriteTokens:u.usage.cacheWrite}),d=u.content??"",this.sendNotification("turn.end",{turnId:u.turnId,content:u.content,usage:u.usage,model:u.model,provider:u.provider,item:{id:`${e}-end`,type:"message",role:"assistant",text:u.content,createdAt:p}});break;case"error":c="end_turn",this.sendNotification("turn.error",{turnId:u.turnId,error:{message:u.error,code:u.code}});break;case"tool_call":this.sendNotification("turn.tool_call",{turnId:u.turnId,callId:u.callId,name:u.name,arguments:u.arguments,item:{id:u.callId,type:"tool_call",role:"assistant",toolName:u.name,toolCallId:u.callId,arguments:u.arguments,createdAt:p}});break;case"tool_result":this.sendNotification("turn.tool_result",{turnId:u.turnId,callId:u.callId,name:u.name,ok:u.ok,...u.error?{error:u.error}:{},...u.outputPreview?{outputPreview:u.outputPreview}:{},item:{id:`${u.callId}-result`,type:"tool_result",role:"assistant",toolName:u.name,toolCallId:u.callId,output:u.ok?u.outputPreview??"":u.error,approved:u.ok,createdAt:p}});break;case"tool_blocked":this.sendNotification("turn.tool_blocked",{turnId:u.turnId,callId:u.callId,name:u.name,reason:u.reason,item:{id:`${u.callId}-blocked`,type:"tool_blocked",role:"system",toolName:u.name,toolCallId:u.callId,text:u.reason,approved:!1,createdAt:p}});break;case"recovery":this.sendNotification("turn.recovery",{turnId:u.turnId,action:u.action,...u.detail?{detail:u.detail}:{},item:{id:`${e}-recovery-${wt().slice(0,8)}`,type:"recovery",role:"system",strategy:u.action,text:u.detail,createdAt:p}});break;case"reasoning_delta":this.sendNotification("turn.reasoning_delta",{turnId:u.turnId,text:u.text});break;case"subagent_started":this.sendNotification("turn.subagent_started",{turnId:u.turnId,subagentId:u.subagentId,agentType:u.agentType,...u.prompt?{prompt:u.prompt}:{}});break;case"subagent_ended":this.sendNotification("turn.subagent_ended",{turnId:u.turnId,subagentId:u.subagentId,agentType:u.agentType,ok:u.ok,...u.outputPreview?{outputPreview:u.outputPreview}:{},...u.error?{error:u.error}:{}});break;case"media_result":this.sendNotification("turn.media_result",{turnId:u.turnId,mediaType:u.mediaType,url:u.url,...u.model?{model:u.model}:{},...u.provider?{provider:u.provider}:{},...u.taskId?{taskId:u.taskId}:{}});break}}return this.activeTurn=null,{stopReason:c,usage:l,content:d}}catch(s){this.activeTurn=null;let i=s instanceof Error?s.message:String(s);return this.log(`[acp] runAcpTurn error: ${i}`),this.sendNotification("turn.error",{turnId:e,error:{message:i,code:"INTERNAL_ERROR"}}),{stopReason:"end_turn"}}}async acpHandleSessionEnd(e){this.log(`[acp] session/end: id=${e.sessionId}`),this.acpSessionHistory.delete(e.sessionId),this.currentSessionId===e.sessionId&&(this.cancelIdleDreamTimer(),this.currentHooks&&await this.currentHooks.invoke("session.ended",{sessionId:e.sessionId}).catch(()=>{}),this.currentSessionId="",this.sessionState=null)}async acpHandleSessionSetConfig(e){let t=e.configId??e.option;this.log(`[acp] session/set_config: ${t}=${JSON.stringify(e.value)}`);let n=typeof e.value=="string"?e.value:"";switch(t){case"model":this.currentModel=n;break;case"provider":this.currentProvider=n;break;case"apiKey":this.currentApiKey=n;break;case"baseUrl":this.currentBaseUrl=n;break}}async acpHandleSessionSetModel(e,t){this.log(`[acp] session/set_model: ${t} (note: model is managed by ModelRegistry, this is a hint only)`),t&&(this.currentModel=t)}async acpHandleSessionSetMode(e,t){this.log(`[acp] session/set_mode: ${t}`)}acpHandlePermissionResponse(e,t){this.log(`[acp] permission response: ${e} \u2192 ${t}`),this.permissionChecker&&this.permissionChecker.resolveApproval({approvalId:e,decision:t==="allow"?"approved":"denied"})}async acpHandleAbort(e){this.log(`[acp] abort: session=${e.sessionId}`),this.activeTurn&&(this.activeTurn.abort(),this.activeTurn=null)}async acpHandleDream(e){this.log(`[acp] x/dream: session=${e.sessionId}`);let t=this.resolveClientForPurpose("textGeneration");if(!t)return{ok:!1,summary:"No LLM transport configured for dream"};let n=H(),r={jsonrpc:"2.0",id:`acp-dream-${wt().slice(0,8)}`,method:"memory.dream",params:{turnId:`dream-${wt().slice(0,8)}`,sessionId:e.sessionId||this.currentSessionId,config:{memoryRoot:e.config?.memoryRoot||n,transcriptDir:e.config?.transcriptDir||te.join(n,"agent-logs"),model:t.model,apiKey:t.apiKey,...e.config}}};return await Zs.call(this,r),{ok:!0,summary:"Dream consolidation triggered"}}async acpHandleSoloStart(e){this.log("[acp] x/solo.start");let t=Je.call(this),n=await t.start(e);return t.getStatus(n)}async acpHandleSoloStatus(e){this.log("[acp] x/solo.status");let t=e.soloId;if(!t)return this.soloEvaluator?this.soloEvaluator.listSessions():[];let r=Je.call(this).getStatus(t);if(!r)throw new Error(`Solo session ${t} not found`);return r}async acpHandleSoloSelect(e){return this.log("[acp] x/solo.select"),{ok:!0,mergedBranch:await Je.call(this).select(e)}}async acpHandleSoloCancel(e){this.log("[acp] x/solo.cancel");let t=Je.call(this),n=e.soloId;return await t.cancel(n),{ok:!0}}async acpHandleSoloSubscribe(e){return this.log("[acp] x/solo.subscribe"),{ok:!0,soloId:e.soloId}}async acpHandleSoloMessage(e){this.log("[acp] x/solo.message");let t=Je.call(this),{soloId:n,agentId:r,content:s,agentIndex:i}=e;return t.message(n,r,s,i)}async acpHandleSoloEvaluate(e){this.log("[acp] x/solo.evaluate");let t=Je.call(this),{soloId:n,evaluatorAgentId:r,evaluatorIndex:s}=e;return t.triggerEvaluation(n,r,s)}async acpHandleAgentsList(){return this.log("[acp] x/agents.list"),_a()}async acpHandleProductCreate(e){return this.log("[acp] x/product.create"),{productId:await De.call(this).create(e)}}async acpHandleProductPlan(e){return this.log("[acp] x/product.plan"),await Cn.call(this).plan(e)}async acpHandleProductConfirm(e){this.log("[acp] x/product.confirm");let t=Cn.call(this),n=e,r=await t.confirm(n),s=t.getSession(n.productId);return s&&await De.call(this).create({name:s.plan?.name??s.goal.slice(0,50),cwd:s.cwd,instances:n.instances,tasks:n.tasks,budget:n.budget}),r}async acpHandleProductMessage(e){this.log("[acp] x/product.message");let t=Cn.call(this),n=e;return t.message(n.productId,n.content)}async acpHandleProductResume(e){this.log("[acp] x/product.resume");let t=De.call(this),n=e.productId;return await t.resume(n,this.getActiveProjectRoot()),{ok:!0}}async acpHandleProductStatus(e){this.log("[acp] x/product.status");let t=e.productId;if(!this.productOrchestrator)return t?null:[];if(!t)return this.productOrchestrator.list(this.getActiveProjectRoot());let n=this.productOrchestrator.getStatus(t);if(!n)throw new Error(`Product session ${t} not found`);return n}async acpHandleProductPause(e){this.log("[acp] x/product.pause");let t=De.call(this),n=e.productId;return await t.pause(n),{ok:!0}}async acpHandleProductCancel(e){this.log("[acp] x/product.cancel");let t=De.call(this),n=e.productId;return await t.delete(n),{ok:!0}}async acpHandleProductRollback(e){this.log("[acp] x/product.rollback");let t=De.call(this),n=e.productId,r=e.checkpointId??"latest";return await t.rollback(n,r),{ok:!0}}async acpHandleProductSubscribe(e){return this.log("[acp] x/product.subscribe"),{ok:!0,productId:e.productId}}async acpHandleTeamDelegate(e){let t=e.agentType,n=e.prompt,r=e.maxTurns;if(!n)throw new Error("Missing required param: prompt");if(!t)throw new Error("Missing required param: agentType");let s=Ir(t);if(!s)throw new Error(`Unknown agent type: ${t}`);let i=this.resolveClientForPurpose("textGeneration");if(!i)throw new Error("No LLM provider configured \u2014 send a prompt first to configure the model");if(this.log(`[acp] x/team.delegate: agent=${t}, maxTurns=${r??s.maxTurns}`),we.isTeamBudgetExceeded())return{ok:!1,agentType:t,output:void 0,error:we.teamBudgetExceededError(),tokensUsed:0};let a={invoke:async()=>({result:"Tool execution not available in delegated mode"})},l={info:p=>this.log(`[delegate:${t}] ${p}`),warn:p=>this.log(`[delegate:${t}] WARN: ${p}`),error:p=>this.log(`[delegate:${t}] ERROR: ${p}`),debug:p=>this.log(`[delegate:${t}] ${p}`)},c=await Oc({promptMessages:[{role:"user",content:n}],tools:[],transport:i.transport,toolInvoker:a,apiKey:i.apiKey,model:i.model,log:l,forkLabel:`team-delegate-${t}`,maxTurns:r??s.maxTurns,parentSignal:this.activeTurn?.signal,parentDepth:0}),d=c.events.filter(p=>p.type==="end"&&"content"in p).map(p=>p.content??"").join("")||c.events.filter(p=>p.type==="delta"&&"text"in p).map(p=>p.text).join(""),u=c.totalUsage.inputTokens+c.totalUsage.outputTokens;return we.recordForkTokens(u),{ok:c.ok,agentType:t,output:d||void 0,error:c.error,tokensUsed:u}}};an();$n();export{Hn as Agent,sn as ProviderRegistry,Sd as StdioServer,$o as StdioTransport,vo as buildSkillInstruction,cl as createHookRegistry,Eo as createLLMClient,Bw as parseCliArgs};
|
|
846
|
+
`)}enableIdleDream(e){we.dream.enabled=!0,e&&e>0&&(we.dream.idleMinutes=e),this.resetIdleDreamTimer()}resetIdleDreamTimer(){this.cancelIdleDreamTimer(),we.dream.enabled&&this.currentSessionId&&(this.idleDreamTimer=setTimeout(()=>{this.triggerIdleDream()},we.dream.idleMinutes*6e4),this.idleDreamTimer.unref?.())}cancelIdleDreamTimer(){this.idleDreamTimer&&(clearTimeout(this.idleDreamTimer),this.idleDreamTimer=null)}async triggerIdleDream(){if(Date.now()-we.dream.lastDreamAt<we.dream.cooldownMs){this.log("[dream:idle] Skipped \u2014 cooldown not elapsed");return}let e=this.resolveClientForPurpose("textGeneration");if(!e){this.log("[dream:idle] Skipped \u2014 no LLM transport configured");return}if(this.activeTurn){this.log("[dream:idle] Skipped \u2014 turn in progress");return}this.log("[dream:idle] Triggering idle dream consolidation"),we.dream.lastDreamAt=Date.now(),this.sendNotification("system.activity",{category:"dream",level:"info",title:"\u7A7A\u95F2\u68A6\u5883\u6574\u7406\u89E6\u53D1",detail:`\u7A7A\u95F2 ${we.dream.idleMinutes} \u5206\u949F\u540E\u81EA\u52A8\u89E6\u53D1`});let t=setTimeout(()=>{this.activeTurn&&(this.log("[dream:idle] Aborting \u2014 max duration reached"),this.activeTurn.abort())},we.dream.maxDurationMs);t.unref?.();let n=H(),r=[];try{r=(await Et(20,this.getActiveProjectRoot())).filter(a=>a.sessionId!==this.currentSessionId).map(a=>a.sessionId)}catch{}let s={jsonrpc:"2.0",id:void 0,method:"memory.dream",params:{turnId:`idle-dream-${wt().slice(0,8)}`,sessionId:this.currentSessionId,config:{memoryRoot:n,transcriptDir:te.join(n,"agent-logs"),dreamSessionIds:r,currentSessionTurnCount:this.sessionState?.turnCount??0,model:e.model,apiKey:e.apiKey,force:!1}}};try{await Zs.call(this,s)}finally{clearTimeout(t)}this.resetIdleDreamTimer()}initAcpServer(){let e={handleAcpInitialize:t=>this.acpHandleInitialize(t),handleAcpSessionNew:t=>this.acpHandleSessionNew(t),handleAcpSessionPrompt:t=>this.acpHandleSessionPrompt(t),handleAcpSessionEnd:t=>this.acpHandleSessionEnd(t),handleAcpSessionSetConfig:t=>this.acpHandleSessionSetConfig(t),handleAcpSessionSetModel:(t,n)=>this.acpHandleSessionSetModel(t,n),handleAcpSessionSetMode:(t,n)=>this.acpHandleSessionSetMode(t,n),handleAcpPermissionResponse:(t,n)=>this.acpHandlePermissionResponse(t,n),handleAcpAbort:t=>this.acpHandleAbort(t),handleAcpDream:t=>this.acpHandleDream(t),handleAcpAgentsList:()=>this.acpHandleAgentsList(),handleAcpSoloStart:t=>this.acpHandleSoloStart(t),handleAcpSoloStatus:t=>this.acpHandleSoloStatus(t),handleAcpSoloSelect:t=>this.acpHandleSoloSelect(t),handleAcpSoloCancel:t=>this.acpHandleSoloCancel(t),handleAcpSoloSubscribe:t=>this.acpHandleSoloSubscribe(t),handleAcpSoloMessage:t=>this.acpHandleSoloMessage(t),handleAcpSoloEvaluate:t=>this.acpHandleSoloEvaluate(t),handleAcpProductCreate:t=>this.acpHandleProductCreate(t),handleAcpProductPlan:t=>this.acpHandleProductPlan(t),handleAcpProductConfirm:t=>this.acpHandleProductConfirm(t),handleAcpProductMessage:t=>this.acpHandleProductMessage(t),handleAcpProductPause:t=>this.acpHandleProductPause(t),handleAcpProductResume:t=>this.acpHandleProductResume(t),handleAcpProductCancel:t=>this.acpHandleProductCancel(t),handleAcpProductRollback:t=>this.acpHandleProductRollback(t),handleAcpProductStatus:t=>this.acpHandleProductStatus(t),handleAcpProductSubscribe:t=>this.acpHandleProductSubscribe(t),handleAcpTeamDelegate:t=>this.acpHandleTeamDelegate(t)};this.acpServer=new Fs(this.transport,e,{verbose:this.verbose})}getAcpServer(){return this.acpServer}async acpHandleInitialize(e){let t=e.clientInfo?.name??"unknown";this.log(`[acp] initialize: host=${t}`);let n={extendedEvents:!0,extendedMethods:!0,orchestration:!0,configOptions:[{name:"model",type:"string",description:"LLM model identifier"},{name:"provider",type:"string",description:"LLM provider identifier"},{name:"maxRounds",type:"number",description:"Max tool loop rounds"},{name:"temperature",type:"number",description:"Sampling temperature"}]};return this.ensureDefaultProject(),{protocolVersion:1,agentInfo:{name:"qlogicagent",version:HE},agentCapabilities:n}}async acpHandleSessionNew(e){let t=e.sessionId??wt();return this.log(`[acp] session/new: id=${t}`),this.currentSessionId=t,this.sessionState=new ln(t),this.sessionTaskDomain=void 0,this.memoryPrefetchState=Kt(),e.cwd&&typeof e.cwd=="string"&&this.setActiveWorkdir(e.cwd),this.enableIdleDream(),{sessionId:t}}async acpHandleSessionPrompt(e){let t=wt(),n=e.sessionId,r=e.prompt.map(l=>l.type==="text"?l.text:`[${l.type}]`).join("");if(!r.trim())return this.sendNotification("turn.start",{turnId:t,model:this.currentModel||void 0}),this.sendNotification("turn.end",{turnId:t,content:"",item:{id:`${t}-end`,type:"message",role:"assistant",text:"",createdAt:new Date().toISOString()}}),{stopReason:"end_turn"};let s=this.acpSessionHistory.get(n);s||(s=[],this.acpSessionHistory.set(n,s)),s.push({role:"user",content:r});let i=[...s],a=await this.runAcpTurn(t,n,i);return a.content&&s.push({role:"assistant",content:a.content}),a}async runAcpTurn(e,t,n){let r=new AbortController;this.activeTurn=r,this.sendNotification("turn.start",{turnId:e,model:this.currentModel||void 0});try{let s={model:this.currentModel||void 0,provider:this.currentProvider||void 0,apiKey:this.currentApiKey||void 0,baseUrl:this.currentBaseUrl||void 0},i=this.resolveAgent(s);if(!i)return this.sendNotification("turn.delta",{turnId:e,text:"Error: No LLM provider configured. Configure via ~/.qlogicagent/settings.json or pass provider/apiKey in session config.",item:{id:`${e}-err`,type:"message",role:"assistant",text:"",createdAt:new Date().toISOString()}}),this.sendNotification("turn.end",{turnId:e,content:"",item:{id:`${e}-end`,type:"message",role:"assistant",text:"",createdAt:new Date().toISOString()}}),this.activeTurn=null,{stopReason:"end_turn"};await this.mcpReady;let a=Mt(),l,c="end_turn",d="";for await(let u of i.run({turnId:e,sessionId:t,messages:n,tools:a,config:s},r.signal)){let p=new Date().toISOString();switch(u.type){case"start":break;case"delta":this.sendNotification("turn.delta",{turnId:u.turnId,text:u.text,item:{id:`${e}-delta`,type:"message",role:"assistant",text:u.text,createdAt:p}});break;case"end":u.usage&&(l={inputTokens:u.usage.inputTokens??0,outputTokens:u.usage.outputTokens??0,cacheReadTokens:u.usage.cacheRead,cacheWriteTokens:u.usage.cacheWrite}),d=u.content??"",this.sendNotification("turn.end",{turnId:u.turnId,content:u.content,usage:u.usage,model:u.model,provider:u.provider,item:{id:`${e}-end`,type:"message",role:"assistant",text:u.content,createdAt:p}});break;case"error":c="end_turn",this.sendNotification("turn.error",{turnId:u.turnId,error:{message:u.error,code:u.code}});break;case"tool_call":this.sendNotification("turn.tool_call",{turnId:u.turnId,callId:u.callId,name:u.name,arguments:u.arguments,item:{id:u.callId,type:"tool_call",role:"assistant",toolName:u.name,toolCallId:u.callId,arguments:u.arguments,createdAt:p}});break;case"tool_result":this.sendNotification("turn.tool_result",{turnId:u.turnId,callId:u.callId,name:u.name,ok:u.ok,...u.error?{error:u.error}:{},...u.outputPreview?{outputPreview:u.outputPreview}:{},item:{id:`${u.callId}-result`,type:"tool_result",role:"assistant",toolName:u.name,toolCallId:u.callId,output:u.ok?u.outputPreview??"":u.error,approved:u.ok,createdAt:p}});break;case"tool_blocked":this.sendNotification("turn.tool_blocked",{turnId:u.turnId,callId:u.callId,name:u.name,reason:u.reason,item:{id:`${u.callId}-blocked`,type:"tool_blocked",role:"system",toolName:u.name,toolCallId:u.callId,text:u.reason,approved:!1,createdAt:p}});break;case"recovery":this.sendNotification("turn.recovery",{turnId:u.turnId,action:u.action,...u.detail?{detail:u.detail}:{},item:{id:`${e}-recovery-${wt().slice(0,8)}`,type:"recovery",role:"system",strategy:u.action,text:u.detail,createdAt:p}});break;case"reasoning_delta":this.sendNotification("turn.reasoning_delta",{turnId:u.turnId,text:u.text});break;case"subagent_started":this.sendNotification("turn.subagent_started",{turnId:u.turnId,subagentId:u.subagentId,agentType:u.agentType,...u.prompt?{prompt:u.prompt}:{}});break;case"subagent_ended":this.sendNotification("turn.subagent_ended",{turnId:u.turnId,subagentId:u.subagentId,agentType:u.agentType,ok:u.ok,...u.outputPreview?{outputPreview:u.outputPreview}:{},...u.error?{error:u.error}:{}});break;case"media_result":this.sendNotification("turn.media_result",{turnId:u.turnId,mediaType:u.mediaType,url:u.url,...u.model?{model:u.model}:{},...u.provider?{provider:u.provider}:{},...u.taskId?{taskId:u.taskId}:{}});break}}return this.activeTurn=null,{stopReason:c,usage:l,content:d}}catch(s){this.activeTurn=null;let i=s instanceof Error?s.message:String(s);return this.log(`[acp] runAcpTurn error: ${i}`),this.sendNotification("turn.error",{turnId:e,error:{message:i,code:"INTERNAL_ERROR"}}),{stopReason:"end_turn"}}}async acpHandleSessionEnd(e){this.log(`[acp] session/end: id=${e.sessionId}`),this.acpSessionHistory.delete(e.sessionId),this.currentSessionId===e.sessionId&&(this.cancelIdleDreamTimer(),this.currentHooks&&await this.currentHooks.invoke("session.ended",{sessionId:e.sessionId}).catch(()=>{}),this.currentSessionId="",this.sessionState=null)}async acpHandleSessionSetConfig(e){let t=e.configId??e.option;this.log(`[acp] session/set_config: ${t}=${JSON.stringify(e.value)}`);let n=typeof e.value=="string"?e.value:"";switch(t){case"model":this.currentModel=n;break;case"provider":this.currentProvider=n;break;case"apiKey":this.currentApiKey=n;break;case"baseUrl":this.currentBaseUrl=n;break}}async acpHandleSessionSetModel(e,t){this.log(`[acp] session/set_model: ${t} (note: model is managed by ModelRegistry, this is a hint only)`),t&&(this.currentModel=t)}async acpHandleSessionSetMode(e,t){this.log(`[acp] session/set_mode: ${t}`)}acpHandlePermissionResponse(e,t){this.log(`[acp] permission response: ${e} \u2192 ${t}`),this.permissionChecker&&this.permissionChecker.resolveApproval({approvalId:e,decision:t==="allow"?"approved":"denied"})}async acpHandleAbort(e){this.log(`[acp] abort: session=${e.sessionId}`),this.activeTurn&&(this.activeTurn.abort(),this.activeTurn=null)}async acpHandleDream(e){this.log(`[acp] x/dream: session=${e.sessionId}`);let t=this.resolveClientForPurpose("textGeneration");if(!t)return{ok:!1,summary:"No LLM transport configured for dream"};let n=H(),r={jsonrpc:"2.0",id:`acp-dream-${wt().slice(0,8)}`,method:"memory.dream",params:{turnId:`dream-${wt().slice(0,8)}`,sessionId:e.sessionId||this.currentSessionId,config:{memoryRoot:e.config?.memoryRoot||n,transcriptDir:e.config?.transcriptDir||te.join(n,"agent-logs"),model:t.model,apiKey:t.apiKey,...e.config}}};return await Zs.call(this,r),{ok:!0,summary:"Dream consolidation triggered"}}async acpHandleSoloStart(e){this.log("[acp] x/solo.start");let t=Je.call(this),n=await t.start(e);return t.getStatus(n)}async acpHandleSoloStatus(e){this.log("[acp] x/solo.status");let t=e.soloId;if(!t)return this.soloEvaluator?this.soloEvaluator.listSessions():[];let r=Je.call(this).getStatus(t);if(!r)throw new Error(`Solo session ${t} not found`);return r}async acpHandleSoloSelect(e){return this.log("[acp] x/solo.select"),{ok:!0,mergedBranch:await Je.call(this).select(e)}}async acpHandleSoloCancel(e){this.log("[acp] x/solo.cancel");let t=Je.call(this),n=e.soloId;return await t.cancel(n),{ok:!0}}async acpHandleSoloSubscribe(e){return this.log("[acp] x/solo.subscribe"),{ok:!0,soloId:e.soloId}}async acpHandleSoloMessage(e){this.log("[acp] x/solo.message");let t=Je.call(this),{soloId:n,agentId:r,content:s,agentIndex:i}=e;return t.message(n,r,s,i)}async acpHandleSoloEvaluate(e){this.log("[acp] x/solo.evaluate");let t=Je.call(this),{soloId:n,evaluatorAgentId:r,evaluatorIndex:s}=e;return t.triggerEvaluation(n,r,s)}async acpHandleAgentsList(){return this.log("[acp] x/agents.list"),_a()}async acpHandleProductCreate(e){return this.log("[acp] x/product.create"),{productId:await De.call(this).create(e)}}async acpHandleProductPlan(e){return this.log("[acp] x/product.plan"),await Cn.call(this).plan(e)}async acpHandleProductConfirm(e){this.log("[acp] x/product.confirm");let t=Cn.call(this),n=e,r=await t.confirm(n),s=t.getSession(n.productId);return s&&await De.call(this).create({name:s.plan?.name??s.goal.slice(0,50),cwd:s.cwd,instances:n.instances,tasks:n.tasks,budget:n.budget}),r}async acpHandleProductMessage(e){this.log("[acp] x/product.message");let t=Cn.call(this),n=e;return t.message(n.productId,n.content)}async acpHandleProductResume(e){this.log("[acp] x/product.resume");let t=De.call(this),n=e.productId;return await t.resume(n,this.getActiveProjectRoot()),{ok:!0}}async acpHandleProductStatus(e){this.log("[acp] x/product.status");let t=e.productId;if(!this.productOrchestrator)return t?null:[];if(!t)return this.productOrchestrator.list(this.getActiveProjectRoot());let n=this.productOrchestrator.getStatus(t);if(!n)throw new Error(`Product session ${t} not found`);return n}async acpHandleProductPause(e){this.log("[acp] x/product.pause");let t=De.call(this),n=e.productId;return await t.pause(n),{ok:!0}}async acpHandleProductCancel(e){this.log("[acp] x/product.cancel");let t=De.call(this),n=e.productId;return await t.delete(n),{ok:!0}}async acpHandleProductRollback(e){this.log("[acp] x/product.rollback");let t=De.call(this),n=e.productId,r=e.checkpointId??"latest";return await t.rollback(n,r),{ok:!0}}async acpHandleProductSubscribe(e){return this.log("[acp] x/product.subscribe"),{ok:!0,productId:e.productId}}async acpHandleTeamDelegate(e){let t=e.agentType,n=e.prompt,r=e.maxTurns;if(!n)throw new Error("Missing required param: prompt");if(!t)throw new Error("Missing required param: agentType");let s=Ir(t);if(!s)throw new Error(`Unknown agent type: ${t}`);let i=this.resolveClientForPurpose("textGeneration");if(!i)throw new Error("No LLM provider configured \u2014 send a prompt first to configure the model");if(this.log(`[acp] x/team.delegate: agent=${t}, maxTurns=${r??s.maxTurns}`),we.isTeamBudgetExceeded())return{ok:!1,agentType:t,output:void 0,error:we.teamBudgetExceededError(),tokensUsed:0};let a={invoke:async()=>({result:"Tool execution not available in delegated mode"})},l={info:p=>this.log(`[delegate:${t}] ${p}`),warn:p=>this.log(`[delegate:${t}] WARN: ${p}`),error:p=>this.log(`[delegate:${t}] ERROR: ${p}`),debug:p=>this.log(`[delegate:${t}] ${p}`)},c=await Oc({promptMessages:[{role:"user",content:n}],tools:[],transport:i.transport,toolInvoker:a,apiKey:i.apiKey,model:i.model,log:l,forkLabel:`team-delegate-${t}`,maxTurns:r??s.maxTurns,parentSignal:this.activeTurn?.signal,parentDepth:0}),d=c.events.filter(p=>p.type==="end"&&"content"in p).map(p=>p.content??"").join("")||c.events.filter(p=>p.type==="delta"&&"text"in p).map(p=>p.text).join(""),u=c.totalUsage.inputTokens+c.totalUsage.outputTokens;return we.recordForkTokens(u),{ok:c.ok,agentType:t,output:d||void 0,error:c.error,tokensUsed:u}}};an();$n();export{Hn as Agent,sn as ProviderRegistry,Sd as StdioServer,$o as StdioTransport,vo as buildSkillInstruction,cl as createHookRegistry,Eo as createLLMClient,Bw as parseCliArgs};
|