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/cli.js +8 -8
- package/dist/index.js +7 -7
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -12,7 +12,7 @@ var Kk=Object.defineProperty;var hi=(n=>typeof require<"u"?require:typeof Proxy<
|
|
|
12
12
|
${m}`}))}if(l.length===0)return n;let d=[...n],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 Ri(n,e,t=wi){if(e.size===0)return{messages:n,tokensFreed:0,removedCount:0};let o=0,r=0,s=[];for(let a of n){let l=a.tool_call_id??"";if(l&&e.has(l)){o+=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:o,removedCount:r,boundaryMessage:i}}var Nd,Nn,yn,fo,go,Ud,ho,yo,_v,rn,_i=N(()=>{"use strict";Nd=4,Nn=class{constructor(e){this.estimateTokens=e}estimateTokens;compress(e,t){let o=[],r=[];for(let d of e)d.role==="system"?o.push(d):r.push(d);let s=t;for(let d of o)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?[...o,i]:o,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>=Nd)break;if(s-p<0&&l<Nd){a.unshift(u),l++;continue}s-=p,a.unshift(u),l++}let c=[...o];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"}}},yn=class{constructor(e=8e3){this.maxToolResultChars=e}maxToolResultChars;compress(e,t){let o=0;return{messages:e.map(s=>s.role!=="tool"||typeof s.content!="string"||s.content.length<=this.maxToolResultChars?s:(o++,{...s,content:xv(s.content,this.maxToolResultChars)})),droppedCount:o,strategy:"tool-result-trim"}}};fo=class{config;constructor(e){this.config={protectedHeadExchanges:e.protectedHeadExchanges,protectedTailMessages:e.protectedTailMessages,summarize:e.summarize,estimateTokens:e.estimateTokens??wi,taskContext:e.taskContext}}compress(e,t){return{messages:e,droppedCount:0,strategy:"head-tail-protected"}}async compressAsync(e,t){let o=Date.now(),{system:r,nonSystem:s}=Rv(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=$d(p,{taskContext:this.config.taskContext}),f=await this.config.summarize(p,h),y={role:"system",content:`[Conversation summary \u2014 ${p.length} messages compressed]
|
|
13
13
|
|
|
14
14
|
${f}`},b=[...r,...u,y,...m],k=Date.now()-o,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 o=br(e),r=this.config.inner.compress(e,t),s=br(r.messages),i=o!==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 o=br(e),r=bo(this.config.inner)?await this.config.inner.compressAsync(e,t):this.config.inner.compress(e,t),s=br(r.messages),i=o!==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}}}},Ud={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,o=0,r=0,s=0,i=0;for(let a of this.events)t+=a.tokensBefore>0?a.tokensAfter/a.tokensBefore:1,o+=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:o/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}))}};_v=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"]),rn=class{constructor(e=20,t=wi){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 o=e.length-this.preserveRecentCount,r=0,s=0;return{messages:e.map((a,l)=>{if(l>=o||a.role!=="tool"||typeof a.content!="string"||!a.name||!_v.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 Ai(){return{stages:[]}}function Pi(n,e,t){let o=t?.thresholdMessages??40;if(n.filter(a=>a.role!=="system").length<=o)return{messages:n,stagedCount:0};let s=jd(n,e),i=Pv(s,e,o);if(i.length===0)return{messages:s,stagedCount:0};for(let a of i)e.stages.push(a);return s=jd(n,e),{messages:s,stagedCount:i.length}}function Ii(n,e){let t=0;for(let o of e.stages)o.committed||(o.committed=!0,t++);return t===0?{messages:n,committed:0}:{messages:Fd(n,e),committed:t}}function jd(n,e){return e.stages.filter(o=>o.committed).length===0?n:Fd(n,e)}function Fd(n,e){let t=e.stages.filter(r=>r.committed).sort((r,s)=>s.range[0]-r.range[0]),o=[...n];for(let r of t){let[s,i]=r.range;if(s>=o.length)continue;let a=Math.min(i,o.length),l={role:"system",content:r.summary};o.splice(s,a-s,l)}return o}function Pv(n,e,t){let o=Math.max(0,n.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<o;l++){let c=n[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 Bd=N(()=>{"use strict"});function fa(){return{maxRoundsLimit:100,defaultMaxRounds:25,defaultTemperature:0,maxToolBudgetCap:100,defaultToolBudget:Ci,maxConsecutiveFailures:Ei,maxIdenticalCallRepeats:Mi,defaultContextWindowTokens:Oi,responseBufferTokens:Di,defaultMaxOutputTokens:Li,defaultModelMaxOutputTokens:Ni,maxOutputTokensRecoveryLimit:$i,escalatedMaxOutputTokens:Ui,diminishingReturnsThreshold:Sr,diminishingReturnsMinContinuations:ji,defaultMaxResultSizeChars:Fi,maxToolResultsPerMessageChars:Bi,toolResultPreviewBytes:Tr,heartbeatIntervalMs:Wi,max529Retries:Gi,maxApiRetries:$n,persistentRetryMaxBackoffMs:Iv,persistentRetryResetCapMs:Cv,compressionTargetUsageRatio:Ev,compressionMinBudget:Mv,compressionMaxBudget:Ov,reactiveCompactMaxFailures:Dv,reactiveCompactMinMessages:Lv,reactiveCompactTargetPercent:Nv,maxSkillsPerProject:Hi,maxSkillsGlobal:Wd,minToolCallsForSkill:Vi,minDistinctToolsForSkill:Ki,skillCreationCooldownMs:zi,skillInjectionMaxChars:$v,skillInjectionMaxCount:Uv,skillRecallMaxSkills:qi,skillRecallMaxContentChars:Yi,skillRecallCacheTtlMs:Xi,maxForkDepth:Ji,maxSessions:Zi,taskSummaryTurnThreshold:ea,taskSummaryRegenInterval:ta,maxIncludeDepth:na,maxInstructionChars:jv,instructionsMaxFileSize:oa,instructionsMaxDirSize:ra,mediaMaxDownloadSize:sa,mediaMaxUploadSize:Fv,mediaDownloadTimeoutMs:ia,acpMaxSpawnRetries:aa,acpRetryBackoffBase:la,acpRuntimeRestartMax:ca,acpRuntimeRestartBackoffBase:da,taskPollIntervalMs:Bv,taskStoppedDisplayMs:Wv,taskPanelGraceMs:Gv,memoryPrefetchMaxSessionBytes:ua,memoryPrefetchLimitPerRecall:pa,memoryMaxSurfacedEntries:ma,dreamMinIntervalHours:Hv,dreamMinSessions:Vv,dreamScanIntervalMs:Kv,idleDreamMinutes:zv,dreamCooldownMs:qv,dreamMaxDurationMs:Yv,teamBudgetTokens:Qi}}var Ci,Ei,Mi,vr,Oi,Di,Li,Ni,$i,Ui,Sr,ji,Fi,Bi,Tr,Wi,Gi,$n,Iv,Cv,Ev,Mv,Ov,Dv,Lv,Nv,Hi,Wd,Vi,Ki,zi,Gd,Hd,$v,Uv,qi,Yi,Xi,Ji,Qi,Zi,ea,ta,Vd,Kd,na,jv,oa,ra,sa,Fv,ia,aa,la,ca,da,Bv,Wv,Gv,ua,pa,ma,Hv,Vv,Kv,zv,qv,Yv,Ue=N(()=>{"use strict";Ci=Math.min(Math.max(1,Number(process.env.TOOL_LOOP_DEFAULT_BUDGET)||25),100),Ei=3,Mi=2,vr=2,Oi=128e3,Di=13e3,Li=16384,Ni=65536,$i=3,Ui=65536,Sr=500,ji=3,Fi=5e4,Bi=2e5,Tr=2e3,Wi=3e4,Gi=3,$n=2,Iv=3e5,Cv=216e5,Ev=.75,Mv=16e3,Ov=12e4,Dv=3,Lv=4,Nv=50,Hi=20,Wd=50,Vi=3,Ki=2,zi=300*1e3,Gd=3,Hd=720*60*60*1e3,$v=4e3,Uv=5,qi=3,Yi=800,Xi=300*1e3,Ji=4,Qi=0,Zi=50,ea=50,ta=30,Vd=3600*1e3,Kd=200,na=5,jv=4e4,oa=50*1024,ra=500*1024,sa=500*1024*1024,Fv=50*1024*1024,ia=3e5,aa=2,la=3e3,ca=3,da=5e3,Bv=1e3,Wv=3e3,Gv=3e4,ua=60*1024,pa=10,ma=100,Hv=24,Vv=5,Kv=6e5,zv=30,qv=144e5,Yv=3e5});import{existsSync as ga,readFileSync as qd,writeFileSync as Xv,readdirSync as Yd,mkdirSync as Jv}from"node:fs";import{join as ha,dirname as Qv}from"node:path";function Jd(n){return ha(n,".qlogicagent",Zv)}function eS(n){let e=Jd(n);try{return JSON.parse(qd(e,"utf8"))}catch{return{version:1,patterns:{}}}}function zd(n,e){let t=Jd(n);Jv(Qv(t),{recursive:!0}),Xv(t,JSON.stringify(e,null,2),"utf8")}function tS(n){let e=Date.now()-Hd;for(let[t,o]of Object.entries(n.patterns))new Date(o.lastSeen).getTime()<e&&delete n.patterns[t]}function Qd(n,e){if(e.length===0)return!1;let t=wr(e),o=eS(n);tS(o);let r=new Date().toISOString(),s=o.patterns[t];if(s||(s={signature:t,count:0,firstSeen:r,lastSeen:r,promoted:!1},o.patterns[t]=s),s.promoted)return zd(n,o),!1;s.count++,s.lastSeen=r;let i=s.count>=Gd;return i&&(s.promoted=!0),zd(n,o),i}function wr(n){return[...n].sort().join("+")}function nS(n,e){if(!ga(e))return null;let t=wr(n);try{let o=Yd(e,{withFileTypes:!0});for(let r of o){if(!r.isDirectory())continue;let s=ha(e,r.name,"SKILL.md");try{let a=qd(s,"utf8").match(/^tools:\s*\n((?:\s+-\s+\S+\n?)+)/m);if(a){let l=a[1].split(`
|
|
15
|
-
`).map(c=>c.replace(/^\s*-\s*/,"").trim()).filter(Boolean);if(wr(l)===t)return r.name}}catch{}}}catch{}return null}function oS(n){if(!ga(n))return 0;try{return Yd(n,{withFileTypes:!0}).filter(e=>e.isDirectory()&&ga(ha(n,e.name,"SKILL.md"))).length}catch{return 0}}function rS(n,e){return!(!n.ok||n.existingSkillName||!n.multiStep||n.toolCallCount<Vi||n.distinctToolCount<Ki||Date.now()-Xd<zi||e?.projectSkillsDir&&(oS(e.projectSkillsDir)>=Hi||e.tools.length>0&&nS(e.tools,e.projectSkillsDir))||e?.projectRoot&&e.tools.length>0&&!Qd(e.projectRoot,e.tools))}function sS(n){return n.existingSkillName?n.feedback==="negative":!1}function xr(n,e){return sS(n)?{type:"skill.improve",skillName:n.existingSkillName,reason:"negative user feedback on existing skill execution"}:rS(n,e)?(Xd=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:n.toolCallCount}):null}var Xd,Zv,Zd=N(()=>{"use strict";Ue();Xd=0,Zv="skill-patterns.json"});function eu(n){return n.function&&typeof n.function=="object"&&typeof n.function.name=="string"?n.function.name.trim():typeof n.name=="string"?n.name.trim():""}function iS(n){return n==="enabled-eligible"||n==="installed-awaiting-approval"}function aS(n){return new Map((n??[]).map(e=>[e.toolName,e]))}function lS(n){if(!n.eligibility?.length)return[...n.tools];let e=aS(n.eligibility);return n.tools.filter(t=>{let o=eu(t);if(!o)return!1;let r=e.get(o);return!r||iS(r.status)})}function cS(n){let e=[],t=n.compatibility??{},o=n.toolChoice;if(n.thinkingEnabled&&t.requireAutoWhenThinking){let r=typeof o=="object"&&o&&!Array.isArray(o)?String(o.type??""):o;r&&r!=="auto"&&r!=="none"&&(e.push("tool_choice downgraded to auto because thinking mode requires auto/none compatibility."),o="auto")}if(o==="required"&&t.allowRequiredToolChoice===!1){let r=t.requiredFallback??"auto";e.push(`tool_choice=required is not supported by this provider; downgraded to ${r}.`),o=r}if(o&&typeof o=="object"&&!Array.isArray(o)&&o.type==="function"&&t.allowNamedToolChoice===!1){let r=t.namedFallback??"required";e.push(`named tool_choice is not supported by this provider; downgraded to ${r}.`),o=r}return{normalizedToolChoice:o,warnings:e}}function ya(n){let e=cS({toolChoice:n.toolChoice,thinkingEnabled:n.thinkingEnabled,compatibility:n.compatibility}),t=e.normalizedToolChoice,o=[...e.warnings],r=lS({tools:n.tools,eligibility:n.eligibility});if(!t||t==="auto")return{tools:r,normalizedToolChoice:t,warnings:o};if(t==="none")return{tools:[],normalizedToolChoice:"none",warnings:o};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:o}}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=>eu(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:o}}return{tools:r,normalizedToolChoice:t,warnings:o}}var tu=N(()=>{"use strict"});function nu(n){return n==null?[]:typeof n=="string"?n.length>0?[{type:"text",text:n}]:[]:Array.isArray(n)?n:[{type:"text",text:String(n)}]}function pS(n,e){return{...n,content:[...nu(n.content),...nu(e.content)]}}function mS(n){if(!n||typeof n!="object")return!1;if(n.function&&typeof n.function=="object"){let e=n.function.name;if(typeof e=="string"&&e.length>0)return!0}return typeof n.name=="string"&&n.name.length>0}function fS(n){return new Set((n??dS).map(e=>e.trim().toLowerCase()))}function gS(n,e){return n?fS(e).has(n.trim().toLowerCase()):!1}function ba(n){if(!Array.isArray(n)||n.length===0)return[...n];let e=n.map(a=>{if(a.role==="assistant"&&Array.isArray(a.tool_calls)){let l=a.tool_calls.filter(c=>mS(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 o=e.filter(a=>a.role!=="tool"?!0:!!(a.tool_call_id&&t.has(a.tool_call_id))),r=new Set;for(let a of o)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 o){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]=pS(l,a);continue}i.push(a)}return i}function ka(n,e){return gS(e?.stopReason,e?.forcedStopReasons)?n.map(t=>{if(t.role!=="assistant")return{...t};let o={...t};for(let r of uS)delete o[r];return o}):[...n]}function va(n,e){let t=e?.placeholderToolResult??"Error: Tool loop interrupted before the tool result was replayed.",o=new Set;for(let s of n)s.role==="tool"&&typeof s.tool_call_id=="string"&&s.tool_call_id&&o.add(s.tool_call_id);let r=[];for(let s of n)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||o.has(i.id)||(o.add(i.id),r.push({role:"tool",tool_call_id:i.id,content:t}));return r}function Sa(n,e){let t=ba(n),o=ka(t,e);return va(o,e)}var dS,uS,Ta=N(()=>{"use strict";dS=["stop","aborted","timeout","cancelled","interrupted","error"],uS=["tool_calls","toolCalls","function_call","functionCall","raw_tool_calls","rawToolCalls"]});function hS(n){let e=new Set,t=new Set;for(let o of n){if(o.role==="assistant"&&Array.isArray(o.tool_calls))for(let r of o.tool_calls)typeof r.id=="string"&&r.id&&e.add(r.id);o.role==="tool"&&typeof o.tool_call_id=="string"&&o.tool_call_id&&t.add(o.tool_call_id)}return[...e].filter(o=>!t.has(o))}function yS(n){let e=new Set;for(let t of n)t.role==="tool"&&typeof t.tool_call_id=="string"&&t.tool_call_id&&e.add(t.tool_call_id);return[...e]}function bS(n){return{round:n.round??0,maxRounds:n.maxRounds,pendingToolCallIds:[...n.pendingToolCallIds??[]],completedToolCallIds:[...n.completedToolCallIds??[]],lastStopReason:n.lastStopReason,replayMessages:[...n.replayMessages??[]]}}function wa(n,e){return{round:n.round+1,maxRounds:n.maxRounds,pendingToolCallIds:[...e.pendingToolCallIds??n.pendingToolCallIds],completedToolCallIds:[...e.completedToolCallIds??n.completedToolCallIds],lastStopReason:e.lastStopReason??n.lastStopReason,replayMessages:[...e.replayMessages??n.replayMessages]}}function Rr(n,e){return{round:n.round,maxRounds:n.maxRounds,pendingToolCallIds:[],completedToolCallIds:[...e.completedToolCallIds??n.completedToolCallIds],lastStopReason:e.lastStopReason??n.lastStopReason,replayMessages:[...e.replayMessages??n.replayMessages]}}function _r(n){let e=[],t=ba(n.replayMessages);t.length!==n.replayMessages.length&&e.push({kind:"drop-orphan-tool-result",detail:"Removed orphan tool results or invalid assistant tool calls."});let o=ka(t,n.options);o.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=va(o,n.options);return r.length>o.length&&e.push({kind:"inject-placeholder-tool-result",detail:"Injected placeholder tool result for pending tool calls."}),{state:bS({maxRounds:n.maxRounds,round:n.round,lastStopReason:n.lastStopReason,replayMessages:r,pendingToolCallIds:hS(r),completedToolCallIds:yS(r)}),recoveryActions:e}}var ou=N(()=>{"use strict";Ta()});function xa(n){return n?kS.has(n):!0}function Ra(n){return n===429||n===529}function Ar(n,e=500,t=32e3){let o=Math.min(e*Math.pow(2,n-1),t);return o+Math.floor(Math.random()*o*.25)}function Pr(){let n=process.env.QLOGICAGENT_PERSISTENT_RETRY;return n==="1"||n==="true"}var kS,RM,vo,ru=N(()=>{"use strict";kS=new Set(["main","sdk","agent","compact","hook","verification","side_question"]);RM={maxBackoffMs:300*1e3,resetCapMs:360*60*1e3,heartbeatIntervalMs:3e4};vo=class extends Error{constructor(t,o){super(`Model fallback triggered: ${t} -> ${o}`);this.originalModel=t;this.fallbackModel=o;this.name="FallbackTriggeredError"}originalModel;fallbackModel}});function _a(n,e){if(e.allowedTools&&e.allowedTools.length>0){let t=new Set(e.allowedTools);return n.filter(o=>t.has(o))}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 n.filter(o=>!t.has(o))}return e.canFork?[...n]:n.filter(t=>t!=="agent")}var Aa=N(()=>{"use strict";Ue()});function Pa(){return[...su]}function Ir(n){return su.find(e=>e.name===n)}var vS,SS,TS,wS,xS,RS,su,Ia=N(()=>{"use strict";vS={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},SS={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},TS={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},wS={name:"code",label:"Code",description:"A coding sub-agent with full tool access for implementation tasks.",maxTurns:200,toolAccessMode:"full",canFork:!0},xS={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},RS={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},su=[vS,SS,TS,wS,xS,RS]});var iu=N(()=>{"use strict"});function Ca(n){return{promptTokens:0,hasAttemptedReactiveCompact:!1,currentMaxOutputTokens:n.maxOutputTokens,consecutiveTruncations:0,aborted:n.abortSignal?.aborted??!1}}function Ea(n,e){if(n.aborted)return{level:"blocking",usagePercent:100,reason:"budget_exhausted"};let t=e.contextWindowTokens-e.responseBufferTokens-n.currentMaxOutputTokens,o=t>0?n.promptTokens/t*100:100;return n.promptTokens>=t?n.hasAttemptedReactiveCompact||!e.reactiveCompactEnabled?{level:"blocking",usagePercent:o,reason:"prompt_too_long"}:{level:"blocking",usagePercent:o,reason:"prompt_too_long"}:o>=85?{level:"warning",usagePercent:o,remainingTokens:t-n.promptTokens}:{level:"ok"}}function Ma(n,e,t){let o=n.message?.toLowerCase()??"",r=n.status??0;return r===413||o.includes("prompt_too_long")||o.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:o||"unknown_error"}}function Oa(n,e,t){if(!e.outputEscalationEnabled)return{shouldEscalate:!1,newMax:n.currentMaxOutputTokens};if(n.consecutiveTruncations>=3)return{shouldEscalate:!1,newMax:n.currentMaxOutputTokens};let o=Math.min(n.currentMaxOutputTokens*2,t);return o<=n.currentMaxOutputTokens?{shouldEscalate:!1,newMax:n.currentMaxOutputTokens}:{shouldEscalate:!0,newMax:o}}function Da(n,e){return n.aborted?!0:e.abortSignal?.aborted?(n.aborted=!0,!0):!1}var au=N(()=>{"use strict"});function La(){return{consecutiveFailures:0,attemptedThisTurn:!1,lastCompactAt:null,toolsAtLastCompact:[]}}function Un(n,e=_S){return!(n.attemptedThisTurn||n.consecutiveFailures>=e.maxConsecutiveFailures)}var _S,lu=N(()=>{"use strict";_S={maxConsecutiveFailures:3,minMessagesAfterCompact:4,targetUsagePercent:50}});var So=N(()=>{"use strict";_d();Ld();_i();_i();Bd();Zd();tu();Ta();ou();ru();Aa();Ia();iu();au();lu()});function Na(n,e){let t=n.get(e.index);t||(t={id:"",name:"",arguments:""},n.set(e.index,t)),e.id&&(t.id=e.id),e.name&&(t.name+=e.name),t.arguments+=e.arguments}var cu=N(()=>{"use strict"});var du=N(()=>{"use strict"});var uu=N(()=>{"use strict"});function Cr(n){return typeof n.deleteVideoTask=="function"&&typeof n.listVideoTasks=="function"}var pu=N(()=>{"use strict"});function mu(n){let e=n.usage??n.data?.usage,t=sn(e?.completion_tokens)??sn(e?.completionTokens)??sn(e?.output_tokens)??sn(e?.outputTokens)??sn(e?.total_tokens)??sn(e?.totalTokens)??0,o=sn(e?.total_tokens)??sn(e?.totalTokens)??t;return{completionTokens:t,totalTokens:o,hasUsage:!!e,rawUsage:e}}function sn(n){if(typeof n=="number"&&Number.isFinite(n))return n;if(typeof n=="string"&&n.trim()){let e=Number(n);if(Number.isFinite(e))return e}}var ut,Er=N(()=>{"use strict";ut=class{supportedTypes=["image","video","3d","embedding"];baseUrl;timeoutMs;constructor(e){this.baseUrl=e.baseUrl.replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??18e4}async generate(e,t,o){switch(e.mediaType){case"image":return this.generateImage(e,t,o);case"video":return this.generateVideo(e,t,o);case"3d":return this.generate3D(e,t,o);case"embedding":return this.generateEmbedding(e,t,o);default:throw new Error(`VolcengineMediaTransport: unsupported mediaType "${e.mediaType}"`)}}async generateEmbedding(e,t,o){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:o??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,o){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:o??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,o){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
|
+
`).map(c=>c.replace(/^\s*-\s*/,"").trim()).filter(Boolean);if(wr(l)===t)return r.name}}catch{}}}catch{}return null}function oS(n){if(!ga(n))return 0;try{return Yd(n,{withFileTypes:!0}).filter(e=>e.isDirectory()&&ga(ha(n,e.name,"SKILL.md"))).length}catch{return 0}}function rS(n,e){return!(!n.ok||n.existingSkillName||!n.multiStep||n.toolCallCount<Vi||n.distinctToolCount<Ki||Date.now()-Xd<zi||e?.projectSkillsDir&&(oS(e.projectSkillsDir)>=Hi||e.tools.length>0&&nS(e.tools,e.projectSkillsDir))||e?.projectRoot&&e.tools.length>0&&!Qd(e.projectRoot,e.tools))}function sS(n){return n.existingSkillName?n.feedback==="negative":!1}function xr(n,e){return sS(n)?{type:"skill.improve",skillName:n.existingSkillName,reason:"negative user feedback on existing skill execution"}:rS(n,e)?(Xd=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:n.toolCallCount}):null}var Xd,Zv,Zd=N(()=>{"use strict";Ue();Xd=0,Zv="skill-patterns.json"});function eu(n){return n.function&&typeof n.function=="object"&&typeof n.function.name=="string"?n.function.name.trim():typeof n.name=="string"?n.name.trim():""}function iS(n){return n==="enabled-eligible"||n==="installed-awaiting-approval"}function aS(n){return new Map((n??[]).map(e=>[e.toolName,e]))}function lS(n){if(!n.eligibility?.length)return[...n.tools];let e=aS(n.eligibility);return n.tools.filter(t=>{let o=eu(t);if(!o)return!1;let r=e.get(o);return!r||iS(r.status)})}function cS(n){let e=[],t=n.compatibility??{},o=n.toolChoice;if(n.thinkingEnabled&&t.requireAutoWhenThinking){let r=typeof o=="object"&&o&&!Array.isArray(o)?String(o.type??""):o;r&&r!=="auto"&&r!=="none"&&(e.push("tool_choice downgraded to auto because thinking mode requires auto/none compatibility."),o="auto")}if(o==="required"&&t.allowRequiredToolChoice===!1){let r=t.requiredFallback??"auto";e.push(`tool_choice=required is not supported by this provider; downgraded to ${r}.`),o=r}if(o&&typeof o=="object"&&!Array.isArray(o)&&o.type==="function"&&t.allowNamedToolChoice===!1){let r=t.namedFallback??"required";e.push(`named tool_choice is not supported by this provider; downgraded to ${r}.`),o=r}return{normalizedToolChoice:o,warnings:e}}function ya(n){let e=cS({toolChoice:n.toolChoice,thinkingEnabled:n.thinkingEnabled,compatibility:n.compatibility}),t=e.normalizedToolChoice,o=[...e.warnings],r=lS({tools:n.tools,eligibility:n.eligibility});if(!t||t==="auto")return{tools:r,normalizedToolChoice:t,warnings:o};if(t==="none")return{tools:[],normalizedToolChoice:"none",warnings:o};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:o}}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=>eu(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:o}}return{tools:r,normalizedToolChoice:t,warnings:o}}var tu=N(()=>{"use strict"});function nu(n){return n==null?[]:typeof n=="string"?n.length>0?[{type:"text",text:n}]:[]:Array.isArray(n)?n:[{type:"text",text:String(n)}]}function pS(n,e){return{...n,content:[...nu(n.content),...nu(e.content)]}}function mS(n){if(!n||typeof n!="object")return!1;if(n.function&&typeof n.function=="object"){let e=n.function.name;if(typeof e=="string"&&e.length>0)return!0}return typeof n.name=="string"&&n.name.length>0}function fS(n){return new Set((n??dS).map(e=>e.trim().toLowerCase()))}function gS(n,e){return n?fS(e).has(n.trim().toLowerCase()):!1}function ba(n){if(!Array.isArray(n)||n.length===0)return[...n];let e=n.map(a=>{if(a.role==="assistant"&&Array.isArray(a.tool_calls)){let l=a.tool_calls.filter(c=>mS(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 o=e.filter(a=>a.role!=="tool"?!0:!!(a.tool_call_id&&t.has(a.tool_call_id))),r=new Set;for(let a of o)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 o){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]=pS(l,a);continue}i.push(a)}return i}function ka(n,e){return gS(e?.stopReason,e?.forcedStopReasons)?n.map(t=>{if(t.role!=="assistant")return{...t};let o={...t};for(let r of uS)delete o[r];return o}):[...n]}function va(n,e){let t=e?.placeholderToolResult??"Error: Tool loop interrupted before the tool result was replayed.",o=new Set;for(let s of n)s.role==="tool"&&typeof s.tool_call_id=="string"&&s.tool_call_id&&o.add(s.tool_call_id);let r=[];for(let s of n)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||o.has(i.id)||(o.add(i.id),r.push({role:"tool",tool_call_id:i.id,content:t}));return r}function Sa(n,e){let t=ba(n),o=ka(t,e);return va(o,e)}var dS,uS,Ta=N(()=>{"use strict";dS=["stop","aborted","timeout","cancelled","interrupted","error"],uS=["tool_calls","toolCalls","function_call","functionCall","raw_tool_calls","rawToolCalls"]});function hS(n){let e=new Set,t=new Set;for(let o of n){if(o.role==="assistant"&&Array.isArray(o.tool_calls))for(let r of o.tool_calls)typeof r.id=="string"&&r.id&&e.add(r.id);o.role==="tool"&&typeof o.tool_call_id=="string"&&o.tool_call_id&&t.add(o.tool_call_id)}return[...e].filter(o=>!t.has(o))}function yS(n){let e=new Set;for(let t of n)t.role==="tool"&&typeof t.tool_call_id=="string"&&t.tool_call_id&&e.add(t.tool_call_id);return[...e]}function bS(n){return{round:n.round??0,maxRounds:n.maxRounds,pendingToolCallIds:[...n.pendingToolCallIds??[]],completedToolCallIds:[...n.completedToolCallIds??[]],lastStopReason:n.lastStopReason,replayMessages:[...n.replayMessages??[]]}}function wa(n,e){return{round:n.round+1,maxRounds:n.maxRounds,pendingToolCallIds:[...e.pendingToolCallIds??n.pendingToolCallIds],completedToolCallIds:[...e.completedToolCallIds??n.completedToolCallIds],lastStopReason:e.lastStopReason??n.lastStopReason,replayMessages:[...e.replayMessages??n.replayMessages]}}function Rr(n,e){return{round:n.round,maxRounds:n.maxRounds,pendingToolCallIds:[],completedToolCallIds:[...e.completedToolCallIds??n.completedToolCallIds],lastStopReason:e.lastStopReason??n.lastStopReason,replayMessages:[...e.replayMessages??n.replayMessages]}}function _r(n){let e=[],t=ba(n.replayMessages);t.length!==n.replayMessages.length&&e.push({kind:"drop-orphan-tool-result",detail:"Removed orphan tool results or invalid assistant tool calls."});let o=ka(t,n.options);o.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=va(o,n.options);return r.length>o.length&&e.push({kind:"inject-placeholder-tool-result",detail:"Injected placeholder tool result for pending tool calls."}),{state:bS({maxRounds:n.maxRounds,round:n.round,lastStopReason:n.lastStopReason,replayMessages:r,pendingToolCallIds:hS(r),completedToolCallIds:yS(r)}),recoveryActions:e}}var ou=N(()=>{"use strict";Ta()});function xa(n){return n?kS.has(n):!0}function Ra(n){return n===429||n===529}function Ar(n,e=500,t=32e3){let o=Math.min(e*Math.pow(2,n-1),t);return o+Math.floor(Math.random()*o*.25)}function Pr(){let n=process.env.QLOGICAGENT_PERSISTENT_RETRY;return n==="1"||n==="true"}var kS,_M,vo,ru=N(()=>{"use strict";kS=new Set(["main","sdk","agent","compact","hook","verification","side_question"]);_M={maxBackoffMs:300*1e3,resetCapMs:360*60*1e3,heartbeatIntervalMs:3e4};vo=class extends Error{constructor(t,o){super(`Model fallback triggered: ${t} -> ${o}`);this.originalModel=t;this.fallbackModel=o;this.name="FallbackTriggeredError"}originalModel;fallbackModel}});function _a(n,e){if(e.allowedTools&&e.allowedTools.length>0){let t=new Set(e.allowedTools);return n.filter(o=>t.has(o))}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 n.filter(o=>!t.has(o))}return e.canFork?[...n]:n.filter(t=>t!=="agent")}var Aa=N(()=>{"use strict";Ue()});function Pa(){return[...su]}function Ir(n){return su.find(e=>e.name===n)}var vS,SS,TS,wS,xS,RS,su,Ia=N(()=>{"use strict";vS={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},SS={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},TS={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},wS={name:"code",label:"Code",description:"A coding sub-agent with full tool access for implementation tasks.",maxTurns:200,toolAccessMode:"full",canFork:!0},xS={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},RS={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},su=[vS,SS,TS,wS,xS,RS]});var iu=N(()=>{"use strict"});function Ca(n){return{promptTokens:0,hasAttemptedReactiveCompact:!1,currentMaxOutputTokens:n.maxOutputTokens,consecutiveTruncations:0,aborted:n.abortSignal?.aborted??!1}}function Ea(n,e){if(n.aborted)return{level:"blocking",usagePercent:100,reason:"budget_exhausted"};let t=e.contextWindowTokens-e.responseBufferTokens-n.currentMaxOutputTokens,o=t>0?n.promptTokens/t*100:100;return n.promptTokens>=t?n.hasAttemptedReactiveCompact||!e.reactiveCompactEnabled?{level:"blocking",usagePercent:o,reason:"prompt_too_long"}:{level:"blocking",usagePercent:o,reason:"prompt_too_long"}:o>=85?{level:"warning",usagePercent:o,remainingTokens:t-n.promptTokens}:{level:"ok"}}function Ma(n,e,t){let o=n.message?.toLowerCase()??"",r=n.status??0;return r===413||o.includes("prompt_too_long")||o.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:o||"unknown_error"}}function Oa(n,e,t){if(!e.outputEscalationEnabled)return{shouldEscalate:!1,newMax:n.currentMaxOutputTokens};if(n.consecutiveTruncations>=3)return{shouldEscalate:!1,newMax:n.currentMaxOutputTokens};let o=Math.min(n.currentMaxOutputTokens*2,t);return o<=n.currentMaxOutputTokens?{shouldEscalate:!1,newMax:n.currentMaxOutputTokens}:{shouldEscalate:!0,newMax:o}}function Da(n,e){return n.aborted?!0:e.abortSignal?.aborted?(n.aborted=!0,!0):!1}var au=N(()=>{"use strict"});function La(){return{consecutiveFailures:0,attemptedThisTurn:!1,lastCompactAt:null,toolsAtLastCompact:[]}}function Un(n,e=_S){return!(n.attemptedThisTurn||n.consecutiveFailures>=e.maxConsecutiveFailures)}var _S,lu=N(()=>{"use strict";_S={maxConsecutiveFailures:3,minMessagesAfterCompact:4,targetUsagePercent:50}});var So=N(()=>{"use strict";_d();Ld();_i();_i();Bd();Zd();tu();Ta();ou();ru();Aa();Ia();iu();au();lu()});function Na(n,e){let t=n.get(e.index);t||(t={id:"",name:"",arguments:""},n.set(e.index,t)),e.id&&(t.id=e.id),e.name&&(t.name+=e.name),t.arguments+=e.arguments}var cu=N(()=>{"use strict"});var du=N(()=>{"use strict"});var uu=N(()=>{"use strict"});function Cr(n){return typeof n.deleteVideoTask=="function"&&typeof n.listVideoTasks=="function"}var pu=N(()=>{"use strict"});function mu(n){let e=n.usage??n.data?.usage,t=sn(e?.completion_tokens)??sn(e?.completionTokens)??sn(e?.output_tokens)??sn(e?.outputTokens)??sn(e?.total_tokens)??sn(e?.totalTokens)??0,o=sn(e?.total_tokens)??sn(e?.totalTokens)??t;return{completionTokens:t,totalTokens:o,hasUsage:!!e,rawUsage:e}}function sn(n){if(typeof n=="number"&&Number.isFinite(n))return n;if(typeof n=="string"&&n.trim()){let e=Number(n);if(Number.isFinite(e))return e}}var ut,Er=N(()=>{"use strict";ut=class{supportedTypes=["image","video","3d","embedding"];baseUrl;timeoutMs;constructor(e){this.baseUrl=e.baseUrl.replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??18e4}async generate(e,t,o){switch(e.mediaType){case"image":return this.generateImage(e,t,o);case"video":return this.generateVideo(e,t,o);case"3d":return this.generate3D(e,t,o);case"embedding":return this.generateEmbedding(e,t,o);default:throw new Error(`VolcengineMediaTransport: unsupported mediaType "${e.mediaType}"`)}}async generateEmbedding(e,t,o){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:o??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,o){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:o??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,o){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(`
|
|
16
16
|
`))!==-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()-o,billingUnit:"per_call",billingQuantity:1,metadata:{billableUnits:{images:1},pricingSpec:t.size??"1024x1024"}}}async generateVideo(e,t,o){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,o),m=await this.pollTask(`${this.baseUrl}/v3/contents/generations/tasks/${p}`,t,o,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=mu(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,o){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,o),d=await this.pollTask(`${this.baseUrl}/v3/contents/generations/tasks/${c}`,t,o,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=mu(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,o){let r=`${this.baseUrl}/v3/contents/generations/tasks/${e}`,s=await fetch(r,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:o??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,o){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:o??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,o){let r=`${this.baseUrl}/v3/contents/generations/tasks/${e}`,s=await fetch(r,{method:"DELETE",headers:{Authorization:`Bearer ${t}`},signal:o??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,o,r){let s=`${this.baseUrl}/v3/files`,i=new FormData;i.append("file",e instanceof Blob?e:new Blob([e]),o?.filename??"upload"),i.append("purpose",o?.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,o){let r=`${this.baseUrl}/v3/files/${e}`,s=await fetch(r,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:o??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,o){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:o??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,o){let r=`${this.baseUrl}/v3/files/${e}`,s=await fetch(r,{method:"DELETE",headers:{Authorization:`Bearer ${t}`},signal:o??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,o,r){let s=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${o}`},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,o,r,s){let i=Date.now()+6e5,a=0;for(;Date.now()<i;){o?.throwIfAborted();let l=await fetch(e,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:o??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 $a}from"node:path";import{homedir as PS,tmpdir as IS}from"node:os";function fu(){return process.env.QLOGICAGENT_HOME??$a(PS()||IS(),".qlogicagent")}function Bt(){return process.env.QLOGICAGENT_CACHE_DIR??$a(fu(),"cache")}function gu(){return process.env.QLOGICAGENT_DEBUG_LOG_DIR??$a(fu(),"debug-logs")}var jn=N(()=>{"use strict"});import{writeFileSync as CS,mkdirSync as ES}from"node:fs";import{join as hu}from"node:path";import{randomUUID as MS}from"node:crypto";var OS,To,Ua=N(()=>{"use strict";jn();OS=18e4,To=class{supportedTypes=["image","tts"];baseUrl;timeoutMs;constructor(e){this.baseUrl=e.baseUrl.replace(/\/+$/,""),this.timeoutMs=e.timeoutMs??OS}async generate(e,t,o){switch(e.mediaType){case"image":return this.generateImage(e,t,o);case"tts":return this.generateTTS(e,t,o);default:throw new Error(`OpenAIMediaTransport: unsupported mediaType "${e.mediaType}"`)}}async generateImage(e,t,o){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:o??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,o){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:o??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=hu(Bt(),"tts");ES(d,{recursive:!0});let u=`openai-tts-${MS()}.mp3`,p=hu(d,u);return CS(p,c),{mediaUrls:[`file://${p}`],model:e.model||"tts-1",durationMs:Date.now()-r,billingUnit:"per_character",billingQuantity:s.length}}}});var bn,Mr=N(()=>{"use strict";bn=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,o){switch(e.mediaType){case"music":return this.generateMusic(e,t,o);case"video":return this.generateVideo(e,t,o);case"tts":return this.generateTTS(e,t,o);default:throw new Error(`MiniMaxMediaTransport: unsupported mediaType "${e.mediaType}"`)}}async generateTTS(e,t,o){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:o??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,o){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:o??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,o,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,o,r,s){let i=Date.now()+6e5;for(;Date.now()<i;){o?.throwIfAborted();let a=await fetch(e,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:o??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,o){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:o??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,o){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:o??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,o,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,o,r){let s=Date.now()+6e5;for(;Date.now()<s;){o?.throwIfAborted();let i=`${this.baseUrl}/v1/query/video_generation?task_id=${encodeURIComponent(e)}`,a=await fetch(i,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:o??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,o)}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,o){let r=`${this.baseUrl}/v1/files/retrieve?file_id=${encodeURIComponent(e)}`,s=await fetch(r,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:o??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,o){let r=`${this.baseUrl}/v1/query/video_generation?task_id=${encodeURIComponent(e)}`,s=await fetch(r,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:o??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,o){return{data:[]}}async deleteVideoTask(e,t,o){throw new Error("MiniMax does not support video task cancellation.")}}});import{writeFileSync as DS,mkdirSync as LS}from"node:fs";import{join as yu}from"node:path";import{randomUUID as NS}from"node:crypto";async function ja(n,e,t){let o=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(n,{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()+o*1e3,c=500;for(;Date.now()<l;){if(t.signal?.throwIfAborted(),a)throw a;if(!s.connected)break;let f=Date.now()-r,y=o*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=$S(d,48e3,2,16),p=yu(Bt(),"gemini-music-realtime");LS(p,{recursive:!0});let m=`lyria-rt-${NS()}.wav`,h=yu(p,m);return DS(h,u),t.onProgress?.(100,"completed"),{filePath:`file://${h}`,durationMs:Date.now()-r}}finally{s.close()}}function $S(n,e,t,o){let r=e*t*(o/8),s=t*(o/8),i=n.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(o,32),a.write("data",36),a.writeUInt32LE(i,40),Buffer.concat([a,n])}var Or,Fa=N(()=>{"use strict";jn();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(/\/+$/,""),o=new URL(t).origin.replace(/^http/,"ws");this.wsUrl=`${o}/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 o=`${this.wsUrl}?key=${encodeURIComponent(e)}`,r=new WebSocket(o);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 o=t.serverContent;if(!o)return;let r=o.audioChunks;if(r&&this.onAudioChunk)for(let i of r)i.data&&this.onAudioChunk({data:Buffer.from(i.data,"base64")});let s=o.filteredPrompt;s&&this.onFilteredPrompt?.(s)}}});import{writeFileSync as bu,mkdirSync as ku}from"node:fs";import{join as Dr}from"node:path";import{randomUUID as vu}from"node:crypto";function FS(n,e,t,o){let r=e*t*(o/8),s=t*(o/8),i=n.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(o,32),a.write("data",36),a.writeUInt32LE(i,40),Buffer.concat([a,n])}var US,jS,Ba,wo,Wa=N(()=>{"use strict";jn();Fa();US=18e4,jS=1e4,Ba=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??US}async generate(e,t,o){switch(e.mediaType){case"image":return this.generateImage(e,t,o);case"video":return this.generateVideo(e,t,o);case"music":return this.generateMusic(e,t,o);case"music_realtime":return this.generateMusicRealtime(e,t,o);case"tts":return this.generateTTS(e,t,o);case"embedding":return this.generateEmbedding(e,t,o);default:throw new Error(`GeminiMediaTransport: unsupported mediaType "${e.mediaType}"`)}}async deleteVideoTask(e,t,o){throw new Error("Gemini does not support deleting video generation tasks")}async listVideoTasks(e,t,o){return{data:[]}}async getTaskStatus(e,t,o){let r=`${this.apiBase}/${e}`,s=await fetch(r,{method:"GET",headers:{"x-goog-api-key":t},signal:o??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,o){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,o);return{mediaUrls:this.extractInlineImages(l),model:e.model,durationMs:Date.now()-r}}async generateVideo(e,t,o){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,o)).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,o,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,o){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,o);return{mediaUrls:this.extractInlineAudio(c,"gemini-music"),model:e.model,durationMs:Date.now()-r}}async generateMusicRealtime(e,t,o){let r=await ja(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:o,onProgress:e.onProgress});return{mediaUrls:[r.filePath],model:e.model,durationMs:r.durationMs}}async generateTTS(e,t,o){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,o);return{mediaUrls:this.extractInlineAudio(l,"gemini-tts"),model:e.model,durationMs:Date.now()-r}}async generateEmbedding(e,t,o){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,o),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,o,r){let s=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json","x-goog-api-key":o},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,o,r,s){let i=Date.now()+Ba;for(;Date.now()<i;){o?.throwIfAborted();let a=`${this.apiBase}/${e}`,l=await fetch(a,{method:"GET",headers:{"x-goog-api-key":t},signal:o??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-Ba),u=Math.min(95,Math.round(d/Ba*100));r?.(u,"running",s),await new Promise(p=>setTimeout(p,jS))}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 o=Buffer.from(await t.arrayBuffer());return{mimeType:t.headers.get("content-type")??"image/png",data:o.toString("base64")}}extractInlineImages(e){let t=[],o=Dr(Bt(),"gemini-images");ku(o,{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-${vu()}.${i}`,l=Dr(o,a);bu(l,Buffer.from(s.inlineData.data,"base64")),t.push(`file://${l}`)}return t}extractInlineAudio(e,t){let o=[],r=Dr(Bt(),t);ku(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"?FS(l,24e3,1,16):l,d=`gemini-${vu()}.${a==="pcm"?"wav":a}`,u=Dr(r,d);bu(u,c),o.push(`file://${u}`)}return o}}});function BS(n){return new Promise(e=>setTimeout(e,n))}var Lr,Su=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,o){if(e.mediaType==="video")return this.generateVideo(e,t,o);if(e.mediaType==="embedding")return this.generateEmbedding(e,t,o);if(e.mediaType==="rerank")return this.generateRerank(e,t,o);if(e.mediaType!=="tts")throw new Error(`QwenMediaTransport: unsupported mediaType "${e.mediaType}"`);return this.generateTTS(e,t,o)}async generateTTS(e,t,o){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,o,r,s):this.generateQwenTTS(e,t,o,r,s)}async generateQwenTTS(e,t,o,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:o??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,o,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:o??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,o){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:o??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,o){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:o??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,o,r,s=12e4){let i=Date.now()+s,a=`${this.baseUrl}/api/v1/tasks/${e}`;for(;Date.now()<i;){o?.throwIfAborted(),await BS(2e3);let l=await fetch(a,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:o??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,o){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:o??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,o,e.onProgress,6e5),model:s,durationMs:Date.now()-r,taskId:p}}async getTaskStatus(e,t,o){let r=`${this.baseUrl}/api/v1/tasks/${e}`,s=await fetch(r,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:o??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,o){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:o??AbortSignal.timeout(this.timeoutMs)});return i.ok?await i.json():{data:[]}}async deleteVideoTask(e,t,o){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 WS,mkdirSync as GS}from"node:fs";import{join as Tu}from"node:path";import{randomUUID as HS}from"node:crypto";function qS(n,e){return/^(https?:|data:)/i.test(n)?n:`data:${typeof e?.mimeType=="string"?e.mimeType:"application/pdf"};base64,${n}`}var VS,KS,Nr,zS,xo,wu=N(()=>{"use strict";jn();VS=18e4,KS=3e3,Nr=6e5,zS=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??VS}async generate(e,t,o){switch(e.mediaType){case"image":return this.generateImage(e,t,o);case"video":return this.generateVideo(e,t,o);case"tts":return this.generateTTS(e,t,o);case"stt":return this.generateSTT(e,t,o);case"embedding":return this.generateEmbedding(e,t,o);case"voice_clone":return this.generateVoiceClone(e,t,o);case"document_parsing":return this.generateDocumentParsing(e,t,o);case"rerank":return this.generateRerank(e,t,o);default:throw new Error(`ZhipuMediaTransport: unsupported mediaType "${e.mediaType}"`)}}async generateImage(e,t,o){return zS.has(e.model)?this.generateImageAsync(e,t,o):this.generateImageSync(e,t,o)}async generateImageSync(e,t,o){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,o)).data??[]).map(d=>d.url).filter(d=>!!d),model:e.model,size:e.size,durationMs:Date.now()-r}}async generateImageAsync(e,t,o){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,o)).id;if(!l)throw new Error("Zhipu async image: no task id in response");return{mediaUrls:((await this.pollAsyncResult(l,t,o,e.onProgress)).data??[]).map(p=>p.url).filter(p=>!!p),model:e.model,size:e.size,durationMs:Date.now()-r}}async generateVideo(e,t,o){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,o)).id;if(!l)throw new Error("Zhipu video generation: no task id in response");return{mediaUrls:((await this.pollAsyncResult(l,t,o,e.onProgress)).video_result??[]).map(p=>p.url).filter(p=>!!p),model:e.model,durationMs:Date.now()-r}}async generateTTS(e,t,o){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:o??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=Tu(Bt(),"tts");GS(d,{recursive:!0});let u=e.audioFormat??"wav",p=`zhipu-tts-${HS()}.${u}`,m=Tu(d,p);return WS(m,c),{mediaUrls:[`file://${m}`],model:e.model||"glm-tts",durationMs:Date.now()-r,billingUnit:"per_character",billingQuantity:s.length}}async generateSTT(e,t,o){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:o??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:o??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,o){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,o)).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,o){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:o??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:o??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,o);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,o){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:qS(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,o);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,o){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,o);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,o,r){let s=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${o}`},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,o,r){let s=Date.now()+Nr,i=`${this.baseUrl}/async-result/${encodeURIComponent(e)}`;for(;Date.now()<s;){o?.throwIfAborted();let a=await fetch(i,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:o??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,KS))}throw new Error(`Zhipu async task timed out after ${Nr/1e3}s`)}async getTaskStatus(e,t,o){let r=`${this.baseUrl}/async-result/${encodeURIComponent(e)}`,s=await fetch(r,{method:"GET",headers:{Authorization:`Bearer ${t}`},signal:o??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,o){return{data:[]}}async deleteVideoTask(e,t,o){throw new Error("Zhipu does not support task cancellation. Tasks complete or timeout automatically.")}async listVoices(e,t){let o=`${this.baseUrl}/voice/list`,r=await fetch(o,{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,o){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:o??AbortSignal.timeout(this.timeoutMs)});if(!s.ok){let i=await s.text().catch(()=>"");throw new Error(`Zhipu voice delete error ${s.status}: ${i}`)}}}});function YS(n){switch(n.mediaType){case"video":return n.operation==="merge"?"merge":n.operation==="upscale"?"upscale":n.operation==="edit"?"edit":n.imageUrl?"img2video":"text2video";case"image":return n.operation==="edit"?"inpainting":n.imageUrl?"img2img":"text2image";case"music":return n.audioUrl?"cover":"text2music";case"music_realtime":return"realtime";case"tts":return"text2speech";case"3d":return n.imageUrl?"img2_3d":"text2_3d";default:return}}function XS(n,e){return!("operations"in n)||!n.operations?!0:n.operations.includes(e)}function JS(n){let e=n.baseUrl;switch(n.id){case"volcengine":return new ut({baseUrl:e});case"openai":return new To({baseUrl:e});case"minimax":return new bn({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,xu=N(()=>{"use strict";Er();Ua();Mr();Wa();Su();wu();Ro=class{registry;transports=new Map;constructor(e){this.registry=e.registry}resolveModelById(e,t,o){let r=this.registry.getProvider(e);if(!r)return;let i=this.registry.listModels(e).find(a=>a.id===t&&a.mediaType===o);if(i)return{providerId:e,providerDef:r,modelInfo:i,mediaType:o}}getTransport(e){let t=this.transports.get(e);if(t)return t;let o=this.registry.getProvider(e);if(!o)return;let r=JS(o);if(r)return this.transports.set(e,r),r}listMediaModels(e){let t=[];for(let o of this.registry.listProviders()){let r=this.registry.listModels(o.id);for(let s of r)s.mediaType&&(!e||s.mediaType===e)&&t.push({providerId:o.id,providerDef:o,modelInfo:s,mediaType:s.mediaType})}return t}findModelInProvider(e,t,o){let r=this.registry.getProvider(e);if(!r)return;let s=this.registry.listModels(e),i=o?YS(o):void 0,a=s.find(l=>l.mediaType!==t?!1:!i||!l.mediaCapabilities?!0:XS(l.mediaCapabilities,i));if(a)return{providerId:e,providerDef:r,modelInfo:a,mediaType:t}}}});var Ga,Ha=N(()=>{"use strict";Ga=[{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 QS,kn,Ru=N(()=>{"use strict";Ha();QS={claude:"anthropic",gemini:"google",doubao:"volcengine"},kn=class{builtins=new Map;overrides=new Map;constructor(){for(let e of Ga)this.builtins.set(e.id,e)}applyOverride(e,t){this.overrides.set(e,{...this.overrides.get(e),...t})}getProvider(e){let t=QS[e]??e,o=this.builtins.get(t),r=this.overrides.get(t);if(!(!o&&!r))return!o&&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}:o&&!r?o:{...o,...r,models:r.models??o.models}}listProviders(){let e=new Map;for(let[t,o]of this.builtins)e.set(t,o);for(let[t]of this.overrides){let o=this.getProvider(t);o&&e.set(t,o)}return[...e.values()]}listModels(e){return this.getProvider(e)?.models??[]}getModelInfo(e,t){return this.listModels(e).find(o=>o.id===t)}resolveApiKey(e,t){if(t)return t;let o=this.getProvider(e);if(o)for(let r of o.apiKeyEnvVars){let s=process.env[r];if(s?.trim())return s.trim()}}}});function ZS(n){if(n)return n==="openai"?"openai-chat":n==="anthropic"?"anthropic-messages":n}function eT(n,e){return _u(n.id,e)?"exact":(n.aliases??[]).some(t=>_u(t,e))?"alias":void 0}function _u(n,e){return n.trim().toLowerCase()===e.trim().toLowerCase()}function tT(n,e){return n.variantKind?n.variantKind:e.mediaType==="realtime_audio"||e.mediaType==="realtime_video"?"realtime":e.mediaType?"media-plan":n.id.includes("coding")||e.id.toLowerCase().includes("coder")||e.id.toLowerCase().includes("codegeex")?"coding-plan":n.transport==="openai-chat"||n.transport==="openai-responses"||n.transport==="volcengine-responses"?"openai-compatible":n.transport==="anthropic-messages"?"anthropic-compatible":"standard"}function nT(n){return n==="coding-plan"||n==="media-plan"?"plan":"paygo"}function oT(n,e){let t=new Set(n.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&&n.quirks?.supportsToolStream&&t.add("tool_stream"),n.quirks?.supportsReasoningSplit&&t.add("reasoning_split"),(n.quirks?.builtinWebSearch||n.quirks?.builtinCodeInterpreter||n.quirks?.builtinUrlContext)&&t.add("builtin_tools"),(n.id.includes("coding")||e.id.toLowerCase().includes("coder")||e.id.toLowerCase().includes("codegeex"))&&t.add("coding"),[...t].sort()}function rT(n){let e=100;return e+=n.matchKind==="exact"?25:15,n.requestedTransport&&n.provider.transport===n.requestedTransport&&(e+=20),e+=n.requiredCapabilities.length*15,n.preferProviderId&&n.provider.id===n.preferProviderId&&(e+=50),n.preferVariantKind&&n.variantKind===n.preferVariantKind&&(e+=35),n.purpose==="textGeneration"&&!n.capabilities.includes("media")&&(e+=5),n.purpose==="imageGeneration"&&n.capabilities.includes("media")&&(e+=10),n.purpose==="videoGeneration"&&n.capabilities.includes("media")&&(e+=10),n.capabilities.includes("tool_stream")&&(e+=8),n.capabilities.includes("reasoning_split")&&(e+=8),n.variantKind==="coding-plan"&&(e+=n.provider.id.includes("coding")?12:5),e}function sT(n){let e=[n.matchKind==="exact"?"model id matched":"public alias matched"];n.requestedTransport&&e.push(`protocol ${n.requestedTransport} matched`);for(let t of n.requiredCapabilities)e.push(`capability ${t} matched`);return n.preferProviderId&&n.provider.id===n.preferProviderId&&e.push("preferred provider matched"),n.preferVariantKind&&n.variantKind===n.preferVariantKind&&e.push("preferred variant matched"),e}var _o,Au=N(()=>{"use strict";_o=class{registry;constructor(e){this.registry=e}resolve(e){let t=e.publicModel.trim();if(!t)return[];let o=e.userPreference?.providerIds?new Set(e.userPreference.providerIds):void 0,r=ZS(e.requestedProtocol),s=e.capabilities??[],i=[];for(let a of this.registry.listProviders())if(!(o&&!o.has(a.id))&&!(r&&a.transport!==r))for(let l of this.registry.listModels(a.id)){let c=eT(l,t);if(!c)continue;let d=oT(a,l);if(s.some(f=>!d.includes(f)))continue;let u=tT(a,l),p=a.billingChannelKind??nT(u),m=sT({matchKind:c,requestedTransport:r,requiredCapabilities:s,preferProviderId:e.userPreference?.preferProviderId,preferVariantKind:e.userPreference?.preferVariantKind,purpose:e.purpose,provider:a,variantKind:u,capabilities:d}),h=rT({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 Fn=N(()=>{"use strict"});function aT(n){let e=n.slice(n.lastIndexOf(".")).toLowerCase();return iT[e]||"application/octet-stream"}function cT(n){return lT.test(n)}async function Pu(n,e,t,o){if(n.startsWith("data:")||!cT(n))return n;let r=await fetch(n,{signal:o});if(!r.ok)throw new Error(`Failed to fetch local media ${n}: ${r.status}`);let s=Buffer.from(await r.arrayBuffer()),i=dT(n),a=r.headers.get("content-type")||aT(i);return(await e.uploadFile(s,i,a,t,o)).url}function dT(n){try{let t=new URL(n).pathname.split("/").pop();return t&&t.includes(".")?t:"upload"}catch{return"upload"}}var iT,lT,Iu=N(()=>{"use strict";iT={".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"};lT=/^https?:\/\/(127\.0\.0\.1|localhost|0\.0\.0\.0|\[::1\])(:\d+)?/i});function z(n){return uT.test(n)}async function pt(n,e){return Pu(n,e.uploadAdapter,e.apiKey,e.signal)}async function $r(n,e){if(n.startsWith("data:")||!z(n))return n;let t=await fetch(n);if(!t.ok)throw new Error(`Failed to fetch local media ${n}: ${t.status}`);let o=Buffer.from(await t.arrayBuffer());if(o.byteLength>pT)throw new Error(`Local media too large for base64 (${(o.byteLength/1024/1024).toFixed(1)}MB). Use file upload API instead.`);return`data:${t.headers.get("content-type")||e||mT(n)};base64,${o.toString("base64")}`}function mT(n){let e=n.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 uT,pT,Bn=N(()=>{"use strict";Iu();uT=/^https?:\/\/(127\.0\.0\.1|localhost|0\.0\.0\.0|\[::1\])(:\d+)?/i;pT=20*1024*1024});function Pt(n){let e=Math.min(1e3*Math.pow(2,n-1),3e4),t=Math.random()*.25*e;return e+t}function Wt(n){return n!=null&&Va.has(n)}function It(n,e){return new Promise((t,o)=>{if(e?.aborted){o(new Error("Request aborted"));return}let r=setTimeout(t,n);e&&e.addEventListener("abort",()=>{clearTimeout(r),o(new Error("Request aborted"))},{once:!0})})}function Gt(n){if(n&&typeof n=="object"){let e=n;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 Va,At,Wn=N(()=>{"use strict";Va=new Set([429,529,502,503,504]),At=9e4});function Ao(n){return n.toLowerCase().startsWith("gpt-5")}function Ur(n){return n.toLowerCase().includes("5.4-nano")}function Po(n){return/^o[1-4](-|$)/.test(n.toLowerCase())}var Ka=N(()=>{"use strict"});function fT(n){switch(n){case"sensitive":return"content_filter";case"model_context_window_exceeded":return"length";case"network_error":return"error";default:return n}}async function gT(n,e,t,o){return n.some(s=>s.audioUrls?.some(z)||s.imageUrls?.some(z))?Promise.all(n.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)?pt(a,{uploadAdapter:e,apiKey:t,signal:o}):Promise.resolve(a)))}return Object.keys(i).length>0?{...s,...i}:s})):n}function hT(n,e){return n.map(t=>{if(t.role==="user"){let o=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(o||r||s||i){let l=[];if(t.content&&l.push({type:"text",text:t.content}),o){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 o={role:"assistant"};return t.thinkingBlocks&&t.thinkingBlocks.length>0&&(o.reasoning_content=t.thinkingBlocks.map(r=>r.thinking).join("")),o.content=t.content??null,t.tool_calls&&t.tool_calls.length>0&&(o.tool_calls=t.tool_calls.map(r=>({id:r.id,type:r.type,function:{name:r.function.name,arguments:r.function.arguments}}))),o}if(t.role==="tool"){if(t.imageUrls&&t.imageUrls.length>0&&!e.filterImageBlocks){let o=[];t.content&&o.push({type:"text",text:t.content});for(let r of t.imageUrls)o.push({type:"image_url",image_url:{url:r}});return{role:"tool",content:o,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 Gn,za=N(()=>{"use strict";Fn();Bn();Wn();Ka();Gn=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,o){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:hT(await gT(e.messages,this.fileUploadAdapter,t,o),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(o?.aborted)throw new Error("Request aborted");f>0&&h&&await It(Pt(f),o);try{yield*this.fetchAndStream(i,m,a,o);return}catch(y){h=y instanceof Error?y:new Error(String(y));let b=h.message.includes("Stream idle timeout");if(!Wt(Gt(h))&&!b||f===2)throw h}}}async*fetchAndStream(e,t,o,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(o),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 o of t.choices??[]){let r=o.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}}o.finish_reason&&(yield{type:"done",finishReason:o.finish_reason})}}}async*parseSSEStreamWithWatchdog(e){let t=new TextDecoder,o="",r=null,s=new AbortController,i=()=>{r&&clearTimeout(r),r=setTimeout(()=>{s.abort()},At)};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(),o+=t.decode(c,{stream:!0});let d;for(;(d=o.indexOf(`
|
|
17
17
|
`))!==-1;){let u=o.slice(0,d).trim();if(o=o.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 o=t.delta;if(o){if(o.reasoning_content&&(yield{type:"reasoning_delta",text:o.reasoning_content}),o.reasoning_details){let r=o.reasoning_details.slice(this.cumulativeReasoningLen);r&&(this.cumulativeReasoningLen=o.reasoning_details.length,yield{type:"reasoning_delta",text:r})}if(o.content)if(this.quirks.supportsReasoningSplit){let r=o.content.slice(this.cumulativeContentLen);r&&(this.cumulativeContentLen=o.content.length,yield{type:"delta",text:r})}else yield{type:"delta",text:o.content};if(o.tool_calls)for(let r of o.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:fT(t.finish_reason)})}}}async*complete(e,t,o){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=o?AbortSignal.any([o,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(`
|
|
18
18
|
`))!==-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,o,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",o);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,o){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:o??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 yT(n,e,t,o){return n.some(s=>s.audioUrls?.some(z)||s.imageUrls?.some(z))?Promise.all(n.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)?pt(a,{uploadAdapter:e,apiKey:t,signal:o}):Promise.resolve(a)))}return Object.keys(i).length>0?{...s,...i}:s})):n}function bT(n,e={}){let t=[];for(let o of n){if(o.role==="system"){t.push({role:"developer",content:o.content??""});continue}if(o.role==="user"){let r=o.imageUrls&&o.imageUrls.length>0,s=o.videoUrls&&o.videoUrls.length>0,i=o.audioUrls&&o.audioUrls.length>0,a=o.fileIds&&o.fileIds.length>0;if(r||s||i||a){let c=[];if(r){let d=o.imageUrls.length>1;for(let u=0;u<o.imageUrls.length;u++){let p=o.imageUrls[u];d&&c.push({type:"input_text",text:`[Image ${u+1}]`});let m={type:"input_image",image_url:p};o.imageDetail&&(m.detail=o.imageDetail),c.push(m)}}if(s)for(let d of o.videoUrls)c.push({type:"input_video",video_url:d});if(i)for(let d of o.audioUrls){let u=d,p=o.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 o.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})}o.content&&c.push({type:"input_text",text:o.content}),t.push({role:"user",content:c})}else t.push({role:"user",content:o.content??""});continue}if(o.role==="assistant"){if(o.content&&t.push({role:"assistant",content:o.content}),o.tool_calls&&o.tool_calls.length>0)for(let r of o.tool_calls)t.push({type:"function_call",call_id:r.id,name:r.function.name,arguments:r.function.arguments});continue}if(o.role==="tool"){if(!o.tool_call_id)continue;if(o.imageUrls&&o.imageUrls.length>0){let r=[];o.content&&r.push({type:"input_text",text:o.content});for(let s of o.imageUrls)r.push({type:"input_image",image_url:s});t.push({type:"function_call_output",call_id:o.tool_call_id,output:r})}else t.push({type:"function_call_output",call_id:o.tool_call_id,output:o.content??""});continue}}return t}var jr,Cu=N(()=>{"use strict";Fn();Bn();Wn();Ka();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,o){let s=/\/v\d+$/.test(this.baseUrl)?`${this.baseUrl}/responses`:`${this.baseUrl}/v1/responses`,i=await this.buildRequestBody(e,t,o),a={"Content-Type":"application/json",Authorization:`Bearer ${t}`,...this.extraHeaders},l=null;for(let c=0;c<=2;c++){if(o?.aborted)throw new Error("Request aborted");c>0&&l&&await It(Pt(c),o);try{yield*this.fetchAndStream(s,a,i,o);return}catch(d){l=d instanceof Error?d:new Error(String(d));let u=l.message.includes("Stream idle timeout");if(!Wt(Gt(l))&&!u||c===2)throw l}}}async buildRequestBody(e,t,o){let r={model:e.model,input:bT(await yT(e.messages,this.fileUploadAdapter,t,o),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,o,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(o),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 o of t.output){if(o.type==="message"&&o.content)for(let r of o.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(o.type==="reasoning"&&o.summary)for(let r of o.summary)r.type==="summary_text"&&(yield{type:"reasoning_delta",text:r.text??""});o.type==="function_call"&&(yield{type:"tool_call_delta",index:0,id:o.call_id,name:o.name,arguments:o.arguments??""})}yield{type:"done",finishReason:t.status==="completed"?"stop":t.status??"stop"}}async*parseSSEStream(e){let t=new TextDecoder,o="",r="",s=null,i=new AbortController,a=0,l=new Map,c=()=>{s&&clearTimeout(s),s=setTimeout(()=>{i.abort()},At)};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(),o+=t.decode(p,{stream:!0});let m;for(;(m=o.indexOf(`
|
|
@@ -318,7 +318,7 @@ END;
|
|
|
318
318
|
`)}rerank(e,t){let o=(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<o&&(a+=.1*(1-d/o))}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 sm(n){return new Sl(n)}ft();function Tl(n){try{let e=wx();if(e){let t={projectRoot:n.projectRoot,userIdPrefix:n.userIdPrefix,embedding:n.embedding,createDatabase:e};return{provider:sm(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 wx(){try{let e=Tx(import.meta.url)("better-sqlite3"),t=e.default??e;if(typeof t!="function")return null;let o=t;return r=>new o(r)}catch{return null}}function wl(n){let e=process.env.QMEMORY_USER_PREFIX||void 0,o=J().getActiveModel("embedding");if(o){let i={projectRoot:n,userIdPrefix:e,embedding:{strategy:"api",api:{baseUrl:o.baseUrl||"",apiKey:o.apiKey,model:o.model||"text-embedding-3-small"},fallbackStrategy:"onnx"}};return o.keyHandle.release({success:!0}),i}let r=process.env.QMEMORY_EMBEDDING_STRATEGY||"auto",s;if(r==="auto")s=xx();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:n,userIdPrefix:e,embedding:s}}var im={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 xx(){let t=J().peekActiveModel("textGeneration")?.provider?.toLowerCase();if(t){let c=Rx(t);if(c){let d=vl(t,c);if(d)return{strategy:"api",api:d,fallbackStrategy:"onnx"}}}for(let[c,d]of Object.entries(im))for(let u of d){let p=process.env[u];if(p){let m=vl(c,p);if(m)return{strategy:"api",api:m,fallbackStrategy:"onnx"}}}let o=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=o||r;return l?{strategy:"api",api:{baseUrl:l,apiKey:s,model:i,dimensions:a,format:"openai"},fallbackStrategy:"onnx"}:{strategy:"onnx"}}function Rx(n){let e=im[n];if(e)for(let t of e){let o=process.env[t];if(o)return o}}var an=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,o]of this._modelUsage)e[t]={...o};return e}addUsage(e,t){this._totalInputTokens+=e.inputTokens,this._totalOutputTokens+=e.outputTokens;let o=this._modelUsage.get(t);o?(o.inputTokens+=e.inputTokens,o.outputTokens+=e.outputTokens,o.cacheRead+=e.cacheRead??0,o.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,o){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+=o;break;case"per_character":s.mediaCharacters+=o;break;case"per_token":s.outputTokens+=o;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,o]of Object.entries(e.modelUsage))this._modelUsage.set(t,{...o});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 am="transcript.jsonl",Yt="metadata.json";function _x(n){return Kt(n)}function qn(n,e){let t=n.replace(/[^a-zA-Z0-9_-]/g,"_");return qe.join(_x(e),t)}function lm(n,e){let t=n.replace(/[^a-zA-Z0-9_-]/g,"_"),o=qe.join(Kt(e),t),r=qe.join(o,Yt);if(ue.existsSync(r))return o}function xn(n,e){let t=lm(n,e);if(!t)return null;try{let o=ue.readFileSync(qe.join(t,Yt),"utf8");return JSON.parse(o)}catch{return null}}async function xl(n,e,t,o){let r=qn(n,t);try{await ue.promises.mkdir(r,{recursive:!0});let s={role:e.role,content:e.content,ts:Date.now()};o&&(s.turnId=o);let i=JSON.stringify(s)+`
|
|
319
319
|
`;return await ue.promises.appendFile(qe.join(r,am),i,"utf8"),!0}catch(s){return console.error(`[session-persistence] appendMessage failed for ${n}: ${s.message}`),!1}}async function cm(n,e,t,o){let r=qn(n,o);await ue.promises.mkdir(r,{recursive:!0});let s={};try{let c=await ue.promises.readFile(qe.join(r,Yt),"utf8");s=JSON.parse(c)}catch{}let i=new Date().toISOString(),a={sessionId:n,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,Yt+".tmp");await ue.promises.writeFile(l,JSON.stringify(a,null,2),"utf8"),await ue.promises.rename(l,qe.join(r,Yt))}async function nt(n,e,t){let r=lm(n,t)??qn(n,t),s=qe.join(r,Yt),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:n,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 Rl(n,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(n,e),o=qe.join(t,am),r=qe.join(t,Yt),s=[],i=0;try{let d=await ue.promises.readFile(o,"utf8");for(let u of d.split(`
|
|
320
320
|
`))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 ${o}`)}catch{return null}if(s.length===0&&i>0)return console.error(`[session-persistence] Transcript fully corrupt for session ${n}`),null;let a=new Date().toISOString(),l={sessionId:n,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 Mt(n=Zi,e){let t=Kt(e),o;try{o=await ue.promises.readdir(t)}catch{return[]}let r=[];for(let s of o){let i=qe.join(t,s,Yt);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,n)}async function _l(n,e){let t=qn(n,e);await ue.promises.rm(t,{recursive:!0,force:!0})}function Ax(n){return n.turnCount<ea?!1:n.taskSummaryGeneratedAt?n.turnCount-(n.taskSummaryGeneratedAt??0)>=ta:!0}var Px="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 dm(n,e){if(!n.trim())return null;try{let t=e.transport.stream({model:e.model,messages:[{role:"system",content:Px},{role:"user",content:n.slice(0,500)}],tools:[],maxTokens:30},e.apiKey),o="";for await(let r of t)r.type==="delta"&&(o+=r.text);return o=o.trim().replace(/^["'""'']+|["'""'']+$/g,""),o||null}catch{return null}}async function um(n,e,t,o,r){if(!Ax(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(`
|
|
321
|
-
`),a=o.transport.stream({model:o.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},o.apiKey),l="";for await(let u of a)u.type==="delta"&&(l+=u.text);if(l=l.trim(),!l)return null;let c=qn(n,r),d=qe.join(c,Yt);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}}ll();import{randomUUID as
|
|
321
|
+
`),a=o.transport.stream({model:o.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},o.apiKey),l="";for await(let u of a)u.type==="delta"&&(l+=u.text);if(l=l.trim(),!l)return null;let c=qn(n,r),d=qe.join(c,Yt);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}}ll();import{randomUUID as zL}from"node:crypto";var Ix=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 o of this.listeners)try{o(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 o=this.tasks.get(e);if(!o)return;let r=t(o);r!==o&&(this.tasks.set(e,r),this.notify(e,r),!os(o.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=Ix){let t=Date.now();for(let[o,r]of this.tasks)os(r.lifecycle)&&r.endedAt&&t-r.endedAt>e&&(this.tasks.delete(o),this.notify(o,null))}};function os(n){return n==="completed"||n==="failed"||n==="cancelled"||n==="timeout"}le();import{watch as Cx}from"node:fs";import{stat as Ex}from"node:fs/promises";import{join as pm,relative as Mx,resolve as Ox}from"node:path";var Dx=[`${Ge}/settings.json`,"INSTRUCTIONS.md",`${Ge}/INSTRUCTIONS.md`,"INSTRUCTIONS.local.md",`${Ge}/rules`],Lx=["INSTRUCTIONS.md","INSTRUCTIONS.local.md",`${Ge}/rules`],Al=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 Dx){let t=pm(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 o=Cx(e,{persistent:!1,recursive:t.includes("/")?!1:void 0},(r,s)=>{let i=s?pm(e,s):e;this.handleChange(i,r==="rename"?"created":"modified")});o.on("error",()=>{this.watchers.delete(e)}),this.watchers.set(e,o)}catch{}}handleChange(e,t){let o=this.debounceTimers.get(e);o&&clearTimeout(o),this.debounceTimers.set(e,setTimeout(async()=>{this.debounceTimers.delete(e);let r=t;try{await Ex(e)}catch{r="deleted"}let s=Mx(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(()=>{}),Lx.some(a=>s.includes(a)||e.includes(a))&&this.deps.onInstructionCacheReset?.()},300))}setCwd(e){let t=Ox(e);if(t===this._cwd)return;let o=this._cwd;this._cwd=t,this.deps.hooks.invoke("cwd.changed",{sessionId:this.deps.sessionId,oldCwd:o,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 mm(n){let e=new Al(n);return await e.start(),e}le();Ue();import{readFile as Nx,readdir as $x,stat as Ux}from"node:fs/promises";import{dirname as ss,extname as jx,isAbsolute as Fx,join as Xn,parse as gm,resolve as fm}from"node:path";import{homedir as Bx}from"node:os";var Wx="INSTRUCTIONS.md",Gx="INSTRUCTIONS.local.md",Hx=[".instructions.md"],Vx=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 Kx(n){try{return await Nx(n,"utf-8")}catch{return null}}function zx(n){return n.includes("<!--")?n.replace(/^[ \t]*<!--[\s\S]*?-->[ \t]*$/gm,""):n}function qx(n){let e=n.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?/);if(!e)return{content:n};let t=e[1],o=n.slice(e[0].length),r=t.match(/^paths:\s*(.+)$/m);if(!r)return{content:o};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:o,globs:a.length>0?a:void 0}}function Yx(n,e){let t=new Set,o=/(?:^|\s)@((?:[^\s\\]|\\ )+)/g,s=n.replace(/```[\s\S]*?```/g,"").replace(/`[^`]+`/g,""),i;for(;(i=o.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(Bx(),a.slice(2));else if(Fx(a))c=a;else if(a.startsWith("./"))c=fm(ss(e),a);else if(/^[a-zA-Z0-9._-]/.test(a)&&!a.startsWith("@"))c=fm(ss(e),a);else continue;t.add(c)}return[...t]}async function Yn(n,e,t,o=0,r){let s=n.toLowerCase();if(t.has(s)||o>=na)return[];let i=jx(n).toLowerCase();if(i&&!Vx.has(i))return[];t.add(s);let a=await Kx(n);if(!a?.trim())return[];let{content:l,globs:c}=qx(a),d=zx(l);if(!d.trim())return[];let u=[],p={path:n,type:e,content:d.trim()};r&&(p.parent=r),c&&(p.globs=c),u.push(p);let m=Yx(l,n);for(let h of m){let f=await Yn(h,e,t,o+1,n);u.push(...f)}return u}async function hm(n,e,t,o,r=new Set){if(r.has(n))return[];r.add(n);let s=[];try{let i=await $x(n,{withFileTypes:!0});for(let a of i){let l=Xn(n,a.name);if(a.isDirectory())s.push(...await hm(l,e,t,o,r));else if(a.isFile()&&a.name.endsWith(".md")){let c=await Yn(l,e,t);s.push(...c.filter(d=>o?!!d.globs:!d.globs))}}}catch{}return s}async function Xx(n){let e=n,t=gm(e).root;for(;e!==t;){try{let o=Xn(e,".git"),r=await Ux(o);if(r.isDirectory()||r.isFile())return e}catch{}e=ss(e)}return null}async function Jx(n,e){let t=[],o=new Set,s=await Xx(n)??gm(n).root,i=[],a=n;for(;i.push(a),!(a===s&&a!==n);){let l=ss(a);if(l===a)break;a=l}for(let l of i.reverse()){t.push(...await Yn(Xn(l,Wx),"Project",o));for(let c of Hx)t.push(...await Yn(Xn(l,c),"Project",o));t.push(...await Yn(Mo(l),"Project",o)),t.push(...await hm(Hn(l),"Project",o,!1)),t.push(...await Yn(Xn(l,Gx),"Local",o))}return e&&t.length>0&&e.invoke("instructions.loaded",{sessionId:"",source:n,fileCount:t.length}).catch(()=>{}),t}function ym(n){if(n.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 o of n){if(!o.content)continue;let r=o.type==="Project"?" (project instructions, checked into the codebase)":o.type==="Local"?" (user's private project instructions, not checked in)":" (user's private global instructions for all projects)";t.push(`Contents of ${o.path}${r}:
|
|
322
322
|
|
|
323
323
|
${o.content.trim()}`)}return t.length>0?`${e}
|
|
324
324
|
|
|
@@ -420,7 +420,7 @@ exit: Leave worktree (keep or remove it).
|
|
|
420
420
|
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"]},S_=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]?$/;function sf(n){return{name:k_,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:v_,execute:async(e,t)=>{switch(t.action){case"enter":{if(n.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&&!S_.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 o=await n.enterWorktree(t.name);if(!o.success)return{content:[{type:"text",text:`Error: ${o.error||"failed to create worktree"}`}],details:{type:"worktree",error:o.error}};let r=o.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(`
|
|
421
421
|
`)}],details:{type:"worktree",action:"enter",name:r.name,branch:r.branch,path:r.path}}}case"exit":{if(!n.isInWorktree())return{content:[{type:"text",text:"Error: not in a worktree."}],details:{type:"worktree",error:"not_in_worktree"}};let o=t.exitAction||"keep";if(o==="remove"){let i=n.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 n.exitWorktree(o,t.discardChanges);return r.success?{content:[{type:"text",text:`Exited worktree. ${o==="keep"?"Worktree kept for later use.":"Worktree removed."}
|
|
422
422
|
Restored to: ${r.previousCwd||"main workspace"}`}],details:{type:"worktree",action:"exit",exitAction:o,previousCwd:r.previousCwd}}:{content:[{type:"text",text:`Error: ${r.error||"failed to exit worktree"}`}],details:{type:"worktree",error:r.error}}}case"list":{let o=await n.listWorktrees();if(!o.worktrees||o.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 (${o.worktrees.length}):`,""];for(let s of o.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(`
|
|
423
|
-
`)}],details:{type:"worktree",action:"list",count:o.worktrees.length}}}default:return{content:[{type:"text",text:`Error: unknown action "${t.action}".`}],details:{type:"worktree",error:"unknown_action"}}}}}}le();import{execFile as T_}from"node:child_process";import{promisify as w_}from"node:util";import{join as _n,resolve as af,basename as tc}from"node:path";import{mkdir as mf,rm as ff,symlink as x_,readdir as
|
|
423
|
+
`)}],details:{type:"worktree",action:"list",count:o.worktrees.length}}}default:return{content:[{type:"text",text:`Error: unknown action "${t.action}".`}],details:{type:"worktree",error:"unknown_action"}}}}}}le();import{execFile as T_}from"node:child_process";import{promisify as w_}from"node:util";import{join as _n,resolve as af,basename as tc}from"node:path";import{mkdir as mf,rm as ff,symlink as x_,readdir as E$,stat as R_}from"node:fs/promises";var Ho=w_(T_),__=/^[a-zA-Z0-9._-]+$/,lf=64;function gf(n){if(n.length>lf)throw new Error(`Invalid worktree name: must be ${lf} characters or fewer (got ${n.length})`);for(let e of n.split("/")){if(e==="."||e==="..")throw new Error(`Invalid worktree name "${n}": must not contain "." or ".." path segments`);if(!__.test(e))throw new Error(`Invalid worktree name "${n}": segment must contain only letters, digits, dots, underscores, and dashes`)}}function nc(n){return n.replaceAll("/","+")}function hf(n){return`worktree-${nc(n)}`}var rt=null;async function Ne(n,e){try{let{stdout:t,stderr:o}=await Ho("git",n,{cwd:e??process.cwd(),env:{...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:""},timeout:3e4});return{stdout:t,stderr:o,code:0}}catch(t){let o=t;return{stdout:o.stdout??"",stderr:o.stderr??String(t),code:o.code??1}}}async function Go(n){let{stdout:e,code:t}=await Ne(["rev-parse","--show-toplevel"],n);return t===0?e.trim():null}async function cf(n){let{stdout:e,code:t}=await Ne(["status","--porcelain"],n);return t!==0?-1:e.trim().split(`
|
|
424
424
|
`).filter(Boolean).length}async function df(n,e){let{stdout:t,code:o}=await Ne(["rev-list",`origin/${e}..${e}`,"--count"],n);return o!==0?0:parseInt(t.trim(),10)||0}async function yf(n,e,t,o){for(let r of t){if(r.includes("..")||r.startsWith("/")||r.startsWith("\\")){o?.warn(`[worktree] skipping symlink for "${r}": path traversal detected`);continue}let s=_n(n,r),i=_n(e,r);try{await x_(s,i,"dir"),o?.info(`[worktree] symlinked ${r} from main repo to worktree`)}catch(a){let l=a.code;l!=="ENOENT"&&l!=="EEXIST"&&o?.warn(`[worktree] failed to symlink ${r} (${l??"unknown"}): ${a}`)}}}async function A_(n,e,t){let{code:o,stderr:r}=await Ne(["sparse-checkout","set","--cone","--",...t],n);if(o!==0)throw await Ne(["worktree","remove","--force",n],e),new Error(`Failed to configure sparse-checkout: ${r}`);let{code:s,stderr:i}=await Ne(["checkout","HEAD"],n);if(s!==0)throw await Ne(["worktree","remove","--force",n],e),new Error(`Failed to checkout sparse worktree: ${i}`);return!0}async function P_(){try{return await Ho("tmux",["-V"],{timeout:5e3}),!0}catch{return!1}}function I_(n,e){return`${tc(n)}_${e}`.replace(/[/.]/g,"_")}async function C_(n,e){if(!await P_())return null;try{return await Ho("tmux",["new-session","-d","-s",e,"-c",n],{timeout:1e4}),e}catch{return null}}async function uf(n){try{return await Ho("tmux",["kill-session","-t",n],{timeout:5e3}),!0}catch{return!1}}async function pf(n,e,t,o){let r=cp(e),s=_n(r,n);try{if(!(await R_(s)).isFile())return null}catch{return null}try{let{stdout:i,stderr:a}=await Ho(s,[],{cwd:e,env:{...process.env,...t},timeout:3e4});return o?.info(`[worktree] hook ${n} succeeded: ${i.trim()}`),i.trim()||null}catch(i){return o?.warn(`[worktree] hook ${n} failed: ${i}`),null}}async function bf(n,e,t){gf(e);let o=nc(e),r=hf(e),s=_n(n,".worktrees"),i=_n(s,o);await mf(s,{recursive:!0});let{code:a,stderr:l}=await Ne(["worktree","add","-B",r,i,"HEAD"],n);return a!==0?(t?.warn(`[worktree] agent worktree creation failed: ${l}`),null):(await yf(n,i,["node_modules"],t),t?.info(`[worktree] agent worktree created: ${e} at ${i}`),{worktreePath:i,branch:r})}async function kf(n,e,t,o){let{code:r}=await Ne(["worktree","remove","--force",e],n);return r!==0&&(await ff(e,{recursive:!0,force:!0}).catch(()=>{}),await Ne(["worktree","prune"],n)),await Ne(["branch","-D",t],n),o?.info(`[worktree] agent worktree removed: ${e}`),!0}function vf(n){let{log:e,symlinkDirs:t=["node_modules"],sparsePaths:o}=n;return{async enterWorktree(r){try{let s=Date.now(),i=await Go();if(!i)return{success:!1,error:"Not in a git repository"};let a=await pf("worktree-create",i,{WORKTREE_NAME:r??""},e);if(a){let $=process.cwd();return process.chdir(a),rt={originalCwd:$,worktreePath:a,worktreeName:r??tc(a),worktreeBranch:"",hookBased:!0,creationDurationMs:Date.now()-s},{success:!0,worktree:{name:rt.worktreeName,path:a,branch:"",isCurrent:!0,hasChanges:!1,unpushedCommits:0}}}let l=r??`agent-${Date.now().toString(36)}`;gf(l);let c=nc(l),d=hf(l),u=_n(i,".worktrees"),p=_n(u,c);await mf(u,{recursive:!0});let{stdout:m}=await Ne(["worktree","list","--porcelain"],i),h=m.split(`
|
|
425
425
|
`).find($=>$.startsWith("worktree ")&&$.includes(c));if(h){let $=h.replace("worktree ","").trim(),W=process.cwd();return process.chdir($),rt={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=o&&o.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&&o&&(await A_(p,i,o),x=!0),await yf(i,p,t,e);let I=process.cwd();process.chdir(p);let P=I_(i,d),O=await C_(p,P);return rt={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(!rt)return{success:!1,error:"Not in a worktree"};try{let i=rt,a=await Go(i.originalCwd);if(!a)return{success:!1,error:"Original git root not found"};if(r==="remove"){let l=await cf(i.worktreePath),c=await df(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),rt=null,i.tmuxSessionName&&await uf(i.tmuxSessionName),await pf("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 ff(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 uf(i.tmuxSessionName),rt=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(`
|
|
426
426
|
|
|
@@ -679,7 +679,7 @@ description: ${c}`,i=!0}return i?`---
|
|
|
679
679
|
${a}
|
|
680
680
|
---
|
|
681
681
|
|
|
682
|
-
${l}`:n}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 zc(n){if(!n||typeof n!="object")return!1;let e=n;return e.jsonrpc==="2.0"&&typeof e.method=="string"&&e.method.length>0}var Rh=["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"],_h=["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"],UC=[...Rh,..._h];var vt={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"},St={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 er(n){if(!n||typeof n!="object")return!1;let e=n;return e.jsonrpc==="2.0"&&typeof e.method=="string"&&"id"in e}function tr(n){if(!n||typeof n!="object")return!1;let e=n;return e.jsonrpc==="2.0"&&typeof e.method=="string"&&!("id"in e)}function qc(n){if(!n||typeof n!="object")return!1;let e=n;return e.jsonrpc==="2.0"&&"id"in e&&!("method"in e)}var Ah="openai-codex";var
|
|
682
|
+
${l}`:n}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 zc(n){if(!n||typeof n!="object")return!1;let e=n;return e.jsonrpc==="2.0"&&typeof e.method=="string"&&e.method.length>0}var Rh=["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"],_h=["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"],UC=[...Rh,..._h];var vt={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"},St={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 er(n){if(!n||typeof n!="object")return!1;let e=n;return e.jsonrpc==="2.0"&&typeof e.method=="string"&&"id"in e}function tr(n){if(!n||typeof n!="object")return!1;let e=n;return e.jsonrpc==="2.0"&&typeof e.method=="string"&&!("id"in e)}function qc(n){if(!n||typeof n!="object")return!1;let e=n;return e.jsonrpc==="2.0"&&"id"in e&&!("method"in e)}var Ah="openai-codex";var b1={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"},[Ah]:{providerFamily:"openai"},openrouter:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},opencode:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},kilocode:{providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]}};import{randomUUID as jC}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,o){this.transport=e,this.handler=t,this.verbose=o?.verbose??!1}dispatchMessage(e){if(this.isJsonRpcResponse(e))return this.handleResponse(e),!0;if(er(e)){let t=e;return process.stderr.write(`[acp-server] \u922B?recv id=${String(t.id)} method=${t.method}
|
|
683
683
|
`),this.handleRequest(t),!0}return tr(e)?(this.handleNotification(e),!0):!1}emitSessionUpdate(e,t,o){if(t.startsWith("x_")&&!this.hostSupportsExtendedEvents)return;let r={jsonrpc:"2.0",method:vt.SESSION_UPDATE,params:{sessionId:e,update:{sessionUpdate:t,...o}}};this.transport.send(r)}async requestPermission(e){let t=`perm-${jC().slice(0,8)}`,o={jsonrpc:"2.0",method:vt.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(o)})}get supportsExtendedEvents(){return this.hostSupportsExtendedEvents}get supportsExtendedMethods(){return this.hostSupportsExtendedMethods}get sessionId(){return this.activeSessionId}async handleRequest(e){let{method:t,params:o,id:r}=e,s=o??{};try{switch(t){case vt.INITIALIZE:await this.onInitialize(r,s);break;case vt.SESSION_NEW:await this.onSessionNew(r,s);break;case vt.SESSION_PROMPT:await this.onSessionPrompt(r,s);break;case vt.SESSION_END:await this.onSessionEnd(r,s);break;case vt.SESSION_SET_CONFIG:await this.onSessionSetConfig(r,s);break;case vt.SESSION_SET_MODEL:await this.handler.handleAcpSessionSetModel(s.sessionId??this.activeSessionId??"",s.modelId??s.model??""),this.sendResult(r,{});break;case vt.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 o=this.pendingPermissions.get(t);if(o){this.pendingPermissions.delete(t);let r=e.result;o.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 o=t.clientInfo?.name??"unknown",r=t.clientInfo?.version??"unknown";this.log(`initialize: host=${o} 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 o=await this.handler.handleAcpSessionNew(t);this.activeSessionId=o.sessionId,this.sendResult(e,o)}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 o=await this.handler.handleAcpSessionPrompt(t);this.sendResult(e,o)}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 o=await this.handler.handleAcpDream(t);this.sendResult(e,o)}sendResult(e,t){process.stderr.write(`[acp-server] \u922B?send id=${String(e)} result
|
|
684
684
|
`);let o={jsonrpc:"2.0",id:e,result:t};this.transport.send(o)}sendError(e,t,o,r){process.stderr.write(`[acp-server] \u922B?send id=${String(e)} error=${o}
|
|
685
685
|
`);let s={jsonrpc:"2.0",id:e,error:{code:t,message:o,...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}
|
|
@@ -806,7 +806,7 @@ Content-Disposition: form-data; name="prompt"\r
|
|
|
806
806
|
`)+`\r
|
|
807
807
|
`,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}),n.id!==void 0&&this.sendResponse(n.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}),n.id!==void 0&&this.sendResponse(n.id,{text:p.text??"",model:p.model})}catch(l){a.release({success:!1}),n.id!==void 0&&this.sendResponse(n.id,void 0,{code:w.INTERNAL_ERROR,message:l instanceof Error?l.message:String(l)})}}ft();var ii="\u65E0\u6CD5\u8FDE\u63A5 llmrouter \u6A21\u578B\u76EE\u5F55",po=class extends Error{constructor(e=ii){super(e),this.name="LlmrouterCatalogUnavailableError"}};function FE(){let n=process.env.QLOGIC_LLMROUTER_BASE_URL?.trim().replace(/\/+$/,"");if(!n)throw new po;return n}function BE(){let n={accept:"application/json"},e=process.env.QLOGIC_LLMROUTER_ACCESS_TOKEN?.trim();return e&&(n.authorization=`Bearer ${e}`),n}async function Tk(n){let e=FE(),t;try{t=await fetch(`${e}${n}`,{method:"GET",headers:BE(),signal:AbortSignal.timeout(1e4)})}catch{throw new po}if(!t.ok)throw new po;let o=await t.json().catch(()=>null),r=Array.isArray(o)?o:KE(o)&&Array.isArray(o.data)?o.data:null;if(!r)throw new po;return r}async function ai(){return Tk("/ext/model-catalog/providers")}async function WE(){return Tk("/ext/model-catalog/models")}function kd(n){let e={zhipu:"Zhipu GLM","zhipu-openai":"Zhipu GLM OpenAI","zhipu-coding":"Zhipu GLM Coding",volcengine:"Doubao / Volcengine"};return e[n.id]?e[n.id]:n.displayName??n.name??n.id}function li(n){return n.baseUrl??n.base_url}async function vd(n){return(await ai()).find(t=>t.id===n)??null}async function Sd(n){let e=await WE();n.migrateModelIds(GE(e));let t=e.map(HE).filter(o=>!!o);return n.replaceCatalogModels(t),t}function GE(n){let e=new Map;for(let t of n){let o=t.provider??t.owned_by,r=t.public_model??t.publicModel??t.id,s=t.native_model_id??t.nativeModelId??t.id;if(!o||!r||!s)continue;let i=`${o}:${r}`;for(let a of[s,t.id])!a||a===r||e.set(`${o}:${a}`,i)}return e}function HE(n){let e=n.provider??n.owned_by,t=n.public_model??n.publicModel??n.id,o=n.native_model_id??n.nativeModelId??n.id;return!e||!t||!o?null:{id:`${e}:${t}`,provider:e,model:t,displayName:n.display_name??n.displayName??n.name??n.id,purposes:VE(n.purposes,n.category),baseUrl:n.baseUrl??n.base_url,enabled:!0,nativeModelId:o,transport:n.provider_transport??n.providerTransport,contextWindow:n.context_window??n.contextWindow,maxOutput:n.max_output??n.maxOutput,streamRequired:n.stream_required??n.streamRequired,capabilities:n.capabilities,pricing:n.pricing}}function VE(n,e){let t=[...n??[],e].filter(s=>!!s),o=new Set(["textGeneration","smallModel","stt","tts","imageGeneration","imageUnderstanding","videoGeneration","videoUnderstanding","threeDGeneration","embedding","voiceClone","musicGeneration","realtimeAudio","realtimeVideo"]),r=t.filter(s=>o.has(s));return[...new Set(r.length?r:["textGeneration"])]}function KE(n){return!!n&&typeof n=="object"&&!Array.isArray(n)}function zE(n){return n.length<=8?"****":`${n.slice(0,3)}***${n.slice(-4)}`}function dt(n,e,t,o=w.INTERNAL_ERROR){if(e.id!==void 0){if(typeof n.sendError=="function"){n.sendError(e.id,o,t);return}n.sendResponse(e.id,void 0,{code:o,message:t})}}function ci(n,e){dt(n,e,ii)}function qE(n){let e={};for(let t of n)for(let o of t.purposes)e[o]??=[],e[o].push(t);return e}async function Td(){let n=J(),e=await Sd(n);return n.save(),e}async function wk(n){try{let e=(await ai()).map(t=>({id:t.id,displayName:kd(t),baseUrl:li(t)??"",modelCount:t.models?.length??0}));n.id!==void 0&&this.sendResponse(n.id,{providers:e})}catch{ci(this,n)}}async function xk(n){let e=n.params;if(!e?.providerId||!e?.key){dt(this,n,"Required: providerId (string), key (string)",w.INVALID_PARAMS);return}let{providerId:t,key:o,label:r}=e;try{let s=await vd(t);if(!s){dt(this,n,`Unknown provider: ${t}`,w.INVALID_PARAMS);return}let i=J();if(i.getProviderStatus(t)?.keys.some(c=>c.key===o)){n.id!==void 0&&this.sendResponse(n.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,o,{label:r});await Td();for(let c of Do)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(),n.id!==void 0&&this.sendResponse(n.id,{ok:!0,keyId:l,providerId:t})}catch(s){let i=s instanceof Error?s.message:ii;dt(this,n,i)}}function Rk(n){let e=n.params;if(!e?.keyId){dt(this,n,"Required: keyId (string)",w.INVALID_PARAMS);return}let t=J();t.removeKey(e.keyId),t.save(),n.id!==void 0&&this.sendResponse(n.id,{ok:!0})}function _k(n){let e=n.params;if(!e?.keyId||typeof e.enabled!="boolean"){dt(this,n,"Required: keyId (string), enabled (boolean)",w.INVALID_PARAMS);return}let t=J();t.updateKey(e.keyId,{enabled:e.enabled}),t.save(),n.id!==void 0&&this.sendResponse(n.id,{ok:!0})}function Ak(n){let e=n.params;if(!e?.modelId||typeof e.enabled!="boolean"){dt(this,n,"Required: modelId (string), enabled (boolean)",w.INVALID_PARAMS);return}let t=J();e.enabled?t.enableModel(e.modelId):t.disableModel(e.modelId),t.save(),n.id!==void 0&&this.sendResponse(n.id,{ok:!0})}async function Pk(n){let e=n.params;try{await Td();let t=J(),o=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));n.id!==void 0&&this.sendResponse(n.id,{models:r,grouped:qE(r),configuredProviderIds:[...o]})}catch{ci(this,n)}}function Ik(n){let e=n.params;if(!e?.purpose||!e?.modelId){dt(this,n,"Required: purpose (string), modelId (string)",w.INVALID_PARAMS);return}try{let t=J();t.setBinding(e.purpose,e.modelId),t.save(),n.id!==void 0&&this.sendResponse(n.id,{ok:!0})}catch(t){dt(this,n,t instanceof Error?t.message:String(t),w.INVALID_PARAMS)}}function Ck(n){let e=n.params;if(!e?.purpose){dt(this,n,"Required: purpose (string)",w.INVALID_PARAMS);return}let t=J(),o=t.getBinding(e.purpose);n.id!==void 0&&this.sendResponse(n.id,{model:o?{id:o.id,provider:o.provider,model:o.model,displayName:o.displayName,purposes:o.purposes,enabled:o.enabled}:null,available:t.isAvailable(e.purpose)})}async function Ek(n){try{let e=await ai(),t=new Map(e.map(a=>[a.id,kd(a)]));await Td();let o=J(),r=o.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:zE(l.key),enabled:l.enabled,health:l.healthStatus}))})),s=o.getAllBindings(),i={};for(let a of Do){let l=s[a];i[a]={bound:!!l,modelId:l?.id,modelName:l?.displayName,available:o.isAvailable(a)}}n.id!==void 0&&this.sendResponse(n.id,{providers:r,purposes:i})}catch{ci(this,n)}}async function Mk(n){try{let e=J();e.load(),await Sd(e),e.save(),n.id!==void 0&&this.sendResponse(n.id,{ok:!0,catalogRefreshed:!0})}catch{ci(this,n)}}async function Ok(n){let e=n.params;if(!e?.providerId||!e?.apiKey){dt(this,n,"providerId and apiKey required",w.INVALID_PARAMS);return}try{let t=await vd(e.providerId),o=e.baseUrl||(t?li(t):void 0);if(!o){dt(this,n,`Unknown provider: ${e.providerId}`,w.INVALID_PARAMS);return}let r=`${o.replace(/\/$/,"")}/models`,s=await fetch(r,{method:"GET",headers:{Authorization:`Bearer ${e.apiKey}`},signal:AbortSignal.timeout(1e4)});if(s.ok){n.id!==void 0&&this.sendResponse(n.id,{valid:!0,status:s.status});return}let i=await s.text().catch(()=>"");n.id!==void 0&&this.sendResponse(n.id,{valid:!1,status:s.status,error:i.slice(0,500)})}catch(t){let o=t instanceof Error?t.message:String(t);n.id!==void 0&&this.sendResponse(n.id,{valid:!1,status:0,error:o})}}ur();Ys();td();Xs();Js();async function Dk(n){let e=this.getActiveProjectRoot(),t=new Ut(e),o=t.load();if(o){this.sendNotification("pet.soul_ready",{name:o.name,species:o.species,personality:o.personality,catchphrase:o.catchphrase,stats:o.stats,rarity:o.rarity,breed:o.breed,breedColors:o.breedColors}),n.id!==void 0&&this.sendResponse(n.id,{ok:!0,soul:o});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)}),n.id!==void 0&&this.sendResponse(n.id,{ok:!0,soul:i})}catch(s){n.id!==void 0&&this.sendResponse(n.id,void 0,{code:w.INTERNAL_ERROR,message:s.message??"Failed to hatch pet"})}}async function Lk(n){let t=n.params?.action??"pat",o=this.getActiveProjectRoot(),r=new Ut(o),s=r.load();if(!s){n.id!==void 0&&this.sendResponse(n.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}),n.id!==void 0&&this.sendResponse(n.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 Nk(n){let e=this.getActiveProjectRoot(),o=new Ut(e).load();if(n.id!==void 0&&this.sendResponse(n.id,{ok:!0,soul:o??null}),o){this.sendNotification("pet.soul_ready",{name:o.name,species:o.species,personality:o.personality,catchphrase:o.catchphrase,stats:o.stats,rarity:o.rarity,breed:o.breed,breedColors:o.breedColors});let r=Ve.getUnlockedAbilities(o.level).map(i=>i.name),s=Ve.getNextAbility(o.level);this.sendNotification("pet.growth",{level:o.level,experience:o.experience,xpNeeded:Ve.xpForLevel(o.level),abilities:r,nextAbility:s?{name:s.name,level:s.unlockedAtLevel}:void 0})}}async function $k(n){let e=n.params;if(!e?.description&&!e?.imageBase64){n.id!==void 0&&this.sendResponse(n.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",o=e.description??"";e.imageBase64&&(o=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(o),s=en(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(o+`
|
|
808
808
|
|
|
809
|
-
`+m),s=en(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:o},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=cr(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=dr(o,"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:en(r),parts:ro(en(r)),colors:io(en(r)),characterDesc:o};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"}};ir(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}),n.id!==void 0&&this.sendResponse(n.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"}),n.id!==void 0&&this.sendResponse(n.id,void 0,{code:w.INTERNAL_ERROR,message:t.message??"Forge failed"})}}var XE=YE(import.meta.url),JE=XE("../../package.json").version;function QE(n){let e=n.pathname.split("/").filter(Boolean),o=(e[e.length-1]??"").replace(/\.md$/i,"").replace(/[^a-zA-Z0-9_-]/g,"-");return/^(skill|readme|index|install|main)$/i.test(o)&&e.length>=2?e[e.length-2].replace(/[^a-zA-Z0-9_-]/g,"-"):o||""}var di=class n{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=zt();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 kn,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 o=Number(process.env.QLOGICAGENT_DREAM_COOLDOWN_MS);o>=0&&(we.dream.cooldownMs=o),this.transport=e.transport??new Dn({verbose:e.verbose}),this.taskStore.onTaskChange((r,s)=>{s&&this.sendNotification("task.updated",{taskId:r,type:s.type,lifecycle:s.lifecycle,label:s.label})}),lg({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()&&(sg(e),this.mediaPersistence.setProjectDir(e))}start(){this.running=!0,this.log("qlogicagent started, waiting for JSON-RPC messages..."),nm().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(qc(e)||tr(e)){this.acpServer.dispatchMessage(e);return}if(er(e)){let t=e.method;if(t==="initialize"||t.startsWith("session/")||t.startsWith("x/")||t.startsWith("fs/")){this.acpServer.dispatchMessage(e);return}}}if(!zc(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{uh().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=>uy.call(this,e)],["memory.dream",e=>Zs.call(this,e)],["agent.abort",e=>ly.call(this,e)],["tool.approval.response",e=>cy.call(this,e)],["thread.user_response",e=>dy.call(this,e)],["thread.list",e=>Ny.call(this,e)],["session.resume",e=>Ky.call(this,e)],["thread.create",e=>Ly.call(this,e)],["session.getInfo",e=>zy.call(this,e)],["session.create",e=>$y.call(this,e)],["session.resolve",e=>Uy.call(this,e)],["session.list",e=>jy.call(this,e)],["session.get",e=>Fy.call(this,e)],["session.getMessages",e=>By.call(this,e)],["session.update",e=>Wy.call(this,e)],["session.delete",e=>Gy.call(this,e)],["session.deleteAll",e=>Hy.call(this,e)],["session.archive",e=>Vy.call(this,e)],["memory.list",e=>Wb.call(this,e)],["memory.atlas",e=>Gb.call(this,e)],["memory.activity",e=>Hb.call(this,e)],["memory.read",e=>Vb.call(this,e)],["memory.write",e=>Kb.call(this,e)],["memory.search",e=>zb.call(this,e)],["memory.delete",e=>qb.call(this,e)],["tools.list",e=>Yb.call(this,e)],["media.listModels",e=>bk.call(this,e)],["media.cancel",e=>kk.call(this,e)],["media.status",e=>vk.call(this,e)],["media.stt",e=>Sk.call(this,e)],["settings.listProviders",e=>wk.call(this,e)],["settings.addKey",e=>xk.call(this,e)],["settings.removeKey",e=>Rk.call(this,e)],["settings.toggleKey",e=>_k.call(this,e)],["settings.toggleModel",e=>Ak.call(this,e)],["settings.listModels",e=>Pk.call(this,e)],["settings.setActiveModel",e=>Ik.call(this,e)],["settings.getActiveModel",e=>Ck.call(this,e)],["settings.getOverview",e=>Ek.call(this,e)],["settings.refreshModels",e=>Mk.call(this,e)],["settings.validateKey",e=>Ok.call(this,e)],["provider.list",e=>Xb.call(this,e)],["config.get",e=>Jb.call(this,e)],["config.update",e=>Qb.call(this,e)],["config.tunables",e=>Zb.call(this,e)],["config.updateTunable",e=>ek.call(this,e)],["todos.list",e=>tk.call(this,e)],["tasks.list",e=>nk.call(this,e)],["tasks.cancel",e=>ok.call(this,e)],["agents.scan",e=>sk.call(this,e)],["agents.list",e=>ik.call(this,e)],["agents.config",e=>ak.call(this,e)],["agents.setConfig",e=>lk.call(this,e)],["agents.getConfig",e=>ck.call(this,e)],["agents.removeConfig",e=>dk.call(this,e)],["agents.setGateway",e=>uk.call(this,e)],["agents.getGateway",e=>pk.call(this,e)],["agents.processes",e=>fk.call(this,e)],["agents.kill",e=>gk.call(this,e)],["agents.listConfigured",e=>mk.call(this,e)],["agents.getLog",e=>hk.call(this,e)],["agents.testConnection",e=>yk.call(this,e)],["solo.start",e=>ob.call(this,e)],["solo.status",e=>rb.call(this,e)],["solo.cancel",e=>sb.call(this,e)],["solo.select",e=>ib.call(this,e)],["solo.list",e=>ab.call(this,e)],["solo.delete",e=>lb.call(this,e)],["solo.message",e=>cb.call(this,e)],["solo.evaluate",e=>db.call(this,e)],["product.plan",e=>wy.call(this,e)],["product.confirm",e=>xy.call(this,e)],["product.message",e=>Ry.call(this,e)],["product.create",e=>_y.call(this,e)],["product.resume",e=>Ay.call(this,e)],["product.pause",e=>Py.call(this,e)],["product.checkpoint",e=>Iy.call(this,e)],["product.status",e=>Cy.call(this,e)],["product.list",e=>Ey.call(this,e)],["product.delete",e=>My.call(this,e)],["product.cancel",e=>Oy.call(this,e)],["product.rollback",e=>Dy.call(this,e)],["project.create",e=>Tb.call(this,e)],["project.list",e=>wb.call(this,e)],["project.delete",e=>xb.call(this,e)],["project.purgeAll",e=>Rb.call(this,e)],["project.rename",e=>_b.call(this,e)],["project.archive",e=>Ab.call(this,e)],["project.unarchive",e=>Pb.call(this,e)],["project.update",e=>Cb.call(this,e)],["project.archiveByGroup",e=>Ib.call(this,e)],["session.switchProject",e=>qy.call(this,e)],["session.focus",e=>Xy.call(this,e)],["session.moveToProject",e=>Jy.call(this,e)],["session.getState",e=>Yy.call(this,e)],["files.list",e=>Ob.call(this,e)],["files.create",e=>Db.call(this,e)],["files.rename",e=>Lb.call(this,e)],["files.delete",e=>Nb.call(this,e)],["files.gitStatus",e=>$b.call(this,e)],["instructions.list",e=>Ub.call(this,e)],["instructions.read",e=>jb.call(this,e)],["instructions.write",e=>Fb.call(this,e)],["instructions.delete",e=>Bb.call(this,e)],["skills.list",e=>pb.call(this,e)],["skills.activate",e=>mb.call(this,e)],["skills.deactivate",e=>fb.call(this,e)],["skills.delete",e=>gb.call(this,e)],["skills.promote",e=>hb.call(this,e)],["skills.stats",e=>yb.call(this,e)],["skills.pin",e=>bb.call(this,e)],["skills.unpin",e=>kb.call(this,e)],["skills.curator",e=>vb.call(this,e)],["skills.lifecycle",e=>Sb.call(this,e)],["pet.hatch",e=>Dk.call(this,e)],["pet.interact",e=>Lk.call(this,e)],["pet.status",e=>Nk.call(this,e)],["pet.forge",e=>$k.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,o=t?.protocolVersion??"unknown",r=t?.host?.name??t?.hostName??"unknown",s=t?.host?.version??t?.hostVersion??"?",i=o.split(".")[0],a=to.split(".")[0];if(i!==a){this.log(`[initialize] protocol mismatch: host=${o} agent=${to}`),e.id!==void 0&&this.sendResponse(e.id,void 0,{code:w.PROTOCOL_MISMATCH,message:`Protocol version mismatch: host=${o}, 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:Ot().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:[...Ch]}}),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 o=Vp(t);gd(t),this.setActiveWorkdir(t),this.sendNotification("project.created",{id:o.id,name:o.name,workspaceDir:o.workspaceDir,type:o.type})}this.ensureDefaultProjectDir();{let t=this.getActiveProjectRoot(),o=new $t(t);o.ensureInitialized(),this.memdir=o}}ensureDefaultProjectDir(){let t=fe().find(o=>o.type==="default"&&o.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
|
+
`+m),s=en(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:o},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=cr(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=dr(o,"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:en(r),parts:ro(en(r)),colors:io(en(r)),characterDesc:o};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"}};ir(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}),n.id!==void 0&&this.sendResponse(n.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"}),n.id!==void 0&&this.sendResponse(n.id,void 0,{code:w.INTERNAL_ERROR,message:t.message??"Forge failed"})}}var XE=YE(import.meta.url);function JE(){for(let n of["../package.json","../../package.json"])try{return XE(n).version}catch{}return"0.0.0"}var QE=JE();function ZE(n){let e=n.pathname.split("/").filter(Boolean),o=(e[e.length-1]??"").replace(/\.md$/i,"").replace(/[^a-zA-Z0-9_-]/g,"-");return/^(skill|readme|index|install|main)$/i.test(o)&&e.length>=2?e[e.length-2].replace(/[^a-zA-Z0-9_-]/g,"-"):o||""}var di=class n{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=zt();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 kn,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 o=Number(process.env.QLOGICAGENT_DREAM_COOLDOWN_MS);o>=0&&(we.dream.cooldownMs=o),this.transport=e.transport??new Dn({verbose:e.verbose}),this.taskStore.onTaskChange((r,s)=>{s&&this.sendNotification("task.updated",{taskId:r,type:s.type,lifecycle:s.lifecycle,label:s.label})}),lg({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()&&(sg(e),this.mediaPersistence.setProjectDir(e))}start(){this.running=!0,this.log("qlogicagent started, waiting for JSON-RPC messages..."),nm().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(qc(e)||tr(e)){this.acpServer.dispatchMessage(e);return}if(er(e)){let t=e.method;if(t==="initialize"||t.startsWith("session/")||t.startsWith("x/")||t.startsWith("fs/")){this.acpServer.dispatchMessage(e);return}}}if(!zc(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{uh().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=>uy.call(this,e)],["memory.dream",e=>Zs.call(this,e)],["agent.abort",e=>ly.call(this,e)],["tool.approval.response",e=>cy.call(this,e)],["thread.user_response",e=>dy.call(this,e)],["thread.list",e=>Ny.call(this,e)],["session.resume",e=>Ky.call(this,e)],["thread.create",e=>Ly.call(this,e)],["session.getInfo",e=>zy.call(this,e)],["session.create",e=>$y.call(this,e)],["session.resolve",e=>Uy.call(this,e)],["session.list",e=>jy.call(this,e)],["session.get",e=>Fy.call(this,e)],["session.getMessages",e=>By.call(this,e)],["session.update",e=>Wy.call(this,e)],["session.delete",e=>Gy.call(this,e)],["session.deleteAll",e=>Hy.call(this,e)],["session.archive",e=>Vy.call(this,e)],["memory.list",e=>Wb.call(this,e)],["memory.atlas",e=>Gb.call(this,e)],["memory.activity",e=>Hb.call(this,e)],["memory.read",e=>Vb.call(this,e)],["memory.write",e=>Kb.call(this,e)],["memory.search",e=>zb.call(this,e)],["memory.delete",e=>qb.call(this,e)],["tools.list",e=>Yb.call(this,e)],["media.listModels",e=>bk.call(this,e)],["media.cancel",e=>kk.call(this,e)],["media.status",e=>vk.call(this,e)],["media.stt",e=>Sk.call(this,e)],["settings.listProviders",e=>wk.call(this,e)],["settings.addKey",e=>xk.call(this,e)],["settings.removeKey",e=>Rk.call(this,e)],["settings.toggleKey",e=>_k.call(this,e)],["settings.toggleModel",e=>Ak.call(this,e)],["settings.listModels",e=>Pk.call(this,e)],["settings.setActiveModel",e=>Ik.call(this,e)],["settings.getActiveModel",e=>Ck.call(this,e)],["settings.getOverview",e=>Ek.call(this,e)],["settings.refreshModels",e=>Mk.call(this,e)],["settings.validateKey",e=>Ok.call(this,e)],["provider.list",e=>Xb.call(this,e)],["config.get",e=>Jb.call(this,e)],["config.update",e=>Qb.call(this,e)],["config.tunables",e=>Zb.call(this,e)],["config.updateTunable",e=>ek.call(this,e)],["todos.list",e=>tk.call(this,e)],["tasks.list",e=>nk.call(this,e)],["tasks.cancel",e=>ok.call(this,e)],["agents.scan",e=>sk.call(this,e)],["agents.list",e=>ik.call(this,e)],["agents.config",e=>ak.call(this,e)],["agents.setConfig",e=>lk.call(this,e)],["agents.getConfig",e=>ck.call(this,e)],["agents.removeConfig",e=>dk.call(this,e)],["agents.setGateway",e=>uk.call(this,e)],["agents.getGateway",e=>pk.call(this,e)],["agents.processes",e=>fk.call(this,e)],["agents.kill",e=>gk.call(this,e)],["agents.listConfigured",e=>mk.call(this,e)],["agents.getLog",e=>hk.call(this,e)],["agents.testConnection",e=>yk.call(this,e)],["solo.start",e=>ob.call(this,e)],["solo.status",e=>rb.call(this,e)],["solo.cancel",e=>sb.call(this,e)],["solo.select",e=>ib.call(this,e)],["solo.list",e=>ab.call(this,e)],["solo.delete",e=>lb.call(this,e)],["solo.message",e=>cb.call(this,e)],["solo.evaluate",e=>db.call(this,e)],["product.plan",e=>wy.call(this,e)],["product.confirm",e=>xy.call(this,e)],["product.message",e=>Ry.call(this,e)],["product.create",e=>_y.call(this,e)],["product.resume",e=>Ay.call(this,e)],["product.pause",e=>Py.call(this,e)],["product.checkpoint",e=>Iy.call(this,e)],["product.status",e=>Cy.call(this,e)],["product.list",e=>Ey.call(this,e)],["product.delete",e=>My.call(this,e)],["product.cancel",e=>Oy.call(this,e)],["product.rollback",e=>Dy.call(this,e)],["project.create",e=>Tb.call(this,e)],["project.list",e=>wb.call(this,e)],["project.delete",e=>xb.call(this,e)],["project.purgeAll",e=>Rb.call(this,e)],["project.rename",e=>_b.call(this,e)],["project.archive",e=>Ab.call(this,e)],["project.unarchive",e=>Pb.call(this,e)],["project.update",e=>Cb.call(this,e)],["project.archiveByGroup",e=>Ib.call(this,e)],["session.switchProject",e=>qy.call(this,e)],["session.focus",e=>Xy.call(this,e)],["session.moveToProject",e=>Jy.call(this,e)],["session.getState",e=>Yy.call(this,e)],["files.list",e=>Ob.call(this,e)],["files.create",e=>Db.call(this,e)],["files.rename",e=>Lb.call(this,e)],["files.delete",e=>Nb.call(this,e)],["files.gitStatus",e=>$b.call(this,e)],["instructions.list",e=>Ub.call(this,e)],["instructions.read",e=>jb.call(this,e)],["instructions.write",e=>Fb.call(this,e)],["instructions.delete",e=>Bb.call(this,e)],["skills.list",e=>pb.call(this,e)],["skills.activate",e=>mb.call(this,e)],["skills.deactivate",e=>fb.call(this,e)],["skills.delete",e=>gb.call(this,e)],["skills.promote",e=>hb.call(this,e)],["skills.stats",e=>yb.call(this,e)],["skills.pin",e=>bb.call(this,e)],["skills.unpin",e=>kb.call(this,e)],["skills.curator",e=>vb.call(this,e)],["skills.lifecycle",e=>Sb.call(this,e)],["pet.hatch",e=>Dk.call(this,e)],["pet.interact",e=>Lk.call(this,e)],["pet.status",e=>Nk.call(this,e)],["pet.forge",e=>$k.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,o=t?.protocolVersion??"unknown",r=t?.host?.name??t?.hostName??"unknown",s=t?.host?.version??t?.hostVersion??"?",i=o.split(".")[0],a=to.split(".")[0];if(i!==a){this.log(`[initialize] protocol mismatch: host=${o} agent=${to}`),e.id!==void 0&&this.sendResponse(e.id,void 0,{code:w.PROTOCOL_MISMATCH,message:`Protocol version mismatch: host=${o}, 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:Ot().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:[...Ch]}}),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 o=Vp(t);gd(t),this.setActiveWorkdir(t),this.sendNotification("project.created",{id:o.id,name:o.name,workspaceDir:o.workspaceDir,type:o.type})}this.ensureDefaultProjectDir();{let t=this.getActiveProjectRoot(),o=new $t(t);o.ensureInitialized(),this.memdir=o}}ensureDefaultProjectDir(){let t=fe().find(o=>o.type==="default"&&o.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]
|
|
810
810
|
Based on the conversation, suggest 1-3 short follow-up actions the user might naturally do next.
|
|
811
811
|
Be specific: "run the tests" beats "continue".
|
|
812
812
|
Stay silent if the next step isn't obvious.
|
|
@@ -841,8 +841,8 @@ ${t?`\u7528\u6237\u8865\u5145\u63CF\u8FF0\uFF1A${t}`:""}
|
|
|
841
841
|
`)}}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=tp();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);fg(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=qf();for(let v of g)P.addRule(v);yc(!0),l.info(`[permissions] group security mode active: ${g.length} rules injected`)}else yc(!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 $=Ot();this.permissionChecker.setToolMeta($),this.permissionUnregister=this.permissionChecker.register();let W=Ct(this.getActiveProjectRoot()),S=[W,Vt(),...Array.isArray(e?.skillPaths)?e.skillPaths:[]];Pe(_g({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=Vt();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(`---
|
|
842
842
|
`)?V.indexOf("---",4):-1,ge=(We>=0?V.slice(We+3).trimStart():V).split(`
|
|
843
843
|
`).find(Ft=>Ft.trim()&&!Ft.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}_${xt().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=Ot().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 nn=Be(D);return Wc(nn,g),He(D,nn),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 Wc(We,g),He(D,We),oe.join("")||`[skill "${g}"] completed (no output)`},manageSkill:async g=>{let v=this.getActiveProjectRoot(),_=Ct(v),C=te.join(_,g.name),R=te.join(C,"SKILL.md"),U=H();switch(g.action){case"create":{let D=g.content??"",V=Kc(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"}}),ht(),Zt(ee,g.name,"created"),He(U,ee),this.memoryProvider&&this.memoryUserId){let me=V.split(`
|
|
844
|
-
`).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=Kc(M,g.name)??M;return await Y.promises.writeFile(R,ae,"utf8"),Gc(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"),Gc(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"}}),ht(),{success:!0,message:`Skill "${g.name}" deleted`})}default:return{success:!1,message:`Unknown action: ${g.action}`}}},promoteSkill:async g=>{let v=Ct(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=Vt(),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"}}),ht(),{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??QE(_);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=Vt(),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"}}),ht(),{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(Ig({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 _=ln(),C=_a(_,v),U=Ot().filter(oe=>C.includes(oe.function.name)),D=Cl(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 Lc({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}-${xt().slice(0,8)}`,status:V.ok?"completed":"failed",output:ae||void 0,error:V.error,tokensUsed:ee}}}));let ce=mt(),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(Cg({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:Xo.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:Xo.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()};In(async()=>{for(let g of ie.values())g.timerId&&clearTimeout(g.timerId)}),Pe(Mg({createJob:async g=>{let v=`cron_${xt().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;In(async()=>{for(let g of Q.values())g.cleanup();Q.clear()}),Pe(Og({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 un({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")});In(async()=>{B.dispose()}),Pe(Dg({createTeam:async g=>{if(T.has(g.teamName))return{success:!1,error:`Team "${g.teamName}" already exists.`};let v=await Go(),_=[];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 bf(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 Go();if(_)for(let C of v.members)C.worktreePath&&C.worktreeBranch&&(await kf(_,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:Jg,label:Qg,description:eh,parameters:Zg,execute:async(v,_)=>{let C=await th(_,{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}}}})}Fp(d,{getMemdir:()=>this.memdir,log:{debug:g=>l.debug(g),warn:g=>l.warn(g)}},this.memoryPrefetchState);{let g=e?.workdir??process.cwd(),v=Ug(g,this.currentSessionId||"default");Pe($g(v))}Pe(jg({sendNotification:async g=>(l.info(`[notify] ${g.title??""}: ${g.message}`),{delivered:!0,channel:g.channel??"cli"})})),Pe(Fg({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=ui.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
|
+
`).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=Kc(M,g.name)??M;return await Y.promises.writeFile(R,ae,"utf8"),Gc(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"),Gc(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"}}),ht(),{success:!0,message:`Skill "${g.name}" deleted`})}default:return{success:!1,message:`Unknown action: ${g.action}`}}},promoteSkill:async g=>{let v=Ct(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=Vt(),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"}}),ht(),{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??ZE(_);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=Vt(),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"}}),ht(),{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(Ig({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 _=ln(),C=_a(_,v),U=Ot().filter(oe=>C.includes(oe.function.name)),D=Cl(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 Lc({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}-${xt().slice(0,8)}`,status:V.ok?"completed":"failed",output:ae||void 0,error:V.error,tokensUsed:ee}}}));let ce=mt(),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(Cg({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:Xo.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:Xo.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()};In(async()=>{for(let g of ie.values())g.timerId&&clearTimeout(g.timerId)}),Pe(Mg({createJob:async g=>{let v=`cron_${xt().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;In(async()=>{for(let g of Q.values())g.cleanup();Q.clear()}),Pe(Og({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 un({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")});In(async()=>{B.dispose()}),Pe(Dg({createTeam:async g=>{if(T.has(g.teamName))return{success:!1,error:`Team "${g.teamName}" already exists.`};let v=await Go(),_=[];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 bf(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 Go();if(_)for(let C of v.members)C.worktreePath&&C.worktreeBranch&&(await kf(_,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:Jg,label:Qg,description:eh,parameters:Zg,execute:async(v,_)=>{let C=await th(_,{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}}}})}Fp(d,{getMemdir:()=>this.memdir,log:{debug:g=>l.debug(g),warn:g=>l.warn(g)}},this.memoryPrefetchState);{let g=e?.workdir??process.cwd(),v=Ug(g,this.currentSessionId||"default");Pe($g(v))}Pe(jg({sendNotification:async g=>(l.info(`[notify] ${g.title??""}: ${g.message}`),{delivered:!0,channel:g.channel??"cli"})})),Pe(Fg({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=ui.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(`
|
|
845
845
|
`).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(Gg({executeInVm:async C=>{let R=Date.now();try{let U=_(),D=await ui.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(Hg({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=dh({projectRoot:Re,ruleEngine:P,hooks:d,log:g=>l.info(`[settings] ${g}`)});In(async()=>{he()}),this.currentSessionId&&d.invoke("session.created",{sessionId:this.currentSessionId}).catch(()=>{}),this.fileWatcher&&this.fileWatcher.stop();let jt=e?.workdir??process.cwd();return mm({projectRoot:jt,sessionId:this.currentSessionId,hooks:d,log:g=>l.debug(g),onInstructionCacheReset:km}).then(g=>{this.fileWatcher=g,In(async()=>{this.fileWatcher?.stop()})}).catch(g=>{l.warn(`[file-watcher] init error: ${g instanceof Error?g.message:g}`)}),this.agent=new No({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=o,this.currentProvider=t,this.currentBaseUrl=s??"",this.log(`created Agent (provider: ${t}, model: ${o})`),this.agent}static STATE_TO_STATUS={starting:"spawning",ready:"available",running:"running",completed:"available",failed:"failed",killed:"unavailable"};emitAgentStatus(e,t,o){let r=n.STATE_TO_STATUS[t]??"unavailable",s={agentId:e,status:r};(o?.missedBeats!==void 0||o?.lastActivityAt!==void 0)&&(s.health={missedBeats:o.missedBeats??0,lastActiveAt:o.lastActivityAt?new Date(o.lastActivityAt).toISOString():new Date().toISOString()}),o?.usage&&(s.usage=o.usage),this.sendNotification("agents.status",s)}async handleMcpToolCall(e,t,o){let r=ot(t);if(!r)return`Error: Unknown tool "${t}"`;let s=`mcp_${e}_${xt().slice(0,8)}`;try{return(await r.execute(s,o)).content.map(a=>a.text??"").join(`
|
|
846
846
|
`)||"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,o){let r={jsonrpc:"2.0",id:e};o?r.error=o:r.result=t,this.writeStdout(r)}sendNotification(e,t){if(this.acpServer&&this.acpServer.sessionId)Ih(this.acpServer,this.acpServer.sessionId,e,t);else{let o={jsonrpc:"2.0",method:e,params:t};this.writeStdout(o)}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}
|
|
847
|
-
`)}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 o=H(),r=[];try{r=(await Mt(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-${xt().slice(0,8)}`,sessionId:this.currentSessionId,config:{memoryRoot:o,transcriptDir:te.join(o,"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,o)=>this.acpHandleSessionSetModel(t,o),handleAcpSessionSetMode:(t,o)=>this.acpHandleSessionSetMode(t,o),handleAcpPermissionResponse:(t,o)=>this.acpHandlePermissionResponse(t,o),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 o={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:JE},agentCapabilities:o}}async acpHandleSessionNew(e){let t=e.sessionId??xt();return this.log(`[acp] session/new: id=${t}`),this.currentSessionId=t,this.sessionState=new an(t),this.sessionTaskDomain=void 0,this.memoryPrefetchState=zt(),e.cwd&&typeof e.cwd=="string"&&this.setActiveWorkdir(e.cwd),this.enableIdleDream(),{sessionId:t}}async acpHandleSessionPrompt(e){let t=xt(),o=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(o);s||(s=[],this.acpSessionHistory.set(o,s)),s.push({role:"user",content:r});let i=[...s],a=await this.runAcpTurn(t,o,i);return a.content&&s.push({role:"assistant",content:a.content}),a}async runAcpTurn(e,t,o){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=Ot(),l,c="end_turn",d="";for await(let u of i.run({turnId:e,sessionId:t,messages:o,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-${xt().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 o=typeof e.value=="string"?e.value:"";switch(t){case"model":this.currentModel=o;break;case"provider":this.currentProvider=o;break;case"apiKey":this.currentApiKey=o;break;case"baseUrl":this.currentBaseUrl=o;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 o=H(),r={jsonrpc:"2.0",id:`acp-dream-${xt().slice(0,8)}`,method:"memory.dream",params:{turnId:`dream-${xt().slice(0,8)}`,sessionId:e.sessionId||this.currentSessionId,config:{memoryRoot:e.config?.memoryRoot||o,transcriptDir:e.config?.transcriptDir||te.join(o,"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),o=await t.start(e);return t.getStatus(o)}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),o=e.soloId;return await t.cancel(o),{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:o,agentId:r,content:s,agentIndex:i}=e;return t.message(o,r,s,i)}async acpHandleSoloEvaluate(e){this.log("[acp] x/solo.evaluate");let t=Je.call(this),{soloId:o,evaluatorAgentId:r,evaluatorIndex:s}=e;return t.triggerEvaluation(o,r,s)}async acpHandleAgentsList(){return this.log("[acp] x/agents.list"),Pa()}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 En.call(this).plan(e)}async acpHandleProductConfirm(e){this.log("[acp] x/product.confirm");let t=En.call(this),o=e,r=await t.confirm(o),s=t.getSession(o.productId);return s&&await De.call(this).create({name:s.plan?.name??s.goal.slice(0,50),cwd:s.cwd,instances:o.instances,tasks:o.tasks,budget:o.budget}),r}async acpHandleProductMessage(e){this.log("[acp] x/product.message");let t=En.call(this),o=e;return t.message(o.productId,o.content)}async acpHandleProductResume(e){this.log("[acp] x/product.resume");let t=De.call(this),o=e.productId;return await t.resume(o,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 o=this.productOrchestrator.getStatus(t);if(!o)throw new Error(`Product session ${t} not found`);return o}async acpHandleProductPause(e){this.log("[acp] x/product.pause");let t=De.call(this),o=e.productId;return await t.pause(o),{ok:!0}}async acpHandleProductCancel(e){this.log("[acp] x/product.cancel");let t=De.call(this),o=e.productId;return await t.delete(o),{ok:!0}}async acpHandleProductRollback(e){this.log("[acp] x/product.rollback");let t=De.call(this),o=e.productId,r=e.checkpointId??"latest";return await t.rollback(o,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,o=e.prompt,r=e.maxTurns;if(!o)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 Lc({promptMessages:[{role:"user",content:o}],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}}};function Uk(n){let e={verbose:!1};for(let t of n.slice(2))(t==="--verbose"||t==="-v")&&(e.verbose=!0);return e}import{writeFileSync as ZE,appendFileSync as jk,mkdirSync as eM}from"node:fs";import{join as wd}from"node:path";import{homedir as tM}from"node:os";var Fk=wd(process.env.QLOGICAGENT_HOME||wd(tM(),".qlogicagent"),"debug-logs");try{eM(Fk,{recursive:!0})}catch{}var xd=wd(Fk,"acp-session.log");try{ZE(xd,"")}catch{}function Ze(n){let e=`[${new Date().toISOString()}] ${n}
|
|
848
|
-
`;Bk.call(process.stderr,e);try{jk(xd,e)}catch{}}var Bk=process.stderr.write.bind(process.stderr);process.stderr.write=((n,...e)=>{let t=typeof n=="string"?n:Buffer.from(n).toString();try{jk(xd,t)}catch{}return Bk(n,...e)});Ze(`PID=${process.pid} argv=${JSON.stringify(process.argv.slice(1))} cwd=${process.cwd()} HOME=${process.env.QLOGICAGENT_HOME??"(unset)"} NODE=${process.version}`);var Wk=Uk(process.argv),
|
|
847
|
+
`)}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 o=H(),r=[];try{r=(await Mt(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-${xt().slice(0,8)}`,sessionId:this.currentSessionId,config:{memoryRoot:o,transcriptDir:te.join(o,"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,o)=>this.acpHandleSessionSetModel(t,o),handleAcpSessionSetMode:(t,o)=>this.acpHandleSessionSetMode(t,o),handleAcpPermissionResponse:(t,o)=>this.acpHandlePermissionResponse(t,o),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 o={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:QE},agentCapabilities:o}}async acpHandleSessionNew(e){let t=e.sessionId??xt();return this.log(`[acp] session/new: id=${t}`),this.currentSessionId=t,this.sessionState=new an(t),this.sessionTaskDomain=void 0,this.memoryPrefetchState=zt(),e.cwd&&typeof e.cwd=="string"&&this.setActiveWorkdir(e.cwd),this.enableIdleDream(),{sessionId:t}}async acpHandleSessionPrompt(e){let t=xt(),o=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(o);s||(s=[],this.acpSessionHistory.set(o,s)),s.push({role:"user",content:r});let i=[...s],a=await this.runAcpTurn(t,o,i);return a.content&&s.push({role:"assistant",content:a.content}),a}async runAcpTurn(e,t,o){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=Ot(),l,c="end_turn",d="";for await(let u of i.run({turnId:e,sessionId:t,messages:o,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-${xt().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 o=typeof e.value=="string"?e.value:"";switch(t){case"model":this.currentModel=o;break;case"provider":this.currentProvider=o;break;case"apiKey":this.currentApiKey=o;break;case"baseUrl":this.currentBaseUrl=o;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 o=H(),r={jsonrpc:"2.0",id:`acp-dream-${xt().slice(0,8)}`,method:"memory.dream",params:{turnId:`dream-${xt().slice(0,8)}`,sessionId:e.sessionId||this.currentSessionId,config:{memoryRoot:e.config?.memoryRoot||o,transcriptDir:e.config?.transcriptDir||te.join(o,"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),o=await t.start(e);return t.getStatus(o)}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),o=e.soloId;return await t.cancel(o),{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:o,agentId:r,content:s,agentIndex:i}=e;return t.message(o,r,s,i)}async acpHandleSoloEvaluate(e){this.log("[acp] x/solo.evaluate");let t=Je.call(this),{soloId:o,evaluatorAgentId:r,evaluatorIndex:s}=e;return t.triggerEvaluation(o,r,s)}async acpHandleAgentsList(){return this.log("[acp] x/agents.list"),Pa()}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 En.call(this).plan(e)}async acpHandleProductConfirm(e){this.log("[acp] x/product.confirm");let t=En.call(this),o=e,r=await t.confirm(o),s=t.getSession(o.productId);return s&&await De.call(this).create({name:s.plan?.name??s.goal.slice(0,50),cwd:s.cwd,instances:o.instances,tasks:o.tasks,budget:o.budget}),r}async acpHandleProductMessage(e){this.log("[acp] x/product.message");let t=En.call(this),o=e;return t.message(o.productId,o.content)}async acpHandleProductResume(e){this.log("[acp] x/product.resume");let t=De.call(this),o=e.productId;return await t.resume(o,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 o=this.productOrchestrator.getStatus(t);if(!o)throw new Error(`Product session ${t} not found`);return o}async acpHandleProductPause(e){this.log("[acp] x/product.pause");let t=De.call(this),o=e.productId;return await t.pause(o),{ok:!0}}async acpHandleProductCancel(e){this.log("[acp] x/product.cancel");let t=De.call(this),o=e.productId;return await t.delete(o),{ok:!0}}async acpHandleProductRollback(e){this.log("[acp] x/product.rollback");let t=De.call(this),o=e.productId,r=e.checkpointId??"latest";return await t.rollback(o,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,o=e.prompt,r=e.maxTurns;if(!o)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 Lc({promptMessages:[{role:"user",content:o}],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}}};function Uk(n){let e={verbose:!1};for(let t of n.slice(2))(t==="--verbose"||t==="-v")&&(e.verbose=!0);return e}import{writeFileSync as eM,appendFileSync as jk,mkdirSync as tM}from"node:fs";import{join as wd}from"node:path";import{homedir as nM}from"node:os";var Fk=wd(process.env.QLOGICAGENT_HOME||wd(nM(),".qlogicagent"),"debug-logs");try{tM(Fk,{recursive:!0})}catch{}var xd=wd(Fk,"acp-session.log");try{eM(xd,"")}catch{}function Ze(n){let e=`[${new Date().toISOString()}] ${n}
|
|
848
|
+
`;Bk.call(process.stderr,e);try{jk(xd,e)}catch{}}var Bk=process.stderr.write.bind(process.stderr);process.stderr.write=((n,...e)=>{let t=typeof n=="string"?n:Buffer.from(n).toString();try{jk(xd,t)}catch{}return Bk(n,...e)});Ze(`PID=${process.pid} argv=${JSON.stringify(process.argv.slice(1))} cwd=${process.cwd()} HOME=${process.env.QLOGICAGENT_HOME??"(unset)"} NODE=${process.version}`);var Wk=Uk(process.argv),oM=!process.argv.includes("--no-acp"),rM=new Dn({verbose:Wk.verbose}),pi=new di({verbose:Wk.verbose,transport:rM});oM&&(pi.initAcpServer(),Ze("ACP server initialized, waiting for messages"));process.on("unhandledRejection",n=>{Ze(`unhandledRejection: ${n instanceof Error?n.stack??n.message:String(n)}`)});process.on("uncaughtException",n=>{Ze(`uncaughtException: ${n.stack??n.message}`)});process.stdin.on("end",()=>{Ze("stdin END received")});process.stdin.on("close",()=>{Ze("stdin CLOSE received")});process.stdout.on("error",n=>{Ze(`stdout ERROR: ${n.message}`)});process.stdout.on("close",()=>{Ze("stdout CLOSE")});process.on("exit",n=>{Ze(`process.exit code=${n}`)});process.on("SIGTERM",()=>{Ze("SIGTERM received"),pi.stop(),process.exit(0)});process.on("SIGINT",()=>{Ze("SIGINT received"),pi.stop(),process.exit(0)});process.on("SIGHUP",()=>{Ze("SIGHUP received")});Ze("calling server.start()");pi.start();Ze("server.start() returned, event loop active");
|