qlogicagent 2.10.38 → 2.10.39

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
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- var qP=Object.defineProperty;var Wo=(t,e)=>()=>(t&&(e=t(t=0)),e);var WP=(t,e)=>{for(var r in e)qP(t,r,{get:e[r],enumerable:!0})};import{homedir as Ix}from"node:os";import{join as re}from"node:path";import{existsSync as Ex}from"node:fs";function X(){return process.env.QLOGICAGENT_HOME||re(Ix(),zt)}function Vr(){let t=process.env.QLOGIC_LLMROUTER_USER_ID?.trim();if(t)return t;let e=process.env.QLOGIC_IMPLICIT_OWNER_ID?.trim();if(e)return e;let r=process.env.QLOGIC_DEVICE_ID?.trim();return r?`oc_${r}`:"oc_local"}function Mx(t){let e=t.trim();if(!e)throw new Error("ownerUserId is required for profile-scoped storage");return encodeURIComponent(e).replace(/\./g,"%2E")}function B(t=Vr()){return re(X(),"profiles",Mx(t))}function em(t=Vr()){return re(B(t),"memory")}function Vo(){return re(B(),"plugins")}function sr(){return re(B(),"skills")}function $e(){return re(B(),"settings.json")}function tm(){return re(B(),"plugin-cache")}function rm(){return re(B(),"mcp.json")}function nm(){return re(B(),"marketplace.json")}function Dn(){return re(B(),"assistant-presets.json")}function om(){return re(B(),"rules")}function De(t){if(!t)throw new Error("getProjectAgentDir: cwd is required (must not fall back to process.cwd())");return re(t,zt)}function Xo(t){return re(De(t),"plugins")}function ir(t){return re(De(t),"skills")}function sm(t){return re(De(t),"settings.json")}function br(t){return re(De(t),"INSTRUCTIONS.md")}function Xr(t){return re(De(t),"rules")}function Yo(t){return re(De(t),"sessions")}function im(t,e){let r=re(De(t),"checkpoints");return e?re(r,e):r}function am(t){return re(t,zt,"hooks")}function Cc(t,e){return t.filter(r=>r!==e&&Ex(re(r,zt,"skills")))}function cm(t,e){return Cc(t,e).map(r=>ir(r))}var zt,G=Wo(()=>{"use strict";zt=".qlogicagent"});import{ProviderRegistry as Ux,ProviderVariantResolver as Fx}from"@xiaozhiclaw/provider-core";var Zo,ym=Wo(()=>{"use strict";Zo=class{registry=new Ux;resolver=new Fx(this.registry);getProvider(e){return this.registry.getProvider(e)}listProviders(){return this.registry.listProviders()}listModels(e){return this.registry.listModels(e)}resolveBest(e){let r=this.resolver.resolveBest(e);return r?{provider:r.provider,nativeModelId:r.nativeModelId}:void 0}}});var es,vm=Wo(()=>{"use strict";es=class{pools=new Map;runtimeStates=new Map;constructor(e){if(e)for(let r of e){this.pools.set(r.providerId,r);for(let n of r.keys)this.runtimeStates.set(n.id,this.createInitialState())}}acquireKey(e){let r=this.pools.get(e);if(!r||r.keys.length===0)return null;let n=Date.now(),o=this.getHealthyCandidates(r,n);if(o.length===0)return null;let s=this.selectByStrategy(o,r.strategy,n);if(!s)return null;let i=this.runtimeStates.get(s.id);return i.inFlight++,i.totalRequests++,i.lastUsedAt=n,i.requestTimestamps.push(n),{keyId:s.id,apiKey:s.key,providerId:e,release:a=>this.releaseKey(s.id,a)}}releaseKey(e,r){let n=this.runtimeStates.get(e);if(n)if(n.inFlight=Math.max(0,n.inFlight-1),r.success)n.consecutiveErrors=0,n.healthStatus="healthy",r.tokens&&(n.totalTokens+=r.tokens,n.tokenCounts.push(r.tokens));else if(n.consecutiveErrors++,n.lastErrorAt=Date.now(),r.errorCode===429){let o=r.retryAfter?r.retryAfter*1e3:3e4;n.cooldownUntil=Date.now()+o,n.healthStatus="cooldown"}else n.consecutiveErrors>=5?(n.cooldownUntil=Date.now()+6e4,n.healthStatus="cooldown"):n.consecutiveErrors>=3&&(n.healthStatus="degraded")}addProvider(e,r){this.pools.has(e)||this.pools.set(e,{providerId:e,baseUrl:r?.baseUrl,strategy:r?.strategy??"weighted-round-robin",keys:[],rateLimit:r?.rateLimit})}removeProvider(e){let r=this.pools.get(e);if(r){for(let n of r.keys)this.runtimeStates.delete(n.id);this.pools.delete(e)}}addKey(e,r,n){let o=this.pools.get(e);o||(o={providerId:e,strategy:"weighted-round-robin",keys:[]},this.pools.set(e,o));let s=n?.id??crypto.randomUUID(),i={id:s,key:r,label:n?.label,weight:n?.weight??1,enabled:n?.enabled??!0};return o.keys.push(i),this.runtimeStates.set(s,this.createInitialState()),s}removeKey(e){for(let r of this.pools.values()){let n=r.keys.findIndex(o=>o.id===e);if(n!==-1){r.keys.splice(n,1),this.runtimeStates.delete(e);return}}}updateKey(e,r){for(let n of this.pools.values()){let o=n.keys.find(s=>s.id===e);if(o){if(r.label!==void 0&&(o.label=r.label),r.weight!==void 0&&(o.weight=r.weight),r.enabled!==void 0){o.enabled=r.enabled;let s=this.runtimeStates.get(e);s&&(s.healthStatus=r.enabled?"healthy":"disabled")}return}}}setKeyHealth(e,r){let n=this.runtimeStates.get(e);n&&(n.healthStatus=r)}setStrategy(e,r){let n=this.pools.get(e);n&&(n.strategy=r)}setRateLimit(e,r){let n=this.pools.get(e);n&&(n.rateLimit=r)}getPoolStatus(e){let r=this.pools.get(e);return r?this.buildPoolStatus(r):null}getAllStatus(){return[...this.pools.values()].map(e=>this.buildPoolStatus(e))}getProviderIds(){return[...this.pools.keys()]}hasProvider(e){return this.pools.has(e)}hasAvailableKey(e){let r=this.pools.get(e);return r?this.getHealthyCandidates(r,Date.now()).length>0:!1}exportConfig(){return[...this.pools.values()]}reloadConfig(e){let r=new Set;for(let n of e){this.pools.set(n.providerId,n);for(let o of n.keys)r.add(o.id),this.runtimeStates.has(o.id)||this.runtimeStates.set(o.id,this.createInitialState())}for(let n of[...this.pools.keys()])e.some(o=>o.providerId===n)||this.pools.delete(n);for(let n of[...this.runtimeStates.keys()])r.has(n)||this.runtimeStates.delete(n)}createInitialState(){return{inFlight:0,totalRequests:0,totalTokens:0,lastUsedAt:0,lastErrorAt:0,consecutiveErrors:0,cooldownUntil:0,healthStatus:"healthy",requestTimestamps:[],tokenCounts:[]}}getHealthyCandidates(e,r){let n=[];for(let o of e.keys){if(!o.enabled)continue;let s=this.runtimeStates.get(o.id);if(s){if(s.healthStatus==="cooldown")if(r>=s.cooldownUntil)s.healthStatus="healthy",s.consecutiveErrors=0;else continue;s.healthStatus!=="disabled"&&(e.rateLimit?.rpm&&(this.pruneWindow(s.requestTimestamps,r),s.requestTimestamps.length>=e.rateLimit.rpm*.9)||e.rateLimit?.tpm&&(this.pruneWindow(s.tokenCounts,r),s.tokenCounts.reduce((a,c)=>a+c,0)>=e.rateLimit.tpm*.9)||n.push(o))}}return n}selectByStrategy(e,r,n){if(e.length===0)return null;if(e.length===1)return e[0];switch(r){case"weighted-round-robin":return this.weightedRandom(e);case"least-busy":return this.leastBusy(e);case"random":return e[Math.floor(Math.random()*e.length)];default:return this.weightedRandom(e)}}weightedRandom(e){let r=e.reduce((o,s)=>o+s.weight,0),n=Math.random()*r;for(let o of e)if(n-=o.weight,n<=0)return o;return e[e.length-1]}leastBusy(e){let r=1/0,n=e[0];for(let o of e){let i=this.runtimeStates.get(o.id)?.inFlight??0;(i<r||i===r&&o.weight>n.weight)&&(r=i,n=o)}return n}pruneWindow(e,r){let n=r-6e4;for(;e.length>0&&e[0]<n;)e.shift()}buildPoolStatus(e){return{providerId:e.providerId,baseUrl:e.baseUrl,strategy:e.strategy,rateLimit:e.rateLimit,keys:e.keys.map(r=>{let n=this.runtimeStates.get(r.id)??this.createInitialState();return{...r,inFlight:n.inFlight,totalRequests:n.totalRequests,totalTokens:n.totalTokens,lastUsedAt:n.lastUsedAt,lastErrorAt:n.lastErrorAt,consecutiveErrors:n.consecutiveErrors,cooldownUntil:n.cooldownUntil,healthStatus:r.enabled?n.healthStatus:"disabled"}})}}}});var km={};WP(km,{ALL_PURPOSES:()=>On,ModelRegistry:()=>ts,deriveModelPurposes:()=>bm,getModelRegistry:()=>D,resetModelRegistry:()=>Hx});import*as Je from"node:fs";function D(){return Ln||(Ln=new ts,Ln.load()),Ln}function Hx(){Ln=null}function bm(t){let e=[];switch((!t.mediaType||t.mediaType==="image_understanding"||t.mediaType==="video_understanding")&&e.push("textGeneration"),(t.vision||t.mediaType==="image_understanding")&&e.push("imageUnderstanding"),t.mediaType==="video_understanding"&&e.push("videoUnderstanding"),t.mediaType){case"image":e.push("imageGeneration");break;case"video":e.push("videoGeneration");break;case"tts":e.push("tts");break;case"stt":e.push("stt");break;case"music":case"music_realtime":e.push("musicGeneration");break;case"voice_clone":e.push("voiceClone");break;case"embedding":e.push("embedding");break;case"3d":e.push("threeDGeneration");break;case"realtime_audio":e.push("realtimeAudio");break}return e.includes("textGeneration")&&e.push("smallModel"),[...new Set(e.length>0?e:["textGeneration"])]}function Bx(t){switch(t){case"openai-chat":case"openai-responses":case"anthropic-messages":case"volcengine-responses":return t;default:return}}function qx(t,e){switch(t){case"imageUnderstanding":case"videoUnderstanding":case"imageGeneration":case"videoGeneration":case"threeDGeneration":case"stt":case"tts":case"voiceClone":case"musicGeneration":case"realtimeAudio":case"realtimeVideo":case"embedding":return;default:return Bx(e)}}function Wx(t){switch(t){case"imageUnderstanding":case"videoUnderstanding":return["vision"];case"imageGeneration":case"videoGeneration":case"threeDGeneration":case"stt":case"tts":case"voiceClone":case"musicGeneration":case"realtimeAudio":case"realtimeVideo":case"embedding":return["media"];default:return[]}}var On,ts,Ln,Fe=Wo(()=>{"use strict";G();ym();vm();On=["textGeneration","smallModel","stt","tts","imageGeneration","imageUnderstanding","videoGeneration","videoUnderstanding","threeDGeneration","embedding","voiceClone","musicGeneration","realtimeAudio","realtimeVideo"],ts=class{keyPool;providerCatalog=new Zo;models=new Map;modelEnabledOverrides=new Map;bindings={};settingsPath;changeListeners=[];constructor(e){this.settingsPath=$e(),this.keyPool=new es(e?.providers),e?.models&&this.loadModelState(e.models),e?.bindings&&(this.bindings={...e.bindings}),this.hydrateCatalogModels()}getActiveModel(e){let r=this.bindings[e];if(!r)return null;let n=this.models.get(r);if(!n||!n.enabled)return null;let o=this.resolveTechnicalVariant(n,e),s=o?.provider??n.provider,i=o?.nativeModelId??n.nativeModelId??n.model,a=this.acquireKeyForProviderVariant(s);if(!a)return null;let{keyHandle:c,keyProviderId:l}=a,d=this.getProviderBaseUrl(s),p=this.getProviderBaseUrl(l);return{provider:s,model:i,apiKey:c.apiKey,baseUrl:d??(n.provider===s?n.baseUrl:void 0)??p,keyHandle:c}}peekActiveModel(e){let r=this.bindings[e];return r?this.models.get(r)??null:null}isAvailable(e){let r=this.peekActiveModel(e);return!!r?.enabled&&this.hasAvailableKeyForProviderVariant(r.provider)}resolveModelForPurpose(e){let r=this.peekActiveModel(e);return r?r.model:null}addProvider(e,r){this.keyPool.addProvider(e,r),this.emitChange()}removeProvider(e){this.keyPool.removeProvider(e);for(let[r,n]of this.models)n.provider===e&&this.removeModel(r);this.emitChange()}addKey(e,r,n){let o=this.keyPool.addKey(e,r,n);return this.emitChange(),o}removeKey(e){this.keyPool.removeKey(e),this.emitChange()}updateKey(e,r){this.keyPool.updateKey(e,r),this.emitChange()}setKeyHealth(e,r){this.keyPool.setKeyHealth(e,r),this.emitChange()}setStrategy(e,r){this.keyPool.setStrategy(e,r),this.emitChange()}addModel(e){let r=e.id??`${e.provider}:${e.model}`;return this.models.set(r,{...e,id:r,enabled:this.modelEnabledOverrides.get(r)??e.enabled}),this.emitChange(),r}replaceCatalogModels(e){let r=new Map;for(let n of e)r.set(n.id,{...n,enabled:this.modelEnabledOverrides.get(n.id)??n.enabled});for(let n of this.modelEnabledOverrides.keys())r.has(n)||this.modelEnabledOverrides.delete(n);this.models=r;for(let[n,o]of Object.entries(this.bindings))o&&!this.models.has(o)&&delete this.bindings[n];this.emitChange()}replaceProviderModels(e,r){let n=new Map;for(let[s,i]of this.models)i.provider!==e&&n.set(s,i);for(let s of r)s.provider===e&&n.set(s.id,{...s,enabled:this.modelEnabledOverrides.get(s.id)??s.enabled});let o=`${e}:`;for(let s of this.modelEnabledOverrides.keys())s.startsWith(o)&&!n.has(s)&&this.modelEnabledOverrides.delete(s);this.models=n;for(let[s,i]of Object.entries(this.bindings))i&&!this.models.has(i)&&delete this.bindings[s];this.emitChange()}migrateModelIds(e){for(let[r,n]of e){let o=this.modelEnabledOverrides.get(r);o!==void 0&&!this.modelEnabledOverrides.has(n)&&this.modelEnabledOverrides.set(n,o),this.modelEnabledOverrides.delete(r);for(let[s,i]of Object.entries(this.bindings))i===r&&(this.bindings[s]=n)}this.emitChange()}removeModel(e){this.models.delete(e),this.modelEnabledOverrides.delete(e);for(let[r,n]of Object.entries(this.bindings))n===e&&delete this.bindings[r];this.emitChange()}enableModel(e){let r=this.models.get(e);r&&(r.enabled=!0),this.modelEnabledOverrides.set(e,!0),this.emitChange()}disableModel(e){let r=this.models.get(e);r&&(r.enabled=!1),this.modelEnabledOverrides.set(e,!1),this.emitChange()}listModels(e){let r=[...this.models.values()];return e?.purpose&&(r=r.filter(n=>n.purposes.includes(e.purpose))),e?.provider&&(r=r.filter(n=>n.provider===e.provider)),e?.enabledOnly&&(r=r.filter(n=>n.enabled)),r}getModel(e){return this.models.get(e)??null}setBinding(e,r){let n=this.models.get(r);if(!n)throw new Error(`Model "${r}" not found in pool.`);if(!n.purposes.includes(e))throw new Error(`Model "${r}" does not support purpose "${e}".`);this.bindings[e]=r,this.emitChange()}removeBinding(e){delete this.bindings[e],this.emitChange()}getBinding(e){let r=this.bindings[e];return r?this.models.get(r)??null:null}getAllBindings(){let e={};for(let r of On){let n=this.bindings[r];e[r]=n?this.models.get(n)??null:null}return e}getProviderStatus(e){return this.keyPool.getPoolStatus(e)}getAllProviderStatus(){return this.keyPool.getAllStatus()}save(){let e={};try{Je.existsSync(this.settingsPath)&&(e=JSON.parse(Je.readFileSync(this.settingsPath,"utf-8")))}catch{e={}}delete e.provider,delete e.apiKey,delete e.model,delete e.baseUrl;let r={...e,providers:this.keyPool.exportConfig(),models:this.exportModelState(),bindings:{...this.bindings}},n=this.settingsPath.replace(/[/\\][^/\\]+$/,"");Je.existsSync(n)||Je.mkdirSync(n,{recursive:!0}),Je.writeFileSync(this.settingsPath,JSON.stringify(r,null,2),"utf-8")}load(){try{if(!Je.existsSync(this.settingsPath))return!1;let e=Je.readFileSync(this.settingsPath,"utf-8"),r=JSON.parse(e);return r.providers&&this.keyPool.reloadConfig(r.providers),this.models.clear(),this.modelEnabledOverrides.clear(),r.models&&this.loadModelState(r.models),this.hydrateCatalogModels(),this.bindings=r.bindings??{},this.emitChange(),!0}catch{return!1}}exportConfig(){return{providers:this.keyPool.exportConfig(),models:this.exportModelState(),bindings:{...this.bindings}}}getTunable(e){try{if(!Je.existsSync(this.settingsPath))return;let r=Je.readFileSync(this.settingsPath,"utf-8");return JSON.parse(r).tunables?.[e]}catch{return}}getModelInfo(e,r){let n=this.listModels({provider:e}).find(o=>o.model===r);if(n)return{id:n.model,name:n.displayName,contextWindow:n.contextWindow,maxOutput:n.maxOutput,streamRequired:n.streamRequired}}getProviderDefaultModel(e){return this.listModels({provider:e,enabledOnly:!0})[0]?.model??this.listModels({provider:e})[0]?.model}hasConfiguredKeyForProviderVariant(e){return this.providerVariantKeyCandidates(e).some(r=>!!this.keyPool.getPoolStatus(r)?.keys.some(o=>o.enabled))}hasAvailableKeyForProviderVariant(e){return this.providerVariantKeyCandidates(e).some(r=>this.keyPool.hasAvailableKey(r))}listProviderDefs(){return this.keyPool.getAllStatus().map(e=>({id:e.providerId,name:e.providerId,transport:"",baseUrl:e.baseUrl??"",defaultModel:this.getProviderDefaultModel(e.providerId),models:this.listModels({provider:e.providerId}).map(r=>({id:r.model,name:r.displayName,contextWindow:r.contextWindow,maxOutput:r.maxOutput,streamRequired:r.streamRequired}))}))}getKnownProviderDef(e){let r=this.providerCatalog.getProvider(e);return r?{id:r.id,name:r.name,transport:r.transport,baseUrl:r.baseUrl,defaultModel:r.defaultModel,group:r.group,models:this.providerCatalog.listModels(r.id).map(n=>({id:n.aliases?.[0]??n.id,name:n.name,contextWindow:n.contextWindow,maxOutput:n.maxOutput,streamRequired:n.streamRequired,vision:n.vision,mediaType:n.mediaType}))}:null}resolveProviderApiKey(e){return this.getKeyForProvider(e)??void 0}onChange(e){return this.changeListeners.push(e),()=>{let r=this.changeListeners.indexOf(e);r>=0&&this.changeListeners.splice(r,1)}}getKeyForProvider(e){let n=this.acquireKeyForProviderVariant(e)?.keyHandle;if(!n)return null;let o=n.apiKey;return n.release({success:!0}),o}snapshotProviderKeys(){let e={};for(let r of this.keyPool.getAllStatus()){let n=this.getKeyForProvider(r.providerId);n&&(e[r.providerId]=n)}return e}getProviderBaseUrl(e){return this.providerCatalog.getProvider(e)?.baseUrl??this.keyPool.getPoolStatus(e)?.baseUrl}acquireKeyForProviderVariant(e){for(let r of this.providerVariantKeyCandidates(e)){let n=this.keyPool.acquireKey(r);if(n)return{keyHandle:n,keyProviderId:r}}return null}resolveTechnicalVariant(e,r){let n=this.providerVariantKeyCandidates(e.provider).filter(s=>this.hasConfiguredKeyForProviderVariant(s));if(n.length===0)return;let o=this.providerCatalog.resolveBest({publicModel:e.model,requestedProtocol:qx(r,e.transport),capabilities:Wx(r),purpose:r,userPreference:{providerIds:n}});if(o)return{provider:o.provider,nativeModelId:o.nativeModelId}}providerVariantKeyCandidates(e){let r=[e],n=this.providerCatalog.getProvider(e),o=n?.group??n?.id??e;for(let s of this.providerCatalog.listProviders())(s.group??s.id)===o&&r.push(s.id);return o!==e&&r.push(o),[...new Set(r)]}loadModelState(e){for(let r of e)typeof r.id!="string"||!r.id||typeof r.enabled=="boolean"&&this.modelEnabledOverrides.set(r.id,r.enabled)}hydrateCatalogModels(){let e=[];for(let n of this.providerCatalog.listProviders())for(let o of this.providerCatalog.listModels(n.id)){let s=o.aliases?.[0]??o.id,i=`${n.id}:${s}`;e.push({id:i,provider:n.id,model:s,displayName:o.name,purposes:bm(o),baseUrl:n.baseUrl,enabled:this.modelEnabledOverrides.get(i)??!1,nativeModelId:o.id,transport:n.transport,contextWindow:o.contextWindow,maxOutput:o.maxOutput,streamRequired:o.streamRequired,capabilities:[...o.toolCall?["toolCall"]:[],...o.reasoning?["reasoning"]:[],...o.vision?["vision"]:[],...o.mediaType?[o.mediaType]:[]],pricing:{inputPer1M:o.costInput,outputPer1M:o.costOutput,cacheReadPer1M:o.costCacheRead,cacheWritePer1M:o.costCacheWrite}})}let r=new Map;for(let n of e)r.set(n.id,n);this.models=r}exportModelState(){let e=new Map;for(let[r,n]of this.modelEnabledOverrides)e.set(r,n);for(let r of this.models.values())e.set(r.id,r.enabled);return[...e.entries()].map(([r,n])=>({id:r,enabled:n}))}emitChange(){for(let e of this.changeListeners)try{e()}catch{}}},Ln=null});import{createRequire as jB}from"node:module";import{createInterface as GP}from"node:readline";var Gr=class{messageHandler=null;closeHandler=null;verbose;constructor(e){this.verbose=e?.verbose??!1}onMessage(e){this.messageHandler=e}onClose(e){this.closeHandler=e}send(e){process.stdout.write(`${JSON.stringify(e)}
2
+ var qP=Object.defineProperty;var Wo=(t,e)=>()=>(t&&(e=t(t=0)),e);var WP=(t,e)=>{for(var r in e)qP(t,r,{get:e[r],enumerable:!0})};import{homedir as Ix}from"node:os";import{join as re}from"node:path";import{existsSync as Ex}from"node:fs";function X(){return process.env.QLOGICAGENT_HOME||re(Ix(),zt)}function Vr(){let t=process.env.QLOGIC_LLMROUTER_USER_ID?.trim();if(t)return t;let e=process.env.QLOGIC_IMPLICIT_OWNER_ID?.trim();if(e)return e;let r=process.env.QLOGIC_DEVICE_ID?.trim();return r?`oc_${r}`:"oc_local"}function Mx(t){let e=t.trim();if(!e)throw new Error("ownerUserId is required for profile-scoped storage");return encodeURIComponent(e).replace(/\./g,"%2E")}function B(t=Vr()){return re(X(),"profiles",Mx(t))}function em(t=Vr()){return re(B(t),"memory")}function Vo(){return re(B(),"plugins")}function sr(){return re(B(),"skills")}function $e(){return re(B(),"settings.json")}function tm(){return re(B(),"plugin-cache")}function rm(){return re(B(),"mcp.json")}function nm(){return re(B(),"marketplace.json")}function Dn(){return re(B(),"assistant-presets.json")}function om(){return re(B(),"rules")}function De(t){if(!t)throw new Error("getProjectAgentDir: cwd is required (must not fall back to process.cwd())");return re(t,zt)}function Xo(t){return re(De(t),"plugins")}function ir(t){return re(De(t),"skills")}function sm(t){return re(De(t),"settings.json")}function br(t){return re(De(t),"INSTRUCTIONS.md")}function Xr(t){return re(De(t),"rules")}function Yo(t){return re(De(t),"sessions")}function im(t,e){let r=re(De(t),"checkpoints");return e?re(r,e):r}function am(t){return re(t,zt,"hooks")}function Cc(t,e){return t.filter(r=>r!==e&&Ex(re(r,zt,"skills")))}function cm(t,e){return Cc(t,e).map(r=>ir(r))}var zt,G=Wo(()=>{"use strict";zt=".qlogicagent"});import{ProviderRegistry as Ux,ProviderVariantResolver as Fx}from"@xiaozhiclaw/provider-core";var Zo,ym=Wo(()=>{"use strict";Zo=class{registry=new Ux;resolver=new Fx(this.registry);getProvider(e){return this.registry.getProvider(e)}listProviders(){return this.registry.listProviders()}listModels(e){return this.registry.listModels(e)}resolveBest(e){let r=this.resolver.resolveBest(e);return r?{provider:r.provider,nativeModelId:r.nativeModelId}:void 0}}});var es,vm=Wo(()=>{"use strict";es=class{pools=new Map;runtimeStates=new Map;constructor(e){if(e)for(let r of e){this.pools.set(r.providerId,r);for(let n of r.keys)this.runtimeStates.set(n.id,this.createInitialState())}}acquireKey(e){let r=this.pools.get(e);if(!r||r.keys.length===0)return null;let n=Date.now(),o=this.getHealthyCandidates(r,n);if(o.length===0)return null;let s=this.selectByStrategy(o,r.strategy,n);if(!s)return null;let i=this.runtimeStates.get(s.id);return i.inFlight++,i.totalRequests++,i.lastUsedAt=n,i.requestTimestamps.push(n),{keyId:s.id,apiKey:s.key,providerId:e,release:a=>this.releaseKey(s.id,a)}}releaseKey(e,r){let n=this.runtimeStates.get(e);if(n)if(n.inFlight=Math.max(0,n.inFlight-1),r.success)n.consecutiveErrors=0,n.healthStatus="healthy",r.tokens&&(n.totalTokens+=r.tokens,n.tokenCounts.push(r.tokens));else if(n.consecutiveErrors++,n.lastErrorAt=Date.now(),r.errorCode===429){let o=r.retryAfter?r.retryAfter*1e3:3e4;n.cooldownUntil=Date.now()+o,n.healthStatus="cooldown"}else n.consecutiveErrors>=5?(n.cooldownUntil=Date.now()+6e4,n.healthStatus="cooldown"):n.consecutiveErrors>=3&&(n.healthStatus="degraded")}addProvider(e,r){this.pools.has(e)||this.pools.set(e,{providerId:e,baseUrl:r?.baseUrl,strategy:r?.strategy??"weighted-round-robin",keys:[],rateLimit:r?.rateLimit})}removeProvider(e){let r=this.pools.get(e);if(r){for(let n of r.keys)this.runtimeStates.delete(n.id);this.pools.delete(e)}}addKey(e,r,n){let o=this.pools.get(e);o||(o={providerId:e,strategy:"weighted-round-robin",keys:[]},this.pools.set(e,o));let s=n?.id??crypto.randomUUID(),i={id:s,key:r,label:n?.label,weight:n?.weight??1,enabled:n?.enabled??!0};return o.keys.push(i),this.runtimeStates.set(s,this.createInitialState()),s}removeKey(e){for(let r of this.pools.values()){let n=r.keys.findIndex(o=>o.id===e);if(n!==-1){r.keys.splice(n,1),this.runtimeStates.delete(e);return}}}updateKey(e,r){for(let n of this.pools.values()){let o=n.keys.find(s=>s.id===e);if(o){if(r.label!==void 0&&(o.label=r.label),r.weight!==void 0&&(o.weight=r.weight),r.enabled!==void 0){o.enabled=r.enabled;let s=this.runtimeStates.get(e);s&&(s.healthStatus=r.enabled?"healthy":"disabled")}return}}}setKeyHealth(e,r){let n=this.runtimeStates.get(e);n&&(n.healthStatus=r)}setStrategy(e,r){let n=this.pools.get(e);n&&(n.strategy=r)}setRateLimit(e,r){let n=this.pools.get(e);n&&(n.rateLimit=r)}getPoolStatus(e){let r=this.pools.get(e);return r?this.buildPoolStatus(r):null}getAllStatus(){return[...this.pools.values()].map(e=>this.buildPoolStatus(e))}getProviderIds(){return[...this.pools.keys()]}hasProvider(e){return this.pools.has(e)}hasAvailableKey(e){let r=this.pools.get(e);return r?this.getHealthyCandidates(r,Date.now()).length>0:!1}exportConfig(){return[...this.pools.values()]}reloadConfig(e){let r=new Set;for(let n of e){this.pools.set(n.providerId,n);for(let o of n.keys)r.add(o.id),this.runtimeStates.has(o.id)||this.runtimeStates.set(o.id,this.createInitialState())}for(let n of[...this.pools.keys()])e.some(o=>o.providerId===n)||this.pools.delete(n);for(let n of[...this.runtimeStates.keys()])r.has(n)||this.runtimeStates.delete(n)}createInitialState(){return{inFlight:0,totalRequests:0,totalTokens:0,lastUsedAt:0,lastErrorAt:0,consecutiveErrors:0,cooldownUntil:0,healthStatus:"healthy",requestTimestamps:[],tokenCounts:[]}}getHealthyCandidates(e,r){let n=[];for(let o of e.keys){if(!o.enabled)continue;let s=this.runtimeStates.get(o.id);if(s){if(s.healthStatus==="cooldown")if(r>=s.cooldownUntil)s.healthStatus="healthy",s.consecutiveErrors=0;else continue;s.healthStatus!=="disabled"&&(e.rateLimit?.rpm&&(this.pruneWindow(s.requestTimestamps,r),s.requestTimestamps.length>=e.rateLimit.rpm*.9)||e.rateLimit?.tpm&&(this.pruneWindow(s.tokenCounts,r),s.tokenCounts.reduce((a,c)=>a+c,0)>=e.rateLimit.tpm*.9)||n.push(o))}}return n}selectByStrategy(e,r,n){if(e.length===0)return null;if(e.length===1)return e[0];switch(r){case"weighted-round-robin":return this.weightedRandom(e);case"least-busy":return this.leastBusy(e);case"random":return e[Math.floor(Math.random()*e.length)];default:return this.weightedRandom(e)}}weightedRandom(e){let r=e.reduce((o,s)=>o+s.weight,0),n=Math.random()*r;for(let o of e)if(n-=o.weight,n<=0)return o;return e[e.length-1]}leastBusy(e){let r=1/0,n=e[0];for(let o of e){let i=this.runtimeStates.get(o.id)?.inFlight??0;(i<r||i===r&&o.weight>n.weight)&&(r=i,n=o)}return n}pruneWindow(e,r){let n=r-6e4;for(;e.length>0&&e[0]<n;)e.shift()}buildPoolStatus(e){return{providerId:e.providerId,baseUrl:e.baseUrl,strategy:e.strategy,rateLimit:e.rateLimit,keys:e.keys.map(r=>{let n=this.runtimeStates.get(r.id)??this.createInitialState();return{...r,inFlight:n.inFlight,totalRequests:n.totalRequests,totalTokens:n.totalTokens,lastUsedAt:n.lastUsedAt,lastErrorAt:n.lastErrorAt,consecutiveErrors:n.consecutiveErrors,cooldownUntil:n.cooldownUntil,healthStatus:r.enabled?n.healthStatus:"disabled"}})}}}});var km={};WP(km,{ALL_PURPOSES:()=>On,ModelRegistry:()=>ts,deriveModelPurposes:()=>bm,getModelRegistry:()=>D,resetModelRegistry:()=>Hx});import*as Je from"node:fs";function D(){return Ln||(Ln=new ts,Ln.load()),Ln}function Hx(){Ln=null}function bm(t){let e=[];switch((!t.mediaType||t.mediaType==="image_understanding"||t.mediaType==="video_understanding")&&e.push("textGeneration"),(t.vision||t.mediaType==="image_understanding")&&e.push("imageUnderstanding"),t.mediaType==="video_understanding"&&e.push("videoUnderstanding"),t.mediaType){case"image":e.push("imageGeneration");break;case"video":e.push("videoGeneration");break;case"tts":e.push("tts");break;case"stt":e.push("stt");break;case"music":case"music_realtime":e.push("musicGeneration");break;case"voice_clone":e.push("voiceClone");break;case"embedding":e.push("embedding");break;case"3d":e.push("threeDGeneration");break;case"realtime_audio":e.push("realtimeAudio");break}return e.includes("textGeneration")&&e.push("smallModel"),[...new Set(e.length>0?e:["textGeneration"])]}function Bx(t){switch(t){case"openai-chat":case"openai-responses":case"anthropic-messages":case"volcengine-responses":return t;default:return}}function qx(t,e){switch(t){case"imageUnderstanding":case"videoUnderstanding":case"imageGeneration":case"videoGeneration":case"threeDGeneration":case"stt":case"tts":case"voiceClone":case"musicGeneration":case"realtimeAudio":case"realtimeVideo":case"embedding":return;default:return Bx(e)}}function Wx(t){switch(t){case"imageUnderstanding":case"videoUnderstanding":return["vision"];case"imageGeneration":case"videoGeneration":case"threeDGeneration":case"stt":case"tts":case"voiceClone":case"musicGeneration":case"realtimeAudio":case"realtimeVideo":case"embedding":return["media"];default:return[]}}var On,ts,Ln,Fe=Wo(()=>{"use strict";G();ym();vm();On=["textGeneration","smallModel","stt","tts","imageGeneration","imageUnderstanding","videoGeneration","videoUnderstanding","threeDGeneration","embedding","voiceClone","musicGeneration","realtimeAudio","realtimeVideo"],ts=class{keyPool;providerCatalog=new Zo;models=new Map;modelEnabledOverrides=new Map;bindings={};settingsPath;changeListeners=[];constructor(e){this.settingsPath=$e(),this.keyPool=new es(e?.providers),e?.models&&this.loadModelState(e.models),e?.bindings&&(this.bindings={...e.bindings}),this.hydrateCatalogModels()}getActiveModel(e){let r=this.bindings[e];if(!r)return null;let n=this.models.get(r);if(!n||!n.enabled)return null;let o=this.resolveTechnicalVariant(n,e),s=o?.provider??n.provider,i=o?.nativeModelId??n.nativeModelId??n.model,a=this.acquireKeyForProviderVariant(s);if(!a)return null;let{keyHandle:c,keyProviderId:l}=a,d=this.getProviderBaseUrl(s),p=this.getProviderBaseUrl(l);return{provider:s,model:i,apiKey:c.apiKey,baseUrl:d??(n.provider===s?n.baseUrl:void 0)??p,keyHandle:c}}peekActiveModel(e){let r=this.bindings[e];return r?this.models.get(r)??null:null}isAvailable(e){let r=this.peekActiveModel(e);return!!r?.enabled&&this.hasAvailableKeyForProviderVariant(r.provider)}resolveModelForPurpose(e){let r=this.peekActiveModel(e);return r?r.model:null}addProvider(e,r){this.keyPool.addProvider(e,r),this.emitChange()}removeProvider(e){this.keyPool.removeProvider(e);for(let[r,n]of this.models)n.provider===e&&this.removeModel(r);this.emitChange()}addKey(e,r,n){let o=this.keyPool.addKey(e,r,n);return this.emitChange(),o}removeKey(e){this.keyPool.removeKey(e),this.emitChange()}updateKey(e,r){this.keyPool.updateKey(e,r),this.emitChange()}setKeyHealth(e,r){this.keyPool.setKeyHealth(e,r),this.emitChange()}setStrategy(e,r){this.keyPool.setStrategy(e,r),this.emitChange()}addModel(e){let r=e.id??`${e.provider}:${e.model}`;return this.models.set(r,{...e,id:r,enabled:this.modelEnabledOverrides.get(r)??e.enabled}),this.emitChange(),r}replaceCatalogModels(e){let r=new Map;for(let n of e)r.set(n.id,{...n,enabled:this.modelEnabledOverrides.get(n.id)??n.enabled});for(let n of this.modelEnabledOverrides.keys())r.has(n)||this.modelEnabledOverrides.delete(n);this.models=r;for(let[n,o]of Object.entries(this.bindings))o&&!this.models.has(o)&&delete this.bindings[n];this.emitChange()}replaceProviderModels(e,r){let n=new Map;for(let[s,i]of this.models)i.provider!==e&&n.set(s,i);for(let s of r)s.provider===e&&n.set(s.id,{...s,enabled:this.modelEnabledOverrides.get(s.id)??s.enabled});let o=`${e}:`;for(let s of this.modelEnabledOverrides.keys())s.startsWith(o)&&!n.has(s)&&this.modelEnabledOverrides.delete(s);this.models=n;for(let[s,i]of Object.entries(this.bindings))i&&!this.models.has(i)&&delete this.bindings[s];this.emitChange()}migrateModelIds(e){for(let[r,n]of e){let o=this.modelEnabledOverrides.get(r);o!==void 0&&!this.modelEnabledOverrides.has(n)&&this.modelEnabledOverrides.set(n,o),this.modelEnabledOverrides.delete(r);for(let[s,i]of Object.entries(this.bindings))i===r&&(this.bindings[s]=n)}this.emitChange()}removeModel(e){this.models.delete(e),this.modelEnabledOverrides.delete(e);for(let[r,n]of Object.entries(this.bindings))n===e&&delete this.bindings[r];this.emitChange()}enableModel(e){let r=this.models.get(e);r&&(r.enabled=!0),this.modelEnabledOverrides.set(e,!0),this.emitChange()}disableModel(e){let r=this.models.get(e);r&&(r.enabled=!1),this.modelEnabledOverrides.set(e,!1),this.emitChange()}listModels(e){let r=[...this.models.values()];return e?.purpose&&(r=r.filter(n=>n.purposes.includes(e.purpose))),e?.provider&&(r=r.filter(n=>n.provider===e.provider)),e?.enabledOnly&&(r=r.filter(n=>n.enabled)),r}getModel(e){return this.models.get(e)??null}setBinding(e,r){let n=this.models.get(r);if(!n)throw new Error(`Model "${r}" not found in pool.`);if(!n.purposes.includes(e))throw new Error(`Model "${r}" does not support purpose "${e}".`);this.bindings[e]=r,this.emitChange()}removeBinding(e){delete this.bindings[e],this.emitChange()}getBinding(e){let r=this.bindings[e];return r?this.models.get(r)??null:null}getAllBindings(){let e={};for(let r of On){let n=this.bindings[r];e[r]=n?this.models.get(n)??null:null}return e}getProviderStatus(e){return this.keyPool.getPoolStatus(e)}getAllProviderStatus(){return this.keyPool.getAllStatus()}save(){let e={};try{Je.existsSync(this.settingsPath)&&(e=JSON.parse(Je.readFileSync(this.settingsPath,"utf-8")))}catch{e={}}delete e.provider,delete e.apiKey,delete e.model,delete e.baseUrl;let r={...e,providers:this.keyPool.exportConfig(),models:this.exportModelState(),bindings:{...this.bindings}},n=this.settingsPath.replace(/[/\\][^/\\]+$/,"");Je.existsSync(n)||Je.mkdirSync(n,{recursive:!0}),Je.writeFileSync(this.settingsPath,JSON.stringify(r,null,2),"utf-8")}load(){try{if(!Je.existsSync(this.settingsPath))return!1;let e=Je.readFileSync(this.settingsPath,"utf-8"),r=JSON.parse(e);return r.providers&&this.keyPool.reloadConfig(r.providers),this.models.clear(),this.modelEnabledOverrides.clear(),r.models&&this.loadModelState(r.models),this.hydrateCatalogModels(),this.bindings=r.bindings??{},this.emitChange(),!0}catch{return!1}}exportConfig(){return{providers:this.keyPool.exportConfig(),models:this.exportModelState(),bindings:{...this.bindings}}}getTunable(e){try{if(!Je.existsSync(this.settingsPath))return;let r=Je.readFileSync(this.settingsPath,"utf-8");return JSON.parse(r).tunables?.[e]}catch{return}}getModelInfo(e,r){let n=this.listModels({provider:e}).find(o=>o.model===r);if(n)return{id:n.model,name:n.displayName,contextWindow:n.contextWindow,maxOutput:n.maxOutput,streamRequired:n.streamRequired}}getProviderDefaultModel(e){return this.listModels({provider:e,enabledOnly:!0})[0]?.model??this.listModels({provider:e})[0]?.model}hasConfiguredKeyForProviderVariant(e){return this.providerVariantKeyCandidates(e).some(r=>!!this.keyPool.getPoolStatus(r)?.keys.some(o=>o.enabled))}hasAvailableKeyForProviderVariant(e){return this.providerVariantKeyCandidates(e).some(r=>this.keyPool.hasAvailableKey(r))}listProviderDefs(){return this.keyPool.getAllStatus().map(e=>({id:e.providerId,name:e.providerId,transport:"",baseUrl:e.baseUrl??"",defaultModel:this.getProviderDefaultModel(e.providerId),models:this.listModels({provider:e.providerId}).map(r=>({id:r.model,name:r.displayName,contextWindow:r.contextWindow,maxOutput:r.maxOutput,streamRequired:r.streamRequired}))}))}getKnownProviderDef(e){let r=this.providerCatalog.getProvider(e);return r?{id:r.id,name:r.name,transport:r.transport,baseUrl:r.baseUrl,defaultModel:r.defaultModel,group:r.group,models:this.providerCatalog.listModels(r.id).map(n=>({id:n.aliases?.[0]??n.id,name:n.name,contextWindow:n.contextWindow,maxOutput:n.maxOutput,streamRequired:n.streamRequired,vision:n.vision,mediaType:n.mediaType}))}:null}resolveProviderApiKey(e){return this.getKeyForProvider(e)??void 0}onChange(e){return this.changeListeners.push(e),()=>{let r=this.changeListeners.indexOf(e);r>=0&&this.changeListeners.splice(r,1)}}getKeyForProvider(e){let n=this.acquireKeyForProviderVariant(e)?.keyHandle;if(!n)return null;let o=n.apiKey;return n.release({success:!0}),o}snapshotProviderKeys(){let e={};for(let r of this.keyPool.getAllStatus()){let n=this.getKeyForProvider(r.providerId);n&&(e[r.providerId]=n)}return e}getProviderBaseUrl(e){return this.providerCatalog.getProvider(e)?.baseUrl??this.keyPool.getPoolStatus(e)?.baseUrl}acquireKeyForProviderVariant(e){for(let r of this.providerVariantKeyCandidates(e)){let n=this.keyPool.acquireKey(r);if(n)return{keyHandle:n,keyProviderId:r}}return null}resolveTechnicalVariant(e,r){let n=this.providerVariantKeyCandidates(e.provider).filter(s=>this.hasConfiguredKeyForProviderVariant(s));if(n.length===0)return;let o=this.providerCatalog.resolveBest({publicModel:e.model,requestedProtocol:qx(r,e.transport),capabilities:Wx(r),purpose:r,userPreference:{providerIds:n}});if(o)return{provider:o.provider,nativeModelId:o.nativeModelId}}providerVariantKeyCandidates(e){let r=[e],n=this.providerCatalog.getProvider(e),o=n?.group??n?.id??e;for(let s of this.providerCatalog.listProviders())(s.group??s.id)===o&&r.push(s.id);return o!==e&&r.push(o),[...new Set(r)]}loadModelState(e){for(let r of e)typeof r.id!="string"||!r.id||typeof r.enabled=="boolean"&&this.modelEnabledOverrides.set(r.id,r.enabled)}hydrateCatalogModels(){let e=[];for(let n of this.providerCatalog.listProviders())for(let o of this.providerCatalog.listModels(n.id)){let s=o.aliases?.[0]??o.id,i=`${n.id}:${s}`;e.push({id:i,provider:n.id,model:s,displayName:o.name,purposes:bm(o),baseUrl:n.baseUrl,enabled:this.modelEnabledOverrides.get(i)??!1,nativeModelId:o.id,transport:n.transport,contextWindow:o.contextWindow,maxOutput:o.maxOutput,streamRequired:o.streamRequired,capabilities:[...o.toolCall?["toolCall"]:[],...o.reasoning?["reasoning"]:[],...o.vision?["vision"]:[],...o.mediaType?[o.mediaType]:[]],pricing:{inputPer1M:o.costInput,outputPer1M:o.costOutput,cacheReadPer1M:o.costCacheRead,cacheWritePer1M:o.costCacheWrite}})}let r=new Map;for(let n of e)r.set(n.id,n);this.models=r}exportModelState(){let e=new Map;for(let[r,n]of this.modelEnabledOverrides)e.set(r,n);for(let r of this.models.values())e.set(r.id,r.enabled);return[...e.entries()].map(([r,n])=>({id:r,enabled:n}))}emitChange(){for(let e of this.changeListeners)try{e()}catch{}}},Ln=null});import{createRequire as $B}from"node:module";import{createInterface as GP}from"node:readline";var Gr=class{messageHandler=null;closeHandler=null;verbose;constructor(e){this.verbose=e?.verbose??!1}onMessage(e){this.messageHandler=e}onClose(e){this.closeHandler=e}send(e){process.stdout.write(`${JSON.stringify(e)}
3
3
  `)}start(){process.stdin.on("data",r=>{process.stderr.write(`[transport] raw stdin data (${r.length} bytes): ${r.toString().slice(0,300)}
4
4
  `)});let e=GP({input:process.stdin,crlfDelay:Number.POSITIVE_INFINITY});e.on("line",r=>{let n=r.trim();if(n){process.stderr.write(`[transport] line: ${n.slice(0,300)}
5
5
  `);try{let o=JSON.parse(n);this.messageHandler?.(o)}catch{this.log(`invalid JSON on stdin: ${n.slice(0,200)}`)}}}),e.on("close",()=>{this.closeHandler?.()})}close(){}log(e){this.verbose&&process.stderr.write(`[transport] ${e}
@@ -35,7 +35,7 @@ Respond ONLY with a JSON array (or empty array [] if nothing worth extracting):
35
35
  [{"text": "...", "category": "personal_fact|preference|event|lesson", "importance": 0.5-0.9, "eventDate": "YYYY-MM-DD or null"}]`;async function sx(t,e,r){let n=ox.replace("{user_message}",t.userMessage.slice(0,1e3)).replace("{assistant_message}",t.assistantMessage.slice(0,500)).replace("{today}",r);try{let o=await e(n);if(!o)return[];let s=o.replace(/^```(?:json)?\n?/,"").replace(/\n?```$/,"").trim(),i=JSON.parse(s);return Array.isArray(i)?i.filter(a=>a.text&&typeof a.text=="string"&&a.text.length>=5&&a.text.length<=500&&a.category).map(a=>({text:a.text.trim(),category:ix(a.category),importance:Math.min(.9,Math.max(.3,Number(a.importance)||.5)),eventDate:typeof a.eventDate=="string"?a.eventDate:void 0})).slice(0,3):[]}catch{return[]}}function ix(t){return new Set(["personal_fact","preference","event","lesson","pattern","decision"]).has(t)?t:"personal_fact"}async function Gp(t,e){if(!Ba(t.userMessage))return 0;if(e.log.debug(`implicit-extract: signal detected in user message (${t.userMessage.slice(0,50)}...)`),!e.llmExtract)return e.log.debug("implicit-extract: no LLM extractor configured, skipping Layer 2"),0;let r=new Date().toISOString().slice(0,10),n=await sx(t,e.llmExtract,r);if(n.length===0)return e.log.debug("implicit-extract: LLM returned no facts"),0;let o=0;for(let s of n)try{if(!e.localProvider.proposeExtracted)continue;if(((await e.localProvider.proposeExtracted([{text:s.text,category:s.category,importance:s.importance}],e.userId,{source:"implicit-extract"})).proposalsAdded??0)>0){if(o++,e.log.debug(`implicit-extract: proposed "${s.text.slice(0,60)}..." [${s.category}]`),s.category==="event")try{let a=e.localProvider.findRelatedEvents?await e.localProvider.findRelatedEvents(s.text,e.userId):[];for(let c of a)e.localProvider.feedback?.([c.id],"useful").catch(()=>{});a.length>0&&e.log.debug(`implicit-extract: linked to ${a.length} related events`)}catch{}}else e.log.debug(`implicit-extract: dedup skipped "${s.text.slice(0,40)}..."`)}catch{}return o}var qa=Math.min(Math.max(1,Number(process.env.TOOL_LOOP_DEFAULT_BUDGET)||25),100),Wa=3,Ga=2,Go=2,za=128e3,Ka=13e3,Va=16384,Xa=65536,Ya=3,Ja=65536,zo=500,Qa=3,Za=5e4,ec=2e5,Ko=2e3,tc=3e4,rc=3,zr=2,ax=3e5,cx=216e5,lx=.75,dx=16e3,ux=12e4,px=3,mx=4,gx=50,nc=20,zp=50,oc=3,sc=2,ic=300*1e3,Kp=3,Vp=720*60*60*1e3,fx=4e3,hx=5,ac=3,cc=800,lc=300*1e3,dc=4,uc=0,pc=50,mc=50,gc=30,Xp=3600*1e3,Yp=200,fc=5,yx=4e4,hc=50*1024,yc=500*1024,vc=500*1024*1024,vx=50*1024*1024,bc=3e5,kc=2,Rc=3e3,Sc=3,Tc=5e3,bx=1e3,kx=3e3,Rx=3e4,wc=60*1024,Ac=10,Pc=100,Sx=24,Tx=5,wx=6e5,Ax=30,Px=144e5,xx=3e5;function xc(){return{maxRoundsLimit:100,defaultMaxRounds:25,defaultTemperature:0,maxToolBudgetCap:100,defaultToolBudget:qa,maxConsecutiveFailures:Wa,maxIdenticalCallRepeats:Ga,defaultContextWindowTokens:za,responseBufferTokens:Ka,defaultMaxOutputTokens:Va,defaultModelMaxOutputTokens:Xa,maxOutputTokensRecoveryLimit:Ya,escalatedMaxOutputTokens:Ja,diminishingReturnsThreshold:zo,diminishingReturnsMinContinuations:Qa,defaultMaxResultSizeChars:Za,maxToolResultsPerMessageChars:ec,toolResultPreviewBytes:Ko,heartbeatIntervalMs:tc,max529Retries:rc,maxApiRetries:zr,persistentRetryMaxBackoffMs:ax,persistentRetryResetCapMs:cx,compressionTargetUsageRatio:lx,compressionMinBudget:dx,compressionMaxBudget:ux,reactiveCompactMaxFailures:px,reactiveCompactMinMessages:mx,reactiveCompactTargetPercent:gx,maxSkillsPerProject:nc,maxSkillsGlobal:zp,minToolCallsForSkill:oc,minDistinctToolsForSkill:sc,skillCreationCooldownMs:ic,skillInjectionMaxChars:fx,skillInjectionMaxCount:hx,skillRecallMaxSkills:ac,skillRecallMaxContentChars:cc,skillRecallCacheTtlMs:lc,maxForkDepth:dc,maxSessions:pc,taskSummaryTurnThreshold:mc,taskSummaryRegenInterval:gc,maxIncludeDepth:fc,maxInstructionChars:yx,instructionsMaxFileSize:hc,instructionsMaxDirSize:yc,mediaMaxDownloadSize:vc,mediaMaxUploadSize:vx,mediaDownloadTimeoutMs:bc,acpMaxSpawnRetries:kc,acpRetryBackoffBase:Rc,acpRuntimeRestartMax:Sc,acpRuntimeRestartBackoffBase:Tc,taskPollIntervalMs:bx,taskStoppedDisplayMs:kx,taskPanelGraceMs:Rx,memoryPrefetchMaxSessionBytes:wc,memoryPrefetchLimitPerRecall:Ac,memoryMaxSurfacedEntries:Pc,dreamMinIntervalHours:Sx,dreamMinSessions:Tx,dreamScanIntervalMs:wx,idleDreamMinutes:Ax,dreamCooldownMs:Px,dreamMaxDurationMs:xx,teamBudgetTokens:uc}}var Kr={MAX_SESSION_BYTES:wc,LIMIT_PER_RECALL:Ac,MAX_SURFACED_ENTRIES:Pc};function kt(){return{surfacedPaths:new Set,sessionBytes:0}}function Qp(t,e,r){let n=[],o=r??kt(),s,i=[];return n.push(t.register({point:"memory.before_recall",priority:50,label:"qmemory-prefetch",handler:async(a,c)=>{if(!e.memoryProvider||!c.query)return{action:"continue",context:c};if(o.sessionBytes>=Kr.MAX_SESSION_BYTES)return e.log.debug("memory.before_recall: session byte budget exhausted, skipping"),{action:"continue",context:c};try{let l=await e.memoryProvider.search(c.query,e.userId,{limit:Kr.LIMIT_PER_RECALL}),d=l.filter(m=>{let f=m,g=f.path??f.id??"";if(!g)return!0;if(o.surfacedPaths.has(g))return!1;let h=(f.content?.length??0)*2;if(o.sessionBytes+h>Kr.MAX_SESSION_BYTES)return!1;if(o.surfacedPaths.add(g),o.sessionBytes+=h,o.surfacedPaths.size>Kr.MAX_SURFACED_ENTRIES){let b=o.surfacedPaths.values().next().value;b!==void 0&&o.surfacedPaths.delete(b)}return!0});s=c.turnId,i=d,e.log.debug(`memory.before_recall: prefetched ${l.length} -> ${d.length} after dedup (${o.sessionBytes} bytes used)`);let p=d.map(m=>{let f=m;return{text:f.text??f.content??"",score:f.score,category:f.metadata?.category??null,source:"l2-long-term",label:"L2 long-term"}}).filter(m=>m.text);if(c.preferredCategories?.length||c.deprioritizedCategories?.length){let m={scenario:"general",preferred:c.preferredCategories??[],deprioritized:c.deprioritizedCategories??[],confidence:1};p=p.map(f=>({...f,score:Ha(f.score??.5,f.category,m)})).sort((f,g)=>(g.score??0)-(f.score??0))}let u=.15;return p=p.filter(m=>(m.score??0)>=u),{action:"continue",context:{...c,recalledMemories:[...c.recalledMemories??[],...p]}}}catch(l){e.log.warn(`memory.before_recall: qmemory prefetch failed: ${l instanceof Error?l.message:String(l)}`),i=[]}return{action:"continue",context:c}}})),n.push(t.register({point:"memory.after_recall",priority:50,label:"qmemory-recall-log",handler:(a,c)=>{let l=s===c.turnId?i.length:0;return e.log.debug(`memory.after_recall: ${c.blockCount??0} blocks assembled, ${l} qmemory results (session: ${o.sessionBytes} bytes)`),{action:"continue",context:c}}})),e.localMemoryProvider&&(n.push(t.register({point:"turn.completed",priority:90,label:"memory-auto-extract",handler:async(a,c)=>{let l=e.getLastUserMessage?.();if(!l)return{action:"continue",context:c};let d=Jp(l);if(d.length===0)return{action:"continue",context:c};for(let p of d)try{await e.localMemoryProvider.addText(p.text,e.userId,{source:"auto-extract",category:p.category,importance:.6}),e.log.debug(`memory-auto-extract: stored "${p.text.slice(0,50)}..." (${p.category})`)}catch{}return{action:"continue",context:c}}})),n.push(t.register({point:"turn.completed",priority:95,label:"memory-implicit-extract",handler:async(a,c)=>{let l=e.getLastUserMessage?.();if(!l)return{action:"continue",context:c};if(Jp(l).length>0)return{action:"continue",context:c};if(!Ba(l))return{action:"continue",context:c};let p=e.getLastAssistantMessage?.();return!p||!e.llmExtract?{action:"continue",context:c}:(Gp({userMessage:l,assistantMessage:p},{localProvider:e.localMemoryProvider,userId:e.userId,log:e.log,llmExtract:e.llmExtract}).catch(()=>{}),{action:"continue",context:c})}}))),()=>{for(let a of n)a();i=[]}}function Zp(t,e,r){let n=r??kt();return t.register({point:"memory.before_recall",priority:40,label:"memdir-cross-file-recall",handler:async(s,i)=>{let a=e.getMemorySource();if(!a||!i.query)return{action:"continue",context:i};if(n.sessionBytes>=Kr.MAX_SESSION_BYTES)return e.log.debug("memdir-recall: session byte budget exhausted, skipping"),{action:"continue",context:i};try{let c=a.getRootPath(),l=await Hp(i.query,c,n.surfacedPaths);if(l.length===0)return{action:"continue",context:i};if(i.preferredCategories?.length||i.deprioritizedCategories?.length){let f={scenario:"general",preferred:i.preferredCategories??[],deprioritized:i.deprioritizedCategories??[],confidence:1};l=l.map(g=>({...g,score:Ha(g.score,Wp(g.filename),f)})).sort((g,h)=>h.score-g.score)}let d=l.filter(f=>{let g=Buffer.byteLength(f.content,"utf-8");return n.sessionBytes+g>Kr.MAX_SESSION_BYTES?!1:(n.surfacedPaths.add(f.filePath),n.sessionBytes+=g,!0)});if(d.length===0)return{action:"continue",context:i};e.log.debug(`memdir-recall: found ${l.length} -> accepted ${d.length} files (${n.sessionBytes} bytes used)`);let p=Bp(d),u=i.recalledMemories??[];return{action:"continue",context:{...i,recalledMemories:[...[{text:p,score:.9,category:"project",source:"l1-project-md",label:"L1 project MD"}],...u]}}}catch(c){e.log.warn(`memdir-recall: cross-file recall failed: ${c instanceof Error?c.message:String(c)}`)}return{action:"continue",context:i}}})}var Cx=[{pattern:/(?:请|帮我)?记住[::]\s*(.+)/i,category:"personal_fact",extractor:t=>t[1]?.trim()||null},{pattern:/(?:请|帮我)?记住(.{10,120})/i,category:"personal_fact",extractor:t=>t[1]?.trim()||null},{pattern:/我的偏好[是为::]\s*(.+)/i,category:"preference",extractor:t=>t[1]?.trim()||null},{pattern:/我(?:喜欢|偏好|习惯)(.{5,100})/i,category:"preference",extractor:t=>`\u7528\u6237\u504F\u597D: ${t[1]?.trim()}`},{pattern:/以后(?:都|请|要)(.{5,100})/i,category:"preference",extractor:t=>`\u7528\u6237\u8981\u6C42: ${t[1]?.trim()}`},{pattern:/remember(?:\s+that)?[::]\s*(.+)/i,category:"personal_fact",extractor:t=>t[1]?.trim()||null},{pattern:/(?:note|memo)[::]\s*(.+)/i,category:"lesson",extractor:t=>t[1]?.trim()||null},{pattern:/my preference is[::]?\s*(.+)/i,category:"preference",extractor:t=>t[1]?.trim()||null},{pattern:/i (?:always|prefer|like to|want you to)\s+(.{10,120})/i,category:"preference",extractor:t=>`User preference: ${t[1]?.trim()}`}];function Jp(t){let e=[],r=t.slice(0,500);for(let{pattern:n,category:o,extractor:s}of Cx){let i=r.match(n);if(i){let a=s(i,r);if(a&&a.length>=5&&a.length<=300){e.push({text:a,category:o});break}}}return e}import*as q from"node:fs";import*as Se from"node:path";G();import{resolve as _x}from"node:path";var Nn=class{constructor(e={}){this.options=e}options;getActiveProjectRoot(){return this.options.getActiveProjectRoot?.()??process.cwd()}setActiveWorkdir(e){this.options.setActiveWorkdir?.(_x(e))}resolveProjectDir(e){return this.options.resolveProjectDir?.(e)}resolveActiveOwnerUserId(){return Vr()}getUserAgentHome(){return X()}getOwnerProfileDir(e){return B(e)}getProfileMemoryDir(e){return em(e)}getUserSettingsPath(){return $e()}getUserSkillsDir(){return sr()}getUserPluginsDir(){return Vo()}getUserMcpConfigPath(){return rm()}getUserPluginCacheDir(){return tm()}getUserMarketplaceConfigPath(){return nm()}getUserAssistantPresetsPath(){return Dn()}getProjectAgentDir(e=this.getActiveProjectRoot()){return De(e)}getProjectSettingsPath(e=this.getActiveProjectRoot()){return sm(e)}getProjectInstructionsPath(e=this.getActiveProjectRoot()){return br(e)}getProjectSkillsDir(e=this.getActiveProjectRoot()){return ir(e)}getProjectPluginsDir(e=this.getActiveProjectRoot()){return Xo(e)}getProjectRulesDir(e=this.getActiveProjectRoot()){return Xr(e)}getProjectSessionsRoot(e=this.getActiveProjectRoot()){return Yo(e)}getKnownProjectDirs(e,r){return Cc(e,r)}getAllProjectSkillDirs(e,r){return cm(e,r)}},Dx=new Nn;function I(){return Dx}var um="transcript.jsonl",Kt="metadata.json",lm="state.json";function Nx(t){return I().getProjectSessionsRoot(t)}function Yr(t,e){let r=t.replace(/[^a-zA-Z0-9_-]/g,"_");return Se.join(Nx(e),r)}function dm(t){if(!t)return Date.now();let e=Date.parse(t);return Number.isFinite(e)?e:Date.now()}async function Lx(t,e,r){let n={metadata:{sessionId:e.sessionId,createdAt:dm(e.createdAt),lastActiveAt:dm(e.lastActiveAt),model:e.model,cwd:e.cwd,turnCount:e.turnCount,messageCount:e.messageCount,title:e.title},costSnapshot:r},o=Se.join(t,lm+".tmp");await q.promises.writeFile(o,JSON.stringify(n,null,2),"utf8"),await q.promises.rename(o,Se.join(t,lm))}function pm(t,e){let r=t.replace(/[^a-zA-Z0-9_-]/g,"_"),n=Se.join(I().getProjectSessionsRoot(e),r),o=Se.join(n,Kt);if(q.existsSync(o))return n}function Vt(t,e){let r=pm(t,e);if(!r)return null;try{let n=q.readFileSync(Se.join(r,Kt),"utf8");return JSON.parse(n)}catch{return null}}async function Ic(t,e,r,n){let o=Yr(t,r);try{await q.promises.mkdir(o,{recursive:!0});let s={role:e.role,content:e.content,ts:Date.now()};n&&(s.turnId=n);let i=JSON.stringify(s)+`
36
36
  `;return await q.promises.appendFile(Se.join(o,um),i,"utf8"),!0}catch(s){return console.error(`[session-persistence] appendMessage failed for ${t}: ${s.message}`),!1}}async function mm(t,e,r,n){let o=Yr(t,n);await q.promises.mkdir(o,{recursive:!0});let s={};try{let l=await q.promises.readFile(Se.join(o,Kt),"utf8");s=JSON.parse(l)}catch{}let i=new Date().toISOString(),a={sessionId:t,projectId:r.projectId??s.projectId??"",createdAt:r.createdAt??s.createdAt??i,lastActiveAt:i,model:r.model??s.model,cwd:r.cwd??s.cwd,turnCount:e.turnCount,messageCount:r.messageCount??s.messageCount??0,title:r.title??s.title,pinnedAt:r.pinnedAt!==void 0?r.pinnedAt:s.pinnedAt,archivedAt:r.archivedAt!==void 0?r.archivedAt:s.archivedAt,type:r.type??s.type,ownerId:r.ownerId??s.ownerId,groupKey:r.groupKey??s.groupKey,groupName:r.groupName??s.groupName,groupPlatform:r.groupPlatform??s.groupPlatform,assistant:r.assistant??s.assistant,sealedAt:r.sealedAt??s.sealedAt,previousSessionId:r.previousSessionId??s.previousSessionId,carryoverSummary:r.carryoverSummary??s.carryoverSummary,totalInputTokens:e.totalInputTokens,totalOutputTokens:e.totalOutputTokens},c=Se.join(o,Kt+".tmp");await q.promises.writeFile(c,JSON.stringify(a,null,2),"utf8"),await q.promises.rename(c,Se.join(o,Kt)),await Lx(o,a,e)}async function Ue(t,e,r){let o=pm(t,r)??Yr(t,r),s=Se.join(o,Kt),i=new Date().toISOString(),a;try{let d=await q.promises.readFile(s,"utf8");a=JSON.parse(d)}catch{await q.promises.mkdir(o,{recursive:!0}),a={sessionId:t,projectId:e.projectId??"",createdAt:i,lastActiveAt:i,turnCount:0,messageCount:0,...e};let d=s+".tmp";return await q.promises.writeFile(d,JSON.stringify(a,null,2),"utf8"),await q.promises.rename(d,s),a}let c={...a};e.title!==void 0&&(c.title=e.title??void 0),e.pinnedAt!==void 0&&(c.pinnedAt=e.pinnedAt??void 0),e.archivedAt!==void 0&&(c.archivedAt=e.archivedAt??void 0),e.sealedAt!==void 0&&(c.sealedAt=e.sealedAt??void 0),e.previousSessionId!==void 0&&(c.previousSessionId=e.previousSessionId??void 0),e.carryoverSummary!==void 0&&(c.carryoverSummary=e.carryoverSummary??void 0),e.projectId!==void 0&&(c.projectId=e.projectId??c.projectId),e.type!==void 0&&(c.type=e.type??void 0),e.ownerId!==void 0&&(c.ownerId=e.ownerId??void 0),e.groupKey!==void 0&&(c.groupKey=e.groupKey??void 0),e.groupName!==void 0&&(c.groupName=e.groupName??void 0),e.groupPlatform!==void 0&&(c.groupPlatform=e.groupPlatform??void 0),e.assistant!==void 0&&(c.assistant=e.assistant??void 0),c.lastActiveAt=i;let l=s+".tmp";return await q.promises.writeFile(l,JSON.stringify(c,null,2),"utf8"),await q.promises.rename(l,s),c}async function Ec(t,e){try{await q.promises.access(e,q.constants.R_OK)}catch{return console.error(`[session-persistence] loadSessionForResume: projectRoot not accessible: ${e}`),null}let r=Yr(t,e),n=Se.join(r,um),o=Se.join(r,Kt),s=[],i=0;try{let d=await q.promises.readFile(n,"utf8");for(let p of d.split(`
37
37
  `))if(p.trim())try{let u=JSON.parse(p);s.push({role:u.role,content:u.content??null})}catch{i++}i>0&&console.warn(`[session-persistence] ${i} corrupt line(s) skipped in ${n}`)}catch{return null}if(s.length===0&&i>0)return console.error(`[session-persistence] Transcript fully corrupt for session ${t}`),null;let a=new Date().toISOString(),c={sessionId:t,projectId:"",createdAt:a,lastActiveAt:a,turnCount:0,messageCount:s.length};try{let d=await q.promises.readFile(o,"utf8");c=JSON.parse(d)}catch{}let l=s.filter(d=>d.role!=="system");return{metadata:c,messages:l}}async function Rt(t=pc,e){let r=I().getProjectSessionsRoot(e),n;try{n=await q.promises.readdir(r)}catch{return[]}let o=[];for(let s of n){let i=Se.join(r,s,Kt);try{let a=await q.promises.readFile(i,"utf8"),c=JSON.parse(a);o.push({sessionId:c.sessionId,title:c.title,lastActiveAt:c.lastActiveAt,messageCount:c.messageCount,model:c.model,pinnedAt:c.pinnedAt,archivedAt:c.archivedAt,sealedAt:c.sealedAt,projectId:c.projectId,type:c.type??"personal",createdAt:c.createdAt,groupKey:c.groupKey,previousSessionId:c.previousSessionId,carryoverSummary:c.carryoverSummary??null})}catch{}}return o.sort((s,i)=>s.lastActiveAt>i.lastActiveAt?-1:s.lastActiveAt<i.lastActiveAt?1:0),o.slice(0,t)}async function Mc(t,e){let r=Yr(t,e);await q.promises.rm(r,{recursive:!0,force:!0})}function Ox(t){return t.turnCount<mc?!1:t.taskSummaryGeneratedAt?t.turnCount-(t.taskSummaryGeneratedAt??0)>=gc:!0}var jx="Based on the user's message below, generate a very short session title (2-8 Chinese characters or 3-6 English words). The title should capture the main topic or intent. Reply with ONLY the title text, no quotes, no punctuation.";async function gm(t,e){if(!t.trim())return null;try{let r=e.transport.stream({model:e.model,messages:[{role:"system",content:jx},{role:"user",content:t.slice(0,500)}],tools:[],maxTokens:30},e.apiKey),n="";for await(let o of r)o.type==="delta"&&(n+=o.text);return n=n.trim().replace(/^["'""'']+|["'""'']+$/g,""),n||null}catch{return null}}async function fm(t,e,r,n,o){if(!Ox(e))return null;try{let i=r.slice(-20).map(p=>`[${p.role}]: ${typeof p.content=="string"?p.content.slice(0,500):JSON.stringify(p.content).slice(0,500)}`).join(`
38
- `),a=n.transport.stream({model:n.model,messages:[{role:"system",content:"Generate a concise task summary (~100 words) of what the user is working on in this session. Focus on the goal, key decisions, and current progress. Reply with ONLY the summary."},{role:"user",content:i}],tools:[],maxTokens:200},n.apiKey),c="";for await(let p of a)p.type==="delta"&&(c+=p.text);if(c=c.trim(),!c)return null;let l=Yr(t,o),d=Se.join(l,Kt);try{let p=await q.promises.readFile(d,"utf8"),u=JSON.parse(p);u.taskSummary=c,u.taskSummaryGeneratedAt=e.turnCount;let m=d+".tmp";await q.promises.writeFile(m,JSON.stringify(u,null,2),"utf8"),await q.promises.rename(m,d)}catch{}return c}catch{return null}}import{randomUUID as v1}from"node:crypto";var $x=3e4;var Qo=class{tasks=new Map;listeners=new Set;hooks=null;sessionId="";setHooks(e,r){this.hooks=e,this.sessionId=r}onTaskChange(e){return this.listeners.add(e),()=>this.listeners.delete(e)}notify(e,r){for(let n of this.listeners)try{n(e,r)}catch{}}registerTask(e){this.tasks.set(e.taskId,e),this.notify(e.taskId,e),this.hooks?.invoke("task.created",{sessionId:this.sessionId,taskId:e.taskId,taskType:e.type,label:e.label}).catch(()=>{})}updateTask(e,r){let n=this.tasks.get(e);if(!n)return;let o=r(n);o!==n&&(this.tasks.set(e,o),this.notify(e,o),!Jo(n.lifecycle)&&Jo(o.lifecycle)&&this.hooks?.invoke("task.completed",{sessionId:this.sessionId,taskId:o.taskId,taskType:o.type,label:o.label}).catch(()=>{}))}getTask(e){return this.tasks.get(e)}getRunningTasks(){return[...this.tasks.values()].filter(e=>e.lifecycle==="running")}getAllTasks(){return[...this.tasks.values()]}evictTask(e){let r=this.tasks.get(e);r&&Jo(r.lifecycle)&&(this.tasks.delete(e),this.notify(e,null))}evictStaleTasks(e=$x){let r=Date.now();for(let[n,o]of this.tasks)Jo(o.lifecycle)&&o.endedAt&&r-o.endedAt>e&&(this.tasks.delete(n),this.notify(n,null))}};function Jo(t){return t==="completed"||t==="failed"||t==="cancelled"||t==="timeout"}var _c=new Set;function Xt(t){return _c.add(t),()=>{_c.delete(t)}}async function hm(){await Promise.all(Array.from(_c).map(t=>t()))}Fe();function kr(t=process.env){return{get:e=>t[e]}}var rs="\u65E0\u6CD5\u8FDE\u63A5 llmrouter \u6A21\u578B\u76EE\u5F55",Y="llmrouter",Dc="LLMRouter",Yt=class extends Error{constructor(e=rs){super(e),this.name="LlmrouterCatalogUnavailableError"}};function Rm(t=kr()){let e=t.get("QLOGIC_LLMROUTER_BASE_URL")?.trim().replace(/\/+$/,"");if(!e)throw new Yt;return e}function Sm(t){return Rm(t)}function Gx(t=kr()){let e={accept:"application/json"},r=t.get("QLOGIC_LLMROUTER_ACCESS_TOKEN")?.trim();return r&&(e.authorization=`Bearer ${r}`),e}async function Tm(t,e){let r=Rm(e),n;try{n=await fetch(`${r}${t}`,{method:"GET",headers:Gx(e),signal:AbortSignal.timeout(1e4)})}catch{throw new Yt}if(!n.ok)throw new Yt;let o=await n.json().catch(()=>null),s=Array.isArray(o)?o:Im(o)&&Array.isArray(o.data)?o.data:null;if(!s)throw new Yt;return s}function Nc(t){let e=t.trim().replace(/\/+$/,"");return e.endsWith("/v1")?`${e}/models`:`${e}/v1/models`}async function zx(t,e){let r;try{r=await fetch(t,{method:"GET",headers:{accept:"application/json",authorization:`Bearer ${e}`},signal:AbortSignal.timeout(1e4)})}catch{throw new Yt}if(!r.ok)throw new Yt;let n=await r.json().catch(()=>null),o=Array.isArray(n)?n:Im(n)&&Array.isArray(n.data)?n.data:null;if(!o)throw new Yt;return o}async function Lc(t){return Tm("/ext/model-catalog/providers",t)}async function Kx(t){return Tm("/ext/model-catalog/models",t)}async function Vx(t,e){return zx(Nc(t),e)}function wm(t){let e={zhipu:"Zhipu GLM","zhipu-openai":"Zhipu GLM OpenAI","zhipu-coding":"Zhipu GLM Coding",volcengine:"Doubao / Volcengine"};return e[t.id]?e[t.id]:t.displayName??t.name??t.id}function ns(t){return t.baseUrl??t.base_url}async function Am(t,e){return(await Lc(e)).find(n=>n.id===t)??null}async function jn(t,e){let r=await Kx(e);t.migrateModelIds(Pm(r));let n=r.flatMap(xm);return t.replaceCatalogModels(n),n}async function Oc(t,e){let r=await Vx(e.baseUrl,e.apiKey);if(r.length===0)return[];t.migrateModelIds(Pm(r));let n=r.flatMap(xm).filter(o=>o.provider===Y).map(o=>({...o,baseUrl:e.baseUrl}));return t.replaceProviderModels(Y,n),n}function Pm(t){let e=new Map;for(let r of t){let n=r.provider??r.owned_by,o=r.public_model??r.publicModel??r.id,s=r.native_model_id??r.nativeModelId??r.id;if(!o)continue;let i=`${Y}:${o}`;if(n){let a=`${n}:${o}`;for(let c of[o,s,r.id]){if(!c)continue;let l=`${n}:${c}`;l!==a&&e.set(l,a)}}for(let a of[s,r.id]){if(!a)continue;let c=`${Y}:${a}`;c!==i&&e.set(c,i)}}return e}function xm(t){return[Xx(t),Yx(t)].filter(e=>!!e)}function Xx(t){let e=t.provider??t.owned_by,r=t.public_model??t.publicModel??t.id,n=t.native_model_id??t.nativeModelId??t.id;return!e||!r||!n?null:{id:`${e}:${r}`,provider:e,model:r,displayName:t.display_name??t.displayName??t.name??t.id,purposes:Cm(t.purposes,t.category),baseUrl:t.baseUrl??t.base_url,enabled:!0,nativeModelId:n,transport:t.provider_transport??t.providerTransport,contextWindow:t.context_window??t.contextWindow,maxOutput:t.max_output??t.maxOutput,streamRequired:t.stream_required??t.streamRequired,capabilities:t.capabilities,pricing:t.pricing}}function Yx(t){let e=t.public_model??t.publicModel??t.id;return e?{id:`${Y}:${e}`,provider:Y,model:e,displayName:t.display_name??t.displayName??t.name??t.id,purposes:Cm(t.purposes,t.category),enabled:!0,nativeModelId:e,transport:"openai-responses",contextWindow:t.context_window??t.contextWindow,maxOutput:t.max_output??t.maxOutput,streamRequired:t.stream_required??t.streamRequired,capabilities:t.capabilities,pricing:t.pricing}:null}function Cm(t,e){let r=[...t??[],e].filter(s=>!!s),n=new Set(["textGeneration","smallModel","stt","tts","imageGeneration","imageUnderstanding","videoGeneration","videoUnderstanding","threeDGeneration","embedding","voiceClone","musicGeneration","realtimeAudio","realtimeVideo"]),o=r.filter(s=>n.has(s));return[...new Set(o.length?o:["textGeneration"])]}function Im(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}import*as Ip from"node:path";var Rr="1.0.0",y={PARSE_ERROR:-32700,INVALID_REQUEST:-32600,METHOD_NOT_FOUND:-32601,INVALID_PARAMS:-32602,INTERNAL_ERROR:-32603,TURN_ABORTED:-32e3,TURN_TIMEOUT:-32001,LLM_ERROR:-32010,LLM_AUTH_ERROR:-32011,LLM_RATE_LIMIT:-32012,LLM_QUOTA_EXHAUSTED:-32013,LLM_MODEL_NOT_FOUND:-32014,TOOL_INVOKE_FAILED:-32020,TOOL_TIMEOUT:-32021,PROTOCOL_MISMATCH:-32030,REQUEST_DEADLINE_EXCEEDED:-32040,REQUEST_CANCELLED:-32041,REQUEST_DEDUPED:-32042,REQUEST_IDEMPOTENCY_REQUIRED:-32043};function jc(t){if(!t||typeof t!="object")return!1;let e=t;return e.jsonrpc==="2.0"&&typeof e.method=="string"&&e.method.length>0}import{randomUUID as Jx}from"node:crypto";var Qx=["settings.list","settings.get","settings.validate","provider.list","config.get","config.tunables","tools.list","todos.list","tasks.list","agents.list","agents.get","agents.processes","agents.scan","assistants.list","assistants.resolve","session.list","session.get","session.resolve","thread.list","project.list","files.list","files.gitStatus","instructions.list","instructions.read","skills.list","skills.stats","memory.atlas","memory.activity","memory.list","memory.read","memory.search","media.listModels","media.status","pet.status","agent.health","agent.metrics"],Zx=new Set(["thread.turn","memory.dream","memory.propose","memory.consolidate","media.stt","pet.forge","solo.start","solo.evaluate","product.plan","product.create","product.message"]),eC=["memory.","pet.","usage."],tC=new Set(["memory.atlas","memory.activity","memory.list","memory.read","memory.search","pet.status"]);function os(t){return Zx.has(t)?{channel:"task",mutability:"write",defaultTimeoutMs:t==="thread.turn"?3e5:12e4}:Qx.some(e=>t===e||t.startsWith(`${e}.`)||t.startsWith(e))?{channel:"query",mutability:"read",defaultTimeoutMs:1e4}:{channel:"task",mutability:"write",defaultTimeoutMs:3e4}}function Em(t){return tC.has(t)||os(t).mutability==="read"?!1:eC.some(e=>t.startsWith(e))}function $c(t,e={}){let r=e.now??Date.now(),n=os(t),o=e.timeoutMs??n.defaultTimeoutMs;return{requestId:e.requestId??Jx(),createdAt:r,deadlineAt:r+o,channel:e.channel??n.channel,idempotencyKey:e.idempotencyKey,traceId:e.traceId}}function ss(t,e=Date.now()){let r=t.meta;if(!r||typeof r!="object")return{ok:!1,error:{code:y.INVALID_REQUEST,message:"RPC request meta is required."}};if(typeof r.requestId!="string"||r.requestId.length===0)return{ok:!1,error:{code:y.INVALID_REQUEST,message:"RPC request meta.requestId is required."}};if(r.channel!=="query"&&r.channel!=="task")return{ok:!1,error:{code:y.INVALID_REQUEST,message:"RPC request meta.channel must be query or task."}};if(typeof r.createdAt!="number"||!Number.isFinite(r.createdAt))return{ok:!1,error:{code:y.INVALID_REQUEST,message:"RPC request meta.createdAt is required."}};if(typeof r.deadlineAt!="number"||!Number.isFinite(r.deadlineAt))return{ok:!1,error:{code:y.INVALID_REQUEST,message:"RPC request meta.deadlineAt is required."}};if(r.deadlineAt<=e)return{ok:!1,error:{code:y.REQUEST_DEADLINE_EXCEEDED,message:"RPC request deadline has already expired."}};let n=os(t.method).channel;return r.channel!==n?{ok:!1,error:{code:y.INVALID_REQUEST,message:`RPC request channel mismatch: expected ${n}, got ${r.channel}.`}}:Em(t.method)&&(typeof r.idempotencyKey!="string"||r.idempotencyKey.length===0)?{ok:!1,error:{code:y.REQUEST_IDEMPOTENCY_REQUIRED,message:`RPC method ${t.method} requires meta.idempotencyKey.`}}:{ok:!0,meta:r}}var $n=class{now;active=new Map;idempotency=new Map;counters={completedRequests:0,cancelledRequests:0,deadlineExceededRequests:0,dedupedRequests:0,lateResponsesDropped:0,invalidRequests:0};constructor(e={}){this.now=e.now??(()=>Date.now())}begin(e,r){let n=ss({method:e,meta:r},this.now());if(!n.ok)return this.counters.invalidRequests+=1,{status:"rejected",error:n.error};if(r.idempotencyKey){let o=this.idempotency.get(r.idempotencyKey);if(o)return this.counters.dedupedRequests+=1,o.error?{status:"deduped",error:o.error}:{status:"deduped",result:o.result}}return this.active.set(r.requestId,{method:e,meta:r,cancelled:!1,startedAt:this.now()}),{status:"started"}}cancel(e,r="cancelled"){let n=this.active.get(e);return!n||n.cancelled?!1:(n.cancelled=!0,n.cancelReason=r,this.counters.cancelledRequests+=1,!0)}expire(e){return this.active.get(e)?(this.active.delete(e),this.counters.deadlineExceededRequests+=1,!0):!1}settle(e,r,n){let o=this.active.get(e);return o?(this.active.delete(e),o.cancelled?(this.counters.lateResponsesDropped+=1,{accepted:!1,reason:"cancelled"}):o.meta.deadlineAt<=this.now()?(this.counters.deadlineExceededRequests+=1,this.counters.lateResponsesDropped+=1,{accepted:!1,reason:"deadline_exceeded"}):(this.counters.completedRequests+=1,o.meta.idempotencyKey&&this.idempotency.set(o.meta.idempotencyKey,{result:r,error:n,settledAt:this.now()}),{accepted:!0})):{accepted:!1,reason:"unknown"}}metrics(){return{activeRequests:this.active.size,...this.counters}}};var Mm=["turn.start","turn.delta","turn.end","turn.error","turn.recovery","turn.tool_call","turn.tool_result","turn.tool_blocked","turn.reasoning_delta","turn.approval_request","turn.skill_instruction","turn.ask_user","turn.media_result","turn.media_progress","turn.plan_update","turn.suggestions","turn.sidechain_started","turn.subagent_delta","turn.sidechain_completed","turn.task_updated","turn.todos_updated","turn.exec_progress","turn.usage_update","team.member.notification","session.info","memory.updated","skills.updated","pet.soul_ready","pet.reaction","pet.growth","pet.state","pet.confirm","pet.forged","system.activity","workflow.created","workflow.updated","workflow.deleted","workflow.runStarted","workflow.runCompleted","workflow.runFailed"],_m=["solo.progress","solo.agentDelta","solo.agentUsage","solo.agentDiff","solo.evaluation","product.taskStarted","product.taskOutput","product.taskCompleted","product.taskFailed","product.budgetUpdate","product.checkpointed","product.dagTopology","plan.interrupted"],rC=[...Mm,..._m];var St={INITIALIZE:"initialize",SESSION_NEW:"session/new",SESSION_PROMPT:"session/prompt",SESSION_END:"session/end",SESSION_SET_CONFIG:"session/set_config_option",SESSION_SET_MODEL:"session/set_model",SESSION_SET_MODE:"session/set_mode",SESSION_UPDATE:"session/update",SESSION_REQUEST_PERMISSION:"session/request_permission",FS_READ_TEXT_FILE:"fs/read_text_file",FS_WRITE_TEXT_FILE:"fs/write_text_file"},Z={ABORT:"x/abort",DREAM:"x/dream",AGENTS_LIST:"x/agents.list",SOLO_START:"x/solo.start",SOLO_STATUS:"x/solo.status",SOLO_SELECT:"x/solo.select",SOLO_CANCEL:"x/solo.cancel",PRODUCT_CREATE:"x/product.create",PRODUCT_PLAN:"x/product.plan",PRODUCT_CONFIRM:"x/product.confirm",PRODUCT_MESSAGE:"x/product.message",PRODUCT_RESUME:"x/product.resume",PRODUCT_PAUSE:"x/product.pause",PRODUCT_CANCEL:"x/product.cancel",PRODUCT_ROLLBACK:"x/product.rollback",PRODUCT_STATUS:"x/product.status",SOLO_SUBSCRIBE:"x/solo.subscribe",SOLO_MESSAGE:"x/solo.message",SOLO_EVALUATE:"x/solo.evaluate",PRODUCT_SUBSCRIBE:"x/product.subscribe",TEAM_DELEGATE:"x/team.delegate"},Tt={AGENT_MESSAGE_CHUNK:"agent_message_chunk",AGENT_THOUGHT_CHUNK:"agent_thought_chunk",TOOL_CALL:"tool_call",TOOL_CALL_UPDATE:"tool_call_update",PLAN:"plan",USAGE_UPDATE:"usage_update",CONFIG_OPTION_UPDATE:"config_option_update",SESSION_INFO_UPDATE:"session_info_update",AVAILABLE_COMMANDS_UPDATE:"available_commands_update"},ae={X_SUBAGENT_STARTED:"x_subagent_started",X_SUBAGENT_DELTA:"x_subagent_delta",X_SUBAGENT_ENDED:"x_subagent_ended",X_MEDIA_RESULT:"x_media_result",X_MEDIA_PROGRESS:"x_media_progress",X_SKILL_INSTRUCTION:"x_skill_instruction",X_RECOVERY:"x_recovery",X_SIDECHAIN_STARTED:"x_sidechain_started",X_SIDECHAIN_COMPLETED:"x_sidechain_completed",X_SUGGESTIONS:"x_suggestions",X_ASK_USER:"x_ask_user",X_SESSION_INFO:"x_session_info",X_MEMORY_UPDATED:"x_memory_updated",X_TEAM_MEMBER_UPDATE:"x_team_member_update",X_SOLO_STARTED:"x_solo_started",X_SOLO_AGENT_FINISHED:"x_solo_agent_finished",X_SOLO_SELECTED:"x_solo_selected",X_PRODUCT_TASK_STARTED:"x_product_task_started",X_PRODUCT_TASK_COMPLETED:"x_product_task_completed",X_PRODUCT_CHECKPOINT:"x_product_checkpoint"};function Un(t){if(!t||typeof t!="object")return!1;let e=t;return e.jsonrpc==="2.0"&&typeof e.method=="string"&&"id"in e}function Fn(t){if(!t||typeof t!="object")return!1;let e=t;return e.jsonrpc==="2.0"&&typeof e.method=="string"&&!("id"in e)}function Uc(t){if(!t||typeof t!="object")return!1;let e=t;return e.jsonrpc==="2.0"&&"id"in e&&!("method"in e)}var Dm="openai-codex";var q1={anthropic:{providerFamily:"anthropic"},"amazon-bedrock":{providerFamily:"anthropic"},"kimi-coding":{anthropicToolSchemaMode:"openai-functions",anthropicToolChoiceMode:"openai-string-modes",preserveAnthropicThinkingSignatures:!1},mistral:{transcriptToolCallIdMode:"strict9",transcriptToolCallIdModelHints:["mistral","mixtral","codestral","pixtral","devstral","ministral","mistralai"]},openai:{providerFamily:"openai"},[Dm]:{providerFamily:"openai"},openrouter:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},opencode:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},kilocode:{providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]}};import{randomUUID as nC}from"node:crypto";var is={PARSE_ERROR:-32700,INVALID_REQUEST:-32600,METHOD_NOT_FOUND:-32601,INVALID_PARAMS:-32602,INTERNAL_ERROR:-32603,PROTOCOL_MISMATCH:-32001,SESSION_NOT_FOUND:-32002,AGENT_BUSY:-32003},as=class{transport;handler;verbose;hostCapabilities={};hostSupportsExtendedEvents=!1;hostSupportsExtendedMethods=!1;activeSessionId=null;pendingPermissions=new Map;outboundRequestMap=new Map;constructor(e,r,n){this.transport=e,this.handler=r,this.verbose=n?.verbose??!1}dispatchMessage(e){if(this.isJsonRpcResponse(e))return this.handleResponse(e),!0;if(Un(e)){let r=e;return process.stderr.write(`[acp-server] -> recv id=${String(r.id)} method=${r.method}
38
+ `),a=n.transport.stream({model:n.model,messages:[{role:"system",content:"Generate a concise task summary (~100 words) of what the user is working on in this session. Focus on the goal, key decisions, and current progress. Reply with ONLY the summary."},{role:"user",content:i}],tools:[],maxTokens:200},n.apiKey),c="";for await(let p of a)p.type==="delta"&&(c+=p.text);if(c=c.trim(),!c)return null;let l=Yr(t,o),d=Se.join(l,Kt);try{let p=await q.promises.readFile(d,"utf8"),u=JSON.parse(p);u.taskSummary=c,u.taskSummaryGeneratedAt=e.turnCount;let m=d+".tmp";await q.promises.writeFile(m,JSON.stringify(u,null,2),"utf8"),await q.promises.rename(m,d)}catch{}return c}catch{return null}}import{randomUUID as b1}from"node:crypto";var $x=3e4;var Qo=class{tasks=new Map;listeners=new Set;hooks=null;sessionId="";setHooks(e,r){this.hooks=e,this.sessionId=r}onTaskChange(e){return this.listeners.add(e),()=>this.listeners.delete(e)}notify(e,r){for(let n of this.listeners)try{n(e,r)}catch{}}registerTask(e){this.tasks.set(e.taskId,e),this.notify(e.taskId,e),this.hooks?.invoke("task.created",{sessionId:this.sessionId,taskId:e.taskId,taskType:e.type,label:e.label}).catch(()=>{})}updateTask(e,r){let n=this.tasks.get(e);if(!n)return;let o=r(n);o!==n&&(this.tasks.set(e,o),this.notify(e,o),!Jo(n.lifecycle)&&Jo(o.lifecycle)&&this.hooks?.invoke("task.completed",{sessionId:this.sessionId,taskId:o.taskId,taskType:o.type,label:o.label}).catch(()=>{}))}getTask(e){return this.tasks.get(e)}getRunningTasks(){return[...this.tasks.values()].filter(e=>e.lifecycle==="running")}getAllTasks(){return[...this.tasks.values()]}evictTask(e){let r=this.tasks.get(e);r&&Jo(r.lifecycle)&&(this.tasks.delete(e),this.notify(e,null))}evictStaleTasks(e=$x){let r=Date.now();for(let[n,o]of this.tasks)Jo(o.lifecycle)&&o.endedAt&&r-o.endedAt>e&&(this.tasks.delete(n),this.notify(n,null))}};function Jo(t){return t==="completed"||t==="failed"||t==="cancelled"||t==="timeout"}var _c=new Set;function Xt(t){return _c.add(t),()=>{_c.delete(t)}}async function hm(){await Promise.all(Array.from(_c).map(t=>t()))}Fe();function kr(t=process.env){return{get:e=>t[e]}}var rs="\u65E0\u6CD5\u8FDE\u63A5 llmrouter \u6A21\u578B\u76EE\u5F55",Y="llmrouter",Dc="LLMRouter",Yt=class extends Error{constructor(e=rs){super(e),this.name="LlmrouterCatalogUnavailableError"}};function Rm(t=kr()){let e=t.get("QLOGIC_LLMROUTER_BASE_URL")?.trim().replace(/\/+$/,"");if(!e)throw new Yt;return e}function Sm(t){return Rm(t)}function Gx(t=kr()){let e={accept:"application/json"},r=t.get("QLOGIC_LLMROUTER_ACCESS_TOKEN")?.trim();return r&&(e.authorization=`Bearer ${r}`),e}async function Tm(t,e){let r=Rm(e),n;try{n=await fetch(`${r}${t}`,{method:"GET",headers:Gx(e),signal:AbortSignal.timeout(1e4)})}catch{throw new Yt}if(!n.ok)throw new Yt;let o=await n.json().catch(()=>null),s=Array.isArray(o)?o:Im(o)&&Array.isArray(o.data)?o.data:null;if(!s)throw new Yt;return s}function Nc(t){let e=t.trim().replace(/\/+$/,"");return e.endsWith("/v1")?`${e}/models`:`${e}/v1/models`}async function zx(t,e){let r;try{r=await fetch(t,{method:"GET",headers:{accept:"application/json",authorization:`Bearer ${e}`},signal:AbortSignal.timeout(1e4)})}catch{throw new Yt}if(!r.ok)throw new Yt;let n=await r.json().catch(()=>null),o=Array.isArray(n)?n:Im(n)&&Array.isArray(n.data)?n.data:null;if(!o)throw new Yt;return o}async function Lc(t){return Tm("/ext/model-catalog/providers",t)}async function Kx(t){return Tm("/ext/model-catalog/models",t)}async function Vx(t,e){return zx(Nc(t),e)}function wm(t){let e={zhipu:"Zhipu GLM","zhipu-openai":"Zhipu GLM OpenAI","zhipu-coding":"Zhipu GLM Coding",volcengine:"Doubao / Volcengine"};return e[t.id]?e[t.id]:t.displayName??t.name??t.id}function ns(t){return t.baseUrl??t.base_url}async function Am(t,e){return(await Lc(e)).find(n=>n.id===t)??null}async function jn(t,e){let r=await Kx(e);t.migrateModelIds(Pm(r));let n=r.flatMap(xm);return t.replaceCatalogModels(n),n}async function Oc(t,e){let r=await Vx(e.baseUrl,e.apiKey);if(r.length===0)return[];t.migrateModelIds(Pm(r));let n=r.flatMap(xm).filter(o=>o.provider===Y).map(o=>({...o,baseUrl:e.baseUrl}));return t.replaceProviderModels(Y,n),n}function Pm(t){let e=new Map;for(let r of t){let n=r.provider??r.owned_by,o=r.public_model??r.publicModel??r.id,s=r.native_model_id??r.nativeModelId??r.id;if(!o)continue;let i=`${Y}:${o}`;if(n){let a=`${n}:${o}`;for(let c of[o,s,r.id]){if(!c)continue;let l=`${n}:${c}`;l!==a&&e.set(l,a)}}for(let a of[s,r.id]){if(!a)continue;let c=`${Y}:${a}`;c!==i&&e.set(c,i)}}return e}function xm(t){return[Xx(t),Yx(t)].filter(e=>!!e)}function Xx(t){let e=t.provider??t.owned_by,r=t.public_model??t.publicModel??t.id,n=t.native_model_id??t.nativeModelId??t.id;return!e||!r||!n?null:{id:`${e}:${r}`,provider:e,model:r,displayName:t.display_name??t.displayName??t.name??t.id,purposes:Cm(t.purposes,t.category),baseUrl:t.baseUrl??t.base_url,enabled:!0,nativeModelId:n,transport:t.provider_transport??t.providerTransport,contextWindow:t.context_window??t.contextWindow,maxOutput:t.max_output??t.maxOutput,streamRequired:t.stream_required??t.streamRequired,capabilities:t.capabilities,pricing:t.pricing}}function Yx(t){let e=t.public_model??t.publicModel??t.id;return e?{id:`${Y}:${e}`,provider:Y,model:e,displayName:t.display_name??t.displayName??t.name??t.id,purposes:Cm(t.purposes,t.category),enabled:!0,nativeModelId:e,transport:"openai-responses",contextWindow:t.context_window??t.contextWindow,maxOutput:t.max_output??t.maxOutput,streamRequired:t.stream_required??t.streamRequired,capabilities:t.capabilities,pricing:t.pricing}:null}function Cm(t,e){let r=[...t??[],e].filter(s=>!!s),n=new Set(["textGeneration","smallModel","stt","tts","imageGeneration","imageUnderstanding","videoGeneration","videoUnderstanding","threeDGeneration","embedding","voiceClone","musicGeneration","realtimeAudio","realtimeVideo"]),o=r.filter(s=>n.has(s));return[...new Set(o.length?o:["textGeneration"])]}function Im(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}import*as Ip from"node:path";var Rr="1.0.0",y={PARSE_ERROR:-32700,INVALID_REQUEST:-32600,METHOD_NOT_FOUND:-32601,INVALID_PARAMS:-32602,INTERNAL_ERROR:-32603,TURN_ABORTED:-32e3,TURN_TIMEOUT:-32001,LLM_ERROR:-32010,LLM_AUTH_ERROR:-32011,LLM_RATE_LIMIT:-32012,LLM_QUOTA_EXHAUSTED:-32013,LLM_MODEL_NOT_FOUND:-32014,TOOL_INVOKE_FAILED:-32020,TOOL_TIMEOUT:-32021,PROTOCOL_MISMATCH:-32030,REQUEST_DEADLINE_EXCEEDED:-32040,REQUEST_CANCELLED:-32041,REQUEST_DEDUPED:-32042,REQUEST_IDEMPOTENCY_REQUIRED:-32043};function jc(t){if(!t||typeof t!="object")return!1;let e=t;return e.jsonrpc==="2.0"&&typeof e.method=="string"&&e.method.length>0}import{randomUUID as Jx}from"node:crypto";var Qx=["settings.list","settings.get","settings.validate","provider.list","config.get","config.tunables","tools.list","todos.list","tasks.list","agents.list","agents.get","agents.processes","agents.scan","assistants.list","assistants.resolve","session.list","session.get","session.resolve","thread.list","project.list","files.list","files.gitStatus","instructions.list","instructions.read","skills.list","skills.stats","memory.atlas","memory.activity","memory.list","memory.read","memory.search","media.listModels","media.status","pet.status","agent.health","agent.metrics"],Zx=new Set(["thread.turn","memory.dream","memory.propose","memory.consolidate","media.stt","pet.forge","solo.start","solo.evaluate","product.plan","product.create","product.message"]),eC=["memory.","pet.","usage."],tC=new Set(["memory.atlas","memory.activity","memory.list","memory.read","memory.search","pet.status"]);function os(t){return Zx.has(t)?{channel:"task",mutability:"write",defaultTimeoutMs:t==="thread.turn"?3e5:12e4}:Qx.some(e=>t===e||t.startsWith(`${e}.`)||t.startsWith(e))?{channel:"query",mutability:"read",defaultTimeoutMs:1e4}:{channel:"task",mutability:"write",defaultTimeoutMs:3e4}}function Em(t){return tC.has(t)||os(t).mutability==="read"?!1:eC.some(e=>t.startsWith(e))}function $c(t,e={}){let r=e.now??Date.now(),n=os(t),o=e.timeoutMs??n.defaultTimeoutMs;return{requestId:e.requestId??Jx(),createdAt:r,deadlineAt:r+o,channel:e.channel??n.channel,idempotencyKey:e.idempotencyKey,traceId:e.traceId}}function ss(t,e=Date.now()){let r=t.meta;if(!r||typeof r!="object")return{ok:!1,error:{code:y.INVALID_REQUEST,message:"RPC request meta is required."}};if(typeof r.requestId!="string"||r.requestId.length===0)return{ok:!1,error:{code:y.INVALID_REQUEST,message:"RPC request meta.requestId is required."}};if(r.channel!=="query"&&r.channel!=="task")return{ok:!1,error:{code:y.INVALID_REQUEST,message:"RPC request meta.channel must be query or task."}};if(typeof r.createdAt!="number"||!Number.isFinite(r.createdAt))return{ok:!1,error:{code:y.INVALID_REQUEST,message:"RPC request meta.createdAt is required."}};if(typeof r.deadlineAt!="number"||!Number.isFinite(r.deadlineAt))return{ok:!1,error:{code:y.INVALID_REQUEST,message:"RPC request meta.deadlineAt is required."}};if(r.deadlineAt<=e)return{ok:!1,error:{code:y.REQUEST_DEADLINE_EXCEEDED,message:"RPC request deadline has already expired."}};let n=os(t.method).channel;return r.channel!==n?{ok:!1,error:{code:y.INVALID_REQUEST,message:`RPC request channel mismatch: expected ${n}, got ${r.channel}.`}}:Em(t.method)&&(typeof r.idempotencyKey!="string"||r.idempotencyKey.length===0)?{ok:!1,error:{code:y.REQUEST_IDEMPOTENCY_REQUIRED,message:`RPC method ${t.method} requires meta.idempotencyKey.`}}:{ok:!0,meta:r}}var $n=class{now;active=new Map;idempotency=new Map;counters={completedRequests:0,cancelledRequests:0,deadlineExceededRequests:0,dedupedRequests:0,lateResponsesDropped:0,invalidRequests:0};constructor(e={}){this.now=e.now??(()=>Date.now())}begin(e,r){let n=ss({method:e,meta:r},this.now());if(!n.ok)return this.counters.invalidRequests+=1,{status:"rejected",error:n.error};if(r.idempotencyKey){let o=this.idempotency.get(r.idempotencyKey);if(o)return this.counters.dedupedRequests+=1,o.error?{status:"deduped",error:o.error}:{status:"deduped",result:o.result}}return this.active.set(r.requestId,{method:e,meta:r,cancelled:!1,startedAt:this.now()}),{status:"started"}}cancel(e,r="cancelled"){let n=this.active.get(e);return!n||n.cancelled?!1:(n.cancelled=!0,n.cancelReason=r,this.counters.cancelledRequests+=1,!0)}expire(e){return this.active.get(e)?(this.active.delete(e),this.counters.deadlineExceededRequests+=1,!0):!1}settle(e,r,n){let o=this.active.get(e);return o?(this.active.delete(e),o.cancelled?(this.counters.lateResponsesDropped+=1,{accepted:!1,reason:"cancelled"}):o.meta.deadlineAt<=this.now()?(this.counters.deadlineExceededRequests+=1,this.counters.lateResponsesDropped+=1,{accepted:!1,reason:"deadline_exceeded"}):(this.counters.completedRequests+=1,o.meta.idempotencyKey&&this.idempotency.set(o.meta.idempotencyKey,{result:r,error:n,settledAt:this.now()}),{accepted:!0})):{accepted:!1,reason:"unknown"}}metrics(){return{activeRequests:this.active.size,...this.counters}}};var Mm=["turn.start","turn.delta","turn.end","turn.error","turn.recovery","turn.tool_call","turn.tool_result","turn.tool_blocked","turn.reasoning_delta","turn.approval_request","turn.skill_instruction","turn.ask_user","turn.media_result","turn.media_progress","turn.plan_update","turn.suggestions","turn.sidechain_started","turn.subagent_delta","turn.sidechain_completed","turn.task_updated","turn.todos_updated","turn.exec_progress","turn.usage_update","team.member.notification","session.info","memory.updated","skills.updated","pet.soul_ready","pet.reaction","pet.growth","pet.state","pet.confirm","pet.forged","system.activity","workflow.created","workflow.updated","workflow.deleted","workflow.runStarted","workflow.runCompleted","workflow.runFailed"],_m=["solo.progress","solo.agentDelta","solo.agentUsage","solo.agentDiff","solo.evaluation","product.taskStarted","product.taskOutput","product.taskCompleted","product.taskFailed","product.budgetUpdate","product.checkpointed","product.dagTopology","plan.interrupted"],rC=[...Mm,..._m];var St={INITIALIZE:"initialize",SESSION_NEW:"session/new",SESSION_PROMPT:"session/prompt",SESSION_END:"session/end",SESSION_SET_CONFIG:"session/set_config_option",SESSION_SET_MODEL:"session/set_model",SESSION_SET_MODE:"session/set_mode",SESSION_UPDATE:"session/update",SESSION_REQUEST_PERMISSION:"session/request_permission",FS_READ_TEXT_FILE:"fs/read_text_file",FS_WRITE_TEXT_FILE:"fs/write_text_file"},Z={ABORT:"x/abort",DREAM:"x/dream",AGENTS_LIST:"x/agents.list",SOLO_START:"x/solo.start",SOLO_STATUS:"x/solo.status",SOLO_SELECT:"x/solo.select",SOLO_CANCEL:"x/solo.cancel",PRODUCT_CREATE:"x/product.create",PRODUCT_PLAN:"x/product.plan",PRODUCT_CONFIRM:"x/product.confirm",PRODUCT_MESSAGE:"x/product.message",PRODUCT_RESUME:"x/product.resume",PRODUCT_PAUSE:"x/product.pause",PRODUCT_CANCEL:"x/product.cancel",PRODUCT_ROLLBACK:"x/product.rollback",PRODUCT_STATUS:"x/product.status",SOLO_SUBSCRIBE:"x/solo.subscribe",SOLO_MESSAGE:"x/solo.message",SOLO_EVALUATE:"x/solo.evaluate",PRODUCT_SUBSCRIBE:"x/product.subscribe",TEAM_DELEGATE:"x/team.delegate"},Tt={AGENT_MESSAGE_CHUNK:"agent_message_chunk",AGENT_THOUGHT_CHUNK:"agent_thought_chunk",TOOL_CALL:"tool_call",TOOL_CALL_UPDATE:"tool_call_update",PLAN:"plan",USAGE_UPDATE:"usage_update",CONFIG_OPTION_UPDATE:"config_option_update",SESSION_INFO_UPDATE:"session_info_update",AVAILABLE_COMMANDS_UPDATE:"available_commands_update"},ae={X_SUBAGENT_STARTED:"x_subagent_started",X_SUBAGENT_DELTA:"x_subagent_delta",X_SUBAGENT_ENDED:"x_subagent_ended",X_MEDIA_RESULT:"x_media_result",X_MEDIA_PROGRESS:"x_media_progress",X_SKILL_INSTRUCTION:"x_skill_instruction",X_RECOVERY:"x_recovery",X_SIDECHAIN_STARTED:"x_sidechain_started",X_SIDECHAIN_COMPLETED:"x_sidechain_completed",X_SUGGESTIONS:"x_suggestions",X_ASK_USER:"x_ask_user",X_SESSION_INFO:"x_session_info",X_MEMORY_UPDATED:"x_memory_updated",X_TEAM_MEMBER_UPDATE:"x_team_member_update",X_SOLO_STARTED:"x_solo_started",X_SOLO_AGENT_FINISHED:"x_solo_agent_finished",X_SOLO_SELECTED:"x_solo_selected",X_PRODUCT_TASK_STARTED:"x_product_task_started",X_PRODUCT_TASK_COMPLETED:"x_product_task_completed",X_PRODUCT_CHECKPOINT:"x_product_checkpoint"};function Un(t){if(!t||typeof t!="object")return!1;let e=t;return e.jsonrpc==="2.0"&&typeof e.method=="string"&&"id"in e}function Fn(t){if(!t||typeof t!="object")return!1;let e=t;return e.jsonrpc==="2.0"&&typeof e.method=="string"&&!("id"in e)}function Uc(t){if(!t||typeof t!="object")return!1;let e=t;return e.jsonrpc==="2.0"&&"id"in e&&!("method"in e)}var Dm="openai-codex";var W1={anthropic:{providerFamily:"anthropic"},"amazon-bedrock":{providerFamily:"anthropic"},"kimi-coding":{anthropicToolSchemaMode:"openai-functions",anthropicToolChoiceMode:"openai-string-modes",preserveAnthropicThinkingSignatures:!1},mistral:{transcriptToolCallIdMode:"strict9",transcriptToolCallIdModelHints:["mistral","mixtral","codestral","pixtral","devstral","ministral","mistralai"]},openai:{providerFamily:"openai"},[Dm]:{providerFamily:"openai"},openrouter:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},opencode:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},kilocode:{providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]}};import{randomUUID as nC}from"node:crypto";var is={PARSE_ERROR:-32700,INVALID_REQUEST:-32600,METHOD_NOT_FOUND:-32601,INVALID_PARAMS:-32602,INTERNAL_ERROR:-32603,PROTOCOL_MISMATCH:-32001,SESSION_NOT_FOUND:-32002,AGENT_BUSY:-32003},as=class{transport;handler;verbose;hostCapabilities={};hostSupportsExtendedEvents=!1;hostSupportsExtendedMethods=!1;activeSessionId=null;pendingPermissions=new Map;outboundRequestMap=new Map;constructor(e,r,n){this.transport=e,this.handler=r,this.verbose=n?.verbose??!1}dispatchMessage(e){if(this.isJsonRpcResponse(e))return this.handleResponse(e),!0;if(Un(e)){let r=e;return process.stderr.write(`[acp-server] -> recv id=${String(r.id)} method=${r.method}
39
39
  `),this.handleRequest(r),!0}return Fn(e)?(this.handleNotification(e),!0):!1}emitSessionUpdate(e,r,n){if(r.startsWith("x_")&&!this.hostSupportsExtendedEvents)return;let o={jsonrpc:"2.0",method:St.SESSION_UPDATE,params:{sessionId:e,update:{sessionUpdate:r,...n}}};this.transport.send(o)}async requestPermission(e){let r=`perm-${nC().slice(0,8)}`,n={jsonrpc:"2.0",method:St.SESSION_REQUEST_PERMISSION,params:e,id:r};return new Promise(o=>{this.outboundRequestMap.set(r,e.permissionId),this.pendingPermissions.set(e.permissionId,{resolve:s=>o({optionId:s})}),this.transport.send(n)})}get supportsExtendedEvents(){return this.hostSupportsExtendedEvents}get supportsExtendedMethods(){return this.hostSupportsExtendedMethods}get sessionId(){return this.activeSessionId}async handleRequest(e){let{method:r,params:n,id:o}=e,s=n??{};try{switch(r){case St.INITIALIZE:await this.onInitialize(o,s);break;case St.SESSION_NEW:await this.onSessionNew(o,s);break;case St.SESSION_PROMPT:await this.onSessionPrompt(o,s);break;case St.SESSION_END:await this.onSessionEnd(o,s);break;case St.SESSION_SET_CONFIG:await this.onSessionSetConfig(o,s);break;case St.SESSION_SET_MODEL:await this.handler.handleAcpSessionSetModel(s.sessionId??this.activeSessionId??"",s.modelId??s.model??""),this.sendResult(o,{});break;case St.SESSION_SET_MODE:await this.handler.handleAcpSessionSetMode(s.sessionId??this.activeSessionId??"",s.modeId??s.mode??""),this.sendResult(o,{});break;case Z.ABORT:await this.onAbort(o,s);break;case Z.DREAM:await this.onDream(o,s);break;case Z.AGENTS_LIST:{let i=await this.handler.handleAcpAgentsList();this.sendResult(o,i);break}case Z.SOLO_START:{let i=await this.handler.handleAcpSoloStart(s);this.sendResult(o,i);break}case Z.SOLO_STATUS:{let i=await this.handler.handleAcpSoloStatus(s);this.sendResult(o,i);break}case Z.SOLO_SELECT:{let i=await this.handler.handleAcpSoloSelect(s);this.sendResult(o,i);break}case Z.SOLO_CANCEL:{let i=await this.handler.handleAcpSoloCancel(s);this.sendResult(o,i);break}case Z.SOLO_SUBSCRIBE:{let i=await this.handler.handleAcpSoloSubscribe(s);this.sendResult(o,i);break}case Z.SOLO_MESSAGE:{let i=await this.handler.handleAcpSoloMessage(s);this.sendResult(o,i);break}case Z.SOLO_EVALUATE:{let i=await this.handler.handleAcpSoloEvaluate(s);this.sendResult(o,i);break}case Z.PRODUCT_CREATE:{let i=await this.handler.handleAcpProductCreate(s);this.sendResult(o,i);break}case Z.PRODUCT_PLAN:{let i=await this.handler.handleAcpProductPlan(s);this.sendResult(o,i);break}case Z.PRODUCT_CONFIRM:{let i=await this.handler.handleAcpProductConfirm(s);this.sendResult(o,i);break}case Z.PRODUCT_MESSAGE:{let i=await this.handler.handleAcpProductMessage(s);this.sendResult(o,i);break}case Z.PRODUCT_PAUSE:{let i=await this.handler.handleAcpProductPause(s);this.sendResult(o,i);break}case Z.PRODUCT_RESUME:{let i=await this.handler.handleAcpProductResume(s);this.sendResult(o,i);break}case Z.PRODUCT_CANCEL:{let i=await this.handler.handleAcpProductCancel(s);this.sendResult(o,i);break}case Z.PRODUCT_ROLLBACK:{let i=await this.handler.handleAcpProductRollback(s);this.sendResult(o,i);break}case Z.PRODUCT_STATUS:{let i=await this.handler.handleAcpProductStatus(s);this.sendResult(o,i);break}case Z.PRODUCT_SUBSCRIBE:{let i=await this.handler.handleAcpProductSubscribe(s);this.sendResult(o,i);break}case Z.TEAM_DELEGATE:{let i=await this.handler.handleAcpTeamDelegate(s);this.sendResult(o,i);break}default:this.sendError(o,is.METHOD_NOT_FOUND,`Unknown method: ${r}`)}}catch(i){this.sendError(o,is.INTERNAL_ERROR,i.message)}}handleNotification(e){this.log(`received notification: ${e.method}`)}handleResponse(e){let r=this.outboundRequestMap.get(e.id);if(r){this.outboundRequestMap.delete(e.id);let n=this.pendingPermissions.get(r);if(n){this.pendingPermissions.delete(r);let o=e.result;n.resolve(o?.optionId??"deny")}}else this.log(`received response for id=${String(e.id)} (no matching outbound request)`)}async onInitialize(e,r){this.hostCapabilities=r.clientCapabilities??{},this.hostSupportsExtendedEvents=this.hostCapabilities.extendedEvents??!1,this.hostSupportsExtendedMethods=this.hostCapabilities.extendedMethods??!1;let n=r.clientInfo?.name??"unknown",o=r.clientInfo?.version??"unknown";this.log(`initialize: host=${n} v=${o}, proto=${String(r.protocolVersion)}, extendedEvents=${this.hostSupportsExtendedEvents}, extendedMethods=${this.hostSupportsExtendedMethods}`);let s=await this.handler.handleAcpInitialize(r);this.sendResult(e,s)}async onSessionNew(e,r){let n=await this.handler.handleAcpSessionNew(r);this.activeSessionId=n.sessionId,this.sendResult(e,n)}async onSessionPrompt(e,r){if(!this.activeSessionId||this.activeSessionId!==r.sessionId){this.sendError(e,is.SESSION_NOT_FOUND,`No active session with id: ${r.sessionId}`);return}let n=await this.handler.handleAcpSessionPrompt(r);this.sendResult(e,n)}async onSessionEnd(e,r){await this.handler.handleAcpSessionEnd(r),this.activeSessionId===r.sessionId&&(this.activeSessionId=null),this.sendResult(e,{})}async onSessionSetConfig(e,r){if(this.activeSessionId!==r.sessionId){this.sendError(e,is.SESSION_NOT_FOUND,`No active session with id: ${r.sessionId}`);return}await this.handler.handleAcpSessionSetConfig(r),this.sendResult(e,{})}async onAbort(e,r){await this.handler.handleAcpAbort(r),this.sendResult(e,{aborted:!0})}async onDream(e,r){let n=await this.handler.handleAcpDream(r);this.sendResult(e,n)}sendResult(e,r){process.stderr.write(`[acp-server] -> send id=${String(e)} result
40
40
  `);let n={jsonrpc:"2.0",id:e,result:r};this.transport.send(n)}sendError(e,r,n,o){process.stderr.write(`[acp-server] -> send id=${String(e)} error=${n}
41
41
  `);let s={jsonrpc:"2.0",id:e,error:{code:r,message:n,...o!==void 0?{data:o}:{}}};this.transport.send(s)}isJsonRpcResponse(e){if(!e||typeof e!="object")return!1;let r=e;return r.jsonrpc==="2.0"&&"id"in r&&("result"in r||"error"in r)&&!("method"in r)}log(e){this.verbose&&process.stderr.write(`[acp-server] ${e}
@@ -171,7 +171,7 @@ ${g}`},b=[...o,...p,h,...m],v=Date.now()-n,R=b.reduce((S,T)=>S+this.config.estim
171
171
  `),i=o.filter(u=>!s.includes(u));if(i.length===0)return t;let a=r.maxTokenBudget,c=[],l=0;for(let u of i){if(l>=r.maxFiles||a<=0)break;let m=await r.readFile(u);if(!m)continue;let f=n(m);f>a||(a-=f,l++,c.push({role:"system",content:`[Post-compact file recovery: ${u}]
172
172
 
173
173
  ${m}`}))}if(c.length===0)return t;let d=[...t],p=-1;for(let u=0;u<d.length;u++)d[u].role==="system"&&(p=u);return d.splice(p+1,0,...c),d}function Yc(t,e,r=Vc){if(e.size===0)return{messages:t,tokensFreed:0,removedCount:0};let n=0,o=0,s=[];for(let a of t){let c=a.tool_call_id??"";if(c&&e.has(c)){n+=r(a),o++,e.delete(c);continue}s.push(a)}let i=o>0?{role:"system",content:`[${o} messages removed by snip]`}:void 0;return{messages:s,tokensFreed:n,removedCount:o,boundaryMessage:i}}function Jc(){return{stages:[]}}function Qc(t,e,r){let n=r?.thresholdMessages??40;if(t.filter(a=>a.role!=="system").length<=n)return{messages:t,stagedCount:0};let s=fg(t,e),i=kI(s,e,n);if(i.length===0)return{messages:s,stagedCount:0};for(let a of i)e.stages.push(a);return s=fg(t,e),{messages:s,stagedCount:i.length}}function Zc(t,e){let r=0;for(let n of e.stages)n.committed||(n.committed=!0,r++);return r===0?{messages:t,committed:0}:{messages:hg(t,e),committed:r}}function fg(t,e){return e.stages.filter(n=>n.committed).length===0?t:hg(t,e)}function hg(t,e){let r=e.stages.filter(o=>o.committed).sort((o,s)=>s.range[0]-o.range[0]),n=[...t];for(let o of r){let[s,i]=o.range;if(s>=n.length)continue;let a=Math.min(i,n.length),c={role:"system",content:o.summary};n.splice(s,a-s,c)}return n}function kI(t,e,r){let n=Math.max(0,t.length-Math.floor(r/2)),o=[],s=new Set(e.stages.map(c=>`${c.range[0]}-${c.range[1]}`)),i=-1,a=0;for(let c=0;c<n;c++){let l=t[c];if(l.role==="tool"||l.role==="assistant"&&typeof l.content=="string"&&l.content==="")i<0&&(i=c),a++;else{if(a>=3){let p=`${i}-${i+a}`;s.has(p)||o.push({id:`collapse_${i}_${i+a}`,range:[i,i+a],summary:`[${a} tool results collapsed]`,committed:!1})}i=-1,a=0}}if(a>=3){let c=`${i}-${i+a}`;s.has(c)||o.push({id:`collapse_${i}_${i+a}`,range:[i,i+a],summary:`[${a} tool results collapsed]`,committed:!1})}return o}import{existsSync as el,readFileSync as vg,writeFileSync as RI,readdirSync as bg,mkdirSync as SI}from"node:fs";import{join as tl,dirname as TI}from"node:path";var kg=0;var wI="skill-patterns.json";function Rg(t){return tl(t,".qlogicagent",wI)}function AI(t){let e=Rg(t);try{return JSON.parse(vg(e,"utf8"))}catch{return{version:1,patterns:{}}}}function yg(t,e){let r=Rg(t);SI(TI(r),{recursive:!0}),RI(r,JSON.stringify(e,null,2),"utf8")}function PI(t){let e=Date.now()-Vp;for(let[r,n]of Object.entries(t.patterns))new Date(n.lastSeen).getTime()<e&&delete t.patterns[r]}function Sg(t,e){if(e.length===0)return!1;let r=gs(e),n=AI(t);PI(n);let o=new Date().toISOString(),s=n.patterns[r];if(s||(s={signature:r,count:0,firstSeen:o,lastSeen:o,promoted:!1},n.patterns[r]=s),s.promoted)return yg(t,n),!1;s.count++,s.lastSeen=o;let i=s.count>=Kp;return i&&(s.promoted=!0),yg(t,n),i}function gs(t){return[...t].sort().join("+")}function xI(t,e){if(!el(e))return null;let r=gs(t);try{let n=bg(e,{withFileTypes:!0});for(let o of n){if(!o.isDirectory())continue;let s=tl(e,o.name,"SKILL.md");try{let a=vg(s,"utf8").match(/^tools:\s*\n((?:\s+-\s+\S+\n?)+)/m);if(a){let c=a[1].split(`
174
- `).map(l=>l.replace(/^\s*-\s*/,"").trim()).filter(Boolean);if(gs(c)===r)return o.name}}catch{}}}catch{}return null}function CI(t){if(!el(t))return 0;try{return bg(t,{withFileTypes:!0}).filter(e=>e.isDirectory()&&el(tl(t,e.name,"SKILL.md"))).length}catch{return 0}}function II(t,e){return!(!t.ok||t.existingSkillName||!t.multiStep||t.toolCallCount<oc||t.distinctToolCount<sc||Date.now()-kg<ic||e?.projectSkillsDir&&(CI(e.projectSkillsDir)>=nc||e.tools.length>0&&xI(e.tools,e.projectSkillsDir))||e?.projectRoot&&e.tools.length>0&&!Sg(e.projectRoot,e.tools))}function EI(t){return t.existingSkillName?t.feedback==="negative":!1}function fs(t,e){return EI(t)?{type:"skill.improve",skillName:t.existingSkillName,reason:"negative user feedback on existing skill execution"}:II(t,e)?(kg=Date.now(),{type:"skill.create",suggestedName:e.suggestedName??`auto-skill-${e.tools.slice(0,3).join("-")}`,description:`Multi-step orchestration using ${e.tools.join(", ")}`,tools:e.tools,stepCount:t.toolCallCount}):null}function Tg(t){return t.function&&typeof t.function=="object"&&typeof t.function.name=="string"?t.function.name.trim():typeof t.name=="string"?t.name.trim():""}function MI(t){return t==="enabled-eligible"||t==="installed-awaiting-approval"}function _I(t){return new Map((t??[]).map(e=>[e.toolName,e]))}function DI(t){if(!t.eligibility?.length)return[...t.tools];let e=_I(t.eligibility);return t.tools.filter(r=>{let n=Tg(r);if(!n)return!1;let o=e.get(n);return!o||MI(o.status)})}function NI(t){let e=[],r=t.compatibility??{},n=t.toolChoice;if(t.thinkingEnabled&&r.requireAutoWhenThinking){let o=typeof n=="object"&&n&&!Array.isArray(n)?String(n.type??""):n;o&&o!=="auto"&&o!=="none"&&(e.push("tool_choice downgraded to auto because thinking mode requires auto/none compatibility."),n="auto")}if(n==="required"&&r.allowRequiredToolChoice===!1){let o=r.requiredFallback??"auto";e.push(`tool_choice=required is not supported by this provider; downgraded to ${o}.`),n=o}if(n&&typeof n=="object"&&!Array.isArray(n)&&n.type==="function"&&r.allowNamedToolChoice===!1){let o=r.namedFallback??"required";e.push(`named tool_choice is not supported by this provider; downgraded to ${o}.`),n=o}return{normalizedToolChoice:n,warnings:e}}function rl(t){let e=NI({toolChoice:t.toolChoice,thinkingEnabled:t.thinkingEnabled,compatibility:t.compatibility}),r=e.normalizedToolChoice,n=[...e.warnings],o=DI({tools:t.tools,eligibility:t.eligibility});if(!r||r==="auto")return{tools:o,normalizedToolChoice:r,warnings:n};if(r==="none")return{tools:[],normalizedToolChoice:"none",warnings:n};if(r==="required"){if(o.length===0)throw new Error("tool_choice=required but no tools were provided");return{tools:o,normalizedToolChoice:"required",extraSystemPrompt:"You must call one of the available tools before responding.",warnings:n}}if(typeof r=="object"&&!Array.isArray(r)&&r.type==="function"){let s=r.function??void 0,i=typeof s?.name=="string"?s.name.trim():"";if(!i)throw new Error("tool_choice.function.name is required");let a=o.filter(c=>Tg(c)===i);if(a.length===0)throw new Error(`tool_choice requested unknown tool: ${i}`);return{tools:a,normalizedToolChoice:{type:"function",function:{name:i}},extraSystemPrompt:`You must call the ${i} tool before responding.`,warnings:n}}return{tools:o,normalizedToolChoice:r,warnings:n}}var LI=["stop","aborted","timeout","cancelled","interrupted","error"],OI=["tool_calls","toolCalls","function_call","functionCall","raw_tool_calls","rawToolCalls"];function wg(t){return t==null?[]:typeof t=="string"?t.length>0?[{type:"text",text:t}]:[]:Array.isArray(t)?t:[{type:"text",text:String(t)}]}function jI(t,e){return{...t,content:[...wg(t.content),...wg(e.content)]}}function $I(t){if(!t||typeof t!="object")return!1;if(t.function&&typeof t.function=="object"){let e=t.function.name;if(typeof e=="string"&&e.length>0)return!0}return typeof t.name=="string"&&t.name.length>0}function UI(t){return new Set((t??LI).map(e=>e.trim().toLowerCase()))}function FI(t,e){return t?UI(e).has(t.trim().toLowerCase()):!1}function nl(t){if(!Array.isArray(t)||t.length===0)return[...t];let e=t.map(a=>{if(a.role==="assistant"&&Array.isArray(a.tool_calls)){let c=a.tool_calls.filter(l=>$I(l));return{...a,...c.length>0?{tool_calls:c}:{tool_calls:void 0}}}return{...a}}),r=new Set;for(let a of e)if(!(a.role!=="assistant"||!Array.isArray(a.tool_calls)))for(let c of a.tool_calls)typeof c.id=="string"&&c.id&&r.add(c.id);let n=e.filter(a=>a.role!=="tool"?!0:!!(a.tool_call_id&&r.has(a.tool_call_id))),o=new Set;for(let a of n)a.role==="tool"&&typeof a.tool_call_id=="string"&&a.tool_call_id&&o.add(a.tool_call_id);let s=[];for(let a of n){if(a.role==="assistant"&&Array.isArray(a.tool_calls)&&a.tool_calls.length>0){let c=a.tool_calls.filter(l=>typeof l.id=="string"&&o.has(l.id));if(c.length===0){let{tool_calls:l,...d}=a;d.content!=null&&d.content!==""&&s.push(d);continue}if(c.length<a.tool_calls.length){s.push({...a,tool_calls:c});continue}}s.push(a)}let i=[];for(let a of s){let c=i.length>0?i[i.length-1]:void 0;if(a.role==="user"&&c?.role==="user"){i[i.length-1]=jI(c,a);continue}i.push(a)}return i}function ol(t,e){return FI(e?.stopReason,e?.forcedStopReasons)?t.map(r=>{if(r.role!=="assistant")return{...r};let n={...r};for(let o of OI)delete n[o];return n}):[...t]}function sl(t,e){let r=e?.placeholderToolResult??"Error: Tool loop interrupted before the tool result was replayed.",n=new Set;for(let s of t)s.role==="tool"&&typeof s.tool_call_id=="string"&&s.tool_call_id&&n.add(s.tool_call_id);let o=[];for(let s of t)if(o.push({...s}),!(s.role!=="assistant"||!Array.isArray(s.tool_calls)||s.tool_calls.length===0))for(let i of s.tool_calls)typeof i.id!="string"||!i.id||n.has(i.id)||(n.add(i.id),o.push({role:"tool",tool_call_id:i.id,content:r}));return o}function il(t,e){let r=nl(t),n=ol(r,e);return sl(n,e)}function HI(t){let e=new Set,r=new Set;for(let n of t){if(n.role==="assistant"&&Array.isArray(n.tool_calls))for(let o of n.tool_calls)typeof o.id=="string"&&o.id&&e.add(o.id);n.role==="tool"&&typeof n.tool_call_id=="string"&&n.tool_call_id&&r.add(n.tool_call_id)}return[...e].filter(n=>!r.has(n))}function BI(t){let e=new Set;for(let r of t)r.role==="tool"&&typeof r.tool_call_id=="string"&&r.tool_call_id&&e.add(r.tool_call_id);return[...e]}function qI(t){return{round:t.round??0,maxRounds:t.maxRounds,pendingToolCallIds:[...t.pendingToolCallIds??[]],completedToolCallIds:[...t.completedToolCallIds??[]],lastStopReason:t.lastStopReason,replayMessages:[...t.replayMessages??[]]}}function al(t,e){return{round:t.round+1,maxRounds:t.maxRounds,pendingToolCallIds:[...e.pendingToolCallIds??t.pendingToolCallIds],completedToolCallIds:[...e.completedToolCallIds??t.completedToolCallIds],lastStopReason:e.lastStopReason??t.lastStopReason,replayMessages:[...e.replayMessages??t.replayMessages]}}function hs(t,e){return{round:t.round,maxRounds:t.maxRounds,pendingToolCallIds:[],completedToolCallIds:[...e.completedToolCallIds??t.completedToolCallIds],lastStopReason:e.lastStopReason??t.lastStopReason,replayMessages:[...e.replayMessages??t.replayMessages]}}function ys(t){let e=[],r=nl(t.replayMessages);r.length!==t.replayMessages.length&&e.push({kind:"drop-orphan-tool-result",detail:"Removed orphan tool results or invalid assistant tool calls."});let n=ol(r,t.options);n.some((s,i)=>s!==r[i])&&e.push({kind:"strip-forced-stop-tool-metadata",detail:"Removed assistant tool-call metadata after forced stop."});let o=sl(n,t.options);return o.length>n.length&&e.push({kind:"inject-placeholder-tool-result",detail:"Injected placeholder tool result for pending tool calls."}),{state:qI({maxRounds:t.maxRounds,round:t.round,lastStopReason:t.lastStopReason,replayMessages:o,pendingToolCallIds:HI(o),completedToolCallIds:BI(o)}),recoveryActions:e}}var WI=new Set(["main","sdk","agent","compact","hook","verification","side_question"]);function cl(t){return t?WI.has(t):!0}function ll(t){return t===429||t===529}function vs(t,e=500,r=32e3){let n=Math.min(e*Math.pow(2,t-1),r);return n+Math.floor(Math.random()*n*.25)}var oG={maxBackoffMs:300*1e3,resetCapMs:360*60*1e3,heartbeatIntervalMs:3e4};function bs(){let t=process.env.QLOGICAGENT_PERSISTENT_RETRY;return t==="1"||t==="true"}var Kn=class extends Error{constructor(r,n){super(`Model fallback triggered: ${r} -> ${n}`);this.originalModel=r;this.fallbackModel=n;this.name="FallbackTriggeredError"}originalModel;fallbackModel};function dl(t,e){if(e.allowedTools&&e.allowedTools.length>0){let r=new Set(e.allowedTools);return t.filter(n=>r.has(n))}if(e.toolCapabilityProfile==="no_tools")return[];if(e.toolCapabilityProfile==="read_tools"){let r=new Set(["file_edit","create_file","write_file","replace_string_in_file","multi_replace_string_in_file","create_directory","delete_file","rename_file","move_file","exec","run_in_terminal","run_command","git_commit","git_push","patch"]);return t.filter(n=>!r.has(n))}return e.canFork?[...t]:t.filter(r=>r!=="agent")}var GI={name:"general",label:"General Purpose",description:"A general-purpose sub-agent that can perform any task with full tool access.",maxTurns:200,toolCapabilityProfile:"all_tools",canFork:!1},zI={name:"explore",label:"Explore",description:"Fast read-only codebase exploration. Search files, read code, analyze structure. Cannot write or execute.",maxTurns:50,toolCapabilityProfile:"read_tools",allowedTools:["read_file","search","web_search","web_fetch","think","memory","tool_search"],canFork:!1},KI={name:"plan",label:"Plan",description:"Planning mode. Explore, analyze, and produce a structured plan. Cannot write files or execute commands.",maxTurns:80,toolCapabilityProfile:"read_tools",allowedTools:["read_file","search","web_search","web_fetch","think","memory","task","tool_search"],canFork:!1},VI={name:"code",label:"Code",description:"A coding sub-agent with full tool access for implementation tasks.",maxTurns:200,toolCapabilityProfile:"all_tools",canFork:!0},XI={name:"research",label:"Research",description:"Web research and information gathering. Searches the web, fetches pages, and synthesizes findings.",maxTurns:30,toolCapabilityProfile:"read_tools",allowedTools:["web_search","web_fetch","read_file","search","think","memory"],canFork:!1},YI={name:"verify",label:"Verify",description:"Verification agent. Runs tests, checks build output, validates changes are correct.",maxTurns:40,toolCapabilityProfile:"all_tools",allowedTools:["exec","read_file","search","think"],canFork:!1},Ag=[GI,zI,KI,VI,XI,YI];function ul(){return[...Ag]}function Vn(t){return Ag.find(e=>e.name===t)}function pl(t){return{promptTokens:0,hasAttemptedReactiveCompact:!1,currentMaxOutputTokens:t.maxOutputTokens,consecutiveTruncations:0,aborted:t.abortSignal?.aborted??!1}}function ml(t,e){if(t.aborted)return{level:"blocking",usagePercent:100,reason:"budget_exhausted"};let r=e.contextWindowTokens-e.responseBufferTokens-t.currentMaxOutputTokens,n=r>0?t.promptTokens/r*100:100;return t.promptTokens>=r?t.hasAttemptedReactiveCompact||!e.reactiveCompactEnabled?{level:"blocking",usagePercent:n,reason:"prompt_too_long"}:{level:"blocking",usagePercent:n,reason:"prompt_too_long"}:n>=85?{level:"warning",usagePercent:n,remainingTokens:r-t.promptTokens}:{level:"ok"}}function gl(t,e,r){let n=t.message?.toLowerCase()??"",o=t.status??0;return o===413||n.includes("prompt_too_long")||n.includes("context_length_exceeded")?!e.hasAttemptedReactiveCompact&&r.reactiveCompactEnabled?{action:"reactive_compact"}:{action:"abort",reason:"prompt_too_long_unrecoverable"}:o>=500&&o<600?{action:"retry",reason:`server_error_${o}`}:o===429?{action:"retry",reason:"rate_limited"}:o===401||o===403?{action:"abort",reason:"auth_error"}:o===404?{action:"abort",reason:"model_not_found"}:{action:"abort",reason:n||"unknown_error"}}function fl(t,e,r){if(!e.outputEscalationEnabled)return{shouldEscalate:!1,newMax:t.currentMaxOutputTokens};if(t.consecutiveTruncations>=3)return{shouldEscalate:!1,newMax:t.currentMaxOutputTokens};let n=Math.min(t.currentMaxOutputTokens*2,r);return n<=t.currentMaxOutputTokens?{shouldEscalate:!1,newMax:t.currentMaxOutputTokens}:{shouldEscalate:!0,newMax:n}}function hl(t,e){return t.aborted?!0:e.abortSignal?.aborted?(t.aborted=!0,!0):!1}var JI={maxConsecutiveFailures:3,minMessagesAfterCompact:4,targetUsagePercent:50};function yl(){return{consecutiveFailures:0,attemptedThisTurn:!1,lastCompactAt:null,toolsAtLastCompact:[]}}function tn(t,e=JI){return!(t.attemptedThisTurn||t.consecutiveFailures>=e.maxConsecutiveFailures)}function Xn(t,e){let r=e.ok?typeof e.payload=="string"?e.payload:JSON.stringify(e.payload??""):`Error: ${e.error??"Tool execution failed"}`;return{role:"tool",tool_call_id:t,content:r,...!e.ok&&{is_error:!0},...e.toolReferences?.length?{toolReferences:e.toolReferences}:{},...e.imageUrls?.length?{imageUrls:e.imageUrls}:{}}}function vl(t,e){let r=t.get(e.index)??{id:"",name:"",arguments:""};e.id&&(r.id=e.id),e.name&&(r.name=e.name),r.arguments+=e.arguments??"",t.set(e.index,r)}function Pg(t,e){let r=typeof e.message?.content=="string"?e.message.content:"",n=r?r.slice(0,2e3):void 0,o=e.details,s=typeof o?.stdout=="string"?o.stdout.slice(0,8e3):void 0,i=typeof o?.stderr=="string"?o.stderr.slice(0,4e3):void 0,a=typeof o?.exitCode=="number"?o.exitCode:void 0;return{type:"tool_result",turnId:t,callId:e.callId,name:e.toolName,ok:e.ok,error:e.error,outputPreview:n,durationMs:e.durationMs,exitCode:a,stdout:s,stderr:i,details:o}}var ZI=new Set(["write","edit","patch","apply_patch"]);function xg(t){let{turnId:e,result:r,toolCalls:n}=t;if(!r.ok)return[];let o=n.find(a=>a.id===r.callId);if(!o)return[];let s=[],i=eE(o.function.arguments);if(!i)return s;if(r.toolName==="plan_mode"&&i.action==="exit"&&typeof i.plan=="string"&&i.plan.length>0&&s.push({type:"plan_update",turnId:e,slug:"approved-plan",content:i.plan}),ZI.has(r.toolName)){let a=tE(i);a&&s.push({type:"artifact",turnId:e,artifactId:`artifact-${r.callId}`,artifactType:rE(a),title:a.split(/[\\/]/).pop()||a,filePath:a,language:nE(a)})}return s}function eE(t){try{return JSON.parse(t)}catch{return null}}function tE(t){return typeof t.file_path=="string"?t.file_path:typeof t.filePath=="string"?t.filePath:typeof t.path=="string"?t.path:void 0}function rE(t){let e=t.split(".").pop()?.toLowerCase()??"";return["png","jpg","jpeg","gif","webp","svg","bmp","ico"].includes(e)?"image":["md","txt","pdf","doc","docx","rtf","html"].includes(e)?"document":["mermaid","mmd","dot","puml","plantuml"].includes(e)?"diagram":["csv","tsv","xlsx","xls"].includes(e)?"table":["ts","tsx","js","jsx","py","rs","go","java","c","cpp","h","cs","rb","sh","sql","json","yaml","yml","toml","xml","css","scss","vue","svelte"].includes(e)?"code":"file"}function nE(t){let e=t.split(".").pop()?.toLowerCase()??"";return{ts:"typescript",tsx:"typescriptreact",js:"javascript",jsx:"javascriptreact",py:"python",rs:"rust",go:"go",java:"java",c:"c",cpp:"cpp",h:"c",cs:"csharp",rb:"ruby",sh:"shellscript",sql:"sql",json:"json",yaml:"yaml",yml:"yaml",toml:"toml",xml:"xml",html:"html",css:"css",scss:"scss",vue:"vue",svelte:"svelte",md:"markdown"}[e]}var sE=/^no (matches|files|results) found\.?$|^file not found|^not found|^0 results|^\(exit code \d+, no output\)$/i,iE=new Set(["search","grep","glob","find","list","read","exec"]);function Cg(t){if(!iE.has(t.toolName))return!1;let e=typeof t.message?.content=="string"?t.message.content.trim():"";return e.length>0&&e.length<200&&sE.test(e)}function bl(t,e){for(let r=t.length-1;r>=0;r--){let n=t[r];if(!n||n.role!=="tool")continue;let o=typeof n.content=="string"?n.content:"";if(o.startsWith("Error: "))return o.slice(7).trim()}}function Ig(t){return typeof t=="number"&&Number.isFinite(t)&&t>=1?Math.min(Math.round(t),100):qa}function Eg(t){return t.filter(e=>e.role!=="assistant"?!0:!(typeof e.content=="string"&&e.content.trim()===""))}function rn(t,e){let r=[];for(let n=t.length-1;n>=0;n--){let o=t[n];if(o.role==="tool"&&typeof o.content=="string")r.unshift(o.content.slice(0,500));else if(o.role==="assistant"){if(typeof o.content=="string"&&o.content.trim())return e.info("synthesizeFallbackContent: found assistant text, using it"),o.content;break}else break}return r.length>0?(e.info(`synthesizeFallbackContent: synthesized from ${r.length} tool result(s)`),r.join(`
174
+ `).map(l=>l.replace(/^\s*-\s*/,"").trim()).filter(Boolean);if(gs(c)===r)return o.name}}catch{}}}catch{}return null}function CI(t){if(!el(t))return 0;try{return bg(t,{withFileTypes:!0}).filter(e=>e.isDirectory()&&el(tl(t,e.name,"SKILL.md"))).length}catch{return 0}}function II(t,e){return!(!t.ok||t.existingSkillName||!t.multiStep||t.toolCallCount<oc||t.distinctToolCount<sc||Date.now()-kg<ic||e?.projectSkillsDir&&(CI(e.projectSkillsDir)>=nc||e.tools.length>0&&xI(e.tools,e.projectSkillsDir))||e?.projectRoot&&e.tools.length>0&&!Sg(e.projectRoot,e.tools))}function EI(t){return t.existingSkillName?t.feedback==="negative":!1}function fs(t,e){return EI(t)?{type:"skill.improve",skillName:t.existingSkillName,reason:"negative user feedback on existing skill execution"}:II(t,e)?(kg=Date.now(),{type:"skill.create",suggestedName:e.suggestedName??`auto-skill-${e.tools.slice(0,3).join("-")}`,description:`Multi-step orchestration using ${e.tools.join(", ")}`,tools:e.tools,stepCount:t.toolCallCount}):null}function Tg(t){return t.function&&typeof t.function=="object"&&typeof t.function.name=="string"?t.function.name.trim():typeof t.name=="string"?t.name.trim():""}function MI(t){return t==="enabled-eligible"||t==="installed-awaiting-approval"}function _I(t){return new Map((t??[]).map(e=>[e.toolName,e]))}function DI(t){if(!t.eligibility?.length)return[...t.tools];let e=_I(t.eligibility);return t.tools.filter(r=>{let n=Tg(r);if(!n)return!1;let o=e.get(n);return!o||MI(o.status)})}function NI(t){let e=[],r=t.compatibility??{},n=t.toolChoice;if(t.thinkingEnabled&&r.requireAutoWhenThinking){let o=typeof n=="object"&&n&&!Array.isArray(n)?String(n.type??""):n;o&&o!=="auto"&&o!=="none"&&(e.push("tool_choice downgraded to auto because thinking mode requires auto/none compatibility."),n="auto")}if(n==="required"&&r.allowRequiredToolChoice===!1){let o=r.requiredFallback??"auto";e.push(`tool_choice=required is not supported by this provider; downgraded to ${o}.`),n=o}if(n&&typeof n=="object"&&!Array.isArray(n)&&n.type==="function"&&r.allowNamedToolChoice===!1){let o=r.namedFallback??"required";e.push(`named tool_choice is not supported by this provider; downgraded to ${o}.`),n=o}return{normalizedToolChoice:n,warnings:e}}function rl(t){let e=NI({toolChoice:t.toolChoice,thinkingEnabled:t.thinkingEnabled,compatibility:t.compatibility}),r=e.normalizedToolChoice,n=[...e.warnings],o=DI({tools:t.tools,eligibility:t.eligibility});if(!r||r==="auto")return{tools:o,normalizedToolChoice:r,warnings:n};if(r==="none")return{tools:[],normalizedToolChoice:"none",warnings:n};if(r==="required"){if(o.length===0)throw new Error("tool_choice=required but no tools were provided");return{tools:o,normalizedToolChoice:"required",extraSystemPrompt:"You must call one of the available tools before responding.",warnings:n}}if(typeof r=="object"&&!Array.isArray(r)&&r.type==="function"){let s=r.function??void 0,i=typeof s?.name=="string"?s.name.trim():"";if(!i)throw new Error("tool_choice.function.name is required");let a=o.filter(c=>Tg(c)===i);if(a.length===0)throw new Error(`tool_choice requested unknown tool: ${i}`);return{tools:a,normalizedToolChoice:{type:"function",function:{name:i}},extraSystemPrompt:`You must call the ${i} tool before responding.`,warnings:n}}return{tools:o,normalizedToolChoice:r,warnings:n}}var LI=["stop","aborted","timeout","cancelled","interrupted","error"],OI=["tool_calls","toolCalls","function_call","functionCall","raw_tool_calls","rawToolCalls"];function wg(t){return t==null?[]:typeof t=="string"?t.length>0?[{type:"text",text:t}]:[]:Array.isArray(t)?t:[{type:"text",text:String(t)}]}function jI(t,e){return{...t,content:[...wg(t.content),...wg(e.content)]}}function $I(t){if(!t||typeof t!="object")return!1;if(t.function&&typeof t.function=="object"){let e=t.function.name;if(typeof e=="string"&&e.length>0)return!0}return typeof t.name=="string"&&t.name.length>0}function UI(t){return new Set((t??LI).map(e=>e.trim().toLowerCase()))}function FI(t,e){return t?UI(e).has(t.trim().toLowerCase()):!1}function nl(t){if(!Array.isArray(t)||t.length===0)return[...t];let e=t.map(a=>{if(a.role==="assistant"&&Array.isArray(a.tool_calls)){let c=a.tool_calls.filter(l=>$I(l));return{...a,...c.length>0?{tool_calls:c}:{tool_calls:void 0}}}return{...a}}),r=new Set;for(let a of e)if(!(a.role!=="assistant"||!Array.isArray(a.tool_calls)))for(let c of a.tool_calls)typeof c.id=="string"&&c.id&&r.add(c.id);let n=e.filter(a=>a.role!=="tool"?!0:!!(a.tool_call_id&&r.has(a.tool_call_id))),o=new Set;for(let a of n)a.role==="tool"&&typeof a.tool_call_id=="string"&&a.tool_call_id&&o.add(a.tool_call_id);let s=[];for(let a of n){if(a.role==="assistant"&&Array.isArray(a.tool_calls)&&a.tool_calls.length>0){let c=a.tool_calls.filter(l=>typeof l.id=="string"&&o.has(l.id));if(c.length===0){let{tool_calls:l,...d}=a;d.content!=null&&d.content!==""&&s.push(d);continue}if(c.length<a.tool_calls.length){s.push({...a,tool_calls:c});continue}}s.push(a)}let i=[];for(let a of s){let c=i.length>0?i[i.length-1]:void 0;if(a.role==="user"&&c?.role==="user"){i[i.length-1]=jI(c,a);continue}i.push(a)}return i}function ol(t,e){return FI(e?.stopReason,e?.forcedStopReasons)?t.map(r=>{if(r.role!=="assistant")return{...r};let n={...r};for(let o of OI)delete n[o];return n}):[...t]}function sl(t,e){let r=e?.placeholderToolResult??"Error: Tool loop interrupted before the tool result was replayed.",n=new Set;for(let s of t)s.role==="tool"&&typeof s.tool_call_id=="string"&&s.tool_call_id&&n.add(s.tool_call_id);let o=[];for(let s of t)if(o.push({...s}),!(s.role!=="assistant"||!Array.isArray(s.tool_calls)||s.tool_calls.length===0))for(let i of s.tool_calls)typeof i.id!="string"||!i.id||n.has(i.id)||(n.add(i.id),o.push({role:"tool",tool_call_id:i.id,content:r}));return o}function il(t,e){let r=nl(t),n=ol(r,e);return sl(n,e)}function HI(t){let e=new Set,r=new Set;for(let n of t){if(n.role==="assistant"&&Array.isArray(n.tool_calls))for(let o of n.tool_calls)typeof o.id=="string"&&o.id&&e.add(o.id);n.role==="tool"&&typeof n.tool_call_id=="string"&&n.tool_call_id&&r.add(n.tool_call_id)}return[...e].filter(n=>!r.has(n))}function BI(t){let e=new Set;for(let r of t)r.role==="tool"&&typeof r.tool_call_id=="string"&&r.tool_call_id&&e.add(r.tool_call_id);return[...e]}function qI(t){return{round:t.round??0,maxRounds:t.maxRounds,pendingToolCallIds:[...t.pendingToolCallIds??[]],completedToolCallIds:[...t.completedToolCallIds??[]],lastStopReason:t.lastStopReason,replayMessages:[...t.replayMessages??[]]}}function al(t,e){return{round:t.round+1,maxRounds:t.maxRounds,pendingToolCallIds:[...e.pendingToolCallIds??t.pendingToolCallIds],completedToolCallIds:[...e.completedToolCallIds??t.completedToolCallIds],lastStopReason:e.lastStopReason??t.lastStopReason,replayMessages:[...e.replayMessages??t.replayMessages]}}function hs(t,e){return{round:t.round,maxRounds:t.maxRounds,pendingToolCallIds:[],completedToolCallIds:[...e.completedToolCallIds??t.completedToolCallIds],lastStopReason:e.lastStopReason??t.lastStopReason,replayMessages:[...e.replayMessages??t.replayMessages]}}function ys(t){let e=[],r=nl(t.replayMessages);r.length!==t.replayMessages.length&&e.push({kind:"drop-orphan-tool-result",detail:"Removed orphan tool results or invalid assistant tool calls."});let n=ol(r,t.options);n.some((s,i)=>s!==r[i])&&e.push({kind:"strip-forced-stop-tool-metadata",detail:"Removed assistant tool-call metadata after forced stop."});let o=sl(n,t.options);return o.length>n.length&&e.push({kind:"inject-placeholder-tool-result",detail:"Injected placeholder tool result for pending tool calls."}),{state:qI({maxRounds:t.maxRounds,round:t.round,lastStopReason:t.lastStopReason,replayMessages:o,pendingToolCallIds:HI(o),completedToolCallIds:BI(o)}),recoveryActions:e}}var WI=new Set(["main","sdk","agent","compact","hook","verification","side_question"]);function cl(t){return t?WI.has(t):!0}function ll(t){return t===429||t===529}function vs(t,e=500,r=32e3){let n=Math.min(e*Math.pow(2,t-1),r);return n+Math.floor(Math.random()*n*.25)}var sG={maxBackoffMs:300*1e3,resetCapMs:360*60*1e3,heartbeatIntervalMs:3e4};function bs(){let t=process.env.QLOGICAGENT_PERSISTENT_RETRY;return t==="1"||t==="true"}var Kn=class extends Error{constructor(r,n){super(`Model fallback triggered: ${r} -> ${n}`);this.originalModel=r;this.fallbackModel=n;this.name="FallbackTriggeredError"}originalModel;fallbackModel};function dl(t,e){if(e.allowedTools&&e.allowedTools.length>0){let r=new Set(e.allowedTools);return t.filter(n=>r.has(n))}if(e.toolCapabilityProfile==="no_tools")return[];if(e.toolCapabilityProfile==="read_tools"){let r=new Set(["file_edit","create_file","write_file","replace_string_in_file","multi_replace_string_in_file","create_directory","delete_file","rename_file","move_file","exec","run_in_terminal","run_command","git_commit","git_push","patch"]);return t.filter(n=>!r.has(n))}return e.canFork?[...t]:t.filter(r=>r!=="agent")}var GI={name:"general",label:"General Purpose",description:"A general-purpose sub-agent that can perform any task with full tool access.",maxTurns:200,toolCapabilityProfile:"all_tools",canFork:!1},zI={name:"explore",label:"Explore",description:"Fast read-only codebase exploration. Search files, read code, analyze structure. Cannot write or execute.",maxTurns:50,toolCapabilityProfile:"read_tools",allowedTools:["read_file","search","web_search","web_fetch","think","memory","tool_search"],canFork:!1},KI={name:"plan",label:"Plan",description:"Planning mode. Explore, analyze, and produce a structured plan. Cannot write files or execute commands.",maxTurns:80,toolCapabilityProfile:"read_tools",allowedTools:["read_file","search","web_search","web_fetch","think","memory","task","tool_search"],canFork:!1},VI={name:"code",label:"Code",description:"A coding sub-agent with full tool access for implementation tasks.",maxTurns:200,toolCapabilityProfile:"all_tools",canFork:!0},XI={name:"research",label:"Research",description:"Web research and information gathering. Searches the web, fetches pages, and synthesizes findings.",maxTurns:30,toolCapabilityProfile:"read_tools",allowedTools:["web_search","web_fetch","read_file","search","think","memory"],canFork:!1},YI={name:"verify",label:"Verify",description:"Verification agent. Runs tests, checks build output, validates changes are correct.",maxTurns:40,toolCapabilityProfile:"all_tools",allowedTools:["exec","read_file","search","think"],canFork:!1},Ag=[GI,zI,KI,VI,XI,YI];function ul(){return[...Ag]}function Vn(t){return Ag.find(e=>e.name===t)}function pl(t){return{promptTokens:0,hasAttemptedReactiveCompact:!1,currentMaxOutputTokens:t.maxOutputTokens,consecutiveTruncations:0,aborted:t.abortSignal?.aborted??!1}}function ml(t,e){if(t.aborted)return{level:"blocking",usagePercent:100,reason:"budget_exhausted"};let r=e.contextWindowTokens-e.responseBufferTokens-t.currentMaxOutputTokens,n=r>0?t.promptTokens/r*100:100;return t.promptTokens>=r?t.hasAttemptedReactiveCompact||!e.reactiveCompactEnabled?{level:"blocking",usagePercent:n,reason:"prompt_too_long"}:{level:"blocking",usagePercent:n,reason:"prompt_too_long"}:n>=85?{level:"warning",usagePercent:n,remainingTokens:r-t.promptTokens}:{level:"ok"}}function gl(t,e,r){let n=t.message?.toLowerCase()??"",o=t.status??0;return o===413||n.includes("prompt_too_long")||n.includes("context_length_exceeded")?!e.hasAttemptedReactiveCompact&&r.reactiveCompactEnabled?{action:"reactive_compact"}:{action:"abort",reason:"prompt_too_long_unrecoverable"}:o>=500&&o<600?{action:"retry",reason:`server_error_${o}`}:o===429?{action:"retry",reason:"rate_limited"}:o===401||o===403?{action:"abort",reason:"auth_error"}:o===404?{action:"abort",reason:"model_not_found"}:{action:"abort",reason:n||"unknown_error"}}function fl(t,e,r){if(!e.outputEscalationEnabled)return{shouldEscalate:!1,newMax:t.currentMaxOutputTokens};if(t.consecutiveTruncations>=3)return{shouldEscalate:!1,newMax:t.currentMaxOutputTokens};let n=Math.min(t.currentMaxOutputTokens*2,r);return n<=t.currentMaxOutputTokens?{shouldEscalate:!1,newMax:t.currentMaxOutputTokens}:{shouldEscalate:!0,newMax:n}}function hl(t,e){return t.aborted?!0:e.abortSignal?.aborted?(t.aborted=!0,!0):!1}var JI={maxConsecutiveFailures:3,minMessagesAfterCompact:4,targetUsagePercent:50};function yl(){return{consecutiveFailures:0,attemptedThisTurn:!1,lastCompactAt:null,toolsAtLastCompact:[]}}function tn(t,e=JI){return!(t.attemptedThisTurn||t.consecutiveFailures>=e.maxConsecutiveFailures)}function Xn(t,e){let r=e.ok?typeof e.payload=="string"?e.payload:JSON.stringify(e.payload??""):`Error: ${e.error??"Tool execution failed"}`;return{role:"tool",tool_call_id:t,content:r,...!e.ok&&{is_error:!0},...e.toolReferences?.length?{toolReferences:e.toolReferences}:{},...e.imageUrls?.length?{imageUrls:e.imageUrls}:{}}}function vl(t,e){let r=t.get(e.index)??{id:"",name:"",arguments:""};e.id&&(r.id=e.id),e.name&&(r.name=e.name),r.arguments+=e.arguments??"",t.set(e.index,r)}function Pg(t,e){let r=typeof e.message?.content=="string"?e.message.content:"",n=r?r.slice(0,2e3):void 0,o=e.details,s=typeof o?.stdout=="string"?o.stdout.slice(0,8e3):void 0,i=typeof o?.stderr=="string"?o.stderr.slice(0,4e3):void 0,a=typeof o?.exitCode=="number"?o.exitCode:void 0;return{type:"tool_result",turnId:t,callId:e.callId,name:e.toolName,ok:e.ok,error:e.error,outputPreview:n,durationMs:e.durationMs,exitCode:a,stdout:s,stderr:i,details:o}}var ZI=new Set(["write","edit","patch","apply_patch"]);function xg(t){let{turnId:e,result:r,toolCalls:n}=t;if(!r.ok)return[];let o=n.find(a=>a.id===r.callId);if(!o)return[];let s=[],i=eE(o.function.arguments);if(!i)return s;if(r.toolName==="plan_mode"&&i.action==="exit"&&typeof i.plan=="string"&&i.plan.length>0&&s.push({type:"plan_update",turnId:e,slug:"approved-plan",content:i.plan}),ZI.has(r.toolName)){let a=tE(i);a&&s.push({type:"artifact",turnId:e,artifactId:`artifact-${r.callId}`,artifactType:rE(a),title:a.split(/[\\/]/).pop()||a,filePath:a,language:nE(a)})}return s}function eE(t){try{return JSON.parse(t)}catch{return null}}function tE(t){return typeof t.file_path=="string"?t.file_path:typeof t.filePath=="string"?t.filePath:typeof t.path=="string"?t.path:void 0}function rE(t){let e=t.split(".").pop()?.toLowerCase()??"";return["png","jpg","jpeg","gif","webp","svg","bmp","ico"].includes(e)?"image":["md","txt","pdf","doc","docx","rtf","html"].includes(e)?"document":["mermaid","mmd","dot","puml","plantuml"].includes(e)?"diagram":["csv","tsv","xlsx","xls"].includes(e)?"table":["ts","tsx","js","jsx","py","rs","go","java","c","cpp","h","cs","rb","sh","sql","json","yaml","yml","toml","xml","css","scss","vue","svelte"].includes(e)?"code":"file"}function nE(t){let e=t.split(".").pop()?.toLowerCase()??"";return{ts:"typescript",tsx:"typescriptreact",js:"javascript",jsx:"javascriptreact",py:"python",rs:"rust",go:"go",java:"java",c:"c",cpp:"cpp",h:"c",cs:"csharp",rb:"ruby",sh:"shellscript",sql:"sql",json:"json",yaml:"yaml",yml:"yaml",toml:"toml",xml:"xml",html:"html",css:"css",scss:"scss",vue:"vue",svelte:"svelte",md:"markdown"}[e]}var sE=/^no (matches|files|results) found\.?$|^file not found|^not found|^0 results|^\(exit code \d+, no output\)$/i,iE=new Set(["search","grep","glob","find","list","read","exec"]);function Cg(t){if(!iE.has(t.toolName))return!1;let e=typeof t.message?.content=="string"?t.message.content.trim():"";return e.length>0&&e.length<200&&sE.test(e)}function bl(t,e){for(let r=t.length-1;r>=0;r--){let n=t[r];if(!n||n.role!=="tool")continue;let o=typeof n.content=="string"?n.content:"";if(o.startsWith("Error: "))return o.slice(7).trim()}}function Ig(t){return typeof t=="number"&&Number.isFinite(t)&&t>=1?Math.min(Math.round(t),100):qa}function Eg(t){return t.filter(e=>e.role!=="assistant"?!0:!(typeof e.content=="string"&&e.content.trim()===""))}function rn(t,e){let r=[];for(let n=t.length-1;n>=0;n--){let o=t[n];if(o.role==="tool"&&typeof o.content=="string")r.unshift(o.content.slice(0,500));else if(o.role==="assistant"){if(typeof o.content=="string"&&o.content.trim())return e.info("synthesizeFallbackContent: found assistant text, using it"),o.content;break}else break}return r.length>0?(e.info(`synthesizeFallbackContent: synthesized from ${r.length} tool result(s)`),r.join(`
175
175
 
176
176
  `)):""}function Mg(t){try{let e=JSON.parse(t),n=[e.description,e.command,e.query,e.url,e.path,e.file_path,e.filePath,e.pattern,e.model].find(s=>typeof s=="string"&&s.trim().length>0);if(typeof n=="string")return n.trim().slice(0,240);let o=Object.keys(e);return o.length>0?o.slice(0,5).join(" / "):void 0}catch{return}}function kl(t){let e=t.message.toLowerCase();return t.status===413||e.includes("prompt_too_long")||e.includes("context_length_exceeded")||e.includes("maximum context length")}function _g(t){return t==="length"||t==="max_tokens"}function Rl(t){let e=t.message.toLowerCase();return(e.includes("image")||e.includes("media")||e.includes("file too large")||e.includes("payload too large"))&&(t.status===413||e.includes("too large")||e.includes("size"))}function Dg(t){let e=t.headers;if(!e)return null;let r=e["retry-after"]??e["Retry-After"];if(!r)return null;let n=parseInt(r,10);return!isNaN(n)&&n>0?n*1e3:null}function Ng(t){if(t.status!==400)return null;let e=t.message.match(/input length and `max_tokens` exceed context limit: (\d+) \+ (\d+) > (\d+)/);if(!e?.[1]||!e?.[3])return null;let r=parseInt(e[1],10),n=parseInt(e[3],10);if(isNaN(r)||isNaN(n))return null;let o=n-r-1e3;return o>=3e3?o:null}async function*Lg(t,e,r,n,o,s,i,a){let c=[],l;a.debug(`single LLM round, messages: ${r.length}`);for await(let d of i.stream({model:e,messages:r,temperature:o},n,s))switch(d.type){case"delta":c.push(d.text),yield{type:"delta",turnId:t,text:d.text};break;case"usage":l={inputTokens:d.promptTokens,outputTokens:d.completionTokens,reasoningTokens:d.reasoningTokens,cacheRead:d.cacheReadTokens,cacheWrite:d.cacheCreationTokens};break;case"done":break}yield{type:"end",turnId:t,content:c.join(""),usage:l??{inputTokens:0,outputTokens:0},model:e}}async function*Og(t,e,r,n){let{turnId:o,sessionId:s,messages:i,tools:a,model:c,apiKey:l,temperature:d=0,hooks:p,signal:u}=t,m={sessionId:s,turnId:o},f=t.maxTurns??0,g=t.querySource,h=t.runtimePorts.resolveToolEligibility(a,t.toolEligibilityContext),b=h.eligibleTools;for(let O of h.blockedTools)yield{type:"tool_blocked",turnId:o,callId:"",name:O.toolName,reason:"blocked-by-policy"};if(!b.length){yield*Lg(o,c,i,l,d,u,e,n);return}let v=Ig(t.maxRounds),R={contextWindowTokens:t.contextWindowTokens??za,responseBufferTokens:Ka,maxOutputTokens:t.maxOutputTokens??Va,abortSignal:u,reactiveCompactEnabled:!0,outputEscalationEnabled:!0},S=new Set,T=0,C=b,E,M=!1,L=0,k={messages:[...i],maxOutputTokensRecoveryCount:0,hasAttemptedReactiveCompact:!1,maxOutputTokensOverride:void 0,turnCount:1,transition:void 0,guardState:pl(R),reactiveCompactState:yl(),toolLoopState:ys({maxRounds:v,replayMessages:[...i]}).state,consecutiveFailedRounds:0,finalText:"",totalUsage:{inputTokens:0,outputTokens:0},collapseStore:Jc(),currentModel:c,consecutive529Errors:0,consecutiveApiRetries:0,stopHookActive:void 0,lastResponseId:void 0,snipRemovedIds:new Set,contentReplacementState:t.runtimePorts.createContentReplacementState(),budgetContinuationCount:0,lastBudgetDeltaTokens:0,lastBudgetGlobalTokens:0,identicalCallCounts:new Map,toolFailureCounts:new Map,fileReadCounts:new Map},Q=Math.max(f*5,200),de=0;for(;;){if(de++,de>Q){n.info(`hard iteration cap reached (${Q}), forcing completion`);let w=k.finalText||rn(k.messages,n);yield{type:"end",turnId:o,content:w,usage:k.totalUsage,model:k.currentModel};return}let{messages:O,maxOutputTokensRecoveryCount:Le,hasAttemptedReactiveCompact:Oe,maxOutputTokensOverride:F,turnCount:J,guardState:H,reactiveCompactState:Ie,collapseStore:Gt}=k,{toolLoopState:Ee}=k;if(E){try{let w=await E;w&&(yield{type:"tool_use_summary",turnId:o,summary:w})}catch{}E=void 0}if(t.refreshTools&&J>1){let w=t.refreshTools();w!==C&&(C=w,n.debug(`tools refreshed: ${w.length} tools`))}if(hl(H,R)){n.info(`turn aborted by guard at turn ${J}`),yield{type:"error",turnId:o,error:"Turn aborted",code:"ABORTED",usage:k.totalUsage};return}let st=ml(H,R);if(st.level==="blocking"){st.reason==="prompt_too_long"&&tn(Ie)&&(Ie.attemptedThisTurn=!0,H.hasAttemptedReactiveCompact=!0,n.info(`token budget blocking (${st.reason}), reactive compact needed`),yield{type:"recovery",turnId:o,action:"reactive_compact",detail:"token budget pre-check"}),n.info(`token budget blocking (${st.reason}), ending tool loop`);break}st.level==="warning"&&n.info(`token budget warning: ${st.usagePercent}% used, ${st.remainingTokens} remaining`);let se;{let w=await t.runtimePorts.enforceToolResultBudget(O,k.contentReplacementState,s);se=w.messages,w.newlyReplacedCount>0&&(n.info(`tool-result-budget: persisted ${w.newlyReplacedCount} oversized tool results`),yield{type:"recovery",turnId:o,action:"tool_result_budget",detail:`${w.newlyReplacedCount} persisted`})}{let w=Yc(se,k.snipRemovedIds);se=w.messages,w.removedCount>0&&(n.info(`snip: removed ${w.removedCount} messages, freed ~${w.tokensFreed} tokens`),yield{type:"recovery",turnId:o,action:"snip",detail:`${w.removedCount} messages`})}{let A=new ar().compress(se,0);A.droppedCount>0&&(se=A.messages,n.info(`microcompact: cleared ${A.droppedCount} old tool results`))}if(se=Qc(se,Gt).messages,H.promptTokens>0){let w=R.contextWindowTokens*.75,A=t.runtimePorts.getActiveContextCompressionEngine(),x;A?x=await A.compressAsync(se,w,{model:k.currentModel,sessionId:s}):x=t.runtimePorts.compressMessages(se,{budget:w,model:k.currentModel}),x.droppedCount>0&&(se=x.messages,n.info(`autocompact: ${x.strategy}, dropped ${x.droppedCount}`),yield{type:"recovery",turnId:o,action:"autocompact",detail:`${x.strategy}: ${x.droppedCount} dropped`},k.hasAttemptedReactiveCompact=!1,p?.invoke("context.after_compact",{...m,removedCount:x.droppedCount}).catch(()=>{}))}se=Eg(se);let Dp=t.toolChoice==="required"&&M?"auto":t.toolChoice??"auto",In=rl({tools:C,toolChoice:Dp}),P=ys({maxRounds:v,replayMessages:se,lastStopReason:Ee.lastStopReason,options:{stopReason:Ee.lastStopReason}}),W=In.extraSystemPrompt?[{role:"system",content:In.extraSystemPrompt},...P.state.replayMessages]:P.state.replayMessages;Ee=P.state,P.recoveryActions.length>0&&n.debug(`tool loop recovery: ${P.recoveryActions.map(w=>w.detail??w.kind).join("; ")}`),n.debug(`turn ${J}, messages: ${W.length}`),p?.invoke("turn.before_inference",{...m,model:k.currentModel}).catch(()=>{});let V=!1,it=[],En=new Map,Np="stop",at,z=null,Uo=!1,Mn=[],je=[];try{for await(let w of e.stream({model:k.currentModel,messages:W,tools:In.tools,toolChoice:In.normalizedToolChoice??"auto",temperature:d,maxTokens:(F??H.currentMaxOutputTokens)||void 0,streamRequired:t.streamRequired,previousResponseId:k.lastResponseId,reasoning:t.reasoning,promptCacheKey:t.promptCacheKey,promptCacheRetention:t.promptCacheRetention,serviceTier:t.serviceTier,openaiBuiltinTools:t.openaiBuiltinTools,maxToolCalls:t.maxToolCalls,parallelToolCalls:t.parallelToolCalls,textVerbosity:t.textVerbosity},l,u))switch(w.type){case"delta":it.push(w.text),!V&&!(t.toolChoice==="required"&&!M)&&(yield{type:"delta",turnId:o,text:w.text});break;case"tool_call_delta":V=!0,vl(En,w);break;case"reasoning_delta":Mn.push(w.text);break;case"reasoning_block_complete":w.signature&&je.push({thinking:Mn.join(""),signature:w.signature}),Mn.length=0;break;case"usage":at={inputTokens:w.promptTokens,outputTokens:w.completionTokens,reasoningTokens:w.reasoningTokens,cacheRead:w.cacheReadTokens,cacheWrite:w.cacheCreationTokens};break;case"response_id":k.lastResponseId=w.id;break;case"annotations":yield{type:"annotations",turnId:o,annotations:w.annotations};break;case"builtin_tool_status":yield{type:"heartbeat",turnId:o,message:`${w.toolType}: ${w.event}`};break;case"done":Np=w.finishReason;break}if(V||p?.invoke("turn.after_inference",{...m,model:k.currentModel}).catch(()=>{}),t.postSamplingHooks&&t.postSamplingHooks.length>0){let w=k.currentModel;for(let A of t.postSamplingHooks)try{A({messages:[...se],model:w,sessionId:s})}catch{}}}catch(w){if(w instanceof Kn&&t.fallbackModel){n.info(`model fallback triggered: ${w.originalModel} -> ${w.fallbackModel}`),yield{type:"recovery",turnId:o,action:"model_fallback",detail:`${w.originalModel} -> ${w.fallbackModel}`},k={...k,currentModel:w.fallbackModel,consecutive529Errors:0,consecutiveApiRetries:0,transition:void 0};continue}let A=w instanceof Error?w.message:String(w),x=typeof w?.status=="number"?w.status:void 0;if(!x&&A&&(A.includes("ECONNRESET")||A.includes("EPIPE"))){let $=(k.consecutiveApiRetries??0)+1;if($>zr){n.info(`stale connection retry limit reached (${zr}), aborting`),yield{type:"error",turnId:o,error:A,code:"RETRIES_EXHAUSTED",usage:k.totalUsage};return}n.info(`stale connection (${A.includes("ECONNRESET")?"ECONNRESET":"EPIPE"}): retrying`),yield{type:"recovery",turnId:o,action:"stale_connection_retry",detail:A.slice(0,80)},k={...k,consecutiveApiRetries:$,transition:void 0};continue}let _=Ng({status:x,message:A});if(_!==null){n.info(`max_tokens overflow: adjusting to ${_}`),H.currentMaxOutputTokens=_,k={...k,maxOutputTokensOverride:_,transition:void 0};continue}if(ll(x)){k.consecutive529Errors++;let $=2,Me=t.fallbackModel&&k.currentModel!==t.fallbackModel;if(k.consecutive529Errors>$&&!Me&&!bs()){n.info(`transient ${x} \u8133 ${k.consecutive529Errors}: hard limit reached, aborting`),yield{type:"error",turnId:o,error:`API unavailable after ${k.consecutive529Errors} consecutive ${x} errors`,code:"API_ERROR",usage:k.totalUsage};return}if(k.consecutive529Errors>=rc&&t.fallbackModel&&k.currentModel!==t.fallbackModel){n.info(`529 \u8133 ${k.consecutive529Errors}: triggering fallback to ${t.fallbackModel}`),yield{type:"recovery",turnId:o,action:"model_fallback",detail:`529 \u8133 ${k.consecutive529Errors}`},k={...k,currentModel:t.fallbackModel,consecutive529Errors:0,transition:void 0};continue}if(bs()){let _e=vs(k.consecutive529Errors);n.info(`persistent retry: waiting ${_e}ms (attempt ${k.consecutive529Errors})`);let ct=_e;for(;ct>0;){if(u?.aborted){yield{type:"error",turnId:o,error:"Aborted during retry wait",code:"ABORTED",usage:k.totalUsage};return}yield{type:"heartbeat",turnId:o,message:`Retrying in ${Math.ceil(ct/1e3)}s (${x})`};let Lt=Math.min(ct,tc);await new Promise(Ua=>setTimeout(Ua,Lt)),ct-=Lt}k={...k,transition:void 0};continue}if(cl(g)){let ct=Dg({status:x,message:A})??vs(k.consecutive529Errors);n.info(`transient ${x}: retry in ${ct}ms`),yield{type:"recovery",turnId:o,action:"retry",detail:`${x} retry in ${ct}ms`},await new Promise(Lt=>setTimeout(Lt,ct)),k={...k,transition:void 0};continue}n.info(`background source ${g}: not retrying ${x}`)}z={status:x,message:A}}if(z&&p?.invoke("turn.after_inference",{...m,model:k.currentModel,response:{error:z.message}}).catch(()=>{}),z)if(kl(z))Uo=!0,n.info(`withheld prompt_too_long error (status=${z.status})`);else if(Rl(z))Uo=!0,n.info(`withheld media_size error (status=${z.status})`);else{let w=gl({status:z.status??500,message:z.message},H,R);if(w.action==="reactive_compact"&&tn(Ie)&&(Ie.attemptedThisTurn=!0,H.hasAttemptedReactiveCompact=!0,yield{type:"recovery",turnId:o,action:"reactive_compact",detail:`API ${z.status??500}: ${z.message}`}),w.action==="retry"){let x=(k.consecutiveApiRetries??0)+1;if(x>zr){n.info(`API retry limit reached (${zr}), aborting`);let _=Zr(z.status,z.message);yield{type:"error",turnId:o,error:z.message,code:_,usage:k.totalUsage};return}yield{type:"recovery",turnId:o,action:"retry",detail:w.reason},k={...k,consecutiveApiRetries:x,transition:void 0};continue}let A=Zr(z.status,z.message);p?.invoke("stop.failure",{sessionId:s,reason:A,error:z.message}).catch(()=>{}),yield{type:"error",turnId:o,error:z.message,code:A,usage:k.totalUsage};return}at&&(k.totalUsage.inputTokens+=at.inputTokens,k.totalUsage.outputTokens+=at.outputTokens,at.reasoningTokens&&(k.totalUsage.reasoningTokens=(k.totalUsage.reasoningTokens??0)+at.reasoningTokens),at.cacheRead&&(k.totalUsage.cacheRead=(k.totalUsage.cacheRead??0)+at.cacheRead),at.cacheWrite&&(k.totalUsage.cacheWrite=(k.totalUsage.cacheWrite??0)+at.cacheWrite)),at?.inputTokens&&(H.promptTokens=at.inputTokens);let Lp=it.join("");Lp&&(k.finalText=Lp);let Nt=[...En.values()].map(w=>({id:w.id||`tc_${o}_${J}_${Math.random().toString(36).slice(2,8)}`,type:"function",function:{name:w.name,arguments:w.arguments}}));if(Nt.length===0&&!V){if(t.toolChoice==="required"&&!M&&C.length>0&&L<2){L++;let x=C.map(_=>_.function.name).filter(Boolean).slice(0,8).join(", ");k={...k,messages:[...O,{role:"user",content:`You must call one available tool before answering. Available tools for this request: ${x}. Do not answer from memory, prior context, or guesses.`}],finalText:"",transition:{reason:"next_turn"}};continue}if(Uo&&z&&kl(z)){if(k.transition?.reason!=="collapse_drain_retry"){let x=Zc(se,Gt);if(x.committed>0){n.info(`collapse drain: committed ${x.committed} stages`),yield{type:"recovery",turnId:o,action:"collapse_drain",detail:`${x.committed} stages committed`},k={...k,messages:x.messages,transition:{reason:"collapse_drain_retry",committed:x.committed}};continue}}if(tn(Ie)){Ie.attemptedThisTurn=!0,H.hasAttemptedReactiveCompact=!0,n.info("withheld 413: reactive compact attempt"),yield{type:"recovery",turnId:o,action:"reactive_compact",detail:"withheld prompt_too_long"},k={...k,hasAttemptedReactiveCompact:!0,transition:{reason:"reactive_compact_retry"}};continue}n.info("withheld 413: recovery exhausted, surfacing error"),p?.invoke("stop.failure",{sessionId:s,reason:"prompt_too_long",error:z.message}).catch(()=>{}),yield{type:"error",turnId:o,error:z.message,code:"PROMPT_TOO_LONG",usage:k.totalUsage};return}if(Uo&&z&&Rl(z)){if(tn(Ie)){Ie.attemptedThisTurn=!0,H.hasAttemptedReactiveCompact=!0,n.info("withheld media error: reactive compact strip-retry"),yield{type:"recovery",turnId:o,action:"reactive_compact",detail:"media error strip-retry"},k={...k,hasAttemptedReactiveCompact:!0,transition:{reason:"reactive_compact_retry"}};continue}n.info("withheld media error: recovery exhausted"),p?.invoke("stop.failure",{sessionId:s,reason:"media_error",error:z.message}).catch(()=>{}),yield{type:"error",turnId:o,error:z.message,code:"IMAGE_ERROR",usage:k.totalUsage};return}if(_g(Np)){H.consecutiveTruncations+=1;let x=t.modelMaxOutputTokens??Xa,_=fl(H,R,x);if(_.shouldEscalate&&F===void 0){H.currentMaxOutputTokens=_.newMax,n.info(`max_output_tokens escalate: ${_.newMax} tokens`),yield{type:"recovery",turnId:o,action:"output_escalation",detail:`${_.newMax} tokens`},k={...k,maxOutputTokensOverride:Ja,transition:{reason:"max_output_tokens_escalate"}};continue}if(Le<Ya){let $={role:"user",content:"Output token limit hit. Resume directly - no apology, no recap of what you were doing. Pick up mid-thought if that is where the cut happened. Break remaining work into smaller pieces."};n.info(`max_output_tokens recovery #${Le+1}`),yield{type:"recovery",turnId:o,action:"max_output_tokens_recovery",detail:`attempt ${Le+1}`},k={...k,messages:[...se,$],maxOutputTokensRecoveryCount:Le+1,maxOutputTokensOverride:void 0,transition:{reason:"max_output_tokens_recovery",attempt:Le+1}};continue}n.info("max_output_tokens recovery exhausted, completing with partial content")}else H.consecutiveTruncations=0;if(Ee=hs(Ee,{replayMessages:O,lastStopReason:"completed"}),p){let x=await p.invoke("stop",{sessionId:s,reason:"completed"});if(x.action==="prevent"){n.info(`stop hook prevented continuation: ${x.reason??"no reason"}`),yield{type:"end",turnId:o,content:k.finalText,usage:k.totalUsage,model:k.currentModel};return}if(x.action==="abort"){let _=x.reason??"Stop hook requested continuation";n.info(`stop hook blocking: ${_}`);let $={role:"user",content:_},Me={role:"assistant",content:k.finalText,...je.length>0&&{thinkingBlocks:[...je]}};k={...k,messages:[...O,Me,$],stopHookActive:!0,transition:{reason:"stop_hook_blocking"}};continue}}if(t.tokenBudget&&t.tokenBudget>0&&k.budgetContinuationCount<5){let x=k.totalUsage.inputTokens+k.totalUsage.outputTokens+(k.totalUsage.reasoningTokens??0),_=x/t.tokenBudget*100,$=x-k.lastBudgetGlobalTokens,Me=k.budgetContinuationCount>=Qa&&$<zo&&k.lastBudgetDeltaTokens<zo;if(Me&&n.info(`token budget early stop: diminishing returns at ${Math.round(_)}% (delta=${$})`),!Me&&_<90){let _e=k.budgetContinuationCount+1,ct={role:"user",content:t.runtimePorts.getBudgetContinuationMessage(_,x,t.tokenBudget)};n.info(`token budget continuation #${_e}: ${Math.round(_)}% used`),yield{type:"recovery",turnId:o,action:"budget_continuation",detail:`${Math.round(_)}% used (#${_e})`};let Lt={role:"assistant",content:k.finalText,...je.length>0&&{thinkingBlocks:[...je]}};k={...k,messages:[...O,Lt,ct],budgetContinuationCount:_e,lastBudgetDeltaTokens:$,lastBudgetGlobalTokens:x,transition:{reason:"token_budget_continuation"}};continue}}if(!k.stopHookActive){let x=i.find(_e=>_e.role==="user"),_=typeof x?.content=="string"?x.content:"",$=/create\s+(?:a\s+)?file|write\s+(?:a\s+)?file|make\s+(?:a\s+)?file|fix|implement|modify|update|repair|generate\s+(?:a\s+)?file|new\s+file/i.test(_),Me=S.has("write")||S.has("edit");if($&&!Me){if(n.info("AP1 action-verification: user requested file action but no write/edit tool was called, injecting nudge"),T>0){let Lt=[...O].reverse().find(Ua=>Ua.role==="tool");Lt&&typeof Lt.content=="string"&&(Lt.content+=`
177
177
 
@@ -324,7 +324,7 @@ exit: Leave worktree (keep or remove it).
324
324
  list: Show all active worktrees.`},name:{type:"string",description:"Worktree/branch name (for enter). Must be kebab-case, max 64 characters. If omitted, auto-generated from task context."},exitAction:{type:"string",enum:["keep","remove"],description:"For exit: 'keep' retains the worktree for later use; 'remove' deletes it."},discardChanges:{type:"boolean",description:"Required true to confirm discarding uncommitted changes when exitAction='remove'. Safety mechanism to prevent data loss."}},required:["action"]},aN=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]?$/;function My(t){return{name:sN,label:"Git Worktree",description:"Create isolated git worktree branches for parallel development. Each worktree has its own working directory independent of the main branch. Use for: parallel features, safe experimentation, sub-agent isolation. Exit to keep or remove the worktree when done.",parameters:iN,execute:async(e,r)=>{switch(r.action){case"enter":{if(t.isInWorktree())return{content:[{type:"text",text:"Error: already in a worktree. Exit first before entering another."}],details:{type:"worktree",error:"already_in_worktree"}};if(r.name&&!aN.test(r.name))return{content:[{type:"text",text:"Error: name must be kebab-case (a-z, 0-9, hyphens), 2-64 characters."}],details:{type:"worktree",error:"invalid_name"}};let n=await t.enterWorktree(r.name);if(!n.success)return{content:[{type:"text",text:`Error: ${n.error||"failed to create worktree"}`}],details:{type:"worktree",error:n.error}};let o=n.worktree;return{content:[{type:"text",text:[`Entered worktree: ${o.name}`,` Branch: ${o.branch}`,` Path: ${o.path}`,"","Working in isolated branch. Changes here do not affect the main branch.","Use action='exit' when done (keep or remove)."].join(`
325
325
  `)}],details:{type:"worktree",action:"enter",name:o.name,branch:o.branch,path:o.path}}}case"exit":{if(!t.isInWorktree())return{content:[{type:"text",text:"Error: not in a worktree."}],details:{type:"worktree",error:"not_in_worktree"}};let n=r.exitAction||"keep";if(n==="remove"){let i=t.currentWorktree?.();if(i&&(i.hasChanges||i.unpushedCommits>0)&&!r.discardChanges){let a=[];return i.hasChanges&&a.push("uncommitted changes"),i.unpushedCommits>0&&a.push(`${i.unpushedCommits} unpushed commit(s)`),{content:[{type:"text",text:`Error: worktree has ${a.join(" and ")}. Set discardChanges=true to confirm removal, or use exitAction='keep'.`}],details:{type:"worktree",error:"has_changes",hasChanges:i.hasChanges,unpushedCommits:i.unpushedCommits}}}}let o=await t.exitWorktree(n,r.discardChanges);return o.success?{content:[{type:"text",text:`Exited worktree. ${n==="keep"?"Worktree kept for later use.":"Worktree removed."}
326
326
  Restored to: ${o.previousCwd||"main workspace"}`}],details:{type:"worktree",action:"exit",exitAction:n,previousCwd:o.previousCwd}}:{content:[{type:"text",text:`Error: ${o.error||"failed to exit worktree"}`}],details:{type:"worktree",error:o.error}}}case"list":{let n=await t.listWorktrees();if(!n.worktrees||n.worktrees.length===0)return{content:[{type:"text",text:"No worktrees (only the main working tree)."}],details:{type:"worktree",action:"list",count:0}};let o=[`Worktrees (${n.worktrees.length}):`,""];for(let s of n.worktrees){let i=s.isCurrent?" \u2190 current":"",a=s.hasChanges?" (has changes)":"";o.push(` ${s.name} [${s.branch}]${i}${a}`),o.push(` path: ${s.path}`)}return{content:[{type:"text",text:o.join(`
327
- `)}],details:{type:"worktree",action:"list",count:n.worktrees.length}}}default:return{content:[{type:"text",text:`Error: unknown action "${r.action}".`}],details:{type:"worktree",error:"unknown_action"}}}}}}G();import{execFile as cN}from"node:child_process";import{promisify as lN}from"node:util";import{join as Nr,resolve as _y,basename as Ed}from"node:path";import{mkdir as $y,rm as Uy,symlink as dN,readdir as R5,stat as uN}from"node:fs/promises";var mo=lN(cN),pN=/^[a-zA-Z0-9._-]+$/,Dy=64;function Fy(t){if(t.length>Dy)throw new Error(`Invalid worktree name: must be ${Dy} characters or fewer (got ${t.length})`);for(let e of t.split("/")){if(e==="."||e==="..")throw new Error(`Invalid worktree name "${t}": must not contain "." or ".." path segments`);if(!pN.test(e))throw new Error(`Invalid worktree name "${t}": segment must contain only letters, digits, dots, underscores, and dashes`)}}function Md(t){return t.replaceAll("/","+")}function Hy(t){return`worktree-${Md(t)}`}var Ze=null;async function ve(t,e){try{let{stdout:r,stderr:n}=await mo("git",t,{cwd:e??process.cwd(),env:{...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:""},timeout:3e4});return{stdout:r,stderr:n,code:0}}catch(r){let n=r;return{stdout:n.stdout??"",stderr:n.stderr??String(r),code:n.code??1}}}async function po(t){let{stdout:e,code:r}=await ve(["rev-parse","--show-toplevel"],t);return r===0?e.trim():null}async function Ny(t){let{stdout:e,code:r}=await ve(["status","--porcelain"],t);return r!==0?-1:e.trim().split(`
327
+ `)}],details:{type:"worktree",action:"list",count:n.worktrees.length}}}default:return{content:[{type:"text",text:`Error: unknown action "${r.action}".`}],details:{type:"worktree",error:"unknown_action"}}}}}}G();import{execFile as cN}from"node:child_process";import{promisify as lN}from"node:util";import{join as Nr,resolve as _y,basename as Ed}from"node:path";import{mkdir as $y,rm as Uy,symlink as dN,readdir as S5,stat as uN}from"node:fs/promises";var mo=lN(cN),pN=/^[a-zA-Z0-9._-]+$/,Dy=64;function Fy(t){if(t.length>Dy)throw new Error(`Invalid worktree name: must be ${Dy} characters or fewer (got ${t.length})`);for(let e of t.split("/")){if(e==="."||e==="..")throw new Error(`Invalid worktree name "${t}": must not contain "." or ".." path segments`);if(!pN.test(e))throw new Error(`Invalid worktree name "${t}": segment must contain only letters, digits, dots, underscores, and dashes`)}}function Md(t){return t.replaceAll("/","+")}function Hy(t){return`worktree-${Md(t)}`}var Ze=null;async function ve(t,e){try{let{stdout:r,stderr:n}=await mo("git",t,{cwd:e??process.cwd(),env:{...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:""},timeout:3e4});return{stdout:r,stderr:n,code:0}}catch(r){let n=r;return{stdout:n.stdout??"",stderr:n.stderr??String(r),code:n.code??1}}}async function po(t){let{stdout:e,code:r}=await ve(["rev-parse","--show-toplevel"],t);return r===0?e.trim():null}async function Ny(t){let{stdout:e,code:r}=await ve(["status","--porcelain"],t);return r!==0?-1:e.trim().split(`
328
328
  `).filter(Boolean).length}async function Ly(t,e){let{stdout:r,code:n}=await ve(["rev-list",`origin/${e}..${e}`,"--count"],t);return n!==0?0:parseInt(r.trim(),10)||0}async function By(t,e,r,n){for(let o of r){if(o.includes("..")||o.startsWith("/")||o.startsWith("\\")){n?.warn(`[worktree] skipping symlink for "${o}": path traversal detected`);continue}let s=Nr(t,o),i=Nr(e,o);try{await dN(s,i,"dir"),n?.info(`[worktree] symlinked ${o} from main repo to worktree`)}catch(a){let c=a.code;c!=="ENOENT"&&c!=="EEXIST"&&n?.warn(`[worktree] failed to symlink ${o} (${c??"unknown"}): ${a}`)}}}async function mN(t,e,r){let{code:n,stderr:o}=await ve(["sparse-checkout","set","--cone","--",...r],t);if(n!==0)throw await ve(["worktree","remove","--force",t],e),new Error(`Failed to configure sparse-checkout: ${o}`);let{code:s,stderr:i}=await ve(["checkout","HEAD"],t);if(s!==0)throw await ve(["worktree","remove","--force",t],e),new Error(`Failed to checkout sparse worktree: ${i}`);return!0}async function gN(){try{return await mo("tmux",["-V"],{timeout:5e3}),!0}catch{return!1}}function fN(t,e){return`${Ed(t)}_${e}`.replace(/[/.]/g,"_")}async function hN(t,e){if(!await gN())return null;try{return await mo("tmux",["new-session","-d","-s",e,"-c",t],{timeout:1e4}),e}catch{return null}}async function Oy(t){try{return await mo("tmux",["kill-session","-t",t],{timeout:5e3}),!0}catch{return!1}}async function jy(t,e,r,n){let o=am(e),s=Nr(o,t);try{if(!(await uN(s)).isFile())return null}catch{return null}try{let{stdout:i,stderr:a}=await mo(s,[],{cwd:e,env:{...process.env,...r},timeout:3e4});return n?.info(`[worktree] hook ${t} succeeded: ${i.trim()}`),i.trim()||null}catch(i){return n?.warn(`[worktree] hook ${t} failed: ${i}`),null}}async function qy(t,e,r){Fy(e);let n=Md(e),o=Hy(e),s=Nr(t,".worktrees"),i=Nr(s,n);await $y(s,{recursive:!0});let{code:a,stderr:c}=await ve(["worktree","add","-B",o,i,"HEAD"],t);return a!==0?(r?.warn(`[worktree] agent worktree creation failed: ${c}`),null):(await By(t,i,["node_modules"],r),r?.info(`[worktree] agent worktree created: ${e} at ${i}`),{worktreePath:i,branch:o})}async function Wy(t,e,r,n){let{code:o}=await ve(["worktree","remove","--force",e],t);return o!==0&&(await Uy(e,{recursive:!0,force:!0}).catch(()=>{}),await ve(["worktree","prune"],t)),await ve(["branch","-D",r],t),n?.info(`[worktree] agent worktree removed: ${e}`),!0}function Gy(t){let{log:e,symlinkDirs:r=["node_modules"],sparsePaths:n}=t;return{async enterWorktree(o){try{let s=Date.now(),i=await po();if(!i)return{success:!1,error:"Not in a git repository"};let a=await jy("worktree-create",i,{WORKTREE_NAME:o??""},e);if(a){let E=process.cwd();return process.chdir(a),Ze={originalCwd:E,worktreePath:a,worktreeName:o??Ed(a),worktreeBranch:"",hookBased:!0,creationDurationMs:Date.now()-s},{success:!0,worktree:{name:Ze.worktreeName,path:a,branch:"",isCurrent:!0,hasChanges:!1,unpushedCommits:0}}}let c=o??`agent-${Date.now().toString(36)}`;Fy(c);let l=Md(c),d=Hy(c),p=Nr(i,".worktrees"),u=Nr(p,l);await $y(p,{recursive:!0});let{stdout:m}=await ve(["worktree","list","--porcelain"],i),f=m.split(`
329
329
  `).find(E=>E.startsWith("worktree ")&&E.includes(l));if(f){let E=f.replace("worktree ","").trim(),M=process.cwd();return process.chdir(E),Ze={originalCwd:M,worktreePath:E,worktreeName:c,worktreeBranch:d},e.info(`[worktree] resumed existing worktree: ${c} at ${E}`),{success:!0,worktree:{name:c,path:E,branch:d,isCurrent:!0,hasChanges:!1,unpushedCommits:0}}}let g=n&&n.length>0,h=["worktree","add"];g&&h.push("--no-checkout"),h.push("-B",d,u,"HEAD");let{code:b,stderr:v}=await ve(h,i);if(b!==0)return{success:!1,error:`git worktree add failed: ${v.trim()}`};let R=!1;g&&n&&(await mN(u,i,n),R=!0),await By(i,u,r,e);let S=process.cwd();process.chdir(u);let T=fN(i,d),C=await hN(u,T);return Ze={originalCwd:S,worktreePath:u,worktreeName:c,worktreeBranch:d,tmuxSessionName:C??void 0,creationDurationMs:Date.now()-s,usedSparsePaths:R},e.info(`[worktree] entered: ${c} at ${u}`),{success:!0,worktree:{name:c,path:u,branch:d,isCurrent:!0,hasChanges:!1,unpushedCommits:0}}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}},async exitWorktree(o,s){if(!Ze)return{success:!1,error:"Not in a worktree"};try{let i=Ze,a=await po(i.originalCwd);if(!a)return{success:!1,error:"Original git root not found"};if(o==="remove"){let c=await Ny(i.worktreePath),l=await Ly(i.worktreePath,i.worktreeBranch);if((c>0||l>0)&&!s)return{success:!1,error:`Worktree has ${c} uncommitted change(s) and ${l} unpushed commit(s). Set discardChanges=true to confirm.`};process.chdir(i.originalCwd),Ze=null,i.tmuxSessionName&&await Oy(i.tmuxSessionName),await jy("worktree-remove",a,{WORKTREE_PATH:i.worktreePath},e);let d=["worktree","remove"];s&&d.push("--force"),d.push(i.worktreePath);let{code:p,stderr:u}=await ve(d,a);p!==0&&(e.warn(`[worktree] git worktree remove failed: ${u.trim()}, cleaning up manually`),await Uy(i.worktreePath,{recursive:!0,force:!0}).catch(()=>{}),await ve(["worktree","prune"],a)),await ve(["branch","-D",i.worktreeBranch],a),e.info(`[worktree] removed: ${i.worktreeName}`)}else process.chdir(i.originalCwd),i.tmuxSessionName&&await Oy(i.tmuxSessionName),Ze=null,e.info(`[worktree] exited (kept): ${i.worktreeName}`);return{success:!0,previousCwd:i.originalCwd}}catch(i){return{success:!1,error:i instanceof Error?i.message:String(i)}}},async listWorktrees(){try{let{stdout:o,code:s}=await ve(["worktree","list","--porcelain"]);if(s!==0)return{success:!0,worktrees:[]};let i=[],a=process.cwd(),c=o.split(`
330
330
 
@@ -350,9 +350,9 @@ ${p}${u}`}],details:{type:"notebook_edit",edit_mode:o,cell_number:n,total_cells:
350
350
  `];for(let i of o)s.push(`- ${i.filename} | ID: ${i.id} | ${Ld(i.bytes)} | ${i.status}${i.url?` | ${i.url}`:""}`);return{content:[{type:"text",text:s.join(`
351
351
  `)}],details:{type:"file_query",count:o.length}}}}}var YN="file_delete",JN={type:"object",properties:{file_id:{type:"string",description:"ID of the uploaded file to delete."}},required:["file_id"]};function mv(t){return{name:YN,label:"File Delete",description:"Delete a previously uploaded file from the provider's Files API. Use the file ID returned by file_upload or file_query.",parameters:JN,execute:async(e,r)=>(await t.deleteFile({fileId:r.file_id}),{content:[{type:"text",text:`Deleted file ${r.file_id}`}],details:{type:"file_delete",fileId:r.file_id}})}}function Ld(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}var QN="ask_user",ZN={type:"object",properties:{questions:{type:"array",minItems:1,maxItems:4,description:"1-4 clarifying questions to ask the user.",items:{type:"object",properties:{question:{type:"string",description:"The question text. Should end with '?'."},header:{type:"string",description:"Short identifier/tag for this question (max 50 chars)."},options:{type:"array",description:"2-4 options for the user to choose from. Omit for free text.",items:{type:"object",properties:{label:{type:"string",description:"Display label (1-5 words)."},description:{type:"string",description:"Brief explanation of this option."}},required:["label"]}},multiSelect:{type:"boolean",description:"Allow selecting multiple options (default: false)."}},required:["question","header"]}}},required:["questions"]};function gv(t){return{name:QN,label:"Ask User",description:"Ask the user clarifying questions when you need more information to proceed. Supports free text questions and multiple-choice options. Use this when the user's intent is ambiguous or you need confirmation.",parameters:ZN,execute:async(e,r)=>{if(!r.questions||r.questions.length===0)return{content:[{type:"text",text:"Error: at least one question is required."}],details:{type:"ask_user",error:"no_questions"}};if(r.questions.length>4)return{content:[{type:"text",text:"Error: maximum 4 questions allowed."}],details:{type:"ask_user",error:"too_many_questions"}};let n=r.questions.map(i=>i.question);if(new Set(n).size!==n.length)return{content:[{type:"text",text:"Error: all questions must have unique text."}],details:{type:"ask_user",error:"duplicate_questions"}};for(let i of r.questions){if(i.options&&(i.options.length<2||i.options.length>4))return{content:[{type:"text",text:`Error: question "${i.header}" must have 2-4 options (got ${i.options.length}).`}],details:{type:"ask_user",error:"invalid_option_count"}};if(i.options){let a=i.options.map(c=>c.label);if(new Set(a).size!==a.length)return{content:[{type:"text",text:`Error: question "${i.header}" has duplicate option labels.`}],details:{type:"ask_user",error:"duplicate_option_labels"}}}}let o=await t.askUser(r.questions);if(o===null)return{content:[{type:"text",text:"User declined to answer questions."}],details:{type:"ask_user",declined:!0}};let s=["User answered:"];for(let i of r.questions){let a=o[i.question]??"(no answer)";s.push(`- ${i.header}: ${a}`)}return{content:[{type:"text",text:s.join(`
352
352
  `)}],details:{type:"ask_user",answers:o,questionCount:r.questions.length}}}}}var eL="project_switch",tL={type:"object",properties:{projectName:{type:"string",description:"The name of the project to switch to. Use the exact project name from the available project list."}},required:["projectName"]};function fv(t){return{name:eL,label:"Switch Project",description:["Switch the active project context. ONLY call this when the user EXPLICITLY asks to switch projects","(e.g. '\u5207\u6362\u5230XX\u9879\u76EE', 'switch to project X').","Do NOT call this if the user merely mentions a project name in conversation.","The projectName must be an EXACT match from the available project list.","If unsure which project the user means, ask them to clarify first."].join(`
353
- `),parameters:tL,isReadOnly:!1,isConcurrencySafe:!1,shouldDefer:!0,searchHint:"switch project change workspace \u5207\u6362\u9879\u76EE",execute:async(e,r)=>{let n=t.listProjects();if(n.length===0)return{content:[{type:"text",text:"Error: No projects available."}]};let o=r.projectName.toLowerCase().trim(),s=n.find(a=>a.name.toLowerCase()===o);if(!s){let a=n.map(c=>`"${c.name}"`).join(", ");return{content:[{type:"text",text:`Error: No project with exact name "${r.projectName}". Available projects: ${a}. Please confirm the exact project name with the user before retrying.`}]}}let i=t.switchProject(s.id);return i?(t.onSwitched?.(i),{content:[{type:"text",text:`Switched to project "${i.name}" (workspace: ${i.workspaceDir}).`}]}):{content:[{type:"text",text:`Error: Failed to switch to project "${s.name}".`}]}}}}import{MediaClient as hv,ProviderRegistry as yv,createDebugTransport as rL,createLLMClient as ei,isAsyncMediaTransport as jd,isDebugTransportEnabled as nL}from"@xiaozhiclaw/provider-core";import{cleanSchemaForGemini as z5}from"@xiaozhiclaw/provider-core/gemini-schema-utils";import{GeminiFileAPI as oL}from"@xiaozhiclaw/provider-core/transports/gemini-file-api";import{MiniMaxMediaTransport as sL}from"@xiaozhiclaw/provider-core/transports/minimax-media";import{VolcengineMediaTransport as iL}from"@xiaozhiclaw/provider-core/transports/volcengine-media";import{ZhipuToolAPI as aL}from"@xiaozhiclaw/provider-core/transports/zhipu-tool-api";var cL=new Set(["zhipu","zhipu-openai","zhipu-coding"]),lL="https://open.bigmodel.cn/api/paas/v4",dL={bytedance:"volcengine",doubao:"volcengine"};function ti(t){let e=t.trim().toLowerCase();return dL[e]??e}function lr(t,e){return t[e]??t[ti(e)]}function vv(t,e){if(!(!t||!e)&&cL.has(t))return new aL({baseUrl:lL,apiKey:e})}function bv(t,e){return nL()?rL(t,e):t}function kv(t){return t instanceof sL}function Rv(t){return t instanceof iL}var Od;function Sv(){return Od||(Od=new oL({baseUrl:"https://generativelanguage.googleapis.com/v1beta"})),Od}var $d=new Set(["gateway","agents_list","session_status","sessions_send","sessions_list","sessions_history","sessions_spawn","cron","config","workflow"]),Tv=new Set([...$d,"agent"]);function Ud(t,e){let r=e?$d:Tv;return t.filter(n=>n.function.name.startsWith("mcp__")?!0:!r.has(n.function.name))}var Hd=class{toolPool=new Map;activatedTools=new Set;setTools(e){this.toolPool.clear(),this.activatedTools.clear();for(let r of e)this.toolPool.set(r.name,r)}addTool(e){this.toolPool.set(e.name,e)}addTools(e){for(let r of e)this.addTool(r)}removeTool(e){return this.activatedTools.delete(e),this.toolPool.delete(e)}findTool(e){return this.toolPool.get(e)}hasTool(e){return this.toolPool.has(e)}getToolNames(){return Array.from(this.toolPool.keys())}getToolCount(){return this.toolPool.size}async executeTool(e,r,n,o){let s=this.toolPool.get(e);if(!s)throw new Error(`Tool not found: ${e}`);return s.execute(r,n,o)}getTools(){return Array.from(this.toolPool.values()).filter(e=>e.isEnabled?.()!==!1)}activateTool(e){let r=this.toolPool.get(e);return!r||r.isEnabled?.()===!1?!1:(this.activatedTools.add(e),!0)}isToolActivated(e){return this.activatedTools.has(e)}clearActivatedTools(){this.activatedTools.clear()}getToolManifest(e=!1){let r=[];for(let n of this.toolPool.values())n.isEnabled?.()!==!1&&(!e&&n.shouldDefer&&!this.activatedTools.has(n.name)||r.push({type:"function",function:{name:n.name,description:n.description,parameters:n.parameters},meta:{category:n.category??"other",displayName:n.displayName??{key:`capability.tool.${n.name}.name`,fallback:n.label},displayDescription:n.displayDescription??{key:`capability.tool.${n.name}.description`,fallback:""},parallelSafe:n.isConcurrencySafe??!1,riskLevel:Fd(n),isReadOnly:(n.riskLevel??Fd(n))==="read",isDangerous:(n.riskLevel??Fd(n))==="system"}}));return r}};function Fd(t){return t.riskLevel?t.riskLevel:t.isReadOnly?"read":t.category==="media"||t.category==="web"||t.category==="mcp"?"external_egress":t.category==="system"||t.name==="exec"||t.name==="computer"?"system":"write"}var $t=new Hd;function wv(){return $t}function Av(t){$t.setTools(t)}function ri(t){$t.addTool(t)}function ni(t){$t.addTools(t)}function un(t){return $t.removeTool(t)}function Pv(t){return $t.findTool(t)}function oi(){return $t.getToolNames()}function xv(t){return $t.activateTool(t)}function Cv(){$t.clearActivatedTools()}function Iv(t=!1){return $t.getToolManifest(t)}function Ev(t=wv()){return{findTool:e=>t.findTool(e),getToolManifest:e=>t.getToolManifest(e),getToolNames:()=>t.getToolNames(),setTools:e=>t.setTools(e),addTool:e=>t.addTool(e),addTools:e=>t.addTools(e),removeTool:e=>t.removeTool(e),activateTool:e=>t.activateTool(e),clearActivatedTools:()=>t.clearActivatedTools()}}function Lr(){return{findTool:t=>Pv(t),getToolManifest:t=>Iv(t),getToolNames:()=>oi(),setTools:t=>Av(t),addTool:t=>ri(t),addTools:t=>ni(t),removeTool:t=>un(t),activateTool:t=>xv(t),clearActivatedTools:()=>Cv()}}var Ae,Or={},_v,Bd,dr={},Dv;function si(t){Dv=t}function Nv(){return Dv}function qd(t,e,r,n,o){Ae=t,Or=e??{},_v=r,Bd=o,dr=n??{},pL()}function Lv(){return{mediaClient:Ae,mediaProviders:dr,mediaApiKeys:Or}}function Wd(t){let e=dr[t];if(!(!e||!Ae))return Ae.resolveModelById(e.provider,e.model,t)}function pL(){mL(),gL(),fL(),hL()}function mL(){let t=Lr().findTool(Dd);if(!t)return;let e=dr.video;if(!e||!Ae)return;let r=Ae.resolveModelById(e.provider,e.model,"video");if(!r)return;let n=r.modelInfo.mediaCapabilities;if(!n)return;let o=n.maxDurationSeconds??10,s=o>=10?4:3,i=n.resolutions?.join("/")||"720P",a=r.modelInfo.name||r.modelInfo.id;t.description=`Generate a short video clip from a text prompt, reference image, source video, or multimodal references. Current model: ${a}. Single-shot: ${s}-${o}s. For longer videos (>${o}s), use multi-shot storyboard workflow. Prompt MUST be in English. ALL image/video/audio URLs MUST be publicly accessible HTTP/HTTPS URLs.`;let c=t.parameters?.properties,l=c?.duration;l&&(l.minimum=s,l.maximum=o,l.description=`Video duration in seconds (${s}-${o}s for ${a}). For longer videos (>${o}s), use multi-shot storyboard workflow (generate + extend/merge).`);let d=c?.resolution;d&&n.resolutions&&(d.description=`Output resolution: ${i}. Default: '720p'.`)}function gL(){let t=Lr().findTool(_d);if(!t)return;let e=Wd("image");if(!e)return;let r=e.modelInfo.mediaCapabilities,n=e.modelInfo.name||e.modelInfo.id,o=[];if(r?.sizes?.length&&o.push(`Sizes: ${r.sizes.join(", ")}`),r?.transparentBackground&&o.push("Supports transparent background"),t.description=`Generate images from a text prompt. Enrich vague prompts with style, lighting, composition, color, and mood before calling. Supports img2img via image_url reference. Current model: ${n}. ${o.join(". ")}${o.length?". ":""}ALL reference image URLs MUST be publicly accessible HTTP/HTTPS URLs; use file_upload first for local files.`,r?.sizes?.length){let i=t.parameters?.properties?.size;i&&(i.description=`Dimensions: ${r.sizes.join(", ")}. Default: '1024x1024'. Auto-infer from purpose.`)}}function fL(){let t=Lr().findTool("tts");if(!t)return;let e=Wd("tts");if(!e)return;let r=e.modelInfo.mediaCapabilities,n=e.modelInfo.name||e.modelInfo.id,o=[];if(r?.voices?.length&&o.push(`Voices: ${r.voices.join(", ")}`),r?.maxCharacters&&o.push(`Max: ${r.maxCharacters} characters per request`),r?.formats?.length&&o.push(`Formats: ${r.formats.join(", ")}`),t.description=`Convert text to speech (TTS) as spoken audio. Use for narration or voice messages, not music. Current model: ${n}. ${o.join(". ")}${o.length?".":""}`,r?.voices?.length){let i=t.parameters?.properties?.voice;i&&(i.description=`Voice name. Available: ${r.voices.join(", ")}.`)}}function hL(){let t=Lr().findTool(Nd);if(!t)return;let e=Wd("music");if(!e)return;let r=e.modelInfo.mediaCapabilities,n=e.modelInfo.name||e.modelInfo.id,o=[];if(r?.maxDurationSeconds&&o.push(`Max duration: ${r.maxDurationSeconds}s`),r?.formats?.length&&o.push(`Formats: ${r.formats.join(", ")}`),t.description=`Generate music, songs, or melodies from text descriptions. Prompt MUST be in English. Supports lyrics for vocal songs; use tts for spoken-word audio. Current model: ${n}. ${o.join(". ")}${o.length?". ":""}`,r?.maxDurationSeconds){let i=t.parameters?.properties?.duration;i&&(i.maximum=r.maxDurationSeconds,i.description=`Duration in seconds (5-${r.maxDurationSeconds}s for ${n}). Infer from purpose: ringtone 15-30s, BGM 30-60s, full song 120-180s.`)}}async function Et(t){if(!Ae)throw new Error(`No media provider configured for ${t.mediaType}`);let e=dr[t.mediaType],r=e?.provider,n=e?.model||t.model;if(!r)throw new Error(`No provider configured for ${t.mediaType}. Please configure a provider in settings.`);let o={...t};Bd&&!o.onProgress&&(o.onProgress=(c,l,d)=>{Bd(d??"pending",t.mediaType,c,l,r)});let s=await Mv(r,n||t.model,o);if(s.ok)return s.result;let i=Ae.listMediaModels(t.mediaType),a=[`${r}: ${s.error}`];for(let c of i){if(c.providerId===r||!Or[c.providerId])continue;let d=await Mv(c.providerId,c.modelInfo.id,t);if(d.ok)return d.result;a.push(`${c.providerId}/${c.modelInfo.id}: ${d.error}`)}throw new Error(`All media providers failed for ${t.mediaType}:
353
+ `),parameters:tL,isReadOnly:!1,isConcurrencySafe:!1,shouldDefer:!0,searchHint:"switch project change workspace \u5207\u6362\u9879\u76EE",execute:async(e,r)=>{let n=t.listProjects();if(n.length===0)return{content:[{type:"text",text:"Error: No projects available."}]};let o=r.projectName.toLowerCase().trim(),s=n.find(a=>a.name.toLowerCase()===o);if(!s){let a=n.map(c=>`"${c.name}"`).join(", ");return{content:[{type:"text",text:`Error: No project with exact name "${r.projectName}". Available projects: ${a}. Please confirm the exact project name with the user before retrying.`}]}}let i=t.switchProject(s.id);return i?(t.onSwitched?.(i),{content:[{type:"text",text:`Switched to project "${i.name}" (workspace: ${i.workspaceDir}).`}]}):{content:[{type:"text",text:`Error: Failed to switch to project "${s.name}".`}]}}}}import{MediaClient as hv,ProviderRegistry as yv,createDebugTransport as rL,createLLMClient as ei,isAsyncMediaTransport as jd,isDebugTransportEnabled as nL}from"@xiaozhiclaw/provider-core";import{cleanSchemaForGemini as K5}from"@xiaozhiclaw/provider-core/gemini-schema-utils";import{GeminiFileAPI as oL}from"@xiaozhiclaw/provider-core/transports/gemini-file-api";import{MiniMaxMediaTransport as sL}from"@xiaozhiclaw/provider-core/transports/minimax-media";import{VolcengineMediaTransport as iL}from"@xiaozhiclaw/provider-core/transports/volcengine-media";import{ZhipuToolAPI as aL}from"@xiaozhiclaw/provider-core/transports/zhipu-tool-api";var cL=new Set(["zhipu","zhipu-openai","zhipu-coding"]),lL="https://open.bigmodel.cn/api/paas/v4",dL={bytedance:"volcengine",doubao:"volcengine"};function ti(t){let e=t.trim().toLowerCase();return dL[e]??e}function lr(t,e){return t[e]??t[ti(e)]}function vv(t,e){if(!(!t||!e)&&cL.has(t))return new aL({baseUrl:lL,apiKey:e})}function bv(t,e){return nL()?rL(t,e):t}function kv(t){return t instanceof sL}function Rv(t){return t instanceof iL}var Od;function Sv(){return Od||(Od=new oL({baseUrl:"https://generativelanguage.googleapis.com/v1beta"})),Od}var $d=new Set(["gateway","agents_list","session_status","sessions_send","sessions_list","sessions_history","sessions_spawn","cron","config","workflow"]),Tv=new Set([...$d,"agent"]);function Ud(t,e){let r=e?$d:Tv;return t.filter(n=>n.function.name.startsWith("mcp__")?!0:!r.has(n.function.name))}var Hd=class{toolPool=new Map;activatedTools=new Set;setTools(e){this.toolPool.clear(),this.activatedTools.clear();for(let r of e)this.toolPool.set(r.name,r)}addTool(e){this.toolPool.set(e.name,e)}addTools(e){for(let r of e)this.addTool(r)}removeTool(e){return this.activatedTools.delete(e),this.toolPool.delete(e)}findTool(e){return this.toolPool.get(e)}hasTool(e){return this.toolPool.has(e)}getToolNames(){return Array.from(this.toolPool.keys())}getToolCount(){return this.toolPool.size}async executeTool(e,r,n,o){let s=this.toolPool.get(e);if(!s)throw new Error(`Tool not found: ${e}`);return s.execute(r,n,o)}getTools(){return Array.from(this.toolPool.values()).filter(e=>e.isEnabled?.()!==!1)}activateTool(e){let r=this.toolPool.get(e);return!r||r.isEnabled?.()===!1?!1:(this.activatedTools.add(e),!0)}isToolActivated(e){return this.activatedTools.has(e)}clearActivatedTools(){this.activatedTools.clear()}getToolManifest(e=!1){let r=[];for(let n of this.toolPool.values())n.isEnabled?.()!==!1&&(!e&&n.shouldDefer&&!this.activatedTools.has(n.name)||r.push({type:"function",function:{name:n.name,description:n.description,parameters:n.parameters},meta:{category:n.category??"other",displayName:n.displayName??{key:`capability.tool.${n.name}.name`,fallback:n.label},displayDescription:n.displayDescription??{key:`capability.tool.${n.name}.description`,fallback:""},parallelSafe:n.isConcurrencySafe??!1,riskLevel:Fd(n),isReadOnly:(n.riskLevel??Fd(n))==="read",isDangerous:(n.riskLevel??Fd(n))==="system"}}));return r}};function Fd(t){return t.riskLevel?t.riskLevel:t.isReadOnly?"read":t.category==="media"||t.category==="web"||t.category==="mcp"?"external_egress":t.category==="system"||t.name==="exec"||t.name==="computer"?"system":"write"}var $t=new Hd;function wv(){return $t}function Av(t){$t.setTools(t)}function ri(t){$t.addTool(t)}function ni(t){$t.addTools(t)}function un(t){return $t.removeTool(t)}function Pv(t){return $t.findTool(t)}function oi(){return $t.getToolNames()}function xv(t){return $t.activateTool(t)}function Cv(){$t.clearActivatedTools()}function Iv(t=!1){return $t.getToolManifest(t)}function Ev(t=wv()){return{findTool:e=>t.findTool(e),getToolManifest:e=>t.getToolManifest(e),getToolNames:()=>t.getToolNames(),setTools:e=>t.setTools(e),addTool:e=>t.addTool(e),addTools:e=>t.addTools(e),removeTool:e=>t.removeTool(e),activateTool:e=>t.activateTool(e),clearActivatedTools:()=>t.clearActivatedTools()}}function Lr(){return{findTool:t=>Pv(t),getToolManifest:t=>Iv(t),getToolNames:()=>oi(),setTools:t=>Av(t),addTool:t=>ri(t),addTools:t=>ni(t),removeTool:t=>un(t),activateTool:t=>xv(t),clearActivatedTools:()=>Cv()}}var Ae,Or={},_v,Bd,dr={},Dv;function si(t){Dv=t}function Nv(){return Dv}function qd(t,e,r,n,o){Ae=t,Or=e??{},_v=r,Bd=o,dr=n??{},pL()}function Lv(){return{mediaClient:Ae,mediaProviders:dr,mediaApiKeys:Or}}function Wd(t){let e=dr[t];if(!(!e||!Ae))return Ae.resolveModelById(e.provider,e.model,t)}function pL(){mL(),gL(),fL(),hL()}function mL(){let t=Lr().findTool(Dd);if(!t)return;let e=dr.video;if(!e||!Ae)return;let r=Ae.resolveModelById(e.provider,e.model,"video");if(!r)return;let n=r.modelInfo.mediaCapabilities;if(!n)return;let o=n.maxDurationSeconds??10,s=o>=10?4:3,i=n.resolutions?.join("/")||"720P",a=r.modelInfo.name||r.modelInfo.id;t.description=`Generate a short video clip from a text prompt, reference image, source video, or multimodal references. Current model: ${a}. Single-shot: ${s}-${o}s. For longer videos (>${o}s), use multi-shot storyboard workflow. Prompt MUST be in English. ALL image/video/audio URLs MUST be publicly accessible HTTP/HTTPS URLs.`;let c=t.parameters?.properties,l=c?.duration;l&&(l.minimum=s,l.maximum=o,l.description=`Video duration in seconds (${s}-${o}s for ${a}). For longer videos (>${o}s), use multi-shot storyboard workflow (generate + extend/merge).`);let d=c?.resolution;d&&n.resolutions&&(d.description=`Output resolution: ${i}. Default: '720p'.`)}function gL(){let t=Lr().findTool(_d);if(!t)return;let e=Wd("image");if(!e)return;let r=e.modelInfo.mediaCapabilities,n=e.modelInfo.name||e.modelInfo.id,o=[];if(r?.sizes?.length&&o.push(`Sizes: ${r.sizes.join(", ")}`),r?.transparentBackground&&o.push("Supports transparent background"),t.description=`Generate images from a text prompt. Enrich vague prompts with style, lighting, composition, color, and mood before calling. Supports img2img via image_url reference. Current model: ${n}. ${o.join(". ")}${o.length?". ":""}ALL reference image URLs MUST be publicly accessible HTTP/HTTPS URLs; use file_upload first for local files.`,r?.sizes?.length){let i=t.parameters?.properties?.size;i&&(i.description=`Dimensions: ${r.sizes.join(", ")}. Default: '1024x1024'. Auto-infer from purpose.`)}}function fL(){let t=Lr().findTool("tts");if(!t)return;let e=Wd("tts");if(!e)return;let r=e.modelInfo.mediaCapabilities,n=e.modelInfo.name||e.modelInfo.id,o=[];if(r?.voices?.length&&o.push(`Voices: ${r.voices.join(", ")}`),r?.maxCharacters&&o.push(`Max: ${r.maxCharacters} characters per request`),r?.formats?.length&&o.push(`Formats: ${r.formats.join(", ")}`),t.description=`Convert text to speech (TTS) as spoken audio. Use for narration or voice messages, not music. Current model: ${n}. ${o.join(". ")}${o.length?".":""}`,r?.voices?.length){let i=t.parameters?.properties?.voice;i&&(i.description=`Voice name. Available: ${r.voices.join(", ")}.`)}}function hL(){let t=Lr().findTool(Nd);if(!t)return;let e=Wd("music");if(!e)return;let r=e.modelInfo.mediaCapabilities,n=e.modelInfo.name||e.modelInfo.id,o=[];if(r?.maxDurationSeconds&&o.push(`Max duration: ${r.maxDurationSeconds}s`),r?.formats?.length&&o.push(`Formats: ${r.formats.join(", ")}`),t.description=`Generate music, songs, or melodies from text descriptions. Prompt MUST be in English. Supports lyrics for vocal songs; use tts for spoken-word audio. Current model: ${n}. ${o.join(". ")}${o.length?". ":""}`,r?.maxDurationSeconds){let i=t.parameters?.properties?.duration;i&&(i.maximum=r.maxDurationSeconds,i.description=`Duration in seconds (5-${r.maxDurationSeconds}s for ${n}). Infer from purpose: ringtone 15-30s, BGM 30-60s, full song 120-180s.`)}}async function Et(t){if(!Ae)throw new Error(`No media provider configured for ${t.mediaType}`);let e=dr[t.mediaType],r=e?.provider,n=e?.model||t.model;if(!r)throw new Error(`No provider configured for ${t.mediaType}. Please configure a provider in settings.`);let o={...t};Bd&&!o.onProgress&&(o.onProgress=(c,l,d)=>{Bd(d??"pending",t.mediaType,c,l,r)});let s=await Mv(r,n||t.model,o);if(s.ok)return s.result;let i=Ae.listMediaModels(t.mediaType),a=[`${r}: ${s.error}`];for(let c of i){if(c.providerId===r||!Or[c.providerId])continue;let d=await Mv(c.providerId,c.modelInfo.id,t);if(d.ok)return d.result;a.push(`${c.providerId}/${c.modelInfo.id}: ${d.error}`)}throw new Error(`All media providers failed for ${t.mediaType}:
354
354
  `+a.map(c=>` - ${c}`).join(`
355
- `))}async function Mv(t,e,r){let n=Ae.getTransport(t);if(!n)return{ok:!1,error:"transport not available"};let o=lr(Or,t);if(!o)return{ok:!1,error:"no API key"};try{let s={...r,model:e},i=await n.generate(s,o);i.billingUnit||(r.mediaType==="tts"&&r.text?(i.billingUnit="per_character",i.billingQuantity=r.text.length):(r.mediaType==="video"||r.mediaType==="music")&&r.duration?(i.billingUnit="per_second",i.billingQuantity=r.duration):(i.billingUnit="per_call",i.billingQuantity=1));let a=i.model??s.model,c=i.billingUnit??"per_call",l=i.billingQuantity??1;return _v?.(a,c,l),{ok:!0,result:i}}catch(s){return{ok:!1,error:s instanceof Error?s.message:String(s)}}}function Mt(t){if(!Ae)return!1;let e=dr[t];if(!e)return!1;let r=Ae.getTransport(e.provider),n=lr(Or,e.provider);return!!(r&&n)}function ii(t,e){if(!Mt(t))return!1;let r=dr[t],n=Ae.resolveModelById(r.provider,r.model,t);if(!n)return!1;let o=n.modelInfo.mediaCapabilities;return!o||!("operations"in o)||!o.operations?!0:o.operations.includes(e)}async function Ov(t){let e=dr.music;if(!e||!Ae)return"";let r=Ae.getTransport(e.provider);if(!kv(r))return"";let n=lr(Or,e.provider);return n?r.generateLyrics(t,n):""}async function jv(t){let e=t.provider??"doubao";if(!Ae)return{ok:!1,message:"Media client not configured."};let r=Ae.getTransport(e);if(!r)return{ok:!1,message:`No transport for provider: ${e}`};let n=lr(Or,e);if(!n)return{ok:!1,message:`No API key for provider: ${e}`};try{return"deleteVideoTask"in r&&typeof r.deleteVideoTask=="function"?(await r.deleteVideoTask(t.taskId,n),{ok:!0,message:"Task cancelled."}):{ok:!1,message:`Provider ${e} does not support task cancellation.`}}catch(o){return{ok:!1,message:o instanceof Error?o.message:String(o)}}}import*as pn from"node:fs";import*as ci from"node:path";function yL(t={}){let e=t.createGeminiFileApi??Sv,r=t.isVolcengineFileTransport??Rv,n=a=>{if(a.mediaClient)for(let[,c]of Object.entries(a.mediaProviders)){if(!c)continue;let l=a.mediaClient.getTransport(c.provider),d=lr(a.mediaApiKeys,c.provider);if(r(l)&&d)return{id:c.provider,type:"volcengine"}}if(a.mediaApiKeys.google)return{id:"google",type:"gemini"}},o=a=>{let c=n(a);if(!c)throw new Error("No file API provider available. Configure a media provider with Files API support (e.g. Volcengine, Google).");return c},s=(a,c)=>{let l=a.mediaClient?.getTransport(c);if(!r(l))throw new Error(`File API only supported via Volcengine or Google provider. Current: ${c}`);return l},i=(a,c)=>{let l=lr(a.mediaApiKeys,c);if(!l)throw new Error(`No API key for file API provider: ${c}`);return l};return{resolveProvider:n,uploadFile:async(a,c)=>{let l=o(a);if(l.type==="gemini"){let f=e(),g=a.mediaApiKeys.google,h=await f.uploadFile(c.buffer,g,{mimeType:c.mimeType,displayName:c.filename}),b=h.state==="PROCESSING"?await f.waitForProcessing(h.name,g):h;return{fileId:b.name,url:b.uri,filename:c.filename,bytes:c.bytes,provider:"google"}}let d=s(a,l.id),p=i(a,l.id),u=await d.uploadFile(new Blob([c.buffer]),p,{purpose:c.purpose??"media_reference",filename:c.filename}),m;try{let f=await d.getFile(u.id,p);typeof f.url=="string"&&f.url&&(m=f.url)}catch{}return{fileId:u.id,url:m,filename:c.filename,bytes:c.bytes,provider:l.id}},queryFile:async(a,c)=>{let l=o(a);if(l.type==="gemini"){let u=await e().getFile(c,a.mediaApiKeys.google);return $v(u)}let p=await s(a,l.id).getFile(c,i(a,l.id));return Uv(p,c)},listFiles:async(a,c)=>{let l=o(a);return l.type==="gemini"?(await e().listFiles(a.mediaApiKeys.google,{pageSize:c})).files.map($v):((await s(a,l.id).listFiles(i(a,l.id),{limit:c})).data??[]).map(u=>Uv(u))},deleteFile:async(a,c)=>{let l=o(a);if(l.type==="gemini"){await e().deleteFile(c,a.mediaApiKeys.google);return}await s(a,l.id).deleteFile(c,i(a,l.id))}}}var Gd=yL();function $v(t){return{id:t.name,filename:t.displayName??"",bytes:Number(t.sizeBytes??0),status:t.state?.toLowerCase()??"unknown",createdAt:t.createTime,url:t.uri}}function Uv(t,e=""){return{id:String(t.id??e),filename:String(t.filename??""),bytes:Number(t.bytes??0),status:String(t.status??"unknown"),createdAt:t.created_at?String(t.created_at):void 0,url:t.url?String(t.url):void 0}}function Fv(t){let e=t.maxUploadBytes??104857600,r=t.mediaFileApiService??Gd;return{isAvailable:()=>Hv(t.getContext(),r),uploadFile:async n=>{ai(t.getContext(),r,"upload");let o=t.resolvePath(n.filePath);if(!pn.existsSync(o))throw new Error(`File not found: ${o}`);let s=pn.statSync(o);if(s.size>e)throw new Error(`File too large (${(s.size/1024/1024).toFixed(1)} MB). Max: ${(e/1024/1024).toFixed(0)} MB.`);let i=await pn.promises.readFile(o),a=ci.basename(o),c=ci.extname(o).toLowerCase();return r.uploadFile(t.getContext(),{buffer:Buffer.from(i),filename:a,bytes:s.size,mimeType:vL[c]??"application/octet-stream",purpose:n.purpose??"media_reference"})},queryFile:async n=>(ai(t.getContext(),r,"query"),r.queryFile(t.getContext(),n.fileId)),listFiles:async n=>(ai(t.getContext(),r,"list"),r.listFiles(t.getContext(),n.limit??10)),deleteFile:async n=>{ai(t.getContext(),r,"delete"),await r.deleteFile(t.getContext(),n.fileId)}}}function Hv(t,e=Gd){return!!e.resolveProvider(t)}function ai(t,e,r){if(!Hv(t,e))throw new Error(`No file ${r} provider available. Configure a media provider with Files API support (e.g. Volcengine, Google).`)}var vL={".pdf":"application/pdf",".txt":"text/plain",".html":"text/html",".htm":"text/html",".css":"text/css",".js":"text/javascript",".ts":"text/plain",".json":"application/json",".xml":"application/xml",".csv":"text/csv",".md":"text/markdown",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".bmp":"image/bmp",".svg":"image/svg+xml",".mp3":"audio/mpeg",".wav":"audio/wav",".ogg":"audio/ogg",".flac":"audio/flac",".m4a":"audio/mp4",".aac":"audio/aac",".mp4":"video/mp4",".webm":"video/webm",".avi":"video/x-msvideo",".mov":"video/quicktime",".doc":"application/msword",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document",".xls":"application/vnd.ms-excel",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation"};function Bv(t,e){return!t?.webSearch||!t.capabilities.includes("web_search")?e:async(r,n)=>{try{let s=await t.webSearch(r,{maxResults:n?.maxResults});if(n?.allowedDomains?.length){let i=new Set(n.allowedDomains.map(a=>a.toLowerCase()));s=s.filter(a=>{try{return i.has(new URL(a.url).hostname.toLowerCase())}catch{return!1}})}if(n?.blockedDomains?.length){let i=new Set(n.blockedDomains.map(a=>a.toLowerCase()));s=s.filter(a=>{try{return!i.has(new URL(a.url).hostname.toLowerCase())}catch{return!0}})}if(s.length>0)return{query:r,results:s.map(i=>({title:i.title,url:i.url,snippet:i.snippet}))}}catch{}return e(r,n)}}var Qt=class{nodes=new Map;edges=[];constructor(e){for(let r of e){if(this.nodes.has(r.id))throw new Error(`Duplicate node ID: ${r.id}`);this.nodes.set(r.id,{id:r.id,kind:r.kind??"agent",params:r.params??{},status:"pending",outPorts:r.outPorts??["default"],joinPolicy:r.joinPolicy??"all",runIndex:0,maxIterations:r.maxIterations})}for(let r of e)for(let n of r.dependsOn??[]){if(!this.nodes.has(n))throw new Error(`Node "${r.id}" depends on unknown node "${n}"`);this.edges.push({from:n,to:r.id,fromPort:"default"})}this.validateDag()}getNode(e){return this.nodes.get(e)}getAllNodes(){return[...this.nodes.values()]}getReadyNodes(){let e=[];for(let r of this.nodes.values()){if(r.status!=="pending"||this.isBlockedByFailed(r.id))continue;let n=this.incomingForwardEdges(r.id);if(n.length===0){e.push(r);continue}r.joinPolicy==="any"?n.some(o=>this.edgeSatisfied(o))&&e.push(r):n.every(o=>this.edgeSatisfied(o))&&e.push(r)}return e}isFinished(){for(let e of this.nodes.values())if(e.status==="running"||e.status==="paused"||e.status==="pending"&&!this.isBlockedByFailed(e.id)&&!this.isSkippable(e.id))return!1;return!0}isAllCompleted(){return[...this.nodes.values()].every(e=>e.status==="completed"||e.status==="skipped")}getBlockedNodes(){return[...this.nodes.values()].filter(e=>e.status==="pending"&&this.isBlockedByFailed(e.id))}getProgress(){let e=0,r=0,n=0,o=0,s=0,i=0;for(let a of this.nodes.values())switch(a.status){case"completed":e++;break;case"running":r++;break;case"failed":n++;break;case"pending":o++;break;case"paused":s++;break;case"skipped":i++;break}return{total:this.nodes.size,completed:e,running:r,failed:n,pending:o,paused:s,skipped:i}}markRunning(e){let r=this.requireNode(e);if(r.status!=="pending")throw new Error(`Node "${e}" is ${r.status}, cannot start`);r.status="running",r.startedAt=Date.now()}markCompleted(e,r){let n=this.requireNode(e);if(n.status!=="running")throw new Error(`Node "${e}" is ${n.status}, cannot complete`);n.status="completed",n.output=r.output,n.completedAt=Date.now(),n.firedPorts=r.firedPorts??n.outPorts,this.propagateSkips()}markFailed(e,r){let n=this.requireNode(e);n.status="failed",n.error=r,n.completedAt=Date.now(),this.propagateSkips()}markPaused(e){let r=this.requireNode(e);r.status==="running"&&(r.status="paused")}resumePaused(e){let r=this.requireNode(e);r.status==="paused"&&(r.status="pending")}markSkipped(e){let r=this.requireNode(e);if(r.status!=="pending")throw new Error(`Node "${e}" is ${r.status}, cannot skip`);r.status="skipped",r.firedPorts=[],this.propagateSkips()}pauseAll(){for(let e of this.nodes.values())e.status==="running"&&(e.status="paused")}resumeAll(){for(let e of this.nodes.values())e.status==="paused"&&(e.status="pending")}decideLoop(e,r){let n=this.requireNode(e);if(n.kind!=="loop")throw new Error(`Node "${e}" is not a loop controller`);if(!n.maxIterations||n.maxIterations<=0)throw new Error(`Loop "${e}" requires maxIterations > 0`);let o=n.iteration??0;r&&o<n.maxIterations?(n.iteration=o+1,n.firedPorts=["loop"],this.resetLoopScope(e)):(n.firedPorts=["done"],r&&(n.error=`loop_cap_reached:${n.maxIterations}`)),this.propagateSkips()}addNode(e){if(this.nodes.has(e.id))throw new Error(`Node "${e.id}" already exists`);for(let r of e.dependsOn??[])if(!this.nodes.has(r))throw new Error(`Node "${e.id}" depends on unknown node "${r}"`);this.nodes.set(e.id,{id:e.id,kind:e.kind??"agent",params:e.params??{},status:"pending",outPorts:e.outPorts??["default"],joinPolicy:e.joinPolicy??"all",runIndex:0,maxIterations:e.maxIterations});for(let r of e.dependsOn??[])this.edges.push({from:r,to:e.id,fromPort:"default"});try{this.validateDag()}catch(r){throw this.nodes.delete(e.id),this.edges=this.edges.filter(n=>n.to!==e.id||!e.dependsOn?.includes(n.from)),r}}addNodes(e){let r=[],n=[];try{for(let o of e){if(this.nodes.has(o.id))throw new Error(`Node "${o.id}" already exists`);for(let i of o.dependsOn??[])if(!this.nodes.has(i))throw new Error(`Unknown dep "${i}" for "${o.id}"`);this.nodes.set(o.id,{id:o.id,kind:o.kind??"agent",params:o.params??{},status:"pending",outPorts:o.outPorts??["default"],joinPolicy:o.joinPolicy??"all",runIndex:0,maxIterations:o.maxIterations}),r.push(o.id);let s=(o.dependsOn??[]).map(i=>({from:i,to:o.id,fromPort:"default"}));this.edges.push(...s),n.push(...s)}this.validateDag()}catch(o){for(let s of r)this.nodes.delete(s);throw this.edges=this.edges.filter(s=>!n.includes(s)),o}}removeNode(e){let r=this.requireNode(e);if(r.status==="running")throw new Error(`Cannot remove running node "${e}"`);if(r.status==="completed")throw new Error(`Cannot remove completed node "${e}"`);this.edges=this.edges.filter(n=>n.from!==e&&n.to!==e),this.nodes.delete(e)}retryNode(e,r){let n=this.requireNode(e);if(n.status!=="failed")throw new Error(`Node "${e}" is ${n.status}, only failed nodes can be retried`);n.status="pending",n.error=void 0,n.output=void 0,n.firedPorts=void 0,n.startedAt=void 0,n.completedAt=void 0,r&&Object.assign(n.params,r)}updateNodeParams(e,r){let n=this.requireNode(e);if(n.status!=="pending")throw new Error(`Node "${e}" is ${n.status}, can only update pending nodes`);Object.assign(n.params,r)}addEdge(e){let{from:r,to:n,fromPort:o="default",loopBack:s=!1}=e;if(!this.nodes.has(r))throw new Error(`Unknown source node "${r}"`);if(!this.nodes.has(n))throw new Error(`Unknown target node "${n}"`);let i=this.nodes.get(r);if(!s&&!i.outPorts.includes(o))throw new Error(`Node "${r}" has no outPort "${o}"`);if(!this.edges.find(c=>c.from===r&&c.to===n&&(c.fromPort??"default")===o))if(this.edges.push({from:r,to:n,fromPort:o,loopBack:s}),s){let c=this.nodes.get(n);if(!c.maxIterations||c.maxIterations<=0)throw this.edges.pop(),new Error(`LoopBack controller "${n}" requires maxIterations > 0`)}else try{this.validateDag()}catch(c){throw this.edges=this.edges.filter(l=>!(l.from===r&&l.to===n&&(l.fromPort??"default")===o)),c}}removeEdge(e,r,n){let o=n??"default";this.edges=this.edges.filter(s=>!(s.from===e&&s.to===r&&(s.fromPort??"default")===o))}serialize(){return[...this.nodes.values()].map(e=>{let r=this.incomingForwardEdges(e.id).map(n=>n.from);return{id:e.id,kind:e.kind,params:e.params,dependsOn:r,outPorts:e.outPorts,joinPolicy:e.joinPolicy,status:e.status,firedPorts:e.firedPorts,output:e.output,error:e.error,startedAt:e.startedAt,completedAt:e.completedAt,runIndex:e.runIndex,maxIterations:e.maxIterations,iteration:e.iteration}})}restore(e){for(let r of e){let n=this.nodes.get(r.id);n&&(n.status=r.status==="running"?"pending":r.status,n.output=r.output,n.error=r.error,n.firedPorts=r.firedPorts,n.startedAt=r.startedAt,n.completedAt=r.completedAt,n.runIndex=r.runIndex??0,n.iteration=r.iteration)}}edgeSatisfied(e){let r=this.nodes.get(e.from);if(!r||r.status!=="completed")return!1;let n=e.fromPort??"default";return(r.firedPorts??r.outPorts).includes(n)}edgeDead(e){let r=this.nodes.get(e.from);if(!r)return!1;if(r.status==="skipped")return!0;if(r.status==="completed"){if(r.kind==="loop"&&!(r.firedPorts??[]).includes("done"))return!1;let n=e.fromPort??"default";return!(r.firedPorts??r.outPorts).includes(n)}return!1}incomingForwardEdges(e){return this.edges.filter(r=>r.to===e&&!r.loopBack)}isBlockedByFailed(e){return this.incomingForwardEdges(e).some(r=>this.nodes.get(r.from)?.status==="failed")}isSkippable(e){let r=this.incomingForwardEdges(e);return r.length===0?!1:this.nodes.get(e).joinPolicy==="any"?r.every(o=>this.edgeDead(o)):r.some(o=>this.edgeDead(o))}propagateSkips(){let e=!0;for(;e;){e=!1;for(let r of this.nodes.values())r.status==="pending"&&this.isSkippable(r.id)&&(r.status="skipped",r.firedPorts=[],e=!0)}}resetLoopScope(e){let r=this.loopBodyNodes(e);for(let n of r){let o=this.nodes.get(n);o.status="pending",o.runIndex=(o.runIndex??0)+1,o.output=void 0,o.firedPorts=void 0,o.error=void 0,o.startedAt=void 0,o.completedAt=void 0}}loopBodyNodes(e){let r=new Set,n=(o,s)=>{for(let i of this.edges)i.from!==o||i.loopBack||s&&(i.fromPort??"default")!=="loop"||i.to!==e&&(r.has(i.to)||(r.add(i.to),n(i.to,!1)))};return n(e,!0),r}validateDag(){for(let s of this.edges){if(!this.nodes.has(s.from))throw new Error(`Edge references unknown source "${s.from}"`);if(!this.nodes.has(s.to))throw new Error(`Edge references unknown target "${s.to}"`)}let e=this.edges.filter(s=>!s.loopBack),r=new Set,n=new Set,o=s=>{if(n.has(s))throw new Error(`Cycle detected involving node "${s}"`);if(!r.has(s)){n.add(s);for(let i of e)i.from===s&&o(i.to);n.delete(s),r.add(s)}};for(let s of this.nodes.keys())o(s);for(let s of this.edges){if(!s.loopBack)continue;let i=this.nodes.get(s.to);if(!i?.maxIterations||i.maxIterations<=0)throw new Error(`LoopBack controller "${s.to}" must have maxIterations > 0`)}for(let s of this.nodes.values())if(s.maxIterations!==void 0&&s.maxIterations>1e3)throw new Error(`Loop "${s.id}" maxIterations ${s.maxIterations} exceeds the hard cap of 1000`)}requireNode(e){let r=this.nodes.get(e);if(!r)throw new Error(`Unknown node: "${e}"`);return r}};function mn(t,e){return e?{json:t,binary:e}:{json:t}}function qv(t){let e={};for(let r of Object.keys(t).sort())e[r]=t[r].map(n=>({json:n.json,binary:n.binary?Object.fromEntries(Object.keys(n.binary).sort().map(o=>[o,n.binary[o].ref])):void 0}));return Kd(e)}function Kd(t){return JSON.stringify(zd(t))}function zd(t){if(Array.isArray(t))return t.map(zd);if(t&&typeof t=="object"){let e={};for(let r of Object.keys(t).sort())e[r]=zd(t[r]);return e}return t}var zv=new Set(["__proto__","prototype","constructor"]);function Wv(t,e){let r=bL(t),n=new Yd(r,t),o=n.parseExpression();return n.expectEnd(),gn(o,e)}function Qd(t,e){let r=t.match(/^\s*\{\{([\s\S]*)\}\}\s*$/);return r?Wv(r[1],e):t.includes("{{")?t.replace(/\{\{([\s\S]*?)\}\}/g,(n,o)=>{let s=Wv(o,e);if(s==null)throw new Error(`Expression "{{${o.trim()}}}" resolved to ${s} in string interpolation`);return typeof s=="object"?JSON.stringify(s):String(s)}):t}function Kv(t,e){return Xd(t,e)}function Xd(t,e){if(typeof t=="string")return Qd(t,e);if(Array.isArray(t))return t.map(r=>Xd(r,e));if(t&&typeof t=="object"){let r={};for(let[n,o]of Object.entries(t))r[n]=Xd(o,e);return r}return t}function bL(t){let e=[],r=0,n=s=>/[A-Za-z_]/.test(s),o=s=>/[A-Za-z0-9_]/.test(s);for(;r<t.length;){let s=t[r];if(/\s/.test(s)){r++;continue}if(s==="$"){r++;let i="";for(;r<t.length&&o(t[r]);)i+=t[r++];if(!i)throw new Error('Bare "$" is not a valid expression');e.push({t:"dollar",v:i});continue}if(n(s)){let i="";for(;r<t.length&&o(t[r]);)i+=t[r++];e.push({t:"id",v:i});continue}if(/[0-9]/.test(s)||s==="-"&&/[0-9]/.test(t[r+1]??"")){let i=t[r++];for(;r<t.length&&/[0-9.]/.test(t[r]);)i+=t[r++];e.push({t:"num",v:i});continue}if(s==='"'||s==="'"){let i=s;r++;let a="";for(;r<t.length&&t[r]!==i;)t[r]==="\\"&&r+1<t.length?(a+=t[r+1],r+=2):a+=t[r++];if(t[r]!==i)throw new Error("Unterminated string literal in expression");r++,e.push({t:"str",v:a});continue}if(".[](),".includes(s)){e.push({t:"punc",v:s}),r++;continue}throw new Error(`Unexpected character "${s}" in expression`)}return e}var Yd=class{constructor(e,r){this.toks=e;this.src=r}toks;src;pos=0;parseExpression(){return this.parseAccessors(this.parseAtom())}peek(){return this.toks[this.pos]}next(){return this.toks[this.pos++]}expectEnd(){if(this.pos!==this.toks.length)throw new Error(`Unexpected trailing tokens in expression "${this.src.trim()}"`)}parseAtom(){let e=this.peek();if(!e)throw new Error("Empty expression");if(e.t==="dollar")return this.next(),{type:"root",name:e.v};if(e.t==="num")return this.next(),{type:"lit",value:Number(e.v)};if(e.t==="str")return this.next(),{type:"lit",value:e.v};if(e.t==="id"){if(e.v==="true")return this.next(),{type:"lit",value:!0};if(e.v==="false")return this.next(),{type:"lit",value:!1};if(e.v==="null")return this.next(),{type:"lit",value:null};if(this.next(),this.peek()?.t==="punc"&&this.peek().v==="("){let r=this.parseArgs();return{type:"func",name:e.v,args:r}}throw new Error(`Bare identifier "${e.v}" is not allowed (only whitelist function calls)`)}if(e.t==="punc"&&e.v==="("){this.next();let r=this.parseExpression();return this.expectPunc(")"),r}throw new Error(`Unexpected token "${e.v}" in expression`)}parseAccessors(e){let r=e;for(;;){let n=this.peek();if(!n||n.t!=="punc")break;if(n.v==="."){this.next();let o=this.next();if(!o||o.t!=="id"&&o.t!=="num")throw new Error('Expected property name after "."');r={type:"prop",target:r,key:o.v}}else if(n.v==="["){this.next();let o=this.next(),s;if(o.t==="num")s=Number(o.v);else if(o.t==="str")s=o.v;else throw new Error("Index must be a number or string literal");this.expectPunc("]"),r={type:"index",target:r,key:s}}else if(n.v==="("){let o=this.parseArgs();r={type:"call",target:r,args:o}}else break}return r}parseArgs(){this.expectPunc("(");let e=[];if(this.peek()?.t==="punc"&&this.peek().v===")")return this.next(),e;for(;;){e.push(this.parseExpression());let r=this.next();if(!r)throw new Error("Unterminated argument list");if(r.t==="punc"&&r.v===")")break;if(!(r.t==="punc"&&r.v===","))throw new Error('Expected "," or ")" in argument list')}return e}expectPunc(e){let r=this.next();if(!r||r.t!=="punc"||r.v!==e)throw new Error(`Expected "${e}" in expression`)}},Vv=Symbol("nodeAccessor");function gn(t,e){switch(t.type){case"lit":return t.value;case"root":return kL(t.name,e);case"func":return RL(t.name,t.args.map(r=>gn(r,e)));case"prop":return Gv(gn(t.target,e),t.key);case"index":return Gv(gn(t.target,e),t.key);case"call":{if(gn(t.target,e)===Vv){let n=t.args.map(s=>gn(s,e));if(n.length!==1||typeof n[0]!="string")throw new Error("$node(...) takes exactly one string argument");let o=e.nodes?.[n[0]];if(!o)throw new Error(`$node("${n[0]}") not found (not completed or unknown)`);return o}throw new Error("Only $node(...) is callable in this position")}}}function kL(t,e){switch(t){case"input":return e.input??{};case"json":return e.json??{};case"vars":return e.vars??{};case"trigger":return e.trigger??{};case"now":return(e.now?e.now():new Date).toISOString();case"node":return Vv;default:throw new Error(`Unknown context root "$${t}" (allowed: $input $json $node $now $vars $trigger)`)}}function Gv(t,e){if(typeof e=="string"&&zv.has(e))throw new Error(`Access to "${e}" is forbidden`);if(t==null)throw new Error(`Cannot read "${e}" of ${t}`);if(typeof e=="number"){if(!Array.isArray(t))throw new Error(`Cannot index non-array with [${e}]`);return t[e]}return t[e]}function RL(t,e){switch(t){case"len":{let r=e[0];if(typeof r=="string"||Array.isArray(r))return r.length;if(r&&typeof r=="object")return Object.keys(r).length;throw new Error(`len() expects string/array/object, got ${typeof r}`)}case"upper":return String(di(e,0,"upper")).toUpperCase();case"lower":return String(di(e,0,"lower")).toLowerCase();case"default":return e[0]===null||e[0]===void 0?e[1]:e[0];case"jsonpath":return TL(e[0],String(di(e,1,"jsonpath")));case"date":return wL(e);case"eq":return Jd(e[0],e[1]);case"ne":return!Jd(e[0],e[1]);case"gt":return li(e[0],e[1])>0;case"gte":return li(e[0],e[1])>=0;case"lt":return li(e[0],e[1])<0;case"lte":return li(e[0],e[1])<=0;case"not":return!Vd(di(e,0,"not"));case"and":return e.every(Vd);case"or":return e.some(Vd);case"contains":return SL(e[0],e[1]);default:throw new Error(`Unknown function "${t}()" (whitelist: len upper lower default jsonpath date eq ne gt gte lt lte not and or contains)`)}}function Vd(t){return!!t}function Jd(t,e){return t===e?!0:typeof t!=typeof e?!1:t&&e&&typeof t=="object"?JSON.stringify(t)===JSON.stringify(e):!1}function li(t,e){if(typeof t=="number"&&typeof e=="number")return t-e;if(typeof t=="string"&&typeof e=="string")return t<e?-1:t>e?1:0;throw new Error(`Cannot compare ${typeof t} with ${typeof e}`)}function SL(t,e){if(typeof t=="string")return t.includes(String(e));if(Array.isArray(t))return t.some(r=>Jd(r,e));throw new Error("contains() expects string/array as first argument")}function di(t,e,r){if(t.length<=e||t[e]===void 0)throw new Error(`${r}() missing required argument #${e+1}`);return t[e]}function TL(t,e){let r=e.match(/[^.[\]]+/g)??[],n=t;for(let o of r){if(zv.has(o))throw new Error(`jsonpath segment "${o}" is forbidden`);if(n==null)return;let s=/^\d+$/.test(o)?Number(o):o;n=n[s]}return n}function wL(t){let e=t.length===0?new Date:new Date(t[0]);if(Number.isNaN(e.getTime()))throw new Error(`date() received an invalid date: ${String(t[0])}`);if(t.length<2)return e.toISOString();let r=String(t[1]),n=o=>String(o).padStart(2,"0");return r.replace(/YYYY/g,String(e.getUTCFullYear())).replace(/MM/g,n(e.getUTCMonth()+1)).replace(/DD/g,n(e.getUTCDate())).replace(/HH/g,n(e.getUTCHours())).replace(/mm/g,n(e.getUTCMinutes())).replace(/ss/g,n(e.getUTCSeconds()))}var AL=(t,e)=>({outputs:{default:[{json:e.json&&typeof e.json=="object"&&!Array.isArray(e.json)?e.json:{value:e.json??e.value??null}}]}}),PL=t=>({outputs:{default:t.default??[]}}),xL=t=>{let e=[];for(let r of Object.keys(t))e.push(...t[r]);return{outputs:{default:e}}},CL=(t,e)=>{let n=!!e.condition?"true":"false",o=t.default??[],s={true:[],false:[]};return s[n]=o,{outputs:s,firedPorts:[n]}},IL=(t,e,r)=>({outputs:{default:[{json:r.trigger??(e.payload&&typeof e.payload=="object"&&!Array.isArray(e.payload)?e.payload:{})}]}}),Xv={set:AL,passthrough:PL,merge:xL,if:CL,trigger:IL};var fn=class{executors=new Map;constructor(e=!0){if(e)for(let[r,n]of Object.entries(Xv))this.executors.set(r,n)}register(e,r){if(this.executors.has(e))throw new Error(`NodeExecutor for kind "${e}" already registered`);this.executors.set(e,r)}override(e,r){if(!this.executors.has(e))throw new Error(`Cannot override unregistered kind "${e}"`);this.executors.set(e,r)}has(e){return this.executors.has(e)}get(e){let r=this.executors.get(e);if(!r)throw new Error(`No NodeExecutor registered for kind "${e}"`);return r}kinds(){return[...this.executors.keys()]}};function go(t,e){if(!t)throw new Error(`Node kind "${e}" requires a host (ExecutorHost) but none was injected. Provide one via WorkflowRuntimeOptions.host.`);return t}function hn(t,e,r){let n=t[e];if(typeof n!="string"||n.length===0)throw new Error(`Node kind "${r}" requires string param "${e}"`);return n}function Yv(t,e){let r=t[e];if(r==null)return{};if(typeof r!="object"||Array.isArray(r))throw new Error(`Param "${e}" must be an object`);return r}var EL=async(t,e,r)=>({outputs:{default:await go(r.host,"agent").runAgent({agentId:typeof e.agentId=="string"?e.agentId:void 0,prompt:hn(e,"prompt","agent"),input:t.default??[],signal:r.signal})}}),ML=async(t,e,r)=>({outputs:{default:await go(r.host,"tool").invokeTool({tool:hn(e,"tool","tool"),args:Yv(e,"args"),input:t.default??[],signal:r.signal})}}),_L=async(t,e,r)=>{let n=go(r.host,"http"),o=typeof e.method=="string"?e.method:"GET";return{outputs:{default:await n.httpRequest({method:o,url:hn(e,"url","http"),headers:e.headers,body:e.body,signal:r.signal})}}},DL=async(t,e,r)=>({outputs:{default:await go(r.host,"mcp").invokeMcp({server:hn(e,"server","mcp"),tool:hn(e,"tool","mcp"),args:Yv(e,"args"),signal:r.signal})}}),NL=async(t,e,r)=>({outputs:{default:await go(r.host,"channel").sendChannel({channel:hn(e,"channel","channel"),target:typeof e.target=="string"?e.target:void 0,payload:e.payload??t.default?.[0]?.json??{},input:t.default??[],signal:r.signal})}}),fo={agent:EL,tool:ML,http:_L,mcp:DL,channel:NL},R8=Object.keys(fo);var yn=class extends Error{constructor(r){super(r?`Workflow paused at "${r}"`:"Workflow paused");this.atNodeId=r;this.name="WorkflowPauseSignal"}atNodeId},ui=class{constructor(e,r={}){this.def=e;if(this.registry=r.registry??new fn,this.gate=r.gate,this.now=r.now??(()=>new Date),this.trigger=r.trigger,this.log=r.log,this.host=r.host,this.signal=r.signal,this.checkpoint=r.checkpoint,this.host)for(let[n,o]of Object.entries(fo))this.registry.has(n)||this.registry.register(n,o);for(let n of e.nodes)this.nodeDefs.set(n.id,n);for(let n of e.edges)n.loopBack&&this.loopBackOf.set(n.from,n.to)}def;registry;gate;now;trigger;log;host;signal;checkpoint;dag;nodeDefs=new Map;nodeOutputs=new Map;cache=new Map;loopBackOf=new Map;pauseRequested=!1;checkpointLoaded=!1;setNodeParams(e,r){let n=this.nodeDefs.get(e);if(!n)throw new Error(`Unknown node "${e}"`);n.params={...n.params??{},...r}}pause(){this.pauseRequested=!0}extendBudget(e){if(!this.gate?.extend)throw new Error("WorkflowRuntime has no extensible budget gate to raise");this.gate.extend(e)}async run(){await this.loadCheckpoint(),this.dag=this.buildDag(),this.nodeOutputs.clear(),this.pauseRequested=!1;let e=new Set,r;try{let s=0;for(;!this.dag.isFinished();){if(++s>1e5)throw new Error("WorkflowRuntime did not converge");let i=this.dag.getReadyNodes();if(i.length===0)break;for(let a of i)await this.executeNode(a,e)}}catch(s){if(s instanceof yn)r=s.atNodeId;else throw s}let n={};for(let[s,i]of this.nodeOutputs)n[s]=i;let o=r?"paused":this.dag.isAllCompleted()?"completed":"failed";return o==="completed"&&this.checkpoint&&await this.checkpoint.clear(),{status:o,outputs:n,executed:e,progress:this.dag.getProgress(),pausedAt:r}}async loadCheckpoint(){if(!this.checkpoint||this.checkpointLoaded)return;this.checkpointLoaded=!0;let e=await this.checkpoint.load();if(e)for(let r of e.entries)this.cache.set(r.key,r.result)}async persistCheckpoint(){if(!this.checkpoint)return;let e=[...this.cache.entries()].map(([r,n])=>({key:r,result:n}));await this.checkpoint.persist(e)}async executeNode(e,r){if(this.pauseRequested)throw new yn(e.id);if(e.kind==="loop"){this.enterLoop(e);return}let n=this.collectInputs(e.id),o=this.buildExprContext(n),s=this.nodeDefs.get(e.id)?.params??{},i=Kv(s,o),a=this.cacheKey(e.kind,i,n,e.runIndex),c=this.cache.get(a);if(c)this.dag.markRunning(e.id);else{this.gate?.check(e.id,e.kind),this.dag.markRunning(e.id);let d={nodeId:e.id,kind:e.kind,runIndex:e.runIndex,vars:this.def.vars??{},trigger:this.trigger,now:this.now,log:this.log,host:this.host,signal:this.signal};c=await this.registry.get(e.kind)(n,i,d),this.cache.set(a,c),r.add(e.id),await this.persistCheckpoint()}this.nodeOutputs.set(e.id,c.outputs),this.dag.markCompleted(e.id,{output:c.outputs,firedPorts:c.firedPorts});let l=this.loopBackOf.get(e.id);l&&this.decideLoopBack(l)}enterLoop(e){this.dag.markRunning(e.id);let r={loop:[{json:{iteration:e.iteration??0}}],done:[]};this.nodeOutputs.set(e.id,r),this.dag.markCompleted(e.id,{output:r,firedPorts:["loop"]})}decideLoopBack(e){let r=this.evalLoopCondition(e);this.dag.decideLoop(e,r);let n=this.dag.getNode(e),o=n.firedPorts??[];this.nodeOutputs.set(e,{loop:o.includes("loop")?[{json:{iteration:n.iteration??0}}]:[],done:o.includes("done")?[{json:{iteration:n.iteration??0}}]:[]})}evalLoopCondition(e){let n=this.nodeDefs.get(e)?.params?.condition;if(n==null||n==="")return!0;let o=this.buildExprContext({});return!!(typeof n=="string"?Qd(n,o):n)}collectInputs(e){let r={};for(let n of this.def.edges){if(n.to!==e||n.loopBack)continue;let o=n.fromPort??"default",s=n.toPort??"default",i=this.nodeOutputs.get(n.from);if(!i)continue;let a=i[o];a&&(r[s]??=[]).push(...a)}return r}buildExprContext(e){let r={};for(let[n,o]of this.nodeOutputs)r[n]={output:o};return{input:e,json:e.default?.[0]?.json??{},nodes:r,vars:this.def.vars??{},trigger:this.trigger,now:this.now}}cacheKey(e,r,n,o){return Kd([e,r,qv(n),o])}buildDag(){let e=this.def.nodes.map(n=>({id:n.id,kind:n.kind,params:n.params??{},outPorts:n.outPorts??LL(n.kind),joinPolicy:n.joinPolicy??"all",maxIterations:n.maxIterations})),r=new Qt(e);for(let n of this.def.edges)n.loopBack||r.addEdge({from:n.from,to:n.to,fromPort:n.fromPort??"default"});for(let n of this.def.edges)n.loopBack&&r.addEdge({from:n.from,to:n.to,loopBack:!0});return r}};function LL(t){return t==="if"?["true","false"]:t==="loop"?["loop","done"]:["default"]}var OL=new Set(["agent","tool","http","mcp","channel","im"]),Zd=class extends Error{constructor(r,n,o){super(`Permission denied: node "${r}" (kind "${n}") may not run under unattended trigger "${o}". Authorize it by adding "${n}" to allowUnattendedKinds.`);this.nodeId=r;this.kind=n;this.trigger=o;this.name="WorkflowPermissionDenied"}nodeId;kind;trigger},pi=class extends yn{constructor(r,n,o){super(r);this.reason=n;this.limit=o;this.name="WorkflowBudgetExceeded",this.message=`Budget exceeded (${n} limit ${o}) before node "${r}"`}reason;limit},mi=class{trigger;maxNodeExecutions;maxDurationMs;allow;now;executions=0;startedAt=-1;constructor(e){if(!Number.isInteger(e.maxNodeExecutions)||e.maxNodeExecutions<=0)throw new Error(`BudgetPermissionGate: maxNodeExecutions must be a positive integer, got ${e.maxNodeExecutions}`);if(e.maxDurationMs!==void 0&&!(e.maxDurationMs>0))throw new Error(`BudgetPermissionGate: maxDurationMs must be greater than 0 when provided, got ${e.maxDurationMs}`);this.trigger=e.trigger,this.maxNodeExecutions=e.maxNodeExecutions,this.maxDurationMs=e.maxDurationMs,this.allow=new Set(e.allowUnattendedKinds??[]),this.now=e.now??(()=>Date.now())}get unattended(){return this.trigger!=="manual"}check(e,r){if(this.unattended&&OL.has(r)&&!this.allow.has(r))throw new Zd(e,r,this.trigger);if(this.startedAt<0&&(this.startedAt=this.now()),this.maxDurationMs!==void 0&&this.now()-this.startedAt>=this.maxDurationMs)throw new pi(e,"duration",this.maxDurationMs);if(this.executions>=this.maxNodeExecutions)throw new pi(e,"executions",this.maxNodeExecutions);this.executions++}extend(e){if(e.executions!==void 0){if(!Number.isInteger(e.executions)||e.executions<=0)throw new Error(`BudgetPermissionGate.extend: executions delta must be a positive integer, got ${e.executions}`);this.maxNodeExecutions+=e.executions}if(e.durationMs!==void 0){if(!(e.durationMs>0))throw new Error(`BudgetPermissionGate.extend: durationMs delta must be greater than 0, got ${e.durationMs}`);if(this.maxDurationMs===void 0)throw new Error("BudgetPermissionGate.extend: cannot extend duration on a gate with no duration cap");this.maxDurationMs+=e.durationMs}}};function Zv(t){switch(t.type){case"manual":return[];case"schedule":return tu(t.cron);case"im-message":return UL(t.channel,t.match);case"webhook":return FL(t.path);default:return[`unknown trigger type: ${JSON.stringify(t)}`]}}var Jv=["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"],Qv=["SUN","MON","TUE","WED","THU","FRI","SAT"];function tu(t){if(typeof t!="string"||t.trim()==="")return["schedule.cron must be a non-empty string"];let e=t.trim().split(/\s+/);if(e.length!==5&&e.length!==6)return[`schedule.cron must have 5 or 6 fields, got ${e.length}: "${t}"`];let n=e.length===6?[{label:"second",min:0,max:59},{label:"minute",min:0,max:59},{label:"hour",min:0,max:23},{label:"day-of-month",min:1,max:31},{label:"month",min:1,max:12,names:Jv},{label:"day-of-week",min:0,max:7,names:Qv}]:[{label:"minute",min:0,max:59},{label:"hour",min:0,max:23},{label:"day-of-month",min:1,max:31},{label:"month",min:1,max:12,names:Jv},{label:"day-of-week",min:0,max:7,names:Qv}],o=[];for(let s=0;s<n.length;s++){let i=jL(e[s],n[s]);i&&o.push(`schedule.cron ${i}`)}return o}function jL(t,e){for(let r of t.split(",")){let n=$L(r,e);if(n)return n}}function $L(t,e){if(t==="")return`${e.label} has an empty list element`;let r=t,n,o=t.indexOf("/");if(o!==-1&&(r=t.slice(0,o),n=t.slice(o+1),!/^\d+$/.test(n)||Number(n)<=0))return`${e.label} has an invalid step "/${n}"`;if(r==="*")return;let s=r.indexOf("-");if(s!==-1){let a=eu(r.slice(0,s),e),c=eu(r.slice(s+1),e);return a===void 0||c===void 0?`${e.label} has an invalid range "${r}"`:a>c?`${e.label} range "${r}" is descending`:void 0}if(r===""&&n!==void 0)return`${e.label} step "${t}" needs a base ("*" or a range)`;if(eu(r,e)===void 0)return`${e.label} value "${r}" is out of range ${e.min}-${e.max}`}function eu(t,e){let r;if(/^\d+$/.test(t))r=Number(t);else if(e.names){let n=e.names.indexOf(t.toUpperCase());if(n===-1)return;r=e.label==="month"?n+1:n}else return;if(!(r<e.min||r>e.max))return r}function UL(t,e){let r=[];if((typeof t!="string"||t.trim()==="")&&r.push("im-message.channel must be a non-empty string"),e!==void 0)if(typeof e!="string")r.push("im-message.match must be a string regex");else try{new RegExp(e)}catch(n){r.push(`im-message.match is not a valid regex: ${n.message}`)}return r}function FL(t){return typeof t!="string"||t===""?["webhook.path must be a non-empty string"]:t.startsWith("/")?/\s/.test(t)?[`webhook.path must not contain whitespace: "${t}"`]:t.includes("..")?[`webhook.path must not contain "..": "${t}"`]:/^\/[A-Za-z0-9\-._~/]*$/.test(t)?[]:[`webhook.path contains illegal characters: "${t}"`]:[`webhook.path must start with "/": "${t}"`]}var ur=class extends Error{constructor(r){super(`Patch rejected: ${r.join("; ")}`);this.errors=r;this.name="PatchError"}errors};function eb(t,e){let r=[],n=qL(t),o=new Map(n.def.nodes.map(l=>[l.id,l])),s=e.scope?new Set(e.scope):void 0,i=new Set,a=l=>!s||s.has(l)||i.has(l),c=[];for(let[l,d]of e.patch.entries()){let p=`op[${l}] ${d.op}`;switch(d.op){case"add_node":{d.node?.id?o.has(d.node.id)?r.push(`${p}: node "${d.node.id}" already exists`):(n.def.nodes.push(d.node),o.set(d.node.id,d.node),s&&i.add(d.node.id)):r.push(`${p}: node.id is required`);break}case"remove_node":{o.has(d.nodeId)?a(d.nodeId)?(n.def.nodes=n.def.nodes.filter(u=>u.id!==d.nodeId),o.delete(d.nodeId),n.def.edges=n.def.edges.filter(u=>u.from!==d.nodeId&&u.to!==d.nodeId)):r.push(`${p}: node "${d.nodeId}" is outside the edit scope`):r.push(`${p}: node "${d.nodeId}" not found`);break}case"update_params":{let u=o.get(d.nodeId);u?a(d.nodeId)?u.params=HL(u.params,d.params):r.push(`${p}: node "${d.nodeId}" is outside the edit scope`):r.push(`${p}: node "${d.nodeId}" not found`);break}case"rename_node":{let u=o.get(d.nodeId);u?a(d.nodeId)?u.name=d.name:r.push(`${p}: node "${d.nodeId}" is outside the edit scope`):r.push(`${p}: node "${d.nodeId}" not found`);break}case"add_edge":{let u=d.edge;!u?.from||!u?.to?r.push(`${p}: edge.from and edge.to are required`):s&&!a(u.from)&&!a(u.to)?r.push(`${p}: edge ${u.from}\u2192${u.to} has no endpoint in the edit scope`):n.def.edges.push(u);break}case"remove_edge":{let{from:u,to:m,fromPort:f}=d.edge;if(s&&!a(u)&&!a(m))r.push(`${p}: edge ${u}\u2192${m} has no endpoint in the edit scope`);else{let g=n.def.edges.length;n.def.edges=n.def.edges.filter(h=>!(h.from===u&&h.to===m&&(h.fromPort??"default")===(f??"default"))),n.def.edges.length===g&&r.push(`${p}: edge ${u}\u2192${m} not found`)}break}case"set_trigger":{if(s)r.push(`${p}: trigger is workflow-global and cannot be changed in a scoped edit`);else if(d.trigger){let u=Zv(d.trigger);if(u.length>0)for(let m of u)r.push(`${p}: ${m}`);else n.meta.trigger=d.trigger}else n.meta.trigger=d.trigger;break}case"set_meta":{s?r.push(`${p}: meta is workflow-global and cannot be changed in a scoped edit`):(d.meta.name!==void 0&&(n.meta.name=d.meta.name),d.meta.active!==void 0&&(n.meta.active=d.meta.active));break}default:r.push(`${p}: unknown op`)}r.length===0&&c.push(d)}if(r.length>0)throw new ur(r);if(tb(n.def,r),r.length>0)throw new ur(r);return{target:n,applied:c}}function HL(t,e){let r={...t??{}};for(let[n,o]of Object.entries(e))o===null?delete r[n]:r[n]=o;return r}function ru(t){let e=[];return tb(t,e),e}function tb(t,e){try{let r=t.nodes.map(o=>({id:o.id,kind:o.kind,params:o.params??{},outPorts:o.outPorts??BL(o.kind),joinPolicy:o.joinPolicy??"all",maxIterations:o.maxIterations})),n=new Qt(r);for(let o of t.edges)o.loopBack||n.addEdge({from:o.from,to:o.to,fromPort:o.fromPort??"default"});for(let o of t.edges)o.loopBack&&n.addEdge({from:o.from,to:o.to,loopBack:!0})}catch(r){e.push(`graph invalid: ${r.message}`)}}function BL(t){return t==="if"?["true","false"]:t==="loop"?["loop","done"]:["default"]}function qL(t){return{def:{...t.def,nodes:t.def.nodes.map(e=>({...e,params:e.params?{...e.params}:void 0})),edges:t.def.edges.map(e=>({...e})),vars:t.def.vars?{...t.def.vars}:void 0},meta:{...t.meta}}}function rb(t,e={}){let r=e.maxNodes??50,n=e.maxValueLen??60,o=`Workflow ${JSON.stringify(t.name)} (rev ${t.rev}, trigger: ${WL(t.trigger)}, ${t.active?"active":"inactive"})`,s=t.def.nodes,a=s.slice(0,r).map(p=>" "+GL(p,n)),c=s.length===0?"nodes: (none)":["nodes:",...a].join(`
355
+ `))}async function Mv(t,e,r){let n=Ae.getTransport(t);if(!n)return{ok:!1,error:"transport not available"};let o=lr(Or,t);if(!o)return{ok:!1,error:"no API key"};try{let s={...r,model:e},i=await n.generate(s,o);i.billingUnit||(r.mediaType==="tts"&&r.text?(i.billingUnit="per_character",i.billingQuantity=r.text.length):(r.mediaType==="video"||r.mediaType==="music")&&r.duration?(i.billingUnit="per_second",i.billingQuantity=r.duration):(i.billingUnit="per_call",i.billingQuantity=1));let a=i.model??s.model,c=i.billingUnit??"per_call",l=i.billingQuantity??1;return _v?.(a,c,l),{ok:!0,result:i}}catch(s){return{ok:!1,error:s instanceof Error?s.message:String(s)}}}function Mt(t){if(!Ae)return!1;let e=dr[t];if(!e)return!1;let r=Ae.getTransport(e.provider),n=lr(Or,e.provider);return!!(r&&n)}function ii(t,e){if(!Mt(t))return!1;let r=dr[t],n=Ae.resolveModelById(r.provider,r.model,t);if(!n)return!1;let o=n.modelInfo.mediaCapabilities;return!o||!("operations"in o)||!o.operations?!0:o.operations.includes(e)}async function Ov(t){let e=dr.music;if(!e||!Ae)return"";let r=Ae.getTransport(e.provider);if(!kv(r))return"";let n=lr(Or,e.provider);return n?r.generateLyrics(t,n):""}async function jv(t){let e=t.provider??"doubao";if(!Ae)return{ok:!1,message:"Media client not configured."};let r=Ae.getTransport(e);if(!r)return{ok:!1,message:`No transport for provider: ${e}`};let n=lr(Or,e);if(!n)return{ok:!1,message:`No API key for provider: ${e}`};try{return"deleteVideoTask"in r&&typeof r.deleteVideoTask=="function"?(await r.deleteVideoTask(t.taskId,n),{ok:!0,message:"Task cancelled."}):{ok:!1,message:`Provider ${e} does not support task cancellation.`}}catch(o){return{ok:!1,message:o instanceof Error?o.message:String(o)}}}import*as pn from"node:fs";import*as ci from"node:path";function yL(t={}){let e=t.createGeminiFileApi??Sv,r=t.isVolcengineFileTransport??Rv,n=a=>{if(a.mediaClient)for(let[,c]of Object.entries(a.mediaProviders)){if(!c)continue;let l=a.mediaClient.getTransport(c.provider),d=lr(a.mediaApiKeys,c.provider);if(r(l)&&d)return{id:c.provider,type:"volcengine"}}if(a.mediaApiKeys.google)return{id:"google",type:"gemini"}},o=a=>{let c=n(a);if(!c)throw new Error("No file API provider available. Configure a media provider with Files API support (e.g. Volcengine, Google).");return c},s=(a,c)=>{let l=a.mediaClient?.getTransport(c);if(!r(l))throw new Error(`File API only supported via Volcengine or Google provider. Current: ${c}`);return l},i=(a,c)=>{let l=lr(a.mediaApiKeys,c);if(!l)throw new Error(`No API key for file API provider: ${c}`);return l};return{resolveProvider:n,uploadFile:async(a,c)=>{let l=o(a);if(l.type==="gemini"){let f=e(),g=a.mediaApiKeys.google,h=await f.uploadFile(c.buffer,g,{mimeType:c.mimeType,displayName:c.filename}),b=h.state==="PROCESSING"?await f.waitForProcessing(h.name,g):h;return{fileId:b.name,url:b.uri,filename:c.filename,bytes:c.bytes,provider:"google"}}let d=s(a,l.id),p=i(a,l.id),u=await d.uploadFile(new Blob([c.buffer]),p,{purpose:c.purpose??"media_reference",filename:c.filename}),m;try{let f=await d.getFile(u.id,p);typeof f.url=="string"&&f.url&&(m=f.url)}catch{}return{fileId:u.id,url:m,filename:c.filename,bytes:c.bytes,provider:l.id}},queryFile:async(a,c)=>{let l=o(a);if(l.type==="gemini"){let u=await e().getFile(c,a.mediaApiKeys.google);return $v(u)}let p=await s(a,l.id).getFile(c,i(a,l.id));return Uv(p,c)},listFiles:async(a,c)=>{let l=o(a);return l.type==="gemini"?(await e().listFiles(a.mediaApiKeys.google,{pageSize:c})).files.map($v):((await s(a,l.id).listFiles(i(a,l.id),{limit:c})).data??[]).map(u=>Uv(u))},deleteFile:async(a,c)=>{let l=o(a);if(l.type==="gemini"){await e().deleteFile(c,a.mediaApiKeys.google);return}await s(a,l.id).deleteFile(c,i(a,l.id))}}}var Gd=yL();function $v(t){return{id:t.name,filename:t.displayName??"",bytes:Number(t.sizeBytes??0),status:t.state?.toLowerCase()??"unknown",createdAt:t.createTime,url:t.uri}}function Uv(t,e=""){return{id:String(t.id??e),filename:String(t.filename??""),bytes:Number(t.bytes??0),status:String(t.status??"unknown"),createdAt:t.created_at?String(t.created_at):void 0,url:t.url?String(t.url):void 0}}function Fv(t){let e=t.maxUploadBytes??104857600,r=t.mediaFileApiService??Gd;return{isAvailable:()=>Hv(t.getContext(),r),uploadFile:async n=>{ai(t.getContext(),r,"upload");let o=t.resolvePath(n.filePath);if(!pn.existsSync(o))throw new Error(`File not found: ${o}`);let s=pn.statSync(o);if(s.size>e)throw new Error(`File too large (${(s.size/1024/1024).toFixed(1)} MB). Max: ${(e/1024/1024).toFixed(0)} MB.`);let i=await pn.promises.readFile(o),a=ci.basename(o),c=ci.extname(o).toLowerCase();return r.uploadFile(t.getContext(),{buffer:Buffer.from(i),filename:a,bytes:s.size,mimeType:vL[c]??"application/octet-stream",purpose:n.purpose??"media_reference"})},queryFile:async n=>(ai(t.getContext(),r,"query"),r.queryFile(t.getContext(),n.fileId)),listFiles:async n=>(ai(t.getContext(),r,"list"),r.listFiles(t.getContext(),n.limit??10)),deleteFile:async n=>{ai(t.getContext(),r,"delete"),await r.deleteFile(t.getContext(),n.fileId)}}}function Hv(t,e=Gd){return!!e.resolveProvider(t)}function ai(t,e,r){if(!Hv(t,e))throw new Error(`No file ${r} provider available. Configure a media provider with Files API support (e.g. Volcengine, Google).`)}var vL={".pdf":"application/pdf",".txt":"text/plain",".html":"text/html",".htm":"text/html",".css":"text/css",".js":"text/javascript",".ts":"text/plain",".json":"application/json",".xml":"application/xml",".csv":"text/csv",".md":"text/markdown",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".bmp":"image/bmp",".svg":"image/svg+xml",".mp3":"audio/mpeg",".wav":"audio/wav",".ogg":"audio/ogg",".flac":"audio/flac",".m4a":"audio/mp4",".aac":"audio/aac",".mp4":"video/mp4",".webm":"video/webm",".avi":"video/x-msvideo",".mov":"video/quicktime",".doc":"application/msword",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document",".xls":"application/vnd.ms-excel",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation"};function Bv(t,e){return!t?.webSearch||!t.capabilities.includes("web_search")?e:async(r,n)=>{try{let s=await t.webSearch(r,{maxResults:n?.maxResults});if(n?.allowedDomains?.length){let i=new Set(n.allowedDomains.map(a=>a.toLowerCase()));s=s.filter(a=>{try{return i.has(new URL(a.url).hostname.toLowerCase())}catch{return!1}})}if(n?.blockedDomains?.length){let i=new Set(n.blockedDomains.map(a=>a.toLowerCase()));s=s.filter(a=>{try{return!i.has(new URL(a.url).hostname.toLowerCase())}catch{return!0}})}if(s.length>0)return{query:r,results:s.map(i=>({title:i.title,url:i.url,snippet:i.snippet}))}}catch{}return e(r,n)}}var Qt=class{nodes=new Map;edges=[];constructor(e){for(let r of e){if(this.nodes.has(r.id))throw new Error(`Duplicate node ID: ${r.id}`);this.nodes.set(r.id,{id:r.id,kind:r.kind??"agent",params:r.params??{},status:"pending",outPorts:r.outPorts??["default"],joinPolicy:r.joinPolicy??"all",runIndex:0,maxIterations:r.maxIterations})}for(let r of e)for(let n of r.dependsOn??[]){if(!this.nodes.has(n))throw new Error(`Node "${r.id}" depends on unknown node "${n}"`);this.edges.push({from:n,to:r.id,fromPort:"default"})}this.validateDag()}getNode(e){return this.nodes.get(e)}getAllNodes(){return[...this.nodes.values()]}getReadyNodes(){let e=[];for(let r of this.nodes.values()){if(r.status!=="pending"||this.isBlockedByFailed(r.id))continue;let n=this.incomingForwardEdges(r.id);if(n.length===0){e.push(r);continue}r.joinPolicy==="any"?n.some(o=>this.edgeSatisfied(o))&&e.push(r):n.every(o=>this.edgeSatisfied(o))&&e.push(r)}return e}isFinished(){for(let e of this.nodes.values())if(e.status==="running"||e.status==="paused"||e.status==="pending"&&!this.isBlockedByFailed(e.id)&&!this.isSkippable(e.id))return!1;return!0}isAllCompleted(){return[...this.nodes.values()].every(e=>e.status==="completed"||e.status==="skipped")}getBlockedNodes(){return[...this.nodes.values()].filter(e=>e.status==="pending"&&this.isBlockedByFailed(e.id))}getProgress(){let e=0,r=0,n=0,o=0,s=0,i=0;for(let a of this.nodes.values())switch(a.status){case"completed":e++;break;case"running":r++;break;case"failed":n++;break;case"pending":o++;break;case"paused":s++;break;case"skipped":i++;break}return{total:this.nodes.size,completed:e,running:r,failed:n,pending:o,paused:s,skipped:i}}markRunning(e){let r=this.requireNode(e);if(r.status!=="pending")throw new Error(`Node "${e}" is ${r.status}, cannot start`);r.status="running",r.startedAt=Date.now()}markCompleted(e,r){let n=this.requireNode(e);if(n.status!=="running")throw new Error(`Node "${e}" is ${n.status}, cannot complete`);n.status="completed",n.output=r.output,n.completedAt=Date.now(),n.firedPorts=r.firedPorts??n.outPorts,this.propagateSkips()}markFailed(e,r){let n=this.requireNode(e);n.status="failed",n.error=r,n.completedAt=Date.now(),this.propagateSkips()}markPaused(e){let r=this.requireNode(e);r.status==="running"&&(r.status="paused")}resumePaused(e){let r=this.requireNode(e);r.status==="paused"&&(r.status="pending")}markSkipped(e){let r=this.requireNode(e);if(r.status!=="pending")throw new Error(`Node "${e}" is ${r.status}, cannot skip`);r.status="skipped",r.firedPorts=[],this.propagateSkips()}pauseAll(){for(let e of this.nodes.values())e.status==="running"&&(e.status="paused")}resumeAll(){for(let e of this.nodes.values())e.status==="paused"&&(e.status="pending")}decideLoop(e,r){let n=this.requireNode(e);if(n.kind!=="loop")throw new Error(`Node "${e}" is not a loop controller`);if(!n.maxIterations||n.maxIterations<=0)throw new Error(`Loop "${e}" requires maxIterations > 0`);let o=n.iteration??0;r&&o<n.maxIterations?(n.iteration=o+1,n.firedPorts=["loop"],this.resetLoopScope(e)):(n.firedPorts=["done"],r&&(n.error=`loop_cap_reached:${n.maxIterations}`)),this.propagateSkips()}addNode(e){if(this.nodes.has(e.id))throw new Error(`Node "${e.id}" already exists`);for(let r of e.dependsOn??[])if(!this.nodes.has(r))throw new Error(`Node "${e.id}" depends on unknown node "${r}"`);this.nodes.set(e.id,{id:e.id,kind:e.kind??"agent",params:e.params??{},status:"pending",outPorts:e.outPorts??["default"],joinPolicy:e.joinPolicy??"all",runIndex:0,maxIterations:e.maxIterations});for(let r of e.dependsOn??[])this.edges.push({from:r,to:e.id,fromPort:"default"});try{this.validateDag()}catch(r){throw this.nodes.delete(e.id),this.edges=this.edges.filter(n=>n.to!==e.id||!e.dependsOn?.includes(n.from)),r}}addNodes(e){let r=[],n=[];try{for(let o of e){if(this.nodes.has(o.id))throw new Error(`Node "${o.id}" already exists`);for(let i of o.dependsOn??[])if(!this.nodes.has(i))throw new Error(`Unknown dep "${i}" for "${o.id}"`);this.nodes.set(o.id,{id:o.id,kind:o.kind??"agent",params:o.params??{},status:"pending",outPorts:o.outPorts??["default"],joinPolicy:o.joinPolicy??"all",runIndex:0,maxIterations:o.maxIterations}),r.push(o.id);let s=(o.dependsOn??[]).map(i=>({from:i,to:o.id,fromPort:"default"}));this.edges.push(...s),n.push(...s)}this.validateDag()}catch(o){for(let s of r)this.nodes.delete(s);throw this.edges=this.edges.filter(s=>!n.includes(s)),o}}removeNode(e){let r=this.requireNode(e);if(r.status==="running")throw new Error(`Cannot remove running node "${e}"`);if(r.status==="completed")throw new Error(`Cannot remove completed node "${e}"`);this.edges=this.edges.filter(n=>n.from!==e&&n.to!==e),this.nodes.delete(e)}retryNode(e,r){let n=this.requireNode(e);if(n.status!=="failed")throw new Error(`Node "${e}" is ${n.status}, only failed nodes can be retried`);n.status="pending",n.error=void 0,n.output=void 0,n.firedPorts=void 0,n.startedAt=void 0,n.completedAt=void 0,r&&Object.assign(n.params,r)}updateNodeParams(e,r){let n=this.requireNode(e);if(n.status!=="pending")throw new Error(`Node "${e}" is ${n.status}, can only update pending nodes`);Object.assign(n.params,r)}addEdge(e){let{from:r,to:n,fromPort:o="default",loopBack:s=!1}=e;if(!this.nodes.has(r))throw new Error(`Unknown source node "${r}"`);if(!this.nodes.has(n))throw new Error(`Unknown target node "${n}"`);let i=this.nodes.get(r);if(!s&&!i.outPorts.includes(o))throw new Error(`Node "${r}" has no outPort "${o}"`);if(!this.edges.find(c=>c.from===r&&c.to===n&&(c.fromPort??"default")===o))if(this.edges.push({from:r,to:n,fromPort:o,loopBack:s}),s){let c=this.nodes.get(n);if(!c.maxIterations||c.maxIterations<=0)throw this.edges.pop(),new Error(`LoopBack controller "${n}" requires maxIterations > 0`)}else try{this.validateDag()}catch(c){throw this.edges=this.edges.filter(l=>!(l.from===r&&l.to===n&&(l.fromPort??"default")===o)),c}}removeEdge(e,r,n){let o=n??"default";this.edges=this.edges.filter(s=>!(s.from===e&&s.to===r&&(s.fromPort??"default")===o))}serialize(){return[...this.nodes.values()].map(e=>{let r=this.incomingForwardEdges(e.id).map(n=>n.from);return{id:e.id,kind:e.kind,params:e.params,dependsOn:r,outPorts:e.outPorts,joinPolicy:e.joinPolicy,status:e.status,firedPorts:e.firedPorts,output:e.output,error:e.error,startedAt:e.startedAt,completedAt:e.completedAt,runIndex:e.runIndex,maxIterations:e.maxIterations,iteration:e.iteration}})}restore(e){for(let r of e){let n=this.nodes.get(r.id);n&&(n.status=r.status==="running"?"pending":r.status,n.output=r.output,n.error=r.error,n.firedPorts=r.firedPorts,n.startedAt=r.startedAt,n.completedAt=r.completedAt,n.runIndex=r.runIndex??0,n.iteration=r.iteration)}}edgeSatisfied(e){let r=this.nodes.get(e.from);if(!r||r.status!=="completed")return!1;let n=e.fromPort??"default";return(r.firedPorts??r.outPorts).includes(n)}edgeDead(e){let r=this.nodes.get(e.from);if(!r)return!1;if(r.status==="skipped")return!0;if(r.status==="completed"){if(r.kind==="loop"&&!(r.firedPorts??[]).includes("done"))return!1;let n=e.fromPort??"default";return!(r.firedPorts??r.outPorts).includes(n)}return!1}incomingForwardEdges(e){return this.edges.filter(r=>r.to===e&&!r.loopBack)}isBlockedByFailed(e){return this.incomingForwardEdges(e).some(r=>this.nodes.get(r.from)?.status==="failed")}isSkippable(e){let r=this.incomingForwardEdges(e);return r.length===0?!1:this.nodes.get(e).joinPolicy==="any"?r.every(o=>this.edgeDead(o)):r.some(o=>this.edgeDead(o))}propagateSkips(){let e=!0;for(;e;){e=!1;for(let r of this.nodes.values())r.status==="pending"&&this.isSkippable(r.id)&&(r.status="skipped",r.firedPorts=[],e=!0)}}resetLoopScope(e){let r=this.loopBodyNodes(e);for(let n of r){let o=this.nodes.get(n);o.status="pending",o.runIndex=(o.runIndex??0)+1,o.output=void 0,o.firedPorts=void 0,o.error=void 0,o.startedAt=void 0,o.completedAt=void 0}}loopBodyNodes(e){let r=new Set,n=(o,s)=>{for(let i of this.edges)i.from!==o||i.loopBack||s&&(i.fromPort??"default")!=="loop"||i.to!==e&&(r.has(i.to)||(r.add(i.to),n(i.to,!1)))};return n(e,!0),r}validateDag(){for(let s of this.edges){if(!this.nodes.has(s.from))throw new Error(`Edge references unknown source "${s.from}"`);if(!this.nodes.has(s.to))throw new Error(`Edge references unknown target "${s.to}"`)}let e=this.edges.filter(s=>!s.loopBack),r=new Set,n=new Set,o=s=>{if(n.has(s))throw new Error(`Cycle detected involving node "${s}"`);if(!r.has(s)){n.add(s);for(let i of e)i.from===s&&o(i.to);n.delete(s),r.add(s)}};for(let s of this.nodes.keys())o(s);for(let s of this.edges){if(!s.loopBack)continue;let i=this.nodes.get(s.to);if(!i?.maxIterations||i.maxIterations<=0)throw new Error(`LoopBack controller "${s.to}" must have maxIterations > 0`)}for(let s of this.nodes.values())if(s.maxIterations!==void 0&&s.maxIterations>1e3)throw new Error(`Loop "${s.id}" maxIterations ${s.maxIterations} exceeds the hard cap of 1000`)}requireNode(e){let r=this.nodes.get(e);if(!r)throw new Error(`Unknown node: "${e}"`);return r}};function mn(t,e){return e?{json:t,binary:e}:{json:t}}function qv(t){let e={};for(let r of Object.keys(t).sort())e[r]=t[r].map(n=>({json:n.json,binary:n.binary?Object.fromEntries(Object.keys(n.binary).sort().map(o=>[o,n.binary[o].ref])):void 0}));return Kd(e)}function Kd(t){return JSON.stringify(zd(t))}function zd(t){if(Array.isArray(t))return t.map(zd);if(t&&typeof t=="object"){let e={};for(let r of Object.keys(t).sort())e[r]=zd(t[r]);return e}return t}var zv=new Set(["__proto__","prototype","constructor"]);function Wv(t,e){let r=bL(t),n=new Yd(r,t),o=n.parseExpression();return n.expectEnd(),gn(o,e)}function Qd(t,e){let r=t.match(/^\s*\{\{([\s\S]*)\}\}\s*$/);return r?Wv(r[1],e):t.includes("{{")?t.replace(/\{\{([\s\S]*?)\}\}/g,(n,o)=>{let s=Wv(o,e);if(s==null)throw new Error(`Expression "{{${o.trim()}}}" resolved to ${s} in string interpolation`);return typeof s=="object"?JSON.stringify(s):String(s)}):t}function Kv(t,e){return Xd(t,e)}function Xd(t,e){if(typeof t=="string")return Qd(t,e);if(Array.isArray(t))return t.map(r=>Xd(r,e));if(t&&typeof t=="object"){let r={};for(let[n,o]of Object.entries(t))r[n]=Xd(o,e);return r}return t}function bL(t){let e=[],r=0,n=s=>/[A-Za-z_]/.test(s),o=s=>/[A-Za-z0-9_]/.test(s);for(;r<t.length;){let s=t[r];if(/\s/.test(s)){r++;continue}if(s==="$"){r++;let i="";for(;r<t.length&&o(t[r]);)i+=t[r++];if(!i)throw new Error('Bare "$" is not a valid expression');e.push({t:"dollar",v:i});continue}if(n(s)){let i="";for(;r<t.length&&o(t[r]);)i+=t[r++];e.push({t:"id",v:i});continue}if(/[0-9]/.test(s)||s==="-"&&/[0-9]/.test(t[r+1]??"")){let i=t[r++];for(;r<t.length&&/[0-9.]/.test(t[r]);)i+=t[r++];e.push({t:"num",v:i});continue}if(s==='"'||s==="'"){let i=s;r++;let a="";for(;r<t.length&&t[r]!==i;)t[r]==="\\"&&r+1<t.length?(a+=t[r+1],r+=2):a+=t[r++];if(t[r]!==i)throw new Error("Unterminated string literal in expression");r++,e.push({t:"str",v:a});continue}if(".[](),".includes(s)){e.push({t:"punc",v:s}),r++;continue}throw new Error(`Unexpected character "${s}" in expression`)}return e}var Yd=class{constructor(e,r){this.toks=e;this.src=r}toks;src;pos=0;parseExpression(){return this.parseAccessors(this.parseAtom())}peek(){return this.toks[this.pos]}next(){return this.toks[this.pos++]}expectEnd(){if(this.pos!==this.toks.length)throw new Error(`Unexpected trailing tokens in expression "${this.src.trim()}"`)}parseAtom(){let e=this.peek();if(!e)throw new Error("Empty expression");if(e.t==="dollar")return this.next(),{type:"root",name:e.v};if(e.t==="num")return this.next(),{type:"lit",value:Number(e.v)};if(e.t==="str")return this.next(),{type:"lit",value:e.v};if(e.t==="id"){if(e.v==="true")return this.next(),{type:"lit",value:!0};if(e.v==="false")return this.next(),{type:"lit",value:!1};if(e.v==="null")return this.next(),{type:"lit",value:null};if(this.next(),this.peek()?.t==="punc"&&this.peek().v==="("){let r=this.parseArgs();return{type:"func",name:e.v,args:r}}throw new Error(`Bare identifier "${e.v}" is not allowed (only whitelist function calls)`)}if(e.t==="punc"&&e.v==="("){this.next();let r=this.parseExpression();return this.expectPunc(")"),r}throw new Error(`Unexpected token "${e.v}" in expression`)}parseAccessors(e){let r=e;for(;;){let n=this.peek();if(!n||n.t!=="punc")break;if(n.v==="."){this.next();let o=this.next();if(!o||o.t!=="id"&&o.t!=="num")throw new Error('Expected property name after "."');r={type:"prop",target:r,key:o.v}}else if(n.v==="["){this.next();let o=this.next(),s;if(o.t==="num")s=Number(o.v);else if(o.t==="str")s=o.v;else throw new Error("Index must be a number or string literal");this.expectPunc("]"),r={type:"index",target:r,key:s}}else if(n.v==="("){let o=this.parseArgs();r={type:"call",target:r,args:o}}else break}return r}parseArgs(){this.expectPunc("(");let e=[];if(this.peek()?.t==="punc"&&this.peek().v===")")return this.next(),e;for(;;){e.push(this.parseExpression());let r=this.next();if(!r)throw new Error("Unterminated argument list");if(r.t==="punc"&&r.v===")")break;if(!(r.t==="punc"&&r.v===","))throw new Error('Expected "," or ")" in argument list')}return e}expectPunc(e){let r=this.next();if(!r||r.t!=="punc"||r.v!==e)throw new Error(`Expected "${e}" in expression`)}},Vv=Symbol("nodeAccessor");function gn(t,e){switch(t.type){case"lit":return t.value;case"root":return kL(t.name,e);case"func":return RL(t.name,t.args.map(r=>gn(r,e)));case"prop":return Gv(gn(t.target,e),t.key);case"index":return Gv(gn(t.target,e),t.key);case"call":{if(gn(t.target,e)===Vv){let n=t.args.map(s=>gn(s,e));if(n.length!==1||typeof n[0]!="string")throw new Error("$node(...) takes exactly one string argument");let o=e.nodes?.[n[0]];if(!o)throw new Error(`$node("${n[0]}") not found (not completed or unknown)`);return o}throw new Error("Only $node(...) is callable in this position")}}}function kL(t,e){switch(t){case"input":return e.input??{};case"json":return e.json??{};case"vars":return e.vars??{};case"trigger":return e.trigger??{};case"now":return(e.now?e.now():new Date).toISOString();case"node":return Vv;default:throw new Error(`Unknown context root "$${t}" (allowed: $input $json $node $now $vars $trigger)`)}}function Gv(t,e){if(typeof e=="string"&&zv.has(e))throw new Error(`Access to "${e}" is forbidden`);if(t==null)throw new Error(`Cannot read "${e}" of ${t}`);if(typeof e=="number"){if(!Array.isArray(t))throw new Error(`Cannot index non-array with [${e}]`);return t[e]}return t[e]}function RL(t,e){switch(t){case"len":{let r=e[0];if(typeof r=="string"||Array.isArray(r))return r.length;if(r&&typeof r=="object")return Object.keys(r).length;throw new Error(`len() expects string/array/object, got ${typeof r}`)}case"upper":return String(di(e,0,"upper")).toUpperCase();case"lower":return String(di(e,0,"lower")).toLowerCase();case"default":return e[0]===null||e[0]===void 0?e[1]:e[0];case"jsonpath":return TL(e[0],String(di(e,1,"jsonpath")));case"date":return wL(e);case"eq":return Jd(e[0],e[1]);case"ne":return!Jd(e[0],e[1]);case"gt":return li(e[0],e[1])>0;case"gte":return li(e[0],e[1])>=0;case"lt":return li(e[0],e[1])<0;case"lte":return li(e[0],e[1])<=0;case"not":return!Vd(di(e,0,"not"));case"and":return e.every(Vd);case"or":return e.some(Vd);case"contains":return SL(e[0],e[1]);default:throw new Error(`Unknown function "${t}()" (whitelist: len upper lower default jsonpath date eq ne gt gte lt lte not and or contains)`)}}function Vd(t){return!!t}function Jd(t,e){return t===e?!0:typeof t!=typeof e?!1:t&&e&&typeof t=="object"?JSON.stringify(t)===JSON.stringify(e):!1}function li(t,e){if(typeof t=="number"&&typeof e=="number")return t-e;if(typeof t=="string"&&typeof e=="string")return t<e?-1:t>e?1:0;throw new Error(`Cannot compare ${typeof t} with ${typeof e}`)}function SL(t,e){if(typeof t=="string")return t.includes(String(e));if(Array.isArray(t))return t.some(r=>Jd(r,e));throw new Error("contains() expects string/array as first argument")}function di(t,e,r){if(t.length<=e||t[e]===void 0)throw new Error(`${r}() missing required argument #${e+1}`);return t[e]}function TL(t,e){let r=e.match(/[^.[\]]+/g)??[],n=t;for(let o of r){if(zv.has(o))throw new Error(`jsonpath segment "${o}" is forbidden`);if(n==null)return;let s=/^\d+$/.test(o)?Number(o):o;n=n[s]}return n}function wL(t){let e=t.length===0?new Date:new Date(t[0]);if(Number.isNaN(e.getTime()))throw new Error(`date() received an invalid date: ${String(t[0])}`);if(t.length<2)return e.toISOString();let r=String(t[1]),n=o=>String(o).padStart(2,"0");return r.replace(/YYYY/g,String(e.getUTCFullYear())).replace(/MM/g,n(e.getUTCMonth()+1)).replace(/DD/g,n(e.getUTCDate())).replace(/HH/g,n(e.getUTCHours())).replace(/mm/g,n(e.getUTCMinutes())).replace(/ss/g,n(e.getUTCSeconds()))}var AL=(t,e)=>({outputs:{default:[{json:e.json&&typeof e.json=="object"&&!Array.isArray(e.json)?e.json:{value:e.json??e.value??null}}]}}),PL=t=>({outputs:{default:t.default??[]}}),xL=t=>{let e=[];for(let r of Object.keys(t))e.push(...t[r]);return{outputs:{default:e}}},CL=(t,e)=>{let n=!!e.condition?"true":"false",o=t.default??[],s={true:[],false:[]};return s[n]=o,{outputs:s,firedPorts:[n]}},IL=(t,e,r)=>({outputs:{default:[{json:r.trigger??(e.payload&&typeof e.payload=="object"&&!Array.isArray(e.payload)?e.payload:{})}]}}),Xv={set:AL,passthrough:PL,merge:xL,if:CL,trigger:IL};var fn=class{executors=new Map;constructor(e=!0){if(e)for(let[r,n]of Object.entries(Xv))this.executors.set(r,n)}register(e,r){if(this.executors.has(e))throw new Error(`NodeExecutor for kind "${e}" already registered`);this.executors.set(e,r)}override(e,r){if(!this.executors.has(e))throw new Error(`Cannot override unregistered kind "${e}"`);this.executors.set(e,r)}has(e){return this.executors.has(e)}get(e){let r=this.executors.get(e);if(!r)throw new Error(`No NodeExecutor registered for kind "${e}"`);return r}kinds(){return[...this.executors.keys()]}};function go(t,e){if(!t)throw new Error(`Node kind "${e}" requires a host (ExecutorHost) but none was injected. Provide one via WorkflowRuntimeOptions.host.`);return t}function hn(t,e,r){let n=t[e];if(typeof n!="string"||n.length===0)throw new Error(`Node kind "${r}" requires string param "${e}"`);return n}function Yv(t,e){let r=t[e];if(r==null)return{};if(typeof r!="object"||Array.isArray(r))throw new Error(`Param "${e}" must be an object`);return r}var EL=async(t,e,r)=>({outputs:{default:await go(r.host,"agent").runAgent({agentId:typeof e.agentId=="string"?e.agentId:void 0,prompt:hn(e,"prompt","agent"),input:t.default??[],signal:r.signal})}}),ML=async(t,e,r)=>({outputs:{default:await go(r.host,"tool").invokeTool({tool:hn(e,"tool","tool"),args:Yv(e,"args"),input:t.default??[],signal:r.signal})}}),_L=async(t,e,r)=>{let n=go(r.host,"http"),o=typeof e.method=="string"?e.method:"GET";return{outputs:{default:await n.httpRequest({method:o,url:hn(e,"url","http"),headers:e.headers,body:e.body,signal:r.signal})}}},DL=async(t,e,r)=>({outputs:{default:await go(r.host,"mcp").invokeMcp({server:hn(e,"server","mcp"),tool:hn(e,"tool","mcp"),args:Yv(e,"args"),signal:r.signal})}}),NL=async(t,e,r)=>({outputs:{default:await go(r.host,"channel").sendChannel({channel:hn(e,"channel","channel"),target:typeof e.target=="string"?e.target:void 0,payload:e.payload??t.default?.[0]?.json??{},input:t.default??[],signal:r.signal})}}),fo={agent:EL,tool:ML,http:_L,mcp:DL,channel:NL},S8=Object.keys(fo);var yn=class extends Error{constructor(r){super(r?`Workflow paused at "${r}"`:"Workflow paused");this.atNodeId=r;this.name="WorkflowPauseSignal"}atNodeId},ui=class{constructor(e,r={}){this.def=e;if(this.registry=r.registry??new fn,this.gate=r.gate,this.now=r.now??(()=>new Date),this.trigger=r.trigger,this.log=r.log,this.host=r.host,this.signal=r.signal,this.checkpoint=r.checkpoint,this.host)for(let[n,o]of Object.entries(fo))this.registry.has(n)||this.registry.register(n,o);for(let n of e.nodes)this.nodeDefs.set(n.id,n);for(let n of e.edges)n.loopBack&&this.loopBackOf.set(n.from,n.to)}def;registry;gate;now;trigger;log;host;signal;checkpoint;dag;nodeDefs=new Map;nodeOutputs=new Map;cache=new Map;loopBackOf=new Map;pauseRequested=!1;checkpointLoaded=!1;setNodeParams(e,r){let n=this.nodeDefs.get(e);if(!n)throw new Error(`Unknown node "${e}"`);n.params={...n.params??{},...r}}pause(){this.pauseRequested=!0}extendBudget(e){if(!this.gate?.extend)throw new Error("WorkflowRuntime has no extensible budget gate to raise");this.gate.extend(e)}async run(){await this.loadCheckpoint(),this.dag=this.buildDag(),this.nodeOutputs.clear(),this.pauseRequested=!1;let e=new Set,r;try{let s=0;for(;!this.dag.isFinished();){if(++s>1e5)throw new Error("WorkflowRuntime did not converge");let i=this.dag.getReadyNodes();if(i.length===0)break;for(let a of i)await this.executeNode(a,e)}}catch(s){if(s instanceof yn)r=s.atNodeId;else throw s}let n={};for(let[s,i]of this.nodeOutputs)n[s]=i;let o=r?"paused":this.dag.isAllCompleted()?"completed":"failed";return o==="completed"&&this.checkpoint&&await this.checkpoint.clear(),{status:o,outputs:n,executed:e,progress:this.dag.getProgress(),pausedAt:r}}async loadCheckpoint(){if(!this.checkpoint||this.checkpointLoaded)return;this.checkpointLoaded=!0;let e=await this.checkpoint.load();if(e)for(let r of e.entries)this.cache.set(r.key,r.result)}async persistCheckpoint(){if(!this.checkpoint)return;let e=[...this.cache.entries()].map(([r,n])=>({key:r,result:n}));await this.checkpoint.persist(e)}async executeNode(e,r){if(this.pauseRequested)throw new yn(e.id);if(e.kind==="loop"){this.enterLoop(e);return}let n=this.collectInputs(e.id),o=this.buildExprContext(n),s=this.nodeDefs.get(e.id)?.params??{},i=Kv(s,o),a=this.cacheKey(e.kind,i,n,e.runIndex),c=this.cache.get(a);if(c)this.dag.markRunning(e.id);else{this.gate?.check(e.id,e.kind),this.dag.markRunning(e.id);let d={nodeId:e.id,kind:e.kind,runIndex:e.runIndex,vars:this.def.vars??{},trigger:this.trigger,now:this.now,log:this.log,host:this.host,signal:this.signal};c=await this.registry.get(e.kind)(n,i,d),this.cache.set(a,c),r.add(e.id),await this.persistCheckpoint()}this.nodeOutputs.set(e.id,c.outputs),this.dag.markCompleted(e.id,{output:c.outputs,firedPorts:c.firedPorts});let l=this.loopBackOf.get(e.id);l&&this.decideLoopBack(l)}enterLoop(e){this.dag.markRunning(e.id);let r={loop:[{json:{iteration:e.iteration??0}}],done:[]};this.nodeOutputs.set(e.id,r),this.dag.markCompleted(e.id,{output:r,firedPorts:["loop"]})}decideLoopBack(e){let r=this.evalLoopCondition(e);this.dag.decideLoop(e,r);let n=this.dag.getNode(e),o=n.firedPorts??[];this.nodeOutputs.set(e,{loop:o.includes("loop")?[{json:{iteration:n.iteration??0}}]:[],done:o.includes("done")?[{json:{iteration:n.iteration??0}}]:[]})}evalLoopCondition(e){let n=this.nodeDefs.get(e)?.params?.condition;if(n==null||n==="")return!0;let o=this.buildExprContext({});return!!(typeof n=="string"?Qd(n,o):n)}collectInputs(e){let r={};for(let n of this.def.edges){if(n.to!==e||n.loopBack)continue;let o=n.fromPort??"default",s=n.toPort??"default",i=this.nodeOutputs.get(n.from);if(!i)continue;let a=i[o];a&&(r[s]??=[]).push(...a)}return r}buildExprContext(e){let r={};for(let[n,o]of this.nodeOutputs)r[n]={output:o};return{input:e,json:e.default?.[0]?.json??{},nodes:r,vars:this.def.vars??{},trigger:this.trigger,now:this.now}}cacheKey(e,r,n,o){return Kd([e,r,qv(n),o])}buildDag(){let e=this.def.nodes.map(n=>({id:n.id,kind:n.kind,params:n.params??{},outPorts:n.outPorts??LL(n.kind),joinPolicy:n.joinPolicy??"all",maxIterations:n.maxIterations})),r=new Qt(e);for(let n of this.def.edges)n.loopBack||r.addEdge({from:n.from,to:n.to,fromPort:n.fromPort??"default"});for(let n of this.def.edges)n.loopBack&&r.addEdge({from:n.from,to:n.to,loopBack:!0});return r}};function LL(t){return t==="if"?["true","false"]:t==="loop"?["loop","done"]:["default"]}var OL=new Set(["agent","tool","http","mcp","channel","im"]),Zd=class extends Error{constructor(r,n,o){super(`Permission denied: node "${r}" (kind "${n}") may not run under unattended trigger "${o}". Authorize it by adding "${n}" to allowUnattendedKinds.`);this.nodeId=r;this.kind=n;this.trigger=o;this.name="WorkflowPermissionDenied"}nodeId;kind;trigger},pi=class extends yn{constructor(r,n,o){super(r);this.reason=n;this.limit=o;this.name="WorkflowBudgetExceeded",this.message=`Budget exceeded (${n} limit ${o}) before node "${r}"`}reason;limit},mi=class{trigger;maxNodeExecutions;maxDurationMs;allow;now;executions=0;startedAt=-1;constructor(e){if(!Number.isInteger(e.maxNodeExecutions)||e.maxNodeExecutions<=0)throw new Error(`BudgetPermissionGate: maxNodeExecutions must be a positive integer, got ${e.maxNodeExecutions}`);if(e.maxDurationMs!==void 0&&!(e.maxDurationMs>0))throw new Error(`BudgetPermissionGate: maxDurationMs must be greater than 0 when provided, got ${e.maxDurationMs}`);this.trigger=e.trigger,this.maxNodeExecutions=e.maxNodeExecutions,this.maxDurationMs=e.maxDurationMs,this.allow=new Set(e.allowUnattendedKinds??[]),this.now=e.now??(()=>Date.now())}get unattended(){return this.trigger!=="manual"}check(e,r){if(this.unattended&&OL.has(r)&&!this.allow.has(r))throw new Zd(e,r,this.trigger);if(this.startedAt<0&&(this.startedAt=this.now()),this.maxDurationMs!==void 0&&this.now()-this.startedAt>=this.maxDurationMs)throw new pi(e,"duration",this.maxDurationMs);if(this.executions>=this.maxNodeExecutions)throw new pi(e,"executions",this.maxNodeExecutions);this.executions++}extend(e){if(e.executions!==void 0){if(!Number.isInteger(e.executions)||e.executions<=0)throw new Error(`BudgetPermissionGate.extend: executions delta must be a positive integer, got ${e.executions}`);this.maxNodeExecutions+=e.executions}if(e.durationMs!==void 0){if(!(e.durationMs>0))throw new Error(`BudgetPermissionGate.extend: durationMs delta must be greater than 0, got ${e.durationMs}`);if(this.maxDurationMs===void 0)throw new Error("BudgetPermissionGate.extend: cannot extend duration on a gate with no duration cap");this.maxDurationMs+=e.durationMs}}};function Zv(t){switch(t.type){case"manual":return[];case"schedule":return tu(t.cron);case"im-message":return UL(t.channel,t.match);case"webhook":return FL(t.path);default:return[`unknown trigger type: ${JSON.stringify(t)}`]}}var Jv=["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"],Qv=["SUN","MON","TUE","WED","THU","FRI","SAT"];function tu(t){if(typeof t!="string"||t.trim()==="")return["schedule.cron must be a non-empty string"];let e=t.trim().split(/\s+/);if(e.length!==5&&e.length!==6)return[`schedule.cron must have 5 or 6 fields, got ${e.length}: "${t}"`];let n=e.length===6?[{label:"second",min:0,max:59},{label:"minute",min:0,max:59},{label:"hour",min:0,max:23},{label:"day-of-month",min:1,max:31},{label:"month",min:1,max:12,names:Jv},{label:"day-of-week",min:0,max:7,names:Qv}]:[{label:"minute",min:0,max:59},{label:"hour",min:0,max:23},{label:"day-of-month",min:1,max:31},{label:"month",min:1,max:12,names:Jv},{label:"day-of-week",min:0,max:7,names:Qv}],o=[];for(let s=0;s<n.length;s++){let i=jL(e[s],n[s]);i&&o.push(`schedule.cron ${i}`)}return o}function jL(t,e){for(let r of t.split(",")){let n=$L(r,e);if(n)return n}}function $L(t,e){if(t==="")return`${e.label} has an empty list element`;let r=t,n,o=t.indexOf("/");if(o!==-1&&(r=t.slice(0,o),n=t.slice(o+1),!/^\d+$/.test(n)||Number(n)<=0))return`${e.label} has an invalid step "/${n}"`;if(r==="*")return;let s=r.indexOf("-");if(s!==-1){let a=eu(r.slice(0,s),e),c=eu(r.slice(s+1),e);return a===void 0||c===void 0?`${e.label} has an invalid range "${r}"`:a>c?`${e.label} range "${r}" is descending`:void 0}if(r===""&&n!==void 0)return`${e.label} step "${t}" needs a base ("*" or a range)`;if(eu(r,e)===void 0)return`${e.label} value "${r}" is out of range ${e.min}-${e.max}`}function eu(t,e){let r;if(/^\d+$/.test(t))r=Number(t);else if(e.names){let n=e.names.indexOf(t.toUpperCase());if(n===-1)return;r=e.label==="month"?n+1:n}else return;if(!(r<e.min||r>e.max))return r}function UL(t,e){let r=[];if((typeof t!="string"||t.trim()==="")&&r.push("im-message.channel must be a non-empty string"),e!==void 0)if(typeof e!="string")r.push("im-message.match must be a string regex");else try{new RegExp(e)}catch(n){r.push(`im-message.match is not a valid regex: ${n.message}`)}return r}function FL(t){return typeof t!="string"||t===""?["webhook.path must be a non-empty string"]:t.startsWith("/")?/\s/.test(t)?[`webhook.path must not contain whitespace: "${t}"`]:t.includes("..")?[`webhook.path must not contain "..": "${t}"`]:/^\/[A-Za-z0-9\-._~/]*$/.test(t)?[]:[`webhook.path contains illegal characters: "${t}"`]:[`webhook.path must start with "/": "${t}"`]}var ur=class extends Error{constructor(r){super(`Patch rejected: ${r.join("; ")}`);this.errors=r;this.name="PatchError"}errors};function eb(t,e){let r=[],n=qL(t),o=new Map(n.def.nodes.map(l=>[l.id,l])),s=e.scope?new Set(e.scope):void 0,i=new Set,a=l=>!s||s.has(l)||i.has(l),c=[];for(let[l,d]of e.patch.entries()){let p=`op[${l}] ${d.op}`;switch(d.op){case"add_node":{d.node?.id?o.has(d.node.id)?r.push(`${p}: node "${d.node.id}" already exists`):(n.def.nodes.push(d.node),o.set(d.node.id,d.node),s&&i.add(d.node.id)):r.push(`${p}: node.id is required`);break}case"remove_node":{o.has(d.nodeId)?a(d.nodeId)?(n.def.nodes=n.def.nodes.filter(u=>u.id!==d.nodeId),o.delete(d.nodeId),n.def.edges=n.def.edges.filter(u=>u.from!==d.nodeId&&u.to!==d.nodeId)):r.push(`${p}: node "${d.nodeId}" is outside the edit scope`):r.push(`${p}: node "${d.nodeId}" not found`);break}case"update_params":{let u=o.get(d.nodeId);u?a(d.nodeId)?u.params=HL(u.params,d.params):r.push(`${p}: node "${d.nodeId}" is outside the edit scope`):r.push(`${p}: node "${d.nodeId}" not found`);break}case"rename_node":{let u=o.get(d.nodeId);u?a(d.nodeId)?u.name=d.name:r.push(`${p}: node "${d.nodeId}" is outside the edit scope`):r.push(`${p}: node "${d.nodeId}" not found`);break}case"add_edge":{let u=d.edge;!u?.from||!u?.to?r.push(`${p}: edge.from and edge.to are required`):s&&!a(u.from)&&!a(u.to)?r.push(`${p}: edge ${u.from}\u2192${u.to} has no endpoint in the edit scope`):n.def.edges.push(u);break}case"remove_edge":{let{from:u,to:m,fromPort:f}=d.edge;if(s&&!a(u)&&!a(m))r.push(`${p}: edge ${u}\u2192${m} has no endpoint in the edit scope`);else{let g=n.def.edges.length;n.def.edges=n.def.edges.filter(h=>!(h.from===u&&h.to===m&&(h.fromPort??"default")===(f??"default"))),n.def.edges.length===g&&r.push(`${p}: edge ${u}\u2192${m} not found`)}break}case"set_trigger":{if(s)r.push(`${p}: trigger is workflow-global and cannot be changed in a scoped edit`);else if(d.trigger){let u=Zv(d.trigger);if(u.length>0)for(let m of u)r.push(`${p}: ${m}`);else n.meta.trigger=d.trigger}else n.meta.trigger=d.trigger;break}case"set_meta":{s?r.push(`${p}: meta is workflow-global and cannot be changed in a scoped edit`):(d.meta.name!==void 0&&(n.meta.name=d.meta.name),d.meta.active!==void 0&&(n.meta.active=d.meta.active));break}default:r.push(`${p}: unknown op`)}r.length===0&&c.push(d)}if(r.length>0)throw new ur(r);if(tb(n.def,r),r.length>0)throw new ur(r);return{target:n,applied:c}}function HL(t,e){let r={...t??{}};for(let[n,o]of Object.entries(e))o===null?delete r[n]:r[n]=o;return r}function ru(t){let e=[];return tb(t,e),e}function tb(t,e){try{let r=t.nodes.map(o=>({id:o.id,kind:o.kind,params:o.params??{},outPorts:o.outPorts??BL(o.kind),joinPolicy:o.joinPolicy??"all",maxIterations:o.maxIterations})),n=new Qt(r);for(let o of t.edges)o.loopBack||n.addEdge({from:o.from,to:o.to,fromPort:o.fromPort??"default"});for(let o of t.edges)o.loopBack&&n.addEdge({from:o.from,to:o.to,loopBack:!0})}catch(r){e.push(`graph invalid: ${r.message}`)}}function BL(t){return t==="if"?["true","false"]:t==="loop"?["loop","done"]:["default"]}function qL(t){return{def:{...t.def,nodes:t.def.nodes.map(e=>({...e,params:e.params?{...e.params}:void 0})),edges:t.def.edges.map(e=>({...e})),vars:t.def.vars?{...t.def.vars}:void 0},meta:{...t.meta}}}function rb(t,e={}){let r=e.maxNodes??50,n=e.maxValueLen??60,o=`Workflow ${JSON.stringify(t.name)} (rev ${t.rev}, trigger: ${WL(t.trigger)}, ${t.active?"active":"inactive"})`,s=t.def.nodes,a=s.slice(0,r).map(p=>" "+GL(p,n)),c=s.length===0?"nodes: (none)":["nodes:",...a].join(`
356
356
  `),l=s.length>r?`
357
357
  \u2026 ${s.length-r} more node(s); call workflow.get for the full definition`:"",d=VL(t.def.edges);return`${o}
358
358
  ${c}${l}
@@ -378,7 +378,7 @@ Content-Disposition: form-data; name="prompt"\r
378
378
  \r
379
379
  \u8BF7\u7528${e.language==="zh"?"\u4E2D\u6587":"\u82F1\u6587"}\u8F6C\u5F55`),l.push(`--${c}--`);let d=l.join(`\r
380
380
  `)+`\r
381
- `,p=await fetch(i,{method:"POST",headers:{Authorization:`Bearer ${o}`,"Content-Type":`multipart/form-data; boundary=${c}`},body:d});if(!p.ok){let m=await p.text();a.release({success:!1,errorCode:p.status}),t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`STT API error (${p.status}): ${m.slice(0,200)}`});return}let u=await p.json();a.release({success:!0}),t.id!==void 0&&this.sendResponse(t.id,{text:u.text??"",model:u.model})}catch(c){a.release({success:!1}),t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:c instanceof Error?c.message:String(c)})}}import{randomUUID as CX}from"node:crypto";import{randomUUID as rk}from"node:crypto";var HO=new Set(["fact","preference","insight","lesson","decision","plan","event","general"]);function hu(t){let e=gu(t),r=typeof e.text=="string"?e.text.trim():"";return r?{id:typeof e.id=="string"&&e.id?e.id:`candidate-${rk()}`,text:r.slice(0,4e3),category:ok(e.category),importance:fu(e.importance,.1,1,.6),confidence:fu(e.confidence,0,1,.6),source:typeof e.source=="string"&&e.source.trim()?e.source.trim():"manual",eventDate:typeof e.eventDate=="string"?e.eventDate:"",tags:sk(e.tags),relatedMemoryIds:Array.isArray(e.relatedMemoryIds)?e.relatedMemoryIds.filter(n=>typeof n=="string").slice(0,12):[],evidence:Array.isArray(e.evidence)?e.evidence.map(gu).slice(0,8):[],requiresConfirmation:e.requiresConfirmation!==!1,reason:typeof e.reason=="string"?e.reason:""}:null}async function yu(t,e,r){let n=typeof e.text=="string"?e.text:"",o=await qO(t,n,r);if(e.autoExtract!==!1){let s=await GO(t,e,o);if(s?.length)return{candidates:s,related:o,source:"llm"}}return{candidates:WO(e,o),related:o,source:"deterministic"}}async function nk(t,e,r){let n=await yu(t,e,r);return{candidates:n.candidates,relatedMemories:n.related,extractor:n.source}}function gu(t){return t&&typeof t=="object"?t:{}}function fu(t,e,r,n){let o=typeof t=="number"&&Number.isFinite(t)?t:n;return Math.max(e,Math.min(r,o))}function ok(t){return typeof t=="string"&&HO.has(t)?t:"general"}function sk(t){if(!Array.isArray(t))return[];let e=new Set;for(let r of t){if(typeof r!="string")continue;let n=r.trim().replace(/\s+/g,"-").slice(0,48);n&&e.add(n)}return Array.from(e).slice(0,12)}function ik(t){let e=gu(t),r=typeof e.type=="string"?e.type:"file",n=typeof e.filename=="string"&&e.filename.trim()?e.filename.trim():"attachment",o=typeof e.mimeType=="string"?e.mimeType:"",s=typeof e.text=="string"?e.text.slice(0,12e3):"",i=typeof e.url=="string"?e.url:"",a=typeof e.path=="string"?e.path:"",c=typeof e.size=="number"&&Number.isFinite(e.size)?e.size:void 0;return{type:r,filename:n,mimeType:o,text:s,url:i,path:a,size:c}}function ak(t){let e=[`${t.type}:${t.filename}`];return t.mimeType&&e.push(t.mimeType),t.size&&e.push(`${t.size} bytes`),t.text&&e.push(`content=${t.text.slice(0,1500)}`),t.url&&e.push(`url=${t.url}`),t.path&&e.push(`path=${t.path}`),e.join(" | ")}function BO(t){let r=t.match(/```(?:json)?\s*([\s\S]*?)```/i)?.[1]??t,n=r.indexOf("{"),o=r.lastIndexOf("}");if(n<0||o<=n)return null;try{return JSON.parse(r.slice(n,o+1))}catch{return null}}async function qO(t,e,r){if(!t.memoryProvider?.search||!e.trim())return[];try{return(await t.memoryProvider.search(e,r,{limit:5,minScore:.12})).map(o=>({id:o.blockId,text:o.text,score:typeof o.score=="number"?o.score:0,category:typeof o.metadata?.category=="string"?o.metadata.category:void 0})).filter(o=>!!(o.id&&o.text))}catch{return[]}}function WO(t,e){let r=typeof t.text=="string"?t.text.trim():"",n=Array.isArray(t.attachments)?t.attachments.map(ik):[],o=n.map(ak).join(`
381
+ `,p=await fetch(i,{method:"POST",headers:{Authorization:`Bearer ${o}`,"Content-Type":`multipart/form-data; boundary=${c}`},body:d});if(!p.ok){let m=await p.text();a.release({success:!1,errorCode:p.status}),t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`STT API error (${p.status}): ${m.slice(0,200)}`});return}let u=await p.json();a.release({success:!0}),t.id!==void 0&&this.sendResponse(t.id,{text:u.text??"",model:u.model})}catch(c){a.release({success:!1}),t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:c instanceof Error?c.message:String(c)})}}import{randomUUID as IX}from"node:crypto";import{randomUUID as rk}from"node:crypto";var HO=new Set(["fact","preference","insight","lesson","decision","plan","event","general"]);function hu(t){let e=gu(t),r=typeof e.text=="string"?e.text.trim():"";return r?{id:typeof e.id=="string"&&e.id?e.id:`candidate-${rk()}`,text:r.slice(0,4e3),category:ok(e.category),importance:fu(e.importance,.1,1,.6),confidence:fu(e.confidence,0,1,.6),source:typeof e.source=="string"&&e.source.trim()?e.source.trim():"manual",eventDate:typeof e.eventDate=="string"?e.eventDate:"",tags:sk(e.tags),relatedMemoryIds:Array.isArray(e.relatedMemoryIds)?e.relatedMemoryIds.filter(n=>typeof n=="string").slice(0,12):[],evidence:Array.isArray(e.evidence)?e.evidence.map(gu).slice(0,8):[],requiresConfirmation:e.requiresConfirmation!==!1,reason:typeof e.reason=="string"?e.reason:""}:null}async function yu(t,e,r){let n=typeof e.text=="string"?e.text:"",o=await qO(t,n,r);if(e.autoExtract!==!1){let s=await GO(t,e,o);if(s?.length)return{candidates:s,related:o,source:"llm"}}return{candidates:WO(e,o),related:o,source:"deterministic"}}async function nk(t,e,r){let n=await yu(t,e,r);return{candidates:n.candidates,relatedMemories:n.related,extractor:n.source}}function gu(t){return t&&typeof t=="object"?t:{}}function fu(t,e,r,n){let o=typeof t=="number"&&Number.isFinite(t)?t:n;return Math.max(e,Math.min(r,o))}function ok(t){return typeof t=="string"&&HO.has(t)?t:"general"}function sk(t){if(!Array.isArray(t))return[];let e=new Set;for(let r of t){if(typeof r!="string")continue;let n=r.trim().replace(/\s+/g,"-").slice(0,48);n&&e.add(n)}return Array.from(e).slice(0,12)}function ik(t){let e=gu(t),r=typeof e.type=="string"?e.type:"file",n=typeof e.filename=="string"&&e.filename.trim()?e.filename.trim():"attachment",o=typeof e.mimeType=="string"?e.mimeType:"",s=typeof e.text=="string"?e.text.slice(0,12e3):"",i=typeof e.url=="string"?e.url:"",a=typeof e.path=="string"?e.path:"",c=typeof e.size=="number"&&Number.isFinite(e.size)?e.size:void 0;return{type:r,filename:n,mimeType:o,text:s,url:i,path:a,size:c}}function ak(t){let e=[`${t.type}:${t.filename}`];return t.mimeType&&e.push(t.mimeType),t.size&&e.push(`${t.size} bytes`),t.text&&e.push(`content=${t.text.slice(0,1500)}`),t.url&&e.push(`url=${t.url}`),t.path&&e.push(`path=${t.path}`),e.join(" | ")}function BO(t){let r=t.match(/```(?:json)?\s*([\s\S]*?)```/i)?.[1]??t,n=r.indexOf("{"),o=r.lastIndexOf("}");if(n<0||o<=n)return null;try{return JSON.parse(r.slice(n,o+1))}catch{return null}}async function qO(t,e,r){if(!t.memoryProvider?.search||!e.trim())return[];try{return(await t.memoryProvider.search(e,r,{limit:5,minScore:.12})).map(o=>({id:o.blockId,text:o.text,score:typeof o.score=="number"?o.score:0,category:typeof o.metadata?.category=="string"?o.metadata.category:void 0})).filter(o=>!!(o.id&&o.text))}catch{return[]}}function WO(t,e){let r=typeof t.text=="string"?t.text.trim():"",n=Array.isArray(t.attachments)?t.attachments.map(ik):[],o=n.map(ak).join(`
382
382
  `),s=[r,o].filter(Boolean).join(`
383
383
 
384
384
  `).trim();if(!s)return[];let i=Array.isArray(t.tags)?t.tags:[],a=sk([...i,...n.map(c=>`asset:${c.type}`),...n.map(c=>c.filename.split(".").slice(0,-1).join(".")||c.filename)]);return[{id:`candidate-${rk()}`,text:s.slice(0,1400),category:ok(t.category),importance:fu(t.importance,.1,1,n.length>0?.72:.62),confidence:.58,source:typeof t.source=="string"&&t.source.trim()?t.source.trim():"manual",eventDate:"",tags:a,relatedMemoryIds:e.map(c=>c.id).slice(0,5),evidence:[...r?[{type:"text",excerpt:r.slice(0,500)}]:[],...n.map(c=>({type:c.type,filename:c.filename,mimeType:c.mimeType}))],requiresConfirmation:!0,reason:"Pending user confirmation before writing to long-term memory."}]}async function GO(t,e,r){let n=typeof t.resolveClientForPurpose=="function"?t.resolveClientForPurpose.bind(t):null,o=n?.("smallModel")??n?.("textGeneration")??null;if(!o)return null;let s=typeof e.text=="string"?e.text.trim():"",a=(Array.isArray(e.attachments)?e.attachments.map(ik):[]).map(ak).join(`
@@ -394,7 +394,7 @@ ${c||"(none)"}`].join(`
394
394
 
395
395
  \u521A\u624D\u53D1\u751F\u4E86: ${t.turnSummary}
396
396
 
397
- \u7528\u4E00\u53E5\u8BDD(\u226420\u5B57)\u4EE5\u4F60\u7684\u6027\u683C\u505A\u51FA\u7B80\u77ED\u53CD\u5E94\u3002\u53EA\u8F93\u51FA\u53CD\u5E94\u6587\u672C\uFF0C\u4E0D\u8981\u5176\u4ED6\u5185\u5BB9\u3002${r}`;try{let s=(await e(n,50))?.trim();if(!s||s.length>50||Mr(s))return null;vo.push(s),vo.length>ZO&&vo.shift();let i=/[!!✨🎉]|搞定|完美|太棒/.test(s)?"excited":/[.。…]|嗯|想|看看/.test(s)?"thinking":/[zZ]|困|睡|累/.test(s)?"sleepy":"normal";return{text:s,style:i}}catch{return null}}var vu=[{id:"bubble_detail",name:"Bubble Detail",description:"Longer speech bubbles for status text",unlockedAtLevel:2,surface:"presentation"},{id:"gaze_follow",name:"Gaze Follow",description:"Eyes follow pointer focus more smoothly",unlockedAtLevel:3,surface:"presentation"},{id:"micro_expression",name:"Micro Expression",description:"Tiny antenna and eye sparkle animations",unlockedAtLevel:5,surface:"presentation"},{id:"tidy_motion",name:"Tidy Motion",description:"A gentle tidying animation after local profile updates",unlockedAtLevel:7,surface:"presentation"},{id:"mood_badge",name:"Mood Badge",description:"Small weather-like mood badges in bubbles",unlockedAtLevel:10,surface:"presentation"},{id:"quiet_rest",name:"Quiet Rest",description:"Calmer idle and sleeping animations",unlockedAtLevel:12,surface:"presentation"},{id:"activity_glow",name:"Activity Glow",description:"Soft glow during visible activity changes",unlockedAtLevel:15,surface:"presentation"},{id:"style_tint",name:"Style Tint",description:"Subtle color accents for the companion style",unlockedAtLevel:20,surface:"presentation"}],Rk=["\u7B2C\u4E00\u6B21\u8131\u58F3\uFF01\u5C0F\u867E\u58F3\u53D8\u5F97\u66F4\u6709\u5149\u6CFD\u4E86","\u58F3\u9762\u5F00\u59CB\u51FA\u73B0\u7EC6\u5FAE\u7684\u5F69\u8679\u7EB9\u7406","\u94B3\u5B50\u53D8\u5F97\u66F4\u52A0\u6709\u529B\uFF0C\u80FD\u5939\u8D77\u66F4\u591A\u4E1C\u897F\u4E86","\u89E6\u89D2\u7075\u654F\u5EA6\u63D0\u5347\uFF0C\u611F\u77E5\u8303\u56F4\u6269\u5927","\u5168\u8EAB\u6563\u53D1\u5FAE\u5149\uFF0C\u50CF\u662F\u5185\u5728\u529B\u91CF\u5728\u89C9\u9192","\u8FDB\u5165\u7A00\u6709\u4F53\u8272\u53D8\u5F02\u9636\u6BB5..."],oe=class t{static xpForLevel(e){return e*100}static processXpGain(e,r){let n=[],o={},s=e.level,i=e.experience+r;for(;i>=t.xpForLevel(s);){if(i-=t.xpForLevel(s),s++,n.push({type:"level_up",level:s}),s%5===0){let c=Math.floor(s/5),l=t.getMoltResult(c,e.stats);n.push({type:"molt",level:s,moltStage:c});for(let[d,p]of Object.entries(l.statBoost)){let u=d;o[u]=(o[u]??0)+(p??0)}}let a=vu.find(c=>c.unlockedAtLevel===s);a&&n.push({type:"display_trait_unlock",level:s,displayTrait:a})}return{newLevel:s,newXp:i,events:n,statBoosts:o}}static getMoltResult(e,r){let n=Rk[Math.min(e-1,Rk.length-1)]??"\u7EE7\u7EED\u6210\u957F\u4E2D...",o=["grip","patience","curiosity","appetite","humor"],i={[o[(e-1)%o.length]]:1};return{stage:e,description:n,statBoost:i}}static getUnlockedDisplayTraits(e){return vu.filter(r=>r.unlockedAtLevel<=e)}static getNextDisplayTrait(e){return vu.find(r=>r.unlockedAtLevel>e)??null}static xpForEvent(e){switch(e){case"turn.end":return 10;case"turn.error":return 2;case"session.created":return 5;case"interact.pat":return 3;case"interact.feed":return 5;case"interact.poke":return 1;case"tool.success":return 2;default:return 1}}};import{createHash as OX}from"node:crypto";import $X from"node:fs";var UX=500*1024,FX=20*1024,ej=["idle"];function bu(t){if(!t||typeof t!="object")throw new Error("Manifest must be an object");let e=t;if(e.version!==1)throw new Error(`Unsupported manifest version: ${e.version}`);for(let o of["name","author","created"])if(typeof e[o]!="string"||e[o].length===0)throw new Error(`Manifest missing or invalid field: ${o}`);if(e.name.length>30)throw new Error("Manifest name exceeds 30 characters");if(!e.dimensions||typeof e.dimensions!="object")throw new Error("Manifest missing dimensions");let r=e.dimensions;if(typeof r.width!="number"||typeof r.height!="number")throw new Error("Manifest dimensions must be numbers");if(r.width>400||r.height>400||r.width<50||r.height<50)throw new Error("Manifest dimensions must be 50-400px");if(!e.states||typeof e.states!="object")throw new Error("Manifest missing states");let n=e.states;for(let o of ej)if(!(o in n))throw new Error(`Manifest missing required state: ${o}`);for(let[o,s]of Object.entries(n)){if(!s||typeof s!="object")throw new Error(`Invalid state config for "${o}"`);let i=s;if(typeof i.file!="string")throw new Error(`State "${o}" missing file path`);if(typeof i.loop!="boolean")throw new Error(`State "${o}" missing loop flag`);if(i.file.includes("..")||i.file.startsWith("/"))throw new Error(`State "${o}" file path contains path traversal`)}}function $r(t){let e=t.replace(/<\?xml[^?]*\?>/gi,"").replace(/<!DOCTYPE[^>]*>/gi,"");return e=e.replace(/<script[\s\S]*?<\/script>/gi,""),e=e.replace(/<script[^>]*\/>/gi,""),e=e.replace(/<foreignObject[\s\S]*?<\/foreignObject>/gi,""),e=e.replace(/<foreignObject[^>]*\/>/gi,""),e=e.replace(/\s+on\w+\s*=\s*"[^"]*"/gi,""),e=e.replace(/\s+on\w+\s*=\s*'[^']*'/gi,""),e=e.replace(/href\s*=\s*"javascript:[^"]*"/gi,'href=""'),e=e.replace(/href\s*=\s*'javascript:[^']*'/gi,"href=''"),e=e.replace(/xlink:href\s*=\s*"javascript:[^"]*"/gi,'xlink:href=""'),e=e.replace(/(href|src)\s*=\s*"(https?:\/\/[^"]*)"/gi,'$1=""'),e=e.replace(/(href|src)\s*=\s*'(https?:\/\/[^']*)'/gi,"$1=''"),e=e.replace(/<use[^>]*href\s*=\s*"https?:\/\/[^"]*"[^>]*\/?>/gi,""),e=e.replace(/@import\s+url\([^)]*https?:\/\/[^)]*\)[^;]*;/gi,""),e=e.replace(/url\(\s*['"]?https?:\/\/[^)]*\)/gi,"url()"),e.trim()}var ku={idle:{body:"breathe",eyes:"blink",arms:"sway"},thinking:{body:"tilt",eyes:"lookup",arms:"still",effects:["ellipsis"]},working:{body:"lean",eyes:"focus",arms:"hammer"},done:{body:"bounce",eyes:"sparkle",arms:"raised",effects:["sparkle"]},happy:{body:"sway",eyes:"sparkle",arms:"wave",effects:["heart"]},error:{body:"shrink",eyes:"dizzy",arms:"covering",effects:["sweat"]},sleeping:{body:"still",eyes:"closed",arms:"still",effects:["zzz"]},eating:{body:"still",eyes:"blink",arms:"eat"},plan:{body:"tilt",eyes:"focus",arms:"hold",effects:["ellipsis"]},dream:{body:"float",eyes:"closed",arms:"sway",effects:["sparkle","music"]},subagent:{body:"lean",eyes:"focus",arms:"hammer"},"random-look":{body:"breathe",eyes:"lookup",arms:"still"}},tj={breathe:"@keyframes body-anim { 0%,100% { transform: scaleY(1); } 50% { transform: scaleY(1.03); } }",sway:"@keyframes body-anim { 0%,100% { transform: rotate(0deg); } 25% { transform: rotate(2deg); } 75% { transform: rotate(-2deg); } }",lean:"@keyframes body-anim { 0%,100% { transform: rotate(0deg) translateX(0); } 50% { transform: rotate(-3deg) translateX(-2px); } }",tilt:"@keyframes body-anim { 0%,100% { transform: rotate(0deg); } 50% { transform: rotate(5deg); } }",shrink:"@keyframes body-anim { 0%,100% { transform: scale(0.92); } 50% { transform: scale(0.88); } }",bounce:"@keyframes body-anim { 0%,100% { transform: translateY(0); } 50% { transform: translateY(-8px); } }",still:"@keyframes body-anim { 0%,100% { transform: none; } }",float:"@keyframes body-anim { 0%,100% { transform: translateY(0); } 50% { transform: translateY(-5px); } }"},rj={blink:"@keyframes eye-anim { 0%,90%,100% { transform: scaleY(1); } 95% { transform: scaleY(0.1); } }",lookup:"@keyframes eye-anim { 0%,100% { transform: translateY(0); } 50% { transform: translateY(-2px); } }",focus:"@keyframes eye-anim { 0%,100% { transform: scale(1); } 50% { transform: scale(0.9); } }",closed:"@keyframes eye-anim { 0%,100% { transform: scaleY(0.1); } }",wide:"@keyframes eye-anim { 0%,100% { transform: scale(1.2); } }",sparkle:"@keyframes eye-anim { 0%,100% { transform: scale(1); opacity: 1; } 50% { transform: scale(1.1); opacity: 0.8; } }",dizzy:"@keyframes eye-anim { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }",sleepy:"@keyframes eye-anim { 0%,100% { transform: scaleY(0.3); } }"},nj={sway:`@keyframes left-arm-anim { 0%,100% { transform: rotate(0deg); } 50% { transform: rotate(5deg); } }
397
+ \u7528\u4E00\u53E5\u8BDD(\u226420\u5B57)\u4EE5\u4F60\u7684\u6027\u683C\u505A\u51FA\u7B80\u77ED\u53CD\u5E94\u3002\u53EA\u8F93\u51FA\u53CD\u5E94\u6587\u672C\uFF0C\u4E0D\u8981\u5176\u4ED6\u5185\u5BB9\u3002${r}`;try{let s=(await e(n,50))?.trim();if(!s||s.length>50||Mr(s))return null;vo.push(s),vo.length>ZO&&vo.shift();let i=/[!!✨🎉]|搞定|完美|太棒/.test(s)?"excited":/[.。…]|嗯|想|看看/.test(s)?"thinking":/[zZ]|困|睡|累/.test(s)?"sleepy":"normal";return{text:s,style:i}}catch{return null}}var vu=[{id:"bubble_detail",name:"Bubble Detail",description:"Longer speech bubbles for status text",unlockedAtLevel:2,surface:"presentation"},{id:"gaze_follow",name:"Gaze Follow",description:"Eyes follow pointer focus more smoothly",unlockedAtLevel:3,surface:"presentation"},{id:"micro_expression",name:"Micro Expression",description:"Tiny antenna and eye sparkle animations",unlockedAtLevel:5,surface:"presentation"},{id:"tidy_motion",name:"Tidy Motion",description:"A gentle tidying animation after local profile updates",unlockedAtLevel:7,surface:"presentation"},{id:"mood_badge",name:"Mood Badge",description:"Small weather-like mood badges in bubbles",unlockedAtLevel:10,surface:"presentation"},{id:"quiet_rest",name:"Quiet Rest",description:"Calmer idle and sleeping animations",unlockedAtLevel:12,surface:"presentation"},{id:"activity_glow",name:"Activity Glow",description:"Soft glow during visible activity changes",unlockedAtLevel:15,surface:"presentation"},{id:"style_tint",name:"Style Tint",description:"Subtle color accents for the companion style",unlockedAtLevel:20,surface:"presentation"}],Rk=["\u7B2C\u4E00\u6B21\u8131\u58F3\uFF01\u5C0F\u867E\u58F3\u53D8\u5F97\u66F4\u6709\u5149\u6CFD\u4E86","\u58F3\u9762\u5F00\u59CB\u51FA\u73B0\u7EC6\u5FAE\u7684\u5F69\u8679\u7EB9\u7406","\u94B3\u5B50\u53D8\u5F97\u66F4\u52A0\u6709\u529B\uFF0C\u80FD\u5939\u8D77\u66F4\u591A\u4E1C\u897F\u4E86","\u89E6\u89D2\u7075\u654F\u5EA6\u63D0\u5347\uFF0C\u611F\u77E5\u8303\u56F4\u6269\u5927","\u5168\u8EAB\u6563\u53D1\u5FAE\u5149\uFF0C\u50CF\u662F\u5185\u5728\u529B\u91CF\u5728\u89C9\u9192","\u8FDB\u5165\u7A00\u6709\u4F53\u8272\u53D8\u5F02\u9636\u6BB5..."],oe=class t{static xpForLevel(e){return e*100}static processXpGain(e,r){let n=[],o={},s=e.level,i=e.experience+r;for(;i>=t.xpForLevel(s);){if(i-=t.xpForLevel(s),s++,n.push({type:"level_up",level:s}),s%5===0){let c=Math.floor(s/5),l=t.getMoltResult(c,e.stats);n.push({type:"molt",level:s,moltStage:c});for(let[d,p]of Object.entries(l.statBoost)){let u=d;o[u]=(o[u]??0)+(p??0)}}let a=vu.find(c=>c.unlockedAtLevel===s);a&&n.push({type:"display_trait_unlock",level:s,displayTrait:a})}return{newLevel:s,newXp:i,events:n,statBoosts:o}}static getMoltResult(e,r){let n=Rk[Math.min(e-1,Rk.length-1)]??"\u7EE7\u7EED\u6210\u957F\u4E2D...",o=["grip","patience","curiosity","appetite","humor"],i={[o[(e-1)%o.length]]:1};return{stage:e,description:n,statBoost:i}}static getUnlockedDisplayTraits(e){return vu.filter(r=>r.unlockedAtLevel<=e)}static getNextDisplayTrait(e){return vu.find(r=>r.unlockedAtLevel>e)??null}static xpForEvent(e){switch(e){case"turn.end":return 10;case"turn.error":return 2;case"session.created":return 5;case"interact.pat":return 3;case"interact.feed":return 5;case"interact.poke":return 1;case"tool.success":return 2;default:return 1}}};import{createHash as jX}from"node:crypto";import UX from"node:fs";var FX=500*1024,HX=20*1024,ej=["idle"];function bu(t){if(!t||typeof t!="object")throw new Error("Manifest must be an object");let e=t;if(e.version!==1)throw new Error(`Unsupported manifest version: ${e.version}`);for(let o of["name","author","created"])if(typeof e[o]!="string"||e[o].length===0)throw new Error(`Manifest missing or invalid field: ${o}`);if(e.name.length>30)throw new Error("Manifest name exceeds 30 characters");if(!e.dimensions||typeof e.dimensions!="object")throw new Error("Manifest missing dimensions");let r=e.dimensions;if(typeof r.width!="number"||typeof r.height!="number")throw new Error("Manifest dimensions must be numbers");if(r.width>400||r.height>400||r.width<50||r.height<50)throw new Error("Manifest dimensions must be 50-400px");if(!e.states||typeof e.states!="object")throw new Error("Manifest missing states");let n=e.states;for(let o of ej)if(!(o in n))throw new Error(`Manifest missing required state: ${o}`);for(let[o,s]of Object.entries(n)){if(!s||typeof s!="object")throw new Error(`Invalid state config for "${o}"`);let i=s;if(typeof i.file!="string")throw new Error(`State "${o}" missing file path`);if(typeof i.loop!="boolean")throw new Error(`State "${o}" missing loop flag`);if(i.file.includes("..")||i.file.startsWith("/"))throw new Error(`State "${o}" file path contains path traversal`)}}function $r(t){let e=t.replace(/<\?xml[^?]*\?>/gi,"").replace(/<!DOCTYPE[^>]*>/gi,"");return e=e.replace(/<script[\s\S]*?<\/script>/gi,""),e=e.replace(/<script[^>]*\/>/gi,""),e=e.replace(/<foreignObject[\s\S]*?<\/foreignObject>/gi,""),e=e.replace(/<foreignObject[^>]*\/>/gi,""),e=e.replace(/\s+on\w+\s*=\s*"[^"]*"/gi,""),e=e.replace(/\s+on\w+\s*=\s*'[^']*'/gi,""),e=e.replace(/href\s*=\s*"javascript:[^"]*"/gi,'href=""'),e=e.replace(/href\s*=\s*'javascript:[^']*'/gi,"href=''"),e=e.replace(/xlink:href\s*=\s*"javascript:[^"]*"/gi,'xlink:href=""'),e=e.replace(/(href|src)\s*=\s*"(https?:\/\/[^"]*)"/gi,'$1=""'),e=e.replace(/(href|src)\s*=\s*'(https?:\/\/[^']*)'/gi,"$1=''"),e=e.replace(/<use[^>]*href\s*=\s*"https?:\/\/[^"]*"[^>]*\/?>/gi,""),e=e.replace(/@import\s+url\([^)]*https?:\/\/[^)]*\)[^;]*;/gi,""),e=e.replace(/url\(\s*['"]?https?:\/\/[^)]*\)/gi,"url()"),e.trim()}var ku={idle:{body:"breathe",eyes:"blink",arms:"sway"},thinking:{body:"tilt",eyes:"lookup",arms:"still",effects:["ellipsis"]},working:{body:"lean",eyes:"focus",arms:"hammer"},done:{body:"bounce",eyes:"sparkle",arms:"raised",effects:["sparkle"]},happy:{body:"sway",eyes:"sparkle",arms:"wave",effects:["heart"]},error:{body:"shrink",eyes:"dizzy",arms:"covering",effects:["sweat"]},sleeping:{body:"still",eyes:"closed",arms:"still",effects:["zzz"]},eating:{body:"still",eyes:"blink",arms:"eat"},plan:{body:"tilt",eyes:"focus",arms:"hold",effects:["ellipsis"]},dream:{body:"float",eyes:"closed",arms:"sway",effects:["sparkle","music"]},subagent:{body:"lean",eyes:"focus",arms:"hammer"},"random-look":{body:"breathe",eyes:"lookup",arms:"still"}},tj={breathe:"@keyframes body-anim { 0%,100% { transform: scaleY(1); } 50% { transform: scaleY(1.03); } }",sway:"@keyframes body-anim { 0%,100% { transform: rotate(0deg); } 25% { transform: rotate(2deg); } 75% { transform: rotate(-2deg); } }",lean:"@keyframes body-anim { 0%,100% { transform: rotate(0deg) translateX(0); } 50% { transform: rotate(-3deg) translateX(-2px); } }",tilt:"@keyframes body-anim { 0%,100% { transform: rotate(0deg); } 50% { transform: rotate(5deg); } }",shrink:"@keyframes body-anim { 0%,100% { transform: scale(0.92); } 50% { transform: scale(0.88); } }",bounce:"@keyframes body-anim { 0%,100% { transform: translateY(0); } 50% { transform: translateY(-8px); } }",still:"@keyframes body-anim { 0%,100% { transform: none; } }",float:"@keyframes body-anim { 0%,100% { transform: translateY(0); } 50% { transform: translateY(-5px); } }"},rj={blink:"@keyframes eye-anim { 0%,90%,100% { transform: scaleY(1); } 95% { transform: scaleY(0.1); } }",lookup:"@keyframes eye-anim { 0%,100% { transform: translateY(0); } 50% { transform: translateY(-2px); } }",focus:"@keyframes eye-anim { 0%,100% { transform: scale(1); } 50% { transform: scale(0.9); } }",closed:"@keyframes eye-anim { 0%,100% { transform: scaleY(0.1); } }",wide:"@keyframes eye-anim { 0%,100% { transform: scale(1.2); } }",sparkle:"@keyframes eye-anim { 0%,100% { transform: scale(1); opacity: 1; } 50% { transform: scale(1.1); opacity: 0.8; } }",dizzy:"@keyframes eye-anim { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }",sleepy:"@keyframes eye-anim { 0%,100% { transform: scaleY(0.3); } }"},nj={sway:`@keyframes left-arm-anim { 0%,100% { transform: rotate(0deg); } 50% { transform: rotate(5deg); } }
398
398
  @keyframes right-arm-anim { 0%,100% { transform: rotate(0deg); } 50% { transform: rotate(-5deg); } }`,still:`@keyframes left-arm-anim { 0%,100% { transform: none; } }
399
399
  @keyframes right-arm-anim { 0%,100% { transform: none; } }`,hammer:`@keyframes left-arm-anim { 0%,100% { transform: rotate(0deg); } 50% { transform: rotate(-20deg); } }
400
400
  @keyframes right-arm-anim { 0%,100% { transform: rotate(0deg); } 50% { transform: rotate(-25deg); } }`,wave:`@keyframes left-arm-anim { 0%,100% { transform: rotate(0deg); } 50% { transform: rotate(15deg); } }
@@ -543,7 +543,7 @@ If no action needed, just respond with a progress update message to the user.`,e
543
543
  `)},onMcpToolCall:(a,c,l)=>this.handleMcpToolCall(a,c,l),sessionDir:nR.join(X(),"agent-logs")}),n=Zk({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-${oR().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)}
544
544
  `)}}},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 fn;for(let[a,c]of Object.entries(fo))o.register(a,c);let s=ob({registry:o,host:n,budget:{maxNodeExecutions:Pj}});this.workflowController=new pr(e,s),this.workflowStore=e,this.workflowProcessManager=r,ab(this.workflowController);let i=new Mi({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}
545
545
  `),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)}
546
- `)})}return this.workflowController}function rr(t){return t.params??{}}function nr(t,e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:e})}function xj(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 Lu(t,e){this.sendNotification(t,{workflow:xj(e)})}function Ou(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 Cj(t){return t instanceof Error?t.message:String(t)}async function sR(t){let e=rr(t);if(!e.def)return nr.call(this,t,"workflow.create requires `def`");let r=Ht.call(this),n=String(e.id??`wf_${oR().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),Lu.call(this,"workflow.created",o),t.id!==void 0&&this.sendResponse(t.id,o)}async function iR(t){let e=rr(t);if(!e.id)return nr.call(this,t,"workflow.get requires `id`");let n=await Ht.call(this).get(String(e.id));t.id!==void 0&&this.sendResponse(t.id,n)}async function aR(t){let e=rr(t);if(!e.id)return nr.call(this,t,"workflow.describe requires `id`");let n=await Ht.call(this).describe(String(e.id));t.id!==void 0&&this.sendResponse(t.id,{rendered:n})}async function cR(t){let e=rr(t);if(!e.id||!e.patch)return nr.call(this,t,"workflow.patch requires `id` and `patch`");let r=Ht.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&&Lu.call(this,"workflow.updated",await r.get(String(e.id))),t.id!==void 0&&this.sendResponse(t.id,o)}async function lR(t){let e=rr(t);if(!e.id)return nr.call(this,t,"workflow.run requires `id`");let r=Ht.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),Ou.call(this,s,n.type)}catch(i){throw this.sendNotification("workflow.runFailed",{workflowId:o,triggerType:n.type,error:Cj(i)}),i}t.id!==void 0&&this.sendResponse(t.id,s)}async function dR(t){let e=rr(t);if(!e.id||typeof e.active!="boolean")return nr.call(this,t,"workflow.setActive requires `id` and boolean `active`");let n=await Ht.call(this).setActive(String(e.id),e.active);await this.workflowScheduler?.refresh(n.id),Lu.call(this,"workflow.updated",n),t.id!==void 0&&this.sendResponse(t.id,n)}async function uR(t){Ht.call(this);let r=await this.workflowStore.list();t.id!==void 0&&this.sendResponse(t.id,{workflows:r})}async function pR(t){let e=rr(t);if(!e.id)return nr.call(this,t,"workflow.delete requires `id`");Ht.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 mR(t){let e=rr(t);if(!e.channel||typeof e.text!="string")return nr.call(this,t,"workflow.onImMessage requires `channel` and string `text`");Ht.call(this);let r=await this.workflowScheduler.onImMessage(String(e.channel),e.text,e.payload);for(let n of r)Ou.call(this,n,"im-message");t.id!==void 0&&this.sendResponse(t.id,{outcomes:r})}async function gR(t){let e=rr(t);if(!e.path)return nr.call(this,t,"workflow.onWebhook requires `path`");Ht.call(this);let r=await this.workflowScheduler.onWebhook(String(e.path),e.payload);for(let n of r)Ou.call(this,n,"webhook");t.id!==void 0&&this.sendResponse(t.id,{outcomes:r})}import*as Ce from"node:fs";import*as me from"node:path";G();import*as Hr from"node:fs";import*as ju from"node:path";G();import*as xe from"node:fs";import*as wo from"node:path";function _i(t){let e=X(),r=De(t);xe.existsSync(r)||xe.mkdirSync(r,{recursive:!0});let n=wo.join(e,"INSTRUCTIONS.md"),o=wo.join(r,"INSTRUCTIONS.md");if(xe.existsSync(n)&&!xe.existsSync(o))try{xe.copyFileSync(n,o)}catch{}let s=om(),i=Xr(t);if(xe.existsSync(s)&&!xe.existsSync(i))try{xe.mkdirSync(i,{recursive:!0});for(let a of xe.readdirSync(s)){if(!a.endsWith(".md"))continue;let c=wo.join(s,a),l=wo.join(i,a);xe.statSync(c).isFile()&&xe.copyFileSync(c,l)}}catch{}}var Ij=["creating","running","completed","cancelled"];function fR(t){return typeof t=="string"&&Ij.includes(t)}function hR(t,e){let r=I(),n=e.workspaceDir||ju.join(r.getUserAgentHome(),"workspaces",e.name);if(e.groupId){let l=Ns(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);Ej(n);let i=Ds({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||(Ct(i.id),t.setActiveWorkdir(i.workspaceDir)),_i(i.workspaceDir);let c=t.projectMemoryStoreFactory.create(i.workspaceDir);return c.ensureInitialized(),a||(t.memdir=c,t.mediaPersistence.setProjectDir(i.workspaceDir)),Mj(i),{project:i,nameDuplicate:s,isAgentTeamProject:a}}function Ej(t){Hr.existsSync(t)||Hr.mkdirSync(t,{recursive:!0})}function Mj(t){let e=I();if(t.type!=="solo"&&t.type!=="product")return;let r=ju.join(e.getProjectAgentDir(t.workspaceDir),t.type==="solo"?"solo-state.json":"product-state.json");if(Hr.existsSync(r))return;let n=t.type==="solo"?{agents:[],status:"idle",createdAt:new Date().toISOString()}:{tasks:[],instances:[],status:"idle",createdAt:new Date().toISOString()};Hr.writeFileSync(r,JSON.stringify(n,null,2))}function yR(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=hR(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 vR(t){let e=K();t.id!==void 0&&this.sendResponse(t.id,{projects:e})}function bR(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=Te(e.projectId),n=Zl(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(X(),"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{Ce.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 kR(t){let e=K(),r=me.join(X(),"workspaces"),n=me.resolve(r)+me.sep,o=0,s=[];for(let a of e)if(a.type!=="default"){if(Zl(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{Ce.existsSync(c)&&Ce.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(Ce.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=Ce.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{Ce.readdirSync(m).length===0&&Ce.rmdirSync(m)}catch{}continue}try{Ce.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 RR(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=Zf(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(X(),"workspaces"),o=me.resolve(r.workspaceDir);if(o.startsWith(me.resolve(n)+me.sep)){let s=me.join(n,e.newName);if(Ce.existsSync(o)&&!Ce.existsSync(s))try{Ce.renameSync(o,s),eh(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 SR(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 TR(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){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 wR(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=nh(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 AR(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&&!fR(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=Jf(e.projectId,r);t.id!==void 0&&this.sendResponse(t.id,{ok:n})}import{randomUUID as Uu}from"node:crypto";import*as Ke from"node:fs";import*as Br from"node:path";var fr=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 PR from"node:fs";import*as $u from"node:path";var hr=class{getSessionsRoot(e){let r=Te(e);if(!r)throw new Error(`Project not found: ${e}`);return I().getProjectSessionsRoot(r.workspaceDir)}getProjectWorkspaceDir(e){let r=Te(e);if(!r)throw new Error(`Project not found: ${e}`);return r.workspaceDir}getSessionDir(e,r){return $u.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=$u.join(s,e);try{if(PR.existsSync(i))return o.workspaceDir}catch{}}return this.getActiveProjectWorkspaceDir()}getActiveProjectWorkspaceDir(){let e=ne();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=ne();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 xR}from"node:crypto";async function CR(t,e){let r=new Date(t.lastActiveAt).getTime();if(Date.now()-r<Xp)return{split:!1,activeSessionId:t.sessionId};let s=xR(),i=new Date().toISOString();await Ue(t.sessionId,{sealedAt:i},e);let a=t.taskSummary?`[\u4E0A\u4E00\u8F6E\u5BF9\u8BDD\u6458\u8981] ${t.taskSummary}`:void 0;return await Ue(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 IR(t,e){if(t.type!=="group")return{split:!1,activeSessionId:t.sessionId};if(t.turnCount<Yp)return{split:!1,activeSessionId:t.sessionId};let r=xR(),n=new Date().toISOString();await Ue(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 Ue(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 ER from"node:fs";import*as MR from"node:path";var Di=class{constructor(e=new hr,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 Rt(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=MR.join(this.pathService.getProjectSessionsRoot(o),_j(r));try{if(ER.existsSync(s))return o}catch{}}return this.resolveWorkspaceDir(r)}};function _j(t){return t.replace(/[^a-zA-Z0-9_-]/g,"_")}var Dj=new hr,et=new Di(Dj);function yt(t,e="Unknown error"){return t instanceof Error?t.message:e}function Rn(t,e,r){return et.resolveSessionWorkspaceDir(t,e,r)}function _R(t){let e=t.params,r=e?.id??Uu();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 fr(r),this.sessionTaskDomain=void 0,this.memoryPrefetchState=kt(),this.enableIdleDream(),t.id!==void 0&&this.sendResponse(t.id,{id:r,title:e?.title,status:"active",createdAt:new Date().toISOString()})}async function DR(t){let e=t.params,r=e?.limit??20;try{let n=await et.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: ${yt(n)}`})}}async function NR(t){let e=t.params,r=e?.sessionId??Uu();try{let n=e?.projectId??et.getActiveProjectId(),o=et.getProjectWorkspaceDir(n);await Ue(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: ${yt(n)}`})}}async function LR(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??et.getActiveProjectId(),p=et.getProjectWorkspaceDir(d),m=(await Rt(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 Ue(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 Rt(500,u.workspaceDir)).find(g=>g.groupKey===d&&!g.sealedAt);if(f){let g=Vt(f.sessionId,u.workspaceDir);if(g){let h=await CR(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=Uu(),a=et.getActiveProjectId(),c=et.getProjectWorkspaceDir(a),l=o==="group"?`group:${r}:${n}`:void 0;await Ue(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: ${yt(i)}`})}}async function OR(t){let e=t.params,r=e?.limit??50;try{let n;if(e?.projectId){let s=Te(e.projectId);if(!s){t.id!==void 0&&this.sendResponse(t.id,{sessions:[]});return}let i=s.workspaceDir;n=await Rt(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 Rt(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: ${yt(n)}`})}}async function jR(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=Rn(this,e.sessionId,e.projectId),o=(await Rt(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: ${yt(r)}`})}}async function $R(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=Rn(this,e.sessionId,e.projectId),n=await Ec(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: ${yt(r)}`})}}async function UR(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=Rn(this,e.sessionId,e.projectId),n=await Ue(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: ${yt(r)}`})}}async function FR(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=Rn(this,e.sessionId,e.projectId);await Mc(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: ${yt(r)}`})}}async function HR(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=et.getProjectWorkspaceDir(e.projectId),n=(await Rt(1e4,r)).filter(s=>s.projectId===e.projectId),o=0;for(let s of n)await Mc(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: ${yt(r)}`})}}async function BR(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=Rn(this,e.sessionId,e.projectId);await Ue(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: ${yt(r)}`})}}async function qR(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=Rn(this,r,e?.projectId),o=await Ec(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: ${yt(n)}`})}}function WR(t){let e=this.currentSessionId||"default",r=this.sessionState?.createSnapshot(),n,o=this.getActiveProjectRoot();o&&(n=Br.join(Yo(o),e));let s={sessionId:e,model:this.currentModel||void 0,cwd:process.cwd(),paths:{sessionDir:n,agentHome:X(),settings:$e()},usage:r?{turnCount:r.turnCount,inputTokens:r.totalInputTokens,outputTokens:r.totalOutputTokens}:void 0};t.id!==void 0&&this.sendResponse(t.id,s)}function GR(t){let e=t.params,r=null;if(e?.projectId)r=Te(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(!Ke.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=Ct(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 zR(t){let e=ne(),r=K();t.id!==void 0&&this.sendResponse(t.id,{sessionId:this.currentSessionId,activeProject:e,projects:r})}async function KR(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=et.getProjectWorkspaceDir(o.id),i=await Vt(r,s);if(i&&i.projectId===o.id){Ct(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=et.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 VR(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=Te(n),i=Te(o);if(!s||!i){t.id!==void 0&&this.sendError(t.id,y.INVALID_PARAMS,"Source or target project not found");return}let a=Br.join(et.getProjectWorkspaceDir(n),".qlogicagent","sessions",r),c=Br.join(et.getProjectWorkspaceDir(o),".qlogicagent","sessions",r);if(!Ke.existsSync(a)){t.id!==void 0&&this.sendError(t.id,y.INVALID_PARAMS,`Session ${r} not found in project ${n}`);return}try{Ke.mkdirSync(Br.dirname(c),{recursive:!0}),Ke.cpSync(a,c,{recursive:!0});let l=Br.join(c,"metadata.json");if(Ke.existsSync(l)){let d=JSON.parse(Ke.readFileSync(l,"utf-8"));d.projectId=o,Ke.writeFileSync(l,JSON.stringify(d,null,2))}Ke.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=yt(l);this.log(`[session.moveToProject] error: ${d}`),t.id!==void 0&&this.sendError(t.id,y.INTERNAL_ERROR,`Move failed: ${d}`)}}Fe();function Nj(t){return t.length<=8?"****":`${t.slice(0,3)}***${t.slice(-4)}`}function tt(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 Fu(t,e){tt(t,e,rs)}function Lj(t){let e={};for(let r of t)for(let n of r.purposes)e[n]??=[],e[n].push(r);return e}async function Oj(){let t=D(),e=await jn(t);return t.save(),e}async function XR(t){try{return await Oj(),!0}catch(e){if(t)throw e;return!1}}function Hu(t=D()){try{return Sm()}catch{return t.getKnownProviderDef(Y)?.baseUrl??"https://www.qlogicagent.com"}}function Bu(t){return t.id===Y?Y:t.group?.trim()||t.id}function jj(t){return t.id===Bu(t)}function YR(t){let e=Bu(t);return wm({...t,id:e})}function $j(t){let e=new Map;for(let r of t){let n=Bu(r);if(n===Y)continue;let o=r.models?.length??0,s=e.get(n);if(!s){e.set(n,{id:n,displayName:YR(r),baseUrl:ns(r)??"",modelCount:o});continue}s.modelCount+=o,jj(r)&&(s.displayName=YR(r),s.baseUrl=ns(r)??s.baseUrl)}return Array.from(e.values())}async function JR(t){let e=D(),r=e.getKeyForProvider(Y);if(!r){if(t)throw new Error("LLMRouter API Key is required to fetch available models.");return!1}let n=e.getProviderStatus(Y)?.baseUrl??Hu(e);try{if((await Oc(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 QR(t=!1){let e=D();if(!!e.getProviderStatus(Y)?.keys.length)return await JR(!1)?!0:XR(t);let o=e.getAllProviderStatus().filter(s=>s.keys.length>0).map(s=>s.providerId).some(s=>s!=="deepseek"&&s!==Y);return!t&&!o?!1:XR(t)}async function ZR(t){try{let e=D(),r=["deepseek",Y].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 Lc().catch(()=>[]),o=$j(n);o.unshift({id:Y,displayName:Dc,baseUrl:Hu(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!==Y&&o.splice(i,1,s);continue}o.unshift(s)}t.id!==void 0&&this.sendResponse(t.id,{providers:o})}catch(e){tt(this,t,e instanceof Error?e.message:String(e))}}async function eS(t){let e=t.params;if(!e?.providerId||!e?.key){tt(this,t,"Required: providerId (string), key (string)",y.INVALID_PARAMS);return}let{providerId:r,key:n,label:o}=e,s=D(),i,a=!1;try{let c=await dS(r);if(!c){tt(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===Y&&(await Oc(s,{baseUrl:c,apiKey:n})).length===0)throw new Error("LLMRouter did not return any available models for this API Key.");for(let d of On)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:rs;tt(this,t,l)}}function tS(t){let e=t.params;if(!e?.keyId){tt(this,t,"Required: keyId (string)",y.INVALID_PARAMS);return}let r=D();r.removeKey(e.keyId),r.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}function rS(t){let e=t.params;if(!e?.keyId||typeof e.enabled!="boolean"){tt(this,t,"Required: keyId (string), enabled (boolean)",y.INVALID_PARAMS);return}let r=D();r.updateKey(e.keyId,{enabled:e.enabled}),r.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}function nS(t){let e=t.params;if(!e?.modelId||typeof e.enabled!="boolean"){tt(this,t,"Required: modelId (string), enabled (boolean)",y.INVALID_PARAMS);return}let r=D();e.enabled?r.enableModel(e.modelId):r.disableModel(e.modelId),r.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}async function oS(t){let e=t.params;try{await QR(!1);let r=D(),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:Lj(o),configuredProviderIds:[...n]})}catch{Fu(this,t)}}function sS(t){let e=t.params;if(!e?.purpose||!e?.modelId){tt(this,t,"Required: purpose (string), modelId (string)",y.INVALID_PARAMS);return}try{let r=D();r.setBinding(e.purpose,e.modelId),r.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(r){tt(this,t,r instanceof Error?r.message:String(r),y.INVALID_PARAMS)}}function iS(t){let e=t.params;if(!e?.purpose){tt(this,t,"Required: purpose (string)",y.INVALID_PARAMS);return}let r=D(),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 aS(t){try{await QR(!1);let e=D(),r=e.getAllProviderStatus().map(s=>({providerId:s.providerId,displayName:s.providerId===Y?Dc: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:Nj(i.key),enabled:i.enabled,health:i.healthStatus}))})),n=e.getAllBindings(),o={};for(let s of On){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{Fu(this,t)}}async function cS(t){try{let e=D();e.load(),await JR(!1)||await jn(e),e.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,catalogRefreshed:!0})}catch{Fu(this,t)}}async function lS(t){let e=t.params;if(!e?.providerId||!e?.apiKey){tt(this,t,"providerId and apiKey required",y.INVALID_PARAMS);return}try{let r=e.baseUrl||await dS(e.providerId);if(!r){tt(this,t,`Unknown provider: ${e.providerId}`,y.INVALID_PARAMS);return}let n=e.providerId===Y?Nc(r):`${r.replace(/\/$/,"")}/models`,o=await fetch(n,{method:"GET",headers:{Authorization:`Bearer ${e.apiKey}`},signal:AbortSignal.timeout(1e4)});if(o.ok){t.id!==void 0&&this.sendResponse(t.id,{valid:!0,status:o.status});return}let s=await o.text().catch(()=>"");t.id!==void 0&&this.sendResponse(t.id,{valid:!1,status:o.status,error:s.slice(0,500)})}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 dS(t){if(t===Y)return Hu();let e=D().getKnownProviderDef(t);if(e?.baseUrl)return e.baseUrl;let r=await Am(t);return r?ns(r):void 0}G();import*as ce from"node:fs";import*as Ne from"node:path";import{join as Uj}from"node:path";import{readFileSync as Fj,writeFileSync as Hj,mkdirSync as Bj}from"node:fs";var qr=null,qu=!1;function uS(t){return Uj(t,"skill-stats.json")}function Wu(t){if(qr)return qr;try{qr=JSON.parse(Fj(uS(t),"utf8"))}catch{qr={}}return qr}function qj(t){if(!(!qu||!qr))try{Bj(t,{recursive:!0}),Hj(uS(t),JSON.stringify(qr,null,2),"utf8"),qu=!1}catch{}}function Gu(t,e,r){let n=Wu(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),qu=!0,qj(t)}function pS(t,e){return Wu(t)[e]}function mS(t){return Wu(t)}import*as Bt from"node:fs";import*as Ni from"node:path";function Wj(t){try{let e=Bt.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 fS(t){let e=I(),r=[],n=t?e.getProjectSkillsDir(t):void 0,o=e.getUserSkillsDir();return n&&gS(r,n,"project"),gS(r,o,"global"),r}function gS(t,e,r){if(Bt.existsSync(e))for(let n of Bt.readdirSync(e)){let o=Ni.join(e,n);try{if(!Bt.statSync(o).isDirectory())continue}catch{continue}let s=Ni.join(o,"SKILL.md"),i=Ni.join(o,"SKILL.md.disabled"),a=Bt.existsSync(s)?s:null;if(!a&&!Bt.existsSync(i))continue;let c=a?Wj(a):{};t.push({id:`${r}:${n}`,name:n,path:o,active:!!a,scope:r,category:"automation",displayName:Gj(n),displayDescription:zj(n,c.description),fallbackName:n,fallbackDescription:c.description??"",systemGenerated:Kj(n),version:c.version,description:c.description})}}function Gj(t){return{key:`capability.skill.${t}.name`,fallback:t}}function zj(t,e){return{key:`capability.skill.${t}.description`,fallback:e??""}}function Kj(t){return t.startsWith("auto-skill-")||t.startsWith("test-skill-")}function Vj(t){return t==="active"||t==="stale"||t==="archived"}function hS(t){let r=t.params?.projectId,n=this.getActiveProjectRoot();if(r&&this.projectLocator){let s=this.projectLocator.resolveProjectRoot(r);s&&(n=s)}let o=fS(n);t.id!==void 0&&this.sendResponse(t.id,{skills:o})}function yS(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?ir(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=Ne.join(o,r),i=Ne.join(s,"SKILL.md.disabled"),a=Ne.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=B(),l=ue(c),d=It(l,r);d.state!=="active"&&(d.state="active",d.staleAt=void 0,d.archivedAt=void 0),he(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 vS(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?ir(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=Ne.join(o,r),i=Ne.join(s,"SKILL.md"),a=Ne.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 bS(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=B(),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=Ne.join(sr(),r);else{let a=this.getActiveProjectRoot(),c=a?ir(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=Ne.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}),gt(),$s(o,r),he(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 kS(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?ir(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=Ne.join(o,r),i=Ne.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=sr(),c=Ne.join(a,r);try{ce.mkdirSync(c,{recursive:!0});let l=ce.readdirSync(s);for(let d of l){let p=ce.readFileSync(Ne.join(s,d));ce.writeFileSync(Ne.join(c,d),p)}e?.keepLocal||ce.rmSync(s,{recursive:!0,force:!0}),gt(),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 RS(t){let e=t.params,r=B();if(e?.name){let n=pS(r,e.name);t.id!==void 0&&this.sendResponse(t.id,{name:e.name,stats:n??null})}else{let n=mS(r);t.id!==void 0&&this.sendResponse(t.id,{stats:n})}}function SS(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=B(),n=ue(r);It(n,e.name),uh(n,e.name),he(r,n),t.id!==void 0&&this.sendResponse(t.id,{name:e.name,pinned:!0})}function TS(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=B(),n=ue(r);ph(n,e.name),he(r,n),t.id!==void 0&&this.sendResponse(t.id,{name:e.name,pinned:!1})}function wS(t){let e=B(),r=this.getActiveProjectRoot(),n=r?Ne.join(r,".qlogicagent","skills"):sr(),o=mh(e,n);o.transitioned.length>0&&gt(),t.id!==void 0&&this.sendResponse(t.id,o)}function AS(t){let e=t.params,r=B(),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(!Vj(e.state)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Invalid skill lifecycle state"});return}let o=gh(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 ES from"node:path";import{randomUUID as e$}from"node:crypto";import{join as zu}from"node:path";import{mkdir as Xj,readdir as Yj}from"node:fs/promises";function Jj(t){return t?.pathService??I()}function Qj(t,e){return t??e.getActiveProjectRoot()}function PS(t,e){let r=Jj(e);return zu(r.getProjectAgentDir(Qj(t,r)),"solos")}function Ku(t,e,r){return zu(PS(e,r),t)}function xS(t,e,r){return zu(Ku(t,e,r),"solo-state.json")}async function CS(t,e,r){let n=Ku(t.soloId,e,r);await Xj(n,{recursive:!0}),await mr(xS(t.soloId,e,r),t)}async function Zj(t,e,r){return Zt(xS(t,e,r))}async function IS(t,e){let r=PS(t,e),n;try{n=await Yj(r)}catch{return[]}let o=[];for(let s of n){let i=await Zj(s,t,e);i&&o.push(i)}return o}async function Vu(t,e,r){let{rm:n}=await import("node:fs/promises"),o=Ku(t,e,r);try{return await n(o,{recursive:!0,force:!0}),!0}catch{return!1}}var Li=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};CS(r,e.cwd).catch(()=>{})}async restoreFromDisk(e){let r=await IS(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),Vu(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 To(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>
546
+ `)})}return this.workflowController}function rr(t){return t.params??{}}function nr(t,e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:e})}function xj(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 Lu(t,e){this.sendNotification(t,{workflow:xj(e)})}function Ou(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 Cj(t){return t instanceof Error?t.message:String(t)}async function sR(t){let e=rr(t);if(!e.def)return nr.call(this,t,"workflow.create requires `def`");let r=Ht.call(this),n=String(e.id??`wf_${oR().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),Lu.call(this,"workflow.created",o),t.id!==void 0&&this.sendResponse(t.id,o)}async function iR(t){let e=rr(t);if(!e.id)return nr.call(this,t,"workflow.get requires `id`");let n=await Ht.call(this).get(String(e.id));t.id!==void 0&&this.sendResponse(t.id,n)}async function aR(t){let e=rr(t);if(!e.id)return nr.call(this,t,"workflow.describe requires `id`");let n=await Ht.call(this).describe(String(e.id));t.id!==void 0&&this.sendResponse(t.id,{rendered:n})}async function cR(t){let e=rr(t);if(!e.id||!e.patch)return nr.call(this,t,"workflow.patch requires `id` and `patch`");let r=Ht.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&&Lu.call(this,"workflow.updated",await r.get(String(e.id))),t.id!==void 0&&this.sendResponse(t.id,o)}async function lR(t){let e=rr(t);if(!e.id)return nr.call(this,t,"workflow.run requires `id`");let r=Ht.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),Ou.call(this,s,n.type)}catch(i){throw this.sendNotification("workflow.runFailed",{workflowId:o,triggerType:n.type,error:Cj(i)}),i}t.id!==void 0&&this.sendResponse(t.id,s)}async function dR(t){let e=rr(t);if(!e.id||typeof e.active!="boolean")return nr.call(this,t,"workflow.setActive requires `id` and boolean `active`");let n=await Ht.call(this).setActive(String(e.id),e.active);await this.workflowScheduler?.refresh(n.id),Lu.call(this,"workflow.updated",n),t.id!==void 0&&this.sendResponse(t.id,n)}async function uR(t){Ht.call(this);let r=await this.workflowStore.list();t.id!==void 0&&this.sendResponse(t.id,{workflows:r})}async function pR(t){let e=rr(t);if(!e.id)return nr.call(this,t,"workflow.delete requires `id`");Ht.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 mR(t){let e=rr(t);if(!e.channel||typeof e.text!="string")return nr.call(this,t,"workflow.onImMessage requires `channel` and string `text`");Ht.call(this);let r=await this.workflowScheduler.onImMessage(String(e.channel),e.text,e.payload);for(let n of r)Ou.call(this,n,"im-message");t.id!==void 0&&this.sendResponse(t.id,{outcomes:r})}async function gR(t){let e=rr(t);if(!e.path)return nr.call(this,t,"workflow.onWebhook requires `path`");Ht.call(this);let r=await this.workflowScheduler.onWebhook(String(e.path),e.payload);for(let n of r)Ou.call(this,n,"webhook");t.id!==void 0&&this.sendResponse(t.id,{outcomes:r})}import*as Ce from"node:fs";import*as me from"node:path";G();import*as Hr from"node:fs";import*as ju from"node:path";G();import*as xe from"node:fs";import*as wo from"node:path";function _i(t){let e=X(),r=De(t);xe.existsSync(r)||xe.mkdirSync(r,{recursive:!0});let n=wo.join(e,"INSTRUCTIONS.md"),o=wo.join(r,"INSTRUCTIONS.md");if(xe.existsSync(n)&&!xe.existsSync(o))try{xe.copyFileSync(n,o)}catch{}let s=om(),i=Xr(t);if(xe.existsSync(s)&&!xe.existsSync(i))try{xe.mkdirSync(i,{recursive:!0});for(let a of xe.readdirSync(s)){if(!a.endsWith(".md"))continue;let c=wo.join(s,a),l=wo.join(i,a);xe.statSync(c).isFile()&&xe.copyFileSync(c,l)}}catch{}}var Ij=["creating","running","completed","cancelled"];function fR(t){return typeof t=="string"&&Ij.includes(t)}function hR(t,e){let r=I(),n=e.workspaceDir||ju.join(r.getUserAgentHome(),"workspaces",e.name);if(e.groupId){let l=Ns(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);Ej(n);let i=Ds({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||(Ct(i.id),t.setActiveWorkdir(i.workspaceDir)),_i(i.workspaceDir);let c=t.projectMemoryStoreFactory.create(i.workspaceDir);return c.ensureInitialized(),a||(t.memdir=c,t.mediaPersistence.setProjectDir(i.workspaceDir)),Mj(i),{project:i,nameDuplicate:s,isAgentTeamProject:a}}function Ej(t){Hr.existsSync(t)||Hr.mkdirSync(t,{recursive:!0})}function Mj(t){let e=I();if(t.type!=="solo"&&t.type!=="product")return;let r=ju.join(e.getProjectAgentDir(t.workspaceDir),t.type==="solo"?"solo-state.json":"product-state.json");if(Hr.existsSync(r))return;let n=t.type==="solo"?{agents:[],status:"idle",createdAt:new Date().toISOString()}:{tasks:[],instances:[],status:"idle",createdAt:new Date().toISOString()};Hr.writeFileSync(r,JSON.stringify(n,null,2))}function yR(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=hR(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 vR(t){let e=K();t.id!==void 0&&this.sendResponse(t.id,{projects:e})}function bR(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=Te(e.projectId),n=Zl(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(X(),"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{Ce.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 kR(t){let e=K(),r=me.join(X(),"workspaces"),n=me.resolve(r)+me.sep,o=0,s=[];for(let a of e)if(a.type!=="default"){if(Zl(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{Ce.existsSync(c)&&Ce.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(Ce.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=Ce.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{Ce.readdirSync(m).length===0&&Ce.rmdirSync(m)}catch{}continue}try{Ce.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 RR(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=Zf(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(X(),"workspaces"),o=me.resolve(r.workspaceDir);if(o.startsWith(me.resolve(n)+me.sep)){let s=me.join(n,e.newName);if(Ce.existsSync(o)&&!Ce.existsSync(s))try{Ce.renameSync(o,s),eh(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 SR(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 TR(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){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 wR(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=nh(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 AR(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&&!fR(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=Jf(e.projectId,r);t.id!==void 0&&this.sendResponse(t.id,{ok:n})}import{randomUUID as Uu}from"node:crypto";import*as Ke from"node:fs";import*as Br from"node:path";var fr=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 PR from"node:fs";import*as $u from"node:path";var hr=class{getSessionsRoot(e){let r=Te(e);if(!r)throw new Error(`Project not found: ${e}`);return I().getProjectSessionsRoot(r.workspaceDir)}getProjectWorkspaceDir(e){let r=Te(e);if(!r)throw new Error(`Project not found: ${e}`);return r.workspaceDir}getSessionDir(e,r){return $u.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=$u.join(s,e);try{if(PR.existsSync(i))return o.workspaceDir}catch{}}return this.getActiveProjectWorkspaceDir()}getActiveProjectWorkspaceDir(){let e=ne();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=ne();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 xR}from"node:crypto";async function CR(t,e){let r=new Date(t.lastActiveAt).getTime();if(Date.now()-r<Xp)return{split:!1,activeSessionId:t.sessionId};let s=xR(),i=new Date().toISOString();await Ue(t.sessionId,{sealedAt:i},e);let a=t.taskSummary?`[\u4E0A\u4E00\u8F6E\u5BF9\u8BDD\u6458\u8981] ${t.taskSummary}`:void 0;return await Ue(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 IR(t,e){if(t.type!=="group")return{split:!1,activeSessionId:t.sessionId};if(t.turnCount<Yp)return{split:!1,activeSessionId:t.sessionId};let r=xR(),n=new Date().toISOString();await Ue(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 Ue(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 ER from"node:fs";import*as MR from"node:path";var Di=class{constructor(e=new hr,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 Rt(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=MR.join(this.pathService.getProjectSessionsRoot(o),_j(r));try{if(ER.existsSync(s))return o}catch{}}return this.resolveWorkspaceDir(r)}};function _j(t){return t.replace(/[^a-zA-Z0-9_-]/g,"_")}var Dj=new hr,et=new Di(Dj);function yt(t,e="Unknown error"){return t instanceof Error?t.message:e}function Rn(t,e,r){return et.resolveSessionWorkspaceDir(t,e,r)}function _R(t){let e=t.params,r=e?.id??Uu();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 fr(r),this.sessionTaskDomain=void 0,this.memoryPrefetchState=kt(),this.enableIdleDream(),t.id!==void 0&&this.sendResponse(t.id,{id:r,title:e?.title,status:"active",createdAt:new Date().toISOString()})}async function DR(t){let e=t.params,r=e?.limit??20;try{let n=await et.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: ${yt(n)}`})}}async function NR(t){let e=t.params,r=e?.sessionId??Uu();try{let n=e?.projectId??et.getActiveProjectId(),o=et.getProjectWorkspaceDir(n);await Ue(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: ${yt(n)}`})}}async function LR(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??et.getActiveProjectId(),p=et.getProjectWorkspaceDir(d),m=(await Rt(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 Ue(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 Rt(500,u.workspaceDir)).find(g=>g.groupKey===d&&!g.sealedAt);if(f){let g=Vt(f.sessionId,u.workspaceDir);if(g){let h=await CR(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=Uu(),a=et.getActiveProjectId(),c=et.getProjectWorkspaceDir(a),l=o==="group"?`group:${r}:${n}`:void 0;await Ue(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: ${yt(i)}`})}}async function OR(t){let e=t.params,r=e?.limit??50;try{let n;if(e?.projectId){let s=Te(e.projectId);if(!s){t.id!==void 0&&this.sendResponse(t.id,{sessions:[]});return}let i=s.workspaceDir;n=await Rt(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 Rt(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: ${yt(n)}`})}}async function jR(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=Rn(this,e.sessionId,e.projectId),o=(await Rt(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: ${yt(r)}`})}}async function $R(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=Rn(this,e.sessionId,e.projectId),n=await Ec(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: ${yt(r)}`})}}async function UR(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=Rn(this,e.sessionId,e.projectId),n=await Ue(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: ${yt(r)}`})}}async function FR(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=Rn(this,e.sessionId,e.projectId);await Mc(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: ${yt(r)}`})}}async function HR(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=et.getProjectWorkspaceDir(e.projectId),n=(await Rt(1e4,r)).filter(s=>s.projectId===e.projectId),o=0;for(let s of n)await Mc(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: ${yt(r)}`})}}async function BR(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=Rn(this,e.sessionId,e.projectId);await Ue(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: ${yt(r)}`})}}async function qR(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=Rn(this,r,e?.projectId),o=await Ec(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: ${yt(n)}`})}}function WR(t){let e=this.currentSessionId||"default",r=this.sessionState?.createSnapshot(),n,o=this.getActiveProjectRoot();o&&(n=Br.join(Yo(o),e));let s={sessionId:e,model:this.currentModel||void 0,cwd:process.cwd(),paths:{sessionDir:n,agentHome:X(),settings:$e()},usage:r?{turnCount:r.turnCount,inputTokens:r.totalInputTokens,outputTokens:r.totalOutputTokens}:void 0};t.id!==void 0&&this.sendResponse(t.id,s)}function GR(t){let e=t.params,r=null;if(e?.projectId)r=Te(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(!Ke.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=Ct(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 zR(t){let e=ne(),r=K();t.id!==void 0&&this.sendResponse(t.id,{sessionId:this.currentSessionId,activeProject:e,projects:r})}async function KR(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=et.getProjectWorkspaceDir(o.id),i=await Vt(r,s);if(i&&i.projectId===o.id){Ct(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=et.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 VR(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=Te(n),i=Te(o);if(!s||!i){t.id!==void 0&&this.sendError(t.id,y.INVALID_PARAMS,"Source or target project not found");return}let a=Br.join(et.getProjectWorkspaceDir(n),".qlogicagent","sessions",r),c=Br.join(et.getProjectWorkspaceDir(o),".qlogicagent","sessions",r);if(!Ke.existsSync(a)){t.id!==void 0&&this.sendError(t.id,y.INVALID_PARAMS,`Session ${r} not found in project ${n}`);return}try{Ke.mkdirSync(Br.dirname(c),{recursive:!0}),Ke.cpSync(a,c,{recursive:!0});let l=Br.join(c,"metadata.json");if(Ke.existsSync(l)){let d=JSON.parse(Ke.readFileSync(l,"utf-8"));d.projectId=o,Ke.writeFileSync(l,JSON.stringify(d,null,2))}Ke.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=yt(l);this.log(`[session.moveToProject] error: ${d}`),t.id!==void 0&&this.sendError(t.id,y.INTERNAL_ERROR,`Move failed: ${d}`)}}Fe();function Nj(t){return t.length<=8?"****":`${t.slice(0,3)}***${t.slice(-4)}`}function tt(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 Fu(t,e){tt(t,e,rs)}function Lj(t){let e={};for(let r of t)for(let n of r.purposes)e[n]??=[],e[n].push(r);return e}async function Oj(){let t=D(),e=await jn(t);return t.save(),e}async function XR(t){try{return await Oj(),!0}catch(e){if(t)throw e;return!1}}function Hu(t=D()){try{return Sm()}catch{return t.getKnownProviderDef(Y)?.baseUrl??"https://www.qlogicagent.com"}}function Bu(t){return t.id===Y?Y:t.group?.trim()||t.id}function jj(t){return t.id===Bu(t)}function YR(t){let e=Bu(t);return wm({...t,id:e})}function $j(t){return t.authType==="none"?!1:t.apiKeyEnvVars===void 0||t.apiKeyEnvVars.length>0}function Uj(t){let e=new Map;for(let r of t){if(!$j(r))continue;let n=Bu(r);if(n===Y)continue;let o=r.models?.length??0,s=e.get(n);if(!s){e.set(n,{id:n,displayName:YR(r),baseUrl:ns(r)??"",modelCount:o});continue}s.modelCount+=o,jj(r)&&(s.displayName=YR(r),s.baseUrl=ns(r)??s.baseUrl)}return Array.from(e.values())}async function JR(t){let e=D(),r=e.getKeyForProvider(Y);if(!r){if(t)throw new Error("LLMRouter API Key is required to fetch available models.");return!1}let n=e.getProviderStatus(Y)?.baseUrl??Hu(e);try{if((await Oc(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 QR(t=!1){let e=D();if(!!e.getProviderStatus(Y)?.keys.length)return await JR(!1)?!0:XR(t);let o=e.getAllProviderStatus().filter(s=>s.keys.length>0).map(s=>s.providerId).some(s=>s!=="deepseek"&&s!==Y);return!t&&!o?!1:XR(t)}async function ZR(t){try{let e=D(),r=["deepseek",Y].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 Lc().catch(()=>[]),o=Uj(n);o.unshift({id:Y,displayName:Dc,baseUrl:Hu(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!==Y&&o.splice(i,1,s);continue}o.unshift(s)}t.id!==void 0&&this.sendResponse(t.id,{providers:o})}catch(e){tt(this,t,e instanceof Error?e.message:String(e))}}async function eS(t){let e=t.params;if(!e?.providerId||!e?.key){tt(this,t,"Required: providerId (string), key (string)",y.INVALID_PARAMS);return}let{providerId:r,key:n,label:o}=e,s=D(),i,a=!1;try{let c=await dS(r);if(!c){tt(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===Y&&(await Oc(s,{baseUrl:c,apiKey:n})).length===0)throw new Error("LLMRouter did not return any available models for this API Key.");for(let d of On)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:rs;tt(this,t,l)}}function tS(t){let e=t.params;if(!e?.keyId){tt(this,t,"Required: keyId (string)",y.INVALID_PARAMS);return}let r=D();r.removeKey(e.keyId),r.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}function rS(t){let e=t.params;if(!e?.keyId||typeof e.enabled!="boolean"){tt(this,t,"Required: keyId (string), enabled (boolean)",y.INVALID_PARAMS);return}let r=D();r.updateKey(e.keyId,{enabled:e.enabled}),r.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}function nS(t){let e=t.params;if(!e?.modelId||typeof e.enabled!="boolean"){tt(this,t,"Required: modelId (string), enabled (boolean)",y.INVALID_PARAMS);return}let r=D();e.enabled?r.enableModel(e.modelId):r.disableModel(e.modelId),r.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}async function oS(t){let e=t.params;try{await QR(!1);let r=D(),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:Lj(o),configuredProviderIds:[...n]})}catch{Fu(this,t)}}function sS(t){let e=t.params;if(!e?.purpose||!e?.modelId){tt(this,t,"Required: purpose (string), modelId (string)",y.INVALID_PARAMS);return}try{let r=D();r.setBinding(e.purpose,e.modelId),r.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(r){tt(this,t,r instanceof Error?r.message:String(r),y.INVALID_PARAMS)}}function iS(t){let e=t.params;if(!e?.purpose){tt(this,t,"Required: purpose (string)",y.INVALID_PARAMS);return}let r=D(),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 aS(t){try{await QR(!1);let e=D(),r=e.getAllProviderStatus().map(s=>({providerId:s.providerId,displayName:s.providerId===Y?Dc: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:Nj(i.key),enabled:i.enabled,health:i.healthStatus}))})),n=e.getAllBindings(),o={};for(let s of On){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{Fu(this,t)}}async function cS(t){try{let e=D();e.load(),await JR(!1)||await jn(e),e.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,catalogRefreshed:!0})}catch{Fu(this,t)}}async function lS(t){let e=t.params;if(!e?.providerId||!e?.apiKey){tt(this,t,"providerId and apiKey required",y.INVALID_PARAMS);return}try{let r=e.baseUrl||await dS(e.providerId);if(!r){tt(this,t,`Unknown provider: ${e.providerId}`,y.INVALID_PARAMS);return}let n=e.providerId===Y?Nc(r):`${r.replace(/\/$/,"")}/models`,o=await fetch(n,{method:"GET",headers:{Authorization:`Bearer ${e.apiKey}`},signal:AbortSignal.timeout(1e4)});if(o.ok){t.id!==void 0&&this.sendResponse(t.id,{valid:!0,status:o.status});return}let s=await o.text().catch(()=>"");t.id!==void 0&&this.sendResponse(t.id,{valid:!1,status:o.status,error:s.slice(0,500)})}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 dS(t){if(t===Y)return Hu();let e=D().getKnownProviderDef(t);if(e?.baseUrl)return e.baseUrl;let r=await Am(t);return r?ns(r):void 0}G();import*as ce from"node:fs";import*as Ne from"node:path";import{join as Fj}from"node:path";import{readFileSync as Hj,writeFileSync as Bj,mkdirSync as qj}from"node:fs";var qr=null,qu=!1;function uS(t){return Fj(t,"skill-stats.json")}function Wu(t){if(qr)return qr;try{qr=JSON.parse(Hj(uS(t),"utf8"))}catch{qr={}}return qr}function Wj(t){if(!(!qu||!qr))try{qj(t,{recursive:!0}),Bj(uS(t),JSON.stringify(qr,null,2),"utf8"),qu=!1}catch{}}function Gu(t,e,r){let n=Wu(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),qu=!0,Wj(t)}function pS(t,e){return Wu(t)[e]}function mS(t){return Wu(t)}import*as Bt from"node:fs";import*as Ni from"node:path";function Gj(t){try{let e=Bt.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 fS(t){let e=I(),r=[],n=t?e.getProjectSkillsDir(t):void 0,o=e.getUserSkillsDir();return n&&gS(r,n,"project"),gS(r,o,"global"),r}function gS(t,e,r){if(Bt.existsSync(e))for(let n of Bt.readdirSync(e)){let o=Ni.join(e,n);try{if(!Bt.statSync(o).isDirectory())continue}catch{continue}let s=Ni.join(o,"SKILL.md"),i=Ni.join(o,"SKILL.md.disabled"),a=Bt.existsSync(s)?s:null;if(!a&&!Bt.existsSync(i))continue;let c=a?Gj(a):{};t.push({id:`${r}:${n}`,name:n,path:o,active:!!a,scope:r,category:"automation",displayName:zj(n),displayDescription:Kj(n,c.description),fallbackName:n,fallbackDescription:c.description??"",systemGenerated:Vj(n),version:c.version,description:c.description})}}function zj(t){return{key:`capability.skill.${t}.name`,fallback:t}}function Kj(t,e){return{key:`capability.skill.${t}.description`,fallback:e??""}}function Vj(t){return t.startsWith("auto-skill-")||t.startsWith("test-skill-")}function Xj(t){return t==="active"||t==="stale"||t==="archived"}function hS(t){let r=t.params?.projectId,n=this.getActiveProjectRoot();if(r&&this.projectLocator){let s=this.projectLocator.resolveProjectRoot(r);s&&(n=s)}let o=fS(n);t.id!==void 0&&this.sendResponse(t.id,{skills:o})}function yS(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?ir(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=Ne.join(o,r),i=Ne.join(s,"SKILL.md.disabled"),a=Ne.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=B(),l=ue(c),d=It(l,r);d.state!=="active"&&(d.state="active",d.staleAt=void 0,d.archivedAt=void 0),he(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 vS(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?ir(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=Ne.join(o,r),i=Ne.join(s,"SKILL.md"),a=Ne.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 bS(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=B(),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=Ne.join(sr(),r);else{let a=this.getActiveProjectRoot(),c=a?ir(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=Ne.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}),gt(),$s(o,r),he(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 kS(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?ir(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=Ne.join(o,r),i=Ne.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=sr(),c=Ne.join(a,r);try{ce.mkdirSync(c,{recursive:!0});let l=ce.readdirSync(s);for(let d of l){let p=ce.readFileSync(Ne.join(s,d));ce.writeFileSync(Ne.join(c,d),p)}e?.keepLocal||ce.rmSync(s,{recursive:!0,force:!0}),gt(),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 RS(t){let e=t.params,r=B();if(e?.name){let n=pS(r,e.name);t.id!==void 0&&this.sendResponse(t.id,{name:e.name,stats:n??null})}else{let n=mS(r);t.id!==void 0&&this.sendResponse(t.id,{stats:n})}}function SS(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=B(),n=ue(r);It(n,e.name),uh(n,e.name),he(r,n),t.id!==void 0&&this.sendResponse(t.id,{name:e.name,pinned:!0})}function TS(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=B(),n=ue(r);ph(n,e.name),he(r,n),t.id!==void 0&&this.sendResponse(t.id,{name:e.name,pinned:!1})}function wS(t){let e=B(),r=this.getActiveProjectRoot(),n=r?Ne.join(r,".qlogicagent","skills"):sr(),o=mh(e,n);o.transitioned.length>0&&gt(),t.id!==void 0&&this.sendResponse(t.id,o)}function AS(t){let e=t.params,r=B(),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(!Xj(e.state)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Invalid skill lifecycle state"});return}let o=gh(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 ES from"node:path";import{randomUUID as t$}from"node:crypto";import{join as zu}from"node:path";import{mkdir as Yj,readdir as Jj}from"node:fs/promises";function Qj(t){return t?.pathService??I()}function Zj(t,e){return t??e.getActiveProjectRoot()}function PS(t,e){let r=Qj(e);return zu(r.getProjectAgentDir(Zj(t,r)),"solos")}function Ku(t,e,r){return zu(PS(e,r),t)}function xS(t,e,r){return zu(Ku(t,e,r),"solo-state.json")}async function CS(t,e,r){let n=Ku(t.soloId,e,r);await Yj(n,{recursive:!0}),await mr(xS(t.soloId,e,r),t)}async function e$(t,e,r){return Zt(xS(t,e,r))}async function IS(t,e){let r=PS(t,e),n;try{n=await Jj(r)}catch{return[]}let o=[];for(let s of n){let i=await e$(s,t,e);i&&o.push(i)}return o}async function Vu(t,e,r){let{rm:n}=await import("node:fs/promises"),o=Ku(t,e,r);try{return await n(o,{recursive:!0,force:!0}),!0}catch{return!1}}var Li=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};CS(r,e.cwd).catch(()=>{})}async restoreFromDisk(e){let r=await IS(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),Vu(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 To(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>
547
547
  ${s.rules.join(`
548
548
  `)}
549
549
  </rules>`),s.memory?.length&&u.push(`<memory>
@@ -553,12 +553,12 @@ ${s.memory.join(`
553
553
 
554
554
  `)}
555
555
 
556
- ${r}`)}let c=`solo-${e$().slice(0,8)}`,l={soloId:c,state:"running",task:r,cwd:o,gitRoot:i,agents:[],createdAt:Date.now()};this.sessions.set(c,l),this.persistSession(l),this.callbacks.log?.info(`[solo] starting ${c} with ${n.length} agents`);let d=n.map(async(u,m)=>{let f=`${c}-${u}-${m}`,g=`solo/${f}`,h=`${c}:${u}:${m}`,b;try{b=await Ci(i,f)}catch(R){this.callbacks.log?.warn(`[solo] worktree creation failed for ${u}: ${R instanceof Error?R.message:String(R)}`);let S={agentId:u,memberId:h,worktreePath:"",worktreeBranch:g,state:"failed",error:`Worktree creation failed: ${R instanceof Error?R.message:String(R)}`,turns:[]};l.agents.push(S);return}let v={agentId:u,memberId:h,worktreePath:b,worktreeBranch:g,state:"pending",turns:[]};l.agents.push(v);try{v.state="running",this.callbacks.onProgress?.(c,u,"running");let R=this.acpDetector.buildExternalDescriptor(u);if(!R)throw new Error(`Agent ${u} is not available or not ACP-compatible`);await this.processManager.spawn({memberId:h,name:`solo-${u}`,cwd:b,prompt:a,external:R});let S=this.processManager.getHandle(h);if(!S||S.state!=="ready")throw new Error(`Agent ${u} spawn did not reach ready state`);let T=await this.processManager.sendTask(h,a);v.state="completed",v.resultText=typeof T=="string"?T:JSON.stringify(T),v.diff=await Mu(b),v.turns.push({role:"user",content:r,timestamp:Date.now()}),v.turns.push({role:"agent",content:v.resultText,timestamp:Date.now()});let C=this.processManager.getUsageTracker(h);if(C?.hasData()){let E=C.getUsage();v.usage={inputTokens:E.inputTokens,outputTokens:E.outputTokens}}this.callbacks.onProgress?.(c,u,"completed"),v.diff&&this.callbacks.onAgentDiff?.(c,u,[{path:".",hunks:v.diff}]),v.usage&&this.callbacks.onAgentUsage?.(c,u,v.usage.inputTokens,v.usage.outputTokens),this.callbacks.log?.info(`[solo] ${u} completed (diff: ${v.diff?"yes":"none"})`)}catch(R){v.state="failed",v.error=R instanceof Error?R.message:String(R),this.callbacks.onProgress?.(c,u,"failed",v.error),this.callbacks.log?.warn(`[solo] ${u} failed: ${v.error}`)}});await Promise.allSettled(d);let p=l.agents.filter(u=>u.state==="completed");if(p.length===0)return l.state="failed",this.persistSession(l),this.callbacks.log?.warn(`[solo] all agents failed for ${c}`),c;for(let u of l.agents)u.state==="completed"&&(u.state="idle");return this.persistSession(l),this.callbacks.log?.info(`[solo] ${p.length}/${l.agents.length} agents ready for interaction`),c}async message(e,r,n,o){let s=this.sessions.get(e);if(!s)throw new Error(`Solo session ${e} not found`);if(s.state!=="running")throw new Error(`Solo session ${e} is not active (state: ${s.state})`);let i=s.agents.filter(l=>l.agentId===r),a=o!==void 0?i[o]:i[0];if(!a)throw new Error(`Agent ${r} not found in solo session ${e}`);if(!["idle","completed"].includes(a.state))throw new Error(`Agent ${r} is not ready for messages (state: ${a.state})`);a.turns.push({role:"user",content:n,timestamp:Date.now()}),a.state="running",this.callbacks.onProgress?.(e,r,"running");try{let l=await this.processManager.sendTask(a.memberId,n),d=typeof l=="string"?l:l?.content??JSON.stringify(l);a.turns.push({role:"agent",content:d,timestamp:Date.now()}),a.resultText=d,a.diff=await Mu(a.worktreePath),a.state="idle";let p=this.processManager.getUsageTracker(a.memberId);if(p?.hasData()){let u=p.getUsage();a.usage={inputTokens:u.inputTokens,outputTokens:u.outputTokens}}return this.callbacks.onProgress?.(e,r,"idle"),this.persistSession(s),{resultText:d}}catch(l){throw a.state="failed",a.error=l instanceof Error?l.message:String(l),this.callbacks.onProgress?.(e,r,"failed",a.error),this.persistSession(s),l}}async triggerEvaluation(e,r,n){let o=this.sessions.get(e);if(!o)throw new Error(`Solo session ${e} not found`);let s=o.agents.filter(c=>c.state==="completed"||c.state==="idle");if(s.length===0)throw new Error(`No agents have completed work in session ${e}`);let i=o.agents.filter(c=>c.agentId===r),a=n!==void 0?i[n]:i[0];if(!a)throw new Error(`Evaluator agent ${r} not found in session ${e}`);if(a.state!=="idle"&&a.state!=="completed")throw new Error(`Evaluator agent ${r} is not ready (state: ${a.state})`);o.state="evaluating",this.callbacks.log?.info(`[solo] user-triggered evaluation for ${e} by ${r} (${s.length} candidates)`);try{let c=await this.evaluate(o,s,a);return o.evaluation=c,o.state="running",this.callbacks.onEvaluation?.(e,c),this.persistSession(o),c}catch(c){throw o.state="running",this.persistSession(o),new Error(`Evaluation failed: ${c instanceof Error?c.message:String(c)}`)}}getStatus(e){let r=this.sessions.get(e);return r?{soloId:r.soloId,state:r.state,agents:r.agents.map(n=>({id:n.agentId,state:n.state,progress:n.state==="running"?"Working...":void 0,resultText:n.resultText,diff:n.diff,usage:n.usage,error:n.error,worktreePath:n.worktreePath})),evaluation:r.evaluation}:null}async cancel(e){let r=this.sessions.get(e);if(!r)throw new Error(`Solo session ${e} not found`);if(r.state!=="running"&&r.state!=="evaluating")throw new Error(`Solo session ${e} is not running (state: ${r.state})`);r.state="cancelled";for(let n of r.agents)if(n.state==="running"||n.state==="pending"||n.state==="idle"){n.state="failed",n.error="Cancelled by user";try{this.processManager.kill(n.memberId)}catch{}}await this.cleanupWorktrees(r),this.callbacks.log?.info(`[solo] cancelled ${e}`)}async select(e){let r=this.sessions.get(e.soloId);if(!r)throw new Error(`Solo session ${e.soloId} not found`);if(r.state!=="completed"&&r.state!=="running")throw new Error(`Solo session ${e.soloId} is not ready for selection (state: ${r.state})`);let n=r.agents.find(s=>s.agentId===e.winnerId&&(s.state==="completed"||s.state==="idle"));if(!n)throw new Error(`Agent ${e.winnerId} is not a completed participant in ${e.soloId}`);let o=await Ok(r.gitRoot,n.worktreeBranch);return this.callbacks.log?.info(`[solo] merged ${n.worktreeBranch}: ${o}`),r.state="completed",await this.cleanupWorktrees(r),this.persistSession(r),n.worktreeBranch}listSessions(){return[...this.sessions.values()].map(e=>this.getStatus(e.soloId))}async delete(e){let r=this.sessions.get(e);if(!r)throw new Error(`Solo session ${e} not found`);if(r.state==="running"||r.state==="evaluating"){r.state="cancelled";for(let n of r.agents)if(n.state==="running"||n.state==="pending"||n.state==="idle"){n.state="failed",n.error="Deleted";try{this.processManager.kill(n.memberId)}catch{}}await this.cleanupWorktrees(r)}this.sessions.delete(e),await Vu(e,r?.cwd),this.callbacks.log?.info(`[solo] deleted ${e}`)}async evaluate(e,r,n){if(r.length===1)return{winnerId:r[0].agentId,reasoning:`Only one agent (${r[0].agentId}) completed successfully.`};let o=["# Task Evaluation","","## Original Task",e.task,"","## Agent Results",""];for(let a of r)o.push(`### Agent: ${a.agentId}`,"","**Result:**",a.resultText??"(no output)","","**Changes (git diff stat):**",a.diff||"(no changes)","");o.push("## Instructions","","Review all agent results above. Select the best implementation and explain your reasoning.","Respond in this exact format:","","WINNER: <agent-id>","REASONING: <your explanation>");let s=o.join(`
556
+ ${r}`)}let c=`solo-${t$().slice(0,8)}`,l={soloId:c,state:"running",task:r,cwd:o,gitRoot:i,agents:[],createdAt:Date.now()};this.sessions.set(c,l),this.persistSession(l),this.callbacks.log?.info(`[solo] starting ${c} with ${n.length} agents`);let d=n.map(async(u,m)=>{let f=`${c}-${u}-${m}`,g=`solo/${f}`,h=`${c}:${u}:${m}`,b;try{b=await Ci(i,f)}catch(R){this.callbacks.log?.warn(`[solo] worktree creation failed for ${u}: ${R instanceof Error?R.message:String(R)}`);let S={agentId:u,memberId:h,worktreePath:"",worktreeBranch:g,state:"failed",error:`Worktree creation failed: ${R instanceof Error?R.message:String(R)}`,turns:[]};l.agents.push(S);return}let v={agentId:u,memberId:h,worktreePath:b,worktreeBranch:g,state:"pending",turns:[]};l.agents.push(v);try{v.state="running",this.callbacks.onProgress?.(c,u,"running");let R=this.acpDetector.buildExternalDescriptor(u);if(!R)throw new Error(`Agent ${u} is not available or not ACP-compatible`);await this.processManager.spawn({memberId:h,name:`solo-${u}`,cwd:b,prompt:a,external:R});let S=this.processManager.getHandle(h);if(!S||S.state!=="ready")throw new Error(`Agent ${u} spawn did not reach ready state`);let T=await this.processManager.sendTask(h,a);v.state="completed",v.resultText=typeof T=="string"?T:JSON.stringify(T),v.diff=await Mu(b),v.turns.push({role:"user",content:r,timestamp:Date.now()}),v.turns.push({role:"agent",content:v.resultText,timestamp:Date.now()});let C=this.processManager.getUsageTracker(h);if(C?.hasData()){let E=C.getUsage();v.usage={inputTokens:E.inputTokens,outputTokens:E.outputTokens}}this.callbacks.onProgress?.(c,u,"completed"),v.diff&&this.callbacks.onAgentDiff?.(c,u,[{path:".",hunks:v.diff}]),v.usage&&this.callbacks.onAgentUsage?.(c,u,v.usage.inputTokens,v.usage.outputTokens),this.callbacks.log?.info(`[solo] ${u} completed (diff: ${v.diff?"yes":"none"})`)}catch(R){v.state="failed",v.error=R instanceof Error?R.message:String(R),this.callbacks.onProgress?.(c,u,"failed",v.error),this.callbacks.log?.warn(`[solo] ${u} failed: ${v.error}`)}});await Promise.allSettled(d);let p=l.agents.filter(u=>u.state==="completed");if(p.length===0)return l.state="failed",this.persistSession(l),this.callbacks.log?.warn(`[solo] all agents failed for ${c}`),c;for(let u of l.agents)u.state==="completed"&&(u.state="idle");return this.persistSession(l),this.callbacks.log?.info(`[solo] ${p.length}/${l.agents.length} agents ready for interaction`),c}async message(e,r,n,o){let s=this.sessions.get(e);if(!s)throw new Error(`Solo session ${e} not found`);if(s.state!=="running")throw new Error(`Solo session ${e} is not active (state: ${s.state})`);let i=s.agents.filter(l=>l.agentId===r),a=o!==void 0?i[o]:i[0];if(!a)throw new Error(`Agent ${r} not found in solo session ${e}`);if(!["idle","completed"].includes(a.state))throw new Error(`Agent ${r} is not ready for messages (state: ${a.state})`);a.turns.push({role:"user",content:n,timestamp:Date.now()}),a.state="running",this.callbacks.onProgress?.(e,r,"running");try{let l=await this.processManager.sendTask(a.memberId,n),d=typeof l=="string"?l:l?.content??JSON.stringify(l);a.turns.push({role:"agent",content:d,timestamp:Date.now()}),a.resultText=d,a.diff=await Mu(a.worktreePath),a.state="idle";let p=this.processManager.getUsageTracker(a.memberId);if(p?.hasData()){let u=p.getUsage();a.usage={inputTokens:u.inputTokens,outputTokens:u.outputTokens}}return this.callbacks.onProgress?.(e,r,"idle"),this.persistSession(s),{resultText:d}}catch(l){throw a.state="failed",a.error=l instanceof Error?l.message:String(l),this.callbacks.onProgress?.(e,r,"failed",a.error),this.persistSession(s),l}}async triggerEvaluation(e,r,n){let o=this.sessions.get(e);if(!o)throw new Error(`Solo session ${e} not found`);let s=o.agents.filter(c=>c.state==="completed"||c.state==="idle");if(s.length===0)throw new Error(`No agents have completed work in session ${e}`);let i=o.agents.filter(c=>c.agentId===r),a=n!==void 0?i[n]:i[0];if(!a)throw new Error(`Evaluator agent ${r} not found in session ${e}`);if(a.state!=="idle"&&a.state!=="completed")throw new Error(`Evaluator agent ${r} is not ready (state: ${a.state})`);o.state="evaluating",this.callbacks.log?.info(`[solo] user-triggered evaluation for ${e} by ${r} (${s.length} candidates)`);try{let c=await this.evaluate(o,s,a);return o.evaluation=c,o.state="running",this.callbacks.onEvaluation?.(e,c),this.persistSession(o),c}catch(c){throw o.state="running",this.persistSession(o),new Error(`Evaluation failed: ${c instanceof Error?c.message:String(c)}`)}}getStatus(e){let r=this.sessions.get(e);return r?{soloId:r.soloId,state:r.state,agents:r.agents.map(n=>({id:n.agentId,state:n.state,progress:n.state==="running"?"Working...":void 0,resultText:n.resultText,diff:n.diff,usage:n.usage,error:n.error,worktreePath:n.worktreePath})),evaluation:r.evaluation}:null}async cancel(e){let r=this.sessions.get(e);if(!r)throw new Error(`Solo session ${e} not found`);if(r.state!=="running"&&r.state!=="evaluating")throw new Error(`Solo session ${e} is not running (state: ${r.state})`);r.state="cancelled";for(let n of r.agents)if(n.state==="running"||n.state==="pending"||n.state==="idle"){n.state="failed",n.error="Cancelled by user";try{this.processManager.kill(n.memberId)}catch{}}await this.cleanupWorktrees(r),this.callbacks.log?.info(`[solo] cancelled ${e}`)}async select(e){let r=this.sessions.get(e.soloId);if(!r)throw new Error(`Solo session ${e.soloId} not found`);if(r.state!=="completed"&&r.state!=="running")throw new Error(`Solo session ${e.soloId} is not ready for selection (state: ${r.state})`);let n=r.agents.find(s=>s.agentId===e.winnerId&&(s.state==="completed"||s.state==="idle"));if(!n)throw new Error(`Agent ${e.winnerId} is not a completed participant in ${e.soloId}`);let o=await Ok(r.gitRoot,n.worktreeBranch);return this.callbacks.log?.info(`[solo] merged ${n.worktreeBranch}: ${o}`),r.state="completed",await this.cleanupWorktrees(r),this.persistSession(r),n.worktreeBranch}listSessions(){return[...this.sessions.values()].map(e=>this.getStatus(e.soloId))}async delete(e){let r=this.sessions.get(e);if(!r)throw new Error(`Solo session ${e} not found`);if(r.state==="running"||r.state==="evaluating"){r.state="cancelled";for(let n of r.agents)if(n.state==="running"||n.state==="pending"||n.state==="idle"){n.state="failed",n.error="Deleted";try{this.processManager.kill(n.memberId)}catch{}}await this.cleanupWorktrees(r)}this.sessions.delete(e),await Vu(e,r?.cwd),this.callbacks.log?.info(`[solo] deleted ${e}`)}async evaluate(e,r,n){if(r.length===1)return{winnerId:r[0].agentId,reasoning:`Only one agent (${r[0].agentId}) completed successfully.`};let o=["# Task Evaluation","","## Original Task",e.task,"","## Agent Results",""];for(let a of r)o.push(`### Agent: ${a.agentId}`,"","**Result:**",a.resultText??"(no output)","","**Changes (git diff stat):**",a.diff||"(no changes)","");o.push("## Instructions","","Review all agent results above. Select the best implementation and explain your reasoning.","Respond in this exact format:","","WINNER: <agent-id>","REASONING: <your explanation>");let s=o.join(`
557
557
  `),i=n.memberId;try{let a=await this.processManager.sendTask(i,s),c=typeof a=="string"?a:JSON.stringify(a);return this.parseEvaluationResponse(c,r)}catch{return{winnerId:r[0].agentId,reasoning:"Evaluation failed; defaulting to first completed agent."}}}parseEvaluationResponse(e,r){let n=e.match(/WINNER:\s*(\S+)/i),o=e.match(/REASONING:\s*(.+)/is),s=r.map(a=>a.agentId),i=n?.[1];if(i&&s.includes(i))return{winnerId:i,reasoning:o?.[1]?.trim()||"Selected by leader evaluation."};for(let a of s)if(e.includes(a))return{winnerId:a,reasoning:o?.[1]?.trim()||e.slice(0,500)};return{winnerId:r[0].agentId,reasoning:`Could not parse evaluation. Full response: ${e.slice(0,500)}`}}async cleanupWorktrees(e){for(let r of e.agents)if(r.worktreePath)try{try{this.processManager.kill(r.memberId)}catch{}this.processManager.remove(r.memberId),await Lk(e.gitRoot,r.worktreePath)}catch(n){this.callbacks.log?.warn(`[solo] failed to clean worktree for ${r.agentId}: ${n instanceof Error?n.message:String(n)}`)}}};G();function Ve(){if(!this.soloEvaluator){let t=new dt({log:{info:r=>process.stderr.write(`[solo:pm] ${r}
558
558
  `),warn:r=>process.stderr.write(`[solo:pm] WARN ${r}
559
559
  `)},onNotification:(r,n,o)=>{(n==="agents.error"||n==="agents.status")&&this.sendNotification(n,o),this.sendNotification("team.member.notification",{memberId:r,method:n,params:o})},onStateChange:(r,n)=>{let o=t.getHandle(r),i=t.getUsageTracker(r)?.getUsage();this.emitAgentStatus(r,n,{missedBeats:t.getMissedBeats(r),lastActivityAt:o?.lastActivityAt,usage:i&&i.totalTokens>0?{inputTokens:i.inputTokens,outputTokens:i.outputTokens,totalTokens:i.totalTokens}:void 0})},onMcpToolCall:(r,n,o)=>this.handleMcpToolCall(r,n,o),sessionDir:ES.join(X(),"agent-logs")}),e={log:{info:r=>process.stderr.write(`${r}
560
560
  `),warn:r=>process.stderr.write(`${r}
561
- `)},onProgress:(r,n,o,s)=>{this.sendNotification("solo.progress",{soloId:r,agentId:n,state:o,progress:s})},onEvaluation:(r,n)=>{this.sendNotification("solo.evaluation",{soloId:r,winnerId:n.winnerId,reasoning:n.reasoning})},onAgentDelta:(r,n,o)=>{this.sendNotification("solo.agentDelta",{soloId:r,agentId:n,text:o})},onAgentDiff:(r,n,o)=>{this.sendNotification("solo.agentDiff",{soloId:r,agentId:n,files:o})},onAgentUsage:(r,n,o,s)=>{this.sendNotification("solo.agentUsage",{soloId:r,agentId:n,inputTokens:o,outputTokens:s})}};this.soloEvaluator=new Li(t,this.acpDetector,this.agentConfigStore,e),this.soloProcessManager=t}return this.soloEvaluator}async function MS(t){try{let e=t.params;if(!e?.task||!e?.agents||!e?.cwd){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"task, agents, and cwd are required."});return}let r=e;if(!r.projectId){let i=ne();i&&(r.projectId=i.id)}let n=Ve.call(this),o=await n.start(r),s=n.getStatus(o);t.id!==void 0&&this.sendResponse(t.id,s)}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function _S(t){try{let e=t.params;if(!e?.soloId){this.soloEvaluator?t.id!==void 0&&this.sendResponse(t.id,this.soloEvaluator.listSessions()):t.id!==void 0&&this.sendResponse(t.id,[]);return}let n=Ve.call(this).getStatus(e.soloId);if(!n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:`Solo session ${e.soloId} not found.`});return}t.id!==void 0&&this.sendResponse(t.id,n)}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function DS(t){try{let e=t.params;if(!e?.soloId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"soloId is required."});return}await Ve.call(this).cancel(e.soloId),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function NS(t){try{let e=t.params;if(!e?.soloId||!e?.winnerId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"soloId and winnerId are required."});return}let n=await Ve.call(this).select(e);t.id!==void 0&&this.sendResponse(t.id,{ok:!0,mergedBranch:n})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}function LS(t){try{this.soloEvaluator?t.id!==void 0&&this.sendResponse(t.id,this.soloEvaluator.listSessions()):t.id!==void 0&&this.sendResponse(t.id,[])}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function OS(t){try{let e=t.params;if(!e?.soloId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"soloId is required."});return}await Ve.call(this).delete(e.soloId),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function jS(t){try{let e=t.params;if(!e?.soloId||!e?.agentId||!e?.content){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"soloId, agentId, and content are required."});return}let n=await Ve.call(this).message(e.soloId,e.agentId,e.content,e.agentIndex);t.id!==void 0&&this.sendResponse(t.id,n)}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function $S(t){try{let e=t.params;if(!e?.soloId||!e?.evaluatorAgentId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"soloId and evaluatorAgentId are required."});return}let n=await Ve.call(this).triggerEvaluation(e.soloId,e.evaluatorAgentId,e.evaluatorIndex);t.id!==void 0&&this.sendResponse(t.id,n)}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}import{randomUUID as EU}from"node:crypto";import{createHash as t$}from"node:crypto";function US(t,e){let r=e?.context?.trim();return r?[{role:"system",content:r},...t]:t}function FS(t){let e=t$("sha256").update(t.context??"").digest("hex");return{id:t.id,name:t.name,source:t.source,contextHash:`sha256:${e}`,enabledSkills:[...t.enabledSkills],disabledBuiltinSkills:[...t.disabledBuiltinSkills]}}Fe();import{randomUUID as v$}from"node:crypto";var Sn=class{mode;rules;defaultBehavior;compiledPatterns;constructor(e){this.mode=e.mode,this.rules=[...e.rules],this.defaultBehavior=e.defaultBehavior,this.compiledPatterns=this.compileRules(this.rules)}getMode(){return this.mode}setMode(e){this.mode=e}getRules(){return this.rules}getDefaultBehavior(){return this.defaultBehavior}replaceRules(e){this.rules=[...e],this.compiledPatterns=this.compileRules(this.rules)}setDefaultBehavior(e){this.defaultBehavior=e}addRule(e){this.rules.push(e),this.compiledPatterns=this.compileRules(this.rules)}check(e){let{toolName:r,meta:n}=e;if(this.mode==="full_access")return{behavior:"allow",decisionReason:{type:"mode",mode:"full_access"}};for(let{rule:s,regex:i}of this.compiledPatterns)if(i.test(r))return n$(s,e);let o=i$(n);return o==="read"?{behavior:"allow",decisionReason:{type:"tool_check",reason:"risk:read"}}:n?.requiresApproval?{behavior:"ask",message:`Tool "${r}" requires approval`,toolName:r,input:e.arguments,decisionReason:{type:"tool_check",reason:"requiresApproval"}}:o==="system"||o==="external_egress"?{behavior:"ask",message:`Tool "${r}" requires approval (${o})`,toolName:r,input:e.arguments,decisionReason:{type:"tool_check",reason:`risk:${o}`}}:this.defaultBehavior==="allow"?{behavior:"allow"}:this.defaultBehavior==="deny"?{behavior:"deny",message:`Tool "${r}" denied by default policy`,decisionReason:{type:"other",reason:"default_deny"}}:{behavior:"ask",message:`Tool "${r}" requires approval (default policy)`,toolName:r,input:e.arguments}}compileRules(e){return e.map(r=>({rule:r,regex:r$(r.pattern)}))}};function Oi(t){if(!t||typeof t!="object")return{mode:"default",rules:[],defaultBehavior:"ask"};let e=t;return s$(e),{mode:o$(e.mode).mode,rules:[],defaultBehavior:"ask"}}function r$(t){let r=t.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*+/g,".*");return new RegExp(`^${r}$`,"i")}function n$(t,e){let r={type:"rule",rule:t};return t.behavior==="allow"?{behavior:"allow",decisionReason:r}:t.behavior==="deny"?{behavior:"deny",message:t.reason??`Tool "${e.toolName}" denied by rule "${t.pattern}"`,decisionReason:r}:{behavior:"ask",message:t.reason??`Tool "${e.toolName}" requires approval (rule "${t.pattern}")`,toolName:e.toolName,input:e.arguments,decisionReason:r}}function o$(t){if(t==="default"||t==="auto"||t==="full_access")return{mode:t};if(typeof t=="string")throw new Error(`Invalid permission mode: ${t}`);return{mode:"default"}}function s$(t){if("default"in t)throw new Error("Legacy permissions.default is not supported");for(let e of["allow","deny","ask"])if(e in t)throw new Error(`Legacy permission ${e} arrays are not supported`)}function i$(t){return t?.riskLevel?t.riskLevel:t?.isReadOnly?"read":t?.isDangerous?"system":"write"}var a$=new Set(["nodeversion","npmversion","npxversion","pnpmversion","yarnversion","bunversion","denoversion","pythonversion","python3version","pipversion","rubyversion","go version","rustcversion","cargoversion","java -version","javac -version","dotnetversion","gccversion","g++version","clangversion","gitversion","dockerversion","--help","-h"]),HS=new Set(["ls","dir","find","fd","locate","which","where","type","cat","head","tail","less","more","bat","wc","file","stat","du","df","tree","exa","eza","grep","rg","ripgrep","ag","ack","fgrep","egrep","git status","git log","git diff","git show","git branch","git tag","git remote","git stash list","git blame","git shortlog","git describe","git rev-parse","git ls-files","git ls-tree","git cat-file","git reflog","ps","top","htop","uptime","uname","hostname","whoami","id","env","printenv","echo","ping","nslookup","dig","host","ifconfig","ip","netstat","ss","npm list","npm ls","npm info","npm view","npm outdated","npm audit","pnpm list","pnpm ls","pnpm outdated","pip list","pip show","pip freeze","cargo tree","npm test","npm run test","npm run build","npm run lint","pnpm test","pnpm run test","pnpm run build","pnpm run lint","yarn test","yarn build","yarn lint","cargo test","cargo build","cargo check","cargo clippy","go test","go build","go vet","make","cmake","pytest","python -m pytest","python3 -m pytest","jest","vitest","mocha","tsc","tscnoEmit","eslint","prettier","oxlint"]),c$=[/\brm\s+-rf?\s+[/~]/,/\brm\s+-rf?\s+\.\.\//,/\bsudo\b/,/\bsu\s/,/\bchmod\s+777\b/,/\bmkfs\b/,/\bfdisk\b/,/\bdd\s+if=/,/\bsystemctl\s+(start|stop|restart|enable|disable)\b/,/\bservice\s+\S+\s+(start|stop|restart)\b/,/\breg\s+(add|delete)\b/i,/\\Windows\\System32/i,/\/etc\/(passwd|shadow|sudoers|fstab)/,/\bgit\s+push\s+.*--force\b/,/\bgit\s+push\s+-f\b/,/\bcurl\b.*(-H|--header)\s+.*[Aa]uthorization/,/\bwget\b.*--header.*[Aa]uthorization/,/\bcurl\b.*\|\s*(sh|bash|zsh)\b/,/\bwget\b.*-O\s*-\s*\|\s*(sh|bash|zsh)\b/,/\bnpm\s+install\s+-g\b/,/\bpip\s+install\b(?!.*-r\b)(?!.*requirements)/,/\bDROP\s+(DATABASE|TABLE|SCHEMA)\b/i,/\bTRUNCATE\s+TABLE\b/i],BS=new Set(["npm install","npm i","npm ci","pnpm install","pnpm i","yarn install","yarn","pip install -r","pip install -e","cargo build","cargo install","go mod download","go get","bundle install","composer install","git add","git commit","git stash","git checkout","git switch","git merge","git rebase","git cherry-pick","git pull","git fetch","docker build","docker compose","mkdir","touch","cp"]);function qS(t,e,r){let n=t.trim();if(!n)return{decision:"allow",reason:"empty command"};let o=Ad(n)??Pd(n)??void 0;for(let l of c$)if(l.test(n))return{decision:"deny",reason:`matches dangerous pattern: ${l.source}`,destructiveWarning:o};for(let l of a$)if(n===l||n.startsWith(l+" "))return{decision:"allow",reason:`known safe command: ${l}`,destructiveWarning:o};let s=n.split(/\s+/),i=s[0],a=s.length>1?`${s[0]} ${s[1]}`:i;return HS.has(i)||HS.has(a)?{decision:"allow",reason:`known safe command: ${i}`,destructiveWarning:o}:e&&r&&e.startsWith(r)&&(BS.has(i)||BS.has(a))?{decision:"allow",reason:`safe in project: ${a}`,destructiveWarning:o}:{decision:"defer",reason:"unknown command \u2014 needs LLM classification",destructiveWarning:o}}function l$(t){let e=Object.keys(t).sort(),r={};for(let n of e){let o=t[n];typeof o=="string"?r[n]=o.replace(/\s+/g," ").trim():r[n]=o}return JSON.stringify(r)}function Xu(t,e){return`${t}::${l$(e)}`}var d$=500,ji=class{cache=new Map;get(e,r){let n=Xu(e,r),o=this.cache.get(n);if(o)return o.hitCount++,o}set(e,r,n){if(this.cache.size>=d$){let s=this.cache.keys().next().value;s!==void 0&&this.cache.delete(s)}let o=Xu(e,r);this.cache.set(o,{shouldBlock:n.shouldBlock,reason:n.reason,classifiedAt:Date.now(),hitCount:0})}has(e,r){return this.cache.has(Xu(e,r))}clear(){this.cache.clear()}get size(){return this.cache.size}get totalHits(){let e=0;for(let r of this.cache.values())e+=r.hitCount;return e}};var u$=new Set(["read","search","instructions","think","task","memory","skill","tool_search","plan_mode","lsp","brief","web_search","image_generate","video_generate","music_generate","tts","three_d_generate","checkpoint"]);function Ao(t){return u$.has(t)}var WS=`You are a security classifier for an AI coding agent. Your job is to decide whether a tool invocation is safe to execute without user confirmation.
561
+ `)},onProgress:(r,n,o,s)=>{this.sendNotification("solo.progress",{soloId:r,agentId:n,state:o,progress:s})},onEvaluation:(r,n)=>{this.sendNotification("solo.evaluation",{soloId:r,winnerId:n.winnerId,reasoning:n.reasoning})},onAgentDelta:(r,n,o)=>{this.sendNotification("solo.agentDelta",{soloId:r,agentId:n,text:o})},onAgentDiff:(r,n,o)=>{this.sendNotification("solo.agentDiff",{soloId:r,agentId:n,files:o})},onAgentUsage:(r,n,o,s)=>{this.sendNotification("solo.agentUsage",{soloId:r,agentId:n,inputTokens:o,outputTokens:s})}};this.soloEvaluator=new Li(t,this.acpDetector,this.agentConfigStore,e),this.soloProcessManager=t}return this.soloEvaluator}async function MS(t){try{let e=t.params;if(!e?.task||!e?.agents||!e?.cwd){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"task, agents, and cwd are required."});return}let r=e;if(!r.projectId){let i=ne();i&&(r.projectId=i.id)}let n=Ve.call(this),o=await n.start(r),s=n.getStatus(o);t.id!==void 0&&this.sendResponse(t.id,s)}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function _S(t){try{let e=t.params;if(!e?.soloId){this.soloEvaluator?t.id!==void 0&&this.sendResponse(t.id,this.soloEvaluator.listSessions()):t.id!==void 0&&this.sendResponse(t.id,[]);return}let n=Ve.call(this).getStatus(e.soloId);if(!n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:`Solo session ${e.soloId} not found.`});return}t.id!==void 0&&this.sendResponse(t.id,n)}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function DS(t){try{let e=t.params;if(!e?.soloId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"soloId is required."});return}await Ve.call(this).cancel(e.soloId),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function NS(t){try{let e=t.params;if(!e?.soloId||!e?.winnerId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"soloId and winnerId are required."});return}let n=await Ve.call(this).select(e);t.id!==void 0&&this.sendResponse(t.id,{ok:!0,mergedBranch:n})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}function LS(t){try{this.soloEvaluator?t.id!==void 0&&this.sendResponse(t.id,this.soloEvaluator.listSessions()):t.id!==void 0&&this.sendResponse(t.id,[])}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function OS(t){try{let e=t.params;if(!e?.soloId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"soloId is required."});return}await Ve.call(this).delete(e.soloId),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function jS(t){try{let e=t.params;if(!e?.soloId||!e?.agentId||!e?.content){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"soloId, agentId, and content are required."});return}let n=await Ve.call(this).message(e.soloId,e.agentId,e.content,e.agentIndex);t.id!==void 0&&this.sendResponse(t.id,n)}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function $S(t){try{let e=t.params;if(!e?.soloId||!e?.evaluatorAgentId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"soloId and evaluatorAgentId are required."});return}let n=await Ve.call(this).triggerEvaluation(e.soloId,e.evaluatorAgentId,e.evaluatorIndex);t.id!==void 0&&this.sendResponse(t.id,n)}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}import{randomUUID as MU}from"node:crypto";import{createHash as r$}from"node:crypto";function US(t,e){let r=e?.context?.trim();return r?[{role:"system",content:r},...t]:t}function FS(t){let e=r$("sha256").update(t.context??"").digest("hex");return{id:t.id,name:t.name,source:t.source,contextHash:`sha256:${e}`,enabledSkills:[...t.enabledSkills],disabledBuiltinSkills:[...t.disabledBuiltinSkills]}}Fe();import{randomUUID as b$}from"node:crypto";var Sn=class{mode;rules;defaultBehavior;compiledPatterns;constructor(e){this.mode=e.mode,this.rules=[...e.rules],this.defaultBehavior=e.defaultBehavior,this.compiledPatterns=this.compileRules(this.rules)}getMode(){return this.mode}setMode(e){this.mode=e}getRules(){return this.rules}getDefaultBehavior(){return this.defaultBehavior}replaceRules(e){this.rules=[...e],this.compiledPatterns=this.compileRules(this.rules)}setDefaultBehavior(e){this.defaultBehavior=e}addRule(e){this.rules.push(e),this.compiledPatterns=this.compileRules(this.rules)}check(e){let{toolName:r,meta:n}=e;if(this.mode==="full_access")return{behavior:"allow",decisionReason:{type:"mode",mode:"full_access"}};for(let{rule:s,regex:i}of this.compiledPatterns)if(i.test(r))return o$(s,e);let o=a$(n);return o==="read"?{behavior:"allow",decisionReason:{type:"tool_check",reason:"risk:read"}}:n?.requiresApproval?{behavior:"ask",message:`Tool "${r}" requires approval`,toolName:r,input:e.arguments,decisionReason:{type:"tool_check",reason:"requiresApproval"}}:o==="system"||o==="external_egress"?{behavior:"ask",message:`Tool "${r}" requires approval (${o})`,toolName:r,input:e.arguments,decisionReason:{type:"tool_check",reason:`risk:${o}`}}:this.defaultBehavior==="allow"?{behavior:"allow"}:this.defaultBehavior==="deny"?{behavior:"deny",message:`Tool "${r}" denied by default policy`,decisionReason:{type:"other",reason:"default_deny"}}:{behavior:"ask",message:`Tool "${r}" requires approval (default policy)`,toolName:r,input:e.arguments}}compileRules(e){return e.map(r=>({rule:r,regex:n$(r.pattern)}))}};function Oi(t){if(!t||typeof t!="object")return{mode:"default",rules:[],defaultBehavior:"ask"};let e=t;return i$(e),{mode:s$(e.mode).mode,rules:[],defaultBehavior:"ask"}}function n$(t){let r=t.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*+/g,".*");return new RegExp(`^${r}$`,"i")}function o$(t,e){let r={type:"rule",rule:t};return t.behavior==="allow"?{behavior:"allow",decisionReason:r}:t.behavior==="deny"?{behavior:"deny",message:t.reason??`Tool "${e.toolName}" denied by rule "${t.pattern}"`,decisionReason:r}:{behavior:"ask",message:t.reason??`Tool "${e.toolName}" requires approval (rule "${t.pattern}")`,toolName:e.toolName,input:e.arguments,decisionReason:r}}function s$(t){if(t==="default"||t==="auto"||t==="full_access")return{mode:t};if(typeof t=="string")throw new Error(`Invalid permission mode: ${t}`);return{mode:"default"}}function i$(t){if("default"in t)throw new Error("Legacy permissions.default is not supported");for(let e of["allow","deny","ask"])if(e in t)throw new Error(`Legacy permission ${e} arrays are not supported`)}function a$(t){return t?.riskLevel?t.riskLevel:t?.isReadOnly?"read":t?.isDangerous?"system":"write"}var c$=new Set(["nodeversion","npmversion","npxversion","pnpmversion","yarnversion","bunversion","denoversion","pythonversion","python3version","pipversion","rubyversion","go version","rustcversion","cargoversion","java -version","javac -version","dotnetversion","gccversion","g++version","clangversion","gitversion","dockerversion","--help","-h"]),HS=new Set(["ls","dir","find","fd","locate","which","where","type","cat","head","tail","less","more","bat","wc","file","stat","du","df","tree","exa","eza","grep","rg","ripgrep","ag","ack","fgrep","egrep","git status","git log","git diff","git show","git branch","git tag","git remote","git stash list","git blame","git shortlog","git describe","git rev-parse","git ls-files","git ls-tree","git cat-file","git reflog","ps","top","htop","uptime","uname","hostname","whoami","id","env","printenv","echo","ping","nslookup","dig","host","ifconfig","ip","netstat","ss","npm list","npm ls","npm info","npm view","npm outdated","npm audit","pnpm list","pnpm ls","pnpm outdated","pip list","pip show","pip freeze","cargo tree","npm test","npm run test","npm run build","npm run lint","pnpm test","pnpm run test","pnpm run build","pnpm run lint","yarn test","yarn build","yarn lint","cargo test","cargo build","cargo check","cargo clippy","go test","go build","go vet","make","cmake","pytest","python -m pytest","python3 -m pytest","jest","vitest","mocha","tsc","tscnoEmit","eslint","prettier","oxlint"]),l$=[/\brm\s+-rf?\s+[/~]/,/\brm\s+-rf?\s+\.\.\//,/\bsudo\b/,/\bsu\s/,/\bchmod\s+777\b/,/\bmkfs\b/,/\bfdisk\b/,/\bdd\s+if=/,/\bsystemctl\s+(start|stop|restart|enable|disable)\b/,/\bservice\s+\S+\s+(start|stop|restart)\b/,/\breg\s+(add|delete)\b/i,/\\Windows\\System32/i,/\/etc\/(passwd|shadow|sudoers|fstab)/,/\bgit\s+push\s+.*--force\b/,/\bgit\s+push\s+-f\b/,/\bcurl\b.*(-H|--header)\s+.*[Aa]uthorization/,/\bwget\b.*--header.*[Aa]uthorization/,/\bcurl\b.*\|\s*(sh|bash|zsh)\b/,/\bwget\b.*-O\s*-\s*\|\s*(sh|bash|zsh)\b/,/\bnpm\s+install\s+-g\b/,/\bpip\s+install\b(?!.*-r\b)(?!.*requirements)/,/\bDROP\s+(DATABASE|TABLE|SCHEMA)\b/i,/\bTRUNCATE\s+TABLE\b/i],BS=new Set(["npm install","npm i","npm ci","pnpm install","pnpm i","yarn install","yarn","pip install -r","pip install -e","cargo build","cargo install","go mod download","go get","bundle install","composer install","git add","git commit","git stash","git checkout","git switch","git merge","git rebase","git cherry-pick","git pull","git fetch","docker build","docker compose","mkdir","touch","cp"]);function qS(t,e,r){let n=t.trim();if(!n)return{decision:"allow",reason:"empty command"};let o=Ad(n)??Pd(n)??void 0;for(let l of l$)if(l.test(n))return{decision:"deny",reason:`matches dangerous pattern: ${l.source}`,destructiveWarning:o};for(let l of c$)if(n===l||n.startsWith(l+" "))return{decision:"allow",reason:`known safe command: ${l}`,destructiveWarning:o};let s=n.split(/\s+/),i=s[0],a=s.length>1?`${s[0]} ${s[1]}`:i;return HS.has(i)||HS.has(a)?{decision:"allow",reason:`known safe command: ${i}`,destructiveWarning:o}:e&&r&&e.startsWith(r)&&(BS.has(i)||BS.has(a))?{decision:"allow",reason:`safe in project: ${a}`,destructiveWarning:o}:{decision:"defer",reason:"unknown command \u2014 needs LLM classification",destructiveWarning:o}}function d$(t){let e=Object.keys(t).sort(),r={};for(let n of e){let o=t[n];typeof o=="string"?r[n]=o.replace(/\s+/g," ").trim():r[n]=o}return JSON.stringify(r)}function Xu(t,e){return`${t}::${d$(e)}`}var u$=500,ji=class{cache=new Map;get(e,r){let n=Xu(e,r),o=this.cache.get(n);if(o)return o.hitCount++,o}set(e,r,n){if(this.cache.size>=u$){let s=this.cache.keys().next().value;s!==void 0&&this.cache.delete(s)}let o=Xu(e,r);this.cache.set(o,{shouldBlock:n.shouldBlock,reason:n.reason,classifiedAt:Date.now(),hitCount:0})}has(e,r){return this.cache.has(Xu(e,r))}clear(){this.cache.clear()}get size(){return this.cache.size}get totalHits(){let e=0;for(let r of this.cache.values())e+=r.hitCount;return e}};var p$=new Set(["read","search","instructions","think","task","memory","skill","tool_search","plan_mode","lsp","brief","web_search","image_generate","video_generate","music_generate","tts","three_d_generate","checkpoint"]);function Ao(t){return p$.has(t)}var WS=`You are a security classifier for an AI coding agent. Your job is to decide whether a tool invocation is safe to execute without user confirmation.
562
562
 
563
563
  The agent operates in a workspace and has been given permission to use tools autonomously. You must decide if each tool call is SAFE (routine development work) or DANGEROUS (could cause harm, data loss, or unexpected side effects).
564
564
 
@@ -580,7 +580,7 @@ DANGEROUS operations (SHOULD be blocked):
580
580
  - Running commands with sudo/admin privileges
581
581
  - Downloading and executing unknown scripts
582
582
 
583
- Respond ONLY with XML. No other text.`;async function Yu(t,e,r,n){let o=Date.now();if(Ao(t))return{shouldBlock:!1,reason:"allowlisted safe tool",stage:"allowlist",durationMs:Date.now()-o};let s=p$(r),i=m$(t,e),a=`<transcript>
583
+ Respond ONLY with XML. No other text.`;async function Yu(t,e,r,n){let o=Date.now();if(Ao(t))return{shouldBlock:!1,reason:"allowlisted safe tool",stage:"allowlist",durationMs:Date.now()-o};let s=m$(r),i=g$(t,e),a=`<transcript>
584
584
  ${s}
585
585
  </transcript>
586
586
 
@@ -596,48 +596,48 @@ ${s}
596
596
  ${i}
597
597
  </action>
598
598
 
599
- The fast classifier flagged this action. Review carefullyis it actually dangerous, or is it safe development work? Consider the project context. Use <thinking> tags to reason, then respond with <block>yes</block> or <block>no</block> and <reason>explanation</reason>.`,u=await n({system:WS,messages:[{role:"user",content:p}],maxTokens:4096,temperature:0,cacheSystemPrompt:!0}),m=KS(u.text),f=GS(m),g=zS(m)??zS(l)??"classifier decision";return{shouldBlock:f!==!1,reason:g,stage:"thinking",durationMs:Date.now()-o}}catch{return{shouldBlock:!0,reason:"classifier unavailable",stage:"fast",durationMs:Date.now()-o}}}function p$(t){return t.slice(-20).map(r=>{let n=r.role==="user"?"User":r.role==="assistant"?"Assistant":"System",o=typeof r.content=="string"?r.content.slice(0,500):JSON.stringify(r.content).slice(0,500);return`${n}: ${o}`}).join(`
600
- `)}function m$(t,e){let r=JSON.stringify(e,null,0),n=r.length>2e3?r.slice(0,2e3)+"...":r;return`Tool: ${t}
601
- Arguments: ${n}`}function GS(t){let e=t.match(/<block>(yes|no)<\/block>/i);return e?e[1].toLowerCase()==="yes":null}function zS(t){let e=t.match(/<reason>([\s\S]*?)(?:<\/reason>|$)/i);return e?e[1].trim():null}function KS(t){return t.replace(/<thinking>[\s\S]*?<\/thinking>/gi,"").trim()}var VS={maxConsecutive:3,maxTotal:20};function XS(){return{consecutiveDenials:0,totalDenials:0}}function Ju(t){return{consecutiveDenials:t.consecutiveDenials+1,totalDenials:t.totalDenials+1}}function Qu(t){return t.consecutiveDenials===0?t:{...t,consecutiveDenials:0}}function YS(t){return t.consecutiveDenials>=VS.maxConsecutive||t.totalDenials>=VS.maxTotal}import*as _t from"node:fs";import*as Po from"node:path";var g$="audit",f$="denials.jsonl",h$=10*1024*1024,$i=class{filePath;writeQueue=Promise.resolve();constructor(e){let r=Po.join(e,".qlogicagent",g$);this.filePath=Po.join(r,f$)}record(e){this.writeQueue=this.writeQueue.then(()=>this.doWrite(e)).catch(()=>{})}getFilePath(){return this.filePath}async doWrite(e){try{let r=Po.dirname(this.filePath);if(_t.existsSync(r)||_t.mkdirSync(r,{recursive:!0}),_t.existsSync(this.filePath)&&_t.statSync(this.filePath).size>h$){let s=this.filePath+".1";_t.renameSync(this.filePath,s)}let n=JSON.stringify(e)+`
602
- `;_t.appendFileSync(this.filePath,n,"utf-8")}catch{}}};function JS(t){if(!t)return;let e={},r=/key|secret|token|password|credential|auth/i;for(let[n,o]of Object.entries(t))r.test(n)?e[n]="[REDACTED]":typeof o=="string"&&o.length>500?e[n]=o.slice(0,500)+"...[truncated]":e[n]=o;return e}var y$=[{pattern:"exec",behavior:"deny",reason:"Community L1 sandbox denied shell execution",source:"community-sandbox",ruleId:"community-l1-shell"},{pattern:"Bash",behavior:"deny",reason:"Community L1 sandbox denied shell execution",source:"community-sandbox",ruleId:"community-l1-shell"},{pattern:"execute_command",behavior:"deny",reason:"Community L1 sandbox denied shell execution",source:"community-sandbox",ruleId:"community-l1-shell"},{pattern:"read",behavior:"deny",reason:"Community L1 sandbox denied file reads",source:"community-sandbox",ruleId:"community-l1-file-read"},{pattern:"write",behavior:"deny",reason:"Community L1 sandbox denied file writes",source:"community-sandbox",ruleId:"community-l1-file-write"},{pattern:"edit",behavior:"deny",reason:"Community L1 sandbox denied file edits",source:"community-sandbox",ruleId:"community-l1-file-write"},{pattern:"apply_patch",behavior:"deny",reason:"Community L1 sandbox denied file patching",source:"community-sandbox",ruleId:"community-l1-file-write"},{pattern:"web_fetch",behavior:"deny",reason:"Community L1 sandbox denied network egress",source:"community-sandbox",ruleId:"community-l1-network"},{pattern:"web_search",behavior:"deny",reason:"Community L1 sandbox denied network egress",source:"community-sandbox",ruleId:"community-l1-network"},{pattern:"mcp",behavior:"deny",reason:"Community L1 sandbox denied MCP access",source:"community-sandbox",ruleId:"community-l1-mcp"},{pattern:"mcp__*",behavior:"deny",reason:"Community L1 sandbox denied MCP access",source:"community-sandbox",ruleId:"community-l1-mcp"},{pattern:"computer",behavior:"deny",reason:"Community L1 sandbox denied host control",source:"community-sandbox",ruleId:"community-l1-host-control"},{pattern:"notify",behavior:"deny",reason:"Community L2 sandbox denied host side effects",source:"community-sandbox",ruleId:"community-l2-host-side-effect"},{pattern:"send_message",behavior:"deny",reason:"Community L2 sandbox denied host side effects",source:"community-sandbox",ruleId:"community-l2-host-side-effect"},{pattern:"agent",behavior:"deny",reason:"Community L2 sandbox denied host side effects",source:"community-sandbox",ruleId:"community-l2-host-side-effect"},{pattern:"team",behavior:"deny",reason:"Community L2 sandbox denied host side effects",source:"community-sandbox",ruleId:"community-l2-host-side-effect"},{pattern:"cron",behavior:"deny",reason:"Community L2 sandbox denied host side effects",source:"community-sandbox",ruleId:"community-l2-host-side-effect"},{pattern:"monitor",behavior:"deny",reason:"Community L2 sandbox denied host side effects",source:"community-sandbox",ruleId:"community-l2-host-side-effect"},{pattern:"file_upload",behavior:"ask",reason:"Community L2 sandbox requires explicit approval for local file data egress",source:"community-sandbox",ruleId:"community-l2-data-egress"},{pattern:"image_generate",behavior:"ask",reason:"Community L2 sandbox requires explicit approval for provider prompt egress",source:"community-sandbox",ruleId:"community-l2-provider-prompt-egress"},{pattern:"video_generate",behavior:"ask",reason:"Community L2 sandbox requires explicit approval for provider prompt egress",source:"community-sandbox",ruleId:"community-l2-provider-prompt-egress"},{pattern:"music_generate",behavior:"ask",reason:"Community L2 sandbox requires explicit approval for provider prompt egress",source:"community-sandbox",ruleId:"community-l2-provider-prompt-egress"},{pattern:"tts",behavior:"ask",reason:"Community L2 sandbox requires explicit approval for provider prompt egress",source:"community-sandbox",ruleId:"community-l2-provider-prompt-egress"},{pattern:"three_d_generate",behavior:"ask",reason:"Community L2 sandbox requires explicit approval for provider prompt egress",source:"community-sandbox",ruleId:"community-l2-provider-prompt-egress"},{pattern:"video_edit",behavior:"ask",reason:"Community L2 sandbox requires explicit approval for provider media egress",source:"community-sandbox",ruleId:"community-l2-provider-media-egress"},{pattern:"video_merge",behavior:"ask",reason:"Community L2 sandbox requires explicit approval for provider media egress",source:"community-sandbox",ruleId:"community-l2-provider-media-egress"},{pattern:"video_upscale",behavior:"ask",reason:"Community L2 sandbox requires explicit approval for provider media egress",source:"community-sandbox",ruleId:"community-l2-provider-media-egress"},{pattern:"voice_clone",behavior:"ask",reason:"Community L2 sandbox requires explicit approval for provider media egress",source:"community-sandbox",ruleId:"community-l2-provider-media-egress"},{pattern:"stt",behavior:"ask",reason:"Community L2 sandbox requires explicit approval for provider media egress",source:"community-sandbox",ruleId:"community-l2-provider-media-egress"}];function QS(){return y$.map(({ruleId:t,...e})=>({...e}))}var b$=12e4,Ui=class{ruleEngine;hookRegistry;onRequestApproval;onDenied;classifierLLMCall;getRecentMessages;permissionRole;pendingApprovals=new Map;auditLogger;sessionId;getTurnId;communityTelemetryRecorder;communitySandboxTurnIds=new Set;communitySandboxRuleEngine=new Sn({mode:"default",defaultBehavior:"allow",rules:QS()});unregisterHook=null;toolMetaCache=new Map;classifierCache=new ji;denialTracking=XS();constructor(e){this.ruleEngine=e.ruleEngine,this.hookRegistry=e.hookRegistry,this.onRequestApproval=e.onRequestApproval,this.onDenied=e.onDenied,this.classifierLLMCall=e.classifierLLMCall,this.getRecentMessages=e.getRecentMessages,this.permissionRole=e.permissionRole??"interactive",this.auditLogger=e.auditLogger,this.sessionId=e.sessionId??"",this.getTurnId=e.getTurnId??(()=>""),this.communityTelemetryRecorder=e.communityTelemetryRecorder}register(){this.unregisterHook&&this.unregisterHook(),this.classifierCache.clear();let e=this.hookRegistry.register({point:"tool.before_invoke",priority:100,label:"permission-checker",handler:async(o,s)=>{let i=this.toolMetaCache.get(s.toolName),a={toolName:s.toolName,arguments:s.arguments,meta:i?{isReadOnly:i.isReadOnly,isDangerous:i.isDangerous,requiresApproval:i.requiresApproval,riskLevel:i.riskLevel,parallelSafe:i.parallelSafe}:void 0},c=this.communitySandboxTurnIds.has(s.turnId)?this.checkCommunitySandboxThenBase(a):this.ruleEngine.check(a);return this.handleResult(c,s.callId,s.toolName,s.arguments)}}),r=this.hookRegistry.register({point:"subagent.started",priority:20,label:"community-sandbox-scope-start",handler:(o,s)=>(s.agentType?.startsWith("community-skill:")&&this.communitySandboxTurnIds.add(s.turnId),{action:"continue"})}),n=this.hookRegistry.register({point:"subagent.stopped",priority:20,label:"community-sandbox-scope-stop",handler:(o,s)=>(s.agentType?.startsWith("community-skill:")&&this.communitySandboxTurnIds.delete(s.turnId),{action:"continue"})});return this.unregisterHook=()=>{e(),r(),n(),this.communitySandboxTurnIds.clear()},()=>{this.unregisterHook?.(),this.unregisterHook=null,this.cancelAllPending()}}resolveApproval(e){let r=this.pendingApprovals.get(e.approvalId);r&&(clearTimeout(r.timeoutId),this.pendingApprovals.delete(e.approvalId),r.resolve(e))}setToolMeta(e){this.toolMetaCache.clear();for(let r of e)r.meta&&this.toolMetaCache.set(r.function.name,r.meta)}get ruleEngineRef(){return this.ruleEngine}checkCommunitySandboxThenBase(e){if(this.ruleEngine.getMode()==="full_access")return this.ruleEngine.check(e);let r=this.communitySandboxRuleEngine.check(e);return r.behavior!=="allow"?r:this.ruleEngine.check(e)}fireDenied(e,r,n,o="classifier",s,i=R$(o)){this.onDenied?.(r,n),this.hookRegistry.invoke("permission.denied",{sessionId:this.sessionId,turnId:this.getTurnId(),approvalId:e,callId:e,toolName:r,decision:"deny",reason:n}).catch(()=>{}),this.auditLogger&&this.auditLogger.record({timestamp:new Date().toISOString(),sessionId:this.sessionId,turnId:this.getTurnId(),toolName:r,reason:n,source:o,permissionRole:this.permissionRole,callId:e,toolArgs:JS(s),cumulativeDenials:this.denialTracking.totalDenials,consecutiveDenials:this.denialTracking.consecutiveDenials}),k$(o)&&this.communityTelemetryRecorder?.recordTelemetry({event:"community.sandbox.violation",metadata:{surface:"permission-checker",action:"blocked",source:o,ruleId:i,platform:process.platform}}).catch(()=>{})}async handleResult(e,r,n,o){if(e.behavior==="allow")return{action:"continue",context:e.updatedInput?{arguments:e.updatedInput}:void 0};if(e.behavior==="deny")return this.permissionRole==="interactive"?this.handleInteractiveApproval(this.toConfirmationRequest(e,n,o),r,n,o):(this.fireDenied(r,n,e.message,"rule-engine",o,Zu(e.decisionReason)),{action:"abort",reason:e.message});let s=T$(e),i=e.decisionReason?.type==="tool_check"&&(e.decisionReason.reason==="requiresApproval"||e.decisionReason.reason==="risk:system"||e.decisionReason.reason==="risk:external_egress");if(s&&this.permissionRole!=="interactive")return this.fireDenied(r,n,`community sandbox requires interactive approval: ${e.message}`,"safety",o,Zu(e.decisionReason)),{action:"abort",reason:`Tool "${n}" blocked by community sandbox (${this.permissionRole} agents cannot approve tainted egress)`};if(s)return this.handleInteractiveApproval(e,r,n,o);if(i&&this.permissionRole!=="interactive")return this.fireDenied(r,n,`safety check: ${e.message} (${this.permissionRole} cannot override)`,"safety",o,Zu(e.decisionReason)),{action:"abort",reason:`Tool "${n}" blocked by safety check (${this.permissionRole} agents cannot override dangerous tool restrictions)`};if((n==="bash"||n==="execute_command"||n==="Bash"||n==="shell")&&o){let c=o.command??o.cmd??"";if(c){let l=qS(c);if(l.decision==="allow")return{action:"continue"};if(l.decision==="deny")return this.permissionRole==="interactive"?this.handleInteractiveApproval({behavior:"ask",message:l.reason,toolName:n,input:o,decisionReason:{type:"classifier",classifier:"bash",reason:l.reason}},r,n,o):(this.fireDenied(r,n,l.reason,"classifier",o,"bash-classifier-deny"),{action:"abort",reason:l.reason})}}if(o){let c=this.classifierCache.get(n,o);if(c)return c.shouldBlock?this.permissionRole==="interactive"?this.handleInteractiveApproval({behavior:"ask",message:c.reason,toolName:n,input:o,decisionReason:{type:"classifier",classifier:"cached",reason:c.reason}},r,n,o):(this.fireDenied(r,n,`cached: ${c.reason}`,"classifier",o,"classifier-cached-deny"),{action:"abort",reason:c.reason}):{action:"continue"}}if(this.permissionRole==="worker")return this.handleWorkerAsk(r,n,o);if(this.permissionRole==="coordinator"){let c=this.toolMetaCache.get(n);return S$(c)==="read"||Ao(n)?{action:"continue"}:this.handleWorkerAsk(r,n,o)}if(this.ruleEngine.getMode()==="auto"){if(Ao(n))return{action:"continue"};let c=YS(this.denialTracking);if(this.classifierLLMCall&&!c)try{let l=this.getRecentMessages?.()??[],d=await Yu(n,o??{},l,this.classifierLLMCall);if(o&&this.classifierCache.set(n,o,{shouldBlock:d.shouldBlock,reason:d.reason}),!d.shouldBlock)return this.denialTracking=Qu(this.denialTracking),{action:"continue",context:{decisionReason:{type:"classifier",classifier:"auto",reason:d.reason}}};this.denialTracking=Ju(this.denialTracking)}catch{}}return this.handleInteractiveApproval(e,r,n,o)}toConfirmationRequest(e,r,n){return{behavior:"ask",message:e.message,toolName:r,input:n,decisionReason:e.decisionReason}}async handleInteractiveApproval(e,r,n,o){let s=v$(),i={approvalId:s,callId:r,toolName:n,arguments:o,message:e.message};this.hookRegistry.invoke("approval.requested",{sessionId:"",turnId:"",approvalId:s,callId:r,toolName:n}).catch(()=>{});try{let a=await this.requestApproval(i);return this.hookRegistry.invoke("approval.responded",{sessionId:"",turnId:"",approvalId:s,callId:r,toolName:n,decision:a.decision}).catch(()=>{}),a.decision==="allow"?{action:"continue",context:a.updatedInput?{arguments:a.updatedInput}:void 0}:(this.fireDenied(r,n,`not executed by user choice (approval ${s})`,"user",o),{action:"abort",reason:`Tool "${n}" was not executed by user choice`})}catch{return this.fireDenied(r,n,`approval timeout or error (approval ${s})`,"timeout",o),{action:"abort",reason:`Tool "${n}" confirmation timed out`}}}async handleWorkerAsk(e,r,n){if(Ao(r))return{action:"continue"};if(this.classifierLLMCall)try{let o=this.getRecentMessages?.()??[],s=await Yu(r,n??{},o,this.classifierLLMCall);return n&&this.classifierCache.set(r,n,{shouldBlock:s.shouldBlock,reason:s.reason}),s.shouldBlock?(this.denialTracking=Ju(this.denialTracking),this.fireDenied(e,r,`blocked by classifier in ${this.permissionRole} mode: ${s.reason}`,"classifier",n,"classifier-deny"),{action:"abort",reason:`Tool "${r}" blocked by classifier (${this.permissionRole})`}):(this.denialTracking=Qu(this.denialTracking),{action:"continue",context:{decisionReason:{type:"classifier",classifier:this.permissionRole,reason:s.reason}}})}catch{}return this.fireDenied(e,r,`no classifier available in ${this.permissionRole} mode`,"static-deny",void 0,"static-deny"),{action:"abort",reason:`Tool "${r}" deniedno classifier for ${this.permissionRole} mode`}}requestApproval(e){return new Promise((r,n)=>{let o=setTimeout(()=>{this.pendingApprovals.delete(e.approvalId),n(new Error("Approval timed out"))},b$);this.pendingApprovals.set(e.approvalId,{resolve:r,reject:n,timeoutId:o}),this.onRequestApproval(e).then(s=>{let i=this.pendingApprovals.get(e.approvalId);i&&(clearTimeout(i.timeoutId),this.pendingApprovals.delete(e.approvalId),r(s))},s=>{let i=this.pendingApprovals.get(e.approvalId);i&&(clearTimeout(i.timeoutId),this.pendingApprovals.delete(e.approvalId),n(s))})})}clearClassifierCache(){this.classifierCache.clear(),this.denialTracking={consecutiveDenials:0,totalDenials:0}}cancelAllPending(){this.classifierCache.clear();for(let[e,r]of this.pendingApprovals)clearTimeout(r.timeoutId),r.reject(new Error("Permission checker destroyed")),this.pendingApprovals.delete(e)}};function k$(t){return t==="classifier"||t==="rule-engine"||t==="safety"||t==="static-deny"}function R$(t){return`${t}-deny`}function Zu(t){switch(t?.type){case"sandbox":return"sandbox-deny";case"rule":return"rule-engine-deny";case"mode":return`mode-${t.mode}`;case"tool_check":return`tool-${t.reason}`;case"classifier":return"classifier-deny";case"eligibility":return"eligibility-deny";case"hook":return"hook-deny";case"other":return"policy-deny";default:return"rule-engine-deny"}}function S$(t){return t?.riskLevel?t.riskLevel:t?.isReadOnly?"read":t?.isDangerous?"system":"write"}function T$(t){return t.behavior==="ask"&&t.decisionReason?.type==="rule"&&t.decisionReason.rule.source==="community-sandbox"}function xo(t){return Oi(t)}function ZS(t){return new Sn(xo(t))}function eT(t){return new Ui(t)}function tT(t,e){let r=xo(e);return t.setMode(r.mode),t.replaceRules(r.rules),t.setDefaultBehavior(r.defaultBehavior),r}import{randomUUID as w$}from"node:crypto";function rT(t){gb(async e=>{let r=`ask-${w$().slice(0,8)}`;return new Promise(n=>{t.pendingAskUser.set(r,{resolve:n}),t.sendNotification("turn.ask_user",{requestId:r,questions:e.map(o=>({header:o.header,question:o.question,options:o.options}))})})})}function Hi(t,e){return{name:t,compute:e,cacheBreak:!1}}function qt(t,e,r){return{name:t,compute:e,cacheBreak:!0}}var Fi=new Map;async function A$(t){return(await Promise.all(t.map(async r=>{if(!r.cacheBreak&&Fi.has(r.name))return Fi.get(r.name)??null;let n=await r.compute();return Fi.set(r.name,n),n}))).filter(r=>r!=null)}function nT(){Fi.clear()}async function Bi(t){let e=[];if(t.instructionBlock&&e.push(t.instructionBlock),t.customSystemPrompt?e.push(t.customSystemPrompt):t.basePrompt&&e.push(t.basePrompt),t.sections?.length){let r=await A$(t.sections);e.push(...r)}return t.appendSystemPrompt&&e.push(t.appendSystemPrompt),e.filter(Boolean).join(`
599
+ The fast classifier flagged this action. Review carefullyis it actually dangerous, or is it safe development work? Consider the project context. Use <thinking> tags to reason, then respond with <block>yes</block> or <block>no</block> and <reason>explanation</reason>.`,u=await n({system:WS,messages:[{role:"user",content:p}],maxTokens:4096,temperature:0,cacheSystemPrompt:!0}),m=KS(u.text),f=GS(m),g=zS(m)??zS(l)??"classifier decision";return{shouldBlock:f!==!1,reason:g,stage:"thinking",durationMs:Date.now()-o}}catch{return{shouldBlock:!0,reason:"classifier unavailable",stage:"fast",durationMs:Date.now()-o}}}function m$(t){return t.slice(-20).map(r=>{let n=r.role==="user"?"User":r.role==="assistant"?"Assistant":"System",o=typeof r.content=="string"?r.content.slice(0,500):JSON.stringify(r.content).slice(0,500);return`${n}: ${o}`}).join(`
600
+ `)}function g$(t,e){let r=JSON.stringify(e,null,0),n=r.length>2e3?r.slice(0,2e3)+"...":r;return`Tool: ${t}
601
+ Arguments: ${n}`}function GS(t){let e=t.match(/<block>(yes|no)<\/block>/i);return e?e[1].toLowerCase()==="yes":null}function zS(t){let e=t.match(/<reason>([\s\S]*?)(?:<\/reason>|$)/i);return e?e[1].trim():null}function KS(t){return t.replace(/<thinking>[\s\S]*?<\/thinking>/gi,"").trim()}var VS={maxConsecutive:3,maxTotal:20};function XS(){return{consecutiveDenials:0,totalDenials:0}}function Ju(t){return{consecutiveDenials:t.consecutiveDenials+1,totalDenials:t.totalDenials+1}}function Qu(t){return t.consecutiveDenials===0?t:{...t,consecutiveDenials:0}}function YS(t){return t.consecutiveDenials>=VS.maxConsecutive||t.totalDenials>=VS.maxTotal}import*as _t from"node:fs";import*as Po from"node:path";var f$="audit",h$="denials.jsonl",y$=10*1024*1024,$i=class{filePath;writeQueue=Promise.resolve();constructor(e){let r=Po.join(e,".qlogicagent",f$);this.filePath=Po.join(r,h$)}record(e){this.writeQueue=this.writeQueue.then(()=>this.doWrite(e)).catch(()=>{})}getFilePath(){return this.filePath}async doWrite(e){try{let r=Po.dirname(this.filePath);if(_t.existsSync(r)||_t.mkdirSync(r,{recursive:!0}),_t.existsSync(this.filePath)&&_t.statSync(this.filePath).size>y$){let s=this.filePath+".1";_t.renameSync(this.filePath,s)}let n=JSON.stringify(e)+`
602
+ `;_t.appendFileSync(this.filePath,n,"utf-8")}catch{}}};function JS(t){if(!t)return;let e={},r=/key|secret|token|password|credential|auth/i;for(let[n,o]of Object.entries(t))r.test(n)?e[n]="[REDACTED]":typeof o=="string"&&o.length>500?e[n]=o.slice(0,500)+"...[truncated]":e[n]=o;return e}var v$=[{pattern:"exec",behavior:"deny",reason:"Community L1 sandbox denied shell execution",source:"community-sandbox",ruleId:"community-l1-shell"},{pattern:"Bash",behavior:"deny",reason:"Community L1 sandbox denied shell execution",source:"community-sandbox",ruleId:"community-l1-shell"},{pattern:"execute_command",behavior:"deny",reason:"Community L1 sandbox denied shell execution",source:"community-sandbox",ruleId:"community-l1-shell"},{pattern:"read",behavior:"deny",reason:"Community L1 sandbox denied file reads",source:"community-sandbox",ruleId:"community-l1-file-read"},{pattern:"write",behavior:"deny",reason:"Community L1 sandbox denied file writes",source:"community-sandbox",ruleId:"community-l1-file-write"},{pattern:"edit",behavior:"deny",reason:"Community L1 sandbox denied file edits",source:"community-sandbox",ruleId:"community-l1-file-write"},{pattern:"apply_patch",behavior:"deny",reason:"Community L1 sandbox denied file patching",source:"community-sandbox",ruleId:"community-l1-file-write"},{pattern:"web_fetch",behavior:"deny",reason:"Community L1 sandbox denied network egress",source:"community-sandbox",ruleId:"community-l1-network"},{pattern:"web_search",behavior:"deny",reason:"Community L1 sandbox denied network egress",source:"community-sandbox",ruleId:"community-l1-network"},{pattern:"mcp",behavior:"deny",reason:"Community L1 sandbox denied MCP access",source:"community-sandbox",ruleId:"community-l1-mcp"},{pattern:"mcp__*",behavior:"deny",reason:"Community L1 sandbox denied MCP access",source:"community-sandbox",ruleId:"community-l1-mcp"},{pattern:"computer",behavior:"deny",reason:"Community L1 sandbox denied host control",source:"community-sandbox",ruleId:"community-l1-host-control"},{pattern:"notify",behavior:"deny",reason:"Community L2 sandbox denied host side effects",source:"community-sandbox",ruleId:"community-l2-host-side-effect"},{pattern:"send_message",behavior:"deny",reason:"Community L2 sandbox denied host side effects",source:"community-sandbox",ruleId:"community-l2-host-side-effect"},{pattern:"agent",behavior:"deny",reason:"Community L2 sandbox denied host side effects",source:"community-sandbox",ruleId:"community-l2-host-side-effect"},{pattern:"team",behavior:"deny",reason:"Community L2 sandbox denied host side effects",source:"community-sandbox",ruleId:"community-l2-host-side-effect"},{pattern:"cron",behavior:"deny",reason:"Community L2 sandbox denied host side effects",source:"community-sandbox",ruleId:"community-l2-host-side-effect"},{pattern:"monitor",behavior:"deny",reason:"Community L2 sandbox denied host side effects",source:"community-sandbox",ruleId:"community-l2-host-side-effect"},{pattern:"file_upload",behavior:"ask",reason:"Community L2 sandbox requires explicit approval for local file data egress",source:"community-sandbox",ruleId:"community-l2-data-egress"},{pattern:"image_generate",behavior:"ask",reason:"Community L2 sandbox requires explicit approval for provider prompt egress",source:"community-sandbox",ruleId:"community-l2-provider-prompt-egress"},{pattern:"video_generate",behavior:"ask",reason:"Community L2 sandbox requires explicit approval for provider prompt egress",source:"community-sandbox",ruleId:"community-l2-provider-prompt-egress"},{pattern:"music_generate",behavior:"ask",reason:"Community L2 sandbox requires explicit approval for provider prompt egress",source:"community-sandbox",ruleId:"community-l2-provider-prompt-egress"},{pattern:"tts",behavior:"ask",reason:"Community L2 sandbox requires explicit approval for provider prompt egress",source:"community-sandbox",ruleId:"community-l2-provider-prompt-egress"},{pattern:"three_d_generate",behavior:"ask",reason:"Community L2 sandbox requires explicit approval for provider prompt egress",source:"community-sandbox",ruleId:"community-l2-provider-prompt-egress"},{pattern:"video_edit",behavior:"ask",reason:"Community L2 sandbox requires explicit approval for provider media egress",source:"community-sandbox",ruleId:"community-l2-provider-media-egress"},{pattern:"video_merge",behavior:"ask",reason:"Community L2 sandbox requires explicit approval for provider media egress",source:"community-sandbox",ruleId:"community-l2-provider-media-egress"},{pattern:"video_upscale",behavior:"ask",reason:"Community L2 sandbox requires explicit approval for provider media egress",source:"community-sandbox",ruleId:"community-l2-provider-media-egress"},{pattern:"voice_clone",behavior:"ask",reason:"Community L2 sandbox requires explicit approval for provider media egress",source:"community-sandbox",ruleId:"community-l2-provider-media-egress"},{pattern:"stt",behavior:"ask",reason:"Community L2 sandbox requires explicit approval for provider media egress",source:"community-sandbox",ruleId:"community-l2-provider-media-egress"}];function QS(){return v$.map(({ruleId:t,...e})=>({...e}))}var k$=12e4,Ui=class{ruleEngine;hookRegistry;onRequestApproval;onDenied;classifierLLMCall;getRecentMessages;permissionRole;pendingApprovals=new Map;auditLogger;sessionId;getTurnId;communityTelemetryRecorder;communitySandboxTurnIds=new Set;communitySandboxRuleEngine=new Sn({mode:"default",defaultBehavior:"allow",rules:QS()});unregisterHook=null;toolMetaCache=new Map;classifierCache=new ji;denialTracking=XS();constructor(e){this.ruleEngine=e.ruleEngine,this.hookRegistry=e.hookRegistry,this.onRequestApproval=e.onRequestApproval,this.onDenied=e.onDenied,this.classifierLLMCall=e.classifierLLMCall,this.getRecentMessages=e.getRecentMessages,this.permissionRole=e.permissionRole??"interactive",this.auditLogger=e.auditLogger,this.sessionId=e.sessionId??"",this.getTurnId=e.getTurnId??(()=>""),this.communityTelemetryRecorder=e.communityTelemetryRecorder}register(){this.unregisterHook&&this.unregisterHook(),this.classifierCache.clear();let e=this.hookRegistry.register({point:"tool.before_invoke",priority:100,label:"permission-checker",handler:async(o,s)=>{let i=this.toolMetaCache.get(s.toolName),a={toolName:s.toolName,arguments:s.arguments,meta:i?{isReadOnly:i.isReadOnly,isDangerous:i.isDangerous,requiresApproval:i.requiresApproval,riskLevel:i.riskLevel,parallelSafe:i.parallelSafe}:void 0},c=this.communitySandboxTurnIds.has(s.turnId)?this.checkCommunitySandboxThenBase(a):this.ruleEngine.check(a);return this.handleResult(c,s.callId,s.toolName,s.arguments)}}),r=this.hookRegistry.register({point:"subagent.started",priority:20,label:"community-sandbox-scope-start",handler:(o,s)=>(s.agentType?.startsWith("community-skill:")&&this.communitySandboxTurnIds.add(s.turnId),{action:"continue"})}),n=this.hookRegistry.register({point:"subagent.stopped",priority:20,label:"community-sandbox-scope-stop",handler:(o,s)=>(s.agentType?.startsWith("community-skill:")&&this.communitySandboxTurnIds.delete(s.turnId),{action:"continue"})});return this.unregisterHook=()=>{e(),r(),n(),this.communitySandboxTurnIds.clear()},()=>{this.unregisterHook?.(),this.unregisterHook=null,this.cancelAllPending()}}resolveApproval(e){let r=this.pendingApprovals.get(e.approvalId);r&&(clearTimeout(r.timeoutId),this.pendingApprovals.delete(e.approvalId),r.resolve(e))}setToolMeta(e){this.toolMetaCache.clear();for(let r of e)r.meta&&this.toolMetaCache.set(r.function.name,r.meta)}get ruleEngineRef(){return this.ruleEngine}checkCommunitySandboxThenBase(e){if(this.ruleEngine.getMode()==="full_access")return this.ruleEngine.check(e);let r=this.communitySandboxRuleEngine.check(e);return r.behavior!=="allow"?r:this.ruleEngine.check(e)}fireDenied(e,r,n,o="classifier",s,i=S$(o)){this.onDenied?.(r,n),this.hookRegistry.invoke("permission.denied",{sessionId:this.sessionId,turnId:this.getTurnId(),approvalId:e,callId:e,toolName:r,decision:"deny",reason:n}).catch(()=>{}),this.auditLogger&&this.auditLogger.record({timestamp:new Date().toISOString(),sessionId:this.sessionId,turnId:this.getTurnId(),toolName:r,reason:n,source:o,permissionRole:this.permissionRole,callId:e,toolArgs:JS(s),cumulativeDenials:this.denialTracking.totalDenials,consecutiveDenials:this.denialTracking.consecutiveDenials}),R$(o)&&this.communityTelemetryRecorder?.recordTelemetry({event:"community.sandbox.violation",metadata:{surface:"permission-checker",action:"blocked",source:o,ruleId:i,platform:process.platform}}).catch(()=>{})}async handleResult(e,r,n,o){if(e.behavior==="allow")return{action:"continue",context:e.updatedInput?{arguments:e.updatedInput}:void 0};if(e.behavior==="deny")return this.permissionRole==="interactive"?this.handleInteractiveApproval(this.toConfirmationRequest(e,n,o),r,n,o):(this.fireDenied(r,n,e.message,"rule-engine",o,Zu(e.decisionReason)),{action:"abort",reason:e.message});let s=w$(e),i=e.decisionReason?.type==="tool_check"&&(e.decisionReason.reason==="requiresApproval"||e.decisionReason.reason==="risk:system"||e.decisionReason.reason==="risk:external_egress");if(s&&this.permissionRole!=="interactive")return this.fireDenied(r,n,`community sandbox requires interactive approval: ${e.message}`,"safety",o,Zu(e.decisionReason)),{action:"abort",reason:`Tool "${n}" blocked by community sandbox (${this.permissionRole} agents cannot approve tainted egress)`};if(s)return this.handleInteractiveApproval(e,r,n,o);if(i&&this.permissionRole!=="interactive")return this.fireDenied(r,n,`safety check: ${e.message} (${this.permissionRole} cannot override)`,"safety",o,Zu(e.decisionReason)),{action:"abort",reason:`Tool "${n}" blocked by safety check (${this.permissionRole} agents cannot override dangerous tool restrictions)`};if((n==="bash"||n==="execute_command"||n==="Bash"||n==="shell")&&o){let c=o.command??o.cmd??"";if(c){let l=qS(c);if(l.decision==="allow")return{action:"continue"};if(l.decision==="deny")return this.permissionRole==="interactive"?this.handleInteractiveApproval({behavior:"ask",message:l.reason,toolName:n,input:o,decisionReason:{type:"classifier",classifier:"bash",reason:l.reason}},r,n,o):(this.fireDenied(r,n,l.reason,"classifier",o,"bash-classifier-deny"),{action:"abort",reason:l.reason})}}if(o){let c=this.classifierCache.get(n,o);if(c)return c.shouldBlock?this.permissionRole==="interactive"?this.handleInteractiveApproval({behavior:"ask",message:c.reason,toolName:n,input:o,decisionReason:{type:"classifier",classifier:"cached",reason:c.reason}},r,n,o):(this.fireDenied(r,n,`cached: ${c.reason}`,"classifier",o,"classifier-cached-deny"),{action:"abort",reason:c.reason}):{action:"continue"}}if(this.permissionRole==="worker")return this.handleWorkerAsk(r,n,o);if(this.permissionRole==="coordinator"){let c=this.toolMetaCache.get(n);return T$(c)==="read"||Ao(n)?{action:"continue"}:this.handleWorkerAsk(r,n,o)}if(this.ruleEngine.getMode()==="auto"){if(Ao(n))return{action:"continue"};let c=YS(this.denialTracking);if(this.classifierLLMCall&&!c)try{let l=this.getRecentMessages?.()??[],d=await Yu(n,o??{},l,this.classifierLLMCall);if(o&&this.classifierCache.set(n,o,{shouldBlock:d.shouldBlock,reason:d.reason}),!d.shouldBlock)return this.denialTracking=Qu(this.denialTracking),{action:"continue",context:{decisionReason:{type:"classifier",classifier:"auto",reason:d.reason}}};this.denialTracking=Ju(this.denialTracking)}catch{}}return this.handleInteractiveApproval(e,r,n,o)}toConfirmationRequest(e,r,n){return{behavior:"ask",message:e.message,toolName:r,input:n,decisionReason:e.decisionReason}}async handleInteractiveApproval(e,r,n,o){let s=b$(),i={approvalId:s,callId:r,toolName:n,arguments:o,message:e.message};this.hookRegistry.invoke("approval.requested",{sessionId:"",turnId:"",approvalId:s,callId:r,toolName:n}).catch(()=>{});try{let a=await this.requestApproval(i);return this.hookRegistry.invoke("approval.responded",{sessionId:"",turnId:"",approvalId:s,callId:r,toolName:n,decision:a.decision}).catch(()=>{}),a.decision==="allow"?{action:"continue",context:a.updatedInput?{arguments:a.updatedInput}:void 0}:(this.fireDenied(r,n,`not executed by user choice (approval ${s})`,"user",o),{action:"abort",reason:`Tool "${n}" was not executed by user choice`})}catch{return this.fireDenied(r,n,`approval timeout or error (approval ${s})`,"timeout",o),{action:"abort",reason:`Tool "${n}" confirmation timed out`}}}async handleWorkerAsk(e,r,n){if(Ao(r))return{action:"continue"};if(this.classifierLLMCall)try{let o=this.getRecentMessages?.()??[],s=await Yu(r,n??{},o,this.classifierLLMCall);return n&&this.classifierCache.set(r,n,{shouldBlock:s.shouldBlock,reason:s.reason}),s.shouldBlock?(this.denialTracking=Ju(this.denialTracking),this.fireDenied(e,r,`blocked by classifier in ${this.permissionRole} mode: ${s.reason}`,"classifier",n,"classifier-deny"),{action:"abort",reason:`Tool "${r}" blocked by classifier (${this.permissionRole})`}):(this.denialTracking=Qu(this.denialTracking),{action:"continue",context:{decisionReason:{type:"classifier",classifier:this.permissionRole,reason:s.reason}}})}catch{}return this.fireDenied(e,r,`no classifier available in ${this.permissionRole} mode`,"static-deny",void 0,"static-deny"),{action:"abort",reason:`Tool "${r}" deniedno classifier for ${this.permissionRole} mode`}}requestApproval(e){return new Promise((r,n)=>{let o=setTimeout(()=>{this.pendingApprovals.delete(e.approvalId),n(new Error("Approval timed out"))},k$);this.pendingApprovals.set(e.approvalId,{resolve:r,reject:n,timeoutId:o}),this.onRequestApproval(e).then(s=>{let i=this.pendingApprovals.get(e.approvalId);i&&(clearTimeout(i.timeoutId),this.pendingApprovals.delete(e.approvalId),r(s))},s=>{let i=this.pendingApprovals.get(e.approvalId);i&&(clearTimeout(i.timeoutId),this.pendingApprovals.delete(e.approvalId),n(s))})})}clearClassifierCache(){this.classifierCache.clear(),this.denialTracking={consecutiveDenials:0,totalDenials:0}}cancelAllPending(){this.classifierCache.clear();for(let[e,r]of this.pendingApprovals)clearTimeout(r.timeoutId),r.reject(new Error("Permission checker destroyed")),this.pendingApprovals.delete(e)}};function R$(t){return t==="classifier"||t==="rule-engine"||t==="safety"||t==="static-deny"}function S$(t){return`${t}-deny`}function Zu(t){switch(t?.type){case"sandbox":return"sandbox-deny";case"rule":return"rule-engine-deny";case"mode":return`mode-${t.mode}`;case"tool_check":return`tool-${t.reason}`;case"classifier":return"classifier-deny";case"eligibility":return"eligibility-deny";case"hook":return"hook-deny";case"other":return"policy-deny";default:return"rule-engine-deny"}}function T$(t){return t?.riskLevel?t.riskLevel:t?.isReadOnly?"read":t?.isDangerous?"system":"write"}function w$(t){return t.behavior==="ask"&&t.decisionReason?.type==="rule"&&t.decisionReason.rule.source==="community-sandbox"}function xo(t){return Oi(t)}function ZS(t){return new Sn(xo(t))}function eT(t){return new Ui(t)}function tT(t,e){let r=xo(e);return t.setMode(r.mode),t.replaceRules(r.rules),t.setDefaultBehavior(r.defaultBehavior),r}import{randomUUID as A$}from"node:crypto";function rT(t){gb(async e=>{let r=`ask-${A$().slice(0,8)}`;return new Promise(n=>{t.pendingAskUser.set(r,{resolve:n}),t.sendNotification("turn.ask_user",{requestId:r,questions:e.map(o=>({header:o.header,question:o.question,options:o.options}))})})})}function Hi(t,e){return{name:t,compute:e,cacheBreak:!1}}function qt(t,e,r){return{name:t,compute:e,cacheBreak:!0}}var Fi=new Map;async function P$(t){return(await Promise.all(t.map(async r=>{if(!r.cacheBreak&&Fi.has(r.name))return Fi.get(r.name)??null;let n=await r.compute();return Fi.set(r.name,n),n}))).filter(r=>r!=null)}function nT(){Fi.clear()}async function Bi(t){let e=[];if(t.instructionBlock&&e.push(t.instructionBlock),t.customSystemPrompt?e.push(t.customSystemPrompt):t.basePrompt&&e.push(t.basePrompt),t.sections?.length){let r=await P$(t.sections);e.push(...r)}return t.appendSystemPrompt&&e.push(t.appendSystemPrompt),e.filter(Boolean).join(`
603
603
 
604
- `)}var P$=250;async function oT(t,e){let r=new AbortController;t.activeTurn&&(t.activeTurn.abort(),await x$(t.turnDone)),t.activeTurn=r;let n;return t.turnDone=new Promise(o=>{n=o}),e&&e!==t.currentSessionId&&(t.currentSessionId&&t.currentHooks&&(t.currentHooks.invoke("session.ended",{sessionId:t.currentSessionId}).catch(()=>{}),nT()),t.currentSessionId=e,t.sessionState=new fr(e),t.sessionTaskDomain=void 0,t.memoryPrefetchState=kt(),t.enableIdleDream()),{abortController:r,resolveTurnDone:n}}async function x$(t){let e;try{await Promise.race([t,new Promise(r=>{e=setTimeout(r,P$),e.unref?.()})])}finally{e&&clearTimeout(e)}}function ep(t,e){t.activeTurn===e.abortController&&(t.activeTurn=null),e.resolveTurnDone()}import*as Co from"node:path";var C$=1800*1e3,iT=new hr;function aT(t){let{config:e,host:r,sessionId:n}=t;if(e?.workdir&&typeof e.workdir=="string"&&r.setActiveWorkdir(e.workdir),!e?.workdir&&n&&e?.projectId){let i=e.projectId;try{let a=iT.getProjectWorkspaceDir(i);r.getActiveProjectRoot()!==a&&(r.log(`[turn] routing session ${n} to project ${i} (${a})`),r.setActiveWorkdir(a))}catch{r.log(`[turn] project ${i} not found, using active project`)}}e?.sessionType==="group"&&typeof e?.groupKey=="string"&&I$(e,r);let o=E$(e,r,t.nowMs??Date.now()),s=M$(e,r);return{sessionProjectRoot:s,sessionProjectId:_$(e,s,n),projectHintStale:o.projectHintStale,staleProjectHintContext:o.staleProjectHintContext}}function I$(t,e){let r=t.groupKey,n=r.split(":"),o=n.length>=3?n.slice(1).join(":"):r,s=Ns(o);if(s){e.setActiveWorkdir(s.workspaceDir),ne()?.id!==s.id&&Ct(s.id);return}let i=t.groupName||o,a=o.replace(/[<>:"/\\|?*\x00-\x1f]/g,"_").trim()||"group",c=Co.join(I().getUserAgentHome(),"workspaces","groups",a),l=Ds({name:i,workspaceDir:c,type:"group",groupId:o});e.setActiveWorkdir(l.workspaceDir),Ct(l.id),e.sendNotification("project.created",{id:l.id,name:l.name,type:"group",groupId:o,workspaceDir:l.workspaceDir})}function E$(t,e,r){let n=t?.projectHint,o=n&&typeof n=="object"&&"name"in n?n:typeof n=="string"?{name:n,updatedAt:r}:null;if(!o||t?.sessionType==="group")return{projectHintStale:!1};let s=r-o.updatedAt;if(s>C$)return e.log(`[projectHint] stale (${Math.round(s/6e4)}min old), skipping auto-switch`),{projectHintStale:!0,staleProjectHintContext:{activeProjectName:ne()?.name,projectNames:K().filter(l=>l.status==="active").map(l=>l.name).slice(0,10)}};let i=o.name,a=ne();if(!a||a.name.toLowerCase()!==i.toLowerCase()){let c=K(),l=i.toLowerCase(),d=c.find(p=>p.name.toLowerCase()===l)??c.find(p=>p.name.toLowerCase().includes(l));d&&d.status==="active"&&(Ct(d.id),e.setActiveWorkdir(d.workspaceDir))}return{projectHintStale:!1}}function M$(t,e){if(typeof t?.workdir=="string"&&t.workdir)return t.workdir;let r=t?.projectId;if(r)try{return iT.getProjectWorkspaceDir(r)}catch{}return e.getActiveProjectRoot()}function _$(t,e,r){if(r){let i=Vt(r,e);if(i?.projectId)return i.projectId}let n=t?.projectId;if(n&&Te(n))return n;let o=ne();return o&&sT(o.workspaceDir,e)?o.id:K().find(i=>sT(i.workspaceDir,e))?.id}function sT(t,e){return Co.resolve(t).toLowerCase()===Co.resolve(e).toLowerCase()}import{randomUUID as cT}from"node:crypto";function qi(t){let{event:e,turnId:r,now:n,host:o}=t;switch(e.type){case"delta":return o.sendNotification("turn.delta",{turnId:e.turnId,text:e.text,item:{id:`${r}-delta`,type:"message",role:"assistant",text:e.text,createdAt:n}}),!0;case"tool_call":return o.sendNotification("turn.tool_call",{turnId:e.turnId,callId:e.callId,name:e.name,arguments:e.arguments,...e.inputSummary?{inputSummary:e.inputSummary}:{},item:{id:e.callId,type:"tool_call",role:"assistant",toolName:e.name,toolCallId:e.callId,arguments:e.arguments,createdAt:n}}),!0;case"tool_result":return o.sendNotification("turn.tool_result",{turnId:e.turnId,callId:e.callId,name:e.name,ok:e.ok,...e.error?{error:e.error}:{},...e.outputPreview?{outputPreview:e.outputPreview}:{},...e.durationMs!==void 0?{durationMs:e.durationMs}:{},...e.exitCode!==void 0?{exitCode:e.exitCode}:{},...e.stdout?{stdout:e.stdout}:{},...e.stderr?{stderr:e.stderr}:{},...e.details?{details:e.details}:{},item:{id:`${e.callId}-result`,type:"tool_result",role:"assistant",toolName:e.name,toolCallId:e.callId,output:e.ok?e.outputPreview??"":e.error,approved:e.ok,createdAt:n}}),!0;case"tool_blocked":return o.sendNotification("turn.tool_blocked",{turnId:e.turnId,callId:e.callId,name:e.name,reason:e.reason,item:{id:`${e.callId}-blocked`,type:"tool_blocked",role:"system",toolName:e.name,toolCallId:e.callId,text:e.reason,approved:!1,createdAt:n}}),!0;case"recovery":return o.sendNotification("turn.recovery",{turnId:e.turnId,action:e.action,...e.detail?{detail:e.detail}:{},item:{id:`${r}-recovery-${cT().slice(0,8)}`,type:"recovery",role:"system",strategy:e.action,text:e.detail,createdAt:n}}),!0;case"plan_update":return o.sendNotification("turn.plan_update",{turnId:e.turnId,slug:e.slug,content:e.content,item:{id:`${r}-plan-${cT().slice(0,8)}`,type:"plan_update",role:"assistant",text:e.content,createdAt:n}}),!0;case"reasoning_delta":return o.sendNotification("turn.reasoning_delta",{turnId:e.turnId,text:e.text}),!0;case"suggestions":return o.sendNotification("turn.suggestions",{turnId:e.turnId,items:e.items}),!0;case"media_result":return o.sendNotification("turn.media_result",{turnId:e.turnId,mediaType:e.mediaType,url:e.url,...e.model?{model:e.model}:{},...e.provider?{provider:e.provider}:{},...e.taskId?{taskId:e.taskId}:{}}),!0;case"artifact":return o.sendNotification("turn.artifact",{turnId:e.turnId,artifactId:e.artifactId,type:e.artifactType,title:e.title,...e.filePath?{filePath:e.filePath}:{},...e.language?{language:e.language}:{},...e.content?{content:e.content}:{},...e.mimeType?{mimeType:e.mimeType}:{}}),!0;case"subagent_started":return o.sendNotification("turn.subagent_started",{turnId:e.turnId,subagentId:e.subagentId,agentType:e.agentType,...e.prompt?{prompt:e.prompt}:{}}),!0;case"subagent_ended":return o.sendNotification("turn.subagent_ended",{turnId:e.turnId,subagentId:e.subagentId,agentType:e.agentType,ok:e.ok,...e.outputPreview?{outputPreview:e.outputPreview}:{},...e.error?{error:e.error}:{}}),!0;case"annotations":return o.sendNotification("turn.annotations",{turnId:e.turnId,annotations:e.annotations}),!0;case"heartbeat":return o.sendNotification("turn.heartbeat",{turnId:e.turnId,message:e.message}),!0;case"tool_use_summary":return o.sendNotification("turn.tool_use_summary",{turnId:e.turnId,summary:e.summary}),!0;default:return!1}}var D$=`[SUGGESTION MODE]
604
+ `)}var x$=250;async function oT(t,e){let r=new AbortController;t.activeTurn&&(t.activeTurn.abort(),await C$(t.turnDone)),t.activeTurn=r;let n;return t.turnDone=new Promise(o=>{n=o}),e&&e!==t.currentSessionId&&(t.currentSessionId&&t.currentHooks&&(t.currentHooks.invoke("session.ended",{sessionId:t.currentSessionId}).catch(()=>{}),nT()),t.currentSessionId=e,t.sessionState=new fr(e),t.sessionTaskDomain=void 0,t.memoryPrefetchState=kt(),t.enableIdleDream()),{abortController:r,resolveTurnDone:n}}async function C$(t){let e;try{await Promise.race([t,new Promise(r=>{e=setTimeout(r,x$),e.unref?.()})])}finally{e&&clearTimeout(e)}}function ep(t,e){t.activeTurn===e.abortController&&(t.activeTurn=null),e.resolveTurnDone()}import*as Co from"node:path";var I$=1800*1e3,iT=new hr;function aT(t){let{config:e,host:r,sessionId:n}=t;if(e?.workdir&&typeof e.workdir=="string"&&r.setActiveWorkdir(e.workdir),!e?.workdir&&n&&e?.projectId){let i=e.projectId;try{let a=iT.getProjectWorkspaceDir(i);r.getActiveProjectRoot()!==a&&(r.log(`[turn] routing session ${n} to project ${i} (${a})`),r.setActiveWorkdir(a))}catch{r.log(`[turn] project ${i} not found, using active project`)}}e?.sessionType==="group"&&typeof e?.groupKey=="string"&&E$(e,r);let o=M$(e,r,t.nowMs??Date.now()),s=_$(e,r);return{sessionProjectRoot:s,sessionProjectId:D$(e,s,n),projectHintStale:o.projectHintStale,staleProjectHintContext:o.staleProjectHintContext}}function E$(t,e){let r=t.groupKey,n=r.split(":"),o=n.length>=3?n.slice(1).join(":"):r,s=Ns(o);if(s){e.setActiveWorkdir(s.workspaceDir),ne()?.id!==s.id&&Ct(s.id);return}let i=t.groupName||o,a=o.replace(/[<>:"/\\|?*\x00-\x1f]/g,"_").trim()||"group",c=Co.join(I().getUserAgentHome(),"workspaces","groups",a),l=Ds({name:i,workspaceDir:c,type:"group",groupId:o});e.setActiveWorkdir(l.workspaceDir),Ct(l.id),e.sendNotification("project.created",{id:l.id,name:l.name,type:"group",groupId:o,workspaceDir:l.workspaceDir})}function M$(t,e,r){let n=t?.projectHint,o=n&&typeof n=="object"&&"name"in n?n:typeof n=="string"?{name:n,updatedAt:r}:null;if(!o||t?.sessionType==="group")return{projectHintStale:!1};let s=r-o.updatedAt;if(s>I$)return e.log(`[projectHint] stale (${Math.round(s/6e4)}min old), skipping auto-switch`),{projectHintStale:!0,staleProjectHintContext:{activeProjectName:ne()?.name,projectNames:K().filter(l=>l.status==="active").map(l=>l.name).slice(0,10)}};let i=o.name,a=ne();if(!a||a.name.toLowerCase()!==i.toLowerCase()){let c=K(),l=i.toLowerCase(),d=c.find(p=>p.name.toLowerCase()===l)??c.find(p=>p.name.toLowerCase().includes(l));d&&d.status==="active"&&(Ct(d.id),e.setActiveWorkdir(d.workspaceDir))}return{projectHintStale:!1}}function _$(t,e){if(typeof t?.workdir=="string"&&t.workdir)return t.workdir;let r=t?.projectId;if(r)try{return iT.getProjectWorkspaceDir(r)}catch{}return e.getActiveProjectRoot()}function D$(t,e,r){if(r){let i=Vt(r,e);if(i?.projectId)return i.projectId}let n=t?.projectId;if(n&&Te(n))return n;let o=ne();return o&&sT(o.workspaceDir,e)?o.id:K().find(i=>sT(i.workspaceDir,e))?.id}function sT(t,e){return Co.resolve(t).toLowerCase()===Co.resolve(e).toLowerCase()}import{randomUUID as cT}from"node:crypto";function qi(t){let{event:e,turnId:r,now:n,host:o}=t;switch(e.type){case"delta":return o.sendNotification("turn.delta",{turnId:e.turnId,text:e.text,item:{id:`${r}-delta`,type:"message",role:"assistant",text:e.text,createdAt:n}}),!0;case"tool_call":return o.sendNotification("turn.tool_call",{turnId:e.turnId,callId:e.callId,name:e.name,arguments:e.arguments,...e.inputSummary?{inputSummary:e.inputSummary}:{},item:{id:e.callId,type:"tool_call",role:"assistant",toolName:e.name,toolCallId:e.callId,arguments:e.arguments,createdAt:n}}),!0;case"tool_result":return o.sendNotification("turn.tool_result",{turnId:e.turnId,callId:e.callId,name:e.name,ok:e.ok,...e.error?{error:e.error}:{},...e.outputPreview?{outputPreview:e.outputPreview}:{},...e.durationMs!==void 0?{durationMs:e.durationMs}:{},...e.exitCode!==void 0?{exitCode:e.exitCode}:{},...e.stdout?{stdout:e.stdout}:{},...e.stderr?{stderr:e.stderr}:{},...e.details?{details:e.details}:{},item:{id:`${e.callId}-result`,type:"tool_result",role:"assistant",toolName:e.name,toolCallId:e.callId,output:e.ok?e.outputPreview??"":e.error,approved:e.ok,createdAt:n}}),!0;case"tool_blocked":return o.sendNotification("turn.tool_blocked",{turnId:e.turnId,callId:e.callId,name:e.name,reason:e.reason,item:{id:`${e.callId}-blocked`,type:"tool_blocked",role:"system",toolName:e.name,toolCallId:e.callId,text:e.reason,approved:!1,createdAt:n}}),!0;case"recovery":return o.sendNotification("turn.recovery",{turnId:e.turnId,action:e.action,...e.detail?{detail:e.detail}:{},item:{id:`${r}-recovery-${cT().slice(0,8)}`,type:"recovery",role:"system",strategy:e.action,text:e.detail,createdAt:n}}),!0;case"plan_update":return o.sendNotification("turn.plan_update",{turnId:e.turnId,slug:e.slug,content:e.content,item:{id:`${r}-plan-${cT().slice(0,8)}`,type:"plan_update",role:"assistant",text:e.content,createdAt:n}}),!0;case"reasoning_delta":return o.sendNotification("turn.reasoning_delta",{turnId:e.turnId,text:e.text}),!0;case"suggestions":return o.sendNotification("turn.suggestions",{turnId:e.turnId,items:e.items}),!0;case"media_result":return o.sendNotification("turn.media_result",{turnId:e.turnId,mediaType:e.mediaType,url:e.url,...e.model?{model:e.model}:{},...e.provider?{provider:e.provider}:{},...e.taskId?{taskId:e.taskId}:{}}),!0;case"artifact":return o.sendNotification("turn.artifact",{turnId:e.turnId,artifactId:e.artifactId,type:e.artifactType,title:e.title,...e.filePath?{filePath:e.filePath}:{},...e.language?{language:e.language}:{},...e.content?{content:e.content}:{},...e.mimeType?{mimeType:e.mimeType}:{}}),!0;case"subagent_started":return o.sendNotification("turn.subagent_started",{turnId:e.turnId,subagentId:e.subagentId,agentType:e.agentType,...e.prompt?{prompt:e.prompt}:{}}),!0;case"subagent_ended":return o.sendNotification("turn.subagent_ended",{turnId:e.turnId,subagentId:e.subagentId,agentType:e.agentType,ok:e.ok,...e.outputPreview?{outputPreview:e.outputPreview}:{},...e.error?{error:e.error}:{}}),!0;case"annotations":return o.sendNotification("turn.annotations",{turnId:e.turnId,annotations:e.annotations}),!0;case"heartbeat":return o.sendNotification("turn.heartbeat",{turnId:e.turnId,message:e.message}),!0;case"tool_use_summary":return o.sendNotification("turn.tool_use_summary",{turnId:e.turnId,summary:e.summary}),!0;default:return!1}}var N$=`[SUGGESTION MODE]
605
605
  Based on the conversation, suggest 1-3 short follow-up actions the user might naturally do next.
606
606
  Be specific: "run the tests" beats "continue".
607
607
  Stay silent if the next step isn't obvious.
608
- Reply with ONLY a JSON array: [{"text":"short suggestion"}]. No explanation.`;async function lT({turnId:t,messages:e,client:r,sendNotification:n}){if(e.filter(i=>i.role==="assistant").length<1||!r)return;let s=[...e.slice(-6),{role:"user",content:D$}];try{let i="";for await(let d of r.transport.stream({model:r.model,messages:s,temperature:.3,maxTokens:200},r.apiKey))d.type==="delta"&&(i+=d.text);let a=i.match(/\[[\s\S]*\]/);if(!a)return;let c=JSON.parse(a[0]),l=Array.isArray(c)?c.filter(d=>typeof d.text=="string"&&d.text.length>0).slice(0,5):[];l.length>0&&n("turn.suggestions",{turnId:t,items:l})}catch{}}import{existsSync as dT,mkdirSync as N$,readFileSync as Io,writeFileSync as uT}from"node:fs";import{join as pT}from"node:path";var Wi=new Set(["coding","office","creative","general"]),L$="settings.yaml";function O$(t){try{let e=I().getProjectSettingsPath(t),n=Io(e,"utf-8").match(/^taskDomain\s*:\s*(\w+)/m);if(n){let o=n[1].toLowerCase();if(Wi.has(o))return o}}catch{}try{let e=I().getProjectInstructionsPath(t),n=Io(e,"utf-8").match(/^---\r?\n[\s\S]*?\r?\n---/);if(n){let o=n[0].match(/^domain\s*:\s*(\w+)/m);if(o){let s=o[1].toLowerCase();if(Wi.has(s))return s}}}catch{}try{let e=pT(t,"INSTRUCTIONS.md"),n=Io(e,"utf-8").match(/^---\r?\n[\s\S]*?\r?\n---/);if(n){let o=n[0].match(/^domain\s*:\s*(\w+)/m);if(o){let s=o[1].toLowerCase();if(Wi.has(s))return s}}}catch{}}var j$=3;function $$(t,e){let r=B$(t);return e?r===e||r==="general"?e:(rp(t)[r]??0)>=j$?r:e:r}var U$=/\b(?:code|coding|bug|debug|fix|refactor|function|class|method|api|compile|build|deploy|test|unittest|lint|git|commit|merge|branch|pull\s*request|PR|npm|pnpm|yarn|pip|docker|k8s|kubernetes|sql|database|migration|endpoint|route|middleware|typescript|javascript|python|java|rust|go(?:lang)?|css|html|react|vue|angular|nextjs|express|fastapi|flask|django|springboot|webpack|vite|rollup|esbuild|CI\/?CD|GitHub\s*Actions|workflow|pipeline|variable|const|let|var|import|export|module|package|dependency|dependencies|node_modules|tsconfig|eslint|prettier|interface|type\b|enum|struct|async|await|promise|callback|exception|error\s*handling|stack\s*trace|breakpoint|源码|代码|编程|编码|调试|重构|修复|Bug|函数|类|方法|接口|模块|依赖|组件|编译|构建|部署|测试|单元测试|提交|合并|分支|数据库|迁移|路由|中间件)\b/i,F$=/\b(?:report|document|spreadsheet|excel|csv|table|chart|graph|data\s*analysis|statistics|slides?|presentation|ppt|powerpoint|email|mail|memo|minutes|meeting|schedule|calendar|summary|summarize|brief|overview|outline|template|format|agenda|invoice|budget|forecast|dashboard|KPI|OKR|metric|analytics|insight|文档|报告|报表|表格|数据分析|统计|幻灯片|PPT|演示|邮件|信件|备忘录|会议纪要|日程|摘要|总结|概要|简报|模板|格式|议程|发票|预算|预测|看板|报表|分析)\b/i,H$=/\b(?:write|writing|essay|article|blog|story|novel|poem|poetry|lyrics|copywriting|copy|slogan|tagline|headline|marketing|campaign|branding|creative|brainstorm|idea|concept|draft|narrative|character|dialogue|script|screenplay|pitch|proposal|content\s*strategy|social\s*media|SEO|newsletter|press\s*release|写作|文章|博客|故事|小说|诗|歌词|文案|标语|营销|策划|品牌|创意|头脑风暴|灵感|构思|草稿|叙事|角色|对话|剧本|策划案|提案|内容策略|自媒体|公众号|推文|软文|种草)\b/i;function B$(t){if(!t||t.trim().length===0)return"general";let e=rp(t),r=Math.max(e.coding,e.office,e.creative);return r===0||[e.coding,e.office,e.creative].filter(o=>o>=r-1&&o>0).length>=2&&r<=2?"general":e.coding===r?"coding":e.office===r?"office":e.creative===r?"creative":"general"}function rp(t){return{coding:tp(t,U$),office:tp(t,F$),creative:tp(t,H$),general:0}}function tp(t,e){let r=new RegExp(e.source,"gi"),n=t.match(r);return n?n.length:0}function mT(t){let e=O$(t.cwd);if(e)return{domain:e,source:"project-file"};if(t.hostOverride&&Wi.has(t.hostOverride))return{domain:t.hostOverride,source:"host-override"};let r=$$(t.userText,t.sessionDomain);return t.sessionDomain&&r===t.sessionDomain?{domain:r,source:"session-sticky"}:{domain:r,source:"auto-detect"}}var q$=3;function gT(t,e){if(e==="general")return!1;try{let r=I().getProjectAgentDir(t),n=pT(r,L$);if(dT(n)){let s=Io(n,"utf-8");if(/^taskDomain\s*:/m.test(s))return!1}N$(r,{recursive:!0});let o=`# Auto-detected task domain for this workspace.
608
+ Reply with ONLY a JSON array: [{"text":"short suggestion"}]. No explanation.`;async function lT({turnId:t,messages:e,client:r,sendNotification:n}){if(e.filter(i=>i.role==="assistant").length<1||!r)return;let s=[...e.slice(-6),{role:"user",content:N$}];try{let i="";for await(let d of r.transport.stream({model:r.model,messages:s,temperature:.3,maxTokens:200},r.apiKey))d.type==="delta"&&(i+=d.text);let a=i.match(/\[[\s\S]*\]/);if(!a)return;let c=JSON.parse(a[0]),l=Array.isArray(c)?c.filter(d=>typeof d.text=="string"&&d.text.length>0).slice(0,5):[];l.length>0&&n("turn.suggestions",{turnId:t,items:l})}catch{}}import{existsSync as dT,mkdirSync as L$,readFileSync as Io,writeFileSync as uT}from"node:fs";import{join as pT}from"node:path";var Wi=new Set(["coding","office","creative","general"]),O$="settings.yaml";function j$(t){try{let e=I().getProjectSettingsPath(t),n=Io(e,"utf-8").match(/^taskDomain\s*:\s*(\w+)/m);if(n){let o=n[1].toLowerCase();if(Wi.has(o))return o}}catch{}try{let e=I().getProjectInstructionsPath(t),n=Io(e,"utf-8").match(/^---\r?\n[\s\S]*?\r?\n---/);if(n){let o=n[0].match(/^domain\s*:\s*(\w+)/m);if(o){let s=o[1].toLowerCase();if(Wi.has(s))return s}}}catch{}try{let e=pT(t,"INSTRUCTIONS.md"),n=Io(e,"utf-8").match(/^---\r?\n[\s\S]*?\r?\n---/);if(n){let o=n[0].match(/^domain\s*:\s*(\w+)/m);if(o){let s=o[1].toLowerCase();if(Wi.has(s))return s}}}catch{}}var $$=3;function U$(t,e){let r=q$(t);return e?r===e||r==="general"?e:(rp(t)[r]??0)>=$$?r:e:r}var F$=/\b(?:code|coding|bug|debug|fix|refactor|function|class|method|api|compile|build|deploy|test|unittest|lint|git|commit|merge|branch|pull\s*request|PR|npm|pnpm|yarn|pip|docker|k8s|kubernetes|sql|database|migration|endpoint|route|middleware|typescript|javascript|python|java|rust|go(?:lang)?|css|html|react|vue|angular|nextjs|express|fastapi|flask|django|springboot|webpack|vite|rollup|esbuild|CI\/?CD|GitHub\s*Actions|workflow|pipeline|variable|const|let|var|import|export|module|package|dependency|dependencies|node_modules|tsconfig|eslint|prettier|interface|type\b|enum|struct|async|await|promise|callback|exception|error\s*handling|stack\s*trace|breakpoint|源码|代码|编程|编码|调试|重构|修复|Bug|函数|类|方法|接口|模块|依赖|组件|编译|构建|部署|测试|单元测试|提交|合并|分支|数据库|迁移|路由|中间件)\b/i,H$=/\b(?:report|document|spreadsheet|excel|csv|table|chart|graph|data\s*analysis|statistics|slides?|presentation|ppt|powerpoint|email|mail|memo|minutes|meeting|schedule|calendar|summary|summarize|brief|overview|outline|template|format|agenda|invoice|budget|forecast|dashboard|KPI|OKR|metric|analytics|insight|文档|报告|报表|表格|数据分析|统计|幻灯片|PPT|演示|邮件|信件|备忘录|会议纪要|日程|摘要|总结|概要|简报|模板|格式|议程|发票|预算|预测|看板|报表|分析)\b/i,B$=/\b(?:write|writing|essay|article|blog|story|novel|poem|poetry|lyrics|copywriting|copy|slogan|tagline|headline|marketing|campaign|branding|creative|brainstorm|idea|concept|draft|narrative|character|dialogue|script|screenplay|pitch|proposal|content\s*strategy|social\s*media|SEO|newsletter|press\s*release|写作|文章|博客|故事|小说|诗|歌词|文案|标语|营销|策划|品牌|创意|头脑风暴|灵感|构思|草稿|叙事|角色|对话|剧本|策划案|提案|内容策略|自媒体|公众号|推文|软文|种草)\b/i;function q$(t){if(!t||t.trim().length===0)return"general";let e=rp(t),r=Math.max(e.coding,e.office,e.creative);return r===0||[e.coding,e.office,e.creative].filter(o=>o>=r-1&&o>0).length>=2&&r<=2?"general":e.coding===r?"coding":e.office===r?"office":e.creative===r?"creative":"general"}function rp(t){return{coding:tp(t,F$),office:tp(t,H$),creative:tp(t,B$),general:0}}function tp(t,e){let r=new RegExp(e.source,"gi"),n=t.match(r);return n?n.length:0}function mT(t){let e=j$(t.cwd);if(e)return{domain:e,source:"project-file"};if(t.hostOverride&&Wi.has(t.hostOverride))return{domain:t.hostOverride,source:"host-override"};let r=U$(t.userText,t.sessionDomain);return t.sessionDomain&&r===t.sessionDomain?{domain:r,source:"session-sticky"}:{domain:r,source:"auto-detect"}}var W$=3;function gT(t,e){if(e==="general")return!1;try{let r=I().getProjectAgentDir(t),n=pT(r,O$);if(dT(n)){let s=Io(n,"utf-8");if(/^taskDomain\s*:/m.test(s))return!1}L$(r,{recursive:!0});let o=`# Auto-detected task domain for this workspace.
609
609
  # Values: coding | office | creative | general
610
610
  `;if(dT(n)){let s=Io(n,"utf-8");uT(n,s.trimEnd()+`
611
611
 
612
612
  `+o+`taskDomain: ${e}
613
613
  `,"utf-8")}else uT(n,o+`taskDomain: ${e}
614
- `,"utf-8");return!0}catch{return!1}}function fT(t,e){return e==="general"?!1:(rp(t)[e]??0)>=q$}import{release as W$,homedir as G$}from"node:os";import{resolve as hT}from"node:path";function z$(){let e=(process.env.SHELL??process.env.ComSpec??"").toLowerCase();return e.includes("zsh")?"zsh":e.includes("bash")?"bash":e.includes("fish")?"fish":e.includes("powershell")||e.includes("pwsh")?"powershell":e.includes("cmd")?"cmd":process.platform==="win32"?"powershell":"bash"}function K$(){let t=process.platform,e=W$();return t==="win32"?e.toLowerCase().includes("microsoft")||e.toLowerCase().includes("wsl")?"Windows (WSL)":`Windows ${e.split(".")[0]??""}`.trim():t==="darwin"?"macOS":t==="linux"?"Linux":t}function zi(t){let e=hT(t??process.cwd());return Hi(`environment_context:${e}`,()=>{let r=z$(),n=K$(),o=process.version,s=G$(),i=["# Environment","",`- Platform: ${n}`,`- Shell: ${r}`,`- Working directory: ${hT(e)}`,`- Home directory: ${s}`,`- Node.js: ${o}`];return r==="powershell"?i.push("- Note: Use PowerShell syntax (semicolons, not &&; use $env: for env vars)"):r==="cmd"&&i.push("- Note: Use CMD syntax (%VAR%, not $VAR)"),i.join(`
615
- `)})}function Gi(){return["## Problem Solving","- If an approach fails, diagnose why before switching tactics \u2014 read the error, check your assumptions, try a focused fix. Don't retry the identical action blindly, but don't abandon a viable approach after a single failure either.","- Report outcomes faithfully: if verification fails, say so with the relevant output; if you did not run a verification step, say that rather than implying it succeeded.","- Do not create files unless they are absolutely necessary for achieving your goal. Prefer editing an existing file to creating a new one.","","## Safety","- Be careful not to introduce security vulnerabilities such as command injection, XSS, SQL injection, and other OWASP top 10 vulnerabilities.","- If you notice that you wrote insecure code, immediately fix it. Prioritize writing safe, secure, and correct code."]}function V$(){return["# Doing Tasks","","You will primarily perform software engineering tasks: solving bugs, adding new functionality, refactoring code, and more.","","## Code Quality","- In general, do not propose changes to code you haven't read. If you need to modify a file, read it first. Understand existing code before suggesting modifications.","","## Implementation Discipline",`- Don't add features, refactor code, or make "improvements" beyond what was asked. A bug fix doesn't need surrounding code cleaned up. A simple feature doesn't need extra configurability.`,"- Don't add error handling, fallbacks, or validation for scenarios that can't happen. Trust internal code and framework guarantees. Only validate at system boundaries (user input, external APIs).","- Don't create helpers, utilities, or abstractions for one-time operations. Don't design for hypothetical future requirements. Three similar lines of code is better than a premature abstraction.","- Default to writing no comments unless the WHY is non-obvious: a hidden constraint, a subtle invariant, a workaround for a specific bug. Don't explain WHAT the code does \u2014 well-named identifiers already do that.",'- Avoid backwards-compatibility hacks like renaming unused _vars, re-exporting types, adding "// removed" comments for removed code. If code is unused, delete it completely.',"","## Completeness and Correctness","- When a task lists multiple constraints or requirements, implement ALL of them explicitly. Do not drop any.","- When refactoring, commit fully to the new pattern. Do NOT mix old and new patterns in the same codebase.","- After making changes, verify you met every requirement from the original request.","- For security fixes, use standard proven patterns (parameterized queries, input validation, etc.).","- NEVER leave TODO comments, placeholder implementations, or stub functions. Every function you write must have a complete, working implementation.","- When creating multiple files that import from each other, ensure every import resolves to a real export. Do not leave dead imports or forward declarations without implementations.","- If you create a file with a function signature, you MUST provide the full body \u2014 not `// implement later` or `throw new Error('not implemented')`.","","## Proactive Action","- When asked to fix, change, or improve code, implement the changes directly by writing to the file. Do not merely describe what should be changed.","- When you identify issues (bugs, security vulnerabilities, style problems), fix them immediately using your tools rather than listing recommendations.","- Default to action: read the file, make the fix, write it back. Only describe without acting when explicitly asked for advice or review only.","","## Faithful Reporting","- Report outcomes faithfully: if a tool call failed, say so with the error output. Do not claim success when a tool returned an error.","- If you did not run a verification step, say that rather than implying it succeeded.","- Never claim 'all tests pass' or 'file created successfully' when tool output shows otherwise.","- If you are unsure whether your changes are complete, state that explicitly rather than asserting completeness."]}function X$(){return["# Doing Tasks","","You will assist with office and analytical tasks: reports, data analysis, documents, presentations, and more.","","## Accuracy and Rigor","- Verify numerical calculations and statistical claims. When presenting data, ensure totals, percentages, and comparisons are mathematically correct.","- Distinguish clearly between facts, inferences, and assumptions. Label uncertain information explicitly.","- When summarizing source material, preserve the original meaning. Do not introduce information not present in the source.","","## Structure and Formatting","- Use clear headings, bullet points, and tables to organize information. Match the formatting conventions of the document type (report, memo, email, slides).","- For data-heavy outputs, prefer tables over prose. Include units, time periods, and comparison baselines.","- Keep language professional and concise. Avoid filler, hedging, and unnecessary qualifiers.","","## Completeness","- When the task lists multiple sections, data points, or requirements, address ALL of them. Do not silently omit items.","- If source data is insufficient to answer a question, state what is missing rather than guessing."]}function Y$(){return["# Doing Tasks","","You will assist with creative and content tasks: writing, copywriting, brainstorming, and content strategy.","","## Voice and Style","- Match the requested tone, register, and style. If no style is specified, adapt to the content type (formal for press releases, conversational for blog posts, punchy for ad copy).","- Vary sentence length and structure for rhythm. Avoid monotonous patterns.","- Show, don't tell where appropriate. Use concrete details and vivid language over abstract statements.","","## Audience Awareness","- Write for the intended audience. Consider their knowledge level, interests, and expectations.","- For marketing/copywriting, lead with the benefit. Focus on what matters to the reader, not the feature list.","- Respect cultural context and sensitivity in language choices.","","## Creative Process","- When brainstorming, provide diverse options rather than variations on a single idea. Quantity and variety first, then refine.","- When editing existing text, preserve the author's voice. Make targeted improvements rather than rewriting from scratch.","- If creative constraints are given (word count, format, platform), follow them precisely."]}function yT(t="general"){return qt("task_guidance",()=>{let e;switch(t){case"coding":e=[...V$(),"",...Gi()];break;case"office":e=[...X$(),"",...Gi()];break;case"creative":e=[...Y$(),"",...Gi()];break;default:e=["# Doing Tasks","","You are a versatile assistant that handles software engineering, office, and creative tasks.","",...Gi(),"","## When Coding","- Read existing code before modifying it. Understand the structure before making changes.","- When refactoring, commit fully to the new pattern. Do NOT mix old and new patterns.","- Implement ALL listed constraints or requirements explicitly. Do not drop any.","- Don't add features or abstractions beyond what was asked.","- When asked to fix or change code, implement changes directly by writing to the file \u2014 do not merely describe what to change.","","## When Writing Documents or Analyzing Data","- Verify numerical calculations and statistical claims for correctness.","- Use clear structure: headings, tables, bullet points as appropriate.","- Distinguish facts from inferences. Label uncertain information.","","## When Creating Content","- Match the requested tone, style, and audience. Adapt if not specified.","- Lead with the benefit for marketing/copywriting tasks.","- Provide diverse options when brainstorming."];break}return e.join(`
614
+ `,"utf-8");return!0}catch{return!1}}function fT(t,e){return e==="general"?!1:(rp(t)[e]??0)>=W$}import{release as G$,homedir as z$}from"node:os";import{resolve as hT}from"node:path";function K$(){let e=(process.env.SHELL??process.env.ComSpec??"").toLowerCase();return e.includes("zsh")?"zsh":e.includes("bash")?"bash":e.includes("fish")?"fish":e.includes("powershell")||e.includes("pwsh")?"powershell":e.includes("cmd")?"cmd":process.platform==="win32"?"powershell":"bash"}function V$(){let t=process.platform,e=G$();return t==="win32"?e.toLowerCase().includes("microsoft")||e.toLowerCase().includes("wsl")?"Windows (WSL)":`Windows ${e.split(".")[0]??""}`.trim():t==="darwin"?"macOS":t==="linux"?"Linux":t}function zi(t){let e=hT(t??process.cwd());return Hi(`environment_context:${e}`,()=>{let r=K$(),n=V$(),o=process.version,s=z$(),i=["# Environment","",`- Platform: ${n}`,`- Shell: ${r}`,`- Working directory: ${hT(e)}`,`- Home directory: ${s}`,`- Node.js: ${o}`];return r==="powershell"?i.push("- Note: Use PowerShell syntax (semicolons, not &&; use $env: for env vars)"):r==="cmd"&&i.push("- Note: Use CMD syntax (%VAR%, not $VAR)"),i.join(`
615
+ `)})}function Gi(){return["## Problem Solving","- If an approach fails, diagnose why before switching tactics \u2014 read the error, check your assumptions, try a focused fix. Don't retry the identical action blindly, but don't abandon a viable approach after a single failure either.","- Report outcomes faithfully: if verification fails, say so with the relevant output; if you did not run a verification step, say that rather than implying it succeeded.","- Do not create files unless they are absolutely necessary for achieving your goal. Prefer editing an existing file to creating a new one.","","## Safety","- Be careful not to introduce security vulnerabilities such as command injection, XSS, SQL injection, and other OWASP top 10 vulnerabilities.","- If you notice that you wrote insecure code, immediately fix it. Prioritize writing safe, secure, and correct code."]}function X$(){return["# Doing Tasks","","You will primarily perform software engineering tasks: solving bugs, adding new functionality, refactoring code, and more.","","## Code Quality","- In general, do not propose changes to code you haven't read. If you need to modify a file, read it first. Understand existing code before suggesting modifications.","","## Implementation Discipline",`- Don't add features, refactor code, or make "improvements" beyond what was asked. A bug fix doesn't need surrounding code cleaned up. A simple feature doesn't need extra configurability.`,"- Don't add error handling, fallbacks, or validation for scenarios that can't happen. Trust internal code and framework guarantees. Only validate at system boundaries (user input, external APIs).","- Don't create helpers, utilities, or abstractions for one-time operations. Don't design for hypothetical future requirements. Three similar lines of code is better than a premature abstraction.","- Default to writing no comments unless the WHY is non-obvious: a hidden constraint, a subtle invariant, a workaround for a specific bug. Don't explain WHAT the code does \u2014 well-named identifiers already do that.",'- Avoid backwards-compatibility hacks like renaming unused _vars, re-exporting types, adding "// removed" comments for removed code. If code is unused, delete it completely.',"","## Completeness and Correctness","- When a task lists multiple constraints or requirements, implement ALL of them explicitly. Do not drop any.","- When refactoring, commit fully to the new pattern. Do NOT mix old and new patterns in the same codebase.","- After making changes, verify you met every requirement from the original request.","- For security fixes, use standard proven patterns (parameterized queries, input validation, etc.).","- NEVER leave TODO comments, placeholder implementations, or stub functions. Every function you write must have a complete, working implementation.","- When creating multiple files that import from each other, ensure every import resolves to a real export. Do not leave dead imports or forward declarations without implementations.","- If you create a file with a function signature, you MUST provide the full body \u2014 not `// implement later` or `throw new Error('not implemented')`.","","## Proactive Action","- When asked to fix, change, or improve code, implement the changes directly by writing to the file. Do not merely describe what should be changed.","- When you identify issues (bugs, security vulnerabilities, style problems), fix them immediately using your tools rather than listing recommendations.","- Default to action: read the file, make the fix, write it back. Only describe without acting when explicitly asked for advice or review only.","","## Faithful Reporting","- Report outcomes faithfully: if a tool call failed, say so with the error output. Do not claim success when a tool returned an error.","- If you did not run a verification step, say that rather than implying it succeeded.","- Never claim 'all tests pass' or 'file created successfully' when tool output shows otherwise.","- If you are unsure whether your changes are complete, state that explicitly rather than asserting completeness."]}function Y$(){return["# Doing Tasks","","You will assist with office and analytical tasks: reports, data analysis, documents, presentations, and more.","","## Accuracy and Rigor","- Verify numerical calculations and statistical claims. When presenting data, ensure totals, percentages, and comparisons are mathematically correct.","- Distinguish clearly between facts, inferences, and assumptions. Label uncertain information explicitly.","- When summarizing source material, preserve the original meaning. Do not introduce information not present in the source.","","## Structure and Formatting","- Use clear headings, bullet points, and tables to organize information. Match the formatting conventions of the document type (report, memo, email, slides).","- For data-heavy outputs, prefer tables over prose. Include units, time periods, and comparison baselines.","- Keep language professional and concise. Avoid filler, hedging, and unnecessary qualifiers.","","## Completeness","- When the task lists multiple sections, data points, or requirements, address ALL of them. Do not silently omit items.","- If source data is insufficient to answer a question, state what is missing rather than guessing."]}function J$(){return["# Doing Tasks","","You will assist with creative and content tasks: writing, copywriting, brainstorming, and content strategy.","","## Voice and Style","- Match the requested tone, register, and style. If no style is specified, adapt to the content type (formal for press releases, conversational for blog posts, punchy for ad copy).","- Vary sentence length and structure for rhythm. Avoid monotonous patterns.","- Show, don't tell where appropriate. Use concrete details and vivid language over abstract statements.","","## Audience Awareness","- Write for the intended audience. Consider their knowledge level, interests, and expectations.","- For marketing/copywriting, lead with the benefit. Focus on what matters to the reader, not the feature list.","- Respect cultural context and sensitivity in language choices.","","## Creative Process","- When brainstorming, provide diverse options rather than variations on a single idea. Quantity and variety first, then refine.","- When editing existing text, preserve the author's voice. Make targeted improvements rather than rewriting from scratch.","- If creative constraints are given (word count, format, platform), follow them precisely."]}function yT(t="general"){return qt("task_guidance",()=>{let e;switch(t){case"coding":e=[...X$(),"",...Gi()];break;case"office":e=[...Y$(),"",...Gi()];break;case"creative":e=[...J$(),"",...Gi()];break;default:e=["# Doing Tasks","","You are a versatile assistant that handles software engineering, office, and creative tasks.","",...Gi(),"","## When Coding","- Read existing code before modifying it. Understand the structure before making changes.","- When refactoring, commit fully to the new pattern. Do NOT mix old and new patterns.","- Implement ALL listed constraints or requirements explicitly. Do not drop any.","- Don't add features or abstractions beyond what was asked.","- When asked to fix or change code, implement changes directly by writing to the file \u2014 do not merely describe what to change.","","## When Writing Documents or Analyzing Data","- Verify numerical calculations and statistical claims for correctness.","- Use clear structure: headings, tables, bullet points as appropriate.","- Distinguish facts from inferences. Label uncertain information.","","## When Creating Content","- Match the requested tone, style, and audience. Adapt if not specified.","- Lead with the benefit for marketing/copywriting tasks.","- Provide diverse options when brainstorming."];break}return e.join(`
616
616
  `)})}function Ki(){return Hi("tool_guidance",()=>["# Tool Usage Guidance","","You have access to specialized tools. Use them appropriately:","","## Agent Delegation","Use the `agent` tool to delegate complex, multi-step tasks to sub-agents:","- Research/exploration tasks that benefit from focused attention","- File analysis across multiple files that need independent reasoning","- Any task the user explicitly asks you to delegate","- **When the user says 'delegate', 'sub-agent', 'fork', or 'hand off', you MUST use the `agent` tool \u2014 never handle it yourself**","Do NOT use `agent` for simple file reads or single-step operations.","","## Skill System","Use the `skill` tool (unified meta-tool) for all skill operations:","- action 'invoke' \u2014 run a skill by name","- action 'list' \u2014 discover available skills (shows scope: project/global)","- action 'create' \u2014 save a new skill to current project","- action 'promote' \u2014 copy a project skill to global (user-level)","When recalled memories show '[Cross-project skill available]', proactively offer to use or save the skill.","","## Checkpoint","Use the `checkpoint` tool (not raw git commands) to:","- Save workspace state before making changes","- Restore to a previous state if changes go wrong","The checkpoint tool manages git shadow history automatically.","","## Ask User","Use `ask_user` to clarify genuinely ambiguous requests before proceeding.","For ordinary creative media requests, infer sensible defaults and use the appropriate media tool directly.","Ask before media generation only when a missing detail is critical to the result or the user is choosing among materially different outputs.","","## Project Rules Management","You can create, edit, and delete project rule files at `.qlogicagent/rules/*.md`.","These files are loaded into your system prompt every turn \u2014 changes take effect immediately.","Use this to help users establish coding conventions, workflow guidelines, or project-specific instructions.","When the user asks to 'add a rule', 'set up conventions', or 'configure instructions', write to `.qlogicagent/rules/<descriptive-name>.md`.","You may also create or edit `.qlogicagent/INSTRUCTIONS.md` for a single top-level instruction file."].join(`
617
617
  `))}function Vi(t){return Hi("language",()=>t?["# Language","",`Always respond in ${t}.`,`Use ${t} for all text output, explanations, and descriptions.`,"Use English only for: code, file paths, tool arguments, variable names, and technical identifiers."].join(`
618
618
  `):["# Language","","Respond in the same language as the user's message.","If the user writes in English, respond in English. If in Chinese, respond in Chinese.","Use English only for: code, file paths, tool arguments, variable names, and technical identifiers."].join(`
619
- `))}var vT={requiresFreshTool:!1,allowedToolNames:[]},J$=["txt","json","jsonl","ts","tsx","js","jsx","mjs","cjs","md","mdx","yaml","yml","toml","ini","xml","csv","tsv","env","py","go","rs","java","kt","kts","cs","cpp","c","h","hpp","html","css","scss","sass","less","sql","lock","log","sh","ps1","bat","cmd"],np=new RegExp(`(?:^|[\\s"'\`([{:,])(?:\\.?[\\w@~.-]+[\\\\/])*[\\w@~.-]+\\.(?:${J$.join("|")})\\b`,"i"),Q$=/write|create|edit|replace|change|update|modify|overwrite|fix|implement|\u5199|\u65b0\u5efa|\u521b\u5efa|\u7f16\u8f91|\u66ff\u6362|\u6539\u6210|\u4fee\u6539|\u4fee\u590d|\u5b9e\u73b0|\u8986\u76d6/i,Z$=/(?:memory|\u8bb0\u5fc6).*(?:create_file|\u8bb0\u5fc6\u6587\u4ef6|\u6587\u4ef6)|(?:create_file).*(?:memory|\u8bb0\u5fc6)/i,eU=/(?:memory|\u8bb0\u5fc6).*(?:(?:add|replace|remove|create_file|write_file|read_file|delete_file|list_files|search|remember|temporal|feedback)\s+action\b|action\s*[:=]?\s*['"]?(?:add|replace|remove|create_file|write_file|read_file|delete_file|list_files|search|remember|temporal|feedback)\b|\u5220\u9664|\u79fb\u9664|\u66ff\u6362|\u521b\u5efa|\u8bfb\u53d6|\u641c\u7d22)|(?:(?:add|replace|remove|create_file|write_file|read_file|delete_file|list_files|search|remember|temporal|feedback)\s+action\b|action\s*[:=]?\s*['"]?(?:add|replace|remove|create_file|write_file|read_file|delete_file|list_files|search|remember|temporal|feedback)\b).*(?:memory|\u8bb0\u5fc6)/i,tU=/(?:current\s+directory|directory\s+(?:contains|listing|files)|list\s+(?:the\s+)?files|what\s+files|\u5f53\u524d\u76ee\u5f55|\u76ee\u5f55\u4e0b|\u54ea\u4e9b\u6587\u4ef6|\u5217\u51fa.*\u6587\u4ef6)/i,rU=/(?:which\s+file.*contains|contains.*which\s+file|\u54ea(?:\u4e2a|\u4e9b|\u4e00\u4e2a)?\u6587\u4ef6.*\u5305\u542b|\u5305\u542b.*\u54ea(?:\u4e2a|\u4e9b|\u4e00\u4e2a)?\u6587\u4ef6)/i,nU=/(?:^|\s)(?:run|execute)\s+(?:this\s+)?(?:command|shell)?\b|\b(?:echo|pwd|ls|dir|cat|type)\b|\u6267\u884c|\u8fd0\u884c/i,oU=/https?:\/\/\S+/i,sU=/fetch|open|visit|url|return|response|httpbin|\u8bbf\u95ee|\u7f51\u9875|\u8fd4\u56de|\u770b\u4e0b|\u770b\u770b/i,iU=/(?:\bimage_generate\b|\bgenerate\s+(?:an?\s+)?image\b|\bmake\s+(?:an?\s+)?image\b|\bdraw\s+(?:an?\s+)?(?:image|picture|illustration)\b|\bcreate\s+(?:an?\s+)?(?:image|picture|illustration)\b|\u751f\u56fe|\u751f\u6210(?:一张|个|幅)?(?:图片|图像|插画|海报|头像)?|\u753b(?:一张|一个|一幅|一只|一群|个|张|幅|一下)?.+|\u753b(?:一张|个|幅|一幅)?.*(?:图|图片|图像|插画|画面)|(?:图片|图像|插画|海报|头像).*\u751f\u6210)/i;function Xi(t){let e=typeof t=="string"?t:aU(t);return e.trim()?iU.test(e)?{requiresFreshTool:!0,reason:"media-generation",allowedToolNames:["image_generate"]}:oU.test(e)&&sU.test(e)?{requiresFreshTool:!0,reason:"web",allowedToolNames:["web_fetch"]}:Z$.test(e)&&np.test(e)||eU.test(e)?{requiresFreshTool:!0,reason:"memory-mutation",allowedToolNames:["memory"]}:Q$.test(e)&&np.test(e)?{requiresFreshTool:!0,reason:"file-mutation",allowedToolNames:["read","search","write","edit","patch","apply_patch"]}:np.test(e)?{requiresFreshTool:!0,reason:"file-read",allowedToolNames:["read","search"]}:tU.test(e)?{requiresFreshTool:!0,reason:"directory-list",allowedToolNames:["exec"]}:rU.test(e)?{requiresFreshTool:!0,reason:"content-search",allowedToolNames:["search"]}:nU.test(e)?{requiresFreshTool:!0,reason:"shell",allowedToolNames:["exec"]}:vT:vT}function Yi(t,e){if(!e.requiresFreshTool||e.allowedToolNames.length===0)return[...t];let r=new Set(e.allowedToolNames),n=t.filter(o=>r.has(lU(o)));return n.length>0?n:[...t]}function Ji(t){if(!t.requiresFreshTool)return null;let e=t.allowedToolNames.join(", ");return t.reason==="file-mutation"?qt("fresh_workspace_evidence",()=>["# Workspace File Action Required","","The latest user request asks you to create, edit, fix, or implement files in the workspace.",`Before answering, call the appropriate tool for this turn: ${e}.`,"Use write/edit/patch/apply_patch to make the requested on-disk change. Reading or searching can locate context, but does not satisfy the requested action.","Do not merely describe code, print snippets, or claim completion without a successful file-changing tool result.","If a file-changing tool fails, make at most two focused attempts, then report the exact failure."].join(`
619
+ `))}var vT={requiresFreshTool:!1,allowedToolNames:[]},Q$=["txt","json","jsonl","ts","tsx","js","jsx","mjs","cjs","md","mdx","yaml","yml","toml","ini","xml","csv","tsv","env","py","go","rs","java","kt","kts","cs","cpp","c","h","hpp","html","css","scss","sass","less","sql","lock","log","sh","ps1","bat","cmd"],np=new RegExp(`(?:^|[\\s"'\`([{:,])(?:\\.?[\\w@~.-]+[\\\\/])*[\\w@~.-]+\\.(?:${Q$.join("|")})\\b`,"i"),Z$=/write|create|edit|replace|change|update|modify|overwrite|fix|implement|\u5199|\u65b0\u5efa|\u521b\u5efa|\u7f16\u8f91|\u66ff\u6362|\u6539\u6210|\u4fee\u6539|\u4fee\u590d|\u5b9e\u73b0|\u8986\u76d6/i,eU=/(?:memory|\u8bb0\u5fc6).*(?:create_file|\u8bb0\u5fc6\u6587\u4ef6|\u6587\u4ef6)|(?:create_file).*(?:memory|\u8bb0\u5fc6)/i,tU=/(?:memory|\u8bb0\u5fc6).*(?:(?:add|replace|remove|create_file|write_file|read_file|delete_file|list_files|search|remember|temporal|feedback)\s+action\b|action\s*[:=]?\s*['"]?(?:add|replace|remove|create_file|write_file|read_file|delete_file|list_files|search|remember|temporal|feedback)\b|\u5220\u9664|\u79fb\u9664|\u66ff\u6362|\u521b\u5efa|\u8bfb\u53d6|\u641c\u7d22)|(?:(?:add|replace|remove|create_file|write_file|read_file|delete_file|list_files|search|remember|temporal|feedback)\s+action\b|action\s*[:=]?\s*['"]?(?:add|replace|remove|create_file|write_file|read_file|delete_file|list_files|search|remember|temporal|feedback)\b).*(?:memory|\u8bb0\u5fc6)/i,rU=/(?:current\s+directory|directory\s+(?:contains|listing|files)|list\s+(?:the\s+)?files|what\s+files|\u5f53\u524d\u76ee\u5f55|\u76ee\u5f55\u4e0b|\u54ea\u4e9b\u6587\u4ef6|\u5217\u51fa.*\u6587\u4ef6)/i,nU=/(?:which\s+file.*contains|contains.*which\s+file|\u54ea(?:\u4e2a|\u4e9b|\u4e00\u4e2a)?\u6587\u4ef6.*\u5305\u542b|\u5305\u542b.*\u54ea(?:\u4e2a|\u4e9b|\u4e00\u4e2a)?\u6587\u4ef6)/i,oU=/(?:^|\s)(?:run|execute)\s+(?:this\s+)?(?:command|shell)?\b|\b(?:echo|pwd|ls|dir|cat|type)\b|\u6267\u884c|\u8fd0\u884c/i,sU=/https?:\/\/\S+/i,iU=/fetch|open|visit|url|return|response|httpbin|\u8bbf\u95ee|\u7f51\u9875|\u8fd4\u56de|\u770b\u4e0b|\u770b\u770b/i,aU=/(?:\bimage_generate\b|\bgenerate\s+(?:an?\s+)?image\b|\bmake\s+(?:an?\s+)?image\b|\bdraw\s+(?:an?\s+)?(?:image|picture|illustration)\b|\bcreate\s+(?:an?\s+)?(?:image|picture|illustration)\b|\u751f\u56fe|\u751f\u6210(?:一张|个|幅)?(?:图片|图像|插画|海报|头像)?|\u753b(?:一张|一个|一幅|一只|一群|个|张|幅|一下)?.+|\u753b(?:一张|个|幅|一幅)?.*(?:图|图片|图像|插画|画面)|(?:图片|图像|插画|海报|头像).*\u751f\u6210)/i;function Xi(t){let e=typeof t=="string"?t:cU(t);return e.trim()?aU.test(e)?{requiresFreshTool:!0,reason:"media-generation",allowedToolNames:["image_generate"]}:sU.test(e)&&iU.test(e)?{requiresFreshTool:!0,reason:"web",allowedToolNames:["web_fetch"]}:eU.test(e)&&np.test(e)||tU.test(e)?{requiresFreshTool:!0,reason:"memory-mutation",allowedToolNames:["memory"]}:Z$.test(e)&&np.test(e)?{requiresFreshTool:!0,reason:"file-mutation",allowedToolNames:["read","search","write","edit","patch","apply_patch"]}:np.test(e)?{requiresFreshTool:!0,reason:"file-read",allowedToolNames:["read","search"]}:rU.test(e)?{requiresFreshTool:!0,reason:"directory-list",allowedToolNames:["exec"]}:nU.test(e)?{requiresFreshTool:!0,reason:"content-search",allowedToolNames:["search"]}:oU.test(e)?{requiresFreshTool:!0,reason:"shell",allowedToolNames:["exec"]}:vT:vT}function Yi(t,e){if(!e.requiresFreshTool||e.allowedToolNames.length===0)return[...t];let r=new Set(e.allowedToolNames),n=t.filter(o=>r.has(dU(o)));return n.length>0?n:[...t]}function Ji(t){if(!t.requiresFreshTool)return null;let e=t.allowedToolNames.join(", ");return t.reason==="file-mutation"?qt("fresh_workspace_evidence",()=>["# Workspace File Action Required","","The latest user request asks you to create, edit, fix, or implement files in the workspace.",`Before answering, call the appropriate tool for this turn: ${e}.`,"Use write/edit/patch/apply_patch to make the requested on-disk change. Reading or searching can locate context, but does not satisfy the requested action.","Do not merely describe code, print snippets, or claim completion without a successful file-changing tool result.","If a file-changing tool fails, make at most two focused attempts, then report the exact failure."].join(`
620
620
  `)):t.reason==="memory-mutation"?qt("fresh_workspace_evidence",()=>["# Memory File Action Required","","The latest user request explicitly asks to use the memory tool for a memory file action.",`Before answering, call the appropriate tool for this turn: ${e}.`,"Use the requested memory action and target filename instead of workspace file write/edit tools.","For removal requests, call memory with action='remove' and set old_text to the exact INDEX.md line or labeled marker line the user asked to remove.","Do not call action='add', action='remember', or action='create_file' for a removal request.","Do not merely describe the memory content or create a regular workspace file."].join(`
621
621
  `)):t.reason==="media-generation"?qt("fresh_workspace_evidence",()=>["# Media Generation Required","","The latest user request asks you to create an image.",`Before answering, call the appropriate media tool for this turn: ${e}.`,"Do not answer by inventing a Markdown image URL or placeholder attachment path.","For ordinary creative requests, infer reasonable defaults for purpose, style, and size instead of asking follow-up questions.","Ask the user only when a missing detail is critical to the result or the request is genuinely ambiguous."].join(`
622
622
  `)):qt("fresh_workspace_evidence",()=>["# Fresh Workspace Evidence","","The latest user request asks for current workspace, shell, or URL state.",`Before answering, call one of these tools for this turn: ${e}.`,"Do not answer this request from conversation history, memory, or prior tool results.","For an explicit filename, inspect that exact file first and report the observed value.","If the filename is not found at the given path, use search to locate it, then read the located file before answering.","A filename search alone is not enough to answer content or code-symbol questions."].join(`
623
- `))}function aU(t){for(let e=t.length-1;e>=0;e--){let r=t[e];if(r?.role==="user")return cU(r.content)}return""}function cU(t){return typeof t=="string"?t:Array.isArray(t)?t.map(e=>{if(!e||typeof e!="object")return"";let r=e;return typeof r.text=="string"?r.text:""}).join(""):""}function lU(t){return t.function?.name??t.name??""}import{readFile as dU,readdir as uU,stat as pU}from"node:fs/promises";import{dirname as Zi,extname as mU,isAbsolute as gU,join as Mo,parse as kT,resolve as bT}from"node:path";import{homedir as fU}from"node:os";var hU="INSTRUCTIONS.md",yU="INSTRUCTIONS.local.md",vU=new Set([".md",".txt",".text",".json",".yaml",".yml",".toml",".xml",".csv",".html",".htm",".css",".scss",".sass",".less",".js",".ts",".tsx",".jsx",".mjs",".cjs",".mts",".cts",".py",".pyi",".pyw",".rb",".erb",".rake",".go",".rs",".java",".kt",".kts",".scala",".c",".cpp",".cc",".cxx",".h",".hpp",".hxx",".cs",".swift",".sh",".bash",".zsh",".fish",".ps1",".bat",".cmd",".env",".ini",".cfg",".conf",".config",".properties",".sql",".graphql",".gql",".proto",".vue",".svelte",".astro",".php",".pl",".pm",".lua",".r",".R",".dart",".ex",".exs",".erl",".hrl",".clj",".cljs",".cljc",".edn",".hs",".lhs",".elm",".ml",".mli",".f",".f90",".f95",".for",".cmake",".make",".makefile",".gradle",".sbt",".rst",".adoc",".asciidoc",".org",".tex",".latex",".lock",".log",".diff",".patch"]);async function bU(t){try{return await dU(t,"utf-8")}catch{return null}}function kU(t){return t.includes("<!--")?t.replace(/^[ \t]*<!--[\s\S]*?-->[ \t]*$/gm,""):t}function RU(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?/);if(!e)return{content:t};let r=e[1],n=t.slice(e[0].length),o=r.match(/^paths:\s*(.+)$/m);if(!o)return{content:n};let s=[],i=o[1].trim();if(i.startsWith("["))try{s=JSON.parse(i)}catch{}else s=i.split(",").map(c=>c.trim()).filter(Boolean);let a=s.map(c=>c.endsWith("/**")?c.slice(0,-3):c).filter(c=>c.length>0&&c!=="**");return{content:n,globs:a.length>0?a:void 0}}function SU(t,e){let r=new Set,n=/(?:^|\s)@((?:[^\s\\]|\\ )+)/g,s=t.replace(/```[\s\S]*?```/g,"").replace(/`[^`]+`/g,""),i;for(;(i=n.exec(s))!==null;){let a=i[1];if(!a)continue;let c=a.indexOf("#");if(c!==-1&&(a=a.substring(0,c)),!a)continue;a=a.replace(/\\ /g," ");let l;if(a.startsWith("~/"))l=Mo(fU(),a.slice(2));else if(gU(a))l=a;else if(a.startsWith("./"))l=bT(Zi(e),a);else if(/^[a-zA-Z0-9._-]/.test(a)&&!a.startsWith("@"))l=bT(Zi(e),a);else continue;r.add(l)}return[...r]}async function Eo(t,e,r,n=0,o){let s=t.toLowerCase();if(r.has(s)||n>=fc)return[];let i=mU(t).toLowerCase();if(i&&!vU.has(i))return[];r.add(s);let a=await bU(t);if(!a?.trim())return[];let{content:c,globs:l}=RU(a),d=kU(c);if(!d.trim())return[];let p=[],u={path:t,type:e,content:d.trim()};o&&(u.parent=o),l&&(u.globs=l),p.push(u);let m=SU(c,t);for(let f of m){let g=await Eo(f,e,r,n+1,t);p.push(...g)}return p}async function RT(t,e,r,n,o=new Set){if(o.has(t))return[];o.add(t);let s=[];try{let i=await uU(t,{withFileTypes:!0});for(let a of i){let c=Mo(t,a.name);if(a.isDirectory())s.push(...await RT(c,e,r,n,o));else if(a.isFile()&&a.name.endsWith(".md")){let l=await Eo(c,e,r);s.push(...l.filter(d=>n?!!d.globs:!d.globs))}}}catch{}return s}async function TU(t){let e=t,r=kT(e).root;for(;e!==r;){try{let n=Mo(e,".git"),o=await pU(n);if(o.isDirectory()||o.isFile())return e}catch{}e=Zi(e)}return null}async function wU(t,e){let r=[],n=new Set,s=await TU(t)??kT(t).root,i=[],a=t;for(;i.push(a),!(a===s&&a!==t);){let c=Zi(a);if(c===a)break;a=c}for(let c of i.reverse())r.push(...await Eo(Mo(c,hU),"Project",n)),r.push(...await Eo(I().getProjectInstructionsPath(c),"Project",n)),r.push(...await RT(I().getProjectRulesDir(c),"Project",n,!1)),r.push(...await Eo(Mo(c,yU),"Local",n));return e&&r.length>0&&e.invoke("instructions.loaded",{sessionId:"",source:t,fileCount:r.length}).catch(()=>{}),r}function ea(t){if(t.length===0)return"";let e="Codebase and user instructions are shown below. Be sure to adhere to these instructions. IMPORTANT: These instructions OVERRIDE any default behavior and you MUST follow them exactly as written.",r=[],n=op(t);n.length>0&&r.push(["## Active literal response requirements","The current instruction files contain hard requirements for exact response markers.","When responding, reproduce these literals exactly and do not omit them for brevity:",...n.map(o=>`- ${o.placement}: "${o.marker}"`)].join(`
623
+ `))}function cU(t){for(let e=t.length-1;e>=0;e--){let r=t[e];if(r?.role==="user")return lU(r.content)}return""}function lU(t){return typeof t=="string"?t:Array.isArray(t)?t.map(e=>{if(!e||typeof e!="object")return"";let r=e;return typeof r.text=="string"?r.text:""}).join(""):""}function dU(t){return t.function?.name??t.name??""}import{readFile as uU,readdir as pU,stat as mU}from"node:fs/promises";import{dirname as Zi,extname as gU,isAbsolute as fU,join as Mo,parse as kT,resolve as bT}from"node:path";import{homedir as hU}from"node:os";var yU="INSTRUCTIONS.md",vU="INSTRUCTIONS.local.md",bU=new Set([".md",".txt",".text",".json",".yaml",".yml",".toml",".xml",".csv",".html",".htm",".css",".scss",".sass",".less",".js",".ts",".tsx",".jsx",".mjs",".cjs",".mts",".cts",".py",".pyi",".pyw",".rb",".erb",".rake",".go",".rs",".java",".kt",".kts",".scala",".c",".cpp",".cc",".cxx",".h",".hpp",".hxx",".cs",".swift",".sh",".bash",".zsh",".fish",".ps1",".bat",".cmd",".env",".ini",".cfg",".conf",".config",".properties",".sql",".graphql",".gql",".proto",".vue",".svelte",".astro",".php",".pl",".pm",".lua",".r",".R",".dart",".ex",".exs",".erl",".hrl",".clj",".cljs",".cljc",".edn",".hs",".lhs",".elm",".ml",".mli",".f",".f90",".f95",".for",".cmake",".make",".makefile",".gradle",".sbt",".rst",".adoc",".asciidoc",".org",".tex",".latex",".lock",".log",".diff",".patch"]);async function kU(t){try{return await uU(t,"utf-8")}catch{return null}}function RU(t){return t.includes("<!--")?t.replace(/^[ \t]*<!--[\s\S]*?-->[ \t]*$/gm,""):t}function SU(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?/);if(!e)return{content:t};let r=e[1],n=t.slice(e[0].length),o=r.match(/^paths:\s*(.+)$/m);if(!o)return{content:n};let s=[],i=o[1].trim();if(i.startsWith("["))try{s=JSON.parse(i)}catch{}else s=i.split(",").map(c=>c.trim()).filter(Boolean);let a=s.map(c=>c.endsWith("/**")?c.slice(0,-3):c).filter(c=>c.length>0&&c!=="**");return{content:n,globs:a.length>0?a:void 0}}function TU(t,e){let r=new Set,n=/(?:^|\s)@((?:[^\s\\]|\\ )+)/g,s=t.replace(/```[\s\S]*?```/g,"").replace(/`[^`]+`/g,""),i;for(;(i=n.exec(s))!==null;){let a=i[1];if(!a)continue;let c=a.indexOf("#");if(c!==-1&&(a=a.substring(0,c)),!a)continue;a=a.replace(/\\ /g," ");let l;if(a.startsWith("~/"))l=Mo(hU(),a.slice(2));else if(fU(a))l=a;else if(a.startsWith("./"))l=bT(Zi(e),a);else if(/^[a-zA-Z0-9._-]/.test(a)&&!a.startsWith("@"))l=bT(Zi(e),a);else continue;r.add(l)}return[...r]}async function Eo(t,e,r,n=0,o){let s=t.toLowerCase();if(r.has(s)||n>=fc)return[];let i=gU(t).toLowerCase();if(i&&!bU.has(i))return[];r.add(s);let a=await kU(t);if(!a?.trim())return[];let{content:c,globs:l}=SU(a),d=RU(c);if(!d.trim())return[];let p=[],u={path:t,type:e,content:d.trim()};o&&(u.parent=o),l&&(u.globs=l),p.push(u);let m=TU(c,t);for(let f of m){let g=await Eo(f,e,r,n+1,t);p.push(...g)}return p}async function RT(t,e,r,n,o=new Set){if(o.has(t))return[];o.add(t);let s=[];try{let i=await pU(t,{withFileTypes:!0});for(let a of i){let c=Mo(t,a.name);if(a.isDirectory())s.push(...await RT(c,e,r,n,o));else if(a.isFile()&&a.name.endsWith(".md")){let l=await Eo(c,e,r);s.push(...l.filter(d=>n?!!d.globs:!d.globs))}}}catch{}return s}async function wU(t){let e=t,r=kT(e).root;for(;e!==r;){try{let n=Mo(e,".git"),o=await mU(n);if(o.isDirectory()||o.isFile())return e}catch{}e=Zi(e)}return null}async function AU(t,e){let r=[],n=new Set,s=await wU(t)??kT(t).root,i=[],a=t;for(;i.push(a),!(a===s&&a!==t);){let c=Zi(a);if(c===a)break;a=c}for(let c of i.reverse())r.push(...await Eo(Mo(c,yU),"Project",n)),r.push(...await Eo(I().getProjectInstructionsPath(c),"Project",n)),r.push(...await RT(I().getProjectRulesDir(c),"Project",n,!1)),r.push(...await Eo(Mo(c,vU),"Local",n));return e&&r.length>0&&e.invoke("instructions.loaded",{sessionId:"",source:t,fileCount:r.length}).catch(()=>{}),r}function ea(t){if(t.length===0)return"";let e="Codebase and user instructions are shown below. Be sure to adhere to these instructions. IMPORTANT: These instructions OVERRIDE any default behavior and you MUST follow them exactly as written.",r=[],n=op(t);n.length>0&&r.push(["## Active literal response requirements","The current instruction files contain hard requirements for exact response markers.","When responding, reproduce these literals exactly and do not omit them for brevity:",...n.map(o=>`- ${o.placement}: "${o.marker}"`)].join(`
624
624
  `));for(let o of t){if(!o.content)continue;let s=o.type==="Project"?" (project instructions, checked into the codebase)":o.type==="Local"?" (user's private project instructions, not checked in)":" (user's private global instructions for all projects)";r.push(`Contents of ${o.path}${s}:
625
625
 
626
626
  ${o.content.trim()}`)}return r.length>0?`${e}
627
627
 
628
628
  ${r.join(`
629
629
 
630
- `)}`:""}function op(t){let e=new Map;for(let r of t){let n=r.content,o=/["'“”‘’]([^"'“”‘’\r\n]{2,100})["'“”‘’]/g,s;for(;(s=o.exec(n))!==null;){let i=s[1]?.trim();if(!i||!CU(i))continue;let a=AU(n,s.index,o.lastIndex);PU(a)&&e.set(i,{marker:i,placement:xU(a)})}}return[...e.values()]}function AU(t,e,r){let n=[`
630
+ `)}`:""}function op(t){let e=new Map;for(let r of t){let n=r.content,o=/["'“”‘’]([^"'“”‘’\r\n]{2,100})["'“”‘’]/g,s;for(;(s=o.exec(n))!==null;){let i=s[1]?.trim();if(!i||!IU(i))continue;let a=PU(n,s.index,o.lastIndex);xU(a)&&e.set(i,{marker:i,placement:CU(a)})}}return[...e.values()]}function PU(t,e,r){let n=[`
631
631
  `,".","\u3002",";","\uFF1B"].map(a=>t.lastIndexOf(a,e)),o=Math.max(-1,...n)+1,s=[`
632
- `,".","\u3002",";","\uFF1B"].map(a=>t.indexOf(a,r)).filter(a=>a>=0),i=s.length>0?Math.min(...s):t.length;return t.slice(o,i)}function ST(t,e){let r=t;for(let n of e)IU(n.marker)&&(r.includes(n.marker)||(n.placement==="prefix"?r=r.trim().length>0?`${n.marker} ${r}`:n.marker:r=r.trim().length>0?`${r.trimEnd()}
633
- ${n.marker}`:n.marker));return r}function PU(t){let e=t.toLowerCase();return e.includes("every response")||e.includes("all responses")||e.includes("always")||t.includes("\u6240\u6709\u56DE\u590D")||t.includes("\u6BCF\u6B21\u56DE\u590D")||t.includes("\u6BCF\u4E2A\u56DE\u590D")||t.includes("\u6C38\u8FDC")?e.includes("must")||e.includes("required")||e.includes("exact")||t.includes("\u5FC5\u987B")||t.includes("\u52A1\u5FC5")||t.includes("\u786C\u6027\u8981\u6C42"):!1}function xU(t){let e=t.toLowerCase(),r=Qi(e,["start with","begin with"])+Qi(t,["\u5F00\u5934","\u5FC5\u987B\u4EE5"]),n=Qi(e,["end with","append","at the end"])+Qi(t,["\u672B\u5C3E","\u7ED3\u5C3E","\u7ED3\u675F\u6807\u8BB0"]);return r>=0||n>=0?r>n?"prefix":"suffix":"include"}function Qi(t,e){let r=-1;for(let n of e){let o=t.lastIndexOf(n);o>r&&(r=o)}return r}function CU(t){let e=t.trim();return e.length<2||e.length>100||/https?:\/\//i.test(e)?!1:/[A-Z0-9_\-[\]—-]/.test(e)}function IU(t){return/[A-Z\[\]—-]/.test(t)}async function ta(t,e){return wU(t,e)}function TT(){}var MU=[/继续(桌面|电脑|刚才|上次|之前)的/,/接着(桌面|电脑|刚才|上次|之前)的/,/刚才(那个|那件|说的|聊的|做的)/,/上次(说到|聊到|做到|讲到)/,/桌面(端|上)?(那个|那边|的任务|的对话|在做)/,/电脑(端|上)?(那个|那边|的任务|的对话|在做)/,/之前(那个|在做的|讨论的|说的)/,/帮我继续/,/接着(做|干|搞|写|改)/,/continue (from |where |the )?desktop/i,/pick up where/i,/what were we (doing|working on|talking about)/i,/continue (the |our )?(last |previous )?(task|conversation|chat)/i];function _U(t){return!t||t.length<3?!1:MU.some(e=>e.test(t))}function wT(t){let e=t.params?.turnId??"";this.log(`abort requested for turn ${e}`),this.activeTurn&&(this.activeTurn.abort(),this.activeTurn=null),t.id!==void 0&&this.sendResponse(t.id,{aborted:!0})}function AT(t){let e=t.params;if(!e)return;let r=e.approvalId,n=e.decision;if(!r||!n){this.log("[warn] tool.approval.response missing approvalId or decision");return}let o={approvalId:r,decision:n==="allow"?"allow":"deny",updatedInput:e.updatedInput};this.permissionChecker&&this.permissionChecker.resolveApproval(o),t.id!==void 0&&this.sendResponse(t.id,{received:!0})}function DU(t,e){t?.setToolMeta?.(e)}function PT(t){let e=t.params,r=e?.requestId;if(!r){this.log("[warn] thread.user_response missing requestId"),t.id!==void 0&&this.sendResponse(t.id,{received:!1});return}let n=this.pendingAskUser.get(r);if(!n){this.log(`[warn] thread.user_response: no pending request ${r}`),t.id!==void 0&&this.sendResponse(t.id,{received:!1});return}if(this.pendingAskUser.delete(r),e?.declined===!0)n.resolve(null);else{let s=e?.answers??{};n.resolve(s)}t.id!==void 0&&this.sendResponse(t.id,{received:!0})}async function xT(t){let e=t.params??{},r=e.turnId??EU(),n=typeof this.currentTurnId=="string"?this.currentTurnId:void 0;this.currentTurnId=r;let o=e.sessionId,s=e.messages??[],i=e.tools??[],a=e.config;t.id!==void 0&&this.sendResponse(t.id,{accepted:!0,turnId:r}),s=this.sessionHistory.withResumedHistory(o,s);let c=aT({config:a,sessionId:o,host:this}),{sessionProjectRoot:l,sessionProjectId:d,projectHintStale:p,staleProjectHintContext:u}=c;this.configureTurnMedia?.(a,r),rT(this),this.activeTurn&&n&&n!==r&&this.sendNotification("turn.error",{turnId:n,error:{message:"Turn aborted by a newer turn",code:"ABORTED"}});let m=await oT(this,o),f=m.abortController;this.log(`turn ${r} starting (session: ${o})`),this.sendNotification("turn.start",{turnId:r,model:a?.model??(this.currentModel||void 0),provider:a?.provider||void 0,projectId:d});let g=[...s].reverse().find(h=>h.role==="user");if(this.lastUserMessageForAutoExtract=typeof g?.content=="string"?g.content:void 0,!g||!String(g.content??"").trim()){this.sendNotification("turn.end",{turnId:r,content:"",item:{id:`${r}-end`,type:"message",role:"assistant",text:"",createdAt:new Date().toISOString()}}),ep(this,m);return}try{let h={provider:a?.provider,model:a?.model,apiKey:a?.apiKey,baseUrl:a?.baseUrl,maxRounds:a?.maxRounds,temperature:a?.temperature,contextWindowTokens:a?.contextWindowTokens,maxOutputTokens:a?.maxOutputTokens,modelMaxOutputTokens:a?.modelMaxOutputTokens,maxConcurrentTools:a?.maxConcurrentTools,mediaProviders:a?.mediaProviders,reasoning:a?.reasoning,promptCacheKey:a?.promptCacheKey,promptCacheRetention:a?.promptCacheRetention,serviceTier:a?.serviceTier,openaiBuiltinTools:a?.openaiBuiltinTools,maxToolCalls:a?.maxToolCalls,parallelToolCalls:a?.parallelToolCalls,textVerbosity:a?.textVerbosity,toolChoice:a?.toolChoice,assistantId:a?.assistantId,mcpServers:a?.mcpServers,fallbackModel:D().resolveModelForPurpose("smallModel")??void 0};{let P=h.provider??"",W=h.model??"";P&&W&&D().getModelInfo(P,W)?.streamRequired&&(h.streamRequired=!0)}let b=this.resolveAgent(h),v=typeof a?.assistantId=="string"?a.assistantId.trim():"",R=v?await Ir():[],S=v?R.find(P=>P.id===v):void 0,T=v?await Ps(v):null;if(this.permissionChecker?.ruleEngineRef&&a?.permissions){let P=tT(this.permissionChecker.ruleEngineRef,a.permissions);vi(P.mode==="full_access")}if(!b){this.sendNotification("turn.error",{turnId:r,error:{message:"No LLM provider configured. Provide provider/model/apiKey in agent.turn config, or set DEEPSEEK_API_KEY / OPENAI_API_KEY / ANTHROPIC_API_KEY environment variable.",code:"NO_PROVIDER"}});return}let C,E=[],M=a?.workdir??this.getActiveProjectRoot();this.setActiveWorkdir(M);try{let P=await ta(M,this.currentHooks??void 0);P.length>0&&(C=ea(P),E=op(P))}catch{}let L=s.filter(P=>P.role==="user").map(P=>typeof P.content=="string"?P.content:"").join(" "),{domain:k,source:Q}=mT({cwd:M,hostOverride:a?.taskDomain,sessionDomain:this.sessionTaskDomain,userText:L});this.sessionTaskDomain=k,Q==="auto-detect"&&fT(L,k)&&gT(M,k);let de=Xi(s),O=Ji(de);!h.toolChoice&&de.requiresFreshTool&&(h.toolChoice="required");let Le=this.projectMemoryStoreFactory.getRootPath(M);if(!this.memdir||this.memdir.getRootPath()!==Le){let P=this.projectMemoryStoreFactory.create(M);P.ensureInitialized(),this.memdir=P}let Oe=this.memdir,F;if(o){let P=Vt(o,l);P?.carryoverSummary&&(F=P.carryoverSummary)}let J=await Bi({basePrompt:a?.systemPrompt,instructionBlock:C,customSystemPrompt:a?.customSystemPrompt,appendSystemPrompt:a?.appendSystemPrompt,sections:[zi(M),Vi(),yT(k),Ki(),...O?[O]:[],...F?[qt("carryover",()=>F,"carryover from predecessor session")]:[],qt("memory",()=>{if(!Oe)return null;let P=Oe.getIndexForPrompt();return P?["## Your Memory (project-level notes \u2014 always visible)","",P,"","<!-- Use memory(action='remember') for user-level long-term facts/preferences that persist across projects.>","<!-- Use memory(action='add') for project-specific notes that should be visible every turn.>"].join(`
634
- `):null},"memory INDEX.md may change between turns")]}),H=[...s].reverse().find(P=>P.role==="user");H&&Ic(o,H,l,r).catch(()=>{}),await this.mcpReady;let Ie=(this.toolCatalog??tr()).getToolManifest(),Gt=new Set(Ie.map(P=>P.function.name)),Ee=Yi([...Ie,...i.filter(P=>!Gt.has(P.function.name))],de);DU(this.permissionChecker,Ee);let st=US(s,T);if(S&&T){let P=FS({id:S.id,name:S.name,source:S.source,context:S.context,enabledSkills:S.enabledSkills,disabledBuiltinSkills:S.disabledBuiltinSkills});Ue(o,{projectId:d,assistant:P},l).catch(()=>{}),this.sendNotification("session.info",{sessionId:o,projectId:d,assistant:P})}if(p&&s.length>0){let P=u?.activeProjectName,W=u?.projectNames.join(", ")??"";st=[{role:"system",content:`[\u6CE8\u610F\uFF1A\u7528\u6237\u4ECE IM \u7AEF\u53D1\u6765\u6D88\u606F\uFF0C\u4F46\u684C\u9762\u7AEF\u5DF2\u8D85\u8FC730\u5206\u949F\u672A\u6D3B\u8DC3\uFF0C\u65E0\u6CD5\u786E\u5B9A\u7528\u6237\u60F3\u5728\u54EA\u4E2A\u9879\u76EE\u4E2D\u5DE5\u4F5C\u3002\u5F53\u524D\u6D3B\u8DC3\u9879\u76EE\uFF1A${P??"\u65E0"}\u3002\u53EF\u7528\u9879\u76EE\uFF1A${W||"\u65E0"}\u3002\u8BF7\u5728\u56DE\u590D\u5F00\u5934\u7B80\u77ED\u8BE2\u95EE\u7528\u6237\u60F3\u5728\u54EA\u4E2A\u9879\u76EE\u4E2D\u7EE7\u7EED\uFF0C\u4F8B\u5982\uFF1A"\u4F60\u60F3\u7EE7\u7EED\u5728\u300CXX\u300D\u9879\u76EE\u4E2D\u5DE5\u4F5C\u5417\uFF1F"]`},...s]}let se=a?.desktopRecentContext;if(!p&&se&&se.length>0&&s.length>0){let P=s[s.length-1],W=P?.role==="user"&&typeof P.content=="string"?P.content:"";if(_U(W)){let V={role:"system",content:"[\u4EE5\u4E0B\u662F\u7528\u6237\u5728\u684C\u9762\u7AEF\u7684\u8FD1\u671F\u5BF9\u8BDD\uFF0C\u4F9B\u4F60\u53C2\u8003\u4EE5\u4FDD\u6301\u4E0A\u4E0B\u6587\u8FDE\u8D2F]"},it={role:"system",content:"[\u684C\u9762\u5BF9\u8BDD\u4E0A\u4E0B\u6587\u7ED3\u675F\uFF0C\u4EE5\u4E0B\u662F\u5F53\u524D IM \u7AEF\u7684\u5BF9\u8BDD]"};st=[V,...se,it,...st],this.log(`[continuation] injected ${se.length} desktop messages as reference`)}}if(!Vt(o,l)?.title){let P=typeof H?.content=="string"?H.content:Array.isArray(H?.content)?H.content.filter(W=>W.type==="text").map(W=>W.text??"").join(""):"";if(P.trim()){let W=null,V=this.resolveClientForPurpose("smallModel");V&&(W=await gm(P,{transport:V.transport,apiKey:V.apiKey,model:V.model})),W||(W=P.trim().slice(0,20)+(P.trim().length>20?"\u2026":"")),await Ue(o,{title:W,projectId:d},l).catch(()=>{}),this.sendNotification("session.info",{sessionId:o,title:W,projectId:d}),this.log(`[title-gen] generated title for session ${o}: "${W}"`)}}for await(let P of b.run({turnId:r,sessionId:o,messages:st,tools:Ee,systemPrompt:J,config:h},f.signal)){let W=new Date().toISOString();if(qi({event:P,turnId:r,now:W,host:this})){P.type==="tool_call"&&this.sessionState?.recordToolCall();continue}switch(P.type){case"start":break;case"end":{let V=ST(P.content,E);if(this.sendNotification("turn.end",{turnId:P.turnId,content:V,usage:P.usage,model:P.model,provider:P.provider,item:{id:`${r}-end`,type:"message",role:"assistant",text:V,createdAt:W}}),P.usage&&this.sessionState){this.sessionState.addUsage(P.usage,P.model??this.currentModel);let it=this.sessionState.createSnapshot();this.sendNotification("turn.usage_update",{turnId:P.turnId,usage:P.usage,model:P.model??this.currentModel,sessionCostUSD:it.totalInputTokens*3e-6+it.totalOutputTokens*15e-6})}V&&(this.lastAssistantMessageForExtract=V,Ic(o,{role:"assistant",content:V},l,r).catch(()=>{}));break}case"error":if(this.sendNotification("turn.error",{turnId:P.turnId,error:{message:P.error,code:P.code}}),P.usage&&this.sessionState){this.sessionState.addUsage(P.usage,this.currentModel);let V=this.sessionState.createSnapshot();this.sendNotification("turn.usage_update",{turnId:P.turnId,usage:P.usage,model:this.currentModel,sessionCostUSD:V.totalInputTokens*3e-6+V.totalOutputTokens*15e-6})}break;case"skill_instruction":this.sendNotification("turn.skill_instruction",{turnId:P.turnId,instruction:P.instruction}),Sh({instruction:P.instruction,eventTurnId:P.turnId,projectRoot:l,host:this});break}}if(this.log(`turn ${r} completed`),this.sessionState?.recordTurnCompleted(),this.sessionState){mm(o,this.sessionState.createSnapshot(),{model:this.currentModel,cwd:l,projectId:d,messageCount:s.length},l).catch(()=>{});let P=this.sessionState.createSnapshot();this.sendNotification("session.info",{sessionId:o,model:this.currentModel||void 0,cwd:l,turnCount:P.turnCount,projectId:d});let W=this.resolveClientForPurpose("smallModel");if(W&&fm(o,{sessionId:o,projectId:d??"",createdAt:"",lastActiveAt:"",turnCount:P.turnCount,messageCount:s.length},s,{transport:W.transport,apiKey:W.apiKey,model:W.model},l),lT({turnId:r,messages:s,client:this.resolveClientForPurpose("textGeneration"),sendNotification:(V,it)=>this.sendNotification(V,it)}),this.petRuntime.awardXp("turn.end"),this.petRuntime.reactAfterTurn(s),a?.sessionType==="group"&&this.sessionState){let V=this.sessionState.createSnapshot(),it=Vt(o,l);it&&IR({...it,turnCount:V.turnCount},l).then(En=>{En.split&&this.sendNotification("session-update",{sessionId:En.activeSessionId,projectId:d??"",title:"",type:"group"})}).catch(()=>{})}}}catch(h){if(f.signal.aborted)this.sendNotification("turn.error",{turnId:r,error:{message:"Turn aborted",code:"ABORTED"}});else{let b=h instanceof Error?h.message:String(h);this.sendNotification("turn.error",{turnId:r,error:{message:b,code:"INTERNAL_ERROR"}})}}finally{ep(this,m)}}function Xe(t){return ra(t)}function vt(t){return ra(t)}function Wt(t){return ra(t)}function yr(t){return ra(t)}function ra(t){return t.multiAgentHandlerHost??t}function CT(t){return new Map([["initialize",e=>_b.call(t,e)],["agent.ping",e=>Db.call(t,e)],["agent.health",e=>Nb.call(t,e)],["agent.metrics",e=>Lb.call(t,e)],["agent.cancel",e=>Ob.call(t,e)],["thread.turn",e=>xT.call(t,e)],["memory.dream",e=>sn.call(t,e)],["agent.abort",e=>wT.call(t,e)],["assistants.list",e=>Hl.call(t,e)],["assistants.resolve",e=>Bl.call(t,e)],["assistants.cloneBuiltin",e=>ql.call(t,e)],["assistants.upsert",e=>Wl.call(t,e)],["assistants.create",e=>Gl.call(t,e)],["assistants.update",e=>zl.call(t,e)],["assistants.delete",e=>Vl.call(t,e)],["assistants.setState",e=>Kl.call(t,e)],["tool.approval.response",e=>AT.call(t,e)],["thread.user_response",e=>PT.call(t,e)],["thread.list",e=>DR.call(t,e)],["session.resume",e=>qR.call(t,e)],["thread.create",e=>_R.call(t,e)],["session.getInfo",e=>WR.call(t,e)],["session.create",e=>NR.call(t,e)],["session.resolve",e=>LR.call(t,e)],["session.list",e=>OR.call(t,e)],["session.get",e=>jR.call(t,e)],["session.getMessages",e=>$R.call(t,e)],["session.update",e=>UR.call(t,e)],["session.delete",e=>FR.call(t,e)],["session.deleteAll",e=>HR.call(t,e)],["session.archive",e=>BR.call(t,e)],["memory.list",e=>lk.call(t,e)],["memory.atlas",e=>dk.call(t,e)],["memory.activity",e=>uk.call(t,e)],["memory.observe",e=>pk.call(t,e)],["memory.propose",e=>mk.call(t,e)],["memory.consolidate",e=>gk.call(t,e)],["memory.read",e=>fk.call(t,e)],["memory.write",e=>hk.call(t,e)],["memory.search",e=>yk.call(t,e)],["memory.delete",e=>vk.call(t,e)],["memory.update",e=>bk.call(t,e)],["tools.list",e=>kb.call(t,e)],["media.listModels",e=>Qb.call(t,e)],["media.cancel",e=>Zb.call(t,e)],["media.status",e=>ek.call(t,e)],["media.stt",e=>tk.call(t,e)],["settings.listProviders",e=>ZR.call(t,e)],["settings.addKey",e=>eS.call(t,e)],["settings.removeKey",e=>tS.call(t,e)],["settings.toggleKey",e=>rS.call(t,e)],["settings.toggleModel",e=>nS.call(t,e)],["settings.listModels",e=>oS.call(t,e)],["settings.setActiveModel",e=>sS.call(t,e)],["settings.getActiveModel",e=>iS.call(t,e)],["settings.getOverview",e=>aS.call(t,e)],["settings.refreshModels",e=>cS.call(t,e)],["settings.validateKey",e=>lS.call(t,e)],["assistants.list",e=>Hl.call(t,e)],["assistants.resolve",e=>Bl.call(t,e)],["assistants.cloneBuiltin",e=>ql.call(t,e)],["assistants.upsert",e=>Wl.call(t,e)],["assistants.create",e=>Gl.call(t,e)],["assistants.update",e=>zl.call(t,e)],["assistants.delete",e=>Vl.call(t,e)],["assistants.setState",e=>Kl.call(t,e)],["provider.list",e=>Rb.call(t,e)],["config.get",e=>Sb.call(t,e)],["config.update",e=>wb.call(t,e)],["config.tunables",e=>Pb.call(t,e)],["config.updateTunable",e=>xb.call(t,e)],["community.getConsent",e=>Mh.call(t,e)],["community.setConsent",e=>_h.call(t,e)],["community.matchRegistry",e=>Nh.call(t,e)],["community.listShared",e=>Dh.call(t,e)],["community.withdrawShared",e=>Bh.call(t,e)],["community.withdrawAllShared",e=>qh.call(t,e)],["community.listNotices",e=>Wh.call(t,e)],["community.markNoticeRead",e=>Gh.call(t,e)],["community.listPublishAudit",e=>Hh.call(t,e)],["community.resolveInstall",e=>Lh.call(t,e)],["community.installResource",e=>Oh.call(t,e)],["community.publishSkill",e=>jh.call(t,e)],["community.publishPet",e=>$h.call(t,e)],["community.recordSignal",e=>Uh.call(t,e)],["community.recordTelemetry",e=>Fh.call(t,e)],["todos.list",e=>Cb.call(t,e)],["tasks.list",e=>Ib.call(t,e)],["tasks.cancel",e=>Eb.call(t,e)],["agents.scan",e=>df.call(Xe(t),e)],["agents.list",e=>uf.call(Xe(t),e)],["agents.prompt",e=>Tf.call(Xe(t),e)],["agents.config",e=>pf.call(Xe(t),e)],["agents.setConfig",e=>mf.call(Xe(t),e)],["agents.getConfig",e=>gf.call(Xe(t),e)],["agents.removeConfig",e=>ff.call(Xe(t),e)],["agents.setGateway",e=>hf.call(Xe(t),e)],["agents.getGateway",e=>yf.call(Xe(t),e)],["agents.processes",e=>bf.call(Xe(t),e)],["agents.kill",e=>kf.call(Xe(t),e)],["agents.listConfigured",e=>vf.call(Xe(t),e)],["agents.getLog",e=>Rf.call(Xe(t),e)],["agents.testConnection",e=>Sf.call(Xe(t),e)],["solo.start",e=>MS.call(yr(t),e)],["solo.status",e=>_S.call(yr(t),e)],["solo.cancel",e=>DS.call(yr(t),e)],["solo.select",e=>NS.call(yr(t),e)],["solo.list",e=>LS.call(yr(t),e)],["solo.delete",e=>OS.call(yr(t),e)],["solo.message",e=>jS.call(yr(t),e)],["solo.evaluate",e=>$S.call(yr(t),e)],["product.plan",e=>Hk.call(vt(t),e)],["product.confirm",e=>Bk.call(vt(t),e)],["product.message",e=>qk.call(vt(t),e)],["product.create",e=>Wk.call(vt(t),e)],["product.resume",e=>Gk.call(vt(t),e)],["product.pause",e=>zk.call(vt(t),e)],["product.checkpoint",e=>Kk.call(vt(t),e)],["product.status",e=>Vk.call(vt(t),e)],["product.list",e=>Xk.call(vt(t),e)],["product.delete",e=>Yk.call(vt(t),e)],["product.cancel",e=>Jk.call(vt(t),e)],["product.rollback",e=>Qk.call(vt(t),e)],["workflow.create",e=>sR.call(Wt(t),e)],["workflow.get",e=>iR.call(Wt(t),e)],["workflow.describe",e=>aR.call(Wt(t),e)],["workflow.patch",e=>cR.call(Wt(t),e)],["workflow.run",e=>lR.call(Wt(t),e)],["workflow.setActive",e=>dR.call(Wt(t),e)],["workflow.list",e=>uR.call(Wt(t),e)],["workflow.delete",e=>pR.call(Wt(t),e)],["workflow.onImMessage",e=>mR.call(Wt(t),e)],["workflow.onWebhook",e=>gR.call(Wt(t),e)],["project.create",e=>yR.call(t,e)],["project.list",e=>vR.call(t,e)],["project.delete",e=>bR.call(t,e)],["project.purgeAll",e=>kR.call(t,e)],["project.rename",e=>RR.call(t,e)],["project.archive",e=>SR.call(t,e)],["project.unarchive",e=>TR.call(t,e)],["project.update",e=>AR.call(t,e)],["project.archiveByGroup",e=>wR.call(t,e)],["session.switchProject",e=>GR.call(t,e)],["session.focus",e=>KR.call(t,e)],["session.moveToProject",e=>VR.call(t,e)],["session.getState",e=>zR.call(t,e)],["files.list",e=>Ub.call(t,e)],["files.create",e=>Fb.call(t,e)],["files.rename",e=>Hb.call(t,e)],["files.delete",e=>Bb.call(t,e)],["files.gitStatus",e=>qb.call(t,e)],["instructions.list",e=>Wb.call(t,e)],["instructions.read",e=>Gb.call(t,e)],["instructions.write",e=>zb.call(t,e)],["instructions.delete",e=>Kb.call(t,e)],["plans.list",e=>Vb.call(t,e)],["skills.list",e=>hS.call(t,e)],["skills.activate",e=>yS.call(t,e)],["skills.deactivate",e=>vS.call(t,e)],["skills.delete",e=>bS.call(t,e)],["skills.promote",e=>kS.call(t,e)],["skills.stats",e=>RS.call(t,e)],["skills.pin",e=>SS.call(t,e)],["skills.unpin",e=>TS.call(t,e)],["skills.curator",e=>wS.call(t,e)],["skills.lifecycle",e=>AS.call(t,e)],["pet.hatch",e=>Ak.call(t,e)],["pet.interact",e=>Pk.call(t,e)],["pet.status",e=>xk.call(t,e)],["pet.forge",e=>Ck.call(t,e)],["pet.confirm_response",e=>kk.call(t,e)]])}import{randomUUID as IT}from"node:crypto";import*as sp from"node:path";G();async function ET(t,e){t.log(`[acp] x/dream: session=${e.sessionId}`);let r=t.resolveClientForPurpose("textGeneration");if(!r)return{ok:!1,summary:"No LLM transport configured for dream"};let n=X(),o={jsonrpc:"2.0",id:`acp-dream-${IT().slice(0,8)}`,method:"memory.dream",params:{turnId:`dream-${IT().slice(0,8)}`,sessionId:e.sessionId||t.currentSessionId,config:{memoryRoot:e.config?.memoryRoot||t.resolveMemoryRoot?.()||sp.join(n,"memory"),transcriptDir:e.config?.transcriptDir||t.resolveTranscriptDir?.()||sp.join(n,"agent-logs"),model:r.model,apiKey:r.apiKey,...e.config}}};return await sn.call(t,o),{ok:!0,summary:"Dream consolidation triggered"}}async function MT(t,e){t.log("[acp] x/solo.start");let r=Ve.call(t),n=await r.start(e);return r.getStatus(n)}async function _T(t,e){t.log("[acp] x/solo.status");let r=e.soloId;if(!r)return t.soloEvaluator?t.soloEvaluator.listSessions():[];let o=Ve.call(t).getStatus(r);if(!o)throw new Error(`Solo session ${r} not found`);return o}async function DT(t,e){return t.log("[acp] x/solo.select"),{ok:!0,mergedBranch:await Ve.call(t).select(e)}}async function NT(t,e){t.log("[acp] x/solo.cancel");let r=Ve.call(t),n=e.soloId;return await r.cancel(n),{ok:!0}}async function LT(t,e){return t.log("[acp] x/solo.subscribe"),{ok:!0,soloId:e.soloId}}async function OT(t,e){t.log("[acp] x/solo.message");let r=Ve.call(t),{soloId:n,agentId:o,content:s,agentIndex:i}=e;return r.message(n,o,s,i)}async function jT(t,e){t.log("[acp] x/solo.evaluate");let r=Ve.call(t),{soloId:n,evaluatorAgentId:o,evaluatorIndex:s}=e;return r.triggerEvaluation(n,o,s)}async function $T(t){return t.log("[acp] x/agents.list"),ul()}async function UT(t,e){return t.log("[acp] x/product.create"),{productId:await ke.call(t).create(e)}}async function FT(t,e){return t.log("[acp] x/product.plan"),Fr.call(t).plan(e)}async function HT(t,e){t.log("[acp] x/product.confirm");let r=Fr.call(t),n=e,o=await r.confirm(n),s=r.getSession(n.productId);return s&&await ke.call(t).create({name:s.plan?.name??s.goal.slice(0,50),cwd:s.cwd,instances:n.instances,tasks:n.tasks,budget:n.budget}),o}async function BT(t,e){t.log("[acp] x/product.message");let r=Fr.call(t),n=e;return r.message(n.productId,n.content)}async function qT(t,e){t.log("[acp] x/product.resume");let r=ke.call(t),n=e.productId;return await r.resume(n,t.getActiveProjectRoot()),{ok:!0}}async function WT(t,e){t.log("[acp] x/product.status");let r=e.productId;if(!t.productOrchestrator)return r?null:[];if(!r)return t.productOrchestrator.list(t.getActiveProjectRoot());let n=t.productOrchestrator.getStatus(r);if(!n)throw new Error(`Product session ${r} not found`);return n}async function GT(t,e){t.log("[acp] x/product.pause");let r=ke.call(t),n=e.productId;return await r.pause(n),{ok:!0}}async function zT(t,e){t.log("[acp] x/product.cancel");let r=ke.call(t),n=e.productId;return await r.delete(n),{ok:!0}}async function KT(t,e){t.log("[acp] x/product.rollback");let r=ke.call(t),n=e.productId,o=e.checkpointId??"latest";return await r.rollback(n,o),{ok:!0}}async function VT(t,e){return t.log("[acp] x/product.subscribe"),{ok:!0,productId:e.productId}}async function XT(t,e){let r=e.agentType,n=e.prompt,o=e.maxTurns;if(!n)throw new Error("Missing required param: prompt");if(!r)throw new Error("Missing required param: agentType");let s=Vn(r);if(!s)throw new Error(`Unknown agent type: ${r}`);let i=t.resolveClientForPurpose("textGeneration");if(!i)throw new Error("No LLM provider configured; send a prompt first to configure the model");if(t.log(`[acp] x/team.delegate: agent=${r}, maxTurns=${o??s.maxTurns}`),ht.isTeamBudgetExceeded())return{ok:!1,agentType:r,output:void 0,error:ht.teamBudgetExceededError(),tokensUsed:0};let a={invoke:async()=>({result:"Tool execution not available in delegated mode"})},c={info:u=>t.log(`[delegate:${r}] ${u}`),warn:u=>t.log(`[delegate:${r}] WARN: ${u}`),error:u=>t.log(`[delegate:${r}] ERROR: ${u}`),debug:u=>t.log(`[delegate:${r}] ${u}`)},l=await Jr({promptMessages:[{role:"user",content:n}],tools:[],transport:i.transport,toolInvoker:a,createAgentRunner:on,apiKey:i.apiKey,model:i.model,log:c,forkLabel:`team-delegate-${r}`,maxTurns:o??s.maxTurns,parentSignal:t.activeTurn?.signal,parentDepth:0}),d=l.events.filter(u=>u.type==="end"&&"content"in u).map(u=>u.content??"").join("")||l.events.filter(u=>u.type==="delta"&&"text"in u).map(u=>u.text).join(""),p=l.totalUsage.inputTokens+l.totalUsage.outputTokens;return ht.recordForkTokens(p),{ok:l.ok,agentType:r,output:d||void 0,error:l.error,tokensUsed:p}}import{randomUUID as YT}from"node:crypto";async function JT(t,e,r){let n=e.clientInfo?.name??"unknown";t.log(`[acp] initialize: host=${n}`);let o={extendedEvents:!0,extendedMethods:!0,orchestration:!0,configOptions:[{name:"model",type:"string",description:"LLM model identifier"},{name:"provider",type:"string",description:"LLM provider identifier"},{name:"maxRounds",type:"number",description:"Max tool loop rounds"},{name:"temperature",type:"number",description:"Sampling temperature"}]};return t.ensureDefaultProject(),{protocolVersion:1,agentInfo:{name:"qlogicagent",version:r},agentCapabilities:o}}async function QT(t,e){let r=e.sessionId??YT();return t.log(`[acp] session/new: id=${r}`),t.currentSessionId=r,t.sessionState=new fr(r),t.sessionTaskDomain=void 0,t.memoryPrefetchState=kt(),e.cwd&&typeof e.cwd=="string"&&t.setActiveWorkdir(e.cwd),t.enableIdleDream(),{sessionId:r}}async function ZT(t,e){let r=YT(),n=e.sessionId,o=e.prompt.map(a=>a.type==="text"?a.text:`[${a.type}]`).join("");if(!o.trim())return t.sendNotification("turn.start",{turnId:r,model:t.currentModel||void 0}),t.sendNotification("turn.end",{turnId:r,content:"",item:{id:`${r}-end`,type:"message",role:"assistant",text:"",createdAt:new Date().toISOString()}}),{stopReason:"end_turn"};let s=t.sessionHistory.appendAcpUserMessage(n,o),i=await LU(t,r,n,[...s]);return i.content&&t.sessionHistory.appendAcpAssistantMessage(n,i.content),i}async function LU(t,e,r,n){let o=new AbortController;t.activeTurn=o,t.sendNotification("turn.start",{turnId:e,model:t.currentModel||void 0});try{let s={model:t.currentModel||void 0,provider:t.currentProvider||void 0,apiKey:t.currentApiKey||void 0,baseUrl:t.currentBaseUrl||void 0},i=Xi(n);i.requiresFreshTool&&(s.toolChoice="required");let a=t.resolveAgent(s);if(!a)return t.sendNotification("turn.delta",{turnId:e,text:"Error: No LLM provider configured. Configure via ~/.qlogicagent/settings.json or pass provider/apiKey in session config.",item:{id:`${e}-err`,type:"message",role:"assistant",text:"",createdAt:new Date().toISOString()}}),t.sendNotification("turn.end",{turnId:e,content:"",item:{id:`${e}-end`,type:"message",role:"assistant",text:"",createdAt:new Date().toISOString()}}),t.activeTurn=null,{stopReason:"end_turn"};await t.mcpReady;let c=Yi((t.toolCatalog??tr()).getToolManifest(),i),l=t.getActiveProjectRoot(),d=await ta(l,t.currentHooks??void 0),p=d.length>0?ea(d):void 0,u=Ji(i),m=await Bi({instructionBlock:p,sections:[zi(l),Vi(),Ki(),...u?[u]:[]]}),f,g="end_turn",h="";for await(let b of a.run({turnId:e,sessionId:r,messages:n,tools:c,systemPrompt:m,config:s},o.signal)){let v=new Date().toISOString();if(!qi({event:b,turnId:e,now:v,host:t}))switch(b.type){case"start":break;case"end":b.usage&&(f={inputTokens:b.usage.inputTokens??0,outputTokens:b.usage.outputTokens??0,cacheReadTokens:b.usage.cacheRead,cacheWriteTokens:b.usage.cacheWrite}),h=b.content??"",t.sendNotification("turn.end",{turnId:b.turnId,content:b.content,usage:b.usage,model:b.model,provider:b.provider,item:{id:`${e}-end`,type:"message",role:"assistant",text:b.content,createdAt:v}});break;case"error":g="end_turn",t.sendNotification("turn.error",{turnId:b.turnId,error:{message:b.error,code:b.code}});break}}return t.activeTurn=null,{stopReason:g,usage:f,content:h}}catch(s){t.activeTurn=null;let i=s instanceof Error?s.message:String(s);return t.log(`[acp] runAcpTurn error: ${i}`),t.sendNotification("turn.error",{turnId:e,error:{message:i,code:"INTERNAL_ERROR"}}),{stopReason:"end_turn"}}}async function ew(t,e){t.log(`[acp] session/end: id=${e.sessionId}`),t.sessionHistory.clearAcpSession(e.sessionId),t.currentSessionId===e.sessionId&&(t.cancelIdleDreamTimer(),t.currentHooks&&await t.currentHooks.invoke("session.ended",{sessionId:e.sessionId}).catch(()=>{}),t.currentSessionId="",t.sessionState=null,t.disposeSessionRuntime?.())}async function tw(t,e){let r=e.configId??e.option;t.log(`[acp] session/set_config: ${r}=${JSON.stringify(e.value)}`);let n=typeof e.value=="string"?e.value:"";switch(r){case"model":t.currentModel=n;break;case"provider":t.currentProvider=n;break;case"apiKey":t.currentApiKey=n;break;case"baseUrl":t.currentBaseUrl=n;break}}async function rw(t,e,r){t.log(`[acp] session/set_model: ${r} (note: model is managed by ModelRegistry, this is a hint only)`),r&&(t.currentModel=r)}async function nw(t,e,r){t.log(`[acp] session/set_mode: ${r}`)}function ow(t,e,r=t){return{handleAcpInitialize:n=>JT(t,n,e),handleAcpSessionNew:n=>QT(t,n),handleAcpSessionPrompt:n=>ZT(t,n),handleAcpSessionEnd:n=>ew(t,n),handleAcpSessionSetConfig:n=>tw(t,n),handleAcpSessionSetModel:(n,o)=>rw(t,n,o),handleAcpSessionSetMode:(n,o)=>nw(t,n,o),handleAcpPermissionResponse:(n,o)=>{t.log(`[acp] permission response: ${n} -> ${o}`),t.permissionChecker?.resolveApproval({approvalId:n,decision:o==="allow"?"allow":"deny"})},handleAcpAbort:async n=>{t.log(`[acp] abort: session=${n.sessionId}`),t.activeTurn&&(t.activeTurn.abort(),t.activeTurn=null)},handleAcpDream:n=>ET(r,n),handleAcpAgentsList:()=>$T(r),handleAcpSoloStart:n=>MT(r,n),handleAcpSoloStatus:n=>_T(r,n),handleAcpSoloSelect:n=>DT(r,n),handleAcpSoloCancel:n=>NT(r,n),handleAcpSoloSubscribe:n=>LT(r,n),handleAcpSoloMessage:n=>OT(r,n),handleAcpSoloEvaluate:n=>jT(r,n),handleAcpProductCreate:n=>UT(r,n),handleAcpProductPlan:n=>FT(r,n),handleAcpProductConfirm:n=>HT(r,n),handleAcpProductMessage:n=>BT(r,n),handleAcpProductPause:n=>GT(r,n),handleAcpProductResume:n=>qT(r,n),handleAcpProductCancel:n=>zT(r,n),handleAcpProductRollback:n=>KT(r,n),handleAcpProductStatus:n=>WT(r,n),handleAcpProductSubscribe:n=>VT(r,n),handleAcpTeamDelegate:n=>XT(r,n)}}var na=class{currentHooks=null;mcpManager=null;mcpReady=Promise.resolve();pluginLoader=null;permissionChecker=null;permissionUnregister=null;fileWatcher=null;memoryProvider=null;memoryDreamProvider=null;memoryUserId="";getPluginSkills(){return this.pluginLoader?.getPluginSkills()??[]}applyBootstrap(e){this.currentHooks=e.hooks,this.memoryProvider=e.memoryHandlerProvider,this.memoryDreamProvider=e.memoryDreamProvider,this.memoryUserId=e.memoryUserId,this.permissionChecker=e.permissionChecker,this.permissionUnregister=e.permissionUnregister}resetAfterSessionDispose(){this.currentHooks=null,this.memoryProvider=null,this.memoryDreamProvider=null}stopFileWatcher(){this.fileWatcher&&(this.fileWatcher.stop(),this.fileWatcher=null)}async disconnectMcp(){if(!this.mcpManager)return;let e=this.mcpManager;this.mcpManager=null,await e.disconnectAll()}unregisterPermissions(){this.permissionUnregister&&(this.permissionUnregister(),this.permissionUnregister=null)}resetMemoryProviders(){this.memoryProvider=null,this.memoryDreamProvider=null}};G();import{join as iw}from"node:path";import{chmod as jU}from"node:fs/promises";var aw="agent-configs.json";function sw(){return iw(B(),aw)}function $U(t){return iw(De(t),aw)}function UU(){return{agents:{}}}var oa=class{data=UU();cwd;constructor(e){this.cwd=e}async load(){let e=await Zt(sw()),r=this.cwd?await Zt($U(this.cwd)):void 0,n={gatewayUrl:e?.gatewayUrl,agents:{...e?.agents},customAgents:{...e?.customAgents}};if(r){r.gatewayUrl&&(n.gatewayUrl=r.gatewayUrl);for(let[o,s]of Object.entries(r.agents??{}))n.agents[o]={...n.agents[o],...s};for(let[o,s]of Object.entries(r.customAgents??{}))n.customAgents??={},n.customAgents[o]=s}this.data=n}getData(){return this.data}getAgentConfig(e){return this.data.agents[e]??null}async setAgentConfig(e,r){this.data.agents[e]={...this.data.agents[e],...r},await this.save()}async removeAgentConfig(e){delete this.data.agents[e],await this.save()}getGatewayUrl(){return this.data.gatewayUrl}async setGatewayUrl(e){this.data.gatewayUrl=e,await this.save()}registerCustomAgent(e){this.data.customAgents??={},this.data.customAgents[e.id]=e}unregisterCustomAgent(e){this.data.customAgents&&delete this.data.customAgents[e]}getCustomAgents(){return{...this.data.customAgents}}async save(){let e=sw();await mr(e,this.data);try{await jU(e,384)}catch{}}};var sa=class{constructor(e){this.deps=e}deps;store=null;get currentStore(){return this.store}async ensureStore(){return this.store||(this.store=new oa(this.deps.getActiveProjectRoot()),await this.store.load(),this.deps.acpDetector.setConfigStore(this.store.getData())),this.store}};function cw(t){return new sa(t)}var ia=class{soloEvaluator=null;productOrchestrator=null;productPlanner=null;soloProcessManager=null;productProcessManager=null};function lw(t){let e=t.acpDetector??new Ss,r=new ia,o=(t.createAgentConfigRuntime??cw)({acpDetector:e,getActiveProjectRoot:t.getActiveProjectRoot});return{acpDetector:e,get agentConfigStore(){return o.currentStore},ensureAgentConfigStore:()=>o.ensureStore(),get soloEvaluator(){return r.soloEvaluator},set soloEvaluator(s){r.soloEvaluator=s},get productOrchestrator(){return r.productOrchestrator},set productOrchestrator(s){r.productOrchestrator=s},get productPlanner(){return r.productPlanner},set productPlanner(s){r.productPlanner=s},get soloProcessManager(){return r.soloProcessManager},set soloProcessManager(s){r.soloProcessManager=s},get productProcessManager(){return r.productProcessManager},set productProcessManager(s){r.productProcessManager=s},getActiveProjectRoot:t.getActiveProjectRoot,emitAgentStatus:t.emitAgentStatus,handleMcpToolCall:t.handleMcpToolCall,log:t.log,sendNotification:t.sendNotification,sendResponse:t.sendResponse}}var aa=class{acpSessionHistories=new Map;resumedSessionHistories=new Map;appendAcpUserMessage(e,r){let n=this.getOrCreateAcpHistory(e);return n.push({role:"user",content:r}),[...n]}appendAcpAssistantMessage(e,r){r&&this.getOrCreateAcpHistory(e).push({role:"assistant",content:r})}clearAcpSession(e){this.acpSessionHistories.delete(e)}saveResumedSession(e,r){if(r.length===0){this.resumedSessionHistories.delete(e);return}this.resumedSessionHistories.set(e,[...r])}withResumedHistory(e,r){let n=this.resumedSessionHistories.get(e);if(!n||n.length===0)return r;let o=FU(r,n)?r.slice(n.length):r;return[BU(n),...n,...o]}getOrCreateAcpHistory(e){let r=this.acpSessionHistories.get(e);return r||(r=[],this.acpSessionHistories.set(e,r)),r}};function FU(t,e){if(t.length<e.length)return!1;for(let r=0;r<e.length;r++)if(!HU(t[r],e[r]))return!1;return!0}function HU(t,e){return t.role===e.role&&JSON.stringify(t.content)===JSON.stringify(e.content)}function BU(t){let e=t.filter(n=>n.role==="user"&&typeof n.content=="string").map(n=>String(n.content).replace(/\s+/g," ").trim()).filter(Boolean).slice(-8);return{role:"system",content:["Resumed session context follows. It is authoritative prior conversation for this same session.","If the current user asks about information already present there, answer directly from it before using memory or tools.",e.length>0?` Prior user statements recovered from this session:
632
+ `,".","\u3002",";","\uFF1B"].map(a=>t.indexOf(a,r)).filter(a=>a>=0),i=s.length>0?Math.min(...s):t.length;return t.slice(o,i)}function ST(t,e){let r=t;for(let n of e)EU(n.marker)&&(r.includes(n.marker)||(n.placement==="prefix"?r=r.trim().length>0?`${n.marker} ${r}`:n.marker:r=r.trim().length>0?`${r.trimEnd()}
633
+ ${n.marker}`:n.marker));return r}function xU(t){let e=t.toLowerCase();return e.includes("every response")||e.includes("all responses")||e.includes("always")||t.includes("\u6240\u6709\u56DE\u590D")||t.includes("\u6BCF\u6B21\u56DE\u590D")||t.includes("\u6BCF\u4E2A\u56DE\u590D")||t.includes("\u6C38\u8FDC")?e.includes("must")||e.includes("required")||e.includes("exact")||t.includes("\u5FC5\u987B")||t.includes("\u52A1\u5FC5")||t.includes("\u786C\u6027\u8981\u6C42"):!1}function CU(t){let e=t.toLowerCase(),r=Qi(e,["start with","begin with"])+Qi(t,["\u5F00\u5934","\u5FC5\u987B\u4EE5"]),n=Qi(e,["end with","append","at the end"])+Qi(t,["\u672B\u5C3E","\u7ED3\u5C3E","\u7ED3\u675F\u6807\u8BB0"]);return r>=0||n>=0?r>n?"prefix":"suffix":"include"}function Qi(t,e){let r=-1;for(let n of e){let o=t.lastIndexOf(n);o>r&&(r=o)}return r}function IU(t){let e=t.trim();return e.length<2||e.length>100||/https?:\/\//i.test(e)?!1:/[A-Z0-9_\-[\]—-]/.test(e)}function EU(t){return/[A-Z\[\]—-]/.test(t)}async function ta(t,e){return AU(t,e)}function TT(){}var _U=[/继续(桌面|电脑|刚才|上次|之前)的/,/接着(桌面|电脑|刚才|上次|之前)的/,/刚才(那个|那件|说的|聊的|做的)/,/上次(说到|聊到|做到|讲到)/,/桌面(端|上)?(那个|那边|的任务|的对话|在做)/,/电脑(端|上)?(那个|那边|的任务|的对话|在做)/,/之前(那个|在做的|讨论的|说的)/,/帮我继续/,/接着(做|干|搞|写|改)/,/continue (from |where |the )?desktop/i,/pick up where/i,/what were we (doing|working on|talking about)/i,/continue (the |our )?(last |previous )?(task|conversation|chat)/i];function DU(t){return!t||t.length<3?!1:_U.some(e=>e.test(t))}function wT(t){let e=t.params?.turnId??"";this.log(`abort requested for turn ${e}`),this.activeTurn&&(this.activeTurn.abort(),this.activeTurn=null),t.id!==void 0&&this.sendResponse(t.id,{aborted:!0})}function AT(t){let e=t.params;if(!e)return;let r=e.approvalId,n=e.decision;if(!r||!n){this.log("[warn] tool.approval.response missing approvalId or decision");return}let o={approvalId:r,decision:n==="allow"?"allow":"deny",updatedInput:e.updatedInput};this.permissionChecker&&this.permissionChecker.resolveApproval(o),t.id!==void 0&&this.sendResponse(t.id,{received:!0})}function NU(t,e){t?.setToolMeta?.(e)}function PT(t){let e=t.params,r=e?.requestId;if(!r){this.log("[warn] thread.user_response missing requestId"),t.id!==void 0&&this.sendResponse(t.id,{received:!1});return}let n=this.pendingAskUser.get(r);if(!n){this.log(`[warn] thread.user_response: no pending request ${r}`),t.id!==void 0&&this.sendResponse(t.id,{received:!1});return}if(this.pendingAskUser.delete(r),e?.declined===!0)n.resolve(null);else{let s=e?.answers??{};n.resolve(s)}t.id!==void 0&&this.sendResponse(t.id,{received:!0})}async function xT(t){let e=t.params??{},r=e.turnId??MU(),n=typeof this.currentTurnId=="string"?this.currentTurnId:void 0;this.currentTurnId=r;let o=e.sessionId,s=e.messages??[],i=e.tools??[],a=e.config;t.id!==void 0&&this.sendResponse(t.id,{accepted:!0,turnId:r}),s=this.sessionHistory.withResumedHistory(o,s);let c=aT({config:a,sessionId:o,host:this}),{sessionProjectRoot:l,sessionProjectId:d,projectHintStale:p,staleProjectHintContext:u}=c;this.configureTurnMedia?.(a,r),rT(this),this.activeTurn&&n&&n!==r&&this.sendNotification("turn.error",{turnId:n,error:{message:"Turn aborted by a newer turn",code:"ABORTED"}});let m=await oT(this,o),f=m.abortController;this.log(`turn ${r} starting (session: ${o})`),this.sendNotification("turn.start",{turnId:r,model:a?.model??(this.currentModel||void 0),provider:a?.provider||void 0,projectId:d});let g=[...s].reverse().find(h=>h.role==="user");if(this.lastUserMessageForAutoExtract=typeof g?.content=="string"?g.content:void 0,!g||!String(g.content??"").trim()){this.sendNotification("turn.end",{turnId:r,content:"",item:{id:`${r}-end`,type:"message",role:"assistant",text:"",createdAt:new Date().toISOString()}}),ep(this,m);return}try{let h={provider:a?.provider,model:a?.model,apiKey:a?.apiKey,baseUrl:a?.baseUrl,maxRounds:a?.maxRounds,temperature:a?.temperature,contextWindowTokens:a?.contextWindowTokens,maxOutputTokens:a?.maxOutputTokens,modelMaxOutputTokens:a?.modelMaxOutputTokens,maxConcurrentTools:a?.maxConcurrentTools,mediaProviders:a?.mediaProviders,reasoning:a?.reasoning,promptCacheKey:a?.promptCacheKey,promptCacheRetention:a?.promptCacheRetention,serviceTier:a?.serviceTier,openaiBuiltinTools:a?.openaiBuiltinTools,maxToolCalls:a?.maxToolCalls,parallelToolCalls:a?.parallelToolCalls,textVerbosity:a?.textVerbosity,toolChoice:a?.toolChoice,assistantId:a?.assistantId,mcpServers:a?.mcpServers,fallbackModel:D().resolveModelForPurpose("smallModel")??void 0};{let P=h.provider??"",W=h.model??"";P&&W&&D().getModelInfo(P,W)?.streamRequired&&(h.streamRequired=!0)}let b=this.resolveAgent(h),v=typeof a?.assistantId=="string"?a.assistantId.trim():"",R=v?await Ir():[],S=v?R.find(P=>P.id===v):void 0,T=v?await Ps(v):null;if(this.permissionChecker?.ruleEngineRef&&a?.permissions){let P=tT(this.permissionChecker.ruleEngineRef,a.permissions);vi(P.mode==="full_access")}if(!b){this.sendNotification("turn.error",{turnId:r,error:{message:"No LLM provider configured. Provide provider/model/apiKey in agent.turn config, or set DEEPSEEK_API_KEY / OPENAI_API_KEY / ANTHROPIC_API_KEY environment variable.",code:"NO_PROVIDER"}});return}let C,E=[],M=a?.workdir??this.getActiveProjectRoot();this.setActiveWorkdir(M);try{let P=await ta(M,this.currentHooks??void 0);P.length>0&&(C=ea(P),E=op(P))}catch{}let L=s.filter(P=>P.role==="user").map(P=>typeof P.content=="string"?P.content:"").join(" "),{domain:k,source:Q}=mT({cwd:M,hostOverride:a?.taskDomain,sessionDomain:this.sessionTaskDomain,userText:L});this.sessionTaskDomain=k,Q==="auto-detect"&&fT(L,k)&&gT(M,k);let de=Xi(s),O=Ji(de);!h.toolChoice&&de.requiresFreshTool&&(h.toolChoice="required");let Le=this.projectMemoryStoreFactory.getRootPath(M);if(!this.memdir||this.memdir.getRootPath()!==Le){let P=this.projectMemoryStoreFactory.create(M);P.ensureInitialized(),this.memdir=P}let Oe=this.memdir,F;if(o){let P=Vt(o,l);P?.carryoverSummary&&(F=P.carryoverSummary)}let J=await Bi({basePrompt:a?.systemPrompt,instructionBlock:C,customSystemPrompt:a?.customSystemPrompt,appendSystemPrompt:a?.appendSystemPrompt,sections:[zi(M),Vi(),yT(k),Ki(),...O?[O]:[],...F?[qt("carryover",()=>F,"carryover from predecessor session")]:[],qt("memory",()=>{if(!Oe)return null;let P=Oe.getIndexForPrompt();return P?["## Your Memory (project-level notes \u2014 always visible)","",P,"","<!-- Use memory(action='remember') for user-level long-term facts/preferences that persist across projects.>","<!-- Use memory(action='add') for project-specific notes that should be visible every turn.>"].join(`
634
+ `):null},"memory INDEX.md may change between turns")]}),H=[...s].reverse().find(P=>P.role==="user");H&&Ic(o,H,l,r).catch(()=>{}),await this.mcpReady;let Ie=(this.toolCatalog??tr()).getToolManifest(),Gt=new Set(Ie.map(P=>P.function.name)),Ee=Yi([...Ie,...i.filter(P=>!Gt.has(P.function.name))],de);NU(this.permissionChecker,Ee);let st=US(s,T);if(S&&T){let P=FS({id:S.id,name:S.name,source:S.source,context:S.context,enabledSkills:S.enabledSkills,disabledBuiltinSkills:S.disabledBuiltinSkills});Ue(o,{projectId:d,assistant:P},l).catch(()=>{}),this.sendNotification("session.info",{sessionId:o,projectId:d,assistant:P})}if(p&&s.length>0){let P=u?.activeProjectName,W=u?.projectNames.join(", ")??"";st=[{role:"system",content:`[\u6CE8\u610F\uFF1A\u7528\u6237\u4ECE IM \u7AEF\u53D1\u6765\u6D88\u606F\uFF0C\u4F46\u684C\u9762\u7AEF\u5DF2\u8D85\u8FC730\u5206\u949F\u672A\u6D3B\u8DC3\uFF0C\u65E0\u6CD5\u786E\u5B9A\u7528\u6237\u60F3\u5728\u54EA\u4E2A\u9879\u76EE\u4E2D\u5DE5\u4F5C\u3002\u5F53\u524D\u6D3B\u8DC3\u9879\u76EE\uFF1A${P??"\u65E0"}\u3002\u53EF\u7528\u9879\u76EE\uFF1A${W||"\u65E0"}\u3002\u8BF7\u5728\u56DE\u590D\u5F00\u5934\u7B80\u77ED\u8BE2\u95EE\u7528\u6237\u60F3\u5728\u54EA\u4E2A\u9879\u76EE\u4E2D\u7EE7\u7EED\uFF0C\u4F8B\u5982\uFF1A"\u4F60\u60F3\u7EE7\u7EED\u5728\u300CXX\u300D\u9879\u76EE\u4E2D\u5DE5\u4F5C\u5417\uFF1F"]`},...s]}let se=a?.desktopRecentContext;if(!p&&se&&se.length>0&&s.length>0){let P=s[s.length-1],W=P?.role==="user"&&typeof P.content=="string"?P.content:"";if(DU(W)){let V={role:"system",content:"[\u4EE5\u4E0B\u662F\u7528\u6237\u5728\u684C\u9762\u7AEF\u7684\u8FD1\u671F\u5BF9\u8BDD\uFF0C\u4F9B\u4F60\u53C2\u8003\u4EE5\u4FDD\u6301\u4E0A\u4E0B\u6587\u8FDE\u8D2F]"},it={role:"system",content:"[\u684C\u9762\u5BF9\u8BDD\u4E0A\u4E0B\u6587\u7ED3\u675F\uFF0C\u4EE5\u4E0B\u662F\u5F53\u524D IM \u7AEF\u7684\u5BF9\u8BDD]"};st=[V,...se,it,...st],this.log(`[continuation] injected ${se.length} desktop messages as reference`)}}if(!Vt(o,l)?.title){let P=typeof H?.content=="string"?H.content:Array.isArray(H?.content)?H.content.filter(W=>W.type==="text").map(W=>W.text??"").join(""):"";if(P.trim()){let W=null,V=this.resolveClientForPurpose("smallModel");V&&(W=await gm(P,{transport:V.transport,apiKey:V.apiKey,model:V.model})),W||(W=P.trim().slice(0,20)+(P.trim().length>20?"\u2026":"")),await Ue(o,{title:W,projectId:d},l).catch(()=>{}),this.sendNotification("session.info",{sessionId:o,title:W,projectId:d}),this.log(`[title-gen] generated title for session ${o}: "${W}"`)}}for await(let P of b.run({turnId:r,sessionId:o,messages:st,tools:Ee,systemPrompt:J,config:h},f.signal)){let W=new Date().toISOString();if(qi({event:P,turnId:r,now:W,host:this})){P.type==="tool_call"&&this.sessionState?.recordToolCall();continue}switch(P.type){case"start":break;case"end":{let V=ST(P.content,E);if(this.sendNotification("turn.end",{turnId:P.turnId,content:V,usage:P.usage,model:P.model,provider:P.provider,item:{id:`${r}-end`,type:"message",role:"assistant",text:V,createdAt:W}}),P.usage&&this.sessionState){this.sessionState.addUsage(P.usage,P.model??this.currentModel);let it=this.sessionState.createSnapshot();this.sendNotification("turn.usage_update",{turnId:P.turnId,usage:P.usage,model:P.model??this.currentModel,sessionCostUSD:it.totalInputTokens*3e-6+it.totalOutputTokens*15e-6})}V&&(this.lastAssistantMessageForExtract=V,Ic(o,{role:"assistant",content:V},l,r).catch(()=>{}));break}case"error":if(this.sendNotification("turn.error",{turnId:P.turnId,error:{message:P.error,code:P.code}}),P.usage&&this.sessionState){this.sessionState.addUsage(P.usage,this.currentModel);let V=this.sessionState.createSnapshot();this.sendNotification("turn.usage_update",{turnId:P.turnId,usage:P.usage,model:this.currentModel,sessionCostUSD:V.totalInputTokens*3e-6+V.totalOutputTokens*15e-6})}break;case"skill_instruction":this.sendNotification("turn.skill_instruction",{turnId:P.turnId,instruction:P.instruction}),Sh({instruction:P.instruction,eventTurnId:P.turnId,projectRoot:l,host:this});break}}if(this.log(`turn ${r} completed`),this.sessionState?.recordTurnCompleted(),this.sessionState){mm(o,this.sessionState.createSnapshot(),{model:this.currentModel,cwd:l,projectId:d,messageCount:s.length},l).catch(()=>{});let P=this.sessionState.createSnapshot();this.sendNotification("session.info",{sessionId:o,model:this.currentModel||void 0,cwd:l,turnCount:P.turnCount,projectId:d});let W=this.resolveClientForPurpose("smallModel");if(W&&fm(o,{sessionId:o,projectId:d??"",createdAt:"",lastActiveAt:"",turnCount:P.turnCount,messageCount:s.length},s,{transport:W.transport,apiKey:W.apiKey,model:W.model},l),lT({turnId:r,messages:s,client:this.resolveClientForPurpose("textGeneration"),sendNotification:(V,it)=>this.sendNotification(V,it)}),this.petRuntime.awardXp("turn.end"),this.petRuntime.reactAfterTurn(s),a?.sessionType==="group"&&this.sessionState){let V=this.sessionState.createSnapshot(),it=Vt(o,l);it&&IR({...it,turnCount:V.turnCount},l).then(En=>{En.split&&this.sendNotification("session-update",{sessionId:En.activeSessionId,projectId:d??"",title:"",type:"group"})}).catch(()=>{})}}}catch(h){if(f.signal.aborted)this.sendNotification("turn.error",{turnId:r,error:{message:"Turn aborted",code:"ABORTED"}});else{let b=h instanceof Error?h.message:String(h);this.sendNotification("turn.error",{turnId:r,error:{message:b,code:"INTERNAL_ERROR"}})}}finally{ep(this,m)}}function Xe(t){return ra(t)}function vt(t){return ra(t)}function Wt(t){return ra(t)}function yr(t){return ra(t)}function ra(t){return t.multiAgentHandlerHost??t}function CT(t){return new Map([["initialize",e=>_b.call(t,e)],["agent.ping",e=>Db.call(t,e)],["agent.health",e=>Nb.call(t,e)],["agent.metrics",e=>Lb.call(t,e)],["agent.cancel",e=>Ob.call(t,e)],["thread.turn",e=>xT.call(t,e)],["memory.dream",e=>sn.call(t,e)],["agent.abort",e=>wT.call(t,e)],["assistants.list",e=>Hl.call(t,e)],["assistants.resolve",e=>Bl.call(t,e)],["assistants.cloneBuiltin",e=>ql.call(t,e)],["assistants.upsert",e=>Wl.call(t,e)],["assistants.create",e=>Gl.call(t,e)],["assistants.update",e=>zl.call(t,e)],["assistants.delete",e=>Vl.call(t,e)],["assistants.setState",e=>Kl.call(t,e)],["tool.approval.response",e=>AT.call(t,e)],["thread.user_response",e=>PT.call(t,e)],["thread.list",e=>DR.call(t,e)],["session.resume",e=>qR.call(t,e)],["thread.create",e=>_R.call(t,e)],["session.getInfo",e=>WR.call(t,e)],["session.create",e=>NR.call(t,e)],["session.resolve",e=>LR.call(t,e)],["session.list",e=>OR.call(t,e)],["session.get",e=>jR.call(t,e)],["session.getMessages",e=>$R.call(t,e)],["session.update",e=>UR.call(t,e)],["session.delete",e=>FR.call(t,e)],["session.deleteAll",e=>HR.call(t,e)],["session.archive",e=>BR.call(t,e)],["memory.list",e=>lk.call(t,e)],["memory.atlas",e=>dk.call(t,e)],["memory.activity",e=>uk.call(t,e)],["memory.observe",e=>pk.call(t,e)],["memory.propose",e=>mk.call(t,e)],["memory.consolidate",e=>gk.call(t,e)],["memory.read",e=>fk.call(t,e)],["memory.write",e=>hk.call(t,e)],["memory.search",e=>yk.call(t,e)],["memory.delete",e=>vk.call(t,e)],["memory.update",e=>bk.call(t,e)],["tools.list",e=>kb.call(t,e)],["media.listModels",e=>Qb.call(t,e)],["media.cancel",e=>Zb.call(t,e)],["media.status",e=>ek.call(t,e)],["media.stt",e=>tk.call(t,e)],["settings.listProviders",e=>ZR.call(t,e)],["settings.addKey",e=>eS.call(t,e)],["settings.removeKey",e=>tS.call(t,e)],["settings.toggleKey",e=>rS.call(t,e)],["settings.toggleModel",e=>nS.call(t,e)],["settings.listModels",e=>oS.call(t,e)],["settings.setActiveModel",e=>sS.call(t,e)],["settings.getActiveModel",e=>iS.call(t,e)],["settings.getOverview",e=>aS.call(t,e)],["settings.refreshModels",e=>cS.call(t,e)],["settings.validateKey",e=>lS.call(t,e)],["assistants.list",e=>Hl.call(t,e)],["assistants.resolve",e=>Bl.call(t,e)],["assistants.cloneBuiltin",e=>ql.call(t,e)],["assistants.upsert",e=>Wl.call(t,e)],["assistants.create",e=>Gl.call(t,e)],["assistants.update",e=>zl.call(t,e)],["assistants.delete",e=>Vl.call(t,e)],["assistants.setState",e=>Kl.call(t,e)],["provider.list",e=>Rb.call(t,e)],["config.get",e=>Sb.call(t,e)],["config.update",e=>wb.call(t,e)],["config.tunables",e=>Pb.call(t,e)],["config.updateTunable",e=>xb.call(t,e)],["community.getConsent",e=>Mh.call(t,e)],["community.setConsent",e=>_h.call(t,e)],["community.matchRegistry",e=>Nh.call(t,e)],["community.listShared",e=>Dh.call(t,e)],["community.withdrawShared",e=>Bh.call(t,e)],["community.withdrawAllShared",e=>qh.call(t,e)],["community.listNotices",e=>Wh.call(t,e)],["community.markNoticeRead",e=>Gh.call(t,e)],["community.listPublishAudit",e=>Hh.call(t,e)],["community.resolveInstall",e=>Lh.call(t,e)],["community.installResource",e=>Oh.call(t,e)],["community.publishSkill",e=>jh.call(t,e)],["community.publishPet",e=>$h.call(t,e)],["community.recordSignal",e=>Uh.call(t,e)],["community.recordTelemetry",e=>Fh.call(t,e)],["todos.list",e=>Cb.call(t,e)],["tasks.list",e=>Ib.call(t,e)],["tasks.cancel",e=>Eb.call(t,e)],["agents.scan",e=>df.call(Xe(t),e)],["agents.list",e=>uf.call(Xe(t),e)],["agents.prompt",e=>Tf.call(Xe(t),e)],["agents.config",e=>pf.call(Xe(t),e)],["agents.setConfig",e=>mf.call(Xe(t),e)],["agents.getConfig",e=>gf.call(Xe(t),e)],["agents.removeConfig",e=>ff.call(Xe(t),e)],["agents.setGateway",e=>hf.call(Xe(t),e)],["agents.getGateway",e=>yf.call(Xe(t),e)],["agents.processes",e=>bf.call(Xe(t),e)],["agents.kill",e=>kf.call(Xe(t),e)],["agents.listConfigured",e=>vf.call(Xe(t),e)],["agents.getLog",e=>Rf.call(Xe(t),e)],["agents.testConnection",e=>Sf.call(Xe(t),e)],["solo.start",e=>MS.call(yr(t),e)],["solo.status",e=>_S.call(yr(t),e)],["solo.cancel",e=>DS.call(yr(t),e)],["solo.select",e=>NS.call(yr(t),e)],["solo.list",e=>LS.call(yr(t),e)],["solo.delete",e=>OS.call(yr(t),e)],["solo.message",e=>jS.call(yr(t),e)],["solo.evaluate",e=>$S.call(yr(t),e)],["product.plan",e=>Hk.call(vt(t),e)],["product.confirm",e=>Bk.call(vt(t),e)],["product.message",e=>qk.call(vt(t),e)],["product.create",e=>Wk.call(vt(t),e)],["product.resume",e=>Gk.call(vt(t),e)],["product.pause",e=>zk.call(vt(t),e)],["product.checkpoint",e=>Kk.call(vt(t),e)],["product.status",e=>Vk.call(vt(t),e)],["product.list",e=>Xk.call(vt(t),e)],["product.delete",e=>Yk.call(vt(t),e)],["product.cancel",e=>Jk.call(vt(t),e)],["product.rollback",e=>Qk.call(vt(t),e)],["workflow.create",e=>sR.call(Wt(t),e)],["workflow.get",e=>iR.call(Wt(t),e)],["workflow.describe",e=>aR.call(Wt(t),e)],["workflow.patch",e=>cR.call(Wt(t),e)],["workflow.run",e=>lR.call(Wt(t),e)],["workflow.setActive",e=>dR.call(Wt(t),e)],["workflow.list",e=>uR.call(Wt(t),e)],["workflow.delete",e=>pR.call(Wt(t),e)],["workflow.onImMessage",e=>mR.call(Wt(t),e)],["workflow.onWebhook",e=>gR.call(Wt(t),e)],["project.create",e=>yR.call(t,e)],["project.list",e=>vR.call(t,e)],["project.delete",e=>bR.call(t,e)],["project.purgeAll",e=>kR.call(t,e)],["project.rename",e=>RR.call(t,e)],["project.archive",e=>SR.call(t,e)],["project.unarchive",e=>TR.call(t,e)],["project.update",e=>AR.call(t,e)],["project.archiveByGroup",e=>wR.call(t,e)],["session.switchProject",e=>GR.call(t,e)],["session.focus",e=>KR.call(t,e)],["session.moveToProject",e=>VR.call(t,e)],["session.getState",e=>zR.call(t,e)],["files.list",e=>Ub.call(t,e)],["files.create",e=>Fb.call(t,e)],["files.rename",e=>Hb.call(t,e)],["files.delete",e=>Bb.call(t,e)],["files.gitStatus",e=>qb.call(t,e)],["instructions.list",e=>Wb.call(t,e)],["instructions.read",e=>Gb.call(t,e)],["instructions.write",e=>zb.call(t,e)],["instructions.delete",e=>Kb.call(t,e)],["plans.list",e=>Vb.call(t,e)],["skills.list",e=>hS.call(t,e)],["skills.activate",e=>yS.call(t,e)],["skills.deactivate",e=>vS.call(t,e)],["skills.delete",e=>bS.call(t,e)],["skills.promote",e=>kS.call(t,e)],["skills.stats",e=>RS.call(t,e)],["skills.pin",e=>SS.call(t,e)],["skills.unpin",e=>TS.call(t,e)],["skills.curator",e=>wS.call(t,e)],["skills.lifecycle",e=>AS.call(t,e)],["pet.hatch",e=>Ak.call(t,e)],["pet.interact",e=>Pk.call(t,e)],["pet.status",e=>xk.call(t,e)],["pet.forge",e=>Ck.call(t,e)],["pet.confirm_response",e=>kk.call(t,e)]])}import{randomUUID as IT}from"node:crypto";import*as sp from"node:path";G();async function ET(t,e){t.log(`[acp] x/dream: session=${e.sessionId}`);let r=t.resolveClientForPurpose("textGeneration");if(!r)return{ok:!1,summary:"No LLM transport configured for dream"};let n=X(),o={jsonrpc:"2.0",id:`acp-dream-${IT().slice(0,8)}`,method:"memory.dream",params:{turnId:`dream-${IT().slice(0,8)}`,sessionId:e.sessionId||t.currentSessionId,config:{memoryRoot:e.config?.memoryRoot||t.resolveMemoryRoot?.()||sp.join(n,"memory"),transcriptDir:e.config?.transcriptDir||t.resolveTranscriptDir?.()||sp.join(n,"agent-logs"),model:r.model,apiKey:r.apiKey,...e.config}}};return await sn.call(t,o),{ok:!0,summary:"Dream consolidation triggered"}}async function MT(t,e){t.log("[acp] x/solo.start");let r=Ve.call(t),n=await r.start(e);return r.getStatus(n)}async function _T(t,e){t.log("[acp] x/solo.status");let r=e.soloId;if(!r)return t.soloEvaluator?t.soloEvaluator.listSessions():[];let o=Ve.call(t).getStatus(r);if(!o)throw new Error(`Solo session ${r} not found`);return o}async function DT(t,e){return t.log("[acp] x/solo.select"),{ok:!0,mergedBranch:await Ve.call(t).select(e)}}async function NT(t,e){t.log("[acp] x/solo.cancel");let r=Ve.call(t),n=e.soloId;return await r.cancel(n),{ok:!0}}async function LT(t,e){return t.log("[acp] x/solo.subscribe"),{ok:!0,soloId:e.soloId}}async function OT(t,e){t.log("[acp] x/solo.message");let r=Ve.call(t),{soloId:n,agentId:o,content:s,agentIndex:i}=e;return r.message(n,o,s,i)}async function jT(t,e){t.log("[acp] x/solo.evaluate");let r=Ve.call(t),{soloId:n,evaluatorAgentId:o,evaluatorIndex:s}=e;return r.triggerEvaluation(n,o,s)}async function $T(t){return t.log("[acp] x/agents.list"),ul()}async function UT(t,e){return t.log("[acp] x/product.create"),{productId:await ke.call(t).create(e)}}async function FT(t,e){return t.log("[acp] x/product.plan"),Fr.call(t).plan(e)}async function HT(t,e){t.log("[acp] x/product.confirm");let r=Fr.call(t),n=e,o=await r.confirm(n),s=r.getSession(n.productId);return s&&await ke.call(t).create({name:s.plan?.name??s.goal.slice(0,50),cwd:s.cwd,instances:n.instances,tasks:n.tasks,budget:n.budget}),o}async function BT(t,e){t.log("[acp] x/product.message");let r=Fr.call(t),n=e;return r.message(n.productId,n.content)}async function qT(t,e){t.log("[acp] x/product.resume");let r=ke.call(t),n=e.productId;return await r.resume(n,t.getActiveProjectRoot()),{ok:!0}}async function WT(t,e){t.log("[acp] x/product.status");let r=e.productId;if(!t.productOrchestrator)return r?null:[];if(!r)return t.productOrchestrator.list(t.getActiveProjectRoot());let n=t.productOrchestrator.getStatus(r);if(!n)throw new Error(`Product session ${r} not found`);return n}async function GT(t,e){t.log("[acp] x/product.pause");let r=ke.call(t),n=e.productId;return await r.pause(n),{ok:!0}}async function zT(t,e){t.log("[acp] x/product.cancel");let r=ke.call(t),n=e.productId;return await r.delete(n),{ok:!0}}async function KT(t,e){t.log("[acp] x/product.rollback");let r=ke.call(t),n=e.productId,o=e.checkpointId??"latest";return await r.rollback(n,o),{ok:!0}}async function VT(t,e){return t.log("[acp] x/product.subscribe"),{ok:!0,productId:e.productId}}async function XT(t,e){let r=e.agentType,n=e.prompt,o=e.maxTurns;if(!n)throw new Error("Missing required param: prompt");if(!r)throw new Error("Missing required param: agentType");let s=Vn(r);if(!s)throw new Error(`Unknown agent type: ${r}`);let i=t.resolveClientForPurpose("textGeneration");if(!i)throw new Error("No LLM provider configured; send a prompt first to configure the model");if(t.log(`[acp] x/team.delegate: agent=${r}, maxTurns=${o??s.maxTurns}`),ht.isTeamBudgetExceeded())return{ok:!1,agentType:r,output:void 0,error:ht.teamBudgetExceededError(),tokensUsed:0};let a={invoke:async()=>({result:"Tool execution not available in delegated mode"})},c={info:u=>t.log(`[delegate:${r}] ${u}`),warn:u=>t.log(`[delegate:${r}] WARN: ${u}`),error:u=>t.log(`[delegate:${r}] ERROR: ${u}`),debug:u=>t.log(`[delegate:${r}] ${u}`)},l=await Jr({promptMessages:[{role:"user",content:n}],tools:[],transport:i.transport,toolInvoker:a,createAgentRunner:on,apiKey:i.apiKey,model:i.model,log:c,forkLabel:`team-delegate-${r}`,maxTurns:o??s.maxTurns,parentSignal:t.activeTurn?.signal,parentDepth:0}),d=l.events.filter(u=>u.type==="end"&&"content"in u).map(u=>u.content??"").join("")||l.events.filter(u=>u.type==="delta"&&"text"in u).map(u=>u.text).join(""),p=l.totalUsage.inputTokens+l.totalUsage.outputTokens;return ht.recordForkTokens(p),{ok:l.ok,agentType:r,output:d||void 0,error:l.error,tokensUsed:p}}import{randomUUID as YT}from"node:crypto";async function JT(t,e,r){let n=e.clientInfo?.name??"unknown";t.log(`[acp] initialize: host=${n}`);let o={extendedEvents:!0,extendedMethods:!0,orchestration:!0,configOptions:[{name:"model",type:"string",description:"LLM model identifier"},{name:"provider",type:"string",description:"LLM provider identifier"},{name:"maxRounds",type:"number",description:"Max tool loop rounds"},{name:"temperature",type:"number",description:"Sampling temperature"}]};return t.ensureDefaultProject(),{protocolVersion:1,agentInfo:{name:"qlogicagent",version:r},agentCapabilities:o}}async function QT(t,e){let r=e.sessionId??YT();return t.log(`[acp] session/new: id=${r}`),t.currentSessionId=r,t.sessionState=new fr(r),t.sessionTaskDomain=void 0,t.memoryPrefetchState=kt(),e.cwd&&typeof e.cwd=="string"&&t.setActiveWorkdir(e.cwd),t.enableIdleDream(),{sessionId:r}}async function ZT(t,e){let r=YT(),n=e.sessionId,o=e.prompt.map(a=>a.type==="text"?a.text:`[${a.type}]`).join("");if(!o.trim())return t.sendNotification("turn.start",{turnId:r,model:t.currentModel||void 0}),t.sendNotification("turn.end",{turnId:r,content:"",item:{id:`${r}-end`,type:"message",role:"assistant",text:"",createdAt:new Date().toISOString()}}),{stopReason:"end_turn"};let s=t.sessionHistory.appendAcpUserMessage(n,o),i=await OU(t,r,n,[...s]);return i.content&&t.sessionHistory.appendAcpAssistantMessage(n,i.content),i}async function OU(t,e,r,n){let o=new AbortController;t.activeTurn=o,t.sendNotification("turn.start",{turnId:e,model:t.currentModel||void 0});try{let s={model:t.currentModel||void 0,provider:t.currentProvider||void 0,apiKey:t.currentApiKey||void 0,baseUrl:t.currentBaseUrl||void 0},i=Xi(n);i.requiresFreshTool&&(s.toolChoice="required");let a=t.resolveAgent(s);if(!a)return t.sendNotification("turn.delta",{turnId:e,text:"Error: No LLM provider configured. Configure via ~/.qlogicagent/settings.json or pass provider/apiKey in session config.",item:{id:`${e}-err`,type:"message",role:"assistant",text:"",createdAt:new Date().toISOString()}}),t.sendNotification("turn.end",{turnId:e,content:"",item:{id:`${e}-end`,type:"message",role:"assistant",text:"",createdAt:new Date().toISOString()}}),t.activeTurn=null,{stopReason:"end_turn"};await t.mcpReady;let c=Yi((t.toolCatalog??tr()).getToolManifest(),i),l=t.getActiveProjectRoot(),d=await ta(l,t.currentHooks??void 0),p=d.length>0?ea(d):void 0,u=Ji(i),m=await Bi({instructionBlock:p,sections:[zi(l),Vi(),Ki(),...u?[u]:[]]}),f,g="end_turn",h="";for await(let b of a.run({turnId:e,sessionId:r,messages:n,tools:c,systemPrompt:m,config:s},o.signal)){let v=new Date().toISOString();if(!qi({event:b,turnId:e,now:v,host:t}))switch(b.type){case"start":break;case"end":b.usage&&(f={inputTokens:b.usage.inputTokens??0,outputTokens:b.usage.outputTokens??0,cacheReadTokens:b.usage.cacheRead,cacheWriteTokens:b.usage.cacheWrite}),h=b.content??"",t.sendNotification("turn.end",{turnId:b.turnId,content:b.content,usage:b.usage,model:b.model,provider:b.provider,item:{id:`${e}-end`,type:"message",role:"assistant",text:b.content,createdAt:v}});break;case"error":g="end_turn",t.sendNotification("turn.error",{turnId:b.turnId,error:{message:b.error,code:b.code}});break}}return t.activeTurn=null,{stopReason:g,usage:f,content:h}}catch(s){t.activeTurn=null;let i=s instanceof Error?s.message:String(s);return t.log(`[acp] runAcpTurn error: ${i}`),t.sendNotification("turn.error",{turnId:e,error:{message:i,code:"INTERNAL_ERROR"}}),{stopReason:"end_turn"}}}async function ew(t,e){t.log(`[acp] session/end: id=${e.sessionId}`),t.sessionHistory.clearAcpSession(e.sessionId),t.currentSessionId===e.sessionId&&(t.cancelIdleDreamTimer(),t.currentHooks&&await t.currentHooks.invoke("session.ended",{sessionId:e.sessionId}).catch(()=>{}),t.currentSessionId="",t.sessionState=null,t.disposeSessionRuntime?.())}async function tw(t,e){let r=e.configId??e.option;t.log(`[acp] session/set_config: ${r}=${JSON.stringify(e.value)}`);let n=typeof e.value=="string"?e.value:"";switch(r){case"model":t.currentModel=n;break;case"provider":t.currentProvider=n;break;case"apiKey":t.currentApiKey=n;break;case"baseUrl":t.currentBaseUrl=n;break}}async function rw(t,e,r){t.log(`[acp] session/set_model: ${r} (note: model is managed by ModelRegistry, this is a hint only)`),r&&(t.currentModel=r)}async function nw(t,e,r){t.log(`[acp] session/set_mode: ${r}`)}function ow(t,e,r=t){return{handleAcpInitialize:n=>JT(t,n,e),handleAcpSessionNew:n=>QT(t,n),handleAcpSessionPrompt:n=>ZT(t,n),handleAcpSessionEnd:n=>ew(t,n),handleAcpSessionSetConfig:n=>tw(t,n),handleAcpSessionSetModel:(n,o)=>rw(t,n,o),handleAcpSessionSetMode:(n,o)=>nw(t,n,o),handleAcpPermissionResponse:(n,o)=>{t.log(`[acp] permission response: ${n} -> ${o}`),t.permissionChecker?.resolveApproval({approvalId:n,decision:o==="allow"?"allow":"deny"})},handleAcpAbort:async n=>{t.log(`[acp] abort: session=${n.sessionId}`),t.activeTurn&&(t.activeTurn.abort(),t.activeTurn=null)},handleAcpDream:n=>ET(r,n),handleAcpAgentsList:()=>$T(r),handleAcpSoloStart:n=>MT(r,n),handleAcpSoloStatus:n=>_T(r,n),handleAcpSoloSelect:n=>DT(r,n),handleAcpSoloCancel:n=>NT(r,n),handleAcpSoloSubscribe:n=>LT(r,n),handleAcpSoloMessage:n=>OT(r,n),handleAcpSoloEvaluate:n=>jT(r,n),handleAcpProductCreate:n=>UT(r,n),handleAcpProductPlan:n=>FT(r,n),handleAcpProductConfirm:n=>HT(r,n),handleAcpProductMessage:n=>BT(r,n),handleAcpProductPause:n=>GT(r,n),handleAcpProductResume:n=>qT(r,n),handleAcpProductCancel:n=>zT(r,n),handleAcpProductRollback:n=>KT(r,n),handleAcpProductStatus:n=>WT(r,n),handleAcpProductSubscribe:n=>VT(r,n),handleAcpTeamDelegate:n=>XT(r,n)}}var na=class{currentHooks=null;mcpManager=null;mcpReady=Promise.resolve();pluginLoader=null;permissionChecker=null;permissionUnregister=null;fileWatcher=null;memoryProvider=null;memoryDreamProvider=null;memoryUserId="";getPluginSkills(){return this.pluginLoader?.getPluginSkills()??[]}applyBootstrap(e){this.currentHooks=e.hooks,this.memoryProvider=e.memoryHandlerProvider,this.memoryDreamProvider=e.memoryDreamProvider,this.memoryUserId=e.memoryUserId,this.permissionChecker=e.permissionChecker,this.permissionUnregister=e.permissionUnregister}resetAfterSessionDispose(){this.currentHooks=null,this.memoryProvider=null,this.memoryDreamProvider=null}stopFileWatcher(){this.fileWatcher&&(this.fileWatcher.stop(),this.fileWatcher=null)}async disconnectMcp(){if(!this.mcpManager)return;let e=this.mcpManager;this.mcpManager=null,await e.disconnectAll()}unregisterPermissions(){this.permissionUnregister&&(this.permissionUnregister(),this.permissionUnregister=null)}resetMemoryProviders(){this.memoryProvider=null,this.memoryDreamProvider=null}};G();import{join as iw}from"node:path";import{chmod as $U}from"node:fs/promises";var aw="agent-configs.json";function sw(){return iw(B(),aw)}function UU(t){return iw(De(t),aw)}function FU(){return{agents:{}}}var oa=class{data=FU();cwd;constructor(e){this.cwd=e}async load(){let e=await Zt(sw()),r=this.cwd?await Zt(UU(this.cwd)):void 0,n={gatewayUrl:e?.gatewayUrl,agents:{...e?.agents},customAgents:{...e?.customAgents}};if(r){r.gatewayUrl&&(n.gatewayUrl=r.gatewayUrl);for(let[o,s]of Object.entries(r.agents??{}))n.agents[o]={...n.agents[o],...s};for(let[o,s]of Object.entries(r.customAgents??{}))n.customAgents??={},n.customAgents[o]=s}this.data=n}getData(){return this.data}getAgentConfig(e){return this.data.agents[e]??null}async setAgentConfig(e,r){this.data.agents[e]={...this.data.agents[e],...r},await this.save()}async removeAgentConfig(e){delete this.data.agents[e],await this.save()}getGatewayUrl(){return this.data.gatewayUrl}async setGatewayUrl(e){this.data.gatewayUrl=e,await this.save()}registerCustomAgent(e){this.data.customAgents??={},this.data.customAgents[e.id]=e}unregisterCustomAgent(e){this.data.customAgents&&delete this.data.customAgents[e]}getCustomAgents(){return{...this.data.customAgents}}async save(){let e=sw();await mr(e,this.data);try{await $U(e,384)}catch{}}};var sa=class{constructor(e){this.deps=e}deps;store=null;get currentStore(){return this.store}async ensureStore(){return this.store||(this.store=new oa(this.deps.getActiveProjectRoot()),await this.store.load(),this.deps.acpDetector.setConfigStore(this.store.getData())),this.store}};function cw(t){return new sa(t)}var ia=class{soloEvaluator=null;productOrchestrator=null;productPlanner=null;soloProcessManager=null;productProcessManager=null};function lw(t){let e=t.acpDetector??new Ss,r=new ia,o=(t.createAgentConfigRuntime??cw)({acpDetector:e,getActiveProjectRoot:t.getActiveProjectRoot});return{acpDetector:e,get agentConfigStore(){return o.currentStore},ensureAgentConfigStore:()=>o.ensureStore(),get soloEvaluator(){return r.soloEvaluator},set soloEvaluator(s){r.soloEvaluator=s},get productOrchestrator(){return r.productOrchestrator},set productOrchestrator(s){r.productOrchestrator=s},get productPlanner(){return r.productPlanner},set productPlanner(s){r.productPlanner=s},get soloProcessManager(){return r.soloProcessManager},set soloProcessManager(s){r.soloProcessManager=s},get productProcessManager(){return r.productProcessManager},set productProcessManager(s){r.productProcessManager=s},getActiveProjectRoot:t.getActiveProjectRoot,emitAgentStatus:t.emitAgentStatus,handleMcpToolCall:t.handleMcpToolCall,log:t.log,sendNotification:t.sendNotification,sendResponse:t.sendResponse}}var aa=class{acpSessionHistories=new Map;resumedSessionHistories=new Map;appendAcpUserMessage(e,r){let n=this.getOrCreateAcpHistory(e);return n.push({role:"user",content:r}),[...n]}appendAcpAssistantMessage(e,r){r&&this.getOrCreateAcpHistory(e).push({role:"assistant",content:r})}clearAcpSession(e){this.acpSessionHistories.delete(e)}saveResumedSession(e,r){if(r.length===0){this.resumedSessionHistories.delete(e);return}this.resumedSessionHistories.set(e,[...r])}withResumedHistory(e,r){let n=this.resumedSessionHistories.get(e);if(!n||n.length===0)return r;let o=HU(r,n)?r.slice(n.length):r;return[qU(n),...n,...o]}getOrCreateAcpHistory(e){let r=this.acpSessionHistories.get(e);return r||(r=[],this.acpSessionHistories.set(e,r)),r}};function HU(t,e){if(t.length<e.length)return!1;for(let r=0;r<e.length;r++)if(!BU(t[r],e[r]))return!1;return!0}function BU(t,e){return t.role===e.role&&JSON.stringify(t.content)===JSON.stringify(e.content)}function qU(t){let e=t.filter(n=>n.role==="user"&&typeof n.content=="string").map(n=>String(n.content).replace(/\s+/g," ").trim()).filter(Boolean).slice(-8);return{role:"system",content:["Resumed session context follows. It is authoritative prior conversation for this same session.","If the current user asks about information already present there, answer directly from it before using memory or tools.",e.length>0?` Prior user statements recovered from this session:
635
635
  ${e.map(n=>`- ${n.slice(0,500)}`).join(`
636
- `)}`:""].join(" ")}}import{randomUUID as qU}from"node:crypto";var WU={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},ca=class{constructor(e){this.options=e;this.dreamState=e.dreamState??ht.dream,this.now=e.now??(()=>Date.now()),this.randomId=e.randomId??(()=>qU().slice(0,8)),this.timers=e.timers??WU}options;dreamState;now;randomId;timers;idleTimer=null;applyEnvOverrides(e){let r=Number(e.QLOGICAGENT_IDLE_DREAM_MS);r>0&&(this.dreamState.idleMinutes=r/6e4);let n=Number(e.QLOGICAGENT_DREAM_COOLDOWN_MS);n>=0&&(this.dreamState.cooldownMs=n)}enable(e){this.dreamState.enabled=!0,e&&e>0&&(this.dreamState.idleMinutes=e),this.resetTimer()}handleTurnNotification(e){e==="turn.end"&&this.resetTimer(),e==="turn.start"&&this.cancelTimer()}cancelTimer(){this.idleTimer&&(this.timers.clearTimeout(this.idleTimer),this.idleTimer=null)}resetTimer(){this.cancelTimer(),this.dreamState.enabled&&this.options.getCurrentSessionId()&&(this.idleTimer=this.timers.setTimeout(()=>{this.triggerIdleDream()},this.dreamState.idleMinutes*6e4),this.idleTimer.unref?.())}async triggerIdleDream(){if(this.now()-this.dreamState.lastDreamAt<this.dreamState.cooldownMs){this.options.log("[dream:idle] Skipped - cooldown not elapsed");return}let e=this.options.resolveDreamClient();if(!e){this.options.log("[dream:idle] Skipped - no LLM transport configured");return}if(this.options.getActiveTurn()){this.options.log("[dream:idle] Skipped - turn in progress");return}this.options.log("[dream:idle] Triggering idle dream consolidation"),this.dreamState.lastDreamAt=this.now(),this.options.sendNotification("system.activity",{category:"dream",level:"info",title:"\u7A7A\u95F2\u68A6\u5883\u6574\u7406\u89E6\u53D1",detail:`\u7A7A\u95F2 ${this.dreamState.idleMinutes} \u5206\u949F\u540E\u81EA\u52A8\u89E6\u53D1`});let r=this.timers.setTimeout(()=>{let c=this.options.getActiveTurn();c&&(this.options.log("[dream:idle] Aborting - max duration reached"),c.abort())},this.dreamState.maxDurationMs);r.unref?.();let n=this.options.resolveMemoryRoot(),o=this.options.resolveTranscriptDir(),s=this.options.getCurrentSessionId(),i=[];try{i=(await this.options.listRecentSessions()).filter(l=>l.sessionId!==s).map(l=>l.sessionId)}catch{}let a={jsonrpc:"2.0",method:"memory.dream",params:{turnId:`idle-dream-${this.randomId()}`,sessionId:s,config:{memoryRoot:n,transcriptDir:o,dreamSessionIds:i,currentSessionTurnCount:this.options.getCurrentTurnCount(),model:e.model,apiKey:e.apiKey,force:!1}}};try{await this.options.runDream(a)}finally{this.timers.clearTimeout(r)}this.resetTimer()}};Fe();function dw(t,e){let r=t.provider,n=t.model,o=t.apiKey,s=t.baseUrl;if(!r||!o){let a=D().getActiveModel("textGeneration");a&&(r=r??a.provider,n=n??a.model,o=o??a.apiKey,s=s??a.baseUrl,a.keyHandle.release({success:!0}),e?.(`[resolveAgent] from ModelRegistry: ${r}/${n}`))}return!r||!o?null:(n=n??D().getProviderDefaultModel(r)??"",{provider:r,model:n,apiKey:o,baseUrl:s,configKey:`${r}:${n}:${o.slice(0,8)}:${s??""}`})}function uw(t){let r=D().getActiveModel(t.purpose);if(!r)return null;let{provider:n,model:o,apiKey:s,baseUrl:i,keyHandle:a}=r;return a.release({success:!0}),n===t.currentProvider&&t.currentTransport?{transport:t.currentTransport,apiKey:s,model:o}:{transport:ei({provider:n,model:o,apiKey:s,baseUrl:i},t.providerRegistry).transport,apiKey:s,model:o}}import{randomUUID as GU}from"node:crypto";async function pw(t){let e=t.toolCatalog.findTool(t.toolName);if(!e?.execute)return`Error: Unknown tool "${t.toolName}"`;let r=`mcp_${t.memberId}_${GU().slice(0,8)}`;try{return(await e.execute(r,t.args)).content.map(o=>o.text??"").join(`
637
- `)||"OK"}catch(n){return`Error: ${n instanceof Error?n.message:String(n)}`}}var zU={starting:"spawning",ready:"available",running:"running",completed:"available",failed:"failed",killed:"unavailable"};function mw(t,e,r){let n={agentId:t,status:zU[e]??"unavailable"};return(r?.missedBeats!==void 0||r?.lastActivityAt!==void 0)&&(n.health={missedBeats:r.missedBeats??0,lastActiveAt:r.lastActivityAt?new Date(r.lastActivityAt).toISOString():new Date().toISOString()}),r?.usage&&(n.usage=r.usage),n}function gw(t){return{get activeTurn(){return t.getActiveTurn()},set activeTurn(e){t.setActiveTurn(e??null)},get currentTransport(){return t.getCurrentTransport()},get currentApiKey(){return t.getCurrentApiKey()},get currentModel(){return t.getCurrentModel()},get currentHooks(){return t.getCurrentHooks()},get memoryProvider(){return t.getMemoryProvider()},get memoryUserId(){return t.getMemoryUserId()},get toolCatalog(){return t.getToolCatalog()},get verbose(){return t.getVerbose()},log(e){t.log(e)},resolveMemoryRoot(){return t.resolveMemoryRoot()},resolveTranscriptDir(){return t.resolveTranscriptDir()},resolveAgent(e){return t.resolveAgent(e)},sendNotification(e,r){t.sendNotification(e,r)},sendResponse(e,r,n){t.sendResponse(e,r,n)}}}G();import*as Tn from"node:fs";import*as fw from"node:path";function hw(t){let e=ne();if(e)e.workspaceDir&&t.pathService.setActiveWorkdir(e.workspaceDir);else{let n=fw.join(X(),"workspaces","default");Tn.existsSync(n)||Tn.mkdirSync(n,{recursive:!0});let o=Qf(n);_i(n),t.pathService.setActiveWorkdir(n),t.sendNotification("project.created",{id:o.id,name:o.name,workspaceDir:o.workspaceDir,type:o.type})}KU();let r=t.projectMemoryStoreFactory.create(t.pathService.getActiveProjectRoot());return r.ensureInitialized(),r}function KU(){let e=K().find(r=>r.type==="default"&&r.status==="active");e&&(Tn.existsSync(e.workspaceDir)||Tn.mkdirSync(e.workspaceDir,{recursive:!0}))}var la=class{constructor(e){this.deps=e}deps;pendingConfirms=new Map;requestConfirm(e,r,n,o=3e4){let s=`confirm_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return this.deps.sendNotification("pet.confirm",{confirmId:s,toolName:e,description:r,risk:n,timeoutMs:o}),new Promise(i=>{let a=setTimeout(()=>{this.pendingConfirms.delete(s),i(!1)},o+2e3);this.pendingConfirms.set(s,c=>{clearTimeout(a),i(c)})})}handleResponse({confirmId:e,approved:r}){this.deps.getPermissionResolver()?.resolveApproval({approvalId:e,decision:r?"allow":"deny"});let n=this.pendingConfirms.get(e);n&&(this.pendingConfirms.delete(e),n(!!r))}};function yw(t){let{dreamHost:e,multiAgentHost:r}=t;return{get activeTurn(){return e.activeTurn},set activeTurn(n){e.activeTurn=n??null},get currentTransport(){return e.currentTransport},get currentApiKey(){return e.currentApiKey},get currentModel(){return e.currentModel},get currentHooks(){return e.currentHooks},get memoryProvider(){return e.memoryProvider},get memoryUserId(){return e.memoryUserId},get toolCatalog(){return e.toolCatalog},get verbose(){return e.verbose},log:t.log,resolveMemoryRoot:()=>e.resolveMemoryRoot?.()??t.getActiveProjectRoot(),resolveTranscriptDir:()=>e.resolveTranscriptDir?.()??t.getActiveProjectRoot(),resolveAgent:t.resolveAgent,sendNotification:t.sendNotification,sendResponse:t.sendResponse,get acpDetector(){return r.acpDetector},get agentConfigStore(){return r.agentConfigStore},get soloEvaluator(){return r.soloEvaluator},set soloEvaluator(n){r.soloEvaluator=n},get soloProcessManager(){return r.soloProcessManager},set soloProcessManager(n){r.soloProcessManager=n},get productOrchestrator(){return r.productOrchestrator},set productOrchestrator(n){r.productOrchestrator=n},get productPlanner(){return r.productPlanner},set productPlanner(n){r.productPlanner=n},get productProcessManager(){return r.productProcessManager},set productProcessManager(n){r.productProcessManager=n},get currentSessionId(){return t.getCurrentSessionId()},getActiveProjectRoot:t.getActiveProjectRoot,emitAgentStatus:t.emitAgentStatus,handleMcpToolCall:t.handleMcpToolCall,resolveClientForPurpose:t.resolveClientForPurpose}}import{readFile as ip,readdir as vw,unlink as VU,stat as XU,mkdir as YU}from"node:fs/promises";import{existsSync as Dt,readFileSync as bw,mkdirSync as kw,writeFileSync as JU}from"node:fs";import{join as rt}from"node:path";var ge=12288,ap=200,da=8192,QU="memory",vr="INDEX.md";function cp(t){return rt(I().getProjectAgentDir(t),QU)}var ZU=[/ignore\s+(previous|all|above|prior)\s+instructions/i,/you\s+are\s+now\s+/i,/do\s+not\s+tell\s+the\s+user/i,/system\s+prompt\s+override/i];function ua(t){return!ZU.some(e=>e.test(t))}var eF=/^[a-z0-9][a-z0-9\-_.]*\.md$/i;function pa(t){return!(!eF.test(t)||t===vr||t.includes("..")||t.includes("/")||t.includes("\\"))}function tF(t){return t.trim().match(/^([A-Za-z][A-Za-z0-9_-]{2,})\s*:/)?.[1]??null}function rF(t,e){let r=t.split(`
638
- `),n=[],o=!1;for(let s=0;s<r.length;s++){let i=r[s];if(nF(i)&&i.includes(e)){for(o=!0;s+1<r.length&&Rw(r[s+1]);)s++;continue}n.push(i)}return o?n.join(`
639
- `):null}function nF(t){return t.trim()!==""&&!t.startsWith("#")&&!t.startsWith("<!--")&&!Rw(t)}function Rw(t){return t.startsWith(" ")||t.startsWith(" ")}var ma=class{root;indexCache=null;constructor(e){this.root=cp(e)}getRootPath(){return this.root}ensureInitialized(){Dt(this.root)||kw(this.root,{recursive:!0});let e=rt(this.root,vr);if(!Dt(e)){let r=["# Memory Index","","<!-- Agent-managed memory. Lines here are always visible in system prompt.>","<!-- Use memory tool to add notes, or create topic files for longer content.>","","## User Profile","","## Notes",""].join(`
640
- `);oF(e,r)}}getIndexForPrompt(){let e=rt(this.root,vr);if(!Dt(e))return"";let r;try{r=bw(e,"utf-8")}catch{return""}this.indexCache=r;let n=r.split(`
636
+ `)}`:""].join(" ")}}import{randomUUID as WU}from"node:crypto";var GU={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},ca=class{constructor(e){this.options=e;this.dreamState=e.dreamState??ht.dream,this.now=e.now??(()=>Date.now()),this.randomId=e.randomId??(()=>WU().slice(0,8)),this.timers=e.timers??GU}options;dreamState;now;randomId;timers;idleTimer=null;applyEnvOverrides(e){let r=Number(e.QLOGICAGENT_IDLE_DREAM_MS);r>0&&(this.dreamState.idleMinutes=r/6e4);let n=Number(e.QLOGICAGENT_DREAM_COOLDOWN_MS);n>=0&&(this.dreamState.cooldownMs=n)}enable(e){this.dreamState.enabled=!0,e&&e>0&&(this.dreamState.idleMinutes=e),this.resetTimer()}handleTurnNotification(e){e==="turn.end"&&this.resetTimer(),e==="turn.start"&&this.cancelTimer()}cancelTimer(){this.idleTimer&&(this.timers.clearTimeout(this.idleTimer),this.idleTimer=null)}resetTimer(){this.cancelTimer(),this.dreamState.enabled&&this.options.getCurrentSessionId()&&(this.idleTimer=this.timers.setTimeout(()=>{this.triggerIdleDream()},this.dreamState.idleMinutes*6e4),this.idleTimer.unref?.())}async triggerIdleDream(){if(this.now()-this.dreamState.lastDreamAt<this.dreamState.cooldownMs){this.options.log("[dream:idle] Skipped - cooldown not elapsed");return}let e=this.options.resolveDreamClient();if(!e){this.options.log("[dream:idle] Skipped - no LLM transport configured");return}if(this.options.getActiveTurn()){this.options.log("[dream:idle] Skipped - turn in progress");return}this.options.log("[dream:idle] Triggering idle dream consolidation"),this.dreamState.lastDreamAt=this.now(),this.options.sendNotification("system.activity",{category:"dream",level:"info",title:"\u7A7A\u95F2\u68A6\u5883\u6574\u7406\u89E6\u53D1",detail:`\u7A7A\u95F2 ${this.dreamState.idleMinutes} \u5206\u949F\u540E\u81EA\u52A8\u89E6\u53D1`});let r=this.timers.setTimeout(()=>{let c=this.options.getActiveTurn();c&&(this.options.log("[dream:idle] Aborting - max duration reached"),c.abort())},this.dreamState.maxDurationMs);r.unref?.();let n=this.options.resolveMemoryRoot(),o=this.options.resolveTranscriptDir(),s=this.options.getCurrentSessionId(),i=[];try{i=(await this.options.listRecentSessions()).filter(l=>l.sessionId!==s).map(l=>l.sessionId)}catch{}let a={jsonrpc:"2.0",method:"memory.dream",params:{turnId:`idle-dream-${this.randomId()}`,sessionId:s,config:{memoryRoot:n,transcriptDir:o,dreamSessionIds:i,currentSessionTurnCount:this.options.getCurrentTurnCount(),model:e.model,apiKey:e.apiKey,force:!1}}};try{await this.options.runDream(a)}finally{this.timers.clearTimeout(r)}this.resetTimer()}};Fe();function dw(t,e){let r=t.provider,n=t.model,o=t.apiKey,s=t.baseUrl;if(!r||!o){let a=D().getActiveModel("textGeneration");a&&(r=r??a.provider,n=n??a.model,o=o??a.apiKey,s=s??a.baseUrl,a.keyHandle.release({success:!0}),e?.(`[resolveAgent] from ModelRegistry: ${r}/${n}`))}return!r||!o?null:(n=n??D().getProviderDefaultModel(r)??"",{provider:r,model:n,apiKey:o,baseUrl:s,configKey:`${r}:${n}:${o.slice(0,8)}:${s??""}`})}function uw(t){let r=D().getActiveModel(t.purpose);if(!r)return null;let{provider:n,model:o,apiKey:s,baseUrl:i,keyHandle:a}=r;return a.release({success:!0}),n===t.currentProvider&&t.currentTransport?{transport:t.currentTransport,apiKey:s,model:o}:{transport:ei({provider:n,model:o,apiKey:s,baseUrl:i},t.providerRegistry).transport,apiKey:s,model:o}}import{randomUUID as zU}from"node:crypto";async function pw(t){let e=t.toolCatalog.findTool(t.toolName);if(!e?.execute)return`Error: Unknown tool "${t.toolName}"`;let r=`mcp_${t.memberId}_${zU().slice(0,8)}`;try{return(await e.execute(r,t.args)).content.map(o=>o.text??"").join(`
637
+ `)||"OK"}catch(n){return`Error: ${n instanceof Error?n.message:String(n)}`}}var KU={starting:"spawning",ready:"available",running:"running",completed:"available",failed:"failed",killed:"unavailable"};function mw(t,e,r){let n={agentId:t,status:KU[e]??"unavailable"};return(r?.missedBeats!==void 0||r?.lastActivityAt!==void 0)&&(n.health={missedBeats:r.missedBeats??0,lastActiveAt:r.lastActivityAt?new Date(r.lastActivityAt).toISOString():new Date().toISOString()}),r?.usage&&(n.usage=r.usage),n}function gw(t){return{get activeTurn(){return t.getActiveTurn()},set activeTurn(e){t.setActiveTurn(e??null)},get currentTransport(){return t.getCurrentTransport()},get currentApiKey(){return t.getCurrentApiKey()},get currentModel(){return t.getCurrentModel()},get currentHooks(){return t.getCurrentHooks()},get memoryProvider(){return t.getMemoryProvider()},get memoryUserId(){return t.getMemoryUserId()},get toolCatalog(){return t.getToolCatalog()},get verbose(){return t.getVerbose()},log(e){t.log(e)},resolveMemoryRoot(){return t.resolveMemoryRoot()},resolveTranscriptDir(){return t.resolveTranscriptDir()},resolveAgent(e){return t.resolveAgent(e)},sendNotification(e,r){t.sendNotification(e,r)},sendResponse(e,r,n){t.sendResponse(e,r,n)}}}G();import*as Tn from"node:fs";import*as fw from"node:path";function hw(t){let e=ne();if(e)e.workspaceDir&&t.pathService.setActiveWorkdir(e.workspaceDir);else{let n=fw.join(X(),"workspaces","default");Tn.existsSync(n)||Tn.mkdirSync(n,{recursive:!0});let o=Qf(n);_i(n),t.pathService.setActiveWorkdir(n),t.sendNotification("project.created",{id:o.id,name:o.name,workspaceDir:o.workspaceDir,type:o.type})}VU();let r=t.projectMemoryStoreFactory.create(t.pathService.getActiveProjectRoot());return r.ensureInitialized(),r}function VU(){let e=K().find(r=>r.type==="default"&&r.status==="active");e&&(Tn.existsSync(e.workspaceDir)||Tn.mkdirSync(e.workspaceDir,{recursive:!0}))}var la=class{constructor(e){this.deps=e}deps;pendingConfirms=new Map;requestConfirm(e,r,n,o=3e4){let s=`confirm_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return this.deps.sendNotification("pet.confirm",{confirmId:s,toolName:e,description:r,risk:n,timeoutMs:o}),new Promise(i=>{let a=setTimeout(()=>{this.pendingConfirms.delete(s),i(!1)},o+2e3);this.pendingConfirms.set(s,c=>{clearTimeout(a),i(c)})})}handleResponse({confirmId:e,approved:r}){this.deps.getPermissionResolver()?.resolveApproval({approvalId:e,decision:r?"allow":"deny"});let n=this.pendingConfirms.get(e);n&&(this.pendingConfirms.delete(e),n(!!r))}};function yw(t){let{dreamHost:e,multiAgentHost:r}=t;return{get activeTurn(){return e.activeTurn},set activeTurn(n){e.activeTurn=n??null},get currentTransport(){return e.currentTransport},get currentApiKey(){return e.currentApiKey},get currentModel(){return e.currentModel},get currentHooks(){return e.currentHooks},get memoryProvider(){return e.memoryProvider},get memoryUserId(){return e.memoryUserId},get toolCatalog(){return e.toolCatalog},get verbose(){return e.verbose},log:t.log,resolveMemoryRoot:()=>e.resolveMemoryRoot?.()??t.getActiveProjectRoot(),resolveTranscriptDir:()=>e.resolveTranscriptDir?.()??t.getActiveProjectRoot(),resolveAgent:t.resolveAgent,sendNotification:t.sendNotification,sendResponse:t.sendResponse,get acpDetector(){return r.acpDetector},get agentConfigStore(){return r.agentConfigStore},get soloEvaluator(){return r.soloEvaluator},set soloEvaluator(n){r.soloEvaluator=n},get soloProcessManager(){return r.soloProcessManager},set soloProcessManager(n){r.soloProcessManager=n},get productOrchestrator(){return r.productOrchestrator},set productOrchestrator(n){r.productOrchestrator=n},get productPlanner(){return r.productPlanner},set productPlanner(n){r.productPlanner=n},get productProcessManager(){return r.productProcessManager},set productProcessManager(n){r.productProcessManager=n},get currentSessionId(){return t.getCurrentSessionId()},getActiveProjectRoot:t.getActiveProjectRoot,emitAgentStatus:t.emitAgentStatus,handleMcpToolCall:t.handleMcpToolCall,resolveClientForPurpose:t.resolveClientForPurpose}}import{readFile as ip,readdir as vw,unlink as XU,stat as YU,mkdir as JU}from"node:fs/promises";import{existsSync as Dt,readFileSync as bw,mkdirSync as kw,writeFileSync as QU}from"node:fs";import{join as rt}from"node:path";var ge=12288,ap=200,da=8192,ZU="memory",vr="INDEX.md";function cp(t){return rt(I().getProjectAgentDir(t),ZU)}var eF=[/ignore\s+(previous|all|above|prior)\s+instructions/i,/you\s+are\s+now\s+/i,/do\s+not\s+tell\s+the\s+user/i,/system\s+prompt\s+override/i];function ua(t){return!eF.some(e=>e.test(t))}var tF=/^[a-z0-9][a-z0-9\-_.]*\.md$/i;function pa(t){return!(!tF.test(t)||t===vr||t.includes("..")||t.includes("/")||t.includes("\\"))}function rF(t){return t.trim().match(/^([A-Za-z][A-Za-z0-9_-]{2,})\s*:/)?.[1]??null}function nF(t,e){let r=t.split(`
638
+ `),n=[],o=!1;for(let s=0;s<r.length;s++){let i=r[s];if(oF(i)&&i.includes(e)){for(o=!0;s+1<r.length&&Rw(r[s+1]);)s++;continue}n.push(i)}return o?n.join(`
639
+ `):null}function oF(t){return t.trim()!==""&&!t.startsWith("#")&&!t.startsWith("<!--")&&!Rw(t)}function Rw(t){return t.startsWith(" ")||t.startsWith(" ")}var ma=class{root;indexCache=null;constructor(e){this.root=cp(e)}getRootPath(){return this.root}ensureInitialized(){Dt(this.root)||kw(this.root,{recursive:!0});let e=rt(this.root,vr);if(!Dt(e)){let r=["# Memory Index","","<!-- Agent-managed memory. Lines here are always visible in system prompt.>","<!-- Use memory tool to add notes, or create topic files for longer content.>","","## User Profile","","## Notes",""].join(`
640
+ `);sF(e,r)}}getIndexForPrompt(){let e=rt(this.root,vr);if(!Dt(e))return"";let r;try{r=bw(e,"utf-8")}catch{return""}this.indexCache=r;let n=r.split(`
641
641
  `);return n.length>ap&&(r=n.slice(0,ap).join(`
642
642
  `)+`
643
643
 
@@ -656,19 +656,19 @@ ${e.map(n=>`- ${n.slice(0,500)}`).join(`
656
656
  `)?p+r+`
657
657
  `:p+`
658
658
  `+r+`
659
- `;return Buffer.byteLength(u,"utf-8")<=ge?u:null}async replaceInIndex(e,r){if(!e.trim())return{ok:!1,message:"old_text cannot be empty."};if(!r.trim())return{ok:!1,message:"new_text cannot be empty. Use 'remove' to delete."};if(!ua(r))return{ok:!1,message:"Content rejected: potential injection detected."};let n=this.getIndexRaw(),o=n.split(e).length-1;if(o===0)return{ok:!1,message:`No match found for: "${e.slice(0,80)}"`};if(o>1)return{ok:!1,message:`Multiple matches (${o}) for: "${e.slice(0,80)}". Be more specific.`};let s=n.replace(e,r);if(Buffer.byteLength(s,"utf-8")>ge)return{ok:!1,message:`Replacement would exceed INDEX.md limit (${Buffer.byteLength(s,"utf-8")}/${ge} bytes).`};await this.writeIndex(s);let i=this.getIndexUsage();return{ok:!0,message:`Replaced in INDEX.md. [${i.chars}/${ge} chars]`,indexUsage:`${i.chars}/${ge}`}}async removeFromIndex(e){if(!e.trim())return{ok:!1,message:"old_text cannot be empty."};let r=this.getIndexRaw(),n=tF(e),o=n?rF(r,n):null;if(o===null){if(!r.includes(e))return{ok:!1,message:`No match found for: "${e.slice(0,80)}"`};o=r.replace(e,"")}o=o.replace(/\n{3,}/g,`
659
+ `;return Buffer.byteLength(u,"utf-8")<=ge?u:null}async replaceInIndex(e,r){if(!e.trim())return{ok:!1,message:"old_text cannot be empty."};if(!r.trim())return{ok:!1,message:"new_text cannot be empty. Use 'remove' to delete."};if(!ua(r))return{ok:!1,message:"Content rejected: potential injection detected."};let n=this.getIndexRaw(),o=n.split(e).length-1;if(o===0)return{ok:!1,message:`No match found for: "${e.slice(0,80)}"`};if(o>1)return{ok:!1,message:`Multiple matches (${o}) for: "${e.slice(0,80)}". Be more specific.`};let s=n.replace(e,r);if(Buffer.byteLength(s,"utf-8")>ge)return{ok:!1,message:`Replacement would exceed INDEX.md limit (${Buffer.byteLength(s,"utf-8")}/${ge} bytes).`};await this.writeIndex(s);let i=this.getIndexUsage();return{ok:!0,message:`Replaced in INDEX.md. [${i.chars}/${ge} chars]`,indexUsage:`${i.chars}/${ge}`}}async removeFromIndex(e){if(!e.trim())return{ok:!1,message:"old_text cannot be empty."};let r=this.getIndexRaw(),n=rF(e),o=n?nF(r,n):null;if(o===null){if(!r.includes(e))return{ok:!1,message:`No match found for: "${e.slice(0,80)}"`};o=r.replace(e,"")}o=o.replace(/\n{3,}/g,`
660
660
 
661
- `),await this.writeIndex(o);let s=this.getIndexUsage();return{ok:!0,message:`Removed from INDEX.md. [${s.chars}/${ge} chars]`,indexUsage:`${s.chars}/${ge}`}}async listFiles(){if(!Dt(this.root))return[];let e=await vw(this.root),r=[];for(let n of e){if(n===vr||!n.endsWith(".md"))continue;let o=rt(this.root,n);try{let s=await XU(o);if(!s.isFile())continue;let a=(await ip(o,"utf-8")).split(`
661
+ `),await this.writeIndex(o);let s=this.getIndexUsage();return{ok:!0,message:`Removed from INDEX.md. [${s.chars}/${ge} chars]`,indexUsage:`${s.chars}/${ge}`}}async listFiles(){if(!Dt(this.root))return[];let e=await vw(this.root),r=[];for(let n of e){if(n===vr||!n.endsWith(".md"))continue;let o=rt(this.root,n);try{let s=await YU(o);if(!s.isFile())continue;let a=(await ip(o,"utf-8")).split(`
662
662
  `).find(c=>c.trim()&&!c.startsWith("#"))?.trim();r.push({name:n,size:s.size,modifiedAt:s.mtime.toISOString(),preview:a?.slice(0,100)})}catch{}}return r.sort((n,o)=>o.modifiedAt.localeCompare(n.modifiedAt))}async createFile(e,r){if(!pa(e))return{ok:!1,message:`Invalid filename: "${e}". Use kebab-case .md files (e.g. "project-notes.md").`};if(!ua(r))return{ok:!1,message:"Content rejected: potential injection detected."};if(r.length>da)return{ok:!1,message:`Content too long (${r.length} chars, max ${da}).`};let n=rt(this.root,e);if(Dt(n))return{ok:!1,message:`File already exists: "${e}". Use write_file to update.`};await this.ensureDir(),await vn(n,r);let o=`- [${e}] \u2014 created ${new Date().toISOString().slice(0,10)}`;return await this.appendIndexEntry(o),{ok:!0,message:`Created "${e}" (${r.length} chars). Entry added to INDEX.md.`,file:e}}async writeFile(e,r){if(!pa(e))return{ok:!1,message:`Invalid filename: "${e}". Use kebab-case .md files.`};if(!ua(r))return{ok:!1,message:"Content rejected: potential injection detected."};if(r.length>da)return this.writeFileSplit(e,r);let n=rt(this.root,e),o=!Dt(n);if(await this.ensureDir(),await vn(n,r),o){let s=`- [${e}] \u2014 created ${new Date().toISOString().slice(0,10)}`;await this.appendIndexEntry(s)}return{ok:!0,message:`${o?"Created":"Updated"} "${e}" (${r.length} chars).`,file:e}}async writeFileSplit(e,r){let n=e.replace(/\.md$/,""),o=r.split(/\n{2,}/),s=[],i="";for(let l of o)i.length+l.length+2>da*.9&&i.length>0?(s.push(i),i=l):i=i?i+`
663
663
 
664
- `+l:l;i&&s.push(i);let a=[];for(let l=0;l<s.length;l++){let d=`${n}-${l+1}.md`,p=rt(this.root,d);await this.ensureDir(),await vn(p,s[l]),a.push(d)}let c=this.getIndexRaw();for(let l of a)if(!c.includes(`[${l}]`)){let d=`- [${l}] \u2014 auto-split ${new Date().toISOString().slice(0,10)}`;await this.appendIndexEntry(d)}return{ok:!0,message:`Auto-split "${e}" into ${s.length} parts (${r.length} chars total): ${a.join(", ")}`,file:a[0]}}async readFile(e){if(!pa(e)&&e!==vr)return{ok:!1,message:`Invalid filename: "${e}".`};let r=rt(this.root,e);try{let n=await ip(r,"utf-8");return{ok:!0,content:n,message:`Read "${e}" (${n.length} chars).`}}catch(n){return n.code==="ENOENT"?{ok:!1,message:`File not found: "${e}".`}:{ok:!1,message:`Error reading "${e}": ${n.message}`}}}async deleteFile(e){if(e===vr)return{ok:!1,message:"Cannot delete INDEX.md. Use 'remove' to clear entries."};if(!pa(e))return{ok:!1,message:`Invalid filename: "${e}".`};let r=rt(this.root,e);if(!Dt(r))return{ok:!1,message:`File not found: "${e}".`};await VU(r);let n=this.getIndexRaw(),o=new RegExp(`^.*\\[${sF(e)}\\].*$\\n?`,"m");if(o.test(n)){let s=n.replace(o,"").replace(/\n{3,}/g,`
664
+ `+l:l;i&&s.push(i);let a=[];for(let l=0;l<s.length;l++){let d=`${n}-${l+1}.md`,p=rt(this.root,d);await this.ensureDir(),await vn(p,s[l]),a.push(d)}let c=this.getIndexRaw();for(let l of a)if(!c.includes(`[${l}]`)){let d=`- [${l}] \u2014 auto-split ${new Date().toISOString().slice(0,10)}`;await this.appendIndexEntry(d)}return{ok:!0,message:`Auto-split "${e}" into ${s.length} parts (${r.length} chars total): ${a.join(", ")}`,file:a[0]}}async readFile(e){if(!pa(e)&&e!==vr)return{ok:!1,message:`Invalid filename: "${e}".`};let r=rt(this.root,e);try{let n=await ip(r,"utf-8");return{ok:!0,content:n,message:`Read "${e}" (${n.length} chars).`}}catch(n){return n.code==="ENOENT"?{ok:!1,message:`File not found: "${e}".`}:{ok:!1,message:`Error reading "${e}": ${n.message}`}}}async deleteFile(e){if(e===vr)return{ok:!1,message:"Cannot delete INDEX.md. Use 'remove' to clear entries."};if(!pa(e))return{ok:!1,message:`Invalid filename: "${e}".`};let r=rt(this.root,e);if(!Dt(r))return{ok:!1,message:`File not found: "${e}".`};await XU(r);let n=this.getIndexRaw(),o=new RegExp(`^.*\\[${iF(e)}\\].*$\\n?`,"m");if(o.test(n)){let s=n.replace(o,"").replace(/\n{3,}/g,`
665
665
 
666
666
  `);await this.writeIndex(s)}return{ok:!0,message:`Deleted "${e}" and removed INDEX.md entry.`,file:e}}async searchLocal(e){if(!Dt(this.root))return[];let r=e.toLowerCase().split(/\s+/).filter(s=>s.length>1);if(r.length===0)return[];let n=await vw(this.root),o=[];for(let s of n){if(!s.endsWith(".md"))continue;let i=rt(this.root,s);try{let a=await ip(i,"utf-8"),c=a.toLowerCase(),l=r.filter(m=>c.includes(m)).length;if(l===0)continue;let d=a.split(`
667
- `),p="",u=0;for(let m of d){let f=m.toLowerCase(),g=r.filter(h=>f.includes(h)).length;g>u&&(u=g,p=m.trim())}o.push({file:s,snippet:p.slice(0,200),score:l/r.length})}catch{}}return o.sort((s,i)=>i.score-s.score).slice(0,10)}async writeIndex(e){await this.ensureDir(),await vn(rt(this.root,vr),e),this.indexCache=e}async ensureDir(){Dt(this.root)||await YU(this.root,{recursive:!0})}async appendIndexEntry(e){let r=this.getIndexRaw();if(r.includes(e))return;let n=r.endsWith(`
667
+ `),p="",u=0;for(let m of d){let f=m.toLowerCase(),g=r.filter(h=>f.includes(h)).length;g>u&&(u=g,p=m.trim())}o.push({file:s,snippet:p.slice(0,200),score:l/r.length})}catch{}}return o.sort((s,i)=>i.score-s.score).slice(0,10)}async writeIndex(e){await this.ensureDir(),await vn(rt(this.root,vr),e),this.indexCache=e}async ensureDir(){Dt(this.root)||await JU(this.root,{recursive:!0})}async appendIndexEntry(e){let r=this.getIndexRaw();if(r.includes(e))return;let n=r.endsWith(`
668
668
  `)?r+e+`
669
669
  `:r+`
670
670
  `+e+`
671
- `;Buffer.byteLength(n,"utf-8")<=ge&&await this.writeIndex(n)}};function oF(t,e){let r=rt(t,"..");Dt(r)||kw(r,{recursive:!0}),JU(t,e,"utf-8")}function sF(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Sw(){return{getRootPath(t){return cp(t)},create(t){return new ma(t)}}}function Tw(t){t.toolBootstrap.getAllBaseTools({log:{info:e=>t.log(e),warn:e=>t.log(`[warn] ${e}`),error:e=>t.log(`[error] ${e}`),debug:e=>{t.verbose&&t.log(`[debug] ${e}`)}},onExecProgress:e=>{t.sendNotification("turn.exec_progress",{output:e.output,elapsedTimeSeconds:e.elapsedTimeSeconds,totalLines:e.totalLines,totalBytes:e.totalBytes})}})}import{join as lp}from"node:path";import{mkdirSync as iF,existsSync as aF,createWriteStream as cF}from"node:fs";import{pipeline as lF}from"node:stream/promises";import{Readable as dF}from"node:stream";var uF=vc,pF=bc,ww={"image/png":".png","image/jpeg":".jpg","image/gif":".gif","image/webp":".webp","image/svg+xml":".svg","image/avif":".avif","video/mp4":".mp4","video/webm":".webm","video/quicktime":".mov","audio/mpeg":".mp3","audio/wav":".wav","audio/ogg":".ogg","audio/aac":".aac","audio/mp4":".m4a","audio/flac":".flac","application/pdf":".pdf","model/gltf-binary":".glb","model/gltf+json":".gltf"},ga=class{projectDir;maxFileSize;timeoutMs;constructor(e){this.projectDir=e?.projectDir??null,this.maxFileSize=e?.maxFileSize??uF,this.timeoutMs=e?.timeoutMs??pF}setProjectDir(e){this.projectDir=e}resolveMediaDir(e){if(!this.projectDir)throw new Error("MediaPersistence requires projectDir \u2014 call setProjectDir() first");if(!e)return lp(this.projectDir,".qlogicagent","media",mF());let r=e.replace(/[^a-zA-Z0-9_-]/g,"_");return r!==e&&r.length>0&&[...e].filter(o=>!/[a-zA-Z0-9_-]/.test(o)).length>e.length/2&&console.warn(`[media-persistence] sessionId heavily sanitized: "${e}" \u2192 "${r}" \u2014 potential collision risk`),lp(this.projectDir,".qlogicagent","sessions",r,"media")}async download(e,r){let n=this.resolveMediaDir(r?.sessionId);if(n.length+60>255)throw new Error(`Media path too long (${n.length} chars) \u2014 would exceed OS limit. Use a shorter project path or session ID.`);aF(n)||iF(n,{recursive:!0});let o=new AbortController,s=setTimeout(()=>o.abort(),this.timeoutMs),i="";try{let a=await fetch(e,{signal:o.signal});if(!a.ok)throw new Error(`Download failed: ${a.status} ${a.statusText}`);let c=parseInt(a.headers.get("content-length")??"0",10);if(c>this.maxFileSize)throw new Error(`File too large: ${c} bytes (max: ${this.maxFileSize})`);let l=a.headers.get("content-type")?.split(";")[0].trim()||"application/octet-stream",d=fF(e,l),p=gF(r?.type??hF(l),d);i=lp(n,p);let u=a.body;if(!u)throw new Error("No response body");let m=cF(i);await lF(dF.fromWeb(u),m);let{size:f}=await import("node:fs/promises").then(g=>g.stat(i));if(f===0)throw await import("node:fs/promises").then(g=>g.unlink(i).catch(()=>{})),new Error("Download produced empty file (connection dropped)");return{remoteUrl:e,localPath:i,bytes:f,mimeType:l}}catch(a){if(i)try{let{unlink:c}=await import("node:fs/promises");await c(i)}catch{}throw a}finally{clearTimeout(s)}}async downloadAll(e,r,n){let o=[];for(let s of e)try{let i=await this.download(s,r);o.push(i)}catch(i){n?.warn(`media-persistence: failed to download ${s}: ${i.message}`)}return o}getMediaDir(e){return this.resolveMediaDir(e)}getProjectDir(){return this.projectDir}};function mF(){let t=new Date;return`${t.getFullYear()}${String(t.getMonth()+1).padStart(2,"0")}${String(t.getDate()).padStart(2,"0")}`}function gF(t,e){let r=new Date,n=`${r.getFullYear()}${String(r.getMonth()+1).padStart(2,"0")}${String(r.getDate()).padStart(2,"0")}_${String(r.getHours()).padStart(2,"0")}${String(r.getMinutes()).padStart(2,"0")}${String(r.getSeconds()).padStart(2,"0")}`,o=Math.random().toString(36).slice(2,6);return`${t}_${n}_${o}${e}`}function fF(t,e){if(ww[e])return ww[e];try{let r=new URL(t).pathname,n=r.lastIndexOf(".");if(n>0){let o=r.slice(n).toLowerCase().split("?")[0];if(o.length<=5)return o}}catch{}return".bin"}function hF(t){return t.startsWith("image/")?"image":t.startsWith("video/")?"video":t.startsWith("audio/")?"audio":t.startsWith("model/")?"3d":"file"}import{resolve as yF}from"node:path";var fa=class extends Nn{constructor(r,n){super();this.mediaPersistence=r;this.toolBootstrap=n}mediaPersistence;toolBootstrap;activeWorkdir=null;getActiveProjectRoot(){if(this.activeWorkdir)return this.activeWorkdir;let r=ne();return r?.workspaceDir?r.workspaceDir:process.cwd()}setActiveWorkdir(r){let n=yF(r);this.activeWorkdir!==n&&(this.activeWorkdir=n,this.toolBootstrap.setWorkdir(n),this.mediaPersistence.setProjectDir(n))}resolveProjectDir(r){if(r)return Ft(r)??void 0}};import{createRequire as DF}from"node:module";import{randomUUID as _o}from"node:crypto";function dp(t){let e=0;for(let n=0;n<t.length;n++)e+=t[n]*t[n];if(e=Math.sqrt(e),e===0)return t;let r=new Float32Array(t.length);for(let n=0;n<t.length;n++)r[n]=t[n]/e;return r}function Aw(t,e){let r=0,n=Math.min(t.length,e.length);for(let o=0;o<n;o++)r+=t[o]*e[o];return r}var vF=`
671
+ `;Buffer.byteLength(n,"utf-8")<=ge&&await this.writeIndex(n)}};function sF(t,e){let r=rt(t,"..");Dt(r)||kw(r,{recursive:!0}),QU(t,e,"utf-8")}function iF(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Sw(){return{getRootPath(t){return cp(t)},create(t){return new ma(t)}}}function Tw(t){t.toolBootstrap.getAllBaseTools({log:{info:e=>t.log(e),warn:e=>t.log(`[warn] ${e}`),error:e=>t.log(`[error] ${e}`),debug:e=>{t.verbose&&t.log(`[debug] ${e}`)}},onExecProgress:e=>{t.sendNotification("turn.exec_progress",{output:e.output,elapsedTimeSeconds:e.elapsedTimeSeconds,totalLines:e.totalLines,totalBytes:e.totalBytes})}})}import{join as lp}from"node:path";import{mkdirSync as aF,existsSync as cF,createWriteStream as lF}from"node:fs";import{pipeline as dF}from"node:stream/promises";import{Readable as uF}from"node:stream";var pF=vc,mF=bc,ww={"image/png":".png","image/jpeg":".jpg","image/gif":".gif","image/webp":".webp","image/svg+xml":".svg","image/avif":".avif","video/mp4":".mp4","video/webm":".webm","video/quicktime":".mov","audio/mpeg":".mp3","audio/wav":".wav","audio/ogg":".ogg","audio/aac":".aac","audio/mp4":".m4a","audio/flac":".flac","application/pdf":".pdf","model/gltf-binary":".glb","model/gltf+json":".gltf"},ga=class{projectDir;maxFileSize;timeoutMs;constructor(e){this.projectDir=e?.projectDir??null,this.maxFileSize=e?.maxFileSize??pF,this.timeoutMs=e?.timeoutMs??mF}setProjectDir(e){this.projectDir=e}resolveMediaDir(e){if(!this.projectDir)throw new Error("MediaPersistence requires projectDir \u2014 call setProjectDir() first");if(!e)return lp(this.projectDir,".qlogicagent","media",gF());let r=e.replace(/[^a-zA-Z0-9_-]/g,"_");return r!==e&&r.length>0&&[...e].filter(o=>!/[a-zA-Z0-9_-]/.test(o)).length>e.length/2&&console.warn(`[media-persistence] sessionId heavily sanitized: "${e}" \u2192 "${r}" \u2014 potential collision risk`),lp(this.projectDir,".qlogicagent","sessions",r,"media")}async download(e,r){let n=this.resolveMediaDir(r?.sessionId);if(n.length+60>255)throw new Error(`Media path too long (${n.length} chars) \u2014 would exceed OS limit. Use a shorter project path or session ID.`);cF(n)||aF(n,{recursive:!0});let o=new AbortController,s=setTimeout(()=>o.abort(),this.timeoutMs),i="";try{let a=await fetch(e,{signal:o.signal});if(!a.ok)throw new Error(`Download failed: ${a.status} ${a.statusText}`);let c=parseInt(a.headers.get("content-length")??"0",10);if(c>this.maxFileSize)throw new Error(`File too large: ${c} bytes (max: ${this.maxFileSize})`);let l=a.headers.get("content-type")?.split(";")[0].trim()||"application/octet-stream",d=hF(e,l),p=fF(r?.type??yF(l),d);i=lp(n,p);let u=a.body;if(!u)throw new Error("No response body");let m=lF(i);await dF(uF.fromWeb(u),m);let{size:f}=await import("node:fs/promises").then(g=>g.stat(i));if(f===0)throw await import("node:fs/promises").then(g=>g.unlink(i).catch(()=>{})),new Error("Download produced empty file (connection dropped)");return{remoteUrl:e,localPath:i,bytes:f,mimeType:l}}catch(a){if(i)try{let{unlink:c}=await import("node:fs/promises");await c(i)}catch{}throw a}finally{clearTimeout(s)}}async downloadAll(e,r,n){let o=[];for(let s of e)try{let i=await this.download(s,r);o.push(i)}catch(i){n?.warn(`media-persistence: failed to download ${s}: ${i.message}`)}return o}getMediaDir(e){return this.resolveMediaDir(e)}getProjectDir(){return this.projectDir}};function gF(){let t=new Date;return`${t.getFullYear()}${String(t.getMonth()+1).padStart(2,"0")}${String(t.getDate()).padStart(2,"0")}`}function fF(t,e){let r=new Date,n=`${r.getFullYear()}${String(r.getMonth()+1).padStart(2,"0")}${String(r.getDate()).padStart(2,"0")}_${String(r.getHours()).padStart(2,"0")}${String(r.getMinutes()).padStart(2,"0")}${String(r.getSeconds()).padStart(2,"0")}`,o=Math.random().toString(36).slice(2,6);return`${t}_${n}_${o}${e}`}function hF(t,e){if(ww[e])return ww[e];try{let r=new URL(t).pathname,n=r.lastIndexOf(".");if(n>0){let o=r.slice(n).toLowerCase().split("?")[0];if(o.length<=5)return o}}catch{}return".bin"}function yF(t){return t.startsWith("image/")?"image":t.startsWith("video/")?"video":t.startsWith("audio/")?"audio":t.startsWith("model/")?"3d":"file"}import{resolve as vF}from"node:path";var fa=class extends Nn{constructor(r,n){super();this.mediaPersistence=r;this.toolBootstrap=n}mediaPersistence;toolBootstrap;activeWorkdir=null;getActiveProjectRoot(){if(this.activeWorkdir)return this.activeWorkdir;let r=ne();return r?.workspaceDir?r.workspaceDir:process.cwd()}setActiveWorkdir(r){let n=vF(r);this.activeWorkdir!==n&&(this.activeWorkdir=n,this.toolBootstrap.setWorkdir(n),this.mediaPersistence.setProjectDir(n))}resolveProjectDir(r){if(r)return Ft(r)??void 0}};import{createRequire as NF}from"node:module";import{randomUUID as _o}from"node:crypto";function dp(t){let e=0;for(let n=0;n<t.length;n++)e+=t[n]*t[n];if(e=Math.sqrt(e),e===0)return t;let r=new Float32Array(t.length);for(let n=0;n<t.length;n++)r[n]=t[n]/e;return r}function Aw(t,e){let r=0,n=Math.min(t.length,e.length);for(let o=0;o<n;o++)r+=t[o]*e[o];return r}var bF=`
672
672
  CREATE TABLE IF NOT EXISTS memories (
673
673
  id TEXT PRIMARY KEY,
674
674
  text TEXT NOT NULL,
@@ -798,7 +798,7 @@ CREATE TRIGGER IF NOT EXISTS memories_au AFTER UPDATE ON memories BEGIN
798
798
  INSERT INTO memories_fts(rowid, id, user_id, text, category, tags)
799
799
  VALUES (new.rowid, new.id, new.user_id, new.text, new.category, new.tags);
800
800
  END;
801
- `;function Pw(t){t.pragma("journal_mode = WAL"),t.pragma("foreign_keys = ON"),t.exec(vF)}function ha(t){let e=pp(t),r=e.embedding instanceof Buffer?e.embedding:null;return{id:te(e.id),text:te(e.text),userId:te(e.user_id),category:te(e.category,"general"),importance:nt(e.importance,.5),confidence:nt(e.confidence,1),source:te(e.source,"agent"),sessionId:te(e.session_id),eventDate:te(e.event_date),tags:ya(e.tags),embedding:r?new Float32Array(r.buffer,r.byteOffset,r.byteLength/4):null,createdAt:nt(e.created_at),updatedAt:nt(e.updated_at),accessCount:nt(e.access_count),lastAccessedAt:nt(e.last_accessed_at),isArchived:!!e.is_archived}}function up(t){let e=pp(t);return{id:te(e.id),memoryId:te(e.memory_id),userId:te(e.user_id),entity:te(e.entity),predicate:te(e.predicate),value:bF(e.value_json),text:te(e.text),category:te(e.category,"general"),importance:nt(e.importance,.5),confidence:nt(e.confidence,.5),source:te(e.source,"agent"),sourcePriority:nt(e.source_priority),status:kF(e.status),validTime:te(e.valid_time),evidenceIds:ya(e.evidence_ids),supersedesClaimId:te(e.supersedes_claim_id),conflictGroupId:te(e.conflict_group_id),createdAt:nt(e.created_at),updatedAt:nt(e.updated_at)}}function xw(t){let e=pp(t);return{id:te(e.id),userId:te(e.user_id),claimAId:te(e.claim_a_id),claimBId:te(e.claim_b_id),reason:te(e.reason),status:RF(e.status),createdAt:nt(e.created_at),updatedAt:nt(e.updated_at)}}function bF(t){if(typeof t!="string"||!t)return{};try{let e=JSON.parse(t);return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{return{}}}function ya(t){if(typeof t!="string"||!t)return[];try{let e=JSON.parse(t);return Array.isArray(e)?e.filter(r=>typeof r=="string"):[]}catch{return[]}}function pp(t){return t&&typeof t=="object"?t:{}}function te(t,e=""){return typeof t=="string"?t:e}function nt(t,e=0){return typeof t=="number"&&Number.isFinite(t)?t:e}function kF(t){return t==="active"||t==="superseded"||t==="conflicted"||t==="archived"||t==="pending_confirmation"?t:"active"}function RF(t){return t==="open"||t==="resolved"||t==="dismissed"?t:"open"}import*as va from"node:fs";import*as Cw from"node:path";function mp(t=I().resolveActiveOwnerUserId(),e=I()){let r=e.getProfileMemoryDir(t);return va.existsSync(r)||va.mkdirSync(r,{recursive:!0}),Cw.join(r,"memories.db")}var ba=class{db;constructor(e){this.db=e,this.initSchema()}initSchema(){Pw(this.db)}insert(e){let r=`mem_${_o().replace(/-/g,"").slice(0,16)}`,n=Date.now(),o=JSON.stringify(e.tags??[]),s=e.embedding?Buffer.from(e.embedding.buffer,e.embedding.byteOffset,e.embedding.byteLength):null;return this.db.prepare(`
801
+ `;function Pw(t){t.pragma("journal_mode = WAL"),t.pragma("foreign_keys = ON"),t.exec(bF)}function ha(t){let e=pp(t),r=e.embedding instanceof Buffer?e.embedding:null;return{id:te(e.id),text:te(e.text),userId:te(e.user_id),category:te(e.category,"general"),importance:nt(e.importance,.5),confidence:nt(e.confidence,1),source:te(e.source,"agent"),sessionId:te(e.session_id),eventDate:te(e.event_date),tags:ya(e.tags),embedding:r?new Float32Array(r.buffer,r.byteOffset,r.byteLength/4):null,createdAt:nt(e.created_at),updatedAt:nt(e.updated_at),accessCount:nt(e.access_count),lastAccessedAt:nt(e.last_accessed_at),isArchived:!!e.is_archived}}function up(t){let e=pp(t);return{id:te(e.id),memoryId:te(e.memory_id),userId:te(e.user_id),entity:te(e.entity),predicate:te(e.predicate),value:kF(e.value_json),text:te(e.text),category:te(e.category,"general"),importance:nt(e.importance,.5),confidence:nt(e.confidence,.5),source:te(e.source,"agent"),sourcePriority:nt(e.source_priority),status:RF(e.status),validTime:te(e.valid_time),evidenceIds:ya(e.evidence_ids),supersedesClaimId:te(e.supersedes_claim_id),conflictGroupId:te(e.conflict_group_id),createdAt:nt(e.created_at),updatedAt:nt(e.updated_at)}}function xw(t){let e=pp(t);return{id:te(e.id),userId:te(e.user_id),claimAId:te(e.claim_a_id),claimBId:te(e.claim_b_id),reason:te(e.reason),status:SF(e.status),createdAt:nt(e.created_at),updatedAt:nt(e.updated_at)}}function kF(t){if(typeof t!="string"||!t)return{};try{let e=JSON.parse(t);return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{return{}}}function ya(t){if(typeof t!="string"||!t)return[];try{let e=JSON.parse(t);return Array.isArray(e)?e.filter(r=>typeof r=="string"):[]}catch{return[]}}function pp(t){return t&&typeof t=="object"?t:{}}function te(t,e=""){return typeof t=="string"?t:e}function nt(t,e=0){return typeof t=="number"&&Number.isFinite(t)?t:e}function RF(t){return t==="active"||t==="superseded"||t==="conflicted"||t==="archived"||t==="pending_confirmation"?t:"active"}function SF(t){return t==="open"||t==="resolved"||t==="dismissed"?t:"open"}import*as va from"node:fs";import*as Cw from"node:path";function mp(t=I().resolveActiveOwnerUserId(),e=I()){let r=e.getProfileMemoryDir(t);return va.existsSync(r)||va.mkdirSync(r,{recursive:!0}),Cw.join(r,"memories.db")}var ba=class{db;constructor(e){this.db=e,this.initSchema()}initSchema(){Pw(this.db)}insert(e){let r=`mem_${_o().replace(/-/g,"").slice(0,16)}`,n=Date.now(),o=JSON.stringify(e.tags??[]),s=e.embedding?Buffer.from(e.embedding.buffer,e.embedding.byteOffset,e.embedding.byteLength):null;return this.db.prepare(`
802
802
  INSERT INTO memories (id, text, user_id, category, importance, confidence, source, session_id, event_date, tags, embedding, created_at, updated_at, last_accessed_at)
803
803
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
804
804
  `).run(r,e.text,e.userId,e.category??"general",e.importance??.5,e.confidence??1,e.source??"agent",e.sessionId??"",e.eventDate??"",o,s,n,n,n),r}searchFts(e,r,n=10){let o=e.replace(/['"*()]/g," ").trim();return o?this.db.prepare(`
@@ -1003,11 +1003,11 @@ END;
1003
1003
  SELECT * FROM memory_conflicts
1004
1004
  WHERE user_id = ?
1005
1005
  ORDER BY updated_at DESC
1006
- `).all(e).map(xw)}close(){this.db.close()}};var gp=class{dimensions=0;model="none";async embed(e){return new Float32Array(0)}async embedBatch(e){return e.map(()=>new Float32Array(0))}},fp=class{dimensions;model;baseUrl;apiKey;timeoutMs;format;constructor(e){this.baseUrl=e.baseUrl.replace(/\/$/,""),this.apiKey=e.apiKey,this.model=e.model,this.dimensions=e.dimensions??1536,this.timeoutMs=e.timeoutMs??1e4,this.format=e.format??"openai"}async embed(e){return(await this.embedBatch([e]))[0]}async embedBatch(e){if(e.length===0)return[];let r=new AbortController,n=setTimeout(()=>r.abort(),this.timeoutMs);try{let{url:o,body:s}=this.buildRequest(e),i=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify(s),signal:r.signal});if(!i.ok){let c=await i.text().catch(()=>"");throw new Error(`Embedding API error [${this.format}]: ${i.status} ${i.statusText}${c?` \u2014 ${c.slice(0,200)}`:""}`)}let a=await i.json();return this.parseResponse(a,e.length)}finally{clearTimeout(n)}}buildRequest(e){switch(this.format){case"minimax":return{url:`${this.baseUrl}/v1/embeddings`,body:{model:this.model,texts:e,type:"db"}};case"volcengine":return{url:`${this.baseUrl}/v1/embeddings/multimodal`,body:{model:this.model,input:e.map(r=>({type:"text",text:r})),dimensions:this.dimensions}};default:return{url:`${this.baseUrl}/v1/embeddings`,body:{model:this.model,input:e,dimensions:this.dimensions}}}}parseResponse(e,r){switch(this.format){case"minimax":{let n=e.vectors;if(!n||n.length===0)throw new Error("MiniMax embedding returned empty vectors");return n.map(o=>new Float32Array(o))}case"volcengine":{let n=e.data;if(Array.isArray(n))return n.map(o=>new Float32Array(o.embedding));if(n?.embedding)return[new Float32Array(n.embedding)];throw new Error("Volcengine embedding returned unexpected structure")}default:{let n=e.data;if(!n||n.length===0)throw new Error("OpenAI embedding returned empty data");return n.sort((s,i)=>s.index-i.index).map(s=>new Float32Array(s.embedding))}}}};function Iw(t){return t?.api?new fp(t.api):new gp}var SF={qwen:{format:"openai",baseUrl:"https://dashscope.aliyuncs.com/compatible-mode",defaultModel:"text-embedding-v3",defaultDimensions:1024},zhipu:{format:"openai",baseUrl:"https://open.bigmodel.cn/api/paas",defaultModel:"embedding-3",defaultDimensions:2048},minimax:{format:"minimax",baseUrl:"https://api.minimax.chat",defaultModel:"embo-01",defaultDimensions:1024},volcengine:{format:"volcengine",baseUrl:"https://ark.cn-beijing.volces.com/api",defaultModel:"doubao-embedding-vision-251215",defaultDimensions:1024},openai:{format:"openai",baseUrl:"https://api.openai.com",defaultModel:"text-embedding-3-small",defaultDimensions:1536},google:{format:"openai",baseUrl:"https://generativelanguage.googleapis.com",defaultModel:"text-embedding-004",defaultDimensions:768},deepseek:{format:"openai",baseUrl:"https://api.deepseek.com",defaultModel:"text-embedding-v1",defaultDimensions:1024}};function Ew(t,e,r){let n=SF[t.toLowerCase()];return n?{baseUrl:r?.baseUrl||n.baseUrl,apiKey:e,model:r?.model||n.defaultModel,dimensions:r?.dimensions||n.defaultDimensions,format:n.format}:null}var TF={observationsAdded:0,proposalsAdded:0,claimsAdded:0,conflictsAdded:0,memoriesAdded:0,observationIds:[],proposalIds:[],claimIds:[],conflictIds:[]},Sa=class{constructor(e,r){this.store=e;this.embed=r}store;embed;async observe(e,r,n){let o=Ra(n?.source),s=Do(o),i=yp();for(let a of e){let c=a.text?.trim();if(!c)continue;let l=this.store.insertObservation({userId:r,text:c,source:o,sourcePriority:s,sessionId:n?.sessionId??"",evidenceType:"text",payload:{category:a.category,importance:a.importance,tags:a.tags??[]}});i.observationsAdded++,i.observationIds.push(l)}return i}async proposeExtracted(e,r,n){let o=Ra(n?.source),s=Do(o),i=yp();for(let a of e){let c=a.text?.trim();if(!c)continue;let l=this.store.insertObservation({userId:r,text:c,source:o,sourcePriority:s,sessionId:n?.sessionId??"",evidenceType:"text",payload:{category:a.category,importance:a.importance,eventDate:a.event_date,tags:a.tags??[]}});i.observationsAdded++,i.observationIds.push(l);let d=Mw(c,a,o),p=this.store.insertProposal({userId:r,observationIds:[l],text:c,category:a.category??"general",importance:or(a.importance??.5,.1,1),confidence:d.confidence,source:o,sourcePriority:s,entity:d.entity,predicate:d.predicate,value:d.value,validTime:d.validTime,tags:a.tags??[],status:"pending"});i.proposalsAdded++,i.proposalIds.push(p)}return i}async commitExtracted(e,r,n){let o=Ra(n?.source),s=Do(o),i=yp();for(let a of e){let c=a.text?.trim();if(!c)continue;let l=this.store.insertObservation({userId:r,text:c,source:o,sourcePriority:s,sessionId:n?.sessionId??"",evidenceType:"text",payload:{category:a.category,importance:a.importance,eventDate:a.event_date,tags:a.tags??[]}});i.observationsAdded++,i.observationIds.push(l);let d=Mw(c,a,o),p=this.store.insertProposal({userId:r,observationIds:[l],text:c,category:a.category??"general",importance:or(a.importance??.5,.1,1),confidence:d.confidence,source:o,sourcePriority:s,entity:d.entity,predicate:d.predicate,value:d.value,validTime:d.validTime,tags:a.tags??[],status:"pending"});i.proposalsAdded++,i.proposalIds.push(p);let u=this.store.findClaimsByFact(r,d.entity,d.predicate,d.validTime),m=u.find(v=>CF(v.value,d.value));if(m){this.store.mergeClaimEvidence(m.id,[l],Math.max(m.confidence,d.confidence),or(a.importance??m.importance,.1,1)),this.store.updateProposalStatus(p,"merged",[m.id]),i.claimIds.push(m.id);continue}let f=u.find(v=>v.status==="active"||v.status==="pending_confirmation");if(f){let v=this.store.insertClaim({userId:r,entity:d.entity,predicate:d.predicate,value:d.value,text:c,category:a.category??"general",importance:or(a.importance??.5,.1,1),confidence:d.confidence,source:o,sourcePriority:s,status:"conflicted",validTime:d.validTime,evidenceIds:[l]}),R=this.store.insertConflict({userId:r,claimAId:f.id,claimBId:v,reason:`same entity + same predicate + different value: ${d.entity}.${d.predicate}`});this.store.updateProposalStatus(p,"conflicted",[f.id,v]),i.claimsAdded++,i.conflictsAdded++,i.claimIds.push(v),i.conflictIds.push(R);continue}let g=wF(o,d.confidence),h=g==="active"?this.store.insert({text:c,userId:r,category:a.category??"general",importance:or(a.importance??.5,.1,1),confidence:d.confidence,source:o,sessionId:n?.sessionId??"",eventDate:a.event_date??"",tags:a.tags??[],embedding:await this.embed(c)}):"",b=this.store.insertClaim({userId:r,memoryId:h,entity:d.entity,predicate:d.predicate,value:d.value,text:c,category:a.category??"general",importance:or(a.importance??.5,.1,1),confidence:d.confidence,source:o,sourcePriority:s,status:g,validTime:d.validTime,evidenceIds:[l]});this.store.updateProposalStatus(p,g==="active"?"accepted":"pending",[b]),i.claimsAdded++,i.memoriesAdded+=h?1:0,i.claimIds.push(b)}return i}};function Do(t){let e=Ra(t);return e==="manual"||e==="user_edit"?100:e==="explicit"||e==="agent-remember"||e==="agent"?90:e==="document"||e==="image"||e==="video"?70:e==="auto"||e==="turn"?45:e==="dream"||e==="dream-consolidation"||e==="profile-extraction"?20:40}function wF(t,e){return Do(t)>=45&&e>=.55?"active":"pending_confirmation"}function Mw(t,e,r){let n=EF(t),o=(e.tags??[]).join(" "),s=AF(t,o),i=PF(t);if(i)return{entity:s,predicate:"contract_amount",value:i,validTime:Dw(e.event_date),confidence:hp(r,.92)};let a=xF(t);if(a)return{entity:s,predicate:"progress_update_schedule",value:a,validTime:"",confidence:hp(r,.86)};let c=IF(e.category??"general");return{entity:s,predicate:c,value:{text:n},validTime:Dw(e.event_date),confidence:hp(r,.7)}}function hp(t,e){let r=Do(t);return r>=90?or(e+.04,.1,.99):r<=20?or(e-.18,.1,.95):or(e,.1,.98)}function AF(t,e){let r=`${t} ${e}`;if(/Galaxy\s*Tech|Galaxy/i.test(r))return"Galaxy Tech";let n=r.match(/\b[A-Z][A-Za-z0-9]*(?:\s+[A-Z][A-Za-z0-9]*){0,3}\b/);if(n?.[0])return n[0].trim();let o=r.match(/([\u4e00-\u9fa5A-Za-z0-9]{2,18})(?:公司|客户|合同|项目)/);return o?.[1]?o[1]:"user"}function PF(t){if(!/(合同|contract)/i.test(t))return null;let e=t.match(/(\d+(?:\.\d+)?)\s*k\b/i);if(e)return{amount:Math.round(Number(e[1])*1e3),currency:ka(t)};let r=t.match(/(\d+(?:\.\d+)?)\s*万/);if(r)return{amount:Math.round(Number(r[1])*1e4),currency:ka(t)};let n=t.match(/(?:金额|amount)[^\d]*(\d{5,})/i);return n?{amount:Number(n[1]),currency:ka(t)}:/一十八万/.test(t)?{amount:18e4,currency:ka(t)}:null}function xF(t){if(!/(提醒|进展|更新|progress|schedule|每周)/i.test(t))return null;let e=/周一|星期一|Monday/i.test(t)?"monday":/周二|星期二|Tuesday/i.test(t)?"tuesday":/周三|星期三|Wednesday/i.test(t)?"wednesday":/周四|星期四|Thursday/i.test(t)?"thursday":/周五|星期五|Friday/i.test(t)?"friday":/周六|星期六|Saturday/i.test(t)?"saturday":/周日|周天|星期日|星期天|Sunday/i.test(t)?"sunday":"";if(!e)return null;let r=t.match(/(?:上午|早上)?\s*(\d{1,2})\s*点/);return{cadence:"weekly",weekday:e,hour:r?Number(r[1]):null}}function CF(t,e){return _w(t)===_w(e)}function _w(t){let e=Object.keys(t).sort();return JSON.stringify(e.reduce((r,n)=>(r[n]=t[n],r),{}))}function ka(t){return/[¥¥]|人民币|CNY/i.test(t)?"CNY":/\$|USD/i.test(t)?"USD":"unknown"}function IF(t){return t.trim().toLowerCase().replace(/[^a-z0-9_\-\u4e00-\u9fa5]+/g,"_")||"general"}function Dw(t){if(!t)return"";let e=new Date(t);return Number.isNaN(e.getTime())?"":`${e.getUTCFullYear()}-${String(e.getUTCMonth()+1).padStart(2,"0")}`}function EF(t){return t.trim().replace(/\s+/g," ").toLowerCase()}function Ra(t){return t?.trim()||"agent"}function or(t,e,r){return Number.isFinite(t)?Math.max(e,Math.min(r,t)):e}function yp(){return{...TF,observationIds:[],proposalIds:[],claimIds:[],conflictIds:[]}}var Nw="qmemory-local",bp=class{providerId=Nw;store;embedding;consolidator;userIdPrefix;dbPath;constructor(e){if(this.dbPath=mp(e.ownerUserId),this.userIdPrefix=e.userIdPrefix??"",this.embedding=Iw(e.embedding),!e.createDatabase)throw new Error("LocalMemoryProvider requires a createDatabase factory. Install better-sqlite3 and pass: (path) => new Database(path)");let r=e.createDatabase(this.dbPath);this.store=new ba(r),this.consolidator=new Sa(this.store,n=>this.buildEmbedding(n))}resolveUserId(e){return this.userIdPrefix?`${this.userIdPrefix}:${e}`:e}async buildEmbedding(e){if(this.embedding.dimensions!==0)try{let r=await this.embedding.embed(e);return r.length?r:void 0}catch{return}}async search(e,r,n){let o=this.resolveUserId(r),s=n?.limit??10,i=n?.minScore??.1,a=null;if(this.embedding.dimensions>0)try{a=await this.embedding.embed(e)}catch{}let c=Math.min(s*3,50),l=this.store.searchHybrid(e,a,o,c),d=this.rerank(l.map(p=>({id:p.id,text:p.text,score:p.score,category:p.category,metadata:{...p.metadata,createdAt:p.metadata?.createdAt,accessCount:p.metadata?.accessCount}})),{preferredCategories:n?.preferredCategories});for(let p of d.slice(0,3))this.store.recordAccess(p.id);return d.filter(p=>p.score>=i).slice(0,s).map(p=>({blockId:p.id,text:p.text,score:p.score,source:Nw,metadata:p.metadata}))}async ingest(e,r,n){let o=this.resolveUserId(r),s=e.filter(i=>i.content?.trim()&&i.content.trim().length>=10).map(i=>({text:i.content,category:"conversation",importance:.4}));await this.consolidator.observe(s,o,{source:n?.source??"turn",sessionId:n?.sessionId??""})}async addText(e,r,n){return this.ingestExtracted([{text:e,category:n?.category??"fact",importance:n?.importance??.6}],r,{...n,source:n?.source??"agent",sessionId:n?.sessionId??""})}async remove(e){return this.store.updateClaimsByMemoryId(e,"archived"),this.store.delete(e)}async update(e,r){let n=this.store.getById(e);if(!n)return!1;let o=r.text?.trim(),s=o&&o!==n.text?await this.buildEmbedding(o):void 0,i=this.store.update(e,{...r,text:o||void 0,embedding:s});return i&&this.store.updateClaimsByMemoryId(e,"superseded"),i}async ingestExtracted(e,r,n){if(e.length===0)return vp();let o=this.resolveUserId(r);return this.consolidator.commitExtracted(e,o,{source:n?.source??"agent",sessionId:n?.sessionId??""})}async observeExtracted(e,r,n){return e.length===0?vp():this.consolidator.observe(e,this.resolveUserId(r),{source:n?.source??"agent",sessionId:n?.sessionId??""})}async proposeExtracted(e,r,n){return e.length===0?vp():this.consolidator.proposeExtracted(e,this.resolveUserId(r),{source:n?.source??"agent",sessionId:n?.sessionId??""})}listClaims(e){return this.store.listClaims(this.resolveUserId(e))}listConflicts(e){return this.store.listConflicts(this.resolveUserId(e))}async triggerDecay(e,r=90){let n=this.resolveUserId(e),o=this.store.runFullDecay(n),s=this.store.enforceCapacityLimit(n,1e4);return o.total+s>10&&(this.store.exportAndPurgeArchived(n,200),this.store.vacuum()),{decayed:o.total+s}}async feedback(e,r){let n=0;for(let o of e)this.store.applyFeedback(o,r)&&n++;return{affected:n}}getProfile(e,r){return this.store.getProfile(this.resolveUserId(e),r)}setProfile(e,r,n){this.store.setProfile(this.resolveUserId(e),r,n)}getAllProfiles(e){return this.store.getAllProfiles(this.resolveUserId(e))}deleteProfile(e,r){return this.store.deleteProfile(this.resolveUserId(e),r)}getTemporalSlice(e,r,n,o){return this.store.getTemporalSlice(this.resolveUserId(e),r,n,o)}getActivitySummary(e,r=7){return this.store.getActivitySummary(this.resolveUserId(e),r)}list(e,r){return this.store.listByUser(this.resolveUserId(e),r?.page??1,r?.pageSize??500,r?.activeOnly??!0)}getAtlas(e,r){return this.store.getAtlas(this.resolveUserId(e),r)}findByEventDate(e,r,n=1){return this.store.findByEventDate(this.resolveUserId(e),r,n)}async findRelatedEvents(e,r,n){let o=this.resolveUserId(r),s=n?.minSimilarity??.55,i=n?.maxSimilarity??.82,a=n?.maxDaysBack??14,c=n?.limit??5;if(this.embedding.dimensions===0)return[];let l;try{l=await this.embedding.embed(e)}catch{return[]}let d=this.store.searchVector(l,o,c*3,s),p=Date.now()-a*864e5;return d.filter(u=>{let m=u.metadata?.cosineSimilarity??u.score,f=u.metadata?.createdAt??0;return m>=s&&m<i&&f>=p}).slice(0,c).map(u=>({id:u.id,text:u.text,score:u.metadata?.cosineSimilarity??u.score,date:new Date(u.metadata?.createdAt??Date.now()).toISOString().slice(0,10)}))}synthesizeTimeline(e,r,n){let o=this.getTemporalSlice(e,r,n);if(o.length===0)return"No memories in this time range.";let s=[];for(let i of o){s.push(`## ${i.date}`);for(let a of i.memories){let c=a.importance>=.7?"*":"-";s.push(`${c} [${a.category}] ${a.text}`)}}return s.join(`
1007
- `)}rerank(e,r){let n=(r?.recencyBoostDays??7)*864e5,o=Date.now(),s=new Set(r?.preferredCategories??[]);return e.map(i=>{let a=i.score,c=i.metadata?.createdAt??0;if(c>0){let d=o-c;d<n&&(a+=.1*(1-d/n))}let l=i.metadata?.accessCount??0;return l>0&&(a+=Math.min(.05,l*.01)),s.size>0&&i.category&&s.has(i.category)&&(a+=.08),{...i,score:Math.min(1,a)}}).sort((i,a)=>a.score-i.score)}async health(){return{status:"healthy",memoryCount:0,dbPath:this.dbPath}}count(e){return this.store.count(this.resolveUserId(e))}async resetUser(e){return this.store.resetUser(this.resolveUserId(e))}close(){this.store.close()}};function Lw(t){return new bp(t)}function vp(){return{observationsAdded:0,proposalsAdded:0,claimsAdded:0,conflictsAdded:0,memoriesAdded:0,observationIds:[],proposalIds:[],claimIds:[],conflictIds:[]}}Fe();function Ow(t){let e=t.pathService.resolveActiveOwnerUserId(),r=t.config.get("QMEMORY_USER_PREFIX")||void 0,n=t.modelRegistry.getActiveModel("embedding");if(n){let s=_F({provider:n.provider,apiKey:n.apiKey,model:n.model||"text-embedding-3-small",baseUrl:n.baseUrl,timeoutMs:$w(t.config)});return n.keyHandle.release({success:!0}),{ownerUserId:e,userIdPrefix:r,embedding:{api:s}}}let o=MF(t.config);return{ownerUserId:e,userIdPrefix:r,embedding:o?{api:o}:void 0}}function MF(t){let e=jw(t.get("QLOGIC_LLMROUTER_BASE_URL"));if(!e)return;let r=t.get("QLOGIC_LLMROUTER_ACCESS_TOKEN")?.trim();if(!r)return;let n=parseInt(t.get("QLOGIC_LLMROUTER_EMBEDDING_DIMENSIONS")||t.get("QMEMORY_EMBEDDING_DIMENSIONS")||"1024",10);return{baseUrl:e,apiKey:r,model:t.get("QLOGIC_LLMROUTER_EMBEDDING_MODEL")||"BAAI/bge-m3",dimensions:Number.isFinite(n)?n:1024,format:"openai",timeoutMs:$w(t)}}function _F(t){return{...Ew(t.provider,t.apiKey,{model:t.model,baseUrl:t.baseUrl})??{baseUrl:jw(t.baseUrl)||"",apiKey:t.apiKey,model:t.model,format:"openai"},timeoutMs:t.timeoutMs}}function jw(t){return t?.trim().replace(/\/+$/,"")??""}function $w(t){let e=parseInt(t.get("QMEMORY_EMBEDDING_TIMEOUT_MS")||"1500",10);return Number.isFinite(e)&&e>0?e:1500}function Uw(t){try{let e=NF();if(e){let r={ownerUserId:t.ownerUserId,userIdPrefix:t.userIdPrefix,embedding:t.embedding,createDatabase:e};return{provider:Lw(r),mode:"local"}}}catch(e){return{provider:null,mode:"none",error:`Local provider failed: ${e.message}`}}return{provider:null,mode:"none",error:"better-sqlite3 not available"}}function NF(){try{let e=DF(import.meta.url)("better-sqlite3"),r=e.default??e;if(typeof r!="function")return null;let n=r;return o=>new n(o)}catch{return null}}function Fw(){return Ow({config:kr(),pathService:I(),modelRegistry:D()})}var Hw="memory",Bw="Memory",LF=["add","replace","remove","create_file","write_file","read_file","delete_file","list_files","search","remember","temporal","feedback"],qw={type:"object",properties:{action:{type:"string",enum:LF,description:["Operation to perform:","","INDEX.md operations (project-level notes, always visible in system prompt):","- 'add' - Append a note to INDEX.md","- 'replace' - Replace text in INDEX.md (str_replace semantics)","- 'remove' - Remove text from INDEX.md","","Topic file operations (project-level, on-demand, for longer content):","- 'create_file' - Create a new .md topic file","- 'write_file' - Overwrite an existing topic file","- 'read_file' - Read a topic file","- 'delete_file' - Delete a topic file","- 'list_files' - List all memory topic files","","Long-term memory (user-level, persists across projects):","- 'remember' - Submit a fact/preference/lesson to the memory consolidation pipeline","- 'search' - Search long-term memory + local keyword match","- 'temporal' - Query memories by time range ('what happened last week')","","Feedback:","- 'feedback' - Mark memories as useful/irrelevant/outdated/wrong"].join(`
1006
+ `).all(e).map(xw)}close(){this.db.close()}};var gp=class{dimensions=0;model="none";async embed(e){return new Float32Array(0)}async embedBatch(e){return e.map(()=>new Float32Array(0))}},fp=class{dimensions;model;baseUrl;apiKey;timeoutMs;format;constructor(e){this.baseUrl=e.baseUrl.replace(/\/$/,""),this.apiKey=e.apiKey,this.model=e.model,this.dimensions=e.dimensions??1536,this.timeoutMs=e.timeoutMs??1e4,this.format=e.format??"openai"}async embed(e){return(await this.embedBatch([e]))[0]}async embedBatch(e){if(e.length===0)return[];let r=new AbortController,n=setTimeout(()=>r.abort(),this.timeoutMs);try{let{url:o,body:s}=this.buildRequest(e),i=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify(s),signal:r.signal});if(!i.ok){let c=await i.text().catch(()=>"");throw new Error(`Embedding API error [${this.format}]: ${i.status} ${i.statusText}${c?` \u2014 ${c.slice(0,200)}`:""}`)}let a=await i.json();return this.parseResponse(a,e.length)}finally{clearTimeout(n)}}buildRequest(e){switch(this.format){case"minimax":return{url:`${this.baseUrl}/v1/embeddings`,body:{model:this.model,texts:e,type:"db"}};case"volcengine":return{url:`${this.baseUrl}/v1/embeddings/multimodal`,body:{model:this.model,input:e.map(r=>({type:"text",text:r})),dimensions:this.dimensions}};default:return{url:`${this.baseUrl}/v1/embeddings`,body:{model:this.model,input:e,dimensions:this.dimensions}}}}parseResponse(e,r){switch(this.format){case"minimax":{let n=e.vectors;if(!n||n.length===0)throw new Error("MiniMax embedding returned empty vectors");return n.map(o=>new Float32Array(o))}case"volcengine":{let n=e.data;if(Array.isArray(n))return n.map(o=>new Float32Array(o.embedding));if(n?.embedding)return[new Float32Array(n.embedding)];throw new Error("Volcengine embedding returned unexpected structure")}default:{let n=e.data;if(!n||n.length===0)throw new Error("OpenAI embedding returned empty data");return n.sort((s,i)=>s.index-i.index).map(s=>new Float32Array(s.embedding))}}}};function Iw(t){return t?.api?new fp(t.api):new gp}var TF={qwen:{format:"openai",baseUrl:"https://dashscope.aliyuncs.com/compatible-mode",defaultModel:"text-embedding-v3",defaultDimensions:1024},zhipu:{format:"openai",baseUrl:"https://open.bigmodel.cn/api/paas",defaultModel:"embedding-3",defaultDimensions:2048},minimax:{format:"minimax",baseUrl:"https://api.minimax.chat",defaultModel:"embo-01",defaultDimensions:1024},volcengine:{format:"volcengine",baseUrl:"https://ark.cn-beijing.volces.com/api",defaultModel:"doubao-embedding-vision-251215",defaultDimensions:1024},openai:{format:"openai",baseUrl:"https://api.openai.com",defaultModel:"text-embedding-3-small",defaultDimensions:1536},google:{format:"openai",baseUrl:"https://generativelanguage.googleapis.com",defaultModel:"text-embedding-004",defaultDimensions:768},deepseek:{format:"openai",baseUrl:"https://api.deepseek.com",defaultModel:"text-embedding-v1",defaultDimensions:1024}};function Ew(t,e,r){let n=TF[t.toLowerCase()];return n?{baseUrl:r?.baseUrl||n.baseUrl,apiKey:e,model:r?.model||n.defaultModel,dimensions:r?.dimensions||n.defaultDimensions,format:n.format}:null}var wF={observationsAdded:0,proposalsAdded:0,claimsAdded:0,conflictsAdded:0,memoriesAdded:0,observationIds:[],proposalIds:[],claimIds:[],conflictIds:[]},Sa=class{constructor(e,r){this.store=e;this.embed=r}store;embed;async observe(e,r,n){let o=Ra(n?.source),s=Do(o),i=yp();for(let a of e){let c=a.text?.trim();if(!c)continue;let l=this.store.insertObservation({userId:r,text:c,source:o,sourcePriority:s,sessionId:n?.sessionId??"",evidenceType:"text",payload:{category:a.category,importance:a.importance,tags:a.tags??[]}});i.observationsAdded++,i.observationIds.push(l)}return i}async proposeExtracted(e,r,n){let o=Ra(n?.source),s=Do(o),i=yp();for(let a of e){let c=a.text?.trim();if(!c)continue;let l=this.store.insertObservation({userId:r,text:c,source:o,sourcePriority:s,sessionId:n?.sessionId??"",evidenceType:"text",payload:{category:a.category,importance:a.importance,eventDate:a.event_date,tags:a.tags??[]}});i.observationsAdded++,i.observationIds.push(l);let d=Mw(c,a,o),p=this.store.insertProposal({userId:r,observationIds:[l],text:c,category:a.category??"general",importance:or(a.importance??.5,.1,1),confidence:d.confidence,source:o,sourcePriority:s,entity:d.entity,predicate:d.predicate,value:d.value,validTime:d.validTime,tags:a.tags??[],status:"pending"});i.proposalsAdded++,i.proposalIds.push(p)}return i}async commitExtracted(e,r,n){let o=Ra(n?.source),s=Do(o),i=yp();for(let a of e){let c=a.text?.trim();if(!c)continue;let l=this.store.insertObservation({userId:r,text:c,source:o,sourcePriority:s,sessionId:n?.sessionId??"",evidenceType:"text",payload:{category:a.category,importance:a.importance,eventDate:a.event_date,tags:a.tags??[]}});i.observationsAdded++,i.observationIds.push(l);let d=Mw(c,a,o),p=this.store.insertProposal({userId:r,observationIds:[l],text:c,category:a.category??"general",importance:or(a.importance??.5,.1,1),confidence:d.confidence,source:o,sourcePriority:s,entity:d.entity,predicate:d.predicate,value:d.value,validTime:d.validTime,tags:a.tags??[],status:"pending"});i.proposalsAdded++,i.proposalIds.push(p);let u=this.store.findClaimsByFact(r,d.entity,d.predicate,d.validTime),m=u.find(v=>IF(v.value,d.value));if(m){this.store.mergeClaimEvidence(m.id,[l],Math.max(m.confidence,d.confidence),or(a.importance??m.importance,.1,1)),this.store.updateProposalStatus(p,"merged",[m.id]),i.claimIds.push(m.id);continue}let f=u.find(v=>v.status==="active"||v.status==="pending_confirmation");if(f){let v=this.store.insertClaim({userId:r,entity:d.entity,predicate:d.predicate,value:d.value,text:c,category:a.category??"general",importance:or(a.importance??.5,.1,1),confidence:d.confidence,source:o,sourcePriority:s,status:"conflicted",validTime:d.validTime,evidenceIds:[l]}),R=this.store.insertConflict({userId:r,claimAId:f.id,claimBId:v,reason:`same entity + same predicate + different value: ${d.entity}.${d.predicate}`});this.store.updateProposalStatus(p,"conflicted",[f.id,v]),i.claimsAdded++,i.conflictsAdded++,i.claimIds.push(v),i.conflictIds.push(R);continue}let g=AF(o,d.confidence),h=g==="active"?this.store.insert({text:c,userId:r,category:a.category??"general",importance:or(a.importance??.5,.1,1),confidence:d.confidence,source:o,sessionId:n?.sessionId??"",eventDate:a.event_date??"",tags:a.tags??[],embedding:await this.embed(c)}):"",b=this.store.insertClaim({userId:r,memoryId:h,entity:d.entity,predicate:d.predicate,value:d.value,text:c,category:a.category??"general",importance:or(a.importance??.5,.1,1),confidence:d.confidence,source:o,sourcePriority:s,status:g,validTime:d.validTime,evidenceIds:[l]});this.store.updateProposalStatus(p,g==="active"?"accepted":"pending",[b]),i.claimsAdded++,i.memoriesAdded+=h?1:0,i.claimIds.push(b)}return i}};function Do(t){let e=Ra(t);return e==="manual"||e==="user_edit"?100:e==="explicit"||e==="agent-remember"||e==="agent"?90:e==="document"||e==="image"||e==="video"?70:e==="auto"||e==="turn"?45:e==="dream"||e==="dream-consolidation"||e==="profile-extraction"?20:40}function AF(t,e){return Do(t)>=45&&e>=.55?"active":"pending_confirmation"}function Mw(t,e,r){let n=MF(t),o=(e.tags??[]).join(" "),s=PF(t,o),i=xF(t);if(i)return{entity:s,predicate:"contract_amount",value:i,validTime:Dw(e.event_date),confidence:hp(r,.92)};let a=CF(t);if(a)return{entity:s,predicate:"progress_update_schedule",value:a,validTime:"",confidence:hp(r,.86)};let c=EF(e.category??"general");return{entity:s,predicate:c,value:{text:n},validTime:Dw(e.event_date),confidence:hp(r,.7)}}function hp(t,e){let r=Do(t);return r>=90?or(e+.04,.1,.99):r<=20?or(e-.18,.1,.95):or(e,.1,.98)}function PF(t,e){let r=`${t} ${e}`;if(/Galaxy\s*Tech|Galaxy/i.test(r))return"Galaxy Tech";let n=r.match(/\b[A-Z][A-Za-z0-9]*(?:\s+[A-Z][A-Za-z0-9]*){0,3}\b/);if(n?.[0])return n[0].trim();let o=r.match(/([\u4e00-\u9fa5A-Za-z0-9]{2,18})(?:公司|客户|合同|项目)/);return o?.[1]?o[1]:"user"}function xF(t){if(!/(合同|contract)/i.test(t))return null;let e=t.match(/(\d+(?:\.\d+)?)\s*k\b/i);if(e)return{amount:Math.round(Number(e[1])*1e3),currency:ka(t)};let r=t.match(/(\d+(?:\.\d+)?)\s*万/);if(r)return{amount:Math.round(Number(r[1])*1e4),currency:ka(t)};let n=t.match(/(?:金额|amount)[^\d]*(\d{5,})/i);return n?{amount:Number(n[1]),currency:ka(t)}:/一十八万/.test(t)?{amount:18e4,currency:ka(t)}:null}function CF(t){if(!/(提醒|进展|更新|progress|schedule|每周)/i.test(t))return null;let e=/周一|星期一|Monday/i.test(t)?"monday":/周二|星期二|Tuesday/i.test(t)?"tuesday":/周三|星期三|Wednesday/i.test(t)?"wednesday":/周四|星期四|Thursday/i.test(t)?"thursday":/周五|星期五|Friday/i.test(t)?"friday":/周六|星期六|Saturday/i.test(t)?"saturday":/周日|周天|星期日|星期天|Sunday/i.test(t)?"sunday":"";if(!e)return null;let r=t.match(/(?:上午|早上)?\s*(\d{1,2})\s*点/);return{cadence:"weekly",weekday:e,hour:r?Number(r[1]):null}}function IF(t,e){return _w(t)===_w(e)}function _w(t){let e=Object.keys(t).sort();return JSON.stringify(e.reduce((r,n)=>(r[n]=t[n],r),{}))}function ka(t){return/[¥¥]|人民币|CNY/i.test(t)?"CNY":/\$|USD/i.test(t)?"USD":"unknown"}function EF(t){return t.trim().toLowerCase().replace(/[^a-z0-9_\-\u4e00-\u9fa5]+/g,"_")||"general"}function Dw(t){if(!t)return"";let e=new Date(t);return Number.isNaN(e.getTime())?"":`${e.getUTCFullYear()}-${String(e.getUTCMonth()+1).padStart(2,"0")}`}function MF(t){return t.trim().replace(/\s+/g," ").toLowerCase()}function Ra(t){return t?.trim()||"agent"}function or(t,e,r){return Number.isFinite(t)?Math.max(e,Math.min(r,t)):e}function yp(){return{...wF,observationIds:[],proposalIds:[],claimIds:[],conflictIds:[]}}var Nw="qmemory-local",bp=class{providerId=Nw;store;embedding;consolidator;userIdPrefix;dbPath;constructor(e){if(this.dbPath=mp(e.ownerUserId),this.userIdPrefix=e.userIdPrefix??"",this.embedding=Iw(e.embedding),!e.createDatabase)throw new Error("LocalMemoryProvider requires a createDatabase factory. Install better-sqlite3 and pass: (path) => new Database(path)");let r=e.createDatabase(this.dbPath);this.store=new ba(r),this.consolidator=new Sa(this.store,n=>this.buildEmbedding(n))}resolveUserId(e){return this.userIdPrefix?`${this.userIdPrefix}:${e}`:e}async buildEmbedding(e){if(this.embedding.dimensions!==0)try{let r=await this.embedding.embed(e);return r.length?r:void 0}catch{return}}async search(e,r,n){let o=this.resolveUserId(r),s=n?.limit??10,i=n?.minScore??.1,a=null;if(this.embedding.dimensions>0)try{a=await this.embedding.embed(e)}catch{}let c=Math.min(s*3,50),l=this.store.searchHybrid(e,a,o,c),d=this.rerank(l.map(p=>({id:p.id,text:p.text,score:p.score,category:p.category,metadata:{...p.metadata,createdAt:p.metadata?.createdAt,accessCount:p.metadata?.accessCount}})),{preferredCategories:n?.preferredCategories});for(let p of d.slice(0,3))this.store.recordAccess(p.id);return d.filter(p=>p.score>=i).slice(0,s).map(p=>({blockId:p.id,text:p.text,score:p.score,source:Nw,metadata:p.metadata}))}async ingest(e,r,n){let o=this.resolveUserId(r),s=e.filter(i=>i.content?.trim()&&i.content.trim().length>=10).map(i=>({text:i.content,category:"conversation",importance:.4}));await this.consolidator.observe(s,o,{source:n?.source??"turn",sessionId:n?.sessionId??""})}async addText(e,r,n){return this.ingestExtracted([{text:e,category:n?.category??"fact",importance:n?.importance??.6}],r,{...n,source:n?.source??"agent",sessionId:n?.sessionId??""})}async remove(e){return this.store.updateClaimsByMemoryId(e,"archived"),this.store.delete(e)}async update(e,r){let n=this.store.getById(e);if(!n)return!1;let o=r.text?.trim(),s=o&&o!==n.text?await this.buildEmbedding(o):void 0,i=this.store.update(e,{...r,text:o||void 0,embedding:s});return i&&this.store.updateClaimsByMemoryId(e,"superseded"),i}async ingestExtracted(e,r,n){if(e.length===0)return vp();let o=this.resolveUserId(r);return this.consolidator.commitExtracted(e,o,{source:n?.source??"agent",sessionId:n?.sessionId??""})}async observeExtracted(e,r,n){return e.length===0?vp():this.consolidator.observe(e,this.resolveUserId(r),{source:n?.source??"agent",sessionId:n?.sessionId??""})}async proposeExtracted(e,r,n){return e.length===0?vp():this.consolidator.proposeExtracted(e,this.resolveUserId(r),{source:n?.source??"agent",sessionId:n?.sessionId??""})}listClaims(e){return this.store.listClaims(this.resolveUserId(e))}listConflicts(e){return this.store.listConflicts(this.resolveUserId(e))}async triggerDecay(e,r=90){let n=this.resolveUserId(e),o=this.store.runFullDecay(n),s=this.store.enforceCapacityLimit(n,1e4);return o.total+s>10&&(this.store.exportAndPurgeArchived(n,200),this.store.vacuum()),{decayed:o.total+s}}async feedback(e,r){let n=0;for(let o of e)this.store.applyFeedback(o,r)&&n++;return{affected:n}}getProfile(e,r){return this.store.getProfile(this.resolveUserId(e),r)}setProfile(e,r,n){this.store.setProfile(this.resolveUserId(e),r,n)}getAllProfiles(e){return this.store.getAllProfiles(this.resolveUserId(e))}deleteProfile(e,r){return this.store.deleteProfile(this.resolveUserId(e),r)}getTemporalSlice(e,r,n,o){return this.store.getTemporalSlice(this.resolveUserId(e),r,n,o)}getActivitySummary(e,r=7){return this.store.getActivitySummary(this.resolveUserId(e),r)}list(e,r){return this.store.listByUser(this.resolveUserId(e),r?.page??1,r?.pageSize??500,r?.activeOnly??!0)}getAtlas(e,r){return this.store.getAtlas(this.resolveUserId(e),r)}findByEventDate(e,r,n=1){return this.store.findByEventDate(this.resolveUserId(e),r,n)}async findRelatedEvents(e,r,n){let o=this.resolveUserId(r),s=n?.minSimilarity??.55,i=n?.maxSimilarity??.82,a=n?.maxDaysBack??14,c=n?.limit??5;if(this.embedding.dimensions===0)return[];let l;try{l=await this.embedding.embed(e)}catch{return[]}let d=this.store.searchVector(l,o,c*3,s),p=Date.now()-a*864e5;return d.filter(u=>{let m=u.metadata?.cosineSimilarity??u.score,f=u.metadata?.createdAt??0;return m>=s&&m<i&&f>=p}).slice(0,c).map(u=>({id:u.id,text:u.text,score:u.metadata?.cosineSimilarity??u.score,date:new Date(u.metadata?.createdAt??Date.now()).toISOString().slice(0,10)}))}synthesizeTimeline(e,r,n){let o=this.getTemporalSlice(e,r,n);if(o.length===0)return"No memories in this time range.";let s=[];for(let i of o){s.push(`## ${i.date}`);for(let a of i.memories){let c=a.importance>=.7?"*":"-";s.push(`${c} [${a.category}] ${a.text}`)}}return s.join(`
1007
+ `)}rerank(e,r){let n=(r?.recencyBoostDays??7)*864e5,o=Date.now(),s=new Set(r?.preferredCategories??[]);return e.map(i=>{let a=i.score,c=i.metadata?.createdAt??0;if(c>0){let d=o-c;d<n&&(a+=.1*(1-d/n))}let l=i.metadata?.accessCount??0;return l>0&&(a+=Math.min(.05,l*.01)),s.size>0&&i.category&&s.has(i.category)&&(a+=.08),{...i,score:Math.min(1,a)}}).sort((i,a)=>a.score-i.score)}async health(){return{status:"healthy",memoryCount:0,dbPath:this.dbPath}}count(e){return this.store.count(this.resolveUserId(e))}async resetUser(e){return this.store.resetUser(this.resolveUserId(e))}close(){this.store.close()}};function Lw(t){return new bp(t)}function vp(){return{observationsAdded:0,proposalsAdded:0,claimsAdded:0,conflictsAdded:0,memoriesAdded:0,observationIds:[],proposalIds:[],claimIds:[],conflictIds:[]}}Fe();function Ow(t){let e=t.pathService.resolveActiveOwnerUserId(),r=t.config.get("QMEMORY_USER_PREFIX")||void 0,n=t.modelRegistry.getActiveModel("embedding");if(n){let s=DF({provider:n.provider,apiKey:n.apiKey,model:n.model||"text-embedding-3-small",baseUrl:n.baseUrl,timeoutMs:$w(t.config)});return n.keyHandle.release({success:!0}),{ownerUserId:e,userIdPrefix:r,embedding:{api:s}}}let o=_F(t.config);return{ownerUserId:e,userIdPrefix:r,embedding:o?{api:o}:void 0}}function _F(t){let e=jw(t.get("QLOGIC_LLMROUTER_BASE_URL"));if(!e)return;let r=t.get("QLOGIC_LLMROUTER_ACCESS_TOKEN")?.trim();if(!r)return;let n=parseInt(t.get("QLOGIC_LLMROUTER_EMBEDDING_DIMENSIONS")||t.get("QMEMORY_EMBEDDING_DIMENSIONS")||"1024",10);return{baseUrl:e,apiKey:r,model:t.get("QLOGIC_LLMROUTER_EMBEDDING_MODEL")||"BAAI/bge-m3",dimensions:Number.isFinite(n)?n:1024,format:"openai",timeoutMs:$w(t)}}function DF(t){return{...Ew(t.provider,t.apiKey,{model:t.model,baseUrl:t.baseUrl})??{baseUrl:jw(t.baseUrl)||"",apiKey:t.apiKey,model:t.model,format:"openai"},timeoutMs:t.timeoutMs}}function jw(t){return t?.trim().replace(/\/+$/,"")??""}function $w(t){let e=parseInt(t.get("QMEMORY_EMBEDDING_TIMEOUT_MS")||"1500",10);return Number.isFinite(e)&&e>0?e:1500}function Uw(t){try{let e=LF();if(e){let r={ownerUserId:t.ownerUserId,userIdPrefix:t.userIdPrefix,embedding:t.embedding,createDatabase:e};return{provider:Lw(r),mode:"local"}}}catch(e){return{provider:null,mode:"none",error:`Local provider failed: ${e.message}`}}return{provider:null,mode:"none",error:"better-sqlite3 not available"}}function LF(){try{let e=NF(import.meta.url)("better-sqlite3"),r=e.default??e;if(typeof r!="function")return null;let n=r;return o=>new n(o)}catch{return null}}function Fw(){return Ow({config:kr(),pathService:I(),modelRegistry:D()})}var Hw="memory",Bw="Memory",OF=["add","replace","remove","create_file","write_file","read_file","delete_file","list_files","search","remember","temporal","feedback"],qw={type:"object",properties:{action:{type:"string",enum:OF,description:["Operation to perform:","","INDEX.md operations (project-level notes, always visible in system prompt):","- 'add' - Append a note to INDEX.md","- 'replace' - Replace text in INDEX.md (str_replace semantics)","- 'remove' - Remove text from INDEX.md","","Topic file operations (project-level, on-demand, for longer content):","- 'create_file' - Create a new .md topic file","- 'write_file' - Overwrite an existing topic file","- 'read_file' - Read a topic file","- 'delete_file' - Delete a topic file","- 'list_files' - List all memory topic files","","Long-term memory (user-level, persists across projects):","- 'remember' - Submit a fact/preference/lesson to the memory consolidation pipeline","- 'search' - Search long-term memory + local keyword match","- 'temporal' - Query memories by time range ('what happened last week')","","Feedback:","- 'feedback' - Mark memories as useful/irrelevant/outdated/wrong"].join(`
1008
1008
  `)},content:{type:"string",description:["Content for add/replace/create_file/write_file.","For INDEX.md notes: write concise, factual statements.","For topic files: can be longer (up to 8KB), use markdown formatting."].join(`
1009
1009
  `)},old_text:{type:"string",description:"For 'replace'/'remove': the exact text to find in INDEX.md."},new_text:{type:"string",description:"For 'replace': the replacement text."},file:{type:"string",description:"Filename for file operations (e.g. 'project-notes.md', 'lesson-esbuild.md'). Must be kebab-case .md."},query:{type:"string",description:"For 'search'/'temporal': natural language query to find relevant memories."},days:{type:"number",description:"For 'temporal': look back N days from today (default: 7)."},memory_ids:{type:"array",items:{type:"string"},description:"For 'feedback': IDs of memories to give feedback on."},signal:{type:"string",enum:["useful","irrelevant","outdated","wrong"],description:"For 'feedback': the feedback signal to apply."},category:{type:"string",enum:["preference","personal_fact","lesson","pattern","decision","context"],description:"For 'remember': categorize the memory (helps with future recall precision)."}},required:["action"]},Ww=["Manage persistent memory across sessions. Two distinct systems with clear roles:","","## Project memory (INDEX.md + topic files)","Scope: current project / workspace. Visible every turn.","Use for: architecture decisions, file conventions, build commands, known issues, task logs.","Actions: add, replace, remove, create_file, write_file, read_file, delete_file, list_files.","","## Long-term memory (QMemory)","Scope: user-level, persists across all projects. Searched on demand.","Use for: user preferences, personal facts, recurring lessons, communication style, past insights.","Actions: remember, search, temporal, feedback.","","## When to store (guidelines):","- User explicitly says 'remember this' or 'note that' -> submit a high-priority memory candidate","- User states a preference (style, format, tools, habits) -> remember (long-term)","- Project-specific decision or fact -> add/create_file (project memory)","- A debugging lesson or insight that applies broadly -> remember (long-term)","- DO NOT store: trivial/obvious info, one-off questions, transient state","- DO NOT store: information the user did not share or confirm","","## When to recall:","- Use 'search' when you suspect relevant past context exists for the current task","- Use 'temporal' to find what happened in a specific time period","- Memory is auto-recalled each turn - manual search is for deeper queries"].join(`
1010
- `),OF=[/ignore\s+(previous|all|above|prior)\s+instructions/i,/you\s+are\s+now\s+/i,/do\s+not\s+tell\s+the\s+user/i,/system\s+prompt\s+override/i];function jF(t){return!OF.some(e=>e.test(t))}async function Gw(t,e){let{action:r}=t,{memdir:n}=e;if(r==="add"){let o=t.content?.trim();if(!o)return{ok:!1,message:"content is required for 'add'.",action:r};let s=await n.addToIndex(o);return{ok:s.ok,message:s.message,action:r}}if(r==="replace"){let o=t.old_text?.trim(),s=t.new_text?.trim()||t.content?.trim();if(!o)return{ok:!1,message:"old_text is required for 'replace'.",action:r};if(!s)return{ok:!1,message:"new_text (or content) is required for 'replace'.",action:r};let i=await n.replaceInIndex(o,s);return{ok:i.ok,message:i.message,action:r}}if(r==="remove"){let o=t.old_text?.trim();if(!o)return{ok:!1,message:"old_text is required for 'remove'.",action:r};let s=await n.removeFromIndex(o);return{ok:s.ok,message:s.message,action:r}}if(r==="create_file"){let o=t.file?.trim(),s=t.content?.trim();if(!o)return{ok:!1,message:"file is required for 'create_file'.",action:r};if(!s)return{ok:!1,message:"content is required for 'create_file'.",action:r};let i=await n.createFile(o,s);return{ok:i.ok,message:i.message,action:r}}if(r==="write_file"){let o=t.file?.trim(),s=t.content?.trim();if(!o)return{ok:!1,message:"file is required for 'write_file'.",action:r};if(!s)return{ok:!1,message:"content is required for 'write_file'.",action:r};let i=await n.writeFile(o,s);return{ok:i.ok,message:i.message,action:r}}if(r==="read_file"){let o=t.file?.trim();if(!o)return{ok:!1,message:"file is required for 'read_file'.",action:r};let s=await n.readFile(o);return s.ok?{ok:!0,message:s.content,action:r}:{ok:!1,message:s.message,action:r}}if(r==="delete_file"){let o=t.file?.trim();if(!o)return{ok:!1,message:"file is required for 'delete_file'.",action:r};let s=await n.deleteFile(o);return{ok:s.ok,message:s.message,action:r}}if(r==="list_files"){let o=await n.listFiles();if(o.length===0)return{ok:!0,message:"No topic files yet. Use 'create_file' to create one.",action:r};let s=o.map(i=>{let a=(i.size/1024).toFixed(1),c=i.modifiedAt.slice(0,10);return`--${i.name} (${a}KB, ${c})${i.preview?""+i.preview:""}`}).join(`
1010
+ `),jF=[/ignore\s+(previous|all|above|prior)\s+instructions/i,/you\s+are\s+now\s+/i,/do\s+not\s+tell\s+the\s+user/i,/system\s+prompt\s+override/i];function $F(t){return!jF.some(e=>e.test(t))}async function Gw(t,e){let{action:r}=t,{memdir:n}=e;if(r==="add"){let o=t.content?.trim();if(!o)return{ok:!1,message:"content is required for 'add'.",action:r};let s=await n.addToIndex(o);return{ok:s.ok,message:s.message,action:r}}if(r==="replace"){let o=t.old_text?.trim(),s=t.new_text?.trim()||t.content?.trim();if(!o)return{ok:!1,message:"old_text is required for 'replace'.",action:r};if(!s)return{ok:!1,message:"new_text (or content) is required for 'replace'.",action:r};let i=await n.replaceInIndex(o,s);return{ok:i.ok,message:i.message,action:r}}if(r==="remove"){let o=t.old_text?.trim();if(!o)return{ok:!1,message:"old_text is required for 'remove'.",action:r};let s=await n.removeFromIndex(o);return{ok:s.ok,message:s.message,action:r}}if(r==="create_file"){let o=t.file?.trim(),s=t.content?.trim();if(!o)return{ok:!1,message:"file is required for 'create_file'.",action:r};if(!s)return{ok:!1,message:"content is required for 'create_file'.",action:r};let i=await n.createFile(o,s);return{ok:i.ok,message:i.message,action:r}}if(r==="write_file"){let o=t.file?.trim(),s=t.content?.trim();if(!o)return{ok:!1,message:"file is required for 'write_file'.",action:r};if(!s)return{ok:!1,message:"content is required for 'write_file'.",action:r};let i=await n.writeFile(o,s);return{ok:i.ok,message:i.message,action:r}}if(r==="read_file"){let o=t.file?.trim();if(!o)return{ok:!1,message:"file is required for 'read_file'.",action:r};let s=await n.readFile(o);return s.ok?{ok:!0,message:s.content,action:r}:{ok:!1,message:s.message,action:r}}if(r==="delete_file"){let o=t.file?.trim();if(!o)return{ok:!1,message:"file is required for 'delete_file'.",action:r};let s=await n.deleteFile(o);return{ok:s.ok,message:s.message,action:r}}if(r==="list_files"){let o=await n.listFiles();if(o.length===0)return{ok:!0,message:"No topic files yet. Use 'create_file' to create one.",action:r};let s=o.map(i=>{let a=(i.size/1024).toFixed(1),c=i.modifiedAt.slice(0,10);return`--${i.name} (${a}KB, ${c})${i.preview?""+i.preview:""}`}).join(`
1011
1011
  `);return{ok:!0,message:`Memory files (${o.length}):
1012
1012
  ${s}`,action:r}}if(r==="search"){let o=t.query?.trim();if(!o)return{ok:!1,message:"query is required for 'search'.",action:r};let s=[],i;try{let a=await n.searchLocal(o);a.length>0&&s.push(`## Local Memory
1013
1013
  `+a.map(c=>`--[${c.file}] ${c.snippet}`).join(`
@@ -1015,37 +1015,37 @@ ${s}`,action:r}}if(r==="search"){let o=t.query?.trim();if(!o)return{ok:!1,messag
1015
1015
  `+a.map((c,l)=>`${l+1}. ${c.text}`).join(`
1016
1016
  `))}catch{}return s.length===0?{ok:!0,message:"No matching memories found.",action:r,results:[]}:{ok:!0,message:s.join(`
1017
1017
 
1018
- `),action:r,results:i}}if(r==="remember"){if(!e.localProvider)return{ok:!1,message:"Long-term memory requires local memory provider.",action:r};let o=t.content?.trim();if(!o)return{ok:!1,message:"content is required for 'remember'.",action:r};if(!jF(o))return{ok:!1,message:"Content blocked by safety filter.",action:r};if(o.length<10)return{ok:!1,message:"Memory too short - provide a meaningful fact or insight (>=10 chars).",action:r};if(o.length>2e3)return{ok:!1,message:"Memory too long (max 2000 chars). Condense the insight.",action:r};try{return await e.localProvider.addText(o,e.userId,{source:"agent-remember",category:t.category??"lesson",importance:.7}),{ok:!0,message:`Stored to long-term memory: "${o.slice(0,80)}${o.length>80?"...":""}"`,action:r}}catch(s){return{ok:!1,message:`Failed to store: ${s instanceof Error?s.message:String(s)}`,action:r}}}if(r==="temporal"){if(!e.localProvider)return{ok:!1,message:"Temporal query requires local memory provider.",action:r};let o=t.days??7,s=Date.now()-o*864e5;return{ok:!0,message:e.localProvider.synthesizeTimeline(e.userId,s,Date.now()),action:r}}if(r==="feedback"){if(!e.localProvider)return{ok:!1,message:"Feedback requires local memory provider.",action:r};let o=t.memory_ids,s=t.signal;if(!o||o.length===0)return{ok:!1,message:"memory_ids is required for 'feedback'.",action:r};if(!s)return{ok:!1,message:"signal is required for 'feedback' (useful/irrelevant/outdated/wrong).",action:r};let i=await e.localProvider.feedback(o,s);return{ok:!0,message:`Feedback '${s}' applied to ${i.affected} memories.`,action:r}}return{ok:!1,message:`Unknown action: "${r}".`,action:r}}function zw(t,e){return{recallProvider:t,runtimeHookProvider:t,learningSink:t,toolProvider:t,handlerProvider:t,dreamProvider:t,userId:e}}function kp(t){try{let e=Fw(),r=Uw(e);if(r.provider)return zw(r.provider,e.ownerUserId||t)}catch{}return zw(null,t)}function Kw(t){let e=kp(t.currentUserId);return!e.recallProvider||!e.runtimeHookProvider||!e.userId||(Qp(t.hooks,{memoryProvider:e.recallProvider,localMemoryProvider:e.runtimeHookProvider,userId:e.userId,log:{debug:r=>t.log.debug(r),warn:r=>t.log.warn(r)},getLastUserMessage:t.getLastUserMessage,getLastAssistantMessage:t.getLastAssistantMessage,llmExtract:async r=>{let n=t.resolveSmallModelClient();if(!n)return null;try{let o="";for await(let s of n.transport.stream({model:n.model,messages:[{role:"user",content:r}],tools:[],maxTokens:512},n.apiKey))s.type==="delta"&&(o+=s.text);return o.trim()||null}catch{return null}}},t.prefetchState),t.log.info("[memory] local provider initialized")),e}function Vw(t){t.toolCatalog.addTool({name:Hw,label:Bw,description:Ww,parameters:qw,execute:async(e,r)=>{let n=t.memoryUserId?t.memoryProvider??void 0:void 0,o=await Gw(r,{memdir:t.memdir,provider:n,localProvider:n,userId:t.memoryUserId});return{content:[{type:"text",text:o.message}],details:{type:"memory",action:o.action,ok:o.ok}}}})}import{Buffer as Xw}from"node:buffer";function Yw(t){let e=async(r,n)=>{let o="";for await(let s of r.transport.stream(n,r.apiKey))s.type==="delta"&&(o+=s.text);return o.trim()};return{createPetSoulGenerator(){let r=t.resolveClientForPurpose("smallModel");if(r)return async n=>{let o=`\u4F60\u662F\u684C\u9762\u5BA0\u7269\u7075\u9B42\u751F\u6210\u5668\u3002\u4E25\u683C\u8F93\u51FA JSON\uFF0C\u5305\u542B name\u3001personality\u3001catchphrase\u3002 \u7A00\u6709\u5EA6: ${n}\u3002\u540D\u5B57 2-4 \u4E2A\u4E2D\u6587\u5B57\u7B26\uFF0C\u6027\u683C 15 \u5B57\u5185\uFF0C\u53E3\u5934\u7985 6 \u5B57\u5185\u3002`;try{let i=(await e(r,{model:r.model,messages:[{role:"user",content:o}],maxTokens:100})).match(/\{[\s\S]*\}/);if(i){let a=JSON.parse(i[0]);if(a.name&&a.personality&&a.catchphrase)return{name:String(a.name).slice(0,8),personality:String(a.personality).slice(0,30),catchphrase:String(a.catchphrase).slice(0,12)}}}catch{}throw new Error("LLM_GENERATION_FAILED")}},createSmallLLMCall(){let r=t.resolveClientForPurpose("smallModel")??t.resolveClientForPurpose("textGeneration");if(r)return async(n,o)=>{try{return await e(r,{model:r.model,messages:[{role:"user",content:n}],maxTokens:o})||null}catch{return null}}},async forgeAnalyzeImage(r,n){let o=t.resolveClientForPurpose("imageUnderstanding");if(!o)throw new Error("No vision model available for image analysis");let s=["Analyze this character image for a 200x200 animated SVG desktop pet.","Return a concise plain-text character description covering species, colors, body shape, key features, eyes, and style.",n?`User hint: ${n}`:""].filter(Boolean).join(`
1019
- `);return await e(o,{model:o.model,messages:[{role:"user",content:s,imageUrls:[`data:image/png;base64,${r}`]}],maxTokens:200})||n||"A cute rounded desktop pet character"},async forgeGenerateSkeleton(r){let n=t.resolveClientForPurpose("textGeneration");if(!n)throw new Error("No model available for skeleton generation");let s=(await e(n,{model:n.model,messages:[{role:"user",content:Ru(r)}],maxTokens:6e3})).match(/<svg[\s\S]*?<\/svg>/i);if(!s)throw new Error("Failed to generate skeleton SVG");return s[0]},async forgeScoreConsistency(r,n,o,s){let i=t.resolveClientForPurpose("imageUnderstanding");if(!i)throw new Error("No vision model available for consistency scoring");let a=`data:image/svg+xml;base64,${Xw.from(r).toString("base64")}`,c=`data:image/svg+xml;base64,${Xw.from(n).toString("base64")}`,l=await e(i,{model:i.model,messages:[{role:"user",content:Su(s,o),imageUrls:[a,c]}],maxTokens:200});return Tu(l)},async awardXp(r){try{let n=new xt(t.getActiveProjectRoot()),o=n.load();if(!o)return;let s=oe.xpForEvent(r),{newLevel:i,newXp:a,events:c,statBoosts:l}=oe.processXpGain(o,s);o.level=i,o.experience=a;for(let[d,p]of Object.entries(l)){let u=d;o.stats[u]=Math.min(10,o.stats[u]+(p??0))}n.updateSoul(o),t.sendNotification("pet.growth",{level:i,experience:a,xpNeeded:oe.xpForLevel(i),displayTraits:oe.getUnlockedDisplayTraits(i).map(d=>({id:d.id,name:d.name,description:d.description,level:d.unlockedAtLevel,surface:d.surface}))});for(let d of c)d.type==="molt"?t.sendNotification("pet.reaction",{text:`\u5BA0\u7269\u8715\u53D8\uFF1A\u7B2C ${d.moltStage} \u9636\u6BB5`,style:"excited"}):d.type==="display_trait_unlock"&&d.displayTrait&&t.sendNotification("pet.reaction",{text:`Display trait unlocked: ${d.displayTrait.name}`,style:"excited"})}catch{}},async reactAfterTurn(r){try{let o=new xt(t.getActiveProjectRoot()).load(),s=t.resolveClientForPurpose("smallModel");if(o&&s){let a=[...r].reverse().find(d=>d.role==="assistant"),c=typeof a?.content=="string"?a.content.slice(0,100):"Task completed.",l=await ko({turnSummary:c,soul:o},async(d,p)=>await e(s,{model:s.model,messages:[{role:"user",content:d}],maxTokens:p})||null);if(l){t.sendNotification("pet.reaction",{text:l.text,style:l.style,duration:1e4});return}}let i=bo("turn.end");i&&t.sendNotification("pet.reaction",{text:i.text,style:i.style,duration:1e4})}catch{}},isActive(){return new xt(t.getActiveProjectRoot()).load()!==null}}}Fe();var $F=[{purpose:"imageGeneration",capability:"image"},{purpose:"tts",capability:"tts"},{purpose:"videoGeneration",capability:"video"},{purpose:"musicGeneration",capability:"music"},{purpose:"threeDGeneration",capability:"3d"},{purpose:"stt",capability:"stt"},{purpose:"voiceClone",capability:"voice_clone"}];function UF(t){let e={};for(let{purpose:r,capability:n}of $F){let o=t.getBinding(r);o&&(e[n]={provider:o.provider,model:o.nativeModelId??o.model})}return e}function Jw(t){let{host:e,config:r,turnId:n}=t,o=D(),s=o.snapshotProviderKeys();e.currentMediaApiKeys=s;let i={...UF(o),...r?.mediaProviders};qd(e.mediaClient,s,(c,l,d)=>{e.sessionState?.addMediaUsage(c,l,d)},i,(c,l,d,p,u)=>{e.sendNotification("turn.media_progress",{turnId:n,taskId:c,mediaType:l,percent:d,status:p,...u?{provider:u}:{}})});let a=o.getActiveModel("textGeneration");a?(si(vv(a.provider,a.apiKey)),a.keyHandle.release({success:!0})):si(void 0)}function Qw(t){let e=new yv,r=new hv({registry:e}),n=new ga,o=tr(),s=bb(o),i=new fa(n,s),a=Yw({getActiveProjectRoot:t.getActiveProjectRoot,resolveClientForPurpose:t.resolveClientForPurpose,sendNotification:t.sendNotification});return{providerRegistry:e,mediaClient:r,mediaPersistence:n,pathService:i,toolCatalog:o,toolBootstrap:s,petRuntime:a,configureTurnMedia:c=>Jw({...c,host:{...c.host,mediaClient:r}}),ensureMemoryProvider:c=>kp(c),closeMemoryProviders:FF}}function FF(t){let e=new Set;for(let r of[t.memoryProvider,t.memoryDreamProvider]){if(!r||e.has(r))continue;e.add(r);let n=r.close;if(typeof n=="function")try{n.call(r)}catch{}}}function Zw(t){let e=Qw({getActiveProjectRoot:t.getActiveProjectRoot,resolveClientForPurpose:t.resolveClientForPurpose,sendNotification:t.sendNotification});return Tw({verbose:t.verbose,toolBootstrap:e.toolBootstrap,log:t.log,sendNotification:t.sendNotification}),e}var HF="agent",eA=["general","explore","plan","code","research","verify"],BF={type:"object",properties:{agent:{type:"string",enum:["general","explore","plan","code","research","verify"],description:`Sub-agent type to fork:
1018
+ `),action:r,results:i}}if(r==="remember"){if(!e.localProvider)return{ok:!1,message:"Long-term memory requires local memory provider.",action:r};let o=t.content?.trim();if(!o)return{ok:!1,message:"content is required for 'remember'.",action:r};if(!$F(o))return{ok:!1,message:"Content blocked by safety filter.",action:r};if(o.length<10)return{ok:!1,message:"Memory too short - provide a meaningful fact or insight (>=10 chars).",action:r};if(o.length>2e3)return{ok:!1,message:"Memory too long (max 2000 chars). Condense the insight.",action:r};try{return await e.localProvider.addText(o,e.userId,{source:"agent-remember",category:t.category??"lesson",importance:.7}),{ok:!0,message:`Stored to long-term memory: "${o.slice(0,80)}${o.length>80?"...":""}"`,action:r}}catch(s){return{ok:!1,message:`Failed to store: ${s instanceof Error?s.message:String(s)}`,action:r}}}if(r==="temporal"){if(!e.localProvider)return{ok:!1,message:"Temporal query requires local memory provider.",action:r};let o=t.days??7,s=Date.now()-o*864e5;return{ok:!0,message:e.localProvider.synthesizeTimeline(e.userId,s,Date.now()),action:r}}if(r==="feedback"){if(!e.localProvider)return{ok:!1,message:"Feedback requires local memory provider.",action:r};let o=t.memory_ids,s=t.signal;if(!o||o.length===0)return{ok:!1,message:"memory_ids is required for 'feedback'.",action:r};if(!s)return{ok:!1,message:"signal is required for 'feedback' (useful/irrelevant/outdated/wrong).",action:r};let i=await e.localProvider.feedback(o,s);return{ok:!0,message:`Feedback '${s}' applied to ${i.affected} memories.`,action:r}}return{ok:!1,message:`Unknown action: "${r}".`,action:r}}function zw(t,e){return{recallProvider:t,runtimeHookProvider:t,learningSink:t,toolProvider:t,handlerProvider:t,dreamProvider:t,userId:e}}function kp(t){try{let e=Fw(),r=Uw(e);if(r.provider)return zw(r.provider,e.ownerUserId||t)}catch{}return zw(null,t)}function Kw(t){let e=kp(t.currentUserId);return!e.recallProvider||!e.runtimeHookProvider||!e.userId||(Qp(t.hooks,{memoryProvider:e.recallProvider,localMemoryProvider:e.runtimeHookProvider,userId:e.userId,log:{debug:r=>t.log.debug(r),warn:r=>t.log.warn(r)},getLastUserMessage:t.getLastUserMessage,getLastAssistantMessage:t.getLastAssistantMessage,llmExtract:async r=>{let n=t.resolveSmallModelClient();if(!n)return null;try{let o="";for await(let s of n.transport.stream({model:n.model,messages:[{role:"user",content:r}],tools:[],maxTokens:512},n.apiKey))s.type==="delta"&&(o+=s.text);return o.trim()||null}catch{return null}}},t.prefetchState),t.log.info("[memory] local provider initialized")),e}function Vw(t){t.toolCatalog.addTool({name:Hw,label:Bw,description:Ww,parameters:qw,execute:async(e,r)=>{let n=t.memoryUserId?t.memoryProvider??void 0:void 0,o=await Gw(r,{memdir:t.memdir,provider:n,localProvider:n,userId:t.memoryUserId});return{content:[{type:"text",text:o.message}],details:{type:"memory",action:o.action,ok:o.ok}}}})}import{Buffer as Xw}from"node:buffer";function Yw(t){let e=async(r,n)=>{let o="";for await(let s of r.transport.stream(n,r.apiKey))s.type==="delta"&&(o+=s.text);return o.trim()};return{createPetSoulGenerator(){let r=t.resolveClientForPurpose("smallModel");if(r)return async n=>{let o=`\u4F60\u662F\u684C\u9762\u5BA0\u7269\u7075\u9B42\u751F\u6210\u5668\u3002\u4E25\u683C\u8F93\u51FA JSON\uFF0C\u5305\u542B name\u3001personality\u3001catchphrase\u3002 \u7A00\u6709\u5EA6: ${n}\u3002\u540D\u5B57 2-4 \u4E2A\u4E2D\u6587\u5B57\u7B26\uFF0C\u6027\u683C 15 \u5B57\u5185\uFF0C\u53E3\u5934\u7985 6 \u5B57\u5185\u3002`;try{let i=(await e(r,{model:r.model,messages:[{role:"user",content:o}],maxTokens:100})).match(/\{[\s\S]*\}/);if(i){let a=JSON.parse(i[0]);if(a.name&&a.personality&&a.catchphrase)return{name:String(a.name).slice(0,8),personality:String(a.personality).slice(0,30),catchphrase:String(a.catchphrase).slice(0,12)}}}catch{}throw new Error("LLM_GENERATION_FAILED")}},createSmallLLMCall(){let r=t.resolveClientForPurpose("smallModel")??t.resolveClientForPurpose("textGeneration");if(r)return async(n,o)=>{try{return await e(r,{model:r.model,messages:[{role:"user",content:n}],maxTokens:o})||null}catch{return null}}},async forgeAnalyzeImage(r,n){let o=t.resolveClientForPurpose("imageUnderstanding");if(!o)throw new Error("No vision model available for image analysis");let s=["Analyze this character image for a 200x200 animated SVG desktop pet.","Return a concise plain-text character description covering species, colors, body shape, key features, eyes, and style.",n?`User hint: ${n}`:""].filter(Boolean).join(`
1019
+ `);return await e(o,{model:o.model,messages:[{role:"user",content:s,imageUrls:[`data:image/png;base64,${r}`]}],maxTokens:200})||n||"A cute rounded desktop pet character"},async forgeGenerateSkeleton(r){let n=t.resolveClientForPurpose("textGeneration");if(!n)throw new Error("No model available for skeleton generation");let s=(await e(n,{model:n.model,messages:[{role:"user",content:Ru(r)}],maxTokens:6e3})).match(/<svg[\s\S]*?<\/svg>/i);if(!s)throw new Error("Failed to generate skeleton SVG");return s[0]},async forgeScoreConsistency(r,n,o,s){let i=t.resolveClientForPurpose("imageUnderstanding");if(!i)throw new Error("No vision model available for consistency scoring");let a=`data:image/svg+xml;base64,${Xw.from(r).toString("base64")}`,c=`data:image/svg+xml;base64,${Xw.from(n).toString("base64")}`,l=await e(i,{model:i.model,messages:[{role:"user",content:Su(s,o),imageUrls:[a,c]}],maxTokens:200});return Tu(l)},async awardXp(r){try{let n=new xt(t.getActiveProjectRoot()),o=n.load();if(!o)return;let s=oe.xpForEvent(r),{newLevel:i,newXp:a,events:c,statBoosts:l}=oe.processXpGain(o,s);o.level=i,o.experience=a;for(let[d,p]of Object.entries(l)){let u=d;o.stats[u]=Math.min(10,o.stats[u]+(p??0))}n.updateSoul(o),t.sendNotification("pet.growth",{level:i,experience:a,xpNeeded:oe.xpForLevel(i),displayTraits:oe.getUnlockedDisplayTraits(i).map(d=>({id:d.id,name:d.name,description:d.description,level:d.unlockedAtLevel,surface:d.surface}))});for(let d of c)d.type==="molt"?t.sendNotification("pet.reaction",{text:`\u5BA0\u7269\u8715\u53D8\uFF1A\u7B2C ${d.moltStage} \u9636\u6BB5`,style:"excited"}):d.type==="display_trait_unlock"&&d.displayTrait&&t.sendNotification("pet.reaction",{text:`Display trait unlocked: ${d.displayTrait.name}`,style:"excited"})}catch{}},async reactAfterTurn(r){try{let o=new xt(t.getActiveProjectRoot()).load(),s=t.resolveClientForPurpose("smallModel");if(o&&s){let a=[...r].reverse().find(d=>d.role==="assistant"),c=typeof a?.content=="string"?a.content.slice(0,100):"Task completed.",l=await ko({turnSummary:c,soul:o},async(d,p)=>await e(s,{model:s.model,messages:[{role:"user",content:d}],maxTokens:p})||null);if(l){t.sendNotification("pet.reaction",{text:l.text,style:l.style,duration:1e4});return}}let i=bo("turn.end");i&&t.sendNotification("pet.reaction",{text:i.text,style:i.style,duration:1e4})}catch{}},isActive(){return new xt(t.getActiveProjectRoot()).load()!==null}}}Fe();var UF=[{purpose:"imageGeneration",capability:"image"},{purpose:"tts",capability:"tts"},{purpose:"videoGeneration",capability:"video"},{purpose:"musicGeneration",capability:"music"},{purpose:"threeDGeneration",capability:"3d"},{purpose:"stt",capability:"stt"},{purpose:"voiceClone",capability:"voice_clone"}];function FF(t){let e={};for(let{purpose:r,capability:n}of UF){let o=t.getBinding(r);o&&(e[n]={provider:o.provider,model:o.nativeModelId??o.model})}return e}function Jw(t){let{host:e,config:r,turnId:n}=t,o=D(),s=o.snapshotProviderKeys();e.currentMediaApiKeys=s;let i={...FF(o),...r?.mediaProviders};qd(e.mediaClient,s,(c,l,d)=>{e.sessionState?.addMediaUsage(c,l,d)},i,(c,l,d,p,u)=>{e.sendNotification("turn.media_progress",{turnId:n,taskId:c,mediaType:l,percent:d,status:p,...u?{provider:u}:{}})});let a=o.getActiveModel("textGeneration");a?(si(vv(a.provider,a.apiKey)),a.keyHandle.release({success:!0})):si(void 0)}function Qw(t){let e=new yv,r=new hv({registry:e}),n=new ga,o=tr(),s=bb(o),i=new fa(n,s),a=Yw({getActiveProjectRoot:t.getActiveProjectRoot,resolveClientForPurpose:t.resolveClientForPurpose,sendNotification:t.sendNotification});return{providerRegistry:e,mediaClient:r,mediaPersistence:n,pathService:i,toolCatalog:o,toolBootstrap:s,petRuntime:a,configureTurnMedia:c=>Jw({...c,host:{...c.host,mediaClient:r}}),ensureMemoryProvider:c=>kp(c),closeMemoryProviders:HF}}function HF(t){let e=new Set;for(let r of[t.memoryProvider,t.memoryDreamProvider]){if(!r||e.has(r))continue;e.add(r);let n=r.close;if(typeof n=="function")try{n.call(r)}catch{}}}function Zw(t){let e=Qw({getActiveProjectRoot:t.getActiveProjectRoot,resolveClientForPurpose:t.resolveClientForPurpose,sendNotification:t.sendNotification});return Tw({verbose:t.verbose,toolBootstrap:e.toolBootstrap,log:t.log,sendNotification:t.sendNotification}),e}var BF="agent",eA=["general","explore","plan","code","research","verify"],qF={type:"object",properties:{agent:{type:"string",enum:["general","explore","plan","code","research","verify"],description:`Sub-agent type to fork:
1020
1020
  - general: Full tool access, any task
1021
1021
  - explore: Read-only codebase exploration (search, read, analyze)
1022
1022
  - plan: Planning mode (explore + produce plan, no writes)
1023
1023
  - code: Coding agent with full tool access
1024
1024
  - research: Web research and information gathering
1025
- - verify: Run tests, check builds, validate changes`},prompt:{type:"string",description:"Detailed task for the sub-agent. The sub-agent shares your conversation history as context (prompt cache shared). Be specific about what information to return in the final response."},description:{type:"string",description:"Short description (3-7 words) for status tracking."},maxTurns:{type:"number",description:"Max turns for the sub-agent. Defaults: general=200, explore=50, plan=80, code=200, research=30, verify=40."},background:{type:"boolean",description:"If true, runs in background and returns a task_id. Poll with task tool. Default: false."}},required:["agent","prompt"],additionalProperties:!1},tA=4;function rA(t){return{name:HF,label:"Sub-Agent",description:"Fork a sub-agent to handle complex tasks autonomously. Sub-agents share your conversation context (prompt cache) and have isolated tool state. Use for: parallel research, code exploration, testing, delegating large tasks to specialized agents.",parameters:BF,searchHint:"fork subagent delegate spawn child parallel worker",isConcurrencySafe:!0,execute:async(e,r)=>{if(!r.prompt||r.prompt.trim().length<10)return{content:[{type:"text",text:"Error: prompt must be at least 10 characters."}],details:{type:"agent",error:"prompt_too_short"}};if(!eA.includes(r.agent))return{content:[{type:"text",text:`Error: unknown agent "${r.agent}". Available: ${eA.join(", ")}`}],details:{type:"agent",error:"invalid_agent_type"}};let n=t.currentForkDepth??0;if(n>=tA)return{content:[{type:"text",text:`Error: maximum fork depth (${tA}) reached. Cannot spawn more sub-agents. Complete current work instead.`}],details:{type:"agent",error:"max_depth_reached",depth:n}};try{let o=await t.forkAgent({agent:r.agent,prompt:r.prompt.trim(),description:r.description,maxTurns:r.maxTurns,background:r.background,abortSignal:t.abortSignal});if(r.background&&o.status==="running")return{content:[{type:"text",text:`Sub-agent "${r.agent}" started in background.
1025
+ - verify: Run tests, check builds, validate changes`},prompt:{type:"string",description:"Detailed task for the sub-agent. The sub-agent shares your conversation history as context (prompt cache shared). Be specific about what information to return in the final response."},description:{type:"string",description:"Short description (3-7 words) for status tracking."},maxTurns:{type:"number",description:"Max turns for the sub-agent. Defaults: general=200, explore=50, plan=80, code=200, research=30, verify=40."},background:{type:"boolean",description:"If true, runs in background and returns a task_id. Poll with task tool. Default: false."}},required:["agent","prompt"],additionalProperties:!1},tA=4;function rA(t){return{name:BF,label:"Sub-Agent",description:"Fork a sub-agent to handle complex tasks autonomously. Sub-agents share your conversation context (prompt cache) and have isolated tool state. Use for: parallel research, code exploration, testing, delegating large tasks to specialized agents.",parameters:qF,searchHint:"fork subagent delegate spawn child parallel worker",isConcurrencySafe:!0,execute:async(e,r)=>{if(!r.prompt||r.prompt.trim().length<10)return{content:[{type:"text",text:"Error: prompt must be at least 10 characters."}],details:{type:"agent",error:"prompt_too_short"}};if(!eA.includes(r.agent))return{content:[{type:"text",text:`Error: unknown agent "${r.agent}". Available: ${eA.join(", ")}`}],details:{type:"agent",error:"invalid_agent_type"}};let n=t.currentForkDepth??0;if(n>=tA)return{content:[{type:"text",text:`Error: maximum fork depth (${tA}) reached. Cannot spawn more sub-agents. Complete current work instead.`}],details:{type:"agent",error:"max_depth_reached",depth:n}};try{let o=await t.forkAgent({agent:r.agent,prompt:r.prompt.trim(),description:r.description,maxTurns:r.maxTurns,background:r.background,abortSignal:t.abortSignal});if(r.background&&o.status==="running")return{content:[{type:"text",text:`Sub-agent "${r.agent}" started in background.
1026
1026
  Agent ID: ${o.agentId}
1027
1027
  Use task tool with this ID to check status and get output.`}],details:{type:"agent",agentId:o.agentId,status:"running",background:!0}};if(o.status==="failed")return{content:[{type:"text",text:`Sub-agent failed: ${o.error||"unknown error"}`}],details:{type:"agent",agentId:o.agentId,status:"failed",error:o.error}};let s=o.output||"(sub-agent returned no output)",i=o.maxTurnsReached?`
1028
1028
 
1029
- [Note: Sub-agent reached turn limit. Output may be incomplete.]`:"";return{content:[{type:"text",text:s+i}],details:{type:"agent",agentId:o.agentId,status:"completed",tokensUsed:o.tokensUsed,maxTurnsReached:o.maxTurnsReached}}}catch(o){let s=o instanceof Error?o.message:String(o);return{content:[{type:"text",text:`Sub-agent execution failed: ${s}`}],details:{type:"agent",error:"execution_error",message:s}}}}}}import{randomUUID as qF}from"node:crypto";function nA({host:t,hooks:e,log:r,toolCatalog:n,toolInvoker:o}){return{abortSignal:void 0,currentForkDepth:0,forkAgent:async s=>{let i=Vn(s.agent);if(!i)return{agentId:"",status:"failed",error:`Unknown agent type: ${s.agent}`};if(!t.agent||!t.currentTransport||!t.currentApiKey||!t.currentModel)return{agentId:"",status:"failed",error:"No LLM provider configured"};let a=n.getToolNames(),c=dl(a,i),d=n.getToolManifest().filter(h=>c.includes(h.function.name)),p=Ud(d,!0),u=s.maxTurns??i.maxTurns??200;if(ht.isTeamBudgetExceeded())return{agentId:`fork-${s.agent}-budget-exceeded`,status:"failed",output:void 0,error:ht.teamBudgetExceededError(),tokensUsed:0};let m=await Jr({promptMessages:[{role:"user",content:s.prompt}],tools:p,transport:t.currentTransport,toolInvoker:o,createAgentRunner:on,apiKey:t.currentApiKey,model:t.currentModel,log:r,hooks:e,forkLabel:`agent-${s.agent}`,maxTurns:u,parentSignal:s.abortSignal,parentDepth:0,onEvent:h=>{h.type==="delta"&&h.text&&t.sendNotification("turn.subagent_delta",{agentType:s.agent,text:h.text})}}),f=m.events.filter(h=>h.type==="end"&&"content"in h).map(h=>h.content??"").join("")||m.events.filter(h=>h.type==="delta"&&"text"in h).map(h=>h.text).join(""),g=m.totalUsage.inputTokens+m.totalUsage.outputTokens;return ht.recordForkTokens(g),{agentId:`fork-${s.agent}-${qF().slice(0,8)}`,status:m.ok?"completed":"failed",output:f||void 0,error:m.error,tokensUsed:g}}}}function oA({host:t,hooks:e,log:r,toolCatalog:n,toolInvoker:o}){n.addTool(rA(nA({host:t,hooks:e,log:r,toolCatalog:n,toolInvoker:o})))}var WF="checkpoint",GF={type:"object",properties:{action:{type:"string",enum:["create","list","restore","diff"],description:"Action: create (snapshot current state), list (show checkpoints), restore (revert to checkpoint), diff (show changes since checkpoint)."},checkpointId:{type:"string",description:"Checkpoint ID. Required for restore and diff."},message:{type:"string",description:"Optional descriptive message for the checkpoint."},paths:{type:"array",items:{type:"string"},description:"File paths to restore (partial restore). Omit to restore everything."}},required:["action"]},sA=/^[0-9a-fA-F]{4,64}$/;function iA(t){return{name:WF,label:"Checkpoint",description:"Manage workspace checkpoints (shadow snapshots independent of user's git). Create snapshots before risky operations, list history, restore on errors, or diff to see what changed. Checkpoints do NOT affect user's .git.",parameters:GF,execute:async(e,r)=>{switch(r.action){case"create":{let n=await t.createCheckpoint(r.message);return n.success?{content:[{type:"text",text:`Checkpoint created: ${n.checkpoint.id}
1029
+ [Note: Sub-agent reached turn limit. Output may be incomplete.]`:"";return{content:[{type:"text",text:s+i}],details:{type:"agent",agentId:o.agentId,status:"completed",tokensUsed:o.tokensUsed,maxTurnsReached:o.maxTurnsReached}}}catch(o){let s=o instanceof Error?o.message:String(o);return{content:[{type:"text",text:`Sub-agent execution failed: ${s}`}],details:{type:"agent",error:"execution_error",message:s}}}}}}import{randomUUID as WF}from"node:crypto";function nA({host:t,hooks:e,log:r,toolCatalog:n,toolInvoker:o}){return{abortSignal:void 0,currentForkDepth:0,forkAgent:async s=>{let i=Vn(s.agent);if(!i)return{agentId:"",status:"failed",error:`Unknown agent type: ${s.agent}`};if(!t.agent||!t.currentTransport||!t.currentApiKey||!t.currentModel)return{agentId:"",status:"failed",error:"No LLM provider configured"};let a=n.getToolNames(),c=dl(a,i),d=n.getToolManifest().filter(h=>c.includes(h.function.name)),p=Ud(d,!0),u=s.maxTurns??i.maxTurns??200;if(ht.isTeamBudgetExceeded())return{agentId:`fork-${s.agent}-budget-exceeded`,status:"failed",output:void 0,error:ht.teamBudgetExceededError(),tokensUsed:0};let m=await Jr({promptMessages:[{role:"user",content:s.prompt}],tools:p,transport:t.currentTransport,toolInvoker:o,createAgentRunner:on,apiKey:t.currentApiKey,model:t.currentModel,log:r,hooks:e,forkLabel:`agent-${s.agent}`,maxTurns:u,parentSignal:s.abortSignal,parentDepth:0,onEvent:h=>{h.type==="delta"&&h.text&&t.sendNotification("turn.subagent_delta",{agentType:s.agent,text:h.text})}}),f=m.events.filter(h=>h.type==="end"&&"content"in h).map(h=>h.content??"").join("")||m.events.filter(h=>h.type==="delta"&&"text"in h).map(h=>h.text).join(""),g=m.totalUsage.inputTokens+m.totalUsage.outputTokens;return ht.recordForkTokens(g),{agentId:`fork-${s.agent}-${WF().slice(0,8)}`,status:m.ok?"completed":"failed",output:f||void 0,error:m.error,tokensUsed:g}}}}function oA({host:t,hooks:e,log:r,toolCatalog:n,toolInvoker:o}){n.addTool(rA(nA({host:t,hooks:e,log:r,toolCatalog:n,toolInvoker:o})))}var GF="checkpoint",zF={type:"object",properties:{action:{type:"string",enum:["create","list","restore","diff"],description:"Action: create (snapshot current state), list (show checkpoints), restore (revert to checkpoint), diff (show changes since checkpoint)."},checkpointId:{type:"string",description:"Checkpoint ID. Required for restore and diff."},message:{type:"string",description:"Optional descriptive message for the checkpoint."},paths:{type:"array",items:{type:"string"},description:"File paths to restore (partial restore). Omit to restore everything."}},required:["action"]},sA=/^[0-9a-fA-F]{4,64}$/;function iA(t){return{name:GF,label:"Checkpoint",description:"Manage workspace checkpoints (shadow snapshots independent of user's git). Create snapshots before risky operations, list history, restore on errors, or diff to see what changed. Checkpoints do NOT affect user's .git.",parameters:zF,execute:async(e,r)=>{switch(r.action){case"create":{let n=await t.createCheckpoint(r.message);return n.success?{content:[{type:"text",text:`Checkpoint created: ${n.checkpoint.id}
1030
1030
  Message: ${n.checkpoint.message}
1031
1031
  Files: ${n.checkpoint.fileCount}`}],details:{type:"checkpoint",action:"create",checkpointId:n.checkpoint.id}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"checkpoint",error:n.error}}}case"list":{let n=await t.listCheckpoints();if(!n.checkpoints||n.checkpoints.length===0)return{content:[{type:"text",text:"No checkpoints available."}],details:{type:"checkpoint",action:"list",count:0}};let o=[`Checkpoints (${n.checkpoints.length}):`,""];for(let s of n.checkpoints)o.push(`- ${s.id.slice(0,8)} [${s.timestamp}] ${s.message} (${s.fileCount} files)`);return{content:[{type:"text",text:o.join(`
1032
1032
  `)}],details:{type:"checkpoint",action:"list",count:n.checkpoints.length}}}case"restore":{if(!r.checkpointId)return{content:[{type:"text",text:"Error: checkpointId required for restore."}],details:{type:"checkpoint",error:"missing_id"}};if(!sA.test(r.checkpointId))return{content:[{type:"text",text:"Error: invalid checkpoint ID format."}],details:{type:"checkpoint",error:"invalid_id"}};let n=await t.restoreCheckpoint(r.checkpointId,r.paths);if(!n.success)return{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"checkpoint",error:n.error}};let o=r.paths?`(${r.paths.length} files)`:"(full workspace)";return{content:[{type:"text",text:`Restored to checkpoint ${r.checkpointId.slice(0,8)} ${o}`}],details:{type:"checkpoint",action:"restore",checkpointId:r.checkpointId}}}case"diff":{if(!r.checkpointId)return{content:[{type:"text",text:"Error: checkpointId required for diff."}],details:{type:"checkpoint",error:"missing_id"}};if(!sA.test(r.checkpointId))return{content:[{type:"text",text:"Error: invalid checkpoint ID format."}],details:{type:"checkpoint",error:"invalid_id"}};let n=await t.diffCheckpoint(r.checkpointId);return n.success?{content:[{type:"text",text:n.diff||"(no changes since checkpoint)"}],details:{type:"checkpoint",action:"diff",checkpointId:r.checkpointId}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"checkpoint",error:n.error}}}default:return{content:[{type:"text",text:`Error: unknown action "${r.action}".`}],details:{type:"checkpoint",error:"unknown_action"}}}}}}G();import*as Ye from"node:fs";import*as wn from"node:path";function aA(t,e){let r=im(t,e);return{createCheckpoint:async n=>{try{Ye.mkdirSync(r,{recursive:!0});let{execSync:o}=await import("node:child_process"),s=wn.join(r,".git");Ye.existsSync(s)||(o("git init",{cwd:r,stdio:"pipe"}),o('git config user.email "checkpoint@agent"',{cwd:r,stdio:"pipe"}),o('git config user.name "Checkpoint"',{cwd:r,stdio:"pipe"})),Ye.cpSync(t,r,{recursive:!0,filter:l=>!l.includes(".git")&&!l.includes("node_modules")}),o("git add -A",{cwd:r,stdio:"pipe"});let i=n||`checkpoint ${new Date().toISOString()}`;o(`git commitallow-empty -m "${i.replace(/"/g,'\\"')}"`,{cwd:r,stdio:"pipe"});let a=o("git rev-parse HEAD",{cwd:r,stdio:"pipe"}).toString().trim(),c=parseInt(o("git ls-files | wc -l",{cwd:r,stdio:"pipe"}).toString().trim(),10)||0;return{success:!0,checkpoint:{id:a,message:i,timestamp:new Date().toISOString(),fileCount:c}}}catch(o){return{success:!1,error:o.message}}},listCheckpoints:async()=>{try{let{execSync:n}=await import("node:child_process"),o=wn.join(r,".git");if(!Ye.existsSync(o))return{success:!0,checkpoints:[]};let s=n('git logformat="%H|%aI|%s"max-count=20',{cwd:r,stdio:"pipe"}).toString().trim();return s?{success:!0,checkpoints:s.split(`
1033
- `).map(a=>{let[c="",l="",...d]=a.split("|");return{id:c,timestamp:l,message:d.join("|"),fileCount:0}})}:{success:!0,checkpoints:[]}}catch(n){return{success:!1,error:n.message}}},restoreCheckpoint:async(n,o)=>{try{let{execSync:s}=await import("node:child_process");if(o&&o.length>0){s(`git checkout ${n} ${o.map(i=>`"${i.replace(/"/g,'\\"')}"`).join(" ")}`,{cwd:r,stdio:"pipe"});for(let i of o){let a=wn.join(r,i),c=wn.join(t,i);Ye.existsSync(a)&&Ye.cpSync(a,c,{recursive:!0})}}else{s(`git checkout ${n} .`,{cwd:r,stdio:"pipe"});let i=Ye.readdirSync(t);for(let a of i){if(a===".git"||a==="node_modules")continue;let c=wn.join(t,a);Ye.rmSync(c,{recursive:!0,force:!0})}Ye.cpSync(r,t,{recursive:!0,filter:a=>!a.includes(".git")})}return{success:!0}}catch(s){return{success:!1,error:s.message}}},diffCheckpoint:async n=>{try{let{execSync:o}=await import("node:child_process");return{success:!0,diff:o(`git diff ${n} HEAD`,{cwd:r,stdio:"pipe"}).toString()}}catch(o){return{success:!1,error:o.message}}}}}function cA(t){let e=typeof t.config.workdir=="string"?t.config.workdir:t.cwd??process.cwd();return aA(e,t.sessionId||"default")}function lA({config:t,host:e,toolCatalog:r}){r.addTool(iA(cA({config:t,sessionId:e.currentSessionId})))}var zF="config",KF={type:"object",properties:{action:{type:"string",enum:["get","set","list","reset"],description:`Action:
1033
+ `).map(a=>{let[c="",l="",...d]=a.split("|");return{id:c,timestamp:l,message:d.join("|"),fileCount:0}})}:{success:!0,checkpoints:[]}}catch(n){return{success:!1,error:n.message}}},restoreCheckpoint:async(n,o)=>{try{let{execSync:s}=await import("node:child_process");if(o&&o.length>0){s(`git checkout ${n} ${o.map(i=>`"${i.replace(/"/g,'\\"')}"`).join(" ")}`,{cwd:r,stdio:"pipe"});for(let i of o){let a=wn.join(r,i),c=wn.join(t,i);Ye.existsSync(a)&&Ye.cpSync(a,c,{recursive:!0})}}else{s(`git checkout ${n} .`,{cwd:r,stdio:"pipe"});let i=Ye.readdirSync(t);for(let a of i){if(a===".git"||a==="node_modules")continue;let c=wn.join(t,a);Ye.rmSync(c,{recursive:!0,force:!0})}Ye.cpSync(r,t,{recursive:!0,filter:a=>!a.includes(".git")})}return{success:!0}}catch(s){return{success:!1,error:s.message}}},diffCheckpoint:async n=>{try{let{execSync:o}=await import("node:child_process");return{success:!0,diff:o(`git diff ${n} HEAD`,{cwd:r,stdio:"pipe"}).toString()}}catch(o){return{success:!1,error:o.message}}}}}function cA(t){let e=typeof t.config.workdir=="string"?t.config.workdir:t.cwd??process.cwd();return aA(e,t.sessionId||"default")}function lA({config:t,host:e,toolCatalog:r}){r.addTool(iA(cA({config:t,sessionId:e.currentSessionId})))}var KF="config",VF={type:"object",properties:{action:{type:"string",enum:["get","set","list","reset"],description:`Action:
1034
1034
  - get: Read a config setting
1035
1035
  - set: Write a config setting
1036
1036
  - list: List all available settings
1037
- - reset: Reset a setting to default`},key:{type:"string",description:"Config key path (e.g. 'model', 'language', 'theme', 'permissions.mode', 'permissions.defaultBehavior'). Required for get/set/reset."},value:{description:"Value to set. Type depends on the setting. Required for 'set' action."}},required:["action"]},No=["permissions.securityPolicy","api.key","api.secret","auth.token","system.adminMode"];function dA(t){return{name:zF,label:"Config",description:"Read and write agent configuration settings. Supports preferences like model selection, language, theme, tool enablement, etc. Security-critical settings (API keys, permissions) are read-only. Changes persist across sessions.",parameters:KF,execute:async(e,r)=>{switch(r.action){case"get":{if(!r.key)return{content:[{type:"text",text:"Error: key is required for get."}],details:{type:"config",error:"missing_key"}};if(t.isValidKey&&!t.isValidKey(r.key))return{content:[{type:"text",text:`Error: unknown config key "${r.key}". Use action='list' to see available settings.`}],details:{type:"config",error:"unknown_key"}};let n=await t.getConfig(r.key);if(!n.success)return{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"config",error:n.error}};let o=n.setting,s=[`${o.key} = ${JSON.stringify(o.value)}`,` Type: ${o.type}${o.options?` (${o.options.join(" | ")})`:""}`,` ${o.description}`];return o.readOnly&&s.push(" \u26A0\uFE0F Read-only (cannot be changed)"),{content:[{type:"text",text:s.join(`
1037
+ - reset: Reset a setting to default`},key:{type:"string",description:"Config key path (e.g. 'model', 'language', 'theme', 'permissions.mode', 'permissions.defaultBehavior'). Required for get/set/reset."},value:{description:"Value to set. Type depends on the setting. Required for 'set' action."}},required:["action"]},No=["permissions.securityPolicy","api.key","api.secret","auth.token","system.adminMode"];function dA(t){return{name:KF,label:"Config",description:"Read and write agent configuration settings. Supports preferences like model selection, language, theme, tool enablement, etc. Security-critical settings (API keys, permissions) are read-only. Changes persist across sessions.",parameters:VF,execute:async(e,r)=>{switch(r.action){case"get":{if(!r.key)return{content:[{type:"text",text:"Error: key is required for get."}],details:{type:"config",error:"missing_key"}};if(t.isValidKey&&!t.isValidKey(r.key))return{content:[{type:"text",text:`Error: unknown config key "${r.key}". Use action='list' to see available settings.`}],details:{type:"config",error:"unknown_key"}};let n=await t.getConfig(r.key);if(!n.success)return{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"config",error:n.error}};let o=n.setting,s=[`${o.key} = ${JSON.stringify(o.value)}`,` Type: ${o.type}${o.options?` (${o.options.join(" | ")})`:""}`,` ${o.description}`];return o.readOnly&&s.push(" \u26A0\uFE0F Read-only (cannot be changed)"),{content:[{type:"text",text:s.join(`
1038
1038
  `)}],details:{type:"config",action:"get",key:r.key,value:o.value}}}case"set":{if(!r.key)return{content:[{type:"text",text:"Error: key is required for set."}],details:{type:"config",error:"missing_key"}};if(r.value===void 0)return{content:[{type:"text",text:"Error: value is required for set."}],details:{type:"config",error:"missing_value"}};if(No.includes(r.key))return{content:[{type:"text",text:`Error: "${r.key}" is a security-critical setting and cannot be modified.`}],details:{type:"config",error:"readonly_key"}};if(t.isValidKey&&!t.isValidKey(r.key))return{content:[{type:"text",text:`Error: unknown config key "${r.key}".`}],details:{type:"config",error:"unknown_key"}};let n=await t.setConfig(r.key,r.value);return n.success?{content:[{type:"text",text:`Updated "${r.key}": ${JSON.stringify(n.previousValue)} \u2192 ${JSON.stringify(r.value)}`}],details:{type:"config",action:"set",key:r.key,previousValue:n.previousValue,newValue:r.value}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"config",error:n.error}}}case"list":{let n=await t.listConfig();if(!n.settings||n.settings.length===0)return{content:[{type:"text",text:"No config settings available."}],details:{type:"config",action:"list",count:0}};let o=[`Available settings (${n.settings.length}):`,""];for(let s of n.settings){let i=s.readOnly?" [read-only]":"",a=JSON.stringify(s.value);o.push(` ${s.key} = ${a}${i}`),o.push(` ${s.description}`)}return{content:[{type:"text",text:o.join(`
1039
- `)}],details:{type:"config",action:"list",count:n.settings.length}}}case"reset":{if(!r.key)return{content:[{type:"text",text:"Error: key is required for reset."}],details:{type:"config",error:"missing_key"}};if(No.includes(r.key))return{content:[{type:"text",text:`Error: "${r.key}" cannot be reset (security-critical).`}],details:{type:"config",error:"readonly_key"}};let n=await t.resetConfig(r.key);return n.success?{content:[{type:"text",text:`Reset "${r.key}" to default: ${JSON.stringify(n.setting?.value)}`}],details:{type:"config",action:"reset",key:r.key,value:n.setting?.value}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"config",error:n.error}}}default:return{content:[{type:"text",text:`Error: unknown action "${r.action}".`}],details:{type:"config",error:"unknown_action"}}}}}}import*as Ta from"node:fs";import*as uA from"node:path";function pA(t){let e=t.configFilePath??I().getUserSettingsPath(),r=new Map([["model",{key:"model",value:t.currentModel??"",type:"string",description:"Default LLM model"}],["language",{key:"language",value:"zh-cn",type:"string",description:"UI / response language"}],["verbose",{key:"verbose",value:t.verbose,type:"boolean",description:"Enable verbose logging"}],["maxRounds",{key:"maxRounds",value:25,type:"number",description:"Default max tool-call rounds per turn"}],["theme",{key:"theme",value:"auto",type:"enum",description:"Color theme",options:["auto","light","dark"]}]]),n=async()=>{try{return JSON.parse(await Ta.promises.readFile(e,"utf8"))}catch{return{}}},o=async s=>{await Ta.promises.mkdir(uA.dirname(e),{recursive:!0}),await Ta.promises.writeFile(e,JSON.stringify(s,null,2),"utf8")};return{getConfig:async s=>{let i=r.get(s);if(!i)return{success:!1,error:`Unknown key: ${s}`};let a=await n(),c=s in a?a[s]:i.value;return{success:!0,setting:{...i,value:c,readOnly:No.includes(s)}}},setConfig:async(s,i)=>{let a=r.get(s);if(!a)return{success:!1,error:`Unknown key: ${s}`};let c=await n(),l=s in c?c[s]:a.value;return c[s]=i,await o(c),{success:!0,previousValue:l,setting:{...a,value:i}}},listConfig:async()=>{let s=await n();return{success:!0,settings:[...r.values()].map(a=>({...a,value:a.key in s?s[a.key]:a.value,readOnly:No.includes(a.key)}))}},resetConfig:async s=>{let i=r.get(s);if(!i)return{success:!1,error:`Unknown key: ${s}`};let a=await n();return delete a[s],await o(a),{success:!0,setting:i}},isValidKey:s=>r.has(s)}}function mA({host:t,toolCatalog:e}){e.addTool(dA(pA({currentModel:t.currentModel,verbose:t.verbose})))}var VF="cron",XF={type:"object",properties:{action:{type:"string",enum:["create","list","get","update","delete","pause","resume","trigger"],description:"Workflow-backed action: create/list/get/update/delete/pause/resume/trigger."},jobId:{type:"string",description:"Job ID. Required for get/update/delete/pause/resume/trigger."},prompt:{type:"string",description:"Task prompt to execute on schedule. Required for create."},schedule:{type:"string",description:"Schedule expression for the unified workflow scheduler. Supports cron ('0 9 * * *') and shorthand ('5m', '1h', '1d'). Required for create."},name:{type:"string",description:"Human-readable job name."},enabled:{type:"boolean",description:"Whether the job is enabled (for update)."}},required:["action"]},gA=50;function fA(t){return{name:VF,label:"Cron",description:"Thin entry point for scheduled workflows. Create recurring agent workflows with cron expressions or shorthand ('5m', '1h', '0 9 * * *'). Jobs persist in .qlogicagent/workflows. Actions: create, list, get, update, delete, pause, resume, trigger (run now).",parameters:XF,execute:async(e,r)=>{switch(r.action){case"create":{let n=r;if(!r.prompt)return{content:[{type:"text",text:"Error: prompt is required for create."}],details:{type:"cron",error:"missing_prompt"}};if(!r.schedule)return{content:[{type:"text",text:"Error: schedule is required for create."}],details:{type:"cron",error:"missing_schedule"}};if(t.validateSchedule){let i=t.validateSchedule(r.schedule);if(i)return{content:[{type:"text",text:`Error: invalid schedule \u2014 ${i}`}],details:{type:"cron",error:"invalid_schedule"}}}let o=await t.listJobs();if(o.jobs&&o.jobs.length>=gA)return{content:[{type:"text",text:`Error: maximum ${gA} jobs reached. Delete unused jobs first.`}],details:{type:"cron",error:"max_jobs_reached"}};let s=await t.createJob({prompt:r.prompt,schedule:r.schedule,name:r.name,repeat:n.repeat,allowedTools:n.allowedTools});return s.success?{content:[{type:"text",text:Rp(s.job)}],details:{type:"cron",action:"create",jobId:s.job.id}}:{content:[{type:"text",text:`Error: ${s.error}`}],details:{type:"cron",error:s.error}}}case"list":{let n=await t.listJobs();if(!n.jobs||n.jobs.length===0)return{content:[{type:"text",text:"No scheduled jobs."}],details:{type:"cron",action:"list",count:0}};let o=[`Scheduled jobs (${n.jobs.length}):`,""];for(let s of n.jobs)o.push(`- **${s.name||s.id}** [${s.state}] ${s.scheduleDisplay} \u2014 next: ${s.nextRunAt||"N/A"}`);return{content:[{type:"text",text:o.join(`
1039
+ `)}],details:{type:"config",action:"list",count:n.settings.length}}}case"reset":{if(!r.key)return{content:[{type:"text",text:"Error: key is required for reset."}],details:{type:"config",error:"missing_key"}};if(No.includes(r.key))return{content:[{type:"text",text:`Error: "${r.key}" cannot be reset (security-critical).`}],details:{type:"config",error:"readonly_key"}};let n=await t.resetConfig(r.key);return n.success?{content:[{type:"text",text:`Reset "${r.key}" to default: ${JSON.stringify(n.setting?.value)}`}],details:{type:"config",action:"reset",key:r.key,value:n.setting?.value}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"config",error:n.error}}}default:return{content:[{type:"text",text:`Error: unknown action "${r.action}".`}],details:{type:"config",error:"unknown_action"}}}}}}import*as Ta from"node:fs";import*as uA from"node:path";function pA(t){let e=t.configFilePath??I().getUserSettingsPath(),r=new Map([["model",{key:"model",value:t.currentModel??"",type:"string",description:"Default LLM model"}],["language",{key:"language",value:"zh-cn",type:"string",description:"UI / response language"}],["verbose",{key:"verbose",value:t.verbose,type:"boolean",description:"Enable verbose logging"}],["maxRounds",{key:"maxRounds",value:25,type:"number",description:"Default max tool-call rounds per turn"}],["theme",{key:"theme",value:"auto",type:"enum",description:"Color theme",options:["auto","light","dark"]}]]),n=async()=>{try{return JSON.parse(await Ta.promises.readFile(e,"utf8"))}catch{return{}}},o=async s=>{await Ta.promises.mkdir(uA.dirname(e),{recursive:!0}),await Ta.promises.writeFile(e,JSON.stringify(s,null,2),"utf8")};return{getConfig:async s=>{let i=r.get(s);if(!i)return{success:!1,error:`Unknown key: ${s}`};let a=await n(),c=s in a?a[s]:i.value;return{success:!0,setting:{...i,value:c,readOnly:No.includes(s)}}},setConfig:async(s,i)=>{let a=r.get(s);if(!a)return{success:!1,error:`Unknown key: ${s}`};let c=await n(),l=s in c?c[s]:a.value;return c[s]=i,await o(c),{success:!0,previousValue:l,setting:{...a,value:i}}},listConfig:async()=>{let s=await n();return{success:!0,settings:[...r.values()].map(a=>({...a,value:a.key in s?s[a.key]:a.value,readOnly:No.includes(a.key)}))}},resetConfig:async s=>{let i=r.get(s);if(!i)return{success:!1,error:`Unknown key: ${s}`};let a=await n();return delete a[s],await o(a),{success:!0,setting:i}},isValidKey:s=>r.has(s)}}function mA({host:t,toolCatalog:e}){e.addTool(dA(pA({currentModel:t.currentModel,verbose:t.verbose})))}var XF="cron",YF={type:"object",properties:{action:{type:"string",enum:["create","list","get","update","delete","pause","resume","trigger"],description:"Workflow-backed action: create/list/get/update/delete/pause/resume/trigger."},jobId:{type:"string",description:"Job ID. Required for get/update/delete/pause/resume/trigger."},prompt:{type:"string",description:"Task prompt to execute on schedule. Required for create."},schedule:{type:"string",description:"Schedule expression for the unified workflow scheduler. Supports cron ('0 9 * * *') and shorthand ('5m', '1h', '1d'). Required for create."},name:{type:"string",description:"Human-readable job name."},enabled:{type:"boolean",description:"Whether the job is enabled (for update)."}},required:["action"]},gA=50;function fA(t){return{name:XF,label:"Cron",description:"Thin entry point for scheduled workflows. Create recurring agent workflows with cron expressions or shorthand ('5m', '1h', '0 9 * * *'). Jobs persist in .qlogicagent/workflows. Actions: create, list, get, update, delete, pause, resume, trigger (run now).",parameters:YF,execute:async(e,r)=>{switch(r.action){case"create":{let n=r;if(!r.prompt)return{content:[{type:"text",text:"Error: prompt is required for create."}],details:{type:"cron",error:"missing_prompt"}};if(!r.schedule)return{content:[{type:"text",text:"Error: schedule is required for create."}],details:{type:"cron",error:"missing_schedule"}};if(t.validateSchedule){let i=t.validateSchedule(r.schedule);if(i)return{content:[{type:"text",text:`Error: invalid schedule \u2014 ${i}`}],details:{type:"cron",error:"invalid_schedule"}}}let o=await t.listJobs();if(o.jobs&&o.jobs.length>=gA)return{content:[{type:"text",text:`Error: maximum ${gA} jobs reached. Delete unused jobs first.`}],details:{type:"cron",error:"max_jobs_reached"}};let s=await t.createJob({prompt:r.prompt,schedule:r.schedule,name:r.name,repeat:n.repeat,allowedTools:n.allowedTools});return s.success?{content:[{type:"text",text:Rp(s.job)}],details:{type:"cron",action:"create",jobId:s.job.id}}:{content:[{type:"text",text:`Error: ${s.error}`}],details:{type:"cron",error:s.error}}}case"list":{let n=await t.listJobs();if(!n.jobs||n.jobs.length===0)return{content:[{type:"text",text:"No scheduled jobs."}],details:{type:"cron",action:"list",count:0}};let o=[`Scheduled jobs (${n.jobs.length}):`,""];for(let s of n.jobs)o.push(`- **${s.name||s.id}** [${s.state}] ${s.scheduleDisplay} \u2014 next: ${s.nextRunAt||"N/A"}`);return{content:[{type:"text",text:o.join(`
1040
1040
  `)}],details:{type:"cron",action:"list",count:n.jobs.length}}}case"get":{if(!r.jobId)return{content:[{type:"text",text:"Error: jobId required."}],details:{type:"cron",error:"missing_jobId"}};let n=await t.getJob(r.jobId);return n.success?{content:[{type:"text",text:Rp(n.job)}],details:{type:"cron",action:"get",jobId:r.jobId}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"cron",error:n.error}}}case"update":{if(!r.jobId)return{content:[{type:"text",text:"Error: jobId required."}],details:{type:"cron",error:"missing_jobId"}};let n=r,o={};r.prompt!==void 0&&(o.prompt=r.prompt),r.schedule!==void 0&&(o.schedule=r.schedule),r.name!==void 0&&(o.name=r.name),r.enabled!==void 0&&(o.enabled=r.enabled),n.repeat!==void 0&&(o.repeat=n.repeat),n.allowedTools!==void 0&&(o.allowedTools=n.allowedTools);let s=await t.updateJob(r.jobId,o);return s.success?{content:[{type:"text",text:`Job updated.
1041
1041
  ${Rp(s.job)}`}],details:{type:"cron",action:"update",jobId:r.jobId}}:{content:[{type:"text",text:`Error: ${s.error}`}],details:{type:"cron",error:s.error}}}case"delete":{if(!r.jobId)return{content:[{type:"text",text:"Error: jobId required."}],details:{type:"cron",error:"missing_jobId"}};let n=await t.deleteJob(r.jobId);return n.success?{content:[{type:"text",text:`Job ${r.jobId} deleted.`}],details:{type:"cron",action:"delete",jobId:r.jobId}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"cron",error:n.error}}}case"pause":{if(!r.jobId)return{content:[{type:"text",text:"Error: jobId required."}],details:{type:"cron",error:"missing_jobId"}};let n=await t.pauseJob(r.jobId);return n.success?{content:[{type:"text",text:`Job ${r.jobId} paused.`}],details:{type:"cron",action:"pause",jobId:r.jobId}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"cron",error:n.error}}}case"resume":{if(!r.jobId)return{content:[{type:"text",text:"Error: jobId required."}],details:{type:"cron",error:"missing_jobId"}};let n=await t.resumeJob(r.jobId);return n.success?{content:[{type:"text",text:`Job ${r.jobId} resumed.`}],details:{type:"cron",action:"resume",jobId:r.jobId}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"cron",error:n.error}}}case"trigger":{if(!r.jobId)return{content:[{type:"text",text:"Error: jobId required."}],details:{type:"cron",error:"missing_jobId"}};let n=await t.triggerJob(r.jobId);return n.success?{content:[{type:"text",text:`Job ${r.jobId} triggered (running now).`}],details:{type:"cron",action:"trigger",jobId:r.jobId}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"cron",error:n.error}}}default:return{content:[{type:"text",text:`Error: unknown action "${r.action}".`}],details:{type:"cron",error:"unknown_action"}}}}}}function Rp(t){let e=[`Job: ${t.name||t.id}`,`ID: ${t.id}`,`Schedule: ${t.scheduleDisplay} (${t.schedule})`,`State: ${t.state}`];return t.nextRunAt&&e.push(`Next run: ${t.nextRunAt}`),t.lastRunAt&&e.push(`Last run: ${t.lastRunAt} (${t.lastStatus||"unknown"})`),e.push(`Prompt: ${t.prompt.slice(0,100)}${t.prompt.length>100?"...":""}`),e.join(`
1042
- `)}import{randomUUID as YF}from"node:crypto";var JF=()=>{throw new Error("cron workflow service: running requires the initialized workflow engine")};function yA(t){let e=t.idFactory??(()=>YF().slice(0,8));function r(){let n=new gr(t.getProjectRoot()),o=hi();return{controller:new pr(n,JF),live:o,store:n}}return{async createJob(n){let o=hA(n);if(o)return o;let s=Sp(n.schedule),i=Tp(s);if(i)return{success:!1,error:i};let a=`cron_${e().slice(0,8)}`,c=n.name??`Scheduled task ${a}`,l=QF(a,n.prompt),{controller:d,store:p}=r();try{await d.create({id:a,name:c,def:l,active:!1,concurrency:"queue"}),await d.patch(a,{patch:[{op:"set_trigger",trigger:{type:"schedule",cron:s}},{op:"set_meta",meta:{active:!0}}]});let u=await p.require(a);return{success:!0,job:Wr(u)}}catch(u){throw await p.delete(a),u}},async listJobs(){return{success:!0,jobs:(await r().store.list()).filter(vA).map(o=>Wr(o))}},async getJob(n){let o=await An(r().store,n);return o?{success:!0,job:Wr(o)}:{success:!1,error:`Scheduled workflow not found: ${n}`}},async updateJob(n,o){let s=hA(o);if(s)return s;let{controller:i,store:a}=r(),c=await An(a,n);if(!c)return{success:!1,error:`Scheduled workflow not found: ${n}`};let l=[],d,p;if(o.prompt!==void 0&&(d=ZF(c.def,o.prompt)),o.name!==void 0&&(p=o.name),o.schedule!==void 0){let u=Sp(o.schedule),m=Tp(u);if(m)return{success:!1,error:m};l.push({op:"set_trigger",trigger:{type:"schedule",cron:u}})}return o.enabled!==void 0&&l.push({op:"set_meta",meta:{active:o.enabled}}),(d||p!==void 0)&&await i.update(n,{def:d,name:p}),l.length>0&&await i.patch(n,{patch:l}),{success:!0,job:Wr(await a.require(n))}},async deleteJob(n){let{store:o}=r();return await An(o,n)?(await o.delete(n),{success:!0}):{success:!1,error:`Scheduled workflow not found: ${n}`}},async pauseJob(n){let{controller:o,store:s}=r();return await An(s,n)?{success:!0,job:Wr(await o.setActive(n,!1))}:{success:!1,error:`Scheduled workflow not found: ${n}`}},async resumeJob(n){let{controller:o,store:s}=r();return await An(s,n)?{success:!0,job:Wr(await o.setActive(n,!0))}:{success:!1,error:`Scheduled workflow not found: ${n}`}},async triggerJob(n){let{live:o,store:s}=r(),i=await An(s,n);if(!i)return{success:!1,error:`Scheduled workflow not found: ${n}`};if(!o)throw new Error("cron trigger requires the initialized workflow engine; activate/run from the app host");let a={type:"manual",payload:{source:"cron.trigger"}},c=await o.run(n,a);return{success:!0,job:Wr(i,c.status==="completed"?"success":"error")}},validateSchedule(n){return Tp(Sp(n))}}}function QF(t,e){return{id:t,nodes:[{id:"trigger",kind:"trigger",name:"Schedule trigger"},{id:"agent",kind:"agent",name:"Run prompt",params:{prompt:e}}],edges:[{from:"trigger",to:"agent"}]}}function ZF(t,e){let r=t.nodes.map(n=>n.kind!=="agent"?n:{...n,params:{...n.params??{},prompt:e}});if(!r.some(n=>n.kind==="agent"))throw new Error(`Scheduled workflow "${t.id}" has no agent node to update`);return{...t,nodes:r}}function eH(t){let r=t.nodes.find(n=>n.kind==="agent")?.params?.prompt;return typeof r=="string"?r:""}function Sp(t){let e=t.trim(),r=/^(\d+)([smhd])$/.exec(e);if(!r)return e;let n=Number(r[1]),o=r[2];if(!Number.isInteger(n)||n<=0)return e;switch(o){case"s":return`*/${n} * * * * *`;case"m":return`*/${n} * * * *`;case"h":return`0 */${n} * * *`;case"d":return`0 0 */${n} * *`;default:return e}}function Tp(t){let e=tu(t);return e.length===0?null:e.join("; ")}function vA(t){return t.trigger?.type==="schedule"}async function An(t,e){let r=await t.load(e);return r&&vA(r)?r:void 0}function Wr(t,e=null){let r=t.trigger?.type==="schedule"?t.trigger.cron:"";return{id:t.id,name:t.name,prompt:eH(t.def),schedule:r,scheduleDisplay:r,state:t.active?"scheduled":"paused",enabled:t.active,lastStatus:e}}function hA(t){return t.repeat!==void 0&&t.repeat!==null?{success:!1,error:"repeat is not a cron-layer field in the unified workflow scheduler; model finite repeats inside the workflow graph"}:t.allowedTools!==void 0&&t.allowedTools.length>0?{success:!1,error:"allowedTools is not a cron-layer field in the unified workflow scheduler; enforce tool access through permission rules or workflow nodes"}:null}function bA({host:t,toolCatalog:e}){let r=yA({getProjectRoot:()=>t.getActiveProjectRoot()});e.addTool(fA(r))}var tH="monitor",rH={type:"object",properties:{action:{type:"string",enum:["start","stop","list"],description:"Action to perform: start a new monitor, stop an existing one, or list active monitors."},monitorId:{type:"string",description:"Identifier for the monitor instance. Required for start/stop."},source:{type:"string",enum:["process","file","task","custom"],description:"Type of event source to watch."},target:{type:"string",description:"Selector for the monitored target. For process: PID or background job id. For file: glob pattern. For task: task ID. For custom: host-defined key."},conditions:{type:"array",items:{type:"object",properties:{type:{type:"string",enum:["exit","output_match","file_changed","task_status"]},value:{type:"string"}},required:["type"]},description:"Conditions that trigger a wake-up notification."},timeoutSeconds:{type:"number",description:"Auto-stop after this many seconds (default: 3600).",minimum:1,maximum:86400}},required:["action"]};function kA(t){return{name:tH,label:"Monitor",shouldDefer:!0,description:["Set up event-driven monitoring to wake up when something happens.","","Use this to watch for:","\u2022 Background process completion or specific output patterns","\u2022 File system changes (new file, modification)","\u2022 Async task state transitions (pending \u2192 completed/failed)","\u2022 Custom host-defined events","","When a monitored condition triggers, you'll receive a notification in your next tick.","This is more efficient than polling with Sleep \u2014 you only wake up when there's work to do.","","Actions:","\u2022 start \u2014 register a new monitor (requires monitorId, source, target)","\u2022 stop \u2014 deregister an active monitor","\u2022 list \u2014 show all active monitors and their event counts"].join(`
1043
- `),parameters:rH,execute:async(e,r)=>{let{action:n}=r;if(n==="list"){let i=await t.listMonitors();return i.length===0?{content:[{type:"text",text:"No active monitors."}],details:{action:n,monitors:[]}}:{content:[{type:"text",text:`Active monitors:
1042
+ `)}import{randomUUID as JF}from"node:crypto";var QF=()=>{throw new Error("cron workflow service: running requires the initialized workflow engine")};function yA(t){let e=t.idFactory??(()=>JF().slice(0,8));function r(){let n=new gr(t.getProjectRoot()),o=hi();return{controller:new pr(n,QF),live:o,store:n}}return{async createJob(n){let o=hA(n);if(o)return o;let s=Sp(n.schedule),i=Tp(s);if(i)return{success:!1,error:i};let a=`cron_${e().slice(0,8)}`,c=n.name??`Scheduled task ${a}`,l=ZF(a,n.prompt),{controller:d,store:p}=r();try{await d.create({id:a,name:c,def:l,active:!1,concurrency:"queue"}),await d.patch(a,{patch:[{op:"set_trigger",trigger:{type:"schedule",cron:s}},{op:"set_meta",meta:{active:!0}}]});let u=await p.require(a);return{success:!0,job:Wr(u)}}catch(u){throw await p.delete(a),u}},async listJobs(){return{success:!0,jobs:(await r().store.list()).filter(vA).map(o=>Wr(o))}},async getJob(n){let o=await An(r().store,n);return o?{success:!0,job:Wr(o)}:{success:!1,error:`Scheduled workflow not found: ${n}`}},async updateJob(n,o){let s=hA(o);if(s)return s;let{controller:i,store:a}=r(),c=await An(a,n);if(!c)return{success:!1,error:`Scheduled workflow not found: ${n}`};let l=[],d,p;if(o.prompt!==void 0&&(d=eH(c.def,o.prompt)),o.name!==void 0&&(p=o.name),o.schedule!==void 0){let u=Sp(o.schedule),m=Tp(u);if(m)return{success:!1,error:m};l.push({op:"set_trigger",trigger:{type:"schedule",cron:u}})}return o.enabled!==void 0&&l.push({op:"set_meta",meta:{active:o.enabled}}),(d||p!==void 0)&&await i.update(n,{def:d,name:p}),l.length>0&&await i.patch(n,{patch:l}),{success:!0,job:Wr(await a.require(n))}},async deleteJob(n){let{store:o}=r();return await An(o,n)?(await o.delete(n),{success:!0}):{success:!1,error:`Scheduled workflow not found: ${n}`}},async pauseJob(n){let{controller:o,store:s}=r();return await An(s,n)?{success:!0,job:Wr(await o.setActive(n,!1))}:{success:!1,error:`Scheduled workflow not found: ${n}`}},async resumeJob(n){let{controller:o,store:s}=r();return await An(s,n)?{success:!0,job:Wr(await o.setActive(n,!0))}:{success:!1,error:`Scheduled workflow not found: ${n}`}},async triggerJob(n){let{live:o,store:s}=r(),i=await An(s,n);if(!i)return{success:!1,error:`Scheduled workflow not found: ${n}`};if(!o)throw new Error("cron trigger requires the initialized workflow engine; activate/run from the app host");let a={type:"manual",payload:{source:"cron.trigger"}},c=await o.run(n,a);return{success:!0,job:Wr(i,c.status==="completed"?"success":"error")}},validateSchedule(n){return Tp(Sp(n))}}}function ZF(t,e){return{id:t,nodes:[{id:"trigger",kind:"trigger",name:"Schedule trigger"},{id:"agent",kind:"agent",name:"Run prompt",params:{prompt:e}}],edges:[{from:"trigger",to:"agent"}]}}function eH(t,e){let r=t.nodes.map(n=>n.kind!=="agent"?n:{...n,params:{...n.params??{},prompt:e}});if(!r.some(n=>n.kind==="agent"))throw new Error(`Scheduled workflow "${t.id}" has no agent node to update`);return{...t,nodes:r}}function tH(t){let r=t.nodes.find(n=>n.kind==="agent")?.params?.prompt;return typeof r=="string"?r:""}function Sp(t){let e=t.trim(),r=/^(\d+)([smhd])$/.exec(e);if(!r)return e;let n=Number(r[1]),o=r[2];if(!Number.isInteger(n)||n<=0)return e;switch(o){case"s":return`*/${n} * * * * *`;case"m":return`*/${n} * * * *`;case"h":return`0 */${n} * * *`;case"d":return`0 0 */${n} * *`;default:return e}}function Tp(t){let e=tu(t);return e.length===0?null:e.join("; ")}function vA(t){return t.trigger?.type==="schedule"}async function An(t,e){let r=await t.load(e);return r&&vA(r)?r:void 0}function Wr(t,e=null){let r=t.trigger?.type==="schedule"?t.trigger.cron:"";return{id:t.id,name:t.name,prompt:tH(t.def),schedule:r,scheduleDisplay:r,state:t.active?"scheduled":"paused",enabled:t.active,lastStatus:e}}function hA(t){return t.repeat!==void 0&&t.repeat!==null?{success:!1,error:"repeat is not a cron-layer field in the unified workflow scheduler; model finite repeats inside the workflow graph"}:t.allowedTools!==void 0&&t.allowedTools.length>0?{success:!1,error:"allowedTools is not a cron-layer field in the unified workflow scheduler; enforce tool access through permission rules or workflow nodes"}:null}function bA({host:t,toolCatalog:e}){let r=yA({getProjectRoot:()=>t.getActiveProjectRoot()});e.addTool(fA(r))}var rH="monitor",nH={type:"object",properties:{action:{type:"string",enum:["start","stop","list"],description:"Action to perform: start a new monitor, stop an existing one, or list active monitors."},monitorId:{type:"string",description:"Identifier for the monitor instance. Required for start/stop."},source:{type:"string",enum:["process","file","task","custom"],description:"Type of event source to watch."},target:{type:"string",description:"Selector for the monitored target. For process: PID or background job id. For file: glob pattern. For task: task ID. For custom: host-defined key."},conditions:{type:"array",items:{type:"object",properties:{type:{type:"string",enum:["exit","output_match","file_changed","task_status"]},value:{type:"string"}},required:["type"]},description:"Conditions that trigger a wake-up notification."},timeoutSeconds:{type:"number",description:"Auto-stop after this many seconds (default: 3600).",minimum:1,maximum:86400}},required:["action"]};function kA(t){return{name:rH,label:"Monitor",shouldDefer:!0,description:["Set up event-driven monitoring to wake up when something happens.","","Use this to watch for:","\u2022 Background process completion or specific output patterns","\u2022 File system changes (new file, modification)","\u2022 Async task state transitions (pending \u2192 completed/failed)","\u2022 Custom host-defined events","","When a monitored condition triggers, you'll receive a notification in your next tick.","This is more efficient than polling with Sleep \u2014 you only wake up when there's work to do.","","Actions:","\u2022 start \u2014 register a new monitor (requires monitorId, source, target)","\u2022 stop \u2014 deregister an active monitor","\u2022 list \u2014 show all active monitors and their event counts"].join(`
1043
+ `),parameters:nH,execute:async(e,r)=>{let{action:n}=r;if(n==="list"){let i=await t.listMonitors();return i.length===0?{content:[{type:"text",text:"No active monitors."}],details:{action:n,monitors:[]}}:{content:[{type:"text",text:`Active monitors:
1044
1044
  ${i.map(c=>`\u2022 ${c.monitorId} [${c.source}] \u2192 ${c.target} (events: ${c.eventCount}, timeout: ${c.timeoutSeconds}s)`).join(`
1045
- `)}`}],details:{action:n,monitors:i}}}if(!r.monitorId)return{content:[{type:"text",text:"Error: monitorId is required for start/stop."}],details:{action:n,success:!1,error:"missing_monitor_id"}};if(n==="stop"){let i=await t.stopMonitor(r.monitorId);return{content:[{type:"text",text:i.success?`Monitor "${r.monitorId}" stopped.`:`Failed to stop monitor "${r.monitorId}": ${i.error??"not found"}`}],details:{...i}}}if(!r.source||!r.target)return{content:[{type:"text",text:"Error: source and target are required to start a monitor."}],details:{action:n,success:!1,error:"missing_source_or_target"}};let o=await t.startMonitor({monitorId:r.monitorId,source:r.source,target:r.target,conditions:r.conditions??[],timeoutSeconds:r.timeoutSeconds??3600});return{content:[{type:"text",text:o.success?`Monitor "${r.monitorId}" started: watching ${r.source} "${r.target}".`:`Failed to start monitor: ${o.error??"unknown"}`}],details:{...o}}}}}import*as RA from"node:fs";function SA(t){let e=new Map;return{async startMonitor(r){if(e.has(r.monitorId))return{action:"start",success:!1,error:`Monitor "${r.monitorId}" already exists.`};let n={monitorId:r.monitorId,source:r.source,target:r.target,conditions:r.conditions,startedAt:Date.now(),timeoutSeconds:r.timeoutSeconds,eventCount:0},o=()=>{};if(r.source==="file")try{let s=RA.watch(r.target,{persistent:!1},()=>{n.eventCount++,t.info(`[monitor] file change detected: ${r.target}`)});o=()=>s.close()}catch{return{action:"start",success:!1,error:`Cannot watch: ${r.target}`}}if(r.timeoutSeconds>0){let s=setTimeout(()=>{let a=e.get(r.monitorId);a&&(a.cleanup(),e.delete(r.monitorId))},r.timeoutSeconds*1e3),i=o;o=()=>{clearTimeout(s),i()}}return e.set(r.monitorId,{info:n,cleanup:o}),{action:"start",success:!0,monitorId:r.monitorId}},async stopMonitor(r){let n=e.get(r);return n?(n.cleanup(),e.delete(r),{action:"stop",success:!0,monitorId:r}):{action:"stop",success:!1,error:`Monitor "${r}" not found.`}},async listMonitors(){return[...e.values()].map(r=>r.info)},dispose(){for(let r of e.values())r.cleanup();e.clear()}}}function TA({log:t,toolCatalog:e}){let r=SA(t);Xt(async()=>r.dispose()),e.addTool(kA(r))}var nH="team",oH={type:"object",properties:{action:{type:"string",enum:["create","delete","list","status"],description:"Team action: create (new team), delete (disband), list (all teams), status (team details)."},teamName:{type:"string",description:"Team name. Required for create/delete/status."},description:{type:"string",description:"Team description/objective. Used for create."},members:{type:"array",description:"Team members with roles and tool restrictions.",items:{type:"object",properties:{name:{type:"string",description:"Agent name/role identifier."},role:{type:"string",description:"Role description (e.g. 'frontend developer')."},tools:{type:"array",items:{type:"string"},description:"Allowed tools for this member."}},required:["name","role"]}}},required:["action"]};function wA(t){return{name:nH,label:"Team",description:"Manage multi-agent teams. Create teams of specialized agents that collaborate via send_message. Each member has a role and optional tool restrictions. Use for complex tasks requiring parallel work.",parameters:oH,execute:async(e,r)=>{switch(r.action){case"create":{if(!r.teamName)return{content:[{type:"text",text:"Error: teamName required for create."}],details:{type:"team",error:"missing_name"}};let n=await t.createTeam({teamName:r.teamName,description:r.description,members:r.members});if(!n.success)return{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"team",error:n.error}};let o=[`Team "${n.team.name}" created.`,`Lead: ${n.team.leadId}`,`Members: ${n.team.members.length}`];for(let s of n.team.members)o.push(` - ${s.name} (${s.role})`);return{content:[{type:"text",text:o.join(`
1045
+ `)}`}],details:{action:n,monitors:i}}}if(!r.monitorId)return{content:[{type:"text",text:"Error: monitorId is required for start/stop."}],details:{action:n,success:!1,error:"missing_monitor_id"}};if(n==="stop"){let i=await t.stopMonitor(r.monitorId);return{content:[{type:"text",text:i.success?`Monitor "${r.monitorId}" stopped.`:`Failed to stop monitor "${r.monitorId}": ${i.error??"not found"}`}],details:{...i}}}if(!r.source||!r.target)return{content:[{type:"text",text:"Error: source and target are required to start a monitor."}],details:{action:n,success:!1,error:"missing_source_or_target"}};let o=await t.startMonitor({monitorId:r.monitorId,source:r.source,target:r.target,conditions:r.conditions??[],timeoutSeconds:r.timeoutSeconds??3600});return{content:[{type:"text",text:o.success?`Monitor "${r.monitorId}" started: watching ${r.source} "${r.target}".`:`Failed to start monitor: ${o.error??"unknown"}`}],details:{...o}}}}}import*as RA from"node:fs";function SA(t){let e=new Map;return{async startMonitor(r){if(e.has(r.monitorId))return{action:"start",success:!1,error:`Monitor "${r.monitorId}" already exists.`};let n={monitorId:r.monitorId,source:r.source,target:r.target,conditions:r.conditions,startedAt:Date.now(),timeoutSeconds:r.timeoutSeconds,eventCount:0},o=()=>{};if(r.source==="file")try{let s=RA.watch(r.target,{persistent:!1},()=>{n.eventCount++,t.info(`[monitor] file change detected: ${r.target}`)});o=()=>s.close()}catch{return{action:"start",success:!1,error:`Cannot watch: ${r.target}`}}if(r.timeoutSeconds>0){let s=setTimeout(()=>{let a=e.get(r.monitorId);a&&(a.cleanup(),e.delete(r.monitorId))},r.timeoutSeconds*1e3),i=o;o=()=>{clearTimeout(s),i()}}return e.set(r.monitorId,{info:n,cleanup:o}),{action:"start",success:!0,monitorId:r.monitorId}},async stopMonitor(r){let n=e.get(r);return n?(n.cleanup(),e.delete(r),{action:"stop",success:!0,monitorId:r}):{action:"stop",success:!1,error:`Monitor "${r}" not found.`}},async listMonitors(){return[...e.values()].map(r=>r.info)},dispose(){for(let r of e.values())r.cleanup();e.clear()}}}function TA({log:t,toolCatalog:e}){let r=SA(t);Xt(async()=>r.dispose()),e.addTool(kA(r))}var oH="team",sH={type:"object",properties:{action:{type:"string",enum:["create","delete","list","status"],description:"Team action: create (new team), delete (disband), list (all teams), status (team details)."},teamName:{type:"string",description:"Team name. Required for create/delete/status."},description:{type:"string",description:"Team description/objective. Used for create."},members:{type:"array",description:"Team members with roles and tool restrictions.",items:{type:"object",properties:{name:{type:"string",description:"Agent name/role identifier."},role:{type:"string",description:"Role description (e.g. 'frontend developer')."},tools:{type:"array",items:{type:"string"},description:"Allowed tools for this member."}},required:["name","role"]}}},required:["action"]};function wA(t){return{name:oH,label:"Team",description:"Manage multi-agent teams. Create teams of specialized agents that collaborate via send_message. Each member has a role and optional tool restrictions. Use for complex tasks requiring parallel work.",parameters:sH,execute:async(e,r)=>{switch(r.action){case"create":{if(!r.teamName)return{content:[{type:"text",text:"Error: teamName required for create."}],details:{type:"team",error:"missing_name"}};let n=await t.createTeam({teamName:r.teamName,description:r.description,members:r.members});if(!n.success)return{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"team",error:n.error}};let o=[`Team "${n.team.name}" created.`,`Lead: ${n.team.leadId}`,`Members: ${n.team.members.length}`];for(let s of n.team.members)o.push(` - ${s.name} (${s.role})`);return{content:[{type:"text",text:o.join(`
1046
1046
  `)}],details:{type:"team",action:"create",teamName:n.team.name}}}case"delete":{if(!r.teamName)return{content:[{type:"text",text:"Error: teamName required for delete."}],details:{type:"team",error:"missing_name"}};let n=await t.deleteTeam(r.teamName);return n.success?{content:[{type:"text",text:`Team "${r.teamName}" disbanded.`}],details:{type:"team",action:"delete",teamName:r.teamName}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"team",error:n.error}}}case"list":{let n=await t.listTeams();if(!n.teams||n.teams.length===0)return{content:[{type:"text",text:"No active teams."}],details:{type:"team",action:"list",count:0}};let o=[`Active teams (${n.teams.length}):`,""];for(let s of n.teams)o.push(`- **${s.name}**: ${s.description||"(no description)"} \u2014 ${s.members.length} members`);return{content:[{type:"text",text:o.join(`
1047
1047
  `)}],details:{type:"team",action:"list",count:n.teams.length}}}case"status":{if(!r.teamName)return{content:[{type:"text",text:"Error: teamName required for status."}],details:{type:"team",error:"missing_name"}};let n=await t.getTeamStatus(r.teamName);if(!n.success)return{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"team",error:n.error}};let o=n.team,s=n.memberProgress??{},i=[`Team: ${o.name}`,`Description: ${o.description||"\u2014"}`,`Lead: ${o.leadId}`,`Created: ${o.createdAt}`,"",`Members (${o.members.length}):`];for(let a of o.members){let c=a.tools?` [tools: ${a.tools.join(", ")}]`:"",l=a.worktreePath?` [worktree: ${a.worktreePath}]`:a.cwd?` [cwd: ${a.cwd}]`:"",d=s[a.name],p=a.isActive===!1?" (idle)":" (active)";if(d){let u=[];if(d.runningFor&&u.push(`running ${Math.round(d.runningFor/1e3)}s`),d.lastToolCall&&u.push(`tool: ${d.lastToolCall}`),d.idleFor!==void 0&&d.idleFor>5&&u.push(`idle ${d.idleFor}s`),d.mediaProgress){let m=d.mediaProgress;u.push(`${m.mediaType} ${m.percent}% [${m.status}] taskId=${m.taskId}${m.provider?` provider=${m.provider}`:""}`)}u.length&&(p=` (${u.join(", ")})`)}i.push(` - ${a.name} (${a.role})${c}${l}${p}`)}return{content:[{type:"text",text:i.join(`
1048
- `)}],details:{type:"team",action:"status",teamName:o.name}}}default:return{content:[{type:"text",text:`Error: unknown action "${r.action}".`}],details:{type:"team",error:"unknown_action"}}}}}}import*as AA from"node:path";function PA(t,e){let r=new Map,n={info:s=>e.info(s),warn:s=>e.warn(s)},o=new dt({onNotification:(s,i,a)=>{t.sendNotification("team.member.notification",{memberId:s,method:i,params:a})},onStateChange:(s,i)=>{t.sendNotification("team.member.state",{memberId:s,state:i});let a=o.getHandle(s),l=o.getUsageTracker(s)?.getUsage();t.emitAgentStatus(s,i,{missedBeats:o.getMissedBeats(s),lastActivityAt:a?.lastActivityAt,usage:l&&l.totalTokens>0?{inputTokens:l.inputTokens,outputTokens:l.outputTokens,totalTokens:l.totalTokens}:void 0})},onExit:(s,i,a)=>{for(let c of r.values()){let l=c.members.find(d=>d.cwd&&Lo(c.name,d.name)===s);l&&(l.isActive=!1)}e.info(`[team] member ${s} exited (code=${i}, signal=${a})`)},onMcpToolCall:(s,i,a)=>t.handleMcpToolCall(s,i,a),log:{info:s=>e.info(s),warn:s=>e.warn(s),debug:s=>e.debug(s)},sessionDir:AA.join(I().getUserAgentHome(),"agent-logs")});return{async createTeam(s){if(r.has(s.teamName))return{success:!1,error:`Team "${s.teamName}" already exists.`};let i=await po(),a=[];for(let l of s.members??[]){let d={...l,isActive:!0};if(i){let p=`team-${s.teamName}-${l.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase(),u=await qy(i,p,n);u?(d.worktreePath=u.worktreePath,d.worktreeBranch=u.branch,d.cwd=u.worktreePath,e.info(`[team] provisioned worktree for ${l.name}: ${u.worktreePath}`)):(d.cwd=process.cwd(),e.warn(`[team] worktree provision failed for ${l.name}, using shared cwd`))}else d.cwd=process.cwd();a.push(d)}let c={name:s.teamName,description:s.description,leadId:t.currentSessionId??"default",members:a,createdAt:new Date().toISOString()};r.set(s.teamName,c);for(let l of a){if(!l.cwd)continue;let d=Lo(s.teamName,l.name);try{await o.spawn({memberId:d,name:l.name,cwd:l.cwd,prompt:`You are the "${l.name}" team member. Role: ${l.role}.`,agentType:l.role,verbose:t.verbose}),e.info(`[team] spawned child process for ${l.name} in ${l.cwd}`)}catch(p){e.warn(`[team] failed to spawn child process for ${l.name}: ${p instanceof Error?p.message:String(p)}`),l.isActive=!1}}return t.sendNotification("team.updated",{teamName:s.teamName,action:"created",members:c.members.map(l=>({agentName:l.name,role:l.role,worktreePath:l.worktreePath,pid:o.getHandle(Lo(s.teamName,l.name))?.pid}))}),{success:!0,team:c}},async deleteTeam(s){let i=r.get(s);if(!i)return{success:!1,error:`Team "${s}" not found.`};for(let c of i.members){let l=Lo(s,c.name);o.kill(l),o.remove(l)}let a=await po();if(a)for(let c of i.members)c.worktreePath&&c.worktreeBranch&&(await Wy(a,c.worktreePath,c.worktreeBranch,n),e.info(`[team] cleaned up worktree for ${c.name}: ${c.worktreePath}`));return r.delete(s),t.sendNotification("team.updated",{teamName:s,action:"destroyed",members:[]}),{success:!0}},async listTeams(){return{success:!0,teams:[...r.values()]}},async getTeamStatus(s){let i=r.get(s);if(!i)return{success:!1,error:`Team "${s}" not found.`};let a={};for(let c of i.members){let l=Lo(s,c.name),d=o.getStatus(l);d&&(c.isActive=d.alive,a[c.name]={mediaProgress:d.mediaProgress,lastToolCall:d.lastToolCall,idleFor:d.idleFor,runningFor:d.runningFor})}return{success:!0,team:i,memberProgress:a}},dispose(){o.dispose()}}}function Lo(t,e){return`team-${t}-${e}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase()}function xA({host:t,log:e,toolCatalog:r}){let n=PA(t,e);Xt(async()=>n.dispose()),r.addTool(wA(n))}var sH="notify",iH={type:"object",properties:{message:{type:"string",description:"Notification content to send to the user."},title:{type:"string",description:"Optional notification title/subject line."},priority:{type:"string",enum:["low","normal","high"],description:"Notification priority (default: normal). High may trigger sound/vibration."},channel:{type:"string",description:"Target delivery channel (e.g. 'wechat', 'feishu', 'discord'). Default: user's primary."}},required:["message"]};function CA(t){return{name:sH,label:"Notify",description:"Send a notification to the user. Used for alerting about completed long-running tasks, important updates, or requesting attention. Supports multiple channels (WeChat, Feishu, Discord, etc).",parameters:iH,execute:async(e,r)=>{if(!r.message||r.message.trim().length===0)return{content:[{type:"text",text:"Error: message is required."}],details:{type:"notify",error:"empty_message"}};let n=await t.sendNotification({message:r.message.trim(),title:r.title,priority:r.priority||"normal",channel:r.channel});return n.delivered?{content:[{type:"text",text:`Notification sent via ${n.channel}.`}],details:{type:"notify",delivered:!0,channel:n.channel}}:{content:[{type:"text",text:`Notification failed: ${n.error||"delivery error"}`}],details:{type:"notify",delivered:!1,error:n.error}}}}}var aH="send_message",cH={type:"object",properties:{to:{type:"string",description:"Target agent name or '*' for broadcast to all team members. Must be a valid agent name within the current team."},message:{type:"string",description:"Message content to send to the target agent."},summary:{type:"string",description:"Optional short summary (for logging/routing)."}},required:["to","message"]};function IA(t){return{name:aH,label:"Send Message",description:"Send a message to another agent in your team. Use '*' to broadcast to all teammates. Messages are delivered asynchronously. Use for coordination, delegation, and status updates.",parameters:cH,execute:async(e,r)=>{if(!r.to||r.to.trim().length===0)return{content:[{type:"text",text:"Error: 'to' is required (agent name or '*')."}],details:{type:"send_message",error:"missing_target"}};if(!r.message||r.message.trim().length===0)return{content:[{type:"text",text:"Error: message is required."}],details:{type:"send_message",error:"empty_message"}};if(r.to!=="*"&&t.listTeammates){let s=t.listTeammates();if(!s.includes(r.to))return{content:[{type:"text",text:`Error: agent "${r.to}" not found in team. Available: ${s.join(", ")}`}],details:{type:"send_message",error:"target_not_found",available:s}}}let n=await t.sendMessage({to:r.to.trim(),message:r.message.trim(),summary:r.summary,senderId:t.getSenderId()});return n.success?{content:[{type:"text",text:`Message sent to ${r.to==="*"?`broadcast (${n.recipients?.length||0} recipients)`:r.to}.`}],details:{type:"send_message",success:!0,to:r.to,recipients:n.recipients}}:{content:[{type:"text",text:`Message delivery failed: ${n.error||"unknown error"}`}],details:{type:"send_message",success:!1,error:n.error}}}}}function EA({host:t,log:e,toolCatalog:r}){r.addTool(CA({sendNotification:async n=>(e.info(`[notify] ${n.title??""}: ${n.message}`),{delivered:!0,channel:n.channel??"cli"})})),r.addTool(IA({sendMessage:async n=>(e.info(`[send_message] ${n.senderId} -> ${n.to}: ${n.message}`),{success:!0,recipients:[n.to]}),getSenderId:()=>t.currentSessionId??"default",listTeammates:()=>[]}))}function MA(t){oA({host:{get agent(){return t.host.agent},get currentTransport(){return t.host.currentTransport},get currentApiKey(){return t.host.currentApiKey},get currentModel(){return t.host.currentModel},sendNotification:t.host.sendNotification.bind(t.host)},hooks:t.hooks,log:t.log,toolCatalog:t.toolCatalog,toolInvoker:t.toolInvoker}),mA({toolCatalog:t.toolCatalog,host:{currentModel:t.host.currentModel,verbose:t.host.verbose}}),bA({toolCatalog:t.toolCatalog,host:{getActiveProjectRoot:()=>t.host.getActiveProjectRoot()}}),TA({log:t.log,toolCatalog:t.toolCatalog}),lA({config:t.config,toolCatalog:t.toolCatalog,host:{currentSessionId:t.host.currentSessionId}}),xA({host:{get currentSessionId(){return t.host.currentSessionId},get verbose(){return t.host.verbose},sendNotification:t.host.sendNotification.bind(t.host),emitAgentStatus:t.host.emitAgentStatus.bind(t.host),handleMcpToolCall:t.host.handleMcpToolCall.bind(t.host)},log:t.log,toolCatalog:t.toolCatalog}),EA({toolCatalog:t.toolCatalog,host:{get currentSessionId(){return t.host.currentSessionId}},log:t.log})}var lH={id:"cli-core-tools",kind:"core",register:dH};function _A(t){lH.register(t)}function dH(t){let e={get agent(){return t.host.getAgent()},get currentTransport(){return t.host.getCurrentTransport()},get currentApiKey(){return t.host.getCurrentApiKey()},get currentModel(){return t.host.getCurrentModel()},get currentSessionId(){return t.host.getCurrentSessionId()},getActiveProjectRoot:()=>t.host.getActiveProjectRoot(),get verbose(){return t.host.getVerbose()},sendNotification(n,o){t.host.sendNotification(n,o)},emitAgentStatus(n,o,s){t.host.emitAgentStatus(n,o,s)},handleMcpToolCall(n,o,s){return t.host.handleMcpToolCall(n,o,s)}},r={config:t.config,host:e,hooks:t.hooks,log:t.log,toolCatalog:t.toolCatalog,toolInvoker:t.toolInvoker};MA(r)}var uH={type:"object",properties:{operation:{type:"string",enum:["goToDefinition","findReferences","hover","documentSymbol","diagnostics","completion","signatureHelp","rename","codeAction"],description:`LSP operation:
1048
+ `)}],details:{type:"team",action:"status",teamName:o.name}}}default:return{content:[{type:"text",text:`Error: unknown action "${r.action}".`}],details:{type:"team",error:"unknown_action"}}}}}}import*as AA from"node:path";function PA(t,e){let r=new Map,n={info:s=>e.info(s),warn:s=>e.warn(s)},o=new dt({onNotification:(s,i,a)=>{t.sendNotification("team.member.notification",{memberId:s,method:i,params:a})},onStateChange:(s,i)=>{t.sendNotification("team.member.state",{memberId:s,state:i});let a=o.getHandle(s),l=o.getUsageTracker(s)?.getUsage();t.emitAgentStatus(s,i,{missedBeats:o.getMissedBeats(s),lastActivityAt:a?.lastActivityAt,usage:l&&l.totalTokens>0?{inputTokens:l.inputTokens,outputTokens:l.outputTokens,totalTokens:l.totalTokens}:void 0})},onExit:(s,i,a)=>{for(let c of r.values()){let l=c.members.find(d=>d.cwd&&Lo(c.name,d.name)===s);l&&(l.isActive=!1)}e.info(`[team] member ${s} exited (code=${i}, signal=${a})`)},onMcpToolCall:(s,i,a)=>t.handleMcpToolCall(s,i,a),log:{info:s=>e.info(s),warn:s=>e.warn(s),debug:s=>e.debug(s)},sessionDir:AA.join(I().getUserAgentHome(),"agent-logs")});return{async createTeam(s){if(r.has(s.teamName))return{success:!1,error:`Team "${s.teamName}" already exists.`};let i=await po(),a=[];for(let l of s.members??[]){let d={...l,isActive:!0};if(i){let p=`team-${s.teamName}-${l.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase(),u=await qy(i,p,n);u?(d.worktreePath=u.worktreePath,d.worktreeBranch=u.branch,d.cwd=u.worktreePath,e.info(`[team] provisioned worktree for ${l.name}: ${u.worktreePath}`)):(d.cwd=process.cwd(),e.warn(`[team] worktree provision failed for ${l.name}, using shared cwd`))}else d.cwd=process.cwd();a.push(d)}let c={name:s.teamName,description:s.description,leadId:t.currentSessionId??"default",members:a,createdAt:new Date().toISOString()};r.set(s.teamName,c);for(let l of a){if(!l.cwd)continue;let d=Lo(s.teamName,l.name);try{await o.spawn({memberId:d,name:l.name,cwd:l.cwd,prompt:`You are the "${l.name}" team member. Role: ${l.role}.`,agentType:l.role,verbose:t.verbose}),e.info(`[team] spawned child process for ${l.name} in ${l.cwd}`)}catch(p){e.warn(`[team] failed to spawn child process for ${l.name}: ${p instanceof Error?p.message:String(p)}`),l.isActive=!1}}return t.sendNotification("team.updated",{teamName:s.teamName,action:"created",members:c.members.map(l=>({agentName:l.name,role:l.role,worktreePath:l.worktreePath,pid:o.getHandle(Lo(s.teamName,l.name))?.pid}))}),{success:!0,team:c}},async deleteTeam(s){let i=r.get(s);if(!i)return{success:!1,error:`Team "${s}" not found.`};for(let c of i.members){let l=Lo(s,c.name);o.kill(l),o.remove(l)}let a=await po();if(a)for(let c of i.members)c.worktreePath&&c.worktreeBranch&&(await Wy(a,c.worktreePath,c.worktreeBranch,n),e.info(`[team] cleaned up worktree for ${c.name}: ${c.worktreePath}`));return r.delete(s),t.sendNotification("team.updated",{teamName:s,action:"destroyed",members:[]}),{success:!0}},async listTeams(){return{success:!0,teams:[...r.values()]}},async getTeamStatus(s){let i=r.get(s);if(!i)return{success:!1,error:`Team "${s}" not found.`};let a={};for(let c of i.members){let l=Lo(s,c.name),d=o.getStatus(l);d&&(c.isActive=d.alive,a[c.name]={mediaProgress:d.mediaProgress,lastToolCall:d.lastToolCall,idleFor:d.idleFor,runningFor:d.runningFor})}return{success:!0,team:i,memberProgress:a}},dispose(){o.dispose()}}}function Lo(t,e){return`team-${t}-${e}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase()}function xA({host:t,log:e,toolCatalog:r}){let n=PA(t,e);Xt(async()=>n.dispose()),r.addTool(wA(n))}var iH="notify",aH={type:"object",properties:{message:{type:"string",description:"Notification content to send to the user."},title:{type:"string",description:"Optional notification title/subject line."},priority:{type:"string",enum:["low","normal","high"],description:"Notification priority (default: normal). High may trigger sound/vibration."},channel:{type:"string",description:"Target delivery channel (e.g. 'wechat', 'feishu', 'discord'). Default: user's primary."}},required:["message"]};function CA(t){return{name:iH,label:"Notify",description:"Send a notification to the user. Used for alerting about completed long-running tasks, important updates, or requesting attention. Supports multiple channels (WeChat, Feishu, Discord, etc).",parameters:aH,execute:async(e,r)=>{if(!r.message||r.message.trim().length===0)return{content:[{type:"text",text:"Error: message is required."}],details:{type:"notify",error:"empty_message"}};let n=await t.sendNotification({message:r.message.trim(),title:r.title,priority:r.priority||"normal",channel:r.channel});return n.delivered?{content:[{type:"text",text:`Notification sent via ${n.channel}.`}],details:{type:"notify",delivered:!0,channel:n.channel}}:{content:[{type:"text",text:`Notification failed: ${n.error||"delivery error"}`}],details:{type:"notify",delivered:!1,error:n.error}}}}}var cH="send_message",lH={type:"object",properties:{to:{type:"string",description:"Target agent name or '*' for broadcast to all team members. Must be a valid agent name within the current team."},message:{type:"string",description:"Message content to send to the target agent."},summary:{type:"string",description:"Optional short summary (for logging/routing)."}},required:["to","message"]};function IA(t){return{name:cH,label:"Send Message",description:"Send a message to another agent in your team. Use '*' to broadcast to all teammates. Messages are delivered asynchronously. Use for coordination, delegation, and status updates.",parameters:lH,execute:async(e,r)=>{if(!r.to||r.to.trim().length===0)return{content:[{type:"text",text:"Error: 'to' is required (agent name or '*')."}],details:{type:"send_message",error:"missing_target"}};if(!r.message||r.message.trim().length===0)return{content:[{type:"text",text:"Error: message is required."}],details:{type:"send_message",error:"empty_message"}};if(r.to!=="*"&&t.listTeammates){let s=t.listTeammates();if(!s.includes(r.to))return{content:[{type:"text",text:`Error: agent "${r.to}" not found in team. Available: ${s.join(", ")}`}],details:{type:"send_message",error:"target_not_found",available:s}}}let n=await t.sendMessage({to:r.to.trim(),message:r.message.trim(),summary:r.summary,senderId:t.getSenderId()});return n.success?{content:[{type:"text",text:`Message sent to ${r.to==="*"?`broadcast (${n.recipients?.length||0} recipients)`:r.to}.`}],details:{type:"send_message",success:!0,to:r.to,recipients:n.recipients}}:{content:[{type:"text",text:`Message delivery failed: ${n.error||"unknown error"}`}],details:{type:"send_message",success:!1,error:n.error}}}}}function EA({host:t,log:e,toolCatalog:r}){r.addTool(CA({sendNotification:async n=>(e.info(`[notify] ${n.title??""}: ${n.message}`),{delivered:!0,channel:n.channel??"cli"})})),r.addTool(IA({sendMessage:async n=>(e.info(`[send_message] ${n.senderId} -> ${n.to}: ${n.message}`),{success:!0,recipients:[n.to]}),getSenderId:()=>t.currentSessionId??"default",listTeammates:()=>[]}))}function MA(t){oA({host:{get agent(){return t.host.agent},get currentTransport(){return t.host.currentTransport},get currentApiKey(){return t.host.currentApiKey},get currentModel(){return t.host.currentModel},sendNotification:t.host.sendNotification.bind(t.host)},hooks:t.hooks,log:t.log,toolCatalog:t.toolCatalog,toolInvoker:t.toolInvoker}),mA({toolCatalog:t.toolCatalog,host:{currentModel:t.host.currentModel,verbose:t.host.verbose}}),bA({toolCatalog:t.toolCatalog,host:{getActiveProjectRoot:()=>t.host.getActiveProjectRoot()}}),TA({log:t.log,toolCatalog:t.toolCatalog}),lA({config:t.config,toolCatalog:t.toolCatalog,host:{currentSessionId:t.host.currentSessionId}}),xA({host:{get currentSessionId(){return t.host.currentSessionId},get verbose(){return t.host.verbose},sendNotification:t.host.sendNotification.bind(t.host),emitAgentStatus:t.host.emitAgentStatus.bind(t.host),handleMcpToolCall:t.host.handleMcpToolCall.bind(t.host)},log:t.log,toolCatalog:t.toolCatalog}),EA({toolCatalog:t.toolCatalog,host:{get currentSessionId(){return t.host.currentSessionId}},log:t.log})}var dH={id:"cli-core-tools",kind:"core",register:uH};function _A(t){dH.register(t)}function uH(t){let e={get agent(){return t.host.getAgent()},get currentTransport(){return t.host.getCurrentTransport()},get currentApiKey(){return t.host.getCurrentApiKey()},get currentModel(){return t.host.getCurrentModel()},get currentSessionId(){return t.host.getCurrentSessionId()},getActiveProjectRoot:()=>t.host.getActiveProjectRoot(),get verbose(){return t.host.getVerbose()},sendNotification(n,o){t.host.sendNotification(n,o)},emitAgentStatus(n,o,s){t.host.emitAgentStatus(n,o,s)},handleMcpToolCall(n,o,s){return t.host.handleMcpToolCall(n,o,s)}},r={config:t.config,host:e,hooks:t.hooks,log:t.log,toolCatalog:t.toolCatalog,toolInvoker:t.toolInvoker};MA(r)}var pH={type:"object",properties:{operation:{type:"string",enum:["goToDefinition","findReferences","hover","documentSymbol","diagnostics","completion","signatureHelp","rename","codeAction"],description:`LSP operation:
1049
1049
  - goToDefinition: jump to symbol definition
1050
1050
  - findReferences: find all usages of a symbol
1051
1051
  - hover: get type/docs for symbol at position
@@ -1054,33 +1054,33 @@ ${i.map(c=>`\u2022 ${c.monitorId} [${c.source}] \u2192 ${c.target} (events: ${c.
1054
1054
  - completion: get completions at position
1055
1055
  - signatureHelp: get function signature at call site
1056
1056
  - rename: preview rename of symbol
1057
- - codeAction: get available quick-fixes/refactorings`},filePath:{type:"string",description:"File path. Absolute or relative to workspace root."},line:{type:"number",description:"Line number (1-indexed). Required for positional operations."},character:{type:"number",description:"Character position (1-indexed). Required for positional operations."},newName:{type:"string",description:"New name for rename operation."},includeContext:{type:"boolean",description:"Include surrounding code context in results (default: true)."}},required:["operation","filePath"]},pH=10*1024*1024,mH=["goToDefinition","findReferences","hover","completion","signatureHelp","rename","codeAction"];function DA(t){return{name:"lsp",label:"LSP",description:"Query language servers for code intelligence. Supports go-to-definition, find-references, hover (type info), document symbols, diagnostics (errors/warnings), completions, signature help, rename preview, and code actions. Read-only \u2014 does not modify files.",parameters:uH,execute:async(e,r)=>{if(!r.filePath||r.filePath.trim().length===0)return{content:[{type:"text",text:"Error: filePath is required."}],details:{type:"lsp",error:"missing_filePath"}};if(r.filePath.startsWith("\\\\")||r.filePath.startsWith("//"))return{content:[{type:"text",text:"Error: UNC paths are not allowed."}],details:{type:"lsp",error:"unc_blocked"}};if(mH.includes(r.operation)){if(r.line==null||r.character==null)return{content:[{type:"text",text:`Error: line and character are required for ${r.operation}.`}],details:{type:"lsp",error:"missing_position"}};if(r.line<1||r.character<1)return{content:[{type:"text",text:"Error: line and character must be \u2265 1."}],details:{type:"lsp",error:"invalid_position"}}}if(r.operation==="rename"&&!r.newName)return{content:[{type:"text",text:"Error: newName is required for rename operation."}],details:{type:"lsp",error:"missing_newName"}};let n=t.resolvePath(r.filePath);if(t.statFile){let s=await t.statFile(n);if(!s||!s.exists)return{content:[{type:"text",text:`Error: file not found: ${r.filePath}`}],details:{type:"lsp",error:"file_not_found"}};if(s.size>pH)return{content:[{type:"text",text:`Error: file too large (${(s.size/1024/1024).toFixed(1)}MB, max 10MB).`}],details:{type:"lsp",error:"file_too_large"}}}let o=await t.executeOperation({operation:r.operation,filePath:n,line:r.line,character:r.character,newName:r.newName,includeContext:r.includeContext??!0});return{content:[{type:"text",text:gH(r.operation,o)}],details:{type:"lsp",operation:r.operation}}}}}function gH(t,e){switch(e.type){case"locations":{if(e.locations.length===0)return"No results found.";let r=[`Found ${e.locations.length} location(s):`,""];for(let n of e.locations.slice(0,50))r.push(` ${n.filePath}:${n.line}:${n.character}`),n.context&&r.push(` ${n.context.trim()}`);return e.locations.length>50&&r.push(` ... and ${e.locations.length-50} more`),r.join(`
1057
+ - codeAction: get available quick-fixes/refactorings`},filePath:{type:"string",description:"File path. Absolute or relative to workspace root."},line:{type:"number",description:"Line number (1-indexed). Required for positional operations."},character:{type:"number",description:"Character position (1-indexed). Required for positional operations."},newName:{type:"string",description:"New name for rename operation."},includeContext:{type:"boolean",description:"Include surrounding code context in results (default: true)."}},required:["operation","filePath"]},mH=10*1024*1024,gH=["goToDefinition","findReferences","hover","completion","signatureHelp","rename","codeAction"];function DA(t){return{name:"lsp",label:"LSP",description:"Query language servers for code intelligence. Supports go-to-definition, find-references, hover (type info), document symbols, diagnostics (errors/warnings), completions, signature help, rename preview, and code actions. Read-only \u2014 does not modify files.",parameters:pH,execute:async(e,r)=>{if(!r.filePath||r.filePath.trim().length===0)return{content:[{type:"text",text:"Error: filePath is required."}],details:{type:"lsp",error:"missing_filePath"}};if(r.filePath.startsWith("\\\\")||r.filePath.startsWith("//"))return{content:[{type:"text",text:"Error: UNC paths are not allowed."}],details:{type:"lsp",error:"unc_blocked"}};if(gH.includes(r.operation)){if(r.line==null||r.character==null)return{content:[{type:"text",text:`Error: line and character are required for ${r.operation}.`}],details:{type:"lsp",error:"missing_position"}};if(r.line<1||r.character<1)return{content:[{type:"text",text:"Error: line and character must be \u2265 1."}],details:{type:"lsp",error:"invalid_position"}}}if(r.operation==="rename"&&!r.newName)return{content:[{type:"text",text:"Error: newName is required for rename operation."}],details:{type:"lsp",error:"missing_newName"}};let n=t.resolvePath(r.filePath);if(t.statFile){let s=await t.statFile(n);if(!s||!s.exists)return{content:[{type:"text",text:`Error: file not found: ${r.filePath}`}],details:{type:"lsp",error:"file_not_found"}};if(s.size>mH)return{content:[{type:"text",text:`Error: file too large (${(s.size/1024/1024).toFixed(1)}MB, max 10MB).`}],details:{type:"lsp",error:"file_too_large"}}}let o=await t.executeOperation({operation:r.operation,filePath:n,line:r.line,character:r.character,newName:r.newName,includeContext:r.includeContext??!0});return{content:[{type:"text",text:fH(r.operation,o)}],details:{type:"lsp",operation:r.operation}}}}}function fH(t,e){switch(e.type){case"locations":{if(e.locations.length===0)return"No results found.";let r=[`Found ${e.locations.length} location(s):`,""];for(let n of e.locations.slice(0,50))r.push(` ${n.filePath}:${n.line}:${n.character}`),n.context&&r.push(` ${n.context.trim()}`);return e.locations.length>50&&r.push(` ... and ${e.locations.length-50} more`),r.join(`
1058
1058
  `)}case"symbols":{if(e.symbols.length===0)return"No symbols found.";let r=[`Document symbols (${e.symbols.length}):`,""];for(let n of e.symbols)if(r.push(` ${n.kind} ${n.name} (L${n.range.startLine}-${n.range.endLine})`),n.children){for(let o of n.children.slice(0,10))r.push(` ${o.kind} ${o.name} (L${o.range.startLine})`);n.children.length>10&&r.push(` ... and ${n.children.length-10} more`)}return r.join(`
1059
1059
  `)}case"diagnostics":{if(e.diagnostics.length===0)return"No diagnostics (clean file).";let r=[`Diagnostics (${e.diagnostics.length}):`,""];for(let n of e.diagnostics){let o=n.severity==="error"?"\u274C":n.severity==="warning"?"\u26A0\uFE0F":"\u2139\uFE0F";r.push(` ${o} L${n.line}:${n.character} [${n.source||""}${n.code?`:${n.code}`:""}] ${n.message}`)}return r.join(`
1060
1060
  `)}case"hover":return e.hover?e.hover.contents:"No hover information available.";case"completions":{if(e.completions.length===0)return"No completions available.";let r=[`Completions (${e.completions.length}):`,""];for(let n of e.completions.slice(0,20))r.push(` [${n.kind}] ${n.label}${n.detail?` \u2014 ${n.detail}`:""}`);return e.completions.length>20&&r.push(` ... and ${e.completions.length-20} more`),r.join(`
1061
1061
  `)}case"signatureHelp":return e.signatures.length===0?"No signature information available.":e.signatures.join(`
1062
1062
  `);case"rename":{if(e.edits.length===0)return"No edits generated for rename.";let n=[`Rename would affect ${e.edits.reduce((o,s)=>o+s.edits.length,0)} location(s) in ${e.edits.length} file(s):`,""];for(let o of e.edits)n.push(` ${o.filePath} (${o.edits.length} edits)`);return n.join(`
1063
1063
  `)}case"codeActions":{if(e.actions.length===0)return"No code actions available.";let r=[`Available code actions (${e.actions.length}):`,""];for(let n of e.actions)r.push(` ${n.isPreferred?"\u2605":"-"} ${n.title}${n.kind?` [${n.kind}]`:""}`);return r.join(`
1064
- `)}default:return"Unknown result type."}}var fH="repl",hH={type:"object",properties:{code:{type:"string",description:`JavaScript code to execute. The VM has access to these built-in primitives:
1064
+ `)}default:return"Unknown result type."}}var hH="repl",yH={type:"object",properties:{code:{type:"string",description:`JavaScript code to execute. The VM has access to these built-in primitives:
1065
1065
  - readFile(path): Promise<string> \u2014 read a file
1066
1066
  - writeFile(path, content): Promise<void> \u2014 write a file
1067
1067
  - editFile(path, edits): Promise<string> \u2014 apply edits [{oldText, newText}]
1068
1068
  - exec(command): Promise<{stdout, stderr, exitCode}> \u2014 run shell command
1069
1069
  - glob(pattern): Promise<string[]> \u2014 find files by glob
1070
1070
  - grep(pattern, path?): Promise<{file,line,text}[]> \u2014 search files
1071
- Use this for batch operations (rename many files, transform data, etc) to reduce tool call round-trips.`}},required:["code"]};var NA=1e5,LA=5e4;function OA(t){return{name:fH,label:"REPL",description:"Execute JavaScript in a persistent VM with built-in file/shell primitives. Use for batch operations that would otherwise require many individual tool calls. The VM persists variables between calls within the same session. Each primitive (readFile, writeFile, exec, etc.) still goes through permission checks.",parameters:hH,execute:async(e,r)=>{if(!r.code||r.code.trim().length===0)return{content:[{type:"text",text:"Error: code is required."}],details:{type:"repl",error:"empty_code"}};if(r.code.length>NA)return{content:[{type:"text",text:`Error: code too large (${r.code.length} chars, max ${NA}).`}],details:{type:"repl",error:"code_too_large"}};let n=await t.executeInVm(r.code),o=n.output||"";return o.length>LA&&(o=o.slice(0,LA)+`
1071
+ Use this for batch operations (rename many files, transform data, etc) to reduce tool call round-trips.`}},required:["code"]};var NA=1e5,LA=5e4;function OA(t){return{name:hH,label:"REPL",description:"Execute JavaScript in a persistent VM with built-in file/shell primitives. Use for batch operations that would otherwise require many individual tool calls. The VM persists variables between calls within the same session. Each primitive (readFile, writeFile, exec, etc.) still goes through permission checks.",parameters:yH,execute:async(e,r)=>{if(!r.code||r.code.trim().length===0)return{content:[{type:"text",text:"Error: code is required."}],details:{type:"repl",error:"empty_code"}};if(r.code.length>NA)return{content:[{type:"text",text:`Error: code too large (${r.code.length} chars, max ${NA}).`}],details:{type:"repl",error:"code_too_large"}};let n=await t.executeInVm(r.code),o=n.output||"";return o.length>LA&&(o=o.slice(0,LA)+`
1072
1072
  ... (truncated)`),n.error?{content:[{type:"text",text:`Error: ${n.error}
1073
1073
 
1074
1074
  Output:
1075
1075
  ${o}`}],details:{type:"repl",error:n.error,duration:n.duration}}:{content:[{type:"text",text:o||"(no output)"}],details:{type:"repl",duration:n.duration,outputLength:o.length}}}}}import*as wa from"node:path";function jA(t){let e=t.workdir;return{executeOperation:async r=>{switch(r.operation){case"goToDefinition":case"findReferences":return{type:"locations",locations:[]};case"hover":return{type:"hover",hover:null};case"documentSymbol":return{type:"symbols",symbols:[]};case"diagnostics":return{type:"diagnostics",diagnostics:[]};case"completion":return{type:"completions",completions:[]};case"signatureHelp":return{type:"signatureHelp",signatures:[]};case"rename":return{type:"rename",edits:[]};case"codeAction":return{type:"codeActions",actions:[]};default:return{type:"locations",locations:[]}}},resolvePath:r=>wa.isAbsolute(r)?r:wa.resolve(e,r)}}import*as Oo from"node:fs";import*as Pn from"node:path";import*as Aa from"node:vm";function $A(t){let e,r=t.workdir,n=()=>(e||(e=Aa.createContext({...{readFile:async s=>Oo.promises.readFile(Pn.resolve(r,s),"utf8"),writeFile:async(s,i)=>{await Oo.promises.writeFile(Pn.resolve(r,s),i,"utf8")},editFile:async(s,i)=>{let a=await Oo.promises.readFile(Pn.resolve(r,s),"utf8");for(let c of i)a=a.replace(c.oldText,c.newText);return await Oo.promises.writeFile(Pn.resolve(r,s),a,"utf8"),a},exec:async s=>{let i=await import("node:child_process");return new Promise(a=>{i.execFile("bash",["-c",s],{cwd:r,timeout:3e4},(c,l,d)=>{a({stdout:l?.toString()??"",stderr:d?.toString()??"",exitCode:c?c.code??1:0})})})},glob:async s=>{try{let{globSync:i}=await import("node:fs");return i(s,{cwd:r})}catch{return[]}},grep:async(s,i)=>{let a=[],c=Pn.resolve(r,i??".");try{let l=await import("node:child_process"),d=await new Promise(p=>{l.execFile("grep",["-rn",s,c,"--include=*"],{timeout:1e4},(u,m)=>{p(m?.toString()??"")})});for(let p of d.split(`
1076
- `).filter(Boolean).slice(0,100)){let u=p.match(/^(.+?):(\d+):(.*)$/);u&&a.push({file:u[1],line:parseInt(u[2],10),text:u[3]})}}catch{}return a},console:{log:(...s)=>s.map(String).join(" ")}},setTimeout,clearTimeout,Promise,JSON,Math,Date,Array,Object,String,Number,Boolean,RegExp,Map,Set,Error,Buffer})),e);return{executeInVm:async o=>{let s=Date.now();try{let i=n(),a=await Aa.runInContext(`(async () => { ${o} })()`,i,{timeout:3e4});return{output:a!==void 0?String(a):"",duration:Date.now()-s}}catch(i){return{output:"",error:i instanceof Error?i.message:String(i),duration:Date.now()-s}}},resetVm:()=>{e=void 0}}}function UA(t){return[OA($A({workdir:t.workdir})),DA(jA({workdir:t.workdir}))]}function FA(t){for(let e of UA({workdir:t.workdir}))t.toolCatalog.addTool(e)}var yH={id:"dev-tools",kind:"dev",register:vH};function HA(t){yH.register(t)}function vH(t){let e=typeof t.config.workdir=="string"?t.config.workdir:t.pathService?.getActiveProjectRoot();if(!e)throw new Error("Dev tool bootstrap requires a workdir or PathService active project root.");FA({workdir:e,toolCatalog:t.toolCatalog})}import*as Ma from"node:fs";import Ia from"node:path";import{fileURLToPath as xH}from"node:url";import{spawn as SH}from"node:child_process";import{createInterface as TH}from"node:readline";var bH=new Set(["describe","fetch","find","get","inspect","list","query","read","search","stat"]),kH=new Set(["append","copy","create","delete","edit","move","patch","remove","rename","set","update","upload","write"]);function Pa(t){let e=t.annotations,r=RH(t.name),n=r.some(c=>kH.has(c)),o=r.some(c=>bH.has(c)),s=e?.destructiveHint===!0||n,i=e?.readOnlyHint===!0||!s&&o,a=i||e?.idempotentHint===!0&&!s;return{isReadOnly:i,isConcurrencySafe:a,isDestructive:s}}function RH(t){return t.replace(/([a-z0-9])([A-Z])/g,"$1_$2").toLowerCase().split(/[^a-z0-9]+/).filter(Boolean)}var xa=class{process=null;readline=null;pending=new Map;nextId=1;connected=!1;toolsCache=[];serverName="";serverVersion="";supportsToolsListChanged=!1;onToolsChanged=null;stderrBuffer="";config;constructor(e){this.config=e}async connect(){if(this.connected)return;let e={...process.env,...this.config.env};this.process=SH(this.config.command,this.config.args??[],{stdio:["pipe","pipe","pipe"],env:e,cwd:this.config.cwd,windowsHide:!0}),this.process.on("error",n=>{this.handleProcessError(n)}),this.process.on("exit",n=>{this.handleProcessExit(n)}),this.process.stderr?.on("data",n=>{this.stderrBuffer+=n.toString(),this.stderrBuffer.length>4096&&(this.stderrBuffer=this.stderrBuffer.slice(-4096))}),this.readline=TH({input:this.process.stdout,crlfDelay:Number.POSITIVE_INFINITY}),this.readline.on("line",n=>this.handleLine(n));let r=await this.sendRequest("initialize",{protocolVersion:"2024-11-05",capabilities:{},clientInfo:{name:"qlogicagent",version:"0.3.0"}},this.config.initTimeoutMs??3e4);this.serverName=r.serverInfo?.name??this.config.name,this.serverVersion=r.serverInfo?.version??"unknown",this.supportsToolsListChanged=r.capabilities?.tools?.listChanged??!1,this.sendNotification("notifications/initialized",{}),this.connected=!0,await this.refreshTools()}async disconnect(){if(!this.connected)return;this.connected=!1;for(let[,r]of this.pending)r.reject(new Error("MCP client disconnecting"));this.pending.clear(),this.toolsCache=[],this.readline?.close(),this.readline=null;let e=this.process;this.process=null,e&&await new Promise(r=>{let n=!1,o=()=>{n||(n=!0,clearTimeout(s),r())},s=setTimeout(()=>{e.kill("SIGKILL"),o()},5e3);e.once("exit",o),e.kill("SIGTERM")})}get isConnected(){return this.connected}get info(){return{name:this.serverName,version:this.serverVersion}}async refreshTools(){if(!this.connected)return[];try{let e=await this.sendRequest("tools/list",{});this.toolsCache=e.tools??[]}catch{this.toolsCache=[]}return this.toolsCache}getCachedTools(){return this.toolsCache}async callTool(e,r,n){if(!this.connected)throw new Error(`MCP server ${this.config.name} not connected`);return await this.sendRequest("tools/call",{name:e,arguments:r??{}},12e4,n)}async listResources(){if(!this.connected)return[];try{return(await this.sendRequest("resources/list",{})).resources??[]}catch{return[]}}async readResource(e){if(!this.connected)throw new Error(`MCP server ${this.config.name} not connected`);return(await this.sendRequest("resources/read",{uri:e})).contents??[]}toPortableTools(){let e=wH(this.config.name);return this.toolsCache.map(r=>{let n=Pa(r);return{name:`mcp__${e}__${r.name}`,label:`[${this.config.name}] ${r.name}`,description:r.description??`MCP tool from ${this.config.name}`,parameters:r.inputSchema??{type:"object",properties:{}},isConcurrencySafe:n.isConcurrencySafe,isReadOnly:n.isReadOnly,isDestructive:n.isDestructive,searchHint:`mcp ${this.config.name} ${r.name}`,execute:async(o,s,i)=>this.executeAsTool(r.name,s,i)}})}setOnToolsChanged(e){this.onToolsChanged=e}async executeAsTool(e,r,n){try{let o=await this.callTool(e,r,n);return{content:[{type:"text",text:o.content.filter(a=>a.type==="text"&&a.text).map(a=>a.text).join(`
1076
+ `).filter(Boolean).slice(0,100)){let u=p.match(/^(.+?):(\d+):(.*)$/);u&&a.push({file:u[1],line:parseInt(u[2],10),text:u[3]})}}catch{}return a},console:{log:(...s)=>s.map(String).join(" ")}},setTimeout,clearTimeout,Promise,JSON,Math,Date,Array,Object,String,Number,Boolean,RegExp,Map,Set,Error,Buffer})),e);return{executeInVm:async o=>{let s=Date.now();try{let i=n(),a=await Aa.runInContext(`(async () => { ${o} })()`,i,{timeout:3e4});return{output:a!==void 0?String(a):"",duration:Date.now()-s}}catch(i){return{output:"",error:i instanceof Error?i.message:String(i),duration:Date.now()-s}}},resetVm:()=>{e=void 0}}}function UA(t){return[OA($A({workdir:t.workdir})),DA(jA({workdir:t.workdir}))]}function FA(t){for(let e of UA({workdir:t.workdir}))t.toolCatalog.addTool(e)}var vH={id:"dev-tools",kind:"dev",register:bH};function HA(t){vH.register(t)}function bH(t){let e=typeof t.config.workdir=="string"?t.config.workdir:t.pathService?.getActiveProjectRoot();if(!e)throw new Error("Dev tool bootstrap requires a workdir or PathService active project root.");FA({workdir:e,toolCatalog:t.toolCatalog})}import*as Ma from"node:fs";import Ia from"node:path";import{fileURLToPath as CH}from"node:url";import{spawn as TH}from"node:child_process";import{createInterface as wH}from"node:readline";var kH=new Set(["describe","fetch","find","get","inspect","list","query","read","search","stat"]),RH=new Set(["append","copy","create","delete","edit","move","patch","remove","rename","set","update","upload","write"]);function Pa(t){let e=t.annotations,r=SH(t.name),n=r.some(c=>RH.has(c)),o=r.some(c=>kH.has(c)),s=e?.destructiveHint===!0||n,i=e?.readOnlyHint===!0||!s&&o,a=i||e?.idempotentHint===!0&&!s;return{isReadOnly:i,isConcurrencySafe:a,isDestructive:s}}function SH(t){return t.replace(/([a-z0-9])([A-Z])/g,"$1_$2").toLowerCase().split(/[^a-z0-9]+/).filter(Boolean)}var xa=class{process=null;readline=null;pending=new Map;nextId=1;connected=!1;toolsCache=[];serverName="";serverVersion="";supportsToolsListChanged=!1;onToolsChanged=null;stderrBuffer="";config;constructor(e){this.config=e}async connect(){if(this.connected)return;let e={...process.env,...this.config.env};this.process=TH(this.config.command,this.config.args??[],{stdio:["pipe","pipe","pipe"],env:e,cwd:this.config.cwd,windowsHide:!0}),this.process.on("error",n=>{this.handleProcessError(n)}),this.process.on("exit",n=>{this.handleProcessExit(n)}),this.process.stderr?.on("data",n=>{this.stderrBuffer+=n.toString(),this.stderrBuffer.length>4096&&(this.stderrBuffer=this.stderrBuffer.slice(-4096))}),this.readline=wH({input:this.process.stdout,crlfDelay:Number.POSITIVE_INFINITY}),this.readline.on("line",n=>this.handleLine(n));let r=await this.sendRequest("initialize",{protocolVersion:"2024-11-05",capabilities:{},clientInfo:{name:"qlogicagent",version:"0.3.0"}},this.config.initTimeoutMs??3e4);this.serverName=r.serverInfo?.name??this.config.name,this.serverVersion=r.serverInfo?.version??"unknown",this.supportsToolsListChanged=r.capabilities?.tools?.listChanged??!1,this.sendNotification("notifications/initialized",{}),this.connected=!0,await this.refreshTools()}async disconnect(){if(!this.connected)return;this.connected=!1;for(let[,r]of this.pending)r.reject(new Error("MCP client disconnecting"));this.pending.clear(),this.toolsCache=[],this.readline?.close(),this.readline=null;let e=this.process;this.process=null,e&&await new Promise(r=>{let n=!1,o=()=>{n||(n=!0,clearTimeout(s),r())},s=setTimeout(()=>{e.kill("SIGKILL"),o()},5e3);e.once("exit",o),e.kill("SIGTERM")})}get isConnected(){return this.connected}get info(){return{name:this.serverName,version:this.serverVersion}}async refreshTools(){if(!this.connected)return[];try{let e=await this.sendRequest("tools/list",{});this.toolsCache=e.tools??[]}catch{this.toolsCache=[]}return this.toolsCache}getCachedTools(){return this.toolsCache}async callTool(e,r,n){if(!this.connected)throw new Error(`MCP server ${this.config.name} not connected`);return await this.sendRequest("tools/call",{name:e,arguments:r??{}},12e4,n)}async listResources(){if(!this.connected)return[];try{return(await this.sendRequest("resources/list",{})).resources??[]}catch{return[]}}async readResource(e){if(!this.connected)throw new Error(`MCP server ${this.config.name} not connected`);return(await this.sendRequest("resources/read",{uri:e})).contents??[]}toPortableTools(){let e=AH(this.config.name);return this.toolsCache.map(r=>{let n=Pa(r);return{name:`mcp__${e}__${r.name}`,label:`[${this.config.name}] ${r.name}`,description:r.description??`MCP tool from ${this.config.name}`,parameters:r.inputSchema??{type:"object",properties:{}},isConcurrencySafe:n.isConcurrencySafe,isReadOnly:n.isReadOnly,isDestructive:n.isDestructive,searchHint:`mcp ${this.config.name} ${r.name}`,execute:async(o,s,i)=>this.executeAsTool(r.name,s,i)}})}setOnToolsChanged(e){this.onToolsChanged=e}async executeAsTool(e,r,n){try{let o=await this.callTool(e,r,n);return{content:[{type:"text",text:o.content.filter(a=>a.type==="text"&&a.text).map(a=>a.text).join(`
1077
1077
  `)||"(no text output)"}],...o.isError?{details:{error:"mcp_tool_error"}}:{}}}catch(o){let s=o instanceof Error?o.message:String(o);return{content:[{type:"text",text:`MCP tool error: ${s}`}],details:{error:s}}}}sendRequest(e,r,n=3e4,o){return new Promise((s,i)=>{if(o?.aborted){i(new Error("Aborted"));return}let a=this.nextId++,c={jsonrpc:"2.0",id:a,method:e,params:r},l=setTimeout(()=>{this.pending.delete(a),i(new Error(`MCP request ${e} timed out after ${n}ms`))},n),d=()=>{clearTimeout(l),this.pending.delete(a)};o?.addEventListener("abort",()=>{d(),i(new Error("Aborted"))},{once:!0}),this.pending.set(a,{resolve:p=>{d(),p.error?i(new Error(`MCP error ${p.error.code}: ${p.error.message}`)):s(p.result)},reject:p=>{d(),i(p)}}),this.writeLine(JSON.stringify(c))})}sendNotification(e,r){let n={jsonrpc:"2.0",method:e,params:r};this.writeLine(JSON.stringify(n))}writeLine(e){this.process?.stdin?.writable&&this.process.stdin.write(e+`
1078
- `)}handleLine(e){let r=e.trim();if(!r)return;let n;try{n=JSON.parse(r)}catch{return}if("id"in n&&("result"in n||"error"in n)){let o=n.id,s=this.pending.get(o);s&&s.resolve(n)}else"method"in n&&!("id"in n)&&this.handleNotification(n)}handleNotification(e){e.method==="notifications/tools/list_changed"&&this.refreshTools().then(()=>{this.onToolsChanged?.()}).catch(()=>{})}handleProcessError(e){this.connected=!1;for(let[,r]of this.pending)r.reject(new Error(`MCP process error: ${e.message}`));this.pending.clear()}handleProcessExit(e){this.connected=!1;for(let[,r]of this.pending)r.reject(new Error(`MCP process exited with code ${e}`));this.pending.clear()}};function wH(t){return t.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}import{randomUUID as AH}from"node:crypto";var Ca=class{connected=!1;toolsCache=[];serverName="";serverVersion="";sessionId=null;onToolsChanged=null;config;constructor(e){this.config=e}async connect(){if(this.connected)return;let e=await this.sendRequest("initialize",{protocolVersion:"2025-03-26",capabilities:{},clientInfo:{name:"qlogicagent",version:"0.3.0"}},this.config.initTimeoutMs??3e4);this.serverName=e.serverInfo?.name??this.config.name,this.serverVersion=e.serverInfo?.version??"unknown",await this.sendNotification("notifications/initialized",{}),this.connected=!0,await this.refreshTools()}async disconnect(){this.connected=!1,this.toolsCache=[],this.sessionId=null}async callTool(e,r,n){if(!this.connected)throw new Error(`MCP server ${this.config.name} not connected`);return await this.sendRequest("tools/call",{name:e,arguments:r??{}},this.config.toolCallTimeoutMs??12e4,n)}async listResources(){if(!this.connected)return[];try{return(await this.sendRequest("resources/list",{})).resources??[]}catch{return[]}}async readResource(e){if(!this.connected)throw new Error(`MCP server ${this.config.name} not connected`);return(await this.sendRequest("resources/read",{uri:e})).contents??[]}toPortableTools(){return this.toolsCache.map(e=>this.schemaToPortableTool(e))}getCachedTools(){return[...this.toolsCache]}get isConnected(){return this.connected}get info(){return{name:this.serverName,version:this.serverVersion}}setOnToolsChanged(e){this.onToolsChanged=e}async refreshTools(){let e=await this.sendRequest("tools/list",{});this.toolsCache=e.tools??[]}async sendRequest(e,r,n=3e4,o){let s=AH(),i={jsonrpc:"2.0",id:s,method:e,params:r},a=new AbortController,c=setTimeout(()=>a.abort(),n);o&&o.addEventListener("abort",()=>a.abort(),{once:!0});try{let l={"Content-Type":"application/json",Accept:"application/json, text/event-stream",...this.config.headers};this.sessionId&&(l["Mcp-Session-Id"]=this.sessionId);let d=await fetch(this.config.url,{method:"POST",headers:l,body:JSON.stringify(i),signal:a.signal}),p=d.headers.get("mcp-session-id");if(p&&(this.sessionId=p),!d.ok)throw new Error(`MCP HTTP error ${d.status}: ${d.statusText}`);if((d.headers.get("content-type")??"").includes("text/event-stream"))return await this.parseSSEResponse(d,s);let m=await d.json();if(m.error)throw new Error(`MCP error ${m.error.code}: ${m.error.message}`);return m.result}finally{clearTimeout(c)}}async sendNotification(e,r){let n={jsonrpc:"2.0",method:e,params:r},o={"Content-Type":"application/json",...this.config.headers};this.sessionId&&(o["Mcp-Session-Id"]=this.sessionId),await fetch(this.config.url,{method:"POST",headers:o,body:JSON.stringify(n)}).catch(()=>{})}async parseSSEResponse(e,r){let n=e.body;if(!n)throw new Error("MCP SSE response has no body");let o=n.getReader(),s=new TextDecoder,i="";try{for(;;){let{done:a,value:c}=await o.read();if(a)break;i+=s.decode(c,{stream:!0});let l=i.split(`
1079
- `);i=l.pop()??"";for(let d of l){if(!d.startsWith("data: "))continue;let p=d.slice(6).trim();if(p)try{let u=JSON.parse(p);if("method"in u&&u.method==="notifications/tools/list_changed"){this.onToolsChanged?.();continue}if(u.id===r){if(u.error)throw new Error(`MCP error ${u.error.code}: ${u.error.message}`);return u.result}}catch(u){if(u instanceof Error&&u.message.startsWith("MCP error"))throw u}}}}finally{o.releaseLock()}throw new Error("MCP SSE stream ended without response")}schemaToPortableTool(e){let r=this,n=PH(this.config.name),o=Pa(e);return{name:`mcp__${n}__${e.name}`,label:`[${this.config.name}] ${e.name}`,description:e.description??`MCP tool from ${this.config.name}`,parameters:e.inputSchema??{type:"object",properties:{}},isConcurrencySafe:o.isConcurrencySafe,isReadOnly:o.isReadOnly,isDestructive:o.isDestructive,searchHint:`mcp ${this.config.name} ${e.name}`,execute:async(s,i,a)=>{try{let c=await r.callTool(e.name,i,a);return{content:[{type:"text",text:(c.content??[]).filter(p=>p.type==="text"&&p.text).map(p=>p.text).join(`
1080
- `)||"(no output)"}],details:c.isError?{type:"mcp",error:"tool_error"}:{type:"mcp"}}}catch(c){let l=c instanceof Error?c.message:String(c);return{content:[{type:"text",text:`MCP tool error: ${l}`}],details:{type:"mcp",error:l}}}}}}};function PH(t){return t.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}var Ea=class{clients=new Map;injected=!1;log;workspaceRoot;toolCatalog;constructor(e){this.log=e.log??{info:()=>{},warn:()=>{}},this.workspaceRoot=e.workspaceRoot?Ia.resolve(e.workspaceRoot):void 0,this.toolCatalog=e.toolCatalog;for(let r of e.servers){if(r.disabled)continue;if((r.type??(r.url?"http":"stdio"))==="http"){if(!r.url){this.log.warn(`[mcp] server "${r.name}" is type "http" but has no url, skipping`);continue}let o={name:r.name,url:r.url,headers:r.headers,initTimeoutMs:r.initTimeoutMs};this.clients.set(r.name,new Ca(o))}else{if(!r.command){this.log.warn(`[mcp] server "${r.name}" is type "stdio" but has no command, skipping`);continue}let o={name:r.name,command:r.command,args:r.args,env:r.env,cwd:r.cwd,initTimeoutMs:r.initTimeoutMs};this.clients.set(r.name,new xa(o))}}}async connectAll(){let e=Array.from(this.clients.entries()).map(async([r,n])=>{try{await n.connect(),this.log.info(`[mcp] connected to ${r} (${n.info.name} v${n.info.version})`),n.setOnToolsChanged(()=>{this.log.info(`[mcp] tools changed on ${r}, re-injecting`),this.injected&&this.reinjectTools(r,n)})}catch(o){this.log.warn(`[mcp] failed to connect to ${r}: ${o instanceof Error?o.message:o}`)}});await Promise.allSettled(e)}injectTools(){this.injected=!0;for(let[e,r]of this.clients){if(!r.isConnected)continue;let n=this.wrapToolsForWorkspaceBoundary(r.toPortableTools());this.registerTools(n),this.log.info(`[mcp] injected ${n.length} tools from ${e}`)}}getConnectedServers(){return Array.from(this.clients.entries()).filter(([,e])=>e.isConnected).map(([e])=>e)}getToolCount(){let e=0;for(let r of this.clients.values())r.isConnected&&(e+=r.getCachedTools().length);return e}async disconnectAll(){let e=Array.from(this.clients.values()).map(async r=>{try{await r.disconnect()}catch{}});await Promise.allSettled(e),this.clients.clear(),this.injected=!1}async listResources(e){let r=e?[[e,this.clients.get(e)]].filter(([,o])=>o):Array.from(this.clients.entries());return(await Promise.all(r.map(async([o,s])=>{if(!s?.isConnected||!s.listResources)return[];try{return(await s.listResources()).map(a=>({...a,server:o}))}catch{return this.log.warn(`[mcp] failed to list resources from ${o}`),[]}}))).flat()}async readResource(e,r){let n=this.clients.get(e);if(!n?.isConnected)throw new Error(`MCP server "${e}" is not connected`);if(!n.readResource)throw new Error(`MCP server "${e}" does not support resources`);let o=BA(`mcp__${WA(e)}__read_resource`,{uri:r},this.workspaceRoot);if(o)throw new Error(o);return n.readResource(r)}wrapToolsForWorkspaceBoundary(e){return this.workspaceRoot?e.map(r=>{if(!r.execute)return r;let n=r.execute;return{...r,execute:async(o,s,i)=>{let a=BA(r.name,s,this.workspaceRoot);return a?{content:[{type:"text",text:a}],details:{type:"mcp",error:"workspace_boundary"}}:n(o,s,i)}}}):e}reinjectTools(e,r){if(!this.injected)return;let n=`mcp__${WA(e)}__`;for(let s of this.getRegisteredToolNames())s.startsWith(n)&&this.removeRegisteredTool(s);let o=this.wrapToolsForWorkspaceBoundary(r.toPortableTools());this.registerTools(o),this.log.info(`[mcp] re-injected ${o.length} tools from ${e}`)}registerTools(e){this.toolCatalog?this.toolCatalog.addTools(e):ni(e)}getRegisteredToolNames(){return this.toolCatalog?.getToolNames()??oi()}removeRegisteredTool(e){return this.toolCatalog?.removeTool(e)??un(e)}},CH=/(?:^|_)(path|paths|file|files|filename|filenames|dir|dirs|directory|directories|folder|folders|cwd|root|uri)(?:$|_)/i;function BA(t,e,r){if(!r)return null;for(let n of wp(e)){let o=MH(n.value,r);if(o&&!_H(o.candidate,o.root,o.pathApi))return`Blocked: MCP tool "${t}" path "${n.value}" is outside the workspace boundary "${o.root}"`}return null}function wp(t,e="",r=0){if(r>8)return[];if(typeof t=="string")return IH(e,t)?[{key:e,value:t}]:[];if(Array.isArray(t))return t.flatMap(o=>wp(o,e,r+1));if(!t||typeof t!="object")return[];let n=[];for(let[o,s]of Object.entries(t))n.push(...wp(s,o,r+1));return n}function IH(t,e){if(!CH.test(t))return!1;let r=e.trim();return!r||/^https?:\/\//i.test(r)?!1:EH(r)}function EH(t){return Ia.isAbsolute(t)||/^[A-Za-z]:[\\/]/.test(t)||/^\\\\/.test(t)||/^file:\/\//i.test(t)||t.includes("../")||t.includes("..\\")||t.startsWith(".\\")||t.startsWith("./")||t.includes("/")||t.includes("\\")}function MH(t,e){let r=t.trim();if(/^file:\/\//i.test(r))try{r=xH(r)}catch{return null}let n=qA(r)||qA(e)?Ia.win32:Ia,o=n.resolve(e);return{candidate:n.isAbsolute(r)?n.resolve(r):n.resolve(o,r),root:o,pathApi:n}}function _H(t,e,r){let n=r.relative(e,t);return n===""||!n.startsWith("..")&&!r.isAbsolute(n)}function qA(t){return/^[A-Za-z]:[\\/]/.test(t)||/^\\\\/.test(t)}function WA(t){return t.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}function Ap(t){if(!t||typeof t!="object")return[];let e=t,r=[],n=e.mcpServers??e.servers??e;for(let[o,s]of Object.entries(n)){if(!s||typeof s!="object")continue;let i=s;if(typeof i.url=="string"){r.push({name:o,type:"http",url:i.url,headers:i.headers&&typeof i.headers=="object"?i.headers:void 0,disabled:i.disabled===!0,initTimeoutMs:typeof i.initTimeoutMs=="number"?i.initTimeoutMs:void 0});continue}typeof i.command=="string"&&r.push({name:o,type:"stdio",command:i.command,args:Array.isArray(i.args)?i.args:void 0,env:i.env&&typeof i.env=="object"?i.env:void 0,cwd:typeof i.cwd=="string"?i.cwd:void 0,disabled:i.disabled===!0})}return r}var DH={type:"object",properties:{server:{type:"string",description:"MCP server name to list resources from. Omit to list from all connected servers."}}};function GA(t){return{name:"list_mcp_resources",label:"List MCP Resources",description:"List resources available from connected MCP servers. Resources are data items (files, database records, API data) exposed by MCP servers that can be read with read_mcp_resource.",parameters:DH,shouldDefer:!0,isConcurrencySafe:!0,isReadOnly:!0,searchHint:"mcp resource list browse discover",execute:async(e,r)=>{let n=t();if(!n)return{content:[{type:"text",text:"No MCP servers configured."}],details:{type:"list_mcp_resources",count:0}};let o=await n.listResources(r.server);if(o.length===0)return{content:[{type:"text",text:r.server?`No resources found from MCP server "${r.server}".`:"No resources found from any connected MCP server."}],details:{type:"list_mcp_resources",count:0}};let s=new Map;for(let a of o){let c=s.get(a.server)??[];c.push(a),s.set(a.server,c)}let i=[];for(let[a,c]of s){i.push(`Server: ${a} (${c.length} resources)`);for(let l of c){let d=l.mimeType?` [${l.mimeType}]`:"",p=l.description?` \u2014 ${l.description}`:"";i.push(` ${l.name}: ${l.uri}${d}${p}`)}i.push("")}return{content:[{type:"text",text:i.join(`
1081
- `).trim()}],details:{type:"list_mcp_resources",count:o.length}}}}}var NH={type:"object",properties:{server:{type:"string",description:"Name of the MCP server that hosts the resource."},uri:{type:"string",description:"URI of the resource to read (from list_mcp_resources output)."}},required:["server","uri"]};function zA(t){return{name:"read_mcp_resource",label:"Read MCP Resource",description:"Read a specific resource from an MCP server by URI. Returns the resource content (text or binary metadata). Use list_mcp_resources first to discover available URIs.",parameters:NH,shouldDefer:!0,isConcurrencySafe:!0,isReadOnly:!0,searchHint:"mcp resource read fetch content",execute:async(e,r)=>{let n=t();if(!n)return{content:[{type:"text",text:"No MCP servers configured."}],details:{error:"no_mcp"}};try{let o=await n.readResource(r.server,r.uri);if(o.length===0)return{content:[{type:"text",text:`Resource "${r.uri}" returned no content.`}],details:{type:"read_mcp_resource",empty:!0}};let s=[];for(let i of o)if(i.text){let a=i.mimeType?` (${i.mimeType})`:"";s.push({type:"text",text:`--- ${i.uri}${a}-
1078
+ `)}handleLine(e){let r=e.trim();if(!r)return;let n;try{n=JSON.parse(r)}catch{return}if("id"in n&&("result"in n||"error"in n)){let o=n.id,s=this.pending.get(o);s&&s.resolve(n)}else"method"in n&&!("id"in n)&&this.handleNotification(n)}handleNotification(e){e.method==="notifications/tools/list_changed"&&this.refreshTools().then(()=>{this.onToolsChanged?.()}).catch(()=>{})}handleProcessError(e){this.connected=!1;for(let[,r]of this.pending)r.reject(new Error(`MCP process error: ${e.message}`));this.pending.clear()}handleProcessExit(e){this.connected=!1;for(let[,r]of this.pending)r.reject(new Error(`MCP process exited with code ${e}`));this.pending.clear()}};function AH(t){return t.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}import{randomUUID as PH}from"node:crypto";var Ca=class{connected=!1;toolsCache=[];serverName="";serverVersion="";sessionId=null;onToolsChanged=null;config;constructor(e){this.config=e}async connect(){if(this.connected)return;let e=await this.sendRequest("initialize",{protocolVersion:"2025-03-26",capabilities:{},clientInfo:{name:"qlogicagent",version:"0.3.0"}},this.config.initTimeoutMs??3e4);this.serverName=e.serverInfo?.name??this.config.name,this.serverVersion=e.serverInfo?.version??"unknown",await this.sendNotification("notifications/initialized",{}),this.connected=!0,await this.refreshTools()}async disconnect(){this.connected=!1,this.toolsCache=[],this.sessionId=null}async callTool(e,r,n){if(!this.connected)throw new Error(`MCP server ${this.config.name} not connected`);return await this.sendRequest("tools/call",{name:e,arguments:r??{}},this.config.toolCallTimeoutMs??12e4,n)}async listResources(){if(!this.connected)return[];try{return(await this.sendRequest("resources/list",{})).resources??[]}catch{return[]}}async readResource(e){if(!this.connected)throw new Error(`MCP server ${this.config.name} not connected`);return(await this.sendRequest("resources/read",{uri:e})).contents??[]}toPortableTools(){return this.toolsCache.map(e=>this.schemaToPortableTool(e))}getCachedTools(){return[...this.toolsCache]}get isConnected(){return this.connected}get info(){return{name:this.serverName,version:this.serverVersion}}setOnToolsChanged(e){this.onToolsChanged=e}async refreshTools(){let e=await this.sendRequest("tools/list",{});this.toolsCache=e.tools??[]}async sendRequest(e,r,n=3e4,o){let s=PH(),i={jsonrpc:"2.0",id:s,method:e,params:r},a=new AbortController,c=setTimeout(()=>a.abort(),n);o&&o.addEventListener("abort",()=>a.abort(),{once:!0});try{let l={"Content-Type":"application/json",Accept:"application/json, text/event-stream",...this.config.headers};this.sessionId&&(l["Mcp-Session-Id"]=this.sessionId);let d=await fetch(this.config.url,{method:"POST",headers:l,body:JSON.stringify(i),signal:a.signal}),p=d.headers.get("mcp-session-id");if(p&&(this.sessionId=p),!d.ok)throw new Error(`MCP HTTP error ${d.status}: ${d.statusText}`);if((d.headers.get("content-type")??"").includes("text/event-stream"))return await this.parseSSEResponse(d,s);let m=await d.json();if(m.error)throw new Error(`MCP error ${m.error.code}: ${m.error.message}`);return m.result}finally{clearTimeout(c)}}async sendNotification(e,r){let n={jsonrpc:"2.0",method:e,params:r},o={"Content-Type":"application/json",...this.config.headers};this.sessionId&&(o["Mcp-Session-Id"]=this.sessionId),await fetch(this.config.url,{method:"POST",headers:o,body:JSON.stringify(n)}).catch(()=>{})}async parseSSEResponse(e,r){let n=e.body;if(!n)throw new Error("MCP SSE response has no body");let o=n.getReader(),s=new TextDecoder,i="";try{for(;;){let{done:a,value:c}=await o.read();if(a)break;i+=s.decode(c,{stream:!0});let l=i.split(`
1079
+ `);i=l.pop()??"";for(let d of l){if(!d.startsWith("data: "))continue;let p=d.slice(6).trim();if(p)try{let u=JSON.parse(p);if("method"in u&&u.method==="notifications/tools/list_changed"){this.onToolsChanged?.();continue}if(u.id===r){if(u.error)throw new Error(`MCP error ${u.error.code}: ${u.error.message}`);return u.result}}catch(u){if(u instanceof Error&&u.message.startsWith("MCP error"))throw u}}}}finally{o.releaseLock()}throw new Error("MCP SSE stream ended without response")}schemaToPortableTool(e){let r=this,n=xH(this.config.name),o=Pa(e);return{name:`mcp__${n}__${e.name}`,label:`[${this.config.name}] ${e.name}`,description:e.description??`MCP tool from ${this.config.name}`,parameters:e.inputSchema??{type:"object",properties:{}},isConcurrencySafe:o.isConcurrencySafe,isReadOnly:o.isReadOnly,isDestructive:o.isDestructive,searchHint:`mcp ${this.config.name} ${e.name}`,execute:async(s,i,a)=>{try{let c=await r.callTool(e.name,i,a);return{content:[{type:"text",text:(c.content??[]).filter(p=>p.type==="text"&&p.text).map(p=>p.text).join(`
1080
+ `)||"(no output)"}],details:c.isError?{type:"mcp",error:"tool_error"}:{type:"mcp"}}}catch(c){let l=c instanceof Error?c.message:String(c);return{content:[{type:"text",text:`MCP tool error: ${l}`}],details:{type:"mcp",error:l}}}}}}};function xH(t){return t.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}var Ea=class{clients=new Map;injected=!1;log;workspaceRoot;toolCatalog;constructor(e){this.log=e.log??{info:()=>{},warn:()=>{}},this.workspaceRoot=e.workspaceRoot?Ia.resolve(e.workspaceRoot):void 0,this.toolCatalog=e.toolCatalog;for(let r of e.servers){if(r.disabled)continue;if((r.type??(r.url?"http":"stdio"))==="http"){if(!r.url){this.log.warn(`[mcp] server "${r.name}" is type "http" but has no url, skipping`);continue}let o={name:r.name,url:r.url,headers:r.headers,initTimeoutMs:r.initTimeoutMs};this.clients.set(r.name,new Ca(o))}else{if(!r.command){this.log.warn(`[mcp] server "${r.name}" is type "stdio" but has no command, skipping`);continue}let o={name:r.name,command:r.command,args:r.args,env:r.env,cwd:r.cwd,initTimeoutMs:r.initTimeoutMs};this.clients.set(r.name,new xa(o))}}}async connectAll(){let e=Array.from(this.clients.entries()).map(async([r,n])=>{try{await n.connect(),this.log.info(`[mcp] connected to ${r} (${n.info.name} v${n.info.version})`),n.setOnToolsChanged(()=>{this.log.info(`[mcp] tools changed on ${r}, re-injecting`),this.injected&&this.reinjectTools(r,n)})}catch(o){this.log.warn(`[mcp] failed to connect to ${r}: ${o instanceof Error?o.message:o}`)}});await Promise.allSettled(e)}injectTools(){this.injected=!0;for(let[e,r]of this.clients){if(!r.isConnected)continue;let n=this.wrapToolsForWorkspaceBoundary(r.toPortableTools());this.registerTools(n),this.log.info(`[mcp] injected ${n.length} tools from ${e}`)}}getConnectedServers(){return Array.from(this.clients.entries()).filter(([,e])=>e.isConnected).map(([e])=>e)}getToolCount(){let e=0;for(let r of this.clients.values())r.isConnected&&(e+=r.getCachedTools().length);return e}async disconnectAll(){let e=Array.from(this.clients.values()).map(async r=>{try{await r.disconnect()}catch{}});await Promise.allSettled(e),this.clients.clear(),this.injected=!1}async listResources(e){let r=e?[[e,this.clients.get(e)]].filter(([,o])=>o):Array.from(this.clients.entries());return(await Promise.all(r.map(async([o,s])=>{if(!s?.isConnected||!s.listResources)return[];try{return(await s.listResources()).map(a=>({...a,server:o}))}catch{return this.log.warn(`[mcp] failed to list resources from ${o}`),[]}}))).flat()}async readResource(e,r){let n=this.clients.get(e);if(!n?.isConnected)throw new Error(`MCP server "${e}" is not connected`);if(!n.readResource)throw new Error(`MCP server "${e}" does not support resources`);let o=BA(`mcp__${WA(e)}__read_resource`,{uri:r},this.workspaceRoot);if(o)throw new Error(o);return n.readResource(r)}wrapToolsForWorkspaceBoundary(e){return this.workspaceRoot?e.map(r=>{if(!r.execute)return r;let n=r.execute;return{...r,execute:async(o,s,i)=>{let a=BA(r.name,s,this.workspaceRoot);return a?{content:[{type:"text",text:a}],details:{type:"mcp",error:"workspace_boundary"}}:n(o,s,i)}}}):e}reinjectTools(e,r){if(!this.injected)return;let n=`mcp__${WA(e)}__`;for(let s of this.getRegisteredToolNames())s.startsWith(n)&&this.removeRegisteredTool(s);let o=this.wrapToolsForWorkspaceBoundary(r.toPortableTools());this.registerTools(o),this.log.info(`[mcp] re-injected ${o.length} tools from ${e}`)}registerTools(e){this.toolCatalog?this.toolCatalog.addTools(e):ni(e)}getRegisteredToolNames(){return this.toolCatalog?.getToolNames()??oi()}removeRegisteredTool(e){return this.toolCatalog?.removeTool(e)??un(e)}},IH=/(?:^|_)(path|paths|file|files|filename|filenames|dir|dirs|directory|directories|folder|folders|cwd|root|uri)(?:$|_)/i;function BA(t,e,r){if(!r)return null;for(let n of wp(e)){let o=_H(n.value,r);if(o&&!DH(o.candidate,o.root,o.pathApi))return`Blocked: MCP tool "${t}" path "${n.value}" is outside the workspace boundary "${o.root}"`}return null}function wp(t,e="",r=0){if(r>8)return[];if(typeof t=="string")return EH(e,t)?[{key:e,value:t}]:[];if(Array.isArray(t))return t.flatMap(o=>wp(o,e,r+1));if(!t||typeof t!="object")return[];let n=[];for(let[o,s]of Object.entries(t))n.push(...wp(s,o,r+1));return n}function EH(t,e){if(!IH.test(t))return!1;let r=e.trim();return!r||/^https?:\/\//i.test(r)?!1:MH(r)}function MH(t){return Ia.isAbsolute(t)||/^[A-Za-z]:[\\/]/.test(t)||/^\\\\/.test(t)||/^file:\/\//i.test(t)||t.includes("../")||t.includes("..\\")||t.startsWith(".\\")||t.startsWith("./")||t.includes("/")||t.includes("\\")}function _H(t,e){let r=t.trim();if(/^file:\/\//i.test(r))try{r=CH(r)}catch{return null}let n=qA(r)||qA(e)?Ia.win32:Ia,o=n.resolve(e);return{candidate:n.isAbsolute(r)?n.resolve(r):n.resolve(o,r),root:o,pathApi:n}}function DH(t,e,r){let n=r.relative(e,t);return n===""||!n.startsWith("..")&&!r.isAbsolute(n)}function qA(t){return/^[A-Za-z]:[\\/]/.test(t)||/^\\\\/.test(t)}function WA(t){return t.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}function Ap(t){if(!t||typeof t!="object")return[];let e=t,r=[],n=e.mcpServers??e.servers??e;for(let[o,s]of Object.entries(n)){if(!s||typeof s!="object")continue;let i=s;if(typeof i.url=="string"){r.push({name:o,type:"http",url:i.url,headers:i.headers&&typeof i.headers=="object"?i.headers:void 0,disabled:i.disabled===!0,initTimeoutMs:typeof i.initTimeoutMs=="number"?i.initTimeoutMs:void 0});continue}typeof i.command=="string"&&r.push({name:o,type:"stdio",command:i.command,args:Array.isArray(i.args)?i.args:void 0,env:i.env&&typeof i.env=="object"?i.env:void 0,cwd:typeof i.cwd=="string"?i.cwd:void 0,disabled:i.disabled===!0})}return r}var NH={type:"object",properties:{server:{type:"string",description:"MCP server name to list resources from. Omit to list from all connected servers."}}};function GA(t){return{name:"list_mcp_resources",label:"List MCP Resources",description:"List resources available from connected MCP servers. Resources are data items (files, database records, API data) exposed by MCP servers that can be read with read_mcp_resource.",parameters:NH,shouldDefer:!0,isConcurrencySafe:!0,isReadOnly:!0,searchHint:"mcp resource list browse discover",execute:async(e,r)=>{let n=t();if(!n)return{content:[{type:"text",text:"No MCP servers configured."}],details:{type:"list_mcp_resources",count:0}};let o=await n.listResources(r.server);if(o.length===0)return{content:[{type:"text",text:r.server?`No resources found from MCP server "${r.server}".`:"No resources found from any connected MCP server."}],details:{type:"list_mcp_resources",count:0}};let s=new Map;for(let a of o){let c=s.get(a.server)??[];c.push(a),s.set(a.server,c)}let i=[];for(let[a,c]of s){i.push(`Server: ${a} (${c.length} resources)`);for(let l of c){let d=l.mimeType?` [${l.mimeType}]`:"",p=l.description?` \u2014 ${l.description}`:"";i.push(` ${l.name}: ${l.uri}${d}${p}`)}i.push("")}return{content:[{type:"text",text:i.join(`
1081
+ `).trim()}],details:{type:"list_mcp_resources",count:o.length}}}}}var LH={type:"object",properties:{server:{type:"string",description:"Name of the MCP server that hosts the resource."},uri:{type:"string",description:"URI of the resource to read (from list_mcp_resources output)."}},required:["server","uri"]};function zA(t){return{name:"read_mcp_resource",label:"Read MCP Resource",description:"Read a specific resource from an MCP server by URI. Returns the resource content (text or binary metadata). Use list_mcp_resources first to discover available URIs.",parameters:LH,shouldDefer:!0,isConcurrencySafe:!0,isReadOnly:!0,searchHint:"mcp resource read fetch content",execute:async(e,r)=>{let n=t();if(!n)return{content:[{type:"text",text:"No MCP servers configured."}],details:{error:"no_mcp"}};try{let o=await n.readResource(r.server,r.uri);if(o.length===0)return{content:[{type:"text",text:`Resource "${r.uri}" returned no content.`}],details:{type:"read_mcp_resource",empty:!0}};let s=[];for(let i of o)if(i.text){let a=i.mimeType?` (${i.mimeType})`:"";s.push({type:"text",text:`--- ${i.uri}${a}-
1082
1082
  ${i.text}`})}else if(i.blob){let a=Math.ceil(i.blob.length*3/4/1024);s.push({type:"text",text:`--- ${i.uri} (binary, ~${a}KB, ${i.mimeType??"unknown"})-
1083
- [Binary content not displayed. Use appropriate tool to process.]`})}return s.length===0?{content:[{type:"text",text:`Resource "${r.uri}" has no readable content.`}],details:{type:"read_mcp_resource",empty:!0}}:{content:s,details:{type:"read_mcp_resource",uri:r.uri,server:r.server,contentCount:o.length}}}catch(o){return{content:[{type:"text",text:`Error reading resource: ${o.message}`}],details:{error:o.message}}}}}}var OH="mcp",jH={type:"object",properties:{action:{type:"string",enum:["list_servers","list_tools","call_tool","list_resources","read_resource","list_prompts","get_prompt","authenticate","manage_server"],description:`MCP action:
1083
+ [Binary content not displayed. Use appropriate tool to process.]`})}return s.length===0?{content:[{type:"text",text:`Resource "${r.uri}" has no readable content.`}],details:{type:"read_mcp_resource",empty:!0}}:{content:s,details:{type:"read_mcp_resource",uri:r.uri,server:r.server,contentCount:o.length}}}catch(o){return{content:[{type:"text",text:`Error reading resource: ${o.message}`}],details:{error:o.message}}}}}}var jH="mcp",$H={type:"object",properties:{action:{type:"string",enum:["list_servers","list_tools","call_tool","list_resources","read_resource","list_prompts","get_prompt","authenticate","manage_server"],description:`MCP action:
1084
1084
  - list_servers: List configured MCP servers, their status and capabilities
1085
1085
  - list_tools: List tools provided by a specific server
1086
1086
  - call_tool: Execute a tool on an MCP server
@@ -1089,12 +1089,12 @@ ${i.text}`})}else if(i.blob){let a=Math.ceil(i.blob.length*3/4/1024);s.push({typ
1089
1089
  - list_prompts: List prompts available from a server
1090
1090
  - get_prompt: Get a specific prompt with arguments
1091
1091
  - authenticate: Initiate OAuth authentication with a server
1092
- - manage_server: Add, remove, restart, or check server status`},server:{type:"string",description:"MCP server name. Required for all actions except list_servers."},toolName:{type:"string",description:"Tool name on the MCP server. Required for call_tool."},arguments:{type:"object",description:"Arguments for the tool call or prompt. Used with call_tool and get_prompt."},uri:{type:"string",description:"Resource URI. Required for read_resource."},promptName:{type:"string",description:"Prompt name. Required for get_prompt."},manageAction:{type:"string",enum:["add","remove","restart","health_check","enable","disable"],description:"Sub-action for manage_server."},config:{type:"object",description:"Server configuration. Required for manage_server add."}},required:["action"]};function KA(t){return{name:OH,label:"MCP",description:`Interact with external MCP (Model Context Protocol) servers. Discover and call tools, read resources, get prompts, manage servers, and handle authentication. MCP servers extend agent capabilities with external integrations (databases, APIs, code analysis, custom tools).
1092
+ - manage_server: Add, remove, restart, or check server status`},server:{type:"string",description:"MCP server name. Required for all actions except list_servers."},toolName:{type:"string",description:"Tool name on the MCP server. Required for call_tool."},arguments:{type:"object",description:"Arguments for the tool call or prompt. Used with call_tool and get_prompt."},uri:{type:"string",description:"Resource URI. Required for read_resource."},promptName:{type:"string",description:"Prompt name. Required for get_prompt."},manageAction:{type:"string",enum:["add","remove","restart","health_check","enable","disable"],description:"Sub-action for manage_server."},config:{type:"object",description:"Server configuration. Required for manage_server add."}},required:["action"]};function KA(t){return{name:jH,label:"MCP",description:`Interact with external MCP (Model Context Protocol) servers. Discover and call tools, read resources, get prompts, manage servers, and handle authentication. MCP servers extend agent capabilities with external integrations (databases, APIs, code analysis, custom tools).
1093
1093
 
1094
- Dynamic tools: When MCP servers are connected, their tools also appear as individual entries in the tool list (prefixed mcp__server__tool) for direct invocation without going through this management tool.`,parameters:jH,shouldDefer:!0,execute:async(e,r,n)=>{switch(r.action){case"list_servers":{let o=await t.listServers();if(o.length===0)return{content:[{type:"text",text:"No MCP servers configured. Use manage_server action to add one."}],details:{type:"mcp",action:"list_servers",count:0}};let s=[`MCP Servers (${o.length}):`,""];for(let i of o){let a=$H(i.status);if(s.push(`${a} **${i.name}** [${i.transport}] \u2014 ${i.status}`),s.push(` Tools: ${i.toolCount} | Resources: ${i.resourceCount} | Prompts: ${i.promptCount}`),i.capabilities){let c=[];i.capabilities.tools?.listChanged&&c.push("tools/listChanged"),i.capabilities.resources?.subscribe&&c.push("resources/subscribe"),i.capabilities.prompts?.listChanged&&c.push("prompts/listChanged"),c.length>0&&s.push(` Capabilities: ${c.join(", ")}`)}i.serverVersion&&s.push(` Version: ${i.serverVersion}`),i.error&&s.push(` \u26A0 Error: ${i.error}`),s.push("")}return{content:[{type:"text",text:s.join(`
1095
- `)}],details:{type:"mcp",action:"list_servers",count:o.length}}}case"list_tools":{if(!r.server)return ie("server is required for list_tools.");let o=await t.listTools(r.server);if(o.length===0)return{content:[{type:"text",text:`No tools available from server "${r.server}".`}],details:{type:"mcp",action:"list_tools",server:r.server,count:0}};let s=[`Tools from "${r.server}" (${o.length}):`,""];for(let i of o){let a=UH(i.annotations);s.push(`- **${i.name}**${a}${i.description?`: ${i.description}`:""}`),i.prefixedName&&s.push(` Direct call: \`${i.prefixedName}\``)}return{content:[{type:"text",text:s.join(`
1094
+ Dynamic tools: When MCP servers are connected, their tools also appear as individual entries in the tool list (prefixed mcp__server__tool) for direct invocation without going through this management tool.`,parameters:$H,shouldDefer:!0,execute:async(e,r,n)=>{switch(r.action){case"list_servers":{let o=await t.listServers();if(o.length===0)return{content:[{type:"text",text:"No MCP servers configured. Use manage_server action to add one."}],details:{type:"mcp",action:"list_servers",count:0}};let s=[`MCP Servers (${o.length}):`,""];for(let i of o){let a=UH(i.status);if(s.push(`${a} **${i.name}** [${i.transport}] \u2014 ${i.status}`),s.push(` Tools: ${i.toolCount} | Resources: ${i.resourceCount} | Prompts: ${i.promptCount}`),i.capabilities){let c=[];i.capabilities.tools?.listChanged&&c.push("tools/listChanged"),i.capabilities.resources?.subscribe&&c.push("resources/subscribe"),i.capabilities.prompts?.listChanged&&c.push("prompts/listChanged"),c.length>0&&s.push(` Capabilities: ${c.join(", ")}`)}i.serverVersion&&s.push(` Version: ${i.serverVersion}`),i.error&&s.push(` \u26A0 Error: ${i.error}`),s.push("")}return{content:[{type:"text",text:s.join(`
1095
+ `)}],details:{type:"mcp",action:"list_servers",count:o.length}}}case"list_tools":{if(!r.server)return ie("server is required for list_tools.");let o=await t.listTools(r.server);if(o.length===0)return{content:[{type:"text",text:`No tools available from server "${r.server}".`}],details:{type:"mcp",action:"list_tools",server:r.server,count:0}};let s=[`Tools from "${r.server}" (${o.length}):`,""];for(let i of o){let a=FH(i.annotations);s.push(`- **${i.name}**${a}${i.description?`: ${i.description}`:""}`),i.prefixedName&&s.push(` Direct call: \`${i.prefixedName}\``)}return{content:[{type:"text",text:s.join(`
1096
1096
  `)}],details:{type:"mcp",action:"list_tools",server:r.server,count:o.length}}}case"call_tool":{if(!r.server)return ie("server is required for call_tool.");if(!r.toolName)return ie("toolName is required for call_tool.");let o=await t.callTool(r.server,r.toolName,r.arguments,n);return!o.success||o.isError?{content:[{type:"text",text:`MCP tool error (${r.server}/${r.toolName}): ${o.error||o.content||"unknown error"}`}],details:{type:"mcp",action:"call_tool",server:r.server,toolName:r.toolName,success:!1}}:o.contentBlocks&&o.contentBlocks.length>0?{content:o.contentBlocks.map(i=>i.type==="image"&&i.data?{type:"image",data:i.data,mimeType:i.mimeType}:{type:"text",text:i.text||""}),details:{type:"mcp",action:"call_tool",server:r.server,toolName:r.toolName,success:!0}}:{content:[{type:"text",text:o.content||"(no output)"}],details:{type:"mcp",action:"call_tool",server:r.server,toolName:r.toolName,success:!0}}}case"list_resources":{let o=await t.listResources(r.server);if(o.length===0)return{content:[{type:"text",text:r.server?`No resources from "${r.server}".`:"No MCP resources available."}],details:{type:"mcp",action:"list_resources",count:0}};let s=[`MCP Resources (${o.length}):`,""];for(let i of o)s.push(`- **${i.name}** \`${i.uri}\`${i.mimeType?` [${i.mimeType}]`:""}`),i.description&&s.push(` ${i.description}`),i.server&&s.push(` Server: ${i.server}`);return{content:[{type:"text",text:s.join(`
1097
- `)}],details:{type:"mcp",action:"list_resources",count:o.length,server:r.server}}}case"read_resource":{if(!r.server)return ie("server is required for read_resource.");if(!r.uri)return ie("uri is required for read_resource.");let o=await t.readResource(r.server,r.uri);if(o.length===0)return{content:[{type:"text",text:"Resource returned no content."}],details:{type:"mcp",action:"read_resource",server:r.server,uri:r.uri}};let s=[];for(let i of o)i.blobSavedTo?s.push({type:"text",text:`[Binary content saved to: ${i.blobSavedTo}${i.blobSize?` (${FH(i.blobSize)})`:""}]`}):i.text&&s.push({type:"text",text:i.text});return s.length===0&&s.push({type:"text",text:"(empty content)"}),{content:s,details:{type:"mcp",action:"read_resource",server:r.server,uri:r.uri}}}case"list_prompts":{if(!r.server)return ie("server is required for list_prompts.");if(!t.listPrompts)return ie("Prompt listing not supported by the current MCP host.");let o=await t.listPrompts(r.server);if(o.length===0)return{content:[{type:"text",text:`No prompts available from "${r.server}".`}],details:{type:"mcp",action:"list_prompts",server:r.server,count:0}};let s=[`Prompts from "${r.server}" (${o.length}):`,""];for(let i of o)if(s.push(`- **${i.name}**${i.description?`: ${i.description}`:""}`),i.arguments&&i.arguments.length>0){let a=i.arguments.map(c=>`${c.name}${c.required?" (required)":""}${c.description?`: ${c.description}`:""}`);s.push(` Arguments: ${a.join(", ")}`)}return{content:[{type:"text",text:s.join(`
1097
+ `)}],details:{type:"mcp",action:"list_resources",count:o.length,server:r.server}}}case"read_resource":{if(!r.server)return ie("server is required for read_resource.");if(!r.uri)return ie("uri is required for read_resource.");let o=await t.readResource(r.server,r.uri);if(o.length===0)return{content:[{type:"text",text:"Resource returned no content."}],details:{type:"mcp",action:"read_resource",server:r.server,uri:r.uri}};let s=[];for(let i of o)i.blobSavedTo?s.push({type:"text",text:`[Binary content saved to: ${i.blobSavedTo}${i.blobSize?` (${HH(i.blobSize)})`:""}]`}):i.text&&s.push({type:"text",text:i.text});return s.length===0&&s.push({type:"text",text:"(empty content)"}),{content:s,details:{type:"mcp",action:"read_resource",server:r.server,uri:r.uri}}}case"list_prompts":{if(!r.server)return ie("server is required for list_prompts.");if(!t.listPrompts)return ie("Prompt listing not supported by the current MCP host.");let o=await t.listPrompts(r.server);if(o.length===0)return{content:[{type:"text",text:`No prompts available from "${r.server}".`}],details:{type:"mcp",action:"list_prompts",server:r.server,count:0}};let s=[`Prompts from "${r.server}" (${o.length}):`,""];for(let i of o)if(s.push(`- **${i.name}**${i.description?`: ${i.description}`:""}`),i.arguments&&i.arguments.length>0){let a=i.arguments.map(c=>`${c.name}${c.required?" (required)":""}${c.description?`: ${c.description}`:""}`);s.push(` Arguments: ${a.join(", ")}`)}return{content:[{type:"text",text:s.join(`
1098
1098
  `)}],details:{type:"mcp",action:"list_prompts",server:r.server,count:o.length}}}case"get_prompt":{if(!r.server)return ie("server is required for get_prompt.");if(!r.promptName)return ie("promptName is required for get_prompt.");if(!t.getPrompt)return ie("Prompt retrieval not supported by the current MCP host.");let o=r.arguments?Object.fromEntries(Object.entries(r.arguments).map(([a,c])=>[a,String(c)])):void 0,s=await t.getPrompt(r.server,r.promptName,o),i=[];s.description&&i.push(`> ${s.description}`,"");for(let a of s.messages)i.push(`**[${a.role}]:**`),a.content.type==="text"?i.push(a.content.text):a.content.type==="resource"?(i.push(`[Resource: ${a.content.resource.uri}]`),a.content.resource.text&&i.push(a.content.resource.text)):a.content.type==="image"&&i.push("[Image content]"),i.push("");return{content:[{type:"text",text:i.join(`
1099
1099
  `)||"(empty prompt)"}],details:{type:"mcp",action:"get_prompt",server:r.server,promptName:r.promptName}}}case"authenticate":{if(!r.server)return ie("server is required for authenticate.");let o=await t.authenticate(r.server);switch(o.status){case"auth_url":return{content:[{type:"text",text:`Authentication required for "${r.server}".
1100
1100
 
@@ -1104,34 +1104,34 @@ ${o.authUrl}
1104
1104
  ${o.message||"Once you complete authentication, the server's tools will become available automatically."}`}],details:{type:"mcp",action:"authenticate",server:r.server,status:"auth_url"}};case"already_authenticated":return{content:[{type:"text",text:`Server "${r.server}" is already authenticated.`}],details:{type:"mcp",action:"authenticate",server:r.server,status:"already_authenticated"}};case"step_up_required":return{content:[{type:"text",text:`Server "${r.server}" requires elevated permissions.
1105
1105
  Required scopes: ${o.requiredScopes?.join(", ")||"unknown"}
1106
1106
 
1107
- `+(o.authUrl?`Re-authorize at: ${o.authUrl}`:"Please re-authenticate with elevated permissions.")}],details:{type:"mcp",action:"authenticate",server:r.server,status:"step_up_required"}};case"unsupported":return{content:[{type:"text",text:`Authentication not supported for "${r.server}" (${o.message||"uses local transport"}).`}],details:{type:"mcp",action:"authenticate",server:r.server,status:"unsupported"}};default:return{content:[{type:"text",text:`Authentication error for "${r.server}": ${o.message||"unknown error"}`}],details:{type:"mcp",action:"authenticate",server:r.server,status:"error"}}}}case"manage_server":{if(!r.server)return ie("server is required for manage_server.");if(!r.manageAction)return ie("manageAction is required for manage_server.");switch(r.manageAction){case"add":{if(!t.addServer)return ie("Server addition not supported by the current MCP host.");if(!r.config)return ie("config is required for manage_server add.");let o=await t.addServer(r.server,r.config);return jo("add",r.server,o)}case"remove":{if(!t.removeServer)return ie("Server removal not supported by the current MCP host.");let o=await t.removeServer(r.server);return jo("remove",r.server,o)}case"restart":{if(!t.restartServer)return ie("Server restart not supported by the current MCP host.");let o=await t.restartServer(r.server);return jo("restart",r.server,o)}case"health_check":{if(!t.healthCheck)return ie("Health check not supported by the current MCP host.");let o=await t.healthCheck(r.server);return jo("health_check",r.server,o)}case"enable":case"disable":{if(!t.setServerEnabled)return ie("Server enable/disable not supported by the current MCP host.");let o=await t.setServerEnabled(r.server,r.manageAction==="enable");return jo(r.manageAction,r.server,o)}default:return ie(`Unknown manageAction: ${r.manageAction}`)}}default:return ie(`Unknown action: "${r.action}".`)}}}}function ie(t){return{content:[{type:"text",text:`Error: ${t}`}],details:{type:"mcp",error:t}}}function $H(t){switch(t){case"connected":return"\u2705";case"connecting":return"\u23F3";case"needs-auth":return"\u{1F511}";case"failed":return"\u274C";case"disconnected":return"\u26AA";case"disabled":return"\u{1F6AB}";default:return"\u2753"}}function UH(t){if(!t)return"";let e=[];return t.readOnlyHint&&e.push("\u{1F4D6}"),t.destructiveHint&&e.push("\u26A0\uFE0F"),t.idempotentHint&&e.push("\u267B\uFE0F"),e.length>0?` ${e.join("")}`:""}function FH(t){return t<1024?`${t}B`:t<1024*1024?`${(t/1024).toFixed(1)}KB`:`${(t/(1024*1024)).toFixed(1)}MB`}function jo(t,e,r){let n=[];return n.push(`${r.success?"\u2705":"\u274C"} ${t} "${e}": ${r.message}`),r.serverState&&(n.push(""),n.push(` Status: ${r.serverState.status}`),n.push(` Tools: ${r.serverState.toolCount} | Resources: ${r.serverState.resourceCount}`)),{content:[{type:"text",text:n.join(`
1108
- `)}],details:{type:"mcp",action:"manage_server",manageAction:t,server:e,success:r.success}}}var HH={id:"mcp-tools",kind:"mcp",register:BH};function XA(t){HH.register(t)}function BH(t){let e=WH({turnMcpConfig:t.config.mcpServers??{},userMcpConfig:qH(t.pathService),projectRoot:t.projectRoot});if(e.length===0)return;t.currentManager?.disconnectAll().catch(()=>{});let r=new Ea({servers:e,log:t.log,workspaceRoot:t.projectRoot,toolCatalog:t.toolCatalog});t.setManager(r),Xt(async()=>{await r.disconnectAll()});let n=()=>r;t.toolCatalog.addTool(GA(n)),t.toolCatalog.addTool(zA(n)),t.toolCatalog.addTool(GH(r,t.toolCatalog)),t.setReady(r.connectAll().then(()=>{r.injectTools(),t.log.info(`[mcp] ${r.getToolCount()} tools from ${r.getConnectedServers().length} servers`)}).catch(o=>{t.log.warn(`[mcp] connection error: ${o instanceof Error?o.message:o}`)}))}function qH(t){let e=t.getUserMcpConfigPath();try{if(Ma.existsSync(e))return JSON.parse(Ma.readFileSync(e,"utf8"))}catch{}}function WH(t){let e=VA(Ap(t.turnMcpConfig??{}),t.projectRoot),r=VA(Ap(t.userMcpConfig??{}),t.projectRoot),n=new Set(e.map(o=>o.name));return[...e,...r.filter(o=>!n.has(o.name))]}function VA(t,e){return t.map(r=>(r.type??"stdio")!=="stdio"||r.cwd?r:{...r,cwd:e})}function GH(t,e){return KA({listServers:async()=>t.getConnectedServers().map(n=>({name:n,status:"connected",transport:"stdio",toolCount:0,resourceCount:0,promptCount:0})),listTools:async r=>{let n=`mcp__${r.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}__`;return e.getToolNames().filter(o=>o.startsWith(n)).map(o=>({name:o.slice(n.length),prefixedName:o}))},callTool:async(r,n,o,s)=>{let a=`mcp__${r.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}__`+n,c=e.findTool(a);if(!c||!("execute"in c)||typeof c.execute!="function")return{success:!1,error:`Tool not found: ${a}`};try{return{success:!0,content:(await c.execute(`mcp_${Date.now()}`,o??{},s)).content.map(p=>p.text??"").join(`
1109
- `)}}catch(l){return{success:!1,error:l.message}}},listResources:async r=>(await t.listResources(r)).map(o=>({uri:o.uri,name:o.name,mimeType:o.mimeType,description:o.description,server:o.server})),readResource:async(r,n)=>(await t.readResource(r,n)).map(s=>({uri:s.uri,mimeType:s.mimeType,text:s.text})),authenticate:async()=>({status:"unsupported",message:"OAuth not yet implemented in McpManager"})})}import*as eP from"node:fs";import*as bt from"node:fs";import*as xn from"node:path";import{pathToFileURL as zH}from"node:url";var YA={preToolUse:"tool.before_invoke",postToolUse:"tool.after_invoke",onTurnStart:"turn.submitted",onTurnEnd:"turn.completed",onSessionEnd:"session.ended"};var _a=class{constructor(e){this.config=e;this.log=e.log??{info:()=>{},warn:()=>{}}}config;loaded=[];pluginSkills=[];pluginAssistants=[];activations=new Map;log;async loadAll(){for(let e of this.config.pluginDirs){if(!bt.existsSync(e))continue;let r;try{r=bt.readdirSync(e,{withFileTypes:!0})}catch{continue}for(let n of r){if(!n.isDirectory()||n.name.startsWith(".")||n.name.startsWith("_"))continue;let o=xn.join(e,n.name);await this.loadPlugin(n.name,o)}}return this.log.info(`[plugins] loaded ${this.loaded.length} plugin(s): ${this.loaded.map(e=>e.name).join(", ")||"(none)"}`),this.loaded}getPluginSkills(){return this.pluginSkills}getPluginAssistants(){return this.pluginAssistants.map(e=>({...e,enabledSkills:[...e.enabledSkills],disabledBuiltinSkills:[...e.disabledBuiltinSkills],modelHints:[...e.modelHints],prompts:e.prompts.map(r=>({...r}))}))}getLoaded(){return this.loaded}async discoverNew(){let e=new Set(this.loaded.map(n=>n.name)),r=0;for(let n of this.config.pluginDirs){if(!bt.existsSync(n))continue;let o;try{o=bt.readdirSync(n,{withFileTypes:!0})}catch{continue}for(let s of o){if(!s.isDirectory()||s.name.startsWith(".")||s.name.startsWith("_")||e.has(s.name))continue;let i=xn.join(n,s.name);await this.loadPlugin(s.name,i),r++}}return r>0&&this.log.info(`[plugins] discovered ${r} new plugin(s)`),r}async refreshActivations(){let e=Date.now();for(let[r,n]of this.activations){if(e-n.lastCheckAt<n.ttlMs)continue;let o;try{o=await n.checkFn()}catch(s){this.log.warn(`[plugins] ${r}: check_fn error: ${s instanceof Error?s.message:s}`),o=n.lastResult}if(n.lastCheckAt=e,o!==n.lastResult){if(n.lastResult=o,o&&!n.active){this.loadAssistantManifest(r,n.directory);for(let s of n.tools)this.addRegisteredTool(s);n.active=!0,this.log.info(`[plugins] ${r}: reactivated (${n.tools.length} tools)`)}else if(!o&&n.active){Ol(r),this.pluginAssistants=this.pluginAssistants.filter(s=>s.pluginId!==r);for(let s of n.tools)this.removeRegisteredTool(s.name);for(let s of n.hookUnregisterFns)s();n.active=!1,this.log.info(`[plugins] ${r}: deactivated`)}}}}async loadPlugin(e,r){let n=this.loadAssistantManifest(e,r),o=n.count,s=["index.js","index.mjs"],i=null;for(let b of s){let v=xn.join(r,b);if(bt.existsSync(v)){i=v;break}}if(!i){n.found?(this.loaded.push({name:e,directory:r,toolCount:0,hookCount:0,skillCount:0,assistantCount:o}),this.log.info(`[plugins] ${e}: 0 tools, 0 hooks, 0 skills, ${o} assistants`)):this.log.warn(`[plugins] ${e}: no index.js found, skipping`);return}let a=0,c=0,l=0,d=[],p=[],u=null,m=6e4,f={},g=xn.join(r,"config.json");if(bt.existsSync(g))try{f=JSON.parse(bt.readFileSync(g,"utf8"))}catch{}let h={pluginName:e,registerTool:b=>{this.addRegisteredTool(b),d.push(b),a++},registerHook:(b,v)=>{let R=YA[b];if(!R){this.log.warn(`[plugins] ${e}: unknown hook phase "${b}"`);return}let S=this.config.hookRegistry.register({point:R,handler:v,label:`plugin:${e}:${b}`,priority:200});p.push(S),c++},registerSkill:b=>{this.pluginSkills.push(b),l++},getConfig:()=>f,setActivationCheck:(b,v)=>{u=b,v!==void 0&&(m=v)}};try{let v=await import(zH(i).href);if(typeof v.register!="function"){this.log.warn(`[plugins] ${e}: no register() export, skipping`);return}await v.register(h),u&&this.activations.set(e,{checkFn:u,ttlMs:m,lastCheckAt:Date.now(),lastResult:!0,directory:r,tools:d,hookUnregisterFns:p,active:!0}),this.loaded.push({name:e,directory:r,toolCount:a,hookCount:c,skillCount:l,assistantCount:o}),this.log.info(`[plugins] ${e}: ${a} tools, ${c} hooks, ${l} skills, ${o} assistants`)}catch(b){this.log.warn(`[plugins] ${e}: load error: ${b instanceof Error?b.message:b}`)}}loadAssistantManifest(e,r){let n=xn.join(r,"assistants.json");if(!bt.existsSync(n))return{found:!1,count:0};try{let o=jl(bt.readFileSync(n,"utf8")),s=to(e,n,o);return this.pluginAssistants=[...this.pluginAssistants.filter(i=>i.pluginId!==e),...s],{found:!0,count:s.length}}catch(o){return to(e,n,null),this.log.warn(`[plugins] ${e}: assistant manifest error: ${o instanceof Error?o.message:o}`),{found:!0,count:0}}}addRegisteredTool(e){this.config.toolCatalog?this.config.toolCatalog.addTool(e):ri(e)}removeRegisteredTool(e){return this.config.toolCatalog?.removeTool(e)??un(e)}};import*as fe from"node:fs";import*as $o from"node:path";function Pp(){return I().getUserPluginCacheDir()}function JA(){return $o.join(Pp(),"installed_plugins.json")}function QA(){let t=JA();if(!fe.existsSync(t))return{version:1,plugins:[]};try{return JSON.parse(fe.readFileSync(t,"utf-8"))}catch{return{version:1,plugins:[]}}}function KH(t){let e=Pp();fe.existsSync(e)||fe.mkdirSync(e,{recursive:!0}),fe.writeFileSync(JA(),JSON.stringify(t,null,2),"utf-8")}function VH(t,e){return!(e.blocklist?.includes(t)||e.allowlist&&!e.allowlist.includes(t))}async function XH(t,e,r){let{execFile:n}=await import("node:child_process"),{promisify:o}=await import("node:util"),s=o(n),i=Pp(),a=e?`${t}@${e}`:t;try{let{stdout:c}=await s("npm",["pack",a,"--pack-destination",i],{timeout:6e4,cwd:i}),l=c.trim().split(`
1110
- `).pop()?.trim();if(!l)return r.warn(`[marketplace] npm pack returned no output for ${a}`),null;let d=$o.join(i,l),u=l.match(/^(.+)-(\d+\.\d+\.\d+.*)\.tgz$/)?.[2]??"0.0.0",m=$o.join(i,`${t}@${u}`);fe.existsSync(m)||fe.mkdirSync(m,{recursive:!0}),await s("tar",["xzf",d,"-C",m,"--strip-components=1"],{timeout:3e4});try{fe.unlinkSync(d)}catch{}let f=$o.join(m,"package.json");if(fe.existsSync(f))try{await s("npm",["install","--production","--no-save"],{cwd:m,timeout:12e4})}catch(g){r.warn(`[marketplace] npm install for ${t} failed: ${g.message}`)}return r.info(`[marketplace] installed ${t}@${u} from npm`),{name:t,version:u,installPath:m}}catch(c){return r.warn(`[marketplace] failed to install ${a} from npm: ${c.message}`),null}}function YH(){return QA().plugins.filter(e=>fe.existsSync(e.installPath)).map(e=>e.installPath)}async function JH(t,e){let r=QA(),n=[];for(let o of t.enabledPlugins){let s=o.specifier.split("/").pop()??o.specifier;if(!VH(s,t)){e.warn(`[marketplace] plugin "${s}" blocked by enterprise policy`);continue}let i=r.plugins.find(c=>c.source.specifier===o.specifier&&c.source.type===o.type);if(i&&fe.existsSync(i.installPath)&&(!o.version||i.version===o.version)){n.push(i.installPath);continue}let a=null;switch(o.type){case"npm":a=await XH(o.specifier,o.version,e);break;case"git":case"url":e.warn(`[marketplace] ${o.type} source not yet implemented for "${o.specifier}"`);break}if(a){let c={name:a.name,version:a.version,source:o,installPath:a.installPath,installedAt:new Date().toISOString()};r.plugins=r.plugins.filter(l=>!(l.source.specifier===o.specifier&&l.source.type===o.type)),r.plugins.push(c),n.push(a.installPath)}}return KH(r),n}function QH(){let t=I().getUserMarketplaceConfigPath();if(!fe.existsSync(t))return null;try{return JSON.parse(fe.readFileSync(t,"utf-8"))}catch{return null}}async function ZA(t,e){let r=[...t],n=YH();r.push(...n);let o=QH();if(o&&o.enabledPlugins.length>0)try{let s=await JH(o,e),i=new Set(r);for(let a of s)i.has(a)||r.push(a)}catch(s){e.warn(`[marketplace] failed to update plugins: ${s.message}`)}return r}var ZH={id:"plugin-tools",kind:"plugin",register:eB};function tP(t){ZH.register(t)}function eB(t){let e=tB(t.config,t.pathService);ZA(e,t.log).then(r=>{if(r.length===0)return;let n=new _a({pluginDirs:r,hookRegistry:t.hooks,log:t.log,toolCatalog:t.toolCatalog});t.setPluginLoader(n),n.loadAll().then(o=>{t.log.info(`[plugins] ${o.length} loaded, ${n.getPluginSkills().length} skills`)}).catch(o=>{t.log.warn(`[plugins] load error: ${o instanceof Error?o.message:o}`)}),t.hooks.register({point:"turn.submitted",handler:async()=>(await n.discoverNew(),await n.refreshActivations(),{action:"continue"}),label:"plugin-activation-refresh",priority:50})}).catch(r=>{t.log.warn(`[plugins] marketplace resolve error: ${r instanceof Error?r.message:r}`)})}function tB(t,e){let r=[],n=i=>{!i||!eP.existsSync(i)||r.includes(i)||r.push(i)},o=e.getUserPluginsDir();n(o),n(e.getProjectPluginsDir(e.getActiveProjectRoot()));let s=t.pluginPaths;if(Array.isArray(s))for(let i of s)typeof i=="string"&&n(i);return r}function rP(){return ne()?.type==="group"}async function nP(t,e){let r=e.getAcpPermissionSession();if(r)try{let n=await r.requestPermission({sessionId:r.sessionId,permissionId:t.approvalId,toolCall:{callId:t.callId,toolName:t.toolName,arguments:t.arguments?JSON.stringify(t.arguments):""},message:t.message,options:[{id:"allow",label:"\u5141\u8BB8\u6267\u884C"},{id:"deny",label:"\u4E0D\u6267\u884C"}]});return oP(t,n.optionId)}catch{return{approvalId:t.approvalId,decision:"deny"}}if(e.sendNotification("tool.approval.request",{approvalId:t.approvalId,callId:t.callId,toolName:t.toolName,arguments:t.arguments?JSON.stringify(t.arguments):"",message:t.message}),e.isPetActive()){let n=rB(t.toolName);e.sendNotification("pet.confirm",{confirmId:t.approvalId,toolName:t.toolName,description:t.message??`Allow ${t.toolName}`,risk:n,timeoutMs:3e4})}return new Promise(()=>{})}function rB(t){return t.match(/exec|bash|shell|terminal|run_command|reset|force|drop/i)?"system":t.match(/web|http|fetch|mcp|media|image|video|music|tts/i)?"external_egress":t.match(/write|delete|rm|move|patch|edit|create/i)?"write":"read"}function oP(t,e){return e!=="allow"?{approvalId:t.approvalId,decision:"deny"}:{approvalId:t.approvalId,decision:"allow"}}function sP(t){let e=xo(t.config.permissions),r=ZS(e);if(vi(e.mode==="full_access"),rP()){let o=cb();for(let s of o)r.addRule(s);lu(!0),t.log.info(`[permissions] group security mode active: ${o.length} rules injected`)}else lu(!1);t.currentUnregister?.();let n=eT({ruleEngine:r,hookRegistry:t.hooks,auditLogger:new $i(t.getActiveProjectRoot()),sessionId:t.sessionId,getTurnId:t.getTurnId,communityTelemetryRecorder:Fs()??void 0,onRequestApproval:o=>nP(o,t),onDenied:(o,s)=>{t.log.warn(`[permissions] blocked "${o}": ${s}`)}});return n.setToolMeta(t.toolCatalog.getToolManifest()),{permissionChecker:n,permissionUnregister:n.register(),ruleEngine:r}}G();import*as Cn from"node:fs";import*as Na from"node:path";var Da=class{filePath;constructor(e={}){this.filePath=e.filePath??Na.join(B(e.ownerUserId),"community","discovery-cache.json")}readAll(){try{let e=JSON.parse(Cn.readFileSync(this.filePath,"utf8"));return Array.isArray(e)?e.filter(nB):[]}catch{return[]}}find(e){return this.readAll().find(r=>r.intentKey===e)}writeMatch(e,r,n=new Date){let o={intentKey:e,resourceId:r.id,type:r.type,title:r.title,summary:r.summary,sourceTier:r.sourceTier,trustStage:r.trustStage,effectiveRiskTier:r.effectiveRiskTier,latestVersion:r.latestVersion,cachedAt:n.toISOString()},s=[o,...this.readAll().filter(i=>i.intentKey!==e)].slice(0,200);return Cn.mkdirSync(Na.dirname(this.filePath),{recursive:!0}),Cn.writeFileSync(this.filePath,`${JSON.stringify(s,null,2)}
1111
- `,"utf8"),o}};function nB(t){if(!t||typeof t!="object"||Array.isArray(t))return!1;let e=t;return typeof e.intentKey=="string"&&typeof e.resourceId=="string"&&typeof e.title=="string"}var La=class{client;cache;localIndex;topK;now;inMemory=new Map;constructor(e){this.client=e.client,this.cache=e.cache??new Da,this.localIndex=e.localIndex,this.topK=e.topK??1,this.now=e.now??(()=>new Date)}async matchForTurn(e){let r=iP(e);if(!r)return{status:"miss",intentKey:r};let n=this.localIndex?.findInstalled(r);if(n)return{status:"local",intentKey:r,match:n};let o=this.inMemory.get(r);if(o)return o;if(!this.client)return this.memo(r,{status:"disabled",intentKey:r});let s;try{s=await this.client.getConsent()}catch(a){return this.memo(r,aP(r,a))}if(!s.enabled||!s.methodSharingEnabled)return this.memo(r,{status:"disabled",intentKey:r});let i=this.cache.find(r);if(i)return this.memo(r,{status:"cached",intentKey:r,cacheEntry:i});try{let[a]=await this.client.matchRegistry({intent:r,topK:this.topK,preferOfficial:!0});if(!a)return this.memo(r,{status:"miss",intentKey:r});let c=this.cache.writeMatch(r,a,this.now());return this.memo(r,{status:"matched",intentKey:r,match:a,cacheEntry:c})}catch(a){return this.memo(r,aP(r,a))}}async prefetchIdle(e){let r=[],n=new Set;for(let o of e){let s=iP(o);!s||n.has(s)||(n.add(s),r.push(await this.matchForTurn(s)))}return r}memo(e,r){return this.inMemory.set(e,r),r}};function iP(t){return t.trim().toLowerCase().replace(/\s+/g," ")}function aP(t,e){return{status:"unavailable",intentKey:t,error:e instanceof Error?e.message:String(e)}}function cP(t){let e=new Map;return{register(r){let n=e.get(r.point)??[],o={handler:r.handler,priority:r.priority??100,label:r.label};return n.push(o),n.sort((s,i)=>s.priority-i.priority),e.set(r.point,n),()=>{let s=n.indexOf(o);s>=0&&n.splice(s,1)}},async invoke(r,n){let o=e.get(r);if(!o||o.length===0)return{action:"continue",context:n};let s=n;for(let i of o)try{let a=await i.handler(r,s);if(!a||a.action==="continue"){a?.context&&(s=a.context);continue}if(a.action==="abort"||a.action==="skip")return t.info({hook:r,label:i.label,action:a.action,reason:a.reason},"hook intercepted"),a}catch(a){t.warn({hook:r,label:i.label,err:a.message},"hook handler failed (non-blocking)")}return{action:"continue",context:s}}}}function lP(t){let e=cP(t.log);t.taskStore.setHooks(e,t.sessionId),mb({onTaskCreated:n=>{e.invoke("task.created",{sessionId:t.sessionId,taskId:String(n.id),taskType:"planning",label:n.title}).catch(()=>{})},onTaskCompleted:n=>{e.invoke("task.completed",{sessionId:t.sessionId,taskId:String(n.id),taskType:"planning",label:n.title}).catch(()=>{})}});let r=Kw({hooks:e,currentUserId:t.currentUserId,log:t.log,prefetchState:t.prefetchState,getLastUserMessage:t.getLastUserMessage,getLastAssistantMessage:t.getLastAssistantMessage,resolveSmallModelClient:t.resolveSmallModelClient});return oh(e,{currentCwd:t.projectRoot,communityDiscovery:new La({client:Ot()}),log:{debug:n=>t.log.debug(n),warn:n=>t.log.warn(n)}}),tf(e,t.log,{transport:t.compressionClient.transport,apiKey:t.compressionClient.apiKey}),Vw({memdir:t.memdir,memoryProvider:r.toolProvider,memoryUserId:r.userId,toolCatalog:t.toolCatalog}),Zp(e,{getMemorySource:()=>t.memdir,log:{debug:n=>t.log.debug(n),warn:n=>t.log.warn(n)}},t.prefetchState),{hooks:e,memoryHandlerProvider:r.handlerProvider,memoryDreamProvider:r.dreamProvider,memoryLearningSink:r.learningSink,memoryUserId:r.userId}}G();import{watch as oB}from"node:fs";import{stat as sB}from"node:fs/promises";import{join as dP,relative as iB,resolve as aB}from"node:path";var cB=[`${zt}/settings.json`,"INSTRUCTIONS.md",`${zt}/INSTRUCTIONS.md`,"INSTRUCTIONS.local.md",`${zt}/rules`],lB=["INSTRUCTIONS.md","INSTRUCTIONS.local.md",`${zt}/rules`],xp=class{watchers=new Map;deps;debounceTimers=new Map;_cwd;constructor(e){this.deps=e,this._cwd=e.projectRoot}get cwd(){return this._cwd}async start(){for(let e of cB){let r=dP(this.deps.projectRoot,e);this.watchPath(r,e)}this.deps.log?.(`file-watcher: watching ${this.watchers.size} paths`)}watchPath(e,r){if(!this.watchers.has(e))try{let n=oB(e,{persistent:!1,recursive:r.includes("/")?!1:void 0},(o,s)=>{let i=s?dP(e,s):e;this.handleChange(i,o==="rename"?"created":"modified")});n.on("error",()=>{this.watchers.delete(e)}),this.watchers.set(e,n)}catch{}}handleChange(e,r){let n=this.debounceTimers.get(e);n&&clearTimeout(n),this.debounceTimers.set(e,setTimeout(async()=>{this.debounceTimers.delete(e);let o=r;try{await sB(e)}catch{o="deleted"}let s=iB(this.deps.projectRoot,e);this.deps.log?.(`file-watcher: ${o} ${s}`),this.deps.hooks.invoke("file.changed",{sessionId:this.deps.sessionId,filePath:e,changeType:o}).catch(()=>{}),lB.some(a=>s.includes(a)||e.includes(a))&&this.deps.onInstructionCacheReset?.()},300))}setCwd(e){let r=aB(e);if(r===this._cwd)return;let n=this._cwd;this._cwd=r,this.deps.hooks.invoke("cwd.changed",{sessionId:this.deps.sessionId,oldCwd:n,newCwd:r}).catch(()=>{}),this.deps.onInstructionCacheReset?.()}stop(){for(let[,e]of this.watchers)e.close();this.watchers.clear();for(let[,e]of this.debounceTimers)clearTimeout(e);this.debounceTimers.clear()}};async function uP(t){let e=new xp(t);return await e.start(),e}import{watch as dB}from"node:fs";import{readFile as uB}from"node:fs/promises";function pB(t){return I().getProjectSettingsPath(t)}async function mB(t){try{let e=await uB(t,"utf-8");return JSON.parse(e)}catch{return null}}function gB(t,e,r,n){let o=!1,s=fB(t);s&&(s.mode!==e.getMode()&&(e.setMode(s.mode),n?.(`settings: permission mode -> ${s.mode}`),o=!0),hB(s.rules,e.getRules())||(e.replaceRules(s.rules),n?.(`settings: ${s.rules.length} permission rules loaded`),o=!0),s.defaultBehavior!==e.getDefaultBehavior()&&(e.setDefaultBehavior(s.defaultBehavior),n?.(`settings: default behavior -> ${s.defaultBehavior}`),o=!0),o&&r&&r.invoke("config.changed",{sessionId:"",key:"permissions",oldValue:void 0,newValue:t}).catch(()=>{}))}function pP(t){let e=pB(t.projectRoot),r=null,n=null,o=async()=>{let s=await mB(e);s&&gB(s,t.ruleEngine,t.hooks,t.log)};o().catch(()=>{});try{r=dB(e,{persistent:!1},()=>{n&&clearTimeout(n),n=setTimeout(()=>{o().catch(()=>{})},200)}),r.on("error",()=>{})}catch{}return()=>{n&&clearTimeout(n),r?.close(),r=null}}function fB(t){return yB(t),t.permissions&&typeof t.permissions=="object"?Oi(t.permissions):null}function hB(t,e){return t.length!==e.length?!1:t.every((r,n)=>{let o=e[n];return!!o&&r.pattern===o.pattern&&r.behavior===o.behavior&&r.reason===o.reason&&r.source===o.source})}function yB(t){let e=t,r={permissionMode:"permissions.mode",permissionRules:"permissions.rules",defaultBehavior:"permissions.defaultBehavior"};for(let[n,o]of Object.entries(r))if(n in e)throw new Error(`Legacy top-level ${n} is not supported; use ${o}`)}function mP(t){let e=typeof t.config.workdir=="string"?t.config.workdir:process.cwd(),r=pP({projectRoot:e,ruleEngine:t.ruleEngine,hooks:t.hooks,log:n=>t.log.info(`[settings] ${n}`)});Xt(async()=>{r()}),t.currentFileWatcher?.stop(),t.setFileWatcher(null),uP({projectRoot:e,sessionId:t.sessionId,hooks:t.hooks,log:n=>t.log.debug(n),onInstructionCacheReset:TT}).then(n=>{t.setFileWatcher(n),Xt(async()=>{n.stop()})}).catch(n=>{t.log.warn(`[file-watcher] init error: ${n instanceof Error?n.message:n}`)})}import*as le from"node:fs";import*as Re from"node:path";var vB="skill",bB={type:"object",properties:{action:{type:"string",enum:["invoke","list","view","create","edit","patch","delete","promote"],description:["The operation to perform:","\u2022 'invoke' \u2014 Run a skill by name (provide 'name', optional 'args')","\u2022 'list' \u2014 List all available skills (optional 'category' filter)","\u2022 'view' \u2014 View full skill content (provide 'name', optional 'filePath')","\u2022 'create' \u2014 Create a new skill (provide 'name', 'content')","\u2022 'edit' \u2014 Overwrite skill content (provide 'name', 'content')","\u2022 'patch' \u2014 Find/replace in skill (provide 'name', 'oldString', 'newString')","\u2022 'delete' \u2014 Remove a skill (provide 'name')","\u2022 'promote' \u2014 Promote a project-level skill to global/user-level (provide 'name')"].join(`
1112
- `)},name:{type:"string",description:"Skill name (required for invoke/view/create/edit/patch/delete/promote)."},args:{type:"string",description:"Arguments or context to pass when invoking a skill."},category:{type:"string",description:"Filter skills by category (for 'list' action)."},content:{type:"string",description:"Full SKILL.md content for create/edit actions."},filePath:{type:"string",description:"View a specific file within the skill (for 'view' action)."},fileContent:{type:"string",description:"Content for writing supporting files."},oldString:{type:"string",description:"Text to find for patch action."},newString:{type:"string",description:"Replacement text for patch action."}},required:["action"]};function gP(t){return{name:vB,label:"Skill",description:AB(t),parameters:bB,isConcurrencySafe:!1,isReadOnly:!1,searchHint:"skill invoke list view create edit delete command workflow",execute:async(e,r,n)=>{let{action:o}=r;switch(o){case"invoke":return kB(t,r,n);case"list":return RB(t,r);case"view":return SB(t,r);case"create":case"edit":case"patch":case"delete":return TB(t,r);case"promote":return wB(t,r);default:return{content:[{type:"text",text:`Unknown action: ${o}. Use invoke, list, view, create, edit, patch, delete, or promote.`}]}}}}}async function kB(t,e,r){let{name:n,args:o}=e;if(!n)return{content:[{type:"text",text:`Error: 'name' is required for invoke. Available skills: ${t.listSkills().map(l=>l.name).join(", ")||"(none)"}`}]};let s=await t.readSkillContent(n);if(!s){let c=t.listSkills().map(l=>l.name).join(", ");return{content:[{type:"text",text:`Skill "${n}" not found. Available skills: ${c||"(none)"}`}]}}if(t.executeSkillSubturn)try{return{content:[{type:"text",text:await t.executeSkillSubturn(n,s,o,r)}],details:{skillName:n,action:"invoke",mode:"subturn"}}}catch(c){let l=c instanceof Error?c.message:String(c);return{content:[{type:"text",text:`Skill execution error: ${l}`}],details:{error:l,skillName:n}}}let i=`## Skill: ${n}
1107
+ `+(o.authUrl?`Re-authorize at: ${o.authUrl}`:"Please re-authenticate with elevated permissions.")}],details:{type:"mcp",action:"authenticate",server:r.server,status:"step_up_required"}};case"unsupported":return{content:[{type:"text",text:`Authentication not supported for "${r.server}" (${o.message||"uses local transport"}).`}],details:{type:"mcp",action:"authenticate",server:r.server,status:"unsupported"}};default:return{content:[{type:"text",text:`Authentication error for "${r.server}": ${o.message||"unknown error"}`}],details:{type:"mcp",action:"authenticate",server:r.server,status:"error"}}}}case"manage_server":{if(!r.server)return ie("server is required for manage_server.");if(!r.manageAction)return ie("manageAction is required for manage_server.");switch(r.manageAction){case"add":{if(!t.addServer)return ie("Server addition not supported by the current MCP host.");if(!r.config)return ie("config is required for manage_server add.");let o=await t.addServer(r.server,r.config);return jo("add",r.server,o)}case"remove":{if(!t.removeServer)return ie("Server removal not supported by the current MCP host.");let o=await t.removeServer(r.server);return jo("remove",r.server,o)}case"restart":{if(!t.restartServer)return ie("Server restart not supported by the current MCP host.");let o=await t.restartServer(r.server);return jo("restart",r.server,o)}case"health_check":{if(!t.healthCheck)return ie("Health check not supported by the current MCP host.");let o=await t.healthCheck(r.server);return jo("health_check",r.server,o)}case"enable":case"disable":{if(!t.setServerEnabled)return ie("Server enable/disable not supported by the current MCP host.");let o=await t.setServerEnabled(r.server,r.manageAction==="enable");return jo(r.manageAction,r.server,o)}default:return ie(`Unknown manageAction: ${r.manageAction}`)}}default:return ie(`Unknown action: "${r.action}".`)}}}}function ie(t){return{content:[{type:"text",text:`Error: ${t}`}],details:{type:"mcp",error:t}}}function UH(t){switch(t){case"connected":return"\u2705";case"connecting":return"\u23F3";case"needs-auth":return"\u{1F511}";case"failed":return"\u274C";case"disconnected":return"\u26AA";case"disabled":return"\u{1F6AB}";default:return"\u2753"}}function FH(t){if(!t)return"";let e=[];return t.readOnlyHint&&e.push("\u{1F4D6}"),t.destructiveHint&&e.push("\u26A0\uFE0F"),t.idempotentHint&&e.push("\u267B\uFE0F"),e.length>0?` ${e.join("")}`:""}function HH(t){return t<1024?`${t}B`:t<1024*1024?`${(t/1024).toFixed(1)}KB`:`${(t/(1024*1024)).toFixed(1)}MB`}function jo(t,e,r){let n=[];return n.push(`${r.success?"\u2705":"\u274C"} ${t} "${e}": ${r.message}`),r.serverState&&(n.push(""),n.push(` Status: ${r.serverState.status}`),n.push(` Tools: ${r.serverState.toolCount} | Resources: ${r.serverState.resourceCount}`)),{content:[{type:"text",text:n.join(`
1108
+ `)}],details:{type:"mcp",action:"manage_server",manageAction:t,server:e,success:r.success}}}var BH={id:"mcp-tools",kind:"mcp",register:qH};function XA(t){BH.register(t)}function qH(t){let e=GH({turnMcpConfig:t.config.mcpServers??{},userMcpConfig:WH(t.pathService),projectRoot:t.projectRoot});if(e.length===0)return;t.currentManager?.disconnectAll().catch(()=>{});let r=new Ea({servers:e,log:t.log,workspaceRoot:t.projectRoot,toolCatalog:t.toolCatalog});t.setManager(r),Xt(async()=>{await r.disconnectAll()});let n=()=>r;t.toolCatalog.addTool(GA(n)),t.toolCatalog.addTool(zA(n)),t.toolCatalog.addTool(zH(r,t.toolCatalog)),t.setReady(r.connectAll().then(()=>{r.injectTools(),t.log.info(`[mcp] ${r.getToolCount()} tools from ${r.getConnectedServers().length} servers`)}).catch(o=>{t.log.warn(`[mcp] connection error: ${o instanceof Error?o.message:o}`)}))}function WH(t){let e=t.getUserMcpConfigPath();try{if(Ma.existsSync(e))return JSON.parse(Ma.readFileSync(e,"utf8"))}catch{}}function GH(t){let e=VA(Ap(t.turnMcpConfig??{}),t.projectRoot),r=VA(Ap(t.userMcpConfig??{}),t.projectRoot),n=new Set(e.map(o=>o.name));return[...e,...r.filter(o=>!n.has(o.name))]}function VA(t,e){return t.map(r=>(r.type??"stdio")!=="stdio"||r.cwd?r:{...r,cwd:e})}function zH(t,e){return KA({listServers:async()=>t.getConnectedServers().map(n=>({name:n,status:"connected",transport:"stdio",toolCount:0,resourceCount:0,promptCount:0})),listTools:async r=>{let n=`mcp__${r.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}__`;return e.getToolNames().filter(o=>o.startsWith(n)).map(o=>({name:o.slice(n.length),prefixedName:o}))},callTool:async(r,n,o,s)=>{let a=`mcp__${r.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}__`+n,c=e.findTool(a);if(!c||!("execute"in c)||typeof c.execute!="function")return{success:!1,error:`Tool not found: ${a}`};try{return{success:!0,content:(await c.execute(`mcp_${Date.now()}`,o??{},s)).content.map(p=>p.text??"").join(`
1109
+ `)}}catch(l){return{success:!1,error:l.message}}},listResources:async r=>(await t.listResources(r)).map(o=>({uri:o.uri,name:o.name,mimeType:o.mimeType,description:o.description,server:o.server})),readResource:async(r,n)=>(await t.readResource(r,n)).map(s=>({uri:s.uri,mimeType:s.mimeType,text:s.text})),authenticate:async()=>({status:"unsupported",message:"OAuth not yet implemented in McpManager"})})}import*as eP from"node:fs";import*as bt from"node:fs";import*as xn from"node:path";import{pathToFileURL as KH}from"node:url";var YA={preToolUse:"tool.before_invoke",postToolUse:"tool.after_invoke",onTurnStart:"turn.submitted",onTurnEnd:"turn.completed",onSessionEnd:"session.ended"};var _a=class{constructor(e){this.config=e;this.log=e.log??{info:()=>{},warn:()=>{}}}config;loaded=[];pluginSkills=[];pluginAssistants=[];activations=new Map;log;async loadAll(){for(let e of this.config.pluginDirs){if(!bt.existsSync(e))continue;let r;try{r=bt.readdirSync(e,{withFileTypes:!0})}catch{continue}for(let n of r){if(!n.isDirectory()||n.name.startsWith(".")||n.name.startsWith("_"))continue;let o=xn.join(e,n.name);await this.loadPlugin(n.name,o)}}return this.log.info(`[plugins] loaded ${this.loaded.length} plugin(s): ${this.loaded.map(e=>e.name).join(", ")||"(none)"}`),this.loaded}getPluginSkills(){return this.pluginSkills}getPluginAssistants(){return this.pluginAssistants.map(e=>({...e,enabledSkills:[...e.enabledSkills],disabledBuiltinSkills:[...e.disabledBuiltinSkills],modelHints:[...e.modelHints],prompts:e.prompts.map(r=>({...r}))}))}getLoaded(){return this.loaded}async discoverNew(){let e=new Set(this.loaded.map(n=>n.name)),r=0;for(let n of this.config.pluginDirs){if(!bt.existsSync(n))continue;let o;try{o=bt.readdirSync(n,{withFileTypes:!0})}catch{continue}for(let s of o){if(!s.isDirectory()||s.name.startsWith(".")||s.name.startsWith("_")||e.has(s.name))continue;let i=xn.join(n,s.name);await this.loadPlugin(s.name,i),r++}}return r>0&&this.log.info(`[plugins] discovered ${r} new plugin(s)`),r}async refreshActivations(){let e=Date.now();for(let[r,n]of this.activations){if(e-n.lastCheckAt<n.ttlMs)continue;let o;try{o=await n.checkFn()}catch(s){this.log.warn(`[plugins] ${r}: check_fn error: ${s instanceof Error?s.message:s}`),o=n.lastResult}if(n.lastCheckAt=e,o!==n.lastResult){if(n.lastResult=o,o&&!n.active){this.loadAssistantManifest(r,n.directory);for(let s of n.tools)this.addRegisteredTool(s);n.active=!0,this.log.info(`[plugins] ${r}: reactivated (${n.tools.length} tools)`)}else if(!o&&n.active){Ol(r),this.pluginAssistants=this.pluginAssistants.filter(s=>s.pluginId!==r);for(let s of n.tools)this.removeRegisteredTool(s.name);for(let s of n.hookUnregisterFns)s();n.active=!1,this.log.info(`[plugins] ${r}: deactivated`)}}}}async loadPlugin(e,r){let n=this.loadAssistantManifest(e,r),o=n.count,s=["index.js","index.mjs"],i=null;for(let b of s){let v=xn.join(r,b);if(bt.existsSync(v)){i=v;break}}if(!i){n.found?(this.loaded.push({name:e,directory:r,toolCount:0,hookCount:0,skillCount:0,assistantCount:o}),this.log.info(`[plugins] ${e}: 0 tools, 0 hooks, 0 skills, ${o} assistants`)):this.log.warn(`[plugins] ${e}: no index.js found, skipping`);return}let a=0,c=0,l=0,d=[],p=[],u=null,m=6e4,f={},g=xn.join(r,"config.json");if(bt.existsSync(g))try{f=JSON.parse(bt.readFileSync(g,"utf8"))}catch{}let h={pluginName:e,registerTool:b=>{this.addRegisteredTool(b),d.push(b),a++},registerHook:(b,v)=>{let R=YA[b];if(!R){this.log.warn(`[plugins] ${e}: unknown hook phase "${b}"`);return}let S=this.config.hookRegistry.register({point:R,handler:v,label:`plugin:${e}:${b}`,priority:200});p.push(S),c++},registerSkill:b=>{this.pluginSkills.push(b),l++},getConfig:()=>f,setActivationCheck:(b,v)=>{u=b,v!==void 0&&(m=v)}};try{let v=await import(KH(i).href);if(typeof v.register!="function"){this.log.warn(`[plugins] ${e}: no register() export, skipping`);return}await v.register(h),u&&this.activations.set(e,{checkFn:u,ttlMs:m,lastCheckAt:Date.now(),lastResult:!0,directory:r,tools:d,hookUnregisterFns:p,active:!0}),this.loaded.push({name:e,directory:r,toolCount:a,hookCount:c,skillCount:l,assistantCount:o}),this.log.info(`[plugins] ${e}: ${a} tools, ${c} hooks, ${l} skills, ${o} assistants`)}catch(b){this.log.warn(`[plugins] ${e}: load error: ${b instanceof Error?b.message:b}`)}}loadAssistantManifest(e,r){let n=xn.join(r,"assistants.json");if(!bt.existsSync(n))return{found:!1,count:0};try{let o=jl(bt.readFileSync(n,"utf8")),s=to(e,n,o);return this.pluginAssistants=[...this.pluginAssistants.filter(i=>i.pluginId!==e),...s],{found:!0,count:s.length}}catch(o){return to(e,n,null),this.log.warn(`[plugins] ${e}: assistant manifest error: ${o instanceof Error?o.message:o}`),{found:!0,count:0}}}addRegisteredTool(e){this.config.toolCatalog?this.config.toolCatalog.addTool(e):ri(e)}removeRegisteredTool(e){return this.config.toolCatalog?.removeTool(e)??un(e)}};import*as fe from"node:fs";import*as $o from"node:path";function Pp(){return I().getUserPluginCacheDir()}function JA(){return $o.join(Pp(),"installed_plugins.json")}function QA(){let t=JA();if(!fe.existsSync(t))return{version:1,plugins:[]};try{return JSON.parse(fe.readFileSync(t,"utf-8"))}catch{return{version:1,plugins:[]}}}function VH(t){let e=Pp();fe.existsSync(e)||fe.mkdirSync(e,{recursive:!0}),fe.writeFileSync(JA(),JSON.stringify(t,null,2),"utf-8")}function XH(t,e){return!(e.blocklist?.includes(t)||e.allowlist&&!e.allowlist.includes(t))}async function YH(t,e,r){let{execFile:n}=await import("node:child_process"),{promisify:o}=await import("node:util"),s=o(n),i=Pp(),a=e?`${t}@${e}`:t;try{let{stdout:c}=await s("npm",["pack",a,"--pack-destination",i],{timeout:6e4,cwd:i}),l=c.trim().split(`
1110
+ `).pop()?.trim();if(!l)return r.warn(`[marketplace] npm pack returned no output for ${a}`),null;let d=$o.join(i,l),u=l.match(/^(.+)-(\d+\.\d+\.\d+.*)\.tgz$/)?.[2]??"0.0.0",m=$o.join(i,`${t}@${u}`);fe.existsSync(m)||fe.mkdirSync(m,{recursive:!0}),await s("tar",["xzf",d,"-C",m,"--strip-components=1"],{timeout:3e4});try{fe.unlinkSync(d)}catch{}let f=$o.join(m,"package.json");if(fe.existsSync(f))try{await s("npm",["install","--production","--no-save"],{cwd:m,timeout:12e4})}catch(g){r.warn(`[marketplace] npm install for ${t} failed: ${g.message}`)}return r.info(`[marketplace] installed ${t}@${u} from npm`),{name:t,version:u,installPath:m}}catch(c){return r.warn(`[marketplace] failed to install ${a} from npm: ${c.message}`),null}}function JH(){return QA().plugins.filter(e=>fe.existsSync(e.installPath)).map(e=>e.installPath)}async function QH(t,e){let r=QA(),n=[];for(let o of t.enabledPlugins){let s=o.specifier.split("/").pop()??o.specifier;if(!XH(s,t)){e.warn(`[marketplace] plugin "${s}" blocked by enterprise policy`);continue}let i=r.plugins.find(c=>c.source.specifier===o.specifier&&c.source.type===o.type);if(i&&fe.existsSync(i.installPath)&&(!o.version||i.version===o.version)){n.push(i.installPath);continue}let a=null;switch(o.type){case"npm":a=await YH(o.specifier,o.version,e);break;case"git":case"url":e.warn(`[marketplace] ${o.type} source not yet implemented for "${o.specifier}"`);break}if(a){let c={name:a.name,version:a.version,source:o,installPath:a.installPath,installedAt:new Date().toISOString()};r.plugins=r.plugins.filter(l=>!(l.source.specifier===o.specifier&&l.source.type===o.type)),r.plugins.push(c),n.push(a.installPath)}}return VH(r),n}function ZH(){let t=I().getUserMarketplaceConfigPath();if(!fe.existsSync(t))return null;try{return JSON.parse(fe.readFileSync(t,"utf-8"))}catch{return null}}async function ZA(t,e){let r=[...t],n=JH();r.push(...n);let o=ZH();if(o&&o.enabledPlugins.length>0)try{let s=await QH(o,e),i=new Set(r);for(let a of s)i.has(a)||r.push(a)}catch(s){e.warn(`[marketplace] failed to update plugins: ${s.message}`)}return r}var eB={id:"plugin-tools",kind:"plugin",register:tB};function tP(t){eB.register(t)}function tB(t){let e=rB(t.config,t.pathService);ZA(e,t.log).then(r=>{if(r.length===0)return;let n=new _a({pluginDirs:r,hookRegistry:t.hooks,log:t.log,toolCatalog:t.toolCatalog});t.setPluginLoader(n),n.loadAll().then(o=>{t.log.info(`[plugins] ${o.length} loaded, ${n.getPluginSkills().length} skills`)}).catch(o=>{t.log.warn(`[plugins] load error: ${o instanceof Error?o.message:o}`)}),t.hooks.register({point:"turn.submitted",handler:async()=>(await n.discoverNew(),await n.refreshActivations(),{action:"continue"}),label:"plugin-activation-refresh",priority:50})}).catch(r=>{t.log.warn(`[plugins] marketplace resolve error: ${r instanceof Error?r.message:r}`)})}function rB(t,e){let r=[],n=i=>{!i||!eP.existsSync(i)||r.includes(i)||r.push(i)},o=e.getUserPluginsDir();n(o),n(e.getProjectPluginsDir(e.getActiveProjectRoot()));let s=t.pluginPaths;if(Array.isArray(s))for(let i of s)typeof i=="string"&&n(i);return r}function rP(){return ne()?.type==="group"}async function nP(t,e){let r=e.getAcpPermissionSession();if(r)try{let n=await r.requestPermission({sessionId:r.sessionId,permissionId:t.approvalId,toolCall:{callId:t.callId,toolName:t.toolName,arguments:t.arguments?JSON.stringify(t.arguments):""},message:t.message,options:[{id:"allow",label:"\u5141\u8BB8\u6267\u884C"},{id:"deny",label:"\u4E0D\u6267\u884C"}]});return oP(t,n.optionId)}catch{return{approvalId:t.approvalId,decision:"deny"}}if(e.sendNotification("tool.approval.request",{approvalId:t.approvalId,callId:t.callId,toolName:t.toolName,arguments:t.arguments?JSON.stringify(t.arguments):"",message:t.message}),e.isPetActive()){let n=nB(t.toolName);e.sendNotification("pet.confirm",{confirmId:t.approvalId,toolName:t.toolName,description:t.message??`Allow ${t.toolName}`,risk:n,timeoutMs:3e4})}return new Promise(()=>{})}function nB(t){return t.match(/exec|bash|shell|terminal|run_command|reset|force|drop/i)?"system":t.match(/web|http|fetch|mcp|media|image|video|music|tts/i)?"external_egress":t.match(/write|delete|rm|move|patch|edit|create/i)?"write":"read"}function oP(t,e){return e!=="allow"?{approvalId:t.approvalId,decision:"deny"}:{approvalId:t.approvalId,decision:"allow"}}function sP(t){let e=xo(t.config.permissions),r=ZS(e);if(vi(e.mode==="full_access"),rP()){let o=cb();for(let s of o)r.addRule(s);lu(!0),t.log.info(`[permissions] group security mode active: ${o.length} rules injected`)}else lu(!1);t.currentUnregister?.();let n=eT({ruleEngine:r,hookRegistry:t.hooks,auditLogger:new $i(t.getActiveProjectRoot()),sessionId:t.sessionId,getTurnId:t.getTurnId,communityTelemetryRecorder:Fs()??void 0,onRequestApproval:o=>nP(o,t),onDenied:(o,s)=>{t.log.warn(`[permissions] blocked "${o}": ${s}`)}});return n.setToolMeta(t.toolCatalog.getToolManifest()),{permissionChecker:n,permissionUnregister:n.register(),ruleEngine:r}}G();import*as Cn from"node:fs";import*as Na from"node:path";var Da=class{filePath;constructor(e={}){this.filePath=e.filePath??Na.join(B(e.ownerUserId),"community","discovery-cache.json")}readAll(){try{let e=JSON.parse(Cn.readFileSync(this.filePath,"utf8"));return Array.isArray(e)?e.filter(oB):[]}catch{return[]}}find(e){return this.readAll().find(r=>r.intentKey===e)}writeMatch(e,r,n=new Date){let o={intentKey:e,resourceId:r.id,type:r.type,title:r.title,summary:r.summary,sourceTier:r.sourceTier,trustStage:r.trustStage,effectiveRiskTier:r.effectiveRiskTier,latestVersion:r.latestVersion,cachedAt:n.toISOString()},s=[o,...this.readAll().filter(i=>i.intentKey!==e)].slice(0,200);return Cn.mkdirSync(Na.dirname(this.filePath),{recursive:!0}),Cn.writeFileSync(this.filePath,`${JSON.stringify(s,null,2)}
1111
+ `,"utf8"),o}};function oB(t){if(!t||typeof t!="object"||Array.isArray(t))return!1;let e=t;return typeof e.intentKey=="string"&&typeof e.resourceId=="string"&&typeof e.title=="string"}var La=class{client;cache;localIndex;topK;now;inMemory=new Map;constructor(e){this.client=e.client,this.cache=e.cache??new Da,this.localIndex=e.localIndex,this.topK=e.topK??1,this.now=e.now??(()=>new Date)}async matchForTurn(e){let r=iP(e);if(!r)return{status:"miss",intentKey:r};let n=this.localIndex?.findInstalled(r);if(n)return{status:"local",intentKey:r,match:n};let o=this.inMemory.get(r);if(o)return o;if(!this.client)return this.memo(r,{status:"disabled",intentKey:r});let s;try{s=await this.client.getConsent()}catch(a){return this.memo(r,aP(r,a))}if(!s.enabled||!s.methodSharingEnabled)return this.memo(r,{status:"disabled",intentKey:r});let i=this.cache.find(r);if(i)return this.memo(r,{status:"cached",intentKey:r,cacheEntry:i});try{let[a]=await this.client.matchRegistry({intent:r,topK:this.topK,preferOfficial:!0});if(!a)return this.memo(r,{status:"miss",intentKey:r});let c=this.cache.writeMatch(r,a,this.now());return this.memo(r,{status:"matched",intentKey:r,match:a,cacheEntry:c})}catch(a){return this.memo(r,aP(r,a))}}async prefetchIdle(e){let r=[],n=new Set;for(let o of e){let s=iP(o);!s||n.has(s)||(n.add(s),r.push(await this.matchForTurn(s)))}return r}memo(e,r){return this.inMemory.set(e,r),r}};function iP(t){return t.trim().toLowerCase().replace(/\s+/g," ")}function aP(t,e){return{status:"unavailable",intentKey:t,error:e instanceof Error?e.message:String(e)}}function cP(t){let e=new Map;return{register(r){let n=e.get(r.point)??[],o={handler:r.handler,priority:r.priority??100,label:r.label};return n.push(o),n.sort((s,i)=>s.priority-i.priority),e.set(r.point,n),()=>{let s=n.indexOf(o);s>=0&&n.splice(s,1)}},async invoke(r,n){let o=e.get(r);if(!o||o.length===0)return{action:"continue",context:n};let s=n;for(let i of o)try{let a=await i.handler(r,s);if(!a||a.action==="continue"){a?.context&&(s=a.context);continue}if(a.action==="abort"||a.action==="skip")return t.info({hook:r,label:i.label,action:a.action,reason:a.reason},"hook intercepted"),a}catch(a){t.warn({hook:r,label:i.label,err:a.message},"hook handler failed (non-blocking)")}return{action:"continue",context:s}}}}function lP(t){let e=cP(t.log);t.taskStore.setHooks(e,t.sessionId),mb({onTaskCreated:n=>{e.invoke("task.created",{sessionId:t.sessionId,taskId:String(n.id),taskType:"planning",label:n.title}).catch(()=>{})},onTaskCompleted:n=>{e.invoke("task.completed",{sessionId:t.sessionId,taskId:String(n.id),taskType:"planning",label:n.title}).catch(()=>{})}});let r=Kw({hooks:e,currentUserId:t.currentUserId,log:t.log,prefetchState:t.prefetchState,getLastUserMessage:t.getLastUserMessage,getLastAssistantMessage:t.getLastAssistantMessage,resolveSmallModelClient:t.resolveSmallModelClient});return oh(e,{currentCwd:t.projectRoot,communityDiscovery:new La({client:Ot()}),log:{debug:n=>t.log.debug(n),warn:n=>t.log.warn(n)}}),tf(e,t.log,{transport:t.compressionClient.transport,apiKey:t.compressionClient.apiKey}),Vw({memdir:t.memdir,memoryProvider:r.toolProvider,memoryUserId:r.userId,toolCatalog:t.toolCatalog}),Zp(e,{getMemorySource:()=>t.memdir,log:{debug:n=>t.log.debug(n),warn:n=>t.log.warn(n)}},t.prefetchState),{hooks:e,memoryHandlerProvider:r.handlerProvider,memoryDreamProvider:r.dreamProvider,memoryLearningSink:r.learningSink,memoryUserId:r.userId}}G();import{watch as sB}from"node:fs";import{stat as iB}from"node:fs/promises";import{join as dP,relative as aB,resolve as cB}from"node:path";var lB=[`${zt}/settings.json`,"INSTRUCTIONS.md",`${zt}/INSTRUCTIONS.md`,"INSTRUCTIONS.local.md",`${zt}/rules`],dB=["INSTRUCTIONS.md","INSTRUCTIONS.local.md",`${zt}/rules`],xp=class{watchers=new Map;deps;debounceTimers=new Map;_cwd;constructor(e){this.deps=e,this._cwd=e.projectRoot}get cwd(){return this._cwd}async start(){for(let e of lB){let r=dP(this.deps.projectRoot,e);this.watchPath(r,e)}this.deps.log?.(`file-watcher: watching ${this.watchers.size} paths`)}watchPath(e,r){if(!this.watchers.has(e))try{let n=sB(e,{persistent:!1,recursive:r.includes("/")?!1:void 0},(o,s)=>{let i=s?dP(e,s):e;this.handleChange(i,o==="rename"?"created":"modified")});n.on("error",()=>{this.watchers.delete(e)}),this.watchers.set(e,n)}catch{}}handleChange(e,r){let n=this.debounceTimers.get(e);n&&clearTimeout(n),this.debounceTimers.set(e,setTimeout(async()=>{this.debounceTimers.delete(e);let o=r;try{await iB(e)}catch{o="deleted"}let s=aB(this.deps.projectRoot,e);this.deps.log?.(`file-watcher: ${o} ${s}`),this.deps.hooks.invoke("file.changed",{sessionId:this.deps.sessionId,filePath:e,changeType:o}).catch(()=>{}),dB.some(a=>s.includes(a)||e.includes(a))&&this.deps.onInstructionCacheReset?.()},300))}setCwd(e){let r=cB(e);if(r===this._cwd)return;let n=this._cwd;this._cwd=r,this.deps.hooks.invoke("cwd.changed",{sessionId:this.deps.sessionId,oldCwd:n,newCwd:r}).catch(()=>{}),this.deps.onInstructionCacheReset?.()}stop(){for(let[,e]of this.watchers)e.close();this.watchers.clear();for(let[,e]of this.debounceTimers)clearTimeout(e);this.debounceTimers.clear()}};async function uP(t){let e=new xp(t);return await e.start(),e}import{watch as uB}from"node:fs";import{readFile as pB}from"node:fs/promises";function mB(t){return I().getProjectSettingsPath(t)}async function gB(t){try{let e=await pB(t,"utf-8");return JSON.parse(e)}catch{return null}}function fB(t,e,r,n){let o=!1,s=hB(t);s&&(s.mode!==e.getMode()&&(e.setMode(s.mode),n?.(`settings: permission mode -> ${s.mode}`),o=!0),yB(s.rules,e.getRules())||(e.replaceRules(s.rules),n?.(`settings: ${s.rules.length} permission rules loaded`),o=!0),s.defaultBehavior!==e.getDefaultBehavior()&&(e.setDefaultBehavior(s.defaultBehavior),n?.(`settings: default behavior -> ${s.defaultBehavior}`),o=!0),o&&r&&r.invoke("config.changed",{sessionId:"",key:"permissions",oldValue:void 0,newValue:t}).catch(()=>{}))}function pP(t){let e=mB(t.projectRoot),r=null,n=null,o=async()=>{let s=await gB(e);s&&fB(s,t.ruleEngine,t.hooks,t.log)};o().catch(()=>{});try{r=uB(e,{persistent:!1},()=>{n&&clearTimeout(n),n=setTimeout(()=>{o().catch(()=>{})},200)}),r.on("error",()=>{})}catch{}return()=>{n&&clearTimeout(n),r?.close(),r=null}}function hB(t){return vB(t),t.permissions&&typeof t.permissions=="object"?Oi(t.permissions):null}function yB(t,e){return t.length!==e.length?!1:t.every((r,n)=>{let o=e[n];return!!o&&r.pattern===o.pattern&&r.behavior===o.behavior&&r.reason===o.reason&&r.source===o.source})}function vB(t){let e=t,r={permissionMode:"permissions.mode",permissionRules:"permissions.rules",defaultBehavior:"permissions.defaultBehavior"};for(let[n,o]of Object.entries(r))if(n in e)throw new Error(`Legacy top-level ${n} is not supported; use ${o}`)}function mP(t){let e=typeof t.config.workdir=="string"?t.config.workdir:process.cwd(),r=pP({projectRoot:e,ruleEngine:t.ruleEngine,hooks:t.hooks,log:n=>t.log.info(`[settings] ${n}`)});Xt(async()=>{r()}),t.currentFileWatcher?.stop(),t.setFileWatcher(null),uP({projectRoot:e,sessionId:t.sessionId,hooks:t.hooks,log:n=>t.log.debug(n),onInstructionCacheReset:TT}).then(n=>{t.setFileWatcher(n),Xt(async()=>{n.stop()})}).catch(n=>{t.log.warn(`[file-watcher] init error: ${n instanceof Error?n.message:n}`)})}import*as le from"node:fs";import*as Re from"node:path";var bB="skill",kB={type:"object",properties:{action:{type:"string",enum:["invoke","list","view","create","edit","patch","delete","promote"],description:["The operation to perform:","\u2022 'invoke' \u2014 Run a skill by name (provide 'name', optional 'args')","\u2022 'list' \u2014 List all available skills (optional 'category' filter)","\u2022 'view' \u2014 View full skill content (provide 'name', optional 'filePath')","\u2022 'create' \u2014 Create a new skill (provide 'name', 'content')","\u2022 'edit' \u2014 Overwrite skill content (provide 'name', 'content')","\u2022 'patch' \u2014 Find/replace in skill (provide 'name', 'oldString', 'newString')","\u2022 'delete' \u2014 Remove a skill (provide 'name')","\u2022 'promote' \u2014 Promote a project-level skill to global/user-level (provide 'name')"].join(`
1112
+ `)},name:{type:"string",description:"Skill name (required for invoke/view/create/edit/patch/delete/promote)."},args:{type:"string",description:"Arguments or context to pass when invoking a skill."},category:{type:"string",description:"Filter skills by category (for 'list' action)."},content:{type:"string",description:"Full SKILL.md content for create/edit actions."},filePath:{type:"string",description:"View a specific file within the skill (for 'view' action)."},fileContent:{type:"string",description:"Content for writing supporting files."},oldString:{type:"string",description:"Text to find for patch action."},newString:{type:"string",description:"Replacement text for patch action."}},required:["action"]};function gP(t){return{name:bB,label:"Skill",description:PB(t),parameters:kB,isConcurrencySafe:!1,isReadOnly:!1,searchHint:"skill invoke list view create edit delete command workflow",execute:async(e,r,n)=>{let{action:o}=r;switch(o){case"invoke":return RB(t,r,n);case"list":return SB(t,r);case"view":return TB(t,r);case"create":case"edit":case"patch":case"delete":return wB(t,r);case"promote":return AB(t,r);default:return{content:[{type:"text",text:`Unknown action: ${o}. Use invoke, list, view, create, edit, patch, delete, or promote.`}]}}}}}async function RB(t,e,r){let{name:n,args:o}=e;if(!n)return{content:[{type:"text",text:`Error: 'name' is required for invoke. Available skills: ${t.listSkills().map(l=>l.name).join(", ")||"(none)"}`}]};let s=await t.readSkillContent(n);if(!s){let c=t.listSkills().map(l=>l.name).join(", ");return{content:[{type:"text",text:`Skill "${n}" not found. Available skills: ${c||"(none)"}`}]}}if(t.executeSkillSubturn)try{return{content:[{type:"text",text:await t.executeSkillSubturn(n,s,o,r)}],details:{skillName:n,action:"invoke",mode:"subturn"}}}catch(c){let l=c instanceof Error?c.message:String(c);return{content:[{type:"text",text:`Skill execution error: ${l}`}],details:{error:l,skillName:n}}}let i=`## Skill: ${n}
1113
1113
 
1114
1114
  `,a=o?`
1115
1115
 
1116
1116
  ### User Context
1117
1117
  ${o}`:"";return{content:[{type:"text",text:`${i}Follow these instructions:
1118
1118
 
1119
- ${s}${a}`}],details:{skillName:n,action:"invoke",mode:"inline"}}}async function RB(t,e){let r=await t.listSkillsFull(e.category);if(r.skills.length===0)return{content:[{type:"text",text:e.category?`No skills found in category "${e.category}".`:"No skills available."}],details:{action:"list",count:0}};let n=[`Available skills (${r.skills.length}):`];r.categories.length>0&&n.push(`Categories: ${r.categories.join(", ")}`),n.push("");for(let o of r.skills){let s=o.category?` [${o.category}]`:"",i=o.version?` (v${o.version})`:"",a=o.scope?` {${o.scope}}`:"";n.push(`- **${o.name}**${i}${s}${a}: ${o.description}`)}return{content:[{type:"text",text:n.join(`
1120
- `)}],details:{action:"list",count:r.skills.length}}}async function SB(t,e){if(!e.name)return{content:[{type:"text",text:"Error: 'name' is required for view."}]};let r=await t.viewSkill(e.name,e.filePath);if(!r)return{content:[{type:"text",text:`Skill "${e.name}" not found. Use action: "list" to see available skills.`}],details:{action:"view",error:"not_found"}};let n=[`## Skill: ${r.name}
1119
+ ${s}${a}`}],details:{skillName:n,action:"invoke",mode:"inline"}}}async function SB(t,e){let r=await t.listSkillsFull(e.category);if(r.skills.length===0)return{content:[{type:"text",text:e.category?`No skills found in category "${e.category}".`:"No skills available."}],details:{action:"list",count:0}};let n=[`Available skills (${r.skills.length}):`];r.categories.length>0&&n.push(`Categories: ${r.categories.join(", ")}`),n.push("");for(let o of r.skills){let s=o.category?` [${o.category}]`:"",i=o.version?` (v${o.version})`:"",a=o.scope?` {${o.scope}}`:"";n.push(`- **${o.name}**${i}${s}${a}: ${o.description}`)}return{content:[{type:"text",text:n.join(`
1120
+ `)}],details:{action:"list",count:r.skills.length}}}async function TB(t,e){if(!e.name)return{content:[{type:"text",text:"Error: 'name' is required for view."}]};let r=await t.viewSkill(e.name,e.filePath);if(!r)return{content:[{type:"text",text:`Skill "${e.name}" not found. Use action: "list" to see available skills.`}],details:{action:"view",error:"not_found"}};let n=[`## Skill: ${r.name}
1121
1121
  `,r.content];return r.referenceFiles&&r.referenceFiles.length>0&&n.push(`
1122
1122
  ### Reference Files
1123
1123
  ${r.referenceFiles.map(o=>`- ${o}`).join(`
1124
1124
  `)}`),{content:[{type:"text",text:n.join(`
1125
- `)}],details:{action:"view",name:r.name}}}async function TB(t,e){if(!e.name)return{content:[{type:"text",text:`Error: 'name' is required for ${e.action}.`}]};let r=await t.manageSkill({action:e.action,name:e.name,category:e.category,content:e.content,filePath:e.filePath,fileContent:e.fileContent,oldString:e.oldString,newString:e.newString});return{content:[{type:"text",text:r.message}],details:{action:e.action,success:r.success,path:r.path}}}async function wB(t,e){if(!e.name)return{content:[{type:"text",text:"Error: 'name' is required for promote."}]};if(!t.promoteSkill)return{content:[{type:"text",text:"Promote is not available in this configuration. Skills may already be at user-level."}]};let r=await t.promoteSkill(e.name);return{content:[{type:"text",text:r.message}],details:{action:"promote",success:r.success,name:e.name}}}function AB(t){let e=t.listSkills(),r=`Manage and invoke skills \u2014 reusable workflows and domain-specific knowledge packages. Use action: 'list' to discover skills, 'view' to read content, 'invoke' to run a skill. Skills can also be created, edited, patched, or deleted. Use 'promote' (with name) to copy a project skill to global (user-level) so it's available across all projects.
1125
+ `)}],details:{action:"view",name:r.name}}}async function wB(t,e){if(!e.name)return{content:[{type:"text",text:`Error: 'name' is required for ${e.action}.`}]};let r=await t.manageSkill({action:e.action,name:e.name,category:e.category,content:e.content,filePath:e.filePath,fileContent:e.fileContent,oldString:e.oldString,newString:e.newString});return{content:[{type:"text",text:r.message}],details:{action:e.action,success:r.success,path:r.path}}}async function AB(t,e){if(!e.name)return{content:[{type:"text",text:"Error: 'name' is required for promote."}]};if(!t.promoteSkill)return{content:[{type:"text",text:"Promote is not available in this configuration. Skills may already be at user-level."}]};let r=await t.promoteSkill(e.name);return{content:[{type:"text",text:r.message}],details:{action:"promote",success:r.success,name:e.name}}}function PB(t){let e=t.listSkills(),r=`Manage and invoke skills \u2014 reusable workflows and domain-specific knowledge packages. Use action: 'list' to discover skills, 'view' to read content, 'invoke' to run a skill. Skills can also be created, edited, patched, or deleted. Use 'promote' (with name) to copy a project skill to global (user-level) so it's available across all projects.
1126
1126
 
1127
1127
  CROSS-PROJECT RECALL: When you see '[Cross-project skill available]' in recalled memories, it means a relevant skill exists in another project. You should proactively inform the user and offer to use it (invoke) or promote it to global. Do not wait for explicit instructions \u2014 the user may not know the skill exists. Typical user signals: '\u4E4B\u524D\u505A\u8FC7', '\u53C2\u8003XX\u9879\u76EE', 'didn't you do this before', 'same as the other project'.`;if(e.length===0)return r;let n=e.slice(0,50).map(o=>`- ${o.name}: ${o.description??"(no description)"}`).join(`
1128
1128
  `);return`${r}
1129
1129
 
1130
1130
  Available skills:
1131
- ${n}`}import{randomUUID as _B}from"node:crypto";var PB=10080*60*1e3;function xB(t){return{async record(e){if(!t)return"disabled";try{let r=await t.getConsent();return!r.enabled||!r.signalsEnabled?"disabled":(await t.recordSignal(e),"recorded")}catch{return"failed"}},async recordSkillUsage(e,r){let n=Cp(e);return n?this.record({resourceId:n,event:r,attribution:"skill-subturn",metadata:{skillName:e?.name,version:e?.registryVersion,effectiveRiskTier:e?.registryEffectiveRiskTier}}):"skipped"},async recordSkillLifecycle(e,r){let n=Cp(e);return n?this.record({resourceId:n,event:r,attribution:"skill-lifecycle",metadata:{skillName:e?.name,version:e?.registryVersion}}):"skipped"},async recordKeptSignals(e,r={}){let n=r.now??new Date,o=r.retentionMs??PB,s=[];for(let i of Object.values(e.records)){if(!CB(i,n,o))continue;let a=await this.recordSkillLifecycle(i,"kept");a==="recorded"&&(i.registryKeptSignalAt=n.toISOString()),s.push({skillName:i.name,status:a})}return s}}}function fP(){let t=Ot();return t?xB(t):null}function Cp(t){return t?.source!=="installed"||t.registrySourceTier==="official"?null:t.registryResourceId??t.name}function CB(t,e,r){if(!Cp(t)||t.registryKeptSignalAt)return!1;let n=Date.parse(t.lastUsedAt??t.createdAt);return Number.isFinite(n)?e.getTime()-n>=r:!1}import{spawn as Pte}from"node:child_process";function hP(t={}){let e=t.platform??process.platform;if(e!=="win32")return{level:"L0",available:!1,backend:"unsupported-platform",platform:e,reason:"unsupported-platform"};let r=t.processTreeLauncherAvailable===!0||t.jobObjectAvailable===!0;return{level:"L0",available:r,backend:r?"windows-process-tree-launcher":"unavailable",platform:e,reason:r?void 0:"windows-l0-not-provisioned"}}function yP(){return{envelope:"l0-launcher-audit-v1",backend:"windows-process-tree-launcher",defaultHostAccess:!0,noFsNetworkRestriction:!0,processTree:{killOnClose:!0,trackChildren:!0},jobObject:{implemented:!1,ready:!0}}}function IB(t={}){let e=t.availability??hP({platform:t.platform,appContainerAvailable:t.appContainerAvailable,jobObjectAvailable:t.jobObjectAvailable,processTreeLauncherAvailable:t.processTreeLauncherAvailable});return{getAvailability(){return e},decide(r){if(r.origin==="first-party"||r.origin==="official"||r.official===!0)return{allowed:!0,spawnAllowed:!0,launcherRequired:!1,reason:"first-party-action",backend:"first-party",l0:e};if(r.origin==="community"&&r.executable===!0){let o=e.available?"launcher-required":"launcher-unavailable";return{allowed:e.available,spawnAllowed:e.available,launcherRequired:!0,reason:o,backend:"community-l0-launcher",l0:e,launcher:MB(r,e.available?"allowed":"blocked",o)}}let n=r.riskTier??"unknown";return!EB(n)||!r.executable?{allowed:!0,spawnAllowed:!0,launcherRequired:!1,reason:"community-low-risk",backend:"community-l1-l2",l0:e}:r.autoRun===!1?{allowed:!0,spawnAllowed:!0,launcherRequired:!1,reason:"manual-run",backend:"community-l1-l2",l0:e}:{allowed:e.available,spawnAllowed:e.available,launcherRequired:!0,reason:e.available?"l0-available":"l0-unavailable",backend:"community-l0",l0:e}}}}function vP(){return IB()}function EB(t){return t==="R2"||t==="R3"}function MB(t,e,r){return{level:"L0",mode:"os-native-launcher",defaultHostAccess:!0,noFsNetworkRestriction:!0,audit:{envelope:"l0-launcher-audit-v1",subject:{origin:t.origin,official:t.official===!0,executable:t.executable===!0,autoRun:t.autoRun===!0},decision:e,reason:r},windows:yP()}}async function RP(t){let{host:e,toolCatalog:r,skillName:n,skillContent:o,userArgs:s,signal:i}=t,a=`skill_${n}_${_B().slice(0,8)}`,c=e.getAgent();if(!c)return"[skill] Cannot execute: no LLM provider configured";let l=I().getOwnerProfileDir(),d=e.getCurrentSessionId()||"skill",p=ue(l).records[n],u=t.communitySignalReporter??fP(),m=(t.skillSandbox??vP()).decide({origin:TP(p)?"community":"first-party",riskTier:p?.registryEffectiveRiskTier??p?.registryRiskTier??"unknown",executable:!0,autoRun:!0});if(!m.allowed)return await u?.recordSkillUsage(p,"fail"),`[skill "${n}"] blocked: community ${m.reason} (${m.l0.reason??m.l0.backend})`;let f=SP(n,p);e.getCurrentHooks()?.invoke("subagent.started",{sessionId:d,turnId:a,subagentId:a,agentType:f}).catch(()=>{});let g=new Set(["skill","agent"]),h=r.getToolManifest().filter(S=>!g.has(S.function.name)),b=s??`Execute skill "${n}" instructions.`,v=[],R;for await(let S of c.run({turnId:a,sessionId:d,messages:[{role:"user",content:b}],tools:h,systemPrompt:o,config:{parentDepth:1,maxRounds:5}},i)){if(S.type==="end"&&S.content)return bP(e,d,a,f,"normal"),kP(l,n,!0),await u?.recordSkillUsage(p,"success"),S.content;if(S.type==="delta"&&S.text&&v.push(S.text),S.type==="error"){R=S.error;break}}return bP(e,d,a,f,R?"error":"normal",R),R?(Gu(l,n,!1),await u?.recordSkillUsage(p,"error"),`[skill "${n}"] error: ${R}`):(kP(l,n,!0),await u?.recordSkillUsage(p,"success"),v.join("")||`[skill "${n}"] completed (no output)`)}function SP(t,e){return DB(e)?`community-skill:${t}`:`skill:${t}`}function DB(t){return TP(t)}function TP(t){return t?.source!=="installed"?!1:t.registrySourceTier!=="official"}function bP(t,e,r,n,o,s){t.getCurrentHooks()?.invoke("subagent.stopped",{sessionId:e,turnId:r,subagentId:r,agentType:n,reason:o,error:s}).catch(()=>{})}function kP(t,e,r){Gu(t,e,r);let n=ue(t);dh(n,e),he(t,n)}var NB={id:"skill-meta-tool",kind:"skill",register:({host:t,...e})=>LB(t,e)};function wP(t,e){NB.register({...e,host:t})}function LB(t,e){let r=e.config,n=e.pathService,o=n.getProjectSkillsDir(t.getActiveProjectRoot()),s=[o,n.getUserSkillsDir(),...Array.isArray(r?.skillPaths)?r.skillPaths:[]];e.toolCatalog.addTool(gP({listSkills:()=>{let i=[];i.push(...t.getPluginSkills());let a=r?.skillPaths;if(Array.isArray(a)){for(let c of a)if(typeof c=="string"){let l=Re.basename(c);i.some(d=>d.name===l)||i.push({name:l,source:"gateway",filePath:Re.join(c,"SKILL.md"),baseDir:c})}}return i},listSkillsFull:async i=>{let a=[],c=new Set,l=n.getUserSkillsDir();for(let d of s)try{let p=await le.promises.readdir(d,{withFileTypes:!0});for(let u of p){if(!u.isDirectory())continue;let m=Re.join(d,u.name,"SKILL.md");try{let f=await le.promises.readFile(m,"utf8"),g=Re.basename(d);if(i&&g!==i)continue;c.add(g);let h=d===l?"global":d===o?"project":"config",v=f.match(/^---\n[\s\S]*?^version:\s*(\S+)/m)?.[1],R=f.startsWith(`---
1131
+ ${n}`}import{randomUUID as DB}from"node:crypto";var xB=10080*60*1e3;function CB(t){return{async record(e){if(!t)return"disabled";try{let r=await t.getConsent();return!r.enabled||!r.signalsEnabled?"disabled":(await t.recordSignal(e),"recorded")}catch{return"failed"}},async recordSkillUsage(e,r){let n=Cp(e);return n?this.record({resourceId:n,event:r,attribution:"skill-subturn",metadata:{skillName:e?.name,version:e?.registryVersion,effectiveRiskTier:e?.registryEffectiveRiskTier}}):"skipped"},async recordSkillLifecycle(e,r){let n=Cp(e);return n?this.record({resourceId:n,event:r,attribution:"skill-lifecycle",metadata:{skillName:e?.name,version:e?.registryVersion}}):"skipped"},async recordKeptSignals(e,r={}){let n=r.now??new Date,o=r.retentionMs??xB,s=[];for(let i of Object.values(e.records)){if(!IB(i,n,o))continue;let a=await this.recordSkillLifecycle(i,"kept");a==="recorded"&&(i.registryKeptSignalAt=n.toISOString()),s.push({skillName:i.name,status:a})}return s}}}function fP(){let t=Ot();return t?CB(t):null}function Cp(t){return t?.source!=="installed"||t.registrySourceTier==="official"?null:t.registryResourceId??t.name}function IB(t,e,r){if(!Cp(t)||t.registryKeptSignalAt)return!1;let n=Date.parse(t.lastUsedAt??t.createdAt);return Number.isFinite(n)?e.getTime()-n>=r:!1}import{spawn as xte}from"node:child_process";function hP(t={}){let e=t.platform??process.platform;if(e!=="win32")return{level:"L0",available:!1,backend:"unsupported-platform",platform:e,reason:"unsupported-platform"};let r=t.processTreeLauncherAvailable===!0||t.jobObjectAvailable===!0;return{level:"L0",available:r,backend:r?"windows-process-tree-launcher":"unavailable",platform:e,reason:r?void 0:"windows-l0-not-provisioned"}}function yP(){return{envelope:"l0-launcher-audit-v1",backend:"windows-process-tree-launcher",defaultHostAccess:!0,noFsNetworkRestriction:!0,processTree:{killOnClose:!0,trackChildren:!0},jobObject:{implemented:!1,ready:!0}}}function EB(t={}){let e=t.availability??hP({platform:t.platform,appContainerAvailable:t.appContainerAvailable,jobObjectAvailable:t.jobObjectAvailable,processTreeLauncherAvailable:t.processTreeLauncherAvailable});return{getAvailability(){return e},decide(r){if(r.origin==="first-party"||r.origin==="official"||r.official===!0)return{allowed:!0,spawnAllowed:!0,launcherRequired:!1,reason:"first-party-action",backend:"first-party",l0:e};if(r.origin==="community"&&r.executable===!0){let o=e.available?"launcher-required":"launcher-unavailable";return{allowed:e.available,spawnAllowed:e.available,launcherRequired:!0,reason:o,backend:"community-l0-launcher",l0:e,launcher:_B(r,e.available?"allowed":"blocked",o)}}let n=r.riskTier??"unknown";return!MB(n)||!r.executable?{allowed:!0,spawnAllowed:!0,launcherRequired:!1,reason:"community-low-risk",backend:"community-l1-l2",l0:e}:r.autoRun===!1?{allowed:!0,spawnAllowed:!0,launcherRequired:!1,reason:"manual-run",backend:"community-l1-l2",l0:e}:{allowed:e.available,spawnAllowed:e.available,launcherRequired:!0,reason:e.available?"l0-available":"l0-unavailable",backend:"community-l0",l0:e}}}}function vP(){return EB()}function MB(t){return t==="R2"||t==="R3"}function _B(t,e,r){return{level:"L0",mode:"os-native-launcher",defaultHostAccess:!0,noFsNetworkRestriction:!0,audit:{envelope:"l0-launcher-audit-v1",subject:{origin:t.origin,official:t.official===!0,executable:t.executable===!0,autoRun:t.autoRun===!0},decision:e,reason:r},windows:yP()}}async function RP(t){let{host:e,toolCatalog:r,skillName:n,skillContent:o,userArgs:s,signal:i}=t,a=`skill_${n}_${DB().slice(0,8)}`,c=e.getAgent();if(!c)return"[skill] Cannot execute: no LLM provider configured";let l=I().getOwnerProfileDir(),d=e.getCurrentSessionId()||"skill",p=ue(l).records[n],u=t.communitySignalReporter??fP(),m=(t.skillSandbox??vP()).decide({origin:TP(p)?"community":"first-party",riskTier:p?.registryEffectiveRiskTier??p?.registryRiskTier??"unknown",executable:!0,autoRun:!0});if(!m.allowed)return await u?.recordSkillUsage(p,"fail"),`[skill "${n}"] blocked: community ${m.reason} (${m.l0.reason??m.l0.backend})`;let f=SP(n,p);e.getCurrentHooks()?.invoke("subagent.started",{sessionId:d,turnId:a,subagentId:a,agentType:f}).catch(()=>{});let g=new Set(["skill","agent"]),h=r.getToolManifest().filter(S=>!g.has(S.function.name)),b=s??`Execute skill "${n}" instructions.`,v=[],R;for await(let S of c.run({turnId:a,sessionId:d,messages:[{role:"user",content:b}],tools:h,systemPrompt:o,config:{parentDepth:1,maxRounds:5}},i)){if(S.type==="end"&&S.content)return bP(e,d,a,f,"normal"),kP(l,n,!0),await u?.recordSkillUsage(p,"success"),S.content;if(S.type==="delta"&&S.text&&v.push(S.text),S.type==="error"){R=S.error;break}}return bP(e,d,a,f,R?"error":"normal",R),R?(Gu(l,n,!1),await u?.recordSkillUsage(p,"error"),`[skill "${n}"] error: ${R}`):(kP(l,n,!0),await u?.recordSkillUsage(p,"success"),v.join("")||`[skill "${n}"] completed (no output)`)}function SP(t,e){return NB(e)?`community-skill:${t}`:`skill:${t}`}function NB(t){return TP(t)}function TP(t){return t?.source!=="installed"?!1:t.registrySourceTier!=="official"}function bP(t,e,r,n,o,s){t.getCurrentHooks()?.invoke("subagent.stopped",{sessionId:e,turnId:r,subagentId:r,agentType:n,reason:o,error:s}).catch(()=>{})}function kP(t,e,r){Gu(t,e,r);let n=ue(t);dh(n,e),he(t,n)}var LB={id:"skill-meta-tool",kind:"skill",register:({host:t,...e})=>OB(t,e)};function wP(t,e){LB.register({...e,host:t})}function OB(t,e){let r=e.config,n=e.pathService,o=n.getProjectSkillsDir(t.getActiveProjectRoot()),s=[o,n.getUserSkillsDir(),...Array.isArray(r?.skillPaths)?r.skillPaths:[]];e.toolCatalog.addTool(gP({listSkills:()=>{let i=[];i.push(...t.getPluginSkills());let a=r?.skillPaths;if(Array.isArray(a)){for(let c of a)if(typeof c=="string"){let l=Re.basename(c);i.some(d=>d.name===l)||i.push({name:l,source:"gateway",filePath:Re.join(c,"SKILL.md"),baseDir:c})}}return i},listSkillsFull:async i=>{let a=[],c=new Set,l=n.getUserSkillsDir();for(let d of s)try{let p=await le.promises.readdir(d,{withFileTypes:!0});for(let u of p){if(!u.isDirectory())continue;let m=Re.join(d,u.name,"SKILL.md");try{let f=await le.promises.readFile(m,"utf8"),g=Re.basename(d);if(i&&g!==i)continue;c.add(g);let h=d===l?"global":d===o?"project":"config",v=f.match(/^---\n[\s\S]*?^version:\s*(\S+)/m)?.[1],R=f.startsWith(`---
1132
1132
  `)?f.indexOf("---",4):-1,C=(R>=0?f.slice(R+3).trimStart():f).split(`
1133
1133
  `).find(E=>E.trim()&&!E.startsWith("#"))?.trim()??`Skill from ${g}`;a.push({name:u.name,description:C,category:g,scope:h,version:v})}catch{}}}catch{}for(let d of t.getPluginSkills())i&&d.source!==i||(c.add(d.source??"plugin"),a.push({name:d.name,description:`Plugin skill (${d.source})`,category:d.source,scope:"plugin"}));return{skills:a,categories:[...c]}},readSkillContent:async i=>{for(let a of s){let c=Re.join(a,i,"SKILL.md");try{return await le.promises.readFile(c,"utf8")}catch{}}return null},viewSkill:async(i,a)=>{for(let c of s){let l=a?Re.join(c,i,a):Re.join(c,i,"SKILL.md");try{let d=await le.promises.readFile(l,"utf8");return{name:i,content:d}}catch{}}return null},executeSkillSubturn:async(i,a,c,l)=>RP({host:t,toolCatalog:e.toolCatalog,skillName:i,skillContent:a,userArgs:c,signal:l}),manageSkill:async i=>{let a=t.getActiveProjectRoot(),c=n.getProjectSkillsDir(a),l=Re.join(c,i.name),d=Re.join(l,"SKILL.md"),p=n.getOwnerProfileDir();switch(i.action){case"create":{let u=i.content??"",f=sd(u,i.name,`Skill: ${i.name}`)??u,g=Bs(f,i.name);if(!g.valid)return{success:!1,message:`Skill validation failed: ${g.errors.join("; ")}`};let h=ue(p);if(h.records[i.name]?.pinned&&le.existsSync(d))return{success:!1,message:`Skill "${i.name}" is pinned. Unpin it first.`};await le.promises.mkdir(l,{recursive:!0}),await le.promises.writeFile(d,f,"utf8"),t.sendNotification("turn.skill_instruction",{turnId:`skill-create-${Date.now()}`,instruction:{name:i.name,category:i.category??"learned",content:f,scope:"project"}}),gt(),It(h,i.name,"created"),he(p,h);let b=t.getMemoryLearningSink(),v=t.getMemoryUserId();if(b&&v){let S=f.split(`
1134
- `).slice(0,3).join(" ").slice(0,200),T=a?Re.basename(a):"unknown";b.ingestExtracted([{text:`Learned skill "${i.name}" in project "${T}": ${S}`,category:"skill-learning"}],v).catch(()=>{})}let R=a?` (project-scoped). To make it available across all projects, use: skill promote name:"${i.name}"`:"";return{success:!0,message:`Skill "${i.name}" created${R}`,path:l}}case"edit":{let u=ue(p);if(u.records[i.name]?.pinned)return{success:!1,message:`Skill "${i.name}" is pinned. Unpin it first.`};let m=i.content??"",g=sd(m,i.name)??m;return await le.promises.writeFile(d,g,"utf8"),rd(u,i.name),he(p,u),t.sendNotification("turn.skill_instruction",{turnId:`skill-edit-${Date.now()}`,instruction:{name:i.name,category:i.category??"learned",content:g,scope:"project"}}),{success:!0,message:`Skill "${i.name}" updated`,path:d}}case"patch":{let u=ue(p);if(u.records[i.name]?.pinned)return{success:!1,message:`Skill "${i.name}" is pinned. Unpin it first.`};let m=await le.promises.readFile(d,"utf8");if(!i.oldString||!m.includes(i.oldString))return{success:!1,message:"oldString not found in SKILL.md"};let f=m.replace(i.oldString,i.newString??"");return await le.promises.writeFile(d,f,"utf8"),rd(u,i.name),he(p,u),t.sendNotification("turn.skill_instruction",{turnId:`skill-patch-${Date.now()}`,instruction:{name:i.name,category:i.category??"learned",content:f,scope:"project"}}),{success:!0,message:`Skill "${i.name}" patched`,path:d}}case"delete":{let u=ue(p);return u.records[i.name]?.pinned?{success:!1,message:`Skill "${i.name}" is pinned. Unpin it first.`}:(await le.promises.rm(l,{recursive:!0,force:!0}),$s(u,i.name),he(p,u),t.sendNotification("turn.skill_instruction",{turnId:`skill-delete-${Date.now()}`,instruction:{name:i.name,category:i.category??"learned",action:"delete",scope:"project"}}),gt(),{success:!0,message:`Skill "${i.name}" deleted`})}default:return{success:!1,message:`Unknown action: ${i.action}`}}},promoteSkill:async i=>{let a=n.getProjectSkillsDir(t.getActiveProjectRoot()),c=Re.join(a,i,"SKILL.md");try{await le.promises.access(c)}catch{return{success:!1,message:`Skill "${i}" not found in project skills. Cannot promote.`}}let l=n.getUserSkillsDir(),d=Re.join(l,i);await le.promises.mkdir(d,{recursive:!0});let p=Re.join(a,i),u=await le.promises.readdir(p);for(let m of u){let f=await le.promises.readFile(Re.join(p,m));await le.promises.writeFile(Re.join(d,m),f)}return t.sendNotification("turn.skill_instruction",{turnId:`skill-promote-${Date.now()}`,instruction:{name:i,category:"promoted",content:await le.promises.readFile(c,"utf8"),scope:"global"}}),await le.promises.rm(p,{recursive:!0,force:!0}),t.sendNotification("turn.skill_instruction",{turnId:`skill-promote-cleanup-${Date.now()}`,instruction:{name:i,category:"learned",action:"delete",scope:"project"}}),gt(),{success:!0,message:`Skill "${i}" promoted to global (user-level) and removed from project scope. It will now be available across all projects.`,path:d}}}))}function AP(t){let e=lP({log:t.log,taskStore:t.taskStore,sessionId:t.sessionId,projectRoot:t.projectRoot,memdir:t.memdir,toolCatalog:t.toolCatalog,currentUserId:t.currentUserId,prefetchState:t.memoryPrefetchState,getLastUserMessage:t.getLastUserMessage,getLastAssistantMessage:t.getLastAssistantMessage,resolveSmallModelClient:t.resolveSmallModelClient,compressionClient:{transport:t.agentClient.transport,apiKey:t.agentClient.apiKey}}),r=e.hooks;XA({config:t.config,projectRoot:t.projectRoot,pathService:t.pathService,log:t.log,toolCatalog:t.toolCatalog,currentManager:t.currentMcpManager,setManager:t.setMcpManager,setReady:t.setMcpReady}),tP({config:t.config,hooks:r,log:t.log,pathService:t.pathService,toolCatalog:t.toolCatalog,setPluginLoader:t.setPluginLoader});let n=sP({config:t.config,toolCatalog:t.toolCatalog,hooks:r,log:t.log,sessionId:t.sessionId,getTurnId:t.getTurnId,getActiveProjectRoot:()=>t.projectRoot,getAcpPermissionSession:t.getAcpPermissionSession,sendNotification:t.sendNotification,isPetActive:t.isPetActive,currentUnregister:t.currentPermissionUnregister});return wP({getActiveProjectRoot:()=>t.projectRoot,getPluginSkills:t.getPluginSkills,getAgent:t.getAgent,getCurrentSessionId:()=>t.sessionId,getCurrentHooks:()=>r,sendNotification:t.sendNotification,getMemoryLearningSink:()=>e.memoryLearningSink,getMemoryUserId:()=>e.memoryUserId},{config:t.config,pathService:t.pathService,toolCatalog:t.toolCatalog}),_A({config:t.config,host:t.coreToolHost,hooks:r,log:t.log,toolCatalog:t.toolCatalog,toolInvoker:t.toolInvoker}),HA({config:t.config,pathService:t.pathService,toolCatalog:t.toolCatalog}),t.sessionId&&r.invoke("session.created",{sessionId:t.sessionId}).catch(()=>{}),mP({config:t.config,hooks:r,ruleEngine:n.ruleEngine,sessionId:t.sessionId,currentFileWatcher:t.currentFileWatcher,log:t.log,setFileWatcher:t.setFileWatcher}),{hooks:r,memoryHandlerProvider:e.memoryHandlerProvider,memoryDreamProvider:e.memoryDreamProvider,memoryUserId:e.memoryUserId,permissionChecker:n.permissionChecker,permissionUnregister:n.permissionUnregister,ruleEngine:n.ruleEngine}}function PP(t){let{provider:e,model:r,apiKey:n,baseUrl:o}=t.resolvedConfig,s=ei({provider:e,model:r,apiKey:n,baseUrl:o},t.providerRegistry);return s.transport=bv(s.transport,t.sessionId||"default"),{transport:s.transport,apiKey:n,model:r,provider:e,baseUrl:o??""}}function xP(t){return{agent:new nn({llmTransport:t.client.transport,apiKey:t.client.apiKey,toolInvoker:t.toolInvoker,log:t.log,hooks:t.hooks,maxRounds:t.maxRounds,verbose:t.verbose,projectRoot:t.projectRoot,runtimePorts:Rs()}),...t.client}}import{randomUUID as OB}from"node:crypto";async function CP(t){let e=[],r=t.result.content.map(l=>{if(l.type==="image"&&l.data){let d=l.mimeType||"image/png";return e.push(`data:${d};base64,${l.data}`),"[Image]"}return l.text??""}).join(`
1135
- `),n=e.length>0?[...e,...t.result.imageUrls??[]]:t.result.imageUrls,o=t.result.details?.error,s=o?r:void 0,i=t.result.details?.type,a=i?.split("_")[0];if(i==="three_d_generate"&&(a="3d"),a&&["image","tts","video","music","3d"].includes(a)){let l=t.result.details?.mediaUrls??[],d=a;for(let p of l)t.sendNotification("turn.media_result",{turnId:t.turnId,mediaType:d,url:p,model:t.result.details?.model,provider:t.result.details?.provider,...t.result.details?.durationMs?{durationSeconds:t.result.details.durationMs/1e3}:{},...t.result.details?.taskId?{taskId:t.result.details.taskId}:{}});if(l.length>0)try{let p=await t.mediaPersistence.downloadAll(l,{type:a,sessionId:t.sessionId||void 0},{warn:u=>t.log(u)});if(p.length>0){for(let u of p)r=r.replaceAll(u.remoteUrl,u.localPath);t.sendNotification("turn.media_persisted",{turnId:t.turnId,files:p.map(u=>({remoteUrl:u.remoteUrl,localPath:u.localPath,bytes:u.bytes,mimeType:u.mimeType}))})}}catch{}}if(i==="task"&&!o&&t.result.details?.taskList)try{let l=t.result.details;l?.taskList&&t.sendNotification("turn.todos_updated",{turnId:t.turnId,items:l.taskList,summary:{total:l.total??l.taskList.length,completed:l.completed??0,inProgress:l.inProgress??0,notStarted:l.notStarted??0}})}catch{}let c=Array.isArray(t.result.details?.matches)?t.result.details.matches:void 0;return{result:r,error:s,toolReferences:c,imageUrls:n,details:t.result.details}}function IP(t){return{invoke:async(e,r,n,o)=>{if(r.startsWith("$"))return{result:n};let s=t.toolCatalog.findTool(r);if(!s)return{result:"",error:`Unknown tool: ${r}`};if(typeof s.execute!="function")return{result:"",error:`Tool is not executable: ${r}`};let i=`tc_${OB().slice(0,8)}`;try{let a=JSON.parse(n),c=await s.execute(i,a,o);return await CP({turnId:e,sessionId:t.getSessionId(),result:c,mediaPersistence:t.mediaPersistence,log:t.log,sendNotification:(l,d)=>t.sendNotification(l,d)})}catch(a){return{result:"",error:a instanceof Error?a.message:String(a)}}}}}function EP(t){let e={info:i=>t.log(i),warn:i=>t.log(`[warn] ${i}`),error:i=>t.log(`[error] ${i}`),debug:i=>{t.verbose&&t.log(`[debug] ${i}`)}},r=IP({mediaPersistence:t.mediaPersistence,toolCatalog:t.toolCatalog,getSessionId:()=>t.sessionId,log:i=>t.log(i),sendNotification:t.sendNotification}),n=PP({resolvedConfig:t.resolvedTextConfig,providerRegistry:t.providerRegistry,sessionId:t.sessionId}),o=AP({config:t.config,log:e,taskStore:t.taskStore,sessionId:t.sessionId,getTurnId:t.getTurnId,projectRoot:t.projectRoot,pathService:t.pathService,memdir:t.memdir,currentUserId:t.currentUserId,memoryPrefetchState:t.memoryPrefetchState,getLastUserMessage:t.getLastUserMessage,getLastAssistantMessage:t.getLastAssistantMessage,resolveSmallModelClient:t.resolveSmallModelClient,agentClient:n,toolCatalog:t.toolCatalog,currentMcpManager:t.runtimeSession.mcpManager,setMcpManager:t.setMcpManager,setMcpReady:t.setMcpReady,setPluginLoader:t.setPluginLoader,getPluginSkills:()=>t.runtimeSession.getPluginSkills(),getAgent:t.getAgent,getAcpPermissionSession:t.getAcpPermissionSession,sendNotification:t.sendNotification,isPetActive:t.isPetActive,currentPermissionUnregister:t.runtimeSession.permissionUnregister,coreToolHost:t.coreToolHost,toolInvoker:r,currentFileWatcher:t.runtimeSession.fileWatcher,setFileWatcher:t.setFileWatcher});return t.runtimeSession.applyBootstrap(o),{agent:xP({client:n,toolInvoker:r,log:e,hooks:o.hooks,maxRounds:t.config.maxRounds,verbose:t.verbose,projectRoot:t.projectRoot}).agent,agentClient:n,toolInvoker:r,hooks:o.hooks}}var $B=jB(import.meta.url);function UB(){for(let t of["../package.json","../../package.json"])try{return $B(t).version}catch{}return"0.0.0"}var MP=UB();var FB=new Set(["thread.user_response","tool.approval.response"]);var Oa=class{running=!1;startedAt=Date.now();packageVersion=MP;rpcContract=new $n;rpcIds=new Map;rpcDeadlineTimers=new Map;activeTurn=null;turnDone=Promise.resolve();verbose;transport;runtimeServices;runtimeSession=new na;agent=null;lastLlmConfigKey="";currentSessionId="";currentTurnId="";currentTransport=null;currentApiKey="";currentModel="";currentProvider="";currentBaseUrl="";sessionState=null;currentMediaApiKeys=null;taskStore=new Qo;memoryPrefetchState=kt();lastUserMessageForAutoExtract;lastAssistantMessageForExtract;memdir=null;projectMemoryStoreFactory=Sw();pendingAskUser=new Map;sessionTaskDomain;multiAgentHandlerHost;acpServer=null;sessionHistory=new aa;idleDreamCoordinator;petConfirmCoordinator;modelRegistryHydration=null;get registry(){return this.runtimeServices.providerRegistry}get mediaClient(){return this.runtimeServices.mediaClient}get mediaPersistence(){return this.runtimeServices.mediaPersistence}get pathService(){return this.runtimeServices.pathService}get toolCatalog(){return this.runtimeServices.toolCatalog}get petRuntime(){return this.runtimeServices.petRuntime}get currentHooks(){return this.runtimeSession.currentHooks}get permissionChecker(){return this.runtimeSession.permissionChecker}set permissionChecker(e){this.runtimeSession.permissionChecker=e}set mcpManager(e){this.runtimeSession.mcpManager=e}get memoryProvider(){return this.runtimeSession.memoryProvider}set memoryProvider(e){this.runtimeSession.memoryProvider=e}get memoryDreamProvider(){return this.runtimeSession.memoryDreamProvider}set memoryDreamProvider(e){this.runtimeSession.memoryDreamProvider=e}get memoryUserId(){return this.runtimeSession.memoryUserId}set memoryUserId(e){this.runtimeSession.memoryUserId=e}constructor(e){this.verbose=e.verbose,this.runtimeServices=Zw({verbose:e.verbose,getActiveProjectRoot:()=>this.getActiveProjectRoot(),resolveClientForPurpose:r=>this.resolveClientForPurpose(r),log:r=>this.log(r),sendNotification:(r,n)=>this.sendNotification(r,n)}),this.petConfirmCoordinator=new la({getPermissionResolver:()=>this.permissionChecker,sendNotification:(r,n)=>this.sendNotification(r,n)}),this.multiAgentHandlerHost=lw({getActiveProjectRoot:()=>this.getActiveProjectRoot(),emitAgentStatus:(r,n,o)=>this.emitAgentStatus(r,n,o),handleMcpToolCall:(r,n,o)=>this.handleMcpToolCall(r,n,o),log:r=>this.log(r),sendNotification:(r,n)=>this.sendNotification(r,n),sendResponse:(r,n,o)=>this.sendResponse(r,n,o)}),this.idleDreamCoordinator=new ca({log:r=>this.log(r),sendNotification:(r,n)=>this.sendNotification(r,n),getCurrentSessionId:()=>this.currentSessionId,getCurrentTurnCount:()=>this.sessionState?.turnCount??0,getActiveTurn:()=>this.activeTurn,resolveDreamClient:()=>this.resolveClientForPurpose("textGeneration"),resolveMemoryRoot:()=>Ip.join(this.pathService.getProjectAgentDir(this.getActiveProjectRoot()),"memory"),resolveTranscriptDir:()=>this.pathService.getProjectSessionsRoot(this.getActiveProjectRoot()),listRecentSessions:()=>Rt(20,this.getActiveProjectRoot()),runDream:r=>sn.call(this.createDreamHandlerHost(),r)}),D().onChange(()=>{this.lastLlmConfigKey=""}),this.ensureModelRegistryHydrated().catch(()=>{}),this.idleDreamCoordinator.applyEnvOverrides(process.env),this.transport=e.transport??new Gr({verbose:e.verbose}),this.taskStore.onTaskChange((r,n)=>{n&&this.sendNotification("task.updated",{taskId:r,type:n.type,lifecycle:n.lifecycle,label:n.label})})}getActiveProjectRoot(){return this.pathService.getActiveProjectRoot()}async ensureModelRegistryHydrated(){return this.modelRegistryHydration||(this.modelRegistryHydration=(async()=>{let e=D();e.load(),await jn(e),e.save()})().catch(e=>{this.modelRegistryHydration=null;let r=e instanceof Error?e.message:String(e);throw this.log(`[model-registry] failed to refresh llmrouter catalog: ${r}`),e})),this.modelRegistryHydration}syncToolListMediaConfig(){this.configureTurnMedia(void 0,this.currentTurnId||"tools-list")}configureTurnMedia(e,r){let n=this;this.runtimeServices.configureTurnMedia({host:{get currentMediaApiKeys(){return n.currentMediaApiKeys},set currentMediaApiKeys(o){n.currentMediaApiKeys=o},get sessionState(){return n.sessionState},sendNotification:(o,s)=>this.sendNotification(o,s)},config:e,turnId:r})}setActiveWorkdir(e){this.pathService.setActiveWorkdir(e)}start(){this.running=!0,this.log("qlogicagent started, waiting for JSON-RPC messages..."),this.transport.onMessage(e=>{if(this.acpServer){if(Uc(e)||Fn(e)){this.acpServer.dispatchMessage(e);return}if(Un(e)){let r=e.method;if(r==="initialize"||r.startsWith("session/")||r.startsWith("x/")||r.startsWith("fs/")){this.acpServer.dispatchMessage(e);return}}}if(!jc(e)){this.log("[warn] ignoring non-request message");return}this.handleMessage(e)}),this.transport.onClose(()=>{this.log("transport closed, shutting down"),this.stop()}),this.transport.start()}async stop(){if(this.running){this.running=!1,this.cancelIdleDreamTimer();for(let e of this.rpcDeadlineTimers.values())clearTimeout(e);this.rpcDeadlineTimers.clear(),this.rpcIds.clear(),this.currentSessionId&&this.currentHooks&&(this.currentHooks.invoke("stop",{sessionId:this.currentSessionId,reason:"shutdown"}).catch(()=>{}),this.currentHooks.invoke("session.ended",{sessionId:this.currentSessionId}).catch(()=>{}));try{await hm(),this.runtimeSession.stopFileWatcher(),await this.runtimeSession.disconnectMcp(),this.runtimeSession.unregisterPermissions(),this.closeMemoryProviders(),this.activeTurn&&(this.activeTurn.abort(),this.activeTurn=null),this.transport.close()}catch(e){this.currentSessionId&&this.currentHooks&&this.currentHooks.invoke("stop.failed",{sessionId:this.currentSessionId,reason:"cleanup_error",error:e.message}).catch(()=>{})}this.log("stopped")}}methodHandlers=CT(this);handleMessage(e){if(e.id!==void 0&&!FB.has(e.method)){let n=ss(e);if(!n.ok){this.sendContractError(e.id,n.error);return}let o=this.rpcContract.begin(e.method,n.meta);if(o.status==="rejected"){this.sendContractError(e.id,o.error);return}if(o.status==="deduped"){this.sendContractErrorOrResult(e.id,o.result,o.error);return}this.rpcIds.set(e.id,n.meta),this.scheduleRpcDeadline(e.id,e.method,n.meta)}let r=this.methodHandlers.get(e.method);r?r(e):e.id!==void 0&&this.sendResponse(e.id,void 0,{code:y.METHOD_NOT_FOUND,message:`Unknown method: ${e.method}`})}ensureDefaultProject(){this.memdir=hw({pathService:this.pathService,projectMemoryStoreFactory:this.projectMemoryStoreFactory,sendNotification:(e,r)=>this.sendNotification(e,r)})}resolveClientForPurpose(e){return uw({purpose:e,providerRegistry:this.registry,currentProvider:this.currentProvider,currentTransport:this.currentTransport})}ensureMemoryProvider(){if(this.memoryProvider)return;let e=this.runtimeServices.ensureMemoryProvider(this.memoryUserId);this.runtimeSession.memoryProvider=e.handlerProvider,this.runtimeSession.memoryDreamProvider=e.dreamProvider,this.runtimeSession.memoryUserId=e.userId}resolveAgent(e){let r=dw(e,l=>this.log(l));if(!r)return null;let{provider:n,model:o,apiKey:s,baseUrl:i,configKey:a}=r;if(this.agent&&this.lastLlmConfigKey===a)return e.model=o,e.provider=n,e.apiKey=s,i&&(e.baseUrl=i),this.agent;e.model=o,e.provider=n,e.apiKey=s,i&&(e.baseUrl=i);let c=EP({config:e,taskStore:this.taskStore,sessionId:this.currentSessionId??"",getTurnId:()=>this.currentTurnId,projectRoot:this.getActiveProjectRoot(),pathService:this.pathService,memdir:this.memdir,currentUserId:this.memoryUserId,memoryPrefetchState:this.memoryPrefetchState,getLastUserMessage:()=>this.lastUserMessageForAutoExtract,getLastAssistantMessage:()=>this.lastAssistantMessageForExtract,resolveSmallModelClient:()=>this.resolveClientForPurpose("smallModel"),resolvedTextConfig:r,verbose:this.verbose,providerRegistry:this.registry,mediaPersistence:this.mediaPersistence,toolCatalog:this.toolCatalog,runtimeSession:this.runtimeSession,setMcpManager:l=>{this.runtimeSession.mcpManager=l},setMcpReady:l=>{this.runtimeSession.mcpReady=l},setPluginLoader:l=>{this.runtimeSession.pluginLoader=l},getAgent:()=>this.agent,getAcpPermissionSession:()=>this.acpServer?.sessionId?{sessionId:this.acpServer.sessionId,requestPermission:l=>this.acpServer.requestPermission(l)}:void 0,sendNotification:(l,d)=>this.sendNotification(l,d),isPetActive:()=>this.petRuntime.isActive(),coreToolHost:{getAgent:()=>this.agent,getCurrentTransport:()=>this.currentTransport,getCurrentApiKey:()=>this.currentApiKey,getCurrentModel:()=>this.currentModel,getCurrentSessionId:()=>this.currentSessionId,getActiveProjectRoot:()=>this.getActiveProjectRoot(),getVerbose:()=>this.verbose,sendNotification:(l,d)=>this.sendNotification(l,d),emitAgentStatus:(l,d,p)=>this.emitAgentStatus(l,d,p),handleMcpToolCall:(l,d,p)=>this.handleMcpToolCall(l,d,p)},setFileWatcher:l=>{this.runtimeSession.fileWatcher=l},log:l=>this.log(l)});return this.agent=c.agent,this.lastLlmConfigKey=a,this.currentTransport=c.agentClient.transport,this.currentApiKey=c.agentClient.apiKey,this.currentModel=c.agentClient.model,this.currentProvider=c.agentClient.provider,this.currentBaseUrl=c.agentClient.baseUrl,this.log(`created Agent (provider: ${n}, model: ${o})`),this.agent}emitAgentStatus(e,r,n){this.sendNotification("agents.status",mw(e,r,n))}createDreamHandlerHost(){return gw({getActiveTurn:()=>this.activeTurn,setActiveTurn:e=>{this.activeTurn=e},getCurrentTransport:()=>this.currentTransport,getCurrentApiKey:()=>this.currentApiKey,getCurrentModel:()=>this.currentModel,getCurrentHooks:()=>this.currentHooks,getMemoryProvider:()=>this.memoryDreamProvider,getMemoryUserId:()=>this.memoryUserId,getToolCatalog:()=>this.runtimeServices.toolCatalog,getVerbose:()=>this.verbose,log:e=>this.log(e),resolveMemoryRoot:()=>Ip.join(this.pathService.getProjectAgentDir(this.getActiveProjectRoot()),"memory"),resolveTranscriptDir:()=>this.pathService.getProjectSessionsRoot(this.getActiveProjectRoot()),resolveAgent:e=>this.resolveAgent(e),sendNotification:(e,r)=>this.sendNotification(e,r),sendResponse:(e,r,n)=>this.sendResponse(e,r,n)})}createAcpExtendedHandlerHost(){return yw({dreamHost:this.createDreamHandlerHost(),multiAgentHost:this.multiAgentHandlerHost,getCurrentSessionId:()=>this.currentSessionId,getActiveProjectRoot:()=>this.getActiveProjectRoot(),log:e=>this.log(e),resolveAgent:e=>this.resolveAgent(e),sendNotification:(e,r)=>this.sendNotification(e,r),sendResponse:(e,r,n)=>this.sendResponse(e,r,n),emitAgentStatus:(e,r,n)=>this.emitAgentStatus(e,r,n),handleMcpToolCall:(e,r,n)=>this.handleMcpToolCall(e,r,n),resolveClientForPurpose:e=>this.resolveClientForPurpose(e)})}async handleMcpToolCall(e,r,n){return pw({toolCatalog:this.toolCatalog,memberId:e,toolName:r,args:n})}sendResponse(e,r,n){let o=this.rpcIds.get(e);if(o){let i=this.rpcContract.settle(o.requestId,r,n);if(this.clearRpcLifecycle(e),!i.accepted){this.log(`[rpc] dropped late response id=${String(e)} requestId=${o.requestId} reason=${i.reason}`);return}}let s={jsonrpc:"2.0",id:e};n?s.error=n:s.result=r,this.writeStdout(s)}sendContractError(e,r){let n={jsonrpc:"2.0",id:e,error:r};this.writeStdout(n)}sendContractErrorOrResult(e,r,n){if(n){this.sendContractError(e,n);return}let o={jsonrpc:"2.0",id:e,result:r};this.writeStdout(o)}scheduleRpcDeadline(e,r,n){let o=Math.max(0,n.deadlineAt-Date.now()),s=setTimeout(()=>{if(!this.rpcIds.has(e))return;let i=this.rpcContract.expire(n.requestId);this.clearRpcLifecycle(e),i&&(this.log(`[rpc] deadline exceeded method=${r} id=${String(e)} requestId=${n.requestId}`),this.writeStdout({jsonrpc:"2.0",id:e,error:{code:y.REQUEST_DEADLINE_EXCEEDED,message:`RPC request deadline exceeded: ${r}.`}}))},o);s.unref?.(),this.rpcDeadlineTimers.set(e,s)}clearRpcLifecycle(e){let r=this.rpcDeadlineTimers.get(e);r&&clearTimeout(r),this.rpcDeadlineTimers.delete(e),this.rpcIds.delete(e)}sendNotification(e,r){if(this.acpServer&&this.acpServer.sessionId)Lm(this.acpServer,this.acpServer.sessionId,e,r);else{let n={jsonrpc:"2.0",method:e,params:r};this.writeStdout(n)}this.idleDreamCoordinator.handleTurnNotification(e)}writeStdout(e){this.transport.send(e)}log(e){this.verbose&&process.stderr.write(`${JSON.stringify({ts:new Date().toISOString(),level:"info",service:"qlogicagent",message:e})}
1136
- `)}enableIdleDream(e){this.idleDreamCoordinator.enable(e)}cancelIdleDreamTimer(){this.idleDreamCoordinator.cancelTimer()}disposeSessionRuntime(){this.runtimeSession.unregisterPermissions(),this.closeMemoryProviders(),this.agent=null,this.lastLlmConfigKey="",this.memoryPrefetchState=kt(),this.runtimeSession.resetAfterSessionDispose()}closeMemoryProviders(){this.runtimeServices.closeMemoryProviders({memoryProvider:this.memoryProvider,memoryDreamProvider:this.memoryDreamProvider}),this.runtimeSession.resetMemoryProviders()}initAcpServer(){let e=ow(this,MP,this.createAcpExtendedHandlerHost());this.acpServer=new as(this.transport,e,{verbose:this.verbose})}getAcpServer(){return this.acpServer}};function _P(t){let e={verbose:!1};for(let r of t.slice(2))(r==="--verbose"||r==="-v")&&(e.verbose=!0);return e}import{writeFileSync as HB,appendFileSync as NP,mkdirSync as BB}from"node:fs";import{join as Ep}from"node:path";import{homedir as qB}from"node:os";var LP=Ep(process.env.QLOGICAGENT_HOME||Ep(qB(),".qlogicagent"),"debug-logs");try{BB(LP,{recursive:!0})}catch{}var Mp=Ep(LP,"acp-session.log");try{HB(Mp,"")}catch{}function ot(t){let e=`[${new Date().toISOString()}] ${t}
1137
- `;OP.call(process.stderr,e);try{NP(Mp,e)}catch{}}var OP=process.stderr.write.bind(process.stderr);process.stderr.write=((t,...e)=>{let r=typeof t=="string"?t:Buffer.from(t).toString();try{NP(Mp,r)}catch{}return OP(t,...e)});ot(`PID=${process.pid} argv=${JSON.stringify(process.argv.slice(1))} cwd=${process.cwd()} HOME=${process.env.QLOGICAGENT_HOME??"(unset)"} NODE=${process.version}`);var jP=_P(process.argv),WB=!process.argv.includes("--no-acp"),GB=new Gr({verbose:jP.verbose}),_p=new Oa({verbose:jP.verbose,transport:GB});WB&&(_p.initAcpServer(),ot("ACP server initialized, waiting for messages"));process.on("unhandledRejection",t=>{ot(`unhandledRejection: ${t instanceof Error?t.stack??t.message:String(t)}`)});process.on("uncaughtException",t=>{ot(`uncaughtException: ${t.stack??t.message}`)});process.stdin.on("end",()=>{ot("stdin END received")});process.stdin.on("close",()=>{ot("stdin CLOSE received")});process.stdout.on("error",t=>{ot(`stdout ERROR: ${t.message}`)});process.stdout.on("close",()=>{ot("stdout CLOSE")});process.on("exit",t=>{ot(`process.exit code=${t}`)});var DP=!1;async function $P(t){if(!DP){DP=!0,ot(`${t} received`);try{await _p.stop()}finally{process.exit(0)}}}process.on("SIGTERM",()=>{$P("SIGTERM")});process.on("SIGINT",()=>{$P("SIGINT")});process.on("SIGHUP",()=>{ot("SIGHUP received")});ot("calling server.start()");_p.start();ot("server.start() returned, event loop active");
1134
+ `).slice(0,3).join(" ").slice(0,200),T=a?Re.basename(a):"unknown";b.ingestExtracted([{text:`Learned skill "${i.name}" in project "${T}": ${S}`,category:"skill-learning"}],v).catch(()=>{})}let R=a?` (project-scoped). To make it available across all projects, use: skill promote name:"${i.name}"`:"";return{success:!0,message:`Skill "${i.name}" created${R}`,path:l}}case"edit":{let u=ue(p);if(u.records[i.name]?.pinned)return{success:!1,message:`Skill "${i.name}" is pinned. Unpin it first.`};let m=i.content??"",g=sd(m,i.name)??m;return await le.promises.writeFile(d,g,"utf8"),rd(u,i.name),he(p,u),t.sendNotification("turn.skill_instruction",{turnId:`skill-edit-${Date.now()}`,instruction:{name:i.name,category:i.category??"learned",content:g,scope:"project"}}),{success:!0,message:`Skill "${i.name}" updated`,path:d}}case"patch":{let u=ue(p);if(u.records[i.name]?.pinned)return{success:!1,message:`Skill "${i.name}" is pinned. Unpin it first.`};let m=await le.promises.readFile(d,"utf8");if(!i.oldString||!m.includes(i.oldString))return{success:!1,message:"oldString not found in SKILL.md"};let f=m.replace(i.oldString,i.newString??"");return await le.promises.writeFile(d,f,"utf8"),rd(u,i.name),he(p,u),t.sendNotification("turn.skill_instruction",{turnId:`skill-patch-${Date.now()}`,instruction:{name:i.name,category:i.category??"learned",content:f,scope:"project"}}),{success:!0,message:`Skill "${i.name}" patched`,path:d}}case"delete":{let u=ue(p);return u.records[i.name]?.pinned?{success:!1,message:`Skill "${i.name}" is pinned. Unpin it first.`}:(await le.promises.rm(l,{recursive:!0,force:!0}),$s(u,i.name),he(p,u),t.sendNotification("turn.skill_instruction",{turnId:`skill-delete-${Date.now()}`,instruction:{name:i.name,category:i.category??"learned",action:"delete",scope:"project"}}),gt(),{success:!0,message:`Skill "${i.name}" deleted`})}default:return{success:!1,message:`Unknown action: ${i.action}`}}},promoteSkill:async i=>{let a=n.getProjectSkillsDir(t.getActiveProjectRoot()),c=Re.join(a,i,"SKILL.md");try{await le.promises.access(c)}catch{return{success:!1,message:`Skill "${i}" not found in project skills. Cannot promote.`}}let l=n.getUserSkillsDir(),d=Re.join(l,i);await le.promises.mkdir(d,{recursive:!0});let p=Re.join(a,i),u=await le.promises.readdir(p);for(let m of u){let f=await le.promises.readFile(Re.join(p,m));await le.promises.writeFile(Re.join(d,m),f)}return t.sendNotification("turn.skill_instruction",{turnId:`skill-promote-${Date.now()}`,instruction:{name:i,category:"promoted",content:await le.promises.readFile(c,"utf8"),scope:"global"}}),await le.promises.rm(p,{recursive:!0,force:!0}),t.sendNotification("turn.skill_instruction",{turnId:`skill-promote-cleanup-${Date.now()}`,instruction:{name:i,category:"learned",action:"delete",scope:"project"}}),gt(),{success:!0,message:`Skill "${i}" promoted to global (user-level) and removed from project scope. It will now be available across all projects.`,path:d}}}))}function AP(t){let e=lP({log:t.log,taskStore:t.taskStore,sessionId:t.sessionId,projectRoot:t.projectRoot,memdir:t.memdir,toolCatalog:t.toolCatalog,currentUserId:t.currentUserId,prefetchState:t.memoryPrefetchState,getLastUserMessage:t.getLastUserMessage,getLastAssistantMessage:t.getLastAssistantMessage,resolveSmallModelClient:t.resolveSmallModelClient,compressionClient:{transport:t.agentClient.transport,apiKey:t.agentClient.apiKey}}),r=e.hooks;XA({config:t.config,projectRoot:t.projectRoot,pathService:t.pathService,log:t.log,toolCatalog:t.toolCatalog,currentManager:t.currentMcpManager,setManager:t.setMcpManager,setReady:t.setMcpReady}),tP({config:t.config,hooks:r,log:t.log,pathService:t.pathService,toolCatalog:t.toolCatalog,setPluginLoader:t.setPluginLoader});let n=sP({config:t.config,toolCatalog:t.toolCatalog,hooks:r,log:t.log,sessionId:t.sessionId,getTurnId:t.getTurnId,getActiveProjectRoot:()=>t.projectRoot,getAcpPermissionSession:t.getAcpPermissionSession,sendNotification:t.sendNotification,isPetActive:t.isPetActive,currentUnregister:t.currentPermissionUnregister});return wP({getActiveProjectRoot:()=>t.projectRoot,getPluginSkills:t.getPluginSkills,getAgent:t.getAgent,getCurrentSessionId:()=>t.sessionId,getCurrentHooks:()=>r,sendNotification:t.sendNotification,getMemoryLearningSink:()=>e.memoryLearningSink,getMemoryUserId:()=>e.memoryUserId},{config:t.config,pathService:t.pathService,toolCatalog:t.toolCatalog}),_A({config:t.config,host:t.coreToolHost,hooks:r,log:t.log,toolCatalog:t.toolCatalog,toolInvoker:t.toolInvoker}),HA({config:t.config,pathService:t.pathService,toolCatalog:t.toolCatalog}),t.sessionId&&r.invoke("session.created",{sessionId:t.sessionId}).catch(()=>{}),mP({config:t.config,hooks:r,ruleEngine:n.ruleEngine,sessionId:t.sessionId,currentFileWatcher:t.currentFileWatcher,log:t.log,setFileWatcher:t.setFileWatcher}),{hooks:r,memoryHandlerProvider:e.memoryHandlerProvider,memoryDreamProvider:e.memoryDreamProvider,memoryUserId:e.memoryUserId,permissionChecker:n.permissionChecker,permissionUnregister:n.permissionUnregister,ruleEngine:n.ruleEngine}}function PP(t){let{provider:e,model:r,apiKey:n,baseUrl:o}=t.resolvedConfig,s=ei({provider:e,model:r,apiKey:n,baseUrl:o},t.providerRegistry);return s.transport=bv(s.transport,t.sessionId||"default"),{transport:s.transport,apiKey:n,model:r,provider:e,baseUrl:o??""}}function xP(t){return{agent:new nn({llmTransport:t.client.transport,apiKey:t.client.apiKey,toolInvoker:t.toolInvoker,log:t.log,hooks:t.hooks,maxRounds:t.maxRounds,verbose:t.verbose,projectRoot:t.projectRoot,runtimePorts:Rs()}),...t.client}}import{randomUUID as jB}from"node:crypto";async function CP(t){let e=[],r=t.result.content.map(l=>{if(l.type==="image"&&l.data){let d=l.mimeType||"image/png";return e.push(`data:${d};base64,${l.data}`),"[Image]"}return l.text??""}).join(`
1135
+ `),n=e.length>0?[...e,...t.result.imageUrls??[]]:t.result.imageUrls,o=t.result.details?.error,s=o?r:void 0,i=t.result.details?.type,a=i?.split("_")[0];if(i==="three_d_generate"&&(a="3d"),a&&["image","tts","video","music","3d"].includes(a)){let l=t.result.details?.mediaUrls??[],d=a;for(let p of l)t.sendNotification("turn.media_result",{turnId:t.turnId,mediaType:d,url:p,model:t.result.details?.model,provider:t.result.details?.provider,...t.result.details?.durationMs?{durationSeconds:t.result.details.durationMs/1e3}:{},...t.result.details?.taskId?{taskId:t.result.details.taskId}:{}});if(l.length>0)try{let p=await t.mediaPersistence.downloadAll(l,{type:a,sessionId:t.sessionId||void 0},{warn:u=>t.log(u)});if(p.length>0){for(let u of p)r=r.replaceAll(u.remoteUrl,u.localPath);t.sendNotification("turn.media_persisted",{turnId:t.turnId,files:p.map(u=>({remoteUrl:u.remoteUrl,localPath:u.localPath,bytes:u.bytes,mimeType:u.mimeType}))})}}catch{}}if(i==="task"&&!o&&t.result.details?.taskList)try{let l=t.result.details;l?.taskList&&t.sendNotification("turn.todos_updated",{turnId:t.turnId,items:l.taskList,summary:{total:l.total??l.taskList.length,completed:l.completed??0,inProgress:l.inProgress??0,notStarted:l.notStarted??0}})}catch{}let c=Array.isArray(t.result.details?.matches)?t.result.details.matches:void 0;return{result:r,error:s,toolReferences:c,imageUrls:n,details:t.result.details}}function IP(t){return{invoke:async(e,r,n,o)=>{if(r.startsWith("$"))return{result:n};let s=t.toolCatalog.findTool(r);if(!s)return{result:"",error:`Unknown tool: ${r}`};if(typeof s.execute!="function")return{result:"",error:`Tool is not executable: ${r}`};let i=`tc_${jB().slice(0,8)}`;try{let a=JSON.parse(n),c=await s.execute(i,a,o);return await CP({turnId:e,sessionId:t.getSessionId(),result:c,mediaPersistence:t.mediaPersistence,log:t.log,sendNotification:(l,d)=>t.sendNotification(l,d)})}catch(a){return{result:"",error:a instanceof Error?a.message:String(a)}}}}}function EP(t){let e={info:i=>t.log(i),warn:i=>t.log(`[warn] ${i}`),error:i=>t.log(`[error] ${i}`),debug:i=>{t.verbose&&t.log(`[debug] ${i}`)}},r=IP({mediaPersistence:t.mediaPersistence,toolCatalog:t.toolCatalog,getSessionId:()=>t.sessionId,log:i=>t.log(i),sendNotification:t.sendNotification}),n=PP({resolvedConfig:t.resolvedTextConfig,providerRegistry:t.providerRegistry,sessionId:t.sessionId}),o=AP({config:t.config,log:e,taskStore:t.taskStore,sessionId:t.sessionId,getTurnId:t.getTurnId,projectRoot:t.projectRoot,pathService:t.pathService,memdir:t.memdir,currentUserId:t.currentUserId,memoryPrefetchState:t.memoryPrefetchState,getLastUserMessage:t.getLastUserMessage,getLastAssistantMessage:t.getLastAssistantMessage,resolveSmallModelClient:t.resolveSmallModelClient,agentClient:n,toolCatalog:t.toolCatalog,currentMcpManager:t.runtimeSession.mcpManager,setMcpManager:t.setMcpManager,setMcpReady:t.setMcpReady,setPluginLoader:t.setPluginLoader,getPluginSkills:()=>t.runtimeSession.getPluginSkills(),getAgent:t.getAgent,getAcpPermissionSession:t.getAcpPermissionSession,sendNotification:t.sendNotification,isPetActive:t.isPetActive,currentPermissionUnregister:t.runtimeSession.permissionUnregister,coreToolHost:t.coreToolHost,toolInvoker:r,currentFileWatcher:t.runtimeSession.fileWatcher,setFileWatcher:t.setFileWatcher});return t.runtimeSession.applyBootstrap(o),{agent:xP({client:n,toolInvoker:r,log:e,hooks:o.hooks,maxRounds:t.config.maxRounds,verbose:t.verbose,projectRoot:t.projectRoot}).agent,agentClient:n,toolInvoker:r,hooks:o.hooks}}var UB=$B(import.meta.url);function FB(){for(let t of["../package.json","../../package.json"])try{return UB(t).version}catch{}return"0.0.0"}var MP=FB();var HB=new Set(["thread.user_response","tool.approval.response"]);var Oa=class{running=!1;startedAt=Date.now();packageVersion=MP;rpcContract=new $n;rpcIds=new Map;rpcDeadlineTimers=new Map;activeTurn=null;turnDone=Promise.resolve();verbose;transport;runtimeServices;runtimeSession=new na;agent=null;lastLlmConfigKey="";currentSessionId="";currentTurnId="";currentTransport=null;currentApiKey="";currentModel="";currentProvider="";currentBaseUrl="";sessionState=null;currentMediaApiKeys=null;taskStore=new Qo;memoryPrefetchState=kt();lastUserMessageForAutoExtract;lastAssistantMessageForExtract;memdir=null;projectMemoryStoreFactory=Sw();pendingAskUser=new Map;sessionTaskDomain;multiAgentHandlerHost;acpServer=null;sessionHistory=new aa;idleDreamCoordinator;petConfirmCoordinator;modelRegistryHydration=null;get registry(){return this.runtimeServices.providerRegistry}get mediaClient(){return this.runtimeServices.mediaClient}get mediaPersistence(){return this.runtimeServices.mediaPersistence}get pathService(){return this.runtimeServices.pathService}get toolCatalog(){return this.runtimeServices.toolCatalog}get petRuntime(){return this.runtimeServices.petRuntime}get currentHooks(){return this.runtimeSession.currentHooks}get permissionChecker(){return this.runtimeSession.permissionChecker}set permissionChecker(e){this.runtimeSession.permissionChecker=e}set mcpManager(e){this.runtimeSession.mcpManager=e}get memoryProvider(){return this.runtimeSession.memoryProvider}set memoryProvider(e){this.runtimeSession.memoryProvider=e}get memoryDreamProvider(){return this.runtimeSession.memoryDreamProvider}set memoryDreamProvider(e){this.runtimeSession.memoryDreamProvider=e}get memoryUserId(){return this.runtimeSession.memoryUserId}set memoryUserId(e){this.runtimeSession.memoryUserId=e}constructor(e){this.verbose=e.verbose,this.runtimeServices=Zw({verbose:e.verbose,getActiveProjectRoot:()=>this.getActiveProjectRoot(),resolveClientForPurpose:r=>this.resolveClientForPurpose(r),log:r=>this.log(r),sendNotification:(r,n)=>this.sendNotification(r,n)}),this.petConfirmCoordinator=new la({getPermissionResolver:()=>this.permissionChecker,sendNotification:(r,n)=>this.sendNotification(r,n)}),this.multiAgentHandlerHost=lw({getActiveProjectRoot:()=>this.getActiveProjectRoot(),emitAgentStatus:(r,n,o)=>this.emitAgentStatus(r,n,o),handleMcpToolCall:(r,n,o)=>this.handleMcpToolCall(r,n,o),log:r=>this.log(r),sendNotification:(r,n)=>this.sendNotification(r,n),sendResponse:(r,n,o)=>this.sendResponse(r,n,o)}),this.idleDreamCoordinator=new ca({log:r=>this.log(r),sendNotification:(r,n)=>this.sendNotification(r,n),getCurrentSessionId:()=>this.currentSessionId,getCurrentTurnCount:()=>this.sessionState?.turnCount??0,getActiveTurn:()=>this.activeTurn,resolveDreamClient:()=>this.resolveClientForPurpose("textGeneration"),resolveMemoryRoot:()=>Ip.join(this.pathService.getProjectAgentDir(this.getActiveProjectRoot()),"memory"),resolveTranscriptDir:()=>this.pathService.getProjectSessionsRoot(this.getActiveProjectRoot()),listRecentSessions:()=>Rt(20,this.getActiveProjectRoot()),runDream:r=>sn.call(this.createDreamHandlerHost(),r)}),D().onChange(()=>{this.lastLlmConfigKey=""}),this.ensureModelRegistryHydrated().catch(()=>{}),this.idleDreamCoordinator.applyEnvOverrides(process.env),this.transport=e.transport??new Gr({verbose:e.verbose}),this.taskStore.onTaskChange((r,n)=>{n&&this.sendNotification("task.updated",{taskId:r,type:n.type,lifecycle:n.lifecycle,label:n.label})})}getActiveProjectRoot(){return this.pathService.getActiveProjectRoot()}async ensureModelRegistryHydrated(){return this.modelRegistryHydration||(this.modelRegistryHydration=(async()=>{let e=D();e.load(),await jn(e),e.save()})().catch(e=>{this.modelRegistryHydration=null;let r=e instanceof Error?e.message:String(e);throw this.log(`[model-registry] failed to refresh llmrouter catalog: ${r}`),e})),this.modelRegistryHydration}syncToolListMediaConfig(){this.configureTurnMedia(void 0,this.currentTurnId||"tools-list")}configureTurnMedia(e,r){let n=this;this.runtimeServices.configureTurnMedia({host:{get currentMediaApiKeys(){return n.currentMediaApiKeys},set currentMediaApiKeys(o){n.currentMediaApiKeys=o},get sessionState(){return n.sessionState},sendNotification:(o,s)=>this.sendNotification(o,s)},config:e,turnId:r})}setActiveWorkdir(e){this.pathService.setActiveWorkdir(e)}start(){this.running=!0,this.log("qlogicagent started, waiting for JSON-RPC messages..."),this.transport.onMessage(e=>{if(this.acpServer){if(Uc(e)||Fn(e)){this.acpServer.dispatchMessage(e);return}if(Un(e)){let r=e.method;if(r==="initialize"||r.startsWith("session/")||r.startsWith("x/")||r.startsWith("fs/")){this.acpServer.dispatchMessage(e);return}}}if(!jc(e)){this.log("[warn] ignoring non-request message");return}this.handleMessage(e)}),this.transport.onClose(()=>{this.log("transport closed, shutting down"),this.stop()}),this.transport.start()}async stop(){if(this.running){this.running=!1,this.cancelIdleDreamTimer();for(let e of this.rpcDeadlineTimers.values())clearTimeout(e);this.rpcDeadlineTimers.clear(),this.rpcIds.clear(),this.currentSessionId&&this.currentHooks&&(this.currentHooks.invoke("stop",{sessionId:this.currentSessionId,reason:"shutdown"}).catch(()=>{}),this.currentHooks.invoke("session.ended",{sessionId:this.currentSessionId}).catch(()=>{}));try{await hm(),this.runtimeSession.stopFileWatcher(),await this.runtimeSession.disconnectMcp(),this.runtimeSession.unregisterPermissions(),this.closeMemoryProviders(),this.activeTurn&&(this.activeTurn.abort(),this.activeTurn=null),this.transport.close()}catch(e){this.currentSessionId&&this.currentHooks&&this.currentHooks.invoke("stop.failed",{sessionId:this.currentSessionId,reason:"cleanup_error",error:e.message}).catch(()=>{})}this.log("stopped")}}methodHandlers=CT(this);handleMessage(e){if(e.id!==void 0&&!HB.has(e.method)){let n=ss(e);if(!n.ok){this.sendContractError(e.id,n.error);return}let o=this.rpcContract.begin(e.method,n.meta);if(o.status==="rejected"){this.sendContractError(e.id,o.error);return}if(o.status==="deduped"){this.sendContractErrorOrResult(e.id,o.result,o.error);return}this.rpcIds.set(e.id,n.meta),this.scheduleRpcDeadline(e.id,e.method,n.meta)}let r=this.methodHandlers.get(e.method);r?r(e):e.id!==void 0&&this.sendResponse(e.id,void 0,{code:y.METHOD_NOT_FOUND,message:`Unknown method: ${e.method}`})}ensureDefaultProject(){this.memdir=hw({pathService:this.pathService,projectMemoryStoreFactory:this.projectMemoryStoreFactory,sendNotification:(e,r)=>this.sendNotification(e,r)})}resolveClientForPurpose(e){return uw({purpose:e,providerRegistry:this.registry,currentProvider:this.currentProvider,currentTransport:this.currentTransport})}ensureMemoryProvider(){if(this.memoryProvider)return;let e=this.runtimeServices.ensureMemoryProvider(this.memoryUserId);this.runtimeSession.memoryProvider=e.handlerProvider,this.runtimeSession.memoryDreamProvider=e.dreamProvider,this.runtimeSession.memoryUserId=e.userId}resolveAgent(e){let r=dw(e,l=>this.log(l));if(!r)return null;let{provider:n,model:o,apiKey:s,baseUrl:i,configKey:a}=r;if(this.agent&&this.lastLlmConfigKey===a)return e.model=o,e.provider=n,e.apiKey=s,i&&(e.baseUrl=i),this.agent;e.model=o,e.provider=n,e.apiKey=s,i&&(e.baseUrl=i);let c=EP({config:e,taskStore:this.taskStore,sessionId:this.currentSessionId??"",getTurnId:()=>this.currentTurnId,projectRoot:this.getActiveProjectRoot(),pathService:this.pathService,memdir:this.memdir,currentUserId:this.memoryUserId,memoryPrefetchState:this.memoryPrefetchState,getLastUserMessage:()=>this.lastUserMessageForAutoExtract,getLastAssistantMessage:()=>this.lastAssistantMessageForExtract,resolveSmallModelClient:()=>this.resolveClientForPurpose("smallModel"),resolvedTextConfig:r,verbose:this.verbose,providerRegistry:this.registry,mediaPersistence:this.mediaPersistence,toolCatalog:this.toolCatalog,runtimeSession:this.runtimeSession,setMcpManager:l=>{this.runtimeSession.mcpManager=l},setMcpReady:l=>{this.runtimeSession.mcpReady=l},setPluginLoader:l=>{this.runtimeSession.pluginLoader=l},getAgent:()=>this.agent,getAcpPermissionSession:()=>this.acpServer?.sessionId?{sessionId:this.acpServer.sessionId,requestPermission:l=>this.acpServer.requestPermission(l)}:void 0,sendNotification:(l,d)=>this.sendNotification(l,d),isPetActive:()=>this.petRuntime.isActive(),coreToolHost:{getAgent:()=>this.agent,getCurrentTransport:()=>this.currentTransport,getCurrentApiKey:()=>this.currentApiKey,getCurrentModel:()=>this.currentModel,getCurrentSessionId:()=>this.currentSessionId,getActiveProjectRoot:()=>this.getActiveProjectRoot(),getVerbose:()=>this.verbose,sendNotification:(l,d)=>this.sendNotification(l,d),emitAgentStatus:(l,d,p)=>this.emitAgentStatus(l,d,p),handleMcpToolCall:(l,d,p)=>this.handleMcpToolCall(l,d,p)},setFileWatcher:l=>{this.runtimeSession.fileWatcher=l},log:l=>this.log(l)});return this.agent=c.agent,this.lastLlmConfigKey=a,this.currentTransport=c.agentClient.transport,this.currentApiKey=c.agentClient.apiKey,this.currentModel=c.agentClient.model,this.currentProvider=c.agentClient.provider,this.currentBaseUrl=c.agentClient.baseUrl,this.log(`created Agent (provider: ${n}, model: ${o})`),this.agent}emitAgentStatus(e,r,n){this.sendNotification("agents.status",mw(e,r,n))}createDreamHandlerHost(){return gw({getActiveTurn:()=>this.activeTurn,setActiveTurn:e=>{this.activeTurn=e},getCurrentTransport:()=>this.currentTransport,getCurrentApiKey:()=>this.currentApiKey,getCurrentModel:()=>this.currentModel,getCurrentHooks:()=>this.currentHooks,getMemoryProvider:()=>this.memoryDreamProvider,getMemoryUserId:()=>this.memoryUserId,getToolCatalog:()=>this.runtimeServices.toolCatalog,getVerbose:()=>this.verbose,log:e=>this.log(e),resolveMemoryRoot:()=>Ip.join(this.pathService.getProjectAgentDir(this.getActiveProjectRoot()),"memory"),resolveTranscriptDir:()=>this.pathService.getProjectSessionsRoot(this.getActiveProjectRoot()),resolveAgent:e=>this.resolveAgent(e),sendNotification:(e,r)=>this.sendNotification(e,r),sendResponse:(e,r,n)=>this.sendResponse(e,r,n)})}createAcpExtendedHandlerHost(){return yw({dreamHost:this.createDreamHandlerHost(),multiAgentHost:this.multiAgentHandlerHost,getCurrentSessionId:()=>this.currentSessionId,getActiveProjectRoot:()=>this.getActiveProjectRoot(),log:e=>this.log(e),resolveAgent:e=>this.resolveAgent(e),sendNotification:(e,r)=>this.sendNotification(e,r),sendResponse:(e,r,n)=>this.sendResponse(e,r,n),emitAgentStatus:(e,r,n)=>this.emitAgentStatus(e,r,n),handleMcpToolCall:(e,r,n)=>this.handleMcpToolCall(e,r,n),resolveClientForPurpose:e=>this.resolveClientForPurpose(e)})}async handleMcpToolCall(e,r,n){return pw({toolCatalog:this.toolCatalog,memberId:e,toolName:r,args:n})}sendResponse(e,r,n){let o=this.rpcIds.get(e);if(o){let i=this.rpcContract.settle(o.requestId,r,n);if(this.clearRpcLifecycle(e),!i.accepted){this.log(`[rpc] dropped late response id=${String(e)} requestId=${o.requestId} reason=${i.reason}`);return}}let s={jsonrpc:"2.0",id:e};n?s.error=n:s.result=r,this.writeStdout(s)}sendContractError(e,r){let n={jsonrpc:"2.0",id:e,error:r};this.writeStdout(n)}sendContractErrorOrResult(e,r,n){if(n){this.sendContractError(e,n);return}let o={jsonrpc:"2.0",id:e,result:r};this.writeStdout(o)}scheduleRpcDeadline(e,r,n){let o=Math.max(0,n.deadlineAt-Date.now()),s=setTimeout(()=>{if(!this.rpcIds.has(e))return;let i=this.rpcContract.expire(n.requestId);this.clearRpcLifecycle(e),i&&(this.log(`[rpc] deadline exceeded method=${r} id=${String(e)} requestId=${n.requestId}`),this.writeStdout({jsonrpc:"2.0",id:e,error:{code:y.REQUEST_DEADLINE_EXCEEDED,message:`RPC request deadline exceeded: ${r}.`}}))},o);s.unref?.(),this.rpcDeadlineTimers.set(e,s)}clearRpcLifecycle(e){let r=this.rpcDeadlineTimers.get(e);r&&clearTimeout(r),this.rpcDeadlineTimers.delete(e),this.rpcIds.delete(e)}sendNotification(e,r){if(this.acpServer&&this.acpServer.sessionId)Lm(this.acpServer,this.acpServer.sessionId,e,r);else{let n={jsonrpc:"2.0",method:e,params:r};this.writeStdout(n)}this.idleDreamCoordinator.handleTurnNotification(e)}writeStdout(e){this.transport.send(e)}log(e){this.verbose&&process.stderr.write(`${JSON.stringify({ts:new Date().toISOString(),level:"info",service:"qlogicagent",message:e})}
1136
+ `)}enableIdleDream(e){this.idleDreamCoordinator.enable(e)}cancelIdleDreamTimer(){this.idleDreamCoordinator.cancelTimer()}disposeSessionRuntime(){this.runtimeSession.unregisterPermissions(),this.closeMemoryProviders(),this.agent=null,this.lastLlmConfigKey="",this.memoryPrefetchState=kt(),this.runtimeSession.resetAfterSessionDispose()}closeMemoryProviders(){this.runtimeServices.closeMemoryProviders({memoryProvider:this.memoryProvider,memoryDreamProvider:this.memoryDreamProvider}),this.runtimeSession.resetMemoryProviders()}initAcpServer(){let e=ow(this,MP,this.createAcpExtendedHandlerHost());this.acpServer=new as(this.transport,e,{verbose:this.verbose})}getAcpServer(){return this.acpServer}};function _P(t){let e={verbose:!1};for(let r of t.slice(2))(r==="--verbose"||r==="-v")&&(e.verbose=!0);return e}import{writeFileSync as BB,appendFileSync as NP,mkdirSync as qB}from"node:fs";import{join as Ep}from"node:path";import{homedir as WB}from"node:os";var LP=Ep(process.env.QLOGICAGENT_HOME||Ep(WB(),".qlogicagent"),"debug-logs");try{qB(LP,{recursive:!0})}catch{}var Mp=Ep(LP,"acp-session.log");try{BB(Mp,"")}catch{}function ot(t){let e=`[${new Date().toISOString()}] ${t}
1137
+ `;OP.call(process.stderr,e);try{NP(Mp,e)}catch{}}var OP=process.stderr.write.bind(process.stderr);process.stderr.write=((t,...e)=>{let r=typeof t=="string"?t:Buffer.from(t).toString();try{NP(Mp,r)}catch{}return OP(t,...e)});ot(`PID=${process.pid} argv=${JSON.stringify(process.argv.slice(1))} cwd=${process.cwd()} HOME=${process.env.QLOGICAGENT_HOME??"(unset)"} NODE=${process.version}`);var jP=_P(process.argv),GB=!process.argv.includes("--no-acp"),zB=new Gr({verbose:jP.verbose}),_p=new Oa({verbose:jP.verbose,transport:zB});GB&&(_p.initAcpServer(),ot("ACP server initialized, waiting for messages"));process.on("unhandledRejection",t=>{ot(`unhandledRejection: ${t instanceof Error?t.stack??t.message:String(t)}`)});process.on("uncaughtException",t=>{ot(`uncaughtException: ${t.stack??t.message}`)});process.stdin.on("end",()=>{ot("stdin END received")});process.stdin.on("close",()=>{ot("stdin CLOSE received")});process.stdout.on("error",t=>{ot(`stdout ERROR: ${t.message}`)});process.stdout.on("close",()=>{ot("stdout CLOSE")});process.on("exit",t=>{ot(`process.exit code=${t}`)});var DP=!1;async function $P(t){if(!DP){DP=!0,ot(`${t} received`);try{await _p.stop()}finally{process.exit(0)}}}process.on("SIGTERM",()=>{$P("SIGTERM")});process.on("SIGINT",()=>{$P("SIGINT")});process.on("SIGHUP",()=>{ot("SIGHUP received")});ot("calling server.start()");_p.start();ot("server.start() returned, event loop active");