qlogicagent 2.11.1 → 2.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -476,7 +476,7 @@ If no action needed, just respond with a progress update message to the user.`,e
476
476
  `)},onMcpToolCall:(a,c,l)=>this.handleMcpToolCall(a,c,l),sessionDir:BR.join(J(),"agent-logs")}),n=$R({findTool:a=>this.toolCatalog.findTool(a),runAgent:async({agentId:a,prompt:c,signal:l})=>{let d=a??"self",p=this.acpDetector.buildExternalDescriptor(d);if(!p)throw new Error(`workflow agent node: agent "${d}" is not available`);let u=`workflow-agent-${qR().slice(0,8)}`;if(l?.aborted)throw new Error("workflow agent node aborted before dispatch");await r.spawn({memberId:u,name:`workflow-${d}`,cwd:t,prompt:c,external:p});try{let m=await r.sendTask(u,c);return typeof m=="string"?m:JSON.stringify(m)}finally{try{r.kill(u),r.remove(u)}catch(m){process.stderr.write(`[workflow:pm] WARN cleanup of ${u} failed: ${m instanceof Error?m.message:String(m)}
477
477
  `)}}},invokeMcp:({server:a,tool:c,args:l})=>this.handleMcpToolCall(`workflow-mcp:${a}`,c,l),sendChannel:async({channel:a,target:c,payload:l})=>(this.sendNotification("workflow.channel.send",{channel:a,target:c,payload:l}),{queued:!0})}),o=new Ln;for(let[a,c]of Object.entries(Lo))o.register(a,c);let s=Lv({registry:o,host:n,budget:{maxNodeExecutions:HU}});this.workflowController=new Sr(e,s),this.workflowStore=e,this.workflowProcessManager=r,$v(this.workflowController);let i=new Zi({controller:this.workflowController,onError:(a,c)=>{let l=a instanceof Error?a.message:String(a);process.stderr.write(`[workflow:scheduler] run error for ${c}: ${l}
478
478
  `),this.sendNotification("workflow.runFailed",{workflowId:c,triggerType:"schedule",error:l})}});this.workflowScheduler=i,i.start().catch(a=>{process.stderr.write(`[workflow:scheduler] start failed: ${a instanceof Error?a.message:String(a)}
479
- `)})}return this.workflowController}function lr(t){return t.params??{}}function dr(t,e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:e})}function BU(t){return{id:t.id,name:t.name,active:t.active,concurrency:t.concurrency,rev:t.rev,createdAt:t.createdAt,updatedAt:t.updatedAt,...t.trigger!==void 0?{trigger:t.trigger}:{},def:t.def}}function ep(t,e){this.sendNotification(t,{workflow:BU(e)})}function tp(t,e){if(t.status==="failed"){this.sendNotification("workflow.runFailed",{workflowId:t.workflowId,triggerType:e,error:"Workflow run failed",outcome:t});return}this.sendNotification("workflow.runCompleted",{workflowId:t.workflowId,status:t.status,triggerType:e,outcome:t})}function qU(t){return t instanceof Error?t.message:String(t)}async function WR(t){let e=lr(t);if(!e.def)return dr.call(this,t,"workflow.create requires `def`");let r=Vt.call(this),n=String(e.id??`wf_${qR().slice(0,8)}`),o=await r.create({id:n,name:String(e.name??n),def:e.def,concurrency:e.concurrency,active:e.active===!0});o.active&&await this.workflowScheduler?.refresh(o.id),ep.call(this,"workflow.created",o),t.id!==void 0&&this.sendResponse(t.id,o)}async function GR(t){let e=lr(t);if(!e.id)return dr.call(this,t,"workflow.get requires `id`");let n=await Vt.call(this).get(String(e.id));t.id!==void 0&&this.sendResponse(t.id,n)}async function KR(t){let e=lr(t);if(!e.id)return dr.call(this,t,"workflow.describe requires `id`");let n=await Vt.call(this).describe(String(e.id));t.id!==void 0&&this.sendResponse(t.id,{rendered:n})}async function zR(t){let e=lr(t);if(!e.id||!e.patch)return dr.call(this,t,"workflow.patch requires `id` and `patch`");let r=Vt.call(this),n={patch:e.patch,baseRev:e.baseRev,scope:e.scope},o=await r.patch(String(e.id),n);await this.workflowScheduler?.refresh(String(e.id)),o.ok&&ep.call(this,"workflow.updated",await r.get(String(e.id))),t.id!==void 0&&this.sendResponse(t.id,o)}async function VR(t){let e=lr(t);if(!e.id)return dr.call(this,t,"workflow.run requires `id`");let r=Vt.call(this),n=e.trigger??{type:"manual"},o=String(e.id);this.sendNotification("workflow.runStarted",{workflowId:o,triggerType:n.type});let s;try{s=await r.run(o,n),tp.call(this,s,n.type)}catch(i){throw this.sendNotification("workflow.runFailed",{workflowId:o,triggerType:n.type,error:qU(i)}),i}t.id!==void 0&&this.sendResponse(t.id,s)}async function YR(t){let e=lr(t);if(!e.id||typeof e.active!="boolean")return dr.call(this,t,"workflow.setActive requires `id` and boolean `active`");let n=await Vt.call(this).setActive(String(e.id),e.active);await this.workflowScheduler?.refresh(n.id),ep.call(this,"workflow.updated",n),t.id!==void 0&&this.sendResponse(t.id,n)}async function XR(t){Vt.call(this);let r=await this.workflowStore.list();t.id!==void 0&&this.sendResponse(t.id,{workflows:r})}async function JR(t){let e=lr(t);if(!e.id)return dr.call(this,t,"workflow.delete requires `id`");Vt.call(this),await this.workflowStore.delete(String(e.id)),await this.workflowScheduler?.refresh(String(e.id)),this.sendNotification("workflow.deleted",{workflowId:String(e.id)}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}async function QR(t){let e=lr(t);if(!e.channel||typeof e.text!="string")return dr.call(this,t,"workflow.onImMessage requires `channel` and string `text`");Vt.call(this);let r=await this.workflowScheduler.onImMessage(String(e.channel),e.text,e.payload);for(let n of r)tp.call(this,n,"im-message");t.id!==void 0&&this.sendResponse(t.id,{outcomes:r})}async function ZR(t){let e=lr(t);if(!e.path)return dr.call(this,t,"workflow.onWebhook requires `path`");Vt.call(this);let r=await this.workflowScheduler.onWebhook(String(e.path),e.payload);for(let n of r)tp.call(this,n,"webhook");t.id!==void 0&&this.sendResponse(t.id,{outcomes:r})}import*as _e from"node:fs";import*as me from"node:path";G();import*as Xr from"node:fs";import*as rp from"node:path";G();import*as Me from"node:fs";import*as Wo from"node:path";function ea(t){let e=J(),r=Oe(t);Me.existsSync(r)||Me.mkdirSync(r,{recursive:!0});let n=Wo.join(e,"INSTRUCTIONS.md"),o=Wo.join(r,"INSTRUCTIONS.md");if(Me.existsSync(n)&&!Me.existsSync(o))try{Me.copyFileSync(n,o)}catch{}let s=Tm(),i=cn(t);if(Me.existsSync(s)&&!Me.existsSync(i))try{Me.mkdirSync(i,{recursive:!0});for(let a of Me.readdirSync(s)){if(!a.endsWith(".md"))continue;let c=Wo.join(s,a),l=Wo.join(i,a);Me.statSync(c).isFile()&&Me.copyFileSync(c,l)}}catch{}}var WU=["creating","running","completed","cancelled"];function eS(t){return typeof t=="string"&&WU.includes(t)}function tS(t,e){let r=I(),n=e.workspaceDir||rp.join(r.getUserAgentHome(),"workspaces",e.name);if(e.groupId){let l=ei(e.groupId);if(l)return{project:l,isAgentTeamProject:l.type==="solo"||l.type==="product",deduplicated:!0}}let s=K().find(l=>l.name===e.name);GU(n);let i=Zs({name:e.name,workspaceDir:n,type:e.type??"personal",groupId:e.groupId,skipAutoSwitch:e.type==="solo"||e.type==="product"}),a=i.type==="solo"||i.type==="product";a||(Mt(i.id),t.setActiveWorkdir(i.workspaceDir)),ea(i.workspaceDir);let c=t.projectMemoryStoreFactory.create(i.workspaceDir);return c.ensureInitialized(),a||(t.memdir=c,t.mediaPersistence.setProjectDir(i.workspaceDir)),KU(i),{project:i,nameDuplicate:s,isAgentTeamProject:a}}function GU(t){Xr.existsSync(t)||Xr.mkdirSync(t,{recursive:!0})}function KU(t){let e=I();if(t.type!=="solo"&&t.type!=="product")return;let r=rp.join(e.getProjectAgentDir(t.workspaceDir),t.type==="solo"?"solo-state.json":"product-state.json");if(Xr.existsSync(r))return;let n=t.type==="solo"?{agents:[],status:"idle",createdAt:new Date().toISOString()}:{tasks:[],instances:[],status:"idle",createdAt:new Date().toISOString()};Xr.writeFileSync(r,JSON.stringify(n,null,2))}function rS(t){let e=t.params;if(!e?.name){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: name"});return}let r;try{r=tS(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:y.INTERNAL_ERROR,message:a instanceof Error?a.message:`Cannot create workspace directory: ${e.workspaceDir??e.name}`});return}let{project:n,nameDuplicate:o,isAgentTeamProject:s,deduplicated:i}=r;if(i){t.id!==void 0&&this.sendResponse(t.id,{ok:!0,project:n,deduplicated:!0});return}if(this.sendNotification("project.created",{id:n.id,name:n.name,workspaceDir:n.workspaceDir,type:n.type}),s||this.sendNotification("project.switched",{id:n.id,name:n.name,workspaceDir:n.workspaceDir}),t.id!==void 0){let a={ok:!0,project:n};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 nS(t){let e=K();t.id!==void 0&&this.sendResponse(t.id,{projects:e})}function oS(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: projectId"});return}let r=Ce(e.projectId),n=yd(e.projectId);if(!n.deleted){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"Cannot delete project (not found or is default project)"});return}let o=!1,s;if(r?.workspaceDir){let i=me.join(J(),"workspaces"),a=me.resolve(r.workspaceDir);if(a.startsWith(me.resolve(i)+me.sep)){try{this.mediaPersistence?.releaseProjectDir?.(a)}catch{}for(let c=0;c<3;c++)try{_e.rmSync(a,{recursive:!0,force:!0}),o=!0;break}catch(l){if(c<2&&(l.code==="EBUSY"||l.code==="EPERM"||l.code==="ENOTEMPTY")){let d=Date.now();for(;Date.now()-d<200;);}else{s=l.message??String(l);break}}}else s="Project directory is outside the managed workspace root and was not deleted automatically."}this.sendNotification("project.deleted",{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,dirDeleted:o,dirDeleteError:s})}function sS(t){let e=K(),r=me.join(J(),"workspaces"),n=me.resolve(r)+me.sep,o=0,s=[];for(let a of e)if(a.type!=="default"){if(yd(a.id),o++,a.workspaceDir){let c=me.resolve(a.workspaceDir);try{this.mediaPersistence?.releaseProjectDir?.(c)}catch{}for(let l=0;l<3;l++)try{_e.existsSync(c)&&_e.rmSync(c,{recursive:!0,force:!0});break}catch(d){if(l<2&&(d.code==="EBUSY"||d.code==="EPERM"||d.code==="ENOTEMPTY")){let p=Date.now();for(;Date.now()-p<300;);}else{s.push(`${a.name}: ${d.message??d}`);break}}}this.sendNotification("project.deleted",{id:a.id})}if(_e.existsSync(r)){let a=K().find(d=>d.type==="default"),c=new Set;a?.workspaceDir&&c.add(me.resolve(a.workspaceDir));let l=d=>{try{let p=_e.readdirSync(d,{withFileTypes:!0});for(let u of p){if(!u.isDirectory())continue;let m=me.join(d,u.name);if(!c.has(me.resolve(m))){if(u.name==="groups"){l(m);try{_e.readdirSync(m).length===0&&_e.rmdirSync(m)}catch{}continue}try{_e.rmSync(m,{recursive:!0,force:!0})}catch(f){s.push(`orphan:${u.name}: ${f.message??f}`)}}}}catch{}};l(r)}let i=K().find(a=>a.type==="default");i&&(this.setActiveWorkdir(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,deletedCount:o,dirErrors:s.length?s:void 0})}function iS(t){let e=t.params;if(!e?.projectId||!e?.newName){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required params: projectId, newName"});return}let r=Sh(e.projectId,e.newName);if(!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"Cannot rename project (not found, is default, or name already taken)"});return}let n=me.join(J(),"workspaces"),o=me.resolve(r.workspaceDir);if(o.startsWith(me.resolve(n)+me.sep)){let s=me.join(n,e.newName);if(_e.existsSync(o)&&!_e.existsSync(s))try{_e.renameSync(o,s),wh(e.projectId,s),r.workspaceDir=s,this.getActiveProjectRoot()===o&&this.setActiveWorkdir(s)}catch{}}this.sendNotification("project.renamed",{id:r.id,name:r.name,workspaceDir:r.workspaceDir}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,project:r})}function aS(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: projectId"});return}let r=Th(e.projectId);if(!r.archived){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"Cannot archive project (not found or is default project)"});return}this.sendNotification("project.archived",{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})}function cS(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: projectId"});return}let r=Ph(e.projectId);if(!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"Cannot unarchive project (not found or not archived)"});return}this.sendNotification("project.unarchived",{id:r.id,name:r.name,workspaceDir:r.workspaceDir}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,project:r})}function lS(t){let e=t.params;if(!e?.groupId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: groupId"});return}let r=Ah(e.groupId);if(!r.archived){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,error:"No active project with this groupId"});return}this.sendNotification("project.deleted",{id:r.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,projectId:r.projectId})}function dS(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"projectId is required"});return}let r={};if("planStatus"in e){if(e.planStatus!==void 0&&!eS(e.planStatus)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:`Invalid planStatus: ${e.planStatus}`});return}r.planStatus=e.planStatus}"planAgents"in e&&(r.planAgents=e.planAgents),"planWinnerId"in e&&(r.planWinnerId=e.planWinnerId),"leaderSessionId"in e&&(r.leaderSessionId=e.leaderSessionId);let n=kh(e.projectId,r);t.id!==void 0&&this.sendResponse(t.id,{ok:n})}import{randomUUID as op}from"node:crypto";import*as Qe from"node:fs";import*as Jr from"node:path";var Nt=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[r,n]of this._modelUsage)e[r]={...n};return e}addUsage(e,r){this._totalInputTokens+=e.inputTokens,this._totalOutputTokens+=e.outputTokens;let n=this._modelUsage.get(r);n?(n.inputTokens+=e.inputTokens,n.outputTokens+=e.outputTokens,n.cacheRead+=e.cacheRead??0,n.cacheCreation+=e.cacheWrite??0):this._modelUsage.set(r,{inputTokens:e.inputTokens,outputTokens:e.outputTokens,cacheRead:e.cacheRead??0,cacheCreation:e.cacheWrite??0,mediaCalls:0,mediaDurationSeconds:0,mediaCharacters:0}),this.notifyListeners()}addMediaUsage(e,r,n){let o=this._modelUsage.get(e),s=o??{inputTokens:0,outputTokens:0,cacheRead:0,cacheCreation:0,mediaCalls:0,mediaDurationSeconds:0,mediaCharacters:0};switch(o||this._modelUsage.set(e,s),s.mediaCalls+=1,r){case"per_second":s.mediaDurationSeconds+=n;break;case"per_character":s.mediaCharacters+=n;break;case"per_token":s.outputTokens+=n;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[r,n]of Object.entries(e.modelUsage))this._modelUsage.set(r,{...n});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{}}};import*as uS from"node:fs";import*as np from"node:path";var Pr=class{getSessionsRoot(e){let r=Ce(e);if(!r)throw new Error(`Project not found: ${e}`);return I().getProjectSessionsRoot(r.workspaceDir)}getProjectWorkspaceDir(e){let r=Ce(e);if(!r)throw new Error(`Project not found: ${e}`);return r.workspaceDir}getSessionDir(e,r){return np.join(this.getSessionsRoot(e),r)}resolveWorkspaceDir(e,r){if(r)return this.getProjectWorkspaceDir(r);let n=K();for(let o of n){let s=I().getProjectSessionsRoot(o.workspaceDir),i=np.join(s,e);try{if(uS.existsSync(i))return o.workspaceDir}catch{}}return this.getActiveProjectWorkspaceDir()}getActiveProjectWorkspaceDir(){let e=oe();if(e)return e.workspaceDir;let r=K();if(r.length>0)return r[0].workspaceDir;throw new Error("No active project available")}getActiveProjectId(){let e=oe();if(e)return e.id;let r=K();if(r.length>0)return r[0].id;throw new Error("No active project available")}};import{randomUUID as pS}from"node:crypto";async function mS(t,e){let r=new Date(t.lastActiveAt).getTime();if(Date.now()-r<fm)return{split:!1,activeSessionId:t.sessionId};let s=pS(),i=new Date().toISOString();await qe(t.sessionId,{sealedAt:i},e);let a=t.taskSummary?`[\u4E0A\u4E00\u8F6E\u5BF9\u8BDD\u6458\u8981] ${t.taskSummary}`:void 0;return await qe(s,{sessionId:s,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:s,sealedSessionId:t.sessionId}}async function gS(t,e){if(t.type!=="group")return{split:!1,activeSessionId:t.sessionId};if(t.turnCount<hm)return{split:!1,activeSessionId:t.sessionId};let r=pS(),n=new Date().toISOString();await qe(t.sessionId,{sealedAt:n},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 qe(r,{sessionId:r,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:r,sealedSessionId:t.sessionId}}G();import*as fS from"node:fs";import*as hS from"node:path";var ta=class{constructor(e=new Pr,r=I()){this.locator=e;this.pathService=r}locator;pathService;getActiveProjectId(){return this.locator.getActiveProjectId()}getProjectWorkspaceDir(e){return this.locator.getProjectWorkspaceDir(e)}resolveWorkspaceDir(e,r){return this.locator.resolveWorkspaceDir(e,r)}async listThreads(e,r){let n=r??this.getActiveProjectId(),o=this.getProjectWorkspaceDir(n);return(await At(e,o)).map(i=>({id:i.sessionId,title:i.title,status:"active",turnCount:i.messageCount,createdAt:i.createdAt,lastActiveAt:i.lastActiveAt}))}resolveSessionWorkspaceDir(e,r,n){if(n)return this.resolveWorkspaceDir(r,n);let o=e.getActiveProjectRoot();if(o){let s=hS.join(this.pathService.getProjectSessionsRoot(o),zU(r));try{if(fS.existsSync(s))return o}catch{}}return this.resolveWorkspaceDir(r)}};function zU(t){return t.replace(/[^a-zA-Z0-9_-]/g,"_")}var VU=new Pr,lt=new ta(VU);function St(t,e="Unknown error"){return t instanceof Error?t.message:e}function Fn(t,e,r){return lt.resolveSessionWorkspaceDir(t,e,r)}function yS(t){let e=t.params,r=e?.id??op();this.log(`[thread.create] id=${r} title=${e?.title??"(none)"}`),e?.cwd&&typeof e.cwd=="string"&&this.setActiveWorkdir(e.cwd),this.currentSessionId=r,this.sessionState=new Nt(r),this.sessionTaskDomain=void 0,this.memoryPrefetchState=Pt(),this.enableIdleDream(),t.id!==void 0&&this.sendResponse(t.id,{id:r,title:e?.title,status:"active",createdAt:new Date().toISOString()})}async function bS(t){let e=t.params,r=e?.limit??20;try{let n=await lt.listThreads(r,e?.projectId);t.id!==void 0&&this.sendResponse(t.id,{threads:n})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to list threads: ${St(n)}`})}}async function vS(t){let e=t.params,r=e?.sessionId??op();try{let n=e?.projectId??lt.getActiveProjectId(),o=lt.getProjectWorkspaceDir(n);await qe(r,{sessionId:r,title:e?.title,type:e?.type,ownerId:e?.ownerId,groupKey:e?.groupKey,groupName:e?.groupName,groupPlatform:e?.groupPlatform,projectId:n},o),t.id!==void 0&&this.sendResponse(t.id,{sessionId:r,title:e?.title})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to create session: ${St(n)}`})}}async function kS(t){let e=t.params;if(t.id===void 0)return;let r=e?.platform??"desktop",n=e?.chatId,o=e?.chatType,s=e?.userId??"local";try{if(r==="desktop"&&n){let d=e?.projectId??lt.getActiveProjectId(),p=lt.getProjectWorkspaceDir(d),m=(await At(500,p)).find(f=>f.sessionId===n);if(m){this.sendResponse(t.id,{sessionId:n,title:m.title,type:m.type??"personal",ownerId:s,projectId:d});return}await qe(n,{sessionId:n,type:"personal",ownerId:s,projectId:d},p),this.sendResponse(t.id,{sessionId:n,type:"personal",ownerId:s,projectId:d});return}if(o==="group"&&n&&r){let d=`group:${r}:${n}`,p=K();for(let u of p){if(!u.workspaceDir)continue;let f=(await At(500,u.workspaceDir)).find(g=>g.groupKey===d&&!g.sealedAt);if(f){let g=tr(f.sessionId,u.workspaceDir);if(g){let h=await mS(g,u.workspaceDir);if(h.split){this.sendResponse(t.id,{sessionId:h.activeSessionId,title:void 0,type:"group",ownerId:s,groupKey:d,groupPlatform:r,groupName:e?.groupName,projectId:u.id,previousSessionId:h.sealedSessionId});return}}this.sendResponse(t.id,{sessionId:f.sessionId,title:f.title,type:"group",ownerId:s,groupKey:d,groupPlatform:r,groupName:e?.groupName,projectId:u.id});return}}}let i=op(),a=lt.getActiveProjectId(),c=lt.getProjectWorkspaceDir(a),l=o==="group"?`group:${r}:${n}`:void 0;await qe(i,{sessionId:i,type:o==="group"?"group":"personal",ownerId:s,groupKey:l,groupPlatform:o==="group"?r:void 0,groupName:e?.groupName,projectId:a},c),this.sendResponse(t.id,{sessionId:i,type:o==="group"?"group":"personal",ownerId:s,groupKey:l,groupPlatform:o==="group"?r:void 0,groupName:e?.groupName,projectId:a})}catch(i){this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to resolve session: ${St(i)}`})}}async function RS(t){let e=t.params,r=e?.limit??50;try{let n;if(e?.projectId){let s=Ce(e.projectId);if(!s){t.id!==void 0&&this.sendResponse(t.id,{sessions:[]});return}let i=s.workspaceDir;n=await At(r*2,i),n=n.filter(a=>a.projectId===e.projectId);for(let a of n)a.projectId=e.projectId}else{let s=K(),i=new Set,a=[];for(let c of s){if(!c.workspaceDir)continue;let l=await At(r,c.workspaceDir);for(let d of l)i.has(d.sessionId)||d.projectId&&(i.add(d.sessionId),a.push(d))}a.sort((c,l)=>c.lastActiveAt>l.lastActiveAt?-1:c.lastActiveAt<l.lastActiveAt?1:0),n=a}e?.archived===!0?n=n.filter(s=>s.archivedAt!=null):e?.archived===!1&&(n=n.filter(s=>s.archivedAt==null));let o=n.slice(0,r).map(s=>({sessionId:s.sessionId,title:s.title,type:s.type??"personal",lastActiveAt:s.lastActiveAt,pinnedAt:s.pinnedAt??null,archivedAt:s.archivedAt??null,sealedAt:s.sealedAt??null,projectId:s.projectId,previousSessionId:s.previousSessionId??null,carryoverSummary:s.carryoverSummary??null}));t.id!==void 0&&this.sendResponse(t.id,{sessions:o})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to list sessions: ${St(n)}`})}}async function SS(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let r=Fn(this,e.sessionId,e.projectId),o=(await At(500,r)).find(s=>s.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,pinnedAt:o.pinnedAt??null,archivedAt:o.archivedAt??null,projectId:o.projectId}:null})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to get session: ${St(r)}`})}}async function wS(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let r=Fn(this,e.sessionId,e.projectId),n=await Ir(e.sessionId,r);if(!n){t.id!==void 0&&this.sendResponse(t.id,{messages:[],total:0});return}let o=n.messages,s=e.limit&&e.limit>0?e.limit:o.length,i=o.slice(-s);t.id!==void 0&&this.sendResponse(t.id,{messages:i,total:o.length})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to get messages: ${St(r)}`})}}async function TS(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let r=Fn(this,e.sessionId,e.projectId),n=await qe(e.sessionId,{...e.title!==void 0?{title:e.title}:{},...e.pinnedAt!==void 0?{pinnedAt:e.pinnedAt}:{},...e.archivedAt!==void 0?{archivedAt:e.archivedAt}:{}},r);n&&this.sendNotification("session.info",{sessionId:e.sessionId,title:n.title,pinnedAt:n.pinnedAt??null,archivedAt:n.archivedAt??null,projectId:e.projectId||void 0}),t.id!==void 0&&this.sendResponse(t.id,{ok:n!==null})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to update session: ${St(r)}`})}}async function PS(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let r=Fn(this,e.sessionId,e.projectId);await Gc(e.sessionId,r),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to delete session: ${St(r)}`})}}async function AS(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: projectId"});return}try{let r=lt.getProjectWorkspaceDir(e.projectId),n=(await At(1e4,r)).filter(s=>s.projectId===e.projectId),o=0;for(let s of n)await Gc(s.sessionId,r),o++;t.id!==void 0&&this.sendResponse(t.id,{ok:!0,deletedCount:o})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to delete all sessions: ${St(r)}`})}}async function xS(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let r=Fn(this,e.sessionId,e.projectId);await qe(e.sessionId,{archivedAt:new Date().toISOString()},r),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to archive session: ${St(r)}`})}}async function CS(t){let e=t.params,r=e?.sessionId;if(!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"sessionId is required"});return}try{let n=Fn(this,r,e?.projectId),o=await Ir(r,n);if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:`Session not found: ${r}`});return}o.messages&&o.messages.length>0&&this.sessionHistory.saveResumedSession(r,o.messages),t.id!==void 0&&this.sendResponse(t.id,{metadata:o.metadata,messages:o.messages})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to resume session: ${St(n)}`})}}function IS(t){let e=this.currentSessionId||"default",r=this.sessionState?.createSnapshot(),n,o=this.getActiveProjectRoot();o&&(n=Jr.join(ys(o),e));let s={sessionId:e,model:this.currentModel||void 0,cwd:process.cwd(),paths:{sessionDir:n,agentHome:J(),settings:Be()},usage:r?{turnCount:r.turnCount,inputTokens:r.totalInputTokens,outputTokens:r.totalOutputTokens}:void 0};t.id!==void 0&&this.sendResponse(t.id,s)}function ES(t){let e=t.params,r=null;if(e?.projectId)r=Ce(e.projectId);else if(e?.projectName){let s=K(),i=e.projectName.toLowerCase();if(r=s.find(a=>a.name.toLowerCase()===i)??null,r||(r=s.find(a=>a.name.toLowerCase().includes(i))??null),!r){let a=s.map(c=>c.name).slice(0,10);t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.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:y.INVALID_PARAMS,message:"Missing required param: projectId or projectName"});return}if(!r||r.status!=="active"){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Project not found or archived: ${e.projectId??e.projectName}`});return}let n=e.workspaceDir??r.workspaceDir;if(!Qe.existsSync(n)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Workspace directory does not exist: ${n}`});return}let o=Mt(r.id);if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.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 MS(t){let e=oe(),r=K();t.id!==void 0&&this.sendResponse(t.id,{sessionId:this.currentSessionId,activeProject:e,projects:r})}async function _S(t){let e=t.params,r=e?.sessionId;if(!r){t.id!==void 0&&this.sendResponse(t.id,{ok:!1});return}let n=K();for(let o of n)try{let s=lt.getProjectWorkspaceDir(o.id),i=await tr(r,s);if(i&&i.projectId===o.id){Mt(o.id),this.setActiveWorkdir(s),this.log(`[session.focus] switched to project ${o.id} for session ${r}`),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,projectId:o.id});return}}catch{}if(e?.projectName){let o=n.find(s=>s.name===e.projectName);if(o){let s=lt.getProjectWorkspaceDir(o.id);this.getActiveProjectRoot()!==s&&(this.setActiveWorkdir(s),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 DS(t){let e=t.params,{sessionId:r,fromProjectId:n,toProjectId:o}=e??{};if(!r||!n||!o){t.id!==void 0&&this.sendError(t.id,y.INVALID_PARAMS,"sessionId, fromProjectId, and toProjectId are required");return}if(n===o){t.id!==void 0&&this.sendResponse(t.id,{ok:!0});return}let s=Ce(n),i=Ce(o);if(!s||!i){t.id!==void 0&&this.sendError(t.id,y.INVALID_PARAMS,"Source or target project not found");return}let a=Jr.join(lt.getProjectWorkspaceDir(n),".qlogicagent","sessions",r),c=Jr.join(lt.getProjectWorkspaceDir(o),".qlogicagent","sessions",r);if(!Qe.existsSync(a)){t.id!==void 0&&this.sendError(t.id,y.INVALID_PARAMS,`Session ${r} not found in project ${n}`);return}try{Qe.mkdirSync(Jr.dirname(c),{recursive:!0}),Qe.cpSync(a,c,{recursive:!0});let l=Jr.join(c,"metadata.json");if(Qe.existsSync(l)){let d=JSON.parse(Qe.readFileSync(l,"utf-8"));d.projectId=o,Qe.writeFileSync(l,JSON.stringify(d,null,2))}Qe.rmSync(a,{recursive:!0,force:!0}),this.sendNotification("session-update",{sessionId:r,projectId:o}),this.log(`[session.moveToProject] moved ${r}: ${n} \u2192 ${o}`),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,projectId:o})}catch(l){let d=St(l);this.log(`[session.moveToProject] error: ${d}`),t.id!==void 0&&this.sendError(t.id,y.INTERNAL_ERROR,`Move failed: ${d}`)}}je();function YU(t){return t.length<=8?"****":`${t.slice(0,3)}***${t.slice(-4)}`}function Pe(t,e,r,n=y.INTERNAL_ERROR){if(e.id!==void 0){if(typeof t.sendError=="function"){t.sendError(e.id,n,r);return}t.sendResponse(e.id,void 0,{code:n,message:r})}}function ip(t,e){Pe(t,e,ws)}function XU(t){let e={};for(let r of t)for(let n of r.purposes)e[n]??=[],e[n].push(r);return e}async function JU(){let t=N(),e=await no(t);return t.save(),e}async function NS(t){try{return await JU(),!0}catch(e){if(t)throw e;return!1}}function ap(t=N()){try{return Bm()}catch{return t.getKnownProviderDef(Q)?.baseUrl??"https://www.qlogicagent.com"}}function cp(t){return t.id===Q?Q:t.group?.trim()||t.id}function QU(t){return t.id===cp(t)}function LS(t){let e=cp(t);return Xc({...t,id:e})}function ZU(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]??Xc(t)}function eF(t){return t.authType==="none"?!1:t.apiKeyEnvVars===void 0||t.apiKeyEnvVars.length>0}function tF(t){return{id:t.id,displayName:ZU(t),baseUrl:dn(t)??"",modelCount:t.models?.length??0}}function rF(t){let e=new Map;for(let r of t){if(!eF(r))continue;let n=cp(r);if(n===Q)continue;let o=r.models?.length??0,s=tF(r),i=e.get(n);if(!i){e.set(n,{id:n,displayName:LS(r),baseUrl:dn(r)??"",modelCount:o,variants:[s]});continue}i.modelCount+=o,i.variants??=[],i.variants.some(a=>a.id===s.id)||i.variants.push(s),QU(r)&&(i.displayName=LS(r),i.baseUrl=dn(r)??i.baseUrl)}return Array.from(e.values()).map(r=>({...r,variants:r.variants&&r.variants.length>1?r.variants:void 0}))}async function OS(t){let e=N(),r=e.getKeyForProvider(Q);if(!r){if(t)throw new Error("LLMRouter API Key is required to fetch available models.");return!1}let n=e.getProviderStatus(Q)?.baseUrl??ap(e);try{if((await Qc(e,{baseUrl:n,apiKey:r})).length===0){if(t)throw new Error("LLMRouter did not return any available models for this API Key.");return!1}return e.save(),!0}catch(o){if(t)throw o;return!1}}async function jS(t=!1){let e=N();if(!!e.getProviderStatus(Q)?.keys.length)return await OS(!1)?!0:NS(t);let o=e.getAllProviderStatus().filter(s=>s.keys.length>0).map(s=>s.providerId).some(s=>s!=="deepseek"&&s!==Q);return!t&&!o?!1:NS(t)}function nF(t){return t.defaultModel??t.models?.find(e=>!!e.id)?.id}function oF(t){return[...new Set(t)]}function sF(t){let e=t.replace(/\/+$/,"");return oF([`${e}/models`,/\/v\d+$/.test(e)?`${e}/models`:`${e}/v1/models`])}function iF(t){return t===404||t===405||t===410||t===501}async function aF(t){let e=N().getKnownProviderDef(t);if(e)return e;let r=await Jc(t).catch(()=>null);if(r)return{id:r.id,transport:r.transport,baseUrl:dn(r),authType:r.authType,models:r.models}}function sp(t){return{accept:"application/json",Authorization:`Bearer ${t}`}}function cF(t,e,r,n){if(t===Q)return[{method:"GET",url:Vc(r),headers:sp(e)}];let o=r.replace(/\/+$/,""),s=n?.transport,i=nF(n??{id:t}),a=[];if(s==="anthropic-messages")return/\/anthropic$/.test(o)&&a.push({method:"GET",url:`${o.replace(/\/anthropic$/,"")}/models`,headers:sp(e)}),i&&a.push({method:"POST",url:`${o}/v1/messages`,headers:{"Content-Type":"application/json","x-api-key":e,"anthropic-version":"2023-06-01"},body:{model:i,messages:[{role:"user",content:"ping"}],max_tokens:1,stream:!1}}),a;if(s==="gemini-generatecontent")return i?[{method:"POST",url:`${o}/models/${encodeURIComponent(i)}:generateContent`,headers:{"Content-Type":"application/json","x-goog-api-key":e},body:{contents:[{role:"user",parts:[{text:"ping"}]}],generationConfig:{maxOutputTokens:1}}}]:a;if(s==="volcengine-responses")return i?[{method:"POST",url:`${o.replace(/\/v\d+$/,"")}/v3/responses`,headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:{model:i,input:[{role:"user",content:[{type:"input_text",text:"ping"}]}],max_output_tokens:1,stream:!1,store:!1}}]:a;for(let c of sF(o))a.push({method:"GET",url:c,headers:sp(e)});return a}async function lF(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 r=await e.text().catch(()=>"");return{valid:!1,status:e.status,error:r.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 $S(t,e,r){let n=await aF(t),o=cF(t,e,r,n);if(o.length===0)return{valid:!1,status:0,error:`No validation probe is available for provider "${t}".`};let s;for(let i of o){let a=await lF(i);if(a.valid)return a;if(iF(a.status)){s=a;continue}return a}return s??{valid:!1,status:0,error:`No validation probe succeeded for provider "${t}".`}}async function dF(t,e,r){let n=await $S(t,e,r);if(!n.valid){let o=n.error?`: ${n.error}`:"";throw new Error(`API Key validation failed (${n.status})${o}`)}}async function US(t){try{let e=N(),r=["deepseek",Q].map(s=>e.getKnownProviderDef(s)).filter(s=>!!s).map(s=>({id:s.id,displayName:s.name,baseUrl:s.baseUrl,modelCount:s.models?.length??0})),n=await Yc().catch(()=>[]),o=rF(n);o.unshift({id:Q,displayName:zc,baseUrl:ap(e),modelCount:n.reduce((s,i)=>s+(i.models?.length??0),0)});for(let s of r.reverse()){let i=o.findIndex(a=>a.id===s.id);if(i>=0){s.id!==Q&&o.splice(i,1,s);continue}o.unshift(s)}t.id!==void 0&&this.sendResponse(t.id,{providers:o})}catch(e){Pe(this,t,e instanceof Error?e.message:String(e))}}async function FS(t){let e=t.params;if(!e?.providerId||!e?.key){Pe(this,t,"Required: providerId (string), key (string)",y.INVALID_PARAMS);return}let{providerId:r,key:n,label:o}=e,s=N(),i,a=!1;try{let c=await JS(r);if(!c){Pe(this,t,`Unknown provider: ${r}`,y.INVALID_PARAMS);return}let l=s.getProviderStatus(r);if(l?.keys.some(d=>d.key===n)){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,error:"\u8BE5 Key \u5DF2\u5B58\u5728\uFF0C\u65E0\u9700\u91CD\u590D\u6DFB\u52A0"});return}if(a=!l,s.addProvider(r,{baseUrl:c}),i=s.addKey(r,n,{label:o}),r===Q){if((await Qc(s,{baseUrl:c,apiKey:n})).length===0)throw new Error("LLMRouter did not return any available models for this API Key.")}else await dF(r,n,c);for(let d of ro)if(!s.getBinding(d)){let p=s.listModels({purpose:d,provider:r,enabledOnly:!0});p.length===0&&(p=s.listModels({purpose:d,provider:r}),p[0]&&s.enableModel(p[0].id)),p.length>0&&s.setBinding(d,p[0].id)}s.setKeyHealth(i,"healthy"),s.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,keyId:i,providerId:r})}catch(c){i&&(s.removeKey(i),a&&s.removeProvider(r));let l=c instanceof Error?c.message:ws;Pe(this,t,l)}}function HS(t){let e=t.params;if(!e?.keyId){Pe(this,t,"Required: keyId (string)",y.INVALID_PARAMS);return}let r=N();if(!r.removeKey(e.keyId)){Pe(this,t,"API Key not found",y.INVALID_PARAMS);return}r.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}function BS(t){let e=t.params;if(!e?.keyId){Pe(this,t,"Required: keyId (string)",y.INVALID_PARAMS);return}let r=N().getKeyById(e.keyId);if(!r){Pe(this,t,"API Key not found",y.INVALID_PARAMS);return}t.id!==void 0&&this.sendResponse(t.id,{key:r})}function qS(t){let e=t.params;if(!e?.keyId||typeof e.enabled!="boolean"){Pe(this,t,"Required: keyId (string), enabled (boolean)",y.INVALID_PARAMS);return}let r=N();if(!r.updateKey(e.keyId,{enabled:e.enabled})){Pe(this,t,"API Key not found",y.INVALID_PARAMS);return}r.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}function WS(t){let e=t.params;if(!e?.modelId||typeof e.enabled!="boolean"){Pe(this,t,"Required: modelId (string), enabled (boolean)",y.INVALID_PARAMS);return}let r=N();e.enabled?r.enableModel(e.modelId):r.disableModel(e.modelId),r.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}async function GS(t){let e=t.params;try{await jS(!1);let r=N(),n=new Set(r.getAllProviderStatus().filter(s=>s.keys.length>0).map(s=>s.providerId)),o=r.listModels({purpose:e?.purpose,provider:e?.provider}).filter(s=>r.hasConfiguredKeyForProviderVariant(s.provider));t.id!==void 0&&this.sendResponse(t.id,{models:o,grouped:XU(o),configuredProviderIds:[...n]})}catch{ip(this,t)}}function KS(t){let e=t.params;if(!e?.purpose||!e?.modelId){Pe(this,t,"Required: purpose (string), modelId (string)",y.INVALID_PARAMS);return}try{let r=N();r.setBinding(e.purpose,e.modelId),r.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(r){Pe(this,t,r instanceof Error?r.message:String(r),y.INVALID_PARAMS)}}function zS(t){let e=t.params;if(!e?.purpose){Pe(this,t,"Required: purpose (string)",y.INVALID_PARAMS);return}let r=N(),n=r.getBinding(e.purpose);t.id!==void 0&&this.sendResponse(t.id,{model:n?{id:n.id,provider:n.provider,model:n.model,displayName:n.displayName,purposes:n.purposes,enabled:n.enabled}:null,available:r.isAvailable(e.purpose)})}async function VS(t){try{await jS(!1);let e=N(),r=e.getAllProviderStatus().map(s=>({providerId:s.providerId,displayName:s.providerId===Q?zc:s.providerId,baseUrl:s.baseUrl,keyCount:s.keys.length,healthyKeys:s.keys.filter(i=>i.healthStatus==="healthy"&&i.enabled).length,totalKeys:s.keys.length,keys:s.keys.map(i=>({id:i.id,label:i.label,maskedKey:YU(i.key),enabled:i.enabled,health:i.healthStatus}))})),n=e.getAllBindings(),o={};for(let s of ro){let i=n[s];o[s]={bound:!!i,modelId:i?.id,modelName:i?.displayName,available:e.isAvailable(s)}}t.id!==void 0&&this.sendResponse(t.id,{providers:r,purposes:o})}catch{ip(this,t)}}async function YS(t){try{let e=N();e.load(),await OS(!1)||await no(e),e.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,catalogRefreshed:!0})}catch{ip(this,t)}}async function XS(t){let e=t.params;if(!e?.providerId||!e?.apiKey){Pe(this,t,"providerId and apiKey required",y.INVALID_PARAMS);return}try{let r=e.baseUrl||await JS(e.providerId);if(!r){Pe(this,t,`Unknown provider: ${e.providerId}`,y.INVALID_PARAMS);return}let n=await $S(e.providerId,e.apiKey,r);t.id!==void 0&&this.sendResponse(t.id,n)}catch(r){let n=r instanceof Error?r.message:String(r);t.id!==void 0&&this.sendResponse(t.id,{valid:!1,status:0,error:n})}}async function JS(t){if(t===Q)return ap();let e=N().getKnownProviderDef(t);if(e?.baseUrl)return e.baseUrl;let r=await Jc(t);return r?dn(r):void 0}G();import*as ce from"node:fs";import*as Ue from"node:path";import{join as uF}from"node:path";import{readFileSync as pF,writeFileSync as mF,mkdirSync as gF}from"node:fs";var Qr=null,lp=!1;function QS(t){return uF(t,"skill-stats.json")}function dp(t){if(Qr)return Qr;try{Qr=JSON.parse(pF(QS(t),"utf8"))}catch{Qr={}}return Qr}function fF(t){if(!(!lp||!Qr))try{gF(t,{recursive:!0}),mF(QS(t),JSON.stringify(Qr,null,2),"utf8"),lp=!1}catch{}}function up(t,e,r){let n=dp(t);n[e]||(n[e]={invokeCount:0,activeCount:0,positiveCount:0,negativeCount:0}),n[e].invokeCount++,n[e].lastUsedAt=new Date().toISOString(),r?n[e].positiveCount++:n[e].negativeCount++,n[e].invokeCount>0&&(n[e].successRate=(n[e].invokeCount-n[e].negativeCount)/n[e].invokeCount),lp=!0,fF(t)}function ZS(t,e){return dp(t)[e]}function ew(t){return dp(t)}import*as Yt from"node:fs";import*as ra from"node:path";function hF(t){try{let e=Yt.readFileSync(t,"utf8"),r=e.match(/^---\n[\s\S]*?^version:\s*(\S+)/m),n=e.match(/^---\n[\s\S]*?^description:\s*(.+)/m);return{version:r?.[1],description:n?.[1]?.trim()}}catch{return{}}}function na(t){let e=I(),r=[],n=t?e.getProjectSkillsDir(t):void 0,o=e.getUserSkillsDir();return n&&tw(r,n,"project"),tw(r,o,"global"),r}function tw(t,e,r){if(Yt.existsSync(e))for(let n of Yt.readdirSync(e)){let o=ra.join(e,n);try{if(!Yt.statSync(o).isDirectory())continue}catch{continue}let s=ra.join(o,"SKILL.md"),i=ra.join(o,"SKILL.md.disabled"),a=Yt.existsSync(s)?s:null;if(!a&&!Yt.existsSync(i))continue;let c=a?hF(a):{};t.push({id:`${r}:${n}`,name:n,path:o,active:!!a,scope:r,category:"automation",displayName:yF(n),displayDescription:bF(n,c.description),fallbackName:n,fallbackDescription:c.description??"",systemGenerated:vF(n),version:c.version,description:c.description})}}function yF(t){return{key:`capability.skill.${t}.name`,fallback:t}}function bF(t,e){return{key:`capability.skill.${t}.description`,fallback:e??""}}function vF(t){return t.startsWith("auto-skill-")||t.startsWith("test-skill-")}function kF(t){return t==="active"||t==="stale"||t==="archived"}function rw(t){let r=t.params?.projectId,n=this.getActiveProjectRoot();if(r&&this.projectLocator){let s=this.projectLocator.resolveProjectRoot(r);s&&(n=s)}let o=na(n);t.id!==void 0&&this.sendResponse(t.id,{skills:o})}function nw(t){let r=t.params?.name;if(!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: name"});return}let n=this.getActiveProjectRoot(),o=n?gr(n):void 0;if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"No active project workspace"});return}let s=Ue.join(o,r),i=Ue.join(s,"SKILL.md.disabled"),a=Ue.join(s,"SKILL.md");if(ce.existsSync(a)){t.id!==void 0&&this.sendResponse(t.id,{ok:!0,already:!0});return}if(ce.existsSync(i))try{ce.renameSync(i,a);let c=q(),l=ue(c),d=_t(l,r);d.state!=="active"&&(d.state="active",d.staleAt=void 0,d.archivedAt=void 0),ve(c,l),t.id!==void 0&&this.sendResponse(t.id,{ok:!0}),this.sendNotification("skills.updated",{action:"activate",name:r})}catch(c){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to activate skill: ${c instanceof Error?c.message:c}`})}else t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Skill "${r}" not found`})}function ow(t){let r=t.params?.name;if(!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: name"});return}let n=this.getActiveProjectRoot(),o=n?gr(n):void 0;if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"No active project workspace"});return}let s=Ue.join(o,r),i=Ue.join(s,"SKILL.md"),a=Ue.join(s,"SKILL.md.disabled");if(!ce.existsSync(i)){t.id!==void 0&&this.sendResponse(t.id,{ok:!0,already:!0});return}try{ce.renameSync(i,a),t.id!==void 0&&this.sendResponse(t.id,{ok:!0}),this.sendNotification("skills.updated",{action:"deactivate",name:r})}catch(c){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to deactivate skill: ${c instanceof Error?c.message:c}`})}}function sw(t){let e=t.params,r=e?.name;if(!r||/[\/\\]|\.\./.test(r)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing or invalid skill name"});return}let n=q(),o=ue(n);if(o.records[r]?.pinned){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:`Skill "${r}" is pinned. Unpin it first.`});return}let s=e?.scope??"project",i;if(s==="global")i=Ue.join(mr(),r);else{let a=this.getActiveProjectRoot(),c=a?gr(a):void 0;if(!c){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"No active project workspace"});return}i=Ue.join(c,r)}if(!ce.existsSync(i)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Skill "${r}" not found in ${s} scope`});return}try{ce.rmSync(i,{recursive:!0,force:!0}),vt(),oi(o,r),ve(n,o),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,deleted:r,scope:s}),this.sendNotification("skills.updated",{action:"delete",name:r})}catch(a){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to delete skill: ${a instanceof Error?a.message:a}`})}}function iw(t){let e=t.params,r=e?.name;if(!r||/[\/\\]|\.\./.test(r)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing or invalid skill name"});return}let n=this.getActiveProjectRoot(),o=n?gr(n):void 0;if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"No active project workspace"});return}let s=Ue.join(o,r),i=Ue.join(s,"SKILL.md");if(!ce.existsSync(i)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Skill "${r}" not found in project scope`});return}let a=mr(),c=Ue.join(a,r);try{ce.mkdirSync(c,{recursive:!0});let l=ce.readdirSync(s);for(let d of l){let p=ce.readFileSync(Ue.join(s,d));ce.writeFileSync(Ue.join(c,d),p)}e?.keepLocal||ce.rmSync(s,{recursive:!0,force:!0}),vt(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,promoted:r,globalPath:c,removedFromProject:!e?.keepLocal})}catch(l){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to promote skill: ${l instanceof Error?l.message:l}`})}}function aw(t){let e=t.params,r=q();if(e?.name){let n=ZS(r,e.name);t.id!==void 0&&this.sendResponse(t.id,{name:e.name,stats:n??null})}else{let n=ew(r);t.id!==void 0&&this.sendResponse(t.id,{stats:n})}}function cw(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 r=q(),n=ue(r);_t(n,e.name),Nh(n,e.name),ve(r,n),t.id!==void 0&&this.sendResponse(t.id,{name:e.name,pinned:!0})}function lw(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 r=q(),n=ue(r);Lh(n,e.name),ve(r,n),t.id!==void 0&&this.sendResponse(t.id,{name:e.name,pinned:!1})}function dw(t){let e=q(),r=this.getActiveProjectRoot(),n=r?Ue.join(r,".qlogicagent","skills"):mr(),o=Oh(e,n);o.transitioned.length>0&&vt(),t.id!==void 0&&this.sendResponse(t.id,o)}function uw(t){let e=t.params,r=q(),n=ue(r);if(e?.name){let o=n.records[e.name]??null;t.id!==void 0&&this.sendResponse(t.id,{record:o})}else if(e?.state){if(!kF(e.state)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Invalid skill lifecycle state"});return}let o=jh(n,e.state);t.id!==void 0&&this.sendResponse(t.id,{records:o})}else t.id!==void 0&&this.sendResponse(t.id,{records:Object.values(n.records)})}import*as hw from"node:path";import{randomUUID as AF}from"node:crypto";import{join as pp}from"node:path";import{mkdir as RF,readdir as SF}from"node:fs/promises";function wF(t){return t?.pathService??I()}function TF(t,e){return t??e.getActiveProjectRoot()}function pw(t,e){let r=wF(e);return pp(r.getProjectAgentDir(TF(t,r)),"solos")}function mp(t,e,r){return pp(pw(e,r),t)}function mw(t,e,r){return pp(mp(t,e,r),"solo-state.json")}async function gw(t,e,r){let n=mp(t.soloId,e,r);await RF(n,{recursive:!0}),await wr(mw(t.soloId,e,r),t)}async function PF(t,e,r){return ar(mw(t,e,r))}async function fw(t,e){let r=pw(t,e),n;try{n=await SF(r)}catch{return[]}let o=[];for(let s of n){let i=await PF(s,t,e);i&&o.push(i)}return o}async function gp(t,e,r){let{rm:n}=await import("node:fs/promises"),o=mp(t,e,r);try{return await n(o,{recursive:!0,force:!0}),!0}catch{return!1}}var oa=class{constructor(e,r,n,o={}){this.processManager=e;this.acpDetector=r;this.configStore=n;this.callbacks=o}processManager;acpDetector;configStore;callbacks;sessions=new Map;persistSession(e){let r={soloId:e.soloId,state:e.state,task:e.task,cwd:e.cwd,gitRoot:e.gitRoot,agents:e.agents.map(n=>({agentId:n.agentId,memberId:n.memberId,worktreePath:n.worktreePath,worktreeBranch:n.worktreeBranch,state:n.state,resultText:n.resultText,diff:n.diff,usage:n.usage,error:n.error,turns:n.turns})),evaluation:e.evaluation,createdAt:e.createdAt};gw(r,e.cwd).catch(()=>{})}async restoreFromDisk(e){let r=await fw(e);for(let n of r)this.sessions.has(n.soloId)||this.sessions.set(n.soloId,{soloId:n.soloId,state:n.state,task:n.task,cwd:n.cwd,gitRoot:n.gitRoot,agents:n.agents.map(o=>({...o,turns:o.turns??[]})),evaluation:n.evaluation,createdAt:n.createdAt});return r.length}async deleteSolo(e){return this.sessions.delete(e),gp(e)}async start(e){let{task:r,agents:n,cwd:o,sharedConfig:s}=e;if(n.length<2)throw new Error("Solo Mode requires at least 2 agents");let i=await qo(o);if(!i)throw new Error("Solo Mode requires a git repository");let a=r;if(s){let u=[];s.rules?.length&&u.push(`<rules>
479
+ `)})}return this.workflowController}function lr(t){return t.params??{}}function dr(t,e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:e})}function BU(t){return{id:t.id,name:t.name,active:t.active,concurrency:t.concurrency,rev:t.rev,createdAt:t.createdAt,updatedAt:t.updatedAt,...t.trigger!==void 0?{trigger:t.trigger}:{},def:t.def}}function ep(t,e){this.sendNotification(t,{workflow:BU(e)})}function tp(t,e){if(t.status==="failed"){this.sendNotification("workflow.runFailed",{workflowId:t.workflowId,triggerType:e,error:"Workflow run failed",outcome:t});return}this.sendNotification("workflow.runCompleted",{workflowId:t.workflowId,status:t.status,triggerType:e,outcome:t})}function qU(t){return t instanceof Error?t.message:String(t)}async function WR(t){let e=lr(t);if(!e.def)return dr.call(this,t,"workflow.create requires `def`");let r=Vt.call(this),n=String(e.id??`wf_${qR().slice(0,8)}`),o=await r.create({id:n,name:String(e.name??n),def:e.def,concurrency:e.concurrency,active:e.active===!0});o.active&&await this.workflowScheduler?.refresh(o.id),ep.call(this,"workflow.created",o),t.id!==void 0&&this.sendResponse(t.id,o)}async function GR(t){let e=lr(t);if(!e.id)return dr.call(this,t,"workflow.get requires `id`");let n=await Vt.call(this).get(String(e.id));t.id!==void 0&&this.sendResponse(t.id,n)}async function KR(t){let e=lr(t);if(!e.id)return dr.call(this,t,"workflow.describe requires `id`");let n=await Vt.call(this).describe(String(e.id));t.id!==void 0&&this.sendResponse(t.id,{rendered:n})}async function zR(t){let e=lr(t);if(!e.id||!e.patch)return dr.call(this,t,"workflow.patch requires `id` and `patch`");let r=Vt.call(this),n={patch:e.patch,baseRev:e.baseRev,scope:e.scope},o=await r.patch(String(e.id),n);await this.workflowScheduler?.refresh(String(e.id)),o.ok&&ep.call(this,"workflow.updated",await r.get(String(e.id))),t.id!==void 0&&this.sendResponse(t.id,o)}async function VR(t){let e=lr(t);if(!e.id)return dr.call(this,t,"workflow.run requires `id`");let r=Vt.call(this),n=e.trigger??{type:"manual"},o=String(e.id);this.sendNotification("workflow.runStarted",{workflowId:o,triggerType:n.type});let s;try{s=await r.run(o,n),tp.call(this,s,n.type)}catch(i){throw this.sendNotification("workflow.runFailed",{workflowId:o,triggerType:n.type,error:qU(i)}),i}t.id!==void 0&&this.sendResponse(t.id,s)}async function YR(t){let e=lr(t);if(!e.id||typeof e.active!="boolean")return dr.call(this,t,"workflow.setActive requires `id` and boolean `active`");let n=await Vt.call(this).setActive(String(e.id),e.active);await this.workflowScheduler?.refresh(n.id),ep.call(this,"workflow.updated",n),t.id!==void 0&&this.sendResponse(t.id,n)}async function XR(t){Vt.call(this);let r=await this.workflowStore.list();t.id!==void 0&&this.sendResponse(t.id,{workflows:r})}async function JR(t){let e=lr(t);if(!e.id)return dr.call(this,t,"workflow.delete requires `id`");Vt.call(this),await this.workflowStore.delete(String(e.id)),await this.workflowScheduler?.refresh(String(e.id)),this.sendNotification("workflow.deleted",{workflowId:String(e.id)}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}async function QR(t){let e=lr(t);if(!e.channel||typeof e.text!="string")return dr.call(this,t,"workflow.onImMessage requires `channel` and string `text`");Vt.call(this);let r=await this.workflowScheduler.onImMessage(String(e.channel),e.text,e.payload);for(let n of r)tp.call(this,n,"im-message");t.id!==void 0&&this.sendResponse(t.id,{outcomes:r})}async function ZR(t){let e=lr(t);if(!e.path)return dr.call(this,t,"workflow.onWebhook requires `path`");Vt.call(this);let r=await this.workflowScheduler.onWebhook(String(e.path),e.payload);for(let n of r)tp.call(this,n,"webhook");t.id!==void 0&&this.sendResponse(t.id,{outcomes:r})}import*as _e from"node:fs";import*as me from"node:path";G();import*as Xr from"node:fs";import*as rp from"node:path";G();import*as Me from"node:fs";import*as Wo from"node:path";function ea(t){let e=J(),r=Oe(t);Me.existsSync(r)||Me.mkdirSync(r,{recursive:!0});let n=Wo.join(e,"INSTRUCTIONS.md"),o=Wo.join(r,"INSTRUCTIONS.md");if(Me.existsSync(n)&&!Me.existsSync(o))try{Me.copyFileSync(n,o)}catch{}let s=Tm(),i=cn(t);if(Me.existsSync(s)&&!Me.existsSync(i))try{Me.mkdirSync(i,{recursive:!0});for(let a of Me.readdirSync(s)){if(!a.endsWith(".md"))continue;let c=Wo.join(s,a),l=Wo.join(i,a);Me.statSync(c).isFile()&&Me.copyFileSync(c,l)}}catch{}}var WU=["creating","running","completed","cancelled"];function eS(t){return typeof t=="string"&&WU.includes(t)}function tS(t,e){let r=I(),n=e.workspaceDir||rp.join(r.getUserAgentHome(),"workspaces",e.name);if(e.groupId){let l=ei(e.groupId);if(l)return{project:l,isAgentTeamProject:l.type==="solo"||l.type==="product",deduplicated:!0}}let s=K().find(l=>l.name===e.name);GU(n);let i=Zs({name:e.name,workspaceDir:n,type:e.type??"personal",groupId:e.groupId,skipAutoSwitch:e.type==="solo"||e.type==="product"}),a=i.type==="solo"||i.type==="product";a||(Mt(i.id),t.setActiveWorkdir(i.workspaceDir)),ea(i.workspaceDir);let c=t.projectMemoryStoreFactory.create(i.workspaceDir);return c.ensureInitialized(),a||(t.memdir=c,t.mediaPersistence.setProjectDir(i.workspaceDir)),KU(i),{project:i,nameDuplicate:s,isAgentTeamProject:a}}function GU(t){Xr.existsSync(t)||Xr.mkdirSync(t,{recursive:!0})}function KU(t){let e=I();if(t.type!=="solo"&&t.type!=="product")return;let r=rp.join(e.getProjectAgentDir(t.workspaceDir),t.type==="solo"?"solo-state.json":"product-state.json");if(Xr.existsSync(r))return;let n=t.type==="solo"?{agents:[],status:"idle",createdAt:new Date().toISOString()}:{tasks:[],instances:[],status:"idle",createdAt:new Date().toISOString()};Xr.writeFileSync(r,JSON.stringify(n,null,2))}function rS(t){let e=t.params;if(!e?.name){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: name"});return}let r;try{r=tS(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:y.INTERNAL_ERROR,message:a instanceof Error?a.message:`Cannot create workspace directory: ${e.workspaceDir??e.name}`});return}let{project:n,nameDuplicate:o,isAgentTeamProject:s,deduplicated:i}=r;if(i){t.id!==void 0&&this.sendResponse(t.id,{ok:!0,project:n,deduplicated:!0});return}if(this.sendNotification("project.created",{id:n.id,name:n.name,workspaceDir:n.workspaceDir,type:n.type}),s||this.sendNotification("project.switched",{id:n.id,name:n.name,workspaceDir:n.workspaceDir}),t.id!==void 0){let a={ok:!0,project:n};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 nS(t){let e=K();t.id!==void 0&&this.sendResponse(t.id,{projects:e})}function oS(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: projectId"});return}let r=Ce(e.projectId),n=yd(e.projectId);if(!n.deleted){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"Cannot delete project (not found or is default project)"});return}let o=!1,s;if(r?.workspaceDir){let i=me.join(J(),"workspaces"),a=me.resolve(r.workspaceDir);if(a.startsWith(me.resolve(i)+me.sep)){try{this.mediaPersistence?.releaseProjectDir?.(a)}catch{}for(let c=0;c<3;c++)try{_e.rmSync(a,{recursive:!0,force:!0}),o=!0;break}catch(l){if(c<2&&(l.code==="EBUSY"||l.code==="EPERM"||l.code==="ENOTEMPTY")){let d=Date.now();for(;Date.now()-d<200;);}else{s=l.message??String(l);break}}}else s="Project directory is outside the managed workspace root and was not deleted automatically."}this.sendNotification("project.deleted",{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,dirDeleted:o,dirDeleteError:s})}function sS(t){let e=K(),r=me.join(J(),"workspaces"),n=me.resolve(r)+me.sep,o=0,s=[];for(let a of e)if(a.type!=="default"){if(yd(a.id),o++,a.workspaceDir){let c=me.resolve(a.workspaceDir);try{this.mediaPersistence?.releaseProjectDir?.(c)}catch{}for(let l=0;l<3;l++)try{_e.existsSync(c)&&_e.rmSync(c,{recursive:!0,force:!0});break}catch(d){if(l<2&&(d.code==="EBUSY"||d.code==="EPERM"||d.code==="ENOTEMPTY")){let p=Date.now();for(;Date.now()-p<300;);}else{s.push(`${a.name}: ${d.message??d}`);break}}}this.sendNotification("project.deleted",{id:a.id})}if(_e.existsSync(r)){let a=K().find(d=>d.type==="default"),c=new Set;a?.workspaceDir&&c.add(me.resolve(a.workspaceDir));let l=d=>{try{let p=_e.readdirSync(d,{withFileTypes:!0});for(let u of p){if(!u.isDirectory())continue;let m=me.join(d,u.name);if(!c.has(me.resolve(m))){if(u.name==="groups"){l(m);try{_e.readdirSync(m).length===0&&_e.rmdirSync(m)}catch{}continue}try{_e.rmSync(m,{recursive:!0,force:!0})}catch(f){s.push(`orphan:${u.name}: ${f.message??f}`)}}}}catch{}};l(r)}let i=K().find(a=>a.type==="default");i&&(this.setActiveWorkdir(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,deletedCount:o,dirErrors:s.length?s:void 0})}function iS(t){let e=t.params;if(!e?.projectId||!e?.newName){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required params: projectId, newName"});return}let r=Sh(e.projectId,e.newName);if(!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"Cannot rename project (not found, is default, or name already taken)"});return}let n=me.join(J(),"workspaces"),o=me.resolve(r.workspaceDir);if(o.startsWith(me.resolve(n)+me.sep)){let s=me.join(n,e.newName);if(_e.existsSync(o)&&!_e.existsSync(s))try{_e.renameSync(o,s),wh(e.projectId,s),r.workspaceDir=s,this.getActiveProjectRoot()===o&&this.setActiveWorkdir(s)}catch{}}this.sendNotification("project.renamed",{id:r.id,name:r.name,workspaceDir:r.workspaceDir}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,project:r})}function aS(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: projectId"});return}let r=Th(e.projectId);if(!r.archived){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"Cannot archive project (not found or is default project)"});return}this.sendNotification("project.archived",{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})}function cS(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: projectId"});return}let r=Ph(e.projectId);if(!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"Cannot unarchive project (not found or not archived)"});return}this.sendNotification("project.unarchived",{id:r.id,name:r.name,workspaceDir:r.workspaceDir}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,project:r})}function lS(t){let e=t.params;if(!e?.groupId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: groupId"});return}let r=Ah(e.groupId);if(!r.archived){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,error:"No active project with this groupId"});return}this.sendNotification("project.deleted",{id:r.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,projectId:r.projectId})}function dS(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"projectId is required"});return}let r={};if("planStatus"in e){if(e.planStatus!==void 0&&!eS(e.planStatus)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:`Invalid planStatus: ${e.planStatus}`});return}r.planStatus=e.planStatus}"planAgents"in e&&(r.planAgents=e.planAgents),"planWinnerId"in e&&(r.planWinnerId=e.planWinnerId),"leaderSessionId"in e&&(r.leaderSessionId=e.leaderSessionId);let n=kh(e.projectId,r);t.id!==void 0&&this.sendResponse(t.id,{ok:n})}import{randomUUID as op}from"node:crypto";import*as Qe from"node:fs";import*as Jr from"node:path";var Nt=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[r,n]of this._modelUsage)e[r]={...n};return e}addUsage(e,r){this._totalInputTokens+=e.inputTokens,this._totalOutputTokens+=e.outputTokens;let n=this._modelUsage.get(r);n?(n.inputTokens+=e.inputTokens,n.outputTokens+=e.outputTokens,n.cacheRead+=e.cacheRead??0,n.cacheCreation+=e.cacheWrite??0):this._modelUsage.set(r,{inputTokens:e.inputTokens,outputTokens:e.outputTokens,cacheRead:e.cacheRead??0,cacheCreation:e.cacheWrite??0,mediaCalls:0,mediaDurationSeconds:0,mediaCharacters:0}),this.notifyListeners()}addMediaUsage(e,r,n){let o=this._modelUsage.get(e),s=o??{inputTokens:0,outputTokens:0,cacheRead:0,cacheCreation:0,mediaCalls:0,mediaDurationSeconds:0,mediaCharacters:0};switch(o||this._modelUsage.set(e,s),s.mediaCalls+=1,r){case"per_second":s.mediaDurationSeconds+=n;break;case"per_character":s.mediaCharacters+=n;break;case"per_token":s.outputTokens+=n;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[r,n]of Object.entries(e.modelUsage))this._modelUsage.set(r,{...n});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{}}};import*as uS from"node:fs";import*as np from"node:path";var Pr=class{getSessionsRoot(e){let r=Ce(e);if(!r)throw new Error(`Project not found: ${e}`);return I().getProjectSessionsRoot(r.workspaceDir)}getProjectWorkspaceDir(e){let r=Ce(e);if(!r)throw new Error(`Project not found: ${e}`);return r.workspaceDir}getSessionDir(e,r){return np.join(this.getSessionsRoot(e),r)}resolveWorkspaceDir(e,r){if(r)return this.getProjectWorkspaceDir(r);let n=K();for(let o of n){let s=I().getProjectSessionsRoot(o.workspaceDir),i=np.join(s,e);try{if(uS.existsSync(i))return o.workspaceDir}catch{}}return this.getActiveProjectWorkspaceDir()}getActiveProjectWorkspaceDir(){let e=oe();if(e)return e.workspaceDir;let r=K();if(r.length>0)return r[0].workspaceDir;throw new Error("No active project available")}getActiveProjectId(){let e=oe();if(e)return e.id;let r=K();if(r.length>0)return r[0].id;throw new Error("No active project available")}};import{randomUUID as pS}from"node:crypto";async function mS(t,e){let r=new Date(t.lastActiveAt).getTime();if(Date.now()-r<fm)return{split:!1,activeSessionId:t.sessionId};let s=pS(),i=new Date().toISOString();await qe(t.sessionId,{sealedAt:i},e);let a=t.taskSummary?`[\u4E0A\u4E00\u8F6E\u5BF9\u8BDD\u6458\u8981] ${t.taskSummary}`:void 0;return await qe(s,{sessionId:s,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:s,sealedSessionId:t.sessionId}}async function gS(t,e){if(t.type!=="group")return{split:!1,activeSessionId:t.sessionId};if(t.turnCount<hm)return{split:!1,activeSessionId:t.sessionId};let r=pS(),n=new Date().toISOString();await qe(t.sessionId,{sealedAt:n},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 qe(r,{sessionId:r,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:r,sealedSessionId:t.sessionId}}G();import*as fS from"node:fs";import*as hS from"node:path";var ta=class{constructor(e=new Pr,r=I()){this.locator=e;this.pathService=r}locator;pathService;getActiveProjectId(){return this.locator.getActiveProjectId()}getProjectWorkspaceDir(e){return this.locator.getProjectWorkspaceDir(e)}resolveWorkspaceDir(e,r){return this.locator.resolveWorkspaceDir(e,r)}async listThreads(e,r){let n=r??this.getActiveProjectId(),o=this.getProjectWorkspaceDir(n);return(await At(e,o)).map(i=>({id:i.sessionId,title:i.title,status:"active",turnCount:i.messageCount,createdAt:i.createdAt,lastActiveAt:i.lastActiveAt}))}resolveSessionWorkspaceDir(e,r,n){if(n)return this.resolveWorkspaceDir(r,n);let o=e.getActiveProjectRoot();if(o){let s=hS.join(this.pathService.getProjectSessionsRoot(o),zU(r));try{if(fS.existsSync(s))return o}catch{}}return this.resolveWorkspaceDir(r)}};function zU(t){return t.replace(/[^a-zA-Z0-9_-]/g,"_")}var VU=new Pr,lt=new ta(VU);function St(t,e="Unknown error"){return t instanceof Error?t.message:e}function Fn(t,e,r){return lt.resolveSessionWorkspaceDir(t,e,r)}function yS(t){let e=t.params,r=e?.id??op();this.log(`[thread.create] id=${r} title=${e?.title??"(none)"}`),e?.cwd&&typeof e.cwd=="string"&&this.setActiveWorkdir(e.cwd),this.currentSessionId=r,this.sessionState=new Nt(r),this.sessionTaskDomain=void 0,this.memoryPrefetchState=Pt(),this.enableIdleDream(),t.id!==void 0&&this.sendResponse(t.id,{id:r,title:e?.title,status:"active",createdAt:new Date().toISOString()})}async function bS(t){let e=t.params,r=e?.limit??20;try{let n=await lt.listThreads(r,e?.projectId);t.id!==void 0&&this.sendResponse(t.id,{threads:n})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to list threads: ${St(n)}`})}}async function vS(t){let e=t.params,r=e?.sessionId??op();try{let n=e?.projectId??lt.getActiveProjectId(),o=lt.getProjectWorkspaceDir(n);await qe(r,{sessionId:r,title:e?.title,type:e?.type,ownerId:e?.ownerId,groupKey:e?.groupKey,groupName:e?.groupName,groupPlatform:e?.groupPlatform,projectId:n},o),t.id!==void 0&&this.sendResponse(t.id,{sessionId:r,title:e?.title})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to create session: ${St(n)}`})}}async function kS(t){let e=t.params;if(t.id===void 0)return;let r=e?.platform??"desktop",n=e?.chatId,o=e?.chatType,s=e?.userId??"local";try{if(r==="desktop"&&n){let d=e?.projectId??lt.getActiveProjectId(),p=lt.getProjectWorkspaceDir(d),m=(await At(500,p)).find(f=>f.sessionId===n);if(m){this.sendResponse(t.id,{sessionId:n,title:m.title,type:m.type??"personal",ownerId:s,projectId:d});return}await qe(n,{sessionId:n,type:"personal",ownerId:s,projectId:d},p),this.sendResponse(t.id,{sessionId:n,type:"personal",ownerId:s,projectId:d});return}if(o==="group"&&n&&r){let d=`group:${r}:${n}`,p=K();for(let u of p){if(!u.workspaceDir)continue;let f=(await At(500,u.workspaceDir)).find(g=>g.groupKey===d&&!g.sealedAt);if(f){let g=tr(f.sessionId,u.workspaceDir);if(g){let h=await mS(g,u.workspaceDir);if(h.split){this.sendResponse(t.id,{sessionId:h.activeSessionId,title:void 0,type:"group",ownerId:s,groupKey:d,groupPlatform:r,groupName:e?.groupName,projectId:u.id,previousSessionId:h.sealedSessionId});return}}this.sendResponse(t.id,{sessionId:f.sessionId,title:f.title,type:"group",ownerId:s,groupKey:d,groupPlatform:r,groupName:e?.groupName,projectId:u.id});return}}}let i=op(),a=lt.getActiveProjectId(),c=lt.getProjectWorkspaceDir(a),l=o==="group"?`group:${r}:${n}`:void 0;await qe(i,{sessionId:i,type:o==="group"?"group":"personal",ownerId:s,groupKey:l,groupPlatform:o==="group"?r:void 0,groupName:e?.groupName,projectId:a},c),this.sendResponse(t.id,{sessionId:i,type:o==="group"?"group":"personal",ownerId:s,groupKey:l,groupPlatform:o==="group"?r:void 0,groupName:e?.groupName,projectId:a})}catch(i){this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to resolve session: ${St(i)}`})}}async function RS(t){let e=t.params,r=e?.limit??50;try{let n;if(e?.projectId){let s=Ce(e.projectId);if(!s){t.id!==void 0&&this.sendResponse(t.id,{sessions:[]});return}let i=s.workspaceDir;n=await At(r*2,i),n=n.filter(a=>a.projectId===e.projectId);for(let a of n)a.projectId=e.projectId}else{let s=K(),i=new Set,a=[];for(let c of s){if(!c.workspaceDir)continue;let l=await At(r,c.workspaceDir);for(let d of l)i.has(d.sessionId)||d.projectId&&(i.add(d.sessionId),a.push(d))}a.sort((c,l)=>c.lastActiveAt>l.lastActiveAt?-1:c.lastActiveAt<l.lastActiveAt?1:0),n=a}e?.archived===!0?n=n.filter(s=>s.archivedAt!=null):e?.archived===!1&&(n=n.filter(s=>s.archivedAt==null));let o=n.slice(0,r).map(s=>({sessionId:s.sessionId,title:s.title,type:s.type??"personal",lastActiveAt:s.lastActiveAt,pinnedAt:s.pinnedAt??null,archivedAt:s.archivedAt??null,sealedAt:s.sealedAt??null,projectId:s.projectId,previousSessionId:s.previousSessionId??null,carryoverSummary:s.carryoverSummary??null}));t.id!==void 0&&this.sendResponse(t.id,{sessions:o})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to list sessions: ${St(n)}`})}}async function SS(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let r=Fn(this,e.sessionId,e.projectId),o=(await At(500,r)).find(s=>s.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,pinnedAt:o.pinnedAt??null,archivedAt:o.archivedAt??null,projectId:o.projectId}:null})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to get session: ${St(r)}`})}}async function wS(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let r=Fn(this,e.sessionId,e.projectId),n=await Ir(e.sessionId,r);if(!n){t.id!==void 0&&this.sendResponse(t.id,{messages:[],total:0});return}let o=n.messages,s=e.limit&&e.limit>0?e.limit:o.length,i=o.slice(-s);t.id!==void 0&&this.sendResponse(t.id,{messages:i,total:o.length})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to get messages: ${St(r)}`})}}async function TS(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let r=Fn(this,e.sessionId,e.projectId),n=await qe(e.sessionId,{...e.title!==void 0?{title:e.title}:{},...e.pinnedAt!==void 0?{pinnedAt:e.pinnedAt}:{},...e.archivedAt!==void 0?{archivedAt:e.archivedAt}:{}},r);n&&this.sendNotification("session.info",{sessionId:e.sessionId,title:n.title,pinnedAt:n.pinnedAt??null,archivedAt:n.archivedAt??null,projectId:e.projectId||void 0}),t.id!==void 0&&this.sendResponse(t.id,{ok:n!==null})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to update session: ${St(r)}`})}}async function PS(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: sessionId"});return}if(!e.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: projectId"});return}try{let r=Fn(this,e.sessionId,e.projectId);await Gc(e.sessionId,r),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to delete session: ${St(r)}`})}}async function AS(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: projectId"});return}try{let r=lt.getProjectWorkspaceDir(e.projectId),n=(await At(1e4,r)).filter(s=>s.projectId===e.projectId),o=0;for(let s of n)await Gc(s.sessionId,r),o++;t.id!==void 0&&this.sendResponse(t.id,{ok:!0,deletedCount:o})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to delete all sessions: ${St(r)}`})}}async function xS(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let r=Fn(this,e.sessionId,e.projectId);await qe(e.sessionId,{archivedAt:new Date().toISOString()},r),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to archive session: ${St(r)}`})}}async function CS(t){let e=t.params,r=e?.sessionId;if(!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"sessionId is required"});return}try{let n=Fn(this,r,e?.projectId),o=await Ir(r,n);if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:`Session not found: ${r}`});return}o.messages&&o.messages.length>0&&this.sessionHistory.saveResumedSession(r,o.messages),t.id!==void 0&&this.sendResponse(t.id,{metadata:o.metadata,messages:o.messages})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to resume session: ${St(n)}`})}}function IS(t){let e=this.currentSessionId||"default",r=this.sessionState?.createSnapshot(),n,o=this.getActiveProjectRoot();o&&(n=Jr.join(ys(o),e));let s={sessionId:e,model:this.currentModel||void 0,cwd:process.cwd(),paths:{sessionDir:n,agentHome:J(),settings:Be()},usage:r?{turnCount:r.turnCount,inputTokens:r.totalInputTokens,outputTokens:r.totalOutputTokens}:void 0};t.id!==void 0&&this.sendResponse(t.id,s)}function ES(t){let e=t.params,r=null;if(e?.projectId)r=Ce(e.projectId);else if(e?.projectName){let s=K(),i=e.projectName.toLowerCase();if(r=s.find(a=>a.name.toLowerCase()===i)??null,r||(r=s.find(a=>a.name.toLowerCase().includes(i))??null),!r){let a=s.map(c=>c.name).slice(0,10);t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.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:y.INVALID_PARAMS,message:"Missing required param: projectId or projectName"});return}if(!r||r.status!=="active"){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Project not found or archived: ${e.projectId??e.projectName}`});return}let n=e.workspaceDir??r.workspaceDir;if(!Qe.existsSync(n)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Workspace directory does not exist: ${n}`});return}let o=Mt(r.id);if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.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 MS(t){let e=oe(),r=K();t.id!==void 0&&this.sendResponse(t.id,{sessionId:this.currentSessionId,activeProject:e,projects:r})}async function _S(t){let e=t.params,r=e?.sessionId;if(!r){t.id!==void 0&&this.sendResponse(t.id,{ok:!1});return}let n=K();for(let o of n)try{let s=lt.getProjectWorkspaceDir(o.id),i=await tr(r,s);if(i&&i.projectId===o.id){Mt(o.id),this.setActiveWorkdir(s),this.log(`[session.focus] switched to project ${o.id} for session ${r}`),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,projectId:o.id});return}}catch{}if(e?.projectName){let o=n.find(s=>s.name===e.projectName);if(o){let s=lt.getProjectWorkspaceDir(o.id);this.getActiveProjectRoot()!==s&&(this.setActiveWorkdir(s),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 DS(t){let e=t.params,{sessionId:r,fromProjectId:n,toProjectId:o}=e??{};if(!r||!n||!o){t.id!==void 0&&this.sendError(t.id,y.INVALID_PARAMS,"sessionId, fromProjectId, and toProjectId are required");return}if(n===o){t.id!==void 0&&this.sendResponse(t.id,{ok:!0});return}let s=Ce(n),i=Ce(o);if(!s||!i){t.id!==void 0&&this.sendError(t.id,y.INVALID_PARAMS,"Source or target project not found");return}let a=Jr.join(lt.getProjectWorkspaceDir(n),".qlogicagent","sessions",r),c=Jr.join(lt.getProjectWorkspaceDir(o),".qlogicagent","sessions",r);if(!Qe.existsSync(a)){t.id!==void 0&&this.sendError(t.id,y.INVALID_PARAMS,`Session ${r} not found in project ${n}`);return}try{Qe.mkdirSync(Jr.dirname(c),{recursive:!0}),Qe.cpSync(a,c,{recursive:!0});let l=Jr.join(c,"metadata.json");if(Qe.existsSync(l)){let d=JSON.parse(Qe.readFileSync(l,"utf-8"));d.projectId=o,Qe.writeFileSync(l,JSON.stringify(d,null,2))}Qe.rmSync(a,{recursive:!0,force:!0}),this.sendNotification("session-update",{sessionId:r,projectId:o}),this.log(`[session.moveToProject] moved ${r}: ${n} \u2192 ${o}`),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,projectId:o})}catch(l){let d=St(l);this.log(`[session.moveToProject] error: ${d}`),t.id!==void 0&&this.sendError(t.id,y.INTERNAL_ERROR,`Move failed: ${d}`)}}je();function YU(t){return t.length<=8?"****":`${t.slice(0,3)}***${t.slice(-4)}`}function Pe(t,e,r,n=y.INTERNAL_ERROR){if(e.id!==void 0){if(typeof t.sendError=="function"){t.sendError(e.id,n,r);return}t.sendResponse(e.id,void 0,{code:n,message:r})}}function ip(t,e){Pe(t,e,ws)}function XU(t){let e={};for(let r of t)for(let n of r.purposes)e[n]??=[],e[n].push(r);return e}async function JU(){let t=N(),e=await no(t);return t.save(),e}async function NS(t){try{return await JU(),!0}catch(e){if(t)throw e;return!1}}function ap(t=N()){try{return Bm()}catch{return t.getKnownProviderDef(Q)?.baseUrl??"https://www.qlogicagent.com"}}function cp(t){return t.id===Q?Q:t.group?.trim()||t.id}function QU(t){return t.id===cp(t)}function LS(t){let e=cp(t);return Xc({...t,id:e})}function ZU(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]??Xc(t)}function eF(t){return t.authType==="none"?!1:t.apiKeyEnvVars===void 0||t.apiKeyEnvVars.length>0}function tF(t){return{id:t.id,displayName:ZU(t),baseUrl:dn(t)??"",modelCount:t.models?.length??0}}function rF(t){let e=new Map;for(let r of t){if(!eF(r))continue;let n=cp(r);if(n===Q)continue;let o=r.models?.length??0,s=tF(r),i=e.get(n);if(!i){e.set(n,{id:n,displayName:LS(r),baseUrl:dn(r)??"",modelCount:o,variants:[s]});continue}i.modelCount+=o,i.variants??=[],i.variants.some(a=>a.id===s.id)||i.variants.push(s),QU(r)&&(i.displayName=LS(r),i.baseUrl=dn(r)??i.baseUrl)}return Array.from(e.values()).map(r=>({...r,variants:r.variants&&r.variants.length>1?r.variants:void 0}))}async function OS(t){let e=N(),r=e.getKeyForProvider(Q);if(!r){if(t)throw new Error("LLMRouter API Key is required to fetch available models.");return!1}let n=e.getProviderStatus(Q)?.baseUrl??ap(e);try{if((await Qc(e,{baseUrl:n,apiKey:r})).length===0){if(t)throw new Error("LLMRouter did not return any available models for this API Key.");return!1}return e.save(),!0}catch(o){if(t)throw o;return!1}}async function jS(t=!1){let e=N();if(!!e.getProviderStatus(Q)?.keys.length)return await OS(!1)?!0:NS(t);let o=e.getAllProviderStatus().filter(s=>s.keys.length>0).map(s=>s.providerId).some(s=>s!=="deepseek"&&s!==Q);return!t&&!o?!1:NS(t)}function nF(t){return t.defaultModel??t.models?.find(e=>!!e.id)?.id}function oF(t){return[...new Set(t)]}function sF(t){let e=t.replace(/\/+$/,"");return oF([`${e}/models`,/\/v\d+$/.test(e)?`${e}/models`:`${e}/v1/models`])}function iF(t){return t===404||t===405||t===410||t===501}async function aF(t){let e=N().getKnownProviderDef(t);if(e)return e;let r=await Jc(t).catch(()=>null);if(r)return{id:r.id,transport:r.transport,baseUrl:dn(r),authType:r.authType,models:r.models}}function sp(t){return{accept:"application/json",Authorization:`Bearer ${t}`}}function cF(t,e,r,n){if(t===Q)return[{method:"GET",url:Vc(r),headers:sp(e)}];let o=r.replace(/\/+$/,""),s=n?.transport,i=nF(n??{id:t}),a=[];if(s==="anthropic-messages")return/\/anthropic$/.test(o)&&a.push({method:"GET",url:`${o.replace(/\/anthropic$/,"")}/models`,headers:sp(e)}),i&&a.push({method:"POST",url:`${o}/v1/messages`,headers:{"Content-Type":"application/json","x-api-key":e,"anthropic-version":"2023-06-01"},body:{model:i,messages:[{role:"user",content:"ping"}],max_tokens:1,stream:!1}}),a;if(s==="gemini-generatecontent")return i?[{method:"POST",url:`${o}/models/${encodeURIComponent(i)}:generateContent`,headers:{"Content-Type":"application/json","x-goog-api-key":e},body:{contents:[{role:"user",parts:[{text:"ping"}]}],generationConfig:{maxOutputTokens:1}}}]:a;if(s==="volcengine-responses")return i?[{method:"POST",url:`${o.replace(/\/v\d+$/,"")}/v3/responses`,headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:{model:i,input:[{role:"user",content:[{type:"input_text",text:"ping"}]}],max_output_tokens:1,stream:!1,store:!1}}]:a;for(let c of sF(o))a.push({method:"GET",url:c,headers:sp(e)});return a}async function lF(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 r=await e.text().catch(()=>"");return{valid:!1,status:e.status,error:r.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 $S(t,e,r){let n=await aF(t),o=cF(t,e,r,n);if(o.length===0)return{valid:!1,status:0,error:`No validation probe is available for provider "${t}".`};let s;for(let i of o){let a=await lF(i);if(a.valid)return a;if(iF(a.status)){s=a;continue}return a}return s??{valid:!1,status:0,error:`No validation probe succeeded for provider "${t}".`}}async function dF(t,e,r){let n=await $S(t,e,r);if(!n.valid){let o=n.error?`: ${n.error}`:"";throw new Error(`API Key validation failed (${n.status})${o}`)}}async function US(t){try{let e=N(),r=["deepseek",Q].map(s=>e.getKnownProviderDef(s)).filter(s=>!!s).map(s=>({id:s.id,displayName:s.name,baseUrl:s.baseUrl,modelCount:s.models?.length??0})),n=await Yc().catch(()=>[]),o=rF(n);o.unshift({id:Q,displayName:zc,baseUrl:ap(e),modelCount:n.reduce((s,i)=>s+(i.models?.length??0),0)});for(let s of r.reverse()){let i=o.findIndex(a=>a.id===s.id);if(i>=0){s.id!==Q&&o.splice(i,1,s);continue}o.unshift(s)}t.id!==void 0&&this.sendResponse(t.id,{providers:o})}catch(e){Pe(this,t,e instanceof Error?e.message:String(e))}}async function FS(t){let e=t.params;if(!e?.providerId||!e?.key){Pe(this,t,"Required: providerId (string), key (string)",y.INVALID_PARAMS);return}let{providerId:r,key:n,label:o}=e,s=N(),i,a=!1;try{let c=await JS(r);if(!c){Pe(this,t,`Unknown provider: ${r}`,y.INVALID_PARAMS);return}let l=s.getProviderStatus(r);if(l?.keys.some(d=>d.key===n)){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,error:"\u8BE5 Key \u5DF2\u5B58\u5728\uFF0C\u65E0\u9700\u91CD\u590D\u6DFB\u52A0"});return}if(a=!l,s.addProvider(r,{baseUrl:c}),i=s.addKey(r,n,{label:o}),r===Q){if((await Qc(s,{baseUrl:c,apiKey:n})).length===0)throw new Error("LLMRouter did not return any available models for this API Key.")}else await dF(r,n,c);for(let d of ro)if(!s.getBinding(d)){let p=s.listModels({purpose:d,provider:r,enabledOnly:!0});p.length===0&&(p=s.listModels({purpose:d,provider:r}),p[0]&&s.enableModel(p[0].id)),p.length>0&&s.setBinding(d,p[0].id)}s.setKeyHealth(i,"healthy"),s.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,keyId:i,providerId:r})}catch(c){i&&(s.removeKey(i),a&&s.removeProvider(r));let l=c instanceof Error?c.message:ws;Pe(this,t,l)}}function HS(t){let e=t.params;if(!e?.keyId){Pe(this,t,"Required: keyId (string)",y.INVALID_PARAMS);return}let r=N();if(!r.removeKey(e.keyId)){Pe(this,t,"API Key not found",y.INVALID_PARAMS);return}r.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}function BS(t){let e=t.params;if(!e?.keyId){Pe(this,t,"Required: keyId (string)",y.INVALID_PARAMS);return}let r=N().getKeyById(e.keyId);if(!r){Pe(this,t,"API Key not found",y.INVALID_PARAMS);return}t.id!==void 0&&this.sendResponse(t.id,{key:r})}function qS(t){let e=t.params;if(!e?.keyId||typeof e.enabled!="boolean"){Pe(this,t,"Required: keyId (string), enabled (boolean)",y.INVALID_PARAMS);return}let r=N();if(!r.updateKey(e.keyId,{enabled:e.enabled})){Pe(this,t,"API Key not found",y.INVALID_PARAMS);return}r.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}function WS(t){let e=t.params;if(!e?.modelId||typeof e.enabled!="boolean"){Pe(this,t,"Required: modelId (string), enabled (boolean)",y.INVALID_PARAMS);return}let r=N();e.enabled?r.enableModel(e.modelId):r.disableModel(e.modelId),r.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}async function GS(t){let e=t.params;try{await jS(!1);let r=N(),n=new Set(r.getAllProviderStatus().filter(s=>s.keys.length>0).map(s=>s.providerId)),o=r.listModels({purpose:e?.purpose,provider:e?.provider}).filter(s=>r.hasConfiguredKeyForProviderVariant(s.provider));t.id!==void 0&&this.sendResponse(t.id,{models:o,grouped:XU(o),configuredProviderIds:[...n]})}catch{ip(this,t)}}function KS(t){let e=t.params;if(!e?.purpose||!e?.modelId){Pe(this,t,"Required: purpose (string), modelId (string)",y.INVALID_PARAMS);return}try{let r=N();r.setBinding(e.purpose,e.modelId),r.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(r){Pe(this,t,r instanceof Error?r.message:String(r),y.INVALID_PARAMS)}}function zS(t){let e=t.params;if(!e?.purpose){Pe(this,t,"Required: purpose (string)",y.INVALID_PARAMS);return}let r=N(),n=r.getBinding(e.purpose);t.id!==void 0&&this.sendResponse(t.id,{model:n?{id:n.id,provider:n.provider,model:n.model,displayName:n.displayName,purposes:n.purposes,enabled:n.enabled}:null,available:r.isAvailable(e.purpose)})}async function VS(t){try{await jS(!1);let e=N(),r=e.getAllProviderStatus().map(s=>({providerId:s.providerId,displayName:s.providerId===Q?zc:s.providerId,baseUrl:s.baseUrl,keyCount:s.keys.length,healthyKeys:s.keys.filter(i=>i.healthStatus==="healthy"&&i.enabled).length,totalKeys:s.keys.length,keys:s.keys.map(i=>({id:i.id,label:i.label,maskedKey:YU(i.key),enabled:i.enabled,health:i.healthStatus}))})),n=e.getAllBindings(),o={};for(let s of ro){let i=n[s];o[s]={bound:!!i,modelId:i?.id,modelName:i?.displayName,available:e.isAvailable(s)}}t.id!==void 0&&this.sendResponse(t.id,{providers:r,purposes:o})}catch{ip(this,t)}}async function YS(t){try{let e=N();e.load(),await OS(!1)||await no(e),e.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,catalogRefreshed:!0})}catch{ip(this,t)}}async function XS(t){let e=t.params;if(!e?.providerId||!e?.apiKey){Pe(this,t,"providerId and apiKey required",y.INVALID_PARAMS);return}try{let r=e.baseUrl||await JS(e.providerId);if(!r){Pe(this,t,`Unknown provider: ${e.providerId}`,y.INVALID_PARAMS);return}let n=await $S(e.providerId,e.apiKey,r);t.id!==void 0&&this.sendResponse(t.id,n)}catch(r){let n=r instanceof Error?r.message:String(r);t.id!==void 0&&this.sendResponse(t.id,{valid:!1,status:0,error:n})}}async function JS(t){if(t===Q)return ap();let e=N().getKnownProviderDef(t);if(e?.baseUrl)return e.baseUrl;let r=await Jc(t);return r?dn(r):void 0}G();import*as ce from"node:fs";import*as Ue from"node:path";import{join as uF}from"node:path";import{readFileSync as pF,writeFileSync as mF,mkdirSync as gF}from"node:fs";var Qr=null,lp=!1;function QS(t){return uF(t,"skill-stats.json")}function dp(t){if(Qr)return Qr;try{Qr=JSON.parse(pF(QS(t),"utf8"))}catch{Qr={}}return Qr}function fF(t){if(!(!lp||!Qr))try{gF(t,{recursive:!0}),mF(QS(t),JSON.stringify(Qr,null,2),"utf8"),lp=!1}catch{}}function up(t,e,r){let n=dp(t);n[e]||(n[e]={invokeCount:0,activeCount:0,positiveCount:0,negativeCount:0}),n[e].invokeCount++,n[e].lastUsedAt=new Date().toISOString(),r?n[e].positiveCount++:n[e].negativeCount++,n[e].invokeCount>0&&(n[e].successRate=(n[e].invokeCount-n[e].negativeCount)/n[e].invokeCount),lp=!0,fF(t)}function ZS(t,e){return dp(t)[e]}function ew(t){return dp(t)}import*as Yt from"node:fs";import*as ra from"node:path";function hF(t){try{let e=Yt.readFileSync(t,"utf8"),r=e.match(/^---\n[\s\S]*?^version:\s*(\S+)/m),n=e.match(/^---\n[\s\S]*?^description:\s*(.+)/m);return{version:r?.[1],description:n?.[1]?.trim()}}catch{return{}}}function na(t){let e=I(),r=[],n=t?e.getProjectSkillsDir(t):void 0,o=e.getUserSkillsDir();return n&&tw(r,n,"project"),tw(r,o,"global"),r}function tw(t,e,r){if(Yt.existsSync(e))for(let n of Yt.readdirSync(e)){let o=ra.join(e,n);try{if(!Yt.statSync(o).isDirectory())continue}catch{continue}let s=ra.join(o,"SKILL.md"),i=ra.join(o,"SKILL.md.disabled"),a=Yt.existsSync(s)?s:null;if(!a&&!Yt.existsSync(i))continue;let c=a?hF(a):{};t.push({id:`${r}:${n}`,name:n,path:o,active:!!a,scope:r,category:"automation",displayName:yF(n),displayDescription:bF(n,c.description),fallbackName:n,fallbackDescription:c.description??"",systemGenerated:vF(n),version:c.version,description:c.description})}}function yF(t){return{key:`capability.skill.${t}.name`,fallback:t}}function bF(t,e){return{key:`capability.skill.${t}.description`,fallback:e??""}}function vF(t){return t.startsWith("auto-skill-")||t.startsWith("test-skill-")}function kF(t){return t==="active"||t==="stale"||t==="archived"}function rw(t){let r=t.params?.projectId,n=this.getActiveProjectRoot();if(r&&this.projectLocator){let s=this.projectLocator.resolveProjectRoot(r);s&&(n=s)}let o=na(n);t.id!==void 0&&this.sendResponse(t.id,{skills:o})}function nw(t){let r=t.params?.name;if(!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: name"});return}let n=this.getActiveProjectRoot(),o=n?gr(n):void 0;if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"No active project workspace"});return}let s=Ue.join(o,r),i=Ue.join(s,"SKILL.md.disabled"),a=Ue.join(s,"SKILL.md");if(ce.existsSync(a)){t.id!==void 0&&this.sendResponse(t.id,{ok:!0,already:!0});return}if(ce.existsSync(i))try{ce.renameSync(i,a);let c=q(),l=ue(c),d=_t(l,r);d.state!=="active"&&(d.state="active",d.staleAt=void 0,d.archivedAt=void 0),ve(c,l),t.id!==void 0&&this.sendResponse(t.id,{ok:!0}),this.sendNotification("skills.updated",{action:"activate",name:r})}catch(c){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to activate skill: ${c instanceof Error?c.message:c}`})}else t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Skill "${r}" not found`})}function ow(t){let r=t.params?.name;if(!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: name"});return}let n=this.getActiveProjectRoot(),o=n?gr(n):void 0;if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"No active project workspace"});return}let s=Ue.join(o,r),i=Ue.join(s,"SKILL.md"),a=Ue.join(s,"SKILL.md.disabled");if(!ce.existsSync(i)){t.id!==void 0&&this.sendResponse(t.id,{ok:!0,already:!0});return}try{ce.renameSync(i,a),t.id!==void 0&&this.sendResponse(t.id,{ok:!0}),this.sendNotification("skills.updated",{action:"deactivate",name:r})}catch(c){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to deactivate skill: ${c instanceof Error?c.message:c}`})}}function sw(t){let e=t.params,r=e?.name;if(!r||/[\/\\]|\.\./.test(r)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing or invalid skill name"});return}let n=q(),o=ue(n);if(o.records[r]?.pinned){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:`Skill "${r}" is pinned. Unpin it first.`});return}let s=e?.scope??"project",i;if(s==="global")i=Ue.join(mr(),r);else{let a=this.getActiveProjectRoot(),c=a?gr(a):void 0;if(!c){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"No active project workspace"});return}i=Ue.join(c,r)}if(!ce.existsSync(i)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Skill "${r}" not found in ${s} scope`});return}try{ce.rmSync(i,{recursive:!0,force:!0}),vt(),oi(o,r),ve(n,o),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,deleted:r,scope:s}),this.sendNotification("skills.updated",{action:"delete",name:r})}catch(a){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to delete skill: ${a instanceof Error?a.message:a}`})}}function iw(t){let e=t.params,r=e?.name;if(!r||/[\/\\]|\.\./.test(r)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing or invalid skill name"});return}let n=this.getActiveProjectRoot(),o=n?gr(n):void 0;if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"No active project workspace"});return}let s=Ue.join(o,r),i=Ue.join(s,"SKILL.md");if(!ce.existsSync(i)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Skill "${r}" not found in project scope`});return}let a=mr(),c=Ue.join(a,r);try{ce.mkdirSync(c,{recursive:!0});let l=ce.readdirSync(s);for(let d of l){let p=ce.readFileSync(Ue.join(s,d));ce.writeFileSync(Ue.join(c,d),p)}e?.keepLocal||ce.rmSync(s,{recursive:!0,force:!0}),vt(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,promoted:r,globalPath:c,removedFromProject:!e?.keepLocal})}catch(l){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to promote skill: ${l instanceof Error?l.message:l}`})}}function aw(t){let e=t.params,r=q();if(e?.name){let n=ZS(r,e.name);t.id!==void 0&&this.sendResponse(t.id,{name:e.name,stats:n??null})}else{let n=ew(r);t.id!==void 0&&this.sendResponse(t.id,{stats:n})}}function cw(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 r=q(),n=ue(r);_t(n,e.name),Nh(n,e.name),ve(r,n),t.id!==void 0&&this.sendResponse(t.id,{name:e.name,pinned:!0})}function lw(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 r=q(),n=ue(r);Lh(n,e.name),ve(r,n),t.id!==void 0&&this.sendResponse(t.id,{name:e.name,pinned:!1})}function dw(t){let e=q(),r=this.getActiveProjectRoot(),n=r?Ue.join(r,".qlogicagent","skills"):mr(),o=Oh(e,n);o.transitioned.length>0&&vt(),t.id!==void 0&&this.sendResponse(t.id,o)}function uw(t){let e=t.params,r=q(),n=ue(r);if(e?.name){let o=n.records[e.name]??null;t.id!==void 0&&this.sendResponse(t.id,{record:o})}else if(e?.state){if(!kF(e.state)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Invalid skill lifecycle state"});return}let o=jh(n,e.state);t.id!==void 0&&this.sendResponse(t.id,{records:o})}else t.id!==void 0&&this.sendResponse(t.id,{records:Object.values(n.records)})}import*as hw from"node:path";import{randomUUID as AF}from"node:crypto";import{join as pp}from"node:path";import{mkdir as RF,readdir as SF}from"node:fs/promises";function wF(t){return t?.pathService??I()}function TF(t,e){return t??e.getActiveProjectRoot()}function pw(t,e){let r=wF(e);return pp(r.getProjectAgentDir(TF(t,r)),"solos")}function mp(t,e,r){return pp(pw(e,r),t)}function mw(t,e,r){return pp(mp(t,e,r),"solo-state.json")}async function gw(t,e,r){let n=mp(t.soloId,e,r);await RF(n,{recursive:!0}),await wr(mw(t.soloId,e,r),t)}async function PF(t,e,r){return ar(mw(t,e,r))}async function fw(t,e){let r=pw(t,e),n;try{n=await SF(r)}catch{return[]}let o=[];for(let s of n){let i=await PF(s,t,e);i&&o.push(i)}return o}async function gp(t,e,r){let{rm:n}=await import("node:fs/promises"),o=mp(t,e,r);try{return await n(o,{recursive:!0,force:!0}),!0}catch{return!1}}var oa=class{constructor(e,r,n,o={}){this.processManager=e;this.acpDetector=r;this.configStore=n;this.callbacks=o}processManager;acpDetector;configStore;callbacks;sessions=new Map;persistSession(e){let r={soloId:e.soloId,state:e.state,task:e.task,cwd:e.cwd,gitRoot:e.gitRoot,agents:e.agents.map(n=>({agentId:n.agentId,memberId:n.memberId,worktreePath:n.worktreePath,worktreeBranch:n.worktreeBranch,state:n.state,resultText:n.resultText,diff:n.diff,usage:n.usage,error:n.error,turns:n.turns})),evaluation:e.evaluation,createdAt:e.createdAt};gw(r,e.cwd).catch(()=>{})}async restoreFromDisk(e){let r=await fw(e);for(let n of r)this.sessions.has(n.soloId)||this.sessions.set(n.soloId,{soloId:n.soloId,state:n.state,task:n.task,cwd:n.cwd,gitRoot:n.gitRoot,agents:n.agents.map(o=>({...o,turns:o.turns??[]})),evaluation:n.evaluation,createdAt:n.createdAt});return r.length}async deleteSolo(e){return this.sessions.delete(e),gp(e)}async start(e){let{task:r,agents:n,cwd:o,sharedConfig:s}=e;if(n.length<2)throw new Error("Solo Mode requires at least 2 agents");let i=await qo(o);if(!i)throw new Error("Solo Mode requires a git repository");let a=r;if(s){let u=[];s.rules?.length&&u.push(`<rules>
480
480
  ${s.rules.join(`
481
481
  `)}
482
482
  </rules>`),s.memory?.length&&u.push(`<memory>
package/dist/index.js CHANGED
@@ -475,7 +475,7 @@ If no action needed, just respond with a progress update message to the user.`,e
475
475
  `)},onMcpToolCall:(a,c,l)=>this.handleMcpToolCall(a,c,l),sessionDir:UR.join(J(),"agent-logs")}),n=LR({findTool:a=>this.toolCatalog.findTool(a),runAgent:async({agentId:a,prompt:c,signal:l})=>{let d=a??"self",p=this.acpDetector.buildExternalDescriptor(d);if(!p)throw new Error(`workflow agent node: agent "${d}" is not available`);let u=`workflow-agent-${FR().slice(0,8)}`;if(l?.aborted)throw new Error("workflow agent node aborted before dispatch");await r.spawn({memberId:u,name:`workflow-${d}`,cwd:t,prompt:c,external:p});try{let m=await r.sendTask(u,c);return typeof m=="string"?m:JSON.stringify(m)}finally{try{r.kill(u),r.remove(u)}catch(m){process.stderr.write(`[workflow:pm] WARN cleanup of ${u} failed: ${m instanceof Error?m.message:String(m)}
476
476
  `)}}},invokeMcp:({server:a,tool:c,args:l})=>this.handleMcpToolCall(`workflow-mcp:${a}`,c,l),sendChannel:async({channel:a,target:c,payload:l})=>(this.sendNotification("workflow.channel.send",{channel:a,target:c,payload:l}),{queued:!0})}),o=new Dn;for(let[a,c]of Object.entries(Lo))o.register(a,c);let s=_v({registry:o,host:n,budget:{maxNodeExecutions:MU}});this.workflowController=new Rr(e,s),this.workflowStore=e,this.workflowProcessManager=r,Lv(this.workflowController);let i=new Qi({controller:this.workflowController,onError:(a,c)=>{let l=a instanceof Error?a.message:String(a);process.stderr.write(`[workflow:scheduler] run error for ${c}: ${l}
477
477
  `),this.sendNotification("workflow.runFailed",{workflowId:c,triggerType:"schedule",error:l})}});this.workflowScheduler=i,i.start().catch(a=>{process.stderr.write(`[workflow:scheduler] start failed: ${a instanceof Error?a.message:String(a)}
478
- `)})}return this.workflowController}function cr(t){return t.params??{}}function lr(t,e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:e})}function _U(t){return{id:t.id,name:t.name,active:t.active,concurrency:t.concurrency,rev:t.rev,createdAt:t.createdAt,updatedAt:t.updatedAt,...t.trigger!==void 0?{trigger:t.trigger}:{},def:t.def}}function Qu(t,e){this.sendNotification(t,{workflow:_U(e)})}function Zu(t,e){if(t.status==="failed"){this.sendNotification("workflow.runFailed",{workflowId:t.workflowId,triggerType:e,error:"Workflow run failed",outcome:t});return}this.sendNotification("workflow.runCompleted",{workflowId:t.workflowId,status:t.status,triggerType:e,outcome:t})}function DU(t){return t instanceof Error?t.message:String(t)}async function HR(t){let e=cr(t);if(!e.def)return lr.call(this,t,"workflow.create requires `def`");let r=zt.call(this),n=String(e.id??`wf_${FR().slice(0,8)}`),o=await r.create({id:n,name:String(e.name??n),def:e.def,concurrency:e.concurrency,active:e.active===!0});o.active&&await this.workflowScheduler?.refresh(o.id),Qu.call(this,"workflow.created",o),t.id!==void 0&&this.sendResponse(t.id,o)}async function BR(t){let e=cr(t);if(!e.id)return lr.call(this,t,"workflow.get requires `id`");let n=await zt.call(this).get(String(e.id));t.id!==void 0&&this.sendResponse(t.id,n)}async function qR(t){let e=cr(t);if(!e.id)return lr.call(this,t,"workflow.describe requires `id`");let n=await zt.call(this).describe(String(e.id));t.id!==void 0&&this.sendResponse(t.id,{rendered:n})}async function WR(t){let e=cr(t);if(!e.id||!e.patch)return lr.call(this,t,"workflow.patch requires `id` and `patch`");let r=zt.call(this),n={patch:e.patch,baseRev:e.baseRev,scope:e.scope},o=await r.patch(String(e.id),n);await this.workflowScheduler?.refresh(String(e.id)),o.ok&&Qu.call(this,"workflow.updated",await r.get(String(e.id))),t.id!==void 0&&this.sendResponse(t.id,o)}async function GR(t){let e=cr(t);if(!e.id)return lr.call(this,t,"workflow.run requires `id`");let r=zt.call(this),n=e.trigger??{type:"manual"},o=String(e.id);this.sendNotification("workflow.runStarted",{workflowId:o,triggerType:n.type});let s;try{s=await r.run(o,n),Zu.call(this,s,n.type)}catch(i){throw this.sendNotification("workflow.runFailed",{workflowId:o,triggerType:n.type,error:DU(i)}),i}t.id!==void 0&&this.sendResponse(t.id,s)}async function KR(t){let e=cr(t);if(!e.id||typeof e.active!="boolean")return lr.call(this,t,"workflow.setActive requires `id` and boolean `active`");let n=await zt.call(this).setActive(String(e.id),e.active);await this.workflowScheduler?.refresh(n.id),Qu.call(this,"workflow.updated",n),t.id!==void 0&&this.sendResponse(t.id,n)}async function zR(t){zt.call(this);let r=await this.workflowStore.list();t.id!==void 0&&this.sendResponse(t.id,{workflows:r})}async function VR(t){let e=cr(t);if(!e.id)return lr.call(this,t,"workflow.delete requires `id`");zt.call(this),await this.workflowStore.delete(String(e.id)),await this.workflowScheduler?.refresh(String(e.id)),this.sendNotification("workflow.deleted",{workflowId:String(e.id)}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}async function YR(t){let e=cr(t);if(!e.channel||typeof e.text!="string")return lr.call(this,t,"workflow.onImMessage requires `channel` and string `text`");zt.call(this);let r=await this.workflowScheduler.onImMessage(String(e.channel),e.text,e.payload);for(let n of r)Zu.call(this,n,"im-message");t.id!==void 0&&this.sendResponse(t.id,{outcomes:r})}async function XR(t){let e=cr(t);if(!e.path)return lr.call(this,t,"workflow.onWebhook requires `path`");zt.call(this);let r=await this.workflowScheduler.onWebhook(String(e.path),e.payload);for(let n of r)Zu.call(this,n,"webhook");t.id!==void 0&&this.sendResponse(t.id,{outcomes:r})}import*as _e from"node:fs";import*as me from"node:path";G();import*as Xr from"node:fs";import*as ep from"node:path";G();import*as Me from"node:fs";import*as Wo from"node:path";function Zi(t){let e=J(),r=Oe(t);Me.existsSync(r)||Me.mkdirSync(r,{recursive:!0});let n=Wo.join(e,"INSTRUCTIONS.md"),o=Wo.join(r,"INSTRUCTIONS.md");if(Me.existsSync(n)&&!Me.existsSync(o))try{Me.copyFileSync(n,o)}catch{}let s=ng(),i=un(t);if(Me.existsSync(s)&&!Me.existsSync(i))try{Me.mkdirSync(i,{recursive:!0});for(let a of Me.readdirSync(s)){if(!a.endsWith(".md"))continue;let c=Wo.join(s,a),l=Wo.join(i,a);Me.statSync(c).isFile()&&Me.copyFileSync(c,l)}}catch{}}var NU=["creating","running","completed","cancelled"];function JR(t){return typeof t=="string"&&NU.includes(t)}function QR(t,e){let r=I(),n=e.workspaceDir||ep.join(r.getUserAgentHome(),"workspaces",e.name);if(e.groupId){let l=Zs(e.groupId);if(l)return{project:l,isAgentTeamProject:l.type==="solo"||l.type==="product",deduplicated:!0}}let s=K().find(l=>l.name===e.name);LU(n);let i=Qs({name:e.name,workspaceDir:n,type:e.type??"personal",groupId:e.groupId,skipAutoSwitch:e.type==="solo"||e.type==="product"}),a=i.type==="solo"||i.type==="product";a||(Et(i.id),t.setActiveWorkdir(i.workspaceDir)),Zi(i.workspaceDir);let c=t.projectMemoryStoreFactory.create(i.workspaceDir);return c.ensureInitialized(),a||(t.memdir=c,t.mediaPersistence.setProjectDir(i.workspaceDir)),OU(i),{project:i,nameDuplicate:s,isAgentTeamProject:a}}function LU(t){Xr.existsSync(t)||Xr.mkdirSync(t,{recursive:!0})}function OU(t){let e=I();if(t.type!=="solo"&&t.type!=="product")return;let r=ep.join(e.getProjectAgentDir(t.workspaceDir),t.type==="solo"?"solo-state.json":"product-state.json");if(Xr.existsSync(r))return;let n=t.type==="solo"?{agents:[],status:"idle",createdAt:new Date().toISOString()}:{tasks:[],instances:[],status:"idle",createdAt:new Date().toISOString()};Xr.writeFileSync(r,JSON.stringify(n,null,2))}function ZR(t){let e=t.params;if(!e?.name){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: name"});return}let r;try{r=QR(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:y.INTERNAL_ERROR,message:a instanceof Error?a.message:`Cannot create workspace directory: ${e.workspaceDir??e.name}`});return}let{project:n,nameDuplicate:o,isAgentTeamProject:s,deduplicated:i}=r;if(i){t.id!==void 0&&this.sendResponse(t.id,{ok:!0,project:n,deduplicated:!0});return}if(this.sendNotification("project.created",{id:n.id,name:n.name,workspaceDir:n.workspaceDir,type:n.type}),s||this.sendNotification("project.switched",{id:n.id,name:n.name,workspaceDir:n.workspaceDir}),t.id!==void 0){let a={ok:!0,project:n};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 eS(t){let e=K();t.id!==void 0&&this.sendResponse(t.id,{projects:e})}function tS(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: projectId"});return}let r=Ce(e.projectId),n=fd(e.projectId);if(!n.deleted){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"Cannot delete project (not found or is default project)"});return}let o=!1,s;if(r?.workspaceDir){let i=me.join(J(),"workspaces"),a=me.resolve(r.workspaceDir);if(a.startsWith(me.resolve(i)+me.sep)){try{this.mediaPersistence?.releaseProjectDir?.(a)}catch{}for(let c=0;c<3;c++)try{_e.rmSync(a,{recursive:!0,force:!0}),o=!0;break}catch(l){if(c<2&&(l.code==="EBUSY"||l.code==="EPERM"||l.code==="ENOTEMPTY")){let d=Date.now();for(;Date.now()-d<200;);}else{s=l.message??String(l);break}}}else s="Project directory is outside the managed workspace root and was not deleted automatically."}this.sendNotification("project.deleted",{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,dirDeleted:o,dirDeleteError:s})}function rS(t){let e=K(),r=me.join(J(),"workspaces"),n=me.resolve(r)+me.sep,o=0,s=[];for(let a of e)if(a.type!=="default"){if(fd(a.id),o++,a.workspaceDir){let c=me.resolve(a.workspaceDir);try{this.mediaPersistence?.releaseProjectDir?.(c)}catch{}for(let l=0;l<3;l++)try{_e.existsSync(c)&&_e.rmSync(c,{recursive:!0,force:!0});break}catch(d){if(l<2&&(d.code==="EBUSY"||d.code==="EPERM"||d.code==="ENOTEMPTY")){let p=Date.now();for(;Date.now()-p<300;);}else{s.push(`${a.name}: ${d.message??d}`);break}}}this.sendNotification("project.deleted",{id:a.id})}if(_e.existsSync(r)){let a=K().find(d=>d.type==="default"),c=new Set;a?.workspaceDir&&c.add(me.resolve(a.workspaceDir));let l=d=>{try{let p=_e.readdirSync(d,{withFileTypes:!0});for(let u of p){if(!u.isDirectory())continue;let m=me.join(d,u.name);if(!c.has(me.resolve(m))){if(u.name==="groups"){l(m);try{_e.readdirSync(m).length===0&&_e.rmdirSync(m)}catch{}continue}try{_e.rmSync(m,{recursive:!0,force:!0})}catch(f){s.push(`orphan:${u.name}: ${f.message??f}`)}}}}catch{}};l(r)}let i=K().find(a=>a.type==="default");i&&(this.setActiveWorkdir(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,deletedCount:o,dirErrors:s.length?s:void 0})}function nS(t){let e=t.params;if(!e?.projectId||!e?.newName){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required params: projectId, newName"});return}let r=vh(e.projectId,e.newName);if(!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"Cannot rename project (not found, is default, or name already taken)"});return}let n=me.join(J(),"workspaces"),o=me.resolve(r.workspaceDir);if(o.startsWith(me.resolve(n)+me.sep)){let s=me.join(n,e.newName);if(_e.existsSync(o)&&!_e.existsSync(s))try{_e.renameSync(o,s),kh(e.projectId,s),r.workspaceDir=s,this.getActiveProjectRoot()===o&&this.setActiveWorkdir(s)}catch{}}this.sendNotification("project.renamed",{id:r.id,name:r.name,workspaceDir:r.workspaceDir}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,project:r})}function oS(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: projectId"});return}let r=Rh(e.projectId);if(!r.archived){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"Cannot archive project (not found or is default project)"});return}this.sendNotification("project.archived",{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})}function sS(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: projectId"});return}let r=Sh(e.projectId);if(!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"Cannot unarchive project (not found or not archived)"});return}this.sendNotification("project.unarchived",{id:r.id,name:r.name,workspaceDir:r.workspaceDir}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,project:r})}function iS(t){let e=t.params;if(!e?.groupId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: groupId"});return}let r=wh(e.groupId);if(!r.archived){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,error:"No active project with this groupId"});return}this.sendNotification("project.deleted",{id:r.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,projectId:r.projectId})}function aS(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"projectId is required"});return}let r={};if("planStatus"in e){if(e.planStatus!==void 0&&!JR(e.planStatus)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:`Invalid planStatus: ${e.planStatus}`});return}r.planStatus=e.planStatus}"planAgents"in e&&(r.planAgents=e.planAgents),"planWinnerId"in e&&(r.planWinnerId=e.planWinnerId),"leaderSessionId"in e&&(r.leaderSessionId=e.leaderSessionId);let n=yh(e.projectId,r);t.id!==void 0&&this.sendResponse(t.id,{ok:n})}import{randomUUID as rp}from"node:crypto";import*as Qe from"node:fs";import*as Jr from"node:path";var Dt=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[r,n]of this._modelUsage)e[r]={...n};return e}addUsage(e,r){this._totalInputTokens+=e.inputTokens,this._totalOutputTokens+=e.outputTokens;let n=this._modelUsage.get(r);n?(n.inputTokens+=e.inputTokens,n.outputTokens+=e.outputTokens,n.cacheRead+=e.cacheRead??0,n.cacheCreation+=e.cacheWrite??0):this._modelUsage.set(r,{inputTokens:e.inputTokens,outputTokens:e.outputTokens,cacheRead:e.cacheRead??0,cacheCreation:e.cacheWrite??0,mediaCalls:0,mediaDurationSeconds:0,mediaCharacters:0}),this.notifyListeners()}addMediaUsage(e,r,n){let o=this._modelUsage.get(e),s=o??{inputTokens:0,outputTokens:0,cacheRead:0,cacheCreation:0,mediaCalls:0,mediaDurationSeconds:0,mediaCharacters:0};switch(o||this._modelUsage.set(e,s),s.mediaCalls+=1,r){case"per_second":s.mediaDurationSeconds+=n;break;case"per_character":s.mediaCharacters+=n;break;case"per_token":s.outputTokens+=n;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[r,n]of Object.entries(e.modelUsage))this._modelUsage.set(r,{...n});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{}}};import*as cS from"node:fs";import*as tp from"node:path";var Tr=class{getSessionsRoot(e){let r=Ce(e);if(!r)throw new Error(`Project not found: ${e}`);return I().getProjectSessionsRoot(r.workspaceDir)}getProjectWorkspaceDir(e){let r=Ce(e);if(!r)throw new Error(`Project not found: ${e}`);return r.workspaceDir}getSessionDir(e,r){return tp.join(this.getSessionsRoot(e),r)}resolveWorkspaceDir(e,r){if(r)return this.getProjectWorkspaceDir(r);let n=K();for(let o of n){let s=I().getProjectSessionsRoot(o.workspaceDir),i=tp.join(s,e);try{if(cS.existsSync(i))return o.workspaceDir}catch{}}return this.getActiveProjectWorkspaceDir()}getActiveProjectWorkspaceDir(){let e=oe();if(e)return e.workspaceDir;let r=K();if(r.length>0)return r[0].workspaceDir;throw new Error("No active project available")}getActiveProjectId(){let e=oe();if(e)return e.id;let r=K();if(r.length>0)return r[0].id;throw new Error("No active project available")}};import{randomUUID as lS}from"node:crypto";async function dS(t,e){let r=new Date(t.lastActiveAt).getTime();if(Date.now()-r<ym)return{split:!1,activeSessionId:t.sessionId};let s=lS(),i=new Date().toISOString();await qe(t.sessionId,{sealedAt:i},e);let a=t.taskSummary?`[\u4E0A\u4E00\u8F6E\u5BF9\u8BDD\u6458\u8981] ${t.taskSummary}`:void 0;return await qe(s,{sessionId:s,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:s,sealedSessionId:t.sessionId}}async function uS(t,e){if(t.type!=="group")return{split:!1,activeSessionId:t.sessionId};if(t.turnCount<bm)return{split:!1,activeSessionId:t.sessionId};let r=lS(),n=new Date().toISOString();await qe(t.sessionId,{sealedAt:n},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 qe(r,{sessionId:r,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:r,sealedSessionId:t.sessionId}}G();import*as pS from"node:fs";import*as mS from"node:path";var ea=class{constructor(e=new Tr,r=I()){this.locator=e;this.pathService=r}locator;pathService;getActiveProjectId(){return this.locator.getActiveProjectId()}getProjectWorkspaceDir(e){return this.locator.getProjectWorkspaceDir(e)}resolveWorkspaceDir(e,r){return this.locator.resolveWorkspaceDir(e,r)}async listThreads(e,r){let n=r??this.getActiveProjectId(),o=this.getProjectWorkspaceDir(n);return(await Pt(e,o)).map(i=>({id:i.sessionId,title:i.title,status:"active",turnCount:i.messageCount,createdAt:i.createdAt,lastActiveAt:i.lastActiveAt}))}resolveSessionWorkspaceDir(e,r,n){if(n)return this.resolveWorkspaceDir(r,n);let o=e.getActiveProjectRoot();if(o){let s=mS.join(this.pathService.getProjectSessionsRoot(o),jU(r));try{if(pS.existsSync(s))return o}catch{}}return this.resolveWorkspaceDir(r)}};function jU(t){return t.replace(/[^a-zA-Z0-9_-]/g,"_")}var $U=new Tr,lt=new ea($U);function Rt(t,e="Unknown error"){return t instanceof Error?t.message:e}function $n(t,e,r){return lt.resolveSessionWorkspaceDir(t,e,r)}function gS(t){let e=t.params,r=e?.id??rp();this.log(`[thread.create] id=${r} title=${e?.title??"(none)"}`),e?.cwd&&typeof e.cwd=="string"&&this.setActiveWorkdir(e.cwd),this.currentSessionId=r,this.sessionState=new Dt(r),this.sessionTaskDomain=void 0,this.memoryPrefetchState=Tt(),this.enableIdleDream(),t.id!==void 0&&this.sendResponse(t.id,{id:r,title:e?.title,status:"active",createdAt:new Date().toISOString()})}async function fS(t){let e=t.params,r=e?.limit??20;try{let n=await lt.listThreads(r,e?.projectId);t.id!==void 0&&this.sendResponse(t.id,{threads:n})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to list threads: ${Rt(n)}`})}}async function hS(t){let e=t.params,r=e?.sessionId??rp();try{let n=e?.projectId??lt.getActiveProjectId(),o=lt.getProjectWorkspaceDir(n);await qe(r,{sessionId:r,title:e?.title,type:e?.type,ownerId:e?.ownerId,groupKey:e?.groupKey,groupName:e?.groupName,groupPlatform:e?.groupPlatform,projectId:n},o),t.id!==void 0&&this.sendResponse(t.id,{sessionId:r,title:e?.title})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to create session: ${Rt(n)}`})}}async function yS(t){let e=t.params;if(t.id===void 0)return;let r=e?.platform??"desktop",n=e?.chatId,o=e?.chatType,s=e?.userId??"local";try{if(r==="desktop"&&n){let d=e?.projectId??lt.getActiveProjectId(),p=lt.getProjectWorkspaceDir(d),m=(await Pt(500,p)).find(f=>f.sessionId===n);if(m){this.sendResponse(t.id,{sessionId:n,title:m.title,type:m.type??"personal",ownerId:s,projectId:d});return}await qe(n,{sessionId:n,type:"personal",ownerId:s,projectId:d},p),this.sendResponse(t.id,{sessionId:n,type:"personal",ownerId:s,projectId:d});return}if(o==="group"&&n&&r){let d=`group:${r}:${n}`,p=K();for(let u of p){if(!u.workspaceDir)continue;let f=(await Pt(500,u.workspaceDir)).find(g=>g.groupKey===d&&!g.sealedAt);if(f){let g=er(f.sessionId,u.workspaceDir);if(g){let h=await dS(g,u.workspaceDir);if(h.split){this.sendResponse(t.id,{sessionId:h.activeSessionId,title:void 0,type:"group",ownerId:s,groupKey:d,groupPlatform:r,groupName:e?.groupName,projectId:u.id,previousSessionId:h.sealedSessionId});return}}this.sendResponse(t.id,{sessionId:f.sessionId,title:f.title,type:"group",ownerId:s,groupKey:d,groupPlatform:r,groupName:e?.groupName,projectId:u.id});return}}}let i=rp(),a=lt.getActiveProjectId(),c=lt.getProjectWorkspaceDir(a),l=o==="group"?`group:${r}:${n}`:void 0;await qe(i,{sessionId:i,type:o==="group"?"group":"personal",ownerId:s,groupKey:l,groupPlatform:o==="group"?r:void 0,groupName:e?.groupName,projectId:a},c),this.sendResponse(t.id,{sessionId:i,type:o==="group"?"group":"personal",ownerId:s,groupKey:l,groupPlatform:o==="group"?r:void 0,groupName:e?.groupName,projectId:a})}catch(i){this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to resolve session: ${Rt(i)}`})}}async function bS(t){let e=t.params,r=e?.limit??50;try{let n;if(e?.projectId){let s=Ce(e.projectId);if(!s){t.id!==void 0&&this.sendResponse(t.id,{sessions:[]});return}let i=s.workspaceDir;n=await Pt(r*2,i),n=n.filter(a=>a.projectId===e.projectId);for(let a of n)a.projectId=e.projectId}else{let s=K(),i=new Set,a=[];for(let c of s){if(!c.workspaceDir)continue;let l=await Pt(r,c.workspaceDir);for(let d of l)i.has(d.sessionId)||d.projectId&&(i.add(d.sessionId),a.push(d))}a.sort((c,l)=>c.lastActiveAt>l.lastActiveAt?-1:c.lastActiveAt<l.lastActiveAt?1:0),n=a}e?.archived===!0?n=n.filter(s=>s.archivedAt!=null):e?.archived===!1&&(n=n.filter(s=>s.archivedAt==null));let o=n.slice(0,r).map(s=>({sessionId:s.sessionId,title:s.title,type:s.type??"personal",lastActiveAt:s.lastActiveAt,pinnedAt:s.pinnedAt??null,archivedAt:s.archivedAt??null,sealedAt:s.sealedAt??null,projectId:s.projectId,previousSessionId:s.previousSessionId??null,carryoverSummary:s.carryoverSummary??null}));t.id!==void 0&&this.sendResponse(t.id,{sessions:o})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to list sessions: ${Rt(n)}`})}}async function vS(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let r=$n(this,e.sessionId,e.projectId),o=(await Pt(500,r)).find(s=>s.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,pinnedAt:o.pinnedAt??null,archivedAt:o.archivedAt??null,projectId:o.projectId}:null})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to get session: ${Rt(r)}`})}}async function kS(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let r=$n(this,e.sessionId,e.projectId),n=await Dr(e.sessionId,r);if(!n){t.id!==void 0&&this.sendResponse(t.id,{messages:[],total:0});return}let o=n.messages,s=e.limit&&e.limit>0?e.limit:o.length,i=o.slice(-s);t.id!==void 0&&this.sendResponse(t.id,{messages:i,total:o.length})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to get messages: ${Rt(r)}`})}}async function RS(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let r=$n(this,e.sessionId,e.projectId),n=await qe(e.sessionId,{...e.title!==void 0?{title:e.title}:{},...e.pinnedAt!==void 0?{pinnedAt:e.pinnedAt}:{},...e.archivedAt!==void 0?{archivedAt:e.archivedAt}:{}},r);n&&this.sendNotification("session.info",{sessionId:e.sessionId,title:n.title,pinnedAt:n.pinnedAt??null,archivedAt:n.archivedAt??null,projectId:e.projectId||void 0}),t.id!==void 0&&this.sendResponse(t.id,{ok:n!==null})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to update session: ${Rt(r)}`})}}async function SS(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let r=$n(this,e.sessionId,e.projectId);await Sl(e.sessionId,r),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to delete session: ${Rt(r)}`})}}async function wS(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: projectId"});return}try{let r=lt.getProjectWorkspaceDir(e.projectId),n=(await Pt(1e4,r)).filter(s=>s.projectId===e.projectId),o=0;for(let s of n)await Sl(s.sessionId,r),o++;t.id!==void 0&&this.sendResponse(t.id,{ok:!0,deletedCount:o})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to delete all sessions: ${Rt(r)}`})}}async function TS(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let r=$n(this,e.sessionId,e.projectId);await qe(e.sessionId,{archivedAt:new Date().toISOString()},r),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to archive session: ${Rt(r)}`})}}async function PS(t){let e=t.params,r=e?.sessionId;if(!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"sessionId is required"});return}try{let n=$n(this,r,e?.projectId),o=await Dr(r,n);if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:`Session not found: ${r}`});return}o.messages&&o.messages.length>0&&this.sessionHistory.saveResumedSession(r,o.messages),t.id!==void 0&&this.sendResponse(t.id,{metadata:o.metadata,messages:o.messages})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to resume session: ${Rt(n)}`})}}function AS(t){let e=this.currentSessionId||"default",r=this.sessionState?.createSnapshot(),n,o=this.getActiveProjectRoot();o&&(n=Jr.join(As(o),e));let s={sessionId:e,model:this.currentModel||void 0,cwd:process.cwd(),paths:{sessionDir:n,agentHome:J(),settings:Be()},usage:r?{turnCount:r.turnCount,inputTokens:r.totalInputTokens,outputTokens:r.totalOutputTokens}:void 0};t.id!==void 0&&this.sendResponse(t.id,s)}function xS(t){let e=t.params,r=null;if(e?.projectId)r=Ce(e.projectId);else if(e?.projectName){let s=K(),i=e.projectName.toLowerCase();if(r=s.find(a=>a.name.toLowerCase()===i)??null,r||(r=s.find(a=>a.name.toLowerCase().includes(i))??null),!r){let a=s.map(c=>c.name).slice(0,10);t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.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:y.INVALID_PARAMS,message:"Missing required param: projectId or projectName"});return}if(!r||r.status!=="active"){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Project not found or archived: ${e.projectId??e.projectName}`});return}let n=e.workspaceDir??r.workspaceDir;if(!Qe.existsSync(n)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Workspace directory does not exist: ${n}`});return}let o=Et(r.id);if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.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 CS(t){let e=oe(),r=K();t.id!==void 0&&this.sendResponse(t.id,{sessionId:this.currentSessionId,activeProject:e,projects:r})}async function IS(t){let e=t.params,r=e?.sessionId;if(!r){t.id!==void 0&&this.sendResponse(t.id,{ok:!1});return}let n=K();for(let o of n)try{let s=lt.getProjectWorkspaceDir(o.id),i=await er(r,s);if(i&&i.projectId===o.id){Et(o.id),this.setActiveWorkdir(s),this.log(`[session.focus] switched to project ${o.id} for session ${r}`),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,projectId:o.id});return}}catch{}if(e?.projectName){let o=n.find(s=>s.name===e.projectName);if(o){let s=lt.getProjectWorkspaceDir(o.id);this.getActiveProjectRoot()!==s&&(this.setActiveWorkdir(s),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 ES(t){let e=t.params,{sessionId:r,fromProjectId:n,toProjectId:o}=e??{};if(!r||!n||!o){t.id!==void 0&&this.sendError(t.id,y.INVALID_PARAMS,"sessionId, fromProjectId, and toProjectId are required");return}if(n===o){t.id!==void 0&&this.sendResponse(t.id,{ok:!0});return}let s=Ce(n),i=Ce(o);if(!s||!i){t.id!==void 0&&this.sendError(t.id,y.INVALID_PARAMS,"Source or target project not found");return}let a=Jr.join(lt.getProjectWorkspaceDir(n),".qlogicagent","sessions",r),c=Jr.join(lt.getProjectWorkspaceDir(o),".qlogicagent","sessions",r);if(!Qe.existsSync(a)){t.id!==void 0&&this.sendError(t.id,y.INVALID_PARAMS,`Session ${r} not found in project ${n}`);return}try{Qe.mkdirSync(Jr.dirname(c),{recursive:!0}),Qe.cpSync(a,c,{recursive:!0});let l=Jr.join(c,"metadata.json");if(Qe.existsSync(l)){let d=JSON.parse(Qe.readFileSync(l,"utf-8"));d.projectId=o,Qe.writeFileSync(l,JSON.stringify(d,null,2))}Qe.rmSync(a,{recursive:!0,force:!0}),this.sendNotification("session-update",{sessionId:r,projectId:o}),this.log(`[session.moveToProject] moved ${r}: ${n} \u2192 ${o}`),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,projectId:o})}catch(l){let d=Rt(l);this.log(`[session.moveToProject] error: ${d}`),t.id!==void 0&&this.sendError(t.id,y.INTERNAL_ERROR,`Move failed: ${d}`)}}je();function UU(t){return t.length<=8?"****":`${t.slice(0,3)}***${t.slice(-4)}`}function Pe(t,e,r,n=y.INTERNAL_ERROR){if(e.id!==void 0){if(typeof t.sendError=="function"){t.sendError(e.id,n,r);return}t.sendResponse(e.id,void 0,{code:n,message:r})}}function op(t,e){Pe(t,e,_s)}function FU(t){let e={};for(let r of t)for(let n of r.purposes)e[n]??=[],e[n].push(r);return e}async function HU(){let t=N(),e=await go(t);return t.save(),e}async function MS(t){try{return await HU(),!0}catch(e){if(t)throw e;return!1}}function sp(t=N()){try{return Rg()}catch{return t.getKnownProviderDef(Q)?.baseUrl??"https://www.qlogicagent.com"}}function ip(t){return t.id===Q?Q:t.group?.trim()||t.id}function BU(t){return t.id===ip(t)}function _S(t){let e=ip(t);return xl({...t,id:e})}function qU(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]??xl(t)}function WU(t){return t.authType==="none"?!1:t.apiKeyEnvVars===void 0||t.apiKeyEnvVars.length>0}function GU(t){return{id:t.id,displayName:qU(t),baseUrl:mn(t)??"",modelCount:t.models?.length??0}}function KU(t){let e=new Map;for(let r of t){if(!WU(r))continue;let n=ip(r);if(n===Q)continue;let o=r.models?.length??0,s=GU(r),i=e.get(n);if(!i){e.set(n,{id:n,displayName:_S(r),baseUrl:mn(r)??"",modelCount:o,variants:[s]});continue}i.modelCount+=o,i.variants??=[],i.variants.some(a=>a.id===s.id)||i.variants.push(s),BU(r)&&(i.displayName=_S(r),i.baseUrl=mn(r)??i.baseUrl)}return Array.from(e.values()).map(r=>({...r,variants:r.variants&&r.variants.length>1?r.variants:void 0}))}async function DS(t){let e=N(),r=e.getKeyForProvider(Q);if(!r){if(t)throw new Error("LLMRouter API Key is required to fetch available models.");return!1}let n=e.getProviderStatus(Q)?.baseUrl??sp(e);try{if((await Il(e,{baseUrl:n,apiKey:r})).length===0){if(t)throw new Error("LLMRouter did not return any available models for this API Key.");return!1}return e.save(),!0}catch(o){if(t)throw o;return!1}}async function NS(t=!1){let e=N();if(!!e.getProviderStatus(Q)?.keys.length)return await DS(!1)?!0:MS(t);let o=e.getAllProviderStatus().filter(s=>s.keys.length>0).map(s=>s.providerId).some(s=>s!=="deepseek"&&s!==Q);return!t&&!o?!1:MS(t)}function zU(t){return t.defaultModel??t.models?.find(e=>!!e.id)?.id}function VU(t){return[...new Set(t)]}function YU(t){let e=t.replace(/\/+$/,"");return VU([`${e}/models`,/\/v\d+$/.test(e)?`${e}/models`:`${e}/v1/models`])}function XU(t){return t===404||t===405||t===410||t===501}async function JU(t){let e=N().getKnownProviderDef(t);if(e)return e;let r=await Cl(t).catch(()=>null);if(r)return{id:r.id,transport:r.transport,baseUrl:mn(r),authType:r.authType,models:r.models}}function np(t){return{accept:"application/json",Authorization:`Bearer ${t}`}}function QU(t,e,r,n){if(t===Q)return[{method:"GET",url:Pl(r),headers:np(e)}];let o=r.replace(/\/+$/,""),s=n?.transport,i=zU(n??{id:t}),a=[];if(s==="anthropic-messages")return/\/anthropic$/.test(o)&&a.push({method:"GET",url:`${o.replace(/\/anthropic$/,"")}/models`,headers:np(e)}),i&&a.push({method:"POST",url:`${o}/v1/messages`,headers:{"Content-Type":"application/json","x-api-key":e,"anthropic-version":"2023-06-01"},body:{model:i,messages:[{role:"user",content:"ping"}],max_tokens:1,stream:!1}}),a;if(s==="gemini-generatecontent")return i?[{method:"POST",url:`${o}/models/${encodeURIComponent(i)}:generateContent`,headers:{"Content-Type":"application/json","x-goog-api-key":e},body:{contents:[{role:"user",parts:[{text:"ping"}]}],generationConfig:{maxOutputTokens:1}}}]:a;if(s==="volcengine-responses")return i?[{method:"POST",url:`${o.replace(/\/v\d+$/,"")}/v3/responses`,headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:{model:i,input:[{role:"user",content:[{type:"input_text",text:"ping"}]}],max_output_tokens:1,stream:!1,store:!1}}]:a;for(let c of YU(o))a.push({method:"GET",url:c,headers:np(e)});return a}async function ZU(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 r=await e.text().catch(()=>"");return{valid:!1,status:e.status,error:r.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 LS(t,e,r){let n=await JU(t),o=QU(t,e,r,n);if(o.length===0)return{valid:!1,status:0,error:`No validation probe is available for provider "${t}".`};let s;for(let i of o){let a=await ZU(i);if(a.valid)return a;if(XU(a.status)){s=a;continue}return a}return s??{valid:!1,status:0,error:`No validation probe succeeded for provider "${t}".`}}async function eF(t,e,r){let n=await LS(t,e,r);if(!n.valid){let o=n.error?`: ${n.error}`:"";throw new Error(`API Key validation failed (${n.status})${o}`)}}async function OS(t){try{let e=N(),r=["deepseek",Q].map(s=>e.getKnownProviderDef(s)).filter(s=>!!s).map(s=>({id:s.id,displayName:s.name,baseUrl:s.baseUrl,modelCount:s.models?.length??0})),n=await Al().catch(()=>[]),o=KU(n);o.unshift({id:Q,displayName:Tl,baseUrl:sp(e),modelCount:n.reduce((s,i)=>s+(i.models?.length??0),0)});for(let s of r.reverse()){let i=o.findIndex(a=>a.id===s.id);if(i>=0){s.id!==Q&&o.splice(i,1,s);continue}o.unshift(s)}t.id!==void 0&&this.sendResponse(t.id,{providers:o})}catch(e){Pe(this,t,e instanceof Error?e.message:String(e))}}async function jS(t){let e=t.params;if(!e?.providerId||!e?.key){Pe(this,t,"Required: providerId (string), key (string)",y.INVALID_PARAMS);return}let{providerId:r,key:n,label:o}=e,s=N(),i,a=!1;try{let c=await VS(r);if(!c){Pe(this,t,`Unknown provider: ${r}`,y.INVALID_PARAMS);return}let l=s.getProviderStatus(r);if(l?.keys.some(d=>d.key===n)){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,error:"\u8BE5 Key \u5DF2\u5B58\u5728\uFF0C\u65E0\u9700\u91CD\u590D\u6DFB\u52A0"});return}if(a=!l,s.addProvider(r,{baseUrl:c}),i=s.addKey(r,n,{label:o}),r===Q){if((await Il(s,{baseUrl:c,apiKey:n})).length===0)throw new Error("LLMRouter did not return any available models for this API Key.")}else await eF(r,n,c);for(let d of mo)if(!s.getBinding(d)){let p=s.listModels({purpose:d,provider:r,enabledOnly:!0});p.length===0&&(p=s.listModels({purpose:d,provider:r}),p[0]&&s.enableModel(p[0].id)),p.length>0&&s.setBinding(d,p[0].id)}s.setKeyHealth(i,"healthy"),s.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,keyId:i,providerId:r})}catch(c){i&&(s.removeKey(i),a&&s.removeProvider(r));let l=c instanceof Error?c.message:_s;Pe(this,t,l)}}function $S(t){let e=t.params;if(!e?.keyId){Pe(this,t,"Required: keyId (string)",y.INVALID_PARAMS);return}let r=N();if(!r.removeKey(e.keyId)){Pe(this,t,"API Key not found",y.INVALID_PARAMS);return}r.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}function US(t){let e=t.params;if(!e?.keyId){Pe(this,t,"Required: keyId (string)",y.INVALID_PARAMS);return}let r=N().getKeyById(e.keyId);if(!r){Pe(this,t,"API Key not found",y.INVALID_PARAMS);return}t.id!==void 0&&this.sendResponse(t.id,{key:r})}function FS(t){let e=t.params;if(!e?.keyId||typeof e.enabled!="boolean"){Pe(this,t,"Required: keyId (string), enabled (boolean)",y.INVALID_PARAMS);return}let r=N();if(!r.updateKey(e.keyId,{enabled:e.enabled})){Pe(this,t,"API Key not found",y.INVALID_PARAMS);return}r.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}function HS(t){let e=t.params;if(!e?.modelId||typeof e.enabled!="boolean"){Pe(this,t,"Required: modelId (string), enabled (boolean)",y.INVALID_PARAMS);return}let r=N();e.enabled?r.enableModel(e.modelId):r.disableModel(e.modelId),r.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}async function BS(t){let e=t.params;try{await NS(!1);let r=N(),n=new Set(r.getAllProviderStatus().filter(s=>s.keys.length>0).map(s=>s.providerId)),o=r.listModels({purpose:e?.purpose,provider:e?.provider}).filter(s=>r.hasConfiguredKeyForProviderVariant(s.provider));t.id!==void 0&&this.sendResponse(t.id,{models:o,grouped:FU(o),configuredProviderIds:[...n]})}catch{op(this,t)}}function qS(t){let e=t.params;if(!e?.purpose||!e?.modelId){Pe(this,t,"Required: purpose (string), modelId (string)",y.INVALID_PARAMS);return}try{let r=N();r.setBinding(e.purpose,e.modelId),r.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(r){Pe(this,t,r instanceof Error?r.message:String(r),y.INVALID_PARAMS)}}function WS(t){let e=t.params;if(!e?.purpose){Pe(this,t,"Required: purpose (string)",y.INVALID_PARAMS);return}let r=N(),n=r.getBinding(e.purpose);t.id!==void 0&&this.sendResponse(t.id,{model:n?{id:n.id,provider:n.provider,model:n.model,displayName:n.displayName,purposes:n.purposes,enabled:n.enabled}:null,available:r.isAvailable(e.purpose)})}async function GS(t){try{await NS(!1);let e=N(),r=e.getAllProviderStatus().map(s=>({providerId:s.providerId,displayName:s.providerId===Q?Tl:s.providerId,baseUrl:s.baseUrl,keyCount:s.keys.length,healthyKeys:s.keys.filter(i=>i.healthStatus==="healthy"&&i.enabled).length,totalKeys:s.keys.length,keys:s.keys.map(i=>({id:i.id,label:i.label,maskedKey:UU(i.key),enabled:i.enabled,health:i.healthStatus}))})),n=e.getAllBindings(),o={};for(let s of mo){let i=n[s];o[s]={bound:!!i,modelId:i?.id,modelName:i?.displayName,available:e.isAvailable(s)}}t.id!==void 0&&this.sendResponse(t.id,{providers:r,purposes:o})}catch{op(this,t)}}async function KS(t){try{let e=N();e.load(),await DS(!1)||await go(e),e.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,catalogRefreshed:!0})}catch{op(this,t)}}async function zS(t){let e=t.params;if(!e?.providerId||!e?.apiKey){Pe(this,t,"providerId and apiKey required",y.INVALID_PARAMS);return}try{let r=e.baseUrl||await VS(e.providerId);if(!r){Pe(this,t,`Unknown provider: ${e.providerId}`,y.INVALID_PARAMS);return}let n=await LS(e.providerId,e.apiKey,r);t.id!==void 0&&this.sendResponse(t.id,n)}catch(r){let n=r instanceof Error?r.message:String(r);t.id!==void 0&&this.sendResponse(t.id,{valid:!1,status:0,error:n})}}async function VS(t){if(t===Q)return sp();let e=N().getKnownProviderDef(t);if(e?.baseUrl)return e.baseUrl;let r=await Cl(t);return r?mn(r):void 0}G();import*as ce from"node:fs";import*as Ue from"node:path";import{join as tF}from"node:path";import{readFileSync as rF,writeFileSync as nF,mkdirSync as oF}from"node:fs";var Qr=null,ap=!1;function YS(t){return tF(t,"skill-stats.json")}function cp(t){if(Qr)return Qr;try{Qr=JSON.parse(rF(YS(t),"utf8"))}catch{Qr={}}return Qr}function sF(t){if(!(!ap||!Qr))try{oF(t,{recursive:!0}),nF(YS(t),JSON.stringify(Qr,null,2),"utf8"),ap=!1}catch{}}function lp(t,e,r){let n=cp(t);n[e]||(n[e]={invokeCount:0,activeCount:0,positiveCount:0,negativeCount:0}),n[e].invokeCount++,n[e].lastUsedAt=new Date().toISOString(),r?n[e].positiveCount++:n[e].negativeCount++,n[e].invokeCount>0&&(n[e].successRate=(n[e].invokeCount-n[e].negativeCount)/n[e].invokeCount),ap=!0,sF(t)}function XS(t,e){return cp(t)[e]}function JS(t){return cp(t)}import*as Vt from"node:fs";import*as ta from"node:path";function iF(t){try{let e=Vt.readFileSync(t,"utf8"),r=e.match(/^---\n[\s\S]*?^version:\s*(\S+)/m),n=e.match(/^---\n[\s\S]*?^description:\s*(.+)/m);return{version:r?.[1],description:n?.[1]?.trim()}}catch{return{}}}function ra(t){let e=I(),r=[],n=t?e.getProjectSkillsDir(t):void 0,o=e.getUserSkillsDir();return n&&QS(r,n,"project"),QS(r,o,"global"),r}function QS(t,e,r){if(Vt.existsSync(e))for(let n of Vt.readdirSync(e)){let o=ta.join(e,n);try{if(!Vt.statSync(o).isDirectory())continue}catch{continue}let s=ta.join(o,"SKILL.md"),i=ta.join(o,"SKILL.md.disabled"),a=Vt.existsSync(s)?s:null;if(!a&&!Vt.existsSync(i))continue;let c=a?iF(a):{};t.push({id:`${r}:${n}`,name:n,path:o,active:!!a,scope:r,category:"automation",displayName:aF(n),displayDescription:cF(n,c.description),fallbackName:n,fallbackDescription:c.description??"",systemGenerated:lF(n),version:c.version,description:c.description})}}function aF(t){return{key:`capability.skill.${t}.name`,fallback:t}}function cF(t,e){return{key:`capability.skill.${t}.description`,fallback:e??""}}function lF(t){return t.startsWith("auto-skill-")||t.startsWith("test-skill-")}function dF(t){return t==="active"||t==="stale"||t==="archived"}function ZS(t){let r=t.params?.projectId,n=this.getActiveProjectRoot();if(r&&this.projectLocator){let s=this.projectLocator.resolveProjectRoot(r);s&&(n=s)}let o=ra(n);t.id!==void 0&&this.sendResponse(t.id,{skills:o})}function ew(t){let r=t.params?.name;if(!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: name"});return}let n=this.getActiveProjectRoot(),o=n?gr(n):void 0;if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"No active project workspace"});return}let s=Ue.join(o,r),i=Ue.join(s,"SKILL.md.disabled"),a=Ue.join(s,"SKILL.md");if(ce.existsSync(a)){t.id!==void 0&&this.sendResponse(t.id,{ok:!0,already:!0});return}if(ce.existsSync(i))try{ce.renameSync(i,a);let c=q(),l=ue(c),d=Mt(l,r);d.state!=="active"&&(d.state="active",d.staleAt=void 0,d.archivedAt=void 0),ve(c,l),t.id!==void 0&&this.sendResponse(t.id,{ok:!0}),this.sendNotification("skills.updated",{action:"activate",name:r})}catch(c){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to activate skill: ${c instanceof Error?c.message:c}`})}else t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Skill "${r}" not found`})}function tw(t){let r=t.params?.name;if(!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: name"});return}let n=this.getActiveProjectRoot(),o=n?gr(n):void 0;if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"No active project workspace"});return}let s=Ue.join(o,r),i=Ue.join(s,"SKILL.md"),a=Ue.join(s,"SKILL.md.disabled");if(!ce.existsSync(i)){t.id!==void 0&&this.sendResponse(t.id,{ok:!0,already:!0});return}try{ce.renameSync(i,a),t.id!==void 0&&this.sendResponse(t.id,{ok:!0}),this.sendNotification("skills.updated",{action:"deactivate",name:r})}catch(c){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to deactivate skill: ${c instanceof Error?c.message:c}`})}}function rw(t){let e=t.params,r=e?.name;if(!r||/[\/\\]|\.\./.test(r)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing or invalid skill name"});return}let n=q(),o=ue(n);if(o.records[r]?.pinned){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:`Skill "${r}" is pinned. Unpin it first.`});return}let s=e?.scope??"project",i;if(s==="global")i=Ue.join(mr(),r);else{let a=this.getActiveProjectRoot(),c=a?gr(a):void 0;if(!c){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"No active project workspace"});return}i=Ue.join(c,r)}if(!ce.existsSync(i)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Skill "${r}" not found in ${s} scope`});return}try{ce.rmSync(i,{recursive:!0,force:!0}),bt(),ni(o,r),ve(n,o),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,deleted:r,scope:s}),this.sendNotification("skills.updated",{action:"delete",name:r})}catch(a){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to delete skill: ${a instanceof Error?a.message:a}`})}}function nw(t){let e=t.params,r=e?.name;if(!r||/[\/\\]|\.\./.test(r)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing or invalid skill name"});return}let n=this.getActiveProjectRoot(),o=n?gr(n):void 0;if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"No active project workspace"});return}let s=Ue.join(o,r),i=Ue.join(s,"SKILL.md");if(!ce.existsSync(i)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Skill "${r}" not found in project scope`});return}let a=mr(),c=Ue.join(a,r);try{ce.mkdirSync(c,{recursive:!0});let l=ce.readdirSync(s);for(let d of l){let p=ce.readFileSync(Ue.join(s,d));ce.writeFileSync(Ue.join(c,d),p)}e?.keepLocal||ce.rmSync(s,{recursive:!0,force:!0}),bt(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,promoted:r,globalPath:c,removedFromProject:!e?.keepLocal})}catch(l){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to promote skill: ${l instanceof Error?l.message:l}`})}}function ow(t){let e=t.params,r=q();if(e?.name){let n=XS(r,e.name);t.id!==void 0&&this.sendResponse(t.id,{name:e.name,stats:n??null})}else{let n=JS(r);t.id!==void 0&&this.sendResponse(t.id,{stats:n})}}function sw(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 r=q(),n=ue(r);Mt(n,e.name),Mh(n,e.name),ve(r,n),t.id!==void 0&&this.sendResponse(t.id,{name:e.name,pinned:!0})}function iw(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 r=q(),n=ue(r);_h(n,e.name),ve(r,n),t.id!==void 0&&this.sendResponse(t.id,{name:e.name,pinned:!1})}function aw(t){let e=q(),r=this.getActiveProjectRoot(),n=r?Ue.join(r,".qlogicagent","skills"):mr(),o=Dh(e,n);o.transitioned.length>0&&bt(),t.id!==void 0&&this.sendResponse(t.id,o)}function cw(t){let e=t.params,r=q(),n=ue(r);if(e?.name){let o=n.records[e.name]??null;t.id!==void 0&&this.sendResponse(t.id,{record:o})}else if(e?.state){if(!dF(e.state)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Invalid skill lifecycle state"});return}let o=Nh(n,e.state);t.id!==void 0&&this.sendResponse(t.id,{records:o})}else t.id!==void 0&&this.sendResponse(t.id,{records:Object.values(n.records)})}import*as mw from"node:path";import{randomUUID as hF}from"node:crypto";import{join as dp}from"node:path";import{mkdir as uF,readdir as pF}from"node:fs/promises";function mF(t){return t?.pathService??I()}function gF(t,e){return t??e.getActiveProjectRoot()}function lw(t,e){let r=mF(e);return dp(r.getProjectAgentDir(gF(t,r)),"solos")}function up(t,e,r){return dp(lw(e,r),t)}function dw(t,e,r){return dp(up(t,e,r),"solo-state.json")}async function uw(t,e,r){let n=up(t.soloId,e,r);await uF(n,{recursive:!0}),await Sr(dw(t.soloId,e,r),t)}async function fF(t,e,r){return ir(dw(t,e,r))}async function pw(t,e){let r=lw(t,e),n;try{n=await pF(r)}catch{return[]}let o=[];for(let s of n){let i=await fF(s,t,e);i&&o.push(i)}return o}async function pp(t,e,r){let{rm:n}=await import("node:fs/promises"),o=up(t,e,r);try{return await n(o,{recursive:!0,force:!0}),!0}catch{return!1}}var na=class{constructor(e,r,n,o={}){this.processManager=e;this.acpDetector=r;this.configStore=n;this.callbacks=o}processManager;acpDetector;configStore;callbacks;sessions=new Map;persistSession(e){let r={soloId:e.soloId,state:e.state,task:e.task,cwd:e.cwd,gitRoot:e.gitRoot,agents:e.agents.map(n=>({agentId:n.agentId,memberId:n.memberId,worktreePath:n.worktreePath,worktreeBranch:n.worktreeBranch,state:n.state,resultText:n.resultText,diff:n.diff,usage:n.usage,error:n.error,turns:n.turns})),evaluation:e.evaluation,createdAt:e.createdAt};uw(r,e.cwd).catch(()=>{})}async restoreFromDisk(e){let r=await pw(e);for(let n of r)this.sessions.has(n.soloId)||this.sessions.set(n.soloId,{soloId:n.soloId,state:n.state,task:n.task,cwd:n.cwd,gitRoot:n.gitRoot,agents:n.agents.map(o=>({...o,turns:o.turns??[]})),evaluation:n.evaluation,createdAt:n.createdAt});return r.length}async deleteSolo(e){return this.sessions.delete(e),pp(e)}async start(e){let{task:r,agents:n,cwd:o,sharedConfig:s}=e;if(n.length<2)throw new Error("Solo Mode requires at least 2 agents");let i=await qo(o);if(!i)throw new Error("Solo Mode requires a git repository");let a=r;if(s){let u=[];s.rules?.length&&u.push(`<rules>
478
+ `)})}return this.workflowController}function cr(t){return t.params??{}}function lr(t,e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:e})}function _U(t){return{id:t.id,name:t.name,active:t.active,concurrency:t.concurrency,rev:t.rev,createdAt:t.createdAt,updatedAt:t.updatedAt,...t.trigger!==void 0?{trigger:t.trigger}:{},def:t.def}}function Qu(t,e){this.sendNotification(t,{workflow:_U(e)})}function Zu(t,e){if(t.status==="failed"){this.sendNotification("workflow.runFailed",{workflowId:t.workflowId,triggerType:e,error:"Workflow run failed",outcome:t});return}this.sendNotification("workflow.runCompleted",{workflowId:t.workflowId,status:t.status,triggerType:e,outcome:t})}function DU(t){return t instanceof Error?t.message:String(t)}async function HR(t){let e=cr(t);if(!e.def)return lr.call(this,t,"workflow.create requires `def`");let r=zt.call(this),n=String(e.id??`wf_${FR().slice(0,8)}`),o=await r.create({id:n,name:String(e.name??n),def:e.def,concurrency:e.concurrency,active:e.active===!0});o.active&&await this.workflowScheduler?.refresh(o.id),Qu.call(this,"workflow.created",o),t.id!==void 0&&this.sendResponse(t.id,o)}async function BR(t){let e=cr(t);if(!e.id)return lr.call(this,t,"workflow.get requires `id`");let n=await zt.call(this).get(String(e.id));t.id!==void 0&&this.sendResponse(t.id,n)}async function qR(t){let e=cr(t);if(!e.id)return lr.call(this,t,"workflow.describe requires `id`");let n=await zt.call(this).describe(String(e.id));t.id!==void 0&&this.sendResponse(t.id,{rendered:n})}async function WR(t){let e=cr(t);if(!e.id||!e.patch)return lr.call(this,t,"workflow.patch requires `id` and `patch`");let r=zt.call(this),n={patch:e.patch,baseRev:e.baseRev,scope:e.scope},o=await r.patch(String(e.id),n);await this.workflowScheduler?.refresh(String(e.id)),o.ok&&Qu.call(this,"workflow.updated",await r.get(String(e.id))),t.id!==void 0&&this.sendResponse(t.id,o)}async function GR(t){let e=cr(t);if(!e.id)return lr.call(this,t,"workflow.run requires `id`");let r=zt.call(this),n=e.trigger??{type:"manual"},o=String(e.id);this.sendNotification("workflow.runStarted",{workflowId:o,triggerType:n.type});let s;try{s=await r.run(o,n),Zu.call(this,s,n.type)}catch(i){throw this.sendNotification("workflow.runFailed",{workflowId:o,triggerType:n.type,error:DU(i)}),i}t.id!==void 0&&this.sendResponse(t.id,s)}async function KR(t){let e=cr(t);if(!e.id||typeof e.active!="boolean")return lr.call(this,t,"workflow.setActive requires `id` and boolean `active`");let n=await zt.call(this).setActive(String(e.id),e.active);await this.workflowScheduler?.refresh(n.id),Qu.call(this,"workflow.updated",n),t.id!==void 0&&this.sendResponse(t.id,n)}async function zR(t){zt.call(this);let r=await this.workflowStore.list();t.id!==void 0&&this.sendResponse(t.id,{workflows:r})}async function VR(t){let e=cr(t);if(!e.id)return lr.call(this,t,"workflow.delete requires `id`");zt.call(this),await this.workflowStore.delete(String(e.id)),await this.workflowScheduler?.refresh(String(e.id)),this.sendNotification("workflow.deleted",{workflowId:String(e.id)}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}async function YR(t){let e=cr(t);if(!e.channel||typeof e.text!="string")return lr.call(this,t,"workflow.onImMessage requires `channel` and string `text`");zt.call(this);let r=await this.workflowScheduler.onImMessage(String(e.channel),e.text,e.payload);for(let n of r)Zu.call(this,n,"im-message");t.id!==void 0&&this.sendResponse(t.id,{outcomes:r})}async function XR(t){let e=cr(t);if(!e.path)return lr.call(this,t,"workflow.onWebhook requires `path`");zt.call(this);let r=await this.workflowScheduler.onWebhook(String(e.path),e.payload);for(let n of r)Zu.call(this,n,"webhook");t.id!==void 0&&this.sendResponse(t.id,{outcomes:r})}import*as _e from"node:fs";import*as me from"node:path";G();import*as Xr from"node:fs";import*as ep from"node:path";G();import*as Me from"node:fs";import*as Wo from"node:path";function Zi(t){let e=J(),r=Oe(t);Me.existsSync(r)||Me.mkdirSync(r,{recursive:!0});let n=Wo.join(e,"INSTRUCTIONS.md"),o=Wo.join(r,"INSTRUCTIONS.md");if(Me.existsSync(n)&&!Me.existsSync(o))try{Me.copyFileSync(n,o)}catch{}let s=ng(),i=un(t);if(Me.existsSync(s)&&!Me.existsSync(i))try{Me.mkdirSync(i,{recursive:!0});for(let a of Me.readdirSync(s)){if(!a.endsWith(".md"))continue;let c=Wo.join(s,a),l=Wo.join(i,a);Me.statSync(c).isFile()&&Me.copyFileSync(c,l)}}catch{}}var NU=["creating","running","completed","cancelled"];function JR(t){return typeof t=="string"&&NU.includes(t)}function QR(t,e){let r=I(),n=e.workspaceDir||ep.join(r.getUserAgentHome(),"workspaces",e.name);if(e.groupId){let l=Zs(e.groupId);if(l)return{project:l,isAgentTeamProject:l.type==="solo"||l.type==="product",deduplicated:!0}}let s=K().find(l=>l.name===e.name);LU(n);let i=Qs({name:e.name,workspaceDir:n,type:e.type??"personal",groupId:e.groupId,skipAutoSwitch:e.type==="solo"||e.type==="product"}),a=i.type==="solo"||i.type==="product";a||(Et(i.id),t.setActiveWorkdir(i.workspaceDir)),Zi(i.workspaceDir);let c=t.projectMemoryStoreFactory.create(i.workspaceDir);return c.ensureInitialized(),a||(t.memdir=c,t.mediaPersistence.setProjectDir(i.workspaceDir)),OU(i),{project:i,nameDuplicate:s,isAgentTeamProject:a}}function LU(t){Xr.existsSync(t)||Xr.mkdirSync(t,{recursive:!0})}function OU(t){let e=I();if(t.type!=="solo"&&t.type!=="product")return;let r=ep.join(e.getProjectAgentDir(t.workspaceDir),t.type==="solo"?"solo-state.json":"product-state.json");if(Xr.existsSync(r))return;let n=t.type==="solo"?{agents:[],status:"idle",createdAt:new Date().toISOString()}:{tasks:[],instances:[],status:"idle",createdAt:new Date().toISOString()};Xr.writeFileSync(r,JSON.stringify(n,null,2))}function ZR(t){let e=t.params;if(!e?.name){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: name"});return}let r;try{r=QR(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:y.INTERNAL_ERROR,message:a instanceof Error?a.message:`Cannot create workspace directory: ${e.workspaceDir??e.name}`});return}let{project:n,nameDuplicate:o,isAgentTeamProject:s,deduplicated:i}=r;if(i){t.id!==void 0&&this.sendResponse(t.id,{ok:!0,project:n,deduplicated:!0});return}if(this.sendNotification("project.created",{id:n.id,name:n.name,workspaceDir:n.workspaceDir,type:n.type}),s||this.sendNotification("project.switched",{id:n.id,name:n.name,workspaceDir:n.workspaceDir}),t.id!==void 0){let a={ok:!0,project:n};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 eS(t){let e=K();t.id!==void 0&&this.sendResponse(t.id,{projects:e})}function tS(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: projectId"});return}let r=Ce(e.projectId),n=fd(e.projectId);if(!n.deleted){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"Cannot delete project (not found or is default project)"});return}let o=!1,s;if(r?.workspaceDir){let i=me.join(J(),"workspaces"),a=me.resolve(r.workspaceDir);if(a.startsWith(me.resolve(i)+me.sep)){try{this.mediaPersistence?.releaseProjectDir?.(a)}catch{}for(let c=0;c<3;c++)try{_e.rmSync(a,{recursive:!0,force:!0}),o=!0;break}catch(l){if(c<2&&(l.code==="EBUSY"||l.code==="EPERM"||l.code==="ENOTEMPTY")){let d=Date.now();for(;Date.now()-d<200;);}else{s=l.message??String(l);break}}}else s="Project directory is outside the managed workspace root and was not deleted automatically."}this.sendNotification("project.deleted",{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,dirDeleted:o,dirDeleteError:s})}function rS(t){let e=K(),r=me.join(J(),"workspaces"),n=me.resolve(r)+me.sep,o=0,s=[];for(let a of e)if(a.type!=="default"){if(fd(a.id),o++,a.workspaceDir){let c=me.resolve(a.workspaceDir);try{this.mediaPersistence?.releaseProjectDir?.(c)}catch{}for(let l=0;l<3;l++)try{_e.existsSync(c)&&_e.rmSync(c,{recursive:!0,force:!0});break}catch(d){if(l<2&&(d.code==="EBUSY"||d.code==="EPERM"||d.code==="ENOTEMPTY")){let p=Date.now();for(;Date.now()-p<300;);}else{s.push(`${a.name}: ${d.message??d}`);break}}}this.sendNotification("project.deleted",{id:a.id})}if(_e.existsSync(r)){let a=K().find(d=>d.type==="default"),c=new Set;a?.workspaceDir&&c.add(me.resolve(a.workspaceDir));let l=d=>{try{let p=_e.readdirSync(d,{withFileTypes:!0});for(let u of p){if(!u.isDirectory())continue;let m=me.join(d,u.name);if(!c.has(me.resolve(m))){if(u.name==="groups"){l(m);try{_e.readdirSync(m).length===0&&_e.rmdirSync(m)}catch{}continue}try{_e.rmSync(m,{recursive:!0,force:!0})}catch(f){s.push(`orphan:${u.name}: ${f.message??f}`)}}}}catch{}};l(r)}let i=K().find(a=>a.type==="default");i&&(this.setActiveWorkdir(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,deletedCount:o,dirErrors:s.length?s:void 0})}function nS(t){let e=t.params;if(!e?.projectId||!e?.newName){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required params: projectId, newName"});return}let r=vh(e.projectId,e.newName);if(!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"Cannot rename project (not found, is default, or name already taken)"});return}let n=me.join(J(),"workspaces"),o=me.resolve(r.workspaceDir);if(o.startsWith(me.resolve(n)+me.sep)){let s=me.join(n,e.newName);if(_e.existsSync(o)&&!_e.existsSync(s))try{_e.renameSync(o,s),kh(e.projectId,s),r.workspaceDir=s,this.getActiveProjectRoot()===o&&this.setActiveWorkdir(s)}catch{}}this.sendNotification("project.renamed",{id:r.id,name:r.name,workspaceDir:r.workspaceDir}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,project:r})}function oS(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: projectId"});return}let r=Rh(e.projectId);if(!r.archived){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"Cannot archive project (not found or is default project)"});return}this.sendNotification("project.archived",{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})}function sS(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: projectId"});return}let r=Sh(e.projectId);if(!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"Cannot unarchive project (not found or not archived)"});return}this.sendNotification("project.unarchived",{id:r.id,name:r.name,workspaceDir:r.workspaceDir}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,project:r})}function iS(t){let e=t.params;if(!e?.groupId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: groupId"});return}let r=wh(e.groupId);if(!r.archived){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,error:"No active project with this groupId"});return}this.sendNotification("project.deleted",{id:r.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,projectId:r.projectId})}function aS(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"projectId is required"});return}let r={};if("planStatus"in e){if(e.planStatus!==void 0&&!JR(e.planStatus)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:`Invalid planStatus: ${e.planStatus}`});return}r.planStatus=e.planStatus}"planAgents"in e&&(r.planAgents=e.planAgents),"planWinnerId"in e&&(r.planWinnerId=e.planWinnerId),"leaderSessionId"in e&&(r.leaderSessionId=e.leaderSessionId);let n=yh(e.projectId,r);t.id!==void 0&&this.sendResponse(t.id,{ok:n})}import{randomUUID as rp}from"node:crypto";import*as Qe from"node:fs";import*as Jr from"node:path";var Dt=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[r,n]of this._modelUsage)e[r]={...n};return e}addUsage(e,r){this._totalInputTokens+=e.inputTokens,this._totalOutputTokens+=e.outputTokens;let n=this._modelUsage.get(r);n?(n.inputTokens+=e.inputTokens,n.outputTokens+=e.outputTokens,n.cacheRead+=e.cacheRead??0,n.cacheCreation+=e.cacheWrite??0):this._modelUsage.set(r,{inputTokens:e.inputTokens,outputTokens:e.outputTokens,cacheRead:e.cacheRead??0,cacheCreation:e.cacheWrite??0,mediaCalls:0,mediaDurationSeconds:0,mediaCharacters:0}),this.notifyListeners()}addMediaUsage(e,r,n){let o=this._modelUsage.get(e),s=o??{inputTokens:0,outputTokens:0,cacheRead:0,cacheCreation:0,mediaCalls:0,mediaDurationSeconds:0,mediaCharacters:0};switch(o||this._modelUsage.set(e,s),s.mediaCalls+=1,r){case"per_second":s.mediaDurationSeconds+=n;break;case"per_character":s.mediaCharacters+=n;break;case"per_token":s.outputTokens+=n;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[r,n]of Object.entries(e.modelUsage))this._modelUsage.set(r,{...n});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{}}};import*as cS from"node:fs";import*as tp from"node:path";var Tr=class{getSessionsRoot(e){let r=Ce(e);if(!r)throw new Error(`Project not found: ${e}`);return I().getProjectSessionsRoot(r.workspaceDir)}getProjectWorkspaceDir(e){let r=Ce(e);if(!r)throw new Error(`Project not found: ${e}`);return r.workspaceDir}getSessionDir(e,r){return tp.join(this.getSessionsRoot(e),r)}resolveWorkspaceDir(e,r){if(r)return this.getProjectWorkspaceDir(r);let n=K();for(let o of n){let s=I().getProjectSessionsRoot(o.workspaceDir),i=tp.join(s,e);try{if(cS.existsSync(i))return o.workspaceDir}catch{}}return this.getActiveProjectWorkspaceDir()}getActiveProjectWorkspaceDir(){let e=oe();if(e)return e.workspaceDir;let r=K();if(r.length>0)return r[0].workspaceDir;throw new Error("No active project available")}getActiveProjectId(){let e=oe();if(e)return e.id;let r=K();if(r.length>0)return r[0].id;throw new Error("No active project available")}};import{randomUUID as lS}from"node:crypto";async function dS(t,e){let r=new Date(t.lastActiveAt).getTime();if(Date.now()-r<ym)return{split:!1,activeSessionId:t.sessionId};let s=lS(),i=new Date().toISOString();await qe(t.sessionId,{sealedAt:i},e);let a=t.taskSummary?`[\u4E0A\u4E00\u8F6E\u5BF9\u8BDD\u6458\u8981] ${t.taskSummary}`:void 0;return await qe(s,{sessionId:s,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:s,sealedSessionId:t.sessionId}}async function uS(t,e){if(t.type!=="group")return{split:!1,activeSessionId:t.sessionId};if(t.turnCount<bm)return{split:!1,activeSessionId:t.sessionId};let r=lS(),n=new Date().toISOString();await qe(t.sessionId,{sealedAt:n},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 qe(r,{sessionId:r,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:r,sealedSessionId:t.sessionId}}G();import*as pS from"node:fs";import*as mS from"node:path";var ea=class{constructor(e=new Tr,r=I()){this.locator=e;this.pathService=r}locator;pathService;getActiveProjectId(){return this.locator.getActiveProjectId()}getProjectWorkspaceDir(e){return this.locator.getProjectWorkspaceDir(e)}resolveWorkspaceDir(e,r){return this.locator.resolveWorkspaceDir(e,r)}async listThreads(e,r){let n=r??this.getActiveProjectId(),o=this.getProjectWorkspaceDir(n);return(await Pt(e,o)).map(i=>({id:i.sessionId,title:i.title,status:"active",turnCount:i.messageCount,createdAt:i.createdAt,lastActiveAt:i.lastActiveAt}))}resolveSessionWorkspaceDir(e,r,n){if(n)return this.resolveWorkspaceDir(r,n);let o=e.getActiveProjectRoot();if(o){let s=mS.join(this.pathService.getProjectSessionsRoot(o),jU(r));try{if(pS.existsSync(s))return o}catch{}}return this.resolveWorkspaceDir(r)}};function jU(t){return t.replace(/[^a-zA-Z0-9_-]/g,"_")}var $U=new Tr,lt=new ea($U);function Rt(t,e="Unknown error"){return t instanceof Error?t.message:e}function $n(t,e,r){return lt.resolveSessionWorkspaceDir(t,e,r)}function gS(t){let e=t.params,r=e?.id??rp();this.log(`[thread.create] id=${r} title=${e?.title??"(none)"}`),e?.cwd&&typeof e.cwd=="string"&&this.setActiveWorkdir(e.cwd),this.currentSessionId=r,this.sessionState=new Dt(r),this.sessionTaskDomain=void 0,this.memoryPrefetchState=Tt(),this.enableIdleDream(),t.id!==void 0&&this.sendResponse(t.id,{id:r,title:e?.title,status:"active",createdAt:new Date().toISOString()})}async function fS(t){let e=t.params,r=e?.limit??20;try{let n=await lt.listThreads(r,e?.projectId);t.id!==void 0&&this.sendResponse(t.id,{threads:n})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to list threads: ${Rt(n)}`})}}async function hS(t){let e=t.params,r=e?.sessionId??rp();try{let n=e?.projectId??lt.getActiveProjectId(),o=lt.getProjectWorkspaceDir(n);await qe(r,{sessionId:r,title:e?.title,type:e?.type,ownerId:e?.ownerId,groupKey:e?.groupKey,groupName:e?.groupName,groupPlatform:e?.groupPlatform,projectId:n},o),t.id!==void 0&&this.sendResponse(t.id,{sessionId:r,title:e?.title})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to create session: ${Rt(n)}`})}}async function yS(t){let e=t.params;if(t.id===void 0)return;let r=e?.platform??"desktop",n=e?.chatId,o=e?.chatType,s=e?.userId??"local";try{if(r==="desktop"&&n){let d=e?.projectId??lt.getActiveProjectId(),p=lt.getProjectWorkspaceDir(d),m=(await Pt(500,p)).find(f=>f.sessionId===n);if(m){this.sendResponse(t.id,{sessionId:n,title:m.title,type:m.type??"personal",ownerId:s,projectId:d});return}await qe(n,{sessionId:n,type:"personal",ownerId:s,projectId:d},p),this.sendResponse(t.id,{sessionId:n,type:"personal",ownerId:s,projectId:d});return}if(o==="group"&&n&&r){let d=`group:${r}:${n}`,p=K();for(let u of p){if(!u.workspaceDir)continue;let f=(await Pt(500,u.workspaceDir)).find(g=>g.groupKey===d&&!g.sealedAt);if(f){let g=er(f.sessionId,u.workspaceDir);if(g){let h=await dS(g,u.workspaceDir);if(h.split){this.sendResponse(t.id,{sessionId:h.activeSessionId,title:void 0,type:"group",ownerId:s,groupKey:d,groupPlatform:r,groupName:e?.groupName,projectId:u.id,previousSessionId:h.sealedSessionId});return}}this.sendResponse(t.id,{sessionId:f.sessionId,title:f.title,type:"group",ownerId:s,groupKey:d,groupPlatform:r,groupName:e?.groupName,projectId:u.id});return}}}let i=rp(),a=lt.getActiveProjectId(),c=lt.getProjectWorkspaceDir(a),l=o==="group"?`group:${r}:${n}`:void 0;await qe(i,{sessionId:i,type:o==="group"?"group":"personal",ownerId:s,groupKey:l,groupPlatform:o==="group"?r:void 0,groupName:e?.groupName,projectId:a},c),this.sendResponse(t.id,{sessionId:i,type:o==="group"?"group":"personal",ownerId:s,groupKey:l,groupPlatform:o==="group"?r:void 0,groupName:e?.groupName,projectId:a})}catch(i){this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to resolve session: ${Rt(i)}`})}}async function bS(t){let e=t.params,r=e?.limit??50;try{let n;if(e?.projectId){let s=Ce(e.projectId);if(!s){t.id!==void 0&&this.sendResponse(t.id,{sessions:[]});return}let i=s.workspaceDir;n=await Pt(r*2,i),n=n.filter(a=>a.projectId===e.projectId);for(let a of n)a.projectId=e.projectId}else{let s=K(),i=new Set,a=[];for(let c of s){if(!c.workspaceDir)continue;let l=await Pt(r,c.workspaceDir);for(let d of l)i.has(d.sessionId)||d.projectId&&(i.add(d.sessionId),a.push(d))}a.sort((c,l)=>c.lastActiveAt>l.lastActiveAt?-1:c.lastActiveAt<l.lastActiveAt?1:0),n=a}e?.archived===!0?n=n.filter(s=>s.archivedAt!=null):e?.archived===!1&&(n=n.filter(s=>s.archivedAt==null));let o=n.slice(0,r).map(s=>({sessionId:s.sessionId,title:s.title,type:s.type??"personal",lastActiveAt:s.lastActiveAt,pinnedAt:s.pinnedAt??null,archivedAt:s.archivedAt??null,sealedAt:s.sealedAt??null,projectId:s.projectId,previousSessionId:s.previousSessionId??null,carryoverSummary:s.carryoverSummary??null}));t.id!==void 0&&this.sendResponse(t.id,{sessions:o})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to list sessions: ${Rt(n)}`})}}async function vS(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let r=$n(this,e.sessionId,e.projectId),o=(await Pt(500,r)).find(s=>s.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,pinnedAt:o.pinnedAt??null,archivedAt:o.archivedAt??null,projectId:o.projectId}:null})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to get session: ${Rt(r)}`})}}async function kS(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let r=$n(this,e.sessionId,e.projectId),n=await Dr(e.sessionId,r);if(!n){t.id!==void 0&&this.sendResponse(t.id,{messages:[],total:0});return}let o=n.messages,s=e.limit&&e.limit>0?e.limit:o.length,i=o.slice(-s);t.id!==void 0&&this.sendResponse(t.id,{messages:i,total:o.length})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to get messages: ${Rt(r)}`})}}async function RS(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let r=$n(this,e.sessionId,e.projectId),n=await qe(e.sessionId,{...e.title!==void 0?{title:e.title}:{},...e.pinnedAt!==void 0?{pinnedAt:e.pinnedAt}:{},...e.archivedAt!==void 0?{archivedAt:e.archivedAt}:{}},r);n&&this.sendNotification("session.info",{sessionId:e.sessionId,title:n.title,pinnedAt:n.pinnedAt??null,archivedAt:n.archivedAt??null,projectId:e.projectId||void 0}),t.id!==void 0&&this.sendResponse(t.id,{ok:n!==null})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to update session: ${Rt(r)}`})}}async function SS(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: sessionId"});return}if(!e.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: projectId"});return}try{let r=$n(this,e.sessionId,e.projectId);await Sl(e.sessionId,r),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to delete session: ${Rt(r)}`})}}async function wS(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: projectId"});return}try{let r=lt.getProjectWorkspaceDir(e.projectId),n=(await Pt(1e4,r)).filter(s=>s.projectId===e.projectId),o=0;for(let s of n)await Sl(s.sessionId,r),o++;t.id!==void 0&&this.sendResponse(t.id,{ok:!0,deletedCount:o})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to delete all sessions: ${Rt(r)}`})}}async function TS(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let r=$n(this,e.sessionId,e.projectId);await qe(e.sessionId,{archivedAt:new Date().toISOString()},r),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to archive session: ${Rt(r)}`})}}async function PS(t){let e=t.params,r=e?.sessionId;if(!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"sessionId is required"});return}try{let n=$n(this,r,e?.projectId),o=await Dr(r,n);if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:`Session not found: ${r}`});return}o.messages&&o.messages.length>0&&this.sessionHistory.saveResumedSession(r,o.messages),t.id!==void 0&&this.sendResponse(t.id,{metadata:o.metadata,messages:o.messages})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to resume session: ${Rt(n)}`})}}function AS(t){let e=this.currentSessionId||"default",r=this.sessionState?.createSnapshot(),n,o=this.getActiveProjectRoot();o&&(n=Jr.join(As(o),e));let s={sessionId:e,model:this.currentModel||void 0,cwd:process.cwd(),paths:{sessionDir:n,agentHome:J(),settings:Be()},usage:r?{turnCount:r.turnCount,inputTokens:r.totalInputTokens,outputTokens:r.totalOutputTokens}:void 0};t.id!==void 0&&this.sendResponse(t.id,s)}function xS(t){let e=t.params,r=null;if(e?.projectId)r=Ce(e.projectId);else if(e?.projectName){let s=K(),i=e.projectName.toLowerCase();if(r=s.find(a=>a.name.toLowerCase()===i)??null,r||(r=s.find(a=>a.name.toLowerCase().includes(i))??null),!r){let a=s.map(c=>c.name).slice(0,10);t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.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:y.INVALID_PARAMS,message:"Missing required param: projectId or projectName"});return}if(!r||r.status!=="active"){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Project not found or archived: ${e.projectId??e.projectName}`});return}let n=e.workspaceDir??r.workspaceDir;if(!Qe.existsSync(n)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Workspace directory does not exist: ${n}`});return}let o=Et(r.id);if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.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 CS(t){let e=oe(),r=K();t.id!==void 0&&this.sendResponse(t.id,{sessionId:this.currentSessionId,activeProject:e,projects:r})}async function IS(t){let e=t.params,r=e?.sessionId;if(!r){t.id!==void 0&&this.sendResponse(t.id,{ok:!1});return}let n=K();for(let o of n)try{let s=lt.getProjectWorkspaceDir(o.id),i=await er(r,s);if(i&&i.projectId===o.id){Et(o.id),this.setActiveWorkdir(s),this.log(`[session.focus] switched to project ${o.id} for session ${r}`),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,projectId:o.id});return}}catch{}if(e?.projectName){let o=n.find(s=>s.name===e.projectName);if(o){let s=lt.getProjectWorkspaceDir(o.id);this.getActiveProjectRoot()!==s&&(this.setActiveWorkdir(s),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 ES(t){let e=t.params,{sessionId:r,fromProjectId:n,toProjectId:o}=e??{};if(!r||!n||!o){t.id!==void 0&&this.sendError(t.id,y.INVALID_PARAMS,"sessionId, fromProjectId, and toProjectId are required");return}if(n===o){t.id!==void 0&&this.sendResponse(t.id,{ok:!0});return}let s=Ce(n),i=Ce(o);if(!s||!i){t.id!==void 0&&this.sendError(t.id,y.INVALID_PARAMS,"Source or target project not found");return}let a=Jr.join(lt.getProjectWorkspaceDir(n),".qlogicagent","sessions",r),c=Jr.join(lt.getProjectWorkspaceDir(o),".qlogicagent","sessions",r);if(!Qe.existsSync(a)){t.id!==void 0&&this.sendError(t.id,y.INVALID_PARAMS,`Session ${r} not found in project ${n}`);return}try{Qe.mkdirSync(Jr.dirname(c),{recursive:!0}),Qe.cpSync(a,c,{recursive:!0});let l=Jr.join(c,"metadata.json");if(Qe.existsSync(l)){let d=JSON.parse(Qe.readFileSync(l,"utf-8"));d.projectId=o,Qe.writeFileSync(l,JSON.stringify(d,null,2))}Qe.rmSync(a,{recursive:!0,force:!0}),this.sendNotification("session-update",{sessionId:r,projectId:o}),this.log(`[session.moveToProject] moved ${r}: ${n} \u2192 ${o}`),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,projectId:o})}catch(l){let d=Rt(l);this.log(`[session.moveToProject] error: ${d}`),t.id!==void 0&&this.sendError(t.id,y.INTERNAL_ERROR,`Move failed: ${d}`)}}je();function UU(t){return t.length<=8?"****":`${t.slice(0,3)}***${t.slice(-4)}`}function Pe(t,e,r,n=y.INTERNAL_ERROR){if(e.id!==void 0){if(typeof t.sendError=="function"){t.sendError(e.id,n,r);return}t.sendResponse(e.id,void 0,{code:n,message:r})}}function op(t,e){Pe(t,e,_s)}function FU(t){let e={};for(let r of t)for(let n of r.purposes)e[n]??=[],e[n].push(r);return e}async function HU(){let t=N(),e=await go(t);return t.save(),e}async function MS(t){try{return await HU(),!0}catch(e){if(t)throw e;return!1}}function sp(t=N()){try{return Rg()}catch{return t.getKnownProviderDef(Q)?.baseUrl??"https://www.qlogicagent.com"}}function ip(t){return t.id===Q?Q:t.group?.trim()||t.id}function BU(t){return t.id===ip(t)}function _S(t){let e=ip(t);return xl({...t,id:e})}function qU(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]??xl(t)}function WU(t){return t.authType==="none"?!1:t.apiKeyEnvVars===void 0||t.apiKeyEnvVars.length>0}function GU(t){return{id:t.id,displayName:qU(t),baseUrl:mn(t)??"",modelCount:t.models?.length??0}}function KU(t){let e=new Map;for(let r of t){if(!WU(r))continue;let n=ip(r);if(n===Q)continue;let o=r.models?.length??0,s=GU(r),i=e.get(n);if(!i){e.set(n,{id:n,displayName:_S(r),baseUrl:mn(r)??"",modelCount:o,variants:[s]});continue}i.modelCount+=o,i.variants??=[],i.variants.some(a=>a.id===s.id)||i.variants.push(s),BU(r)&&(i.displayName=_S(r),i.baseUrl=mn(r)??i.baseUrl)}return Array.from(e.values()).map(r=>({...r,variants:r.variants&&r.variants.length>1?r.variants:void 0}))}async function DS(t){let e=N(),r=e.getKeyForProvider(Q);if(!r){if(t)throw new Error("LLMRouter API Key is required to fetch available models.");return!1}let n=e.getProviderStatus(Q)?.baseUrl??sp(e);try{if((await Il(e,{baseUrl:n,apiKey:r})).length===0){if(t)throw new Error("LLMRouter did not return any available models for this API Key.");return!1}return e.save(),!0}catch(o){if(t)throw o;return!1}}async function NS(t=!1){let e=N();if(!!e.getProviderStatus(Q)?.keys.length)return await DS(!1)?!0:MS(t);let o=e.getAllProviderStatus().filter(s=>s.keys.length>0).map(s=>s.providerId).some(s=>s!=="deepseek"&&s!==Q);return!t&&!o?!1:MS(t)}function zU(t){return t.defaultModel??t.models?.find(e=>!!e.id)?.id}function VU(t){return[...new Set(t)]}function YU(t){let e=t.replace(/\/+$/,"");return VU([`${e}/models`,/\/v\d+$/.test(e)?`${e}/models`:`${e}/v1/models`])}function XU(t){return t===404||t===405||t===410||t===501}async function JU(t){let e=N().getKnownProviderDef(t);if(e)return e;let r=await Cl(t).catch(()=>null);if(r)return{id:r.id,transport:r.transport,baseUrl:mn(r),authType:r.authType,models:r.models}}function np(t){return{accept:"application/json",Authorization:`Bearer ${t}`}}function QU(t,e,r,n){if(t===Q)return[{method:"GET",url:Pl(r),headers:np(e)}];let o=r.replace(/\/+$/,""),s=n?.transport,i=zU(n??{id:t}),a=[];if(s==="anthropic-messages")return/\/anthropic$/.test(o)&&a.push({method:"GET",url:`${o.replace(/\/anthropic$/,"")}/models`,headers:np(e)}),i&&a.push({method:"POST",url:`${o}/v1/messages`,headers:{"Content-Type":"application/json","x-api-key":e,"anthropic-version":"2023-06-01"},body:{model:i,messages:[{role:"user",content:"ping"}],max_tokens:1,stream:!1}}),a;if(s==="gemini-generatecontent")return i?[{method:"POST",url:`${o}/models/${encodeURIComponent(i)}:generateContent`,headers:{"Content-Type":"application/json","x-goog-api-key":e},body:{contents:[{role:"user",parts:[{text:"ping"}]}],generationConfig:{maxOutputTokens:1}}}]:a;if(s==="volcengine-responses")return i?[{method:"POST",url:`${o.replace(/\/v\d+$/,"")}/v3/responses`,headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:{model:i,input:[{role:"user",content:[{type:"input_text",text:"ping"}]}],max_output_tokens:1,stream:!1,store:!1}}]:a;for(let c of YU(o))a.push({method:"GET",url:c,headers:np(e)});return a}async function ZU(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 r=await e.text().catch(()=>"");return{valid:!1,status:e.status,error:r.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 LS(t,e,r){let n=await JU(t),o=QU(t,e,r,n);if(o.length===0)return{valid:!1,status:0,error:`No validation probe is available for provider "${t}".`};let s;for(let i of o){let a=await ZU(i);if(a.valid)return a;if(XU(a.status)){s=a;continue}return a}return s??{valid:!1,status:0,error:`No validation probe succeeded for provider "${t}".`}}async function eF(t,e,r){let n=await LS(t,e,r);if(!n.valid){let o=n.error?`: ${n.error}`:"";throw new Error(`API Key validation failed (${n.status})${o}`)}}async function OS(t){try{let e=N(),r=["deepseek",Q].map(s=>e.getKnownProviderDef(s)).filter(s=>!!s).map(s=>({id:s.id,displayName:s.name,baseUrl:s.baseUrl,modelCount:s.models?.length??0})),n=await Al().catch(()=>[]),o=KU(n);o.unshift({id:Q,displayName:Tl,baseUrl:sp(e),modelCount:n.reduce((s,i)=>s+(i.models?.length??0),0)});for(let s of r.reverse()){let i=o.findIndex(a=>a.id===s.id);if(i>=0){s.id!==Q&&o.splice(i,1,s);continue}o.unshift(s)}t.id!==void 0&&this.sendResponse(t.id,{providers:o})}catch(e){Pe(this,t,e instanceof Error?e.message:String(e))}}async function jS(t){let e=t.params;if(!e?.providerId||!e?.key){Pe(this,t,"Required: providerId (string), key (string)",y.INVALID_PARAMS);return}let{providerId:r,key:n,label:o}=e,s=N(),i,a=!1;try{let c=await VS(r);if(!c){Pe(this,t,`Unknown provider: ${r}`,y.INVALID_PARAMS);return}let l=s.getProviderStatus(r);if(l?.keys.some(d=>d.key===n)){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,error:"\u8BE5 Key \u5DF2\u5B58\u5728\uFF0C\u65E0\u9700\u91CD\u590D\u6DFB\u52A0"});return}if(a=!l,s.addProvider(r,{baseUrl:c}),i=s.addKey(r,n,{label:o}),r===Q){if((await Il(s,{baseUrl:c,apiKey:n})).length===0)throw new Error("LLMRouter did not return any available models for this API Key.")}else await eF(r,n,c);for(let d of mo)if(!s.getBinding(d)){let p=s.listModels({purpose:d,provider:r,enabledOnly:!0});p.length===0&&(p=s.listModels({purpose:d,provider:r}),p[0]&&s.enableModel(p[0].id)),p.length>0&&s.setBinding(d,p[0].id)}s.setKeyHealth(i,"healthy"),s.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,keyId:i,providerId:r})}catch(c){i&&(s.removeKey(i),a&&s.removeProvider(r));let l=c instanceof Error?c.message:_s;Pe(this,t,l)}}function $S(t){let e=t.params;if(!e?.keyId){Pe(this,t,"Required: keyId (string)",y.INVALID_PARAMS);return}let r=N();if(!r.removeKey(e.keyId)){Pe(this,t,"API Key not found",y.INVALID_PARAMS);return}r.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}function US(t){let e=t.params;if(!e?.keyId){Pe(this,t,"Required: keyId (string)",y.INVALID_PARAMS);return}let r=N().getKeyById(e.keyId);if(!r){Pe(this,t,"API Key not found",y.INVALID_PARAMS);return}t.id!==void 0&&this.sendResponse(t.id,{key:r})}function FS(t){let e=t.params;if(!e?.keyId||typeof e.enabled!="boolean"){Pe(this,t,"Required: keyId (string), enabled (boolean)",y.INVALID_PARAMS);return}let r=N();if(!r.updateKey(e.keyId,{enabled:e.enabled})){Pe(this,t,"API Key not found",y.INVALID_PARAMS);return}r.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}function HS(t){let e=t.params;if(!e?.modelId||typeof e.enabled!="boolean"){Pe(this,t,"Required: modelId (string), enabled (boolean)",y.INVALID_PARAMS);return}let r=N();e.enabled?r.enableModel(e.modelId):r.disableModel(e.modelId),r.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}async function BS(t){let e=t.params;try{await NS(!1);let r=N(),n=new Set(r.getAllProviderStatus().filter(s=>s.keys.length>0).map(s=>s.providerId)),o=r.listModels({purpose:e?.purpose,provider:e?.provider}).filter(s=>r.hasConfiguredKeyForProviderVariant(s.provider));t.id!==void 0&&this.sendResponse(t.id,{models:o,grouped:FU(o),configuredProviderIds:[...n]})}catch{op(this,t)}}function qS(t){let e=t.params;if(!e?.purpose||!e?.modelId){Pe(this,t,"Required: purpose (string), modelId (string)",y.INVALID_PARAMS);return}try{let r=N();r.setBinding(e.purpose,e.modelId),r.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(r){Pe(this,t,r instanceof Error?r.message:String(r),y.INVALID_PARAMS)}}function WS(t){let e=t.params;if(!e?.purpose){Pe(this,t,"Required: purpose (string)",y.INVALID_PARAMS);return}let r=N(),n=r.getBinding(e.purpose);t.id!==void 0&&this.sendResponse(t.id,{model:n?{id:n.id,provider:n.provider,model:n.model,displayName:n.displayName,purposes:n.purposes,enabled:n.enabled}:null,available:r.isAvailable(e.purpose)})}async function GS(t){try{await NS(!1);let e=N(),r=e.getAllProviderStatus().map(s=>({providerId:s.providerId,displayName:s.providerId===Q?Tl:s.providerId,baseUrl:s.baseUrl,keyCount:s.keys.length,healthyKeys:s.keys.filter(i=>i.healthStatus==="healthy"&&i.enabled).length,totalKeys:s.keys.length,keys:s.keys.map(i=>({id:i.id,label:i.label,maskedKey:UU(i.key),enabled:i.enabled,health:i.healthStatus}))})),n=e.getAllBindings(),o={};for(let s of mo){let i=n[s];o[s]={bound:!!i,modelId:i?.id,modelName:i?.displayName,available:e.isAvailable(s)}}t.id!==void 0&&this.sendResponse(t.id,{providers:r,purposes:o})}catch{op(this,t)}}async function KS(t){try{let e=N();e.load(),await DS(!1)||await go(e),e.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,catalogRefreshed:!0})}catch{op(this,t)}}async function zS(t){let e=t.params;if(!e?.providerId||!e?.apiKey){Pe(this,t,"providerId and apiKey required",y.INVALID_PARAMS);return}try{let r=e.baseUrl||await VS(e.providerId);if(!r){Pe(this,t,`Unknown provider: ${e.providerId}`,y.INVALID_PARAMS);return}let n=await LS(e.providerId,e.apiKey,r);t.id!==void 0&&this.sendResponse(t.id,n)}catch(r){let n=r instanceof Error?r.message:String(r);t.id!==void 0&&this.sendResponse(t.id,{valid:!1,status:0,error:n})}}async function VS(t){if(t===Q)return sp();let e=N().getKnownProviderDef(t);if(e?.baseUrl)return e.baseUrl;let r=await Cl(t);return r?mn(r):void 0}G();import*as ce from"node:fs";import*as Ue from"node:path";import{join as tF}from"node:path";import{readFileSync as rF,writeFileSync as nF,mkdirSync as oF}from"node:fs";var Qr=null,ap=!1;function YS(t){return tF(t,"skill-stats.json")}function cp(t){if(Qr)return Qr;try{Qr=JSON.parse(rF(YS(t),"utf8"))}catch{Qr={}}return Qr}function sF(t){if(!(!ap||!Qr))try{oF(t,{recursive:!0}),nF(YS(t),JSON.stringify(Qr,null,2),"utf8"),ap=!1}catch{}}function lp(t,e,r){let n=cp(t);n[e]||(n[e]={invokeCount:0,activeCount:0,positiveCount:0,negativeCount:0}),n[e].invokeCount++,n[e].lastUsedAt=new Date().toISOString(),r?n[e].positiveCount++:n[e].negativeCount++,n[e].invokeCount>0&&(n[e].successRate=(n[e].invokeCount-n[e].negativeCount)/n[e].invokeCount),ap=!0,sF(t)}function XS(t,e){return cp(t)[e]}function JS(t){return cp(t)}import*as Vt from"node:fs";import*as ta from"node:path";function iF(t){try{let e=Vt.readFileSync(t,"utf8"),r=e.match(/^---\n[\s\S]*?^version:\s*(\S+)/m),n=e.match(/^---\n[\s\S]*?^description:\s*(.+)/m);return{version:r?.[1],description:n?.[1]?.trim()}}catch{return{}}}function ra(t){let e=I(),r=[],n=t?e.getProjectSkillsDir(t):void 0,o=e.getUserSkillsDir();return n&&QS(r,n,"project"),QS(r,o,"global"),r}function QS(t,e,r){if(Vt.existsSync(e))for(let n of Vt.readdirSync(e)){let o=ta.join(e,n);try{if(!Vt.statSync(o).isDirectory())continue}catch{continue}let s=ta.join(o,"SKILL.md"),i=ta.join(o,"SKILL.md.disabled"),a=Vt.existsSync(s)?s:null;if(!a&&!Vt.existsSync(i))continue;let c=a?iF(a):{};t.push({id:`${r}:${n}`,name:n,path:o,active:!!a,scope:r,category:"automation",displayName:aF(n),displayDescription:cF(n,c.description),fallbackName:n,fallbackDescription:c.description??"",systemGenerated:lF(n),version:c.version,description:c.description})}}function aF(t){return{key:`capability.skill.${t}.name`,fallback:t}}function cF(t,e){return{key:`capability.skill.${t}.description`,fallback:e??""}}function lF(t){return t.startsWith("auto-skill-")||t.startsWith("test-skill-")}function dF(t){return t==="active"||t==="stale"||t==="archived"}function ZS(t){let r=t.params?.projectId,n=this.getActiveProjectRoot();if(r&&this.projectLocator){let s=this.projectLocator.resolveProjectRoot(r);s&&(n=s)}let o=ra(n);t.id!==void 0&&this.sendResponse(t.id,{skills:o})}function ew(t){let r=t.params?.name;if(!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: name"});return}let n=this.getActiveProjectRoot(),o=n?gr(n):void 0;if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"No active project workspace"});return}let s=Ue.join(o,r),i=Ue.join(s,"SKILL.md.disabled"),a=Ue.join(s,"SKILL.md");if(ce.existsSync(a)){t.id!==void 0&&this.sendResponse(t.id,{ok:!0,already:!0});return}if(ce.existsSync(i))try{ce.renameSync(i,a);let c=q(),l=ue(c),d=Mt(l,r);d.state!=="active"&&(d.state="active",d.staleAt=void 0,d.archivedAt=void 0),ve(c,l),t.id!==void 0&&this.sendResponse(t.id,{ok:!0}),this.sendNotification("skills.updated",{action:"activate",name:r})}catch(c){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to activate skill: ${c instanceof Error?c.message:c}`})}else t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Skill "${r}" not found`})}function tw(t){let r=t.params?.name;if(!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: name"});return}let n=this.getActiveProjectRoot(),o=n?gr(n):void 0;if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"No active project workspace"});return}let s=Ue.join(o,r),i=Ue.join(s,"SKILL.md"),a=Ue.join(s,"SKILL.md.disabled");if(!ce.existsSync(i)){t.id!==void 0&&this.sendResponse(t.id,{ok:!0,already:!0});return}try{ce.renameSync(i,a),t.id!==void 0&&this.sendResponse(t.id,{ok:!0}),this.sendNotification("skills.updated",{action:"deactivate",name:r})}catch(c){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to deactivate skill: ${c instanceof Error?c.message:c}`})}}function rw(t){let e=t.params,r=e?.name;if(!r||/[\/\\]|\.\./.test(r)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing or invalid skill name"});return}let n=q(),o=ue(n);if(o.records[r]?.pinned){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:`Skill "${r}" is pinned. Unpin it first.`});return}let s=e?.scope??"project",i;if(s==="global")i=Ue.join(mr(),r);else{let a=this.getActiveProjectRoot(),c=a?gr(a):void 0;if(!c){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"No active project workspace"});return}i=Ue.join(c,r)}if(!ce.existsSync(i)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Skill "${r}" not found in ${s} scope`});return}try{ce.rmSync(i,{recursive:!0,force:!0}),bt(),ni(o,r),ve(n,o),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,deleted:r,scope:s}),this.sendNotification("skills.updated",{action:"delete",name:r})}catch(a){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to delete skill: ${a instanceof Error?a.message:a}`})}}function nw(t){let e=t.params,r=e?.name;if(!r||/[\/\\]|\.\./.test(r)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing or invalid skill name"});return}let n=this.getActiveProjectRoot(),o=n?gr(n):void 0;if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"No active project workspace"});return}let s=Ue.join(o,r),i=Ue.join(s,"SKILL.md");if(!ce.existsSync(i)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Skill "${r}" not found in project scope`});return}let a=mr(),c=Ue.join(a,r);try{ce.mkdirSync(c,{recursive:!0});let l=ce.readdirSync(s);for(let d of l){let p=ce.readFileSync(Ue.join(s,d));ce.writeFileSync(Ue.join(c,d),p)}e?.keepLocal||ce.rmSync(s,{recursive:!0,force:!0}),bt(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,promoted:r,globalPath:c,removedFromProject:!e?.keepLocal})}catch(l){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to promote skill: ${l instanceof Error?l.message:l}`})}}function ow(t){let e=t.params,r=q();if(e?.name){let n=XS(r,e.name);t.id!==void 0&&this.sendResponse(t.id,{name:e.name,stats:n??null})}else{let n=JS(r);t.id!==void 0&&this.sendResponse(t.id,{stats:n})}}function sw(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 r=q(),n=ue(r);Mt(n,e.name),Mh(n,e.name),ve(r,n),t.id!==void 0&&this.sendResponse(t.id,{name:e.name,pinned:!0})}function iw(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 r=q(),n=ue(r);_h(n,e.name),ve(r,n),t.id!==void 0&&this.sendResponse(t.id,{name:e.name,pinned:!1})}function aw(t){let e=q(),r=this.getActiveProjectRoot(),n=r?Ue.join(r,".qlogicagent","skills"):mr(),o=Dh(e,n);o.transitioned.length>0&&bt(),t.id!==void 0&&this.sendResponse(t.id,o)}function cw(t){let e=t.params,r=q(),n=ue(r);if(e?.name){let o=n.records[e.name]??null;t.id!==void 0&&this.sendResponse(t.id,{record:o})}else if(e?.state){if(!dF(e.state)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Invalid skill lifecycle state"});return}let o=Nh(n,e.state);t.id!==void 0&&this.sendResponse(t.id,{records:o})}else t.id!==void 0&&this.sendResponse(t.id,{records:Object.values(n.records)})}import*as mw from"node:path";import{randomUUID as hF}from"node:crypto";import{join as dp}from"node:path";import{mkdir as uF,readdir as pF}from"node:fs/promises";function mF(t){return t?.pathService??I()}function gF(t,e){return t??e.getActiveProjectRoot()}function lw(t,e){let r=mF(e);return dp(r.getProjectAgentDir(gF(t,r)),"solos")}function up(t,e,r){return dp(lw(e,r),t)}function dw(t,e,r){return dp(up(t,e,r),"solo-state.json")}async function uw(t,e,r){let n=up(t.soloId,e,r);await uF(n,{recursive:!0}),await Sr(dw(t.soloId,e,r),t)}async function fF(t,e,r){return ir(dw(t,e,r))}async function pw(t,e){let r=lw(t,e),n;try{n=await pF(r)}catch{return[]}let o=[];for(let s of n){let i=await fF(s,t,e);i&&o.push(i)}return o}async function pp(t,e,r){let{rm:n}=await import("node:fs/promises"),o=up(t,e,r);try{return await n(o,{recursive:!0,force:!0}),!0}catch{return!1}}var na=class{constructor(e,r,n,o={}){this.processManager=e;this.acpDetector=r;this.configStore=n;this.callbacks=o}processManager;acpDetector;configStore;callbacks;sessions=new Map;persistSession(e){let r={soloId:e.soloId,state:e.state,task:e.task,cwd:e.cwd,gitRoot:e.gitRoot,agents:e.agents.map(n=>({agentId:n.agentId,memberId:n.memberId,worktreePath:n.worktreePath,worktreeBranch:n.worktreeBranch,state:n.state,resultText:n.resultText,diff:n.diff,usage:n.usage,error:n.error,turns:n.turns})),evaluation:e.evaluation,createdAt:e.createdAt};uw(r,e.cwd).catch(()=>{})}async restoreFromDisk(e){let r=await pw(e);for(let n of r)this.sessions.has(n.soloId)||this.sessions.set(n.soloId,{soloId:n.soloId,state:n.state,task:n.task,cwd:n.cwd,gitRoot:n.gitRoot,agents:n.agents.map(o=>({...o,turns:o.turns??[]})),evaluation:n.evaluation,createdAt:n.createdAt});return r.length}async deleteSolo(e){return this.sessions.delete(e),pp(e)}async start(e){let{task:r,agents:n,cwd:o,sharedConfig:s}=e;if(n.length<2)throw new Error("Solo Mode requires at least 2 agents");let i=await qo(o);if(!i)throw new Error("Solo Mode requires a git repository");let a=r;if(s){let u=[];s.rules?.length&&u.push(`<rules>
479
479
  ${s.rules.join(`
480
480
  `)}
481
481
  </rules>`),s.memory?.length&&u.push(`<memory>
@@ -226,6 +226,7 @@ export interface GatewayRpcMethodMap {
226
226
  "session.delete": {
227
227
  params: {
228
228
  sessionId: string;
229
+ projectId: string;
229
230
  };
230
231
  result: {
231
232
  ok: boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qlogicagent",
3
- "version": "2.11.1",
3
+ "version": "2.11.2",
4
4
  "description": "XiaozhiClaw Agent CLI — subprocess architecture (JSON-RPC over stdio)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",