qlogicagent 2.20.1 → 2.20.2
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 +3 -3
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -158,7 +158,7 @@ ${e?`<result>${e}</result>`:""}
|
|
|
158
158
|
... [truncated ${o} chars] ...
|
|
159
159
|
${t.slice(-r)}`}var Wa=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:vr("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??rF),e.run(r.signal,n.taskId).then(o=>{this.settle(n.taskId,{lifecycle:o.ok?"completed":"failed",output:o.output?lm(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||et(o.lifecycle))return;let s=[r.stdout,r.stderr?`[stderr]
|
|
160
160
|
${r.stderr}`:""].filter(Boolean).join(`
|
|
161
|
-
`);this.store.updateTask(n.taskId,i=>({...i,lifecycle:r.code===0?"completed":"failed",exitCode:r.code,output:lm(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||et(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||et(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=!et(n.lifecycle);if(r&&n.type==="local_bash"&&n.outputPath){let o="";try{o=await tF(n.outputPath,"utf-8")}catch{o=""}return{task:n,output:lm(go(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||et(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||et(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&&!et(r.lifecycle)&&this.cancelTask(r.taskId)&&n.push(r.taskId);return n}cancelAllRunning(){let e=[];for(let n of this.store.getAllTasks())et(n.lifecycle)||this.cancelTask(n.taskId)&&e.push(n.taskId);return e}};Ce();function Ga(){return qe()?.type==="group"}var cm=new Set;function fo(t){return cm.add(t),()=>{cm.delete(t)}}async function xw(){await Promise.all(Array.from(cm).map(t=>t()))}Pe();import{randomUUID as Hw}from"node:crypto";ht();import{createHash as zQ}from"node:crypto";import{randomUUID as VQ}from"node:crypto";import*as ho from"node:fs";import*as Ka from"node:path";function za(t){return Ka.join(xt(t),"feedback","events")}function Aw(t,e){return Ka.join(za(t),`${encodeURIComponent(e)}.json`)}async function dm(t,e){try{return JSON.parse(await ho.promises.readFile(Aw(t,e),"utf8"))}catch{return null}}async function um(t){t.projectId&&(await ho.promises.mkdir(za(t.projectId),{recursive:!0}),await ho.promises.writeFile(Aw(t.projectId,t.turnId),JSON.stringify(t,null,2),"utf8"))}async function Cw(t){let e;try{e=(await ho.promises.readdir(za(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 ho.promises.readFile(Ka.join(za(t),r),"utf8")))}catch{continue}return n}async function Iw(t){return(await Cw(t)).filter(e=>e.upload?.eligible!==!1&&!e.upload?.uploadBatchId)}async function Ew(t,e,n){let r=await dm(t,e);r&&(r.upload={eligible:r.upload?.eligible??!0,uploadBatchId:n},await um(r))}async function pm(t,e,n,r){let o=await dm(t,e);o&&(o.upload={eligible:o.upload?.eligible??!0,uploadBatchId:n,uploadedAt:new Date().toISOString(),redactionVersion:r},await um(o))}async function _w(t){return(await Cw(t)).filter(e=>e.state==="active")}async function Mw(t,e,n){let r=await dm(t,e);r&&(r.distill={proposedAt:new Date().toISOString(),clusterKey:n.clusterKey,idempotencyKey:n.idempotencyKey},await um(r))}import{createHash as oF}from"node:crypto";var Dn="feedback-redaction-v1",sF=500;function mm(t){return oF("sha256").update(t,"utf8").digest("hex")}var iF=[[/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 aF(t){let e=(t??"").slice(0,sF);for(let[n,r]of iF)e=e.replace(n,r);return e}function Dw(t,e=Dn){return{feedbackId:t.feedbackId,rating:t.rating,reason:t.reason,state:t.state,messageHash:t.messageHash,sessionIdHash:mm(t.sessionId),projectIdHash:t.projectId?mm(t.projectId):void 0,turnIdHash:mm(t.turnId),messagePreview:aF(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 Ow(t,e){let n={rollupId:e.rollupId,periodStart:e.periodStart,periodEnd:e.periodEnd,total:0,upCount:0,downCount:0,byReason:{},byModel:{},byAgentMode:{},telemetryStatusCounts:{complete:0,partial:0,missing:0},redactionVersion:e.redactionVersion??Dn,createdAt:new Date().toISOString()};for(let r of t){n.total+=1,r.rating==="up"?n.upCount+=1:n.downCount+=1,r.rating==="down"&&r.reason&&(n.byReason[r.reason]=(n.byReason[r.reason]??0)+1);let o=r.model??"unknown",s=n.byModel[o]??={up:0,down:0};s[r.rating]+=1;let i=r.agentMode??"unknown",a=n.byAgentMode[i]??={up:0,down:0};a[r.rating]+=1,n.telemetryStatusCounts[r.telemetryStatus]+=1}return n}ht();import{randomUUID as lF}from"node:crypto";import*as Va from"node:fs";import*as Ya from"node:path";var cF=6,dF=6e4,uF=30*6e4;function Nw(t){return Ya.join(xt(t),"feedback","outbox.json")}async function Xa(t){try{let e=JSON.parse(await Va.promises.readFile(Nw(t),"utf8"));return Array.isArray(e)?e:[]}catch{return[]}}async function gm(t,e){let n=Nw(t);await Va.promises.mkdir(Ya.dirname(n),{recursive:!0}),await Va.promises.writeFile(n,JSON.stringify(e,null,2),"utf8")}function pF(t){return Math.min(dF*2**Math.max(0,t-1),uF)}async function Lw(t,e,n=new Date){let r=await Xa(t),o=r.find(a=>a.idempotencyKey===e.idempotencyKey);if(o)return o;let s=n.toISOString(),i={entryId:lF(),idempotencyKey:e.idempotencyKey,op:e.op,payload:e.payload,attempts:0,createdAt:s,nextAttemptAt:s};return r.push(i),await gm(t,r),i}async function $w(t,e=new Date){return(await Xa(t)).filter(r=>r.attempts<cF&&Date.parse(r.nextAttemptAt)<=e.getTime())}async function jw(t,e){let n=await Xa(t),r=n.filter(o=>o.entryId!==e);r.length!==n.length&&await gm(t,r)}async function Fw(t,e,n,r=new Date){let o=await Xa(t),s=o.find(i=>i.entryId===e);s&&(s.attempts+=1,s.lastError=n,s.nextAttemptAt=new Date(r.getTime()+pF(s.attempts)).toISOString(),await gm(t,o))}function mF(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 Uw(t,e={}){let n=process.env.QLOGIC_LLMROUTER_REFRESH_TOKEN?.trim();if(!n)return!1;let o=await(e.fetchFn??fetch)(`${t.replace(/\/+$/,"")}/auth/refresh`,{method:"POST",headers:{authorization:`Bearer ${n}`},signal:e.signal});if(!o.ok)return!1;let s=await o.json().catch(()=>({})),i=s.data?.access_token?.trim();if(!i)return!1;process.env.QLOGIC_LLMROUTER_ACCESS_TOKEN=i;let a=s.data?.refresh_token?.trim();return a&&(process.env.QLOGIC_LLMROUTER_REFRESH_TOKEN=a),!0}async function Ja(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=!1,i=!1;mF(process.env.QLOGIC_LLMROUTER_ACCESS_TOKEN?.trim())&&(s=!0,i=await Uw(n,{fetchFn:r,signal:o}));let a=()=>{let c=Object.fromEntries(new Headers(e.init?.headers).entries()),d=process.env.QLOGIC_LLMROUTER_ACCESS_TOKEN?.trim();return d&&(c.authorization=`Bearer ${d}`),r(`${n.replace(/\/+$/,"")}/${t.replace(/^\/+/,"")}`,{...e.init,headers:c,signal:o})},l=await a();return l.status===401&&!s&&(s=!0,i=await Uw(n,{fetchFn:r,signal:o}),i&&(l=await a())),{response:l,refreshedToken:i}}function gF(){return"2.20.1"}function fF(){let t=process.env.QLOGIC_LLMROUTER_BASE_URL?.trim();if(t)return`${t.replace(/\/+$/,"")}/client/feedback`}async function fm(t,e){if(!fF())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{response:o,refreshedToken:s}=await Ja("/client/feedback/uploadBatch",{signal:r,init:hF(t)});if(!o.ok){let a=await o.text().catch(()=>"");return{ok:!1,status:o.status,error:`HTTP ${o.status}${a?`: ${a.slice(0,200)}`:""}`}}return{ok:!0,accepted:(await o.json().catch(()=>({}))).accepted??t.events.length,status:o.status,refreshedToken:s}}catch(o){return{ok:!1,error:o instanceof Error?o.message:String(o)}}}function hF(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??gF(),uploadTarget:"llmrouter"})}}function yF(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 bF(t,e){let n=0;for(let r of await $w(t,e)){let o=r.payload,s=await fm({batchId:o.batchId,events:o.events,rollups:o.rollups??[],redactionVersion:o.redactionVersion??Dn});if(s.ok){for(let i of o.turnIds??[])await pm(t,i,o.batchId,o.redactionVersion??Dn);await jw(t,r.entryId),n+=1}else await Fw(t,r.entryId,s.error??"upload failed",e)}return n}async function Bw(t,e=new Date){let n=await bF(t,e),r=await Iw(t);if(r.length===0)return{uploaded:0,queued:0,retried:n};let o=Hw(),s=r.map(p=>Dw(p)),i=r.map(p=>p.turnId),{periodStart:a,periodEnd:l}=yF(r),c=Ow(r,{rollupId:Hw(),periodStart:a,periodEnd:l});if((await fm({batchId:o,events:s,rollups:[c],redactionVersion:Dn})).ok){for(let p of i)await pm(t,p,o,Dn);return{uploaded:r.length,queued:0,retried:n}}for(let p of i)await Ew(t,p,o);return await Lw(t,{idempotencyKey:o,op:"uploadBatch",payload:{batchId:o,events:s,rollups:[c],turnIds:i,redactionVersion:Dn}},e),{uploaded:0,queued:r.length,retried:n}}import{createHash as kF}from"node:crypto";var wF=2;function vF(t){return t.rating==="down"?`dislike:${t.reason??"other"}`:"like"}var SF={"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 TF(t){return SF[t]??"\u7528\u6237\u5BF9\u8FD9\u7C7B\u56DE\u7B54\u6709\u660E\u786E\u504F\u597D,\u5E94\u636E\u5176\u53CD\u9988\u8C03\u6574\u3002"}function RF(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 PF(t){return Math.max(.3,Math.min(.9,Number((.4+.1*t).toFixed(4))))}function xF(t,e){return kF("sha256").update(`${t}
|
|
161
|
+
`);this.store.updateTask(n.taskId,i=>({...i,lifecycle:r.code===0?"completed":"failed",exitCode:r.code,output:lm(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||et(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||et(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=!et(n.lifecycle);if(r&&n.type==="local_bash"&&n.outputPath){let o="";try{o=await tF(n.outputPath,"utf-8")}catch{o=""}return{task:n,output:lm(go(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||et(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||et(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&&!et(r.lifecycle)&&this.cancelTask(r.taskId)&&n.push(r.taskId);return n}cancelAllRunning(){let e=[];for(let n of this.store.getAllTasks())et(n.lifecycle)||this.cancelTask(n.taskId)&&e.push(n.taskId);return e}};Ce();function Ga(){return qe()?.type==="group"}var cm=new Set;function fo(t){return cm.add(t),()=>{cm.delete(t)}}async function xw(){await Promise.all(Array.from(cm).map(t=>t()))}Pe();import{randomUUID as Hw}from"node:crypto";ht();import{createHash as zQ}from"node:crypto";import{randomUUID as VQ}from"node:crypto";import*as ho from"node:fs";import*as Ka from"node:path";function za(t){return Ka.join(xt(t),"feedback","events")}function Aw(t,e){return Ka.join(za(t),`${encodeURIComponent(e)}.json`)}async function dm(t,e){try{return JSON.parse(await ho.promises.readFile(Aw(t,e),"utf8"))}catch{return null}}async function um(t){t.projectId&&(await ho.promises.mkdir(za(t.projectId),{recursive:!0}),await ho.promises.writeFile(Aw(t.projectId,t.turnId),JSON.stringify(t,null,2),"utf8"))}async function Cw(t){let e;try{e=(await ho.promises.readdir(za(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 ho.promises.readFile(Ka.join(za(t),r),"utf8")))}catch{continue}return n}async function Iw(t){return(await Cw(t)).filter(e=>e.upload?.eligible!==!1&&!e.upload?.uploadBatchId)}async function Ew(t,e,n){let r=await dm(t,e);r&&(r.upload={eligible:r.upload?.eligible??!0,uploadBatchId:n},await um(r))}async function pm(t,e,n,r){let o=await dm(t,e);o&&(o.upload={eligible:o.upload?.eligible??!0,uploadBatchId:n,uploadedAt:new Date().toISOString(),redactionVersion:r},await um(o))}async function _w(t){return(await Cw(t)).filter(e=>e.state==="active")}async function Mw(t,e,n){let r=await dm(t,e);r&&(r.distill={proposedAt:new Date().toISOString(),clusterKey:n.clusterKey,idempotencyKey:n.idempotencyKey},await um(r))}import{createHash as oF}from"node:crypto";var Dn="feedback-redaction-v1",sF=500;function mm(t){return oF("sha256").update(t,"utf8").digest("hex")}var iF=[[/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 aF(t){let e=(t??"").slice(0,sF);for(let[n,r]of iF)e=e.replace(n,r);return e}function Dw(t,e=Dn){return{feedbackId:t.feedbackId,rating:t.rating,reason:t.reason,state:t.state,messageHash:t.messageHash,sessionIdHash:mm(t.sessionId),projectIdHash:t.projectId?mm(t.projectId):void 0,turnIdHash:mm(t.turnId),messagePreview:aF(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 Ow(t,e){let n={rollupId:e.rollupId,periodStart:e.periodStart,periodEnd:e.periodEnd,total:0,upCount:0,downCount:0,byReason:{},byModel:{},byAgentMode:{},telemetryStatusCounts:{complete:0,partial:0,missing:0},redactionVersion:e.redactionVersion??Dn,createdAt:new Date().toISOString()};for(let r of t){n.total+=1,r.rating==="up"?n.upCount+=1:n.downCount+=1,r.rating==="down"&&r.reason&&(n.byReason[r.reason]=(n.byReason[r.reason]??0)+1);let o=r.model??"unknown",s=n.byModel[o]??={up:0,down:0};s[r.rating]+=1;let i=r.agentMode??"unknown",a=n.byAgentMode[i]??={up:0,down:0};a[r.rating]+=1,n.telemetryStatusCounts[r.telemetryStatus]+=1}return n}ht();import{randomUUID as lF}from"node:crypto";import*as Va from"node:fs";import*as Ya from"node:path";var cF=6,dF=6e4,uF=30*6e4;function Nw(t){return Ya.join(xt(t),"feedback","outbox.json")}async function Xa(t){try{let e=JSON.parse(await Va.promises.readFile(Nw(t),"utf8"));return Array.isArray(e)?e:[]}catch{return[]}}async function gm(t,e){let n=Nw(t);await Va.promises.mkdir(Ya.dirname(n),{recursive:!0}),await Va.promises.writeFile(n,JSON.stringify(e,null,2),"utf8")}function pF(t){return Math.min(dF*2**Math.max(0,t-1),uF)}async function Lw(t,e,n=new Date){let r=await Xa(t),o=r.find(a=>a.idempotencyKey===e.idempotencyKey);if(o)return o;let s=n.toISOString(),i={entryId:lF(),idempotencyKey:e.idempotencyKey,op:e.op,payload:e.payload,attempts:0,createdAt:s,nextAttemptAt:s};return r.push(i),await gm(t,r),i}async function $w(t,e=new Date){return(await Xa(t)).filter(r=>r.attempts<cF&&Date.parse(r.nextAttemptAt)<=e.getTime())}async function jw(t,e){let n=await Xa(t),r=n.filter(o=>o.entryId!==e);r.length!==n.length&&await gm(t,r)}async function Fw(t,e,n,r=new Date){let o=await Xa(t),s=o.find(i=>i.entryId===e);s&&(s.attempts+=1,s.lastError=n,s.nextAttemptAt=new Date(r.getTime()+pF(s.attempts)).toISOString(),await gm(t,o))}function mF(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 Uw(t,e={}){let n=process.env.QLOGIC_LLMROUTER_REFRESH_TOKEN?.trim();if(!n)return!1;let o=await(e.fetchFn??fetch)(`${t.replace(/\/+$/,"")}/auth/refresh`,{method:"POST",headers:{authorization:`Bearer ${n}`},signal:e.signal});if(!o.ok)return!1;let s=await o.json().catch(()=>({})),i=s.data?.access_token?.trim();if(!i)return!1;process.env.QLOGIC_LLMROUTER_ACCESS_TOKEN=i;let a=s.data?.refresh_token?.trim();return a&&(process.env.QLOGIC_LLMROUTER_REFRESH_TOKEN=a),!0}async function Ja(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=!1,i=!1;mF(process.env.QLOGIC_LLMROUTER_ACCESS_TOKEN?.trim())&&(s=!0,i=await Uw(n,{fetchFn:r,signal:o}));let a=()=>{let c=Object.fromEntries(new Headers(e.init?.headers).entries()),d=process.env.QLOGIC_LLMROUTER_ACCESS_TOKEN?.trim();return d&&(c.authorization=`Bearer ${d}`),r(`${n.replace(/\/+$/,"")}/${t.replace(/^\/+/,"")}`,{...e.init,headers:c,signal:o})},l=await a();return l.status===401&&!s&&(s=!0,i=await Uw(n,{fetchFn:r,signal:o}),i&&(l=await a())),{response:l,refreshedToken:i}}function gF(){return"2.20.2"}function fF(){let t=process.env.QLOGIC_LLMROUTER_BASE_URL?.trim();if(t)return`${t.replace(/\/+$/,"")}/client/feedback`}async function fm(t,e){if(!fF())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{response:o,refreshedToken:s}=await Ja("/client/feedback/uploadBatch",{signal:r,init:hF(t)});if(!o.ok){let a=await o.text().catch(()=>"");return{ok:!1,status:o.status,error:`HTTP ${o.status}${a?`: ${a.slice(0,200)}`:""}`}}return{ok:!0,accepted:(await o.json().catch(()=>({}))).accepted??t.events.length,status:o.status,refreshedToken:s}}catch(o){return{ok:!1,error:o instanceof Error?o.message:String(o)}}}function hF(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??gF(),uploadTarget:"llmrouter"})}}function yF(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 bF(t,e){let n=0;for(let r of await $w(t,e)){let o=r.payload,s=await fm({batchId:o.batchId,events:o.events,rollups:o.rollups??[],redactionVersion:o.redactionVersion??Dn});if(s.ok){for(let i of o.turnIds??[])await pm(t,i,o.batchId,o.redactionVersion??Dn);await jw(t,r.entryId),n+=1}else await Fw(t,r.entryId,s.error??"upload failed",e)}return n}async function Bw(t,e=new Date){let n=await bF(t,e),r=await Iw(t);if(r.length===0)return{uploaded:0,queued:0,retried:n};let o=Hw(),s=r.map(p=>Dw(p)),i=r.map(p=>p.turnId),{periodStart:a,periodEnd:l}=yF(r),c=Ow(r,{rollupId:Hw(),periodStart:a,periodEnd:l});if((await fm({batchId:o,events:s,rollups:[c],redactionVersion:Dn})).ok){for(let p of i)await pm(t,p,o,Dn);return{uploaded:r.length,queued:0,retried:n}}for(let p of i)await Ew(t,p,o);return await Lw(t,{idempotencyKey:o,op:"uploadBatch",payload:{batchId:o,events:s,rollups:[c],turnIds:i,redactionVersion:Dn}},e),{uploaded:0,queued:r.length,retried:n}}import{createHash as kF}from"node:crypto";var wF=2;function vF(t){return t.rating==="down"?`dislike:${t.reason??"other"}`:"like"}var SF={"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 TF(t){return SF[t]??"\u7528\u6237\u5BF9\u8FD9\u7C7B\u56DE\u7B54\u6709\u660E\u786E\u504F\u597D,\u5E94\u636E\u5176\u53CD\u9988\u8C03\u6574\u3002"}function RF(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 PF(t){return Math.max(.3,Math.min(.9,Number((.4+.1*t).toFixed(4))))}function xF(t,e){return kF("sha256").update(`${t}
|
|
162
162
|
${e.join(",")}`).digest("hex").slice(0,32)}function qw(t){let e=new Map;for(let r of t){if(r.state!=="active")continue;let o=vF(r),s=e.get(o);s?s.push(r):e.set(o,[r])}let n=[];for(let[r,o]of e){if(o.length<wF)continue;let s=o.map(l=>l.feedbackId).sort(),i=[...new Set(o.map(l=>l.turnId))].sort(),a=new Set(o.map(l=>l.sessionId)).size>=2;n.push({clusterKey:r,text:TF(r),category:"feedback_preference",importance:PF(o.length),confidence:RF(o.length,a),evidence:{kind:"feedback",refs:[...s,...i.map(l=>`turn:${l}`)],idempotencyKey:xF(r,s)},stats:{evidence:o.length,crossSession:a,feedbackIds:s,turnIds:i}})}return n.sort((r,o)=>r.clusterKey.localeCompare(o.clusterKey)),n}var Ww=()=>{};function Gw(t){Ww=t}function Qa(){return Ww()}async function zw(t,e,n){if(!e.proposeExtracted)return{candidates:0,proposed:0};let r=Qa(),o=r?await r.listDistillableFeedback(t):await _w(t);if(o.length===0)return{candidates:0,proposed:0};let s=qw(o),i=0;for(let a of s)try{let l=await e.proposeExtracted([{text:a.text,category:a.category,importance:a.importance,confidence:a.confidence,evidence:a.evidence}],n,{source:"feedback"});i+=l?.proposalsAdded??0;for(let c of a.stats.turnIds){let d={clusterKey:a.clusterKey,idempotencyKey:a.evidence.idempotencyKey};r?await r.markFeedbackDistilled(t,c,d):await Mw(t,c,d)}}catch(l){console.error(`[feedback:distill] candidate skipped (cluster ${a.clusterKey}): ${l instanceof Error?l.message:String(l)}`)}return{candidates:s.length,proposed:i}}tt();bo();hm();var cU="\u65E0\u6CD5\u8FDE\u63A5 llmrouter \u6A21\u578B\u76EE\u5F55",Tr="llmrouter";var _v=6e4,Rm=new Map,Tm=new Map,un=class extends Error{constructor(e=cU){super(e),this.name="LlmrouterCatalogUnavailableError"}},ol=class extends Error{status;constructor(e,n="llmrouter inference key rejected (not active)"){super(n),this.name="LlmrouterAuthError",this.status=e}};function xm(t=kt()){let e=t.get("QLOGIC_LLMROUTER_BASE_URL")?.trim().replace(/\/+$/,"");if(!e)throw new un;return e}function Mv(t=kt()){let e={accept:"application/json"},n=t.get("QLOGIC_LLMROUTER_ACCESS_TOKEN")?.trim();return n&&(e.authorization=`Bearer ${n}`),e}async function Dv(t,e){let n=xm(e),r=Mv(e),o=`${n}
|
|
163
163
|
${t}
|
|
164
164
|
${r.authorization??""}`,s=Rm.get(o);if(s&&Date.now()<s.expiresAt)return s.value;let i=Tm.get(o);if(i)return await i;let a=Nv(n,t,r).then(l=>(Rm.set(o,{value:l,expiresAt:Date.now()+_v}),l)).finally(()=>{Tm.delete(o)});return Tm.set(o,a),a}async function Ov(t,e){let n=xm(e),r=Mv(e),o=`${n}
|
|
@@ -303,7 +303,7 @@ ${Fm(n)}`)}catch(i){return console.error(`[context-compression] LLM summarizatio
|
|
|
303
303
|
|
|
304
304
|
${Fm(n)}`}}}function Fm(t){let e=[],n=t.filter(s=>s.role==="user"),r=n.slice(0,20).map(s=>{let i=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=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(`
|
|
305
305
|
`)}function jH(){return Gd(new ir(Hm),new Tn(20,xr),new Yr(xr))}function ES(t,e){let n=zd(new ir(Hm),new Tn(20,xr),new es({protectedHeadExchanges:1,protectedTailMessages:8,summarize:t,estimateTokens:xr}),new Yr(xr));return new ts({inner:n,estimateTokens:xr,onCacheInvalidated:e?.onCacheInvalidated})}var Bm=null;function OS(t,e){let n=e?.budget??ta({modelContextWindow:_S(e?.model)}),o=(e?.pipeline??jH()).compress(t,n);if(o.droppedCount>0){let s=Ar(t),i=Ar(o.messages);MS.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:ss(s,n)})}return o.droppedCount>0&&Bm?.(o.droppedCount,Ar(o.messages)),o}async function FH(t,e,n){let r=n??ta({modelContextWindow:_S(e.model)}),o=Ar(t),s=ss(o,r),i;switch(s){case"none":i={messages:t,droppedCount:0,strategy:"none"};break;case"trim-only":i=new ir(Hm).compress(t,r);break;case"sliding-window":{i=await ES(e.summarize).compressAsync(t,r);break}case"llm-summarize":{let a=e.pipeline??ES(e.summarize);i=os(a)?await a.compressAsync(t,r):a.compress(t,r);break}}return i.droppedCount>0&&(i={...i,messages:await Vd(i.messages,t,{maxFiles:5,maxTokenBudget:5e4,readFile:async a=>{try{return await OH(a,"utf-8")}catch{return null}}})}),UH(t,i,r),i}function UH(t,e,n){if(e.droppedCount>0||e.metrics?.usedLlm){let r=e.metrics?.tokensBefore||Ar(t),o=e.metrics?.tokensAfter||Ar(e.messages);MS.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:ss(r,n)})}if(e.droppedCount>0){let r=e.metrics?.tokensAfter||Ar(e.messages);Bm?.(e.droppedCount,r)}}function HH(t,e){let n=$H(t,e),r={id:"builtin-compressor",label:"4-Layer Compression Funnel (built-in)",async compressAsync(o,s,i){return FH(o,{budget:s,model:i?.model,sessionId:i?.sessionId,summarize:n},s)}};Um.register(r),Um.activate(r.id),t.info(`[context-compression] registered context engine: ${r.id}`)}function NS(t,e,n){HH(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"}}}),Bm=(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 LS(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 Ln(t){return t?.riskLevel?t.riskLevel:t?.isDangerous?"system":t?.isReadOnly?"read":t?.isEgress?"external_egress":"write"}function BH(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 qH(t,e){let n=Ln(t.meta);return n==="write"&&BH(t.function.name,e.dangerousPatterns)?"system":n}function WH(t){return`risk_${t}`}function GH(t,e){let n=t.function.name,r=qH(t,e),o=[];return e.blockedToolNames?.includes(n)?(o.push("policy_blocked"),{decision:"deny",riskLevel:r,reasonCodes:o}):(o.push(WH(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 zH(t){switch(t){case"allow":return"eligible";case"ask":return"approval-required";case"deny":return"blocked-by-policy"}}function $S(t,e={}){let n=new Map,r=[],o=[],s=[];for(let i of t){let a=i.function.name,{decision:l,riskLevel:c,reasonCodes:d}=GH(i,e),u=zH(l),p={toolName:a,status:u,decision:l,riskLevel:c,approvalRequired:l==="ask",reasonCodes:d};if(n.set(a,p),l==="deny"){o.push(p);continue}r.push(i),l==="ask"&&s.push(p)}return{eligibleTools:r,blockedTools:o,approvalRequiredTools:s,eligibilityByName:n}}function dl(){return{detectRecallCategories:Ok,resolveModelForPurpose:t=>te().resolveModelForPurpose(t),toolLoop:{createContentReplacementState:kS,enforceToolResultBudget:PS,getActiveContextCompressionEngine:()=>DS().getActive()??null,compressMessages:OS,getBudgetContinuationMessage:LS,createStreamingToolExecutor:t=>new cl(t),resolveToolEligibility:(t,e)=>$S(t,e)}}}var pn=({transport:t,apiKey:e,toolInvoker:n,log:r,hooks:o,maxRounds:s})=>new fr({llmTransport:t,apiKey:e,toolInvoker:n,log:r,hooks:o,maxRounds:s,runtimePorts:dl()});async function wo(t){let e=t.params??{},n=e.turnId??jS(),r=e.sessionId,o=e.config,s=ye(),i=o?.memoryRoot||this.resolveMemoryRoot?.()||qm.join(s,"memory"),a=o?.transcriptDir||this.resolveTranscriptDir?.()||qm.join(s,"agent-logs"),l=o?.dreamSessionIds??[];t.id!==void 0&&this.sendResponse(t.id,{accepted:!0,turnId:n});let c=new AbortController;this.activeTurn=c,this.log(`dream ${n} starting (session: ${r}, sessions reviewing: ${l.length})`),this.sendNotification("system.activity",{category:"dream",level:"info",title:"\u68A6\u5883\u6574\u7406\u542F\u52A8",detail:`\u6B63\u5728\u56DE\u987E ${l.length} \u4E2A\u4F1A\u8BDD\u7684\u8BB0\u5FC6...`});let d={provider:o?.provider,model:o?.model,apiKey:o?.apiKey,baseUrl:o?.baseUrl,maxRounds:o?.maxRounds,temperature:o?.temperature,contextWindowTokens:o?.contextWindowTokens,maxOutputTokens:o?.maxOutputTokens,modelMaxOutputTokens:o?.modelMaxOutputTokens,reasoning:o?.reasoning,promptCacheKey:o?.promptCacheKey,promptCacheRetention:o?.promptCacheRetention,serviceTier:o?.serviceTier,openaiBuiltinTools:o?.openaiBuiltinTools,maxToolCalls:o?.maxToolCalls,parallelToolCalls:o?.parallelToolCalls,textVerbosity:o?.textVerbosity};{let p=d.provider??"",m=d.model??"";if(p&&m){let g=te().getModelInfo(p,m);g?.streamRequired&&(d.streamRequired=!0),!d.contextWindowTokens&&g?.contextWindow&&(d.contextWindowTokens=g.contextWindow)}}if(!this.resolveAgent(d)||!this.currentTransport){this.sendNotification("turn.start",{turnId:n}),this.sendNotification("turn.error",{turnId:n,error:{message:"No LLM provider configured for dream.",code:"NO_PROVIDER"}});return}this.sendNotification("turn.start",{turnId:n});try{let p={context:{memoryRoot:i,transcriptDir:a,currentSessionId:r,listSessionsSince:async()=>l,currentSessionTurnCount:o?.currentSessionTurnCount??0},triggerConfig:{force:o?.force!==!1},transport:this.currentTransport,toolInvoker:{invoke:async(g,f,h,w)=>{if(f.startsWith("$"))return{result:h};let k=this.toolCatalog.findTool(f);if(!k||typeof k.execute!="function")return{result:"",error:`Unknown tool: ${f}`};let v=`tc_${jS().slice(0,8)}`;try{let T=JSON.parse(h),C=await k.execute(v,T,w);return{result:C.content.map(I=>I.text??"").join(`
|
|
306
|
-
`),error:C.details?.error}}catch(T){return{result:"",error:T instanceof Error?T.message:String(T)}}}},createAgentRunner:pn,tools:this.toolCatalog.getToolManifest(),taskStore:this.taskStore,apiKey:this.currentApiKey,model:d.model??this.currentModel,log:{info:g=>this.log(g),warn:g=>this.log(`[warn] ${g}`),error:g=>this.log(`[error] ${g}`),debug:g=>{this.verbose&&this.log(`[debug] ${g}`)}},hooks:this.currentHooks??void 0,parentSignal:c.signal,memoryProvider:this.memoryProvider??void 0,memoryUserId:this.memoryUserId||void 0},m=await mS(p);await KH(this,i),m.ok?(this.sendNotification("system.activity",{category:"dream",level:"success",title:"\u68A6\u5883\u6574\u7406\u5B8C\u6210",detail:`\u56DE\u987E ${m.sessionsReviewed} \u4E2A\u4F1A\u8BDD\uFF0C\u6574\u7406 ${m.filesTouched.length} \u4E2A\u8BB0\u5FC6\u6587\u4EF6\uFF0C\u8017\u65F6 ${m.durationMs}ms`}),this.sendNotification("memory.updated",{source:"dream",target:"consolidation",files:m.filesTouched}),this.sendNotification("turn.end",{turnId:n,content:`Dream consolidation completed. ${m.sessionsReviewed} sessions reviewed, ${m.filesTouched.length} files touched. Duration: ${m.durationMs}ms.`,usage:{inputTokens:0,outputTokens:0}})):(this.sendNotification("system.activity",{category:"dream",level:"error",title:"\u68A6\u5883\u6574\u7406\u5931\u8D25",detail:m.error??"\u672A\u77E5\u9519\u8BEF"}),this.sendNotification("turn.error",{turnId:n,error:{message:m.error??"Dream consolidation failed",code:"DREAM_FAILED"}})),this.log(`dream ${n} completed`)}catch(p){if(c.signal.aborted)this.sendNotification("system.activity",{category:"dream",level:"warn",title:"\u68A6\u5883\u6574\u7406\u88AB\u4E2D\u65AD"}),this.sendNotification("turn.error",{turnId:n,error:{message:"Dream aborted",code:"ABORTED"}});else{let m=p instanceof Error?p.message:String(p);this.sendNotification("system.activity",{category:"dream",level:"error",title:"\u68A6\u5883\u6574\u7406\u5F02\u5E38",detail:m}),this.sendNotification("turn.error",{turnId:n,error:{message:m,code:"INTERNAL_ERROR"}})}}finally{this.activeTurn===c&&(this.activeTurn=null)}}async function KH(t,e){if(!(!t.memoryProvider||!t.memoryUserId)){try{let n=await hS({adapter:t.memoryProvider,userId:t.memoryUserId,memoryRoot:e,log:{info:r=>t.log(r),debug:r=>{t.verbose&&t.log(r)}}});n.ran&&(t.sendNotification("memory.decay.completed",{decayed:n.decayed,archived:n.archived,durationMs:n.durationMs}),t.sendNotification("system.activity",{category:"decay",level:"info",title:"\u8BB0\u5FC6\u8870\u51CF\u5B8C\u6210",detail:`\u8870\u51CF ${n.decayed} \u6761\uFF0C\u5F52\u6863 ${n.archived} \u6761 (${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`),t.sendNotification("system.activity",{category:"consolidation",level:"info",title:"\u8BB0\u5FC6\u51B2\u7A81\u6574\u7406",detail:`\u89E3\u51B3 ${r.conflictsResolved} \u5904\u51B2\u7A81\uFF0C\u786E\u8BA4 ${r.claimsPromoted} \u6761\u5F85\u5B9A\u8BB0\u5FC6`}))}}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)}`)}}}bo();function VH(t){let e=JH(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)}`:"",l=await Gm(e,Wm(t.baseUrl,`/api/v15/registry/resources/${s}/install${a}`),n,"GET"),c=BS(l);if(!c)throw new Error("Community hub returned an invalid install resolution.");return c},async listResourceVersions(r){let o=encodeURIComponent(r.trim());if(!o)throw new Error("resourceId is required.");let s=await Gm(e,Wm(t.baseUrl,`/api/v15/registry/resources/${o}/versions`),n,"GET");return(ul(s)&&Array.isArray(s.versions)?s.versions:[]).map(ZH).filter(a=>!!a)},async resolveRuntime(r,o){let s=r.trim(),i=encodeURIComponent(s);if(!i)throw new Error("runtime id is required.");let a=o.trim(),l=encodeURIComponent(a);if(!l)throw new Error("platform is required.");let c=await Gm(e,Wm(t.baseUrl,`/api/v15/runtime/${i}/resolve?platform=${l}`),n,"GET"),d=eB(c,s,a);if(!d)throw new Error("Community hub returned an invalid runtime resolution.");return d}}}function HS(t=kt()){let e=t.get("QLOGIC_LLMROUTER_ACCESS_TOKEN")?.trim();if(!e)return null;let n=YH(t);return VH({baseUrl:XH(t),token:e,clientVersion:n})}function YH(t){let e=t.get("QLOGIC_AGENT_VERSION")?.trim();return e||"2.20.1"}function XH(t){return t.get("QLOGIC_HUB_BASE_URL")?.trim()||t.get("XIAOZHICLAW_HUB_URL")?.trim()||"https://xiaozhi.qlogicagent.com"}function Wm(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 JH(t,e){let n=e?.trim();return n?(r,o)=>t(r,{...o,headers:{...o?.headers,"x-client-version":n}}):t}async function Gm(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 QH(s)}`);return s.json().catch(()=>null)}async function QH(t){try{let e=(await t.text()).trim();return e?` ${e.slice(0,500)}`:""}catch{return""}}function ul(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function ZH(t){return!ul(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 eB(t,e,n){if(!ul(t))return null;let r=typeof t.id=="string"?t.id:"",o=typeof t.platform=="string"?t.platform:"",s=typeof t.version=="string"?t.version:"",i=typeof t.downloadUrl=="string"?t.downloadUrl:"",a=typeof t.checksum=="string"?t.checksum:"",l=typeof t.sizeBytes=="number"?t.sizeBytes:0;if(!r||r!==e||o!==n||!s||!i||!/^[a-f0-9]{64}$/.test(a)||!Number.isSafeInteger(l)||l<=0)return null;let c=t.format,d=c===void 0&&r==="officecli"?"executable":c;if(d!=="executable"&&d!=="zip"&&d!=="tar.gz")return null;let u=typeof t.entrypoint=="string"?t.entrypoint:void 0;return(d==="zip"||d==="tar.gz")&&!FS(u)||u!==void 0&&!FS(u)?null:{id:r,platform:o,version:s,downloadUrl:i,checksum:a,sizeBytes:l,format:d,...u?{entrypoint:u}:{}}}function FS(t){return!t||t.includes("\\")||t.startsWith("/")||/^[a-zA-Z]:/.test(t)?!1:t.split("/").every(n=>!!n&&n!=="."&&n!=="..")}var tB=new Set(["R0","R1","R2","R3"]),nB=new Set(["official","community"]),rB=new Set(["quarantine","trial","trusted"]),oB=new Set(["pending","approved","rejected"]);function US(t){return typeof t=="string"&&tB.has(t)?t:null}function sB(t){return typeof t=="string"&&nB.has(t)?t:null}function iB(t){return typeof t=="string"&&rB.has(t)?t:null}function aB(t){return typeof t=="string"&&oB.has(t)?t:null}function BS(t){if(!ul(t))return null;let e=sB(t.sourceTier),n=iB(t.trustStage),r=aB(t.reviewStatus),o=US(t.resourceRiskTier),s=US(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(c=>typeof c!="string"))return null;let l=a.map(BS);return l.some(c=>!c)?null:{id:t.id,type:t.type,kind:t.kind,sourceTier:e,trustStage:n,reviewStatus:r,resourceRiskTier:o,effectiveRiskTier:s,requires:i,dependencies:l,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 zm={enabled:!0},lB=new Set(["R2","R3"]);function qS(t,e=zm){return lB.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 MB}from"node:zlib";import{gunzipSync as mB}from"node:zlib";import*as Ds from"node:fs/promises";import*as qt from"node:path";Pe();import{createHash as KS}from"node:crypto";import{existsSync as cB}from"node:fs";import*as nt from"node:fs/promises";import*as pl from"node:path";import{Transform as Wne}from"node:stream";import{pipeline as zne}from"node:stream/promises";var dB=4*1024*1024,uB=3;async function VS(t,e,n){let r=pl.join(Rt(),"cache","downloads",`${pB(e.downloadUrl)}.part`),o=0;if(cB(r)){let c=(await nt.stat(r)).size;o=c<e.sizeBytes?c:0,o===0&&await nt.rm(r,{force:!0})}let s=await GS(t,e.downloadUrl,o,WS(o,e.sizeBytes),n);if(s.whole)return await nt.rm(r,{force:!0}).catch(()=>{}),zS(s.bytes,e,n);await nt.mkdir(pl.dirname(r),{recursive:!0});let i=await nt.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 c=await GS(t,e.downloadUrl,o,WS(o,e.sizeBytes),n);if(c.bytes.length===0)throw new Error(`${n} download truncated.`);await i.write(c.bytes,0,c.bytes.length,o),o+=c.bytes.length}}finally{await i.close()}let a=await nt.readFile(r),l=zS(a,e,n,r);return await nt.rm(r,{force:!0}).catch(()=>{}),l}function WS(t,e){return Math.min(t+dB,e)-1}function pB(t){return KS("sha256").update(t).digest("hex").slice(0,32)}async function GS(t,e,n,r,o){let s=0;for(let i=0;i<uB;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 zS(t,e,n,r){let o=s=>{throw r&&nt.rm(r,{force:!0}).catch(()=>{}),new Error(s)};return t.length!==e.sizeBytes&&o(`${n} size did not match registry metadata.`),KS("sha256").update(t).digest("hex")!==e.checksum&&o(`${n} checksum did not match registry metadata.`),t}var Km=64*1024*1024,Vm=1024,gB=Km+Vm*512+1024;async function gl(t,e,n){return VS(t,e,n)}async function YS(t,e,n){let r;try{r=mB(t,{maxOutputLength:gB})}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(w=>w===0))return;let l=ml(a,0,100),c=ml(a,345,155),d=c?`${c}/${l}`:l,u=ml(a,124,12).trim(),p=Number.parseInt(u||"0",8);if(!Number.isFinite(p)||p<0)throw new Error(`${n} has an invalid tar entry size.`);let m=ml(a,156,1)||"0",g=o+512,f=g+p;if(f>r.length)throw new Error(`${n} tar entry is truncated.`);let h=fB(e,d,n);if(m==="5")await Ds.mkdir(h,{recursive:!0});else if(m==="0"||m==="\0"){if(i+=1,s+=p,i>Vm)throw new Error(`${n} exceeds the ${Vm}-file extraction limit.`);if(s>Km)throw new Error(`${n} expanded file payload exceeds the ${Km}-byte limit.`);await Ds.mkdir(qt.dirname(h),{recursive:!0}),await Ds.writeFile(h,r.subarray(g,f))}else throw new Error(`${n} may only contain regular files and directories.`);o=g+Math.ceil(p/512)*512}throw new Error(`${n} tar archive is missing an end marker.`)}function fB(t,e,n){let r=qt.posix.normalize(e.replace(/\\/g,"/"));if(!r||r==="."||r.startsWith("../")||qt.posix.isAbsolute(r))throw new Error(`${n} contains an unsafe path.`);let o=qt.resolve(t,...r.split("/")),s=qt.resolve(t);if(o!==s&&!o.startsWith(s+qt.sep))throw new Error(`${n} contains an unsafe path.`);return o}function ml(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 hB,verify as yB}from"node:crypto";function bB(t){return`id=${t.id}
|
|
306
|
+
`),error:C.details?.error}}catch(T){return{result:"",error:T instanceof Error?T.message:String(T)}}}},createAgentRunner:pn,tools:this.toolCatalog.getToolManifest(),taskStore:this.taskStore,apiKey:this.currentApiKey,model:d.model??this.currentModel,log:{info:g=>this.log(g),warn:g=>this.log(`[warn] ${g}`),error:g=>this.log(`[error] ${g}`),debug:g=>{this.verbose&&this.log(`[debug] ${g}`)}},hooks:this.currentHooks??void 0,parentSignal:c.signal,memoryProvider:this.memoryProvider??void 0,memoryUserId:this.memoryUserId||void 0},m=await mS(p);await KH(this,i),m.ok?(this.sendNotification("system.activity",{category:"dream",level:"success",title:"\u68A6\u5883\u6574\u7406\u5B8C\u6210",detail:`\u56DE\u987E ${m.sessionsReviewed} \u4E2A\u4F1A\u8BDD\uFF0C\u6574\u7406 ${m.filesTouched.length} \u4E2A\u8BB0\u5FC6\u6587\u4EF6\uFF0C\u8017\u65F6 ${m.durationMs}ms`}),this.sendNotification("memory.updated",{source:"dream",target:"consolidation",files:m.filesTouched}),this.sendNotification("turn.end",{turnId:n,content:`Dream consolidation completed. ${m.sessionsReviewed} sessions reviewed, ${m.filesTouched.length} files touched. Duration: ${m.durationMs}ms.`,usage:{inputTokens:0,outputTokens:0}})):(this.sendNotification("system.activity",{category:"dream",level:"error",title:"\u68A6\u5883\u6574\u7406\u5931\u8D25",detail:m.error??"\u672A\u77E5\u9519\u8BEF"}),this.sendNotification("turn.error",{turnId:n,error:{message:m.error??"Dream consolidation failed",code:"DREAM_FAILED"}})),this.log(`dream ${n} completed`)}catch(p){if(c.signal.aborted)this.sendNotification("system.activity",{category:"dream",level:"warn",title:"\u68A6\u5883\u6574\u7406\u88AB\u4E2D\u65AD"}),this.sendNotification("turn.error",{turnId:n,error:{message:"Dream aborted",code:"ABORTED"}});else{let m=p instanceof Error?p.message:String(p);this.sendNotification("system.activity",{category:"dream",level:"error",title:"\u68A6\u5883\u6574\u7406\u5F02\u5E38",detail:m}),this.sendNotification("turn.error",{turnId:n,error:{message:m,code:"INTERNAL_ERROR"}})}}finally{this.activeTurn===c&&(this.activeTurn=null)}}async function KH(t,e){if(!(!t.memoryProvider||!t.memoryUserId)){try{let n=await hS({adapter:t.memoryProvider,userId:t.memoryUserId,memoryRoot:e,log:{info:r=>t.log(r),debug:r=>{t.verbose&&t.log(r)}}});n.ran&&(t.sendNotification("memory.decay.completed",{decayed:n.decayed,archived:n.archived,durationMs:n.durationMs}),t.sendNotification("system.activity",{category:"decay",level:"info",title:"\u8BB0\u5FC6\u8870\u51CF\u5B8C\u6210",detail:`\u8870\u51CF ${n.decayed} \u6761\uFF0C\u5F52\u6863 ${n.archived} \u6761 (${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`),t.sendNotification("system.activity",{category:"consolidation",level:"info",title:"\u8BB0\u5FC6\u51B2\u7A81\u6574\u7406",detail:`\u89E3\u51B3 ${r.conflictsResolved} \u5904\u51B2\u7A81\uFF0C\u786E\u8BA4 ${r.claimsPromoted} \u6761\u5F85\u5B9A\u8BB0\u5FC6`}))}}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)}`)}}}bo();function VH(t){let e=JH(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)}`:"",l=await Gm(e,Wm(t.baseUrl,`/api/v15/registry/resources/${s}/install${a}`),n,"GET"),c=BS(l);if(!c)throw new Error("Community hub returned an invalid install resolution.");return c},async listResourceVersions(r){let o=encodeURIComponent(r.trim());if(!o)throw new Error("resourceId is required.");let s=await Gm(e,Wm(t.baseUrl,`/api/v15/registry/resources/${o}/versions`),n,"GET");return(ul(s)&&Array.isArray(s.versions)?s.versions:[]).map(ZH).filter(a=>!!a)},async resolveRuntime(r,o){let s=r.trim(),i=encodeURIComponent(s);if(!i)throw new Error("runtime id is required.");let a=o.trim(),l=encodeURIComponent(a);if(!l)throw new Error("platform is required.");let c=await Gm(e,Wm(t.baseUrl,`/api/v15/runtime/${i}/resolve?platform=${l}`),n,"GET"),d=eB(c,s,a);if(!d)throw new Error("Community hub returned an invalid runtime resolution.");return d}}}function HS(t=kt()){let e=t.get("QLOGIC_LLMROUTER_ACCESS_TOKEN")?.trim();if(!e)return null;let n=YH(t);return VH({baseUrl:XH(t),token:e,clientVersion:n})}function YH(t){let e=t.get("QLOGIC_AGENT_VERSION")?.trim();return e||"2.20.2"}function XH(t){return t.get("QLOGIC_HUB_BASE_URL")?.trim()||t.get("XIAOZHICLAW_HUB_URL")?.trim()||"https://xiaozhi.qlogicagent.com"}function Wm(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 JH(t,e){let n=e?.trim();return n?(r,o)=>t(r,{...o,headers:{...o?.headers,"x-client-version":n}}):t}async function Gm(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 QH(s)}`);return s.json().catch(()=>null)}async function QH(t){try{let e=(await t.text()).trim();return e?` ${e.slice(0,500)}`:""}catch{return""}}function ul(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function ZH(t){return!ul(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 eB(t,e,n){if(!ul(t))return null;let r=typeof t.id=="string"?t.id:"",o=typeof t.platform=="string"?t.platform:"",s=typeof t.version=="string"?t.version:"",i=typeof t.downloadUrl=="string"?t.downloadUrl:"",a=typeof t.checksum=="string"?t.checksum:"",l=typeof t.sizeBytes=="number"?t.sizeBytes:0;if(!r||r!==e||o!==n||!s||!i||!/^[a-f0-9]{64}$/.test(a)||!Number.isSafeInteger(l)||l<=0)return null;let c=t.format,d=c===void 0&&r==="officecli"?"executable":c;if(d!=="executable"&&d!=="zip"&&d!=="tar.gz")return null;let u=typeof t.entrypoint=="string"?t.entrypoint:void 0;return(d==="zip"||d==="tar.gz")&&!FS(u)||u!==void 0&&!FS(u)?null:{id:r,platform:o,version:s,downloadUrl:i,checksum:a,sizeBytes:l,format:d,...u?{entrypoint:u}:{}}}function FS(t){return!t||t.includes("\\")||t.startsWith("/")||/^[a-zA-Z]:/.test(t)?!1:t.split("/").every(n=>!!n&&n!=="."&&n!=="..")}var tB=new Set(["R0","R1","R2","R3"]),nB=new Set(["official","community"]),rB=new Set(["quarantine","trial","trusted"]),oB=new Set(["pending","approved","rejected"]);function US(t){return typeof t=="string"&&tB.has(t)?t:null}function sB(t){return typeof t=="string"&&nB.has(t)?t:null}function iB(t){return typeof t=="string"&&rB.has(t)?t:null}function aB(t){return typeof t=="string"&&oB.has(t)?t:null}function BS(t){if(!ul(t))return null;let e=sB(t.sourceTier),n=iB(t.trustStage),r=aB(t.reviewStatus),o=US(t.resourceRiskTier),s=US(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(c=>typeof c!="string"))return null;let l=a.map(BS);return l.some(c=>!c)?null:{id:t.id,type:t.type,kind:t.kind,sourceTier:e,trustStage:n,reviewStatus:r,resourceRiskTier:o,effectiveRiskTier:s,requires:i,dependencies:l,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 zm={enabled:!0},lB=new Set(["R2","R3"]);function qS(t,e=zm){return lB.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 MB}from"node:zlib";import{gunzipSync as mB}from"node:zlib";import*as Ds from"node:fs/promises";import*as qt from"node:path";Pe();import{createHash as KS}from"node:crypto";import{existsSync as cB}from"node:fs";import*as nt from"node:fs/promises";import*as pl from"node:path";import{Transform as Wne}from"node:stream";import{pipeline as zne}from"node:stream/promises";var dB=4*1024*1024,uB=3;async function VS(t,e,n){let r=pl.join(Rt(),"cache","downloads",`${pB(e.downloadUrl)}.part`),o=0;if(cB(r)){let c=(await nt.stat(r)).size;o=c<e.sizeBytes?c:0,o===0&&await nt.rm(r,{force:!0})}let s=await GS(t,e.downloadUrl,o,WS(o,e.sizeBytes),n);if(s.whole)return await nt.rm(r,{force:!0}).catch(()=>{}),zS(s.bytes,e,n);await nt.mkdir(pl.dirname(r),{recursive:!0});let i=await nt.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 c=await GS(t,e.downloadUrl,o,WS(o,e.sizeBytes),n);if(c.bytes.length===0)throw new Error(`${n} download truncated.`);await i.write(c.bytes,0,c.bytes.length,o),o+=c.bytes.length}}finally{await i.close()}let a=await nt.readFile(r),l=zS(a,e,n,r);return await nt.rm(r,{force:!0}).catch(()=>{}),l}function WS(t,e){return Math.min(t+dB,e)-1}function pB(t){return KS("sha256").update(t).digest("hex").slice(0,32)}async function GS(t,e,n,r,o){let s=0;for(let i=0;i<uB;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 zS(t,e,n,r){let o=s=>{throw r&&nt.rm(r,{force:!0}).catch(()=>{}),new Error(s)};return t.length!==e.sizeBytes&&o(`${n} size did not match registry metadata.`),KS("sha256").update(t).digest("hex")!==e.checksum&&o(`${n} checksum did not match registry metadata.`),t}var Km=64*1024*1024,Vm=1024,gB=Km+Vm*512+1024;async function gl(t,e,n){return VS(t,e,n)}async function YS(t,e,n){let r;try{r=mB(t,{maxOutputLength:gB})}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(w=>w===0))return;let l=ml(a,0,100),c=ml(a,345,155),d=c?`${c}/${l}`:l,u=ml(a,124,12).trim(),p=Number.parseInt(u||"0",8);if(!Number.isFinite(p)||p<0)throw new Error(`${n} has an invalid tar entry size.`);let m=ml(a,156,1)||"0",g=o+512,f=g+p;if(f>r.length)throw new Error(`${n} tar entry is truncated.`);let h=fB(e,d,n);if(m==="5")await Ds.mkdir(h,{recursive:!0});else if(m==="0"||m==="\0"){if(i+=1,s+=p,i>Vm)throw new Error(`${n} exceeds the ${Vm}-file extraction limit.`);if(s>Km)throw new Error(`${n} expanded file payload exceeds the ${Km}-byte limit.`);await Ds.mkdir(qt.dirname(h),{recursive:!0}),await Ds.writeFile(h,r.subarray(g,f))}else throw new Error(`${n} may only contain regular files and directories.`);o=g+Math.ceil(p/512)*512}throw new Error(`${n} tar archive is missing an end marker.`)}function fB(t,e,n){let r=qt.posix.normalize(e.replace(/\\/g,"/"));if(!r||r==="."||r.startsWith("../")||qt.posix.isAbsolute(r))throw new Error(`${n} contains an unsafe path.`);let o=qt.resolve(t,...r.split("/")),s=qt.resolve(t);if(o!==s&&!o.startsWith(s+qt.sep))throw new Error(`${n} contains an unsafe path.`);return o}function ml(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 hB,verify as yB}from"node:crypto";function bB(t){return`id=${t.id}
|
|
307
307
|
version=${t.version}
|
|
308
308
|
checksum=${t.checksum}
|
|
309
309
|
sizeBytes=${t.sizeBytes}`}function kB(t){return t.includes("\\n")?t.replace(/\\n/g,`
|
|
@@ -798,7 +798,7 @@ ${a}`}).join(`
|
|
|
798
798
|
## \u7528\u6237\u5168\u5C40\u504F\u597D\u4E0E\u8FB9\u754C(\u62DF\u5B9A\u89C4\u683C\u65F6\u5FC5\u987B\u9075\u5B88)
|
|
799
799
|
${s}`:mE,tools:[t.askUserToolDef,W3],transport:t.transport,toolInvoker:r,createAgentRunner:t.createAgentRunner,apiKey:t.apiKey,model:t.model,log:t.log,forkLabel:"solo-spec-chat",maxTurns:4,parentSignal:t.parentSignal}),a=G3(i),l=n??z3(a,t.rawTask,e);return{reply:a.trim()||(n?"\u5DF2\u66F4\u65B0\u89C4\u683C(\u89C1\u53F3\u4FA7\u9762\u677F)\u3002":"\u5DF2\u8BB0\u5F55,\u8BF7\u7EE7\u7EED\u8865\u5145,\u6216\u70B9\u51FB\u542F\u52A8\u7ADE\u8D5B\u3002"),spec:l}}function z3(t,e,n=[]){let r=t.match(/GOAL:\s*(.+)/i)?.[1]?.trim()||e.trim().slice(0,200),o=gE(t,/CONSTRAINTS:\s*([\s\S]*?)(?:\n\s*ACCEPTANCE:|$)/i),s=gE(t,/ACCEPTANCE:\s*([\s\S]*?)$/i);return{goal:r,constraints:o,acceptance:s,rawTask:e,clarifications:n.length?n:void 0}}function gE(t,e){return(t.match(e)?.[1]??"").split(`
|
|
800
800
|
`).map(r=>r.replace(/^\s*[-*]\s?/,"").trim()).filter(Boolean).slice(0,5)}var Nr=class{nodes=new Map;edges=[];constructor(e){for(let n of e){if(this.nodes.has(n.id))throw new Error(`Duplicate node ID: ${n.id}`);this.nodes.set(n.id,{id:n.id,kind:n.kind??"agent",params:n.params??{},status:"pending",outPorts:n.outPorts??["default"],joinPolicy:n.joinPolicy??"all",runIndex:0,maxIterations:n.maxIterations})}for(let n of e)for(let r of n.dependsOn??[]){if(!this.nodes.has(r))throw new Error(`Node "${n.id}" depends on unknown node "${r}"`);this.edges.push({from:r,to:n.id,fromPort:"default"})}this.validateDag()}getNode(e){return this.nodes.get(e)}getAllNodes(){return[...this.nodes.values()]}getReadyNodes(){let e=[];for(let n of this.nodes.values()){if(n.status!=="pending"||this.isBlockedByFailed(n.id))continue;let r=this.incomingForwardEdges(n.id);if(r.length===0){e.push(n);continue}n.joinPolicy==="any"?r.some(o=>this.edgeSatisfied(o))&&e.push(n):r.every(o=>this.edgeSatisfied(o))&&e.push(n)}return e}isFinished(){for(let e of this.nodes.values())if(e.status==="running"||e.status==="paused"||e.status==="pending"&&!this.isBlockedByFailed(e.id)&&!this.isSkippable(e.id))return!1;return!0}isAllCompleted(){return[...this.nodes.values()].every(e=>e.status==="completed"||e.status==="skipped")}getBlockedNodes(){return[...this.nodes.values()].filter(e=>e.status==="pending"&&this.isBlockedByFailed(e.id))}getProgress(){let e=0,n=0,r=0,o=0,s=0,i=0;for(let a of this.nodes.values())switch(a.status){case"completed":e++;break;case"running":n++;break;case"failed":r++;break;case"pending":o++;break;case"paused":s++;break;case"skipped":i++;break}return{total:this.nodes.size,completed:e,running:n,failed:r,pending:o,paused:s,skipped:i}}markRunning(e){let n=this.requireNode(e);if(n.status!=="pending")throw new Error(`Node "${e}" is ${n.status}, cannot start`);n.status="running",n.startedAt=Date.now()}markCompleted(e,n){let r=this.requireNode(e);if(r.status!=="running")throw new Error(`Node "${e}" is ${r.status}, cannot complete`);r.status="completed",r.output=n.output,r.completedAt=Date.now(),r.firedPorts=n.firedPorts??r.outPorts,n.inputTokens!==void 0&&(r.inputTokens=n.inputTokens),n.outputTokens!==void 0&&(r.outputTokens=n.outputTokens),n.changedFiles!==void 0&&(r.changedFiles=n.changedFiles),r.acceptanceUnverified=n.acceptanceUnverified,this.propagateSkips()}markFailed(e,n){let r=this.requireNode(e);r.status="failed",r.error=n,r.completedAt=Date.now(),this.propagateSkips()}markPaused(e){let n=this.requireNode(e);n.status==="running"&&(n.status="paused")}resumePaused(e){let n=this.requireNode(e);n.status==="paused"&&(n.status="pending")}markSkipped(e){let n=this.requireNode(e);if(n.status!=="pending")throw new Error(`Node "${e}" is ${n.status}, cannot skip`);n.status="skipped",n.firedPorts=[],this.propagateSkips()}pauseAll(){for(let e of this.nodes.values())e.status==="running"&&(e.status="paused")}resumeAll(){for(let e of this.nodes.values())e.status==="paused"&&(e.status="pending")}decideLoop(e,n){let r=this.requireNode(e);if(r.kind!=="loop")throw new Error(`Node "${e}" is not a loop controller`);if(!r.maxIterations||r.maxIterations<=0)throw new Error(`Loop "${e}" requires maxIterations > 0`);let o=r.iteration??0;n&&o<r.maxIterations?(r.iteration=o+1,r.firedPorts=["loop"],this.resetLoopScope(e)):(r.firedPorts=["done"],n&&(r.error=`loop_cap_reached:${r.maxIterations}`)),this.propagateSkips()}addNode(e){if(this.nodes.has(e.id))throw new Error(`Node "${e.id}" already exists`);for(let n of e.dependsOn??[])if(!this.nodes.has(n))throw new Error(`Node "${e.id}" depends on unknown node "${n}"`);this.nodes.set(e.id,{id:e.id,kind:e.kind??"agent",params:e.params??{},status:"pending",outPorts:e.outPorts??["default"],joinPolicy:e.joinPolicy??"all",runIndex:0,maxIterations:e.maxIterations});for(let n of e.dependsOn??[])this.edges.push({from:n,to:e.id,fromPort:"default"});try{this.validateDag()}catch(n){throw this.nodes.delete(e.id),this.edges=this.edges.filter(r=>r.to!==e.id||!e.dependsOn?.includes(r.from)),n}}addNodes(e){let n=[],r=[];try{for(let o of e){if(this.nodes.has(o.id))throw new Error(`Node "${o.id}" already exists`);for(let i of o.dependsOn??[])if(!this.nodes.has(i))throw new Error(`Unknown dep "${i}" for "${o.id}"`);this.nodes.set(o.id,{id:o.id,kind:o.kind??"agent",params:o.params??{},status:"pending",outPorts:o.outPorts??["default"],joinPolicy:o.joinPolicy??"all",runIndex:0,maxIterations:o.maxIterations}),n.push(o.id);let s=(o.dependsOn??[]).map(i=>({from:i,to:o.id,fromPort:"default"}));this.edges.push(...s),r.push(...s)}this.validateDag()}catch(o){for(let s of n)this.nodes.delete(s);throw this.edges=this.edges.filter(s=>!r.includes(s)),o}}removeNode(e){let n=this.requireNode(e);if(n.status==="running")throw new Error(`Cannot remove running node "${e}"`);if(n.status==="completed")throw new Error(`Cannot remove completed node "${e}"`);this.edges=this.edges.filter(r=>r.from!==e&&r.to!==e),this.nodes.delete(e)}retryNode(e,n){let r=this.requireNode(e);if(r.status!=="failed")throw new Error(`Node "${e}" is ${r.status}, only failed nodes can be retried`);r.status="pending",r.error=void 0,r.output=void 0,r.firedPorts=void 0,r.startedAt=void 0,r.completedAt=void 0,r.inputTokens=void 0,r.outputTokens=void 0,r.changedFiles=void 0,n&&Object.assign(r.params,n)}resetForReplay(e){if(!this.nodes.has(e))throw new Error(`Node "${e}" not found`);let n=new Set([e]),r=!0;for(;r;){r=!1;for(let o of this.nodes.values()){if(n.has(o.id))continue;this.incomingForwardEdges(o.id).map(i=>i.from).some(i=>n.has(i))&&(n.add(o.id),r=!0)}}for(let o of n){let s=this.nodes.get(o);s.status="pending",s.output=void 0,s.firedPorts=void 0,s.error=void 0,s.startedAt=void 0,s.completedAt=void 0,s.inputTokens=void 0,s.outputTokens=void 0,s.changedFiles=void 0}return[...n]}updateNodeParams(e,n){let r=this.requireNode(e);if(r.status!=="pending")throw new Error(`Node "${e}" is ${r.status}, can only update pending nodes`);Object.assign(r.params,n)}addEdge(e){let{from:n,to:r,fromPort:o="default",loopBack:s=!1}=e;if(!this.nodes.has(n))throw new Error(`Unknown source node "${n}"`);if(!this.nodes.has(r))throw new Error(`Unknown target node "${r}"`);let i=this.nodes.get(n);if(!s&&!i.outPorts.includes(o))throw new Error(`Node "${n}" has no outPort "${o}"`);if(!this.edges.find(l=>l.from===n&&l.to===r&&(l.fromPort??"default")===o))if(this.edges.push({from:n,to:r,fromPort:o,loopBack:s}),s){let l=this.nodes.get(r);if(!l.maxIterations||l.maxIterations<=0)throw this.edges.pop(),new Error(`LoopBack controller "${r}" requires maxIterations > 0`)}else try{this.validateDag()}catch(l){throw this.edges=this.edges.filter(c=>!(c.from===n&&c.to===r&&(c.fromPort??"default")===o)),l}}removeEdge(e,n,r){let o=r??"default";this.edges=this.edges.filter(s=>!(s.from===e&&s.to===n&&(s.fromPort??"default")===o))}serialize(){return[...this.nodes.values()].map(e=>{let n=this.incomingForwardEdges(e.id).map(r=>r.from);return{id:e.id,kind:e.kind,params:e.params,dependsOn:n,outPorts:e.outPorts,joinPolicy:e.joinPolicy,status:e.status,firedPorts:e.firedPorts,output:e.output,error:e.error,startedAt:e.startedAt,completedAt:e.completedAt,inputTokens:e.inputTokens,outputTokens:e.outputTokens,changedFiles:e.changedFiles,acceptanceUnverified:e.acceptanceUnverified,runIndex:e.runIndex,maxIterations:e.maxIterations,iteration:e.iteration}})}restore(e){for(let n of e){let r=this.nodes.get(n.id);r&&(r.status=n.status==="running"?"pending":n.status,r.output=n.output,r.error=n.error,r.firedPorts=n.firedPorts,r.startedAt=n.startedAt,r.completedAt=n.completedAt,r.inputTokens=n.inputTokens,r.outputTokens=n.outputTokens,r.changedFiles=n.changedFiles,r.acceptanceUnverified=n.acceptanceUnverified,r.runIndex=n.runIndex??0,r.iteration=n.iteration)}}getUpstreamOutputs(e){if(!this.nodes.get(e))return[];let r=this.incomingForwardEdges(e),o=new Set,s=[];for(let i of r){let a=i.from;if(o.has(a))continue;o.add(a);let l=this.nodes.get(a);if(l&&l.status==="completed"&&l.output!=null){let c=typeof l.output=="string"?l.output:JSON.stringify(l.output);c.trim()&&s.push({taskId:a,output:c})}}return s}edgeSatisfied(e){let n=this.nodes.get(e.from);if(!n||n.status!=="completed")return!1;let r=e.fromPort??"default";return(n.firedPorts??n.outPorts).includes(r)}edgeDead(e){let n=this.nodes.get(e.from);if(!n)return!1;if(n.status==="skipped")return!0;if(n.status==="completed"){if(n.kind==="loop"&&!(n.firedPorts??[]).includes("done"))return!1;let r=e.fromPort??"default";return!(n.firedPorts??n.outPorts).includes(r)}return!1}incomingForwardEdges(e){return this.edges.filter(n=>n.to===e&&!n.loopBack)}isBlockedByFailed(e){return this.incomingForwardEdges(e).some(n=>this.nodes.get(n.from)?.status==="failed")}isSkippable(e){let n=this.incomingForwardEdges(e);return n.length===0?!1:this.nodes.get(e).joinPolicy==="any"?n.every(o=>this.edgeDead(o)):n.some(o=>this.edgeDead(o))}propagateSkips(){let e=!0;for(;e;){e=!1;for(let n of this.nodes.values())n.status==="pending"&&this.isSkippable(n.id)&&(n.status="skipped",n.firedPorts=[],e=!0)}}resetLoopScope(e){let n=this.loopBodyNodes(e);for(let r of n){let o=this.nodes.get(r);o.status="pending",o.runIndex=(o.runIndex??0)+1,o.output=void 0,o.firedPorts=void 0,o.error=void 0,o.startedAt=void 0,o.completedAt=void 0,o.inputTokens=void 0,o.outputTokens=void 0,o.changedFiles=void 0}}loopBodyNodes(e){let n=new Set,r=(o,s)=>{for(let i of this.edges)i.from!==o||i.loopBack||s&&(i.fromPort??"default")!=="loop"||i.to!==e&&(n.has(i.to)||(n.add(i.to),r(i.to,!1)))};return r(e,!0),n}validateDag(){for(let s of this.edges){if(!this.nodes.has(s.from))throw new Error(`Edge references unknown source "${s.from}"`);if(!this.nodes.has(s.to))throw new Error(`Edge references unknown target "${s.to}"`)}let e=this.edges.filter(s=>!s.loopBack),n=new Set,r=new Set,o=s=>{if(r.has(s))throw new Error(`Cycle detected involving node "${s}"`);if(!n.has(s)){r.add(s);for(let i of e)i.from===s&&o(i.to);r.delete(s),n.add(s)}};for(let s of this.nodes.keys())o(s);for(let s of this.edges){if(!s.loopBack)continue;let i=this.nodes.get(s.to);if(!i?.maxIterations||i.maxIterations<=0)throw new Error(`LoopBack controller "${s.to}" must have maxIterations > 0`)}for(let s of this.nodes.values())if(s.maxIterations!==void 0&&s.maxIterations>1e3)throw new Error(`Loop "${s.id}" maxIterations ${s.maxIterations} exceeds the hard cap of 1000`)}requireNode(e){let n=this.nodes.get(e);if(!n)throw new Error(`Unknown node: "${e}"`);return n}};function hE(t){let e=typeof t=="string"?t.trim():"";if(!e||e==="self")throw new Error('Workflow agent nodes require an explicit agentId; "self" is not a valid identity');return e}function bE(t){try{let e=V3(t),n=new rh(e,t),r=n.parseExpression();return n.expectEnd(),vi(r),null}catch(e){return e instanceof Error?e.message:String(e)}}var K3=new Set(["input","json","node","now","vars","trigger"]),yE=new Set(["len","upper","lower","default","jsonpath","date"]);function vi(t){switch(t.type){case"root":if(!K3.has(t.name))throw new Error(`Unknown context root "$${t.name}" (allowed: $input $json $node $now $vars $trigger)`);return;case"lit":return;case"func":if(!yE.has(t.name))throw new Error(`Unknown function "${t.name}" (whitelist: ${[...yE].join(", ")})`);t.args.forEach(vi);return;case"prop":vi(t.target);return;case"index":if(vi(t.target),typeof t.key!="number"&&typeof t.key!="string")throw new Error("index key must be a number or string literal");return;case"call":if(!(t.target.type==="root"&&t.target.name==="node"))throw new Error("Only $node(...) is callable in this position");t.args.forEach(vi);return}}function V3(t){let e=[],n=0,r=s=>/[A-Za-z_]/.test(s),o=s=>/[A-Za-z0-9_]/.test(s);for(;n<t.length;){let s=t[n];if(/\s/.test(s)){n++;continue}if(s==="$"){n++;let i="";for(;n<t.length&&o(t[n]);)i+=t[n++];if(!i)throw new Error('Bare "$" is not a valid expression');e.push({t:"dollar",v:i});continue}if(r(s)){let i="";for(;n<t.length&&o(t[n]);)i+=t[n++];e.push({t:"id",v:i});continue}if(/[0-9]/.test(s)||s==="-"&&/[0-9]/.test(t[n+1]??"")){let i=t[n++];for(;n<t.length&&/[0-9.]/.test(t[n]);)i+=t[n++];e.push({t:"num",v:i});continue}if(s==='"'||s==="'"){let i=s;n++;let a="";for(;n<t.length&&t[n]!==i;)t[n]==="\\"&&n+1<t.length?(a+=t[n+1],n+=2):a+=t[n++];if(t[n]!==i)throw new Error("Unterminated string literal in expression");n++,e.push({t:"str",v:a});continue}if(".[](),".includes(s)){e.push({t:"punc",v:s}),n++;continue}throw new Error(`Unexpected character "${s}" in expression`)}return e}var rh=class{constructor(e,n){this.toks=e;this.src=n}toks;src;pos=0;parseExpression(){return this.parseAccessors(this.parseAtom())}peek(){return this.toks[this.pos]}next(){return this.toks[this.pos++]}expectEnd(){if(this.pos!==this.toks.length)throw new Error(`Unexpected trailing tokens in expression "${this.src.trim()}"`)}parseAtom(){let e=this.peek();if(!e)throw new Error("Empty expression");if(e.t==="dollar")return this.next(),{type:"root",name:e.v};if(e.t==="num")return this.next(),{type:"lit",value:Number(e.v)};if(e.t==="str")return this.next(),{type:"lit",value:e.v};if(e.t==="id"){if(e.v==="true")return this.next(),{type:"lit",value:!0};if(e.v==="false")return this.next(),{type:"lit",value:!1};if(e.v==="null")return this.next(),{type:"lit",value:null};if(this.next(),this.peek()?.t==="punc"&&this.peek().v==="("){let n=this.parseArgs();return{type:"func",name:e.v,args:n}}throw new Error(`Bare identifier "${e.v}" is not allowed (only whitelist function calls)`)}if(e.t==="punc"&&e.v==="("){this.next();let n=this.parseExpression();return this.expectPunc(")"),n}throw new Error(`Unexpected token "${e.v}" in expression`)}parseAccessors(e){let n=e;for(;;){let r=this.peek();if(!r||r.t!=="punc")break;if(r.v==="."){this.next();let o=this.next();if(!o||o.t!=="id"&&o.t!=="num")throw new Error('Expected property name after "."');n={type:"prop",target:n,key:o.v}}else if(r.v==="["){this.next();let o=this.next(),s;if(o.t==="num")s=Number(o.v);else if(o.t==="str")s=o.v;else throw new Error("Index must be a number or string literal");this.expectPunc("]"),n={type:"index",target:n,key:s}}else if(r.v==="("){let o=this.parseArgs();n={type:"call",target:n,args:o}}else break}return n}parseArgs(){this.expectPunc("(");let e=[];if(this.peek()?.t==="punc"&&this.peek().v===")")return this.next(),e;for(;;){e.push(this.parseExpression());let n=this.next();if(!n)throw new Error("Unterminated argument list");if(n.t==="punc"&&n.v===")")break;if(!(n.t==="punc"&&n.v===","))throw new Error('Expected "," or ")" in argument list')}return e}expectPunc(e){let n=this.next();if(!n||n.t!=="punc"||n.v!==e)throw new Error(`Expected "${e}" in expression`)}};function kE(t){let e=[];for(let n of t.nodes)(n.kind==="tool"||n.kind==="skill"||n.kind==="mcp")&&e.push(`\u8282\u70B9\u300C${n.id}\u300D\u4F7F\u7528\u4E86 legacy kind "${n.kind}";\u8BF7\u6539\u7528 Agent \u63D2\u4EF6\u6216 canonical Action \u8282\u70B9`);return X3(t,e),Y3(t,e),e}function Y3(t,e){let n=(r,o,s)=>{if(typeof r=="string"){if(r.startsWith("="))return;for(let i of r.matchAll(/\{\{([\s\S]*?)\}\}/g)){let a=bE(i[1].trim());a&&e.push(`\u8282\u70B9\u300C${o}\u300D\u53C2\u6570 ${s} \u7684\u8868\u8FBE\u5F0F\u300C{{ ${i[1].trim()} }}\u300D\u8D85\u51FA\u53D7\u9650\u8BED\u8A00:${a}`)}return}if(Array.isArray(r)){r.forEach((i,a)=>n(i,o,`${s}[${a}]`));return}if(r&&typeof r=="object")for(let[i,a]of Object.entries(r))n(a,o,s?`${s}.${i}`:i)};for(let r of t.nodes)r.params?._importMode!=="n8n-strict-template"&&r.params&&n(r.params,r.id,"")}function X3(t,e){try{let n=t.nodes.map(o=>{let s=o.outPorts??J3(o.kind);return o.onError==="errorPort"&&!s.includes("error")&&(s=[...s,"error"]),{id:o.id,kind:o.kind,params:o.params??{},outPorts:s,joinPolicy:o.joinPolicy??"all",maxIterations:o.maxIterations}}),r=new Nr(n);for(let o of t.edges)o.loopBack||r.addEdge({from:o.from,to:o.to,fromPort:o.fromPort??"default"});for(let o of t.edges)o.loopBack&&r.addEdge({from:o.from,to:o.to,loopBack:!0})}catch(n){e.push(`graph invalid: ${n.message}`)}}function J3(t){return t==="if"?["true","false"]:t==="loop"?["loop","done"]:["default"]}function wE(t,e=25){let n=["agent","action","mcp","channel","memory","control"],r={agent:"Agent",action:"\u7CBE\u786E\u52A8\u4F5C Action",mcp:"\u53EF\u6302\u8F7D MCP \u63D2\u4EF6",channel:"\u6E20\u9053 channel",memory:"\u8BB0\u5FC6 memory",control:"\u63A7\u5236\u4E0E\u6570\u636E\u8282\u70B9"},o=[];for(let s of n){let i=t.filter(a=>a.category===s);if(i.length!==0){o.push(`\u3010${r[s]}\u3011(${i.length} \u4E2A\u53EF\u7528)`);for(let a of i.slice(0,e))o.push(`- ${a.id}${a.description?` \u2014 ${a.description.slice(0,60)}`:""}`);i.length>e&&o.push(`- \u2026\u5176\u4F59 ${i.length-e} \u4E2A\u7528 list_capabilities("${s}") \u67E5\u8BE2`)}}return o.join(`
|
|
801
|
-
`)}function Q3(t){let e=[];for(let n of t.nodes){let r=n.params??{};switch(n.kind){case"agent":{let o=hE(r.agentId);if(e.push({category:"agent",ref:o,nodeId:n.id}),Array.isArray(r.mcpPlugins)){for(let s of r.mcpPlugins)if(!(!s||typeof s!="object"||!Array.isArray(s.tools)))for(let i of s.tools)typeof i=="string"&&i&&e.push({category:"mcp",ref:i,nodeId:n.id})}break}case"action":typeof r.toolName=="string"&&r.toolName&&e.push({category:"mcp",ref:r.toolName,nodeId:n.id});break;case"channel":typeof r.channel=="string"&&r.channel&&e.push({category:"channel",ref:r.channel,nodeId:n.id});break;default:break}}return e}function oh(t,e){let n=new Map;for(let o of e){let s=n.get(o.category)??new Set;s.add(o.id),n.set(o.category,s)}let r=[];for(let o of t.nodes)(o.kind==="tool"||o.kind==="skill"||o.kind==="mcp")&&r.push(`\u8282\u70B9\u300C${o.id}\u300D\u4F7F\u7528\u4E86 legacy kind "${o.kind}";\u5185\u7F6E\u5DE5\u5177\u548C Skill \u5E94\u7531 Agent \u4F7F\u7528,\u7CBE\u786E MCP \u8C03\u7528\u8BF7\u6539\u7528 action`);for(let{category:o,ref:s,nodeId:i}of Q3(t)){let a=n.get(o);!a||a.size===0||a.has(s)||r.push(`\u8282\u70B9\u300C${i}\u300D\u5F15\u7528\u4E86\u4E0D\u5B58\u5728\u7684 ${o}:"${s}"(\u53EF\u7528:${[...a].slice(0,8).join("\u3001")}${a.size>8?"\u2026":""})`)}return r}var SE={agent:{type:"object",required:["agentId","prompt"],properties:{prompt:{type:"string","x-widget":"textarea",description:"\u8BA9 AI \u505A\u4EC0\u4E48(\u53EF\u7528 {{ $node(...) }} \u5F15\u7528\u4E0A\u6E38)"},agentId:{type:"string",description:"\u5FC5\u586B:\u660E\u786E\u6267\u884C\u8BE5\u8282\u70B9\u7684 agent id(self \u4E0D\u5408\u6CD5)"}}},action:{type:"object",required:["target","server","tool","toolName"],properties:{target:{type:"string",enum:["mcp"],description:"\u56FA\u5B9A\u4E3A mcp"},server:{type:"string",description:"MCP \u63D2\u4EF6/\u670D\u52A1\u5668 id"},tool:{type:"string",description:"MCP \u5DE5\u5177\u77ED\u540D"},toolName:{type:"string",description:"\u76EE\u5F55\u4E2D\u7684\u7CBE\u786E\u89C4\u8303\u5DE5\u5177\u540D"},args:{type:"object",description:"\u5DE5\u5177\u53C2\u6570"}}},http:{type:"object",required:["url"],properties:{method:{type:"string",enum:["GET","POST","PUT","PATCH","DELETE"],default:"GET",description:"\u8BF7\u6C42\u65B9\u6CD5"},url:{type:"string",description:"\u8BF7\u6C42\u5730\u5740,\u53EF\u7528 {{ $node(...) }} \u6A21\u677F"},headers:{type:"object",description:"\u8BF7\u6C42\u5934(\u952E\u503C\u5BF9\u5BF9\u8C61)"},body:{type:"string","x-widget":"textarea",description:"\u8BF7\u6C42\u4F53(\u6587\u672C/JSON \u5B57\u7B26\u4E32,\u53EF\u542B\u6A21\u677F\u8868\u8FBE\u5F0F)"}}},channel:{type:"object",required:["channel"],properties:{channel:{type:"string",description:"\u6E20\u9053\u540D,\u5982 feishu / wechat"},target:{type:"string",description:"\u76EE\u6807\u7FA4/\u7528\u6237 id(\u53EF\u9009)"},payload:{type:"string","x-widget":"textarea",description:"\u8981\u53D1\u9001\u7684\u5185\u5BB9,\u53EF\u7528 {{ $node(...) }} \u5F15\u7528\u4E0A\u6E38"}}},memory:{type:"object",required:["op"],properties:{op:{type:"string",enum:["read","write","search"],description:"\u64CD\u4F5C"},key:{type:"string",description:"\u4E3B\u9898 key(\u53EF\u9009;\u7F3A\u7701\u64CD\u4F5C\u8BB0\u5FC6\u7D22\u5F15)"},value:{type:"string","x-widget":"textarea",description:"\u5199\u5165\u5185\u5BB9(write;\u7559\u7A7A\u53D6\u4E0A\u6E38\u8F93\u51FA)"},query:{type:"string",description:"\u641C\u7D22\u8BCD(search)"}}},if:{type:"object",required:["condition"],properties:{condition:{type:"string",description:"\u6761\u4EF6\u8868\u8FBE\u5F0F;\u771F\u8D70 true \u7AEF\u53E3\u3001\u5047\u8D70 false \u7AEF\u53E3"}}},filter:{type:"object",required:["condition"],properties:{condition:{type:"string",description:"\u9010\u6761\u4FDD\u7559\u6761\u4EF6($json \u6307\u5F53\u524D\u6761);\u771F\u4FDD\u7559\u3001\u5047\u4E22\u5F03"}}},switch:{type:"object",required:["cases"],properties:{cases:{type:"array",description:"[{ port, condition }];\u9996\u4E2A\u4E3A\u771F\u7684\u5206\u652F\u751F\u6548"},defaultPort:{type:"string",default:"default",description:"\u90FD\u4E0D\u547D\u4E2D\u65F6\u8D70\u7684\u7AEF\u53E3"}}},transform:{type:"object",required:["mapping"],properties:{mapping:{type:"object",description:'\u9010\u6761\u6620\u5C04 { \u8F93\u51FA\u5B57\u6BB5: "{{ $json.\u5B57\u6BB5 }}" }'}}},aggregate:{type:"object",properties:{}},merge:{type:"object",properties:{}},passthrough:{type:"object",properties:{}},set:{type:"object",properties:{json:{type:"object",description:"\u4EA7\u51FA\u7684\u4E00\u6761\u56FA\u5B9A/\u8868\u8FBE\u5F0F\u6570\u636E"}}},wait:{type:"object",properties:{until:{type:"string",enum:["delay","webhook"],default:"delay",description:"\u7B49\u5F85\u65B9\u5F0F"},ms:{type:"integer",minimum:1,maximum:36e5,description:"\u5EF6\u65F6\u6BEB\u79D2(delay \u6A21\u5F0F,1..3600000)"},path:{type:"string",description:"\u7B49\u5F85\u7684 webhook \u8DEF\u5F84(webhook \u6A21\u5F0F)"},timeoutMs:{type:"integer",minimum:1,description:"\u8D85\u65F6\u6BEB\u79D2(webhook \u6A21\u5F0F;\u9ED8\u8BA4 24h)"}}},subworkflow:{type:"object",required:["workflowId"],properties:{workflowId:{type:"string",description:"\u8981\u8C03\u7528\u7684\u5DE5\u4F5C\u6D41 id"},projectId:{type:"string",description:"\u8DE8\u9879\u76EE\u76EE\u6807(\u53EF\u9009)"},payload:{type:"object",description:"\u4F20\u5165\u5B50\u6D41\u7A0B\u7684 $trigger \u8F7D\u8377(\u53EF\u9009)"}}},approval:{type:"object",properties:{prompt:{type:"string",description:"\u5BA1\u6279\u95EE\u9898(\u9ED8\u8BA4 \u7EE7\u7EED\u6267\u884C?)"},timeoutMs:{type:"integer",minimum:1,description:"\u8D85\u65F6\u81EA\u52A8\u62D2(\u6BEB\u79D2;\u9ED8\u8BA4 24h)"},timeoutAction:{type:"string",enum:["approve","reject","keepPending"],description:"\u8D85\u65F6\u7B56\u7565(\u9ED8\u8BA4 reject):reject \u62D2\u7EDD\u5E76\u901A\u77E5 owner(\u975E\u9759\u9ED8) / approve \u81EA\u52A8\u6279\u51C6 / keepPending \u4FDD\u6301\u6302\u8D77\u5F85\u4EBA\u5DE5\u51B3\u5B9A"}}}};function Z3(t){return typeof t=="string"&&/\{\{.*\}\}/.test(t)}function sh(t){return typeof t=="string"&&t.includes("__ASK__")}function e6(t,e,n,r,o){let s=e.properties??{},i=Array.isArray(e.required)?e.required:[],a=r?`${r}`:"";for(let l of i){let c=t[l];(c==null||c==="")&&o.push(`\u8282\u70B9\u300C${n}\u300D\u7F3A\u5C11\u5FC5\u586B${a}\u53C2\u6570\u300C${l}\u300D`)}for(let[l,c]of Object.entries(t)){let d=s[l];if(!d||c==null||c===""||Z3(c)||sh(c))continue;let u=Array.isArray(d.enum)?d.enum:null;if(u){u.some(m=>String(m)===String(c))||o.push(`\u8282\u70B9\u300C${n}\u300D${a}\u53C2\u6570\u300C${l}\u300D\u53D6\u503C\u300C${String(c)}\u300D\u4E0D\u5728\u5141\u8BB8\u8303\u56F4(${u.map(String).join("\u3001")})`);continue}let p=d.type;(p==="number"||p==="integer")&&typeof c!="number"?o.push(`\u8282\u70B9\u300C${n}\u300D${a}\u53C2\u6570\u300C${l}\u300D\u5E94\u4E3A\u6570\u5B57`):p==="boolean"&&typeof c!="boolean"?o.push(`\u8282\u70B9\u300C${n}\u300D${a}\u53C2\u6570\u300C${l}\u300D\u5E94\u4E3A\u5E03\u5C14`):p==="string"&&typeof c!="string"&&o.push(`\u8282\u70B9\u300C${n}\u300D${a}\u53C2\u6570\u300C${l}\u300D\u5E94\u4E3A\u6587\u672C`)}}function ih(t,e){let n=[];for(let r of t.nodes){if(r.kind==="trigger"||r.kind==="manual")continue;let o=r.params??{},s=SE[r.kind];s&&(e6(o,s,r.id,"",n),r.kind==="agent"&&o.agentId==="self"&&n.push(`\u8282\u70B9\u300C${r.id}\u300D\u53C2\u6570\u300CagentId\u300D\u4E0D\u5F97\u4F7F\u7528 self,\u5FC5\u987B\u663E\u5F0F\u9009\u62E9\u771F\u5B9E agent id`))}return n}function vE(t){let e=/__ASK__\s*[::]?\s*(.*)$/.exec(String(t));return e?e[1].trim():""}function TE(t){let e=[];for(let n of t.nodes){let r=n.params??{};for(let[o,s]of Object.entries(r))if(sh(s))e.push({nodeId:n.id,field:o,question:vE(s)||`\u8BF7\u8865\u5145\u300C${o}\u300D`});else if(o==="args"&&s&&typeof s=="object"&&!Array.isArray(s))for(let[i,a]of Object.entries(s))sh(a)&&e.push({nodeId:n.id,field:`args.${i}`,question:vE(a)||`\u8BF7\u8865\u5145\u300C${i}\u300D`})}return e}function RE(){let t=["agent","action","http","channel","if","filter","switch","transform","aggregate","wait","
|
|
801
|
+
`)}function Q3(t){let e=[];for(let n of t.nodes){let r=n.params??{};switch(n.kind){case"agent":{let o=hE(r.agentId);if(e.push({category:"agent",ref:o,nodeId:n.id}),Array.isArray(r.mcpPlugins)){for(let s of r.mcpPlugins)if(!(!s||typeof s!="object"||!Array.isArray(s.tools)))for(let i of s.tools)typeof i=="string"&&i&&e.push({category:"mcp",ref:i,nodeId:n.id})}break}case"action":typeof r.toolName=="string"&&r.toolName&&e.push({category:"mcp",ref:r.toolName,nodeId:n.id});break;case"channel":typeof r.channel=="string"&&r.channel&&e.push({category:"channel",ref:r.channel,nodeId:n.id});break;default:break}}return e}function oh(t,e){let n=new Map;for(let o of e){let s=n.get(o.category)??new Set;s.add(o.id),n.set(o.category,s)}let r=[];for(let o of t.nodes)(o.kind==="tool"||o.kind==="skill"||o.kind==="mcp")&&r.push(`\u8282\u70B9\u300C${o.id}\u300D\u4F7F\u7528\u4E86 legacy kind "${o.kind}";\u5185\u7F6E\u5DE5\u5177\u548C Skill \u5E94\u7531 Agent \u4F7F\u7528,\u7CBE\u786E MCP \u8C03\u7528\u8BF7\u6539\u7528 action`);for(let{category:o,ref:s,nodeId:i}of Q3(t)){let a=n.get(o);!a||a.size===0||a.has(s)||r.push(`\u8282\u70B9\u300C${i}\u300D\u5F15\u7528\u4E86\u4E0D\u5B58\u5728\u7684 ${o}:"${s}"(\u53EF\u7528:${[...a].slice(0,8).join("\u3001")}${a.size>8?"\u2026":""})`)}return r}var SE={agent:{type:"object",required:["agentId","prompt"],properties:{prompt:{type:"string","x-widget":"textarea",description:"\u8BA9 AI \u505A\u4EC0\u4E48(\u53EF\u7528 {{ $node(...) }} \u5F15\u7528\u4E0A\u6E38)"},agentId:{type:"string",description:"\u5FC5\u586B:\u660E\u786E\u6267\u884C\u8BE5\u8282\u70B9\u7684 agent id(self \u4E0D\u5408\u6CD5)"}}},action:{type:"object",required:["target","server","tool","toolName"],properties:{target:{type:"string",enum:["mcp"],description:"\u56FA\u5B9A\u4E3A mcp"},server:{type:"string",description:"MCP \u63D2\u4EF6/\u670D\u52A1\u5668 id"},tool:{type:"string",description:"MCP \u5DE5\u5177\u77ED\u540D"},toolName:{type:"string",description:"\u76EE\u5F55\u4E2D\u7684\u7CBE\u786E\u89C4\u8303\u5DE5\u5177\u540D"},args:{type:"object",description:"\u5DE5\u5177\u53C2\u6570"}}},http:{type:"object",required:["url"],properties:{method:{type:"string",enum:["GET","POST","PUT","PATCH","DELETE"],default:"GET",description:"\u8BF7\u6C42\u65B9\u6CD5"},url:{type:"string",description:"\u8BF7\u6C42\u5730\u5740,\u53EF\u7528 {{ $node(...) }} \u6A21\u677F"},headers:{type:"object",description:"\u8BF7\u6C42\u5934(\u952E\u503C\u5BF9\u5BF9\u8C61)"},body:{type:"string","x-widget":"textarea",description:"\u8BF7\u6C42\u4F53(\u6587\u672C/JSON \u5B57\u7B26\u4E32,\u53EF\u542B\u6A21\u677F\u8868\u8FBE\u5F0F)"}}},channel:{type:"object",required:["channel"],properties:{channel:{type:"string",description:"\u6E20\u9053\u540D,\u5982 feishu / wechat"},target:{type:"string",description:"\u76EE\u6807\u7FA4/\u7528\u6237 id(\u53EF\u9009)"},payload:{type:"string","x-widget":"textarea",description:"\u8981\u53D1\u9001\u7684\u5185\u5BB9,\u53EF\u7528 {{ $node(...) }} \u5F15\u7528\u4E0A\u6E38"}}},memory:{type:"object",required:["op"],properties:{op:{type:"string",enum:["read","write","search"],description:"\u64CD\u4F5C"},key:{type:"string",description:"\u4E3B\u9898 key(\u53EF\u9009;\u7F3A\u7701\u64CD\u4F5C\u8BB0\u5FC6\u7D22\u5F15)"},value:{type:"string","x-widget":"textarea",description:"\u5199\u5165\u5185\u5BB9(write;\u7559\u7A7A\u53D6\u4E0A\u6E38\u8F93\u51FA)"},query:{type:"string",description:"\u641C\u7D22\u8BCD(search)"}}},if:{type:"object",required:["condition"],properties:{condition:{type:"string",description:"\u6761\u4EF6\u8868\u8FBE\u5F0F;\u771F\u8D70 true \u7AEF\u53E3\u3001\u5047\u8D70 false \u7AEF\u53E3"}}},filter:{type:"object",required:["condition"],properties:{condition:{type:"string",description:"\u9010\u6761\u4FDD\u7559\u6761\u4EF6($json \u6307\u5F53\u524D\u6761);\u771F\u4FDD\u7559\u3001\u5047\u4E22\u5F03"}}},switch:{type:"object",required:["cases"],properties:{cases:{type:"array",description:"[{ port, condition }];\u9996\u4E2A\u4E3A\u771F\u7684\u5206\u652F\u751F\u6548"},defaultPort:{type:"string",default:"default",description:"\u90FD\u4E0D\u547D\u4E2D\u65F6\u8D70\u7684\u7AEF\u53E3"}}},transform:{type:"object",required:["mapping"],properties:{mapping:{type:"object",description:'\u9010\u6761\u6620\u5C04 { \u8F93\u51FA\u5B57\u6BB5: "{{ $json.\u5B57\u6BB5 }}" }'}}},aggregate:{type:"object",properties:{}},merge:{type:"object",properties:{}},passthrough:{type:"object",properties:{}},set:{type:"object",properties:{json:{type:"object",description:"\u4EA7\u51FA\u7684\u4E00\u6761\u56FA\u5B9A/\u8868\u8FBE\u5F0F\u6570\u636E"}}},wait:{type:"object",properties:{until:{type:"string",enum:["delay","webhook"],default:"delay",description:"\u7B49\u5F85\u65B9\u5F0F"},ms:{type:"integer",minimum:1,maximum:36e5,description:"\u5EF6\u65F6\u6BEB\u79D2(delay \u6A21\u5F0F,1..3600000)"},path:{type:"string",description:"\u7B49\u5F85\u7684 webhook \u8DEF\u5F84(webhook \u6A21\u5F0F)"},timeoutMs:{type:"integer",minimum:1,description:"\u8D85\u65F6\u6BEB\u79D2(webhook \u6A21\u5F0F;\u9ED8\u8BA4 24h)"}}},subworkflow:{type:"object",required:["workflowId"],properties:{workflowId:{type:"string",description:"\u8981\u8C03\u7528\u7684\u5DE5\u4F5C\u6D41 id"},projectId:{type:"string",description:"\u8DE8\u9879\u76EE\u76EE\u6807(\u53EF\u9009)"},payload:{type:"object",description:"\u4F20\u5165\u5B50\u6D41\u7A0B\u7684 $trigger \u8F7D\u8377(\u53EF\u9009)"}}},approval:{type:"object",properties:{prompt:{type:"string",description:"\u5BA1\u6279\u95EE\u9898(\u9ED8\u8BA4 \u7EE7\u7EED\u6267\u884C?)"},timeoutMs:{type:"integer",minimum:1,description:"\u8D85\u65F6\u81EA\u52A8\u62D2(\u6BEB\u79D2;\u9ED8\u8BA4 24h)"},timeoutAction:{type:"string",enum:["approve","reject","keepPending"],description:"\u8D85\u65F6\u7B56\u7565(\u9ED8\u8BA4 reject):reject \u62D2\u7EDD\u5E76\u901A\u77E5 owner(\u975E\u9759\u9ED8) / approve \u81EA\u52A8\u6279\u51C6 / keepPending \u4FDD\u6301\u6302\u8D77\u5F85\u4EBA\u5DE5\u51B3\u5B9A"}}}};function Z3(t){return typeof t=="string"&&/\{\{.*\}\}/.test(t)}function sh(t){return typeof t=="string"&&t.includes("__ASK__")}function e6(t,e,n,r,o){let s=e.properties??{},i=Array.isArray(e.required)?e.required:[],a=r?`${r}`:"";for(let l of i){let c=t[l];(c==null||c==="")&&o.push(`\u8282\u70B9\u300C${n}\u300D\u7F3A\u5C11\u5FC5\u586B${a}\u53C2\u6570\u300C${l}\u300D`)}for(let[l,c]of Object.entries(t)){let d=s[l];if(!d||c==null||c===""||Z3(c)||sh(c))continue;let u=Array.isArray(d.enum)?d.enum:null;if(u){u.some(m=>String(m)===String(c))||o.push(`\u8282\u70B9\u300C${n}\u300D${a}\u53C2\u6570\u300C${l}\u300D\u53D6\u503C\u300C${String(c)}\u300D\u4E0D\u5728\u5141\u8BB8\u8303\u56F4(${u.map(String).join("\u3001")})`);continue}let p=d.type;(p==="number"||p==="integer")&&typeof c!="number"?o.push(`\u8282\u70B9\u300C${n}\u300D${a}\u53C2\u6570\u300C${l}\u300D\u5E94\u4E3A\u6570\u5B57`):p==="boolean"&&typeof c!="boolean"?o.push(`\u8282\u70B9\u300C${n}\u300D${a}\u53C2\u6570\u300C${l}\u300D\u5E94\u4E3A\u5E03\u5C14`):p==="string"&&typeof c!="string"&&o.push(`\u8282\u70B9\u300C${n}\u300D${a}\u53C2\u6570\u300C${l}\u300D\u5E94\u4E3A\u6587\u672C`)}}function ih(t,e){let n=[];for(let r of t.nodes){if(r.kind==="trigger"||r.kind==="manual")continue;let o=r.params??{},s=SE[r.kind];s&&(e6(o,s,r.id,"",n),r.kind==="agent"&&o.agentId==="self"&&n.push(`\u8282\u70B9\u300C${r.id}\u300D\u53C2\u6570\u300CagentId\u300D\u4E0D\u5F97\u4F7F\u7528 self,\u5FC5\u987B\u663E\u5F0F\u9009\u62E9\u771F\u5B9E agent id`))}return n}function vE(t){let e=/__ASK__\s*[::]?\s*(.*)$/.exec(String(t));return e?e[1].trim():""}function TE(t){let e=[];for(let n of t.nodes){let r=n.params??{};for(let[o,s]of Object.entries(r))if(sh(s))e.push({nodeId:n.id,field:o,question:vE(s)||`\u8BF7\u8865\u5145\u300C${o}\u300D`});else if(o==="args"&&s&&typeof s=="object"&&!Array.isArray(s))for(let[i,a]of Object.entries(s))sh(a)&&e.push({nodeId:n.id,field:`args.${i}`,question:vE(a)||`\u8BF7\u8865\u5145\u300C${i}\u300D`})}return e}function RE(){let t=["agent","action","http","channel","if","filter","switch","transform","aggregate","wait","subworkflow","approval","set","merge","passthrough"],e=(r,o)=>Array.isArray(o?.enum)?`${r}(${o.enum.map(String).join("/")})`:r,n=[];for(let r of t){let o=SE[r];if(!o)continue;let s=o.properties??{},i=Array.isArray(o.required)?o.required:[],a=Object.keys(s).filter(d=>!i.includes(d)),l=i.length?`\u5FC5\u586B ${i.map(d=>e(d,s[d])).join("\u3001")}`:"\u65E0\u5FC5\u586B",c=a.length?`;\u53EF\u9009 ${a.map(d=>e(d,s[d])).join("\u3001")}`:"";n.push(`- ${r}:${l}${c}`)}return n.join(`
|
|
802
802
|
`)}function t6(t){if(t&&typeof t=="object"){let e=t;if(e.id!=null&&e.nodeId==null&&(e.op==="update_params"||e.op==="rename_node"||e.op==="remove_node"))return{...e,nodeId:e.id}}return t}function n6(t,e){let n=t.flatMap(o=>{if(!o||typeof o!="object")return[];let s=o;return s.op!=="add_node"||!s.node||typeof s.node!="object"?[]:[s.node]});if(n.length===0)return[];let r={id:"workflow-chat-patch-candidate",nodes:n,edges:[]};return[...oh(r,e),...ih(r,e)]}var Si="propose_workflow",PE={type:"function",function:{name:Si,description:"\u4EA7\u51FA\u6216\u66F4\u65B0\u81EA\u52A8\u5316\u5DE5\u4F5C\u6D41\u3002\u65B0\u5EFA\u5DE5\u4F5C\u6D41\u7ED9\u5B8C\u6574 def;\u4FEE\u6539\u5DF2\u6709\u5DE5\u4F5C\u6D41\u7ED9 patch(WorkflowPatch op \u6570\u7EC4,\u5F15\u7528\u73B0\u6709\u8282\u70B9 id)\u3002",parameters:{type:"object",properties:{def:{type:"object",description:"\u5B8C\u6574 WorkflowDef:{ nodes:[{id,kind,name?,params?,outPorts?}], edges:[{from,to,fromPort?,toPort?}], trigger? } \u2014\u2014 \u65B0\u5EFA\u65F6\u7ED9"},patch:{type:"array",items:{type:"object"},description:"WorkflowPatch op \u6570\u7EC4(add_node/remove_node/update_params/rename_node/add_edge/remove_edge/set_trigger/set_meta)\u2014\u2014 \u6539\u5DF2\u6709\u65F6\u7ED9\u3002\u5F15\u7528\u8282\u70B9\u7684 op \u7528\u5B57\u6BB5\u540D **nodeId**(\u4E0D\u662F id):\u5982 {op:'update_params',nodeId:'x',params:{...}}\u3001{op:'rename_node',nodeId:'x',name:'...'}\u3002"},trigger:{type:"object",description:"TriggerDef:{type:'manual'} | {type:'schedule',cron} | {type:'im-message',channel,match?} | {type:'webhook',path} \u2014\u2014 \u65B0\u5EFA\u65F6\u7ED9(\u51B3\u5B9A\u5982\u4F55\u89E6\u53D1;\u4E0D\u786E\u5B9A\u5C31 manual)"},note:{type:"string",description:"\u7ED9\u7528\u6237\u7684\u4E00\u53E5\u8BDD\u8BF4\u660E\u672C\u6B21\u4EA7\u51FA/\u6539\u52A8"}}}}},xE=`\u4F60\u662F\u81EA\u52A8\u5316\u5DE5\u4F5C\u6D41\u7684\u642D\u5EFA\u52A9\u624B(\u4E2D\u7ACB\u3001\u5BF9\u8BDD\u5F0F)\u3002\u628A\u7528\u6237\u7528\u5927\u767D\u8BDD\u63CF\u8FF0\u7684"\u60F3\u81EA\u52A8\u5316\u7684\u4E8B",\u8F6C\u6210\u4E00\u5F20\u53EF\u6267\u884C\u7684\u5DE5\u4F5C\u6D41\u56FE\u3002
|
|
803
803
|
|
|
804
804
|
\u8282\u70B9\u79CD\u7C7B(kind):
|