qlogicagent 2.23.10 → 2.23.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +7 -7
- package/dist/index.js +2 -2
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -244,7 +244,7 @@ ${t.slice(-n)}`}function Nd(t){return t.replaceAll("&","&").replaceAll("<","
|
|
|
244
244
|
${t.slice(-r)}`}function Sx(t){let e=Zn(t),n=e.events.at(-1);return[n?Hd(n):"",e.cleanOutput].filter(Boolean).join(`
|
|
245
245
|
`)}var Fd=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??VJ),e.run(r.signal,n.taskId).then(o=>{this.settle(n.taskId,{lifecycle:o.ok?"completed":"failed",output:o.output?Fy(o.output,KJ):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||Ft(o.lifecycle))return;let s=[r.stdout,r.stderr?`[stderr]
|
|
246
246
|
${r.stderr}`:""].filter(Boolean).join(`
|
|
247
|
-
`);this.store.updateTask(n.taskId,i=>({...i,lifecycle:r.code===0?"completed":"failed",exitCode:r.code,output:Fy(Zn(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||Ft(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||Ft(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=!Ft(n.lifecycle);if(r&&n.type==="local_bash"&&n.outputPath){let o="";try{o=(await Ld(n.outputPath,wx)).output}catch{o=""}return{task:n,output:Fy(Sx(_r(o))),running:r}}if(r){let o=this.externalControls.get(e);if(o?.readStatus)return{task:n,output:Sx(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||Ft(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||Ft(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)&&!Ft(o.lifecycle)&&this.cancelTask(o.taskId)&&r.push(o.taskId);return r}cancelAllRunning(){let e=[];for(let n of this.store.getAllTasks())Ft(n.lifecycle)||this.cancelTask(n.taskId)&&e.push(n.taskId);return e}};function Ud(){return en()?.type==="group"}var Uy=new Set;function vx(t){return Uy.add(t),()=>{Uy.delete(t)}}async function Tx(){await Promise.all(Array.from(Uy).map(t=>t()))}import{randomUUID as Lx}from"node:crypto";import{createHash as gue}from"node:crypto";import{randomUUID as yue}from"node:crypto";import*as Js from"node:fs";import*as Bd from"node:path";function qd(t){return Bd.join(xn(t),"feedback","events")}function Rx(t,e){return Bd.join(qd(t),`${encodeURIComponent(e)}.json`)}async function qy(t,e){try{return JSON.parse(await Js.promises.readFile(Rx(t,e),"utf8"))}catch{return null}}async function By(t){t.projectId&&(await Js.promises.mkdir(qd(t.projectId),{recursive:!0}),await Js.promises.writeFile(Rx(t.projectId,t.turnId),JSON.stringify(t,null,2),"utf8"))}async function Px(t){let e;try{e=(await Js.promises.readdir(qd(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 Js.promises.readFile(Bd.join(qd(t),r),"utf8")))}catch{continue}return n}async function Ax(t){return(await Px(t)).filter(e=>e.upload?.eligible!==!1&&!e.upload?.uploadBatchId)}async function Cx(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 Ix(t){return(await Px(t)).filter(e=>e.state==="active")}async function xx(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 YJ}from"node:crypto";var Mr="feedback-redaction-v1",JJ=500;function Gy(t){return YJ("sha256").update(t,"utf8").digest("hex")}var XJ=[[/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 QJ(t){let e=(t??"").slice(0,JJ);for(let[n,r]of XJ)e=e.replace(n,r);return e}function Ex(t,e=Mr){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:QJ(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 _x(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??Mr,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 ZJ}from"node:crypto";import*as Wd from"node:fs";import*as Gd from"node:path";var e4=6,t4=6e4,n4=30*6e4;function Mx(t){return Gd.join(xn(t),"feedback","outbox.json")}async function zd(t){try{let e=JSON.parse(await Wd.promises.readFile(Mx(t),"utf8"));return Array.isArray(e)?e:[]}catch{return[]}}async function zy(t,e){let n=Mx(t);await Wd.promises.mkdir(Gd.dirname(n),{recursive:!0}),await Wd.promises.writeFile(n,JSON.stringify(e,null,2),"utf8")}function r4(t){return Math.min(t4*2**Math.max(0,t-1),n4)}async function $x(t,e,n=new Date){let r=await zd(t),o=r.find(a=>a.idempotencyKey===e.idempotencyKey);if(o)return o;let s=n.toISOString(),i={entryId:ZJ(),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 Dx(t,e=new Date){return(await zd(t)).filter(r=>r.attempts<e4&&Date.parse(r.nextAttemptAt)<=e.getTime())}async function Ox(t,e){let n=await zd(t),r=n.filter(o=>o.entryId!==e);r.length!==n.length&&await zy(t,r)}async function Nx(t,e,n,r=new Date){let o=await zd(t),s=o.find(i=>i.entryId===e);s&&(s.attempts+=1,s.lastError=n,s.nextAttemptAt=new Date(r.getTime()+r4(s.attempts)).toISOString(),await zy(t,o))}async function jx(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 o4(){return"2.23.10"}function s4(){let t=process.env.QLOGIC_LLMROUTER_BASE_URL?.trim();if(t)return`${t.replace(/\/+$/,"")}/client/feedback`}async function Ky(t,e){if(!s4())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 jx("/client/feedback/uploadBatch",{signal:r,init:i4(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 i4(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??o4(),uploadTarget:"llmrouter"})}}function a4(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 c4(t,e){let n=0;for(let r of await Dx(t,e)){let o=r.payload,s=await Ky({batchId:o.batchId,events:o.events,rollups:o.rollups??[],redactionVersion:o.redactionVersion??Mr});if(s.ok){for(let i of o.turnIds??[])await Wy(t,i,o.batchId,o.redactionVersion??Mr);await Ox(t,r.entryId),n+=1}else await Nx(t,r.entryId,s.error??"upload failed",e)}return n}async function Hx(t,e=new Date){let n=await c4(t,e),r=await Ax(t);if(r.length===0)return{uploaded:0,queued:0,retried:n};let o=Lx(),s=r.map(p=>Ex(p)),i=r.map(p=>p.turnId),{periodStart:a,periodEnd:c}=a4(r),l=_x(r,{rollupId:Lx(),periodStart:a,periodEnd:c});if((await Ky({batchId:o,events:s,rollups:[l],redactionVersion:Mr})).ok){for(let p of i)await Wy(t,p,o,Mr);return{uploaded:r.length,queued:0,retried:n}}for(let p of i)await Cx(t,p,o);return await $x(t,{idempotencyKey:o,op:"uploadBatch",payload:{batchId:o,events:s,rollups:[l],turnIds:i,redactionVersion:Mr}},e),{uploaded:0,queued:r.length,retried:n}}import{createHash as l4}from"node:crypto";var d4=2;function u4(t){return t.rating==="down"?`dislike:${t.reason??"other"}`:"like"}var p4={"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 m4(t){return p4[t]??"\u7528\u6237\u5BF9\u8FD9\u7C7B\u56DE\u7B54\u6709\u660E\u786E\u504F\u597D,\u5E94\u636E\u5176\u53CD\u9988\u8C03\u6574\u3002"}function f4(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 g4(t){return Math.max(.3,Math.min(.9,Number((.4+.1*t).toFixed(4))))}function h4(t,e){return l4("sha256").update(`${t}
|
|
247
|
+
`);this.store.updateTask(n.taskId,i=>({...i,lifecycle:r.code===0?"completed":"failed",exitCode:r.code,output:Fy(Zn(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||Ft(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||Ft(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=!Ft(n.lifecycle);if(r&&n.type==="local_bash"&&n.outputPath){let o="";try{o=(await Ld(n.outputPath,wx)).output}catch{o=""}return{task:n,output:Fy(Sx(_r(o))),running:r}}if(r){let o=this.externalControls.get(e);if(o?.readStatus)return{task:n,output:Sx(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||Ft(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||Ft(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)&&!Ft(o.lifecycle)&&this.cancelTask(o.taskId)&&r.push(o.taskId);return r}cancelAllRunning(){let e=[];for(let n of this.store.getAllTasks())Ft(n.lifecycle)||this.cancelTask(n.taskId)&&e.push(n.taskId);return e}};function Ud(){return en()?.type==="group"}var Uy=new Set;function vx(t){return Uy.add(t),()=>{Uy.delete(t)}}async function Tx(){await Promise.all(Array.from(Uy).map(t=>t()))}import{randomUUID as Lx}from"node:crypto";import{createHash as gue}from"node:crypto";import{randomUUID as yue}from"node:crypto";import*as Js from"node:fs";import*as Bd from"node:path";function qd(t){return Bd.join(xn(t),"feedback","events")}function Rx(t,e){return Bd.join(qd(t),`${encodeURIComponent(e)}.json`)}async function qy(t,e){try{return JSON.parse(await Js.promises.readFile(Rx(t,e),"utf8"))}catch{return null}}async function By(t){t.projectId&&(await Js.promises.mkdir(qd(t.projectId),{recursive:!0}),await Js.promises.writeFile(Rx(t.projectId,t.turnId),JSON.stringify(t,null,2),"utf8"))}async function Px(t){let e;try{e=(await Js.promises.readdir(qd(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 Js.promises.readFile(Bd.join(qd(t),r),"utf8")))}catch{continue}return n}async function Ax(t){return(await Px(t)).filter(e=>e.upload?.eligible!==!1&&!e.upload?.uploadBatchId)}async function Cx(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 Ix(t){return(await Px(t)).filter(e=>e.state==="active")}async function xx(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 YJ}from"node:crypto";var Mr="feedback-redaction-v1",JJ=500;function Gy(t){return YJ("sha256").update(t,"utf8").digest("hex")}var XJ=[[/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 QJ(t){let e=(t??"").slice(0,JJ);for(let[n,r]of XJ)e=e.replace(n,r);return e}function Ex(t,e=Mr){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:QJ(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 _x(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??Mr,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 ZJ}from"node:crypto";import*as Wd from"node:fs";import*as Gd from"node:path";var e4=6,t4=6e4,n4=30*6e4;function Mx(t){return Gd.join(xn(t),"feedback","outbox.json")}async function zd(t){try{let e=JSON.parse(await Wd.promises.readFile(Mx(t),"utf8"));return Array.isArray(e)?e:[]}catch{return[]}}async function zy(t,e){let n=Mx(t);await Wd.promises.mkdir(Gd.dirname(n),{recursive:!0}),await Wd.promises.writeFile(n,JSON.stringify(e,null,2),"utf8")}function r4(t){return Math.min(t4*2**Math.max(0,t-1),n4)}async function $x(t,e,n=new Date){let r=await zd(t),o=r.find(a=>a.idempotencyKey===e.idempotencyKey);if(o)return o;let s=n.toISOString(),i={entryId:ZJ(),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 Dx(t,e=new Date){return(await zd(t)).filter(r=>r.attempts<e4&&Date.parse(r.nextAttemptAt)<=e.getTime())}async function Ox(t,e){let n=await zd(t),r=n.filter(o=>o.entryId!==e);r.length!==n.length&&await zy(t,r)}async function Nx(t,e,n,r=new Date){let o=await zd(t),s=o.find(i=>i.entryId===e);s&&(s.attempts+=1,s.lastError=n,s.nextAttemptAt=new Date(r.getTime()+r4(s.attempts)).toISOString(),await zy(t,o))}async function jx(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 o4(){return"2.23.11"}function s4(){let t=process.env.QLOGIC_LLMROUTER_BASE_URL?.trim();if(t)return`${t.replace(/\/+$/,"")}/client/feedback`}async function Ky(t,e){if(!s4())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 jx("/client/feedback/uploadBatch",{signal:r,init:i4(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 i4(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??o4(),uploadTarget:"llmrouter"})}}function a4(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 c4(t,e){let n=0;for(let r of await Dx(t,e)){let o=r.payload,s=await Ky({batchId:o.batchId,events:o.events,rollups:o.rollups??[],redactionVersion:o.redactionVersion??Mr});if(s.ok){for(let i of o.turnIds??[])await Wy(t,i,o.batchId,o.redactionVersion??Mr);await Ox(t,r.entryId),n+=1}else await Nx(t,r.entryId,s.error??"upload failed",e)}return n}async function Hx(t,e=new Date){let n=await c4(t,e),r=await Ax(t);if(r.length===0)return{uploaded:0,queued:0,retried:n};let o=Lx(),s=r.map(p=>Ex(p)),i=r.map(p=>p.turnId),{periodStart:a,periodEnd:c}=a4(r),l=_x(r,{rollupId:Lx(),periodStart:a,periodEnd:c});if((await Ky({batchId:o,events:s,rollups:[l],redactionVersion:Mr})).ok){for(let p of i)await Wy(t,p,o,Mr);return{uploaded:r.length,queued:0,retried:n}}for(let p of i)await Cx(t,p,o);return await $x(t,{idempotencyKey:o,op:"uploadBatch",payload:{batchId:o,events:s,rollups:[l],turnIds:i,redactionVersion:Mr}},e),{uploaded:0,queued:r.length,retried:n}}import{createHash as l4}from"node:crypto";var d4=2;function u4(t){return t.rating==="down"?`dislike:${t.reason??"other"}`:"like"}var p4={"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 m4(t){return p4[t]??"\u7528\u6237\u5BF9\u8FD9\u7C7B\u56DE\u7B54\u6709\u660E\u786E\u504F\u597D,\u5E94\u636E\u5176\u53CD\u9988\u8C03\u6574\u3002"}function f4(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 g4(t){return Math.max(.3,Math.min(.9,Number((.4+.1*t).toFixed(4))))}function h4(t,e){return l4("sha256").update(`${t}
|
|
248
248
|
${e.join(",")}`).digest("hex").slice(0,32)}function Fx(t){let e=new Map;for(let r of t){if(r.state!=="active")continue;let o=u4(r),s=e.get(o);s?s.push(r):e.set(o,[r])}let n=[];for(let[r,o]of e){if(o.length<d4)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:m4(r),category:"preference",importance:g4(o.length),confidence:f4(o.length,a),evidence:{kind:"feedback",refs:[...s,...i.map(c=>`turn:${c}`)],idempotencyKey:h4(r,s)},stats:{evidence:o.length,crossSession:a,feedbackIds:s,turnIds:i}})}return n.sort((r,o)=>r.clusterKey.localeCompare(o.clusterKey)),n}var Ux=()=>{};function qx(t){Ux=t}function Ha(){return Ux()}async function Bx(t,e,n){if(!e.proposeExtracted)return{candidates:0,proposed:0};let r=Ha(),o=r?await r.listDistillableFeedback(t):await Ix(t);if(o.length===0)return{candidates:0,proposed:0};let s=Fx(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 xx(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 nn from"node:fs";var Kd=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 Wx=[...vI];function Fa(t){if(t==="llmrouter")return process.env.QLOGIC_LLMROUTER_INFERENCE_KEY?.trim()||void 0}var Lo="llmrouter-env";function y4(t={}){if(t.removed)return null;let e=Fa("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=Ws(),this.keyPool=new Kd(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:Fa("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 Wx){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=y4(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(nn.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(/[/\\][^/\\]+$/,"");nn.existsSync(r)||nn.mkdirSync(r,{recursive:!0}),nn.writeFileSync(this.settingsPath,JSON.stringify(n,null,2),"utf-8")}load(){try{if(!nn.existsSync(this.settingsPath))return!1;let e=nn.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(!nn.existsSync(this.settingsPath))return;let n=nn.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)?Fa(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&&!!Fa("llmrouter")}hasEnabledLlmrouterEnvKey(e){if(e!=="llmrouter")return!1;let n=this.getInjectedKeyState(Lo);return!n.removed&&n.enabled!==!1&&!!Fa(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=>Wx.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{}}},Vd=null;function je(){return Vd||(Vd=new Vy,Vd.load()),Vd}function Xs(t=process.env){return{get:e=>t[e]}}var k4="\u65E0\u6CD5\u8FDE\u63A5 llmrouter \u6A21\u578B\u76EE\u5F55",Ho="llmrouter";var Gx=6e4,Jy=new Map,Yy=new Map,er=class extends Error{constructor(e=k4){super(e),this.name="LlmrouterCatalogUnavailableError"}},Yd=class extends Error{status;constructor(e,n="llmrouter inference key rejected (not active)"){super(n),this.name="LlmrouterAuthError",this.status=e}};function Qy(t=Xs()){let e=t.get("QLOGIC_LLMROUTER_BASE_URL")?.trim().replace(/\/+$/,"");if(!e)throw new er;return e}function zx(t=Xs()){let e={accept:"application/json"},n=t.get("QLOGIC_LLMROUTER_ACCESS_TOKEN")?.trim();return n&&(e.authorization=`Bearer ${n}`),e}async function Kx(t,e){let n=Qy(e),r=zx(e),o=`${n}
|
|
249
249
|
${t}
|
|
250
250
|
${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=Yx(n,t,r).then(c=>(Jy.set(o,{value:c,expiresAt:Date.now()+Gx}),c)).finally(()=>{Yy.delete(o)});return Yy.set(o,a),a}async function Vx(t,e){let n=Qy(e),r=zx(e),o=`${n}
|
|
@@ -391,7 +391,7 @@ ${yk(n)}`)}catch(i){return console.error(`[context-compression] LLM summarizatio
|
|
|
391
391
|
|
|
392
392
|
${yk(n)}`}}}function yk(t){let e=[],n=t.filter(s=>s.role==="user"),r=n.slice(0,20).map(s=>{let i=ln(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=ln(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(`
|
|
393
393
|
`)}function YX(){return Dm(new oo(bk),new hr(20,Bo),new cs(Bo))}function VE(t,e){let n=Om(new oo(bk),new hr(20,Bo),new _i({protectedHeadExchanges:1,protectedTailMessages:8,summarize:t,estimateTokens:Bo}),new cs(Bo));return new Mi({inner:n,estimateTokens:Bo,onCacheInvalidated:e?.onCacheInvalidated})}var Sk=null;function za(t,e){let n=e?.budget??cl({modelContextWindow:YE(e?.model)}),o=(e?.pipeline??YX()).compress(t,n);if(o.droppedCount>0){let s=Wo(t),i=Wo(o.messages);JE.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:Ni(s,n)})}return o.droppedCount>0&&Sk?.(o.droppedCount,Wo(o.messages)),o}async function JX(t,e,n){let r=n??cl({modelContextWindow:YE(e.model)}),o=Wo(t),s=Ni(o,r),i;switch(s){case"none":i={messages:t,droppedCount:0,strategy:"none"};break;case"trim-only":i=new oo(bk).compress(t,r);break;case"sliding-window":{i=await VE(e.summarize).compressAsync(t,r);break}case"llm-summarize":{let a=e.pipeline??VE(e.summarize);i=Oi(a)?await a.compressAsync(t,r):a.compress(t,r);break}}return i.droppedCount>0&&(i={...i,messages:await jm(i.messages,t,{maxFiles:5,maxTokenBudget:5e4,readFile:async a=>{try{return await GX(a,"utf-8")}catch{return null}}})}),XX(t,i,r),i}function XX(t,e,n){if(e.droppedCount>0||e.metrics?.usedLlm){let r=e.metrics?.tokensBefore||Wo(t),o=e.metrics?.tokensAfter||Wo(e.messages);JE.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:Ni(r,n)})}if(e.droppedCount>0){let r=e.metrics?.tokensAfter||Wo(e.messages);Sk?.(e.droppedCount,r)}}function QX(t,e){let n=VX(t,e),r={id:"builtin-compressor",label:"4-Layer Compression Funnel (built-in)",async compressAsync(o,s,i){return JX(o,{budget:s,model:i?.model,sessionId:i?.sessionId,summarize:n},s)}};kk.register(r),kk.activate(r.id),t.info(`[context-compression] registered context engine: ${r.id}`)}function QE(t,e,n){QX(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"}}}),Sk=(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 ZE(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 $r(t){return t?.riskLevel?t.riskLevel:t?.isDangerous?"system":t?.isReadOnly?"read":t?.isEgress?"external_egress":"write"}function ZX(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 e5(t,e){let n=$r(t.meta);return n==="write"&&ZX(t.function.name,e.dangerousPatterns)?"system":n}function t5(t){return`risk_${t}`}function n5(t,e){let n=t.function.name,r=e5(t,e),o=[];return e.blockedToolNames?.includes(n)&&!us(n,t.meta?.identity)?(o.push("policy_blocked"),{decision:"deny",riskLevel:r,reasonCodes:o}):(o.push(t5(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 r5(t){switch(t){case"allow":return"eligible";case"ask":return"approval-required";case"deny":return"blocked-by-policy"}}function e_(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}=n5(i,e),u=r5(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=>je().resolveModelForPurpose(t),toolLoop:{createContentReplacementState:OE,enforceToolResultBudget:WE,restoreRequiredContextMessages:(t,e,n)=>LE(t,e,n),getActiveContextCompressionEngine:()=>XE().getActive()??null,compressMessages:za,getBudgetContinuationMessage:ZE,createStreamingToolExecutor:t=>new ru({...t,contextState:t.contextState}),resolveToolEligibility:(t,e)=>e_(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 Zs(t,e){let n=t.params??{},r=n.turnId??t_(),o=n.sessionId,s=n.config,i=e!==void 0,a=kt(),c=s?.memoryRoot||this.resolveMemoryRoot?.()||wk.join(a,"memory"),l=s?.transcriptDir||this.resolveTranscriptDir?.()||wk.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 m=g.provider??"",h=g.model??"";if(m&&h){let y=je().getModelInfo(m,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 m={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,S,A)=>{if(k.startsWith("$"))return{result:S};let P=this.toolCatalog.findTool(k);if(!P||typeof P.execute!="function")return{result:"",error:`Unknown tool: ${k}`};let C=`tc_${t_().slice(0,8)}`;try{let b=JSON.parse(S),v=await P.execute(C,b,A);return{result:v.content.map(M=>M.text??"").join(`
|
|
394
|
-
`),error:v.details?.error}}catch(b){return{result:"",error:b instanceof Error?b.message:String(b)}}}},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 xE(m);await o5(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(m){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=m instanceof Error?m.message:String(m);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 o5(t,e){if(!(!t.memoryProvider||!t.memoryUserId)){try{let n=await ME({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 s5(t){let e=c5(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 r_(e,n_(t.baseUrl,`/api/v15/registry/resources/${s}/install${a}`),n,"GET"),l=vk(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 r_(e,n_(t.baseUrl,`/api/v15/registry/resources/${o}/versions`),n,"GET");return(su(s)&&Array.isArray(s.versions)?s.versions:[]).map(a_).filter(a=>!!a)}}}function s_(t){return{async resolveInstall(e,n){let r=await t.resolveInstall(e,n),o=vk(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(a_).filter(o=>!!o)}}}function i_(t=Xs()){let e=t.get("QLOGIC_LLMROUTER_ACCESS_TOKEN")?.trim();if(!e)return null;let n=i5(t);return s5({baseUrl:a5(t),token:e,clientVersion:n})}function i5(t){let e=t.get("QLOGIC_AGENT_VERSION")?.trim();return e||"2.23.10"}function a5(t){return t.get("QLOGIC_HUB_BASE_URL")?.trim()||t.get("XIAOZHICLAW_HUB_URL")?.trim()||"https://xiaozhi.qlogicagent.com"}function n_(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 c5(t,e){let n=e?.trim();return n?(r,o)=>t(r,{...o,headers:{...o?.headers,"x-client-version":n}}):t}async function r_(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 l5(s)}`);return s.json().catch(()=>null)}async function l5(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 a_(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 d5=new Set(["R0","R1","R2","R3"]),u5=new Set(["official","community"]),p5=new Set(["quarantine","trial","trusted"]),m5=new Set(["pending","approved","rejected"]);function o_(t){return typeof t=="string"&&d5.has(t)?t:null}function f5(t){return typeof t=="string"&&u5.has(t)?t:null}function g5(t){return typeof t=="string"&&p5.has(t)?t:null}function h5(t){return typeof t=="string"&&m5.has(t)?t:null}function vk(t){if(!su(t))return null;let e=f5(t.sourceTier),n=g5(t.trustStage),r=h5(t.reviewStatus),o=o_(t.resourceRiskTier),s=o_(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(vk);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 Tk={enabled:!0},y5=new Set(["R2","R3"]);function c_(t,e=Tk){return y5.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 B5}from"node:zlib";import{gunzipSync as v5}from"node:zlib";import*as Ka from"node:fs/promises";import*as Mn from"node:path";import{createHash as p_}from"node:crypto";import{existsSync as k5}from"node:fs";import*as Ut from"node:fs/promises";import*as iu from"node:path";import{Transform as nge}from"node:stream";import{pipeline as oge}from"node:stream/promises";var b5=4*1024*1024,S5=3;async function m_(t,e,n){let r=iu.join(Bs(),"cache","downloads",`${w5(e.downloadUrl)}.part`),o=0;if(k5(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 d_(t,e.downloadUrl,o,l_(o,e.sizeBytes),n);if(s.whole)return await Ut.rm(r,{force:!0}).catch(()=>{}),u_(s.bytes,e,n);await Ut.mkdir(iu.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 d_(t,e.downloadUrl,o,l_(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=u_(a,e,n,r);return await Ut.rm(r,{force:!0}).catch(()=>{}),c}function l_(t,e){return Math.min(t+b5,e)-1}function w5(t){return p_("sha256").update(t).digest("hex").slice(0,32)}async function d_(t,e,n,r,o){let s=0;for(let i=0;i<S5;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 u_(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.`),p_("sha256").update(t).digest("hex")!==e.checksum&&o(`${n} checksum did not match registry metadata.`),t}var Rk=64*1024*1024,Pk=2048,T5=Rk+Pk*512+1024;async function cu(t,e,n){return m_(t,e,n)}async function f_(t,e,n){let r;try{r=v5(t,{maxOutputLength:T5})}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",f=o+512,m=f+p;if(m>r.length)throw new Error(`${n} tar entry is truncated.`);let h=R5(e,d,n);if(g==="5")await Ka.mkdir(h,{recursive:!0});else if(g==="0"||g==="\0"){if(i+=1,s+=p,i>Pk)throw new Error(`${n} exceeds the ${Pk}-file extraction limit.`);if(s>Rk)throw new Error(`${n} expanded file payload exceeds the ${Rk}-byte limit.`);await Ka.mkdir(Mn.dirname(h),{recursive:!0}),await Ka.writeFile(h,r.subarray(f,m))}else throw new Error(`${n} may only contain regular files and directories.`);o=f+Math.ceil(p/512)*512}throw new Error(`${n} tar archive is missing an end marker.`)}function R5(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 P5,verify as A5}from"node:crypto";function C5(t){return`id=${t.id}
|
|
394
|
+
`),error:v.details?.error}}catch(b){return{result:"",error:b instanceof Error?b.message:String(b)}}}},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 xE(m);await o5(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(m){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=m instanceof Error?m.message:String(m);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 o5(t,e){if(!(!t.memoryProvider||!t.memoryUserId)){try{let n=await ME({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 s5(t){let e=c5(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 r_(e,n_(t.baseUrl,`/api/v15/registry/resources/${s}/install${a}`),n,"GET"),l=vk(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 r_(e,n_(t.baseUrl,`/api/v15/registry/resources/${o}/versions`),n,"GET");return(su(s)&&Array.isArray(s.versions)?s.versions:[]).map(a_).filter(a=>!!a)}}}function s_(t){return{async resolveInstall(e,n){let r=await t.resolveInstall(e,n),o=vk(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(a_).filter(o=>!!o)}}}function i_(t=Xs()){let e=t.get("QLOGIC_LLMROUTER_ACCESS_TOKEN")?.trim();if(!e)return null;let n=i5(t);return s5({baseUrl:a5(t),token:e,clientVersion:n})}function i5(t){let e=t.get("QLOGIC_AGENT_VERSION")?.trim();return e||"2.23.11"}function a5(t){return t.get("QLOGIC_HUB_BASE_URL")?.trim()||t.get("XIAOZHICLAW_HUB_URL")?.trim()||"https://xiaozhi.qlogicagent.com"}function n_(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 c5(t,e){let n=e?.trim();return n?(r,o)=>t(r,{...o,headers:{...o?.headers,"x-client-version":n}}):t}async function r_(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 l5(s)}`);return s.json().catch(()=>null)}async function l5(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 a_(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 d5=new Set(["R0","R1","R2","R3"]),u5=new Set(["official","community"]),p5=new Set(["quarantine","trial","trusted"]),m5=new Set(["pending","approved","rejected"]);function o_(t){return typeof t=="string"&&d5.has(t)?t:null}function f5(t){return typeof t=="string"&&u5.has(t)?t:null}function g5(t){return typeof t=="string"&&p5.has(t)?t:null}function h5(t){return typeof t=="string"&&m5.has(t)?t:null}function vk(t){if(!su(t))return null;let e=f5(t.sourceTier),n=g5(t.trustStage),r=h5(t.reviewStatus),o=o_(t.resourceRiskTier),s=o_(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(vk);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 Tk={enabled:!0},y5=new Set(["R2","R3"]);function c_(t,e=Tk){return y5.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 B5}from"node:zlib";import{gunzipSync as v5}from"node:zlib";import*as Ka from"node:fs/promises";import*as Mn from"node:path";import{createHash as p_}from"node:crypto";import{existsSync as k5}from"node:fs";import*as Ut from"node:fs/promises";import*as iu from"node:path";import{Transform as nge}from"node:stream";import{pipeline as oge}from"node:stream/promises";var b5=4*1024*1024,S5=3;async function m_(t,e,n){let r=iu.join(Bs(),"cache","downloads",`${w5(e.downloadUrl)}.part`),o=0;if(k5(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 d_(t,e.downloadUrl,o,l_(o,e.sizeBytes),n);if(s.whole)return await Ut.rm(r,{force:!0}).catch(()=>{}),u_(s.bytes,e,n);await Ut.mkdir(iu.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 d_(t,e.downloadUrl,o,l_(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=u_(a,e,n,r);return await Ut.rm(r,{force:!0}).catch(()=>{}),c}function l_(t,e){return Math.min(t+b5,e)-1}function w5(t){return p_("sha256").update(t).digest("hex").slice(0,32)}async function d_(t,e,n,r,o){let s=0;for(let i=0;i<S5;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 u_(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.`),p_("sha256").update(t).digest("hex")!==e.checksum&&o(`${n} checksum did not match registry metadata.`),t}var Rk=64*1024*1024,Pk=2048,T5=Rk+Pk*512+1024;async function cu(t,e,n){return m_(t,e,n)}async function f_(t,e,n){let r;try{r=v5(t,{maxOutputLength:T5})}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",f=o+512,m=f+p;if(m>r.length)throw new Error(`${n} tar entry is truncated.`);let h=R5(e,d,n);if(g==="5")await Ka.mkdir(h,{recursive:!0});else if(g==="0"||g==="\0"){if(i+=1,s+=p,i>Pk)throw new Error(`${n} exceeds the ${Pk}-file extraction limit.`);if(s>Rk)throw new Error(`${n} expanded file payload exceeds the ${Rk}-byte limit.`);await Ka.mkdir(Mn.dirname(h),{recursive:!0}),await Ka.writeFile(h,r.subarray(f,m))}else throw new Error(`${n} may only contain regular files and directories.`);o=f+Math.ceil(p/512)*512}throw new Error(`${n} tar archive is missing an end marker.`)}function R5(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 P5,verify as A5}from"node:crypto";function C5(t){return`id=${t.id}
|
|
395
395
|
version=${t.version}
|
|
396
396
|
checksum=${t.checksum}
|
|
397
397
|
sizeBytes=${t.sizeBytes}`}function I5(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.
|
|
3
|
+
"version": "2.23.11",
|
|
4
4
|
"packageManager": "pnpm@10.23.0",
|
|
5
5
|
"description": "XiaozhiClaw Agent CLI — subprocess architecture (JSON-RPC over stdio)",
|
|
6
6
|
"type": "module",
|
|
@@ -170,8 +170,8 @@
|
|
|
170
170
|
"dependencies": {
|
|
171
171
|
"@agentclientprotocol/sdk": "^0.25.0",
|
|
172
172
|
"@napi-rs/canvas": "0.1.100",
|
|
173
|
-
"@xiaozhiclaw/module-sdk": "0.4.
|
|
174
|
-
"@xiaozhiclaw/provider-core": "0.1.
|
|
173
|
+
"@xiaozhiclaw/module-sdk": "0.4.2",
|
|
174
|
+
"@xiaozhiclaw/provider-core": "0.1.35",
|
|
175
175
|
"ajv": "8.20.0",
|
|
176
176
|
"better-sqlite3": "^12.10.0",
|
|
177
177
|
"dotenv": "^17.3.1",
|