qlogicagent 2.17.6 → 2.17.7

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 CHANGED
@@ -725,7 +725,7 @@ ${n}
725
725
  `);A&&(C.systemPrompt=A);let _=await h.createSession(f,C);l.sessionId=_.sessionId,this.slog("info",e.memberId,"session",`new session on restart (id=${l.sessionId})`)}}catch{this.slog("warn",e.memberId,"session","session re-creation failed on restart")}this.startHeartbeat(e.memberId,C=>{this.slog("warn",C,"heartbeat","hang detected \u2014 force-killing"),this.callbacks.onNotification?.(C,"agents.error",{agentId:C,phase:"heartbeat",error:`Agent ${e.name} stopped responding`,retriesLeft:0}),this.kill(C)})}catch(l){let d=this.processes.get(e.memberId);d&&(d.handle.state="failed",d.handle.error=`Runtime restart failed: ${l instanceof Error?l.message:String(l)}`,d.handle.endedAt=Date.now()),this.callbacks.onStateChange?.(e.memberId,"failed"),this.callbacks.onNotification?.(e.memberId,"agents.error",{agentId:e.memberId,phase:"runtime",error:`Restart failed after ${r} attempts: ${l instanceof Error?l.message:String(l)}`,retriesLeft:0})}}getMcpIpcPath(e){return this.processes.get(e)?.ipcPath}heartbeatTimers=new Map;missedBeats=new Map;static HEARTBEAT_INTERVAL=3e4;static MAX_MISSED_BEATS=3;startHeartbeat(e,n){this.stopHeartbeat(e),this.missedBeats.set(e,0);let r=setInterval(async()=>{let o=this.processes.get(e);if(!o||o.handle.state==="completed"||o.handle.state==="failed"||o.handle.state==="killed"){this.stopHeartbeat(e);return}if(await this.ping(e,1e4)){this.missedBeats.set(e,0);return}let s=(this.missedBeats.get(e)??0)+1;this.missedBeats.set(e,s),this.slog("warn",e,"heartbeat",`missed (${s}/${t.MAX_MISSED_BEATS})`),s>=t.MAX_MISSED_BEATS&&(this.slog("warn",e,"heartbeat","hang detected, force-killing"),this.stopHeartbeat(e),o.handle.error=`Hang detected: ${s} consecutive heartbeat failures`,this.kill(e),n?.(e))},t.HEARTBEAT_INTERVAL);this.heartbeatTimers.set(e,r)}stopHeartbeat(e){let n=this.heartbeatTimers.get(e);n&&(clearInterval(n),this.heartbeatTimers.delete(e)),this.missedBeats.delete(e)}getMissedBeats(e){return this.missedBeats.get(e)??0}activeCount(){return[...this.processes.values()].filter(e=>e.handle.state==="starting"||e.handle.state==="ready"||e.handle.state==="running").length}remove(e){let n=this.processes.get(e);n&&(this.stopHeartbeat(e),(n.handle.state==="running"||n.handle.state==="starting"||n.handle.state==="ready")&&this.kill(e),this.processes.delete(e))}dispose(){for(let e of this.heartbeatTimers.keys())this.stopHeartbeat(e);for(let e of this.processes.values()){try{e.ipcServer?.close()}catch{}try{e.stderrStream?.end()}catch{}}this.killAll(),this.processes.clear()}};import{spawn as Di}from"node:child_process";var cH=/[|&;><$`(){}]/;function lH(t,e){let n=e==="win32",r=e==="darwin",o=r?[t.brew,t.npm,t.pip,t.curl]:[t.npm,t.pip,t.brew,t.curl];for(let i of o){if(!i)continue;let s=cH.test(i);if(!(s&&n)&&!(i.startsWith("brew ")&&!r))return{command:i,shell:s}}return null}function dH(t,e){if(e!=="cn")return t;let n=t.trim();return/^npm\b/.test(n)&&!/(?:^|\s)--registry(?:\s|=)/.test(n)?`${n} --registry ${Kd}`:/^uv\b/.test(n)&&!/(?:^|\s)--(?:default-)?index(?:-url)?(?:\s|=)/.test(n)?`${n} --default-index ${kc}`:/^(?:pipx|pip3?|python -m pip)\b/.test(n)&&!/(?:^|\s)--index-url(?:\s|=)/.test(n)?`${n} --index-url ${kc}`:n}function aH(t,e,n,r){return new Promise(o=>{let i;try{i=n(t,e)}catch(s){r({type:"log",stream:"stderr",chunk:s instanceof Error?s.message:String(s)}),o(1);return}i.stdout?.on("data",s=>r({type:"log",stream:"stdout",chunk:s.toString()})),i.stderr?.on("data",s=>r({type:"log",stream:"stderr",chunk:s.toString()})),i.on("error",s=>{r({type:"log",stream:"stderr",chunk:s.message}),o(1)}),i.on("close",s=>o(s))})}var Lue=(t,e)=>{let n=_i();if(n&&CP(t)){let i=t.trim().split(/\s+/).slice(1);return Di(n.nodeExe,[n.npmCli,...i],{env:Ci(n),stdio:["ignore","pipe","pipe"],windowsHide:!0})}let r=EP(t)?MP():void 0;if(e||process.platform==="win32")return Di(t,{shell:!0,...r?{env:r}:{},stdio:["ignore","pipe","pipe"],windowsHide:!0});let o=t.split(/\s+/).filter(Boolean);return Di(o[0],o.slice(1),{...r?{env:r}:{},stdio:["ignore","pipe","pipe"]})};async function uH(t,e,n={}){let r=n.platform??process.platform,o=n.spawnImpl??Lue,i=lH(t,r);if(!i){let d=`No install command available for ${r}`;return e({type:"state",state:"failed"}),e({type:"done",ok:!1,error:d}),{ok:!1,error:d}}let s=dH(i.command,n.mirror);e({type:"state",state:"installing"});let a=await aH(s,i.shell,o,e);if(a!==0){let d=`Install command exited with code ${a}`;return e({type:"state",state:"failed"}),e({type:"done",ok:!1,error:d}),{ok:!1,error:d}}let c=t.verifyCmd??`${t.cliCommand} --version`;if(e({type:"state",state:"verifying"}),await aH(c,cH.test(c),o,e)!==0){let d=`Installed but verification failed (${t.cliCommand})`;return e({type:"state",state:"failed"}),e({type:"done",ok:!1,error:d}),{ok:!1,error:d}}return e({type:"state",state:"installed"}),e({type:"done",ok:!0}),{ok:!0}}function pH(t,e=process.platform){try{return e==="win32"?Di("cmd.exe",["/c","start","","cmd","/k",t],{detached:!0,stdio:"ignore",windowsHide:!1}).unref():e==="darwin"?Di("osascript",["-e",`tell application "Terminal" to do script ${JSON.stringify(t)}`,"-e",'tell application "Terminal" to activate'],{detached:!0,stdio:"ignore"}).unref():Di("x-terminal-emulator",["-e","bash","-lc",`${t}; exec bash`],{detached:!0,stdio:"ignore"}).unref(),{ok:!0}}catch(n){return{ok:!1,error:n instanceof Error?n.message:String(n)}}}function mH(t,e={}){let n=e.platform??process.platform,r=lH(t,n);if(!r)return{ok:!1,error:`No install command available for ${n}`};let o=dH(r.command,e.mirror);try{let i=_i(),s;if(i&&CP(o)){let a=o.trim().split(/\s+/).slice(1);s=Di(i.nodeExe,[i.npmCli,...a],{env:Ci(i),detached:!0,stdio:"ignore",windowsHide:!0})}else{let a=EP(o)?MP():void 0;s=Di(o,{shell:!0,...a?{env:a}:{},detached:!0,stdio:"ignore",windowsHide:!0})}return s.unref(),{ok:!0}}catch(i){return{ok:!1,error:i instanceof Error?i.message:String(i)}}}var mt=new Map,Uue=10*6e4,Fue=6e4,Hue=6,Bs=null;function Ug(t,e,n){return`${t}\0${e}\0${n??"default"}`}function tu(t){try{t.manager.kill(t.memberId)}catch{}try{t.manager.dispose()}catch{}}function fH(t){let e=mt.get(t);if(e){if(!e.manager.isAlive(e.memberId)){mt.delete(t),tu(e);return}return e}}function gH(t,e){let n=mt.get(t);n&&n!==e&&(mt.delete(t),tu(n)),mt.set(t,e),zue(),que()}function hH(t,e){let n=mt.get(t);if(!n)return;if(!n.manager.isAlive(n.memberId)){mt.delete(t),tu(n);return}mt.delete(t);let r=mt.get(e);return r&&r!==n&&(mt.delete(e),tu(r)),mt.set(e,n),n.lastUsed=Date.now(),n}var Fg="__warm__";function qs(t){let e=mt.get(t);e&&(mt.delete(t),tu(e))}function nu(t){let e=`${t}\0`,n=0,r=0;for(let[o,i]of[...mt.entries()])o.startsWith(e)&&(i.holder.current?(i.pendingRecredential=!0,r+=1):(qs(o),n+=1));return{evicted:n,deferred:r}}function yH(t){mt.get(t)?.pendingRecredential&&qs(t)}function vH(){for(let t of[...mt.keys()])qs(t);Bs&&(clearInterval(Bs),Bs=null)}function zue(){for(;mt.size>Hue;){let t=null,e=Number.POSITIVE_INFINITY;for(let[n,r]of mt)r.holder.current||r.lastUsed<e&&(e=r.lastUsed,t=n);if(!t)break;qs(t)}}function Bue(t){for(let[e,n]of[...mt.entries()])n.holder.current||t-n.lastUsed>Uue&&qs(e)}function que(){Bs||(Bs=setInterval(()=>Bue(Date.now()),Fue),typeof Bs.unref=="function"&&Bs.unref())}import{randomUUID as Wue}from"node:crypto";var xc=new Map;function Gue(t,e){let n=xc.get(t);return n&&(clearTimeout(n.timer),n.resolve(null),xc.delete(t)),new Promise(r=>{let o=setTimeout(()=>{xc.delete(t),r(null)},e);typeof o.unref=="function"&&o.unref(),xc.set(t,{resolve:r,timer:o})})}function bH(t,e){let n=xc.get(t);return n?(clearTimeout(n.timer),xc.delete(t),n.resolve(e),!0):!1}function Kue(t){if(t==null)return"";if(typeof t=="string")return t;try{return JSON.stringify(t)}catch{return""}}function Vue(t){let e=o=>typeof o?.optionId=="string"&&o.optionId.trim()?o.optionId:void 0;if(t.find(o=>e(o)==="allow"))return"allow";let r=t.find(o=>/allow/i.test([o.optionId,o.kind,o.name].filter(i=>typeof i=="string").join(" ")));return e(r)??e(t[0])??"allow"}function KP(t,e=[]){if(typeof t=="string")return e.push(t),e;if(!t||typeof t!="object")return e;if(Array.isArray(t)){for(let n of t)KP(n,e);return e}for(let n of Object.values(t))KP(n,e);return e}function Jue(t){let e=KP(t).join(`
726
726
  `);return/astraclaw/i.test(e)&&/\b(?:skills_list|skill_view|mcp_connectors_list|mcp_tool_call)\b/.test(e)}async function kH(t,e){let n=e.turnContext(),r=t.toolCall&&typeof t.toolCall=="object"?t.toolCall:{},o=typeof t.permissionId=="string"&&t.permissionId?t.permissionId:Wue(),i=Array.isArray(t.options)?t.options:[];if(Jue(t))return{optionId:Vue(i)};if(n?.turnId&&e.sendNotification){e.sendNotification("agents.prompt.approval",{agentId:e.agentId,sessionId:n.sessionId,turnId:n.turnId,requestId:n.requestId,approvalId:o,callId:typeof r.toolCallId=="string"?r.toolCallId:o,toolName:typeof r.title=="string"?r.title:typeof t.toolName=="string"?t.toolName:"operation",arguments:Kue(r.rawInput),message:typeof t.message=="string"?t.message:void 0,category:typeof t.category=="string"?t.category:"destructive",options:i});let a=await Gue(o,e.timeoutMs??5*6e4);if(a)return{optionId:a}}return{optionId:i.find(a=>a?.kind==="reject_once"||a?.kind==="reject"||/reject|deny|no|cancel/i.test(String(a?.optionId??a?.name??"")))?.optionId??i[0]?.optionId??"reject"}}function Xue(t){let e=t?.rawInput;if(e!=null){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return}}}function Yue(t){let e=t?.content;if(Array.isArray(e)){let n=e.map(r=>{if(!r||typeof r!="object")return"";let o=r;return typeof o.text=="string"?o.text:typeof o.content=="string"?o.content:""}).join("");if(n)return n.slice(0,2e3)}if(typeof e=="string")return e.slice(0,2e3);if(t?.rawOutput!==void 0)try{return JSON.stringify(t.rawOutput).slice(0,2e3)}catch{return}}function Que(t){let{agentId:e,turn:n,method:r,payload:o,sendNotification:i}=t;if(!n||!i)return;let s=o;if(r==="turn.delta"){let c=typeof s?.text=="string"?s.text:"";if(!c)return;n.deltas.push(c),n.turnId&&(i("agents.prompt.delta",{agentId:e,sessionId:n.sessionId,turnId:n.turnId,requestId:n.requestId,text:c}),n.streamedAny=!0);return}if(r==="turn.thought_delta"){let c=typeof s?.text=="string"?s.text:"";c&&n.turnId&&i("agents.prompt.delta",{agentId:e,sessionId:n.sessionId,turnId:n.turnId,requestId:n.requestId,text:c,reasoning:!0});return}if(r==="turn.plan"){n.turnId&&i("agents.prompt.plan",{agentId:e,sessionId:n.sessionId,turnId:n.turnId,requestId:n.requestId,steps:Array.isArray(s?.steps)?s.steps:[]});return}if(r==="turn.tool_use_summary"){if(!n.turnId||!Array.isArray(s?.availableToolNames)||!Array.isArray(s?.enabledToolNames)||!Array.isArray(s?.toolCallNames)||!Array.isArray(s?.blockedToolCalls))return;i("turn.tool_use_summary",{...s,sessionId:n.sessionId,turnId:n.turnId,requestId:n.requestId});return}if(r==="turn.tool_selection_policy"){if(!n.turnId||!Array.isArray(s?.availableToolNames)||!Array.isArray(s?.enabledToolNamesBefore)||!Array.isArray(s?.enabledToolNamesAfter)||!Array.isArray(s?.suppressedToolNames))return;i("turn.tool_selection_policy",{...s,sessionId:n.sessionId,turnId:n.turnId,requestId:n.requestId});return}if(!n.turnId)return;let a=typeof s?.callId=="string"?s.callId:String(s?.callId??"");r==="turn.tool_call"?i("agents.prompt.tool",{agentId:e,sessionId:n.sessionId,turnId:n.turnId,requestId:n.requestId,event:{kind:"call",callId:a,name:typeof s?.toolName=="string"?s.toolName:typeof s?.name=="string"?s.name:"tool",arguments:Xue(s)}}):r==="turn.tool_result"&&i("agents.prompt.tool",{agentId:e,sessionId:n.sessionId,turnId:n.turnId,requestId:n.requestId,event:{kind:"result",callId:a,name:typeof s?.toolName=="string"?s.toolName:"tool",ok:s?.status!=="failed"&&s?.status!=="error",outputPreview:Yue(s)}})}function SH(t){let e=t?.authMethods;return Array.isArray(e)&&e.length>0?e:void 0}function xH(t){return t instanceof Error?t.message:String(t)}async function epe(t){let e=SH(t.error);if(!t.sessionId||!e)return;let n=xH(t.error);await yr(t.sessionId,{role:"user",content:t.prompt},t.projectRoot,t.turnId),await yr(t.sessionId,{role:"assistant",content:n,blocks:[{type:"auth_prompt",agentId:t.agentId,message:n,authMethods:e}]},t.projectRoot,t.turnId);let r=Kt(t.sessionId,t.projectRoot),o=await Ta(t.sessionId,t.projectRoot);await vt(t.sessionId,{type:"personal",...t.projectId?{projectId:t.projectId}:{},...o!==null?{messageCount:o}:{},...r?.title?{}:{title:Dl(t.prompt,"External agent login required")},...t.lockSessionOwner===!1||r?.agentId?{}:{agentId:t.agentId}},t.projectRoot)}async function RH(t){let e=t.params,n=typeof e?.approvalId=="string"?e.approvalId:"",r=typeof e?.optionId=="string"?e.optionId:"",o=n&&r?bH(n,r):!1;t.id!==void 0&&this.sendResponse(t.id,{ok:o})}async function TH(t){try{let e=t.params,n=await this.ensureAgentConfigStore();this.acpDetector.setConfigStore(n.getData());let r=await this.acpDetector.scanAsync(e?.force);t.id!==void 0&&this.sendResponse(t.id,r)}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function AH(t){try{let e=await this.ensureAgentConfigStore();this.acpDetector.setConfigStore(e.getData());let n=await this.acpDetector.scanAsync(!1);t.id!==void 0&&this.sendResponse(t.id,n)}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function PH(t){try{let e=await this.ensureAgentConfigStore();this.acpDetector.setConfigStore(e.getData());let n=new Map(this.acpDetector.list().map(o=>[o.id,o])),r=Wd().map(o=>{let i=n.get(o.id);return{id:o.id,name:o.name,brandId:o.brandId??o.id,category:o.category??"code",integration:o.integration??"acp",authMode:o.authMode??"key",keySource:o.keySource??"none",note:o.note,availableModes:WF(o),authPreference:e.getAgentConfig(o.id)?.authPreference??"auto",credentialReady:i?.status==="available"?this.acpDetector.isAgentReady(o.id):!1,accountConnected:i?.status==="available"?this.acpDetector.getNativeLoginState(o.id):void 0,status:i?.status??"not_installed",version:LF(o,i?.version),install:{docsUrl:o.install?.docsUrl,command:o.install?.npm??o.install?.pip??o.install?.brew??o.install?.curl,setupCommand:o.install?.setupCommand}}});t.id!==void 0&&this.sendResponse(t.id,{catalog:r})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}var VP=new Set;async function IH(t){try{let e=t.params,r=(typeof e?.mirror=="string"&&e.mirror?e.mirror:process.env.QLOGICAGENT_INSTALL_MIRROR)==="cn"?Kd:void 0,o=await this.ensureAgentConfigStore();this.acpDetector.setConfigStore(o.getData());let i=new Map(this.acpDetector.list().map(l=>[l.id,l])),s=Wd().map(l=>({id:l.id,entry:l,detectedVersion:i.get(l.id)?.version})),{updates:a,stale:c}=FF(s,r);if(t.id!==void 0&&this.sendResponse(t.id,{updates:a,refreshing:c}),c){let l=r??"";VP.has(l)||(VP.add(l),UF(s,r).catch(()=>{}).finally(()=>VP.delete(l)))}}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function _H(t){let e=t.params,n=typeof e?.agentId=="string"?e.agentId:void 0,r=typeof e?.mirror=="string"&&e.mirror?e.mirror:process.env.QLOGICAGENT_INSTALL_MIRROR;if(!n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"agentId (string) required"});return}let o=Mo(n);if(!o?.install){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:`Unknown or non-installable agent: ${n}`});return}if(o.install.deferUpdate){let i=mH(o.install,{mirror:r});t.id!==void 0&&this.sendResponse(t.id,{ok:i.ok,error:i.error,deferred:i.ok});return}try{let i=await uH(o.install,s=>{this.sendNotification?.("agent.install.progress",{agentId:n,event:s})},{mirror:r});this.acpDetector.clearCache(),t.id!==void 0&&this.sendResponse(t.id,{ok:i.ok,error:i.error})}catch(i){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:i instanceof Error?i.message:String(i)})}}async function CH(t){let e=t.params,n=typeof e?.agentId=="string"?e.agentId:void 0;if(!n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"agentId (string) required"});return}let o=Mo(n)?.install?.setupCommand;if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:`No terminal setup command for agent: ${n}`});return}let i=pH(o);t.id!==void 0&&this.sendResponse(t.id,{ok:i.ok,error:i.error,command:o})}async function EH(t){try{let e=t.params;if(!e?.action||!e?.agent){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"action and agent are required."});return}let n=await this.ensureAgentConfigStore();switch(e.action){case"register":await n.registerCustomAgent(e.agent);break;case"unregister":await n.unregisterCustomAgent(e.agent.id);break;case"update":await n.registerCustomAgent(e.agent);break}this.acpDetector.setConfigStore(n.getData()),this.acpDetector.clearCache(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function MH(t){try{let e=t.params;if(!e?.agentId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"agentId is required."});return}let n=await this.ensureAgentConfigStore(),{agentId:r,...o}=e;await n.setAgentConfig(r,o),this.acpDetector.setConfigStore(n.getData());let{deferred:i}=nu(r);t.id!==void 0&&this.sendResponse(t.id,{ok:!0,pendingTurn:i>0})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function DH(t){try{let e=t.params;if(!e?.agentId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"agentId is required."});return}let r=(await this.ensureAgentConfigStore()).getAgentConfig(e.agentId);t.id!==void 0&&this.sendResponse(t.id,r)}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function $H(t){try{let e=t.params;if(!e?.agentId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"agentId is required."});return}let n=await this.ensureAgentConfigStore();await n.removeAgentConfig(e.agentId),this.acpDetector.setConfigStore(n.getData()),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}function tpe(t){let e=wH.homedir();if(t==="codex"){let n=process.env.CODEX_HOME?.trim()||Rc.join(e,".codex");return[Rc.join(n,"auth.json")]}return[]}async function NH(t){try{let e=t.params,n=typeof e?.agentId=="string"?e.agentId.trim():"";if(!n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"agentId is required."});return}let r=!1;for(let o of tpe(n))try{Tc.existsSync(o)&&(Tc.rmSync(o,{force:!0}),r=!0)}catch{}nu(n),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,cleared:r,hint:r?void 0:`\u5728\u7EC8\u7AEF\u8FD0\u884C \`${n} logout\` \u9000\u51FA\u8BE5 Agent \u7684\u8D26\u53F7`})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function OH(t){try{let e=t.params;if(!e?.url){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"url is required."});return}await(await this.ensureAgentConfigStore()).setGatewayUrl(e.url),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function jH(t){try{let n=(await this.ensureAgentConfigStore()).getGatewayUrl();t.id!==void 0&&this.sendResponse(t.id,{url:n})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function LH(t){try{let n=(await this.ensureAgentConfigStore()).getData(),r=Object.entries(n.agents).map(([o,i])=>({agentId:o,hasApiKey:!!i.apiKey,hasBaseUrl:!!i.baseUrl,hasModel:!!i.model}));t.id!==void 0&&this.sendResponse(t.id,r)}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}function UH(t){try{let e=[],n=(r,o)=>{if(r)for(let i of r.getAllHandles())e.push({memberId:i.memberId,name:i.name,pid:i.pid,state:i.state,startedAt:i.startedAt,endedAt:i.endedAt,source:o})};n(this.soloProcessManager,"solo"),n(this.productProcessManager,"product"),t.id!==void 0&&this.sendResponse(t.id,e)}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}function FH(t){try{let e=t.params;if(!e?.memberId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"memberId is required."});return}let n=!1;for(let r of[this.soloProcessManager,this.productProcessManager])if(r?.getHandle(e.memberId)){r.kill(e.memberId),n=!0;break}t.id!==void 0&&this.sendResponse(t.id,{ok:n})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function HH(t){try{let e=t.params;if(!e?.agentId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"agentId is required."});return}let n=Rc.join(_e(),"agent-logs"),r=Rc.join(n,`${e.agentId}.stderr.log`),o="";try{o=Tc.readFileSync(r,"utf-8")}catch{}e.tail&&e.tail>0&&o&&(o=o.split(`
727
727
  `).slice(-e.tail).join(`
728
- `)),t.id!==void 0&&this.sendResponse(t.id,{log:o})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function zH(t){try{let e=t.params;if(!e?.agentId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"agentId is required."});return}let n=await this.ensureAgentConfigStore();this.acpDetector.setConfigStore(n.getData());let o=this.acpDetector.list().find(s=>s.id===e.agentId);if(!o){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,error:`Agent ${e.agentId} not found`,durationMs:0});return}if(o.status==="not_installed"){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,error:`Agent ${e.agentId} is not installed`,durationMs:0});return}let i=Date.now();t.id!==void 0&&this.sendResponse(t.id,{ok:o.status==="available",version:o.version,capabilities:o.capabilities,error:o.status!=="available"?`Agent status: ${o.status}`:void 0,durationMs:Date.now()-i})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function BH(t,e,n,r,o,i){let s=Ug(e,r,o),a=fH(s);if(a)return a;if(o!==Fg){let f=hH(Ug(e,r,Fg),s);if(f)return f}let c=`chat-${e}-${Zue().slice(0,8)}`,l={current:null},d=typeof t.sendNotification=="function"?t.sendNotification.bind(t):void 0,p=new Jr({onNotification:(f,g,h)=>{Que({agentId:e,turn:l.current,method:g,payload:h,sendNotification:d})},onMcpToolCall:async(f,g,h)=>{if(typeof t.handleMcpToolCall=="function")return t.handleMcpToolCall(f,g,h);let y=await Og({tool:g,args:h,projectRoot:r});return y.handled?y.result:{ok:!1,error:"MCP tool call unavailable"}},onPermissionRequest:(f,g)=>kH(g,{agentId:e,turnContext:()=>l.current,sendNotification:d}),log:{info:f=>t.log?.(`[agents.prompt] ${f}`),warn:f=>t.log?.(`[agents.prompt] WARN: ${f}`),debug:f=>t.log?.(`[agents.prompt] ${f}`)},sessionDir:Rc.join(_e(),"agent-logs")});await p.spawn({memberId:c,name:`chat-${e}`,cwd:r,prompt:"",external:n,systemPrompt:i});let m={manager:p,memberId:c,holder:l,lastUsed:Date.now()};return gH(s,m),m}async function qH(t){try{let e=t.params??{},n=typeof e.agentId=="string"?e.agentId.trim():"";if(!n||n==="qlogicagent"){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,warmed:!1});return}let r=await this.ensureAgentConfigStore();this.acpDetector.setConfigStore(r.getData()),await this.acpDetector.scanAsync(!1);let o=this.acpDetector.buildExternalDescriptor(n);if(!o){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,warmed:!1});return}if(this.acpDetector.resolveCredentialError(n)){t.id!==void 0&&this.sendResponse(t.id,{ok:!0,warmed:!1});return}let i=typeof this.getActiveProjectRoot=="function"?this.getActiveProjectRoot():process.cwd();await BH(this,n,o,i,Fg),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,warmed:!0})}catch(e){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,warmed:!1,error:e instanceof Error?e.message:String(e)})}}async function WH(t){try{let e=t.params??{},n=typeof e.agentId=="string"?e.agentId.trim():"",r=typeof e.prompt=="string"?e.prompt:"";if(!n||!r.trim()){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"agentId and prompt are required."});return}let o=await this.ensureAgentConfigStore();this.acpDetector.setConfigStore(o.getData()),await this.acpDetector.scanAsync(!1);let i=this.acpDetector.buildExternalDescriptor(n);if(!i){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:`Agent ${n} is not available or not ACP-compatible.`});return}let s=this.acpDetector.resolveCredentialError(n);if(s){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:s});return}let a=typeof e.cwd=="string"&&e.cwd?e.cwd:typeof this.getActiveProjectRoot=="function"?this.getActiveProjectRoot():process.cwd(),c=typeof e.timeoutMs=="number"&&e.timeoutMs>0?e.timeoutMs:3e5,l=typeof e.sessionId=="string"?e.sessionId:void 0,d=typeof e.turnId=="string"?e.turnId:void 0,p=typeof e.requestId=="string"?e.requestId:void 0,m=typeof e.projectId=="string"?e.projectId:void 0,f=e.lockSessionOwner!==!1,g=Ug(n,a,l),h=await BH(this,n,i,a,l,typeof e.systemPrompt=="string"?e.systemPrompt:void 0),y={sessionId:l,turnId:d,requestId:p,deltas:[],streamedAny:!1};h.holder.current=y,h.lastUsed=Date.now();let b;try{b=await h.manager.sendTask(h.memberId,r,{timeout:c})}catch(S){throw await epe({sessionId:l,projectRoot:a,turnId:d,projectId:m,agentId:n,prompt:r,error:S,lockSessionOwner:f}),qs(g),S}finally{h.holder.current=null,yH(g)}let v=y.deltas.join("")||(typeof b?.content=="string"?b.content:""),k=h.manager.getUsageTracker(h.memberId)?.getUsage();if(l){yr(l,{role:"user",content:r},a,d),v&&yr(l,{role:"assistant",content:v},a,d);let S=Kt(l,a);vt(l,{type:"personal",...m?{projectId:m}:{},...S?.title?{}:{title:Dl(r,"External agent session")},...f&&!S?.agentId?{agentId:n}:{}},a)}t.id!==void 0&&this.sendResponse(t.id,{ok:!0,agentId:n,content:v,streamed:y.streamedAny,stopReason:b?.stopReason,usage:k?{inputTokens:k.inputTokens,outputTokens:k.outputTokens,totalTokens:k.totalTokens,cacheRead:k.cachedReadTokens,thoughtTokens:k.thoughtTokens,cost:k.cost}:void 0})}catch(e){if(t.id!==void 0){let n=SH(e);this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:xH(e),...n?{data:{authMethods:n}}:{}})}}}em();function npe(t){let e=ipe(t.fetchFn??fetch,t.clientVersion),n=t.token.trim();return{async matchRegistry(r){let o=r.intent.trim();if(!o)throw new Error("intent is required.");let i=ape(r.topK),s=await zg(e,Hg(t.baseUrl,"/api/v15/registry/match"),n,"POST",{intent:o,topK:i,prefer:r.preferOfficial===!1?"relevance":"official",canonicalOnly:!0});return(Ac(s)&&Array.isArray(s.matches)?s.matches:[]).map(cpe).filter(c=>!!c).slice(0,i)},async resolveInstall(r,o){let i=encodeURIComponent(r.trim());if(!i)throw new Error("resourceId is required.");let s=o?.trim(),a=s?`?version=${encodeURIComponent(s)}`:"",c=await zg(e,Hg(t.baseUrl,`/api/v15/registry/resources/${i}/install${a}`),n,"GET"),l=VH(c);if(!l)throw new Error("Community hub returned an invalid install resolution.");return l},async listResourceVersions(r){let o=encodeURIComponent(r.trim());if(!o)throw new Error("resourceId is required.");let i=await zg(e,Hg(t.baseUrl,`/api/v15/registry/resources/${o}/versions`),n,"GET");return(Ac(i)&&Array.isArray(i.versions)?i.versions:[]).map(lpe).filter(a=>!!a)},async resolveRuntime(r,o){let i=encodeURIComponent(r.trim());if(!i)throw new Error("runtime id is required.");let s=encodeURIComponent(o.trim());if(!s)throw new Error("platform is required.");let a=await zg(e,Hg(t.baseUrl,`/api/v15/runtime/${i}/resolve?platform=${s}`),n,"GET"),c=dpe(a);if(!c)throw new Error("Community hub returned an invalid runtime resolution.");return c}}}function Pc(t=ii()){let e=t.get("QLOGIC_LLMROUTER_ACCESS_TOKEN")?.trim();if(!e)return null;let n=rpe(t);return npe({baseUrl:ope(t),token:e,clientVersion:n})}function rpe(t){let e=t.get("QLOGIC_AGENT_VERSION")?.trim();return e||"2.17.6"}function ope(t){return t.get("QLOGIC_HUB_BASE_URL")?.trim()||t.get("XIAOZHICLAW_HUB_URL")?.trim()||"https://xiaozhi.qlogicagent.com"}function Hg(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 ipe(t,e){let n=e?.trim();return n?(r,o)=>t(r,{...o,headers:{...o?.headers,"x-client-version":n}}):t}async function zg(t,e,n,r,o){let i,s=o!==void 0;try{i=await t(e,{method:r,headers:{accept:"application/json",authorization:`Bearer ${n}`,...s?{"content-type":"application/json"}:{}},...s?{body:JSON.stringify(o)}:{},signal:AbortSignal.timeout(1e4)})}catch{throw new Error("Community hub is unavailable.")}if(!i.ok)throw new Error(`Community hub rejected registry request: ${i.status}${await spe(i)}`);return i.json().catch(()=>null)}async function spe(t){try{let e=(await t.text()).trim();return e?` ${e.slice(0,500)}`:""}catch{return""}}function Ac(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function ape(t){if(t===void 0)return 3;if(typeof t!="number"||!Number.isSafeInteger(t)||t<1||t>3)throw new Error("registry match topK must be an integer between 1 and 3.");return t}function cpe(t){if(!Ac(t)||t.canonical!==!0&&t.isCanonical!==!0)return null;let e=GH(t.sourceTier),n=KH(t.trustStage),r=Bg(t.resourceRiskTier),o=Bg(t.effectiveRiskTier);if(typeof t.id!="string"||typeof t.title!="string"||!e||!n||!r||!o)return null;let i=Array.isArray(t.capabilityTags)?t.capabilityTags:[];return{id:t.id,type:typeof t.type=="string"?t.type:"skill",title:JP(t.title,80),summary:JP(typeof t.summary=="string"?t.summary:"",160),category:typeof t.category=="string"?t.category:null,capabilityTags:i.filter(s=>typeof s=="string"&&s.trim().length>0).slice(0,6).map(s=>JP(s,32)),sourceTier:e,trustStage:n,resourceRiskTier:r,effectiveRiskTier:o,latestVersion:typeof t.latestVersion=="string"?t.latestVersion:null,canonical:!0}}function JP(t,e){let n=t.replace(/\s+/g," ").trim();return n.length<=e?n:`${n.slice(0,Math.max(0,e-1))}\u2026`}function lpe(t){return!Ac(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 dpe(t){if(!Ac(t))return null;let e=typeof t.id=="string"?t.id:"",n=typeof t.version=="string"?t.version:"",r=typeof t.downloadUrl=="string"?t.downloadUrl:"",o=typeof t.checksum=="string"?t.checksum:"",i=typeof t.sizeBytes=="number"?t.sizeBytes:0;return!e||!n||!r||!/^[a-f0-9]{64}$/.test(o)||!Number.isSafeInteger(i)||i<=0?null:{id:e,version:n,downloadUrl:r,checksum:o,sizeBytes:i}}var upe=new Set(["R0","R1","R2","R3"]),ppe=new Set(["official","community"]),mpe=new Set(["quarantine","trial","trusted"]),fpe=new Set(["pending","approved","rejected"]);function Bg(t){return typeof t=="string"&&upe.has(t)?t:null}function GH(t){return typeof t=="string"&&ppe.has(t)?t:null}function KH(t){return typeof t=="string"&&mpe.has(t)?t:null}function gpe(t){return typeof t=="string"&&fpe.has(t)?t:null}function VH(t){if(!Ac(t))return null;let e=GH(t.sourceTier),n=KH(t.trustStage),r=gpe(t.reviewStatus),o=Bg(t.resourceRiskTier),i=Bg(t.effectiveRiskTier);if(typeof t.id!="string"||typeof t.type!="string"||typeof t.kind!="string"||!e||!n||!r||!o||!i||typeof t.version!="string"||typeof t.checksum!="string"||typeof t.sizeBytes!="number"||typeof t.downloadUrl!="string")return null;let s=Array.isArray(t.requires)?t.requires:null,a=Array.isArray(t.dependencies)?t.dependencies:null;if(!s||!a||s.some(l=>typeof l!="string"))return null;let c=a.map(VH);return c.some(l=>!l)?null:{id:t.id,type:t.type,kind:t.kind,sourceTier:e,trustStage:n,reviewStatus:r,resourceRiskTier:o,effectiveRiskTier:i,requires:s,dependencies:c,version:t.version,checksum:t.checksum,sizeBytes:t.sizeBytes,downloadUrl:t.downloadUrl,manifest:t.manifest,minClientVersion:typeof t.minClientVersion=="string"&&t.minClientVersion.trim()?t.minClientVersion.trim():void 0,signature:typeof t.signature=="string"&&t.signature.trim()?t.signature:null,signingKeyId:typeof t.signingKeyId=="string"&&t.signingKeyId.trim()?t.signingKeyId:null}}le();var ZP={enabled:!0},hpe=new Set(["R2","R3"]);function JH(t,e=ZP){return hpe.has(t.effectiveRiskTier)?{mode:"high-risk-ask",requiresInstallConsent:!0,requiresHighRiskConsent:!0,reason:`effectiveRiskTier=${t.effectiveRiskTier} \u9AD8\u5371,\u5FC5\u987B\u9AD8\u5371\u95EE\u4EBA`}:e.enabled?t.effectiveRiskTier==="R0"?{mode:"silent",requiresInstallConsent:!1,requiresHighRiskConsent:!1,reason:"R0 \u4F4E\u98CE\u9669 inert,\u81EA\u6CBB\u9759\u9ED8\u83B7\u53D6"}:{mode:"ask",requiresInstallConsent:!0,requiresHighRiskConsent:!1,reason:"R1 \u4F4E\u98CE\u9669\u4F46\u975E\u96F6,\u95EE\u4EBA\u4E00\u6B21"}:{mode:"ask",requiresInstallConsent:!0,requiresHighRiskConsent:!1,reason:"\u81EA\u6CBB\u9884\u7B97\u5173\u95ED,\u56DE\u9000\u663E\u5F0F\u540C\u610F"}}import{createPublicKey as ype,verify as vpe}from"node:crypto";function bpe(t){return`id=${t.id}
728
+ `)),t.id!==void 0&&this.sendResponse(t.id,{log:o})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function zH(t){try{let e=t.params;if(!e?.agentId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"agentId is required."});return}let n=await this.ensureAgentConfigStore();this.acpDetector.setConfigStore(n.getData());let o=this.acpDetector.list().find(s=>s.id===e.agentId);if(!o){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,error:`Agent ${e.agentId} not found`,durationMs:0});return}if(o.status==="not_installed"){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,error:`Agent ${e.agentId} is not installed`,durationMs:0});return}let i=Date.now();t.id!==void 0&&this.sendResponse(t.id,{ok:o.status==="available",version:o.version,capabilities:o.capabilities,error:o.status!=="available"?`Agent status: ${o.status}`:void 0,durationMs:Date.now()-i})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function BH(t,e,n,r,o,i){let s=Ug(e,r,o),a=fH(s);if(a)return a;if(o!==Fg){let f=hH(Ug(e,r,Fg),s);if(f)return f}let c=`chat-${e}-${Zue().slice(0,8)}`,l={current:null},d=typeof t.sendNotification=="function"?t.sendNotification.bind(t):void 0,p=new Jr({onNotification:(f,g,h)=>{Que({agentId:e,turn:l.current,method:g,payload:h,sendNotification:d})},onMcpToolCall:async(f,g,h)=>{if(typeof t.handleMcpToolCall=="function")return t.handleMcpToolCall(f,g,h);let y=await Og({tool:g,args:h,projectRoot:r});return y.handled?y.result:{ok:!1,error:"MCP tool call unavailable"}},onPermissionRequest:(f,g)=>kH(g,{agentId:e,turnContext:()=>l.current,sendNotification:d}),log:{info:f=>t.log?.(`[agents.prompt] ${f}`),warn:f=>t.log?.(`[agents.prompt] WARN: ${f}`),debug:f=>t.log?.(`[agents.prompt] ${f}`)},sessionDir:Rc.join(_e(),"agent-logs")});await p.spawn({memberId:c,name:`chat-${e}`,cwd:r,prompt:"",external:n,systemPrompt:i});let m={manager:p,memberId:c,holder:l,lastUsed:Date.now()};return gH(s,m),m}async function qH(t){try{let e=t.params??{},n=typeof e.agentId=="string"?e.agentId.trim():"";if(!n||n==="qlogicagent"){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,warmed:!1});return}let r=await this.ensureAgentConfigStore();this.acpDetector.setConfigStore(r.getData()),await this.acpDetector.scanAsync(!1);let o=this.acpDetector.buildExternalDescriptor(n);if(!o){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,warmed:!1});return}if(this.acpDetector.resolveCredentialError(n)){t.id!==void 0&&this.sendResponse(t.id,{ok:!0,warmed:!1});return}let i=typeof this.getActiveProjectRoot=="function"?this.getActiveProjectRoot():process.cwd();await BH(this,n,o,i,Fg),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,warmed:!0})}catch(e){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,warmed:!1,error:e instanceof Error?e.message:String(e)})}}async function WH(t){try{let e=t.params??{},n=typeof e.agentId=="string"?e.agentId.trim():"",r=typeof e.prompt=="string"?e.prompt:"";if(!n||!r.trim()){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"agentId and prompt are required."});return}let o=await this.ensureAgentConfigStore();this.acpDetector.setConfigStore(o.getData()),await this.acpDetector.scanAsync(!1);let i=this.acpDetector.buildExternalDescriptor(n);if(!i){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:`Agent ${n} is not available or not ACP-compatible.`});return}let s=this.acpDetector.resolveCredentialError(n);if(s){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:s});return}let a=typeof e.cwd=="string"&&e.cwd?e.cwd:typeof this.getActiveProjectRoot=="function"?this.getActiveProjectRoot():process.cwd(),c=typeof e.timeoutMs=="number"&&e.timeoutMs>0?e.timeoutMs:3e5,l=typeof e.sessionId=="string"?e.sessionId:void 0,d=typeof e.turnId=="string"?e.turnId:void 0,p=typeof e.requestId=="string"?e.requestId:void 0,m=typeof e.projectId=="string"?e.projectId:void 0,f=e.lockSessionOwner!==!1,g=Ug(n,a,l),h=await BH(this,n,i,a,l,typeof e.systemPrompt=="string"?e.systemPrompt:void 0),y={sessionId:l,turnId:d,requestId:p,deltas:[],streamedAny:!1};h.holder.current=y,h.lastUsed=Date.now();let b;try{b=await h.manager.sendTask(h.memberId,r,{timeout:c})}catch(S){throw await epe({sessionId:l,projectRoot:a,turnId:d,projectId:m,agentId:n,prompt:r,error:S,lockSessionOwner:f}),qs(g),S}finally{h.holder.current=null,yH(g)}let v=y.deltas.join("")||(typeof b?.content=="string"?b.content:""),k=h.manager.getUsageTracker(h.memberId)?.getUsage();if(l){yr(l,{role:"user",content:r},a,d),v&&yr(l,{role:"assistant",content:v},a,d);let S=Kt(l,a);vt(l,{type:"personal",...m?{projectId:m}:{},...S?.title?{}:{title:Dl(r,"External agent session")},...f&&!S?.agentId?{agentId:n}:{}},a)}t.id!==void 0&&this.sendResponse(t.id,{ok:!0,agentId:n,content:v,streamed:y.streamedAny,stopReason:b?.stopReason,usage:k?{inputTokens:k.inputTokens,outputTokens:k.outputTokens,totalTokens:k.totalTokens,cacheRead:k.cachedReadTokens,thoughtTokens:k.thoughtTokens,cost:k.cost}:void 0})}catch(e){if(t.id!==void 0){let n=SH(e);this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:xH(e),...n?{data:{authMethods:n}}:{}})}}}em();function npe(t){let e=ipe(t.fetchFn??fetch,t.clientVersion),n=t.token.trim();return{async matchRegistry(r){let o=r.intent.trim();if(!o)throw new Error("intent is required.");let i=ape(r.topK),s=await zg(e,Hg(t.baseUrl,"/api/v15/registry/match"),n,"POST",{intent:o,topK:i,prefer:r.preferOfficial===!1?"relevance":"official",canonicalOnly:!0});return(Ac(s)&&Array.isArray(s.matches)?s.matches:[]).map(cpe).filter(c=>!!c).slice(0,i)},async resolveInstall(r,o){let i=encodeURIComponent(r.trim());if(!i)throw new Error("resourceId is required.");let s=o?.trim(),a=s?`?version=${encodeURIComponent(s)}`:"",c=await zg(e,Hg(t.baseUrl,`/api/v15/registry/resources/${i}/install${a}`),n,"GET"),l=VH(c);if(!l)throw new Error("Community hub returned an invalid install resolution.");return l},async listResourceVersions(r){let o=encodeURIComponent(r.trim());if(!o)throw new Error("resourceId is required.");let i=await zg(e,Hg(t.baseUrl,`/api/v15/registry/resources/${o}/versions`),n,"GET");return(Ac(i)&&Array.isArray(i.versions)?i.versions:[]).map(lpe).filter(a=>!!a)},async resolveRuntime(r,o){let i=encodeURIComponent(r.trim());if(!i)throw new Error("runtime id is required.");let s=encodeURIComponent(o.trim());if(!s)throw new Error("platform is required.");let a=await zg(e,Hg(t.baseUrl,`/api/v15/runtime/${i}/resolve?platform=${s}`),n,"GET"),c=dpe(a);if(!c)throw new Error("Community hub returned an invalid runtime resolution.");return c}}}function Pc(t=ii()){let e=t.get("QLOGIC_LLMROUTER_ACCESS_TOKEN")?.trim();if(!e)return null;let n=rpe(t);return npe({baseUrl:ope(t),token:e,clientVersion:n})}function rpe(t){let e=t.get("QLOGIC_AGENT_VERSION")?.trim();return e||"2.17.7"}function ope(t){return t.get("QLOGIC_HUB_BASE_URL")?.trim()||t.get("XIAOZHICLAW_HUB_URL")?.trim()||"https://xiaozhi.qlogicagent.com"}function Hg(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 ipe(t,e){let n=e?.trim();return n?(r,o)=>t(r,{...o,headers:{...o?.headers,"x-client-version":n}}):t}async function zg(t,e,n,r,o){let i,s=o!==void 0;try{i=await t(e,{method:r,headers:{accept:"application/json",authorization:`Bearer ${n}`,...s?{"content-type":"application/json"}:{}},...s?{body:JSON.stringify(o)}:{},signal:AbortSignal.timeout(1e4)})}catch{throw new Error("Community hub is unavailable.")}if(!i.ok)throw new Error(`Community hub rejected registry request: ${i.status}${await spe(i)}`);return i.json().catch(()=>null)}async function spe(t){try{let e=(await t.text()).trim();return e?` ${e.slice(0,500)}`:""}catch{return""}}function Ac(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function ape(t){if(t===void 0)return 3;if(typeof t!="number"||!Number.isSafeInteger(t)||t<1||t>3)throw new Error("registry match topK must be an integer between 1 and 3.");return t}function cpe(t){if(!Ac(t)||t.canonical!==!0&&t.isCanonical!==!0)return null;let e=GH(t.sourceTier),n=KH(t.trustStage),r=Bg(t.resourceRiskTier),o=Bg(t.effectiveRiskTier);if(typeof t.id!="string"||typeof t.title!="string"||!e||!n||!r||!o)return null;let i=Array.isArray(t.capabilityTags)?t.capabilityTags:[];return{id:t.id,type:typeof t.type=="string"?t.type:"skill",title:JP(t.title,80),summary:JP(typeof t.summary=="string"?t.summary:"",160),category:typeof t.category=="string"?t.category:null,capabilityTags:i.filter(s=>typeof s=="string"&&s.trim().length>0).slice(0,6).map(s=>JP(s,32)),sourceTier:e,trustStage:n,resourceRiskTier:r,effectiveRiskTier:o,latestVersion:typeof t.latestVersion=="string"?t.latestVersion:null,canonical:!0}}function JP(t,e){let n=t.replace(/\s+/g," ").trim();return n.length<=e?n:`${n.slice(0,Math.max(0,e-1))}\u2026`}function lpe(t){return!Ac(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 dpe(t){if(!Ac(t))return null;let e=typeof t.id=="string"?t.id:"",n=typeof t.version=="string"?t.version:"",r=typeof t.downloadUrl=="string"?t.downloadUrl:"",o=typeof t.checksum=="string"?t.checksum:"",i=typeof t.sizeBytes=="number"?t.sizeBytes:0;return!e||!n||!r||!/^[a-f0-9]{64}$/.test(o)||!Number.isSafeInteger(i)||i<=0?null:{id:e,version:n,downloadUrl:r,checksum:o,sizeBytes:i}}var upe=new Set(["R0","R1","R2","R3"]),ppe=new Set(["official","community"]),mpe=new Set(["quarantine","trial","trusted"]),fpe=new Set(["pending","approved","rejected"]);function Bg(t){return typeof t=="string"&&upe.has(t)?t:null}function GH(t){return typeof t=="string"&&ppe.has(t)?t:null}function KH(t){return typeof t=="string"&&mpe.has(t)?t:null}function gpe(t){return typeof t=="string"&&fpe.has(t)?t:null}function VH(t){if(!Ac(t))return null;let e=GH(t.sourceTier),n=KH(t.trustStage),r=gpe(t.reviewStatus),o=Bg(t.resourceRiskTier),i=Bg(t.effectiveRiskTier);if(typeof t.id!="string"||typeof t.type!="string"||typeof t.kind!="string"||!e||!n||!r||!o||!i||typeof t.version!="string"||typeof t.checksum!="string"||typeof t.sizeBytes!="number"||typeof t.downloadUrl!="string")return null;let s=Array.isArray(t.requires)?t.requires:null,a=Array.isArray(t.dependencies)?t.dependencies:null;if(!s||!a||s.some(l=>typeof l!="string"))return null;let c=a.map(VH);return c.some(l=>!l)?null:{id:t.id,type:t.type,kind:t.kind,sourceTier:e,trustStage:n,reviewStatus:r,resourceRiskTier:o,effectiveRiskTier:i,requires:s,dependencies:c,version:t.version,checksum:t.checksum,sizeBytes:t.sizeBytes,downloadUrl:t.downloadUrl,manifest:t.manifest,minClientVersion:typeof t.minClientVersion=="string"&&t.minClientVersion.trim()?t.minClientVersion.trim():void 0,signature:typeof t.signature=="string"&&t.signature.trim()?t.signature:null,signingKeyId:typeof t.signingKeyId=="string"&&t.signingKeyId.trim()?t.signingKeyId:null}}le();var ZP={enabled:!0},hpe=new Set(["R2","R3"]);function JH(t,e=ZP){return hpe.has(t.effectiveRiskTier)?{mode:"high-risk-ask",requiresInstallConsent:!0,requiresHighRiskConsent:!0,reason:`effectiveRiskTier=${t.effectiveRiskTier} \u9AD8\u5371,\u5FC5\u987B\u9AD8\u5371\u95EE\u4EBA`}:e.enabled?t.effectiveRiskTier==="R0"?{mode:"silent",requiresInstallConsent:!1,requiresHighRiskConsent:!1,reason:"R0 \u4F4E\u98CE\u9669 inert,\u81EA\u6CBB\u9759\u9ED8\u83B7\u53D6"}:{mode:"ask",requiresInstallConsent:!0,requiresHighRiskConsent:!1,reason:"R1 \u4F4E\u98CE\u9669\u4F46\u975E\u96F6,\u95EE\u4EBA\u4E00\u6B21"}:{mode:"ask",requiresInstallConsent:!0,requiresHighRiskConsent:!1,reason:"\u81EA\u6CBB\u9884\u7B97\u5173\u95ED,\u56DE\u9000\u663E\u5F0F\u540C\u610F"}}import{createPublicKey as ype,verify as vpe}from"node:crypto";function bpe(t){return`id=${t.id}
729
729
  version=${t.version}
730
730
  checksum=${t.checksum}
731
731
  sizeBytes=${t.sizeBytes}`}function kpe(t){return t.includes("\\n")?t.replace(/\\n/g,`
@@ -1117,7 +1117,7 @@ FEEDBACK: <\u82E5 FAIL,\u7528\u4E00\u53E5\u8BDD\u6307\u51FA\u7F3A\u4E86\u4EC0\u4
1117
1117
  `),this.sendNotification("workflow.triggerDropped",{workflowId:p,triggerType:m,...f,...tt(c)})}}),this.workflowRoots.set(e,c),pr.resolve(this.getActiveProjectRoot())===e&&u2(c.controller),c.scheduler.start().catch(p=>{process.stderr.write(`[workflow:scheduler] start failed for ${r}: ${p instanceof Error?p.message:String(p)}
1118
1118
  `)});let d=LC(r);if(d.length>0){for(let p of d)this.sendNotification("workflow.alert",{workflowId:p.workflowId,kind:"suspension-lost-on-restart",suspensionKind:p.kind,nodeId:p.nodeId,prompt:p.prompt,...tt(c)}),c.audit.append({ts:new Date().toISOString(),actor:"system",action:"suspensionLostOnRestart",workflowId:p.workflowId,detail:{kind:p.kind,nodeId:p.nodeId,requestedAt:p.requestedAt}});UC(r,[])}return c}function qy(){let t=new Map,e=zu.call(this,qu.call(this,{}));t.set(pr.resolve(e.cwd),e);for(let n of fe()){if(n.type!=="automation")continue;let r=zu.call(this,{cwd:n.workspaceDir,projectId:n.id});t.set(pr.resolve(r.cwd),r)}return[...t.values()]}function Cr(t,e,n,r){t.audit.append({ts:new Date().toISOString(),actor:dt(),action:e,workflowId:n,...r?{detail:r}:{}})}function tt(t){return t.projectId?{projectId:t.projectId}:{}}function Se(t){return t.params??{}}function ne(t,e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:e})}function qe(t,e){try{return zu.call(this,qu.call(this,e))}catch(n){ne.call(this,t,Rt(n));return}}function Kn(t,e){return{id:t.id,name:t.name,...t.owner?{owner:t.owner}:{},active:t.active,concurrency:t.concurrency,rev:t.rev,createdAt:t.createdAt,updatedAt:t.updatedAt,...t.trigger!==void 0?{trigger:t.trigger}:{},...t.permissionScope!==void 0?{permissionScope:t.permissionScope}:{},...e?.projectId?{projectId:e.projectId}:{},status:t.archived?"archived":t.active?"active":t.publishedDef?"paused":"draft",...t.publishedRev!==void 0?{publishedRev:t.publishedRev}:{},draftAhead:t.publishedRev!==void 0?t.rev>t.publishedRev:t.publishedDef==null,def:t.def}}function io(t,e,n){this.sendNotification(t,{workflow:Kn(e,n),...tt(n)})}var _Re=3,OC=new Map,aa=new Set,ol=new Map,Bu=new Map;function jC(t,e){let n=Bu.get(t);n?.delete(e),n&&n.size===0&&Bu.delete(t)}function M6(t){return pr.join(Pr(t),"pending-suspensions.json")}function LC(t){try{let e=JSON.parse(sl.readFileSync(M6(t),"utf8"));return Array.isArray(e)?e:[]}catch{return[]}}function UC(t,e){try{let n=M6(t);sl.mkdirSync(pr.dirname(n),{recursive:!0}),sl.writeFileSync(n,JSON.stringify(e,null,2),"utf8")}catch(n){process.stderr.write(`[workflow:suspension] WRITE FAILED: ${n instanceof Error?n.message:String(n)}
1119
1119
  `)}}function C6(t,e){UC(t,[...LC(t),e])}function E6(t,e){UC(t,LC(t).filter(n=>n.approvalId!==e))}async function D6(t){t.id!==void 0&&this.sendResponse(t.id,{approvals:[...ol.values()].map(e=>e.meta)})}async function $6(t){let e=Se(t);if(typeof e.approvalId!="string"||typeof e.approved!="boolean")return ne.call(this,t,"workflow.approve requires `approvalId` and boolean `approved`");let n=ol.get(e.approvalId);if(!n)return ne.call(this,t,`approval "${e.approvalId}" not found (\u5DF2\u51B3\u5B9A/\u8D85\u65F6/\u91CD\u542F\u4E22\u5931)`);n.resolve(e.approved,typeof e.note=="string"&&e.note?e.note:void 0),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}async function N6(t){let e=Se(t);if(!e.workflowId||typeof e.values!="object"||e.values===null)return ne.call(this,t,"workflow.onForm requires `workflowId` and `values` object");let n=qe.call(this,t,e);if(!n)return;let r=String(e.workflowId),o=await n.controller.get(r);if(o.trigger?.type!=="form")return ne.call(this,t,`workflow "${r}" has no form trigger`);let i=e.values;for(let a of o.trigger.fields)if(a.required&&(i[a.key]===void 0||i[a.key]===""))return ne.call(this,t,`\u8868\u5355\u7F3A\u5C11\u5FC5\u586B\u9879\u300C${a.label??a.key}\u300D`);this.sendNotification("workflow.runStarted",{workflowId:r,triggerType:"form",...tt(n)});let s;try{s=await n.controller.run(r,{type:"form",payload:{type:"form",...i}}),al.call(this,n,s,"form")}catch(a){throw this.sendNotification("workflow.runFailed",{workflowId:r,triggerType:"form",error:Rt(a),...tt(n)}),a}t.id!==void 0&&this.sendResponse(t.id,s)}function al(t,e,n){if(e.status==="failed"||e.status==="canceled"){if(this.sendNotification("workflow.runFailed",{workflowId:e.workflowId,triggerType:n,error:e.status==="canceled"?"Workflow run canceled":"Workflow run failed",outcome:e,...tt(t)}),e.status==="failed"){let r=(OC.get(e.workflowId)??0)+1;OC.set(e.workflowId,r),r>=_Re&&(process.stderr.write(`[workflow:alert] "${e.workflowId}" failed ${r} consecutive runs
1120
- `),this.sendNotification("workflow.alert",{workflowId:e.workflowId,kind:"consecutive-failures",count:r,triggerType:n,...tt(t)}))}return}OC.delete(e.workflowId),this.sendNotification("workflow.runCompleted",{workflowId:e.workflowId,status:e.status,triggerType:n,outcome:e,...tt(t)})}function Rt(t){return t instanceof Error?t.message:String(t)}async function O6(t){let e=Se(t);if(!e.def)return ne.call(this,t,"workflow.create requires `def`");let n=qe.call(this,t,e);if(!n)return;let r=String(e.id??`wf_${ca().slice(0,8)}`),o=await n.controller.create({id:r,name:String(e.name??r),owner:dt(),def:e.def,concurrency:e.concurrency,active:e.active===!0});o.active&&await n.scheduler.refresh(o.id),Cr(n,"created",o.id,{name:o.name}),io.call(this,"workflow.created",o,n),t.id!==void 0&&this.sendResponse(t.id,Kn(o,n))}async function j6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.get requires `id`");let n=qe.call(this,t,e);if(!n)return;let r=await n.controller.get(String(e.id)),o=Kn(r,n);e.includePublished===!0&&r.publishedDef&&(o.publishedDef=r.publishedDef),t.id!==void 0&&this.sendResponse(t.id,o)}async function L6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.describe requires `id`");let n=qe.call(this,t,e);if(!n)return;let r=await n.controller.describe(String(e.id));t.id!==void 0&&this.sendResponse(t.id,{rendered:r})}async function U6(t){let e=Se(t);if(!e.id||!e.patch)return ne.call(this,t,"workflow.patch requires `id` and `patch`");let n=qe.call(this,t,e);if(!n)return;let r={patch:e.patch,baseRev:e.baseRev,scope:e.scope},o=await n.controller.patch(String(e.id),r);await n.scheduler.refresh(String(e.id)),o.ok&&(Cr(n,"patched",String(e.id),{ops:(r.patch??[]).map(i=>i.op)}),io.call(this,"workflow.updated",await n.controller.get(String(e.id)),n)),t.id!==void 0&&this.sendResponse(t.id,o)}async function F6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.run requires `id`");let n=qe.call(this,t,e);if(!n)return;let r=e.trigger??{type:"manual"},o=String(e.id);this.sendNotification("workflow.runStarted",{workflowId:o,triggerType:r.type,...tt(n)});let i;try{i=await n.controller.run(o,r,{reuseCache:e.reuseCache===!0}),al.call(this,n,i,r.type)}catch(s){throw this.sendNotification("workflow.runFailed",{workflowId:o,triggerType:r.type,error:Rt(s),...tt(n)}),s}t.id!==void 0&&this.sendResponse(t.id,i)}async function H6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.update requires `id`");if(e.name===void 0&&e.def===void 0&&e.concurrency===void 0)return ne.call(this,t,"workflow.update requires at least one of `name`/`def`/`concurrency`");let n=qe.call(this,t,e);if(!n)return;let r=await n.controller.update(String(e.id),{...e.name!==void 0?{name:String(e.name)}:{},...e.def!==void 0?{def:e.def}:{},...e.concurrency!==void 0?{concurrency:e.concurrency}:{}});await n.scheduler.refresh(r.id),Cr(n,"updated",r.id,{fields:["name","def","concurrency"].filter(o=>e[o]!==void 0)}),io.call(this,"workflow.updated",r,n),t.id!==void 0&&this.sendResponse(t.id,Kn(r,n))}async function z6(t){let e=Se(t);if(!e.id||typeof e.active!="boolean")return ne.call(this,t,"workflow.setActive requires `id` and boolean `active`");let n=qe.call(this,t,e);if(!n)return;let r;try{r=await n.controller.setActive(String(e.id),e.active)}catch(o){return ne.call(this,t,Rt(o))}await n.scheduler.refresh(r.id),Cr(n,e.active?"activated":"deactivated",r.id),io.call(this,"workflow.updated",r,n),t.id!==void 0&&this.sendResponse(t.id,Kn(r,n))}async function B6(t){let e=Se(t);if(e.projectId){let o=qe.call(this,t,e);if(!o)return;let i=await o.store.list();t.id!==void 0&&this.sendResponse(t.id,{workflows:i.map(s=>Kn(s,o))});return}let n=qy.call(this),r=[];for(let o of n){let i=await o.store.list();r.push(...i.map(s=>Kn(s,o)))}t.id!==void 0&&this.sendResponse(t.id,{workflows:r})}async function q6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.delete requires `id`");let n=qe.call(this,t,e);n&&(await n.controller.delete(String(e.id)),await n.scheduler.refresh(String(e.id)),Cr(n,"deleted",String(e.id)),this.sendNotification("workflow.deleted",{workflowId:String(e.id),...tt(n)}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0}))}async function W6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.cancelRun requires `id`");let n=qe.call(this,t,e);if(!n)return;let r;try{r=await n.controller.cancelRun(String(e.id),{...typeof e.runId=="string"&&e.runId?{runId:e.runId}:{},reason:typeof e.reason=="string"&&e.reason?e.reason:"\u7528\u6237\u505C\u6B62\u4E86\u8FD0\u884C"})}catch(o){return ne.call(this,t,Rt(o))}al.call(this,n,r,"manual"),t.id!==void 0&&this.sendResponse(t.id,r)}async function G6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.dryRun requires `id`");let n=qe.call(this,t,e);if(!n)return;let r=String(e.id);this.sendNotification("workflow.runStarted",{workflowId:r,triggerType:"manual",...tt(n)});let o;try{o=await n.controller.run(r,{type:"manual",payload:e.payload},{recordHistory:!1}),al.call(this,n,o,"manual")}catch(i){return this.sendNotification("workflow.runFailed",{workflowId:r,triggerType:"manual",error:Rt(i),...tt(n)}),ne.call(this,t,Rt(i))}t.id!==void 0&&this.sendResponse(t.id,{...o,dryRun:!0})}async function K6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.metrics requires `id`");let n=qe.call(this,t,e);if(!n)return;let r=await n.runHistory.list(String(e.id)),o=r.filter(d=>d.status!=="running"),i=o.filter(d=>d.status==="completed"),s=o.filter(d=>d.status==="failed"),a=o.map(d=>d.durationMs).filter(d=>typeof d=="number"),c=0;for(let d of o)if(d.status==="failed")c++;else break;let l={};for(let d of o)l[d.triggerType]=(l[d.triggerType]??0)+1;t.id!==void 0&&this.sendResponse(t.id,{metrics:{totalRuns:o.length,completed:i.length,failed:s.length,canceled:o.filter(d=>d.status==="canceled").length,successRate:o.length>0?i.length/o.length:null,avgDurationMs:a.length>0?Math.round(a.reduce((d,p)=>d+p,0)/a.length):null,lastRunAt:o[0]?.startedAt??null,consecutiveFailures:c,byTrigger:l,windowSize:r.length}})}async function V6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.publish requires `id`");let n=qe.call(this,t,e);if(!n)return;let r;try{r=await n.controller.publish(String(e.id))}catch(o){return ne.call(this,t,Rt(o))}Cr(n,"published",r.id,{rev:r.publishedRev}),io.call(this,"workflow.updated",r,n),t.id!==void 0&&this.sendResponse(t.id,Kn(r,n))}async function J6(t){let e=Se(t);if(!e.id||typeof e.archived!="boolean")return ne.call(this,t,"workflow.archive requires `id` and boolean `archived`");let n=qe.call(this,t,e);if(!n)return;let r=await n.controller.archive(String(e.id),e.archived);await n.scheduler.refresh(r.id),Cr(n,e.archived?"archived":"unarchived",r.id),io.call(this,"workflow.updated",r,n),t.id!==void 0&&this.sendResponse(t.id,Kn(r,n))}async function Z6(t){let e=new Ko().list();t.id!==void 0&&this.sendResponse(t.id,{credentials:e})}async function X6(t){let e=Se(t);if(!e.type||!e.label||typeof e.data!="object"||e.data===null)return ne.call(this,t,"credential.create requires `type`, `label`, and `data` object");try{let n=new Ko().create({type:e.type,label:String(e.label),data:e.data,meta:e.meta??void 0});t.id!==void 0&&this.sendResponse(t.id,n)}catch(n){return ne.call(this,t,Rt(n))}}async function Y6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"credential.delete requires `id`");let n=new Ko().delete(String(e.id));t.id!==void 0&&this.sendResponse(t.id,{ok:n})}var il=new Map;async function Q6(t){let e=Se(t);for(let n of["label","authUrl","tokenUrl","clientId","redirectUri"])if(typeof e[n]!="string"||!e[n])return ne.call(this,t,`credential.oauthStart requires \`${n}\``);try{let n=new Ko,r=typeof e.scopes=="string"?e.scopes:"",o=n.create({type:"oauth2",label:String(e.label),data:{tokenUrl:String(e.tokenUrl),clientId:String(e.clientId),...typeof e.clientSecret=="string"&&e.clientSecret?{clientSecret:e.clientSecret}:{},...r?{scopes:r}:{}},meta:{...r?{scopes:r}:{},pending:!0}}),i=ca(),s=Date.now();for(let[c,l]of il)l.expiresAt<s&&il.delete(c);il.set(i,{credentialId:o.id,tokenUrl:String(e.tokenUrl),clientId:String(e.clientId),...typeof e.clientSecret=="string"&&e.clientSecret?{clientSecret:e.clientSecret}:{},redirectUri:String(e.redirectUri),expiresAt:s+10*6e4});let a=new URL(String(e.authUrl));a.searchParams.set("response_type","code"),a.searchParams.set("client_id",String(e.clientId)),a.searchParams.set("redirect_uri",String(e.redirectUri)),a.searchParams.set("state",i),r&&a.searchParams.set("scope",r),t.id!==void 0&&this.sendResponse(t.id,{credentialId:o.id,authorizeUrl:a.toString(),state:i})}catch(n){return ne.call(this,t,Rt(n))}}async function eK(t){let e=Se(t);if(typeof e.state!="string"||typeof e.code!="string"||!e.state||!e.code)return ne.call(this,t,"credential.oauthComplete requires `state` and `code`");let n=il.get(e.state);if(!n||n.expiresAt<Date.now())return il.delete(e.state),ne.call(this,t,"OAuth state unknown or expired \u2014 restart the authorization");il.delete(e.state);try{let r=new URLSearchParams({grant_type:"authorization_code",code:e.code,redirect_uri:n.redirectUri,client_id:n.clientId,...n.clientSecret?{client_secret:n.clientSecret}:{}}),o=await fetch(n.tokenUrl,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded",Accept:"application/json"},body:r.toString()}),i=await o.text();if(!o.ok)throw new Error(`token exchange failed (${o.status}): ${i.slice(0,200)}`);let s=JSON.parse(i);if(!s.access_token)throw new Error(`token endpoint returned no access_token: ${i.slice(0,200)}`);let a=new Ko,{data:c}=a.get(n.credentialId);a.updateData(n.credentialId,{...c,accessToken:s.access_token,...s.refresh_token?{refreshToken:s.refresh_token}:{},...s.expires_in?{expiresAt:new Date(Date.now()+s.expires_in*1e3).toISOString()}:{}},{pending:void 0}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,credentialId:n.credentialId})}catch(r){return ne.call(this,t,Rt(r))}}async function tK(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.setPermissionScope requires `id`");if(e.allowUnattendedKinds!==null&&!Array.isArray(e.allowUnattendedKinds))return ne.call(this,t,"workflow.setPermissionScope requires `allowUnattendedKinds` array (or null to revoke)");let n=qe.call(this,t,e);if(!n)return;let r=e.allowUnattendedKinds===null?null:{allowUnattendedKinds:e.allowUnattendedKinds.filter(i=>typeof i=="string"),grantedAt:new Date().toISOString()},o=await n.controller.update(String(e.id),{permissionScope:r});Cr(n,r?"permissionGranted":"permissionRevoked",o.id,r?{kinds:r.allowUnattendedKinds}:void 0),io.call(this,"workflow.updated",o,n),t.id!==void 0&&this.sendResponse(t.id,Kn(o,n))}async function nK(t){let e=Se(t),n;try{n=qu.call(this,e).cwd}catch(o){return ne.call(this,t,Rt(o))}let r=jy({getToolManifest:()=>this.toolCatalog.getToolManifest(),listAgentIds:()=>[{id:"qlogicagent",name:"\u5C0F\u667A(\u9ED8\u8BA4)"},...this.acpDetector.list().filter(o=>o.status==="available"&&o.id!=="qlogicagent").map(o=>({id:o.id,name:o.name}))],projectRoot:n});t.id!==void 0&&this.sendResponse(t.id,{capabilities:r})}async function rK(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.export requires `id`");let n=qe.call(this,t,e);if(!n)return;let r=await n.controller.get(String(e.id)),o=_C(r);t.id!==void 0&&this.sendResponse(t.id,{bundle:o})}async function oK(t){let e=Se(t);if(!e.payload)return ne.call(this,t,"workflow.import requires `payload`");let n=qe.call(this,t,e);if(!n)return;let r=typeof e.targetWorkflowId=="string"&&e.targetWorkflowId?e.targetWorkflowId:void 0,o=r??String(e.id??`wf_${ca().slice(0,8)}`),i,s;try{if(e.format==="n8n")if(r){let a=oy(e.payload,o,{strictTemplates:!0});s=a.report,i=await n.controller.update(o,{name:String(e.name??a.name),def:a.def})}else{let a=await n.controller.importN8n(o,e.payload,{owner:dt()});i=a.record,s=a.report,e.name&&(i=await n.controller.update(o,{name:String(e.name)}))}else{let a=g6(e.payload);if(r?i=await n.controller.update(o,{name:String(e.name??a.name),def:{...a.def,id:o},...a.concurrency?{concurrency:a.concurrency}:{}}):i=await n.controller.create({id:o,name:String(e.name??a.name),owner:dt(),def:{...a.def,id:o},concurrency:a.concurrency}),a.trigger){let c=await n.controller.patch(o,{patch:[{op:"set_trigger",trigger:a.trigger}]});if(!c.ok)throw new Error(`trigger rejected: ${JSON.stringify("errors"in c?c.errors:c)}`);i=await n.controller.get(o)}}}catch(a){return ne.call(this,t,`workflow.import: ${Rt(a)}`)}Cr(n,"imported",i.id,{format:e.format==="n8n"?"n8n":"bundle",...s?{conversion:s.status}:{}}),io.call(this,r?"workflow.updated":"workflow.created",i,n),t.id!==void 0&&this.sendResponse(t.id,{...Kn(i,n),...s?{conversionReport:s}:{}})}async function iK(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.duplicate requires `id`");let n=qe.call(this,t,e);if(!n)return;let r;try{r=e.targetProjectId?zu.call(this,qu.call(this,{projectId:e.targetProjectId})):n}catch(c){return ne.call(this,t,Rt(c))}let o=await n.controller.get(String(e.id)),i=_C(o),s=`wf_${ca().slice(0,8)}`,a=await r.controller.create({id:s,name:String(e.name??`${o.name} \u526F\u672C`),owner:dt(),def:{...i.def,id:s},concurrency:o.concurrency});if(i.trigger){let c=await r.controller.patch(s,{patch:[{op:"set_trigger",trigger:i.trigger}]});if(!c.ok)throw new Error(`workflow.duplicate: trigger rejected: ${JSON.stringify("errors"in c?c.errors:c)}`);a=await r.controller.get(s)}Cr(r,"duplicated",s,{sourceWorkflowId:String(e.id)}),io.call(this,"workflow.created",a,r),t.id!==void 0&&this.sendResponse(t.id,Kn(a,r))}async function sK(t){let e=Se(t);if(!e.channel||typeof e.text!="string")return ne.call(this,t,"workflow.onImMessage requires `channel` and string `text`");let n=qy.call(this),r=[],o=[];for(let i of n)try{r.push(...await i.scheduler.onImMessage(String(e.channel),e.text,e.payload))}catch(s){o.push({...tt(i),error:Rt(s)})}t.id!==void 0&&this.sendResponse(t.id,{outcomes:r,...o.length>0?{errors:o}:{}})}async function aK(t){let e=Se(t);if(!e.path)return ne.call(this,t,"workflow.onWebhook requires `path`");let n=String(e.path).startsWith("/")?String(e.path):`/${String(e.path)}`,r=e.payload??{},o=Bu.get(n),i=o?o.size:0;if(o)for(let l of[...o.values()])l(r);let s=qy.call(this),a=[],c=[];for(let l of s)try{a.push(...await l.scheduler.onWebhook(n,e.payload))}catch(d){c.push({...tt(l),error:Rt(d)})}t.id!==void 0&&this.sendResponse(t.id,{outcomes:a,...c.length>0?{errors:c}:{},...i>0?{wokenWaits:i}:{}})}async function cK(t){let e=Se(t);if(!e.workflowId||typeof e.text!="string")return ne.call(this,t,"workflow.onIntent requires `workflowId` and string `text`");let n=qe.call(this,t,e);if(!n)return;let r=String(e.workflowId),o=await n.controller.get(r);if(!o.active||o.trigger?.type!=="intent")return ne.call(this,t,`workflow "${r}" has no active intent trigger (active=${o.active}, trigger=${o.trigger?.type??"none"})`);let i={type:"intent",text:e.text,...typeof e.surface=="string"?{surface:e.surface}:{},...typeof e.matchedPhrase=="string"?{matchedPhrase:e.matchedPhrase}:{}};this.sendNotification("workflow.runStarted",{workflowId:r,triggerType:"intent",...tt(n)});let s;try{s=await n.controller.run(r,{type:"intent",payload:i}),al.call(this,n,s,"intent")}catch(a){throw this.sendNotification("workflow.runFailed",{workflowId:r,triggerType:"intent",error:Rt(a),...tt(n)}),a}t.id!==void 0&&this.sendResponse(t.id,s)}async function CRe(){let t=qy.call(this),e=[];for(let n of t)for(let r of await n.store.listActive())r.trigger?.type==="intent"&&e.push({workflowId:r.id,projectId:n.projectId,name:r.name,trigger:r.trigger});return e}async function lK(t){let e=await CRe.call(this);t.id!==void 0&&this.sendResponse(t.id,{intents:e})}async function dK(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.revisions requires `id`");let n=qe.call(this,t,e);if(!n)return;let r=await n.store.listRevisions(String(e.id));t.id!==void 0&&this.sendResponse(t.id,{revisions:r})}async function uK(t){let e=Se(t);if(!e.id||typeof e.rev!="number")return ne.call(this,t,"workflow.revert requires `id` and numeric `rev`");let n=qe.call(this,t,e);if(!n)return;let r=await n.controller.revertTo(String(e.id),e.rev);await n.scheduler.refresh(r.id),Cr(n,"reverted",r.id,{toRev:e.rev}),io.call(this,"workflow.updated",r,n),t.id!==void 0&&this.sendResponse(t.id,Kn(r,n))}async function pK(t){let e=Se(t),n=qe.call(this,t,e);if(!n)return;let r=typeof e.limit=="number"&&e.limit>0?Math.min(e.limit,500):100,o=n.audit.list(e.id?String(e.id):void 0,r);t.id!==void 0&&this.sendResponse(t.id,{entries:o})}async function mK(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.runs requires `id`");let n=qe.call(this,t,e);if(!n)return;let r=await n.runHistory.list(String(e.id));t.id!==void 0&&this.sendResponse(t.id,{runs:r})}async function fK(t){let e=Se(t);if(!e.id||!e.runId)return ne.call(this,t,"workflow.runDetail requires `id` and `runId`");let n=qe.call(this,t,e);if(!n)return;let r=await n.runHistory.get(String(e.id),String(e.runId));if(!r)return ne.call(this,t,`run "${String(e.runId)}" not found for workflow "${String(e.id)}"`);t.id!==void 0&&this.sendResponse(t.id,{run:r})}He();le();an();import*as ze from"node:fs";import*as Tt from"node:path";import{execFileSync as LRe}from"node:child_process";He();Ke();import*as ao from"node:fs";import*as HC from"node:path";import{randomUUID as MRe}from"node:crypto";le();import*as tn from"node:fs";import*as so from"node:path";import{fileURLToPath as ERe}from"node:url";function Wu(t){let e=_n(t),n=so.dirname(e);tn.existsSync(n)||tn.mkdirSync(n,{recursive:!0}),FC(ak(),e),FC(so.join(gK(),"INSTRUCTIONS.md"),e);let r=bo(t);hK(ck(),r),hK(so.join(gK(),"rules"),r)}function gK(){return so.join(so.dirname(ERe(import.meta.url)),"default-project-knowledge")}function FC(t,e){if(!(!tn.existsSync(t)||tn.existsSync(e)))try{tn.mkdirSync(so.dirname(e),{recursive:!0}),tn.copyFileSync(t,e)}catch{}}function hK(t,e){if(tn.existsSync(t))try{tn.mkdirSync(e,{recursive:!0});for(let n of tn.readdirSync(t)){if(!n.endsWith(".md"))continue;let r=so.join(t,n),o=so.join(e,n);tn.statSync(r).isFile()&&FC(r,o)}}catch{}}function DRe(t){return t==="solo"||t==="product"||t==="automation"}var $Re=["creating","running","completed","failed","cancelled"];function vK(t){return typeof t=="string"&&$Re.includes(t)}async function bK(t,e){let n=ee(),r=typeof e.workspaceDir=="string"&&e.workspaceDir.trim().length>0,o=r?e.workspaceDir.trim():HC.join(n.getUserAgentHome(),"workspaces",e.name);if(e.groupId){let p=pD(e.groupId);if(p)return yK(p.workspaceDir),Wu(p.workspaceDir),{project:p,isAgentTeamProject:p.type==="solo"||p.type==="product",autoSwitched:!1,deduplicated:!0}}let s=fe().find(p=>p.name===e.name);r?NRe(o):yK(o);let a=DRe(e.type),c=aD({name:e.name,workspaceDir:o,type:e.type??"personal",groupId:e.groupId,skipAutoSwitch:a}),l=c.type==="solo"||c.type==="product";a||(ko(c.id),t.setActiveWorkdir(c.workspaceDir)),Wu(c.workspaceDir);let d=t.projectMemoryStoreFactory.create(c.workspaceDir);return d.ensureInitialized(),a||(t.memdir=d,t.mediaPersistence.setProjectDir(c.workspaceDir)),jRe(c),await ORe(c),{project:c,nameDuplicate:s,isAgentTeamProject:l,autoSwitched:!a}}function yK(t){ao.existsSync(t)||ao.mkdirSync(t,{recursive:!0})}function NRe(t){if(!ao.existsSync(t))throw new Error(`Workspace directory does not exist: ${t}`);if(!ao.statSync(t).isDirectory())throw new Error(`Workspace path is not a directory: ${t}`)}async function ORe(t){if(t.type!=="automation")return;let e=`wf_${MRe().slice(0,8)}`,n=new Date().toISOString();await new dr(t.workspaceDir).save({id:e,name:t.name,def:{id:e,nodes:[],edges:[]},active:!1,concurrency:"queue",rev:1,createdAt:n,updatedAt:n}),ir(t.id,{primaryWorkflowId:e}),t.primaryWorkflowId=e}function jRe(t){let e=ee();if(t.type!=="solo"&&t.type!=="product")return;let n=HC.join(e.getProjectAgentDir(t.workspaceDir),t.type==="solo"?"solo-state.json":"product-state.json");if(ao.existsSync(n))return;let r=t.type==="solo"?{agents:[],status:"idle",createdAt:new Date().toISOString()}:{tasks:[],instances:[],status:"idle",createdAt:new Date().toISOString()};ao.writeFileSync(n,JSON.stringify(r,null,2))}async function kK(t){let e=t.params;if(!e?.name){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: name"});return}let n;try{n=await bK(this,{name:e.name,workspaceDir:e.workspaceDir,type:e.type,groupId:e.groupId})}catch(a){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:a instanceof Error?a.message:`Cannot create workspace directory: ${e.workspaceDir??e.name}`});return}let{project:r,nameDuplicate:o,autoSwitched:i,deduplicated:s}=n;if(s){t.id!==void 0&&this.sendResponse(t.id,{ok:!0,project:r,deduplicated:!0});return}if(this.sendNotification("project.created",{id:r.id,name:r.name,workspaceDir:r.workspaceDir,type:r.type}),i&&this.sendNotification("project.switched",{id:r.id,name:r.name,workspaceDir:r.workspaceDir}),t.id!==void 0){let a={ok:!0,project:r};o&&(a.warning=`A project named "${o.name}" already exists at ${o.workspaceDir}. Consider renaming one of them to avoid ambiguity.`),this.sendResponse(t.id,a)}}function wK(t){let e=fe();t.id!==void 0&&this.sendResponse(t.id,{projects:e})}function SK(t){let e=t.params,n=e?.projectId?.trim(),r=e?.query?.trim();if(!n&&!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: projectId or query"});return}let o=URe(n??r);if(!o){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,error:`Project not found: ${n??r}`});return}let i=ko(o.id);if(!i){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,error:`Project not found: ${n??r}`});return}this.setActiveWorkdir(i.workspaceDir);let s=this.projectMemoryStoreFactory.create(i.workspaceDir);s.ensureInitialized(),this.memdir=s,this.mediaPersistence.setProjectDir(i.workspaceDir),this.sendNotification("project.switched",{id:i.id,name:i.name,workspaceDir:i.workspaceDir}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,project:i,projectId:i.id,name:i.name,workspaceDir:i.workspaceDir})}function URe(t){let e=re(t);if(e?.status==="active")return e;let n=fe(),r=Number.parseInt(t,10);if(String(r)===t&&r>=1&&r<=n.length)return n[r-1]??null;let o=t.toLowerCase();return n.find(i=>i.id===t)??n.find(i=>i.name.toLowerCase()===o)??n.find(i=>i.name.toLowerCase().includes(o))??null}function FRe(t){let e=Tt.join(t,".worktrees");if(!ze.existsSync(Tt.join(t,".git"))||!ze.existsSync(e))return;let n=o=>{try{LRe("git",o,{cwd:t,stdio:"ignore",windowsHide:!0})}catch{}},r=[];try{r=ze.readdirSync(e,{withFileTypes:!0})}catch{return}for(let o of r)o.isDirectory()&&n(["worktree","remove","--force",Tt.join(e,o.name)]);n(["worktree","prune"])}function xK(t,e={}){if(e.requireManaged){let r=Tt.resolve(Tt.join(_e(),"workspaces"))+Tt.sep;if(!t.startsWith(r))return{deleted:!1,skipped:"external",error:"Project directory is outside the managed workspace root and was not deleted automatically."}}try{e.releaseDir?.(t)}catch{}FRe(t);let n;for(let r=0;r<3;r++){if(!ze.existsSync(t))return{deleted:!0};try{if(RK(t),!ze.existsSync(t))return{deleted:!0};n="Directory still present after removal (likely held by another process)."}catch(o){n=o?.message??String(o)}if(r<2){let o=Date.now();for(;Date.now()-o<300;);}}return{deleted:!1,error:n}}function RK(t){let e;try{e=ze.lstatSync(t)}catch{return}if(e.isDirectory()&&!e.isSymbolicLink()){for(let n of ze.readdirSync(t))RK(Tt.join(t,n));try{ze.rmdirSync(t)}catch{try{ze.chmodSync(t,448),ze.rmdirSync(t)}catch{}}}else try{ze.unlinkSync(t)}catch{try{ze.chmodSync(t,448),ze.unlinkSync(t)}catch{}}}function TK(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: projectId"});return}let n=re(e.projectId);if(!n){this.sendNotification("project.deleted",{id:e.projectId}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,alreadyAbsent:!0});return}if(n.type==="default"){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Cannot delete the default project"});return}let r=yk(e.projectId);if(!r.deleted){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:"Cannot delete project"});return}let o=!1,i;if(n?.workspaceDir){let s=xK(Tt.resolve(n.workspaceDir),{requireManaged:!0,releaseDir:a=>this.mediaPersistence?.releaseProjectDir?.(a)});o=s.deleted,i=s.error}try{ze.rmSync(or(e.projectId),{recursive:!0,force:!0})}catch(s){console.error(`[project.delete] projectData cleanup failed for ${e.projectId}:`,s instanceof Error?s.message:s)}this.sendNotification("project.deleted",{id:e.projectId}),r.switchedTo&&(this.setActiveWorkdir(r.switchedTo.workspaceDir),this.sendNotification("project.switched",{id:r.switchedTo.id,name:r.switchedTo.name,workspaceDir:r.switchedTo.workspaceDir})),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,switchedTo:r.switchedTo,dirDeleted:o,dirDeleteError:i})}function AK(t){let e=fe(),n=Tt.join(_e(),"workspaces"),r=Tt.resolve(n)+Tt.sep,o=0,i=[];for(let a of e)if(a.type!=="default"){if(yk(a.id),o++,a.workspaceDir){let c=xK(Tt.resolve(a.workspaceDir),{releaseDir:l=>this.mediaPersistence?.releaseProjectDir?.(l)});c.error&&i.push(`${a.name}: ${c.error}`)}this.sendNotification("project.deleted",{id:a.id})}if(ze.existsSync(n)){let a=fe().find(d=>d.type==="default"),c=new Set;a?.workspaceDir&&c.add(Tt.resolve(a.workspaceDir));let l=d=>{try{let p=ze.readdirSync(d,{withFileTypes:!0});for(let m of p){if(!m.isDirectory())continue;let f=Tt.join(d,m.name);if(!c.has(Tt.resolve(f))){if(m.name==="groups"){l(f);try{ze.readdirSync(f).length===0&&ze.rmdirSync(f)}catch{}continue}try{ze.rmSync(f,{recursive:!0,force:!0})}catch(g){i.push(`orphan:${m.name}: ${g.message??g}`)}}}}catch{}};l(n)}let s=fe().find(a=>a.type==="default");s&&(this.setActiveWorkdir(s.workspaceDir),this.sendNotification("project.switched",{id:s.id,name:s.name,workspaceDir:s.workspaceDir})),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,deletedCount:o,dirErrors:i.length?i:void 0})}function PK(t){let e=t.params;if(!e?.projectId||!e?.newName){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required params: projectId, newName"});return}let n=lD(e.projectId,e.newName);if(!n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:"Cannot rename project (not found, is default, or name already taken)"});return}this.sendNotification("project.renamed",{id:n.id,name:n.name,workspaceDir:n.workspaceDir}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,project:n})}function IK(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: projectId"});return}let n=dD(e.projectId);if(!n.archived){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:"Cannot archive project (not found or is default project)"});return}this.sendNotification("project.archived",{id:e.projectId}),n.switchedTo&&(this.setActiveWorkdir(n.switchedTo.workspaceDir),this.sendNotification("project.switched",{id:n.switchedTo.id,name:n.switchedTo.name,workspaceDir:n.switchedTo.workspaceDir})),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,switchedTo:n.switchedTo})}function _K(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: projectId"});return}let n=uD(e.projectId);if(!n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:"Cannot unarchive project (not found or not archived)"});return}this.sendNotification("project.unarchived",{id:n.id,name:n.name,workspaceDir:n.workspaceDir}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,project:n})}function CK(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"projectId is required"});return}let n={};if("planStatus"in e){if(e.planStatus!==void 0&&!vK(e.planStatus)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:`Invalid planStatus: ${e.planStatus}`});return}n.planStatus=e.planStatus}"planAgents"in e&&(n.planAgents=e.planAgents),"planWinnerId"in e&&(n.planWinnerId=e.planWinnerId),"leaderSessionId"in e&&(n.leaderSessionId=e.leaderSessionId),"primaryWorkflowId"in e&&(n.primaryWorkflowId=e.primaryWorkflowId);let r=ir(e.projectId,n);t.id!==void 0&&this.sendResponse(t.id,{ok:r})}He();import{randomUUID as BC}from"node:crypto";import*as Sn from"node:fs";import*as Vo from"node:path";var Er=class{sessionId;_trustAccepted=!1;_modelUsage=new Map;_totalInputTokens=0;_totalOutputTokens=0;_turnCount=0;_toolCallCount=0;_listeners=new Set;constructor(e){this.sessionId=e}get trustAccepted(){return this._trustAccepted}setTrustAccepted(e){this._trustAccepted=e,this.notifyListeners()}get totalInputTokens(){return this._totalInputTokens}get totalOutputTokens(){return this._totalOutputTokens}get turnCount(){return this._turnCount}get toolCallCount(){return this._toolCallCount}getModelUsage(e){return this._modelUsage.get(e)}getAllModelUsage(){let e={};for(let[n,r]of this._modelUsage)e[n]={...r};return e}addUsage(e,n){this._totalInputTokens+=e.inputTokens,this._totalOutputTokens+=e.outputTokens;let r=this._modelUsage.get(n);r?(r.inputTokens+=e.inputTokens,r.outputTokens+=e.outputTokens,r.cacheRead+=e.cacheRead??0,r.cacheCreation+=e.cacheWrite??0):this._modelUsage.set(n,{inputTokens:e.inputTokens,outputTokens:e.outputTokens,cacheRead:e.cacheRead??0,cacheCreation:e.cacheWrite??0,mediaCalls:0,mediaDurationSeconds:0,mediaCharacters:0}),this.notifyListeners()}addMediaUsage(e,n,r){let o=this._modelUsage.get(e),i=o??{inputTokens:0,outputTokens:0,cacheRead:0,cacheCreation:0,mediaCalls:0,mediaDurationSeconds:0,mediaCharacters:0};switch(o||this._modelUsage.set(e,i),i.mediaCalls+=1,n){case"per_second":i.mediaDurationSeconds+=r;break;case"per_character":i.mediaCharacters+=r;break;case"per_token":i.outputTokens+=r;break}this.notifyListeners()}recordToolCall(){this._toolCallCount++}recordTurnCompleted(){this._turnCount++}createSnapshot(){return{sessionId:this.sessionId,modelUsage:this.getAllModelUsage(),totalInputTokens:this._totalInputTokens,totalOutputTokens:this._totalOutputTokens,turnCount:this._turnCount,lastSavedAt:Date.now()}}restoreFromSnapshot(e){if(e.sessionId!==this.sessionId)return!1;this._totalInputTokens=e.totalInputTokens,this._totalOutputTokens=e.totalOutputTokens,this._turnCount=e.turnCount,this._modelUsage.clear();for(let[n,r]of Object.entries(e.modelUsage))this._modelUsage.set(n,{...r});return this.notifyListeners(),!0}onStateChange(e){return this._listeners.add(e),()=>{this._listeners.delete(e)}}notifyListeners(){for(let e of this._listeners)try{e()}catch{}}};He();Ke();import*as EK from"node:fs";import*as zC from"node:path";var Yi=class{getSessionsRoot(e){let n=re(e);if(!n)throw new Error(`Project not found: ${e}`);return ee().getProjectSessionDataRoot(n.workspaceDir)}getProjectWorkspaceDir(e){let n=re(e);if(!n)throw new Error(`Project not found: ${e}`);return n.workspaceDir}getSessionDir(e,n){return zC.join(this.getSessionsRoot(e),n)}resolveWorkspaceDir(e,n){if(n){let o=re(n);if(o)return o.workspaceDir}let r=fe();for(let o of r){let i=ee().getProjectSessionDataRoot(o.workspaceDir),s=zC.join(i,e);try{if(EK.existsSync(s))return o.workspaceDir}catch{}}return this.getActiveProjectWorkspaceDir()}getActiveProjectWorkspaceDir(){let e=Me();if(e)return e.workspaceDir;let n=fe();if(n.length>0)return n[0].workspaceDir;throw new Error("No active project available")}getActiveProjectId(){let e=Me();if(e)return e.id;let n=fe();if(n.length>0)return n[0].id;throw new Error("No active project available")}getDefaultProjectId(){let e=Ep();if(e)return e.id;throw new Error("No default project available")}};ni();jt();import{randomUUID as MK}from"node:crypto";async function DK(t,e){let n=new Date(t.lastActiveAt).getTime();if(Date.now()-n<$M)return{split:!1,activeSessionId:t.sessionId};let i=MK(),s=new Date().toISOString();await vt(t.sessionId,{sealedAt:s},e);let a=t.taskSummary?`[\u4E0A\u4E00\u8F6E\u5BF9\u8BDD\u6458\u8981] ${t.taskSummary}`:void 0;return await vt(i,{sessionId:i,projectId:t.projectId,type:"group",ownerId:t.ownerId,groupKey:t.groupKey,groupName:t.groupName,groupPlatform:t.groupPlatform,previousSessionId:t.sessionId,carryoverSummary:a},e),{split:!0,activeSessionId:i,sealedSessionId:t.sessionId}}async function $K(t,e){if(t.type!=="group")return{split:!1,activeSessionId:t.sessionId};if(t.turnCount<NM)return{split:!1,activeSessionId:t.sessionId};let n=MK(),r=new Date().toISOString();await vt(t.sessionId,{sealedAt:r},e);let o=t.taskSummary?`[\u4E0A\u4E00\u8F6E\u5BF9\u8BDD\u6458\u8981 \u2014 \u56E0\u6D88\u606F\u6570\u8FBE\u5230\u4E0A\u9650\u81EA\u52A8\u5207\u5206] ${t.taskSummary}`:void 0;return await vt(n,{sessionId:n,projectId:t.projectId,type:"group",ownerId:t.ownerId,groupKey:t.groupKey,groupName:t.groupName,groupPlatform:t.groupPlatform,previousSessionId:t.sessionId,carryoverSummary:o},e),{split:!0,activeSessionId:n,sealedSessionId:t.sessionId}}le();an();import*as Gu from"node:fs";import*as la from"node:path";Ke();var Wy=class{constructor(e=new Yi,n=ee()){this.locator=e;this.pathService=n}locator;pathService;getActiveProjectId(){return this.locator.getActiveProjectId()}getDefaultProjectId(){return this.locator.getDefaultProjectId()}getProjectWorkspaceDir(e){return this.locator.getProjectWorkspaceDir(e)}resolveWorkspaceDir(e,n){return this.locator.resolveWorkspaceDir(e,n)}async listThreads(e,n){let r=n??this.getActiveProjectId(),o=this.getProjectWorkspaceDir(r);return(await cn(e,o)).map(s=>({id:s.sessionId,title:s.title,status:"active",turnCount:s.messageCount,createdAt:s.createdAt,lastActiveAt:s.lastActiveAt}))}getHostSessionWorkspaceDirs(e,n=[]){return BRe([e.getActiveProjectRoot(),...zRe()]).filter(r=>!n.some(o=>NK(o,r)))}async listHostWorkspaceSessions(e,n,r=[]){let o=this.getHostSessionWorkspaceDirs(e,r);return(await Promise.all(o.map(s=>cn(n,s)))).flat()}resolveSessionWorkspaceDir(e,n,r){let o;for(let i of this.getHostSessionWorkspaceDirs(e)){if(hD(n,i))return i;let s=la.join(this.pathService.getProjectSessionDataRoot(i),HRe(n));try{if(!Gu.existsSync(s))continue;o??=i;let a=la.join(s,"transcript.jsonl");if(Gu.existsSync(a)&&Gu.statSync(a).size>0)return i}catch{}}return o||(r?this.resolveWorkspaceDir(n,r):this.resolveWorkspaceDir(n))}};function HRe(t){return t.replace(/[^a-zA-Z0-9_-]/g,"_")}function zRe(){return[]}function NK(t,e){return la.resolve(t).toLowerCase()===la.resolve(e).toLowerCase()}function BRe(t){let e=[];for(let n of t){let r=n?.trim();if(!r)continue;let o=la.resolve(r);e.some(i=>NK(i,o))||e.push(o)}return e}var qRe=new Yi,wn=new Wy(qRe);function mr(t,e="Unknown error"){return t instanceof Error?t.message:e}var WRe=/Uploaded attachment references:|\[标注元素\]|\[标注区域\]|\[附件\]\s*(?:图片|视频|音频|文件)\d/;function GRe(t){for(let e of t)if(e.role==="user"&&typeof e.content=="string"&&WRe.test(e.content))return!0;return!1}function cl(t,e,n){return wn.resolveSessionWorkspaceDir(t,e,n)}function LK(t,e){let n=t.messageCount??0,r=e.messageCount??0;return r!==n?r>n?e:t:e.lastActiveAt!==t.lastActiveAt&&e.lastActiveAt>t.lastActiveAt?e:t}function OK(...t){let e=new Map;for(let n of t)for(let r of n){let o=e.get(r.sessionId);e.set(r.sessionId,o?LK(o,r):r)}return[...e.values()].sort((n,r)=>n.lastActiveAt>r.lastActiveAt?-1:n.lastActiveAt<r.lastActiveAt?1:0)}async function KRe(t){let e=null;for(let n of fe()){if(!n.workspaceDir)continue;let o=(await cn(500,n.workspaceDir)).find(s=>s.sessionId===t);if(!o)continue;let i={entry:o,projectId:o.projectId??n.id,workspaceDir:n.workspaceDir};(!e||LK(e.entry,o)===o)&&(e=i)}return e}async function jK(t,e,n){return wn.listHostWorkspaceSessions(t,e,n)}async function VRe(t){let e=new Set,n=[...new Set(t.map(r=>Vo.resolve(r).toLowerCase()))];return await Promise.all(n.map(async r=>{for(let o of await yD(r))e.add(o)})),e}function UK(t){let e=t.params,n=e?.id??BC();this.log(`[thread.create] id=${n} title=${e?.title??"(none)"}`),e?.cwd&&typeof e.cwd=="string"&&this.setActiveWorkdir(e.cwd),this.currentSessionId=n,this.sessionState=new Er(n),this.memoryPrefetchState=nr(),this.enableIdleDream(),t.id!==void 0&&this.sendResponse(t.id,{id:n,title:e?.title,status:"active",createdAt:new Date().toISOString()})}async function FK(t){let e=t.params,n=e?.limit??20;try{let r=await wn.listThreads(n,e?.projectId);t.id!==void 0&&this.sendResponse(t.id,{threads:r})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to list threads: ${mr(r)}`})}}async function HK(t){let e=t.params,n=e?.sessionId??BC();try{let r=e?.projectId??wn.getActiveProjectId(),o=wn.getProjectWorkspaceDir(r);await vt(n,{sessionId:n,title:e?.title,type:e?.type,ownerPlatform:e?.ownerPlatform,ownerId:e?.ownerId,groupKey:e?.groupKey,groupName:e?.groupName,groupPlatform:e?.groupPlatform,projectId:r},o),t.id!==void 0&&this.sendResponse(t.id,{sessionId:n,title:e?.title})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to create session: ${mr(r)}`})}}async function zK(t){let e=t.params;if(t.id===void 0)return;let n=e?.platform??"desktop",r=e?.chatId,o=e?.chatType,i=e?.userId??"local";try{if(n==="desktop"&&r){let p=e?.projectId??wn.getActiveProjectId(),m=wn.getProjectWorkspaceDir(p),f=await KRe(r);if(f){let g=Kt(r,f.workspaceDir),h=g?.projectId??f.projectId;this.sendResponse(t.id,{sessionId:r,title:g?.title??f.entry.title,type:g?.type??f.entry.type??"personal",agentId:g?.agentId,ownerPlatform:g?.ownerPlatform,ownerId:g?.ownerId??i,groupKey:g?.groupKey,groupPlatform:g?.groupPlatform,groupName:g?.groupName,projectId:h});return}await vt(r,{sessionId:r,type:"personal",ownerPlatform:n==="desktop"?void 0:n,ownerId:i,projectId:p},m),this.sendResponse(t.id,{sessionId:r,type:"personal",ownerPlatform:n==="desktop"?void 0:n,ownerId:i,projectId:p});return}if(o==="group"&&r&&n){let p=`group:${n}:${r}`,m=fe();for(let f of m){if(!f.workspaceDir)continue;let h=(await cn(500,f.workspaceDir)).find(y=>y.groupKey===p&&!y.sealedAt&&!y.archivedAt);if(h){let y=Kt(h.sessionId,f.workspaceDir);if(y){let b=await DK(y,f.workspaceDir);if(b.split){this.sendResponse(t.id,{sessionId:b.activeSessionId,title:void 0,type:"group",ownerPlatform:y.ownerPlatform,ownerId:i,groupKey:p,groupPlatform:n,groupName:e?.groupName,projectId:f.id,previousSessionId:b.sealedSessionId});return}}this.sendResponse(t.id,{sessionId:h.sessionId,title:h.title,type:"group",ownerPlatform:y?.ownerPlatform,ownerId:i,groupKey:p,groupPlatform:n,groupName:e?.groupName,projectId:f.id});return}}}if(o!=="group"&&n!=="desktop"&&i){let p=e?.projectId?re(e.projectId):Ep(),m=p?[p]:[];for(let f of m){if(!f.workspaceDir)continue;let g=await cn(500,f.workspaceDir);for(let h of g){if(h.type!=="personal"||h.sealedAt||h.archivedAt)continue;let y=Kt(h.sessionId,f.workspaceDir);if(!y?.archivedAt&&!(y?.ownerPlatform!==n||y.ownerId!==i)){this.sendResponse(t.id,{sessionId:y.sessionId,title:y.title??h.title,type:"personal",ownerPlatform:y.ownerPlatform,ownerId:y.ownerId,projectId:y.projectId??f.id});return}}}}let s=BC(),a=e?.projectId??wn.getDefaultProjectId(),c=wn.getProjectWorkspaceDir(a),l=o==="group"?`group:${n}:${r}`:void 0,d=JRe(e?.title);await vt(s,{sessionId:s,title:d,type:o==="group"?"group":"personal",ownerPlatform:o==="group"||n==="desktop"?void 0:n,ownerId:i,groupKey:l,groupPlatform:o==="group"?n:void 0,groupName:e?.groupName,projectId:a},c),this.sendResponse(t.id,{sessionId:s,title:d,type:o==="group"?"group":"personal",ownerPlatform:o==="group"||n==="desktop"?void 0:n,ownerId:i,groupKey:l,groupPlatform:o==="group"?n:void 0,groupName:e?.groupName,projectId:a})}catch(s){this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to resolve session: ${mr(s)}`})}}function JRe(t){return Ml(t,{maxLength:40})}async function BK(t){let e=t.params,n=e?.limit??50;try{let r,o=new Set;if(e?.projectId){let a=re(e.projectId);if(!a){t.id!==void 0&&this.sendResponse(t.id,{sessions:[]});return}let c=a.workspaceDir;o.add(c),r=await cn(n*2,c);let l=await jK(this,n*2,[c]);for(let d of wn.getHostSessionWorkspaceDirs(this,[c]))o.add(d);r=OK(r,l.filter(d=>d.projectId===e.projectId)),r=r.filter(d=>d.projectId===e.projectId);for(let d of r)d.projectId=e.projectId}else{let a=fe(),c=[],l=[];for(let p of a){if(!p.workspaceDir)continue;l.push(p.workspaceDir),o.add(p.workspaceDir);let m=await cn(n,p.workspaceDir);for(let f of m)f.projectId&&c.push(f)}let d=(await jK(this,n,l)).filter(p=>p.projectId);for(let p of wn.getHostSessionWorkspaceDirs(this,l))o.add(p);r=OK(c,d)}let i=await VRe([...o]);i.size>0&&(r=r.filter(a=>!i.has(a.sessionId))),e?.archived===!0?r=r.filter(a=>a.archivedAt!=null):e?.archived===!1&&(r=r.filter(a=>a.archivedAt==null));let s=r.slice(0,n).map(a=>({sessionId:a.sessionId,title:a.title,type:a.type??"personal",agentId:a.agentId,lastActiveAt:a.lastActiveAt,messageCount:a.messageCount,pinnedAt:a.pinnedAt??null,archivedAt:a.archivedAt??null,sealedAt:a.sealedAt??null,projectId:a.projectId,previousSessionId:a.previousSessionId??null,carryoverSummary:a.carryoverSummary??null}));t.id!==void 0&&this.sendResponse(t.id,{sessions:s})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to list sessions: ${mr(r)}`})}}async function qK(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let n=cl(this,e.sessionId,e.projectId),o=(await cn(500,n)).find(i=>i.sessionId===e.sessionId);t.id!==void 0&&this.sendResponse(t.id,{session:o?{sessionId:o.sessionId,title:o.title,type:o.type,lastActiveAt:o.lastActiveAt,messageCount:o.messageCount,pinnedAt:o.pinnedAt??null,archivedAt:o.archivedAt??null,projectId:o.projectId}:null})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to get session: ${mr(n)}`})}}async function WK(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let n=cl(this,e.sessionId,e.projectId),r=await Fr(e.sessionId,n,{includeDisplayMetadata:!0});if(!r){t.id!==void 0&&this.sendResponse(t.id,{messages:[],total:0});return}let o=r.messages;if(GRe(o)){this.log(`[session] purging legacy baked-attachment session ${e.sessionId} (VS Code two-line cutover)`);try{await vt(e.sessionId,{archivedAt:new Date().toISOString()},n)}catch{}t.id!==void 0&&this.sendResponse(t.id,{messages:[],total:0});return}let i=e.limit&&e.limit>0?e.limit:o.length,s=o.slice(-i);t.id!==void 0&&this.sendResponse(t.id,{messages:s,total:o.length})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to get messages: ${mr(n)}`})}}async function GK(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let n=cl(this,e.sessionId,e.projectId),r=await vt(e.sessionId,{...e.title!==void 0?{title:e.title}:{},...e.pinnedAt!==void 0?{pinnedAt:e.pinnedAt}:{},...e.archivedAt!==void 0?{archivedAt:e.archivedAt}:{}},n);r&&this.sendNotification("session.info",{sessionId:e.sessionId,title:r.title,pinnedAt:r.pinnedAt??null,archivedAt:r.archivedAt??null,projectId:e.projectId||void 0}),t.id!==void 0&&this.sendResponse(t.id,{ok:r!==null})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to update session: ${mr(n)}`})}}async function KK(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: sessionId"});return}if(!e.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: projectId"});return}try{let n=cl(this,e.sessionId,e.projectId);await Fp(e.sessionId,n),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to delete session: ${mr(n)}`})}}async function VK(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: projectId"});return}try{let n=wn.getProjectWorkspaceDir(e.projectId),r=(await cn(1e4,n)).filter(i=>i.projectId===e.projectId),o=0;for(let i of r)await Fp(i.sessionId,n),o++;t.id!==void 0&&this.sendResponse(t.id,{ok:!0,deletedCount:o})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to delete all sessions: ${mr(n)}`})}}async function JK(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let n=cl(this,e.sessionId,e.projectId);await vt(e.sessionId,{archivedAt:new Date().toISOString()},n),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to archive session: ${mr(n)}`})}}async function ZK(t){let e=t.params,n=e?.sessionId;if(!n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"sessionId is required"});return}try{let r=cl(this,n,e?.projectId),o=await Fr(n,r);if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:`Session not found: ${n}`});return}o.messages&&o.messages.length>0&&this.sessionHistory.saveResumedSession(n,o.messages),t.id!==void 0&&this.sendResponse(t.id,{metadata:o.metadata,messages:o.messages})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to resume session: ${mr(r)}`})}}function XK(t){let e=this.currentSessionId||"default",n=this.sessionState?.createSnapshot(),r,o=this.getActiveProjectRoot();o&&(r=Vo.join(oi(o),e));let i={sessionId:e,model:this.currentModel||void 0,cwd:process.cwd(),paths:{sessionDir:r,agentHome:_e(),settings:In()},usage:n?{turnCount:n.turnCount,inputTokens:n.totalInputTokens,outputTokens:n.totalOutputTokens}:void 0};t.id!==void 0&&this.sendResponse(t.id,i)}function YK(t){let e=t.params,n=null;if(e?.projectId)n=re(e.projectId);else if(e?.projectName){let i=fe(),s=e.projectName.toLowerCase();if(n=i.find(a=>a.name.toLowerCase()===s)??null,n||(n=i.find(a=>a.name.toLowerCase().includes(s))??null),!n){let a=i.map(c=>c.name).slice(0,10);t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`No project matching "${e.projectName}". Available: ${a.join(", ")||"(none)"}`});return}}else{t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: projectId or projectName"});return}if(!n||n.status!=="active"){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Project not found or archived: ${e.projectId??e.projectName}`});return}let r=e.workspaceDir??n.workspaceDir;if(!Sn.existsSync(r)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Workspace directory does not exist: ${r}`});return}let o=ko(n.id);if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:"Switch failed"});return}this.setActiveWorkdir(o.workspaceDir),this.sendNotification("project.switched",{id:o.id,name:o.name,workspaceDir:o.workspaceDir}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,project:o})}function QK(t){let e=Me(),n=fe();t.id!==void 0&&this.sendResponse(t.id,{sessionId:this.currentSessionId,activeProject:e,projects:n})}async function eV(t){let e=t.params,n=e?.sessionId;if(!n){t.id!==void 0&&this.sendResponse(t.id,{ok:!1});return}let r=fe();for(let o of r)try{let i=wn.getProjectWorkspaceDir(o.id),s=await Kt(n,i);if(s&&s.projectId===o.id){ko(o.id),this.setActiveWorkdir(i),this.log(`[session.focus] switched to project ${o.id} for session ${n}`),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,projectId:o.id});return}}catch{}if(e?.projectName){let o=r.find(i=>i.name===e.projectName);if(o){let i=wn.getProjectWorkspaceDir(o.id);this.getActiveProjectRoot()!==i&&(this.setActiveWorkdir(i),this.log(`[session.focus] switched to project ${o.id} by name "${e.projectName}"`)),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,projectId:o.id});return}}t.id!==void 0&&this.sendResponse(t.id,{ok:!1})}async function tV(t){let e=t.params,{sessionId:n,fromProjectId:r,toProjectId:o}=e??{};if(!n||!r||!o){t.id!==void 0&&this.sendError(t.id,w.INVALID_PARAMS,"sessionId, fromProjectId, and toProjectId are required");return}if(r===o){t.id!==void 0&&this.sendResponse(t.id,{ok:!0});return}let i=re(r),s=re(o);if(!i||!s){t.id!==void 0&&this.sendError(t.id,w.INVALID_PARAMS,"Source or target project not found");return}let a=Vo.join(oi(r),n),c=Vo.join(oi(o),n);if(!Sn.existsSync(a)){t.id!==void 0&&this.sendError(t.id,w.INVALID_PARAMS,`Session ${n} not found in project ${r}`);return}try{Sn.mkdirSync(Vo.dirname(c),{recursive:!0}),Sn.cpSync(a,c,{recursive:!0});let l=Vo.join(c,"metadata.json");if(Sn.existsSync(l)){let d=JSON.parse(Sn.readFileSync(l,"utf-8"));d.projectId=o,Sn.writeFileSync(l,JSON.stringify(d,null,2))}Sn.rmSync(a,{recursive:!0,force:!0}),this.sendNotification("session-update",{sessionId:n,projectId:o}),this.log(`[session.moveToProject] moved ${n}: ${r} -> ${o}`),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,projectId:o})}catch(l){let d=mr(l);this.log(`[session.moveToProject] error: ${d}`),t.id!==void 0&&this.sendError(t.id,w.INTERNAL_ERROR,`Move failed: ${d}`)}}ut();import{spawn as ZRe}from"node:child_process";function XRe(){return process.platform==="win32"?[{command:"powershell.exe",args:["-NoProfile","-Command","[Console]::In.ReadToEnd() | Set-Clipboard"]},{command:"pwsh.exe",args:["-NoProfile","-Command","[Console]::In.ReadToEnd() | Set-Clipboard"]}]:process.platform==="darwin"?[{command:"pbcopy",args:[]}]:[{command:"wl-copy",args:[]},{command:"xclip",args:["-selection","clipboard"]},{command:"xsel",args:["--clipboard","--input"]}]}function YRe(t,e){return new Promise((n,r)=>{let o=ZRe(t.command,t.args,{stdio:["pipe","ignore","pipe"],windowsHide:!0}),i="",s=setTimeout(()=>{o.kill(),r(new Error("Clipboard command timed out"))},3e3);o.stderr?.on("data",a=>{i+=String(a)}),o.on("error",a=>{clearTimeout(s),r(a)}),o.on("close",a=>{if(clearTimeout(s),a===0){n();return}r(new Error(i.trim()||`Clipboard command exited with code ${a}`))}),o.stdin.end(e)})}async function QRe(t){let e;for(let r of XRe())try{await YRe(r,t);return}catch(o){e=o}let n=e instanceof Error?e.message:"No clipboard command available";throw new Error(`System clipboard unavailable: ${n}`)}function eTe(t){return t.length<=8?"****":`${t.slice(0,3)}***${t.slice(-4)}`}function at(t,e,n,r=w.INTERNAL_ERROR){if(e.id!==void 0){if(typeof t.sendError=="function"){t.sendError(e.id,r,n);return}t.sendResponse(e.id,void 0,{code:r,message:n})}}function WC(t,e){at(t,e,Hl)}function tTe(t){let e={};for(let n of t)for(let r of n.routeIntents)e[r]??=[],e[r].push(n);return e}async function nTe(){let t=V(),e=await Ia(t);return Bl(t),t.save(),e}async function rTe(t){try{return await nTe(),!0}catch(e){if(t)throw e;return!1}}function rV(t=V()){return YD()}function GC(t){return t.id===bt?bt:t.group?.trim()||t.id}function oTe(t){return t.id===GC(t)}function nV(t){let e=GC(t);return om({...t,id:e})}function iTe(t){return{volcengine:"\u5E38\u89C4 Ark API Key","volcengine-plan":"\u8BA2\u9605 / Plan \u901A\u9053",qwen:"\u5E38\u89C4 DashScope API Key","qwen-coding":"Coding Plan \u901A\u9053",zhipu:"Anthropic \u901A\u9053","zhipu-openai":"OpenAI \u517C\u5BB9\u901A\u9053","zhipu-coding":"Coding \u901A\u9053"}[t.id]??om(t)}function sTe(t){return t.authType==="none"?!1:t.apiKeyEnvVars===void 0||t.apiKeyEnvVars.length>0}function aTe(t){return{id:t.id,displayName:iTe(t),baseUrl:si(t)??"",modelCount:t.models?.length??0}}function cTe(t){let e=new Map;for(let n of t){if(!sTe(n))continue;let r=GC(n);if(r===bt)continue;let o=n.models?.length??0,i=aTe(n),s=e.get(r);if(!s){e.set(r,{id:r,displayName:nV(n),baseUrl:si(n)??"",modelCount:o,variants:[i]});continue}s.modelCount+=o,s.variants??=[],s.variants.some(a=>a.id===i.id)||s.variants.push(i),oTe(n)&&(s.displayName=nV(n),s.baseUrl=si(n)??s.baseUrl)}return Array.from(e.values()).map(({variants:n,...r})=>({...r,...n&&n.length>1?{variants:n}:{}}))}async function oV(){if(V().isHydratedFromUpstream())return!0;let t=await rTe(!1);return t&&V().markHydratedFromUpstream(),t}function iV(){V().markHydratedFromUpstream()}function lTe(t){return t.defaultModel??t.models?.find(e=>!!e.id)?.id}function dTe(t){return[...new Set(t)]}function uTe(t){let e=t.replace(/\/+$/,"");return dTe([`${e}/models`,/\/v\d+$/.test(e)?`${e}/models`:`${e}/v1/models`])}function pTe(t){return t===404||t===405||t===410||t===501}async function mTe(t){let e=await Uk(t);if(e)return{id:e.id,transport:e.transport,baseUrl:si(e),authType:e.authType,models:e.models}}function qC(t){return{accept:"application/json",Authorization:`Bearer ${t}`}}function fTe(t,e,n,r){if(t===bt)return[{method:"GET",url:jk(n),headers:qC(e)}];let o=gTe(n,r).replace(/\/+$/,""),i=r?.transport,s=lTe(r??{id:t}),a=[];if(i==="anthropic-messages")return/\/anthropic$/.test(o)&&a.push({method:"GET",url:`${o.replace(/\/anthropic$/,"")}/models`,headers:qC(e)}),s&&a.push({method:"POST",url:`${o}/v1/messages`,headers:{"Content-Type":"application/json","x-api-key":e,"anthropic-version":"2023-06-01"},body:{model:s,messages:[{role:"user",content:"ping"}],max_tokens:1,stream:!1}}),a;if(i==="gemini-generatecontent")return s?[{method:"POST",url:`${o}/models/${encodeURIComponent(s)}:generateContent`,headers:{"Content-Type":"application/json","x-goog-api-key":e},body:{contents:[{role:"user",parts:[{text:"ping"}]}],generationConfig:{maxOutputTokens:1}}}]:a;if(i==="volcengine-responses")return s?[{method:"POST",url:`${o.replace(/\/v\d+$/,"")}/v3/responses`,headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:{model:s,input:[{role:"user",content:[{type:"input_text",text:"ping"}]}],max_output_tokens:1,stream:!1,store:!1}}]:a;for(let c of uTe(o))a.push({method:"GET",url:c,headers:qC(e)});return a}function gTe(t,e){let n=t.trim(),r=e?.baseUrl?.trim();return e?.transport==="anthropic-messages"&&r&&/\/anthropic\/?$/.test(r)&&!/\/anthropic\/?$/.test(n)?r:n}async function hTe(t){try{let e=await fetch(t.url,{method:t.method,headers:t.headers,body:t.body?JSON.stringify(t.body):void 0,signal:AbortSignal.timeout(1e4)});if(e.ok)return{valid:!0,status:e.status,url:t.url};let n=await e.text().catch(()=>"");return{valid:!1,status:e.status,error:n.slice(0,500),url:t.url}}catch(e){return{valid:!1,status:0,error:e instanceof Error?e.message:String(e),url:t.url}}}async function sV(t,e,n){let r=await mTe(t),o=fTe(t,e,n,r);if(o.length===0)return{valid:!1,status:0,error:`No validation probe is available for provider "${t}".`};let i;for(let s of o){let a=await hTe(s);if(a.valid)return a;if(pTe(a.status)){i=a;continue}return a}return i??{valid:!1,status:0,error:`No validation probe succeeded for provider "${t}".`}}async function yTe(t,e,n){let r=await sV(t,e,n);if(!r.valid){let o=r.error?`: ${r.error}`:"";throw new Error(`API Key validation failed (${r.status})${o}`)}}async function aV(t){try{let e=await zl(),n=e.find(o=>o.id===bt);if(!n)throw new Error(Hl);let r=cTe(e);r.unshift({id:bt,displayName:Ok,baseUrl:si(n)??rV(),modelCount:e.reduce((o,i)=>o+(i.models?.length??0),0)}),t.id!==void 0&&this.sendResponse(t.id,{providers:r})}catch(e){at(this,t,e instanceof Error?e.message:String(e))}}async function cV(t){let e=t.params;if(!e?.providerId||!e?.key){at(this,t,"Required: providerId (string), key (string)",w.INVALID_PARAMS);return}let{providerId:n,key:r,label:o}=e,i=V(),s,a=!1;try{let c=await kV(n);if(!c){at(this,t,`Unknown provider: ${n}`,w.INVALID_PARAMS);return}let l=i.getProviderStatus(n);if(l?.keys.some(p=>p.key===r)){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,error:"\u8BE5 Key \u5DF2\u5B58\u5728\uFF0C\u65E0\u9700\u91CD\u590D\u6DFB\u52A0"});return}a=!l;let d=l?.keys.map(p=>p.id)??[];if(i.addProvider(n,{baseUrl:c}),s=i.addKey(n,r,{label:o}),n===bt){if((await o0(i,{baseUrl:c,apiKey:r})).length===0)throw new Error("LLMRouter did not return any available models for this API Key.")}else await yTe(n,r,c);await Ia(i),iV();for(let p of Ul)if(!i.getBinding(p)){let m=i.listModels({purpose:p,provider:n,enabledOnly:!0});m.length===0&&(m=i.listModels({purpose:p,provider:n}),m[0]&&i.enableModel(m[0].id)),m.length>0&&i.setBinding(p,m[0].id)}if(i.setKeyHealth(s,"healthy"),e.replaceExisting===!0)for(let p of d)i.updateKey(p,{enabled:!1});i.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,keyId:s,providerId:n})}catch(c){s&&(i.removeKey(s),a&&i.removeProvider(n));let l=c instanceof Error?c.message:Hl;at(this,t,l)}}function lV(t){let e=t.params;if(!e?.keyId){at(this,t,"Required: keyId (string)",w.INVALID_PARAMS);return}let n=V();if(!n.removeKey(e.keyId)){at(this,t,"API Key not found",w.INVALID_PARAMS);return}n.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}function dV(t){let e=t.params;if(!e?.keyId){at(this,t,"Required: keyId (string)",w.INVALID_PARAMS);return}let n=V().getKeyById(e.keyId);if(!n){at(this,t,"API Key not found",w.INVALID_PARAMS);return}t.id!==void 0&&this.sendResponse(t.id,{key:n})}async function uV(t){let e=t.params;if(!e?.keyId){at(this,t,"Required: keyId (string)",w.INVALID_PARAMS);return}let n=V().getKeyById(e.keyId);if(!n){at(this,t,"API Key not found",w.INVALID_PARAMS);return}try{await(this.writeClipboard?this.writeClipboard(n):QRe(n)),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(r){let o=r instanceof Error?r.message:"\u590D\u5236 Key \u5931\u8D25";at(this,t,o)}}function pV(t){let e=t.params;if(!e?.keyId||typeof e.enabled!="boolean"){at(this,t,"Required: keyId (string), enabled (boolean)",w.INVALID_PARAMS);return}let n=V();if(!n.updateKey(e.keyId,{enabled:e.enabled})){at(this,t,"API Key not found",w.INVALID_PARAMS);return}n.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}function mV(t){let e=t.params;if(!e?.modelId||typeof e.enabled!="boolean"){at(this,t,"Required: modelId (string), enabled (boolean)",w.INVALID_PARAMS);return}let n=V();e.enabled?n.enableModel(e.modelId):n.disableModel(e.modelId),n.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}async function fV(t){let e=t.params;try{await oV();let n=V(),r=new Set(n.getAllProviderStatus().filter(i=>i.keys.length>0).map(i=>i.providerId)),o=n.listModels({purpose:e?.purpose,provider:e?.provider}).filter(i=>n.hasConfiguredKeyForProviderVariant(i.provider));t.id!==void 0&&this.sendResponse(t.id,{models:o,grouped:tTe(o),configuredProviderIds:[...r]})}catch{WC(this,t)}}function gV(t){let e=t.params;if(!e?.purpose||!e?.modelId){at(this,t,"Required: purpose (string), modelId (string)",w.INVALID_PARAMS);return}try{let n=V();n.setBinding(e.purpose,e.modelId),n.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(n){at(this,t,n instanceof Error?n.message:String(n),w.INVALID_PARAMS)}}function hV(t){let e=t.params;if(!e?.purpose){at(this,t,"Required: purpose (string)",w.INVALID_PARAMS);return}let n=V(),r=n.getBinding(e.purpose);t.id!==void 0&&this.sendResponse(t.id,{model:r?{id:r.id,provider:r.provider,model:r.model,displayName:r.displayName,routeIntents:r.routeIntents,capabilityProfile:r.capabilityProfile,enabled:r.enabled}:null,available:n.isAvailable(e.purpose)})}async function yV(t){try{await oV();let e=V(),n=e.getAllProviderStatus().map(i=>({providerId:i.providerId,displayName:i.providerId===bt?Ok:i.providerId,baseUrl:i.baseUrl,keyCount:i.keys.length,healthyKeys:i.keys.filter(s=>s.healthStatus==="healthy"&&s.enabled).length,totalKeys:i.keys.length,keys:i.keys.map(s=>({id:s.id,label:s.label,maskedKey:eTe(s.key),enabled:s.enabled,health:s.healthStatus}))})),r=e.getAllBindings(),o={};for(let i of Ul){let s=r[i];o[i]={bound:!!s,modelId:s?.id,modelName:s?.displayName,available:e.isAvailable(i)}}t.id!==void 0&&this.sendResponse(t.id,{providers:n,purposes:o})}catch{WC(this,t)}}async function vV(t){try{let e=V();e.load(),await Ia(e,void 0,{force:!0}),Bl(e),e.save(),iV(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,catalogRefreshed:!0})}catch{WC(this,t)}}async function bV(t){let e=t.params;if(!e?.providerId||!e?.apiKey){at(this,t,"providerId and apiKey required",w.INVALID_PARAMS);return}try{let n=e.baseUrl||await kV(e.providerId);if(!n){at(this,t,`Unknown provider: ${e.providerId}`,w.INVALID_PARAMS);return}let r=await sV(e.providerId,e.apiKey,n);t.id!==void 0&&this.sendResponse(t.id,r)}catch(n){let r=n instanceof Error?n.message:String(n);t.id!==void 0&&this.sendResponse(t.id,{valid:!1,status:0,error:r})}}async function kV(t){if(t===bt)return rV();let e=await Uk(t);return e?si(e):void 0}le();import*as KC from"node:fs";import*as wV from"node:path";xa();le();function Gy(t){let e=Ve(ce());return Jd(t).map(n=>vTe(n,e))}function vTe(t,e){let n=jz(e,t.name),r=n?.registryVersion;return{id:t.name,name:t.name,path:t.baseDir,active:t.active,globallyDisabled:t.globallyDisabled,projectDisabled:t.projectDisabled,category:t.category,author:t.author,...n?.source?{source:n.source}:{},displayName:bTe(t.name),displayDescription:kTe(t.name,t.description),fallbackName:t.name,fallbackDescription:t.description??"",systemGenerated:t.systemGenerated,version:t.version,...r?{registryVersion:r}:{},description:t.description}}function bTe(t){return{key:`capability.skill.${t}.name`,fallback:t}}function kTe(t,e){return{key:`capability.skill.${t}.description`,fallback:e??""}}function wTe(t){return t==="active"||t==="stale"||t==="archived"}function SV(t){let n=t.params?.projectId,r=this.getActiveProjectRoot();if(n&&this.projectLocator){let i=this.projectLocator.resolveProjectRoot(n);i&&(r=i)}let o=Gy(r);t.id!==void 0&&this.sendResponse(t.id,{skills:o})}function xV(t){let n=t.params?.name;if(!n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: name"});return}if(!Ln(n)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Skill "${n}" not found`});return}let r=Cn(n,!1),o=ce(),i=Ve(o),s=Fn(i,n);s.state!=="active"&&(s.state="active",s.staleAt=void 0,s.archivedAt=void 0),st(o,i),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,already:!r}),this.sendNotification("skills.updated",{action:"activate",name:n})}function RV(t){let n=t.params?.name;if(!n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: name"});return}let r=Cn(n,!0);t.id!==void 0&&this.sendResponse(t.id,{ok:!0,already:!r}),this.sendNotification("skills.updated",{action:"deactivate",name:n})}async function TV(t){let n=t.params?.name;if(!n||/[\/\\]|\.\./.test(n)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing or invalid skill name"});return}let r=ce(),o=Ve(r);if(o.records[n]?.pinned){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:`Skill "${n}" is pinned. Unpin it first.`});return}let i=Ln(n);if(!i){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Skill "${n}" not found in skill store`});return}let s=i.baseDir;try{KC.rmSync(s,{recursive:!0,force:!0}),th(o,n),Cn(n,!1),st(r,o),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,deleted:n}),this.sendNotification("skills.updated",{action:"delete",name:n})}catch(a){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to delete skill: ${a instanceof Error?a.message:a}`})}}function AV(t){let n=t.params?.name;if(!n||/[\/\\]|\.\./.test(n)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing or invalid skill name"});return}if(!Ln(n)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Skill "${n}" not found in skill store`});return}let r=ce(),o=Ve(r),i=Fn(o,n);i.source="promoted",st(r,o),Cn(n,!1),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,promoted:n,scope:"global",globalPath:wV.join(Pn(),n)}),this.sendNotification("skills.updated",{action:"promote",name:n})}function PV(t){let e=t.params,n=e?.name;if(!n||typeof e?.disabled!="boolean"){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required params: name (string), disabled (boolean)"});return}let r=this.getActiveProjectRoot();if(e.projectId&&this.projectLocator){let i=this.projectLocator.resolveProjectRoot(e.projectId);i&&(r=i)}if(!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:"No project workspace to scope the skill mute to"});return}let o=JM(r,n,e.disabled);t.id!==void 0&&this.sendResponse(t.id,{ok:!0,name:n,disabled:e.disabled,changed:o}),this.sendNotification("skills.updated",{action:e.disabled?"project-mute":"project-unmute",name:n})}function IV(t){let e=t.params,n=ce(),r=Ve(n);if(e?.name){let o=Lz(r,e.name);t.id!==void 0&&this.sendResponse(t.id,{name:e.name,stats:o??null})}else{let o=Uz(r);t.id!==void 0&&this.sendResponse(t.id,{stats:o})}}function _V(t){let e=t.params;if(!e?.name){t.id!==void 0&&this.sendResponse(t.id,null,{code:-32602,message:"Missing 'name' parameter"});return}let n=ce(),r=Ve(n);Fn(r,e.name),Dz(r,e.name),st(n,r),t.id!==void 0&&this.sendResponse(t.id,{name:e.name,pinned:!0})}function CV(t){let e=t.params;if(!e?.name){t.id!==void 0&&this.sendResponse(t.id,null,{code:-32602,message:"Missing 'name' parameter"});return}let n=ce(),r=Ve(n);$z(r,e.name),st(n,r),t.id!==void 0&&this.sendResponse(t.id,{name:e.name,pinned:!1})}function EV(t){let e=ce(),n=Pn(),r=Nz(e,n);t.id!==void 0&&this.sendResponse(t.id,r)}function MV(t){let e=t.params,n=ce(),r=Ve(n);if(e?.name){let o=r.records[e.name]??null;t.id!==void 0&&this.sendResponse(t.id,{record:o})}else if(e?.state){if(!wTe(e.state)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Invalid skill lifecycle state"});return}let o=Oz(r,e.state);t.id!==void 0&&this.sendResponse(t.id,{records:o})}else t.id!==void 0&&this.sendResponse(t.id,{records:Object.values(r.records)})}import*as UV from"node:path";He();import{randomUUID as PTe}from"node:crypto";import*as LV from"node:path";import{join as VC}from"node:path";import{mkdir as STe,readdir as xTe}from"node:fs/promises";Ke();function RTe(t){return t?.pathService??ee()}function TTe(t,e){return t??e.getActiveProjectRoot()}function DV(t,e){let n=RTe(e);return VC(n.getProjectAgentDir(TTe(t,n)),"solos")}function JC(t,e,n){return VC(DV(e,n),t)}function $V(t,e,n){return VC(JC(t,e,n),"solo-state.json")}async function NV(t,e,n){let r=JC(t.soloId,e,n);await STe(r,{recursive:!0}),await Bt($V(t.soloId,e,n),t)}async function ATe(t,e,n){return Et($V(t,e,n))}async function OV(t,e){let n=DV(t,e),r;try{r=await xTe(n)}catch{return[]}let o=[];for(let i of r){let s=await ATe(i,t,e);s&&o.push(s)}return o}async function ZC(t,e,n){let{rm:r}=await import("node:fs/promises"),o=JC(t,e,n);try{return await r(o,{recursive:!0,force:!0}),!0}catch{return!1}}function jV(t){if(typeof t=="string")return t;if(t&&typeof t=="object"){let e=t;if(typeof e.content=="string")return e.content;if(typeof e.text=="string")return e.text}return t==null?"":JSON.stringify(t)}function ITe(t){let e=["<spec>",`\u76EE\u6807: ${t.goal}`];return t.constraints.length&&(e.push("\u7EA6\u675F:"),t.constraints.forEach((n,r)=>e.push(` ${r+1}. ${n}`))),t.acceptance.length&&(e.push("\u9A8C\u6536\u6807\u51C6(\u5FC5\u987B\u5168\u90E8\u6EE1\u8DB3):"),t.acceptance.forEach((n,r)=>e.push(` ${r+1}. ${n}`))),e.push("</spec>"),e.join(`
1120
+ `),this.sendNotification("workflow.alert",{workflowId:e.workflowId,kind:"consecutive-failures",count:r,triggerType:n,...tt(t)}))}return}OC.delete(e.workflowId),this.sendNotification("workflow.runCompleted",{workflowId:e.workflowId,status:e.status,triggerType:n,outcome:e,...tt(t)})}function Rt(t){return t instanceof Error?t.message:String(t)}async function O6(t){let e=Se(t);if(!e.def)return ne.call(this,t,"workflow.create requires `def`");let n=qe.call(this,t,e);if(!n)return;let r=String(e.id??`wf_${ca().slice(0,8)}`),o=await n.controller.create({id:r,name:String(e.name??r),owner:dt(),def:e.def,concurrency:e.concurrency,active:e.active===!0});o.active&&await n.scheduler.refresh(o.id),Cr(n,"created",o.id,{name:o.name}),io.call(this,"workflow.created",o,n),t.id!==void 0&&this.sendResponse(t.id,Kn(o,n))}async function j6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.get requires `id`");let n=qe.call(this,t,e);if(!n)return;let r=await n.controller.get(String(e.id)),o=Kn(r,n);e.includePublished===!0&&r.publishedDef&&(o.publishedDef=r.publishedDef),t.id!==void 0&&this.sendResponse(t.id,o)}async function L6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.describe requires `id`");let n=qe.call(this,t,e);if(!n)return;let r=await n.controller.describe(String(e.id));t.id!==void 0&&this.sendResponse(t.id,{rendered:r})}async function U6(t){let e=Se(t);if(!e.id||!e.patch)return ne.call(this,t,"workflow.patch requires `id` and `patch`");let n=qe.call(this,t,e);if(!n)return;let r={patch:e.patch,baseRev:e.baseRev,scope:e.scope},o=await n.controller.patch(String(e.id),r);await n.scheduler.refresh(String(e.id)),o.ok&&(Cr(n,"patched",String(e.id),{ops:(r.patch??[]).map(i=>i.op)}),io.call(this,"workflow.updated",await n.controller.get(String(e.id)),n)),t.id!==void 0&&this.sendResponse(t.id,o)}async function F6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.run requires `id`");let n=qe.call(this,t,e);if(!n)return;let r=e.trigger??{type:"manual"},o=String(e.id);this.sendNotification("workflow.runStarted",{workflowId:o,triggerType:r.type,...tt(n)});let i;try{i=await n.controller.run(o,r,{reuseCache:e.reuseCache===!0}),al.call(this,n,i,r.type)}catch(s){throw this.sendNotification("workflow.runFailed",{workflowId:o,triggerType:r.type,error:Rt(s),...tt(n)}),s}t.id!==void 0&&this.sendResponse(t.id,i)}async function H6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.update requires `id`");if(e.name===void 0&&e.def===void 0&&e.concurrency===void 0)return ne.call(this,t,"workflow.update requires at least one of `name`/`def`/`concurrency`");let n=qe.call(this,t,e);if(!n)return;let r=await n.controller.update(String(e.id),{...e.name!==void 0?{name:String(e.name)}:{},...e.def!==void 0?{def:e.def}:{},...e.concurrency!==void 0?{concurrency:e.concurrency}:{}});await n.scheduler.refresh(r.id),Cr(n,"updated",r.id,{fields:["name","def","concurrency"].filter(o=>e[o]!==void 0)}),io.call(this,"workflow.updated",r,n),t.id!==void 0&&this.sendResponse(t.id,Kn(r,n))}async function z6(t){let e=Se(t);if(!e.id||typeof e.active!="boolean")return ne.call(this,t,"workflow.setActive requires `id` and boolean `active`");let n=qe.call(this,t,e);if(!n)return;let r;try{r=await n.controller.setActive(String(e.id),e.active)}catch(o){return ne.call(this,t,Rt(o))}await n.scheduler.refresh(r.id),Cr(n,e.active?"activated":"deactivated",r.id),io.call(this,"workflow.updated",r,n),t.id!==void 0&&this.sendResponse(t.id,Kn(r,n))}async function B6(t){let e=Se(t);if(e.projectId){let o=qe.call(this,t,e);if(!o)return;let i=await o.store.list();t.id!==void 0&&this.sendResponse(t.id,{workflows:i.map(s=>Kn(s,o))});return}let n=qy.call(this),r=[];for(let o of n){let i=await o.store.list();r.push(...i.map(s=>Kn(s,o)))}t.id!==void 0&&this.sendResponse(t.id,{workflows:r})}async function q6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.delete requires `id`");let n=qe.call(this,t,e);n&&(await n.controller.delete(String(e.id)),await n.scheduler.refresh(String(e.id)),Cr(n,"deleted",String(e.id)),this.sendNotification("workflow.deleted",{workflowId:String(e.id),...tt(n)}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0}))}async function W6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.cancelRun requires `id`");let n=qe.call(this,t,e);if(!n)return;let r;try{r=await n.controller.cancelRun(String(e.id),{...typeof e.runId=="string"&&e.runId?{runId:e.runId}:{},reason:typeof e.reason=="string"&&e.reason?e.reason:"\u7528\u6237\u505C\u6B62\u4E86\u8FD0\u884C"})}catch(o){return ne.call(this,t,Rt(o))}al.call(this,n,r,"manual"),t.id!==void 0&&this.sendResponse(t.id,r)}async function G6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.dryRun requires `id`");let n=qe.call(this,t,e);if(!n)return;let r=String(e.id);this.sendNotification("workflow.runStarted",{workflowId:r,triggerType:"manual",...tt(n)});let o;try{o=await n.controller.run(r,{type:"manual",payload:e.payload},{recordHistory:!1}),al.call(this,n,o,"manual")}catch(i){return this.sendNotification("workflow.runFailed",{workflowId:r,triggerType:"manual",error:Rt(i),...tt(n)}),ne.call(this,t,Rt(i))}t.id!==void 0&&this.sendResponse(t.id,{...o,dryRun:!0})}async function K6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.metrics requires `id`");let n=qe.call(this,t,e);if(!n)return;let r=await n.runHistory.list(String(e.id)),o=r.filter(d=>d.status!=="running"),i=o.filter(d=>d.status==="completed"),s=o.filter(d=>d.status==="failed"),a=o.map(d=>d.durationMs).filter(d=>typeof d=="number"),c=0;for(let d of o)if(d.status==="failed")c++;else break;let l={};for(let d of o)l[d.triggerType]=(l[d.triggerType]??0)+1;t.id!==void 0&&this.sendResponse(t.id,{metrics:{totalRuns:o.length,completed:i.length,failed:s.length,canceled:o.filter(d=>d.status==="canceled").length,successRate:o.length>0?i.length/o.length:null,avgDurationMs:a.length>0?Math.round(a.reduce((d,p)=>d+p,0)/a.length):null,lastRunAt:o[0]?.startedAt??null,consecutiveFailures:c,byTrigger:l,windowSize:r.length}})}async function V6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.publish requires `id`");let n=qe.call(this,t,e);if(!n)return;let r;try{r=await n.controller.publish(String(e.id))}catch(o){return ne.call(this,t,Rt(o))}Cr(n,"published",r.id,{rev:r.publishedRev}),io.call(this,"workflow.updated",r,n),t.id!==void 0&&this.sendResponse(t.id,Kn(r,n))}async function J6(t){let e=Se(t);if(!e.id||typeof e.archived!="boolean")return ne.call(this,t,"workflow.archive requires `id` and boolean `archived`");let n=qe.call(this,t,e);if(!n)return;let r=await n.controller.archive(String(e.id),e.archived);await n.scheduler.refresh(r.id),Cr(n,e.archived?"archived":"unarchived",r.id),io.call(this,"workflow.updated",r,n),t.id!==void 0&&this.sendResponse(t.id,Kn(r,n))}async function Z6(t){let e=new Ko().list();t.id!==void 0&&this.sendResponse(t.id,{credentials:e})}async function X6(t){let e=Se(t);if(!e.type||!e.label||typeof e.data!="object"||e.data===null)return ne.call(this,t,"credential.create requires `type`, `label`, and `data` object");try{let n=new Ko().create({type:e.type,label:String(e.label),data:e.data,meta:e.meta??void 0});t.id!==void 0&&this.sendResponse(t.id,n)}catch(n){return ne.call(this,t,Rt(n))}}async function Y6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"credential.delete requires `id`");let n=new Ko().delete(String(e.id));t.id!==void 0&&this.sendResponse(t.id,{ok:n})}var il=new Map;async function Q6(t){let e=Se(t);for(let n of["label","authUrl","tokenUrl","clientId","redirectUri"])if(typeof e[n]!="string"||!e[n])return ne.call(this,t,`credential.oauthStart requires \`${n}\``);try{let n=new Ko,r=typeof e.scopes=="string"?e.scopes:"",o=n.create({type:"oauth2",label:String(e.label),data:{tokenUrl:String(e.tokenUrl),clientId:String(e.clientId),...typeof e.clientSecret=="string"&&e.clientSecret?{clientSecret:e.clientSecret}:{},...r?{scopes:r}:{}},meta:{...r?{scopes:r}:{},pending:!0}}),i=ca(),s=Date.now();for(let[c,l]of il)l.expiresAt<s&&il.delete(c);il.set(i,{credentialId:o.id,tokenUrl:String(e.tokenUrl),clientId:String(e.clientId),...typeof e.clientSecret=="string"&&e.clientSecret?{clientSecret:e.clientSecret}:{},redirectUri:String(e.redirectUri),expiresAt:s+10*6e4});let a=new URL(String(e.authUrl));a.searchParams.set("response_type","code"),a.searchParams.set("client_id",String(e.clientId)),a.searchParams.set("redirect_uri",String(e.redirectUri)),a.searchParams.set("state",i),r&&a.searchParams.set("scope",r),t.id!==void 0&&this.sendResponse(t.id,{credentialId:o.id,authorizeUrl:a.toString(),state:i})}catch(n){return ne.call(this,t,Rt(n))}}async function eK(t){let e=Se(t);if(typeof e.state!="string"||typeof e.code!="string"||!e.state||!e.code)return ne.call(this,t,"credential.oauthComplete requires `state` and `code`");let n=il.get(e.state);if(!n||n.expiresAt<Date.now())return il.delete(e.state),ne.call(this,t,"OAuth state unknown or expired \u2014 restart the authorization");il.delete(e.state);try{let r=new URLSearchParams({grant_type:"authorization_code",code:e.code,redirect_uri:n.redirectUri,client_id:n.clientId,...n.clientSecret?{client_secret:n.clientSecret}:{}}),o=await fetch(n.tokenUrl,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded",Accept:"application/json"},body:r.toString()}),i=await o.text();if(!o.ok)throw new Error(`token exchange failed (${o.status}): ${i.slice(0,200)}`);let s=JSON.parse(i);if(!s.access_token)throw new Error(`token endpoint returned no access_token: ${i.slice(0,200)}`);let a=new Ko,{data:c}=a.get(n.credentialId);a.updateData(n.credentialId,{...c,accessToken:s.access_token,...s.refresh_token?{refreshToken:s.refresh_token}:{},...s.expires_in?{expiresAt:new Date(Date.now()+s.expires_in*1e3).toISOString()}:{}},{pending:void 0}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,credentialId:n.credentialId})}catch(r){return ne.call(this,t,Rt(r))}}async function tK(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.setPermissionScope requires `id`");if(e.allowUnattendedKinds!==null&&!Array.isArray(e.allowUnattendedKinds))return ne.call(this,t,"workflow.setPermissionScope requires `allowUnattendedKinds` array (or null to revoke)");let n=qe.call(this,t,e);if(!n)return;let r=e.allowUnattendedKinds===null?null:{allowUnattendedKinds:e.allowUnattendedKinds.filter(i=>typeof i=="string"),grantedAt:new Date().toISOString()},o=await n.controller.update(String(e.id),{permissionScope:r});Cr(n,r?"permissionGranted":"permissionRevoked",o.id,r?{kinds:r.allowUnattendedKinds}:void 0),io.call(this,"workflow.updated",o,n),t.id!==void 0&&this.sendResponse(t.id,Kn(o,n))}async function nK(t){let e=Se(t),n;try{n=qu.call(this,e).cwd}catch(o){return ne.call(this,t,Rt(o))}let r=jy({getToolManifest:()=>this.toolCatalog.getToolManifest(),listAgentIds:()=>[{id:"qlogicagent",name:"\u5C0F\u667A(\u9ED8\u8BA4)"},...this.acpDetector.list().filter(o=>o.status==="available"&&o.id!=="qlogicagent").map(o=>({id:o.id,name:o.name}))],projectRoot:n});t.id!==void 0&&this.sendResponse(t.id,{capabilities:r})}async function rK(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.export requires `id`");let n=qe.call(this,t,e);if(!n)return;let r=await n.controller.get(String(e.id)),o=_C(r);t.id!==void 0&&this.sendResponse(t.id,{bundle:o})}async function oK(t){let e=Se(t);if(!e.payload)return ne.call(this,t,"workflow.import requires `payload`");let n=qe.call(this,t,e);if(!n)return;let r=typeof e.targetWorkflowId=="string"&&e.targetWorkflowId?e.targetWorkflowId:void 0,o=r??String(e.id??`wf_${ca().slice(0,8)}`),i,s;try{if(e.format==="n8n")if(r){let a=oy(e.payload,o,{strictTemplates:!0});s=a.report,i=await n.controller.update(o,{name:String(e.name??a.name),def:a.def})}else{let a=await n.controller.importN8n(o,e.payload,{owner:dt()});i=a.record,s=a.report,e.name&&(i=await n.controller.update(o,{name:String(e.name)}))}else{let a=g6(e.payload);if(r?i=await n.controller.update(o,{name:String(e.name??a.name),def:{...a.def,id:o},...a.concurrency?{concurrency:a.concurrency}:{}}):i=await n.controller.create({id:o,name:String(e.name??a.name),owner:dt(),def:{...a.def,id:o},concurrency:a.concurrency}),a.trigger){let c=await n.controller.patch(o,{patch:[{op:"set_trigger",trigger:a.trigger}]});if(!c.ok)throw new Error(`trigger rejected: ${JSON.stringify("errors"in c?c.errors:c)}`);i=await n.controller.get(o)}}}catch(a){return ne.call(this,t,`workflow.import: ${Rt(a)}`)}Cr(n,"imported",i.id,{format:e.format==="n8n"?"n8n":"bundle",...s?{conversion:s.status}:{}}),io.call(this,r?"workflow.updated":"workflow.created",i,n),t.id!==void 0&&this.sendResponse(t.id,{...Kn(i,n),...s?{conversionReport:s}:{}})}async function iK(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.duplicate requires `id`");let n=qe.call(this,t,e);if(!n)return;let r;try{r=e.targetProjectId?zu.call(this,qu.call(this,{projectId:e.targetProjectId})):n}catch(c){return ne.call(this,t,Rt(c))}let o=await n.controller.get(String(e.id)),i=_C(o),s=`wf_${ca().slice(0,8)}`,a=await r.controller.create({id:s,name:String(e.name??`${o.name} \u526F\u672C`),owner:dt(),def:{...i.def,id:s},concurrency:o.concurrency});if(i.trigger){let c=await r.controller.patch(s,{patch:[{op:"set_trigger",trigger:i.trigger}]});if(!c.ok)throw new Error(`workflow.duplicate: trigger rejected: ${JSON.stringify("errors"in c?c.errors:c)}`);a=await r.controller.get(s)}Cr(r,"duplicated",s,{sourceWorkflowId:String(e.id)}),io.call(this,"workflow.created",a,r),t.id!==void 0&&this.sendResponse(t.id,Kn(a,r))}async function sK(t){let e=Se(t);if(!e.channel||typeof e.text!="string")return ne.call(this,t,"workflow.onImMessage requires `channel` and string `text`");let n=qy.call(this),r=[],o=[];for(let i of n)try{r.push(...await i.scheduler.onImMessage(String(e.channel),e.text,e.payload))}catch(s){o.push({...tt(i),error:Rt(s)})}t.id!==void 0&&this.sendResponse(t.id,{outcomes:r,...o.length>0?{errors:o}:{}})}async function aK(t){let e=Se(t);if(!e.path)return ne.call(this,t,"workflow.onWebhook requires `path`");let n=String(e.path).startsWith("/")?String(e.path):`/${String(e.path)}`,r=e.payload??{},o=Bu.get(n),i=o?o.size:0;if(o)for(let l of[...o.values()])l(r);let s=qy.call(this),a=[],c=[];for(let l of s)try{a.push(...await l.scheduler.onWebhook(n,e.payload))}catch(d){c.push({...tt(l),error:Rt(d)})}t.id!==void 0&&this.sendResponse(t.id,{outcomes:a,...c.length>0?{errors:c}:{},...i>0?{wokenWaits:i}:{}})}async function cK(t){let e=Se(t);if(!e.workflowId||typeof e.text!="string")return ne.call(this,t,"workflow.onIntent requires `workflowId` and string `text`");let n=qe.call(this,t,e);if(!n)return;let r=String(e.workflowId),o=await n.controller.get(r);if(!o.active||o.trigger?.type!=="intent")return ne.call(this,t,`workflow "${r}" has no active intent trigger (active=${o.active}, trigger=${o.trigger?.type??"none"})`);let i={type:"intent",text:e.text,...typeof e.surface=="string"?{surface:e.surface}:{},...typeof e.matchedPhrase=="string"?{matchedPhrase:e.matchedPhrase}:{}};this.sendNotification("workflow.runStarted",{workflowId:r,triggerType:"intent",...tt(n)});let s;try{s=await n.controller.run(r,{type:"intent",payload:i}),al.call(this,n,s,"intent")}catch(a){throw this.sendNotification("workflow.runFailed",{workflowId:r,triggerType:"intent",error:Rt(a),...tt(n)}),a}t.id!==void 0&&this.sendResponse(t.id,s)}async function CRe(){let t=qy.call(this),e=[];for(let n of t)for(let r of await n.store.listActive())r.trigger?.type==="intent"&&e.push({workflowId:r.id,projectId:n.projectId,name:r.name,trigger:r.trigger});return e}async function lK(t){let e=await CRe.call(this);t.id!==void 0&&this.sendResponse(t.id,{intents:e})}async function dK(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.revisions requires `id`");let n=qe.call(this,t,e);if(!n)return;let r=await n.store.listRevisions(String(e.id));t.id!==void 0&&this.sendResponse(t.id,{revisions:r})}async function uK(t){let e=Se(t);if(!e.id||typeof e.rev!="number")return ne.call(this,t,"workflow.revert requires `id` and numeric `rev`");let n=qe.call(this,t,e);if(!n)return;let r=await n.controller.revertTo(String(e.id),e.rev);await n.scheduler.refresh(r.id),Cr(n,"reverted",r.id,{toRev:e.rev}),io.call(this,"workflow.updated",r,n),t.id!==void 0&&this.sendResponse(t.id,Kn(r,n))}async function pK(t){let e=Se(t),n=qe.call(this,t,e);if(!n)return;let r=typeof e.limit=="number"&&e.limit>0?Math.min(e.limit,500):100,o=n.audit.list(e.id?String(e.id):void 0,r);t.id!==void 0&&this.sendResponse(t.id,{entries:o})}async function mK(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.runs requires `id`");let n=qe.call(this,t,e);if(!n)return;let r=await n.runHistory.list(String(e.id));t.id!==void 0&&this.sendResponse(t.id,{runs:r})}async function fK(t){let e=Se(t);if(!e.id||!e.runId)return ne.call(this,t,"workflow.runDetail requires `id` and `runId`");let n=qe.call(this,t,e);if(!n)return;let r=await n.runHistory.get(String(e.id),String(e.runId));if(!r)return ne.call(this,t,`run "${String(e.runId)}" not found for workflow "${String(e.id)}"`);t.id!==void 0&&this.sendResponse(t.id,{run:r})}He();le();an();import*as ze from"node:fs";import*as Tt from"node:path";import{execFileSync as LRe}from"node:child_process";He();Ke();import*as ao from"node:fs";import*as HC from"node:path";import{randomUUID as MRe}from"node:crypto";le();import*as tn from"node:fs";import*as so from"node:path";import{fileURLToPath as ERe}from"node:url";function Wu(t){let e=_n(t),n=so.dirname(e);tn.existsSync(n)||tn.mkdirSync(n,{recursive:!0}),FC(ak(),e),FC(so.join(gK(),"INSTRUCTIONS.md"),e);let r=bo(t);hK(ck(),r),hK(so.join(gK(),"rules"),r)}function gK(){return so.join(so.dirname(ERe(import.meta.url)),"default-project-knowledge")}function FC(t,e){if(!(!tn.existsSync(t)||tn.existsSync(e)))try{tn.mkdirSync(so.dirname(e),{recursive:!0}),tn.copyFileSync(t,e)}catch{}}function hK(t,e){if(tn.existsSync(t))try{tn.mkdirSync(e,{recursive:!0});for(let n of tn.readdirSync(t)){if(!n.endsWith(".md"))continue;let r=so.join(t,n),o=so.join(e,n);tn.statSync(r).isFile()&&FC(r,o)}}catch{}}function DRe(t){return t==="solo"||t==="product"||t==="automation"}var $Re=["creating","running","completed","failed","cancelled"];function vK(t){return typeof t=="string"&&$Re.includes(t)}async function bK(t,e){let n=ee(),r=typeof e.workspaceDir=="string"&&e.workspaceDir.trim().length>0,o=r?e.workspaceDir.trim():HC.join(n.getUserAgentHome(),"workspaces",e.name);if(e.groupId){let p=pD(e.groupId);if(p)return yK(p.workspaceDir),Wu(p.workspaceDir),{project:p,isAgentTeamProject:p.type==="solo"||p.type==="product",autoSwitched:!1,deduplicated:!0}}let s=fe().find(p=>p.name===e.name);r?NRe(o):yK(o);let a=DRe(e.type),c=aD({name:e.name,workspaceDir:o,type:e.type??"personal",groupId:e.groupId,skipAutoSwitch:a}),l=c.type==="solo"||c.type==="product";a||(ko(c.id),t.setActiveWorkdir(c.workspaceDir)),Wu(c.workspaceDir);let d=t.projectMemoryStoreFactory.create(c.workspaceDir);return d.ensureInitialized(),a||(t.memdir=d,t.mediaPersistence.setProjectDir(c.workspaceDir)),jRe(c),await ORe(c),{project:c,nameDuplicate:s,isAgentTeamProject:l,autoSwitched:!a}}function yK(t){ao.existsSync(t)||ao.mkdirSync(t,{recursive:!0})}function NRe(t){if(!ao.existsSync(t))throw new Error(`Workspace directory does not exist: ${t}`);if(!ao.statSync(t).isDirectory())throw new Error(`Workspace path is not a directory: ${t}`)}async function ORe(t){if(t.type!=="automation")return;let e=`wf_${MRe().slice(0,8)}`,n=new Date().toISOString();await new dr(t.workspaceDir).save({id:e,name:t.name,def:{id:e,nodes:[],edges:[]},active:!1,concurrency:"queue",rev:1,createdAt:n,updatedAt:n}),ir(t.id,{primaryWorkflowId:e}),t.primaryWorkflowId=e}function jRe(t){let e=ee();if(t.type!=="solo"&&t.type!=="product")return;let n=HC.join(e.getProjectAgentDir(t.workspaceDir),t.type==="solo"?"solo-state.json":"product-state.json");if(ao.existsSync(n))return;let r=t.type==="solo"?{agents:[],status:"idle",createdAt:new Date().toISOString()}:{tasks:[],instances:[],status:"idle",createdAt:new Date().toISOString()};ao.writeFileSync(n,JSON.stringify(r,null,2))}async function kK(t){let e=t.params;if(!e?.name){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: name"});return}let n;try{n=await bK(this,{name:e.name,workspaceDir:e.workspaceDir,type:e.type,groupId:e.groupId})}catch(a){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:a instanceof Error?a.message:`Cannot create workspace directory: ${e.workspaceDir??e.name}`});return}let{project:r,nameDuplicate:o,autoSwitched:i,deduplicated:s}=n;if(s){t.id!==void 0&&this.sendResponse(t.id,{ok:!0,project:r,deduplicated:!0});return}if(this.sendNotification("project.created",{...r}),i&&this.sendNotification("project.switched",{id:r.id,name:r.name,workspaceDir:r.workspaceDir}),t.id!==void 0){let a={ok:!0,project:r};o&&(a.warning=`A project named "${o.name}" already exists at ${o.workspaceDir}. Consider renaming one of them to avoid ambiguity.`),this.sendResponse(t.id,a)}}function wK(t){let e=fe();t.id!==void 0&&this.sendResponse(t.id,{projects:e})}function SK(t){let e=t.params,n=e?.projectId?.trim(),r=e?.query?.trim();if(!n&&!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: projectId or query"});return}let o=URe(n??r);if(!o){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,error:`Project not found: ${n??r}`});return}let i=ko(o.id);if(!i){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,error:`Project not found: ${n??r}`});return}this.setActiveWorkdir(i.workspaceDir);let s=this.projectMemoryStoreFactory.create(i.workspaceDir);s.ensureInitialized(),this.memdir=s,this.mediaPersistence.setProjectDir(i.workspaceDir),this.sendNotification("project.switched",{id:i.id,name:i.name,workspaceDir:i.workspaceDir}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,project:i,projectId:i.id,name:i.name,workspaceDir:i.workspaceDir})}function URe(t){let e=re(t);if(e?.status==="active")return e;let n=fe(),r=Number.parseInt(t,10);if(String(r)===t&&r>=1&&r<=n.length)return n[r-1]??null;let o=t.toLowerCase();return n.find(i=>i.id===t)??n.find(i=>i.name.toLowerCase()===o)??n.find(i=>i.name.toLowerCase().includes(o))??null}function FRe(t){let e=Tt.join(t,".worktrees");if(!ze.existsSync(Tt.join(t,".git"))||!ze.existsSync(e))return;let n=o=>{try{LRe("git",o,{cwd:t,stdio:"ignore",windowsHide:!0})}catch{}},r=[];try{r=ze.readdirSync(e,{withFileTypes:!0})}catch{return}for(let o of r)o.isDirectory()&&n(["worktree","remove","--force",Tt.join(e,o.name)]);n(["worktree","prune"])}function xK(t,e={}){if(e.requireManaged){let r=Tt.resolve(Tt.join(_e(),"workspaces"))+Tt.sep;if(!t.startsWith(r))return{deleted:!1,skipped:"external",error:"Project directory is outside the managed workspace root and was not deleted automatically."}}try{e.releaseDir?.(t)}catch{}FRe(t);let n;for(let r=0;r<3;r++){if(!ze.existsSync(t))return{deleted:!0};try{if(RK(t),!ze.existsSync(t))return{deleted:!0};n="Directory still present after removal (likely held by another process)."}catch(o){n=o?.message??String(o)}if(r<2){let o=Date.now();for(;Date.now()-o<300;);}}return{deleted:!1,error:n}}function RK(t){let e;try{e=ze.lstatSync(t)}catch{return}if(e.isDirectory()&&!e.isSymbolicLink()){for(let n of ze.readdirSync(t))RK(Tt.join(t,n));try{ze.rmdirSync(t)}catch{try{ze.chmodSync(t,448),ze.rmdirSync(t)}catch{}}}else try{ze.unlinkSync(t)}catch{try{ze.chmodSync(t,448),ze.unlinkSync(t)}catch{}}}function TK(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: projectId"});return}let n=re(e.projectId);if(!n){this.sendNotification("project.deleted",{id:e.projectId}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,alreadyAbsent:!0});return}if(n.type==="default"){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Cannot delete the default project"});return}let r=yk(e.projectId);if(!r.deleted){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:"Cannot delete project"});return}let o=!1,i;if(n?.workspaceDir){let s=xK(Tt.resolve(n.workspaceDir),{requireManaged:!0,releaseDir:a=>this.mediaPersistence?.releaseProjectDir?.(a)});o=s.deleted,i=s.error}try{ze.rmSync(or(e.projectId),{recursive:!0,force:!0})}catch(s){console.error(`[project.delete] projectData cleanup failed for ${e.projectId}:`,s instanceof Error?s.message:s)}this.sendNotification("project.deleted",{id:e.projectId}),r.switchedTo&&(this.setActiveWorkdir(r.switchedTo.workspaceDir),this.sendNotification("project.switched",{id:r.switchedTo.id,name:r.switchedTo.name,workspaceDir:r.switchedTo.workspaceDir})),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,switchedTo:r.switchedTo,dirDeleted:o,dirDeleteError:i})}function AK(t){let e=fe(),n=Tt.join(_e(),"workspaces"),r=Tt.resolve(n)+Tt.sep,o=0,i=[];for(let a of e)if(a.type!=="default"){if(yk(a.id),o++,a.workspaceDir){let c=xK(Tt.resolve(a.workspaceDir),{releaseDir:l=>this.mediaPersistence?.releaseProjectDir?.(l)});c.error&&i.push(`${a.name}: ${c.error}`)}this.sendNotification("project.deleted",{id:a.id})}if(ze.existsSync(n)){let a=fe().find(d=>d.type==="default"),c=new Set;a?.workspaceDir&&c.add(Tt.resolve(a.workspaceDir));let l=d=>{try{let p=ze.readdirSync(d,{withFileTypes:!0});for(let m of p){if(!m.isDirectory())continue;let f=Tt.join(d,m.name);if(!c.has(Tt.resolve(f))){if(m.name==="groups"){l(f);try{ze.readdirSync(f).length===0&&ze.rmdirSync(f)}catch{}continue}try{ze.rmSync(f,{recursive:!0,force:!0})}catch(g){i.push(`orphan:${m.name}: ${g.message??g}`)}}}}catch{}};l(n)}let s=fe().find(a=>a.type==="default");s&&(this.setActiveWorkdir(s.workspaceDir),this.sendNotification("project.switched",{id:s.id,name:s.name,workspaceDir:s.workspaceDir})),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,deletedCount:o,dirErrors:i.length?i:void 0})}function PK(t){let e=t.params;if(!e?.projectId||!e?.newName){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required params: projectId, newName"});return}let n=lD(e.projectId,e.newName);if(!n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:"Cannot rename project (not found, is default, or name already taken)"});return}this.sendNotification("project.renamed",{id:n.id,name:n.name,workspaceDir:n.workspaceDir}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,project:n})}function IK(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: projectId"});return}let n=dD(e.projectId);if(!n.archived){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:"Cannot archive project (not found or is default project)"});return}this.sendNotification("project.archived",{id:e.projectId}),n.switchedTo&&(this.setActiveWorkdir(n.switchedTo.workspaceDir),this.sendNotification("project.switched",{id:n.switchedTo.id,name:n.switchedTo.name,workspaceDir:n.switchedTo.workspaceDir})),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,switchedTo:n.switchedTo})}function _K(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: projectId"});return}let n=uD(e.projectId);if(!n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:"Cannot unarchive project (not found or not archived)"});return}this.sendNotification("project.unarchived",{id:n.id,name:n.name,workspaceDir:n.workspaceDir}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,project:n})}function CK(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"projectId is required"});return}let n={};if("planStatus"in e){if(e.planStatus!==void 0&&!vK(e.planStatus)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:`Invalid planStatus: ${e.planStatus}`});return}n.planStatus=e.planStatus}"planAgents"in e&&(n.planAgents=e.planAgents),"planWinnerId"in e&&(n.planWinnerId=e.planWinnerId),"leaderSessionId"in e&&(n.leaderSessionId=e.leaderSessionId),"primaryWorkflowId"in e&&(n.primaryWorkflowId=e.primaryWorkflowId);let r=ir(e.projectId,n);t.id!==void 0&&this.sendResponse(t.id,{ok:r})}He();import{randomUUID as BC}from"node:crypto";import*as Sn from"node:fs";import*as Vo from"node:path";var Er=class{sessionId;_trustAccepted=!1;_modelUsage=new Map;_totalInputTokens=0;_totalOutputTokens=0;_turnCount=0;_toolCallCount=0;_listeners=new Set;constructor(e){this.sessionId=e}get trustAccepted(){return this._trustAccepted}setTrustAccepted(e){this._trustAccepted=e,this.notifyListeners()}get totalInputTokens(){return this._totalInputTokens}get totalOutputTokens(){return this._totalOutputTokens}get turnCount(){return this._turnCount}get toolCallCount(){return this._toolCallCount}getModelUsage(e){return this._modelUsage.get(e)}getAllModelUsage(){let e={};for(let[n,r]of this._modelUsage)e[n]={...r};return e}addUsage(e,n){this._totalInputTokens+=e.inputTokens,this._totalOutputTokens+=e.outputTokens;let r=this._modelUsage.get(n);r?(r.inputTokens+=e.inputTokens,r.outputTokens+=e.outputTokens,r.cacheRead+=e.cacheRead??0,r.cacheCreation+=e.cacheWrite??0):this._modelUsage.set(n,{inputTokens:e.inputTokens,outputTokens:e.outputTokens,cacheRead:e.cacheRead??0,cacheCreation:e.cacheWrite??0,mediaCalls:0,mediaDurationSeconds:0,mediaCharacters:0}),this.notifyListeners()}addMediaUsage(e,n,r){let o=this._modelUsage.get(e),i=o??{inputTokens:0,outputTokens:0,cacheRead:0,cacheCreation:0,mediaCalls:0,mediaDurationSeconds:0,mediaCharacters:0};switch(o||this._modelUsage.set(e,i),i.mediaCalls+=1,n){case"per_second":i.mediaDurationSeconds+=r;break;case"per_character":i.mediaCharacters+=r;break;case"per_token":i.outputTokens+=r;break}this.notifyListeners()}recordToolCall(){this._toolCallCount++}recordTurnCompleted(){this._turnCount++}createSnapshot(){return{sessionId:this.sessionId,modelUsage:this.getAllModelUsage(),totalInputTokens:this._totalInputTokens,totalOutputTokens:this._totalOutputTokens,turnCount:this._turnCount,lastSavedAt:Date.now()}}restoreFromSnapshot(e){if(e.sessionId!==this.sessionId)return!1;this._totalInputTokens=e.totalInputTokens,this._totalOutputTokens=e.totalOutputTokens,this._turnCount=e.turnCount,this._modelUsage.clear();for(let[n,r]of Object.entries(e.modelUsage))this._modelUsage.set(n,{...r});return this.notifyListeners(),!0}onStateChange(e){return this._listeners.add(e),()=>{this._listeners.delete(e)}}notifyListeners(){for(let e of this._listeners)try{e()}catch{}}};He();Ke();import*as EK from"node:fs";import*as zC from"node:path";var Yi=class{getSessionsRoot(e){let n=re(e);if(!n)throw new Error(`Project not found: ${e}`);return ee().getProjectSessionDataRoot(n.workspaceDir)}getProjectWorkspaceDir(e){let n=re(e);if(!n)throw new Error(`Project not found: ${e}`);return n.workspaceDir}getSessionDir(e,n){return zC.join(this.getSessionsRoot(e),n)}resolveWorkspaceDir(e,n){if(n){let o=re(n);if(o)return o.workspaceDir}let r=fe();for(let o of r){let i=ee().getProjectSessionDataRoot(o.workspaceDir),s=zC.join(i,e);try{if(EK.existsSync(s))return o.workspaceDir}catch{}}return this.getActiveProjectWorkspaceDir()}getActiveProjectWorkspaceDir(){let e=Me();if(e)return e.workspaceDir;let n=fe();if(n.length>0)return n[0].workspaceDir;throw new Error("No active project available")}getActiveProjectId(){let e=Me();if(e)return e.id;let n=fe();if(n.length>0)return n[0].id;throw new Error("No active project available")}getDefaultProjectId(){let e=Ep();if(e)return e.id;throw new Error("No default project available")}};ni();jt();import{randomUUID as MK}from"node:crypto";async function DK(t,e){let n=new Date(t.lastActiveAt).getTime();if(Date.now()-n<$M)return{split:!1,activeSessionId:t.sessionId};let i=MK(),s=new Date().toISOString();await vt(t.sessionId,{sealedAt:s},e);let a=t.taskSummary?`[\u4E0A\u4E00\u8F6E\u5BF9\u8BDD\u6458\u8981] ${t.taskSummary}`:void 0;return await vt(i,{sessionId:i,projectId:t.projectId,type:"group",ownerId:t.ownerId,groupKey:t.groupKey,groupName:t.groupName,groupPlatform:t.groupPlatform,previousSessionId:t.sessionId,carryoverSummary:a},e),{split:!0,activeSessionId:i,sealedSessionId:t.sessionId}}async function $K(t,e){if(t.type!=="group")return{split:!1,activeSessionId:t.sessionId};if(t.turnCount<NM)return{split:!1,activeSessionId:t.sessionId};let n=MK(),r=new Date().toISOString();await vt(t.sessionId,{sealedAt:r},e);let o=t.taskSummary?`[\u4E0A\u4E00\u8F6E\u5BF9\u8BDD\u6458\u8981 \u2014 \u56E0\u6D88\u606F\u6570\u8FBE\u5230\u4E0A\u9650\u81EA\u52A8\u5207\u5206] ${t.taskSummary}`:void 0;return await vt(n,{sessionId:n,projectId:t.projectId,type:"group",ownerId:t.ownerId,groupKey:t.groupKey,groupName:t.groupName,groupPlatform:t.groupPlatform,previousSessionId:t.sessionId,carryoverSummary:o},e),{split:!0,activeSessionId:n,sealedSessionId:t.sessionId}}le();an();import*as Gu from"node:fs";import*as la from"node:path";Ke();var Wy=class{constructor(e=new Yi,n=ee()){this.locator=e;this.pathService=n}locator;pathService;getActiveProjectId(){return this.locator.getActiveProjectId()}getDefaultProjectId(){return this.locator.getDefaultProjectId()}getProjectWorkspaceDir(e){return this.locator.getProjectWorkspaceDir(e)}resolveWorkspaceDir(e,n){return this.locator.resolveWorkspaceDir(e,n)}async listThreads(e,n){let r=n??this.getActiveProjectId(),o=this.getProjectWorkspaceDir(r);return(await cn(e,o)).map(s=>({id:s.sessionId,title:s.title,status:"active",turnCount:s.messageCount,createdAt:s.createdAt,lastActiveAt:s.lastActiveAt}))}getHostSessionWorkspaceDirs(e,n=[]){return BRe([e.getActiveProjectRoot(),...zRe()]).filter(r=>!n.some(o=>NK(o,r)))}async listHostWorkspaceSessions(e,n,r=[]){let o=this.getHostSessionWorkspaceDirs(e,r);return(await Promise.all(o.map(s=>cn(n,s)))).flat()}resolveSessionWorkspaceDir(e,n,r){let o;for(let i of this.getHostSessionWorkspaceDirs(e)){if(hD(n,i))return i;let s=la.join(this.pathService.getProjectSessionDataRoot(i),HRe(n));try{if(!Gu.existsSync(s))continue;o??=i;let a=la.join(s,"transcript.jsonl");if(Gu.existsSync(a)&&Gu.statSync(a).size>0)return i}catch{}}return o||(r?this.resolveWorkspaceDir(n,r):this.resolveWorkspaceDir(n))}};function HRe(t){return t.replace(/[^a-zA-Z0-9_-]/g,"_")}function zRe(){return[]}function NK(t,e){return la.resolve(t).toLowerCase()===la.resolve(e).toLowerCase()}function BRe(t){let e=[];for(let n of t){let r=n?.trim();if(!r)continue;let o=la.resolve(r);e.some(i=>NK(i,o))||e.push(o)}return e}var qRe=new Yi,wn=new Wy(qRe);function mr(t,e="Unknown error"){return t instanceof Error?t.message:e}var WRe=/Uploaded attachment references:|\[标注元素\]|\[标注区域\]|\[附件\]\s*(?:图片|视频|音频|文件)\d/;function GRe(t){for(let e of t)if(e.role==="user"&&typeof e.content=="string"&&WRe.test(e.content))return!0;return!1}function cl(t,e,n){return wn.resolveSessionWorkspaceDir(t,e,n)}function LK(t,e){let n=t.messageCount??0,r=e.messageCount??0;return r!==n?r>n?e:t:e.lastActiveAt!==t.lastActiveAt&&e.lastActiveAt>t.lastActiveAt?e:t}function OK(...t){let e=new Map;for(let n of t)for(let r of n){let o=e.get(r.sessionId);e.set(r.sessionId,o?LK(o,r):r)}return[...e.values()].sort((n,r)=>n.lastActiveAt>r.lastActiveAt?-1:n.lastActiveAt<r.lastActiveAt?1:0)}async function KRe(t){let e=null;for(let n of fe()){if(!n.workspaceDir)continue;let o=(await cn(500,n.workspaceDir)).find(s=>s.sessionId===t);if(!o)continue;let i={entry:o,projectId:o.projectId??n.id,workspaceDir:n.workspaceDir};(!e||LK(e.entry,o)===o)&&(e=i)}return e}async function jK(t,e,n){return wn.listHostWorkspaceSessions(t,e,n)}async function VRe(t){let e=new Set,n=[...new Set(t.map(r=>Vo.resolve(r).toLowerCase()))];return await Promise.all(n.map(async r=>{for(let o of await yD(r))e.add(o)})),e}function UK(t){let e=t.params,n=e?.id??BC();this.log(`[thread.create] id=${n} title=${e?.title??"(none)"}`),e?.cwd&&typeof e.cwd=="string"&&this.setActiveWorkdir(e.cwd),this.currentSessionId=n,this.sessionState=new Er(n),this.memoryPrefetchState=nr(),this.enableIdleDream(),t.id!==void 0&&this.sendResponse(t.id,{id:n,title:e?.title,status:"active",createdAt:new Date().toISOString()})}async function FK(t){let e=t.params,n=e?.limit??20;try{let r=await wn.listThreads(n,e?.projectId);t.id!==void 0&&this.sendResponse(t.id,{threads:r})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to list threads: ${mr(r)}`})}}async function HK(t){let e=t.params,n=e?.sessionId??BC();try{let r=e?.projectId??wn.getActiveProjectId(),o=wn.getProjectWorkspaceDir(r);await vt(n,{sessionId:n,title:e?.title,type:e?.type,ownerPlatform:e?.ownerPlatform,ownerId:e?.ownerId,groupKey:e?.groupKey,groupName:e?.groupName,groupPlatform:e?.groupPlatform,projectId:r},o),t.id!==void 0&&this.sendResponse(t.id,{sessionId:n,title:e?.title})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to create session: ${mr(r)}`})}}async function zK(t){let e=t.params;if(t.id===void 0)return;let n=e?.platform??"desktop",r=e?.chatId,o=e?.chatType,i=e?.userId??"local";try{if(n==="desktop"&&r){let p=e?.projectId??wn.getActiveProjectId(),m=wn.getProjectWorkspaceDir(p),f=await KRe(r);if(f){let g=Kt(r,f.workspaceDir),h=g?.projectId??f.projectId;this.sendResponse(t.id,{sessionId:r,title:g?.title??f.entry.title,type:g?.type??f.entry.type??"personal",agentId:g?.agentId,ownerPlatform:g?.ownerPlatform,ownerId:g?.ownerId??i,groupKey:g?.groupKey,groupPlatform:g?.groupPlatform,groupName:g?.groupName,projectId:h});return}await vt(r,{sessionId:r,type:"personal",ownerPlatform:n==="desktop"?void 0:n,ownerId:i,projectId:p},m),this.sendResponse(t.id,{sessionId:r,type:"personal",ownerPlatform:n==="desktop"?void 0:n,ownerId:i,projectId:p});return}if(o==="group"&&r&&n){let p=`group:${n}:${r}`,m=fe();for(let f of m){if(!f.workspaceDir)continue;let h=(await cn(500,f.workspaceDir)).find(y=>y.groupKey===p&&!y.sealedAt&&!y.archivedAt);if(h){let y=Kt(h.sessionId,f.workspaceDir);if(y){let b=await DK(y,f.workspaceDir);if(b.split){this.sendResponse(t.id,{sessionId:b.activeSessionId,title:void 0,type:"group",ownerPlatform:y.ownerPlatform,ownerId:i,groupKey:p,groupPlatform:n,groupName:e?.groupName,projectId:f.id,previousSessionId:b.sealedSessionId});return}}this.sendResponse(t.id,{sessionId:h.sessionId,title:h.title,type:"group",ownerPlatform:y?.ownerPlatform,ownerId:i,groupKey:p,groupPlatform:n,groupName:e?.groupName,projectId:f.id});return}}}if(o!=="group"&&n!=="desktop"&&i){let p=e?.projectId?re(e.projectId):Ep(),m=p?[p]:[];for(let f of m){if(!f.workspaceDir)continue;let g=await cn(500,f.workspaceDir);for(let h of g){if(h.type!=="personal"||h.sealedAt||h.archivedAt)continue;let y=Kt(h.sessionId,f.workspaceDir);if(!y?.archivedAt&&!(y?.ownerPlatform!==n||y.ownerId!==i)){this.sendResponse(t.id,{sessionId:y.sessionId,title:y.title??h.title,type:"personal",ownerPlatform:y.ownerPlatform,ownerId:y.ownerId,projectId:y.projectId??f.id});return}}}}let s=BC(),a=e?.projectId??wn.getDefaultProjectId(),c=wn.getProjectWorkspaceDir(a),l=o==="group"?`group:${n}:${r}`:void 0,d=JRe(e?.title);await vt(s,{sessionId:s,title:d,type:o==="group"?"group":"personal",ownerPlatform:o==="group"||n==="desktop"?void 0:n,ownerId:i,groupKey:l,groupPlatform:o==="group"?n:void 0,groupName:e?.groupName,projectId:a},c),this.sendResponse(t.id,{sessionId:s,title:d,type:o==="group"?"group":"personal",ownerPlatform:o==="group"||n==="desktop"?void 0:n,ownerId:i,groupKey:l,groupPlatform:o==="group"?n:void 0,groupName:e?.groupName,projectId:a})}catch(s){this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to resolve session: ${mr(s)}`})}}function JRe(t){return Ml(t,{maxLength:40})}async function BK(t){let e=t.params,n=e?.limit??50;try{let r,o=new Set;if(e?.projectId){let a=re(e.projectId);if(!a){t.id!==void 0&&this.sendResponse(t.id,{sessions:[]});return}let c=a.workspaceDir;o.add(c),r=await cn(n*2,c);let l=await jK(this,n*2,[c]);for(let d of wn.getHostSessionWorkspaceDirs(this,[c]))o.add(d);r=OK(r,l.filter(d=>d.projectId===e.projectId)),r=r.filter(d=>d.projectId===e.projectId);for(let d of r)d.projectId=e.projectId}else{let a=fe(),c=[],l=[];for(let p of a){if(!p.workspaceDir)continue;l.push(p.workspaceDir),o.add(p.workspaceDir);let m=await cn(n,p.workspaceDir);for(let f of m)f.projectId&&c.push(f)}let d=(await jK(this,n,l)).filter(p=>p.projectId);for(let p of wn.getHostSessionWorkspaceDirs(this,l))o.add(p);r=OK(c,d)}let i=await VRe([...o]);i.size>0&&(r=r.filter(a=>!i.has(a.sessionId))),e?.archived===!0?r=r.filter(a=>a.archivedAt!=null):e?.archived===!1&&(r=r.filter(a=>a.archivedAt==null));let s=r.slice(0,n).map(a=>({sessionId:a.sessionId,title:a.title,type:a.type??"personal",agentId:a.agentId,lastActiveAt:a.lastActiveAt,messageCount:a.messageCount,pinnedAt:a.pinnedAt??null,archivedAt:a.archivedAt??null,sealedAt:a.sealedAt??null,projectId:a.projectId,previousSessionId:a.previousSessionId??null,carryoverSummary:a.carryoverSummary??null}));t.id!==void 0&&this.sendResponse(t.id,{sessions:s})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to list sessions: ${mr(r)}`})}}async function qK(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let n=cl(this,e.sessionId,e.projectId),o=(await cn(500,n)).find(i=>i.sessionId===e.sessionId);t.id!==void 0&&this.sendResponse(t.id,{session:o?{sessionId:o.sessionId,title:o.title,type:o.type,lastActiveAt:o.lastActiveAt,messageCount:o.messageCount,pinnedAt:o.pinnedAt??null,archivedAt:o.archivedAt??null,projectId:o.projectId}:null})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to get session: ${mr(n)}`})}}async function WK(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let n=cl(this,e.sessionId,e.projectId),r=await Fr(e.sessionId,n,{includeDisplayMetadata:!0});if(!r){t.id!==void 0&&this.sendResponse(t.id,{messages:[],total:0});return}let o=r.messages;if(GRe(o)){this.log(`[session] purging legacy baked-attachment session ${e.sessionId} (VS Code two-line cutover)`);try{await vt(e.sessionId,{archivedAt:new Date().toISOString()},n)}catch{}t.id!==void 0&&this.sendResponse(t.id,{messages:[],total:0});return}let i=e.limit&&e.limit>0?e.limit:o.length,s=o.slice(-i);t.id!==void 0&&this.sendResponse(t.id,{messages:s,total:o.length})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to get messages: ${mr(n)}`})}}async function GK(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let n=cl(this,e.sessionId,e.projectId),r=await vt(e.sessionId,{...e.title!==void 0?{title:e.title}:{},...e.pinnedAt!==void 0?{pinnedAt:e.pinnedAt}:{},...e.archivedAt!==void 0?{archivedAt:e.archivedAt}:{}},n);r&&this.sendNotification("session.info",{sessionId:e.sessionId,title:r.title,pinnedAt:r.pinnedAt??null,archivedAt:r.archivedAt??null,projectId:e.projectId||void 0}),t.id!==void 0&&this.sendResponse(t.id,{ok:r!==null})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to update session: ${mr(n)}`})}}async function KK(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: sessionId"});return}if(!e.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: projectId"});return}try{let n=cl(this,e.sessionId,e.projectId);await Fp(e.sessionId,n),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to delete session: ${mr(n)}`})}}async function VK(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: projectId"});return}try{let n=wn.getProjectWorkspaceDir(e.projectId),r=(await cn(1e4,n)).filter(i=>i.projectId===e.projectId),o=0;for(let i of r)await Fp(i.sessionId,n),o++;t.id!==void 0&&this.sendResponse(t.id,{ok:!0,deletedCount:o})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to delete all sessions: ${mr(n)}`})}}async function JK(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let n=cl(this,e.sessionId,e.projectId);await vt(e.sessionId,{archivedAt:new Date().toISOString()},n),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to archive session: ${mr(n)}`})}}async function ZK(t){let e=t.params,n=e?.sessionId;if(!n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"sessionId is required"});return}try{let r=cl(this,n,e?.projectId),o=await Fr(n,r);if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:`Session not found: ${n}`});return}o.messages&&o.messages.length>0&&this.sessionHistory.saveResumedSession(n,o.messages),t.id!==void 0&&this.sendResponse(t.id,{metadata:o.metadata,messages:o.messages})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to resume session: ${mr(r)}`})}}function XK(t){let e=this.currentSessionId||"default",n=this.sessionState?.createSnapshot(),r,o=this.getActiveProjectRoot();o&&(r=Vo.join(oi(o),e));let i={sessionId:e,model:this.currentModel||void 0,cwd:process.cwd(),paths:{sessionDir:r,agentHome:_e(),settings:In()},usage:n?{turnCount:n.turnCount,inputTokens:n.totalInputTokens,outputTokens:n.totalOutputTokens}:void 0};t.id!==void 0&&this.sendResponse(t.id,i)}function YK(t){let e=t.params,n=null;if(e?.projectId)n=re(e.projectId);else if(e?.projectName){let i=fe(),s=e.projectName.toLowerCase();if(n=i.find(a=>a.name.toLowerCase()===s)??null,n||(n=i.find(a=>a.name.toLowerCase().includes(s))??null),!n){let a=i.map(c=>c.name).slice(0,10);t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`No project matching "${e.projectName}". Available: ${a.join(", ")||"(none)"}`});return}}else{t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: projectId or projectName"});return}if(!n||n.status!=="active"){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Project not found or archived: ${e.projectId??e.projectName}`});return}let r=e.workspaceDir??n.workspaceDir;if(!Sn.existsSync(r)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Workspace directory does not exist: ${r}`});return}let o=ko(n.id);if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:"Switch failed"});return}this.setActiveWorkdir(o.workspaceDir),this.sendNotification("project.switched",{id:o.id,name:o.name,workspaceDir:o.workspaceDir}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,project:o})}function QK(t){let e=Me(),n=fe();t.id!==void 0&&this.sendResponse(t.id,{sessionId:this.currentSessionId,activeProject:e,projects:n})}async function eV(t){let e=t.params,n=e?.sessionId;if(!n){t.id!==void 0&&this.sendResponse(t.id,{ok:!1});return}let r=fe();for(let o of r)try{let i=wn.getProjectWorkspaceDir(o.id),s=await Kt(n,i);if(s&&s.projectId===o.id){ko(o.id),this.setActiveWorkdir(i),this.log(`[session.focus] switched to project ${o.id} for session ${n}`),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,projectId:o.id});return}}catch{}if(e?.projectName){let o=r.find(i=>i.name===e.projectName);if(o){let i=wn.getProjectWorkspaceDir(o.id);this.getActiveProjectRoot()!==i&&(this.setActiveWorkdir(i),this.log(`[session.focus] switched to project ${o.id} by name "${e.projectName}"`)),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,projectId:o.id});return}}t.id!==void 0&&this.sendResponse(t.id,{ok:!1})}async function tV(t){let e=t.params,{sessionId:n,fromProjectId:r,toProjectId:o}=e??{};if(!n||!r||!o){t.id!==void 0&&this.sendError(t.id,w.INVALID_PARAMS,"sessionId, fromProjectId, and toProjectId are required");return}if(r===o){t.id!==void 0&&this.sendResponse(t.id,{ok:!0});return}let i=re(r),s=re(o);if(!i||!s){t.id!==void 0&&this.sendError(t.id,w.INVALID_PARAMS,"Source or target project not found");return}let a=Vo.join(oi(r),n),c=Vo.join(oi(o),n);if(!Sn.existsSync(a)){t.id!==void 0&&this.sendError(t.id,w.INVALID_PARAMS,`Session ${n} not found in project ${r}`);return}try{Sn.mkdirSync(Vo.dirname(c),{recursive:!0}),Sn.cpSync(a,c,{recursive:!0});let l=Vo.join(c,"metadata.json");if(Sn.existsSync(l)){let d=JSON.parse(Sn.readFileSync(l,"utf-8"));d.projectId=o,Sn.writeFileSync(l,JSON.stringify(d,null,2))}Sn.rmSync(a,{recursive:!0,force:!0}),this.sendNotification("session-update",{sessionId:n,projectId:o}),this.log(`[session.moveToProject] moved ${n}: ${r} -> ${o}`),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,projectId:o})}catch(l){let d=mr(l);this.log(`[session.moveToProject] error: ${d}`),t.id!==void 0&&this.sendError(t.id,w.INTERNAL_ERROR,`Move failed: ${d}`)}}ut();import{spawn as ZRe}from"node:child_process";function XRe(){return process.platform==="win32"?[{command:"powershell.exe",args:["-NoProfile","-Command","[Console]::In.ReadToEnd() | Set-Clipboard"]},{command:"pwsh.exe",args:["-NoProfile","-Command","[Console]::In.ReadToEnd() | Set-Clipboard"]}]:process.platform==="darwin"?[{command:"pbcopy",args:[]}]:[{command:"wl-copy",args:[]},{command:"xclip",args:["-selection","clipboard"]},{command:"xsel",args:["--clipboard","--input"]}]}function YRe(t,e){return new Promise((n,r)=>{let o=ZRe(t.command,t.args,{stdio:["pipe","ignore","pipe"],windowsHide:!0}),i="",s=setTimeout(()=>{o.kill(),r(new Error("Clipboard command timed out"))},3e3);o.stderr?.on("data",a=>{i+=String(a)}),o.on("error",a=>{clearTimeout(s),r(a)}),o.on("close",a=>{if(clearTimeout(s),a===0){n();return}r(new Error(i.trim()||`Clipboard command exited with code ${a}`))}),o.stdin.end(e)})}async function QRe(t){let e;for(let r of XRe())try{await YRe(r,t);return}catch(o){e=o}let n=e instanceof Error?e.message:"No clipboard command available";throw new Error(`System clipboard unavailable: ${n}`)}function eTe(t){return t.length<=8?"****":`${t.slice(0,3)}***${t.slice(-4)}`}function at(t,e,n,r=w.INTERNAL_ERROR){if(e.id!==void 0){if(typeof t.sendError=="function"){t.sendError(e.id,r,n);return}t.sendResponse(e.id,void 0,{code:r,message:n})}}function WC(t,e){at(t,e,Hl)}function tTe(t){let e={};for(let n of t)for(let r of n.routeIntents)e[r]??=[],e[r].push(n);return e}async function nTe(){let t=V(),e=await Ia(t);return Bl(t),t.save(),e}async function rTe(t){try{return await nTe(),!0}catch(e){if(t)throw e;return!1}}function rV(t=V()){return YD()}function GC(t){return t.id===bt?bt:t.group?.trim()||t.id}function oTe(t){return t.id===GC(t)}function nV(t){let e=GC(t);return om({...t,id:e})}function iTe(t){return{volcengine:"\u5E38\u89C4 Ark API Key","volcengine-plan":"\u8BA2\u9605 / Plan \u901A\u9053",qwen:"\u5E38\u89C4 DashScope API Key","qwen-coding":"Coding Plan \u901A\u9053",zhipu:"Anthropic \u901A\u9053","zhipu-openai":"OpenAI \u517C\u5BB9\u901A\u9053","zhipu-coding":"Coding \u901A\u9053"}[t.id]??om(t)}function sTe(t){return t.authType==="none"?!1:t.apiKeyEnvVars===void 0||t.apiKeyEnvVars.length>0}function aTe(t){return{id:t.id,displayName:iTe(t),baseUrl:si(t)??"",modelCount:t.models?.length??0}}function cTe(t){let e=new Map;for(let n of t){if(!sTe(n))continue;let r=GC(n);if(r===bt)continue;let o=n.models?.length??0,i=aTe(n),s=e.get(r);if(!s){e.set(r,{id:r,displayName:nV(n),baseUrl:si(n)??"",modelCount:o,variants:[i]});continue}s.modelCount+=o,s.variants??=[],s.variants.some(a=>a.id===i.id)||s.variants.push(i),oTe(n)&&(s.displayName=nV(n),s.baseUrl=si(n)??s.baseUrl)}return Array.from(e.values()).map(({variants:n,...r})=>({...r,...n&&n.length>1?{variants:n}:{}}))}async function oV(){if(V().isHydratedFromUpstream())return!0;let t=await rTe(!1);return t&&V().markHydratedFromUpstream(),t}function iV(){V().markHydratedFromUpstream()}function lTe(t){return t.defaultModel??t.models?.find(e=>!!e.id)?.id}function dTe(t){return[...new Set(t)]}function uTe(t){let e=t.replace(/\/+$/,"");return dTe([`${e}/models`,/\/v\d+$/.test(e)?`${e}/models`:`${e}/v1/models`])}function pTe(t){return t===404||t===405||t===410||t===501}async function mTe(t){let e=await Uk(t);if(e)return{id:e.id,transport:e.transport,baseUrl:si(e),authType:e.authType,models:e.models}}function qC(t){return{accept:"application/json",Authorization:`Bearer ${t}`}}function fTe(t,e,n,r){if(t===bt)return[{method:"GET",url:jk(n),headers:qC(e)}];let o=gTe(n,r).replace(/\/+$/,""),i=r?.transport,s=lTe(r??{id:t}),a=[];if(i==="anthropic-messages")return/\/anthropic$/.test(o)&&a.push({method:"GET",url:`${o.replace(/\/anthropic$/,"")}/models`,headers:qC(e)}),s&&a.push({method:"POST",url:`${o}/v1/messages`,headers:{"Content-Type":"application/json","x-api-key":e,"anthropic-version":"2023-06-01"},body:{model:s,messages:[{role:"user",content:"ping"}],max_tokens:1,stream:!1}}),a;if(i==="gemini-generatecontent")return s?[{method:"POST",url:`${o}/models/${encodeURIComponent(s)}:generateContent`,headers:{"Content-Type":"application/json","x-goog-api-key":e},body:{contents:[{role:"user",parts:[{text:"ping"}]}],generationConfig:{maxOutputTokens:1}}}]:a;if(i==="volcengine-responses")return s?[{method:"POST",url:`${o.replace(/\/v\d+$/,"")}/v3/responses`,headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:{model:s,input:[{role:"user",content:[{type:"input_text",text:"ping"}]}],max_output_tokens:1,stream:!1,store:!1}}]:a;for(let c of uTe(o))a.push({method:"GET",url:c,headers:qC(e)});return a}function gTe(t,e){let n=t.trim(),r=e?.baseUrl?.trim();return e?.transport==="anthropic-messages"&&r&&/\/anthropic\/?$/.test(r)&&!/\/anthropic\/?$/.test(n)?r:n}async function hTe(t){try{let e=await fetch(t.url,{method:t.method,headers:t.headers,body:t.body?JSON.stringify(t.body):void 0,signal:AbortSignal.timeout(1e4)});if(e.ok)return{valid:!0,status:e.status,url:t.url};let n=await e.text().catch(()=>"");return{valid:!1,status:e.status,error:n.slice(0,500),url:t.url}}catch(e){return{valid:!1,status:0,error:e instanceof Error?e.message:String(e),url:t.url}}}async function sV(t,e,n){let r=await mTe(t),o=fTe(t,e,n,r);if(o.length===0)return{valid:!1,status:0,error:`No validation probe is available for provider "${t}".`};let i;for(let s of o){let a=await hTe(s);if(a.valid)return a;if(pTe(a.status)){i=a;continue}return a}return i??{valid:!1,status:0,error:`No validation probe succeeded for provider "${t}".`}}async function yTe(t,e,n){let r=await sV(t,e,n);if(!r.valid){let o=r.error?`: ${r.error}`:"";throw new Error(`API Key validation failed (${r.status})${o}`)}}async function aV(t){try{let e=await zl(),n=e.find(o=>o.id===bt);if(!n)throw new Error(Hl);let r=cTe(e);r.unshift({id:bt,displayName:Ok,baseUrl:si(n)??rV(),modelCount:e.reduce((o,i)=>o+(i.models?.length??0),0)}),t.id!==void 0&&this.sendResponse(t.id,{providers:r})}catch(e){at(this,t,e instanceof Error?e.message:String(e))}}async function cV(t){let e=t.params;if(!e?.providerId||!e?.key){at(this,t,"Required: providerId (string), key (string)",w.INVALID_PARAMS);return}let{providerId:n,key:r,label:o}=e,i=V(),s,a=!1;try{let c=await kV(n);if(!c){at(this,t,`Unknown provider: ${n}`,w.INVALID_PARAMS);return}let l=i.getProviderStatus(n);if(l?.keys.some(p=>p.key===r)){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,error:"\u8BE5 Key \u5DF2\u5B58\u5728\uFF0C\u65E0\u9700\u91CD\u590D\u6DFB\u52A0"});return}a=!l;let d=l?.keys.map(p=>p.id)??[];if(i.addProvider(n,{baseUrl:c}),s=i.addKey(n,r,{label:o}),n===bt){if((await o0(i,{baseUrl:c,apiKey:r})).length===0)throw new Error("LLMRouter did not return any available models for this API Key.")}else await yTe(n,r,c);await Ia(i),iV();for(let p of Ul)if(!i.getBinding(p)){let m=i.listModels({purpose:p,provider:n,enabledOnly:!0});m.length===0&&(m=i.listModels({purpose:p,provider:n}),m[0]&&i.enableModel(m[0].id)),m.length>0&&i.setBinding(p,m[0].id)}if(i.setKeyHealth(s,"healthy"),e.replaceExisting===!0)for(let p of d)i.updateKey(p,{enabled:!1});i.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,keyId:s,providerId:n})}catch(c){s&&(i.removeKey(s),a&&i.removeProvider(n));let l=c instanceof Error?c.message:Hl;at(this,t,l)}}function lV(t){let e=t.params;if(!e?.keyId){at(this,t,"Required: keyId (string)",w.INVALID_PARAMS);return}let n=V();if(!n.removeKey(e.keyId)){at(this,t,"API Key not found",w.INVALID_PARAMS);return}n.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}function dV(t){let e=t.params;if(!e?.keyId){at(this,t,"Required: keyId (string)",w.INVALID_PARAMS);return}let n=V().getKeyById(e.keyId);if(!n){at(this,t,"API Key not found",w.INVALID_PARAMS);return}t.id!==void 0&&this.sendResponse(t.id,{key:n})}async function uV(t){let e=t.params;if(!e?.keyId){at(this,t,"Required: keyId (string)",w.INVALID_PARAMS);return}let n=V().getKeyById(e.keyId);if(!n){at(this,t,"API Key not found",w.INVALID_PARAMS);return}try{await(this.writeClipboard?this.writeClipboard(n):QRe(n)),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(r){let o=r instanceof Error?r.message:"\u590D\u5236 Key \u5931\u8D25";at(this,t,o)}}function pV(t){let e=t.params;if(!e?.keyId||typeof e.enabled!="boolean"){at(this,t,"Required: keyId (string), enabled (boolean)",w.INVALID_PARAMS);return}let n=V();if(!n.updateKey(e.keyId,{enabled:e.enabled})){at(this,t,"API Key not found",w.INVALID_PARAMS);return}n.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}function mV(t){let e=t.params;if(!e?.modelId||typeof e.enabled!="boolean"){at(this,t,"Required: modelId (string), enabled (boolean)",w.INVALID_PARAMS);return}let n=V();e.enabled?n.enableModel(e.modelId):n.disableModel(e.modelId),n.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}async function fV(t){let e=t.params;try{await oV();let n=V(),r=new Set(n.getAllProviderStatus().filter(i=>i.keys.length>0).map(i=>i.providerId)),o=n.listModels({purpose:e?.purpose,provider:e?.provider}).filter(i=>n.hasConfiguredKeyForProviderVariant(i.provider));t.id!==void 0&&this.sendResponse(t.id,{models:o,grouped:tTe(o),configuredProviderIds:[...r]})}catch{WC(this,t)}}function gV(t){let e=t.params;if(!e?.purpose||!e?.modelId){at(this,t,"Required: purpose (string), modelId (string)",w.INVALID_PARAMS);return}try{let n=V();n.setBinding(e.purpose,e.modelId),n.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(n){at(this,t,n instanceof Error?n.message:String(n),w.INVALID_PARAMS)}}function hV(t){let e=t.params;if(!e?.purpose){at(this,t,"Required: purpose (string)",w.INVALID_PARAMS);return}let n=V(),r=n.getBinding(e.purpose);t.id!==void 0&&this.sendResponse(t.id,{model:r?{id:r.id,provider:r.provider,model:r.model,displayName:r.displayName,routeIntents:r.routeIntents,capabilityProfile:r.capabilityProfile,enabled:r.enabled}:null,available:n.isAvailable(e.purpose)})}async function yV(t){try{await oV();let e=V(),n=e.getAllProviderStatus().map(i=>({providerId:i.providerId,displayName:i.providerId===bt?Ok:i.providerId,baseUrl:i.baseUrl,keyCount:i.keys.length,healthyKeys:i.keys.filter(s=>s.healthStatus==="healthy"&&s.enabled).length,totalKeys:i.keys.length,keys:i.keys.map(s=>({id:s.id,label:s.label,maskedKey:eTe(s.key),enabled:s.enabled,health:s.healthStatus}))})),r=e.getAllBindings(),o={};for(let i of Ul){let s=r[i];o[i]={bound:!!s,modelId:s?.id,modelName:s?.displayName,available:e.isAvailable(i)}}t.id!==void 0&&this.sendResponse(t.id,{providers:n,purposes:o})}catch{WC(this,t)}}async function vV(t){try{let e=V();e.load(),await Ia(e,void 0,{force:!0}),Bl(e),e.save(),iV(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,catalogRefreshed:!0})}catch{WC(this,t)}}async function bV(t){let e=t.params;if(!e?.providerId||!e?.apiKey){at(this,t,"providerId and apiKey required",w.INVALID_PARAMS);return}try{let n=e.baseUrl||await kV(e.providerId);if(!n){at(this,t,`Unknown provider: ${e.providerId}`,w.INVALID_PARAMS);return}let r=await sV(e.providerId,e.apiKey,n);t.id!==void 0&&this.sendResponse(t.id,r)}catch(n){let r=n instanceof Error?n.message:String(n);t.id!==void 0&&this.sendResponse(t.id,{valid:!1,status:0,error:r})}}async function kV(t){if(t===bt)return rV();let e=await Uk(t);return e?si(e):void 0}le();import*as KC from"node:fs";import*as wV from"node:path";xa();le();function Gy(t){let e=Ve(ce());return Jd(t).map(n=>vTe(n,e))}function vTe(t,e){let n=jz(e,t.name),r=n?.registryVersion;return{id:t.name,name:t.name,path:t.baseDir,active:t.active,globallyDisabled:t.globallyDisabled,projectDisabled:t.projectDisabled,category:t.category,author:t.author,...n?.source?{source:n.source}:{},displayName:bTe(t.name),displayDescription:kTe(t.name,t.description),fallbackName:t.name,fallbackDescription:t.description??"",systemGenerated:t.systemGenerated,version:t.version,...r?{registryVersion:r}:{},description:t.description}}function bTe(t){return{key:`capability.skill.${t}.name`,fallback:t}}function kTe(t,e){return{key:`capability.skill.${t}.description`,fallback:e??""}}function wTe(t){return t==="active"||t==="stale"||t==="archived"}function SV(t){let n=t.params?.projectId,r=this.getActiveProjectRoot();if(n&&this.projectLocator){let i=this.projectLocator.resolveProjectRoot(n);i&&(r=i)}let o=Gy(r);t.id!==void 0&&this.sendResponse(t.id,{skills:o})}function xV(t){let n=t.params?.name;if(!n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: name"});return}if(!Ln(n)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Skill "${n}" not found`});return}let r=Cn(n,!1),o=ce(),i=Ve(o),s=Fn(i,n);s.state!=="active"&&(s.state="active",s.staleAt=void 0,s.archivedAt=void 0),st(o,i),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,already:!r}),this.sendNotification("skills.updated",{action:"activate",name:n})}function RV(t){let n=t.params?.name;if(!n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: name"});return}let r=Cn(n,!0);t.id!==void 0&&this.sendResponse(t.id,{ok:!0,already:!r}),this.sendNotification("skills.updated",{action:"deactivate",name:n})}async function TV(t){let n=t.params?.name;if(!n||/[\/\\]|\.\./.test(n)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing or invalid skill name"});return}let r=ce(),o=Ve(r);if(o.records[n]?.pinned){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:`Skill "${n}" is pinned. Unpin it first.`});return}let i=Ln(n);if(!i){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Skill "${n}" not found in skill store`});return}let s=i.baseDir;try{KC.rmSync(s,{recursive:!0,force:!0}),th(o,n),Cn(n,!1),st(r,o),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,deleted:n}),this.sendNotification("skills.updated",{action:"delete",name:n})}catch(a){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to delete skill: ${a instanceof Error?a.message:a}`})}}function AV(t){let n=t.params?.name;if(!n||/[\/\\]|\.\./.test(n)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing or invalid skill name"});return}if(!Ln(n)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Skill "${n}" not found in skill store`});return}let r=ce(),o=Ve(r),i=Fn(o,n);i.source="promoted",st(r,o),Cn(n,!1),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,promoted:n,scope:"global",globalPath:wV.join(Pn(),n)}),this.sendNotification("skills.updated",{action:"promote",name:n})}function PV(t){let e=t.params,n=e?.name;if(!n||typeof e?.disabled!="boolean"){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required params: name (string), disabled (boolean)"});return}let r=this.getActiveProjectRoot();if(e.projectId&&this.projectLocator){let i=this.projectLocator.resolveProjectRoot(e.projectId);i&&(r=i)}if(!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:"No project workspace to scope the skill mute to"});return}let o=JM(r,n,e.disabled);t.id!==void 0&&this.sendResponse(t.id,{ok:!0,name:n,disabled:e.disabled,changed:o}),this.sendNotification("skills.updated",{action:e.disabled?"project-mute":"project-unmute",name:n})}function IV(t){let e=t.params,n=ce(),r=Ve(n);if(e?.name){let o=Lz(r,e.name);t.id!==void 0&&this.sendResponse(t.id,{name:e.name,stats:o??null})}else{let o=Uz(r);t.id!==void 0&&this.sendResponse(t.id,{stats:o})}}function _V(t){let e=t.params;if(!e?.name){t.id!==void 0&&this.sendResponse(t.id,null,{code:-32602,message:"Missing 'name' parameter"});return}let n=ce(),r=Ve(n);Fn(r,e.name),Dz(r,e.name),st(n,r),t.id!==void 0&&this.sendResponse(t.id,{name:e.name,pinned:!0})}function CV(t){let e=t.params;if(!e?.name){t.id!==void 0&&this.sendResponse(t.id,null,{code:-32602,message:"Missing 'name' parameter"});return}let n=ce(),r=Ve(n);$z(r,e.name),st(n,r),t.id!==void 0&&this.sendResponse(t.id,{name:e.name,pinned:!1})}function EV(t){let e=ce(),n=Pn(),r=Nz(e,n);t.id!==void 0&&this.sendResponse(t.id,r)}function MV(t){let e=t.params,n=ce(),r=Ve(n);if(e?.name){let o=r.records[e.name]??null;t.id!==void 0&&this.sendResponse(t.id,{record:o})}else if(e?.state){if(!wTe(e.state)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Invalid skill lifecycle state"});return}let o=Oz(r,e.state);t.id!==void 0&&this.sendResponse(t.id,{records:o})}else t.id!==void 0&&this.sendResponse(t.id,{records:Object.values(r.records)})}import*as UV from"node:path";He();import{randomUUID as PTe}from"node:crypto";import*as LV from"node:path";import{join as VC}from"node:path";import{mkdir as STe,readdir as xTe}from"node:fs/promises";Ke();function RTe(t){return t?.pathService??ee()}function TTe(t,e){return t??e.getActiveProjectRoot()}function DV(t,e){let n=RTe(e);return VC(n.getProjectAgentDir(TTe(t,n)),"solos")}function JC(t,e,n){return VC(DV(e,n),t)}function $V(t,e,n){return VC(JC(t,e,n),"solo-state.json")}async function NV(t,e,n){let r=JC(t.soloId,e,n);await STe(r,{recursive:!0}),await Bt($V(t.soloId,e,n),t)}async function ATe(t,e,n){return Et($V(t,e,n))}async function OV(t,e){let n=DV(t,e),r;try{r=await xTe(n)}catch{return[]}let o=[];for(let i of r){let s=await ATe(i,t,e);s&&o.push(s)}return o}async function ZC(t,e,n){let{rm:r}=await import("node:fs/promises"),o=JC(t,e,n);try{return await r(o,{recursive:!0,force:!0}),!0}catch{return!1}}function jV(t){if(typeof t=="string")return t;if(t&&typeof t=="object"){let e=t;if(typeof e.content=="string")return e.content;if(typeof e.text=="string")return e.text}return t==null?"":JSON.stringify(t)}function ITe(t){let e=["<spec>",`\u76EE\u6807: ${t.goal}`];return t.constraints.length&&(e.push("\u7EA6\u675F:"),t.constraints.forEach((n,r)=>e.push(` ${r+1}. ${n}`))),t.acceptance.length&&(e.push("\u9A8C\u6536\u6807\u51C6(\u5FC5\u987B\u5168\u90E8\u6EE1\u8DB3):"),t.acceptance.forEach((n,r)=>e.push(` ${r+1}. ${n}`))),e.push("</spec>"),e.join(`
1121
1121
  `)}function _Te(t,e,n){let r=[];e?.rules?.length&&r.push(`<rules>
1122
1122
  ${e.rules.join(`
1123
1123
  `)}
package/dist/index.js CHANGED
@@ -724,7 +724,7 @@ ${n}
724
724
  `);A&&(C.systemPrompt=A);let _=await h.createSession(f,C);l.sessionId=_.sessionId,this.slog("info",e.memberId,"session",`new session on restart (id=${l.sessionId})`)}}catch{this.slog("warn",e.memberId,"session","session re-creation failed on restart")}this.startHeartbeat(e.memberId,C=>{this.slog("warn",C,"heartbeat","hang detected \u2014 force-killing"),this.callbacks.onNotification?.(C,"agents.error",{agentId:C,phase:"heartbeat",error:`Agent ${e.name} stopped responding`,retriesLeft:0}),this.kill(C)})}catch(l){let d=this.processes.get(e.memberId);d&&(d.handle.state="failed",d.handle.error=`Runtime restart failed: ${l instanceof Error?l.message:String(l)}`,d.handle.endedAt=Date.now()),this.callbacks.onStateChange?.(e.memberId,"failed"),this.callbacks.onNotification?.(e.memberId,"agents.error",{agentId:e.memberId,phase:"runtime",error:`Restart failed after ${r} attempts: ${l instanceof Error?l.message:String(l)}`,retriesLeft:0})}}getMcpIpcPath(e){return this.processes.get(e)?.ipcPath}heartbeatTimers=new Map;missedBeats=new Map;static HEARTBEAT_INTERVAL=3e4;static MAX_MISSED_BEATS=3;startHeartbeat(e,n){this.stopHeartbeat(e),this.missedBeats.set(e,0);let r=setInterval(async()=>{let o=this.processes.get(e);if(!o||o.handle.state==="completed"||o.handle.state==="failed"||o.handle.state==="killed"){this.stopHeartbeat(e);return}if(await this.ping(e,1e4)){this.missedBeats.set(e,0);return}let s=(this.missedBeats.get(e)??0)+1;this.missedBeats.set(e,s),this.slog("warn",e,"heartbeat",`missed (${s}/${t.MAX_MISSED_BEATS})`),s>=t.MAX_MISSED_BEATS&&(this.slog("warn",e,"heartbeat","hang detected, force-killing"),this.stopHeartbeat(e),o.handle.error=`Hang detected: ${s} consecutive heartbeat failures`,this.kill(e),n?.(e))},t.HEARTBEAT_INTERVAL);this.heartbeatTimers.set(e,r)}stopHeartbeat(e){let n=this.heartbeatTimers.get(e);n&&(clearInterval(n),this.heartbeatTimers.delete(e)),this.missedBeats.delete(e)}getMissedBeats(e){return this.missedBeats.get(e)??0}activeCount(){return[...this.processes.values()].filter(e=>e.handle.state==="starting"||e.handle.state==="ready"||e.handle.state==="running").length}remove(e){let n=this.processes.get(e);n&&(this.stopHeartbeat(e),(n.handle.state==="running"||n.handle.state==="starting"||n.handle.state==="ready")&&this.kill(e),this.processes.delete(e))}dispose(){for(let e of this.heartbeatTimers.keys())this.stopHeartbeat(e);for(let e of this.processes.values()){try{e.ipcServer?.close()}catch{}try{e.stderrStream?.end()}catch{}}this.killAll(),this.processes.clear()}};import{spawn as Mi}from"node:child_process";var aH=/[|&;><$`(){}]/;function cH(t,e){let n=e==="win32",r=e==="darwin",o=r?[t.brew,t.npm,t.pip,t.curl]:[t.npm,t.pip,t.brew,t.curl];for(let i of o){if(!i)continue;let s=aH.test(i);if(!(s&&n)&&!(i.startsWith("brew ")&&!r))return{command:i,shell:s}}return null}function lH(t,e){if(e!=="cn")return t;let n=t.trim();return/^npm\b/.test(n)&&!/(?:^|\s)--registry(?:\s|=)/.test(n)?`${n} --registry ${qd}`:/^uv\b/.test(n)&&!/(?:^|\s)--(?:default-)?index(?:-url)?(?:\s|=)/.test(n)?`${n} --default-index ${hc}`:/^(?:pipx|pip3?|python -m pip)\b/.test(n)&&!/(?:^|\s)--index-url(?:\s|=)/.test(n)?`${n} --index-url ${hc}`:n}function sH(t,e,n,r){return new Promise(o=>{let i;try{i=n(t,e)}catch(s){r({type:"log",stream:"stderr",chunk:s instanceof Error?s.message:String(s)}),o(1);return}i.stdout?.on("data",s=>r({type:"log",stream:"stdout",chunk:s.toString()})),i.stderr?.on("data",s=>r({type:"log",stream:"stderr",chunk:s.toString()})),i.on("error",s=>{r({type:"log",stream:"stderr",chunk:s.message}),o(1)}),i.on("close",s=>o(s))})}var Iue=(t,e)=>{let n=Ii();if(n&&IP(t)){let i=t.trim().split(/\s+/).slice(1);return Mi(n.nodeExe,[n.npmCli,...i],{env:_i(n),stdio:["ignore","pipe","pipe"],windowsHide:!0})}let r=_P(t)?CP():void 0;if(e||process.platform==="win32")return Mi(t,{shell:!0,...r?{env:r}:{},stdio:["ignore","pipe","pipe"],windowsHide:!0});let o=t.split(/\s+/).filter(Boolean);return Mi(o[0],o.slice(1),{...r?{env:r}:{},stdio:["ignore","pipe","pipe"]})};async function dH(t,e,n={}){let r=n.platform??process.platform,o=n.spawnImpl??Iue,i=cH(t,r);if(!i){let d=`No install command available for ${r}`;return e({type:"state",state:"failed"}),e({type:"done",ok:!1,error:d}),{ok:!1,error:d}}let s=lH(i.command,n.mirror);e({type:"state",state:"installing"});let a=await sH(s,i.shell,o,e);if(a!==0){let d=`Install command exited with code ${a}`;return e({type:"state",state:"failed"}),e({type:"done",ok:!1,error:d}),{ok:!1,error:d}}let c=t.verifyCmd??`${t.cliCommand} --version`;if(e({type:"state",state:"verifying"}),await sH(c,aH.test(c),o,e)!==0){let d=`Installed but verification failed (${t.cliCommand})`;return e({type:"state",state:"failed"}),e({type:"done",ok:!1,error:d}),{ok:!1,error:d}}return e({type:"state",state:"installed"}),e({type:"done",ok:!0}),{ok:!0}}function uH(t,e=process.platform){try{return e==="win32"?Mi("cmd.exe",["/c","start","","cmd","/k",t],{detached:!0,stdio:"ignore",windowsHide:!1}).unref():e==="darwin"?Mi("osascript",["-e",`tell application "Terminal" to do script ${JSON.stringify(t)}`,"-e",'tell application "Terminal" to activate'],{detached:!0,stdio:"ignore"}).unref():Mi("x-terminal-emulator",["-e","bash","-lc",`${t}; exec bash`],{detached:!0,stdio:"ignore"}).unref(),{ok:!0}}catch(n){return{ok:!1,error:n instanceof Error?n.message:String(n)}}}function pH(t,e={}){let n=e.platform??process.platform,r=cH(t,n);if(!r)return{ok:!1,error:`No install command available for ${n}`};let o=lH(r.command,e.mirror);try{let i=Ii(),s;if(i&&IP(o)){let a=o.trim().split(/\s+/).slice(1);s=Mi(i.nodeExe,[i.npmCli,...a],{env:_i(i),detached:!0,stdio:"ignore",windowsHide:!0})}else{let a=_P(o)?CP():void 0;s=Mi(o,{shell:!0,...a?{env:a}:{},detached:!0,stdio:"ignore",windowsHide:!0})}return s.unref(),{ok:!0}}catch(i){return{ok:!1,error:i instanceof Error?i.message:String(i)}}}var kt=new Map,_ue=10*6e4,Cue=6e4,Eue=6,jg=null;function Lg(t,e,n){return`${t}\0${e}\0${n??"default"}`}function Yd(t){try{t.manager.kill(t.memberId)}catch{}try{t.manager.dispose()}catch{}}function mH(t){let e=kt.get(t);if(e){if(!e.manager.isAlive(e.memberId)){kt.delete(t),Yd(e);return}return e}}function fH(t,e){let n=kt.get(t);n&&n!==e&&(kt.delete(t),Yd(n)),kt.set(t,e),Mue(),$ue()}function gH(t,e){let n=kt.get(t);if(!n)return;if(!n.manager.isAlive(n.memberId)){kt.delete(t),Yd(n);return}kt.delete(t);let r=kt.get(e);return r&&r!==n&&(kt.delete(e),Yd(r)),kt.set(e,n),n.lastUsed=Date.now(),n}var Ug="__warm__";function bc(t){let e=kt.get(t);e&&(kt.delete(t),Yd(e))}function Qd(t){let e=`${t}\0`,n=0,r=0;for(let[o,i]of[...kt.entries()])o.startsWith(e)&&(i.holder.current?(i.pendingRecredential=!0,r+=1):(bc(o),n+=1));return{evicted:n,deferred:r}}function hH(t){kt.get(t)?.pendingRecredential&&bc(t)}function Mue(){for(;kt.size>Eue;){let t=null,e=Number.POSITIVE_INFINITY;for(let[n,r]of kt)r.holder.current||r.lastUsed<e&&(e=r.lastUsed,t=n);if(!t)break;bc(t)}}function Due(t){for(let[e,n]of[...kt.entries()])n.holder.current||t-n.lastUsed>_ue&&bc(e)}function $ue(){jg||(jg=setInterval(()=>Due(Date.now()),Cue),typeof jg.unref=="function"&&jg.unref())}import{randomUUID as Nue}from"node:crypto";var kc=new Map;function Oue(t,e){let n=kc.get(t);return n&&(clearTimeout(n.timer),n.resolve(null),kc.delete(t)),new Promise(r=>{let o=setTimeout(()=>{kc.delete(t),r(null)},e);typeof o.unref=="function"&&o.unref(),kc.set(t,{resolve:r,timer:o})})}function yH(t,e){let n=kc.get(t);return n?(clearTimeout(n.timer),kc.delete(t),n.resolve(e),!0):!1}function jue(t){if(t==null)return"";if(typeof t=="string")return t;try{return JSON.stringify(t)}catch{return""}}function Lue(t){let e=o=>typeof o?.optionId=="string"&&o.optionId.trim()?o.optionId:void 0;if(t.find(o=>e(o)==="allow"))return"allow";let r=t.find(o=>/allow/i.test([o.optionId,o.kind,o.name].filter(i=>typeof i=="string").join(" ")));return e(r)??e(t[0])??"allow"}function GP(t,e=[]){if(typeof t=="string")return e.push(t),e;if(!t||typeof t!="object")return e;if(Array.isArray(t)){for(let n of t)GP(n,e);return e}for(let n of Object.values(t))GP(n,e);return e}function Uue(t){let e=GP(t).join(`
725
725
  `);return/astraclaw/i.test(e)&&/\b(?:skills_list|skill_view|mcp_connectors_list|mcp_tool_call)\b/.test(e)}async function vH(t,e){let n=e.turnContext(),r=t.toolCall&&typeof t.toolCall=="object"?t.toolCall:{},o=typeof t.permissionId=="string"&&t.permissionId?t.permissionId:Nue(),i=Array.isArray(t.options)?t.options:[];if(Uue(t))return{optionId:Lue(i)};if(n?.turnId&&e.sendNotification){e.sendNotification("agents.prompt.approval",{agentId:e.agentId,sessionId:n.sessionId,turnId:n.turnId,requestId:n.requestId,approvalId:o,callId:typeof r.toolCallId=="string"?r.toolCallId:o,toolName:typeof r.title=="string"?r.title:typeof t.toolName=="string"?t.toolName:"operation",arguments:jue(r.rawInput),message:typeof t.message=="string"?t.message:void 0,category:typeof t.category=="string"?t.category:"destructive",options:i});let a=await Oue(o,e.timeoutMs??5*6e4);if(a)return{optionId:a}}return{optionId:i.find(a=>a?.kind==="reject_once"||a?.kind==="reject"||/reject|deny|no|cancel/i.test(String(a?.optionId??a?.name??"")))?.optionId??i[0]?.optionId??"reject"}}function Hue(t){let e=t?.rawInput;if(e!=null){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return}}}function zue(t){let e=t?.content;if(Array.isArray(e)){let n=e.map(r=>{if(!r||typeof r!="object")return"";let o=r;return typeof o.text=="string"?o.text:typeof o.content=="string"?o.content:""}).join("");if(n)return n.slice(0,2e3)}if(typeof e=="string")return e.slice(0,2e3);if(t?.rawOutput!==void 0)try{return JSON.stringify(t.rawOutput).slice(0,2e3)}catch{return}}function Bue(t){let{agentId:e,turn:n,method:r,payload:o,sendNotification:i}=t;if(!n||!i)return;let s=o;if(r==="turn.delta"){let c=typeof s?.text=="string"?s.text:"";if(!c)return;n.deltas.push(c),n.turnId&&(i("agents.prompt.delta",{agentId:e,sessionId:n.sessionId,turnId:n.turnId,requestId:n.requestId,text:c}),n.streamedAny=!0);return}if(r==="turn.thought_delta"){let c=typeof s?.text=="string"?s.text:"";c&&n.turnId&&i("agents.prompt.delta",{agentId:e,sessionId:n.sessionId,turnId:n.turnId,requestId:n.requestId,text:c,reasoning:!0});return}if(r==="turn.plan"){n.turnId&&i("agents.prompt.plan",{agentId:e,sessionId:n.sessionId,turnId:n.turnId,requestId:n.requestId,steps:Array.isArray(s?.steps)?s.steps:[]});return}if(r==="turn.tool_use_summary"){if(!n.turnId||!Array.isArray(s?.availableToolNames)||!Array.isArray(s?.enabledToolNames)||!Array.isArray(s?.toolCallNames)||!Array.isArray(s?.blockedToolCalls))return;i("turn.tool_use_summary",{...s,sessionId:n.sessionId,turnId:n.turnId,requestId:n.requestId});return}if(r==="turn.tool_selection_policy"){if(!n.turnId||!Array.isArray(s?.availableToolNames)||!Array.isArray(s?.enabledToolNamesBefore)||!Array.isArray(s?.enabledToolNamesAfter)||!Array.isArray(s?.suppressedToolNames))return;i("turn.tool_selection_policy",{...s,sessionId:n.sessionId,turnId:n.turnId,requestId:n.requestId});return}if(!n.turnId)return;let a=typeof s?.callId=="string"?s.callId:String(s?.callId??"");r==="turn.tool_call"?i("agents.prompt.tool",{agentId:e,sessionId:n.sessionId,turnId:n.turnId,requestId:n.requestId,event:{kind:"call",callId:a,name:typeof s?.toolName=="string"?s.toolName:typeof s?.name=="string"?s.name:"tool",arguments:Hue(s)}}):r==="turn.tool_result"&&i("agents.prompt.tool",{agentId:e,sessionId:n.sessionId,turnId:n.turnId,requestId:n.requestId,event:{kind:"result",callId:a,name:typeof s?.toolName=="string"?s.toolName:"tool",ok:s?.status!=="failed"&&s?.status!=="error",outputPreview:zue(s)}})}function kH(t){let e=t?.authMethods;return Array.isArray(e)&&e.length>0?e:void 0}function wH(t){return t instanceof Error?t.message:String(t)}async function que(t){let e=kH(t.error);if(!t.sessionId||!e)return;let n=wH(t.error);await hr(t.sessionId,{role:"user",content:t.prompt},t.projectRoot,t.turnId),await hr(t.sessionId,{role:"assistant",content:n,blocks:[{type:"auth_prompt",agentId:t.agentId,message:n,authMethods:e}]},t.projectRoot,t.turnId);let r=Vt(t.sessionId,t.projectRoot),o=await _a(t.sessionId,t.projectRoot);await yt(t.sessionId,{type:"personal",...t.projectId?{projectId:t.projectId}:{},...o!==null?{messageCount:o}:{},...r?.title?{}:{title:Bl(t.prompt,"External agent login required")},...t.lockSessionOwner===!1||r?.agentId?{}:{agentId:t.agentId}},t.projectRoot)}async function SH(t){let e=t.params,n=typeof e?.approvalId=="string"?e.approvalId:"",r=typeof e?.optionId=="string"?e.optionId:"",o=n&&r?yH(n,r):!1;t.id!==void 0&&this.sendResponse(t.id,{ok:o})}async function xH(t){try{let e=t.params,n=await this.ensureAgentConfigStore();this.acpDetector.setConfigStore(n.getData());let r=await this.acpDetector.scanAsync(e?.force);t.id!==void 0&&this.sendResponse(t.id,r)}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function RH(t){try{let e=await this.ensureAgentConfigStore();this.acpDetector.setConfigStore(e.getData());let n=await this.acpDetector.scanAsync(!1);t.id!==void 0&&this.sendResponse(t.id,n)}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function TH(t){try{let e=await this.ensureAgentConfigStore();this.acpDetector.setConfigStore(e.getData());let n=new Map(this.acpDetector.list().map(o=>[o.id,o])),r=zd().map(o=>{let i=n.get(o.id);return{id:o.id,name:o.name,brandId:o.brandId??o.id,category:o.category??"code",integration:o.integration??"acp",authMode:o.authMode??"key",keySource:o.keySource??"none",note:o.note,availableModes:qF(o),authPreference:e.getAgentConfig(o.id)?.authPreference??"auto",credentialReady:i?.status==="available"?this.acpDetector.isAgentReady(o.id):!1,accountConnected:i?.status==="available"?this.acpDetector.getNativeLoginState(o.id):void 0,status:i?.status??"not_installed",version:jF(o,i?.version),install:{docsUrl:o.install?.docsUrl,command:o.install?.npm??o.install?.pip??o.install?.brew??o.install?.curl,setupCommand:o.install?.setupCommand}}});t.id!==void 0&&this.sendResponse(t.id,{catalog:r})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}var KP=new Set;async function AH(t){try{let e=t.params,r=(typeof e?.mirror=="string"&&e.mirror?e.mirror:process.env.QLOGICAGENT_INSTALL_MIRROR)==="cn"?qd:void 0,o=await this.ensureAgentConfigStore();this.acpDetector.setConfigStore(o.getData());let i=new Map(this.acpDetector.list().map(l=>[l.id,l])),s=zd().map(l=>({id:l.id,entry:l,detectedVersion:i.get(l.id)?.version})),{updates:a,stale:c}=UF(s,r);if(t.id!==void 0&&this.sendResponse(t.id,{updates:a,refreshing:c}),c){let l=r??"";KP.has(l)||(KP.add(l),LF(s,r).catch(()=>{}).finally(()=>KP.delete(l)))}}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function PH(t){let e=t.params,n=typeof e?.agentId=="string"?e.agentId:void 0,r=typeof e?.mirror=="string"&&e.mirror?e.mirror:process.env.QLOGICAGENT_INSTALL_MIRROR;if(!n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"agentId (string) required"});return}let o=Eo(n);if(!o?.install){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:`Unknown or non-installable agent: ${n}`});return}if(o.install.deferUpdate){let i=pH(o.install,{mirror:r});t.id!==void 0&&this.sendResponse(t.id,{ok:i.ok,error:i.error,deferred:i.ok});return}try{let i=await dH(o.install,s=>{this.sendNotification?.("agent.install.progress",{agentId:n,event:s})},{mirror:r});this.acpDetector.clearCache(),t.id!==void 0&&this.sendResponse(t.id,{ok:i.ok,error:i.error})}catch(i){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:i instanceof Error?i.message:String(i)})}}async function IH(t){let e=t.params,n=typeof e?.agentId=="string"?e.agentId:void 0;if(!n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"agentId (string) required"});return}let o=Eo(n)?.install?.setupCommand;if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:`No terminal setup command for agent: ${n}`});return}let i=uH(o);t.id!==void 0&&this.sendResponse(t.id,{ok:i.ok,error:i.error,command:o})}async function _H(t){try{let e=t.params;if(!e?.action||!e?.agent){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"action and agent are required."});return}let n=await this.ensureAgentConfigStore();switch(e.action){case"register":await n.registerCustomAgent(e.agent);break;case"unregister":await n.unregisterCustomAgent(e.agent.id);break;case"update":await n.registerCustomAgent(e.agent);break}this.acpDetector.setConfigStore(n.getData()),this.acpDetector.clearCache(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function CH(t){try{let e=t.params;if(!e?.agentId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"agentId is required."});return}let n=await this.ensureAgentConfigStore(),{agentId:r,...o}=e;await n.setAgentConfig(r,o),this.acpDetector.setConfigStore(n.getData());let{deferred:i}=Qd(r);t.id!==void 0&&this.sendResponse(t.id,{ok:!0,pendingTurn:i>0})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function EH(t){try{let e=t.params;if(!e?.agentId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"agentId is required."});return}let r=(await this.ensureAgentConfigStore()).getAgentConfig(e.agentId);t.id!==void 0&&this.sendResponse(t.id,r)}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function MH(t){try{let e=t.params;if(!e?.agentId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"agentId is required."});return}let n=await this.ensureAgentConfigStore();await n.removeAgentConfig(e.agentId),this.acpDetector.setConfigStore(n.getData()),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}function Wue(t){let e=bH.homedir();if(t==="codex"){let n=process.env.CODEX_HOME?.trim()||wc.join(e,".codex");return[wc.join(n,"auth.json")]}return[]}async function DH(t){try{let e=t.params,n=typeof e?.agentId=="string"?e.agentId.trim():"";if(!n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"agentId is required."});return}let r=!1;for(let o of Wue(n))try{Sc.existsSync(o)&&(Sc.rmSync(o,{force:!0}),r=!0)}catch{}Qd(n),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,cleared:r,hint:r?void 0:`\u5728\u7EC8\u7AEF\u8FD0\u884C \`${n} logout\` \u9000\u51FA\u8BE5 Agent \u7684\u8D26\u53F7`})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function $H(t){try{let e=t.params;if(!e?.url){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"url is required."});return}await(await this.ensureAgentConfigStore()).setGatewayUrl(e.url),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function NH(t){try{let n=(await this.ensureAgentConfigStore()).getGatewayUrl();t.id!==void 0&&this.sendResponse(t.id,{url:n})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function OH(t){try{let n=(await this.ensureAgentConfigStore()).getData(),r=Object.entries(n.agents).map(([o,i])=>({agentId:o,hasApiKey:!!i.apiKey,hasBaseUrl:!!i.baseUrl,hasModel:!!i.model}));t.id!==void 0&&this.sendResponse(t.id,r)}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}function jH(t){try{let e=[],n=(r,o)=>{if(r)for(let i of r.getAllHandles())e.push({memberId:i.memberId,name:i.name,pid:i.pid,state:i.state,startedAt:i.startedAt,endedAt:i.endedAt,source:o})};n(this.soloProcessManager,"solo"),n(this.productProcessManager,"product"),t.id!==void 0&&this.sendResponse(t.id,e)}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}function LH(t){try{let e=t.params;if(!e?.memberId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"memberId is required."});return}let n=!1;for(let r of[this.soloProcessManager,this.productProcessManager])if(r?.getHandle(e.memberId)){r.kill(e.memberId),n=!0;break}t.id!==void 0&&this.sendResponse(t.id,{ok:n})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function UH(t){try{let e=t.params;if(!e?.agentId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"agentId is required."});return}let n=wc.join(_e(),"agent-logs"),r=wc.join(n,`${e.agentId}.stderr.log`),o="";try{o=Sc.readFileSync(r,"utf-8")}catch{}e.tail&&e.tail>0&&o&&(o=o.split(`
726
726
  `).slice(-e.tail).join(`
727
- `)),t.id!==void 0&&this.sendResponse(t.id,{log:o})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function FH(t){try{let e=t.params;if(!e?.agentId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"agentId is required."});return}let n=await this.ensureAgentConfigStore();this.acpDetector.setConfigStore(n.getData());let o=this.acpDetector.list().find(s=>s.id===e.agentId);if(!o){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,error:`Agent ${e.agentId} not found`,durationMs:0});return}if(o.status==="not_installed"){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,error:`Agent ${e.agentId} is not installed`,durationMs:0});return}let i=Date.now();t.id!==void 0&&this.sendResponse(t.id,{ok:o.status==="available",version:o.version,capabilities:o.capabilities,error:o.status!=="available"?`Agent status: ${o.status}`:void 0,durationMs:Date.now()-i})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function HH(t,e,n,r,o,i){let s=Lg(e,r,o),a=mH(s);if(a)return a;if(o!==Ug){let f=gH(Lg(e,r,Ug),s);if(f)return f}let c=`chat-${e}-${Fue().slice(0,8)}`,l={current:null},d=typeof t.sendNotification=="function"?t.sendNotification.bind(t):void 0,p=new Vr({onNotification:(f,g,h)=>{Bue({agentId:e,turn:l.current,method:g,payload:h,sendNotification:d})},onMcpToolCall:async(f,g,h)=>{if(typeof t.handleMcpToolCall=="function")return t.handleMcpToolCall(f,g,h);let y=await $g({tool:g,args:h,projectRoot:r});return y.handled?y.result:{ok:!1,error:"MCP tool call unavailable"}},onPermissionRequest:(f,g)=>vH(g,{agentId:e,turnContext:()=>l.current,sendNotification:d}),log:{info:f=>t.log?.(`[agents.prompt] ${f}`),warn:f=>t.log?.(`[agents.prompt] WARN: ${f}`),debug:f=>t.log?.(`[agents.prompt] ${f}`)},sessionDir:wc.join(_e(),"agent-logs")});await p.spawn({memberId:c,name:`chat-${e}`,cwd:r,prompt:"",external:n,systemPrompt:i});let m={manager:p,memberId:c,holder:l,lastUsed:Date.now()};return fH(s,m),m}async function zH(t){try{let e=t.params??{},n=typeof e.agentId=="string"?e.agentId.trim():"";if(!n||n==="qlogicagent"){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,warmed:!1});return}let r=await this.ensureAgentConfigStore();this.acpDetector.setConfigStore(r.getData()),await this.acpDetector.scanAsync(!1);let o=this.acpDetector.buildExternalDescriptor(n);if(!o){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,warmed:!1});return}if(this.acpDetector.resolveCredentialError(n)){t.id!==void 0&&this.sendResponse(t.id,{ok:!0,warmed:!1});return}let i=typeof this.getActiveProjectRoot=="function"?this.getActiveProjectRoot():process.cwd();await HH(this,n,o,i,Ug),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,warmed:!0})}catch(e){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,warmed:!1,error:e instanceof Error?e.message:String(e)})}}async function BH(t){try{let e=t.params??{},n=typeof e.agentId=="string"?e.agentId.trim():"",r=typeof e.prompt=="string"?e.prompt:"";if(!n||!r.trim()){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"agentId and prompt are required."});return}let o=await this.ensureAgentConfigStore();this.acpDetector.setConfigStore(o.getData()),await this.acpDetector.scanAsync(!1);let i=this.acpDetector.buildExternalDescriptor(n);if(!i){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:`Agent ${n} is not available or not ACP-compatible.`});return}let s=this.acpDetector.resolveCredentialError(n);if(s){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:s});return}let a=typeof e.cwd=="string"&&e.cwd?e.cwd:typeof this.getActiveProjectRoot=="function"?this.getActiveProjectRoot():process.cwd(),c=typeof e.timeoutMs=="number"&&e.timeoutMs>0?e.timeoutMs:3e5,l=typeof e.sessionId=="string"?e.sessionId:void 0,d=typeof e.turnId=="string"?e.turnId:void 0,p=typeof e.requestId=="string"?e.requestId:void 0,m=typeof e.projectId=="string"?e.projectId:void 0,f=e.lockSessionOwner!==!1,g=Lg(n,a,l),h=await HH(this,n,i,a,l,typeof e.systemPrompt=="string"?e.systemPrompt:void 0),y={sessionId:l,turnId:d,requestId:p,deltas:[],streamedAny:!1};h.holder.current=y,h.lastUsed=Date.now();let b;try{b=await h.manager.sendTask(h.memberId,r,{timeout:c})}catch(S){throw await que({sessionId:l,projectRoot:a,turnId:d,projectId:m,agentId:n,prompt:r,error:S,lockSessionOwner:f}),bc(g),S}finally{h.holder.current=null,hH(g)}let v=y.deltas.join("")||(typeof b?.content=="string"?b.content:""),k=h.manager.getUsageTracker(h.memberId)?.getUsage();if(l){hr(l,{role:"user",content:r},a,d),v&&hr(l,{role:"assistant",content:v},a,d);let S=Vt(l,a);yt(l,{type:"personal",...m?{projectId:m}:{},...S?.title?{}:{title:Bl(r,"External agent session")},...f&&!S?.agentId?{agentId:n}:{}},a)}t.id!==void 0&&this.sendResponse(t.id,{ok:!0,agentId:n,content:v,streamed:y.streamedAny,stopReason:b?.stopReason,usage:k?{inputTokens:k.inputTokens,outputTokens:k.outputTokens,totalTokens:k.totalTokens,cacheRead:k.cachedReadTokens,thoughtTokens:k.thoughtTokens,cost:k.cost}:void 0})}catch(e){if(t.id!==void 0){let n=kH(e);this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:wH(e),...n?{data:{authMethods:n}}:{}})}}}Rm();function Gue(t){let e=Jue(t.fetchFn??fetch,t.clientVersion),n=t.token.trim();return{async matchRegistry(r){let o=r.intent.trim();if(!o)throw new Error("intent is required.");let i=Xue(r.topK),s=await Hg(e,Fg(t.baseUrl,"/api/v15/registry/match"),n,"POST",{intent:o,topK:i,prefer:r.preferOfficial===!1?"relevance":"official",canonicalOnly:!0});return(xc(s)&&Array.isArray(s.matches)?s.matches:[]).map(Yue).filter(c=>!!c).slice(0,i)},async resolveInstall(r,o){let i=encodeURIComponent(r.trim());if(!i)throw new Error("resourceId is required.");let s=o?.trim(),a=s?`?version=${encodeURIComponent(s)}`:"",c=await Hg(e,Fg(t.baseUrl,`/api/v15/registry/resources/${i}/install${a}`),n,"GET"),l=GH(c);if(!l)throw new Error("Community hub returned an invalid install resolution.");return l},async listResourceVersions(r){let o=encodeURIComponent(r.trim());if(!o)throw new Error("resourceId is required.");let i=await Hg(e,Fg(t.baseUrl,`/api/v15/registry/resources/${o}/versions`),n,"GET");return(xc(i)&&Array.isArray(i.versions)?i.versions:[]).map(Que).filter(a=>!!a)},async resolveRuntime(r,o){let i=encodeURIComponent(r.trim());if(!i)throw new Error("runtime id is required.");let s=encodeURIComponent(o.trim());if(!s)throw new Error("platform is required.");let a=await Hg(e,Fg(t.baseUrl,`/api/v15/runtime/${i}/resolve?platform=${s}`),n,"GET"),c=epe(a);if(!c)throw new Error("Community hub returned an invalid runtime resolution.");return c}}}function Rc(t=li()){let e=t.get("QLOGIC_LLMROUTER_ACCESS_TOKEN")?.trim();if(!e)return null;let n=Kue(t);return Gue({baseUrl:Vue(t),token:e,clientVersion:n})}function Kue(t){let e=t.get("QLOGIC_AGENT_VERSION")?.trim();return e||"2.17.6"}function Vue(t){return t.get("QLOGIC_HUB_BASE_URL")?.trim()||t.get("XIAOZHICLAW_HUB_URL")?.trim()||"https://xiaozhi.qlogicagent.com"}function Fg(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 Jue(t,e){let n=e?.trim();return n?(r,o)=>t(r,{...o,headers:{...o?.headers,"x-client-version":n}}):t}async function Hg(t,e,n,r,o){let i,s=o!==void 0;try{i=await t(e,{method:r,headers:{accept:"application/json",authorization:`Bearer ${n}`,...s?{"content-type":"application/json"}:{}},...s?{body:JSON.stringify(o)}:{},signal:AbortSignal.timeout(1e4)})}catch{throw new Error("Community hub is unavailable.")}if(!i.ok)throw new Error(`Community hub rejected registry request: ${i.status}${await Zue(i)}`);return i.json().catch(()=>null)}async function Zue(t){try{let e=(await t.text()).trim();return e?` ${e.slice(0,500)}`:""}catch{return""}}function xc(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function Xue(t){if(t===void 0)return 3;if(typeof t!="number"||!Number.isSafeInteger(t)||t<1||t>3)throw new Error("registry match topK must be an integer between 1 and 3.");return t}function Yue(t){if(!xc(t)||t.canonical!==!0&&t.isCanonical!==!0)return null;let e=qH(t.sourceTier),n=WH(t.trustStage),r=zg(t.resourceRiskTier),o=zg(t.effectiveRiskTier);if(typeof t.id!="string"||typeof t.title!="string"||!e||!n||!r||!o)return null;let i=Array.isArray(t.capabilityTags)?t.capabilityTags:[];return{id:t.id,type:typeof t.type=="string"?t.type:"skill",title:VP(t.title,80),summary:VP(typeof t.summary=="string"?t.summary:"",160),category:typeof t.category=="string"?t.category:null,capabilityTags:i.filter(s=>typeof s=="string"&&s.trim().length>0).slice(0,6).map(s=>VP(s,32)),sourceTier:e,trustStage:n,resourceRiskTier:r,effectiveRiskTier:o,latestVersion:typeof t.latestVersion=="string"?t.latestVersion:null,canonical:!0}}function VP(t,e){let n=t.replace(/\s+/g," ").trim();return n.length<=e?n:`${n.slice(0,Math.max(0,e-1))}\u2026`}function Que(t){return!xc(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 epe(t){if(!xc(t))return null;let e=typeof t.id=="string"?t.id:"",n=typeof t.version=="string"?t.version:"",r=typeof t.downloadUrl=="string"?t.downloadUrl:"",o=typeof t.checksum=="string"?t.checksum:"",i=typeof t.sizeBytes=="number"?t.sizeBytes:0;return!e||!n||!r||!/^[a-f0-9]{64}$/.test(o)||!Number.isSafeInteger(i)||i<=0?null:{id:e,version:n,downloadUrl:r,checksum:o,sizeBytes:i}}var tpe=new Set(["R0","R1","R2","R3"]),npe=new Set(["official","community"]),rpe=new Set(["quarantine","trial","trusted"]),ope=new Set(["pending","approved","rejected"]);function zg(t){return typeof t=="string"&&tpe.has(t)?t:null}function qH(t){return typeof t=="string"&&npe.has(t)?t:null}function WH(t){return typeof t=="string"&&rpe.has(t)?t:null}function ipe(t){return typeof t=="string"&&ope.has(t)?t:null}function GH(t){if(!xc(t))return null;let e=qH(t.sourceTier),n=WH(t.trustStage),r=ipe(t.reviewStatus),o=zg(t.resourceRiskTier),i=zg(t.effectiveRiskTier);if(typeof t.id!="string"||typeof t.type!="string"||typeof t.kind!="string"||!e||!n||!r||!o||!i||typeof t.version!="string"||typeof t.checksum!="string"||typeof t.sizeBytes!="number"||typeof t.downloadUrl!="string")return null;let s=Array.isArray(t.requires)?t.requires:null,a=Array.isArray(t.dependencies)?t.dependencies:null;if(!s||!a||s.some(l=>typeof l!="string"))return null;let c=a.map(GH);return c.some(l=>!l)?null:{id:t.id,type:t.type,kind:t.kind,sourceTier:e,trustStage:n,reviewStatus:r,resourceRiskTier:o,effectiveRiskTier:i,requires:s,dependencies:c,version:t.version,checksum:t.checksum,sizeBytes:t.sizeBytes,downloadUrl:t.downloadUrl,manifest:t.manifest,minClientVersion:typeof t.minClientVersion=="string"&&t.minClientVersion.trim()?t.minClientVersion.trim():void 0,signature:typeof t.signature=="string"&&t.signature.trim()?t.signature:null,signingKeyId:typeof t.signingKeyId=="string"&&t.signingKeyId.trim()?t.signingKeyId:null}}de();var JP={enabled:!0},spe=new Set(["R2","R3"]);function KH(t,e=JP){return spe.has(t.effectiveRiskTier)?{mode:"high-risk-ask",requiresInstallConsent:!0,requiresHighRiskConsent:!0,reason:`effectiveRiskTier=${t.effectiveRiskTier} \u9AD8\u5371,\u5FC5\u987B\u9AD8\u5371\u95EE\u4EBA`}:e.enabled?t.effectiveRiskTier==="R0"?{mode:"silent",requiresInstallConsent:!1,requiresHighRiskConsent:!1,reason:"R0 \u4F4E\u98CE\u9669 inert,\u81EA\u6CBB\u9759\u9ED8\u83B7\u53D6"}:{mode:"ask",requiresInstallConsent:!0,requiresHighRiskConsent:!1,reason:"R1 \u4F4E\u98CE\u9669\u4F46\u975E\u96F6,\u95EE\u4EBA\u4E00\u6B21"}:{mode:"ask",requiresInstallConsent:!0,requiresHighRiskConsent:!1,reason:"\u81EA\u6CBB\u9884\u7B97\u5173\u95ED,\u56DE\u9000\u663E\u5F0F\u540C\u610F"}}import{createPublicKey as ape,verify as cpe}from"node:crypto";function lpe(t){return`id=${t.id}
727
+ `)),t.id!==void 0&&this.sendResponse(t.id,{log:o})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function FH(t){try{let e=t.params;if(!e?.agentId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"agentId is required."});return}let n=await this.ensureAgentConfigStore();this.acpDetector.setConfigStore(n.getData());let o=this.acpDetector.list().find(s=>s.id===e.agentId);if(!o){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,error:`Agent ${e.agentId} not found`,durationMs:0});return}if(o.status==="not_installed"){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,error:`Agent ${e.agentId} is not installed`,durationMs:0});return}let i=Date.now();t.id!==void 0&&this.sendResponse(t.id,{ok:o.status==="available",version:o.version,capabilities:o.capabilities,error:o.status!=="available"?`Agent status: ${o.status}`:void 0,durationMs:Date.now()-i})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function HH(t,e,n,r,o,i){let s=Lg(e,r,o),a=mH(s);if(a)return a;if(o!==Ug){let f=gH(Lg(e,r,Ug),s);if(f)return f}let c=`chat-${e}-${Fue().slice(0,8)}`,l={current:null},d=typeof t.sendNotification=="function"?t.sendNotification.bind(t):void 0,p=new Vr({onNotification:(f,g,h)=>{Bue({agentId:e,turn:l.current,method:g,payload:h,sendNotification:d})},onMcpToolCall:async(f,g,h)=>{if(typeof t.handleMcpToolCall=="function")return t.handleMcpToolCall(f,g,h);let y=await $g({tool:g,args:h,projectRoot:r});return y.handled?y.result:{ok:!1,error:"MCP tool call unavailable"}},onPermissionRequest:(f,g)=>vH(g,{agentId:e,turnContext:()=>l.current,sendNotification:d}),log:{info:f=>t.log?.(`[agents.prompt] ${f}`),warn:f=>t.log?.(`[agents.prompt] WARN: ${f}`),debug:f=>t.log?.(`[agents.prompt] ${f}`)},sessionDir:wc.join(_e(),"agent-logs")});await p.spawn({memberId:c,name:`chat-${e}`,cwd:r,prompt:"",external:n,systemPrompt:i});let m={manager:p,memberId:c,holder:l,lastUsed:Date.now()};return fH(s,m),m}async function zH(t){try{let e=t.params??{},n=typeof e.agentId=="string"?e.agentId.trim():"";if(!n||n==="qlogicagent"){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,warmed:!1});return}let r=await this.ensureAgentConfigStore();this.acpDetector.setConfigStore(r.getData()),await this.acpDetector.scanAsync(!1);let o=this.acpDetector.buildExternalDescriptor(n);if(!o){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,warmed:!1});return}if(this.acpDetector.resolveCredentialError(n)){t.id!==void 0&&this.sendResponse(t.id,{ok:!0,warmed:!1});return}let i=typeof this.getActiveProjectRoot=="function"?this.getActiveProjectRoot():process.cwd();await HH(this,n,o,i,Ug),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,warmed:!0})}catch(e){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,warmed:!1,error:e instanceof Error?e.message:String(e)})}}async function BH(t){try{let e=t.params??{},n=typeof e.agentId=="string"?e.agentId.trim():"",r=typeof e.prompt=="string"?e.prompt:"";if(!n||!r.trim()){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"agentId and prompt are required."});return}let o=await this.ensureAgentConfigStore();this.acpDetector.setConfigStore(o.getData()),await this.acpDetector.scanAsync(!1);let i=this.acpDetector.buildExternalDescriptor(n);if(!i){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:`Agent ${n} is not available or not ACP-compatible.`});return}let s=this.acpDetector.resolveCredentialError(n);if(s){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:s});return}let a=typeof e.cwd=="string"&&e.cwd?e.cwd:typeof this.getActiveProjectRoot=="function"?this.getActiveProjectRoot():process.cwd(),c=typeof e.timeoutMs=="number"&&e.timeoutMs>0?e.timeoutMs:3e5,l=typeof e.sessionId=="string"?e.sessionId:void 0,d=typeof e.turnId=="string"?e.turnId:void 0,p=typeof e.requestId=="string"?e.requestId:void 0,m=typeof e.projectId=="string"?e.projectId:void 0,f=e.lockSessionOwner!==!1,g=Lg(n,a,l),h=await HH(this,n,i,a,l,typeof e.systemPrompt=="string"?e.systemPrompt:void 0),y={sessionId:l,turnId:d,requestId:p,deltas:[],streamedAny:!1};h.holder.current=y,h.lastUsed=Date.now();let b;try{b=await h.manager.sendTask(h.memberId,r,{timeout:c})}catch(S){throw await que({sessionId:l,projectRoot:a,turnId:d,projectId:m,agentId:n,prompt:r,error:S,lockSessionOwner:f}),bc(g),S}finally{h.holder.current=null,hH(g)}let v=y.deltas.join("")||(typeof b?.content=="string"?b.content:""),k=h.manager.getUsageTracker(h.memberId)?.getUsage();if(l){hr(l,{role:"user",content:r},a,d),v&&hr(l,{role:"assistant",content:v},a,d);let S=Vt(l,a);yt(l,{type:"personal",...m?{projectId:m}:{},...S?.title?{}:{title:Bl(r,"External agent session")},...f&&!S?.agentId?{agentId:n}:{}},a)}t.id!==void 0&&this.sendResponse(t.id,{ok:!0,agentId:n,content:v,streamed:y.streamedAny,stopReason:b?.stopReason,usage:k?{inputTokens:k.inputTokens,outputTokens:k.outputTokens,totalTokens:k.totalTokens,cacheRead:k.cachedReadTokens,thoughtTokens:k.thoughtTokens,cost:k.cost}:void 0})}catch(e){if(t.id!==void 0){let n=kH(e);this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:wH(e),...n?{data:{authMethods:n}}:{}})}}}Rm();function Gue(t){let e=Jue(t.fetchFn??fetch,t.clientVersion),n=t.token.trim();return{async matchRegistry(r){let o=r.intent.trim();if(!o)throw new Error("intent is required.");let i=Xue(r.topK),s=await Hg(e,Fg(t.baseUrl,"/api/v15/registry/match"),n,"POST",{intent:o,topK:i,prefer:r.preferOfficial===!1?"relevance":"official",canonicalOnly:!0});return(xc(s)&&Array.isArray(s.matches)?s.matches:[]).map(Yue).filter(c=>!!c).slice(0,i)},async resolveInstall(r,o){let i=encodeURIComponent(r.trim());if(!i)throw new Error("resourceId is required.");let s=o?.trim(),a=s?`?version=${encodeURIComponent(s)}`:"",c=await Hg(e,Fg(t.baseUrl,`/api/v15/registry/resources/${i}/install${a}`),n,"GET"),l=GH(c);if(!l)throw new Error("Community hub returned an invalid install resolution.");return l},async listResourceVersions(r){let o=encodeURIComponent(r.trim());if(!o)throw new Error("resourceId is required.");let i=await Hg(e,Fg(t.baseUrl,`/api/v15/registry/resources/${o}/versions`),n,"GET");return(xc(i)&&Array.isArray(i.versions)?i.versions:[]).map(Que).filter(a=>!!a)},async resolveRuntime(r,o){let i=encodeURIComponent(r.trim());if(!i)throw new Error("runtime id is required.");let s=encodeURIComponent(o.trim());if(!s)throw new Error("platform is required.");let a=await Hg(e,Fg(t.baseUrl,`/api/v15/runtime/${i}/resolve?platform=${s}`),n,"GET"),c=epe(a);if(!c)throw new Error("Community hub returned an invalid runtime resolution.");return c}}}function Rc(t=li()){let e=t.get("QLOGIC_LLMROUTER_ACCESS_TOKEN")?.trim();if(!e)return null;let n=Kue(t);return Gue({baseUrl:Vue(t),token:e,clientVersion:n})}function Kue(t){let e=t.get("QLOGIC_AGENT_VERSION")?.trim();return e||"2.17.7"}function Vue(t){return t.get("QLOGIC_HUB_BASE_URL")?.trim()||t.get("XIAOZHICLAW_HUB_URL")?.trim()||"https://xiaozhi.qlogicagent.com"}function Fg(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 Jue(t,e){let n=e?.trim();return n?(r,o)=>t(r,{...o,headers:{...o?.headers,"x-client-version":n}}):t}async function Hg(t,e,n,r,o){let i,s=o!==void 0;try{i=await t(e,{method:r,headers:{accept:"application/json",authorization:`Bearer ${n}`,...s?{"content-type":"application/json"}:{}},...s?{body:JSON.stringify(o)}:{},signal:AbortSignal.timeout(1e4)})}catch{throw new Error("Community hub is unavailable.")}if(!i.ok)throw new Error(`Community hub rejected registry request: ${i.status}${await Zue(i)}`);return i.json().catch(()=>null)}async function Zue(t){try{let e=(await t.text()).trim();return e?` ${e.slice(0,500)}`:""}catch{return""}}function xc(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function Xue(t){if(t===void 0)return 3;if(typeof t!="number"||!Number.isSafeInteger(t)||t<1||t>3)throw new Error("registry match topK must be an integer between 1 and 3.");return t}function Yue(t){if(!xc(t)||t.canonical!==!0&&t.isCanonical!==!0)return null;let e=qH(t.sourceTier),n=WH(t.trustStage),r=zg(t.resourceRiskTier),o=zg(t.effectiveRiskTier);if(typeof t.id!="string"||typeof t.title!="string"||!e||!n||!r||!o)return null;let i=Array.isArray(t.capabilityTags)?t.capabilityTags:[];return{id:t.id,type:typeof t.type=="string"?t.type:"skill",title:VP(t.title,80),summary:VP(typeof t.summary=="string"?t.summary:"",160),category:typeof t.category=="string"?t.category:null,capabilityTags:i.filter(s=>typeof s=="string"&&s.trim().length>0).slice(0,6).map(s=>VP(s,32)),sourceTier:e,trustStage:n,resourceRiskTier:r,effectiveRiskTier:o,latestVersion:typeof t.latestVersion=="string"?t.latestVersion:null,canonical:!0}}function VP(t,e){let n=t.replace(/\s+/g," ").trim();return n.length<=e?n:`${n.slice(0,Math.max(0,e-1))}\u2026`}function Que(t){return!xc(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 epe(t){if(!xc(t))return null;let e=typeof t.id=="string"?t.id:"",n=typeof t.version=="string"?t.version:"",r=typeof t.downloadUrl=="string"?t.downloadUrl:"",o=typeof t.checksum=="string"?t.checksum:"",i=typeof t.sizeBytes=="number"?t.sizeBytes:0;return!e||!n||!r||!/^[a-f0-9]{64}$/.test(o)||!Number.isSafeInteger(i)||i<=0?null:{id:e,version:n,downloadUrl:r,checksum:o,sizeBytes:i}}var tpe=new Set(["R0","R1","R2","R3"]),npe=new Set(["official","community"]),rpe=new Set(["quarantine","trial","trusted"]),ope=new Set(["pending","approved","rejected"]);function zg(t){return typeof t=="string"&&tpe.has(t)?t:null}function qH(t){return typeof t=="string"&&npe.has(t)?t:null}function WH(t){return typeof t=="string"&&rpe.has(t)?t:null}function ipe(t){return typeof t=="string"&&ope.has(t)?t:null}function GH(t){if(!xc(t))return null;let e=qH(t.sourceTier),n=WH(t.trustStage),r=ipe(t.reviewStatus),o=zg(t.resourceRiskTier),i=zg(t.effectiveRiskTier);if(typeof t.id!="string"||typeof t.type!="string"||typeof t.kind!="string"||!e||!n||!r||!o||!i||typeof t.version!="string"||typeof t.checksum!="string"||typeof t.sizeBytes!="number"||typeof t.downloadUrl!="string")return null;let s=Array.isArray(t.requires)?t.requires:null,a=Array.isArray(t.dependencies)?t.dependencies:null;if(!s||!a||s.some(l=>typeof l!="string"))return null;let c=a.map(GH);return c.some(l=>!l)?null:{id:t.id,type:t.type,kind:t.kind,sourceTier:e,trustStage:n,reviewStatus:r,resourceRiskTier:o,effectiveRiskTier:i,requires:s,dependencies:c,version:t.version,checksum:t.checksum,sizeBytes:t.sizeBytes,downloadUrl:t.downloadUrl,manifest:t.manifest,minClientVersion:typeof t.minClientVersion=="string"&&t.minClientVersion.trim()?t.minClientVersion.trim():void 0,signature:typeof t.signature=="string"&&t.signature.trim()?t.signature:null,signingKeyId:typeof t.signingKeyId=="string"&&t.signingKeyId.trim()?t.signingKeyId:null}}de();var JP={enabled:!0},spe=new Set(["R2","R3"]);function KH(t,e=JP){return spe.has(t.effectiveRiskTier)?{mode:"high-risk-ask",requiresInstallConsent:!0,requiresHighRiskConsent:!0,reason:`effectiveRiskTier=${t.effectiveRiskTier} \u9AD8\u5371,\u5FC5\u987B\u9AD8\u5371\u95EE\u4EBA`}:e.enabled?t.effectiveRiskTier==="R0"?{mode:"silent",requiresInstallConsent:!1,requiresHighRiskConsent:!1,reason:"R0 \u4F4E\u98CE\u9669 inert,\u81EA\u6CBB\u9759\u9ED8\u83B7\u53D6"}:{mode:"ask",requiresInstallConsent:!0,requiresHighRiskConsent:!1,reason:"R1 \u4F4E\u98CE\u9669\u4F46\u975E\u96F6,\u95EE\u4EBA\u4E00\u6B21"}:{mode:"ask",requiresInstallConsent:!0,requiresHighRiskConsent:!1,reason:"\u81EA\u6CBB\u9884\u7B97\u5173\u95ED,\u56DE\u9000\u663E\u5F0F\u540C\u610F"}}import{createPublicKey as ape,verify as cpe}from"node:crypto";function lpe(t){return`id=${t.id}
728
728
  version=${t.version}
729
729
  checksum=${t.checksum}
730
730
  sizeBytes=${t.sizeBytes}`}function dpe(t){return t.includes("\\n")?t.replace(/\\n/g,`
@@ -1116,7 +1116,7 @@ FEEDBACK: <\u82E5 FAIL,\u7528\u4E00\u53E5\u8BDD\u6307\u51FA\u7F3A\u4E86\u4EC0\u4
1116
1116
  `),this.sendNotification("workflow.triggerDropped",{workflowId:p,triggerType:m,...f,...tt(c)})}}),this.workflowRoots.set(e,c),ur.resolve(this.getActiveProjectRoot())===e&&l2(c.controller),c.scheduler.start().catch(p=>{process.stderr.write(`[workflow:scheduler] start failed for ${r}: ${p instanceof Error?p.message:String(p)}
1117
1117
  `)});let d=jC(r);if(d.length>0){for(let p of d)this.sendNotification("workflow.alert",{workflowId:p.workflowId,kind:"suspension-lost-on-restart",suspensionKind:p.kind,nodeId:p.nodeId,prompt:p.prompt,...tt(c)}),c.audit.append({ts:new Date().toISOString(),actor:"system",action:"suspensionLostOnRestart",workflowId:p.workflowId,detail:{kind:p.kind,nodeId:p.nodeId,requestedAt:p.requestedAt}});LC(r,[])}return c}function By(){let t=new Map,e=Uu.call(this,Hu.call(this,{}));t.set(ur.resolve(e.cwd),e);for(let n of fe()){if(n.type!=="automation")continue;let r=Uu.call(this,{cwd:n.workspaceDir,projectId:n.id});t.set(ur.resolve(r.cwd),r)}return[...t.values()]}function _r(t,e,n,r){t.audit.append({ts:new Date().toISOString(),actor:ut(),action:e,workflowId:n,...r?{detail:r}:{}})}function tt(t){return t.projectId?{projectId:t.projectId}:{}}function Se(t){return t.params??{}}function ne(t,e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:e})}function qe(t,e){try{return Uu.call(this,Hu.call(this,e))}catch(n){ne.call(this,t,Rt(n));return}}function Kn(t,e){return{id:t.id,name:t.name,...t.owner?{owner:t.owner}:{},active:t.active,concurrency:t.concurrency,rev:t.rev,createdAt:t.createdAt,updatedAt:t.updatedAt,...t.trigger!==void 0?{trigger:t.trigger}:{},...t.permissionScope!==void 0?{permissionScope:t.permissionScope}:{},...e?.projectId?{projectId:e.projectId}:{},status:t.archived?"archived":t.active?"active":t.publishedDef?"paused":"draft",...t.publishedRev!==void 0?{publishedRev:t.publishedRev}:{},draftAhead:t.publishedRev!==void 0?t.rev>t.publishedRev:t.publishedDef==null,def:t.def}}function oo(t,e,n){this.sendNotification(t,{workflow:Kn(e,n),...tt(n)})}var bRe=3,NC=new Map,ia=new Set,tl=new Map,Fu=new Map;function OC(t,e){let n=Fu.get(t);n?.delete(e),n&&n.size===0&&Fu.delete(t)}function C6(t){return ur.join(Ar(t),"pending-suspensions.json")}function jC(t){try{let e=JSON.parse(rl.readFileSync(C6(t),"utf8"));return Array.isArray(e)?e:[]}catch{return[]}}function LC(t,e){try{let n=C6(t);rl.mkdirSync(ur.dirname(n),{recursive:!0}),rl.writeFileSync(n,JSON.stringify(e,null,2),"utf8")}catch(n){process.stderr.write(`[workflow:suspension] WRITE FAILED: ${n instanceof Error?n.message:String(n)}
1118
1118
  `)}}function I6(t,e){LC(t,[...jC(t),e])}function _6(t,e){LC(t,jC(t).filter(n=>n.approvalId!==e))}async function E6(t){t.id!==void 0&&this.sendResponse(t.id,{approvals:[...tl.values()].map(e=>e.meta)})}async function M6(t){let e=Se(t);if(typeof e.approvalId!="string"||typeof e.approved!="boolean")return ne.call(this,t,"workflow.approve requires `approvalId` and boolean `approved`");let n=tl.get(e.approvalId);if(!n)return ne.call(this,t,`approval "${e.approvalId}" not found (\u5DF2\u51B3\u5B9A/\u8D85\u65F6/\u91CD\u542F\u4E22\u5931)`);n.resolve(e.approved,typeof e.note=="string"&&e.note?e.note:void 0),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}async function D6(t){let e=Se(t);if(!e.workflowId||typeof e.values!="object"||e.values===null)return ne.call(this,t,"workflow.onForm requires `workflowId` and `values` object");let n=qe.call(this,t,e);if(!n)return;let r=String(e.workflowId),o=await n.controller.get(r);if(o.trigger?.type!=="form")return ne.call(this,t,`workflow "${r}" has no form trigger`);let i=e.values;for(let a of o.trigger.fields)if(a.required&&(i[a.key]===void 0||i[a.key]===""))return ne.call(this,t,`\u8868\u5355\u7F3A\u5C11\u5FC5\u586B\u9879\u300C${a.label??a.key}\u300D`);this.sendNotification("workflow.runStarted",{workflowId:r,triggerType:"form",...tt(n)});let s;try{s=await n.controller.run(r,{type:"form",payload:{type:"form",...i}}),ol.call(this,n,s,"form")}catch(a){throw this.sendNotification("workflow.runFailed",{workflowId:r,triggerType:"form",error:Rt(a),...tt(n)}),a}t.id!==void 0&&this.sendResponse(t.id,s)}function ol(t,e,n){if(e.status==="failed"||e.status==="canceled"){if(this.sendNotification("workflow.runFailed",{workflowId:e.workflowId,triggerType:n,error:e.status==="canceled"?"Workflow run canceled":"Workflow run failed",outcome:e,...tt(t)}),e.status==="failed"){let r=(NC.get(e.workflowId)??0)+1;NC.set(e.workflowId,r),r>=bRe&&(process.stderr.write(`[workflow:alert] "${e.workflowId}" failed ${r} consecutive runs
1119
- `),this.sendNotification("workflow.alert",{workflowId:e.workflowId,kind:"consecutive-failures",count:r,triggerType:n,...tt(t)}))}return}NC.delete(e.workflowId),this.sendNotification("workflow.runCompleted",{workflowId:e.workflowId,status:e.status,triggerType:n,outcome:e,...tt(t)})}function Rt(t){return t instanceof Error?t.message:String(t)}async function $6(t){let e=Se(t);if(!e.def)return ne.call(this,t,"workflow.create requires `def`");let n=qe.call(this,t,e);if(!n)return;let r=String(e.id??`wf_${sa().slice(0,8)}`),o=await n.controller.create({id:r,name:String(e.name??r),owner:ut(),def:e.def,concurrency:e.concurrency,active:e.active===!0});o.active&&await n.scheduler.refresh(o.id),_r(n,"created",o.id,{name:o.name}),oo.call(this,"workflow.created",o,n),t.id!==void 0&&this.sendResponse(t.id,Kn(o,n))}async function N6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.get requires `id`");let n=qe.call(this,t,e);if(!n)return;let r=await n.controller.get(String(e.id)),o=Kn(r,n);e.includePublished===!0&&r.publishedDef&&(o.publishedDef=r.publishedDef),t.id!==void 0&&this.sendResponse(t.id,o)}async function O6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.describe requires `id`");let n=qe.call(this,t,e);if(!n)return;let r=await n.controller.describe(String(e.id));t.id!==void 0&&this.sendResponse(t.id,{rendered:r})}async function j6(t){let e=Se(t);if(!e.id||!e.patch)return ne.call(this,t,"workflow.patch requires `id` and `patch`");let n=qe.call(this,t,e);if(!n)return;let r={patch:e.patch,baseRev:e.baseRev,scope:e.scope},o=await n.controller.patch(String(e.id),r);await n.scheduler.refresh(String(e.id)),o.ok&&(_r(n,"patched",String(e.id),{ops:(r.patch??[]).map(i=>i.op)}),oo.call(this,"workflow.updated",await n.controller.get(String(e.id)),n)),t.id!==void 0&&this.sendResponse(t.id,o)}async function L6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.run requires `id`");let n=qe.call(this,t,e);if(!n)return;let r=e.trigger??{type:"manual"},o=String(e.id);this.sendNotification("workflow.runStarted",{workflowId:o,triggerType:r.type,...tt(n)});let i;try{i=await n.controller.run(o,r,{reuseCache:e.reuseCache===!0}),ol.call(this,n,i,r.type)}catch(s){throw this.sendNotification("workflow.runFailed",{workflowId:o,triggerType:r.type,error:Rt(s),...tt(n)}),s}t.id!==void 0&&this.sendResponse(t.id,i)}async function U6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.update requires `id`");if(e.name===void 0&&e.def===void 0&&e.concurrency===void 0)return ne.call(this,t,"workflow.update requires at least one of `name`/`def`/`concurrency`");let n=qe.call(this,t,e);if(!n)return;let r=await n.controller.update(String(e.id),{...e.name!==void 0?{name:String(e.name)}:{},...e.def!==void 0?{def:e.def}:{},...e.concurrency!==void 0?{concurrency:e.concurrency}:{}});await n.scheduler.refresh(r.id),_r(n,"updated",r.id,{fields:["name","def","concurrency"].filter(o=>e[o]!==void 0)}),oo.call(this,"workflow.updated",r,n),t.id!==void 0&&this.sendResponse(t.id,Kn(r,n))}async function F6(t){let e=Se(t);if(!e.id||typeof e.active!="boolean")return ne.call(this,t,"workflow.setActive requires `id` and boolean `active`");let n=qe.call(this,t,e);if(!n)return;let r;try{r=await n.controller.setActive(String(e.id),e.active)}catch(o){return ne.call(this,t,Rt(o))}await n.scheduler.refresh(r.id),_r(n,e.active?"activated":"deactivated",r.id),oo.call(this,"workflow.updated",r,n),t.id!==void 0&&this.sendResponse(t.id,Kn(r,n))}async function H6(t){let e=Se(t);if(e.projectId){let o=qe.call(this,t,e);if(!o)return;let i=await o.store.list();t.id!==void 0&&this.sendResponse(t.id,{workflows:i.map(s=>Kn(s,o))});return}let n=By.call(this),r=[];for(let o of n){let i=await o.store.list();r.push(...i.map(s=>Kn(s,o)))}t.id!==void 0&&this.sendResponse(t.id,{workflows:r})}async function z6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.delete requires `id`");let n=qe.call(this,t,e);n&&(await n.controller.delete(String(e.id)),await n.scheduler.refresh(String(e.id)),_r(n,"deleted",String(e.id)),this.sendNotification("workflow.deleted",{workflowId:String(e.id),...tt(n)}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0}))}async function B6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.cancelRun requires `id`");let n=qe.call(this,t,e);if(!n)return;let r;try{r=await n.controller.cancelRun(String(e.id),{...typeof e.runId=="string"&&e.runId?{runId:e.runId}:{},reason:typeof e.reason=="string"&&e.reason?e.reason:"\u7528\u6237\u505C\u6B62\u4E86\u8FD0\u884C"})}catch(o){return ne.call(this,t,Rt(o))}ol.call(this,n,r,"manual"),t.id!==void 0&&this.sendResponse(t.id,r)}async function q6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.dryRun requires `id`");let n=qe.call(this,t,e);if(!n)return;let r=String(e.id);this.sendNotification("workflow.runStarted",{workflowId:r,triggerType:"manual",...tt(n)});let o;try{o=await n.controller.run(r,{type:"manual",payload:e.payload},{recordHistory:!1}),ol.call(this,n,o,"manual")}catch(i){return this.sendNotification("workflow.runFailed",{workflowId:r,triggerType:"manual",error:Rt(i),...tt(n)}),ne.call(this,t,Rt(i))}t.id!==void 0&&this.sendResponse(t.id,{...o,dryRun:!0})}async function W6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.metrics requires `id`");let n=qe.call(this,t,e);if(!n)return;let r=await n.runHistory.list(String(e.id)),o=r.filter(d=>d.status!=="running"),i=o.filter(d=>d.status==="completed"),s=o.filter(d=>d.status==="failed"),a=o.map(d=>d.durationMs).filter(d=>typeof d=="number"),c=0;for(let d of o)if(d.status==="failed")c++;else break;let l={};for(let d of o)l[d.triggerType]=(l[d.triggerType]??0)+1;t.id!==void 0&&this.sendResponse(t.id,{metrics:{totalRuns:o.length,completed:i.length,failed:s.length,canceled:o.filter(d=>d.status==="canceled").length,successRate:o.length>0?i.length/o.length:null,avgDurationMs:a.length>0?Math.round(a.reduce((d,p)=>d+p,0)/a.length):null,lastRunAt:o[0]?.startedAt??null,consecutiveFailures:c,byTrigger:l,windowSize:r.length}})}async function G6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.publish requires `id`");let n=qe.call(this,t,e);if(!n)return;let r;try{r=await n.controller.publish(String(e.id))}catch(o){return ne.call(this,t,Rt(o))}_r(n,"published",r.id,{rev:r.publishedRev}),oo.call(this,"workflow.updated",r,n),t.id!==void 0&&this.sendResponse(t.id,Kn(r,n))}async function K6(t){let e=Se(t);if(!e.id||typeof e.archived!="boolean")return ne.call(this,t,"workflow.archive requires `id` and boolean `archived`");let n=qe.call(this,t,e);if(!n)return;let r=await n.controller.archive(String(e.id),e.archived);await n.scheduler.refresh(r.id),_r(n,e.archived?"archived":"unarchived",r.id),oo.call(this,"workflow.updated",r,n),t.id!==void 0&&this.sendResponse(t.id,Kn(r,n))}async function V6(t){let e=new Go().list();t.id!==void 0&&this.sendResponse(t.id,{credentials:e})}async function J6(t){let e=Se(t);if(!e.type||!e.label||typeof e.data!="object"||e.data===null)return ne.call(this,t,"credential.create requires `type`, `label`, and `data` object");try{let n=new Go().create({type:e.type,label:String(e.label),data:e.data,meta:e.meta??void 0});t.id!==void 0&&this.sendResponse(t.id,n)}catch(n){return ne.call(this,t,Rt(n))}}async function Z6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"credential.delete requires `id`");let n=new Go().delete(String(e.id));t.id!==void 0&&this.sendResponse(t.id,{ok:n})}var nl=new Map;async function X6(t){let e=Se(t);for(let n of["label","authUrl","tokenUrl","clientId","redirectUri"])if(typeof e[n]!="string"||!e[n])return ne.call(this,t,`credential.oauthStart requires \`${n}\``);try{let n=new Go,r=typeof e.scopes=="string"?e.scopes:"",o=n.create({type:"oauth2",label:String(e.label),data:{tokenUrl:String(e.tokenUrl),clientId:String(e.clientId),...typeof e.clientSecret=="string"&&e.clientSecret?{clientSecret:e.clientSecret}:{},...r?{scopes:r}:{}},meta:{...r?{scopes:r}:{},pending:!0}}),i=sa(),s=Date.now();for(let[c,l]of nl)l.expiresAt<s&&nl.delete(c);nl.set(i,{credentialId:o.id,tokenUrl:String(e.tokenUrl),clientId:String(e.clientId),...typeof e.clientSecret=="string"&&e.clientSecret?{clientSecret:e.clientSecret}:{},redirectUri:String(e.redirectUri),expiresAt:s+10*6e4});let a=new URL(String(e.authUrl));a.searchParams.set("response_type","code"),a.searchParams.set("client_id",String(e.clientId)),a.searchParams.set("redirect_uri",String(e.redirectUri)),a.searchParams.set("state",i),r&&a.searchParams.set("scope",r),t.id!==void 0&&this.sendResponse(t.id,{credentialId:o.id,authorizeUrl:a.toString(),state:i})}catch(n){return ne.call(this,t,Rt(n))}}async function Y6(t){let e=Se(t);if(typeof e.state!="string"||typeof e.code!="string"||!e.state||!e.code)return ne.call(this,t,"credential.oauthComplete requires `state` and `code`");let n=nl.get(e.state);if(!n||n.expiresAt<Date.now())return nl.delete(e.state),ne.call(this,t,"OAuth state unknown or expired \u2014 restart the authorization");nl.delete(e.state);try{let r=new URLSearchParams({grant_type:"authorization_code",code:e.code,redirect_uri:n.redirectUri,client_id:n.clientId,...n.clientSecret?{client_secret:n.clientSecret}:{}}),o=await fetch(n.tokenUrl,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded",Accept:"application/json"},body:r.toString()}),i=await o.text();if(!o.ok)throw new Error(`token exchange failed (${o.status}): ${i.slice(0,200)}`);let s=JSON.parse(i);if(!s.access_token)throw new Error(`token endpoint returned no access_token: ${i.slice(0,200)}`);let a=new Go,{data:c}=a.get(n.credentialId);a.updateData(n.credentialId,{...c,accessToken:s.access_token,...s.refresh_token?{refreshToken:s.refresh_token}:{},...s.expires_in?{expiresAt:new Date(Date.now()+s.expires_in*1e3).toISOString()}:{}},{pending:void 0}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,credentialId:n.credentialId})}catch(r){return ne.call(this,t,Rt(r))}}async function Q6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.setPermissionScope requires `id`");if(e.allowUnattendedKinds!==null&&!Array.isArray(e.allowUnattendedKinds))return ne.call(this,t,"workflow.setPermissionScope requires `allowUnattendedKinds` array (or null to revoke)");let n=qe.call(this,t,e);if(!n)return;let r=e.allowUnattendedKinds===null?null:{allowUnattendedKinds:e.allowUnattendedKinds.filter(i=>typeof i=="string"),grantedAt:new Date().toISOString()},o=await n.controller.update(String(e.id),{permissionScope:r});_r(n,r?"permissionGranted":"permissionRevoked",o.id,r?{kinds:r.allowUnattendedKinds}:void 0),oo.call(this,"workflow.updated",o,n),t.id!==void 0&&this.sendResponse(t.id,Kn(o,n))}async function eK(t){let e=Se(t),n;try{n=Hu.call(this,e).cwd}catch(o){return ne.call(this,t,Rt(o))}let r=Oy({getToolManifest:()=>this.toolCatalog.getToolManifest(),listAgentIds:()=>[{id:"qlogicagent",name:"\u5C0F\u667A(\u9ED8\u8BA4)"},...this.acpDetector.list().filter(o=>o.status==="available"&&o.id!=="qlogicagent").map(o=>({id:o.id,name:o.name}))],projectRoot:n});t.id!==void 0&&this.sendResponse(t.id,{capabilities:r})}async function tK(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.export requires `id`");let n=qe.call(this,t,e);if(!n)return;let r=await n.controller.get(String(e.id)),o=IC(r);t.id!==void 0&&this.sendResponse(t.id,{bundle:o})}async function nK(t){let e=Se(t);if(!e.payload)return ne.call(this,t,"workflow.import requires `payload`");let n=qe.call(this,t,e);if(!n)return;let r=typeof e.targetWorkflowId=="string"&&e.targetWorkflowId?e.targetWorkflowId:void 0,o=r??String(e.id??`wf_${sa().slice(0,8)}`),i,s;try{if(e.format==="n8n")if(r){let a=ry(e.payload,o,{strictTemplates:!0});s=a.report,i=await n.controller.update(o,{name:String(e.name??a.name),def:a.def})}else{let a=await n.controller.importN8n(o,e.payload,{owner:ut()});i=a.record,s=a.report,e.name&&(i=await n.controller.update(o,{name:String(e.name)}))}else{let a=m6(e.payload);if(r?i=await n.controller.update(o,{name:String(e.name??a.name),def:{...a.def,id:o},...a.concurrency?{concurrency:a.concurrency}:{}}):i=await n.controller.create({id:o,name:String(e.name??a.name),owner:ut(),def:{...a.def,id:o},concurrency:a.concurrency}),a.trigger){let c=await n.controller.patch(o,{patch:[{op:"set_trigger",trigger:a.trigger}]});if(!c.ok)throw new Error(`trigger rejected: ${JSON.stringify("errors"in c?c.errors:c)}`);i=await n.controller.get(o)}}}catch(a){return ne.call(this,t,`workflow.import: ${Rt(a)}`)}_r(n,"imported",i.id,{format:e.format==="n8n"?"n8n":"bundle",...s?{conversion:s.status}:{}}),oo.call(this,r?"workflow.updated":"workflow.created",i,n),t.id!==void 0&&this.sendResponse(t.id,{...Kn(i,n),...s?{conversionReport:s}:{}})}async function rK(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.duplicate requires `id`");let n=qe.call(this,t,e);if(!n)return;let r;try{r=e.targetProjectId?Uu.call(this,Hu.call(this,{projectId:e.targetProjectId})):n}catch(c){return ne.call(this,t,Rt(c))}let o=await n.controller.get(String(e.id)),i=IC(o),s=`wf_${sa().slice(0,8)}`,a=await r.controller.create({id:s,name:String(e.name??`${o.name} \u526F\u672C`),owner:ut(),def:{...i.def,id:s},concurrency:o.concurrency});if(i.trigger){let c=await r.controller.patch(s,{patch:[{op:"set_trigger",trigger:i.trigger}]});if(!c.ok)throw new Error(`workflow.duplicate: trigger rejected: ${JSON.stringify("errors"in c?c.errors:c)}`);a=await r.controller.get(s)}_r(r,"duplicated",s,{sourceWorkflowId:String(e.id)}),oo.call(this,"workflow.created",a,r),t.id!==void 0&&this.sendResponse(t.id,Kn(a,r))}async function oK(t){let e=Se(t);if(!e.channel||typeof e.text!="string")return ne.call(this,t,"workflow.onImMessage requires `channel` and string `text`");let n=By.call(this),r=[],o=[];for(let i of n)try{r.push(...await i.scheduler.onImMessage(String(e.channel),e.text,e.payload))}catch(s){o.push({...tt(i),error:Rt(s)})}t.id!==void 0&&this.sendResponse(t.id,{outcomes:r,...o.length>0?{errors:o}:{}})}async function iK(t){let e=Se(t);if(!e.path)return ne.call(this,t,"workflow.onWebhook requires `path`");let n=String(e.path).startsWith("/")?String(e.path):`/${String(e.path)}`,r=e.payload??{},o=Fu.get(n),i=o?o.size:0;if(o)for(let l of[...o.values()])l(r);let s=By.call(this),a=[],c=[];for(let l of s)try{a.push(...await l.scheduler.onWebhook(n,e.payload))}catch(d){c.push({...tt(l),error:Rt(d)})}t.id!==void 0&&this.sendResponse(t.id,{outcomes:a,...c.length>0?{errors:c}:{},...i>0?{wokenWaits:i}:{}})}async function sK(t){let e=Se(t);if(!e.workflowId||typeof e.text!="string")return ne.call(this,t,"workflow.onIntent requires `workflowId` and string `text`");let n=qe.call(this,t,e);if(!n)return;let r=String(e.workflowId),o=await n.controller.get(r);if(!o.active||o.trigger?.type!=="intent")return ne.call(this,t,`workflow "${r}" has no active intent trigger (active=${o.active}, trigger=${o.trigger?.type??"none"})`);let i={type:"intent",text:e.text,...typeof e.surface=="string"?{surface:e.surface}:{},...typeof e.matchedPhrase=="string"?{matchedPhrase:e.matchedPhrase}:{}};this.sendNotification("workflow.runStarted",{workflowId:r,triggerType:"intent",...tt(n)});let s;try{s=await n.controller.run(r,{type:"intent",payload:i}),ol.call(this,n,s,"intent")}catch(a){throw this.sendNotification("workflow.runFailed",{workflowId:r,triggerType:"intent",error:Rt(a),...tt(n)}),a}t.id!==void 0&&this.sendResponse(t.id,s)}async function kRe(){let t=By.call(this),e=[];for(let n of t)for(let r of await n.store.listActive())r.trigger?.type==="intent"&&e.push({workflowId:r.id,projectId:n.projectId,name:r.name,trigger:r.trigger});return e}async function aK(t){let e=await kRe.call(this);t.id!==void 0&&this.sendResponse(t.id,{intents:e})}async function cK(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.revisions requires `id`");let n=qe.call(this,t,e);if(!n)return;let r=await n.store.listRevisions(String(e.id));t.id!==void 0&&this.sendResponse(t.id,{revisions:r})}async function lK(t){let e=Se(t);if(!e.id||typeof e.rev!="number")return ne.call(this,t,"workflow.revert requires `id` and numeric `rev`");let n=qe.call(this,t,e);if(!n)return;let r=await n.controller.revertTo(String(e.id),e.rev);await n.scheduler.refresh(r.id),_r(n,"reverted",r.id,{toRev:e.rev}),oo.call(this,"workflow.updated",r,n),t.id!==void 0&&this.sendResponse(t.id,Kn(r,n))}async function dK(t){let e=Se(t),n=qe.call(this,t,e);if(!n)return;let r=typeof e.limit=="number"&&e.limit>0?Math.min(e.limit,500):100,o=n.audit.list(e.id?String(e.id):void 0,r);t.id!==void 0&&this.sendResponse(t.id,{entries:o})}async function uK(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.runs requires `id`");let n=qe.call(this,t,e);if(!n)return;let r=await n.runHistory.list(String(e.id));t.id!==void 0&&this.sendResponse(t.id,{runs:r})}async function pK(t){let e=Se(t);if(!e.id||!e.runId)return ne.call(this,t,"workflow.runDetail requires `id` and `runId`");let n=qe.call(this,t,e);if(!n)return;let r=await n.runHistory.get(String(e.id),String(e.runId));if(!r)return ne.call(this,t,`run "${String(e.runId)}" not found for workflow "${String(e.id)}"`);t.id!==void 0&&this.sendResponse(t.id,{run:r})}He();de();cn();import*as ze from"node:fs";import*as Tt from"node:path";import{execFileSync as IRe}from"node:child_process";He();Ke();import*as so from"node:fs";import*as FC from"node:path";import{randomUUID as SRe}from"node:crypto";de();import*as tn from"node:fs";import*as io from"node:path";import{fileURLToPath as wRe}from"node:url";function zu(t){let e=En(t),n=io.dirname(e);tn.existsSync(n)||tn.mkdirSync(n,{recursive:!0}),UC(gw(),e),UC(io.join(mK(),"INSTRUCTIONS.md"),e);let r=wo(t);fK(hw(),r),fK(io.join(mK(),"rules"),r)}function mK(){return io.join(io.dirname(wRe(import.meta.url)),"default-project-knowledge")}function UC(t,e){if(!(!tn.existsSync(t)||tn.existsSync(e)))try{tn.mkdirSync(io.dirname(e),{recursive:!0}),tn.copyFileSync(t,e)}catch{}}function fK(t,e){if(tn.existsSync(t))try{tn.mkdirSync(e,{recursive:!0});for(let n of tn.readdirSync(t)){if(!n.endsWith(".md"))continue;let r=io.join(t,n),o=io.join(e,n);tn.statSync(r).isFile()&&UC(r,o)}}catch{}}function xRe(t){return t==="solo"||t==="product"||t==="automation"}var RRe=["creating","running","completed","failed","cancelled"];function hK(t){return typeof t=="string"&&RRe.includes(t)}async function yK(t,e){let n=ee(),r=typeof e.workspaceDir=="string"&&e.workspaceDir.trim().length>0,o=r?e.workspaceDir.trim():FC.join(n.getUserAgentHome(),"workspaces",e.name);if(e.groupId){let p=y$(e.groupId);if(p)return gK(p.workspaceDir),zu(p.workspaceDir),{project:p,isAgentTeamProject:p.type==="solo"||p.type==="product",autoSwitched:!1,deduplicated:!0}}let s=fe().find(p=>p.name===e.name);r?TRe(o):gK(o);let a=xRe(e.type),c=p$({name:e.name,workspaceDir:o,type:e.type??"personal",groupId:e.groupId,skipAutoSwitch:a}),l=c.type==="solo"||c.type==="product";a||(So(c.id),t.setActiveWorkdir(c.workspaceDir)),zu(c.workspaceDir);let d=t.projectMemoryStoreFactory.create(c.workspaceDir);return d.ensureInitialized(),a||(t.memdir=d,t.mediaPersistence.setProjectDir(c.workspaceDir)),PRe(c),await ARe(c),{project:c,nameDuplicate:s,isAgentTeamProject:l,autoSwitched:!a}}function gK(t){so.existsSync(t)||so.mkdirSync(t,{recursive:!0})}function TRe(t){if(!so.existsSync(t))throw new Error(`Workspace directory does not exist: ${t}`);if(!so.statSync(t).isDirectory())throw new Error(`Workspace path is not a directory: ${t}`)}async function ARe(t){if(t.type!=="automation")return;let e=`wf_${SRe().slice(0,8)}`,n=new Date().toISOString();await new lr(t.workspaceDir).save({id:e,name:t.name,def:{id:e,nodes:[],edges:[]},active:!1,concurrency:"queue",rev:1,createdAt:n,updatedAt:n}),or(t.id,{primaryWorkflowId:e}),t.primaryWorkflowId=e}function PRe(t){let e=ee();if(t.type!=="solo"&&t.type!=="product")return;let n=FC.join(e.getProjectAgentDir(t.workspaceDir),t.type==="solo"?"solo-state.json":"product-state.json");if(so.existsSync(n))return;let r=t.type==="solo"?{agents:[],status:"idle",createdAt:new Date().toISOString()}:{tasks:[],instances:[],status:"idle",createdAt:new Date().toISOString()};so.writeFileSync(n,JSON.stringify(r,null,2))}async function vK(t){let e=t.params;if(!e?.name){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: name"});return}let n;try{n=await yK(this,{name:e.name,workspaceDir:e.workspaceDir,type:e.type,groupId:e.groupId})}catch(a){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:a instanceof Error?a.message:`Cannot create workspace directory: ${e.workspaceDir??e.name}`});return}let{project:r,nameDuplicate:o,autoSwitched:i,deduplicated:s}=n;if(s){t.id!==void 0&&this.sendResponse(t.id,{ok:!0,project:r,deduplicated:!0});return}if(this.sendNotification("project.created",{id:r.id,name:r.name,workspaceDir:r.workspaceDir,type:r.type}),i&&this.sendNotification("project.switched",{id:r.id,name:r.name,workspaceDir:r.workspaceDir}),t.id!==void 0){let a={ok:!0,project:r};o&&(a.warning=`A project named "${o.name}" already exists at ${o.workspaceDir}. Consider renaming one of them to avoid ambiguity.`),this.sendResponse(t.id,a)}}function bK(t){let e=fe();t.id!==void 0&&this.sendResponse(t.id,{projects:e})}function kK(t){let e=t.params,n=e?.projectId?.trim(),r=e?.query?.trim();if(!n&&!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: projectId or query"});return}let o=_Re(n??r);if(!o){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,error:`Project not found: ${n??r}`});return}let i=So(o.id);if(!i){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,error:`Project not found: ${n??r}`});return}this.setActiveWorkdir(i.workspaceDir);let s=this.projectMemoryStoreFactory.create(i.workspaceDir);s.ensureInitialized(),this.memdir=s,this.mediaPersistence.setProjectDir(i.workspaceDir),this.sendNotification("project.switched",{id:i.id,name:i.name,workspaceDir:i.workspaceDir}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,project:i,projectId:i.id,name:i.name,workspaceDir:i.workspaceDir})}function _Re(t){let e=re(t);if(e?.status==="active")return e;let n=fe(),r=Number.parseInt(t,10);if(String(r)===t&&r>=1&&r<=n.length)return n[r-1]??null;let o=t.toLowerCase();return n.find(i=>i.id===t)??n.find(i=>i.name.toLowerCase()===o)??n.find(i=>i.name.toLowerCase().includes(o))??null}function CRe(t){let e=Tt.join(t,".worktrees");if(!ze.existsSync(Tt.join(t,".git"))||!ze.existsSync(e))return;let n=o=>{try{IRe("git",o,{cwd:t,stdio:"ignore",windowsHide:!0})}catch{}},r=[];try{r=ze.readdirSync(e,{withFileTypes:!0})}catch{return}for(let o of r)o.isDirectory()&&n(["worktree","remove","--force",Tt.join(e,o.name)]);n(["worktree","prune"])}function wK(t,e={}){if(e.requireManaged){let r=Tt.resolve(Tt.join(_e(),"workspaces"))+Tt.sep;if(!t.startsWith(r))return{deleted:!1,skipped:"external",error:"Project directory is outside the managed workspace root and was not deleted automatically."}}try{e.releaseDir?.(t)}catch{}CRe(t);let n;for(let r=0;r<3;r++){if(!ze.existsSync(t))return{deleted:!0};try{if(SK(t),!ze.existsSync(t))return{deleted:!0};n="Directory still present after removal (likely held by another process)."}catch(o){n=o?.message??String(o)}if(r<2){let o=Date.now();for(;Date.now()-o<300;);}}return{deleted:!1,error:n}}function SK(t){let e;try{e=ze.lstatSync(t)}catch{return}if(e.isDirectory()&&!e.isSymbolicLink()){for(let n of ze.readdirSync(t))SK(Tt.join(t,n));try{ze.rmdirSync(t)}catch{try{ze.chmodSync(t,448),ze.rmdirSync(t)}catch{}}}else try{ze.unlinkSync(t)}catch{try{ze.chmodSync(t,448),ze.unlinkSync(t)}catch{}}}function xK(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: projectId"});return}let n=re(e.projectId);if(!n){this.sendNotification("project.deleted",{id:e.projectId}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,alreadyAbsent:!0});return}if(n.type==="default"){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Cannot delete the default project"});return}let r=Tw(e.projectId);if(!r.deleted){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:"Cannot delete project"});return}let o=!1,i;if(n?.workspaceDir){let s=wK(Tt.resolve(n.workspaceDir),{requireManaged:!0,releaseDir:a=>this.mediaPersistence?.releaseProjectDir?.(a)});o=s.deleted,i=s.error}try{ze.rmSync(rr(e.projectId),{recursive:!0,force:!0})}catch(s){console.error(`[project.delete] projectData cleanup failed for ${e.projectId}:`,s instanceof Error?s.message:s)}this.sendNotification("project.deleted",{id:e.projectId}),r.switchedTo&&(this.setActiveWorkdir(r.switchedTo.workspaceDir),this.sendNotification("project.switched",{id:r.switchedTo.id,name:r.switchedTo.name,workspaceDir:r.switchedTo.workspaceDir})),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,switchedTo:r.switchedTo,dirDeleted:o,dirDeleteError:i})}function RK(t){let e=fe(),n=Tt.join(_e(),"workspaces"),r=Tt.resolve(n)+Tt.sep,o=0,i=[];for(let a of e)if(a.type!=="default"){if(Tw(a.id),o++,a.workspaceDir){let c=wK(Tt.resolve(a.workspaceDir),{releaseDir:l=>this.mediaPersistence?.releaseProjectDir?.(l)});c.error&&i.push(`${a.name}: ${c.error}`)}this.sendNotification("project.deleted",{id:a.id})}if(ze.existsSync(n)){let a=fe().find(d=>d.type==="default"),c=new Set;a?.workspaceDir&&c.add(Tt.resolve(a.workspaceDir));let l=d=>{try{let p=ze.readdirSync(d,{withFileTypes:!0});for(let m of p){if(!m.isDirectory())continue;let f=Tt.join(d,m.name);if(!c.has(Tt.resolve(f))){if(m.name==="groups"){l(f);try{ze.readdirSync(f).length===0&&ze.rmdirSync(f)}catch{}continue}try{ze.rmSync(f,{recursive:!0,force:!0})}catch(g){i.push(`orphan:${m.name}: ${g.message??g}`)}}}}catch{}};l(n)}let s=fe().find(a=>a.type==="default");s&&(this.setActiveWorkdir(s.workspaceDir),this.sendNotification("project.switched",{id:s.id,name:s.name,workspaceDir:s.workspaceDir})),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,deletedCount:o,dirErrors:i.length?i:void 0})}function TK(t){let e=t.params;if(!e?.projectId||!e?.newName){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required params: projectId, newName"});return}let n=f$(e.projectId,e.newName);if(!n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:"Cannot rename project (not found, is default, or name already taken)"});return}this.sendNotification("project.renamed",{id:n.id,name:n.name,workspaceDir:n.workspaceDir}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,project:n})}function AK(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: projectId"});return}let n=g$(e.projectId);if(!n.archived){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:"Cannot archive project (not found or is default project)"});return}this.sendNotification("project.archived",{id:e.projectId}),n.switchedTo&&(this.setActiveWorkdir(n.switchedTo.workspaceDir),this.sendNotification("project.switched",{id:n.switchedTo.id,name:n.switchedTo.name,workspaceDir:n.switchedTo.workspaceDir})),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,switchedTo:n.switchedTo})}function PK(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: projectId"});return}let n=h$(e.projectId);if(!n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:"Cannot unarchive project (not found or not archived)"});return}this.sendNotification("project.unarchived",{id:n.id,name:n.name,workspaceDir:n.workspaceDir}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,project:n})}function IK(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"projectId is required"});return}let n={};if("planStatus"in e){if(e.planStatus!==void 0&&!hK(e.planStatus)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:`Invalid planStatus: ${e.planStatus}`});return}n.planStatus=e.planStatus}"planAgents"in e&&(n.planAgents=e.planAgents),"planWinnerId"in e&&(n.planWinnerId=e.planWinnerId),"leaderSessionId"in e&&(n.leaderSessionId=e.leaderSessionId),"primaryWorkflowId"in e&&(n.primaryWorkflowId=e.primaryWorkflowId);let r=or(e.projectId,n);t.id!==void 0&&this.sendResponse(t.id,{ok:r})}He();import{randomUUID as zC}from"node:crypto";import*as Sn from"node:fs";import*as Ko from"node:path";var Cr=class{sessionId;_trustAccepted=!1;_modelUsage=new Map;_totalInputTokens=0;_totalOutputTokens=0;_turnCount=0;_toolCallCount=0;_listeners=new Set;constructor(e){this.sessionId=e}get trustAccepted(){return this._trustAccepted}setTrustAccepted(e){this._trustAccepted=e,this.notifyListeners()}get totalInputTokens(){return this._totalInputTokens}get totalOutputTokens(){return this._totalOutputTokens}get turnCount(){return this._turnCount}get toolCallCount(){return this._toolCallCount}getModelUsage(e){return this._modelUsage.get(e)}getAllModelUsage(){let e={};for(let[n,r]of this._modelUsage)e[n]={...r};return e}addUsage(e,n){this._totalInputTokens+=e.inputTokens,this._totalOutputTokens+=e.outputTokens;let r=this._modelUsage.get(n);r?(r.inputTokens+=e.inputTokens,r.outputTokens+=e.outputTokens,r.cacheRead+=e.cacheRead??0,r.cacheCreation+=e.cacheWrite??0):this._modelUsage.set(n,{inputTokens:e.inputTokens,outputTokens:e.outputTokens,cacheRead:e.cacheRead??0,cacheCreation:e.cacheWrite??0,mediaCalls:0,mediaDurationSeconds:0,mediaCharacters:0}),this.notifyListeners()}addMediaUsage(e,n,r){let o=this._modelUsage.get(e),i=o??{inputTokens:0,outputTokens:0,cacheRead:0,cacheCreation:0,mediaCalls:0,mediaDurationSeconds:0,mediaCharacters:0};switch(o||this._modelUsage.set(e,i),i.mediaCalls+=1,n){case"per_second":i.mediaDurationSeconds+=r;break;case"per_character":i.mediaCharacters+=r;break;case"per_token":i.outputTokens+=r;break}this.notifyListeners()}recordToolCall(){this._toolCallCount++}recordTurnCompleted(){this._turnCount++}createSnapshot(){return{sessionId:this.sessionId,modelUsage:this.getAllModelUsage(),totalInputTokens:this._totalInputTokens,totalOutputTokens:this._totalOutputTokens,turnCount:this._turnCount,lastSavedAt:Date.now()}}restoreFromSnapshot(e){if(e.sessionId!==this.sessionId)return!1;this._totalInputTokens=e.totalInputTokens,this._totalOutputTokens=e.totalOutputTokens,this._turnCount=e.turnCount,this._modelUsage.clear();for(let[n,r]of Object.entries(e.modelUsage))this._modelUsage.set(n,{...r});return this.notifyListeners(),!0}onStateChange(e){return this._listeners.add(e),()=>{this._listeners.delete(e)}}notifyListeners(){for(let e of this._listeners)try{e()}catch{}}};He();Ke();import*as _K from"node:fs";import*as HC from"node:path";var Xi=class{getSessionsRoot(e){let n=re(e);if(!n)throw new Error(`Project not found: ${e}`);return ee().getProjectSessionDataRoot(n.workspaceDir)}getProjectWorkspaceDir(e){let n=re(e);if(!n)throw new Error(`Project not found: ${e}`);return n.workspaceDir}getSessionDir(e,n){return HC.join(this.getSessionsRoot(e),n)}resolveWorkspaceDir(e,n){if(n){let o=re(n);if(o)return o.workspaceDir}let r=fe();for(let o of r){let i=ee().getProjectSessionDataRoot(o.workspaceDir),s=HC.join(i,e);try{if(_K.existsSync(s))return o.workspaceDir}catch{}}return this.getActiveProjectWorkspaceDir()}getActiveProjectWorkspaceDir(){let e=Me();if(e)return e.workspaceDir;let n=fe();if(n.length>0)return n[0].workspaceDir;throw new Error("No active project available")}getActiveProjectId(){let e=Me();if(e)return e.id;let n=fe();if(n.length>0)return n[0].id;throw new Error("No active project available")}getDefaultProjectId(){let e=tm();if(e)return e.id;throw new Error("No default project available")}};si();jt();import{randomUUID as CK}from"node:crypto";async function EK(t,e){let n=new Date(t.lastActiveAt).getTime();if(Date.now()-n<OM)return{split:!1,activeSessionId:t.sessionId};let i=CK(),s=new Date().toISOString();await yt(t.sessionId,{sealedAt:s},e);let a=t.taskSummary?`[\u4E0A\u4E00\u8F6E\u5BF9\u8BDD\u6458\u8981] ${t.taskSummary}`:void 0;return await yt(i,{sessionId:i,projectId:t.projectId,type:"group",ownerId:t.ownerId,groupKey:t.groupKey,groupName:t.groupName,groupPlatform:t.groupPlatform,previousSessionId:t.sessionId,carryoverSummary:a},e),{split:!0,activeSessionId:i,sealedSessionId:t.sessionId}}async function MK(t,e){if(t.type!=="group")return{split:!1,activeSessionId:t.sessionId};if(t.turnCount<jM)return{split:!1,activeSessionId:t.sessionId};let n=CK(),r=new Date().toISOString();await yt(t.sessionId,{sealedAt:r},e);let o=t.taskSummary?`[\u4E0A\u4E00\u8F6E\u5BF9\u8BDD\u6458\u8981 \u2014 \u56E0\u6D88\u606F\u6570\u8FBE\u5230\u4E0A\u9650\u81EA\u52A8\u5207\u5206] ${t.taskSummary}`:void 0;return await yt(n,{sessionId:n,projectId:t.projectId,type:"group",ownerId:t.ownerId,groupKey:t.groupKey,groupName:t.groupName,groupPlatform:t.groupPlatform,previousSessionId:t.sessionId,carryoverSummary:o},e),{split:!0,activeSessionId:n,sealedSessionId:t.sessionId}}de();cn();import*as Bu from"node:fs";import*as aa from"node:path";Ke();var qy=class{constructor(e=new Xi,n=ee()){this.locator=e;this.pathService=n}locator;pathService;getActiveProjectId(){return this.locator.getActiveProjectId()}getDefaultProjectId(){return this.locator.getDefaultProjectId()}getProjectWorkspaceDir(e){return this.locator.getProjectWorkspaceDir(e)}resolveWorkspaceDir(e,n){return this.locator.resolveWorkspaceDir(e,n)}async listThreads(e,n){let r=n??this.getActiveProjectId(),o=this.getProjectWorkspaceDir(r);return(await ln(e,o)).map(s=>({id:s.sessionId,title:s.title,status:"active",turnCount:s.messageCount,createdAt:s.createdAt,lastActiveAt:s.lastActiveAt}))}getHostSessionWorkspaceDirs(e,n=[]){return DRe([e.getActiveProjectRoot(),...MRe()]).filter(r=>!n.some(o=>DK(o,r)))}async listHostWorkspaceSessions(e,n,r=[]){let o=this.getHostSessionWorkspaceDirs(e,r);return(await Promise.all(o.map(s=>ln(n,s)))).flat()}resolveSessionWorkspaceDir(e,n,r){let o;for(let i of this.getHostSessionWorkspaceDirs(e)){if(w$(n,i))return i;let s=aa.join(this.pathService.getProjectSessionDataRoot(i),ERe(n));try{if(!Bu.existsSync(s))continue;o??=i;let a=aa.join(s,"transcript.jsonl");if(Bu.existsSync(a)&&Bu.statSync(a).size>0)return i}catch{}}return o||(r?this.resolveWorkspaceDir(n,r):this.resolveWorkspaceDir(n))}};function ERe(t){return t.replace(/[^a-zA-Z0-9_-]/g,"_")}function MRe(){return[]}function DK(t,e){return aa.resolve(t).toLowerCase()===aa.resolve(e).toLowerCase()}function DRe(t){let e=[];for(let n of t){let r=n?.trim();if(!r)continue;let o=aa.resolve(r);e.some(i=>DK(i,o))||e.push(o)}return e}var $Re=new Xi,wn=new qy($Re);function pr(t,e="Unknown error"){return t instanceof Error?t.message:e}var NRe=/Uploaded attachment references:|\[标注元素\]|\[标注区域\]|\[附件\]\s*(?:图片|视频|音频|文件)\d/;function ORe(t){for(let e of t)if(e.role==="user"&&typeof e.content=="string"&&NRe.test(e.content))return!0;return!1}function il(t,e,n){return wn.resolveSessionWorkspaceDir(t,e,n)}function OK(t,e){let n=t.messageCount??0,r=e.messageCount??0;return r!==n?r>n?e:t:e.lastActiveAt!==t.lastActiveAt&&e.lastActiveAt>t.lastActiveAt?e:t}function $K(...t){let e=new Map;for(let n of t)for(let r of n){let o=e.get(r.sessionId);e.set(r.sessionId,o?OK(o,r):r)}return[...e.values()].sort((n,r)=>n.lastActiveAt>r.lastActiveAt?-1:n.lastActiveAt<r.lastActiveAt?1:0)}async function jRe(t){let e=null;for(let n of fe()){if(!n.workspaceDir)continue;let o=(await ln(500,n.workspaceDir)).find(s=>s.sessionId===t);if(!o)continue;let i={entry:o,projectId:o.projectId??n.id,workspaceDir:n.workspaceDir};(!e||OK(e.entry,o)===o)&&(e=i)}return e}async function NK(t,e,n){return wn.listHostWorkspaceSessions(t,e,n)}async function LRe(t){let e=new Set,n=[...new Set(t.map(r=>Ko.resolve(r).toLowerCase()))];return await Promise.all(n.map(async r=>{for(let o of await S$(r))e.add(o)})),e}function jK(t){let e=t.params,n=e?.id??zC();this.log(`[thread.create] id=${n} title=${e?.title??"(none)"}`),e?.cwd&&typeof e.cwd=="string"&&this.setActiveWorkdir(e.cwd),this.currentSessionId=n,this.sessionState=new Cr(n),this.memoryPrefetchState=tr(),this.enableIdleDream(),t.id!==void 0&&this.sendResponse(t.id,{id:n,title:e?.title,status:"active",createdAt:new Date().toISOString()})}async function LK(t){let e=t.params,n=e?.limit??20;try{let r=await wn.listThreads(n,e?.projectId);t.id!==void 0&&this.sendResponse(t.id,{threads:r})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to list threads: ${pr(r)}`})}}async function UK(t){let e=t.params,n=e?.sessionId??zC();try{let r=e?.projectId??wn.getActiveProjectId(),o=wn.getProjectWorkspaceDir(r);await yt(n,{sessionId:n,title:e?.title,type:e?.type,ownerPlatform:e?.ownerPlatform,ownerId:e?.ownerId,groupKey:e?.groupKey,groupName:e?.groupName,groupPlatform:e?.groupPlatform,projectId:r},o),t.id!==void 0&&this.sendResponse(t.id,{sessionId:n,title:e?.title})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to create session: ${pr(r)}`})}}async function FK(t){let e=t.params;if(t.id===void 0)return;let n=e?.platform??"desktop",r=e?.chatId,o=e?.chatType,i=e?.userId??"local";try{if(n==="desktop"&&r){let p=e?.projectId??wn.getActiveProjectId(),m=wn.getProjectWorkspaceDir(p),f=await jRe(r);if(f){let g=Vt(r,f.workspaceDir),h=g?.projectId??f.projectId;this.sendResponse(t.id,{sessionId:r,title:g?.title??f.entry.title,type:g?.type??f.entry.type??"personal",agentId:g?.agentId,ownerPlatform:g?.ownerPlatform,ownerId:g?.ownerId??i,groupKey:g?.groupKey,groupPlatform:g?.groupPlatform,groupName:g?.groupName,projectId:h});return}await yt(r,{sessionId:r,type:"personal",ownerPlatform:n==="desktop"?void 0:n,ownerId:i,projectId:p},m),this.sendResponse(t.id,{sessionId:r,type:"personal",ownerPlatform:n==="desktop"?void 0:n,ownerId:i,projectId:p});return}if(o==="group"&&r&&n){let p=`group:${n}:${r}`,m=fe();for(let f of m){if(!f.workspaceDir)continue;let h=(await ln(500,f.workspaceDir)).find(y=>y.groupKey===p&&!y.sealedAt&&!y.archivedAt);if(h){let y=Vt(h.sessionId,f.workspaceDir);if(y){let b=await EK(y,f.workspaceDir);if(b.split){this.sendResponse(t.id,{sessionId:b.activeSessionId,title:void 0,type:"group",ownerPlatform:y.ownerPlatform,ownerId:i,groupKey:p,groupPlatform:n,groupName:e?.groupName,projectId:f.id,previousSessionId:b.sealedSessionId});return}}this.sendResponse(t.id,{sessionId:h.sessionId,title:h.title,type:"group",ownerPlatform:y?.ownerPlatform,ownerId:i,groupKey:p,groupPlatform:n,groupName:e?.groupName,projectId:f.id});return}}}if(o!=="group"&&n!=="desktop"&&i){let p=e?.projectId?re(e.projectId):tm(),m=p?[p]:[];for(let f of m){if(!f.workspaceDir)continue;let g=await ln(500,f.workspaceDir);for(let h of g){if(h.type!=="personal"||h.sealedAt||h.archivedAt)continue;let y=Vt(h.sessionId,f.workspaceDir);if(!y?.archivedAt&&!(y?.ownerPlatform!==n||y.ownerId!==i)){this.sendResponse(t.id,{sessionId:y.sessionId,title:y.title??h.title,type:"personal",ownerPlatform:y.ownerPlatform,ownerId:y.ownerId,projectId:y.projectId??f.id});return}}}}let s=zC(),a=e?.projectId??wn.getDefaultProjectId(),c=wn.getProjectWorkspaceDir(a),l=o==="group"?`group:${n}:${r}`:void 0,d=URe(e?.title);await yt(s,{sessionId:s,title:d,type:o==="group"?"group":"personal",ownerPlatform:o==="group"||n==="desktop"?void 0:n,ownerId:i,groupKey:l,groupPlatform:o==="group"?n:void 0,groupName:e?.groupName,projectId:a},c),this.sendResponse(t.id,{sessionId:s,title:d,type:o==="group"?"group":"personal",ownerPlatform:o==="group"||n==="desktop"?void 0:n,ownerId:i,groupKey:l,groupPlatform:o==="group"?n:void 0,groupName:e?.groupName,projectId:a})}catch(s){this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to resolve session: ${pr(s)}`})}}function URe(t){return zl(t,{maxLength:40})}async function HK(t){let e=t.params,n=e?.limit??50;try{let r,o=new Set;if(e?.projectId){let a=re(e.projectId);if(!a){t.id!==void 0&&this.sendResponse(t.id,{sessions:[]});return}let c=a.workspaceDir;o.add(c),r=await ln(n*2,c);let l=await NK(this,n*2,[c]);for(let d of wn.getHostSessionWorkspaceDirs(this,[c]))o.add(d);r=$K(r,l.filter(d=>d.projectId===e.projectId)),r=r.filter(d=>d.projectId===e.projectId);for(let d of r)d.projectId=e.projectId}else{let a=fe(),c=[],l=[];for(let p of a){if(!p.workspaceDir)continue;l.push(p.workspaceDir),o.add(p.workspaceDir);let m=await ln(n,p.workspaceDir);for(let f of m)f.projectId&&c.push(f)}let d=(await NK(this,n,l)).filter(p=>p.projectId);for(let p of wn.getHostSessionWorkspaceDirs(this,l))o.add(p);r=$K(c,d)}let i=await LRe([...o]);i.size>0&&(r=r.filter(a=>!i.has(a.sessionId))),e?.archived===!0?r=r.filter(a=>a.archivedAt!=null):e?.archived===!1&&(r=r.filter(a=>a.archivedAt==null));let s=r.slice(0,n).map(a=>({sessionId:a.sessionId,title:a.title,type:a.type??"personal",agentId:a.agentId,lastActiveAt:a.lastActiveAt,messageCount:a.messageCount,pinnedAt:a.pinnedAt??null,archivedAt:a.archivedAt??null,sealedAt:a.sealedAt??null,projectId:a.projectId,previousSessionId:a.previousSessionId??null,carryoverSummary:a.carryoverSummary??null}));t.id!==void 0&&this.sendResponse(t.id,{sessions:s})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to list sessions: ${pr(r)}`})}}async function zK(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let n=il(this,e.sessionId,e.projectId),o=(await ln(500,n)).find(i=>i.sessionId===e.sessionId);t.id!==void 0&&this.sendResponse(t.id,{session:o?{sessionId:o.sessionId,title:o.title,type:o.type,lastActiveAt:o.lastActiveAt,messageCount:o.messageCount,pinnedAt:o.pinnedAt??null,archivedAt:o.archivedAt??null,projectId:o.projectId}:null})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to get session: ${pr(n)}`})}}async function BK(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let n=il(this,e.sessionId,e.projectId),r=await Hr(e.sessionId,n,{includeDisplayMetadata:!0});if(!r){t.id!==void 0&&this.sendResponse(t.id,{messages:[],total:0});return}let o=r.messages;if(ORe(o)){this.log(`[session] purging legacy baked-attachment session ${e.sessionId} (VS Code two-line cutover)`);try{await yt(e.sessionId,{archivedAt:new Date().toISOString()},n)}catch{}t.id!==void 0&&this.sendResponse(t.id,{messages:[],total:0});return}let i=e.limit&&e.limit>0?e.limit:o.length,s=o.slice(-i);t.id!==void 0&&this.sendResponse(t.id,{messages:s,total:o.length})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to get messages: ${pr(n)}`})}}async function qK(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let n=il(this,e.sessionId,e.projectId),r=await yt(e.sessionId,{...e.title!==void 0?{title:e.title}:{},...e.pinnedAt!==void 0?{pinnedAt:e.pinnedAt}:{},...e.archivedAt!==void 0?{archivedAt:e.archivedAt}:{}},n);r&&this.sendNotification("session.info",{sessionId:e.sessionId,title:r.title,pinnedAt:r.pinnedAt??null,archivedAt:r.archivedAt??null,projectId:e.projectId||void 0}),t.id!==void 0&&this.sendResponse(t.id,{ok:r!==null})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to update session: ${pr(n)}`})}}async function WK(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: sessionId"});return}if(!e.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: projectId"});return}try{let n=il(this,e.sessionId,e.projectId);await dm(e.sessionId,n),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to delete session: ${pr(n)}`})}}async function GK(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: projectId"});return}try{let n=wn.getProjectWorkspaceDir(e.projectId),r=(await ln(1e4,n)).filter(i=>i.projectId===e.projectId),o=0;for(let i of r)await dm(i.sessionId,n),o++;t.id!==void 0&&this.sendResponse(t.id,{ok:!0,deletedCount:o})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to delete all sessions: ${pr(n)}`})}}async function KK(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let n=il(this,e.sessionId,e.projectId);await yt(e.sessionId,{archivedAt:new Date().toISOString()},n),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to archive session: ${pr(n)}`})}}async function VK(t){let e=t.params,n=e?.sessionId;if(!n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"sessionId is required"});return}try{let r=il(this,n,e?.projectId),o=await Hr(n,r);if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:`Session not found: ${n}`});return}o.messages&&o.messages.length>0&&this.sessionHistory.saveResumedSession(n,o.messages),t.id!==void 0&&this.sendResponse(t.id,{metadata:o.metadata,messages:o.messages})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to resume session: ${pr(r)}`})}}function JK(t){let e=this.currentSessionId||"default",n=this.sessionState?.createSnapshot(),r,o=this.getActiveProjectRoot();o&&(r=Ko.join(ci(o),e));let i={sessionId:e,model:this.currentModel||void 0,cwd:process.cwd(),paths:{sessionDir:r,agentHome:_e(),settings:Cn()},usage:n?{turnCount:n.turnCount,inputTokens:n.totalInputTokens,outputTokens:n.totalOutputTokens}:void 0};t.id!==void 0&&this.sendResponse(t.id,i)}function ZK(t){let e=t.params,n=null;if(e?.projectId)n=re(e.projectId);else if(e?.projectName){let i=fe(),s=e.projectName.toLowerCase();if(n=i.find(a=>a.name.toLowerCase()===s)??null,n||(n=i.find(a=>a.name.toLowerCase().includes(s))??null),!n){let a=i.map(c=>c.name).slice(0,10);t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`No project matching "${e.projectName}". Available: ${a.join(", ")||"(none)"}`});return}}else{t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: projectId or projectName"});return}if(!n||n.status!=="active"){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Project not found or archived: ${e.projectId??e.projectName}`});return}let r=e.workspaceDir??n.workspaceDir;if(!Sn.existsSync(r)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Workspace directory does not exist: ${r}`});return}let o=So(n.id);if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:"Switch failed"});return}this.setActiveWorkdir(o.workspaceDir),this.sendNotification("project.switched",{id:o.id,name:o.name,workspaceDir:o.workspaceDir}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,project:o})}function XK(t){let e=Me(),n=fe();t.id!==void 0&&this.sendResponse(t.id,{sessionId:this.currentSessionId,activeProject:e,projects:n})}async function YK(t){let e=t.params,n=e?.sessionId;if(!n){t.id!==void 0&&this.sendResponse(t.id,{ok:!1});return}let r=fe();for(let o of r)try{let i=wn.getProjectWorkspaceDir(o.id),s=await Vt(n,i);if(s&&s.projectId===o.id){So(o.id),this.setActiveWorkdir(i),this.log(`[session.focus] switched to project ${o.id} for session ${n}`),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,projectId:o.id});return}}catch{}if(e?.projectName){let o=r.find(i=>i.name===e.projectName);if(o){let i=wn.getProjectWorkspaceDir(o.id);this.getActiveProjectRoot()!==i&&(this.setActiveWorkdir(i),this.log(`[session.focus] switched to project ${o.id} by name "${e.projectName}"`)),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,projectId:o.id});return}}t.id!==void 0&&this.sendResponse(t.id,{ok:!1})}async function QK(t){let e=t.params,{sessionId:n,fromProjectId:r,toProjectId:o}=e??{};if(!n||!r||!o){t.id!==void 0&&this.sendError(t.id,w.INVALID_PARAMS,"sessionId, fromProjectId, and toProjectId are required");return}if(r===o){t.id!==void 0&&this.sendResponse(t.id,{ok:!0});return}let i=re(r),s=re(o);if(!i||!s){t.id!==void 0&&this.sendError(t.id,w.INVALID_PARAMS,"Source or target project not found");return}let a=Ko.join(ci(r),n),c=Ko.join(ci(o),n);if(!Sn.existsSync(a)){t.id!==void 0&&this.sendError(t.id,w.INVALID_PARAMS,`Session ${n} not found in project ${r}`);return}try{Sn.mkdirSync(Ko.dirname(c),{recursive:!0}),Sn.cpSync(a,c,{recursive:!0});let l=Ko.join(c,"metadata.json");if(Sn.existsSync(l)){let d=JSON.parse(Sn.readFileSync(l,"utf-8"));d.projectId=o,Sn.writeFileSync(l,JSON.stringify(d,null,2))}Sn.rmSync(a,{recursive:!0,force:!0}),this.sendNotification("session-update",{sessionId:n,projectId:o}),this.log(`[session.moveToProject] moved ${n}: ${r} -> ${o}`),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,projectId:o})}catch(l){let d=pr(l);this.log(`[session.moveToProject] error: ${d}`),t.id!==void 0&&this.sendError(t.id,w.INTERNAL_ERROR,`Move failed: ${d}`)}}pt();import{spawn as FRe}from"node:child_process";function HRe(){return process.platform==="win32"?[{command:"powershell.exe",args:["-NoProfile","-Command","[Console]::In.ReadToEnd() | Set-Clipboard"]},{command:"pwsh.exe",args:["-NoProfile","-Command","[Console]::In.ReadToEnd() | Set-Clipboard"]}]:process.platform==="darwin"?[{command:"pbcopy",args:[]}]:[{command:"wl-copy",args:[]},{command:"xclip",args:["-selection","clipboard"]},{command:"xsel",args:["--clipboard","--input"]}]}function zRe(t,e){return new Promise((n,r)=>{let o=FRe(t.command,t.args,{stdio:["pipe","ignore","pipe"],windowsHide:!0}),i="",s=setTimeout(()=>{o.kill(),r(new Error("Clipboard command timed out"))},3e3);o.stderr?.on("data",a=>{i+=String(a)}),o.on("error",a=>{clearTimeout(s),r(a)}),o.on("close",a=>{if(clearTimeout(s),a===0){n();return}r(new Error(i.trim()||`Clipboard command exited with code ${a}`))}),o.stdin.end(e)})}async function BRe(t){let e;for(let r of HRe())try{await zRe(r,t);return}catch(o){e=o}let n=e instanceof Error?e.message:"No clipboard command available";throw new Error(`System clipboard unavailable: ${n}`)}function qRe(t){return t.length<=8?"****":`${t.slice(0,3)}***${t.slice(-4)}`}function at(t,e,n,r=w.INTERNAL_ERROR){if(e.id!==void 0){if(typeof t.sendError=="function"){t.sendError(e.id,r,n);return}t.sendResponse(e.id,void 0,{code:r,message:n})}}function qC(t,e){at(t,e,Xl)}function WRe(t){let e={};for(let n of t)for(let r of n.routeIntents)e[r]??=[],e[r].push(n);return e}async function GRe(){let t=V(),e=await Ma(t);return Ql(t),t.save(),e}async function KRe(t){try{return await GRe(),!0}catch(e){if(t)throw e;return!1}}function tV(t=V()){return rN()}function WC(t){return t.id===vt?vt:t.group?.trim()||t.id}function VRe(t){return t.id===WC(t)}function eV(t){let e=WC(t);return Im({...t,id:e})}function JRe(t){return{volcengine:"\u5E38\u89C4 Ark API Key","volcengine-plan":"\u8BA2\u9605 / Plan \u901A\u9053",qwen:"\u5E38\u89C4 DashScope API Key","qwen-coding":"Coding Plan \u901A\u9053",zhipu:"Anthropic \u901A\u9053","zhipu-openai":"OpenAI \u517C\u5BB9\u901A\u9053","zhipu-coding":"Coding \u901A\u9053"}[t.id]??Im(t)}function ZRe(t){return t.authType==="none"?!1:t.apiKeyEnvVars===void 0||t.apiKeyEnvVars.length>0}function XRe(t){return{id:t.id,displayName:JRe(t),baseUrl:di(t)??"",modelCount:t.models?.length??0}}function YRe(t){let e=new Map;for(let n of t){if(!ZRe(n))continue;let r=WC(n);if(r===vt)continue;let o=n.models?.length??0,i=XRe(n),s=e.get(r);if(!s){e.set(r,{id:r,displayName:eV(n),baseUrl:di(n)??"",modelCount:o,variants:[i]});continue}s.modelCount+=o,s.variants??=[],s.variants.some(a=>a.id===i.id)||s.variants.push(i),VRe(n)&&(s.displayName=eV(n),s.baseUrl=di(n)??s.baseUrl)}return Array.from(e.values()).map(({variants:n,...r})=>({...r,...n&&n.length>1?{variants:n}:{}}))}async function nV(){if(V().isHydratedFromUpstream())return!0;let t=await KRe(!1);return t&&V().markHydratedFromUpstream(),t}function rV(){V().markHydratedFromUpstream()}function QRe(t){return t.defaultModel??t.models?.find(e=>!!e.id)?.id}function eTe(t){return[...new Set(t)]}function tTe(t){let e=t.replace(/\/+$/,"");return eTe([`${e}/models`,/\/v\d+$/.test(e)?`${e}/models`:`${e}/v1/models`])}function nTe(t){return t===404||t===405||t===410||t===501}async function rTe(t){let e=await Kw(t);if(e)return{id:e.id,transport:e.transport,baseUrl:di(e),authType:e.authType,models:e.models}}function BC(t){return{accept:"application/json",Authorization:`Bearer ${t}`}}function oTe(t,e,n,r){if(t===vt)return[{method:"GET",url:Ww(n),headers:BC(e)}];let o=iTe(n,r).replace(/\/+$/,""),i=r?.transport,s=QRe(r??{id:t}),a=[];if(i==="anthropic-messages")return/\/anthropic$/.test(o)&&a.push({method:"GET",url:`${o.replace(/\/anthropic$/,"")}/models`,headers:BC(e)}),s&&a.push({method:"POST",url:`${o}/v1/messages`,headers:{"Content-Type":"application/json","x-api-key":e,"anthropic-version":"2023-06-01"},body:{model:s,messages:[{role:"user",content:"ping"}],max_tokens:1,stream:!1}}),a;if(i==="gemini-generatecontent")return s?[{method:"POST",url:`${o}/models/${encodeURIComponent(s)}:generateContent`,headers:{"Content-Type":"application/json","x-goog-api-key":e},body:{contents:[{role:"user",parts:[{text:"ping"}]}],generationConfig:{maxOutputTokens:1}}}]:a;if(i==="volcengine-responses")return s?[{method:"POST",url:`${o.replace(/\/v\d+$/,"")}/v3/responses`,headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:{model:s,input:[{role:"user",content:[{type:"input_text",text:"ping"}]}],max_output_tokens:1,stream:!1,store:!1}}]:a;for(let c of tTe(o))a.push({method:"GET",url:c,headers:BC(e)});return a}function iTe(t,e){let n=t.trim(),r=e?.baseUrl?.trim();return e?.transport==="anthropic-messages"&&r&&/\/anthropic\/?$/.test(r)&&!/\/anthropic\/?$/.test(n)?r:n}async function sTe(t){try{let e=await fetch(t.url,{method:t.method,headers:t.headers,body:t.body?JSON.stringify(t.body):void 0,signal:AbortSignal.timeout(1e4)});if(e.ok)return{valid:!0,status:e.status,url:t.url};let n=await e.text().catch(()=>"");return{valid:!1,status:e.status,error:n.slice(0,500),url:t.url}}catch(e){return{valid:!1,status:0,error:e instanceof Error?e.message:String(e),url:t.url}}}async function oV(t,e,n){let r=await rTe(t),o=oTe(t,e,n,r);if(o.length===0)return{valid:!1,status:0,error:`No validation probe is available for provider "${t}".`};let i;for(let s of o){let a=await sTe(s);if(a.valid)return a;if(nTe(a.status)){i=a;continue}return a}return i??{valid:!1,status:0,error:`No validation probe succeeded for provider "${t}".`}}async function aTe(t,e,n){let r=await oV(t,e,n);if(!r.valid){let o=r.error?`: ${r.error}`:"";throw new Error(`API Key validation failed (${r.status})${o}`)}}async function iV(t){try{let e=await Yl(),n=e.find(o=>o.id===vt);if(!n)throw new Error(Xl);let r=YRe(e);r.unshift({id:vt,displayName:qw,baseUrl:di(n)??tV(),modelCount:e.reduce((o,i)=>o+(i.models?.length??0),0)}),t.id!==void 0&&this.sendResponse(t.id,{providers:r})}catch(e){at(this,t,e instanceof Error?e.message:String(e))}}async function sV(t){let e=t.params;if(!e?.providerId||!e?.key){at(this,t,"Required: providerId (string), key (string)",w.INVALID_PARAMS);return}let{providerId:n,key:r,label:o}=e,i=V(),s,a=!1;try{let c=await vV(n);if(!c){at(this,t,`Unknown provider: ${n}`,w.INVALID_PARAMS);return}let l=i.getProviderStatus(n);if(l?.keys.some(p=>p.key===r)){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,error:"\u8BE5 Key \u5DF2\u5B58\u5728\uFF0C\u65E0\u9700\u91CD\u590D\u6DFB\u52A0"});return}a=!l;let d=l?.keys.map(p=>p.id)??[];if(i.addProvider(n,{baseUrl:c}),s=i.addKey(n,r,{label:o}),n===vt){if((await lN(i,{baseUrl:c,apiKey:r})).length===0)throw new Error("LLMRouter did not return any available models for this API Key.")}else await aTe(n,r,c);await Ma(i),rV();for(let p of Jl)if(!i.getBinding(p)){let m=i.listModels({purpose:p,provider:n,enabledOnly:!0});m.length===0&&(m=i.listModels({purpose:p,provider:n}),m[0]&&i.enableModel(m[0].id)),m.length>0&&i.setBinding(p,m[0].id)}if(i.setKeyHealth(s,"healthy"),e.replaceExisting===!0)for(let p of d)i.updateKey(p,{enabled:!1});i.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,keyId:s,providerId:n})}catch(c){s&&(i.removeKey(s),a&&i.removeProvider(n));let l=c instanceof Error?c.message:Xl;at(this,t,l)}}function aV(t){let e=t.params;if(!e?.keyId){at(this,t,"Required: keyId (string)",w.INVALID_PARAMS);return}let n=V();if(!n.removeKey(e.keyId)){at(this,t,"API Key not found",w.INVALID_PARAMS);return}n.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}function cV(t){let e=t.params;if(!e?.keyId){at(this,t,"Required: keyId (string)",w.INVALID_PARAMS);return}let n=V().getKeyById(e.keyId);if(!n){at(this,t,"API Key not found",w.INVALID_PARAMS);return}t.id!==void 0&&this.sendResponse(t.id,{key:n})}async function lV(t){let e=t.params;if(!e?.keyId){at(this,t,"Required: keyId (string)",w.INVALID_PARAMS);return}let n=V().getKeyById(e.keyId);if(!n){at(this,t,"API Key not found",w.INVALID_PARAMS);return}try{await(this.writeClipboard?this.writeClipboard(n):BRe(n)),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(r){let o=r instanceof Error?r.message:"\u590D\u5236 Key \u5931\u8D25";at(this,t,o)}}function dV(t){let e=t.params;if(!e?.keyId||typeof e.enabled!="boolean"){at(this,t,"Required: keyId (string), enabled (boolean)",w.INVALID_PARAMS);return}let n=V();if(!n.updateKey(e.keyId,{enabled:e.enabled})){at(this,t,"API Key not found",w.INVALID_PARAMS);return}n.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}function uV(t){let e=t.params;if(!e?.modelId||typeof e.enabled!="boolean"){at(this,t,"Required: modelId (string), enabled (boolean)",w.INVALID_PARAMS);return}let n=V();e.enabled?n.enableModel(e.modelId):n.disableModel(e.modelId),n.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}async function pV(t){let e=t.params;try{await nV();let n=V(),r=new Set(n.getAllProviderStatus().filter(i=>i.keys.length>0).map(i=>i.providerId)),o=n.listModels({purpose:e?.purpose,provider:e?.provider}).filter(i=>n.hasConfiguredKeyForProviderVariant(i.provider));t.id!==void 0&&this.sendResponse(t.id,{models:o,grouped:WRe(o),configuredProviderIds:[...r]})}catch{qC(this,t)}}function mV(t){let e=t.params;if(!e?.purpose||!e?.modelId){at(this,t,"Required: purpose (string), modelId (string)",w.INVALID_PARAMS);return}try{let n=V();n.setBinding(e.purpose,e.modelId),n.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(n){at(this,t,n instanceof Error?n.message:String(n),w.INVALID_PARAMS)}}function fV(t){let e=t.params;if(!e?.purpose){at(this,t,"Required: purpose (string)",w.INVALID_PARAMS);return}let n=V(),r=n.getBinding(e.purpose);t.id!==void 0&&this.sendResponse(t.id,{model:r?{id:r.id,provider:r.provider,model:r.model,displayName:r.displayName,routeIntents:r.routeIntents,capabilityProfile:r.capabilityProfile,enabled:r.enabled}:null,available:n.isAvailable(e.purpose)})}async function gV(t){try{await nV();let e=V(),n=e.getAllProviderStatus().map(i=>({providerId:i.providerId,displayName:i.providerId===vt?qw:i.providerId,baseUrl:i.baseUrl,keyCount:i.keys.length,healthyKeys:i.keys.filter(s=>s.healthStatus==="healthy"&&s.enabled).length,totalKeys:i.keys.length,keys:i.keys.map(s=>({id:s.id,label:s.label,maskedKey:qRe(s.key),enabled:s.enabled,health:s.healthStatus}))})),r=e.getAllBindings(),o={};for(let i of Jl){let s=r[i];o[i]={bound:!!s,modelId:s?.id,modelName:s?.displayName,available:e.isAvailable(i)}}t.id!==void 0&&this.sendResponse(t.id,{providers:n,purposes:o})}catch{qC(this,t)}}async function hV(t){try{let e=V();e.load(),await Ma(e,void 0,{force:!0}),Ql(e),e.save(),rV(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,catalogRefreshed:!0})}catch{qC(this,t)}}async function yV(t){let e=t.params;if(!e?.providerId||!e?.apiKey){at(this,t,"providerId and apiKey required",w.INVALID_PARAMS);return}try{let n=e.baseUrl||await vV(e.providerId);if(!n){at(this,t,`Unknown provider: ${e.providerId}`,w.INVALID_PARAMS);return}let r=await oV(e.providerId,e.apiKey,n);t.id!==void 0&&this.sendResponse(t.id,r)}catch(n){let r=n instanceof Error?n.message:String(n);t.id!==void 0&&this.sendResponse(t.id,{valid:!1,status:0,error:r})}}async function vV(t){if(t===vt)return tV();let e=await Kw(t);return e?di(e):void 0}de();import*as GC from"node:fs";import*as bV from"node:path";Pa();de();function Wy(t){let e=Ve(ce());return Gd(t).map(n=>cTe(n,e))}function cTe(t,e){let n=Nz(e,t.name),r=n?.registryVersion;return{id:t.name,name:t.name,path:t.baseDir,active:t.active,globallyDisabled:t.globallyDisabled,projectDisabled:t.projectDisabled,category:t.category,author:t.author,...n?.source?{source:n.source}:{},displayName:lTe(t.name),displayDescription:dTe(t.name,t.description),fallbackName:t.name,fallbackDescription:t.description??"",systemGenerated:t.systemGenerated,version:t.version,...r?{registryVersion:r}:{},description:t.description}}function lTe(t){return{key:`capability.skill.${t}.name`,fallback:t}}function dTe(t,e){return{key:`capability.skill.${t}.description`,fallback:e??""}}function uTe(t){return t==="active"||t==="stale"||t==="archived"}function kV(t){let n=t.params?.projectId,r=this.getActiveProjectRoot();if(n&&this.projectLocator){let i=this.projectLocator.resolveProjectRoot(n);i&&(r=i)}let o=Wy(r);t.id!==void 0&&this.sendResponse(t.id,{skills:o})}function wV(t){let n=t.params?.name;if(!n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: name"});return}if(!Ln(n)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Skill "${n}" not found`});return}let r=Mn(n,!1),o=ce(),i=Ve(o),s=Fn(i,n);s.state!=="active"&&(s.state="active",s.staleAt=void 0,s.archivedAt=void 0),st(o,i),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,already:!r}),this.sendNotification("skills.updated",{action:"activate",name:n})}function SV(t){let n=t.params?.name;if(!n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: name"});return}let r=Mn(n,!0);t.id!==void 0&&this.sendResponse(t.id,{ok:!0,already:!r}),this.sendNotification("skills.updated",{action:"deactivate",name:n})}async function xV(t){let n=t.params?.name;if(!n||/[\/\\]|\.\./.test(n)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing or invalid skill name"});return}let r=ce(),o=Ve(r);if(o.records[n]?.pinned){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:`Skill "${n}" is pinned. Unpin it first.`});return}let i=Ln(n);if(!i){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Skill "${n}" not found in skill store`});return}let s=i.baseDir;try{GC.rmSync(s,{recursive:!0,force:!0}),eh(o,n),Mn(n,!1),st(r,o),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,deleted:n}),this.sendNotification("skills.updated",{action:"delete",name:n})}catch(a){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to delete skill: ${a instanceof Error?a.message:a}`})}}function RV(t){let n=t.params?.name;if(!n||/[\/\\]|\.\./.test(n)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing or invalid skill name"});return}if(!Ln(n)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Skill "${n}" not found in skill store`});return}let r=ce(),o=Ve(r),i=Fn(o,n);i.source="promoted",st(r,o),Mn(n,!1),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,promoted:n,scope:"global",globalPath:bV.join(_n(),n)}),this.sendNotification("skills.updated",{action:"promote",name:n})}function TV(t){let e=t.params,n=e?.name;if(!n||typeof e?.disabled!="boolean"){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required params: name (string), disabled (boolean)"});return}let r=this.getActiveProjectRoot();if(e.projectId&&this.projectLocator){let i=this.projectLocator.resolveProjectRoot(e.projectId);i&&(r=i)}if(!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:"No project workspace to scope the skill mute to"});return}let o=e$(r,n,e.disabled);t.id!==void 0&&this.sendResponse(t.id,{ok:!0,name:n,disabled:e.disabled,changed:o}),this.sendNotification("skills.updated",{action:e.disabled?"project-mute":"project-unmute",name:n})}function AV(t){let e=t.params,n=ce(),r=Ve(n);if(e?.name){let o=Oz(r,e.name);t.id!==void 0&&this.sendResponse(t.id,{name:e.name,stats:o??null})}else{let o=jz(r);t.id!==void 0&&this.sendResponse(t.id,{stats:o})}}function PV(t){let e=t.params;if(!e?.name){t.id!==void 0&&this.sendResponse(t.id,null,{code:-32602,message:"Missing 'name' parameter"});return}let n=ce(),r=Ve(n);Fn(r,e.name),Ez(r,e.name),st(n,r),t.id!==void 0&&this.sendResponse(t.id,{name:e.name,pinned:!0})}function IV(t){let e=t.params;if(!e?.name){t.id!==void 0&&this.sendResponse(t.id,null,{code:-32602,message:"Missing 'name' parameter"});return}let n=ce(),r=Ve(n);Mz(r,e.name),st(n,r),t.id!==void 0&&this.sendResponse(t.id,{name:e.name,pinned:!1})}function _V(t){let e=ce(),n=_n(),r=Dz(e,n);t.id!==void 0&&this.sendResponse(t.id,r)}function CV(t){let e=t.params,n=ce(),r=Ve(n);if(e?.name){let o=r.records[e.name]??null;t.id!==void 0&&this.sendResponse(t.id,{record:o})}else if(e?.state){if(!uTe(e.state)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Invalid skill lifecycle state"});return}let o=$z(r,e.state);t.id!==void 0&&this.sendResponse(t.id,{records:o})}else t.id!==void 0&&this.sendResponse(t.id,{records:Object.values(r.records)})}import*as jV from"node:path";He();import{randomUUID as yTe}from"node:crypto";import*as OV from"node:path";import{join as KC}from"node:path";import{mkdir as pTe,readdir as mTe}from"node:fs/promises";Ke();function fTe(t){return t?.pathService??ee()}function gTe(t,e){return t??e.getActiveProjectRoot()}function EV(t,e){let n=fTe(e);return KC(n.getProjectAgentDir(gTe(t,n)),"solos")}function VC(t,e,n){return KC(EV(e,n),t)}function MV(t,e,n){return KC(VC(t,e,n),"solo-state.json")}async function DV(t,e,n){let r=VC(t.soloId,e,n);await pTe(r,{recursive:!0}),await Bt(MV(t.soloId,e,n),t)}async function hTe(t,e,n){return Et(MV(t,e,n))}async function $V(t,e){let n=EV(t,e),r;try{r=await mTe(n)}catch{return[]}let o=[];for(let i of r){let s=await hTe(i,t,e);s&&o.push(s)}return o}async function JC(t,e,n){let{rm:r}=await import("node:fs/promises"),o=VC(t,e,n);try{return await r(o,{recursive:!0,force:!0}),!0}catch{return!1}}function NV(t){if(typeof t=="string")return t;if(t&&typeof t=="object"){let e=t;if(typeof e.content=="string")return e.content;if(typeof e.text=="string")return e.text}return t==null?"":JSON.stringify(t)}function vTe(t){let e=["<spec>",`\u76EE\u6807: ${t.goal}`];return t.constraints.length&&(e.push("\u7EA6\u675F:"),t.constraints.forEach((n,r)=>e.push(` ${r+1}. ${n}`))),t.acceptance.length&&(e.push("\u9A8C\u6536\u6807\u51C6(\u5FC5\u987B\u5168\u90E8\u6EE1\u8DB3):"),t.acceptance.forEach((n,r)=>e.push(` ${r+1}. ${n}`))),e.push("</spec>"),e.join(`
1119
+ `),this.sendNotification("workflow.alert",{workflowId:e.workflowId,kind:"consecutive-failures",count:r,triggerType:n,...tt(t)}))}return}NC.delete(e.workflowId),this.sendNotification("workflow.runCompleted",{workflowId:e.workflowId,status:e.status,triggerType:n,outcome:e,...tt(t)})}function Rt(t){return t instanceof Error?t.message:String(t)}async function $6(t){let e=Se(t);if(!e.def)return ne.call(this,t,"workflow.create requires `def`");let n=qe.call(this,t,e);if(!n)return;let r=String(e.id??`wf_${sa().slice(0,8)}`),o=await n.controller.create({id:r,name:String(e.name??r),owner:ut(),def:e.def,concurrency:e.concurrency,active:e.active===!0});o.active&&await n.scheduler.refresh(o.id),_r(n,"created",o.id,{name:o.name}),oo.call(this,"workflow.created",o,n),t.id!==void 0&&this.sendResponse(t.id,Kn(o,n))}async function N6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.get requires `id`");let n=qe.call(this,t,e);if(!n)return;let r=await n.controller.get(String(e.id)),o=Kn(r,n);e.includePublished===!0&&r.publishedDef&&(o.publishedDef=r.publishedDef),t.id!==void 0&&this.sendResponse(t.id,o)}async function O6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.describe requires `id`");let n=qe.call(this,t,e);if(!n)return;let r=await n.controller.describe(String(e.id));t.id!==void 0&&this.sendResponse(t.id,{rendered:r})}async function j6(t){let e=Se(t);if(!e.id||!e.patch)return ne.call(this,t,"workflow.patch requires `id` and `patch`");let n=qe.call(this,t,e);if(!n)return;let r={patch:e.patch,baseRev:e.baseRev,scope:e.scope},o=await n.controller.patch(String(e.id),r);await n.scheduler.refresh(String(e.id)),o.ok&&(_r(n,"patched",String(e.id),{ops:(r.patch??[]).map(i=>i.op)}),oo.call(this,"workflow.updated",await n.controller.get(String(e.id)),n)),t.id!==void 0&&this.sendResponse(t.id,o)}async function L6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.run requires `id`");let n=qe.call(this,t,e);if(!n)return;let r=e.trigger??{type:"manual"},o=String(e.id);this.sendNotification("workflow.runStarted",{workflowId:o,triggerType:r.type,...tt(n)});let i;try{i=await n.controller.run(o,r,{reuseCache:e.reuseCache===!0}),ol.call(this,n,i,r.type)}catch(s){throw this.sendNotification("workflow.runFailed",{workflowId:o,triggerType:r.type,error:Rt(s),...tt(n)}),s}t.id!==void 0&&this.sendResponse(t.id,i)}async function U6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.update requires `id`");if(e.name===void 0&&e.def===void 0&&e.concurrency===void 0)return ne.call(this,t,"workflow.update requires at least one of `name`/`def`/`concurrency`");let n=qe.call(this,t,e);if(!n)return;let r=await n.controller.update(String(e.id),{...e.name!==void 0?{name:String(e.name)}:{},...e.def!==void 0?{def:e.def}:{},...e.concurrency!==void 0?{concurrency:e.concurrency}:{}});await n.scheduler.refresh(r.id),_r(n,"updated",r.id,{fields:["name","def","concurrency"].filter(o=>e[o]!==void 0)}),oo.call(this,"workflow.updated",r,n),t.id!==void 0&&this.sendResponse(t.id,Kn(r,n))}async function F6(t){let e=Se(t);if(!e.id||typeof e.active!="boolean")return ne.call(this,t,"workflow.setActive requires `id` and boolean `active`");let n=qe.call(this,t,e);if(!n)return;let r;try{r=await n.controller.setActive(String(e.id),e.active)}catch(o){return ne.call(this,t,Rt(o))}await n.scheduler.refresh(r.id),_r(n,e.active?"activated":"deactivated",r.id),oo.call(this,"workflow.updated",r,n),t.id!==void 0&&this.sendResponse(t.id,Kn(r,n))}async function H6(t){let e=Se(t);if(e.projectId){let o=qe.call(this,t,e);if(!o)return;let i=await o.store.list();t.id!==void 0&&this.sendResponse(t.id,{workflows:i.map(s=>Kn(s,o))});return}let n=By.call(this),r=[];for(let o of n){let i=await o.store.list();r.push(...i.map(s=>Kn(s,o)))}t.id!==void 0&&this.sendResponse(t.id,{workflows:r})}async function z6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.delete requires `id`");let n=qe.call(this,t,e);n&&(await n.controller.delete(String(e.id)),await n.scheduler.refresh(String(e.id)),_r(n,"deleted",String(e.id)),this.sendNotification("workflow.deleted",{workflowId:String(e.id),...tt(n)}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0}))}async function B6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.cancelRun requires `id`");let n=qe.call(this,t,e);if(!n)return;let r;try{r=await n.controller.cancelRun(String(e.id),{...typeof e.runId=="string"&&e.runId?{runId:e.runId}:{},reason:typeof e.reason=="string"&&e.reason?e.reason:"\u7528\u6237\u505C\u6B62\u4E86\u8FD0\u884C"})}catch(o){return ne.call(this,t,Rt(o))}ol.call(this,n,r,"manual"),t.id!==void 0&&this.sendResponse(t.id,r)}async function q6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.dryRun requires `id`");let n=qe.call(this,t,e);if(!n)return;let r=String(e.id);this.sendNotification("workflow.runStarted",{workflowId:r,triggerType:"manual",...tt(n)});let o;try{o=await n.controller.run(r,{type:"manual",payload:e.payload},{recordHistory:!1}),ol.call(this,n,o,"manual")}catch(i){return this.sendNotification("workflow.runFailed",{workflowId:r,triggerType:"manual",error:Rt(i),...tt(n)}),ne.call(this,t,Rt(i))}t.id!==void 0&&this.sendResponse(t.id,{...o,dryRun:!0})}async function W6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.metrics requires `id`");let n=qe.call(this,t,e);if(!n)return;let r=await n.runHistory.list(String(e.id)),o=r.filter(d=>d.status!=="running"),i=o.filter(d=>d.status==="completed"),s=o.filter(d=>d.status==="failed"),a=o.map(d=>d.durationMs).filter(d=>typeof d=="number"),c=0;for(let d of o)if(d.status==="failed")c++;else break;let l={};for(let d of o)l[d.triggerType]=(l[d.triggerType]??0)+1;t.id!==void 0&&this.sendResponse(t.id,{metrics:{totalRuns:o.length,completed:i.length,failed:s.length,canceled:o.filter(d=>d.status==="canceled").length,successRate:o.length>0?i.length/o.length:null,avgDurationMs:a.length>0?Math.round(a.reduce((d,p)=>d+p,0)/a.length):null,lastRunAt:o[0]?.startedAt??null,consecutiveFailures:c,byTrigger:l,windowSize:r.length}})}async function G6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.publish requires `id`");let n=qe.call(this,t,e);if(!n)return;let r;try{r=await n.controller.publish(String(e.id))}catch(o){return ne.call(this,t,Rt(o))}_r(n,"published",r.id,{rev:r.publishedRev}),oo.call(this,"workflow.updated",r,n),t.id!==void 0&&this.sendResponse(t.id,Kn(r,n))}async function K6(t){let e=Se(t);if(!e.id||typeof e.archived!="boolean")return ne.call(this,t,"workflow.archive requires `id` and boolean `archived`");let n=qe.call(this,t,e);if(!n)return;let r=await n.controller.archive(String(e.id),e.archived);await n.scheduler.refresh(r.id),_r(n,e.archived?"archived":"unarchived",r.id),oo.call(this,"workflow.updated",r,n),t.id!==void 0&&this.sendResponse(t.id,Kn(r,n))}async function V6(t){let e=new Go().list();t.id!==void 0&&this.sendResponse(t.id,{credentials:e})}async function J6(t){let e=Se(t);if(!e.type||!e.label||typeof e.data!="object"||e.data===null)return ne.call(this,t,"credential.create requires `type`, `label`, and `data` object");try{let n=new Go().create({type:e.type,label:String(e.label),data:e.data,meta:e.meta??void 0});t.id!==void 0&&this.sendResponse(t.id,n)}catch(n){return ne.call(this,t,Rt(n))}}async function Z6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"credential.delete requires `id`");let n=new Go().delete(String(e.id));t.id!==void 0&&this.sendResponse(t.id,{ok:n})}var nl=new Map;async function X6(t){let e=Se(t);for(let n of["label","authUrl","tokenUrl","clientId","redirectUri"])if(typeof e[n]!="string"||!e[n])return ne.call(this,t,`credential.oauthStart requires \`${n}\``);try{let n=new Go,r=typeof e.scopes=="string"?e.scopes:"",o=n.create({type:"oauth2",label:String(e.label),data:{tokenUrl:String(e.tokenUrl),clientId:String(e.clientId),...typeof e.clientSecret=="string"&&e.clientSecret?{clientSecret:e.clientSecret}:{},...r?{scopes:r}:{}},meta:{...r?{scopes:r}:{},pending:!0}}),i=sa(),s=Date.now();for(let[c,l]of nl)l.expiresAt<s&&nl.delete(c);nl.set(i,{credentialId:o.id,tokenUrl:String(e.tokenUrl),clientId:String(e.clientId),...typeof e.clientSecret=="string"&&e.clientSecret?{clientSecret:e.clientSecret}:{},redirectUri:String(e.redirectUri),expiresAt:s+10*6e4});let a=new URL(String(e.authUrl));a.searchParams.set("response_type","code"),a.searchParams.set("client_id",String(e.clientId)),a.searchParams.set("redirect_uri",String(e.redirectUri)),a.searchParams.set("state",i),r&&a.searchParams.set("scope",r),t.id!==void 0&&this.sendResponse(t.id,{credentialId:o.id,authorizeUrl:a.toString(),state:i})}catch(n){return ne.call(this,t,Rt(n))}}async function Y6(t){let e=Se(t);if(typeof e.state!="string"||typeof e.code!="string"||!e.state||!e.code)return ne.call(this,t,"credential.oauthComplete requires `state` and `code`");let n=nl.get(e.state);if(!n||n.expiresAt<Date.now())return nl.delete(e.state),ne.call(this,t,"OAuth state unknown or expired \u2014 restart the authorization");nl.delete(e.state);try{let r=new URLSearchParams({grant_type:"authorization_code",code:e.code,redirect_uri:n.redirectUri,client_id:n.clientId,...n.clientSecret?{client_secret:n.clientSecret}:{}}),o=await fetch(n.tokenUrl,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded",Accept:"application/json"},body:r.toString()}),i=await o.text();if(!o.ok)throw new Error(`token exchange failed (${o.status}): ${i.slice(0,200)}`);let s=JSON.parse(i);if(!s.access_token)throw new Error(`token endpoint returned no access_token: ${i.slice(0,200)}`);let a=new Go,{data:c}=a.get(n.credentialId);a.updateData(n.credentialId,{...c,accessToken:s.access_token,...s.refresh_token?{refreshToken:s.refresh_token}:{},...s.expires_in?{expiresAt:new Date(Date.now()+s.expires_in*1e3).toISOString()}:{}},{pending:void 0}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,credentialId:n.credentialId})}catch(r){return ne.call(this,t,Rt(r))}}async function Q6(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.setPermissionScope requires `id`");if(e.allowUnattendedKinds!==null&&!Array.isArray(e.allowUnattendedKinds))return ne.call(this,t,"workflow.setPermissionScope requires `allowUnattendedKinds` array (or null to revoke)");let n=qe.call(this,t,e);if(!n)return;let r=e.allowUnattendedKinds===null?null:{allowUnattendedKinds:e.allowUnattendedKinds.filter(i=>typeof i=="string"),grantedAt:new Date().toISOString()},o=await n.controller.update(String(e.id),{permissionScope:r});_r(n,r?"permissionGranted":"permissionRevoked",o.id,r?{kinds:r.allowUnattendedKinds}:void 0),oo.call(this,"workflow.updated",o,n),t.id!==void 0&&this.sendResponse(t.id,Kn(o,n))}async function eK(t){let e=Se(t),n;try{n=Hu.call(this,e).cwd}catch(o){return ne.call(this,t,Rt(o))}let r=Oy({getToolManifest:()=>this.toolCatalog.getToolManifest(),listAgentIds:()=>[{id:"qlogicagent",name:"\u5C0F\u667A(\u9ED8\u8BA4)"},...this.acpDetector.list().filter(o=>o.status==="available"&&o.id!=="qlogicagent").map(o=>({id:o.id,name:o.name}))],projectRoot:n});t.id!==void 0&&this.sendResponse(t.id,{capabilities:r})}async function tK(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.export requires `id`");let n=qe.call(this,t,e);if(!n)return;let r=await n.controller.get(String(e.id)),o=IC(r);t.id!==void 0&&this.sendResponse(t.id,{bundle:o})}async function nK(t){let e=Se(t);if(!e.payload)return ne.call(this,t,"workflow.import requires `payload`");let n=qe.call(this,t,e);if(!n)return;let r=typeof e.targetWorkflowId=="string"&&e.targetWorkflowId?e.targetWorkflowId:void 0,o=r??String(e.id??`wf_${sa().slice(0,8)}`),i,s;try{if(e.format==="n8n")if(r){let a=ry(e.payload,o,{strictTemplates:!0});s=a.report,i=await n.controller.update(o,{name:String(e.name??a.name),def:a.def})}else{let a=await n.controller.importN8n(o,e.payload,{owner:ut()});i=a.record,s=a.report,e.name&&(i=await n.controller.update(o,{name:String(e.name)}))}else{let a=m6(e.payload);if(r?i=await n.controller.update(o,{name:String(e.name??a.name),def:{...a.def,id:o},...a.concurrency?{concurrency:a.concurrency}:{}}):i=await n.controller.create({id:o,name:String(e.name??a.name),owner:ut(),def:{...a.def,id:o},concurrency:a.concurrency}),a.trigger){let c=await n.controller.patch(o,{patch:[{op:"set_trigger",trigger:a.trigger}]});if(!c.ok)throw new Error(`trigger rejected: ${JSON.stringify("errors"in c?c.errors:c)}`);i=await n.controller.get(o)}}}catch(a){return ne.call(this,t,`workflow.import: ${Rt(a)}`)}_r(n,"imported",i.id,{format:e.format==="n8n"?"n8n":"bundle",...s?{conversion:s.status}:{}}),oo.call(this,r?"workflow.updated":"workflow.created",i,n),t.id!==void 0&&this.sendResponse(t.id,{...Kn(i,n),...s?{conversionReport:s}:{}})}async function rK(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.duplicate requires `id`");let n=qe.call(this,t,e);if(!n)return;let r;try{r=e.targetProjectId?Uu.call(this,Hu.call(this,{projectId:e.targetProjectId})):n}catch(c){return ne.call(this,t,Rt(c))}let o=await n.controller.get(String(e.id)),i=IC(o),s=`wf_${sa().slice(0,8)}`,a=await r.controller.create({id:s,name:String(e.name??`${o.name} \u526F\u672C`),owner:ut(),def:{...i.def,id:s},concurrency:o.concurrency});if(i.trigger){let c=await r.controller.patch(s,{patch:[{op:"set_trigger",trigger:i.trigger}]});if(!c.ok)throw new Error(`workflow.duplicate: trigger rejected: ${JSON.stringify("errors"in c?c.errors:c)}`);a=await r.controller.get(s)}_r(r,"duplicated",s,{sourceWorkflowId:String(e.id)}),oo.call(this,"workflow.created",a,r),t.id!==void 0&&this.sendResponse(t.id,Kn(a,r))}async function oK(t){let e=Se(t);if(!e.channel||typeof e.text!="string")return ne.call(this,t,"workflow.onImMessage requires `channel` and string `text`");let n=By.call(this),r=[],o=[];for(let i of n)try{r.push(...await i.scheduler.onImMessage(String(e.channel),e.text,e.payload))}catch(s){o.push({...tt(i),error:Rt(s)})}t.id!==void 0&&this.sendResponse(t.id,{outcomes:r,...o.length>0?{errors:o}:{}})}async function iK(t){let e=Se(t);if(!e.path)return ne.call(this,t,"workflow.onWebhook requires `path`");let n=String(e.path).startsWith("/")?String(e.path):`/${String(e.path)}`,r=e.payload??{},o=Fu.get(n),i=o?o.size:0;if(o)for(let l of[...o.values()])l(r);let s=By.call(this),a=[],c=[];for(let l of s)try{a.push(...await l.scheduler.onWebhook(n,e.payload))}catch(d){c.push({...tt(l),error:Rt(d)})}t.id!==void 0&&this.sendResponse(t.id,{outcomes:a,...c.length>0?{errors:c}:{},...i>0?{wokenWaits:i}:{}})}async function sK(t){let e=Se(t);if(!e.workflowId||typeof e.text!="string")return ne.call(this,t,"workflow.onIntent requires `workflowId` and string `text`");let n=qe.call(this,t,e);if(!n)return;let r=String(e.workflowId),o=await n.controller.get(r);if(!o.active||o.trigger?.type!=="intent")return ne.call(this,t,`workflow "${r}" has no active intent trigger (active=${o.active}, trigger=${o.trigger?.type??"none"})`);let i={type:"intent",text:e.text,...typeof e.surface=="string"?{surface:e.surface}:{},...typeof e.matchedPhrase=="string"?{matchedPhrase:e.matchedPhrase}:{}};this.sendNotification("workflow.runStarted",{workflowId:r,triggerType:"intent",...tt(n)});let s;try{s=await n.controller.run(r,{type:"intent",payload:i}),ol.call(this,n,s,"intent")}catch(a){throw this.sendNotification("workflow.runFailed",{workflowId:r,triggerType:"intent",error:Rt(a),...tt(n)}),a}t.id!==void 0&&this.sendResponse(t.id,s)}async function kRe(){let t=By.call(this),e=[];for(let n of t)for(let r of await n.store.listActive())r.trigger?.type==="intent"&&e.push({workflowId:r.id,projectId:n.projectId,name:r.name,trigger:r.trigger});return e}async function aK(t){let e=await kRe.call(this);t.id!==void 0&&this.sendResponse(t.id,{intents:e})}async function cK(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.revisions requires `id`");let n=qe.call(this,t,e);if(!n)return;let r=await n.store.listRevisions(String(e.id));t.id!==void 0&&this.sendResponse(t.id,{revisions:r})}async function lK(t){let e=Se(t);if(!e.id||typeof e.rev!="number")return ne.call(this,t,"workflow.revert requires `id` and numeric `rev`");let n=qe.call(this,t,e);if(!n)return;let r=await n.controller.revertTo(String(e.id),e.rev);await n.scheduler.refresh(r.id),_r(n,"reverted",r.id,{toRev:e.rev}),oo.call(this,"workflow.updated",r,n),t.id!==void 0&&this.sendResponse(t.id,Kn(r,n))}async function dK(t){let e=Se(t),n=qe.call(this,t,e);if(!n)return;let r=typeof e.limit=="number"&&e.limit>0?Math.min(e.limit,500):100,o=n.audit.list(e.id?String(e.id):void 0,r);t.id!==void 0&&this.sendResponse(t.id,{entries:o})}async function uK(t){let e=Se(t);if(!e.id)return ne.call(this,t,"workflow.runs requires `id`");let n=qe.call(this,t,e);if(!n)return;let r=await n.runHistory.list(String(e.id));t.id!==void 0&&this.sendResponse(t.id,{runs:r})}async function pK(t){let e=Se(t);if(!e.id||!e.runId)return ne.call(this,t,"workflow.runDetail requires `id` and `runId`");let n=qe.call(this,t,e);if(!n)return;let r=await n.runHistory.get(String(e.id),String(e.runId));if(!r)return ne.call(this,t,`run "${String(e.runId)}" not found for workflow "${String(e.id)}"`);t.id!==void 0&&this.sendResponse(t.id,{run:r})}He();de();cn();import*as ze from"node:fs";import*as Tt from"node:path";import{execFileSync as IRe}from"node:child_process";He();Ke();import*as so from"node:fs";import*as FC from"node:path";import{randomUUID as SRe}from"node:crypto";de();import*as tn from"node:fs";import*as io from"node:path";import{fileURLToPath as wRe}from"node:url";function zu(t){let e=En(t),n=io.dirname(e);tn.existsSync(n)||tn.mkdirSync(n,{recursive:!0}),UC(gw(),e),UC(io.join(mK(),"INSTRUCTIONS.md"),e);let r=wo(t);fK(hw(),r),fK(io.join(mK(),"rules"),r)}function mK(){return io.join(io.dirname(wRe(import.meta.url)),"default-project-knowledge")}function UC(t,e){if(!(!tn.existsSync(t)||tn.existsSync(e)))try{tn.mkdirSync(io.dirname(e),{recursive:!0}),tn.copyFileSync(t,e)}catch{}}function fK(t,e){if(tn.existsSync(t))try{tn.mkdirSync(e,{recursive:!0});for(let n of tn.readdirSync(t)){if(!n.endsWith(".md"))continue;let r=io.join(t,n),o=io.join(e,n);tn.statSync(r).isFile()&&UC(r,o)}}catch{}}function xRe(t){return t==="solo"||t==="product"||t==="automation"}var RRe=["creating","running","completed","failed","cancelled"];function hK(t){return typeof t=="string"&&RRe.includes(t)}async function yK(t,e){let n=ee(),r=typeof e.workspaceDir=="string"&&e.workspaceDir.trim().length>0,o=r?e.workspaceDir.trim():FC.join(n.getUserAgentHome(),"workspaces",e.name);if(e.groupId){let p=y$(e.groupId);if(p)return gK(p.workspaceDir),zu(p.workspaceDir),{project:p,isAgentTeamProject:p.type==="solo"||p.type==="product",autoSwitched:!1,deduplicated:!0}}let s=fe().find(p=>p.name===e.name);r?TRe(o):gK(o);let a=xRe(e.type),c=p$({name:e.name,workspaceDir:o,type:e.type??"personal",groupId:e.groupId,skipAutoSwitch:a}),l=c.type==="solo"||c.type==="product";a||(So(c.id),t.setActiveWorkdir(c.workspaceDir)),zu(c.workspaceDir);let d=t.projectMemoryStoreFactory.create(c.workspaceDir);return d.ensureInitialized(),a||(t.memdir=d,t.mediaPersistence.setProjectDir(c.workspaceDir)),PRe(c),await ARe(c),{project:c,nameDuplicate:s,isAgentTeamProject:l,autoSwitched:!a}}function gK(t){so.existsSync(t)||so.mkdirSync(t,{recursive:!0})}function TRe(t){if(!so.existsSync(t))throw new Error(`Workspace directory does not exist: ${t}`);if(!so.statSync(t).isDirectory())throw new Error(`Workspace path is not a directory: ${t}`)}async function ARe(t){if(t.type!=="automation")return;let e=`wf_${SRe().slice(0,8)}`,n=new Date().toISOString();await new lr(t.workspaceDir).save({id:e,name:t.name,def:{id:e,nodes:[],edges:[]},active:!1,concurrency:"queue",rev:1,createdAt:n,updatedAt:n}),or(t.id,{primaryWorkflowId:e}),t.primaryWorkflowId=e}function PRe(t){let e=ee();if(t.type!=="solo"&&t.type!=="product")return;let n=FC.join(e.getProjectAgentDir(t.workspaceDir),t.type==="solo"?"solo-state.json":"product-state.json");if(so.existsSync(n))return;let r=t.type==="solo"?{agents:[],status:"idle",createdAt:new Date().toISOString()}:{tasks:[],instances:[],status:"idle",createdAt:new Date().toISOString()};so.writeFileSync(n,JSON.stringify(r,null,2))}async function vK(t){let e=t.params;if(!e?.name){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: name"});return}let n;try{n=await yK(this,{name:e.name,workspaceDir:e.workspaceDir,type:e.type,groupId:e.groupId})}catch(a){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:a instanceof Error?a.message:`Cannot create workspace directory: ${e.workspaceDir??e.name}`});return}let{project:r,nameDuplicate:o,autoSwitched:i,deduplicated:s}=n;if(s){t.id!==void 0&&this.sendResponse(t.id,{ok:!0,project:r,deduplicated:!0});return}if(this.sendNotification("project.created",{...r}),i&&this.sendNotification("project.switched",{id:r.id,name:r.name,workspaceDir:r.workspaceDir}),t.id!==void 0){let a={ok:!0,project:r};o&&(a.warning=`A project named "${o.name}" already exists at ${o.workspaceDir}. Consider renaming one of them to avoid ambiguity.`),this.sendResponse(t.id,a)}}function bK(t){let e=fe();t.id!==void 0&&this.sendResponse(t.id,{projects:e})}function kK(t){let e=t.params,n=e?.projectId?.trim(),r=e?.query?.trim();if(!n&&!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: projectId or query"});return}let o=_Re(n??r);if(!o){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,error:`Project not found: ${n??r}`});return}let i=So(o.id);if(!i){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,error:`Project not found: ${n??r}`});return}this.setActiveWorkdir(i.workspaceDir);let s=this.projectMemoryStoreFactory.create(i.workspaceDir);s.ensureInitialized(),this.memdir=s,this.mediaPersistence.setProjectDir(i.workspaceDir),this.sendNotification("project.switched",{id:i.id,name:i.name,workspaceDir:i.workspaceDir}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,project:i,projectId:i.id,name:i.name,workspaceDir:i.workspaceDir})}function _Re(t){let e=re(t);if(e?.status==="active")return e;let n=fe(),r=Number.parseInt(t,10);if(String(r)===t&&r>=1&&r<=n.length)return n[r-1]??null;let o=t.toLowerCase();return n.find(i=>i.id===t)??n.find(i=>i.name.toLowerCase()===o)??n.find(i=>i.name.toLowerCase().includes(o))??null}function CRe(t){let e=Tt.join(t,".worktrees");if(!ze.existsSync(Tt.join(t,".git"))||!ze.existsSync(e))return;let n=o=>{try{IRe("git",o,{cwd:t,stdio:"ignore",windowsHide:!0})}catch{}},r=[];try{r=ze.readdirSync(e,{withFileTypes:!0})}catch{return}for(let o of r)o.isDirectory()&&n(["worktree","remove","--force",Tt.join(e,o.name)]);n(["worktree","prune"])}function wK(t,e={}){if(e.requireManaged){let r=Tt.resolve(Tt.join(_e(),"workspaces"))+Tt.sep;if(!t.startsWith(r))return{deleted:!1,skipped:"external",error:"Project directory is outside the managed workspace root and was not deleted automatically."}}try{e.releaseDir?.(t)}catch{}CRe(t);let n;for(let r=0;r<3;r++){if(!ze.existsSync(t))return{deleted:!0};try{if(SK(t),!ze.existsSync(t))return{deleted:!0};n="Directory still present after removal (likely held by another process)."}catch(o){n=o?.message??String(o)}if(r<2){let o=Date.now();for(;Date.now()-o<300;);}}return{deleted:!1,error:n}}function SK(t){let e;try{e=ze.lstatSync(t)}catch{return}if(e.isDirectory()&&!e.isSymbolicLink()){for(let n of ze.readdirSync(t))SK(Tt.join(t,n));try{ze.rmdirSync(t)}catch{try{ze.chmodSync(t,448),ze.rmdirSync(t)}catch{}}}else try{ze.unlinkSync(t)}catch{try{ze.chmodSync(t,448),ze.unlinkSync(t)}catch{}}}function xK(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: projectId"});return}let n=re(e.projectId);if(!n){this.sendNotification("project.deleted",{id:e.projectId}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,alreadyAbsent:!0});return}if(n.type==="default"){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Cannot delete the default project"});return}let r=Tw(e.projectId);if(!r.deleted){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:"Cannot delete project"});return}let o=!1,i;if(n?.workspaceDir){let s=wK(Tt.resolve(n.workspaceDir),{requireManaged:!0,releaseDir:a=>this.mediaPersistence?.releaseProjectDir?.(a)});o=s.deleted,i=s.error}try{ze.rmSync(rr(e.projectId),{recursive:!0,force:!0})}catch(s){console.error(`[project.delete] projectData cleanup failed for ${e.projectId}:`,s instanceof Error?s.message:s)}this.sendNotification("project.deleted",{id:e.projectId}),r.switchedTo&&(this.setActiveWorkdir(r.switchedTo.workspaceDir),this.sendNotification("project.switched",{id:r.switchedTo.id,name:r.switchedTo.name,workspaceDir:r.switchedTo.workspaceDir})),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,switchedTo:r.switchedTo,dirDeleted:o,dirDeleteError:i})}function RK(t){let e=fe(),n=Tt.join(_e(),"workspaces"),r=Tt.resolve(n)+Tt.sep,o=0,i=[];for(let a of e)if(a.type!=="default"){if(Tw(a.id),o++,a.workspaceDir){let c=wK(Tt.resolve(a.workspaceDir),{releaseDir:l=>this.mediaPersistence?.releaseProjectDir?.(l)});c.error&&i.push(`${a.name}: ${c.error}`)}this.sendNotification("project.deleted",{id:a.id})}if(ze.existsSync(n)){let a=fe().find(d=>d.type==="default"),c=new Set;a?.workspaceDir&&c.add(Tt.resolve(a.workspaceDir));let l=d=>{try{let p=ze.readdirSync(d,{withFileTypes:!0});for(let m of p){if(!m.isDirectory())continue;let f=Tt.join(d,m.name);if(!c.has(Tt.resolve(f))){if(m.name==="groups"){l(f);try{ze.readdirSync(f).length===0&&ze.rmdirSync(f)}catch{}continue}try{ze.rmSync(f,{recursive:!0,force:!0})}catch(g){i.push(`orphan:${m.name}: ${g.message??g}`)}}}}catch{}};l(n)}let s=fe().find(a=>a.type==="default");s&&(this.setActiveWorkdir(s.workspaceDir),this.sendNotification("project.switched",{id:s.id,name:s.name,workspaceDir:s.workspaceDir})),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,deletedCount:o,dirErrors:i.length?i:void 0})}function TK(t){let e=t.params;if(!e?.projectId||!e?.newName){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required params: projectId, newName"});return}let n=f$(e.projectId,e.newName);if(!n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:"Cannot rename project (not found, is default, or name already taken)"});return}this.sendNotification("project.renamed",{id:n.id,name:n.name,workspaceDir:n.workspaceDir}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,project:n})}function AK(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: projectId"});return}let n=g$(e.projectId);if(!n.archived){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:"Cannot archive project (not found or is default project)"});return}this.sendNotification("project.archived",{id:e.projectId}),n.switchedTo&&(this.setActiveWorkdir(n.switchedTo.workspaceDir),this.sendNotification("project.switched",{id:n.switchedTo.id,name:n.switchedTo.name,workspaceDir:n.switchedTo.workspaceDir})),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,switchedTo:n.switchedTo})}function PK(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: projectId"});return}let n=h$(e.projectId);if(!n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:"Cannot unarchive project (not found or not archived)"});return}this.sendNotification("project.unarchived",{id:n.id,name:n.name,workspaceDir:n.workspaceDir}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,project:n})}function IK(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"projectId is required"});return}let n={};if("planStatus"in e){if(e.planStatus!==void 0&&!hK(e.planStatus)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:`Invalid planStatus: ${e.planStatus}`});return}n.planStatus=e.planStatus}"planAgents"in e&&(n.planAgents=e.planAgents),"planWinnerId"in e&&(n.planWinnerId=e.planWinnerId),"leaderSessionId"in e&&(n.leaderSessionId=e.leaderSessionId),"primaryWorkflowId"in e&&(n.primaryWorkflowId=e.primaryWorkflowId);let r=or(e.projectId,n);t.id!==void 0&&this.sendResponse(t.id,{ok:r})}He();import{randomUUID as zC}from"node:crypto";import*as Sn from"node:fs";import*as Ko from"node:path";var Cr=class{sessionId;_trustAccepted=!1;_modelUsage=new Map;_totalInputTokens=0;_totalOutputTokens=0;_turnCount=0;_toolCallCount=0;_listeners=new Set;constructor(e){this.sessionId=e}get trustAccepted(){return this._trustAccepted}setTrustAccepted(e){this._trustAccepted=e,this.notifyListeners()}get totalInputTokens(){return this._totalInputTokens}get totalOutputTokens(){return this._totalOutputTokens}get turnCount(){return this._turnCount}get toolCallCount(){return this._toolCallCount}getModelUsage(e){return this._modelUsage.get(e)}getAllModelUsage(){let e={};for(let[n,r]of this._modelUsage)e[n]={...r};return e}addUsage(e,n){this._totalInputTokens+=e.inputTokens,this._totalOutputTokens+=e.outputTokens;let r=this._modelUsage.get(n);r?(r.inputTokens+=e.inputTokens,r.outputTokens+=e.outputTokens,r.cacheRead+=e.cacheRead??0,r.cacheCreation+=e.cacheWrite??0):this._modelUsage.set(n,{inputTokens:e.inputTokens,outputTokens:e.outputTokens,cacheRead:e.cacheRead??0,cacheCreation:e.cacheWrite??0,mediaCalls:0,mediaDurationSeconds:0,mediaCharacters:0}),this.notifyListeners()}addMediaUsage(e,n,r){let o=this._modelUsage.get(e),i=o??{inputTokens:0,outputTokens:0,cacheRead:0,cacheCreation:0,mediaCalls:0,mediaDurationSeconds:0,mediaCharacters:0};switch(o||this._modelUsage.set(e,i),i.mediaCalls+=1,n){case"per_second":i.mediaDurationSeconds+=r;break;case"per_character":i.mediaCharacters+=r;break;case"per_token":i.outputTokens+=r;break}this.notifyListeners()}recordToolCall(){this._toolCallCount++}recordTurnCompleted(){this._turnCount++}createSnapshot(){return{sessionId:this.sessionId,modelUsage:this.getAllModelUsage(),totalInputTokens:this._totalInputTokens,totalOutputTokens:this._totalOutputTokens,turnCount:this._turnCount,lastSavedAt:Date.now()}}restoreFromSnapshot(e){if(e.sessionId!==this.sessionId)return!1;this._totalInputTokens=e.totalInputTokens,this._totalOutputTokens=e.totalOutputTokens,this._turnCount=e.turnCount,this._modelUsage.clear();for(let[n,r]of Object.entries(e.modelUsage))this._modelUsage.set(n,{...r});return this.notifyListeners(),!0}onStateChange(e){return this._listeners.add(e),()=>{this._listeners.delete(e)}}notifyListeners(){for(let e of this._listeners)try{e()}catch{}}};He();Ke();import*as _K from"node:fs";import*as HC from"node:path";var Xi=class{getSessionsRoot(e){let n=re(e);if(!n)throw new Error(`Project not found: ${e}`);return ee().getProjectSessionDataRoot(n.workspaceDir)}getProjectWorkspaceDir(e){let n=re(e);if(!n)throw new Error(`Project not found: ${e}`);return n.workspaceDir}getSessionDir(e,n){return HC.join(this.getSessionsRoot(e),n)}resolveWorkspaceDir(e,n){if(n){let o=re(n);if(o)return o.workspaceDir}let r=fe();for(let o of r){let i=ee().getProjectSessionDataRoot(o.workspaceDir),s=HC.join(i,e);try{if(_K.existsSync(s))return o.workspaceDir}catch{}}return this.getActiveProjectWorkspaceDir()}getActiveProjectWorkspaceDir(){let e=Me();if(e)return e.workspaceDir;let n=fe();if(n.length>0)return n[0].workspaceDir;throw new Error("No active project available")}getActiveProjectId(){let e=Me();if(e)return e.id;let n=fe();if(n.length>0)return n[0].id;throw new Error("No active project available")}getDefaultProjectId(){let e=tm();if(e)return e.id;throw new Error("No default project available")}};si();jt();import{randomUUID as CK}from"node:crypto";async function EK(t,e){let n=new Date(t.lastActiveAt).getTime();if(Date.now()-n<OM)return{split:!1,activeSessionId:t.sessionId};let i=CK(),s=new Date().toISOString();await yt(t.sessionId,{sealedAt:s},e);let a=t.taskSummary?`[\u4E0A\u4E00\u8F6E\u5BF9\u8BDD\u6458\u8981] ${t.taskSummary}`:void 0;return await yt(i,{sessionId:i,projectId:t.projectId,type:"group",ownerId:t.ownerId,groupKey:t.groupKey,groupName:t.groupName,groupPlatform:t.groupPlatform,previousSessionId:t.sessionId,carryoverSummary:a},e),{split:!0,activeSessionId:i,sealedSessionId:t.sessionId}}async function MK(t,e){if(t.type!=="group")return{split:!1,activeSessionId:t.sessionId};if(t.turnCount<jM)return{split:!1,activeSessionId:t.sessionId};let n=CK(),r=new Date().toISOString();await yt(t.sessionId,{sealedAt:r},e);let o=t.taskSummary?`[\u4E0A\u4E00\u8F6E\u5BF9\u8BDD\u6458\u8981 \u2014 \u56E0\u6D88\u606F\u6570\u8FBE\u5230\u4E0A\u9650\u81EA\u52A8\u5207\u5206] ${t.taskSummary}`:void 0;return await yt(n,{sessionId:n,projectId:t.projectId,type:"group",ownerId:t.ownerId,groupKey:t.groupKey,groupName:t.groupName,groupPlatform:t.groupPlatform,previousSessionId:t.sessionId,carryoverSummary:o},e),{split:!0,activeSessionId:n,sealedSessionId:t.sessionId}}de();cn();import*as Bu from"node:fs";import*as aa from"node:path";Ke();var qy=class{constructor(e=new Xi,n=ee()){this.locator=e;this.pathService=n}locator;pathService;getActiveProjectId(){return this.locator.getActiveProjectId()}getDefaultProjectId(){return this.locator.getDefaultProjectId()}getProjectWorkspaceDir(e){return this.locator.getProjectWorkspaceDir(e)}resolveWorkspaceDir(e,n){return this.locator.resolveWorkspaceDir(e,n)}async listThreads(e,n){let r=n??this.getActiveProjectId(),o=this.getProjectWorkspaceDir(r);return(await ln(e,o)).map(s=>({id:s.sessionId,title:s.title,status:"active",turnCount:s.messageCount,createdAt:s.createdAt,lastActiveAt:s.lastActiveAt}))}getHostSessionWorkspaceDirs(e,n=[]){return DRe([e.getActiveProjectRoot(),...MRe()]).filter(r=>!n.some(o=>DK(o,r)))}async listHostWorkspaceSessions(e,n,r=[]){let o=this.getHostSessionWorkspaceDirs(e,r);return(await Promise.all(o.map(s=>ln(n,s)))).flat()}resolveSessionWorkspaceDir(e,n,r){let o;for(let i of this.getHostSessionWorkspaceDirs(e)){if(w$(n,i))return i;let s=aa.join(this.pathService.getProjectSessionDataRoot(i),ERe(n));try{if(!Bu.existsSync(s))continue;o??=i;let a=aa.join(s,"transcript.jsonl");if(Bu.existsSync(a)&&Bu.statSync(a).size>0)return i}catch{}}return o||(r?this.resolveWorkspaceDir(n,r):this.resolveWorkspaceDir(n))}};function ERe(t){return t.replace(/[^a-zA-Z0-9_-]/g,"_")}function MRe(){return[]}function DK(t,e){return aa.resolve(t).toLowerCase()===aa.resolve(e).toLowerCase()}function DRe(t){let e=[];for(let n of t){let r=n?.trim();if(!r)continue;let o=aa.resolve(r);e.some(i=>DK(i,o))||e.push(o)}return e}var $Re=new Xi,wn=new qy($Re);function pr(t,e="Unknown error"){return t instanceof Error?t.message:e}var NRe=/Uploaded attachment references:|\[标注元素\]|\[标注区域\]|\[附件\]\s*(?:图片|视频|音频|文件)\d/;function ORe(t){for(let e of t)if(e.role==="user"&&typeof e.content=="string"&&NRe.test(e.content))return!0;return!1}function il(t,e,n){return wn.resolveSessionWorkspaceDir(t,e,n)}function OK(t,e){let n=t.messageCount??0,r=e.messageCount??0;return r!==n?r>n?e:t:e.lastActiveAt!==t.lastActiveAt&&e.lastActiveAt>t.lastActiveAt?e:t}function $K(...t){let e=new Map;for(let n of t)for(let r of n){let o=e.get(r.sessionId);e.set(r.sessionId,o?OK(o,r):r)}return[...e.values()].sort((n,r)=>n.lastActiveAt>r.lastActiveAt?-1:n.lastActiveAt<r.lastActiveAt?1:0)}async function jRe(t){let e=null;for(let n of fe()){if(!n.workspaceDir)continue;let o=(await ln(500,n.workspaceDir)).find(s=>s.sessionId===t);if(!o)continue;let i={entry:o,projectId:o.projectId??n.id,workspaceDir:n.workspaceDir};(!e||OK(e.entry,o)===o)&&(e=i)}return e}async function NK(t,e,n){return wn.listHostWorkspaceSessions(t,e,n)}async function LRe(t){let e=new Set,n=[...new Set(t.map(r=>Ko.resolve(r).toLowerCase()))];return await Promise.all(n.map(async r=>{for(let o of await S$(r))e.add(o)})),e}function jK(t){let e=t.params,n=e?.id??zC();this.log(`[thread.create] id=${n} title=${e?.title??"(none)"}`),e?.cwd&&typeof e.cwd=="string"&&this.setActiveWorkdir(e.cwd),this.currentSessionId=n,this.sessionState=new Cr(n),this.memoryPrefetchState=tr(),this.enableIdleDream(),t.id!==void 0&&this.sendResponse(t.id,{id:n,title:e?.title,status:"active",createdAt:new Date().toISOString()})}async function LK(t){let e=t.params,n=e?.limit??20;try{let r=await wn.listThreads(n,e?.projectId);t.id!==void 0&&this.sendResponse(t.id,{threads:r})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to list threads: ${pr(r)}`})}}async function UK(t){let e=t.params,n=e?.sessionId??zC();try{let r=e?.projectId??wn.getActiveProjectId(),o=wn.getProjectWorkspaceDir(r);await yt(n,{sessionId:n,title:e?.title,type:e?.type,ownerPlatform:e?.ownerPlatform,ownerId:e?.ownerId,groupKey:e?.groupKey,groupName:e?.groupName,groupPlatform:e?.groupPlatform,projectId:r},o),t.id!==void 0&&this.sendResponse(t.id,{sessionId:n,title:e?.title})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to create session: ${pr(r)}`})}}async function FK(t){let e=t.params;if(t.id===void 0)return;let n=e?.platform??"desktop",r=e?.chatId,o=e?.chatType,i=e?.userId??"local";try{if(n==="desktop"&&r){let p=e?.projectId??wn.getActiveProjectId(),m=wn.getProjectWorkspaceDir(p),f=await jRe(r);if(f){let g=Vt(r,f.workspaceDir),h=g?.projectId??f.projectId;this.sendResponse(t.id,{sessionId:r,title:g?.title??f.entry.title,type:g?.type??f.entry.type??"personal",agentId:g?.agentId,ownerPlatform:g?.ownerPlatform,ownerId:g?.ownerId??i,groupKey:g?.groupKey,groupPlatform:g?.groupPlatform,groupName:g?.groupName,projectId:h});return}await yt(r,{sessionId:r,type:"personal",ownerPlatform:n==="desktop"?void 0:n,ownerId:i,projectId:p},m),this.sendResponse(t.id,{sessionId:r,type:"personal",ownerPlatform:n==="desktop"?void 0:n,ownerId:i,projectId:p});return}if(o==="group"&&r&&n){let p=`group:${n}:${r}`,m=fe();for(let f of m){if(!f.workspaceDir)continue;let h=(await ln(500,f.workspaceDir)).find(y=>y.groupKey===p&&!y.sealedAt&&!y.archivedAt);if(h){let y=Vt(h.sessionId,f.workspaceDir);if(y){let b=await EK(y,f.workspaceDir);if(b.split){this.sendResponse(t.id,{sessionId:b.activeSessionId,title:void 0,type:"group",ownerPlatform:y.ownerPlatform,ownerId:i,groupKey:p,groupPlatform:n,groupName:e?.groupName,projectId:f.id,previousSessionId:b.sealedSessionId});return}}this.sendResponse(t.id,{sessionId:h.sessionId,title:h.title,type:"group",ownerPlatform:y?.ownerPlatform,ownerId:i,groupKey:p,groupPlatform:n,groupName:e?.groupName,projectId:f.id});return}}}if(o!=="group"&&n!=="desktop"&&i){let p=e?.projectId?re(e.projectId):tm(),m=p?[p]:[];for(let f of m){if(!f.workspaceDir)continue;let g=await ln(500,f.workspaceDir);for(let h of g){if(h.type!=="personal"||h.sealedAt||h.archivedAt)continue;let y=Vt(h.sessionId,f.workspaceDir);if(!y?.archivedAt&&!(y?.ownerPlatform!==n||y.ownerId!==i)){this.sendResponse(t.id,{sessionId:y.sessionId,title:y.title??h.title,type:"personal",ownerPlatform:y.ownerPlatform,ownerId:y.ownerId,projectId:y.projectId??f.id});return}}}}let s=zC(),a=e?.projectId??wn.getDefaultProjectId(),c=wn.getProjectWorkspaceDir(a),l=o==="group"?`group:${n}:${r}`:void 0,d=URe(e?.title);await yt(s,{sessionId:s,title:d,type:o==="group"?"group":"personal",ownerPlatform:o==="group"||n==="desktop"?void 0:n,ownerId:i,groupKey:l,groupPlatform:o==="group"?n:void 0,groupName:e?.groupName,projectId:a},c),this.sendResponse(t.id,{sessionId:s,title:d,type:o==="group"?"group":"personal",ownerPlatform:o==="group"||n==="desktop"?void 0:n,ownerId:i,groupKey:l,groupPlatform:o==="group"?n:void 0,groupName:e?.groupName,projectId:a})}catch(s){this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to resolve session: ${pr(s)}`})}}function URe(t){return zl(t,{maxLength:40})}async function HK(t){let e=t.params,n=e?.limit??50;try{let r,o=new Set;if(e?.projectId){let a=re(e.projectId);if(!a){t.id!==void 0&&this.sendResponse(t.id,{sessions:[]});return}let c=a.workspaceDir;o.add(c),r=await ln(n*2,c);let l=await NK(this,n*2,[c]);for(let d of wn.getHostSessionWorkspaceDirs(this,[c]))o.add(d);r=$K(r,l.filter(d=>d.projectId===e.projectId)),r=r.filter(d=>d.projectId===e.projectId);for(let d of r)d.projectId=e.projectId}else{let a=fe(),c=[],l=[];for(let p of a){if(!p.workspaceDir)continue;l.push(p.workspaceDir),o.add(p.workspaceDir);let m=await ln(n,p.workspaceDir);for(let f of m)f.projectId&&c.push(f)}let d=(await NK(this,n,l)).filter(p=>p.projectId);for(let p of wn.getHostSessionWorkspaceDirs(this,l))o.add(p);r=$K(c,d)}let i=await LRe([...o]);i.size>0&&(r=r.filter(a=>!i.has(a.sessionId))),e?.archived===!0?r=r.filter(a=>a.archivedAt!=null):e?.archived===!1&&(r=r.filter(a=>a.archivedAt==null));let s=r.slice(0,n).map(a=>({sessionId:a.sessionId,title:a.title,type:a.type??"personal",agentId:a.agentId,lastActiveAt:a.lastActiveAt,messageCount:a.messageCount,pinnedAt:a.pinnedAt??null,archivedAt:a.archivedAt??null,sealedAt:a.sealedAt??null,projectId:a.projectId,previousSessionId:a.previousSessionId??null,carryoverSummary:a.carryoverSummary??null}));t.id!==void 0&&this.sendResponse(t.id,{sessions:s})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to list sessions: ${pr(r)}`})}}async function zK(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let n=il(this,e.sessionId,e.projectId),o=(await ln(500,n)).find(i=>i.sessionId===e.sessionId);t.id!==void 0&&this.sendResponse(t.id,{session:o?{sessionId:o.sessionId,title:o.title,type:o.type,lastActiveAt:o.lastActiveAt,messageCount:o.messageCount,pinnedAt:o.pinnedAt??null,archivedAt:o.archivedAt??null,projectId:o.projectId}:null})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to get session: ${pr(n)}`})}}async function BK(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let n=il(this,e.sessionId,e.projectId),r=await Hr(e.sessionId,n,{includeDisplayMetadata:!0});if(!r){t.id!==void 0&&this.sendResponse(t.id,{messages:[],total:0});return}let o=r.messages;if(ORe(o)){this.log(`[session] purging legacy baked-attachment session ${e.sessionId} (VS Code two-line cutover)`);try{await yt(e.sessionId,{archivedAt:new Date().toISOString()},n)}catch{}t.id!==void 0&&this.sendResponse(t.id,{messages:[],total:0});return}let i=e.limit&&e.limit>0?e.limit:o.length,s=o.slice(-i);t.id!==void 0&&this.sendResponse(t.id,{messages:s,total:o.length})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to get messages: ${pr(n)}`})}}async function qK(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let n=il(this,e.sessionId,e.projectId),r=await yt(e.sessionId,{...e.title!==void 0?{title:e.title}:{},...e.pinnedAt!==void 0?{pinnedAt:e.pinnedAt}:{},...e.archivedAt!==void 0?{archivedAt:e.archivedAt}:{}},n);r&&this.sendNotification("session.info",{sessionId:e.sessionId,title:r.title,pinnedAt:r.pinnedAt??null,archivedAt:r.archivedAt??null,projectId:e.projectId||void 0}),t.id!==void 0&&this.sendResponse(t.id,{ok:r!==null})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to update session: ${pr(n)}`})}}async function WK(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: sessionId"});return}if(!e.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: projectId"});return}try{let n=il(this,e.sessionId,e.projectId);await dm(e.sessionId,n),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to delete session: ${pr(n)}`})}}async function GK(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: projectId"});return}try{let n=wn.getProjectWorkspaceDir(e.projectId),r=(await ln(1e4,n)).filter(i=>i.projectId===e.projectId),o=0;for(let i of r)await dm(i.sessionId,n),o++;t.id!==void 0&&this.sendResponse(t.id,{ok:!0,deletedCount:o})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to delete all sessions: ${pr(n)}`})}}async function KK(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let n=il(this,e.sessionId,e.projectId);await yt(e.sessionId,{archivedAt:new Date().toISOString()},n),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to archive session: ${pr(n)}`})}}async function VK(t){let e=t.params,n=e?.sessionId;if(!n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"sessionId is required"});return}try{let r=il(this,n,e?.projectId),o=await Hr(n,r);if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:`Session not found: ${n}`});return}o.messages&&o.messages.length>0&&this.sessionHistory.saveResumedSession(n,o.messages),t.id!==void 0&&this.sendResponse(t.id,{metadata:o.metadata,messages:o.messages})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to resume session: ${pr(r)}`})}}function JK(t){let e=this.currentSessionId||"default",n=this.sessionState?.createSnapshot(),r,o=this.getActiveProjectRoot();o&&(r=Ko.join(ci(o),e));let i={sessionId:e,model:this.currentModel||void 0,cwd:process.cwd(),paths:{sessionDir:r,agentHome:_e(),settings:Cn()},usage:n?{turnCount:n.turnCount,inputTokens:n.totalInputTokens,outputTokens:n.totalOutputTokens}:void 0};t.id!==void 0&&this.sendResponse(t.id,i)}function ZK(t){let e=t.params,n=null;if(e?.projectId)n=re(e.projectId);else if(e?.projectName){let i=fe(),s=e.projectName.toLowerCase();if(n=i.find(a=>a.name.toLowerCase()===s)??null,n||(n=i.find(a=>a.name.toLowerCase().includes(s))??null),!n){let a=i.map(c=>c.name).slice(0,10);t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`No project matching "${e.projectName}". Available: ${a.join(", ")||"(none)"}`});return}}else{t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: projectId or projectName"});return}if(!n||n.status!=="active"){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Project not found or archived: ${e.projectId??e.projectName}`});return}let r=e.workspaceDir??n.workspaceDir;if(!Sn.existsSync(r)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Workspace directory does not exist: ${r}`});return}let o=So(n.id);if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:"Switch failed"});return}this.setActiveWorkdir(o.workspaceDir),this.sendNotification("project.switched",{id:o.id,name:o.name,workspaceDir:o.workspaceDir}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,project:o})}function XK(t){let e=Me(),n=fe();t.id!==void 0&&this.sendResponse(t.id,{sessionId:this.currentSessionId,activeProject:e,projects:n})}async function YK(t){let e=t.params,n=e?.sessionId;if(!n){t.id!==void 0&&this.sendResponse(t.id,{ok:!1});return}let r=fe();for(let o of r)try{let i=wn.getProjectWorkspaceDir(o.id),s=await Vt(n,i);if(s&&s.projectId===o.id){So(o.id),this.setActiveWorkdir(i),this.log(`[session.focus] switched to project ${o.id} for session ${n}`),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,projectId:o.id});return}}catch{}if(e?.projectName){let o=r.find(i=>i.name===e.projectName);if(o){let i=wn.getProjectWorkspaceDir(o.id);this.getActiveProjectRoot()!==i&&(this.setActiveWorkdir(i),this.log(`[session.focus] switched to project ${o.id} by name "${e.projectName}"`)),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,projectId:o.id});return}}t.id!==void 0&&this.sendResponse(t.id,{ok:!1})}async function QK(t){let e=t.params,{sessionId:n,fromProjectId:r,toProjectId:o}=e??{};if(!n||!r||!o){t.id!==void 0&&this.sendError(t.id,w.INVALID_PARAMS,"sessionId, fromProjectId, and toProjectId are required");return}if(r===o){t.id!==void 0&&this.sendResponse(t.id,{ok:!0});return}let i=re(r),s=re(o);if(!i||!s){t.id!==void 0&&this.sendError(t.id,w.INVALID_PARAMS,"Source or target project not found");return}let a=Ko.join(ci(r),n),c=Ko.join(ci(o),n);if(!Sn.existsSync(a)){t.id!==void 0&&this.sendError(t.id,w.INVALID_PARAMS,`Session ${n} not found in project ${r}`);return}try{Sn.mkdirSync(Ko.dirname(c),{recursive:!0}),Sn.cpSync(a,c,{recursive:!0});let l=Ko.join(c,"metadata.json");if(Sn.existsSync(l)){let d=JSON.parse(Sn.readFileSync(l,"utf-8"));d.projectId=o,Sn.writeFileSync(l,JSON.stringify(d,null,2))}Sn.rmSync(a,{recursive:!0,force:!0}),this.sendNotification("session-update",{sessionId:n,projectId:o}),this.log(`[session.moveToProject] moved ${n}: ${r} -> ${o}`),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,projectId:o})}catch(l){let d=pr(l);this.log(`[session.moveToProject] error: ${d}`),t.id!==void 0&&this.sendError(t.id,w.INTERNAL_ERROR,`Move failed: ${d}`)}}pt();import{spawn as FRe}from"node:child_process";function HRe(){return process.platform==="win32"?[{command:"powershell.exe",args:["-NoProfile","-Command","[Console]::In.ReadToEnd() | Set-Clipboard"]},{command:"pwsh.exe",args:["-NoProfile","-Command","[Console]::In.ReadToEnd() | Set-Clipboard"]}]:process.platform==="darwin"?[{command:"pbcopy",args:[]}]:[{command:"wl-copy",args:[]},{command:"xclip",args:["-selection","clipboard"]},{command:"xsel",args:["--clipboard","--input"]}]}function zRe(t,e){return new Promise((n,r)=>{let o=FRe(t.command,t.args,{stdio:["pipe","ignore","pipe"],windowsHide:!0}),i="",s=setTimeout(()=>{o.kill(),r(new Error("Clipboard command timed out"))},3e3);o.stderr?.on("data",a=>{i+=String(a)}),o.on("error",a=>{clearTimeout(s),r(a)}),o.on("close",a=>{if(clearTimeout(s),a===0){n();return}r(new Error(i.trim()||`Clipboard command exited with code ${a}`))}),o.stdin.end(e)})}async function BRe(t){let e;for(let r of HRe())try{await zRe(r,t);return}catch(o){e=o}let n=e instanceof Error?e.message:"No clipboard command available";throw new Error(`System clipboard unavailable: ${n}`)}function qRe(t){return t.length<=8?"****":`${t.slice(0,3)}***${t.slice(-4)}`}function at(t,e,n,r=w.INTERNAL_ERROR){if(e.id!==void 0){if(typeof t.sendError=="function"){t.sendError(e.id,r,n);return}t.sendResponse(e.id,void 0,{code:r,message:n})}}function qC(t,e){at(t,e,Xl)}function WRe(t){let e={};for(let n of t)for(let r of n.routeIntents)e[r]??=[],e[r].push(n);return e}async function GRe(){let t=V(),e=await Ma(t);return Ql(t),t.save(),e}async function KRe(t){try{return await GRe(),!0}catch(e){if(t)throw e;return!1}}function tV(t=V()){return rN()}function WC(t){return t.id===vt?vt:t.group?.trim()||t.id}function VRe(t){return t.id===WC(t)}function eV(t){let e=WC(t);return Im({...t,id:e})}function JRe(t){return{volcengine:"\u5E38\u89C4 Ark API Key","volcengine-plan":"\u8BA2\u9605 / Plan \u901A\u9053",qwen:"\u5E38\u89C4 DashScope API Key","qwen-coding":"Coding Plan \u901A\u9053",zhipu:"Anthropic \u901A\u9053","zhipu-openai":"OpenAI \u517C\u5BB9\u901A\u9053","zhipu-coding":"Coding \u901A\u9053"}[t.id]??Im(t)}function ZRe(t){return t.authType==="none"?!1:t.apiKeyEnvVars===void 0||t.apiKeyEnvVars.length>0}function XRe(t){return{id:t.id,displayName:JRe(t),baseUrl:di(t)??"",modelCount:t.models?.length??0}}function YRe(t){let e=new Map;for(let n of t){if(!ZRe(n))continue;let r=WC(n);if(r===vt)continue;let o=n.models?.length??0,i=XRe(n),s=e.get(r);if(!s){e.set(r,{id:r,displayName:eV(n),baseUrl:di(n)??"",modelCount:o,variants:[i]});continue}s.modelCount+=o,s.variants??=[],s.variants.some(a=>a.id===i.id)||s.variants.push(i),VRe(n)&&(s.displayName=eV(n),s.baseUrl=di(n)??s.baseUrl)}return Array.from(e.values()).map(({variants:n,...r})=>({...r,...n&&n.length>1?{variants:n}:{}}))}async function nV(){if(V().isHydratedFromUpstream())return!0;let t=await KRe(!1);return t&&V().markHydratedFromUpstream(),t}function rV(){V().markHydratedFromUpstream()}function QRe(t){return t.defaultModel??t.models?.find(e=>!!e.id)?.id}function eTe(t){return[...new Set(t)]}function tTe(t){let e=t.replace(/\/+$/,"");return eTe([`${e}/models`,/\/v\d+$/.test(e)?`${e}/models`:`${e}/v1/models`])}function nTe(t){return t===404||t===405||t===410||t===501}async function rTe(t){let e=await Kw(t);if(e)return{id:e.id,transport:e.transport,baseUrl:di(e),authType:e.authType,models:e.models}}function BC(t){return{accept:"application/json",Authorization:`Bearer ${t}`}}function oTe(t,e,n,r){if(t===vt)return[{method:"GET",url:Ww(n),headers:BC(e)}];let o=iTe(n,r).replace(/\/+$/,""),i=r?.transport,s=QRe(r??{id:t}),a=[];if(i==="anthropic-messages")return/\/anthropic$/.test(o)&&a.push({method:"GET",url:`${o.replace(/\/anthropic$/,"")}/models`,headers:BC(e)}),s&&a.push({method:"POST",url:`${o}/v1/messages`,headers:{"Content-Type":"application/json","x-api-key":e,"anthropic-version":"2023-06-01"},body:{model:s,messages:[{role:"user",content:"ping"}],max_tokens:1,stream:!1}}),a;if(i==="gemini-generatecontent")return s?[{method:"POST",url:`${o}/models/${encodeURIComponent(s)}:generateContent`,headers:{"Content-Type":"application/json","x-goog-api-key":e},body:{contents:[{role:"user",parts:[{text:"ping"}]}],generationConfig:{maxOutputTokens:1}}}]:a;if(i==="volcengine-responses")return s?[{method:"POST",url:`${o.replace(/\/v\d+$/,"")}/v3/responses`,headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:{model:s,input:[{role:"user",content:[{type:"input_text",text:"ping"}]}],max_output_tokens:1,stream:!1,store:!1}}]:a;for(let c of tTe(o))a.push({method:"GET",url:c,headers:BC(e)});return a}function iTe(t,e){let n=t.trim(),r=e?.baseUrl?.trim();return e?.transport==="anthropic-messages"&&r&&/\/anthropic\/?$/.test(r)&&!/\/anthropic\/?$/.test(n)?r:n}async function sTe(t){try{let e=await fetch(t.url,{method:t.method,headers:t.headers,body:t.body?JSON.stringify(t.body):void 0,signal:AbortSignal.timeout(1e4)});if(e.ok)return{valid:!0,status:e.status,url:t.url};let n=await e.text().catch(()=>"");return{valid:!1,status:e.status,error:n.slice(0,500),url:t.url}}catch(e){return{valid:!1,status:0,error:e instanceof Error?e.message:String(e),url:t.url}}}async function oV(t,e,n){let r=await rTe(t),o=oTe(t,e,n,r);if(o.length===0)return{valid:!1,status:0,error:`No validation probe is available for provider "${t}".`};let i;for(let s of o){let a=await sTe(s);if(a.valid)return a;if(nTe(a.status)){i=a;continue}return a}return i??{valid:!1,status:0,error:`No validation probe succeeded for provider "${t}".`}}async function aTe(t,e,n){let r=await oV(t,e,n);if(!r.valid){let o=r.error?`: ${r.error}`:"";throw new Error(`API Key validation failed (${r.status})${o}`)}}async function iV(t){try{let e=await Yl(),n=e.find(o=>o.id===vt);if(!n)throw new Error(Xl);let r=YRe(e);r.unshift({id:vt,displayName:qw,baseUrl:di(n)??tV(),modelCount:e.reduce((o,i)=>o+(i.models?.length??0),0)}),t.id!==void 0&&this.sendResponse(t.id,{providers:r})}catch(e){at(this,t,e instanceof Error?e.message:String(e))}}async function sV(t){let e=t.params;if(!e?.providerId||!e?.key){at(this,t,"Required: providerId (string), key (string)",w.INVALID_PARAMS);return}let{providerId:n,key:r,label:o}=e,i=V(),s,a=!1;try{let c=await vV(n);if(!c){at(this,t,`Unknown provider: ${n}`,w.INVALID_PARAMS);return}let l=i.getProviderStatus(n);if(l?.keys.some(p=>p.key===r)){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,error:"\u8BE5 Key \u5DF2\u5B58\u5728\uFF0C\u65E0\u9700\u91CD\u590D\u6DFB\u52A0"});return}a=!l;let d=l?.keys.map(p=>p.id)??[];if(i.addProvider(n,{baseUrl:c}),s=i.addKey(n,r,{label:o}),n===vt){if((await lN(i,{baseUrl:c,apiKey:r})).length===0)throw new Error("LLMRouter did not return any available models for this API Key.")}else await aTe(n,r,c);await Ma(i),rV();for(let p of Jl)if(!i.getBinding(p)){let m=i.listModels({purpose:p,provider:n,enabledOnly:!0});m.length===0&&(m=i.listModels({purpose:p,provider:n}),m[0]&&i.enableModel(m[0].id)),m.length>0&&i.setBinding(p,m[0].id)}if(i.setKeyHealth(s,"healthy"),e.replaceExisting===!0)for(let p of d)i.updateKey(p,{enabled:!1});i.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,keyId:s,providerId:n})}catch(c){s&&(i.removeKey(s),a&&i.removeProvider(n));let l=c instanceof Error?c.message:Xl;at(this,t,l)}}function aV(t){let e=t.params;if(!e?.keyId){at(this,t,"Required: keyId (string)",w.INVALID_PARAMS);return}let n=V();if(!n.removeKey(e.keyId)){at(this,t,"API Key not found",w.INVALID_PARAMS);return}n.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}function cV(t){let e=t.params;if(!e?.keyId){at(this,t,"Required: keyId (string)",w.INVALID_PARAMS);return}let n=V().getKeyById(e.keyId);if(!n){at(this,t,"API Key not found",w.INVALID_PARAMS);return}t.id!==void 0&&this.sendResponse(t.id,{key:n})}async function lV(t){let e=t.params;if(!e?.keyId){at(this,t,"Required: keyId (string)",w.INVALID_PARAMS);return}let n=V().getKeyById(e.keyId);if(!n){at(this,t,"API Key not found",w.INVALID_PARAMS);return}try{await(this.writeClipboard?this.writeClipboard(n):BRe(n)),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(r){let o=r instanceof Error?r.message:"\u590D\u5236 Key \u5931\u8D25";at(this,t,o)}}function dV(t){let e=t.params;if(!e?.keyId||typeof e.enabled!="boolean"){at(this,t,"Required: keyId (string), enabled (boolean)",w.INVALID_PARAMS);return}let n=V();if(!n.updateKey(e.keyId,{enabled:e.enabled})){at(this,t,"API Key not found",w.INVALID_PARAMS);return}n.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}function uV(t){let e=t.params;if(!e?.modelId||typeof e.enabled!="boolean"){at(this,t,"Required: modelId (string), enabled (boolean)",w.INVALID_PARAMS);return}let n=V();e.enabled?n.enableModel(e.modelId):n.disableModel(e.modelId),n.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}async function pV(t){let e=t.params;try{await nV();let n=V(),r=new Set(n.getAllProviderStatus().filter(i=>i.keys.length>0).map(i=>i.providerId)),o=n.listModels({purpose:e?.purpose,provider:e?.provider}).filter(i=>n.hasConfiguredKeyForProviderVariant(i.provider));t.id!==void 0&&this.sendResponse(t.id,{models:o,grouped:WRe(o),configuredProviderIds:[...r]})}catch{qC(this,t)}}function mV(t){let e=t.params;if(!e?.purpose||!e?.modelId){at(this,t,"Required: purpose (string), modelId (string)",w.INVALID_PARAMS);return}try{let n=V();n.setBinding(e.purpose,e.modelId),n.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(n){at(this,t,n instanceof Error?n.message:String(n),w.INVALID_PARAMS)}}function fV(t){let e=t.params;if(!e?.purpose){at(this,t,"Required: purpose (string)",w.INVALID_PARAMS);return}let n=V(),r=n.getBinding(e.purpose);t.id!==void 0&&this.sendResponse(t.id,{model:r?{id:r.id,provider:r.provider,model:r.model,displayName:r.displayName,routeIntents:r.routeIntents,capabilityProfile:r.capabilityProfile,enabled:r.enabled}:null,available:n.isAvailable(e.purpose)})}async function gV(t){try{await nV();let e=V(),n=e.getAllProviderStatus().map(i=>({providerId:i.providerId,displayName:i.providerId===vt?qw:i.providerId,baseUrl:i.baseUrl,keyCount:i.keys.length,healthyKeys:i.keys.filter(s=>s.healthStatus==="healthy"&&s.enabled).length,totalKeys:i.keys.length,keys:i.keys.map(s=>({id:s.id,label:s.label,maskedKey:qRe(s.key),enabled:s.enabled,health:s.healthStatus}))})),r=e.getAllBindings(),o={};for(let i of Jl){let s=r[i];o[i]={bound:!!s,modelId:s?.id,modelName:s?.displayName,available:e.isAvailable(i)}}t.id!==void 0&&this.sendResponse(t.id,{providers:n,purposes:o})}catch{qC(this,t)}}async function hV(t){try{let e=V();e.load(),await Ma(e,void 0,{force:!0}),Ql(e),e.save(),rV(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,catalogRefreshed:!0})}catch{qC(this,t)}}async function yV(t){let e=t.params;if(!e?.providerId||!e?.apiKey){at(this,t,"providerId and apiKey required",w.INVALID_PARAMS);return}try{let n=e.baseUrl||await vV(e.providerId);if(!n){at(this,t,`Unknown provider: ${e.providerId}`,w.INVALID_PARAMS);return}let r=await oV(e.providerId,e.apiKey,n);t.id!==void 0&&this.sendResponse(t.id,r)}catch(n){let r=n instanceof Error?n.message:String(n);t.id!==void 0&&this.sendResponse(t.id,{valid:!1,status:0,error:r})}}async function vV(t){if(t===vt)return tV();let e=await Kw(t);return e?di(e):void 0}de();import*as GC from"node:fs";import*as bV from"node:path";Pa();de();function Wy(t){let e=Ve(ce());return Gd(t).map(n=>cTe(n,e))}function cTe(t,e){let n=Nz(e,t.name),r=n?.registryVersion;return{id:t.name,name:t.name,path:t.baseDir,active:t.active,globallyDisabled:t.globallyDisabled,projectDisabled:t.projectDisabled,category:t.category,author:t.author,...n?.source?{source:n.source}:{},displayName:lTe(t.name),displayDescription:dTe(t.name,t.description),fallbackName:t.name,fallbackDescription:t.description??"",systemGenerated:t.systemGenerated,version:t.version,...r?{registryVersion:r}:{},description:t.description}}function lTe(t){return{key:`capability.skill.${t}.name`,fallback:t}}function dTe(t,e){return{key:`capability.skill.${t}.description`,fallback:e??""}}function uTe(t){return t==="active"||t==="stale"||t==="archived"}function kV(t){let n=t.params?.projectId,r=this.getActiveProjectRoot();if(n&&this.projectLocator){let i=this.projectLocator.resolveProjectRoot(n);i&&(r=i)}let o=Wy(r);t.id!==void 0&&this.sendResponse(t.id,{skills:o})}function wV(t){let n=t.params?.name;if(!n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: name"});return}if(!Ln(n)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Skill "${n}" not found`});return}let r=Mn(n,!1),o=ce(),i=Ve(o),s=Fn(i,n);s.state!=="active"&&(s.state="active",s.staleAt=void 0,s.archivedAt=void 0),st(o,i),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,already:!r}),this.sendNotification("skills.updated",{action:"activate",name:n})}function SV(t){let n=t.params?.name;if(!n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required param: name"});return}let r=Mn(n,!0);t.id!==void 0&&this.sendResponse(t.id,{ok:!0,already:!r}),this.sendNotification("skills.updated",{action:"deactivate",name:n})}async function xV(t){let n=t.params?.name;if(!n||/[\/\\]|\.\./.test(n)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing or invalid skill name"});return}let r=ce(),o=Ve(r);if(o.records[n]?.pinned){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:`Skill "${n}" is pinned. Unpin it first.`});return}let i=Ln(n);if(!i){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Skill "${n}" not found in skill store`});return}let s=i.baseDir;try{GC.rmSync(s,{recursive:!0,force:!0}),eh(o,n),Mn(n,!1),st(r,o),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,deleted:n}),this.sendNotification("skills.updated",{action:"delete",name:n})}catch(a){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Failed to delete skill: ${a instanceof Error?a.message:a}`})}}function RV(t){let n=t.params?.name;if(!n||/[\/\\]|\.\./.test(n)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing or invalid skill name"});return}if(!Ln(n)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:`Skill "${n}" not found in skill store`});return}let r=ce(),o=Ve(r),i=Fn(o,n);i.source="promoted",st(r,o),Mn(n,!1),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,promoted:n,scope:"global",globalPath:bV.join(_n(),n)}),this.sendNotification("skills.updated",{action:"promote",name:n})}function TV(t){let e=t.params,n=e?.name;if(!n||typeof e?.disabled!="boolean"){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Missing required params: name (string), disabled (boolean)"});return}let r=this.getActiveProjectRoot();if(e.projectId&&this.projectLocator){let i=this.projectLocator.resolveProjectRoot(e.projectId);i&&(r=i)}if(!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INTERNAL_ERROR,message:"No project workspace to scope the skill mute to"});return}let o=e$(r,n,e.disabled);t.id!==void 0&&this.sendResponse(t.id,{ok:!0,name:n,disabled:e.disabled,changed:o}),this.sendNotification("skills.updated",{action:e.disabled?"project-mute":"project-unmute",name:n})}function AV(t){let e=t.params,n=ce(),r=Ve(n);if(e?.name){let o=Oz(r,e.name);t.id!==void 0&&this.sendResponse(t.id,{name:e.name,stats:o??null})}else{let o=jz(r);t.id!==void 0&&this.sendResponse(t.id,{stats:o})}}function PV(t){let e=t.params;if(!e?.name){t.id!==void 0&&this.sendResponse(t.id,null,{code:-32602,message:"Missing 'name' parameter"});return}let n=ce(),r=Ve(n);Fn(r,e.name),Ez(r,e.name),st(n,r),t.id!==void 0&&this.sendResponse(t.id,{name:e.name,pinned:!0})}function IV(t){let e=t.params;if(!e?.name){t.id!==void 0&&this.sendResponse(t.id,null,{code:-32602,message:"Missing 'name' parameter"});return}let n=ce(),r=Ve(n);Mz(r,e.name),st(n,r),t.id!==void 0&&this.sendResponse(t.id,{name:e.name,pinned:!1})}function _V(t){let e=ce(),n=_n(),r=Dz(e,n);t.id!==void 0&&this.sendResponse(t.id,r)}function CV(t){let e=t.params,n=ce(),r=Ve(n);if(e?.name){let o=r.records[e.name]??null;t.id!==void 0&&this.sendResponse(t.id,{record:o})}else if(e?.state){if(!uTe(e.state)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:w.INVALID_PARAMS,message:"Invalid skill lifecycle state"});return}let o=$z(r,e.state);t.id!==void 0&&this.sendResponse(t.id,{records:o})}else t.id!==void 0&&this.sendResponse(t.id,{records:Object.values(r.records)})}import*as jV from"node:path";He();import{randomUUID as yTe}from"node:crypto";import*as OV from"node:path";import{join as KC}from"node:path";import{mkdir as pTe,readdir as mTe}from"node:fs/promises";Ke();function fTe(t){return t?.pathService??ee()}function gTe(t,e){return t??e.getActiveProjectRoot()}function EV(t,e){let n=fTe(e);return KC(n.getProjectAgentDir(gTe(t,n)),"solos")}function VC(t,e,n){return KC(EV(e,n),t)}function MV(t,e,n){return KC(VC(t,e,n),"solo-state.json")}async function DV(t,e,n){let r=VC(t.soloId,e,n);await pTe(r,{recursive:!0}),await Bt(MV(t.soloId,e,n),t)}async function hTe(t,e,n){return Et(MV(t,e,n))}async function $V(t,e){let n=EV(t,e),r;try{r=await mTe(n)}catch{return[]}let o=[];for(let i of r){let s=await hTe(i,t,e);s&&o.push(s)}return o}async function JC(t,e,n){let{rm:r}=await import("node:fs/promises"),o=VC(t,e,n);try{return await r(o,{recursive:!0,force:!0}),!0}catch{return!1}}function NV(t){if(typeof t=="string")return t;if(t&&typeof t=="object"){let e=t;if(typeof e.content=="string")return e.content;if(typeof e.text=="string")return e.text}return t==null?"":JSON.stringify(t)}function vTe(t){let e=["<spec>",`\u76EE\u6807: ${t.goal}`];return t.constraints.length&&(e.push("\u7EA6\u675F:"),t.constraints.forEach((n,r)=>e.push(` ${r+1}. ${n}`))),t.acceptance.length&&(e.push("\u9A8C\u6536\u6807\u51C6(\u5FC5\u987B\u5168\u90E8\u6EE1\u8DB3):"),t.acceptance.forEach((n,r)=>e.push(` ${r+1}. ${n}`))),e.push("</spec>"),e.join(`
1120
1120
  `)}function bTe(t,e,n){let r=[];e?.rules?.length&&r.push(`<rules>
1121
1121
  ${e.rules.join(`
1122
1122
  `)}
@@ -17,7 +17,7 @@ export interface ElectronNpm {
17
17
  nodeExe: string;
18
18
  /** Bundled npm's CLI entry (…/node_modules/npm/bin/npm-cli.js). */
19
19
  npmCli: string;
20
- /** Writable global-install prefix (~/.xiaozhiclaw/npm-global), or undefined if the shell set none. */
20
+ /** Writable global-install prefix (~/.xiaozhiclaw-agents/npm-global), or undefined if the shell set none. */
21
21
  prefix?: string;
22
22
  }
23
23
  /** Resolve the desktop npm bridge from env, or null when not running under the packaged desktop app. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qlogicagent",
3
- "version": "2.17.6",
3
+ "version": "2.17.7",
4
4
  "description": "XiaozhiClaw Agent CLI — subprocess architecture (JSON-RPC over stdio)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",