qlogicagent 2.10.6 → 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/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(`
@@ -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 DL}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}:
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 b$,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(`
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 s1={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}
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};