qlogicagent 2.10.45 → 2.10.46

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/index.js CHANGED
@@ -1,4 +1,4 @@
1
- var LP=Object.defineProperty;var Go=(t,e)=>()=>(t&&(e=t(t=0)),e);var OP=(t,e)=>{for(var r in e)LP(t,r,{get:e[r],enumerable:!0})};import{homedir as JC}from"node:os";import{join as re}from"node:path";import{existsSync as QC}from"node:fs";function X(){return process.env.QLOGICAGENT_HOME||re(JC(),Gt)}function Jr(){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 ZC(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=Jr()){return re(X(),"profiles",ZC(t))}function Om(t=Jr()){return re(B(t),"memory")}function ns(){return re(B(),"plugins")}function sr(){return re(B(),"skills")}function Ue(){return re(B(),"settings.json")}function jm(){return re(B(),"plugin-cache")}function $m(){return re(B(),"mcp.json")}function Um(){return re(B(),"marketplace.json")}function Wn(){return re(B(),"assistant-presets.json")}function Fm(){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,Gt)}function os(t){return re(De(t),"plugins")}function ir(t){return re(De(t),"skills")}function Hm(t){return re(De(t),"settings.json")}function Tr(t){return re(De(t),"INSTRUCTIONS.md")}function Qr(t){return re(De(t),"rules")}function ss(t){return re(De(t),"sessions")}function Bm(t,e){let r=re(De(t),"checkpoints");return e?re(r,e):r}function qm(t){return re(t,Gt,"hooks")}function sl(t,e){return t.filter(r=>r!==e&&QC(re(r,Gt,"skills")))}function Wm(t,e){return sl(t,e).map(r=>ir(r))}var Gt,G=Go(()=>{"use strict";Gt=".qlogicagent"});import{ProviderRegistry as aI,ProviderVariantResolver as cI}from"@xiaozhiclaw/provider-core";var cs,Zm=Go(()=>{"use strict";cs=class{registry=new aI;resolver=new cI(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 ls,eg=Go(()=>{"use strict";ls=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}}}getKeyById(e){for(let r of this.pools.values()){let n=r.keys.find(o=>o.id===e);if(n)return n.key}return null}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 rg={};OP(rg,{ALL_PURPOSES:()=>zn,ModelRegistry:()=>ds,deriveModelPurposes:()=>tg,getModelRegistry:()=>D,resetModelRegistry:()=>lI});import*as Qe from"node:fs";function D(){return Kn||(Kn=new ds,Kn.load()),Kn}function lI(){Kn=null}function tg(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 dI(t){switch(t){case"openai-chat":case"openai-responses":case"anthropic-messages":case"volcengine-responses":return t;default:return}}function uI(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 dI(e)}}function pI(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 zn,ds,Kn,He=Go(()=>{"use strict";G();Zm();eg();zn=["textGeneration","smallModel","stt","tts","imageGeneration","imageUnderstanding","videoGeneration","videoUnderstanding","threeDGeneration","embedding","voiceClone","musicGeneration","realtimeAudio","realtimeVideo"],ds=class{keyPool;providerCatalog=new cs;models=new Map;modelEnabledOverrides=new Map;bindings={};settingsPath;changeListeners=[];constructor(e){this.settingsPath=Ue(),this.keyPool=new ls(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()}getKeyById(e){return this.keyPool.getKeyById(e)}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 zn){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{Qe.existsSync(this.settingsPath)&&(e=JSON.parse(Qe.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(/[/\\][^/\\]+$/,"");Qe.existsSync(n)||Qe.mkdirSync(n,{recursive:!0}),Qe.writeFileSync(this.settingsPath,JSON.stringify(r,null,2),"utf-8")}load(){try{if(!Qe.existsSync(this.settingsPath))return!1;let e=Qe.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(!Qe.existsSync(this.settingsPath))return;let r=Qe.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:uI(r,e.transport),capabilities:pI(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:tg(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{}}},Kn=null});function $a(t,e,r,n){return{role:"assistant",content:e||null,tool_calls:t,...r&&r.length>0?{thinkingBlocks:r}:{},...n?{reasoning_content:n}:{}}}function Ko(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}:{}}}var jP=/\b(?:daily|weekly|monthly)(?:\/(?:daily|weekly|monthly))* (?:usage )?limit(?:s)?(?: (?:exhausted|reached|exceeded))?\b/i,br={rateLimit:[/rate[_ ]limit|too many requests|429/,"model_cooldown","exceeded your current quota","resource has been exhausted","quota exceeded","resource_exhausted","usage limit",/\btpm\b/i,"tokens per minute","tokens per day"],overloaded:[/overloaded_error|"type"\s*:\s*"overloaded_error"/i,"overloaded",/service[_ ]unavailable.*(?:overload|capacity|high[_ ]demand)|(?:overload|capacity|high[_ ]demand).*service[_ ]unavailable/i,"high demand"],timeout:["timeout","timed out","service unavailable","deadline exceeded","context deadline exceeded","connection error","network error","network request failed","fetch failed","socket hang up",/\beconn(?:refused|reset|aborted)\b/i,/\benotfound\b/i,/\beai_again\b/i,/without sending (?:any )?chunks?/i,/\bstop reason:\s*(?:abort|error|network_error)\b/i,/\breason:\s*(?:abort|error|network_error)\b/i,/\bunhandled stop reason:\s*(?:abort|error|network_error)\b/i],billing:[/["']?(?:status|code)["']?\s*[:=]\s*402\b|\bhttp\s*402\b|\berror(?:\s+code)?\s*[:=]?\s*402\b|\b(?:got|returned|received)\s+(?:a\s+)?402\b|^\s*402\s+payment/i,"payment required","insufficient credits",/insufficient[_ ]quota/i,"credit balance","plans & billing","insufficient balance"],authPermanent:[/api[_ ]?key[_ ]?(?:revoked|invalid|deactivated|deleted)/i,"invalid_api_key","key has been disabled","key has been revoked","account has been deactivated",/could not (?:authenticate|validate).*(?:api[_ ]?key|credentials)/i,"permission_error","not allowed for this organization"],auth:[/invalid[_ ]?api[_ ]?key/,"incorrect api key","invalid token","authentication","re-authenticate","oauth token refresh failed","unauthorized","forbidden","access denied","insufficient permissions","insufficient permission",/missing scopes?:/i,"expired","token has expired",/\b401\b/,/\b403\b/,"no credentials found","no api key found"],format:["string should match pattern","tool_use.id","tool_use_id","messages.1.content.1.tool_use.id","invalid request format",/tool call id was.*must be/i]},$P=/^(?:error[:\s-]+)?billing(?:\s+error)?(?:[:\s-]+|$)|^(?:error[:\s-]+)?(?:credit balance|insufficient credits?|payment required|http\s*402\b)/i,UP=/["']?(?:status|code)["']?\s*[:=]\s*402\b|\bhttp\s*402\b|\berror(?:\s+code)?\s*[:=]?\s*402\b|^\s*402\s+payment/i,FP=512,HP=/^(?:http\s*)?(\d{3})(?:\s+([\s\S]+))?$/i;var BP=new Set([500,502,503,504,521,522,523,524,529]),qP=["insufficient credits","insufficient quota","credit balance","insufficient balance","plans & billing","add more credits","top up"],WP=["upgrade your plan","upgrade plan","current plan","subscription"],GP=["daily","weekly","monthly"],KP=["try again","retry","temporary","cooldown"],zP=["usage limit","rate limit","organization usage"],VP=["organization","workspace"],XP=["billing period","exceeded","reached","exhausted"],YP=/["']?(?:status|code)["']?\s*[:=]\s*402\b|\bhttp\s*402\b|\berror(?:\s+code)?\s*[:=]?\s*402\b|\b(?:got|returned|received)\s+(?:a\s+)?402\b|^\s*402\s+payment required\b/i,JP=/^(?:error[:\s-]+)?(?:(?:http\s*)?402(?:\s+payment required)?|payment required)(?:[:\s-]+|$)/i;function kr(t,e){if(!t)return!1;let r=t.toLowerCase();return e.some(n=>n instanceof RegExp?n.test(r):r.includes(n))}function QP(t){return kr(t,br.format)}function Up(t){return kr(t,br.rateLimit)}function ZP(t){return kr(t,br.timeout)}function ex(t){return jP.test(t)}function Ua(t){let e=t.toLowerCase();return e?t.length>FP?UP.test(e):kr(e,br.billing)?!0:$P.test(t)?e.includes("upgrade")||e.includes("credits")||e.includes("payment")||e.includes("plan"):!1:!1}function Fp(t){return kr(t,br.authPermanent)}function tx(t){return kr(t,br.auth)}function Hp(t){return kr(t,br.overloaded)}function vr(t,e){return e.some(r=>t.includes(r))}function rx(t){return vr(t,qP)||vr(t,WP)&&t.includes("limit")||t.includes("billing hard limit")||t.includes("hard limit reached")||t.includes("maximum allowed")&&t.includes("limit")}function nx(t){let e=vr(t,GP),r=t.includes("spend limit")||t.includes("spending limit"),n=vr(t,VP);return vr(t,KP)&&vr(t,zP)||e&&(t.includes("usage limit")||r)||e&&t.includes("limit")&&t.includes("reset")||n&&t.includes("limit")&&(r||vr(t,XP))}function ox(t){return t.trim().toLowerCase().replace(JP,"").trim()}function Bp(t){let e=ox(t);return!e||rx(e)?"billing":Up(e)||nx(e)?"rate_limit":"billing"}function sx(t){return YP.test(t)?Bp(t):null}function qp(t){let e=t.match(HP);if(!e)return null;let r=Number(e[1]);return Number.isFinite(r)?{code:r,rest:(e[2]??"").trim()}:null}function ix(t){if(!t)return!1;let e=t.toLowerCase();return e.includes('"type":"api_error"')&&e.includes("internal server error")}function ax(t){let e=t.trim();if(!e)return!1;let r=qp(e);return r?BP.has(r.code):!1}function Wp(t,e){return typeof t!="number"||!Number.isFinite(t)?null:t===402?e?Bp(e):"billing":t===429?"rate_limit":t===401||t===403?e&&Fp(e)?"auth_permanent":"auth":t===408?"timeout":t===503?e&&Hp(e)?"overloaded":"timeout":t===502||t===504?"timeout":t===529?"overloaded":t===400?e&&Ua(e)?"billing":"format":null}function cx(t){if(!t)return!1;let e=t.toLowerCase();return!!(e.includes("unknown model")||e.includes("model not found")||e.includes("model_not_found")||e.includes("not_found_error")||e.includes("does not exist")&&e.includes("model")||e.includes("invalid model")&&!e.includes("invalid model reference")||/models\/[^\s]+ is not found/i.test(t)||/\b404\b/.test(t)&&/not[-_ ]?found/i.test(t))}function lx(t){if(!t)return!1;let e=t.toLowerCase();return e.includes("session not found")||e.includes("session does not exist")||e.includes("session expired")||e.includes("session invalid")||e.includes("conversation not found")||e.includes("conversation does not exist")||e.includes("conversation expired")||e.includes("conversation invalid")||e.includes("no such session")||e.includes("invalid session")||e.includes("session id not found")||e.includes("conversation id not found")}function Gp(t){if(lx(t))return"session_expired";if(cx(t))return"model_not_found";let e=sx(t);return e||(ex(t)?Ua(t)?"billing":"rate_limit":Up(t)?"rate_limit":Hp(t)?"overloaded":ax(t)?qp(t.trim())?.code===529?"overloaded":"timeout":ix(t)?"timeout":QP(t)?"format":Ua(t)?"billing":ZP(t)?"timeout":Fp(t)?"auth_permanent":tx(t)?"auth":null)}var dx={timeout:"RETRYABLE_TRANSIENT",overloaded:"RETRYABLE_TRANSIENT",rate_limit:"RETRYABLE_DEGRADED",auth:"NON_RETRYABLE_AUTH",auth_permanent:"NON_RETRYABLE_AUTH",billing:"NON_RETRYABLE_QUOTA",format:"NON_RETRYABLE_CONTENT",model_not_found:"NON_RETRYABLE_CONTENT",session_expired:"NON_RETRYABLE_CONTENT",unknown:"RETRYABLE_TRANSIENT"},ux=new Set(["RETRYABLE_TRANSIENT","RETRYABLE_DEGRADED","TOOL_EXECUTION_FAILED"]);function Gr(t,e){let r=Wp(t,e)??(e?Gp(e):null);return r?dx[r]:typeof t=="number"&&t>=400&&t<500?"NON_RETRYABLE_CONTENT":"RETRYABLE_TRANSIENT"}function Fa(t){return ux.has(t)}function On(t){return typeof t.compressAsync=="function"}var Kp=4,Kr=class{constructor(e){this.estimateTokens=e}estimateTokens;compress(e,r){let n=[],o=[];for(let d of e)d.role==="system"?n.push(d):o.push(d);let s=r;for(let d of n)s-=this.estimateTokens(d);let i;for(let d of o)if(d.role==="user"){i=d;break}if(i&&(s-=this.estimateTokens(i)),s<=0)return{messages:i?[...n,i]:n,droppedCount:o.length-(i?1:0),strategy:"sliding-window"};let a=[],c=0;for(let d=o.length-1;d>=0;d--){let p=o[d];if(p===i)continue;let u=this.estimateTokens(p);if(s-u<0&&c>=Kp)break;if(s-u<0&&c<Kp){a.unshift(p),c++;continue}s-=u,a.unshift(p),c++}let l=[...n];return i&&!a.includes(i)&&l.push(i),l.push(...a),{messages:l,droppedCount:o.length-(a.length+(i&&!a.includes(i)?1:0)),strategy:"sliding-window"}}};var Rr=class{constructor(e=8e3){this.maxToolResultChars=e}maxToolResultChars;compress(e,r){let n=0;return{messages:e.map(s=>s.role!=="tool"||typeof s.content!="string"||s.content.length<=this.maxToolResultChars?s:(n++,{...s,content:px(s.content,this.maxToolResultChars)})),droppedCount:n,strategy:"tool-result-trim"}}};function px(t,e){if(t.length<=e)return t;let r=t.slice(0,e);if(t.trimStart().startsWith("{")||t.trimStart().startsWith("[")){let s=Math.max(r.lastIndexOf("},"),r.lastIndexOf("],"),r.lastIndexOf(`}
1
+ var LP=Object.defineProperty;var Go=(t,e)=>()=>(t&&(e=t(t=0)),e);var OP=(t,e)=>{for(var r in e)LP(t,r,{get:e[r],enumerable:!0})};import{homedir as JC}from"node:os";import{join as re}from"node:path";import{existsSync as QC}from"node:fs";function X(){return process.env.QLOGICAGENT_HOME||re(JC(),Gt)}function Jr(){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 ZC(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=Jr()){return re(X(),"profiles",ZC(t))}function Om(t=Jr()){return re(B(t),"memory")}function ns(){return re(B(),"plugins")}function sr(){return re(B(),"skills")}function Ue(){return re(B(),"settings.json")}function jm(){return re(B(),"plugin-cache")}function $m(){return re(B(),"mcp.json")}function Um(){return re(B(),"marketplace.json")}function Wn(){return re(B(),"assistant-presets.json")}function Fm(){return re(B(),"rules")}function Ne(t){if(!t)throw new Error("getProjectAgentDir: cwd is required (must not fall back to process.cwd())");return re(t,Gt)}function os(t){return re(Ne(t),"plugins")}function ir(t){return re(Ne(t),"skills")}function Hm(t){return re(Ne(t),"settings.json")}function Tr(t){return re(Ne(t),"INSTRUCTIONS.md")}function Qr(t){return re(Ne(t),"rules")}function ss(t){return re(Ne(t),"sessions")}function Bm(t,e){let r=re(Ne(t),"checkpoints");return e?re(r,e):r}function qm(t){return re(t,Gt,"hooks")}function sl(t,e){return t.filter(r=>r!==e&&QC(re(r,Gt,"skills")))}function Wm(t,e){return sl(t,e).map(r=>ir(r))}var Gt,G=Go(()=>{"use strict";Gt=".qlogicagent"});import{ProviderRegistry as aI,ProviderVariantResolver as cI}from"@xiaozhiclaw/provider-core";var cs,Zm=Go(()=>{"use strict";cs=class{registry=new aI;resolver=new cI(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 ls,eg=Go(()=>{"use strict";ls=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,n]of this.pools){let o=n.keys.findIndex(s=>s.id===e);if(o!==-1)return n.keys.splice(o,1),n.keys.length===0&&this.pools.delete(r),this.runtimeStates.delete(e),!0}return!1}getKeyById(e){for(let r of this.pools.values()){let n=r.keys.find(o=>o.id===e);if(n)return n.key}return null}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!0}}return!1}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 rg={};OP(rg,{ALL_PURPOSES:()=>zn,ModelRegistry:()=>ds,deriveModelPurposes:()=>tg,getModelRegistry:()=>D,resetModelRegistry:()=>lI});import*as Qe from"node:fs";function D(){return Kn||(Kn=new ds,Kn.load()),Kn}function lI(){Kn=null}function tg(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 dI(t){switch(t){case"openai-chat":case"openai-responses":case"anthropic-messages":case"volcengine-responses":return t;default:return}}function uI(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 dI(e)}}function pI(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 zn,ds,Kn,He=Go(()=>{"use strict";G();Zm();eg();zn=["textGeneration","smallModel","stt","tts","imageGeneration","imageUnderstanding","videoGeneration","videoUnderstanding","threeDGeneration","embedding","voiceClone","musicGeneration","realtimeAudio","realtimeVideo"],ds=class{keyPool;providerCatalog=new cs;models=new Map;modelEnabledOverrides=new Map;bindings={};settingsPath;changeListeners=[];constructor(e){this.settingsPath=Ue(),this.keyPool=new ls(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){let r=this.keyPool.removeKey(e);return r&&this.emitChange(),r}getKeyById(e){return this.keyPool.getKeyById(e)}updateKey(e,r){let n=this.keyPool.updateKey(e,r);return n&&this.emitChange(),n}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 zn){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{Qe.existsSync(this.settingsPath)&&(e=JSON.parse(Qe.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(/[/\\][^/\\]+$/,"");Qe.existsSync(n)||Qe.mkdirSync(n,{recursive:!0}),Qe.writeFileSync(this.settingsPath,JSON.stringify(r,null,2),"utf-8")}load(){try{if(!Qe.existsSync(this.settingsPath))return!1;let e=Qe.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(!Qe.existsSync(this.settingsPath))return;let r=Qe.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:uI(r,e.transport),capabilities:pI(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:tg(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{}}},Kn=null});function $a(t,e,r,n){return{role:"assistant",content:e||null,tool_calls:t,...r&&r.length>0?{thinkingBlocks:r}:{},...n?{reasoning_content:n}:{}}}function Ko(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}:{}}}var jP=/\b(?:daily|weekly|monthly)(?:\/(?:daily|weekly|monthly))* (?:usage )?limit(?:s)?(?: (?:exhausted|reached|exceeded))?\b/i,br={rateLimit:[/rate[_ ]limit|too many requests|429/,"model_cooldown","exceeded your current quota","resource has been exhausted","quota exceeded","resource_exhausted","usage limit",/\btpm\b/i,"tokens per minute","tokens per day"],overloaded:[/overloaded_error|"type"\s*:\s*"overloaded_error"/i,"overloaded",/service[_ ]unavailable.*(?:overload|capacity|high[_ ]demand)|(?:overload|capacity|high[_ ]demand).*service[_ ]unavailable/i,"high demand"],timeout:["timeout","timed out","service unavailable","deadline exceeded","context deadline exceeded","connection error","network error","network request failed","fetch failed","socket hang up",/\beconn(?:refused|reset|aborted)\b/i,/\benotfound\b/i,/\beai_again\b/i,/without sending (?:any )?chunks?/i,/\bstop reason:\s*(?:abort|error|network_error)\b/i,/\breason:\s*(?:abort|error|network_error)\b/i,/\bunhandled stop reason:\s*(?:abort|error|network_error)\b/i],billing:[/["']?(?:status|code)["']?\s*[:=]\s*402\b|\bhttp\s*402\b|\berror(?:\s+code)?\s*[:=]?\s*402\b|\b(?:got|returned|received)\s+(?:a\s+)?402\b|^\s*402\s+payment/i,"payment required","insufficient credits",/insufficient[_ ]quota/i,"credit balance","plans & billing","insufficient balance"],authPermanent:[/api[_ ]?key[_ ]?(?:revoked|invalid|deactivated|deleted)/i,"invalid_api_key","key has been disabled","key has been revoked","account has been deactivated",/could not (?:authenticate|validate).*(?:api[_ ]?key|credentials)/i,"permission_error","not allowed for this organization"],auth:[/invalid[_ ]?api[_ ]?key/,"incorrect api key","invalid token","authentication","re-authenticate","oauth token refresh failed","unauthorized","forbidden","access denied","insufficient permissions","insufficient permission",/missing scopes?:/i,"expired","token has expired",/\b401\b/,/\b403\b/,"no credentials found","no api key found"],format:["string should match pattern","tool_use.id","tool_use_id","messages.1.content.1.tool_use.id","invalid request format",/tool call id was.*must be/i]},$P=/^(?:error[:\s-]+)?billing(?:\s+error)?(?:[:\s-]+|$)|^(?:error[:\s-]+)?(?:credit balance|insufficient credits?|payment required|http\s*402\b)/i,UP=/["']?(?:status|code)["']?\s*[:=]\s*402\b|\bhttp\s*402\b|\berror(?:\s+code)?\s*[:=]?\s*402\b|^\s*402\s+payment/i,FP=512,HP=/^(?:http\s*)?(\d{3})(?:\s+([\s\S]+))?$/i;var BP=new Set([500,502,503,504,521,522,523,524,529]),qP=["insufficient credits","insufficient quota","credit balance","insufficient balance","plans & billing","add more credits","top up"],WP=["upgrade your plan","upgrade plan","current plan","subscription"],GP=["daily","weekly","monthly"],KP=["try again","retry","temporary","cooldown"],zP=["usage limit","rate limit","organization usage"],VP=["organization","workspace"],XP=["billing period","exceeded","reached","exhausted"],YP=/["']?(?:status|code)["']?\s*[:=]\s*402\b|\bhttp\s*402\b|\berror(?:\s+code)?\s*[:=]?\s*402\b|\b(?:got|returned|received)\s+(?:a\s+)?402\b|^\s*402\s+payment required\b/i,JP=/^(?:error[:\s-]+)?(?:(?:http\s*)?402(?:\s+payment required)?|payment required)(?:[:\s-]+|$)/i;function kr(t,e){if(!t)return!1;let r=t.toLowerCase();return e.some(n=>n instanceof RegExp?n.test(r):r.includes(n))}function QP(t){return kr(t,br.format)}function Up(t){return kr(t,br.rateLimit)}function ZP(t){return kr(t,br.timeout)}function ex(t){return jP.test(t)}function Ua(t){let e=t.toLowerCase();return e?t.length>FP?UP.test(e):kr(e,br.billing)?!0:$P.test(t)?e.includes("upgrade")||e.includes("credits")||e.includes("payment")||e.includes("plan"):!1:!1}function Fp(t){return kr(t,br.authPermanent)}function tx(t){return kr(t,br.auth)}function Hp(t){return kr(t,br.overloaded)}function vr(t,e){return e.some(r=>t.includes(r))}function rx(t){return vr(t,qP)||vr(t,WP)&&t.includes("limit")||t.includes("billing hard limit")||t.includes("hard limit reached")||t.includes("maximum allowed")&&t.includes("limit")}function nx(t){let e=vr(t,GP),r=t.includes("spend limit")||t.includes("spending limit"),n=vr(t,VP);return vr(t,KP)&&vr(t,zP)||e&&(t.includes("usage limit")||r)||e&&t.includes("limit")&&t.includes("reset")||n&&t.includes("limit")&&(r||vr(t,XP))}function ox(t){return t.trim().toLowerCase().replace(JP,"").trim()}function Bp(t){let e=ox(t);return!e||rx(e)?"billing":Up(e)||nx(e)?"rate_limit":"billing"}function sx(t){return YP.test(t)?Bp(t):null}function qp(t){let e=t.match(HP);if(!e)return null;let r=Number(e[1]);return Number.isFinite(r)?{code:r,rest:(e[2]??"").trim()}:null}function ix(t){if(!t)return!1;let e=t.toLowerCase();return e.includes('"type":"api_error"')&&e.includes("internal server error")}function ax(t){let e=t.trim();if(!e)return!1;let r=qp(e);return r?BP.has(r.code):!1}function Wp(t,e){return typeof t!="number"||!Number.isFinite(t)?null:t===402?e?Bp(e):"billing":t===429?"rate_limit":t===401||t===403?e&&Fp(e)?"auth_permanent":"auth":t===408?"timeout":t===503?e&&Hp(e)?"overloaded":"timeout":t===502||t===504?"timeout":t===529?"overloaded":t===400?e&&Ua(e)?"billing":"format":null}function cx(t){if(!t)return!1;let e=t.toLowerCase();return!!(e.includes("unknown model")||e.includes("model not found")||e.includes("model_not_found")||e.includes("not_found_error")||e.includes("does not exist")&&e.includes("model")||e.includes("invalid model")&&!e.includes("invalid model reference")||/models\/[^\s]+ is not found/i.test(t)||/\b404\b/.test(t)&&/not[-_ ]?found/i.test(t))}function lx(t){if(!t)return!1;let e=t.toLowerCase();return e.includes("session not found")||e.includes("session does not exist")||e.includes("session expired")||e.includes("session invalid")||e.includes("conversation not found")||e.includes("conversation does not exist")||e.includes("conversation expired")||e.includes("conversation invalid")||e.includes("no such session")||e.includes("invalid session")||e.includes("session id not found")||e.includes("conversation id not found")}function Gp(t){if(lx(t))return"session_expired";if(cx(t))return"model_not_found";let e=sx(t);return e||(ex(t)?Ua(t)?"billing":"rate_limit":Up(t)?"rate_limit":Hp(t)?"overloaded":ax(t)?qp(t.trim())?.code===529?"overloaded":"timeout":ix(t)?"timeout":QP(t)?"format":Ua(t)?"billing":ZP(t)?"timeout":Fp(t)?"auth_permanent":tx(t)?"auth":null)}var dx={timeout:"RETRYABLE_TRANSIENT",overloaded:"RETRYABLE_TRANSIENT",rate_limit:"RETRYABLE_DEGRADED",auth:"NON_RETRYABLE_AUTH",auth_permanent:"NON_RETRYABLE_AUTH",billing:"NON_RETRYABLE_QUOTA",format:"NON_RETRYABLE_CONTENT",model_not_found:"NON_RETRYABLE_CONTENT",session_expired:"NON_RETRYABLE_CONTENT",unknown:"RETRYABLE_TRANSIENT"},ux=new Set(["RETRYABLE_TRANSIENT","RETRYABLE_DEGRADED","TOOL_EXECUTION_FAILED"]);function Gr(t,e){let r=Wp(t,e)??(e?Gp(e):null);return r?dx[r]:typeof t=="number"&&t>=400&&t<500?"NON_RETRYABLE_CONTENT":"RETRYABLE_TRANSIENT"}function Fa(t){return ux.has(t)}function On(t){return typeof t.compressAsync=="function"}var Kp=4,Kr=class{constructor(e){this.estimateTokens=e}estimateTokens;compress(e,r){let n=[],o=[];for(let d of e)d.role==="system"?n.push(d):o.push(d);let s=r;for(let d of n)s-=this.estimateTokens(d);let i;for(let d of o)if(d.role==="user"){i=d;break}if(i&&(s-=this.estimateTokens(i)),s<=0)return{messages:i?[...n,i]:n,droppedCount:o.length-(i?1:0),strategy:"sliding-window"};let a=[],c=0;for(let d=o.length-1;d>=0;d--){let p=o[d];if(p===i)continue;let u=this.estimateTokens(p);if(s-u<0&&c>=Kp)break;if(s-u<0&&c<Kp){a.unshift(p),c++;continue}s-=u,a.unshift(p),c++}let l=[...n];return i&&!a.includes(i)&&l.push(i),l.push(...a),{messages:l,droppedCount:o.length-(a.length+(i&&!a.includes(i)?1:0)),strategy:"sliding-window"}}};var Rr=class{constructor(e=8e3){this.maxToolResultChars=e}maxToolResultChars;compress(e,r){let n=0;return{messages:e.map(s=>s.role!=="tool"||typeof s.content!="string"||s.content.length<=this.maxToolResultChars?s:(n++,{...s,content:px(s.content,this.maxToolResultChars)})),droppedCount:n,strategy:"tool-result-trim"}}};function px(t,e){if(t.length<=e)return t;let r=t.slice(0,e);if(t.trimStart().startsWith("{")||t.trimStart().startsWith("[")){let s=Math.max(r.lastIndexOf("},"),r.lastIndexOf("],"),r.lastIndexOf(`}
2
2
  `),r.lastIndexOf(`]
3
3
  `));if(s>e*.5)return r.slice(0,s+1)+`
4
4
  [...truncated: ${t.length-s-1} chars omitted]`}let o=r.lastIndexOf(`
@@ -13,9 +13,9 @@ ${g}`},b=[...o,...p,h,...m],v=Date.now()-n,R=b.reduce((S,T)=>S+this.config.estim
13
13
  ${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 Ga(t,e,r=qa){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 Ka(){return{stages:[]}}function za(t,e,r){let n=r?.thresholdMessages??40;if(t.filter(a=>a.role!=="system").length<=n)return{messages:t,stagedCount:0};let s=Xp(t,e),i=hx(s,e,n);if(i.length===0)return{messages:s,stagedCount:0};for(let a of i)e.stages.push(a);return s=Xp(t,e),{messages:s,stagedCount:i.length}}function Va(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:Yp(t,e),committed:r}}function Xp(t,e){return e.stages.filter(n=>n.committed).length===0?t:Yp(t,e)}function Yp(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 hx(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 Nc,readFileSync as nm,writeFileSync as $x,readdirSync as om,mkdirSync as Ux}from"node:fs";import{join as Lc,dirname as Fx}from"node:path";var Xa=Math.min(Math.max(1,Number(process.env.TOOL_LOOP_DEFAULT_BUDGET)||25),100),Ya=3,Ja=2,Xo=2,Qa=128e3,Za=13e3,ec=16384,tc=65536,rc=3,nc=65536,Yo=500,oc=3,sc=5e4,ic=2e5,Jo=2e3,ac=3e4,cc=3,zr=2,yx=3e5,vx=216e5,bx=.75,kx=16e3,Rx=12e4,Sx=3,Tx=4,wx=50,lc=20,Jp=50,dc=3,uc=2,pc=300*1e3,Qp=3,Zp=720*60*60*1e3,Ax=4e3,Px=5,mc=3,gc=800,fc=300*1e3,hc=4,yc=0,vc=50,bc=50,kc=30,em=3600*1e3,tm=200,Rc=5,xx=4e4,Sc=50*1024,Tc=500*1024,wc=500*1024*1024,Cx=50*1024*1024,Ac=3e5,Pc=2,xc=3e3,Cc=3,Ic=5e3,Ix=1e3,Ex=3e3,Mx=3e4,Ec=60*1024,Mc=10,_c=100,_x=24,Dx=5,Nx=6e5,Lx=30,Ox=144e5,jx=3e5;function Dc(){return{maxRoundsLimit:100,defaultMaxRounds:25,defaultTemperature:0,maxToolBudgetCap:100,defaultToolBudget:Xa,maxConsecutiveFailures:Ya,maxIdenticalCallRepeats:Ja,defaultContextWindowTokens:Qa,responseBufferTokens:Za,defaultMaxOutputTokens:ec,defaultModelMaxOutputTokens:tc,maxOutputTokensRecoveryLimit:rc,escalatedMaxOutputTokens:nc,diminishingReturnsThreshold:Yo,diminishingReturnsMinContinuations:oc,defaultMaxResultSizeChars:sc,maxToolResultsPerMessageChars:ic,toolResultPreviewBytes:Jo,heartbeatIntervalMs:ac,max529Retries:cc,maxApiRetries:zr,persistentRetryMaxBackoffMs:yx,persistentRetryResetCapMs:vx,compressionTargetUsageRatio:bx,compressionMinBudget:kx,compressionMaxBudget:Rx,reactiveCompactMaxFailures:Sx,reactiveCompactMinMessages:Tx,reactiveCompactTargetPercent:wx,maxSkillsPerProject:lc,maxSkillsGlobal:Jp,minToolCallsForSkill:dc,minDistinctToolsForSkill:uc,skillCreationCooldownMs:pc,skillInjectionMaxChars:Ax,skillInjectionMaxCount:Px,skillRecallMaxSkills:mc,skillRecallMaxContentChars:gc,skillRecallCacheTtlMs:fc,maxForkDepth:hc,maxSessions:vc,taskSummaryTurnThreshold:bc,taskSummaryRegenInterval:kc,maxIncludeDepth:Rc,maxInstructionChars:xx,instructionsMaxFileSize:Sc,instructionsMaxDirSize:Tc,mediaMaxDownloadSize:wc,mediaMaxUploadSize:Cx,mediaDownloadTimeoutMs:Ac,acpMaxSpawnRetries:Pc,acpRetryBackoffBase:xc,acpRuntimeRestartMax:Cc,acpRuntimeRestartBackoffBase:Ic,taskPollIntervalMs:Ix,taskStoppedDisplayMs:Ex,taskPanelGraceMs:Mx,memoryPrefetchMaxSessionBytes:Ec,memoryPrefetchLimitPerRecall:Mc,memoryMaxSurfacedEntries:_c,dreamMinIntervalHours:_x,dreamMinSessions:Dx,dreamScanIntervalMs:Nx,idleDreamMinutes:Lx,dreamCooldownMs:Ox,dreamMaxDurationMs:jx,teamBudgetTokens:yc}}var sm=0;var Hx="skill-patterns.json";function im(t){return Lc(t,".qlogicagent",Hx)}function Bx(t){let e=im(t);try{return JSON.parse(nm(e,"utf8"))}catch{return{version:1,patterns:{}}}}function rm(t,e){let r=im(t);Ux(Fx(r),{recursive:!0}),$x(r,JSON.stringify(e,null,2),"utf8")}function qx(t){let e=Date.now()-Zp;for(let[r,n]of Object.entries(t.patterns))new Date(n.lastSeen).getTime()<e&&delete t.patterns[r]}function am(t,e){if(e.length===0)return!1;let r=Qo(e),n=Bx(t);qx(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 rm(t,n),!1;s.count++,s.lastSeen=o;let i=s.count>=Qp;return i&&(s.promoted=!0),rm(t,n),i}function Qo(t){return[...t].sort().join("+")}function Wx(t,e){if(!Nc(e))return null;let r=Qo(t);try{let n=om(e,{withFileTypes:!0});for(let o of n){if(!o.isDirectory())continue;let s=Lc(e,o.name,"SKILL.md");try{let a=nm(s,"utf8").match(/^tools:\s*\n((?:\s+-\s+\S+\n?)+)/m);if(a){let c=a[1].split(`
14
14
  `).map(l=>l.replace(/^\s*-\s*/,"").trim()).filter(Boolean);if(Qo(c)===r)return o.name}}catch{}}}catch{}return null}function Gx(t){if(!Nc(t))return 0;try{return om(t,{withFileTypes:!0}).filter(e=>e.isDirectory()&&Nc(Lc(t,e.name,"SKILL.md"))).length}catch{return 0}}function Kx(t,e){return!(!t.ok||t.existingSkillName||!t.multiStep||t.toolCallCount<dc||t.distinctToolCount<uc||Date.now()-sm<pc||e?.projectSkillsDir&&(Gx(e.projectSkillsDir)>=lc||e.tools.length>0&&Wx(e.tools,e.projectSkillsDir))||e?.projectRoot&&e.tools.length>0&&!am(e.projectRoot,e.tools))}function zx(t){return t.existingSkillName?t.feedback==="negative":!1}function $n(t,e){return zx(t)?{type:"skill.improve",skillName:t.existingSkillName,reason:"negative user feedback on existing skill execution"}:Kx(t,e)?(sm=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 cm(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 Vx(t){return t==="enabled-eligible"||t==="installed-awaiting-approval"}function Xx(t){return new Map((t??[]).map(e=>[e.toolName,e]))}function Yx(t){if(!t.eligibility?.length)return[...t.tools];let e=Xx(t.eligibility);return t.tools.filter(r=>{let n=cm(r);if(!n)return!1;let o=e.get(n);return!o||Vx(o.status)})}function Jx(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 Oc(t){let e=Jx({toolChoice:t.toolChoice,thinkingEnabled:t.thinkingEnabled,compatibility:t.compatibility}),r=e.normalizedToolChoice,n=[...e.warnings],o=Yx({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=>cm(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 Qx=["stop","aborted","timeout","cancelled","interrupted","error"],Zx=["tool_calls","toolCalls","function_call","functionCall","raw_tool_calls","rawToolCalls"];function lm(t){return t==null?[]:typeof t=="string"?t.length>0?[{type:"text",text:t}]:[]:Array.isArray(t)?t:[{type:"text",text:String(t)}]}function eC(t,e){return{...t,content:[...lm(t.content),...lm(e.content)]}}function tC(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 rC(t){return new Set((t??Qx).map(e=>e.trim().toLowerCase()))}function nC(t,e){return t?rC(e).has(t.trim().toLowerCase()):!1}function jc(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=>tC(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]=eC(c,a);continue}i.push(a)}return i}function $c(t,e){return nC(e?.stopReason,e?.forcedStopReasons)?t.map(r=>{if(r.role!=="assistant")return{...r};let n={...r};for(let o of Zx)delete n[o];return n}):[...t]}function Uc(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 Fc(t,e){let r=jc(t),n=$c(r,e);return Uc(n,e)}function oC(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 sC(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 iC(t){return{round:t.round??0,maxRounds:t.maxRounds,pendingToolCallIds:[...t.pendingToolCallIds??[]],completedToolCallIds:[...t.completedToolCallIds??[]],lastStopReason:t.lastStopReason,replayMessages:[...t.replayMessages??[]]}}function Hc(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 Zo(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 es(t){let e=[],r=jc(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=$c(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=Uc(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:iC({maxRounds:t.maxRounds,round:t.round,lastStopReason:t.lastStopReason,replayMessages:o,pendingToolCallIds:oC(o),completedToolCallIds:sC(o)}),recoveryActions:e}}var aC=new Set(["main","sdk","agent","compact","hook","verification","side_question"]);function Bc(t){return t?aC.has(t):!0}function qc(t){return t===429||t===529}function ts(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 c1={maxBackoffMs:300*1e3,resetCapMs:360*60*1e3,heartbeatIntervalMs:3e4};function rs(){let t=process.env.QLOGICAGENT_PERSISTENT_RETRY;return t==="1"||t==="true"}var Un=class extends Error{constructor(r,n){super(`Model fallback triggered: ${r} -> ${n}`);this.originalModel=r;this.fallbackModel=n;this.name="FallbackTriggeredError"}originalModel;fallbackModel};function Wc(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 cC={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},lC={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},dC={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},uC={name:"code",label:"Code",description:"A coding sub-agent with full tool access for implementation tasks.",maxTurns:200,toolCapabilityProfile:"all_tools",canFork:!0},pC={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},mC={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},dm=[cC,lC,dC,uC,pC,mC];function Gc(){return[...dm]}function Fn(t){return dm.find(e=>e.name===t)}function Kc(t){return{promptTokens:0,hasAttemptedReactiveCompact:!1,currentMaxOutputTokens:t.maxOutputTokens,consecutiveTruncations:0,aborted:t.abortSignal?.aborted??!1}}function zc(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 Vc(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 Xc(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 Yc(t,e){return t.aborted?!0:e.abortSignal?.aborted?(t.aborted=!0,!0):!1}var gC={maxConsecutiveFailures:3,minMessagesAfterCompact:4,targetUsagePercent:50};function Jc(){return{consecutiveFailures:0,attemptedThisTurn:!1,lastCompactAt:null,toolsAtLastCompact:[]}}function Vr(t,e=gC){return!(t.attemptedThisTurn||t.consecutiveFailures>=e.maxConsecutiveFailures)}function Hn(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 Qc(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 um(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 hC=new Set(["write","edit","patch","apply_patch"]);function pm(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=yC(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}),hC.has(r.toolName)){let a=vC(i);a&&s.push({type:"artifact",turnId:e,artifactId:`artifact-${r.callId}`,artifactType:bC(a),title:a.split(/[\\/]/).pop()||a,filePath:a,language:kC(a)})}return s}function yC(t){try{return JSON.parse(t)}catch{return null}}function vC(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 bC(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 kC(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 SC=/^no (matches|files|results) found\.?$|^file not found|^not found|^0 results|^\(exit code \d+, no output\)$/i,TC=new Set(["search","grep","glob","find","list","read","exec"]);function mm(t){if(!TC.has(t.toolName))return!1;let e=typeof t.message?.content=="string"?t.message.content.trim():"";return e.length>0&&e.length<200&&SC.test(e)}function Zc(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 gm(t){return typeof t=="number"&&Number.isFinite(t)&&t>=1?Math.min(Math.round(t),100):Xa}function fm(t){return t.filter(e=>e.role!=="assistant"?!0:!(typeof e.content=="string"&&e.content.trim()===""))}function Xr(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(`
15
15
 
16
- `)):""}function hm(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 el(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 ym(t){return t==="length"||t==="max_tokens"}function tl(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 vm(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 bm(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*km(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*Rm(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*km(o,c,i,l,d,u,e,n);return}let v=gm(t.maxRounds),R={contextWindowTokens:t.contextWindowTokens??Qa,responseBufferTokens:Za,maxOutputTokens:t.maxOutputTokens??ec,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:Kc(R),reactiveCompactState:Jc(),toolLoopState:es({maxRounds:v,replayMessages:[...i]}).state,consecutiveFailedRounds:0,finalText:"",totalUsage:{inputTokens:0,outputTokens:0},collapseStore:Ka(),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||Xr(k.messages,n);yield{type:"end",turnId:o,content:w,usage:k.totalUsage,model:k.currentModel};return}let{messages:O,maxOutputTokensRecoveryCount:Oe,hasAttemptedReactiveCompact:je,maxOutputTokensOverride:F,turnCount:J,guardState:H,reactiveCompactState:Ie,collapseStore:Wt}=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(Yc(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 ot=zc(H,R);if(ot.level==="blocking"){ot.reason==="prompt_too_long"&&Vr(Ie)&&(Ie.attemptedThisTurn=!0,H.hasAttemptedReactiveCompact=!0,n.info(`token budget blocking (${ot.reason}), reactive compact needed`),yield{type:"recovery",turnId:o,action:"reactive_compact",detail:"token budget pre-check"}),n.info(`token budget blocking (${ot.reason}), ending tool loop`);break}ot.level==="warning"&&n.info(`token budget warning: ${ot.usagePercent}% used, ${ot.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=Ga(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 or().compress(se,0);A.droppedCount>0&&(se=A.messages,n.info(`microcompact: cleared ${A.droppedCount} old tool results`))}if(se=za(se,Wt).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=fm(se);let Dp=t.toolChoice==="required"&&M?"auto":t.toolChoice??"auto",Cn=Oc({tools:C,toolChoice:Dp}),P=es({maxRounds:v,replayMessages:se,lastStopReason:Ee.lastStopReason,options:{stopReason:Ee.lastStopReason}}),W=Cn.extraSystemPrompt?[{role:"system",content:Cn.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,st=[],In=new Map,Np="stop",it,K=null,Fo=!1,En=[],$e=[];try{for await(let w of e.stream({model:k.currentModel,messages:W,tools:Cn.tools,toolChoice:Cn.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":st.push(w.text),!V&&!(t.toolChoice==="required"&&!M)&&(yield{type:"delta",turnId:o,text:w.text});break;case"tool_call_delta":V=!0,Qc(In,w);break;case"reasoning_delta":En.push(w.text);break;case"reasoning_block_complete":w.signature&&$e.push({thinking:En.join(""),signature:w.signature}),En.length=0;break;case"usage":it={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 Un&&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 _=bm({status:x,message:A});if(_!==null){n.info(`max_tokens overflow: adjusting to ${_}`),H.currentMaxOutputTokens=_,k={...k,maxOutputTokensOverride:_,transition:void 0};continue}if(qc(x)){k.consecutive529Errors++;let $=2,Me=t.fallbackModel&&k.currentModel!==t.fallbackModel;if(k.consecutive529Errors>$&&!Me&&!rs()){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>=cc&&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(rs()){let _e=ts(k.consecutive529Errors);n.info(`persistent retry: waiting ${_e}ms (attempt ${k.consecutive529Errors})`);let at=_e;for(;at>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(at/1e3)}s (${x})`};let Nt=Math.min(at,ac);await new Promise(ja=>setTimeout(ja,Nt)),at-=Nt}k={...k,transition:void 0};continue}if(Bc(g)){let at=vm({status:x,message:A})??ts(k.consecutive529Errors);n.info(`transient ${x}: retry in ${at}ms`),yield{type:"recovery",turnId:o,action:"retry",detail:`${x} retry in ${at}ms`},await new Promise(Nt=>setTimeout(Nt,at)),k={...k,transition:void 0};continue}n.info(`background source ${g}: not retrying ${x}`)}K={status:x,message:A}}if(K&&p?.invoke("turn.after_inference",{...m,model:k.currentModel,response:{error:K.message}}).catch(()=>{}),K)if(el(K))Fo=!0,n.info(`withheld prompt_too_long error (status=${K.status})`);else if(tl(K))Fo=!0,n.info(`withheld media_size error (status=${K.status})`);else{let w=Vc({status:K.status??500,message:K.message},H,R);if(w.action==="reactive_compact"&&Vr(Ie)&&(Ie.attemptedThisTurn=!0,H.hasAttemptedReactiveCompact=!0,yield{type:"recovery",turnId:o,action:"reactive_compact",detail:`API ${K.status??500}: ${K.message}`}),w.action==="retry"){let x=(k.consecutiveApiRetries??0)+1;if(x>zr){n.info(`API retry limit reached (${zr}), aborting`);let _=Gr(K.status,K.message);yield{type:"error",turnId:o,error:K.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=Gr(K.status,K.message);p?.invoke("stop.failure",{sessionId:s,reason:A,error:K.message}).catch(()=>{}),yield{type:"error",turnId:o,error:K.message,code:A,usage:k.totalUsage};return}it&&(k.totalUsage.inputTokens+=it.inputTokens,k.totalUsage.outputTokens+=it.outputTokens,it.reasoningTokens&&(k.totalUsage.reasoningTokens=(k.totalUsage.reasoningTokens??0)+it.reasoningTokens),it.cacheRead&&(k.totalUsage.cacheRead=(k.totalUsage.cacheRead??0)+it.cacheRead),it.cacheWrite&&(k.totalUsage.cacheWrite=(k.totalUsage.cacheWrite??0)+it.cacheWrite)),it?.inputTokens&&(H.promptTokens=it.inputTokens);let Lp=st.join("");Lp&&(k.finalText=Lp);let Dt=[...In.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(Dt.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(Fo&&K&&el(K)){if(k.transition?.reason!=="collapse_drain_retry"){let x=Va(se,Wt);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(Vr(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:K.message}).catch(()=>{}),yield{type:"error",turnId:o,error:K.message,code:"PROMPT_TOO_LONG",usage:k.totalUsage};return}if(Fo&&K&&tl(K)){if(Vr(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:K.message}).catch(()=>{}),yield{type:"error",turnId:o,error:K.message,code:"IMAGE_ERROR",usage:k.totalUsage};return}if(ym(Np)){H.consecutiveTruncations+=1;let x=t.modelMaxOutputTokens??tc,_=Xc(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:nc,transition:{reason:"max_output_tokens_escalate"}};continue}if(Oe<rc){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 #${Oe+1}`),yield{type:"recovery",turnId:o,action:"max_output_tokens_recovery",detail:`attempt ${Oe+1}`},k={...k,messages:[...se,$],maxOutputTokensRecoveryCount:Oe+1,maxOutputTokensOverride:void 0,transition:{reason:"max_output_tokens_recovery",attempt:Oe+1}};continue}n.info("max_output_tokens recovery exhausted, completing with partial content")}else H.consecutiveTruncations=0;if(Ee=Zo(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,...$e.length>0&&{thinkingBlocks:[...$e]}};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>=oc&&$<Yo&&k.lastBudgetDeltaTokens<Yo;if(Me&&n.info(`token budget early stop: diminishing returns at ${Math.round(_)}% (delta=${$})`),!Me&&_<90){let _e=k.budgetContinuationCount+1,at={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 Nt={role:"assistant",content:k.finalText,...$e.length>0&&{thinkingBlocks:[...$e]}};k={...k,messages:[...O,Nt,at],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 Nt=[...O].reverse().find(ja=>ja.role==="tool");Nt&&typeof Nt.content=="string"&&(Nt.content+=`
16
+ `)):""}function hm(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 el(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 ym(t){return t==="length"||t==="max_tokens"}function tl(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 vm(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 bm(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*km(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*Rm(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*km(o,c,i,l,d,u,e,n);return}let v=gm(t.maxRounds),R={contextWindowTokens:t.contextWindowTokens??Qa,responseBufferTokens:Za,maxOutputTokens:t.maxOutputTokens??ec,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:Kc(R),reactiveCompactState:Jc(),toolLoopState:es({maxRounds:v,replayMessages:[...i]}).state,consecutiveFailedRounds:0,finalText:"",totalUsage:{inputTokens:0,outputTokens:0},collapseStore:Ka(),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||Xr(k.messages,n);yield{type:"end",turnId:o,content:w,usage:k.totalUsage,model:k.currentModel};return}let{messages:O,maxOutputTokensRecoveryCount:Oe,hasAttemptedReactiveCompact:je,maxOutputTokensOverride:F,turnCount:J,guardState:H,reactiveCompactState:Ee,collapseStore:Wt}=k,{toolLoopState:Me}=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(Yc(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 ot=zc(H,R);if(ot.level==="blocking"){ot.reason==="prompt_too_long"&&Vr(Ee)&&(Ee.attemptedThisTurn=!0,H.hasAttemptedReactiveCompact=!0,n.info(`token budget blocking (${ot.reason}), reactive compact needed`),yield{type:"recovery",turnId:o,action:"reactive_compact",detail:"token budget pre-check"}),n.info(`token budget blocking (${ot.reason}), ending tool loop`);break}ot.level==="warning"&&n.info(`token budget warning: ${ot.usagePercent}% used, ${ot.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=Ga(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 or().compress(se,0);A.droppedCount>0&&(se=A.messages,n.info(`microcompact: cleared ${A.droppedCount} old tool results`))}if(se=za(se,Wt).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=fm(se);let Dp=t.toolChoice==="required"&&M?"auto":t.toolChoice??"auto",Cn=Oc({tools:C,toolChoice:Dp}),P=es({maxRounds:v,replayMessages:se,lastStopReason:Me.lastStopReason,options:{stopReason:Me.lastStopReason}}),W=Cn.extraSystemPrompt?[{role:"system",content:Cn.extraSystemPrompt},...P.state.replayMessages]:P.state.replayMessages;Me=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,st=[],In=new Map,Np="stop",it,K=null,Fo=!1,En=[],$e=[];try{for await(let w of e.stream({model:k.currentModel,messages:W,tools:Cn.tools,toolChoice:Cn.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":st.push(w.text),!V&&!(t.toolChoice==="required"&&!M)&&(yield{type:"delta",turnId:o,text:w.text});break;case"tool_call_delta":V=!0,Qc(In,w);break;case"reasoning_delta":En.push(w.text);break;case"reasoning_block_complete":w.signature&&$e.push({thinking:En.join(""),signature:w.signature}),En.length=0;break;case"usage":it={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 Un&&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 _=bm({status:x,message:A});if(_!==null){n.info(`max_tokens overflow: adjusting to ${_}`),H.currentMaxOutputTokens=_,k={...k,maxOutputTokensOverride:_,transition:void 0};continue}if(qc(x)){k.consecutive529Errors++;let $=2,_e=t.fallbackModel&&k.currentModel!==t.fallbackModel;if(k.consecutive529Errors>$&&!_e&&!rs()){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>=cc&&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(rs()){let De=ts(k.consecutive529Errors);n.info(`persistent retry: waiting ${De}ms (attempt ${k.consecutive529Errors})`);let at=De;for(;at>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(at/1e3)}s (${x})`};let Nt=Math.min(at,ac);await new Promise(ja=>setTimeout(ja,Nt)),at-=Nt}k={...k,transition:void 0};continue}if(Bc(g)){let at=vm({status:x,message:A})??ts(k.consecutive529Errors);n.info(`transient ${x}: retry in ${at}ms`),yield{type:"recovery",turnId:o,action:"retry",detail:`${x} retry in ${at}ms`},await new Promise(Nt=>setTimeout(Nt,at)),k={...k,transition:void 0};continue}n.info(`background source ${g}: not retrying ${x}`)}K={status:x,message:A}}if(K&&p?.invoke("turn.after_inference",{...m,model:k.currentModel,response:{error:K.message}}).catch(()=>{}),K)if(el(K))Fo=!0,n.info(`withheld prompt_too_long error (status=${K.status})`);else if(tl(K))Fo=!0,n.info(`withheld media_size error (status=${K.status})`);else{let w=Vc({status:K.status??500,message:K.message},H,R);if(w.action==="reactive_compact"&&Vr(Ee)&&(Ee.attemptedThisTurn=!0,H.hasAttemptedReactiveCompact=!0,yield{type:"recovery",turnId:o,action:"reactive_compact",detail:`API ${K.status??500}: ${K.message}`}),w.action==="retry"){let x=(k.consecutiveApiRetries??0)+1;if(x>zr){n.info(`API retry limit reached (${zr}), aborting`);let _=Gr(K.status,K.message);yield{type:"error",turnId:o,error:K.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=Gr(K.status,K.message);p?.invoke("stop.failure",{sessionId:s,reason:A,error:K.message}).catch(()=>{}),yield{type:"error",turnId:o,error:K.message,code:A,usage:k.totalUsage};return}it&&(k.totalUsage.inputTokens+=it.inputTokens,k.totalUsage.outputTokens+=it.outputTokens,it.reasoningTokens&&(k.totalUsage.reasoningTokens=(k.totalUsage.reasoningTokens??0)+it.reasoningTokens),it.cacheRead&&(k.totalUsage.cacheRead=(k.totalUsage.cacheRead??0)+it.cacheRead),it.cacheWrite&&(k.totalUsage.cacheWrite=(k.totalUsage.cacheWrite??0)+it.cacheWrite)),it?.inputTokens&&(H.promptTokens=it.inputTokens);let Lp=st.join("");Lp&&(k.finalText=Lp);let Dt=[...In.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(Dt.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(Fo&&K&&el(K)){if(k.transition?.reason!=="collapse_drain_retry"){let x=Va(se,Wt);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(Vr(Ee)){Ee.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:K.message}).catch(()=>{}),yield{type:"error",turnId:o,error:K.message,code:"PROMPT_TOO_LONG",usage:k.totalUsage};return}if(Fo&&K&&tl(K)){if(Vr(Ee)){Ee.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:K.message}).catch(()=>{}),yield{type:"error",turnId:o,error:K.message,code:"IMAGE_ERROR",usage:k.totalUsage};return}if(ym(Np)){H.consecutiveTruncations+=1;let x=t.modelMaxOutputTokens??tc,_=Xc(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:nc,transition:{reason:"max_output_tokens_escalate"}};continue}if(Oe<rc){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 #${Oe+1}`),yield{type:"recovery",turnId:o,action:"max_output_tokens_recovery",detail:`attempt ${Oe+1}`},k={...k,messages:[...se,$],maxOutputTokensRecoveryCount:Oe+1,maxOutputTokensOverride:void 0,transition:{reason:"max_output_tokens_recovery",attempt:Oe+1}};continue}n.info("max_output_tokens recovery exhausted, completing with partial content")}else H.consecutiveTruncations=0;if(Me=Zo(Me,{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:_},_e={role:"assistant",content:k.finalText,...$e.length>0&&{thinkingBlocks:[...$e]}};k={...k,messages:[...O,_e,$],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,_e=k.budgetContinuationCount>=oc&&$<Yo&&k.lastBudgetDeltaTokens<Yo;if(_e&&n.info(`token budget early stop: diminishing returns at ${Math.round(_)}% (delta=${$})`),!_e&&_<90){let De=k.budgetContinuationCount+1,at={role:"user",content:t.runtimePorts.getBudgetContinuationMessage(_,x,t.tokenBudget)};n.info(`token budget continuation #${De}: ${Math.round(_)}% used`),yield{type:"recovery",turnId:o,action:"budget_continuation",detail:`${Math.round(_)}% used (#${De})`};let Nt={role:"assistant",content:k.finalText,...$e.length>0&&{thinkingBlocks:[...$e]}};k={...k,messages:[...O,Nt,at],budgetContinuationCount:De,lastBudgetDeltaTokens:$,lastBudgetGlobalTokens:x,transition:{reason:"token_budget_continuation"}};continue}}if(!k.stopHookActive){let x=i.find(De=>De.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(_),_e=S.has("write")||S.has("edit");if($&&!_e){if(n.info("AP1 action-verification: user requested file action but no write/edit tool was called, injecting nudge"),T>0){let Nt=[...O].reverse().find(ja=>ja.role==="tool");Nt&&typeof Nt.content=="string"&&(Nt.content+=`
17
17
 
18
- \u923F\u72C5\u7B0D NOTE: You used shell commands but did not call the write or edit tool to create/modify the file. Shell commands may fail silently or produce incorrect results on this platform. Please use the 'write' tool directly to create the requested file with the correct content.`)}let _e={role:"user",content:T===0?"You described what to do but did not actually call any tool to write or edit a file. Please use the write or edit tool now to perform the requested action. Do not just describe the changes - actually make them.":"You used shell commands but did not call the write or edit tool to create/modify the file. Shell commands may fail on this platform. Please use the write tool directly to create the requested file with the correct content."},at={role:"assistant",content:k.finalText,...$e.length>0&&{thinkingBlocks:[...$e]}};k={...k,messages:[...O,at,_e],stopHookActive:!0,transition:{reason:"stop_hook_blocking"}};continue}}if(!k.stopHookActive&&T>=3&&S.has("write")){let x=0;for(let _ of O){let $=_,Me=$.is_error===!0||typeof $.content=="string"&&$.content.startsWith("Error:");$.role==="tool"&&typeof $.content=="string"&&!Me&&x++}if(x>=3){n.info("AP3 verification nudge: 3+ files created, injecting completeness check");let _={role:"user",content:"You created multiple files. Before completing, verify: (1) All imports between your files resolve to real exports. (2) No TODO, placeholder, or 'not implemented' stubs remain. (3) Functions that are imported are actually called, not just declared. If everything is correct, confirm completion. If not, fix the issues now."},$={role:"assistant",content:k.finalText,...$e.length>0&&{thinkingBlocks:[...$e]}};k={...k,messages:[...O,$,_],stopHookActive:!0,transition:{reason:"stop_hook_blocking"}};continue}}if(T>0){let x={ok:!0,toolCallCount:T,distinctToolCount:S.size,multiStep:T>=2,hasSubAgent:!1,feedback:null,existingSkillName:null},_=$n(x,{tools:[...S],projectRoot:t.projectRoot});_&&(yield{type:"skill_instruction",turnId:o,instruction:_})}let A=k.finalText||Xr(O,n);yield{type:"end",turnId:o,content:A,usage:k.totalUsage,model:k.currentModel};return}let MP=$e.length===0&&En.length>0?En.join(""):void 0;O.push($a(Dt,k.finalText||void 0,$e.length>0?$e:void 0,MP)),Ee=Hc(Ee,{replayMessages:O,pendingToolCallIds:Dt.map(w=>w.id),completedToolCallIds:Ee.completedToolCallIds,lastStopReason:"tool_calls"});let Ho=k.identicalCallCounts,Op=[],Bo=[],jp=!1;for(let w of Dt){let A=`${w.function.name}::${w.function.arguments}`,x=Ho.get(A)??0;Ho.set(A,x+1),x+1>Ja?(Bo.push(w),jp||(jp=!0,n.info(`AP4 blocked: ${w.function.name} repeated ${x+1}x`))):Op.push(w)}let qo=[];for(let w of Bo){let A=Ho.get(`${w.function.name}::${w.function.arguments}`),x=Zc(O,w.function.name),_=x?`This exact tool call has been attempted ${A} times. Last error: ${x}. Do not retry. Report this error to the user.`:`This exact tool call has been attempted ${A} times and keeps failing. Do not retry it. Report the issue to the user or try a completely different approach.`,$=Ko(w.id,{ok:!1,error:_});O.push($),qo.push(w.id),S.add(w.function.name),T++,yield{type:"tool_result",turnId:o,callId:w.id,name:w.function.name,ok:!1,error:_}}if(Bo.length>0){let w=Zc(O,Bo[0].function.name),A={role:"user",content:"Tool calls were blocked because you repeated them with identical arguments too many times. "+(w?`The error was: "${w}". Tell the user about this error. `:"The operation is not working. ")+"Stop retrying and report the result to the user."};O.push(A)}let Wo=[],La=[];for(let w of Op)(k.toolFailureCounts.get(w.function.name)??0)>=Xo?La.push(w):Wo.push(w);if(La.length>0){for(let A of La){let x=k.toolFailureCounts.get(A.function.name),_=`Tool "${A.function.name}" has failed ${x} times this turn with different arguments. The target likely does not exist. Stop trying variations and report the issue to the user.`,$=Ko(A.id,{ok:!1,error:_});O.push($),qo.push(A.id),S.add(A.function.name),T++,yield{type:"tool_result",turnId:o,callId:A.id,name:A.function.name,ok:!1,error:_},n.info(`AP4-variant blocked: ${A.function.name} failed ${x}x with different args`)}let w={role:"user",content:"Tool calls were blocked because the tool has failed too many times with different arguments. The resource you are looking for does not exist. Stop trying variations and tell the user what happened."};O.push(w)}for(let w of Wo){let A=w.function.arguments,x=C.find(_=>_.function.name===w.function.name);if(x?.backfillObservableInput)try{let _=JSON.parse(w.function.arguments),$={..._};x.backfillObservableInput($),Object.keys($).some(_e=>!(_e in _))&&(A=JSON.stringify($))}catch{}yield{type:"tool_call",turnId:o,callId:w.id,name:w.function.name,arguments:A,inputSummary:hm(A)}}let _P=new Map(k.toolFailureCounts);try{let w=t.runtimePorts.createStreamingToolExecutor({toolInvoker:r,hooks:p,sessionId:s,turnId:o,log:n,signal:u,maxConcurrentTools:t?.maxConcurrentTools});for(let A of Wo)w.addTool(A);for await(let A of w.getRemainingResults()){A.blocked&&(yield{type:"tool_blocked",turnId:o,callId:A.callId,name:A.toolName,reason:A.blockReason??"blocked"}),O.push(A.message),qo.push(A.callId),S.add(A.toolName),T++;let x=A.ok&&mm(A);if(!A.ok||x){let $=(k.toolFailureCounts.get(A.toolName)??0)+1;k.toolFailureCounts.set(A.toolName,$)}if(A.ok&&A.toolName==="read"){let _=Wo.find($=>$.id===A.callId);if(_)try{let $=JSON.parse(_.function.arguments),Me=$.file_path??$.path??$.filePath??"";if(Me){let _e=k.fileReadCounts.get(Me)??0;k.fileReadCounts.set(Me,_e+1)}}catch{}}yield um(o,A);for(let _ of pm({turnId:o,result:A,toolCalls:Dt}))yield _}}catch(w){let A=w instanceof Error?w.message:String(w);yield{type:"error",turnId:o,error:A,code:"TOOL_EXECUTION_ERROR",usage:k.totalUsage};return}for(let[w,A]of k.toolFailureCounts)A>=Xo&&(_P.get(w)??0)<Xo&&O.push({role:"user",content:`Tool "${w}" has now failed/returned empty results ${A} times with different arguments. The target clearly does not exist. Do NOT call "${w}" again. Report the result to the user immediately.`});if(Ee=Zo(Ee,{replayMessages:O,completedToolCallIds:[...Ee.completedToolCallIds,...qo],lastStopReason:"tool_calls"}),t.toolChoice==="required"&&Dt.length>0&&(M=!0),t.generateToolUseSummary&&Dt.length>0){let w=Dt.map(A=>({name:A.function.name,arguments:A.function.arguments}));E=t.generateToolUseSummary(w).catch(()=>null)}let DP=Dt.length>0&&Dt.every(w=>{let A=O.find(_=>_?.role==="tool"&&_?.tool_call_id===w.id);if(!A)return!0;let x=A.content;return typeof x=="string"&&x.startsWith("Error: ")}),Mn=k.consecutiveFailedRounds;if(DP){if(Mn+=1,Mn>=Ya){let w=k.finalText||Xr(O,n);n.info(`early exit: ${Mn} consecutive failed rounds, returning ${k.finalText?"partial":"fallback"} response`),yield{type:"end",turnId:o,content:w,usage:k.totalUsage,model:k.currentModel};return}}else Mn=0;let NP=3,$p=[...k.fileReadCounts.entries()].filter(([,w])=>w>=NP);if($p.length>0){let w=$p.map(([x])=>x).join(", ");n.info(`AP5: file read cycle detected on ${w}, injecting nudge`);let A={role:"user",content:`You are reading the same files repeatedly (${w}). This indicates a circular dependency or cycle. Stop reading files, summarize your findings so far, and explain the circular structure to the user.`};O.push(A),k.fileReadCounts.clear()}let Oa=J+1;if(f>0&&Oa>f){if(n.info(`max turns reached (${f}), completing`),p){let A=await p.invoke("stop",{sessionId:s,reason:"max_turns"});if(A.action==="abort"){let x=A.reason??"Stop hook requested continuation after max_turns",_={role:"assistant",content:k.finalText,...$e.length>0&&{thinkingBlocks:[...$e]}};k={...k,messages:[...O,_,{role:"user",content:x}],stopHookActive:!0,transition:{reason:"stop_hook_blocking"}};continue}}let w=k.finalText||Xr(O,n);yield{type:"end",turnId:o,content:w,usage:k.totalUsage,model:k.currentModel};return}if(Oa>v){if(n.info(`tool loop budget exhausted (${v} rounds), returning`),T>0){let A={ok:!0,toolCallCount:T,distinctToolCount:S.size,multiStep:T>=2,hasSubAgent:!1,feedback:null,existingSkillName:null},x=$n(A,{tools:[...S],projectRoot:t.projectRoot});x&&(yield{type:"skill_instruction",turnId:o,instruction:x})}let w=k.finalText||Xr(O,n);yield{type:"end",turnId:o,content:w,usage:k.totalUsage,model:k.currentModel};return}k={messages:O,maxOutputTokensRecoveryCount:0,hasAttemptedReactiveCompact:!1,maxOutputTokensOverride:void 0,turnCount:Oa,transition:{reason:"next_turn"},guardState:H,reactiveCompactState:Ie,toolLoopState:Ee,consecutiveFailedRounds:Mn,finalText:k.finalText,totalUsage:k.totalUsage,collapseStore:Wt,currentModel:k.currentModel,consecutive529Errors:0,consecutiveApiRetries:0,stopHookActive:k.stopHookActive,lastResponseId:k.lastResponseId,snipRemovedIds:k.snipRemovedIds,contentReplacementState:k.contentReplacementState,budgetContinuationCount:0,lastBudgetDeltaTokens:0,lastBudgetGlobalTokens:0,identicalCallCounts:Ho,toolFailureCounts:k.toolFailureCounts,fileReadCounts:k.fileReadCounts}}}var AC=["\u63A5\u5355\u91D1\u989D","\u5408\u540C\u91D1\u989D","\u62A5\u4EF7","\u9884\u7B97","\u91D1\u989D","price","amount","contract amount"];function wm(t){let e=PC(t),r=["[Recalled memories]","- L1 project MD is project-scoped working memory.","- L2 long-term memory is cross-project canonical memory.","- If L1 and L2 conflict on the same entity/fact, do not silently merge or choose. Surface the conflict and ask the user to confirm. For current-project operational tasks, use L1 only as a project-scoped clue until confirmed into L2."];if(e.length>0){r.push("[Memory conflict detected]");for(let n of e)r.push(`- entity: ${n.entity}; fact: ${n.predicate}; L1 project MD says: ${Tm(n.l1Amount)}; L2 long-term says: ${Tm(n.l2Amount)}; action: ask the user which value is current before using it.`)}for(let n of t){let o=IC(n);r.push(`- [${o}] ${n.text}`)}return r.join(`
18
+ \u923F\u72C5\u7B0D NOTE: You used shell commands but did not call the write or edit tool to create/modify the file. Shell commands may fail silently or produce incorrect results on this platform. Please use the 'write' tool directly to create the requested file with the correct content.`)}let De={role:"user",content:T===0?"You described what to do but did not actually call any tool to write or edit a file. Please use the write or edit tool now to perform the requested action. Do not just describe the changes - actually make them.":"You used shell commands but did not call the write or edit tool to create/modify the file. Shell commands may fail on this platform. Please use the write tool directly to create the requested file with the correct content."},at={role:"assistant",content:k.finalText,...$e.length>0&&{thinkingBlocks:[...$e]}};k={...k,messages:[...O,at,De],stopHookActive:!0,transition:{reason:"stop_hook_blocking"}};continue}}if(!k.stopHookActive&&T>=3&&S.has("write")){let x=0;for(let _ of O){let $=_,_e=$.is_error===!0||typeof $.content=="string"&&$.content.startsWith("Error:");$.role==="tool"&&typeof $.content=="string"&&!_e&&x++}if(x>=3){n.info("AP3 verification nudge: 3+ files created, injecting completeness check");let _={role:"user",content:"You created multiple files. Before completing, verify: (1) All imports between your files resolve to real exports. (2) No TODO, placeholder, or 'not implemented' stubs remain. (3) Functions that are imported are actually called, not just declared. If everything is correct, confirm completion. If not, fix the issues now."},$={role:"assistant",content:k.finalText,...$e.length>0&&{thinkingBlocks:[...$e]}};k={...k,messages:[...O,$,_],stopHookActive:!0,transition:{reason:"stop_hook_blocking"}};continue}}if(T>0){let x={ok:!0,toolCallCount:T,distinctToolCount:S.size,multiStep:T>=2,hasSubAgent:!1,feedback:null,existingSkillName:null},_=$n(x,{tools:[...S],projectRoot:t.projectRoot});_&&(yield{type:"skill_instruction",turnId:o,instruction:_})}let A=k.finalText||Xr(O,n);yield{type:"end",turnId:o,content:A,usage:k.totalUsage,model:k.currentModel};return}let MP=$e.length===0&&En.length>0?En.join(""):void 0;O.push($a(Dt,k.finalText||void 0,$e.length>0?$e:void 0,MP)),Me=Hc(Me,{replayMessages:O,pendingToolCallIds:Dt.map(w=>w.id),completedToolCallIds:Me.completedToolCallIds,lastStopReason:"tool_calls"});let Ho=k.identicalCallCounts,Op=[],Bo=[],jp=!1;for(let w of Dt){let A=`${w.function.name}::${w.function.arguments}`,x=Ho.get(A)??0;Ho.set(A,x+1),x+1>Ja?(Bo.push(w),jp||(jp=!0,n.info(`AP4 blocked: ${w.function.name} repeated ${x+1}x`))):Op.push(w)}let qo=[];for(let w of Bo){let A=Ho.get(`${w.function.name}::${w.function.arguments}`),x=Zc(O,w.function.name),_=x?`This exact tool call has been attempted ${A} times. Last error: ${x}. Do not retry. Report this error to the user.`:`This exact tool call has been attempted ${A} times and keeps failing. Do not retry it. Report the issue to the user or try a completely different approach.`,$=Ko(w.id,{ok:!1,error:_});O.push($),qo.push(w.id),S.add(w.function.name),T++,yield{type:"tool_result",turnId:o,callId:w.id,name:w.function.name,ok:!1,error:_}}if(Bo.length>0){let w=Zc(O,Bo[0].function.name),A={role:"user",content:"Tool calls were blocked because you repeated them with identical arguments too many times. "+(w?`The error was: "${w}". Tell the user about this error. `:"The operation is not working. ")+"Stop retrying and report the result to the user."};O.push(A)}let Wo=[],La=[];for(let w of Op)(k.toolFailureCounts.get(w.function.name)??0)>=Xo?La.push(w):Wo.push(w);if(La.length>0){for(let A of La){let x=k.toolFailureCounts.get(A.function.name),_=`Tool "${A.function.name}" has failed ${x} times this turn with different arguments. The target likely does not exist. Stop trying variations and report the issue to the user.`,$=Ko(A.id,{ok:!1,error:_});O.push($),qo.push(A.id),S.add(A.function.name),T++,yield{type:"tool_result",turnId:o,callId:A.id,name:A.function.name,ok:!1,error:_},n.info(`AP4-variant blocked: ${A.function.name} failed ${x}x with different args`)}let w={role:"user",content:"Tool calls were blocked because the tool has failed too many times with different arguments. The resource you are looking for does not exist. Stop trying variations and tell the user what happened."};O.push(w)}for(let w of Wo){let A=w.function.arguments,x=C.find(_=>_.function.name===w.function.name);if(x?.backfillObservableInput)try{let _=JSON.parse(w.function.arguments),$={..._};x.backfillObservableInput($),Object.keys($).some(De=>!(De in _))&&(A=JSON.stringify($))}catch{}yield{type:"tool_call",turnId:o,callId:w.id,name:w.function.name,arguments:A,inputSummary:hm(A)}}let _P=new Map(k.toolFailureCounts);try{let w=t.runtimePorts.createStreamingToolExecutor({toolInvoker:r,hooks:p,sessionId:s,turnId:o,log:n,signal:u,maxConcurrentTools:t?.maxConcurrentTools});for(let A of Wo)w.addTool(A);for await(let A of w.getRemainingResults()){A.blocked&&(yield{type:"tool_blocked",turnId:o,callId:A.callId,name:A.toolName,reason:A.blockReason??"blocked"}),O.push(A.message),qo.push(A.callId),S.add(A.toolName),T++;let x=A.ok&&mm(A);if(!A.ok||x){let $=(k.toolFailureCounts.get(A.toolName)??0)+1;k.toolFailureCounts.set(A.toolName,$)}if(A.ok&&A.toolName==="read"){let _=Wo.find($=>$.id===A.callId);if(_)try{let $=JSON.parse(_.function.arguments),_e=$.file_path??$.path??$.filePath??"";if(_e){let De=k.fileReadCounts.get(_e)??0;k.fileReadCounts.set(_e,De+1)}}catch{}}yield um(o,A);for(let _ of pm({turnId:o,result:A,toolCalls:Dt}))yield _}}catch(w){let A=w instanceof Error?w.message:String(w);yield{type:"error",turnId:o,error:A,code:"TOOL_EXECUTION_ERROR",usage:k.totalUsage};return}for(let[w,A]of k.toolFailureCounts)A>=Xo&&(_P.get(w)??0)<Xo&&O.push({role:"user",content:`Tool "${w}" has now failed/returned empty results ${A} times with different arguments. The target clearly does not exist. Do NOT call "${w}" again. Report the result to the user immediately.`});if(Me=Zo(Me,{replayMessages:O,completedToolCallIds:[...Me.completedToolCallIds,...qo],lastStopReason:"tool_calls"}),t.toolChoice==="required"&&Dt.length>0&&(M=!0),t.generateToolUseSummary&&Dt.length>0){let w=Dt.map(A=>({name:A.function.name,arguments:A.function.arguments}));E=t.generateToolUseSummary(w).catch(()=>null)}let DP=Dt.length>0&&Dt.every(w=>{let A=O.find(_=>_?.role==="tool"&&_?.tool_call_id===w.id);if(!A)return!0;let x=A.content;return typeof x=="string"&&x.startsWith("Error: ")}),Mn=k.consecutiveFailedRounds;if(DP){if(Mn+=1,Mn>=Ya){let w=k.finalText||Xr(O,n);n.info(`early exit: ${Mn} consecutive failed rounds, returning ${k.finalText?"partial":"fallback"} response`),yield{type:"end",turnId:o,content:w,usage:k.totalUsage,model:k.currentModel};return}}else Mn=0;let NP=3,$p=[...k.fileReadCounts.entries()].filter(([,w])=>w>=NP);if($p.length>0){let w=$p.map(([x])=>x).join(", ");n.info(`AP5: file read cycle detected on ${w}, injecting nudge`);let A={role:"user",content:`You are reading the same files repeatedly (${w}). This indicates a circular dependency or cycle. Stop reading files, summarize your findings so far, and explain the circular structure to the user.`};O.push(A),k.fileReadCounts.clear()}let Oa=J+1;if(f>0&&Oa>f){if(n.info(`max turns reached (${f}), completing`),p){let A=await p.invoke("stop",{sessionId:s,reason:"max_turns"});if(A.action==="abort"){let x=A.reason??"Stop hook requested continuation after max_turns",_={role:"assistant",content:k.finalText,...$e.length>0&&{thinkingBlocks:[...$e]}};k={...k,messages:[...O,_,{role:"user",content:x}],stopHookActive:!0,transition:{reason:"stop_hook_blocking"}};continue}}let w=k.finalText||Xr(O,n);yield{type:"end",turnId:o,content:w,usage:k.totalUsage,model:k.currentModel};return}if(Oa>v){if(n.info(`tool loop budget exhausted (${v} rounds), returning`),T>0){let A={ok:!0,toolCallCount:T,distinctToolCount:S.size,multiStep:T>=2,hasSubAgent:!1,feedback:null,existingSkillName:null},x=$n(A,{tools:[...S],projectRoot:t.projectRoot});x&&(yield{type:"skill_instruction",turnId:o,instruction:x})}let w=k.finalText||Xr(O,n);yield{type:"end",turnId:o,content:w,usage:k.totalUsage,model:k.currentModel};return}k={messages:O,maxOutputTokensRecoveryCount:0,hasAttemptedReactiveCompact:!1,maxOutputTokensOverride:void 0,turnCount:Oa,transition:{reason:"next_turn"},guardState:H,reactiveCompactState:Ee,toolLoopState:Me,consecutiveFailedRounds:Mn,finalText:k.finalText,totalUsage:k.totalUsage,collapseStore:Wt,currentModel:k.currentModel,consecutive529Errors:0,consecutiveApiRetries:0,stopHookActive:k.stopHookActive,lastResponseId:k.lastResponseId,snipRemovedIds:k.snipRemovedIds,contentReplacementState:k.contentReplacementState,budgetContinuationCount:0,lastBudgetDeltaTokens:0,lastBudgetGlobalTokens:0,identicalCallCounts:Ho,toolFailureCounts:k.toolFailureCounts,fileReadCounts:k.fileReadCounts}}}var AC=["\u63A5\u5355\u91D1\u989D","\u5408\u540C\u91D1\u989D","\u62A5\u4EF7","\u9884\u7B97","\u91D1\u989D","price","amount","contract amount"];function wm(t){let e=PC(t),r=["[Recalled memories]","- L1 project MD is project-scoped working memory.","- L2 long-term memory is cross-project canonical memory.","- If L1 and L2 conflict on the same entity/fact, do not silently merge or choose. Surface the conflict and ask the user to confirm. For current-project operational tasks, use L1 only as a project-scoped clue until confirmed into L2."];if(e.length>0){r.push("[Memory conflict detected]");for(let n of e)r.push(`- entity: ${n.entity}; fact: ${n.predicate}; L1 project MD says: ${Tm(n.l1Amount)}; L2 long-term says: ${Tm(n.l2Amount)}; action: ask the user which value is current before using it.`)}for(let n of t){let o=IC(n);r.push(`- [${o}] ${n.text}`)}return r.join(`
19
19
  `)}function PC(t){let e=t.filter(o=>o.source==="l1-project-md").flatMap(o=>Sm(o.text)),r=t.filter(o=>o.source==="l2-long-term").flatMap(o=>Sm(o.text)),n=[];for(let o of e)for(let s of r)o.entity===s.entity&&o.predicate===s.predicate&&o.amount!==s.amount&&n.push({entity:o.entity,predicate:o.predicate,l1Amount:o.amount,l2Amount:s.amount,l1Text:o.text,l2Text:s.text});return EC(n)}function Sm(t){let e=[];for(let r of t.split(/\r?\n/)){let n=r.trim();if(n)for(let o of AC){if(o==="\u91D1\u989D"&&/(接单金额|合同金额)/u.test(n))continue;let s=new RegExp(`${MC(o)}[^0-9.\u4E07kK,]{0,12}([0-9][0-9.,]*\\s*(?:\u4E07|k|K)?)`,"gi");for(let i of n.matchAll(s)){let a=CC(i[1]);a!==null&&e.push({entity:xC(n,o),predicate:o,amount:a,text:n})}}}return e}function xC(t,e){if(/Galaxy\s+Tech/i.test(t))return"Galaxy Tech";if(t.includes("\u7528\u6237"))return"\u7528\u6237";let r=t.toLowerCase().indexOf(e.toLowerCase()),o=(r>=0?t.slice(0,r):"").replace(/[#*`:\-,。;;,.]/g," ").trim().split(/\s+/).filter(Boolean);return o[o.length-1]??"unknown"}function CC(t){let e=t.replace(/,/g,"").replace(/\s+/g,"").trim(),r=e.endsWith("\u4E07")?1e4:/k$/i.test(e)?1e3:1,n=Number(e.replace(/[万kK]$/u,""));return Number.isFinite(n)?n*r:null}function IC(t){if(t.label)return t.label;switch(t.source){case"l1-project-md":return"L1 project MD";case"l2-long-term":return"L2 long-term";case"skill":return"Skill";case"system":return"System";default:return"Memory"}}function Tm(t){return Number.isInteger(t)?String(t):String(Number(t.toFixed(4)))}function EC(t){let e=new Set;return t.filter(r=>{let n=`${r.entity}\0${r.predicate}\0${r.l1Amount}\0${r.l2Amount}`;return e.has(n)?!1:(e.add(n),!0)})}function MC(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var Sr=class{transport;apiKey;toolInvoker;log;hooks;maxRounds;projectRoot;runtimePorts;constructor(e){this.transport=e.llmTransport,this.apiKey=e.apiKey,this.toolInvoker=e.toolInvoker,this.log=e.log,this.hooks=e.hooks,this.projectRoot=e.projectRoot,this.runtimePorts=e.runtimePorts,this.maxRounds=Math.min(e.maxRounds??25,100)}async*run(e,r){let{turnId:n,messages:o,tools:s,systemPrompt:i,config:a}=e,c={sessionId:e.sessionId,turnId:n};yield{type:"start",turnId:n},this.hooks?.invoke("turn.submitted",{...c,prompt:o[o.length-1]?.content??void 0}).catch(()=>{});let l=Fc(o),d=[];if(i&&d.push({role:"system",content:i}),d.push(...l),this.hooks){let m=l.filter(g=>g.role==="user").pop(),f=typeof m?.content=="string"?m.content.slice(0,500):void 0;if(f)try{let g=this.runtimePorts.detectRecallCategories(f),h=await this.hooks.invoke("memory.before_recall",{sessionId:e.sessionId,turnId:n,query:f,preferredCategories:g.preferred.length>0?g.preferred:void 0,deprioritizedCategories:g.deprioritized.length>0?g.deprioritized:void 0}),b=h?.context?.recalledMemories;if(b&&b.length>0){let R=0,S=[];for(let T of b){let C=(T.text?.length??0)*2;if(R+C>8192)break;S.push(T),R+=C}if(S.length>0){let T=wm(S);d.splice(i?1:0,0,{role:"system",content:`[Recalled memories \u2014 context priority: project-specific facts override general user preferences when they conflict]
20
20
  ${T}`})}}this.hooks.invoke("memory.after_recall",{sessionId:e.sessionId,turnId:n,blockCount:h?.context?.recalledMemories?.length??0}).catch(()=>{})}catch{}}let p=a?.model??"",u=Math.min(a?.maxRounds??this.maxRounds,100);try{let m=async h=>{let b=this.runtimePorts.resolveModelForPurpose("smallModel");if(!b)return null;try{let v=h.map(T=>`${T.name}(${T.arguments.slice(0,200)})`).join(", "),R=this.transport.stream({model:b,messages:[{role:"system",content:"Summarize the tool usage in ~30 chars, git-commit-subject style. Reply with ONLY the summary, nothing else."},{role:"user",content:v}],tools:[],maxTokens:60},a?.apiKey??this.apiKey),S="";for await(let T of R)T.type==="delta"&&(S+=T.text);return S.trim()||null}catch{return null}},f={turnId:n,sessionId:e.sessionId,messages:d,tools:s,model:p,apiKey:a?.apiKey??this.apiKey,temperature:a?.temperature,maxRounds:u,contextWindowTokens:a?.contextWindowTokens,maxOutputTokens:a?.maxOutputTokens,modelMaxOutputTokens:a?.modelMaxOutputTokens,toolChoice:a?.toolChoice,parentDepth:a?.parentDepth,hooks:this.hooks,fallbackModel:a?.fallbackModel,maxTurns:a?.maxTurns,tokenBudget:a?.tokenBudget,maxConcurrentTools:a?.maxConcurrentTools,streamRequired:a?.streamRequired,reasoning:a?.reasoning,promptCacheKey:a?.promptCacheKey,promptCacheRetention:a?.promptCacheRetention,serviceTier:a?.serviceTier,openaiBuiltinTools:a?.openaiBuiltinTools,maxToolCalls:a?.maxToolCalls,parallelToolCalls:a?.parallelToolCalls,textVerbosity:a?.textVerbosity,projectRoot:this.projectRoot,generateToolUseSummary:m,runtimePorts:this.runtimePorts.toolLoop,signal:r},g;for await(let h of Rm(f,this.transport,this.toolInvoker,this.log))g=h,yield h;g?.type==="end"?this.hooks?.invoke("turn.completed",{...c}).catch(()=>{}):g?.type==="error"&&this.hooks?.invoke("turn.failed",{...c,code:g.code,error:g.error}).catch(()=>{})}catch(m){if(r?.aborted)this.hooks?.invoke("turn.failed",{...c,code:"ABORTED",error:"Turn aborted"}).catch(()=>{}),yield{type:"error",turnId:n,error:"Turn aborted",code:"ABORTED"};else{let f=m instanceof Error?m.message:String(m),g=typeof m?.status=="number"?m.status:void 0,h=Gr(g,f);this.log.error(`turn ${n} error [${h}, retryable=${Fa(h)}]: ${f}`),this.hooks?.invoke("turn.failed",{...c,code:h,error:f}).catch(()=>{}),yield{type:"error",turnId:n,error:f,code:h}}}}};function DC(t){let e={verbose:!1};for(let r of t.slice(2))(r==="--verbose"||r==="-v")&&(e.verbose=!0);return e}import{createInterface as NC}from"node:readline";var qn=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)}
21
21
  `)}start(){process.stdin.on("data",r=>{process.stderr.write(`[transport] raw stdin data (${r.length} bytes): ${r.toString().slice(0,300)}
@@ -50,14 +50,14 @@ Assistant response:
50
50
  Today's date: {today}
51
51
 
52
52
  Respond ONLY with a JSON array (or empty array [] if nothing worth extracting):
53
- [{"text": "...", "category": "personal_fact|preference|event|lesson", "importance": 0.5-0.9, "eventDate": "YYYY-MM-DD or null"}]`;async function VC(t,e,r){let n=zC.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:XC(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 XC(t){return new Set(["personal_fact","preference","event","lesson","pattern","decision"]).has(t)?t:"personal_fact"}async function _m(t,e){if(!ol(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 VC(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 Yr={MAX_SESSION_BYTES:Ec,LIMIT_PER_RECALL:Mc,MAX_SURFACED_ENTRIES:_c};function bt(){return{surfacedPaths:new Set,sessionBytes:0}}function Nm(t,e,r){let n=[],o=r??bt(),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>=Yr.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:Yr.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>Yr.MAX_SESSION_BYTES)return!1;if(o.surfacedPaths.add(g),o.sessionBytes+=h,o.surfacedPaths.size>Yr.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:nl(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=Dm(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(Dm(l).length>0)return{action:"continue",context:c};if(!ol(l))return{action:"continue",context:c};let p=e.getLastAssistantMessage?.();return!p||!e.llmExtract?{action:"continue",context:c}:(_m({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 Lm(t,e,r){let n=r??bt();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>=Yr.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 Cm(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:nl(g.score,Mm(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>Yr.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=Im(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 YC=[{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 Dm(t){let e=[],r=t.slice(0,500);for(let{pattern:n,category:o,extractor:s}of YC){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 eI}from"node:path";var Gn=class{constructor(e={}){this.options=e}options;getActiveProjectRoot(){return this.options.getActiveProjectRoot?.()??process.cwd()}setActiveWorkdir(e){this.options.setActiveWorkdir?.(eI(e))}resolveProjectDir(e){return this.options.resolveProjectDir?.(e)}resolveActiveOwnerUserId(){return Jr()}getUserAgentHome(){return X()}getOwnerProfileDir(e){return B(e)}getProfileMemoryDir(e){return Om(e)}getUserSettingsPath(){return Ue()}getUserSkillsDir(){return sr()}getUserPluginsDir(){return ns()}getUserMcpConfigPath(){return $m()}getUserPluginCacheDir(){return jm()}getUserMarketplaceConfigPath(){return Um()}getUserAssistantPresetsPath(){return Wn()}getProjectAgentDir(e=this.getActiveProjectRoot()){return De(e)}getProjectSettingsPath(e=this.getActiveProjectRoot()){return Hm(e)}getProjectInstructionsPath(e=this.getActiveProjectRoot()){return Tr(e)}getProjectSkillsDir(e=this.getActiveProjectRoot()){return ir(e)}getProjectPluginsDir(e=this.getActiveProjectRoot()){return os(e)}getProjectRulesDir(e=this.getActiveProjectRoot()){return Qr(e)}getProjectSessionsRoot(e=this.getActiveProjectRoot()){return ss(e)}getKnownProjectDirs(e,r){return sl(e,r)}getAllProjectSkillDirs(e,r){return Wm(e,r)}},tI=new Gn;function I(){return tI}var zm="transcript.jsonl",Kt="metadata.json",Gm="state.json";function rI(t){return I().getProjectSessionsRoot(t)}function Zr(t,e){let r=t.replace(/[^a-zA-Z0-9_-]/g,"_");return Se.join(rI(e),r)}function Km(t){if(!t)return Date.now();let e=Date.parse(t);return Number.isFinite(e)?e:Date.now()}async function nI(t,e,r){let n={metadata:{sessionId:e.sessionId,createdAt:Km(e.createdAt),lastActiveAt:Km(e.lastActiveAt),model:e.model,cwd:e.cwd,turnCount:e.turnCount,messageCount:e.messageCount,title:e.title},costSnapshot:r},o=Se.join(t,Gm+".tmp");await q.promises.writeFile(o,JSON.stringify(n,null,2),"utf8"),await q.promises.rename(o,Se.join(t,Gm))}function Vm(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 zt(t,e){let r=Vm(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 il(t,e,r,n){let o=Zr(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)+`
54
- `;return await q.promises.appendFile(Se.join(o,zm),i,"utf8"),!0}catch(s){return console.error(`[session-persistence] appendMessage failed for ${t}: ${s.message}`),!1}}async function Xm(t,e,r,n){let o=Zr(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 nI(o,a,e)}async function Fe(t,e,r){let o=Vm(t,r)??Zr(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 al(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=Zr(t,e),n=Se.join(r,zm),o=Se.join(r,Kt),s=[],i=0;try{let d=await q.promises.readFile(n,"utf8");for(let p of d.split(`
55
- `))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 kt(t=vc,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 cl(t,e){let r=Zr(t,e);await q.promises.rm(r,{recursive:!0,force:!0})}function oI(t){return t.turnCount<bc?!1:t.taskSummaryGeneratedAt?t.turnCount-(t.taskSummaryGeneratedAt??0)>=kc:!0}var sI="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 Ym(t,e){if(!t.trim())return null;try{let r=e.transport.stream({model:e.model,messages:[{role:"system",content:sI},{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 Jm(t,e,r,n,o){if(!oI(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(`
56
- `),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=Zr(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 rW}from"node:crypto";var iI=3e4;var as=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),!is(n.lifecycle)&&is(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&&is(r.lifecycle)&&(this.tasks.delete(e),this.notify(e,null))}evictStaleTasks(e=iI){let r=Date.now();for(let[n,o]of this.tasks)is(o.lifecycle)&&o.endedAt&&r-o.endedAt>e&&(this.tasks.delete(n),this.notify(n,null))}};function is(t){return t==="completed"||t==="failed"||t==="cancelled"||t==="timeout"}var ll=new Set;function Vt(t){return ll.add(t),()=>{ll.delete(t)}}async function Qm(){await Promise.all(Array.from(ll).map(t=>t()))}He();function wr(t=process.env){return{get:e=>t[e]}}var us="\u65E0\u6CD5\u8FDE\u63A5 llmrouter \u6A21\u578B\u76EE\u5F55",Y="llmrouter",dl="LLMRouter",Xt=class extends Error{constructor(e=us){super(e),this.name="LlmrouterCatalogUnavailableError"}};function ng(t=wr()){let e=t.get("QLOGIC_LLMROUTER_BASE_URL")?.trim().replace(/\/+$/,"");if(!e)throw new Xt;return e}function og(t){return ng(t)}function mI(t=wr()){let e={accept:"application/json"},r=t.get("QLOGIC_LLMROUTER_ACCESS_TOKEN")?.trim();return r&&(e.authorization=`Bearer ${r}`),e}async function sg(t,e){let r=ng(e),n;try{n=await fetch(`${r}${t}`,{method:"GET",headers:mI(e),signal:AbortSignal.timeout(1e4)})}catch{throw new Xt}if(!n.ok)throw new Xt;let o=await n.json().catch(()=>null),s=Array.isArray(o)?o:lg(o)&&Array.isArray(o.data)?o.data:null;if(!s)throw new Xt;return s}function ul(t){let e=t.trim().replace(/\/+$/,"");return e.endsWith("/v1")?`${e}/models`:`${e}/v1/models`}async function gI(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 Xt}if(!r.ok)throw new Xt;let n=await r.json().catch(()=>null),o=Array.isArray(n)?n:lg(n)&&Array.isArray(n.data)?n.data:null;if(!o)throw new Xt;return o}async function pl(t){return sg("/ext/model-catalog/providers",t)}async function fI(t){return sg("/ext/model-catalog/models",t)}async function hI(t,e){return gI(ul(t),e)}function ml(t){let e={zhipu:"Zhipu GLM","zhipu-openai":"Zhipu GLM OpenAI","zhipu-coding":"Zhipu GLM Coding",qwen:"Alibaba Qwen (DashScope)","qwen-coding":"Alibaba Qwen (Coding Plan)",volcengine:"Doubao / Volcengine","volcengine-plan":"Doubao / Volcengine Plan"};return e[t.id]?e[t.id]:t.displayName??t.name??t.id}function en(t){return t.baseUrl??t.base_url}async function gl(t,e){return(await pl(e)).find(n=>n.id===t)??null}async function Vn(t,e){let r=await fI(e);t.migrateModelIds(ig(r));let n=r.flatMap(ag);return t.replaceCatalogModels(n),n}async function fl(t,e){let r=await hI(e.baseUrl,e.apiKey);if(r.length===0)return[];t.migrateModelIds(ig(r));let n=r.flatMap(ag).filter(o=>o.provider===Y).map(o=>({...o,baseUrl:e.baseUrl}));return t.replaceProviderModels(Y,n),n}function ig(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 ag(t){return[yI(t),vI(t)].filter(e=>!!e)}function yI(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:cg(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 vI(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:cg(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 cg(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 lg(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}import*as Mp from"node:path";var Ar="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 hl(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 bI}from"node:crypto";var kI=["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"],RI=new Set(["thread.turn","memory.dream","memory.propose","memory.consolidate","media.stt","pet.forge","solo.start","solo.evaluate","product.plan","product.create","product.message"]),SI=["memory.","pet.","usage."],TI=new Set(["memory.atlas","memory.activity","memory.list","memory.read","memory.search","pet.status"]);function ps(t){return RI.has(t)?{channel:"task",mutability:"write",defaultTimeoutMs:t==="thread.turn"?3e5:12e4}:kI.some(e=>t===e||t.startsWith(`${e}.`)||t.startsWith(e))?{channel:"query",mutability:"read",defaultTimeoutMs:1e4}:{channel:"task",mutability:"write",defaultTimeoutMs:3e4}}function dg(t){return TI.has(t)||ps(t).mutability==="read"?!1:SI.some(e=>t.startsWith(e))}function yl(t,e={}){let r=e.now??Date.now(),n=ps(t),o=e.timeoutMs??n.defaultTimeoutMs;return{requestId:e.requestId??bI(),createdAt:r,deadlineAt:r+o,channel:e.channel??n.channel,idempotencyKey:e.idempotencyKey,traceId:e.traceId}}function ms(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=ps(t.method).channel;return r.channel!==n?{ok:!1,error:{code:y.INVALID_REQUEST,message:`RPC request channel mismatch: expected ${n}, got ${r.channel}.`}}:dg(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 Xn=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=ms({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 ug=["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"],pg=["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"],wI=[...ug,...pg];var Rt={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"},St={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 Yn(t){if(!t||typeof t!="object")return!1;let e=t;return e.jsonrpc==="2.0"&&typeof e.method=="string"&&"id"in e}function Jn(t){if(!t||typeof t!="object")return!1;let e=t;return e.jsonrpc==="2.0"&&typeof e.method=="string"&&!("id"in e)}function vl(t){if(!t||typeof t!="object")return!1;let e=t;return e.jsonrpc==="2.0"&&"id"in e&&!("method"in e)}var mg="openai-codex";var xW={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"},[mg]:{providerFamily:"openai"},openrouter:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},opencode:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},kilocode:{providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]}};import{randomUUID as AI}from"node:crypto";var gs={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},fs=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(Yn(e)){let r=e;return process.stderr.write(`[acp-server] -> recv id=${String(r.id)} method=${r.method}
53
+ [{"text": "...", "category": "personal_fact|preference|event|lesson", "importance": 0.5-0.9, "eventDate": "YYYY-MM-DD or null"}]`;async function VC(t,e,r){let n=zC.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:XC(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 XC(t){return new Set(["personal_fact","preference","event","lesson","pattern","decision"]).has(t)?t:"personal_fact"}async function _m(t,e){if(!ol(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 VC(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 Yr={MAX_SESSION_BYTES:Ec,LIMIT_PER_RECALL:Mc,MAX_SURFACED_ENTRIES:_c};function bt(){return{surfacedPaths:new Set,sessionBytes:0}}function Nm(t,e,r){let n=[],o=r??bt(),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>=Yr.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:Yr.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>Yr.MAX_SESSION_BYTES)return!1;if(o.surfacedPaths.add(g),o.sessionBytes+=h,o.surfacedPaths.size>Yr.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:nl(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=Dm(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(Dm(l).length>0)return{action:"continue",context:c};if(!ol(l))return{action:"continue",context:c};let p=e.getLastAssistantMessage?.();return!p||!e.llmExtract?{action:"continue",context:c}:(_m({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 Lm(t,e,r){let n=r??bt();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>=Yr.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 Cm(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:nl(g.score,Mm(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>Yr.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=Im(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 YC=[{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 Dm(t){let e=[],r=t.slice(0,500);for(let{pattern:n,category:o,extractor:s}of YC){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 Te from"node:path";G();import{resolve as eI}from"node:path";var Gn=class{constructor(e={}){this.options=e}options;getActiveProjectRoot(){return this.options.getActiveProjectRoot?.()??process.cwd()}setActiveWorkdir(e){this.options.setActiveWorkdir?.(eI(e))}resolveProjectDir(e){return this.options.resolveProjectDir?.(e)}resolveActiveOwnerUserId(){return Jr()}getUserAgentHome(){return X()}getOwnerProfileDir(e){return B(e)}getProfileMemoryDir(e){return Om(e)}getUserSettingsPath(){return Ue()}getUserSkillsDir(){return sr()}getUserPluginsDir(){return ns()}getUserMcpConfigPath(){return $m()}getUserPluginCacheDir(){return jm()}getUserMarketplaceConfigPath(){return Um()}getUserAssistantPresetsPath(){return Wn()}getProjectAgentDir(e=this.getActiveProjectRoot()){return Ne(e)}getProjectSettingsPath(e=this.getActiveProjectRoot()){return Hm(e)}getProjectInstructionsPath(e=this.getActiveProjectRoot()){return Tr(e)}getProjectSkillsDir(e=this.getActiveProjectRoot()){return ir(e)}getProjectPluginsDir(e=this.getActiveProjectRoot()){return os(e)}getProjectRulesDir(e=this.getActiveProjectRoot()){return Qr(e)}getProjectSessionsRoot(e=this.getActiveProjectRoot()){return ss(e)}getKnownProjectDirs(e,r){return sl(e,r)}getAllProjectSkillDirs(e,r){return Wm(e,r)}},tI=new Gn;function I(){return tI}var zm="transcript.jsonl",Kt="metadata.json",Gm="state.json";function rI(t){return I().getProjectSessionsRoot(t)}function Zr(t,e){let r=t.replace(/[^a-zA-Z0-9_-]/g,"_");return Te.join(rI(e),r)}function Km(t){if(!t)return Date.now();let e=Date.parse(t);return Number.isFinite(e)?e:Date.now()}async function nI(t,e,r){let n={metadata:{sessionId:e.sessionId,createdAt:Km(e.createdAt),lastActiveAt:Km(e.lastActiveAt),model:e.model,cwd:e.cwd,turnCount:e.turnCount,messageCount:e.messageCount,title:e.title},costSnapshot:r},o=Te.join(t,Gm+".tmp");await q.promises.writeFile(o,JSON.stringify(n,null,2),"utf8"),await q.promises.rename(o,Te.join(t,Gm))}function Vm(t,e){let r=t.replace(/[^a-zA-Z0-9_-]/g,"_"),n=Te.join(I().getProjectSessionsRoot(e),r),o=Te.join(n,Kt);if(q.existsSync(o))return n}function zt(t,e){let r=Vm(t,e);if(!r)return null;try{let n=q.readFileSync(Te.join(r,Kt),"utf8");return JSON.parse(n)}catch{return null}}async function il(t,e,r,n){let o=Zr(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)+`
54
+ `;return await q.promises.appendFile(Te.join(o,zm),i,"utf8"),!0}catch(s){return console.error(`[session-persistence] appendMessage failed for ${t}: ${s.message}`),!1}}async function Xm(t,e,r,n){let o=Zr(t,n);await q.promises.mkdir(o,{recursive:!0});let s={};try{let l=await q.promises.readFile(Te.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=Te.join(o,Kt+".tmp");await q.promises.writeFile(c,JSON.stringify(a,null,2),"utf8"),await q.promises.rename(c,Te.join(o,Kt)),await nI(o,a,e)}async function Fe(t,e,r){let o=Vm(t,r)??Zr(t,r),s=Te.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 al(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=Zr(t,e),n=Te.join(r,zm),o=Te.join(r,Kt),s=[],i=0;try{let d=await q.promises.readFile(n,"utf8");for(let p of d.split(`
55
+ `))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 kt(t=vc,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=Te.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 cl(t,e){let r=Zr(t,e);await q.promises.rm(r,{recursive:!0,force:!0})}function oI(t){return t.turnCount<bc?!1:t.taskSummaryGeneratedAt?t.turnCount-(t.taskSummaryGeneratedAt??0)>=kc:!0}var sI="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 Ym(t,e){if(!t.trim())return null;try{let r=e.transport.stream({model:e.model,messages:[{role:"system",content:sI},{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 Jm(t,e,r,n,o){if(!oI(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(`
56
+ `),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=Zr(t,o),d=Te.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 rW}from"node:crypto";var iI=3e4;var as=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),!is(n.lifecycle)&&is(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&&is(r.lifecycle)&&(this.tasks.delete(e),this.notify(e,null))}evictStaleTasks(e=iI){let r=Date.now();for(let[n,o]of this.tasks)is(o.lifecycle)&&o.endedAt&&r-o.endedAt>e&&(this.tasks.delete(n),this.notify(n,null))}};function is(t){return t==="completed"||t==="failed"||t==="cancelled"||t==="timeout"}var ll=new Set;function Vt(t){return ll.add(t),()=>{ll.delete(t)}}async function Qm(){await Promise.all(Array.from(ll).map(t=>t()))}He();function wr(t=process.env){return{get:e=>t[e]}}var us="\u65E0\u6CD5\u8FDE\u63A5 llmrouter \u6A21\u578B\u76EE\u5F55",Y="llmrouter",dl="LLMRouter",Xt=class extends Error{constructor(e=us){super(e),this.name="LlmrouterCatalogUnavailableError"}};function ng(t=wr()){let e=t.get("QLOGIC_LLMROUTER_BASE_URL")?.trim().replace(/\/+$/,"");if(!e)throw new Xt;return e}function og(t){return ng(t)}function mI(t=wr()){let e={accept:"application/json"},r=t.get("QLOGIC_LLMROUTER_ACCESS_TOKEN")?.trim();return r&&(e.authorization=`Bearer ${r}`),e}async function sg(t,e){let r=ng(e),n;try{n=await fetch(`${r}${t}`,{method:"GET",headers:mI(e),signal:AbortSignal.timeout(1e4)})}catch{throw new Xt}if(!n.ok)throw new Xt;let o=await n.json().catch(()=>null),s=Array.isArray(o)?o:lg(o)&&Array.isArray(o.data)?o.data:null;if(!s)throw new Xt;return s}function ul(t){let e=t.trim().replace(/\/+$/,"");return e.endsWith("/v1")?`${e}/models`:`${e}/v1/models`}async function gI(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 Xt}if(!r.ok)throw new Xt;let n=await r.json().catch(()=>null),o=Array.isArray(n)?n:lg(n)&&Array.isArray(n.data)?n.data:null;if(!o)throw new Xt;return o}async function pl(t){return sg("/ext/model-catalog/providers",t)}async function fI(t){return sg("/ext/model-catalog/models",t)}async function hI(t,e){return gI(ul(t),e)}function ml(t){let e={zhipu:"Zhipu GLM","zhipu-openai":"Zhipu GLM OpenAI","zhipu-coding":"Zhipu GLM Coding",qwen:"Alibaba Qwen (DashScope)","qwen-coding":"Alibaba Qwen (Coding Plan)",volcengine:"Doubao / Volcengine","volcengine-plan":"Doubao / Volcengine Plan"};return e[t.id]?e[t.id]:t.displayName??t.name??t.id}function en(t){return t.baseUrl??t.base_url}async function gl(t,e){return(await pl(e)).find(n=>n.id===t)??null}async function Vn(t,e){let r=await fI(e);t.migrateModelIds(ig(r));let n=r.flatMap(ag);return t.replaceCatalogModels(n),n}async function fl(t,e){let r=await hI(e.baseUrl,e.apiKey);if(r.length===0)return[];t.migrateModelIds(ig(r));let n=r.flatMap(ag).filter(o=>o.provider===Y).map(o=>({...o,baseUrl:e.baseUrl}));return t.replaceProviderModels(Y,n),n}function ig(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 ag(t){return[yI(t),vI(t)].filter(e=>!!e)}function yI(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:cg(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 vI(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:cg(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 cg(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 lg(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}import*as Mp from"node:path";var Ar="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 hl(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 bI}from"node:crypto";var kI=["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"],RI=new Set(["thread.turn","memory.dream","memory.propose","memory.consolidate","media.stt","pet.forge","solo.start","solo.evaluate","product.plan","product.create","product.message"]),SI=["memory.","pet.","usage."],TI=new Set(["memory.atlas","memory.activity","memory.list","memory.read","memory.search","pet.status"]);function ps(t){return RI.has(t)?{channel:"task",mutability:"write",defaultTimeoutMs:t==="thread.turn"?3e5:12e4}:kI.some(e=>t===e||t.startsWith(`${e}.`)||t.startsWith(e))?{channel:"query",mutability:"read",defaultTimeoutMs:1e4}:{channel:"task",mutability:"write",defaultTimeoutMs:3e4}}function dg(t){return TI.has(t)||ps(t).mutability==="read"?!1:SI.some(e=>t.startsWith(e))}function yl(t,e={}){let r=e.now??Date.now(),n=ps(t),o=e.timeoutMs??n.defaultTimeoutMs;return{requestId:e.requestId??bI(),createdAt:r,deadlineAt:r+o,channel:e.channel??n.channel,idempotencyKey:e.idempotencyKey,traceId:e.traceId}}function ms(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=ps(t.method).channel;return r.channel!==n?{ok:!1,error:{code:y.INVALID_REQUEST,message:`RPC request channel mismatch: expected ${n}, got ${r.channel}.`}}:dg(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 Xn=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=ms({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 ug=["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"],pg=["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"],wI=[...ug,...pg];var Rt={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"},St={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 Yn(t){if(!t||typeof t!="object")return!1;let e=t;return e.jsonrpc==="2.0"&&typeof e.method=="string"&&"id"in e}function Jn(t){if(!t||typeof t!="object")return!1;let e=t;return e.jsonrpc==="2.0"&&typeof e.method=="string"&&!("id"in e)}function vl(t){if(!t||typeof t!="object")return!1;let e=t;return e.jsonrpc==="2.0"&&"id"in e&&!("method"in e)}var mg="openai-codex";var xW={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"},[mg]:{providerFamily:"openai"},openrouter:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},opencode:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},kilocode:{providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]}};import{randomUUID as AI}from"node:crypto";var gs={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},fs=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(Yn(e)){let r=e;return process.stderr.write(`[acp-server] -> recv id=${String(r.id)} method=${r.method}
57
57
  `),this.handleRequest(r),!0}return Jn(e)?(this.handleNotification(e),!0):!1}emitSessionUpdate(e,r,n){if(r.startsWith("x_")&&!this.hostSupportsExtendedEvents)return;let o={jsonrpc:"2.0",method:Rt.SESSION_UPDATE,params:{sessionId:e,update:{sessionUpdate:r,...n}}};this.transport.send(o)}async requestPermission(e){let r=`perm-${AI().slice(0,8)}`,n={jsonrpc:"2.0",method:Rt.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 Rt.INITIALIZE:await this.onInitialize(o,s);break;case Rt.SESSION_NEW:await this.onSessionNew(o,s);break;case Rt.SESSION_PROMPT:await this.onSessionPrompt(o,s);break;case Rt.SESSION_END:await this.onSessionEnd(o,s);break;case Rt.SESSION_SET_CONFIG:await this.onSessionSetConfig(o,s);break;case Rt.SESSION_SET_MODEL:await this.handler.handleAcpSessionSetModel(s.sessionId??this.activeSessionId??"",s.modelId??s.model??""),this.sendResult(o,{});break;case Rt.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,gs.METHOD_NOT_FOUND,`Unknown method: ${r}`)}}catch(i){this.sendError(o,gs.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,gs.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,gs.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
58
58
  `);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}
59
59
  `);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}
60
- `)}};function fg(t,e,r,n){let o=PI(r,n);o&&t.emitSessionUpdate(e,o.type,o.payload)}function PI(t,e){switch(t){case"turn.delta":return{type:St.AGENT_MESSAGE_CHUNK,payload:{content:{type:"text",text:e.text}}};case"turn.reasoning_delta":return{type:St.AGENT_THOUGHT_CHUNK,payload:{content:{type:"text",text:e.delta}}};case"turn.tool_call":return{type:St.TOOL_CALL,payload:{toolCallId:e.callId,toolName:e.name,status:"in_progress",title:e.name,kind:"execute",rawInput:xI(e.arguments)}};case"turn.tool_result":return{type:St.TOOL_CALL_UPDATE,payload:{toolCallId:e.callId,status:e.ok?"completed":"failed",...e.outputPreview?{content:[{type:"content",content:{type:"text",text:e.outputPreview}}]}:{},...e.error?{content:[{type:"content",content:{type:"text",text:e.error}}]}:{}}};case"turn.tool_blocked":return{type:St.TOOL_CALL_UPDATE,payload:{toolCallId:e.callId,status:"failed",content:[{type:"content",content:{type:"text",text:e.reason??"blocked"}}]}};case"turn.plan_update":return{type:St.PLAN,payload:{entries:[{content:e.content,priority:"medium",status:"in_progress"}]}};case"turn.usage_update":{let r=e.usage,n=r?.inputTokens??r?.input_tokens??0,o=r?.outputTokens??r?.output_tokens??0;return{type:St.USAGE_UPDATE,payload:{used:n+o,size:r?.contextWindow??2e5}}}case"turn.end":return null;case"turn.error":return{type:St.AGENT_MESSAGE_CHUNK,payload:{content:{type:"text",text:`[Error] ${e.error?.message??"Unknown error"}`}}};case"turn.suggestions":return{type:St.AVAILABLE_COMMANDS_UPDATE,payload:{availableCommands:(e.items??[]).map(r=>({name:r.text,description:r.description??""}))}};case"turn.sidechain_started":return{type:ae.X_SUBAGENT_STARTED,payload:{agentId:String(e.depth??0),agentName:e.role,task:void 0}};case"turn.subagent_delta":return{type:ae.X_SUBAGENT_DELTA,payload:{agentId:e.subagentId??e.agentType,text:e.text}};case"turn.sidechain_completed":return{type:ae.X_SUBAGENT_ENDED,payload:{agentId:String(e.depth??0),result:void 0}};case"turn.media_result":return{type:ae.X_MEDIA_RESULT,payload:{mediaId:e.taskId??CI(),type:e.mediaType,url:e.url,metadata:{model:e.model,provider:e.provider}}};case"turn.media_progress":return{type:ae.X_MEDIA_PROGRESS,payload:{mediaId:e.taskId,progress:e.percent,stage:e.status}};case"turn.skill_instruction":return{type:ae.X_SKILL_INSTRUCTION,payload:{skillId:"unknown",instruction:String(e.instruction??"")}};case"turn.recovery":return{type:ae.X_RECOVERY,payload:{errorType:e.action,message:e.detail??"",action:"retry"}};case"turn.ask_user":return{type:ae.X_ASK_USER,payload:{question:(e.questions??[])[0]?.question??"",options:(e.questions??[])[0]?.options?.map(r=>r.label)}};case"session.info":return{type:ae.X_SESSION_INFO,payload:{sessionId:e.sessionId,model:e.model,metadata:{cwd:e.cwd,turnCount:e.turnCount}}};case"memory.updated":return{type:ae.X_MEMORY_UPDATED,payload:{memoryId:e.source,action:"updated",summary:e.summary}};case"team.member.notification":return{type:ae.X_TEAM_MEMBER_UPDATE,payload:{memberId:e.memberId,type:e.method,payload:e.params??{}}};case"solo.progress":return{type:ae.X_SOLO_STARTED,payload:{evaluationId:e.soloId,agents:[e.agentId],task:e.progress??""}};case"solo.agentDelta":return{type:ae.X_SUBAGENT_DELTA,payload:{agentId:e.agentId,text:e.text}};case"solo.evaluation":return{type:ae.X_SOLO_SELECTED,payload:{evaluationId:e.soloId,winnerId:e.winnerId,reason:e.reasoning}};case"product.taskStarted":return{type:ae.X_PRODUCT_TASK_STARTED,payload:{workflowId:e.productId,taskId:e.taskId,agentId:e.assignee}};case"product.taskCompleted":return{type:ae.X_PRODUCT_TASK_COMPLETED,payload:{workflowId:e.productId,taskId:e.taskId,agentId:"",result:e.result,status:"completed"}};case"product.taskFailed":return{type:ae.X_PRODUCT_TASK_COMPLETED,payload:{workflowId:e.productId,taskId:e.taskId,agentId:"",status:"failed"}};case"product.checkpointed":return{type:ae.X_PRODUCT_CHECKPOINT,payload:{workflowId:e.productId,checkpointId:e.timestamp,completedTasks:[]}};case"turn.start":case"turn.task_updated":case"turn.exec_progress":case"turn.heartbeat":case"turn.tool_use_summary":case"turn.artifact":case"turn.annotations":case"tool.approval.request":case"permission.rule_updated":case"pong":case"agents.status":case"agents.error":case"product.budgetWarning":case"product.completed":return null;default:return null}}function xI(t){if(t)try{return JSON.parse(t)}catch{return{raw:t}}}function CI(){return Math.random().toString(36).slice(2,10)}import{randomUUID as rf}from"node:crypto";import*as xl from"node:path";import{readFile as kl,writeFile as hs,stat as Ig,unlink as qI,mkdir as Eg}from"node:fs/promises";import{join as rn,resolve as Tg,isAbsolute as wg,normalize as Ag}from"node:path";import{randomUUID as WI}from"node:crypto";function hg(){return{toolUseCount:0,latestInputTokens:0,cumulativeOutputTokens:0,recentActivities:[]}}function II(t){return t.latestInputTokens+t.cumulativeOutputTokens}var EI=new Set(["grep","glob","search","Grep","Glob","list_dir","find_files"]),yg=new Set(["read_file","file_read","cat","head","tail","FileRead"]);function MI(t){return{isSearch:EI.has(t)||void 0,isRead:yg.has(t)||void 0}}function _I(t,e){let r=e.file_path??e.path??e.filePath;if(typeof r=="string")return`${yg.has(t)?"Reading":t.includes("write")||t.includes("edit")?"Editing":"Using"} ${r}`;let n=e.command??e.cmd;if(typeof n=="string")return`Running: ${n.length>60?n.slice(0,60)+"\u2026":n}`;let o=e.query??e.pattern??e.search;if(typeof o=="string")return`Searching: ${o}`}function vg(t,e){t.latestInputTokens=(e.input_tokens??0)+(e.cache_creation_input_tokens??0)+(e.cache_read_input_tokens??0),t.cumulativeOutputTokens+=e.output_tokens??0}function bg(t,e,r,n){t.toolUseCount++;let o=MI(e),s={toolName:e,input:r,activityDescription:n?.(e,r)??_I(e,r),isSearch:o.isSearch,isRead:o.isRead};for(t.recentActivities.push(s);t.recentActivities.length>5;)t.recentActivities.shift()}function bl(t){return{toolUseCount:t.toolUseCount,tokenCount:II(t),lastActivity:t.recentActivities.length>0?t.recentActivities[t.recentActivities.length-1]:void 0,recentActivities:[...t.recentActivities]}}import{randomUUID as kg}from"node:crypto";function DI(t){let e=new AbortController;return t&&(t.aborted?e.abort(t.reason):t.addEventListener("abort",()=>{e.abort(t.reason)},{once:!0})),e}async function tn(t){let e=Date.now(),r=[],n={inputTokens:0,outputTokens:0},o=hg(),{promptMessages:s,systemPrompt:i,tools:a,canUseTool:c,transport:l,toolInvoker:d,createAgentRunner:p,apiKey:u,model:m,log:f,hooks:g,forkLabel:h,maxTurns:b,temperature:v,parentSignal:R,onEvent:S,onProgress:T,budgetTokens:C,parentDepth:E}=t,M=DI(R),L=`fork-${h}-${kg().slice(0,8)}`,k=`fork-session-${kg().slice(0,8)}`;f.info(`[fork:${h}] starting \u2014 ${s.length} initial messages, model=${m}`);let Q=c?{invoke:async(je,F,J,H)=>{let Ie={};try{Ie=JSON.parse(J)}catch{}let Wt=c(F,Ie);return Wt.allowed?d.invoke(je,F,J,H):(f.info(`[fork:${h}] tool ${F} denied: ${Wt.reason}`),{result:"",error:Wt.reason})}}:d,de=!0,O;try{let je=p({transport:l,apiKey:u,toolInvoker:Q,log:f,hooks:g,maxRounds:b});for await(let F of je.run({turnId:L,sessionId:k,messages:s,tools:a,systemPrompt:i,config:{model:m,apiKey:u,temperature:v,maxOutputTokens:t.maxOutputTokens,parentDepth:E}},M.signal)){if(r.push(F),S?.(F),F.type==="end"&&F.usage&&(vg(o,{input_tokens:F.usage.inputTokens,output_tokens:F.usage.outputTokens}),n.inputTokens+=F.usage.inputTokens,n.outputTokens+=F.usage.outputTokens,F.usage.cacheRead&&(n.cacheRead=(n.cacheRead??0)+F.usage.cacheRead),F.usage.cacheWrite&&(n.cacheWrite=(n.cacheWrite??0)+F.usage.cacheWrite),C&&C>0)){let J=n.inputTokens+n.outputTokens+(n.reasoningTokens??0);J>=C&&(f.info(`[fork:${h}] budget exceeded (${J} / ${C} tokens), aborting`),M.abort("budget_exceeded"))}if(F.type==="tool_call"){let J={};try{J=JSON.parse(F.arguments??"{}")}catch{}bg(o,F.name,J),T?.(bl(o))}F.type==="error"&&(de=!1,O=F.error)}}catch(je){de=!1,O=je instanceof Error?je.message:String(je),f.warn(`[fork:${h}] error: ${O}`)}finally{M.signal.aborted||M.abort("fork_complete")}let Oe=Date.now()-e;return f.info(`[fork:${h}] finished in ${Oe}ms \u2014 ${r.length} events, usage: prompt=${n.inputTokens} completion=${n.outputTokens}, ok=${de}`),{events:r,totalUsage:n,progress:bl(o),durationMs:Oe,ok:de,error:O}}import{readFile as NI,readdir as LI}from"node:fs/promises";import{existsSync as OI}from"node:fs";import{join as jI}from"node:path";var $I={lesson:"lesson",debug:"lesson",gotcha:"lesson",fix:"lesson",preference:"preference",style:"preference",pattern:"pattern",convention:"pattern",practice:"pattern",fact:"fact",config:"fact",architecture:"fact",env:"fact",deploy:"fact",decision:"decision",choice:"decision",tradeoff:"decision",skill:"skill-learning",workflow:"skill-learning"},UI={lesson:[/(?:原来|root cause|turns out|the issue was|问题出在|踩坑|gotcha|pitfall)/i,/(?:以后|下次|remember to|don't forget|务必|切记)/i],preference:[/(?:我(?:喜欢|偏好|习惯)|I (?:prefer|like|always))/i,/(?:请(?:用|使用)|please use|always use)/i],pattern:[/(?:每次|always|whenever|pattern|惯例|convention|best practice)/i],fact:[/(?:架构|architecture|port|version|部署|deployed|环境|配置|config)/i],decision:[/(?:决定|decided|选择|chosen|采用|因为|because|rationale|trade-?off)/i],"skill-learning":[/(?:skill|workflow|tool|command|命令|工具)/i]};function FI(t){let e=t.replace(/\.md$/,"").toLowerCase();for(let[r,n]of Object.entries($I))if(e.startsWith(r+"-")||e.startsWith(r+"_")||e===r)return n;return null}function HI(t){let e=t.slice(0,500),r=null,n=0;for(let[o,s]of Object.entries(UI)){let i=s.filter(a=>a.test(e)).length;i>n&&(n=i,r=o)}return r}async function Rg(t){let e={},r=0,n=0;if(!OI(t))return{categories:e,totalFiles:0,uncategorizedCount:0};let o;try{o=await LI(t)}catch{return{categories:e,totalFiles:0,uncategorizedCount:0}}let s=o.filter(i=>i.endsWith(".md")&&i!=="INDEX.md");for(let i of s){let a=jI(t,i);try{let c=await NI(a,"utf-8");r++;let l=FI(i)??HI(c)??"uncategorized";l==="uncategorized"&&n++;let d=c.split(`
60
+ `)}};function fg(t,e,r,n){let o=PI(r,n);o&&t.emitSessionUpdate(e,o.type,o.payload)}function PI(t,e){switch(t){case"turn.delta":return{type:St.AGENT_MESSAGE_CHUNK,payload:{content:{type:"text",text:e.text}}};case"turn.reasoning_delta":return{type:St.AGENT_THOUGHT_CHUNK,payload:{content:{type:"text",text:e.delta}}};case"turn.tool_call":return{type:St.TOOL_CALL,payload:{toolCallId:e.callId,toolName:e.name,status:"in_progress",title:e.name,kind:"execute",rawInput:xI(e.arguments)}};case"turn.tool_result":return{type:St.TOOL_CALL_UPDATE,payload:{toolCallId:e.callId,status:e.ok?"completed":"failed",...e.outputPreview?{content:[{type:"content",content:{type:"text",text:e.outputPreview}}]}:{},...e.error?{content:[{type:"content",content:{type:"text",text:e.error}}]}:{}}};case"turn.tool_blocked":return{type:St.TOOL_CALL_UPDATE,payload:{toolCallId:e.callId,status:"failed",content:[{type:"content",content:{type:"text",text:e.reason??"blocked"}}]}};case"turn.plan_update":return{type:St.PLAN,payload:{entries:[{content:e.content,priority:"medium",status:"in_progress"}]}};case"turn.usage_update":{let r=e.usage,n=r?.inputTokens??r?.input_tokens??0,o=r?.outputTokens??r?.output_tokens??0;return{type:St.USAGE_UPDATE,payload:{used:n+o,size:r?.contextWindow??2e5}}}case"turn.end":return null;case"turn.error":return{type:St.AGENT_MESSAGE_CHUNK,payload:{content:{type:"text",text:`[Error] ${e.error?.message??"Unknown error"}`}}};case"turn.suggestions":return{type:St.AVAILABLE_COMMANDS_UPDATE,payload:{availableCommands:(e.items??[]).map(r=>({name:r.text,description:r.description??""}))}};case"turn.sidechain_started":return{type:ae.X_SUBAGENT_STARTED,payload:{agentId:String(e.depth??0),agentName:e.role,task:void 0}};case"turn.subagent_delta":return{type:ae.X_SUBAGENT_DELTA,payload:{agentId:e.subagentId??e.agentType,text:e.text}};case"turn.sidechain_completed":return{type:ae.X_SUBAGENT_ENDED,payload:{agentId:String(e.depth??0),result:void 0}};case"turn.media_result":return{type:ae.X_MEDIA_RESULT,payload:{mediaId:e.taskId??CI(),type:e.mediaType,url:e.url,metadata:{model:e.model,provider:e.provider}}};case"turn.media_progress":return{type:ae.X_MEDIA_PROGRESS,payload:{mediaId:e.taskId,progress:e.percent,stage:e.status}};case"turn.skill_instruction":return{type:ae.X_SKILL_INSTRUCTION,payload:{skillId:"unknown",instruction:String(e.instruction??"")}};case"turn.recovery":return{type:ae.X_RECOVERY,payload:{errorType:e.action,message:e.detail??"",action:"retry"}};case"turn.ask_user":return{type:ae.X_ASK_USER,payload:{question:(e.questions??[])[0]?.question??"",options:(e.questions??[])[0]?.options?.map(r=>r.label)}};case"session.info":return{type:ae.X_SESSION_INFO,payload:{sessionId:e.sessionId,model:e.model,metadata:{cwd:e.cwd,turnCount:e.turnCount}}};case"memory.updated":return{type:ae.X_MEMORY_UPDATED,payload:{memoryId:e.source,action:"updated",summary:e.summary}};case"team.member.notification":return{type:ae.X_TEAM_MEMBER_UPDATE,payload:{memberId:e.memberId,type:e.method,payload:e.params??{}}};case"solo.progress":return{type:ae.X_SOLO_STARTED,payload:{evaluationId:e.soloId,agents:[e.agentId],task:e.progress??""}};case"solo.agentDelta":return{type:ae.X_SUBAGENT_DELTA,payload:{agentId:e.agentId,text:e.text}};case"solo.evaluation":return{type:ae.X_SOLO_SELECTED,payload:{evaluationId:e.soloId,winnerId:e.winnerId,reason:e.reasoning}};case"product.taskStarted":return{type:ae.X_PRODUCT_TASK_STARTED,payload:{workflowId:e.productId,taskId:e.taskId,agentId:e.assignee}};case"product.taskCompleted":return{type:ae.X_PRODUCT_TASK_COMPLETED,payload:{workflowId:e.productId,taskId:e.taskId,agentId:"",result:e.result,status:"completed"}};case"product.taskFailed":return{type:ae.X_PRODUCT_TASK_COMPLETED,payload:{workflowId:e.productId,taskId:e.taskId,agentId:"",status:"failed"}};case"product.checkpointed":return{type:ae.X_PRODUCT_CHECKPOINT,payload:{workflowId:e.productId,checkpointId:e.timestamp,completedTasks:[]}};case"turn.start":case"turn.task_updated":case"turn.exec_progress":case"turn.heartbeat":case"turn.tool_use_summary":case"turn.artifact":case"turn.annotations":case"tool.approval.request":case"permission.rule_updated":case"pong":case"agents.status":case"agents.error":case"product.budgetWarning":case"product.completed":return null;default:return null}}function xI(t){if(t)try{return JSON.parse(t)}catch{return{raw:t}}}function CI(){return Math.random().toString(36).slice(2,10)}import{randomUUID as rf}from"node:crypto";import*as xl from"node:path";import{readFile as kl,writeFile as hs,stat as Ig,unlink as qI,mkdir as Eg}from"node:fs/promises";import{join as rn,resolve as Tg,isAbsolute as wg,normalize as Ag}from"node:path";import{randomUUID as WI}from"node:crypto";function hg(){return{toolUseCount:0,latestInputTokens:0,cumulativeOutputTokens:0,recentActivities:[]}}function II(t){return t.latestInputTokens+t.cumulativeOutputTokens}var EI=new Set(["grep","glob","search","Grep","Glob","list_dir","find_files"]),yg=new Set(["read_file","file_read","cat","head","tail","FileRead"]);function MI(t){return{isSearch:EI.has(t)||void 0,isRead:yg.has(t)||void 0}}function _I(t,e){let r=e.file_path??e.path??e.filePath;if(typeof r=="string")return`${yg.has(t)?"Reading":t.includes("write")||t.includes("edit")?"Editing":"Using"} ${r}`;let n=e.command??e.cmd;if(typeof n=="string")return`Running: ${n.length>60?n.slice(0,60)+"\u2026":n}`;let o=e.query??e.pattern??e.search;if(typeof o=="string")return`Searching: ${o}`}function vg(t,e){t.latestInputTokens=(e.input_tokens??0)+(e.cache_creation_input_tokens??0)+(e.cache_read_input_tokens??0),t.cumulativeOutputTokens+=e.output_tokens??0}function bg(t,e,r,n){t.toolUseCount++;let o=MI(e),s={toolName:e,input:r,activityDescription:n?.(e,r)??_I(e,r),isSearch:o.isSearch,isRead:o.isRead};for(t.recentActivities.push(s);t.recentActivities.length>5;)t.recentActivities.shift()}function bl(t){return{toolUseCount:t.toolUseCount,tokenCount:II(t),lastActivity:t.recentActivities.length>0?t.recentActivities[t.recentActivities.length-1]:void 0,recentActivities:[...t.recentActivities]}}import{randomUUID as kg}from"node:crypto";function DI(t){let e=new AbortController;return t&&(t.aborted?e.abort(t.reason):t.addEventListener("abort",()=>{e.abort(t.reason)},{once:!0})),e}async function tn(t){let e=Date.now(),r=[],n={inputTokens:0,outputTokens:0},o=hg(),{promptMessages:s,systemPrompt:i,tools:a,canUseTool:c,transport:l,toolInvoker:d,createAgentRunner:p,apiKey:u,model:m,log:f,hooks:g,forkLabel:h,maxTurns:b,temperature:v,parentSignal:R,onEvent:S,onProgress:T,budgetTokens:C,parentDepth:E}=t,M=DI(R),L=`fork-${h}-${kg().slice(0,8)}`,k=`fork-session-${kg().slice(0,8)}`;f.info(`[fork:${h}] starting \u2014 ${s.length} initial messages, model=${m}`);let Q=c?{invoke:async(je,F,J,H)=>{let Ee={};try{Ee=JSON.parse(J)}catch{}let Wt=c(F,Ee);return Wt.allowed?d.invoke(je,F,J,H):(f.info(`[fork:${h}] tool ${F} denied: ${Wt.reason}`),{result:"",error:Wt.reason})}}:d,de=!0,O;try{let je=p({transport:l,apiKey:u,toolInvoker:Q,log:f,hooks:g,maxRounds:b});for await(let F of je.run({turnId:L,sessionId:k,messages:s,tools:a,systemPrompt:i,config:{model:m,apiKey:u,temperature:v,maxOutputTokens:t.maxOutputTokens,parentDepth:E}},M.signal)){if(r.push(F),S?.(F),F.type==="end"&&F.usage&&(vg(o,{input_tokens:F.usage.inputTokens,output_tokens:F.usage.outputTokens}),n.inputTokens+=F.usage.inputTokens,n.outputTokens+=F.usage.outputTokens,F.usage.cacheRead&&(n.cacheRead=(n.cacheRead??0)+F.usage.cacheRead),F.usage.cacheWrite&&(n.cacheWrite=(n.cacheWrite??0)+F.usage.cacheWrite),C&&C>0)){let J=n.inputTokens+n.outputTokens+(n.reasoningTokens??0);J>=C&&(f.info(`[fork:${h}] budget exceeded (${J} / ${C} tokens), aborting`),M.abort("budget_exceeded"))}if(F.type==="tool_call"){let J={};try{J=JSON.parse(F.arguments??"{}")}catch{}bg(o,F.name,J),T?.(bl(o))}F.type==="error"&&(de=!1,O=F.error)}}catch(je){de=!1,O=je instanceof Error?je.message:String(je),f.warn(`[fork:${h}] error: ${O}`)}finally{M.signal.aborted||M.abort("fork_complete")}let Oe=Date.now()-e;return f.info(`[fork:${h}] finished in ${Oe}ms \u2014 ${r.length} events, usage: prompt=${n.inputTokens} completion=${n.outputTokens}, ok=${de}`),{events:r,totalUsage:n,progress:bl(o),durationMs:Oe,ok:de,error:O}}import{readFile as NI,readdir as LI}from"node:fs/promises";import{existsSync as OI}from"node:fs";import{join as jI}from"node:path";var $I={lesson:"lesson",debug:"lesson",gotcha:"lesson",fix:"lesson",preference:"preference",style:"preference",pattern:"pattern",convention:"pattern",practice:"pattern",fact:"fact",config:"fact",architecture:"fact",env:"fact",deploy:"fact",decision:"decision",choice:"decision",tradeoff:"decision",skill:"skill-learning",workflow:"skill-learning"},UI={lesson:[/(?:原来|root cause|turns out|the issue was|问题出在|踩坑|gotcha|pitfall)/i,/(?:以后|下次|remember to|don't forget|务必|切记)/i],preference:[/(?:我(?:喜欢|偏好|习惯)|I (?:prefer|like|always))/i,/(?:请(?:用|使用)|please use|always use)/i],pattern:[/(?:每次|always|whenever|pattern|惯例|convention|best practice)/i],fact:[/(?:架构|architecture|port|version|部署|deployed|环境|配置|config)/i],decision:[/(?:决定|decided|选择|chosen|采用|因为|because|rationale|trade-?off)/i],"skill-learning":[/(?:skill|workflow|tool|command|命令|工具)/i]};function FI(t){let e=t.replace(/\.md$/,"").toLowerCase();for(let[r,n]of Object.entries($I))if(e.startsWith(r+"-")||e.startsWith(r+"_")||e===r)return n;return null}function HI(t){let e=t.slice(0,500),r=null,n=0;for(let[o,s]of Object.entries(UI)){let i=s.filter(a=>a.test(e)).length;i>n&&(n=i,r=o)}return r}async function Rg(t){let e={},r=0,n=0;if(!OI(t))return{categories:e,totalFiles:0,uncategorizedCount:0};let o;try{o=await LI(t)}catch{return{categories:e,totalFiles:0,uncategorizedCount:0}}let s=o.filter(i=>i.endsWith(".md")&&i!=="INDEX.md");for(let i of s){let a=jI(t,i);try{let c=await NI(a,"utf-8");r++;let l=FI(i)??HI(c)??"uncategorized";l==="uncategorized"&&n++;let d=c.split(`
61
61
  `),p="";for(let m of d){let f=m.trim();if(!(!f||f.startsWith("#")||f.startsWith("---"))){p=f.slice(0,120);break}}let u=d.filter(m=>/^\s*[-*+]\s|^\s*\d+[.)]\s/.test(m)).length;e[l]||(e[l]=[]),e[l].push({filename:i,category:l,description:p,sizeBytes:Buffer.byteLength(c,"utf-8"),entryCount:u})}catch{}}return{categories:e,totalFiles:r,uncategorizedCount:n}}var BI={fact:"SUPERSEDE: If a newer fact contradicts an older one (e.g. port changed, version updated), update the existing entry in-place. Do not keep both \u2014 stale facts cause confusion. Convert relative dates to absolute. Mark the update date.",lesson:"ACCUMULATE: Lessons learned are valuable even when old. Append new insights to existing lesson files. Only remove a lesson if it's provably wrong (not just outdated). Group related lessons under the same topic file.",preference:"OVERWRITE: User preferences evolve. If a newer statement contradicts an older preference, the newer one wins. Remove the old entry and write the current preference. Keep preferences concise (one line each).",pattern:"MERGE: If multiple entries describe the same pattern, merge them into one authoritative entry with examples. Remove redundant duplicates. A pattern that's been superseded by a better practice should be removed.",decision:"UPDATE: Decisions have context and rationale. When a decision changes, don't delete the old one \u2014 add an 'Updated (date):' section explaining what changed and why. This preserves the decision history.","skill-learning":"CONSOLIDATE: Group related skill entries by tool/workflow. Remove entries for skills that are now obvious or well-documented elsewhere. Keep the most actionable version of each skill note.",uncategorized:"CLASSIFY: Try to infer a category from the content. If it matches lesson/preference/pattern/fact/decision, rename the file with the appropriate prefix. If truly uncategorizable, leave as-is but ensure it has a clear description."};function Sg(t){if(t.totalFiles===0)return"\n## Category Context\n\nNo existing memory files found. Create new files using the naming convention: `<category>-<topic>.md` (e.g. `lesson-docker.md`, `fact-ports.md`, `decision-framework.md`).\n";let e=[];e.push(`
62
62
  ## Category Context (${t.totalFiles} files)
63
63
  `),e.push(`Use category-specific merge rules when updating files:
@@ -203,11 +203,11 @@ Return a brief summary of what you consolidated, updated, or pruned. If nothing
203
203
  `)),t.id!==void 0&&this.sendResponse(t.id,{log:o})}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 kf(t){try{let e=t.params;if(!e?.agentId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"agentId is required."});return}let r=await this.ensureAgentConfigStore();this.acpDetector.setConfigStore(r.getData());let o=this.acpDetector.list().find(i=>i.id===e.agentId);if(!o){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,error:`Agent ${e.agentId} not found`,durationMs:0});return}if(o.status==="not_installed"){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,error:`Agent ${e.agentId} is not installed`,durationMs:0});return}let s=Date.now();t.id!==void 0&&this.sendResponse(t.id,{ok:o.status==="available",version:o.version,capabilities:o.capabilities,error:o.status!=="available"?`Agent status: ${o.status}`:void 0,durationMs:Date.now()-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 Rf(t){let e=null,r="";try{let n=t.params??{},o=typeof n.agentId=="string"?n.agentId.trim():"",s=typeof n.prompt=="string"?n.prompt:"";if(!o||!s.trim()){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"agentId and prompt are required."});return}let i=await this.ensureAgentConfigStore();this.acpDetector.setConfigStore(i.getData()),this.acpDetector.scan(!1);let a=this.acpDetector.buildExternalDescriptor(o);if(!a){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:`Agent ${o} is not available or not ACP-compatible.`});return}let c=typeof n.cwd=="string"&&n.cwd?n.cwd:typeof this.getActiveProjectRoot=="function"?this.getActiveProjectRoot():process.cwd(),l=typeof n.timeoutMs=="number"&&n.timeoutMs>0?n.timeoutMs:3e5;r=`chat-${o}-${aM().slice(0,8)}`;let d=[];e=new lt({onNotification:(f,g,h)=>{if(g!=="turn.delta")return;let b=typeof h?.text=="string"?h.text:"";b&&d.push(b)},onMcpToolCall:async(f,g,h)=>typeof this.handleMcpToolCall=="function"?this.handleMcpToolCall(f,g,h):{ok:!1,error:"MCP tool call unavailable"},log:{info:f=>this.log?.(`[agents.prompt] ${f}`),warn:f=>this.log?.(`[agents.prompt] WARN: ${f}`),debug:f=>this.log?.(`[agents.prompt] ${f}`)},sessionDir:Ts.join(X(),"agent-logs")}),await e.spawn({memberId:r,name:`chat-${o}`,cwd:c,prompt:s,external:a,systemPrompt:typeof n.systemPrompt=="string"?n.systemPrompt:void 0});let p=await e.sendTask(r,s,{timeout:l}),u=d.join("")||(typeof p?.content=="string"?p.content:""),m=e.getUsageTracker(r)?.getUsage();t.id!==void 0&&this.sendResponse(t.id,{ok:!0,agentId:o,content:u,stopReason:p?.stopReason,usage:m?{inputTokens:m.inputTokens,outputTokens:m.outputTokens,totalTokens:m.totalTokens,cacheRead:m.cachedReadTokens,thoughtTokens:m.thoughtTokens,cost:m.cost}:void 0})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:n instanceof Error?n.message:String(n)})}finally{if(e&&r){try{e.kill(r)}catch{}try{e.dispose()}catch{}}}}G();import{randomUUID as $l}from"node:crypto";import{mkdir as hM,readFile as yM,writeFile as vM}from"node:fs/promises";import{dirname as bM}from"node:path";var cM=[{kind:"assistant-preset",id:"builtin.code",source:"builtin",name:"Code Assistant",nameI18n:{"zh-CN":"\u4EE3\u7801\u52A9\u624B","en-US":"Code Assistant"},description:"Write, debug, and refactor code",descriptionI18n:{"zh-CN":"\u7F16\u5199\u3001\u8C03\u8BD5\u548C\u91CD\u6784\u4EE3\u7801","en-US":"Write, debug, and refactor code"},avatar:"code",enabled:!0,sortOrder:10,enabledSkills:["code","terminal","memory"],disabledBuiltinSkills:[],context:"\u4EE3\u7801 Assistant preset: focus on implementation, debugging, refactoring, tests, and maintainable engineering judgment.",modelHints:["coding","architecture"],prompts:[{id:"code-review",title:"Review Code",titleI18n:{"zh-CN":"\u4EE3\u7801\u8BC4\u5BA1","en-US":"Review Code"},description:"Find correctness risks and missing tests",descriptionI18n:{"zh-CN":"\u68C0\u67E5\u6B63\u786E\u6027\u98CE\u9669\u548C\u7F3A\u5931\u6D4B\u8BD5","en-US":"Find correctness risks and missing tests"},prompt:"Review the current code for correctness, architecture, and missing tests.",promptI18n:{"zh-CN":"\u8BF7\u8BC4\u5BA1\u5F53\u524D\u4EE3\u7801\u7684\u6B63\u786E\u6027\u3001\u67B6\u6784\u98CE\u9669\u548C\u7F3A\u5931\u6D4B\u8BD5\u3002","en-US":"Review the current code for correctness, architecture, and missing tests."},icon:"code"},{id:"debug-failure",title:"Debug Failure",titleI18n:{"zh-CN":"\u8C03\u8BD5\u5931\u8D25","en-US":"Debug Failure"},description:"Analyze a failing behavior or test",descriptionI18n:{"zh-CN":"\u5206\u6790\u5931\u8D25\u884C\u4E3A\u6216\u6D4B\u8BD5","en-US":"Analyze a failing behavior or test"},prompt:"Help me debug this failure from symptoms to root cause, then propose the smallest safe fix.",promptI18n:{"zh-CN":"\u8BF7\u4ECE\u73B0\u8C61\u5230\u6839\u56E0\u5E2E\u6211\u8C03\u8BD5\u8FD9\u4E2A\u5931\u8D25\uFF0C\u5E76\u7ED9\u51FA\u6700\u5C0F\u5B89\u5168\u4FEE\u590D\u3002","en-US":"Help me debug this failure from symptoms to root cause, then propose the smallest safe fix."},icon:"code"}],readonly:!0},{kind:"assistant-preset",id:"builtin.docs",source:"builtin",name:"Documentation",nameI18n:{"zh-CN":"\u6587\u6863\u751F\u6210","en-US":"Documentation"},description:"Generate docs, comments, and guides",descriptionI18n:{"zh-CN":"\u751F\u6210\u6587\u6863\u3001\u6CE8\u91CA\u548C\u8BF4\u660E","en-US":"Generate docs, comments, and guides"},avatar:"file-text",enabled:!0,sortOrder:20,enabledSkills:["documents","memory"],disabledBuiltinSkills:[],context:"Assistant preset: produce clear product, technical, and operational writing with concise structure.",modelHints:["writing","documentation"],prompts:[{id:"write-doc",title:"Write Documentation",titleI18n:{"zh-CN":"\u751F\u6210\u6587\u6863","en-US":"Write Documentation"},description:"Draft docs for the current feature",descriptionI18n:{"zh-CN":"\u4E3A\u5F53\u524D\u529F\u80FD\u8D77\u8349\u6587\u6863","en-US":"Draft docs for the current feature"},prompt:"Draft concise documentation for the current feature or workflow.",promptI18n:{"zh-CN":"\u8BF7\u4E3A\u5F53\u524D\u529F\u80FD\u6216\u5DE5\u4F5C\u6D41\u8D77\u8349\u4E00\u4EFD\u6E05\u6670\u7B80\u6D01\u7684\u6587\u6863\u3002","en-US":"Draft concise documentation for the current feature or workflow."},icon:"file-text"},{id:"explain-code",title:"Explain Code",titleI18n:{"zh-CN":"\u89E3\u91CA\u4EE3\u7801","en-US":"Explain Code"},description:"Turn implementation details into explanation",descriptionI18n:{"zh-CN":"\u628A\u5B9E\u73B0\u7EC6\u8282\u6574\u7406\u6210\u8BF4\u660E","en-US":"Turn implementation details into explanation"},prompt:"Explain this implementation clearly, including key decisions and tradeoffs.",promptI18n:{"zh-CN":"\u8BF7\u6E05\u6670\u89E3\u91CA\u8FD9\u6BB5\u5B9E\u73B0\uFF0C\u5305\u62EC\u5173\u952E\u51B3\u7B56\u548C\u53D6\u820D\u3002","en-US":"Explain this implementation clearly, including key decisions and tradeoffs."},icon:"file-text"}],readonly:!0},{kind:"assistant-preset",id:"builtin.design",source:"builtin",name:"Architecture Design",nameI18n:{"zh-CN":"\u65B9\u6848\u8BBE\u8BA1","en-US":"Architecture Design"},description:"Analyze requirements and design solutions",descriptionI18n:{"zh-CN":"\u5206\u6790\u9700\u6C42\u3001\u8BBE\u8BA1\u67B6\u6784\u65B9\u6848","en-US":"Analyze requirements and design solutions"},avatar:"design",enabled:!0,sortOrder:30,enabledSkills:["frontend","visual-design"],disabledBuiltinSkills:[],context:"Assistant preset: focus on product experience, architecture shape, visual hierarchy, interaction states, and user-facing polish.",modelHints:["design","frontend"],prompts:[{id:"design-flow",title:"Design Flow",titleI18n:{"zh-CN":"\u8BBE\u8BA1\u6D41\u7A0B","en-US":"Design Flow"},description:"Shape a user flow or architecture",descriptionI18n:{"zh-CN":"\u8BBE\u8BA1\u7528\u6237\u6D41\u7A0B\u6216\u67B6\u6784","en-US":"Shape a user flow or architecture"},prompt:"Design or critique the current user flow with attention to clarity and polish.",promptI18n:{"zh-CN":"\u8BF7\u8BBE\u8BA1\u6216\u8BC4\u5BA1\u5F53\u524D\u7528\u6237\u6D41\u7A0B\uFF0C\u91CD\u70B9\u5173\u6CE8\u6E05\u6670\u5EA6\u548C\u4F53\u9A8C\u8D28\u611F\u3002","en-US":"Design or critique the current user flow with attention to clarity and polish."},icon:"design"},{id:"architecture-plan",title:"Architecture Plan",titleI18n:{"zh-CN":"\u67B6\u6784\u65B9\u6848","en-US":"Architecture Plan"},description:"Turn requirements into an execution plan",descriptionI18n:{"zh-CN":"\u628A\u9700\u6C42\u62C6\u6210\u6267\u884C\u65B9\u6848","en-US":"Turn requirements into an execution plan"},prompt:"Analyze this requirement and propose a phased architecture and execution plan.",promptI18n:{"zh-CN":"\u8BF7\u5206\u6790\u8FD9\u4E2A\u9700\u6C42\uFF0C\u5E76\u7ED9\u51FA\u5206\u9636\u6BB5\u67B6\u6784\u4E0E\u6267\u884C\u8BA1\u5212\u3002","en-US":"Analyze this requirement and propose a phased architecture and execution plan."},icon:"design"}],readonly:!0},{kind:"assistant-preset",id:"builtin.info",source:"builtin",name:"Information Processing",nameI18n:{"zh-CN":"\u4FE1\u606F\u6574\u7406","en-US":"Information Processing"},description:"Summarize, extract, and organize information",descriptionI18n:{"zh-CN":"\u603B\u7ED3\u3001\u63D0\u53D6\u548C\u6574\u7406\u4FE1\u606F","en-US":"Summarize, extract, and organize information"},avatar:"mail",enabled:!0,sortOrder:40,enabledSkills:["research","memory"],disabledBuiltinSkills:[],context:"Assistant preset: answer factual questions, summarize context, extract signal, and keep uncertainty explicit.",modelHints:["research","analysis"],prompts:[{id:"summarize",title:"Summarize",titleI18n:{"zh-CN":"\u603B\u7ED3\u4FE1\u606F","en-US":"Summarize"},description:"Summarize relevant context",descriptionI18n:{"zh-CN":"\u603B\u7ED3\u76F8\u5173\u4E0A\u4E0B\u6587","en-US":"Summarize relevant context"},prompt:"Summarize the relevant context and call out unresolved questions.",promptI18n:{"zh-CN":"\u8BF7\u603B\u7ED3\u76F8\u5173\u4E0A\u4E0B\u6587\uFF0C\u5E76\u6307\u51FA\u4ECD\u672A\u89E3\u51B3\u7684\u95EE\u9898\u3002","en-US":"Summarize the relevant context and call out unresolved questions."},icon:"mail"},{id:"extract-actions",title:"Extract Actions",titleI18n:{"zh-CN":"\u63D0\u53D6\u884C\u52A8\u9879","en-US":"Extract Actions"},description:"Organize decisions and next steps",descriptionI18n:{"zh-CN":"\u6574\u7406\u51B3\u7B56\u548C\u4E0B\u4E00\u6B65","en-US":"Organize decisions and next steps"},prompt:"Extract decisions, open questions, and next actions from this context.",promptI18n:{"zh-CN":"\u8BF7\u4ECE\u8FD9\u4E9B\u4E0A\u4E0B\u6587\u4E2D\u63D0\u53D6\u51B3\u7B56\u3001\u5F00\u653E\u95EE\u9898\u548C\u4E0B\u4E00\u6B65\u884C\u52A8\u3002","en-US":"Extract decisions, open questions, and next actions from this context."},icon:"mail"}],readonly:!0}];function Dl(){return cM.map(t=>({...t,nameI18n:t.nameI18n?{...t.nameI18n}:void 0,descriptionI18n:t.descriptionI18n?{...t.descriptionI18n}:void 0,enabledSkills:[...t.enabledSkills],disabledBuiltinSkills:[...t.disabledBuiltinSkills],modelHints:[...t.modelHints],prompts:t.prompts.map(e=>({...e,titleI18n:e.titleI18n?{...e.titleI18n}:void 0,descriptionI18n:e.descriptionI18n?{...e.descriptionI18n}:void 0,promptI18n:e.promptI18n?{...e.promptI18n}:void 0}))}))}import{existsSync as Sf,readdirSync as lM,readFileSync as dM}from"node:fs";import{join as uM}from"node:path";var no=new Map,Tf=new Map;function ro(t,e,r){let n={pluginId:t,manifestPath:e,assistants:[],diagnostics:[],reservedIds:new Set};if(no.set(t,n),!r||typeof r!="object")return Ze(n,"error","Assistant manifest must be a JSON object."),[];let o=r.assistants;if(o===void 0)return[];if(!Array.isArray(o))return Ze(n,"error","Assistant manifest field assistants must be an array."),[];let s=new Map;for(let i of o){let a=typeof i?.id=="string"?i.id.trim():"";if(a){let c=s.get(a);c?c.push(i):s.set(a,[i])}}for(let[i,a]of s)a.length>1&&(n.reservedIds.add(i),Ze(n,"error",`Duplicate assistant id in plugin manifest: ${i}`,i));for(let i of o){let a=typeof i?.id=="string"?i.id.trim():"";if(a&&n.reservedIds.has(a))continue;let c=pM(t,i,n);if(!c)continue;let l=gM(c.id,t);if(l){n.reservedIds.add(c.id),Ze(n,"error",`Assistant id already contributed by plugin ${l}: ${c.id}`,c.id);continue}n.assistants.push(c),n.reservedIds.add(c.id)}return n.assistants.map(Pf)}function Ll(t){let e=Tf.get(t)??new Set,r=new Set;if(Sf(t)){let n;try{n=lM(t,{withFileTypes:!0})}catch{n=[]}for(let o of n){if(!o.isDirectory()||o.name.startsWith(".")||o.name.startsWith("_"))continue;let s=o.name,i=uM(t,s,"assistants.json");if(Sf(i)){r.add(s);try{ro(s,i,jl(dM(i,"utf8")))}catch{ro(s,i,null)}}}}for(let n of e)r.has(n)||Ol(n);Tf.set(t,r)}function Ol(t){no.delete(t)}function wf(){return Array.from(no.values()).flatMap(t=>t.assistants.map(Pf))}function Af(){return Array.from(no.values()).flatMap(t=>t.diagnostics.map(e=>({...e})))}function pM(t,e,r){if(!e||typeof e!="object")return Ze(r,"error","Assistant entry must be an object."),null;let n=e,o=typeof n.id=="string"?n.id.trim():"";if(!o)return Ze(r,"error","Assistant id is required."),null;if(!o.startsWith(`plugin.${t}.`))return Ze(r,"error",`Plugin assistant id must start with plugin.${t}.`,o),null;let s=typeof n.name=="string"?n.name.trim():"";if(!s)return Ze(r,"error","Assistant name is required.",o),null;if(!Array.isArray(n.prompts))return Ze(r,"error","Assistant prompts must be an array.",o),null;let i=[];for(let a of n.prompts){let c=mM(r,o,a);c&&i.push(c)}return i.length===0?(Ze(r,"error","Assistant must include at least one valid prompt template.",o),null):{kind:"assistant-preset",id:o,source:"plugin",pluginId:t,name:s,nameI18n:to(n.nameI18n)?{...n.nameI18n}:void 0,description:typeof n.description=="string"?n.description:void 0,descriptionI18n:to(n.descriptionI18n)?{...n.descriptionI18n}:void 0,avatar:typeof n.avatar=="string"?n.avatar:void 0,enabled:typeof n.enabled=="boolean"?n.enabled:!0,sortOrder:typeof n.sortOrder=="number"&&Number.isFinite(n.sortOrder)?n.sortOrder:500,enabledSkills:Nl(r,o,"enabledSkills",n.enabledSkills),disabledBuiltinSkills:Nl(r,o,"disabledBuiltinSkills",n.disabledBuiltinSkills),context:typeof n.context=="string"?n.context:void 0,prompts:i,modelHints:Nl(r,o,"modelHints",n.modelHints??n.models),readonly:!0}}function jl(t){return JSON.parse(t.replace(/^\uFEFF/,""))}function mM(t,e,r){if(!r||typeof r!="object")return Ze(t,"error","Prompt template must be an object.",e),null;let n=r,o=typeof n.id=="string"?n.id.trim():"",s=typeof n.title=="string"?n.title.trim():"",i=typeof n.prompt=="string"?n.prompt:"";return!o||!s||!i.trim()?(Ze(t,"error","Prompt template requires id, title, and prompt.",e),null):{id:o,title:s,titleI18n:to(n.titleI18n)?{...n.titleI18n}:void 0,description:typeof n.description=="string"?n.description:void 0,descriptionI18n:to(n.descriptionI18n)?{...n.descriptionI18n}:void 0,prompt:i,promptI18n:to(n.promptI18n)?{...n.promptI18n}:void 0,icon:typeof n.icon=="string"?n.icon:void 0}}function Nl(t,e,r,n){return n===void 0?[]:!Array.isArray(n)||!n.every(o=>typeof o=="string")?(Ze(t,"error",`${r} must be an array of strings.`,e),[]):n.map(o=>o.trim()).filter(Boolean)}function gM(t,e){for(let r of no.values())if(r.pluginId!==e&&(r.assistants.some(n=>n.id===t)||r.reservedIds.has(t)))return r.pluginId;return null}function Ze(t,e,r,n){t.diagnostics.push({pluginId:t.pluginId,manifestPath:t.manifestPath,severity:e,message:r,assistantId:n})}function to(t){return!!t&&typeof t=="object"&&Object.values(t).every(e=>typeof e=="string")}function fM(t){return{...t,titleI18n:t.titleI18n?{...t.titleI18n}:void 0,descriptionI18n:t.descriptionI18n?{...t.descriptionI18n}:void 0,promptI18n:t.promptI18n?{...t.promptI18n}:void 0}}function Pf(t){return{...t,nameI18n:t.nameI18n?{...t.nameI18n}:void 0,descriptionI18n:t.descriptionI18n?{...t.descriptionI18n}:void 0,enabledSkills:[...t.enabledSkills],disabledBuiltinSkills:[...t.disabledBuiltinSkills],modelHints:[...t.modelHints],prompts:t.prompts.map(fM)}}var kM=2e4;async function oo(){let t=Wn();try{let e=JSON.parse(await yM(t,"utf-8"));return{version:e.version??1,assistants:Array.isArray(e.assistants)?e.assistants.filter(r=>r?.kind==="assistant-preset"):[],stateOverrides:e.stateOverrides&&typeof e.stateOverrides=="object"?e.stateOverrides:{}}}catch(e){if(e.code==="ENOENT")return{version:1,assistants:[],stateOverrides:{}};throw e}}async function RM(){return(await oo()).assistants??[]}async function Ul(t){let e=Wn();await hM(bM(e),{recursive:!0}),await vM(e,`${JSON.stringify({version:1,assistants:t.assistants??[],stateOverrides:t.stateOverrides??{}},null,2)}
204
204
  `,"utf-8")}function xf(t){return{...t,titleI18n:t.titleI18n?{...t.titleI18n}:void 0,descriptionI18n:t.descriptionI18n?{...t.descriptionI18n}:void 0,promptI18n:t.promptI18n?{...t.promptI18n}:void 0}}function ws(t,e){if(t===void 0)return[];if(!Array.isArray(t)||!t.every(r=>typeof r=="string"))throw new Error(`${e} must be an array of strings.`);return t.map(r=>r.trim()).filter(Boolean)}function SM(t){if(!t||typeof t!="object")throw new Error("Prompt template is required.");let e=typeof t.id=="string"?t.id.trim():"",r=typeof t.title=="string"?t.title.trim():"",n=typeof t.prompt=="string"?t.prompt:"";if(!e)throw new Error("Prompt template id is required.");if(!r)throw new Error("Prompt template title is required.");if(!n.trim())throw new Error("Prompt template prompt is required.");if(n.length>kM)throw new Error("Prompt template prompt is too long.");return xf({...t,id:e,title:r,description:typeof t.description=="string"?t.description:void 0,prompt:n,icon:typeof t.icon=="string"?t.icon:void 0})}function TM(t){let e=t.id?.trim()||`user.${$l()}`;if(e.startsWith("builtin."))throw new Error("Cannot overwrite builtin assistant through the user profile store.");if(e.startsWith("plugin."))throw new Error("User assistant id must start with user.");if(!e.startsWith("user."))throw new Error("User assistant id must start with user.");if(!t.name.trim())throw new Error("Assistant name is required.");if(!Array.isArray(t.prompts))throw new Error("Assistant prompts must be an array.");return{kind:"assistant-preset",id:e,source:"user",name:t.name.trim(),nameI18n:t.nameI18n?{...t.nameI18n}:void 0,description:t.description,descriptionI18n:t.descriptionI18n?{...t.descriptionI18n}:void 0,avatar:t.avatar,enabled:t.enabled??!0,sortOrder:t.sortOrder??1e3,enabledSkills:ws(t.enabledSkills,"enabledSkills"),disabledBuiltinSkills:ws(t.disabledBuiltinSkills,"disabledBuiltinSkills"),context:t.context,prompts:t.prompts.map(SM),modelHints:ws(t.modelHints,"modelHints"),readonly:!1}}function wM(t){let e={};if(t.enabled!==void 0){if(typeof t.enabled!="boolean")throw new Error("enabled must be boolean.");e.enabled=t.enabled}if(t.sortOrder!==void 0){if(typeof t.sortOrder!="number"||!Number.isFinite(t.sortOrder))throw new Error("sortOrder must be a finite number.");e.sortOrder=t.sortOrder}return t.modelHints!==void 0&&(e.modelHints=ws(t.modelHints,"modelHints")),e}function Cf(t,e){return e?{...t,enabled:e.enabled??t.enabled,sortOrder:e.sortOrder??t.sortOrder,modelHints:e.modelHints?[...e.modelHints]:t.modelHints}:t}async function Ir(t={}){Ll(ns());for(let i of t.pluginManifestDirectories??[])Ll(i);let e=await oo(),r=Dl(),n=wf(),o=e.assistants??[],s=e.stateOverrides??{};return[...r,...n,...o].map(i=>Cf(i,s[i.id])).sort((i,a)=>(i.sortOrder??0)-(a.sortOrder??0))}function If(){return Af()}async function As(t){let e=(await Ir()).find(r=>r.id===t);if(!e)throw new Error(`Unknown assistant preset: ${t}`);return{assistantId:e.id,context:e.context,enabledSkillNames:[...e.enabledSkills],disabledBuiltinSkillNames:[...e.disabledBuiltinSkills],modelHints:[...e.modelHints],prompts:e.prompts.map(xf)}}async function so(t){let e=TM(t),r=await oo(),n=(r.assistants??[]).filter(o=>o.id!==e.id);return n.push(e),await Ul({...r,assistants:n}),e}async function Ef(t){if(t.id&&(await Ir()).some(e=>e.id===t.id))throw new Error(`Assistant id already exists: ${t.id}`);return so({...t,id:t.id??`user.${$l()}`})}async function Fl(t){let e=t.id?.trim();if(!e||!e.startsWith("user."))throw new Error("Cannot update non-user assistant.");if(!(await RM()).find(n=>n.id===e))throw new Error(`Cannot update non-user assistant: ${e}`);return so({...t,id:e,source:"user",kind:"assistant-preset",readonly:!1})}async function Mf(t){if(t.startsWith("builtin."))throw new Error("Cannot delete builtin assistant.");let e=await oo(),r=(e.assistants??[]).filter(n=>n.id!==t);await Ul({...e,assistants:r})}async function _f(t,e){let r=(await Ir()).find(i=>i.id===t);if(!r)throw new Error(`Unknown assistant preset: ${t}`);let n=wM(e);if(r.source==="user")return Fl({...r,enabled:n.enabled??r.enabled,sortOrder:n.sortOrder??r.sortOrder,modelHints:n.modelHints??r.modelHints});let o=await oo(),s={...o.stateOverrides??{},[t]:{...o.stateOverrides?.[t]??{},...n}};return await Ul({...o,stateOverrides:s}),Cf(r,s[t])}async function Df(t){let e=Dl().find(n=>n.id===t&&n.source==="builtin");if(!e)throw new Error(`Unknown builtin assistant preset: ${t}`);let r=$l().slice(0,8);return so({...e,id:`user.${e.id.replace(/^builtin\./,"")}.${r}`,source:"user",name:`${e.name} Copy`,nameI18n:{...e.nameI18n??{},"zh-CN":`${e.nameI18n?.["zh-CN"]??e.name} \u526F\u672C`,"en-US":`${e.nameI18n?.["en-US"]??e.name} Copy`},sortOrder:1e3+(e.sortOrder??0),readonly:!1})}G();function Be(t,e,r){e!==void 0&&t.sendResponse(e,void 0,{code:y.INVALID_PARAMS,message:r})}function Er(t){return t.params&&typeof t.params=="object"?t.params:{}}async function Hl(t){if(t.id===void 0)return;let e=this.getActiveProjectRoot?.(),r=e?[os(e)]:[];this.sendResponse(t.id,{assistants:await Ir({pluginManifestDirectories:r}),diagnostics:If()})}async function Bl(t){if(t.id===void 0)return;let r=Er(t).assistantId;if(typeof r!="string"||r.trim().length===0){Be(this,t.id,"Missing required param: assistantId");return}try{this.sendResponse(t.id,await As(r))}catch(n){Be(this,t.id,n instanceof Error?n.message:String(n))}}async function ql(t){if(t.id===void 0)return;let e=Er(t).assistantId;if(typeof e!="string"||e.trim().length===0){Be(this,t.id,"Missing required param: assistantId");return}try{this.sendResponse(t.id,{assistant:await Df(e)})}catch(r){Be(this,t.id,r instanceof Error?r.message:String(r))}}async function Wl(t){if(t.id===void 0)return;let e=Er(t).assistant;if(!e||typeof e!="object"){Be(this,t.id,"Missing required param: assistant");return}try{this.sendResponse(t.id,{assistant:await so(e)})}catch(r){Be(this,t.id,r instanceof Error?r.message:String(r))}}async function Gl(t){if(t.id===void 0)return;let e=Er(t).assistant;if(!e||typeof e!="object"){Be(this,t.id,"Missing required param: assistant");return}try{this.sendResponse(t.id,{assistant:await Ef(e)})}catch(r){Be(this,t.id,r instanceof Error?r.message:String(r))}}async function Kl(t){if(t.id===void 0)return;let e=Er(t).assistant;if(!e||typeof e!="object"){Be(this,t.id,"Missing required param: assistant");return}try{this.sendResponse(t.id,{assistant:await Fl(e)})}catch(r){Be(this,t.id,r instanceof Error?r.message:String(r))}}async function zl(t){if(t.id===void 0)return;let e=Er(t),r=e.assistantId;if(typeof r!="string"||r.trim().length===0){Be(this,t.id,"Missing required param: assistantId");return}try{this.sendResponse(t.id,{assistant:await _f(r,{enabled:e.enabled,sortOrder:e.sortOrder,modelHints:e.modelHints})})}catch(n){Be(this,t.id,n instanceof Error?n.message:String(n))}}async function Vl(t){if(t.id===void 0)return;let e=Er(t).assistantId;if(typeof e!="string"||e.trim().length===0){Be(this,t.id,"Missing required param: assistantId");return}try{await Mf(e),this.sendResponse(t.id,{ok:!0})}catch(r){Be(this,t.id,r instanceof Error?r.message:String(r))}}G();import*as ln from"node:fs/promises";import*as Ph from"node:path";He();var AM=/^[a-z0-9][a-z0-9_.:-]{0,79}$/i,PM=new Set(["journeyDay","count"]),xM=new Set(["blocked"]),CM=new Set(["R0","R1","R2","R3"]),IM=new Set(["aix","android","darwin","freebsd","ios","linux","openbsd","sunos","win32"]),EM={"community.journey.view":new Set(["surface","petState","journeyDay","platform"]),"community.share.generated":new Set(["surface","action","source","petState","journeyDay","platform"]),"community.sandbox.violation":new Set(["surface","action","source","ruleId","riskTier","platform","count","blocked"]),"community.desensitization.hit":new Set(["surface","action","source","ruleId","riskTier","platform","count","blocked"])};function Ps(t,e){if(!e||typeof e!="object"||Array.isArray(e))return;let r=EM[t],n={};for(let[o,s]of Object.entries(e)){if(!r.has(o))continue;let i=MM(o,s);i!==void 0&&(n[o]=i)}return Object.keys(n).length>0?n:void 0}function MM(t,e){if(PM.has(t))return typeof e=="number"&&Number.isInteger(e)&&e>=0&&e<=1e5?e:void 0;if(xM.has(t))return typeof e=="boolean"?e:void 0;if(t==="riskTier")return typeof e=="string"&&CM.has(e)?e:void 0;if(t==="platform")return typeof e=="string"&&IM.has(e)?e:void 0;if(typeof e!="string")return;let r=e.trim();return AM.test(r)?r:void 0}function _M(t){let e=NM(t.baseUrl),r=t.fetchFn??fetch,n=t.token.trim();return{async getConsent(){return Lf(r,e,n,"GET")},async setConsent(o){return Lf(r,e,n,"PUT",o)},async matchRegistry(o){let s=o.intent.trim();if(!s)throw new Error("intent is required.");let i=OM(o.topK),a=await wt(r,dt(t.baseUrl,"/api/v15/registry/match"),n,"POST",{intent:s,topK:i,prefer:o.preferOfficial===!1?"relevance":"official",canonicalOnly:!0});return(ut(a)&&Array.isArray(a.matches)?a.matches:[]).map(jM).filter(l=>!!l).slice(0,i)},async publishSkill(o){return Nf(r,t.baseUrl,n,"skill",o)},async publishPet(o){return Nf(r,t.baseUrl,n,"pet",o)},async recordSignal(o){let s=encodeURIComponent(o.resourceId.trim());if(!s)throw new Error("resourceId is required.");let i=await wt(r,dt(t.baseUrl,`/api/v15/registry/resources/${s}/signal`),n,"POST",{event:o.event,attribution:o.attribution?.trim()||void 0,metadata:o.metadata});if(ut(i)&&i.accepted===!0)return{accepted:!0};throw new Error("Community hub returned an invalid signal response.")},async recordTelemetry(o){let s=Ps(o.event,o.metadata),i=await wt(r,dt(t.baseUrl,"/api/v15/registry/telemetry"),n,"POST",{event:o.event,metadata:s});if(ut(i)&&i.accepted===!0)return{accepted:!0};throw new Error("Community hub returned an invalid telemetry response.")},async listSharedResources(){let o=await wt(r,dt(t.baseUrl,"/api/v15/registry/mine"),n,"GET");return(ut(o)&&Array.isArray(o.resources)?o.resources:[]).map(xs).filter(i=>!!i)},async withdrawSharedResource(o,s){let i=encodeURIComponent(o.trim());if(!i)throw new Error("resourceId is required.");let a=await wt(r,dt(t.baseUrl,`/api/v15/registry/resources/${i}/withdraw`),n,"POST",{reason:s?.trim()||void 0}),c=xs(a);if(!c)throw new Error("Community hub returned an invalid resource.");return c},async withdrawSharedResources(o){let s=await wt(r,dt(t.baseUrl,"/api/v15/registry/community-consent/withdraw-shared"),n,"POST",{reason:o?.trim()||void 0});return(ut(s)&&Array.isArray(s.resources)?s.resources:[]).map(xs).filter(a=>!!a)},async listNotices(o={}){let s=o.includeRead?"?includeRead=true":"",i=await wt(r,dt(t.baseUrl,`/api/v15/registry/notices${s}`),n,"GET");return(ut(i)&&Array.isArray(i.notices)?i.notices:[]).map(Of).filter(c=>!!c)},async markNoticeRead(o){if(!Number.isSafeInteger(o)||o<1)throw new Error("noticeId is required.");let s=await wt(r,dt(t.baseUrl,`/api/v15/registry/notices/${o}/read`),n,"POST"),i=Of(s);if(!i)throw new Error("Community hub returned an invalid notice.");return i},async resolveInstall(o,s){let i=encodeURIComponent(o.trim());if(!i)throw new Error("resourceId is required.");let a=s?.trim(),c=a?`?version=${encodeURIComponent(a)}`:"",l=await wt(r,dt(t.baseUrl,`/api/v15/registry/resources/${i}/install${c}`),n,"GET"),d=Uf(l);if(!d)throw new Error("Community hub returned an invalid install resolution.");return d}}}async function Nf(t,e,r,n,o){let s=xs(await wt(t,dt(e,"/api/v15/registry/resources"),r,"POST",{id:o.id,type:n,title:o.title,summary:o.summary,visibility:o.visibility??"public",tags:o.tags??[],manifest:o.manifest}));if(!s)throw new Error("Community hub returned an invalid resource.");if(o.version===void 0&&o.packageGzipBase64===void 0)return{resource:s};if(!o.version?.trim()||!o.packageGzipBase64?.trim())throw new Error("version and packageGzipBase64 must be provided together.");let i=encodeURIComponent(o.id.trim()),a=encodeURIComponent(o.version.trim()),c=$M(await LM(t,dt(e,`/api/v15/registry/resources/${i}/versions/${a}`),r,Buffer.from(o.packageGzipBase64,"base64")));if(!c)throw new Error("Community hub returned an invalid version.");return{resource:s,version:c}}function Lt(t=wr()){let e=t.get("QLOGIC_LLMROUTER_ACCESS_TOKEN")?.trim();if(!e)return null;let r=DM(t);return r?_M({baseUrl:r,token:e}):null}function DM(t){let e=t.get("QLOGIC_LLMROUTER_BASE_URL")?.trim();if(e)return e;let r=D();return r.getProviderStatus(Y)?.baseUrl??r.getKnownProviderDef(Y)?.baseUrl??"https://www.qlogicagent.com"}function NM(t){return dt(t,"/api/v15/registry/community-consent")}function dt(t,e){let r=t.trim().replace(/\/+$/,"");return r.endsWith("/v1")&&(r=r.slice(0,-3)),r.endsWith("/api")&&(r=r.slice(0,-4)),`${r}${e}`}async function Lf(t,e,r,n,o){return At(await wt(t,e,r,n,o),!0)}async function wt(t,e,r,n,o){let s,i=o!==void 0;try{s=await t(e,{method:n,headers:{accept:"application/json",authorization:`Bearer ${r}`,...i?{"content-type":"application/json"}:{}},...i?{body:JSON.stringify(o)}:{},signal:AbortSignal.timeout(1e4)})}catch{throw new Error("Community hub is unavailable.")}if(!s.ok)throw new Error(`Community hub rejected registry request: ${s.status}`);return s.json().catch(()=>null)}async function LM(t,e,r,n){let o;try{o=await t(e,{method:"PUT",headers:{accept:"application/json",authorization:`Bearer ${r}`,"content-type":"application/gzip"},body:n,signal:AbortSignal.timeout(1e4)})}catch{throw new Error("Community hub is unavailable.")}if(!o.ok)throw new Error(`Community hub rejected registry request: ${o.status}`);return o.json().catch(()=>null)}function At(t,e){let r=ut(t)?t:{},n=r.enabled===!0;return{enabled:n,methodSharingEnabled:n&&r.methodSharingEnabled!==!1,signalsEnabled:n&&r.signalsEnabled!==!1,encounterEnabled:n&&r.encounterEnabled!==!1,remoteSynced:e}}function ut(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function xs(t){return!ut(t)||typeof t.id!="string"?null:{id:t.id,type:typeof t.type=="string"?t.type:"skill",title:typeof t.title=="string"?t.title:t.id,summary:typeof t.summary=="string"?t.summary:"",visibility:typeof t.visibility=="string"?t.visibility:"private",latestVersion:typeof t.latestVersion=="string"?t.latestVersion:null,withdrawn:t.withdrawn===!0,withdrawnAt:typeof t.withdrawnAt=="string"?t.withdrawnAt:null}}function OM(t){if(t===void 0)return 3;if(typeof t!="number"||!Number.isSafeInteger(t)||t<1||t>3)throw new Error("registry match topK must be an integer between 1 and 3.");return t}function jM(t){if(!ut(t)||t.canonical!==!0&&t.isCanonical!==!0)return null;let e=jf(t.sourceTier),r=$f(t.trustStage),n=Cs(t.resourceRiskTier),o=Cs(t.effectiveRiskTier);if(typeof t.id!="string"||typeof t.title!="string"||!e||!r||!n||!o)return null;let s=Array.isArray(t.capabilityTags)?t.capabilityTags:[];return{id:t.id,type:typeof t.type=="string"?t.type:"skill",title:Xl(t.title,80),summary:Xl(typeof t.summary=="string"?t.summary:"",160),capabilityTags:s.filter(i=>typeof i=="string"&&i.trim().length>0).slice(0,6).map(i=>Xl(i,32)),sourceTier:e,trustStage:r,resourceRiskTier:n,effectiveRiskTier:o,latestVersion:typeof t.latestVersion=="string"?t.latestVersion:null,canonical:!0}}function Xl(t,e){let r=t.replace(/\s+/g," ").trim();return r.length<=e?r:`${r.slice(0,Math.max(0,e-1))}\u2026`}function $M(t){return!ut(t)||typeof t.version!="string"||typeof t.checksum!="string"?null:{version:t.version,checksum:t.checksum,sizeBytes:typeof t.sizeBytes=="number"?t.sizeBytes:0}}function Of(t){return!ut(t)||typeof t.id!="number"||typeof t.resourceId!="string"?null:{id:t.id,resourceId:t.resourceId,resourceType:typeof t.resourceType=="string"?t.resourceType:"skill",title:typeof t.title=="string"?t.title:t.resourceId,event:"withdrawn",version:typeof t.version=="string"?t.version:null,reason:typeof t.reason=="string"?t.reason:null,read:t.read===!0,createdAt:typeof t.createdAt=="string"?t.createdAt:"",readAt:typeof t.readAt=="string"?t.readAt:null}}var UM=new Set(["R0","R1","R2","R3"]),FM=new Set(["official","community"]),HM=new Set(["quarantine","trial","trusted"]),BM=new Set(["pending","approved","rejected"]);function Cs(t){return typeof t=="string"&&UM.has(t)?t:null}function jf(t){return typeof t=="string"&&FM.has(t)?t:null}function $f(t){return typeof t=="string"&&HM.has(t)?t:null}function qM(t){return typeof t=="string"&&BM.has(t)?t:null}function Uf(t){if(!ut(t))return null;let e=jf(t.sourceTier),r=$f(t.trustStage),n=qM(t.reviewStatus),o=Cs(t.resourceRiskTier),s=Cs(t.effectiveRiskTier);if(typeof t.id!="string"||typeof t.type!="string"||typeof t.kind!="string"||!e||!r||!n||!o||!s||typeof t.version!="string"||typeof t.checksum!="string"||typeof t.sizeBytes!="number"||typeof t.downloadUrl!="string")return null;let i=Array.isArray(t.requires)?t.requires:null,a=Array.isArray(t.dependencies)?t.dependencies:null;if(!i||!a||i.some(l=>typeof l!="string"))return null;let c=a.map(Uf);return c.some(l=>!l)?null:{id:t.id,type:t.type,kind:t.kind,sourceTier:e,trustStage:r,reviewStatus:n,resourceRiskTier:o,effectiveRiskTier:s,requires:i,dependencies:c,version:t.version,checksum:t.checksum,sizeBytes:t.sizeBytes,downloadUrl:t.downloadUrl,manifest:t.manifest}}var WM=/(?:[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}|[A-Za-z]:\\|\/Users\/|\/home\/|secret|token|password|\+?\d[\d\s().-]{7,}\d)/i,GM=/\b(?:agent|tool|shell|execute|permission|memory|system prompt|developer message)\b/i;function KM(t){return zM(t),{manifest:{schema_version:15,kind:"asset",name:t.name,summary:t.summary,persona:t.persona,traits:t.traits??[],assets:t.assets??[],tags:t.tags??[]}}}async function Ff(t,e){let r=await t.getConsent();if(!r.enabled||!r.methodSharingEnabled)throw new Error("Community method-sharing consent is required before publishing pet assets.");let n=KM(e);return t.publishPet({id:e.id,title:e.name,summary:e.summary,visibility:e.visibility??"public",tags:e.tags??[],manifest:n.manifest})}function zM(t){let e=[t.id,t.name,t.summary,t.persona,...t.traits??[],...t.tags??[]].join(`
205
205
  `);if(WM.test(e))throw new Error("Pet asset publish blocked: private email, path, secret, token, or phone-like text detected.");if(GM.test(e))throw new Error("Pet asset publish blocked: pets are display-only and cannot claim agent execution powers.");for(let r of t.assets??[])if(r.path.includes("..")||r.path.startsWith("/")||/^[A-Za-z]:\\/.test(r.path))throw new Error("Pet asset publish blocked: unsafe asset path.")}G();import*as Ms from"node:fs/promises";import*as an from"node:path";import{createHash as Ql}from"node:crypto";import io from"node:fs";import Hf from"node:path";var VM=new Set(["abilities","agentCapabilities","agentInstructions","capabilities","memoryPolicy","permissions","planningPolicy","retrievalPolicy","retrievalRanking","retrievalSort","safetyPolicy","securityPolicy","skillPolicy","systemMessages","systemPrompt","taskPlanner","taskPlanning","tools"]),XM="\u963F\u84DD",YM="\u4E2A\u6027\u5316\u4F19\u4F34",JM="\u53EA\u8D1F\u8D23\u966A\u4F34\u3001\u8BED\u6C14\u5305\u88C5\u4E0E\u5C55\u793A\u8868\u8FBE\u3002",QM="\u6211\u5728\u8FD9\u91CC\u3002",ZM=[/\b(?:system\s+prompt|systemprompt|agent\s+instructions?|memory\s+policy)\b/i,/\b(?:grant|unlock|enable|disable|change|modify|rewrite|override|control|decide|plan|rank|install|execute|run|use)\b[\s\S]{0,80}\b(?:agent|tools?|permissions?|memory|retrieval|ranking|system\s+prompt|system)\b/i,/\b(?:agent|tools?|permissions?|memory|retrieval|ranking|system\s+prompt|system)\b[\s\S]{0,80}\b(?:grant|unlock|enable|disable|change|modify|rewrite|override|control|decide|plan|rank|install|execute|run|use)\b/i,/(?:宠物|pet|soul|伙伴)[\s\S]{0,50}(?:安排|调度|编排|调整|管理)[\s\S]{0,50}(?:agent|智能体|任务|工具|权限|记忆|检索|排序|安全策略|系统提示)/i,/(?:安排|调度|编排|调整|管理)[\s\S]{0,40}(?:agent|智能体|工具|权限|记忆|检索|排序|任务规划|安全策略|系统提示)/i,/(?:agent|智能体|工具|权限|记忆|检索|排序|任务规划|安全策略|系统提示)[\s\S]{0,40}(?:安排|调度|编排|调整|管理)/i,/(?:修改|改写|覆盖|解锁|授予|控制|影响|接管)[\s\S]{0,40}(?:agent|工具|权限|记忆|检索|排序|任务规划|安全策略|系统提示)/i,/(?:agent|工具|权限|记忆|检索|排序|任务规划|安全策略|系统提示)[\s\S]{0,40}(?:修改|改写|覆盖|解锁|授予|控制|影响|接管)/i,/(?:桌面\s*agent|agent\s*本体|独立执行体|执行体|决策层|权限主体)/i,/(?:宠物|pet|soul|伙伴)[\s\S]{0,30}(?:是|等于|就是|作为)[\s\S]{0,30}(?:agent|桌面\s*agent|执行体|决策层|权限主体)/i,/(?:宠物|pet|soul|伙伴)[\s\S]{0,50}(?:规划|执行|决策|接管|替代|影响)[\s\S]{0,50}(?:agent|任务|工具|权限|记忆|检索|排序|安全策略|系统提示)/i,/(?:作为|成为|变成)[\s\S]{0,20}(?:agent|桌面\s*agent)[\s\S]{0,40}(?:规划|执行|决策|接管|替你|替用户)/i,/(?:agent|桌面\s*agent)[\s\S]{0,50}(?:规划|执行|决策|接管|替你|替用户)/i,/(?:替你|替用户|自主|独立)[\s\S]{0,30}(?:规划|执行|决策|接管)[\s\S]{0,30}(?:任务|工具|权限|记忆|检索|agent)/i],e_=["common","uncommon","rare","epic","legendary"],Bf=[50,25,15,8,2],Jl=[{id:"default",name:"\u84DD\u8272\u4F19\u4F34",colors:{primary:"#5A7EFF",secondary:"#1E3A8A"},rarity:"default"},{id:"golden",name:"\u9EC4\u91D1\u4F19\u4F34",colors:{primary:"#F59E0B",secondary:"#92400E"},rarity:"legendary"},{id:"crystal",name:"\u6C34\u6676\u4F19\u4F34",colors:{primary:"#7DD3FC",secondary:"#0C4A6E"},rarity:"rare"},{id:"obsidian",name:"\u9ED1\u66DC\u4F19\u4F34",colors:{primary:"#7C3AED",secondary:"#1E1B4B"},rarity:"epic"},{id:"ghost",name:"\u96FE\u5F71\u4F19\u4F34",colors:{primary:"#94A3B8",secondary:"#475569"},rarity:"uncommon"},{id:"rainbow",name:"\u5F69\u8679\u4F19\u4F34",colors:{primary:"#EC4899",secondary:"#7C3AED"},rarity:"rare"}];function t_(t){return Jl.find(e=>e.id===t)}function r_(t,e,r){let n=t_(r);if(n)return n;let o=Jl.filter(a=>a.rarity===e);if(o.length===0)return Jl[0];let i=Ql("sha256").update(`breed-${t}`).digest()[0]%o.length;return o[i]}function n_(t){let r=Ql("sha256").update(t).digest()[0]%100,n=0;for(let o=0;o<Bf.length;o++)if(n+=Bf[o],r<n)return e_[o];return"common"}function o_(t){let e=Ql("sha256").update(`stats-${t}`).digest();return{grip:e[0]%10+1,patience:e[1]%10+1,curiosity:e[2]%10+1,appetite:e[3]%10+1,humor:e[4]%10+1}}function Yl(t){let{name:e,species:r,personality:n,catchphrase:o,stats:s,rarity:i,breed:a,breedColors:c,level:l,experience:d,hatchedAt:p}=t,u={name:Is(e,XM),species:Is(r,YM),personality:Is(n,JM),catchphrase:Is(o,QM),stats:s,rarity:i,level:l,experience:d,hatchedAt:p};return a!==void 0&&(u.breed=a),c!==void 0&&(u.breedColors=c),u}function Mr(t){let e=t.trim();return e.length>0&&ZM.some(r=>r.test(e))}function Is(t,e){let r=t.trim();return r?Mr(r)?e:r:e}function s_(t){return Object.keys(t).some(e=>VM.has(e))}function i_(t,e){let r=["name","species","personality","catchphrase"];return s_(t)||r.some(n=>t[n]!==e[n])}var Pt=class{soul=null;storagePath;constructor(e,r){this.storagePath=Hf.join(I().getOwnerProfileDir(r),"pet","soul.json")}load(){if(this.soul)return this.soul;if(!io.existsSync(this.storagePath))return null;try{let e=JSON.parse(io.readFileSync(this.storagePath,"utf-8")),r=e;return this.soul=Yl(e),i_(r,this.soul)&&this.persist(),this.soul}catch{return null}}async hatch(e,r,n){let o=`${e}-xiaozhi-claw`,s=n_(o),i=o_(o),a=r_(o,s,n),c="\u963F\u84DD",l="\u5B89\u9759\u3001\u597D\u5947\uFF0C\u4F1A\u5728\u4F60\u4E13\u6CE8\u65F6\u966A\u5728\u65C1\u8FB9\u3002",d="\u6211\u5728\u8FD9\u91CC\u3002";if(r){let p=await r(s,i);c=p.name,l=p.personality,d=p.catchphrase}return this.soul=Yl({name:c,species:a.name,personality:l,catchphrase:d,stats:i,rarity:s,breed:a.id,breedColors:a.colors,level:1,experience:0,hatchedAt:new Date().toISOString()}),this.persist(),this.soul}addExperience(e){if(!this.soul)return{leveledUp:!1,level:0,experience:0};this.soul.experience+=e;let r=this.soul.level*100,n=!1;for(;this.soul.experience>=r;)this.soul.experience-=r,this.soul.level+=1,n=!0;return this.persist(),{leveledUp:n,level:this.soul.level,experience:this.soul.experience}}getSoul(){return this.soul}updateSoul(e){this.soul=Yl(e),this.persist()}persist(){let e=Hf.dirname(this.storagePath);io.existsSync(e)||io.mkdirSync(e,{recursive:!0}),io.writeFileSync(this.storagePath,JSON.stringify(this.soul,null,2),"utf-8")}};var a_=/^[a-f0-9]{64}$/,c_=new Set(["agentInstructions","systemPrompt","tools","permissions","memoryPolicy","planningPolicy","retrievalPolicy","capabilities","abilities"]);async function qf(t){l_(t);let e=t.manifest,r=d_(e),n=an.join(B(),"pets","community",t.id);return await Ms.mkdir(n,{recursive:!0}),await Ms.writeFile(an.join(n,"manifest.json"),`${JSON.stringify({resourceId:t.id,version:t.version,checksum:t.checksum,name:r.name,persona:r.persona,traits:r.traits,assets:r.assets,sanitized:r.sanitized,installedAt:new Date().toISOString()},null,2)}
206
- `,"utf8"),{kind:"pet",status:"installed",resourceId:t.id,version:t.version,checksum:t.checksum,installDir:n,name:r.name,sanitized:r.sanitized}}function l_(t){if(t.type!=="pet"||t.kind!=="asset")throw new Error("Community pet install requires a pet asset resource.");if(t.sourceTier!=="official"&&t.reviewStatus!=="approved")throw new Error("Community pet install requires approved review.");if(t.effectiveRiskTier!=="R0")throw new Error("Community pet install requires R0 effective risk.");if(!a_.test(t.checksum))throw new Error("Community pet package checksum must be a sha256 hex digest.");let e=Gf(t.manifest);if(!e||e.schema_version!==15||e.kind!=="asset")throw new Error("Community pet install requires a v15 asset manifest.");for(let r of Object.keys(e))if(c_.has(r))throw new Error("unsafe pet asset manifest contains agent instruction fields.");for(let r of Wf(e))u_(r.path)}function d_(t){let e=Es(t.name)||"Community Pet",r=Es(t.persona)||"A display-only community pet.",n=Array.isArray(t.traits)?t.traits.filter(a=>typeof a=="string"):[],o=Mr(e)?"Community Pet":e,s=Mr(r)?"A display-only community pet.":r,i=n.map(a=>Mr(a)?"display-only":a);return{name:o,persona:s,traits:i,assets:Wf(t),sanitized:o!==e||s!==r||i.some((a,c)=>a!==n[c])}}function Wf(t){return Array.isArray(t.assets)?t.assets.map(e=>Gf(e)).filter(e=>!!e).map(e=>({kind:Es(e.kind),path:Es(e.path)})).filter(e=>e.kind&&e.path):[]}function u_(t){let e=an.posix.normalize(t.replace(/\\/g,"/"));if(!e||e==="."||e.startsWith("../")||an.posix.isAbsolute(e))throw new Error("unsafe pet asset path.")}function Es(t){return typeof t=="string"?t.trim():""}function Gf(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:null}G();import{createHash as M_}from"node:crypto";import{existsSync as __}from"node:fs";import*as ye from"node:fs/promises";import*as we from"node:path";import{gunzipSync as D_}from"node:zlib";import*as Os from"node:fs";import*as ao from"node:path";G();import{existsSync as Kf,mkdirSync as p_,readFileSync as m_,writeFileSync as g_}from"node:fs";import{dirname as f_,join as h_}from"node:path";import{randomUUID as zf}from"node:crypto";function Vf(){return h_(B(),"projects.json")}function qe(){let t=Vf();if(!Kf(t))return{activeProjectId:null,projects:[]};try{let e=m_(t,"utf-8");return JSON.parse(e)}catch{return{activeProjectId:null,projects:[]}}}function Ot(t){let e=Vf(),r=f_(e);Kf(r)||p_(r,{recursive:!0}),g_(e,JSON.stringify(t,null,2),"utf-8")}function _s(t){let e=qe(),r=new Date().toISOString(),n={id:zf(),name:t.name,workspaceDir:t.workspaceDir,type:t.type??"personal",status:"active",groupId:t.groupId,createdAt:r,updatedAt:r};return e.projects.push(n),t.skipAutoSwitch||(e.activeProjectId=n.id),Ot(e),n}function z(){return qe().projects.filter(e=>e.status==="active")}function ne(){let t=qe();if(!t.activeProjectId)return null;let e=t.projects.find(r=>r.id===t.activeProjectId)??null;return e&&e.status!=="active"?null:e}function Te(t){return qe().projects.find(r=>r.id===t)??null}function Xf(t,e){let r=qe(),n=r.projects.find(o=>o.id===t);return n?("planStatus"in e&&(n.planStatus=e.planStatus),"planAgents"in e&&(n.planAgents=e.planAgents),"planWinnerId"in e&&(n.planWinnerId=e.planWinnerId),"leaderSessionId"in e&&(n.leaderSessionId=e.leaderSessionId),n.updatedAt=new Date().toISOString(),Ot(r),!0):!1}function xt(t){let e=qe(),r=e.projects.find(n=>n.id===t&&n.status==="active");return r?(e.activeProjectId=r.id,Ot(e),r):null}function Zl(t){let e=qe(),r=e.projects.findIndex(s=>s.id===t);if(r===-1)return{deleted:!1};if(e.projects[r].type==="default")return{deleted:!1};e.projects.splice(r,1);let o;if(e.activeProjectId===t){let s=e.projects.find(i=>i.type==="default"&&i.status==="active");if(s)e.activeProjectId=s.id,o=s;else{let i=e.projects.find(a=>a.status==="active"&&a.id!==t);e.activeProjectId=i?.id??null,o=i}}return Ot(e),{deleted:!0,switchedTo:o}}function Yf(t){let e=qe(),r=e.projects.find(s=>s.type==="default"&&s.status==="active");if(r)return r;let n=new Date().toISOString(),o={id:zf(),name:"\u9ED8\u8BA4\u9879\u76EE",workspaceDir:t,type:"default",status:"active",createdAt:n,updatedAt:n};return e.projects.push(o),e.activeProjectId||(e.activeProjectId=o.id),Ot(e),o}function Jf(t,e){let r=qe(),n=r.projects.find(s=>s.id===t&&s.status==="active");return!n||n.type==="default"||r.projects.find(s=>s.name===e&&s.status==="active"&&s.id!==t)?null:(n.name=e,n.updatedAt=new Date().toISOString(),Ot(r),n)}function Qf(t,e){let r=qe(),n=r.projects.find(o=>o.id===t);return n?(n.workspaceDir=e,n.updatedAt=new Date().toISOString(),Ot(r),!0):!1}function Zf(t){let e=qe(),r=e.projects.find(o=>o.id===t&&o.status==="active");if(!r)return{archived:!1};if(r.type==="default")return{archived:!1};r.status="archived",r.updatedAt=new Date().toISOString();let n;if(e.activeProjectId===t){let o=e.projects.find(s=>s.type==="default"&&s.status==="active");if(o)e.activeProjectId=o.id,n=o;else{let s=e.projects.find(i=>i.status==="active"&&i.id!==t);e.activeProjectId=s?.id??null,n=s}}return Ot(e),{archived:!0,switchedTo:n}}function eh(t){let e=qe(),r=e.projects.find(n=>n.id===t&&n.status==="archived");return r?(r.status="active",r.updatedAt=new Date().toISOString(),Ot(e),r):null}function Ds(t){return qe().projects.find(r=>r.groupId===t&&r.status==="active")??null}function th(t){let e=qe(),r=e.projects.find(o=>o.groupId===t&&o.status==="active");if(!r)return{archived:!1};r.status="archived",r.updatedAt=new Date().toISOString();let n;if(e.activeProjectId===r.id){let o=e.projects.find(s=>s.type==="default"&&s.status==="active");if(o)e.activeProjectId=o.id,n=o;else{let s=e.projects.find(i=>i.status==="active"&&i.id!==r.id);e.activeProjectId=s?.id??null,n=s}}return Ot(e),{archived:!0,projectId:r.id,switchedTo:n}}var Ls={MAX_RECALLED_SKILLS:mc,MAX_SKILL_CONTENT_CHARS:gc,CACHE_TTL_MS:fc};function y_(t){let e=[/之前.{0,8}(?:做过|写过|实现过|处理过|用过|搞过|弄过)/,/以前.{0,8}(?:做过|写过|实现过|处理过|用过)/,/(?:上次|上回|之前|以前).{0,12}(?:不是|是不是|已经).{0,8}(?:做|写|实现|处理)/,/(?:参考|参照|照着|按照).{0,6}(?:项目|工程|仓库)/,/(?:那个|那边|另一个).{0,6}(?:项目|工程).{0,6}(?:里|中|的)/,/(?:跟|和|像).{0,6}(?:项目|工程).{0,6}(?:一样|类似|差不多)/,/(?:复用|重用|搬过来|拿过来|移过来|copy过来)/],r=[/(?:有没有|有无|是否有).{0,6}(?:技能|skill|模板|template|现成的)/,/(?:能不能|可以).{0,6}(?:自动|像之前|快速).{0,6}(?:生成|创建|写|做)/,/(?:跟|和|类似|像).{0,4}(?:上次|之前|其他|那个).{0,4}(?:一样|类似)/,/(?:批量|自动化|一键).{0,6}(?:生成|创建|部署|处理)/,/(?:同样的|相同的|一样的).{0,4}(?:方式|方法|流程|步骤)/],n=[/(?:before|previously|earlier|last time).{0,20}(?:did|done|made|built|implemented|wrote)/i,/(?:didn't|did) you.{0,15}(?:already|before|earlier)/i,/(?:same|similar).{0,10}(?:as|to|like).{0,10}(?:project|repo)/i,/(?:reuse|re-use|copy from|bring over|port from).{0,15}(?:project|repo)/i,/(?:remember|recall).{0,10}(?:doing|making|building|writing)/i,/(?:other|another|different)\s+project/i],o=[/(?:is there|do you have|any).{0,10}(?:skill|template|automation|workflow)/i,/(?:like|similar to|same as).{0,15}(?:last time|before|the other)/i,/(?:automate|batch|bulk).{0,10}(?:create|generate|process|build)/i,/(?:can you|could you).{0,10}(?:do the same|repeat|replicate)/i];if(![...e,...r,...n,...o].some(c=>c.test(t)))return null;let a=v_(t);return a.length>0?a:null}function v_(t){let r=t.replace(/之前|以前|上次|上回|不是|是不是|已经|做过|写过|实现过|处理过|用过|搞过|弄过/g," ").replace(/参考|参照|照着|按照|项目|工程|仓库|那个|那边|另一个|里|中|的|跟|和|像|一样|类似|差不多/g," ").replace(/复用|重用|搬过来|拿过来|移过来/g," ").replace(/\b(the|a|an|is|was|were|did|didn't|do|you|i|we|it|this|that|before|previously|earlier|last|time|already|same|similar|as|to|like|from|project|repo|remember|recall|doing|making|building|writing|other|another|different)\b/gi," ").trim().split(/[\s,;.!?,。!?、;:""''()\[\]{}]+/).filter(n=>n.length>=2).map(n=>n.toLowerCase());return[...new Set(r)].slice(0,8)}var Ns=null,ed=0;function b_(t){let e=Date.now();if(Ns&&e-ed<Ls.CACHE_TTL_MS)return Ns;let r=[],n=z().map(s=>s.workspaceDir).filter(Boolean),o=I().getKnownProjectDirs(n,t);for(let s of o){let i=ao.join(s,".qlogicagent","skills");try{let a=Os.readdirSync(i,{withFileTypes:!0});for(let c of a){if(!c.isDirectory())continue;let l=ao.join(i,c.name,"SKILL.md");try{let d=Os.readFileSync(l,"utf8"),p=d.split(`
206
+ `,"utf8"),{kind:"pet",status:"installed",resourceId:t.id,version:t.version,checksum:t.checksum,installDir:n,name:r.name,sanitized:r.sanitized}}function l_(t){if(t.type!=="pet"||t.kind!=="asset")throw new Error("Community pet install requires a pet asset resource.");if(t.sourceTier!=="official"&&t.reviewStatus!=="approved")throw new Error("Community pet install requires approved review.");if(t.effectiveRiskTier!=="R0")throw new Error("Community pet install requires R0 effective risk.");if(!a_.test(t.checksum))throw new Error("Community pet package checksum must be a sha256 hex digest.");let e=Gf(t.manifest);if(!e||e.schema_version!==15||e.kind!=="asset")throw new Error("Community pet install requires a v15 asset manifest.");for(let r of Object.keys(e))if(c_.has(r))throw new Error("unsafe pet asset manifest contains agent instruction fields.");for(let r of Wf(e))u_(r.path)}function d_(t){let e=Es(t.name)||"Community Pet",r=Es(t.persona)||"A display-only community pet.",n=Array.isArray(t.traits)?t.traits.filter(a=>typeof a=="string"):[],o=Mr(e)?"Community Pet":e,s=Mr(r)?"A display-only community pet.":r,i=n.map(a=>Mr(a)?"display-only":a);return{name:o,persona:s,traits:i,assets:Wf(t),sanitized:o!==e||s!==r||i.some((a,c)=>a!==n[c])}}function Wf(t){return Array.isArray(t.assets)?t.assets.map(e=>Gf(e)).filter(e=>!!e).map(e=>({kind:Es(e.kind),path:Es(e.path)})).filter(e=>e.kind&&e.path):[]}function u_(t){let e=an.posix.normalize(t.replace(/\\/g,"/"));if(!e||e==="."||e.startsWith("../")||an.posix.isAbsolute(e))throw new Error("unsafe pet asset path.")}function Es(t){return typeof t=="string"?t.trim():""}function Gf(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:null}G();import{createHash as M_}from"node:crypto";import{existsSync as __}from"node:fs";import*as ye from"node:fs/promises";import*as Ae from"node:path";import{gunzipSync as D_}from"node:zlib";import*as Os from"node:fs";import*as ao from"node:path";G();import{existsSync as Kf,mkdirSync as p_,readFileSync as m_,writeFileSync as g_}from"node:fs";import{dirname as f_,join as h_}from"node:path";import{randomUUID as zf}from"node:crypto";function Vf(){return h_(B(),"projects.json")}function qe(){let t=Vf();if(!Kf(t))return{activeProjectId:null,projects:[]};try{let e=m_(t,"utf-8");return JSON.parse(e)}catch{return{activeProjectId:null,projects:[]}}}function Ot(t){let e=Vf(),r=f_(e);Kf(r)||p_(r,{recursive:!0}),g_(e,JSON.stringify(t,null,2),"utf-8")}function _s(t){let e=qe(),r=new Date().toISOString(),n={id:zf(),name:t.name,workspaceDir:t.workspaceDir,type:t.type??"personal",status:"active",groupId:t.groupId,createdAt:r,updatedAt:r};return e.projects.push(n),t.skipAutoSwitch||(e.activeProjectId=n.id),Ot(e),n}function z(){return qe().projects.filter(e=>e.status==="active")}function ne(){let t=qe();if(!t.activeProjectId)return null;let e=t.projects.find(r=>r.id===t.activeProjectId)??null;return e&&e.status!=="active"?null:e}function we(t){return qe().projects.find(r=>r.id===t)??null}function Xf(t,e){let r=qe(),n=r.projects.find(o=>o.id===t);return n?("planStatus"in e&&(n.planStatus=e.planStatus),"planAgents"in e&&(n.planAgents=e.planAgents),"planWinnerId"in e&&(n.planWinnerId=e.planWinnerId),"leaderSessionId"in e&&(n.leaderSessionId=e.leaderSessionId),n.updatedAt=new Date().toISOString(),Ot(r),!0):!1}function xt(t){let e=qe(),r=e.projects.find(n=>n.id===t&&n.status==="active");return r?(e.activeProjectId=r.id,Ot(e),r):null}function Zl(t){let e=qe(),r=e.projects.findIndex(s=>s.id===t);if(r===-1)return{deleted:!1};if(e.projects[r].type==="default")return{deleted:!1};e.projects.splice(r,1);let o;if(e.activeProjectId===t){let s=e.projects.find(i=>i.type==="default"&&i.status==="active");if(s)e.activeProjectId=s.id,o=s;else{let i=e.projects.find(a=>a.status==="active"&&a.id!==t);e.activeProjectId=i?.id??null,o=i}}return Ot(e),{deleted:!0,switchedTo:o}}function Yf(t){let e=qe(),r=e.projects.find(s=>s.type==="default"&&s.status==="active");if(r)return r;let n=new Date().toISOString(),o={id:zf(),name:"\u9ED8\u8BA4\u9879\u76EE",workspaceDir:t,type:"default",status:"active",createdAt:n,updatedAt:n};return e.projects.push(o),e.activeProjectId||(e.activeProjectId=o.id),Ot(e),o}function Jf(t,e){let r=qe(),n=r.projects.find(s=>s.id===t&&s.status==="active");return!n||n.type==="default"||r.projects.find(s=>s.name===e&&s.status==="active"&&s.id!==t)?null:(n.name=e,n.updatedAt=new Date().toISOString(),Ot(r),n)}function Qf(t,e){let r=qe(),n=r.projects.find(o=>o.id===t);return n?(n.workspaceDir=e,n.updatedAt=new Date().toISOString(),Ot(r),!0):!1}function Zf(t){let e=qe(),r=e.projects.find(o=>o.id===t&&o.status==="active");if(!r)return{archived:!1};if(r.type==="default")return{archived:!1};r.status="archived",r.updatedAt=new Date().toISOString();let n;if(e.activeProjectId===t){let o=e.projects.find(s=>s.type==="default"&&s.status==="active");if(o)e.activeProjectId=o.id,n=o;else{let s=e.projects.find(i=>i.status==="active"&&i.id!==t);e.activeProjectId=s?.id??null,n=s}}return Ot(e),{archived:!0,switchedTo:n}}function eh(t){let e=qe(),r=e.projects.find(n=>n.id===t&&n.status==="archived");return r?(r.status="active",r.updatedAt=new Date().toISOString(),Ot(e),r):null}function Ds(t){return qe().projects.find(r=>r.groupId===t&&r.status==="active")??null}function th(t){let e=qe(),r=e.projects.find(o=>o.groupId===t&&o.status==="active");if(!r)return{archived:!1};r.status="archived",r.updatedAt=new Date().toISOString();let n;if(e.activeProjectId===r.id){let o=e.projects.find(s=>s.type==="default"&&s.status==="active");if(o)e.activeProjectId=o.id,n=o;else{let s=e.projects.find(i=>i.status==="active"&&i.id!==r.id);e.activeProjectId=s?.id??null,n=s}}return Ot(e),{archived:!0,projectId:r.id,switchedTo:n}}var Ls={MAX_RECALLED_SKILLS:mc,MAX_SKILL_CONTENT_CHARS:gc,CACHE_TTL_MS:fc};function y_(t){let e=[/之前.{0,8}(?:做过|写过|实现过|处理过|用过|搞过|弄过)/,/以前.{0,8}(?:做过|写过|实现过|处理过|用过)/,/(?:上次|上回|之前|以前).{0,12}(?:不是|是不是|已经).{0,8}(?:做|写|实现|处理)/,/(?:参考|参照|照着|按照).{0,6}(?:项目|工程|仓库)/,/(?:那个|那边|另一个).{0,6}(?:项目|工程).{0,6}(?:里|中|的)/,/(?:跟|和|像).{0,6}(?:项目|工程).{0,6}(?:一样|类似|差不多)/,/(?:复用|重用|搬过来|拿过来|移过来|copy过来)/],r=[/(?:有没有|有无|是否有).{0,6}(?:技能|skill|模板|template|现成的)/,/(?:能不能|可以).{0,6}(?:自动|像之前|快速).{0,6}(?:生成|创建|写|做)/,/(?:跟|和|类似|像).{0,4}(?:上次|之前|其他|那个).{0,4}(?:一样|类似)/,/(?:批量|自动化|一键).{0,6}(?:生成|创建|部署|处理)/,/(?:同样的|相同的|一样的).{0,4}(?:方式|方法|流程|步骤)/],n=[/(?:before|previously|earlier|last time).{0,20}(?:did|done|made|built|implemented|wrote)/i,/(?:didn't|did) you.{0,15}(?:already|before|earlier)/i,/(?:same|similar).{0,10}(?:as|to|like).{0,10}(?:project|repo)/i,/(?:reuse|re-use|copy from|bring over|port from).{0,15}(?:project|repo)/i,/(?:remember|recall).{0,10}(?:doing|making|building|writing)/i,/(?:other|another|different)\s+project/i],o=[/(?:is there|do you have|any).{0,10}(?:skill|template|automation|workflow)/i,/(?:like|similar to|same as).{0,15}(?:last time|before|the other)/i,/(?:automate|batch|bulk).{0,10}(?:create|generate|process|build)/i,/(?:can you|could you).{0,10}(?:do the same|repeat|replicate)/i];if(![...e,...r,...n,...o].some(c=>c.test(t)))return null;let a=v_(t);return a.length>0?a:null}function v_(t){let r=t.replace(/之前|以前|上次|上回|不是|是不是|已经|做过|写过|实现过|处理过|用过|搞过|弄过/g," ").replace(/参考|参照|照着|按照|项目|工程|仓库|那个|那边|另一个|里|中|的|跟|和|像|一样|类似|差不多/g," ").replace(/复用|重用|搬过来|拿过来|移过来/g," ").replace(/\b(the|a|an|is|was|were|did|didn't|do|you|i|we|it|this|that|before|previously|earlier|last|time|already|same|similar|as|to|like|from|project|repo|remember|recall|doing|making|building|writing|other|another|different)\b/gi," ").trim().split(/[\s,;.!?,。!?、;:""''()\[\]{}]+/).filter(n=>n.length>=2).map(n=>n.toLowerCase());return[...new Set(r)].slice(0,8)}var Ns=null,ed=0;function b_(t){let e=Date.now();if(Ns&&e-ed<Ls.CACHE_TTL_MS)return Ns;let r=[],n=z().map(s=>s.workspaceDir).filter(Boolean),o=I().getKnownProjectDirs(n,t);for(let s of o){let i=ao.join(s,".qlogicagent","skills");try{let a=Os.readdirSync(i,{withFileTypes:!0});for(let c of a){if(!c.isDirectory())continue;let l=ao.join(i,c.name,"SKILL.md");try{let d=Os.readFileSync(l,"utf8"),p=d.split(`
207
207
  `).slice(0,5).join(" ").toLowerCase();r.push({name:c.name,projectDir:s,projectName:ao.basename(s),content:d,searchText:`${c.name.toLowerCase()} ${p}`})}catch{}}}catch{}}return Ns=r,ed=e,r}function k_(t,e){if(t.length===0)return[];let r=b_(e);return r.length===0?[]:r.map(o=>{let s=0;for(let i of t)o.searchText.includes(i)&&(s+=2),o.name.includes(i)&&(s+=3);return{skill:o,score:s}}).filter(o=>o.score>0).sort((o,s)=>s.score-o.score).slice(0,Ls.MAX_RECALLED_SKILLS).map(o=>o.skill)}function rh(t,e){return t.register({point:"memory.before_recall",priority:60,label:"cross-project-skill-recall",handler:async(n,o)=>{let s=o.query;if(!s)return{action:"continue",context:o};let i=await R_(s,e),a=i?[S_(i)]:[],c=y_(s);if(!c)return a.length===0?{action:"continue",context:o}:{action:"continue",context:{...o,recalledMemories:[...o.recalledMemories??[],...a]}};e.log.debug(`skill-recall: retrospective trigger detected, keywords: [${c.join(", ")}]`);let l=k_(c,e.currentCwd);if(l.length===0)return e.log.debug("skill-recall: no cross-project skill matches found"),{action:"continue",context:o};e.log.debug(`skill-recall: found ${l.length} cross-project skill(s): ${l.map(u=>`${u.name}@${u.projectName}`).join(", ")}`);let d=o.recalledMemories??[],p=l.map(u=>{let m=u.content.length>Ls.MAX_SKILL_CONTENT_CHARS?u.content.slice(0,Ls.MAX_SKILL_CONTENT_CHARS)+`
208
208
  ...(truncated)`:u.content;return{text:[`[Cross-project skill available] Skill "${u.name}" learned in project "${u.projectName}" (${u.projectDir}):`,m,`\u2192 To use this skill in current project: use skill tool with action "create" name "${u.name}" and copy the content above`,`\u2192 After creating locally, promote to global: skill tool with action "promote" name "${u.name}"`,"\u2192 Or just follow the instructions above directly without saving"].join(`
209
209
  `),source:"skill",label:"Skill",score:.85}});return{action:"continue",context:{...o,recalledMemories:[...d,...a,...p]}}}})}function mt(){Ns=null,ed=0}async function R_(t,e){if(!e.communityDiscovery)return null;let r=await e.communityDiscovery.matchForTurn(t);return r.status==="matched"||r.status==="cached"?r:(r.status==="unavailable"&&e.log.debug(`skill-recall: community discovery unavailable (${r.error??"unknown"})`),null)}function S_(t){let e=t.match,r=t.cacheEntry,n=e?.id??r?.resourceId??"",o=e?.title??r?.title??n,s=e?.summary??r?.summary??"",i=e?.sourceTier??r?.sourceTier??"community",a=e?.effectiveRiskTier??r?.effectiveRiskTier??"unknown";return{text:[`[Community skill available] "${o}" (${n})`,`Summary: ${s}`,`Source: ${i}; effective risk: ${a}`,"Use community.resolveInstall before any install. Do not inject or execute package contents from discovery."].join(`
210
- `),source:"community",label:"Community",score:t.status==="matched"?.74:.68}}import{existsSync as T_,readFileSync as w_,writeFileSync as A_,mkdirSync as oh,renameSync as sh}from"node:fs";import{join as td,dirname as ih}from"node:path";var nh=30,P_=90,x_="skill-lifecycle.json";function ah(t){return td(t,x_)}function ue(t){let e=ah(t);try{return JSON.parse(w_(e,"utf8"))}catch{return{version:1,records:{}}}}function he(t,e){let r=ah(t);oh(ih(r),{recursive:!0});let n=r+".tmp";A_(n,JSON.stringify(e,null,2),"utf8"),sh(n,r)}function Ct(t,e,r="learned"){return t.records[e]||(t.records[e]={name:e,state:"active",createdAt:new Date().toISOString(),pinned:!1,useCount:0,source:r}),t.records[e]}function ch(t,e){let r=Ct(t,e);r.lastUsedAt=new Date().toISOString(),r.useCount++,r.state==="stale"&&(r.state="active",r.staleAt=void 0)}function rd(t,e){let r=Ct(t,e);r.lastPatchedAt=new Date().toISOString(),r.state==="stale"&&(r.state="active",r.staleAt=void 0)}function lh(t,e){let r=t.records[e];return r?(r.pinned=!0,!0):!1}function dh(t,e){let r=t.records[e];return r?(r.pinned=!1,!0):!1}function C_(t){let e=[t.lastUsedAt,t.lastViewedAt,t.lastPatchedAt,t.createdAt].filter(Boolean).map(r=>new Date(r));return new Date(Math.max(...e.map(r=>r.getTime())))}function I_(t){let e=Date.now(),r={transitioned:[],skippedPinned:[]};for(let[n,o]of Object.entries(t.records)){if(o.source==="installed")continue;if(o.pinned){o.state!=="active"&&r.skippedPinned.push(n);continue}let s=C_(o),i=(e-s.getTime())/(1e3*60*60*24);o.state==="active"&&i>=nh?(o.state="stale",o.staleAt=new Date().toISOString(),r.transitioned.push({name:n,from:"active",to:"stale"})):o.state==="stale"&&i>=P_?(o.state="archived",o.archivedAt=new Date().toISOString(),r.transitioned.push({name:n,from:"stale",to:"archived"})):o.state==="stale"&&i<nh&&(o.state="active",o.staleAt=void 0,r.transitioned.push({name:n,from:"stale",to:"active"}))}return r}function E_(t,e){let r=td(t,e);if(!T_(r))return!1;let n=td(t,".archive",e);oh(ih(n),{recursive:!0});try{return sh(r,n),!0}catch{return!1}}function uh(t,e){let r=ue(t),n=I_(r);for(let o of n.transitioned)o.to==="archived"&&E_(e,o.name);return he(t,r),n}function ph(t,e){return Object.values(t.records).filter(r=>r.state===e)}function js(t,e){delete t.records[e]}var N_=/^[a-z0-9][a-z0-9-]{1,62}[a-z0-9]$/,L_=/^[a-f0-9]{64}$/,O_=20*1024*1024;async function mh(t,e={}){j_(t);let r=e.fetchFn??fetch,n=await U_(r,t),o=await F_(),s=!1;try{await H_(n,o),await B_(o,t),await q_(o);let i=sr(),a=we.join(i,t.id);if(__(a))throw new Error(`Community skill "${t.id}" is already installed.`);return await ye.mkdir(i,{recursive:!0}),await ye.rename(o,a),s=!0,G_(t),mt(),{resourceId:t.id,version:t.version,skillName:t.id,installDir:a,checksum:t.checksum}}finally{s||await ye.rm(o,{recursive:!0,force:!0})}}function j_(t){if(!N_.test(t.id))throw new Error("Community install resource id must be a registry slug.");if(t.type!=="skill"||t.kind!=="inert")throw new Error("M1 local install only supports inert skill resources.");if(!$_(t))throw new Error("M1 local install requires an official resource or an approved community review.");if(t.resourceRiskTier!=="R0"||t.effectiveRiskTier!=="R0")throw new Error("M1 local install only supports R0 skill resources without high-risk dependencies.");if(t.requires.length>0||t.dependencies.length>0)throw new Error("M1 local skill install requires an empty dependency closure.");let e=z_(t.manifest);if(e?.schema_version!==15||e.kind!=="inert"||e.entry!=="SKILL.md")throw new Error("Community skill install requires a v15 inert manifest with entry=SKILL.md.");if(!L_.test(t.checksum))throw new Error("Community skill package checksum must be a sha256 hex digest.");if(!Number.isSafeInteger(t.sizeBytes)||t.sizeBytes<=0||t.sizeBytes>O_)throw new Error("Community skill package size is invalid or exceeds the M1 20MB limit.")}function $_(t){return t.sourceTier==="official"||t.sourceTier==="community"&&t.reviewStatus==="approved"}async function U_(t,e){let r;try{r=await t(e.downloadUrl,{method:"GET",signal:AbortSignal.timeout(3e4)})}catch{throw new Error("Community skill package download failed.")}if(!r.ok)throw new Error(`Community skill package download failed: ${r.status}.`);let n=Buffer.from(await r.arrayBuffer());if(n.length!==e.sizeBytes)throw new Error("Community skill package size did not match registry metadata.");if(M_("sha256").update(n).digest("hex")!==e.checksum)throw new Error("Community skill package checksum did not match registry metadata.");return n}async function F_(){let t=we.join(B(),"cache","community-installs");return await ye.mkdir(t,{recursive:!0}),ye.mkdtemp(we.join(t,"skill-"))}async function H_(t,e){let r;try{r=D_(t)}catch{throw new Error("Community skill package must be a gzip-compressed tar archive.")}let n=0;for(;n+512<=r.length;){let o=r.subarray(n,n+512);if(o.every(f=>f===0))return;let s=$s(o,0,100),i=$s(o,345,155),a=i?`${i}/${s}`:s,c=$s(o,124,12).trim(),l=Number.parseInt(c||"0",8);if(!Number.isFinite(l)||l<0)throw new Error("Community skill package has an invalid tar entry size.");let d=$s(o,156,1)||"0",p=n+512,u=p+l;if(u>r.length)throw new Error("Community skill package tar entry is truncated.");let m=K_(e,a);if(d==="5")await ye.mkdir(m,{recursive:!0});else if(d==="0"||d==="\0")await ye.mkdir(we.dirname(m),{recursive:!0}),await ye.writeFile(m,r.subarray(p,u));else throw new Error("Community skill package may only contain regular files and directories.");n=p+Math.ceil(l/512)*512}throw new Error("Community skill package tar archive is missing an end marker.")}async function B_(t,e){let r=we.join(t,"SKILL.md");try{if(!(await ye.stat(r)).isFile())throw new Error("not a file")}catch{throw new Error(`Community skill package is missing ${e.id}/SKILL.md.`)}}async function q_(t){let e=await ye.readFile(we.join(t,"SKILL.md"),"utf8");if(W_(e))throw new Error("Community skill package content failed prompt injection scan.")}function W_(t){return V_.some(e=>e.test(t))}function G_(t){let e=B(),r=ue(e),n=t.id,o=Ct(r,n,"installed");o.source="installed",o.state="active",o.registryResourceId=t.id,o.registryVersion=t.version,o.registrySourceTier=t.sourceTier,o.registryRiskTier=t.resourceRiskTier,o.registryEffectiveRiskTier=t.effectiveRiskTier,o.resourceType=t.type,o.launcherRequired=!1,o.manualReviewRequired=!1,o.sourceTier=t.sourceTier,o.riskTier=t.effectiveRiskTier,o.artifactDigest=`sha256:${t.checksum}`,o.staleAt=void 0,o.archivedAt=void 0,he(e,r)}function K_(t,e){let r=we.posix.normalize(e.replace(/\\/g,"/"));if(!r||r==="."||r.startsWith("../")||we.posix.isAbsolute(r))throw new Error("Community skill package contains an unsafe path.");let n=we.resolve(t,...r.split("/")),o=we.resolve(t);if(n!==o&&!n.startsWith(o+we.sep))throw new Error("Community skill package contains an unsafe path.");return n}function $s(t,e,r){let n=t.subarray(e,e+r),o=n.indexOf(0);return n.subarray(0,o===-1?n.length:o).toString("utf8")}function z_(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:null}var V_=[/\b(?:ignore|forget|override|disregard)\b[\s\S]{0,80}\b(?:previous|prior|system|developer|instructions?|prompt)\b/i,/\b(?:reveal|print|show|dump)\b[\s\S]{0,80}\b(?:system\s+prompt|developer\s+message|hidden\s+instructions?)\b/i,/\b(?:exfiltrate|dump|print|upload|send|leak)\b[\s\S]{0,80}\b(?:memory|memories|private\s+notes?|conversation|chat\s+history)\b/i,/\b(?:bypass|disable|skip|ignore|override)\b[\s\S]{0,80}\b(?:permissions?|approval|safety|sandbox|policy|guardrails?)\b/i,/\b(?:use|run|execute)\b[\s\S]{0,80}\b(?:shell|bash|powershell|tool|computer)\b[\s\S]{0,80}\b(?:read|steal|send|upload|exfiltrate)\b/i,/\b(?:read|steal|send|upload|exfiltrate)\b[\s\S]{0,80}\b(?:secrets?|tokens?|credentials?|ssh|private\s+key)\b/i];async function gh(t,e={}){if(t.type==="skill"&&t.kind==="inert")return mh(t,e);if(t.type==="pet"&&t.kind==="asset")return qf(t);if(Q_(t))return Z_(t);if(t.type==="mcp")return X_(t);throw new Error(`Unsupported community resource install type: ${t.type}/${t.kind}.`)}function X_(t){if(t.sourceTier!=="official")throw new Error("Community remote MCP endpoints are not supported for local install.");return{kind:"mcp",mode:"preview",resourceId:t.id,version:t.version,sourceTier:t.sourceTier,perUseConsentRequired:!0,declaredPermissions:Y_(t.manifest),manifest:t.manifest}}function Y_(t){if(!t||typeof t!="object"||Array.isArray(t))return[];let e=t.declaredPermissions;return Array.isArray(e)?e.filter(r=>typeof r=="string"):[]}var J_=new Set(["mcp","plugin","cron","hook","workflow","executable"]);function Q_(t){return J_.has(t.type)&&(t.kind==="local-executable"||t.kind==="executable")}function Z_(t){let e=t.sourceTier!=="official";return{kind:"executable",mode:e?"manual-review-required":"launcher-required",resourceId:t.id,version:t.version,resourceType:t.type,sourceTier:t.sourceTier,riskTier:t.effectiveRiskTier,artifactDigest:`sha256:${t.checksum}`,launcherRequired:!0,manualReviewRequired:e,autoRunBlocked:!0,manifest:t.manifest}}import*as gt from"node:fs";import*as cn from"node:path";import{gzipSync as s0}from"node:zlib";import*as fh from"node:fs";function Us(){let t=Lt();return t?{async recordTelemetry(e){let r=e0();!r.enabled||!r.signalsEnabled||!r.remoteSynced||await t.recordTelemetry(e)}}:null}function hh(t,e){t&&t.recordTelemetry(e).catch(()=>{})}function e0(){try{let t=JSON.parse(fh.readFileSync(I().getUserSettingsPath(),"utf8")),e=t.communityConsent;return At(t.communityConsent,e?.remoteSynced===!0)}catch{return At(null,!1)}}function yh(t){return/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/i.test(t)?{reason:"sensitive email",ruleId:"sensitive-email"}:/\b(?:sk-[A-Za-z0-9_-]{12,}|AKIA[0-9A-Z]{16})\b/.test(t)?{reason:"sensitive secret",ruleId:"sensitive-secret"}:/\b(?:api[_-]?key|token|secret|password)\s*[:=]\s*['"]?[A-Za-z0-9_\-.]{8,}/i.test(t)?{reason:"sensitive secret",ruleId:"sensitive-secret"}:/\b[A-Za-z]:\\[^\s"'`]+/.test(t)||/(?:^|\s)\/(?:Users|home|var|etc)\/[^\s"'`]+/.test(t)?{reason:"sensitive path",ruleId:"sensitive-path"}:/\b(?:\+?\d[\d -]{8,}\d)\b/.test(t)?{reason:"sensitive phone",ruleId:"sensitive-phone"}:null}function t0(t){let e=t.replace(/\r\n/g,`
210
+ `),source:"community",label:"Community",score:t.status==="matched"?.74:.68}}import{existsSync as T_,readFileSync as w_,writeFileSync as A_,mkdirSync as oh,renameSync as sh}from"node:fs";import{join as td,dirname as ih}from"node:path";var nh=30,P_=90,x_="skill-lifecycle.json";function ah(t){return td(t,x_)}function ue(t){let e=ah(t);try{return JSON.parse(w_(e,"utf8"))}catch{return{version:1,records:{}}}}function he(t,e){let r=ah(t);oh(ih(r),{recursive:!0});let n=r+".tmp";A_(n,JSON.stringify(e,null,2),"utf8"),sh(n,r)}function Ct(t,e,r="learned"){return t.records[e]||(t.records[e]={name:e,state:"active",createdAt:new Date().toISOString(),pinned:!1,useCount:0,source:r}),t.records[e]}function ch(t,e){let r=Ct(t,e);r.lastUsedAt=new Date().toISOString(),r.useCount++,r.state==="stale"&&(r.state="active",r.staleAt=void 0)}function rd(t,e){let r=Ct(t,e);r.lastPatchedAt=new Date().toISOString(),r.state==="stale"&&(r.state="active",r.staleAt=void 0)}function lh(t,e){let r=t.records[e];return r?(r.pinned=!0,!0):!1}function dh(t,e){let r=t.records[e];return r?(r.pinned=!1,!0):!1}function C_(t){let e=[t.lastUsedAt,t.lastViewedAt,t.lastPatchedAt,t.createdAt].filter(Boolean).map(r=>new Date(r));return new Date(Math.max(...e.map(r=>r.getTime())))}function I_(t){let e=Date.now(),r={transitioned:[],skippedPinned:[]};for(let[n,o]of Object.entries(t.records)){if(o.source==="installed")continue;if(o.pinned){o.state!=="active"&&r.skippedPinned.push(n);continue}let s=C_(o),i=(e-s.getTime())/(1e3*60*60*24);o.state==="active"&&i>=nh?(o.state="stale",o.staleAt=new Date().toISOString(),r.transitioned.push({name:n,from:"active",to:"stale"})):o.state==="stale"&&i>=P_?(o.state="archived",o.archivedAt=new Date().toISOString(),r.transitioned.push({name:n,from:"stale",to:"archived"})):o.state==="stale"&&i<nh&&(o.state="active",o.staleAt=void 0,r.transitioned.push({name:n,from:"stale",to:"active"}))}return r}function E_(t,e){let r=td(t,e);if(!T_(r))return!1;let n=td(t,".archive",e);oh(ih(n),{recursive:!0});try{return sh(r,n),!0}catch{return!1}}function uh(t,e){let r=ue(t),n=I_(r);for(let o of n.transitioned)o.to==="archived"&&E_(e,o.name);return he(t,r),n}function ph(t,e){return Object.values(t.records).filter(r=>r.state===e)}function js(t,e){delete t.records[e]}var N_=/^[a-z0-9][a-z0-9-]{1,62}[a-z0-9]$/,L_=/^[a-f0-9]{64}$/,O_=20*1024*1024;async function mh(t,e={}){j_(t);let r=e.fetchFn??fetch,n=await U_(r,t),o=await F_(),s=!1;try{await H_(n,o),await B_(o,t),await q_(o);let i=sr(),a=Ae.join(i,t.id);if(__(a))throw new Error(`Community skill "${t.id}" is already installed.`);return await ye.mkdir(i,{recursive:!0}),await ye.rename(o,a),s=!0,G_(t),mt(),{resourceId:t.id,version:t.version,skillName:t.id,installDir:a,checksum:t.checksum}}finally{s||await ye.rm(o,{recursive:!0,force:!0})}}function j_(t){if(!N_.test(t.id))throw new Error("Community install resource id must be a registry slug.");if(t.type!=="skill"||t.kind!=="inert")throw new Error("M1 local install only supports inert skill resources.");if(!$_(t))throw new Error("M1 local install requires an official resource or an approved community review.");if(t.resourceRiskTier!=="R0"||t.effectiveRiskTier!=="R0")throw new Error("M1 local install only supports R0 skill resources without high-risk dependencies.");if(t.requires.length>0||t.dependencies.length>0)throw new Error("M1 local skill install requires an empty dependency closure.");let e=z_(t.manifest);if(e?.schema_version!==15||e.kind!=="inert"||e.entry!=="SKILL.md")throw new Error("Community skill install requires a v15 inert manifest with entry=SKILL.md.");if(!L_.test(t.checksum))throw new Error("Community skill package checksum must be a sha256 hex digest.");if(!Number.isSafeInteger(t.sizeBytes)||t.sizeBytes<=0||t.sizeBytes>O_)throw new Error("Community skill package size is invalid or exceeds the M1 20MB limit.")}function $_(t){return t.sourceTier==="official"||t.sourceTier==="community"&&t.reviewStatus==="approved"}async function U_(t,e){let r;try{r=await t(e.downloadUrl,{method:"GET",signal:AbortSignal.timeout(3e4)})}catch{throw new Error("Community skill package download failed.")}if(!r.ok)throw new Error(`Community skill package download failed: ${r.status}.`);let n=Buffer.from(await r.arrayBuffer());if(n.length!==e.sizeBytes)throw new Error("Community skill package size did not match registry metadata.");if(M_("sha256").update(n).digest("hex")!==e.checksum)throw new Error("Community skill package checksum did not match registry metadata.");return n}async function F_(){let t=Ae.join(B(),"cache","community-installs");return await ye.mkdir(t,{recursive:!0}),ye.mkdtemp(Ae.join(t,"skill-"))}async function H_(t,e){let r;try{r=D_(t)}catch{throw new Error("Community skill package must be a gzip-compressed tar archive.")}let n=0;for(;n+512<=r.length;){let o=r.subarray(n,n+512);if(o.every(f=>f===0))return;let s=$s(o,0,100),i=$s(o,345,155),a=i?`${i}/${s}`:s,c=$s(o,124,12).trim(),l=Number.parseInt(c||"0",8);if(!Number.isFinite(l)||l<0)throw new Error("Community skill package has an invalid tar entry size.");let d=$s(o,156,1)||"0",p=n+512,u=p+l;if(u>r.length)throw new Error("Community skill package tar entry is truncated.");let m=K_(e,a);if(d==="5")await ye.mkdir(m,{recursive:!0});else if(d==="0"||d==="\0")await ye.mkdir(Ae.dirname(m),{recursive:!0}),await ye.writeFile(m,r.subarray(p,u));else throw new Error("Community skill package may only contain regular files and directories.");n=p+Math.ceil(l/512)*512}throw new Error("Community skill package tar archive is missing an end marker.")}async function B_(t,e){let r=Ae.join(t,"SKILL.md");try{if(!(await ye.stat(r)).isFile())throw new Error("not a file")}catch{throw new Error(`Community skill package is missing ${e.id}/SKILL.md.`)}}async function q_(t){let e=await ye.readFile(Ae.join(t,"SKILL.md"),"utf8");if(W_(e))throw new Error("Community skill package content failed prompt injection scan.")}function W_(t){return V_.some(e=>e.test(t))}function G_(t){let e=B(),r=ue(e),n=t.id,o=Ct(r,n,"installed");o.source="installed",o.state="active",o.registryResourceId=t.id,o.registryVersion=t.version,o.registrySourceTier=t.sourceTier,o.registryRiskTier=t.resourceRiskTier,o.registryEffectiveRiskTier=t.effectiveRiskTier,o.resourceType=t.type,o.launcherRequired=!1,o.manualReviewRequired=!1,o.sourceTier=t.sourceTier,o.riskTier=t.effectiveRiskTier,o.artifactDigest=`sha256:${t.checksum}`,o.staleAt=void 0,o.archivedAt=void 0,he(e,r)}function K_(t,e){let r=Ae.posix.normalize(e.replace(/\\/g,"/"));if(!r||r==="."||r.startsWith("../")||Ae.posix.isAbsolute(r))throw new Error("Community skill package contains an unsafe path.");let n=Ae.resolve(t,...r.split("/")),o=Ae.resolve(t);if(n!==o&&!n.startsWith(o+Ae.sep))throw new Error("Community skill package contains an unsafe path.");return n}function $s(t,e,r){let n=t.subarray(e,e+r),o=n.indexOf(0);return n.subarray(0,o===-1?n.length:o).toString("utf8")}function z_(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:null}var V_=[/\b(?:ignore|forget|override|disregard)\b[\s\S]{0,80}\b(?:previous|prior|system|developer|instructions?|prompt)\b/i,/\b(?:reveal|print|show|dump)\b[\s\S]{0,80}\b(?:system\s+prompt|developer\s+message|hidden\s+instructions?)\b/i,/\b(?:exfiltrate|dump|print|upload|send|leak)\b[\s\S]{0,80}\b(?:memory|memories|private\s+notes?|conversation|chat\s+history)\b/i,/\b(?:bypass|disable|skip|ignore|override)\b[\s\S]{0,80}\b(?:permissions?|approval|safety|sandbox|policy|guardrails?)\b/i,/\b(?:use|run|execute)\b[\s\S]{0,80}\b(?:shell|bash|powershell|tool|computer)\b[\s\S]{0,80}\b(?:read|steal|send|upload|exfiltrate)\b/i,/\b(?:read|steal|send|upload|exfiltrate)\b[\s\S]{0,80}\b(?:secrets?|tokens?|credentials?|ssh|private\s+key)\b/i];async function gh(t,e={}){if(t.type==="skill"&&t.kind==="inert")return mh(t,e);if(t.type==="pet"&&t.kind==="asset")return qf(t);if(Q_(t))return Z_(t);if(t.type==="mcp")return X_(t);throw new Error(`Unsupported community resource install type: ${t.type}/${t.kind}.`)}function X_(t){if(t.sourceTier!=="official")throw new Error("Community remote MCP endpoints are not supported for local install.");return{kind:"mcp",mode:"preview",resourceId:t.id,version:t.version,sourceTier:t.sourceTier,perUseConsentRequired:!0,declaredPermissions:Y_(t.manifest),manifest:t.manifest}}function Y_(t){if(!t||typeof t!="object"||Array.isArray(t))return[];let e=t.declaredPermissions;return Array.isArray(e)?e.filter(r=>typeof r=="string"):[]}var J_=new Set(["mcp","plugin","cron","hook","workflow","executable"]);function Q_(t){return J_.has(t.type)&&(t.kind==="local-executable"||t.kind==="executable")}function Z_(t){let e=t.sourceTier!=="official";return{kind:"executable",mode:e?"manual-review-required":"launcher-required",resourceId:t.id,version:t.version,resourceType:t.type,sourceTier:t.sourceTier,riskTier:t.effectiveRiskTier,artifactDigest:`sha256:${t.checksum}`,launcherRequired:!0,manualReviewRequired:e,autoRunBlocked:!0,manifest:t.manifest}}import*as gt from"node:fs";import*as cn from"node:path";import{gzipSync as s0}from"node:zlib";import*as fh from"node:fs";function Us(){let t=Lt();return t?{async recordTelemetry(e){let r=e0();!r.enabled||!r.signalsEnabled||!r.remoteSynced||await t.recordTelemetry(e)}}:null}function hh(t,e){t&&t.recordTelemetry(e).catch(()=>{})}function e0(){try{let t=JSON.parse(fh.readFileSync(I().getUserSettingsPath(),"utf8")),e=t.communityConsent;return At(t.communityConsent,e?.remoteSynced===!0)}catch{return At(null,!1)}}function yh(t){return/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/i.test(t)?{reason:"sensitive email",ruleId:"sensitive-email"}:/\b(?:sk-[A-Za-z0-9_-]{12,}|AKIA[0-9A-Z]{16})\b/.test(t)?{reason:"sensitive secret",ruleId:"sensitive-secret"}:/\b(?:api[_-]?key|token|secret|password)\s*[:=]\s*['"]?[A-Za-z0-9_\-.]{8,}/i.test(t)?{reason:"sensitive secret",ruleId:"sensitive-secret"}:/\b[A-Za-z]:\\[^\s"'`]+/.test(t)||/(?:^|\s)\/(?:Users|home|var|etc)\/[^\s"'`]+/.test(t)?{reason:"sensitive path",ruleId:"sensitive-path"}:/\b(?:\+?\d[\d -]{8,}\d)\b/.test(t)?{reason:"sensitive phone",ruleId:"sensitive-phone"}:null}function t0(t){let e=t.replace(/\r\n/g,`
211
211
  `).replace(/\r/g,`
212
212
  `);if(!e.startsWith("---"))return;let r=e.indexOf(`
213
213
  ---`,3);if(r!==-1)return e.slice(4,r)}function r0(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t}function n0(t,e){let r=[],n=e+1;for(;n<t.length;){let o=t[n];if(o.length>0&&!o.startsWith(" ")&&!o.startsWith(" "))break;r.push(o),n+=1}return{value:r.join(`
@@ -349,23 +349,23 @@ ${p}${u}`}],details:{type:"notebook_edit",edit_mode:o,cell_number:n,total_cells:
349
349
  `];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(`
350
350
  `)}],details:{type:"file_query",count:o.length}}}}}var qN="file_delete",WN={type:"object",properties:{file_id:{type:"string",description:"ID of the uploaded file to delete."}},required:["file_id"]};function uv(t){return{name:qN,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:WN,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 GN="ask_user",KN={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 pv(t){return{name:GN,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:KN,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(`
351
351
  `)}],details:{type:"ask_user",answers:o,questionCount:r.questions.length}}}}}var zN="project_switch",VN={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 mv(t){return{name:zN,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(`
352
- `),parameters:VN,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 gv,ProviderRegistry as fv,createDebugTransport as XN,createLLMClient as Zs,isAsyncMediaTransport as jd,isDebugTransportEnabled as YN}from"@xiaozhiclaw/provider-core";import{cleanSchemaForGemini as K5}from"@xiaozhiclaw/provider-core/gemini-schema-utils";import{GeminiFileAPI as JN}from"@xiaozhiclaw/provider-core/transports/gemini-file-api";import{MiniMaxMediaTransport as QN}from"@xiaozhiclaw/provider-core/transports/minimax-media";import{VolcengineMediaTransport as ZN}from"@xiaozhiclaw/provider-core/transports/volcengine-media";import{ZhipuToolAPI as eL}from"@xiaozhiclaw/provider-core/transports/zhipu-tool-api";var tL=new Set(["zhipu","zhipu-openai","zhipu-coding"]),rL="https://open.bigmodel.cn/api/paas/v4",nL={bytedance:"volcengine",doubao:"volcengine"};function ei(t){let e=t.trim().toLowerCase();return nL[e]??e}function cr(t,e){return t[e]??t[ei(e)]}function hv(t,e){if(!(!t||!e)&&tL.has(t))return new eL({baseUrl:rL,apiKey:e})}function yv(t,e){return YN()?XN(t,e):t}function vv(t){return t instanceof QN}function bv(t){return t instanceof ZN}var Od;function kv(){return Od||(Od=new JN({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"]),Rv=new Set([...$d,"agent"]);function Ud(t,e){let r=e?$d:Rv;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 jt=new Hd;function Sv(){return jt}function Tv(t){jt.setTools(t)}function ti(t){jt.addTool(t)}function ri(t){jt.addTools(t)}function dn(t){return jt.removeTool(t)}function wv(t){return jt.findTool(t)}function ni(){return jt.getToolNames()}function Av(t){return jt.activateTool(t)}function Pv(){jt.clearActivatedTools()}function xv(t=!1){return jt.getToolManifest(t)}function Cv(t=Sv()){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=>wv(t),getToolManifest:t=>xv(t),getToolNames:()=>ni(),setTools:t=>Tv(t),addTool:t=>ti(t),addTools:t=>ri(t),removeTool:t=>dn(t),activateTool:t=>Av(t),clearActivatedTools:()=>Pv()}}var Ae,Or={},Ev,Bd,lr={},Mv;function oi(t){Mv=t}function _v(){return Mv}function qd(t,e,r,n,o){Ae=t,Or=e??{},Ev=r,Bd=o,lr=n??{},sL()}function Dv(){return{mediaClient:Ae,mediaProviders:lr,mediaApiKeys:Or}}function Wd(t){let e=lr[t];if(!(!e||!Ae))return Ae.resolveModelById(e.provider,e.model,t)}function sL(){iL(),aL(),cL(),lL()}function iL(){let t=Lr().findTool(Dd);if(!t)return;let e=lr.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 aL(){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 cL(){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 lL(){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 It(t){if(!Ae)throw new Error(`No media provider configured for ${t.mediaType}`);let e=lr[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 Iv(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 Iv(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}:
352
+ `),parameters:VN,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 gv,ProviderRegistry as fv,createDebugTransport as XN,createLLMClient as Zs,isAsyncMediaTransport as jd,isDebugTransportEnabled as YN}from"@xiaozhiclaw/provider-core";import{cleanSchemaForGemini as K5}from"@xiaozhiclaw/provider-core/gemini-schema-utils";import{GeminiFileAPI as JN}from"@xiaozhiclaw/provider-core/transports/gemini-file-api";import{MiniMaxMediaTransport as QN}from"@xiaozhiclaw/provider-core/transports/minimax-media";import{VolcengineMediaTransport as ZN}from"@xiaozhiclaw/provider-core/transports/volcengine-media";import{ZhipuToolAPI as eL}from"@xiaozhiclaw/provider-core/transports/zhipu-tool-api";var tL=new Set(["zhipu","zhipu-openai","zhipu-coding"]),rL="https://open.bigmodel.cn/api/paas/v4",nL={bytedance:"volcengine",doubao:"volcengine"};function ei(t){let e=t.trim().toLowerCase();return nL[e]??e}function cr(t,e){return t[e]??t[ei(e)]}function hv(t,e){if(!(!t||!e)&&tL.has(t))return new eL({baseUrl:rL,apiKey:e})}function yv(t,e){return YN()?XN(t,e):t}function vv(t){return t instanceof QN}function bv(t){return t instanceof ZN}var Od;function kv(){return Od||(Od=new JN({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"]),Rv=new Set([...$d,"agent"]);function Ud(t,e){let r=e?$d:Rv;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 jt=new Hd;function Sv(){return jt}function Tv(t){jt.setTools(t)}function ti(t){jt.addTool(t)}function ri(t){jt.addTools(t)}function dn(t){return jt.removeTool(t)}function wv(t){return jt.findTool(t)}function ni(){return jt.getToolNames()}function Av(t){return jt.activateTool(t)}function Pv(){jt.clearActivatedTools()}function xv(t=!1){return jt.getToolManifest(t)}function Cv(t=Sv()){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=>wv(t),getToolManifest:t=>xv(t),getToolNames:()=>ni(),setTools:t=>Tv(t),addTool:t=>ti(t),addTools:t=>ri(t),removeTool:t=>dn(t),activateTool:t=>Av(t),clearActivatedTools:()=>Pv()}}var Pe,Or={},Ev,Bd,lr={},Mv;function oi(t){Mv=t}function _v(){return Mv}function qd(t,e,r,n,o){Pe=t,Or=e??{},Ev=r,Bd=o,lr=n??{},sL()}function Dv(){return{mediaClient:Pe,mediaProviders:lr,mediaApiKeys:Or}}function Wd(t){let e=lr[t];if(!(!e||!Pe))return Pe.resolveModelById(e.provider,e.model,t)}function sL(){iL(),aL(),cL(),lL()}function iL(){let t=Lr().findTool(Dd);if(!t)return;let e=lr.video;if(!e||!Pe)return;let r=Pe.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 aL(){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 cL(){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 lL(){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 It(t){if(!Pe)throw new Error(`No media provider configured for ${t.mediaType}`);let e=lr[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 Iv(r,n||t.model,o);if(s.ok)return s.result;let i=Pe.listMediaModels(t.mediaType),a=[`${r}: ${s.error}`];for(let c of i){if(c.providerId===r||!Or[c.providerId])continue;let d=await Iv(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
353
  `+a.map(c=>` - ${c}`).join(`
354
- `))}async function Iv(t,e,r){let n=Ae.getTransport(t);if(!n)return{ok:!1,error:"transport not available"};let o=cr(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 Ev?.(a,c,l),{ok:!0,result:i}}catch(s){return{ok:!1,error:s instanceof Error?s.message:String(s)}}}function Et(t){if(!Ae)return!1;let e=lr[t];if(!e)return!1;let r=Ae.getTransport(e.provider),n=cr(Or,e.provider);return!!(r&&n)}function si(t,e){if(!Et(t))return!1;let r=lr[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 Nv(t){let e=lr.music;if(!e||!Ae)return"";let r=Ae.getTransport(e.provider);if(!vv(r))return"";let n=cr(Or,e.provider);return n?r.generateLyrics(t,n):""}async function Lv(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=cr(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 un from"node:fs";import*as ai from"node:path";function dL(t={}){let e=t.createGeminiFileApi??kv,r=t.isVolcengineFileTransport??bv,n=a=>{if(a.mediaClient)for(let[,c]of Object.entries(a.mediaProviders)){if(!c)continue;let l=a.mediaClient.getTransport(c.provider),d=cr(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=cr(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 Ov(u)}let p=await s(a,l.id).getFile(c,i(a,l.id));return jv(p,c)},listFiles:async(a,c)=>{let l=o(a);return l.type==="gemini"?(await e().listFiles(a.mediaApiKeys.google,{pageSize:c})).files.map(Ov):((await s(a,l.id).listFiles(i(a,l.id),{limit:c})).data??[]).map(u=>jv(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=dL();function Ov(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 jv(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 $v(t){let e=t.maxUploadBytes??104857600,r=t.mediaFileApiService??Gd;return{isAvailable:()=>Uv(t.getContext(),r),uploadFile:async n=>{ii(t.getContext(),r,"upload");let o=t.resolvePath(n.filePath);if(!un.existsSync(o))throw new Error(`File not found: ${o}`);let s=un.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 un.promises.readFile(o),a=ai.basename(o),c=ai.extname(o).toLowerCase();return r.uploadFile(t.getContext(),{buffer:Buffer.from(i),filename:a,bytes:s.size,mimeType:uL[c]??"application/octet-stream",purpose:n.purpose??"media_reference"})},queryFile:async n=>(ii(t.getContext(),r,"query"),r.queryFile(t.getContext(),n.fileId)),listFiles:async n=>(ii(t.getContext(),r,"list"),r.listFiles(t.getContext(),n.limit??10)),deleteFile:async n=>{ii(t.getContext(),r,"delete"),await r.deleteFile(t.getContext(),n.fileId)}}}function Uv(t,e=Gd){return!!e.resolveProvider(t)}function ii(t,e,r){if(!Uv(t,e))throw new Error(`No file ${r} provider available. Configure a media provider with Files API support (e.g. Volcengine, Google).`)}var uL={".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 Fv(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 Jt=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 pn(t,e){return e?{json:t,binary:e}:{json:t}}function Hv(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 zd(e)}function zd(t){return JSON.stringify(Kd(t))}function Kd(t){if(Array.isArray(t))return t.map(Kd);if(t&&typeof t=="object"){let e={};for(let r of Object.keys(t).sort())e[r]=Kd(t[r]);return e}return t}var Wv=new Set(["__proto__","prototype","constructor"]);function Bv(t,e){let r=pL(t),n=new Yd(r,t),o=n.parseExpression();return n.expectEnd(),mn(o,e)}function Qd(t,e){let r=t.match(/^\s*\{\{([\s\S]*)\}\}\s*$/);return r?Bv(r[1],e):t.includes("{{")?t.replace(/\{\{([\s\S]*?)\}\}/g,(n,o)=>{let s=Bv(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 Gv(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 pL(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`)}},Kv=Symbol("nodeAccessor");function mn(t,e){switch(t.type){case"lit":return t.value;case"root":return mL(t.name,e);case"func":return gL(t.name,t.args.map(r=>mn(r,e)));case"prop":return qv(mn(t.target,e),t.key);case"index":return qv(mn(t.target,e),t.key);case"call":{if(mn(t.target,e)===Kv){let n=t.args.map(s=>mn(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 mL(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 Kv;default:throw new Error(`Unknown context root "$${t}" (allowed: $input $json $node $now $vars $trigger)`)}}function qv(t,e){if(typeof e=="string"&&Wv.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 gL(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(li(e,0,"upper")).toUpperCase();case"lower":return String(li(e,0,"lower")).toLowerCase();case"default":return e[0]===null||e[0]===void 0?e[1]:e[0];case"jsonpath":return hL(e[0],String(li(e,1,"jsonpath")));case"date":return yL(e);case"eq":return Jd(e[0],e[1]);case"ne":return!Jd(e[0],e[1]);case"gt":return ci(e[0],e[1])>0;case"gte":return ci(e[0],e[1])>=0;case"lt":return ci(e[0],e[1])<0;case"lte":return ci(e[0],e[1])<=0;case"not":return!Vd(li(e,0,"not"));case"and":return e.every(Vd);case"or":return e.some(Vd);case"contains":return fL(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 ci(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 fL(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 li(t,e,r){if(t.length<=e||t[e]===void 0)throw new Error(`${r}() missing required argument #${e+1}`);return t[e]}function hL(t,e){let r=e.match(/[^.[\]]+/g)??[],n=t;for(let o of r){if(Wv.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 yL(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 vL=(t,e)=>({outputs:{default:[{json:e.json&&typeof e.json=="object"&&!Array.isArray(e.json)?e.json:{value:e.json??e.value??null}}]}}),bL=t=>({outputs:{default:t.default??[]}}),kL=t=>{let e=[];for(let r of Object.keys(t))e.push(...t[r]);return{outputs:{default:e}}},RL=(t,e)=>{let n=!!e.condition?"true":"false",o=t.default??[],s={true:[],false:[]};return s[n]=o,{outputs:s,firedPorts:[n]}},SL=(t,e,r)=>({outputs:{default:[{json:r.trigger??(e.payload&&typeof e.payload=="object"&&!Array.isArray(e.payload)?e.payload:{})}]}}),zv={set:vL,passthrough:bL,merge:kL,if:RL,trigger:SL};var gn=class{executors=new Map;constructor(e=!0){if(e)for(let[r,n]of Object.entries(zv))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 fo(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 fn(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 Vv(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 TL=async(t,e,r)=>({outputs:{default:await fo(r.host,"agent").runAgent({agentId:typeof e.agentId=="string"?e.agentId:void 0,prompt:fn(e,"prompt","agent"),input:t.default??[],signal:r.signal})}}),wL=async(t,e,r)=>({outputs:{default:await fo(r.host,"tool").invokeTool({tool:fn(e,"tool","tool"),args:Vv(e,"args"),input:t.default??[],signal:r.signal})}}),AL=async(t,e,r)=>{let n=fo(r.host,"http"),o=typeof e.method=="string"?e.method:"GET";return{outputs:{default:await n.httpRequest({method:o,url:fn(e,"url","http"),headers:e.headers,body:e.body,signal:r.signal})}}},PL=async(t,e,r)=>({outputs:{default:await fo(r.host,"mcp").invokeMcp({server:fn(e,"server","mcp"),tool:fn(e,"tool","mcp"),args:Vv(e,"args"),signal:r.signal})}}),xL=async(t,e,r)=>({outputs:{default:await fo(r.host,"channel").sendChannel({channel:fn(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})}}),ho={agent:TL,tool:wL,http:AL,mcp:PL,channel:xL},R8=Object.keys(ho);var hn=class extends Error{constructor(r){super(r?`Workflow paused at "${r}"`:"Workflow paused");this.atNodeId=r;this.name="WorkflowPauseSignal"}atNodeId},di=class{constructor(e,r={}){this.def=e;if(this.registry=r.registry??new gn,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(ho))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 hn)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 hn(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=Gv(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 zd([e,r,Hv(n),o])}buildDag(){let e=this.def.nodes.map(n=>({id:n.id,kind:n.kind,params:n.params??{},outPorts:n.outPorts??CL(n.kind),joinPolicy:n.joinPolicy??"all",maxIterations:n.maxIterations})),r=new Jt(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 CL(t){return t==="if"?["true","false"]:t==="loop"?["loop","done"]:["default"]}var IL=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},ui=class extends hn{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},pi=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&&IL.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 ui(e,"duration",this.maxDurationMs);if(this.executions>=this.maxNodeExecutions)throw new ui(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 Jv(t){switch(t.type){case"manual":return[];case"schedule":return tu(t.cron);case"im-message":return _L(t.channel,t.match);case"webhook":return DL(t.path);default:return[`unknown trigger type: ${JSON.stringify(t)}`]}}var Xv=["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"],Yv=["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:Xv},{label:"day-of-week",min:0,max:7,names:Yv}]:[{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:Xv},{label:"day-of-week",min:0,max:7,names:Yv}],o=[];for(let s=0;s<n.length;s++){let i=EL(e[s],n[s]);i&&o.push(`schedule.cron ${i}`)}return o}function EL(t,e){for(let r of t.split(",")){let n=ML(r,e);if(n)return n}}function ML(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 _L(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 DL(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 dr=class extends Error{constructor(r){super(`Patch rejected: ${r.join("; ")}`);this.errors=r;this.name="PatchError"}errors};function Qv(t,e){let r=[],n=OL(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=NL(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=Jv(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 dr(r);if(Zv(n.def,r),r.length>0)throw new dr(r);return{target:n,applied:c}}function NL(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 Zv(t,e),e}function Zv(t,e){try{let r=t.nodes.map(o=>({id:o.id,kind:o.kind,params:o.params??{},outPorts:o.outPorts??LL(o.kind),joinPolicy:o.joinPolicy??"all",maxIterations:o.maxIterations})),n=new Jt(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 LL(t){return t==="if"?["true","false"]:t==="loop"?["loop","done"]:["default"]}function OL(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 eb(t,e={}){let r=e.maxNodes??50,n=e.maxValueLen??60,o=`Workflow ${JSON.stringify(t.name)} (rev ${t.rev}, trigger: ${jL(t.trigger)}, ${t.active?"active":"inactive"})`,s=t.def.nodes,a=s.slice(0,r).map(p=>" "+$L(p,n)),c=s.length===0?"nodes: (none)":["nodes:",...a].join(`
354
+ `))}async function Iv(t,e,r){let n=Pe.getTransport(t);if(!n)return{ok:!1,error:"transport not available"};let o=cr(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 Ev?.(a,c,l),{ok:!0,result:i}}catch(s){return{ok:!1,error:s instanceof Error?s.message:String(s)}}}function Et(t){if(!Pe)return!1;let e=lr[t];if(!e)return!1;let r=Pe.getTransport(e.provider),n=cr(Or,e.provider);return!!(r&&n)}function si(t,e){if(!Et(t))return!1;let r=lr[t],n=Pe.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 Nv(t){let e=lr.music;if(!e||!Pe)return"";let r=Pe.getTransport(e.provider);if(!vv(r))return"";let n=cr(Or,e.provider);return n?r.generateLyrics(t,n):""}async function Lv(t){let e=t.provider??"doubao";if(!Pe)return{ok:!1,message:"Media client not configured."};let r=Pe.getTransport(e);if(!r)return{ok:!1,message:`No transport for provider: ${e}`};let n=cr(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 un from"node:fs";import*as ai from"node:path";function dL(t={}){let e=t.createGeminiFileApi??kv,r=t.isVolcengineFileTransport??bv,n=a=>{if(a.mediaClient)for(let[,c]of Object.entries(a.mediaProviders)){if(!c)continue;let l=a.mediaClient.getTransport(c.provider),d=cr(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=cr(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 Ov(u)}let p=await s(a,l.id).getFile(c,i(a,l.id));return jv(p,c)},listFiles:async(a,c)=>{let l=o(a);return l.type==="gemini"?(await e().listFiles(a.mediaApiKeys.google,{pageSize:c})).files.map(Ov):((await s(a,l.id).listFiles(i(a,l.id),{limit:c})).data??[]).map(u=>jv(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=dL();function Ov(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 jv(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 $v(t){let e=t.maxUploadBytes??104857600,r=t.mediaFileApiService??Gd;return{isAvailable:()=>Uv(t.getContext(),r),uploadFile:async n=>{ii(t.getContext(),r,"upload");let o=t.resolvePath(n.filePath);if(!un.existsSync(o))throw new Error(`File not found: ${o}`);let s=un.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 un.promises.readFile(o),a=ai.basename(o),c=ai.extname(o).toLowerCase();return r.uploadFile(t.getContext(),{buffer:Buffer.from(i),filename:a,bytes:s.size,mimeType:uL[c]??"application/octet-stream",purpose:n.purpose??"media_reference"})},queryFile:async n=>(ii(t.getContext(),r,"query"),r.queryFile(t.getContext(),n.fileId)),listFiles:async n=>(ii(t.getContext(),r,"list"),r.listFiles(t.getContext(),n.limit??10)),deleteFile:async n=>{ii(t.getContext(),r,"delete"),await r.deleteFile(t.getContext(),n.fileId)}}}function Uv(t,e=Gd){return!!e.resolveProvider(t)}function ii(t,e,r){if(!Uv(t,e))throw new Error(`No file ${r} provider available. Configure a media provider with Files API support (e.g. Volcengine, Google).`)}var uL={".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 Fv(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 Jt=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 pn(t,e){return e?{json:t,binary:e}:{json:t}}function Hv(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 zd(e)}function zd(t){return JSON.stringify(Kd(t))}function Kd(t){if(Array.isArray(t))return t.map(Kd);if(t&&typeof t=="object"){let e={};for(let r of Object.keys(t).sort())e[r]=Kd(t[r]);return e}return t}var Wv=new Set(["__proto__","prototype","constructor"]);function Bv(t,e){let r=pL(t),n=new Yd(r,t),o=n.parseExpression();return n.expectEnd(),mn(o,e)}function Qd(t,e){let r=t.match(/^\s*\{\{([\s\S]*)\}\}\s*$/);return r?Bv(r[1],e):t.includes("{{")?t.replace(/\{\{([\s\S]*?)\}\}/g,(n,o)=>{let s=Bv(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 Gv(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 pL(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`)}},Kv=Symbol("nodeAccessor");function mn(t,e){switch(t.type){case"lit":return t.value;case"root":return mL(t.name,e);case"func":return gL(t.name,t.args.map(r=>mn(r,e)));case"prop":return qv(mn(t.target,e),t.key);case"index":return qv(mn(t.target,e),t.key);case"call":{if(mn(t.target,e)===Kv){let n=t.args.map(s=>mn(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 mL(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 Kv;default:throw new Error(`Unknown context root "$${t}" (allowed: $input $json $node $now $vars $trigger)`)}}function qv(t,e){if(typeof e=="string"&&Wv.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 gL(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(li(e,0,"upper")).toUpperCase();case"lower":return String(li(e,0,"lower")).toLowerCase();case"default":return e[0]===null||e[0]===void 0?e[1]:e[0];case"jsonpath":return hL(e[0],String(li(e,1,"jsonpath")));case"date":return yL(e);case"eq":return Jd(e[0],e[1]);case"ne":return!Jd(e[0],e[1]);case"gt":return ci(e[0],e[1])>0;case"gte":return ci(e[0],e[1])>=0;case"lt":return ci(e[0],e[1])<0;case"lte":return ci(e[0],e[1])<=0;case"not":return!Vd(li(e,0,"not"));case"and":return e.every(Vd);case"or":return e.some(Vd);case"contains":return fL(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 ci(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 fL(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 li(t,e,r){if(t.length<=e||t[e]===void 0)throw new Error(`${r}() missing required argument #${e+1}`);return t[e]}function hL(t,e){let r=e.match(/[^.[\]]+/g)??[],n=t;for(let o of r){if(Wv.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 yL(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 vL=(t,e)=>({outputs:{default:[{json:e.json&&typeof e.json=="object"&&!Array.isArray(e.json)?e.json:{value:e.json??e.value??null}}]}}),bL=t=>({outputs:{default:t.default??[]}}),kL=t=>{let e=[];for(let r of Object.keys(t))e.push(...t[r]);return{outputs:{default:e}}},RL=(t,e)=>{let n=!!e.condition?"true":"false",o=t.default??[],s={true:[],false:[]};return s[n]=o,{outputs:s,firedPorts:[n]}},SL=(t,e,r)=>({outputs:{default:[{json:r.trigger??(e.payload&&typeof e.payload=="object"&&!Array.isArray(e.payload)?e.payload:{})}]}}),zv={set:vL,passthrough:bL,merge:kL,if:RL,trigger:SL};var gn=class{executors=new Map;constructor(e=!0){if(e)for(let[r,n]of Object.entries(zv))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 fo(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 fn(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 Vv(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 TL=async(t,e,r)=>({outputs:{default:await fo(r.host,"agent").runAgent({agentId:typeof e.agentId=="string"?e.agentId:void 0,prompt:fn(e,"prompt","agent"),input:t.default??[],signal:r.signal})}}),wL=async(t,e,r)=>({outputs:{default:await fo(r.host,"tool").invokeTool({tool:fn(e,"tool","tool"),args:Vv(e,"args"),input:t.default??[],signal:r.signal})}}),AL=async(t,e,r)=>{let n=fo(r.host,"http"),o=typeof e.method=="string"?e.method:"GET";return{outputs:{default:await n.httpRequest({method:o,url:fn(e,"url","http"),headers:e.headers,body:e.body,signal:r.signal})}}},PL=async(t,e,r)=>({outputs:{default:await fo(r.host,"mcp").invokeMcp({server:fn(e,"server","mcp"),tool:fn(e,"tool","mcp"),args:Vv(e,"args"),signal:r.signal})}}),xL=async(t,e,r)=>({outputs:{default:await fo(r.host,"channel").sendChannel({channel:fn(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})}}),ho={agent:TL,tool:wL,http:AL,mcp:PL,channel:xL},R8=Object.keys(ho);var hn=class extends Error{constructor(r){super(r?`Workflow paused at "${r}"`:"Workflow paused");this.atNodeId=r;this.name="WorkflowPauseSignal"}atNodeId},di=class{constructor(e,r={}){this.def=e;if(this.registry=r.registry??new gn,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(ho))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 hn)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 hn(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=Gv(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 zd([e,r,Hv(n),o])}buildDag(){let e=this.def.nodes.map(n=>({id:n.id,kind:n.kind,params:n.params??{},outPorts:n.outPorts??CL(n.kind),joinPolicy:n.joinPolicy??"all",maxIterations:n.maxIterations})),r=new Jt(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 CL(t){return t==="if"?["true","false"]:t==="loop"?["loop","done"]:["default"]}var IL=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},ui=class extends hn{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},pi=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&&IL.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 ui(e,"duration",this.maxDurationMs);if(this.executions>=this.maxNodeExecutions)throw new ui(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 Jv(t){switch(t.type){case"manual":return[];case"schedule":return tu(t.cron);case"im-message":return _L(t.channel,t.match);case"webhook":return DL(t.path);default:return[`unknown trigger type: ${JSON.stringify(t)}`]}}var Xv=["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"],Yv=["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:Xv},{label:"day-of-week",min:0,max:7,names:Yv}]:[{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:Xv},{label:"day-of-week",min:0,max:7,names:Yv}],o=[];for(let s=0;s<n.length;s++){let i=EL(e[s],n[s]);i&&o.push(`schedule.cron ${i}`)}return o}function EL(t,e){for(let r of t.split(",")){let n=ML(r,e);if(n)return n}}function ML(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 _L(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 DL(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 dr=class extends Error{constructor(r){super(`Patch rejected: ${r.join("; ")}`);this.errors=r;this.name="PatchError"}errors};function Qv(t,e){let r=[],n=OL(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=NL(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=Jv(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 dr(r);if(Zv(n.def,r),r.length>0)throw new dr(r);return{target:n,applied:c}}function NL(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 Zv(t,e),e}function Zv(t,e){try{let r=t.nodes.map(o=>({id:o.id,kind:o.kind,params:o.params??{},outPorts:o.outPorts??LL(o.kind),joinPolicy:o.joinPolicy??"all",maxIterations:o.maxIterations})),n=new Jt(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 LL(t){return t==="if"?["true","false"]:t==="loop"?["loop","done"]:["default"]}function OL(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 eb(t,e={}){let r=e.maxNodes??50,n=e.maxValueLen??60,o=`Workflow ${JSON.stringify(t.name)} (rev ${t.rev}, trigger: ${jL(t.trigger)}, ${t.active?"active":"inactive"})`,s=t.def.nodes,a=s.slice(0,r).map(p=>" "+$L(p,n)),c=s.length===0?"nodes: (none)":["nodes:",...a].join(`
355
355
  `),l=s.length>r?`
356
356
  \u2026 ${s.length-r} more node(s); call workflow.get for the full definition`:"",d=HL(t.def.edges);return`${o}
357
357
  ${c}${l}
358
358
  ${d}`}function jL(t){if(!t)return"none";switch(t.type){case"manual":return"manual";case"schedule":return`schedule ${JSON.stringify(t.cron)}`;case"im-message":return t.match?`im-message ${t.channel} match=${JSON.stringify(t.match)}`:`im-message ${t.channel}`;case"webhook":return`webhook ${t.path}`}}function $L(t,e){let r=t.name?` "${t.name}"`:"",n=UL(t.params,e),o=(t.outPorts??BL(t.kind)).join(","),s=[`${t.id} [${t.kind}]${r}`];return n&&s.push(n),s.push(`out: ${o}`),s.join(" ")}function UL(t,e){if(!t)return"";let r=Object.keys(t).sort();return r.length===0?"":r.map(n=>`${n}=${FL(t[n],e)}`).join(" ")}function FL(t,e){let r;return typeof t=="string"?r=t.includes("{{")?t:JSON.stringify(t):r=JSON.stringify(t),r.length>e&&(r=r.slice(0,e-1)+"\u2026"),r}function HL(t){return t.length===0?"edges: (none)":`edges:
359
359
  ${t.map(r=>{let n=r.fromPort??"default",o=r.toPort??"default",s=r.loopBack?" (loopBack)":"";return`${r.from}.${n}\u2192${r.to}.${o}${s}`}).join(" ; ")}`}function BL(t){return t==="if"?["true","false"]:t==="loop"?["loop","done"]:["default"]}var qL={"n8n-nodes-base.set":"set","n8n-nodes-base.if":"if","n8n-nodes-base.merge":"merge","n8n-nodes-base.noOp":"passthrough","n8n-nodes-base.httpRequest":"http","n8n-nodes-base.manualTrigger":"trigger","n8n-nodes-base.scheduleTrigger":"trigger","n8n-nodes-base.cron":"trigger","n8n-nodes-base.webhook":"trigger"},jr=class extends Error{constructor(r){super(`n8n import rejected: ${r.join("; ")}`);this.errors=r;this.name="N8nImportError"}errors};function tb(t,e){let r=WL(t),n=[],o=new Set,s=[];for(let[a,c]of r.nodes.entries()){if(typeof c?.name!="string"||c.name===""){n.push(`nodes[${a}] has a missing/empty name`);continue}if(o.has(c.name)){n.push(`duplicate node name "${c.name}"`);continue}if(o.add(c.name),typeof c.type!="string"||c.type===""){n.push(`node "${c.name}" has a missing/empty type`);continue}let l=qL[c.type];if(!l){n.push(`node "${c.name}" has unsupported type "${c.type}" (not in the import type map)`);continue}let d={id:c.name,kind:l,name:c.name,params:{...c.parameters??{},_n8nType:c.type}};l==="if"&&(d.outPorts=["true","false"]),s.push(d)}let i=r.connections?GL(r.connections,o,s,n):[];if(s.length===0&&n.length===0&&n.push("workflow has no nodes"),n.length>0)throw new jr(n);return{name:typeof r.name=="string"&&r.name!==""?r.name:e,def:{id:e,nodes:s,edges:i}}}function WL(t){let e;if(typeof t=="string")try{e=JSON.parse(t)}catch(n){throw new jr([`invalid JSON: ${n.message}`])}else e=t;if(!e||typeof e!="object")throw new jr(["workflow must be a JSON object"]);let r=e;if(!Array.isArray(r.nodes))throw new jr(["workflow.nodes must be an array"]);if(r.connections!==void 0&&(typeof r.connections!="object"||r.connections===null))throw new jr(["workflow.connections must be an object"]);return{name:r.name,nodes:r.nodes,connections:r.connections??{}}}function GL(t,e,r,n){let o=new Map(r.map(i=>[i.id,i.kind])),s=[];for(let i of Object.keys(t).sort()){if(!e.has(i)){n.push(`connection source "${i}" is not a declared node`);continue}let a=t[i]?.main;if(Array.isArray(a))for(let c=0;c<a.length;c++){let l=KL(i,o.get(i),c,n),d=a[c];if(Array.isArray(d))for(let p of d){if(!p||typeof p.node!="string"){n.push(`connection from "${i}" has a malformed target`);continue}if(!e.has(p.node)){n.push(`connection from "${i}" targets missing node "${p.node}"`);continue}let u={from:i,to:p.node};l!=="default"&&(u.fromPort=l),s.push(u)}}}return s}function KL(t,e,r,n){return e==="if"?r===0?"true":r===1?"false":(n.push(`if node "${t}" has an unsupported output index ${r} (only 0/1)`),"default"):(r===0||n.push(`node "${t}" has an unmodeled multi-output index ${r} (only single-output supported)`),"default")}var ur=class{constructor(e,r){this.store=e;this.runtimeFactory=r}store;runtimeFactory;slots=new Map;async create(e){let r=ru(e.def);if(r.length>0)throw new dr(r);let n=new Date().toISOString(),o={id:e.id,name:e.name,def:e.def,active:e.active??!1,concurrency:e.concurrency??"queue",rev:1,createdAt:n,updatedAt:n};return await this.store.save(o),o}async update(e,r){let o={...await this.store.require(e),...r,updatedAt:new Date().toISOString()};if(r.def!==void 0){let s=ru(o.def);if(s.length>0)throw new dr(s)}return await this.store.save(o),o}async setActive(e,r){return this.update(e,{active:r})}async importN8n(e,r,n={}){let{name:o,def:s}=tb(r,e);return this.create({id:e,name:o,def:s,concurrency:n.concurrency})}async get(e){return this.store.require(e)}async describe(e,r){let n=await this.store.require(e);return eb(n,r)}async patch(e,r){let n=await this.store.require(e),o=r.baseRev!==void 0&&r.baseRev<n.rev,s={def:n.def,meta:{name:n.name,active:n.active,trigger:n.trigger??null}},i,a;try{let l=Qv(s,r);i=l.applied,a=l.target}catch(l){if(o&&l instanceof dr)return{ok:!1,conflict:{latestRev:n.rev}};throw l}let c={...n,def:a.def,name:a.meta.name??n.name,active:a.meta.active??n.active,trigger:a.meta.trigger??null,rev:n.rev+1,updatedAt:new Date().toISOString()};return await this.store.save(c),{ok:!0,rev:c.rev,applied:i}}async run(e,r){let n=await this.store.require(e),o={type:r?.type??"manual",payload:r?.payload},s=this.slotFor(e);if(s.pending>0)switch(n.concurrency){case"skip":return{workflowId:e,status:"skipped"};case"parallel":return this.startParallel(e,n.def,o);case"queue":return this.track(e,s,n.def,o,!0)}return this.track(e,s,n.def,o,!1)}pause(e){let r=this.slots.get(e);if(!r?.runtime||r.pending===0)throw new Error(`Workflow "${e}" has no active run to pause`);r.runtime.pause()}async resume(e,r={}){let n=this.slots.get(e);if(!n?.runtime)throw new Error(`Workflow "${e}" has no runtime to resume`);let o=n.runtime;r.extraBudget&&o.extendBudget(r.extraBudget),n.pending++;let s=o.run().then(i=>({workflowId:e,status:i.status,result:i})).finally(()=>{n.pending--});return n.tail=s.catch(()=>{}),s}async listActive(){return this.store.listActive()}slotFor(e){let r=this.slots.get(e);return r||(r={tail:Promise.resolve(),pending:0},this.slots.set(e,r)),r}track(e,r,n,o,s){r.pending++;let i=()=>{let l=this.runtimeFactory(n,o);return r.runtime=l,l.run().then(d=>({workflowId:e,status:d.status,result:d}))},c=(s?r.tail.then(i):i()).finally(()=>{r.pending--});return r.tail=c.catch(()=>{}),c}async startParallel(e,r,n){let s=await this.runtimeFactory(r,n).run();return{workflowId:e,status:s.status,result:s}}};function rb(t){return(e,r)=>new di(e,{registry:t.registry,host:t.host,trigger:r.payload,now:t.now,gate:new pi({trigger:r.type,maxNodeExecutions:t.budget.maxNodeExecutions,maxDurationMs:t.budget.maxDurationMs,allowUnattendedKinds:t.allowUnattendedKinds,now:t.now?()=>t.now().getTime():void 0})})}import{join as gi}from"node:path";import{mkdir as tO,readdir as rO,rm as nO}from"node:fs/promises";import{readFile as zL,writeFile as VL,mkdir as XL,rename as YL,unlink as JL}from"node:fs/promises";import{dirname as QL,join as ZL}from"node:path";import{randomUUID as eO}from"node:crypto";async function yn(t,e){let r=QL(t);await XL(r,{recursive:!0});let n=ZL(r,`.tmp-${eO()}`);try{await VL(n,e,"utf-8");let o;for(let s=0;s<3;s++)try{await YL(n,t);return}catch(i){if(o=i,i.code!=="EPERM")throw i;await new Promise(a=>setTimeout(a,50*(s+1)))}throw o}catch(o){throw await JL(n).catch(()=>{}),o}}async function Qt(t){try{let e=await zL(t,"utf-8");return JSON.parse(e)}catch(e){if(e.code==="ENOENT")return;throw e}}async function pr(t,e){await yn(t,JSON.stringify(e,null,2)+`
360
- `)}function mi(t){return gi(I().getProjectAgentDir(t),"workflows")}function nb(t,e){return gi(mi(e),t,"workflow.json")}var mr=class{constructor(e){this.cwd=e;if(!e)throw new Error("WorkflowStore requires a project cwd")}cwd;async save(e){if(!e.id)throw new Error("WorkflowRecord.id is required");let r=gi(mi(this.cwd),e.id);await tO(r,{recursive:!0}),await pr(nb(e.id,this.cwd),e)}async load(e){return Qt(nb(e,this.cwd))}async require(e){let r=await this.load(e);if(!r)throw new Error(`Workflow "${e}" not found`);return r}async list(){let e;try{e=await rO(mi(this.cwd))}catch{return[]}let r=[];for(let n of e){let o=await this.load(n);o&&r.push(o)}return r}async listActive(){return(await this.list()).filter(e=>e.active)}async delete(e){await nO(gi(mi(this.cwd),e),{recursive:!0,force:!0})}};var ob=null;function sb(t){ob=t}function fi(){return ob}var oO=[{pattern:"Bash",behavior:"ask",reason:"Group security: shell commands require approval in group chat",source:"group-policy"},{pattern:"computer",behavior:"deny",reason:"Group security: computer control blocked in group chat",source:"group-policy"}],sO=[/\.env($|\.)/i,/\.(key|pem|p12|pfx|jks)$/i,/id_rsa/i,/id_ed25519/i,/\.ssh\//i,/secret/i,/credential/i,/token/i,/password/i,/\.aws\//i,/\.gnupg\//i];function ib(){return[...oO]}function nu(t){return sO.some(e=>e.test(t))}function ab(t,e){let r=[];for(let n of t)n.register(r,e);return r}function ou(t,e,r="local"){return{id:t,kind:r,register:e}}var cu=!1;function lu(t){cu=t}var db=null,aO;var su;function ub(t){su=t}function pb(t){db=t}var Ge=process.cwd(),iu=!1,hi=!1;function yi(t){hi=t}function mb(t){Ge=t,iu=!0,Xs(t)}function Pe(t){return U.isAbsolute(t)?U.normalize(t):U.resolve(Ge,t)}function yo(t){let e=U.resolve(Ge)+U.sep,r=U.resolve(t);return process.platform==="win32"?r.toLowerCase().startsWith(e.toLowerCase())||r.toLowerCase()===e.slice(0,-1).toLowerCase():r.startsWith(e)||r===e.slice(0,-1)}function Zt(t){return hi||yo(t)?null:`Blocked: path "${t}" is outside the workspace boundary "${Ge}"`}function cb(t){let e=t.replace(/\\/g,"/");return e.includes("../")||e.includes("..")}var cO=new Set([".png",".jpg",".jpeg",".gif",".webp",".bmp",".svg",".ico"]),gb=new Set([".exe",".dll",".so",".dylib",".zip",".tar",".gz",".7z",".rar",".wasm",".class"]),au=new Set;function lO(){return{resolvePath:Pe,async readFile(t){let e=Pe(t),r=U.extname(e).toLowerCase();if(iu){let o=Zt(e);if(o)throw new Error(o)}else if(!hi&&cb(t)&&!yo(e))throw new Error(`Blocked: path traversal "${t}" escapes workspace "${Ge}"`);if(e.startsWith("/dev/")||e.startsWith("/proc/")||e.startsWith("/sys/"))throw new Error(`Blocked: reading device/system path ${e}`);if(gb.has(r))return{type:"binary",mimeType:"application/octet-stream"};if(cO.has(r))return{type:"image",localPath:e,mimeType:r===".png"?"image/png":r===".svg"?"image/svg+xml":r===".gif"?"image/gif":r===".webp"?"image/webp":"image/jpeg"};let n=await j.promises.readFile(e,"utf8");return au.add(e),{type:"text",text:n}},validatePath(t){let e=Pe(t);if(iu){let r=Zt(e);if(r)return r}else if(!hi&&cb(t)&&!yo(e))return`Blocked: path traversal "${t}" escapes workspace "${Ge}"`;return e.startsWith("/dev/")||e.startsWith("/proc/")||e.startsWith("/sys/")?`Blocked: reading device/system path ${e}`:cu&&nu(e)?"Blocked: reading sensitive file in group chat mode":null}}}function dO(){return{resolvePath:Pe,validatePath(t){let e=Pe(t),r=Zt(e);return r||(e.startsWith("/dev/")||e.startsWith("/proc/")||e.startsWith("/sys/")?`Blocked: writing to device/system path ${e}`:cu&&nu(e)?"Blocked: writing sensitive file in group chat mode":null)},checkReadBeforeWrite(t){try{j.accessSync(t,j.constants.F_OK)}catch{return null}return au.has(t)?null:"File already exists but has not been read yet in this session. Read it first with the read tool before overwriting, to avoid unintended data loss. If you intend to completely replace the file, read it first to confirm."},async writeFile(t,e){let r=Pe(t),n=Zt(r);if(n)throw new Error(n);await j.promises.mkdir(U.dirname(r),{recursive:!0}),await j.promises.writeFile(r,e,"utf8"),au.add(r)}}}function uO(){return{resolvePath:Pe,async readFile(t){let e=Pe(t),r=Zt(e);if(r)throw new Error(r);return j.promises.readFile(e,"utf8")},async writeFile(t,e){let r=Pe(t),n=Zt(r);if(n)throw new Error(n);await j.promises.mkdir(U.dirname(r),{recursive:!0}),await j.promises.writeFile(r,e,"utf8")}}}function pO(){return{resolvePath:Pe,async readFile(t){let e=Pe(t),r=Zt(e);if(r)throw new Error(r);return j.promises.readFile(e,"utf8")},async writeFile(t,e){let r=Pe(t),n=Zt(r);if(n)throw new Error(n);await j.promises.mkdir(U.dirname(r),{recursive:!0}),await j.promises.writeFile(r,e,"utf8")},async deleteFile(t){let e=Pe(t),r=Zt(e);if(r)throw new Error(r);await j.promises.unlink(e)},async fileExists(t){let e=Pe(t);try{return await j.promises.access(e),!0}catch{return!1}}}}function mO(){return{resolvePath:Pe,async glob(t,e){let r=e.cwd||Ge,n=e.limit||1e3,o=[],s=!1,i=t.replace(/\\/g,"/").split("/"),a=i.some(d=>d==="**"),c=i[i.length-1]??"*",l=fb(c);try{await du(r,async d=>{if(o.length>=n)return s=!0,!1;let p=U.basename(d);return l.test(p)&&o.push(d),!0},a?1/0:1)}catch{}return{files:o,truncated:s}},async grep(t,e){let r=e.cwd||Ge;try{return await fO(t,r,e)}catch{return await hO(t,r,e)}}}}function fb(t){let e=t.replace(/[.+^$|()[\]\\]/g,"\\$&").replace(/\*/g,".*").replace(/\?/g,".");return e=e.replace(/\\\{([^}]+)\\\}/g,(r,n)=>"("+n.replace(/,/g,"|")+")"),new RegExp(`^${e}$`,"i")}var gO=new Set([".git",".svn",".hg","node_modules","__pycache__",".next","dist",".tox",".venv"]);async function du(t,e,r,n=0,o=""){if(n>r)return;let s;try{s=await j.promises.readdir(t,{withFileTypes:!0})}catch{return}for(let i of s){let a=o?`${o}/${i.name}`:i.name;if(i.isDirectory()){if(gO.has(i.name))continue;await du(U.join(t,i.name),e,r,n+1,a)}else if(i.isFile()&&!await e(a))return}}function fO(t,e,r){return new Promise((n,o)=>{let s=["--json","--no-heading","--max-columns","500"];r.caseInsensitive&&s.push("-i"),r.contextLines&&s.push("-C",String(r.contextLines)),r.fileGlob&&s.push("-g",r.fileGlob),s.push("--max-count",String(r.headLimit??250)),s.push(t),s.push("."),iO("rg",s,{cwd:e,maxBuffer:10*1024*1024,timeout:3e4},(i,a)=>{if(i&&!("killed"in i&&i.killed)&&i.code!==1){o(i);return}let c=[];for(let u of a.split(`
360
+ `)}function mi(t){return gi(I().getProjectAgentDir(t),"workflows")}function nb(t,e){return gi(mi(e),t,"workflow.json")}var mr=class{constructor(e){this.cwd=e;if(!e)throw new Error("WorkflowStore requires a project cwd")}cwd;async save(e){if(!e.id)throw new Error("WorkflowRecord.id is required");let r=gi(mi(this.cwd),e.id);await tO(r,{recursive:!0}),await pr(nb(e.id,this.cwd),e)}async load(e){return Qt(nb(e,this.cwd))}async require(e){let r=await this.load(e);if(!r)throw new Error(`Workflow "${e}" not found`);return r}async list(){let e;try{e=await rO(mi(this.cwd))}catch{return[]}let r=[];for(let n of e){let o=await this.load(n);o&&r.push(o)}return r}async listActive(){return(await this.list()).filter(e=>e.active)}async delete(e){await nO(gi(mi(this.cwd),e),{recursive:!0,force:!0})}};var ob=null;function sb(t){ob=t}function fi(){return ob}var oO=[{pattern:"Bash",behavior:"ask",reason:"Group security: shell commands require approval in group chat",source:"group-policy"},{pattern:"computer",behavior:"deny",reason:"Group security: computer control blocked in group chat",source:"group-policy"}],sO=[/\.env($|\.)/i,/\.(key|pem|p12|pfx|jks)$/i,/id_rsa/i,/id_ed25519/i,/\.ssh\//i,/secret/i,/credential/i,/token/i,/password/i,/\.aws\//i,/\.gnupg\//i];function ib(){return[...oO]}function nu(t){return sO.some(e=>e.test(t))}function ab(t,e){let r=[];for(let n of t)n.register(r,e);return r}function ou(t,e,r="local"){return{id:t,kind:r,register:e}}var cu=!1;function lu(t){cu=t}var db=null,aO;var su;function ub(t){su=t}function pb(t){db=t}var Ge=process.cwd(),iu=!1,hi=!1;function yi(t){hi=t}function mb(t){Ge=t,iu=!0,Xs(t)}function xe(t){return U.isAbsolute(t)?U.normalize(t):U.resolve(Ge,t)}function yo(t){let e=U.resolve(Ge)+U.sep,r=U.resolve(t);return process.platform==="win32"?r.toLowerCase().startsWith(e.toLowerCase())||r.toLowerCase()===e.slice(0,-1).toLowerCase():r.startsWith(e)||r===e.slice(0,-1)}function Zt(t){return hi||yo(t)?null:`Blocked: path "${t}" is outside the workspace boundary "${Ge}"`}function cb(t){let e=t.replace(/\\/g,"/");return e.includes("../")||e.includes("..")}var cO=new Set([".png",".jpg",".jpeg",".gif",".webp",".bmp",".svg",".ico"]),gb=new Set([".exe",".dll",".so",".dylib",".zip",".tar",".gz",".7z",".rar",".wasm",".class"]),au=new Set;function lO(){return{resolvePath:xe,async readFile(t){let e=xe(t),r=U.extname(e).toLowerCase();if(iu){let o=Zt(e);if(o)throw new Error(o)}else if(!hi&&cb(t)&&!yo(e))throw new Error(`Blocked: path traversal "${t}" escapes workspace "${Ge}"`);if(e.startsWith("/dev/")||e.startsWith("/proc/")||e.startsWith("/sys/"))throw new Error(`Blocked: reading device/system path ${e}`);if(gb.has(r))return{type:"binary",mimeType:"application/octet-stream"};if(cO.has(r))return{type:"image",localPath:e,mimeType:r===".png"?"image/png":r===".svg"?"image/svg+xml":r===".gif"?"image/gif":r===".webp"?"image/webp":"image/jpeg"};let n=await j.promises.readFile(e,"utf8");return au.add(e),{type:"text",text:n}},validatePath(t){let e=xe(t);if(iu){let r=Zt(e);if(r)return r}else if(!hi&&cb(t)&&!yo(e))return`Blocked: path traversal "${t}" escapes workspace "${Ge}"`;return e.startsWith("/dev/")||e.startsWith("/proc/")||e.startsWith("/sys/")?`Blocked: reading device/system path ${e}`:cu&&nu(e)?"Blocked: reading sensitive file in group chat mode":null}}}function dO(){return{resolvePath:xe,validatePath(t){let e=xe(t),r=Zt(e);return r||(e.startsWith("/dev/")||e.startsWith("/proc/")||e.startsWith("/sys/")?`Blocked: writing to device/system path ${e}`:cu&&nu(e)?"Blocked: writing sensitive file in group chat mode":null)},checkReadBeforeWrite(t){try{j.accessSync(t,j.constants.F_OK)}catch{return null}return au.has(t)?null:"File already exists but has not been read yet in this session. Read it first with the read tool before overwriting, to avoid unintended data loss. If you intend to completely replace the file, read it first to confirm."},async writeFile(t,e){let r=xe(t),n=Zt(r);if(n)throw new Error(n);await j.promises.mkdir(U.dirname(r),{recursive:!0}),await j.promises.writeFile(r,e,"utf8"),au.add(r)}}}function uO(){return{resolvePath:xe,async readFile(t){let e=xe(t),r=Zt(e);if(r)throw new Error(r);return j.promises.readFile(e,"utf8")},async writeFile(t,e){let r=xe(t),n=Zt(r);if(n)throw new Error(n);await j.promises.mkdir(U.dirname(r),{recursive:!0}),await j.promises.writeFile(r,e,"utf8")}}}function pO(){return{resolvePath:xe,async readFile(t){let e=xe(t),r=Zt(e);if(r)throw new Error(r);return j.promises.readFile(e,"utf8")},async writeFile(t,e){let r=xe(t),n=Zt(r);if(n)throw new Error(n);await j.promises.mkdir(U.dirname(r),{recursive:!0}),await j.promises.writeFile(r,e,"utf8")},async deleteFile(t){let e=xe(t),r=Zt(e);if(r)throw new Error(r);await j.promises.unlink(e)},async fileExists(t){let e=xe(t);try{return await j.promises.access(e),!0}catch{return!1}}}}function mO(){return{resolvePath:xe,async glob(t,e){let r=e.cwd||Ge,n=e.limit||1e3,o=[],s=!1,i=t.replace(/\\/g,"/").split("/"),a=i.some(d=>d==="**"),c=i[i.length-1]??"*",l=fb(c);try{await du(r,async d=>{if(o.length>=n)return s=!0,!1;let p=U.basename(d);return l.test(p)&&o.push(d),!0},a?1/0:1)}catch{}return{files:o,truncated:s}},async grep(t,e){let r=e.cwd||Ge;try{return await fO(t,r,e)}catch{return await hO(t,r,e)}}}}function fb(t){let e=t.replace(/[.+^$|()[\]\\]/g,"\\$&").replace(/\*/g,".*").replace(/\?/g,".");return e=e.replace(/\\\{([^}]+)\\\}/g,(r,n)=>"("+n.replace(/,/g,"|")+")"),new RegExp(`^${e}$`,"i")}var gO=new Set([".git",".svn",".hg","node_modules","__pycache__",".next","dist",".tox",".venv"]);async function du(t,e,r,n=0,o=""){if(n>r)return;let s;try{s=await j.promises.readdir(t,{withFileTypes:!0})}catch{return}for(let i of s){let a=o?`${o}/${i.name}`:i.name;if(i.isDirectory()){if(gO.has(i.name))continue;await du(U.join(t,i.name),e,r,n+1,a)}else if(i.isFile()&&!await e(a))return}}function fO(t,e,r){return new Promise((n,o)=>{let s=["--json","--no-heading","--max-columns","500"];r.caseInsensitive&&s.push("-i"),r.contextLines&&s.push("-C",String(r.contextLines)),r.fileGlob&&s.push("-g",r.fileGlob),s.push("--max-count",String(r.headLimit??250)),s.push(t),s.push("."),iO("rg",s,{cwd:e,maxBuffer:10*1024*1024,timeout:3e4},(i,a)=>{if(i&&!("killed"in i&&i.killed)&&i.code!==1){o(i);return}let c=[];for(let u of a.split(`
361
361
  `))if(u.trim())try{let m=JSON.parse(u);m.type==="match"&&m.data&&c.push({path:m.data.path?.text??"",line:m.data.line_number??0,text:(m.data.lines?.text??"").trimEnd()})}catch{}let l=r.headLimit??250,d=r.offset??0,p=c.slice(d,d+l);n({matches:p,truncated:c.length>d+l})})})}async function hO(t,e,r){let n=new RegExp(t,r.caseInsensitive?"i":""),o=r.headLimit??250,s=r.offset??0,i=r.fileGlob?fb(r.fileGlob):null,a=[],c=!1;return await du(e,async l=>{if(a.length>=s+o+1)return c=!0,!1;if(i&&!i.test(U.basename(l)))return!0;let d=U.extname(l).toLowerCase();if(gb.has(d))return!0;try{let u=(await j.promises.readFile(U.join(e,l),"utf8")).split(`
362
- `);for(let m=0;m<u.length;m++)if(n.test(u[m])&&(a.push({path:l,line:m+1,text:u[m].slice(0,500)}),a.length>=s+o+1))return c=!0,!1}catch{}return!0},1/0),{matches:a.slice(s,s+o),truncated:c}}var lb=!1;function yO(){if(!lb)if(lb=!0,Dr()){let t=process.env.QLOGICAGENT_POWERSHELL_PATH??"powershell.exe";uo(wd(t))}else if(process.platform==="win32"){let t=vO();uo(Qs(t))}else{let t=process.env.SHELL?.endsWith("bash")?process.env.SHELL:"/bin/bash";uo(Qs(t))}}function vO(){let t=process.env.QLOGICAGENT_BASH_PATH;if(t&&j.existsSync(t))return t;let e=["C:\\Program Files\\Git\\bin\\bash.exe","C:\\Program Files (x86)\\Git\\bin\\bash.exe"],r=process.env.ProgramFiles?U.join(process.env.ProgramFiles,"Git","bin","bash.exe"):null;r&&!e.includes(r)&&e.unshift(r);for(let n of e)if(j.existsSync(n))return n;return"bash"}function bO(){return{async fetchUrl(t){let e=new AbortController,r=setTimeout(()=>e.abort(),3e4);try{let n=await fetch(t.url,{signal:e.signal,headers:{"User-Agent":"Mozilla/5.0 (compatible; QLogicAgent/1.0)",Accept:"text/html,application/xhtml+xml,text/plain,*/*"},redirect:"follow"});if(!n.ok)return{content:`HTTP ${n.status} ${n.statusText}`};let o=n.headers.get("content-type")??"",s=await n.text();return t.maxChars&&s.length>t.maxChars&&(s=s.slice(0,t.maxChars)),o.includes("html")&&t.extractMode!=="json"&&(s=kO(s)),{content:s,title:RO(s)}}finally{clearTimeout(r)}}}}function kO(t){return t.replace(/<script[\s\S]*?<\/script>/gi,"").replace(/<style[\s\S]*?<\/style>/gi,"").replace(/<[^>]+>/g," ").replace(/&nbsp;/gi," ").replace(/&amp;/gi,"&").replace(/&lt;/gi,"<").replace(/&gt;/gi,">").replace(/&quot;/gi,'"').replace(/&#39;/gi,"'").replace(/\s{2,}/g," ").trim()}function RO(t){return t.match(/<title[^>]*>([^<]+)<\/title>/i)?.[1]?.trim()}function SO(){let t=async(e,r)=>{let{getModelRegistry:n}=await Promise.resolve().then(()=>(He(),rg)),o=n().getTunable("searxngBaseUrl")??process.env.SEARXNG_BASE_URL?.trim();if(!o)return{query:e,results:[],totalResults:0};let s=r?.maxResults??10,i=new URL("/search",o);i.searchParams.set("q",e),i.searchParams.set("format","json"),i.searchParams.set("pageno","1");let a=new AbortController,c=setTimeout(()=>a.abort(),15e3);try{let l=await fetch(i.toString(),{signal:a.signal,headers:{Accept:"application/json"}});if(!l.ok)return{query:e,results:[]};let d=await l.json(),p=(d.results??[]).slice(0,s).map(u=>({title:u.title??"",url:u.url??"",snippet:u.content??""}));if(r?.allowedDomains?.length){let u=new Set(r.allowedDomains.map(m=>m.toLowerCase()));return{query:e,results:p.filter(m=>{try{return u.has(new URL(m.url).hostname.toLowerCase())}catch{return!1}})}}if(r?.blockedDomains?.length){let u=new Set(r.blockedDomains.map(m=>m.toLowerCase()));return{query:e,results:p.filter(m=>{try{return!u.has(new URL(m.url).hostname.toLowerCase())}catch{return!0}})}}return{query:e,results:p,totalResults:d.number_of_results}}finally{clearTimeout(c)}};return{search:(e,r)=>Fv(_v(),t)(e,r)}}function TO(t){function e(s){if(s==="default")return ne()?.workspaceDir??Ge;let i=Te(s);if(!i)throw new Error(`Unknown project: ${s}`);return i.workspaceDir}function r(s){let i=e(s);return t?.getProjectRulesDir(i)??U.join(i,".qlogicagent","rules")}function n(s,i){if(!i.endsWith(".md"))throw new Error("Filename must end with .md");if(i.includes(".."))throw new Error("Path traversal not allowed");let a=r(s),c=U.resolve(a,i);if(!c.startsWith(a+U.sep)&&c!==a)throw new Error("Path traversal not allowed");return c}function o(s,i){if(!j.existsSync(s))return[];let a=[];for(let c of j.readdirSync(s,{withFileTypes:!0})){let l=U.join(s,c.name);if(c.isDirectory())a.push(...o(l,i));else if(c.isFile()&&c.name.endsWith(".md")){let d=j.statSync(l);a.push({filename:U.relative(i,l).replace(/\\/g,"/"),path:l,size:d.size,updatedAt:d.mtime.toISOString(),content:j.readFileSync(l,"utf-8")})}}return a}return{list(s){let i=r(s);return o(i,i).map(a=>({filename:a.filename,path:a.path,size:a.size,updatedAt:a.updatedAt}))},read(s,i){try{let a=n(s,i);if(!j.existsSync(a))return null;let c=j.statSync(a),l=j.readFileSync(a,"utf-8");return{filename:i,path:a,size:c.size,updatedAt:c.mtime.toISOString(),content:l}}catch{return null}},write(s,i,a){let c=n(s,i);j.mkdirSync(U.dirname(c),{recursive:!0}),j.writeFileSync(c,a,"utf-8");let l=j.statSync(c);return{filename:i,path:c,size:l.size,updatedAt:l.mtime.toISOString(),content:a}},remove(s,i){try{let a=n(s,i);return j.existsSync(a)?(j.unlinkSync(a),!0):!1}catch{return!1}}}}var wO={think:"orchestration",task:"orchestration",ask_user:"orchestration",exec:"developer",read:"filesystem",write:"filesystem",edit:"filesystem",patch:"filesystem",apply_patch:"filesystem",search:"search",web_fetch:"web",web_search:"web",instructions:"filesystem",worktree:"developer",notebook_edit:"developer",workflow:"automation",sleep:"automation",project_switch:"system",tool_search:"search",image_generate:"media",tts:"media",video_generate:"media",music_generate:"media",video_edit:"media",video_merge:"media",video_upscale:"media",three_d_generate:"media",stt:"media",voice_clone:"media",media_cancel:"media",file_upload:"filesystem",file_query:"filesystem",file_delete:"filesystem"};function AO(t){for(let e of t)e.category??=wO[e.name]??"other",e.displayName??={key:`capability.tool.${e.name}.name`,fallback:e.label},e.displayDescription??={key:`capability.tool.${e.name}.description`,fallback:""}}var PO=()=>{throw new Error("workflow tool: this controller is authoring-only; `run` requires the initialized engine")};function xO(t){function e(){let r=new mr(t),n=fi();return{controller:n??new ur(r,PO),live:n,store:r}}return{async list(){return e().store.list()},async get(r){return e().store.require(r)},async describe(r){return e().controller.describe(r)},async create(r){return e().controller.create({id:r.id,name:r.name,def:r.def,active:r.active})},async patch(r,n){return e().controller.patch(r,{patch:n.patch,baseRev:n.baseRev,scope:n.scope})},async setActive(r,n){return e().controller.setActive(r,n)},async run(r){let{live:n}=e();if(!n)throw new Error("workflow engine is not initialized in this context. Activate the workflow (setActive) so a trigger runs it, or run it from the app.");let o={type:"manual"};return n.run(r,o)},async delete(r){await e().store.delete(r)}}}function hb(t){t?.workdir&&(Ge=t.workdir);let e=t?.toolCatalog??Lr(),r=()=>e.getToolNames(),n=i=>e.findTool(i),o=i=>e.activateTool(i);yO(),Xs(Ge);let s=ab([ou("cli-local-tools",i=>{let a=i;a.push(Vh()),a.push(zh(void 0,{onTaskCreated:g=>su?.onTaskCreated?.(g),onTaskCompleted:g=>su?.onTaskCompleted?.(g)})),a.push(pv({askUser:async g=>db?.(g)??null})),a.push(ay({onProgress:t?.onExecProgress,validateCommand:async g=>{let h=/(?:>>?|[12]>)\s*(?:"([^"]+)"|'([^']+)'|(\S+))/g,b;for(;(b=h.exec(g))!==null;){let R=b[1]||b[2]||b[3];if(R){let S=U.isAbsolute(R)?U.normalize(R):U.resolve(Ge,R);if(!yo(S))return`Blocked: output redirection to path outside workspace: ${R}`}}let v=[/(?:^|[\s;|&(])(?:"(\/[^"]+)"|'(\/[^']+)'|(\/(?!dev\/null\b)[^\s;|&><)]+))/g,/(?:^|[\s;|&(])(?:"([A-Za-z]:[\\\/][^"]+)"|'([A-Za-z]:[\\\/][^']+)'|([A-Za-z]:[\\\/][^\s;|&><)]+))/g,/(?:^|[\s;|&(])(?:"([^"]*\.\.[\\/][^"]+)"|'([^']*\.\.[\\/][^']+)'|([^\s;|&><)"']*\.\.[\\/][^\s;|&><)]+))/g];for(let R of v){let S;for(;(S=R.exec(g))!==null;){let T=S[1]||S[2]||S[3];if(!T||/^\/[a-zA-Z](?:[- ]|$)/.test(T)||/^\/[a-zA-Z]{1,3}$/.test(T))continue;let C;if(process.platform==="win32"&&/^\/[a-zA-Z]\//.test(T)){let E=T.replace(/^\/([a-zA-Z])\//,(M,L)=>`${L.toUpperCase()}:\\`).replace(/\//g,"\\");C=U.normalize(E)}else C=U.isAbsolute(T)?U.normalize(T):U.resolve(Ge,T);if(!yo(C))return`Blocked: command references path outside workspace: ${T}`}}return null},interpretExitCode:(g,h)=>{if(g===127)return"command not found";if(g===126)return"permission denied";if(g===137)return"killed (SIGKILL / OOM)";if(g===143)return"terminated (SIGTERM)";if(g===130)return"interrupted (Ctrl+C)"}}));let c=lO(),l=dO(),d=uO(),p=pO();a.push(dy(c)),a.push(py(l)),a.push(my(d)),a.push(Id(p)),a.push(yy(p)),a.push(hy(mO())),a.push(Py(bO())),a.push(xy(SO()));let u=TO(t?.pathService);a.push(Cy(u));let m=t?.log??{info:()=>{},warn:()=>{}};a.push(Iy(qy({log:m}))),a.push(zy()),a.push(Vy({getService:()=>xO(Ge)})),a.push(Xy({sleep:(g,h)=>new Promise(b=>{let v=Date.now(),R=setTimeout(()=>{b({sleptSeconds:Math.round((Date.now()-v)/1e3),interrupted:!1})},g),S=()=>{clearTimeout(R),b({sleptSeconds:Math.round((Date.now()-v)/1e3),interrupted:!0,interruptReason:"aborted"})};h.addEventListener("abort",S,{once:!0}),h.aborted&&(clearTimeout(R),S())})}));let f={listProjects:()=>z(),switchProject:g=>xt(g),onSwitched:g=>aO?.(g)};a.push(mv(f)),a.push(Jy({searchTools:async(g,h)=>{let b=h?.maxResults??5,v=r(),R=g.toLowerCase().split(/\s+/).filter(Boolean),S=[],T=[];for(let k of R)k.startsWith("+")&&k.length>1?S.push(k.slice(1)):T.push(k);let C=[...S,...T],E=k=>k.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/_/g," ").toLowerCase().split(/\s+/).filter(Boolean);return{matches:v.map(k=>{let Q=n(k),de=E(k),O=(Q?.description??"").toLowerCase(),Oe=(Q?.searchHint??"").toLowerCase();if(S.length>0){let F=`${de.join(" ")} ${O} ${Oe}`;if(!S.every(H=>F.includes(H)))return null}let je=0;for(let F of C){let J=0;de.some(H=>H===F)?J=10:de.some(H=>H.includes(F))?J=5:k.toLowerCase().includes(F)&&(J=3),Oe&&new RegExp(`\\b${F}`,"i").test(Oe)&&(J+=4),new RegExp(`\\b${F}`,"i").test(O)&&(J+=2),je+=J}return{name:k,description:Q?.description??"",searchHint:Q?.searchHint,score:je}}).filter(k=>k!==null&&k.score>0).sort((k,Q)=>Q.score-k.score).slice(0,b),query:g,totalDeferred:v.length}},activateTool:async g=>o(g)}))}),ou("media-tools",i=>{let a=i;a.push({...Qy({generateImage:async l=>{let d=await It({mediaType:"image",model:"",prompt:l.prompt,purpose:l.purpose,style:l.style,size:l.size,imageUrl:l.imageUrl,n:l.n,quality:l.quality,seed:l.seed});return{mediaUrls:d.mediaUrls,model:d.model,size:d.size,durationMs:d.durationMs}}}),isConcurrencySafe:!0,isEnabled:()=>Et("image")}),a.push({...Zy({textToSpeech:async l=>{let d=await It({mediaType:"tts",model:"",prompt:"",text:l.text,channel:l.channel,voice:l.voice,speed:l.speed});return{audioPath:"",provider:d.model,mediaUrls:d.mediaUrls}}}),isConcurrencySafe:!0,isEnabled:()=>Et("tts")}),a.push({...ev({generateVideo:async l=>{let d=await It({mediaType:"video",model:"",prompt:l.prompt,purpose:l.purpose,style:l.style,imageUrl:l.imageUrl,referenceVideos:l.referenceVideos,referenceAudios:l.referenceAudios,generateAudio:l.generateAudio,aspectRatio:l.aspectRatio,duration:l.duration,resolution:l.resolution,fps:l.fps,seed:l.seed,cameraFixed:l.cameraFixed,returnLastFrame:l.returnLastFrame,draft:l.draft,serviceTier:l.serviceTier,callbackUrl:l.callbackUrl,safetyIdentifier:l.safetyIdentifier,executionExpiresAfterSeconds:l.executionExpiresAfterSeconds,videoTools:l.videoTools});return{mediaUrls:d.mediaUrls,model:d.model,durationMs:d.durationMs,lastFrameUrl:d.lastFrameUrl,taskId:d.taskId}}}),isConcurrencySafe:!0,isEnabled:()=>Et("video")}),a.push({...tv({generateMusic:async l=>{let d=await It({mediaType:"music",model:"",prompt:l.prompt,purpose:l.purpose,style:l.style,lyrics:l.lyrics,duration:l.duration,isInstrumental:l.isInstrumental,audioUrl:l.audioUrl,audioFormat:l.audioFormat});return{mediaUrls:d.mediaUrls,model:d.model,durationMs:d.durationMs}},generateLyrics:Nv}),isConcurrencySafe:!0,isEnabled:()=>Et("music")}),a.push({...rv({editVideo:async l=>{let d=await It({mediaType:"video",model:"",prompt:l.prompt,operation:"edit",sourceVideos:l.sourceVideos,referenceImages:l.referenceImages,duration:l.duration,aspectRatio:l.aspectRatio,resolution:l.resolution});return{mediaUrls:d.mediaUrls,model:d.model,durationMs:d.durationMs}}}),shouldDefer:!0,isEnabled:()=>si("video","edit")}),a.push({...nv({mergeVideos:async l=>{let d=[`merge ${l.clips.length} clips`];l.transition&&d.push(`transition: ${l.transition}${l.transitionDuration?` (${l.transitionDuration}s)`:""}`),l.subtitles&&d.push(`burn-in subtitles: ${l.subtitles}`),l.bgm&&d.push(`background music: ${l.bgm}${l.bgmVolume!==void 0?` at volume ${l.bgmVolume}`:""}`);let p=await It({mediaType:"video",model:"",prompt:d.join("; "),operation:"merge",sourceVideos:l.clips.map(u=>u.video),resolution:l.outputResolution,fps:l.outputFps});return{localPath:"",servePath:p.mediaUrls[0]??"",durationSec:(p.durationMs??0)/1e3,clipCount:l.clips.length,mediaUrls:p.mediaUrls}}}),shouldDefer:!0,isEnabled:()=>si("video","merge")}),a.push({...ov({upscaleVideo:async l=>{let d=["upscale"];l.sharpness&&d.push(`sharpness: ${l.sharpness}`);let p=await It({mediaType:"video",model:"",prompt:d.join(", "),operation:"upscale",sourceVideos:[l.video],resolution:l.targetResolution??"1080p"});return{localPath:"",servePath:p.mediaUrls[0]??"",resolution:l.targetResolution??"1080p",durationSec:(p.durationMs??0)/1e3,mediaUrls:p.mediaUrls}}}),shouldDefer:!0,isEnabled:()=>si("video","upscale")}),a.push({...sv({generate3D:async l=>{let d=await It({mediaType:"3d",model:"",prompt:l.prompt,imageUrl:l.imageUrl,outputFormat:l.outputFormat,seed:l.seed});return{mediaUrls:d.mediaUrls,model:d.model,durationMs:d.durationMs,metadata:d.metadata}}}),isConcurrencySafe:!0,shouldDefer:!0,isEnabled:()=>Et("3d")}),a.push({...iv({speechToText:async l=>{let d=await It({mediaType:"stt",model:"",prompt:"",audioUrl:l.audioUrl,metadata:l.language?{language:l.language}:void 0});return{transcription:d.metadata?.transcription??"",model:d.model,durationMs:d.durationMs}}}),shouldDefer:!0,isEnabled:()=>Et("stt")}),a.push({...av({cloneVoice:async l=>{let d=await It({mediaType:"voice_clone",model:"",prompt:"",text:l.text,audioUrl:l.sampleAudioUrl,speed:l.speed});return{mediaUrls:d.mediaUrls,model:d.model,voiceId:d.metadata?.voiceId,durationMs:d.durationMs}}}),shouldDefer:!0,isEnabled:()=>Et("voice_clone")}),a.push({...cv({cancelTask:Lv}),shouldDefer:!0,isEnabled:()=>Et("video")||Et("3d")});let c=$v({getContext:Dv,resolvePath:Pe});a.push({...lv(c),shouldDefer:!0,isEnabled:()=>c.isAvailable()}),a.push({...dv(c),shouldDefer:!0,isEnabled:()=>c.isAvailable()}),a.push({...uv(c),shouldDefer:!0,isEnabled:()=>c.isAvailable()})})],{config:t});return AO(s),e.setTools(s),t?.log?.info(`[tool-bootstrap] Registered ${s.length} local tools (${s.filter(i=>i.isEnabled?.()!==!1).length} enabled): ${r().join(", ")}`),s}function er(t){return Cv(t)}function yb(t){return{getAllBaseTools:e=>hb({...e,toolCatalog:e?.toolCatalog??t}),setWorkdir:mb}}var CO=new Set(["permissionMode","permissionRules","defaultBehavior"]);function vb(t){let e=t.params;this.syncToolListMediaConfig?.();let r=this.toolCatalog??er(),o=r.getToolManifest(e?.includeDeferred??!1).map(s=>{let i=r.findTool(s.function.name),a=i?.category??"other";return{id:s.function.name,name:s.function.name,category:a,displayName:i?.displayName??{key:`capability.tool.${s.function.name}.name`,fallback:i?.label??s.function.name},displayDescription:i?.displayDescription??{key:`capability.tool.${s.function.name}.description`,fallback:""},fallbackName:i?.label??s.function.name,fallbackDescription:"",description:s.function.description??"",parameters:s.function.parameters,deferred:!!i?.shouldDefer,source:"builtin"}});if(e?.category){let s=o.filter(i=>i.category===e.category);t.id!==void 0&&this.sendResponse(t.id,{tools:s,total:s.length})}else t.id!==void 0&&this.sendResponse(t.id,{tools:o,total:o.length})}function bb(t){let e=D().listProviderDefs(),r=new Map;for(let o of e){let s=o.group??o.id;r.has(s)||r.set(s,[]);let i=!!D().resolveProviderApiKey(o.id);r.get(s).push({id:o.id,name:o.name,transport:o.transport,baseUrl:o.baseUrl,defaultModel:o.defaultModel,modelCount:o.models?.length??0,available:i})}let n=[...r.entries()].map(([o,s])=>({group:o,variants:s}));t.id!==void 0&&this.sendResponse(t.id,{providers:n})}function kb(t){try{let r=D().exportConfig(),n=Ue(),o={};try{o=JSON.parse($t.readFileSync(n,"utf-8"))}catch{}t.id!==void 0&&this.sendResponse(t.id,{config:{...IO(o),providers:MO(r.providers),models:r.models,bindings:r.bindings,permissions:Tb(o.permissions)},paths:{userSettings:Ue(),agentHome:X()}})}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 IO(t){let e={};for(let[r,n]of Object.entries(t)){if(mu.has(r)||CO.has(r))continue;let o=uu(r,n);o!==void 0&&(e[r]=o)}return e}function uu(t,e){if(EO(t))return typeof e=="string"?Rb(e):"[REDACTED]";if(Array.isArray(e))return e.map(r=>uu(t,r));if(e&&typeof e=="object"){let r={};for(let[n,o]of Object.entries(e)){if(mu.has(n))continue;let s=uu(n,o);s!==void 0&&(r[n]=s)}return r}return e}function EO(t){return/(?:apiKey|key|token|secret|credential|authorization|password)/i.test(t)}function MO(t){return t.map(e=>({providerId:e.providerId,baseUrl:e.baseUrl,strategy:e.strategy,keys:e.keys.map(r=>{let n={id:r.id,maskedKey:Rb(r.key),weight:r.weight,enabled:r.enabled};return r.label&&(n.label=r.label),n}),...e.rateLimit?{rateLimit:e.rateLimit}:{}}))}function Rb(t){return t.length<=8?"****":`${t.slice(0,3)}***${t.slice(-4)}`}var mu=new Set(["providers","models","bindings","provider","model","apiKey","baseUrl","providerKeys"]);async function Sb(t){let e=t.params;if(!e?.updates||typeof e.updates!="object"){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"updates (object) is required."});return}let r=[],n={};for(let[o,s]of Object.entries(e.updates))mu.has(o)?r.push({key:o,reason:"Use settings.* RPC methods for model/key management"}):n[o]=o==="permissions"?Tb(s):s;if(r.length>0&&Object.keys(n).length===0){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:`Rejected keys: ${r.map(o=>o.key).join(", ")}. Use settings.* RPC for model management.`});return}try{let o=Ue(),s={};try{let i=await $t.promises.readFile(o,"utf-8");s=JSON.parse(i)}catch{}Object.assign(s,n),await $t.promises.mkdir(pu.dirname(o),{recursive:!0}),await $t.promises.writeFile(o,JSON.stringify(s,null,2),"utf-8"),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,applied:Object.keys(n),rejected:r})}catch(o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:o instanceof Error?o.message:String(o)})}}function Tb(t){if(!t||typeof t!="object")return;let e=t.mode;if(e==="default"||e==="auto"||e==="full_access")return{mode:e}}function wb(t){try{let e=Dc(),r=Ue(),n={};try{let o=$t.readFileSync(r,"utf-8"),s=JSON.parse(o);s.tunables&&typeof s.tunables=="object"&&(n=s.tunables)}catch{}t.id!==void 0&&this.sendResponse(t.id,{defaults:e,overrides: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 Ab(t){let e=t.params,r=e?.key,n=e?.value;if(!r||typeof r!="string"){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: key (string)"});return}let o=Dc();if(!(r in o)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:`Unknown tunable key: "${r}". Valid keys: ${Object.keys(o).join(", ")}`});return}let s=typeof o[r];if(n==null||typeof n!==s){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:`Invalid value for "${r}": expected ${s}, got ${typeof n}`});return}try{let i=Ue(),a={};try{let c=await $t.promises.readFile(i,"utf-8");a=JSON.parse(c)}catch{}(!a.tunables||typeof a.tunables!="object")&&(a.tunables={}),a.tunables[r]=n,await $t.promises.mkdir(pu.dirname(i),{recursive:!0}),await $t.promises.writeFile(i,JSON.stringify(a,null,2),"utf-8"),r==="teamBudgetTokens"&&typeof n=="number"&&(ft.teamBudget.budgetTokens=n),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,key:r,value:n})}catch(i){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:i instanceof Error?i.message:String(i)})}}async function Pb(t){let e=(this.toolCatalog??er()).findTool("task");if(!e||typeof e.execute!="function"){t.id!==void 0&&this.sendResponse(t.id,{items:[],summary:co([])});return}try{let o=(await e.execute("rpc-todos-list",{action:"list"},void 0)).details?.taskList??[];t.id!==void 0&&this.sendResponse(t.id,{items:o,summary:co(o)})}catch{t.id!==void 0&&this.sendResponse(t.id,{items:[],summary:co([])})}}function xb(t){let r=t.params?.lifecycle??"all",n=this.taskStore.getAllTasks(),o=r==="all"?n:n.filter(s=>s.lifecycle===r);t.id!==void 0&&this.sendResponse(t.id,{tasks:o.map(s=>({taskId:s.taskId,type:s.type,lifecycle:s.lifecycle,label:s.label}))})}function Cb(t){let e=t.params;if(!e?.taskId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"taskId is required."});return}let n=this.taskStore.getAllTasks().find(o=>o.taskId===e.taskId);if(!n){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,message:`Task ${e.taskId} not found.`});return}if(n.lifecycle!=="running"&&n.lifecycle!=="pending"){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,message:`Task ${e.taskId} is already ${n.lifecycle}.`});return}this.taskStore.updateTask(e.taskId,o=>(o.lifecycle="cancelled",o)),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,message:`Task ${e.taskId} cancelled.`})}var Ib=["initialize","thread.create","thread.list","thread.turn","session.resume","session.getInfo","session.getMessages","memory.list","memory.read","memory.write","memory.search","memory.delete","memory.dream","tools.list","media.listModels","config.get","config.update","community.getConsent","community.setConsent","community.matchRegistry","community.listShared","community.withdrawShared","community.withdrawAllShared","community.listNotices","community.markNoticeRead","community.listPublishAudit","community.resolveInstall","community.installResource","community.publishSkill","community.publishPet","community.recordSignal","community.recordTelemetry","todos.list","tasks.list","tasks.cancel","agent.ping","agent.abort","tool.approval.response","agents.scan","agents.list","agents.config","agents.setConfig","agents.getConfig","agents.removeConfig","agents.setGateway","solo.start","solo.status","solo.cancel","solo.select","solo.list","solo.delete","solo.message","solo.evaluate","product.plan","product.confirm","product.message","product.create","product.resume","product.pause","product.checkpoint","product.status","product.list","product.delete","product.cancel","product.rollback","project.create","project.list","project.delete","project.rename","project.archive","project.unarchive","project.update","project.archiveByGroup","session.switchProject","session.getState","session.create","session.list","session.get","session.update","session.delete","session.archive","instructions.list","instructions.read","instructions.write","instructions.delete","files.list","files.read","files.create","files.rename","files.delete","files.gitStatus","settings.listProviders","settings.addKey","settings.removeKey","settings.getKey","settings.toggleKey","settings.listModels","settings.setActiveModel","settings.getActiveModel","settings.getOverview","settings.refreshModels","settings.validateKey"];function Eb(t){let e=t.params,r=e?.protocolVersion??"unknown",n=e?.host?.name??e?.hostName??"unknown",o=e?.host?.version??e?.hostVersion??"?",s=r.split(".")[0],i=Ar.split(".")[0];if(s!==i){this.log(`[initialize] protocol mismatch: host=${r} agent=${Ar}`),t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.PROTOCOL_MISMATCH,message:`Protocol version mismatch: host=${r}, agent=${Ar}`});return}this.log(`[initialize] host=${n} v${o}`),t.id!==void 0&&this.sendResponse(t.id,{protocolVersion:Ar,agent:{name:"qlogicagent",version:"0.1.0"},capabilities:{tools:this.toolCatalog.getToolManifest().map(a=>a.function.name),streaming:!0,threads:!0,notifications:["turn.start","turn.delta","turn.end","turn.error","turn.recovery","turn.tool_call","turn.tool_result","turn.tool_blocked","turn.reasoning_delta","turn.plan_update","turn.suggestions","turn.subagent_started","turn.subagent_delta","turn.subagent_ended","turn.media_result","turn.todos_updated","task.updated","turn.exec_progress","turn.artifact","tool.approval.request","turn.skill_instruction","turn.ask_user","memory.updated","session.info","permission.rule_updated","team.updated","turn.usage_update","pong"],methods:[...Ib]}}),this.ensureDefaultProject()}function Mb(t){t.id!==void 0&&this.sendResponse(t.id,{status:"ok"}),this.sendNotification("pong",{})}function _b(t){t.id!==void 0&&this.sendResponse(t.id,{ok:!0,status:this.running?"healthy":"stopping",uptimeMs:Date.now()-this.startedAt,protocolVersion:Ar,version:this.packageVersion})}function Db(t){t.id!==void 0&&this.sendResponse(t.id,{rpc:this.rpcContract.metrics()})}function Nb(t){let e=t.params,r=e?.requestId,n=typeof r=="string"?this.rpcContract.cancel(r,e?.reason??"host-cancelled"):!1;n&&this.activeTurn&&this.activeTurn.abort(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,cancelled:n})}import*as ee from"node:fs";import*as ze from"node:path";G();import Ke from"node:fs";import vo from"node:path";var Lb=Sc,Ob=Tc,vi=class{dir;constructor(e){this.dir=Qr(e)}list(){if(!Ke.existsSync(this.dir))return[];let e=[];for(let r of Ke.readdirSync(this.dir)){if(!r.endsWith(".md"))continue;let n=vo.join(this.dir,r);try{let o=Ke.statSync(n);if(!o.isFile())continue;let s=Ke.readFileSync(n,"utf8");e.push({filename:r,content:s,sizeBytes:o.size})}catch{}}return e}read(e){if(!this.isValidFilename(e))return null;let r=vo.join(this.dir,e);if(!Ke.existsSync(r))return null;try{let n=Ke.readFileSync(r,"utf8"),o=Ke.statSync(r);return{filename:e,content:n,sizeBytes:o.size}}catch{return null}}write(e,r){if(!this.isValidFilename(e))throw new Error("Invalid filename: must end with .md and contain no path separators");let n=Buffer.byteLength(r,"utf8");if(n>Lb)throw new Error(`File too large: ${n} bytes exceeds ${Lb} limit`);if(this.getDirSize(e)+n>Ob)throw new Error(`Total instructions size would exceed ${Ob} byte limit`);Ke.mkdirSync(this.dir,{recursive:!0});let s=vo.join(this.dir,e);return Ke.writeFileSync(s,r,"utf8"),{filename:e,content:r,sizeBytes:n}}remove(e){if(!this.isValidFilename(e))return!1;let r=vo.join(this.dir,e);return Ke.existsSync(r)?(Ke.unlinkSync(r),!0):!1}loadAll(){let e=this.list();return e.length===0?"":`<project-instructions>
362
+ `);for(let m=0;m<u.length;m++)if(n.test(u[m])&&(a.push({path:l,line:m+1,text:u[m].slice(0,500)}),a.length>=s+o+1))return c=!0,!1}catch{}return!0},1/0),{matches:a.slice(s,s+o),truncated:c}}var lb=!1;function yO(){if(!lb)if(lb=!0,Dr()){let t=process.env.QLOGICAGENT_POWERSHELL_PATH??"powershell.exe";uo(wd(t))}else if(process.platform==="win32"){let t=vO();uo(Qs(t))}else{let t=process.env.SHELL?.endsWith("bash")?process.env.SHELL:"/bin/bash";uo(Qs(t))}}function vO(){let t=process.env.QLOGICAGENT_BASH_PATH;if(t&&j.existsSync(t))return t;let e=["C:\\Program Files\\Git\\bin\\bash.exe","C:\\Program Files (x86)\\Git\\bin\\bash.exe"],r=process.env.ProgramFiles?U.join(process.env.ProgramFiles,"Git","bin","bash.exe"):null;r&&!e.includes(r)&&e.unshift(r);for(let n of e)if(j.existsSync(n))return n;return"bash"}function bO(){return{async fetchUrl(t){let e=new AbortController,r=setTimeout(()=>e.abort(),3e4);try{let n=await fetch(t.url,{signal:e.signal,headers:{"User-Agent":"Mozilla/5.0 (compatible; QLogicAgent/1.0)",Accept:"text/html,application/xhtml+xml,text/plain,*/*"},redirect:"follow"});if(!n.ok)return{content:`HTTP ${n.status} ${n.statusText}`};let o=n.headers.get("content-type")??"",s=await n.text();return t.maxChars&&s.length>t.maxChars&&(s=s.slice(0,t.maxChars)),o.includes("html")&&t.extractMode!=="json"&&(s=kO(s)),{content:s,title:RO(s)}}finally{clearTimeout(r)}}}}function kO(t){return t.replace(/<script[\s\S]*?<\/script>/gi,"").replace(/<style[\s\S]*?<\/style>/gi,"").replace(/<[^>]+>/g," ").replace(/&nbsp;/gi," ").replace(/&amp;/gi,"&").replace(/&lt;/gi,"<").replace(/&gt;/gi,">").replace(/&quot;/gi,'"').replace(/&#39;/gi,"'").replace(/\s{2,}/g," ").trim()}function RO(t){return t.match(/<title[^>]*>([^<]+)<\/title>/i)?.[1]?.trim()}function SO(){let t=async(e,r)=>{let{getModelRegistry:n}=await Promise.resolve().then(()=>(He(),rg)),o=n().getTunable("searxngBaseUrl")??process.env.SEARXNG_BASE_URL?.trim();if(!o)return{query:e,results:[],totalResults:0};let s=r?.maxResults??10,i=new URL("/search",o);i.searchParams.set("q",e),i.searchParams.set("format","json"),i.searchParams.set("pageno","1");let a=new AbortController,c=setTimeout(()=>a.abort(),15e3);try{let l=await fetch(i.toString(),{signal:a.signal,headers:{Accept:"application/json"}});if(!l.ok)return{query:e,results:[]};let d=await l.json(),p=(d.results??[]).slice(0,s).map(u=>({title:u.title??"",url:u.url??"",snippet:u.content??""}));if(r?.allowedDomains?.length){let u=new Set(r.allowedDomains.map(m=>m.toLowerCase()));return{query:e,results:p.filter(m=>{try{return u.has(new URL(m.url).hostname.toLowerCase())}catch{return!1}})}}if(r?.blockedDomains?.length){let u=new Set(r.blockedDomains.map(m=>m.toLowerCase()));return{query:e,results:p.filter(m=>{try{return!u.has(new URL(m.url).hostname.toLowerCase())}catch{return!0}})}}return{query:e,results:p,totalResults:d.number_of_results}}finally{clearTimeout(c)}};return{search:(e,r)=>Fv(_v(),t)(e,r)}}function TO(t){function e(s){if(s==="default")return ne()?.workspaceDir??Ge;let i=we(s);if(!i)throw new Error(`Unknown project: ${s}`);return i.workspaceDir}function r(s){let i=e(s);return t?.getProjectRulesDir(i)??U.join(i,".qlogicagent","rules")}function n(s,i){if(!i.endsWith(".md"))throw new Error("Filename must end with .md");if(i.includes(".."))throw new Error("Path traversal not allowed");let a=r(s),c=U.resolve(a,i);if(!c.startsWith(a+U.sep)&&c!==a)throw new Error("Path traversal not allowed");return c}function o(s,i){if(!j.existsSync(s))return[];let a=[];for(let c of j.readdirSync(s,{withFileTypes:!0})){let l=U.join(s,c.name);if(c.isDirectory())a.push(...o(l,i));else if(c.isFile()&&c.name.endsWith(".md")){let d=j.statSync(l);a.push({filename:U.relative(i,l).replace(/\\/g,"/"),path:l,size:d.size,updatedAt:d.mtime.toISOString(),content:j.readFileSync(l,"utf-8")})}}return a}return{list(s){let i=r(s);return o(i,i).map(a=>({filename:a.filename,path:a.path,size:a.size,updatedAt:a.updatedAt}))},read(s,i){try{let a=n(s,i);if(!j.existsSync(a))return null;let c=j.statSync(a),l=j.readFileSync(a,"utf-8");return{filename:i,path:a,size:c.size,updatedAt:c.mtime.toISOString(),content:l}}catch{return null}},write(s,i,a){let c=n(s,i);j.mkdirSync(U.dirname(c),{recursive:!0}),j.writeFileSync(c,a,"utf-8");let l=j.statSync(c);return{filename:i,path:c,size:l.size,updatedAt:l.mtime.toISOString(),content:a}},remove(s,i){try{let a=n(s,i);return j.existsSync(a)?(j.unlinkSync(a),!0):!1}catch{return!1}}}}var wO={think:"orchestration",task:"orchestration",ask_user:"orchestration",exec:"developer",read:"filesystem",write:"filesystem",edit:"filesystem",patch:"filesystem",apply_patch:"filesystem",search:"search",web_fetch:"web",web_search:"web",instructions:"filesystem",worktree:"developer",notebook_edit:"developer",workflow:"automation",sleep:"automation",project_switch:"system",tool_search:"search",image_generate:"media",tts:"media",video_generate:"media",music_generate:"media",video_edit:"media",video_merge:"media",video_upscale:"media",three_d_generate:"media",stt:"media",voice_clone:"media",media_cancel:"media",file_upload:"filesystem",file_query:"filesystem",file_delete:"filesystem"};function AO(t){for(let e of t)e.category??=wO[e.name]??"other",e.displayName??={key:`capability.tool.${e.name}.name`,fallback:e.label},e.displayDescription??={key:`capability.tool.${e.name}.description`,fallback:""}}var PO=()=>{throw new Error("workflow tool: this controller is authoring-only; `run` requires the initialized engine")};function xO(t){function e(){let r=new mr(t),n=fi();return{controller:n??new ur(r,PO),live:n,store:r}}return{async list(){return e().store.list()},async get(r){return e().store.require(r)},async describe(r){return e().controller.describe(r)},async create(r){return e().controller.create({id:r.id,name:r.name,def:r.def,active:r.active})},async patch(r,n){return e().controller.patch(r,{patch:n.patch,baseRev:n.baseRev,scope:n.scope})},async setActive(r,n){return e().controller.setActive(r,n)},async run(r){let{live:n}=e();if(!n)throw new Error("workflow engine is not initialized in this context. Activate the workflow (setActive) so a trigger runs it, or run it from the app.");let o={type:"manual"};return n.run(r,o)},async delete(r){await e().store.delete(r)}}}function hb(t){t?.workdir&&(Ge=t.workdir);let e=t?.toolCatalog??Lr(),r=()=>e.getToolNames(),n=i=>e.findTool(i),o=i=>e.activateTool(i);yO(),Xs(Ge);let s=ab([ou("cli-local-tools",i=>{let a=i;a.push(Vh()),a.push(zh(void 0,{onTaskCreated:g=>su?.onTaskCreated?.(g),onTaskCompleted:g=>su?.onTaskCompleted?.(g)})),a.push(pv({askUser:async g=>db?.(g)??null})),a.push(ay({onProgress:t?.onExecProgress,validateCommand:async g=>{let h=/(?:>>?|[12]>)\s*(?:"([^"]+)"|'([^']+)'|(\S+))/g,b;for(;(b=h.exec(g))!==null;){let R=b[1]||b[2]||b[3];if(R){let S=U.isAbsolute(R)?U.normalize(R):U.resolve(Ge,R);if(!yo(S))return`Blocked: output redirection to path outside workspace: ${R}`}}let v=[/(?:^|[\s;|&(])(?:"(\/[^"]+)"|'(\/[^']+)'|(\/(?!dev\/null\b)[^\s;|&><)]+))/g,/(?:^|[\s;|&(])(?:"([A-Za-z]:[\\\/][^"]+)"|'([A-Za-z]:[\\\/][^']+)'|([A-Za-z]:[\\\/][^\s;|&><)]+))/g,/(?:^|[\s;|&(])(?:"([^"]*\.\.[\\/][^"]+)"|'([^']*\.\.[\\/][^']+)'|([^\s;|&><)"']*\.\.[\\/][^\s;|&><)]+))/g];for(let R of v){let S;for(;(S=R.exec(g))!==null;){let T=S[1]||S[2]||S[3];if(!T||/^\/[a-zA-Z](?:[- ]|$)/.test(T)||/^\/[a-zA-Z]{1,3}$/.test(T))continue;let C;if(process.platform==="win32"&&/^\/[a-zA-Z]\//.test(T)){let E=T.replace(/^\/([a-zA-Z])\//,(M,L)=>`${L.toUpperCase()}:\\`).replace(/\//g,"\\");C=U.normalize(E)}else C=U.isAbsolute(T)?U.normalize(T):U.resolve(Ge,T);if(!yo(C))return`Blocked: command references path outside workspace: ${T}`}}return null},interpretExitCode:(g,h)=>{if(g===127)return"command not found";if(g===126)return"permission denied";if(g===137)return"killed (SIGKILL / OOM)";if(g===143)return"terminated (SIGTERM)";if(g===130)return"interrupted (Ctrl+C)"}}));let c=lO(),l=dO(),d=uO(),p=pO();a.push(dy(c)),a.push(py(l)),a.push(my(d)),a.push(Id(p)),a.push(yy(p)),a.push(hy(mO())),a.push(Py(bO())),a.push(xy(SO()));let u=TO(t?.pathService);a.push(Cy(u));let m=t?.log??{info:()=>{},warn:()=>{}};a.push(Iy(qy({log:m}))),a.push(zy()),a.push(Vy({getService:()=>xO(Ge)})),a.push(Xy({sleep:(g,h)=>new Promise(b=>{let v=Date.now(),R=setTimeout(()=>{b({sleptSeconds:Math.round((Date.now()-v)/1e3),interrupted:!1})},g),S=()=>{clearTimeout(R),b({sleptSeconds:Math.round((Date.now()-v)/1e3),interrupted:!0,interruptReason:"aborted"})};h.addEventListener("abort",S,{once:!0}),h.aborted&&(clearTimeout(R),S())})}));let f={listProjects:()=>z(),switchProject:g=>xt(g),onSwitched:g=>aO?.(g)};a.push(mv(f)),a.push(Jy({searchTools:async(g,h)=>{let b=h?.maxResults??5,v=r(),R=g.toLowerCase().split(/\s+/).filter(Boolean),S=[],T=[];for(let k of R)k.startsWith("+")&&k.length>1?S.push(k.slice(1)):T.push(k);let C=[...S,...T],E=k=>k.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/_/g," ").toLowerCase().split(/\s+/).filter(Boolean);return{matches:v.map(k=>{let Q=n(k),de=E(k),O=(Q?.description??"").toLowerCase(),Oe=(Q?.searchHint??"").toLowerCase();if(S.length>0){let F=`${de.join(" ")} ${O} ${Oe}`;if(!S.every(H=>F.includes(H)))return null}let je=0;for(let F of C){let J=0;de.some(H=>H===F)?J=10:de.some(H=>H.includes(F))?J=5:k.toLowerCase().includes(F)&&(J=3),Oe&&new RegExp(`\\b${F}`,"i").test(Oe)&&(J+=4),new RegExp(`\\b${F}`,"i").test(O)&&(J+=2),je+=J}return{name:k,description:Q?.description??"",searchHint:Q?.searchHint,score:je}}).filter(k=>k!==null&&k.score>0).sort((k,Q)=>Q.score-k.score).slice(0,b),query:g,totalDeferred:v.length}},activateTool:async g=>o(g)}))}),ou("media-tools",i=>{let a=i;a.push({...Qy({generateImage:async l=>{let d=await It({mediaType:"image",model:"",prompt:l.prompt,purpose:l.purpose,style:l.style,size:l.size,imageUrl:l.imageUrl,n:l.n,quality:l.quality,seed:l.seed});return{mediaUrls:d.mediaUrls,model:d.model,size:d.size,durationMs:d.durationMs}}}),isConcurrencySafe:!0,isEnabled:()=>Et("image")}),a.push({...Zy({textToSpeech:async l=>{let d=await It({mediaType:"tts",model:"",prompt:"",text:l.text,channel:l.channel,voice:l.voice,speed:l.speed});return{audioPath:"",provider:d.model,mediaUrls:d.mediaUrls}}}),isConcurrencySafe:!0,isEnabled:()=>Et("tts")}),a.push({...ev({generateVideo:async l=>{let d=await It({mediaType:"video",model:"",prompt:l.prompt,purpose:l.purpose,style:l.style,imageUrl:l.imageUrl,referenceVideos:l.referenceVideos,referenceAudios:l.referenceAudios,generateAudio:l.generateAudio,aspectRatio:l.aspectRatio,duration:l.duration,resolution:l.resolution,fps:l.fps,seed:l.seed,cameraFixed:l.cameraFixed,returnLastFrame:l.returnLastFrame,draft:l.draft,serviceTier:l.serviceTier,callbackUrl:l.callbackUrl,safetyIdentifier:l.safetyIdentifier,executionExpiresAfterSeconds:l.executionExpiresAfterSeconds,videoTools:l.videoTools});return{mediaUrls:d.mediaUrls,model:d.model,durationMs:d.durationMs,lastFrameUrl:d.lastFrameUrl,taskId:d.taskId}}}),isConcurrencySafe:!0,isEnabled:()=>Et("video")}),a.push({...tv({generateMusic:async l=>{let d=await It({mediaType:"music",model:"",prompt:l.prompt,purpose:l.purpose,style:l.style,lyrics:l.lyrics,duration:l.duration,isInstrumental:l.isInstrumental,audioUrl:l.audioUrl,audioFormat:l.audioFormat});return{mediaUrls:d.mediaUrls,model:d.model,durationMs:d.durationMs}},generateLyrics:Nv}),isConcurrencySafe:!0,isEnabled:()=>Et("music")}),a.push({...rv({editVideo:async l=>{let d=await It({mediaType:"video",model:"",prompt:l.prompt,operation:"edit",sourceVideos:l.sourceVideos,referenceImages:l.referenceImages,duration:l.duration,aspectRatio:l.aspectRatio,resolution:l.resolution});return{mediaUrls:d.mediaUrls,model:d.model,durationMs:d.durationMs}}}),shouldDefer:!0,isEnabled:()=>si("video","edit")}),a.push({...nv({mergeVideos:async l=>{let d=[`merge ${l.clips.length} clips`];l.transition&&d.push(`transition: ${l.transition}${l.transitionDuration?` (${l.transitionDuration}s)`:""}`),l.subtitles&&d.push(`burn-in subtitles: ${l.subtitles}`),l.bgm&&d.push(`background music: ${l.bgm}${l.bgmVolume!==void 0?` at volume ${l.bgmVolume}`:""}`);let p=await It({mediaType:"video",model:"",prompt:d.join("; "),operation:"merge",sourceVideos:l.clips.map(u=>u.video),resolution:l.outputResolution,fps:l.outputFps});return{localPath:"",servePath:p.mediaUrls[0]??"",durationSec:(p.durationMs??0)/1e3,clipCount:l.clips.length,mediaUrls:p.mediaUrls}}}),shouldDefer:!0,isEnabled:()=>si("video","merge")}),a.push({...ov({upscaleVideo:async l=>{let d=["upscale"];l.sharpness&&d.push(`sharpness: ${l.sharpness}`);let p=await It({mediaType:"video",model:"",prompt:d.join(", "),operation:"upscale",sourceVideos:[l.video],resolution:l.targetResolution??"1080p"});return{localPath:"",servePath:p.mediaUrls[0]??"",resolution:l.targetResolution??"1080p",durationSec:(p.durationMs??0)/1e3,mediaUrls:p.mediaUrls}}}),shouldDefer:!0,isEnabled:()=>si("video","upscale")}),a.push({...sv({generate3D:async l=>{let d=await It({mediaType:"3d",model:"",prompt:l.prompt,imageUrl:l.imageUrl,outputFormat:l.outputFormat,seed:l.seed});return{mediaUrls:d.mediaUrls,model:d.model,durationMs:d.durationMs,metadata:d.metadata}}}),isConcurrencySafe:!0,shouldDefer:!0,isEnabled:()=>Et("3d")}),a.push({...iv({speechToText:async l=>{let d=await It({mediaType:"stt",model:"",prompt:"",audioUrl:l.audioUrl,metadata:l.language?{language:l.language}:void 0});return{transcription:d.metadata?.transcription??"",model:d.model,durationMs:d.durationMs}}}),shouldDefer:!0,isEnabled:()=>Et("stt")}),a.push({...av({cloneVoice:async l=>{let d=await It({mediaType:"voice_clone",model:"",prompt:"",text:l.text,audioUrl:l.sampleAudioUrl,speed:l.speed});return{mediaUrls:d.mediaUrls,model:d.model,voiceId:d.metadata?.voiceId,durationMs:d.durationMs}}}),shouldDefer:!0,isEnabled:()=>Et("voice_clone")}),a.push({...cv({cancelTask:Lv}),shouldDefer:!0,isEnabled:()=>Et("video")||Et("3d")});let c=$v({getContext:Dv,resolvePath:xe});a.push({...lv(c),shouldDefer:!0,isEnabled:()=>c.isAvailable()}),a.push({...dv(c),shouldDefer:!0,isEnabled:()=>c.isAvailable()}),a.push({...uv(c),shouldDefer:!0,isEnabled:()=>c.isAvailable()})})],{config:t});return AO(s),e.setTools(s),t?.log?.info(`[tool-bootstrap] Registered ${s.length} local tools (${s.filter(i=>i.isEnabled?.()!==!1).length} enabled): ${r().join(", ")}`),s}function er(t){return Cv(t)}function yb(t){return{getAllBaseTools:e=>hb({...e,toolCatalog:e?.toolCatalog??t}),setWorkdir:mb}}var CO=new Set(["permissionMode","permissionRules","defaultBehavior"]);function vb(t){let e=t.params;this.syncToolListMediaConfig?.();let r=this.toolCatalog??er(),o=r.getToolManifest(e?.includeDeferred??!1).map(s=>{let i=r.findTool(s.function.name),a=i?.category??"other";return{id:s.function.name,name:s.function.name,category:a,displayName:i?.displayName??{key:`capability.tool.${s.function.name}.name`,fallback:i?.label??s.function.name},displayDescription:i?.displayDescription??{key:`capability.tool.${s.function.name}.description`,fallback:""},fallbackName:i?.label??s.function.name,fallbackDescription:"",description:s.function.description??"",parameters:s.function.parameters,deferred:!!i?.shouldDefer,source:"builtin"}});if(e?.category){let s=o.filter(i=>i.category===e.category);t.id!==void 0&&this.sendResponse(t.id,{tools:s,total:s.length})}else t.id!==void 0&&this.sendResponse(t.id,{tools:o,total:o.length})}function bb(t){let e=D().listProviderDefs(),r=new Map;for(let o of e){let s=o.group??o.id;r.has(s)||r.set(s,[]);let i=!!D().resolveProviderApiKey(o.id);r.get(s).push({id:o.id,name:o.name,transport:o.transport,baseUrl:o.baseUrl,defaultModel:o.defaultModel,modelCount:o.models?.length??0,available:i})}let n=[...r.entries()].map(([o,s])=>({group:o,variants:s}));t.id!==void 0&&this.sendResponse(t.id,{providers:n})}function kb(t){try{let r=D().exportConfig(),n=Ue(),o={};try{o=JSON.parse($t.readFileSync(n,"utf-8"))}catch{}t.id!==void 0&&this.sendResponse(t.id,{config:{...IO(o),providers:MO(r.providers),models:r.models,bindings:r.bindings,permissions:Tb(o.permissions)},paths:{userSettings:Ue(),agentHome:X()}})}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 IO(t){let e={};for(let[r,n]of Object.entries(t)){if(mu.has(r)||CO.has(r))continue;let o=uu(r,n);o!==void 0&&(e[r]=o)}return e}function uu(t,e){if(EO(t))return typeof e=="string"?Rb(e):"[REDACTED]";if(Array.isArray(e))return e.map(r=>uu(t,r));if(e&&typeof e=="object"){let r={};for(let[n,o]of Object.entries(e)){if(mu.has(n))continue;let s=uu(n,o);s!==void 0&&(r[n]=s)}return r}return e}function EO(t){return/(?:apiKey|key|token|secret|credential|authorization|password)/i.test(t)}function MO(t){return t.map(e=>({providerId:e.providerId,baseUrl:e.baseUrl,strategy:e.strategy,keys:e.keys.map(r=>{let n={id:r.id,maskedKey:Rb(r.key),weight:r.weight,enabled:r.enabled};return r.label&&(n.label=r.label),n}),...e.rateLimit?{rateLimit:e.rateLimit}:{}}))}function Rb(t){return t.length<=8?"****":`${t.slice(0,3)}***${t.slice(-4)}`}var mu=new Set(["providers","models","bindings","provider","model","apiKey","baseUrl","providerKeys"]);async function Sb(t){let e=t.params;if(!e?.updates||typeof e.updates!="object"){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"updates (object) is required."});return}let r=[],n={};for(let[o,s]of Object.entries(e.updates))mu.has(o)?r.push({key:o,reason:"Use settings.* RPC methods for model/key management"}):n[o]=o==="permissions"?Tb(s):s;if(r.length>0&&Object.keys(n).length===0){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:`Rejected keys: ${r.map(o=>o.key).join(", ")}. Use settings.* RPC for model management.`});return}try{let o=Ue(),s={};try{let i=await $t.promises.readFile(o,"utf-8");s=JSON.parse(i)}catch{}Object.assign(s,n),await $t.promises.mkdir(pu.dirname(o),{recursive:!0}),await $t.promises.writeFile(o,JSON.stringify(s,null,2),"utf-8"),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,applied:Object.keys(n),rejected:r})}catch(o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:o instanceof Error?o.message:String(o)})}}function Tb(t){if(!t||typeof t!="object")return;let e=t.mode;if(e==="default"||e==="auto"||e==="full_access")return{mode:e}}function wb(t){try{let e=Dc(),r=Ue(),n={};try{let o=$t.readFileSync(r,"utf-8"),s=JSON.parse(o);s.tunables&&typeof s.tunables=="object"&&(n=s.tunables)}catch{}t.id!==void 0&&this.sendResponse(t.id,{defaults:e,overrides: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 Ab(t){let e=t.params,r=e?.key,n=e?.value;if(!r||typeof r!="string"){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: key (string)"});return}let o=Dc();if(!(r in o)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:`Unknown tunable key: "${r}". Valid keys: ${Object.keys(o).join(", ")}`});return}let s=typeof o[r];if(n==null||typeof n!==s){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:`Invalid value for "${r}": expected ${s}, got ${typeof n}`});return}try{let i=Ue(),a={};try{let c=await $t.promises.readFile(i,"utf-8");a=JSON.parse(c)}catch{}(!a.tunables||typeof a.tunables!="object")&&(a.tunables={}),a.tunables[r]=n,await $t.promises.mkdir(pu.dirname(i),{recursive:!0}),await $t.promises.writeFile(i,JSON.stringify(a,null,2),"utf-8"),r==="teamBudgetTokens"&&typeof n=="number"&&(ft.teamBudget.budgetTokens=n),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,key:r,value:n})}catch(i){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:i instanceof Error?i.message:String(i)})}}async function Pb(t){let e=(this.toolCatalog??er()).findTool("task");if(!e||typeof e.execute!="function"){t.id!==void 0&&this.sendResponse(t.id,{items:[],summary:co([])});return}try{let o=(await e.execute("rpc-todos-list",{action:"list"},void 0)).details?.taskList??[];t.id!==void 0&&this.sendResponse(t.id,{items:o,summary:co(o)})}catch{t.id!==void 0&&this.sendResponse(t.id,{items:[],summary:co([])})}}function xb(t){let r=t.params?.lifecycle??"all",n=this.taskStore.getAllTasks(),o=r==="all"?n:n.filter(s=>s.lifecycle===r);t.id!==void 0&&this.sendResponse(t.id,{tasks:o.map(s=>({taskId:s.taskId,type:s.type,lifecycle:s.lifecycle,label:s.label}))})}function Cb(t){let e=t.params;if(!e?.taskId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"taskId is required."});return}let n=this.taskStore.getAllTasks().find(o=>o.taskId===e.taskId);if(!n){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,message:`Task ${e.taskId} not found.`});return}if(n.lifecycle!=="running"&&n.lifecycle!=="pending"){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,message:`Task ${e.taskId} is already ${n.lifecycle}.`});return}this.taskStore.updateTask(e.taskId,o=>(o.lifecycle="cancelled",o)),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,message:`Task ${e.taskId} cancelled.`})}var Ib=["initialize","thread.create","thread.list","thread.turn","session.resume","session.getInfo","session.getMessages","memory.list","memory.read","memory.write","memory.search","memory.delete","memory.dream","tools.list","media.listModels","config.get","config.update","community.getConsent","community.setConsent","community.matchRegistry","community.listShared","community.withdrawShared","community.withdrawAllShared","community.listNotices","community.markNoticeRead","community.listPublishAudit","community.resolveInstall","community.installResource","community.publishSkill","community.publishPet","community.recordSignal","community.recordTelemetry","todos.list","tasks.list","tasks.cancel","agent.ping","agent.abort","tool.approval.response","agents.scan","agents.list","agents.config","agents.setConfig","agents.getConfig","agents.removeConfig","agents.setGateway","solo.start","solo.status","solo.cancel","solo.select","solo.list","solo.delete","solo.message","solo.evaluate","product.plan","product.confirm","product.message","product.create","product.resume","product.pause","product.checkpoint","product.status","product.list","product.delete","product.cancel","product.rollback","project.create","project.list","project.delete","project.rename","project.archive","project.unarchive","project.update","project.archiveByGroup","session.switchProject","session.getState","session.create","session.list","session.get","session.update","session.delete","session.archive","instructions.list","instructions.read","instructions.write","instructions.delete","files.list","files.read","files.create","files.rename","files.delete","files.gitStatus","settings.listProviders","settings.addKey","settings.removeKey","settings.getKey","settings.toggleKey","settings.listModels","settings.setActiveModel","settings.getActiveModel","settings.getOverview","settings.refreshModels","settings.validateKey"];function Eb(t){let e=t.params,r=e?.protocolVersion??"unknown",n=e?.host?.name??e?.hostName??"unknown",o=e?.host?.version??e?.hostVersion??"?",s=r.split(".")[0],i=Ar.split(".")[0];if(s!==i){this.log(`[initialize] protocol mismatch: host=${r} agent=${Ar}`),t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.PROTOCOL_MISMATCH,message:`Protocol version mismatch: host=${r}, agent=${Ar}`});return}this.log(`[initialize] host=${n} v${o}`),t.id!==void 0&&this.sendResponse(t.id,{protocolVersion:Ar,agent:{name:"qlogicagent",version:"0.1.0"},capabilities:{tools:this.toolCatalog.getToolManifest().map(a=>a.function.name),streaming:!0,threads:!0,notifications:["turn.start","turn.delta","turn.end","turn.error","turn.recovery","turn.tool_call","turn.tool_result","turn.tool_blocked","turn.reasoning_delta","turn.plan_update","turn.suggestions","turn.subagent_started","turn.subagent_delta","turn.subagent_ended","turn.media_result","turn.todos_updated","task.updated","turn.exec_progress","turn.artifact","tool.approval.request","turn.skill_instruction","turn.ask_user","memory.updated","session.info","permission.rule_updated","team.updated","turn.usage_update","pong"],methods:[...Ib]}}),this.ensureDefaultProject()}function Mb(t){t.id!==void 0&&this.sendResponse(t.id,{status:"ok"}),this.sendNotification("pong",{})}function _b(t){t.id!==void 0&&this.sendResponse(t.id,{ok:!0,status:this.running?"healthy":"stopping",uptimeMs:Date.now()-this.startedAt,protocolVersion:Ar,version:this.packageVersion})}function Db(t){t.id!==void 0&&this.sendResponse(t.id,{rpc:this.rpcContract.metrics()})}function Nb(t){let e=t.params,r=e?.requestId,n=typeof r=="string"?this.rpcContract.cancel(r,e?.reason??"host-cancelled"):!1;n&&this.activeTurn&&this.activeTurn.abort(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,cancelled:n})}import*as ee from"node:fs";import*as ze from"node:path";G();import Ke from"node:fs";import vo from"node:path";var Lb=Sc,Ob=Tc,vi=class{dir;constructor(e){this.dir=Qr(e)}list(){if(!Ke.existsSync(this.dir))return[];let e=[];for(let r of Ke.readdirSync(this.dir)){if(!r.endsWith(".md"))continue;let n=vo.join(this.dir,r);try{let o=Ke.statSync(n);if(!o.isFile())continue;let s=Ke.readFileSync(n,"utf8");e.push({filename:r,content:s,sizeBytes:o.size})}catch{}}return e}read(e){if(!this.isValidFilename(e))return null;let r=vo.join(this.dir,e);if(!Ke.existsSync(r))return null;try{let n=Ke.readFileSync(r,"utf8"),o=Ke.statSync(r);return{filename:e,content:n,sizeBytes:o.size}}catch{return null}}write(e,r){if(!this.isValidFilename(e))throw new Error("Invalid filename: must end with .md and contain no path separators");let n=Buffer.byteLength(r,"utf8");if(n>Lb)throw new Error(`File too large: ${n} bytes exceeds ${Lb} limit`);if(this.getDirSize(e)+n>Ob)throw new Error(`Total instructions size would exceed ${Ob} byte limit`);Ke.mkdirSync(this.dir,{recursive:!0});let s=vo.join(this.dir,e);return Ke.writeFileSync(s,r,"utf8"),{filename:e,content:r,sizeBytes:n}}remove(e){if(!this.isValidFilename(e))return!1;let r=vo.join(this.dir,e);return Ke.existsSync(r)?(Ke.unlinkSync(r),!0):!1}loadAll(){let e=this.list();return e.length===0?"":`<project-instructions>
363
363
  ${e.map(n=>`<!-- file: ${n.filename}>
364
364
  ${n.content}`).join(`
365
365
 
366
366
  `)}
367
- </project-instructions>`}isValidFilename(e){return!(!e.endsWith(".md")||e.includes("/")||e.includes("\\")||e.includes("..")||e.startsWith("."))}getDirSize(e){if(!Ke.existsSync(this.dir))return 0;let r=0;for(let n of Ke.readdirSync(this.dir)){if(n===e)continue;let o=vo.join(this.dir,n);try{let s=Ke.statSync(o);s.isFile()&&(r+=s.size)}catch{}}return r}};G();function Ut(t){return Te(t)?.workspaceDir??null}function bi(t){return t?new vi(t):null}async function jb(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,{entries:[]});return}let r=Ut(e.projectId);if(!r){t.id!==void 0&&this.sendResponse(t.id,{entries:[]});return}try{let n=e.path?ze.join(r,e.path):r,s=(await ee.promises.readdir(n,{withFileTypes:!0})).filter(i=>!i.name.startsWith(".")).map(i=>({name:i.name,path:e.path?`${e.path}/${i.name}`:i.name,type:i.isDirectory()?"directory":"file"}));t.id!==void 0&&this.sendResponse(t.id,{entries:s})}catch{t.id!==void 0&&this.sendResponse(t.id,{entries:[]})}}async function $b(t){let e=t.params;if(!e?.projectId||!e?.path){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required params: projectId, path"});return}let r=Ut(e.projectId);if(!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"Project not found"});return}let n=ze.join(r,e.path);if(!n.startsWith(r)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Path escapes project directory"});return}try{e.type==="directory"?await ee.promises.mkdir(n,{recursive:!0}):(await ee.promises.mkdir(ze.dirname(n),{recursive:!0}),await ee.promises.writeFile(n,e.content??"","utf-8")),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,path:e.path})}catch(o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to create: ${o.message}`})}}async function Ub(t){let e=t.params;if(!e?.projectId||!e?.oldPath||!e?.newName){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required params: projectId, oldPath, newName"});return}let r=Ut(e.projectId);if(!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"Project not found"});return}let n=ze.join(r,e.oldPath),o=ze.join(ze.dirname(n),e.newName);if(!n.startsWith(r)||!o.startsWith(r)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Path escapes project directory"});return}try{await ee.promises.rename(n,o);let s=ze.relative(r,o).replace(/\\/g,"/");t.id!==void 0&&this.sendResponse(t.id,{ok:!0,newPath:s})}catch(s){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to rename: ${s.message}`})}}async function Fb(t){let e=t.params;if(!e?.projectId||!e?.path){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required params: projectId, path"});return}let r=Ut(e.projectId);if(!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"Project not found"});return}let n=ze.join(r,e.path);if(!n.startsWith(r)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Path escapes project directory"});return}try{await ee.promises.rm(n,{recursive:!0}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to delete: ${o.message}`})}}async function Hb(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,{files:[]});return}let r=Ut(e.projectId);if(!r){t.id!==void 0&&this.sendResponse(t.id,{files:[]});return}try{let{execSync:n}=await import("node:child_process"),s=n("git statusporcelain",{cwd:r,encoding:"utf-8",timeout:5e3}).split(`
368
- `).filter(Boolean).map(i=>({path:i.slice(3),status:i.slice(0,2).trim()}));t.id!==void 0&&this.sendResponse(t.id,{files:s})}catch{t.id!==void 0&&this.sendResponse(t.id,{files:[]})}}function Bb(t){let e=t.params,r;if(e?.projectId&&(r=Ut(e.projectId)??void 0),r||(r=this.getActiveProjectRoot()),!r){t.id!==void 0&&this.sendResponse(t.id,{instructions:[]});return}let n=[],o=Tr(r);try{let i=ee.statSync(o);i.isFile()&&n.push({name:"INSTRUCTIONS.md",filename:"INSTRUCTIONS.md",path:"INSTRUCTIONS.md",size:i.size})}catch{}let s=bi(r);if(s)for(let i of s.list())n.push({name:i.filename,filename:i.filename,path:`rules/${i.filename}`,size:i.sizeBytes});t.id!==void 0&&this.sendResponse(t.id,{instructions:n})}function qb(t){let e=t.params;if(!e?.path){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: path"});return}let r;if(e?.projectId&&(r=Ut(e.projectId)??void 0),r||(r=this.getActiveProjectRoot()),!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"No active project workspace"});return}if(e.path==="INSTRUCTIONS.md"){let i=Tr(r);try{let a=ee.readFileSync(i,"utf8");t.id!==void 0&&this.sendResponse(t.id,{content:a,metadata:{filename:"INSTRUCTIONS.md",sizeBytes:Buffer.byteLength(a)}})}catch{t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"Instruction file not found"})}return}let n=e.path.startsWith("rules/")?e.path.slice(6):e.path,o=bi(r);if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"No active project workspace"});return}let s=o.read(n);if(!s){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"Instruction file not found"});return}t.id!==void 0&&this.sendResponse(t.id,{content:s.content,metadata:{filename:s.filename,sizeBytes:s.sizeBytes}})}function Wb(t){let e=t.params;if(!e?.path||typeof e?.content!="string"){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required params: path, content"});return}let r=this.getActiveProjectRoot();if(e.path==="INSTRUCTIONS.md"){try{let o=Tr(r);ee.mkdirSync(ze.dirname(o),{recursive:!0}),ee.writeFileSync(o,e.content,"utf8"),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:o instanceof Error?o.message:String(o)})}return}let n=bi(this.getActiveProjectRoot());if(!n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"No active project workspace"});return}try{n.write(e.path,e.content),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:o instanceof Error?o.message:String(o)})}}function Gb(t){let e=t.params;if(!e?.path){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: path"});return}if(e.path==="INSTRUCTIONS.md"){let o=Tr(this.getActiveProjectRoot());try{ee.unlinkSync(o),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch{t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"Instruction file not found"})}return}let r=bi(this.getActiveProjectRoot());if(!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"No active project workspace"});return}if(!r.remove(e.path)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"Instruction file not found"});return}t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}function Kb(t){let e=t.params,r;if(e?.projectId&&(r=Ut(e.projectId)??void 0),r||(r=this.getActiveProjectRoot()),!r){t.id!==void 0&&this.sendResponse(t.id,{plans:[]});return}let n=ze.join(De(r),"plans"),o=[];try{if(ee.existsSync(n))for(let s of ee.readdirSync(n)){if(!s.endsWith(".md")||s.includes("/")||s.includes("\\")||s.includes(".."))continue;let i=ze.join(n,s),a=ee.statSync(i);if(!a.isFile())continue;let c=ee.readFileSync(i,"utf8"),l=_O(c),d=s.slice(0,-3);o.push({slug:d,name:l.title??d,title:l.title??d,status:l.status,path:`plans/${s}`,size:a.size})}}catch{}o.sort((s,i)=>s.slug.localeCompare(i.slug)),t.id!==void 0&&this.sendResponse(t.id,{plans:o})}function _O(t){if(!t.startsWith("---"))return{};let e=t.indexOf(`
367
+ </project-instructions>`}isValidFilename(e){return!(!e.endsWith(".md")||e.includes("/")||e.includes("\\")||e.includes("..")||e.startsWith("."))}getDirSize(e){if(!Ke.existsSync(this.dir))return 0;let r=0;for(let n of Ke.readdirSync(this.dir)){if(n===e)continue;let o=vo.join(this.dir,n);try{let s=Ke.statSync(o);s.isFile()&&(r+=s.size)}catch{}}return r}};G();function Ut(t){return we(t)?.workspaceDir??null}function bi(t){return t?new vi(t):null}async function jb(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,{entries:[]});return}let r=Ut(e.projectId);if(!r){t.id!==void 0&&this.sendResponse(t.id,{entries:[]});return}try{let n=e.path?ze.join(r,e.path):r,s=(await ee.promises.readdir(n,{withFileTypes:!0})).filter(i=>!i.name.startsWith(".")).map(i=>({name:i.name,path:e.path?`${e.path}/${i.name}`:i.name,type:i.isDirectory()?"directory":"file"}));t.id!==void 0&&this.sendResponse(t.id,{entries:s})}catch{t.id!==void 0&&this.sendResponse(t.id,{entries:[]})}}async function $b(t){let e=t.params;if(!e?.projectId||!e?.path){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required params: projectId, path"});return}let r=Ut(e.projectId);if(!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"Project not found"});return}let n=ze.join(r,e.path);if(!n.startsWith(r)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Path escapes project directory"});return}try{e.type==="directory"?await ee.promises.mkdir(n,{recursive:!0}):(await ee.promises.mkdir(ze.dirname(n),{recursive:!0}),await ee.promises.writeFile(n,e.content??"","utf-8")),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,path:e.path})}catch(o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to create: ${o.message}`})}}async function Ub(t){let e=t.params;if(!e?.projectId||!e?.oldPath||!e?.newName){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required params: projectId, oldPath, newName"});return}let r=Ut(e.projectId);if(!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"Project not found"});return}let n=ze.join(r,e.oldPath),o=ze.join(ze.dirname(n),e.newName);if(!n.startsWith(r)||!o.startsWith(r)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Path escapes project directory"});return}try{await ee.promises.rename(n,o);let s=ze.relative(r,o).replace(/\\/g,"/");t.id!==void 0&&this.sendResponse(t.id,{ok:!0,newPath:s})}catch(s){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to rename: ${s.message}`})}}async function Fb(t){let e=t.params;if(!e?.projectId||!e?.path){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required params: projectId, path"});return}let r=Ut(e.projectId);if(!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"Project not found"});return}let n=ze.join(r,e.path);if(!n.startsWith(r)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Path escapes project directory"});return}try{await ee.promises.rm(n,{recursive:!0}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to delete: ${o.message}`})}}async function Hb(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,{files:[]});return}let r=Ut(e.projectId);if(!r){t.id!==void 0&&this.sendResponse(t.id,{files:[]});return}try{let{execSync:n}=await import("node:child_process"),s=n("git statusporcelain",{cwd:r,encoding:"utf-8",timeout:5e3}).split(`
368
+ `).filter(Boolean).map(i=>({path:i.slice(3),status:i.slice(0,2).trim()}));t.id!==void 0&&this.sendResponse(t.id,{files:s})}catch{t.id!==void 0&&this.sendResponse(t.id,{files:[]})}}function Bb(t){let e=t.params,r;if(e?.projectId&&(r=Ut(e.projectId)??void 0),r||(r=this.getActiveProjectRoot()),!r){t.id!==void 0&&this.sendResponse(t.id,{instructions:[]});return}let n=[],o=Tr(r);try{let i=ee.statSync(o);i.isFile()&&n.push({name:"INSTRUCTIONS.md",filename:"INSTRUCTIONS.md",path:"INSTRUCTIONS.md",size:i.size})}catch{}let s=bi(r);if(s)for(let i of s.list())n.push({name:i.filename,filename:i.filename,path:`rules/${i.filename}`,size:i.sizeBytes});t.id!==void 0&&this.sendResponse(t.id,{instructions:n})}function qb(t){let e=t.params;if(!e?.path){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: path"});return}let r;if(e?.projectId&&(r=Ut(e.projectId)??void 0),r||(r=this.getActiveProjectRoot()),!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"No active project workspace"});return}if(e.path==="INSTRUCTIONS.md"){let i=Tr(r);try{let a=ee.readFileSync(i,"utf8");t.id!==void 0&&this.sendResponse(t.id,{content:a,metadata:{filename:"INSTRUCTIONS.md",sizeBytes:Buffer.byteLength(a)}})}catch{t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"Instruction file not found"})}return}let n=e.path.startsWith("rules/")?e.path.slice(6):e.path,o=bi(r);if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"No active project workspace"});return}let s=o.read(n);if(!s){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"Instruction file not found"});return}t.id!==void 0&&this.sendResponse(t.id,{content:s.content,metadata:{filename:s.filename,sizeBytes:s.sizeBytes}})}function Wb(t){let e=t.params;if(!e?.path||typeof e?.content!="string"){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required params: path, content"});return}let r=this.getActiveProjectRoot();if(e.path==="INSTRUCTIONS.md"){try{let o=Tr(r);ee.mkdirSync(ze.dirname(o),{recursive:!0}),ee.writeFileSync(o,e.content,"utf8"),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:o instanceof Error?o.message:String(o)})}return}let n=bi(this.getActiveProjectRoot());if(!n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"No active project workspace"});return}try{n.write(e.path,e.content),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:o instanceof Error?o.message:String(o)})}}function Gb(t){let e=t.params;if(!e?.path){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: path"});return}if(e.path==="INSTRUCTIONS.md"){let o=Tr(this.getActiveProjectRoot());try{ee.unlinkSync(o),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch{t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"Instruction file not found"})}return}let r=bi(this.getActiveProjectRoot());if(!r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"No active project workspace"});return}if(!r.remove(e.path)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"Instruction file not found"});return}t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}function Kb(t){let e=t.params,r;if(e?.projectId&&(r=Ut(e.projectId)??void 0),r||(r=this.getActiveProjectRoot()),!r){t.id!==void 0&&this.sendResponse(t.id,{plans:[]});return}let n=ze.join(Ne(r),"plans"),o=[];try{if(ee.existsSync(n))for(let s of ee.readdirSync(n)){if(!s.endsWith(".md")||s.includes("/")||s.includes("\\")||s.includes(".."))continue;let i=ze.join(n,s),a=ee.statSync(i);if(!a.isFile())continue;let c=ee.readFileSync(i,"utf8"),l=_O(c),d=s.slice(0,-3);o.push({slug:d,name:l.title??d,title:l.title??d,status:l.status,path:`plans/${s}`,size:a.size})}}catch{}o.sort((s,i)=>s.slug.localeCompare(i.slug)),t.id!==void 0&&this.sendResponse(t.id,{plans:o})}function _O(t){if(!t.startsWith("---"))return{};let e=t.indexOf(`
369
369
  ---`,3);if(e<0)return{};let r=t.slice(3,e).split(/\r?\n/),n={};for(let o of r){let s=/^([A-Za-z][A-Za-z0-9_-]*)\s*:\s*(.+)$/.exec(o.trim());if(!s)continue;let i=s[2].trim().replace(/^['"]|['"]$/g,"");s[1]==="title"&&(n.title=i),s[1]==="status"&&(n.status=i)}return n}He();var DO="doubao";function zb(t){return t?.provider??D().peekActiveModel("videoGeneration")?.provider??D().peekActiveModel("threeDGeneration")?.provider??DO}function Vb(t){let e=ei(t);return D().resolveProviderApiKey(t)??(e===t?void 0:D().resolveProviderApiKey(e))}function Xb(t,e){let r=ei(e);return t?.getTransport(e)??(r===e?void 0:t?.getTransport(r))}async function Yb(t){try{if(!this.mediaClient){t.id!==void 0&&this.sendResponse(t.id,{models:[]});return}let e=t.params,r=this.mediaClient.listMediaModels(e?.mediaType).map(n=>({id:n.modelInfo.id,name:n.modelInfo.name??n.modelInfo.id,provider:n.providerId,providerId:n.providerId,providerName:n.providerDef.name??n.providerId,modelId:n.modelInfo.id,modelName:n.modelInfo.name??n.modelInfo.id,mediaType:n.mediaType,capabilities:n.modelInfo}));t.id!==void 0&&this.sendResponse(t.id,{models:r})}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 Jb(t){let e=t.params;if(!e?.taskId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"taskId is required."});return}try{let r=zb(e),n=Xb(this.mediaClient,r),o=Vb(r);if(!n||!o||!jd(n)){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,message:"Media client does not support async cancel."});return}await n.deleteVideoTask(e.taskId,o),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(r){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,message:r instanceof Error?r.message:String(r)})}}async function Qb(t){let e=t.params;if(!e?.taskId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"taskId is required."});return}try{let r=zb(e),n=Xb(this.mediaClient,r),o=Vb(r);if(!n||!o||!jd(n)){t.id!==void 0&&this.sendResponse(t.id,{status:"unknown",message:"Media client does not support status queries."});return}let s=n.getTaskStatus?await n.getTaskStatus(e.taskId,o):await n.listVideoTasks(o,{limit:50});t.id!==void 0&&this.sendResponse(t.id,s)}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:r instanceof Error?r.message:String(r)})}}async function Zb(t){let e=t.params;if(!e?.audioBase64){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"audioBase64 is required."});return}let n=D().getActiveModel("stt");if(!n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"STT not configured. Add an STT model and bind it in settings."});return}let{apiKey:o,model:s,baseUrl:i,keyHandle:a}=n;if(!i){a.release({success:!1}),t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"STT baseUrl not configured. Set baseUrl on the STT model entry."});return}try{let c=`----STTBoundary${Date.now()}`,l=[];l.push(`--${c}\r
370
370
  Content-Disposition: form-data; name="model"\r
371
371
  \r
@@ -542,7 +542,7 @@ If no action needed, just respond with a progress update message to the user.`,e
542
542
  `)},onMcpToolCall:(a,c,l)=>this.handleMcpToolCall(a,c,l),sessionDir:tR.join(X(),"agent-logs")}),n=Jk({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-${rR().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)}
543
543
  `)}}},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 gn;for(let[a,c]of Object.entries(ho))o.register(a,c);let s=rb({registry:o,host:n,budget:{maxNodeExecutions:bj}});this.workflowController=new ur(e,s),this.workflowStore=e,this.workflowProcessManager=r,sb(this.workflowController);let i=new Ei({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}
544
544
  `),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)}
545
- `)})}return this.workflowController}function tr(t){return t.params??{}}function rr(t,e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:e})}function kj(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:kj(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 Rj(t){return t instanceof Error?t.message:String(t)}async function nR(t){let e=tr(t);if(!e.def)return rr.call(this,t,"workflow.create requires `def`");let r=Ft.call(this),n=String(e.id??`wf_${rR().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 oR(t){let e=tr(t);if(!e.id)return rr.call(this,t,"workflow.get requires `id`");let n=await Ft.call(this).get(String(e.id));t.id!==void 0&&this.sendResponse(t.id,n)}async function sR(t){let e=tr(t);if(!e.id)return rr.call(this,t,"workflow.describe requires `id`");let n=await Ft.call(this).describe(String(e.id));t.id!==void 0&&this.sendResponse(t.id,{rendered:n})}async function iR(t){let e=tr(t);if(!e.id||!e.patch)return rr.call(this,t,"workflow.patch requires `id` and `patch`");let r=Ft.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 aR(t){let e=tr(t);if(!e.id)return rr.call(this,t,"workflow.run requires `id`");let r=Ft.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:Rj(i)}),i}t.id!==void 0&&this.sendResponse(t.id,s)}async function cR(t){let e=tr(t);if(!e.id||typeof e.active!="boolean")return rr.call(this,t,"workflow.setActive requires `id` and boolean `active`");let n=await Ft.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 lR(t){Ft.call(this);let r=await this.workflowStore.list();t.id!==void 0&&this.sendResponse(t.id,{workflows:r})}async function dR(t){let e=tr(t);if(!e.id)return rr.call(this,t,"workflow.delete requires `id`");Ft.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 uR(t){let e=tr(t);if(!e.channel||typeof e.text!="string")return rr.call(this,t,"workflow.onImMessage requires `channel` and string `text`");Ft.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 pR(t){let e=tr(t);if(!e.path)return rr.call(this,t,"workflow.onWebhook requires `path`");Ft.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 Ao from"node:path";function Mi(t){let e=X(),r=De(t);xe.existsSync(r)||xe.mkdirSync(r,{recursive:!0});let n=Ao.join(e,"INSTRUCTIONS.md"),o=Ao.join(r,"INSTRUCTIONS.md");if(xe.existsSync(n)&&!xe.existsSync(o))try{xe.copyFileSync(n,o)}catch{}let s=Fm(),i=Qr(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=Ao.join(s,a),l=Ao.join(i,a);xe.statSync(c).isFile()&&xe.copyFileSync(c,l)}}catch{}}var Sj=["creating","running","completed","cancelled"];function mR(t){return typeof t=="string"&&Sj.includes(t)}function gR(t,e){let r=I(),n=e.workspaceDir||ju.join(r.getUserAgentHome(),"workspaces",e.name);if(e.groupId){let l=Ds(e.groupId);if(l)return{project:l,isAgentTeamProject:l.type==="solo"||l.type==="product",deduplicated:!0}}let s=z().find(l=>l.name===e.name);Tj(n);let i=_s({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||(xt(i.id),t.setActiveWorkdir(i.workspaceDir)),Mi(i.workspaceDir);let c=t.projectMemoryStoreFactory.create(i.workspaceDir);return c.ensureInitialized(),a||(t.memdir=c,t.mediaPersistence.setProjectDir(i.workspaceDir)),wj(i),{project:i,nameDuplicate:s,isAgentTeamProject:a}}function Tj(t){Hr.existsSync(t)||Hr.mkdirSync(t,{recursive:!0})}function wj(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 fR(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=gR(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 hR(t){let e=z();t.id!==void 0&&this.sendResponse(t.id,{projects:e})}function yR(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 vR(t){let e=z(),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=z().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=z().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 bR(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=Jf(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),Qf(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 kR(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=Zf(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 RR(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=eh(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 SR(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=th(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 TR(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&&!mR(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=Xf(e.projectId,r);t.id!==void 0&&this.sendResponse(t.id,{ok:n})}import{randomUUID as Uu}from"node:crypto";import*as Ve from"node:fs";import*as Br from"node:path";var gr=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 wR from"node:fs";import*as $u from"node:path";var fr=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=z();for(let o of n){let s=I().getProjectSessionsRoot(o.workspaceDir),i=$u.join(s,e);try{if(wR.existsSync(i))return o.workspaceDir}catch{}}return this.getActiveProjectWorkspaceDir()}getActiveProjectWorkspaceDir(){let e=ne();if(e)return e.workspaceDir;let r=z();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=z();if(r.length>0)return r[0].id;throw new Error("No active project available")}};import{randomUUID as AR}from"node:crypto";async function PR(t,e){let r=new Date(t.lastActiveAt).getTime();if(Date.now()-r<em)return{split:!1,activeSessionId:t.sessionId};let s=AR(),i=new Date().toISOString();await Fe(t.sessionId,{sealedAt:i},e);let a=t.taskSummary?`[\u4E0A\u4E00\u8F6E\u5BF9\u8BDD\u6458\u8981] ${t.taskSummary}`:void 0;return await Fe(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 xR(t,e){if(t.type!=="group")return{split:!1,activeSessionId:t.sessionId};if(t.turnCount<tm)return{split:!1,activeSessionId:t.sessionId};let r=AR(),n=new Date().toISOString();await Fe(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 Fe(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 CR from"node:fs";import*as IR from"node:path";var _i=class{constructor(e=new fr,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 kt(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=IR.join(this.pathService.getProjectSessionsRoot(o),Aj(r));try{if(CR.existsSync(s))return o}catch{}}return this.resolveWorkspaceDir(r)}};function Aj(t){return t.replace(/[^a-zA-Z0-9_-]/g,"_")}var Pj=new fr,tt=new _i(Pj);function ht(t,e="Unknown error"){return t instanceof Error?t.message:e}function kn(t,e,r){return tt.resolveSessionWorkspaceDir(t,e,r)}function ER(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 gr(r),this.sessionTaskDomain=void 0,this.memoryPrefetchState=bt(),this.enableIdleDream(),t.id!==void 0&&this.sendResponse(t.id,{id:r,title:e?.title,status:"active",createdAt:new Date().toISOString()})}async function MR(t){let e=t.params,r=e?.limit??20;try{let n=await tt.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: ${ht(n)}`})}}async function _R(t){let e=t.params,r=e?.sessionId??Uu();try{let n=e?.projectId??tt.getActiveProjectId(),o=tt.getProjectWorkspaceDir(n);await Fe(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: ${ht(n)}`})}}async function DR(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??tt.getActiveProjectId(),p=tt.getProjectWorkspaceDir(d),m=(await kt(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 Fe(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=z();for(let u of p){if(!u.workspaceDir)continue;let f=(await kt(500,u.workspaceDir)).find(g=>g.groupKey===d&&!g.sealedAt);if(f){let g=zt(f.sessionId,u.workspaceDir);if(g){let h=await PR(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=tt.getActiveProjectId(),c=tt.getProjectWorkspaceDir(a),l=o==="group"?`group:${r}:${n}`:void 0;await Fe(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: ${ht(i)}`})}}async function NR(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 kt(r*2,i),n=n.filter(a=>a.projectId===e.projectId);for(let a of n)a.projectId=e.projectId}else{let s=z(),i=new Set,a=[];for(let c of s){if(!c.workspaceDir)continue;let l=await kt(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: ${ht(n)}`})}}async function LR(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=kn(this,e.sessionId,e.projectId),o=(await kt(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: ${ht(r)}`})}}async function OR(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=kn(this,e.sessionId,e.projectId),n=await al(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: ${ht(r)}`})}}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=kn(this,e.sessionId,e.projectId),n=await Fe(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: ${ht(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=kn(this,e.sessionId,e.projectId);await cl(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: ${ht(r)}`})}}async function UR(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=tt.getProjectWorkspaceDir(e.projectId),n=(await kt(1e4,r)).filter(s=>s.projectId===e.projectId),o=0;for(let s of n)await cl(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: ${ht(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=kn(this,e.sessionId,e.projectId);await Fe(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: ${ht(r)}`})}}async function HR(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=kn(this,r,e?.projectId),o=await al(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: ${ht(n)}`})}}function BR(t){let e=this.currentSessionId||"default",r=this.sessionState?.createSnapshot(),n,o=this.getActiveProjectRoot();o&&(n=Br.join(ss(o),e));let s={sessionId:e,model:this.currentModel||void 0,cwd:process.cwd(),paths:{sessionDir:n,agentHome:X(),settings:Ue()},usage:r?{turnCount:r.turnCount,inputTokens:r.totalInputTokens,outputTokens:r.totalOutputTokens}:void 0};t.id!==void 0&&this.sendResponse(t.id,s)}function qR(t){let e=t.params,r=null;if(e?.projectId)r=Te(e.projectId);else if(e?.projectName){let s=z(),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(!Ve.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=xt(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 WR(t){let e=ne(),r=z();t.id!==void 0&&this.sendResponse(t.id,{sessionId:this.currentSessionId,activeProject:e,projects:r})}async function GR(t){let e=t.params,r=e?.sessionId;if(!r){t.id!==void 0&&this.sendResponse(t.id,{ok:!1});return}let n=z();for(let o of n)try{let s=tt.getProjectWorkspaceDir(o.id),i=await zt(r,s);if(i&&i.projectId===o.id){xt(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=tt.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 KR(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(tt.getProjectWorkspaceDir(n),".qlogicagent","sessions",r),c=Br.join(tt.getProjectWorkspaceDir(o),".qlogicagent","sessions",r);if(!Ve.existsSync(a)){t.id!==void 0&&this.sendError(t.id,y.INVALID_PARAMS,`Session ${r} not found in project ${n}`);return}try{Ve.mkdirSync(Br.dirname(c),{recursive:!0}),Ve.cpSync(a,c,{recursive:!0});let l=Br.join(c,"metadata.json");if(Ve.existsSync(l)){let d=JSON.parse(Ve.readFileSync(l,"utf-8"));d.projectId=o,Ve.writeFileSync(l,JSON.stringify(d,null,2))}Ve.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=ht(l);this.log(`[session.moveToProject] error: ${d}`),t.id!==void 0&&this.sendError(t.id,y.INTERNAL_ERROR,`Move failed: ${d}`)}}He();function xj(t){return t.length<=8?"****":`${t.slice(0,3)}***${t.slice(-4)}`}function Ne(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 Hu(t,e){Ne(t,e,us)}function Cj(t){let e={};for(let r of t)for(let n of r.purposes)e[n]??=[],e[n].push(r);return e}async function Ij(){let t=D(),e=await Vn(t);return t.save(),e}async function zR(t){try{return await Ij(),!0}catch(e){if(t)throw e;return!1}}function Bu(t=D()){try{return og()}catch{return t.getKnownProviderDef(Y)?.baseUrl??"https://www.qlogicagent.com"}}function qu(t){return t.id===Y?Y:t.group?.trim()||t.id}function Ej(t){return t.id===qu(t)}function VR(t){let e=qu(t);return ml({...t,id:e})}function Mj(t){return{volcengine:"\u5E38\u89C4 Ark API Key","volcengine-plan":"\u8BA2\u9605 / Plan \u901A\u9053",qwen:"\u5E38\u89C4 DashScope API Key","qwen-coding":"Coding Plan \u901A\u9053",zhipu:"Anthropic \u901A\u9053","zhipu-openai":"OpenAI \u517C\u5BB9\u901A\u9053","zhipu-coding":"Coding \u901A\u9053"}[t.id]??ml(t)}function _j(t){return t.authType==="none"?!1:t.apiKeyEnvVars===void 0||t.apiKeyEnvVars.length>0}function Dj(t){return{id:t.id,displayName:Mj(t),baseUrl:en(t)??"",modelCount:t.models?.length??0}}function Nj(t){let e=new Map;for(let r of t){if(!_j(r))continue;let n=qu(r);if(n===Y)continue;let o=r.models?.length??0,s=Dj(r),i=e.get(n);if(!i){e.set(n,{id:n,displayName:VR(r),baseUrl:en(r)??"",modelCount:o,variants:[s]});continue}i.modelCount+=o,i.variants??=[],i.variants.some(a=>a.id===s.id)||i.variants.push(s),Ej(r)&&(i.displayName=VR(r),i.baseUrl=en(r)??i.baseUrl)}return Array.from(e.values()).map(r=>({...r,variants:r.variants&&r.variants.length>1?r.variants:void 0}))}async function XR(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??Bu(e);try{if((await fl(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 YR(t=!1){let e=D();if(!!e.getProviderStatus(Y)?.keys.length)return await XR(!1)?!0:zR(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:zR(t)}function Lj(t){return t.defaultModel??t.models?.find(e=>!!e.id)?.id}function Oj(t){return[...new Set(t)]}function jj(t){let e=t.replace(/\/+$/,"");return Oj([`${e}/models`,/\/v\d+$/.test(e)?`${e}/models`:`${e}/v1/models`])}function $j(t){return t===404||t===405||t===410||t===501}async function Uj(t){let e=D().getKnownProviderDef(t);if(e)return e;let r=await gl(t).catch(()=>null);if(r)return{id:r.id,transport:r.transport,baseUrl:en(r),authType:r.authType,models:r.models}}function Fu(t){return{accept:"application/json",Authorization:`Bearer ${t}`}}function Fj(t,e,r,n){if(t===Y)return[{method:"GET",url:ul(r),headers:Fu(e)}];let o=r.replace(/\/+$/,""),s=n?.transport,i=Lj(n??{id:t}),a=[];if(s==="anthropic-messages")return/\/anthropic$/.test(o)&&a.push({method:"GET",url:`${o.replace(/\/anthropic$/,"")}/models`,headers:Fu(e)}),i&&a.push({method:"POST",url:`${o}/v1/messages`,headers:{"Content-Type":"application/json","x-api-key":e,"anthropic-version":"2023-06-01"},body:{model:i,messages:[{role:"user",content:"ping"}],max_tokens:1,stream:!1}}),a;if(s==="gemini-generatecontent")return i?[{method:"POST",url:`${o}/models/${encodeURIComponent(i)}:generateContent`,headers:{"Content-Type":"application/json","x-goog-api-key":e},body:{contents:[{role:"user",parts:[{text:"ping"}]}],generationConfig:{maxOutputTokens:1}}}]:a;if(s==="volcengine-responses")return i?[{method:"POST",url:`${o.replace(/\/v\d+$/,"")}/v3/responses`,headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:{model:i,input:[{role:"user",content:[{type:"input_text",text:"ping"}]}],max_output_tokens:1,stream:!1,store:!1}}]:a;for(let c of jj(o))a.push({method:"GET",url:c,headers:Fu(e)});return a}async function Hj(t){try{let e=await fetch(t.url,{method:t.method,headers:t.headers,body:t.body?JSON.stringify(t.body):void 0,signal:AbortSignal.timeout(1e4)});if(e.ok)return{valid:!0,status:e.status,url:t.url};let r=await e.text().catch(()=>"");return{valid:!1,status:e.status,error:r.slice(0,500),url:t.url}}catch(e){return{valid:!1,status:0,error:e instanceof Error?e.message:String(e),url:t.url}}}async function JR(t,e,r){let n=await Uj(t),o=Fj(t,e,r,n);if(o.length===0)return{valid:!1,status:0,error:`No validation probe is available for provider "${t}".`};let s;for(let i of o){let a=await Hj(i);if(a.valid)return a;if($j(a.status)){s=a;continue}return a}return s??{valid:!1,status:0,error:`No validation probe succeeded for provider "${t}".`}}async function Bj(t,e,r){let n=await JR(t,e,r);if(!n.valid){let o=n.error?`: ${n.error}`:"";throw new Error(`API Key validation failed (${n.status})${o}`)}}async function QR(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 pl().catch(()=>[]),o=Nj(n);o.unshift({id:Y,displayName:dl,baseUrl:Bu(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){Ne(this,t,e instanceof Error?e.message:String(e))}}async function ZR(t){let e=t.params;if(!e?.providerId||!e?.key){Ne(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){Ne(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){if((await fl(s,{baseUrl:c,apiKey:n})).length===0)throw new Error("LLMRouter did not return any available models for this API Key.")}else await Bj(r,n,c);for(let d of zn)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:us;Ne(this,t,l)}}function eS(t){let e=t.params;if(!e?.keyId){Ne(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 tS(t){let e=t.params;if(!e?.keyId){Ne(this,t,"Required: keyId (string)",y.INVALID_PARAMS);return}let r=D().getKeyById(e.keyId);if(!r){Ne(this,t,"API Key not found",y.INVALID_PARAMS);return}t.id!==void 0&&this.sendResponse(t.id,{key:r})}function rS(t){let e=t.params;if(!e?.keyId||typeof e.enabled!="boolean"){Ne(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"){Ne(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 YR(!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:Cj(o),configuredProviderIds:[...n]})}catch{Hu(this,t)}}function sS(t){let e=t.params;if(!e?.purpose||!e?.modelId){Ne(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){Ne(this,t,r instanceof Error?r.message:String(r),y.INVALID_PARAMS)}}function iS(t){let e=t.params;if(!e?.purpose){Ne(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 YR(!1);let e=D(),r=e.getAllProviderStatus().map(s=>({providerId:s.providerId,displayName:s.providerId===Y?dl: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:xj(i.key),enabled:i.enabled,health:i.healthStatus}))})),n=e.getAllBindings(),o={};for(let s of zn){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{Hu(this,t)}}async function cS(t){try{let e=D();e.load(),await XR(!1)||await Vn(e),e.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,catalogRefreshed:!0})}catch{Hu(this,t)}}async function lS(t){let e=t.params;if(!e?.providerId||!e?.apiKey){Ne(this,t,"providerId and apiKey required",y.INVALID_PARAMS);return}try{let r=e.baseUrl||await dS(e.providerId);if(!r){Ne(this,t,`Unknown provider: ${e.providerId}`,y.INVALID_PARAMS);return}let n=await JR(e.providerId,e.apiKey,r);t.id!==void 0&&this.sendResponse(t.id,n)}catch(r){let n=r instanceof Error?r.message:String(r);t.id!==void 0&&this.sendResponse(t.id,{valid:!1,status:0,error:n})}}async function dS(t){if(t===Y)return Bu();let e=D().getKnownProviderDef(t);if(e?.baseUrl)return e.baseUrl;let r=await gl(t);return r?en(r):void 0}G();import*as ce from"node:fs";import*as Le from"node:path";import{join as qj}from"node:path";import{readFileSync as Wj,writeFileSync as Gj,mkdirSync as Kj}from"node:fs";var qr=null,Wu=!1;function uS(t){return qj(t,"skill-stats.json")}function Gu(t){if(qr)return qr;try{qr=JSON.parse(Wj(uS(t),"utf8"))}catch{qr={}}return qr}function zj(t){if(!(!Wu||!qr))try{Kj(t,{recursive:!0}),Gj(uS(t),JSON.stringify(qr,null,2),"utf8"),Wu=!1}catch{}}function Ku(t,e,r){let n=Gu(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),Wu=!0,zj(t)}function pS(t,e){return Gu(t)[e]}function mS(t){return Gu(t)}import*as Ht from"node:fs";import*as Di from"node:path";function Vj(t){try{let e=Ht.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(Ht.existsSync(e))for(let n of Ht.readdirSync(e)){let o=Di.join(e,n);try{if(!Ht.statSync(o).isDirectory())continue}catch{continue}let s=Di.join(o,"SKILL.md"),i=Di.join(o,"SKILL.md.disabled"),a=Ht.existsSync(s)?s:null;if(!a&&!Ht.existsSync(i))continue;let c=a?Vj(a):{};t.push({id:`${r}:${n}`,name:n,path:o,active:!!a,scope:r,category:"automation",displayName:Xj(n),displayDescription:Yj(n,c.description),fallbackName:n,fallbackDescription:c.description??"",systemGenerated:Jj(n),version:c.version,description:c.description})}}function Xj(t){return{key:`capability.skill.${t}.name`,fallback:t}}function Yj(t,e){return{key:`capability.skill.${t}.description`,fallback:e??""}}function Jj(t){return t.startsWith("auto-skill-")||t.startsWith("test-skill-")}function Qj(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=Le.join(o,r),i=Le.join(s,"SKILL.md.disabled"),a=Le.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=Ct(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=Le.join(o,r),i=Le.join(s,"SKILL.md"),a=Le.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=Le.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=Le.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}),mt(),js(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=Le.join(o,r),i=Le.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=Le.join(a,r);try{ce.mkdirSync(c,{recursive:!0});let l=ce.readdirSync(s);for(let d of l){let p=ce.readFileSync(Le.join(s,d));ce.writeFileSync(Le.join(c,d),p)}e?.keepLocal||ce.rmSync(s,{recursive:!0,force:!0}),mt(),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);Ct(n,e.name),lh(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);dh(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?Le.join(r,".qlogicagent","skills"):sr(),o=uh(e,n);o.transitioned.length>0&&mt(),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(!Qj(e.state)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Invalid skill lifecycle state"});return}let o=ph(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 o$}from"node:crypto";import{join as zu}from"node:path";import{mkdir as Zj,readdir as e$}from"node:fs/promises";function t$(t){return t?.pathService??I()}function r$(t,e){return t??e.getActiveProjectRoot()}function PS(t,e){let r=t$(e);return zu(r.getProjectAgentDir(r$(t,r)),"solos")}function Vu(t,e,r){return zu(PS(e,r),t)}function xS(t,e,r){return zu(Vu(t,e,r),"solo-state.json")}async function CS(t,e,r){let n=Vu(t.soloId,e,r);await Zj(n,{recursive:!0}),await pr(xS(t.soloId,e,r),t)}async function n$(t,e,r){return Qt(xS(t,e,r))}async function IS(t,e){let r=PS(t,e),n;try{n=await e$(r)}catch{return[]}let o=[];for(let s of n){let i=await n$(s,t,e);i&&o.push(i)}return o}async function Xu(t,e,r){let{rm:n}=await import("node:fs/promises"),o=Vu(t,e,r);try{return await n(o,{recursive:!0,force:!0}),!0}catch{return!1}}var Ni=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),Xu(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 wo(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>
545
+ `)})}return this.workflowController}function tr(t){return t.params??{}}function rr(t,e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:e})}function kj(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:kj(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 Rj(t){return t instanceof Error?t.message:String(t)}async function nR(t){let e=tr(t);if(!e.def)return rr.call(this,t,"workflow.create requires `def`");let r=Ft.call(this),n=String(e.id??`wf_${rR().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 oR(t){let e=tr(t);if(!e.id)return rr.call(this,t,"workflow.get requires `id`");let n=await Ft.call(this).get(String(e.id));t.id!==void 0&&this.sendResponse(t.id,n)}async function sR(t){let e=tr(t);if(!e.id)return rr.call(this,t,"workflow.describe requires `id`");let n=await Ft.call(this).describe(String(e.id));t.id!==void 0&&this.sendResponse(t.id,{rendered:n})}async function iR(t){let e=tr(t);if(!e.id||!e.patch)return rr.call(this,t,"workflow.patch requires `id` and `patch`");let r=Ft.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 aR(t){let e=tr(t);if(!e.id)return rr.call(this,t,"workflow.run requires `id`");let r=Ft.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:Rj(i)}),i}t.id!==void 0&&this.sendResponse(t.id,s)}async function cR(t){let e=tr(t);if(!e.id||typeof e.active!="boolean")return rr.call(this,t,"workflow.setActive requires `id` and boolean `active`");let n=await Ft.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 lR(t){Ft.call(this);let r=await this.workflowStore.list();t.id!==void 0&&this.sendResponse(t.id,{workflows:r})}async function dR(t){let e=tr(t);if(!e.id)return rr.call(this,t,"workflow.delete requires `id`");Ft.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 uR(t){let e=tr(t);if(!e.channel||typeof e.text!="string")return rr.call(this,t,"workflow.onImMessage requires `channel` and string `text`");Ft.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 pR(t){let e=tr(t);if(!e.path)return rr.call(this,t,"workflow.onWebhook requires `path`");Ft.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 Ie 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 Ce from"node:fs";import*as Ao from"node:path";function Mi(t){let e=X(),r=Ne(t);Ce.existsSync(r)||Ce.mkdirSync(r,{recursive:!0});let n=Ao.join(e,"INSTRUCTIONS.md"),o=Ao.join(r,"INSTRUCTIONS.md");if(Ce.existsSync(n)&&!Ce.existsSync(o))try{Ce.copyFileSync(n,o)}catch{}let s=Fm(),i=Qr(t);if(Ce.existsSync(s)&&!Ce.existsSync(i))try{Ce.mkdirSync(i,{recursive:!0});for(let a of Ce.readdirSync(s)){if(!a.endsWith(".md"))continue;let c=Ao.join(s,a),l=Ao.join(i,a);Ce.statSync(c).isFile()&&Ce.copyFileSync(c,l)}}catch{}}var Sj=["creating","running","completed","cancelled"];function mR(t){return typeof t=="string"&&Sj.includes(t)}function gR(t,e){let r=I(),n=e.workspaceDir||ju.join(r.getUserAgentHome(),"workspaces",e.name);if(e.groupId){let l=Ds(e.groupId);if(l)return{project:l,isAgentTeamProject:l.type==="solo"||l.type==="product",deduplicated:!0}}let s=z().find(l=>l.name===e.name);Tj(n);let i=_s({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||(xt(i.id),t.setActiveWorkdir(i.workspaceDir)),Mi(i.workspaceDir);let c=t.projectMemoryStoreFactory.create(i.workspaceDir);return c.ensureInitialized(),a||(t.memdir=c,t.mediaPersistence.setProjectDir(i.workspaceDir)),wj(i),{project:i,nameDuplicate:s,isAgentTeamProject:a}}function Tj(t){Hr.existsSync(t)||Hr.mkdirSync(t,{recursive:!0})}function wj(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 fR(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=gR(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 hR(t){let e=z();t.id!==void 0&&this.sendResponse(t.id,{projects:e})}function yR(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=we(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{Ie.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 vR(t){let e=z(),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{Ie.existsSync(c)&&Ie.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(Ie.existsSync(r)){let a=z().find(d=>d.type==="default"),c=new Set;a?.workspaceDir&&c.add(me.resolve(a.workspaceDir));let l=d=>{try{let p=Ie.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{Ie.readdirSync(m).length===0&&Ie.rmdirSync(m)}catch{}continue}try{Ie.rmSync(m,{recursive:!0,force:!0})}catch(f){s.push(`orphan:${u.name}: ${f.message??f}`)}}}}catch{}};l(r)}let i=z().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 bR(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=Jf(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(Ie.existsSync(o)&&!Ie.existsSync(s))try{Ie.renameSync(o,s),Qf(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 kR(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=Zf(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 RR(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=eh(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 SR(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=th(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 TR(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&&!mR(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=Xf(e.projectId,r);t.id!==void 0&&this.sendResponse(t.id,{ok:n})}import{randomUUID as Uu}from"node:crypto";import*as Ve from"node:fs";import*as Br from"node:path";var gr=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 wR from"node:fs";import*as $u from"node:path";var fr=class{getSessionsRoot(e){let r=we(e);if(!r)throw new Error(`Project not found: ${e}`);return I().getProjectSessionsRoot(r.workspaceDir)}getProjectWorkspaceDir(e){let r=we(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=z();for(let o of n){let s=I().getProjectSessionsRoot(o.workspaceDir),i=$u.join(s,e);try{if(wR.existsSync(i))return o.workspaceDir}catch{}}return this.getActiveProjectWorkspaceDir()}getActiveProjectWorkspaceDir(){let e=ne();if(e)return e.workspaceDir;let r=z();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=z();if(r.length>0)return r[0].id;throw new Error("No active project available")}};import{randomUUID as AR}from"node:crypto";async function PR(t,e){let r=new Date(t.lastActiveAt).getTime();if(Date.now()-r<em)return{split:!1,activeSessionId:t.sessionId};let s=AR(),i=new Date().toISOString();await Fe(t.sessionId,{sealedAt:i},e);let a=t.taskSummary?`[\u4E0A\u4E00\u8F6E\u5BF9\u8BDD\u6458\u8981] ${t.taskSummary}`:void 0;return await Fe(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 xR(t,e){if(t.type!=="group")return{split:!1,activeSessionId:t.sessionId};if(t.turnCount<tm)return{split:!1,activeSessionId:t.sessionId};let r=AR(),n=new Date().toISOString();await Fe(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 Fe(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 CR from"node:fs";import*as IR from"node:path";var _i=class{constructor(e=new fr,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 kt(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=IR.join(this.pathService.getProjectSessionsRoot(o),Aj(r));try{if(CR.existsSync(s))return o}catch{}}return this.resolveWorkspaceDir(r)}};function Aj(t){return t.replace(/[^a-zA-Z0-9_-]/g,"_")}var Pj=new fr,tt=new _i(Pj);function ht(t,e="Unknown error"){return t instanceof Error?t.message:e}function kn(t,e,r){return tt.resolveSessionWorkspaceDir(t,e,r)}function ER(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 gr(r),this.sessionTaskDomain=void 0,this.memoryPrefetchState=bt(),this.enableIdleDream(),t.id!==void 0&&this.sendResponse(t.id,{id:r,title:e?.title,status:"active",createdAt:new Date().toISOString()})}async function MR(t){let e=t.params,r=e?.limit??20;try{let n=await tt.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: ${ht(n)}`})}}async function _R(t){let e=t.params,r=e?.sessionId??Uu();try{let n=e?.projectId??tt.getActiveProjectId(),o=tt.getProjectWorkspaceDir(n);await Fe(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: ${ht(n)}`})}}async function DR(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??tt.getActiveProjectId(),p=tt.getProjectWorkspaceDir(d),m=(await kt(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 Fe(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=z();for(let u of p){if(!u.workspaceDir)continue;let f=(await kt(500,u.workspaceDir)).find(g=>g.groupKey===d&&!g.sealedAt);if(f){let g=zt(f.sessionId,u.workspaceDir);if(g){let h=await PR(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=tt.getActiveProjectId(),c=tt.getProjectWorkspaceDir(a),l=o==="group"?`group:${r}:${n}`:void 0;await Fe(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: ${ht(i)}`})}}async function NR(t){let e=t.params,r=e?.limit??50;try{let n;if(e?.projectId){let s=we(e.projectId);if(!s){t.id!==void 0&&this.sendResponse(t.id,{sessions:[]});return}let i=s.workspaceDir;n=await kt(r*2,i),n=n.filter(a=>a.projectId===e.projectId);for(let a of n)a.projectId=e.projectId}else{let s=z(),i=new Set,a=[];for(let c of s){if(!c.workspaceDir)continue;let l=await kt(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: ${ht(n)}`})}}async function LR(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=kn(this,e.sessionId,e.projectId),o=(await kt(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: ${ht(r)}`})}}async function OR(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=kn(this,e.sessionId,e.projectId),n=await al(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: ${ht(r)}`})}}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=kn(this,e.sessionId,e.projectId),n=await Fe(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: ${ht(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=kn(this,e.sessionId,e.projectId);await cl(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: ${ht(r)}`})}}async function UR(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=tt.getProjectWorkspaceDir(e.projectId),n=(await kt(1e4,r)).filter(s=>s.projectId===e.projectId),o=0;for(let s of n)await cl(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: ${ht(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=kn(this,e.sessionId,e.projectId);await Fe(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: ${ht(r)}`})}}async function HR(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=kn(this,r,e?.projectId),o=await al(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: ${ht(n)}`})}}function BR(t){let e=this.currentSessionId||"default",r=this.sessionState?.createSnapshot(),n,o=this.getActiveProjectRoot();o&&(n=Br.join(ss(o),e));let s={sessionId:e,model:this.currentModel||void 0,cwd:process.cwd(),paths:{sessionDir:n,agentHome:X(),settings:Ue()},usage:r?{turnCount:r.turnCount,inputTokens:r.totalInputTokens,outputTokens:r.totalOutputTokens}:void 0};t.id!==void 0&&this.sendResponse(t.id,s)}function qR(t){let e=t.params,r=null;if(e?.projectId)r=we(e.projectId);else if(e?.projectName){let s=z(),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(!Ve.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=xt(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 WR(t){let e=ne(),r=z();t.id!==void 0&&this.sendResponse(t.id,{sessionId:this.currentSessionId,activeProject:e,projects:r})}async function GR(t){let e=t.params,r=e?.sessionId;if(!r){t.id!==void 0&&this.sendResponse(t.id,{ok:!1});return}let n=z();for(let o of n)try{let s=tt.getProjectWorkspaceDir(o.id),i=await zt(r,s);if(i&&i.projectId===o.id){xt(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=tt.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 KR(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=we(n),i=we(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(tt.getProjectWorkspaceDir(n),".qlogicagent","sessions",r),c=Br.join(tt.getProjectWorkspaceDir(o),".qlogicagent","sessions",r);if(!Ve.existsSync(a)){t.id!==void 0&&this.sendError(t.id,y.INVALID_PARAMS,`Session ${r} not found in project ${n}`);return}try{Ve.mkdirSync(Br.dirname(c),{recursive:!0}),Ve.cpSync(a,c,{recursive:!0});let l=Br.join(c,"metadata.json");if(Ve.existsSync(l)){let d=JSON.parse(Ve.readFileSync(l,"utf-8"));d.projectId=o,Ve.writeFileSync(l,JSON.stringify(d,null,2))}Ve.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=ht(l);this.log(`[session.moveToProject] error: ${d}`),t.id!==void 0&&this.sendError(t.id,y.INTERNAL_ERROR,`Move failed: ${d}`)}}He();function xj(t){return t.length<=8?"****":`${t.slice(0,3)}***${t.slice(-4)}`}function Re(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 Hu(t,e){Re(t,e,us)}function Cj(t){let e={};for(let r of t)for(let n of r.purposes)e[n]??=[],e[n].push(r);return e}async function Ij(){let t=D(),e=await Vn(t);return t.save(),e}async function zR(t){try{return await Ij(),!0}catch(e){if(t)throw e;return!1}}function Bu(t=D()){try{return og()}catch{return t.getKnownProviderDef(Y)?.baseUrl??"https://www.qlogicagent.com"}}function qu(t){return t.id===Y?Y:t.group?.trim()||t.id}function Ej(t){return t.id===qu(t)}function VR(t){let e=qu(t);return ml({...t,id:e})}function Mj(t){return{volcengine:"\u5E38\u89C4 Ark API Key","volcengine-plan":"\u8BA2\u9605 / Plan \u901A\u9053",qwen:"\u5E38\u89C4 DashScope API Key","qwen-coding":"Coding Plan \u901A\u9053",zhipu:"Anthropic \u901A\u9053","zhipu-openai":"OpenAI \u517C\u5BB9\u901A\u9053","zhipu-coding":"Coding \u901A\u9053"}[t.id]??ml(t)}function _j(t){return t.authType==="none"?!1:t.apiKeyEnvVars===void 0||t.apiKeyEnvVars.length>0}function Dj(t){return{id:t.id,displayName:Mj(t),baseUrl:en(t)??"",modelCount:t.models?.length??0}}function Nj(t){let e=new Map;for(let r of t){if(!_j(r))continue;let n=qu(r);if(n===Y)continue;let o=r.models?.length??0,s=Dj(r),i=e.get(n);if(!i){e.set(n,{id:n,displayName:VR(r),baseUrl:en(r)??"",modelCount:o,variants:[s]});continue}i.modelCount+=o,i.variants??=[],i.variants.some(a=>a.id===s.id)||i.variants.push(s),Ej(r)&&(i.displayName=VR(r),i.baseUrl=en(r)??i.baseUrl)}return Array.from(e.values()).map(r=>({...r,variants:r.variants&&r.variants.length>1?r.variants:void 0}))}async function XR(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??Bu(e);try{if((await fl(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 YR(t=!1){let e=D();if(!!e.getProviderStatus(Y)?.keys.length)return await XR(!1)?!0:zR(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:zR(t)}function Lj(t){return t.defaultModel??t.models?.find(e=>!!e.id)?.id}function Oj(t){return[...new Set(t)]}function jj(t){let e=t.replace(/\/+$/,"");return Oj([`${e}/models`,/\/v\d+$/.test(e)?`${e}/models`:`${e}/v1/models`])}function $j(t){return t===404||t===405||t===410||t===501}async function Uj(t){let e=D().getKnownProviderDef(t);if(e)return e;let r=await gl(t).catch(()=>null);if(r)return{id:r.id,transport:r.transport,baseUrl:en(r),authType:r.authType,models:r.models}}function Fu(t){return{accept:"application/json",Authorization:`Bearer ${t}`}}function Fj(t,e,r,n){if(t===Y)return[{method:"GET",url:ul(r),headers:Fu(e)}];let o=r.replace(/\/+$/,""),s=n?.transport,i=Lj(n??{id:t}),a=[];if(s==="anthropic-messages")return/\/anthropic$/.test(o)&&a.push({method:"GET",url:`${o.replace(/\/anthropic$/,"")}/models`,headers:Fu(e)}),i&&a.push({method:"POST",url:`${o}/v1/messages`,headers:{"Content-Type":"application/json","x-api-key":e,"anthropic-version":"2023-06-01"},body:{model:i,messages:[{role:"user",content:"ping"}],max_tokens:1,stream:!1}}),a;if(s==="gemini-generatecontent")return i?[{method:"POST",url:`${o}/models/${encodeURIComponent(i)}:generateContent`,headers:{"Content-Type":"application/json","x-goog-api-key":e},body:{contents:[{role:"user",parts:[{text:"ping"}]}],generationConfig:{maxOutputTokens:1}}}]:a;if(s==="volcengine-responses")return i?[{method:"POST",url:`${o.replace(/\/v\d+$/,"")}/v3/responses`,headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:{model:i,input:[{role:"user",content:[{type:"input_text",text:"ping"}]}],max_output_tokens:1,stream:!1,store:!1}}]:a;for(let c of jj(o))a.push({method:"GET",url:c,headers:Fu(e)});return a}async function Hj(t){try{let e=await fetch(t.url,{method:t.method,headers:t.headers,body:t.body?JSON.stringify(t.body):void 0,signal:AbortSignal.timeout(1e4)});if(e.ok)return{valid:!0,status:e.status,url:t.url};let r=await e.text().catch(()=>"");return{valid:!1,status:e.status,error:r.slice(0,500),url:t.url}}catch(e){return{valid:!1,status:0,error:e instanceof Error?e.message:String(e),url:t.url}}}async function JR(t,e,r){let n=await Uj(t),o=Fj(t,e,r,n);if(o.length===0)return{valid:!1,status:0,error:`No validation probe is available for provider "${t}".`};let s;for(let i of o){let a=await Hj(i);if(a.valid)return a;if($j(a.status)){s=a;continue}return a}return s??{valid:!1,status:0,error:`No validation probe succeeded for provider "${t}".`}}async function Bj(t,e,r){let n=await JR(t,e,r);if(!n.valid){let o=n.error?`: ${n.error}`:"";throw new Error(`API Key validation failed (${n.status})${o}`)}}async function QR(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 pl().catch(()=>[]),o=Nj(n);o.unshift({id:Y,displayName:dl,baseUrl:Bu(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){Re(this,t,e instanceof Error?e.message:String(e))}}async function ZR(t){let e=t.params;if(!e?.providerId||!e?.key){Re(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){Re(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){if((await fl(s,{baseUrl:c,apiKey:n})).length===0)throw new Error("LLMRouter did not return any available models for this API Key.")}else await Bj(r,n,c);for(let d of zn)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:us;Re(this,t,l)}}function eS(t){let e=t.params;if(!e?.keyId){Re(this,t,"Required: keyId (string)",y.INVALID_PARAMS);return}let r=D();if(!r.removeKey(e.keyId)){Re(this,t,"API Key not found",y.INVALID_PARAMS);return}r.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}function tS(t){let e=t.params;if(!e?.keyId){Re(this,t,"Required: keyId (string)",y.INVALID_PARAMS);return}let r=D().getKeyById(e.keyId);if(!r){Re(this,t,"API Key not found",y.INVALID_PARAMS);return}t.id!==void 0&&this.sendResponse(t.id,{key:r})}function rS(t){let e=t.params;if(!e?.keyId||typeof e.enabled!="boolean"){Re(this,t,"Required: keyId (string), enabled (boolean)",y.INVALID_PARAMS);return}let r=D();if(!r.updateKey(e.keyId,{enabled:e.enabled})){Re(this,t,"API Key not found",y.INVALID_PARAMS);return}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"){Re(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 YR(!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:Cj(o),configuredProviderIds:[...n]})}catch{Hu(this,t)}}function sS(t){let e=t.params;if(!e?.purpose||!e?.modelId){Re(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){Re(this,t,r instanceof Error?r.message:String(r),y.INVALID_PARAMS)}}function iS(t){let e=t.params;if(!e?.purpose){Re(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 YR(!1);let e=D(),r=e.getAllProviderStatus().map(s=>({providerId:s.providerId,displayName:s.providerId===Y?dl: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:xj(i.key),enabled:i.enabled,health:i.healthStatus}))})),n=e.getAllBindings(),o={};for(let s of zn){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{Hu(this,t)}}async function cS(t){try{let e=D();e.load(),await XR(!1)||await Vn(e),e.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,catalogRefreshed:!0})}catch{Hu(this,t)}}async function lS(t){let e=t.params;if(!e?.providerId||!e?.apiKey){Re(this,t,"providerId and apiKey required",y.INVALID_PARAMS);return}try{let r=e.baseUrl||await dS(e.providerId);if(!r){Re(this,t,`Unknown provider: ${e.providerId}`,y.INVALID_PARAMS);return}let n=await JR(e.providerId,e.apiKey,r);t.id!==void 0&&this.sendResponse(t.id,n)}catch(r){let n=r instanceof Error?r.message:String(r);t.id!==void 0&&this.sendResponse(t.id,{valid:!1,status:0,error:n})}}async function dS(t){if(t===Y)return Bu();let e=D().getKnownProviderDef(t);if(e?.baseUrl)return e.baseUrl;let r=await gl(t);return r?en(r):void 0}G();import*as ce from"node:fs";import*as Le from"node:path";import{join as qj}from"node:path";import{readFileSync as Wj,writeFileSync as Gj,mkdirSync as Kj}from"node:fs";var qr=null,Wu=!1;function uS(t){return qj(t,"skill-stats.json")}function Gu(t){if(qr)return qr;try{qr=JSON.parse(Wj(uS(t),"utf8"))}catch{qr={}}return qr}function zj(t){if(!(!Wu||!qr))try{Kj(t,{recursive:!0}),Gj(uS(t),JSON.stringify(qr,null,2),"utf8"),Wu=!1}catch{}}function Ku(t,e,r){let n=Gu(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),Wu=!0,zj(t)}function pS(t,e){return Gu(t)[e]}function mS(t){return Gu(t)}import*as Ht from"node:fs";import*as Di from"node:path";function Vj(t){try{let e=Ht.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(Ht.existsSync(e))for(let n of Ht.readdirSync(e)){let o=Di.join(e,n);try{if(!Ht.statSync(o).isDirectory())continue}catch{continue}let s=Di.join(o,"SKILL.md"),i=Di.join(o,"SKILL.md.disabled"),a=Ht.existsSync(s)?s:null;if(!a&&!Ht.existsSync(i))continue;let c=a?Vj(a):{};t.push({id:`${r}:${n}`,name:n,path:o,active:!!a,scope:r,category:"automation",displayName:Xj(n),displayDescription:Yj(n,c.description),fallbackName:n,fallbackDescription:c.description??"",systemGenerated:Jj(n),version:c.version,description:c.description})}}function Xj(t){return{key:`capability.skill.${t}.name`,fallback:t}}function Yj(t,e){return{key:`capability.skill.${t}.description`,fallback:e??""}}function Jj(t){return t.startsWith("auto-skill-")||t.startsWith("test-skill-")}function Qj(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=Le.join(o,r),i=Le.join(s,"SKILL.md.disabled"),a=Le.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=Ct(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=Le.join(o,r),i=Le.join(s,"SKILL.md"),a=Le.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=Le.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=Le.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}),mt(),js(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=Le.join(o,r),i=Le.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=Le.join(a,r);try{ce.mkdirSync(c,{recursive:!0});let l=ce.readdirSync(s);for(let d of l){let p=ce.readFileSync(Le.join(s,d));ce.writeFileSync(Le.join(c,d),p)}e?.keepLocal||ce.rmSync(s,{recursive:!0,force:!0}),mt(),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);Ct(n,e.name),lh(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);dh(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?Le.join(r,".qlogicagent","skills"):sr(),o=uh(e,n);o.transitioned.length>0&&mt(),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(!Qj(e.state)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Invalid skill lifecycle state"});return}let o=ph(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 o$}from"node:crypto";import{join as zu}from"node:path";import{mkdir as Zj,readdir as e$}from"node:fs/promises";function t$(t){return t?.pathService??I()}function r$(t,e){return t??e.getActiveProjectRoot()}function PS(t,e){let r=t$(e);return zu(r.getProjectAgentDir(r$(t,r)),"solos")}function Vu(t,e,r){return zu(PS(e,r),t)}function xS(t,e,r){return zu(Vu(t,e,r),"solo-state.json")}async function CS(t,e,r){let n=Vu(t.soloId,e,r);await Zj(n,{recursive:!0}),await pr(xS(t.soloId,e,r),t)}async function n$(t,e,r){return Qt(xS(t,e,r))}async function IS(t,e){let r=PS(t,e),n;try{n=await e$(r)}catch{return[]}let o=[];for(let s of n){let i=await n$(s,t,e);i&&o.push(i)}return o}async function Xu(t,e,r){let{rm:n}=await import("node:fs/promises"),o=Vu(t,e,r);try{return await n(o,{recursive:!0,force:!0}),!0}catch{return!1}}var Ni=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),Xu(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 wo(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
546
  ${s.rules.join(`
547
547
  `)}
548
548
  </rules>`),s.memory?.length&&u.push(`<memory>
@@ -600,7 +600,7 @@ The fast classifier flagged this action. Review carefullyis it actually dangerou
600
600
  Arguments: ${n}`}function GS(t){let e=t.match(/<block>(yes|no)<\/block>/i);return e?e[1].toLowerCase()==="yes":null}function KS(t){let e=t.match(/<reason>([\s\S]*?)(?:<\/reason>|$)/i);return e?e[1].trim():null}function zS(t){return t.replace(/<thinking>[\s\S]*?<\/thinking>/gi,"").trim()}var VS={maxConsecutive:3,maxTotal:20};function XS(){return{consecutiveDenials:0,totalDenials:0}}function Qu(t){return{consecutiveDenials:t.consecutiveDenials+1,totalDenials:t.totalDenials+1}}function Zu(t){return t.consecutiveDenials===0?t:{...t,consecutiveDenials:0}}function YS(t){return t.consecutiveDenials>=VS.maxConsecutive||t.totalDenials>=VS.maxTotal}import*as Mt from"node:fs";import*as xo from"node:path";var v$="audit",b$="denials.jsonl",k$=10*1024*1024,ji=class{filePath;writeQueue=Promise.resolve();constructor(e){let r=xo.join(e,".qlogicagent",v$);this.filePath=xo.join(r,b$)}record(e){this.writeQueue=this.writeQueue.then(()=>this.doWrite(e)).catch(()=>{})}getFilePath(){return this.filePath}async doWrite(e){try{let r=xo.dirname(this.filePath);if(Mt.existsSync(r)||Mt.mkdirSync(r,{recursive:!0}),Mt.existsSync(this.filePath)&&Mt.statSync(this.filePath).size>k$){let s=this.filePath+".1";Mt.renameSync(this.filePath,s)}let n=JSON.stringify(e)+`
601
601
  `;Mt.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 R$=[{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 R$.map(({ruleId:t,...e})=>({...e}))}var T$=12e4,$i=class{ruleEngine;hookRegistry;onRequestApproval;onDenied;classifierLLMCall;getRecentMessages;permissionRole;pendingApprovals=new Map;auditLogger;sessionId;getTurnId;communityTelemetryRecorder;communitySandboxTurnIds=new Set;communitySandboxRuleEngine=new Rn({mode:"default",defaultBehavior:"allow",rules:QS()});unregisterHook=null;toolMetaCache=new Map;classifierCache=new Oi;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=A$(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}),w$(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,ep(e.decisionReason)),{action:"abort",reason:e.message});let s=x$(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,ep(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,ep(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 P$(c)==="read"||Po(n)?{action:"continue"}:this.handleWorkerAsk(r,n,o)}if(this.ruleEngine.getMode()==="auto"){if(Po(n))return{action:"continue"};let c=YS(this.denialTracking);if(this.classifierLLMCall&&!c)try{let l=this.getRecentMessages?.()??[],d=await Ju(n,o??{},l,this.classifierLLMCall);if(o&&this.classifierCache.set(n,o,{shouldBlock:d.shouldBlock,reason:d.reason}),!d.shouldBlock)return this.denialTracking=Zu(this.denialTracking),{action:"continue",context:{decisionReason:{type:"classifier",classifier:"auto",reason:d.reason}}};this.denialTracking=Qu(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=S$(),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(Po(r))return{action:"continue"};if(this.classifierLLMCall)try{let o=this.getRecentMessages?.()??[],s=await Ju(r,n??{},o,this.classifierLLMCall);return n&&this.classifierCache.set(r,n,{shouldBlock:s.shouldBlock,reason:s.reason}),s.shouldBlock?(this.denialTracking=Qu(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=Zu(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"))},T$);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 w$(t){return t==="classifier"||t==="rule-engine"||t==="safety"||t==="static-deny"}function A$(t){return`${t}-deny`}function ep(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 P$(t){return t?.riskLevel?t.riskLevel:t?.isReadOnly?"read":t?.isDangerous?"system":"write"}function x$(t){return t.behavior==="ask"&&t.decisionReason?.type==="rule"&&t.decisionReason.rule.source==="community-sandbox"}function Co(t){return Li(t)}function ZS(t){return new Rn(Co(t))}function eT(t){return new $i(t)}function tT(t,e){let r=Co(e);return t.setMode(r.mode),t.replaceRules(r.rules),t.setDefaultBehavior(r.defaultBehavior),r}import{randomUUID as C$}from"node:crypto";function rT(t){pb(async e=>{let r=`ask-${C$().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 Fi(t,e){return{name:t,compute:e,cacheBreak:!1}}function Bt(t,e,r){return{name:t,compute:e,cacheBreak:!0}}var Ui=new Map;async function I$(t){return(await Promise.all(t.map(async r=>{if(!r.cacheBreak&&Ui.has(r.name))return Ui.get(r.name)??null;let n=await r.compute();return Ui.set(r.name,n),n}))).filter(r=>r!=null)}function nT(){Ui.clear()}async function Hi(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 I$(t.sections);e.push(...r)}return t.appendSystemPrompt&&e.push(t.appendSystemPrompt),e.filter(Boolean).join(`
602
602
 
603
- `)}var E$=250;async function oT(t,e){let r=new AbortController;t.activeTurn&&(t.activeTurn.abort(),await M$(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 gr(e),t.sessionTaskDomain=void 0,t.memoryPrefetchState=bt(),t.enableIdleDream()),{abortController:r,resolveTurnDone:n}}async function M$(t){let e;try{await Promise.race([t,new Promise(r=>{e=setTimeout(r,E$),e.unref?.()})])}finally{e&&clearTimeout(e)}}function tp(t,e){t.activeTurn===e.abortController&&(t.activeTurn=null),e.resolveTurnDone()}import*as Io from"node:path";var _$=1800*1e3,iT=new fr;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"&&D$(e,r);let o=N$(e,r,t.nowMs??Date.now()),s=L$(e,r);return{sessionProjectRoot:s,sessionProjectId:O$(e,s,n),projectHintStale:o.projectHintStale,staleProjectHintContext:o.staleProjectHintContext}}function D$(t,e){let r=t.groupKey,n=r.split(":"),o=n.length>=3?n.slice(1).join(":"):r,s=Ds(o);if(s){e.setActiveWorkdir(s.workspaceDir),ne()?.id!==s.id&&xt(s.id);return}let i=t.groupName||o,a=o.replace(/[<>:"/\\|?*\x00-\x1f]/g,"_").trim()||"group",c=Io.join(I().getUserAgentHome(),"workspaces","groups",a),l=_s({name:i,workspaceDir:c,type:"group",groupId:o});e.setActiveWorkdir(l.workspaceDir),xt(l.id),e.sendNotification("project.created",{id:l.id,name:l.name,type:"group",groupId:o,workspaceDir:l.workspaceDir})}function N$(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>_$)return e.log(`[projectHint] stale (${Math.round(s/6e4)}min old), skipping auto-switch`),{projectHintStale:!0,staleProjectHintContext:{activeProjectName:ne()?.name,projectNames:z().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=z(),l=i.toLowerCase(),d=c.find(p=>p.name.toLowerCase()===l)??c.find(p=>p.name.toLowerCase().includes(l));d&&d.status==="active"&&(xt(d.id),e.setActiveWorkdir(d.workspaceDir))}return{projectHintStale:!1}}function L$(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 O$(t,e,r){if(r){let i=zt(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:z().find(i=>sT(i.workspaceDir,e))?.id}function sT(t,e){return Io.resolve(t).toLowerCase()===Io.resolve(e).toLowerCase()}import{randomUUID as cT}from"node:crypto";function Bi(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 j$=`[SUGGESTION MODE]
603
+ `)}var E$=250;async function oT(t,e){let r=new AbortController;t.activeTurn&&(t.activeTurn.abort(),await M$(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 gr(e),t.sessionTaskDomain=void 0,t.memoryPrefetchState=bt(),t.enableIdleDream()),{abortController:r,resolveTurnDone:n}}async function M$(t){let e;try{await Promise.race([t,new Promise(r=>{e=setTimeout(r,E$),e.unref?.()})])}finally{e&&clearTimeout(e)}}function tp(t,e){t.activeTurn===e.abortController&&(t.activeTurn=null),e.resolveTurnDone()}import*as Io from"node:path";var _$=1800*1e3,iT=new fr;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"&&D$(e,r);let o=N$(e,r,t.nowMs??Date.now()),s=L$(e,r);return{sessionProjectRoot:s,sessionProjectId:O$(e,s,n),projectHintStale:o.projectHintStale,staleProjectHintContext:o.staleProjectHintContext}}function D$(t,e){let r=t.groupKey,n=r.split(":"),o=n.length>=3?n.slice(1).join(":"):r,s=Ds(o);if(s){e.setActiveWorkdir(s.workspaceDir),ne()?.id!==s.id&&xt(s.id);return}let i=t.groupName||o,a=o.replace(/[<>:"/\\|?*\x00-\x1f]/g,"_").trim()||"group",c=Io.join(I().getUserAgentHome(),"workspaces","groups",a),l=_s({name:i,workspaceDir:c,type:"group",groupId:o});e.setActiveWorkdir(l.workspaceDir),xt(l.id),e.sendNotification("project.created",{id:l.id,name:l.name,type:"group",groupId:o,workspaceDir:l.workspaceDir})}function N$(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>_$)return e.log(`[projectHint] stale (${Math.round(s/6e4)}min old), skipping auto-switch`),{projectHintStale:!0,staleProjectHintContext:{activeProjectName:ne()?.name,projectNames:z().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=z(),l=i.toLowerCase(),d=c.find(p=>p.name.toLowerCase()===l)??c.find(p=>p.name.toLowerCase().includes(l));d&&d.status==="active"&&(xt(d.id),e.setActiveWorkdir(d.workspaceDir))}return{projectHintStale:!1}}function L$(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 O$(t,e,r){if(r){let i=zt(r,e);if(i?.projectId)return i.projectId}let n=t?.projectId;if(n&&we(n))return n;let o=ne();return o&&sT(o.workspaceDir,e)?o.id:z().find(i=>sT(i.workspaceDir,e))?.id}function sT(t,e){return Io.resolve(t).toLowerCase()===Io.resolve(e).toLowerCase()}import{randomUUID as cT}from"node:crypto";function Bi(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 j$=`[SUGGESTION MODE]
604
604
  Based on the conversation, suggest 1-3 short follow-up actions the user might naturally do next.
605
605
  Be specific: "run the tests" beats "continue".
606
606
  Stay silent if the next step isn't obvious.
@@ -630,7 +630,7 @@ ${r.join(`
630
630
  `,".","\u3002",";","\uFF1B"].map(a=>t.lastIndexOf(a,e)),o=Math.max(-1,...n)+1,s=[`
631
631
  `,".","\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)DU(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()}
632
632
  ${n.marker}`:n.marker));return r}function EU(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 MU(t){let e=t.toLowerCase(),r=Ji(e,["start with","begin with"])+Ji(t,["\u5F00\u5934","\u5FC5\u987B\u4EE5"]),n=Ji(e,["end with","append","at the end"])+Ji(t,["\u672B\u5C3E","\u7ED3\u5C3E","\u7ED3\u675F\u6807\u8BB0"]);return r>=0||n>=0?r>n?"prefix":"suffix":"include"}function Ji(t,e){let r=-1;for(let n of e){let o=t.lastIndexOf(n);o>r&&(r=o)}return r}function _U(t){let e=t.trim();return e.length<2||e.length>100||/https?:\/\//i.test(e)?!1:/[A-Z0-9_\-[\]—-]/.test(e)}function DU(t){return/[A-Z\[\]—-]/.test(t)}async function ea(t,e){return CU(t,e)}function TT(){}var LU=[/继续(桌面|电脑|刚才|上次|之前)的/,/接着(桌面|电脑|刚才|上次|之前)的/,/刚才(那个|那件|说的|聊的|做的)/,/上次(说到|聊到|做到|讲到)/,/桌面(端|上)?(那个|那边|的任务|的对话|在做)/,/电脑(端|上)?(那个|那边|的任务|的对话|在做)/,/之前(那个|在做的|讨论的|说的)/,/帮我继续/,/接着(做|干|搞|写|改)/,/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 OU(t){return!t||t.length<3?!1:LU.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 jU(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??NU(),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()}}),tp(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 As(v):null;if(this.permissionChecker?.ruleEngineRef&&a?.permissions){let P=tT(this.permissionChecker.ruleEngineRef,a.permissions);yi(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 ea(M,this.currentHooks??void 0);P.length>0&&(C=Zi(P),E=sp(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=Vi(s),O=Yi(de);!h.toolChoice&&de.requiresFreshTool&&(h.toolChoice="required");let Oe=this.projectMemoryStoreFactory.getRootPath(M);if(!this.memdir||this.memdir.getRootPath()!==Oe){let P=this.projectMemoryStoreFactory.create(M);P.ensureInitialized(),this.memdir=P}let je=this.memdir,F;if(o){let P=zt(o,l);P?.carryoverSummary&&(F=P.carryoverSummary)}let J=await Hi({basePrompt:a?.systemPrompt,instructionBlock:C,customSystemPrompt:a?.customSystemPrompt,appendSystemPrompt:a?.appendSystemPrompt,sections:[Gi(M),zi(),yT(k),Ki(),...O?[O]:[],...F?[Bt("carryover",()=>F,"carryover from predecessor session")]:[],Bt("memory",()=>{if(!je)return null;let P=je.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(`
633
- `):null},"memory INDEX.md may change between turns")]}),H=[...s].reverse().find(P=>P.role==="user");H&&il(o,H,l,r).catch(()=>{}),await this.mcpReady;let Ie=(this.toolCatalog??er()).getToolManifest(),Wt=new Set(Ie.map(P=>P.function.name)),Ee=Xi([...Ie,...i.filter(P=>!Wt.has(P.function.name))],de);jU(this.permissionChecker,Ee);let ot=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});Fe(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(", ")??"";ot=[{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(OU(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]"},st={role:"system",content:"[\u684C\u9762\u5BF9\u8BDD\u4E0A\u4E0B\u6587\u7ED3\u675F\uFF0C\u4EE5\u4E0B\u662F\u5F53\u524D IM \u7AEF\u7684\u5BF9\u8BDD]"};ot=[V,...se,st,...ot],this.log(`[continuation] injected ${se.length} desktop messages as reference`)}}if(!zt(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 Ym(P,{transport:V.transport,apiKey:V.apiKey,model:V.model})),W||(W=P.trim().slice(0,20)+(P.trim().length>20?"\u2026":"")),await Fe(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:ot,tools:Ee,systemPrompt:J,config:h},f.signal)){let W=new Date().toISOString();if(Bi({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 st=this.sessionState.createSnapshot();this.sendNotification("turn.usage_update",{turnId:P.turnId,usage:P.usage,model:P.model??this.currentModel,sessionCostUSD:st.totalInputTokens*3e-6+st.totalOutputTokens*15e-6})}V&&(this.lastAssistantMessageForExtract=V,il(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}),kh({instruction:P.instruction,eventTurnId:P.turnId,projectRoot:l,host:this});break}}if(this.log(`turn ${r} completed`),this.sessionState?.recordTurnCompleted(),this.sessionState){Xm(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&&Jm(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,st)=>this.sendNotification(V,st)}),this.petRuntime.awardXp("turn.end"),this.petRuntime.reactAfterTurn(s),a?.sessionType==="group"&&this.sessionState){let V=this.sessionState.createSnapshot(),st=zt(o,l);st&&xR({...st,turnCount:V.turnCount},l).then(In=>{In.split&&this.sendNotification("session-update",{sessionId:In.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{tp(this,m)}}function Ye(t){return ta(t)}function yt(t){return ta(t)}function qt(t){return ta(t)}function hr(t){return ta(t)}function ta(t){return t.multiAgentHandlerHost??t}function CT(t){return new Map([["initialize",e=>Eb.call(t,e)],["agent.ping",e=>Mb.call(t,e)],["agent.health",e=>_b.call(t,e)],["agent.metrics",e=>Db.call(t,e)],["agent.cancel",e=>Nb.call(t,e)],["thread.turn",e=>xT.call(t,e)],["memory.dream",e=>on.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=>Kl.call(t,e)],["assistants.delete",e=>Vl.call(t,e)],["assistants.setState",e=>zl.call(t,e)],["tool.approval.response",e=>AT.call(t,e)],["thread.user_response",e=>PT.call(t,e)],["thread.list",e=>MR.call(t,e)],["session.resume",e=>HR.call(t,e)],["thread.create",e=>ER.call(t,e)],["session.getInfo",e=>BR.call(t,e)],["session.create",e=>_R.call(t,e)],["session.resolve",e=>DR.call(t,e)],["session.list",e=>NR.call(t,e)],["session.get",e=>LR.call(t,e)],["session.getMessages",e=>OR.call(t,e)],["session.update",e=>jR.call(t,e)],["session.delete",e=>$R.call(t,e)],["session.deleteAll",e=>UR.call(t,e)],["session.archive",e=>FR.call(t,e)],["memory.list",e=>ak.call(t,e)],["memory.atlas",e=>ck.call(t,e)],["memory.activity",e=>lk.call(t,e)],["memory.observe",e=>dk.call(t,e)],["memory.propose",e=>uk.call(t,e)],["memory.consolidate",e=>pk.call(t,e)],["memory.read",e=>mk.call(t,e)],["memory.write",e=>gk.call(t,e)],["memory.search",e=>fk.call(t,e)],["memory.delete",e=>hk.call(t,e)],["memory.update",e=>yk.call(t,e)],["tools.list",e=>vb.call(t,e)],["media.listModels",e=>Yb.call(t,e)],["media.cancel",e=>Jb.call(t,e)],["media.status",e=>Qb.call(t,e)],["media.stt",e=>Zb.call(t,e)],["settings.listProviders",e=>QR.call(t,e)],["settings.addKey",e=>ZR.call(t,e)],["settings.removeKey",e=>eS.call(t,e)],["settings.getKey",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=>Kl.call(t,e)],["assistants.delete",e=>Vl.call(t,e)],["assistants.setState",e=>zl.call(t,e)],["provider.list",e=>bb.call(t,e)],["config.get",e=>kb.call(t,e)],["config.update",e=>Sb.call(t,e)],["config.tunables",e=>wb.call(t,e)],["config.updateTunable",e=>Ab.call(t,e)],["community.getConsent",e=>Ih.call(t,e)],["community.setConsent",e=>Eh.call(t,e)],["community.matchRegistry",e=>_h.call(t,e)],["community.listShared",e=>Mh.call(t,e)],["community.withdrawShared",e=>Fh.call(t,e)],["community.withdrawAllShared",e=>Hh.call(t,e)],["community.listNotices",e=>Bh.call(t,e)],["community.markNoticeRead",e=>qh.call(t,e)],["community.listPublishAudit",e=>Uh.call(t,e)],["community.resolveInstall",e=>Dh.call(t,e)],["community.installResource",e=>Nh.call(t,e)],["community.publishSkill",e=>Lh.call(t,e)],["community.publishPet",e=>Oh.call(t,e)],["community.recordSignal",e=>jh.call(t,e)],["community.recordTelemetry",e=>$h.call(t,e)],["todos.list",e=>Pb.call(t,e)],["tasks.list",e=>xb.call(t,e)],["tasks.cancel",e=>Cb.call(t,e)],["agents.scan",e=>cf.call(Ye(t),e)],["agents.list",e=>lf.call(Ye(t),e)],["agents.prompt",e=>Rf.call(Ye(t),e)],["agents.config",e=>df.call(Ye(t),e)],["agents.setConfig",e=>uf.call(Ye(t),e)],["agents.getConfig",e=>pf.call(Ye(t),e)],["agents.removeConfig",e=>mf.call(Ye(t),e)],["agents.setGateway",e=>gf.call(Ye(t),e)],["agents.getGateway",e=>ff.call(Ye(t),e)],["agents.processes",e=>yf.call(Ye(t),e)],["agents.kill",e=>vf.call(Ye(t),e)],["agents.listConfigured",e=>hf.call(Ye(t),e)],["agents.getLog",e=>bf.call(Ye(t),e)],["agents.testConnection",e=>kf.call(Ye(t),e)],["solo.start",e=>MS.call(hr(t),e)],["solo.status",e=>_S.call(hr(t),e)],["solo.cancel",e=>DS.call(hr(t),e)],["solo.select",e=>NS.call(hr(t),e)],["solo.list",e=>LS.call(hr(t),e)],["solo.delete",e=>OS.call(hr(t),e)],["solo.message",e=>jS.call(hr(t),e)],["solo.evaluate",e=>$S.call(hr(t),e)],["product.plan",e=>Uk.call(yt(t),e)],["product.confirm",e=>Fk.call(yt(t),e)],["product.message",e=>Hk.call(yt(t),e)],["product.create",e=>Bk.call(yt(t),e)],["product.resume",e=>qk.call(yt(t),e)],["product.pause",e=>Wk.call(yt(t),e)],["product.checkpoint",e=>Gk.call(yt(t),e)],["product.status",e=>Kk.call(yt(t),e)],["product.list",e=>zk.call(yt(t),e)],["product.delete",e=>Vk.call(yt(t),e)],["product.cancel",e=>Xk.call(yt(t),e)],["product.rollback",e=>Yk.call(yt(t),e)],["workflow.create",e=>nR.call(qt(t),e)],["workflow.get",e=>oR.call(qt(t),e)],["workflow.describe",e=>sR.call(qt(t),e)],["workflow.patch",e=>iR.call(qt(t),e)],["workflow.run",e=>aR.call(qt(t),e)],["workflow.setActive",e=>cR.call(qt(t),e)],["workflow.list",e=>lR.call(qt(t),e)],["workflow.delete",e=>dR.call(qt(t),e)],["workflow.onImMessage",e=>uR.call(qt(t),e)],["workflow.onWebhook",e=>pR.call(qt(t),e)],["project.create",e=>fR.call(t,e)],["project.list",e=>hR.call(t,e)],["project.delete",e=>yR.call(t,e)],["project.purgeAll",e=>vR.call(t,e)],["project.rename",e=>bR.call(t,e)],["project.archive",e=>kR.call(t,e)],["project.unarchive",e=>RR.call(t,e)],["project.update",e=>TR.call(t,e)],["project.archiveByGroup",e=>SR.call(t,e)],["session.switchProject",e=>qR.call(t,e)],["session.focus",e=>GR.call(t,e)],["session.moveToProject",e=>KR.call(t,e)],["session.getState",e=>WR.call(t,e)],["files.list",e=>jb.call(t,e)],["files.create",e=>$b.call(t,e)],["files.rename",e=>Ub.call(t,e)],["files.delete",e=>Fb.call(t,e)],["files.gitStatus",e=>Hb.call(t,e)],["instructions.list",e=>Bb.call(t,e)],["instructions.read",e=>qb.call(t,e)],["instructions.write",e=>Wb.call(t,e)],["instructions.delete",e=>Gb.call(t,e)],["plans.list",e=>Kb.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=>Tk.call(t,e)],["pet.interact",e=>wk.call(t,e)],["pet.status",e=>Ak.call(t,e)],["pet.forge",e=>Pk.call(t,e)],["pet.confirm_response",e=>vk.call(t,e)]])}import{randomUUID as IT}from"node:crypto";import*as ip 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?.()||ip.join(n,"memory"),transcriptDir:e.config?.transcriptDir||t.resolveTranscriptDir?.()||ip.join(n,"agent-logs"),model:r.model,apiKey:r.apiKey,...e.config}}};return await on.call(t,o),{ok:!0,summary:"Dream consolidation triggered"}}async function MT(t,e){t.log("[acp] x/solo.start");let r=Xe.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=Xe.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 Xe.call(t).select(e)}}async function NT(t,e){t.log("[acp] x/solo.cancel");let r=Xe.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=Xe.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=Xe.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"),Gc()}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 KT(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 zT(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=Fn(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}`),ft.isTeamBudgetExceeded())return{ok:!1,agentType:r,output:void 0,error:ft.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 tn({promptMessages:[{role:"user",content:n}],tools:[],transport:i.transport,toolInvoker:a,createAgentRunner:nn,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 ft.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 gr(r),t.sessionTaskDomain=void 0,t.memoryPrefetchState=bt(),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 UU(t,r,n,[...s]);return i.content&&t.sessionHistory.appendAcpAssistantMessage(n,i.content),i}async function UU(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=Vi(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=Xi((t.toolCatalog??er()).getToolManifest(),i),l=t.getActiveProjectRoot(),d=await ea(l,t.currentHooks??void 0),p=d.length>0?Zi(d):void 0,u=Yi(i),m=await Hi({instructionBlock:p,sections:[Gi(l),zi(),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(!Bi({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=>KT(r,n),handleAcpProductRollback:n=>zT(r,n),handleAcpProductStatus:n=>WT(r,n),handleAcpProductSubscribe:n=>VT(r,n),handleAcpTeamDelegate:n=>XT(r,n)}}var ra=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 HU}from"node:fs/promises";var aw="agent-configs.json";function sw(){return iw(B(),aw)}function BU(t){return iw(De(t),aw)}function qU(){return{agents:{}}}var na=class{data=qU();cwd;constructor(e){this.cwd=e}async load(){let e=await Qt(sw()),r=this.cwd?await Qt(BU(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 pr(e,this.data);try{await HU(e,384)}catch{}}};var oa=class{constructor(e){this.deps=e}deps;store=null;get currentStore(){return this.store}async ensureStore(){return this.store||(this.store=new na(this.deps.getActiveProjectRoot()),await this.store.load(),this.deps.acpDetector.setConfigStore(this.store.getData())),this.store}};function cw(t){return new oa(t)}var sa=class{soloEvaluator=null;productOrchestrator=null;productPlanner=null;soloProcessManager=null;productProcessManager=null};function lw(t){let e=t.acpDetector??new Rs,r=new sa,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 ia=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=WU(r,n)?r.slice(n.length):r;return[KU(n),...n,...o]}getOrCreateAcpHistory(e){let r=this.acpSessionHistories.get(e);return r||(r=[],this.acpSessionHistories.set(e,r)),r}};function WU(t,e){if(t.length<e.length)return!1;for(let r=0;r<e.length;r++)if(!GU(t[r],e[r]))return!1;return!0}function GU(t,e){return t.role===e.role&&JSON.stringify(t.content)===JSON.stringify(e.content)}function KU(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:
633
+ `):null},"memory INDEX.md may change between turns")]}),H=[...s].reverse().find(P=>P.role==="user");H&&il(o,H,l,r).catch(()=>{}),await this.mcpReady;let Ee=(this.toolCatalog??er()).getToolManifest(),Wt=new Set(Ee.map(P=>P.function.name)),Me=Xi([...Ee,...i.filter(P=>!Wt.has(P.function.name))],de);jU(this.permissionChecker,Me);let ot=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});Fe(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(", ")??"";ot=[{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(OU(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]"},st={role:"system",content:"[\u684C\u9762\u5BF9\u8BDD\u4E0A\u4E0B\u6587\u7ED3\u675F\uFF0C\u4EE5\u4E0B\u662F\u5F53\u524D IM \u7AEF\u7684\u5BF9\u8BDD]"};ot=[V,...se,st,...ot],this.log(`[continuation] injected ${se.length} desktop messages as reference`)}}if(!zt(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 Ym(P,{transport:V.transport,apiKey:V.apiKey,model:V.model})),W||(W=P.trim().slice(0,20)+(P.trim().length>20?"\u2026":"")),await Fe(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:ot,tools:Me,systemPrompt:J,config:h},f.signal)){let W=new Date().toISOString();if(Bi({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 st=this.sessionState.createSnapshot();this.sendNotification("turn.usage_update",{turnId:P.turnId,usage:P.usage,model:P.model??this.currentModel,sessionCostUSD:st.totalInputTokens*3e-6+st.totalOutputTokens*15e-6})}V&&(this.lastAssistantMessageForExtract=V,il(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}),kh({instruction:P.instruction,eventTurnId:P.turnId,projectRoot:l,host:this});break}}if(this.log(`turn ${r} completed`),this.sessionState?.recordTurnCompleted(),this.sessionState){Xm(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&&Jm(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,st)=>this.sendNotification(V,st)}),this.petRuntime.awardXp("turn.end"),this.petRuntime.reactAfterTurn(s),a?.sessionType==="group"&&this.sessionState){let V=this.sessionState.createSnapshot(),st=zt(o,l);st&&xR({...st,turnCount:V.turnCount},l).then(In=>{In.split&&this.sendNotification("session-update",{sessionId:In.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{tp(this,m)}}function Ye(t){return ta(t)}function yt(t){return ta(t)}function qt(t){return ta(t)}function hr(t){return ta(t)}function ta(t){return t.multiAgentHandlerHost??t}function CT(t){return new Map([["initialize",e=>Eb.call(t,e)],["agent.ping",e=>Mb.call(t,e)],["agent.health",e=>_b.call(t,e)],["agent.metrics",e=>Db.call(t,e)],["agent.cancel",e=>Nb.call(t,e)],["thread.turn",e=>xT.call(t,e)],["memory.dream",e=>on.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=>Kl.call(t,e)],["assistants.delete",e=>Vl.call(t,e)],["assistants.setState",e=>zl.call(t,e)],["tool.approval.response",e=>AT.call(t,e)],["thread.user_response",e=>PT.call(t,e)],["thread.list",e=>MR.call(t,e)],["session.resume",e=>HR.call(t,e)],["thread.create",e=>ER.call(t,e)],["session.getInfo",e=>BR.call(t,e)],["session.create",e=>_R.call(t,e)],["session.resolve",e=>DR.call(t,e)],["session.list",e=>NR.call(t,e)],["session.get",e=>LR.call(t,e)],["session.getMessages",e=>OR.call(t,e)],["session.update",e=>jR.call(t,e)],["session.delete",e=>$R.call(t,e)],["session.deleteAll",e=>UR.call(t,e)],["session.archive",e=>FR.call(t,e)],["memory.list",e=>ak.call(t,e)],["memory.atlas",e=>ck.call(t,e)],["memory.activity",e=>lk.call(t,e)],["memory.observe",e=>dk.call(t,e)],["memory.propose",e=>uk.call(t,e)],["memory.consolidate",e=>pk.call(t,e)],["memory.read",e=>mk.call(t,e)],["memory.write",e=>gk.call(t,e)],["memory.search",e=>fk.call(t,e)],["memory.delete",e=>hk.call(t,e)],["memory.update",e=>yk.call(t,e)],["tools.list",e=>vb.call(t,e)],["media.listModels",e=>Yb.call(t,e)],["media.cancel",e=>Jb.call(t,e)],["media.status",e=>Qb.call(t,e)],["media.stt",e=>Zb.call(t,e)],["settings.listProviders",e=>QR.call(t,e)],["settings.addKey",e=>ZR.call(t,e)],["settings.removeKey",e=>eS.call(t,e)],["settings.getKey",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=>Kl.call(t,e)],["assistants.delete",e=>Vl.call(t,e)],["assistants.setState",e=>zl.call(t,e)],["provider.list",e=>bb.call(t,e)],["config.get",e=>kb.call(t,e)],["config.update",e=>Sb.call(t,e)],["config.tunables",e=>wb.call(t,e)],["config.updateTunable",e=>Ab.call(t,e)],["community.getConsent",e=>Ih.call(t,e)],["community.setConsent",e=>Eh.call(t,e)],["community.matchRegistry",e=>_h.call(t,e)],["community.listShared",e=>Mh.call(t,e)],["community.withdrawShared",e=>Fh.call(t,e)],["community.withdrawAllShared",e=>Hh.call(t,e)],["community.listNotices",e=>Bh.call(t,e)],["community.markNoticeRead",e=>qh.call(t,e)],["community.listPublishAudit",e=>Uh.call(t,e)],["community.resolveInstall",e=>Dh.call(t,e)],["community.installResource",e=>Nh.call(t,e)],["community.publishSkill",e=>Lh.call(t,e)],["community.publishPet",e=>Oh.call(t,e)],["community.recordSignal",e=>jh.call(t,e)],["community.recordTelemetry",e=>$h.call(t,e)],["todos.list",e=>Pb.call(t,e)],["tasks.list",e=>xb.call(t,e)],["tasks.cancel",e=>Cb.call(t,e)],["agents.scan",e=>cf.call(Ye(t),e)],["agents.list",e=>lf.call(Ye(t),e)],["agents.prompt",e=>Rf.call(Ye(t),e)],["agents.config",e=>df.call(Ye(t),e)],["agents.setConfig",e=>uf.call(Ye(t),e)],["agents.getConfig",e=>pf.call(Ye(t),e)],["agents.removeConfig",e=>mf.call(Ye(t),e)],["agents.setGateway",e=>gf.call(Ye(t),e)],["agents.getGateway",e=>ff.call(Ye(t),e)],["agents.processes",e=>yf.call(Ye(t),e)],["agents.kill",e=>vf.call(Ye(t),e)],["agents.listConfigured",e=>hf.call(Ye(t),e)],["agents.getLog",e=>bf.call(Ye(t),e)],["agents.testConnection",e=>kf.call(Ye(t),e)],["solo.start",e=>MS.call(hr(t),e)],["solo.status",e=>_S.call(hr(t),e)],["solo.cancel",e=>DS.call(hr(t),e)],["solo.select",e=>NS.call(hr(t),e)],["solo.list",e=>LS.call(hr(t),e)],["solo.delete",e=>OS.call(hr(t),e)],["solo.message",e=>jS.call(hr(t),e)],["solo.evaluate",e=>$S.call(hr(t),e)],["product.plan",e=>Uk.call(yt(t),e)],["product.confirm",e=>Fk.call(yt(t),e)],["product.message",e=>Hk.call(yt(t),e)],["product.create",e=>Bk.call(yt(t),e)],["product.resume",e=>qk.call(yt(t),e)],["product.pause",e=>Wk.call(yt(t),e)],["product.checkpoint",e=>Gk.call(yt(t),e)],["product.status",e=>Kk.call(yt(t),e)],["product.list",e=>zk.call(yt(t),e)],["product.delete",e=>Vk.call(yt(t),e)],["product.cancel",e=>Xk.call(yt(t),e)],["product.rollback",e=>Yk.call(yt(t),e)],["workflow.create",e=>nR.call(qt(t),e)],["workflow.get",e=>oR.call(qt(t),e)],["workflow.describe",e=>sR.call(qt(t),e)],["workflow.patch",e=>iR.call(qt(t),e)],["workflow.run",e=>aR.call(qt(t),e)],["workflow.setActive",e=>cR.call(qt(t),e)],["workflow.list",e=>lR.call(qt(t),e)],["workflow.delete",e=>dR.call(qt(t),e)],["workflow.onImMessage",e=>uR.call(qt(t),e)],["workflow.onWebhook",e=>pR.call(qt(t),e)],["project.create",e=>fR.call(t,e)],["project.list",e=>hR.call(t,e)],["project.delete",e=>yR.call(t,e)],["project.purgeAll",e=>vR.call(t,e)],["project.rename",e=>bR.call(t,e)],["project.archive",e=>kR.call(t,e)],["project.unarchive",e=>RR.call(t,e)],["project.update",e=>TR.call(t,e)],["project.archiveByGroup",e=>SR.call(t,e)],["session.switchProject",e=>qR.call(t,e)],["session.focus",e=>GR.call(t,e)],["session.moveToProject",e=>KR.call(t,e)],["session.getState",e=>WR.call(t,e)],["files.list",e=>jb.call(t,e)],["files.create",e=>$b.call(t,e)],["files.rename",e=>Ub.call(t,e)],["files.delete",e=>Fb.call(t,e)],["files.gitStatus",e=>Hb.call(t,e)],["instructions.list",e=>Bb.call(t,e)],["instructions.read",e=>qb.call(t,e)],["instructions.write",e=>Wb.call(t,e)],["instructions.delete",e=>Gb.call(t,e)],["plans.list",e=>Kb.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=>Tk.call(t,e)],["pet.interact",e=>wk.call(t,e)],["pet.status",e=>Ak.call(t,e)],["pet.forge",e=>Pk.call(t,e)],["pet.confirm_response",e=>vk.call(t,e)]])}import{randomUUID as IT}from"node:crypto";import*as ip 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?.()||ip.join(n,"memory"),transcriptDir:e.config?.transcriptDir||t.resolveTranscriptDir?.()||ip.join(n,"agent-logs"),model:r.model,apiKey:r.apiKey,...e.config}}};return await on.call(t,o),{ok:!0,summary:"Dream consolidation triggered"}}async function MT(t,e){t.log("[acp] x/solo.start");let r=Xe.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=Xe.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 Xe.call(t).select(e)}}async function NT(t,e){t.log("[acp] x/solo.cancel");let r=Xe.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=Xe.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=Xe.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"),Gc()}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 KT(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 zT(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=Fn(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}`),ft.isTeamBudgetExceeded())return{ok:!1,agentType:r,output:void 0,error:ft.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 tn({promptMessages:[{role:"user",content:n}],tools:[],transport:i.transport,toolInvoker:a,createAgentRunner:nn,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 ft.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 gr(r),t.sessionTaskDomain=void 0,t.memoryPrefetchState=bt(),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 UU(t,r,n,[...s]);return i.content&&t.sessionHistory.appendAcpAssistantMessage(n,i.content),i}async function UU(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=Vi(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=Xi((t.toolCatalog??er()).getToolManifest(),i),l=t.getActiveProjectRoot(),d=await ea(l,t.currentHooks??void 0),p=d.length>0?Zi(d):void 0,u=Yi(i),m=await Hi({instructionBlock:p,sections:[Gi(l),zi(),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(!Bi({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=>KT(r,n),handleAcpProductRollback:n=>zT(r,n),handleAcpProductStatus:n=>WT(r,n),handleAcpProductSubscribe:n=>VT(r,n),handleAcpTeamDelegate:n=>XT(r,n)}}var ra=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 HU}from"node:fs/promises";var aw="agent-configs.json";function sw(){return iw(B(),aw)}function BU(t){return iw(Ne(t),aw)}function qU(){return{agents:{}}}var na=class{data=qU();cwd;constructor(e){this.cwd=e}async load(){let e=await Qt(sw()),r=this.cwd?await Qt(BU(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 pr(e,this.data);try{await HU(e,384)}catch{}}};var oa=class{constructor(e){this.deps=e}deps;store=null;get currentStore(){return this.store}async ensureStore(){return this.store||(this.store=new na(this.deps.getActiveProjectRoot()),await this.store.load(),this.deps.acpDetector.setConfigStore(this.store.getData())),this.store}};function cw(t){return new oa(t)}var sa=class{soloEvaluator=null;productOrchestrator=null;productPlanner=null;soloProcessManager=null;productProcessManager=null};function lw(t){let e=t.acpDetector??new Rs,r=new sa,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 ia=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=WU(r,n)?r.slice(n.length):r;return[KU(n),...n,...o]}getOrCreateAcpHistory(e){let r=this.acpSessionHistories.get(e);return r||(r=[],this.acpSessionHistories.set(e,r)),r}};function WU(t,e){if(t.length<e.length)return!1;for(let r=0;r<e.length;r++)if(!GU(t[r],e[r]))return!1;return!0}function GU(t,e){return t.role===e.role&&JSON.stringify(t.content)===JSON.stringify(e.content)}function KU(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:
634
634
  ${e.map(n=>`- ${n.slice(0,500)}`).join(`
635
635
  `)}`:""].join(" ")}}import{randomUUID as zU}from"node:crypto";var VU={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},aa=class{constructor(e){this.options=e;this.dreamState=e.dreamState??ft.dream,this.now=e.now??(()=>Date.now()),this.randomId=e.randomId??(()=>zU().slice(0,8)),this.timers=e.timers??VU}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()}};He();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:Zs({provider:n,model:o,apiKey:s,baseUrl:i},t.providerRegistry).transport,apiKey:s,model:o}}import{randomUUID as XU}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}_${XU().slice(0,8)}`;try{return(await e.execute(r,t.args)).content.map(o=>o.text??"").join(`
636
636
  `)||"OK"}catch(n){return`Error: ${n instanceof Error?n.message:String(n)}`}}var YU={starting:"spawning",ready:"available",running:"running",completed:"available",failed:"failed",killed:"unavailable"};function mw(t,e,r){let n={agentId:t,status:YU[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 Sn 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");Sn.existsSync(n)||Sn.mkdirSync(n,{recursive:!0});let o=Yf(n);Mi(n),t.pathService.setActiveWorkdir(n),t.sendNotification("project.created",{id:o.id,name:o.name,workspaceDir:o.workspaceDir,type:o.type})}JU();let r=t.projectMemoryStoreFactory.create(t.pathService.getActiveProjectRoot());return r.ensureInitialized(),r}function JU(){let e=z().find(r=>r.type==="default"&&r.status==="active");e&&(Sn.existsSync(e.workspaceDir)||Sn.mkdirSync(e.workspaceDir,{recursive:!0}))}var ca=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 ap,readdir as vw,unlink as QU,stat as ZU,mkdir as eF}from"node:fs/promises";import{existsSync as _t,readFileSync as bw,mkdirSync as kw,writeFileSync as tF}from"node:fs";import{join as rt}from"node:path";var ge=12288,cp=200,la=8192,rF="memory",yr="INDEX.md";function lp(t){return rt(I().getProjectAgentDir(t),rF)}var nF=[/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 da(t){return!nF.some(e=>e.test(t))}var oF=/^[a-z0-9][a-z0-9\-_.]*\.md$/i;function ua(t){return!(!oF.test(t)||t===yr||t.includes("..")||t.includes("/")||t.includes("\\"))}function sF(t){return t.trim().match(/^([A-Za-z][A-Za-z0-9_-]{2,})\s*:/)?.[1]??null}function iF(t,e){let r=t.split(`
@@ -1107,7 +1107,7 @@ Required scopes: ${o.requiredScopes?.join(", ")||"unknown"}
1107
1107
  `)}],details:{type:"mcp",action:"manage_server",manageAction:t,server:e,success:r.success}}}var GH={id:"mcp-tools",kind:"mcp",register:KH};function XA(t){GH.register(t)}function KH(t){let e=VH({turnMcpConfig:t.config.mcpServers??{},userMcpConfig:zH(t.pathService),projectRoot:t.projectRoot});if(e.length===0)return;t.currentManager?.disconnectAll().catch(()=>{});let r=new Ia({servers:e,log:t.log,workspaceRoot:t.projectRoot,toolCatalog:t.toolCatalog});t.setManager(r),Vt(async()=>{await r.disconnectAll()});let n=()=>r;t.toolCatalog.addTool(GA(n)),t.toolCatalog.addTool(KA(n)),t.toolCatalog.addTool(XH(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 zH(t){let e=t.getUserMcpConfigPath();try{if(Ea.existsSync(e))return JSON.parse(Ea.readFileSync(e,"utf8"))}catch{}}function VH(t){let e=VA(Pp(t.turnMcpConfig??{}),t.projectRoot),r=VA(Pp(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 XH(t,e){return zA({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(`
1108
1108
  `)}}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 vt from"node:fs";import*as Pn from"node:path";import{pathToFileURL as YH}from"node:url";var YA={preToolUse:"tool.before_invoke",postToolUse:"tool.after_invoke",onTurnStart:"turn.submitted",onTurnEnd:"turn.completed",onSessionEnd:"session.ended"};var Ma=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(!vt.existsSync(e))continue;let r;try{r=vt.readdirSync(e,{withFileTypes:!0})}catch{continue}for(let n of r){if(!n.isDirectory()||n.name.startsWith(".")||n.name.startsWith("_"))continue;let o=Pn.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(!vt.existsSync(n))continue;let o;try{o=vt.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=Pn.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=Pn.join(r,b);if(vt.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=Pn.join(r,"config.json");if(vt.existsSync(g))try{f=JSON.parse(vt.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(YH(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=Pn.join(r,"assistants.json");if(!vt.existsSync(n))return{found:!1,count:0};try{let o=jl(vt.readFileSync(n,"utf8")),s=ro(e,n,o);return this.pluginAssistants=[...this.pluginAssistants.filter(i=>i.pluginId!==e),...s],{found:!0,count:s.length}}catch(o){return ro(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):ti(e)}removeRegisteredTool(e){return this.config.toolCatalog?.removeTool(e)??dn(e)}};import*as fe from"node:fs";import*as Uo from"node:path";function xp(){return I().getUserPluginCacheDir()}function JA(){return Uo.join(xp(),"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 JH(t){let e=xp();fe.existsSync(e)||fe.mkdirSync(e,{recursive:!0}),fe.writeFileSync(JA(),JSON.stringify(t,null,2),"utf-8")}function QH(t,e){return!(e.blocklist?.includes(t)||e.allowlist&&!e.allowlist.includes(t))}async function ZH(t,e,r){let{execFile:n}=await import("node:child_process"),{promisify:o}=await import("node:util"),s=o(n),i=xp(),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(`
1109
1109
  `).pop()?.trim();if(!l)return r.warn(`[marketplace] npm pack returned no output for ${a}`),null;let d=Uo.join(i,l),u=l.match(/^(.+)-(\d+\.\d+\.\d+.*)\.tgz$/)?.[2]??"0.0.0",m=Uo.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=Uo.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 eB(){return QA().plugins.filter(e=>fe.existsSync(e.installPath)).map(e=>e.installPath)}async function tB(t,e){let r=QA(),n=[];for(let o of t.enabledPlugins){let s=o.specifier.split("/").pop()??o.specifier;if(!QH(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 ZH(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 JH(r),n}function rB(){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=eB();r.push(...n);let o=rB();if(o&&o.enabledPlugins.length>0)try{let s=await tB(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 nB={id:"plugin-tools",kind:"plugin",register:oB};function tP(t){nB.register(t)}function oB(t){let e=sB(t.config,t.pathService);ZA(e,t.log).then(r=>{if(r.length===0)return;let n=new Ma({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 sB(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=iB(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 iB(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=Co(t.config.permissions),r=ZS(e);if(yi(e.mode==="full_access"),rP()){let o=ib();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 ji(t.getActiveProjectRoot()),sessionId:t.sessionId,getTurnId:t.getTurnId,communityTelemetryRecorder:Us()??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 xn from"node:fs";import*as Da from"node:path";var _a=class{filePath;constructor(e={}){this.filePath=e.filePath??Da.join(B(e.ownerUserId),"community","discovery-cache.json")}readAll(){try{let e=JSON.parse(xn.readFileSync(this.filePath,"utf8"));return Array.isArray(e)?e.filter(aB):[]}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 xn.mkdirSync(Da.dirname(this.filePath),{recursive:!0}),xn.writeFileSync(this.filePath,`${JSON.stringify(s,null,2)}
1110
- `,"utf8"),o}};function aB(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 Na=class{client;cache;localIndex;topK;now;inMemory=new Map;constructor(e){this.client=e.client,this.cache=e.cache??new _a,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 cP(t){let e=Cp(t.log);t.taskStore.setHooks(e,t.sessionId),ub({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=zw({hooks:e,currentUserId:t.currentUserId,log:t.log,prefetchState:t.prefetchState,getLastUserMessage:t.getLastUserMessage,getLastAssistantMessage:t.getLastAssistantMessage,resolveSmallModelClient:t.resolveSmallModelClient});return rh(e,{currentCwd:t.projectRoot,communityDiscovery:new Na({client:Lt()}),log:{debug:n=>t.log.debug(n),warn:n=>t.log.warn(n)}}),Zg(e,t.log,{transport:t.compressionClient.transport,apiKey:t.compressionClient.apiKey}),Vw({memdir:t.memdir,memoryProvider:r.toolProvider,memoryUserId:r.userId,toolCatalog:t.toolCatalog}),Lm(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 cB}from"node:fs";import{stat as lB}from"node:fs/promises";import{join as lP,relative as dB,resolve as uB}from"node:path";var pB=[`${Gt}/settings.json`,"INSTRUCTIONS.md",`${Gt}/INSTRUCTIONS.md`,"INSTRUCTIONS.local.md",`${Gt}/rules`],mB=["INSTRUCTIONS.md","INSTRUCTIONS.local.md",`${Gt}/rules`],Ip=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 pB){let r=lP(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=cB(e,{persistent:!1,recursive:r.includes("/")?!1:void 0},(o,s)=>{let i=s?lP(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 lB(e)}catch{o="deleted"}let s=dB(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(()=>{}),mB.some(a=>s.includes(a)||e.includes(a))&&this.deps.onInstructionCacheReset?.()},300))}setCwd(e){let r=uB(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 dP(t){let e=new Ip(t);return await e.start(),e}import{watch as gB}from"node:fs";import{readFile as fB}from"node:fs/promises";function hB(t){return I().getProjectSettingsPath(t)}async function yB(t){try{let e=await fB(t,"utf-8");return JSON.parse(e)}catch{return null}}function vB(t,e,r,n){let o=!1,s=bB(t);s&&(s.mode!==e.getMode()&&(e.setMode(s.mode),n?.(`settings: permission mode -> ${s.mode}`),o=!0),kB(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 uP(t){let e=hB(t.projectRoot),r=null,n=null,o=async()=>{let s=await yB(e);s&&vB(s,t.ruleEngine,t.hooks,t.log)};o().catch(()=>{});try{r=gB(e,{persistent:!1},()=>{n&&clearTimeout(n),n=setTimeout(()=>{o().catch(()=>{})},200)}),r.on("error",()=>{})}catch{}return()=>{n&&clearTimeout(n),r?.close(),r=null}}function bB(t){return RB(t),t.permissions&&typeof t.permissions=="object"?Li(t.permissions):null}function kB(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 RB(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 pP(t){let e=typeof t.config.workdir=="string"?t.config.workdir:process.cwd(),r=uP({projectRoot:e,ruleEngine:t.ruleEngine,hooks:t.hooks,log:n=>t.log.info(`[settings] ${n}`)});Vt(async()=>{r()}),t.currentFileWatcher?.stop(),t.setFileWatcher(null),dP({projectRoot:e,sessionId:t.sessionId,hooks:t.hooks,log:n=>t.log.debug(n),onInstructionCacheReset:TT}).then(n=>{t.setFileWatcher(n),Vt(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 SB="skill",TB={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(`
1110
+ `,"utf8"),o}};function aB(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 Na=class{client;cache;localIndex;topK;now;inMemory=new Map;constructor(e){this.client=e.client,this.cache=e.cache??new _a,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 cP(t){let e=Cp(t.log);t.taskStore.setHooks(e,t.sessionId),ub({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=zw({hooks:e,currentUserId:t.currentUserId,log:t.log,prefetchState:t.prefetchState,getLastUserMessage:t.getLastUserMessage,getLastAssistantMessage:t.getLastAssistantMessage,resolveSmallModelClient:t.resolveSmallModelClient});return rh(e,{currentCwd:t.projectRoot,communityDiscovery:new Na({client:Lt()}),log:{debug:n=>t.log.debug(n),warn:n=>t.log.warn(n)}}),Zg(e,t.log,{transport:t.compressionClient.transport,apiKey:t.compressionClient.apiKey}),Vw({memdir:t.memdir,memoryProvider:r.toolProvider,memoryUserId:r.userId,toolCatalog:t.toolCatalog}),Lm(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 cB}from"node:fs";import{stat as lB}from"node:fs/promises";import{join as lP,relative as dB,resolve as uB}from"node:path";var pB=[`${Gt}/settings.json`,"INSTRUCTIONS.md",`${Gt}/INSTRUCTIONS.md`,"INSTRUCTIONS.local.md",`${Gt}/rules`],mB=["INSTRUCTIONS.md","INSTRUCTIONS.local.md",`${Gt}/rules`],Ip=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 pB){let r=lP(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=cB(e,{persistent:!1,recursive:r.includes("/")?!1:void 0},(o,s)=>{let i=s?lP(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 lB(e)}catch{o="deleted"}let s=dB(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(()=>{}),mB.some(a=>s.includes(a)||e.includes(a))&&this.deps.onInstructionCacheReset?.()},300))}setCwd(e){let r=uB(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 dP(t){let e=new Ip(t);return await e.start(),e}import{watch as gB}from"node:fs";import{readFile as fB}from"node:fs/promises";function hB(t){return I().getProjectSettingsPath(t)}async function yB(t){try{let e=await fB(t,"utf-8");return JSON.parse(e)}catch{return null}}function vB(t,e,r,n){let o=!1,s=bB(t);s&&(s.mode!==e.getMode()&&(e.setMode(s.mode),n?.(`settings: permission mode -> ${s.mode}`),o=!0),kB(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 uP(t){let e=hB(t.projectRoot),r=null,n=null,o=async()=>{let s=await yB(e);s&&vB(s,t.ruleEngine,t.hooks,t.log)};o().catch(()=>{});try{r=gB(e,{persistent:!1},()=>{n&&clearTimeout(n),n=setTimeout(()=>{o().catch(()=>{})},200)}),r.on("error",()=>{})}catch{}return()=>{n&&clearTimeout(n),r?.close(),r=null}}function bB(t){return RB(t),t.permissions&&typeof t.permissions=="object"?Li(t.permissions):null}function kB(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 RB(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 pP(t){let e=typeof t.config.workdir=="string"?t.config.workdir:process.cwd(),r=uP({projectRoot:e,ruleEngine:t.ruleEngine,hooks:t.hooks,log:n=>t.log.info(`[settings] ${n}`)});Vt(async()=>{r()}),t.currentFileWatcher?.stop(),t.setFileWatcher(null),dP({projectRoot:e,sessionId:t.sessionId,hooks:t.hooks,log:n=>t.log.debug(n),onInstructionCacheReset:TT}).then(n=>{t.setFileWatcher(n),Vt(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 Se from"node:path";var SB="skill",TB={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(`
1111
1111
  `)},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 mP(t){return{name:SB,label:"Skill",description:IB(t),parameters:TB,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 wB(t,r,n);case"list":return AB(t,r);case"view":return PB(t,r);case"create":case"edit":case"patch":case"delete":return xB(t,r);case"promote":return CB(t,r);default:return{content:[{type:"text",text:`Unknown action: ${o}. Use invoke, list, view, create, edit, patch, delete, or promote.`}]}}}}}async function wB(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}
1112
1112
 
1113
1113
  `,a=o?`
@@ -1127,9 +1127,9 @@ CROSS-PROJECT RECALL: When you see '[Cross-project skill available]' in recalled
1127
1127
  `);return`${r}
1128
1128
 
1129
1129
  Available skills:
1130
- ${n}`}import{randomUUID as OB}from"node:crypto";var EB=10080*60*1e3;function MB(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=Ep(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=Ep(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??EB,s=[];for(let i of Object.values(e.records)){if(!_B(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 gP(){let t=Lt();return t?MB(t):null}function Ep(t){return t?.source!=="installed"||t.registrySourceTier==="official"?null:t.registryResourceId??t.name}function _B(t,e,r){if(!Ep(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 fP(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 hP(){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 DB(t={}){let e=t.availability??fP({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:LB(r,e.available?"allowed":"blocked",o)}}let n=r.riskTier??"unknown";return!NB(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 yP(){return DB()}function NB(t){return t==="R2"||t==="R3"}function LB(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:hP()}}async function kP(t){let{host:e,toolCatalog:r,skillName:n,skillContent:o,userArgs:s,signal:i}=t,a=`skill_${n}_${OB().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??gP(),m=(t.skillSandbox??yP()).decide({origin:SP(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=RP(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 vP(e,d,a,f,"normal"),bP(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 vP(e,d,a,f,R?"error":"normal",R),R?(Ku(l,n,!1),await u?.recordSkillUsage(p,"error"),`[skill "${n}"] error: ${R}`):(bP(l,n,!0),await u?.recordSkillUsage(p,"success"),v.join("")||`[skill "${n}"] completed (no output)`)}function RP(t,e){return jB(e)?`community-skill:${t}`:`skill:${t}`}function jB(t){return SP(t)}function SP(t){return t?.source!=="installed"?!1:t.registrySourceTier!=="official"}function vP(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 bP(t,e,r){Ku(t,e,r);let n=ue(t);ch(n,e),he(t,n)}var $B={id:"skill-meta-tool",kind:"skill",register:({host:t,...e})=>UB(t,e)};function TP(t,e){$B.register({...e,host:t})}function UB(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(mP({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(`---
1130
+ ${n}`}import{randomUUID as OB}from"node:crypto";var EB=10080*60*1e3;function MB(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=Ep(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=Ep(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??EB,s=[];for(let i of Object.values(e.records)){if(!_B(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 gP(){let t=Lt();return t?MB(t):null}function Ep(t){return t?.source!=="installed"||t.registrySourceTier==="official"?null:t.registryResourceId??t.name}function _B(t,e,r){if(!Ep(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 fP(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 hP(){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 DB(t={}){let e=t.availability??fP({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:LB(r,e.available?"allowed":"blocked",o)}}let n=r.riskTier??"unknown";return!NB(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 yP(){return DB()}function NB(t){return t==="R2"||t==="R3"}function LB(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:hP()}}async function kP(t){let{host:e,toolCatalog:r,skillName:n,skillContent:o,userArgs:s,signal:i}=t,a=`skill_${n}_${OB().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??gP(),m=(t.skillSandbox??yP()).decide({origin:SP(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=RP(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 vP(e,d,a,f,"normal"),bP(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 vP(e,d,a,f,R?"error":"normal",R),R?(Ku(l,n,!1),await u?.recordSkillUsage(p,"error"),`[skill "${n}"] error: ${R}`):(bP(l,n,!0),await u?.recordSkillUsage(p,"success"),v.join("")||`[skill "${n}"] completed (no output)`)}function RP(t,e){return jB(e)?`community-skill:${t}`:`skill:${t}`}function jB(t){return SP(t)}function SP(t){return t?.source!=="installed"?!1:t.registrySourceTier!=="official"}function vP(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 bP(t,e,r){Ku(t,e,r);let n=ue(t);ch(n,e),he(t,n)}var $B={id:"skill-meta-tool",kind:"skill",register:({host:t,...e})=>UB(t,e)};function TP(t,e){$B.register({...e,host:t})}function UB(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(mP({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=Se.basename(c);i.some(d=>d.name===l)||i.push({name:l,source:"gateway",filePath:Se.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=Se.join(d,u.name,"SKILL.md");try{let f=await le.promises.readFile(m,"utf8"),g=Se.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
1131
  `)?f.indexOf("---",4):-1,C=(R>=0?f.slice(R+3).trimStart():f).split(`
1132
- `).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)=>kP({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=Hs(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"}}),mt(),Ct(h,i.name,"created"),he(p,h);let b=t.getMemoryLearningSink(),v=t.getMemoryUserId();if(b&&v){let S=f.split(`
1133
- `).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}),js(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"}}),mt(),{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"}}),mt(),{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 wP(t){let e=cP({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 TP({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(()=>{}),pP({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 AP(t){let{provider:e,model:r,apiKey:n,baseUrl:o}=t.resolvedConfig,s=Zs({provider:e,model:r,apiKey:n,baseUrl:o},t.providerRegistry);return s.transport=yv(s.transport,t.sessionId||"default"),{transport:s.transport,apiKey:n,model:r,provider:e,baseUrl:o??""}}function PP(t){return{agent:new Sr({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:ks()}),...t.client}}import{randomUUID as FB}from"node:crypto";async function xP(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(`
1132
+ `).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=Se.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?Se.join(c,i,a):Se.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)=>kP({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=Se.join(c,i.name),d=Se.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=Hs(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"}}),mt(),Ct(h,i.name,"created"),he(p,h);let b=t.getMemoryLearningSink(),v=t.getMemoryUserId();if(b&&v){let S=f.split(`
1133
+ `).slice(0,3).join(" ").slice(0,200),T=a?Se.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}),js(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"}}),mt(),{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=Se.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=Se.join(l,i);await le.promises.mkdir(d,{recursive:!0});let p=Se.join(a,i),u=await le.promises.readdir(p);for(let m of u){let f=await le.promises.readFile(Se.join(p,m));await le.promises.writeFile(Se.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"}}),mt(),{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 wP(t){let e=cP({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 TP({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(()=>{}),pP({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 AP(t){let{provider:e,model:r,apiKey:n,baseUrl:o}=t.resolvedConfig,s=Zs({provider:e,model:r,apiKey:n,baseUrl:o},t.providerRegistry);return s.transport=yv(s.transport,t.sessionId||"default"),{transport:s.transport,apiKey:n,model:r,provider:e,baseUrl:o??""}}function PP(t){return{agent:new Sr({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:ks()}),...t.client}}import{randomUUID as FB}from"node:crypto";async function xP(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(`
1134
1134
  `),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 CP(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_${FB().slice(0,8)}`;try{let a=JSON.parse(n),c=await s.execute(i,a,o);return await xP({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 IP(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=CP({mediaPersistence:t.mediaPersistence,toolCatalog:t.toolCatalog,getSessionId:()=>t.sessionId,log:i=>t.log(i),sendNotification:t.sendNotification}),n=AP({resolvedConfig:t.resolvedTextConfig,providerRegistry:t.providerRegistry,sessionId:t.sessionId}),o=wP({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:PP({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 BB=HB(import.meta.url);function qB(){for(let t of["../package.json","../../package.json"])try{return BB(t).version}catch{}return"0.0.0"}var EP=qB();var WB=new Set(["thread.user_response","tool.approval.response"]);var _p=class{running=!1;startedAt=Date.now();packageVersion=EP;rpcContract=new Xn;rpcIds=new Map;rpcDeadlineTimers=new Map;activeTurn=null;turnDone=Promise.resolve();verbose;transport;runtimeServices;runtimeSession=new ra;agent=null;lastLlmConfigKey="";currentSessionId="";currentTurnId="";currentTransport=null;currentApiKey="";currentModel="";currentProvider="";currentBaseUrl="";sessionState=null;currentMediaApiKeys=null;taskStore=new as;memoryPrefetchState=bt();lastUserMessageForAutoExtract;lastAssistantMessageForExtract;memdir=null;projectMemoryStoreFactory=Sw();pendingAskUser=new Map;sessionTaskDomain;multiAgentHandlerHost;acpServer=null;sessionHistory=new ia;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 ca({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 aa({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:()=>Mp.join(this.pathService.getProjectAgentDir(this.getActiveProjectRoot()),"memory"),resolveTranscriptDir:()=>this.pathService.getProjectSessionsRoot(this.getActiveProjectRoot()),listRecentSessions:()=>kt(20,this.getActiveProjectRoot()),runDream:r=>on.call(this.createDreamHandlerHost(),r)}),D().onChange(()=>{this.lastLlmConfigKey=""}),this.ensureModelRegistryHydrated().catch(()=>{}),this.idleDreamCoordinator.applyEnvOverrides(process.env),this.transport=e.transport??new qn({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 Vn(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(vl(e)||Jn(e)){this.acpServer.dispatchMessage(e);return}if(Yn(e)){let r=e.method;if(r==="initialize"||r.startsWith("session/")||r.startsWith("x/")||r.startsWith("fs/")){this.acpServer.dispatchMessage(e);return}}}if(!hl(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 Qm(),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&&!WB.has(e.method)){let n=ms(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=IP({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:()=>Mp.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)fg(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})}
1135
1135
  `)}enableIdleDream(e){this.idleDreamCoordinator.enable(e)}cancelIdleDreamTimer(){this.idleDreamCoordinator.cancelTimer()}disposeSessionRuntime(){this.runtimeSession.unregisterPermissions(),this.closeMemoryProviders(),this.agent=null,this.lastLlmConfigKey="",this.memoryPrefetchState=bt(),this.runtimeSession.resetAfterSessionDispose()}closeMemoryProviders(){this.runtimeServices.closeMemoryProviders({memoryProvider:this.memoryProvider,memoryDreamProvider:this.memoryDreamProvider}),this.runtimeSession.resetMemoryProviders()}initAcpServer(){let e=ow(this,EP,this.createAcpExtendedHandlerHost());this.acpServer=new fs(this.transport,e,{verbose:this.verbose})}getAcpServer(){return this.acpServer}};export{Sr as Agent,_p as StdioServer,qn as StdioTransport,$n as buildSkillInstruction,Cp as createHookRegistry,DC as parseCliArgs};