qlogicagent 2.23.0 → 2.23.1

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
@@ -246,7 +246,7 @@ ${t.slice(-n)}`}function jd(t){return t.replaceAll("&","&amp;").replaceAll("<","
246
246
  ${t.slice(-r)}`}function Tx(t){let e=Jn(t),n=e.events.at(-1);return[n?Hd(n):"",e.cleanOutput].filter(Boolean).join(`
247
247
  `)}var Ud=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:jo("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??WJ),e.run(r.signal,n.taskId).then(o=>{this.settle(n.taskId,{lifecycle:o.ok?"completed":"failed",output:o.output?Hy(o.output,BJ):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||Nt(o.lifecycle))return;let s=[r.stdout,r.stderr?`[stderr]
248
248
  ${r.stderr}`:""].filter(Boolean).join(`
249
- `);this.store.updateTask(n.taskId,i=>({...i,lifecycle:r.code===0?"completed":"failed",exitCode:r.code,output:Hy(Jn(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||Nt(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||Nt(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=!Nt(n.lifecycle);if(r&&n.type==="local_bash"&&n.outputPath){let o="";try{o=(await Fd(n.outputPath,Rx)).output}catch{o=""}return{task:n,output:Hy(Tx(Pr(o))),running:r}}if(r){let o=this.externalControls.get(e);if(o?.readStatus)return{task:n,output:Tx(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||Nt(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||Nt(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)&&!Nt(o.lifecycle)&&this.cancelTask(o.taskId)&&r.push(o.taskId);return r}cancelAllRunning(){let e=[];for(let n of this.store.getAllTasks())Nt(n.lifecycle)||this.cancelTask(n.taskId)&&e.push(n.taskId);return e}};function qd(){return Qt()?.type==="group"}var Uy=new Set;function Px(t){return Uy.add(t),()=>{Uy.delete(t)}}async function Ax(){await Promise.all(Array.from(Uy).map(t=>t()))}import{randomUUID as Ux}from"node:crypto";import{createHash as kue}from"node:crypto";import{randomUUID as Sue}from"node:crypto";import*as Xs from"node:fs";import*as Wd from"node:path";function Bd(t){return Wd.join(In(t),"feedback","events")}function Cx(t,e){return Wd.join(Bd(t),`${encodeURIComponent(e)}.json`)}async function qy(t,e){try{return JSON.parse(await Xs.promises.readFile(Cx(t,e),"utf8"))}catch{return null}}async function By(t){t.projectId&&(await Xs.promises.mkdir(Bd(t.projectId),{recursive:!0}),await Xs.promises.writeFile(Cx(t.projectId,t.turnId),JSON.stringify(t,null,2),"utf8"))}async function Ix(t){let e;try{e=(await Xs.promises.readdir(Bd(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 Xs.promises.readFile(Wd.join(Bd(t),r),"utf8")))}catch{continue}return n}async function xx(t){return(await Ix(t)).filter(e=>e.upload?.eligible!==!1&&!e.upload?.uploadBatchId)}async function Ex(t,e,n){let r=await qy(t,e);r&&(r.upload={eligible:r.upload?.eligible??!0,uploadBatchId:n},await By(r))}async function Wy(t,e,n,r){let o=await qy(t,e);o&&(o.upload={eligible:o.upload?.eligible??!0,uploadBatchId:n,uploadedAt:new Date().toISOString(),redactionVersion:r},await By(o))}async function _x(t){return(await Ix(t)).filter(e=>e.state==="active")}async function Mx(t,e,n){let r=await qy(t,e);r&&(r.distill={proposedAt:new Date().toISOString(),clusterKey:n.clusterKey,idempotencyKey:n.idempotencyKey},await By(r))}import{createHash as GJ}from"node:crypto";var Ar="feedback-redaction-v1",zJ=500;function Gy(t){return GJ("sha256").update(t,"utf8").digest("hex")}var KJ=[[/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 VJ(t){let e=(t??"").slice(0,zJ);for(let[n,r]of KJ)e=e.replace(n,r);return e}function $x(t,e=Ar){return{feedbackId:t.feedbackId,rating:t.rating,reason:t.reason,state:t.state,messageHash:t.messageHash,sessionIdHash:Gy(t.sessionId),projectIdHash:t.projectId?Gy(t.projectId):void 0,turnIdHash:Gy(t.turnId),messagePreview:VJ(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 Dx(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??Ar,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 YJ}from"node:crypto";import*as Gd from"node:fs";import*as zd from"node:path";var JJ=6,XJ=6e4,QJ=30*6e4;function Ox(t){return zd.join(In(t),"feedback","outbox.json")}async function Kd(t){try{let e=JSON.parse(await Gd.promises.readFile(Ox(t),"utf8"));return Array.isArray(e)?e:[]}catch{return[]}}async function zy(t,e){let n=Ox(t);await Gd.promises.mkdir(zd.dirname(n),{recursive:!0}),await Gd.promises.writeFile(n,JSON.stringify(e,null,2),"utf8")}function ZJ(t){return Math.min(XJ*2**Math.max(0,t-1),QJ)}async function Nx(t,e,n=new Date){let r=await Kd(t),o=r.find(a=>a.idempotencyKey===e.idempotencyKey);if(o)return o;let s=n.toISOString(),i={entryId:YJ(),idempotencyKey:e.idempotencyKey,op:e.op,payload:e.payload,attempts:0,createdAt:s,nextAttemptAt:s};return r.push(i),await zy(t,r),i}async function jx(t,e=new Date){return(await Kd(t)).filter(r=>r.attempts<JJ&&Date.parse(r.nextAttemptAt)<=e.getTime())}async function Lx(t,e){let n=await Kd(t),r=n.filter(o=>o.entryId!==e);r.length!==n.length&&await zy(t,r)}async function Fx(t,e,n,r=new Date){let o=await Kd(t),s=o.find(i=>i.entryId===e);s&&(s.attempts+=1,s.lastError=n,s.nextAttemptAt=new Date(r.getTime()+ZJ(s.attempts)).toISOString(),await zy(t,o))}async function Hx(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 e4(){return"2.23.0"}function t4(){let t=process.env.QLOGIC_LLMROUTER_BASE_URL?.trim();if(t)return`${t.replace(/\/+$/,"")}/client/feedback`}async function Ky(t,e){if(!t4())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 Hx("/client/feedback/uploadBatch",{signal:r,init:n4(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 n4(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??e4(),uploadTarget:"llmrouter"})}}function r4(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 o4(t,e){let n=0;for(let r of await jx(t,e)){let o=r.payload,s=await Ky({batchId:o.batchId,events:o.events,rollups:o.rollups??[],redactionVersion:o.redactionVersion??Ar});if(s.ok){for(let i of o.turnIds??[])await Wy(t,i,o.batchId,o.redactionVersion??Ar);await Lx(t,r.entryId),n+=1}else await Fx(t,r.entryId,s.error??"upload failed",e)}return n}async function qx(t,e=new Date){let n=await o4(t,e),r=await xx(t);if(r.length===0)return{uploaded:0,queued:0,retried:n};let o=Ux(),s=r.map(p=>$x(p)),i=r.map(p=>p.turnId),{periodStart:a,periodEnd:c}=r4(r),l=Dx(r,{rollupId:Ux(),periodStart:a,periodEnd:c});if((await Ky({batchId:o,events:s,rollups:[l],redactionVersion:Ar})).ok){for(let p of i)await Wy(t,p,o,Ar);return{uploaded:r.length,queued:0,retried:n}}for(let p of i)await Ex(t,p,o);return await Nx(t,{idempotencyKey:o,op:"uploadBatch",payload:{batchId:o,events:s,rollups:[l],turnIds:i,redactionVersion:Ar}},e),{uploaded:0,queued:r.length,retried:n}}import{createHash as s4}from"node:crypto";var i4=2;function a4(t){return t.rating==="down"?`dislike:${t.reason??"other"}`:"like"}var c4={"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 l4(t){return c4[t]??"\u7528\u6237\u5BF9\u8FD9\u7C7B\u56DE\u7B54\u6709\u660E\u786E\u504F\u597D,\u5E94\u636E\u5176\u53CD\u9988\u8C03\u6574\u3002"}function d4(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 u4(t){return Math.max(.3,Math.min(.9,Number((.4+.1*t).toFixed(4))))}function p4(t,e){return s4("sha256").update(`${t}
249
+ `);this.store.updateTask(n.taskId,i=>({...i,lifecycle:r.code===0?"completed":"failed",exitCode:r.code,output:Hy(Jn(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||Nt(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||Nt(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=!Nt(n.lifecycle);if(r&&n.type==="local_bash"&&n.outputPath){let o="";try{o=(await Fd(n.outputPath,Rx)).output}catch{o=""}return{task:n,output:Hy(Tx(Pr(o))),running:r}}if(r){let o=this.externalControls.get(e);if(o?.readStatus)return{task:n,output:Tx(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||Nt(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||Nt(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)&&!Nt(o.lifecycle)&&this.cancelTask(o.taskId)&&r.push(o.taskId);return r}cancelAllRunning(){let e=[];for(let n of this.store.getAllTasks())Nt(n.lifecycle)||this.cancelTask(n.taskId)&&e.push(n.taskId);return e}};function qd(){return Qt()?.type==="group"}var Uy=new Set;function Px(t){return Uy.add(t),()=>{Uy.delete(t)}}async function Ax(){await Promise.all(Array.from(Uy).map(t=>t()))}import{randomUUID as Ux}from"node:crypto";import{createHash as kue}from"node:crypto";import{randomUUID as Sue}from"node:crypto";import*as Xs from"node:fs";import*as Wd from"node:path";function Bd(t){return Wd.join(In(t),"feedback","events")}function Cx(t,e){return Wd.join(Bd(t),`${encodeURIComponent(e)}.json`)}async function qy(t,e){try{return JSON.parse(await Xs.promises.readFile(Cx(t,e),"utf8"))}catch{return null}}async function By(t){t.projectId&&(await Xs.promises.mkdir(Bd(t.projectId),{recursive:!0}),await Xs.promises.writeFile(Cx(t.projectId,t.turnId),JSON.stringify(t,null,2),"utf8"))}async function Ix(t){let e;try{e=(await Xs.promises.readdir(Bd(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 Xs.promises.readFile(Wd.join(Bd(t),r),"utf8")))}catch{continue}return n}async function xx(t){return(await Ix(t)).filter(e=>e.upload?.eligible!==!1&&!e.upload?.uploadBatchId)}async function Ex(t,e,n){let r=await qy(t,e);r&&(r.upload={eligible:r.upload?.eligible??!0,uploadBatchId:n},await By(r))}async function Wy(t,e,n,r){let o=await qy(t,e);o&&(o.upload={eligible:o.upload?.eligible??!0,uploadBatchId:n,uploadedAt:new Date().toISOString(),redactionVersion:r},await By(o))}async function _x(t){return(await Ix(t)).filter(e=>e.state==="active")}async function Mx(t,e,n){let r=await qy(t,e);r&&(r.distill={proposedAt:new Date().toISOString(),clusterKey:n.clusterKey,idempotencyKey:n.idempotencyKey},await By(r))}import{createHash as GJ}from"node:crypto";var Ar="feedback-redaction-v1",zJ=500;function Gy(t){return GJ("sha256").update(t,"utf8").digest("hex")}var KJ=[[/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 VJ(t){let e=(t??"").slice(0,zJ);for(let[n,r]of KJ)e=e.replace(n,r);return e}function $x(t,e=Ar){return{feedbackId:t.feedbackId,rating:t.rating,reason:t.reason,state:t.state,messageHash:t.messageHash,sessionIdHash:Gy(t.sessionId),projectIdHash:t.projectId?Gy(t.projectId):void 0,turnIdHash:Gy(t.turnId),messagePreview:VJ(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 Dx(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??Ar,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 YJ}from"node:crypto";import*as Gd from"node:fs";import*as zd from"node:path";var JJ=6,XJ=6e4,QJ=30*6e4;function Ox(t){return zd.join(In(t),"feedback","outbox.json")}async function Kd(t){try{let e=JSON.parse(await Gd.promises.readFile(Ox(t),"utf8"));return Array.isArray(e)?e:[]}catch{return[]}}async function zy(t,e){let n=Ox(t);await Gd.promises.mkdir(zd.dirname(n),{recursive:!0}),await Gd.promises.writeFile(n,JSON.stringify(e,null,2),"utf8")}function ZJ(t){return Math.min(XJ*2**Math.max(0,t-1),QJ)}async function Nx(t,e,n=new Date){let r=await Kd(t),o=r.find(a=>a.idempotencyKey===e.idempotencyKey);if(o)return o;let s=n.toISOString(),i={entryId:YJ(),idempotencyKey:e.idempotencyKey,op:e.op,payload:e.payload,attempts:0,createdAt:s,nextAttemptAt:s};return r.push(i),await zy(t,r),i}async function jx(t,e=new Date){return(await Kd(t)).filter(r=>r.attempts<JJ&&Date.parse(r.nextAttemptAt)<=e.getTime())}async function Lx(t,e){let n=await Kd(t),r=n.filter(o=>o.entryId!==e);r.length!==n.length&&await zy(t,r)}async function Fx(t,e,n,r=new Date){let o=await Kd(t),s=o.find(i=>i.entryId===e);s&&(s.attempts+=1,s.lastError=n,s.nextAttemptAt=new Date(r.getTime()+ZJ(s.attempts)).toISOString(),await zy(t,o))}async function Hx(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 e4(){return"2.23.1"}function t4(){let t=process.env.QLOGIC_LLMROUTER_BASE_URL?.trim();if(t)return`${t.replace(/\/+$/,"")}/client/feedback`}async function Ky(t,e){if(!t4())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 Hx("/client/feedback/uploadBatch",{signal:r,init:n4(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 n4(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??e4(),uploadTarget:"llmrouter"})}}function r4(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 o4(t,e){let n=0;for(let r of await jx(t,e)){let o=r.payload,s=await Ky({batchId:o.batchId,events:o.events,rollups:o.rollups??[],redactionVersion:o.redactionVersion??Ar});if(s.ok){for(let i of o.turnIds??[])await Wy(t,i,o.batchId,o.redactionVersion??Ar);await Lx(t,r.entryId),n+=1}else await Fx(t,r.entryId,s.error??"upload failed",e)}return n}async function qx(t,e=new Date){let n=await o4(t,e),r=await xx(t);if(r.length===0)return{uploaded:0,queued:0,retried:n};let o=Ux(),s=r.map(p=>$x(p)),i=r.map(p=>p.turnId),{periodStart:a,periodEnd:c}=r4(r),l=Dx(r,{rollupId:Ux(),periodStart:a,periodEnd:c});if((await Ky({batchId:o,events:s,rollups:[l],redactionVersion:Ar})).ok){for(let p of i)await Wy(t,p,o,Ar);return{uploaded:r.length,queued:0,retried:n}}for(let p of i)await Ex(t,p,o);return await Nx(t,{idempotencyKey:o,op:"uploadBatch",payload:{batchId:o,events:s,rollups:[l],turnIds:i,redactionVersion:Ar}},e),{uploaded:0,queued:r.length,retried:n}}import{createHash as s4}from"node:crypto";var i4=2;function a4(t){return t.rating==="down"?`dislike:${t.reason??"other"}`:"like"}var c4={"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 l4(t){return c4[t]??"\u7528\u6237\u5BF9\u8FD9\u7C7B\u56DE\u7B54\u6709\u660E\u786E\u504F\u597D,\u5E94\u636E\u5176\u53CD\u9988\u8C03\u6574\u3002"}function d4(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 u4(t){return Math.max(.3,Math.min(.9,Number((.4+.1*t).toFixed(4))))}function p4(t,e){return s4("sha256").update(`${t}
250
250
  ${e.join(",")}`).digest("hex").slice(0,32)}function Bx(t){let e=new Map;for(let r of t){if(r.state!=="active")continue;let o=a4(r),s=e.get(o);s?s.push(r):e.set(o,[r])}let n=[];for(let[r,o]of e){if(o.length<i4)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:l4(r),category:"preference",importance:u4(o.length),confidence:d4(o.length,a),evidence:{kind:"feedback",refs:[...s,...i.map(c=>`turn:${c}`)],idempotencyKey:p4(r,s)},stats:{evidence:o.length,crossSession:a,feedbackIds:s,turnIds:i}})}return n.sort((r,o)=>r.clusterKey.localeCompare(o.clusterKey)),n}var Wx=()=>{};function Gx(t){Wx=t}function ja(){return Wx()}async function zx(t,e,n){if(!e.proposeExtracted)return{candidates:0,proposed:0};let r=ja(),o=r?await r.listDistillableFeedback(t):await _x(t);if(o.length===0)return{candidates:0,proposed:0};let s=Bx(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 Mx(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 Zt from"node:fs";var Vd=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 Kx=[...PI];function La(t){if(t==="llmrouter")return process.env.QLOGIC_LLMROUTER_INFERENCE_KEY?.trim()||void 0}var Lo="llmrouter-env";function m4(t={}){if(t.removed)return null;let e=La("llmrouter");if(!e)return null;let n=t.enabled!==!1;return{providerId:"llmrouter",strategy:"weighted-round-robin",keys:[{id:Lo,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 Vy=class{keyPool;catalogProviders=new Map;models=new Map;modelEnabledOverrides=new Map;modelPurposeDisabled=new Map;bindings={};injectedKeyStates={};settingsPath;changeListeners=[];hydratedFromUpstream=!1;constructor(e){this.settingsPath=Gs(),this.keyPool=new Vd(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===Lo)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===Lo?this.getInjectedKeyState(e).removed?null:La("llmrouter")??null:this.keyPool.getKeyById(e)}updateKey(e,n){if(e===Lo)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 Kx){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=m4(this.getInjectedKeyState(Lo));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(Zt.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(/[/\\][^/\\]+$/,"");Zt.existsSync(r)||Zt.mkdirSync(r,{recursive:!0}),Zt.writeFileSync(this.settingsPath,JSON.stringify(n,null,2),"utf-8")}load(){try{if(!Zt.existsSync(this.settingsPath))return!1;let e=Zt.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(!Zt.existsSync(this.settingsPath))return;let n=Zt.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)?La(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(Lo).removed&&!!La("llmrouter")}hasEnabledLlmrouterEnvKey(e){if(e!=="llmrouter")return!1;let n=this.getInjectedKeyState(Lo);return!n.removed&&n.enabled!==!1&&!!La(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=>Kx.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{}}},Yd=null;function De(){return Yd||(Yd=new Vy,Yd.load()),Yd}function Qs(t=process.env){return{get:e=>t[e]}}var f4="\u65E0\u6CD5\u8FDE\u63A5 llmrouter \u6A21\u578B\u76EE\u5F55",Fo="llmrouter";var Vx=6e4,Jy=new Map,Yy=new Map,Xn=class extends Error{constructor(e=f4){super(e),this.name="LlmrouterCatalogUnavailableError"}},Jd=class extends Error{status;constructor(e,n="llmrouter inference key rejected (not active)"){super(n),this.name="LlmrouterAuthError",this.status=e}};function Qy(t=Qs()){let e=t.get("QLOGIC_LLMROUTER_BASE_URL")?.trim().replace(/\/+$/,"");if(!e)throw new Xn;return e}function Yx(t=Qs()){let e={accept:"application/json"},n=t.get("QLOGIC_LLMROUTER_ACCESS_TOKEN")?.trim();return n&&(e.authorization=`Bearer ${n}`),e}async function Jx(t,e){let n=Qy(e),r=Yx(e),o=`${n}
251
251
  ${t}
252
252
  ${r.authorization??""}`,s=Jy.get(o);if(s&&Date.now()<s.expiresAt)return s.value;let i=Yy.get(o);if(i)return await i;let a=Qx(n,t,r).then(c=>(Jy.set(o,{value:c,expiresAt:Date.now()+Vx}),c)).finally(()=>{Yy.delete(o)});return Yy.set(o,a),a}async function Xx(t,e){let n=Qy(e),r=Yx(e),o=`${n}
@@ -393,7 +393,7 @@ ${hk(n)}`)}catch(i){return console.error(`[context-compression] LLM summarizatio
393
393
 
394
394
  ${hk(n)}`}}}function hk(t){let e=[],n=t.filter(s=>s.role==="user"),r=n.slice(0,20).map(s=>{let i=on(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=on(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(`
395
395
  `)}function GX(){return Om(new no(kk),new dr(20,Bo),new us(Bo))}function QE(t,e){let n=Nm(new no(kk),new dr(20,Bo),new xi({protectedHeadExchanges:1,protectedTailMessages:8,summarize:t,estimateTokens:Bo}),new us(Bo));return new Ei({inner:n,estimateTokens:Bo,onCacheInvalidated:e?.onCacheInvalidated})}var bk=null;function Wa(t,e){let n=e?.budget??dl({modelContextWindow:ZE(e?.model)}),o=(e?.pipeline??GX()).compress(t,n);if(o.droppedCount>0){let s=Wo(t),i=Wo(o.messages);e_.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:Di(s,n)})}return o.droppedCount>0&&bk?.(o.droppedCount,Wo(o.messages)),o}async function zX(t,e,n){let r=n??dl({modelContextWindow:ZE(e.model)}),o=Wo(t),s=Di(o,r),i;switch(s){case"none":i={messages:t,droppedCount:0,strategy:"none"};break;case"trim-only":i=new no(kk).compress(t,r);break;case"sliding-window":{i=await QE(e.summarize).compressAsync(t,r);break}case"llm-summarize":{let a=e.pipeline??QE(e.summarize);i=$i(a)?await a.compressAsync(t,r):a.compress(t,r);break}}return i.droppedCount>0&&(i={...i,messages:await Lm(i.messages,t,{maxFiles:5,maxTokenBudget:5e4,readFile:async a=>{try{return await UX(a,"utf-8")}catch{return null}}})}),KX(t,i,r),i}function KX(t,e,n){if(e.droppedCount>0||e.metrics?.usedLlm){let r=e.metrics?.tokensBefore||Wo(t),o=e.metrics?.tokensAfter||Wo(e.messages);e_.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:Di(r,n)})}if(e.droppedCount>0){let r=e.metrics?.tokensAfter||Wo(e.messages);bk?.(e.droppedCount,r)}}function VX(t,e){let n=WX(t,e),r={id:"builtin-compressor",label:"4-Layer Compression Funnel (built-in)",async compressAsync(o,s,i){return zX(o,{budget:s,model:i?.model,sessionId:i?.sessionId,summarize:n},s)}};yk.register(r),yk.activate(r.id),t.info(`[context-compression] registered context engine: ${r.id}`)}function n_(t,e,n){VX(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"}}}),bk=(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 r_(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 Cr(t){return t?.riskLevel?t.riskLevel:t?.isDangerous?"system":t?.isReadOnly?"read":t?.isEgress?"external_egress":"write"}function YX(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 JX(t,e){let n=Cr(t.meta);return n==="write"&&YX(t.function.name,e.dangerousPatterns)?"system":n}function XX(t){return`risk_${t}`}function QX(t,e){let n=t.function.name,r=JX(t,e),o=[];return e.blockedToolNames?.includes(n)&&!Sl(n,t.meta?.identity)?(o.push("policy_blocked"),{decision:"deny",riskLevel:r,reasonCodes:o}):(o.push(XX(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 ZX(t){switch(t){case"allow":return"eligible";case"ask":return"approval-required";case"deny":return"blocked-by-policy"}}function o_(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}=QX(i,e),u=ZX(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 ou(){return{resolveModelForPurpose:t=>De().resolveModelForPurpose(t),toolLoop:{createContentReplacementState:FE,enforceToolResultBudget:VE,restoreRequiredContextMessages:(t,e,n)=>qE(t,e,n),getActiveContextCompressionEngine:()=>t_().getActive()??null,compressMessages:Wa,getBudgetContinuationMessage:r_,createStreamingToolExecutor:t=>new ru({...t,contextState:t.contextState}),resolveToolEligibility:(t,e)=>o_(t,e)}}}var _n=({transport:t,apiKey:e,toolInvoker:n,log:r,hooks:o,maxRounds:s})=>new Eo({llmTransport:t,apiKey:e,toolInvoker:n,log:r,hooks:o,maxRounds:s,runtimePorts:ou()});async function ei(t,e){let n=t.params??{},r=n.turnId??s_(),o=n.sessionId,s=n.config,i=e!==void 0,a=ft(),c=s?.memoryRoot||this.resolveMemoryRoot?.()||Sk.join(a,"memory"),l=s?.transcriptDir||this.resolveTranscriptDir?.()||Sk.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 g={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=g.provider??"",h=g.model??"";if(f&&h){let y=De().getModelInfo(f,h);y?.streamRequired&&(g.streamRequired=!0),!g.contextWindowTokens&&y?.contextWindow&&(g.contextWindowTokens=y.contextWindow)}}if(!this.resolveAgent(g)||!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(y,k,w,C)=>{if(k.startsWith("$"))return{result:w};let A=this.toolCatalog.findTool(k);if(!A||typeof A.execute!="function")return{result:"",error:`Unknown tool: ${k}`};let R=`tc_${s_().slice(0,8)}`;try{let S=JSON.parse(w),P=await A.execute(R,S,C);return{result:P.content.map(M=>M.text??"").join(`
396
- `),error:P.details?.error}}catch(S){return{result:"",error:S instanceof Error?S.message:String(S)}}}},createAgentRunner:_n,tools:this.toolCatalog.getToolManifest(),taskStore:this.taskStore,apiKey:this.currentApiKey,model:g.model??this.currentModel,log:{info:y=>this.log(y),warn:y=>this.log(`[warn] ${y}`),error:y=>this.log(`[error] ${y}`),debug:y=>{this.verbose&&this.log(`[debug] ${y}`)}},hooks:this.currentHooks??void 0,parentSignal:u.signal,memoryProvider:this.memoryProvider??void 0,memoryUserId:this.memoryUserId||void 0},h=await ME(f);await e3(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 e3(t,e){if(!(!t.memoryProvider||!t.memoryUserId)){try{let n=await OE({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 t3(t){let e=o3(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 a_(e,i_(t.baseUrl,`/api/v15/registry/resources/${s}/install${a}`),n,"GET"),l=wk(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 a_(e,i_(t.baseUrl,`/api/v15/registry/resources/${o}/versions`),n,"GET");return(su(s)&&Array.isArray(s.versions)?s.versions:[]).map(u_).filter(a=>!!a)}}}function l_(t){return{async resolveInstall(e,n){let r=await t.resolveInstall(e,n),o=wk(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(su(n)&&Array.isArray(n.versions)?n.versions:[]).map(u_).filter(o=>!!o)}}}function d_(t=Qs()){let e=t.get("QLOGIC_LLMROUTER_ACCESS_TOKEN")?.trim();if(!e)return null;let n=n3(t);return t3({baseUrl:r3(t),token:e,clientVersion:n})}function n3(t){let e=t.get("QLOGIC_AGENT_VERSION")?.trim();return e||"2.23.0"}function r3(t){return t.get("QLOGIC_HUB_BASE_URL")?.trim()||t.get("XIAOZHICLAW_HUB_URL")?.trim()||"https://xiaozhi.qlogicagent.com"}function i_(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 o3(t,e){let n=e?.trim();return n?(r,o)=>t(r,{...o,headers:{...o?.headers,"x-client-version":n}}):t}async function a_(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 s3(s)}`);return s.json().catch(()=>null)}async function s3(t){try{let e=(await t.text()).trim();return e?` ${e.slice(0,500)}`:""}catch{return""}}function su(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function u_(t){return!su(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 i3=new Set(["R0","R1","R2","R3"]),a3=new Set(["official","community"]),c3=new Set(["quarantine","trial","trusted"]),l3=new Set(["pending","approved","rejected"]);function c_(t){return typeof t=="string"&&i3.has(t)?t:null}function d3(t){return typeof t=="string"&&a3.has(t)?t:null}function u3(t){return typeof t=="string"&&c3.has(t)?t:null}function p3(t){return typeof t=="string"&&l3.has(t)?t:null}function wk(t){if(!su(t))return null;let e=d3(t.sourceTier),n=u3(t.trustStage),r=p3(t.reviewStatus),o=c_(t.resourceRiskTier),s=c_(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(wk);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 vk={enabled:!0},m3=new Set(["R2","R3"]);function p_(t,e=vk){return m3.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 F3}from"node:zlib";import{gunzipSync as k3}from"node:zlib";import*as Ga from"node:fs/promises";import*as Mn from"node:path";import{createHash as h_}from"node:crypto";import{existsSync as f3}from"node:fs";import*as jt from"node:fs/promises";import*as iu from"node:path";import{Transform as sge}from"node:stream";import{pipeline as age}from"node:stream/promises";var g3=4*1024*1024,h3=3;async function y_(t,e,n){let r=iu.join(Ws(),"cache","downloads",`${y3(e.downloadUrl)}.part`),o=0;if(f3(r)){let l=(await jt.stat(r)).size;o=l<e.sizeBytes?l:0,o===0&&await jt.rm(r,{force:!0})}let s=await f_(t,e.downloadUrl,o,m_(o,e.sizeBytes),n);if(s.whole)return await jt.rm(r,{force:!0}).catch(()=>{}),g_(s.bytes,e,n);await jt.mkdir(iu.dirname(r),{recursive:!0});let i=await jt.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 f_(t,e.downloadUrl,o,m_(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 jt.readFile(r),c=g_(a,e,n,r);return await jt.rm(r,{force:!0}).catch(()=>{}),c}function m_(t,e){return Math.min(t+g3,e)-1}function y3(t){return h_("sha256").update(t).digest("hex").slice(0,32)}async function f_(t,e,n,r,o){let s=0;for(let i=0;i<h3;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 g_(t,e,n,r){let o=s=>{throw r&&jt.rm(r,{force:!0}).catch(()=>{}),new Error(s)};return t.length!==e.sizeBytes&&o(`${n} size did not match registry metadata.`),h_("sha256").update(t).digest("hex")!==e.checksum&&o(`${n} checksum did not match registry metadata.`),t}var Tk=64*1024*1024,Rk=2048,b3=Tk+Rk*512+1024;async function cu(t,e,n){return y_(t,e,n)}async function k_(t,e,n){let r;try{r=k3(t,{maxOutputLength:b3})}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(y=>y===0))return;let c=au(a,0,100),l=au(a,345,155),d=l?`${l}/${c}`:c,u=au(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 g=au(a,156,1)||"0",m=o+512,f=m+p;if(f>r.length)throw new Error(`${n} tar entry is truncated.`);let h=S3(e,d,n);if(g==="5")await Ga.mkdir(h,{recursive:!0});else if(g==="0"||g==="\0"){if(i+=1,s+=p,i>Rk)throw new Error(`${n} exceeds the ${Rk}-file extraction limit.`);if(s>Tk)throw new Error(`${n} expanded file payload exceeds the ${Tk}-byte limit.`);await Ga.mkdir(Mn.dirname(h),{recursive:!0}),await Ga.writeFile(h,r.subarray(m,f))}else throw new Error(`${n} may only contain regular files and directories.`);o=m+Math.ceil(p/512)*512}throw new Error(`${n} tar archive is missing an end marker.`)}function S3(t,e,n){let r=Mn.posix.normalize(e.replace(/\\/g,"/"));if(!r||r==="."||r.startsWith("../")||Mn.posix.isAbsolute(r))throw new Error(`${n} contains an unsafe path.`);let o=Mn.resolve(t,...r.split("/")),s=Mn.resolve(t);if(o!==s&&!o.startsWith(s+Mn.sep))throw new Error(`${n} contains an unsafe path.`);return o}function au(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 w3,verify as v3}from"node:crypto";function T3(t){return`id=${t.id}
396
+ `),error:P.details?.error}}catch(S){return{result:"",error:S instanceof Error?S.message:String(S)}}}},createAgentRunner:_n,tools:this.toolCatalog.getToolManifest(),taskStore:this.taskStore,apiKey:this.currentApiKey,model:g.model??this.currentModel,log:{info:y=>this.log(y),warn:y=>this.log(`[warn] ${y}`),error:y=>this.log(`[error] ${y}`),debug:y=>{this.verbose&&this.log(`[debug] ${y}`)}},hooks:this.currentHooks??void 0,parentSignal:u.signal,memoryProvider:this.memoryProvider??void 0,memoryUserId:this.memoryUserId||void 0},h=await ME(f);await e3(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 e3(t,e){if(!(!t.memoryProvider||!t.memoryUserId)){try{let n=await OE({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 t3(t){let e=o3(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 a_(e,i_(t.baseUrl,`/api/v15/registry/resources/${s}/install${a}`),n,"GET"),l=wk(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 a_(e,i_(t.baseUrl,`/api/v15/registry/resources/${o}/versions`),n,"GET");return(su(s)&&Array.isArray(s.versions)?s.versions:[]).map(u_).filter(a=>!!a)}}}function l_(t){return{async resolveInstall(e,n){let r=await t.resolveInstall(e,n),o=wk(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(su(n)&&Array.isArray(n.versions)?n.versions:[]).map(u_).filter(o=>!!o)}}}function d_(t=Qs()){let e=t.get("QLOGIC_LLMROUTER_ACCESS_TOKEN")?.trim();if(!e)return null;let n=n3(t);return t3({baseUrl:r3(t),token:e,clientVersion:n})}function n3(t){let e=t.get("QLOGIC_AGENT_VERSION")?.trim();return e||"2.23.1"}function r3(t){return t.get("QLOGIC_HUB_BASE_URL")?.trim()||t.get("XIAOZHICLAW_HUB_URL")?.trim()||"https://xiaozhi.qlogicagent.com"}function i_(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 o3(t,e){let n=e?.trim();return n?(r,o)=>t(r,{...o,headers:{...o?.headers,"x-client-version":n}}):t}async function a_(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 s3(s)}`);return s.json().catch(()=>null)}async function s3(t){try{let e=(await t.text()).trim();return e?` ${e.slice(0,500)}`:""}catch{return""}}function su(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function u_(t){return!su(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 i3=new Set(["R0","R1","R2","R3"]),a3=new Set(["official","community"]),c3=new Set(["quarantine","trial","trusted"]),l3=new Set(["pending","approved","rejected"]);function c_(t){return typeof t=="string"&&i3.has(t)?t:null}function d3(t){return typeof t=="string"&&a3.has(t)?t:null}function u3(t){return typeof t=="string"&&c3.has(t)?t:null}function p3(t){return typeof t=="string"&&l3.has(t)?t:null}function wk(t){if(!su(t))return null;let e=d3(t.sourceTier),n=u3(t.trustStage),r=p3(t.reviewStatus),o=c_(t.resourceRiskTier),s=c_(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(wk);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 vk={enabled:!0},m3=new Set(["R2","R3"]);function p_(t,e=vk){return m3.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 F3}from"node:zlib";import{gunzipSync as k3}from"node:zlib";import*as Ga from"node:fs/promises";import*as Mn from"node:path";import{createHash as h_}from"node:crypto";import{existsSync as f3}from"node:fs";import*as jt from"node:fs/promises";import*as iu from"node:path";import{Transform as sge}from"node:stream";import{pipeline as age}from"node:stream/promises";var g3=4*1024*1024,h3=3;async function y_(t,e,n){let r=iu.join(Ws(),"cache","downloads",`${y3(e.downloadUrl)}.part`),o=0;if(f3(r)){let l=(await jt.stat(r)).size;o=l<e.sizeBytes?l:0,o===0&&await jt.rm(r,{force:!0})}let s=await f_(t,e.downloadUrl,o,m_(o,e.sizeBytes),n);if(s.whole)return await jt.rm(r,{force:!0}).catch(()=>{}),g_(s.bytes,e,n);await jt.mkdir(iu.dirname(r),{recursive:!0});let i=await jt.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 f_(t,e.downloadUrl,o,m_(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 jt.readFile(r),c=g_(a,e,n,r);return await jt.rm(r,{force:!0}).catch(()=>{}),c}function m_(t,e){return Math.min(t+g3,e)-1}function y3(t){return h_("sha256").update(t).digest("hex").slice(0,32)}async function f_(t,e,n,r,o){let s=0;for(let i=0;i<h3;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 g_(t,e,n,r){let o=s=>{throw r&&jt.rm(r,{force:!0}).catch(()=>{}),new Error(s)};return t.length!==e.sizeBytes&&o(`${n} size did not match registry metadata.`),h_("sha256").update(t).digest("hex")!==e.checksum&&o(`${n} checksum did not match registry metadata.`),t}var Tk=64*1024*1024,Rk=2048,b3=Tk+Rk*512+1024;async function cu(t,e,n){return y_(t,e,n)}async function k_(t,e,n){let r;try{r=k3(t,{maxOutputLength:b3})}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(y=>y===0))return;let c=au(a,0,100),l=au(a,345,155),d=l?`${l}/${c}`:c,u=au(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 g=au(a,156,1)||"0",m=o+512,f=m+p;if(f>r.length)throw new Error(`${n} tar entry is truncated.`);let h=S3(e,d,n);if(g==="5")await Ga.mkdir(h,{recursive:!0});else if(g==="0"||g==="\0"){if(i+=1,s+=p,i>Rk)throw new Error(`${n} exceeds the ${Rk}-file extraction limit.`);if(s>Tk)throw new Error(`${n} expanded file payload exceeds the ${Tk}-byte limit.`);await Ga.mkdir(Mn.dirname(h),{recursive:!0}),await Ga.writeFile(h,r.subarray(m,f))}else throw new Error(`${n} may only contain regular files and directories.`);o=m+Math.ceil(p/512)*512}throw new Error(`${n} tar archive is missing an end marker.`)}function S3(t,e,n){let r=Mn.posix.normalize(e.replace(/\\/g,"/"));if(!r||r==="."||r.startsWith("../")||Mn.posix.isAbsolute(r))throw new Error(`${n} contains an unsafe path.`);let o=Mn.resolve(t,...r.split("/")),s=Mn.resolve(t);if(o!==s&&!o.startsWith(s+Mn.sep))throw new Error(`${n} contains an unsafe path.`);return o}function au(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 w3,verify as v3}from"node:crypto";function T3(t){return`id=${t.id}
397
397
  version=${t.version}
398
398
  checksum=${t.checksum}
399
399
  sizeBytes=${t.sizeBytes}`}function R3(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.23.0",
3
+ "version": "2.23.1",
4
4
  "packageManager": "pnpm@10.23.0",
5
5
  "description": "XiaozhiClaw Agent CLI — subprocess architecture (JSON-RPC over stdio)",
6
6
  "type": "module",
@@ -170,7 +170,7 @@
170
170
  "dependencies": {
171
171
  "@agentclientprotocol/sdk": "^0.25.0",
172
172
  "@napi-rs/canvas": "0.1.100",
173
- "@xiaozhiclaw/module-sdk": "0.3.0",
173
+ "@xiaozhiclaw/module-sdk": "0.3.1",
174
174
  "@xiaozhiclaw/provider-core": "0.1.33",
175
175
  "ajv": "8.20.0",
176
176
  "better-sqlite3": "^12.10.0",