qlogicagent 2.18.11 → 2.18.12
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 +1 -1
- package/dist/index.js +2 -2
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -157,7 +157,7 @@ ${e?`<result>${e}</result>`:""}
|
|
|
157
157
|
... [truncated ${o} chars] ...
|
|
158
158
|
${t.slice(-r)}`}var al=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:go("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?.(),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??uG),e.run(r.signal,n.taskId).then(o=>{this.settle(n.taskId,{lifecycle:o.ok?"completed":"failed",output:o.output?Rg(o.output):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:this.getCurrentSessionId?.(),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||Ct(o.lifecycle))return;let s=[r.stdout,r.stderr?`[stderr]
|
|
159
159
|
${r.stderr}`:""].filter(Boolean).join(`
|
|
160
|
-
`);this.store.updateTask(n.taskId,i=>({...i,lifecycle:r.code===0?"completed":"failed",exitCode:r.code,output:Rg(s),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||Ct(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||Ct(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=!Ct(n.lifecycle);if(r&&n.type==="local_bash"&&n.outputPath){let o="";try{o=await lG(n.outputPath,"utf-8")}catch{o=""}return{task:n,output:Rg(is(o)),running:r}}if(r){let o=this.externalControls.get(e);if(o?.readStatus)return{task:n,output: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||Ct(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||Ct(n.lifecycle)?!1:(this.clearDeadline(e),this.teardownExecutors(e),this.store.updateTask(e,r=>({...r,lifecycle:"cancelled",endedAt:Date.now()})),!0)}cancelTasksForSession(e){if(!e)return[];let n=[];for(let r of this.store.getAllTasks())r.launchSessionId===e&&!Ct(r.lifecycle)&&this.cancelTask(r.taskId)&&n.push(r.taskId);return n}cancelAllRunning(){let e=[];for(let n of this.store.getAllTasks())Ct(n.lifecycle)||this.cancelTask(n.taskId)&&e.push(n.taskId);return e}};Ce();function cl(){return Oe()?.type==="group"}var Tg=new Set;function as(t){return Tg.add(t),()=>{Tg.delete(t)}}async function LR(){await Promise.all(Array.from(Tg).map(t=>t()))}de();import{randomUUID as QR}from"node:crypto";lt();import{createHash as zce}from"node:crypto";import{randomUUID as Vce}from"node:crypto";import*as cs from"node:fs";import*as dl from"node:path";function ll(t){return dl.join(Jt(t),"feedback","events")}function jR(t,e){return dl.join(ll(t),`${encodeURIComponent(e)}.json`)}async function Pg(t,e){try{return JSON.parse(await cs.promises.readFile(jR(t,e),"utf8"))}catch{return null}}async function Ag(t){t.projectId&&(await cs.promises.mkdir(ll(t.projectId),{recursive:!0}),await cs.promises.writeFile(jR(t.projectId,t.turnId),JSON.stringify(t,null,2),"utf8"))}async function $R(t){let e;try{e=(await cs.promises.readdir(ll(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 cs.promises.readFile(dl.join(ll(t),r),"utf8")))}catch{continue}return n}async function FR(t){return(await $R(t)).filter(e=>e.upload?.eligible!==!1&&!e.upload?.uploadBatchId)}async function UR(t,e,n){let r=await Pg(t,e);r&&(r.upload={eligible:r.upload?.eligible??!0,uploadBatchId:n},await Ag(r))}async function xg(t,e,n,r){let o=await Pg(t,e);o&&(o.upload={eligible:o.upload?.eligible??!0,uploadBatchId:n,uploadedAt:new Date().toISOString(),redactionVersion:r},await Ag(o))}async function HR(t){return(await $R(t)).filter(e=>e.state==="active")}async function BR(t,e,n){let r=await Pg(t,e);r&&(r.distill={proposedAt:new Date().toISOString(),clusterKey:n.clusterKey,idempotencyKey:n.idempotencyKey},await Ag(r))}import{createHash as pG}from"node:crypto";var ur="feedback-redaction-v1",mG=500;function Ig(t){return pG("sha256").update(t,"utf8").digest("hex")}var fG=[[/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 gG(t){let e=(t??"").slice(0,mG);for(let[n,r]of fG)e=e.replace(n,r);return e}function qR(t,e=ur){return{feedbackId:t.feedbackId,rating:t.rating,reason:t.reason,state:t.state,messageHash:t.messageHash,sessionIdHash:Ig(t.sessionId),projectIdHash:t.projectId?Ig(t.projectId):void 0,turnIdHash:Ig(t.turnId),messagePreview:gG(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 WR(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??ur,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}lt();import{randomUUID as hG}from"node:crypto";import*as ul from"node:fs";import*as pl from"node:path";var yG=6,kG=6e4,bG=30*6e4;function GR(t){return pl.join(Jt(t),"feedback","outbox.json")}async function ml(t){try{let e=JSON.parse(await ul.promises.readFile(GR(t),"utf8"));return Array.isArray(e)?e:[]}catch{return[]}}async function Cg(t,e){let n=GR(t);await ul.promises.mkdir(pl.dirname(n),{recursive:!0}),await ul.promises.writeFile(n,JSON.stringify(e,null,2),"utf8")}function wG(t){return Math.min(kG*2**Math.max(0,t-1),bG)}async function zR(t,e,n=new Date){let r=await ml(t),o=r.find(a=>a.idempotencyKey===e.idempotencyKey);if(o)return o;let s=n.toISOString(),i={entryId:hG(),idempotencyKey:e.idempotencyKey,op:e.op,payload:e.payload,attempts:0,createdAt:s,nextAttemptAt:s};return r.push(i),await Cg(t,r),i}async function KR(t,e=new Date){return(await ml(t)).filter(r=>r.attempts<yG&&Date.parse(r.nextAttemptAt)<=e.getTime())}async function VR(t,e){let n=await ml(t),r=n.filter(o=>o.entryId!==e);r.length!==n.length&&await Cg(t,r)}async function YR(t,e,n,r=new Date){let o=await ml(t),s=o.find(i=>i.entryId===e);s&&(s.attempts+=1,s.lastError=n,s.nextAttemptAt=new Date(r.getTime()+wG(s.attempts)).toISOString(),await Cg(t,o))}function vG(){return"2.18.10"}function SG(){let t=process.env.QLOGIC_LLMROUTER_BASE_URL?.trim();if(t)return`${t.replace(/\/+$/,"")}/client/feedback`}function RG(t,e=300){if(!t)return!0;let n=t.split(".");if(n.length<2)return!1;try{let r=JSON.parse(Buffer.from(n[1],"base64url").toString("utf8"));return r.exp?r.exp<=Math.floor(Date.now()/1e3)+e:!1}catch{return!1}}async function XR(t,e){let n=process.env.QLOGIC_LLMROUTER_REFRESH_TOKEN?.trim();if(!n)return!1;let r=await fetch(`${t.replace(/\/+$/,"")}/auth/refresh`,{method:"POST",headers:{authorization:`Bearer ${n}`},signal:e});if(!r.ok)return!1;let o=await r.json().catch(()=>({})),s=o.data?.access_token?.trim();if(!s)return!1;process.env.QLOGIC_LLMROUTER_ACCESS_TOKEN=s;let i=o.data?.refresh_token?.trim();return i&&(process.env.QLOGIC_LLMROUTER_REFRESH_TOKEN=i),!0}async function Eg(t,e){let n=SG();if(!n)return{ok:!1,error:"QLOGIC_LLMROUTER_BASE_URL not configured"};if(t.events.length===0)return{ok:!0,accepted:0};let r=process.env.QLOGIC_LLMROUTER_BASE_URL.trim().replace(/\/+$/,""),o=e??AbortSignal.timeout(3e4),s=!1;RG(process.env.QLOGIC_LLMROUTER_ACCESS_TOKEN?.trim())&&(s=await XR(r,o));let i=`${n.replace(/\/+$/,"")}/uploadBatch`;try{let a=await JR(i,t,o);if(a.status===401&&!s&&(s=await XR(r,o),s&&(a=await JR(i,t,o))),!a.ok){let l=await a.text().catch(()=>"");return{ok:!1,status:a.status,error:`HTTP ${a.status}${l?`: ${l.slice(0,200)}`:""}`}}return{ok:!0,accepted:(await a.json().catch(()=>({}))).accepted??t.events.length,status:a.status,refreshedToken:s}}catch(a){return{ok:!1,error:a instanceof Error?a.message:String(a)}}}async function JR(t,e,n){let r=process.env.QLOGIC_LLMROUTER_ACCESS_TOKEN?.trim(),o={"content-type":"application/json",accept:"application/json"};return r&&(o.authorization=`Bearer ${r}`),fetch(t,{method:"POST",headers:o,signal:n,body:JSON.stringify({batchId:e.batchId,events:e.events,rollups:e.rollups,redactionVersion:e.redactionVersion,clientBuild:e.clientBuild,runtimeVersion:e.runtimeVersion,qlogicagentVersion:e.qlogicagentVersion??vG(),uploadTarget:"llmrouter"})})}function TG(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 PG(t,e){let n=0;for(let r of await KR(t,e)){let o=r.payload,s=await Eg({batchId:o.batchId,events:o.events,rollups:o.rollups??[],redactionVersion:o.redactionVersion??ur});if(s.ok){for(let i of o.turnIds??[])await xg(t,i,o.batchId,o.redactionVersion??ur);await VR(t,r.entryId),n+=1}else await YR(t,r.entryId,s.error??"upload failed",e)}return n}async function ZR(t,e=new Date){let n=await PG(t,e),r=await FR(t);if(r.length===0)return{uploaded:0,queued:0,retried:n};let o=QR(),s=r.map(p=>qR(p)),i=r.map(p=>p.turnId),{periodStart:a,periodEnd:c}=TG(r),l=WR(r,{rollupId:QR(),periodStart:a,periodEnd:c});if((await Eg({batchId:o,events:s,rollups:[l],redactionVersion:ur})).ok){for(let p of i)await xg(t,p,o,ur);return{uploaded:r.length,queued:0,retried:n}}for(let p of i)await UR(t,p,o);return await zR(t,{idempotencyKey:o,op:"uploadBatch",payload:{batchId:o,events:s,rollups:[l],turnIds:i,redactionVersion:ur}},e),{uploaded:0,queued:r.length,retried:n}}import{createHash as AG}from"node:crypto";var xG=2;function IG(t){return t.rating==="down"?`dislike:${t.reason??"other"}`:"like"}var CG={"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 EG(t){return CG[t]??"\u7528\u6237\u5BF9\u8FD9\u7C7B\u56DE\u7B54\u6709\u660E\u786E\u504F\u597D,\u5E94\u636E\u5176\u53CD\u9988\u8C03\u6574\u3002"}function _G(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 MG(t){return Math.max(.3,Math.min(.9,Number((.4+.1*t).toFixed(4))))}function DG(t,e){return AG("sha256").update(`${t}
|
|
160
|
+
`);this.store.updateTask(n.taskId,i=>({...i,lifecycle:r.code===0?"completed":"failed",exitCode:r.code,output:Rg(s),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||Ct(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||Ct(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=!Ct(n.lifecycle);if(r&&n.type==="local_bash"&&n.outputPath){let o="";try{o=await lG(n.outputPath,"utf-8")}catch{o=""}return{task:n,output:Rg(is(o)),running:r}}if(r){let o=this.externalControls.get(e);if(o?.readStatus)return{task:n,output: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||Ct(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||Ct(n.lifecycle)?!1:(this.clearDeadline(e),this.teardownExecutors(e),this.store.updateTask(e,r=>({...r,lifecycle:"cancelled",endedAt:Date.now()})),!0)}cancelTasksForSession(e){if(!e)return[];let n=[];for(let r of this.store.getAllTasks())r.launchSessionId===e&&!Ct(r.lifecycle)&&this.cancelTask(r.taskId)&&n.push(r.taskId);return n}cancelAllRunning(){let e=[];for(let n of this.store.getAllTasks())Ct(n.lifecycle)||this.cancelTask(n.taskId)&&e.push(n.taskId);return e}};Ce();function cl(){return Oe()?.type==="group"}var Tg=new Set;function as(t){return Tg.add(t),()=>{Tg.delete(t)}}async function LR(){await Promise.all(Array.from(Tg).map(t=>t()))}de();import{randomUUID as QR}from"node:crypto";lt();import{createHash as zce}from"node:crypto";import{randomUUID as Vce}from"node:crypto";import*as cs from"node:fs";import*as dl from"node:path";function ll(t){return dl.join(Jt(t),"feedback","events")}function jR(t,e){return dl.join(ll(t),`${encodeURIComponent(e)}.json`)}async function Pg(t,e){try{return JSON.parse(await cs.promises.readFile(jR(t,e),"utf8"))}catch{return null}}async function Ag(t){t.projectId&&(await cs.promises.mkdir(ll(t.projectId),{recursive:!0}),await cs.promises.writeFile(jR(t.projectId,t.turnId),JSON.stringify(t,null,2),"utf8"))}async function $R(t){let e;try{e=(await cs.promises.readdir(ll(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 cs.promises.readFile(dl.join(ll(t),r),"utf8")))}catch{continue}return n}async function FR(t){return(await $R(t)).filter(e=>e.upload?.eligible!==!1&&!e.upload?.uploadBatchId)}async function UR(t,e,n){let r=await Pg(t,e);r&&(r.upload={eligible:r.upload?.eligible??!0,uploadBatchId:n},await Ag(r))}async function xg(t,e,n,r){let o=await Pg(t,e);o&&(o.upload={eligible:o.upload?.eligible??!0,uploadBatchId:n,uploadedAt:new Date().toISOString(),redactionVersion:r},await Ag(o))}async function HR(t){return(await $R(t)).filter(e=>e.state==="active")}async function BR(t,e,n){let r=await Pg(t,e);r&&(r.distill={proposedAt:new Date().toISOString(),clusterKey:n.clusterKey,idempotencyKey:n.idempotencyKey},await Ag(r))}import{createHash as pG}from"node:crypto";var ur="feedback-redaction-v1",mG=500;function Ig(t){return pG("sha256").update(t,"utf8").digest("hex")}var fG=[[/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 gG(t){let e=(t??"").slice(0,mG);for(let[n,r]of fG)e=e.replace(n,r);return e}function qR(t,e=ur){return{feedbackId:t.feedbackId,rating:t.rating,reason:t.reason,state:t.state,messageHash:t.messageHash,sessionIdHash:Ig(t.sessionId),projectIdHash:t.projectId?Ig(t.projectId):void 0,turnIdHash:Ig(t.turnId),messagePreview:gG(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 WR(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??ur,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}lt();import{randomUUID as hG}from"node:crypto";import*as ul from"node:fs";import*as pl from"node:path";var yG=6,kG=6e4,bG=30*6e4;function GR(t){return pl.join(Jt(t),"feedback","outbox.json")}async function ml(t){try{let e=JSON.parse(await ul.promises.readFile(GR(t),"utf8"));return Array.isArray(e)?e:[]}catch{return[]}}async function Cg(t,e){let n=GR(t);await ul.promises.mkdir(pl.dirname(n),{recursive:!0}),await ul.promises.writeFile(n,JSON.stringify(e,null,2),"utf8")}function wG(t){return Math.min(kG*2**Math.max(0,t-1),bG)}async function zR(t,e,n=new Date){let r=await ml(t),o=r.find(a=>a.idempotencyKey===e.idempotencyKey);if(o)return o;let s=n.toISOString(),i={entryId:hG(),idempotencyKey:e.idempotencyKey,op:e.op,payload:e.payload,attempts:0,createdAt:s,nextAttemptAt:s};return r.push(i),await Cg(t,r),i}async function KR(t,e=new Date){return(await ml(t)).filter(r=>r.attempts<yG&&Date.parse(r.nextAttemptAt)<=e.getTime())}async function VR(t,e){let n=await ml(t),r=n.filter(o=>o.entryId!==e);r.length!==n.length&&await Cg(t,r)}async function YR(t,e,n,r=new Date){let o=await ml(t),s=o.find(i=>i.entryId===e);s&&(s.attempts+=1,s.lastError=n,s.nextAttemptAt=new Date(r.getTime()+wG(s.attempts)).toISOString(),await Cg(t,o))}function vG(){return"2.18.12"}function SG(){let t=process.env.QLOGIC_LLMROUTER_BASE_URL?.trim();if(t)return`${t.replace(/\/+$/,"")}/client/feedback`}function RG(t,e=300){if(!t)return!0;let n=t.split(".");if(n.length<2)return!1;try{let r=JSON.parse(Buffer.from(n[1],"base64url").toString("utf8"));return r.exp?r.exp<=Math.floor(Date.now()/1e3)+e:!1}catch{return!1}}async function XR(t,e){let n=process.env.QLOGIC_LLMROUTER_REFRESH_TOKEN?.trim();if(!n)return!1;let r=await fetch(`${t.replace(/\/+$/,"")}/auth/refresh`,{method:"POST",headers:{authorization:`Bearer ${n}`},signal:e});if(!r.ok)return!1;let o=await r.json().catch(()=>({})),s=o.data?.access_token?.trim();if(!s)return!1;process.env.QLOGIC_LLMROUTER_ACCESS_TOKEN=s;let i=o.data?.refresh_token?.trim();return i&&(process.env.QLOGIC_LLMROUTER_REFRESH_TOKEN=i),!0}async function Eg(t,e){let n=SG();if(!n)return{ok:!1,error:"QLOGIC_LLMROUTER_BASE_URL not configured"};if(t.events.length===0)return{ok:!0,accepted:0};let r=process.env.QLOGIC_LLMROUTER_BASE_URL.trim().replace(/\/+$/,""),o=e??AbortSignal.timeout(3e4),s=!1;RG(process.env.QLOGIC_LLMROUTER_ACCESS_TOKEN?.trim())&&(s=await XR(r,o));let i=`${n.replace(/\/+$/,"")}/uploadBatch`;try{let a=await JR(i,t,o);if(a.status===401&&!s&&(s=await XR(r,o),s&&(a=await JR(i,t,o))),!a.ok){let l=await a.text().catch(()=>"");return{ok:!1,status:a.status,error:`HTTP ${a.status}${l?`: ${l.slice(0,200)}`:""}`}}return{ok:!0,accepted:(await a.json().catch(()=>({}))).accepted??t.events.length,status:a.status,refreshedToken:s}}catch(a){return{ok:!1,error:a instanceof Error?a.message:String(a)}}}async function JR(t,e,n){let r=process.env.QLOGIC_LLMROUTER_ACCESS_TOKEN?.trim(),o={"content-type":"application/json",accept:"application/json"};return r&&(o.authorization=`Bearer ${r}`),fetch(t,{method:"POST",headers:o,signal:n,body:JSON.stringify({batchId:e.batchId,events:e.events,rollups:e.rollups,redactionVersion:e.redactionVersion,clientBuild:e.clientBuild,runtimeVersion:e.runtimeVersion,qlogicagentVersion:e.qlogicagentVersion??vG(),uploadTarget:"llmrouter"})})}function TG(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 PG(t,e){let n=0;for(let r of await KR(t,e)){let o=r.payload,s=await Eg({batchId:o.batchId,events:o.events,rollups:o.rollups??[],redactionVersion:o.redactionVersion??ur});if(s.ok){for(let i of o.turnIds??[])await xg(t,i,o.batchId,o.redactionVersion??ur);await VR(t,r.entryId),n+=1}else await YR(t,r.entryId,s.error??"upload failed",e)}return n}async function ZR(t,e=new Date){let n=await PG(t,e),r=await FR(t);if(r.length===0)return{uploaded:0,queued:0,retried:n};let o=QR(),s=r.map(p=>qR(p)),i=r.map(p=>p.turnId),{periodStart:a,periodEnd:c}=TG(r),l=WR(r,{rollupId:QR(),periodStart:a,periodEnd:c});if((await Eg({batchId:o,events:s,rollups:[l],redactionVersion:ur})).ok){for(let p of i)await xg(t,p,o,ur);return{uploaded:r.length,queued:0,retried:n}}for(let p of i)await UR(t,p,o);return await zR(t,{idempotencyKey:o,op:"uploadBatch",payload:{batchId:o,events:s,rollups:[l],turnIds:i,redactionVersion:ur}},e),{uploaded:0,queued:r.length,retried:n}}import{createHash as AG}from"node:crypto";var xG=2;function IG(t){return t.rating==="down"?`dislike:${t.reason??"other"}`:"like"}var CG={"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 EG(t){return CG[t]??"\u7528\u6237\u5BF9\u8FD9\u7C7B\u56DE\u7B54\u6709\u660E\u786E\u504F\u597D,\u5E94\u636E\u5176\u53CD\u9988\u8C03\u6574\u3002"}function _G(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 MG(t){return Math.max(.3,Math.min(.9,Number((.4+.1*t).toFixed(4))))}function DG(t,e){return AG("sha256").update(`${t}
|
|
161
161
|
${e.join(",")}`).digest("hex").slice(0,32)}function eT(t){let e=new Map;for(let r of t){if(r.state!=="active")continue;let o=IG(r),s=e.get(o);s?s.push(r):e.set(o,[r])}let n=[];for(let[r,o]of e){if(o.length<xG)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:EG(r),category:"feedback_preference",importance:MG(o.length),confidence:_G(o.length,a),evidence:{kind:"feedback",refs:[...s,...i.map(c=>`turn:${c}`)],idempotencyKey:DG(r,s)},stats:{evidence:o.length,crossSession:a,feedbackIds:s,turnIds:i}})}return n.sort((r,o)=>r.clusterKey.localeCompare(o.clusterKey)),n}var tT=()=>{};function nT(t){tT=t}function fl(){return tT()}async function rT(t,e,n){if(!e.proposeExtracted)return{candidates:0,proposed:0};let r=fl(),o=r?await r.listDistillableFeedback(t):await HR(t);if(o.length===0)return{candidates:0,proposed:0};let s=eT(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 BR(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}}ut();vl();_g();var g2="\u65E0\u6CD5\u8FDE\u63A5 llmrouter \u6A21\u578B\u76EE\u5F55",yo="llmrouter";var LT=6e4,$g=new Map,jg=new Map,Un=class extends Error{constructor(e=g2){super(e),this.name="LlmrouterCatalogUnavailableError"}},Sl=class extends Error{status;constructor(e,n="llmrouter inference key rejected (not active)"){super(n),this.name="LlmrouterAuthError",this.status=e}};function Ug(t=mr()){let e=t.get("QLOGIC_LLMROUTER_BASE_URL")?.trim().replace(/\/+$/,"");if(!e)throw new Un;return e}function jT(t=mr()){let e={accept:"application/json"},n=t.get("QLOGIC_LLMROUTER_ACCESS_TOKEN")?.trim();return n&&(e.authorization=`Bearer ${n}`),e}async function $T(t,e){let n=Ug(e),r=jT(e),o=`${n}
|
|
162
162
|
${t}
|
|
163
163
|
${r.authorization??""}`,s=$g.get(o);if(s&&Date.now()<s.expiresAt)return s.value;let i=jg.get(o);if(i)return await i;let a=UT(n,t,r).then(c=>($g.set(o,{value:c,expiresAt:Date.now()+LT}),c)).finally(()=>{jg.delete(o)});return jg.set(o,a),a}async function FT(t,e){let n=Ug(e),r=jT(e),o=`${n}
|
|
@@ -314,7 +314,7 @@ ${e}
|
|
|
314
314
|
|
|
315
315
|
`)}
|
|
316
316
|
|
|
317
|
-
${t.prompt}`)}let u={sessionId:t.stream.sessionId,turnId:t.stream.turnId,requestId:t.stream.requestId,deltas:[],streamedAny:!1},p=typeof e.sendNotification=="function"?e.sendNotification.bind(e):void 0,m=(y,A)=>oV({agentId:r,turn:u,method:y,payload:A,sendNotification:p}),f=`del-${ax().slice(0,8)}`,g={onDelta:y=>{y.delta&&m(y.reasoning?"turn.thought_delta":"turn.delta",{text:y.delta})},onToolCall:y=>m("turn.tool_call",{callId:y.callId,toolName:y.name,rawInput:y.arguments}),onToolResult:y=>m("turn.tool_result",{callId:y.callId,toolName:y.name,status:y.ok?"completed":"failed",rawOutput:y.outputPreview}),onApprovalRequest:y=>{JA({agentId:r,approvalId:y.approvalId,toolName:y.toolName,options:y.options??[],hasInteractiveContext:!!u.turnId&&!!p,forward:()=>{p?.("agents.prompt.approval",{agentId:r,sessionId:u.sessionId,turnId:u.turnId,requestId:u.requestId,approvalId:y.approvalId,callId:y.callId??y.approvalId,toolName:y.toolName??"operation",options:y.options??[]})}}).then(A=>n.respond(f,y.approvalId,A),A=>e.log?.(`[agents:delegate] approval decision failed (${y.approvalId}): ${A instanceof Error?A.message:String(A)}`))},onMedia:()=>{},onRelay:()=>{},onLifecycle:y=>{y.state==="exited"&&Th.delete(i),e.log?.(`[agents:delegate] ${r} ${f} lifecycle ${JSON.stringify(y).slice(0,200)}`)}},h={delegationId:f,to:{handle:{kind:"chat",owner:s,name:r,seq:0},agentId:r},input:{messages:[{type:"text",text:d}]},systemPrompt:t.systemPrompt,session:{canonicalSessionId:s,projectId:ee(o),cwd:o,...c?{resumeNativeId:c}:{}},opts:{timeoutMs:t.timeoutMs}},R=await n.send(h,g);t.stream.sessionId&&Th.add(i);let v=u.deltas.join("")||R.content,w=R.usage&&(R.usage.inputTokens||R.usage.outputTokens)?{inputTokens:R.usage.inputTokens??0,outputTokens:R.usage.outputTokens??0,totalTokens:(R.usage.inputTokens??0)+(R.usage.outputTokens??0)}:void 0;return{content:v,streamedAny:u.streamedAny,...R.stopReason?{stopReason:R.stopReason}:{},...w?{usage:w}:{}}}async function Ix(t){try{let e=t.params??{},n=typeof e.agentId=="string"?e.agentId.trim():"";if(!n||n==="qlogicagent"){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,warmed:!1});return}t.id!==void 0&&this.sendResponse(t.id,{ok:!0,warmed:!1})}catch(e){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,warmed:!1,error:e instanceof Error?e.message:String(e)})}}async function Cx(t){try{let e=t.params??{},n=typeof e.agentId=="string"?e.agentId.trim():"",r=typeof e.prompt=="string"?e.prompt:"";if(!n||!r.trim()){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:S.INVALID_PARAMS,message:"agentId and prompt are required."});return}let o=typeof e.projectId=="string"&&e.projectId?se(e.projectId)?.workspaceDir:void 0,s=typeof e.cwd=="string"&&e.cwd?e.cwd:o??(typeof this.getActiveProjectRoot=="function"?this.getActiveProjectRoot():process.cwd()),i=typeof e.timeoutMs=="number"&&e.timeoutMs>0?e.timeoutMs:3e5,a=typeof e.sessionId=="string"?e.sessionId:void 0,c=typeof e.turnId=="string"?e.turnId:void 0,l=typeof e.requestId=="string"?e.requestId:void 0,d=typeof e.projectId=="string"?e.projectId:void 0,u=e.lockSessionOwner!==!1,p=this.getDelegateBridge?.(),m;if(!p?.isSupported())throw new Error("Gateway delegate is required for external agent chat turns");try{m=await dV({host:this,bridge:p,agentId:n,prompt:r,systemPrompt:typeof e.systemPrompt=="string"?e.systemPrompt:"",cwd:s,timeoutMs:i,stream:{sessionId:a,turnId:c,requestId:l}})}catch(g){throw await sV({sessionId:a,projectRoot:s,turnId:c,projectId:d,agentId:n,prompt:r,error:g,lockSessionOwner:u}),g}let f=m.content;if(a){if(!(hh(n)==="native-cwd")){let v=w=>y=>{y==="failed"&&console.error(`[agents] transcript persist failed (${w}) for external session ${a}; the message will be missing after a reload (see [session-persistence] log)`)};mn(a,{role:"user",content:r},s,c).then(v("user message"),w=>console.error(`[agents] transcript persist rejected (user message) for external session ${a}: ${w instanceof Error?w.message:String(w)}`)),f&&mn(a,{role:"assistant",content:f},s,c).then(v("assistant reply"),w=>console.error(`[agents] transcript persist rejected (assistant reply) for external session ${a}: ${w instanceof Error?w.message:String(w)}`))}let R=(await Gt(a,s).catch(()=>null))?.metadata?.title?{}:{title:Ni(r,"External agent session")};Object.keys(R).length>0&&dt(a,R,s).catch(v=>{console.error(`[agents] session metadata persist failed for external session ${a}: ${v instanceof Error?v.message:String(v)}; the session may not appear in the session list`)})}t.id!==void 0&&this.sendResponse(t.id,{ok:!0,agentId:n,content:f,streamed:m.streamedAny,stopReason:m.stopReason,usage:m.usage})}catch(e){if(t.id!==void 0){let n=lx(e);this.sendResponse(t.id,void 0,{code:S.INTERNAL_ERROR,message:dx(e),...n?{data:{authMethods:n}}:{}})}}}vl();function uV(t){let e=fV(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 Ah(e,Ph(t.baseUrl,`/api/v15/registry/resources/${s}/install${a}`),n,"GET"),l=Mx(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 Ah(e,Ph(t.baseUrl,`/api/v15/registry/resources/${o}/versions`),n,"GET");return(Hl(s)&&Array.isArray(s.versions)?s.versions:[]).map(hV).filter(a=>!!a)},async resolveRuntime(r,o){let s=encodeURIComponent(r.trim());if(!s)throw new Error("runtime id is required.");let i=encodeURIComponent(o.trim());if(!i)throw new Error("platform is required.");let a=await Ah(e,Ph(t.baseUrl,`/api/v15/runtime/${s}/resolve?platform=${i}`),n,"GET"),c=yV(a);if(!c)throw new Error("Community hub returned an invalid runtime resolution.");return c}}}function _x(t=mr()){let e=t.get("QLOGIC_LLMROUTER_ACCESS_TOKEN")?.trim();if(!e)return null;let n=pV(t);return uV({baseUrl:mV(t),token:e,clientVersion:n})}function pV(t){let e=t.get("QLOGIC_AGENT_VERSION")?.trim();return e||"2.18.
|
|
317
|
+
${t.prompt}`)}let u={sessionId:t.stream.sessionId,turnId:t.stream.turnId,requestId:t.stream.requestId,deltas:[],streamedAny:!1},p=typeof e.sendNotification=="function"?e.sendNotification.bind(e):void 0,m=(y,A)=>oV({agentId:r,turn:u,method:y,payload:A,sendNotification:p}),f=`del-${ax().slice(0,8)}`,g={onDelta:y=>{y.delta&&m(y.reasoning?"turn.thought_delta":"turn.delta",{text:y.delta})},onToolCall:y=>m("turn.tool_call",{callId:y.callId,toolName:y.name,rawInput:y.arguments}),onToolResult:y=>m("turn.tool_result",{callId:y.callId,toolName:y.name,status:y.ok?"completed":"failed",rawOutput:y.outputPreview}),onApprovalRequest:y=>{JA({agentId:r,approvalId:y.approvalId,toolName:y.toolName,options:y.options??[],hasInteractiveContext:!!u.turnId&&!!p,forward:()=>{p?.("agents.prompt.approval",{agentId:r,sessionId:u.sessionId,turnId:u.turnId,requestId:u.requestId,approvalId:y.approvalId,callId:y.callId??y.approvalId,toolName:y.toolName??"operation",options:y.options??[]})}}).then(A=>n.respond(f,y.approvalId,A),A=>e.log?.(`[agents:delegate] approval decision failed (${y.approvalId}): ${A instanceof Error?A.message:String(A)}`))},onMedia:()=>{},onRelay:()=>{},onLifecycle:y=>{y.state==="exited"&&Th.delete(i),e.log?.(`[agents:delegate] ${r} ${f} lifecycle ${JSON.stringify(y).slice(0,200)}`)}},h={delegationId:f,to:{handle:{kind:"chat",owner:s,name:r,seq:0},agentId:r},input:{messages:[{type:"text",text:d}]},systemPrompt:t.systemPrompt,session:{canonicalSessionId:s,projectId:ee(o),cwd:o,...c?{resumeNativeId:c}:{}},opts:{timeoutMs:t.timeoutMs}},R=await n.send(h,g);t.stream.sessionId&&Th.add(i);let v=u.deltas.join("")||R.content,w=R.usage&&(R.usage.inputTokens||R.usage.outputTokens)?{inputTokens:R.usage.inputTokens??0,outputTokens:R.usage.outputTokens??0,totalTokens:(R.usage.inputTokens??0)+(R.usage.outputTokens??0)}:void 0;return{content:v,streamedAny:u.streamedAny,...R.stopReason?{stopReason:R.stopReason}:{},...w?{usage:w}:{}}}async function Ix(t){try{let e=t.params??{},n=typeof e.agentId=="string"?e.agentId.trim():"";if(!n||n==="qlogicagent"){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,warmed:!1});return}t.id!==void 0&&this.sendResponse(t.id,{ok:!0,warmed:!1})}catch(e){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,warmed:!1,error:e instanceof Error?e.message:String(e)})}}async function Cx(t){try{let e=t.params??{},n=typeof e.agentId=="string"?e.agentId.trim():"",r=typeof e.prompt=="string"?e.prompt:"";if(!n||!r.trim()){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:S.INVALID_PARAMS,message:"agentId and prompt are required."});return}let o=typeof e.projectId=="string"&&e.projectId?se(e.projectId)?.workspaceDir:void 0,s=typeof e.cwd=="string"&&e.cwd?e.cwd:o??(typeof this.getActiveProjectRoot=="function"?this.getActiveProjectRoot():process.cwd()),i=typeof e.timeoutMs=="number"&&e.timeoutMs>0?e.timeoutMs:3e5,a=typeof e.sessionId=="string"?e.sessionId:void 0,c=typeof e.turnId=="string"?e.turnId:void 0,l=typeof e.requestId=="string"?e.requestId:void 0,d=typeof e.projectId=="string"?e.projectId:void 0,u=e.lockSessionOwner!==!1,p=this.getDelegateBridge?.(),m;if(!p?.isSupported())throw new Error("Gateway delegate is required for external agent chat turns");try{m=await dV({host:this,bridge:p,agentId:n,prompt:r,systemPrompt:typeof e.systemPrompt=="string"?e.systemPrompt:"",cwd:s,timeoutMs:i,stream:{sessionId:a,turnId:c,requestId:l}})}catch(g){throw await sV({sessionId:a,projectRoot:s,turnId:c,projectId:d,agentId:n,prompt:r,error:g,lockSessionOwner:u}),g}let f=m.content;if(a){if(!(hh(n)==="native-cwd")){let v=w=>y=>{y==="failed"&&console.error(`[agents] transcript persist failed (${w}) for external session ${a}; the message will be missing after a reload (see [session-persistence] log)`)};mn(a,{role:"user",content:r},s,c).then(v("user message"),w=>console.error(`[agents] transcript persist rejected (user message) for external session ${a}: ${w instanceof Error?w.message:String(w)}`)),f&&mn(a,{role:"assistant",content:f},s,c).then(v("assistant reply"),w=>console.error(`[agents] transcript persist rejected (assistant reply) for external session ${a}: ${w instanceof Error?w.message:String(w)}`))}let R=(await Gt(a,s).catch(()=>null))?.metadata?.title?{}:{title:Ni(r,"External agent session")};Object.keys(R).length>0&&dt(a,R,s).catch(v=>{console.error(`[agents] session metadata persist failed for external session ${a}: ${v instanceof Error?v.message:String(v)}; the session may not appear in the session list`)})}t.id!==void 0&&this.sendResponse(t.id,{ok:!0,agentId:n,content:f,streamed:m.streamedAny,stopReason:m.stopReason,usage:m.usage})}catch(e){if(t.id!==void 0){let n=lx(e);this.sendResponse(t.id,void 0,{code:S.INTERNAL_ERROR,message:dx(e),...n?{data:{authMethods:n}}:{}})}}}vl();function uV(t){let e=fV(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 Ah(e,Ph(t.baseUrl,`/api/v15/registry/resources/${s}/install${a}`),n,"GET"),l=Mx(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 Ah(e,Ph(t.baseUrl,`/api/v15/registry/resources/${o}/versions`),n,"GET");return(Hl(s)&&Array.isArray(s.versions)?s.versions:[]).map(hV).filter(a=>!!a)},async resolveRuntime(r,o){let s=encodeURIComponent(r.trim());if(!s)throw new Error("runtime id is required.");let i=encodeURIComponent(o.trim());if(!i)throw new Error("platform is required.");let a=await Ah(e,Ph(t.baseUrl,`/api/v15/runtime/${s}/resolve?platform=${i}`),n,"GET"),c=yV(a);if(!c)throw new Error("Community hub returned an invalid runtime resolution.");return c}}}function _x(t=mr()){let e=t.get("QLOGIC_LLMROUTER_ACCESS_TOKEN")?.trim();if(!e)return null;let n=pV(t);return uV({baseUrl:mV(t),token:e,clientVersion:n})}function pV(t){let e=t.get("QLOGIC_AGENT_VERSION")?.trim();return e||"2.18.12"}function mV(t){return t.get("QLOGIC_HUB_BASE_URL")?.trim()||t.get("XIAOZHICLAW_HUB_URL")?.trim()||"https://xiaozhi.qlogicagent.com"}function Ph(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 fV(t,e){let n=e?.trim();return n?(r,o)=>t(r,{...o,headers:{...o?.headers,"x-client-version":n}}):t}async function Ah(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 gV(s)}`);return s.json().catch(()=>null)}async function gV(t){try{let e=(await t.text()).trim();return e?` ${e.slice(0,500)}`:""}catch{return""}}function Hl(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function hV(t){return!Hl(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}}function yV(t){if(!Hl(t))return null;let e=typeof t.id=="string"?t.id:"",n=typeof t.version=="string"?t.version:"",r=typeof t.downloadUrl=="string"?t.downloadUrl:"",o=typeof t.checksum=="string"?t.checksum:"",s=typeof t.sizeBytes=="number"?t.sizeBytes:0;return!e||!n||!r||!/^[a-f0-9]{64}$/.test(o)||!Number.isSafeInteger(s)||s<=0?null:{id:e,version:n,downloadUrl:r,checksum:o,sizeBytes:s}}var kV=new Set(["R0","R1","R2","R3"]),bV=new Set(["official","community"]),wV=new Set(["quarantine","trial","trusted"]),vV=new Set(["pending","approved","rejected"]);function Ex(t){return typeof t=="string"&&kV.has(t)?t:null}function SV(t){return typeof t=="string"&&bV.has(t)?t:null}function RV(t){return typeof t=="string"&&wV.has(t)?t:null}function TV(t){return typeof t=="string"&&vV.has(t)?t:null}function Mx(t){if(!Hl(t))return null;let e=SV(t.sourceTier),n=RV(t.trustStage),r=TV(t.reviewStatus),o=Ex(t.resourceRiskTier),s=Ex(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(Mx);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 xh={enabled:!0},PV=new Set(["R2","R3"]);function Dx(t,e=xh){return PV.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{createPublicKey as AV,verify as xV}from"node:crypto";function IV(t){return`id=${t.id}
|
|
318
318
|
version=${t.version}
|
|
319
319
|
checksum=${t.checksum}
|
|
320
320
|
sizeBytes=${t.sizeBytes}`}function CV(t){return t.includes("\\n")?t.replace(/\\n/g,`
|