qlogicagent 2.22.4 → 2.22.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -248,7 +248,7 @@ ${t.slice(-n)}`}function uc(t){return t.replaceAll("&","&amp;").replaceAll("<","
248
248
  ${t.slice(-r)}`}function ov(t){let e=pn(t),n=e.events.at(-1);return[n?mc(n):"",e.cleanOutput].filter(Boolean).join(`
249
249
  `)}var fc=class{constructor(e,n){this.store=e;this.getCurrentSessionId=n}store;getCurrentSessionId;controllers=new Map;bashHandles=new Map;externalControls=new Map;deadlineTimers=new Map;lastProgressAt=new Map;idleReclaimMs=new Map;settledListeners=new Set;onTaskSettled(e){return this.settledListeners.add(e),()=>this.settledListeners.delete(e)}fireSettled(e){let n=this.store.getTask(e);if(n)for(let r of this.settledListeners)try{r(n)}catch{}}startAgentTask(e){let n={taskId:xr("local_agent"),type:"local_agent",label:e.label,permissionRole:"worker",isolation:"shared",lifecycle:"running",depth:e.depth,maxTurns:e.maxTurns,tokenBudget:0,startedAt:Date.now(),parentTaskId:e.parentTaskId,launchSessionId:e.launchSessionId??this.getCurrentSessionId?.(),launchTurnId:e.launchTurnId,agentName:e.agentName,systemPrompt:"",allowedTools:[]};this.store.registerTask(n);let r=new AbortController;return this.controllers.set(n.taskId,r),this.armIdleReclaim(n.taskId,e.idleMs??Dj),e.run(r.signal,n.taskId).then(o=>{this.settle(n.taskId,{lifecycle:o.ok?"completed":"failed",output:o.output?gg(o.output,Mj):void 0,error:o.error})}).catch(o=>{this.settle(n.taskId,{lifecycle:"failed",error:o instanceof Error?o.message:String(o)})}).finally(()=>{this.controllers.delete(n.taskId)}),n}registerBashTask(e){let n={taskId:e.handle.taskOutput.taskId,type:"local_bash",label:e.label??e.command.slice(0,80),permissionRole:"worker",isolation:"shared",lifecycle:"running",depth:0,maxTurns:1,tokenBudget:0,startedAt:Date.now(),launchSessionId:e.launchSessionId??this.getCurrentSessionId?.(),launchTurnId:e.launchTurnId,command:e.command,cwd:e.cwd,pid:e.pid,outputPath:e.handle.taskOutput.path};return this.store.registerTask(n),this.bashHandles.set(n.taskId,e.handle),e.handle.result.then(r=>{let o=this.store.getTask(n.taskId);if(!o||dt(o.lifecycle))return;let s=[r.stdout,r.stderr?`[stderr]
250
250
  ${r.stderr}`:""].filter(Boolean).join(`
251
- `);this.store.updateTask(n.taskId,i=>({...i,lifecycle:r.code===0?"completed":"failed",exitCode:r.code,output:gg(pn(s).cleanOutput),error:r.code===0?void 0:`exit code ${r.code}`,endedAt:Date.now()})),this.fireSettled(n.taskId)}).catch(r=>{this.settle(n.taskId,{lifecycle:"failed",error:r instanceof Error?r.message:String(r)})}).finally(()=>{this.bashHandles.delete(n.taskId)}),n}registerExternalTask(e,n){this.store.registerTask(e),this.externalControls.set(e.taskId,n)}settleExternalTask(e,n,r){this.externalControls.delete(e);let o=this.store.getTask(e);!o||dt(o.lifecycle)||(this.store.updateTask(e,s=>({...s,lifecycle:n,...r!=null?{output:r}:{},endedAt:Date.now()})),this.fireSettled(e))}settle(e,n){this.clearDeadline(e);let r=this.store.getTask(e);!r||dt(r.lifecycle)||(this.store.updateTask(e,o=>({...o,...n,endedAt:Date.now()})),this.fireSettled(e))}getTask(e){return this.store.getTask(e)}listTasks(){return this.store.getAllTasks()}async readOutput(e){let n=this.store.getTask(e);if(!n)return null;let r=!dt(n.lifecycle);if(r&&n.type==="local_bash"&&n.outputPath){let o="";try{o=(await gc(n.outputPath,sv)).output}catch{o=""}return{task:n,output:gg(ov(Mn(o))),running:r}}if(r){let o=this.externalControls.get(e);if(o?.readStatus)return{task:n,output:ov(o.readStatus()),running:r}}return{task:n,output:n.output??"",running:r}}teardownExecutors(e){let n=this.bashHandles.get(e);if(n){try{n.kill()}catch{}this.bashHandles.delete(e)}let r=this.controllers.get(e);r&&(r.abort("cancelled"),this.controllers.delete(e));let o=this.externalControls.get(e);if(o){try{o.cancel()}catch{}this.externalControls.delete(e)}}armIdleReclaim(e,n){!Number.isFinite(n)||n<=0||(this.idleReclaimMs.set(e,n),this.lastProgressAt.set(e,Date.now()),this.scheduleIdleCheck(e))}markProgress(e){this.lastProgressAt.has(e)&&this.lastProgressAt.set(e,Date.now())}scheduleIdleCheck(e){let n=this.idleReclaimMs.get(e);if(n===void 0)return;let r=this.lastProgressAt.get(e)??Date.now(),o=Math.max(0,n-(Date.now()-r)),s=setTimeout(()=>this.onIdleCheck(e),o||n);s.unref?.(),this.deadlineTimers.set(e,s)}onIdleCheck(e){let n=this.idleReclaimMs.get(e);if(n===void 0)return;Date.now()-(this.lastProgressAt.get(e)??0)>=n?this.enforceIdleTimeout(e,n):this.scheduleIdleCheck(e)}clearDeadline(e){let n=this.deadlineTimers.get(e);n&&(clearTimeout(n),this.deadlineTimers.delete(e)),this.lastProgressAt.delete(e),this.idleReclaimMs.delete(e)}enforceIdleTimeout(e,n){this.clearDeadline(e);let r=this.store.getTask(e);!r||dt(r.lifecycle)||(this.teardownExecutors(e),this.store.updateTask(e,o=>({...o,lifecycle:"timeout",error:o.error??`background task reclaimed after ${Math.round(n/1e3)}s with no progress (no output or tool activity)`,endedAt:Date.now()})),this.fireSettled(e))}cancelTask(e){let n=this.store.getTask(e);return!n||dt(n.lifecycle)?!1:(this.clearDeadline(e),this.teardownExecutors(e),this.store.updateTask(e,r=>({...r,lifecycle:"cancelled",endedAt:Date.now()})),!0)}cancelTasksForSession(e,n){if(!e)return[];let r=[];for(let o of this.store.getAllTasks())o.launchSessionId===e&&(!n||o.launchTurnId===n)&&!dt(o.lifecycle)&&this.cancelTask(o.taskId)&&r.push(o.taskId);return r}cancelAllRunning(){let e=[];for(let n of this.store.getAllTasks())dt(n.lifecycle)||this.cancelTask(n.taskId)&&e.push(n.taskId);return e}};function hc(){return vt()?.type==="group"}var mg=new Set;function iv(t){return mg.add(t),()=>{mg.delete(t)}}async function av(){await Promise.all(Array.from(mg).map(t=>t()))}import{randomUUID as vv}from"node:crypto";import{createHash as $8}from"node:crypto";import{randomUUID as j8}from"node:crypto";import*as Eo from"node:fs";import*as kc from"node:path";function yc(t){return kc.join(Vt(t),"feedback","events")}function cv(t,e){return kc.join(yc(t),`${encodeURIComponent(e)}.json`)}async function fg(t,e){try{return JSON.parse(await Eo.promises.readFile(cv(t,e),"utf8"))}catch{return null}}async function hg(t){t.projectId&&(await Eo.promises.mkdir(yc(t.projectId),{recursive:!0}),await Eo.promises.writeFile(cv(t.projectId,t.turnId),JSON.stringify(t,null,2),"utf8"))}async function lv(t){let e;try{e=(await Eo.promises.readdir(yc(t),{withFileTypes:!0})).filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>r.name)}catch{return[]}let n=[];for(let r of e)try{n.push(JSON.parse(await Eo.promises.readFile(kc.join(yc(t),r),"utf8")))}catch{continue}return n}async function dv(t){return(await lv(t)).filter(e=>e.upload?.eligible!==!1&&!e.upload?.uploadBatchId)}async function uv(t,e,n){let r=await fg(t,e);r&&(r.upload={eligible:r.upload?.eligible??!0,uploadBatchId:n},await hg(r))}async function yg(t,e,n,r){let o=await fg(t,e);o&&(o.upload={eligible:o.upload?.eligible??!0,uploadBatchId:n,uploadedAt:new Date().toISOString(),redactionVersion:r},await hg(o))}async function pv(t){return(await lv(t)).filter(e=>e.state==="active")}async function gv(t,e,n){let r=await fg(t,e);r&&(r.distill={proposedAt:new Date().toISOString(),clusterKey:n.clusterKey,idempotencyKey:n.idempotencyKey},await hg(r))}import{createHash as Oj}from"node:crypto";var Dn="feedback-redaction-v1",Nj=500;function kg(t){return Oj("sha256").update(t,"utf8").digest("hex")}var $j=[[/sk-[A-Za-z0-9_-]{8,}/g,"[redacted-key]"],[/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b/g,"[redacted-email]"],[/(?:[A-Za-z]:\\|\/)(?:Users|home|root|var|opt|etc|tmp)[\\/][^\s'"`)]+/gi,"[redacted-path]"]];function Lj(t){let e=(t??"").slice(0,Nj);for(let[n,r]of $j)e=e.replace(n,r);return e}function mv(t,e=Dn){return{feedbackId:t.feedbackId,rating:t.rating,reason:t.reason,state:t.state,messageHash:t.messageHash,sessionIdHash:kg(t.sessionId),projectIdHash:t.projectId?kg(t.projectId):void 0,turnIdHash:kg(t.turnId),messagePreview:Lj(t.messagePreview),model:t.model,provider:t.provider,agentMode:t.agentMode,sourceChannel:t.sourceChannel,usage:t.usage,toolSummary:t.toolSummary,fileContext:t.fileContext?{changedFileCount:t.fileContext.changedFileCount,hasTurnFileChanges:t.fileContext.hasTurnFileChanges,diffOpenState:t.fileContext.diffOpenState}:void 0,browserContext:t.browserContext?{hadToastError:t.browserContext.hadToastError,visiblePanel:t.browserContext.visiblePanel}:void 0,telemetryStatus:t.telemetryStatus,redactionVersion:e,createdAt:t.createdAt}}function fv(t,e){let n={rollupId:e.rollupId,periodStart:e.periodStart,periodEnd:e.periodEnd,total:0,upCount:0,downCount:0,byReason:{},byModel:{},byAgentMode:{},telemetryStatusCounts:{complete:0,partial:0,missing:0},redactionVersion:e.redactionVersion??Dn,createdAt:new Date().toISOString()};for(let r of t){n.total+=1,r.rating==="up"?n.upCount+=1:n.downCount+=1,r.rating==="down"&&r.reason&&(n.byReason[r.reason]=(n.byReason[r.reason]??0)+1);let o=r.model??"unknown",s=n.byModel[o]??={up:0,down:0};s[r.rating]+=1;let i=r.agentMode??"unknown",a=n.byAgentMode[i]??={up:0,down:0};a[r.rating]+=1,n.telemetryStatusCounts[r.telemetryStatus]+=1}return n}import{randomUUID as jj}from"node:crypto";import*as bc from"node:fs";import*as Sc from"node:path";var Hj=6,Fj=6e4,Uj=30*6e4;function hv(t){return Sc.join(Vt(t),"feedback","outbox.json")}async function wc(t){try{let e=JSON.parse(await bc.promises.readFile(hv(t),"utf8"));return Array.isArray(e)?e:[]}catch{return[]}}async function bg(t,e){let n=hv(t);await bc.promises.mkdir(Sc.dirname(n),{recursive:!0}),await bc.promises.writeFile(n,JSON.stringify(e,null,2),"utf8")}function Bj(t){return Math.min(Fj*2**Math.max(0,t-1),Uj)}async function yv(t,e,n=new Date){let r=await wc(t),o=r.find(a=>a.idempotencyKey===e.idempotencyKey);if(o)return o;let s=n.toISOString(),i={entryId:jj(),idempotencyKey:e.idempotencyKey,op:e.op,payload:e.payload,attempts:0,createdAt:s,nextAttemptAt:s};return r.push(i),await bg(t,r),i}async function kv(t,e=new Date){return(await wc(t)).filter(r=>r.attempts<Hj&&Date.parse(r.nextAttemptAt)<=e.getTime())}async function bv(t,e){let n=await wc(t),r=n.filter(o=>o.entryId!==e);r.length!==n.length&&await bg(t,r)}async function Sv(t,e,n,r=new Date){let o=await wc(t),s=o.find(i=>i.entryId===e);s&&(s.attempts+=1,s.lastError=n,s.nextAttemptAt=new Date(r.getTime()+Bj(s.attempts)).toISOString(),await bg(t,o))}async function wv(t,e={}){let n=process.env.QLOGIC_LLMROUTER_BASE_URL?.trim();if(!n)throw new Error("QLOGIC_LLMROUTER_BASE_URL not configured");let r=e.fetchFn??fetch,o=e.signal??e.init?.signal??void 0,s=Object.fromEntries(new Headers(e.init?.headers).entries()),i=process.env.QLOGIC_LLMROUTER_ACCESS_TOKEN?.trim();return i&&(s.authorization=`Bearer ${i}`),r(`${n.replace(/\/+$/,"")}/${t.replace(/^\/+/,"")}`,{...e.init,headers:s,signal:o})}function qj(){return"2.22.4"}function Wj(){let t=process.env.QLOGIC_LLMROUTER_BASE_URL?.trim();if(t)return`${t.replace(/\/+$/,"")}/client/feedback`}async function Sg(t,e){if(!Wj())return{ok:!1,error:"QLOGIC_LLMROUTER_BASE_URL not configured"};if(t.events.length===0)return{ok:!0,accepted:0};let r=e??AbortSignal.timeout(3e4);try{let o=await wv("/client/feedback/uploadBatch",{signal:r,init:Gj(t)});if(!o.ok){let i=await o.text().catch(()=>"");return{ok:!1,status:o.status,error:`HTTP ${o.status}${i?`: ${i.slice(0,200)}`:""}`}}return{ok:!0,accepted:(await o.json().catch(()=>({}))).accepted??t.events.length,status:o.status}}catch(o){return{ok:!1,error:o instanceof Error?o.message:String(o)}}}function Gj(t){return{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({batchId:t.batchId,events:t.events,rollups:t.rollups,redactionVersion:t.redactionVersion,clientBuild:t.clientBuild,runtimeVersion:t.runtimeVersion,qlogicagentVersion:t.qlogicagentVersion??qj(),uploadTarget:"llmrouter"})}}function zj(t){let e=t.map(r=>r.createdAt).sort(),n=new Date().toISOString();return{periodStart:e[0]??n,periodEnd:e[e.length-1]??n}}async function Kj(t,e){let n=0;for(let r of await kv(t,e)){let o=r.payload,s=await Sg({batchId:o.batchId,events:o.events,rollups:o.rollups??[],redactionVersion:o.redactionVersion??Dn});if(s.ok){for(let i of o.turnIds??[])await yg(t,i,o.batchId,o.redactionVersion??Dn);await bv(t,r.entryId),n+=1}else await Sv(t,r.entryId,s.error??"upload failed",e)}return n}async function Tv(t,e=new Date){let n=await Kj(t,e),r=await dv(t);if(r.length===0)return{uploaded:0,queued:0,retried:n};let o=vv(),s=r.map(p=>mv(p)),i=r.map(p=>p.turnId),{periodStart:a,periodEnd:c}=zj(r),l=fv(r,{rollupId:vv(),periodStart:a,periodEnd:c});if((await Sg({batchId:o,events:s,rollups:[l],redactionVersion:Dn})).ok){for(let p of i)await yg(t,p,o,Dn);return{uploaded:r.length,queued:0,retried:n}}for(let p of i)await uv(t,p,o);return await yv(t,{idempotencyKey:o,op:"uploadBatch",payload:{batchId:o,events:s,rollups:[l],turnIds:i,redactionVersion:Dn}},e),{uploaded:0,queued:r.length,retried:n}}import{createHash as Vj}from"node:crypto";var Yj=2;function Xj(t){return t.rating==="down"?`dislike:${t.reason??"other"}`:"like"}var Jj={"dislike:missed_requirement":"\u7528\u6237\u91CD\u89C6\u56DE\u7B54\u5B8C\u6574\u8986\u76D6\u5176\u9700\u6C42,\u4E0D\u8981\u9057\u6F0F\u660E\u786E\u63D0\u51FA\u7684\u8981\u6C42\u3002","dislike:incomplete":"\u7528\u6237\u91CD\u89C6\u4EA4\u4ED8\u7684\u5B8C\u6574\u6027,\u4E0D\u8981\u534A\u9014\u800C\u5E9F\u6216\u7559\u4E0B\u672A\u5B8C\u6210\u7684\u90E8\u5206\u3002","dislike:broken_file_link_or_panel":"\u7528\u6237\u91CD\u89C6\u6587\u4EF6\u94FE\u63A5\u3001\u53F3\u4FA7\u9762\u677F\u7B49\u4EA7\u7269\u771F\u5B9E\u53EF\u70B9\u51FB\u3001\u53EF\u6253\u5F00,\u4EA4\u4ED8\u524D\u5E94\u81EA\u884C\u9A8C\u8BC1\u3002","dislike:code_or_test_failed":"\u7528\u6237\u91CD\u89C6\u4EE3\u7801\u4E0E\u6D4B\u8BD5\u771F\u5B9E\u901A\u8FC7,\u4EA4\u4ED8\u524D\u5E94\u5B9E\u9645\u8FD0\u884C\u9A8C\u8BC1,\u800C\u975E\u4EC5\u58F0\u79F0\u5B8C\u6210\u3002","dislike:factually_wrong":"\u7528\u6237\u91CD\u89C6\u4E8B\u5B9E\u51C6\u786E\u6027,\u4E0D\u786E\u5B9A\u65F6\u5E94\u6838\u5B9E\u6765\u6E90\u800C\u975E\u81C6\u6D4B\u3002","dislike:too_verbose":"\u7528\u6237\u504F\u597D\u7B80\u6D01\u7684\u56DE\u7B54:\u76F4\u63A5\u7ED9\u7ED3\u8BBA\u548C\u5173\u952E\u8981\u70B9,\u907F\u514D\u5197\u957F\u94FA\u9648\u3002","dislike:too_short":"\u7528\u6237\u504F\u597D\u66F4\u5B8C\u6574\u3001\u6709\u4F9D\u636E\u7684\u56DE\u7B54,\u4E0D\u8981\u8FC7\u4E8E\u7B80\u7565\u3002","dislike:wrong_style":"\u7528\u6237\u5BF9\u56DE\u7B54\u98CE\u683C\u6709\u660E\u786E\u504F\u597D,\u5E94\u8D34\u5408\u5176\u671F\u671B\u7684\u8868\u8FBE\u98CE\u683C\u3002","dislike:other":"\u7528\u6237\u5BF9\u8FD9\u7C7B\u56DE\u7B54\u8868\u8FBE\u8FC7\u4E0D\u6EE1,\u9700\u7ED3\u5408\u4E0A\u4E0B\u6587\u6CE8\u610F\u6539\u8FDB\u3002",like:"\u7528\u6237\u8BA4\u53EF\u8FD9\u7C7B\u56DE\u7B54\u7684\u65B9\u5F0F\u4E0E\u8D28\u91CF,\u53EF\u7EE7\u7EED\u4FDD\u6301\u3002"};function Qj(t){return Jj[t]??"\u7528\u6237\u5BF9\u8FD9\u7C7B\u56DE\u7B54\u6709\u660E\u786E\u504F\u597D,\u5E94\u636E\u5176\u53CD\u9988\u8C03\u6574\u3002"}function Zj(t,e){let n=.45+.12*Math.min(t,4)+(e?.08:0);return Math.max(.3,Math.min(.85,Number(n.toFixed(4))))}function eH(t){return Math.max(.3,Math.min(.9,Number((.4+.1*t).toFixed(4))))}function tH(t,e){return Vj("sha256").update(`${t}
251
+ `);this.store.updateTask(n.taskId,i=>({...i,lifecycle:r.code===0?"completed":"failed",exitCode:r.code,output:gg(pn(s).cleanOutput),error:r.code===0?void 0:`exit code ${r.code}`,endedAt:Date.now()})),this.fireSettled(n.taskId)}).catch(r=>{this.settle(n.taskId,{lifecycle:"failed",error:r instanceof Error?r.message:String(r)})}).finally(()=>{this.bashHandles.delete(n.taskId)}),n}registerExternalTask(e,n){this.store.registerTask(e),this.externalControls.set(e.taskId,n)}settleExternalTask(e,n,r){this.externalControls.delete(e);let o=this.store.getTask(e);!o||dt(o.lifecycle)||(this.store.updateTask(e,s=>({...s,lifecycle:n,...r!=null?{output:r}:{},endedAt:Date.now()})),this.fireSettled(e))}settle(e,n){this.clearDeadline(e);let r=this.store.getTask(e);!r||dt(r.lifecycle)||(this.store.updateTask(e,o=>({...o,...n,endedAt:Date.now()})),this.fireSettled(e))}getTask(e){return this.store.getTask(e)}listTasks(){return this.store.getAllTasks()}async readOutput(e){let n=this.store.getTask(e);if(!n)return null;let r=!dt(n.lifecycle);if(r&&n.type==="local_bash"&&n.outputPath){let o="";try{o=(await gc(n.outputPath,sv)).output}catch{o=""}return{task:n,output:gg(ov(Mn(o))),running:r}}if(r){let o=this.externalControls.get(e);if(o?.readStatus)return{task:n,output:ov(o.readStatus()),running:r}}return{task:n,output:n.output??"",running:r}}teardownExecutors(e){let n=this.bashHandles.get(e);if(n){try{n.kill()}catch{}this.bashHandles.delete(e)}let r=this.controllers.get(e);r&&(r.abort("cancelled"),this.controllers.delete(e));let o=this.externalControls.get(e);if(o){try{o.cancel()}catch{}this.externalControls.delete(e)}}armIdleReclaim(e,n){!Number.isFinite(n)||n<=0||(this.idleReclaimMs.set(e,n),this.lastProgressAt.set(e,Date.now()),this.scheduleIdleCheck(e))}markProgress(e){this.lastProgressAt.has(e)&&this.lastProgressAt.set(e,Date.now())}scheduleIdleCheck(e){let n=this.idleReclaimMs.get(e);if(n===void 0)return;let r=this.lastProgressAt.get(e)??Date.now(),o=Math.max(0,n-(Date.now()-r)),s=setTimeout(()=>this.onIdleCheck(e),o||n);s.unref?.(),this.deadlineTimers.set(e,s)}onIdleCheck(e){let n=this.idleReclaimMs.get(e);if(n===void 0)return;Date.now()-(this.lastProgressAt.get(e)??0)>=n?this.enforceIdleTimeout(e,n):this.scheduleIdleCheck(e)}clearDeadline(e){let n=this.deadlineTimers.get(e);n&&(clearTimeout(n),this.deadlineTimers.delete(e)),this.lastProgressAt.delete(e),this.idleReclaimMs.delete(e)}enforceIdleTimeout(e,n){this.clearDeadline(e);let r=this.store.getTask(e);!r||dt(r.lifecycle)||(this.teardownExecutors(e),this.store.updateTask(e,o=>({...o,lifecycle:"timeout",error:o.error??`background task reclaimed after ${Math.round(n/1e3)}s with no progress (no output or tool activity)`,endedAt:Date.now()})),this.fireSettled(e))}cancelTask(e){let n=this.store.getTask(e);return!n||dt(n.lifecycle)?!1:(this.clearDeadline(e),this.teardownExecutors(e),this.store.updateTask(e,r=>({...r,lifecycle:"cancelled",endedAt:Date.now()})),!0)}cancelTasksForSession(e,n){if(!e)return[];let r=[];for(let o of this.store.getAllTasks())o.launchSessionId===e&&(!n||o.launchTurnId===n)&&!dt(o.lifecycle)&&this.cancelTask(o.taskId)&&r.push(o.taskId);return r}cancelAllRunning(){let e=[];for(let n of this.store.getAllTasks())dt(n.lifecycle)||this.cancelTask(n.taskId)&&e.push(n.taskId);return e}};function hc(){return vt()?.type==="group"}var mg=new Set;function iv(t){return mg.add(t),()=>{mg.delete(t)}}async function av(){await Promise.all(Array.from(mg).map(t=>t()))}import{randomUUID as vv}from"node:crypto";import{createHash as $8}from"node:crypto";import{randomUUID as j8}from"node:crypto";import*as Eo from"node:fs";import*as kc from"node:path";function yc(t){return kc.join(Vt(t),"feedback","events")}function cv(t,e){return kc.join(yc(t),`${encodeURIComponent(e)}.json`)}async function fg(t,e){try{return JSON.parse(await Eo.promises.readFile(cv(t,e),"utf8"))}catch{return null}}async function hg(t){t.projectId&&(await Eo.promises.mkdir(yc(t.projectId),{recursive:!0}),await Eo.promises.writeFile(cv(t.projectId,t.turnId),JSON.stringify(t,null,2),"utf8"))}async function lv(t){let e;try{e=(await Eo.promises.readdir(yc(t),{withFileTypes:!0})).filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>r.name)}catch{return[]}let n=[];for(let r of e)try{n.push(JSON.parse(await Eo.promises.readFile(kc.join(yc(t),r),"utf8")))}catch{continue}return n}async function dv(t){return(await lv(t)).filter(e=>e.upload?.eligible!==!1&&!e.upload?.uploadBatchId)}async function uv(t,e,n){let r=await fg(t,e);r&&(r.upload={eligible:r.upload?.eligible??!0,uploadBatchId:n},await hg(r))}async function yg(t,e,n,r){let o=await fg(t,e);o&&(o.upload={eligible:o.upload?.eligible??!0,uploadBatchId:n,uploadedAt:new Date().toISOString(),redactionVersion:r},await hg(o))}async function pv(t){return(await lv(t)).filter(e=>e.state==="active")}async function gv(t,e,n){let r=await fg(t,e);r&&(r.distill={proposedAt:new Date().toISOString(),clusterKey:n.clusterKey,idempotencyKey:n.idempotencyKey},await hg(r))}import{createHash as Oj}from"node:crypto";var Dn="feedback-redaction-v1",Nj=500;function kg(t){return Oj("sha256").update(t,"utf8").digest("hex")}var $j=[[/sk-[A-Za-z0-9_-]{8,}/g,"[redacted-key]"],[/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b/g,"[redacted-email]"],[/(?:[A-Za-z]:\\|\/)(?:Users|home|root|var|opt|etc|tmp)[\\/][^\s'"`)]+/gi,"[redacted-path]"]];function Lj(t){let e=(t??"").slice(0,Nj);for(let[n,r]of $j)e=e.replace(n,r);return e}function mv(t,e=Dn){return{feedbackId:t.feedbackId,rating:t.rating,reason:t.reason,state:t.state,messageHash:t.messageHash,sessionIdHash:kg(t.sessionId),projectIdHash:t.projectId?kg(t.projectId):void 0,turnIdHash:kg(t.turnId),messagePreview:Lj(t.messagePreview),model:t.model,provider:t.provider,agentMode:t.agentMode,sourceChannel:t.sourceChannel,usage:t.usage,toolSummary:t.toolSummary,fileContext:t.fileContext?{changedFileCount:t.fileContext.changedFileCount,hasTurnFileChanges:t.fileContext.hasTurnFileChanges,diffOpenState:t.fileContext.diffOpenState}:void 0,browserContext:t.browserContext?{hadToastError:t.browserContext.hadToastError,visiblePanel:t.browserContext.visiblePanel}:void 0,telemetryStatus:t.telemetryStatus,redactionVersion:e,createdAt:t.createdAt}}function fv(t,e){let n={rollupId:e.rollupId,periodStart:e.periodStart,periodEnd:e.periodEnd,total:0,upCount:0,downCount:0,byReason:{},byModel:{},byAgentMode:{},telemetryStatusCounts:{complete:0,partial:0,missing:0},redactionVersion:e.redactionVersion??Dn,createdAt:new Date().toISOString()};for(let r of t){n.total+=1,r.rating==="up"?n.upCount+=1:n.downCount+=1,r.rating==="down"&&r.reason&&(n.byReason[r.reason]=(n.byReason[r.reason]??0)+1);let o=r.model??"unknown",s=n.byModel[o]??={up:0,down:0};s[r.rating]+=1;let i=r.agentMode??"unknown",a=n.byAgentMode[i]??={up:0,down:0};a[r.rating]+=1,n.telemetryStatusCounts[r.telemetryStatus]+=1}return n}import{randomUUID as jj}from"node:crypto";import*as bc from"node:fs";import*as Sc from"node:path";var Hj=6,Fj=6e4,Uj=30*6e4;function hv(t){return Sc.join(Vt(t),"feedback","outbox.json")}async function wc(t){try{let e=JSON.parse(await bc.promises.readFile(hv(t),"utf8"));return Array.isArray(e)?e:[]}catch{return[]}}async function bg(t,e){let n=hv(t);await bc.promises.mkdir(Sc.dirname(n),{recursive:!0}),await bc.promises.writeFile(n,JSON.stringify(e,null,2),"utf8")}function Bj(t){return Math.min(Fj*2**Math.max(0,t-1),Uj)}async function yv(t,e,n=new Date){let r=await wc(t),o=r.find(a=>a.idempotencyKey===e.idempotencyKey);if(o)return o;let s=n.toISOString(),i={entryId:jj(),idempotencyKey:e.idempotencyKey,op:e.op,payload:e.payload,attempts:0,createdAt:s,nextAttemptAt:s};return r.push(i),await bg(t,r),i}async function kv(t,e=new Date){return(await wc(t)).filter(r=>r.attempts<Hj&&Date.parse(r.nextAttemptAt)<=e.getTime())}async function bv(t,e){let n=await wc(t),r=n.filter(o=>o.entryId!==e);r.length!==n.length&&await bg(t,r)}async function Sv(t,e,n,r=new Date){let o=await wc(t),s=o.find(i=>i.entryId===e);s&&(s.attempts+=1,s.lastError=n,s.nextAttemptAt=new Date(r.getTime()+Bj(s.attempts)).toISOString(),await bg(t,o))}async function wv(t,e={}){let n=process.env.QLOGIC_LLMROUTER_BASE_URL?.trim();if(!n)throw new Error("QLOGIC_LLMROUTER_BASE_URL not configured");let r=e.fetchFn??fetch,o=e.signal??e.init?.signal??void 0,s=Object.fromEntries(new Headers(e.init?.headers).entries()),i=process.env.QLOGIC_LLMROUTER_ACCESS_TOKEN?.trim();return i&&(s.authorization=`Bearer ${i}`),r(`${n.replace(/\/+$/,"")}/${t.replace(/^\/+/,"")}`,{...e.init,headers:s,signal:o})}function qj(){return"2.22.5"}function Wj(){let t=process.env.QLOGIC_LLMROUTER_BASE_URL?.trim();if(t)return`${t.replace(/\/+$/,"")}/client/feedback`}async function Sg(t,e){if(!Wj())return{ok:!1,error:"QLOGIC_LLMROUTER_BASE_URL not configured"};if(t.events.length===0)return{ok:!0,accepted:0};let r=e??AbortSignal.timeout(3e4);try{let o=await wv("/client/feedback/uploadBatch",{signal:r,init:Gj(t)});if(!o.ok){let i=await o.text().catch(()=>"");return{ok:!1,status:o.status,error:`HTTP ${o.status}${i?`: ${i.slice(0,200)}`:""}`}}return{ok:!0,accepted:(await o.json().catch(()=>({}))).accepted??t.events.length,status:o.status}}catch(o){return{ok:!1,error:o instanceof Error?o.message:String(o)}}}function Gj(t){return{method:"POST",headers:{"content-type":"application/json",accept:"application/json"},body:JSON.stringify({batchId:t.batchId,events:t.events,rollups:t.rollups,redactionVersion:t.redactionVersion,clientBuild:t.clientBuild,runtimeVersion:t.runtimeVersion,qlogicagentVersion:t.qlogicagentVersion??qj(),uploadTarget:"llmrouter"})}}function zj(t){let e=t.map(r=>r.createdAt).sort(),n=new Date().toISOString();return{periodStart:e[0]??n,periodEnd:e[e.length-1]??n}}async function Kj(t,e){let n=0;for(let r of await kv(t,e)){let o=r.payload,s=await Sg({batchId:o.batchId,events:o.events,rollups:o.rollups??[],redactionVersion:o.redactionVersion??Dn});if(s.ok){for(let i of o.turnIds??[])await yg(t,i,o.batchId,o.redactionVersion??Dn);await bv(t,r.entryId),n+=1}else await Sv(t,r.entryId,s.error??"upload failed",e)}return n}async function Tv(t,e=new Date){let n=await Kj(t,e),r=await dv(t);if(r.length===0)return{uploaded:0,queued:0,retried:n};let o=vv(),s=r.map(p=>mv(p)),i=r.map(p=>p.turnId),{periodStart:a,periodEnd:c}=zj(r),l=fv(r,{rollupId:vv(),periodStart:a,periodEnd:c});if((await Sg({batchId:o,events:s,rollups:[l],redactionVersion:Dn})).ok){for(let p of i)await yg(t,p,o,Dn);return{uploaded:r.length,queued:0,retried:n}}for(let p of i)await uv(t,p,o);return await yv(t,{idempotencyKey:o,op:"uploadBatch",payload:{batchId:o,events:s,rollups:[l],turnIds:i,redactionVersion:Dn}},e),{uploaded:0,queued:r.length,retried:n}}import{createHash as Vj}from"node:crypto";var Yj=2;function Xj(t){return t.rating==="down"?`dislike:${t.reason??"other"}`:"like"}var Jj={"dislike:missed_requirement":"\u7528\u6237\u91CD\u89C6\u56DE\u7B54\u5B8C\u6574\u8986\u76D6\u5176\u9700\u6C42,\u4E0D\u8981\u9057\u6F0F\u660E\u786E\u63D0\u51FA\u7684\u8981\u6C42\u3002","dislike:incomplete":"\u7528\u6237\u91CD\u89C6\u4EA4\u4ED8\u7684\u5B8C\u6574\u6027,\u4E0D\u8981\u534A\u9014\u800C\u5E9F\u6216\u7559\u4E0B\u672A\u5B8C\u6210\u7684\u90E8\u5206\u3002","dislike:broken_file_link_or_panel":"\u7528\u6237\u91CD\u89C6\u6587\u4EF6\u94FE\u63A5\u3001\u53F3\u4FA7\u9762\u677F\u7B49\u4EA7\u7269\u771F\u5B9E\u53EF\u70B9\u51FB\u3001\u53EF\u6253\u5F00,\u4EA4\u4ED8\u524D\u5E94\u81EA\u884C\u9A8C\u8BC1\u3002","dislike:code_or_test_failed":"\u7528\u6237\u91CD\u89C6\u4EE3\u7801\u4E0E\u6D4B\u8BD5\u771F\u5B9E\u901A\u8FC7,\u4EA4\u4ED8\u524D\u5E94\u5B9E\u9645\u8FD0\u884C\u9A8C\u8BC1,\u800C\u975E\u4EC5\u58F0\u79F0\u5B8C\u6210\u3002","dislike:factually_wrong":"\u7528\u6237\u91CD\u89C6\u4E8B\u5B9E\u51C6\u786E\u6027,\u4E0D\u786E\u5B9A\u65F6\u5E94\u6838\u5B9E\u6765\u6E90\u800C\u975E\u81C6\u6D4B\u3002","dislike:too_verbose":"\u7528\u6237\u504F\u597D\u7B80\u6D01\u7684\u56DE\u7B54:\u76F4\u63A5\u7ED9\u7ED3\u8BBA\u548C\u5173\u952E\u8981\u70B9,\u907F\u514D\u5197\u957F\u94FA\u9648\u3002","dislike:too_short":"\u7528\u6237\u504F\u597D\u66F4\u5B8C\u6574\u3001\u6709\u4F9D\u636E\u7684\u56DE\u7B54,\u4E0D\u8981\u8FC7\u4E8E\u7B80\u7565\u3002","dislike:wrong_style":"\u7528\u6237\u5BF9\u56DE\u7B54\u98CE\u683C\u6709\u660E\u786E\u504F\u597D,\u5E94\u8D34\u5408\u5176\u671F\u671B\u7684\u8868\u8FBE\u98CE\u683C\u3002","dislike:other":"\u7528\u6237\u5BF9\u8FD9\u7C7B\u56DE\u7B54\u8868\u8FBE\u8FC7\u4E0D\u6EE1,\u9700\u7ED3\u5408\u4E0A\u4E0B\u6587\u6CE8\u610F\u6539\u8FDB\u3002",like:"\u7528\u6237\u8BA4\u53EF\u8FD9\u7C7B\u56DE\u7B54\u7684\u65B9\u5F0F\u4E0E\u8D28\u91CF,\u53EF\u7EE7\u7EED\u4FDD\u6301\u3002"};function Qj(t){return Jj[t]??"\u7528\u6237\u5BF9\u8FD9\u7C7B\u56DE\u7B54\u6709\u660E\u786E\u504F\u597D,\u5E94\u636E\u5176\u53CD\u9988\u8C03\u6574\u3002"}function Zj(t,e){let n=.45+.12*Math.min(t,4)+(e?.08:0);return Math.max(.3,Math.min(.85,Number(n.toFixed(4))))}function eH(t){return Math.max(.3,Math.min(.9,Number((.4+.1*t).toFixed(4))))}function tH(t,e){return Vj("sha256").update(`${t}
252
252
  ${e.join(",")}`).digest("hex").slice(0,32)}function Rv(t){let e=new Map;for(let r of t){if(r.state!=="active")continue;let o=Xj(r),s=e.get(o);s?s.push(r):e.set(o,[r])}let n=[];for(let[r,o]of e){if(o.length<Yj)continue;let s=o.map(c=>c.feedbackId).sort(),i=[...new Set(o.map(c=>c.turnId))].sort(),a=new Set(o.map(c=>c.sessionId)).size>=2;n.push({clusterKey:r,text:Qj(r),category:"preference",importance:eH(o.length),confidence:Zj(o.length,a),evidence:{kind:"feedback",refs:[...s,...i.map(c=>`turn:${c}`)],idempotencyKey:tH(r,s)},stats:{evidence:o.length,crossSession:a,feedbackIds:s,turnIds:i}})}return n.sort((r,o)=>r.clusterKey.localeCompare(o.clusterKey)),n}var Pv=()=>{};function Av(t){Pv=t}function Us(){return Pv()}async function Cv(t,e,n){if(!e.proposeExtracted)return{candidates:0,proposed:0};let r=Us(),o=r?await r.listDistillableFeedback(t):await pv(t);if(o.length===0)return{candidates:0,proposed:0};let s=Rv(o),i=0;for(let a of s)try{let c=await e.proposeExtracted([{text:a.text,category:a.category,importance:a.importance,confidence:a.confidence,evidence:a.evidence}],n,{source:"feedback"});i+=c?.proposalsAdded??0;for(let l of a.stats.turnIds){let d={clusterKey:a.clusterKey,idempotencyKey:a.evidence.idempotencyKey};r?await r.markFeedbackDistilled(t,l,d):await gv(t,l,d)}}catch(c){console.error(`[feedback:distill] candidate skipped (cluster ${a.clusterKey}): ${c instanceof Error?c.message:String(c)}`)}return{candidates:s.length,proposed:i}}import*as Pt from"node:fs";var vc=class{pools=new Map;runtimeStates=new Map;constructor(e){if(e)for(let n of e){this.pools.set(n.providerId,n);for(let r of n.keys)this.runtimeStates.set(r.id,this.createInitialState())}}acquireKey(e){let n=this.pools.get(e);if(!n||n.keys.length===0)return null;let r=Date.now(),o=this.getHealthyCandidates(n,r);if(o.length===0)return null;let s=this.selectByStrategy(o,n.strategy,r);if(!s)return null;let i=this.runtimeStates.get(s.id);i.inFlight++,i.totalRequests++,i.lastUsedAt=r,i.requestTimestamps.push(r);let a=!1;return{keyId:s.id,apiKey:s.key,providerId:e,release:c=>{a||(a=!0,this.releaseKey(s.id,c))}}}releaseKey(e,n){let r=this.runtimeStates.get(e);if(r)if(r.inFlight=Math.max(0,r.inFlight-1),n.success)r.consecutiveErrors=0,r.healthStatus="healthy",n.tokens&&(r.totalTokens+=n.tokens,r.tokenCounts.push({timestamp:Date.now(),tokens:n.tokens}));else if(r.consecutiveErrors++,r.lastErrorAt=Date.now(),n.errorCode===429){let o=n.retryAfter?n.retryAfter*1e3:3e4;r.cooldownUntil=Date.now()+o,r.healthStatus="cooldown"}else r.consecutiveErrors>=5?(r.cooldownUntil=Date.now()+6e4,r.healthStatus="cooldown"):r.consecutiveErrors>=3&&(r.healthStatus="degraded")}addProvider(e,n){this.pools.has(e)||this.pools.set(e,{providerId:e,baseUrl:n?.baseUrl,strategy:n?.strategy??"weighted-round-robin",keys:[],rateLimit:n?.rateLimit})}removeProvider(e){let n=this.pools.get(e);if(n){for(let r of n.keys)this.runtimeStates.delete(r.id);this.pools.delete(e)}}addKey(e,n,r){let o=this.pools.get(e);o||(o={providerId:e,strategy:"weighted-round-robin",keys:[]},this.pools.set(e,o));let s=r?.id??crypto.randomUUID(),i={id:s,key:n,label:r?.label,weight:r?.weight??1,enabled:r?.enabled??!0};return o.keys.push(i),this.runtimeStates.set(s,this.createInitialState()),s}removeKey(e){for(let[n,r]of this.pools){let o=r.keys.findIndex(s=>s.id===e);if(o!==-1)return r.keys.splice(o,1),r.keys.length===0&&this.pools.delete(n),this.runtimeStates.delete(e),!0}return!1}getKeyById(e){for(let n of this.pools.values()){let r=n.keys.find(o=>o.id===e);if(r)return r.key}return null}updateKey(e,n){for(let r of this.pools.values()){let o=r.keys.find(s=>s.id===e);if(o){if(n.label!==void 0&&(o.label=n.label),n.weight!==void 0&&(o.weight=n.weight),n.enabled!==void 0){o.enabled=n.enabled;let s=this.runtimeStates.get(e);s&&(s.healthStatus=n.enabled?"healthy":"disabled")}return!0}}return!1}setKeyHealth(e,n){let r=this.runtimeStates.get(e);r&&(r.healthStatus=n)}setStrategy(e,n){let r=this.pools.get(e);r&&(r.strategy=n)}setRateLimit(e,n){let r=this.pools.get(e);r&&(r.rateLimit=n)}getPoolStatus(e){let n=this.pools.get(e);return n?this.buildPoolStatus(n):null}getAllStatus(){return[...this.pools.values()].map(e=>this.buildPoolStatus(e))}getProviderIds(){return[...this.pools.keys()]}hasProvider(e){return this.pools.has(e)}hasAvailableKey(e){let n=this.pools.get(e);return n?this.getHealthyCandidates(n,Date.now()).length>0:!1}exportConfig(){return[...this.pools.values()]}reloadConfig(e){let n=new Set;for(let r of e){this.pools.set(r.providerId,r);for(let o of r.keys)n.add(o.id),this.runtimeStates.has(o.id)||this.runtimeStates.set(o.id,this.createInitialState())}for(let r of[...this.pools.keys()])e.some(o=>o.providerId===r)||this.pools.delete(r);for(let r of[...this.runtimeStates.keys()])n.has(r)||this.runtimeStates.delete(r)}createInitialState(){return{inFlight:0,totalRequests:0,totalTokens:0,lastUsedAt:0,lastErrorAt:0,consecutiveErrors:0,cooldownUntil:0,healthStatus:"healthy",requestTimestamps:[],tokenCounts:[]}}getHealthyCandidates(e,n){let r=[];for(let o of e.keys){if(!o.enabled)continue;let s=this.runtimeStates.get(o.id);if(s){if(s.healthStatus==="cooldown")if(n>=s.cooldownUntil)s.healthStatus="healthy",s.consecutiveErrors=0;else continue;s.healthStatus!=="disabled"&&(e.rateLimit?.rpm&&(this.pruneWindow(s.requestTimestamps,n),s.requestTimestamps.length>=e.rateLimit.rpm*.9)||e.rateLimit?.tpm&&(this.pruneTokenWindow(s.tokenCounts,n),s.tokenCounts.reduce((a,c)=>a+c.tokens,0)>=e.rateLimit.tpm*.9)||r.push(o))}}return r}selectByStrategy(e,n,r){if(e.length===0)return null;if(e.length===1)return e[0];switch(n){case"weighted-round-robin":return this.weightedRandom(e);case"least-busy":return this.leastBusy(e);case"random":return e[Math.floor(Math.random()*e.length)];default:return this.weightedRandom(e)}}weightedRandom(e){let n=e.reduce((o,s)=>o+s.weight,0),r=Math.random()*n;for(let o of e)if(r-=o.weight,r<=0)return o;return e[e.length-1]}leastBusy(e){let n=1/0,r=e[0];for(let o of e){let i=this.runtimeStates.get(o.id)?.inFlight??0;(i<n||i===n&&o.weight>r.weight)&&(n=i,r=o)}return r}pruneWindow(e,n){let r=n-6e4;for(;e.length>0&&e[0]<r;)e.shift()}pruneTokenWindow(e,n){let r=n-6e4;for(;e.length>0&&e[0].timestamp<r;)e.shift()}buildPoolStatus(e){return{providerId:e.providerId,baseUrl:e.baseUrl,strategy:e.strategy,rateLimit:e.rateLimit,keys:e.keys.map(n=>{let r=this.runtimeStates.get(n.id)??this.createInitialState();return{...n,inFlight:r.inFlight,totalRequests:r.totalRequests,totalTokens:r.totalTokens,lastUsedAt:r.lastUsedAt,lastErrorAt:r.lastErrorAt,consecutiveErrors:r.consecutiveErrors,cooldownUntil:r.cooldownUntil,healthStatus:n.enabled?r.healthStatus:"disabled"}})}}};var xv=[...Rw];function Bs(t){if(t==="llmrouter")return process.env.QLOGIC_LLMROUTER_INFERENCE_KEY?.trim()||void 0}var Ir="llmrouter-env";function nH(t={}){if(t.removed)return null;let e=Bs("llmrouter");if(!e)return null;let n=t.enabled!==!1;return{providerId:"llmrouter",strategy:"weighted-round-robin",keys:[{id:Ir,key:e,label:"Desktop LLMRouter",weight:1,enabled:n,inFlight:0,totalRequests:0,totalTokens:0,lastUsedAt:0,lastErrorAt:0,consecutiveErrors:0,cooldownUntil:0,healthStatus:n?"healthy":"disabled"}]}}var wg=class{keyPool;catalogProviders=new Map;models=new Map;modelEnabledOverrides=new Map;modelPurposeDisabled=new Map;bindings={};injectedKeyStates={};settingsPath;changeListeners=[];hydratedFromUpstream=!1;constructor(e){this.settingsPath=yo(),this.keyPool=new vc(e?.providers),e?.models&&this.loadModelState(e.models),e?.bindings&&(this.bindings={...e.bindings}),e?.injectedKeys&&(this.injectedKeyStates={...e.injectedKeys})}isHydratedFromUpstream(){return this.hydratedFromUpstream}markHydratedFromUpstream(){this.hydratedFromUpstream=!0}getActiveModel(e){let n=this.bindings[e];if(!n)return null;let r=this.models.get(n);if(!r||!this.isEnabledForPurpose(n,e))return null;let o=this.resolveTechnicalVariant(r,e),s=o?.provider??r.provider,i=o?.nativeModelId??r.nativeModelId??r.model,a=this.acquireKeyForProviderVariant(s);if(!a)return null;let{keyHandle:c,keyProviderId:l}=a,d=this.getProviderBaseUrl(s),u=this.getProviderBaseUrl(l);return{provider:s,model:i,apiKey:c.apiKey,baseUrl:d??(r.provider===s?r.baseUrl:void 0)??u,keyHandle:c}}peekActiveModel(e){let n=this.bindings[e];return n?this.models.get(n)??null:null}acceptsInputModality(e,n="textGeneration"){let r=this.peekActiveModel(n)?.capabilityProfile?.input_modalities;return!r||r.length===0?!0:r.includes(e)}isAvailable(e){let n=this.peekActiveModel(e);return!!n&&this.isEnabledForPurpose(n.id,e)&&this.hasAvailableKeyForProviderVariant(n.provider)}isEnabledForPurpose(e,n){let r=this.models.get(e);return!r||!r.enabled?!1:!this.modelPurposeDisabled.get(e)?.has(n)}resolveModelForPurpose(e){let n=this.peekActiveModel(e);return n?n.model:null}addProvider(e,n){this.keyPool.addProvider(e,n),this.emitChange()}removeProvider(e){this.keyPool.removeProvider(e);for(let[n,r]of this.models)r.provider===e&&this.removeModel(n);this.emitChange()}addKey(e,n,r){let o=this.keyPool.addKey(e,n,r);return this.emitChange(),o}removeKey(e){if(e===Ir)return this.hasLlmrouterEnvKey()?(this.setInjectedKeyState(e,{removed:!0,enabled:!1}),!0):!1;let n=this.keyPool.removeKey(e);return n&&this.emitChange(),n}getKeyById(e){return e===Ir?this.getInjectedKeyState(e).removed?null:Bs("llmrouter")??null:this.keyPool.getKeyById(e)}updateKey(e,n){if(e===Ir)return this.hasLlmrouterEnvKey()?(n.enabled!==void 0&&this.setInjectedKeyState(e,{enabled:n.enabled}),!0):!1;let r=this.keyPool.updateKey(e,n);return r&&this.emitChange(),r}setKeyHealth(e,n){this.keyPool.setKeyHealth(e,n),this.emitChange()}setStrategy(e,n){this.keyPool.setStrategy(e,n),this.emitChange()}addModel(e){let n=e.id??`${e.provider}:${e.model}`;return this.models.set(n,{...e,id:n,enabled:this.modelEnabledOverrides.get(n)??e.enabled,disabledPurposes:this.purposeDisabledArray(n)}),this.emitChange(),n}replaceCatalogProviders(e){this.catalogProviders=new Map(e.map(n=>[n.id,n]))}replaceCatalogModels(e){let n=new Map;for(let r of e)n.set(r.id,{...r,enabled:this.modelEnabledOverrides.get(r.id)??r.enabled,disabledPurposes:this.purposeDisabledArray(r.id)});for(let r of this.modelEnabledOverrides.keys())n.has(r)||this.modelEnabledOverrides.delete(r);for(let r of this.modelPurposeDisabled.keys())n.has(r)||this.modelPurposeDisabled.delete(r);this.models=n;for(let[r,o]of Object.entries(this.bindings))o&&!this.models.has(o)&&delete this.bindings[r];this.emitChange()}replaceProviderModels(e,n){let r=new Map;for(let[s,i]of this.models)i.provider!==e&&r.set(s,i);for(let s of n)s.provider===e&&r.set(s.id,{...s,enabled:this.modelEnabledOverrides.get(s.id)??s.enabled,disabledPurposes:this.purposeDisabledArray(s.id)});let o=`${e}:`;for(let s of this.modelEnabledOverrides.keys())s.startsWith(o)&&!r.has(s)&&this.modelEnabledOverrides.delete(s);for(let s of this.modelPurposeDisabled.keys())s.startsWith(o)&&!r.has(s)&&this.modelPurposeDisabled.delete(s);this.models=r;for(let[s,i]of Object.entries(this.bindings))i&&!this.models.has(i)&&delete this.bindings[s];this.emitChange()}removeModel(e){this.models.delete(e),this.modelEnabledOverrides.delete(e),this.modelPurposeDisabled.delete(e);for(let[n,r]of Object.entries(this.bindings))r===e&&delete this.bindings[n];this.emitChange()}enableModel(e,n){if(n){let r=new Set(this.modelPurposeDisabled.get(e)??[]);if(!this.isMasterEnabled(e)){let o=this.models.get(e);for(let s of o?.routeIntents??[])s!==n&&r.add(s)}r.delete(n),this.setPurposeDisabled(e,r),this.setMasterEnabled(e,!0)}else this.setPurposeDisabled(e,new Set),this.setMasterEnabled(e,!0);this.emitChange()}disableModel(e,n){if(n){let r=new Set(this.modelPurposeDisabled.get(e)??[]);r.add(n),this.setPurposeDisabled(e,r);let o=this.models.get(e),s=!!o&&o.routeIntents.length>0&&o.routeIntents.every(i=>r.has(i));this.setMasterEnabled(e,!s)}else this.setPurposeDisabled(e,new Set),this.setMasterEnabled(e,!1);this.emitChange()}isMasterEnabled(e){let n=this.models.get(e);return n?n.enabled:this.modelEnabledOverrides.get(e)??!0}setMasterEnabled(e,n){let r=this.models.get(e);r&&(r.enabled=n),this.modelEnabledOverrides.set(e,n)}setPurposeDisabled(e,n){n.size===0?this.modelPurposeDisabled.delete(e):this.modelPurposeDisabled.set(e,n);let r=this.models.get(e);r&&(r.disabledPurposes=n.size?[...n]:void 0)}purposeDisabledArray(e){let n=this.modelPurposeDisabled.get(e);return n&&n.size?[...n]:void 0}listModels(e){let n=[...this.models.values()];if(e?.purpose&&(n=n.filter(r=>r.routeIntents.includes(e.purpose))),e?.provider&&(n=n.filter(r=>r.provider===e.provider)),e?.enabledOnly){let r=e.purpose;n=r?n.filter(o=>this.isEnabledForPurpose(o.id,r)):n.filter(o=>o.enabled)}return n}getModel(e){return this.models.get(e)??null}setBinding(e,n){let r=this.models.get(n);if(!r)throw new Error(`Model "${n}" not found in pool.`);if(!r.routeIntents.includes(e))throw new Error(`Model "${n}" does not support purpose "${e}".`);this.bindings[e]=n,this.emitChange()}removeBinding(e){delete this.bindings[e],this.emitChange()}getBinding(e){let n=this.bindings[e];return n?this.models.get(n)??null:null}getAllBindings(){let e={};for(let n of xv){let r=this.bindings[n];e[n]=r?this.models.get(r)??null:null}return e}getProviderStatus(e){return this.keyPool.getPoolStatus(e)}getAllProviderStatus(){let e=this.keyPool.getAllStatus(),n=nH(this.getInjectedKeyState(Ir));return n?e.find(o=>o.providerId===n.providerId)?e.map(o=>o.providerId===n.providerId?{...o,keys:[...o.keys,...n.keys]}:o):[...e,n]:e}save(){let e={};try{e=JSON.parse(Pt.readFileSync(this.settingsPath,"utf-8"))}catch(o){if(o.code!=="ENOENT")throw new Error(`[model-registry] settings.json at ${this.settingsPath} is unreadable or corrupted (${o instanceof Error?o.message:String(o)}); refusing to save model config over it. Fix or remove the file, then retry.`)}delete e.provider,delete e.apiKey,delete e.model,delete e.baseUrl;let n={...e,providers:this.keyPool.exportConfig(),models:this.exportModelState(),bindings:{...this.bindings},injectedKeys:this.exportInjectedKeyStates()},r=this.settingsPath.replace(/[/\\][^/\\]+$/,"");Pt.existsSync(r)||Pt.mkdirSync(r,{recursive:!0}),Pt.writeFileSync(this.settingsPath,JSON.stringify(n,null,2),"utf-8")}load(){try{if(!Pt.existsSync(this.settingsPath))return!1;let e=Pt.readFileSync(this.settingsPath,"utf-8"),n=JSON.parse(e);return n.providers&&this.keyPool.reloadConfig(n.providers),this.models.clear(),this.modelEnabledOverrides.clear(),this.modelPurposeDisabled.clear(),n.models&&this.loadModelState(n.models),this.bindings=n.bindings??{},this.injectedKeyStates=n.injectedKeys?{...n.injectedKeys}:{},this.emitChange(),!0}catch{return!1}}exportConfig(){return{providers:this.keyPool.exportConfig(),models:this.exportModelState(),bindings:{...this.bindings},injectedKeys:this.exportInjectedKeyStates()}}getTunable(e){try{if(!Pt.existsSync(this.settingsPath))return;let n=Pt.readFileSync(this.settingsPath,"utf-8");return JSON.parse(n).tunables?.[e]}catch{return}}getModelInfo(e,n){let r=this.listModels({provider:e}).find(o=>o.model===n);if(r)return{id:r.model,name:r.displayName,contextWindow:r.contextWindow,maxOutput:r.maxOutput,streamRequired:r.streamRequired}}getProviderDefaultModel(e){return this.listModels({provider:e,enabledOnly:!0})[0]?.model??this.listModels({provider:e})[0]?.model}hasConfiguredKeyForProviderVariant(e){return this.providerVariantKeyCandidates(e).some(n=>!!this.keyPool.getPoolStatus(n)?.keys.some(o=>o.enabled))||this.hasEnabledLlmrouterEnvKey(e)}hasAvailableKeyForProviderVariant(e){return this.providerVariantKeyCandidates(e).some(n=>this.keyPool.hasAvailableKey(n))||this.hasEnabledLlmrouterEnvKey(e)}listProviderDefs(){return this.keyPool.getAllStatus().map(e=>({id:e.providerId,name:e.providerId,transport:"",baseUrl:e.baseUrl??"",defaultModel:this.getProviderDefaultModel(e.providerId),models:this.listModels({provider:e.providerId}).map(n=>({id:n.model,name:n.displayName,contextWindow:n.contextWindow,maxOutput:n.maxOutput,streamRequired:n.streamRequired}))}))}getKnownProviderDef(e){return this.catalogProviders.get(e)??null}resolveProviderApiKey(e){return this.getKeyForProvider(e)??void 0}onChange(e){return this.changeListeners.push(e),()=>{let n=this.changeListeners.indexOf(e);n>=0&&this.changeListeners.splice(n,1)}}getKeyForProvider(e){let r=this.acquireKeyForProviderVariant(e)?.keyHandle;if(!r)return null;let o=r.apiKey;return r.release({success:!0}),o}snapshotProviderKeys(){let e={};for(let n of this.getAllProviderStatus()){let r=this.getKeyForProvider(n.providerId);r&&(e[n.providerId]=r)}return e}getProviderBaseUrl(e){return this.catalogProviders.get(e)?.baseUrl??this.keyPool.getPoolStatus(e)?.baseUrl}acquireKeyForProviderVariant(e){for(let r of this.providerVariantKeyCandidates(e)){let o=this.keyPool.acquireKey(r);if(o)return{keyHandle:o,keyProviderId:r}}let n=this.hasEnabledLlmrouterEnvKey(e)?Bs(e):void 0;return n?{keyHandle:{keyId:"llmrouter-env",apiKey:n,providerId:e,release:()=>{}},keyProviderId:e}:null}resolveTechnicalVariant(e,n){return{provider:e.provider,nativeModelId:e.nativeModelId??e.model}}providerVariantKeyCandidates(e){return[e]}hasLlmrouterEnvKey(){return!this.getInjectedKeyState(Ir).removed&&!!Bs("llmrouter")}hasEnabledLlmrouterEnvKey(e){if(e!=="llmrouter")return!1;let n=this.getInjectedKeyState(Ir);return!n.removed&&n.enabled!==!1&&!!Bs(e)}getInjectedKeyState(e){return this.injectedKeyStates[e]??{}}setInjectedKeyState(e,n){this.injectedKeyStates={...this.injectedKeyStates,[e]:{...this.getInjectedKeyState(e),...n}},this.emitChange()}loadModelState(e){for(let n of e)if(!(typeof n.id!="string"||!n.id)&&(typeof n.enabled=="boolean"&&this.modelEnabledOverrides.set(n.id,n.enabled),Array.isArray(n.disabledPurposes))){let r=n.disabledPurposes.filter(o=>xv.includes(o));r.length&&this.modelPurposeDisabled.set(n.id,new Set(r))}}exportModelState(){let e=new Map;for(let[r,o]of this.modelEnabledOverrides)e.set(r,o);for(let r of this.models.values())e.set(r.id,r.enabled);return[...new Set([...e.keys(),...this.modelPurposeDisabled.keys()])].map(r=>{let o=this.modelPurposeDisabled.get(r),s={id:r,enabled:e.get(r)??!0};return o&&o.size&&(s.disabledPurposes=[...o]),s})}exportInjectedKeyStates(){return{...this.injectedKeyStates}}emitChange(){for(let e of this.changeListeners)try{e()}catch{}}},Tc=null;function we(){return Tc||(Tc=new wg,Tc.load()),Tc}function _o(t=process.env){return{get:e=>t[e]}}var rH="\u65E0\u6CD5\u8FDE\u63A5 llmrouter \u6A21\u578B\u76EE\u5F55",Er="llmrouter";var Iv=6e4,Tg=new Map,vg=new Map,gn=class extends Error{constructor(e=rH){super(e),this.name="LlmrouterCatalogUnavailableError"}},Rc=class extends Error{status;constructor(e,n="llmrouter inference key rejected (not active)"){super(n),this.name="LlmrouterAuthError",this.status=e}};function Pg(t=_o()){let e=t.get("QLOGIC_LLMROUTER_BASE_URL")?.trim().replace(/\/+$/,"");if(!e)throw new gn;return e}function Ev(t=_o()){let e={accept:"application/json"},n=t.get("QLOGIC_LLMROUTER_ACCESS_TOKEN")?.trim();return n&&(e.authorization=`Bearer ${n}`),e}async function _v(t,e){let n=Pg(e),r=Ev(e),o=`${n}
253
253
  ${t}
254
254
  ${r.authorization??""}`,s=Tg.get(o);if(s&&Date.now()<s.expiresAt)return s.value;let i=vg.get(o);if(i)return await i;let a=Dv(n,t,r).then(c=>(Tg.set(o,{value:c,expiresAt:Date.now()+Iv}),c)).finally(()=>{vg.delete(o)});return vg.set(o,a),a}async function Mv(t,e){let n=Pg(e),r=Ev(e),o=`${n}
@@ -384,7 +384,7 @@ ${Hg(n)}`)}catch(i){return console.error(`[context-compression] LLM summarizatio
384
384
 
385
385
  ${Hg(n)}`}}}function Hg(t){let e=[],n=t.filter(s=>s.role==="user"),r=n.slice(0,20).map(s=>{let i=_t(typeof s.content=="string"?s.content:JSON.stringify(s.content??""));return`- [user]: ${i.slice(0,300)}${i.length>300?"...":""}`});e.push(`## User Requests (${n.length} messages)`),e.push(...r);let o=t.filter(s=>s.role==="assistant");if(o.length>0){let s=o.slice(0,10).map(i=>{let a=_t(typeof i.content=="string"?i.content:JSON.stringify(i.content??""));return`- [assistant]: ${a.slice(0,150)}${a.length>150?"...":""}`});e.push("",`## Assistant Responses (${o.length} total)`),e.push(...s)}return e.join(`
386
386
  `)}function TF(){return cu(new ar(Ug),new Pn(20,Or),new ro(Or))}function wT(t,e){let n=lu(new ar(Ug),new Pn(20,Or),new ls({protectedHeadExchanges:1,protectedTailMessages:8,summarize:t,estimateTokens:Or}),new ro(Or));return new ds({inner:n,estimateTokens:Or,onCacheInvalidated:e?.onCacheInvalidated})}var Bg=null;function Vs(t,e){let n=e?.budget??ha({modelContextWindow:vT(e?.model)}),o=(e?.pipeline??TF()).compress(t,n);if(o.droppedCount>0){let s=Nr(t),i=Nr(o.messages);TT.record({timestamp:Date.now(),strategy:o.strategy,tokensBefore:s,tokensAfter:i,droppedCount:o.droppedCount,latencyMs:o.metrics?.latencyMs??0,usedLlm:!1,cacheInvalidated:o.metrics?.cacheInvalidated??!1,tier:ms(s,n)})}return o.droppedCount>0&&Bg?.(o.droppedCount,Nr(o.messages)),o}async function RF(t,e,n){let r=n??ha({modelContextWindow:vT(e.model)}),o=Nr(t),s=ms(o,r),i;switch(s){case"none":i={messages:t,droppedCount:0,strategy:"none"};break;case"trim-only":i=new ar(Ug).compress(t,r);break;case"sliding-window":{i=await wT(e.summarize).compressAsync(t,r);break}case"llm-summarize":{let a=e.pipeline??wT(e.summarize);i=gs(a)?await a.compressAsync(t,r):a.compress(t,r);break}}return i.droppedCount>0&&(i={...i,messages:await uu(i.messages,t,{maxFiles:5,maxTokenBudget:5e4,readFile:async a=>{try{return await bF(a,"utf-8")}catch{return null}}})}),PF(t,i,r),i}function PF(t,e,n){if(e.droppedCount>0||e.metrics?.usedLlm){let r=e.metrics?.tokensBefore||Nr(t),o=e.metrics?.tokensAfter||Nr(e.messages);TT.record({timestamp:Date.now(),strategy:e.strategy,tokensBefore:r,tokensAfter:o,droppedCount:e.droppedCount,latencyMs:e.metrics?.latencyMs??0,usedLlm:e.metrics?.usedLlm??!1,cacheInvalidated:e.metrics?.cacheInvalidated??!1,tier:ms(r,n)})}if(e.droppedCount>0){let r=e.metrics?.tokensAfter||Nr(e.messages);Bg?.(e.droppedCount,r)}}function AF(t,e){let n=vF(t,e),r={id:"builtin-compressor",label:"4-Layer Compression Funnel (built-in)",async compressAsync(o,s,i){return RF(o,{budget:s,model:i?.model,sessionId:i?.sessionId,summarize:n},s)}};Fg.register(r),Fg.activate(r.id),t.info(`[context-compression] registered context engine: ${r.id}`)}function PT(t,e,n){AF(e,n),t.register({point:"context.before_compact",priority:50,label:"context-compression-bridge",handler:(r,o)=>{let s=o.messageCount;return s&&s>0&&e.debug(`[context-compression] before_compact: ${s} messages entering compression`),{action:"continue"}}}),Bg=(r,o)=>{e.debug(`[context-compression] after_compact: removed ${r}, ${o} tokens remaining`),t.invoke("context.after_compact",{sessionId:"",turnId:"",removedCount:r,tokenCount:o}).catch(()=>{})}}function AT(t,e,n){let r=n-e;return`[Budget] ${Math.round(t)}% used (${e.toLocaleString()} / ${n.toLocaleString()} tokens). ${r.toLocaleString()} tokens remaining. `+(t>=90?"Wrap up your current taskyou are near the token limit.":"Continue workingdo not summarize prematurely.")}function On(t){return t?.riskLevel?t.riskLevel:t?.isDangerous?"system":t?.isReadOnly?"read":t?.isEgress?"external_egress":"write"}function CF(t,e){if(!e)return!1;for(let n of e)try{if(new RegExp(n,"i").test(t))return!0}catch(r){console.error(`[tool-eligibility] invalid dangerousPatterns regex ${JSON.stringify(n)} ignored: ${String(r instanceof Error?r.message:r)}`)}return!1}function xF(t,e){let n=On(t.meta);return n==="write"&&CF(t.function.name,e.dangerousPatterns)?"system":n}function IF(t){return`risk_${t}`}function EF(t,e){let n=t.function.name,r=xF(t,e),o=[];return e.blockedToolNames?.includes(n)?(o.push("policy_blocked"),{decision:"deny",riskLevel:r,reasonCodes:o}):(o.push(IF(r)),t.meta?.requiresApproval||r==="system"||r==="external_egress"?(t.meta?.requiresApproval&&o.unshift("requires_approval"),{decision:"ask",riskLevel:r,reasonCodes:o}):{decision:"allow",riskLevel:r,reasonCodes:o})}function _F(t){switch(t){case"allow":return"eligible";case"ask":return"approval-required";case"deny":return"blocked-by-policy"}}function CT(t,e={}){let n=new Map,r=[],o=[],s=[];for(let i of t){let a=i.function.name,{decision:c,riskLevel:l,reasonCodes:d}=EF(i,e),u=_F(c),p={toolName:a,status:u,decision:c,riskLevel:l,approvalRequired:c==="ask",reasonCodes:d};if(n.set(a,p),c==="deny"){o.push(p);continue}r.push(i),c==="ask"&&s.push(p)}return{eligibleTools:r,blockedTools:o,approvalRequiredTools:s,eligibilityByName:n}}function Ic(){return{resolveModelForPurpose:t=>we().resolveModelForPurpose(t),toolLoop:{createContentReplacementState:Hb,enforceToolResultBudget:Yb,restoreRequiredContextMessages:(t,e,n)=>qb(t,e,n),getActiveContextCompressionEngine:()=>RT().getActive()??null,compressMessages:Vs,getBudgetContinuationMessage:AT,createStreamingToolExecutor:t=>new xc({...t,contextState:t.contextState}),resolveToolEligibility:(t,e)=>CT(t,e)}}}var Zt=({transport:t,apiKey:e,toolInvoker:n,log:r,hooks:o,maxRounds:s})=>new Tr({llmTransport:t,apiKey:e,toolInvoker:n,log:r,hooks:o,maxRounds:s,runtimePorts:Ic()});async function Do(t,e){let n=t.params??{},r=n.turnId??xT(),o=n.sessionId,s=n.config,i=e!==void 0,a=ze(),c=s?.memoryRoot||this.resolveMemoryRoot?.()||qg.join(a,"memory"),l=s?.transcriptDir||this.resolveTranscriptDir?.()||qg.join(a,"agent-logs"),d=s?.dreamSessionIds??[];t.id!==void 0&&this.sendResponse(t.id,{accepted:!0,turnId:r});let u=new AbortController,p=()=>u.abort(e?.reason);e?.aborted?p():e?.addEventListener("abort",p,{once:!0}),this.activeTurn=u,this.log(`dream ${r} starting (session: ${o}, sessions reviewing: ${d.length})`),i||this.sendNotification("system.activity",{category:"dream",level:"info",title:"\u68A6\u5883\u6574\u7406\u542F\u52A8",detail:`\u6B63\u5728\u56DE\u987E ${d.length} \u4E2A\u4F1A\u8BDD\u7684\u8BB0\u5FC6...`});let m={provider:s?.provider,model:s?.model,apiKey:s?.apiKey,baseUrl:s?.baseUrl,maxRounds:s?.maxRounds,temperature:s?.temperature,contextWindowTokens:s?.contextWindowTokens,maxOutputTokens:s?.maxOutputTokens,modelMaxOutputTokens:s?.modelMaxOutputTokens,reasoning:s?.reasoning,promptCacheKey:s?.promptCacheKey,promptCacheRetention:s?.promptCacheRetention,serviceTier:s?.serviceTier,openaiBuiltinTools:s?.openaiBuiltinTools,maxToolCalls:s?.maxToolCalls,parallelToolCalls:s?.parallelToolCalls,textVerbosity:s?.textVerbosity};{let f=m.provider??"",h=m.model??"";if(f&&h){let k=we().getModelInfo(f,h);k?.streamRequired&&(m.streamRequired=!0),!m.contextWindowTokens&&k?.contextWindow&&(m.contextWindowTokens=k.contextWindow)}}if(!this.resolveAgent(m)||!this.currentTransport){i||(this.sendNotification("turn.start",{turnId:r}),this.sendNotification("turn.error",{turnId:r,error:{message:"No LLM provider configured for dream.",code:"NO_PROVIDER"}})),e?.removeEventListener("abort",p),this.activeTurn===u&&(this.activeTurn=null);return}i||this.sendNotification("turn.start",{turnId:r});try{let f={context:{memoryRoot:c,transcriptDir:l,currentSessionId:o,listSessionsSince:async()=>d,currentSessionTurnCount:s?.currentSessionTurnCount??0},triggerConfig:{force:s?.force!==!1},transport:this.currentTransport,toolInvoker:{invoke:async(k,y,w,A)=>{if(y.startsWith("$"))return{result:w};let C=this.toolCatalog.findTool(y);if(!C||typeof C.execute!="function")return{result:"",error:`Unknown tool: ${y}`};let T=`tc_${xT().slice(0,8)}`;try{let S=JSON.parse(w),P=await C.execute(T,S,A);return{result:P.content.map(D=>D.text??"").join(`
387
- `),error:P.details?.error}}catch(S){return{result:"",error:S instanceof Error?S.message:String(S)}}}},createAgentRunner:Zt,tools:this.toolCatalog.getToolManifest(),taskStore:this.taskStore,apiKey:this.currentApiKey,model:m.model??this.currentModel,log:{info:k=>this.log(k),warn:k=>this.log(`[warn] ${k}`),error:k=>this.log(`[error] ${k}`),debug:k=>{this.verbose&&this.log(`[debug] ${k}`)}},hooks:this.currentHooks??void 0,parentSignal:u.signal,memoryProvider:this.memoryProvider??void 0,memoryUserId:this.memoryUserId||void 0},h=await gT(f);await MF(this,c),h.ok?i||(this.sendNotification("system.activity",{category:"dream",level:"success",title:"\u68A6\u5883\u6574\u7406\u5B8C\u6210",detail:`\u56DE\u987E ${h.sessionsReviewed} \u4E2A\u4F1A\u8BDD\uFF0C\u6574\u7406 ${h.filesTouched.length} \u4E2A\u8BB0\u5FC6\u6587\u4EF6\uFF0C\u8017\u65F6 ${h.durationMs}ms`}),this.sendNotification("memory.updated",{source:"dream",target:"consolidation",files:h.filesTouched}),this.sendNotification("turn.end",{turnId:r,content:`Dream consolidation completed. ${h.sessionsReviewed} sessions reviewed, ${h.filesTouched.length} files touched. Duration: ${h.durationMs}ms.`,usage:{inputTokens:0,outputTokens:0}})):i||(this.sendNotification("system.activity",{category:"dream",level:"error",title:"\u68A6\u5883\u6574\u7406\u5931\u8D25",detail:h.error??"\u672A\u77E5\u9519\u8BEF"}),this.sendNotification("turn.error",{turnId:r,error:{message:h.error??"Dream consolidation failed",code:"DREAM_FAILED"}})),this.log(`dream ${r} completed`)}catch(f){if(u.signal.aborted)i||(this.sendNotification("system.activity",{category:"dream",level:"warn",title:"\u68A6\u5883\u6574\u7406\u88AB\u4E2D\u65AD"}),this.sendNotification("turn.error",{turnId:r,error:{message:"Dream aborted",code:"ABORTED"}}));else{let h=f instanceof Error?f.message:String(f);i||(this.sendNotification("system.activity",{category:"dream",level:"error",title:"\u68A6\u5883\u6574\u7406\u5F02\u5E38",detail:h}),this.sendNotification("turn.error",{turnId:r,error:{message:h,code:"INTERNAL_ERROR"}}))}}finally{e?.removeEventListener("abort",p),this.activeTurn===u&&(this.activeTurn=null)}}async function MF(t,e){if(!(!t.memoryProvider||!t.memoryUserId)){try{let n=await hT({adapter:t.memoryProvider,userId:t.memoryUserId,memoryRoot:e,log:{info:r=>t.log(r),debug:r=>{t.verbose&&t.log(r)}}});n.ran&&t.log(`[decay] completed: decayed=${n.decayed} archived=${n.archived} duration=${n.durationMs}ms`)}catch(n){console.error(`[decay] post-dream decay error: ${n instanceof Error?n.message:String(n)}`)}try{let n=t.memoryProvider;if(typeof n.resolveConflicts=="function"){let r=await n.resolveConflicts(t.memoryUserId);(r.conflictsResolved>0||r.claimsPromoted>0)&&t.log(`[dream] resolved ${r.conflictsResolved} conflicts, promoted ${r.claimsPromoted} pending claims`)}}catch(n){console.error(`[consolidation] post-dream conflict resolution error: ${n instanceof Error?n.message:String(n)}`)}try{let n=t.memoryProvider;if(typeof n.consumePendingProposals=="function"){let r=await n.consumePendingProposals(t.memoryUserId);(r.committed>0||r.expiredIds.length>0)&&t.log(`[dream] proposal consumer: committed=${r.committed} merged=${r.merged} expired=${r.expiredIds.length} pending=${r.pendingLeft}`)}}catch(n){console.error(`[consolidation] post-dream proposal consume error: ${n instanceof Error?n.message:String(n)}`)}}}function DF(t){let e=$F(t.fetchFn??fetch,t.clientVersion),n=t.token.trim();return{async resolveInstall(r,o){let s=encodeURIComponent(r.trim());if(!s)throw new Error("resourceId is required.");let i=o?.trim(),a=i?`?version=${encodeURIComponent(i)}`:"",c=await ET(e,IT(t.baseUrl,`/api/v15/registry/resources/${s}/install${a}`),n,"GET"),l=Wg(c);if(!l)throw new Error("Community hub returned an invalid install resolution.");return l},async listResourceVersions(r){let o=encodeURIComponent(r.trim());if(!o)throw new Error("resourceId is required.");let s=await ET(e,IT(t.baseUrl,`/api/v15/registry/resources/${o}/versions`),n,"GET");return(Ec(s)&&Array.isArray(s.versions)?s.versions:[]).map(OT).filter(a=>!!a)}}}function MT(t){return{async resolveInstall(e,n){let r=await t.resolveInstall(e,n),o=Wg(r);if(!o)throw new Error("Community hub returned an invalid install resolution.");return o},async listResourceVersions(e){let n=await t.listResourceVersions(e);return(Ec(n)&&Array.isArray(n.versions)?n.versions:[]).map(OT).filter(o=>!!o)}}}function DT(t=_o()){let e=t.get("QLOGIC_LLMROUTER_ACCESS_TOKEN")?.trim();if(!e)return null;let n=OF(t);return DF({baseUrl:NF(t),token:e,clientVersion:n})}function OF(t){let e=t.get("QLOGIC_AGENT_VERSION")?.trim();return e||"2.22.4"}function NF(t){return t.get("QLOGIC_HUB_BASE_URL")?.trim()||t.get("XIAOZHICLAW_HUB_URL")?.trim()||"https://xiaozhi.qlogicagent.com"}function IT(t,e){let n=t.trim().replace(/\/+$/,"");return n.endsWith("/v1")&&(n=n.slice(0,-3)),n.endsWith("/api")&&(n=n.slice(0,-4)),`${n}${e}`}function $F(t,e){let n=e?.trim();return n?(r,o)=>t(r,{...o,headers:{...o?.headers,"x-client-version":n}}):t}async function ET(t,e,n,r,o){let s,i=o!==void 0;try{s=await t(e,{method:r,headers:{accept:"application/json",authorization:`Bearer ${n}`,...i?{"content-type":"application/json"}:{}},...i?{body:JSON.stringify(o)}:{},signal:AbortSignal.timeout(1e4)})}catch{throw new Error("Community hub is unavailable.")}if(!s.ok)throw new Error(`Community hub rejected registry request: ${s.status}${await LF(s)}`);return s.json().catch(()=>null)}async function LF(t){try{let e=(await t.text()).trim();return e?` ${e.slice(0,500)}`:""}catch{return""}}function Ec(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function OT(t){return!Ec(t)||typeof t.version!="string"||!t.version?null:{version:t.version,createdAt:typeof t.createdAt=="string"?t.createdAt:"",sizeBytes:typeof t.sizeBytes=="number"?t.sizeBytes:0,yanked:t.yanked===!0}}var jF=new Set(["R0","R1","R2","R3"]),HF=new Set(["official","community"]),FF=new Set(["quarantine","trial","trusted"]),UF=new Set(["pending","approved","rejected"]);function _T(t){return typeof t=="string"&&jF.has(t)?t:null}function BF(t){return typeof t=="string"&&HF.has(t)?t:null}function qF(t){return typeof t=="string"&&FF.has(t)?t:null}function WF(t){return typeof t=="string"&&UF.has(t)?t:null}function Wg(t){if(!Ec(t))return null;let e=BF(t.sourceTier),n=qF(t.trustStage),r=WF(t.reviewStatus),o=_T(t.resourceRiskTier),s=_T(t.effectiveRiskTier);if(typeof t.id!="string"||typeof t.type!="string"||typeof t.kind!="string"||!e||!n||!r||!o||!s||typeof t.version!="string"||typeof t.checksum!="string"||typeof t.sizeBytes!="number"||typeof t.downloadUrl!="string")return null;let i=Array.isArray(t.requires)?t.requires:null,a=Array.isArray(t.dependencies)?t.dependencies:null;if(!i||!a||i.some(l=>typeof l!="string"))return null;let c=a.map(Wg);return c.some(l=>!l)?null:{id:t.id,type:t.type,kind:t.kind,sourceTier:e,trustStage:n,reviewStatus:r,resourceRiskTier:o,effectiveRiskTier:s,requires:i,dependencies:c,version:t.version,checksum:t.checksum,sizeBytes:t.sizeBytes,downloadUrl:t.downloadUrl,manifest:t.manifest,minClientVersion:typeof t.minClientVersion=="string"&&t.minClientVersion.trim()?t.minClientVersion.trim():void 0,signature:typeof t.signature=="string"&&t.signature.trim()?t.signature:null,signingKeyId:typeof t.signingKeyId=="string"&&t.signingKeyId.trim()?t.signingKeyId:null}}var Gg={enabled:!0},GF=new Set(["R2","R3"]);function NT(t,e=Gg){return GF.has(t.effectiveRiskTier)?{mode:"high-risk-ask",requiresInstallConsent:!0,requiresHighRiskConsent:!0,reason:`effectiveRiskTier=${t.effectiveRiskTier} \u9AD8\u5371,\u5FC5\u987B\u9AD8\u5371\u95EE\u4EBA`}:e.enabled?t.effectiveRiskTier==="R0"?{mode:"silent",requiresInstallConsent:!1,requiresHighRiskConsent:!1,reason:"R0 \u4F4E\u98CE\u9669 inert,\u81EA\u6CBB\u9759\u9ED8\u83B7\u53D6"}:{mode:"ask",requiresInstallConsent:!0,requiresHighRiskConsent:!1,reason:"R1 \u4F4E\u98CE\u9669\u4F46\u975E\u96F6,\u95EE\u4EBA\u4E00\u6B21"}:{mode:"ask",requiresInstallConsent:!0,requiresHighRiskConsent:!1,reason:"\u81EA\u6CBB\u9884\u7B97\u5173\u95ED,\u56DE\u9000\u663E\u5F0F\u540C\u610F"}}import{gunzipSync as fU}from"node:zlib";import{gunzipSync as XF}from"node:zlib";import*as Ys from"node:fs/promises";import*as en from"node:path";import{createHash as HT}from"node:crypto";import{existsSync as zF}from"node:fs";import*as ut from"node:fs/promises";import*as _c from"node:path";import{Transform as f7}from"node:stream";import{pipeline as y7}from"node:stream/promises";var KF=4*1024*1024,VF=3;async function FT(t,e,n){let r=_c.join(ho(),"cache","downloads",`${YF(e.downloadUrl)}.part`),o=0;if(zF(r)){let l=(await ut.stat(r)).size;o=l<e.sizeBytes?l:0,o===0&&await ut.rm(r,{force:!0})}let s=await LT(t,e.downloadUrl,o,$T(o,e.sizeBytes),n);if(s.whole)return await ut.rm(r,{force:!0}).catch(()=>{}),jT(s.bytes,e,n);await ut.mkdir(_c.dirname(r),{recursive:!0});let i=await ut.open(r,o>0?"r+":"w");try{if(s.bytes.length===0)throw new Error(`${n} download truncated.`);for(await i.write(s.bytes,0,s.bytes.length,o),o+=s.bytes.length;o<e.sizeBytes;){let l=await LT(t,e.downloadUrl,o,$T(o,e.sizeBytes),n);if(l.bytes.length===0)throw new Error(`${n} download truncated.`);await i.write(l.bytes,0,l.bytes.length,o),o+=l.bytes.length}}finally{await i.close()}let a=await ut.readFile(r),c=jT(a,e,n,r);return await ut.rm(r,{force:!0}).catch(()=>{}),c}function $T(t,e){return Math.min(t+KF,e)-1}function YF(t){return HT("sha256").update(t).digest("hex").slice(0,32)}async function LT(t,e,n,r,o){let s=0;for(let i=0;i<VF;i++)try{let a=await t(e,{method:"GET",headers:{range:`bytes=${n}-${r}`},signal:AbortSignal.timeout(3e4)});if(a.status===206)return{bytes:Buffer.from(await a.arrayBuffer()),whole:!1};if(a.ok)return{bytes:Buffer.from(await a.arrayBuffer()),whole:!0};s=a.status}catch{s=0}throw new Error(s?`${o} download failed: ${s}.`:`${o} download failed.`)}function jT(t,e,n,r){let o=s=>{throw r&&ut.rm(r,{force:!0}).catch(()=>{}),new Error(s)};return t.length!==e.sizeBytes&&o(`${n} size did not match registry metadata.`),HT("sha256").update(t).digest("hex")!==e.checksum&&o(`${n} checksum did not match registry metadata.`),t}var zg=64*1024*1024,Kg=2048,JF=zg+Kg*512+1024;async function Dc(t,e,n){return FT(t,e,n)}async function UT(t,e,n){let r;try{r=XF(t,{maxOutputLength:JF})}catch(a){throw/larger than|output length|buffer too large/i.test(a instanceof Error?a.message:String(a))?new Error(`${n} expanded archive exceeds the extraction limit.`):new Error(`${n} must be a gzip-compressed tar archive.`)}let o=0,s=0,i=0;for(;o+512<=r.length;){let a=r.subarray(o,o+512);if(a.every(k=>k===0))return;let c=Mc(a,0,100),l=Mc(a,345,155),d=l?`${l}/${c}`:c,u=Mc(a,124,12).trim(),p=Number.parseInt(u||"0",8);if(!Number.isFinite(p)||p<0)throw new Error(`${n} has an invalid tar entry size.`);let m=Mc(a,156,1)||"0",g=o+512,f=g+p;if(f>r.length)throw new Error(`${n} tar entry is truncated.`);let h=QF(e,d,n);if(m==="5")await Ys.mkdir(h,{recursive:!0});else if(m==="0"||m==="\0"){if(i+=1,s+=p,i>Kg)throw new Error(`${n} exceeds the ${Kg}-file extraction limit.`);if(s>zg)throw new Error(`${n} expanded file payload exceeds the ${zg}-byte limit.`);await Ys.mkdir(en.dirname(h),{recursive:!0}),await Ys.writeFile(h,r.subarray(g,f))}else throw new Error(`${n} may only contain regular files and directories.`);o=g+Math.ceil(p/512)*512}throw new Error(`${n} tar archive is missing an end marker.`)}function QF(t,e,n){let r=en.posix.normalize(e.replace(/\\/g,"/"));if(!r||r==="."||r.startsWith("../")||en.posix.isAbsolute(r))throw new Error(`${n} contains an unsafe path.`);let o=en.resolve(t,...r.split("/")),s=en.resolve(t);if(o!==s&&!o.startsWith(s+en.sep))throw new Error(`${n} contains an unsafe path.`);return o}function Mc(t,e,n){let r=t.subarray(e,e+n),o=r.indexOf(0);return r.subarray(0,o===-1?r.length:o).toString("utf8")}import{createPublicKey as ZF,verify as eU}from"node:crypto";function tU(t){return`id=${t.id}
387
+ `),error:P.details?.error}}catch(S){return{result:"",error:S instanceof Error?S.message:String(S)}}}},createAgentRunner:Zt,tools:this.toolCatalog.getToolManifest(),taskStore:this.taskStore,apiKey:this.currentApiKey,model:m.model??this.currentModel,log:{info:k=>this.log(k),warn:k=>this.log(`[warn] ${k}`),error:k=>this.log(`[error] ${k}`),debug:k=>{this.verbose&&this.log(`[debug] ${k}`)}},hooks:this.currentHooks??void 0,parentSignal:u.signal,memoryProvider:this.memoryProvider??void 0,memoryUserId:this.memoryUserId||void 0},h=await gT(f);await MF(this,c),h.ok?i||(this.sendNotification("system.activity",{category:"dream",level:"success",title:"\u68A6\u5883\u6574\u7406\u5B8C\u6210",detail:`\u56DE\u987E ${h.sessionsReviewed} \u4E2A\u4F1A\u8BDD\uFF0C\u6574\u7406 ${h.filesTouched.length} \u4E2A\u8BB0\u5FC6\u6587\u4EF6\uFF0C\u8017\u65F6 ${h.durationMs}ms`}),this.sendNotification("memory.updated",{source:"dream",target:"consolidation",files:h.filesTouched}),this.sendNotification("turn.end",{turnId:r,content:`Dream consolidation completed. ${h.sessionsReviewed} sessions reviewed, ${h.filesTouched.length} files touched. Duration: ${h.durationMs}ms.`,usage:{inputTokens:0,outputTokens:0}})):i||(this.sendNotification("system.activity",{category:"dream",level:"error",title:"\u68A6\u5883\u6574\u7406\u5931\u8D25",detail:h.error??"\u672A\u77E5\u9519\u8BEF"}),this.sendNotification("turn.error",{turnId:r,error:{message:h.error??"Dream consolidation failed",code:"DREAM_FAILED"}})),this.log(`dream ${r} completed`)}catch(f){if(u.signal.aborted)i||(this.sendNotification("system.activity",{category:"dream",level:"warn",title:"\u68A6\u5883\u6574\u7406\u88AB\u4E2D\u65AD"}),this.sendNotification("turn.error",{turnId:r,error:{message:"Dream aborted",code:"ABORTED"}}));else{let h=f instanceof Error?f.message:String(f);i||(this.sendNotification("system.activity",{category:"dream",level:"error",title:"\u68A6\u5883\u6574\u7406\u5F02\u5E38",detail:h}),this.sendNotification("turn.error",{turnId:r,error:{message:h,code:"INTERNAL_ERROR"}}))}}finally{e?.removeEventListener("abort",p),this.activeTurn===u&&(this.activeTurn=null)}}async function MF(t,e){if(!(!t.memoryProvider||!t.memoryUserId)){try{let n=await hT({adapter:t.memoryProvider,userId:t.memoryUserId,memoryRoot:e,log:{info:r=>t.log(r),debug:r=>{t.verbose&&t.log(r)}}});n.ran&&t.log(`[decay] completed: decayed=${n.decayed} archived=${n.archived} duration=${n.durationMs}ms`)}catch(n){console.error(`[decay] post-dream decay error: ${n instanceof Error?n.message:String(n)}`)}try{let n=t.memoryProvider;if(typeof n.resolveConflicts=="function"){let r=await n.resolveConflicts(t.memoryUserId);(r.conflictsResolved>0||r.claimsPromoted>0)&&t.log(`[dream] resolved ${r.conflictsResolved} conflicts, promoted ${r.claimsPromoted} pending claims`)}}catch(n){console.error(`[consolidation] post-dream conflict resolution error: ${n instanceof Error?n.message:String(n)}`)}try{let n=t.memoryProvider;if(typeof n.consumePendingProposals=="function"){let r=await n.consumePendingProposals(t.memoryUserId);(r.committed>0||r.expiredIds.length>0)&&t.log(`[dream] proposal consumer: committed=${r.committed} merged=${r.merged} expired=${r.expiredIds.length} pending=${r.pendingLeft}`)}}catch(n){console.error(`[consolidation] post-dream proposal consume error: ${n instanceof Error?n.message:String(n)}`)}}}function DF(t){let e=$F(t.fetchFn??fetch,t.clientVersion),n=t.token.trim();return{async resolveInstall(r,o){let s=encodeURIComponent(r.trim());if(!s)throw new Error("resourceId is required.");let i=o?.trim(),a=i?`?version=${encodeURIComponent(i)}`:"",c=await ET(e,IT(t.baseUrl,`/api/v15/registry/resources/${s}/install${a}`),n,"GET"),l=Wg(c);if(!l)throw new Error("Community hub returned an invalid install resolution.");return l},async listResourceVersions(r){let o=encodeURIComponent(r.trim());if(!o)throw new Error("resourceId is required.");let s=await ET(e,IT(t.baseUrl,`/api/v15/registry/resources/${o}/versions`),n,"GET");return(Ec(s)&&Array.isArray(s.versions)?s.versions:[]).map(OT).filter(a=>!!a)}}}function MT(t){return{async resolveInstall(e,n){let r=await t.resolveInstall(e,n),o=Wg(r);if(!o)throw new Error("Community hub returned an invalid install resolution.");return o},async listResourceVersions(e){let n=await t.listResourceVersions(e);return(Ec(n)&&Array.isArray(n.versions)?n.versions:[]).map(OT).filter(o=>!!o)}}}function DT(t=_o()){let e=t.get("QLOGIC_LLMROUTER_ACCESS_TOKEN")?.trim();if(!e)return null;let n=OF(t);return DF({baseUrl:NF(t),token:e,clientVersion:n})}function OF(t){let e=t.get("QLOGIC_AGENT_VERSION")?.trim();return e||"2.22.5"}function NF(t){return t.get("QLOGIC_HUB_BASE_URL")?.trim()||t.get("XIAOZHICLAW_HUB_URL")?.trim()||"https://xiaozhi.qlogicagent.com"}function IT(t,e){let n=t.trim().replace(/\/+$/,"");return n.endsWith("/v1")&&(n=n.slice(0,-3)),n.endsWith("/api")&&(n=n.slice(0,-4)),`${n}${e}`}function $F(t,e){let n=e?.trim();return n?(r,o)=>t(r,{...o,headers:{...o?.headers,"x-client-version":n}}):t}async function ET(t,e,n,r,o){let s,i=o!==void 0;try{s=await t(e,{method:r,headers:{accept:"application/json",authorization:`Bearer ${n}`,...i?{"content-type":"application/json"}:{}},...i?{body:JSON.stringify(o)}:{},signal:AbortSignal.timeout(1e4)})}catch{throw new Error("Community hub is unavailable.")}if(!s.ok)throw new Error(`Community hub rejected registry request: ${s.status}${await LF(s)}`);return s.json().catch(()=>null)}async function LF(t){try{let e=(await t.text()).trim();return e?` ${e.slice(0,500)}`:""}catch{return""}}function Ec(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function OT(t){return!Ec(t)||typeof t.version!="string"||!t.version?null:{version:t.version,createdAt:typeof t.createdAt=="string"?t.createdAt:"",sizeBytes:typeof t.sizeBytes=="number"?t.sizeBytes:0,yanked:t.yanked===!0}}var jF=new Set(["R0","R1","R2","R3"]),HF=new Set(["official","community"]),FF=new Set(["quarantine","trial","trusted"]),UF=new Set(["pending","approved","rejected"]);function _T(t){return typeof t=="string"&&jF.has(t)?t:null}function BF(t){return typeof t=="string"&&HF.has(t)?t:null}function qF(t){return typeof t=="string"&&FF.has(t)?t:null}function WF(t){return typeof t=="string"&&UF.has(t)?t:null}function Wg(t){if(!Ec(t))return null;let e=BF(t.sourceTier),n=qF(t.trustStage),r=WF(t.reviewStatus),o=_T(t.resourceRiskTier),s=_T(t.effectiveRiskTier);if(typeof t.id!="string"||typeof t.type!="string"||typeof t.kind!="string"||!e||!n||!r||!o||!s||typeof t.version!="string"||typeof t.checksum!="string"||typeof t.sizeBytes!="number"||typeof t.downloadUrl!="string")return null;let i=Array.isArray(t.requires)?t.requires:null,a=Array.isArray(t.dependencies)?t.dependencies:null;if(!i||!a||i.some(l=>typeof l!="string"))return null;let c=a.map(Wg);return c.some(l=>!l)?null:{id:t.id,type:t.type,kind:t.kind,sourceTier:e,trustStage:n,reviewStatus:r,resourceRiskTier:o,effectiveRiskTier:s,requires:i,dependencies:c,version:t.version,checksum:t.checksum,sizeBytes:t.sizeBytes,downloadUrl:t.downloadUrl,manifest:t.manifest,minClientVersion:typeof t.minClientVersion=="string"&&t.minClientVersion.trim()?t.minClientVersion.trim():void 0,signature:typeof t.signature=="string"&&t.signature.trim()?t.signature:null,signingKeyId:typeof t.signingKeyId=="string"&&t.signingKeyId.trim()?t.signingKeyId:null}}var Gg={enabled:!0},GF=new Set(["R2","R3"]);function NT(t,e=Gg){return GF.has(t.effectiveRiskTier)?{mode:"high-risk-ask",requiresInstallConsent:!0,requiresHighRiskConsent:!0,reason:`effectiveRiskTier=${t.effectiveRiskTier} \u9AD8\u5371,\u5FC5\u987B\u9AD8\u5371\u95EE\u4EBA`}:e.enabled?t.effectiveRiskTier==="R0"?{mode:"silent",requiresInstallConsent:!1,requiresHighRiskConsent:!1,reason:"R0 \u4F4E\u98CE\u9669 inert,\u81EA\u6CBB\u9759\u9ED8\u83B7\u53D6"}:{mode:"ask",requiresInstallConsent:!0,requiresHighRiskConsent:!1,reason:"R1 \u4F4E\u98CE\u9669\u4F46\u975E\u96F6,\u95EE\u4EBA\u4E00\u6B21"}:{mode:"ask",requiresInstallConsent:!0,requiresHighRiskConsent:!1,reason:"\u81EA\u6CBB\u9884\u7B97\u5173\u95ED,\u56DE\u9000\u663E\u5F0F\u540C\u610F"}}import{gunzipSync as fU}from"node:zlib";import{gunzipSync as XF}from"node:zlib";import*as Ys from"node:fs/promises";import*as en from"node:path";import{createHash as HT}from"node:crypto";import{existsSync as zF}from"node:fs";import*as ut from"node:fs/promises";import*as _c from"node:path";import{Transform as f7}from"node:stream";import{pipeline as y7}from"node:stream/promises";var KF=4*1024*1024,VF=3;async function FT(t,e,n){let r=_c.join(ho(),"cache","downloads",`${YF(e.downloadUrl)}.part`),o=0;if(zF(r)){let l=(await ut.stat(r)).size;o=l<e.sizeBytes?l:0,o===0&&await ut.rm(r,{force:!0})}let s=await LT(t,e.downloadUrl,o,$T(o,e.sizeBytes),n);if(s.whole)return await ut.rm(r,{force:!0}).catch(()=>{}),jT(s.bytes,e,n);await ut.mkdir(_c.dirname(r),{recursive:!0});let i=await ut.open(r,o>0?"r+":"w");try{if(s.bytes.length===0)throw new Error(`${n} download truncated.`);for(await i.write(s.bytes,0,s.bytes.length,o),o+=s.bytes.length;o<e.sizeBytes;){let l=await LT(t,e.downloadUrl,o,$T(o,e.sizeBytes),n);if(l.bytes.length===0)throw new Error(`${n} download truncated.`);await i.write(l.bytes,0,l.bytes.length,o),o+=l.bytes.length}}finally{await i.close()}let a=await ut.readFile(r),c=jT(a,e,n,r);return await ut.rm(r,{force:!0}).catch(()=>{}),c}function $T(t,e){return Math.min(t+KF,e)-1}function YF(t){return HT("sha256").update(t).digest("hex").slice(0,32)}async function LT(t,e,n,r,o){let s=0;for(let i=0;i<VF;i++)try{let a=await t(e,{method:"GET",headers:{range:`bytes=${n}-${r}`},signal:AbortSignal.timeout(3e4)});if(a.status===206)return{bytes:Buffer.from(await a.arrayBuffer()),whole:!1};if(a.ok)return{bytes:Buffer.from(await a.arrayBuffer()),whole:!0};s=a.status}catch{s=0}throw new Error(s?`${o} download failed: ${s}.`:`${o} download failed.`)}function jT(t,e,n,r){let o=s=>{throw r&&ut.rm(r,{force:!0}).catch(()=>{}),new Error(s)};return t.length!==e.sizeBytes&&o(`${n} size did not match registry metadata.`),HT("sha256").update(t).digest("hex")!==e.checksum&&o(`${n} checksum did not match registry metadata.`),t}var zg=64*1024*1024,Kg=2048,JF=zg+Kg*512+1024;async function Dc(t,e,n){return FT(t,e,n)}async function UT(t,e,n){let r;try{r=XF(t,{maxOutputLength:JF})}catch(a){throw/larger than|output length|buffer too large/i.test(a instanceof Error?a.message:String(a))?new Error(`${n} expanded archive exceeds the extraction limit.`):new Error(`${n} must be a gzip-compressed tar archive.`)}let o=0,s=0,i=0;for(;o+512<=r.length;){let a=r.subarray(o,o+512);if(a.every(k=>k===0))return;let c=Mc(a,0,100),l=Mc(a,345,155),d=l?`${l}/${c}`:c,u=Mc(a,124,12).trim(),p=Number.parseInt(u||"0",8);if(!Number.isFinite(p)||p<0)throw new Error(`${n} has an invalid tar entry size.`);let m=Mc(a,156,1)||"0",g=o+512,f=g+p;if(f>r.length)throw new Error(`${n} tar entry is truncated.`);let h=QF(e,d,n);if(m==="5")await Ys.mkdir(h,{recursive:!0});else if(m==="0"||m==="\0"){if(i+=1,s+=p,i>Kg)throw new Error(`${n} exceeds the ${Kg}-file extraction limit.`);if(s>zg)throw new Error(`${n} expanded file payload exceeds the ${zg}-byte limit.`);await Ys.mkdir(en.dirname(h),{recursive:!0}),await Ys.writeFile(h,r.subarray(g,f))}else throw new Error(`${n} may only contain regular files and directories.`);o=g+Math.ceil(p/512)*512}throw new Error(`${n} tar archive is missing an end marker.`)}function QF(t,e,n){let r=en.posix.normalize(e.replace(/\\/g,"/"));if(!r||r==="."||r.startsWith("../")||en.posix.isAbsolute(r))throw new Error(`${n} contains an unsafe path.`);let o=en.resolve(t,...r.split("/")),s=en.resolve(t);if(o!==s&&!o.startsWith(s+en.sep))throw new Error(`${n} contains an unsafe path.`);return o}function Mc(t,e,n){let r=t.subarray(e,e+n),o=r.indexOf(0);return r.subarray(0,o===-1?r.length:o).toString("utf8")}import{createPublicKey as ZF,verify as eU}from"node:crypto";function tU(t){return`id=${t.id}
388
388
  version=${t.version}
389
389
  checksum=${t.checksum}
390
390
  sizeBytes=${t.sizeBytes}`}function nU(t){return t.includes("\\n")?t.replace(/\\n/g,`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qlogicagent",
3
- "version": "2.22.4",
3
+ "version": "2.22.5",
4
4
  "packageManager": "pnpm@10.23.0",
5
5
  "description": "XiaozhiClaw Agent CLI — subprocess architecture (JSON-RPC over stdio)",
6
6
  "type": "module",