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/cli.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var KA=Object.defineProperty;var Go=(t,e)=>()=>(t&&(e=t(t=0)),e);var zA=(t,e)=>{for(var r in e)KA(t,r,{get:e[r],enumerable:!0})};import{homedir as _x}from"node:os";import{join as re}from"node:path";import{existsSync as Dx}from"node:fs";function X(){return process.env.QLOGICAGENT_HOME||re(_x(),Kt)}function Vr(){let t=process.env.QLOGIC_LLMROUTER_USER_ID?.trim();if(t)return t;let e=process.env.QLOGIC_IMPLICIT_OWNER_ID?.trim();if(e)return e;let r=process.env.QLOGIC_DEVICE_ID?.trim();return r?`oc_${r}`:"oc_local"}function Nx(t){let e=t.trim();if(!e)throw new Error("ownerUserId is required for profile-scoped storage");return encodeURIComponent(e).replace(/\./g,"%2E")}function B(t=Vr()){return re(X(),"profiles",Nx(t))}function nm(t=Vr()){return re(B(t),"memory")}function Xo(){return re(B(),"plugins")}function sr(){return re(B(),"skills")}function Ue(){return re(B(),"settings.json")}function om(){return re(B(),"plugin-cache")}function sm(){return re(B(),"mcp.json")}function im(){return re(B(),"marketplace.json")}function Nn(){return re(B(),"assistant-presets.json")}function am(){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,Kt)}function Yo(t){return re(De(t),"plugins")}function ir(t){return re(De(t),"skills")}function cm(t){return re(De(t),"settings.json")}function br(t){return re(De(t),"INSTRUCTIONS.md")}function Xr(t){return re(De(t),"rules")}function Jo(t){return re(De(t),"sessions")}function lm(t,e){let r=re(De(t),"checkpoints");return e?re(r,e):r}function dm(t){return re(t,Kt,"hooks")}function Cc(t,e){return t.filter(r=>r!==e&&Dx(re(r,Kt,"skills")))}function um(t,e){return Cc(t,e).map(r=>ir(r))}var Kt,G=Go(()=>{"use strict";Kt=".qlogicagent"});import{ProviderRegistry as Bx,ProviderVariantResolver as qx}from"@xiaozhiclaw/provider-core";var es,km=Go(()=>{"use strict";es=class{registry=new Bx;resolver=new qx(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 ts,Rm=Go(()=>{"use strict";ts=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 Tm={};zA(Tm,{ALL_PURPOSES:()=>jn,ModelRegistry:()=>rs,deriveModelPurposes:()=>Sm,getModelRegistry:()=>D,resetModelRegistry:()=>Wx});import*as Qe from"node:fs";function D(){return On||(On=new rs,On.load()),On}function Wx(){On=null}function Sm(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 Gx(t){switch(t){case"openai-chat":case"openai-responses":case"anthropic-messages":case"volcengine-responses":return t;default:return}}function Kx(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 Gx(e)}}function zx(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 jn,rs,On,He=Go(()=>{"use strict";G();km();Rm();jn=["textGeneration","smallModel","stt","tts","imageGeneration","imageUnderstanding","videoGeneration","videoUnderstanding","threeDGeneration","embedding","voiceClone","musicGeneration","realtimeAudio","realtimeVideo"],rs=class{keyPool;providerCatalog=new es;models=new Map;modelEnabledOverrides=new Map;bindings={};settingsPath;changeListeners=[];constructor(e){this.settingsPath=Ue(),this.keyPool=new ts(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 jn){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:Kx(r,e.transport),capabilities:zx(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:Sm(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{}}},On=null});import{createRequire as JB}from"node:module";import{createInterface as VA}from"node:readline";var Gr=class{messageHandler=null;closeHandler=null;verbose;constructor(e){this.verbose=e?.verbose??!1}onMessage(e){this.messageHandler=e}onClose(e){this.closeHandler=e}send(e){process.stdout.write(`${JSON.stringify(e)}
|
|
2
|
+
var KP=Object.defineProperty;var Go=(t,e)=>()=>(t&&(e=t(t=0)),e);var zP=(t,e)=>{for(var r in e)KP(t,r,{get:e[r],enumerable:!0})};import{homedir as _x}from"node:os";import{join as re}from"node:path";import{existsSync as Dx}from"node:fs";function X(){return process.env.QLOGICAGENT_HOME||re(_x(),Kt)}function Vr(){let t=process.env.QLOGIC_LLMROUTER_USER_ID?.trim();if(t)return t;let e=process.env.QLOGIC_IMPLICIT_OWNER_ID?.trim();if(e)return e;let r=process.env.QLOGIC_DEVICE_ID?.trim();return r?`oc_${r}`:"oc_local"}function Nx(t){let e=t.trim();if(!e)throw new Error("ownerUserId is required for profile-scoped storage");return encodeURIComponent(e).replace(/\./g,"%2E")}function B(t=Vr()){return re(X(),"profiles",Nx(t))}function nm(t=Vr()){return re(B(t),"memory")}function Xo(){return re(B(),"plugins")}function sr(){return re(B(),"skills")}function Ue(){return re(B(),"settings.json")}function om(){return re(B(),"plugin-cache")}function sm(){return re(B(),"mcp.json")}function im(){return re(B(),"marketplace.json")}function Nn(){return re(B(),"assistant-presets.json")}function am(){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,Kt)}function Yo(t){return re(Ne(t),"plugins")}function ir(t){return re(Ne(t),"skills")}function cm(t){return re(Ne(t),"settings.json")}function br(t){return re(Ne(t),"INSTRUCTIONS.md")}function Xr(t){return re(Ne(t),"rules")}function Jo(t){return re(Ne(t),"sessions")}function lm(t,e){let r=re(Ne(t),"checkpoints");return e?re(r,e):r}function dm(t){return re(t,Kt,"hooks")}function Cc(t,e){return t.filter(r=>r!==e&&Dx(re(r,Kt,"skills")))}function um(t,e){return Cc(t,e).map(r=>ir(r))}var Kt,G=Go(()=>{"use strict";Kt=".qlogicagent"});import{ProviderRegistry as Bx,ProviderVariantResolver as qx}from"@xiaozhiclaw/provider-core";var es,km=Go(()=>{"use strict";es=class{registry=new Bx;resolver=new qx(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 ts,Rm=Go(()=>{"use strict";ts=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 Tm={};zP(Tm,{ALL_PURPOSES:()=>jn,ModelRegistry:()=>rs,deriveModelPurposes:()=>Sm,getModelRegistry:()=>D,resetModelRegistry:()=>Wx});import*as Qe from"node:fs";function D(){return On||(On=new rs,On.load()),On}function Wx(){On=null}function Sm(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 Gx(t){switch(t){case"openai-chat":case"openai-responses":case"anthropic-messages":case"volcengine-responses":return t;default:return}}function Kx(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 Gx(e)}}function zx(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 jn,rs,On,He=Go(()=>{"use strict";G();km();Rm();jn=["textGeneration","smallModel","stt","tts","imageGeneration","imageUnderstanding","videoGeneration","videoUnderstanding","threeDGeneration","embedding","voiceClone","musicGeneration","realtimeAudio","realtimeVideo"],rs=class{keyPool;providerCatalog=new es;models=new Map;modelEnabledOverrides=new Map;bindings={};settingsPath;changeListeners=[];constructor(e){this.settingsPath=Ue(),this.keyPool=new ts(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 jn){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:Kx(r,e.transport),capabilities:zx(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:Sm(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{}}},On=null});import{createRequire as JB}from"node:module";import{createInterface as VP}from"node:readline";var Gr=class{messageHandler=null;closeHandler=null;verbose;constructor(e){this.verbose=e?.verbose??!1}onMessage(e){this.messageHandler=e}onClose(e){this.closeHandler=e}send(e){process.stdout.write(`${JSON.stringify(e)}
|
|
3
3
|
`)}start(){process.stdin.on("data",r=>{process.stderr.write(`[transport] raw stdin data (${r.length} bytes): ${r.toString().slice(0,300)}
|
|
4
|
-
`)});let e=
|
|
4
|
+
`)});let e=VP({input:process.stdin,crlfDelay:Number.POSITIVE_INFINITY});e.on("line",r=>{let n=r.trim();if(n){process.stderr.write(`[transport] line: ${n.slice(0,300)}
|
|
5
5
|
`);try{let o=JSON.parse(n);this.messageHandler?.(o)}catch{this.log(`invalid JSON on stdin: ${n.slice(0,200)}`)}}}),e.on("close",()=>{this.closeHandler?.()})}close(){}log(e){this.verbose&&process.stderr.write(`[transport] ${e}
|
|
6
|
-
`)}};import{readFile as Bp,readdir as
|
|
7
|
-
`),l=null;for(let p=0;p<Math.min(c.length,lt.HEADER_LINES);p++){let u=c[p].trim();if(!(!u||u.startsWith("#")||u.startsWith("---"))){l=u.slice(0,150);break}}let d=tx(o);return{filename:o,filePath:s,mtimeMs:i.mtimeMs,sizeBytes:i.size,description:l,category:d}}))).filter(o=>o.status==="fulfilled").map(o=>o.value).sort((o,s)=>s.mtimeMs-o.mtimeMs).slice(0,lt.MAX_SCAN_FILES)}function
|
|
6
|
+
`)}};import{readFile as Bp,readdir as XP,stat as YP}from"node:fs/promises";import{existsSync as qp}from"node:fs";import{join as JP}from"node:path";var lt={MAX_SCAN_FILES:100,MAX_SELECTED:5,MAX_FILE_BYTES:4096,MAX_TOTAL_BYTES:20*1024,MIN_SCORE:.2,HEADER_LINES:10,RECENCY_DAYS:7,RECENCY_BOOST:.15};async function Wp(t,e,r=new Set){if(!t.trim()||!qp(e))return[];let n=t.trim().split(/\s+/);if(n.length<2&&n[0].length<4)return[];let o=await QP(e);if(o.length===0)return[];let s=o.filter(c=>!r.has(c.filePath));if(s.length===0)return[];let a=ZP(t,s).filter(c=>c.score>=lt.MIN_SCORE).slice(0,lt.MAX_SELECTED);return a.length===0?[]:ex(a)}async function QP(t){if(!qp(t))return[];let e;try{e=await XP(t)}catch{return[]}let r=e.filter(o=>o.endsWith(".md")&&o!=="INDEX.md");return(await Promise.allSettled(r.map(async o=>{let s=JP(t,o),i=await YP(s),c=(await Bp(s,"utf-8")).split(`
|
|
7
|
+
`),l=null;for(let p=0;p<Math.min(c.length,lt.HEADER_LINES);p++){let u=c[p].trim();if(!(!u||u.startsWith("#")||u.startsWith("---"))){l=u.slice(0,150);break}}let d=tx(o);return{filename:o,filePath:s,mtimeMs:i.mtimeMs,sizeBytes:i.size,description:l,category:d}}))).filter(o=>o.status==="fulfilled").map(o=>o.value).sort((o,s)=>s.mtimeMs-o.mtimeMs).slice(0,lt.MAX_SCAN_FILES)}function ZP(t,e){let r=Fa(t);if(r.length===0)return[];let n=Date.now(),o=lt.RECENCY_DAYS*24*60*60*1e3;return e.map(i=>{let a=0,c=Fa(i.filename.replace(/\.md$/,"").replace(/[-_]/g," ")),l=r.filter(d=>c.some(p=>p.includes(d)||d.includes(p))).length;if(a+=Math.min(.5,l/r.length*.5),i.description){let d=Fa(i.description),p=r.filter(u=>d.some(m=>m.includes(u)||u.includes(m))).length;a+=Math.min(.3,p/r.length*.3)}return i.category&&rx(t).includes(i.category)&&(a+=.1),n-i.mtimeMs<o&&(a+=lt.RECENCY_BOOST),{header:i,score:a}}).sort((i,a)=>a.score-i.score)}async function ex(t){let e=[],r=0;for(let{header:n,score:o}of t){if(r>=lt.MAX_TOTAL_BYTES)break;try{let s=await Bp(n.filePath,"utf-8"),i=!1;s.length>lt.MAX_FILE_BYTES&&(s=s.slice(0,lt.MAX_FILE_BYTES)+`
|
|
8
8
|
|
|
9
9
|
> [Truncated at ${lt.MAX_FILE_BYTES} bytes. Use memory tool read_file for full content: ${n.filename}]`,i=!0);let a=Buffer.byteLength(s,"utf-8");if(r+a>lt.MAX_TOTAL_BYTES){let c=lt.MAX_TOTAL_BYTES-r;s=s.slice(0,c)+`
|
|
10
10
|
|
|
@@ -32,19 +32,19 @@ Assistant response:
|
|
|
32
32
|
Today's date: {today}
|
|
33
33
|
|
|
34
34
|
Respond ONLY with a JSON array (or empty array [] if nothing worth extracting):
|
|
35
|
-
[{"text": "...", "category": "personal_fact|preference|event|lesson", "importance": 0.5-0.9, "eventDate": "YYYY-MM-DD or null"}]`;async function cx(t,e,r){let n=ax.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:lx(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 lx(t){return new Set(["personal_fact","preference","event","lesson","pattern","decision"]).has(t)?t:"personal_fact"}async function Vp(t,e){if(!Ba(t.userMessage))return 0;if(e.log.debug(`implicit-extract: signal detected in user message (${t.userMessage.slice(0,50)}...)`),!e.llmExtract)return e.log.debug("implicit-extract: no LLM extractor configured, skipping Layer 2"),0;let r=new Date().toISOString().slice(0,10),n=await cx(t,e.llmExtract,r);if(n.length===0)return e.log.debug("implicit-extract: LLM returned no facts"),0;let o=0;for(let s of n)try{if(!e.localProvider.proposeExtracted)continue;if(((await e.localProvider.proposeExtracted([{text:s.text,category:s.category,importance:s.importance}],e.userId,{source:"implicit-extract"})).proposalsAdded??0)>0){if(o++,e.log.debug(`implicit-extract: proposed "${s.text.slice(0,60)}..." [${s.category}]`),s.category==="event")try{let a=e.localProvider.findRelatedEvents?await e.localProvider.findRelatedEvents(s.text,e.userId):[];for(let c of a)e.localProvider.feedback?.([c.id],"useful").catch(()=>{});a.length>0&&e.log.debug(`implicit-extract: linked to ${a.length} related events`)}catch{}}else e.log.debug(`implicit-extract: dedup skipped "${s.text.slice(0,40)}..."`)}catch{}return o}var qa=Math.min(Math.max(1,Number(process.env.TOOL_LOOP_DEFAULT_BUDGET)||25),100),Wa=3,Ga=2,Ko=2,Ka=128e3,za=13e3,Va=16384,Xa=65536,Ya=3,Ja=65536,zo=500,Qa=3,Za=5e4,ec=2e5,Vo=2e3,tc=3e4,rc=3,Kr=2,dx=3e5,ux=216e5,px=.75,mx=16e3,gx=12e4,fx=3,hx=4,yx=50,nc=20,Xp=50,oc=3,sc=2,ic=300*1e3,Yp=3,Jp=720*60*60*1e3,vx=4e3,bx=5,ac=3,cc=800,lc=300*1e3,dc=4,uc=0,pc=50,mc=50,gc=30,Qp=3600*1e3,Zp=200,fc=5,kx=4e4,hc=50*1024,yc=500*1024,vc=500*1024*1024,Rx=50*1024*1024,bc=3e5,kc=2,Rc=3e3,Sc=3,Tc=5e3,Sx=1e3,Tx=3e3,wx=3e4,wc=60*1024,Pc=10,Ac=100,Px=24,Ax=5,xx=6e5,Cx=30,Ix=144e5,Ex=3e5;function xc(){return{maxRoundsLimit:100,defaultMaxRounds:25,defaultTemperature:0,maxToolBudgetCap:100,defaultToolBudget:qa,maxConsecutiveFailures:Wa,maxIdenticalCallRepeats:Ga,defaultContextWindowTokens:Ka,responseBufferTokens:za,defaultMaxOutputTokens:Va,defaultModelMaxOutputTokens:Xa,maxOutputTokensRecoveryLimit:Ya,escalatedMaxOutputTokens:Ja,diminishingReturnsThreshold:zo,diminishingReturnsMinContinuations:Qa,defaultMaxResultSizeChars:Za,maxToolResultsPerMessageChars:ec,toolResultPreviewBytes:Vo,heartbeatIntervalMs:tc,max529Retries:rc,maxApiRetries:Kr,persistentRetryMaxBackoffMs:dx,persistentRetryResetCapMs:ux,compressionTargetUsageRatio:px,compressionMinBudget:mx,compressionMaxBudget:gx,reactiveCompactMaxFailures:fx,reactiveCompactMinMessages:hx,reactiveCompactTargetPercent:yx,maxSkillsPerProject:nc,maxSkillsGlobal:Xp,minToolCallsForSkill:oc,minDistinctToolsForSkill:sc,skillCreationCooldownMs:ic,skillInjectionMaxChars:vx,skillInjectionMaxCount:bx,skillRecallMaxSkills:ac,skillRecallMaxContentChars:cc,skillRecallCacheTtlMs:lc,maxForkDepth:dc,maxSessions:pc,taskSummaryTurnThreshold:mc,taskSummaryRegenInterval:gc,maxIncludeDepth:fc,maxInstructionChars:kx,instructionsMaxFileSize:hc,instructionsMaxDirSize:yc,mediaMaxDownloadSize:vc,mediaMaxUploadSize:Rx,mediaDownloadTimeoutMs:bc,acpMaxSpawnRetries:kc,acpRetryBackoffBase:Rc,acpRuntimeRestartMax:Sc,acpRuntimeRestartBackoffBase:Tc,taskPollIntervalMs:Sx,taskStoppedDisplayMs:Tx,taskPanelGraceMs:wx,memoryPrefetchMaxSessionBytes:wc,memoryPrefetchLimitPerRecall:Pc,memoryMaxSurfacedEntries:Ac,dreamMinIntervalHours:Px,dreamMinSessions:Ax,dreamScanIntervalMs:xx,idleDreamMinutes:Cx,dreamCooldownMs:Ix,dreamMaxDurationMs:Ex,teamBudgetTokens:uc}}var zr={MAX_SESSION_BYTES:wc,LIMIT_PER_RECALL:Pc,MAX_SURFACED_ENTRIES:Ac};function kt(){return{surfacedPaths:new Set,sessionBytes:0}}function tm(t,e,r){let n=[],o=r??kt(),s,i=[];return n.push(t.register({point:"memory.before_recall",priority:50,label:"qmemory-prefetch",handler:async(a,c)=>{if(!e.memoryProvider||!c.query)return{action:"continue",context:c};if(o.sessionBytes>=zr.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:zr.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>zr.MAX_SESSION_BYTES)return!1;if(o.surfacedPaths.add(g),o.sessionBytes+=h,o.surfacedPaths.size>zr.MAX_SURFACED_ENTRIES){let b=o.surfacedPaths.values().next().value;b!==void 0&&o.surfacedPaths.delete(b)}return!0});s=c.turnId,i=d,e.log.debug(`memory.before_recall: prefetched ${l.length} -> ${d.length} after dedup (${o.sessionBytes} bytes used)`);let p=d.map(m=>{let f=m;return{text:f.text??f.content??"",score:f.score,category:f.metadata?.category??null,source:"l2-long-term",label:"L2 long-term"}}).filter(m=>m.text);if(c.preferredCategories?.length||c.deprioritizedCategories?.length){let m={scenario:"general",preferred:c.preferredCategories??[],deprioritized:c.deprioritizedCategories??[],confidence:1};p=p.map(f=>({...f,score:Ha(f.score??.5,f.category,m)})).sort((f,g)=>(g.score??0)-(f.score??0))}let u=.15;return p=p.filter(m=>(m.score??0)>=u),{action:"continue",context:{...c,recalledMemories:[...c.recalledMemories??[],...p]}}}catch(l){e.log.warn(`memory.before_recall: qmemory prefetch failed: ${l instanceof Error?l.message:String(l)}`),i=[]}return{action:"continue",context:c}}})),n.push(t.register({point:"memory.after_recall",priority:50,label:"qmemory-recall-log",handler:(a,c)=>{let l=s===c.turnId?i.length:0;return e.log.debug(`memory.after_recall: ${c.blockCount??0} blocks assembled, ${l} qmemory results (session: ${o.sessionBytes} bytes)`),{action:"continue",context:c}}})),e.localMemoryProvider&&(n.push(t.register({point:"turn.completed",priority:90,label:"memory-auto-extract",handler:async(a,c)=>{let l=e.getLastUserMessage?.();if(!l)return{action:"continue",context:c};let d=em(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(em(l).length>0)return{action:"continue",context:c};if(!Ba(l))return{action:"continue",context:c};let p=e.getLastAssistantMessage?.();return!p||!e.llmExtract?{action:"continue",context:c}:(Vp({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 rm(t,e,r){let n=r??kt();return t.register({point:"memory.before_recall",priority:40,label:"memdir-cross-file-recall",handler:async(s,i)=>{let a=e.getMemorySource();if(!a||!i.query)return{action:"continue",context:i};if(n.sessionBytes>=zr.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 Wp(i.query,c,n.surfacedPaths);if(l.length===0)return{action:"continue",context:i};if(i.preferredCategories?.length||i.deprioritizedCategories?.length){let f={scenario:"general",preferred:i.preferredCategories??[],deprioritized:i.deprioritizedCategories??[],confidence:1};l=l.map(g=>({...g,score:Ha(g.score,zp(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>zr.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=Gp(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 Mx=[{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 em(t){let e=[],r=t.slice(0,500);for(let{pattern:n,category:o,extractor:s}of Mx){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 Lx}from"node:path";var Ln=class{constructor(e={}){this.options=e}options;getActiveProjectRoot(){return this.options.getActiveProjectRoot?.()??process.cwd()}setActiveWorkdir(e){this.options.setActiveWorkdir?.(Lx(e))}resolveProjectDir(e){return this.options.resolveProjectDir?.(e)}resolveActiveOwnerUserId(){return Vr()}getUserAgentHome(){return X()}getOwnerProfileDir(e){return B(e)}getProfileMemoryDir(e){return nm(e)}getUserSettingsPath(){return Ue()}getUserSkillsDir(){return sr()}getUserPluginsDir(){return Xo()}getUserMcpConfigPath(){return sm()}getUserPluginCacheDir(){return om()}getUserMarketplaceConfigPath(){return im()}getUserAssistantPresetsPath(){return Nn()}getProjectAgentDir(e=this.getActiveProjectRoot()){return De(e)}getProjectSettingsPath(e=this.getActiveProjectRoot()){return cm(e)}getProjectInstructionsPath(e=this.getActiveProjectRoot()){return br(e)}getProjectSkillsDir(e=this.getActiveProjectRoot()){return ir(e)}getProjectPluginsDir(e=this.getActiveProjectRoot()){return Yo(e)}getProjectRulesDir(e=this.getActiveProjectRoot()){return Xr(e)}getProjectSessionsRoot(e=this.getActiveProjectRoot()){return Jo(e)}getKnownProjectDirs(e,r){return Cc(e,r)}getAllProjectSkillDirs(e,r){return um(e,r)}},Ox=new Ln;function I(){return Ox}var gm="transcript.jsonl",zt="metadata.json",pm="state.json";function jx(t){return I().getProjectSessionsRoot(t)}function Yr(t,e){let r=t.replace(/[^a-zA-Z0-9_-]/g,"_");return Se.join(jx(e),r)}function mm(t){if(!t)return Date.now();let e=Date.parse(t);return Number.isFinite(e)?e:Date.now()}async function $x(t,e,r){let n={metadata:{sessionId:e.sessionId,createdAt:mm(e.createdAt),lastActiveAt:mm(e.lastActiveAt),model:e.model,cwd:e.cwd,turnCount:e.turnCount,messageCount:e.messageCount,title:e.title},costSnapshot:r},o=Se.join(t,pm+".tmp");await q.promises.writeFile(o,JSON.stringify(n,null,2),"utf8"),await q.promises.rename(o,Se.join(t,pm))}function fm(t,e){let r=t.replace(/[^a-zA-Z0-9_-]/g,"_"),n=Se.join(I().getProjectSessionsRoot(e),r),o=Se.join(n,zt);if(q.existsSync(o))return n}function Vt(t,e){let r=fm(t,e);if(!r)return null;try{let n=q.readFileSync(Se.join(r,zt),"utf8");return JSON.parse(n)}catch{return null}}async function Ic(t,e,r,n){let o=Yr(t,r);try{await q.promises.mkdir(o,{recursive:!0});let s={role:e.role,content:e.content,ts:Date.now()};n&&(s.turnId=n);let i=JSON.stringify(s)+`
|
|
36
|
-
`;return await q.promises.appendFile(
|
|
37
|
-
`))if(p.trim())try{let u=JSON.parse(p);s.push({role:u.role,content:u.content??null})}catch{i++}i>0&&console.warn(`[session-persistence] ${i} corrupt line(s) skipped in ${n}`)}catch{return null}if(s.length===0&&i>0)return console.error(`[session-persistence] Transcript fully corrupt for session ${t}`),null;let a=new Date().toISOString(),c={sessionId:t,projectId:"",createdAt:a,lastActiveAt:a,turnCount:0,messageCount:s.length};try{let d=await q.promises.readFile(o,"utf8");c=JSON.parse(d)}catch{}let l=s.filter(d=>d.role!=="system");return{metadata:c,messages:l}}async function Rt(t=pc,e){let r=I().getProjectSessionsRoot(e),n;try{n=await q.promises.readdir(r)}catch{return[]}let o=[];for(let s of n){let i=
|
|
38
|
-
`),a=n.transport.stream({model:n.model,messages:[{role:"system",content:"Generate a concise task summary (~100 words) of what the user is working on in this session. Focus on the goal, key decisions, and current progress. Reply with ONLY the summary."},{role:"user",content:i}],tools:[],maxTokens:200},n.apiKey),c="";for await(let p of a)p.type==="delta"&&(c+=p.text);if(c=c.trim(),!c)return null;let l=Yr(t,o),d=Se.join(l,zt);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 _1}from"node:crypto";var Hx=3e4;var Zo=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),!Qo(n.lifecycle)&&Qo(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&&Qo(r.lifecycle)&&(this.tasks.delete(e),this.notify(e,null))}evictStaleTasks(e=Hx){let r=Date.now();for(let[n,o]of this.tasks)Qo(o.lifecycle)&&o.endedAt&&r-o.endedAt>e&&(this.tasks.delete(n),this.notify(n,null))}};function Qo(t){return t==="completed"||t==="failed"||t==="cancelled"||t==="timeout"}var _c=new Set;function Xt(t){return _c.add(t),()=>{_c.delete(t)}}async function bm(){await Promise.all(Array.from(_c).map(t=>t()))}He();function kr(t=process.env){return{get:e=>t[e]}}var ns="\u65E0\u6CD5\u8FDE\u63A5 llmrouter \u6A21\u578B\u76EE\u5F55",Y="llmrouter",Dc="LLMRouter",Yt=class extends Error{constructor(e=ns){super(e),this.name="LlmrouterCatalogUnavailableError"}};function wm(t=kr()){let e=t.get("QLOGIC_LLMROUTER_BASE_URL")?.trim().replace(/\/+$/,"");if(!e)throw new Yt;return e}function Pm(t){return wm(t)}function Vx(t=kr()){let e={accept:"application/json"},r=t.get("QLOGIC_LLMROUTER_ACCESS_TOKEN")?.trim();return r&&(e.authorization=`Bearer ${r}`),e}async function Am(t,e){let r=wm(e),n;try{n=await fetch(`${r}${t}`,{method:"GET",headers:Vx(e),signal:AbortSignal.timeout(1e4)})}catch{throw new Yt}if(!n.ok)throw new Yt;let o=await n.json().catch(()=>null),s=Array.isArray(o)?o:Em(o)&&Array.isArray(o.data)?o.data:null;if(!s)throw new Yt;return s}function Nc(t){let e=t.trim().replace(/\/+$/,"");return e.endsWith("/v1")?`${e}/models`:`${e}/v1/models`}async function Xx(t,e){let r;try{r=await fetch(t,{method:"GET",headers:{accept:"application/json",authorization:`Bearer ${e}`},signal:AbortSignal.timeout(1e4)})}catch{throw new Yt}if(!r.ok)throw new Yt;let n=await r.json().catch(()=>null),o=Array.isArray(n)?n:Em(n)&&Array.isArray(n.data)?n.data:null;if(!o)throw new Yt;return o}async function Lc(t){return Am("/ext/model-catalog/providers",t)}async function Yx(t){return Am("/ext/model-catalog/models",t)}async function Jx(t,e){return Xx(Nc(t),e)}function Oc(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 Jr(t){return t.baseUrl??t.base_url}async function jc(t,e){return(await Lc(e)).find(n=>n.id===t)??null}async function $n(t,e){let r=await Yx(e);t.migrateModelIds(xm(r));let n=r.flatMap(Cm);return t.replaceCatalogModels(n),n}async function $c(t,e){let r=await Jx(e.baseUrl,e.apiKey);if(r.length===0)return[];t.migrateModelIds(xm(r));let n=r.flatMap(Cm).filter(o=>o.provider===Y).map(o=>({...o,baseUrl:e.baseUrl}));return t.replaceProviderModels(Y,n),n}function xm(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 Cm(t){return[Qx(t),Zx(t)].filter(e=>!!e)}function Qx(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:Im(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 Zx(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:Im(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 Im(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 Em(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}import*as _p from"node:path";var Rr="1.0.0",y={PARSE_ERROR:-32700,INVALID_REQUEST:-32600,METHOD_NOT_FOUND:-32601,INVALID_PARAMS:-32602,INTERNAL_ERROR:-32603,TURN_ABORTED:-32e3,TURN_TIMEOUT:-32001,LLM_ERROR:-32010,LLM_AUTH_ERROR:-32011,LLM_RATE_LIMIT:-32012,LLM_QUOTA_EXHAUSTED:-32013,LLM_MODEL_NOT_FOUND:-32014,TOOL_INVOKE_FAILED:-32020,TOOL_TIMEOUT:-32021,PROTOCOL_MISMATCH:-32030,REQUEST_DEADLINE_EXCEEDED:-32040,REQUEST_CANCELLED:-32041,REQUEST_DEDUPED:-32042,REQUEST_IDEMPOTENCY_REQUIRED:-32043};function Uc(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 eC}from"node:crypto";var tC=["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"],rC=new Set(["thread.turn","memory.dream","memory.propose","memory.consolidate","media.stt","pet.forge","solo.start","solo.evaluate","product.plan","product.create","product.message"]),nC=["memory.","pet.","usage."],oC=new Set(["memory.atlas","memory.activity","memory.list","memory.read","memory.search","pet.status"]);function os(t){return rC.has(t)?{channel:"task",mutability:"write",defaultTimeoutMs:t==="thread.turn"?3e5:12e4}:tC.some(e=>t===e||t.startsWith(`${e}.`)||t.startsWith(e))?{channel:"query",mutability:"read",defaultTimeoutMs:1e4}:{channel:"task",mutability:"write",defaultTimeoutMs:3e4}}function Mm(t){return oC.has(t)||os(t).mutability==="read"?!1:nC.some(e=>t.startsWith(e))}function Fc(t,e={}){let r=e.now??Date.now(),n=os(t),o=e.timeoutMs??n.defaultTimeoutMs;return{requestId:e.requestId??eC(),createdAt:r,deadlineAt:r+o,channel:e.channel??n.channel,idempotencyKey:e.idempotencyKey,traceId:e.traceId}}function ss(t,e=Date.now()){let r=t.meta;if(!r||typeof r!="object")return{ok:!1,error:{code:y.INVALID_REQUEST,message:"RPC request meta is required."}};if(typeof r.requestId!="string"||r.requestId.length===0)return{ok:!1,error:{code:y.INVALID_REQUEST,message:"RPC request meta.requestId is required."}};if(r.channel!=="query"&&r.channel!=="task")return{ok:!1,error:{code:y.INVALID_REQUEST,message:"RPC request meta.channel must be query or task."}};if(typeof r.createdAt!="number"||!Number.isFinite(r.createdAt))return{ok:!1,error:{code:y.INVALID_REQUEST,message:"RPC request meta.createdAt is required."}};if(typeof r.deadlineAt!="number"||!Number.isFinite(r.deadlineAt))return{ok:!1,error:{code:y.INVALID_REQUEST,message:"RPC request meta.deadlineAt is required."}};if(r.deadlineAt<=e)return{ok:!1,error:{code:y.REQUEST_DEADLINE_EXCEEDED,message:"RPC request deadline has already expired."}};let n=os(t.method).channel;return r.channel!==n?{ok:!1,error:{code:y.INVALID_REQUEST,message:`RPC request channel mismatch: expected ${n}, got ${r.channel}.`}}:Mm(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 Un=class{now;active=new Map;idempotency=new Map;counters={completedRequests:0,cancelledRequests:0,deadlineExceededRequests:0,dedupedRequests:0,lateResponsesDropped:0,invalidRequests:0};constructor(e={}){this.now=e.now??(()=>Date.now())}begin(e,r){let n=ss({method:e,meta:r},this.now());if(!n.ok)return this.counters.invalidRequests+=1,{status:"rejected",error:n.error};if(r.idempotencyKey){let o=this.idempotency.get(r.idempotencyKey);if(o)return this.counters.dedupedRequests+=1,o.error?{status:"deduped",error:o.error}:{status:"deduped",result:o.result}}return this.active.set(r.requestId,{method:e,meta:r,cancelled:!1,startedAt:this.now()}),{status:"started"}}cancel(e,r="cancelled"){let n=this.active.get(e);return!n||n.cancelled?!1:(n.cancelled=!0,n.cancelReason=r,this.counters.cancelledRequests+=1,!0)}expire(e){return this.active.get(e)?(this.active.delete(e),this.counters.deadlineExceededRequests+=1,!0):!1}settle(e,r,n){let o=this.active.get(e);return o?(this.active.delete(e),o.cancelled?(this.counters.lateResponsesDropped+=1,{accepted:!1,reason:"cancelled"}):o.meta.deadlineAt<=this.now()?(this.counters.deadlineExceededRequests+=1,this.counters.lateResponsesDropped+=1,{accepted:!1,reason:"deadline_exceeded"}):(this.counters.completedRequests+=1,o.meta.idempotencyKey&&this.idempotency.set(o.meta.idempotencyKey,{result:r,error:n,settledAt:this.now()}),{accepted:!0})):{accepted:!1,reason:"unknown"}}metrics(){return{activeRequests:this.active.size,...this.counters}}};var _m=["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"],Dm=["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"],sC=[..._m,...Dm];var St={INITIALIZE:"initialize",SESSION_NEW:"session/new",SESSION_PROMPT:"session/prompt",SESSION_END:"session/end",SESSION_SET_CONFIG:"session/set_config_option",SESSION_SET_MODEL:"session/set_model",SESSION_SET_MODE:"session/set_mode",SESSION_UPDATE:"session/update",SESSION_REQUEST_PERMISSION:"session/request_permission",FS_READ_TEXT_FILE:"fs/read_text_file",FS_WRITE_TEXT_FILE:"fs/write_text_file"},Z={ABORT:"x/abort",DREAM:"x/dream",AGENTS_LIST:"x/agents.list",SOLO_START:"x/solo.start",SOLO_STATUS:"x/solo.status",SOLO_SELECT:"x/solo.select",SOLO_CANCEL:"x/solo.cancel",PRODUCT_CREATE:"x/product.create",PRODUCT_PLAN:"x/product.plan",PRODUCT_CONFIRM:"x/product.confirm",PRODUCT_MESSAGE:"x/product.message",PRODUCT_RESUME:"x/product.resume",PRODUCT_PAUSE:"x/product.pause",PRODUCT_CANCEL:"x/product.cancel",PRODUCT_ROLLBACK:"x/product.rollback",PRODUCT_STATUS:"x/product.status",SOLO_SUBSCRIBE:"x/solo.subscribe",SOLO_MESSAGE:"x/solo.message",SOLO_EVALUATE:"x/solo.evaluate",PRODUCT_SUBSCRIBE:"x/product.subscribe",TEAM_DELEGATE:"x/team.delegate"},Tt={AGENT_MESSAGE_CHUNK:"agent_message_chunk",AGENT_THOUGHT_CHUNK:"agent_thought_chunk",TOOL_CALL:"tool_call",TOOL_CALL_UPDATE:"tool_call_update",PLAN:"plan",USAGE_UPDATE:"usage_update",CONFIG_OPTION_UPDATE:"config_option_update",SESSION_INFO_UPDATE:"session_info_update",AVAILABLE_COMMANDS_UPDATE:"available_commands_update"},ae={X_SUBAGENT_STARTED:"x_subagent_started",X_SUBAGENT_DELTA:"x_subagent_delta",X_SUBAGENT_ENDED:"x_subagent_ended",X_MEDIA_RESULT:"x_media_result",X_MEDIA_PROGRESS:"x_media_progress",X_SKILL_INSTRUCTION:"x_skill_instruction",X_RECOVERY:"x_recovery",X_SIDECHAIN_STARTED:"x_sidechain_started",X_SIDECHAIN_COMPLETED:"x_sidechain_completed",X_SUGGESTIONS:"x_suggestions",X_ASK_USER:"x_ask_user",X_SESSION_INFO:"x_session_info",X_MEMORY_UPDATED:"x_memory_updated",X_TEAM_MEMBER_UPDATE:"x_team_member_update",X_SOLO_STARTED:"x_solo_started",X_SOLO_AGENT_FINISHED:"x_solo_agent_finished",X_SOLO_SELECTED:"x_solo_selected",X_PRODUCT_TASK_STARTED:"x_product_task_started",X_PRODUCT_TASK_COMPLETED:"x_product_task_completed",X_PRODUCT_CHECKPOINT:"x_product_checkpoint"};function Fn(t){if(!t||typeof t!="object")return!1;let e=t;return e.jsonrpc==="2.0"&&typeof e.method=="string"&&"id"in e}function Hn(t){if(!t||typeof t!="object")return!1;let e=t;return e.jsonrpc==="2.0"&&typeof e.method=="string"&&!("id"in e)}function Hc(t){if(!t||typeof t!="object")return!1;let e=t;return e.jsonrpc==="2.0"&&"id"in e&&!("method"in e)}var Nm="openai-codex";var nq={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"},[Nm]:{providerFamily:"openai"},openrouter:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},opencode:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},kilocode:{providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]}};import{randomUUID as iC}from"node:crypto";var is={PARSE_ERROR:-32700,INVALID_REQUEST:-32600,METHOD_NOT_FOUND:-32601,INVALID_PARAMS:-32602,INTERNAL_ERROR:-32603,PROTOCOL_MISMATCH:-32001,SESSION_NOT_FOUND:-32002,AGENT_BUSY:-32003},as=class{transport;handler;verbose;hostCapabilities={};hostSupportsExtendedEvents=!1;hostSupportsExtendedMethods=!1;activeSessionId=null;pendingPermissions=new Map;outboundRequestMap=new Map;constructor(e,r,n){this.transport=e,this.handler=r,this.verbose=n?.verbose??!1}dispatchMessage(e){if(this.isJsonRpcResponse(e))return this.handleResponse(e),!0;if(Fn(e)){let r=e;return process.stderr.write(`[acp-server] -> recv id=${String(r.id)} method=${r.method}
|
|
35
|
+
[{"text": "...", "category": "personal_fact|preference|event|lesson", "importance": 0.5-0.9, "eventDate": "YYYY-MM-DD or null"}]`;async function cx(t,e,r){let n=ax.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:lx(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 lx(t){return new Set(["personal_fact","preference","event","lesson","pattern","decision"]).has(t)?t:"personal_fact"}async function Vp(t,e){if(!Ba(t.userMessage))return 0;if(e.log.debug(`implicit-extract: signal detected in user message (${t.userMessage.slice(0,50)}...)`),!e.llmExtract)return e.log.debug("implicit-extract: no LLM extractor configured, skipping Layer 2"),0;let r=new Date().toISOString().slice(0,10),n=await cx(t,e.llmExtract,r);if(n.length===0)return e.log.debug("implicit-extract: LLM returned no facts"),0;let o=0;for(let s of n)try{if(!e.localProvider.proposeExtracted)continue;if(((await e.localProvider.proposeExtracted([{text:s.text,category:s.category,importance:s.importance}],e.userId,{source:"implicit-extract"})).proposalsAdded??0)>0){if(o++,e.log.debug(`implicit-extract: proposed "${s.text.slice(0,60)}..." [${s.category}]`),s.category==="event")try{let a=e.localProvider.findRelatedEvents?await e.localProvider.findRelatedEvents(s.text,e.userId):[];for(let c of a)e.localProvider.feedback?.([c.id],"useful").catch(()=>{});a.length>0&&e.log.debug(`implicit-extract: linked to ${a.length} related events`)}catch{}}else e.log.debug(`implicit-extract: dedup skipped "${s.text.slice(0,40)}..."`)}catch{}return o}var qa=Math.min(Math.max(1,Number(process.env.TOOL_LOOP_DEFAULT_BUDGET)||25),100),Wa=3,Ga=2,Ko=2,Ka=128e3,za=13e3,Va=16384,Xa=65536,Ya=3,Ja=65536,zo=500,Qa=3,Za=5e4,ec=2e5,Vo=2e3,tc=3e4,rc=3,Kr=2,dx=3e5,ux=216e5,px=.75,mx=16e3,gx=12e4,fx=3,hx=4,yx=50,nc=20,Xp=50,oc=3,sc=2,ic=300*1e3,Yp=3,Jp=720*60*60*1e3,vx=4e3,bx=5,ac=3,cc=800,lc=300*1e3,dc=4,uc=0,pc=50,mc=50,gc=30,Qp=3600*1e3,Zp=200,fc=5,kx=4e4,hc=50*1024,yc=500*1024,vc=500*1024*1024,Rx=50*1024*1024,bc=3e5,kc=2,Rc=3e3,Sc=3,Tc=5e3,Sx=1e3,Tx=3e3,wx=3e4,wc=60*1024,Ac=10,Pc=100,Ax=24,Px=5,xx=6e5,Cx=30,Ix=144e5,Ex=3e5;function xc(){return{maxRoundsLimit:100,defaultMaxRounds:25,defaultTemperature:0,maxToolBudgetCap:100,defaultToolBudget:qa,maxConsecutiveFailures:Wa,maxIdenticalCallRepeats:Ga,defaultContextWindowTokens:Ka,responseBufferTokens:za,defaultMaxOutputTokens:Va,defaultModelMaxOutputTokens:Xa,maxOutputTokensRecoveryLimit:Ya,escalatedMaxOutputTokens:Ja,diminishingReturnsThreshold:zo,diminishingReturnsMinContinuations:Qa,defaultMaxResultSizeChars:Za,maxToolResultsPerMessageChars:ec,toolResultPreviewBytes:Vo,heartbeatIntervalMs:tc,max529Retries:rc,maxApiRetries:Kr,persistentRetryMaxBackoffMs:dx,persistentRetryResetCapMs:ux,compressionTargetUsageRatio:px,compressionMinBudget:mx,compressionMaxBudget:gx,reactiveCompactMaxFailures:fx,reactiveCompactMinMessages:hx,reactiveCompactTargetPercent:yx,maxSkillsPerProject:nc,maxSkillsGlobal:Xp,minToolCallsForSkill:oc,minDistinctToolsForSkill:sc,skillCreationCooldownMs:ic,skillInjectionMaxChars:vx,skillInjectionMaxCount:bx,skillRecallMaxSkills:ac,skillRecallMaxContentChars:cc,skillRecallCacheTtlMs:lc,maxForkDepth:dc,maxSessions:pc,taskSummaryTurnThreshold:mc,taskSummaryRegenInterval:gc,maxIncludeDepth:fc,maxInstructionChars:kx,instructionsMaxFileSize:hc,instructionsMaxDirSize:yc,mediaMaxDownloadSize:vc,mediaMaxUploadSize:Rx,mediaDownloadTimeoutMs:bc,acpMaxSpawnRetries:kc,acpRetryBackoffBase:Rc,acpRuntimeRestartMax:Sc,acpRuntimeRestartBackoffBase:Tc,taskPollIntervalMs:Sx,taskStoppedDisplayMs:Tx,taskPanelGraceMs:wx,memoryPrefetchMaxSessionBytes:wc,memoryPrefetchLimitPerRecall:Ac,memoryMaxSurfacedEntries:Pc,dreamMinIntervalHours:Ax,dreamMinSessions:Px,dreamScanIntervalMs:xx,idleDreamMinutes:Cx,dreamCooldownMs:Ix,dreamMaxDurationMs:Ex,teamBudgetTokens:uc}}var zr={MAX_SESSION_BYTES:wc,LIMIT_PER_RECALL:Ac,MAX_SURFACED_ENTRIES:Pc};function kt(){return{surfacedPaths:new Set,sessionBytes:0}}function tm(t,e,r){let n=[],o=r??kt(),s,i=[];return n.push(t.register({point:"memory.before_recall",priority:50,label:"qmemory-prefetch",handler:async(a,c)=>{if(!e.memoryProvider||!c.query)return{action:"continue",context:c};if(o.sessionBytes>=zr.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:zr.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>zr.MAX_SESSION_BYTES)return!1;if(o.surfacedPaths.add(g),o.sessionBytes+=h,o.surfacedPaths.size>zr.MAX_SURFACED_ENTRIES){let b=o.surfacedPaths.values().next().value;b!==void 0&&o.surfacedPaths.delete(b)}return!0});s=c.turnId,i=d,e.log.debug(`memory.before_recall: prefetched ${l.length} -> ${d.length} after dedup (${o.sessionBytes} bytes used)`);let p=d.map(m=>{let f=m;return{text:f.text??f.content??"",score:f.score,category:f.metadata?.category??null,source:"l2-long-term",label:"L2 long-term"}}).filter(m=>m.text);if(c.preferredCategories?.length||c.deprioritizedCategories?.length){let m={scenario:"general",preferred:c.preferredCategories??[],deprioritized:c.deprioritizedCategories??[],confidence:1};p=p.map(f=>({...f,score:Ha(f.score??.5,f.category,m)})).sort((f,g)=>(g.score??0)-(f.score??0))}let u=.15;return p=p.filter(m=>(m.score??0)>=u),{action:"continue",context:{...c,recalledMemories:[...c.recalledMemories??[],...p]}}}catch(l){e.log.warn(`memory.before_recall: qmemory prefetch failed: ${l instanceof Error?l.message:String(l)}`),i=[]}return{action:"continue",context:c}}})),n.push(t.register({point:"memory.after_recall",priority:50,label:"qmemory-recall-log",handler:(a,c)=>{let l=s===c.turnId?i.length:0;return e.log.debug(`memory.after_recall: ${c.blockCount??0} blocks assembled, ${l} qmemory results (session: ${o.sessionBytes} bytes)`),{action:"continue",context:c}}})),e.localMemoryProvider&&(n.push(t.register({point:"turn.completed",priority:90,label:"memory-auto-extract",handler:async(a,c)=>{let l=e.getLastUserMessage?.();if(!l)return{action:"continue",context:c};let d=em(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(em(l).length>0)return{action:"continue",context:c};if(!Ba(l))return{action:"continue",context:c};let p=e.getLastAssistantMessage?.();return!p||!e.llmExtract?{action:"continue",context:c}:(Vp({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 rm(t,e,r){let n=r??kt();return t.register({point:"memory.before_recall",priority:40,label:"memdir-cross-file-recall",handler:async(s,i)=>{let a=e.getMemorySource();if(!a||!i.query)return{action:"continue",context:i};if(n.sessionBytes>=zr.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 Wp(i.query,c,n.surfacedPaths);if(l.length===0)return{action:"continue",context:i};if(i.preferredCategories?.length||i.deprioritizedCategories?.length){let f={scenario:"general",preferred:i.preferredCategories??[],deprioritized:i.deprioritizedCategories??[],confidence:1};l=l.map(g=>({...g,score:Ha(g.score,zp(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>zr.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=Gp(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 Mx=[{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 em(t){let e=[],r=t.slice(0,500);for(let{pattern:n,category:o,extractor:s}of Mx){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 Lx}from"node:path";var Ln=class{constructor(e={}){this.options=e}options;getActiveProjectRoot(){return this.options.getActiveProjectRoot?.()??process.cwd()}setActiveWorkdir(e){this.options.setActiveWorkdir?.(Lx(e))}resolveProjectDir(e){return this.options.resolveProjectDir?.(e)}resolveActiveOwnerUserId(){return Vr()}getUserAgentHome(){return X()}getOwnerProfileDir(e){return B(e)}getProfileMemoryDir(e){return nm(e)}getUserSettingsPath(){return Ue()}getUserSkillsDir(){return sr()}getUserPluginsDir(){return Xo()}getUserMcpConfigPath(){return sm()}getUserPluginCacheDir(){return om()}getUserMarketplaceConfigPath(){return im()}getUserAssistantPresetsPath(){return Nn()}getProjectAgentDir(e=this.getActiveProjectRoot()){return Ne(e)}getProjectSettingsPath(e=this.getActiveProjectRoot()){return cm(e)}getProjectInstructionsPath(e=this.getActiveProjectRoot()){return br(e)}getProjectSkillsDir(e=this.getActiveProjectRoot()){return ir(e)}getProjectPluginsDir(e=this.getActiveProjectRoot()){return Yo(e)}getProjectRulesDir(e=this.getActiveProjectRoot()){return Xr(e)}getProjectSessionsRoot(e=this.getActiveProjectRoot()){return Jo(e)}getKnownProjectDirs(e,r){return Cc(e,r)}getAllProjectSkillDirs(e,r){return um(e,r)}},Ox=new Ln;function I(){return Ox}var gm="transcript.jsonl",zt="metadata.json",pm="state.json";function jx(t){return I().getProjectSessionsRoot(t)}function Yr(t,e){let r=t.replace(/[^a-zA-Z0-9_-]/g,"_");return Te.join(jx(e),r)}function mm(t){if(!t)return Date.now();let e=Date.parse(t);return Number.isFinite(e)?e:Date.now()}async function $x(t,e,r){let n={metadata:{sessionId:e.sessionId,createdAt:mm(e.createdAt),lastActiveAt:mm(e.lastActiveAt),model:e.model,cwd:e.cwd,turnCount:e.turnCount,messageCount:e.messageCount,title:e.title},costSnapshot:r},o=Te.join(t,pm+".tmp");await q.promises.writeFile(o,JSON.stringify(n,null,2),"utf8"),await q.promises.rename(o,Te.join(t,pm))}function fm(t,e){let r=t.replace(/[^a-zA-Z0-9_-]/g,"_"),n=Te.join(I().getProjectSessionsRoot(e),r),o=Te.join(n,zt);if(q.existsSync(o))return n}function Vt(t,e){let r=fm(t,e);if(!r)return null;try{let n=q.readFileSync(Te.join(r,zt),"utf8");return JSON.parse(n)}catch{return null}}async function Ic(t,e,r,n){let o=Yr(t,r);try{await q.promises.mkdir(o,{recursive:!0});let s={role:e.role,content:e.content,ts:Date.now()};n&&(s.turnId=n);let i=JSON.stringify(s)+`
|
|
36
|
+
`;return await q.promises.appendFile(Te.join(o,gm),i,"utf8"),!0}catch(s){return console.error(`[session-persistence] appendMessage failed for ${t}: ${s.message}`),!1}}async function hm(t,e,r,n){let o=Yr(t,n);await q.promises.mkdir(o,{recursive:!0});let s={};try{let l=await q.promises.readFile(Te.join(o,zt),"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,zt+".tmp");await q.promises.writeFile(c,JSON.stringify(a,null,2),"utf8"),await q.promises.rename(c,Te.join(o,zt)),await $x(o,a,e)}async function Fe(t,e,r){let o=fm(t,r)??Yr(t,r),s=Te.join(o,zt),i=new Date().toISOString(),a;try{let d=await q.promises.readFile(s,"utf8");a=JSON.parse(d)}catch{await q.promises.mkdir(o,{recursive:!0}),a={sessionId:t,projectId:e.projectId??"",createdAt:i,lastActiveAt:i,turnCount:0,messageCount:0,...e};let d=s+".tmp";return await q.promises.writeFile(d,JSON.stringify(a,null,2),"utf8"),await q.promises.rename(d,s),a}let c={...a};e.title!==void 0&&(c.title=e.title??void 0),e.pinnedAt!==void 0&&(c.pinnedAt=e.pinnedAt??void 0),e.archivedAt!==void 0&&(c.archivedAt=e.archivedAt??void 0),e.sealedAt!==void 0&&(c.sealedAt=e.sealedAt??void 0),e.previousSessionId!==void 0&&(c.previousSessionId=e.previousSessionId??void 0),e.carryoverSummary!==void 0&&(c.carryoverSummary=e.carryoverSummary??void 0),e.projectId!==void 0&&(c.projectId=e.projectId??c.projectId),e.type!==void 0&&(c.type=e.type??void 0),e.ownerId!==void 0&&(c.ownerId=e.ownerId??void 0),e.groupKey!==void 0&&(c.groupKey=e.groupKey??void 0),e.groupName!==void 0&&(c.groupName=e.groupName??void 0),e.groupPlatform!==void 0&&(c.groupPlatform=e.groupPlatform??void 0),e.assistant!==void 0&&(c.assistant=e.assistant??void 0),c.lastActiveAt=i;let l=s+".tmp";return await q.promises.writeFile(l,JSON.stringify(c,null,2),"utf8"),await q.promises.rename(l,s),c}async function Ec(t,e){try{await q.promises.access(e,q.constants.R_OK)}catch{return console.error(`[session-persistence] loadSessionForResume: projectRoot not accessible: ${e}`),null}let r=Yr(t,e),n=Te.join(r,gm),o=Te.join(r,zt),s=[],i=0;try{let d=await q.promises.readFile(n,"utf8");for(let p of d.split(`
|
|
37
|
+
`))if(p.trim())try{let u=JSON.parse(p);s.push({role:u.role,content:u.content??null})}catch{i++}i>0&&console.warn(`[session-persistence] ${i} corrupt line(s) skipped in ${n}`)}catch{return null}if(s.length===0&&i>0)return console.error(`[session-persistence] Transcript fully corrupt for session ${t}`),null;let a=new Date().toISOString(),c={sessionId:t,projectId:"",createdAt:a,lastActiveAt:a,turnCount:0,messageCount:s.length};try{let d=await q.promises.readFile(o,"utf8");c=JSON.parse(d)}catch{}let l=s.filter(d=>d.role!=="system");return{metadata:c,messages:l}}async function Rt(t=pc,e){let r=I().getProjectSessionsRoot(e),n;try{n=await q.promises.readdir(r)}catch{return[]}let o=[];for(let s of n){let i=Te.join(r,s,zt);try{let a=await q.promises.readFile(i,"utf8"),c=JSON.parse(a);o.push({sessionId:c.sessionId,title:c.title,lastActiveAt:c.lastActiveAt,messageCount:c.messageCount,model:c.model,pinnedAt:c.pinnedAt,archivedAt:c.archivedAt,sealedAt:c.sealedAt,projectId:c.projectId,type:c.type??"personal",createdAt:c.createdAt,groupKey:c.groupKey,previousSessionId:c.previousSessionId,carryoverSummary:c.carryoverSummary??null})}catch{}}return o.sort((s,i)=>s.lastActiveAt>i.lastActiveAt?-1:s.lastActiveAt<i.lastActiveAt?1:0),o.slice(0,t)}async function Mc(t,e){let r=Yr(t,e);await q.promises.rm(r,{recursive:!0,force:!0})}function Ux(t){return t.turnCount<mc?!1:t.taskSummaryGeneratedAt?t.turnCount-(t.taskSummaryGeneratedAt??0)>=gc:!0}var Fx="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:Fx},{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 vm(t,e,r,n,o){if(!Ux(e))return null;try{let i=r.slice(-20).map(p=>`[${p.role}]: ${typeof p.content=="string"?p.content.slice(0,500):JSON.stringify(p.content).slice(0,500)}`).join(`
|
|
38
|
+
`),a=n.transport.stream({model:n.model,messages:[{role:"system",content:"Generate a concise task summary (~100 words) of what the user is working on in this session. Focus on the goal, key decisions, and current progress. Reply with ONLY the summary."},{role:"user",content:i}],tools:[],maxTokens:200},n.apiKey),c="";for await(let p of a)p.type==="delta"&&(c+=p.text);if(c=c.trim(),!c)return null;let l=Yr(t,o),d=Te.join(l,zt);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 _1}from"node:crypto";var Hx=3e4;var Zo=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),!Qo(n.lifecycle)&&Qo(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&&Qo(r.lifecycle)&&(this.tasks.delete(e),this.notify(e,null))}evictStaleTasks(e=Hx){let r=Date.now();for(let[n,o]of this.tasks)Qo(o.lifecycle)&&o.endedAt&&r-o.endedAt>e&&(this.tasks.delete(n),this.notify(n,null))}};function Qo(t){return t==="completed"||t==="failed"||t==="cancelled"||t==="timeout"}var _c=new Set;function Xt(t){return _c.add(t),()=>{_c.delete(t)}}async function bm(){await Promise.all(Array.from(_c).map(t=>t()))}He();function kr(t=process.env){return{get:e=>t[e]}}var ns="\u65E0\u6CD5\u8FDE\u63A5 llmrouter \u6A21\u578B\u76EE\u5F55",Y="llmrouter",Dc="LLMRouter",Yt=class extends Error{constructor(e=ns){super(e),this.name="LlmrouterCatalogUnavailableError"}};function wm(t=kr()){let e=t.get("QLOGIC_LLMROUTER_BASE_URL")?.trim().replace(/\/+$/,"");if(!e)throw new Yt;return e}function Am(t){return wm(t)}function Vx(t=kr()){let e={accept:"application/json"},r=t.get("QLOGIC_LLMROUTER_ACCESS_TOKEN")?.trim();return r&&(e.authorization=`Bearer ${r}`),e}async function Pm(t,e){let r=wm(e),n;try{n=await fetch(`${r}${t}`,{method:"GET",headers:Vx(e),signal:AbortSignal.timeout(1e4)})}catch{throw new Yt}if(!n.ok)throw new Yt;let o=await n.json().catch(()=>null),s=Array.isArray(o)?o:Em(o)&&Array.isArray(o.data)?o.data:null;if(!s)throw new Yt;return s}function Nc(t){let e=t.trim().replace(/\/+$/,"");return e.endsWith("/v1")?`${e}/models`:`${e}/v1/models`}async function Xx(t,e){let r;try{r=await fetch(t,{method:"GET",headers:{accept:"application/json",authorization:`Bearer ${e}`},signal:AbortSignal.timeout(1e4)})}catch{throw new Yt}if(!r.ok)throw new Yt;let n=await r.json().catch(()=>null),o=Array.isArray(n)?n:Em(n)&&Array.isArray(n.data)?n.data:null;if(!o)throw new Yt;return o}async function Lc(t){return Pm("/ext/model-catalog/providers",t)}async function Yx(t){return Pm("/ext/model-catalog/models",t)}async function Jx(t,e){return Xx(Nc(t),e)}function Oc(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 Jr(t){return t.baseUrl??t.base_url}async function jc(t,e){return(await Lc(e)).find(n=>n.id===t)??null}async function $n(t,e){let r=await Yx(e);t.migrateModelIds(xm(r));let n=r.flatMap(Cm);return t.replaceCatalogModels(n),n}async function $c(t,e){let r=await Jx(e.baseUrl,e.apiKey);if(r.length===0)return[];t.migrateModelIds(xm(r));let n=r.flatMap(Cm).filter(o=>o.provider===Y).map(o=>({...o,baseUrl:e.baseUrl}));return t.replaceProviderModels(Y,n),n}function xm(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 Cm(t){return[Qx(t),Zx(t)].filter(e=>!!e)}function Qx(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:Im(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 Zx(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:Im(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 Im(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 Em(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}import*as _p from"node:path";var Rr="1.0.0",y={PARSE_ERROR:-32700,INVALID_REQUEST:-32600,METHOD_NOT_FOUND:-32601,INVALID_PARAMS:-32602,INTERNAL_ERROR:-32603,TURN_ABORTED:-32e3,TURN_TIMEOUT:-32001,LLM_ERROR:-32010,LLM_AUTH_ERROR:-32011,LLM_RATE_LIMIT:-32012,LLM_QUOTA_EXHAUSTED:-32013,LLM_MODEL_NOT_FOUND:-32014,TOOL_INVOKE_FAILED:-32020,TOOL_TIMEOUT:-32021,PROTOCOL_MISMATCH:-32030,REQUEST_DEADLINE_EXCEEDED:-32040,REQUEST_CANCELLED:-32041,REQUEST_DEDUPED:-32042,REQUEST_IDEMPOTENCY_REQUIRED:-32043};function Uc(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 eC}from"node:crypto";var tC=["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"],rC=new Set(["thread.turn","memory.dream","memory.propose","memory.consolidate","media.stt","pet.forge","solo.start","solo.evaluate","product.plan","product.create","product.message"]),nC=["memory.","pet.","usage."],oC=new Set(["memory.atlas","memory.activity","memory.list","memory.read","memory.search","pet.status"]);function os(t){return rC.has(t)?{channel:"task",mutability:"write",defaultTimeoutMs:t==="thread.turn"?3e5:12e4}:tC.some(e=>t===e||t.startsWith(`${e}.`)||t.startsWith(e))?{channel:"query",mutability:"read",defaultTimeoutMs:1e4}:{channel:"task",mutability:"write",defaultTimeoutMs:3e4}}function Mm(t){return oC.has(t)||os(t).mutability==="read"?!1:nC.some(e=>t.startsWith(e))}function Fc(t,e={}){let r=e.now??Date.now(),n=os(t),o=e.timeoutMs??n.defaultTimeoutMs;return{requestId:e.requestId??eC(),createdAt:r,deadlineAt:r+o,channel:e.channel??n.channel,idempotencyKey:e.idempotencyKey,traceId:e.traceId}}function ss(t,e=Date.now()){let r=t.meta;if(!r||typeof r!="object")return{ok:!1,error:{code:y.INVALID_REQUEST,message:"RPC request meta is required."}};if(typeof r.requestId!="string"||r.requestId.length===0)return{ok:!1,error:{code:y.INVALID_REQUEST,message:"RPC request meta.requestId is required."}};if(r.channel!=="query"&&r.channel!=="task")return{ok:!1,error:{code:y.INVALID_REQUEST,message:"RPC request meta.channel must be query or task."}};if(typeof r.createdAt!="number"||!Number.isFinite(r.createdAt))return{ok:!1,error:{code:y.INVALID_REQUEST,message:"RPC request meta.createdAt is required."}};if(typeof r.deadlineAt!="number"||!Number.isFinite(r.deadlineAt))return{ok:!1,error:{code:y.INVALID_REQUEST,message:"RPC request meta.deadlineAt is required."}};if(r.deadlineAt<=e)return{ok:!1,error:{code:y.REQUEST_DEADLINE_EXCEEDED,message:"RPC request deadline has already expired."}};let n=os(t.method).channel;return r.channel!==n?{ok:!1,error:{code:y.INVALID_REQUEST,message:`RPC request channel mismatch: expected ${n}, got ${r.channel}.`}}:Mm(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 Un=class{now;active=new Map;idempotency=new Map;counters={completedRequests:0,cancelledRequests:0,deadlineExceededRequests:0,dedupedRequests:0,lateResponsesDropped:0,invalidRequests:0};constructor(e={}){this.now=e.now??(()=>Date.now())}begin(e,r){let n=ss({method:e,meta:r},this.now());if(!n.ok)return this.counters.invalidRequests+=1,{status:"rejected",error:n.error};if(r.idempotencyKey){let o=this.idempotency.get(r.idempotencyKey);if(o)return this.counters.dedupedRequests+=1,o.error?{status:"deduped",error:o.error}:{status:"deduped",result:o.result}}return this.active.set(r.requestId,{method:e,meta:r,cancelled:!1,startedAt:this.now()}),{status:"started"}}cancel(e,r="cancelled"){let n=this.active.get(e);return!n||n.cancelled?!1:(n.cancelled=!0,n.cancelReason=r,this.counters.cancelledRequests+=1,!0)}expire(e){return this.active.get(e)?(this.active.delete(e),this.counters.deadlineExceededRequests+=1,!0):!1}settle(e,r,n){let o=this.active.get(e);return o?(this.active.delete(e),o.cancelled?(this.counters.lateResponsesDropped+=1,{accepted:!1,reason:"cancelled"}):o.meta.deadlineAt<=this.now()?(this.counters.deadlineExceededRequests+=1,this.counters.lateResponsesDropped+=1,{accepted:!1,reason:"deadline_exceeded"}):(this.counters.completedRequests+=1,o.meta.idempotencyKey&&this.idempotency.set(o.meta.idempotencyKey,{result:r,error:n,settledAt:this.now()}),{accepted:!0})):{accepted:!1,reason:"unknown"}}metrics(){return{activeRequests:this.active.size,...this.counters}}};var _m=["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"],Dm=["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"],sC=[..._m,...Dm];var St={INITIALIZE:"initialize",SESSION_NEW:"session/new",SESSION_PROMPT:"session/prompt",SESSION_END:"session/end",SESSION_SET_CONFIG:"session/set_config_option",SESSION_SET_MODEL:"session/set_model",SESSION_SET_MODE:"session/set_mode",SESSION_UPDATE:"session/update",SESSION_REQUEST_PERMISSION:"session/request_permission",FS_READ_TEXT_FILE:"fs/read_text_file",FS_WRITE_TEXT_FILE:"fs/write_text_file"},Z={ABORT:"x/abort",DREAM:"x/dream",AGENTS_LIST:"x/agents.list",SOLO_START:"x/solo.start",SOLO_STATUS:"x/solo.status",SOLO_SELECT:"x/solo.select",SOLO_CANCEL:"x/solo.cancel",PRODUCT_CREATE:"x/product.create",PRODUCT_PLAN:"x/product.plan",PRODUCT_CONFIRM:"x/product.confirm",PRODUCT_MESSAGE:"x/product.message",PRODUCT_RESUME:"x/product.resume",PRODUCT_PAUSE:"x/product.pause",PRODUCT_CANCEL:"x/product.cancel",PRODUCT_ROLLBACK:"x/product.rollback",PRODUCT_STATUS:"x/product.status",SOLO_SUBSCRIBE:"x/solo.subscribe",SOLO_MESSAGE:"x/solo.message",SOLO_EVALUATE:"x/solo.evaluate",PRODUCT_SUBSCRIBE:"x/product.subscribe",TEAM_DELEGATE:"x/team.delegate"},Tt={AGENT_MESSAGE_CHUNK:"agent_message_chunk",AGENT_THOUGHT_CHUNK:"agent_thought_chunk",TOOL_CALL:"tool_call",TOOL_CALL_UPDATE:"tool_call_update",PLAN:"plan",USAGE_UPDATE:"usage_update",CONFIG_OPTION_UPDATE:"config_option_update",SESSION_INFO_UPDATE:"session_info_update",AVAILABLE_COMMANDS_UPDATE:"available_commands_update"},ae={X_SUBAGENT_STARTED:"x_subagent_started",X_SUBAGENT_DELTA:"x_subagent_delta",X_SUBAGENT_ENDED:"x_subagent_ended",X_MEDIA_RESULT:"x_media_result",X_MEDIA_PROGRESS:"x_media_progress",X_SKILL_INSTRUCTION:"x_skill_instruction",X_RECOVERY:"x_recovery",X_SIDECHAIN_STARTED:"x_sidechain_started",X_SIDECHAIN_COMPLETED:"x_sidechain_completed",X_SUGGESTIONS:"x_suggestions",X_ASK_USER:"x_ask_user",X_SESSION_INFO:"x_session_info",X_MEMORY_UPDATED:"x_memory_updated",X_TEAM_MEMBER_UPDATE:"x_team_member_update",X_SOLO_STARTED:"x_solo_started",X_SOLO_AGENT_FINISHED:"x_solo_agent_finished",X_SOLO_SELECTED:"x_solo_selected",X_PRODUCT_TASK_STARTED:"x_product_task_started",X_PRODUCT_TASK_COMPLETED:"x_product_task_completed",X_PRODUCT_CHECKPOINT:"x_product_checkpoint"};function Fn(t){if(!t||typeof t!="object")return!1;let e=t;return e.jsonrpc==="2.0"&&typeof e.method=="string"&&"id"in e}function Hn(t){if(!t||typeof t!="object")return!1;let e=t;return e.jsonrpc==="2.0"&&typeof e.method=="string"&&!("id"in e)}function Hc(t){if(!t||typeof t!="object")return!1;let e=t;return e.jsonrpc==="2.0"&&"id"in e&&!("method"in e)}var Nm="openai-codex";var nq={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"},[Nm]:{providerFamily:"openai"},openrouter:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},opencode:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},kilocode:{providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]}};import{randomUUID as iC}from"node:crypto";var is={PARSE_ERROR:-32700,INVALID_REQUEST:-32600,METHOD_NOT_FOUND:-32601,INVALID_PARAMS:-32602,INTERNAL_ERROR:-32603,PROTOCOL_MISMATCH:-32001,SESSION_NOT_FOUND:-32002,AGENT_BUSY:-32003},as=class{transport;handler;verbose;hostCapabilities={};hostSupportsExtendedEvents=!1;hostSupportsExtendedMethods=!1;activeSessionId=null;pendingPermissions=new Map;outboundRequestMap=new Map;constructor(e,r,n){this.transport=e,this.handler=r,this.verbose=n?.verbose??!1}dispatchMessage(e){if(this.isJsonRpcResponse(e))return this.handleResponse(e),!0;if(Fn(e)){let r=e;return process.stderr.write(`[acp-server] -> recv id=${String(r.id)} method=${r.method}
|
|
39
39
|
`),this.handleRequest(r),!0}return Hn(e)?(this.handleNotification(e),!0):!1}emitSessionUpdate(e,r,n){if(r.startsWith("x_")&&!this.hostSupportsExtendedEvents)return;let o={jsonrpc:"2.0",method:St.SESSION_UPDATE,params:{sessionId:e,update:{sessionUpdate:r,...n}}};this.transport.send(o)}async requestPermission(e){let r=`perm-${iC().slice(0,8)}`,n={jsonrpc:"2.0",method:St.SESSION_REQUEST_PERMISSION,params:e,id:r};return new Promise(o=>{this.outboundRequestMap.set(r,e.permissionId),this.pendingPermissions.set(e.permissionId,{resolve:s=>o({optionId:s})}),this.transport.send(n)})}get supportsExtendedEvents(){return this.hostSupportsExtendedEvents}get supportsExtendedMethods(){return this.hostSupportsExtendedMethods}get sessionId(){return this.activeSessionId}async handleRequest(e){let{method:r,params:n,id:o}=e,s=n??{};try{switch(r){case St.INITIALIZE:await this.onInitialize(o,s);break;case St.SESSION_NEW:await this.onSessionNew(o,s);break;case St.SESSION_PROMPT:await this.onSessionPrompt(o,s);break;case St.SESSION_END:await this.onSessionEnd(o,s);break;case St.SESSION_SET_CONFIG:await this.onSessionSetConfig(o,s);break;case St.SESSION_SET_MODEL:await this.handler.handleAcpSessionSetModel(s.sessionId??this.activeSessionId??"",s.modelId??s.model??""),this.sendResult(o,{});break;case St.SESSION_SET_MODE:await this.handler.handleAcpSessionSetMode(s.sessionId??this.activeSessionId??"",s.modeId??s.mode??""),this.sendResult(o,{});break;case Z.ABORT:await this.onAbort(o,s);break;case Z.DREAM:await this.onDream(o,s);break;case Z.AGENTS_LIST:{let i=await this.handler.handleAcpAgentsList();this.sendResult(o,i);break}case Z.SOLO_START:{let i=await this.handler.handleAcpSoloStart(s);this.sendResult(o,i);break}case Z.SOLO_STATUS:{let i=await this.handler.handleAcpSoloStatus(s);this.sendResult(o,i);break}case Z.SOLO_SELECT:{let i=await this.handler.handleAcpSoloSelect(s);this.sendResult(o,i);break}case Z.SOLO_CANCEL:{let i=await this.handler.handleAcpSoloCancel(s);this.sendResult(o,i);break}case Z.SOLO_SUBSCRIBE:{let i=await this.handler.handleAcpSoloSubscribe(s);this.sendResult(o,i);break}case Z.SOLO_MESSAGE:{let i=await this.handler.handleAcpSoloMessage(s);this.sendResult(o,i);break}case Z.SOLO_EVALUATE:{let i=await this.handler.handleAcpSoloEvaluate(s);this.sendResult(o,i);break}case Z.PRODUCT_CREATE:{let i=await this.handler.handleAcpProductCreate(s);this.sendResult(o,i);break}case Z.PRODUCT_PLAN:{let i=await this.handler.handleAcpProductPlan(s);this.sendResult(o,i);break}case Z.PRODUCT_CONFIRM:{let i=await this.handler.handleAcpProductConfirm(s);this.sendResult(o,i);break}case Z.PRODUCT_MESSAGE:{let i=await this.handler.handleAcpProductMessage(s);this.sendResult(o,i);break}case Z.PRODUCT_PAUSE:{let i=await this.handler.handleAcpProductPause(s);this.sendResult(o,i);break}case Z.PRODUCT_RESUME:{let i=await this.handler.handleAcpProductResume(s);this.sendResult(o,i);break}case Z.PRODUCT_CANCEL:{let i=await this.handler.handleAcpProductCancel(s);this.sendResult(o,i);break}case Z.PRODUCT_ROLLBACK:{let i=await this.handler.handleAcpProductRollback(s);this.sendResult(o,i);break}case Z.PRODUCT_STATUS:{let i=await this.handler.handleAcpProductStatus(s);this.sendResult(o,i);break}case Z.PRODUCT_SUBSCRIBE:{let i=await this.handler.handleAcpProductSubscribe(s);this.sendResult(o,i);break}case Z.TEAM_DELEGATE:{let i=await this.handler.handleAcpTeamDelegate(s);this.sendResult(o,i);break}default:this.sendError(o,is.METHOD_NOT_FOUND,`Unknown method: ${r}`)}}catch(i){this.sendError(o,is.INTERNAL_ERROR,i.message)}}handleNotification(e){this.log(`received notification: ${e.method}`)}handleResponse(e){let r=this.outboundRequestMap.get(e.id);if(r){this.outboundRequestMap.delete(e.id);let n=this.pendingPermissions.get(r);if(n){this.pendingPermissions.delete(r);let o=e.result;n.resolve(o?.optionId??"deny")}}else this.log(`received response for id=${String(e.id)} (no matching outbound request)`)}async onInitialize(e,r){this.hostCapabilities=r.clientCapabilities??{},this.hostSupportsExtendedEvents=this.hostCapabilities.extendedEvents??!1,this.hostSupportsExtendedMethods=this.hostCapabilities.extendedMethods??!1;let n=r.clientInfo?.name??"unknown",o=r.clientInfo?.version??"unknown";this.log(`initialize: host=${n} v=${o}, proto=${String(r.protocolVersion)}, extendedEvents=${this.hostSupportsExtendedEvents}, extendedMethods=${this.hostSupportsExtendedMethods}`);let s=await this.handler.handleAcpInitialize(r);this.sendResult(e,s)}async onSessionNew(e,r){let n=await this.handler.handleAcpSessionNew(r);this.activeSessionId=n.sessionId,this.sendResult(e,n)}async onSessionPrompt(e,r){if(!this.activeSessionId||this.activeSessionId!==r.sessionId){this.sendError(e,is.SESSION_NOT_FOUND,`No active session with id: ${r.sessionId}`);return}let n=await this.handler.handleAcpSessionPrompt(r);this.sendResult(e,n)}async onSessionEnd(e,r){await this.handler.handleAcpSessionEnd(r),this.activeSessionId===r.sessionId&&(this.activeSessionId=null),this.sendResult(e,{})}async onSessionSetConfig(e,r){if(this.activeSessionId!==r.sessionId){this.sendError(e,is.SESSION_NOT_FOUND,`No active session with id: ${r.sessionId}`);return}await this.handler.handleAcpSessionSetConfig(r),this.sendResult(e,{})}async onAbort(e,r){await this.handler.handleAcpAbort(r),this.sendResult(e,{aborted:!0})}async onDream(e,r){let n=await this.handler.handleAcpDream(r);this.sendResult(e,n)}sendResult(e,r){process.stderr.write(`[acp-server] -> send id=${String(e)} result
|
|
40
40
|
`);let n={jsonrpc:"2.0",id:e,result:r};this.transport.send(n)}sendError(e,r,n,o){process.stderr.write(`[acp-server] -> send id=${String(e)} error=${n}
|
|
41
41
|
`);let s={jsonrpc:"2.0",id:e,error:{code:r,message:n,...o!==void 0?{data:o}:{}}};this.transport.send(s)}isJsonRpcResponse(e){if(!e||typeof e!="object")return!1;let r=e;return r.jsonrpc==="2.0"&&"id"in r&&("result"in r||"error"in r)&&!("method"in r)}log(e){this.verbose&&process.stderr.write(`[acp-server] ${e}
|
|
42
|
-
`)}};function Om(t,e,r,n){let o=aC(r,n);o&&t.emitSessionUpdate(e,o.type,o.payload)}function aC(t,e){switch(t){case"turn.delta":return{type:Tt.AGENT_MESSAGE_CHUNK,payload:{content:{type:"text",text:e.text}}};case"turn.reasoning_delta":return{type:Tt.AGENT_THOUGHT_CHUNK,payload:{content:{type:"text",text:e.delta}}};case"turn.tool_call":return{type:Tt.TOOL_CALL,payload:{toolCallId:e.callId,toolName:e.name,status:"in_progress",title:e.name,kind:"execute",rawInput:cC(e.arguments)}};case"turn.tool_result":return{type:Tt.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:Tt.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:Tt.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:Tt.USAGE_UPDATE,payload:{used:n+o,size:r?.contextWindow??2e5}}}case"turn.end":return null;case"turn.error":return{type:Tt.AGENT_MESSAGE_CHUNK,payload:{content:{type:"text",text:`[Error] ${e.error?.message??"Unknown error"}`}}};case"turn.suggestions":return{type:Tt.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??lC(),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 cC(t){if(t)try{return JSON.parse(t)}catch{return{raw:t}}}function lC(){return Math.random().toString(36).slice(2,10)}import{randomUUID as sf}from"node:crypto";import*as Il from"node:path";import{readFile as qc,writeFile as cs,stat as Ym,unlink as wC,mkdir as Jm}from"node:fs/promises";import{join as Zr,resolve as Wm,isAbsolute as Gm,normalize as Km}from"node:path";import{randomUUID as
|
|
42
|
+
`)}};function Om(t,e,r,n){let o=aC(r,n);o&&t.emitSessionUpdate(e,o.type,o.payload)}function aC(t,e){switch(t){case"turn.delta":return{type:Tt.AGENT_MESSAGE_CHUNK,payload:{content:{type:"text",text:e.text}}};case"turn.reasoning_delta":return{type:Tt.AGENT_THOUGHT_CHUNK,payload:{content:{type:"text",text:e.delta}}};case"turn.tool_call":return{type:Tt.TOOL_CALL,payload:{toolCallId:e.callId,toolName:e.name,status:"in_progress",title:e.name,kind:"execute",rawInput:cC(e.arguments)}};case"turn.tool_result":return{type:Tt.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:Tt.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:Tt.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:Tt.USAGE_UPDATE,payload:{used:n+o,size:r?.contextWindow??2e5}}}case"turn.end":return null;case"turn.error":return{type:Tt.AGENT_MESSAGE_CHUNK,payload:{content:{type:"text",text:`[Error] ${e.error?.message??"Unknown error"}`}}};case"turn.suggestions":return{type:Tt.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??lC(),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 cC(t){if(t)try{return JSON.parse(t)}catch{return{raw:t}}}function lC(){return Math.random().toString(36).slice(2,10)}import{randomUUID as sf}from"node:crypto";import*as Il from"node:path";import{readFile as qc,writeFile as cs,stat as Ym,unlink as wC,mkdir as Jm}from"node:fs/promises";import{join as Zr,resolve as Wm,isAbsolute as Gm,normalize as Km}from"node:path";import{randomUUID as AC}from"node:crypto";function jm(){return{toolUseCount:0,latestInputTokens:0,cumulativeOutputTokens:0,recentActivities:[]}}function dC(t){return t.latestInputTokens+t.cumulativeOutputTokens}var uC=new Set(["grep","glob","search","Grep","Glob","list_dir","find_files"]),$m=new Set(["read_file","file_read","cat","head","tail","FileRead"]);function pC(t){return{isSearch:uC.has(t)||void 0,isRead:$m.has(t)||void 0}}function mC(t,e){let r=e.file_path??e.path??e.filePath;if(typeof r=="string")return`${$m.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 Um(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 Fm(t,e,r,n){t.toolUseCount++;let o=pC(e),s={toolName:e,input:r,activityDescription:n?.(e,r)??mC(e,r),isSearch:o.isSearch,isRead:o.isRead};for(t.recentActivities.push(s);t.recentActivities.length>5;)t.recentActivities.shift()}function Bc(t){return{toolUseCount:t.toolUseCount,tokenCount:dC(t),lastActivity:t.recentActivities.length>0?t.recentActivities[t.recentActivities.length-1]:void 0,recentActivities:[...t.recentActivities]}}import{randomUUID as Hm}from"node:crypto";function gC(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 Qr(t){let e=Date.now(),r=[],n={inputTokens:0,outputTokens:0},o=jm(),{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=gC(R),L=`fork-${h}-${Hm().slice(0,8)}`,k=`fork-session-${Hm().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 Gt=c(F,Ee);return Gt.allowed?d.invoke(je,F,J,H):(f.info(`[fork:${h}] tool ${F} denied: ${Gt.reason}`),{result:"",error:Gt.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&&(Um(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{}Fm(o,F.name,J),T?.(Bc(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:Bc(o),durationMs:Oe,ok:de,error:O}}import{readFile as fC,readdir as hC}from"node:fs/promises";import{existsSync as yC}from"node:fs";import{join as vC}from"node:path";var bC={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"},kC={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 RC(t){let e=t.replace(/\.md$/,"").toLowerCase();for(let[r,n]of Object.entries(bC))if(e.startsWith(r+"-")||e.startsWith(r+"_")||e===r)return n;return null}function SC(t){let e=t.slice(0,500),r=null,n=0;for(let[o,s]of Object.entries(kC)){let i=s.filter(a=>a.test(e)).length;i>n&&(n=i,r=o)}return r}async function Bm(t){let e={},r=0,n=0;if(!yC(t))return{categories:e,totalFiles:0,uncategorizedCount:0};let o;try{o=await hC(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=vC(t,i);try{let c=await fC(a,"utf-8");r++;let l=RC(i)??SC(c)??"uncategorized";l==="uncategorized"&&n++;let d=c.split(`
|
|
43
43
|
`),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 TC={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 qm(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(`
|
|
44
44
|
## Category Context (${t.totalFiles} files)
|
|
45
45
|
`),e.push(`Use category-specific merge rules when updating files:
|
|
46
46
|
`);for(let[r,n]of Object.entries(t.categories)){if(n.length===0)continue;let o=TC[r]??"",s=n.reduce((i,a)=>i+a.entryCount,0);e.push(`### ${r} (${n.length} files, ~${s} entries)`),e.push(`**Merge rule**: ${o}`),e.push("Files:");for(let i of n.slice(0,10)){let a=i.description?` \u2014 ${i.description}`:"";e.push(`- \`${i.filename}\` (${i.entryCount} entries, ${Math.ceil(i.sizeBytes/1024)}KB)${a}`)}n.length>10&&e.push(`- ... and ${n.length-10} more files`),e.push("")}return e.push("### File naming convention"),e.push("New files MUST use category prefix: `<category>-<topic>.md`"),e.push("Valid prefixes: lesson-, preference-, pattern-, fact-, decision-, skill-"),e.push(""),e.join(`
|
|
47
|
-
`)}var Qm={minHours:24,minSessions:5,minTurnsInSession:20,scanIntervalMs:6e5},ls=".consolidate-lock",
|
|
47
|
+
`)}var Qm={minHours:24,minSessions:5,minTurnsInSession:20,scanIntervalMs:6e5},ls=".consolidate-lock",PC=3600*1e3,zm="CLAUDE.md",xC=100,CC=new Set(["ls","find","grep","cat","stat","wc","head","tail","file","which","whereis","type","echo","printf","test","diff","sort","uniq","tr","cut","awk","sed","du","df","date","pwd","hostname","uname","git"]),IC=new Set(["log","show","diff","status","branch","tag","remote","rev-parse","rev-list","ls-files","ls-tree","describe","blame","shortlog","name-rev","cat-file"]),EC=/[|>&]|>>|>\s|rm\s|mv\s|cp\s|chmod\s|chown\s|mkdir\s|touch\s/;function MC(t){let e=t.trim();if(!e||EC.test(e))return!1;let r=e.split(/\s+/),n=r[0]?.replace(/^(\/usr\/bin\/|\/bin\/|\/usr\/local\/bin\/)/,"")??"";if(!CC.has(n))return!1;if(n==="git"){let o=r[1];if(!o||!IC.has(o))return!1}return!0}async function _C(t){await Jm(t.memoryRoot,{recursive:!0});let e=Zr(t.memoryRoot,"fact-dream-summary.md"),r;for(let s of t.events){if(s.type!=="end")continue;let i=s.content.trim();i.length>0&&(r=i)}let n=[...new Set(t.filesTouched)],o=["# Dream Consolidation Summary","",`- completedAt: ${new Date().toISOString()}`,`- sessionsReviewed: ${t.sessionsReviewed}`,`- durationMs: ${t.durationMs}`,"","## Agent Summary","",r||"Dream completed without a textual model summary.",...t.sessionDigest?["","## Recent Session Digest","",t.sessionDigest]:[],"","## Files Touched","",...n.length>0?n.map(s=>`- ${s}`):["- none"],""];return await cs(e,o.join(`
|
|
48
48
|
`),"utf8"),e}function DC(t){return t.replace(/[^a-zA-Z0-9_-]/g,"_")}async function NC(t,e){let r=[];for(let n of e.slice(0,8)){let o=Zr(t,DC(n),"transcript.jsonl"),s="";try{s=await qc(o,"utf8")}catch{continue}let i=[];for(let a of s.trim().split(/\r?\n/).slice(-24))try{let c=JSON.parse(a);if(typeof c.content!="string"||c.content.trim().length===0)continue;let l=typeof c.role=="string"?c.role:"message";i.push(`${l}: ${c.content.replace(/\s+/g," ").slice(0,900)}`)}catch{continue}i.length>0&&r.push(`### Session ${n}
|
|
49
49
|
${i.join(`
|
|
50
50
|
`)}`)}return r.join(`
|
|
@@ -152,13 +152,13 @@ Sessions since last consolidation (${r.length}):
|
|
|
152
152
|
${r.map(s=>`- ${s}`).join(`
|
|
153
153
|
`)}
|
|
154
154
|
|
|
155
|
-
Return a brief summary of what you consolidated, updated, or pruned. If nothing changed (memories are already tight), say so.`}var Vm=0;async function OC(t,e={}){let r={...Qm,...e},n;try{n=await tg(t.memoryRoot)}catch{n=0}let o=(Date.now()-n)/36e5;if(!r.force&&o<r.minHours)return null;let s=Date.now()-Vm;if(!r.force&&s<r.scanIntervalMs)return null;Vm=Date.now();let i;try{i=await t.listSessionsSince(n)}catch{return null}i=i.filter(l=>l!==t.currentSessionId);let a=i.length>=r.minSessions,c=(t.currentSessionTurnCount??0)>=r.minTurnsInSession;return!r.force&&!a&&!c?null:(!a&&c&&(i=[t.currentSessionId]),{sessionIds:i})}async function tg(t){let e=Zr(t,ls);return(await Ym(e)).mtimeMs}function jC(t){try{return process.kill(t,0),!0}catch{return!1}}async function $C(t){let e=Zr(t,ls),r,n;try{let[s,i]=await Promise.all([Ym(e),qc(e,"utf8")]);r=s.mtimeMs;let a=parseInt(i.trim(),10);n=Number.isFinite(a)?a:void 0}catch{}if(r!==void 0&&Date.now()-r<
|
|
155
|
+
Return a brief summary of what you consolidated, updated, or pruned. If nothing changed (memories are already tight), say so.`}var Vm=0;async function OC(t,e={}){let r={...Qm,...e},n;try{n=await tg(t.memoryRoot)}catch{n=0}let o=(Date.now()-n)/36e5;if(!r.force&&o<r.minHours)return null;let s=Date.now()-Vm;if(!r.force&&s<r.scanIntervalMs)return null;Vm=Date.now();let i;try{i=await t.listSessionsSince(n)}catch{return null}i=i.filter(l=>l!==t.currentSessionId);let a=i.length>=r.minSessions,c=(t.currentSessionTurnCount??0)>=r.minTurnsInSession;return!r.force&&!a&&!c?null:(!a&&c&&(i=[t.currentSessionId]),{sessionIds:i})}async function tg(t){let e=Zr(t,ls);return(await Ym(e)).mtimeMs}function jC(t){try{return process.kill(t,0),!0}catch{return!1}}async function $C(t){let e=Zr(t,ls),r,n;try{let[s,i]=await Promise.all([Ym(e),qc(e,"utf8")]);r=s.mtimeMs;let a=parseInt(i.trim(),10);n=Number.isFinite(a)?a:void 0}catch{}if(r!==void 0&&Date.now()-r<PC&&n!==void 0&&jC(n))return null;await Jm(t,{recursive:!0}),await cs(e,String(process.pid));let o;try{o=await qc(e,"utf8")}catch{return null}return parseInt(o.trim(),10)!==process.pid?null:r??0}async function Xm(t,e){let r=Zr(t,ls);try{if(e===0){await wC(r);return}await cs(r,"");let{utimes:n}=await import("node:fs/promises"),o=e/1e3;await n(r,o,o)}catch{}}async function UC(t){let e=Zr(t,ls);await cs(e,String(process.pid))}function FC(t){return{taskId:`dream-${AC().slice(0,8)}`,type:"dream",label:"Memory consolidation",permissionRole:"worker",isolation:"shared",lifecycle:"running",depth:1,maxTurns:0,tokenBudget:0,startedAt:Date.now(),parentTaskId:t.parentTaskId,sessionId:t.sessionId,phase:"starting",sessionsReviewing:t.sessionsReviewing,filesTouched:[],turns:[],priorLockMtime:t.priorLockMtime}}async function HC(t,e={}){let r={...Qm,...e},n=await OC(t,r);if(!n)return null;let o;if(r.force)try{o=await tg(t.memoryRoot)}catch{o=0}else if(o=await $C(t.memoryRoot),o===null)return null;let s=eg(t.memoryRoot,t.transcriptDir,n.sessionIds),i=FC({sessionId:t.currentSessionId,sessionsReviewing:n.sessionIds.length,priorLockMtime:o});return{prompt:s,taskState:i,sessionIds:n.sessionIds}}async function rg(t){let e=Date.now(),r=await HC(t.context,t.triggerConfig);if(!r)return{ok:!0,sessionsReviewed:0,filesTouched:[],turns:[],durationMs:Date.now()-e};let{taskState:n,sessionIds:o}=r,s="";try{let b=await Bm(t.context.memoryRoot);b.totalFiles>0&&(s=qm(b))}catch{}let i=!!(t.memoryProvider&&t.memoryUserId),a="";if(i&&t.memoryProvider?.getActivitySummary)try{let b=t.memoryProvider.getActivitySummary(t.memoryUserId,7);if(b.dailyCounts.length>0){let v=["## Recent Memory Activity (last 7 days)"];v.push("");for(let R of b.dailyCounts)v.push(`- ${R.date}: ${R.count} memories recorded`);if(b.highlights.length>0){v.push(""),v.push("**High-importance entries:**");for(let R of b.highlights.slice(0,10))v.push(`- [${R.category}] ${R.text.slice(0,100)}${R.text.length>100?"...":""} (${R.date})`)}a=`
|
|
156
156
|
`+v.join(`
|
|
157
157
|
`)+`
|
|
158
158
|
`}}catch{}let c="";if(i&&t.memoryProvider?.getAllProfiles)try{let b=t.memoryProvider.getAllProfiles(t.memoryUserId),v=Object.entries(b);if(v.length>0){let R=["## Known User Profile"];R.push("");for(let[S,T]of v.slice(0,20))R.push(`- **${S}**: ${T}`);c=`
|
|
159
159
|
`+R.join(`
|
|
160
160
|
`)+`
|
|
161
|
-
`}}catch{}let l="";try{l=await NC(t.context.transcriptDir,o)}catch{l=""}let d=eg(t.context.memoryRoot,t.context.transcriptDir,o,{hasQMemory:i,categoryContext:s||void 0,temporalContext:a||void 0,profileContext:c||void 0,sessionDigest:l||void 0});t.log.info(`[dream] starting consolidation \u2014 ${o.length} sessions, memoryRoot=${t.context.memoryRoot}`+(i?", memory=enabled":"")),t.hooks?.invoke("subagent.started",{sessionId:t.context.currentSessionId,turnId:n.taskId,subagentId:n.taskId,agentType:"dream"}).catch(()=>{});let p=(b,v)=>LC(t.context.memoryRoot,{toolName:b,input:v}),u=i?[{type:"function",function:{name:"qmemory_search",description:"Search the user's long-term memory (QMemory). Returns relevant memories sorted by relevance.",parameters:{type:"object",properties:{query:{type:"string",description:"Semantic search query"},limit:{type:"number",description:"Max results (default: 10)"}},required:["query"]}}},{type:"function",function:{name:"qmemory_store",description:"Submit a low-priority candidate to the memory consolidation pipeline. Use for user preferences, facts, and cross-project knowledge; it may merge, conflict, or wait for confirmation.",parameters:{type:"object",properties:{text:{type:"string",description:"The candidate memory text to submit"},source:{type:"string",description:"Source label (e.g. 'dream-consolidation')"}},required:["text"]}}},{type:"function",function:{name:"qmemory_feedback",description:"Submit feedback on recalled memories (e.g. mark as outdated or wrong).",parameters:{type:"object",properties:{memoryIds:{type:"array",items:{type:"string"},description:"IDs of memories to give feedback on"},signal:{type:"string",enum:["useful","irrelevant","outdated","wrong"],description:"Feedback signal"}},required:["memoryIds","signal"]}}},{type:"function",function:{name:"qmemory_temporal",description:"Query memories by time range. Use for temporal synthesis ('what happened last week', 'recent decisions').",parameters:{type:"object",properties:{days:{type:"number",description:"Look back N days from today (default: 7)"},category:{type:"string",description:"Filter by category (optional)"}}}}},{type:"function",function:{name:"qmemory_profile",description:"Read or write user profile entries. Use 'get' to read all, 'set' to update a key.",parameters:{type:"object",properties:{action:{type:"string",enum:["get","set"],description:"Action to perform"},key:{type:"string",description:"Profile key (required for 'set')"},value:{type:"string",description:"Profile value (required for 'set')"}},required:["action"]}}}]:[],m=i?{invoke:async(b,v,R,S)=>{let T=t.memoryProvider,C=t.memoryUserId;if(v==="qmemory_search"){let{query:E,limit:M}=JSON.parse(R),L=await T.search(E,C,{limit:M??10});return{result:JSON.stringify(L)}}if(v==="qmemory_store"){if(!T.proposeExtracted)return{result:"",error:"memory proposals are not supported"};let{text:E,source:M}=JSON.parse(R),L=await T.proposeExtracted([{text:E,category:"insight",importance:.45}],C,{sessionId:t.context.currentSessionId,source:M??"dream-consolidation"});return{result:JSON.stringify(L)}}if(v==="qmemory_feedback"){if(!T.feedback)return{result:"Feedback noted (no handler)."};let{memoryIds:E,signal:M}=JSON.parse(R);return{result:`Feedback applied to ${(await T.feedback(E,M)).affected} memories.`}}if(v==="qmemory_temporal"){if(!T.synthesizeTimeline)return{result:"Temporal synthesis not available."};let{days:E,category:M}=JSON.parse(R),L=E??7,k=Date.now()-L*864e5;return{result:T.synthesizeTimeline(C,k,Date.now())}}if(v==="qmemory_profile"){let{action:E,key:M,value:L}=JSON.parse(R);if(E==="get"){if(!T.getAllProfiles)return{result:"{}"};let k=T.getAllProfiles(C);return{result:JSON.stringify(k)}}return E==="set"&&M&&L?T.setProfile?(T.setProfile(C,M,L),{result:`Profile updated: ${M} = ${L}`}):{result:"Profile write not available."}:{result:"Invalid profile action. Use 'get' or 'set' with key/value."}}return t.toolInvoker.invoke(b,v,R,S)}}:t.toolInvoker,f=new Set(["read","write","edit","patch","exec","search","qmemory_search","qmemory_store","qmemory_feedback","qmemory_temporal","qmemory_profile"]),h=[...t.tools.filter(b=>f.has(b.function.name)),...u];try{let b=await Qr({promptMessages:[{role:"user",content:"Begin memory consolidation."}],systemPrompt:d,tools:h,canUseTool:p,transport:t.transport,toolInvoker:m,createAgentRunner:t.createAgentRunner,apiKey:t.apiKey,model:t.model,log:t.log,hooks:void 0,forkLabel:"dream-consolidation",maxTurns:15,parentSignal:t.parentSignal,skipTranscript:!0}),v=[];for(let R of b.events)if(R.type==="tool_call")try{let S=JSON.parse(R.arguments),T=S.file_path??S.path??S.filePath;T&&Zm(T,t.context.memoryRoot)&&v.push(T)}catch{}if(b.ok){let R=await _C({memoryRoot:t.context.memoryRoot,sessionsReviewed:o.length,durationMs:b.durationMs,events:b.events,filesTouched:v,sessionDigest:l||void 0});v.push(R),await UC(t.context.memoryRoot),t.log.info(`[dream] consolidation complete \u2014 ${v.length} files touched, ${b.durationMs}ms`)}else await Xm(t.context.memoryRoot,n.priorLockMtime),t.log.warn(`[dream] consolidation failed: ${b.error}`);return t.hooks?.invoke("subagent.stopped",{sessionId:t.context.currentSessionId,turnId:n.taskId,subagentId:n.taskId,agentType:"dream",reason:b.ok?"normal":"error",error:b.error}).catch(()=>{}),{ok:b.ok,sessionsReviewed:o.length,filesTouched:[...new Set(v)],turns:[],durationMs:Date.now()-e,error:b.error}}catch(b){await Xm(t.context.memoryRoot,n.priorLockMtime).catch(()=>{});let v=b instanceof Error?b.message:String(b);return t.log.warn(`[dream] consolidation error: ${v}`),t.hooks?.invoke("subagent.stopped",{sessionId:t.context.currentSessionId,turnId:n.taskId,subagentId:n.taskId,agentType:"dream",reason:"error",error:v}).catch(()=>{}),{ok:!1,sessionsReviewed:0,filesTouched:[],turns:[],durationMs:Date.now()-e,error:v}}}import*as ds from"node:fs/promises";import*as Wc from"node:path";var ng={minIntervalHours:24,temporalExpiry:!0,stalenessDecay:!0,noiseArchival:!0},og=".last-decay";async function BC(t,e={}){let r=(e.minIntervalHours??ng.minIntervalHours)*36e5,n=Wc.join(t,og);try{let o=await ds.readFile(n,"utf-8"),s=parseInt(o.trim(),10);return isNaN(s)?!0:Date.now()-s>=r}catch{return!0}}async function qC(t){let e=Wc.join(t,og);await ds.writeFile(e,String(Date.now()),"utf-8")}async function sg(t){let e=Date.now(),r={...ng,...t.config};if(!await BC(t.memoryRoot,r))return t.log?.debug?.("[decay] Skipped \u2014 cooldown not elapsed"),{ran:!1,decayed:0,archived:0,durationMs:Date.now()-e};t.log?.info("[decay] Starting importance decay cycle");try{let o=await t.adapter.triggerDecay(t.userId);await qC(t.memoryRoot);let s=Date.now()-e;return t.log?.info(`[decay] Completed \u2014 decayed=${o.decayed}, ${s}ms`),{ran:!0,decayed:o.decayed,archived:0,durationMs:s}}catch(o){let s=Date.now()-e;return t.log?.info(`[decay] Failed \u2014 ${o instanceof Error?o.message:String(o)}`),{ran:!1,decayed:0,archived:0,durationMs:s}}}G();He();function Gc(t,e,r,n){return{role:"assistant",content:e||null,tool_calls:t,...r&&r.length>0?{thinkingBlocks:r}:{},...n?{reasoning_content:n}:{}}}function us(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 WC=/\b(?:daily|weekly|monthly)(?:\/(?:daily|weekly|monthly))* (?:usage )?limit(?:s)?(?: (?:exhausted|reached|exceeded))?\b/i,Tr={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]},GC=/^(?:error[:\s-]+)?billing(?:\s+error)?(?:[:\s-]+|$)|^(?:error[:\s-]+)?(?:credit balance|insufficient credits?|payment required|http\s*402\b)/i,KC=/["']?(?:status|code)["']?\s*[:=]\s*402\b|\bhttp\s*402\b|\berror(?:\s+code)?\s*[:=]?\s*402\b|^\s*402\s+payment/i,zC=512,VC=/^(?:http\s*)?(\d{3})(?:\s+([\s\S]+))?$/i;var XC=new Set([500,502,503,504,521,522,523,524,529]),YC=["insufficient credits","insufficient quota","credit balance","insufficient balance","plans & billing","add more credits","top up"],JC=["upgrade your plan","upgrade plan","current plan","subscription"],QC=["daily","weekly","monthly"],ZC=["try again","retry","temporary","cooldown"],eI=["usage limit","rate limit","organization usage"],tI=["organization","workspace"],rI=["billing period","exceeded","reached","exhausted"],nI=/["']?(?: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,oI=/^(?:error[:\s-]+)?(?:(?:http\s*)?402(?:\s+payment required)?|payment required)(?:[:\s-]+|$)/i;function wr(t,e){if(!t)return!1;let r=t.toLowerCase();return e.some(n=>n instanceof RegExp?n.test(r):r.includes(n))}function sI(t){return wr(t,Tr.format)}function ig(t){return wr(t,Tr.rateLimit)}function iI(t){return wr(t,Tr.timeout)}function aI(t){return WC.test(t)}function Kc(t){let e=t.toLowerCase();return e?t.length>zC?KC.test(e):wr(e,Tr.billing)?!0:GC.test(t)?e.includes("upgrade")||e.includes("credits")||e.includes("payment")||e.includes("plan"):!1:!1}function ag(t){return wr(t,Tr.authPermanent)}function cI(t){return wr(t,Tr.auth)}function cg(t){return wr(t,Tr.overloaded)}function Sr(t,e){return e.some(r=>t.includes(r))}function lI(t){return Sr(t,YC)||Sr(t,JC)&&t.includes("limit")||t.includes("billing hard limit")||t.includes("hard limit reached")||t.includes("maximum allowed")&&t.includes("limit")}function dI(t){let e=Sr(t,QC),r=t.includes("spend limit")||t.includes("spending limit"),n=Sr(t,tI);return Sr(t,ZC)&&Sr(t,eI)||e&&(t.includes("usage limit")||r)||e&&t.includes("limit")&&t.includes("reset")||n&&t.includes("limit")&&(r||Sr(t,rI))}function uI(t){return t.trim().toLowerCase().replace(oI,"").trim()}function lg(t){let e=uI(t);return!e||lI(e)?"billing":ig(e)||dI(e)?"rate_limit":"billing"}function pI(t){return nI.test(t)?lg(t):null}function dg(t){let e=t.match(VC);if(!e)return null;let r=Number(e[1]);return Number.isFinite(r)?{code:r,rest:(e[2]??"").trim()}:null}function mI(t){if(!t)return!1;let e=t.toLowerCase();return e.includes('"type":"api_error"')&&e.includes("internal server error")}function gI(t){let e=t.trim();if(!e)return!1;let r=dg(e);return r?XC.has(r.code):!1}function ug(t,e){return typeof t!="number"||!Number.isFinite(t)?null:t===402?e?lg(e):"billing":t===429?"rate_limit":t===401||t===403?e&&ag(e)?"auth_permanent":"auth":t===408?"timeout":t===503?e&&cg(e)?"overloaded":"timeout":t===502||t===504?"timeout":t===529?"overloaded":t===400?e&&Kc(e)?"billing":"format":null}function fI(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 hI(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 pg(t){if(hI(t))return"session_expired";if(fI(t))return"model_not_found";let e=pI(t);return e||(aI(t)?Kc(t)?"billing":"rate_limit":ig(t)?"rate_limit":cg(t)?"overloaded":gI(t)?dg(t.trim())?.code===529?"overloaded":"timeout":mI(t)?"timeout":sI(t)?"format":Kc(t)?"billing":iI(t)?"timeout":ag(t)?"auth_permanent":cI(t)?"auth":null)}var yI={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"},vI=new Set(["RETRYABLE_TRANSIENT","RETRYABLE_DEGRADED","TOOL_EXECUTION_FAILED"]);function en(t,e){let r=ug(t,e)??(e?pg(e):null);return r?yI[r]:typeof t=="number"&&t>=400&&t<500?"NON_RETRYABLE_CONTENT":"RETRYABLE_TRANSIENT"}function zc(t){return vI.has(t)}function Kn(t){return typeof t.compressAsync=="function"}var mg=4,tn=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>=mg)break;if(s-u<0&&c<mg){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 Pr=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:bI(s.content,this.maxToolResultChars)})),droppedCount:n,strategy:"tool-result-trim"}}};function bI(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(`}
|
|
161
|
+
`}}catch{}let l="";try{l=await NC(t.context.transcriptDir,o)}catch{l=""}let d=eg(t.context.memoryRoot,t.context.transcriptDir,o,{hasQMemory:i,categoryContext:s||void 0,temporalContext:a||void 0,profileContext:c||void 0,sessionDigest:l||void 0});t.log.info(`[dream] starting consolidation \u2014 ${o.length} sessions, memoryRoot=${t.context.memoryRoot}`+(i?", memory=enabled":"")),t.hooks?.invoke("subagent.started",{sessionId:t.context.currentSessionId,turnId:n.taskId,subagentId:n.taskId,agentType:"dream"}).catch(()=>{});let p=(b,v)=>LC(t.context.memoryRoot,{toolName:b,input:v}),u=i?[{type:"function",function:{name:"qmemory_search",description:"Search the user's long-term memory (QMemory). Returns relevant memories sorted by relevance.",parameters:{type:"object",properties:{query:{type:"string",description:"Semantic search query"},limit:{type:"number",description:"Max results (default: 10)"}},required:["query"]}}},{type:"function",function:{name:"qmemory_store",description:"Submit a low-priority candidate to the memory consolidation pipeline. Use for user preferences, facts, and cross-project knowledge; it may merge, conflict, or wait for confirmation.",parameters:{type:"object",properties:{text:{type:"string",description:"The candidate memory text to submit"},source:{type:"string",description:"Source label (e.g. 'dream-consolidation')"}},required:["text"]}}},{type:"function",function:{name:"qmemory_feedback",description:"Submit feedback on recalled memories (e.g. mark as outdated or wrong).",parameters:{type:"object",properties:{memoryIds:{type:"array",items:{type:"string"},description:"IDs of memories to give feedback on"},signal:{type:"string",enum:["useful","irrelevant","outdated","wrong"],description:"Feedback signal"}},required:["memoryIds","signal"]}}},{type:"function",function:{name:"qmemory_temporal",description:"Query memories by time range. Use for temporal synthesis ('what happened last week', 'recent decisions').",parameters:{type:"object",properties:{days:{type:"number",description:"Look back N days from today (default: 7)"},category:{type:"string",description:"Filter by category (optional)"}}}}},{type:"function",function:{name:"qmemory_profile",description:"Read or write user profile entries. Use 'get' to read all, 'set' to update a key.",parameters:{type:"object",properties:{action:{type:"string",enum:["get","set"],description:"Action to perform"},key:{type:"string",description:"Profile key (required for 'set')"},value:{type:"string",description:"Profile value (required for 'set')"}},required:["action"]}}}]:[],m=i?{invoke:async(b,v,R,S)=>{let T=t.memoryProvider,C=t.memoryUserId;if(v==="qmemory_search"){let{query:E,limit:M}=JSON.parse(R),L=await T.search(E,C,{limit:M??10});return{result:JSON.stringify(L)}}if(v==="qmemory_store"){if(!T.proposeExtracted)return{result:"",error:"memory proposals are not supported"};let{text:E,source:M}=JSON.parse(R),L=await T.proposeExtracted([{text:E,category:"insight",importance:.45}],C,{sessionId:t.context.currentSessionId,source:M??"dream-consolidation"});return{result:JSON.stringify(L)}}if(v==="qmemory_feedback"){if(!T.feedback)return{result:"Feedback noted (no handler)."};let{memoryIds:E,signal:M}=JSON.parse(R);return{result:`Feedback applied to ${(await T.feedback(E,M)).affected} memories.`}}if(v==="qmemory_temporal"){if(!T.synthesizeTimeline)return{result:"Temporal synthesis not available."};let{days:E,category:M}=JSON.parse(R),L=E??7,k=Date.now()-L*864e5;return{result:T.synthesizeTimeline(C,k,Date.now())}}if(v==="qmemory_profile"){let{action:E,key:M,value:L}=JSON.parse(R);if(E==="get"){if(!T.getAllProfiles)return{result:"{}"};let k=T.getAllProfiles(C);return{result:JSON.stringify(k)}}return E==="set"&&M&&L?T.setProfile?(T.setProfile(C,M,L),{result:`Profile updated: ${M} = ${L}`}):{result:"Profile write not available."}:{result:"Invalid profile action. Use 'get' or 'set' with key/value."}}return t.toolInvoker.invoke(b,v,R,S)}}:t.toolInvoker,f=new Set(["read","write","edit","patch","exec","search","qmemory_search","qmemory_store","qmemory_feedback","qmemory_temporal","qmemory_profile"]),h=[...t.tools.filter(b=>f.has(b.function.name)),...u];try{let b=await Qr({promptMessages:[{role:"user",content:"Begin memory consolidation."}],systemPrompt:d,tools:h,canUseTool:p,transport:t.transport,toolInvoker:m,createAgentRunner:t.createAgentRunner,apiKey:t.apiKey,model:t.model,log:t.log,hooks:void 0,forkLabel:"dream-consolidation",maxTurns:15,parentSignal:t.parentSignal,skipTranscript:!0}),v=[];for(let R of b.events)if(R.type==="tool_call")try{let S=JSON.parse(R.arguments),T=S.file_path??S.path??S.filePath;T&&Zm(T,t.context.memoryRoot)&&v.push(T)}catch{}if(b.ok){let R=await _C({memoryRoot:t.context.memoryRoot,sessionsReviewed:o.length,durationMs:b.durationMs,events:b.events,filesTouched:v,sessionDigest:l||void 0});v.push(R),await UC(t.context.memoryRoot),t.log.info(`[dream] consolidation complete \u2014 ${v.length} files touched, ${b.durationMs}ms`)}else await Xm(t.context.memoryRoot,n.priorLockMtime),t.log.warn(`[dream] consolidation failed: ${b.error}`);return t.hooks?.invoke("subagent.stopped",{sessionId:t.context.currentSessionId,turnId:n.taskId,subagentId:n.taskId,agentType:"dream",reason:b.ok?"normal":"error",error:b.error}).catch(()=>{}),{ok:b.ok,sessionsReviewed:o.length,filesTouched:[...new Set(v)],turns:[],durationMs:Date.now()-e,error:b.error}}catch(b){await Xm(t.context.memoryRoot,n.priorLockMtime).catch(()=>{});let v=b instanceof Error?b.message:String(b);return t.log.warn(`[dream] consolidation error: ${v}`),t.hooks?.invoke("subagent.stopped",{sessionId:t.context.currentSessionId,turnId:n.taskId,subagentId:n.taskId,agentType:"dream",reason:"error",error:v}).catch(()=>{}),{ok:!1,sessionsReviewed:0,filesTouched:[],turns:[],durationMs:Date.now()-e,error:v}}}import*as ds from"node:fs/promises";import*as Wc from"node:path";var ng={minIntervalHours:24,temporalExpiry:!0,stalenessDecay:!0,noiseArchival:!0},og=".last-decay";async function BC(t,e={}){let r=(e.minIntervalHours??ng.minIntervalHours)*36e5,n=Wc.join(t,og);try{let o=await ds.readFile(n,"utf-8"),s=parseInt(o.trim(),10);return isNaN(s)?!0:Date.now()-s>=r}catch{return!0}}async function qC(t){let e=Wc.join(t,og);await ds.writeFile(e,String(Date.now()),"utf-8")}async function sg(t){let e=Date.now(),r={...ng,...t.config};if(!await BC(t.memoryRoot,r))return t.log?.debug?.("[decay] Skipped \u2014 cooldown not elapsed"),{ran:!1,decayed:0,archived:0,durationMs:Date.now()-e};t.log?.info("[decay] Starting importance decay cycle");try{let o=await t.adapter.triggerDecay(t.userId);await qC(t.memoryRoot);let s=Date.now()-e;return t.log?.info(`[decay] Completed \u2014 decayed=${o.decayed}, ${s}ms`),{ran:!0,decayed:o.decayed,archived:0,durationMs:s}}catch(o){let s=Date.now()-e;return t.log?.info(`[decay] Failed \u2014 ${o instanceof Error?o.message:String(o)}`),{ran:!1,decayed:0,archived:0,durationMs:s}}}G();He();function Gc(t,e,r,n){return{role:"assistant",content:e||null,tool_calls:t,...r&&r.length>0?{thinkingBlocks:r}:{},...n?{reasoning_content:n}:{}}}function us(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 WC=/\b(?:daily|weekly|monthly)(?:\/(?:daily|weekly|monthly))* (?:usage )?limit(?:s)?(?: (?:exhausted|reached|exceeded))?\b/i,Tr={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]},GC=/^(?:error[:\s-]+)?billing(?:\s+error)?(?:[:\s-]+|$)|^(?:error[:\s-]+)?(?:credit balance|insufficient credits?|payment required|http\s*402\b)/i,KC=/["']?(?:status|code)["']?\s*[:=]\s*402\b|\bhttp\s*402\b|\berror(?:\s+code)?\s*[:=]?\s*402\b|^\s*402\s+payment/i,zC=512,VC=/^(?:http\s*)?(\d{3})(?:\s+([\s\S]+))?$/i;var XC=new Set([500,502,503,504,521,522,523,524,529]),YC=["insufficient credits","insufficient quota","credit balance","insufficient balance","plans & billing","add more credits","top up"],JC=["upgrade your plan","upgrade plan","current plan","subscription"],QC=["daily","weekly","monthly"],ZC=["try again","retry","temporary","cooldown"],eI=["usage limit","rate limit","organization usage"],tI=["organization","workspace"],rI=["billing period","exceeded","reached","exhausted"],nI=/["']?(?: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,oI=/^(?:error[:\s-]+)?(?:(?:http\s*)?402(?:\s+payment required)?|payment required)(?:[:\s-]+|$)/i;function wr(t,e){if(!t)return!1;let r=t.toLowerCase();return e.some(n=>n instanceof RegExp?n.test(r):r.includes(n))}function sI(t){return wr(t,Tr.format)}function ig(t){return wr(t,Tr.rateLimit)}function iI(t){return wr(t,Tr.timeout)}function aI(t){return WC.test(t)}function Kc(t){let e=t.toLowerCase();return e?t.length>zC?KC.test(e):wr(e,Tr.billing)?!0:GC.test(t)?e.includes("upgrade")||e.includes("credits")||e.includes("payment")||e.includes("plan"):!1:!1}function ag(t){return wr(t,Tr.authPermanent)}function cI(t){return wr(t,Tr.auth)}function cg(t){return wr(t,Tr.overloaded)}function Sr(t,e){return e.some(r=>t.includes(r))}function lI(t){return Sr(t,YC)||Sr(t,JC)&&t.includes("limit")||t.includes("billing hard limit")||t.includes("hard limit reached")||t.includes("maximum allowed")&&t.includes("limit")}function dI(t){let e=Sr(t,QC),r=t.includes("spend limit")||t.includes("spending limit"),n=Sr(t,tI);return Sr(t,ZC)&&Sr(t,eI)||e&&(t.includes("usage limit")||r)||e&&t.includes("limit")&&t.includes("reset")||n&&t.includes("limit")&&(r||Sr(t,rI))}function uI(t){return t.trim().toLowerCase().replace(oI,"").trim()}function lg(t){let e=uI(t);return!e||lI(e)?"billing":ig(e)||dI(e)?"rate_limit":"billing"}function pI(t){return nI.test(t)?lg(t):null}function dg(t){let e=t.match(VC);if(!e)return null;let r=Number(e[1]);return Number.isFinite(r)?{code:r,rest:(e[2]??"").trim()}:null}function mI(t){if(!t)return!1;let e=t.toLowerCase();return e.includes('"type":"api_error"')&&e.includes("internal server error")}function gI(t){let e=t.trim();if(!e)return!1;let r=dg(e);return r?XC.has(r.code):!1}function ug(t,e){return typeof t!="number"||!Number.isFinite(t)?null:t===402?e?lg(e):"billing":t===429?"rate_limit":t===401||t===403?e&&ag(e)?"auth_permanent":"auth":t===408?"timeout":t===503?e&&cg(e)?"overloaded":"timeout":t===502||t===504?"timeout":t===529?"overloaded":t===400?e&&Kc(e)?"billing":"format":null}function fI(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 hI(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 pg(t){if(hI(t))return"session_expired";if(fI(t))return"model_not_found";let e=pI(t);return e||(aI(t)?Kc(t)?"billing":"rate_limit":ig(t)?"rate_limit":cg(t)?"overloaded":gI(t)?dg(t.trim())?.code===529?"overloaded":"timeout":mI(t)?"timeout":sI(t)?"format":Kc(t)?"billing":iI(t)?"timeout":ag(t)?"auth_permanent":cI(t)?"auth":null)}var yI={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"},vI=new Set(["RETRYABLE_TRANSIENT","RETRYABLE_DEGRADED","TOOL_EXECUTION_FAILED"]);function en(t,e){let r=ug(t,e)??(e?pg(e):null);return r?yI[r]:typeof t=="number"&&t>=400&&t<500?"NON_RETRYABLE_CONTENT":"RETRYABLE_TRANSIENT"}function zc(t){return vI.has(t)}function Kn(t){return typeof t.compressAsync=="function"}var mg=4,tn=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>=mg)break;if(s-u<0&&c<mg){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 Ar=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:bI(s.content,this.maxToolResultChars)})),droppedCount:n,strategy:"tool-result-trim"}}};function bI(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(`}
|
|
162
162
|
`),r.lastIndexOf(`]
|
|
163
163
|
`));if(s>e*.5)return r.slice(0,s+1)+`
|
|
164
164
|
[...truncated: ${t.length-s-1} chars omitted]`}let o=r.lastIndexOf(`
|
|
@@ -170,15 +170,15 @@ Return a brief summary of what you consolidated, updated, or pruned. If nothing
|
|
|
170
170
|
${g}`},b=[...o,...p,h,...m],v=Date.now()-n,R=b.reduce((S,T)=>S+this.config.estimateTokens(T),0);return{messages:b,droppedCount:u.length,strategy:"head-tail-protected",metrics:{tokensBefore:i,tokensAfter:R,compressionRatio:i>0?R/i:1,latencyMs:v,usedLlm:!0,cacheInvalidated:!0}}}};var qn=class{config;constructor(e){this.config=e}compress(e,r){let n=ps(e),o=this.config.inner.compress(e,r),s=ps(o.messages),i=n!==s&&o.droppedCount>0;return i&&this.config.onCacheInvalidated?.({droppedCount:o.droppedCount,strategy:o.strategy}),{...o,metrics:{...o.metrics??{tokensBefore:0,tokensAfter:0,compressionRatio:0,latencyMs:0,usedLlm:!1},cacheInvalidated:i}}}async compressAsync(e,r){let n=ps(e),o=Kn(this.config.inner)?await this.config.inner.compressAsync(e,r):this.config.inner.compress(e,r),s=ps(o.messages),i=n!==s&&o.droppedCount>0;return i&&this.config.onCacheInvalidated?.({droppedCount:o.droppedCount,strategy:o.strategy}),{...o,metrics:{...o.metrics??{tokensBefore:0,tokensAfter:0,compressionRatio:0,latencyMs:0,usedLlm:!1},cacheInvalidated:i}}}},fg={modelContextWindow:128e3,targetUsageRatio:.75,minBudget:16e3,maxBudget:12e4};function ms(t={}){let e={...fg,...t},r=Math.floor(e.modelContextWindow*e.targetUsageRatio);return Math.max(e.minBudget,Math.min(r,e.maxBudget))}function zn(t,e){let r=t/e;return r<=.8?"none":r<=1?"trim-only":r<=1.5?"sliding-window":"llm-summarize"}var Wn=class{events=[];maxEvents;constructor(e=100){this.maxEvents=e}record(e){this.events.push(e),this.events.length>this.maxEvents&&this.events.shift()}snapshot(){let e=this.events.length;if(e===0)return{totalCompressions:0,totalLlmCalls:0,totalCacheInvalidations:0,averageCompressionRatio:1,averageLatencyMs:0,totalTokensSaved:0,recentEvents:[]};let r=0,n=0,o=0,s=0,i=0;for(let a of this.events)r+=a.tokensBefore>0?a.tokensAfter/a.tokensBefore:1,n+=a.latencyMs,o+=Math.max(0,a.tokensBefore-a.tokensAfter),a.usedLlm&&s++,a.cacheInvalidated&&i++;return{totalCompressions:e,totalLlmCalls:s,totalCacheInvalidations:i,averageCompressionRatio:r/e,averageLatencyMs:n/e,totalTokensSaved:o,recentEvents:this.events.slice(-10)}}reset(){this.events.length=0}},Gn=class{engines=new Map;activeId;register(e){this.engines.set(e.id,e)}activate(e){return this.engines.has(e)?(this.activeId=e,!0):!1}getActive(){return this.activeId?this.engines.get(this.activeId):void 0}listEngines(){return Array.from(this.engines.values()).map(e=>({id:e.id,label:e.label,active:e.id===this.activeId}))}};function kI(t){let e=[],r=[];for(let n of t)n.role==="system"?e.push(n):r.push(n);return{system:e,nonSystem:r}}function Yc(t){let e=typeof t.content=="string"?t.content:t.content!=null?JSON.stringify(t.content):"";return Math.ceil(e.length/4)}function ps(t){let e=Math.min(t.length,5),r=[];for(let n=0;n<e;n++){let o=t[n],s=typeof o.content=="string"?o.content.slice(0,200):"";r.push(`${o.role}:${s}`)}return r.join("|")}var RI=new Set(["file_read","read","Read","bash","shell","Bash","grep","search","Grep","grep_search","glob","Glob","file_search","web_search","WebSearch","web_fetch","WebFetch","file_edit","edit","Edit","file_write","write","Write"]),ar=class{constructor(e=20,r=Yc){this.preserveRecentCount=e;this.estimateTokens=r}preserveRecentCount;estimateTokens;compress(e,r){if(e.length<=this.preserveRecentCount)return{messages:e,droppedCount:0,strategy:"micro-compact"};let n=e.length-this.preserveRecentCount,o=0,s=0;return{messages:e.map((a,c)=>{if(c>=n||a.role!=="tool"||typeof a.content!="string"||!a.name||!RI.has(a.name)||a.content.length<=200)return a;let l=this.estimateTokens(a);return s+=l,o++,{...a,content:`[result cleared \u2014 ${a.content.length} chars]`}}),droppedCount:o,strategy:"micro-compact",metrics:o>0?{tokensBefore:0,tokensAfter:0,compressionRatio:0,latencyMs:0,usedLlm:!1,cacheInvalidated:!1}:void 0}}};function SI(t){let e=new Map;for(let r=0;r<t.length;r++){let n=t[r];if(n.tool_calls&&Array.isArray(n.tool_calls))for(let o of n.tool_calls){let s=o.function?.name??"";if(/read|edit|write|file/i.test(s)&&o.function?.arguments)try{let i=JSON.parse(o.function.arguments),a=i.path??i.filePath??i.file_path??i.file;a&&typeof a=="string"&&e.set(a,r)}catch{}}n.role==="tool"&&n.name&&/read|edit|write|file/i.test(n.name)}return[...e.entries()].sort((r,n)=>n[1]-r[1]).map(([r])=>r)}async function Jc(t,e,r){let n=r.estimateTokens??(u=>Math.ceil(u.length/4)),o=SI(e);if(o.length===0)return t;let s=t.map(u=>typeof u.content=="string"?u.content:"").join(`
|
|
171
171
|
`),i=o.filter(u=>!s.includes(u));if(i.length===0)return t;let a=r.maxTokenBudget,c=[],l=0;for(let u of i){if(l>=r.maxFiles||a<=0)break;let m=await r.readFile(u);if(!m)continue;let f=n(m);f>a||(a-=f,l++,c.push({role:"system",content:`[Post-compact file recovery: ${u}]
|
|
172
172
|
|
|
173
|
-
${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 Qc(t,e,r=Yc){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 Zc(){return{stages:[]}}function el(t,e,r){let n=r?.thresholdMessages??40;if(t.filter(a=>a.role!=="system").length<=n)return{messages:t,stagedCount:0};let s=hg(t,e),i=TI(s,e,n);if(i.length===0)return{messages:s,stagedCount:0};for(let a of i)e.stages.push(a);return s=hg(t,e),{messages:s,stagedCount:i.length}}function tl(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:yg(t,e),committed:r}}function hg(t,e){return e.stages.filter(n=>n.committed).length===0?t:yg(t,e)}function yg(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 TI(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 rl,readFileSync as bg,writeFileSync as wI,readdirSync as kg,mkdirSync as
|
|
174
|
-
`).map(l=>l.replace(/^\s*-\s*/,"").trim()).filter(Boolean);if(gs(c)===r)return o.name}}catch{}}}catch{}return null}function MI(t){if(!rl(t))return 0;try{return kg(t,{withFileTypes:!0}).filter(e=>e.isDirectory()&&rl(nl(t,e.name,"SKILL.md"))).length}catch{return 0}}function _I(t,e){return!(!t.ok||t.existingSkillName||!t.multiStep||t.toolCallCount<oc||t.distinctToolCount<sc||Date.now()-Rg<ic||e?.projectSkillsDir&&(MI(e.projectSkillsDir)>=nc||e.tools.length>0&&EI(e.tools,e.projectSkillsDir))||e?.projectRoot&&e.tools.length>0&&!Tg(e.projectRoot,e.tools))}function DI(t){return t.existingSkillName?t.feedback==="negative":!1}function fs(t,e){return DI(t)?{type:"skill.improve",skillName:t.existingSkillName,reason:"negative user feedback on existing skill execution"}:_I(t,e)?(Rg=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 wg(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 NI(t){return t==="enabled-eligible"||t==="installed-awaiting-approval"}function LI(t){return new Map((t??[]).map(e=>[e.toolName,e]))}function OI(t){if(!t.eligibility?.length)return[...t.tools];let e=LI(t.eligibility);return t.tools.filter(r=>{let n=wg(r);if(!n)return!1;let o=e.get(n);return!o||NI(o.status)})}function jI(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 ol(t){let e=jI({toolChoice:t.toolChoice,thinkingEnabled:t.thinkingEnabled,compatibility:t.compatibility}),r=e.normalizedToolChoice,n=[...e.warnings],o=OI({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=>wg(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 $I=["stop","aborted","timeout","cancelled","interrupted","error"],UI=["tool_calls","toolCalls","function_call","functionCall","raw_tool_calls","rawToolCalls"];function Pg(t){return t==null?[]:typeof t=="string"?t.length>0?[{type:"text",text:t}]:[]:Array.isArray(t)?t:[{type:"text",text:String(t)}]}function FI(t,e){return{...t,content:[...Pg(t.content),...Pg(e.content)]}}function HI(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 BI(t){return new Set((t??$I).map(e=>e.trim().toLowerCase()))}function qI(t,e){return t?BI(e).has(t.trim().toLowerCase()):!1}function sl(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=>HI(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]=FI(c,a);continue}i.push(a)}return i}function il(t,e){return qI(e?.stopReason,e?.forcedStopReasons)?t.map(r=>{if(r.role!=="assistant")return{...r};let n={...r};for(let o of UI)delete n[o];return n}):[...t]}function al(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 cl(t,e){let r=sl(t),n=il(r,e);return al(n,e)}function WI(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 GI(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 KI(t){return{round:t.round??0,maxRounds:t.maxRounds,pendingToolCallIds:[...t.pendingToolCallIds??[]],completedToolCallIds:[...t.completedToolCallIds??[]],lastStopReason:t.lastStopReason,replayMessages:[...t.replayMessages??[]]}}function ll(t,e){return{round:t.round+1,maxRounds:t.maxRounds,pendingToolCallIds:[...e.pendingToolCallIds??t.pendingToolCallIds],completedToolCallIds:[...e.completedToolCallIds??t.completedToolCallIds],lastStopReason:e.lastStopReason??t.lastStopReason,replayMessages:[...e.replayMessages??t.replayMessages]}}function hs(t,e){return{round:t.round,maxRounds:t.maxRounds,pendingToolCallIds:[],completedToolCallIds:[...e.completedToolCallIds??t.completedToolCallIds],lastStopReason:e.lastStopReason??t.lastStopReason,replayMessages:[...e.replayMessages??t.replayMessages]}}function ys(t){let e=[],r=sl(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=il(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=al(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:KI({maxRounds:t.maxRounds,round:t.round,lastStopReason:t.lastStopReason,replayMessages:o,pendingToolCallIds:WI(o),completedToolCallIds:GI(o)}),recoveryActions:e}}var zI=new Set(["main","sdk","agent","compact","hook","verification","side_question"]);function dl(t){return t?zI.has(t):!0}function ul(t){return t===429||t===529}function vs(t,e=500,r=32e3){let n=Math.min(e*Math.pow(2,t-1),r);return n+Math.floor(Math.random()*n*.25)}var vG={maxBackoffMs:300*1e3,resetCapMs:360*60*1e3,heartbeatIntervalMs:3e4};function bs(){let t=process.env.QLOGICAGENT_PERSISTENT_RETRY;return t==="1"||t==="true"}var Vn=class extends Error{constructor(r,n){super(`Model fallback triggered: ${r} -> ${n}`);this.originalModel=r;this.fallbackModel=n;this.name="FallbackTriggeredError"}originalModel;fallbackModel};function pl(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 VI={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},XI={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},YI={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},JI={name:"code",label:"Code",description:"A coding sub-agent with full tool access for implementation tasks.",maxTurns:200,toolCapabilityProfile:"all_tools",canFork:!0},QI={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},ZI={name:"verify",label:"Verify",description:"Verification agent. Runs tests, checks build output, validates changes are correct.",maxTurns:40,toolCapabilityProfile:"all_tools",allowedTools:["exec","read_file","search","think"],canFork:!1},Ag=[VI,XI,YI,JI,QI,ZI];function ml(){return[...Ag]}function Xn(t){return Ag.find(e=>e.name===t)}function gl(t){return{promptTokens:0,hasAttemptedReactiveCompact:!1,currentMaxOutputTokens:t.maxOutputTokens,consecutiveTruncations:0,aborted:t.abortSignal?.aborted??!1}}function fl(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 hl(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 yl(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 vl(t,e){return t.aborted?!0:e.abortSignal?.aborted?(t.aborted=!0,!0):!1}var eE={maxConsecutiveFailures:3,minMessagesAfterCompact:4,targetUsagePercent:50};function bl(){return{consecutiveFailures:0,attemptedThisTurn:!1,lastCompactAt:null,toolsAtLastCompact:[]}}function rn(t,e=eE){return!(t.attemptedThisTurn||t.consecutiveFailures>=e.maxConsecutiveFailures)}function Yn(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 kl(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 xg(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 rE=new Set(["write","edit","patch","apply_patch"]);function Cg(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=nE(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}),rE.has(r.toolName)){let a=oE(i);a&&s.push({type:"artifact",turnId:e,artifactId:`artifact-${r.callId}`,artifactType:sE(a),title:a.split(/[\\/]/).pop()||a,filePath:a,language:iE(a)})}return s}function nE(t){try{return JSON.parse(t)}catch{return null}}function oE(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 sE(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 iE(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 cE=/^no (matches|files|results) found\.?$|^file not found|^not found|^0 results|^\(exit code \d+, no output\)$/i,lE=new Set(["search","grep","glob","find","list","read","exec"]);function Ig(t){if(!lE.has(t.toolName))return!1;let e=typeof t.message?.content=="string"?t.message.content.trim():"";return e.length>0&&e.length<200&&cE.test(e)}function Rl(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 Eg(t){return typeof t=="number"&&Number.isFinite(t)&&t>=1?Math.min(Math.round(t),100):qa}function Mg(t){return t.filter(e=>e.role!=="assistant"?!0:!(typeof e.content=="string"&&e.content.trim()===""))}function nn(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(`
|
|
173
|
+
${m}`}))}if(c.length===0)return t;let d=[...t],p=-1;for(let u=0;u<d.length;u++)d[u].role==="system"&&(p=u);return d.splice(p+1,0,...c),d}function Qc(t,e,r=Yc){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 Zc(){return{stages:[]}}function el(t,e,r){let n=r?.thresholdMessages??40;if(t.filter(a=>a.role!=="system").length<=n)return{messages:t,stagedCount:0};let s=hg(t,e),i=TI(s,e,n);if(i.length===0)return{messages:s,stagedCount:0};for(let a of i)e.stages.push(a);return s=hg(t,e),{messages:s,stagedCount:i.length}}function tl(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:yg(t,e),committed:r}}function hg(t,e){return e.stages.filter(n=>n.committed).length===0?t:yg(t,e)}function yg(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 TI(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 rl,readFileSync as bg,writeFileSync as wI,readdirSync as kg,mkdirSync as AI}from"node:fs";import{join as nl,dirname as PI}from"node:path";var Rg=0;var xI="skill-patterns.json";function Sg(t){return nl(t,".qlogicagent",xI)}function CI(t){let e=Sg(t);try{return JSON.parse(bg(e,"utf8"))}catch{return{version:1,patterns:{}}}}function vg(t,e){let r=Sg(t);AI(PI(r),{recursive:!0}),wI(r,JSON.stringify(e,null,2),"utf8")}function II(t){let e=Date.now()-Jp;for(let[r,n]of Object.entries(t.patterns))new Date(n.lastSeen).getTime()<e&&delete t.patterns[r]}function Tg(t,e){if(e.length===0)return!1;let r=gs(e),n=CI(t);II(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 vg(t,n),!1;s.count++,s.lastSeen=o;let i=s.count>=Yp;return i&&(s.promoted=!0),vg(t,n),i}function gs(t){return[...t].sort().join("+")}function EI(t,e){if(!rl(e))return null;let r=gs(t);try{let n=kg(e,{withFileTypes:!0});for(let o of n){if(!o.isDirectory())continue;let s=nl(e,o.name,"SKILL.md");try{let a=bg(s,"utf8").match(/^tools:\s*\n((?:\s+-\s+\S+\n?)+)/m);if(a){let c=a[1].split(`
|
|
174
|
+
`).map(l=>l.replace(/^\s*-\s*/,"").trim()).filter(Boolean);if(gs(c)===r)return o.name}}catch{}}}catch{}return null}function MI(t){if(!rl(t))return 0;try{return kg(t,{withFileTypes:!0}).filter(e=>e.isDirectory()&&rl(nl(t,e.name,"SKILL.md"))).length}catch{return 0}}function _I(t,e){return!(!t.ok||t.existingSkillName||!t.multiStep||t.toolCallCount<oc||t.distinctToolCount<sc||Date.now()-Rg<ic||e?.projectSkillsDir&&(MI(e.projectSkillsDir)>=nc||e.tools.length>0&&EI(e.tools,e.projectSkillsDir))||e?.projectRoot&&e.tools.length>0&&!Tg(e.projectRoot,e.tools))}function DI(t){return t.existingSkillName?t.feedback==="negative":!1}function fs(t,e){return DI(t)?{type:"skill.improve",skillName:t.existingSkillName,reason:"negative user feedback on existing skill execution"}:_I(t,e)?(Rg=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 wg(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 NI(t){return t==="enabled-eligible"||t==="installed-awaiting-approval"}function LI(t){return new Map((t??[]).map(e=>[e.toolName,e]))}function OI(t){if(!t.eligibility?.length)return[...t.tools];let e=LI(t.eligibility);return t.tools.filter(r=>{let n=wg(r);if(!n)return!1;let o=e.get(n);return!o||NI(o.status)})}function jI(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 ol(t){let e=jI({toolChoice:t.toolChoice,thinkingEnabled:t.thinkingEnabled,compatibility:t.compatibility}),r=e.normalizedToolChoice,n=[...e.warnings],o=OI({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=>wg(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 $I=["stop","aborted","timeout","cancelled","interrupted","error"],UI=["tool_calls","toolCalls","function_call","functionCall","raw_tool_calls","rawToolCalls"];function Ag(t){return t==null?[]:typeof t=="string"?t.length>0?[{type:"text",text:t}]:[]:Array.isArray(t)?t:[{type:"text",text:String(t)}]}function FI(t,e){return{...t,content:[...Ag(t.content),...Ag(e.content)]}}function HI(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 BI(t){return new Set((t??$I).map(e=>e.trim().toLowerCase()))}function qI(t,e){return t?BI(e).has(t.trim().toLowerCase()):!1}function sl(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=>HI(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]=FI(c,a);continue}i.push(a)}return i}function il(t,e){return qI(e?.stopReason,e?.forcedStopReasons)?t.map(r=>{if(r.role!=="assistant")return{...r};let n={...r};for(let o of UI)delete n[o];return n}):[...t]}function al(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 cl(t,e){let r=sl(t),n=il(r,e);return al(n,e)}function WI(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 GI(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 KI(t){return{round:t.round??0,maxRounds:t.maxRounds,pendingToolCallIds:[...t.pendingToolCallIds??[]],completedToolCallIds:[...t.completedToolCallIds??[]],lastStopReason:t.lastStopReason,replayMessages:[...t.replayMessages??[]]}}function ll(t,e){return{round:t.round+1,maxRounds:t.maxRounds,pendingToolCallIds:[...e.pendingToolCallIds??t.pendingToolCallIds],completedToolCallIds:[...e.completedToolCallIds??t.completedToolCallIds],lastStopReason:e.lastStopReason??t.lastStopReason,replayMessages:[...e.replayMessages??t.replayMessages]}}function hs(t,e){return{round:t.round,maxRounds:t.maxRounds,pendingToolCallIds:[],completedToolCallIds:[...e.completedToolCallIds??t.completedToolCallIds],lastStopReason:e.lastStopReason??t.lastStopReason,replayMessages:[...e.replayMessages??t.replayMessages]}}function ys(t){let e=[],r=sl(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=il(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=al(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:KI({maxRounds:t.maxRounds,round:t.round,lastStopReason:t.lastStopReason,replayMessages:o,pendingToolCallIds:WI(o),completedToolCallIds:GI(o)}),recoveryActions:e}}var zI=new Set(["main","sdk","agent","compact","hook","verification","side_question"]);function dl(t){return t?zI.has(t):!0}function ul(t){return t===429||t===529}function vs(t,e=500,r=32e3){let n=Math.min(e*Math.pow(2,t-1),r);return n+Math.floor(Math.random()*n*.25)}var vG={maxBackoffMs:300*1e3,resetCapMs:360*60*1e3,heartbeatIntervalMs:3e4};function bs(){let t=process.env.QLOGICAGENT_PERSISTENT_RETRY;return t==="1"||t==="true"}var Vn=class extends Error{constructor(r,n){super(`Model fallback triggered: ${r} -> ${n}`);this.originalModel=r;this.fallbackModel=n;this.name="FallbackTriggeredError"}originalModel;fallbackModel};function pl(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 VI={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},XI={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},YI={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},JI={name:"code",label:"Code",description:"A coding sub-agent with full tool access for implementation tasks.",maxTurns:200,toolCapabilityProfile:"all_tools",canFork:!0},QI={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},ZI={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},Pg=[VI,XI,YI,JI,QI,ZI];function ml(){return[...Pg]}function Xn(t){return Pg.find(e=>e.name===t)}function gl(t){return{promptTokens:0,hasAttemptedReactiveCompact:!1,currentMaxOutputTokens:t.maxOutputTokens,consecutiveTruncations:0,aborted:t.abortSignal?.aborted??!1}}function fl(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 hl(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 yl(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 vl(t,e){return t.aborted?!0:e.abortSignal?.aborted?(t.aborted=!0,!0):!1}var eE={maxConsecutiveFailures:3,minMessagesAfterCompact:4,targetUsagePercent:50};function bl(){return{consecutiveFailures:0,attemptedThisTurn:!1,lastCompactAt:null,toolsAtLastCompact:[]}}function rn(t,e=eE){return!(t.attemptedThisTurn||t.consecutiveFailures>=e.maxConsecutiveFailures)}function Yn(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 kl(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 xg(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 rE=new Set(["write","edit","patch","apply_patch"]);function Cg(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=nE(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}),rE.has(r.toolName)){let a=oE(i);a&&s.push({type:"artifact",turnId:e,artifactId:`artifact-${r.callId}`,artifactType:sE(a),title:a.split(/[\\/]/).pop()||a,filePath:a,language:iE(a)})}return s}function nE(t){try{return JSON.parse(t)}catch{return null}}function oE(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 sE(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 iE(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 cE=/^no (matches|files|results) found\.?$|^file not found|^not found|^0 results|^\(exit code \d+, no output\)$/i,lE=new Set(["search","grep","glob","find","list","read","exec"]);function Ig(t){if(!lE.has(t.toolName))return!1;let e=typeof t.message?.content=="string"?t.message.content.trim():"";return e.length>0&&e.length<200&&cE.test(e)}function Rl(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 Eg(t){return typeof t=="number"&&Number.isFinite(t)&&t>=1?Math.min(Math.round(t),100):qa}function Mg(t){return t.filter(e=>e.role!=="assistant"?!0:!(typeof e.content=="string"&&e.content.trim()===""))}function nn(t,e){let r=[];for(let n=t.length-1;n>=0;n--){let o=t[n];if(o.role==="tool"&&typeof o.content=="string")r.unshift(o.content.slice(0,500));else if(o.role==="assistant"){if(typeof o.content=="string"&&o.content.trim())return e.info("synthesizeFallbackContent: found assistant text, using it"),o.content;break}else break}return r.length>0?(e.info(`synthesizeFallbackContent: synthesized from ${r.length} tool result(s)`),r.join(`
|
|
175
175
|
|
|
176
|
-
`)):""}function _g(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 Sl(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 Dg(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 Ng(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 Lg(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*Og(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*jg(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*Og(o,c,i,l,d,u,e,n);return}let v=Eg(t.maxRounds),R={contextWindowTokens:t.contextWindowTokens??Ka,responseBufferTokens:za,maxOutputTokens:t.maxOutputTokens??Va,abortSignal:u,reactiveCompactEnabled:!0,outputEscalationEnabled:!0},S=new Set,T=0,C=b,E,M=!1,L=0,k={messages:[...i],maxOutputTokensRecoveryCount:0,hasAttemptedReactiveCompact:!1,maxOutputTokensOverride:void 0,turnCount:1,transition:void 0,guardState:gl(R),reactiveCompactState:bl(),toolLoopState:ys({maxRounds:v,replayMessages:[...i]}).state,consecutiveFailedRounds:0,finalText:"",totalUsage:{inputTokens:0,outputTokens:0},collapseStore:Zc(),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||nn(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:Gt}=k,{toolLoopState:Ee}=k;if(E){try{let w=await E;w&&(yield{type:"tool_use_summary",turnId:o,summary:w})}catch{}E=void 0}if(t.refreshTools&&J>1){let w=t.refreshTools();w!==C&&(C=w,n.debug(`tools refreshed: ${w.length} tools`))}if(vl(H,R)){n.info(`turn aborted by guard at turn ${J}`),yield{type:"error",turnId:o,error:"Turn aborted",code:"ABORTED",usage:k.totalUsage};return}let st=fl(H,R);if(st.level==="blocking"){st.reason==="prompt_too_long"&&rn(Ie)&&(Ie.attemptedThisTurn=!0,H.hasAttemptedReactiveCompact=!0,n.info(`token budget blocking (${st.reason}), reactive compact needed`),yield{type:"recovery",turnId:o,action:"reactive_compact",detail:"token budget pre-check"}),n.info(`token budget blocking (${st.reason}), ending tool loop`);break}st.level==="warning"&&n.info(`token budget warning: ${st.usagePercent}% used, ${st.remainingTokens} remaining`);let se;{let w=await t.runtimePorts.enforceToolResultBudget(O,k.contentReplacementState,s);se=w.messages,w.newlyReplacedCount>0&&(n.info(`tool-result-budget: persisted ${w.newlyReplacedCount} oversized tool results`),yield{type:"recovery",turnId:o,action:"tool_result_budget",detail:`${w.newlyReplacedCount} persisted`})}{let w=Qc(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 P=new ar().compress(se,0);P.droppedCount>0&&(se=P.messages,n.info(`microcompact: cleared ${P.droppedCount} old tool results`))}if(se=el(se,Gt).messages,H.promptTokens>0){let w=R.contextWindowTokens*.75,P=t.runtimePorts.getActiveContextCompressionEngine(),x;P?x=await P.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=Mg(se);let Op=t.toolChoice==="required"&&M?"auto":t.toolChoice??"auto",En=ol({tools:C,toolChoice:Op}),A=ys({maxRounds:v,replayMessages:se,lastStopReason:Ee.lastStopReason,options:{stopReason:Ee.lastStopReason}}),W=En.extraSystemPrompt?[{role:"system",content:En.extraSystemPrompt},...A.state.replayMessages]:A.state.replayMessages;Ee=A.state,A.recoveryActions.length>0&&n.debug(`tool loop recovery: ${A.recoveryActions.map(w=>w.detail??w.kind).join("; ")}`),n.debug(`turn ${J}, messages: ${W.length}`),p?.invoke("turn.before_inference",{...m,model:k.currentModel}).catch(()=>{});let V=!1,it=[],Mn=new Map,jp="stop",at,K=null,Fo=!1,_n=[],$e=[];try{for await(let w of e.stream({model:k.currentModel,messages:W,tools:En.tools,toolChoice:En.normalizedToolChoice??"auto",temperature:d,maxTokens:(F??H.currentMaxOutputTokens)||void 0,streamRequired:t.streamRequired,previousResponseId:k.lastResponseId,reasoning:t.reasoning,promptCacheKey:t.promptCacheKey,promptCacheRetention:t.promptCacheRetention,serviceTier:t.serviceTier,openaiBuiltinTools:t.openaiBuiltinTools,maxToolCalls:t.maxToolCalls,parallelToolCalls:t.parallelToolCalls,textVerbosity:t.textVerbosity},l,u))switch(w.type){case"delta":it.push(w.text),!V&&!(t.toolChoice==="required"&&!M)&&(yield{type:"delta",turnId:o,text:w.text});break;case"tool_call_delta":V=!0,kl(Mn,w);break;case"reasoning_delta":_n.push(w.text);break;case"reasoning_block_complete":w.signature&&$e.push({thinking:_n.join(""),signature:w.signature}),_n.length=0;break;case"usage":at={inputTokens:w.promptTokens,outputTokens:w.completionTokens,reasoningTokens:w.reasoningTokens,cacheRead:w.cacheReadTokens,cacheWrite:w.cacheCreationTokens};break;case"response_id":k.lastResponseId=w.id;break;case"annotations":yield{type:"annotations",turnId:o,annotations:w.annotations};break;case"builtin_tool_status":yield{type:"heartbeat",turnId:o,message:`${w.toolType}: ${w.event}`};break;case"done":jp=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 P of t.postSamplingHooks)try{P({messages:[...se],model:w,sessionId:s})}catch{}}}catch(w){if(w instanceof Vn&&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 P=w instanceof Error?w.message:String(w),x=typeof w?.status=="number"?w.status:void 0;if(!x&&P&&(P.includes("ECONNRESET")||P.includes("EPIPE"))){let $=(k.consecutiveApiRetries??0)+1;if($>Kr){n.info(`stale connection retry limit reached (${Kr}), aborting`),yield{type:"error",turnId:o,error:P,code:"RETRIES_EXHAUSTED",usage:k.totalUsage};return}n.info(`stale connection (${P.includes("ECONNRESET")?"ECONNRESET":"EPIPE"}): retrying`),yield{type:"recovery",turnId:o,action:"stale_connection_retry",detail:P.slice(0,80)},k={...k,consecutiveApiRetries:$,transition:void 0};continue}let _=Lg({status:x,message:P});if(_!==null){n.info(`max_tokens overflow: adjusting to ${_}`),H.currentMaxOutputTokens=_,k={...k,maxOutputTokensOverride:_,transition:void 0};continue}if(ul(x)){k.consecutive529Errors++;let $=2,Me=t.fallbackModel&&k.currentModel!==t.fallbackModel;if(k.consecutive529Errors>$&&!Me&&!bs()){n.info(`transient ${x} \u8133 ${k.consecutive529Errors}: hard limit reached, aborting`),yield{type:"error",turnId:o,error:`API unavailable after ${k.consecutive529Errors} consecutive ${x} errors`,code:"API_ERROR",usage:k.totalUsage};return}if(k.consecutive529Errors>=rc&&t.fallbackModel&&k.currentModel!==t.fallbackModel){n.info(`529 \u8133 ${k.consecutive529Errors}: triggering fallback to ${t.fallbackModel}`),yield{type:"recovery",turnId:o,action:"model_fallback",detail:`529 \u8133 ${k.consecutive529Errors}`},k={...k,currentModel:t.fallbackModel,consecutive529Errors:0,transition:void 0};continue}if(bs()){let _e=vs(k.consecutive529Errors);n.info(`persistent retry: waiting ${_e}ms (attempt ${k.consecutive529Errors})`);let ct=_e;for(;ct>0;){if(u?.aborted){yield{type:"error",turnId:o,error:"Aborted during retry wait",code:"ABORTED",usage:k.totalUsage};return}yield{type:"heartbeat",turnId:o,message:`Retrying in ${Math.ceil(ct/1e3)}s (${x})`};let Lt=Math.min(ct,tc);await new Promise(Ua=>setTimeout(Ua,Lt)),ct-=Lt}k={...k,transition:void 0};continue}if(dl(g)){let ct=Ng({status:x,message:P})??vs(k.consecutive529Errors);n.info(`transient ${x}: retry in ${ct}ms`),yield{type:"recovery",turnId:o,action:"retry",detail:`${x} retry in ${ct}ms`},await new Promise(Lt=>setTimeout(Lt,ct)),k={...k,transition:void 0};continue}n.info(`background source ${g}: not retrying ${x}`)}K={status:x,message:P}}if(K&&p?.invoke("turn.after_inference",{...m,model:k.currentModel,response:{error:K.message}}).catch(()=>{}),K)if(Sl(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=hl({status:K.status??500,message:K.message},H,R);if(w.action==="reactive_compact"&&rn(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>Kr){n.info(`API retry limit reached (${Kr}), aborting`);let _=en(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 P=en(K.status,K.message);p?.invoke("stop.failure",{sessionId:s,reason:P,error:K.message}).catch(()=>{}),yield{type:"error",turnId:o,error:K.message,code:P,usage:k.totalUsage};return}at&&(k.totalUsage.inputTokens+=at.inputTokens,k.totalUsage.outputTokens+=at.outputTokens,at.reasoningTokens&&(k.totalUsage.reasoningTokens=(k.totalUsage.reasoningTokens??0)+at.reasoningTokens),at.cacheRead&&(k.totalUsage.cacheRead=(k.totalUsage.cacheRead??0)+at.cacheRead),at.cacheWrite&&(k.totalUsage.cacheWrite=(k.totalUsage.cacheWrite??0)+at.cacheWrite)),at?.inputTokens&&(H.promptTokens=at.inputTokens);let $p=it.join("");$p&&(k.finalText=$p);let Nt=[...Mn.values()].map(w=>({id:w.id||`tc_${o}_${J}_${Math.random().toString(36).slice(2,8)}`,type:"function",function:{name:w.name,arguments:w.arguments}}));if(Nt.length===0&&!V){if(t.toolChoice==="required"&&!M&&C.length>0&&L<2){L++;let x=C.map(_=>_.function.name).filter(Boolean).slice(0,8).join(", ");k={...k,messages:[...O,{role:"user",content:`You must call one available tool before answering. Available tools for this request: ${x}. Do not answer from memory, prior context, or guesses.`}],finalText:"",transition:{reason:"next_turn"}};continue}if(Fo&&K&&Sl(K)){if(k.transition?.reason!=="collapse_drain_retry"){let x=tl(se,Gt);if(x.committed>0){n.info(`collapse drain: committed ${x.committed} stages`),yield{type:"recovery",turnId:o,action:"collapse_drain",detail:`${x.committed} stages committed`},k={...k,messages:x.messages,transition:{reason:"collapse_drain_retry",committed:x.committed}};continue}}if(rn(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(rn(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(Dg(jp)){H.consecutiveTruncations+=1;let x=t.modelMaxOutputTokens??Xa,_=yl(H,R,x);if(_.shouldEscalate&&F===void 0){H.currentMaxOutputTokens=_.newMax,n.info(`max_output_tokens escalate: ${_.newMax} tokens`),yield{type:"recovery",turnId:o,action:"output_escalation",detail:`${_.newMax} tokens`},k={...k,maxOutputTokensOverride:Ja,transition:{reason:"max_output_tokens_escalate"}};continue}if(Oe<Ya){let $={role:"user",content:"Output token limit hit. Resume directly - no apology, no recap of what you were doing. Pick up mid-thought if that is where the cut happened. Break remaining work into smaller pieces."};n.info(`max_output_tokens recovery #${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=hs(Ee,{replayMessages:O,lastStopReason:"completed"}),p){let x=await p.invoke("stop",{sessionId:s,reason:"completed"});if(x.action==="prevent"){n.info(`stop hook prevented continuation: ${x.reason??"no reason"}`),yield{type:"end",turnId:o,content:k.finalText,usage:k.totalUsage,model:k.currentModel};return}if(x.action==="abort"){let _=x.reason??"Stop hook requested continuation";n.info(`stop hook blocking: ${_}`);let $={role:"user",content:_},Me={role:"assistant",content:k.finalText,...$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>=Qa&&$<zo&&k.lastBudgetDeltaTokens<zo;if(Me&&n.info(`token budget early stop: diminishing returns at ${Math.round(_)}% (delta=${$})`),!Me&&_<90){let _e=k.budgetContinuationCount+1,ct={role:"user",content:t.runtimePorts.getBudgetContinuationMessage(_,x,t.tokenBudget)};n.info(`token budget continuation #${_e}: ${Math.round(_)}% used`),yield{type:"recovery",turnId:o,action:"budget_continuation",detail:`${Math.round(_)}% used (#${_e})`};let Lt={role:"assistant",content:k.finalText,...$e.length>0&&{thinkingBlocks:[...$e]}};k={...k,messages:[...O,Lt,ct],budgetContinuationCount:_e,lastBudgetDeltaTokens:$,lastBudgetGlobalTokens:x,transition:{reason:"token_budget_continuation"}};continue}}if(!k.stopHookActive){let x=i.find(_e=>_e.role==="user"),_=typeof x?.content=="string"?x.content:"",$=/create\s+(?:a\s+)?file|write\s+(?:a\s+)?file|make\s+(?:a\s+)?file|fix|implement|modify|update|repair|generate\s+(?:a\s+)?file|new\s+file/i.test(_),Me=S.has("write")||S.has("edit");if($&&!Me){if(n.info("AP1 action-verification: user requested file action but no write/edit tool was called, injecting nudge"),T>0){let Lt=[...O].reverse().find(Ua=>Ua.role==="tool");Lt&&typeof Lt.content=="string"&&(Lt.content+=`
|
|
176
|
+
`)):""}function _g(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 Sl(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 Dg(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 Ng(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 Lg(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*Og(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*jg(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*Og(o,c,i,l,d,u,e,n);return}let v=Eg(t.maxRounds),R={contextWindowTokens:t.contextWindowTokens??Ka,responseBufferTokens:za,maxOutputTokens:t.maxOutputTokens??Va,abortSignal:u,reactiveCompactEnabled:!0,outputEscalationEnabled:!0},S=new Set,T=0,C=b,E,M=!1,L=0,k={messages:[...i],maxOutputTokensRecoveryCount:0,hasAttemptedReactiveCompact:!1,maxOutputTokensOverride:void 0,turnCount:1,transition:void 0,guardState:gl(R),reactiveCompactState:bl(),toolLoopState:ys({maxRounds:v,replayMessages:[...i]}).state,consecutiveFailedRounds:0,finalText:"",totalUsage:{inputTokens:0,outputTokens:0},collapseStore:Zc(),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||nn(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:Gt}=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(vl(H,R)){n.info(`turn aborted by guard at turn ${J}`),yield{type:"error",turnId:o,error:"Turn aborted",code:"ABORTED",usage:k.totalUsage};return}let st=fl(H,R);if(st.level==="blocking"){st.reason==="prompt_too_long"&&rn(Ee)&&(Ee.attemptedThisTurn=!0,H.hasAttemptedReactiveCompact=!0,n.info(`token budget blocking (${st.reason}), reactive compact needed`),yield{type:"recovery",turnId:o,action:"reactive_compact",detail:"token budget pre-check"}),n.info(`token budget blocking (${st.reason}), ending tool loop`);break}st.level==="warning"&&n.info(`token budget warning: ${st.usagePercent}% used, ${st.remainingTokens} remaining`);let se;{let w=await t.runtimePorts.enforceToolResultBudget(O,k.contentReplacementState,s);se=w.messages,w.newlyReplacedCount>0&&(n.info(`tool-result-budget: persisted ${w.newlyReplacedCount} oversized tool results`),yield{type:"recovery",turnId:o,action:"tool_result_budget",detail:`${w.newlyReplacedCount} persisted`})}{let w=Qc(se,k.snipRemovedIds);se=w.messages,w.removedCount>0&&(n.info(`snip: removed ${w.removedCount} messages, freed ~${w.tokensFreed} tokens`),yield{type:"recovery",turnId:o,action:"snip",detail:`${w.removedCount} messages`})}{let A=new ar().compress(se,0);A.droppedCount>0&&(se=A.messages,n.info(`microcompact: cleared ${A.droppedCount} old tool results`))}if(se=el(se,Gt).messages,H.promptTokens>0){let w=R.contextWindowTokens*.75,A=t.runtimePorts.getActiveContextCompressionEngine(),x;A?x=await A.compressAsync(se,w,{model:k.currentModel,sessionId:s}):x=t.runtimePorts.compressMessages(se,{budget:w,model:k.currentModel}),x.droppedCount>0&&(se=x.messages,n.info(`autocompact: ${x.strategy}, dropped ${x.droppedCount}`),yield{type:"recovery",turnId:o,action:"autocompact",detail:`${x.strategy}: ${x.droppedCount} dropped`},k.hasAttemptedReactiveCompact=!1,p?.invoke("context.after_compact",{...m,removedCount:x.droppedCount}).catch(()=>{}))}se=Mg(se);let Op=t.toolChoice==="required"&&M?"auto":t.toolChoice??"auto",En=ol({tools:C,toolChoice:Op}),P=ys({maxRounds:v,replayMessages:se,lastStopReason:Me.lastStopReason,options:{stopReason:Me.lastStopReason}}),W=En.extraSystemPrompt?[{role:"system",content:En.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,it=[],Mn=new Map,jp="stop",at,K=null,Fo=!1,_n=[],$e=[];try{for await(let w of e.stream({model:k.currentModel,messages:W,tools:En.tools,toolChoice:En.normalizedToolChoice??"auto",temperature:d,maxTokens:(F??H.currentMaxOutputTokens)||void 0,streamRequired:t.streamRequired,previousResponseId:k.lastResponseId,reasoning:t.reasoning,promptCacheKey:t.promptCacheKey,promptCacheRetention:t.promptCacheRetention,serviceTier:t.serviceTier,openaiBuiltinTools:t.openaiBuiltinTools,maxToolCalls:t.maxToolCalls,parallelToolCalls:t.parallelToolCalls,textVerbosity:t.textVerbosity},l,u))switch(w.type){case"delta":it.push(w.text),!V&&!(t.toolChoice==="required"&&!M)&&(yield{type:"delta",turnId:o,text:w.text});break;case"tool_call_delta":V=!0,kl(Mn,w);break;case"reasoning_delta":_n.push(w.text);break;case"reasoning_block_complete":w.signature&&$e.push({thinking:_n.join(""),signature:w.signature}),_n.length=0;break;case"usage":at={inputTokens:w.promptTokens,outputTokens:w.completionTokens,reasoningTokens:w.reasoningTokens,cacheRead:w.cacheReadTokens,cacheWrite:w.cacheCreationTokens};break;case"response_id":k.lastResponseId=w.id;break;case"annotations":yield{type:"annotations",turnId:o,annotations:w.annotations};break;case"builtin_tool_status":yield{type:"heartbeat",turnId:o,message:`${w.toolType}: ${w.event}`};break;case"done":jp=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 Vn&&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($>Kr){n.info(`stale connection retry limit reached (${Kr}), 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 _=Lg({status:x,message:A});if(_!==null){n.info(`max_tokens overflow: adjusting to ${_}`),H.currentMaxOutputTokens=_,k={...k,maxOutputTokensOverride:_,transition:void 0};continue}if(ul(x)){k.consecutive529Errors++;let $=2,_e=t.fallbackModel&&k.currentModel!==t.fallbackModel;if(k.consecutive529Errors>$&&!_e&&!bs()){n.info(`transient ${x} \u8133 ${k.consecutive529Errors}: hard limit reached, aborting`),yield{type:"error",turnId:o,error:`API unavailable after ${k.consecutive529Errors} consecutive ${x} errors`,code:"API_ERROR",usage:k.totalUsage};return}if(k.consecutive529Errors>=rc&&t.fallbackModel&&k.currentModel!==t.fallbackModel){n.info(`529 \u8133 ${k.consecutive529Errors}: triggering fallback to ${t.fallbackModel}`),yield{type:"recovery",turnId:o,action:"model_fallback",detail:`529 \u8133 ${k.consecutive529Errors}`},k={...k,currentModel:t.fallbackModel,consecutive529Errors:0,transition:void 0};continue}if(bs()){let De=vs(k.consecutive529Errors);n.info(`persistent retry: waiting ${De}ms (attempt ${k.consecutive529Errors})`);let ct=De;for(;ct>0;){if(u?.aborted){yield{type:"error",turnId:o,error:"Aborted during retry wait",code:"ABORTED",usage:k.totalUsage};return}yield{type:"heartbeat",turnId:o,message:`Retrying in ${Math.ceil(ct/1e3)}s (${x})`};let Lt=Math.min(ct,tc);await new Promise(Ua=>setTimeout(Ua,Lt)),ct-=Lt}k={...k,transition:void 0};continue}if(dl(g)){let ct=Ng({status:x,message:A})??vs(k.consecutive529Errors);n.info(`transient ${x}: retry in ${ct}ms`),yield{type:"recovery",turnId:o,action:"retry",detail:`${x} retry in ${ct}ms`},await new Promise(Lt=>setTimeout(Lt,ct)),k={...k,transition:void 0};continue}n.info(`background source ${g}: not retrying ${x}`)}K={status:x,message:A}}if(K&&p?.invoke("turn.after_inference",{...m,model:k.currentModel,response:{error:K.message}}).catch(()=>{}),K)if(Sl(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=hl({status:K.status??500,message:K.message},H,R);if(w.action==="reactive_compact"&&rn(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>Kr){n.info(`API retry limit reached (${Kr}), aborting`);let _=en(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=en(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}at&&(k.totalUsage.inputTokens+=at.inputTokens,k.totalUsage.outputTokens+=at.outputTokens,at.reasoningTokens&&(k.totalUsage.reasoningTokens=(k.totalUsage.reasoningTokens??0)+at.reasoningTokens),at.cacheRead&&(k.totalUsage.cacheRead=(k.totalUsage.cacheRead??0)+at.cacheRead),at.cacheWrite&&(k.totalUsage.cacheWrite=(k.totalUsage.cacheWrite??0)+at.cacheWrite)),at?.inputTokens&&(H.promptTokens=at.inputTokens);let $p=it.join("");$p&&(k.finalText=$p);let Nt=[...Mn.values()].map(w=>({id:w.id||`tc_${o}_${J}_${Math.random().toString(36).slice(2,8)}`,type:"function",function:{name:w.name,arguments:w.arguments}}));if(Nt.length===0&&!V){if(t.toolChoice==="required"&&!M&&C.length>0&&L<2){L++;let x=C.map(_=>_.function.name).filter(Boolean).slice(0,8).join(", ");k={...k,messages:[...O,{role:"user",content:`You must call one available tool before answering. Available tools for this request: ${x}. Do not answer from memory, prior context, or guesses.`}],finalText:"",transition:{reason:"next_turn"}};continue}if(Fo&&K&&Sl(K)){if(k.transition?.reason!=="collapse_drain_retry"){let x=tl(se,Gt);if(x.committed>0){n.info(`collapse drain: committed ${x.committed} stages`),yield{type:"recovery",turnId:o,action:"collapse_drain",detail:`${x.committed} stages committed`},k={...k,messages:x.messages,transition:{reason:"collapse_drain_retry",committed:x.committed}};continue}}if(rn(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(rn(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(Dg(jp)){H.consecutiveTruncations+=1;let x=t.modelMaxOutputTokens??Xa,_=yl(H,R,x);if(_.shouldEscalate&&F===void 0){H.currentMaxOutputTokens=_.newMax,n.info(`max_output_tokens escalate: ${_.newMax} tokens`),yield{type:"recovery",turnId:o,action:"output_escalation",detail:`${_.newMax} tokens`},k={...k,maxOutputTokensOverride:Ja,transition:{reason:"max_output_tokens_escalate"}};continue}if(Oe<Ya){let $={role:"user",content:"Output token limit hit. Resume directly - no apology, no recap of what you were doing. Pick up mid-thought if that is where the cut happened. Break remaining work into smaller pieces."};n.info(`max_output_tokens recovery #${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=hs(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>=Qa&&$<zo&&k.lastBudgetDeltaTokens<zo;if(_e&&n.info(`token budget early stop: diminishing returns at ${Math.round(_)}% (delta=${$})`),!_e&&_<90){let De=k.budgetContinuationCount+1,ct={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 Lt={role:"assistant",content:k.finalText,...$e.length>0&&{thinkingBlocks:[...$e]}};k={...k,messages:[...O,Lt,ct],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 Lt=[...O].reverse().find(Ua=>Ua.role==="tool");Lt&&typeof Lt.content=="string"&&(Lt.content+=`
|
|
177
177
|
|
|
178
|
-
\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
|
|
178
|
+
\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."},ct={role:"assistant",content:k.finalText,...$e.length>0&&{thinkingBlocks:[...$e]}};k={...k,messages:[...O,ct,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},_=fs(x,{tools:[...S],projectRoot:t.projectRoot});_&&(yield{type:"skill_instruction",turnId:o,instruction:_})}let A=k.finalText||nn(O,n);yield{type:"end",turnId:o,content:A,usage:k.totalUsage,model:k.currentModel};return}let BP=$e.length===0&&_n.length>0?_n.join(""):void 0;O.push(Gc(Nt,k.finalText||void 0,$e.length>0?$e:void 0,BP)),Me=ll(Me,{replayMessages:O,pendingToolCallIds:Nt.map(w=>w.id),completedToolCallIds:Me.completedToolCallIds,lastStopReason:"tool_calls"});let Ho=k.identicalCallCounts,Up=[],Bo=[],Fp=!1;for(let w of Nt){let A=`${w.function.name}::${w.function.arguments}`,x=Ho.get(A)??0;Ho.set(A,x+1),x+1>Ga?(Bo.push(w),Fp||(Fp=!0,n.info(`AP4 blocked: ${w.function.name} repeated ${x+1}x`))):Up.push(w)}let qo=[];for(let w of Bo){let A=Ho.get(`${w.function.name}::${w.function.arguments}`),x=Rl(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.`,$=us(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=Rl(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=[],ja=[];for(let w of Up)(k.toolFailureCounts.get(w.function.name)??0)>=Ko?ja.push(w):Wo.push(w);if(ja.length>0){for(let A of ja){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.`,$=us(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:_g(A)}}let qP=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&&Ig(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 xg(o,A);for(let _ of Cg({turnId:o,result:A,toolCalls:Nt}))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>=Ko&&(qP.get(w)??0)<Ko&&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=hs(Me,{replayMessages:O,completedToolCallIds:[...Me.completedToolCallIds,...qo],lastStopReason:"tool_calls"}),t.toolChoice==="required"&&Nt.length>0&&(M=!0),t.generateToolUseSummary&&Nt.length>0){let w=Nt.map(A=>({name:A.function.name,arguments:A.function.arguments}));E=t.generateToolUseSummary(w).catch(()=>null)}let WP=Nt.length>0&&Nt.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: ")}),Dn=k.consecutiveFailedRounds;if(WP){if(Dn+=1,Dn>=Wa){let w=k.finalText||nn(O,n);n.info(`early exit: ${Dn} consecutive failed rounds, returning ${k.finalText?"partial":"fallback"} response`),yield{type:"end",turnId:o,content:w,usage:k.totalUsage,model:k.currentModel};return}}else Dn=0;let GP=3,Hp=[...k.fileReadCounts.entries()].filter(([,w])=>w>=GP);if(Hp.length>0){let w=Hp.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 $a=J+1;if(f>0&&$a>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||nn(O,n);yield{type:"end",turnId:o,content:w,usage:k.totalUsage,model:k.currentModel};return}if($a>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=fs(A,{tools:[...S],projectRoot:t.projectRoot});x&&(yield{type:"skill_instruction",turnId:o,instruction:x})}let w=k.finalText||nn(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:$a,transition:{reason:"next_turn"},guardState:H,reactiveCompactState:Ee,toolLoopState:Me,consecutiveFailedRounds:Dn,finalText:k.finalText,totalUsage:k.totalUsage,collapseStore:Gt,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 uE=["\u63A5\u5355\u91D1\u989D","\u5408\u540C\u91D1\u989D","\u62A5\u4EF7","\u9884\u7B97","\u91D1\u989D","price","amount","contract amount"];function Fg(t){let e=pE(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: ${Ug(n.l1Amount)}; L2 long-term says: ${Ug(n.l2Amount)}; action: ask the user which value is current before using it.`)}for(let n of t){let o=fE(n);r.push(`- [${o}] ${n.text}`)}return r.join(`
|
|
179
179
|
`)}function pE(t){let e=t.filter(o=>o.source==="l1-project-md").flatMap(o=>$g(o.text)),r=t.filter(o=>o.source==="l2-long-term").flatMap(o=>$g(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 hE(n)}function $g(t){let e=[];for(let r of t.split(/\r?\n/)){let n=r.trim();if(n)for(let o of uE){if(o==="\u91D1\u989D"&&/(接单金额|合同金额)/u.test(n))continue;let s=new RegExp(`${yE(o)}[^0-9.\u4E07kK,]{0,12}([0-9][0-9.,]*\\s*(?:\u4E07|k|K)?)`,"gi");for(let i of n.matchAll(s)){let a=gE(i[1]);a!==null&&e.push({entity:mE(n,o),predicate:o,amount:a,text:n})}}}return e}function mE(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 gE(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 fE(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 Ug(t){return Number.isInteger(t)?String(t):String(Number(t.toFixed(4)))}function hE(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 yE(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var on=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=cl(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=Fg(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]
|
|
180
|
-
${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 jg(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=en(g,f);this.log.error(`turn ${n} error [${h}, retryable=${zc(h)}]: ${f}`),this.hooks?.invoke("turn.failed",{...c,code:h,error:f}).catch(()=>{}),yield{type:"error",turnId:n,error:f,code:h}}}}};He();import{mkdir as bE,writeFile as kE}from"fs/promises";import{join as Bg}from"path";import{tmpdir as RE}from"os";var SE="tool-results",qg="<persisted-output>",TE="</persisted-output>";function Wg(){return{seenIds:new Set,replacements:new Map}}function Gg(t){return Bg(RE(),"qlogicagent-sessions",t,SE)}async function wE(t){try{await bE(Gg(t),{recursive:!0})}catch{}}function
|
|
181
|
-
`),o=n>e*.5?n:e;return{preview:t.slice(0,o),hasMore:!0}}function Kg(t){return t.includes(qg)}async function zg(t,e,r){await wE(r);let n=
|
|
180
|
+
${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 jg(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=en(g,f);this.log.error(`turn ${n} error [${h}, retryable=${zc(h)}]: ${f}`),this.hooks?.invoke("turn.failed",{...c,code:h,error:f}).catch(()=>{}),yield{type:"error",turnId:n,error:f,code:h}}}}};He();import{mkdir as bE,writeFile as kE}from"fs/promises";import{join as Bg}from"path";import{tmpdir as RE}from"os";var SE="tool-results",qg="<persisted-output>",TE="</persisted-output>";function Wg(){return{seenIds:new Set,replacements:new Map}}function Gg(t){return Bg(RE(),"qlogicagent-sessions",t,SE)}async function wE(t){try{await bE(Gg(t),{recursive:!0})}catch{}}function AE(t,e){let r=e.replace(/[^a-zA-Z0-9_-]/g,"_");return Bg(Gg(t),`${r}.txt`)}function PE(t,e){if(t.length<=e)return{preview:t,hasMore:!1};let n=t.slice(0,e).lastIndexOf(`
|
|
181
|
+
`),o=n>e*.5?n:e;return{preview:t.slice(0,o),hasMore:!0}}function Kg(t){return t.includes(qg)}async function zg(t,e,r){await wE(r);let n=AE(r,e);try{await kE(n,t,{encoding:"utf-8",flag:"wx"})}catch(i){if(i.code!=="EEXIST")return null}let{preview:o,hasMore:s}=PE(t,Vo);return{filepath:n,originalSize:t.length,preview:o,hasMore:s}}function Vg(t){let e=`${qg}
|
|
182
182
|
`;return e+=`Output too large (${t.originalSize} chars). Full output saved to: ${t.filepath}
|
|
183
183
|
|
|
184
184
|
`,e+=`Preview (first ${Vo} bytes):
|
|
@@ -186,8 +186,8 @@ ${T}`})}}this.hooks.invoke("memory.after_recall",{sessionId:e.sessionId,turnId:n
|
|
|
186
186
|
...
|
|
187
187
|
`:`
|
|
188
188
|
`,e+=TE,e}async function Xg(t,e,r,n=Za){if(t.length<=n||Kg(t))return t;let o=await zg(t,e,r);return o?Vg(o):t.slice(0,n)+`
|
|
189
|
-
...[truncated ${t.length-n} chars]`}function xE(t){let e=[],r=[];for(let n of t)n.role==="tool"&&typeof n.content=="string"&&n.tool_call_id?Kg(n.content)||r.push({toolCallId:n.tool_call_id,content:n.content,size:n.content.length}):n.role==="assistant"&&r.length>0&&(e.push(r),r=[]);return r.length>0&&e.push(r),e}function CE(t,e){let r=[],n=[],o=[];for(let s of t){let i=e.replacements.get(s.toolCallId);i!==void 0?r.push({...s,replacement:i}):e.seenIds.has(s.toolCallId)?n.push(s):o.push(s)}return{mustReapply:r,frozen:n,fresh:o}}function IE(t,e,r){let n=[...t].sort((i,a)=>a.size-i.size),o=[],s=e+t.reduce((i,a)=>i+a.size,0);for(let i of n){if(s<=r)break;o.push(i),s-=i.size}return o}async function Yg(t,e,r,n=ec){let o=xE(t);if(o.length===0)return{messages:t,newlyReplacedCount:0};let s=new Map,i=[];for(let d of o){let{mustReapply:p,frozen:u,fresh:m}=CE(d,e);for(let v of p)s.set(v.toolCallId,v.replacement);if(m.length===0){for(let v of d)e.seenIds.add(v.toolCallId);continue}let f=u.reduce((v,R)=>v+R.size,0),g=m.reduce((v,R)=>v+R.size,0),h=f+g>n?IE(m,f,n):[],b=new Set(h.map(v=>v.toolCallId));for(let v of d)b.has(v.toolCallId)||e.seenIds.add(v.toolCallId);h.length>0&&i.push(...h)}if(s.size===0&&i.length===0)return{messages:t,newlyReplacedCount:0};let a=await Promise.all(i.map(async d=>{let p=await zg(d.content,d.toolCallId,r);return{candidate:d,result:p}})),c=0;for(let{candidate:d,result:p}of a){if(e.seenIds.add(d.toolCallId),!p)continue;let u=Vg(p);s.set(d.toolCallId,u),e.replacements.set(d.toolCallId,u),c++}return s.size===0?{messages:t,newlyReplacedCount:0}:{messages:t.map(d=>{if(d.role!=="tool"||!d.tool_call_id)return d;let p=s.get(d.tool_call_id);return p===void 0?d:{...d,content:p}}),newlyReplacedCount:c}}var EE=new Set(["read_file","file_read","FileRead","grep","Grep","glob","Glob","search","list_dir","find_files","web_fetch","web_search","WebFetch","WebSearch"]),ME=new Set(["bash","execute_command","Bash","shell"]),ks=class{tools=[];hasErrored=!1;erroredToolDescription="";discarded=!1;siblingAbortController;progressResolve;config;concurrencySafe;constructor(e){this.config=e,this.concurrencySafe=e.concurrencySafeTools??EE,this.siblingAbortController=new AbortController,e.signal&&e.signal.addEventListener("abort",()=>{this.siblingAbortController.abort("parent_abort")},{once:!0})}discard(){this.discarded=!0}addTool(e){let r=this.concurrencySafe.has(e.function.name);this.tools.push({id:e.id,toolCall:e,status:"queued",isConcurrencySafe:r,results:[],pendingProgress:[]}),this.processQueue()}canExecuteTool(e){let r=this.tools.filter(o=>o.status==="executing"),n=this.config.maxConcurrentTools;return n&&n>0&&r.length>=n?!1:r.length===0||e&&r.every(o=>o.isConcurrencySafe)}async processQueue(){for(let e of this.tools)if(e.status==="queued"){if(this.canExecuteTool(e.isConcurrencySafe))await this.executeTool(e);else if(!e.isConcurrencySafe)break}}getAbortReason(){return this.discarded?"discarded":this.hasErrored?"sibling_error":this.config.signal?.aborted?"user_interrupted":null}getToolDescription(e){let r;try{r=JSON.parse(e.toolCall.function.arguments)}catch{}let n=r?.command??r?.file_path??r?.pattern??"";if(typeof n=="string"&&n.length>0){let o=n.length>40?n.slice(0,40)+"\u2026":n;return`${e.toolCall.function.name}(${o})`}return e.toolCall.function.name}createSyntheticError(e,r){let n=this.erroredToolDescription,o=r==="user_interrupted"?"User rejected tool use":r==="discarded"?"Streaming fallback - tool execution discarded":n?`Cancelled: parallel tool call ${n} errored`:"Cancelled: parallel tool call errored";return{callId:e.id,toolName:e.toolCall.function.name,ok:!1,error:o,message:Yn(e.id,{ok:!1,error:o})}}async executeTool(e){e.status="executing";let n=(async()=>{let o=this.getAbortReason();if(o){e.results.push(this.createSyntheticError(e,o)),e.status="completed";return}let{toolInvoker:s,hooks:i,sessionId:a,turnId:c,log:l}=this.config,d=e.toolCall.function.name,p=!1,u=e.toolCall.function.arguments;if(i)try{let S=await i.invoke("tool.before_invoke",{sessionId:a,turnId:c,callId:e.id,toolName:d,arguments:_E(u)});if(S.action==="abort"){let T=S.reason??"blocked by policy";l.info(`tool ${d} blocked: ${T}`),e.results.push({callId:e.id,toolName:d,ok:!1,error:T,blocked:!0,blockReason:T,message:Yn(e.id,{ok:!1,error:T})}),e.status="completed";return}S.action==="continue"&&S.context?.arguments&&(u=JSON.stringify(S.context.arguments))}catch{}let m=Date.now(),f=await s.invoke(c,d,u,this.siblingAbortController.signal),g=Math.max(0,Date.now()-m),h=this.getAbortReason();if(h&&!p){e.results.push(this.createSyntheticError(e,h)),e.status="completed";return}let b=!f.error,v=f.result;b&&v&&v.length>5e4&&(v=await Xg(v,e.id,a));let R=Yn(e.id,{ok:b,payload:v,error:f.error,toolReferences:f.toolReferences,imageUrls:f.imageUrls});b||(p=!0,ME.has(d)&&(this.hasErrored=!0,this.erroredToolDescription=this.getToolDescription(e),this.siblingAbortController.abort("sibling_error"))),i?.invoke(b?"tool.after_invoke":"tool.invoke_failed",{sessionId:a,turnId:c,callId:e.id,toolName:d,ok:b,...f.error?{error:f.error}:{}}).catch(()=>{}),e.results.push({callId:e.id,toolName:d,ok:b,error:f.error,durationMs:g,details:f.details,message:R}),e.status="completed"})();e.promise=n,n.finally(()=>{this.processQueue()})}*getCompletedResults(){if(!this.discarded){for(let e of this.tools)if(e.status!=="yielded"){if(e.status==="completed"&&e.results.length>0){e.status="yielded";for(let r of e.results)yield r}else if(e.status==="executing"&&!e.isConcurrencySafe)break}}}async*getRemainingResults(){if(!this.discarded){for(;this.hasUnfinishedTools();){await this.processQueue();for(let e of this.getCompletedResults())yield e;if(this.hasExecutingTools()&&!this.hasCompletedResults()){let e=this.tools.filter(n=>n.status==="executing"&&n.promise).map(n=>n.promise),r=new Promise(n=>{this.progressResolve=n});e.length>0&&await Promise.race([...e,r])}}for(let e of this.getCompletedResults())yield e}}hasCompletedResults(){return this.tools.some(e=>e.status==="completed")}hasExecutingTools(){return this.tools.some(e=>e.status==="executing")}hasUnfinishedTools(){return this.tools.some(e=>e.status!=="yielded")}};function _E(t){try{return JSON.parse(t)}catch{return}}He();import{readFile as DE}from"node:fs/promises";function
|
|
190
|
-
`)}function jE(){return Vc(new
|
|
189
|
+
...[truncated ${t.length-n} chars]`}function xE(t){let e=[],r=[];for(let n of t)n.role==="tool"&&typeof n.content=="string"&&n.tool_call_id?Kg(n.content)||r.push({toolCallId:n.tool_call_id,content:n.content,size:n.content.length}):n.role==="assistant"&&r.length>0&&(e.push(r),r=[]);return r.length>0&&e.push(r),e}function CE(t,e){let r=[],n=[],o=[];for(let s of t){let i=e.replacements.get(s.toolCallId);i!==void 0?r.push({...s,replacement:i}):e.seenIds.has(s.toolCallId)?n.push(s):o.push(s)}return{mustReapply:r,frozen:n,fresh:o}}function IE(t,e,r){let n=[...t].sort((i,a)=>a.size-i.size),o=[],s=e+t.reduce((i,a)=>i+a.size,0);for(let i of n){if(s<=r)break;o.push(i),s-=i.size}return o}async function Yg(t,e,r,n=ec){let o=xE(t);if(o.length===0)return{messages:t,newlyReplacedCount:0};let s=new Map,i=[];for(let d of o){let{mustReapply:p,frozen:u,fresh:m}=CE(d,e);for(let v of p)s.set(v.toolCallId,v.replacement);if(m.length===0){for(let v of d)e.seenIds.add(v.toolCallId);continue}let f=u.reduce((v,R)=>v+R.size,0),g=m.reduce((v,R)=>v+R.size,0),h=f+g>n?IE(m,f,n):[],b=new Set(h.map(v=>v.toolCallId));for(let v of d)b.has(v.toolCallId)||e.seenIds.add(v.toolCallId);h.length>0&&i.push(...h)}if(s.size===0&&i.length===0)return{messages:t,newlyReplacedCount:0};let a=await Promise.all(i.map(async d=>{let p=await zg(d.content,d.toolCallId,r);return{candidate:d,result:p}})),c=0;for(let{candidate:d,result:p}of a){if(e.seenIds.add(d.toolCallId),!p)continue;let u=Vg(p);s.set(d.toolCallId,u),e.replacements.set(d.toolCallId,u),c++}return s.size===0?{messages:t,newlyReplacedCount:0}:{messages:t.map(d=>{if(d.role!=="tool"||!d.tool_call_id)return d;let p=s.get(d.tool_call_id);return p===void 0?d:{...d,content:p}}),newlyReplacedCount:c}}var EE=new Set(["read_file","file_read","FileRead","grep","Grep","glob","Glob","search","list_dir","find_files","web_fetch","web_search","WebFetch","WebSearch"]),ME=new Set(["bash","execute_command","Bash","shell"]),ks=class{tools=[];hasErrored=!1;erroredToolDescription="";discarded=!1;siblingAbortController;progressResolve;config;concurrencySafe;constructor(e){this.config=e,this.concurrencySafe=e.concurrencySafeTools??EE,this.siblingAbortController=new AbortController,e.signal&&e.signal.addEventListener("abort",()=>{this.siblingAbortController.abort("parent_abort")},{once:!0})}discard(){this.discarded=!0}addTool(e){let r=this.concurrencySafe.has(e.function.name);this.tools.push({id:e.id,toolCall:e,status:"queued",isConcurrencySafe:r,results:[],pendingProgress:[]}),this.processQueue()}canExecuteTool(e){let r=this.tools.filter(o=>o.status==="executing"),n=this.config.maxConcurrentTools;return n&&n>0&&r.length>=n?!1:r.length===0||e&&r.every(o=>o.isConcurrencySafe)}async processQueue(){for(let e of this.tools)if(e.status==="queued"){if(this.canExecuteTool(e.isConcurrencySafe))await this.executeTool(e);else if(!e.isConcurrencySafe)break}}getAbortReason(){return this.discarded?"discarded":this.hasErrored?"sibling_error":this.config.signal?.aborted?"user_interrupted":null}getToolDescription(e){let r;try{r=JSON.parse(e.toolCall.function.arguments)}catch{}let n=r?.command??r?.file_path??r?.pattern??"";if(typeof n=="string"&&n.length>0){let o=n.length>40?n.slice(0,40)+"\u2026":n;return`${e.toolCall.function.name}(${o})`}return e.toolCall.function.name}createSyntheticError(e,r){let n=this.erroredToolDescription,o=r==="user_interrupted"?"User rejected tool use":r==="discarded"?"Streaming fallback - tool execution discarded":n?`Cancelled: parallel tool call ${n} errored`:"Cancelled: parallel tool call errored";return{callId:e.id,toolName:e.toolCall.function.name,ok:!1,error:o,message:Yn(e.id,{ok:!1,error:o})}}async executeTool(e){e.status="executing";let n=(async()=>{let o=this.getAbortReason();if(o){e.results.push(this.createSyntheticError(e,o)),e.status="completed";return}let{toolInvoker:s,hooks:i,sessionId:a,turnId:c,log:l}=this.config,d=e.toolCall.function.name,p=!1,u=e.toolCall.function.arguments;if(i)try{let S=await i.invoke("tool.before_invoke",{sessionId:a,turnId:c,callId:e.id,toolName:d,arguments:_E(u)});if(S.action==="abort"){let T=S.reason??"blocked by policy";l.info(`tool ${d} blocked: ${T}`),e.results.push({callId:e.id,toolName:d,ok:!1,error:T,blocked:!0,blockReason:T,message:Yn(e.id,{ok:!1,error:T})}),e.status="completed";return}S.action==="continue"&&S.context?.arguments&&(u=JSON.stringify(S.context.arguments))}catch{}let m=Date.now(),f=await s.invoke(c,d,u,this.siblingAbortController.signal),g=Math.max(0,Date.now()-m),h=this.getAbortReason();if(h&&!p){e.results.push(this.createSyntheticError(e,h)),e.status="completed";return}let b=!f.error,v=f.result;b&&v&&v.length>5e4&&(v=await Xg(v,e.id,a));let R=Yn(e.id,{ok:b,payload:v,error:f.error,toolReferences:f.toolReferences,imageUrls:f.imageUrls});b||(p=!0,ME.has(d)&&(this.hasErrored=!0,this.erroredToolDescription=this.getToolDescription(e),this.siblingAbortController.abort("sibling_error"))),i?.invoke(b?"tool.after_invoke":"tool.invoke_failed",{sessionId:a,turnId:c,callId:e.id,toolName:d,ok:b,...f.error?{error:f.error}:{}}).catch(()=>{}),e.results.push({callId:e.id,toolName:d,ok:b,error:f.error,durationMs:g,details:f.details,message:R}),e.status="completed"})();e.promise=n,n.finally(()=>{this.processQueue()})}*getCompletedResults(){if(!this.discarded){for(let e of this.tools)if(e.status!=="yielded"){if(e.status==="completed"&&e.results.length>0){e.status="yielded";for(let r of e.results)yield r}else if(e.status==="executing"&&!e.isConcurrencySafe)break}}}async*getRemainingResults(){if(!this.discarded){for(;this.hasUnfinishedTools();){await this.processQueue();for(let e of this.getCompletedResults())yield e;if(this.hasExecutingTools()&&!this.hasCompletedResults()){let e=this.tools.filter(n=>n.status==="executing"&&n.promise).map(n=>n.promise),r=new Promise(n=>{this.progressResolve=n});e.length>0&&await Promise.race([...e,r])}}for(let e of this.getCompletedResults())yield e}}hasCompletedResults(){return this.tools.some(e=>e.status==="completed")}hasExecutingTools(){return this.tools.some(e=>e.status==="executing")}hasUnfinishedTools(){return this.tools.some(e=>e.status!=="yielded")}};function _E(t){try{return JSON.parse(t)}catch{return}}He();import{readFile as DE}from"node:fs/promises";function Pr(t){let e=typeof t.content=="string"?t.content:t.content!=null?JSON.stringify(t.content):"";return Math.ceil(e.length/4)}function xr(t){let e=0;for(let r of t)e+=Pr(r);return e}var wl={"deepseek-v4-flash":1e6,"deepseek-v4-pro":1e6,"deepseek-chat":1e6,"deepseek-reasoner":1e6,"gpt-4o":128e3,"gpt-4o-mini":128e3,"claude-sonnet-4-20250514":2e5,"claude-3-5-haiku-20241022":2e5,"gemini-3.1-pro-preview":1e6,"gemini-3-flash-preview":1e6,"gemini-3.1-flash-lite":1e6};function Qg(t){if(!t)return 128e3;if(t in wl)return wl[t];let e=t.toLowerCase();for(let[r,n]of Object.entries(wl))if(e.startsWith(r.toLowerCase()))return n;return 128e3}var xl=8e3,NE="deepseek-v4-flash";function LE(){return D().resolveModelForPurpose("textGeneration")??NE}var Zg=new Wn(200);var Pl=new Gn;function ef(){return Pl}function OE(t,e){return async(r,n)=>{let o=e?.transport,s=e?.apiKey;if(!o||!s)return t.debug("[context-compression] no LLM transport for summarization \u2014 using sync fallback"),Al(r);try{let i="",a=e?.model??LE();for await(let c of o.stream({model:a,messages:[{role:"system",content:"You are a precise conversation summarizer."},{role:"user",content:n}],maxTokens:2e3,temperature:.3},s,AbortSignal.timeout(3e4)))c.type==="delta"&&(i+=c.text);return i||(t.warn("[context-compression] empty summary response"),Al(r))}catch(i){return t.warn({err:i.message},"[context-compression] summarize call error \u2014 using fallback"),Al(r)}}}function Al(t){let e=[],r=t.filter(s=>s.role==="user"),n=r.slice(0,20).map(s=>{let i=typeof s.content=="string"?s.content:JSON.stringify(s.content??"");return`- [user]: ${i.slice(0,300)}${i.length>300?"...":""}`});e.push(`## User Requests (${r.length} messages)`),e.push(...n);let o=t.filter(s=>s.role==="assistant");if(o.length>0){let s=o.slice(0,10).map(i=>{let a=typeof i.content=="string"?i.content:JSON.stringify(i.content??"");return`- [assistant]: ${a.slice(0,150)}${a.length>150?"...":""}`});e.push("",`## Assistant Responses (${o.length} total)`),e.push(...s)}return e.join(`
|
|
190
|
+
`)}function jE(){return Vc(new Ar(xl),new ar(20,Pr),new tn(Pr))}function Jg(t,e){let r=Xc(new Ar(xl),new ar(20,Pr),new Bn({protectedHeadExchanges:1,protectedTailMessages:8,summarize:t,estimateTokens:Pr}),new tn(Pr));return new qn({inner:r,estimateTokens:Pr,onCacheInvalidated:e?.onCacheInvalidated})}var Cl=null;function tf(t,e){let r=e?.budget??ms({modelContextWindow:Qg(e?.model)}),o=(e?.pipeline??jE()).compress(t,r);if(o.droppedCount>0){let s=xr(t),i=xr(o.messages);Zg.record({timestamp:Date.now(),strategy:o.strategy,tokensBefore:s,tokensAfter:i,droppedCount:o.droppedCount,latencyMs:o.metrics?.latencyMs??0,usedLlm:!1,cacheInvalidated:o.metrics?.cacheInvalidated??!1,tier:zn(s,r)})}return o.droppedCount>0&&Cl?.(o.droppedCount,xr(o.messages)),o}async function $E(t,e,r){let n=r??ms({modelContextWindow:Qg(e.model)}),o=xr(t),s=zn(o,n),i;switch(s){case"none":i={messages:t,droppedCount:0,strategy:"none"};break;case"trim-only":i=new Ar(xl).compress(t,n);break;case"sliding-window":{i=await Jg(e.summarize).compressAsync(t,n);break}case"llm-summarize":{let a=e.pipeline??Jg(e.summarize);i=Kn(a)?await a.compressAsync(t,n):a.compress(t,n);break}}return i.droppedCount>0&&(i={...i,messages:await Jc(i.messages,t,{maxFiles:5,maxTokenBudget:5e4,readFile:async a=>{try{return await DE(a,"utf-8")}catch{return null}}})}),UE(t,i,n),i}function UE(t,e,r){if(e.droppedCount>0||e.metrics?.usedLlm){let n=e.metrics?.tokensBefore||xr(t),o=e.metrics?.tokensAfter||xr(e.messages);Zg.record({timestamp:Date.now(),strategy:e.strategy,tokensBefore:n,tokensAfter:o,droppedCount:e.droppedCount,latencyMs:e.metrics?.latencyMs??0,usedLlm:e.metrics?.usedLlm??!1,cacheInvalidated:e.metrics?.cacheInvalidated??!1,tier:zn(n,r)})}if(e.droppedCount>0){let n=e.metrics?.tokensAfter||xr(e.messages);Cl?.(e.droppedCount,n)}}function FE(t,e){let r=OE(t,e),n={id:"builtin-compressor",label:"4-Layer Compression Funnel (built-in)",async compressAsync(o,s,i){return $E(o,{budget:s,model:i?.model,sessionId:i?.sessionId,summarize:r},s)}};Pl.register(n),Pl.activate(n.id),t.info(`[context-compression] registered context engine: ${n.id}`)}function rf(t,e,r){FE(e,r),t.register({point:"context.before_compact",priority:50,label:"context-compression-bridge",handler:(n,o)=>{let s=o.messageCount;return s&&s>0&&e.debug(`[context-compression] before_compact: ${s} messages entering compression`),{action:"continue"}}}),Cl=(n,o)=>{e.debug(`[context-compression] after_compact: removed ${n}, ${o} tokens remaining`),t.invoke("context.after_compact",{sessionId:"",turnId:"",removedCount:n,tokenCount:o}).catch(()=>{})}}function nf(t,e,r){let n=r-e;return`[Budget] ${Math.round(t)}% used (${e.toLocaleString()} / ${r.toLocaleString()} tokens). ${n.toLocaleString()} tokens remaining. `+(t>=90?"Wrap up your current taskyou are near the token limit.":"Continue workingdo not summarize prematurely.")}var HE=[/^(?:bash|shell|exec|terminal|run_command)$/i,/^(?:git_push|git_reset|git_force)$/i];function BE(t,e){if(HE.some(r=>r.test(t)))return!0;if(e)for(let r of e)try{if(new RegExp(r,"i").test(t))return!0}catch{}return!1}function qE(t,e){let r=t.meta,n=t.function.name;return r?.riskLevel?r.riskLevel:r?.isReadOnly?"read":r?.isDangerous||BE(n,e.dangerousPatterns)?"system":"write"}function WE(t){return`risk_${t}`}function GE(t,e){let r=t.function.name,n=qE(t,e),o=[];return e.blockedToolNames?.includes(r)?(o.push("policy_blocked"),{decision:"deny",riskLevel:n,reasonCodes:o}):(o.push(WE(n)),t.meta?.requiresApproval||n==="system"||n==="external_egress"?(t.meta?.requiresApproval&&o.unshift("requires_approval"),{decision:"ask",riskLevel:n,reasonCodes:o}):{decision:"allow",riskLevel:n,reasonCodes:o})}function KE(t){switch(t){case"allow":return"eligible";case"ask":return"approval-required";case"deny":return"blocked-by-policy"}}function of(t,e={}){let r=new Map,n=[],o=[],s=[];for(let i of t){let a=i.function.name,{decision:c,riskLevel:l,reasonCodes:d}=GE(i,e),p=KE(c),u={toolName:a,status:p,decision:c,riskLevel:l,approvalRequired:c==="ask",reasonCodes:d};if(r.set(a,u),c==="deny"){o.push(u);continue}n.push(i),c==="ask"&&s.push(u)}return{eligibleTools:n,blockedTools:o,approvalRequiredTools:s,eligibilityByName:r}}function Rs(){return{detectRecallCategories:Kp,resolveModelForPurpose:t=>D().resolveModelForPurpose(t),toolLoop:{createContentReplacementState:Wg,enforceToolResultBudget:Yg,getActiveContextCompressionEngine:()=>ef().getActive()??null,compressMessages:tf,getBudgetContinuationMessage:nf,createStreamingToolExecutor:t=>new ks(t),resolveToolEligibility:(t,e)=>of(t,e)}}}var sn=({transport:t,apiKey:e,toolInvoker:r,log:n,hooks:o,maxRounds:s})=>new on({llmTransport:t,apiKey:e,toolInvoker:r,log:n,hooks:o,maxRounds:s,runtimePorts:Rs()});async function an(t){let e=t.params??{},r=e.turnId??sf(),n=e.sessionId,o=e.config,s=X(),i=o?.memoryRoot||this.resolveMemoryRoot?.()||Il.join(s,"memory"),a=o?.transcriptDir||this.resolveTranscriptDir?.()||Il.join(s,"agent-logs"),c=o?.dreamSessionIds??[];t.id!==void 0&&this.sendResponse(t.id,{accepted:!0,turnId:r});let l=new AbortController;this.activeTurn=l,this.log(`dream ${r} starting (session: ${n}, sessions reviewing: ${c.length})`),this.sendNotification("system.activity",{category:"dream",level:"info",title:"\u68A6\u5883\u6574\u7406\u542F\u52A8",detail:`\u6B63\u5728\u56DE\u987E ${c.length} \u4E2A\u4F1A\u8BDD\u7684\u8BB0\u5FC6...`});let d={provider:o?.provider,model:o?.model,apiKey:o?.apiKey,baseUrl:o?.baseUrl,maxRounds:o?.maxRounds,temperature:o?.temperature,contextWindowTokens:o?.contextWindowTokens,maxOutputTokens:o?.maxOutputTokens,modelMaxOutputTokens:o?.modelMaxOutputTokens,reasoning:o?.reasoning,promptCacheKey:o?.promptCacheKey,promptCacheRetention:o?.promptCacheRetention,serviceTier:o?.serviceTier,openaiBuiltinTools:o?.openaiBuiltinTools,maxToolCalls:o?.maxToolCalls,parallelToolCalls:o?.parallelToolCalls,textVerbosity:o?.textVerbosity};{let u=d.provider??"",m=d.model??"";if(u&&m){let f=D().getModelInfo(u,m);f?.streamRequired&&(d.streamRequired=!0),!d.contextWindowTokens&&f?.contextWindow&&(d.contextWindowTokens=f.contextWindow)}}if(!this.resolveAgent(d)||!this.currentTransport){this.sendNotification("turn.start",{turnId:r}),this.sendNotification("turn.error",{turnId:r,error:{message:"No LLM provider configured for dream.",code:"NO_PROVIDER"}});return}this.sendNotification("turn.start",{turnId:r});try{let u={context:{memoryRoot:i,transcriptDir:a,currentSessionId:n,listSessionsSince:async()=>c,currentSessionTurnCount:o?.currentSessionTurnCount??0},triggerConfig:{force:o?.force!==!1},transport:this.currentTransport,toolInvoker:{invoke:async(f,g,h,b)=>{if(g.startsWith("$"))return{result:h};let v=this.toolCatalog.findTool(g);if(!v||typeof v.execute!="function")return{result:"",error:`Unknown tool: ${g}`};let R=`tc_${sf().slice(0,8)}`;try{let S=JSON.parse(h),T=await v.execute(R,S,b);return{result:T.content.map(E=>E.text??"").join(`
|
|
191
191
|
`),error:T.details?.error}}catch(S){return{result:"",error:S instanceof Error?S.message:String(S)}}}},createAgentRunner:sn,tools:this.toolCatalog.getToolManifest(),apiKey:this.currentApiKey,model:d.model??this.currentModel,log:{info:f=>this.log(f),warn:f=>this.log(`[warn] ${f}`),error:f=>this.log(`[error] ${f}`),debug:f=>{this.verbose&&this.log(`[debug] ${f}`)}},hooks:this.currentHooks??void 0,parentSignal:l.signal,memoryProvider:this.memoryProvider??void 0,memoryUserId:this.memoryUserId||void 0},m=await rg(u);if(m.ok){if(this.memoryProvider&&this.memoryUserId)try{let f=await sg({adapter:this.memoryProvider,userId:this.memoryUserId,memoryRoot:i,log:{info:g=>this.log(g),debug:g=>{this.verbose&&this.log(g)}}});f.ran&&(this.sendNotification("memory.decay.completed",{decayed:f.decayed,archived:f.archived,durationMs:f.durationMs}),this.sendNotification("system.activity",{category:"decay",level:"info",title:"\u8BB0\u5FC6\u8870\u51CF\u5B8C\u6210",detail:`\u8870\u51CF ${f.decayed} \u6761\uFF0C\u5F52\u6863 ${f.archived} \u6761 (${f.durationMs}ms)`}))}catch(f){this.log(`[decay] post-dream decay error: ${f instanceof Error?f.message:String(f)}`)}this.sendNotification("system.activity",{category:"dream",level:"success",title:"\u68A6\u5883\u6574\u7406\u5B8C\u6210",detail:`\u56DE\u987E ${m.sessionsReviewed} \u4E2A\u4F1A\u8BDD\uFF0C\u6574\u7406 ${m.filesTouched.length} \u4E2A\u8BB0\u5FC6\u6587\u4EF6\uFF0C\u8017\u65F6 ${m.durationMs}ms`}),this.sendNotification("memory.updated",{source:"dream",target:"consolidation",files:m.filesTouched}),this.sendNotification("turn.end",{turnId:r,content:`Dream consolidation completed. ${m.sessionsReviewed} sessions reviewed, ${m.filesTouched.length} files touched. Duration: ${m.durationMs}ms.`,usage:{inputTokens:0,outputTokens:0}})}else this.sendNotification("system.activity",{category:"dream",level:"error",title:"\u68A6\u5883\u6574\u7406\u5931\u8D25",detail:m.error??"\u672A\u77E5\u9519\u8BEF"}),this.sendNotification("turn.error",{turnId:r,error:{message:m.error??"Dream consolidation failed",code:"DREAM_FAILED"}});this.log(`dream ${r} completed`)}catch(u){if(l.signal.aborted)this.sendNotification("system.activity",{category:"dream",level:"warn",title:"\u68A6\u5883\u6574\u7406\u88AB\u4E2D\u65AD"}),this.sendNotification("turn.error",{turnId:r,error:{message:"Dream aborted",code:"ABORTED"}});else{let m=u instanceof Error?u.message:String(u);this.sendNotification("system.activity",{category:"dream",level:"error",title:"\u68A6\u5883\u6574\u7406\u5F02\u5E38",detail:m}),this.sendNotification("turn.error",{turnId:r,error:{message:m,code:"INTERNAL_ERROR"}})}}finally{this.activeTurn===l&&(this.activeTurn=null)}}G();import*as df from"node:fs";import*as ws from"node:path";import{randomUUID as yM}from"node:crypto";import{spawn as Dl}from"node:child_process";import{createInterface as Ts}from"node:readline";import{resolve as iM,join as eo}from"node:path";import{createServer as aM}from"node:net";import{createWriteStream as cM,mkdirSync as lM}from"node:fs";import{tmpdir as dM}from"node:os";import{createInterface as zE}from"node:readline";var VE=1,XE=1,wt={USER_MESSAGE_CHUNK:"user_message_chunk",AGENT_MESSAGE_CHUNK:"agent_message_chunk",AGENT_THOUGHT_CHUNK:"agent_thought_chunk",TOOL_CALL:"tool_call",TOOL_CALL_UPDATE:"tool_call_update",PLAN:"plan",AVAILABLE_COMMANDS_UPDATE:"available_commands_update",CURRENT_MODE_UPDATE:"current_mode_update",CONFIG_OPTION_UPDATE:"config_option_update",SESSION_INFO_UPDATE:"session_info_update",USAGE_UPDATE:"usage_update"},YE=1e4,Cr=class{pendingRpcs=new Map;rl=null;child=null;onNotification=null;hostHandler=null;attach(e,r,n){this.onNotification=r??null,this.hostHandler=n??null,this.child=e,this.rl=zE({input:e.stdout,crlfDelay:Number.POSITIVE_INFINITY}),this.rl.on("line",o=>{let s=o.trim();if(!s)return;let i;try{i=JSON.parse(s)}catch{return}let a="id"in i&&(typeof i.id=="number"||typeof i.id=="string"),c="method"in i&&typeof i.method=="string";if(a&&!c){let l=this.pendingRpcs.get(i.id);if(l){clearTimeout(l.timer),this.pendingRpcs.delete(i.id);let d=i;d.error?l.reject(new Error(d.error.message)):l.resolve(d.result)}return}if(a&&c){this.handleAgentRequest(i.id,i.method,i.params);return}c&&!a&&this.onNotification?.(i.method,i.params)})}handleAgentRequest(e,r,n){let o=(c,l)=>{if(!this.child?.stdin?.writable)return;let d={jsonrpc:"2.0",id:e};l?d.error=l:d.result=c??{};try{this.child.stdin.write(`${JSON.stringify(d)}
|
|
192
192
|
`)}catch{}},s=this.hostHandler,i=n;(async()=>{switch(r){case"fs/read_text_file":return s?.readTextFile?.(i)??{};case"fs/write_text_file":return s?.writeTextFile?.(i)??{};case"session/request_permission":return s?.requestPermission?.(i??{})??{outcome:"cancelled"};case"session/elicitation":case"session/elicitation/complete":return s?.elicitation?.(i??{})??{};case"terminal/create":return s?.createTerminal?.(i??{})??{};case"terminal/output":return s?.terminalOutput?.(i??{})??{};case"terminal/release":return s?.releaseTerminal?.(i??{})??{};case"terminal/wait_for_exit":return s?.waitForTerminalExit?.(i??{})??{};case"terminal/kill":return s?.killTerminal?.(i??{})??{};default:if(s?.extMethod)return s.extMethod(r,n);throw new Error(`Method not found: ${r}`)}})().then(c=>o(c)).catch(c=>o(null,{code:-32601,message:c instanceof Error?c.message:String(c)}))}detach(){this.rl?.close(),this.rl=null,this.child=null,this.hostHandler=null;for(let[e,r]of this.pendingRpcs)clearTimeout(r.timer),r.reject(new Error("ACP adapter detached")),this.pendingRpcs.delete(e)}sendRpc(e,r,n,o=3e4){let s=VE++,i={jsonrpc:"2.0",id:s,method:r,params:n};return new Promise((a,c)=>{let l=setTimeout(()=>{this.pendingRpcs.delete(s),c(new Error(`ACP RPC timeout: ${r} (${o}ms)`))},o);this.pendingRpcs.set(s,{resolve:a,reject:c,timer:l});try{e.stdin.write(`${JSON.stringify(i)}
|
|
193
193
|
`)}catch(d){clearTimeout(l),this.pendingRpcs.delete(s),c(d instanceof Error?d:new Error(String(d)))}})}async initialize(e){let r=await this.sendRpc(e,"initialize",{protocolVersion:XE,clientInfo:{name:"qlogicagent",version:"1.0.0"},clientCapabilities:{fs:{readTextFile:!0,writeTextFile:!0},terminal:!0,auth:{terminal:!1}}},YE),n=r?.agentCapabilities??{};return{protocolVersion:typeof r?.protocolVersion=="number"?r.protocolVersion:0,agentCapabilities:{loadSession:n.loadSession===!0,mcpCapabilities:n.mcpCapabilities,promptCapabilities:n.promptCapabilities,sessionCapabilities:n.sessionCapabilities},agentInfo:r?.agentInfo,authMethods:r?.authMethods}}async createSession(e,r){let n={cwd:r.cwd,mcpServers:r.mcpServers??[]};r.additionalDirectories?.length&&(n.additionalDirectories=r.additionalDirectories),r.systemPrompt&&(n.systemPrompt=r.systemPrompt);let o=await this.sendRpc(e,"session/new",n);if(typeof o?.sessionId!="string")throw new Error("ACP session/new: agent did not return sessionId");return{sessionId:o.sessionId}}async sendPrompt(e,r,n,o=3e5){let s=await this.sendRpc(e,"session/prompt",{sessionId:r,prompt:[{type:"text",text:n}]},o);return{stopReason:s?.stopReason??"end_turn",usage:s?.usage,userMessageId:s?.userMessageId}}async resumeSession(e,r,n){let o={sessionId:r,cwd:n?.cwd??process.cwd(),mcpServers:n?.mcpServers??[]},s=await this.sendRpc(e,"session/load",o,3e4);if(typeof s?.sessionId!="string")throw new Error("ACP session/load: agent did not return sessionId");return{sessionId:s.sessionId}}async closeSession(e,r){try{await this.sendRpc(e,"session/close",{sessionId:r},5e3)}catch{}}static translateNotification(e,r){let n=r;if(e==="session/update"){if(!n)return null;let o=n.update;if(!o)return null;let s=o.sessionUpdate,i=n.sessionId;switch(s){case wt.AGENT_MESSAGE_CHUNK:{let a=o.content;return{method:"turn.delta",params:{text:a?.text??a?.content??"",sessionId:i,messageId:o.messageId}}}case wt.AGENT_THOUGHT_CHUNK:return{method:"turn.thought_delta",params:{text:o.content?.text??"",sessionId:i}};case wt.TOOL_CALL:return{method:"turn.tool_call",params:{callId:o.toolCallId,toolName:o.title,status:o.status??"running",content:o.content,kind:o.kind,rawInput:o.rawInput,sessionId:i}};case wt.TOOL_CALL_UPDATE:return{method:"turn.tool_result",params:{callId:o.toolCallId,toolName:o.title,status:o.status??"completed",content:o.content,rawOutput:o.rawOutput,sessionId:i}};case wt.USAGE_UPDATE:return{method:"turn.usage_update",params:o??{}};case wt.PLAN:return{method:"turn.plan",params:{steps:o.steps,sessionId:i}};case wt.AVAILABLE_COMMANDS_UPDATE:case wt.CURRENT_MODE_UPDATE:case wt.CONFIG_OPTION_UPDATE:case wt.SESSION_INFO_UPDATE:return{method:"turn.session_info",params:{type:s,...o,sessionId:i}};case wt.USER_MESSAGE_CHUNK:return null;default:return{method:`turn.${s??"unknown"}`,params:{...o,sessionId:i}}}}return null}};var Qn=class{usage={inputTokens:0,outputTokens:0,totalTokens:0,cachedReadTokens:0,thoughtTokens:0,cost:0,hasTier1:!1,turnCount:0};onUsageUpdate(e){this.usage.hasTier1=!0,typeof e.inputTokens=="number"&&(this.usage.inputTokens+=e.inputTokens),typeof e.outputTokens=="number"&&(this.usage.outputTokens+=e.outputTokens),typeof e.totalTokens=="number"&&(this.usage.totalTokens+=e.totalTokens),typeof e.cost=="number"&&(this.usage.cost+=e.cost)}onPromptResponseUsage(e){e&&(this.usage.hasTier1||(this.usage.turnCount++,typeof e.inputTokens=="number"&&(this.usage.inputTokens+=e.inputTokens),typeof e.outputTokens=="number"&&(this.usage.outputTokens+=e.outputTokens),typeof e.totalTokens=="number"&&(this.usage.totalTokens+=e.totalTokens),typeof e.cachedReadTokens=="number"&&(this.usage.cachedReadTokens+=e.cachedReadTokens),typeof e.thoughtTokens=="number"&&(this.usage.thoughtTokens+=e.thoughtTokens)))}getUsage(){return{...this.usage}}reset(){this.usage={inputTokens:0,outputTokens:0,totalTokens:0,cachedReadTokens:0,thoughtTokens:0,cost:0,hasTier1:!1,turnCount:0}}hasData(){return this.usage.hasTier1||this.usage.turnCount>0}};import{execSync as af}from"node:child_process";import{existsSync as cf,readdirSync as JE}from"node:fs";import{homedir as QE,platform as ZE}from"node:os";import{join as Zn}from"node:path";var El={claude:{id:"claude",name:"Claude Code",cliCommand:"claude",acpArgs:["--experimental-acp"],authRequired:!0,skillsDirs:[".claude/skills"],supportsBaseUrlOverride:!0,apiKeyEnvVar:"ANTHROPIC_API_KEY",baseUrlEnvVar:"ANTHROPIC_BASE_URL"},codex:{id:"codex",name:"OpenAI Codex CLI",cliCommand:"codex-acp",acpArgs:[],authRequired:!0,supportsBaseUrlOverride:!0,apiKeyEnvVar:"OPENAI_API_KEY",baseUrlEnvVar:"OPENAI_BASE_URL"},qwen:{id:"qwen",name:"Qwen Code",cliCommand:"qwen-code",acpArgs:["--acp","--experimental-skills"],defaultCliPath:"npx @qwen-code/qwen-code",authRequired:!0,skillsDirs:[".qwen/skills"],supportsBaseUrlOverride:!0,apiKeyEnvVar:"DASHSCOPE_API_KEY"},kimi:{id:"kimi",name:"Kimi CLI",cliCommand:"kimi",acpArgs:["acp"],authRequired:!1,skillsDirs:[".kimi/skills"],supportsBaseUrlOverride:!0},opencode:{id:"opencode",name:"OpenCode",cliCommand:"opencode",acpArgs:["acp"],authRequired:!1,skillsDirs:[".opencode/skills"],supportsBaseUrlOverride:!0},cursor:{id:"cursor",name:"Cursor Agent",cliCommand:"cursor-agent",acpArgs:["acp"],authRequired:!0,skillsDirs:[".cursor/skills"],supportsBaseUrlOverride:!1},hermes:{id:"hermes",name:"Hermes Agent",cliCommand:"hermes",acpArgs:["acp"],authRequired:!1,supportsBaseUrlOverride:!0},copilot:{id:"copilot",name:"GitHub Copilot",cliCommand:"copilot",acpArgs:["--acp"],authRequired:!0,supportsBaseUrlOverride:!1},codebuddy:{id:"codebuddy",name:"CodeBuddy",cliCommand:"codebuddy",acpArgs:["--acp"],authRequired:!0,skillsDirs:[".codebuddy/skills"],supportsBaseUrlOverride:!0},kiro:{id:"kiro",name:"Kiro CLI",cliCommand:"kiro-cli",acpArgs:["acp"],authRequired:!0,supportsBaseUrlOverride:!0},snow:{id:"snow",name:"Snow",cliCommand:"snow",acpArgs:["--acp"],authRequired:!0,supportsBaseUrlOverride:!0},qoder:{id:"qoder",name:"Qoder",cliCommand:"qodercli",acpArgs:["--acp"],authRequired:!0,supportsBaseUrlOverride:!0},gemini:{id:"gemini",name:"Gemini CLI",cliCommand:"gemini",acpArgs:["--acp"],defaultCliPath:"npx @google/gemini-cli",authRequired:!0,supportsBaseUrlOverride:!1},glm:{id:"glm",name:"GLM Agent",cliCommand:"glm-acp-agent",acpArgs:[],defaultCliPath:"npx glm-acp-agent",authRequired:!0,supportsBaseUrlOverride:!0,apiKeyEnvVar:"ZHIPU_API_KEY"},cline:{id:"cline",name:"Cline",cliCommand:"cline",acpArgs:["--acp"],defaultCliPath:"npx cline",authRequired:!0,supportsBaseUrlOverride:!0},nova:{id:"nova",name:"Nova",cliCommand:"nova",acpArgs:["acp"],defaultCliPath:"npx @compass-ai/nova",authRequired:!0,supportsBaseUrlOverride:!0},openclaw:{id:"openclaw",name:"OpenClaw",cliCommand:"openclaw",acpArgs:["--acp"],authRequired:!0,supportsBaseUrlOverride:!0,apiKeyEnvVar:"OPENCLAW_API_KEY",baseUrlEnvVar:"OPENCLAW_BASE_URL"}};var _l=ZE()==="win32";function Ml(t){try{let e=_l?`where ${t}`:`which ${t}`;return af(e,{encoding:"utf8",timeout:5e3,stdio:["pipe","pipe","pipe"]}).trim().split(/\r?\n/)[0]?.trim()||null}catch{return null}}function eM(t,e){let r=s=>{let i=s.match(/^(\d+)\.(\d+)\.(\d+)/);return i?[Number(i[1]),Number(i[2]),Number(i[3])]:[0,0,0]},n=r(t),o=r(e);for(let s=0;s<3;s+=1)if(n[s]!==o[s])return o[s]-n[s];return e.localeCompare(t)}function tM(){if(!_l)return null;let t=[process.env.COPILOT_CACHE_HOME?Zn(process.env.COPILOT_CACHE_HOME,"pkg","win32-x64"):null,process.env.LOCALAPPDATA?Zn(process.env.LOCALAPPDATA,"copilot","pkg","win32-x64"):null,process.env.COPILOT_HOME?Zn(process.env.COPILOT_HOME,"pkg","win32-x64"):null,Zn(QE(),".copilot","pkg","win32-x64")].filter(e=>!!e);for(let e of t)try{let r=JE(e,{withFileTypes:!0}).filter(n=>n.isDirectory()).map(n=>n.name).sort(eM);for(let n of r){let o=Zn(e,n,"npm-loader.js");if(cf(o))return o}}catch{}return null}function rM(t){return t.id==="copilot"?tM()??Ml(t.cliCommand):Ml(t.cliCommand)}function nM(t){try{let e=t.endsWith("npm-loader.js")?`"${process.execPath}" "${t}" version`:`"${t}" version`;return af(e,{encoding:"utf8",timeout:5e3,stdio:["pipe","pipe","pipe"]}).trim().match(/(\d+\.\d+[\w.-]*)/)?.[1]??null}catch{return null}}function oM(t,e){if(!_l)return{cliPath:t,acpArgs:e};if(t.endsWith("npm-loader.js")){let n=e.includes("--no-auto-update");return{cliPath:process.execPath,acpArgs:[t,...e,...n?[]:["--no-auto-update"]]}}let r=`${t}.ps1`;return cf(r)?{cliPath:"powershell.exe",acpArgs:["-NoProfile","-ExecutionPolicy","Bypass","-File",r,...e]}:{cliPath:t,acpArgs:e}}var sM=6e4,Ss=class{cache=null;configStore=null;setConfigStore(e){this.configStore=e}scan(e=!1){if(!e&&this.cache&&Date.now()-this.cache.timestamp<sM)return this.cache.agents;let r=[];for(let n of Object.values(El))r.push(this.detectBackend(n));if(this.configStore?.customAgents)for(let n of Object.values(this.configStore.customAgents))r.push(this.detectCustomAgent(n));return this.cache={agents:r,timestamp:Date.now()},r}list(){return this.cache?this.cache.agents:this.scan()}clearCache(){this.cache=null}detectBackend(e){let r=rM(e),n=this.hasAgentConfig(e.id);if(!r)return{id:e.id,name:e.name,category:"teammate",protocol:"acp",status:"not_installed",authRequired:e.authRequired,hasConfig:n,supportsBaseUrlOverride:e.supportsBaseUrlOverride,capabilities:{supportsMcp:!0,supportsResume:!1,supportsUsageUpdate:e.id==="claude"||e.id==="codex",skillsDirs:e.skillsDirs}};let o=nM(r);return e.id==="copilot"&&!o?{id:e.id,name:e.name,category:"teammate",protocol:"acp",status:"not_installed",authRequired:e.authRequired,hasConfig:n,supportsBaseUrlOverride:e.supportsBaseUrlOverride,capabilities:{supportsMcp:!0,supportsResume:!1,supportsUsageUpdate:!1,skillsDirs:e.skillsDirs}}:{id:e.id,name:e.name,category:"teammate",protocol:"acp",status:"available",cliPath:r,version:o??void 0,authRequired:e.authRequired,hasConfig:n,supportsBaseUrlOverride:e.supportsBaseUrlOverride,capabilities:{supportsMcp:!0,supportsResume:e.id==="claude"||e.id==="goose"||e.id==="copilot",supportsUsageUpdate:e.id==="claude"||e.id==="codex"||e.id==="copilot",skillsDirs:e.skillsDirs}}}detectCustomAgent(e){let r=Ml(e.cliCommand),n=this.hasAgentConfig(e.id);return{id:e.id,name:e.name,category:"teammate",protocol:"acp",status:r?"available":"not_installed",cliPath:r??void 0,authRequired:e.authRequired??!1,hasConfig:n,supportsBaseUrlOverride:e.supportsBaseUrlOverride??!1,capabilities:{supportsMcp:!0,supportsResume:!1,supportsUsageUpdate:!1,skillsDirs:e.skillsDirs}}}hasAgentConfig(e){if(!this.configStore)return!1;let r=this.configStore.agents[e];return!!(r?.apiKey||r?.baseUrl||r?.customCliPath)}buildExternalDescriptor(e){let r=this.list().find(i=>i.id===e);if(!r||r.protocol!=="acp"||r.status!=="available"||!r.cliPath)return null;let n=El[e],o=this.configStore?.agents[e],s=o?.customCliPath?{cliPath:o.customCliPath,acpArgs:o?.customArgs??n?.acpArgs??[]}:oM(r.cliPath,o?.customArgs??n?.acpArgs??[]);return{id:e,cliPath:s.cliPath,acpArgs:s.acpArgs,env:o?.env??n?.env,protocol:"acp"}}};var uM=1;function pM(t,e){return{jsonrpc:"2.0",id:uM++,method:t,params:e,meta:Fc(t)}}var mM=["NODE_ENV","HOME","PATH","TERM","OPENAI_API_KEY","OPENAI_BASE_URL","ANTHROPIC_API_KEY","ANTHROPIC_BASE_URL","HTTP_PROXY","HTTPS_PROXY","NO_PROXY","http_proxy","https_proxy","no_proxy"];function gM(t){let e={};for(let r of mM)process.env[r]&&(e[r]=process.env[r]);return t.apiKey&&(e.OPENAI_API_KEY=t.apiKey),t.baseUrl&&(e.OPENAI_BASE_URL=t.baseUrl),e.QLOGICAGENT_MEMBER_ID=t.memberId,e.QLOGICAGENT_MEMBER_NAME=t.name,t.agentType&&(e.QLOGICAGENT_AGENT_TYPE=t.agentType),t.model&&(e.QLOGICAGENT_MODEL=t.model),t.env&&Object.assign(e,t.env),e}var Nl=kc,fM=Rc,cn=Sc,lf=Tc;function hM(t){return new Promise(e=>setTimeout(e,t))}var dt=class t{processes=new Map;callbacks;cliBinaryPath;mcpBridgeScriptPath;constructor(e={}){this.callbacks=e;let r=iM(eo(import.meta.url.startsWith("file://")?new URL(import.meta.url).pathname.replace(/^\/([A-Z]:)/,"$1"):process.cwd(),"..",".."));this.cliBinaryPath=eo(r,"dist","cli.js"),this.mcpBridgeScriptPath=eo(r,"dist","runtime","infra","mcp-bridge-server.js")}slog(e,r,n,o){let i=`[${new Date().toISOString()}] [${e}] [agent:${r}] [${n}] ${o}`;e==="warn"?this.callbacks.log?.warn(i):this.callbacks.log?.info(i)}async spawn(e){if(this.processes.has(e.memberId))throw new Error(`Agent process "${e.memberId}" already spawned`);let r=this.callbacks.log,n=gM(e),o={memberId:e.memberId,name:e.name,pid:-1,cwd:e.cwd,state:"starting",startedAt:Date.now()};if(e.external)return this.spawnAcpAgentWithRetry(e,o,n);let s=[this.cliBinaryPath];e.verbose&&s.push("--verbose"),this.slog("info",e.memberId,"spawn",`spawning ${e.name} in ${e.cwd}`);let i=Dl(process.execPath,s,{cwd:e.cwd,env:n,stdio:["pipe","pipe","pipe"],detached:!1});o.pid=i.pid??-1;let a=new Map;this.processes.set(e.memberId,{handle:o,child:i,pendingRpc:a}),Ts({input:i.stdout,crlfDelay:Number.POSITIVE_INFINITY}).on("line",l=>{let d=l.trim();if(d)try{let p=JSON.parse(d);if("id"in p&&typeof p.id=="number"){let u=a.get(p.id);if(u){clearTimeout(u.timer),a.delete(p.id);let m=p;m.error?u.reject(new Error(m.error.message)):u.resolve(m.result)}}if("method"in p&&!("id"in p)){let u=p;this.captureChildProgress(e.memberId,u.method,u.params),this.callbacks.onNotification?.(e.memberId,u.method,u.params)}}catch{this.slog("warn",e.memberId,"parse",`invalid JSON: ${d.slice(0,200)}`)}}),i.stderr&&Ts({input:i.stderr,crlfDelay:Number.POSITIVE_INFINITY}).on("line",d=>{this.callbacks.log?.debug?.(`[${new Date().toISOString()}] [debug] [agent:${e.memberId}] [stderr] ${d}`)}),i.on("exit",(l,d)=>{o.state!=="killed"&&(o.state=l===0?"completed":"failed"),o.endedAt=Date.now(),l!==0&&!o.error&&(o.error=`Process exited with code ${l} (signal: ${d})`);for(let[u,m]of a)clearTimeout(m.timer),m.reject(new Error(`Agent process exited (code=${l})`)),a.delete(u);this.callbacks.onStateChange?.(e.memberId,o.state),this.callbacks.onExit?.(e.memberId,l,d),this.slog("info",e.memberId,"exit",`exited (code=${l}, signal=${d})`)}),i.on("error",l=>{o.state="failed",o.error=l.message,o.endedAt=Date.now(),this.callbacks.onStateChange?.(e.memberId,"failed"),this.slog("warn",e.memberId,"error",l.message)}),this.callbacks.onStateChange?.(e.memberId,"starting");try{let l=await this.sendRpc(e.memberId,"initialize",{protocolVersion:"1.0",clientInfo:{name:"qlogicagent-team-leader",version:"1.0.0"}},15e3);o.state="ready",this.callbacks.onStateChange?.(e.memberId,"ready"),this.slog("info",e.memberId,"handshake",`initialized (pid=${o.pid})`);let d=l;d&&typeof d.sessionId=="string"&&(o.sessionId=d.sessionId)}catch(l){throw o.state="failed",o.error=`Initialize handshake failed: ${l instanceof Error?l.message:String(l)}`,o.endedAt=Date.now(),this.callbacks.onStateChange?.(e.memberId,"failed"),this.kill(e.memberId),new Error(o.error)}return o}async sendTask(e,r,n){let o=this.processes.get(e);if(!o)throw new Error(`No agent process: ${e}`);o.handle.state="running",this.callbacks.onStateChange?.(e,"running");try{let s;if(o.acpAdapter){let i=o.handle.sessionId??"default",a=await o.acpAdapter.sendPrompt(o.child,i,r,n?.timeout??3e5),c=o.handle.resultText??"";a.usage&&o.usageTracker&&o.usageTracker.onPromptResponseUsage(a.usage),s={content:c,stopReason:a.stopReason}}else{let i={content:r};n?.model&&(i.model=n.model),n?.apiKey&&(i.apiKey=n.apiKey),n?.baseUrl&&(i.baseUrl=n.baseUrl),n?.sessionId&&(i.sessionId=n.sessionId),s=await this.sendRpc(e,"thread.turn",i,n?.timeout??3e5);let a=s;a&&typeof a.content=="string"&&(o.handle.resultText=a.content)}return o.handle.state="completed",o.handle.endedAt=Date.now(),this.callbacks.onStateChange?.(e,"completed"),s}catch(s){throw o.handle.state="failed",o.handle.error=s instanceof Error?s.message:String(s),o.handle.endedAt=Date.now(),this.callbacks.onStateChange?.(e,"failed"),s}}async sendRpc(e,r,n,o=3e4){let s=this.processes.get(e);if(!s)throw new Error(`No agent process: ${e}`);let i=pM(r,n);return new Promise((a,c)=>{let l=setTimeout(()=>{s.pendingRpc.delete(i.id),c(new Error(`RPC timeout: ${r} (${o}ms)`))},o);s.pendingRpc.set(i.id,{resolve:a,reject:c,timer:l});try{s.child.stdin.write(`${JSON.stringify(i)}
|
|
@@ -201,14 +201,14 @@ ${T}`})}}this.hooks.invoke("memory.after_recall",{sessionId:e.sessionId,turnId:n
|
|
|
201
201
|
`;try{n.write(s)}catch{}}}async attemptRuntimeRestart(e,r,n){let o=this.callbacks.log,s=this.processes.get(e.memberId),i=s?.ipcServer,a=s?.ipcPath,c=s?.stderrStream;this.processes.delete(e.memberId);try{let l={memberId:e.memberId,name:e.name,pid:-1,cwd:e.cwd,state:"starting",startedAt:Date.now()},d=e.external,p=[...d.acpArgs];a&&(r.QLOGICAGENT_PARENT_RPC=a);let u=Dl(d.cliPath,p,{cwd:e.cwd,env:r,stdio:["pipe","pipe","pipe"],detached:!1});l.pid=u.pid??-1;let m=new Map,f=new Cr,g=new Qn;this.processes.set(e.memberId,{handle:l,child:u,pendingRpc:m,acpAdapter:f,usageTracker:g,ipcServer:i,ipcPath:a,stderrStream:c,runtimeRestartCount:n}),f.attach(u,(v,R)=>{v==="usage_update"&&g.onUsageUpdate(R);let S=Cr.translateNotification(v,R);S?(this.captureChildProgress(e.memberId,S.method,S.params),this.callbacks.onNotification?.(e.memberId,S.method,S.params)):(this.captureChildProgress(e.memberId,v,R),this.callbacks.onNotification?.(e.memberId,v,R))}),u.stderr&&Ts({input:u.stderr,crlfDelay:Number.POSITIVE_INFINITY}).on("line",R=>{this.callbacks.log?.debug?.(`[${new Date().toISOString()}] [debug] [agent:${e.memberId}] [stderr] ${R}`),c?.write(`${new Date().toISOString()} ${R}
|
|
202
202
|
`)}),u.on("exit",(v,R)=>{f.detach();let S=l.state;if(S!=="killed"&&S!=="completed"&&v!==0){let C=this.processes.get(e.memberId)?.runtimeRestartCount??n;if(C<cn){let E=lf*2**C;this.slog("warn",e.memberId,"crash",`crashed again (code=${v}), restart ${C+1}/${cn}`),this.callbacks.onNotification?.(e.memberId,"agents.error",{agentId:e.memberId,phase:"runtime",error:`Process crashed (code=${v}), restarting`,retriesLeft:cn-C-1}),setTimeout(()=>{this.attemptRuntimeRestart(e,r,C+1).catch(M=>{this.slog("warn",e.memberId,"restart",`failed: ${M instanceof Error?M.message:String(M)}`)})},E);return}}S!=="killed"&&(l.state=v===0?"completed":"failed"),l.endedAt=Date.now(),v!==0&&!l.error&&(l.error=`ACP process exited with code ${v} (signal: ${R})`),this.callbacks.onStateChange?.(e.memberId,l.state),this.callbacks.onExit?.(e.memberId,v,R)}),u.on("error",v=>{f.detach(),l.state="failed",l.error=v.message,l.endedAt=Date.now(),this.callbacks.onStateChange?.(e.memberId,"failed")}),this.callbacks.onStateChange?.(e.memberId,"starting");let h=await f.initialize(u);l.state="ready",l.supportsResume=h.agentCapabilities.loadSession===!0,this.callbacks.onStateChange?.(e.memberId,"ready"),this.slog("info",e.memberId,"restart",`ACP restarted (attempt=${n}, protocol=${h.protocolVersion}, loadSession=${l.supportsResume}, pid=${l.pid})`);let b=[...e.mcpServers??[]];a&&b.push({name:"qlogicagent-tools",command:process.execPath,args:[this.mcpBridgeScriptPath],env:{QLOGICAGENT_PARENT_RPC:a,QLOGICAGENT_SESSION_ID:e.memberId}});try{if(l.supportsResume&&l.sessionId){let v=await f.resumeSession(u,l.sessionId,{cwd:e.cwd,mcpServers:b.length>0?b:void 0});l.sessionId=v.sessionId,this.slog("info",e.memberId,"session",`session resumed (id=${l.sessionId})`)}else{let v={cwd:e.cwd};b.length>0&&(v.mcpServers=b),e.systemPrompt&&(v.systemPrompt=e.systemPrompt);let R=await f.createSession(u,v);l.sessionId=R.sessionId,this.slog("info",e.memberId,"session",`new session on restart (id=${l.sessionId})`)}}catch{this.slog("warn",e.memberId,"session","session re-creation failed on restart")}this.startHeartbeat(e.memberId,v=>{this.slog("warn",v,"heartbeat","hang detected \u2014 force-killing"),this.callbacks.onNotification?.(v,"agents.error",{agentId:v,phase:"heartbeat",error:`Agent ${e.name} stopped responding`,retriesLeft:0}),this.kill(v)})}catch(l){let d=this.processes.get(e.memberId);d&&(d.handle.state="failed",d.handle.error=`Runtime restart failed: ${l instanceof Error?l.message:String(l)}`,d.handle.endedAt=Date.now()),this.callbacks.onStateChange?.(e.memberId,"failed"),this.callbacks.onNotification?.(e.memberId,"agents.error",{agentId:e.memberId,phase:"runtime",error:`Restart failed after ${n} attempts: ${l instanceof Error?l.message:String(l)}`,retriesLeft:0})}}getMcpIpcPath(e){return this.processes.get(e)?.ipcPath}heartbeatTimers=new Map;missedBeats=new Map;static HEARTBEAT_INTERVAL=3e4;static MAX_MISSED_BEATS=3;startHeartbeat(e,r){this.stopHeartbeat(e),this.missedBeats.set(e,0);let n=setInterval(async()=>{let o=this.processes.get(e);if(!o||o.handle.state==="completed"||o.handle.state==="failed"||o.handle.state==="killed"){this.stopHeartbeat(e);return}if(await this.ping(e,1e4)){this.missedBeats.set(e,0);return}let i=(this.missedBeats.get(e)??0)+1;this.missedBeats.set(e,i),this.slog("warn",e,"heartbeat",`missed (${i}/${t.MAX_MISSED_BEATS})`),i>=t.MAX_MISSED_BEATS&&(this.slog("warn",e,"heartbeat","hang detected, force-killing"),this.stopHeartbeat(e),o.handle.error=`Hang detected: ${i} consecutive heartbeat failures`,this.kill(e),r?.(e))},t.HEARTBEAT_INTERVAL);this.heartbeatTimers.set(e,n)}stopHeartbeat(e){let r=this.heartbeatTimers.get(e);r&&(clearInterval(r),this.heartbeatTimers.delete(e)),this.missedBeats.delete(e)}getMissedBeats(e){return this.missedBeats.get(e)??0}activeCount(){return[...this.processes.values()].filter(e=>e.handle.state==="starting"||e.handle.state==="ready"||e.handle.state==="running").length}remove(e){let r=this.processes.get(e);r&&(this.stopHeartbeat(e),(r.handle.state==="running"||r.handle.state==="starting"||r.handle.state==="ready")&&this.kill(e),this.processes.delete(e))}dispose(){for(let e of this.heartbeatTimers.keys())this.stopHeartbeat(e);for(let e of this.processes.values()){try{e.ipcServer?.close()}catch{}try{e.stderrStream?.end()}catch{}}this.killAll(),this.processes.clear()}};async function uf(t){try{let e=t.params,r=await this.ensureAgentConfigStore();this.acpDetector.setConfigStore(r.getData());let n=this.acpDetector.scan(e?.force);t.id!==void 0&&this.sendResponse(t.id,n)}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function pf(t){try{let e=await this.ensureAgentConfigStore();this.acpDetector.setConfigStore(e.getData());let r=this.acpDetector.list();t.id!==void 0&&this.sendResponse(t.id,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 mf(t){try{let e=t.params;if(!e?.action||!e?.agent){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"action and agent are required."});return}let r=await this.ensureAgentConfigStore();switch(e.action){case"register":r.registerCustomAgent(e.agent);break;case"unregister":r.unregisterCustomAgent(e.agent.id);break;case"update":r.registerCustomAgent(e.agent);break}this.acpDetector.setConfigStore(r.getData()),this.acpDetector.clearCache(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function gf(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(),{agentId:n,...o}=e;await r.setAgentConfig(n,o),this.acpDetector.setConfigStore(r.getData()),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function ff(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 n=(await this.ensureAgentConfigStore()).getAgentConfig(e.agentId);t.id!==void 0&&this.sendResponse(t.id,n)}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function hf(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();await r.removeAgentConfig(e.agentId),this.acpDetector.setConfigStore(r.getData()),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function yf(t){try{let e=t.params;if(!e?.url){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"url is required."});return}await(await this.ensureAgentConfigStore()).setGatewayUrl(e.url),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function vf(t){try{let r=(await this.ensureAgentConfigStore()).getGatewayUrl();t.id!==void 0&&this.sendResponse(t.id,{url: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 bf(t){try{let r=(await this.ensureAgentConfigStore()).getData(),n=Object.entries(r.agents).map(([o,s])=>({agentId:o,hasApiKey:!!s.apiKey,hasBaseUrl:!!s.baseUrl,hasModel:!!s.model}));t.id!==void 0&&this.sendResponse(t.id,n)}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}function kf(t){try{let e=[],r=(n,o)=>{if(n)for(let s of n.getAllHandles())e.push({memberId:s.memberId,name:s.name,pid:s.pid,state:s.state,startedAt:s.startedAt,endedAt:s.endedAt,source:o})};r(this.soloProcessManager,"solo"),r(this.productProcessManager,"product"),t.id!==void 0&&this.sendResponse(t.id,e)}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}function Rf(t){try{let e=t.params;if(!e?.memberId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"memberId is required."});return}let r=!1;for(let n of[this.soloProcessManager,this.productProcessManager])if(n?.getHandle(e.memberId)){n.kill(e.memberId),r=!0;break}t.id!==void 0&&this.sendResponse(t.id,{ok: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 Sf(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=ws.join(X(),"agent-logs"),n=ws.join(r,`${e.agentId}.stderr.log`),o="";try{o=df.readFileSync(n,"utf-8")}catch{}e.tail&&e.tail>0&&o&&(o=o.split(`
|
|
203
203
|
`).slice(-e.tail).join(`
|
|
204
|
-
`)),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 Tf(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 wf(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}-${yM().slice(0,8)}`;let d=[];e=new dt({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:ws.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 Fl}from"node:crypto";import{mkdir as AM,readFile as xM,writeFile as CM}from"node:fs/promises";import{dirname as IM}from"node:path";var vM=[{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 Ll(){return vM.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 Pf,readdirSync as bM,readFileSync as kM}from"node:fs";import{join as RM}from"node:path";var no=new Map,Af=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=SM(t,i,n);if(!c)continue;let l=wM(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(If)}function jl(t){let e=Af.get(t)??new Set,r=new Set;if(Pf(t)){let n;try{n=bM(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=RM(t,s,"assistants.json");if(Pf(i)){r.add(s);try{ro(s,i,Ul(kM(i,"utf8")))}catch{ro(s,i,null)}}}}for(let n of e)r.has(n)||$l(n);Af.set(t,r)}function $l(t){no.delete(t)}function xf(){return Array.from(no.values()).flatMap(t=>t.assistants.map(If))}function Cf(){return Array.from(no.values()).flatMap(t=>t.diagnostics.map(e=>({...e})))}function SM(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=TM(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:Ol(r,o,"enabledSkills",n.enabledSkills),disabledBuiltinSkills:Ol(r,o,"disabledBuiltinSkills",n.disabledBuiltinSkills),context:typeof n.context=="string"?n.context:void 0,prompts:i,modelHints:Ol(r,o,"modelHints",n.modelHints??n.models),readonly:!0}}function Ul(t){return JSON.parse(t.replace(/^\uFEFF/,""))}function TM(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 Ol(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 wM(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 PM(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 If(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(PM)}}var EM=2e4;async function oo(){let t=Nn();try{let e=JSON.parse(await xM(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 MM(){return(await oo()).assistants??[]}async function Hl(t){let e=Nn();await AM(IM(e),{recursive:!0}),await CM(e,`${JSON.stringify({version:1,assistants:t.assistants??[],stateOverrides:t.stateOverrides??{}},null,2)}
|
|
205
|
-
`,"utf-8")}function Ef(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 Ps(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 _M(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>EM)throw new Error("Prompt template prompt is too long.");return Ef({...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 DM(t){let e=t.id?.trim()||`user.${Fl()}`;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:Ps(t.enabledSkills,"enabledSkills"),disabledBuiltinSkills:Ps(t.disabledBuiltinSkills,"disabledBuiltinSkills"),context:t.context,prompts:t.prompts.map(_M),modelHints:Ps(t.modelHints,"modelHints"),readonly:!1}}function NM(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=Ps(t.modelHints,"modelHints")),e}function Mf(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={}){jl(Xo());for(let i of t.pluginManifestDirectories??[])jl(i);let e=await oo(),r=Ll(),n=xf(),o=e.assistants??[],s=e.stateOverrides??{};return[...r,...n,...o].map(i=>Mf(i,s[i.id])).sort((i,a)=>(i.sortOrder??0)-(a.sortOrder??0))}function _f(){return Cf()}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(Ef)}}async function so(t){let e=DM(t),r=await oo(),n=(r.assistants??[]).filter(o=>o.id!==e.id);return n.push(e),await Hl({...r,assistants:n}),e}async function Df(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.${Fl()}`})}async function Bl(t){let e=t.id?.trim();if(!e||!e.startsWith("user."))throw new Error("Cannot update non-user assistant.");if(!(await MM()).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 Nf(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 Hl({...e,assistants:r})}async function Lf(t,e){let r=(await Ir()).find(i=>i.id===t);if(!r)throw new Error(`Unknown assistant preset: ${t}`);let n=NM(e);if(r.source==="user")return Bl({...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 Hl({...o,stateOverrides:s}),Mf(r,s[t])}async function Of(t){let e=Ll().find(n=>n.id===t&&n.source==="builtin");if(!e)throw new Error(`Unknown builtin assistant preset: ${t}`);let r=Fl().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 ql(t){if(t.id===void 0)return;let e=this.getActiveProjectRoot?.(),r=e?[Yo(e)]:[];this.sendResponse(t.id,{assistants:await Ir({pluginManifestDirectories:r}),diagnostics:_f()})}async function Wl(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 Gl(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 Of(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 so(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).assistant;if(!e||typeof e!="object"){Be(this,t.id,"Missing required param: assistant");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 Vl(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 Bl(e)})}catch(r){Be(this,t.id,r instanceof Error?r.message:String(r))}}async function Xl(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 Lf(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 Yl(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 Nf(e),this.sendResponse(t.id,{ok:!0})}catch(r){Be(this,t.id,r instanceof Error?r.message:String(r))}}G();import*as un from"node:fs/promises";import*as Ih from"node:path";He();var LM=/^[a-z0-9][a-z0-9_.:-]{0,79}$/i,OM=new Set(["journeyDay","count"]),jM=new Set(["blocked"]),$M=new Set(["R0","R1","R2","R3"]),UM=new Set(["aix","android","darwin","freebsd","ios","linux","openbsd","sunos","win32"]),FM={"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 xs(t,e){if(!e||typeof e!="object"||Array.isArray(e))return;let r=FM[t],n={};for(let[o,s]of Object.entries(e)){if(!r.has(o))continue;let i=HM(o,s);i!==void 0&&(n[o]=i)}return Object.keys(n).length>0?n:void 0}function HM(t,e){if(OM.has(t))return typeof e=="number"&&Number.isInteger(e)&&e>=0&&e<=1e5?e:void 0;if(jM.has(t))return typeof e=="boolean"?e:void 0;if(t==="riskTier")return typeof e=="string"&&$M.has(e)?e:void 0;if(t==="platform")return typeof e=="string"&&UM.has(e)?e:void 0;if(typeof e!="string")return;let r=e.trim();return LM.test(r)?r:void 0}function BM(t){let e=WM(t.baseUrl),r=t.fetchFn??fetch,n=t.token.trim();return{async getConsent(){return $f(r,e,n,"GET")},async setConsent(o){return $f(r,e,n,"PUT",o)},async matchRegistry(o){let s=o.intent.trim();if(!s)throw new Error("intent is required.");let i=KM(o.topK),a=await Pt(r,ut(t.baseUrl,"/api/v15/registry/match"),n,"POST",{intent:s,topK:i,prefer:o.preferOfficial===!1?"relevance":"official",canonicalOnly:!0});return(pt(a)&&Array.isArray(a.matches)?a.matches:[]).map(zM).filter(l=>!!l).slice(0,i)},async publishSkill(o){return jf(r,t.baseUrl,n,"skill",o)},async publishPet(o){return jf(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 Pt(r,ut(t.baseUrl,`/api/v15/registry/resources/${s}/signal`),n,"POST",{event:o.event,attribution:o.attribution?.trim()||void 0,metadata:o.metadata});if(pt(i)&&i.accepted===!0)return{accepted:!0};throw new Error("Community hub returned an invalid signal response.")},async recordTelemetry(o){let s=xs(o.event,o.metadata),i=await Pt(r,ut(t.baseUrl,"/api/v15/registry/telemetry"),n,"POST",{event:o.event,metadata:s});if(pt(i)&&i.accepted===!0)return{accepted:!0};throw new Error("Community hub returned an invalid telemetry response.")},async listSharedResources(){let o=await Pt(r,ut(t.baseUrl,"/api/v15/registry/mine"),n,"GET");return(pt(o)&&Array.isArray(o.resources)?o.resources:[]).map(Cs).filter(i=>!!i)},async withdrawSharedResource(o,s){let i=encodeURIComponent(o.trim());if(!i)throw new Error("resourceId is required.");let a=await Pt(r,ut(t.baseUrl,`/api/v15/registry/resources/${i}/withdraw`),n,"POST",{reason:s?.trim()||void 0}),c=Cs(a);if(!c)throw new Error("Community hub returned an invalid resource.");return c},async withdrawSharedResources(o){let s=await Pt(r,ut(t.baseUrl,"/api/v15/registry/community-consent/withdraw-shared"),n,"POST",{reason:o?.trim()||void 0});return(pt(s)&&Array.isArray(s.resources)?s.resources:[]).map(Cs).filter(a=>!!a)},async listNotices(o={}){let s=o.includeRead?"?includeRead=true":"",i=await Pt(r,ut(t.baseUrl,`/api/v15/registry/notices${s}`),n,"GET");return(pt(i)&&Array.isArray(i.notices)?i.notices:[]).map(Uf).filter(c=>!!c)},async markNoticeRead(o){if(!Number.isSafeInteger(o)||o<1)throw new Error("noticeId is required.");let s=await Pt(r,ut(t.baseUrl,`/api/v15/registry/notices/${o}/read`),n,"POST"),i=Uf(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 Pt(r,ut(t.baseUrl,`/api/v15/registry/resources/${i}/install${c}`),n,"GET"),d=Bf(l);if(!d)throw new Error("Community hub returned an invalid install resolution.");return d}}}async function jf(t,e,r,n,o){let s=Cs(await Pt(t,ut(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=VM(await GM(t,ut(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 Ot(t=kr()){let e=t.get("QLOGIC_LLMROUTER_ACCESS_TOKEN")?.trim();if(!e)return null;let r=qM(t);return r?BM({baseUrl:r,token:e}):null}function qM(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 WM(t){return ut(t,"/api/v15/registry/community-consent")}function ut(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 $f(t,e,r,n,o){return At(await Pt(t,e,r,n,o),!0)}async function Pt(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 GM(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=pt(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 pt(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function Cs(t){return!pt(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 KM(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 zM(t){if(!pt(t)||t.canonical!==!0&&t.isCanonical!==!0)return null;let e=Ff(t.sourceTier),r=Hf(t.trustStage),n=Is(t.resourceRiskTier),o=Is(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:Jl(t.title,80),summary:Jl(typeof t.summary=="string"?t.summary:"",160),capabilityTags:s.filter(i=>typeof i=="string"&&i.trim().length>0).slice(0,6).map(i=>Jl(i,32)),sourceTier:e,trustStage:r,resourceRiskTier:n,effectiveRiskTier:o,latestVersion:typeof t.latestVersion=="string"?t.latestVersion:null,canonical:!0}}function Jl(t,e){let r=t.replace(/\s+/g," ").trim();return r.length<=e?r:`${r.slice(0,Math.max(0,e-1))}\u2026`}function VM(t){return!pt(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 Uf(t){return!pt(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 XM=new Set(["R0","R1","R2","R3"]),YM=new Set(["official","community"]),JM=new Set(["quarantine","trial","trusted"]),QM=new Set(["pending","approved","rejected"]);function Is(t){return typeof t=="string"&&XM.has(t)?t:null}function Ff(t){return typeof t=="string"&&YM.has(t)?t:null}function Hf(t){return typeof t=="string"&&JM.has(t)?t:null}function ZM(t){return typeof t=="string"&&QM.has(t)?t:null}function Bf(t){if(!pt(t))return null;let e=Ff(t.sourceTier),r=Hf(t.trustStage),n=ZM(t.reviewStatus),o=Is(t.resourceRiskTier),s=Is(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(Bf);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 e_=/(?:[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}|[A-Za-z]:\\|\/Users\/|\/home\/|secret|token|password|\+?\d[\d\s().-]{7,}\d)/i,t_=/\b(?:agent|tool|shell|execute|permission|memory|system prompt|developer message)\b/i;function r_(t){return n_(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 qf(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=r_(e);return t.publishPet({id:e.id,title:e.name,summary:e.summary,visibility:e.visibility??"public",tags:e.tags??[],manifest:n.manifest})}function n_(t){let e=[t.id,t.name,t.summary,t.persona,...t.traits??[],...t.tags??[]].join(`
|
|
204
|
+
`)),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 Tf(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 wf(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}-${yM().slice(0,8)}`;let d=[];e=new dt({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:ws.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 Fl}from"node:crypto";import{mkdir as PM,readFile as xM,writeFile as CM}from"node:fs/promises";import{dirname as IM}from"node:path";var vM=[{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 Ll(){return vM.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 Af,readdirSync as bM,readFileSync as kM}from"node:fs";import{join as RM}from"node:path";var no=new Map,Pf=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=SM(t,i,n);if(!c)continue;let l=wM(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(If)}function jl(t){let e=Pf.get(t)??new Set,r=new Set;if(Af(t)){let n;try{n=bM(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=RM(t,s,"assistants.json");if(Af(i)){r.add(s);try{ro(s,i,Ul(kM(i,"utf8")))}catch{ro(s,i,null)}}}}for(let n of e)r.has(n)||$l(n);Pf.set(t,r)}function $l(t){no.delete(t)}function xf(){return Array.from(no.values()).flatMap(t=>t.assistants.map(If))}function Cf(){return Array.from(no.values()).flatMap(t=>t.diagnostics.map(e=>({...e})))}function SM(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=TM(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:Ol(r,o,"enabledSkills",n.enabledSkills),disabledBuiltinSkills:Ol(r,o,"disabledBuiltinSkills",n.disabledBuiltinSkills),context:typeof n.context=="string"?n.context:void 0,prompts:i,modelHints:Ol(r,o,"modelHints",n.modelHints??n.models),readonly:!0}}function Ul(t){return JSON.parse(t.replace(/^\uFEFF/,""))}function TM(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 Ol(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 wM(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 AM(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 If(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(AM)}}var EM=2e4;async function oo(){let t=Nn();try{let e=JSON.parse(await xM(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 MM(){return(await oo()).assistants??[]}async function Hl(t){let e=Nn();await PM(IM(e),{recursive:!0}),await CM(e,`${JSON.stringify({version:1,assistants:t.assistants??[],stateOverrides:t.stateOverrides??{}},null,2)}
|
|
205
|
+
`,"utf-8")}function Ef(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 As(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 _M(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>EM)throw new Error("Prompt template prompt is too long.");return Ef({...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 DM(t){let e=t.id?.trim()||`user.${Fl()}`;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:As(t.enabledSkills,"enabledSkills"),disabledBuiltinSkills:As(t.disabledBuiltinSkills,"disabledBuiltinSkills"),context:t.context,prompts:t.prompts.map(_M),modelHints:As(t.modelHints,"modelHints"),readonly:!1}}function NM(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=As(t.modelHints,"modelHints")),e}function Mf(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={}){jl(Xo());for(let i of t.pluginManifestDirectories??[])jl(i);let e=await oo(),r=Ll(),n=xf(),o=e.assistants??[],s=e.stateOverrides??{};return[...r,...n,...o].map(i=>Mf(i,s[i.id])).sort((i,a)=>(i.sortOrder??0)-(a.sortOrder??0))}function _f(){return Cf()}async function Ps(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(Ef)}}async function so(t){let e=DM(t),r=await oo(),n=(r.assistants??[]).filter(o=>o.id!==e.id);return n.push(e),await Hl({...r,assistants:n}),e}async function Df(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.${Fl()}`})}async function Bl(t){let e=t.id?.trim();if(!e||!e.startsWith("user."))throw new Error("Cannot update non-user assistant.");if(!(await MM()).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 Nf(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 Hl({...e,assistants:r})}async function Lf(t,e){let r=(await Ir()).find(i=>i.id===t);if(!r)throw new Error(`Unknown assistant preset: ${t}`);let n=NM(e);if(r.source==="user")return Bl({...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 Hl({...o,stateOverrides:s}),Mf(r,s[t])}async function Of(t){let e=Ll().find(n=>n.id===t&&n.source==="builtin");if(!e)throw new Error(`Unknown builtin assistant preset: ${t}`);let r=Fl().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 ql(t){if(t.id===void 0)return;let e=this.getActiveProjectRoot?.(),r=e?[Yo(e)]:[];this.sendResponse(t.id,{assistants:await Ir({pluginManifestDirectories:r}),diagnostics:_f()})}async function Wl(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 Ps(r))}catch(n){Be(this,t.id,n instanceof Error?n.message:String(n))}}async function Gl(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 Of(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 so(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).assistant;if(!e||typeof e!="object"){Be(this,t.id,"Missing required param: assistant");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 Vl(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 Bl(e)})}catch(r){Be(this,t.id,r instanceof Error?r.message:String(r))}}async function Xl(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 Lf(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 Yl(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 Nf(e),this.sendResponse(t.id,{ok:!0})}catch(r){Be(this,t.id,r instanceof Error?r.message:String(r))}}G();import*as un from"node:fs/promises";import*as Ih from"node:path";He();var LM=/^[a-z0-9][a-z0-9_.:-]{0,79}$/i,OM=new Set(["journeyDay","count"]),jM=new Set(["blocked"]),$M=new Set(["R0","R1","R2","R3"]),UM=new Set(["aix","android","darwin","freebsd","ios","linux","openbsd","sunos","win32"]),FM={"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 xs(t,e){if(!e||typeof e!="object"||Array.isArray(e))return;let r=FM[t],n={};for(let[o,s]of Object.entries(e)){if(!r.has(o))continue;let i=HM(o,s);i!==void 0&&(n[o]=i)}return Object.keys(n).length>0?n:void 0}function HM(t,e){if(OM.has(t))return typeof e=="number"&&Number.isInteger(e)&&e>=0&&e<=1e5?e:void 0;if(jM.has(t))return typeof e=="boolean"?e:void 0;if(t==="riskTier")return typeof e=="string"&&$M.has(e)?e:void 0;if(t==="platform")return typeof e=="string"&&UM.has(e)?e:void 0;if(typeof e!="string")return;let r=e.trim();return LM.test(r)?r:void 0}function BM(t){let e=WM(t.baseUrl),r=t.fetchFn??fetch,n=t.token.trim();return{async getConsent(){return $f(r,e,n,"GET")},async setConsent(o){return $f(r,e,n,"PUT",o)},async matchRegistry(o){let s=o.intent.trim();if(!s)throw new Error("intent is required.");let i=KM(o.topK),a=await At(r,ut(t.baseUrl,"/api/v15/registry/match"),n,"POST",{intent:s,topK:i,prefer:o.preferOfficial===!1?"relevance":"official",canonicalOnly:!0});return(pt(a)&&Array.isArray(a.matches)?a.matches:[]).map(zM).filter(l=>!!l).slice(0,i)},async publishSkill(o){return jf(r,t.baseUrl,n,"skill",o)},async publishPet(o){return jf(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 At(r,ut(t.baseUrl,`/api/v15/registry/resources/${s}/signal`),n,"POST",{event:o.event,attribution:o.attribution?.trim()||void 0,metadata:o.metadata});if(pt(i)&&i.accepted===!0)return{accepted:!0};throw new Error("Community hub returned an invalid signal response.")},async recordTelemetry(o){let s=xs(o.event,o.metadata),i=await At(r,ut(t.baseUrl,"/api/v15/registry/telemetry"),n,"POST",{event:o.event,metadata:s});if(pt(i)&&i.accepted===!0)return{accepted:!0};throw new Error("Community hub returned an invalid telemetry response.")},async listSharedResources(){let o=await At(r,ut(t.baseUrl,"/api/v15/registry/mine"),n,"GET");return(pt(o)&&Array.isArray(o.resources)?o.resources:[]).map(Cs).filter(i=>!!i)},async withdrawSharedResource(o,s){let i=encodeURIComponent(o.trim());if(!i)throw new Error("resourceId is required.");let a=await At(r,ut(t.baseUrl,`/api/v15/registry/resources/${i}/withdraw`),n,"POST",{reason:s?.trim()||void 0}),c=Cs(a);if(!c)throw new Error("Community hub returned an invalid resource.");return c},async withdrawSharedResources(o){let s=await At(r,ut(t.baseUrl,"/api/v15/registry/community-consent/withdraw-shared"),n,"POST",{reason:o?.trim()||void 0});return(pt(s)&&Array.isArray(s.resources)?s.resources:[]).map(Cs).filter(a=>!!a)},async listNotices(o={}){let s=o.includeRead?"?includeRead=true":"",i=await At(r,ut(t.baseUrl,`/api/v15/registry/notices${s}`),n,"GET");return(pt(i)&&Array.isArray(i.notices)?i.notices:[]).map(Uf).filter(c=>!!c)},async markNoticeRead(o){if(!Number.isSafeInteger(o)||o<1)throw new Error("noticeId is required.");let s=await At(r,ut(t.baseUrl,`/api/v15/registry/notices/${o}/read`),n,"POST"),i=Uf(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 At(r,ut(t.baseUrl,`/api/v15/registry/resources/${i}/install${c}`),n,"GET"),d=Bf(l);if(!d)throw new Error("Community hub returned an invalid install resolution.");return d}}}async function jf(t,e,r,n,o){let s=Cs(await At(t,ut(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=VM(await GM(t,ut(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 Ot(t=kr()){let e=t.get("QLOGIC_LLMROUTER_ACCESS_TOKEN")?.trim();if(!e)return null;let r=qM(t);return r?BM({baseUrl:r,token:e}):null}function qM(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 WM(t){return ut(t,"/api/v15/registry/community-consent")}function ut(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 $f(t,e,r,n,o){return Pt(await At(t,e,r,n,o),!0)}async function At(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 GM(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 Pt(t,e){let r=pt(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 pt(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function Cs(t){return!pt(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 KM(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 zM(t){if(!pt(t)||t.canonical!==!0&&t.isCanonical!==!0)return null;let e=Ff(t.sourceTier),r=Hf(t.trustStage),n=Is(t.resourceRiskTier),o=Is(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:Jl(t.title,80),summary:Jl(typeof t.summary=="string"?t.summary:"",160),capabilityTags:s.filter(i=>typeof i=="string"&&i.trim().length>0).slice(0,6).map(i=>Jl(i,32)),sourceTier:e,trustStage:r,resourceRiskTier:n,effectiveRiskTier:o,latestVersion:typeof t.latestVersion=="string"?t.latestVersion:null,canonical:!0}}function Jl(t,e){let r=t.replace(/\s+/g," ").trim();return r.length<=e?r:`${r.slice(0,Math.max(0,e-1))}\u2026`}function VM(t){return!pt(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 Uf(t){return!pt(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 XM=new Set(["R0","R1","R2","R3"]),YM=new Set(["official","community"]),JM=new Set(["quarantine","trial","trusted"]),QM=new Set(["pending","approved","rejected"]);function Is(t){return typeof t=="string"&&XM.has(t)?t:null}function Ff(t){return typeof t=="string"&&YM.has(t)?t:null}function Hf(t){return typeof t=="string"&&JM.has(t)?t:null}function ZM(t){return typeof t=="string"&&QM.has(t)?t:null}function Bf(t){if(!pt(t))return null;let e=Ff(t.sourceTier),r=Hf(t.trustStage),n=ZM(t.reviewStatus),o=Is(t.resourceRiskTier),s=Is(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(Bf);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 e_=/(?:[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}|[A-Za-z]:\\|\/Users\/|\/home\/|secret|token|password|\+?\d[\d\s().-]{7,}\d)/i,t_=/\b(?:agent|tool|shell|execute|permission|memory|system prompt|developer message)\b/i;function r_(t){return n_(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 qf(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=r_(e);return t.publishPet({id:e.id,title:e.name,summary:e.summary,visibility:e.visibility??"public",tags:e.tags??[],manifest:n.manifest})}function n_(t){let e=[t.id,t.name,t.summary,t.persona,...t.traits??[],...t.tags??[]].join(`
|
|
206
206
|
`);if(e_.test(e))throw new Error("Pet asset publish blocked: private email, path, secret, token, or phone-like text detected.");if(t_.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 _s from"node:fs/promises";import*as ln from"node:path";import{createHash as ed}from"node:crypto";import io from"node:fs";import Wf from"node:path";var o_=new Set(["abilities","agentCapabilities","agentInstructions","capabilities","memoryPolicy","permissions","planningPolicy","retrievalPolicy","retrievalRanking","retrievalSort","safetyPolicy","securityPolicy","skillPolicy","systemMessages","systemPrompt","taskPlanner","taskPlanning","tools"]),s_="\u963F\u84DD",i_="\u4E2A\u6027\u5316\u4F19\u4F34",a_="\u53EA\u8D1F\u8D23\u966A\u4F34\u3001\u8BED\u6C14\u5305\u88C5\u4E0E\u5C55\u793A\u8868\u8FBE\u3002",c_="\u6211\u5728\u8FD9\u91CC\u3002",l_=[/\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],d_=["common","uncommon","rare","epic","legendary"],Gf=[50,25,15,8,2],Zl=[{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 u_(t){return Zl.find(e=>e.id===t)}function p_(t,e,r){let n=u_(r);if(n)return n;let o=Zl.filter(a=>a.rarity===e);if(o.length===0)return Zl[0];let i=ed("sha256").update(`breed-${t}`).digest()[0]%o.length;return o[i]}function m_(t){let r=ed("sha256").update(t).digest()[0]%100,n=0;for(let o=0;o<Gf.length;o++)if(n+=Gf[o],r<n)return d_[o];return"common"}function g_(t){let e=ed("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 Ql(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:Es(e,s_),species:Es(r,i_),personality:Es(n,a_),catchphrase:Es(o,c_),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&&l_.some(r=>r.test(e))}function Es(t,e){let r=t.trim();return r?Mr(r)?e:r:e}function f_(t){return Object.keys(t).some(e=>o_.has(e))}function h_(t,e){let r=["name","species","personality","catchphrase"];return f_(t)||r.some(n=>t[n]!==e[n])}var xt=class{soul=null;storagePath;constructor(e,r){this.storagePath=Wf.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=Ql(e),h_(r,this.soul)&&this.persist(),this.soul}catch{return null}}async hatch(e,r,n){let o=`${e}-xiaozhi-claw`,s=m_(o),i=g_(o),a=p_(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=Ql({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=Ql(e),this.persist()}persist(){let e=Wf.dirname(this.storagePath);io.existsSync(e)||io.mkdirSync(e,{recursive:!0}),io.writeFileSync(this.storagePath,JSON.stringify(this.soul,null,2),"utf-8")}};var y_=/^[a-f0-9]{64}$/,v_=new Set(["agentInstructions","systemPrompt","tools","permissions","memoryPolicy","planningPolicy","retrievalPolicy","capabilities","abilities"]);async function Kf(t){b_(t);let e=t.manifest,r=k_(e),n=ln.join(B(),"pets","community",t.id);return await _s.mkdir(n,{recursive:!0}),await _s.writeFile(ln.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)}
|
|
207
|
-
`,"utf8"),{kind:"pet",status:"installed",resourceId:t.id,version:t.version,checksum:t.checksum,installDir:n,name:r.name,sanitized:r.sanitized}}function b_(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(!y_.test(t.checksum))throw new Error("Community pet package checksum must be a sha256 hex digest.");let e=Vf(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(v_.has(r))throw new Error("unsafe pet asset manifest contains agent instruction fields.");for(let r of zf(e))R_(r.path)}function k_(t){let e=Ms(t.name)||"Community Pet",r=Ms(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:zf(t),sanitized:o!==e||s!==r||i.some((a,c)=>a!==n[c])}}function zf(t){return Array.isArray(t.assets)?t.assets.map(e=>Vf(e)).filter(e=>!!e).map(e=>({kind:Ms(e.kind),path:Ms(e.path)})).filter(e=>e.kind&&e.path):[]}function R_(t){let e=ln.posix.normalize(t.replace(/\\/g,"/"));if(!e||e==="."||e.startsWith("../")||ln.posix.isAbsolute(e))throw new Error("unsafe pet asset path.")}function Ms(t){return typeof t=="string"?t.trim():""}function Vf(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:null}G();import{createHash as H_}from"node:crypto";import{existsSync as B_}from"node:fs";import*as ye from"node:fs/promises";import*as
|
|
207
|
+
`,"utf8"),{kind:"pet",status:"installed",resourceId:t.id,version:t.version,checksum:t.checksum,installDir:n,name:r.name,sanitized:r.sanitized}}function b_(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(!y_.test(t.checksum))throw new Error("Community pet package checksum must be a sha256 hex digest.");let e=Vf(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(v_.has(r))throw new Error("unsafe pet asset manifest contains agent instruction fields.");for(let r of zf(e))R_(r.path)}function k_(t){let e=Ms(t.name)||"Community Pet",r=Ms(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:zf(t),sanitized:o!==e||s!==r||i.some((a,c)=>a!==n[c])}}function zf(t){return Array.isArray(t.assets)?t.assets.map(e=>Vf(e)).filter(e=>!!e).map(e=>({kind:Ms(e.kind),path:Ms(e.path)})).filter(e=>e.kind&&e.path):[]}function R_(t){let e=ln.posix.normalize(t.replace(/\\/g,"/"));if(!e||e==="."||e.startsWith("../")||ln.posix.isAbsolute(e))throw new Error("unsafe pet asset path.")}function Ms(t){return typeof t=="string"?t.trim():""}function Vf(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:null}G();import{createHash as H_}from"node:crypto";import{existsSync as B_}from"node:fs";import*as ye from"node:fs/promises";import*as Ae from"node:path";import{gunzipSync as q_}from"node:zlib";import*as js from"node:fs";import*as ao from"node:path";G();import{existsSync as Xf,mkdirSync as S_,readFileSync as T_,writeFileSync as w_}from"node:fs";import{dirname as A_,join as P_}from"node:path";import{randomUUID as Yf}from"node:crypto";function Jf(){return P_(B(),"projects.json")}function qe(){let t=Jf();if(!Xf(t))return{activeProjectId:null,projects:[]};try{let e=T_(t,"utf-8");return JSON.parse(e)}catch{return{activeProjectId:null,projects:[]}}}function jt(t){let e=Jf(),r=A_(e);Xf(r)||S_(r,{recursive:!0}),w_(e,JSON.stringify(t,null,2),"utf-8")}function Ds(t){let e=qe(),r=new Date().toISOString(),n={id:Yf(),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),jt(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 Qf(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(),jt(r),!0):!1}function Ct(t){let e=qe(),r=e.projects.find(n=>n.id===t&&n.status==="active");return r?(e.activeProjectId=r.id,jt(e),r):null}function td(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 jt(e),{deleted:!0,switchedTo:o}}function Zf(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:Yf(),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),jt(e),o}function eh(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(),jt(r),n)}function th(t,e){let r=qe(),n=r.projects.find(o=>o.id===t);return n?(n.workspaceDir=e,n.updatedAt=new Date().toISOString(),jt(r),!0):!1}function rh(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 jt(e),{archived:!0,switchedTo:n}}function nh(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(),jt(e),r):null}function Ns(t){return qe().projects.find(r=>r.groupId===t&&r.status==="active")??null}function oh(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 jt(e),{archived:!0,projectId:r.id,switchedTo:n}}var Os={MAX_RECALLED_SKILLS:ac,MAX_SKILL_CONTENT_CHARS:cc,CACHE_TTL_MS:lc};function x_(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=C_(t);return a.length>0?a:null}function C_(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 Ls=null,rd=0;function I_(t){let e=Date.now();if(Ls&&e-rd<Os.CACHE_TTL_MS)return Ls;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=js.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=js.readFileSync(l,"utf8"),p=d.split(`
|
|
208
208
|
`).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 Ls=r,rd=e,r}function E_(t,e){if(t.length===0)return[];let r=I_(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,Os.MAX_RECALLED_SKILLS).map(o=>o.skill)}function sh(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 M_(s,e),a=i?[__(i)]:[],c=x_(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=E_(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>Os.MAX_SKILL_CONTENT_CHARS?u.content.slice(0,Os.MAX_SKILL_CONTENT_CHARS)+`
|
|
209
209
|
...(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(`
|
|
210
210
|
`),source:"skill",label:"Skill",score:.85}});return{action:"continue",context:{...o,recalledMemories:[...d,...a,...p]}}}})}function gt(){Ls=null,rd=0}async function M_(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 __(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(`
|
|
211
|
-
`),source:"community",label:"Community",score:t.status==="matched"?.74:.68}}import{existsSync as D_,readFileSync as N_,writeFileSync as L_,mkdirSync as ah,renameSync as ch}from"node:fs";import{join as nd,dirname as lh}from"node:path";var ih=30,O_=90,j_="skill-lifecycle.json";function dh(t){return nd(t,j_)}function ue(t){let e=dh(t);try{return JSON.parse(N_(e,"utf8"))}catch{return{version:1,records:{}}}}function he(t,e){let r=dh(t);ah(lh(r),{recursive:!0});let n=r+".tmp";L_(n,JSON.stringify(e,null,2),"utf8"),ch(n,r)}function It(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 uh(t,e){let r=It(t,e);r.lastUsedAt=new Date().toISOString(),r.useCount++,r.state==="stale"&&(r.state="active",r.staleAt=void 0)}function od(t,e){let r=It(t,e);r.lastPatchedAt=new Date().toISOString(),r.state==="stale"&&(r.state="active",r.staleAt=void 0)}function ph(t,e){let r=t.records[e];return r?(r.pinned=!0,!0):!1}function mh(t,e){let r=t.records[e];return r?(r.pinned=!1,!0):!1}function $_(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 U_(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=$_(o),i=(e-s.getTime())/(1e3*60*60*24);o.state==="active"&&i>=ih?(o.state="stale",o.staleAt=new Date().toISOString(),r.transitioned.push({name:n,from:"active",to:"stale"})):o.state==="stale"&&i>=O_?(o.state="archived",o.archivedAt=new Date().toISOString(),r.transitioned.push({name:n,from:"stale",to:"archived"})):o.state==="stale"&&i<ih&&(o.state="active",o.staleAt=void 0,r.transitioned.push({name:n,from:"stale",to:"active"}))}return r}function F_(t,e){let r=nd(t,e);if(!D_(r))return!1;let n=nd(t,".archive",e);ah(lh(n),{recursive:!0});try{return ch(r,n),!0}catch{return!1}}function gh(t,e){let r=ue(t),n=U_(r);for(let o of n.transitioned)o.to==="archived"&&F_(e,o.name);return he(t,r),n}function fh(t,e){return Object.values(t.records).filter(r=>r.state===e)}function $s(t,e){delete t.records[e]}var W_=/^[a-z0-9][a-z0-9-]{1,62}[a-z0-9]$/,G_=/^[a-f0-9]{64}$/,K_=20*1024*1024;async function hh(t,e={}){z_(t);let r=e.fetchFn??fetch,n=await X_(r,t),o=await Y_(),s=!1;try{await J_(n,o),await Q_(o,t),await Z_(o);let i=sr(),a=we.join(i,t.id);if(B_(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,t0(t),gt(),{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 z_(t){if(!W_.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(!V_(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=n0(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(!G_.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>K_)throw new Error("Community skill package size is invalid or exceeds the M1 20MB limit.")}function V_(t){return t.sourceTier==="official"||t.sourceTier==="community"&&t.reviewStatus==="approved"}async function X_(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(H_("sha256").update(n).digest("hex")!==e.checksum)throw new Error("Community skill package checksum did not match registry metadata.");return n}async function Y_(){let t=we.join(B(),"cache","community-installs");return await ye.mkdir(t,{recursive:!0}),ye.mkdtemp(we.join(t,"skill-"))}async function J_(t,e){let r;try{r=q_(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=Us(o,0,100),i=Us(o,345,155),a=i?`${i}/${s}`:s,c=Us(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=Us(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=r0(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 Q_(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 Z_(t){let e=await ye.readFile(we.join(t,"SKILL.md"),"utf8");if(e0(e))throw new Error("Community skill package content failed prompt injection scan.")}function e0(t){return o0.some(e=>e.test(t))}function t0(t){let e=B(),r=ue(e),n=t.id,o=It(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 r0(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 Us(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 n0(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:null}var o0=[/\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 yh(t,e={}){if(t.type==="skill"&&t.kind==="inert")return hh(t,e);if(t.type==="pet"&&t.kind==="asset")return Kf(t);if(c0(t))return l0(t);if(t.type==="mcp")return s0(t);throw new Error(`Unsupported community resource install type: ${t.type}/${t.kind}.`)}function s0(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:i0(t.manifest),manifest:t.manifest}}function i0(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 a0=new Set(["mcp","plugin","cron","hook","workflow","executable"]);function c0(t){return a0.has(t.type)&&(t.kind==="local-executable"||t.kind==="executable")}function l0(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 ft from"node:fs";import*as dn from"node:path";import{gzipSync as f0}from"node:zlib";import*as vh from"node:fs";function Fs(){let t=Ot();return t?{async recordTelemetry(e){let r=d0();!r.enabled||!r.signalsEnabled||!r.remoteSynced||await t.recordTelemetry(e)}}:null}function bh(t,e){t&&t.recordTelemetry(e).catch(()=>{})}function d0(){try{let t=JSON.parse(vh.readFileSync(I().getUserSettingsPath(),"utf8")),e=t.communityConsent;return At(t.communityConsent,e?.remoteSynced===!0)}catch{return At(null,!1)}}function kh(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 u0(t){let e=t.replace(/\r\n/g,`
|
|
211
|
+
`),source:"community",label:"Community",score:t.status==="matched"?.74:.68}}import{existsSync as D_,readFileSync as N_,writeFileSync as L_,mkdirSync as ah,renameSync as ch}from"node:fs";import{join as nd,dirname as lh}from"node:path";var ih=30,O_=90,j_="skill-lifecycle.json";function dh(t){return nd(t,j_)}function ue(t){let e=dh(t);try{return JSON.parse(N_(e,"utf8"))}catch{return{version:1,records:{}}}}function he(t,e){let r=dh(t);ah(lh(r),{recursive:!0});let n=r+".tmp";L_(n,JSON.stringify(e,null,2),"utf8"),ch(n,r)}function It(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 uh(t,e){let r=It(t,e);r.lastUsedAt=new Date().toISOString(),r.useCount++,r.state==="stale"&&(r.state="active",r.staleAt=void 0)}function od(t,e){let r=It(t,e);r.lastPatchedAt=new Date().toISOString(),r.state==="stale"&&(r.state="active",r.staleAt=void 0)}function ph(t,e){let r=t.records[e];return r?(r.pinned=!0,!0):!1}function mh(t,e){let r=t.records[e];return r?(r.pinned=!1,!0):!1}function $_(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 U_(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=$_(o),i=(e-s.getTime())/(1e3*60*60*24);o.state==="active"&&i>=ih?(o.state="stale",o.staleAt=new Date().toISOString(),r.transitioned.push({name:n,from:"active",to:"stale"})):o.state==="stale"&&i>=O_?(o.state="archived",o.archivedAt=new Date().toISOString(),r.transitioned.push({name:n,from:"stale",to:"archived"})):o.state==="stale"&&i<ih&&(o.state="active",o.staleAt=void 0,r.transitioned.push({name:n,from:"stale",to:"active"}))}return r}function F_(t,e){let r=nd(t,e);if(!D_(r))return!1;let n=nd(t,".archive",e);ah(lh(n),{recursive:!0});try{return ch(r,n),!0}catch{return!1}}function gh(t,e){let r=ue(t),n=U_(r);for(let o of n.transitioned)o.to==="archived"&&F_(e,o.name);return he(t,r),n}function fh(t,e){return Object.values(t.records).filter(r=>r.state===e)}function $s(t,e){delete t.records[e]}var W_=/^[a-z0-9][a-z0-9-]{1,62}[a-z0-9]$/,G_=/^[a-f0-9]{64}$/,K_=20*1024*1024;async function hh(t,e={}){z_(t);let r=e.fetchFn??fetch,n=await X_(r,t),o=await Y_(),s=!1;try{await J_(n,o),await Q_(o,t),await Z_(o);let i=sr(),a=Ae.join(i,t.id);if(B_(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,t0(t),gt(),{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 z_(t){if(!W_.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(!V_(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=n0(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(!G_.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>K_)throw new Error("Community skill package size is invalid or exceeds the M1 20MB limit.")}function V_(t){return t.sourceTier==="official"||t.sourceTier==="community"&&t.reviewStatus==="approved"}async function X_(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(H_("sha256").update(n).digest("hex")!==e.checksum)throw new Error("Community skill package checksum did not match registry metadata.");return n}async function Y_(){let t=Ae.join(B(),"cache","community-installs");return await ye.mkdir(t,{recursive:!0}),ye.mkdtemp(Ae.join(t,"skill-"))}async function J_(t,e){let r;try{r=q_(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=Us(o,0,100),i=Us(o,345,155),a=i?`${i}/${s}`:s,c=Us(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=Us(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=r0(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 Q_(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 Z_(t){let e=await ye.readFile(Ae.join(t,"SKILL.md"),"utf8");if(e0(e))throw new Error("Community skill package content failed prompt injection scan.")}function e0(t){return o0.some(e=>e.test(t))}function t0(t){let e=B(),r=ue(e),n=t.id,o=It(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 r0(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 Us(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 n0(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:null}var o0=[/\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 yh(t,e={}){if(t.type==="skill"&&t.kind==="inert")return hh(t,e);if(t.type==="pet"&&t.kind==="asset")return Kf(t);if(c0(t))return l0(t);if(t.type==="mcp")return s0(t);throw new Error(`Unsupported community resource install type: ${t.type}/${t.kind}.`)}function s0(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:i0(t.manifest),manifest:t.manifest}}function i0(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 a0=new Set(["mcp","plugin","cron","hook","workflow","executable"]);function c0(t){return a0.has(t.type)&&(t.kind==="local-executable"||t.kind==="executable")}function l0(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 ft from"node:fs";import*as dn from"node:path";import{gzipSync as f0}from"node:zlib";import*as vh from"node:fs";function Fs(){let t=Ot();return t?{async recordTelemetry(e){let r=d0();!r.enabled||!r.signalsEnabled||!r.remoteSynced||await t.recordTelemetry(e)}}:null}function bh(t,e){t&&t.recordTelemetry(e).catch(()=>{})}function d0(){try{let t=JSON.parse(vh.readFileSync(I().getUserSettingsPath(),"utf8")),e=t.communityConsent;return Pt(t.communityConsent,e?.remoteSynced===!0)}catch{return Pt(null,!1)}}function kh(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 u0(t){let e=t.replace(/\r\n/g,`
|
|
212
212
|
`).replace(/\r/g,`
|
|
213
213
|
`);if(!e.startsWith("---"))return;let r=e.indexOf(`
|
|
214
214
|
---`,3);if(r!==-1)return e.slice(4,r)}function p0(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t}function m0(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(`
|
|
@@ -224,15 +224,15 @@ description: ${l}`,i=!0}return i?`---
|
|
|
224
224
|
${a}
|
|
225
225
|
---
|
|
226
226
|
|
|
227
|
-
${c}`:t}var Sh="community-publish-audit.jsonl",h0=40;async function Th(t){let e=t.instruction;if(!
|
|
227
|
+
${c}`:t}var Sh="community-publish-audit.jsonl",h0=40;async function Th(t){let e=t.instruction;if(!A0(e))return{status:"ignored"};let r=dn.join(t.projectRoot,".qlogicagent","skills"),n=dn.join(r,e.suggestedName),o=dn.join(n,"SKILL.md");if(ft.existsSync(o))return{status:"exists",skillPath:o};let s=Hs({name:e.suggestedName,description:e.description,tools:e.tools,body:`# ${e.suggestedName}
|
|
228
228
|
|
|
229
229
|
Auto-learned multi-step workflow using: ${e.tools.join(", ")}.
|
|
230
|
-
`,version:"1.0.0",category:"learned"}),i=Bs(s,e.suggestedName);if(!i.valid)return t.host.log(`[skill-auto-persist] Validation failed for "${e.suggestedName}": ${i.errors.join(", ")}`),{status:"skipped",skillPath:o,reason:"validation failed"};ft.mkdirSync(n,{recursive:!0}),ft.writeFileSync(o,s,"utf8"),gt();let a=I().getOwnerProfileDir(),c=ue(a);It(c,e.suggestedName,"learned"),he(a,c),t.host.log(`[skill-auto-persist] Created skill "${e.suggestedName}" from turn ${t.eventTurnId}`);let l=v0(e,s);if(l.decision!=="eligible")return l.decision==="blocked"&&bh(t.communityTelemetryRecorder??Fs(),{event:"community.desensitization.hit",metadata:{surface:"skill-auto-persist",action:"publish-blocked",ruleId:R0(l.reason)}}),qs({eventTurnId:t.eventTurnId,skillName:e.suggestedName,decision:l.decision,reason:l.reason}),t.host.log(`[skill-auto-persist] Community publish ${l.decision} for "${e.suggestedName}": ${l.reason}`),{status:l.decision,skillPath:o,reason:l.reason};let d=t.communityPublisher??y0();if(!d)return qs({eventTurnId:t.eventTurnId,skillName:e.suggestedName,decision:"skipped",reason:"community unavailable"}),t.host.log(`[skill-auto-persist] Community publish skipped for "${e.suggestedName}": community unavailable`),{status:"skipped",skillPath:o,reason:"community unavailable"};let p=b0(e,s);try{return await d.publishSkill(p),qs({eventTurnId:t.eventTurnId,skillName:e.suggestedName,decision:"published",reason:"eligible",resourceId:p.id}),t.host.log(`[skill-auto-persist] Published skill "${e.suggestedName}" to community registry`),{status:"created",skillPath:o}}catch(u){let m=u instanceof Error?u.message:String(u);return qs({eventTurnId:t.eventTurnId,skillName:e.suggestedName,decision:"skipped",reason:m,resourceId:p.id}),t.host.log(`[skill-auto-persist] Community publish skipped for "${e.suggestedName}": ${m}`),{status:"skipped",skillPath:o,reason:m}}}function y0(){let t=Ot();return t?{async publishSkill(e){let r=S0();if(!r.enabled||!r.methodSharingEnabled||!r.remoteSynced)throw new Error("Community participation consent is required before publishing shared skills.");return t.publishSkill(e)}}:null}function wh(t={}){let e=T0(t.limit);if(e===0)return[];let r=dn.join(I().getOwnerProfileDir(),Sh),n;try{n=ft.readFileSync(r,"utf8")}catch{return[]}return n.split(/\r?\n/).map(o=>o.trim()).filter(Boolean).map(o=>{try{return w0(JSON.parse(o))}catch{return null}}).filter(o=>o!==null).sort((o,s)=>Date.parse(s.createdAt)-Date.parse(o.createdAt)).slice(0,e)}function v0(t,e){if(Ws(t.tools).length<2||t.description.trim().length<h0)return{decision:"skipped",reason:"not worth sharing"};let n=kh(e);return n?{decision:"blocked",reason:n.reason}:{decision:"eligible",reason:"eligible"}}function b0(t,e){let r=Ws(t.tools),n=k0(t.suggestedName),o=t.description.trim().slice(0,240);return{id:n,title:t.suggestedName,summary:o,visibility:"public",tags:Ws(["learned",...r]).slice(0,8),manifest:{schema_version:15,kind:"inert",name:n,summary:o,description:t.description.trim(),triggers:r,entry:"SKILL.md",tags:Ws(["learned",...r]).slice(0,8)},version:"1.0.0",packageGzipBase64:f0(Buffer.from(e,"utf8")).toString("base64")}}function k0(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,64).replace(/-+$/g,"");return e.length>=3?e:`skill-${e}`.replace(/-+$/g,"")}function Ws(t){return[...new Set(t.map(e=>e.trim().toLowerCase()).filter(Boolean))]}function R0(t){return t.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,64)||"desensitization-hit"}function S0(){try{let t=JSON.parse(ft.readFileSync(I().getUserSettingsPath(),"utf8")),e=t.communityConsent;return
|
|
231
|
-
`,"utf8")}function T0(t){return typeof t!="number"||!Number.isFinite(t)?50:Math.max(0,Math.min(200,Math.trunc(t)))}function w0(t){if(!t||typeof t!="object")return null;let e=t;if(typeof e.eventTurnId!="string"||!e.eventTurnId.trim()||typeof e.skillName!="string"||!e.skillName.trim()||e.decision!=="published"&&e.decision!=="blocked"&&e.decision!=="skipped"||typeof e.reason!="string"||!e.reason.trim()||typeof e.createdAt!="string"||Number.isNaN(Date.parse(e.createdAt)))return null;let r={eventTurnId:e.eventTurnId,skillName:e.skillName,decision:e.decision,reason:e.reason,createdAt:e.createdAt};return typeof e.resourceId=="string"&&e.resourceId.trim()&&(r.resourceId=e.resourceId),r}function P0(t){if(!t||typeof t!="object")return!1;let e=t;return e.type==="skill.create"&&typeof e.suggestedName=="string"&&typeof e.description=="string"&&Array.isArray(e.tools)&&e.tools.every(r=>typeof r=="string")}var Ph="communityConsent",Ah="Community hub is unavailable; consent was not changed.",Eh="Community participation consent is required before publishing shared skills.",A0="Community participation consent is required before sending registry signals.",x0="Community participation consent is required before sending community telemetry.",Mh="explicitInstallConsent=true is required before resolving a community install.",C0=new Set(["installed","success","fail","neutral","kept","uninstalled","endorse","error"]),I0=new Set(["community.journey.view","community.share.generated","community.sandbox.violation","community.desensitization.hit"]),E0=3,M0=1800;async function _h(t){try{let e=_r(this),r=await e.read(),n=We(this);if(!n){pe(this,t,{ok:!0,remoteAvailable:!1,consent:r});return}try{let o=await n.getConsent();await e.write(o),pe(this,t,{ok:!0,remoteAvailable:!0,consent:o})}catch(o){pe(this,t,{ok:!0,remoteAvailable:!1,consent:r,error:o instanceof Error?o.message:"Community hub is unavailable."})}}catch(e){N(this,t,e instanceof Error?e.message:String(e))}}async function Dh(t){let e=_0(t.params);if(!e){N(this,t,"enabled (boolean) is required.",y.INVALID_PARAMS);return}try{let r=_r(this),n=We(this);if(!n){if(e.enabled){N(this,t,Ah);return}let o=At(e,!1);await r.write(o),pe(this,t,{ok:!0,remoteAvailable:!1,consent:o,warning:"Community hub is unavailable; local sharing gates are off."});return}try{let o=await n.setConsent(e);await r.write(o),pe(this,t,{ok:!0,remoteAvailable:!0,consent:o})}catch(o){if(!e.enabled){let s=At(e,!1);await r.write(s),pe(this,t,{ok:!0,remoteAvailable:!1,consent:s,warning:o instanceof Error?o.message:"Community hub is unavailable."});return}N(this,t,Ah)}}catch(r){N(this,t,r instanceof Error?r.message:String(r))}}async function Nh(t){try{let e=We(this);if(!e){N(this,t,"Community hub is unavailable.");return}pe(this,t,{ok:!0,resources:await e.listSharedResources()})}catch(e){N(this,t,e instanceof Error?e.message:String(e))}}async function Lh(t){let e=L0(t.params);if(!e){N(this,t,"Required: intent (string) and optional topK integer 1..3.",y.INVALID_PARAMS);return}try{let r=We(this);if(!r){N(this,t,"Community hub is unavailable.");return}let o={ok:!0,matches:await r.matchRegistry(e)};if(JSON.stringify(o).length>M0){N(this,t,"Community registry discovery response exceeded the O(1) size contract.");return}pe(this,t,o)}catch(r){N(this,t,r instanceof Error?r.message:String(r))}}async function Oh(t){let e=t.params??{},r=typeof e.resourceId=="string"?e.resourceId.trim():"";if(!r){N(this,t,"resourceId (string) is required.",y.INVALID_PARAMS);return}if(e.explicitInstallConsent!==!0){N(this,t,Mh,y.INVALID_PARAMS);return}let n=typeof e.version=="string"&&e.version.trim()?e.version.trim():void 0,o=e.explicitHighRiskConsent===!0;try{let s=We(this);if(!s){N(this,t,"Community hub is unavailable.");return}let i=await s.resolveInstall(r,n);if(Vh(i)&&!o){Xh(this,t,i);return}pe(this,t,{ok:!0,install:i})}catch(s){N(this,t,s instanceof Error?s.message:String(s))}}async function jh(t){let e=t.params??{},r=typeof e.resourceId=="string"?e.resourceId.trim():"";if(!r){N(this,t,"resourceId (string) is required.",y.INVALID_PARAMS);return}if(e.explicitInstallConsent!==!0){N(this,t,Mh,y.INVALID_PARAMS);return}let n=typeof e.version=="string"&&e.version.trim()?e.version.trim():void 0,o=e.explicitHighRiskConsent===!0;try{let s=We(this);if(!s){N(this,t,"Community hub is unavailable.");return}let i=await s.resolveInstall(r,n);if(Vh(i)&&!o){Xh(this,t,i);return}let a=await yh(i),c,l=await _r(this).read();if(!xh(a)&&cd(l))try{await s.recordSignal({resourceId:i.id,event:"installed",metadata:{version:i.version,source:"community-install"}})}catch(d){c=d instanceof Error?d.message:String(d)}pe(this,t,{ok:!0,...xh(a)?{preview:a}:{installed:a},...c?{signalWarning:c}:{}})}catch(s){N(this,t,s instanceof Error?s.message:String(s))}}function xh(t){return!!t&&typeof t=="object"&&(t.kind==="mcp"&&t.mode==="preview"||t.kind==="executable")}async function $h(t){let e=D0(t.params);if(!e){N(this,t,"Required: id, title, summary, manifest.",y.INVALID_PARAMS);return}try{let n=await _r(this).read();if(!zh(n)){N(this,t,Eh);return}let o=We(this);if(!o){N(this,t,"Community hub is unavailable.");return}pe(this,t,{ok:!0,...await o.publishSkill(e)})}catch(r){N(this,t,r instanceof Error?r.message:String(r))}}async function Uh(t){let e=N0(t.params);if(!e){N(this,t,"Required: id, name, summary, persona.",y.INVALID_PARAMS);return}try{let n=await _r(this).read();if(!zh(n)){N(this,t,Eh);return}let o=We(this);if(!o){N(this,t,"Community hub is unavailable.");return}pe(this,t,{ok:!0,...await qf(o,e)})}catch(r){N(this,t,r instanceof Error?r.message:String(r))}}async function Fh(t){let e=O0(t.params);if(!e){N(this,t,"Required: resourceId and valid event.",y.INVALID_PARAMS);return}try{let n=await _r(this).read();if(!cd(n)){N(this,t,A0);return}let o=We(this);if(!o){N(this,t,"Community hub is unavailable.");return}pe(this,t,{ok:!0,...await o.recordSignal(e)})}catch(r){N(this,t,r instanceof Error?r.message:String(r))}}async function Hh(t){let e=j0(t.params);if(!e){N(this,t,"Required: valid community telemetry event.",y.INVALID_PARAMS);return}try{let n=await _r(this).read();if(!cd(n)){N(this,t,x0);return}let o=We(this);if(!o){N(this,t,"Community hub is unavailable.");return}pe(this,t,{ok:!0,...await o.recordTelemetry(e)})}catch(r){N(this,t,r instanceof Error?r.message:String(r))}}async function Bh(t){let e=t.params??{},r=typeof e.limit=="number"?e.limit:void 0;try{pe(this,t,{ok:!0,entries:wh({limit:r})})}catch(n){N(this,t,n instanceof Error?n.message:String(n))}}async function qh(t){let e=t.params??{},r=typeof e.resourceId=="string"?e.resourceId.trim():"";if(!r){N(this,t,"resourceId (string) is required.",y.INVALID_PARAMS);return}let n=typeof e.reason=="string"?e.reason:void 0;try{let o=We(this);if(!o){N(this,t,"Community hub is unavailable.");return}pe(this,t,{ok:!0,resource:await o.withdrawSharedResource(r,n)})}catch(o){N(this,t,o instanceof Error?o.message:String(o))}}async function Wh(t){let e=t.params??{},r=typeof e.reason=="string"?e.reason:void 0;try{let n=We(this);if(!n){N(this,t,"Community hub is unavailable.");return}pe(this,t,{ok:!0,resources:await n.withdrawSharedResources(r)})}catch(n){N(this,t,n instanceof Error?n.message:String(n))}}async function Gh(t){try{let e=We(this);if(!e){N(this,t,"Community hub is unavailable.");return}pe(this,t,{ok:!0,notices:await e.listNotices($0(t.params))})}catch(e){N(this,t,e instanceof Error?e.message:String(e))}}async function Kh(t){let e=t.params??{},r=typeof e.noticeId=="number"?e.noticeId:Number(e.noticeId);if(!Number.isSafeInteger(r)||r<1){N(this,t,"noticeId (positive integer) is required.",y.INVALID_PARAMS);return}try{let n=We(this);if(!n){N(this,t,"Community hub is unavailable.");return}pe(this,t,{ok:!0,notice:await n.markNoticeRead(r)})}catch(n){N(this,t,n instanceof Error?n.message:String(n))}}function _0(t){if(!t||typeof t.enabled!="boolean")return null;let e={enabled:t.enabled};return typeof t.methodSharingEnabled=="boolean"&&(e.methodSharingEnabled=t.methodSharingEnabled),typeof t.signalsEnabled=="boolean"&&(e.signalsEnabled=t.signalsEnabled),typeof t.encounterEnabled=="boolean"&&(e.encounterEnabled=t.encounterEnabled),e}function D0(t){if(!t)return null;let e=typeof t.id=="string"?t.id.trim():"",r=typeof t.title=="string"?t.title.trim():"",n=typeof t.summary=="string"?t.summary.trim():"",o=ld(t.manifest)?t.manifest:null;if(!e||!r||!n||!o)return null;let s=t.visibility==="private"?"private":"public",i=Array.isArray(t.tags)?t.tags.filter(c=>typeof c=="string"):[],a={id:e,title:r,summary:n,visibility:s,tags:i,manifest:o};return typeof t.version=="string"&&(a.version=t.version.trim()),typeof t.packageGzipBase64=="string"&&(a.packageGzipBase64=t.packageGzipBase64.trim()),a}function N0(t){if(!t)return null;let e=typeof t.id=="string"?t.id.trim():"",r=typeof t.name=="string"?t.name.trim():"",n=typeof t.summary=="string"?t.summary.trim():"",o=typeof t.persona=="string"?t.persona.trim():"";return!e||!r||!n||!o?null:{id:e,name:r,summary:n,persona:o,visibility:t.visibility==="private"?"private":"public",tags:Array.isArray(t.tags)?t.tags.filter(s=>typeof s=="string"):[],traits:Array.isArray(t.traits)?t.traits.filter(s=>typeof s=="string"):[],assets:Array.isArray(t.assets)?t.assets.filter(ld).map(s=>({kind:typeof s.kind=="string"?s.kind:"",path:typeof s.path=="string"?s.path:""})).filter(s=>s.kind&&s.path):[]}}function L0(t){if(!t)return null;let e=typeof t.intent=="string"?t.intent.trim():"";if(!e)return null;let r=t.topK===void 0?void 0:Number(t.topK);return r!==void 0&&(!Number.isSafeInteger(r)||r<1||r>E0)?null:{intent:e,...r===void 0?{}:{topK:r},...typeof t.preferOfficial=="boolean"?{preferOfficial:t.preferOfficial}:{}}}function O0(t){if(!t)return null;let e=typeof t.resourceId=="string"?t.resourceId.trim():"",r=typeof t.event=="string"&&C0.has(t.event)?t.event:null;if(!e||!r)return null;let n={resourceId:e,event:r};return typeof t.attribution=="string"&&t.attribution.trim()&&(n.attribution=t.attribution.trim()),ld(t.metadata)&&(n.metadata=t.metadata),n}function j0(t){if(!t)return null;let e=typeof t.event=="string"&&I0.has(t.event)?t.event:null;if(!e)return null;let r={event:e},n=xs(e,t.metadata);return n&&(r.metadata=n),r}function $0(t){return{includeRead:t?.includeRead===!0}}function zh(t){return t.enabled&&t.methodSharingEnabled&&t.remoteSynced}function cd(t){return t.enabled&&t.signalsEnabled&&t.remoteSynced}function Vh(t){return U0(t.effectiveRiskTier)}function U0(t){return t==="R2"||t==="R3"}function Xh(t,e,r){N(t,e,`Explicit high-risk consent is required before exposing ${r.effectiveRiskTier} community install resolution.`,y.INTERNAL_ERROR,{resourceRiskTier:r.resourceRiskTier,effectiveRiskTier:r.effectiveRiskTier,requiresExplicitHighRiskConsent:!0})}function ld(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function We(t){return t.resolveCommunityConsentClient?t.resolveCommunityConsentClient():Ot()}function _r(t){return t.resolveCommunityConsentStore?.()??F0()}function F0(){let t=Ue();return{async read(){let e=await Ch(t);return At(e[Ph],!1)},async write(e){let r=await Ch(t);r[Ph]=e,await un.mkdir(Ih.dirname(t),{recursive:!0}),await un.writeFile(t,JSON.stringify(r,null,2),"utf-8")}}}async function Ch(t){try{return JSON.parse(await un.readFile(t,"utf-8"))}catch{return{}}}function pe(t,e,r){e.id!==void 0&&t.sendResponse(e.id,r)}function N(t,e,r,n=y.INTERNAL_ERROR,o){e.id!==void 0&&t.sendResponse(e.id,void 0,{code:n,message:r,...o===void 0?{}:{data:o}})}G();He();import*as Ut from"node:fs";import*as gu from"node:path";var dd=class{teamBudget={tokensUsed:0,budgetTokens:uc};isTeamBudgetExceeded(){return this.teamBudget.budgetTokens>0&&this.teamBudget.tokensUsed>=this.teamBudget.budgetTokens}recordForkTokens(e){return this.teamBudget.tokensUsed+=e,this.teamBudget.tokensUsed}teamBudgetExceededError(){return`Team budget exceeded (${this.teamBudget.tokensUsed} / ${this.teamBudget.budgetTokens} tokens). No more sub-agents allowed.`}dream={idleMinutes:30,enabled:!1,lastDreamAt:0,cooldownMs:14400*1e3,maxDurationMs:300*1e3};resetAccumulators(){this.teamBudget.tokensUsed=0}},ht=new dd;var H0="task",B0=["create","update","delete","list","get"];var q0={type:"object",properties:{action:{type:"string",enum:[...B0],description:"create \u2014 add a new task (auto-assigns id). update \u2014 modify a task by id (partial, supports dependency wiring). delete \u2014 remove a task by id (cascades block refs). list \u2014 read current task list with summary. get \u2014 get a single task by id."},id:{type:"number",description:"[update|delete|get] Task id to operate on."},title:{type:"string",description:"[create|update] Task title (3-7 words, imperative form)."},description:{type:"string",description:"[create|update] Detailed task description."},status:{type:"string",enum:["not-started","in-progress","completed"],description:"[create|update] Task status. create defaults to not-started."},owner:{type:"string",description:"[create|update] Owner agent/subagent identifier."},addBlocks:{type:"array",items:{type:"number"},description:"[update] Task IDs that this task should block (they depend on this task)."},addBlockedBy:{type:"array",items:{type:"number"},description:"[update] Task IDs that should block this task (this task depends on them)."}},required:["action"]};function co(t){let e=new Set(t.filter(r=>r.status==="completed").map(r=>r.id));return{total:t.length,completed:t.filter(r=>r.status==="completed").length,inProgress:t.filter(r=>r.status==="in-progress").length,notStarted:t.filter(r=>r.status==="not-started").length,blocked:t.filter(r=>r.status!=="completed"&&r.blockedBy?.some(n=>!e.has(n))).length}}function Yh(t,e){let r=[],n=0,o=t??{},s=o.verificationNudge!==!1;function i(){let g=r.reduce((h,b)=>Math.max(h,b.id),0);return n=Math.max(n,g)+1,n}function a(g){return{content:[{type:"text",text:`Error: ${g}`}],details:{type:"task",error:g}}}function c(g){let h=co(r),b=new Set(r.filter(T=>T.status==="completed").map(T=>T.id)),v=r.map(T=>{let C=T.blockedBy?.filter(E=>!b.has(E));return{...T,...C?.length?{blockedBy:C}:{blockedBy:void 0}}}),R=[];if(R.push(`Task list updated. ${h.total} tasks: ${h.completed} completed, ${h.inProgress} in-progress, ${h.notStarted} not-started.`),h.blocked>0&&R.push(`${h.blocked} blocked.`),g?.created){let T=g.created;R.push(`Created task #${T.id}: "${T.title}"`)}if(g?.updated){let T=g.updated;R.push(`Updated task #${T.id}: "${T.title}"`)}if(g?.deleted!=null&&R.push(`Deleted task #${g.deleted}`),v.length>0){R.push("");for(let T of v){let C=T.status==="completed"?"\u2713":T.status==="in-progress"?"\u2192":"\u25CB",E=T.blockedBy?.length?` [blocked by #${T.blockedBy.join(", #")}]`:"",M=T.owner?` (${T.owner})`:"";R.push(` ${C} #${T.id}: ${T.title} (${T.status})${M}${E}`)}}let S=!1;if(s&&g?.updated&&g.updated.status==="completed"){let C=r.every(L=>L.status==="completed"),E=r.length,M=r.some(L=>/verif/i.test(L.title));C&&E>=3&&!M&&(S=!0,R.push(""),R.push("NOTE: You just closed out "+E+' tasks and none of them was a verification step. Before writing your final summary, spawn the verification agent (agent type="verify"). You cannot self-assign PARTIAL by listing caveats in your summary \u2014 only the verifier issues a verdict.'))}return{content:[{type:"text",text:R.join(`
|
|
230
|
+
`,version:"1.0.0",category:"learned"}),i=Bs(s,e.suggestedName);if(!i.valid)return t.host.log(`[skill-auto-persist] Validation failed for "${e.suggestedName}": ${i.errors.join(", ")}`),{status:"skipped",skillPath:o,reason:"validation failed"};ft.mkdirSync(n,{recursive:!0}),ft.writeFileSync(o,s,"utf8"),gt();let a=I().getOwnerProfileDir(),c=ue(a);It(c,e.suggestedName,"learned"),he(a,c),t.host.log(`[skill-auto-persist] Created skill "${e.suggestedName}" from turn ${t.eventTurnId}`);let l=v0(e,s);if(l.decision!=="eligible")return l.decision==="blocked"&&bh(t.communityTelemetryRecorder??Fs(),{event:"community.desensitization.hit",metadata:{surface:"skill-auto-persist",action:"publish-blocked",ruleId:R0(l.reason)}}),qs({eventTurnId:t.eventTurnId,skillName:e.suggestedName,decision:l.decision,reason:l.reason}),t.host.log(`[skill-auto-persist] Community publish ${l.decision} for "${e.suggestedName}": ${l.reason}`),{status:l.decision,skillPath:o,reason:l.reason};let d=t.communityPublisher??y0();if(!d)return qs({eventTurnId:t.eventTurnId,skillName:e.suggestedName,decision:"skipped",reason:"community unavailable"}),t.host.log(`[skill-auto-persist] Community publish skipped for "${e.suggestedName}": community unavailable`),{status:"skipped",skillPath:o,reason:"community unavailable"};let p=b0(e,s);try{return await d.publishSkill(p),qs({eventTurnId:t.eventTurnId,skillName:e.suggestedName,decision:"published",reason:"eligible",resourceId:p.id}),t.host.log(`[skill-auto-persist] Published skill "${e.suggestedName}" to community registry`),{status:"created",skillPath:o}}catch(u){let m=u instanceof Error?u.message:String(u);return qs({eventTurnId:t.eventTurnId,skillName:e.suggestedName,decision:"skipped",reason:m,resourceId:p.id}),t.host.log(`[skill-auto-persist] Community publish skipped for "${e.suggestedName}": ${m}`),{status:"skipped",skillPath:o,reason:m}}}function y0(){let t=Ot();return t?{async publishSkill(e){let r=S0();if(!r.enabled||!r.methodSharingEnabled||!r.remoteSynced)throw new Error("Community participation consent is required before publishing shared skills.");return t.publishSkill(e)}}:null}function wh(t={}){let e=T0(t.limit);if(e===0)return[];let r=dn.join(I().getOwnerProfileDir(),Sh),n;try{n=ft.readFileSync(r,"utf8")}catch{return[]}return n.split(/\r?\n/).map(o=>o.trim()).filter(Boolean).map(o=>{try{return w0(JSON.parse(o))}catch{return null}}).filter(o=>o!==null).sort((o,s)=>Date.parse(s.createdAt)-Date.parse(o.createdAt)).slice(0,e)}function v0(t,e){if(Ws(t.tools).length<2||t.description.trim().length<h0)return{decision:"skipped",reason:"not worth sharing"};let n=kh(e);return n?{decision:"blocked",reason:n.reason}:{decision:"eligible",reason:"eligible"}}function b0(t,e){let r=Ws(t.tools),n=k0(t.suggestedName),o=t.description.trim().slice(0,240);return{id:n,title:t.suggestedName,summary:o,visibility:"public",tags:Ws(["learned",...r]).slice(0,8),manifest:{schema_version:15,kind:"inert",name:n,summary:o,description:t.description.trim(),triggers:r,entry:"SKILL.md",tags:Ws(["learned",...r]).slice(0,8)},version:"1.0.0",packageGzipBase64:f0(Buffer.from(e,"utf8")).toString("base64")}}function k0(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,64).replace(/-+$/g,"");return e.length>=3?e:`skill-${e}`.replace(/-+$/g,"")}function Ws(t){return[...new Set(t.map(e=>e.trim().toLowerCase()).filter(Boolean))]}function R0(t){return t.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,64)||"desensitization-hit"}function S0(){try{let t=JSON.parse(ft.readFileSync(I().getUserSettingsPath(),"utf8")),e=t.communityConsent;return Pt(t.communityConsent,e?.remoteSynced===!0)}catch{return Pt(null,!1)}}function qs(t){let e=I().getOwnerProfileDir();ft.mkdirSync(e,{recursive:!0}),ft.appendFileSync(dn.join(e,Sh),`${JSON.stringify({...t,createdAt:new Date().toISOString()})}
|
|
231
|
+
`,"utf8")}function T0(t){return typeof t!="number"||!Number.isFinite(t)?50:Math.max(0,Math.min(200,Math.trunc(t)))}function w0(t){if(!t||typeof t!="object")return null;let e=t;if(typeof e.eventTurnId!="string"||!e.eventTurnId.trim()||typeof e.skillName!="string"||!e.skillName.trim()||e.decision!=="published"&&e.decision!=="blocked"&&e.decision!=="skipped"||typeof e.reason!="string"||!e.reason.trim()||typeof e.createdAt!="string"||Number.isNaN(Date.parse(e.createdAt)))return null;let r={eventTurnId:e.eventTurnId,skillName:e.skillName,decision:e.decision,reason:e.reason,createdAt:e.createdAt};return typeof e.resourceId=="string"&&e.resourceId.trim()&&(r.resourceId=e.resourceId),r}function A0(t){if(!t||typeof t!="object")return!1;let e=t;return e.type==="skill.create"&&typeof e.suggestedName=="string"&&typeof e.description=="string"&&Array.isArray(e.tools)&&e.tools.every(r=>typeof r=="string")}var Ah="communityConsent",Ph="Community hub is unavailable; consent was not changed.",Eh="Community participation consent is required before publishing shared skills.",P0="Community participation consent is required before sending registry signals.",x0="Community participation consent is required before sending community telemetry.",Mh="explicitInstallConsent=true is required before resolving a community install.",C0=new Set(["installed","success","fail","neutral","kept","uninstalled","endorse","error"]),I0=new Set(["community.journey.view","community.share.generated","community.sandbox.violation","community.desensitization.hit"]),E0=3,M0=1800;async function _h(t){try{let e=_r(this),r=await e.read(),n=We(this);if(!n){pe(this,t,{ok:!0,remoteAvailable:!1,consent:r});return}try{let o=await n.getConsent();await e.write(o),pe(this,t,{ok:!0,remoteAvailable:!0,consent:o})}catch(o){pe(this,t,{ok:!0,remoteAvailable:!1,consent:r,error:o instanceof Error?o.message:"Community hub is unavailable."})}}catch(e){N(this,t,e instanceof Error?e.message:String(e))}}async function Dh(t){let e=_0(t.params);if(!e){N(this,t,"enabled (boolean) is required.",y.INVALID_PARAMS);return}try{let r=_r(this),n=We(this);if(!n){if(e.enabled){N(this,t,Ph);return}let o=Pt(e,!1);await r.write(o),pe(this,t,{ok:!0,remoteAvailable:!1,consent:o,warning:"Community hub is unavailable; local sharing gates are off."});return}try{let o=await n.setConsent(e);await r.write(o),pe(this,t,{ok:!0,remoteAvailable:!0,consent:o})}catch(o){if(!e.enabled){let s=Pt(e,!1);await r.write(s),pe(this,t,{ok:!0,remoteAvailable:!1,consent:s,warning:o instanceof Error?o.message:"Community hub is unavailable."});return}N(this,t,Ph)}}catch(r){N(this,t,r instanceof Error?r.message:String(r))}}async function Nh(t){try{let e=We(this);if(!e){N(this,t,"Community hub is unavailable.");return}pe(this,t,{ok:!0,resources:await e.listSharedResources()})}catch(e){N(this,t,e instanceof Error?e.message:String(e))}}async function Lh(t){let e=L0(t.params);if(!e){N(this,t,"Required: intent (string) and optional topK integer 1..3.",y.INVALID_PARAMS);return}try{let r=We(this);if(!r){N(this,t,"Community hub is unavailable.");return}let o={ok:!0,matches:await r.matchRegistry(e)};if(JSON.stringify(o).length>M0){N(this,t,"Community registry discovery response exceeded the O(1) size contract.");return}pe(this,t,o)}catch(r){N(this,t,r instanceof Error?r.message:String(r))}}async function Oh(t){let e=t.params??{},r=typeof e.resourceId=="string"?e.resourceId.trim():"";if(!r){N(this,t,"resourceId (string) is required.",y.INVALID_PARAMS);return}if(e.explicitInstallConsent!==!0){N(this,t,Mh,y.INVALID_PARAMS);return}let n=typeof e.version=="string"&&e.version.trim()?e.version.trim():void 0,o=e.explicitHighRiskConsent===!0;try{let s=We(this);if(!s){N(this,t,"Community hub is unavailable.");return}let i=await s.resolveInstall(r,n);if(Vh(i)&&!o){Xh(this,t,i);return}pe(this,t,{ok:!0,install:i})}catch(s){N(this,t,s instanceof Error?s.message:String(s))}}async function jh(t){let e=t.params??{},r=typeof e.resourceId=="string"?e.resourceId.trim():"";if(!r){N(this,t,"resourceId (string) is required.",y.INVALID_PARAMS);return}if(e.explicitInstallConsent!==!0){N(this,t,Mh,y.INVALID_PARAMS);return}let n=typeof e.version=="string"&&e.version.trim()?e.version.trim():void 0,o=e.explicitHighRiskConsent===!0;try{let s=We(this);if(!s){N(this,t,"Community hub is unavailable.");return}let i=await s.resolveInstall(r,n);if(Vh(i)&&!o){Xh(this,t,i);return}let a=await yh(i),c,l=await _r(this).read();if(!xh(a)&&cd(l))try{await s.recordSignal({resourceId:i.id,event:"installed",metadata:{version:i.version,source:"community-install"}})}catch(d){c=d instanceof Error?d.message:String(d)}pe(this,t,{ok:!0,...xh(a)?{preview:a}:{installed:a},...c?{signalWarning:c}:{}})}catch(s){N(this,t,s instanceof Error?s.message:String(s))}}function xh(t){return!!t&&typeof t=="object"&&(t.kind==="mcp"&&t.mode==="preview"||t.kind==="executable")}async function $h(t){let e=D0(t.params);if(!e){N(this,t,"Required: id, title, summary, manifest.",y.INVALID_PARAMS);return}try{let n=await _r(this).read();if(!zh(n)){N(this,t,Eh);return}let o=We(this);if(!o){N(this,t,"Community hub is unavailable.");return}pe(this,t,{ok:!0,...await o.publishSkill(e)})}catch(r){N(this,t,r instanceof Error?r.message:String(r))}}async function Uh(t){let e=N0(t.params);if(!e){N(this,t,"Required: id, name, summary, persona.",y.INVALID_PARAMS);return}try{let n=await _r(this).read();if(!zh(n)){N(this,t,Eh);return}let o=We(this);if(!o){N(this,t,"Community hub is unavailable.");return}pe(this,t,{ok:!0,...await qf(o,e)})}catch(r){N(this,t,r instanceof Error?r.message:String(r))}}async function Fh(t){let e=O0(t.params);if(!e){N(this,t,"Required: resourceId and valid event.",y.INVALID_PARAMS);return}try{let n=await _r(this).read();if(!cd(n)){N(this,t,P0);return}let o=We(this);if(!o){N(this,t,"Community hub is unavailable.");return}pe(this,t,{ok:!0,...await o.recordSignal(e)})}catch(r){N(this,t,r instanceof Error?r.message:String(r))}}async function Hh(t){let e=j0(t.params);if(!e){N(this,t,"Required: valid community telemetry event.",y.INVALID_PARAMS);return}try{let n=await _r(this).read();if(!cd(n)){N(this,t,x0);return}let o=We(this);if(!o){N(this,t,"Community hub is unavailable.");return}pe(this,t,{ok:!0,...await o.recordTelemetry(e)})}catch(r){N(this,t,r instanceof Error?r.message:String(r))}}async function Bh(t){let e=t.params??{},r=typeof e.limit=="number"?e.limit:void 0;try{pe(this,t,{ok:!0,entries:wh({limit:r})})}catch(n){N(this,t,n instanceof Error?n.message:String(n))}}async function qh(t){let e=t.params??{},r=typeof e.resourceId=="string"?e.resourceId.trim():"";if(!r){N(this,t,"resourceId (string) is required.",y.INVALID_PARAMS);return}let n=typeof e.reason=="string"?e.reason:void 0;try{let o=We(this);if(!o){N(this,t,"Community hub is unavailable.");return}pe(this,t,{ok:!0,resource:await o.withdrawSharedResource(r,n)})}catch(o){N(this,t,o instanceof Error?o.message:String(o))}}async function Wh(t){let e=t.params??{},r=typeof e.reason=="string"?e.reason:void 0;try{let n=We(this);if(!n){N(this,t,"Community hub is unavailable.");return}pe(this,t,{ok:!0,resources:await n.withdrawSharedResources(r)})}catch(n){N(this,t,n instanceof Error?n.message:String(n))}}async function Gh(t){try{let e=We(this);if(!e){N(this,t,"Community hub is unavailable.");return}pe(this,t,{ok:!0,notices:await e.listNotices($0(t.params))})}catch(e){N(this,t,e instanceof Error?e.message:String(e))}}async function Kh(t){let e=t.params??{},r=typeof e.noticeId=="number"?e.noticeId:Number(e.noticeId);if(!Number.isSafeInteger(r)||r<1){N(this,t,"noticeId (positive integer) is required.",y.INVALID_PARAMS);return}try{let n=We(this);if(!n){N(this,t,"Community hub is unavailable.");return}pe(this,t,{ok:!0,notice:await n.markNoticeRead(r)})}catch(n){N(this,t,n instanceof Error?n.message:String(n))}}function _0(t){if(!t||typeof t.enabled!="boolean")return null;let e={enabled:t.enabled};return typeof t.methodSharingEnabled=="boolean"&&(e.methodSharingEnabled=t.methodSharingEnabled),typeof t.signalsEnabled=="boolean"&&(e.signalsEnabled=t.signalsEnabled),typeof t.encounterEnabled=="boolean"&&(e.encounterEnabled=t.encounterEnabled),e}function D0(t){if(!t)return null;let e=typeof t.id=="string"?t.id.trim():"",r=typeof t.title=="string"?t.title.trim():"",n=typeof t.summary=="string"?t.summary.trim():"",o=ld(t.manifest)?t.manifest:null;if(!e||!r||!n||!o)return null;let s=t.visibility==="private"?"private":"public",i=Array.isArray(t.tags)?t.tags.filter(c=>typeof c=="string"):[],a={id:e,title:r,summary:n,visibility:s,tags:i,manifest:o};return typeof t.version=="string"&&(a.version=t.version.trim()),typeof t.packageGzipBase64=="string"&&(a.packageGzipBase64=t.packageGzipBase64.trim()),a}function N0(t){if(!t)return null;let e=typeof t.id=="string"?t.id.trim():"",r=typeof t.name=="string"?t.name.trim():"",n=typeof t.summary=="string"?t.summary.trim():"",o=typeof t.persona=="string"?t.persona.trim():"";return!e||!r||!n||!o?null:{id:e,name:r,summary:n,persona:o,visibility:t.visibility==="private"?"private":"public",tags:Array.isArray(t.tags)?t.tags.filter(s=>typeof s=="string"):[],traits:Array.isArray(t.traits)?t.traits.filter(s=>typeof s=="string"):[],assets:Array.isArray(t.assets)?t.assets.filter(ld).map(s=>({kind:typeof s.kind=="string"?s.kind:"",path:typeof s.path=="string"?s.path:""})).filter(s=>s.kind&&s.path):[]}}function L0(t){if(!t)return null;let e=typeof t.intent=="string"?t.intent.trim():"";if(!e)return null;let r=t.topK===void 0?void 0:Number(t.topK);return r!==void 0&&(!Number.isSafeInteger(r)||r<1||r>E0)?null:{intent:e,...r===void 0?{}:{topK:r},...typeof t.preferOfficial=="boolean"?{preferOfficial:t.preferOfficial}:{}}}function O0(t){if(!t)return null;let e=typeof t.resourceId=="string"?t.resourceId.trim():"",r=typeof t.event=="string"&&C0.has(t.event)?t.event:null;if(!e||!r)return null;let n={resourceId:e,event:r};return typeof t.attribution=="string"&&t.attribution.trim()&&(n.attribution=t.attribution.trim()),ld(t.metadata)&&(n.metadata=t.metadata),n}function j0(t){if(!t)return null;let e=typeof t.event=="string"&&I0.has(t.event)?t.event:null;if(!e)return null;let r={event:e},n=xs(e,t.metadata);return n&&(r.metadata=n),r}function $0(t){return{includeRead:t?.includeRead===!0}}function zh(t){return t.enabled&&t.methodSharingEnabled&&t.remoteSynced}function cd(t){return t.enabled&&t.signalsEnabled&&t.remoteSynced}function Vh(t){return U0(t.effectiveRiskTier)}function U0(t){return t==="R2"||t==="R3"}function Xh(t,e,r){N(t,e,`Explicit high-risk consent is required before exposing ${r.effectiveRiskTier} community install resolution.`,y.INTERNAL_ERROR,{resourceRiskTier:r.resourceRiskTier,effectiveRiskTier:r.effectiveRiskTier,requiresExplicitHighRiskConsent:!0})}function ld(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function We(t){return t.resolveCommunityConsentClient?t.resolveCommunityConsentClient():Ot()}function _r(t){return t.resolveCommunityConsentStore?.()??F0()}function F0(){let t=Ue();return{async read(){let e=await Ch(t);return Pt(e[Ah],!1)},async write(e){let r=await Ch(t);r[Ah]=e,await un.mkdir(Ih.dirname(t),{recursive:!0}),await un.writeFile(t,JSON.stringify(r,null,2),"utf-8")}}}async function Ch(t){try{return JSON.parse(await un.readFile(t,"utf-8"))}catch{return{}}}function pe(t,e,r){e.id!==void 0&&t.sendResponse(e.id,r)}function N(t,e,r,n=y.INTERNAL_ERROR,o){e.id!==void 0&&t.sendResponse(e.id,void 0,{code:n,message:r,...o===void 0?{}:{data:o}})}G();He();import*as Ut from"node:fs";import*as gu from"node:path";var dd=class{teamBudget={tokensUsed:0,budgetTokens:uc};isTeamBudgetExceeded(){return this.teamBudget.budgetTokens>0&&this.teamBudget.tokensUsed>=this.teamBudget.budgetTokens}recordForkTokens(e){return this.teamBudget.tokensUsed+=e,this.teamBudget.tokensUsed}teamBudgetExceededError(){return`Team budget exceeded (${this.teamBudget.tokensUsed} / ${this.teamBudget.budgetTokens} tokens). No more sub-agents allowed.`}dream={idleMinutes:30,enabled:!1,lastDreamAt:0,cooldownMs:14400*1e3,maxDurationMs:300*1e3};resetAccumulators(){this.teamBudget.tokensUsed=0}},ht=new dd;var H0="task",B0=["create","update","delete","list","get"];var q0={type:"object",properties:{action:{type:"string",enum:[...B0],description:"create \u2014 add a new task (auto-assigns id). update \u2014 modify a task by id (partial, supports dependency wiring). delete \u2014 remove a task by id (cascades block refs). list \u2014 read current task list with summary. get \u2014 get a single task by id."},id:{type:"number",description:"[update|delete|get] Task id to operate on."},title:{type:"string",description:"[create|update] Task title (3-7 words, imperative form)."},description:{type:"string",description:"[create|update] Detailed task description."},status:{type:"string",enum:["not-started","in-progress","completed"],description:"[create|update] Task status. create defaults to not-started."},owner:{type:"string",description:"[create|update] Owner agent/subagent identifier."},addBlocks:{type:"array",items:{type:"number"},description:"[update] Task IDs that this task should block (they depend on this task)."},addBlockedBy:{type:"array",items:{type:"number"},description:"[update] Task IDs that should block this task (this task depends on them)."}},required:["action"]};function co(t){let e=new Set(t.filter(r=>r.status==="completed").map(r=>r.id));return{total:t.length,completed:t.filter(r=>r.status==="completed").length,inProgress:t.filter(r=>r.status==="in-progress").length,notStarted:t.filter(r=>r.status==="not-started").length,blocked:t.filter(r=>r.status!=="completed"&&r.blockedBy?.some(n=>!e.has(n))).length}}function Yh(t,e){let r=[],n=0,o=t??{},s=o.verificationNudge!==!1;function i(){let g=r.reduce((h,b)=>Math.max(h,b.id),0);return n=Math.max(n,g)+1,n}function a(g){return{content:[{type:"text",text:`Error: ${g}`}],details:{type:"task",error:g}}}function c(g){let h=co(r),b=new Set(r.filter(T=>T.status==="completed").map(T=>T.id)),v=r.map(T=>{let C=T.blockedBy?.filter(E=>!b.has(E));return{...T,...C?.length?{blockedBy:C}:{blockedBy:void 0}}}),R=[];if(R.push(`Task list updated. ${h.total} tasks: ${h.completed} completed, ${h.inProgress} in-progress, ${h.notStarted} not-started.`),h.blocked>0&&R.push(`${h.blocked} blocked.`),g?.created){let T=g.created;R.push(`Created task #${T.id}: "${T.title}"`)}if(g?.updated){let T=g.updated;R.push(`Updated task #${T.id}: "${T.title}"`)}if(g?.deleted!=null&&R.push(`Deleted task #${g.deleted}`),v.length>0){R.push("");for(let T of v){let C=T.status==="completed"?"\u2713":T.status==="in-progress"?"\u2192":"\u25CB",E=T.blockedBy?.length?` [blocked by #${T.blockedBy.join(", #")}]`:"",M=T.owner?` (${T.owner})`:"";R.push(` ${C} #${T.id}: ${T.title} (${T.status})${M}${E}`)}}let S=!1;if(s&&g?.updated&&g.updated.status==="completed"){let C=r.every(L=>L.status==="completed"),E=r.length,M=r.some(L=>/verif/i.test(L.title));C&&E>=3&&!M&&(S=!0,R.push(""),R.push("NOTE: You just closed out "+E+' tasks and none of them was a verification step. Before writing your final summary, spawn the verification agent (agent type="verify"). You cannot self-assign PARTIAL by listing caveats in your summary \u2014 only the verifier issues a verdict.'))}return{content:[{type:"text",text:R.join(`
|
|
232
232
|
`)}],details:{type:"task",...h,...g,taskList:v,agentId:o.agentId,...S&&{verificationNudgeNeeded:!0}}}}function l(g,h,b){let v=r.find(R=>R.id===g);if(v){if(h?.length){v.blocks=[...new Set([...v.blocks??[],...h])];for(let R of h){let S=r.find(T=>T.id===R);S&&(S.blockedBy=[...new Set([...S.blockedBy??[],g])])}}if(b?.length){v.blockedBy=[...new Set([...v.blockedBy??[],...b])];for(let R of b){let S=r.find(T=>T.id===R);S&&(S.blocks=[...new Set([...S.blocks??[],g])])}}}}function d(g){for(let h of r)h.blocks&&(h.blocks=h.blocks.filter(b=>b!==g)),h.blockedBy&&(h.blockedBy=h.blockedBy.filter(b=>b!==g))}function p(g){if(!g.title)return a("title is required for create action.");let h={id:i(),title:g.title,status:g.status??"not-started",...g.description!=null&&{description:g.description},...g.owner!=null&&{owner:g.owner}};return r.push(h),l(h.id,void 0,g.addBlockedBy),e?.onTaskCreated?.(h),c({created:{id:h.id,title:h.title}})}function u(g){if(g.id==null)return a("id is required for update action.");let h=r.find(b=>b.id===g.id);if(!h)return a(`Task #${g.id} not found.`);if(g.status==="in-progress"){let b=new Set(r.filter(R=>R.status==="completed").map(R=>R.id)),v=h.blockedBy?.filter(R=>!b.has(R));if(v?.length)return a(`Cannot set #${g.id} to in-progress: blocked by unresolved task(s) #${v.join(", #")}.`)}if(g.title!=null&&(h.title=g.title),g.description!=null&&(h.description=g.description),g.owner!=null&&(h.owner=g.owner),g.status!=null){let b=h.status;h.status=g.status,b!=="completed"&&g.status==="completed"&&e?.onTaskCompleted?.(h)}return l(h.id,g.addBlocks,g.addBlockedBy),c({updated:{id:h.id,title:h.title,status:h.status}})}function m(g){if(g.id==null)return a("id is required for delete action.");let h=r.findIndex(b=>b.id===g.id);return h===-1?a(`Task #${g.id} not found.`):(n=Math.max(n,g.id),r.splice(h,1),d(g.id),c({deleted:g.id}))}function f(g){if(g.id==null)return a("id is required for get action.");let h=r.find(S=>S.id===g.id);if(!h)return a(`Task #${g.id} not found.`);let b=new Set(r.filter(S=>S.status==="completed").map(S=>S.id)),v=h.blockedBy?.filter(S=>!b.has(S));return{content:[{type:"text",text:[`Task #${h.id}: ${h.title}`,`Status: ${h.status}`,h.description?`Description: ${h.description}`:"",h.owner?`Owner: ${h.owner}`:"",v?.length?`Blocked by: #${v.join(", #")}`:"",h.blocks?.length?`Blocks: #${h.blocks.join(", #")}`:""].filter(Boolean).join(`
|
|
233
233
|
`)}],details:{type:"task",action:"get",task:h}}}return{name:H0,label:"Task",description:"Manage a structured task list to track multi-step work progress. Actions: create (add task), update (modify by id), delete (remove by id), list (read all), get (single task). Supports dependency tracking (blocks/blockedBy) \u2014 tasks cannot start until blockers complete. Use frequently during complex work to plan steps, coordinate subagents, and show progress.",parameters:q0,searchHint:"manage session task checklist progress tracking dependencies planning",maxResultSizeChars:1e5,execute:async(g,h)=>{let b=h.action;switch(b){case"create":return p(h);case"update":return u(h);case"delete":return m(h);case"list":return c();case"get":return f(h);default:return a(`Unknown action: ${b}. Valid: create, update, delete, list, get.`)}}}}import*as j from"node:fs";import*as U from"node:path";import{execFile as hO}from"node:child_process";var W0="think",G0={type:"object",properties:{thought:{type:"string",description:["Your internal reasoning about the current situation.","Use this to:","\u2022 Analyze what the user really wants (disambiguate vague requests)","\u2022 Plan multi-step approaches before executing","\u2022 Evaluate which tool(s) to use and why","\u2022 Consider edge cases or potential issues","\u2022 Reflect on conversation context and user preferences","This content is never shown to the user."].join(`
|
|
234
234
|
`)}},required:["thought"]};function Jh(){return{name:W0,label:"Think",shouldDefer:!0,description:["Use this tool to think and reason about the current situation BEFORE taking action.","Call this tool when you need to:","- Analyze an ambiguous or complex user request before deciding what to do","- Plan a multi-step approach (what tools to call and in what order)","- Identify which steps can run in parallel vs. which must be sequential","- Evaluate tradeoffs between different approaches","- Reflect on user preferences from conversation history","- Process new information that changes your understanding","","This tool has NO side effects \u2014 it simply records your reasoning process.","Your thought is NOT shown to the user; it only improves YOUR decision quality.","After thinking, proceed to take the appropriate action.","","When planning multi-step work, be explicit about parallelism:",'- Say "\u8FD9\u4E9B\u53EF\u4EE5\u5E76\u884C\u751F\u6210" or "these can run in parallel" for independent tasks.','- Say "\u5148\u2026\u7136\u540E\u2026" or "step 1 first, then step 2" for sequential dependencies.'].join(`
|
|
235
|
-
`),parameters:G0,execute:async(t,e)=>({content:[{type:"text",text:"Thought recorded. Now proceed with the best action based on your reasoning."}],details:{type:"think"}})}}import{isAbsolute as hD,resolve as yD}from"node:path";var Qh=new Set(["find","grep","rg","ag","ack","locate","which","whereis"]),Zh=new Set(["cat","head","tail","less","more","wc","stat","file","strings","jq","awk","cut","sort","uniq","tr"]),ey=new Set(["ls","tree","du"]);var ty=new Set(["mv","cp","rm","mkdir","rmdir","chmod","chown","chgrp","touch","ln","cd","export","unset","wait"]);function K0(t){let r=t.replace(/\\\n/g," ").trim().split(/[|;&]/).shift()?.trim()??"";if(!r)return null;let n=r.split(/\s+/),o=0;for(;o<n.length&&/^[A-Za-z_]\w*=/.test(n[o]);)o++;let s=/^(?:timeout|time|nice|nohup|stdbuf|command|builtin|exec)$/;for(;o<n.length;){let c=n[o];if(s.test(c)){for(o++;o<n.length&&/^[-+]/.test(n[o]);)o++;o<n.length&&/^\d+(?:\.\d+)?[smhd]?$/.test(n[o])&&o++;continue}break}if(o>=n.length)return null;let i=n[o],a=i.lastIndexOf("/");return a>=0?i.slice(a+1):i}function ry(t){return/(?:^|[;&|])\s*(?:cd|pushd|popd)\b/.test(t)}function ud(t){let e=K0(t),r=e!==null&&Qh.has(e),n=e!==null&&Zh.has(e),o=e!==null&&ey.has(e),s=e!==null&&ty.has(e),i=/(?:[^2]>|^>|\|>)/.test(t),a=ry(t),c=(r||n||o)&&!i&&!a;return{firstCommand:e,isSearch:r,isRead:n,isList:o,isSilent:s,isConcurrencySafe:c,isReadOnly:c}}var z0=t=>({isError:t!==0,message:t!==0?`Command failed with exit code ${t}`:void 0}),V0=new Map([["grep",t=>({isError:t>=2,message:t===1?"No matches found":void 0})],["rg",t=>({isError:t>=2,message:t===1?"No matches found":void 0})],["egrep",t=>({isError:t>=2,message:t===1?"No matches found":void 0})],["fgrep",t=>({isError:t>=2,message:t===1?"No matches found":void 0})],["ag",t=>({isError:t>=2,message:t===1?"No matches found":void 0})],["find",t=>({isError:t>=2,message:t===1?"Some directories were inaccessible":void 0})],["diff",t=>({isError:t>=2,message:t===1?"Files differ":void 0})],["test",t=>({isError:t>=2,message:t===1?"Condition is false":void 0})],["[",t=>({isError:t>=2,message:t===1?"Condition is false":void 0})],["cmp",t=>({isError:t>=2,message:t===1?"Files differ":void 0})]]);function X0(t){let e=t.trim(),r=e.split(/\s*\|\s*/);return(r[r.length-1]??e).trim().split(/\s+/)[0]??""}function pd(t,e,r,n){let o=X0(t);return(V0.get(o)??z0)(e,r,n)}function md(t){return/(?:^|[;&|])\s*sleep\s+\d/i.test(t)?"sleep command blocks execution \u2014 use run_in_background: true":/\bwhile\s+(?:true|:|\[\s*1\s*\])\b/.test(t)?"infinite loop \u2014 use run_in_background: true or monitor tool":null}import{spawn as cD}from"node:child_process";import{constants as zs,readFileSync as lD,unlinkSync as dD}from"node:fs";import{mkdir as uD,open as pD,realpath as iy}from"node:fs/promises";import{isAbsolute as mD,resolve as gD}from"node:path";function Dr(){if(process.platform!=="win32")return!1;let t=process.env.QLOGICAGENT_USE_POWERSHELL;return t==="1"||t==="true"}function gd(){return Dr()?"powershell":"bash"}function fd(){return Math.floor(Math.random()*65536).toString(16).padStart(4,"0")}import{mkdir as Y0,readFile as J0,writeFile as Q0,unlink as Z0}from"node:fs/promises";import{join as ny}from"node:path";import{tmpdir as eD}from"node:os";var tD=8*1024*1024,rD=5*1024*1024*1024;var hd;function lo(){if(!hd){let t=Math.random().toString(36).slice(2,10);hd=ny(eD(),"qla-tasks",t)}return hd}function oy(t){return ny(lo(),`${t}.output`)}function Jt(t="local_bash"){return`${t}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}var cr=class{taskId;path;stdoutToFile;#e="";#r="";#o=0;#s=0;#t;#i;#n=0;#a=!1;constructor(e,r,n=!1,o=tD){this.taskId=e,this.path=oy(e),this.stdoutToFile=n,this.#t=o,this.#i=r}writeStdout(e){this.#e+=e,this.#s+=e.length,this.#o+=nD(e),this.#d()}writeStderr(e){this.#r+=e}async getStdout(){if(this.stdoutToFile)try{let e=await J0(this.path,"utf-8");return this.#n=Buffer.byteLength(e),e}catch{return""}return this.#e}getStderr(){return this.#r}get outputFileSize(){return this.#n}get outputFileRedundant(){return this.#n<=this.#t}#d(){this.#e.length>this.#t&&this.spillToDisk()}spillToDisk(){this.#e.length!==0&&Y0(lo(),{recursive:!0}).then(()=>Q0(this.path,this.#e).catch(()=>{}))}async deleteOutputFile(){try{await Z0(this.path)}catch{}}clear(){this.#a||(this.#a=!0,this.#e="",this.#r="",this.#i=null,this.deleteOutputFile())}};function nD(t){let e=0;for(let r=0;r<t.length;r++)t.charCodeAt(r)===10&&e++;return e}var yd=137,sy=143,oD=5e3,vd=5*1024*1024*1024,Gs=class{#e;#r;#o;#s=!1;constructor(e,r,n){this.#e=e,this.#r=r,this.#o=n,e.setEncoding("utf-8"),e.on("data",this.#t)}#t=e=>{let r=typeof e=="string"?e:e.toString();this.#o?this.#r.writeStderr(r):this.#r.writeStdout(r)};cleanup(){this.#s||(this.#s=!0,this.#e.removeListener("data",this.#t),this.#e=null,this.#r=null)}},bd=class t{#e="running";#r;#o;#s;#t;#i=null;#n=null;#a=!1;#d;#c;#u;#g;#v;#p=null;#m=null;#l=null;taskOutput;result;onTimeout;constructor(e,r,n,o,s=!1,i=vd){this.#t=e,this.#c=r,this.#g=n,this.#v=s,this.#d=i,this.taskOutput=o,this.#s=e.stderr?new Gs(e.stderr,o,!0):null,this.#o=e.stdout?new Gs(e.stdout,o,!1):null,s&&(this.onTimeout=a=>{this.#u=a}),this.result=this.#P()}get status(){return this.#e}static#k(e){e.#v&&e.#u?e.#u(e.background.bind(e)):e.#y(sy)}#R(){this.#c.reason!=="interrupt"&&this.kill()}#S(e,r){let n=e??(r==="SIGTERM"?144:1);this.#f(n)}#T(){this.#f(1)}#f(e){this.#m&&(this.#m(e),this.#m=null)}#h(){this.#b(),this.#i&&(clearTimeout(this.#i),this.#i=null),this.#l&&(this.#c.removeEventListener("abort",this.#l),this.#l=null)}#b(){this.#n&&(clearInterval(this.#n),this.#n=null)}#w(){this.#n=setInterval(()=>{import("node:fs/promises").then(({stat:e})=>e(this.taskOutput.path).then(r=>{r.size>this.#d&&this.#e==="backgrounded"&&this.#n!==null&&(this.#a=!0,this.#b(),this.#y(yd))},()=>{}))},oD),this.#n.unref?.()}#P(){this.#l=this.#R.bind(this),this.#c.addEventListener("abort",this.#l,{once:!0}),this.#t.once("exit",this.#S.bind(this)),this.#t.once("error",this.#T.bind(this)),this.#i=setTimeout(t.#k,this.#g,this);let e=new Promise(r=>{this.#m=r});return new Promise(r=>{this.#p=r,e.then(this.#A.bind(this))})}async#A(e){this.#h(),(this.#e==="running"||this.#e==="backgrounded")&&(this.#e="completed");let r=await this.taskOutput.getStdout(),n={code:e,stdout:r,stderr:this.taskOutput.getStderr(),interrupted:e===yd,backgroundTaskId:this.#r};this.taskOutput.stdoutToFile&&!this.#r&&(this.taskOutput.outputFileRedundant?this.taskOutput.deleteOutputFile():(n.outputFilePath=this.taskOutput.path,n.outputFileSize=this.taskOutput.outputFileSize)),this.#a?n.stderr=`Background command killed: output file exceeded ${vd} bytes. ${n.stderr}`:e===sy&&(n.stderr=`Command timed out after ${this.#g}ms. ${n.stderr}`),this.#p&&(this.#p(n),this.#p=null)}#y(e){this.#e="killed";let r=this.#t.pid;if(r)try{if(process.platform==="win32")import("node:child_process").then(({execSync:n})=>{try{n(`taskkill /PID ${r} /T /F`,{stdio:"ignore"})}catch{}});else try{process.kill(-r,"SIGKILL")}catch{try{process.kill(r,"SIGKILL")}catch{}}}catch{try{this.#t.kill("SIGKILL")}catch{}}this.#f(e??yd)}kill(){this.#y()}background(e){return this.#e==="running"?(this.#r=e,this.#e="backgrounded",this.#h(),this.taskOutput.stdoutToFile?this.#w():this.taskOutput.spillToDisk(),!0):!1}cleanup(){this.#o?.cleanup(),this.#s?.cleanup(),this.taskOutput.clear(),this.#h(),this.#t=null,this.#c=null,this.#u=void 0}};function kd(t,e,r,n,o=!1,s=vd){return new bd(t,e,r,n,o,s)}function Ks(t,e){let r=new cr(Jt("local_bash"),null);return{status:"killed",result:Promise.resolve({code:e?.code??145,stdout:"",stderr:e?.stderr??"Command aborted before execution",interrupted:!0,backgroundTaskId:t}),taskOutput:r,background:()=>!1,kill:()=>{},cleanup:()=>{}}}function Rd(t){let e=new cr(Jt("local_bash"),null);return{status:"completed",result:Promise.resolve({code:1,stdout:"",stderr:t,interrupted:!1,preSpawnError:t}),taskOutput:e,background:()=>!1,kill:()=>{},cleanup:()=>{}}}var sD=new Set(["API_KEY","ANTHROPIC_API_KEY","OPENAI_API_KEY","DEEPSEEK_API_KEY","DOUBAO_API_KEY","MINIMAX_API_KEY","GLM_API_KEY","KIMI_API_KEY","QWEN_API_KEY","MOONSHOT_API_KEY","ZHIPU_API_KEY","BAICHUAN_API_KEY","VOLCENGINE_API_KEY","AWS_SECRET_ACCESS_KEY","AWS_SESSION_TOKEN","GOOGLE_APPLICATION_CREDENTIALS","AZURE_CLIENT_SECRET","AZURE_CLIENT_ID","AZURE_TENANT_ID","ACTIONS_ID_TOKEN_REQUEST_TOKEN","ACTIONS_RUNTIME_TOKEN","GITHUB_TOKEN","GH_TOKEN","GITLAB_TOKEN","CI_JOB_TOKEN","DATABASE_URL","REDIS_URL","REDIS_PASSWORD"]),iD=["_SECRET","_TOKEN","_PASSWORD","_CREDENTIAL","_API_KEY","SECRET_","TOKEN_","PASSWORD_","CREDENTIAL_","_AUTH_","PRIVATE_KEY"];function Sd(){let t={...process.env};for(let e of Object.keys(t))aD(e)&&delete t[e];return t}function aD(t){if(sD.has(t))return!0;let e=t.toUpperCase();for(let r of iD)if(e.includes(r))return!0;return!1}var fD=1800*1e3,Vs=process.cwd(),ay=process.cwd();function Xs(){return Vs}function Td(t,e){Vs=mD(t)?t:gD(e||Vs,t)}function cy(){return ay}function Ys(t){Vs=t,ay=t}var wd=null;function uo(t){wd={provider:t}}function ly(){if(!wd)throw new Error("Shell provider not configured. Call setShellProvider() at startup.");return wd.provider}async function Js(t,e,r,n){let{timeout:o,onProgress:s,preventCwdChanges:i,shouldAutoBackground:a,onStdout:c,cwd:l}=n??{},d=o||fD,p=r??gd(),u=ly(),m=fd(),{commandString:f,cwdFilePath:g}=await u.buildExecCommand(t,{id:m,useSandbox:!1}),h=f,b=l??Xs();try{await iy(b)}catch{let L=cy();try{await iy(L),Td(L),b=L}catch{return Rd(`Working directory "${b}" no longer exists.`)}}if(e.aborted)return Ks();let v=u.shellPath,R=u.getSpawnArgs(h),S=await u.getEnvironmentOverrides(t),T=!!c,C=Jt("local_bash"),E=new cr(C,s??null,!T);await uD(lo(),{recursive:!0});let M;if(!T){let L=zs.O_NOFOLLOW??0;M=await pD(E.path,process.platform==="win32"?"w":zs.O_WRONLY|zs.O_CREAT|zs.O_APPEND|L)}try{let L=cD(v,R,{env:{...Sd(),GIT_EDITOR:"true",QLOGICAGENT:"1",...S},cwd:b,stdio:T?["pipe","pipe","pipe"]:["pipe",M?.fd,M?.fd],detached:u.detached,windowsHide:!0}),k=kd(L,e,d,E,a);if(M!==void 0)try{await M.close()}catch{}return L.stdout&&c&&L.stdout.on("data",Q=>{c(typeof Q=="string"?Q:Q.toString())}),g&&k.result.then(Q=>{if(Q&&!i&&!Q.backgroundTaskId){try{let de=lD(g,{encoding:"utf8"}).trim();de&&de.normalize("NFC")!==b&&Td(de,b)}catch{}try{dD(g)}catch{}}}),k}catch(L){if(M!==void 0)try{await M.close()}catch{}return E.clear(),Ks(void 0,{code:126,stderr:L instanceof Error?L.message:String(L)})}}var vD="exec",bD={type:"object",properties:{command:{type:"string",description:Dr()?"Shell command to execute in PowerShell.":"Shell command to execute in bash. Use Unix-style commands (ls, cat, mkdir -p, etc.)."},description:{type:"string",description:'Clear, concise description of what this command does (e.g. "Install dependencies", "Run unit tests"). Used for UI display and permission logging. For simple commands keep it 5-10 words; for complex piped/flagged commands add enough context to clarify intent.'},workdir:{type:"string",description:"Working directory for the command."},timeout:{type:"number",description:"Timeout in milliseconds (default: 120000). Only applies to foreground commands. Max allowed: 600000 (10 min)."},background:{type:"boolean",description:"If true, start the command in the background and return immediately with a task ID. Use getOutput to check on it later. Good for dev servers, watchers, long builds. Default: false."}},required:["command"]},kD=12e4,RD=6e5,Qs=3e4;function po(t,e){if(t.length<=e)return t;let r=Math.floor(e/2)-50;return`${t.slice(0,r)}
|
|
235
|
+
`),parameters:G0,execute:async(t,e)=>({content:[{type:"text",text:"Thought recorded. Now proceed with the best action based on your reasoning."}],details:{type:"think"}})}}import{isAbsolute as hD,resolve as yD}from"node:path";var Qh=new Set(["find","grep","rg","ag","ack","locate","which","whereis"]),Zh=new Set(["cat","head","tail","less","more","wc","stat","file","strings","jq","awk","cut","sort","uniq","tr"]),ey=new Set(["ls","tree","du"]);var ty=new Set(["mv","cp","rm","mkdir","rmdir","chmod","chown","chgrp","touch","ln","cd","export","unset","wait"]);function K0(t){let r=t.replace(/\\\n/g," ").trim().split(/[|;&]/).shift()?.trim()??"";if(!r)return null;let n=r.split(/\s+/),o=0;for(;o<n.length&&/^[A-Za-z_]\w*=/.test(n[o]);)o++;let s=/^(?:timeout|time|nice|nohup|stdbuf|command|builtin|exec)$/;for(;o<n.length;){let c=n[o];if(s.test(c)){for(o++;o<n.length&&/^[-+]/.test(n[o]);)o++;o<n.length&&/^\d+(?:\.\d+)?[smhd]?$/.test(n[o])&&o++;continue}break}if(o>=n.length)return null;let i=n[o],a=i.lastIndexOf("/");return a>=0?i.slice(a+1):i}function ry(t){return/(?:^|[;&|])\s*(?:cd|pushd|popd)\b/.test(t)}function ud(t){let e=K0(t),r=e!==null&&Qh.has(e),n=e!==null&&Zh.has(e),o=e!==null&&ey.has(e),s=e!==null&&ty.has(e),i=/(?:[^2]>|^>|\|>)/.test(t),a=ry(t),c=(r||n||o)&&!i&&!a;return{firstCommand:e,isSearch:r,isRead:n,isList:o,isSilent:s,isConcurrencySafe:c,isReadOnly:c}}var z0=t=>({isError:t!==0,message:t!==0?`Command failed with exit code ${t}`:void 0}),V0=new Map([["grep",t=>({isError:t>=2,message:t===1?"No matches found":void 0})],["rg",t=>({isError:t>=2,message:t===1?"No matches found":void 0})],["egrep",t=>({isError:t>=2,message:t===1?"No matches found":void 0})],["fgrep",t=>({isError:t>=2,message:t===1?"No matches found":void 0})],["ag",t=>({isError:t>=2,message:t===1?"No matches found":void 0})],["find",t=>({isError:t>=2,message:t===1?"Some directories were inaccessible":void 0})],["diff",t=>({isError:t>=2,message:t===1?"Files differ":void 0})],["test",t=>({isError:t>=2,message:t===1?"Condition is false":void 0})],["[",t=>({isError:t>=2,message:t===1?"Condition is false":void 0})],["cmp",t=>({isError:t>=2,message:t===1?"Files differ":void 0})]]);function X0(t){let e=t.trim(),r=e.split(/\s*\|\s*/);return(r[r.length-1]??e).trim().split(/\s+/)[0]??""}function pd(t,e,r,n){let o=X0(t);return(V0.get(o)??z0)(e,r,n)}function md(t){return/(?:^|[;&|])\s*sleep\s+\d/i.test(t)?"sleep command blocks execution \u2014 use run_in_background: true":/\bwhile\s+(?:true|:|\[\s*1\s*\])\b/.test(t)?"infinite loop \u2014 use run_in_background: true or monitor tool":null}import{spawn as cD}from"node:child_process";import{constants as zs,readFileSync as lD,unlinkSync as dD}from"node:fs";import{mkdir as uD,open as pD,realpath as iy}from"node:fs/promises";import{isAbsolute as mD,resolve as gD}from"node:path";function Dr(){if(process.platform!=="win32")return!1;let t=process.env.QLOGICAGENT_USE_POWERSHELL;return t==="1"||t==="true"}function gd(){return Dr()?"powershell":"bash"}function fd(){return Math.floor(Math.random()*65536).toString(16).padStart(4,"0")}import{mkdir as Y0,readFile as J0,writeFile as Q0,unlink as Z0}from"node:fs/promises";import{join as ny}from"node:path";import{tmpdir as eD}from"node:os";var tD=8*1024*1024,rD=5*1024*1024*1024;var hd;function lo(){if(!hd){let t=Math.random().toString(36).slice(2,10);hd=ny(eD(),"qla-tasks",t)}return hd}function oy(t){return ny(lo(),`${t}.output`)}function Jt(t="local_bash"){return`${t}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}var cr=class{taskId;path;stdoutToFile;#e="";#r="";#o=0;#s=0;#t;#i;#n=0;#a=!1;constructor(e,r,n=!1,o=tD){this.taskId=e,this.path=oy(e),this.stdoutToFile=n,this.#t=o,this.#i=r}writeStdout(e){this.#e+=e,this.#s+=e.length,this.#o+=nD(e),this.#d()}writeStderr(e){this.#r+=e}async getStdout(){if(this.stdoutToFile)try{let e=await J0(this.path,"utf-8");return this.#n=Buffer.byteLength(e),e}catch{return""}return this.#e}getStderr(){return this.#r}get outputFileSize(){return this.#n}get outputFileRedundant(){return this.#n<=this.#t}#d(){this.#e.length>this.#t&&this.spillToDisk()}spillToDisk(){this.#e.length!==0&&Y0(lo(),{recursive:!0}).then(()=>Q0(this.path,this.#e).catch(()=>{}))}async deleteOutputFile(){try{await Z0(this.path)}catch{}}clear(){this.#a||(this.#a=!0,this.#e="",this.#r="",this.#i=null,this.deleteOutputFile())}};function nD(t){let e=0;for(let r=0;r<t.length;r++)t.charCodeAt(r)===10&&e++;return e}var yd=137,sy=143,oD=5e3,vd=5*1024*1024*1024,Gs=class{#e;#r;#o;#s=!1;constructor(e,r,n){this.#e=e,this.#r=r,this.#o=n,e.setEncoding("utf-8"),e.on("data",this.#t)}#t=e=>{let r=typeof e=="string"?e:e.toString();this.#o?this.#r.writeStderr(r):this.#r.writeStdout(r)};cleanup(){this.#s||(this.#s=!0,this.#e.removeListener("data",this.#t),this.#e=null,this.#r=null)}},bd=class t{#e="running";#r;#o;#s;#t;#i=null;#n=null;#a=!1;#d;#c;#u;#g;#v;#p=null;#m=null;#l=null;taskOutput;result;onTimeout;constructor(e,r,n,o,s=!1,i=vd){this.#t=e,this.#c=r,this.#g=n,this.#v=s,this.#d=i,this.taskOutput=o,this.#s=e.stderr?new Gs(e.stderr,o,!0):null,this.#o=e.stdout?new Gs(e.stdout,o,!1):null,s&&(this.onTimeout=a=>{this.#u=a}),this.result=this.#A()}get status(){return this.#e}static#k(e){e.#v&&e.#u?e.#u(e.background.bind(e)):e.#y(sy)}#R(){this.#c.reason!=="interrupt"&&this.kill()}#S(e,r){let n=e??(r==="SIGTERM"?144:1);this.#f(n)}#T(){this.#f(1)}#f(e){this.#m&&(this.#m(e),this.#m=null)}#h(){this.#b(),this.#i&&(clearTimeout(this.#i),this.#i=null),this.#l&&(this.#c.removeEventListener("abort",this.#l),this.#l=null)}#b(){this.#n&&(clearInterval(this.#n),this.#n=null)}#w(){this.#n=setInterval(()=>{import("node:fs/promises").then(({stat:e})=>e(this.taskOutput.path).then(r=>{r.size>this.#d&&this.#e==="backgrounded"&&this.#n!==null&&(this.#a=!0,this.#b(),this.#y(yd))},()=>{}))},oD),this.#n.unref?.()}#A(){this.#l=this.#R.bind(this),this.#c.addEventListener("abort",this.#l,{once:!0}),this.#t.once("exit",this.#S.bind(this)),this.#t.once("error",this.#T.bind(this)),this.#i=setTimeout(t.#k,this.#g,this);let e=new Promise(r=>{this.#m=r});return new Promise(r=>{this.#p=r,e.then(this.#P.bind(this))})}async#P(e){this.#h(),(this.#e==="running"||this.#e==="backgrounded")&&(this.#e="completed");let r=await this.taskOutput.getStdout(),n={code:e,stdout:r,stderr:this.taskOutput.getStderr(),interrupted:e===yd,backgroundTaskId:this.#r};this.taskOutput.stdoutToFile&&!this.#r&&(this.taskOutput.outputFileRedundant?this.taskOutput.deleteOutputFile():(n.outputFilePath=this.taskOutput.path,n.outputFileSize=this.taskOutput.outputFileSize)),this.#a?n.stderr=`Background command killed: output file exceeded ${vd} bytes. ${n.stderr}`:e===sy&&(n.stderr=`Command timed out after ${this.#g}ms. ${n.stderr}`),this.#p&&(this.#p(n),this.#p=null)}#y(e){this.#e="killed";let r=this.#t.pid;if(r)try{if(process.platform==="win32")import("node:child_process").then(({execSync:n})=>{try{n(`taskkill /PID ${r} /T /F`,{stdio:"ignore"})}catch{}});else try{process.kill(-r,"SIGKILL")}catch{try{process.kill(r,"SIGKILL")}catch{}}}catch{try{this.#t.kill("SIGKILL")}catch{}}this.#f(e??yd)}kill(){this.#y()}background(e){return this.#e==="running"?(this.#r=e,this.#e="backgrounded",this.#h(),this.taskOutput.stdoutToFile?this.#w():this.taskOutput.spillToDisk(),!0):!1}cleanup(){this.#o?.cleanup(),this.#s?.cleanup(),this.taskOutput.clear(),this.#h(),this.#t=null,this.#c=null,this.#u=void 0}};function kd(t,e,r,n,o=!1,s=vd){return new bd(t,e,r,n,o,s)}function Ks(t,e){let r=new cr(Jt("local_bash"),null);return{status:"killed",result:Promise.resolve({code:e?.code??145,stdout:"",stderr:e?.stderr??"Command aborted before execution",interrupted:!0,backgroundTaskId:t}),taskOutput:r,background:()=>!1,kill:()=>{},cleanup:()=>{}}}function Rd(t){let e=new cr(Jt("local_bash"),null);return{status:"completed",result:Promise.resolve({code:1,stdout:"",stderr:t,interrupted:!1,preSpawnError:t}),taskOutput:e,background:()=>!1,kill:()=>{},cleanup:()=>{}}}var sD=new Set(["API_KEY","ANTHROPIC_API_KEY","OPENAI_API_KEY","DEEPSEEK_API_KEY","DOUBAO_API_KEY","MINIMAX_API_KEY","GLM_API_KEY","KIMI_API_KEY","QWEN_API_KEY","MOONSHOT_API_KEY","ZHIPU_API_KEY","BAICHUAN_API_KEY","VOLCENGINE_API_KEY","AWS_SECRET_ACCESS_KEY","AWS_SESSION_TOKEN","GOOGLE_APPLICATION_CREDENTIALS","AZURE_CLIENT_SECRET","AZURE_CLIENT_ID","AZURE_TENANT_ID","ACTIONS_ID_TOKEN_REQUEST_TOKEN","ACTIONS_RUNTIME_TOKEN","GITHUB_TOKEN","GH_TOKEN","GITLAB_TOKEN","CI_JOB_TOKEN","DATABASE_URL","REDIS_URL","REDIS_PASSWORD"]),iD=["_SECRET","_TOKEN","_PASSWORD","_CREDENTIAL","_API_KEY","SECRET_","TOKEN_","PASSWORD_","CREDENTIAL_","_AUTH_","PRIVATE_KEY"];function Sd(){let t={...process.env};for(let e of Object.keys(t))aD(e)&&delete t[e];return t}function aD(t){if(sD.has(t))return!0;let e=t.toUpperCase();for(let r of iD)if(e.includes(r))return!0;return!1}var fD=1800*1e3,Vs=process.cwd(),ay=process.cwd();function Xs(){return Vs}function Td(t,e){Vs=mD(t)?t:gD(e||Vs,t)}function cy(){return ay}function Ys(t){Vs=t,ay=t}var wd=null;function uo(t){wd={provider:t}}function ly(){if(!wd)throw new Error("Shell provider not configured. Call setShellProvider() at startup.");return wd.provider}async function Js(t,e,r,n){let{timeout:o,onProgress:s,preventCwdChanges:i,shouldAutoBackground:a,onStdout:c,cwd:l}=n??{},d=o||fD,p=r??gd(),u=ly(),m=fd(),{commandString:f,cwdFilePath:g}=await u.buildExecCommand(t,{id:m,useSandbox:!1}),h=f,b=l??Xs();try{await iy(b)}catch{let L=cy();try{await iy(L),Td(L),b=L}catch{return Rd(`Working directory "${b}" no longer exists.`)}}if(e.aborted)return Ks();let v=u.shellPath,R=u.getSpawnArgs(h),S=await u.getEnvironmentOverrides(t),T=!!c,C=Jt("local_bash"),E=new cr(C,s??null,!T);await uD(lo(),{recursive:!0});let M;if(!T){let L=zs.O_NOFOLLOW??0;M=await pD(E.path,process.platform==="win32"?"w":zs.O_WRONLY|zs.O_CREAT|zs.O_APPEND|L)}try{let L=cD(v,R,{env:{...Sd(),GIT_EDITOR:"true",QLOGICAGENT:"1",...S},cwd:b,stdio:T?["pipe","pipe","pipe"]:["pipe",M?.fd,M?.fd],detached:u.detached,windowsHide:!0}),k=kd(L,e,d,E,a);if(M!==void 0)try{await M.close()}catch{}return L.stdout&&c&&L.stdout.on("data",Q=>{c(typeof Q=="string"?Q:Q.toString())}),g&&k.result.then(Q=>{if(Q&&!i&&!Q.backgroundTaskId){try{let de=lD(g,{encoding:"utf8"}).trim();de&&de.normalize("NFC")!==b&&Td(de,b)}catch{}try{dD(g)}catch{}}}),k}catch(L){if(M!==void 0)try{await M.close()}catch{}return E.clear(),Ks(void 0,{code:126,stderr:L instanceof Error?L.message:String(L)})}}var vD="exec",bD={type:"object",properties:{command:{type:"string",description:Dr()?"Shell command to execute in PowerShell.":"Shell command to execute in bash. Use Unix-style commands (ls, cat, mkdir -p, etc.)."},description:{type:"string",description:'Clear, concise description of what this command does (e.g. "Install dependencies", "Run unit tests"). Used for UI display and permission logging. For simple commands keep it 5-10 words; for complex piped/flagged commands add enough context to clarify intent.'},workdir:{type:"string",description:"Working directory for the command."},timeout:{type:"number",description:"Timeout in milliseconds (default: 120000). Only applies to foreground commands. Max allowed: 600000 (10 min)."},background:{type:"boolean",description:"If true, start the command in the background and return immediately with a task ID. Use getOutput to check on it later. Good for dev servers, watchers, long builds. Default: false."}},required:["command"]},kD=12e4,RD=6e5,Qs=3e4;function po(t,e){if(t.length<=e)return t;let r=Math.floor(e/2)-50;return`${t.slice(0,r)}
|
|
236
236
|
|
|
237
237
|
... [truncated ${t.length-e} chars] ...
|
|
238
238
|
|
|
@@ -240,7 +240,7 @@ ${t.slice(-r)}`}function SD(t){return t==null||t<=0?kD:Math.min(t,RD)}async func
|
|
|
240
240
|
IMPORTANT: Do NOT use this tool for file operations when dedicated tools exist. Use the 'write' tool instead of echo/cat/heredoc for creating files. Use the 'edit' tool instead of sed/awk for modifying files. Use the 'read' tool instead of cat/head/tail for reading files. Reserve this tool exclusively for system commands, builds, tests, and terminal operations that require shell execution.`,searchHint:"execute shell commands",parameters:bD,maxResultSizeChars:Qs,execute:async(e,r)=>{let n=ud(r.command);if(!r.background){let m=md(r.command);if(m)return{content:[{type:"text",text:`Command blocked: ${m}`}],details:{type:"exec",error:"blocked_sleep_pattern",classification:n}}}if(t.validateCommand){let m=await t.validateCommand(r.command);if(m)return{content:[{type:"text",text:`Command blocked: ${m}`}],details:{type:"exec",error:"blocked_by_guard",reason:m,classification:n}}}let o=new AbortController,s=SD(r.timeout),i=r.workdir?hD(r.workdir)?r.workdir:yD(Xs(),r.workdir):void 0;if(r.background){let m=await Js(r.command,o.signal,void 0,{shouldAutoBackground:!1,cwd:i}),f=Jt("bg");if(m.background(f))return{content:[{type:"text",text:`Background task started (id: ${f}).
|
|
241
241
|
Use getOutput to check on it later.`}],details:{type:"exec_background",backgroundTaskId:f,description:r.description,classification:n}}}let a=TD({command:r.command,abortController:o,timeout:s,shouldAutoBackground:!0,cwd:i}),c;do c=await a.next(),!c.done&&t.onProgress&&t.onProgress(c.value);while(!c.done);let l=c.value,d=[];if(l.backgroundTaskId)return{content:[{type:"text",text:`Command auto-backgrounded (task: ${l.backgroundTaskId}).`}],details:{type:"exec_background",backgroundTaskId:l.backgroundTaskId,assistantAutoBackgrounded:l.assistantAutoBackgrounded,classification:n}};l.outputFilePath?(d.push(po(l.stdout,Qs)),d.push(`[full output: ${l.outputFilePath} (${l.outputFileSize} bytes)]`)):l.stdout&&d.push(po(l.stdout,Qs)),l.stderr&&d.push(`[stderr]
|
|
242
242
|
${po(l.stderr,Math.floor(Qs/4))}`),l.interrupted&&d.push(`[interrupted \u2014 exit code ${l.code}]`);let p=l.code!==0?pd(r.command,l.code,l.stdout,l.stderr):void 0;p&&!p.isError&&p.message&&d.push(`[exit ${l.code}: ${p.message}]`);let u;return l.code!==0&&t.interpretExitCode&&(!p||p.isError)&&(u=t.interpretExitCode(l.code,l.stderr),u&&d.push(`[exit ${l.code}: ${u}]`)),d.length===0&&d.push(n.isSilent&&l.code===0?"Done":`(exit code ${l.code}, no output)`),{content:[{type:"text",text:d.join(`
|
|
243
|
-
`)}],details:{type:"exec",exitCode:l.code,interrupted:l.interrupted,stdout:po(l.stdout,8e3),stderr:po(l.stderr,4e3),description:r.description,returnCodeInterpretation:u??p?.message,noOutputExpected:n.isSilent,outputFilePath:l.outputFilePath,semanticNonError:p?!p.isError:void 0,classification:n}}}}}import{tmpdir as wD}from"node:os";import{join as
|
|
243
|
+
`)}],details:{type:"exec",exitCode:l.code,interrupted:l.interrupted,stdout:po(l.stdout,8e3),stderr:po(l.stderr,4e3),description:r.description,returnCodeInterpretation:u??p?.message,noOutputExpected:n.isSilent,outputFilePath:l.outputFilePath,semanticNonError:p?!p.isError:void 0,classification:n}}}}}import{tmpdir as wD}from"node:os";import{join as AD,posix as Ad}from"node:path";function PD(t){return t.replace(/(\d?)>nul\b/gi,(e,r)=>`${r||""}>/dev/null`)}function xD(t){return!(/(?:^|[;&|])\s*<\s/.test(t)||/<<[-]?\s*['"]?[A-Za-z_]/.test(t))}function CD(t,e){return`$'${t.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\n/g,"\\n")}'${e?" < /dev/null":""}`}function uy(t){return process.platform!=="win32"?t:t.replace(/^([A-Za-z]):/,(e,r)=>`/${r.toLowerCase()}`).replace(/\\/g,"/")}function Zs(t,e){let r=e?.snapshotFilePath;return{type:"bash",shellPath:t,detached:!0,async buildExecCommand(n,o){let s=process.platform==="win32",i=wD(),a=s?uy(i):i,c=o.useSandbox&&o.sandboxTmpDir?Ad.join(o.sandboxTmpDir,`cwd-${o.id}`):Ad.join(a,`qla-${o.id}-cwd`),l=o.useSandbox&&o.sandboxTmpDir?Ad.join(o.sandboxTmpDir,`cwd-${o.id}`):AD(i,`qla-${o.id}-cwd`),d=PD(n),p=xD(d),u=CD(d,p),m=[];if(r){let g=s?uy(r):r;m.push(`source '${g}' 2>/dev/null || true`)}return e?.sessionEnvScript&&m.push(e.sessionEnvScript),m.push(`eval ${u}`),m.push(`pwd -P >| '${c}'`),{commandString:m.join(" && "),cwdFilePath:l}},getSpawnArgs(n){return["-c",...!!r?[]:["-l"],n]},async getEnvironmentOverrides(n){return{GIT_EDITOR:"true",QLOGICAGENT:"1"}}}}import{tmpdir as ID}from"node:os";import{join as ED,posix as MD}from"node:path";function py(t){return Buffer.from(t,"utf16le").toString("base64")}function _D(t){return["-NoProfile","-NonInteractive","-Command",t]}function Pd(t){return{type:"powershell",shellPath:t,detached:!1,async buildExecCommand(e,r){let n=r.useSandbox&&r.sandboxTmpDir?MD.join(r.sandboxTmpDir,`qla-pwd-ps-${r.id}`):ED(ID(),`qla-pwd-ps-${r.id}`),s=["","$_ec = if ($null -ne $LASTEXITCODE) { $LASTEXITCODE } elseif ($?) { 0 } else { 1 }",`(Get-Location).Path | Out-File -FilePath '${n.replace(/'/g,"''")}' -Encoding utf8 -NoNewline`,"exit $_ec"].join(`
|
|
244
244
|
; `),i=e+s;return{commandString:r.useSandbox?[`'${t.replace(/'/g,"'\\''")}'`,"-NoProfile","-NonInteractive","-EncodedCommand",py(i)].join(" "):i,cwdFilePath:n}},getSpawnArgs(e){return _D(e)},async getEnvironmentOverrides(e){return{QLOGICAGENT:"1"}}}}var DD=[{pattern:/\bgit\s+reset\s+--hard\b/,warning:"Note: may discard uncommitted changes"},{pattern:/\bgit\s+push\b[^;&|\n]*[ \t](--force|--force-with-lease|-f)\b/,warning:"Note: may overwrite remote history"},{pattern:/\bgit\s+clean\b(?![^;&|\n]*(?:-[a-zA-Z]*n|--dry-run))[^;&|\n]*-[a-zA-Z]*f/,warning:"Note: may permanently delete untracked files"},{pattern:/\bgit\s+checkout\s+(--\s+)?\.[ \t]*($|[;&|\n])/,warning:"Note: may discard all working tree changes"},{pattern:/\bgit\s+restore\s+(--\s+)?\.[ \t]*($|[;&|\n])/,warning:"Note: may discard all working tree changes"},{pattern:/\bgit\s+stash[ \t]+(drop|clear)\b/,warning:"Note: may permanently remove stashed changes"},{pattern:/\bgit\s+branch\s+(-D[ \t]|--delete\s+--force|--force\s+--delete)\b/,warning:"Note: may force-delete a branch"},{pattern:/\bgit\s+(commit|push|merge)\b[^;&|\n]*--no-verify\b/,warning:"Note: may skip safety hooks"},{pattern:/\bgit\s+commit\b[^;&|\n]*--amend\b/,warning:"Note: may rewrite the last commit"},{pattern:/(^|[;&|\n]\s*)rm\s+-[a-zA-Z]*[rR][a-zA-Z]*f|(^|[;&|\n]\s*)rm\s+-[a-zA-Z]*f[a-zA-Z]*[rR]/,warning:"Note: may recursively force-remove files"},{pattern:/(^|[;&|\n]\s*)rm\s+-[a-zA-Z]*[rR]/,warning:"Note: may recursively remove files"},{pattern:/(^|[;&|\n]\s*)rm\s+-[a-zA-Z]*f/,warning:"Note: may force-remove files"},{pattern:/\b(DROP|TRUNCATE)\s+(TABLE|DATABASE|SCHEMA)\b/i,warning:"Note: may drop or truncate database objects"},{pattern:/\bDELETE\s+FROM\s+\w+[ \t]*(;|"|'|\n|$)/i,warning:"Note: may delete all rows from a database table"},{pattern:/\bkubectl\s+delete\b/,warning:"Note: may delete Kubernetes resources"},{pattern:/\bterraform\s+destroy\b/,warning:"Note: may destroy Terraform infrastructure"}],ND=[{pattern:/(?:^|[|;&\n({])\s*(Remove-Item|rm|del|rd|rmdir|ri)\b[^|;&\n}]*-Recurse\b[^|;&\n}]*-Force\b/i,warning:"Note: may recursively force-remove files"},{pattern:/(?:^|[|;&\n({])\s*(Remove-Item|rm|del|rd|rmdir|ri)\b[^|;&\n}]*-Force\b[^|;&\n}]*-Recurse\b/i,warning:"Note: may recursively force-remove files"},{pattern:/(?:^|[|;&\n({])\s*(Remove-Item|rm|del|rd|rmdir|ri)\b[^|;&\n}]*-Recurse\b/i,warning:"Note: may recursively remove files"},{pattern:/(?:^|[|;&\n({])\s*(Remove-Item|rm|del|rd|rmdir|ri)\b[^|;&\n}]*-Force\b/i,warning:"Note: may force-remove files"},{pattern:/\bClear-Content\b[^|;&\n]*\*/i,warning:"Note: may clear content of multiple files"},{pattern:/\bFormat-Volume\b/i,warning:"Note: may format a disk volume"},{pattern:/\bClear-Disk\b/i,warning:"Note: may clear a disk"},{pattern:/\bgit\s+reset\s+--hard\b/i,warning:"Note: may discard uncommitted changes"},{pattern:/\bgit\s+push\b[^|;&\n]*\s+(--force|--force-with-lease|-f)\b/i,warning:"Note: may overwrite remote history"},{pattern:/\bgit\s+clean\b(?![^|;&\n]*(?:-[a-zA-Z]*n|--dry-run))[^|;&\n]*-[a-zA-Z]*f/i,warning:"Note: may permanently delete untracked files"},{pattern:/\bgit\s+stash\s+(drop|clear)\b/i,warning:"Note: may permanently remove stashed changes"},{pattern:/\b(DROP|TRUNCATE)\s+(TABLE|DATABASE|SCHEMA)\b/i,warning:"Note: may drop or truncate database objects"},{pattern:/\bStop-Computer\b/i,warning:"Note: will shut down the computer"},{pattern:/\bRestart-Computer\b/i,warning:"Note: will restart the computer"},{pattern:/\bClear-RecycleBin\b/i,warning:"Note: permanently deletes recycled files"}];function xd(t){for(let{pattern:e,warning:r}of DD)if(e.test(t))return r;return null}function Cd(t){for(let{pattern:e,warning:r}of ND)if(e.test(t))return r;return null}var LD="read",OD={type:"object",properties:{path:{type:"string",description:"Absolute path to the file to read."},offset:{type:"number",description:"Line number to start reading from (1-indexed). Default: 1."},limit:{type:"number",description:"Maximum number of lines to read. Default/max: 2000."}},required:["path"]};function my(t){return{name:LD,label:"Read File",description:"Read the contents of a file. Supports text files and images (jpg, png, gif, webp). For text files, output is truncated to 2000 lines or 50KB. Binary files are rejected with a hint. Use offset/limit for pagination of large files.",parameters:OD,isReadOnly:!0,execute:async(n,o)=>{let s=t.resolvePath(o.path);if(t.validatePath){let g=t.validatePath(s);if(g)return{content:[{type:"text",text:`Access denied: ${g}`}],details:{type:"read",path:s,error:"access_denied"}}}let i=await t.readFile(s);if(i.type==="image")return{content:[{type:"text",text:`[Image: ${s}] (${i.mimeType})`}],details:{type:"read",path:s,isImage:!0},imageUrls:[i.localPath]};if(i.type==="binary")return{content:[{type:"text",text:`Cannot read binary file (${i.mimeType}). Use a specific tool for this file type (e.g. pdf tool for PDFs).`}],details:{type:"read",path:s,error:"binary_file",mimeType:i.mimeType}};let a=i.text.split(`
|
|
245
245
|
`),c=Math.max(0,(o.offset??1)-1),l=Math.min(o.limit??2e3,2e3),d=a.slice(c,c+l),p=d.join(`
|
|
246
246
|
`);p.length>5e4&&(p=p.slice(0,5e4)+`
|
|
@@ -275,7 +275,7 @@ ${t.slice(-r)}`}var KD="apply_patch",zD={type:"object",properties:{input:{type:"
|
|
|
275
275
|
Fuzzy matching automatically handles whitespace/indent/unicode drift in the search text.`},replaceAll:{type:"boolean",description:"Replace all occurrences instead of first only (default: false)."}},required:["input"]};function QD(t){return t.replace(/\\n/g,`
|
|
276
276
|
`).replace(/\\t/g," ").replace(/\\'/g,"'").replace(/\\"/g,'"')}function Ry(t){return t.replace(/[\u201c\u201d\u201e\u201f]/g,'"').replace(/[\u2018\u2019\u201a\u201b]/g,"'").replace(/\u2014/g,"--").replace(/\u2013/g,"-").replace(/\u2026/g,"...").replace(/\u00a0/g," ")}function Sy(t,e){if(t===e||Math.max(t.length,e.length)===0)return 1;let n=0,o=t.length,s=e.length,i=Math.max(o,s);for(let a=0;a<Math.min(o,s);a++)t[a]!==e[a]&&n++;return n+=Math.abs(o-s),1-n/i}function Cy(t,e,r){let n=[],o=t.indexOf(e);if(o!==-1){if(r){let g=0;for(;(o=t.indexOf(e,g))!==-1;)n.push({start:o,end:o+e.length,strategy:"exact"}),g=o+e.length}else n.push({start:o,end:o+e.length,strategy:"exact"});return n}let s=e.split(`
|
|
277
277
|
`).map(g=>g.trim()),i=t.split(`
|
|
278
|
-
`),a=Ty(i,s,(g,h)=>g.trim()===h);if(a)return[{...wy(t,i,a),strategy:"line_trimmed"}];let c=e.replace(/[ \t]+/g," "),l=t.replace(/[ \t]+/g," ");if(o=l.indexOf(c),o!==-1){let g=
|
|
278
|
+
`),a=Ty(i,s,(g,h)=>g.trim()===h);if(a)return[{...wy(t,i,a),strategy:"line_trimmed"}];let c=e.replace(/[ \t]+/g," "),l=t.replace(/[ \t]+/g," ");if(o=l.indexOf(c),o!==-1){let g=Ay(t,l,o,c.length);if(g)return[{...g,strategy:"whitespace_normalized"}]}let d=Ty(i,s,(g,h)=>g.trimStart()===h.trimStart());if(d)return[{...wy(t,i,d),strategy:"indentation_flexible"}];let p=QD(e);if(p!==e&&(o=t.indexOf(p),o!==-1))return[{start:o,end:o+p.length,strategy:"escape_normalized"}];let u=e.split(`
|
|
279
279
|
`);if(u.length>=3){let g=u.slice(1,-1).join(`
|
|
280
280
|
`),h=u[0].trim(),b=u[u.length-1].trim();for(let v=0;v<i.length;v++)if(i[v].trim()===h){let R=i.slice(0,v+1).join(`
|
|
281
281
|
`).length+1,S=t.indexOf(g,R);if(S!==-1){let T=S+g.length,C=t.indexOf(`
|
|
@@ -283,13 +283,13 @@ Fuzzy matching automatically handles whitespace/indent/unicode drift in the sear
|
|
|
283
283
|
`,T+1)===-1?void 0:t.indexOf(`
|
|
284
284
|
`,T+1)).trim()===b){let M=i.slice(0,v).join(`
|
|
285
285
|
`).length+(v>0?1:0),L=v,k=u.length;if(v+k<=i.length){L=v+k;let Q=i.slice(0,L).join(`
|
|
286
|
-
`).length;return[{start:M,end:Q,strategy:"trimmed_boundary"}]}}}}}let m=Ry(e),f=Ry(t);if((m!==e||f!==t)&&(o=f.indexOf(m),o!==-1)){let g=
|
|
286
|
+
`).length;return[{start:M,end:Q,strategy:"trimmed_boundary"}]}}}}}let m=Ry(e),f=Ry(t);if((m!==e||f!==t)&&(o=f.indexOf(m),o!==-1)){let g=Ay(t,f,o,m.length);if(g)return[{...g,strategy:"unicode_normalized"}]}if(u.length>=3){let g=u[0],h=u[u.length-1];for(let b=0;b<i.length;b++)if(i[b]===g){for(let v=b+u.length-1;v<Math.min(b+u.length+2,i.length);v++)if(i[v]===h){let R=v-b+1,S=i.slice(b+1,v),T=u.slice(1,-1),C=T.filter(M=>S.some(L=>Sy(L,M)>=.7)).length;if((T.length>0?C/T.length:1)>=.5&&R<=u.length+2){let M=i.slice(0,b).join(`
|
|
287
287
|
`).length+(b>0?1:0),L=i.slice(0,v+1).join(`
|
|
288
288
|
`).length;return[{start:M,end:L,strategy:"block_anchor"}]}}}}if(u.length>=2)for(let g=0;g<=i.length-u.length;g++){let h=i.slice(g,g+u.length);if(u.map((R,S)=>Sy(R,h[S])).filter(R=>R>=.8).length/u.length>=.5){let R=i.slice(0,g).join(`
|
|
289
289
|
`).length+(g>0?1:0),S=i.slice(0,g+u.length).join(`
|
|
290
290
|
`).length;return[{start:R,end:S,strategy:"context_aware"}]}}return[]}function Ty(t,e,r){for(let n=0;n<=t.length-e.length;n++){let o=!0;for(let s=0;s<e.length;s++)if(!r(t[n+s],e[s])){o=!1;break}if(o)return{startIdx:n,endIdx:n+e.length}}return null}function wy(t,e,r){let n=e.slice(0,r.startIdx).join(`
|
|
291
291
|
`).length+(r.startIdx>0?1:0),o=e.slice(0,r.endIdx).join(`
|
|
292
|
-
`).length;return{start:n,end:o}}function
|
|
292
|
+
`).length;return{start:n,end:o}}function Ay(t,e,r,n){let o=0,s=0,i=-1,a=-1;for(;o<=t.length&&s<=e.length;){if(s===r&&i===-1&&(i=o),s===r+n){a=o;break}if(s>=e.length||o>=t.length)break;for(s++,o++;o<t.length&&s<e.length&&t[o]!==e[s];)o++}return i!==-1&&a===-1&&(a=t.length),i===-1?null:{start:i,end:a}}function Py(t){let e=t.split(`
|
|
293
293
|
`),r=[],n=null,o=null,s=!1;for(let i of e){if(i.startsWith("*** Begin Patch")){s=!0;continue}if(i.startsWith("*** End Patch"))break;if(s)if(i.startsWith("*** Add File: "))n&&r.push(n),n={type:"add",path:i.slice(14).trim(),hunks:[]},o={lines:[]},n.hunks.push(o);else if(i.startsWith("*** Update File: "))n&&r.push(n),n={type:"update",path:i.slice(17).trim(),hunks:[]},o=null;else if(i.startsWith("*** Delete File: "))n&&r.push(n),n={type:"delete",path:i.slice(17).trim(),hunks:[]},o=null;else if(i.startsWith("*** Move File: ")){n&&r.push(n);let a=i.slice(15).trim().split(" -> ");n={type:"move",path:a[0].trim(),newPath:a[1]?.trim(),hunks:[]},o=null}else i.startsWith("@@ ")&&n?(o={contextHint:i.slice(3).replace(/ @@$/,"").trim()||void 0,lines:[]},n.hunks.push(o)):o&&(i.startsWith("+")?o.lines.push({prefix:"+",content:i.slice(1)}):i.startsWith("-")?o.lines.push({prefix:"-",content:i.slice(1)}):o.lines.push({prefix:" ",content:i.startsWith(" ")?i.slice(1):i}))}return n&&r.push(n),r}function ZD(t){let e=[],r=t.split(/^(<<<< SEARCH)$/m);if(r.length<2)return[];let n=r[0].trim().split(`
|
|
294
294
|
`).pop()?.trim();if(!n)return[];for(let o=1;o<r.length;o+=2){let s=r[o+1]||"",i=s.indexOf(`
|
|
295
295
|
====
|
|
@@ -298,10 +298,10 @@ Fuzzy matching automatically handles whitespace/indent/unicode drift in the sear
|
|
|
298
298
|
`);if(!c)return{content:t+`
|
|
299
299
|
`+s.join(`
|
|
300
300
|
`),strategy:"exact"};let l=Cy(t,c,r);if(l.length===0)return null;let d=[];for(let f of e.lines)(f.prefix===" "||f.prefix==="+")&&d.push(f.content);let p=d.join(`
|
|
301
|
-
`),u=l[0];return{content:t.slice(0,u.start)+p+t.slice(u.end),strategy:u.strategy}}function Md(t){return{name:YD,label:"Patch",description:"Apply edits to files using fuzzy matching. Supports V4A unified diff format (*** Begin Patch / *** End Patch) for multi-file operations, and simple search/replace blocks. The fuzzy matcher handles whitespace, indentation, unicode, and escape drift \u2014 LLM output with minor formatting differences will still match correctly.",parameters:JD,execute:async(e,r)=>{let n=r.replaceAll??!1,o={filesModified:[],filesAdded:[],filesDeleted:[],strategies:{},errors:[]},s=r.input.includes("*** Begin Patch"),i=r.input.includes("<<<< SEARCH");if(s){let l=
|
|
301
|
+
`),u=l[0];return{content:t.slice(0,u.start)+p+t.slice(u.end),strategy:u.strategy}}function Md(t){return{name:YD,label:"Patch",description:"Apply edits to files using fuzzy matching. Supports V4A unified diff format (*** Begin Patch / *** End Patch) for multi-file operations, and simple search/replace blocks. The fuzzy matcher handles whitespace, indentation, unicode, and escape drift \u2014 LLM output with minor formatting differences will still match correctly.",parameters:JD,execute:async(e,r)=>{let n=r.replaceAll??!1,o={filesModified:[],filesAdded:[],filesDeleted:[],strategies:{},errors:[]},s=r.input.includes("*** Begin Patch"),i=r.input.includes("<<<< SEARCH");if(s){let l=Py(r.input);if(l.length===0)return{content:[{type:"text",text:"Error: No valid V4A operations found. Ensure *** Begin Patch / *** End Patch markers are present."}],details:{type:"patch",error:"parse_failed"}};for(let d of l){let p=t.resolvePath(d.path);try{switch(d.type){case"add":{let u=d.hunks.flatMap(m=>m.lines.filter(f=>f.prefix==="+").map(f=>f.content)).join(`
|
|
302
302
|
`);await t.writeFile(p,u),o.filesAdded.push(d.path),o.strategies[d.path]="exact";break}case"delete":{await t.deleteFile(p),o.filesDeleted.push(d.path);break}case"move":{let u=await t.readFile(p);if(d.newPath){let m=t.resolvePath(d.newPath),f=u;for(let g of d.hunks){let h=xy(f,g,n);h&&(f=h.content,o.strategies[d.path]=h.strategy)}await t.writeFile(m,f),await t.deleteFile(p),o.filesModified.push(`${d.path} \u2192 ${d.newPath}`)}break}case"update":{let u=await t.readFile(p),m="exact",f=!0;for(let g of d.hunks){let h=xy(u,g,n);if(h)u=h.content,m=h.strategy;else{f=!1;let b=g.lines.filter(v=>v.prefix===" "||v.prefix==="-").map(v=>v.content).slice(0,5).join(`
|
|
303
303
|
`);o.errors.push(`${d.path}: hunk not matched. Search begins with:
|
|
304
|
-
${b}`)}}(f||u!==await t.readFile(p))&&(await t.writeFile(p,u),o.filesModified.push(d.path),o.strategies[d.path]=m);break}}}catch(u){o.errors.push(`${d.type} ${d.path}: ${u instanceof Error?u.message:String(u)}`)}}}else if(i){let l=ZD(r.input);if(l.length===0)return{content:[{type:"text",text:"Error: Invalid search/replace format. Use <<<< SEARCH / ==== / >>>> REPLACE blocks."}],details:{type:"patch",error:"parse_failed"}};for(let d of l){let p=t.resolvePath(d.path);try{let u=await t.readFile(p),m=Cy(u,d.search,n);if(m.length===0){o.errors.push(`${d.path}: search text not matched (tried all 9 strategies)`);continue}let f=[...m].sort((g,h)=>h.start-g.start);for(let g of f)u=u.slice(0,g.start)+d.replace+u.slice(g.end);await t.writeFile(p,u),o.filesModified.push(d.path),o.strategies[d.path]=m[0].strategy}catch(u){o.errors.push(`${d.path}: ${u instanceof Error?u.message:String(u)}`)}}}else return
|
|
304
|
+
${b}`)}}(f||u!==await t.readFile(p))&&(await t.writeFile(p,u),o.filesModified.push(d.path),o.strategies[d.path]=m);break}}}catch(u){o.errors.push(`${d.type} ${d.path}: ${u instanceof Error?u.message:String(u)}`)}}}else if(i){let l=ZD(r.input);if(l.length===0)return{content:[{type:"text",text:"Error: Invalid search/replace format. Use <<<< SEARCH / ==== / >>>> REPLACE blocks."}],details:{type:"patch",error:"parse_failed"}};for(let d of l){let p=t.resolvePath(d.path);try{let u=await t.readFile(p),m=Cy(u,d.search,n);if(m.length===0){o.errors.push(`${d.path}: search text not matched (tried all 9 strategies)`);continue}let f=[...m].sort((g,h)=>h.start-g.start);for(let g of f)u=u.slice(0,g.start)+d.replace+u.slice(g.end);await t.writeFile(p,u),o.filesModified.push(d.path),o.strategies[d.path]=m[0].strategy}catch(u){o.errors.push(`${d.path}: ${u instanceof Error?u.message:String(u)}`)}}}else return Py(`*** Begin Patch
|
|
305
305
|
`+r.input+`
|
|
306
306
|
*** End Patch`).length>0?Md(t).execute(e,{input:`*** Begin Patch
|
|
307
307
|
`+r.input+`
|
|
@@ -339,8 +339,8 @@ New: ${e.new_source.slice(0,120)}${e.new_source.length>120?"...":""}`;break}case
|
|
|
339
339
|
... and ${a.cells.length-10} more cells`:"";return{content:[{type:"text",text:`${d}
|
|
340
340
|
|
|
341
341
|
Current cells:
|
|
342
|
-
${p}${u}`}],details:{type:"notebook_edit",edit_mode:o,cell_number:n,total_cells:a.cells.length}}}}}import{randomUUID as
|
|
343
|
-
`),{count:o.length})}case"get":{if(!r.workflowId)return be("Error: workflowId is required for get.");let o=await n.get(r.workflowId);return be(JSON.stringify(o,null,2),{workflowId:o.id,rev:o.rev})}case"describe":return r.workflowId?be(await n.describe(r.workflowId),{workflowId:r.workflowId}):be("Error: workflowId is required for describe.");case"create":{if(!r.def)return be("Error: def is required for create.");let o=r.workflowId??`wf_${
|
|
342
|
+
${p}${u}`}],details:{type:"notebook_edit",edit_mode:o,cell_number:n,total_cells:a.cells.length}}}}}import{randomUUID as AN}from"node:crypto";var PN={type:"object",properties:{action:{type:"string",enum:["list","get","describe","create","patch","setActive","run","delete"],description:"list/get/describe/create/patch/setActive/run/delete."},workflowId:{type:"string",description:"Workflow id (required for all but list/create)."},name:{type:"string",description:"Human-readable name (create)."},def:{type:"object",description:"WorkflowDef { nodes, edges, trigger? } (create)."},patch:{type:"array",description:"WorkflowPatch op array (patch)."},baseRev:{type:"number",description:"Optimistic-concurrency base revision (patch)."},scope:{type:"array",items:{type:"string"},description:"Node ids to confine the patch to (scoped/\u6846\u9009\u6279\u6CE8 edit)."},active:{type:"boolean",description:"Activation flag (create/setActive)."}},required:["action"]};function be(t,e){return{content:[{type:"text",text:t}],details:{type:"workflow",...e}}}function Jy(t){return{name:"workflow",label:"Workflow",description:"Author and manage automation workflows on the unified engine. Workflows persist in .qlogicagent/workflows and are run by triggers (cron/IM/webhook) or the app. Actions: list, get, describe, create, patch (incl. scoped edits), setActive, run, delete.",parameters:PN,shouldDefer:!0,isConcurrencySafe:!1,isReadOnly:!1,searchHint:"workflow automation create edit run schedule trigger",execute:async(e,r)=>{let n=t.getService();switch(r.action){case"list":{let o=await n.list();if(o.length===0)return be("No workflows yet. Use action=create.",{count:0});let s=o.map(i=>` - ${i.id}: ${i.name} (rev ${i.rev}${i.active?", active":""})`);return be(["Workflows:",...s].join(`
|
|
343
|
+
`),{count:o.length})}case"get":{if(!r.workflowId)return be("Error: workflowId is required for get.");let o=await n.get(r.workflowId);return be(JSON.stringify(o,null,2),{workflowId:o.id,rev:o.rev})}case"describe":return r.workflowId?be(await n.describe(r.workflowId),{workflowId:r.workflowId}):be("Error: workflowId is required for describe.");case"create":{if(!r.def)return be("Error: def is required for create.");let o=r.workflowId??`wf_${AN().slice(0,8)}`,s=await n.create({id:o,name:r.name??o,def:r.def,active:r.active===!0});return be(`Created workflow "${s.id}" (rev ${s.rev}).`,{workflowId:s.id,rev:s.rev})}case"patch":{if(!r.workflowId||!r.patch)return be("Error: workflowId and patch are required for patch.");let o=await n.patch(r.workflowId,{patch:r.patch,baseRev:r.baseRev,scope:r.scope});return be(JSON.stringify(o),{workflowId:r.workflowId})}case"setActive":{if(!r.workflowId||typeof r.active!="boolean")return be("Error: workflowId and boolean active are required for setActive.");let o=await n.setActive(r.workflowId,r.active);return be(`Workflow "${o.id}" active=${o.active}.`,{workflowId:o.id})}case"run":{if(!r.workflowId)return be("Error: workflowId is required for run.");let o=await n.run(r.workflowId);return be(`Run "${r.workflowId}": ${o.status}.`,{workflowId:r.workflowId,status:o.status})}case"delete":return r.workflowId?(await n.delete(r.workflowId),be(`Deleted workflow "${r.workflowId}".`,{workflowId:r.workflowId})):be("Error: workflowId is required for delete.");default:return be(`Error: unknown action "${r.action}".`)}}}}var xN="sleep",CN={type:"object",properties:{duration:{type:"number",description:"Duration to sleep in seconds (1\u20133600). Prefer short sleeps (10\u201360s) to stay responsive.",minimum:1,maximum:3600},reason:{type:"string",description:'Brief reason for sleeping. Examples: "waiting for build to finish", "nothing to do", "user asked to rest".'}},required:["duration"]};function Qy(t){return{name:xN,label:"Sleep",shouldDefer:!0,isConcurrencySafe:!0,isReadOnly:!0,searchHint:"wait sleep rest idle tick proactive",description:["Wait for a specified duration. The user can interrupt the sleep at any time.","","Use this when:","\u2022 You have nothing useful to do right now","\u2022 You're waiting for an external process to complete","\u2022 The user tells you to sleep or rest","\u2022 You receive a <tick> check-in with no actionable work","","Prefer this over `exec(sleep ...)` \u2014 it doesn't hold a shell process.","You can call this concurrently with other tools \u2014 it won't interfere with them.","","Each wake-up costs an API call, but the prompt cache expires after 5 minutes of inactivity \u2014 balance accordingly."].join(`
|
|
344
344
|
`),parameters:CN,execute:async(e,r,n)=>{let o=Math.max(1,Math.min(3600,Math.round(r.duration))),s=o*1e3,i=new AbortController,a=()=>i.abort();n?.addEventListener("abort",a,{once:!0}),n?.aborted&&i.abort();try{let c=await t.sleep(s,i.signal),l=[];return c.interrupted?(l.push(`Sleep interrupted after ${c.sleptSeconds}s.`),c.interruptReason&&l.push(`Reason: ${c.interruptReason}`),l.push("Check for new messages or tasks.")):l.push(`Slept for ${c.sleptSeconds}s. Waking up.`),{content:[{type:"text",text:l.join(`
|
|
345
345
|
`)}],details:{...c,requestedSeconds:o}}}finally{n?.removeEventListener("abort",a)}}}}var IN="tool_search",EN={type:"object",properties:{query:{type:"string",description:'Search query for tools. Use "select:toolName" to directly activate a deferred tool, or provide keywords to search tool names/descriptions. Prefix a term with "+" to mark it as required (all +terms must match).'},maxResults:{type:"number",description:"Maximum number of results to return (default: 5)."}},required:["query"]},MN=5;function ev(t){return{name:IN,label:"Tool Search",description:'Search for available tools that are not currently loaded. Many tools are deferred to save context tokens. Use "select:toolName" to directly activate a tool, or provide keywords to find relevant tools. Activated tools become available in subsequent messages.',parameters:EN,execute:async(e,r)=>{if(!r.query||r.query.trim().length===0)return{content:[{type:"text",text:"Error: query is required."}],details:{type:"tool_search",error:"empty_query"}};let n=r.query.trim(),o=r.maxResults??MN;if(n.startsWith("select:")){let i=n.slice(7).split(",").map(d=>d.trim()).filter(Boolean),a=[],c=[];if(t.activateTool)for(let d of i)await t.activateTool(d)?a.push(d):c.push(d);else{let d=await t.searchTools(n,{maxResults:o});return Zy(d)}let l=[];return a.length>0&&l.push(`Activated: ${a.join(", ")}. These tools are now available.`),c.length>0&&l.push(`Not found: ${c.join(", ")}.`),{content:[{type:"text",text:l.join(`
|
|
346
346
|
`)}],details:{type:"tool_search",activated:a,notFound:c,mode:"select"}}}let s=await t.searchTools(n,{maxResults:o});return Zy(s)}}}function Zy(t){if(t.matches.length===0)return{content:[{type:"text",text:`No tools found matching "${t.query}". Total deferred tools available: ${t.totalDeferred}.`}],details:{type:"tool_search",query:t.query,matchCount:0,totalDeferred:t.totalDeferred}};let e=[`Found ${t.matches.length} tool(s) matching "${t.query}" (${t.totalDeferred} total deferred):`,""];for(let r of t.matches)e.push(`- **${r.name}**: ${r.description}`);return e.push(""),e.push('Use "select:toolName" to activate a tool for use in subsequent messages.'),{content:[{type:"text",text:e.join(`
|
|
@@ -350,23 +350,23 @@ ${p}${u}`}],details:{type:"notebook_edit",edit_mode:o,cell_number:n,total_cells:
|
|
|
350
350
|
`];for(let i of o)s.push(`- ${i.filename} | ID: ${i.id} | ${jd(i.bytes)} | ${i.status}${i.url?` | ${i.url}`:""}`);return{content:[{type:"text",text:s.join(`
|
|
351
351
|
`)}],details:{type:"file_query",count:o.length}}}}}var ZN="file_delete",eL={type:"object",properties:{file_id:{type:"string",description:"ID of the uploaded file to delete."}},required:["file_id"]};function gv(t){return{name:ZN,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:eL,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 jd(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}var tL="ask_user",rL={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 fv(t){return{name:tL,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:rL,execute:async(e,r)=>{if(!r.questions||r.questions.length===0)return{content:[{type:"text",text:"Error: at least one question is required."}],details:{type:"ask_user",error:"no_questions"}};if(r.questions.length>4)return{content:[{type:"text",text:"Error: maximum 4 questions allowed."}],details:{type:"ask_user",error:"too_many_questions"}};let n=r.questions.map(i=>i.question);if(new Set(n).size!==n.length)return{content:[{type:"text",text:"Error: all questions must have unique text."}],details:{type:"ask_user",error:"duplicate_questions"}};for(let i of r.questions){if(i.options&&(i.options.length<2||i.options.length>4))return{content:[{type:"text",text:`Error: question "${i.header}" must have 2-4 options (got ${i.options.length}).`}],details:{type:"ask_user",error:"invalid_option_count"}};if(i.options){let a=i.options.map(c=>c.label);if(new Set(a).size!==a.length)return{content:[{type:"text",text:`Error: question "${i.header}" has duplicate option labels.`}],details:{type:"ask_user",error:"duplicate_option_labels"}}}}let o=await t.askUser(r.questions);if(o===null)return{content:[{type:"text",text:"User declined to answer questions."}],details:{type:"ask_user",declined:!0}};let s=["User answered:"];for(let i of r.questions){let a=o[i.question]??"(no answer)";s.push(`- ${i.header}: ${a}`)}return{content:[{type:"text",text:s.join(`
|
|
352
352
|
`)}],details:{type:"ask_user",answers:o,questionCount:r.questions.length}}}}}var nL="project_switch",oL={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 hv(t){return{name:nL,label:"Switch Project",description:["Switch the active project context. ONLY call this when the user EXPLICITLY asks to switch projects","(e.g. '\u5207\u6362\u5230XX\u9879\u76EE', 'switch to project X').","Do NOT call this if the user merely mentions a project name in conversation.","The projectName must be an EXACT match from the available project list.","If unsure which project the user means, ask them to clarify first."].join(`
|
|
353
|
-
`),parameters:oL,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 yv,ProviderRegistry as vv,createDebugTransport as sL,createLLMClient as ei,isAsyncMediaTransport as Ud,isDebugTransportEnabled as iL}from"@xiaozhiclaw/provider-core";import{cleanSchemaForGemini as i8}from"@xiaozhiclaw/provider-core/gemini-schema-utils";import{GeminiFileAPI as aL}from"@xiaozhiclaw/provider-core/transports/gemini-file-api";import{MiniMaxMediaTransport as cL}from"@xiaozhiclaw/provider-core/transports/minimax-media";import{VolcengineMediaTransport as lL}from"@xiaozhiclaw/provider-core/transports/volcengine-media";import{ZhipuToolAPI as dL}from"@xiaozhiclaw/provider-core/transports/zhipu-tool-api";var uL=new Set(["zhipu","zhipu-openai","zhipu-coding"]),pL="https://open.bigmodel.cn/api/paas/v4",mL={bytedance:"volcengine",doubao:"volcengine"};function ti(t){let e=t.trim().toLowerCase();return mL[e]??e}function lr(t,e){return t[e]??t[ti(e)]}function bv(t,e){if(!(!t||!e)&&uL.has(t))return new dL({baseUrl:pL,apiKey:e})}function kv(t,e){return iL()?sL(t,e):t}function Rv(t){return t instanceof cL}function Sv(t){return t instanceof lL}var $d;function Tv(){return $d||($d=new aL({baseUrl:"https://generativelanguage.googleapis.com/v1beta"})),$d}var Fd=new Set(["gateway","agents_list","session_status","sessions_send","sessions_list","sessions_history","sessions_spawn","cron","config","workflow"]),wv=new Set([...Fd,"agent"]);function Hd(t,e){let r=e?Fd:wv;return t.filter(n=>n.function.name.startsWith("mcp__")?!0:!r.has(n.function.name))}var qd=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:Bd(n),isReadOnly:(n.riskLevel??Bd(n))==="read",isDangerous:(n.riskLevel??Bd(n))==="system"}}));return r}};function Bd(t){return t.riskLevel?t.riskLevel:t.isReadOnly?"read":t.category==="media"||t.category==="web"||t.category==="mcp"?"external_egress":t.category==="system"||t.name==="exec"||t.name==="computer"?"system":"write"}var $t=new qd;function
|
|
353
|
+
`),parameters:oL,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 yv,ProviderRegistry as vv,createDebugTransport as sL,createLLMClient as ei,isAsyncMediaTransport as Ud,isDebugTransportEnabled as iL}from"@xiaozhiclaw/provider-core";import{cleanSchemaForGemini as i8}from"@xiaozhiclaw/provider-core/gemini-schema-utils";import{GeminiFileAPI as aL}from"@xiaozhiclaw/provider-core/transports/gemini-file-api";import{MiniMaxMediaTransport as cL}from"@xiaozhiclaw/provider-core/transports/minimax-media";import{VolcengineMediaTransport as lL}from"@xiaozhiclaw/provider-core/transports/volcengine-media";import{ZhipuToolAPI as dL}from"@xiaozhiclaw/provider-core/transports/zhipu-tool-api";var uL=new Set(["zhipu","zhipu-openai","zhipu-coding"]),pL="https://open.bigmodel.cn/api/paas/v4",mL={bytedance:"volcengine",doubao:"volcengine"};function ti(t){let e=t.trim().toLowerCase();return mL[e]??e}function lr(t,e){return t[e]??t[ti(e)]}function bv(t,e){if(!(!t||!e)&&uL.has(t))return new dL({baseUrl:pL,apiKey:e})}function kv(t,e){return iL()?sL(t,e):t}function Rv(t){return t instanceof cL}function Sv(t){return t instanceof lL}var $d;function Tv(){return $d||($d=new aL({baseUrl:"https://generativelanguage.googleapis.com/v1beta"})),$d}var Fd=new Set(["gateway","agents_list","session_status","sessions_send","sessions_list","sessions_history","sessions_spawn","cron","config","workflow"]),wv=new Set([...Fd,"agent"]);function Hd(t,e){let r=e?Fd:wv;return t.filter(n=>n.function.name.startsWith("mcp__")?!0:!r.has(n.function.name))}var qd=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:Bd(n),isReadOnly:(n.riskLevel??Bd(n))==="read",isDangerous:(n.riskLevel??Bd(n))==="system"}}));return r}};function Bd(t){return t.riskLevel?t.riskLevel:t.isReadOnly?"read":t.category==="media"||t.category==="web"||t.category==="mcp"?"external_egress":t.category==="system"||t.name==="exec"||t.name==="computer"?"system":"write"}var $t=new qd;function Av(){return $t}function Pv(t){$t.setTools(t)}function ri(t){$t.addTool(t)}function ni(t){$t.addTools(t)}function pn(t){return $t.removeTool(t)}function xv(t){return $t.findTool(t)}function oi(){return $t.getToolNames()}function Cv(t){return $t.activateTool(t)}function Iv(){$t.clearActivatedTools()}function Ev(t=!1){return $t.getToolManifest(t)}function Mv(t=Av()){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=>xv(t),getToolManifest:t=>Ev(t),getToolNames:()=>oi(),setTools:t=>Pv(t),addTool:t=>ri(t),addTools:t=>ni(t),removeTool:t=>pn(t),activateTool:t=>Cv(t),clearActivatedTools:()=>Iv()}}var Pe,Or={},Dv,Wd,dr={},Nv;function si(t){Nv=t}function Lv(){return Nv}function Gd(t,e,r,n,o){Pe=t,Or=e??{},Dv=r,Wd=o,dr=n??{},fL()}function Ov(){return{mediaClient:Pe,mediaProviders:dr,mediaApiKeys:Or}}function Kd(t){let e=dr[t];if(!(!e||!Pe))return Pe.resolveModelById(e.provider,e.model,t)}function fL(){hL(),yL(),vL(),bL()}function hL(){let t=Lr().findTool(Ld);if(!t)return;let e=dr.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 yL(){let t=Lr().findTool(Nd);if(!t)return;let e=Kd("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 vL(){let t=Lr().findTool("tts");if(!t)return;let e=Kd("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 bL(){let t=Lr().findTool(Od);if(!t)return;let e=Kd("music");if(!e)return;let r=e.modelInfo.mediaCapabilities,n=e.modelInfo.name||e.modelInfo.id,o=[];if(r?.maxDurationSeconds&&o.push(`Max duration: ${r.maxDurationSeconds}s`),r?.formats?.length&&o.push(`Formats: ${r.formats.join(", ")}`),t.description=`Generate music, songs, or melodies from text descriptions. Prompt MUST be in English. Supports lyrics for vocal songs; use tts for spoken-word audio. Current model: ${n}. ${o.join(". ")}${o.length?". ":""}`,r?.maxDurationSeconds){let i=t.parameters?.properties?.duration;i&&(i.maximum=r.maxDurationSeconds,i.description=`Duration in seconds (5-${r.maxDurationSeconds}s for ${n}). Infer from purpose: ringtone 15-30s, BGM 30-60s, full song 120-180s.`)}}async function Et(t){if(!Pe)throw new Error(`No media provider configured for ${t.mediaType}`);let e=dr[t.mediaType],r=e?.provider,n=e?.model||t.model;if(!r)throw new Error(`No provider configured for ${t.mediaType}. Please configure a provider in settings.`);let o={...t};Wd&&!o.onProgress&&(o.onProgress=(c,l,d)=>{Wd(d??"pending",t.mediaType,c,l,r)});let s=await _v(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 _v(c.providerId,c.modelInfo.id,t);if(d.ok)return d.result;a.push(`${c.providerId}/${c.modelInfo.id}: ${d.error}`)}throw new Error(`All media providers failed for ${t.mediaType}:
|
|
354
354
|
`+a.map(c=>` - ${c}`).join(`
|
|
355
|
-
`))}async function _v(t,e,r){let n=Pe.getTransport(t);if(!n)return{ok:!1,error:"transport not available"};let o=lr(Or,t);if(!o)return{ok:!1,error:"no API key"};try{let s={...r,model:e},i=await n.generate(s,o);i.billingUnit||(r.mediaType==="tts"&&r.text?(i.billingUnit="per_character",i.billingQuantity=r.text.length):(r.mediaType==="video"||r.mediaType==="music")&&r.duration?(i.billingUnit="per_second",i.billingQuantity=r.duration):(i.billingUnit="per_call",i.billingQuantity=1));let a=i.model??s.model,c=i.billingUnit??"per_call",l=i.billingQuantity??1;return Dv?.(a,c,l),{ok:!0,result:i}}catch(s){return{ok:!1,error:s instanceof Error?s.message:String(s)}}}function Mt(t){if(!Pe)return!1;let e=dr[t];if(!e)return!1;let r=Pe.getTransport(e.provider),n=lr(Or,e.provider);return!!(r&&n)}function ii(t,e){if(!Mt(t))return!1;let r=dr[t],n=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 jv(t){let e=dr.music;if(!e||!Pe)return"";let r=Pe.getTransport(e.provider);if(!Rv(r))return"";let n=lr(Or,e.provider);return n?r.generateLyrics(t,n):""}async function $v(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=lr(Or,e);if(!n)return{ok:!1,message:`No API key for provider: ${e}`};try{return"deleteVideoTask"in r&&typeof r.deleteVideoTask=="function"?(await r.deleteVideoTask(t.taskId,n),{ok:!0,message:"Task cancelled."}):{ok:!1,message:`Provider ${e} does not support task cancellation.`}}catch(o){return{ok:!1,message:o instanceof Error?o.message:String(o)}}}import*as mn from"node:fs";import*as ci from"node:path";function kL(t={}){let e=t.createGeminiFileApi??Tv,r=t.isVolcengineFileTransport??Sv,n=a=>{if(a.mediaClient)for(let[,c]of Object.entries(a.mediaProviders)){if(!c)continue;let l=a.mediaClient.getTransport(c.provider),d=lr(a.mediaApiKeys,c.provider);if(r(l)&&d)return{id:c.provider,type:"volcengine"}}if(a.mediaApiKeys.google)return{id:"google",type:"gemini"}},o=a=>{let c=n(a);if(!c)throw new Error("No file API provider available. Configure a media provider with Files API support (e.g. Volcengine, Google).");return c},s=(a,c)=>{let l=a.mediaClient?.getTransport(c);if(!r(l))throw new Error(`File API only supported via Volcengine or Google provider. Current: ${c}`);return l},i=(a,c)=>{let l=lr(a.mediaApiKeys,c);if(!l)throw new Error(`No API key for file API provider: ${c}`);return l};return{resolveProvider:n,uploadFile:async(a,c)=>{let l=o(a);if(l.type==="gemini"){let f=e(),g=a.mediaApiKeys.google,h=await f.uploadFile(c.buffer,g,{mimeType:c.mimeType,displayName:c.filename}),b=h.state==="PROCESSING"?await f.waitForProcessing(h.name,g):h;return{fileId:b.name,url:b.uri,filename:c.filename,bytes:c.bytes,provider:"google"}}let d=s(a,l.id),p=i(a,l.id),u=await d.uploadFile(new Blob([c.buffer]),p,{purpose:c.purpose??"media_reference",filename:c.filename}),m;try{let f=await d.getFile(u.id,p);typeof f.url=="string"&&f.url&&(m=f.url)}catch{}return{fileId:u.id,url:m,filename:c.filename,bytes:c.bytes,provider:l.id}},queryFile:async(a,c)=>{let l=o(a);if(l.type==="gemini"){let u=await e().getFile(c,a.mediaApiKeys.google);return Uv(u)}let p=await s(a,l.id).getFile(c,i(a,l.id));return Fv(p,c)},listFiles:async(a,c)=>{let l=o(a);return l.type==="gemini"?(await e().listFiles(a.mediaApiKeys.google,{pageSize:c})).files.map(Uv):((await s(a,l.id).listFiles(i(a,l.id),{limit:c})).data??[]).map(u=>Fv(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 zd=kL();function Uv(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 Fv(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 Hv(t){let e=t.maxUploadBytes??104857600,r=t.mediaFileApiService??zd;return{isAvailable:()=>Bv(t.getContext(),r),uploadFile:async n=>{ai(t.getContext(),r,"upload");let o=t.resolvePath(n.filePath);if(!mn.existsSync(o))throw new Error(`File not found: ${o}`);let s=mn.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 mn.promises.readFile(o),a=ci.basename(o),c=ci.extname(o).toLowerCase();return r.uploadFile(t.getContext(),{buffer:Buffer.from(i),filename:a,bytes:s.size,mimeType:RL[c]??"application/octet-stream",purpose:n.purpose??"media_reference"})},queryFile:async n=>(ai(t.getContext(),r,"query"),r.queryFile(t.getContext(),n.fileId)),listFiles:async n=>(ai(t.getContext(),r,"list"),r.listFiles(t.getContext(),n.limit??10)),deleteFile:async n=>{ai(t.getContext(),r,"delete"),await r.deleteFile(t.getContext(),n.fileId)}}}function Bv(t,e=zd){return!!e.resolveProvider(t)}function ai(t,e,r){if(!Bv(t,e))throw new Error(`No file ${r} provider available. Configure a media provider with Files API support (e.g. Volcengine, Google).`)}var RL={".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 qv(t,e){return!t?.webSearch||!t.capabilities.includes("web_search")?e:async(r,n)=>{try{let s=await t.webSearch(r,{maxResults:n?.maxResults});if(n?.allowedDomains?.length){let i=new Set(n.allowedDomains.map(a=>a.toLowerCase()));s=s.filter(a=>{try{return i.has(new URL(a.url).hostname.toLowerCase())}catch{return!1}})}if(n?.blockedDomains?.length){let i=new Set(n.blockedDomains.map(a=>a.toLowerCase()));s=s.filter(a=>{try{return!i.has(new URL(a.url).hostname.toLowerCase())}catch{return!0}})}if(s.length>0)return{query:r,results:s.map(i=>({title:i.title,url:i.url,snippet:i.snippet}))}}catch{}return e(r,n)}}var Qt=class{nodes=new Map;edges=[];constructor(e){for(let r of e){if(this.nodes.has(r.id))throw new Error(`Duplicate node ID: ${r.id}`);this.nodes.set(r.id,{id:r.id,kind:r.kind??"agent",params:r.params??{},status:"pending",outPorts:r.outPorts??["default"],joinPolicy:r.joinPolicy??"all",runIndex:0,maxIterations:r.maxIterations})}for(let r of e)for(let n of r.dependsOn??[]){if(!this.nodes.has(n))throw new Error(`Node "${r.id}" depends on unknown node "${n}"`);this.edges.push({from:n,to:r.id,fromPort:"default"})}this.validateDag()}getNode(e){return this.nodes.get(e)}getAllNodes(){return[...this.nodes.values()]}getReadyNodes(){let e=[];for(let r of this.nodes.values()){if(r.status!=="pending"||this.isBlockedByFailed(r.id))continue;let n=this.incomingForwardEdges(r.id);if(n.length===0){e.push(r);continue}r.joinPolicy==="any"?n.some(o=>this.edgeSatisfied(o))&&e.push(r):n.every(o=>this.edgeSatisfied(o))&&e.push(r)}return e}isFinished(){for(let e of this.nodes.values())if(e.status==="running"||e.status==="paused"||e.status==="pending"&&!this.isBlockedByFailed(e.id)&&!this.isSkippable(e.id))return!1;return!0}isAllCompleted(){return[...this.nodes.values()].every(e=>e.status==="completed"||e.status==="skipped")}getBlockedNodes(){return[...this.nodes.values()].filter(e=>e.status==="pending"&&this.isBlockedByFailed(e.id))}getProgress(){let e=0,r=0,n=0,o=0,s=0,i=0;for(let a of this.nodes.values())switch(a.status){case"completed":e++;break;case"running":r++;break;case"failed":n++;break;case"pending":o++;break;case"paused":s++;break;case"skipped":i++;break}return{total:this.nodes.size,completed:e,running:r,failed:n,pending:o,paused:s,skipped:i}}markRunning(e){let r=this.requireNode(e);if(r.status!=="pending")throw new Error(`Node "${e}" is ${r.status}, cannot start`);r.status="running",r.startedAt=Date.now()}markCompleted(e,r){let n=this.requireNode(e);if(n.status!=="running")throw new Error(`Node "${e}" is ${n.status}, cannot complete`);n.status="completed",n.output=r.output,n.completedAt=Date.now(),n.firedPorts=r.firedPorts??n.outPorts,this.propagateSkips()}markFailed(e,r){let n=this.requireNode(e);n.status="failed",n.error=r,n.completedAt=Date.now(),this.propagateSkips()}markPaused(e){let r=this.requireNode(e);r.status==="running"&&(r.status="paused")}resumePaused(e){let r=this.requireNode(e);r.status==="paused"&&(r.status="pending")}markSkipped(e){let r=this.requireNode(e);if(r.status!=="pending")throw new Error(`Node "${e}" is ${r.status}, cannot skip`);r.status="skipped",r.firedPorts=[],this.propagateSkips()}pauseAll(){for(let e of this.nodes.values())e.status==="running"&&(e.status="paused")}resumeAll(){for(let e of this.nodes.values())e.status==="paused"&&(e.status="pending")}decideLoop(e,r){let n=this.requireNode(e);if(n.kind!=="loop")throw new Error(`Node "${e}" is not a loop controller`);if(!n.maxIterations||n.maxIterations<=0)throw new Error(`Loop "${e}" requires maxIterations > 0`);let o=n.iteration??0;r&&o<n.maxIterations?(n.iteration=o+1,n.firedPorts=["loop"],this.resetLoopScope(e)):(n.firedPorts=["done"],r&&(n.error=`loop_cap_reached:${n.maxIterations}`)),this.propagateSkips()}addNode(e){if(this.nodes.has(e.id))throw new Error(`Node "${e.id}" already exists`);for(let r of e.dependsOn??[])if(!this.nodes.has(r))throw new Error(`Node "${e.id}" depends on unknown node "${r}"`);this.nodes.set(e.id,{id:e.id,kind:e.kind??"agent",params:e.params??{},status:"pending",outPorts:e.outPorts??["default"],joinPolicy:e.joinPolicy??"all",runIndex:0,maxIterations:e.maxIterations});for(let r of e.dependsOn??[])this.edges.push({from:r,to:e.id,fromPort:"default"});try{this.validateDag()}catch(r){throw this.nodes.delete(e.id),this.edges=this.edges.filter(n=>n.to!==e.id||!e.dependsOn?.includes(n.from)),r}}addNodes(e){let r=[],n=[];try{for(let o of e){if(this.nodes.has(o.id))throw new Error(`Node "${o.id}" already exists`);for(let i of o.dependsOn??[])if(!this.nodes.has(i))throw new Error(`Unknown dep "${i}" for "${o.id}"`);this.nodes.set(o.id,{id:o.id,kind:o.kind??"agent",params:o.params??{},status:"pending",outPorts:o.outPorts??["default"],joinPolicy:o.joinPolicy??"all",runIndex:0,maxIterations:o.maxIterations}),r.push(o.id);let s=(o.dependsOn??[]).map(i=>({from:i,to:o.id,fromPort:"default"}));this.edges.push(...s),n.push(...s)}this.validateDag()}catch(o){for(let s of r)this.nodes.delete(s);throw this.edges=this.edges.filter(s=>!n.includes(s)),o}}removeNode(e){let r=this.requireNode(e);if(r.status==="running")throw new Error(`Cannot remove running node "${e}"`);if(r.status==="completed")throw new Error(`Cannot remove completed node "${e}"`);this.edges=this.edges.filter(n=>n.from!==e&&n.to!==e),this.nodes.delete(e)}retryNode(e,r){let n=this.requireNode(e);if(n.status!=="failed")throw new Error(`Node "${e}" is ${n.status}, only failed nodes can be retried`);n.status="pending",n.error=void 0,n.output=void 0,n.firedPorts=void 0,n.startedAt=void 0,n.completedAt=void 0,r&&Object.assign(n.params,r)}updateNodeParams(e,r){let n=this.requireNode(e);if(n.status!=="pending")throw new Error(`Node "${e}" is ${n.status}, can only update pending nodes`);Object.assign(n.params,r)}addEdge(e){let{from:r,to:n,fromPort:o="default",loopBack:s=!1}=e;if(!this.nodes.has(r))throw new Error(`Unknown source node "${r}"`);if(!this.nodes.has(n))throw new Error(`Unknown target node "${n}"`);let i=this.nodes.get(r);if(!s&&!i.outPorts.includes(o))throw new Error(`Node "${r}" has no outPort "${o}"`);if(!this.edges.find(c=>c.from===r&&c.to===n&&(c.fromPort??"default")===o))if(this.edges.push({from:r,to:n,fromPort:o,loopBack:s}),s){let c=this.nodes.get(n);if(!c.maxIterations||c.maxIterations<=0)throw this.edges.pop(),new Error(`LoopBack controller "${n}" requires maxIterations > 0`)}else try{this.validateDag()}catch(c){throw this.edges=this.edges.filter(l=>!(l.from===r&&l.to===n&&(l.fromPort??"default")===o)),c}}removeEdge(e,r,n){let o=n??"default";this.edges=this.edges.filter(s=>!(s.from===e&&s.to===r&&(s.fromPort??"default")===o))}serialize(){return[...this.nodes.values()].map(e=>{let r=this.incomingForwardEdges(e.id).map(n=>n.from);return{id:e.id,kind:e.kind,params:e.params,dependsOn:r,outPorts:e.outPorts,joinPolicy:e.joinPolicy,status:e.status,firedPorts:e.firedPorts,output:e.output,error:e.error,startedAt:e.startedAt,completedAt:e.completedAt,runIndex:e.runIndex,maxIterations:e.maxIterations,iteration:e.iteration}})}restore(e){for(let r of e){let n=this.nodes.get(r.id);n&&(n.status=r.status==="running"?"pending":r.status,n.output=r.output,n.error=r.error,n.firedPorts=r.firedPorts,n.startedAt=r.startedAt,n.completedAt=r.completedAt,n.runIndex=r.runIndex??0,n.iteration=r.iteration)}}edgeSatisfied(e){let r=this.nodes.get(e.from);if(!r||r.status!=="completed")return!1;let n=e.fromPort??"default";return(r.firedPorts??r.outPorts).includes(n)}edgeDead(e){let r=this.nodes.get(e.from);if(!r)return!1;if(r.status==="skipped")return!0;if(r.status==="completed"){if(r.kind==="loop"&&!(r.firedPorts??[]).includes("done"))return!1;let n=e.fromPort??"default";return!(r.firedPorts??r.outPorts).includes(n)}return!1}incomingForwardEdges(e){return this.edges.filter(r=>r.to===e&&!r.loopBack)}isBlockedByFailed(e){return this.incomingForwardEdges(e).some(r=>this.nodes.get(r.from)?.status==="failed")}isSkippable(e){let r=this.incomingForwardEdges(e);return r.length===0?!1:this.nodes.get(e).joinPolicy==="any"?r.every(o=>this.edgeDead(o)):r.some(o=>this.edgeDead(o))}propagateSkips(){let e=!0;for(;e;){e=!1;for(let r of this.nodes.values())r.status==="pending"&&this.isSkippable(r.id)&&(r.status="skipped",r.firedPorts=[],e=!0)}}resetLoopScope(e){let r=this.loopBodyNodes(e);for(let n of r){let o=this.nodes.get(n);o.status="pending",o.runIndex=(o.runIndex??0)+1,o.output=void 0,o.firedPorts=void 0,o.error=void 0,o.startedAt=void 0,o.completedAt=void 0}}loopBodyNodes(e){let r=new Set,n=(o,s)=>{for(let i of this.edges)i.from!==o||i.loopBack||s&&(i.fromPort??"default")!=="loop"||i.to!==e&&(r.has(i.to)||(r.add(i.to),n(i.to,!1)))};return n(e,!0),r}validateDag(){for(let s of this.edges){if(!this.nodes.has(s.from))throw new Error(`Edge references unknown source "${s.from}"`);if(!this.nodes.has(s.to))throw new Error(`Edge references unknown target "${s.to}"`)}let e=this.edges.filter(s=>!s.loopBack),r=new Set,n=new Set,o=s=>{if(n.has(s))throw new Error(`Cycle detected involving node "${s}"`);if(!r.has(s)){n.add(s);for(let i of e)i.from===s&&o(i.to);n.delete(s),r.add(s)}};for(let s of this.nodes.keys())o(s);for(let s of this.edges){if(!s.loopBack)continue;let i=this.nodes.get(s.to);if(!i?.maxIterations||i.maxIterations<=0)throw new Error(`LoopBack controller "${s.to}" must have maxIterations > 0`)}for(let s of this.nodes.values())if(s.maxIterations!==void 0&&s.maxIterations>1e3)throw new Error(`Loop "${s.id}" maxIterations ${s.maxIterations} exceeds the hard cap of 1000`)}requireNode(e){let r=this.nodes.get(e);if(!r)throw new Error(`Unknown node: "${e}"`);return r}};function gn(t,e){return e?{json:t,binary:e}:{json:t}}function Wv(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 Xd(e)}function Xd(t){return JSON.stringify(Vd(t))}function Vd(t){if(Array.isArray(t))return t.map(Vd);if(t&&typeof t=="object"){let e={};for(let r of Object.keys(t).sort())e[r]=Vd(t[r]);return e}return t}var zv=new Set(["__proto__","prototype","constructor"]);function Gv(t,e){let r=SL(t),n=new Qd(r,t),o=n.parseExpression();return n.expectEnd(),fn(o,e)}function eu(t,e){let r=t.match(/^\s*\{\{([\s\S]*)\}\}\s*$/);return r?Gv(r[1],e):t.includes("{{")?t.replace(/\{\{([\s\S]*?)\}\}/g,(n,o)=>{let s=Gv(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 Vv(t,e){return Jd(t,e)}function Jd(t,e){if(typeof t=="string")return eu(t,e);if(Array.isArray(t))return t.map(r=>Jd(r,e));if(t&&typeof t=="object"){let r={};for(let[n,o]of Object.entries(t))r[n]=Jd(o,e);return r}return t}function SL(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 Qd=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`)}},Xv=Symbol("nodeAccessor");function fn(t,e){switch(t.type){case"lit":return t.value;case"root":return TL(t.name,e);case"func":return wL(t.name,t.args.map(r=>fn(r,e)));case"prop":return Kv(fn(t.target,e),t.key);case"index":return Kv(fn(t.target,e),t.key);case"call":{if(fn(t.target,e)===Xv){let n=t.args.map(s=>fn(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 TL(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 Xv;default:throw new Error(`Unknown context root "$${t}" (allowed: $input $json $node $now $vars $trigger)`)}}function Kv(t,e){if(typeof e=="string"&&zv.has(e))throw new Error(`Access to "${e}" is forbidden`);if(t==null)throw new Error(`Cannot read "${e}" of ${t}`);if(typeof e=="number"){if(!Array.isArray(t))throw new Error(`Cannot index non-array with [${e}]`);return t[e]}return t[e]}function wL(t,e){switch(t){case"len":{let r=e[0];if(typeof r=="string"||Array.isArray(r))return r.length;if(r&&typeof r=="object")return Object.keys(r).length;throw new Error(`len() expects string/array/object, got ${typeof r}`)}case"upper":return String(di(e,0,"upper")).toUpperCase();case"lower":return String(di(e,0,"lower")).toLowerCase();case"default":return e[0]===null||e[0]===void 0?e[1]:e[0];case"jsonpath":return AL(e[0],String(di(e,1,"jsonpath")));case"date":return xL(e);case"eq":return Zd(e[0],e[1]);case"ne":return!Zd(e[0],e[1]);case"gt":return li(e[0],e[1])>0;case"gte":return li(e[0],e[1])>=0;case"lt":return li(e[0],e[1])<0;case"lte":return li(e[0],e[1])<=0;case"not":return!Yd(di(e,0,"not"));case"and":return e.every(Yd);case"or":return e.some(Yd);case"contains":return PL(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 Yd(t){return!!t}function Zd(t,e){return t===e?!0:typeof t!=typeof e?!1:t&&e&&typeof t=="object"?JSON.stringify(t)===JSON.stringify(e):!1}function li(t,e){if(typeof t=="number"&&typeof e=="number")return t-e;if(typeof t=="string"&&typeof e=="string")return t<e?-1:t>e?1:0;throw new Error(`Cannot compare ${typeof t} with ${typeof e}`)}function PL(t,e){if(typeof t=="string")return t.includes(String(e));if(Array.isArray(t))return t.some(r=>Zd(r,e));throw new Error("contains() expects string/array as first argument")}function di(t,e,r){if(t.length<=e||t[e]===void 0)throw new Error(`${r}() missing required argument #${e+1}`);return t[e]}function AL(t,e){let r=e.match(/[^.[\]]+/g)??[],n=t;for(let o of r){if(zv.has(o))throw new Error(`jsonpath segment "${o}" is forbidden`);if(n==null)return;let s=/^\d+$/.test(o)?Number(o):o;n=n[s]}return n}function xL(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 CL=(t,e)=>({outputs:{default:[{json:e.json&&typeof e.json=="object"&&!Array.isArray(e.json)?e.json:{value:e.json??e.value??null}}]}}),IL=t=>({outputs:{default:t.default??[]}}),EL=t=>{let e=[];for(let r of Object.keys(t))e.push(...t[r]);return{outputs:{default:e}}},ML=(t,e)=>{let n=!!e.condition?"true":"false",o=t.default??[],s={true:[],false:[]};return s[n]=o,{outputs:s,firedPorts:[n]}},_L=(t,e,r)=>({outputs:{default:[{json:r.trigger??(e.payload&&typeof e.payload=="object"&&!Array.isArray(e.payload)?e.payload:{})}]}}),Yv={set:CL,passthrough:IL,merge:EL,if:ML,trigger:_L};var hn=class{executors=new Map;constructor(e=!0){if(e)for(let[r,n]of Object.entries(Yv))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 yn(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 Jv(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 DL=async(t,e,r)=>({outputs:{default:await fo(r.host,"agent").runAgent({agentId:typeof e.agentId=="string"?e.agentId:void 0,prompt:yn(e,"prompt","agent"),input:t.default??[],signal:r.signal})}}),NL=async(t,e,r)=>({outputs:{default:await fo(r.host,"tool").invokeTool({tool:yn(e,"tool","tool"),args:Jv(e,"args"),input:t.default??[],signal:r.signal})}}),LL=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:yn(e,"url","http"),headers:e.headers,body:e.body,signal:r.signal})}}},OL=async(t,e,r)=>({outputs:{default:await fo(r.host,"mcp").invokeMcp({server:yn(e,"server","mcp"),tool:yn(e,"tool","mcp"),args:Jv(e,"args"),signal:r.signal})}}),jL=async(t,e,r)=>({outputs:{default:await fo(r.host,"channel").sendChannel({channel:yn(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:DL,tool:NL,http:LL,mcp:OL,channel:jL},L8=Object.keys(ho);var vn=class extends Error{constructor(r){super(r?`Workflow paused at "${r}"`:"Workflow paused");this.atNodeId=r;this.name="WorkflowPauseSignal"}atNodeId},ui=class{constructor(e,r={}){this.def=e;if(this.registry=r.registry??new hn,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 vn)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 vn(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=Vv(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"?eu(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 Xd([e,r,Wv(n),o])}buildDag(){let e=this.def.nodes.map(n=>({id:n.id,kind:n.kind,params:n.params??{},outPorts:n.outPorts??$L(n.kind),joinPolicy:n.joinPolicy??"all",maxIterations:n.maxIterations})),r=new Qt(e);for(let n of this.def.edges)n.loopBack||r.addEdge({from:n.from,to:n.to,fromPort:n.fromPort??"default"});for(let n of this.def.edges)n.loopBack&&r.addEdge({from:n.from,to:n.to,loopBack:!0});return r}};function $L(t){return t==="if"?["true","false"]:t==="loop"?["loop","done"]:["default"]}var UL=new Set(["agent","tool","http","mcp","channel","im"]),tu=class extends Error{constructor(r,n,o){super(`Permission denied: node "${r}" (kind "${n}") may not run under unattended trigger "${o}". Authorize it by adding "${n}" to allowUnattendedKinds.`);this.nodeId=r;this.kind=n;this.trigger=o;this.name="WorkflowPermissionDenied"}nodeId;kind;trigger},pi=class extends vn{constructor(r,n,o){super(r);this.reason=n;this.limit=o;this.name="WorkflowBudgetExceeded",this.message=`Budget exceeded (${n} limit ${o}) before node "${r}"`}reason;limit},mi=class{trigger;maxNodeExecutions;maxDurationMs;allow;now;executions=0;startedAt=-1;constructor(e){if(!Number.isInteger(e.maxNodeExecutions)||e.maxNodeExecutions<=0)throw new Error(`BudgetPermissionGate: maxNodeExecutions must be a positive integer, got ${e.maxNodeExecutions}`);if(e.maxDurationMs!==void 0&&!(e.maxDurationMs>0))throw new Error(`BudgetPermissionGate: maxDurationMs must be greater than 0 when provided, got ${e.maxDurationMs}`);this.trigger=e.trigger,this.maxNodeExecutions=e.maxNodeExecutions,this.maxDurationMs=e.maxDurationMs,this.allow=new Set(e.allowUnattendedKinds??[]),this.now=e.now??(()=>Date.now())}get unattended(){return this.trigger!=="manual"}check(e,r){if(this.unattended&&UL.has(r)&&!this.allow.has(r))throw new tu(e,r,this.trigger);if(this.startedAt<0&&(this.startedAt=this.now()),this.maxDurationMs!==void 0&&this.now()-this.startedAt>=this.maxDurationMs)throw new pi(e,"duration",this.maxDurationMs);if(this.executions>=this.maxNodeExecutions)throw new pi(e,"executions",this.maxNodeExecutions);this.executions++}extend(e){if(e.executions!==void 0){if(!Number.isInteger(e.executions)||e.executions<=0)throw new Error(`BudgetPermissionGate.extend: executions delta must be a positive integer, got ${e.executions}`);this.maxNodeExecutions+=e.executions}if(e.durationMs!==void 0){if(!(e.durationMs>0))throw new Error(`BudgetPermissionGate.extend: durationMs delta must be greater than 0, got ${e.durationMs}`);if(this.maxDurationMs===void 0)throw new Error("BudgetPermissionGate.extend: cannot extend duration on a gate with no duration cap");this.maxDurationMs+=e.durationMs}}};function eb(t){switch(t.type){case"manual":return[];case"schedule":return nu(t.cron);case"im-message":return BL(t.channel,t.match);case"webhook":return qL(t.path);default:return[`unknown trigger type: ${JSON.stringify(t)}`]}}var Qv=["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"],Zv=["SUN","MON","TUE","WED","THU","FRI","SAT"];function nu(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:Qv},{label:"day-of-week",min:0,max:7,names:Zv}]:[{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:Qv},{label:"day-of-week",min:0,max:7,names:Zv}],o=[];for(let s=0;s<n.length;s++){let i=FL(e[s],n[s]);i&&o.push(`schedule.cron ${i}`)}return o}function FL(t,e){for(let r of t.split(",")){let n=HL(r,e);if(n)return n}}function HL(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=ru(r.slice(0,s),e),c=ru(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(ru(r,e)===void 0)return`${e.label} value "${r}" is out of range ${e.min}-${e.max}`}function ru(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 BL(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 qL(t){return typeof t!="string"||t===""?["webhook.path must be a non-empty string"]:t.startsWith("/")?/\s/.test(t)?[`webhook.path must not contain whitespace: "${t}"`]:t.includes("..")?[`webhook.path must not contain "..": "${t}"`]:/^\/[A-Za-z0-9\-._~/]*$/.test(t)?[]:[`webhook.path contains illegal characters: "${t}"`]:[`webhook.path must start with "/": "${t}"`]}var ur=class extends Error{constructor(r){super(`Patch rejected: ${r.join("; ")}`);this.errors=r;this.name="PatchError"}errors};function tb(t,e){let r=[],n=KL(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=WL(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=eb(d.trigger);if(u.length>0)for(let m of u)r.push(`${p}: ${m}`);else n.meta.trigger=d.trigger}else n.meta.trigger=d.trigger;break}case"set_meta":{s?r.push(`${p}: meta is workflow-global and cannot be changed in a scoped edit`):(d.meta.name!==void 0&&(n.meta.name=d.meta.name),d.meta.active!==void 0&&(n.meta.active=d.meta.active));break}default:r.push(`${p}: unknown op`)}r.length===0&&c.push(d)}if(r.length>0)throw new ur(r);if(rb(n.def,r),r.length>0)throw new ur(r);return{target:n,applied:c}}function WL(t,e){let r={...t??{}};for(let[n,o]of Object.entries(e))o===null?delete r[n]:r[n]=o;return r}function ou(t){let e=[];return rb(t,e),e}function rb(t,e){try{let r=t.nodes.map(o=>({id:o.id,kind:o.kind,params:o.params??{},outPorts:o.outPorts??GL(o.kind),joinPolicy:o.joinPolicy??"all",maxIterations:o.maxIterations})),n=new Qt(r);for(let o of t.edges)o.loopBack||n.addEdge({from:o.from,to:o.to,fromPort:o.fromPort??"default"});for(let o of t.edges)o.loopBack&&n.addEdge({from:o.from,to:o.to,loopBack:!0})}catch(r){e.push(`graph invalid: ${r.message}`)}}function GL(t){return t==="if"?["true","false"]:t==="loop"?["loop","done"]:["default"]}function KL(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 nb(t,e={}){let r=e.maxNodes??50,n=e.maxValueLen??60,o=`Workflow ${JSON.stringify(t.name)} (rev ${t.rev}, trigger: ${zL(t.trigger)}, ${t.active?"active":"inactive"})`,s=t.def.nodes,a=s.slice(0,r).map(p=>" "+VL(p,n)),c=s.length===0?"nodes: (none)":["nodes:",...a].join(`
|
|
355
|
+
`))}async function _v(t,e,r){let n=Pe.getTransport(t);if(!n)return{ok:!1,error:"transport not available"};let o=lr(Or,t);if(!o)return{ok:!1,error:"no API key"};try{let s={...r,model:e},i=await n.generate(s,o);i.billingUnit||(r.mediaType==="tts"&&r.text?(i.billingUnit="per_character",i.billingQuantity=r.text.length):(r.mediaType==="video"||r.mediaType==="music")&&r.duration?(i.billingUnit="per_second",i.billingQuantity=r.duration):(i.billingUnit="per_call",i.billingQuantity=1));let a=i.model??s.model,c=i.billingUnit??"per_call",l=i.billingQuantity??1;return Dv?.(a,c,l),{ok:!0,result:i}}catch(s){return{ok:!1,error:s instanceof Error?s.message:String(s)}}}function Mt(t){if(!Pe)return!1;let e=dr[t];if(!e)return!1;let r=Pe.getTransport(e.provider),n=lr(Or,e.provider);return!!(r&&n)}function ii(t,e){if(!Mt(t))return!1;let r=dr[t],n=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 jv(t){let e=dr.music;if(!e||!Pe)return"";let r=Pe.getTransport(e.provider);if(!Rv(r))return"";let n=lr(Or,e.provider);return n?r.generateLyrics(t,n):""}async function $v(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=lr(Or,e);if(!n)return{ok:!1,message:`No API key for provider: ${e}`};try{return"deleteVideoTask"in r&&typeof r.deleteVideoTask=="function"?(await r.deleteVideoTask(t.taskId,n),{ok:!0,message:"Task cancelled."}):{ok:!1,message:`Provider ${e} does not support task cancellation.`}}catch(o){return{ok:!1,message:o instanceof Error?o.message:String(o)}}}import*as mn from"node:fs";import*as ci from"node:path";function kL(t={}){let e=t.createGeminiFileApi??Tv,r=t.isVolcengineFileTransport??Sv,n=a=>{if(a.mediaClient)for(let[,c]of Object.entries(a.mediaProviders)){if(!c)continue;let l=a.mediaClient.getTransport(c.provider),d=lr(a.mediaApiKeys,c.provider);if(r(l)&&d)return{id:c.provider,type:"volcengine"}}if(a.mediaApiKeys.google)return{id:"google",type:"gemini"}},o=a=>{let c=n(a);if(!c)throw new Error("No file API provider available. Configure a media provider with Files API support (e.g. Volcengine, Google).");return c},s=(a,c)=>{let l=a.mediaClient?.getTransport(c);if(!r(l))throw new Error(`File API only supported via Volcengine or Google provider. Current: ${c}`);return l},i=(a,c)=>{let l=lr(a.mediaApiKeys,c);if(!l)throw new Error(`No API key for file API provider: ${c}`);return l};return{resolveProvider:n,uploadFile:async(a,c)=>{let l=o(a);if(l.type==="gemini"){let f=e(),g=a.mediaApiKeys.google,h=await f.uploadFile(c.buffer,g,{mimeType:c.mimeType,displayName:c.filename}),b=h.state==="PROCESSING"?await f.waitForProcessing(h.name,g):h;return{fileId:b.name,url:b.uri,filename:c.filename,bytes:c.bytes,provider:"google"}}let d=s(a,l.id),p=i(a,l.id),u=await d.uploadFile(new Blob([c.buffer]),p,{purpose:c.purpose??"media_reference",filename:c.filename}),m;try{let f=await d.getFile(u.id,p);typeof f.url=="string"&&f.url&&(m=f.url)}catch{}return{fileId:u.id,url:m,filename:c.filename,bytes:c.bytes,provider:l.id}},queryFile:async(a,c)=>{let l=o(a);if(l.type==="gemini"){let u=await e().getFile(c,a.mediaApiKeys.google);return Uv(u)}let p=await s(a,l.id).getFile(c,i(a,l.id));return Fv(p,c)},listFiles:async(a,c)=>{let l=o(a);return l.type==="gemini"?(await e().listFiles(a.mediaApiKeys.google,{pageSize:c})).files.map(Uv):((await s(a,l.id).listFiles(i(a,l.id),{limit:c})).data??[]).map(u=>Fv(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 zd=kL();function Uv(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 Fv(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 Hv(t){let e=t.maxUploadBytes??104857600,r=t.mediaFileApiService??zd;return{isAvailable:()=>Bv(t.getContext(),r),uploadFile:async n=>{ai(t.getContext(),r,"upload");let o=t.resolvePath(n.filePath);if(!mn.existsSync(o))throw new Error(`File not found: ${o}`);let s=mn.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 mn.promises.readFile(o),a=ci.basename(o),c=ci.extname(o).toLowerCase();return r.uploadFile(t.getContext(),{buffer:Buffer.from(i),filename:a,bytes:s.size,mimeType:RL[c]??"application/octet-stream",purpose:n.purpose??"media_reference"})},queryFile:async n=>(ai(t.getContext(),r,"query"),r.queryFile(t.getContext(),n.fileId)),listFiles:async n=>(ai(t.getContext(),r,"list"),r.listFiles(t.getContext(),n.limit??10)),deleteFile:async n=>{ai(t.getContext(),r,"delete"),await r.deleteFile(t.getContext(),n.fileId)}}}function Bv(t,e=zd){return!!e.resolveProvider(t)}function ai(t,e,r){if(!Bv(t,e))throw new Error(`No file ${r} provider available. Configure a media provider with Files API support (e.g. Volcengine, Google).`)}var RL={".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 qv(t,e){return!t?.webSearch||!t.capabilities.includes("web_search")?e:async(r,n)=>{try{let s=await t.webSearch(r,{maxResults:n?.maxResults});if(n?.allowedDomains?.length){let i=new Set(n.allowedDomains.map(a=>a.toLowerCase()));s=s.filter(a=>{try{return i.has(new URL(a.url).hostname.toLowerCase())}catch{return!1}})}if(n?.blockedDomains?.length){let i=new Set(n.blockedDomains.map(a=>a.toLowerCase()));s=s.filter(a=>{try{return!i.has(new URL(a.url).hostname.toLowerCase())}catch{return!0}})}if(s.length>0)return{query:r,results:s.map(i=>({title:i.title,url:i.url,snippet:i.snippet}))}}catch{}return e(r,n)}}var Qt=class{nodes=new Map;edges=[];constructor(e){for(let r of e){if(this.nodes.has(r.id))throw new Error(`Duplicate node ID: ${r.id}`);this.nodes.set(r.id,{id:r.id,kind:r.kind??"agent",params:r.params??{},status:"pending",outPorts:r.outPorts??["default"],joinPolicy:r.joinPolicy??"all",runIndex:0,maxIterations:r.maxIterations})}for(let r of e)for(let n of r.dependsOn??[]){if(!this.nodes.has(n))throw new Error(`Node "${r.id}" depends on unknown node "${n}"`);this.edges.push({from:n,to:r.id,fromPort:"default"})}this.validateDag()}getNode(e){return this.nodes.get(e)}getAllNodes(){return[...this.nodes.values()]}getReadyNodes(){let e=[];for(let r of this.nodes.values()){if(r.status!=="pending"||this.isBlockedByFailed(r.id))continue;let n=this.incomingForwardEdges(r.id);if(n.length===0){e.push(r);continue}r.joinPolicy==="any"?n.some(o=>this.edgeSatisfied(o))&&e.push(r):n.every(o=>this.edgeSatisfied(o))&&e.push(r)}return e}isFinished(){for(let e of this.nodes.values())if(e.status==="running"||e.status==="paused"||e.status==="pending"&&!this.isBlockedByFailed(e.id)&&!this.isSkippable(e.id))return!1;return!0}isAllCompleted(){return[...this.nodes.values()].every(e=>e.status==="completed"||e.status==="skipped")}getBlockedNodes(){return[...this.nodes.values()].filter(e=>e.status==="pending"&&this.isBlockedByFailed(e.id))}getProgress(){let e=0,r=0,n=0,o=0,s=0,i=0;for(let a of this.nodes.values())switch(a.status){case"completed":e++;break;case"running":r++;break;case"failed":n++;break;case"pending":o++;break;case"paused":s++;break;case"skipped":i++;break}return{total:this.nodes.size,completed:e,running:r,failed:n,pending:o,paused:s,skipped:i}}markRunning(e){let r=this.requireNode(e);if(r.status!=="pending")throw new Error(`Node "${e}" is ${r.status}, cannot start`);r.status="running",r.startedAt=Date.now()}markCompleted(e,r){let n=this.requireNode(e);if(n.status!=="running")throw new Error(`Node "${e}" is ${n.status}, cannot complete`);n.status="completed",n.output=r.output,n.completedAt=Date.now(),n.firedPorts=r.firedPorts??n.outPorts,this.propagateSkips()}markFailed(e,r){let n=this.requireNode(e);n.status="failed",n.error=r,n.completedAt=Date.now(),this.propagateSkips()}markPaused(e){let r=this.requireNode(e);r.status==="running"&&(r.status="paused")}resumePaused(e){let r=this.requireNode(e);r.status==="paused"&&(r.status="pending")}markSkipped(e){let r=this.requireNode(e);if(r.status!=="pending")throw new Error(`Node "${e}" is ${r.status}, cannot skip`);r.status="skipped",r.firedPorts=[],this.propagateSkips()}pauseAll(){for(let e of this.nodes.values())e.status==="running"&&(e.status="paused")}resumeAll(){for(let e of this.nodes.values())e.status==="paused"&&(e.status="pending")}decideLoop(e,r){let n=this.requireNode(e);if(n.kind!=="loop")throw new Error(`Node "${e}" is not a loop controller`);if(!n.maxIterations||n.maxIterations<=0)throw new Error(`Loop "${e}" requires maxIterations > 0`);let o=n.iteration??0;r&&o<n.maxIterations?(n.iteration=o+1,n.firedPorts=["loop"],this.resetLoopScope(e)):(n.firedPorts=["done"],r&&(n.error=`loop_cap_reached:${n.maxIterations}`)),this.propagateSkips()}addNode(e){if(this.nodes.has(e.id))throw new Error(`Node "${e.id}" already exists`);for(let r of e.dependsOn??[])if(!this.nodes.has(r))throw new Error(`Node "${e.id}" depends on unknown node "${r}"`);this.nodes.set(e.id,{id:e.id,kind:e.kind??"agent",params:e.params??{},status:"pending",outPorts:e.outPorts??["default"],joinPolicy:e.joinPolicy??"all",runIndex:0,maxIterations:e.maxIterations});for(let r of e.dependsOn??[])this.edges.push({from:r,to:e.id,fromPort:"default"});try{this.validateDag()}catch(r){throw this.nodes.delete(e.id),this.edges=this.edges.filter(n=>n.to!==e.id||!e.dependsOn?.includes(n.from)),r}}addNodes(e){let r=[],n=[];try{for(let o of e){if(this.nodes.has(o.id))throw new Error(`Node "${o.id}" already exists`);for(let i of o.dependsOn??[])if(!this.nodes.has(i))throw new Error(`Unknown dep "${i}" for "${o.id}"`);this.nodes.set(o.id,{id:o.id,kind:o.kind??"agent",params:o.params??{},status:"pending",outPorts:o.outPorts??["default"],joinPolicy:o.joinPolicy??"all",runIndex:0,maxIterations:o.maxIterations}),r.push(o.id);let s=(o.dependsOn??[]).map(i=>({from:i,to:o.id,fromPort:"default"}));this.edges.push(...s),n.push(...s)}this.validateDag()}catch(o){for(let s of r)this.nodes.delete(s);throw this.edges=this.edges.filter(s=>!n.includes(s)),o}}removeNode(e){let r=this.requireNode(e);if(r.status==="running")throw new Error(`Cannot remove running node "${e}"`);if(r.status==="completed")throw new Error(`Cannot remove completed node "${e}"`);this.edges=this.edges.filter(n=>n.from!==e&&n.to!==e),this.nodes.delete(e)}retryNode(e,r){let n=this.requireNode(e);if(n.status!=="failed")throw new Error(`Node "${e}" is ${n.status}, only failed nodes can be retried`);n.status="pending",n.error=void 0,n.output=void 0,n.firedPorts=void 0,n.startedAt=void 0,n.completedAt=void 0,r&&Object.assign(n.params,r)}updateNodeParams(e,r){let n=this.requireNode(e);if(n.status!=="pending")throw new Error(`Node "${e}" is ${n.status}, can only update pending nodes`);Object.assign(n.params,r)}addEdge(e){let{from:r,to:n,fromPort:o="default",loopBack:s=!1}=e;if(!this.nodes.has(r))throw new Error(`Unknown source node "${r}"`);if(!this.nodes.has(n))throw new Error(`Unknown target node "${n}"`);let i=this.nodes.get(r);if(!s&&!i.outPorts.includes(o))throw new Error(`Node "${r}" has no outPort "${o}"`);if(!this.edges.find(c=>c.from===r&&c.to===n&&(c.fromPort??"default")===o))if(this.edges.push({from:r,to:n,fromPort:o,loopBack:s}),s){let c=this.nodes.get(n);if(!c.maxIterations||c.maxIterations<=0)throw this.edges.pop(),new Error(`LoopBack controller "${n}" requires maxIterations > 0`)}else try{this.validateDag()}catch(c){throw this.edges=this.edges.filter(l=>!(l.from===r&&l.to===n&&(l.fromPort??"default")===o)),c}}removeEdge(e,r,n){let o=n??"default";this.edges=this.edges.filter(s=>!(s.from===e&&s.to===r&&(s.fromPort??"default")===o))}serialize(){return[...this.nodes.values()].map(e=>{let r=this.incomingForwardEdges(e.id).map(n=>n.from);return{id:e.id,kind:e.kind,params:e.params,dependsOn:r,outPorts:e.outPorts,joinPolicy:e.joinPolicy,status:e.status,firedPorts:e.firedPorts,output:e.output,error:e.error,startedAt:e.startedAt,completedAt:e.completedAt,runIndex:e.runIndex,maxIterations:e.maxIterations,iteration:e.iteration}})}restore(e){for(let r of e){let n=this.nodes.get(r.id);n&&(n.status=r.status==="running"?"pending":r.status,n.output=r.output,n.error=r.error,n.firedPorts=r.firedPorts,n.startedAt=r.startedAt,n.completedAt=r.completedAt,n.runIndex=r.runIndex??0,n.iteration=r.iteration)}}edgeSatisfied(e){let r=this.nodes.get(e.from);if(!r||r.status!=="completed")return!1;let n=e.fromPort??"default";return(r.firedPorts??r.outPorts).includes(n)}edgeDead(e){let r=this.nodes.get(e.from);if(!r)return!1;if(r.status==="skipped")return!0;if(r.status==="completed"){if(r.kind==="loop"&&!(r.firedPorts??[]).includes("done"))return!1;let n=e.fromPort??"default";return!(r.firedPorts??r.outPorts).includes(n)}return!1}incomingForwardEdges(e){return this.edges.filter(r=>r.to===e&&!r.loopBack)}isBlockedByFailed(e){return this.incomingForwardEdges(e).some(r=>this.nodes.get(r.from)?.status==="failed")}isSkippable(e){let r=this.incomingForwardEdges(e);return r.length===0?!1:this.nodes.get(e).joinPolicy==="any"?r.every(o=>this.edgeDead(o)):r.some(o=>this.edgeDead(o))}propagateSkips(){let e=!0;for(;e;){e=!1;for(let r of this.nodes.values())r.status==="pending"&&this.isSkippable(r.id)&&(r.status="skipped",r.firedPorts=[],e=!0)}}resetLoopScope(e){let r=this.loopBodyNodes(e);for(let n of r){let o=this.nodes.get(n);o.status="pending",o.runIndex=(o.runIndex??0)+1,o.output=void 0,o.firedPorts=void 0,o.error=void 0,o.startedAt=void 0,o.completedAt=void 0}}loopBodyNodes(e){let r=new Set,n=(o,s)=>{for(let i of this.edges)i.from!==o||i.loopBack||s&&(i.fromPort??"default")!=="loop"||i.to!==e&&(r.has(i.to)||(r.add(i.to),n(i.to,!1)))};return n(e,!0),r}validateDag(){for(let s of this.edges){if(!this.nodes.has(s.from))throw new Error(`Edge references unknown source "${s.from}"`);if(!this.nodes.has(s.to))throw new Error(`Edge references unknown target "${s.to}"`)}let e=this.edges.filter(s=>!s.loopBack),r=new Set,n=new Set,o=s=>{if(n.has(s))throw new Error(`Cycle detected involving node "${s}"`);if(!r.has(s)){n.add(s);for(let i of e)i.from===s&&o(i.to);n.delete(s),r.add(s)}};for(let s of this.nodes.keys())o(s);for(let s of this.edges){if(!s.loopBack)continue;let i=this.nodes.get(s.to);if(!i?.maxIterations||i.maxIterations<=0)throw new Error(`LoopBack controller "${s.to}" must have maxIterations > 0`)}for(let s of this.nodes.values())if(s.maxIterations!==void 0&&s.maxIterations>1e3)throw new Error(`Loop "${s.id}" maxIterations ${s.maxIterations} exceeds the hard cap of 1000`)}requireNode(e){let r=this.nodes.get(e);if(!r)throw new Error(`Unknown node: "${e}"`);return r}};function gn(t,e){return e?{json:t,binary:e}:{json:t}}function Wv(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 Xd(e)}function Xd(t){return JSON.stringify(Vd(t))}function Vd(t){if(Array.isArray(t))return t.map(Vd);if(t&&typeof t=="object"){let e={};for(let r of Object.keys(t).sort())e[r]=Vd(t[r]);return e}return t}var zv=new Set(["__proto__","prototype","constructor"]);function Gv(t,e){let r=SL(t),n=new Qd(r,t),o=n.parseExpression();return n.expectEnd(),fn(o,e)}function eu(t,e){let r=t.match(/^\s*\{\{([\s\S]*)\}\}\s*$/);return r?Gv(r[1],e):t.includes("{{")?t.replace(/\{\{([\s\S]*?)\}\}/g,(n,o)=>{let s=Gv(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 Vv(t,e){return Jd(t,e)}function Jd(t,e){if(typeof t=="string")return eu(t,e);if(Array.isArray(t))return t.map(r=>Jd(r,e));if(t&&typeof t=="object"){let r={};for(let[n,o]of Object.entries(t))r[n]=Jd(o,e);return r}return t}function SL(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 Qd=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`)}},Xv=Symbol("nodeAccessor");function fn(t,e){switch(t.type){case"lit":return t.value;case"root":return TL(t.name,e);case"func":return wL(t.name,t.args.map(r=>fn(r,e)));case"prop":return Kv(fn(t.target,e),t.key);case"index":return Kv(fn(t.target,e),t.key);case"call":{if(fn(t.target,e)===Xv){let n=t.args.map(s=>fn(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 TL(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 Xv;default:throw new Error(`Unknown context root "$${t}" (allowed: $input $json $node $now $vars $trigger)`)}}function Kv(t,e){if(typeof e=="string"&&zv.has(e))throw new Error(`Access to "${e}" is forbidden`);if(t==null)throw new Error(`Cannot read "${e}" of ${t}`);if(typeof e=="number"){if(!Array.isArray(t))throw new Error(`Cannot index non-array with [${e}]`);return t[e]}return t[e]}function wL(t,e){switch(t){case"len":{let r=e[0];if(typeof r=="string"||Array.isArray(r))return r.length;if(r&&typeof r=="object")return Object.keys(r).length;throw new Error(`len() expects string/array/object, got ${typeof r}`)}case"upper":return String(di(e,0,"upper")).toUpperCase();case"lower":return String(di(e,0,"lower")).toLowerCase();case"default":return e[0]===null||e[0]===void 0?e[1]:e[0];case"jsonpath":return PL(e[0],String(di(e,1,"jsonpath")));case"date":return xL(e);case"eq":return Zd(e[0],e[1]);case"ne":return!Zd(e[0],e[1]);case"gt":return li(e[0],e[1])>0;case"gte":return li(e[0],e[1])>=0;case"lt":return li(e[0],e[1])<0;case"lte":return li(e[0],e[1])<=0;case"not":return!Yd(di(e,0,"not"));case"and":return e.every(Yd);case"or":return e.some(Yd);case"contains":return AL(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 Yd(t){return!!t}function Zd(t,e){return t===e?!0:typeof t!=typeof e?!1:t&&e&&typeof t=="object"?JSON.stringify(t)===JSON.stringify(e):!1}function li(t,e){if(typeof t=="number"&&typeof e=="number")return t-e;if(typeof t=="string"&&typeof e=="string")return t<e?-1:t>e?1:0;throw new Error(`Cannot compare ${typeof t} with ${typeof e}`)}function AL(t,e){if(typeof t=="string")return t.includes(String(e));if(Array.isArray(t))return t.some(r=>Zd(r,e));throw new Error("contains() expects string/array as first argument")}function di(t,e,r){if(t.length<=e||t[e]===void 0)throw new Error(`${r}() missing required argument #${e+1}`);return t[e]}function PL(t,e){let r=e.match(/[^.[\]]+/g)??[],n=t;for(let o of r){if(zv.has(o))throw new Error(`jsonpath segment "${o}" is forbidden`);if(n==null)return;let s=/^\d+$/.test(o)?Number(o):o;n=n[s]}return n}function xL(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 CL=(t,e)=>({outputs:{default:[{json:e.json&&typeof e.json=="object"&&!Array.isArray(e.json)?e.json:{value:e.json??e.value??null}}]}}),IL=t=>({outputs:{default:t.default??[]}}),EL=t=>{let e=[];for(let r of Object.keys(t))e.push(...t[r]);return{outputs:{default:e}}},ML=(t,e)=>{let n=!!e.condition?"true":"false",o=t.default??[],s={true:[],false:[]};return s[n]=o,{outputs:s,firedPorts:[n]}},_L=(t,e,r)=>({outputs:{default:[{json:r.trigger??(e.payload&&typeof e.payload=="object"&&!Array.isArray(e.payload)?e.payload:{})}]}}),Yv={set:CL,passthrough:IL,merge:EL,if:ML,trigger:_L};var hn=class{executors=new Map;constructor(e=!0){if(e)for(let[r,n]of Object.entries(Yv))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 yn(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 Jv(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 DL=async(t,e,r)=>({outputs:{default:await fo(r.host,"agent").runAgent({agentId:typeof e.agentId=="string"?e.agentId:void 0,prompt:yn(e,"prompt","agent"),input:t.default??[],signal:r.signal})}}),NL=async(t,e,r)=>({outputs:{default:await fo(r.host,"tool").invokeTool({tool:yn(e,"tool","tool"),args:Jv(e,"args"),input:t.default??[],signal:r.signal})}}),LL=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:yn(e,"url","http"),headers:e.headers,body:e.body,signal:r.signal})}}},OL=async(t,e,r)=>({outputs:{default:await fo(r.host,"mcp").invokeMcp({server:yn(e,"server","mcp"),tool:yn(e,"tool","mcp"),args:Jv(e,"args"),signal:r.signal})}}),jL=async(t,e,r)=>({outputs:{default:await fo(r.host,"channel").sendChannel({channel:yn(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:DL,tool:NL,http:LL,mcp:OL,channel:jL},L8=Object.keys(ho);var vn=class extends Error{constructor(r){super(r?`Workflow paused at "${r}"`:"Workflow paused");this.atNodeId=r;this.name="WorkflowPauseSignal"}atNodeId},ui=class{constructor(e,r={}){this.def=e;if(this.registry=r.registry??new hn,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 vn)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 vn(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=Vv(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"?eu(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 Xd([e,r,Wv(n),o])}buildDag(){let e=this.def.nodes.map(n=>({id:n.id,kind:n.kind,params:n.params??{},outPorts:n.outPorts??$L(n.kind),joinPolicy:n.joinPolicy??"all",maxIterations:n.maxIterations})),r=new Qt(e);for(let n of this.def.edges)n.loopBack||r.addEdge({from:n.from,to:n.to,fromPort:n.fromPort??"default"});for(let n of this.def.edges)n.loopBack&&r.addEdge({from:n.from,to:n.to,loopBack:!0});return r}};function $L(t){return t==="if"?["true","false"]:t==="loop"?["loop","done"]:["default"]}var UL=new Set(["agent","tool","http","mcp","channel","im"]),tu=class extends Error{constructor(r,n,o){super(`Permission denied: node "${r}" (kind "${n}") may not run under unattended trigger "${o}". Authorize it by adding "${n}" to allowUnattendedKinds.`);this.nodeId=r;this.kind=n;this.trigger=o;this.name="WorkflowPermissionDenied"}nodeId;kind;trigger},pi=class extends vn{constructor(r,n,o){super(r);this.reason=n;this.limit=o;this.name="WorkflowBudgetExceeded",this.message=`Budget exceeded (${n} limit ${o}) before node "${r}"`}reason;limit},mi=class{trigger;maxNodeExecutions;maxDurationMs;allow;now;executions=0;startedAt=-1;constructor(e){if(!Number.isInteger(e.maxNodeExecutions)||e.maxNodeExecutions<=0)throw new Error(`BudgetPermissionGate: maxNodeExecutions must be a positive integer, got ${e.maxNodeExecutions}`);if(e.maxDurationMs!==void 0&&!(e.maxDurationMs>0))throw new Error(`BudgetPermissionGate: maxDurationMs must be greater than 0 when provided, got ${e.maxDurationMs}`);this.trigger=e.trigger,this.maxNodeExecutions=e.maxNodeExecutions,this.maxDurationMs=e.maxDurationMs,this.allow=new Set(e.allowUnattendedKinds??[]),this.now=e.now??(()=>Date.now())}get unattended(){return this.trigger!=="manual"}check(e,r){if(this.unattended&&UL.has(r)&&!this.allow.has(r))throw new tu(e,r,this.trigger);if(this.startedAt<0&&(this.startedAt=this.now()),this.maxDurationMs!==void 0&&this.now()-this.startedAt>=this.maxDurationMs)throw new pi(e,"duration",this.maxDurationMs);if(this.executions>=this.maxNodeExecutions)throw new pi(e,"executions",this.maxNodeExecutions);this.executions++}extend(e){if(e.executions!==void 0){if(!Number.isInteger(e.executions)||e.executions<=0)throw new Error(`BudgetPermissionGate.extend: executions delta must be a positive integer, got ${e.executions}`);this.maxNodeExecutions+=e.executions}if(e.durationMs!==void 0){if(!(e.durationMs>0))throw new Error(`BudgetPermissionGate.extend: durationMs delta must be greater than 0, got ${e.durationMs}`);if(this.maxDurationMs===void 0)throw new Error("BudgetPermissionGate.extend: cannot extend duration on a gate with no duration cap");this.maxDurationMs+=e.durationMs}}};function eb(t){switch(t.type){case"manual":return[];case"schedule":return nu(t.cron);case"im-message":return BL(t.channel,t.match);case"webhook":return qL(t.path);default:return[`unknown trigger type: ${JSON.stringify(t)}`]}}var Qv=["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"],Zv=["SUN","MON","TUE","WED","THU","FRI","SAT"];function nu(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:Qv},{label:"day-of-week",min:0,max:7,names:Zv}]:[{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:Qv},{label:"day-of-week",min:0,max:7,names:Zv}],o=[];for(let s=0;s<n.length;s++){let i=FL(e[s],n[s]);i&&o.push(`schedule.cron ${i}`)}return o}function FL(t,e){for(let r of t.split(",")){let n=HL(r,e);if(n)return n}}function HL(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=ru(r.slice(0,s),e),c=ru(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(ru(r,e)===void 0)return`${e.label} value "${r}" is out of range ${e.min}-${e.max}`}function ru(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 BL(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 qL(t){return typeof t!="string"||t===""?["webhook.path must be a non-empty string"]:t.startsWith("/")?/\s/.test(t)?[`webhook.path must not contain whitespace: "${t}"`]:t.includes("..")?[`webhook.path must not contain "..": "${t}"`]:/^\/[A-Za-z0-9\-._~/]*$/.test(t)?[]:[`webhook.path contains illegal characters: "${t}"`]:[`webhook.path must start with "/": "${t}"`]}var ur=class extends Error{constructor(r){super(`Patch rejected: ${r.join("; ")}`);this.errors=r;this.name="PatchError"}errors};function tb(t,e){let r=[],n=KL(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=WL(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=eb(d.trigger);if(u.length>0)for(let m of u)r.push(`${p}: ${m}`);else n.meta.trigger=d.trigger}else n.meta.trigger=d.trigger;break}case"set_meta":{s?r.push(`${p}: meta is workflow-global and cannot be changed in a scoped edit`):(d.meta.name!==void 0&&(n.meta.name=d.meta.name),d.meta.active!==void 0&&(n.meta.active=d.meta.active));break}default:r.push(`${p}: unknown op`)}r.length===0&&c.push(d)}if(r.length>0)throw new ur(r);if(rb(n.def,r),r.length>0)throw new ur(r);return{target:n,applied:c}}function WL(t,e){let r={...t??{}};for(let[n,o]of Object.entries(e))o===null?delete r[n]:r[n]=o;return r}function ou(t){let e=[];return rb(t,e),e}function rb(t,e){try{let r=t.nodes.map(o=>({id:o.id,kind:o.kind,params:o.params??{},outPorts:o.outPorts??GL(o.kind),joinPolicy:o.joinPolicy??"all",maxIterations:o.maxIterations})),n=new Qt(r);for(let o of t.edges)o.loopBack||n.addEdge({from:o.from,to:o.to,fromPort:o.fromPort??"default"});for(let o of t.edges)o.loopBack&&n.addEdge({from:o.from,to:o.to,loopBack:!0})}catch(r){e.push(`graph invalid: ${r.message}`)}}function GL(t){return t==="if"?["true","false"]:t==="loop"?["loop","done"]:["default"]}function KL(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 nb(t,e={}){let r=e.maxNodes??50,n=e.maxValueLen??60,o=`Workflow ${JSON.stringify(t.name)} (rev ${t.rev}, trigger: ${zL(t.trigger)}, ${t.active?"active":"inactive"})`,s=t.def.nodes,a=s.slice(0,r).map(p=>" "+VL(p,n)),c=s.length===0?"nodes: (none)":["nodes:",...a].join(`
|
|
356
356
|
`),l=s.length>r?`
|
|
357
357
|
\u2026 ${s.length-r} more node(s); call workflow.get for the full definition`:"",d=JL(t.def.edges);return`${o}
|
|
358
358
|
${c}${l}
|
|
359
359
|
${d}`}function zL(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 VL(t,e){let r=t.name?` "${t.name}"`:"",n=XL(t.params,e),o=(t.outPorts??QL(t.kind)).join(","),s=[`${t.id} [${t.kind}]${r}`];return n&&s.push(n),s.push(`out: ${o}`),s.join(" ")}function XL(t,e){if(!t)return"";let r=Object.keys(t).sort();return r.length===0?"":r.map(n=>`${n}=${YL(t[n],e)}`).join(" ")}function YL(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 JL(t){return t.length===0?"edges: (none)":`edges:
|
|
360
360
|
${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 QL(t){return t==="if"?["true","false"]:t==="loop"?["loop","done"]:["default"]}var ZL={"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 ob(t,e){let r=eO(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=ZL[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?tO(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 eO(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 tO(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=rO(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 rO(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 pr=class{constructor(e,r){this.store=e;this.runtimeFactory=r}store;runtimeFactory;slots=new Map;async create(e){let r=ou(e.def);if(r.length>0)throw new ur(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=ou(o.def);if(s.length>0)throw new ur(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}=ob(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 nb(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=tb(s,r);i=l.applied,a=l.target}catch(l){if(o&&l instanceof ur)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 sb(t){return(e,r)=>new ui(e,{registry:t.registry,host:t.host,trigger:r.payload,now:t.now,gate:new mi({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 fi}from"node:path";import{mkdir as uO,readdir as pO,rm as mO}from"node:fs/promises";import{readFile as nO,writeFile as oO,mkdir as sO,rename as iO,unlink as aO}from"node:fs/promises";import{dirname as cO,join as lO}from"node:path";import{randomUUID as dO}from"node:crypto";async function bn(t,e){let r=cO(t);await sO(r,{recursive:!0});let n=lO(r,`.tmp-${dO()}`);try{await oO(n,e,"utf-8");let o;for(let s=0;s<3;s++)try{await iO(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 aO(n).catch(()=>{}),o}}async function Zt(t){try{let e=await nO(t,"utf-8");return JSON.parse(e)}catch(e){if(e.code==="ENOENT")return;throw e}}async function mr(t,e){await bn(t,JSON.stringify(e,null,2)+`
|
|
361
|
-
`)}function gi(t){return fi(I().getProjectAgentDir(t),"workflows")}function ib(t,e){return fi(gi(e),t,"workflow.json")}var gr=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=fi(gi(this.cwd),e.id);await uO(r,{recursive:!0}),await mr(ib(e.id,this.cwd),e)}async load(e){return Zt(ib(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 pO(gi(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 mO(fi(gi(this.cwd),e),{recursive:!0,force:!0})}};var ab=null;function cb(t){ab=t}function hi(){return ab}var gO=[{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"}],fO=[/\.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 lb(){return[...gO]}function su(t){return fO.some(e=>e.test(t))}function db(t,e){let r=[];for(let n of t)n.register(r,e);return r}function iu(t,e,r="local"){return{id:t,kind:r,register:e}}var du=!1;function uu(t){du=t}var mb=null,yO;var au;function gb(t){au=t}function fb(t){mb=t}var Ge=process.cwd(),cu=!1,yi=!1;function vi(t){yi=t}function hb(t){Ge=t,cu=!0,Ys(t)}function
|
|
362
|
-
`))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
|
|
363
|
-
`);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 pb=!1;function xO(){if(!pb)if(pb=!0,Dr()){let t=process.env.QLOGICAGENT_POWERSHELL_PATH??"powershell.exe";uo(Ad(t))}else if(process.platform==="win32"){let t=CO();uo(Zs(t))}else{let t=process.env.SHELL?.endsWith("bash")?process.env.SHELL:"/bin/bash";uo(Zs(t))}}function CO(){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 IO(){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=EO(s)),{content:s,title:MO(s)}}finally{clearTimeout(r)}}}}function EO(t){return t.replace(/<script[\s\S]*?<\/script>/gi,"").replace(/<style[\s\S]*?<\/style>/gi,"").replace(/<[^>]+>/g," ").replace(/ /gi," ").replace(/&/gi,"&").replace(/</gi,"<").replace(/>/gi,">").replace(/"/gi,'"').replace(/'/gi,"'").replace(/\s{2,}/g," ").trim()}function MO(t){return t.match(/<title[^>]*>([^<]+)<\/title>/i)?.[1]?.trim()}function _O(){let t=async(e,r)=>{let{getModelRegistry:n}=await Promise.resolve().then(()=>(He(),Tm)),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)=>qv(Lv(),t)(e,r)}}function DO(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 NO={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 LO(t){for(let e of t)e.category??=NO[e.name]??"other",e.displayName??={key:`capability.tool.${e.name}.name`,fallback:e.label},e.displayDescription??={key:`capability.tool.${e.name}.description`,fallback:""}}var OO=()=>{throw new Error("workflow tool: this controller is authoring-only; `run` requires the initialized engine")};function jO(t){function e(){let r=new gr(t),n=hi();return{controller:n??new pr(r,OO),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 bb(t){t?.workdir&&(Ge=t.workdir);let e=t?.toolCatalog??Lr(),r=()=>e.getToolNames(),n=i=>e.findTool(i),o=i=>e.activateTool(i);xO(),Ys(Ge);let s=db([iu("cli-local-tools",i=>{let a=i;a.push(Jh()),a.push(Yh(void 0,{onTaskCreated:g=>au?.onTaskCreated?.(g),onTaskCompleted:g=>au?.onTaskCompleted?.(g)})),a.push(fv({askUser:async g=>mb?.(g)??null})),a.push(dy({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=bO(),l=kO(),d=RO(),p=SO();a.push(my(c)),a.push(fy(l)),a.push(hy(d)),a.push(Md(p)),a.push(ky(p)),a.push(by(TO())),a.push(Iy(IO())),a.push(Ey(_O()));let u=DO(t?.pathService);a.push(My(u));let m=t?.log??{info:()=>{},warn:()=>{}};a.push(_y(Ky({log:m}))),a.push(Yy()),a.push(Jy({getService:()=>jO(Ge)})),a.push(Qy({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=>Ct(g),onSwitched:g=>yO?.(g)};a.push(hv(f)),a.push(ev({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)}))}),iu("media-tools",i=>{let a=i;a.push({...tv({generateImage:async l=>{let d=await Et({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:()=>Mt("image")}),a.push({...rv({textToSpeech:async l=>{let d=await Et({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:()=>Mt("tts")}),a.push({...nv({generateVideo:async l=>{let d=await Et({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:()=>Mt("video")}),a.push({...ov({generateMusic:async l=>{let d=await Et({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:jv}),isConcurrencySafe:!0,isEnabled:()=>Mt("music")}),a.push({...sv({editVideo:async l=>{let d=await Et({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:()=>ii("video","edit")}),a.push({...iv({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 Et({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:()=>ii("video","merge")}),a.push({...av({upscaleVideo:async l=>{let d=["upscale"];l.sharpness&&d.push(`sharpness: ${l.sharpness}`);let p=await Et({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:()=>ii("video","upscale")}),a.push({...cv({generate3D:async l=>{let d=await Et({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:()=>Mt("3d")}),a.push({...lv({speechToText:async l=>{let d=await Et({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:()=>Mt("stt")}),a.push({...dv({cloneVoice:async l=>{let d=await Et({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:()=>Mt("voice_clone")}),a.push({...uv({cancelTask:$v}),shouldDefer:!0,isEnabled:()=>Mt("video")||Mt("3d")});let c=Hv({getContext:Ov,resolvePath:Ae});a.push({...pv(c),shouldDefer:!0,isEnabled:()=>c.isAvailable()}),a.push({...mv(c),shouldDefer:!0,isEnabled:()=>c.isAvailable()}),a.push({...gv(c),shouldDefer:!0,isEnabled:()=>c.isAvailable()})})],{config:t});return LO(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 tr(t){return Mv(t)}function kb(t){return{getAllBaseTools:e=>bb({...e,toolCatalog:e?.toolCatalog??t}),setWorkdir:hb}}var $O=new Set(["permissionMode","permissionRules","defaultBehavior"]);function Rb(t){let e=t.params;this.syncToolListMediaConfig?.();let r=this.toolCatalog??tr(),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 Sb(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 Tb(t){try{let r=D().exportConfig(),n=Ue(),o={};try{o=JSON.parse(Ut.readFileSync(n,"utf-8"))}catch{}t.id!==void 0&&this.sendResponse(t.id,{config:{...UO(o),providers:HO(r.providers),models:r.models,bindings:r.bindings,permissions:Ab(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 UO(t){let e={};for(let[r,n]of Object.entries(t)){if(fu.has(r)||$O.has(r))continue;let o=mu(r,n);o!==void 0&&(e[r]=o)}return e}function mu(t,e){if(FO(t))return typeof e=="string"?wb(e):"[REDACTED]";if(Array.isArray(e))return e.map(r=>mu(t,r));if(e&&typeof e=="object"){let r={};for(let[n,o]of Object.entries(e)){if(fu.has(n))continue;let s=mu(n,o);s!==void 0&&(r[n]=s)}return r}return e}function FO(t){return/(?:apiKey|key|token|secret|credential|authorization|password)/i.test(t)}function HO(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:wb(r.key),weight:r.weight,enabled:r.enabled};return r.label&&(n.label=r.label),n}),...e.rateLimit?{rateLimit:e.rateLimit}:{}}))}function wb(t){return t.length<=8?"****":`${t.slice(0,3)}***${t.slice(-4)}`}var fu=new Set(["providers","models","bindings","provider","model","apiKey","baseUrl","providerKeys"]);async function Pb(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))fu.has(o)?r.push({key:o,reason:"Use settings.* RPC methods for model/key management"}):n[o]=o==="permissions"?Ab(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 Ut.promises.readFile(o,"utf-8");s=JSON.parse(i)}catch{}Object.assign(s,n),await Ut.promises.mkdir(gu.dirname(o),{recursive:!0}),await Ut.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 Ab(t){if(!t||typeof t!="object")return;let e=t.mode;if(e==="default"||e==="auto"||e==="full_access")return{mode:e}}function xb(t){try{let e=xc(),r=Ue(),n={};try{let o=Ut.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 Cb(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=xc();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 Ut.promises.readFile(i,"utf-8");a=JSON.parse(c)}catch{}(!a.tunables||typeof a.tunables!="object")&&(a.tunables={}),a.tunables[r]=n,await Ut.promises.mkdir(gu.dirname(i),{recursive:!0}),await Ut.promises.writeFile(i,JSON.stringify(a,null,2),"utf-8"),r==="teamBudgetTokens"&&typeof n=="number"&&(ht.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 Ib(t){let e=(this.toolCatalog??tr()).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 Eb(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 Mb(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 _b=["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 Db(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=Rr.split(".")[0];if(s!==i){this.log(`[initialize] protocol mismatch: host=${r} agent=${Rr}`),t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.PROTOCOL_MISMATCH,message:`Protocol version mismatch: host=${r}, agent=${Rr}`});return}this.log(`[initialize] host=${n} v${o}`),t.id!==void 0&&this.sendResponse(t.id,{protocolVersion:Rr,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:[..._b]}}),this.ensureDefaultProject()}function Nb(t){t.id!==void 0&&this.sendResponse(t.id,{status:"ok"}),this.sendNotification("pong",{})}function Lb(t){t.id!==void 0&&this.sendResponse(t.id,{ok:!0,status:this.running?"healthy":"stopping",uptimeMs:Date.now()-this.startedAt,protocolVersion:Rr,version:this.packageVersion})}function Ob(t){t.id!==void 0&&this.sendResponse(t.id,{rpc:this.rpcContract.metrics()})}function jb(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 $b=hc,Ub=yc,bi=class{dir;constructor(e){this.dir=Xr(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>$b)throw new Error(`File too large: ${n} bytes exceeds ${$b} limit`);if(this.getDirSize(e)+n>Ub)throw new Error(`Total instructions size would exceed ${Ub} 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>
|
|
361
|
+
`)}function gi(t){return fi(I().getProjectAgentDir(t),"workflows")}function ib(t,e){return fi(gi(e),t,"workflow.json")}var gr=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=fi(gi(this.cwd),e.id);await uO(r,{recursive:!0}),await mr(ib(e.id,this.cwd),e)}async load(e){return Zt(ib(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 pO(gi(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 mO(fi(gi(this.cwd),e),{recursive:!0,force:!0})}};var ab=null;function cb(t){ab=t}function hi(){return ab}var gO=[{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"}],fO=[/\.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 lb(){return[...gO]}function su(t){return fO.some(e=>e.test(t))}function db(t,e){let r=[];for(let n of t)n.register(r,e);return r}function iu(t,e,r="local"){return{id:t,kind:r,register:e}}var du=!1;function uu(t){du=t}var mb=null,yO;var au;function gb(t){au=t}function fb(t){mb=t}var Ge=process.cwd(),cu=!1,yi=!1;function vi(t){yi=t}function hb(t){Ge=t,cu=!0,Ys(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 er(t){return yi||yo(t)?null:`Blocked: path "${t}" is outside the workspace boundary "${Ge}"`}function ub(t){let e=t.replace(/\\/g,"/");return e.includes("../")||e.includes("..")}var vO=new Set([".png",".jpg",".jpeg",".gif",".webp",".bmp",".svg",".ico"]),yb=new Set([".exe",".dll",".so",".dylib",".zip",".tar",".gz",".7z",".rar",".wasm",".class"]),lu=new Set;function bO(){return{resolvePath:xe,async readFile(t){let e=xe(t),r=U.extname(e).toLowerCase();if(cu){let o=er(e);if(o)throw new Error(o)}else if(!yi&&ub(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(yb.has(r))return{type:"binary",mimeType:"application/octet-stream"};if(vO.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 lu.add(e),{type:"text",text:n}},validatePath(t){let e=xe(t);if(cu){let r=er(e);if(r)return r}else if(!yi&&ub(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}`:du&&su(e)?"Blocked: reading sensitive file in group chat mode":null}}}function kO(){return{resolvePath:xe,validatePath(t){let e=xe(t),r=er(e);return r||(e.startsWith("/dev/")||e.startsWith("/proc/")||e.startsWith("/sys/")?`Blocked: writing to device/system path ${e}`:du&&su(e)?"Blocked: writing sensitive file in group chat mode":null)},checkReadBeforeWrite(t){try{j.accessSync(t,j.constants.F_OK)}catch{return null}return lu.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=er(r);if(n)throw new Error(n);await j.promises.mkdir(U.dirname(r),{recursive:!0}),await j.promises.writeFile(r,e,"utf8"),lu.add(r)}}}function RO(){return{resolvePath:xe,async readFile(t){let e=xe(t),r=er(e);if(r)throw new Error(r);return j.promises.readFile(e,"utf8")},async writeFile(t,e){let r=xe(t),n=er(r);if(n)throw new Error(n);await j.promises.mkdir(U.dirname(r),{recursive:!0}),await j.promises.writeFile(r,e,"utf8")}}}function SO(){return{resolvePath:xe,async readFile(t){let e=xe(t),r=er(e);if(r)throw new Error(r);return j.promises.readFile(e,"utf8")},async writeFile(t,e){let r=xe(t),n=er(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=er(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 TO(){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=vb(c);try{await pu(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 AO(t,r,e)}catch{return await PO(t,r,e)}}}}function vb(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 wO=new Set([".git",".svn",".hg","node_modules","__pycache__",".next","dist",".tox",".venv"]);async function pu(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(wO.has(i.name))continue;await pu(U.join(t,i.name),e,r,n+1,a)}else if(i.isFile()&&!await e(a))return}}function AO(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("."),hO("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(`
|
|
362
|
+
`))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 PO(t,e,r){let n=new RegExp(t,r.caseInsensitive?"i":""),o=r.headLimit??250,s=r.offset??0,i=r.fileGlob?vb(r.fileGlob):null,a=[],c=!1;return await pu(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(yb.has(d))return!0;try{let u=(await j.promises.readFile(U.join(e,l),"utf8")).split(`
|
|
363
|
+
`);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 pb=!1;function xO(){if(!pb)if(pb=!0,Dr()){let t=process.env.QLOGICAGENT_POWERSHELL_PATH??"powershell.exe";uo(Pd(t))}else if(process.platform==="win32"){let t=CO();uo(Zs(t))}else{let t=process.env.SHELL?.endsWith("bash")?process.env.SHELL:"/bin/bash";uo(Zs(t))}}function CO(){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 IO(){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=EO(s)),{content:s,title:MO(s)}}finally{clearTimeout(r)}}}}function EO(t){return t.replace(/<script[\s\S]*?<\/script>/gi,"").replace(/<style[\s\S]*?<\/style>/gi,"").replace(/<[^>]+>/g," ").replace(/ /gi," ").replace(/&/gi,"&").replace(/</gi,"<").replace(/>/gi,">").replace(/"/gi,'"').replace(/'/gi,"'").replace(/\s{2,}/g," ").trim()}function MO(t){return t.match(/<title[^>]*>([^<]+)<\/title>/i)?.[1]?.trim()}function _O(){let t=async(e,r)=>{let{getModelRegistry:n}=await Promise.resolve().then(()=>(He(),Tm)),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)=>qv(Lv(),t)(e,r)}}function DO(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 NO={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 LO(t){for(let e of t)e.category??=NO[e.name]??"other",e.displayName??={key:`capability.tool.${e.name}.name`,fallback:e.label},e.displayDescription??={key:`capability.tool.${e.name}.description`,fallback:""}}var OO=()=>{throw new Error("workflow tool: this controller is authoring-only; `run` requires the initialized engine")};function jO(t){function e(){let r=new gr(t),n=hi();return{controller:n??new pr(r,OO),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 bb(t){t?.workdir&&(Ge=t.workdir);let e=t?.toolCatalog??Lr(),r=()=>e.getToolNames(),n=i=>e.findTool(i),o=i=>e.activateTool(i);xO(),Ys(Ge);let s=db([iu("cli-local-tools",i=>{let a=i;a.push(Jh()),a.push(Yh(void 0,{onTaskCreated:g=>au?.onTaskCreated?.(g),onTaskCompleted:g=>au?.onTaskCompleted?.(g)})),a.push(fv({askUser:async g=>mb?.(g)??null})),a.push(dy({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=bO(),l=kO(),d=RO(),p=SO();a.push(my(c)),a.push(fy(l)),a.push(hy(d)),a.push(Md(p)),a.push(ky(p)),a.push(by(TO())),a.push(Iy(IO())),a.push(Ey(_O()));let u=DO(t?.pathService);a.push(My(u));let m=t?.log??{info:()=>{},warn:()=>{}};a.push(_y(Ky({log:m}))),a.push(Yy()),a.push(Jy({getService:()=>jO(Ge)})),a.push(Qy({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=>Ct(g),onSwitched:g=>yO?.(g)};a.push(hv(f)),a.push(ev({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)}))}),iu("media-tools",i=>{let a=i;a.push({...tv({generateImage:async l=>{let d=await Et({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:()=>Mt("image")}),a.push({...rv({textToSpeech:async l=>{let d=await Et({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:()=>Mt("tts")}),a.push({...nv({generateVideo:async l=>{let d=await Et({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:()=>Mt("video")}),a.push({...ov({generateMusic:async l=>{let d=await Et({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:jv}),isConcurrencySafe:!0,isEnabled:()=>Mt("music")}),a.push({...sv({editVideo:async l=>{let d=await Et({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:()=>ii("video","edit")}),a.push({...iv({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 Et({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:()=>ii("video","merge")}),a.push({...av({upscaleVideo:async l=>{let d=["upscale"];l.sharpness&&d.push(`sharpness: ${l.sharpness}`);let p=await Et({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:()=>ii("video","upscale")}),a.push({...cv({generate3D:async l=>{let d=await Et({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:()=>Mt("3d")}),a.push({...lv({speechToText:async l=>{let d=await Et({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:()=>Mt("stt")}),a.push({...dv({cloneVoice:async l=>{let d=await Et({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:()=>Mt("voice_clone")}),a.push({...uv({cancelTask:$v}),shouldDefer:!0,isEnabled:()=>Mt("video")||Mt("3d")});let c=Hv({getContext:Ov,resolvePath:xe});a.push({...pv(c),shouldDefer:!0,isEnabled:()=>c.isAvailable()}),a.push({...mv(c),shouldDefer:!0,isEnabled:()=>c.isAvailable()}),a.push({...gv(c),shouldDefer:!0,isEnabled:()=>c.isAvailable()})})],{config:t});return LO(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 tr(t){return Mv(t)}function kb(t){return{getAllBaseTools:e=>bb({...e,toolCatalog:e?.toolCatalog??t}),setWorkdir:hb}}var $O=new Set(["permissionMode","permissionRules","defaultBehavior"]);function Rb(t){let e=t.params;this.syncToolListMediaConfig?.();let r=this.toolCatalog??tr(),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 Sb(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 Tb(t){try{let r=D().exportConfig(),n=Ue(),o={};try{o=JSON.parse(Ut.readFileSync(n,"utf-8"))}catch{}t.id!==void 0&&this.sendResponse(t.id,{config:{...UO(o),providers:HO(r.providers),models:r.models,bindings:r.bindings,permissions:Pb(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 UO(t){let e={};for(let[r,n]of Object.entries(t)){if(fu.has(r)||$O.has(r))continue;let o=mu(r,n);o!==void 0&&(e[r]=o)}return e}function mu(t,e){if(FO(t))return typeof e=="string"?wb(e):"[REDACTED]";if(Array.isArray(e))return e.map(r=>mu(t,r));if(e&&typeof e=="object"){let r={};for(let[n,o]of Object.entries(e)){if(fu.has(n))continue;let s=mu(n,o);s!==void 0&&(r[n]=s)}return r}return e}function FO(t){return/(?:apiKey|key|token|secret|credential|authorization|password)/i.test(t)}function HO(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:wb(r.key),weight:r.weight,enabled:r.enabled};return r.label&&(n.label=r.label),n}),...e.rateLimit?{rateLimit:e.rateLimit}:{}}))}function wb(t){return t.length<=8?"****":`${t.slice(0,3)}***${t.slice(-4)}`}var fu=new Set(["providers","models","bindings","provider","model","apiKey","baseUrl","providerKeys"]);async function Ab(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))fu.has(o)?r.push({key:o,reason:"Use settings.* RPC methods for model/key management"}):n[o]=o==="permissions"?Pb(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 Ut.promises.readFile(o,"utf-8");s=JSON.parse(i)}catch{}Object.assign(s,n),await Ut.promises.mkdir(gu.dirname(o),{recursive:!0}),await Ut.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 Pb(t){if(!t||typeof t!="object")return;let e=t.mode;if(e==="default"||e==="auto"||e==="full_access")return{mode:e}}function xb(t){try{let e=xc(),r=Ue(),n={};try{let o=Ut.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 Cb(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=xc();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 Ut.promises.readFile(i,"utf-8");a=JSON.parse(c)}catch{}(!a.tunables||typeof a.tunables!="object")&&(a.tunables={}),a.tunables[r]=n,await Ut.promises.mkdir(gu.dirname(i),{recursive:!0}),await Ut.promises.writeFile(i,JSON.stringify(a,null,2),"utf-8"),r==="teamBudgetTokens"&&typeof n=="number"&&(ht.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 Ib(t){let e=(this.toolCatalog??tr()).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 Eb(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 Mb(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 _b=["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 Db(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=Rr.split(".")[0];if(s!==i){this.log(`[initialize] protocol mismatch: host=${r} agent=${Rr}`),t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.PROTOCOL_MISMATCH,message:`Protocol version mismatch: host=${r}, agent=${Rr}`});return}this.log(`[initialize] host=${n} v${o}`),t.id!==void 0&&this.sendResponse(t.id,{protocolVersion:Rr,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:[..._b]}}),this.ensureDefaultProject()}function Nb(t){t.id!==void 0&&this.sendResponse(t.id,{status:"ok"}),this.sendNotification("pong",{})}function Lb(t){t.id!==void 0&&this.sendResponse(t.id,{ok:!0,status:this.running?"healthy":"stopping",uptimeMs:Date.now()-this.startedAt,protocolVersion:Rr,version:this.packageVersion})}function Ob(t){t.id!==void 0&&this.sendResponse(t.id,{rpc:this.rpcContract.metrics()})}function jb(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 $b=hc,Ub=yc,bi=class{dir;constructor(e){this.dir=Xr(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>$b)throw new Error(`File too large: ${n} bytes exceeds ${$b} limit`);if(this.getDirSize(e)+n>Ub)throw new Error(`Total instructions size would exceed ${Ub} 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>
|
|
364
364
|
${e.map(n=>`<!-- file: ${n.filename}>
|
|
365
365
|
${n.content}`).join(`
|
|
366
366
|
|
|
367
367
|
`)}
|
|
368
|
-
</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 Ft(t){return
|
|
369
|
-
`).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 Gb(t){let e=t.params,r;if(e?.projectId&&(r=Ft(e.projectId)??void 0),r||(r=this.getActiveProjectRoot()),!r){t.id!==void 0&&this.sendResponse(t.id,{instructions:[]});return}let n=[],o=br(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=ki(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 Kb(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=Ft(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=br(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=ki(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 zb(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=br(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=ki(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 Vb(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=br(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=ki(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 Xb(t){let e=t.params,r;if(e?.projectId&&(r=Ft(e.projectId)??void 0),r||(r=this.getActiveProjectRoot()),!r){t.id!==void 0&&this.sendResponse(t.id,{plans:[]});return}let n=ze.join(
|
|
368
|
+
</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 Ft(t){return we(t)?.workspaceDir??null}function ki(t){return t?new bi(t):null}async function Fb(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,{entries:[]});return}let r=Ft(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 Hb(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=Ft(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 Bb(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=Ft(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 qb(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=Ft(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 Wb(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,{files:[]});return}let r=Ft(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(`
|
|
369
|
+
`).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 Gb(t){let e=t.params,r;if(e?.projectId&&(r=Ft(e.projectId)??void 0),r||(r=this.getActiveProjectRoot()),!r){t.id!==void 0&&this.sendResponse(t.id,{instructions:[]});return}let n=[],o=br(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=ki(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 Kb(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=Ft(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=br(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=ki(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 zb(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=br(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=ki(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 Vb(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=br(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=ki(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 Xb(t){let e=t.params,r;if(e?.projectId&&(r=Ft(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=BO(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 BO(t){if(!t.startsWith("---"))return{};let e=t.indexOf(`
|
|
370
370
|
---`,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 qO="doubao";function Yb(t){return t?.provider??D().peekActiveModel("videoGeneration")?.provider??D().peekActiveModel("threeDGeneration")?.provider??qO}function Jb(t){let e=ti(t);return D().resolveProviderApiKey(t)??(e===t?void 0:D().resolveProviderApiKey(e))}function Qb(t,e){let r=ti(e);return t?.getTransport(e)??(r===e?void 0:t?.getTransport(r))}async function Zb(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 ek(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=Yb(e),n=Qb(this.mediaClient,r),o=Jb(r);if(!n||!o||!Ud(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 tk(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=Yb(e),n=Qb(this.mediaClient,r),o=Jb(r);if(!n||!o||!Ud(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 rk(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
|
|
371
371
|
Content-Disposition: form-data; name="model"\r
|
|
372
372
|
\r
|
|
@@ -426,7 +426,7 @@ ${c||"(none)"}`].join(`
|
|
|
426
426
|
7. \u4E0D\u8981\u5305\u542B <script> \u6216\u4EFB\u4F55 JS
|
|
427
427
|
8. \u5355\u6587\u4EF6 < 12KB
|
|
428
428
|
|
|
429
|
-
\u76F4\u63A5\u8F93\u51FA <svg> \u6807\u7B7E\uFF0C\u4E0D\u8981\u4EE3\u7801\u56F4\u680F\u6216\u89E3\u91CA\u3002`}function wi(t){let e=[],r=[{id:"pet-body",type:"body",selector:"#pet-body"},{id:"pet-head",type:"head",selector:"#pet-head"},{id:"pet-left-eye",type:"left-eye",selector:"#pet-left-eye"},{id:"pet-right-eye",type:"right-eye",selector:"#pet-right-eye"},{id:"pet-left-arm",type:"left-arm",selector:"#pet-left-arm"},{id:"pet-right-arm",type:"right-arm",selector:"#pet-right-arm"}];for(let n of r)t.includes(`id="${n.id}"`)&&e.push(n);return e}function
|
|
429
|
+
\u76F4\u63A5\u8F93\u51FA <svg> \u6807\u7B7E\uFF0C\u4E0D\u8981\u4EE3\u7801\u56F4\u680F\u6216\u89E3\u91CA\u3002`}function wi(t){let e=[],r=[{id:"pet-body",type:"body",selector:"#pet-body"},{id:"pet-head",type:"head",selector:"#pet-head"},{id:"pet-left-eye",type:"left-eye",selector:"#pet-left-eye"},{id:"pet-right-eye",type:"right-eye",selector:"#pet-right-eye"},{id:"pet-left-arm",type:"left-arm",selector:"#pet-left-arm"},{id:"pet-right-arm",type:"right-arm",selector:"#pet-right-arm"}];for(let n of r)t.includes(`id="${n.id}"`)&&e.push(n);return e}function Ai(t,e){let r=Su[e]??Su.idle,n=oj[r.body],o=sj[r.eyes],s=ij[r.arms],i=r.body==="still"?"0s":r.body==="bounce"?"0.6s":"3s",a=r.eyes==="blink"?"4s":r.eyes==="closed"||r.eyes==="sleepy"?"0s":"2.5s",c=r.arms==="still"?"0s":r.arms==="hammer"?"0.8s":"2.5s",l=`<style>
|
|
430
430
|
${n}
|
|
431
431
|
${o}
|
|
432
432
|
${s}
|
|
@@ -438,7 +438,7 @@ ${s}
|
|
|
438
438
|
</style>`,d="";r.effects?.length&&(d=r.effects.map(u=>aj[u]??"").join(`
|
|
439
439
|
`));let p=t.baseSvg.replace(/(<svg[^>]*>)/,`$1
|
|
440
440
|
${l}`);return d&&(p=p.replace(/<\/svg>/,`${d}
|
|
441
|
-
</svg>`)),p}function
|
|
441
|
+
</svg>`)),p}function Pi(t){let e=/(?:fill|stop-color|stroke)="(#[0-9a-fA-F]{6})"/g,r=new Map,n;for(;(n=e.exec(t))!==null;){let s=n[1].toUpperCase();s==="#000000"||s==="#FFFFFF"||r.set(s,(r.get(s)??0)+1)}let o=[...r.entries()].sort((s,i)=>i[1]-s[1]);return{primary:o[0]?.[0]??"#5A7EFF",secondary:o[1]?.[0]??"#1E3A8A"}}function xi(t){let e=["pet-body","pet-left-eye","pet-right-eye"],r=[];for(let n of e)t.includes(`id="${n}"`)||r.push(n);return t.includes('class="pupil"')||r.push("pupil (class)"),r}function wk(t,e){let r=10,n=["pet-body","pet-left-eye","pet-right-eye"];for(let u of n)e.includes(`id="${u}"`)||(r-=3);e.includes('class="pupil"')||(r-=2);let o=Tk(t),s=Tk(e),i=cj(o,s);i<.5&&(r-=2),i<.3&&(r-=1);let a=t.match(/viewBox="([^"]+)"/),c=e.match(/viewBox="([^"]+)"/);a&&c&&a[1]!==c[1]&&(r-=1);let l=(t.match(/<[a-z]/gi)??[]).length,d=(e.match(/<[a-z]/gi)??[]).length;return Math.min(l,d)/Math.max(l,d)<.4&&(r-=2),Math.max(0,Math.min(10,r))}function wu(t,e){return`\u4F60\u662F\u4E00\u4E2A\u89D2\u8272\u4E00\u81F4\u6027\u8BC4\u4F30\u4E13\u5BB6\u3002\u6211\u7ED9\u4F60\u4E24\u5F20\u56FE\u7247\uFF1A
|
|
442
442
|
1. \u7B2C\u4E00\u5F20\u662F\u89D2\u8272\u7684**\u57FA\u7840\u53C2\u8003\u5F62\u8C61**
|
|
443
443
|
2. \u7B2C\u4E8C\u5F20\u662F\u8BE5\u89D2\u8272\u5728\u300C${e}\u300D\u72B6\u6001\u4E0B\u7684\u53D8\u4F53
|
|
444
444
|
|
|
@@ -454,7 +454,7 @@ ${l}`);return d&&(p=p.replace(/<\/svg>/,`${d}
|
|
|
454
454
|
- 0-3: \u770B\u8D77\u6765\u50CF\u4E0D\u540C\u89D2\u8272
|
|
455
455
|
|
|
456
456
|
\u8F93\u51FA\u683C\u5F0F\uFF08JSON\uFF0C\u4E0D\u8981\u5176\u4ED6\u5185\u5BB9\uFF09\uFF1A
|
|
457
|
-
{"score": <0-10>, "feedback": "<\u4E00\u53E5\u8BDD\u8BF4\u660E\u4E3B\u8981\u5DEE\u5F02>"}`}function
|
|
457
|
+
{"score": <0-10>, "feedback": "<\u4E00\u53E5\u8BDD\u8BF4\u660E\u4E3B\u8981\u5DEE\u5F02>"}`}function Au(t){try{let r=t.match(/\{[\s\S]*?\}/);if(r){let n=JSON.parse(r[0]),o=typeof n.score=="number"?n.score:parseFloat(n.score);if(!isNaN(o)&&o>=0&&o<=10)return{score:o,feedback:n.feedback??""}}}catch{}let e=t.match(/(\d+(?:\.\d+)?)\s*[//]\s*10|score[:\s]*(\d+(?:\.\d+)?)/i);if(e){let r=parseFloat(e[1]??e[2]??"5");return{score:Math.min(10,Math.max(0,r)),feedback:t.slice(0,100)}}return{score:5,feedback:"Unable to parse consistency score"}}function Pu(t,e,r){let n=r?.threshold??6,o=[];for(let[i,a]of Object.entries(e)){let c=wk(t,a);o.push({state:i,score:c,passed:c>=n})}return{overallScore:o.length>0?o.reduce((i,a)=>i+a.score,0)/o.length:0,results:o,passedAll:o.every(i=>i.passed),retryStates:o.filter(i=>!i.passed).map(i=>i.state)}}function xu(t,e,r,n){return`\u3010\u7B2C ${n+1} \u6B21\u91CD\u8BD5 \u2014 \u4E00\u81F4\u6027\u4FEE\u6B63\u3011
|
|
458
458
|
|
|
459
459
|
\u4E0A\u6B21\u751F\u6210\u7684\u300C${e}\u300D\u72B6\u6001\u88AB\u4E00\u81F4\u6027\u68C0\u67E5\u6807\u8BB0\u4E3A\u4E0D\u901A\u8FC7\u3002
|
|
460
460
|
\u53CD\u9988\uFF1A${r}
|
|
@@ -466,9 +466,9 @@ ${l}`);return d&&(p=p.replace(/<\/svg>/,`${d}
|
|
|
466
466
|
4. \u4FDD\u7559\u6240\u6709\u5FC5\u9700\u7684 id \u548C class \u5C5E\u6027
|
|
467
467
|
|
|
468
468
|
\u89D2\u8272\uFF1A${t}
|
|
469
|
-
\u72B6\u6001\uFF1A${e}`}function Tk(t){let e=new Set,r=/#[0-9a-fA-F]{6}/g,n;for(;(n=r.exec(t))!==null;)e.add(n[0].toUpperCase());return e}function cj(t,e){if(t.size===0||e.size===0)return 0;let r=0;for(let n of t)e.has(n)&&r++;return r/Math.max(t.size,e.size)}G();function
|
|
469
|
+
\u72B6\u6001\uFF1A${e}`}function Tk(t){let e=new Set,r=/#[0-9a-fA-F]{6}/g,n;for(;(n=r.exec(t))!==null;)e.add(n[0].toUpperCase());return e}function cj(t,e){if(t.size===0||e.size===0)return 0;let r=0;for(let n of t)e.has(n)&&r++;return r/Math.max(t.size,e.size)}G();function Ak(t,e){return t instanceof Error?t.message:e}function Iu(t){let e=oe.getNextDisplayTrait(t.level);return{level:t.level,experience:t.experience,xpNeeded:oe.xpForLevel(t.level),displayTraits:oe.getUnlockedDisplayTraits(t.level).map(Ur),nextDisplayTrait:e?Ur(e):void 0}}function Ur(t){return{id:t.id,name:t.name,description:t.description,level:t.unlockedAtLevel,surface:t.surface}}async function Pk(t){let e=t.params,r=this.getActiveProjectRoot(),n=Eu(this),o=new xt(r,n),s=o.load();if(s){this.sendNotification("pet.soul_ready",{name:s.name,species:s.species,personality:s.personality,catchphrase:s.catchphrase,stats:s.stats,rarity:s.rarity,breed:s.breed,breedColors:s.breedColors}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,soul:s,growth:Iu(s)});return}try{let i=this.petRuntime.createPetSoulGenerator(),a=await o.hatch(n,i,e?.breed);this.sendNotification("pet.soul_ready",{name:a.name,species:a.species,personality:a.personality,catchphrase:a.catchphrase,stats:a.stats,rarity:a.rarity,breed:a.breed,breedColors:a.breedColors}),this.sendNotification("pet.growth",{level:a.level,experience:a.experience,xpNeeded:oe.xpForLevel(a.level),displayTraits:oe.getUnlockedDisplayTraits(a.level).map(Ur)}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,soul:a,growth:Iu(a)})}catch(i){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:Ak(i,"Failed to hatch pet")})}}async function xk(t){let r=t.params?.action??"pat",n=this.getActiveProjectRoot(),o=Eu(this),s=new xt(n,o),i=s.load();if(!i){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Pet not hatched yet"});return}let a=oe.xpForEvent(`interact.${r}`),{newLevel:c,newXp:l,events:d,statBoosts:p}=oe.processXpGain(i,a);i.level=c,i.experience=l;for(let[g,h]of Object.entries(p)){let b=g;i.stats[b]=Math.min(10,i.stats[b]+(h??0))}s.updateSoul(i),this.sendNotification("pet.state",{state:"happy"});let u=oe.getNextDisplayTrait(c);this.sendNotification("pet.growth",{level:c,experience:l,xpNeeded:oe.xpForLevel(c),displayTraits:oe.getUnlockedDisplayTraits(c).map(Ur),nextDisplayTrait:u?Ur(u):void 0});for(let g of d)g.type==="molt"?this.sendNotification("pet.reaction",{text:`\u2728 \u8131\u58F3\u4E86\uFF01\u7B2C ${g.moltStage} \u6B21\u8715\u53D8`,style:"excited"}):g.type==="display_trait_unlock"&&g.displayTrait&&this.sendNotification("pet.reaction",{text:`Display trait unlocked: ${g.displayTrait.name}`,style:"excited"});let m=null,f="excited";try{let g=[],h=this.getActiveProjectRoot?.()??"";if(h){let C=h.split(/[\\/]/).pop()??h;g.push(`\u7528\u6237\u6B63\u5728\u9879\u76EE\u300C${C}\u300D\u4E2D\u5DE5\u4F5C`)}if(this.sessionState){let C=this.sessionState.turnCount??0;C>0&&g.push(`\u672C\u6B21\u4F1A\u8BDD\u5DF2\u8FDB\u884C\u4E86 ${C} \u8F6E\u5BF9\u8BDD`)}if(this.memoryProvider&&this.memoryUserId)try{let C=this.memoryProvider.getActivitySummary(this.memoryUserId,7);if(C?.highlights?.length){let E=C.highlights.slice(0,3).map(M=>M.text);g.push(`\u7528\u6237\u8FD1\u671F\u8BB0\u5FC6\u4EAE\u70B9: ${E.join("\uFF1B")}`)}}catch{}let b=new Date().getHours(),v=b<6?"\u6DF1\u591C":b<9?"\u65E9\u6668":b<12?"\u4E0A\u5348":b<14?"\u4E2D\u5348":b<18?"\u4E0B\u5348":b<22?"\u665A\u4E0A":"\u6DF1\u591C";g.push(`\u5F53\u524D\u65F6\u6BB5: ${v}`);let R=r==="pat"?"\u7528\u6237\u6478\u4E86\u6478\u4F60":r==="feed"?"\u7528\u6237\u5582\u4E86\u4F60\u4E1C\u897F":`\u7528\u6237\u5BF9\u4F60\u505A\u4E86\u300C${r}\u300D`;g.push(R);let S=g.join("\u3002"),T=this.petRuntime.createSmallLLMCall();if(T){let C=await Ro({turnSummary:S,soul:i},T);C&&(m=C.text,f=C.style)}}catch{}if(!m){let g=ko("session.created");m=g?.text??null,f=g?.style??"excited"}m&&this.sendNotification("pet.reaction",{text:m,style:f}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,action:r,level:c,experience:l,events:d.map(g=>({type:g.type,level:g.level})),reaction:m?{text:m,style:f}:null})}async function Ck(t){let e=this.getActiveProjectRoot(),n=new xt(e,Eu(this)).load();if(t.id!==void 0&&this.sendResponse(t.id,{ok:!0,soul:n??null,growth:n?Iu(n):null}),n){this.sendNotification("pet.soul_ready",{name:n.name,species:n.species,personality:n.personality,catchphrase:n.catchphrase,stats:n.stats,rarity:n.rarity,breed:n.breed,breedColors:n.breedColors});let o=oe.getNextDisplayTrait(n.level);this.sendNotification("pet.growth",{level:n.level,experience:n.experience,xpNeeded:oe.xpForLevel(n.level),displayTraits:oe.getUnlockedDisplayTraits(n.level).map(Ur),nextDisplayTrait:o?Ur(o):void 0})}}function Eu(t){let e=t.ownerUserId?.trim();if(e)return e;let r=t.memoryUserId?.trim();return r||Vr()}async function Ik(t){let e=t.params;if(!e?.description&&!e?.imageBase64){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Provide description or imageBase64"});return}typeof this.ensureModelRegistryHydrated=="function"&&await this.ensureModelRegistryHydrated(),this.sendNotification("pet.state",{state:"building"}),this.sendNotification("pet.reaction",{text:"\u6B63\u5728\u5B75\u5316\u4F60\u7684\u4E13\u5C5E\u5BA0\u7269...",style:"thinking"});try{let r=e.description?.slice(0,10)??"\u81EA\u5B9A\u4E49\u5BA0\u7269",n=e.description??"";e.imageBase64&&(n=await this.petRuntime.forgeAnalyzeImage(e.imageBase64,e.description),this.sendNotification("pet.reaction",{text:"\u5206\u6790\u5B8C\u6210\uFF0C\u6B63\u5728\u751F\u6210\u9AA8\u67B6...",style:"thinking"}));let o=await this.petRuntime.forgeGenerateSkeleton(n),s=$r(o),i=xi(s),a=0;for(;i.length>0&&a<2;){a++,this.sendNotification("pet.reaction",{text:`\u9AA8\u67B6\u7F3A\u5C11 ${i.join("\u3001")}\uFF0C\u91CD\u65B0\u751F\u6210 (${a}/${2})...`,style:"thinking",duration:3e3});let m=`\u4E0A\u6B21\u751F\u6210\u7F3A\u5C11\u4EE5\u4E0B\u90E8\u4F4D: ${i.join(", ")}\u3002\u8BF7\u786E\u4FDD\u6240\u6709 id \u5C5E\u6027\u90FD\u5B58\u5728\u3002`;o=await this.petRuntime.forgeGenerateSkeleton(n+`
|
|
470
470
|
|
|
471
|
-
`+m),s=$r(o),i=xi(s)}i.length>0&&this.sendNotification("pet.reaction",{text:"\u9AA8\u67B6\u4E0D\u5B8C\u6574\uFF0C\u90E8\u5206\u52A8\u753B\u53EF\u80FD\u7F3A\u5931\uFF0C\u7EE7\u7EED\u751F\u6210...",style:"normal",duration:3e3}),this.sendNotification("pet.reaction",{text:"\u9AA8\u67B6\u751F\u6210\u5B8C\u6210\uFF0C\u5F00\u59CB\u6E32\u67D3\u5404\u72B6\u6001...",style:"thinking"});let c=["idle","thinking","working","done","happy","error","sleeping","eating"],l={baseSvg:s,parts:wi(s),colors:Ai(s),characterDesc:n},d={};for(let m of c)d[m]=Pi(l,m),this.sendNotification("pet.reaction",{text:`\u6E32\u67D3 ${m} \u72B6\u6001... (${Object.keys(d).length}/${c.length})`,style:"thinking",duration:2e3});let p=Au(d.idle,d,{threshold:6});if(!p.passedAll&&p.retryStates.length>0&&(this.sendNotification("pet.reaction",{text:`\u4E00\u81F4\u6027\u68C0\u67E5\uFF1A${p.retryStates.length} \u4E2A\u72B6\u6001\u9700\u4F18\u5316...`,style:"thinking",duration:3e3}),p.overallScore<4)){let m=xu(n,"all","\u9AA8\u67B6\u7ED3\u6784\u4E0D\u5B8C\u6574\u5BFC\u81F4\u591A\u72B6\u6001\u4E00\u81F4\u6027\u5DEE",1);o=await this.petRuntime.forgeGenerateSkeleton(m);let f={baseSvg:$r(o),parts:wi($r(o)),colors:Ai($r(o)),characterDesc:n};for(let g of c)d[g]=Pi(f,g)}let u={version:1,name:r,author:"user-generated",created:new Date().toISOString(),generator:"xiaozhi-pet-forge-v2-skeleton",source:{type:e.imageBase64?"image":"text",prompt:e.description},dimensions:{width:200,height:200},states:Object.fromEntries(c.map(m=>[m,{file:`states/${m}.svg`,loop:m!=="done"&&m!=="happy"&&m!=="eating",...m==="done"||m==="happy"?{duration:3e3}:m==="eating"?{duration:4e3}:{}}])),eyeTracking:{enabled:!0,pupils:[".left-eye .pupil",".right-eye .pupil"],maxOffset:3},colors:l.colors,consistency:{score:p.overallScore,method:"skeleton-parameterized"}};Ru(u),this.sendNotification("pet.reaction",{text:`\u2705 \u5BA0\u7269\u300C${r}\u300D\u5DF2\u953B\u9020\u5B8C\u6210\uFF01\u4E00\u81F4\u6027\u8BC4\u5206 ${p.overallScore.toFixed(1)}/10`,style:"excited"}),this.sendNotification("pet.state",{state:"done"}),this.sendNotification("pet.forged",{name:r,svgs:d}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,manifest:u,svgs:d,status:"complete",consistency:{score:p.overallScore,passedAll:p.passedAll}})}catch(r){this.sendNotification("pet.state",{state:"error"}),this.sendNotification("pet.reaction",{text:"\u953B\u9020\u5931\u8D25\u4E86...",style:"normal"}),t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:Pk(r,"Forge failed")})}}import*as Fk from"node:path";import{randomUUID as yj}from"node:crypto";var So=class{maxTotalTokens;maxDuration;usedTokens=0;startedAt;warningEmitted=!1;constructor(e){this.maxTotalTokens=e?.maxTotalTokens,this.maxDuration=e?.maxDuration,this.startedAt=Date.now()}addUsage(e,r){this.usedTokens+=e+r}addFromTracker(e){if(!e.hasData())return;let r=e.getUsage();this.usedTokens+=r.totalTokens}getElapsed(){return Date.now()-this.startedAt}getBudget(){return{maxTotalTokens:this.maxTotalTokens,maxDuration:this.maxDuration,usedTokens:this.usedTokens,elapsed:this.getElapsed()}}check(){let e=this.getElapsed();if(this.maxDuration&&e>=this.maxDuration)return{action:"exceeded",percentage:Math.round(e/this.maxDuration*100),usedTokens:this.usedTokens,maxTotalTokens:this.maxTotalTokens,elapsed:e,maxDuration:this.maxDuration};if(this.maxTotalTokens){let n=Math.round(this.usedTokens/this.maxTotalTokens*100);if(this.usedTokens>=this.maxTotalTokens)return{action:"exceeded",percentage:n,usedTokens:this.usedTokens,maxTotalTokens:this.maxTotalTokens,elapsed:e,maxDuration:this.maxDuration};if(n>=80&&!this.warningEmitted)return this.warningEmitted=!0,{action:"warning",percentage:n,usedTokens:this.usedTokens,maxTotalTokens:this.maxTotalTokens,elapsed:e,maxDuration:this.maxDuration}}return{action:"ok",percentage:this.maxTotalTokens?Math.round(this.usedTokens/this.maxTotalTokens*100):0,usedTokens:this.usedTokens,maxTotalTokens:this.maxTotalTokens,elapsed:e,maxDuration:this.maxDuration}}restore(e){this.usedTokens=e.usedTokens,this.startedAt=e.startedAt,this.warningEmitted=e.warningEmitted}serialize(){return{usedTokens:this.usedTokens,startedAt:this.startedAt,warningEmitted:this.warningEmitted}}};import{join as Mu}from"node:path";import{mkdir as lj,readdir as dj}from"node:fs/promises";function uj(t){return t?.pathService??I()}function pj(t,e){return t??e.getActiveProjectRoot()}function Ek(t,e){let r=uj(e);return Mu(r.getProjectAgentDir(pj(t,r)),"products")}function Mk(t,e,r){return Mu(Ek(e,r),t)}function _k(t,e,r){return Mu(Mk(t,e,r),"product-state.json")}async function Dk(t,e,r){let n=Mk(t.productId,e,r);await lj(n,{recursive:!0}),await mr(_k(t.productId,e,r),t)}async function _u(t,e,r){return Zt(_k(t,e,r))}async function Nk(t,e){let r=Ek(t,e),n;try{n=await dj(r)}catch{return[]}let o=[];for(let s of n){let i=await _u(s,t,e);i&&o.push(i)}return o}var To=class t{constructor(e={}){this.callbacks=e}callbacks;static DEFAULT_INTERVAL=5*6e4;static LONG_RUNNING_INTERVAL=30*6e4;static LONG_RUNNING_THRESHOLD=2880*6e4;timer=null;lastCheckpointAt=0;cwd;start(e){this.cwd=e,this.stop(),this.timer=setInterval(()=>{let r=this.callbacks.getState?.();r&&this.checkpoint(r).catch(n=>{this.callbacks.log?.warn(`[checkpoint] periodic save failed: ${n instanceof Error?n.message:String(n)}`)})},t.DEFAULT_INTERVAL),this.timer.unref()}stop(){this.timer&&(clearInterval(this.timer),this.timer=null)}getInterval(e){return e>t.LONG_RUNNING_THRESHOLD?t.LONG_RUNNING_INTERVAL:t.DEFAULT_INTERVAL}isDue(e){if(this.lastCheckpointAt===0)return!0;let r=this.getInterval(e);return Date.now()-this.lastCheckpointAt>=r}async checkpoint(e){let r=new Date().toISOString();e.lastCheckpointAt=r,await Dk(e,this.cwd),this.lastCheckpointAt=Date.now(),this.callbacks.onCheckpoint?.(e.productId,r),this.callbacks.log?.info(`[checkpoint] saved ${e.productId} at ${r}`)}getLastCheckpointAt(){return this.lastCheckpointAt}};import{execFile as mj}from"node:child_process";import{promisify as gj}from"node:util";import{join as Lk}from"node:path";import{mkdir as fj,rm as hj}from"node:fs/promises";var Rn=gj(mj);async function wo(t){try{let{stdout:e}=await Rn("git",["rev-parse","--show-toplevel"],{cwd:t,encoding:"utf8"});return e.trim()}catch{return null}}async function Ci(t,e,r){let n=Lk(t,".worktrees");await fj(n,{recursive:!0});let o=Lk(n,e),i=["worktree","add","-B",`solo/${e}`,o];return r?i.push(r):i.push("HEAD"),await Rn("git",i,{cwd:t,encoding:"utf8"}),o}async function Du(t){try{await Rn("git",["add","-A"],{cwd:t});let{stdout:e}=await Rn("git",["diff","--cached","--stat"],{cwd:t,encoding:"utf8"});return e.trim()}catch{return""}}async function Ok(t,e){try{await Rn("git",["worktree","remove","--force",e],{cwd:t,encoding:"utf8"})}catch{try{await hj(e,{recursive:!0,force:!0})}catch{}}}async function jk(t,e){let{stdout:r}=await Rn("git",["merge","--no-ff",e,"-m",`solo: merge ${e}`],{cwd:t,encoding:"utf8"});return r.trim()}var Ii=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;async create(e){let{name:r,cwd:n,instances:o,tasks:s,budget:i}=e;if(o.length===0)throw new Error("Product requires at least 1 instance");if(s.length===0)throw new Error("Product requires at least 1 task");let a=new Set(o.map(v=>v.name));for(let v of s)if(!a.has(v.assignee))throw new Error(`Task "${v.taskId}" references unknown instance "${v.assignee}"`);let c=`product-${yj().slice(0,8)}`,l=s.map(v=>({id:v.taskId,kind:"agent",params:{agentId:v.assignee,prompt:v.prompt},dependsOn:v.dependsOn})),d=new Qt(l),p=new So(i),u=new To({onCheckpoint:(v,R)=>this.callbacks.onCheckpointed?.(v,R),getState:()=>{let v=this.sessions.get(c);return v?this.buildPersistedState(v):null},log:this.callbacks.log}),m=await wo(n),f=o.map((v,R)=>({instanceId:`${c}:${v.name}:${R}`,name:v.name,agentId:v.agentId,state:"idle"})),g={productId:c,name:r,cwd:n,phase:"active",instances:f,dag:d,budget:p,checkpoint:u,createdAt:new Date().toISOString(),gitRoot:m};this.sessions.set(c,g),u.start(n),this.callbacks.log?.info(`[product] created ${c} "${r}" with ${o.length} instances, ${s.length} tasks`);let h=s.map(v=>({id:v.taskId,label:v.taskId,deps:v.dependsOn??[]})),b=[];for(let v of s)if(v.dependsOn)for(let R of v.dependsOn)b.push({from:R,to:v.taskId});return this.callbacks.onDagTopology?.(c,h,b),setTimeout(()=>this.scheduleNext(g),0),c}async resume(e,r){let n=await _u(e,r);if(!n)throw new Error(`Product ${e} not found on disk`);let o=new Qt(n.tasks);o.restore(n.tasks);let s=new So({maxTotalTokens:n.budget.maxTotalTokens,maxDuration:n.budget.maxDuration});s.restore(n.budget);let i=new To({onCheckpoint:(d,p)=>this.callbacks.onCheckpointed?.(d,p),getState:()=>{let d=this.sessions.get(e);return d?this.buildPersistedState(d):null},log:this.callbacks.log}),a=await wo(n.cwd),c=n.instances.map((d,p)=>({instanceId:`${e}:${d.name}:${p}`,name:d.name,agentId:d.agentId,state:"idle"})),l={productId:n.productId,name:n.name,cwd:n.cwd,phase:"active",instances:c,dag:o,budget:s,checkpoint:i,createdAt:n.createdAt,gitRoot:a};this.sessions.set(e,l),i.start(n.cwd),this.callbacks.log?.info(`[product] resumed ${e}`),this.scheduleNext(l)}async pause(e){let r=this.sessions.get(e);if(!r)throw new Error(`Product ${e} not found`);if(r.phase!=="active")throw new Error(`Product ${e} is not active`);r.phase="paused",r.dag.pauseAll();for(let n of r.instances)if(n.state==="running"&&n.memberId){try{this.processManager.kill(n.memberId)}catch{}n.state="paused"}await r.checkpoint.checkpoint(this.buildPersistedState(r)),r.checkpoint.stop(),this.callbacks.log?.info(`[product] paused ${e}`)}async checkpoint(e){let r=this.sessions.get(e);if(!r)throw new Error(`Product ${e} not found`);await r.checkpoint.checkpoint(this.buildPersistedState(r))}async delete(e){let r=this.sessions.get(e);if(!r)throw new Error(`Product ${e} not found`);if(r.phase==="active"){r.phase="failed",r.dag.pauseAll();for(let n of r.instances)if(n.state==="running"&&n.memberId){try{this.processManager.kill(n.memberId)}catch{}n.state="failed"}}r.checkpoint.stop(),this.sessions.delete(e),this.callbacks.log?.info(`[product] deleted ${e}`)}async rollback(e,r){let n=this.sessions.get(e);if(!n)throw new Error(`Product ${e} not found`);let o=n.cwd;await this.delete(e),await this.resume(e,o),this.callbacks.log?.info(`[product] rolled back ${e} to checkpoint ${r}`)}getStatus(e){let r=this.sessions.get(e);return r?{productId:r.productId,name:r.name,phase:r.phase,instances:r.instances.map(n=>{let s=(n.memberId?this.processManager.getUsageTracker(n.memberId):null)?.getUsage();return{instanceId:n.instanceId,name:n.name,agentId:n.agentId,state:n.state,worktreePath:n.worktreePath,usage:s&&(s.inputTokens>0||s.outputTokens>0)?{inputTokens:s.inputTokens,outputTokens:s.outputTokens}:void 0}}),tasks:r.dag.getAllNodes().map(n=>({taskId:n.id,assignee:n.params.agentId,status:n.status,result:n.output,error:n.error,startedAt:n.startedAt?new Date(n.startedAt).toISOString():void 0,completedAt:n.completedAt?new Date(n.completedAt).toISOString():void 0})),budget:r.budget.getBudget(),lastCheckpointAt:new Date(r.checkpoint.getLastCheckpointAt()||Date.now()).toISOString()}:null}async list(e){let r=[];for(let o of this.sessions.values()){let s=o.dag.getAllNodes();r.push({productId:o.productId,name:o.name,phase:o.phase,instanceCount:o.instances.length,taskCount:s.length,completedTasks:s.filter(i=>i.status==="completed").length,createdAt:o.createdAt,lastCheckpointAt:new Date(o.checkpoint.getLastCheckpointAt()||Date.now()).toISOString()})}let n=await Nk(e);for(let o of n)this.sessions.has(o.productId)||r.push({productId:o.productId,name:o.name,phase:o.phase,instanceCount:o.instances.length,taskCount:o.tasks.length,completedTasks:o.tasks.filter(s=>s.status==="completed").length,createdAt:o.createdAt,lastCheckpointAt:o.lastCheckpointAt});return r}scheduleNext(e){if(e.phase!=="active")return;let r=e.budget.check();if(r.action==="exceeded"){this.callbacks.log?.warn(`[product] ${e.productId} budget exceeded, auto-pausing`),this.pause(e.productId).catch(o=>{this.callbacks.log?.warn(`[product] auto-pause failed: ${o instanceof Error?o.message:String(o)}`)});return}if(r.action==="warning"&&this.callbacks.onBudgetWarning?.(e.productId,r.usedTokens,r.maxTotalTokens,r.percentage),e.dag.isFinished()){this.finishProduct(e);return}let n=e.dag.getReadyNodes();for(let o of n)this.dispatchTask(e,o)}dispatchTask(e,r){let n=e.instances.find(o=>o.name===r.params.agentId);if(!n){e.dag.markFailed(r.id,`No instance found for assignee "${r.params.agentId}"`),this.callbacks.onTaskFailed?.(e.productId,r.id,`No instance for "${r.params.agentId}"`),this.scheduleNext(e);return}e.dag.markRunning(r.id),n.state="running",this.callbacks.onTaskStarted?.(e.productId,r.id,r.params.agentId),this.callbacks.log?.info(`[product] ${e.productId} dispatching task ${r.id} to ${r.params.agentId}`),this.runTask(e,n,r).catch(o=>{this.callbacks.log?.warn(`[product] task dispatch error: ${o instanceof Error?o.message:String(o)}`)})}async runTask(e,r,n){let o=`${e.productId}:${r.name}:${n.id}`;r.memberId=o;try{let s=this.acpDetector.buildExternalDescriptor(r.agentId);if(!s)throw new Error(`Agent ${r.agentId} is not available`);let i=e.cwd;if(e.gitRoot){let d=`${e.productId}-${r.name}-${n.id}`;try{i=await Ci(e.gitRoot,d),r.worktreePath=i}catch{this.callbacks.log?.warn(`[product] worktree creation failed for ${n.id}, using project cwd`)}}await this.processManager.spawn({memberId:o,name:`product-${r.name}`,cwd:i,prompt:n.params.prompt,external:s});let a=await this.processManager.sendTask(o,n.params.prompt),c=typeof a=="string"?a:JSON.stringify(a),l=this.processManager.getUsageTracker(o);if(l?.hasData()){let d=l.getUsage();e.budget.addUsage(d.inputTokens,d.outputTokens);let p=e.budget.getBudget();this.callbacks.onBudgetUpdate?.(e.productId,p.usedTokens,0,p.elapsed,p.maxTotalTokens)}e.dag.markCompleted(n.id,{output:c}),r.state="completed",this.callbacks.onTaskCompleted?.(e.productId,n.id,c);try{this.processManager.kill(o)}catch{}this.processManager.remove(o)}catch(s){let i=s instanceof Error?s.message:String(s);e.dag.markFailed(n.id,i),r.state="failed",this.callbacks.onTaskFailed?.(e.productId,n.id,i);try{this.processManager.kill(o)}catch{}try{this.processManager.remove(o)}catch{}}try{await e.checkpoint.checkpoint(this.buildPersistedState(e))}catch(s){this.callbacks.log?.warn(`[product] checkpoint failed: ${s instanceof Error?s.message:String(s)}`)}this.scheduleNext(e)}finishProduct(e){if(e.dag.isAllCompleted()){e.phase="completed";let r=e.dag.getAllNodes(),n=`Product "${e.name}" completed: ${r.length} tasks all done.`;this.callbacks.onCompleted?.(e.productId,n)}else{e.phase="failed";let n=e.dag.getAllNodes().filter(i=>i.status==="failed").length,o=e.dag.getBlockedNodes().length,s=`Product "${e.name}" finished with ${n} failed, ${o} blocked tasks.`;this.callbacks.onCompleted?.(e.productId,s)}e.checkpoint.stop(),e.checkpoint.checkpoint(this.buildPersistedState(e)).catch(r=>{this.callbacks.log?.warn(`[product] final checkpoint failed: ${r instanceof Error?r.message:String(r)}`)}),this.callbacks.log?.info(`[product] ${e.productId} finished (phase=${e.phase})`)}buildPersistedState(e){return{productId:e.productId,name:e.name,phase:e.phase,cwd:e.cwd,instances:e.instances.map(r=>({name:r.name,role:"",agentId:r.agentId})),tasks:e.dag.serialize(),budget:e.budget.serialize(),createdAt:e.createdAt,lastCheckpointAt:new Date(e.checkpoint.getLastCheckpointAt()||Date.now()).toISOString()}}};import{randomUUID as $k}from"node:crypto";function vj(t,e){let r=e?`
|
|
471
|
+
`+m),s=$r(o),i=xi(s)}i.length>0&&this.sendNotification("pet.reaction",{text:"\u9AA8\u67B6\u4E0D\u5B8C\u6574\uFF0C\u90E8\u5206\u52A8\u753B\u53EF\u80FD\u7F3A\u5931\uFF0C\u7EE7\u7EED\u751F\u6210...",style:"normal",duration:3e3}),this.sendNotification("pet.reaction",{text:"\u9AA8\u67B6\u751F\u6210\u5B8C\u6210\uFF0C\u5F00\u59CB\u6E32\u67D3\u5404\u72B6\u6001...",style:"thinking"});let c=["idle","thinking","working","done","happy","error","sleeping","eating"],l={baseSvg:s,parts:wi(s),colors:Pi(s),characterDesc:n},d={};for(let m of c)d[m]=Ai(l,m),this.sendNotification("pet.reaction",{text:`\u6E32\u67D3 ${m} \u72B6\u6001... (${Object.keys(d).length}/${c.length})`,style:"thinking",duration:2e3});let p=Pu(d.idle,d,{threshold:6});if(!p.passedAll&&p.retryStates.length>0&&(this.sendNotification("pet.reaction",{text:`\u4E00\u81F4\u6027\u68C0\u67E5\uFF1A${p.retryStates.length} \u4E2A\u72B6\u6001\u9700\u4F18\u5316...`,style:"thinking",duration:3e3}),p.overallScore<4)){let m=xu(n,"all","\u9AA8\u67B6\u7ED3\u6784\u4E0D\u5B8C\u6574\u5BFC\u81F4\u591A\u72B6\u6001\u4E00\u81F4\u6027\u5DEE",1);o=await this.petRuntime.forgeGenerateSkeleton(m);let f={baseSvg:$r(o),parts:wi($r(o)),colors:Pi($r(o)),characterDesc:n};for(let g of c)d[g]=Ai(f,g)}let u={version:1,name:r,author:"user-generated",created:new Date().toISOString(),generator:"xiaozhi-pet-forge-v2-skeleton",source:{type:e.imageBase64?"image":"text",prompt:e.description},dimensions:{width:200,height:200},states:Object.fromEntries(c.map(m=>[m,{file:`states/${m}.svg`,loop:m!=="done"&&m!=="happy"&&m!=="eating",...m==="done"||m==="happy"?{duration:3e3}:m==="eating"?{duration:4e3}:{}}])),eyeTracking:{enabled:!0,pupils:[".left-eye .pupil",".right-eye .pupil"],maxOffset:3},colors:l.colors,consistency:{score:p.overallScore,method:"skeleton-parameterized"}};Ru(u),this.sendNotification("pet.reaction",{text:`\u2705 \u5BA0\u7269\u300C${r}\u300D\u5DF2\u953B\u9020\u5B8C\u6210\uFF01\u4E00\u81F4\u6027\u8BC4\u5206 ${p.overallScore.toFixed(1)}/10`,style:"excited"}),this.sendNotification("pet.state",{state:"done"}),this.sendNotification("pet.forged",{name:r,svgs:d}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,manifest:u,svgs:d,status:"complete",consistency:{score:p.overallScore,passedAll:p.passedAll}})}catch(r){this.sendNotification("pet.state",{state:"error"}),this.sendNotification("pet.reaction",{text:"\u953B\u9020\u5931\u8D25\u4E86...",style:"normal"}),t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:Ak(r,"Forge failed")})}}import*as Fk from"node:path";import{randomUUID as yj}from"node:crypto";var So=class{maxTotalTokens;maxDuration;usedTokens=0;startedAt;warningEmitted=!1;constructor(e){this.maxTotalTokens=e?.maxTotalTokens,this.maxDuration=e?.maxDuration,this.startedAt=Date.now()}addUsage(e,r){this.usedTokens+=e+r}addFromTracker(e){if(!e.hasData())return;let r=e.getUsage();this.usedTokens+=r.totalTokens}getElapsed(){return Date.now()-this.startedAt}getBudget(){return{maxTotalTokens:this.maxTotalTokens,maxDuration:this.maxDuration,usedTokens:this.usedTokens,elapsed:this.getElapsed()}}check(){let e=this.getElapsed();if(this.maxDuration&&e>=this.maxDuration)return{action:"exceeded",percentage:Math.round(e/this.maxDuration*100),usedTokens:this.usedTokens,maxTotalTokens:this.maxTotalTokens,elapsed:e,maxDuration:this.maxDuration};if(this.maxTotalTokens){let n=Math.round(this.usedTokens/this.maxTotalTokens*100);if(this.usedTokens>=this.maxTotalTokens)return{action:"exceeded",percentage:n,usedTokens:this.usedTokens,maxTotalTokens:this.maxTotalTokens,elapsed:e,maxDuration:this.maxDuration};if(n>=80&&!this.warningEmitted)return this.warningEmitted=!0,{action:"warning",percentage:n,usedTokens:this.usedTokens,maxTotalTokens:this.maxTotalTokens,elapsed:e,maxDuration:this.maxDuration}}return{action:"ok",percentage:this.maxTotalTokens?Math.round(this.usedTokens/this.maxTotalTokens*100):0,usedTokens:this.usedTokens,maxTotalTokens:this.maxTotalTokens,elapsed:e,maxDuration:this.maxDuration}}restore(e){this.usedTokens=e.usedTokens,this.startedAt=e.startedAt,this.warningEmitted=e.warningEmitted}serialize(){return{usedTokens:this.usedTokens,startedAt:this.startedAt,warningEmitted:this.warningEmitted}}};import{join as Mu}from"node:path";import{mkdir as lj,readdir as dj}from"node:fs/promises";function uj(t){return t?.pathService??I()}function pj(t,e){return t??e.getActiveProjectRoot()}function Ek(t,e){let r=uj(e);return Mu(r.getProjectAgentDir(pj(t,r)),"products")}function Mk(t,e,r){return Mu(Ek(e,r),t)}function _k(t,e,r){return Mu(Mk(t,e,r),"product-state.json")}async function Dk(t,e,r){let n=Mk(t.productId,e,r);await lj(n,{recursive:!0}),await mr(_k(t.productId,e,r),t)}async function _u(t,e,r){return Zt(_k(t,e,r))}async function Nk(t,e){let r=Ek(t,e),n;try{n=await dj(r)}catch{return[]}let o=[];for(let s of n){let i=await _u(s,t,e);i&&o.push(i)}return o}var To=class t{constructor(e={}){this.callbacks=e}callbacks;static DEFAULT_INTERVAL=5*6e4;static LONG_RUNNING_INTERVAL=30*6e4;static LONG_RUNNING_THRESHOLD=2880*6e4;timer=null;lastCheckpointAt=0;cwd;start(e){this.cwd=e,this.stop(),this.timer=setInterval(()=>{let r=this.callbacks.getState?.();r&&this.checkpoint(r).catch(n=>{this.callbacks.log?.warn(`[checkpoint] periodic save failed: ${n instanceof Error?n.message:String(n)}`)})},t.DEFAULT_INTERVAL),this.timer.unref()}stop(){this.timer&&(clearInterval(this.timer),this.timer=null)}getInterval(e){return e>t.LONG_RUNNING_THRESHOLD?t.LONG_RUNNING_INTERVAL:t.DEFAULT_INTERVAL}isDue(e){if(this.lastCheckpointAt===0)return!0;let r=this.getInterval(e);return Date.now()-this.lastCheckpointAt>=r}async checkpoint(e){let r=new Date().toISOString();e.lastCheckpointAt=r,await Dk(e,this.cwd),this.lastCheckpointAt=Date.now(),this.callbacks.onCheckpoint?.(e.productId,r),this.callbacks.log?.info(`[checkpoint] saved ${e.productId} at ${r}`)}getLastCheckpointAt(){return this.lastCheckpointAt}};import{execFile as mj}from"node:child_process";import{promisify as gj}from"node:util";import{join as Lk}from"node:path";import{mkdir as fj,rm as hj}from"node:fs/promises";var Rn=gj(mj);async function wo(t){try{let{stdout:e}=await Rn("git",["rev-parse","--show-toplevel"],{cwd:t,encoding:"utf8"});return e.trim()}catch{return null}}async function Ci(t,e,r){let n=Lk(t,".worktrees");await fj(n,{recursive:!0});let o=Lk(n,e),i=["worktree","add","-B",`solo/${e}`,o];return r?i.push(r):i.push("HEAD"),await Rn("git",i,{cwd:t,encoding:"utf8"}),o}async function Du(t){try{await Rn("git",["add","-A"],{cwd:t});let{stdout:e}=await Rn("git",["diff","--cached","--stat"],{cwd:t,encoding:"utf8"});return e.trim()}catch{return""}}async function Ok(t,e){try{await Rn("git",["worktree","remove","--force",e],{cwd:t,encoding:"utf8"})}catch{try{await hj(e,{recursive:!0,force:!0})}catch{}}}async function jk(t,e){let{stdout:r}=await Rn("git",["merge","--no-ff",e,"-m",`solo: merge ${e}`],{cwd:t,encoding:"utf8"});return r.trim()}var Ii=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;async create(e){let{name:r,cwd:n,instances:o,tasks:s,budget:i}=e;if(o.length===0)throw new Error("Product requires at least 1 instance");if(s.length===0)throw new Error("Product requires at least 1 task");let a=new Set(o.map(v=>v.name));for(let v of s)if(!a.has(v.assignee))throw new Error(`Task "${v.taskId}" references unknown instance "${v.assignee}"`);let c=`product-${yj().slice(0,8)}`,l=s.map(v=>({id:v.taskId,kind:"agent",params:{agentId:v.assignee,prompt:v.prompt},dependsOn:v.dependsOn})),d=new Qt(l),p=new So(i),u=new To({onCheckpoint:(v,R)=>this.callbacks.onCheckpointed?.(v,R),getState:()=>{let v=this.sessions.get(c);return v?this.buildPersistedState(v):null},log:this.callbacks.log}),m=await wo(n),f=o.map((v,R)=>({instanceId:`${c}:${v.name}:${R}`,name:v.name,agentId:v.agentId,state:"idle"})),g={productId:c,name:r,cwd:n,phase:"active",instances:f,dag:d,budget:p,checkpoint:u,createdAt:new Date().toISOString(),gitRoot:m};this.sessions.set(c,g),u.start(n),this.callbacks.log?.info(`[product] created ${c} "${r}" with ${o.length} instances, ${s.length} tasks`);let h=s.map(v=>({id:v.taskId,label:v.taskId,deps:v.dependsOn??[]})),b=[];for(let v of s)if(v.dependsOn)for(let R of v.dependsOn)b.push({from:R,to:v.taskId});return this.callbacks.onDagTopology?.(c,h,b),setTimeout(()=>this.scheduleNext(g),0),c}async resume(e,r){let n=await _u(e,r);if(!n)throw new Error(`Product ${e} not found on disk`);let o=new Qt(n.tasks);o.restore(n.tasks);let s=new So({maxTotalTokens:n.budget.maxTotalTokens,maxDuration:n.budget.maxDuration});s.restore(n.budget);let i=new To({onCheckpoint:(d,p)=>this.callbacks.onCheckpointed?.(d,p),getState:()=>{let d=this.sessions.get(e);return d?this.buildPersistedState(d):null},log:this.callbacks.log}),a=await wo(n.cwd),c=n.instances.map((d,p)=>({instanceId:`${e}:${d.name}:${p}`,name:d.name,agentId:d.agentId,state:"idle"})),l={productId:n.productId,name:n.name,cwd:n.cwd,phase:"active",instances:c,dag:o,budget:s,checkpoint:i,createdAt:n.createdAt,gitRoot:a};this.sessions.set(e,l),i.start(n.cwd),this.callbacks.log?.info(`[product] resumed ${e}`),this.scheduleNext(l)}async pause(e){let r=this.sessions.get(e);if(!r)throw new Error(`Product ${e} not found`);if(r.phase!=="active")throw new Error(`Product ${e} is not active`);r.phase="paused",r.dag.pauseAll();for(let n of r.instances)if(n.state==="running"&&n.memberId){try{this.processManager.kill(n.memberId)}catch{}n.state="paused"}await r.checkpoint.checkpoint(this.buildPersistedState(r)),r.checkpoint.stop(),this.callbacks.log?.info(`[product] paused ${e}`)}async checkpoint(e){let r=this.sessions.get(e);if(!r)throw new Error(`Product ${e} not found`);await r.checkpoint.checkpoint(this.buildPersistedState(r))}async delete(e){let r=this.sessions.get(e);if(!r)throw new Error(`Product ${e} not found`);if(r.phase==="active"){r.phase="failed",r.dag.pauseAll();for(let n of r.instances)if(n.state==="running"&&n.memberId){try{this.processManager.kill(n.memberId)}catch{}n.state="failed"}}r.checkpoint.stop(),this.sessions.delete(e),this.callbacks.log?.info(`[product] deleted ${e}`)}async rollback(e,r){let n=this.sessions.get(e);if(!n)throw new Error(`Product ${e} not found`);let o=n.cwd;await this.delete(e),await this.resume(e,o),this.callbacks.log?.info(`[product] rolled back ${e} to checkpoint ${r}`)}getStatus(e){let r=this.sessions.get(e);return r?{productId:r.productId,name:r.name,phase:r.phase,instances:r.instances.map(n=>{let s=(n.memberId?this.processManager.getUsageTracker(n.memberId):null)?.getUsage();return{instanceId:n.instanceId,name:n.name,agentId:n.agentId,state:n.state,worktreePath:n.worktreePath,usage:s&&(s.inputTokens>0||s.outputTokens>0)?{inputTokens:s.inputTokens,outputTokens:s.outputTokens}:void 0}}),tasks:r.dag.getAllNodes().map(n=>({taskId:n.id,assignee:n.params.agentId,status:n.status,result:n.output,error:n.error,startedAt:n.startedAt?new Date(n.startedAt).toISOString():void 0,completedAt:n.completedAt?new Date(n.completedAt).toISOString():void 0})),budget:r.budget.getBudget(),lastCheckpointAt:new Date(r.checkpoint.getLastCheckpointAt()||Date.now()).toISOString()}:null}async list(e){let r=[];for(let o of this.sessions.values()){let s=o.dag.getAllNodes();r.push({productId:o.productId,name:o.name,phase:o.phase,instanceCount:o.instances.length,taskCount:s.length,completedTasks:s.filter(i=>i.status==="completed").length,createdAt:o.createdAt,lastCheckpointAt:new Date(o.checkpoint.getLastCheckpointAt()||Date.now()).toISOString()})}let n=await Nk(e);for(let o of n)this.sessions.has(o.productId)||r.push({productId:o.productId,name:o.name,phase:o.phase,instanceCount:o.instances.length,taskCount:o.tasks.length,completedTasks:o.tasks.filter(s=>s.status==="completed").length,createdAt:o.createdAt,lastCheckpointAt:o.lastCheckpointAt});return r}scheduleNext(e){if(e.phase!=="active")return;let r=e.budget.check();if(r.action==="exceeded"){this.callbacks.log?.warn(`[product] ${e.productId} budget exceeded, auto-pausing`),this.pause(e.productId).catch(o=>{this.callbacks.log?.warn(`[product] auto-pause failed: ${o instanceof Error?o.message:String(o)}`)});return}if(r.action==="warning"&&this.callbacks.onBudgetWarning?.(e.productId,r.usedTokens,r.maxTotalTokens,r.percentage),e.dag.isFinished()){this.finishProduct(e);return}let n=e.dag.getReadyNodes();for(let o of n)this.dispatchTask(e,o)}dispatchTask(e,r){let n=e.instances.find(o=>o.name===r.params.agentId);if(!n){e.dag.markFailed(r.id,`No instance found for assignee "${r.params.agentId}"`),this.callbacks.onTaskFailed?.(e.productId,r.id,`No instance for "${r.params.agentId}"`),this.scheduleNext(e);return}e.dag.markRunning(r.id),n.state="running",this.callbacks.onTaskStarted?.(e.productId,r.id,r.params.agentId),this.callbacks.log?.info(`[product] ${e.productId} dispatching task ${r.id} to ${r.params.agentId}`),this.runTask(e,n,r).catch(o=>{this.callbacks.log?.warn(`[product] task dispatch error: ${o instanceof Error?o.message:String(o)}`)})}async runTask(e,r,n){let o=`${e.productId}:${r.name}:${n.id}`;r.memberId=o;try{let s=this.acpDetector.buildExternalDescriptor(r.agentId);if(!s)throw new Error(`Agent ${r.agentId} is not available`);let i=e.cwd;if(e.gitRoot){let d=`${e.productId}-${r.name}-${n.id}`;try{i=await Ci(e.gitRoot,d),r.worktreePath=i}catch{this.callbacks.log?.warn(`[product] worktree creation failed for ${n.id}, using project cwd`)}}await this.processManager.spawn({memberId:o,name:`product-${r.name}`,cwd:i,prompt:n.params.prompt,external:s});let a=await this.processManager.sendTask(o,n.params.prompt),c=typeof a=="string"?a:JSON.stringify(a),l=this.processManager.getUsageTracker(o);if(l?.hasData()){let d=l.getUsage();e.budget.addUsage(d.inputTokens,d.outputTokens);let p=e.budget.getBudget();this.callbacks.onBudgetUpdate?.(e.productId,p.usedTokens,0,p.elapsed,p.maxTotalTokens)}e.dag.markCompleted(n.id,{output:c}),r.state="completed",this.callbacks.onTaskCompleted?.(e.productId,n.id,c);try{this.processManager.kill(o)}catch{}this.processManager.remove(o)}catch(s){let i=s instanceof Error?s.message:String(s);e.dag.markFailed(n.id,i),r.state="failed",this.callbacks.onTaskFailed?.(e.productId,n.id,i);try{this.processManager.kill(o)}catch{}try{this.processManager.remove(o)}catch{}}try{await e.checkpoint.checkpoint(this.buildPersistedState(e))}catch(s){this.callbacks.log?.warn(`[product] checkpoint failed: ${s instanceof Error?s.message:String(s)}`)}this.scheduleNext(e)}finishProduct(e){if(e.dag.isAllCompleted()){e.phase="completed";let r=e.dag.getAllNodes(),n=`Product "${e.name}" completed: ${r.length} tasks all done.`;this.callbacks.onCompleted?.(e.productId,n)}else{e.phase="failed";let n=e.dag.getAllNodes().filter(i=>i.status==="failed").length,o=e.dag.getBlockedNodes().length,s=`Product "${e.name}" finished with ${n} failed, ${o} blocked tasks.`;this.callbacks.onCompleted?.(e.productId,s)}e.checkpoint.stop(),e.checkpoint.checkpoint(this.buildPersistedState(e)).catch(r=>{this.callbacks.log?.warn(`[product] final checkpoint failed: ${r instanceof Error?r.message:String(r)}`)}),this.callbacks.log?.info(`[product] ${e.productId} finished (phase=${e.phase})`)}buildPersistedState(e){return{productId:e.productId,name:e.name,phase:e.phase,cwd:e.cwd,instances:e.instances.map(r=>({name:r.name,role:"",agentId:r.agentId})),tasks:e.dag.serialize(),budget:e.budget.serialize(),createdAt:e.createdAt,lastCheckpointAt:new Date(e.checkpoint.getLastCheckpointAt()||Date.now()).toISOString()}}};import{randomUUID as $k}from"node:crypto";function vj(t,e){let r=e?`
|
|
472
472
|
|
|
473
473
|
Budget constraints: ${e.maxTotalTokens?`max ${e.maxTotalTokens} total tokens`:""}${e.maxDuration?` / max ${Math.round(e.maxDuration/6e4)} minutes`:""}`:"";return`You are a team leader agent managing a software development project.
|
|
474
474
|
|
|
@@ -538,12 +538,12 @@ If no action needed, just respond with a progress update message to the user.`,e
|
|
|
538
538
|
`)},onPlanReady:(e,r)=>{t.sendNotification("product.planReady",{productId:e,plan:r})},onPlanFailed:(e,r)=>{t.sendNotification("product.planFailed",{productId:e,error:r})},onPlanningDelta:(e,r)=>{t.sendNotification("product.planningDelta",{productId:e,text:r})}})),t.productPlanner}function kj(t){return{log:{info:e=>process.stderr.write(`${e}
|
|
539
539
|
`),warn:e=>process.stderr.write(`${e}
|
|
540
540
|
`)},onTaskStarted:(e,r,n)=>{t.sendNotification("product.taskStarted",{productId:e,taskId:r,assignee:n})},onTaskCompleted:(e,r,n)=>{t.sendNotification("product.taskCompleted",{productId:e,taskId:r,result:n})},onTaskFailed:(e,r,n)=>{t.sendNotification("product.taskFailed",{productId:e,taskId:r,error:n})},onCheckpointed:(e,r)=>{t.sendNotification("product.checkpointed",{productId:e,timestamp:r})},onBudgetWarning:(e,r,n,o)=>{t.sendNotification("product.budgetWarning",{productId:e,usedTokens:r,maxTotalTokens:n,percentage:o})},onCompleted:(e,r)=>{t.sendNotification("product.completed",{productId:e,summary:r})},onDagTopology:(e,r,n)=>{t.sendNotification("product.dagTopology",{productId:e,nodes:r,edges:n})},onBudgetUpdate:(e,r,n,o,s)=>{t.sendNotification("product.budgetUpdate",{productId:e,inputTokens:r,outputTokens:n,elapsed:o,maxTotalTokens:s})},onTaskOutputDelta:(e,r,n)=>{t.sendNotification("product.taskOutput",{productId:e,taskId:r,text:n})}}}function ke(){return Nu(this)}function Fr(){return Hk(this)}async function Bk(t){try{let e=t.params;if(!e?.goal||!e?.cwd||!e?.leaderAgentId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"goal, cwd, and leaderAgentId are required."});return}let n=await Fr.call(this).plan(e);t.id!==void 0&&this.sendResponse(t.id,n)}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function qk(t){try{let e=t.params;if(!e?.productId||!e?.instances||!e?.tasks){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"productId, instances, and tasks are required."});return}let r=Fr.call(this),n=await r.confirm(e),o=r.getSession(e.productId);o&&await ke.call(this).create({name:o.plan?.name??o.goal.slice(0,50),cwd:o.cwd,instances:e.instances,tasks:e.tasks,budget:e.budget}),t.id!==void 0&&this.sendResponse(t.id,n)}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function Wk(t){try{let e=t.params;if(!e?.productId||!e?.content){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"productId and content are required."});return}let n=await Fr.call(this).message(e.productId,e.content);t.id!==void 0&&this.sendResponse(t.id,n)}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function Gk(t){try{let e=t.params,r;if(e?.name&&e?.cwd&&e?.instances&&e?.tasks)r=e;else if(e?.tasks&&Array.isArray(e.tasks)){let i=e.config?.workdir??this.getActiveProjectRoot(),a=e.tasks.map(c=>({taskId:String(c.id??c.taskId??`task_${Math.random().toString(36).slice(2,8)}`),assignee:String(c.assignee??"default"),prompt:String(c.description??c.prompt??""),dependsOn:c.dependsOn??[]}));r={name:String(e.name??`product_${Date.now()}`),cwd:i,instances:[{name:"default",role:"executor",agentId:"self"}],tasks:a},e.budget&&(r.budget=e.budget)}else{t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"tasks is required. Provide either {name, cwd, instances, tasks} or simplified {tasks, config}."});return}if(!r.projectId){let s=ne();s&&(r.projectId=s.id)}let o=await ke.call(this).create(r);t.id!==void 0&&this.sendResponse(t.id,{productId: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 Kk(t){try{let e=t.params;if(!e?.productId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"productId is required."});return}await ke.call(this).resume(e.productId,this.getActiveProjectRoot()),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function zk(t){try{let e=t.params;if(!e?.productId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"productId is required."});return}await ke.call(this).pause(e.productId),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function Vk(t){try{let e=t.params;if(!e?.productId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"productId is required."});return}await ke.call(this).checkpoint(e.productId),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function Xk(t){try{let e=t.params;if(!e?.productId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"productId is required."});return}let n=ke.call(this).getStatus(e.productId);t.id!==void 0&&this.sendResponse(t.id,n)}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function Yk(t){try{let r=await ke.call(this).list(this.getActiveProjectRoot());t.id!==void 0&&this.sendResponse(t.id,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 Jk(t){try{let e=t.params;if(!e?.productId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"productId is required."});return}await ke.call(this).delete(e.productId),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function Qk(t){try{let e=t.params;if(!e?.productId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"productId is required."});return}await ke.call(this).delete(e.productId),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function Zk(t){try{let e=t.params;if(!e?.productId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"productId is required."});return}await ke.call(this).rollback(e.productId,e.checkpoint??"latest"),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}import*as oR from"node:path";import{randomUUID as sR}from"node:crypto";G();function Rj(t){return(t.content??[]).filter(r=>r.type==="text"&&typeof r.text=="string").map(r=>r.text).join(`
|
|
541
|
-
`)}function eR(t){let e=t.findTool,r=t.fetchImpl??fetch;return{async runAgent(n){let o=await t.runAgent({agentId:n.agentId,prompt:n.prompt,signal:n.signal});return[gn({output:o})]},async invokeTool(n){let o=e(n.tool);if(!o)throw new Error(`workflow tool node: no qlogicagent tool named "${n.tool}"`);if(!o.execute)throw new Error(`workflow tool node: qlogicagent tool "${n.tool}" is not executable`);let s=`wf_${n.tool}_${Date.now().toString(36)}`,i=await o.execute(s,n.args,n.signal);return[gn({result:Rj(i),details:i.details??null})]},async httpRequest(n){let o=await r(n.url,{method:n.method||"GET",headers:n.headers,body:n.body===void 0?void 0:typeof n.body=="string"?n.body:JSON.stringify(n.body),signal:n.signal}),s=await o.text(),i=o.headers.get("content-type")??"",a=s;if(i.includes("application/json")&&s.length>0)try{a=JSON.parse(s)}catch{a={__unparsedJson:s}}return[gn({status:o.status,ok:o.ok,body:a})]},async invokeMcp(n){let o=await t.invokeMcp({server:n.server,tool:n.tool,args:n.args,signal:n.signal});return[gn({result:o})]},async sendChannel(n){if(!t.sendChannel)throw new Error("workflow channel node: sendChannel requires the openclaw gateway host, none injected (channel/IM nodes are unavailable in standalone qlogicagent \u2014 D12/D13).");let o=await t.sendChannel({channel:n.channel,target:n.target,payload:n.payload,signal:n.signal});return[gn({sent:!0,result:o})]}}}var tR=["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"],rR=["SUN","MON","TUE","WED","THU","FRI","SAT"];function Sj(t){if(typeof t!="string"||t.trim()==="")throw new Error("cron must be a non-empty string");let e=t.trim().split(/\s+/);if(e.length!==5&&e.length!==6)throw new Error(`cron must have 5 or 6 fields, got ${e.length}: "${t}"`);let r=e.length===6,n=r?[{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:tR},{label:"day-of-week",min:0,max:7,names:rR}]:[{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:tR},{label:"day-of-week",min:0,max:7,names:rR}],o=n.map((c,l)=>({spec:c,raw:e[l],set:Tj(e[l],n[l])})),s=c=>{let l=o.find(d=>d.spec.label===c);if(!l)throw new Error(`internal: missing cron field ${c}`);return l},i=s("day-of-week"),a=new Set;for(let c of i.set)a.add(c===7?0:c);return{hasSeconds:r,seconds:r?s("second").set:new Set([0]),minutes:s("minute").set,hours:s("hour").set,doms:s("day-of-month").set,months:s("month").set,dows:a,domRestricted:s("day-of-month").raw.trim()!=="*",dowRestricted:i.raw.trim()!=="*"}}function Tj(t,e){let r=new Set;for(let n of t.split(","))wj(n,e,r);if(r.size===0)throw new Error(`cron ${e.label} expanded to an empty set: "${t}"`);return r}function wj(t,e,r){if(t==="")throw new Error(`cron ${e.label} has an empty list element`);let n=t,o=1,s=t.indexOf("/");if(s!==-1){n=t.slice(0,s);let c=t.slice(s+1);if(!/^\d+$/.test(c)||Number(c)<=0)throw new Error(`cron ${e.label} has an invalid step "/${c}"`);o=Number(c)}let i,a;if(n==="*")i=e.min,a=e.max;else{let c=n.indexOf("-");if(c!==-1){let l=Lu(n.slice(0,c),e),d=Lu(n.slice(c+1),e);if(l===void 0||d===void 0)throw new Error(`cron ${e.label} has an invalid range "${n}"`);if(l>d)throw new Error(`cron ${e.label} range "${n}" is descending`);i=l,a=d}else{let l=Lu(n,e);if(l===void 0)throw new Error(`cron ${e.label} value "${n}" is out of range ${e.min}-${e.max}`);i=l,a=o===1?l:e.max}}for(let c=i;c<=a;c+=o)r.add(c)}function Lu(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}var
|
|
541
|
+
`)}function eR(t){let e=t.findTool,r=t.fetchImpl??fetch;return{async runAgent(n){let o=await t.runAgent({agentId:n.agentId,prompt:n.prompt,signal:n.signal});return[gn({output:o})]},async invokeTool(n){let o=e(n.tool);if(!o)throw new Error(`workflow tool node: no qlogicagent tool named "${n.tool}"`);if(!o.execute)throw new Error(`workflow tool node: qlogicagent tool "${n.tool}" is not executable`);let s=`wf_${n.tool}_${Date.now().toString(36)}`,i=await o.execute(s,n.args,n.signal);return[gn({result:Rj(i),details:i.details??null})]},async httpRequest(n){let o=await r(n.url,{method:n.method||"GET",headers:n.headers,body:n.body===void 0?void 0:typeof n.body=="string"?n.body:JSON.stringify(n.body),signal:n.signal}),s=await o.text(),i=o.headers.get("content-type")??"",a=s;if(i.includes("application/json")&&s.length>0)try{a=JSON.parse(s)}catch{a={__unparsedJson:s}}return[gn({status:o.status,ok:o.ok,body:a})]},async invokeMcp(n){let o=await t.invokeMcp({server:n.server,tool:n.tool,args:n.args,signal:n.signal});return[gn({result:o})]},async sendChannel(n){if(!t.sendChannel)throw new Error("workflow channel node: sendChannel requires the openclaw gateway host, none injected (channel/IM nodes are unavailable in standalone qlogicagent \u2014 D12/D13).");let o=await t.sendChannel({channel:n.channel,target:n.target,payload:n.payload,signal:n.signal});return[gn({sent:!0,result:o})]}}}var tR=["JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"],rR=["SUN","MON","TUE","WED","THU","FRI","SAT"];function Sj(t){if(typeof t!="string"||t.trim()==="")throw new Error("cron must be a non-empty string");let e=t.trim().split(/\s+/);if(e.length!==5&&e.length!==6)throw new Error(`cron must have 5 or 6 fields, got ${e.length}: "${t}"`);let r=e.length===6,n=r?[{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:tR},{label:"day-of-week",min:0,max:7,names:rR}]:[{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:tR},{label:"day-of-week",min:0,max:7,names:rR}],o=n.map((c,l)=>({spec:c,raw:e[l],set:Tj(e[l],n[l])})),s=c=>{let l=o.find(d=>d.spec.label===c);if(!l)throw new Error(`internal: missing cron field ${c}`);return l},i=s("day-of-week"),a=new Set;for(let c of i.set)a.add(c===7?0:c);return{hasSeconds:r,seconds:r?s("second").set:new Set([0]),minutes:s("minute").set,hours:s("hour").set,doms:s("day-of-month").set,months:s("month").set,dows:a,domRestricted:s("day-of-month").raw.trim()!=="*",dowRestricted:i.raw.trim()!=="*"}}function Tj(t,e){let r=new Set;for(let n of t.split(","))wj(n,e,r);if(r.size===0)throw new Error(`cron ${e.label} expanded to an empty set: "${t}"`);return r}function wj(t,e,r){if(t==="")throw new Error(`cron ${e.label} has an empty list element`);let n=t,o=1,s=t.indexOf("/");if(s!==-1){n=t.slice(0,s);let c=t.slice(s+1);if(!/^\d+$/.test(c)||Number(c)<=0)throw new Error(`cron ${e.label} has an invalid step "/${c}"`);o=Number(c)}let i,a;if(n==="*")i=e.min,a=e.max;else{let c=n.indexOf("-");if(c!==-1){let l=Lu(n.slice(0,c),e),d=Lu(n.slice(c+1),e);if(l===void 0||d===void 0)throw new Error(`cron ${e.label} has an invalid range "${n}"`);if(l>d)throw new Error(`cron ${e.label} range "${n}" is descending`);i=l,a=d}else{let l=Lu(n,e);if(l===void 0)throw new Error(`cron ${e.label} value "${n}" is out of range ${e.min}-${e.max}`);i=l,a=o===1?l:e.max}}for(let c=i;c<=a;c+=o)r.add(c)}function Lu(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}var Aj=5*366+32;function Ou(t,e){let r=Sj(t),n=new Date(e);r.hasSeconds?(n.setUTCMilliseconds(0),n.setUTCSeconds(n.getUTCSeconds()+1)):(n.setUTCSeconds(0,0),n.setUTCMinutes(n.getUTCMinutes()+1));for(let o=0;o<Aj;o++){if(!r.months.has(n.getUTCMonth()+1)){n.setUTCMonth(n.getUTCMonth()+1,1),n.setUTCHours(0,0,0,0);continue}if(!Pj(r,n)){n.setUTCDate(n.getUTCDate()+1),n.setUTCHours(0,0,0,0);continue}if(!r.hours.has(n.getUTCHours())){n.setUTCHours(n.getUTCHours()+1,0,0,0);continue}if(!r.minutes.has(n.getUTCMinutes())){n.setUTCMinutes(n.getUTCMinutes()+1,0,0);continue}if(r.hasSeconds&&!r.seconds.has(n.getUTCSeconds())){n.setUTCSeconds(n.getUTCSeconds()+1,0);continue}return n.getTime()}throw new Error(`cron "${t}" has no matching time within ~5 years of ${new Date(e).toISOString()}`)}function Pj(t,e){let r=t.doms.has(e.getUTCDate()),n=t.dows.has(e.getUTCDay());return t.domRestricted&&t.dowRestricted?r||n:t.domRestricted?r:t.dowRestricted?n:!0}var xj={now:()=>Date.now(),setTimer:(t,e)=>setTimeout(t,e),clearTimer:t=>clearTimeout(t)},nR=2e9,Mi=class{controller;clock;onError;triggers=new Map;cronArms=new Map;started=!1;constructor(e){if(!e.controller)throw new Error("WorkflowScheduler requires a controller");if(typeof e.onError!="function")throw new Error("WorkflowScheduler requires an onError handler");this.controller=e.controller,this.clock=e.clock??xj,this.onError=e.onError}async start(){if(this.started)throw new Error("WorkflowScheduler already started");this.started=!0;let e=await this.controller.listActive();for(let r of e)this.registerTrigger(r.id,r.trigger??{type:"manual"})}stop(){for(let e of this.cronArms.values())this.clock.clearTimer(e.handle);this.cronArms.clear(),this.triggers.clear(),this.started=!1}async refresh(e){let r;try{r=await this.controller.get(e)}catch{this.unregister(e);return}if(!r.active){this.unregister(e);return}this.registerTrigger(e,r.trigger??{type:"manual"})}unregister(e){let r=this.cronArms.get(e);r&&(this.clock.clearTimer(r.handle),this.cronArms.delete(e)),this.triggers.delete(e)}registeredIds(){return[...this.triggers.keys()]}nextFireAt(e){return this.cronArms.get(e)?.fireAt}async onWebhook(e,r){let n=this.matchingIds(o=>o.type==="webhook"&&o.path===e);return Promise.all(n.map(o=>this.controller.run(o,{type:"webhook",payload:r})))}async onImMessage(e,r,n){let o=this.matchingIds(i=>i.type==="im-message"&&i.channel===e&&Cj(i.match,r)),s={...n,channel:e,text:r};return Promise.all(o.map(i=>this.controller.run(i,{type:"im-message",payload:s})))}async triggerManual(e,r){return this.controller.run(e,{type:"manual",payload:r})}matchingIds(e){let r=[];for(let[n,o]of this.triggers)e(o)&&r.push(n);return r}registerTrigger(e,r){if(this.unregister(e),this.triggers.set(e,r),r.type==="schedule"){let n=Ou(r.cron,this.clock.now());this.armCron(e,r.cron,n)}}armCron(e,r,n){let o=Math.max(0,n-this.clock.now()),s={cron:r,fireAt:n,handle:void 0};o>nR?s.handle=this.clock.setTimer(()=>{this.cronArms.get(e)===s&&this.armCron(e,r,n)},nR):s.handle=this.clock.setTimer(()=>this.fireCron(e,s),o),this.cronArms.set(e,s)}fireCron(e,r){if(this.cronArms.get(e)!==r)return;let n;try{n=Ou(r.cron,r.fireAt)}catch(o){this.cronArms.delete(e),this.onError(o,e);return}this.armCron(e,r.cron,n),this.controller.run(e,{type:"schedule"}).catch(o=>this.onError(o,e))}};function Cj(t,e){return t===void 0?!0:new RegExp(t).test(e)}var Ij=1e3;function Ht(){if(!this.workflowController){let t=this.getActiveProjectRoot(),e=new gr(t),r=new dt({log:{info:a=>process.stderr.write(`[workflow:pm] ${a}
|
|
542
542
|
`),warn:a=>process.stderr.write(`[workflow:pm] WARN ${a}
|
|
543
543
|
`)},onMcpToolCall:(a,c,l)=>this.handleMcpToolCall(a,c,l),sessionDir:oR.join(X(),"agent-logs")}),n=eR({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-${sR().slice(0,8)}`;if(l?.aborted)throw new Error("workflow agent node aborted before dispatch");await r.spawn({memberId:u,name:`workflow-${d}`,cwd:t,prompt:c,external:p});try{let m=await r.sendTask(u,c);return typeof m=="string"?m:JSON.stringify(m)}finally{try{r.kill(u),r.remove(u)}catch(m){process.stderr.write(`[workflow:pm] WARN cleanup of ${u} failed: ${m instanceof Error?m.message:String(m)}
|
|
544
544
|
`)}}},invokeMcp:({server:a,tool:c,args:l})=>this.handleMcpToolCall(`workflow-mcp:${a}`,c,l),sendChannel:async({channel:a,target:c,payload:l})=>(this.sendNotification("workflow.channel.send",{channel:a,target:c,payload:l}),{queued:!0})}),o=new hn;for(let[a,c]of Object.entries(ho))o.register(a,c);let s=sb({registry:o,host:n,budget:{maxNodeExecutions:Ij}});this.workflowController=new pr(e,s),this.workflowStore=e,this.workflowProcessManager=r,cb(this.workflowController);let i=new Mi({controller:this.workflowController,onError:(a,c)=>{let l=a instanceof Error?a.message:String(a);process.stderr.write(`[workflow:scheduler] run error for ${c}: ${l}
|
|
545
545
|
`),this.sendNotification("workflow.runFailed",{workflowId:c,triggerType:"schedule",error:l})}});this.workflowScheduler=i,i.start().catch(a=>{process.stderr.write(`[workflow:scheduler] start failed: ${a instanceof Error?a.message:String(a)}
|
|
546
|
-
`)})}return this.workflowController}function rr(t){return t.params??{}}function nr(t,e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:e})}function Ej(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 ju(t,e){this.sendNotification(t,{workflow:Ej(e)})}function $u(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 Mj(t){return t instanceof Error?t.message:String(t)}async function iR(t){let e=rr(t);if(!e.def)return nr.call(this,t,"workflow.create requires `def`");let r=Ht.call(this),n=String(e.id??`wf_${sR().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),ju.call(this,"workflow.created",o),t.id!==void 0&&this.sendResponse(t.id,o)}async function aR(t){let e=rr(t);if(!e.id)return nr.call(this,t,"workflow.get requires `id`");let n=await Ht.call(this).get(String(e.id));t.id!==void 0&&this.sendResponse(t.id,n)}async function cR(t){let e=rr(t);if(!e.id)return nr.call(this,t,"workflow.describe requires `id`");let n=await Ht.call(this).describe(String(e.id));t.id!==void 0&&this.sendResponse(t.id,{rendered:n})}async function lR(t){let e=rr(t);if(!e.id||!e.patch)return nr.call(this,t,"workflow.patch requires `id` and `patch`");let r=Ht.call(this),n={patch:e.patch,baseRev:e.baseRev,scope:e.scope},o=await r.patch(String(e.id),n);await this.workflowScheduler?.refresh(String(e.id)),o.ok&&ju.call(this,"workflow.updated",await r.get(String(e.id))),t.id!==void 0&&this.sendResponse(t.id,o)}async function dR(t){let e=rr(t);if(!e.id)return nr.call(this,t,"workflow.run requires `id`");let r=Ht.call(this),n=e.trigger??{type:"manual"},o=String(e.id);this.sendNotification("workflow.runStarted",{workflowId:o,triggerType:n.type});let s;try{s=await r.run(o,n),$u.call(this,s,n.type)}catch(i){throw this.sendNotification("workflow.runFailed",{workflowId:o,triggerType:n.type,error:Mj(i)}),i}t.id!==void 0&&this.sendResponse(t.id,s)}async function uR(t){let e=rr(t);if(!e.id||typeof e.active!="boolean")return nr.call(this,t,"workflow.setActive requires `id` and boolean `active`");let n=await Ht.call(this).setActive(String(e.id),e.active);await this.workflowScheduler?.refresh(n.id),ju.call(this,"workflow.updated",n),t.id!==void 0&&this.sendResponse(t.id,n)}async function pR(t){Ht.call(this);let r=await this.workflowStore.list();t.id!==void 0&&this.sendResponse(t.id,{workflows:r})}async function mR(t){let e=rr(t);if(!e.id)return nr.call(this,t,"workflow.delete requires `id`");Ht.call(this),await this.workflowStore.delete(String(e.id)),await this.workflowScheduler?.refresh(String(e.id)),this.sendNotification("workflow.deleted",{workflowId:String(e.id)}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}async function gR(t){let e=rr(t);if(!e.channel||typeof e.text!="string")return nr.call(this,t,"workflow.onImMessage requires `channel` and string `text`");Ht.call(this);let r=await this.workflowScheduler.onImMessage(String(e.channel),e.text,e.payload);for(let n of r)$u.call(this,n,"im-message");t.id!==void 0&&this.sendResponse(t.id,{outcomes:r})}async function fR(t){let e=rr(t);if(!e.path)return nr.call(this,t,"workflow.onWebhook requires `path`");Ht.call(this);let r=await this.workflowScheduler.onWebhook(String(e.path),e.payload);for(let n of r)$u.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 Uu from"node:path";G();import*as xe from"node:fs";import*as Po from"node:path";function _i(t){let e=X(),r=De(t);xe.existsSync(r)||xe.mkdirSync(r,{recursive:!0});let n=Po.join(e,"INSTRUCTIONS.md"),o=Po.join(r,"INSTRUCTIONS.md");if(xe.existsSync(n)&&!xe.existsSync(o))try{xe.copyFileSync(n,o)}catch{}let s=am(),i=Xr(t);if(xe.existsSync(s)&&!xe.existsSync(i))try{xe.mkdirSync(i,{recursive:!0});for(let a of xe.readdirSync(s)){if(!a.endsWith(".md"))continue;let c=Po.join(s,a),l=Po.join(i,a);xe.statSync(c).isFile()&&xe.copyFileSync(c,l)}}catch{}}var _j=["creating","running","completed","cancelled"];function hR(t){return typeof t=="string"&&_j.includes(t)}function yR(t,e){let r=I(),n=e.workspaceDir||Uu.join(r.getUserAgentHome(),"workspaces",e.name);if(e.groupId){let l=Ns(e.groupId);if(l)return{project:l,isAgentTeamProject:l.type==="solo"||l.type==="product",deduplicated:!0}}let s=z().find(l=>l.name===e.name);Dj(n);let i=Ds({name:e.name,workspaceDir:n,type:e.type??"personal",groupId:e.groupId,skipAutoSwitch:e.type==="solo"||e.type==="product"}),a=i.type==="solo"||i.type==="product";a||(Ct(i.id),t.setActiveWorkdir(i.workspaceDir)),_i(i.workspaceDir);let c=t.projectMemoryStoreFactory.create(i.workspaceDir);return c.ensureInitialized(),a||(t.memdir=c,t.mediaPersistence.setProjectDir(i.workspaceDir)),Nj(i),{project:i,nameDuplicate:s,isAgentTeamProject:a}}function Dj(t){Hr.existsSync(t)||Hr.mkdirSync(t,{recursive:!0})}function Nj(t){let e=I();if(t.type!=="solo"&&t.type!=="product")return;let r=Uu.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 vR(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=yR(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 bR(t){let e=z();t.id!==void 0&&this.sendResponse(t.id,{projects:e})}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=Te(e.projectId),n=td(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 RR(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(td(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 SR(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=eh(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),th(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 TR(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: projectId"});return}let r=rh(e.projectId);if(!r.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 wR(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=nh(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 PR(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=oh(e.groupId);if(!r.archived){t.id!==void 0&&this.sendResponse(t.id,{ok:!1,error:"No active project with this groupId"});return}this.sendNotification("project.deleted",{id:r.projectId}),r.switchedTo&&(this.setActiveWorkdir(r.switchedTo.workspaceDir),this.sendNotification("project.switched",{id:r.switchedTo.id,name:r.switchedTo.name,workspaceDir:r.switchedTo.workspaceDir})),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,projectId:r.projectId})}function AR(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"projectId is required"});return}let r={};if("planStatus"in e){if(e.planStatus!==void 0&&!hR(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=Qf(e.projectId,r);t.id!==void 0&&this.sendResponse(t.id,{ok:n})}import{randomUUID as Hu}from"node:crypto";import*as Ve from"node:fs";import*as Br from"node:path";var fr=class{sessionId;_trustAccepted=!1;_modelUsage=new Map;_totalInputTokens=0;_totalOutputTokens=0;_turnCount=0;_toolCallCount=0;_listeners=new Set;constructor(e){this.sessionId=e}get trustAccepted(){return this._trustAccepted}setTrustAccepted(e){this._trustAccepted=e,this.notifyListeners()}get totalInputTokens(){return this._totalInputTokens}get totalOutputTokens(){return this._totalOutputTokens}get turnCount(){return this._turnCount}get toolCallCount(){return this._toolCallCount}getModelUsage(e){return this._modelUsage.get(e)}getAllModelUsage(){let e={};for(let[r,n]of this._modelUsage)e[r]={...n};return e}addUsage(e,r){this._totalInputTokens+=e.inputTokens,this._totalOutputTokens+=e.outputTokens;let n=this._modelUsage.get(r);n?(n.inputTokens+=e.inputTokens,n.outputTokens+=e.outputTokens,n.cacheRead+=e.cacheRead??0,n.cacheCreation+=e.cacheWrite??0):this._modelUsage.set(r,{inputTokens:e.inputTokens,outputTokens:e.outputTokens,cacheRead:e.cacheRead??0,cacheCreation:e.cacheWrite??0,mediaCalls:0,mediaDurationSeconds:0,mediaCharacters:0}),this.notifyListeners()}addMediaUsage(e,r,n){let o=this._modelUsage.get(e),s=o??{inputTokens:0,outputTokens:0,cacheRead:0,cacheCreation:0,mediaCalls:0,mediaDurationSeconds:0,mediaCharacters:0};switch(o||this._modelUsage.set(e,s),s.mediaCalls+=1,r){case"per_second":s.mediaDurationSeconds+=n;break;case"per_character":s.mediaCharacters+=n;break;case"per_token":s.outputTokens+=n;break}this.notifyListeners()}recordToolCall(){this._toolCallCount++}recordTurnCompleted(){this._turnCount++}createSnapshot(){return{sessionId:this.sessionId,modelUsage:this.getAllModelUsage(),totalInputTokens:this._totalInputTokens,totalOutputTokens:this._totalOutputTokens,turnCount:this._turnCount,lastSavedAt:Date.now()}}restoreFromSnapshot(e){if(e.sessionId!==this.sessionId)return!1;this._totalInputTokens=e.totalInputTokens,this._totalOutputTokens=e.totalOutputTokens,this._turnCount=e.turnCount,this._modelUsage.clear();for(let[r,n]of Object.entries(e.modelUsage))this._modelUsage.set(r,{...n});return this.notifyListeners(),!0}onStateChange(e){return this._listeners.add(e),()=>{this._listeners.delete(e)}}notifyListeners(){for(let e of this._listeners)try{e()}catch{}}};import*as xR from"node:fs";import*as Fu from"node:path";var hr=class{getSessionsRoot(e){let r=Te(e);if(!r)throw new Error(`Project not found: ${e}`);return I().getProjectSessionsRoot(r.workspaceDir)}getProjectWorkspaceDir(e){let r=Te(e);if(!r)throw new Error(`Project not found: ${e}`);return r.workspaceDir}getSessionDir(e,r){return Fu.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=Fu.join(s,e);try{if(xR.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 CR}from"node:crypto";async function IR(t,e){let r=new Date(t.lastActiveAt).getTime();if(Date.now()-r<Qp)return{split:!1,activeSessionId:t.sessionId};let s=CR(),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 ER(t,e){if(t.type!=="group")return{split:!1,activeSessionId:t.sessionId};if(t.turnCount<Zp)return{split:!1,activeSessionId:t.sessionId};let r=CR(),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 MR from"node:fs";import*as _R from"node:path";var Di=class{constructor(e=new hr,r=I()){this.locator=e;this.pathService=r}locator;pathService;getActiveProjectId(){return this.locator.getActiveProjectId()}getProjectWorkspaceDir(e){return this.locator.getProjectWorkspaceDir(e)}resolveWorkspaceDir(e,r){return this.locator.resolveWorkspaceDir(e,r)}async listThreads(e,r){let n=r??this.getActiveProjectId(),o=this.getProjectWorkspaceDir(n);return(await Rt(e,o)).map(i=>({id:i.sessionId,title:i.title,status:"active",turnCount:i.messageCount,createdAt:i.createdAt,lastActiveAt:i.lastActiveAt}))}resolveSessionWorkspaceDir(e,r,n){if(n)return this.resolveWorkspaceDir(r,n);let o=e.getActiveProjectRoot();if(o){let s=_R.join(this.pathService.getProjectSessionsRoot(o),Lj(r));try{if(MR.existsSync(s))return o}catch{}}return this.resolveWorkspaceDir(r)}};function Lj(t){return t.replace(/[^a-zA-Z0-9_-]/g,"_")}var Oj=new hr,tt=new Di(Oj);function yt(t,e="Unknown error"){return t instanceof Error?t.message:e}function Sn(t,e,r){return tt.resolveSessionWorkspaceDir(t,e,r)}function DR(t){let e=t.params,r=e?.id??Hu();this.log(`[thread.create] id=${r} title=${e?.title??"(none)"}`),e?.cwd&&typeof e.cwd=="string"&&this.setActiveWorkdir(e.cwd),this.currentSessionId=r,this.sessionState=new fr(r),this.sessionTaskDomain=void 0,this.memoryPrefetchState=kt(),this.enableIdleDream(),t.id!==void 0&&this.sendResponse(t.id,{id:r,title:e?.title,status:"active",createdAt:new Date().toISOString()})}async function NR(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: ${yt(n)}`})}}async function LR(t){let e=t.params,r=e?.sessionId??Hu();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: ${yt(n)}`})}}async function OR(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 Rt(500,p)).find(f=>f.sessionId===n);if(m){this.sendResponse(t.id,{sessionId:n,title:m.title,type:m.type??"personal",ownerId:s,projectId:d});return}await 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 Rt(500,u.workspaceDir)).find(g=>g.groupKey===d&&!g.sealedAt);if(f){let g=Vt(f.sessionId,u.workspaceDir);if(g){let h=await IR(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=Hu(),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: ${yt(i)}`})}}async function jR(t){let e=t.params,r=e?.limit??50;try{let n;if(e?.projectId){let s=Te(e.projectId);if(!s){t.id!==void 0&&this.sendResponse(t.id,{sessions:[]});return}let i=s.workspaceDir;n=await Rt(r*2,i),n=n.filter(a=>a.projectId===e.projectId);for(let a of n)a.projectId=e.projectId}else{let s=z(),i=new Set,a=[];for(let c of s){if(!c.workspaceDir)continue;let l=await Rt(r,c.workspaceDir);for(let d of l)i.has(d.sessionId)||d.projectId&&(i.add(d.sessionId),a.push(d))}a.sort((c,l)=>c.lastActiveAt>l.lastActiveAt?-1:c.lastActiveAt<l.lastActiveAt?1:0),n=a}e?.archived===!0?n=n.filter(s=>s.archivedAt!=null):e?.archived===!1&&(n=n.filter(s=>s.archivedAt==null));let o=n.slice(0,r).map(s=>({sessionId:s.sessionId,title:s.title,type:s.type??"personal",lastActiveAt:s.lastActiveAt,pinnedAt:s.pinnedAt??null,archivedAt:s.archivedAt??null,sealedAt:s.sealedAt??null,projectId:s.projectId,previousSessionId:s.previousSessionId??null,carryoverSummary:s.carryoverSummary??null}));t.id!==void 0&&this.sendResponse(t.id,{sessions:o})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to list sessions: ${yt(n)}`})}}async function $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=Sn(this,e.sessionId,e.projectId),o=(await Rt(500,r)).find(s=>s.sessionId===e.sessionId);t.id!==void 0&&this.sendResponse(t.id,{session:o?{sessionId:o.sessionId,title:o.title,type:o.type,lastActiveAt:o.lastActiveAt,pinnedAt:o.pinnedAt??null,archivedAt:o.archivedAt??null,projectId:o.projectId}:null})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to get session: ${yt(r)}`})}}async function UR(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let r=Sn(this,e.sessionId,e.projectId),n=await Ec(e.sessionId,r);if(!n){t.id!==void 0&&this.sendResponse(t.id,{messages:[],total:0});return}let o=n.messages,s=e.limit&&e.limit>0?e.limit:o.length,i=o.slice(-s);t.id!==void 0&&this.sendResponse(t.id,{messages:i,total:o.length})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to get messages: ${yt(r)}`})}}async function 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=Sn(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: ${yt(r)}`})}}async function HR(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=Sn(this,e.sessionId,e.projectId);await Mc(e.sessionId,r),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to delete session: ${yt(r)}`})}}async function BR(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: projectId"});return}try{let r=tt.getProjectWorkspaceDir(e.projectId),n=(await Rt(1e4,r)).filter(s=>s.projectId===e.projectId),o=0;for(let s of n)await Mc(s.sessionId,r),o++;t.id!==void 0&&this.sendResponse(t.id,{ok:!0,deletedCount:o})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to delete all sessions: ${yt(r)}`})}}async function qR(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=Sn(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: ${yt(r)}`})}}async function WR(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=Sn(this,r,e?.projectId),o=await Ec(r,n);if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:`Session not found: ${r}`});return}o.messages&&o.messages.length>0&&this.sessionHistory.saveResumedSession(r,o.messages),t.id!==void 0&&this.sendResponse(t.id,{metadata:o.metadata,messages:o.messages})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to resume session: ${yt(n)}`})}}function GR(t){let e=this.currentSessionId||"default",r=this.sessionState?.createSnapshot(),n,o=this.getActiveProjectRoot();o&&(n=Br.join(Jo(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 KR(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=Ct(r.id);if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"Switch failed"});return}this.setActiveWorkdir(o.workspaceDir),this.sendNotification("project.switched",{id:o.id,name:o.name,workspaceDir:o.workspaceDir}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,project:o})}function zR(t){let e=ne(),r=z();t.id!==void 0&&this.sendResponse(t.id,{sessionId:this.currentSessionId,activeProject:e,projects:r})}async function VR(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 Vt(r,s);if(i&&i.projectId===o.id){Ct(o.id),this.setActiveWorkdir(s),this.log(`[session.focus] switched to project ${o.id} for session ${r}`),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,projectId:o.id});return}}catch{}if(e?.projectName){let o=n.find(s=>s.name===e.projectName);if(o){let s=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 XR(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=yt(l);this.log(`[session.moveToProject] error: ${d}`),t.id!==void 0&&this.sendError(t.id,y.INTERNAL_ERROR,`Move failed: ${d}`)}}He();function jj(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 qu(t,e){Ne(t,e,ns)}function $j(t){let e={};for(let r of t)for(let n of r.purposes)e[n]??=[],e[n].push(r);return e}async function Uj(){let t=D(),e=await $n(t);return t.save(),e}async function YR(t){try{return await Uj(),!0}catch(e){if(t)throw e;return!1}}function Wu(t=D()){try{return Pm()}catch{return t.getKnownProviderDef(Y)?.baseUrl??"https://www.qlogicagent.com"}}function Gu(t){return t.id===Y?Y:t.group?.trim()||t.id}function Fj(t){return t.id===Gu(t)}function JR(t){let e=Gu(t);return Oc({...t,id:e})}function Hj(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]??Oc(t)}function Bj(t){return t.authType==="none"?!1:t.apiKeyEnvVars===void 0||t.apiKeyEnvVars.length>0}function qj(t){return{id:t.id,displayName:Hj(t),baseUrl:Jr(t)??"",modelCount:t.models?.length??0}}function Wj(t){let e=new Map;for(let r of t){if(!Bj(r))continue;let n=Gu(r);if(n===Y)continue;let o=r.models?.length??0,s=qj(r),i=e.get(n);if(!i){e.set(n,{id:n,displayName:JR(r),baseUrl:Jr(r)??"",modelCount:o,variants:[s]});continue}i.modelCount+=o,i.variants??=[],i.variants.some(a=>a.id===s.id)||i.variants.push(s),Fj(r)&&(i.displayName=JR(r),i.baseUrl=Jr(r)??i.baseUrl)}return Array.from(e.values()).map(r=>({...r,variants:r.variants&&r.variants.length>1?r.variants:void 0}))}async function QR(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??Wu(e);try{if((await $c(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 ZR(t=!1){let e=D();if(!!e.getProviderStatus(Y)?.keys.length)return await QR(!1)?!0:YR(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:YR(t)}function Gj(t){return t.defaultModel??t.models?.find(e=>!!e.id)?.id}function Kj(t){return[...new Set(t)]}function zj(t){let e=t.replace(/\/+$/,"");return Kj([`${e}/models`,/\/v\d+$/.test(e)?`${e}/models`:`${e}/v1/models`])}function Vj(t){return t===404||t===405||t===410||t===501}async function Xj(t){let e=D().getKnownProviderDef(t);if(e)return e;let r=await jc(t).catch(()=>null);if(r)return{id:r.id,transport:r.transport,baseUrl:Jr(r),authType:r.authType,models:r.models}}function Bu(t){return{accept:"application/json",Authorization:`Bearer ${t}`}}function Yj(t,e,r,n){if(t===Y)return[{method:"GET",url:Nc(r),headers:Bu(e)}];let o=r.replace(/\/+$/,""),s=n?.transport,i=Gj(n??{id:t}),a=[];if(s==="anthropic-messages")return/\/anthropic$/.test(o)&&a.push({method:"GET",url:`${o.replace(/\/anthropic$/,"")}/models`,headers:Bu(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 zj(o))a.push({method:"GET",url:c,headers:Bu(e)});return a}async function Jj(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 eS(t,e,r){let n=await Xj(t),o=Yj(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 Jj(i);if(a.valid)return a;if(Vj(a.status)){s=a;continue}return a}return s??{valid:!1,status:0,error:`No validation probe succeeded for provider "${t}".`}}async function Qj(t,e,r){let n=await eS(t,e,r);if(!n.valid){let o=n.error?`: ${n.error}`:"";throw new Error(`API Key validation failed (${n.status})${o}`)}}async function tS(t){try{let e=D(),r=["deepseek",Y].map(s=>e.getKnownProviderDef(s)).filter(s=>!!s).map(s=>({id:s.id,displayName:s.name,baseUrl:s.baseUrl,modelCount:s.models?.length??0})),n=await Lc().catch(()=>[]),o=Wj(n);o.unshift({id:Y,displayName:Dc,baseUrl:Wu(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 rS(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 mS(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 $c(s,{baseUrl:c,apiKey:n})).length===0)throw new Error("LLMRouter did not return any available models for this API Key.")}else await Qj(r,n,c);for(let d of jn)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:ns;Ne(this,t,l)}}function nS(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 oS(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 sS(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 iS(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 aS(t){let e=t.params;try{await ZR(!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:$j(o),configuredProviderIds:[...n]})}catch{qu(this,t)}}function cS(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 lS(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 dS(t){try{await ZR(!1);let e=D(),r=e.getAllProviderStatus().map(s=>({providerId:s.providerId,displayName:s.providerId===Y?Dc:s.providerId,baseUrl:s.baseUrl,keyCount:s.keys.length,healthyKeys:s.keys.filter(i=>i.healthStatus==="healthy"&&i.enabled).length,totalKeys:s.keys.length,keys:s.keys.map(i=>({id:i.id,label:i.label,maskedKey:jj(i.key),enabled:i.enabled,health:i.healthStatus}))})),n=e.getAllBindings(),o={};for(let s of jn){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{qu(this,t)}}async function uS(t){try{let e=D();e.load(),await QR(!1)||await $n(e),e.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,catalogRefreshed:!0})}catch{qu(this,t)}}async function pS(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 mS(e.providerId);if(!r){Ne(this,t,`Unknown provider: ${e.providerId}`,y.INVALID_PARAMS);return}let n=await eS(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 mS(t){if(t===Y)return Wu();let e=D().getKnownProviderDef(t);if(e?.baseUrl)return e.baseUrl;let r=await jc(t);return r?Jr(r):void 0}G();import*as ce from"node:fs";import*as Le from"node:path";import{join as Zj}from"node:path";import{readFileSync as e$,writeFileSync as t$,mkdirSync as r$}from"node:fs";var qr=null,Ku=!1;function gS(t){return Zj(t,"skill-stats.json")}function zu(t){if(qr)return qr;try{qr=JSON.parse(e$(gS(t),"utf8"))}catch{qr={}}return qr}function n$(t){if(!(!Ku||!qr))try{r$(t,{recursive:!0}),t$(gS(t),JSON.stringify(qr,null,2),"utf8"),Ku=!1}catch{}}function Vu(t,e,r){let n=zu(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),Ku=!0,n$(t)}function fS(t,e){return zu(t)[e]}function hS(t){return zu(t)}import*as Bt from"node:fs";import*as Ni from"node:path";function o$(t){try{let e=Bt.readFileSync(t,"utf8"),r=e.match(/^---\n[\s\S]*?^version:\s*(\S+)/m),n=e.match(/^---\n[\s\S]*?^description:\s*(.+)/m);return{version:r?.[1],description:n?.[1]?.trim()}}catch{return{}}}function vS(t){let e=I(),r=[],n=t?e.getProjectSkillsDir(t):void 0,o=e.getUserSkillsDir();return n&&yS(r,n,"project"),yS(r,o,"global"),r}function yS(t,e,r){if(Bt.existsSync(e))for(let n of Bt.readdirSync(e)){let o=Ni.join(e,n);try{if(!Bt.statSync(o).isDirectory())continue}catch{continue}let s=Ni.join(o,"SKILL.md"),i=Ni.join(o,"SKILL.md.disabled"),a=Bt.existsSync(s)?s:null;if(!a&&!Bt.existsSync(i))continue;let c=a?o$(a):{};t.push({id:`${r}:${n}`,name:n,path:o,active:!!a,scope:r,category:"automation",displayName:s$(n),displayDescription:i$(n,c.description),fallbackName:n,fallbackDescription:c.description??"",systemGenerated:a$(n),version:c.version,description:c.description})}}function s$(t){return{key:`capability.skill.${t}.name`,fallback:t}}function i$(t,e){return{key:`capability.skill.${t}.description`,fallback:e??""}}function a$(t){return t.startsWith("auto-skill-")||t.startsWith("test-skill-")}function c$(t){return t==="active"||t==="stale"||t==="archived"}function bS(t){let r=t.params?.projectId,n=this.getActiveProjectRoot();if(r&&this.projectLocator){let s=this.projectLocator.resolveProjectRoot(r);s&&(n=s)}let o=vS(n);t.id!==void 0&&this.sendResponse(t.id,{skills:o})}function kS(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=It(l,r);d.state!=="active"&&(d.state="active",d.staleAt=void 0,d.archivedAt=void 0),he(c,l),t.id!==void 0&&this.sendResponse(t.id,{ok:!0}),this.sendNotification("skills.updated",{action:"activate",name:r})}catch(c){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to activate skill: ${c instanceof Error?c.message:c}`})}else t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Skill "${r}" not found`})}function RS(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 SS(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}),gt(),$s(o,r),he(n,o),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,deleted:r,scope:s}),this.sendNotification("skills.updated",{action:"delete",name:r})}catch(a){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to delete skill: ${a instanceof Error?a.message:a}`})}}function TS(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}),gt(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,promoted:r,globalPath:c,removedFromProject:!e?.keepLocal})}catch(l){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to promote skill: ${l instanceof Error?l.message:l}`})}}function wS(t){let e=t.params,r=B();if(e?.name){let n=fS(r,e.name);t.id!==void 0&&this.sendResponse(t.id,{name:e.name,stats:n??null})}else{let n=hS(r);t.id!==void 0&&this.sendResponse(t.id,{stats:n})}}function PS(t){let e=t.params;if(!e?.name){t.id!==void 0&&this.sendResponse(t.id,null,{code:-32602,message:"Missing 'name' parameter"});return}let r=B(),n=ue(r);It(n,e.name),ph(n,e.name),he(r,n),t.id!==void 0&&this.sendResponse(t.id,{name:e.name,pinned:!0})}function AS(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);mh(n,e.name),he(r,n),t.id!==void 0&&this.sendResponse(t.id,{name:e.name,pinned:!1})}function xS(t){let e=B(),r=this.getActiveProjectRoot(),n=r?Le.join(r,".qlogicagent","skills"):sr(),o=gh(e,n);o.transitioned.length>0&>(),t.id!==void 0&&this.sendResponse(t.id,o)}function CS(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(!c$(e.state)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Invalid skill lifecycle state"});return}let o=fh(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 DS from"node:path";import{randomUUID as g$}from"node:crypto";import{join as Xu}from"node:path";import{mkdir as l$,readdir as d$}from"node:fs/promises";function u$(t){return t?.pathService??I()}function p$(t,e){return t??e.getActiveProjectRoot()}function IS(t,e){let r=u$(e);return Xu(r.getProjectAgentDir(p$(t,r)),"solos")}function Yu(t,e,r){return Xu(IS(e,r),t)}function ES(t,e,r){return Xu(Yu(t,e,r),"solo-state.json")}async function MS(t,e,r){let n=Yu(t.soloId,e,r);await l$(n,{recursive:!0}),await mr(ES(t.soloId,e,r),t)}async function m$(t,e,r){return Zt(ES(t,e,r))}async function _S(t,e){let r=IS(t,e),n;try{n=await d$(r)}catch{return[]}let o=[];for(let s of n){let i=await m$(s,t,e);i&&o.push(i)}return o}async function Ju(t,e,r){let{rm:n}=await import("node:fs/promises"),o=Yu(t,e,r);try{return await n(o,{recursive:!0,force:!0}),!0}catch{return!1}}var Li=class{constructor(e,r,n,o={}){this.processManager=e;this.acpDetector=r;this.configStore=n;this.callbacks=o}processManager;acpDetector;configStore;callbacks;sessions=new Map;persistSession(e){let r={soloId:e.soloId,state:e.state,task:e.task,cwd:e.cwd,gitRoot:e.gitRoot,agents:e.agents.map(n=>({agentId:n.agentId,memberId:n.memberId,worktreePath:n.worktreePath,worktreeBranch:n.worktreeBranch,state:n.state,resultText:n.resultText,diff:n.diff,usage:n.usage,error:n.error,turns:n.turns})),evaluation:e.evaluation,createdAt:e.createdAt};MS(r,e.cwd).catch(()=>{})}async restoreFromDisk(e){let r=await _S(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),Ju(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
|
+
`)})}return this.workflowController}function rr(t){return t.params??{}}function nr(t,e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:e})}function Ej(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 ju(t,e){this.sendNotification(t,{workflow:Ej(e)})}function $u(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 Mj(t){return t instanceof Error?t.message:String(t)}async function iR(t){let e=rr(t);if(!e.def)return nr.call(this,t,"workflow.create requires `def`");let r=Ht.call(this),n=String(e.id??`wf_${sR().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),ju.call(this,"workflow.created",o),t.id!==void 0&&this.sendResponse(t.id,o)}async function aR(t){let e=rr(t);if(!e.id)return nr.call(this,t,"workflow.get requires `id`");let n=await Ht.call(this).get(String(e.id));t.id!==void 0&&this.sendResponse(t.id,n)}async function cR(t){let e=rr(t);if(!e.id)return nr.call(this,t,"workflow.describe requires `id`");let n=await Ht.call(this).describe(String(e.id));t.id!==void 0&&this.sendResponse(t.id,{rendered:n})}async function lR(t){let e=rr(t);if(!e.id||!e.patch)return nr.call(this,t,"workflow.patch requires `id` and `patch`");let r=Ht.call(this),n={patch:e.patch,baseRev:e.baseRev,scope:e.scope},o=await r.patch(String(e.id),n);await this.workflowScheduler?.refresh(String(e.id)),o.ok&&ju.call(this,"workflow.updated",await r.get(String(e.id))),t.id!==void 0&&this.sendResponse(t.id,o)}async function dR(t){let e=rr(t);if(!e.id)return nr.call(this,t,"workflow.run requires `id`");let r=Ht.call(this),n=e.trigger??{type:"manual"},o=String(e.id);this.sendNotification("workflow.runStarted",{workflowId:o,triggerType:n.type});let s;try{s=await r.run(o,n),$u.call(this,s,n.type)}catch(i){throw this.sendNotification("workflow.runFailed",{workflowId:o,triggerType:n.type,error:Mj(i)}),i}t.id!==void 0&&this.sendResponse(t.id,s)}async function uR(t){let e=rr(t);if(!e.id||typeof e.active!="boolean")return nr.call(this,t,"workflow.setActive requires `id` and boolean `active`");let n=await Ht.call(this).setActive(String(e.id),e.active);await this.workflowScheduler?.refresh(n.id),ju.call(this,"workflow.updated",n),t.id!==void 0&&this.sendResponse(t.id,n)}async function pR(t){Ht.call(this);let r=await this.workflowStore.list();t.id!==void 0&&this.sendResponse(t.id,{workflows:r})}async function mR(t){let e=rr(t);if(!e.id)return nr.call(this,t,"workflow.delete requires `id`");Ht.call(this),await this.workflowStore.delete(String(e.id)),await this.workflowScheduler?.refresh(String(e.id)),this.sendNotification("workflow.deleted",{workflowId:String(e.id)}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}async function gR(t){let e=rr(t);if(!e.channel||typeof e.text!="string")return nr.call(this,t,"workflow.onImMessage requires `channel` and string `text`");Ht.call(this);let r=await this.workflowScheduler.onImMessage(String(e.channel),e.text,e.payload);for(let n of r)$u.call(this,n,"im-message");t.id!==void 0&&this.sendResponse(t.id,{outcomes:r})}async function fR(t){let e=rr(t);if(!e.path)return nr.call(this,t,"workflow.onWebhook requires `path`");Ht.call(this);let r=await this.workflowScheduler.onWebhook(String(e.path),e.payload);for(let n of r)$u.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 Uu from"node:path";G();import*as Ce from"node:fs";import*as Ao from"node:path";function _i(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=am(),i=Xr(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 _j=["creating","running","completed","cancelled"];function hR(t){return typeof t=="string"&&_j.includes(t)}function yR(t,e){let r=I(),n=e.workspaceDir||Uu.join(r.getUserAgentHome(),"workspaces",e.name);if(e.groupId){let l=Ns(e.groupId);if(l)return{project:l,isAgentTeamProject:l.type==="solo"||l.type==="product",deduplicated:!0}}let s=z().find(l=>l.name===e.name);Dj(n);let i=Ds({name:e.name,workspaceDir:n,type:e.type??"personal",groupId:e.groupId,skipAutoSwitch:e.type==="solo"||e.type==="product"}),a=i.type==="solo"||i.type==="product";a||(Ct(i.id),t.setActiveWorkdir(i.workspaceDir)),_i(i.workspaceDir);let c=t.projectMemoryStoreFactory.create(i.workspaceDir);return c.ensureInitialized(),a||(t.memdir=c,t.mediaPersistence.setProjectDir(i.workspaceDir)),Nj(i),{project:i,nameDuplicate:s,isAgentTeamProject:a}}function Dj(t){Hr.existsSync(t)||Hr.mkdirSync(t,{recursive:!0})}function Nj(t){let e=I();if(t.type!=="solo"&&t.type!=="product")return;let r=Uu.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 vR(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=yR(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 bR(t){let e=z();t.id!==void 0&&this.sendResponse(t.id,{projects:e})}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=we(e.projectId),n=td(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 RR(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(td(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 SR(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=eh(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),th(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 TR(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: projectId"});return}let r=rh(e.projectId);if(!r.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 wR(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=nh(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 AR(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=oh(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 PR(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&&!hR(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=Qf(e.projectId,r);t.id!==void 0&&this.sendResponse(t.id,{ok:n})}import{randomUUID as Hu}from"node:crypto";import*as Ve from"node:fs";import*as Br from"node:path";var fr=class{sessionId;_trustAccepted=!1;_modelUsage=new Map;_totalInputTokens=0;_totalOutputTokens=0;_turnCount=0;_toolCallCount=0;_listeners=new Set;constructor(e){this.sessionId=e}get trustAccepted(){return this._trustAccepted}setTrustAccepted(e){this._trustAccepted=e,this.notifyListeners()}get totalInputTokens(){return this._totalInputTokens}get totalOutputTokens(){return this._totalOutputTokens}get turnCount(){return this._turnCount}get toolCallCount(){return this._toolCallCount}getModelUsage(e){return this._modelUsage.get(e)}getAllModelUsage(){let e={};for(let[r,n]of this._modelUsage)e[r]={...n};return e}addUsage(e,r){this._totalInputTokens+=e.inputTokens,this._totalOutputTokens+=e.outputTokens;let n=this._modelUsage.get(r);n?(n.inputTokens+=e.inputTokens,n.outputTokens+=e.outputTokens,n.cacheRead+=e.cacheRead??0,n.cacheCreation+=e.cacheWrite??0):this._modelUsage.set(r,{inputTokens:e.inputTokens,outputTokens:e.outputTokens,cacheRead:e.cacheRead??0,cacheCreation:e.cacheWrite??0,mediaCalls:0,mediaDurationSeconds:0,mediaCharacters:0}),this.notifyListeners()}addMediaUsage(e,r,n){let o=this._modelUsage.get(e),s=o??{inputTokens:0,outputTokens:0,cacheRead:0,cacheCreation:0,mediaCalls:0,mediaDurationSeconds:0,mediaCharacters:0};switch(o||this._modelUsage.set(e,s),s.mediaCalls+=1,r){case"per_second":s.mediaDurationSeconds+=n;break;case"per_character":s.mediaCharacters+=n;break;case"per_token":s.outputTokens+=n;break}this.notifyListeners()}recordToolCall(){this._toolCallCount++}recordTurnCompleted(){this._turnCount++}createSnapshot(){return{sessionId:this.sessionId,modelUsage:this.getAllModelUsage(),totalInputTokens:this._totalInputTokens,totalOutputTokens:this._totalOutputTokens,turnCount:this._turnCount,lastSavedAt:Date.now()}}restoreFromSnapshot(e){if(e.sessionId!==this.sessionId)return!1;this._totalInputTokens=e.totalInputTokens,this._totalOutputTokens=e.totalOutputTokens,this._turnCount=e.turnCount,this._modelUsage.clear();for(let[r,n]of Object.entries(e.modelUsage))this._modelUsage.set(r,{...n});return this.notifyListeners(),!0}onStateChange(e){return this._listeners.add(e),()=>{this._listeners.delete(e)}}notifyListeners(){for(let e of this._listeners)try{e()}catch{}}};import*as xR from"node:fs";import*as Fu from"node:path";var hr=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 Fu.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=Fu.join(s,e);try{if(xR.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 CR}from"node:crypto";async function IR(t,e){let r=new Date(t.lastActiveAt).getTime();if(Date.now()-r<Qp)return{split:!1,activeSessionId:t.sessionId};let s=CR(),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 ER(t,e){if(t.type!=="group")return{split:!1,activeSessionId:t.sessionId};if(t.turnCount<Zp)return{split:!1,activeSessionId:t.sessionId};let r=CR(),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 MR from"node:fs";import*as _R from"node:path";var Di=class{constructor(e=new hr,r=I()){this.locator=e;this.pathService=r}locator;pathService;getActiveProjectId(){return this.locator.getActiveProjectId()}getProjectWorkspaceDir(e){return this.locator.getProjectWorkspaceDir(e)}resolveWorkspaceDir(e,r){return this.locator.resolveWorkspaceDir(e,r)}async listThreads(e,r){let n=r??this.getActiveProjectId(),o=this.getProjectWorkspaceDir(n);return(await Rt(e,o)).map(i=>({id:i.sessionId,title:i.title,status:"active",turnCount:i.messageCount,createdAt:i.createdAt,lastActiveAt:i.lastActiveAt}))}resolveSessionWorkspaceDir(e,r,n){if(n)return this.resolveWorkspaceDir(r,n);let o=e.getActiveProjectRoot();if(o){let s=_R.join(this.pathService.getProjectSessionsRoot(o),Lj(r));try{if(MR.existsSync(s))return o}catch{}}return this.resolveWorkspaceDir(r)}};function Lj(t){return t.replace(/[^a-zA-Z0-9_-]/g,"_")}var Oj=new hr,tt=new Di(Oj);function yt(t,e="Unknown error"){return t instanceof Error?t.message:e}function Sn(t,e,r){return tt.resolveSessionWorkspaceDir(t,e,r)}function DR(t){let e=t.params,r=e?.id??Hu();this.log(`[thread.create] id=${r} title=${e?.title??"(none)"}`),e?.cwd&&typeof e.cwd=="string"&&this.setActiveWorkdir(e.cwd),this.currentSessionId=r,this.sessionState=new fr(r),this.sessionTaskDomain=void 0,this.memoryPrefetchState=kt(),this.enableIdleDream(),t.id!==void 0&&this.sendResponse(t.id,{id:r,title:e?.title,status:"active",createdAt:new Date().toISOString()})}async function NR(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: ${yt(n)}`})}}async function LR(t){let e=t.params,r=e?.sessionId??Hu();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: ${yt(n)}`})}}async function OR(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 Rt(500,p)).find(f=>f.sessionId===n);if(m){this.sendResponse(t.id,{sessionId:n,title:m.title,type:m.type??"personal",ownerId:s,projectId:d});return}await 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 Rt(500,u.workspaceDir)).find(g=>g.groupKey===d&&!g.sealedAt);if(f){let g=Vt(f.sessionId,u.workspaceDir);if(g){let h=await IR(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=Hu(),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: ${yt(i)}`})}}async function jR(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 Rt(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 Rt(r,c.workspaceDir);for(let d of l)i.has(d.sessionId)||d.projectId&&(i.add(d.sessionId),a.push(d))}a.sort((c,l)=>c.lastActiveAt>l.lastActiveAt?-1:c.lastActiveAt<l.lastActiveAt?1:0),n=a}e?.archived===!0?n=n.filter(s=>s.archivedAt!=null):e?.archived===!1&&(n=n.filter(s=>s.archivedAt==null));let o=n.slice(0,r).map(s=>({sessionId:s.sessionId,title:s.title,type:s.type??"personal",lastActiveAt:s.lastActiveAt,pinnedAt:s.pinnedAt??null,archivedAt:s.archivedAt??null,sealedAt:s.sealedAt??null,projectId:s.projectId,previousSessionId:s.previousSessionId??null,carryoverSummary:s.carryoverSummary??null}));t.id!==void 0&&this.sendResponse(t.id,{sessions:o})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to list sessions: ${yt(n)}`})}}async function $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=Sn(this,e.sessionId,e.projectId),o=(await Rt(500,r)).find(s=>s.sessionId===e.sessionId);t.id!==void 0&&this.sendResponse(t.id,{session:o?{sessionId:o.sessionId,title:o.title,type:o.type,lastActiveAt:o.lastActiveAt,pinnedAt:o.pinnedAt??null,archivedAt:o.archivedAt??null,projectId:o.projectId}:null})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to get session: ${yt(r)}`})}}async function UR(t){let e=t.params;if(!e?.sessionId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: sessionId"});return}try{let r=Sn(this,e.sessionId,e.projectId),n=await Ec(e.sessionId,r);if(!n){t.id!==void 0&&this.sendResponse(t.id,{messages:[],total:0});return}let o=n.messages,s=e.limit&&e.limit>0?e.limit:o.length,i=o.slice(-s);t.id!==void 0&&this.sendResponse(t.id,{messages:i,total:o.length})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to get messages: ${yt(r)}`})}}async function 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=Sn(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: ${yt(r)}`})}}async function HR(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=Sn(this,e.sessionId,e.projectId);await Mc(e.sessionId,r),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to delete session: ${yt(r)}`})}}async function BR(t){let e=t.params;if(!e?.projectId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Missing required param: projectId"});return}try{let r=tt.getProjectWorkspaceDir(e.projectId),n=(await Rt(1e4,r)).filter(s=>s.projectId===e.projectId),o=0;for(let s of n)await Mc(s.sessionId,r),o++;t.id!==void 0&&this.sendResponse(t.id,{ok:!0,deletedCount:o})}catch(r){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to delete all sessions: ${yt(r)}`})}}async function qR(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=Sn(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: ${yt(r)}`})}}async function WR(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=Sn(this,r,e?.projectId),o=await Ec(r,n);if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:`Session not found: ${r}`});return}o.messages&&o.messages.length>0&&this.sessionHistory.saveResumedSession(r,o.messages),t.id!==void 0&&this.sendResponse(t.id,{metadata:o.metadata,messages:o.messages})}catch(n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to resume session: ${yt(n)}`})}}function GR(t){let e=this.currentSessionId||"default",r=this.sessionState?.createSnapshot(),n,o=this.getActiveProjectRoot();o&&(n=Br.join(Jo(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 KR(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=Ct(r.id);if(!o){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:"Switch failed"});return}this.setActiveWorkdir(o.workspaceDir),this.sendNotification("project.switched",{id:o.id,name:o.name,workspaceDir:o.workspaceDir}),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,project:o})}function zR(t){let e=ne(),r=z();t.id!==void 0&&this.sendResponse(t.id,{sessionId:this.currentSessionId,activeProject:e,projects:r})}async function VR(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 Vt(r,s);if(i&&i.projectId===o.id){Ct(o.id),this.setActiveWorkdir(s),this.log(`[session.focus] switched to project ${o.id} for session ${r}`),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,projectId:o.id});return}}catch{}if(e?.projectName){let o=n.find(s=>s.name===e.projectName);if(o){let s=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 XR(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=yt(l);this.log(`[session.moveToProject] error: ${d}`),t.id!==void 0&&this.sendError(t.id,y.INTERNAL_ERROR,`Move failed: ${d}`)}}He();function jj(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 qu(t,e){Re(t,e,ns)}function $j(t){let e={};for(let r of t)for(let n of r.purposes)e[n]??=[],e[n].push(r);return e}async function Uj(){let t=D(),e=await $n(t);return t.save(),e}async function YR(t){try{return await Uj(),!0}catch(e){if(t)throw e;return!1}}function Wu(t=D()){try{return Am()}catch{return t.getKnownProviderDef(Y)?.baseUrl??"https://www.qlogicagent.com"}}function Gu(t){return t.id===Y?Y:t.group?.trim()||t.id}function Fj(t){return t.id===Gu(t)}function JR(t){let e=Gu(t);return Oc({...t,id:e})}function Hj(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]??Oc(t)}function Bj(t){return t.authType==="none"?!1:t.apiKeyEnvVars===void 0||t.apiKeyEnvVars.length>0}function qj(t){return{id:t.id,displayName:Hj(t),baseUrl:Jr(t)??"",modelCount:t.models?.length??0}}function Wj(t){let e=new Map;for(let r of t){if(!Bj(r))continue;let n=Gu(r);if(n===Y)continue;let o=r.models?.length??0,s=qj(r),i=e.get(n);if(!i){e.set(n,{id:n,displayName:JR(r),baseUrl:Jr(r)??"",modelCount:o,variants:[s]});continue}i.modelCount+=o,i.variants??=[],i.variants.some(a=>a.id===s.id)||i.variants.push(s),Fj(r)&&(i.displayName=JR(r),i.baseUrl=Jr(r)??i.baseUrl)}return Array.from(e.values()).map(r=>({...r,variants:r.variants&&r.variants.length>1?r.variants:void 0}))}async function QR(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??Wu(e);try{if((await $c(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 ZR(t=!1){let e=D();if(!!e.getProviderStatus(Y)?.keys.length)return await QR(!1)?!0:YR(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:YR(t)}function Gj(t){return t.defaultModel??t.models?.find(e=>!!e.id)?.id}function Kj(t){return[...new Set(t)]}function zj(t){let e=t.replace(/\/+$/,"");return Kj([`${e}/models`,/\/v\d+$/.test(e)?`${e}/models`:`${e}/v1/models`])}function Vj(t){return t===404||t===405||t===410||t===501}async function Xj(t){let e=D().getKnownProviderDef(t);if(e)return e;let r=await jc(t).catch(()=>null);if(r)return{id:r.id,transport:r.transport,baseUrl:Jr(r),authType:r.authType,models:r.models}}function Bu(t){return{accept:"application/json",Authorization:`Bearer ${t}`}}function Yj(t,e,r,n){if(t===Y)return[{method:"GET",url:Nc(r),headers:Bu(e)}];let o=r.replace(/\/+$/,""),s=n?.transport,i=Gj(n??{id:t}),a=[];if(s==="anthropic-messages")return/\/anthropic$/.test(o)&&a.push({method:"GET",url:`${o.replace(/\/anthropic$/,"")}/models`,headers:Bu(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 zj(o))a.push({method:"GET",url:c,headers:Bu(e)});return a}async function Jj(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 eS(t,e,r){let n=await Xj(t),o=Yj(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 Jj(i);if(a.valid)return a;if(Vj(a.status)){s=a;continue}return a}return s??{valid:!1,status:0,error:`No validation probe succeeded for provider "${t}".`}}async function Qj(t,e,r){let n=await eS(t,e,r);if(!n.valid){let o=n.error?`: ${n.error}`:"";throw new Error(`API Key validation failed (${n.status})${o}`)}}async function tS(t){try{let e=D(),r=["deepseek",Y].map(s=>e.getKnownProviderDef(s)).filter(s=>!!s).map(s=>({id:s.id,displayName:s.name,baseUrl:s.baseUrl,modelCount:s.models?.length??0})),n=await Lc().catch(()=>[]),o=Wj(n);o.unshift({id:Y,displayName:Dc,baseUrl:Wu(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 rS(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 mS(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 $c(s,{baseUrl:c,apiKey:n})).length===0)throw new Error("LLMRouter did not return any available models for this API Key.")}else await Qj(r,n,c);for(let d of jn)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:ns;Re(this,t,l)}}function nS(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 oS(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 sS(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 iS(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 aS(t){let e=t.params;try{await ZR(!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:$j(o),configuredProviderIds:[...n]})}catch{qu(this,t)}}function cS(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 lS(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 dS(t){try{await ZR(!1);let e=D(),r=e.getAllProviderStatus().map(s=>({providerId:s.providerId,displayName:s.providerId===Y?Dc:s.providerId,baseUrl:s.baseUrl,keyCount:s.keys.length,healthyKeys:s.keys.filter(i=>i.healthStatus==="healthy"&&i.enabled).length,totalKeys:s.keys.length,keys:s.keys.map(i=>({id:i.id,label:i.label,maskedKey:jj(i.key),enabled:i.enabled,health:i.healthStatus}))})),n=e.getAllBindings(),o={};for(let s of jn){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{qu(this,t)}}async function uS(t){try{let e=D();e.load(),await QR(!1)||await $n(e),e.save(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,catalogRefreshed:!0})}catch{qu(this,t)}}async function pS(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 mS(e.providerId);if(!r){Re(this,t,`Unknown provider: ${e.providerId}`,y.INVALID_PARAMS);return}let n=await eS(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 mS(t){if(t===Y)return Wu();let e=D().getKnownProviderDef(t);if(e?.baseUrl)return e.baseUrl;let r=await jc(t);return r?Jr(r):void 0}G();import*as ce from"node:fs";import*as Le from"node:path";import{join as Zj}from"node:path";import{readFileSync as e$,writeFileSync as t$,mkdirSync as r$}from"node:fs";var qr=null,Ku=!1;function gS(t){return Zj(t,"skill-stats.json")}function zu(t){if(qr)return qr;try{qr=JSON.parse(e$(gS(t),"utf8"))}catch{qr={}}return qr}function n$(t){if(!(!Ku||!qr))try{r$(t,{recursive:!0}),t$(gS(t),JSON.stringify(qr,null,2),"utf8"),Ku=!1}catch{}}function Vu(t,e,r){let n=zu(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),Ku=!0,n$(t)}function fS(t,e){return zu(t)[e]}function hS(t){return zu(t)}import*as Bt from"node:fs";import*as Ni from"node:path";function o$(t){try{let e=Bt.readFileSync(t,"utf8"),r=e.match(/^---\n[\s\S]*?^version:\s*(\S+)/m),n=e.match(/^---\n[\s\S]*?^description:\s*(.+)/m);return{version:r?.[1],description:n?.[1]?.trim()}}catch{return{}}}function vS(t){let e=I(),r=[],n=t?e.getProjectSkillsDir(t):void 0,o=e.getUserSkillsDir();return n&&yS(r,n,"project"),yS(r,o,"global"),r}function yS(t,e,r){if(Bt.existsSync(e))for(let n of Bt.readdirSync(e)){let o=Ni.join(e,n);try{if(!Bt.statSync(o).isDirectory())continue}catch{continue}let s=Ni.join(o,"SKILL.md"),i=Ni.join(o,"SKILL.md.disabled"),a=Bt.existsSync(s)?s:null;if(!a&&!Bt.existsSync(i))continue;let c=a?o$(a):{};t.push({id:`${r}:${n}`,name:n,path:o,active:!!a,scope:r,category:"automation",displayName:s$(n),displayDescription:i$(n,c.description),fallbackName:n,fallbackDescription:c.description??"",systemGenerated:a$(n),version:c.version,description:c.description})}}function s$(t){return{key:`capability.skill.${t}.name`,fallback:t}}function i$(t,e){return{key:`capability.skill.${t}.description`,fallback:e??""}}function a$(t){return t.startsWith("auto-skill-")||t.startsWith("test-skill-")}function c$(t){return t==="active"||t==="stale"||t==="archived"}function bS(t){let r=t.params?.projectId,n=this.getActiveProjectRoot();if(r&&this.projectLocator){let s=this.projectLocator.resolveProjectRoot(r);s&&(n=s)}let o=vS(n);t.id!==void 0&&this.sendResponse(t.id,{skills:o})}function kS(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=It(l,r);d.state!=="active"&&(d.state="active",d.staleAt=void 0,d.archivedAt=void 0),he(c,l),t.id!==void 0&&this.sendResponse(t.id,{ok:!0}),this.sendNotification("skills.updated",{action:"activate",name:r})}catch(c){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to activate skill: ${c instanceof Error?c.message:c}`})}else t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Skill "${r}" not found`})}function RS(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 SS(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}),gt(),$s(o,r),he(n,o),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,deleted:r,scope:s}),this.sendNotification("skills.updated",{action:"delete",name:r})}catch(a){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to delete skill: ${a instanceof Error?a.message:a}`})}}function TS(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}),gt(),t.id!==void 0&&this.sendResponse(t.id,{ok:!0,promoted:r,globalPath:c,removedFromProject:!e?.keepLocal})}catch(l){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:`Failed to promote skill: ${l instanceof Error?l.message:l}`})}}function wS(t){let e=t.params,r=B();if(e?.name){let n=fS(r,e.name);t.id!==void 0&&this.sendResponse(t.id,{name:e.name,stats:n??null})}else{let n=hS(r);t.id!==void 0&&this.sendResponse(t.id,{stats:n})}}function AS(t){let e=t.params;if(!e?.name){t.id!==void 0&&this.sendResponse(t.id,null,{code:-32602,message:"Missing 'name' parameter"});return}let r=B(),n=ue(r);It(n,e.name),ph(n,e.name),he(r,n),t.id!==void 0&&this.sendResponse(t.id,{name:e.name,pinned:!0})}function PS(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);mh(n,e.name),he(r,n),t.id!==void 0&&this.sendResponse(t.id,{name:e.name,pinned:!1})}function xS(t){let e=B(),r=this.getActiveProjectRoot(),n=r?Le.join(r,".qlogicagent","skills"):sr(),o=gh(e,n);o.transitioned.length>0&>(),t.id!==void 0&&this.sendResponse(t.id,o)}function CS(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(!c$(e.state)){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"Invalid skill lifecycle state"});return}let o=fh(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 DS from"node:path";import{randomUUID as g$}from"node:crypto";import{join as Xu}from"node:path";import{mkdir as l$,readdir as d$}from"node:fs/promises";function u$(t){return t?.pathService??I()}function p$(t,e){return t??e.getActiveProjectRoot()}function IS(t,e){let r=u$(e);return Xu(r.getProjectAgentDir(p$(t,r)),"solos")}function Yu(t,e,r){return Xu(IS(e,r),t)}function ES(t,e,r){return Xu(Yu(t,e,r),"solo-state.json")}async function MS(t,e,r){let n=Yu(t.soloId,e,r);await l$(n,{recursive:!0}),await mr(ES(t.soloId,e,r),t)}async function m$(t,e,r){return Zt(ES(t,e,r))}async function _S(t,e){let r=IS(t,e),n;try{n=await d$(r)}catch{return[]}let o=[];for(let s of n){let i=await m$(s,t,e);i&&o.push(i)}return o}async function Ju(t,e,r){let{rm:n}=await import("node:fs/promises"),o=Yu(t,e,r);try{return await n(o,{recursive:!0,force:!0}),!0}catch{return!1}}var Li=class{constructor(e,r,n,o={}){this.processManager=e;this.acpDetector=r;this.configStore=n;this.callbacks=o}processManager;acpDetector;configStore;callbacks;sessions=new Map;persistSession(e){let r={soloId:e.soloId,state:e.state,task:e.task,cwd:e.cwd,gitRoot:e.gitRoot,agents:e.agents.map(n=>({agentId:n.agentId,memberId:n.memberId,worktreePath:n.worktreePath,worktreeBranch:n.worktreeBranch,state:n.state,resultText:n.resultText,diff:n.diff,usage:n.usage,error:n.error,turns:n.turns})),evaluation:e.evaluation,createdAt:e.createdAt};MS(r,e.cwd).catch(()=>{})}async restoreFromDisk(e){let r=await _S(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),Ju(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>
|
|
547
547
|
${s.rules.join(`
|
|
548
548
|
`)}
|
|
549
549
|
</rules>`),s.memory?.length&&u.push(`<memory>
|
|
@@ -558,7 +558,7 @@ ${r}`)}let c=`solo-${g$().slice(0,8)}`,l={soloId:c,state:"running",task:r,cwd:o,
|
|
|
558
558
|
`),warn:r=>process.stderr.write(`[solo:pm] WARN ${r}
|
|
559
559
|
`)},onNotification:(r,n,o)=>{(n==="agents.error"||n==="agents.status")&&this.sendNotification(n,o),this.sendNotification("team.member.notification",{memberId:r,method:n,params:o})},onStateChange:(r,n)=>{let o=t.getHandle(r),i=t.getUsageTracker(r)?.getUsage();this.emitAgentStatus(r,n,{missedBeats:t.getMissedBeats(r),lastActivityAt:o?.lastActivityAt,usage:i&&i.totalTokens>0?{inputTokens:i.inputTokens,outputTokens:i.outputTokens,totalTokens:i.totalTokens}:void 0})},onMcpToolCall:(r,n,o)=>this.handleMcpToolCall(r,n,o),sessionDir:DS.join(X(),"agent-logs")}),e={log:{info:r=>process.stderr.write(`${r}
|
|
560
560
|
`),warn:r=>process.stderr.write(`${r}
|
|
561
|
-
`)},onProgress:(r,n,o,s)=>{this.sendNotification("solo.progress",{soloId:r,agentId:n,state:o,progress:s})},onEvaluation:(r,n)=>{this.sendNotification("solo.evaluation",{soloId:r,winnerId:n.winnerId,reasoning:n.reasoning})},onAgentDelta:(r,n,o)=>{this.sendNotification("solo.agentDelta",{soloId:r,agentId:n,text:o})},onAgentDiff:(r,n,o)=>{this.sendNotification("solo.agentDiff",{soloId:r,agentId:n,files:o})},onAgentUsage:(r,n,o,s)=>{this.sendNotification("solo.agentUsage",{soloId:r,agentId:n,inputTokens:o,outputTokens:s})}};this.soloEvaluator=new Li(t,this.acpDetector,this.agentConfigStore,e),this.soloProcessManager=t}return this.soloEvaluator}async function NS(t){try{let e=t.params;if(!e?.task||!e?.agents||!e?.cwd){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"task, agents, and cwd are required."});return}let r=e;if(!r.projectId){let i=ne();i&&(r.projectId=i.id)}let n=Xe.call(this),o=await n.start(r),s=n.getStatus(o);t.id!==void 0&&this.sendResponse(t.id,s)}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function LS(t){try{let e=t.params;if(!e?.soloId){this.soloEvaluator?t.id!==void 0&&this.sendResponse(t.id,this.soloEvaluator.listSessions()):t.id!==void 0&&this.sendResponse(t.id,[]);return}let n=Xe.call(this).getStatus(e.soloId);if(!n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:`Solo session ${e.soloId} not found.`});return}t.id!==void 0&&this.sendResponse(t.id,n)}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function OS(t){try{let e=t.params;if(!e?.soloId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"soloId is required."});return}await Xe.call(this).cancel(e.soloId),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function jS(t){try{let e=t.params;if(!e?.soloId||!e?.winnerId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"soloId and winnerId are required."});return}let n=await Xe.call(this).select(e);t.id!==void 0&&this.sendResponse(t.id,{ok:!0,mergedBranch:n})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}function $S(t){try{this.soloEvaluator?t.id!==void 0&&this.sendResponse(t.id,this.soloEvaluator.listSessions()):t.id!==void 0&&this.sendResponse(t.id,[])}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function US(t){try{let e=t.params;if(!e?.soloId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"soloId is required."});return}await Xe.call(this).delete(e.soloId),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function FS(t){try{let e=t.params;if(!e?.soloId||!e?.agentId||!e?.content){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"soloId, agentId, and content are required."});return}let n=await Xe.call(this).message(e.soloId,e.agentId,e.content,e.agentIndex);t.id!==void 0&&this.sendResponse(t.id,n)}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function HS(t){try{let e=t.params;if(!e?.soloId||!e?.evaluatorAgentId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"soloId and evaluatorAgentId are required."});return}let n=await Xe.call(this).triggerEvaluation(e.soloId,e.evaluatorAgentId,e.evaluatorIndex);t.id!==void 0&&this.sendResponse(t.id,n)}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}import{randomUUID as WU}from"node:crypto";import{createHash as f$}from"node:crypto";function BS(t,e){let r=e?.context?.trim();return r?[{role:"system",content:r},...t]:t}function qS(t){let e=f$("sha256").update(t.context??"").digest("hex");return{id:t.id,name:t.name,source:t.source,contextHash:`sha256:${e}`,enabledSkills:[...t.enabledSkills],disabledBuiltinSkills:[...t.disabledBuiltinSkills]}}He();import{randomUUID as _$}from"node:crypto";var Tn=class{mode;rules;defaultBehavior;compiledPatterns;constructor(e){this.mode=e.mode,this.rules=[...e.rules],this.defaultBehavior=e.defaultBehavior,this.compiledPatterns=this.compileRules(this.rules)}getMode(){return this.mode}setMode(e){this.mode=e}getRules(){return this.rules}getDefaultBehavior(){return this.defaultBehavior}replaceRules(e){this.rules=[...e],this.compiledPatterns=this.compileRules(this.rules)}setDefaultBehavior(e){this.defaultBehavior=e}addRule(e){this.rules.push(e),this.compiledPatterns=this.compileRules(this.rules)}check(e){let{toolName:r,meta:n}=e;if(this.mode==="full_access")return{behavior:"allow",decisionReason:{type:"mode",mode:"full_access"}};for(let{rule:s,regex:i}of this.compiledPatterns)if(i.test(r))return y$(s,e);let o=k$(n);return o==="read"?{behavior:"allow",decisionReason:{type:"tool_check",reason:"risk:read"}}:n?.requiresApproval?{behavior:"ask",message:`Tool "${r}" requires approval`,toolName:r,input:e.arguments,decisionReason:{type:"tool_check",reason:"requiresApproval"}}:o==="system"||o==="external_egress"?{behavior:"ask",message:`Tool "${r}" requires approval (${o})`,toolName:r,input:e.arguments,decisionReason:{type:"tool_check",reason:`risk:${o}`}}:this.defaultBehavior==="allow"?{behavior:"allow"}:this.defaultBehavior==="deny"?{behavior:"deny",message:`Tool "${r}" denied by default policy`,decisionReason:{type:"other",reason:"default_deny"}}:{behavior:"ask",message:`Tool "${r}" requires approval (default policy)`,toolName:r,input:e.arguments}}compileRules(e){return e.map(r=>({rule:r,regex:h$(r.pattern)}))}};function Oi(t){if(!t||typeof t!="object")return{mode:"default",rules:[],defaultBehavior:"ask"};let e=t;return b$(e),{mode:v$(e.mode).mode,rules:[],defaultBehavior:"ask"}}function h$(t){let r=t.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*+/g,".*");return new RegExp(`^${r}$`,"i")}function y$(t,e){let r={type:"rule",rule:t};return t.behavior==="allow"?{behavior:"allow",decisionReason:r}:t.behavior==="deny"?{behavior:"deny",message:t.reason??`Tool "${e.toolName}" denied by rule "${t.pattern}"`,decisionReason:r}:{behavior:"ask",message:t.reason??`Tool "${e.toolName}" requires approval (rule "${t.pattern}")`,toolName:e.toolName,input:e.arguments,decisionReason:r}}function v$(t){if(t==="default"||t==="auto"||t==="full_access")return{mode:t};if(typeof t=="string")throw new Error(`Invalid permission mode: ${t}`);return{mode:"default"}}function b$(t){if("default"in t)throw new Error("Legacy permissions.default is not supported");for(let e of["allow","deny","ask"])if(e in t)throw new Error(`Legacy permission ${e} arrays are not supported`)}function k$(t){return t?.riskLevel?t.riskLevel:t?.isReadOnly?"read":t?.isDangerous?"system":"write"}var R$=new Set(["nodeversion","npmversion","npxversion","pnpmversion","yarnversion","bunversion","denoversion","pythonversion","python3version","pipversion","rubyversion","go version","rustcversion","cargoversion","java -version","javac -version","dotnetversion","gccversion","g++version","clangversion","gitversion","dockerversion","--help","-h"]),WS=new Set(["ls","dir","find","fd","locate","which","where","type","cat","head","tail","less","more","bat","wc","file","stat","du","df","tree","exa","eza","grep","rg","ripgrep","ag","ack","fgrep","egrep","git status","git log","git diff","git show","git branch","git tag","git remote","git stash list","git blame","git shortlog","git describe","git rev-parse","git ls-files","git ls-tree","git cat-file","git reflog","ps","top","htop","uptime","uname","hostname","whoami","id","env","printenv","echo","ping","nslookup","dig","host","ifconfig","ip","netstat","ss","npm list","npm ls","npm info","npm view","npm outdated","npm audit","pnpm list","pnpm ls","pnpm outdated","pip list","pip show","pip freeze","cargo tree","npm test","npm run test","npm run build","npm run lint","pnpm test","pnpm run test","pnpm run build","pnpm run lint","yarn test","yarn build","yarn lint","cargo test","cargo build","cargo check","cargo clippy","go test","go build","go vet","make","cmake","pytest","python -m pytest","python3 -m pytest","jest","vitest","mocha","tsc","tscnoEmit","eslint","prettier","oxlint"]),S$=[/\brm\s+-rf?\s+[/~]/,/\brm\s+-rf?\s+\.\.\//,/\bsudo\b/,/\bsu\s/,/\bchmod\s+777\b/,/\bmkfs\b/,/\bfdisk\b/,/\bdd\s+if=/,/\bsystemctl\s+(start|stop|restart|enable|disable)\b/,/\bservice\s+\S+\s+(start|stop|restart)\b/,/\breg\s+(add|delete)\b/i,/\\Windows\\System32/i,/\/etc\/(passwd|shadow|sudoers|fstab)/,/\bgit\s+push\s+.*--force\b/,/\bgit\s+push\s+-f\b/,/\bcurl\b.*(-H|--header)\s+.*[Aa]uthorization/,/\bwget\b.*--header.*[Aa]uthorization/,/\bcurl\b.*\|\s*(sh|bash|zsh)\b/,/\bwget\b.*-O\s*-\s*\|\s*(sh|bash|zsh)\b/,/\bnpm\s+install\s+-g\b/,/\bpip\s+install\b(?!.*-r\b)(?!.*requirements)/,/\bDROP\s+(DATABASE|TABLE|SCHEMA)\b/i,/\bTRUNCATE\s+TABLE\b/i],GS=new Set(["npm install","npm i","npm ci","pnpm install","pnpm i","yarn install","yarn","pip install -r","pip install -e","cargo build","cargo install","go mod download","go get","bundle install","composer install","git add","git commit","git stash","git checkout","git switch","git merge","git rebase","git cherry-pick","git pull","git fetch","docker build","docker compose","mkdir","touch","cp"]);function KS(t,e,r){let n=t.trim();if(!n)return{decision:"allow",reason:"empty command"};let o=xd(n)??Cd(n)??void 0;for(let l of S$)if(l.test(n))return{decision:"deny",reason:`matches dangerous pattern: ${l.source}`,destructiveWarning:o};for(let l of R$)if(n===l||n.startsWith(l+" "))return{decision:"allow",reason:`known safe command: ${l}`,destructiveWarning:o};let s=n.split(/\s+/),i=s[0],a=s.length>1?`${s[0]} ${s[1]}`:i;return WS.has(i)||WS.has(a)?{decision:"allow",reason:`known safe command: ${i}`,destructiveWarning:o}:e&&r&&e.startsWith(r)&&(GS.has(i)||GS.has(a))?{decision:"allow",reason:`safe in project: ${a}`,destructiveWarning:o}:{decision:"defer",reason:"unknown command \u2014 needs LLM classification",destructiveWarning:o}}function T$(t){let e=Object.keys(t).sort(),r={};for(let n of e){let o=t[n];typeof o=="string"?r[n]=o.replace(/\s+/g," ").trim():r[n]=o}return JSON.stringify(r)}function Qu(t,e){return`${t}::${T$(e)}`}var w$=500,ji=class{cache=new Map;get(e,r){let n=Qu(e,r),o=this.cache.get(n);if(o)return o.hitCount++,o}set(e,r,n){if(this.cache.size>=w$){let s=this.cache.keys().next().value;s!==void 0&&this.cache.delete(s)}let o=Qu(e,r);this.cache.set(o,{shouldBlock:n.shouldBlock,reason:n.reason,classifiedAt:Date.now(),hitCount:0})}has(e,r){return this.cache.has(Qu(e,r))}clear(){this.cache.clear()}get size(){return this.cache.size}get totalHits(){let e=0;for(let r of this.cache.values())e+=r.hitCount;return e}};var P$=new Set(["read","search","instructions","think","task","memory","skill","tool_search","plan_mode","lsp","brief","web_search","image_generate","video_generate","music_generate","tts","three_d_generate","checkpoint"]);function Ao(t){return P$.has(t)}var zS=`You are a security classifier for an AI coding agent. Your job is to decide whether a tool invocation is safe to execute without user confirmation.
|
|
561
|
+
`)},onProgress:(r,n,o,s)=>{this.sendNotification("solo.progress",{soloId:r,agentId:n,state:o,progress:s})},onEvaluation:(r,n)=>{this.sendNotification("solo.evaluation",{soloId:r,winnerId:n.winnerId,reasoning:n.reasoning})},onAgentDelta:(r,n,o)=>{this.sendNotification("solo.agentDelta",{soloId:r,agentId:n,text:o})},onAgentDiff:(r,n,o)=>{this.sendNotification("solo.agentDiff",{soloId:r,agentId:n,files:o})},onAgentUsage:(r,n,o,s)=>{this.sendNotification("solo.agentUsage",{soloId:r,agentId:n,inputTokens:o,outputTokens:s})}};this.soloEvaluator=new Li(t,this.acpDetector,this.agentConfigStore,e),this.soloProcessManager=t}return this.soloEvaluator}async function NS(t){try{let e=t.params;if(!e?.task||!e?.agents||!e?.cwd){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"task, agents, and cwd are required."});return}let r=e;if(!r.projectId){let i=ne();i&&(r.projectId=i.id)}let n=Xe.call(this),o=await n.start(r),s=n.getStatus(o);t.id!==void 0&&this.sendResponse(t.id,s)}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function LS(t){try{let e=t.params;if(!e?.soloId){this.soloEvaluator?t.id!==void 0&&this.sendResponse(t.id,this.soloEvaluator.listSessions()):t.id!==void 0&&this.sendResponse(t.id,[]);return}let n=Xe.call(this).getStatus(e.soloId);if(!n){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:`Solo session ${e.soloId} not found.`});return}t.id!==void 0&&this.sendResponse(t.id,n)}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function OS(t){try{let e=t.params;if(!e?.soloId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"soloId is required."});return}await Xe.call(this).cancel(e.soloId),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function jS(t){try{let e=t.params;if(!e?.soloId||!e?.winnerId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"soloId and winnerId are required."});return}let n=await Xe.call(this).select(e);t.id!==void 0&&this.sendResponse(t.id,{ok:!0,mergedBranch:n})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}function $S(t){try{this.soloEvaluator?t.id!==void 0&&this.sendResponse(t.id,this.soloEvaluator.listSessions()):t.id!==void 0&&this.sendResponse(t.id,[])}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function US(t){try{let e=t.params;if(!e?.soloId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"soloId is required."});return}await Xe.call(this).delete(e.soloId),t.id!==void 0&&this.sendResponse(t.id,{ok:!0})}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function FS(t){try{let e=t.params;if(!e?.soloId||!e?.agentId||!e?.content){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"soloId, agentId, and content are required."});return}let n=await Xe.call(this).message(e.soloId,e.agentId,e.content,e.agentIndex);t.id!==void 0&&this.sendResponse(t.id,n)}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}async function HS(t){try{let e=t.params;if(!e?.soloId||!e?.evaluatorAgentId){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INVALID_PARAMS,message:"soloId and evaluatorAgentId are required."});return}let n=await Xe.call(this).triggerEvaluation(e.soloId,e.evaluatorAgentId,e.evaluatorIndex);t.id!==void 0&&this.sendResponse(t.id,n)}catch(e){t.id!==void 0&&this.sendResponse(t.id,void 0,{code:y.INTERNAL_ERROR,message:e instanceof Error?e.message:String(e)})}}import{randomUUID as WU}from"node:crypto";import{createHash as f$}from"node:crypto";function BS(t,e){let r=e?.context?.trim();return r?[{role:"system",content:r},...t]:t}function qS(t){let e=f$("sha256").update(t.context??"").digest("hex");return{id:t.id,name:t.name,source:t.source,contextHash:`sha256:${e}`,enabledSkills:[...t.enabledSkills],disabledBuiltinSkills:[...t.disabledBuiltinSkills]}}He();import{randomUUID as _$}from"node:crypto";var Tn=class{mode;rules;defaultBehavior;compiledPatterns;constructor(e){this.mode=e.mode,this.rules=[...e.rules],this.defaultBehavior=e.defaultBehavior,this.compiledPatterns=this.compileRules(this.rules)}getMode(){return this.mode}setMode(e){this.mode=e}getRules(){return this.rules}getDefaultBehavior(){return this.defaultBehavior}replaceRules(e){this.rules=[...e],this.compiledPatterns=this.compileRules(this.rules)}setDefaultBehavior(e){this.defaultBehavior=e}addRule(e){this.rules.push(e),this.compiledPatterns=this.compileRules(this.rules)}check(e){let{toolName:r,meta:n}=e;if(this.mode==="full_access")return{behavior:"allow",decisionReason:{type:"mode",mode:"full_access"}};for(let{rule:s,regex:i}of this.compiledPatterns)if(i.test(r))return y$(s,e);let o=k$(n);return o==="read"?{behavior:"allow",decisionReason:{type:"tool_check",reason:"risk:read"}}:n?.requiresApproval?{behavior:"ask",message:`Tool "${r}" requires approval`,toolName:r,input:e.arguments,decisionReason:{type:"tool_check",reason:"requiresApproval"}}:o==="system"||o==="external_egress"?{behavior:"ask",message:`Tool "${r}" requires approval (${o})`,toolName:r,input:e.arguments,decisionReason:{type:"tool_check",reason:`risk:${o}`}}:this.defaultBehavior==="allow"?{behavior:"allow"}:this.defaultBehavior==="deny"?{behavior:"deny",message:`Tool "${r}" denied by default policy`,decisionReason:{type:"other",reason:"default_deny"}}:{behavior:"ask",message:`Tool "${r}" requires approval (default policy)`,toolName:r,input:e.arguments}}compileRules(e){return e.map(r=>({rule:r,regex:h$(r.pattern)}))}};function Oi(t){if(!t||typeof t!="object")return{mode:"default",rules:[],defaultBehavior:"ask"};let e=t;return b$(e),{mode:v$(e.mode).mode,rules:[],defaultBehavior:"ask"}}function h$(t){let r=t.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*+/g,".*");return new RegExp(`^${r}$`,"i")}function y$(t,e){let r={type:"rule",rule:t};return t.behavior==="allow"?{behavior:"allow",decisionReason:r}:t.behavior==="deny"?{behavior:"deny",message:t.reason??`Tool "${e.toolName}" denied by rule "${t.pattern}"`,decisionReason:r}:{behavior:"ask",message:t.reason??`Tool "${e.toolName}" requires approval (rule "${t.pattern}")`,toolName:e.toolName,input:e.arguments,decisionReason:r}}function v$(t){if(t==="default"||t==="auto"||t==="full_access")return{mode:t};if(typeof t=="string")throw new Error(`Invalid permission mode: ${t}`);return{mode:"default"}}function b$(t){if("default"in t)throw new Error("Legacy permissions.default is not supported");for(let e of["allow","deny","ask"])if(e in t)throw new Error(`Legacy permission ${e} arrays are not supported`)}function k$(t){return t?.riskLevel?t.riskLevel:t?.isReadOnly?"read":t?.isDangerous?"system":"write"}var R$=new Set(["nodeversion","npmversion","npxversion","pnpmversion","yarnversion","bunversion","denoversion","pythonversion","python3version","pipversion","rubyversion","go version","rustcversion","cargoversion","java -version","javac -version","dotnetversion","gccversion","g++version","clangversion","gitversion","dockerversion","--help","-h"]),WS=new Set(["ls","dir","find","fd","locate","which","where","type","cat","head","tail","less","more","bat","wc","file","stat","du","df","tree","exa","eza","grep","rg","ripgrep","ag","ack","fgrep","egrep","git status","git log","git diff","git show","git branch","git tag","git remote","git stash list","git blame","git shortlog","git describe","git rev-parse","git ls-files","git ls-tree","git cat-file","git reflog","ps","top","htop","uptime","uname","hostname","whoami","id","env","printenv","echo","ping","nslookup","dig","host","ifconfig","ip","netstat","ss","npm list","npm ls","npm info","npm view","npm outdated","npm audit","pnpm list","pnpm ls","pnpm outdated","pip list","pip show","pip freeze","cargo tree","npm test","npm run test","npm run build","npm run lint","pnpm test","pnpm run test","pnpm run build","pnpm run lint","yarn test","yarn build","yarn lint","cargo test","cargo build","cargo check","cargo clippy","go test","go build","go vet","make","cmake","pytest","python -m pytest","python3 -m pytest","jest","vitest","mocha","tsc","tscnoEmit","eslint","prettier","oxlint"]),S$=[/\brm\s+-rf?\s+[/~]/,/\brm\s+-rf?\s+\.\.\//,/\bsudo\b/,/\bsu\s/,/\bchmod\s+777\b/,/\bmkfs\b/,/\bfdisk\b/,/\bdd\s+if=/,/\bsystemctl\s+(start|stop|restart|enable|disable)\b/,/\bservice\s+\S+\s+(start|stop|restart)\b/,/\breg\s+(add|delete)\b/i,/\\Windows\\System32/i,/\/etc\/(passwd|shadow|sudoers|fstab)/,/\bgit\s+push\s+.*--force\b/,/\bgit\s+push\s+-f\b/,/\bcurl\b.*(-H|--header)\s+.*[Aa]uthorization/,/\bwget\b.*--header.*[Aa]uthorization/,/\bcurl\b.*\|\s*(sh|bash|zsh)\b/,/\bwget\b.*-O\s*-\s*\|\s*(sh|bash|zsh)\b/,/\bnpm\s+install\s+-g\b/,/\bpip\s+install\b(?!.*-r\b)(?!.*requirements)/,/\bDROP\s+(DATABASE|TABLE|SCHEMA)\b/i,/\bTRUNCATE\s+TABLE\b/i],GS=new Set(["npm install","npm i","npm ci","pnpm install","pnpm i","yarn install","yarn","pip install -r","pip install -e","cargo build","cargo install","go mod download","go get","bundle install","composer install","git add","git commit","git stash","git checkout","git switch","git merge","git rebase","git cherry-pick","git pull","git fetch","docker build","docker compose","mkdir","touch","cp"]);function KS(t,e,r){let n=t.trim();if(!n)return{decision:"allow",reason:"empty command"};let o=xd(n)??Cd(n)??void 0;for(let l of S$)if(l.test(n))return{decision:"deny",reason:`matches dangerous pattern: ${l.source}`,destructiveWarning:o};for(let l of R$)if(n===l||n.startsWith(l+" "))return{decision:"allow",reason:`known safe command: ${l}`,destructiveWarning:o};let s=n.split(/\s+/),i=s[0],a=s.length>1?`${s[0]} ${s[1]}`:i;return WS.has(i)||WS.has(a)?{decision:"allow",reason:`known safe command: ${i}`,destructiveWarning:o}:e&&r&&e.startsWith(r)&&(GS.has(i)||GS.has(a))?{decision:"allow",reason:`safe in project: ${a}`,destructiveWarning:o}:{decision:"defer",reason:"unknown command \u2014 needs LLM classification",destructiveWarning:o}}function T$(t){let e=Object.keys(t).sort(),r={};for(let n of e){let o=t[n];typeof o=="string"?r[n]=o.replace(/\s+/g," ").trim():r[n]=o}return JSON.stringify(r)}function Qu(t,e){return`${t}::${T$(e)}`}var w$=500,ji=class{cache=new Map;get(e,r){let n=Qu(e,r),o=this.cache.get(n);if(o)return o.hitCount++,o}set(e,r,n){if(this.cache.size>=w$){let s=this.cache.keys().next().value;s!==void 0&&this.cache.delete(s)}let o=Qu(e,r);this.cache.set(o,{shouldBlock:n.shouldBlock,reason:n.reason,classifiedAt:Date.now(),hitCount:0})}has(e,r){return this.cache.has(Qu(e,r))}clear(){this.cache.clear()}get size(){return this.cache.size}get totalHits(){let e=0;for(let r of this.cache.values())e+=r.hitCount;return e}};var A$=new Set(["read","search","instructions","think","task","memory","skill","tool_search","plan_mode","lsp","brief","web_search","image_generate","video_generate","music_generate","tts","three_d_generate","checkpoint"]);function Po(t){return A$.has(t)}var zS=`You are a security classifier for an AI coding agent. Your job is to decide whether a tool invocation is safe to execute without user confirmation.
|
|
562
562
|
|
|
563
563
|
The agent operates in a workspace and has been given permission to use tools autonomously. You must decide if each tool call is SAFE (routine development work) or DANGEROUS (could cause harm, data loss, or unexpected side effects).
|
|
564
564
|
|
|
@@ -580,7 +580,7 @@ DANGEROUS operations (SHOULD be blocked):
|
|
|
580
580
|
- Running commands with sudo/admin privileges
|
|
581
581
|
- Downloading and executing unknown scripts
|
|
582
582
|
|
|
583
|
-
Respond ONLY with XML. No other text.`;async function Zu(t,e,r,n){let o=Date.now();if(
|
|
583
|
+
Respond ONLY with XML. No other text.`;async function Zu(t,e,r,n){let o=Date.now();if(Po(t))return{shouldBlock:!1,reason:"allowlisted safe tool",stage:"allowlist",durationMs:Date.now()-o};let s=P$(r),i=x$(t,e),a=`<transcript>
|
|
584
584
|
${s}
|
|
585
585
|
</transcript>
|
|
586
586
|
|
|
@@ -596,12 +596,12 @@ ${s}
|
|
|
596
596
|
${i}
|
|
597
597
|
</action>
|
|
598
598
|
|
|
599
|
-
The fast classifier flagged this action. Review carefullyis it actually dangerous, or is it safe development work? Consider the project context. Use <thinking> tags to reason, then respond with <block>yes</block> or <block>no</block> and <reason>explanation</reason>.`,u=await n({system:zS,messages:[{role:"user",content:p}],maxTokens:4096,temperature:0,cacheSystemPrompt:!0}),m=YS(u.text),f=VS(m),g=XS(m)??XS(l)??"classifier decision";return{shouldBlock:f!==!1,reason:g,stage:"thinking",durationMs:Date.now()-o}}catch{return{shouldBlock:!0,reason:"classifier unavailable",stage:"fast",durationMs:Date.now()-o}}}function
|
|
599
|
+
The fast classifier flagged this action. Review carefullyis it actually dangerous, or is it safe development work? Consider the project context. Use <thinking> tags to reason, then respond with <block>yes</block> or <block>no</block> and <reason>explanation</reason>.`,u=await n({system:zS,messages:[{role:"user",content:p}],maxTokens:4096,temperature:0,cacheSystemPrompt:!0}),m=YS(u.text),f=VS(m),g=XS(m)??XS(l)??"classifier decision";return{shouldBlock:f!==!1,reason:g,stage:"thinking",durationMs:Date.now()-o}}catch{return{shouldBlock:!0,reason:"classifier unavailable",stage:"fast",durationMs:Date.now()-o}}}function P$(t){return t.slice(-20).map(r=>{let n=r.role==="user"?"User":r.role==="assistant"?"Assistant":"System",o=typeof r.content=="string"?r.content.slice(0,500):JSON.stringify(r.content).slice(0,500);return`${n}: ${o}`}).join(`
|
|
600
600
|
`)}function x$(t,e){let r=JSON.stringify(e,null,0),n=r.length>2e3?r.slice(0,2e3)+"...":r;return`Tool: ${t}
|
|
601
601
|
Arguments: ${n}`}function VS(t){let e=t.match(/<block>(yes|no)<\/block>/i);return e?e[1].toLowerCase()==="yes":null}function XS(t){let e=t.match(/<reason>([\s\S]*?)(?:<\/reason>|$)/i);return e?e[1].trim():null}function YS(t){return t.replace(/<thinking>[\s\S]*?<\/thinking>/gi,"").trim()}var JS={maxConsecutive:3,maxTotal:20};function QS(){return{consecutiveDenials:0,totalDenials:0}}function ep(t){return{consecutiveDenials:t.consecutiveDenials+1,totalDenials:t.totalDenials+1}}function tp(t){return t.consecutiveDenials===0?t:{...t,consecutiveDenials:0}}function ZS(t){return t.consecutiveDenials>=JS.maxConsecutive||t.totalDenials>=JS.maxTotal}import*as _t from"node:fs";import*as xo from"node:path";var C$="audit",I$="denials.jsonl",E$=10*1024*1024,$i=class{filePath;writeQueue=Promise.resolve();constructor(e){let r=xo.join(e,".qlogicagent",C$);this.filePath=xo.join(r,I$)}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(_t.existsSync(r)||_t.mkdirSync(r,{recursive:!0}),_t.existsSync(this.filePath)&&_t.statSync(this.filePath).size>E$){let s=this.filePath+".1";_t.renameSync(this.filePath,s)}let n=JSON.stringify(e)+`
|
|
602
|
-
`;_t.appendFileSync(this.filePath,n,"utf-8")}catch{}}};function eT(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 M$=[{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 tT(){return M$.map(({ruleId:t,...e})=>({...e}))}var D$=12e4,Ui=class{ruleEngine;hookRegistry;onRequestApproval;onDenied;classifierLLMCall;getRecentMessages;permissionRole;pendingApprovals=new Map;auditLogger;sessionId;getTurnId;communityTelemetryRecorder;communitySandboxTurnIds=new Set;communitySandboxRuleEngine=new Tn({mode:"default",defaultBehavior:"allow",rules:tT()});unregisterHook=null;toolMetaCache=new Map;classifierCache=new ji;denialTracking=QS();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=L$(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:eT(s),cumulativeDenials:this.denialTracking.totalDenials,consecutiveDenials:this.denialTracking.consecutiveDenials}),N$(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,rp(e.decisionReason)),{action:"abort",reason:e.message});let s=j$(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,rp(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,rp(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=KS(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 O$(c)==="read"||Ao(n)?{action:"continue"}:this.handleWorkerAsk(r,n,o)}if(this.ruleEngine.getMode()==="auto"){if(Ao(n))return{action:"continue"};let c=ZS(this.denialTracking);if(this.classifierLLMCall&&!c)try{let l=this.getRecentMessages?.()??[],d=await Zu(n,o??{},l,this.classifierLLMCall);if(o&&this.classifierCache.set(n,o,{shouldBlock:d.shouldBlock,reason:d.reason}),!d.shouldBlock)return this.denialTracking=tp(this.denialTracking),{action:"continue",context:{decisionReason:{type:"classifier",classifier:"auto",reason:d.reason}}};this.denialTracking=ep(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=_$(),i={approvalId:s,callId:r,toolName:n,arguments:o,message:e.message};this.hookRegistry.invoke("approval.requested",{sessionId:"",turnId:"",approvalId:s,callId:r,toolName:n}).catch(()=>{});try{let a=await this.requestApproval(i);return this.hookRegistry.invoke("approval.responded",{sessionId:"",turnId:"",approvalId:s,callId:r,toolName:n,decision:a.decision}).catch(()=>{}),a.decision==="allow"?{action:"continue",context:a.updatedInput?{arguments:a.updatedInput}:void 0}:(this.fireDenied(r,n,`not executed by user choice (approval ${s})`,"user",o),{action:"abort",reason:`Tool "${n}" was not executed by user choice`})}catch{return this.fireDenied(r,n,`approval timeout or error (approval ${s})`,"timeout",o),{action:"abort",reason:`Tool "${n}" confirmation timed out`}}}async handleWorkerAsk(e,r,n){if(Ao(r))return{action:"continue"};if(this.classifierLLMCall)try{let o=this.getRecentMessages?.()??[],s=await Zu(r,n??{},o,this.classifierLLMCall);return n&&this.classifierCache.set(r,n,{shouldBlock:s.shouldBlock,reason:s.reason}),s.shouldBlock?(this.denialTracking=ep(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=tp(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"))},D$);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 N$(t){return t==="classifier"||t==="rule-engine"||t==="safety"||t==="static-deny"}function L$(t){return`${t}-deny`}function rp(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 O$(t){return t?.riskLevel?t.riskLevel:t?.isReadOnly?"read":t?.isDangerous?"system":"write"}function j$(t){return t.behavior==="ask"&&t.decisionReason?.type==="rule"&&t.decisionReason.rule.source==="community-sandbox"}function Co(t){return Oi(t)}function rT(t){return new Tn(Co(t))}function nT(t){return new Ui(t)}function oT(t,e){let r=Co(e);return t.setMode(r.mode),t.replaceRules(r.rules),t.setDefaultBehavior(r.defaultBehavior),r}import{randomUUID as $$}from"node:crypto";function sT(t){fb(async e=>{let r=`ask-${$$().slice(0,8)}`;return new Promise(n=>{t.pendingAskUser.set(r,{resolve:n}),t.sendNotification("turn.ask_user",{requestId:r,questions:e.map(o=>({header:o.header,question:o.question,options:o.options}))})})})}function Hi(t,e){return{name:t,compute:e,cacheBreak:!1}}function qt(t,e,r){return{name:t,compute:e,cacheBreak:!0}}var Fi=new Map;async function U$(t){return(await Promise.all(t.map(async r=>{if(!r.cacheBreak&&Fi.has(r.name))return Fi.get(r.name)??null;let n=await r.compute();return Fi.set(r.name,n),n}))).filter(r=>r!=null)}function iT(){Fi.clear()}async function Bi(t){let e=[];if(t.instructionBlock&&e.push(t.instructionBlock),t.customSystemPrompt?e.push(t.customSystemPrompt):t.basePrompt&&e.push(t.basePrompt),t.sections?.length){let r=await U$(t.sections);e.push(...r)}return t.appendSystemPrompt&&e.push(t.appendSystemPrompt),e.filter(Boolean).join(`
|
|
602
|
+
`;_t.appendFileSync(this.filePath,n,"utf-8")}catch{}}};function eT(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 M$=[{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 tT(){return M$.map(({ruleId:t,...e})=>({...e}))}var D$=12e4,Ui=class{ruleEngine;hookRegistry;onRequestApproval;onDenied;classifierLLMCall;getRecentMessages;permissionRole;pendingApprovals=new Map;auditLogger;sessionId;getTurnId;communityTelemetryRecorder;communitySandboxTurnIds=new Set;communitySandboxRuleEngine=new Tn({mode:"default",defaultBehavior:"allow",rules:tT()});unregisterHook=null;toolMetaCache=new Map;classifierCache=new ji;denialTracking=QS();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=L$(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:eT(s),cumulativeDenials:this.denialTracking.totalDenials,consecutiveDenials:this.denialTracking.consecutiveDenials}),N$(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,rp(e.decisionReason)),{action:"abort",reason:e.message});let s=j$(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,rp(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,rp(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=KS(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 O$(c)==="read"||Po(n)?{action:"continue"}:this.handleWorkerAsk(r,n,o)}if(this.ruleEngine.getMode()==="auto"){if(Po(n))return{action:"continue"};let c=ZS(this.denialTracking);if(this.classifierLLMCall&&!c)try{let l=this.getRecentMessages?.()??[],d=await Zu(n,o??{},l,this.classifierLLMCall);if(o&&this.classifierCache.set(n,o,{shouldBlock:d.shouldBlock,reason:d.reason}),!d.shouldBlock)return this.denialTracking=tp(this.denialTracking),{action:"continue",context:{decisionReason:{type:"classifier",classifier:"auto",reason:d.reason}}};this.denialTracking=ep(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=_$(),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 Zu(r,n??{},o,this.classifierLLMCall);return n&&this.classifierCache.set(r,n,{shouldBlock:s.shouldBlock,reason:s.reason}),s.shouldBlock?(this.denialTracking=ep(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=tp(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"))},D$);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 N$(t){return t==="classifier"||t==="rule-engine"||t==="safety"||t==="static-deny"}function L$(t){return`${t}-deny`}function rp(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 O$(t){return t?.riskLevel?t.riskLevel:t?.isReadOnly?"read":t?.isDangerous?"system":"write"}function j$(t){return t.behavior==="ask"&&t.decisionReason?.type==="rule"&&t.decisionReason.rule.source==="community-sandbox"}function Co(t){return Oi(t)}function rT(t){return new Tn(Co(t))}function nT(t){return new Ui(t)}function oT(t,e){let r=Co(e);return t.setMode(r.mode),t.replaceRules(r.rules),t.setDefaultBehavior(r.defaultBehavior),r}import{randomUUID as $$}from"node:crypto";function sT(t){fb(async e=>{let r=`ask-${$$().slice(0,8)}`;return new Promise(n=>{t.pendingAskUser.set(r,{resolve:n}),t.sendNotification("turn.ask_user",{requestId:r,questions:e.map(o=>({header:o.header,question:o.question,options:o.options}))})})})}function Hi(t,e){return{name:t,compute:e,cacheBreak:!1}}function qt(t,e,r){return{name:t,compute:e,cacheBreak:!0}}var Fi=new Map;async function U$(t){return(await Promise.all(t.map(async r=>{if(!r.cacheBreak&&Fi.has(r.name))return Fi.get(r.name)??null;let n=await r.compute();return Fi.set(r.name,n),n}))).filter(r=>r!=null)}function iT(){Fi.clear()}async function Bi(t){let e=[];if(t.instructionBlock&&e.push(t.instructionBlock),t.customSystemPrompt?e.push(t.customSystemPrompt):t.basePrompt&&e.push(t.basePrompt),t.sections?.length){let r=await U$(t.sections);e.push(...r)}return t.appendSystemPrompt&&e.push(t.appendSystemPrompt),e.filter(Boolean).join(`
|
|
603
603
|
|
|
604
|
-
`)}var F$=250;async function aT(t,e){let r=new AbortController;t.activeTurn&&(t.activeTurn.abort(),await H$(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(()=>{}),iT()),t.currentSessionId=e,t.sessionState=new fr(e),t.sessionTaskDomain=void 0,t.memoryPrefetchState=kt(),t.enableIdleDream()),{abortController:r,resolveTurnDone:n}}async function H$(t){let e;try{await Promise.race([t,new Promise(r=>{e=setTimeout(r,F$),e.unref?.()})])}finally{e&&clearTimeout(e)}}function np(t,e){t.activeTurn===e.abortController&&(t.activeTurn=null),e.resolveTurnDone()}import*as Io from"node:path";var B$=1800*1e3,lT=new hr;function dT(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=lT.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"&&q$(e,r);let o=W$(e,r,t.nowMs??Date.now()),s=G$(e,r);return{sessionProjectRoot:s,sessionProjectId:K$(e,s,n),projectHintStale:o.projectHintStale,staleProjectHintContext:o.staleProjectHintContext}}function q$(t,e){let r=t.groupKey,n=r.split(":"),o=n.length>=3?n.slice(1).join(":"):r,s=Ns(o);if(s){e.setActiveWorkdir(s.workspaceDir),ne()?.id!==s.id&&Ct(s.id);return}let i=t.groupName||o,a=o.replace(/[<>:"/\\|?*\x00-\x1f]/g,"_").trim()||"group",c=Io.join(I().getUserAgentHome(),"workspaces","groups",a),l=Ds({name:i,workspaceDir:c,type:"group",groupId:o});e.setActiveWorkdir(l.workspaceDir),Ct(l.id),e.sendNotification("project.created",{id:l.id,name:l.name,type:"group",groupId:o,workspaceDir:l.workspaceDir})}function W$(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>B$)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"&&(Ct(d.id),e.setActiveWorkdir(d.workspaceDir))}return{projectHintStale:!1}}function G$(t,e){if(typeof t?.workdir=="string"&&t.workdir)return t.workdir;let r=t?.projectId;if(r)try{return lT.getProjectWorkspaceDir(r)}catch{}return e.getActiveProjectRoot()}function K$(t,e,r){if(r){let i=Vt(r,e);if(i?.projectId)return i.projectId}let n=t?.projectId;if(n&&
|
|
604
|
+
`)}var F$=250;async function aT(t,e){let r=new AbortController;t.activeTurn&&(t.activeTurn.abort(),await H$(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(()=>{}),iT()),t.currentSessionId=e,t.sessionState=new fr(e),t.sessionTaskDomain=void 0,t.memoryPrefetchState=kt(),t.enableIdleDream()),{abortController:r,resolveTurnDone:n}}async function H$(t){let e;try{await Promise.race([t,new Promise(r=>{e=setTimeout(r,F$),e.unref?.()})])}finally{e&&clearTimeout(e)}}function np(t,e){t.activeTurn===e.abortController&&(t.activeTurn=null),e.resolveTurnDone()}import*as Io from"node:path";var B$=1800*1e3,lT=new hr;function dT(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=lT.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"&&q$(e,r);let o=W$(e,r,t.nowMs??Date.now()),s=G$(e,r);return{sessionProjectRoot:s,sessionProjectId:K$(e,s,n),projectHintStale:o.projectHintStale,staleProjectHintContext:o.staleProjectHintContext}}function q$(t,e){let r=t.groupKey,n=r.split(":"),o=n.length>=3?n.slice(1).join(":"):r,s=Ns(o);if(s){e.setActiveWorkdir(s.workspaceDir),ne()?.id!==s.id&&Ct(s.id);return}let i=t.groupName||o,a=o.replace(/[<>:"/\\|?*\x00-\x1f]/g,"_").trim()||"group",c=Io.join(I().getUserAgentHome(),"workspaces","groups",a),l=Ds({name:i,workspaceDir:c,type:"group",groupId:o});e.setActiveWorkdir(l.workspaceDir),Ct(l.id),e.sendNotification("project.created",{id:l.id,name:l.name,type:"group",groupId:o,workspaceDir:l.workspaceDir})}function W$(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>B$)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"&&(Ct(d.id),e.setActiveWorkdir(d.workspaceDir))}return{projectHintStale:!1}}function G$(t,e){if(typeof t?.workdir=="string"&&t.workdir)return t.workdir;let r=t?.projectId;if(r)try{return lT.getProjectWorkspaceDir(r)}catch{}return e.getActiveProjectRoot()}function K$(t,e,r){if(r){let i=Vt(r,e);if(i?.projectId)return i.projectId}let n=t?.projectId;if(n&&we(n))return n;let o=ne();return o&&cT(o.workspaceDir,e)?o.id:z().find(i=>cT(i.workspaceDir,e))?.id}function cT(t,e){return Io.resolve(t).toLowerCase()===Io.resolve(e).toLowerCase()}import{randomUUID as uT}from"node:crypto";function qi(t){let{event:e,turnId:r,now:n,host:o}=t;switch(e.type){case"delta":return o.sendNotification("turn.delta",{turnId:e.turnId,text:e.text,item:{id:`${r}-delta`,type:"message",role:"assistant",text:e.text,createdAt:n}}),!0;case"tool_call":return o.sendNotification("turn.tool_call",{turnId:e.turnId,callId:e.callId,name:e.name,arguments:e.arguments,...e.inputSummary?{inputSummary:e.inputSummary}:{},item:{id:e.callId,type:"tool_call",role:"assistant",toolName:e.name,toolCallId:e.callId,arguments:e.arguments,createdAt:n}}),!0;case"tool_result":return o.sendNotification("turn.tool_result",{turnId:e.turnId,callId:e.callId,name:e.name,ok:e.ok,...e.error?{error:e.error}:{},...e.outputPreview?{outputPreview:e.outputPreview}:{},...e.durationMs!==void 0?{durationMs:e.durationMs}:{},...e.exitCode!==void 0?{exitCode:e.exitCode}:{},...e.stdout?{stdout:e.stdout}:{},...e.stderr?{stderr:e.stderr}:{},...e.details?{details:e.details}:{},item:{id:`${e.callId}-result`,type:"tool_result",role:"assistant",toolName:e.name,toolCallId:e.callId,output:e.ok?e.outputPreview??"":e.error,approved:e.ok,createdAt:n}}),!0;case"tool_blocked":return o.sendNotification("turn.tool_blocked",{turnId:e.turnId,callId:e.callId,name:e.name,reason:e.reason,item:{id:`${e.callId}-blocked`,type:"tool_blocked",role:"system",toolName:e.name,toolCallId:e.callId,text:e.reason,approved:!1,createdAt:n}}),!0;case"recovery":return o.sendNotification("turn.recovery",{turnId:e.turnId,action:e.action,...e.detail?{detail:e.detail}:{},item:{id:`${r}-recovery-${uT().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-${uT().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 z$=`[SUGGESTION MODE]
|
|
605
605
|
Based on the conversation, suggest 1-3 short follow-up actions the user might naturally do next.
|
|
606
606
|
Be specific: "run the tests" beats "continue".
|
|
607
607
|
Stay silent if the next step isn't obvious.
|
|
@@ -620,7 +620,7 @@ Reply with ONLY a JSON array: [{"text":"short suggestion"}]. No explanation.`;as
|
|
|
620
620
|
`)):t.reason==="memory-mutation"?qt("fresh_workspace_evidence",()=>["# Memory File Action Required","","The latest user request explicitly asks to use the memory tool for a memory file action.",`Before answering, call the appropriate tool for this turn: ${e}.`,"Use the requested memory action and target filename instead of workspace file write/edit tools.","For removal requests, call memory with action='remove' and set old_text to the exact INDEX.md line or labeled marker line the user asked to remove.","Do not call action='add', action='remember', or action='create_file' for a removal request.","Do not merely describe the memory content or create a regular workspace file."].join(`
|
|
621
621
|
`)):t.reason==="media-generation"?qt("fresh_workspace_evidence",()=>["# Media Generation Required","","The latest user request asks you to create an image.",`Before answering, call the appropriate media tool for this turn: ${e}.`,"Do not answer by inventing a Markdown image URL or placeholder attachment path.","For ordinary creative requests, infer reasonable defaults for purpose, style, and size instead of asking follow-up questions.","Ask the user only when a missing detail is critical to the result or the request is genuinely ambiguous."].join(`
|
|
622
622
|
`)):qt("fresh_workspace_evidence",()=>["# Fresh Workspace Evidence","","The latest user request asks for current workspace, shell, or URL state.",`Before answering, call one of these tools for this turn: ${e}.`,"Do not answer this request from conversation history, memory, or prior tool results.","For an explicit filename, inspect that exact file first and report the observed value.","If the filename is not found at the given path, use search to locate it, then read the located file before answering.","A filename search alone is not enough to answer content or code-symbol questions."].join(`
|
|
623
|
-
`))}function RU(t){for(let e=t.length-1;e>=0;e--){let r=t[e];if(r?.role==="user")return SU(r.content)}return""}function SU(t){return typeof t=="string"?t:Array.isArray(t)?t.map(e=>{if(!e||typeof e!="object")return"";let r=e;return typeof r.text=="string"?r.text:""}).join(""):""}function TU(t){return t.function?.name??t.name??""}import{readFile as wU,readdir as
|
|
623
|
+
`))}function RU(t){for(let e=t.length-1;e>=0;e--){let r=t[e];if(r?.role==="user")return SU(r.content)}return""}function SU(t){return typeof t=="string"?t:Array.isArray(t)?t.map(e=>{if(!e||typeof e!="object")return"";let r=e;return typeof r.text=="string"?r.text:""}).join(""):""}function TU(t){return t.function?.name??t.name??""}import{readFile as wU,readdir as AU,stat as PU}from"node:fs/promises";import{dirname as Zi,extname as xU,isAbsolute as CU,join as _o,parse as TT,resolve as ST}from"node:path";import{homedir as IU}from"node:os";var EU="INSTRUCTIONS.md",MU="INSTRUCTIONS.local.md",_U=new Set([".md",".txt",".text",".json",".yaml",".yml",".toml",".xml",".csv",".html",".htm",".css",".scss",".sass",".less",".js",".ts",".tsx",".jsx",".mjs",".cjs",".mts",".cts",".py",".pyi",".pyw",".rb",".erb",".rake",".go",".rs",".java",".kt",".kts",".scala",".c",".cpp",".cc",".cxx",".h",".hpp",".hxx",".cs",".swift",".sh",".bash",".zsh",".fish",".ps1",".bat",".cmd",".env",".ini",".cfg",".conf",".config",".properties",".sql",".graphql",".gql",".proto",".vue",".svelte",".astro",".php",".pl",".pm",".lua",".r",".R",".dart",".ex",".exs",".erl",".hrl",".clj",".cljs",".cljc",".edn",".hs",".lhs",".elm",".ml",".mli",".f",".f90",".f95",".for",".cmake",".make",".makefile",".gradle",".sbt",".rst",".adoc",".asciidoc",".org",".tex",".latex",".lock",".log",".diff",".patch"]);async function DU(t){try{return await wU(t,"utf-8")}catch{return null}}function NU(t){return t.includes("<!--")?t.replace(/^[ \t]*<!--[\s\S]*?-->[ \t]*$/gm,""):t}function LU(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?/);if(!e)return{content:t};let r=e[1],n=t.slice(e[0].length),o=r.match(/^paths:\s*(.+)$/m);if(!o)return{content:n};let s=[],i=o[1].trim();if(i.startsWith("["))try{s=JSON.parse(i)}catch{}else s=i.split(",").map(c=>c.trim()).filter(Boolean);let a=s.map(c=>c.endsWith("/**")?c.slice(0,-3):c).filter(c=>c.length>0&&c!=="**");return{content:n,globs:a.length>0?a:void 0}}function OU(t,e){let r=new Set,n=/(?:^|\s)@((?:[^\s\\]|\\ )+)/g,s=t.replace(/```[\s\S]*?```/g,"").replace(/`[^`]+`/g,""),i;for(;(i=n.exec(s))!==null;){let a=i[1];if(!a)continue;let c=a.indexOf("#");if(c!==-1&&(a=a.substring(0,c)),!a)continue;a=a.replace(/\\ /g," ");let l;if(a.startsWith("~/"))l=_o(IU(),a.slice(2));else if(CU(a))l=a;else if(a.startsWith("./"))l=ST(Zi(e),a);else if(/^[a-zA-Z0-9._-]/.test(a)&&!a.startsWith("@"))l=ST(Zi(e),a);else continue;r.add(l)}return[...r]}async function Mo(t,e,r,n=0,o){let s=t.toLowerCase();if(r.has(s)||n>=fc)return[];let i=xU(t).toLowerCase();if(i&&!_U.has(i))return[];r.add(s);let a=await DU(t);if(!a?.trim())return[];let{content:c,globs:l}=LU(a),d=NU(c);if(!d.trim())return[];let p=[],u={path:t,type:e,content:d.trim()};o&&(u.parent=o),l&&(u.globs=l),p.push(u);let m=OU(c,t);for(let f of m){let g=await Mo(f,e,r,n+1,t);p.push(...g)}return p}async function wT(t,e,r,n,o=new Set){if(o.has(t))return[];o.add(t);let s=[];try{let i=await AU(t,{withFileTypes:!0});for(let a of i){let c=_o(t,a.name);if(a.isDirectory())s.push(...await wT(c,e,r,n,o));else if(a.isFile()&&a.name.endsWith(".md")){let l=await Mo(c,e,r);s.push(...l.filter(d=>n?!!d.globs:!d.globs))}}}catch{}return s}async function jU(t){let e=t,r=TT(e).root;for(;e!==r;){try{let n=_o(e,".git"),o=await PU(n);if(o.isDirectory()||o.isFile())return e}catch{}e=Zi(e)}return null}async function $U(t,e){let r=[],n=new Set,s=await jU(t)??TT(t).root,i=[],a=t;for(;i.push(a),!(a===s&&a!==t);){let c=Zi(a);if(c===a)break;a=c}for(let c of i.reverse())r.push(...await Mo(_o(c,EU),"Project",n)),r.push(...await Mo(I().getProjectInstructionsPath(c),"Project",n)),r.push(...await wT(I().getProjectRulesDir(c),"Project",n,!1)),r.push(...await Mo(_o(c,MU),"Local",n));return e&&r.length>0&&e.invoke("instructions.loaded",{sessionId:"",source:t,fileCount:r.length}).catch(()=>{}),r}function ea(t){if(t.length===0)return"";let e="Codebase and user instructions are shown below. Be sure to adhere to these instructions. IMPORTANT: These instructions OVERRIDE any default behavior and you MUST follow them exactly as written.",r=[],n=ap(t);n.length>0&&r.push(["## Active literal response requirements","The current instruction files contain hard requirements for exact response markers.","When responding, reproduce these literals exactly and do not omit them for brevity:",...n.map(o=>`- ${o.placement}: "${o.marker}"`)].join(`
|
|
624
624
|
`));for(let o of t){if(!o.content)continue;let s=o.type==="Project"?" (project instructions, checked into the codebase)":o.type==="Local"?" (user's private project instructions, not checked in)":" (user's private global instructions for all projects)";r.push(`Contents of ${o.path}${s}:
|
|
625
625
|
|
|
626
626
|
${o.content.trim()}`)}return r.length>0?`${e}
|
|
@@ -629,9 +629,9 @@ ${r.join(`
|
|
|
629
629
|
|
|
630
630
|
`)}`:""}function ap(t){let e=new Map;for(let r of t){let n=r.content,o=/["'“”‘’]([^"'“”‘’\r\n]{2,100})["'“”‘’]/g,s;for(;(s=o.exec(n))!==null;){let i=s[1]?.trim();if(!i||!BU(i))continue;let a=UU(n,s.index,o.lastIndex);FU(a)&&e.set(i,{marker:i,placement:HU(a)})}}return[...e.values()]}function UU(t,e,r){let n=[`
|
|
631
631
|
`,".","\u3002",";","\uFF1B"].map(a=>t.lastIndexOf(a,e)),o=Math.max(-1,...n)+1,s=[`
|
|
632
|
-
`,".","\u3002",";","\uFF1B"].map(a=>t.indexOf(a,r)).filter(a=>a>=0),i=s.length>0?Math.min(...s):t.length;return t.slice(o,i)}function
|
|
633
|
-
${n.marker}`:n.marker));return r}function FU(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 HU(t){let e=t.toLowerCase(),r=Qi(e,["start with","begin with"])+Qi(t,["\u5F00\u5934","\u5FC5\u987B\u4EE5"]),n=Qi(e,["end with","append","at the end"])+Qi(t,["\u672B\u5C3E","\u7ED3\u5C3E","\u7ED3\u675F\u6807\u8BB0"]);return r>=0||n>=0?r>n?"prefix":"suffix":"include"}function Qi(t,e){let r=-1;for(let n of e){let o=t.lastIndexOf(n);o>r&&(r=o)}return r}function BU(t){let e=t.trim();return e.length<2||e.length>100||/https?:\/\//i.test(e)?!1:/[A-Z0-9_\-[\]—-]/.test(e)}function qU(t){return/[A-Z\[\]—-]/.test(t)}async function ta(t,e){return $U(t,e)}function
|
|
634
|
-
`):null},"memory INDEX.md may change between turns")]}),H=[...s].reverse().find(A=>A.role==="user");H&&Ic(o,H,l,r).catch(()=>{}),await this.mcpReady;let Ie=(this.toolCatalog??tr()).getToolManifest(),Gt=new Set(Ie.map(A=>A.function.name)),Ee=Yi([...Ie,...i.filter(A=>!Gt.has(A.function.name))],de);zU(this.permissionChecker,Ee);let st=BS(s,T);if(S&&T){let A=qS({id:S.id,name:S.name,source:S.source,context:S.context,enabledSkills:S.enabledSkills,disabledBuiltinSkills:S.disabledBuiltinSkills});Fe(o,{projectId:d,assistant:A},l).catch(()=>{}),this.sendNotification("session.info",{sessionId:o,projectId:d,assistant:A})}if(p&&s.length>0){let A=u?.activeProjectName,W=u?.projectNames.join(", ")??"";st=[{role:"system",content:`[\u6CE8\u610F\uFF1A\u7528\u6237\u4ECE IM \u7AEF\u53D1\u6765\u6D88\u606F\uFF0C\u4F46\u684C\u9762\u7AEF\u5DF2\u8D85\u8FC730\u5206\u949F\u672A\u6D3B\u8DC3\uFF0C\u65E0\u6CD5\u786E\u5B9A\u7528\u6237\u60F3\u5728\u54EA\u4E2A\u9879\u76EE\u4E2D\u5DE5\u4F5C\u3002\u5F53\u524D\u6D3B\u8DC3\u9879\u76EE\uFF1A${A??"\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 A=s[s.length-1],W=A?.role==="user"&&typeof A.content=="string"?A.content:"";if(KU(W)){let V={role:"system",content:"[\u4EE5\u4E0B\u662F\u7528\u6237\u5728\u684C\u9762\u7AEF\u7684\u8FD1\u671F\u5BF9\u8BDD\uFF0C\u4F9B\u4F60\u53C2\u8003\u4EE5\u4FDD\u6301\u4E0A\u4E0B\u6587\u8FDE\u8D2F]"},it={role:"system",content:"[\u684C\u9762\u5BF9\u8BDD\u4E0A\u4E0B\u6587\u7ED3\u675F\uFF0C\u4EE5\u4E0B\u662F\u5F53\u524D IM \u7AEF\u7684\u5BF9\u8BDD]"};st=[V,...se,it,...st],this.log(`[continuation] injected ${se.length} desktop messages as reference`)}}if(!Vt(o,l)?.title){let A=typeof H?.content=="string"?H.content:Array.isArray(H?.content)?H.content.filter(W=>W.type==="text").map(W=>W.text??"").join(""):"";if(A.trim()){let W=null,V=this.resolveClientForPurpose("smallModel");V&&(W=await ym(A,{transport:V.transport,apiKey:V.apiKey,model:V.model})),W||(W=A.trim().slice(0,20)+(A.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 A of b.run({turnId:r,sessionId:o,messages:st,tools:Ee,systemPrompt:J,config:h},f.signal)){let W=new Date().toISOString();if(qi({event:A,turnId:r,now:W,host:this})){A.type==="tool_call"&&this.sessionState?.recordToolCall();continue}switch(A.type){case"start":break;case"end":{let V=PT(A.content,E);if(this.sendNotification("turn.end",{turnId:A.turnId,content:V,usage:A.usage,model:A.model,provider:A.provider,item:{id:`${r}-end`,type:"message",role:"assistant",text:V,createdAt:W}}),A.usage&&this.sessionState){this.sessionState.addUsage(A.usage,A.model??this.currentModel);let it=this.sessionState.createSnapshot();this.sendNotification("turn.usage_update",{turnId:A.turnId,usage:A.usage,model:A.model??this.currentModel,sessionCostUSD:it.totalInputTokens*3e-6+it.totalOutputTokens*15e-6})}V&&(this.lastAssistantMessageForExtract=V,Ic(o,{role:"assistant",content:V},l,r).catch(()=>{}));break}case"error":if(this.sendNotification("turn.error",{turnId:A.turnId,error:{message:A.error,code:A.code}}),A.usage&&this.sessionState){this.sessionState.addUsage(A.usage,this.currentModel);let V=this.sessionState.createSnapshot();this.sendNotification("turn.usage_update",{turnId:A.turnId,usage:A.usage,model:this.currentModel,sessionCostUSD:V.totalInputTokens*3e-6+V.totalOutputTokens*15e-6})}break;case"skill_instruction":this.sendNotification("turn.skill_instruction",{turnId:A.turnId,instruction:A.instruction}),Th({instruction:A.instruction,eventTurnId:A.turnId,projectRoot:l,host:this});break}}if(this.log(`turn ${r} completed`),this.sessionState?.recordTurnCompleted(),this.sessionState){hm(o,this.sessionState.createSnapshot(),{model:this.currentModel,cwd:l,projectId:d,messageCount:s.length},l).catch(()=>{});let A=this.sessionState.createSnapshot();this.sendNotification("session.info",{sessionId:o,model:this.currentModel||void 0,cwd:l,turnCount:A.turnCount,projectId:d});let W=this.resolveClientForPurpose("smallModel");if(W&&vm(o,{sessionId:o,projectId:d??"",createdAt:"",lastActiveAt:"",turnCount:A.turnCount,messageCount:s.length},s,{transport:W.transport,apiKey:W.apiKey,model:W.model},l),pT({turnId:r,messages:s,client:this.resolveClientForPurpose("textGeneration"),sendNotification:(V,it)=>this.sendNotification(V,it)}),this.petRuntime.awardXp("turn.end"),this.petRuntime.reactAfterTurn(s),a?.sessionType==="group"&&this.sessionState){let V=this.sessionState.createSnapshot(),it=Vt(o,l);it&&ER({...it,turnCount:V.turnCount},l).then(Mn=>{Mn.split&&this.sendNotification("session-update",{sessionId:Mn.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{np(this,m)}}function Ye(t){return ra(t)}function vt(t){return ra(t)}function Wt(t){return ra(t)}function yr(t){return ra(t)}function ra(t){return t.multiAgentHandlerHost??t}function MT(t){return new Map([["initialize",e=>Db.call(t,e)],["agent.ping",e=>Nb.call(t,e)],["agent.health",e=>Lb.call(t,e)],["agent.metrics",e=>Ob.call(t,e)],["agent.cancel",e=>jb.call(t,e)],["thread.turn",e=>ET.call(t,e)],["memory.dream",e=>an.call(t,e)],["agent.abort",e=>xT.call(t,e)],["assistants.list",e=>ql.call(t,e)],["assistants.resolve",e=>Wl.call(t,e)],["assistants.cloneBuiltin",e=>Gl.call(t,e)],["assistants.upsert",e=>Kl.call(t,e)],["assistants.create",e=>zl.call(t,e)],["assistants.update",e=>Vl.call(t,e)],["assistants.delete",e=>Yl.call(t,e)],["assistants.setState",e=>Xl.call(t,e)],["tool.approval.response",e=>CT.call(t,e)],["thread.user_response",e=>IT.call(t,e)],["thread.list",e=>NR.call(t,e)],["session.resume",e=>WR.call(t,e)],["thread.create",e=>DR.call(t,e)],["session.getInfo",e=>GR.call(t,e)],["session.create",e=>LR.call(t,e)],["session.resolve",e=>OR.call(t,e)],["session.list",e=>jR.call(t,e)],["session.get",e=>$R.call(t,e)],["session.getMessages",e=>UR.call(t,e)],["session.update",e=>FR.call(t,e)],["session.delete",e=>HR.call(t,e)],["session.deleteAll",e=>BR.call(t,e)],["session.archive",e=>qR.call(t,e)],["memory.list",e=>dk.call(t,e)],["memory.atlas",e=>uk.call(t,e)],["memory.activity",e=>pk.call(t,e)],["memory.observe",e=>mk.call(t,e)],["memory.propose",e=>gk.call(t,e)],["memory.consolidate",e=>fk.call(t,e)],["memory.read",e=>hk.call(t,e)],["memory.write",e=>yk.call(t,e)],["memory.search",e=>vk.call(t,e)],["memory.delete",e=>bk.call(t,e)],["memory.update",e=>kk.call(t,e)],["tools.list",e=>Rb.call(t,e)],["media.listModels",e=>Zb.call(t,e)],["media.cancel",e=>ek.call(t,e)],["media.status",e=>tk.call(t,e)],["media.stt",e=>rk.call(t,e)],["settings.listProviders",e=>tS.call(t,e)],["settings.addKey",e=>rS.call(t,e)],["settings.removeKey",e=>nS.call(t,e)],["settings.getKey",e=>oS.call(t,e)],["settings.toggleKey",e=>sS.call(t,e)],["settings.toggleModel",e=>iS.call(t,e)],["settings.listModels",e=>aS.call(t,e)],["settings.setActiveModel",e=>cS.call(t,e)],["settings.getActiveModel",e=>lS.call(t,e)],["settings.getOverview",e=>dS.call(t,e)],["settings.refreshModels",e=>uS.call(t,e)],["settings.validateKey",e=>pS.call(t,e)],["assistants.list",e=>ql.call(t,e)],["assistants.resolve",e=>Wl.call(t,e)],["assistants.cloneBuiltin",e=>Gl.call(t,e)],["assistants.upsert",e=>Kl.call(t,e)],["assistants.create",e=>zl.call(t,e)],["assistants.update",e=>Vl.call(t,e)],["assistants.delete",e=>Yl.call(t,e)],["assistants.setState",e=>Xl.call(t,e)],["provider.list",e=>Sb.call(t,e)],["config.get",e=>Tb.call(t,e)],["config.update",e=>Pb.call(t,e)],["config.tunables",e=>xb.call(t,e)],["config.updateTunable",e=>Cb.call(t,e)],["community.getConsent",e=>_h.call(t,e)],["community.setConsent",e=>Dh.call(t,e)],["community.matchRegistry",e=>Lh.call(t,e)],["community.listShared",e=>Nh.call(t,e)],["community.withdrawShared",e=>qh.call(t,e)],["community.withdrawAllShared",e=>Wh.call(t,e)],["community.listNotices",e=>Gh.call(t,e)],["community.markNoticeRead",e=>Kh.call(t,e)],["community.listPublishAudit",e=>Bh.call(t,e)],["community.resolveInstall",e=>Oh.call(t,e)],["community.installResource",e=>jh.call(t,e)],["community.publishSkill",e=>$h.call(t,e)],["community.publishPet",e=>Uh.call(t,e)],["community.recordSignal",e=>Fh.call(t,e)],["community.recordTelemetry",e=>Hh.call(t,e)],["todos.list",e=>Ib.call(t,e)],["tasks.list",e=>Eb.call(t,e)],["tasks.cancel",e=>Mb.call(t,e)],["agents.scan",e=>uf.call(Ye(t),e)],["agents.list",e=>pf.call(Ye(t),e)],["agents.prompt",e=>wf.call(Ye(t),e)],["agents.config",e=>mf.call(Ye(t),e)],["agents.setConfig",e=>gf.call(Ye(t),e)],["agents.getConfig",e=>ff.call(Ye(t),e)],["agents.removeConfig",e=>hf.call(Ye(t),e)],["agents.setGateway",e=>yf.call(Ye(t),e)],["agents.getGateway",e=>vf.call(Ye(t),e)],["agents.processes",e=>kf.call(Ye(t),e)],["agents.kill",e=>Rf.call(Ye(t),e)],["agents.listConfigured",e=>bf.call(Ye(t),e)],["agents.getLog",e=>Sf.call(Ye(t),e)],["agents.testConnection",e=>Tf.call(Ye(t),e)],["solo.start",e=>NS.call(yr(t),e)],["solo.status",e=>LS.call(yr(t),e)],["solo.cancel",e=>OS.call(yr(t),e)],["solo.select",e=>jS.call(yr(t),e)],["solo.list",e=>$S.call(yr(t),e)],["solo.delete",e=>US.call(yr(t),e)],["solo.message",e=>FS.call(yr(t),e)],["solo.evaluate",e=>HS.call(yr(t),e)],["product.plan",e=>Bk.call(vt(t),e)],["product.confirm",e=>qk.call(vt(t),e)],["product.message",e=>Wk.call(vt(t),e)],["product.create",e=>Gk.call(vt(t),e)],["product.resume",e=>Kk.call(vt(t),e)],["product.pause",e=>zk.call(vt(t),e)],["product.checkpoint",e=>Vk.call(vt(t),e)],["product.status",e=>Xk.call(vt(t),e)],["product.list",e=>Yk.call(vt(t),e)],["product.delete",e=>Jk.call(vt(t),e)],["product.cancel",e=>Qk.call(vt(t),e)],["product.rollback",e=>Zk.call(vt(t),e)],["workflow.create",e=>iR.call(Wt(t),e)],["workflow.get",e=>aR.call(Wt(t),e)],["workflow.describe",e=>cR.call(Wt(t),e)],["workflow.patch",e=>lR.call(Wt(t),e)],["workflow.run",e=>dR.call(Wt(t),e)],["workflow.setActive",e=>uR.call(Wt(t),e)],["workflow.list",e=>pR.call(Wt(t),e)],["workflow.delete",e=>mR.call(Wt(t),e)],["workflow.onImMessage",e=>gR.call(Wt(t),e)],["workflow.onWebhook",e=>fR.call(Wt(t),e)],["project.create",e=>vR.call(t,e)],["project.list",e=>bR.call(t,e)],["project.delete",e=>kR.call(t,e)],["project.purgeAll",e=>RR.call(t,e)],["project.rename",e=>SR.call(t,e)],["project.archive",e=>TR.call(t,e)],["project.unarchive",e=>wR.call(t,e)],["project.update",e=>AR.call(t,e)],["project.archiveByGroup",e=>PR.call(t,e)],["session.switchProject",e=>KR.call(t,e)],["session.focus",e=>VR.call(t,e)],["session.moveToProject",e=>XR.call(t,e)],["session.getState",e=>zR.call(t,e)],["files.list",e=>Fb.call(t,e)],["files.create",e=>Hb.call(t,e)],["files.rename",e=>Bb.call(t,e)],["files.delete",e=>qb.call(t,e)],["files.gitStatus",e=>Wb.call(t,e)],["instructions.list",e=>Gb.call(t,e)],["instructions.read",e=>Kb.call(t,e)],["instructions.write",e=>zb.call(t,e)],["instructions.delete",e=>Vb.call(t,e)],["plans.list",e=>Xb.call(t,e)],["skills.list",e=>bS.call(t,e)],["skills.activate",e=>kS.call(t,e)],["skills.deactivate",e=>RS.call(t,e)],["skills.delete",e=>SS.call(t,e)],["skills.promote",e=>TS.call(t,e)],["skills.stats",e=>wS.call(t,e)],["skills.pin",e=>PS.call(t,e)],["skills.unpin",e=>AS.call(t,e)],["skills.curator",e=>xS.call(t,e)],["skills.lifecycle",e=>CS.call(t,e)],["pet.hatch",e=>Ak.call(t,e)],["pet.interact",e=>xk.call(t,e)],["pet.status",e=>Ck.call(t,e)],["pet.forge",e=>Ik.call(t,e)],["pet.confirm_response",e=>Rk.call(t,e)]])}import{randomUUID as _T}from"node:crypto";import*as cp from"node:path";G();async function DT(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-${_T().slice(0,8)}`,method:"memory.dream",params:{turnId:`dream-${_T().slice(0,8)}`,sessionId:e.sessionId||t.currentSessionId,config:{memoryRoot:e.config?.memoryRoot||t.resolveMemoryRoot?.()||cp.join(n,"memory"),transcriptDir:e.config?.transcriptDir||t.resolveTranscriptDir?.()||cp.join(n,"agent-logs"),model:r.model,apiKey:r.apiKey,...e.config}}};return await an.call(t,o),{ok:!0,summary:"Dream consolidation triggered"}}async function NT(t,e){t.log("[acp] x/solo.start");let r=Xe.call(t),n=await r.start(e);return r.getStatus(n)}async function LT(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 OT(t,e){return t.log("[acp] x/solo.select"),{ok:!0,mergedBranch:await Xe.call(t).select(e)}}async function jT(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 $T(t,e){return t.log("[acp] x/solo.subscribe"),{ok:!0,soloId:e.soloId}}async function UT(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 FT(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 HT(t){return t.log("[acp] x/agents.list"),ml()}async function BT(t,e){return t.log("[acp] x/product.create"),{productId:await ke.call(t).create(e)}}async function qT(t,e){return t.log("[acp] x/product.plan"),Fr.call(t).plan(e)}async function WT(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 GT(t,e){t.log("[acp] x/product.message");let r=Fr.call(t),n=e;return r.message(n.productId,n.content)}async function KT(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 zT(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 VT(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 XT(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 YT(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 JT(t,e){return t.log("[acp] x/product.subscribe"),{ok:!0,productId:e.productId}}async function QT(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=Xn(r);if(!s)throw new Error(`Unknown agent type: ${r}`);let i=t.resolveClientForPurpose("textGeneration");if(!i)throw new Error("No LLM provider configured; send a prompt first to configure the model");if(t.log(`[acp] x/team.delegate: agent=${r}, maxTurns=${o??s.maxTurns}`),ht.isTeamBudgetExceeded())return{ok:!1,agentType:r,output:void 0,error:ht.teamBudgetExceededError(),tokensUsed:0};let a={invoke:async()=>({result:"Tool execution not available in delegated mode"})},c={info:u=>t.log(`[delegate:${r}] ${u}`),warn:u=>t.log(`[delegate:${r}] WARN: ${u}`),error:u=>t.log(`[delegate:${r}] ERROR: ${u}`),debug:u=>t.log(`[delegate:${r}] ${u}`)},l=await Qr({promptMessages:[{role:"user",content:n}],tools:[],transport:i.transport,toolInvoker:a,createAgentRunner:sn,apiKey:i.apiKey,model:i.model,log:c,forkLabel:`team-delegate-${r}`,maxTurns:o??s.maxTurns,parentSignal:t.activeTurn?.signal,parentDepth:0}),d=l.events.filter(u=>u.type==="end"&&"content"in u).map(u=>u.content??"").join("")||l.events.filter(u=>u.type==="delta"&&"text"in u).map(u=>u.text).join(""),p=l.totalUsage.inputTokens+l.totalUsage.outputTokens;return ht.recordForkTokens(p),{ok:l.ok,agentType:r,output:d||void 0,error:l.error,tokensUsed:p}}import{randomUUID as ZT}from"node:crypto";async function ew(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 tw(t,e){let r=e.sessionId??ZT();return t.log(`[acp] session/new: id=${r}`),t.currentSessionId=r,t.sessionState=new fr(r),t.sessionTaskDomain=void 0,t.memoryPrefetchState=kt(),e.cwd&&typeof e.cwd=="string"&&t.setActiveWorkdir(e.cwd),t.enableIdleDream(),{sessionId:r}}async function rw(t,e){let r=ZT(),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 XU(t,r,n,[...s]);return i.content&&t.sessionHistory.appendAcpAssistantMessage(n,i.content),i}async function XU(t,e,r,n){let o=new AbortController;t.activeTurn=o,t.sendNotification("turn.start",{turnId:e,model:t.currentModel||void 0});try{let s={model:t.currentModel||void 0,provider:t.currentProvider||void 0,apiKey:t.currentApiKey||void 0,baseUrl:t.currentBaseUrl||void 0},i=Xi(n);i.requiresFreshTool&&(s.toolChoice="required");let a=t.resolveAgent(s);if(!a)return t.sendNotification("turn.delta",{turnId:e,text:"Error: No LLM provider configured. Configure via ~/.qlogicagent/settings.json or pass provider/apiKey in session config.",item:{id:`${e}-err`,type:"message",role:"assistant",text:"",createdAt:new Date().toISOString()}}),t.sendNotification("turn.end",{turnId:e,content:"",item:{id:`${e}-end`,type:"message",role:"assistant",text:"",createdAt:new Date().toISOString()}}),t.activeTurn=null,{stopReason:"end_turn"};await t.mcpReady;let c=Yi((t.toolCatalog??tr()).getToolManifest(),i),l=t.getActiveProjectRoot(),d=await ta(l,t.currentHooks??void 0),p=d.length>0?ea(d):void 0,u=Ji(i),m=await Bi({instructionBlock:p,sections:[Ki(l),Vi(),zi(),...u?[u]:[]]}),f,g="end_turn",h="";for await(let b of a.run({turnId:e,sessionId:r,messages:n,tools:c,systemPrompt:m,config:s},o.signal)){let v=new Date().toISOString();if(!qi({event:b,turnId:e,now:v,host:t}))switch(b.type){case"start":break;case"end":b.usage&&(f={inputTokens:b.usage.inputTokens??0,outputTokens:b.usage.outputTokens??0,cacheReadTokens:b.usage.cacheRead,cacheWriteTokens:b.usage.cacheWrite}),h=b.content??"",t.sendNotification("turn.end",{turnId:b.turnId,content:b.content,usage:b.usage,model:b.model,provider:b.provider,item:{id:`${e}-end`,type:"message",role:"assistant",text:b.content,createdAt:v}});break;case"error":g="end_turn",t.sendNotification("turn.error",{turnId:b.turnId,error:{message:b.error,code:b.code}});break}}return t.activeTurn=null,{stopReason:g,usage:f,content:h}}catch(s){t.activeTurn=null;let i=s instanceof Error?s.message:String(s);return t.log(`[acp] runAcpTurn error: ${i}`),t.sendNotification("turn.error",{turnId:e,error:{message:i,code:"INTERNAL_ERROR"}}),{stopReason:"end_turn"}}}async function nw(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 ow(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 sw(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 iw(t,e,r){t.log(`[acp] session/set_mode: ${r}`)}function aw(t,e,r=t){return{handleAcpInitialize:n=>ew(t,n,e),handleAcpSessionNew:n=>tw(t,n),handleAcpSessionPrompt:n=>rw(t,n),handleAcpSessionEnd:n=>nw(t,n),handleAcpSessionSetConfig:n=>ow(t,n),handleAcpSessionSetModel:(n,o)=>sw(t,n,o),handleAcpSessionSetMode:(n,o)=>iw(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=>DT(r,n),handleAcpAgentsList:()=>HT(r),handleAcpSoloStart:n=>NT(r,n),handleAcpSoloStatus:n=>LT(r,n),handleAcpSoloSelect:n=>OT(r,n),handleAcpSoloCancel:n=>jT(r,n),handleAcpSoloSubscribe:n=>$T(r,n),handleAcpSoloMessage:n=>UT(r,n),handleAcpSoloEvaluate:n=>FT(r,n),handleAcpProductCreate:n=>BT(r,n),handleAcpProductPlan:n=>qT(r,n),handleAcpProductConfirm:n=>WT(r,n),handleAcpProductMessage:n=>GT(r,n),handleAcpProductPause:n=>VT(r,n),handleAcpProductResume:n=>KT(r,n),handleAcpProductCancel:n=>XT(r,n),handleAcpProductRollback:n=>YT(r,n),handleAcpProductStatus:n=>zT(r,n),handleAcpProductSubscribe:n=>JT(r,n),handleAcpTeamDelegate:n=>QT(r,n)}}var na=class{currentHooks=null;mcpManager=null;mcpReady=Promise.resolve();pluginLoader=null;permissionChecker=null;permissionUnregister=null;fileWatcher=null;memoryProvider=null;memoryDreamProvider=null;memoryUserId="";getPluginSkills(){return this.pluginLoader?.getPluginSkills()??[]}applyBootstrap(e){this.currentHooks=e.hooks,this.memoryProvider=e.memoryHandlerProvider,this.memoryDreamProvider=e.memoryDreamProvider,this.memoryUserId=e.memoryUserId,this.permissionChecker=e.permissionChecker,this.permissionUnregister=e.permissionUnregister}resetAfterSessionDispose(){this.currentHooks=null,this.memoryProvider=null,this.memoryDreamProvider=null}stopFileWatcher(){this.fileWatcher&&(this.fileWatcher.stop(),this.fileWatcher=null)}async disconnectMcp(){if(!this.mcpManager)return;let e=this.mcpManager;this.mcpManager=null,await e.disconnectAll()}unregisterPermissions(){this.permissionUnregister&&(this.permissionUnregister(),this.permissionUnregister=null)}resetMemoryProviders(){this.memoryProvider=null,this.memoryDreamProvider=null}};G();import{join as lw}from"node:path";import{chmod as JU}from"node:fs/promises";var dw="agent-configs.json";function cw(){return lw(B(),dw)}function QU(t){return lw(De(t),dw)}function ZU(){return{agents:{}}}var oa=class{data=ZU();cwd;constructor(e){this.cwd=e}async load(){let e=await Zt(cw()),r=this.cwd?await Zt(QU(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=cw();await mr(e,this.data);try{await JU(e,384)}catch{}}};var sa=class{constructor(e){this.deps=e}deps;store=null;get currentStore(){return this.store}async ensureStore(){return this.store||(this.store=new oa(this.deps.getActiveProjectRoot()),await this.store.load(),this.deps.acpDetector.setConfigStore(this.store.getData())),this.store}};function uw(t){return new sa(t)}var ia=class{soloEvaluator=null;productOrchestrator=null;productPlanner=null;soloProcessManager=null;productProcessManager=null};function pw(t){let e=t.acpDetector??new Ss,r=new ia,o=(t.createAgentConfigRuntime??uw)({acpDetector:e,getActiveProjectRoot:t.getActiveProjectRoot});return{acpDetector:e,get agentConfigStore(){return o.currentStore},ensureAgentConfigStore:()=>o.ensureStore(),get soloEvaluator(){return r.soloEvaluator},set soloEvaluator(s){r.soloEvaluator=s},get productOrchestrator(){return r.productOrchestrator},set productOrchestrator(s){r.productOrchestrator=s},get productPlanner(){return r.productPlanner},set productPlanner(s){r.productPlanner=s},get soloProcessManager(){return r.soloProcessManager},set soloProcessManager(s){r.soloProcessManager=s},get productProcessManager(){return r.productProcessManager},set productProcessManager(s){r.productProcessManager=s},getActiveProjectRoot:t.getActiveProjectRoot,emitAgentStatus:t.emitAgentStatus,handleMcpToolCall:t.handleMcpToolCall,log:t.log,sendNotification:t.sendNotification,sendResponse:t.sendResponse}}var aa=class{acpSessionHistories=new Map;resumedSessionHistories=new Map;appendAcpUserMessage(e,r){let n=this.getOrCreateAcpHistory(e);return n.push({role:"user",content:r}),[...n]}appendAcpAssistantMessage(e,r){r&&this.getOrCreateAcpHistory(e).push({role:"assistant",content:r})}clearAcpSession(e){this.acpSessionHistories.delete(e)}saveResumedSession(e,r){if(r.length===0){this.resumedSessionHistories.delete(e);return}this.resumedSessionHistories.set(e,[...r])}withResumedHistory(e,r){let n=this.resumedSessionHistories.get(e);if(!n||n.length===0)return r;let o=eF(r,n)?r.slice(n.length):r;return[rF(n),...n,...o]}getOrCreateAcpHistory(e){let r=this.acpSessionHistories.get(e);return r||(r=[],this.acpSessionHistories.set(e,r)),r}};function eF(t,e){if(t.length<e.length)return!1;for(let r=0;r<e.length;r++)if(!tF(t[r],e[r]))return!1;return!0}function tF(t,e){return t.role===e.role&&JSON.stringify(t.content)===JSON.stringify(e.content)}function rF(t){let e=t.filter(n=>n.role==="user"&&typeof n.content=="string").map(n=>String(n.content).replace(/\s+/g," ").trim()).filter(Boolean).slice(-8);return{role:"system",content:["Resumed session context follows. It is authoritative prior conversation for this same session.","If the current user asks about information already present there, answer directly from it before using memory or tools.",e.length>0?` Prior user statements recovered from this session:
|
|
632
|
+
`,".","\u3002",";","\uFF1B"].map(a=>t.indexOf(a,r)).filter(a=>a>=0),i=s.length>0?Math.min(...s):t.length;return t.slice(o,i)}function AT(t,e){let r=t;for(let n of e)qU(n.marker)&&(r.includes(n.marker)||(n.placement==="prefix"?r=r.trim().length>0?`${n.marker} ${r}`:n.marker:r=r.trim().length>0?`${r.trimEnd()}
|
|
633
|
+
${n.marker}`:n.marker));return r}function FU(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 HU(t){let e=t.toLowerCase(),r=Qi(e,["start with","begin with"])+Qi(t,["\u5F00\u5934","\u5FC5\u987B\u4EE5"]),n=Qi(e,["end with","append","at the end"])+Qi(t,["\u672B\u5C3E","\u7ED3\u5C3E","\u7ED3\u675F\u6807\u8BB0"]);return r>=0||n>=0?r>n?"prefix":"suffix":"include"}function Qi(t,e){let r=-1;for(let n of e){let o=t.lastIndexOf(n);o>r&&(r=o)}return r}function BU(t){let e=t.trim();return e.length<2||e.length>100||/https?:\/\//i.test(e)?!1:/[A-Z0-9_\-[\]—-]/.test(e)}function qU(t){return/[A-Z\[\]—-]/.test(t)}async function ta(t,e){return $U(t,e)}function PT(){}var GU=[/继续(桌面|电脑|刚才|上次|之前)的/,/接着(桌面|电脑|刚才|上次|之前)的/,/刚才(那个|那件|说的|聊的|做的)/,/上次(说到|聊到|做到|讲到)/,/桌面(端|上)?(那个|那边|的任务|的对话|在做)/,/电脑(端|上)?(那个|那边|的任务|的对话|在做)/,/之前(那个|在做的|讨论的|说的)/,/帮我继续/,/接着(做|干|搞|写|改)/,/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 KU(t){return!t||t.length<3?!1:GU.some(e=>e.test(t))}function xT(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 CT(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 zU(t,e){t?.setToolMeta?.(e)}function IT(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 ET(t){let e=t.params??{},r=e.turnId??WU(),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=dT({config:a,sessionId:o,host:this}),{sessionProjectRoot:l,sessionProjectId:d,projectHintStale:p,staleProjectHintContext:u}=c;this.configureTurnMedia?.(a,r),sT(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 aT(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()}}),np(this,m);return}try{let h={provider:a?.provider,model:a?.model,apiKey:a?.apiKey,baseUrl:a?.baseUrl,maxRounds:a?.maxRounds,temperature:a?.temperature,contextWindowTokens:a?.contextWindowTokens,maxOutputTokens:a?.maxOutputTokens,modelMaxOutputTokens:a?.modelMaxOutputTokens,maxConcurrentTools:a?.maxConcurrentTools,mediaProviders:a?.mediaProviders,reasoning:a?.reasoning,promptCacheKey:a?.promptCacheKey,promptCacheRetention:a?.promptCacheRetention,serviceTier:a?.serviceTier,openaiBuiltinTools:a?.openaiBuiltinTools,maxToolCalls:a?.maxToolCalls,parallelToolCalls:a?.parallelToolCalls,textVerbosity:a?.textVerbosity,toolChoice:a?.toolChoice,assistantId:a?.assistantId,mcpServers:a?.mcpServers,fallbackModel:D().resolveModelForPurpose("smallModel")??void 0};{let P=h.provider??"",W=h.model??"";P&&W&&D().getModelInfo(P,W)?.streamRequired&&(h.streamRequired=!0)}let b=this.resolveAgent(h),v=typeof a?.assistantId=="string"?a.assistantId.trim():"",R=v?await Ir():[],S=v?R.find(P=>P.id===v):void 0,T=v?await Ps(v):null;if(this.permissionChecker?.ruleEngineRef&&a?.permissions){let P=oT(this.permissionChecker.ruleEngineRef,a.permissions);vi(P.mode==="full_access")}if(!b){this.sendNotification("turn.error",{turnId:r,error:{message:"No LLM provider configured. Provide provider/model/apiKey in agent.turn config, or set DEEPSEEK_API_KEY / OPENAI_API_KEY / ANTHROPIC_API_KEY environment variable.",code:"NO_PROVIDER"}});return}let C,E=[],M=a?.workdir??this.getActiveProjectRoot();this.setActiveWorkdir(M);try{let P=await ta(M,this.currentHooks??void 0);P.length>0&&(C=ea(P),E=ap(P))}catch{}let L=s.filter(P=>P.role==="user").map(P=>typeof P.content=="string"?P.content:"").join(" "),{domain:k,source:Q}=hT({cwd:M,hostOverride:a?.taskDomain,sessionDomain:this.sessionTaskDomain,userText:L});this.sessionTaskDomain=k,Q==="auto-detect"&&vT(L,k)&&yT(M,k);let de=Xi(s),O=Ji(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=Vt(o,l);P?.carryoverSummary&&(F=P.carryoverSummary)}let J=await Bi({basePrompt:a?.systemPrompt,instructionBlock:C,customSystemPrompt:a?.customSystemPrompt,appendSystemPrompt:a?.appendSystemPrompt,sections:[Ki(M),Vi(),kT(k),zi(),...O?[O]:[],...F?[qt("carryover",()=>F,"carryover from predecessor session")]:[],qt("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(`
|
|
634
|
+
`):null},"memory INDEX.md may change between turns")]}),H=[...s].reverse().find(P=>P.role==="user");H&&Ic(o,H,l,r).catch(()=>{}),await this.mcpReady;let Ee=(this.toolCatalog??tr()).getToolManifest(),Gt=new Set(Ee.map(P=>P.function.name)),Me=Yi([...Ee,...i.filter(P=>!Gt.has(P.function.name))],de);zU(this.permissionChecker,Me);let st=BS(s,T);if(S&&T){let P=qS({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(", ")??"";st=[{role:"system",content:`[\u6CE8\u610F\uFF1A\u7528\u6237\u4ECE IM \u7AEF\u53D1\u6765\u6D88\u606F\uFF0C\u4F46\u684C\u9762\u7AEF\u5DF2\u8D85\u8FC730\u5206\u949F\u672A\u6D3B\u8DC3\uFF0C\u65E0\u6CD5\u786E\u5B9A\u7528\u6237\u60F3\u5728\u54EA\u4E2A\u9879\u76EE\u4E2D\u5DE5\u4F5C\u3002\u5F53\u524D\u6D3B\u8DC3\u9879\u76EE\uFF1A${P??"\u65E0"}\u3002\u53EF\u7528\u9879\u76EE\uFF1A${W||"\u65E0"}\u3002\u8BF7\u5728\u56DE\u590D\u5F00\u5934\u7B80\u77ED\u8BE2\u95EE\u7528\u6237\u60F3\u5728\u54EA\u4E2A\u9879\u76EE\u4E2D\u7EE7\u7EED\uFF0C\u4F8B\u5982\uFF1A"\u4F60\u60F3\u7EE7\u7EED\u5728\u300CXX\u300D\u9879\u76EE\u4E2D\u5DE5\u4F5C\u5417\uFF1F"]`},...s]}let se=a?.desktopRecentContext;if(!p&&se&&se.length>0&&s.length>0){let P=s[s.length-1],W=P?.role==="user"&&typeof P.content=="string"?P.content:"";if(KU(W)){let V={role:"system",content:"[\u4EE5\u4E0B\u662F\u7528\u6237\u5728\u684C\u9762\u7AEF\u7684\u8FD1\u671F\u5BF9\u8BDD\uFF0C\u4F9B\u4F60\u53C2\u8003\u4EE5\u4FDD\u6301\u4E0A\u4E0B\u6587\u8FDE\u8D2F]"},it={role:"system",content:"[\u684C\u9762\u5BF9\u8BDD\u4E0A\u4E0B\u6587\u7ED3\u675F\uFF0C\u4EE5\u4E0B\u662F\u5F53\u524D IM \u7AEF\u7684\u5BF9\u8BDD]"};st=[V,...se,it,...st],this.log(`[continuation] injected ${se.length} desktop messages as reference`)}}if(!Vt(o,l)?.title){let P=typeof H?.content=="string"?H.content:Array.isArray(H?.content)?H.content.filter(W=>W.type==="text").map(W=>W.text??"").join(""):"";if(P.trim()){let W=null,V=this.resolveClientForPurpose("smallModel");V&&(W=await 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:st,tools:Me,systemPrompt:J,config:h},f.signal)){let W=new Date().toISOString();if(qi({event:P,turnId:r,now:W,host:this})){P.type==="tool_call"&&this.sessionState?.recordToolCall();continue}switch(P.type){case"start":break;case"end":{let V=AT(P.content,E);if(this.sendNotification("turn.end",{turnId:P.turnId,content:V,usage:P.usage,model:P.model,provider:P.provider,item:{id:`${r}-end`,type:"message",role:"assistant",text:V,createdAt:W}}),P.usage&&this.sessionState){this.sessionState.addUsage(P.usage,P.model??this.currentModel);let it=this.sessionState.createSnapshot();this.sendNotification("turn.usage_update",{turnId:P.turnId,usage:P.usage,model:P.model??this.currentModel,sessionCostUSD:it.totalInputTokens*3e-6+it.totalOutputTokens*15e-6})}V&&(this.lastAssistantMessageForExtract=V,Ic(o,{role:"assistant",content:V},l,r).catch(()=>{}));break}case"error":if(this.sendNotification("turn.error",{turnId:P.turnId,error:{message:P.error,code:P.code}}),P.usage&&this.sessionState){this.sessionState.addUsage(P.usage,this.currentModel);let V=this.sessionState.createSnapshot();this.sendNotification("turn.usage_update",{turnId:P.turnId,usage:P.usage,model:this.currentModel,sessionCostUSD:V.totalInputTokens*3e-6+V.totalOutputTokens*15e-6})}break;case"skill_instruction":this.sendNotification("turn.skill_instruction",{turnId:P.turnId,instruction:P.instruction}),Th({instruction:P.instruction,eventTurnId:P.turnId,projectRoot:l,host:this});break}}if(this.log(`turn ${r} completed`),this.sessionState?.recordTurnCompleted(),this.sessionState){hm(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&&vm(o,{sessionId:o,projectId:d??"",createdAt:"",lastActiveAt:"",turnCount:P.turnCount,messageCount:s.length},s,{transport:W.transport,apiKey:W.apiKey,model:W.model},l),pT({turnId:r,messages:s,client:this.resolveClientForPurpose("textGeneration"),sendNotification:(V,it)=>this.sendNotification(V,it)}),this.petRuntime.awardXp("turn.end"),this.petRuntime.reactAfterTurn(s),a?.sessionType==="group"&&this.sessionState){let V=this.sessionState.createSnapshot(),it=Vt(o,l);it&&ER({...it,turnCount:V.turnCount},l).then(Mn=>{Mn.split&&this.sendNotification("session-update",{sessionId:Mn.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{np(this,m)}}function Ye(t){return ra(t)}function vt(t){return ra(t)}function Wt(t){return ra(t)}function yr(t){return ra(t)}function ra(t){return t.multiAgentHandlerHost??t}function MT(t){return new Map([["initialize",e=>Db.call(t,e)],["agent.ping",e=>Nb.call(t,e)],["agent.health",e=>Lb.call(t,e)],["agent.metrics",e=>Ob.call(t,e)],["agent.cancel",e=>jb.call(t,e)],["thread.turn",e=>ET.call(t,e)],["memory.dream",e=>an.call(t,e)],["agent.abort",e=>xT.call(t,e)],["assistants.list",e=>ql.call(t,e)],["assistants.resolve",e=>Wl.call(t,e)],["assistants.cloneBuiltin",e=>Gl.call(t,e)],["assistants.upsert",e=>Kl.call(t,e)],["assistants.create",e=>zl.call(t,e)],["assistants.update",e=>Vl.call(t,e)],["assistants.delete",e=>Yl.call(t,e)],["assistants.setState",e=>Xl.call(t,e)],["tool.approval.response",e=>CT.call(t,e)],["thread.user_response",e=>IT.call(t,e)],["thread.list",e=>NR.call(t,e)],["session.resume",e=>WR.call(t,e)],["thread.create",e=>DR.call(t,e)],["session.getInfo",e=>GR.call(t,e)],["session.create",e=>LR.call(t,e)],["session.resolve",e=>OR.call(t,e)],["session.list",e=>jR.call(t,e)],["session.get",e=>$R.call(t,e)],["session.getMessages",e=>UR.call(t,e)],["session.update",e=>FR.call(t,e)],["session.delete",e=>HR.call(t,e)],["session.deleteAll",e=>BR.call(t,e)],["session.archive",e=>qR.call(t,e)],["memory.list",e=>dk.call(t,e)],["memory.atlas",e=>uk.call(t,e)],["memory.activity",e=>pk.call(t,e)],["memory.observe",e=>mk.call(t,e)],["memory.propose",e=>gk.call(t,e)],["memory.consolidate",e=>fk.call(t,e)],["memory.read",e=>hk.call(t,e)],["memory.write",e=>yk.call(t,e)],["memory.search",e=>vk.call(t,e)],["memory.delete",e=>bk.call(t,e)],["memory.update",e=>kk.call(t,e)],["tools.list",e=>Rb.call(t,e)],["media.listModels",e=>Zb.call(t,e)],["media.cancel",e=>ek.call(t,e)],["media.status",e=>tk.call(t,e)],["media.stt",e=>rk.call(t,e)],["settings.listProviders",e=>tS.call(t,e)],["settings.addKey",e=>rS.call(t,e)],["settings.removeKey",e=>nS.call(t,e)],["settings.getKey",e=>oS.call(t,e)],["settings.toggleKey",e=>sS.call(t,e)],["settings.toggleModel",e=>iS.call(t,e)],["settings.listModels",e=>aS.call(t,e)],["settings.setActiveModel",e=>cS.call(t,e)],["settings.getActiveModel",e=>lS.call(t,e)],["settings.getOverview",e=>dS.call(t,e)],["settings.refreshModels",e=>uS.call(t,e)],["settings.validateKey",e=>pS.call(t,e)],["assistants.list",e=>ql.call(t,e)],["assistants.resolve",e=>Wl.call(t,e)],["assistants.cloneBuiltin",e=>Gl.call(t,e)],["assistants.upsert",e=>Kl.call(t,e)],["assistants.create",e=>zl.call(t,e)],["assistants.update",e=>Vl.call(t,e)],["assistants.delete",e=>Yl.call(t,e)],["assistants.setState",e=>Xl.call(t,e)],["provider.list",e=>Sb.call(t,e)],["config.get",e=>Tb.call(t,e)],["config.update",e=>Ab.call(t,e)],["config.tunables",e=>xb.call(t,e)],["config.updateTunable",e=>Cb.call(t,e)],["community.getConsent",e=>_h.call(t,e)],["community.setConsent",e=>Dh.call(t,e)],["community.matchRegistry",e=>Lh.call(t,e)],["community.listShared",e=>Nh.call(t,e)],["community.withdrawShared",e=>qh.call(t,e)],["community.withdrawAllShared",e=>Wh.call(t,e)],["community.listNotices",e=>Gh.call(t,e)],["community.markNoticeRead",e=>Kh.call(t,e)],["community.listPublishAudit",e=>Bh.call(t,e)],["community.resolveInstall",e=>Oh.call(t,e)],["community.installResource",e=>jh.call(t,e)],["community.publishSkill",e=>$h.call(t,e)],["community.publishPet",e=>Uh.call(t,e)],["community.recordSignal",e=>Fh.call(t,e)],["community.recordTelemetry",e=>Hh.call(t,e)],["todos.list",e=>Ib.call(t,e)],["tasks.list",e=>Eb.call(t,e)],["tasks.cancel",e=>Mb.call(t,e)],["agents.scan",e=>uf.call(Ye(t),e)],["agents.list",e=>pf.call(Ye(t),e)],["agents.prompt",e=>wf.call(Ye(t),e)],["agents.config",e=>mf.call(Ye(t),e)],["agents.setConfig",e=>gf.call(Ye(t),e)],["agents.getConfig",e=>ff.call(Ye(t),e)],["agents.removeConfig",e=>hf.call(Ye(t),e)],["agents.setGateway",e=>yf.call(Ye(t),e)],["agents.getGateway",e=>vf.call(Ye(t),e)],["agents.processes",e=>kf.call(Ye(t),e)],["agents.kill",e=>Rf.call(Ye(t),e)],["agents.listConfigured",e=>bf.call(Ye(t),e)],["agents.getLog",e=>Sf.call(Ye(t),e)],["agents.testConnection",e=>Tf.call(Ye(t),e)],["solo.start",e=>NS.call(yr(t),e)],["solo.status",e=>LS.call(yr(t),e)],["solo.cancel",e=>OS.call(yr(t),e)],["solo.select",e=>jS.call(yr(t),e)],["solo.list",e=>$S.call(yr(t),e)],["solo.delete",e=>US.call(yr(t),e)],["solo.message",e=>FS.call(yr(t),e)],["solo.evaluate",e=>HS.call(yr(t),e)],["product.plan",e=>Bk.call(vt(t),e)],["product.confirm",e=>qk.call(vt(t),e)],["product.message",e=>Wk.call(vt(t),e)],["product.create",e=>Gk.call(vt(t),e)],["product.resume",e=>Kk.call(vt(t),e)],["product.pause",e=>zk.call(vt(t),e)],["product.checkpoint",e=>Vk.call(vt(t),e)],["product.status",e=>Xk.call(vt(t),e)],["product.list",e=>Yk.call(vt(t),e)],["product.delete",e=>Jk.call(vt(t),e)],["product.cancel",e=>Qk.call(vt(t),e)],["product.rollback",e=>Zk.call(vt(t),e)],["workflow.create",e=>iR.call(Wt(t),e)],["workflow.get",e=>aR.call(Wt(t),e)],["workflow.describe",e=>cR.call(Wt(t),e)],["workflow.patch",e=>lR.call(Wt(t),e)],["workflow.run",e=>dR.call(Wt(t),e)],["workflow.setActive",e=>uR.call(Wt(t),e)],["workflow.list",e=>pR.call(Wt(t),e)],["workflow.delete",e=>mR.call(Wt(t),e)],["workflow.onImMessage",e=>gR.call(Wt(t),e)],["workflow.onWebhook",e=>fR.call(Wt(t),e)],["project.create",e=>vR.call(t,e)],["project.list",e=>bR.call(t,e)],["project.delete",e=>kR.call(t,e)],["project.purgeAll",e=>RR.call(t,e)],["project.rename",e=>SR.call(t,e)],["project.archive",e=>TR.call(t,e)],["project.unarchive",e=>wR.call(t,e)],["project.update",e=>PR.call(t,e)],["project.archiveByGroup",e=>AR.call(t,e)],["session.switchProject",e=>KR.call(t,e)],["session.focus",e=>VR.call(t,e)],["session.moveToProject",e=>XR.call(t,e)],["session.getState",e=>zR.call(t,e)],["files.list",e=>Fb.call(t,e)],["files.create",e=>Hb.call(t,e)],["files.rename",e=>Bb.call(t,e)],["files.delete",e=>qb.call(t,e)],["files.gitStatus",e=>Wb.call(t,e)],["instructions.list",e=>Gb.call(t,e)],["instructions.read",e=>Kb.call(t,e)],["instructions.write",e=>zb.call(t,e)],["instructions.delete",e=>Vb.call(t,e)],["plans.list",e=>Xb.call(t,e)],["skills.list",e=>bS.call(t,e)],["skills.activate",e=>kS.call(t,e)],["skills.deactivate",e=>RS.call(t,e)],["skills.delete",e=>SS.call(t,e)],["skills.promote",e=>TS.call(t,e)],["skills.stats",e=>wS.call(t,e)],["skills.pin",e=>AS.call(t,e)],["skills.unpin",e=>PS.call(t,e)],["skills.curator",e=>xS.call(t,e)],["skills.lifecycle",e=>CS.call(t,e)],["pet.hatch",e=>Pk.call(t,e)],["pet.interact",e=>xk.call(t,e)],["pet.status",e=>Ck.call(t,e)],["pet.forge",e=>Ik.call(t,e)],["pet.confirm_response",e=>Rk.call(t,e)]])}import{randomUUID as _T}from"node:crypto";import*as cp from"node:path";G();async function DT(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-${_T().slice(0,8)}`,method:"memory.dream",params:{turnId:`dream-${_T().slice(0,8)}`,sessionId:e.sessionId||t.currentSessionId,config:{memoryRoot:e.config?.memoryRoot||t.resolveMemoryRoot?.()||cp.join(n,"memory"),transcriptDir:e.config?.transcriptDir||t.resolveTranscriptDir?.()||cp.join(n,"agent-logs"),model:r.model,apiKey:r.apiKey,...e.config}}};return await an.call(t,o),{ok:!0,summary:"Dream consolidation triggered"}}async function NT(t,e){t.log("[acp] x/solo.start");let r=Xe.call(t),n=await r.start(e);return r.getStatus(n)}async function LT(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 OT(t,e){return t.log("[acp] x/solo.select"),{ok:!0,mergedBranch:await Xe.call(t).select(e)}}async function jT(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 $T(t,e){return t.log("[acp] x/solo.subscribe"),{ok:!0,soloId:e.soloId}}async function UT(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 FT(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 HT(t){return t.log("[acp] x/agents.list"),ml()}async function BT(t,e){return t.log("[acp] x/product.create"),{productId:await ke.call(t).create(e)}}async function qT(t,e){return t.log("[acp] x/product.plan"),Fr.call(t).plan(e)}async function WT(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 GT(t,e){t.log("[acp] x/product.message");let r=Fr.call(t),n=e;return r.message(n.productId,n.content)}async function KT(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 zT(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 VT(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 XT(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 YT(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 JT(t,e){return t.log("[acp] x/product.subscribe"),{ok:!0,productId:e.productId}}async function QT(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=Xn(r);if(!s)throw new Error(`Unknown agent type: ${r}`);let i=t.resolveClientForPurpose("textGeneration");if(!i)throw new Error("No LLM provider configured; send a prompt first to configure the model");if(t.log(`[acp] x/team.delegate: agent=${r}, maxTurns=${o??s.maxTurns}`),ht.isTeamBudgetExceeded())return{ok:!1,agentType:r,output:void 0,error:ht.teamBudgetExceededError(),tokensUsed:0};let a={invoke:async()=>({result:"Tool execution not available in delegated mode"})},c={info:u=>t.log(`[delegate:${r}] ${u}`),warn:u=>t.log(`[delegate:${r}] WARN: ${u}`),error:u=>t.log(`[delegate:${r}] ERROR: ${u}`),debug:u=>t.log(`[delegate:${r}] ${u}`)},l=await Qr({promptMessages:[{role:"user",content:n}],tools:[],transport:i.transport,toolInvoker:a,createAgentRunner:sn,apiKey:i.apiKey,model:i.model,log:c,forkLabel:`team-delegate-${r}`,maxTurns:o??s.maxTurns,parentSignal:t.activeTurn?.signal,parentDepth:0}),d=l.events.filter(u=>u.type==="end"&&"content"in u).map(u=>u.content??"").join("")||l.events.filter(u=>u.type==="delta"&&"text"in u).map(u=>u.text).join(""),p=l.totalUsage.inputTokens+l.totalUsage.outputTokens;return ht.recordForkTokens(p),{ok:l.ok,agentType:r,output:d||void 0,error:l.error,tokensUsed:p}}import{randomUUID as ZT}from"node:crypto";async function ew(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 tw(t,e){let r=e.sessionId??ZT();return t.log(`[acp] session/new: id=${r}`),t.currentSessionId=r,t.sessionState=new fr(r),t.sessionTaskDomain=void 0,t.memoryPrefetchState=kt(),e.cwd&&typeof e.cwd=="string"&&t.setActiveWorkdir(e.cwd),t.enableIdleDream(),{sessionId:r}}async function rw(t,e){let r=ZT(),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 XU(t,r,n,[...s]);return i.content&&t.sessionHistory.appendAcpAssistantMessage(n,i.content),i}async function XU(t,e,r,n){let o=new AbortController;t.activeTurn=o,t.sendNotification("turn.start",{turnId:e,model:t.currentModel||void 0});try{let s={model:t.currentModel||void 0,provider:t.currentProvider||void 0,apiKey:t.currentApiKey||void 0,baseUrl:t.currentBaseUrl||void 0},i=Xi(n);i.requiresFreshTool&&(s.toolChoice="required");let a=t.resolveAgent(s);if(!a)return t.sendNotification("turn.delta",{turnId:e,text:"Error: No LLM provider configured. Configure via ~/.qlogicagent/settings.json or pass provider/apiKey in session config.",item:{id:`${e}-err`,type:"message",role:"assistant",text:"",createdAt:new Date().toISOString()}}),t.sendNotification("turn.end",{turnId:e,content:"",item:{id:`${e}-end`,type:"message",role:"assistant",text:"",createdAt:new Date().toISOString()}}),t.activeTurn=null,{stopReason:"end_turn"};await t.mcpReady;let c=Yi((t.toolCatalog??tr()).getToolManifest(),i),l=t.getActiveProjectRoot(),d=await ta(l,t.currentHooks??void 0),p=d.length>0?ea(d):void 0,u=Ji(i),m=await Bi({instructionBlock:p,sections:[Ki(l),Vi(),zi(),...u?[u]:[]]}),f,g="end_turn",h="";for await(let b of a.run({turnId:e,sessionId:r,messages:n,tools:c,systemPrompt:m,config:s},o.signal)){let v=new Date().toISOString();if(!qi({event:b,turnId:e,now:v,host:t}))switch(b.type){case"start":break;case"end":b.usage&&(f={inputTokens:b.usage.inputTokens??0,outputTokens:b.usage.outputTokens??0,cacheReadTokens:b.usage.cacheRead,cacheWriteTokens:b.usage.cacheWrite}),h=b.content??"",t.sendNotification("turn.end",{turnId:b.turnId,content:b.content,usage:b.usage,model:b.model,provider:b.provider,item:{id:`${e}-end`,type:"message",role:"assistant",text:b.content,createdAt:v}});break;case"error":g="end_turn",t.sendNotification("turn.error",{turnId:b.turnId,error:{message:b.error,code:b.code}});break}}return t.activeTurn=null,{stopReason:g,usage:f,content:h}}catch(s){t.activeTurn=null;let i=s instanceof Error?s.message:String(s);return t.log(`[acp] runAcpTurn error: ${i}`),t.sendNotification("turn.error",{turnId:e,error:{message:i,code:"INTERNAL_ERROR"}}),{stopReason:"end_turn"}}}async function nw(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 ow(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 sw(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 iw(t,e,r){t.log(`[acp] session/set_mode: ${r}`)}function aw(t,e,r=t){return{handleAcpInitialize:n=>ew(t,n,e),handleAcpSessionNew:n=>tw(t,n),handleAcpSessionPrompt:n=>rw(t,n),handleAcpSessionEnd:n=>nw(t,n),handleAcpSessionSetConfig:n=>ow(t,n),handleAcpSessionSetModel:(n,o)=>sw(t,n,o),handleAcpSessionSetMode:(n,o)=>iw(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=>DT(r,n),handleAcpAgentsList:()=>HT(r),handleAcpSoloStart:n=>NT(r,n),handleAcpSoloStatus:n=>LT(r,n),handleAcpSoloSelect:n=>OT(r,n),handleAcpSoloCancel:n=>jT(r,n),handleAcpSoloSubscribe:n=>$T(r,n),handleAcpSoloMessage:n=>UT(r,n),handleAcpSoloEvaluate:n=>FT(r,n),handleAcpProductCreate:n=>BT(r,n),handleAcpProductPlan:n=>qT(r,n),handleAcpProductConfirm:n=>WT(r,n),handleAcpProductMessage:n=>GT(r,n),handleAcpProductPause:n=>VT(r,n),handleAcpProductResume:n=>KT(r,n),handleAcpProductCancel:n=>XT(r,n),handleAcpProductRollback:n=>YT(r,n),handleAcpProductStatus:n=>zT(r,n),handleAcpProductSubscribe:n=>JT(r,n),handleAcpTeamDelegate:n=>QT(r,n)}}var na=class{currentHooks=null;mcpManager=null;mcpReady=Promise.resolve();pluginLoader=null;permissionChecker=null;permissionUnregister=null;fileWatcher=null;memoryProvider=null;memoryDreamProvider=null;memoryUserId="";getPluginSkills(){return this.pluginLoader?.getPluginSkills()??[]}applyBootstrap(e){this.currentHooks=e.hooks,this.memoryProvider=e.memoryHandlerProvider,this.memoryDreamProvider=e.memoryDreamProvider,this.memoryUserId=e.memoryUserId,this.permissionChecker=e.permissionChecker,this.permissionUnregister=e.permissionUnregister}resetAfterSessionDispose(){this.currentHooks=null,this.memoryProvider=null,this.memoryDreamProvider=null}stopFileWatcher(){this.fileWatcher&&(this.fileWatcher.stop(),this.fileWatcher=null)}async disconnectMcp(){if(!this.mcpManager)return;let e=this.mcpManager;this.mcpManager=null,await e.disconnectAll()}unregisterPermissions(){this.permissionUnregister&&(this.permissionUnregister(),this.permissionUnregister=null)}resetMemoryProviders(){this.memoryProvider=null,this.memoryDreamProvider=null}};G();import{join as lw}from"node:path";import{chmod as JU}from"node:fs/promises";var dw="agent-configs.json";function cw(){return lw(B(),dw)}function QU(t){return lw(Ne(t),dw)}function ZU(){return{agents:{}}}var oa=class{data=ZU();cwd;constructor(e){this.cwd=e}async load(){let e=await Zt(cw()),r=this.cwd?await Zt(QU(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=cw();await mr(e,this.data);try{await JU(e,384)}catch{}}};var sa=class{constructor(e){this.deps=e}deps;store=null;get currentStore(){return this.store}async ensureStore(){return this.store||(this.store=new oa(this.deps.getActiveProjectRoot()),await this.store.load(),this.deps.acpDetector.setConfigStore(this.store.getData())),this.store}};function uw(t){return new sa(t)}var ia=class{soloEvaluator=null;productOrchestrator=null;productPlanner=null;soloProcessManager=null;productProcessManager=null};function pw(t){let e=t.acpDetector??new Ss,r=new ia,o=(t.createAgentConfigRuntime??uw)({acpDetector:e,getActiveProjectRoot:t.getActiveProjectRoot});return{acpDetector:e,get agentConfigStore(){return o.currentStore},ensureAgentConfigStore:()=>o.ensureStore(),get soloEvaluator(){return r.soloEvaluator},set soloEvaluator(s){r.soloEvaluator=s},get productOrchestrator(){return r.productOrchestrator},set productOrchestrator(s){r.productOrchestrator=s},get productPlanner(){return r.productPlanner},set productPlanner(s){r.productPlanner=s},get soloProcessManager(){return r.soloProcessManager},set soloProcessManager(s){r.soloProcessManager=s},get productProcessManager(){return r.productProcessManager},set productProcessManager(s){r.productProcessManager=s},getActiveProjectRoot:t.getActiveProjectRoot,emitAgentStatus:t.emitAgentStatus,handleMcpToolCall:t.handleMcpToolCall,log:t.log,sendNotification:t.sendNotification,sendResponse:t.sendResponse}}var aa=class{acpSessionHistories=new Map;resumedSessionHistories=new Map;appendAcpUserMessage(e,r){let n=this.getOrCreateAcpHistory(e);return n.push({role:"user",content:r}),[...n]}appendAcpAssistantMessage(e,r){r&&this.getOrCreateAcpHistory(e).push({role:"assistant",content:r})}clearAcpSession(e){this.acpSessionHistories.delete(e)}saveResumedSession(e,r){if(r.length===0){this.resumedSessionHistories.delete(e);return}this.resumedSessionHistories.set(e,[...r])}withResumedHistory(e,r){let n=this.resumedSessionHistories.get(e);if(!n||n.length===0)return r;let o=eF(r,n)?r.slice(n.length):r;return[rF(n),...n,...o]}getOrCreateAcpHistory(e){let r=this.acpSessionHistories.get(e);return r||(r=[],this.acpSessionHistories.set(e,r)),r}};function eF(t,e){if(t.length<e.length)return!1;for(let r=0;r<e.length;r++)if(!tF(t[r],e[r]))return!1;return!0}function tF(t,e){return t.role===e.role&&JSON.stringify(t.content)===JSON.stringify(e.content)}function rF(t){let e=t.filter(n=>n.role==="user"&&typeof n.content=="string").map(n=>String(n.content).replace(/\s+/g," ").trim()).filter(Boolean).slice(-8);return{role:"system",content:["Resumed session context follows. It is authoritative prior conversation for this same session.","If the current user asks about information already present there, answer directly from it before using memory or tools.",e.length>0?` Prior user statements recovered from this session:
|
|
635
635
|
${e.map(n=>`- ${n.slice(0,500)}`).join(`
|
|
636
636
|
`)}`:""].join(" ")}}import{randomUUID as nF}from"node:crypto";var oF={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},ca=class{constructor(e){this.options=e;this.dreamState=e.dreamState??ht.dream,this.now=e.now??(()=>Date.now()),this.randomId=e.randomId??(()=>nF().slice(0,8)),this.timers=e.timers??oF}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 mw(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 gw(t){let r=D().getActiveModel(t.purpose);if(!r)return null;let{provider:n,model:o,apiKey:s,baseUrl:i,keyHandle:a}=r;return a.release({success:!0}),n===t.currentProvider&&t.currentTransport?{transport:t.currentTransport,apiKey:s,model:o}:{transport:ei({provider:n,model:o,apiKey:s,baseUrl:i},t.providerRegistry).transport,apiKey:s,model:o}}import{randomUUID as sF}from"node:crypto";async function fw(t){let e=t.toolCatalog.findTool(t.toolName);if(!e?.execute)return`Error: Unknown tool "${t.toolName}"`;let r=`mcp_${t.memberId}_${sF().slice(0,8)}`;try{return(await e.execute(r,t.args)).content.map(o=>o.text??"").join(`
|
|
637
637
|
`)||"OK"}catch(n){return`Error: ${n instanceof Error?n.message:String(n)}`}}var iF={starting:"spawning",ready:"available",running:"running",completed:"available",failed:"failed",killed:"unavailable"};function hw(t,e,r){let n={agentId:t,status:iF[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 yw(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 wn from"node:fs";import*as vw from"node:path";function bw(t){let e=ne();if(e)e.workspaceDir&&t.pathService.setActiveWorkdir(e.workspaceDir);else{let n=vw.join(X(),"workspaces","default");wn.existsSync(n)||wn.mkdirSync(n,{recursive:!0});let o=Zf(n);_i(n),t.pathService.setActiveWorkdir(n),t.sendNotification("project.created",{id:o.id,name:o.name,workspaceDir:o.workspaceDir,type:o.type})}aF();let r=t.projectMemoryStoreFactory.create(t.pathService.getActiveProjectRoot());return r.ensureInitialized(),r}function aF(){let e=z().find(r=>r.type==="default"&&r.status==="active");e&&(wn.existsSync(e.workspaceDir)||wn.mkdirSync(e.workspaceDir,{recursive:!0}))}var la=class{constructor(e){this.deps=e}deps;pendingConfirms=new Map;requestConfirm(e,r,n,o=3e4){let s=`confirm_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return this.deps.sendNotification("pet.confirm",{confirmId:s,toolName:e,description:r,risk:n,timeoutMs:o}),new Promise(i=>{let a=setTimeout(()=>{this.pendingConfirms.delete(s),i(!1)},o+2e3);this.pendingConfirms.set(s,c=>{clearTimeout(a),i(c)})})}handleResponse({confirmId:e,approved:r}){this.deps.getPermissionResolver()?.resolveApproval({approvalId:e,decision:r?"allow":"deny"});let n=this.pendingConfirms.get(e);n&&(this.pendingConfirms.delete(e),n(!!r))}};function kw(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 lp,readdir as Rw,unlink as cF,stat as lF,mkdir as dF}from"node:fs/promises";import{existsSync as Dt,readFileSync as Sw,mkdirSync as Tw,writeFileSync as uF}from"node:fs";import{join as rt}from"node:path";var ge=12288,dp=200,da=8192,pF="memory",vr="INDEX.md";function up(t){return rt(I().getProjectAgentDir(t),pF)}var mF=[/ignore\s+(previous|all|above|prior)\s+instructions/i,/you\s+are\s+now\s+/i,/do\s+not\s+tell\s+the\s+user/i,/system\s+prompt\s+override/i];function ua(t){return!mF.some(e=>e.test(t))}var gF=/^[a-z0-9][a-z0-9\-_.]*\.md$/i;function pa(t){return!(!gF.test(t)||t===vr||t.includes("..")||t.includes("/")||t.includes("\\"))}function fF(t){return t.trim().match(/^([A-Za-z][A-Za-z0-9_-]{2,})\s*:/)?.[1]??null}function hF(t,e){let r=t.split(`
|
|
@@ -668,7 +668,7 @@ ${e.map(n=>`- ${n.slice(0,500)}`).join(`
|
|
|
668
668
|
`)?r+e+`
|
|
669
669
|
`:r+`
|
|
670
670
|
`+e+`
|
|
671
|
-
`;Buffer.byteLength(n,"utf-8")<=ge&&await this.writeIndex(n)}};function vF(t,e){let r=rt(t,"..");Dt(r)||Tw(r,{recursive:!0}),uF(t,e,"utf-8")}function bF(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function
|
|
671
|
+
`;Buffer.byteLength(n,"utf-8")<=ge&&await this.writeIndex(n)}};function vF(t,e){let r=rt(t,"..");Dt(r)||Tw(r,{recursive:!0}),uF(t,e,"utf-8")}function bF(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Aw(){return{getRootPath(t){return up(t)},create(t){return new ma(t)}}}function Pw(t){t.toolBootstrap.getAllBaseTools({log:{info:e=>t.log(e),warn:e=>t.log(`[warn] ${e}`),error:e=>t.log(`[error] ${e}`),debug:e=>{t.verbose&&t.log(`[debug] ${e}`)}},onExecProgress:e=>{t.sendNotification("turn.exec_progress",{output:e.output,elapsedTimeSeconds:e.elapsedTimeSeconds,totalLines:e.totalLines,totalBytes:e.totalBytes})}})}import{join as pp}from"node:path";import{mkdirSync as kF,existsSync as RF,createWriteStream as SF}from"node:fs";import{pipeline as TF}from"node:stream/promises";import{Readable as wF}from"node:stream";var AF=vc,PF=bc,xw={"image/png":".png","image/jpeg":".jpg","image/gif":".gif","image/webp":".webp","image/svg+xml":".svg","image/avif":".avif","video/mp4":".mp4","video/webm":".webm","video/quicktime":".mov","audio/mpeg":".mp3","audio/wav":".wav","audio/ogg":".ogg","audio/aac":".aac","audio/mp4":".m4a","audio/flac":".flac","application/pdf":".pdf","model/gltf-binary":".glb","model/gltf+json":".gltf"},ga=class{projectDir;maxFileSize;timeoutMs;constructor(e){this.projectDir=e?.projectDir??null,this.maxFileSize=e?.maxFileSize??AF,this.timeoutMs=e?.timeoutMs??PF}setProjectDir(e){this.projectDir=e}resolveMediaDir(e){if(!this.projectDir)throw new Error("MediaPersistence requires projectDir \u2014 call setProjectDir() first");if(!e)return pp(this.projectDir,".qlogicagent","media",xF());let r=e.replace(/[^a-zA-Z0-9_-]/g,"_");return r!==e&&r.length>0&&[...e].filter(o=>!/[a-zA-Z0-9_-]/.test(o)).length>e.length/2&&console.warn(`[media-persistence] sessionId heavily sanitized: "${e}" \u2192 "${r}" \u2014 potential collision risk`),pp(this.projectDir,".qlogicagent","sessions",r,"media")}async download(e,r){let n=this.resolveMediaDir(r?.sessionId);if(n.length+60>255)throw new Error(`Media path too long (${n.length} chars) \u2014 would exceed OS limit. Use a shorter project path or session ID.`);RF(n)||kF(n,{recursive:!0});let o=new AbortController,s=setTimeout(()=>o.abort(),this.timeoutMs),i="";try{let a=await fetch(e,{signal:o.signal});if(!a.ok)throw new Error(`Download failed: ${a.status} ${a.statusText}`);let c=parseInt(a.headers.get("content-length")??"0",10);if(c>this.maxFileSize)throw new Error(`File too large: ${c} bytes (max: ${this.maxFileSize})`);let l=a.headers.get("content-type")?.split(";")[0].trim()||"application/octet-stream",d=IF(e,l),p=CF(r?.type??EF(l),d);i=pp(n,p);let u=a.body;if(!u)throw new Error("No response body");let m=SF(i);await TF(wF.fromWeb(u),m);let{size:f}=await import("node:fs/promises").then(g=>g.stat(i));if(f===0)throw await import("node:fs/promises").then(g=>g.unlink(i).catch(()=>{})),new Error("Download produced empty file (connection dropped)");return{remoteUrl:e,localPath:i,bytes:f,mimeType:l}}catch(a){if(i)try{let{unlink:c}=await import("node:fs/promises");await c(i)}catch{}throw a}finally{clearTimeout(s)}}async downloadAll(e,r,n){let o=[];for(let s of e)try{let i=await this.download(s,r);o.push(i)}catch(i){n?.warn(`media-persistence: failed to download ${s}: ${i.message}`)}return o}getMediaDir(e){return this.resolveMediaDir(e)}getProjectDir(){return this.projectDir}};function xF(){let t=new Date;return`${t.getFullYear()}${String(t.getMonth()+1).padStart(2,"0")}${String(t.getDate()).padStart(2,"0")}`}function CF(t,e){let r=new Date,n=`${r.getFullYear()}${String(r.getMonth()+1).padStart(2,"0")}${String(r.getDate()).padStart(2,"0")}_${String(r.getHours()).padStart(2,"0")}${String(r.getMinutes()).padStart(2,"0")}${String(r.getSeconds()).padStart(2,"0")}`,o=Math.random().toString(36).slice(2,6);return`${t}_${n}_${o}${e}`}function IF(t,e){if(xw[e])return xw[e];try{let r=new URL(t).pathname,n=r.lastIndexOf(".");if(n>0){let o=r.slice(n).toLowerCase().split("?")[0];if(o.length<=5)return o}}catch{}return".bin"}function EF(t){return t.startsWith("image/")?"image":t.startsWith("video/")?"video":t.startsWith("audio/")?"audio":t.startsWith("model/")?"3d":"file"}import{resolve as MF}from"node:path";var fa=class extends Ln{constructor(r,n){super();this.mediaPersistence=r;this.toolBootstrap=n}mediaPersistence;toolBootstrap;activeWorkdir=null;getActiveProjectRoot(){if(this.activeWorkdir)return this.activeWorkdir;let r=ne();return r?.workspaceDir?r.workspaceDir:process.cwd()}setActiveWorkdir(r){let n=MF(r);this.activeWorkdir!==n&&(this.activeWorkdir=n,this.toolBootstrap.setWorkdir(n),this.mediaPersistence.setProjectDir(n))}resolveProjectDir(r){if(r)return Ft(r)??void 0}};import{createRequire as zF}from"node:module";import{randomUUID as Do}from"node:crypto";function mp(t){let e=0;for(let n=0;n<t.length;n++)e+=t[n]*t[n];if(e=Math.sqrt(e),e===0)return t;let r=new Float32Array(t.length);for(let n=0;n<t.length;n++)r[n]=t[n]/e;return r}function Cw(t,e){let r=0,n=Math.min(t.length,e.length);for(let o=0;o<n;o++)r+=t[o]*e[o];return r}var _F=`
|
|
672
672
|
CREATE TABLE IF NOT EXISTS memories (
|
|
673
673
|
id TEXT PRIMARY KEY,
|
|
674
674
|
text TEXT NOT NULL,
|
|
@@ -1016,36 +1016,36 @@ ${s}`,action:r}}if(r==="search"){let o=t.query?.trim();if(!o)return{ok:!1,messag
|
|
|
1016
1016
|
`))}catch{}return s.length===0?{ok:!0,message:"No matching memories found.",action:r,results:[]}:{ok:!0,message:s.join(`
|
|
1017
1017
|
|
|
1018
1018
|
`),action:r,results:i}}if(r==="remember"){if(!e.localProvider)return{ok:!1,message:"Long-term memory requires local memory provider.",action:r};let o=t.content?.trim();if(!o)return{ok:!1,message:"content is required for 'remember'.",action:r};if(!JF(o))return{ok:!1,message:"Content blocked by safety filter.",action:r};if(o.length<10)return{ok:!1,message:"Memory too short - provide a meaningful fact or insight (>=10 chars).",action:r};if(o.length>2e3)return{ok:!1,message:"Memory too long (max 2000 chars). Condense the insight.",action:r};try{return await e.localProvider.addText(o,e.userId,{source:"agent-remember",category:t.category??"lesson",importance:.7}),{ok:!0,message:`Stored to long-term memory: "${o.slice(0,80)}${o.length>80?"...":""}"`,action:r}}catch(s){return{ok:!1,message:`Failed to store: ${s instanceof Error?s.message:String(s)}`,action:r}}}if(r==="temporal"){if(!e.localProvider)return{ok:!1,message:"Temporal query requires local memory provider.",action:r};let o=t.days??7,s=Date.now()-o*864e5;return{ok:!0,message:e.localProvider.synthesizeTimeline(e.userId,s,Date.now()),action:r}}if(r==="feedback"){if(!e.localProvider)return{ok:!1,message:"Feedback requires local memory provider.",action:r};let o=t.memory_ids,s=t.signal;if(!o||o.length===0)return{ok:!1,message:"memory_ids is required for 'feedback'.",action:r};if(!s)return{ok:!1,message:"signal is required for 'feedback' (useful/irrelevant/outdated/wrong).",action:r};let i=await e.localProvider.feedback(o,s);return{ok:!0,message:`Feedback '${s}' applied to ${i.affected} memories.`,action:r}}return{ok:!1,message:`Unknown action: "${r}".`,action:r}}function Xw(t,e){return{recallProvider:t,runtimeHookProvider:t,learningSink:t,toolProvider:t,handlerProvider:t,dreamProvider:t,userId:e}}function Tp(t){try{let e=qw(),r=Bw(e);if(r.provider)return Xw(r.provider,e.ownerUserId||t)}catch{}return Xw(null,t)}function Yw(t){let e=Tp(t.currentUserId);return!e.recallProvider||!e.runtimeHookProvider||!e.userId||(tm(t.hooks,{memoryProvider:e.recallProvider,localMemoryProvider:e.runtimeHookProvider,userId:e.userId,log:{debug:r=>t.log.debug(r),warn:r=>t.log.warn(r)},getLastUserMessage:t.getLastUserMessage,getLastAssistantMessage:t.getLastAssistantMessage,llmExtract:async r=>{let n=t.resolveSmallModelClient();if(!n)return null;try{let o="";for await(let s of n.transport.stream({model:n.model,messages:[{role:"user",content:r}],tools:[],maxTokens:512},n.apiKey))s.type==="delta"&&(o+=s.text);return o.trim()||null}catch{return null}}},t.prefetchState),t.log.info("[memory] local provider initialized")),e}function Jw(t){t.toolCatalog.addTool({name:Ww,label:Gw,description:zw,parameters:Kw,execute:async(e,r)=>{let n=t.memoryUserId?t.memoryProvider??void 0:void 0,o=await Vw(r,{memdir:t.memdir,provider:n,localProvider:n,userId:t.memoryUserId});return{content:[{type:"text",text:o.message}],details:{type:"memory",action:o.action,ok:o.ok}}}})}import{Buffer as Qw}from"node:buffer";function Zw(t){let e=async(r,n)=>{let o="";for await(let s of r.transport.stream(n,r.apiKey))s.type==="delta"&&(o+=s.text);return o.trim()};return{createPetSoulGenerator(){let r=t.resolveClientForPurpose("smallModel");if(r)return async n=>{let o=`\u4F60\u662F\u684C\u9762\u5BA0\u7269\u7075\u9B42\u751F\u6210\u5668\u3002\u4E25\u683C\u8F93\u51FA JSON\uFF0C\u5305\u542B name\u3001personality\u3001catchphrase\u3002 \u7A00\u6709\u5EA6: ${n}\u3002\u540D\u5B57 2-4 \u4E2A\u4E2D\u6587\u5B57\u7B26\uFF0C\u6027\u683C 15 \u5B57\u5185\uFF0C\u53E3\u5934\u7985 6 \u5B57\u5185\u3002`;try{let i=(await e(r,{model:r.model,messages:[{role:"user",content:o}],maxTokens:100})).match(/\{[\s\S]*\}/);if(i){let a=JSON.parse(i[0]);if(a.name&&a.personality&&a.catchphrase)return{name:String(a.name).slice(0,8),personality:String(a.personality).slice(0,30),catchphrase:String(a.catchphrase).slice(0,12)}}}catch{}throw new Error("LLM_GENERATION_FAILED")}},createSmallLLMCall(){let r=t.resolveClientForPurpose("smallModel")??t.resolveClientForPurpose("textGeneration");if(r)return async(n,o)=>{try{return await e(r,{model:r.model,messages:[{role:"user",content:n}],maxTokens:o})||null}catch{return null}}},async forgeAnalyzeImage(r,n){let o=t.resolveClientForPurpose("imageUnderstanding");if(!o)throw new Error("No vision model available for image analysis");let s=["Analyze this character image for a 200x200 animated SVG desktop pet.","Return a concise plain-text character description covering species, colors, body shape, key features, eyes, and style.",n?`User hint: ${n}`:""].filter(Boolean).join(`
|
|
1019
|
-
`);return await e(o,{model:o.model,messages:[{role:"user",content:s,imageUrls:[`data:image/png;base64,${r}`]}],maxTokens:200})||n||"A cute rounded desktop pet character"},async forgeGenerateSkeleton(r){let n=t.resolveClientForPurpose("textGeneration");if(!n)throw new Error("No model available for skeleton generation");let s=(await e(n,{model:n.model,messages:[{role:"user",content:Tu(r)}],maxTokens:6e3})).match(/<svg[\s\S]*?<\/svg>/i);if(!s)throw new Error("Failed to generate skeleton SVG");return s[0]},async forgeScoreConsistency(r,n,o,s){let i=t.resolveClientForPurpose("imageUnderstanding");if(!i)throw new Error("No vision model available for consistency scoring");let a=`data:image/svg+xml;base64,${Qw.from(r).toString("base64")}`,c=`data:image/svg+xml;base64,${Qw.from(n).toString("base64")}`,l=await e(i,{model:i.model,messages:[{role:"user",content:wu(s,o),imageUrls:[a,c]}],maxTokens:200});return
|
|
1019
|
+
`);return await e(o,{model:o.model,messages:[{role:"user",content:s,imageUrls:[`data:image/png;base64,${r}`]}],maxTokens:200})||n||"A cute rounded desktop pet character"},async forgeGenerateSkeleton(r){let n=t.resolveClientForPurpose("textGeneration");if(!n)throw new Error("No model available for skeleton generation");let s=(await e(n,{model:n.model,messages:[{role:"user",content:Tu(r)}],maxTokens:6e3})).match(/<svg[\s\S]*?<\/svg>/i);if(!s)throw new Error("Failed to generate skeleton SVG");return s[0]},async forgeScoreConsistency(r,n,o,s){let i=t.resolveClientForPurpose("imageUnderstanding");if(!i)throw new Error("No vision model available for consistency scoring");let a=`data:image/svg+xml;base64,${Qw.from(r).toString("base64")}`,c=`data:image/svg+xml;base64,${Qw.from(n).toString("base64")}`,l=await e(i,{model:i.model,messages:[{role:"user",content:wu(s,o),imageUrls:[a,c]}],maxTokens:200});return Au(l)},async awardXp(r){try{let n=new xt(t.getActiveProjectRoot()),o=n.load();if(!o)return;let s=oe.xpForEvent(r),{newLevel:i,newXp:a,events:c,statBoosts:l}=oe.processXpGain(o,s);o.level=i,o.experience=a;for(let[d,p]of Object.entries(l)){let u=d;o.stats[u]=Math.min(10,o.stats[u]+(p??0))}n.updateSoul(o),t.sendNotification("pet.growth",{level:i,experience:a,xpNeeded:oe.xpForLevel(i),displayTraits:oe.getUnlockedDisplayTraits(i).map(d=>({id:d.id,name:d.name,description:d.description,level:d.unlockedAtLevel,surface:d.surface}))});for(let d of c)d.type==="molt"?t.sendNotification("pet.reaction",{text:`\u5BA0\u7269\u8715\u53D8\uFF1A\u7B2C ${d.moltStage} \u9636\u6BB5`,style:"excited"}):d.type==="display_trait_unlock"&&d.displayTrait&&t.sendNotification("pet.reaction",{text:`Display trait unlocked: ${d.displayTrait.name}`,style:"excited"})}catch{}},async reactAfterTurn(r){try{let o=new xt(t.getActiveProjectRoot()).load(),s=t.resolveClientForPurpose("smallModel");if(o&&s){let a=[...r].reverse().find(d=>d.role==="assistant"),c=typeof a?.content=="string"?a.content.slice(0,100):"Task completed.",l=await Ro({turnSummary:c,soul:o},async(d,p)=>await e(s,{model:s.model,messages:[{role:"user",content:d}],maxTokens:p})||null);if(l){t.sendNotification("pet.reaction",{text:l.text,style:l.style,duration:1e4});return}}let i=ko("turn.end");i&&t.sendNotification("pet.reaction",{text:i.text,style:i.style,duration:1e4})}catch{}},isActive(){return new xt(t.getActiveProjectRoot()).load()!==null}}}He();var QF=[{purpose:"imageGeneration",capability:"image"},{purpose:"tts",capability:"tts"},{purpose:"videoGeneration",capability:"video"},{purpose:"musicGeneration",capability:"music"},{purpose:"threeDGeneration",capability:"3d"},{purpose:"stt",capability:"stt"},{purpose:"voiceClone",capability:"voice_clone"}];function ZF(t){let e={};for(let{purpose:r,capability:n}of QF){let o=t.getBinding(r);o&&(e[n]={provider:o.provider,model:o.nativeModelId??o.model})}return e}function eA(t){let{host:e,config:r,turnId:n}=t,o=D(),s=o.snapshotProviderKeys();e.currentMediaApiKeys=s;let i={...ZF(o),...r?.mediaProviders};Gd(e.mediaClient,s,(c,l,d)=>{e.sessionState?.addMediaUsage(c,l,d)},i,(c,l,d,p,u)=>{e.sendNotification("turn.media_progress",{turnId:n,taskId:c,mediaType:l,percent:d,status:p,...u?{provider:u}:{}})});let a=o.getActiveModel("textGeneration");a?(si(bv(a.provider,a.apiKey)),a.keyHandle.release({success:!0})):si(void 0)}function tA(t){let e=new vv,r=new yv({registry:e}),n=new ga,o=tr(),s=kb(o),i=new fa(n,s),a=Zw({getActiveProjectRoot:t.getActiveProjectRoot,resolveClientForPurpose:t.resolveClientForPurpose,sendNotification:t.sendNotification});return{providerRegistry:e,mediaClient:r,mediaPersistence:n,pathService:i,toolCatalog:o,toolBootstrap:s,petRuntime:a,configureTurnMedia:c=>eA({...c,host:{...c.host,mediaClient:r}}),ensureMemoryProvider:c=>Tp(c),closeMemoryProviders:eH}}function eH(t){let e=new Set;for(let r of[t.memoryProvider,t.memoryDreamProvider]){if(!r||e.has(r))continue;e.add(r);let n=r.close;if(typeof n=="function")try{n.call(r)}catch{}}}function rA(t){let e=tA({getActiveProjectRoot:t.getActiveProjectRoot,resolveClientForPurpose:t.resolveClientForPurpose,sendNotification:t.sendNotification});return Pw({verbose:t.verbose,toolBootstrap:e.toolBootstrap,log:t.log,sendNotification:t.sendNotification}),e}var tH="agent",nA=["general","explore","plan","code","research","verify"],rH={type:"object",properties:{agent:{type:"string",enum:["general","explore","plan","code","research","verify"],description:`Sub-agent type to fork:
|
|
1020
1020
|
- general: Full tool access, any task
|
|
1021
1021
|
- explore: Read-only codebase exploration (search, read, analyze)
|
|
1022
1022
|
- plan: Planning mode (explore + produce plan, no writes)
|
|
1023
1023
|
- code: Coding agent with full tool access
|
|
1024
1024
|
- research: Web research and information gathering
|
|
1025
|
-
- verify: Run tests, check builds, validate changes`},prompt:{type:"string",description:"Detailed task for the sub-agent. The sub-agent shares your conversation history as context (prompt cache shared). Be specific about what information to return in the final response."},description:{type:"string",description:"Short description (3-7 words) for status tracking."},maxTurns:{type:"number",description:"Max turns for the sub-agent. Defaults: general=200, explore=50, plan=80, code=200, research=30, verify=40."},background:{type:"boolean",description:"If true, runs in background and returns a task_id. Poll with task tool. Default: false."}},required:["agent","prompt"],additionalProperties:!1},
|
|
1025
|
+
- verify: Run tests, check builds, validate changes`},prompt:{type:"string",description:"Detailed task for the sub-agent. The sub-agent shares your conversation history as context (prompt cache shared). Be specific about what information to return in the final response."},description:{type:"string",description:"Short description (3-7 words) for status tracking."},maxTurns:{type:"number",description:"Max turns for the sub-agent. Defaults: general=200, explore=50, plan=80, code=200, research=30, verify=40."},background:{type:"boolean",description:"If true, runs in background and returns a task_id. Poll with task tool. Default: false."}},required:["agent","prompt"],additionalProperties:!1},oA=4;function sA(t){return{name:tH,label:"Sub-Agent",description:"Fork a sub-agent to handle complex tasks autonomously. Sub-agents share your conversation context (prompt cache) and have isolated tool state. Use for: parallel research, code exploration, testing, delegating large tasks to specialized agents.",parameters:rH,searchHint:"fork subagent delegate spawn child parallel worker",isConcurrencySafe:!0,execute:async(e,r)=>{if(!r.prompt||r.prompt.trim().length<10)return{content:[{type:"text",text:"Error: prompt must be at least 10 characters."}],details:{type:"agent",error:"prompt_too_short"}};if(!nA.includes(r.agent))return{content:[{type:"text",text:`Error: unknown agent "${r.agent}". Available: ${nA.join(", ")}`}],details:{type:"agent",error:"invalid_agent_type"}};let n=t.currentForkDepth??0;if(n>=oA)return{content:[{type:"text",text:`Error: maximum fork depth (${oA}) reached. Cannot spawn more sub-agents. Complete current work instead.`}],details:{type:"agent",error:"max_depth_reached",depth:n}};try{let o=await t.forkAgent({agent:r.agent,prompt:r.prompt.trim(),description:r.description,maxTurns:r.maxTurns,background:r.background,abortSignal:t.abortSignal});if(r.background&&o.status==="running")return{content:[{type:"text",text:`Sub-agent "${r.agent}" started in background.
|
|
1026
1026
|
Agent ID: ${o.agentId}
|
|
1027
1027
|
Use task tool with this ID to check status and get output.`}],details:{type:"agent",agentId:o.agentId,status:"running",background:!0}};if(o.status==="failed")return{content:[{type:"text",text:`Sub-agent failed: ${o.error||"unknown error"}`}],details:{type:"agent",agentId:o.agentId,status:"failed",error:o.error}};let s=o.output||"(sub-agent returned no output)",i=o.maxTurnsReached?`
|
|
1028
1028
|
|
|
1029
|
-
[Note: Sub-agent reached turn limit. Output may be incomplete.]`:"";return{content:[{type:"text",text:s+i}],details:{type:"agent",agentId:o.agentId,status:"completed",tokensUsed:o.tokensUsed,maxTurnsReached:o.maxTurnsReached}}}catch(o){let s=o instanceof Error?o.message:String(o);return{content:[{type:"text",text:`Sub-agent execution failed: ${s}`}],details:{type:"agent",error:"execution_error",message:s}}}}}}import{randomUUID as nH}from"node:crypto";function
|
|
1029
|
+
[Note: Sub-agent reached turn limit. Output may be incomplete.]`:"";return{content:[{type:"text",text:s+i}],details:{type:"agent",agentId:o.agentId,status:"completed",tokensUsed:o.tokensUsed,maxTurnsReached:o.maxTurnsReached}}}catch(o){let s=o instanceof Error?o.message:String(o);return{content:[{type:"text",text:`Sub-agent execution failed: ${s}`}],details:{type:"agent",error:"execution_error",message:s}}}}}}import{randomUUID as nH}from"node:crypto";function iA({host:t,hooks:e,log:r,toolCatalog:n,toolInvoker:o}){return{abortSignal:void 0,currentForkDepth:0,forkAgent:async s=>{let i=Xn(s.agent);if(!i)return{agentId:"",status:"failed",error:`Unknown agent type: ${s.agent}`};if(!t.agent||!t.currentTransport||!t.currentApiKey||!t.currentModel)return{agentId:"",status:"failed",error:"No LLM provider configured"};let a=n.getToolNames(),c=pl(a,i),d=n.getToolManifest().filter(h=>c.includes(h.function.name)),p=Hd(d,!0),u=s.maxTurns??i.maxTurns??200;if(ht.isTeamBudgetExceeded())return{agentId:`fork-${s.agent}-budget-exceeded`,status:"failed",output:void 0,error:ht.teamBudgetExceededError(),tokensUsed:0};let m=await Qr({promptMessages:[{role:"user",content:s.prompt}],tools:p,transport:t.currentTransport,toolInvoker:o,createAgentRunner:sn,apiKey:t.currentApiKey,model:t.currentModel,log:r,hooks:e,forkLabel:`agent-${s.agent}`,maxTurns:u,parentSignal:s.abortSignal,parentDepth:0,onEvent:h=>{h.type==="delta"&&h.text&&t.sendNotification("turn.subagent_delta",{agentType:s.agent,text:h.text})}}),f=m.events.filter(h=>h.type==="end"&&"content"in h).map(h=>h.content??"").join("")||m.events.filter(h=>h.type==="delta"&&"text"in h).map(h=>h.text).join(""),g=m.totalUsage.inputTokens+m.totalUsage.outputTokens;return ht.recordForkTokens(g),{agentId:`fork-${s.agent}-${nH().slice(0,8)}`,status:m.ok?"completed":"failed",output:f||void 0,error:m.error,tokensUsed:g}}}}function aA({host:t,hooks:e,log:r,toolCatalog:n,toolInvoker:o}){n.addTool(sA(iA({host:t,hooks:e,log:r,toolCatalog:n,toolInvoker:o})))}var oH="checkpoint",sH={type:"object",properties:{action:{type:"string",enum:["create","list","restore","diff"],description:"Action: create (snapshot current state), list (show checkpoints), restore (revert to checkpoint), diff (show changes since checkpoint)."},checkpointId:{type:"string",description:"Checkpoint ID. Required for restore and diff."},message:{type:"string",description:"Optional descriptive message for the checkpoint."},paths:{type:"array",items:{type:"string"},description:"File paths to restore (partial restore). Omit to restore everything."}},required:["action"]},cA=/^[0-9a-fA-F]{4,64}$/;function lA(t){return{name:oH,label:"Checkpoint",description:"Manage workspace checkpoints (shadow snapshots independent of user's git). Create snapshots before risky operations, list history, restore on errors, or diff to see what changed. Checkpoints do NOT affect user's .git.",parameters:sH,execute:async(e,r)=>{switch(r.action){case"create":{let n=await t.createCheckpoint(r.message);return n.success?{content:[{type:"text",text:`Checkpoint created: ${n.checkpoint.id}
|
|
1030
1030
|
Message: ${n.checkpoint.message}
|
|
1031
1031
|
Files: ${n.checkpoint.fileCount}`}],details:{type:"checkpoint",action:"create",checkpointId:n.checkpoint.id}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"checkpoint",error:n.error}}}case"list":{let n=await t.listCheckpoints();if(!n.checkpoints||n.checkpoints.length===0)return{content:[{type:"text",text:"No checkpoints available."}],details:{type:"checkpoint",action:"list",count:0}};let o=[`Checkpoints (${n.checkpoints.length}):`,""];for(let s of n.checkpoints)o.push(`- ${s.id.slice(0,8)} [${s.timestamp}] ${s.message} (${s.fileCount} files)`);return{content:[{type:"text",text:o.join(`
|
|
1032
|
-
`)}],details:{type:"checkpoint",action:"list",count:n.checkpoints.length}}}case"restore":{if(!r.checkpointId)return{content:[{type:"text",text:"Error: checkpointId required for restore."}],details:{type:"checkpoint",error:"missing_id"}};if(!
|
|
1033
|
-
`).map(a=>{let[c="",l="",...d]=a.split("|");return{id:c,timestamp:l,message:d.join("|"),fileCount:0}})}:{success:!0,checkpoints:[]}}catch(n){return{success:!1,error:n.message}}},restoreCheckpoint:async(n,o)=>{try{let{execSync:s}=await import("node:child_process");if(o&&o.length>0){s(`git checkout ${n} ${o.map(i=>`"${i.replace(/"/g,'\\"')}"`).join(" ")}`,{cwd:r,stdio:"pipe"});for(let i of o){let a=
|
|
1032
|
+
`)}],details:{type:"checkpoint",action:"list",count:n.checkpoints.length}}}case"restore":{if(!r.checkpointId)return{content:[{type:"text",text:"Error: checkpointId required for restore."}],details:{type:"checkpoint",error:"missing_id"}};if(!cA.test(r.checkpointId))return{content:[{type:"text",text:"Error: invalid checkpoint ID format."}],details:{type:"checkpoint",error:"invalid_id"}};let n=await t.restoreCheckpoint(r.checkpointId,r.paths);if(!n.success)return{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"checkpoint",error:n.error}};let o=r.paths?`(${r.paths.length} files)`:"(full workspace)";return{content:[{type:"text",text:`Restored to checkpoint ${r.checkpointId.slice(0,8)} ${o}`}],details:{type:"checkpoint",action:"restore",checkpointId:r.checkpointId}}}case"diff":{if(!r.checkpointId)return{content:[{type:"text",text:"Error: checkpointId required for diff."}],details:{type:"checkpoint",error:"missing_id"}};if(!cA.test(r.checkpointId))return{content:[{type:"text",text:"Error: invalid checkpoint ID format."}],details:{type:"checkpoint",error:"invalid_id"}};let n=await t.diffCheckpoint(r.checkpointId);return n.success?{content:[{type:"text",text:n.diff||"(no changes since checkpoint)"}],details:{type:"checkpoint",action:"diff",checkpointId:r.checkpointId}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"checkpoint",error:n.error}}}default:return{content:[{type:"text",text:`Error: unknown action "${r.action}".`}],details:{type:"checkpoint",error:"unknown_action"}}}}}}G();import*as Je from"node:fs";import*as An from"node:path";function dA(t,e){let r=lm(t,e);return{createCheckpoint:async n=>{try{Je.mkdirSync(r,{recursive:!0});let{execSync:o}=await import("node:child_process"),s=An.join(r,".git");Je.existsSync(s)||(o("git init",{cwd:r,stdio:"pipe"}),o('git config user.email "checkpoint@agent"',{cwd:r,stdio:"pipe"}),o('git config user.name "Checkpoint"',{cwd:r,stdio:"pipe"})),Je.cpSync(t,r,{recursive:!0,filter:l=>!l.includes(".git")&&!l.includes("node_modules")}),o("git add -A",{cwd:r,stdio:"pipe"});let i=n||`checkpoint ${new Date().toISOString()}`;o(`git commitallow-empty -m "${i.replace(/"/g,'\\"')}"`,{cwd:r,stdio:"pipe"});let a=o("git rev-parse HEAD",{cwd:r,stdio:"pipe"}).toString().trim(),c=parseInt(o("git ls-files | wc -l",{cwd:r,stdio:"pipe"}).toString().trim(),10)||0;return{success:!0,checkpoint:{id:a,message:i,timestamp:new Date().toISOString(),fileCount:c}}}catch(o){return{success:!1,error:o.message}}},listCheckpoints:async()=>{try{let{execSync:n}=await import("node:child_process"),o=An.join(r,".git");if(!Je.existsSync(o))return{success:!0,checkpoints:[]};let s=n('git logformat="%H|%aI|%s"max-count=20',{cwd:r,stdio:"pipe"}).toString().trim();return s?{success:!0,checkpoints:s.split(`
|
|
1033
|
+
`).map(a=>{let[c="",l="",...d]=a.split("|");return{id:c,timestamp:l,message:d.join("|"),fileCount:0}})}:{success:!0,checkpoints:[]}}catch(n){return{success:!1,error:n.message}}},restoreCheckpoint:async(n,o)=>{try{let{execSync:s}=await import("node:child_process");if(o&&o.length>0){s(`git checkout ${n} ${o.map(i=>`"${i.replace(/"/g,'\\"')}"`).join(" ")}`,{cwd:r,stdio:"pipe"});for(let i of o){let a=An.join(r,i),c=An.join(t,i);Je.existsSync(a)&&Je.cpSync(a,c,{recursive:!0})}}else{s(`git checkout ${n} .`,{cwd:r,stdio:"pipe"});let i=Je.readdirSync(t);for(let a of i){if(a===".git"||a==="node_modules")continue;let c=An.join(t,a);Je.rmSync(c,{recursive:!0,force:!0})}Je.cpSync(r,t,{recursive:!0,filter:a=>!a.includes(".git")})}return{success:!0}}catch(s){return{success:!1,error:s.message}}},diffCheckpoint:async n=>{try{let{execSync:o}=await import("node:child_process");return{success:!0,diff:o(`git diff ${n} HEAD`,{cwd:r,stdio:"pipe"}).toString()}}catch(o){return{success:!1,error:o.message}}}}}function uA(t){let e=typeof t.config.workdir=="string"?t.config.workdir:t.cwd??process.cwd();return dA(e,t.sessionId||"default")}function pA({config:t,host:e,toolCatalog:r}){r.addTool(lA(uA({config:t,sessionId:e.currentSessionId})))}var iH="config",aH={type:"object",properties:{action:{type:"string",enum:["get","set","list","reset"],description:`Action:
|
|
1034
1034
|
- get: Read a config setting
|
|
1035
1035
|
- set: Write a config setting
|
|
1036
1036
|
- list: List all available settings
|
|
1037
|
-
- reset: Reset a setting to default`},key:{type:"string",description:"Config key path (e.g. 'model', 'language', 'theme', 'permissions.mode', 'permissions.defaultBehavior'). Required for get/set/reset."},value:{description:"Value to set. Type depends on the setting. Required for 'set' action."}},required:["action"]},Lo=["permissions.securityPolicy","api.key","api.secret","auth.token","system.adminMode"];function
|
|
1037
|
+
- reset: Reset a setting to default`},key:{type:"string",description:"Config key path (e.g. 'model', 'language', 'theme', 'permissions.mode', 'permissions.defaultBehavior'). Required for get/set/reset."},value:{description:"Value to set. Type depends on the setting. Required for 'set' action."}},required:["action"]},Lo=["permissions.securityPolicy","api.key","api.secret","auth.token","system.adminMode"];function mA(t){return{name:iH,label:"Config",description:"Read and write agent configuration settings. Supports preferences like model selection, language, theme, tool enablement, etc. Security-critical settings (API keys, permissions) are read-only. Changes persist across sessions.",parameters:aH,execute:async(e,r)=>{switch(r.action){case"get":{if(!r.key)return{content:[{type:"text",text:"Error: key is required for get."}],details:{type:"config",error:"missing_key"}};if(t.isValidKey&&!t.isValidKey(r.key))return{content:[{type:"text",text:`Error: unknown config key "${r.key}". Use action='list' to see available settings.`}],details:{type:"config",error:"unknown_key"}};let n=await t.getConfig(r.key);if(!n.success)return{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"config",error:n.error}};let o=n.setting,s=[`${o.key} = ${JSON.stringify(o.value)}`,` Type: ${o.type}${o.options?` (${o.options.join(" | ")})`:""}`,` ${o.description}`];return o.readOnly&&s.push(" \u26A0\uFE0F Read-only (cannot be changed)"),{content:[{type:"text",text:s.join(`
|
|
1038
1038
|
`)}],details:{type:"config",action:"get",key:r.key,value:o.value}}}case"set":{if(!r.key)return{content:[{type:"text",text:"Error: key is required for set."}],details:{type:"config",error:"missing_key"}};if(r.value===void 0)return{content:[{type:"text",text:"Error: value is required for set."}],details:{type:"config",error:"missing_value"}};if(Lo.includes(r.key))return{content:[{type:"text",text:`Error: "${r.key}" is a security-critical setting and cannot be modified.`}],details:{type:"config",error:"readonly_key"}};if(t.isValidKey&&!t.isValidKey(r.key))return{content:[{type:"text",text:`Error: unknown config key "${r.key}".`}],details:{type:"config",error:"unknown_key"}};let n=await t.setConfig(r.key,r.value);return n.success?{content:[{type:"text",text:`Updated "${r.key}": ${JSON.stringify(n.previousValue)} \u2192 ${JSON.stringify(r.value)}`}],details:{type:"config",action:"set",key:r.key,previousValue:n.previousValue,newValue:r.value}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"config",error:n.error}}}case"list":{let n=await t.listConfig();if(!n.settings||n.settings.length===0)return{content:[{type:"text",text:"No config settings available."}],details:{type:"config",action:"list",count:0}};let o=[`Available settings (${n.settings.length}):`,""];for(let s of n.settings){let i=s.readOnly?" [read-only]":"",a=JSON.stringify(s.value);o.push(` ${s.key} = ${a}${i}`),o.push(` ${s.description}`)}return{content:[{type:"text",text:o.join(`
|
|
1039
|
-
`)}],details:{type:"config",action:"list",count:n.settings.length}}}case"reset":{if(!r.key)return{content:[{type:"text",text:"Error: key is required for reset."}],details:{type:"config",error:"missing_key"}};if(Lo.includes(r.key))return{content:[{type:"text",text:`Error: "${r.key}" cannot be reset (security-critical).`}],details:{type:"config",error:"readonly_key"}};let n=await t.resetConfig(r.key);return n.success?{content:[{type:"text",text:`Reset "${r.key}" to default: ${JSON.stringify(n.setting?.value)}`}],details:{type:"config",action:"reset",key:r.key,value:n.setting?.value}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"config",error:n.error}}}default:return{content:[{type:"text",text:`Error: unknown action "${r.action}".`}],details:{type:"config",error:"unknown_action"}}}}}}import*as Ta from"node:fs";import*as
|
|
1039
|
+
`)}],details:{type:"config",action:"list",count:n.settings.length}}}case"reset":{if(!r.key)return{content:[{type:"text",text:"Error: key is required for reset."}],details:{type:"config",error:"missing_key"}};if(Lo.includes(r.key))return{content:[{type:"text",text:`Error: "${r.key}" cannot be reset (security-critical).`}],details:{type:"config",error:"readonly_key"}};let n=await t.resetConfig(r.key);return n.success?{content:[{type:"text",text:`Reset "${r.key}" to default: ${JSON.stringify(n.setting?.value)}`}],details:{type:"config",action:"reset",key:r.key,value:n.setting?.value}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"config",error:n.error}}}default:return{content:[{type:"text",text:`Error: unknown action "${r.action}".`}],details:{type:"config",error:"unknown_action"}}}}}}import*as Ta from"node:fs";import*as gA from"node:path";function fA(t){let e=t.configFilePath??I().getUserSettingsPath(),r=new Map([["model",{key:"model",value:t.currentModel??"",type:"string",description:"Default LLM model"}],["language",{key:"language",value:"zh-cn",type:"string",description:"UI / response language"}],["verbose",{key:"verbose",value:t.verbose,type:"boolean",description:"Enable verbose logging"}],["maxRounds",{key:"maxRounds",value:25,type:"number",description:"Default max tool-call rounds per turn"}],["theme",{key:"theme",value:"auto",type:"enum",description:"Color theme",options:["auto","light","dark"]}]]),n=async()=>{try{return JSON.parse(await Ta.promises.readFile(e,"utf8"))}catch{return{}}},o=async s=>{await Ta.promises.mkdir(gA.dirname(e),{recursive:!0}),await Ta.promises.writeFile(e,JSON.stringify(s,null,2),"utf8")};return{getConfig:async s=>{let i=r.get(s);if(!i)return{success:!1,error:`Unknown key: ${s}`};let a=await n(),c=s in a?a[s]:i.value;return{success:!0,setting:{...i,value:c,readOnly:Lo.includes(s)}}},setConfig:async(s,i)=>{let a=r.get(s);if(!a)return{success:!1,error:`Unknown key: ${s}`};let c=await n(),l=s in c?c[s]:a.value;return c[s]=i,await o(c),{success:!0,previousValue:l,setting:{...a,value:i}}},listConfig:async()=>{let s=await n();return{success:!0,settings:[...r.values()].map(a=>({...a,value:a.key in s?s[a.key]:a.value,readOnly:Lo.includes(a.key)}))}},resetConfig:async s=>{let i=r.get(s);if(!i)return{success:!1,error:`Unknown key: ${s}`};let a=await n();return delete a[s],await o(a),{success:!0,setting:i}},isValidKey:s=>r.has(s)}}function hA({host:t,toolCatalog:e}){e.addTool(mA(fA({currentModel:t.currentModel,verbose:t.verbose})))}var cH="cron",lH={type:"object",properties:{action:{type:"string",enum:["create","list","get","update","delete","pause","resume","trigger"],description:"Workflow-backed action: create/list/get/update/delete/pause/resume/trigger."},jobId:{type:"string",description:"Job ID. Required for get/update/delete/pause/resume/trigger."},prompt:{type:"string",description:"Task prompt to execute on schedule. Required for create."},schedule:{type:"string",description:"Schedule expression for the unified workflow scheduler. Supports cron ('0 9 * * *') and shorthand ('5m', '1h', '1d'). Required for create."},name:{type:"string",description:"Human-readable job name."},enabled:{type:"boolean",description:"Whether the job is enabled (for update)."}},required:["action"]},yA=50;function vA(t){return{name:cH,label:"Cron",description:"Thin entry point for scheduled workflows. Create recurring agent workflows with cron expressions or shorthand ('5m', '1h', '0 9 * * *'). Jobs persist in .qlogicagent/workflows. Actions: create, list, get, update, delete, pause, resume, trigger (run now).",parameters:lH,execute:async(e,r)=>{switch(r.action){case"create":{let n=r;if(!r.prompt)return{content:[{type:"text",text:"Error: prompt is required for create."}],details:{type:"cron",error:"missing_prompt"}};if(!r.schedule)return{content:[{type:"text",text:"Error: schedule is required for create."}],details:{type:"cron",error:"missing_schedule"}};if(t.validateSchedule){let i=t.validateSchedule(r.schedule);if(i)return{content:[{type:"text",text:`Error: invalid schedule \u2014 ${i}`}],details:{type:"cron",error:"invalid_schedule"}}}let o=await t.listJobs();if(o.jobs&&o.jobs.length>=yA)return{content:[{type:"text",text:`Error: maximum ${yA} jobs reached. Delete unused jobs first.`}],details:{type:"cron",error:"max_jobs_reached"}};let s=await t.createJob({prompt:r.prompt,schedule:r.schedule,name:r.name,repeat:n.repeat,allowedTools:n.allowedTools});return s.success?{content:[{type:"text",text:wp(s.job)}],details:{type:"cron",action:"create",jobId:s.job.id}}:{content:[{type:"text",text:`Error: ${s.error}`}],details:{type:"cron",error:s.error}}}case"list":{let n=await t.listJobs();if(!n.jobs||n.jobs.length===0)return{content:[{type:"text",text:"No scheduled jobs."}],details:{type:"cron",action:"list",count:0}};let o=[`Scheduled jobs (${n.jobs.length}):`,""];for(let s of n.jobs)o.push(`- **${s.name||s.id}** [${s.state}] ${s.scheduleDisplay} \u2014 next: ${s.nextRunAt||"N/A"}`);return{content:[{type:"text",text:o.join(`
|
|
1040
1040
|
`)}],details:{type:"cron",action:"list",count:n.jobs.length}}}case"get":{if(!r.jobId)return{content:[{type:"text",text:"Error: jobId required."}],details:{type:"cron",error:"missing_jobId"}};let n=await t.getJob(r.jobId);return n.success?{content:[{type:"text",text:wp(n.job)}],details:{type:"cron",action:"get",jobId:r.jobId}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"cron",error:n.error}}}case"update":{if(!r.jobId)return{content:[{type:"text",text:"Error: jobId required."}],details:{type:"cron",error:"missing_jobId"}};let n=r,o={};r.prompt!==void 0&&(o.prompt=r.prompt),r.schedule!==void 0&&(o.schedule=r.schedule),r.name!==void 0&&(o.name=r.name),r.enabled!==void 0&&(o.enabled=r.enabled),n.repeat!==void 0&&(o.repeat=n.repeat),n.allowedTools!==void 0&&(o.allowedTools=n.allowedTools);let s=await t.updateJob(r.jobId,o);return s.success?{content:[{type:"text",text:`Job updated.
|
|
1041
1041
|
${wp(s.job)}`}],details:{type:"cron",action:"update",jobId:r.jobId}}:{content:[{type:"text",text:`Error: ${s.error}`}],details:{type:"cron",error:s.error}}}case"delete":{if(!r.jobId)return{content:[{type:"text",text:"Error: jobId required."}],details:{type:"cron",error:"missing_jobId"}};let n=await t.deleteJob(r.jobId);return n.success?{content:[{type:"text",text:`Job ${r.jobId} deleted.`}],details:{type:"cron",action:"delete",jobId:r.jobId}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"cron",error:n.error}}}case"pause":{if(!r.jobId)return{content:[{type:"text",text:"Error: jobId required."}],details:{type:"cron",error:"missing_jobId"}};let n=await t.pauseJob(r.jobId);return n.success?{content:[{type:"text",text:`Job ${r.jobId} paused.`}],details:{type:"cron",action:"pause",jobId:r.jobId}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"cron",error:n.error}}}case"resume":{if(!r.jobId)return{content:[{type:"text",text:"Error: jobId required."}],details:{type:"cron",error:"missing_jobId"}};let n=await t.resumeJob(r.jobId);return n.success?{content:[{type:"text",text:`Job ${r.jobId} resumed.`}],details:{type:"cron",action:"resume",jobId:r.jobId}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"cron",error:n.error}}}case"trigger":{if(!r.jobId)return{content:[{type:"text",text:"Error: jobId required."}],details:{type:"cron",error:"missing_jobId"}};let n=await t.triggerJob(r.jobId);return n.success?{content:[{type:"text",text:`Job ${r.jobId} triggered (running now).`}],details:{type:"cron",action:"trigger",jobId:r.jobId}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"cron",error:n.error}}}default:return{content:[{type:"text",text:`Error: unknown action "${r.action}".`}],details:{type:"cron",error:"unknown_action"}}}}}}function wp(t){let e=[`Job: ${t.name||t.id}`,`ID: ${t.id}`,`Schedule: ${t.scheduleDisplay} (${t.schedule})`,`State: ${t.state}`];return t.nextRunAt&&e.push(`Next run: ${t.nextRunAt}`),t.lastRunAt&&e.push(`Last run: ${t.lastRunAt} (${t.lastStatus||"unknown"})`),e.push(`Prompt: ${t.prompt.slice(0,100)}${t.prompt.length>100?"...":""}`),e.join(`
|
|
1042
|
-
`)}import{randomUUID as dH}from"node:crypto";var uH=()=>{throw new Error("cron workflow service: running requires the initialized workflow engine")};function
|
|
1042
|
+
`)}import{randomUUID as dH}from"node:crypto";var uH=()=>{throw new Error("cron workflow service: running requires the initialized workflow engine")};function kA(t){let e=t.idFactory??(()=>dH().slice(0,8));function r(){let n=new gr(t.getProjectRoot()),o=hi();return{controller:new pr(n,uH),live:o,store:n}}return{async createJob(n){let o=bA(n);if(o)return o;let s=Ap(n.schedule),i=Pp(s);if(i)return{success:!1,error:i};let a=`cron_${e().slice(0,8)}`,c=n.name??`Scheduled task ${a}`,l=pH(a,n.prompt),{controller:d,store:p}=r();try{await d.create({id:a,name:c,def:l,active:!1,concurrency:"queue"}),await d.patch(a,{patch:[{op:"set_trigger",trigger:{type:"schedule",cron:s}},{op:"set_meta",meta:{active:!0}}]});let u=await p.require(a);return{success:!0,job:Wr(u)}}catch(u){throw await p.delete(a),u}},async listJobs(){return{success:!0,jobs:(await r().store.list()).filter(RA).map(o=>Wr(o))}},async getJob(n){let o=await Pn(r().store,n);return o?{success:!0,job:Wr(o)}:{success:!1,error:`Scheduled workflow not found: ${n}`}},async updateJob(n,o){let s=bA(o);if(s)return s;let{controller:i,store:a}=r(),c=await Pn(a,n);if(!c)return{success:!1,error:`Scheduled workflow not found: ${n}`};let l=[],d,p;if(o.prompt!==void 0&&(d=mH(c.def,o.prompt)),o.name!==void 0&&(p=o.name),o.schedule!==void 0){let u=Ap(o.schedule),m=Pp(u);if(m)return{success:!1,error:m};l.push({op:"set_trigger",trigger:{type:"schedule",cron:u}})}return o.enabled!==void 0&&l.push({op:"set_meta",meta:{active:o.enabled}}),(d||p!==void 0)&&await i.update(n,{def:d,name:p}),l.length>0&&await i.patch(n,{patch:l}),{success:!0,job:Wr(await a.require(n))}},async deleteJob(n){let{store:o}=r();return await Pn(o,n)?(await o.delete(n),{success:!0}):{success:!1,error:`Scheduled workflow not found: ${n}`}},async pauseJob(n){let{controller:o,store:s}=r();return await Pn(s,n)?{success:!0,job:Wr(await o.setActive(n,!1))}:{success:!1,error:`Scheduled workflow not found: ${n}`}},async resumeJob(n){let{controller:o,store:s}=r();return await Pn(s,n)?{success:!0,job:Wr(await o.setActive(n,!0))}:{success:!1,error:`Scheduled workflow not found: ${n}`}},async triggerJob(n){let{live:o,store:s}=r(),i=await Pn(s,n);if(!i)return{success:!1,error:`Scheduled workflow not found: ${n}`};if(!o)throw new Error("cron trigger requires the initialized workflow engine; activate/run from the app host");let a={type:"manual",payload:{source:"cron.trigger"}},c=await o.run(n,a);return{success:!0,job:Wr(i,c.status==="completed"?"success":"error")}},validateSchedule(n){return Pp(Ap(n))}}}function pH(t,e){return{id:t,nodes:[{id:"trigger",kind:"trigger",name:"Schedule trigger"},{id:"agent",kind:"agent",name:"Run prompt",params:{prompt:e}}],edges:[{from:"trigger",to:"agent"}]}}function mH(t,e){let r=t.nodes.map(n=>n.kind!=="agent"?n:{...n,params:{...n.params??{},prompt:e}});if(!r.some(n=>n.kind==="agent"))throw new Error(`Scheduled workflow "${t.id}" has no agent node to update`);return{...t,nodes:r}}function gH(t){let r=t.nodes.find(n=>n.kind==="agent")?.params?.prompt;return typeof r=="string"?r:""}function Ap(t){let e=t.trim(),r=/^(\d+)([smhd])$/.exec(e);if(!r)return e;let n=Number(r[1]),o=r[2];if(!Number.isInteger(n)||n<=0)return e;switch(o){case"s":return`*/${n} * * * * *`;case"m":return`*/${n} * * * *`;case"h":return`0 */${n} * * *`;case"d":return`0 0 */${n} * *`;default:return e}}function Pp(t){let e=nu(t);return e.length===0?null:e.join("; ")}function RA(t){return t.trigger?.type==="schedule"}async function Pn(t,e){let r=await t.load(e);return r&&RA(r)?r:void 0}function Wr(t,e=null){let r=t.trigger?.type==="schedule"?t.trigger.cron:"";return{id:t.id,name:t.name,prompt:gH(t.def),schedule:r,scheduleDisplay:r,state:t.active?"scheduled":"paused",enabled:t.active,lastStatus:e}}function bA(t){return t.repeat!==void 0&&t.repeat!==null?{success:!1,error:"repeat is not a cron-layer field in the unified workflow scheduler; model finite repeats inside the workflow graph"}:t.allowedTools!==void 0&&t.allowedTools.length>0?{success:!1,error:"allowedTools is not a cron-layer field in the unified workflow scheduler; enforce tool access through permission rules or workflow nodes"}:null}function SA({host:t,toolCatalog:e}){let r=kA({getProjectRoot:()=>t.getActiveProjectRoot()});e.addTool(vA(r))}var fH="monitor",hH={type:"object",properties:{action:{type:"string",enum:["start","stop","list"],description:"Action to perform: start a new monitor, stop an existing one, or list active monitors."},monitorId:{type:"string",description:"Identifier for the monitor instance. Required for start/stop."},source:{type:"string",enum:["process","file","task","custom"],description:"Type of event source to watch."},target:{type:"string",description:"Selector for the monitored target. For process: PID or background job id. For file: glob pattern. For task: task ID. For custom: host-defined key."},conditions:{type:"array",items:{type:"object",properties:{type:{type:"string",enum:["exit","output_match","file_changed","task_status"]},value:{type:"string"}},required:["type"]},description:"Conditions that trigger a wake-up notification."},timeoutSeconds:{type:"number",description:"Auto-stop after this many seconds (default: 3600).",minimum:1,maximum:86400}},required:["action"]};function TA(t){return{name:fH,label:"Monitor",shouldDefer:!0,description:["Set up event-driven monitoring to wake up when something happens.","","Use this to watch for:","\u2022 Background process completion or specific output patterns","\u2022 File system changes (new file, modification)","\u2022 Async task state transitions (pending \u2192 completed/failed)","\u2022 Custom host-defined events","","When a monitored condition triggers, you'll receive a notification in your next tick.","This is more efficient than polling with Sleep \u2014 you only wake up when there's work to do.","","Actions:","\u2022 start \u2014 register a new monitor (requires monitorId, source, target)","\u2022 stop \u2014 deregister an active monitor","\u2022 list \u2014 show all active monitors and their event counts"].join(`
|
|
1043
1043
|
`),parameters:hH,execute:async(e,r)=>{let{action:n}=r;if(n==="list"){let i=await t.listMonitors();return i.length===0?{content:[{type:"text",text:"No active monitors."}],details:{action:n,monitors:[]}}:{content:[{type:"text",text:`Active monitors:
|
|
1044
1044
|
${i.map(c=>`\u2022 ${c.monitorId} [${c.source}] \u2192 ${c.target} (events: ${c.eventCount}, timeout: ${c.timeoutSeconds}s)`).join(`
|
|
1045
|
-
`)}`}],details:{action:n,monitors:i}}}if(!r.monitorId)return{content:[{type:"text",text:"Error: monitorId is required for start/stop."}],details:{action:n,success:!1,error:"missing_monitor_id"}};if(n==="stop"){let i=await t.stopMonitor(r.monitorId);return{content:[{type:"text",text:i.success?`Monitor "${r.monitorId}" stopped.`:`Failed to stop monitor "${r.monitorId}": ${i.error??"not found"}`}],details:{...i}}}if(!r.source||!r.target)return{content:[{type:"text",text:"Error: source and target are required to start a monitor."}],details:{action:n,success:!1,error:"missing_source_or_target"}};let o=await t.startMonitor({monitorId:r.monitorId,source:r.source,target:r.target,conditions:r.conditions??[],timeoutSeconds:r.timeoutSeconds??3600});return{content:[{type:"text",text:o.success?`Monitor "${r.monitorId}" started: watching ${r.source} "${r.target}".`:`Failed to start monitor: ${o.error??"unknown"}`}],details:{...o}}}}}import*as
|
|
1045
|
+
`)}`}],details:{action:n,monitors:i}}}if(!r.monitorId)return{content:[{type:"text",text:"Error: monitorId is required for start/stop."}],details:{action:n,success:!1,error:"missing_monitor_id"}};if(n==="stop"){let i=await t.stopMonitor(r.monitorId);return{content:[{type:"text",text:i.success?`Monitor "${r.monitorId}" stopped.`:`Failed to stop monitor "${r.monitorId}": ${i.error??"not found"}`}],details:{...i}}}if(!r.source||!r.target)return{content:[{type:"text",text:"Error: source and target are required to start a monitor."}],details:{action:n,success:!1,error:"missing_source_or_target"}};let o=await t.startMonitor({monitorId:r.monitorId,source:r.source,target:r.target,conditions:r.conditions??[],timeoutSeconds:r.timeoutSeconds??3600});return{content:[{type:"text",text:o.success?`Monitor "${r.monitorId}" started: watching ${r.source} "${r.target}".`:`Failed to start monitor: ${o.error??"unknown"}`}],details:{...o}}}}}import*as wA from"node:fs";function AA(t){let e=new Map;return{async startMonitor(r){if(e.has(r.monitorId))return{action:"start",success:!1,error:`Monitor "${r.monitorId}" already exists.`};let n={monitorId:r.monitorId,source:r.source,target:r.target,conditions:r.conditions,startedAt:Date.now(),timeoutSeconds:r.timeoutSeconds,eventCount:0},o=()=>{};if(r.source==="file")try{let s=wA.watch(r.target,{persistent:!1},()=>{n.eventCount++,t.info(`[monitor] file change detected: ${r.target}`)});o=()=>s.close()}catch{return{action:"start",success:!1,error:`Cannot watch: ${r.target}`}}if(r.timeoutSeconds>0){let s=setTimeout(()=>{let a=e.get(r.monitorId);a&&(a.cleanup(),e.delete(r.monitorId))},r.timeoutSeconds*1e3),i=o;o=()=>{clearTimeout(s),i()}}return e.set(r.monitorId,{info:n,cleanup:o}),{action:"start",success:!0,monitorId:r.monitorId}},async stopMonitor(r){let n=e.get(r);return n?(n.cleanup(),e.delete(r),{action:"stop",success:!0,monitorId:r}):{action:"stop",success:!1,error:`Monitor "${r}" not found.`}},async listMonitors(){return[...e.values()].map(r=>r.info)},dispose(){for(let r of e.values())r.cleanup();e.clear()}}}function PA({log:t,toolCatalog:e}){let r=AA(t);Xt(async()=>r.dispose()),e.addTool(TA(r))}var yH="team",vH={type:"object",properties:{action:{type:"string",enum:["create","delete","list","status"],description:"Team action: create (new team), delete (disband), list (all teams), status (team details)."},teamName:{type:"string",description:"Team name. Required for create/delete/status."},description:{type:"string",description:"Team description/objective. Used for create."},members:{type:"array",description:"Team members with roles and tool restrictions.",items:{type:"object",properties:{name:{type:"string",description:"Agent name/role identifier."},role:{type:"string",description:"Role description (e.g. 'frontend developer')."},tools:{type:"array",items:{type:"string"},description:"Allowed tools for this member."}},required:["name","role"]}}},required:["action"]};function xA(t){return{name:yH,label:"Team",description:"Manage multi-agent teams. Create teams of specialized agents that collaborate via send_message. Each member has a role and optional tool restrictions. Use for complex tasks requiring parallel work.",parameters:vH,execute:async(e,r)=>{switch(r.action){case"create":{if(!r.teamName)return{content:[{type:"text",text:"Error: teamName required for create."}],details:{type:"team",error:"missing_name"}};let n=await t.createTeam({teamName:r.teamName,description:r.description,members:r.members});if(!n.success)return{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"team",error:n.error}};let o=[`Team "${n.team.name}" created.`,`Lead: ${n.team.leadId}`,`Members: ${n.team.members.length}`];for(let s of n.team.members)o.push(` - ${s.name} (${s.role})`);return{content:[{type:"text",text:o.join(`
|
|
1046
1046
|
`)}],details:{type:"team",action:"create",teamName:n.team.name}}}case"delete":{if(!r.teamName)return{content:[{type:"text",text:"Error: teamName required for delete."}],details:{type:"team",error:"missing_name"}};let n=await t.deleteTeam(r.teamName);return n.success?{content:[{type:"text",text:`Team "${r.teamName}" disbanded.`}],details:{type:"team",action:"delete",teamName:r.teamName}}:{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"team",error:n.error}}}case"list":{let n=await t.listTeams();if(!n.teams||n.teams.length===0)return{content:[{type:"text",text:"No active teams."}],details:{type:"team",action:"list",count:0}};let o=[`Active teams (${n.teams.length}):`,""];for(let s of n.teams)o.push(`- **${s.name}**: ${s.description||"(no description)"} \u2014 ${s.members.length} members`);return{content:[{type:"text",text:o.join(`
|
|
1047
1047
|
`)}],details:{type:"team",action:"list",count:n.teams.length}}}case"status":{if(!r.teamName)return{content:[{type:"text",text:"Error: teamName required for status."}],details:{type:"team",error:"missing_name"}};let n=await t.getTeamStatus(r.teamName);if(!n.success)return{content:[{type:"text",text:`Error: ${n.error}`}],details:{type:"team",error:n.error}};let o=n.team,s=n.memberProgress??{},i=[`Team: ${o.name}`,`Description: ${o.description||"\u2014"}`,`Lead: ${o.leadId}`,`Created: ${o.createdAt}`,"",`Members (${o.members.length}):`];for(let a of o.members){let c=a.tools?` [tools: ${a.tools.join(", ")}]`:"",l=a.worktreePath?` [worktree: ${a.worktreePath}]`:a.cwd?` [cwd: ${a.cwd}]`:"",d=s[a.name],p=a.isActive===!1?" (idle)":" (active)";if(d){let u=[];if(d.runningFor&&u.push(`running ${Math.round(d.runningFor/1e3)}s`),d.lastToolCall&&u.push(`tool: ${d.lastToolCall}`),d.idleFor!==void 0&&d.idleFor>5&&u.push(`idle ${d.idleFor}s`),d.mediaProgress){let m=d.mediaProgress;u.push(`${m.mediaType} ${m.percent}% [${m.status}] taskId=${m.taskId}${m.provider?` provider=${m.provider}`:""}`)}u.length&&(p=` (${u.join(", ")})`)}i.push(` - ${a.name} (${a.role})${c}${l}${p}`)}return{content:[{type:"text",text:i.join(`
|
|
1048
|
-
`)}],details:{type:"team",action:"status",teamName:o.name}}}default:return{content:[{type:"text",text:`Error: unknown action "${r.action}".`}],details:{type:"team",error:"unknown_action"}}}}}}import*as
|
|
1048
|
+
`)}],details:{type:"team",action:"status",teamName:o.name}}}default:return{content:[{type:"text",text:`Error: unknown action "${r.action}".`}],details:{type:"team",error:"unknown_action"}}}}}}import*as CA from"node:path";function IA(t,e){let r=new Map,n={info:s=>e.info(s),warn:s=>e.warn(s)},o=new dt({onNotification:(s,i,a)=>{t.sendNotification("team.member.notification",{memberId:s,method:i,params:a})},onStateChange:(s,i)=>{t.sendNotification("team.member.state",{memberId:s,state:i});let a=o.getHandle(s),l=o.getUsageTracker(s)?.getUsage();t.emitAgentStatus(s,i,{missedBeats:o.getMissedBeats(s),lastActivityAt:a?.lastActivityAt,usage:l&&l.totalTokens>0?{inputTokens:l.inputTokens,outputTokens:l.outputTokens,totalTokens:l.totalTokens}:void 0})},onExit:(s,i,a)=>{for(let c of r.values()){let l=c.members.find(d=>d.cwd&&Oo(c.name,d.name)===s);l&&(l.isActive=!1)}e.info(`[team] member ${s} exited (code=${i}, signal=${a})`)},onMcpToolCall:(s,i,a)=>t.handleMcpToolCall(s,i,a),log:{info:s=>e.info(s),warn:s=>e.warn(s),debug:s=>e.debug(s)},sessionDir:CA.join(I().getUserAgentHome(),"agent-logs")});return{async createTeam(s){if(r.has(s.teamName))return{success:!1,error:`Team "${s.teamName}" already exists.`};let i=await mo(),a=[];for(let l of s.members??[]){let d={...l,isActive:!0};if(i){let p=`team-${s.teamName}-${l.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase(),u=await Wy(i,p,n);u?(d.worktreePath=u.worktreePath,d.worktreeBranch=u.branch,d.cwd=u.worktreePath,e.info(`[team] provisioned worktree for ${l.name}: ${u.worktreePath}`)):(d.cwd=process.cwd(),e.warn(`[team] worktree provision failed for ${l.name}, using shared cwd`))}else d.cwd=process.cwd();a.push(d)}let c={name:s.teamName,description:s.description,leadId:t.currentSessionId??"default",members:a,createdAt:new Date().toISOString()};r.set(s.teamName,c);for(let l of a){if(!l.cwd)continue;let d=Oo(s.teamName,l.name);try{await o.spawn({memberId:d,name:l.name,cwd:l.cwd,prompt:`You are the "${l.name}" team member. Role: ${l.role}.`,agentType:l.role,verbose:t.verbose}),e.info(`[team] spawned child process for ${l.name} in ${l.cwd}`)}catch(p){e.warn(`[team] failed to spawn child process for ${l.name}: ${p instanceof Error?p.message:String(p)}`),l.isActive=!1}}return t.sendNotification("team.updated",{teamName:s.teamName,action:"created",members:c.members.map(l=>({agentName:l.name,role:l.role,worktreePath:l.worktreePath,pid:o.getHandle(Oo(s.teamName,l.name))?.pid}))}),{success:!0,team:c}},async deleteTeam(s){let i=r.get(s);if(!i)return{success:!1,error:`Team "${s}" not found.`};for(let c of i.members){let l=Oo(s,c.name);o.kill(l),o.remove(l)}let a=await mo();if(a)for(let c of i.members)c.worktreePath&&c.worktreeBranch&&(await Gy(a,c.worktreePath,c.worktreeBranch,n),e.info(`[team] cleaned up worktree for ${c.name}: ${c.worktreePath}`));return r.delete(s),t.sendNotification("team.updated",{teamName:s,action:"destroyed",members:[]}),{success:!0}},async listTeams(){return{success:!0,teams:[...r.values()]}},async getTeamStatus(s){let i=r.get(s);if(!i)return{success:!1,error:`Team "${s}" not found.`};let a={};for(let c of i.members){let l=Oo(s,c.name),d=o.getStatus(l);d&&(c.isActive=d.alive,a[c.name]={mediaProgress:d.mediaProgress,lastToolCall:d.lastToolCall,idleFor:d.idleFor,runningFor:d.runningFor})}return{success:!0,team:i,memberProgress:a}},dispose(){o.dispose()}}}function Oo(t,e){return`team-${t}-${e}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase()}function EA({host:t,log:e,toolCatalog:r}){let n=IA(t,e);Xt(async()=>n.dispose()),r.addTool(xA(n))}var bH="notify",kH={type:"object",properties:{message:{type:"string",description:"Notification content to send to the user."},title:{type:"string",description:"Optional notification title/subject line."},priority:{type:"string",enum:["low","normal","high"],description:"Notification priority (default: normal). High may trigger sound/vibration."},channel:{type:"string",description:"Target delivery channel (e.g. 'wechat', 'feishu', 'discord'). Default: user's primary."}},required:["message"]};function MA(t){return{name:bH,label:"Notify",description:"Send a notification to the user. Used for alerting about completed long-running tasks, important updates, or requesting attention. Supports multiple channels (WeChat, Feishu, Discord, etc).",parameters:kH,execute:async(e,r)=>{if(!r.message||r.message.trim().length===0)return{content:[{type:"text",text:"Error: message is required."}],details:{type:"notify",error:"empty_message"}};let n=await t.sendNotification({message:r.message.trim(),title:r.title,priority:r.priority||"normal",channel:r.channel});return n.delivered?{content:[{type:"text",text:`Notification sent via ${n.channel}.`}],details:{type:"notify",delivered:!0,channel:n.channel}}:{content:[{type:"text",text:`Notification failed: ${n.error||"delivery error"}`}],details:{type:"notify",delivered:!1,error:n.error}}}}}var RH="send_message",SH={type:"object",properties:{to:{type:"string",description:"Target agent name or '*' for broadcast to all team members. Must be a valid agent name within the current team."},message:{type:"string",description:"Message content to send to the target agent."},summary:{type:"string",description:"Optional short summary (for logging/routing)."}},required:["to","message"]};function _A(t){return{name:RH,label:"Send Message",description:"Send a message to another agent in your team. Use '*' to broadcast to all teammates. Messages are delivered asynchronously. Use for coordination, delegation, and status updates.",parameters:SH,execute:async(e,r)=>{if(!r.to||r.to.trim().length===0)return{content:[{type:"text",text:"Error: 'to' is required (agent name or '*')."}],details:{type:"send_message",error:"missing_target"}};if(!r.message||r.message.trim().length===0)return{content:[{type:"text",text:"Error: message is required."}],details:{type:"send_message",error:"empty_message"}};if(r.to!=="*"&&t.listTeammates){let s=t.listTeammates();if(!s.includes(r.to))return{content:[{type:"text",text:`Error: agent "${r.to}" not found in team. Available: ${s.join(", ")}`}],details:{type:"send_message",error:"target_not_found",available:s}}}let n=await t.sendMessage({to:r.to.trim(),message:r.message.trim(),summary:r.summary,senderId:t.getSenderId()});return n.success?{content:[{type:"text",text:`Message sent to ${r.to==="*"?`broadcast (${n.recipients?.length||0} recipients)`:r.to}.`}],details:{type:"send_message",success:!0,to:r.to,recipients:n.recipients}}:{content:[{type:"text",text:`Message delivery failed: ${n.error||"unknown error"}`}],details:{type:"send_message",success:!1,error:n.error}}}}}function DA({host:t,log:e,toolCatalog:r}){r.addTool(MA({sendNotification:async n=>(e.info(`[notify] ${n.title??""}: ${n.message}`),{delivered:!0,channel:n.channel??"cli"})})),r.addTool(_A({sendMessage:async n=>(e.info(`[send_message] ${n.senderId} -> ${n.to}: ${n.message}`),{success:!0,recipients:[n.to]}),getSenderId:()=>t.currentSessionId??"default",listTeammates:()=>[]}))}function NA(t){aA({host:{get agent(){return t.host.agent},get currentTransport(){return t.host.currentTransport},get currentApiKey(){return t.host.currentApiKey},get currentModel(){return t.host.currentModel},sendNotification:t.host.sendNotification.bind(t.host)},hooks:t.hooks,log:t.log,toolCatalog:t.toolCatalog,toolInvoker:t.toolInvoker}),hA({toolCatalog:t.toolCatalog,host:{currentModel:t.host.currentModel,verbose:t.host.verbose}}),SA({toolCatalog:t.toolCatalog,host:{getActiveProjectRoot:()=>t.host.getActiveProjectRoot()}}),PA({log:t.log,toolCatalog:t.toolCatalog}),pA({config:t.config,toolCatalog:t.toolCatalog,host:{currentSessionId:t.host.currentSessionId}}),EA({host:{get currentSessionId(){return t.host.currentSessionId},get verbose(){return t.host.verbose},sendNotification:t.host.sendNotification.bind(t.host),emitAgentStatus:t.host.emitAgentStatus.bind(t.host),handleMcpToolCall:t.host.handleMcpToolCall.bind(t.host)},log:t.log,toolCatalog:t.toolCatalog}),DA({toolCatalog:t.toolCatalog,host:{get currentSessionId(){return t.host.currentSessionId}},log:t.log})}var TH={id:"cli-core-tools",kind:"core",register:wH};function LA(t){TH.register(t)}function wH(t){let e={get agent(){return t.host.getAgent()},get currentTransport(){return t.host.getCurrentTransport()},get currentApiKey(){return t.host.getCurrentApiKey()},get currentModel(){return t.host.getCurrentModel()},get currentSessionId(){return t.host.getCurrentSessionId()},getActiveProjectRoot:()=>t.host.getActiveProjectRoot(),get verbose(){return t.host.getVerbose()},sendNotification(n,o){t.host.sendNotification(n,o)},emitAgentStatus(n,o,s){t.host.emitAgentStatus(n,o,s)},handleMcpToolCall(n,o,s){return t.host.handleMcpToolCall(n,o,s)}},r={config:t.config,host:e,hooks:t.hooks,log:t.log,toolCatalog:t.toolCatalog,toolInvoker:t.toolInvoker};NA(r)}var AH={type:"object",properties:{operation:{type:"string",enum:["goToDefinition","findReferences","hover","documentSymbol","diagnostics","completion","signatureHelp","rename","codeAction"],description:`LSP operation:
|
|
1049
1049
|
- goToDefinition: jump to symbol definition
|
|
1050
1050
|
- findReferences: find all usages of a symbol
|
|
1051
1051
|
- hover: get type/docs for symbol at position
|
|
@@ -1054,7 +1054,7 @@ ${i.map(c=>`\u2022 ${c.monitorId} [${c.source}] \u2192 ${c.target} (events: ${c.
|
|
|
1054
1054
|
- completion: get completions at position
|
|
1055
1055
|
- signatureHelp: get function signature at call site
|
|
1056
1056
|
- rename: preview rename of symbol
|
|
1057
|
-
- codeAction: get available quick-fixes/refactorings`},filePath:{type:"string",description:"File path. Absolute or relative to workspace root."},line:{type:"number",description:"Line number (1-indexed). Required for positional operations."},character:{type:"number",description:"Character position (1-indexed). Required for positional operations."},newName:{type:"string",description:"New name for rename operation."},includeContext:{type:"boolean",description:"Include surrounding code context in results (default: true)."}},required:["operation","filePath"]},
|
|
1057
|
+
- codeAction: get available quick-fixes/refactorings`},filePath:{type:"string",description:"File path. Absolute or relative to workspace root."},line:{type:"number",description:"Line number (1-indexed). Required for positional operations."},character:{type:"number",description:"Character position (1-indexed). Required for positional operations."},newName:{type:"string",description:"New name for rename operation."},includeContext:{type:"boolean",description:"Include surrounding code context in results (default: true)."}},required:["operation","filePath"]},PH=10*1024*1024,xH=["goToDefinition","findReferences","hover","completion","signatureHelp","rename","codeAction"];function OA(t){return{name:"lsp",label:"LSP",description:"Query language servers for code intelligence. Supports go-to-definition, find-references, hover (type info), document symbols, diagnostics (errors/warnings), completions, signature help, rename preview, and code actions. Read-only \u2014 does not modify files.",parameters:AH,execute:async(e,r)=>{if(!r.filePath||r.filePath.trim().length===0)return{content:[{type:"text",text:"Error: filePath is required."}],details:{type:"lsp",error:"missing_filePath"}};if(r.filePath.startsWith("\\\\")||r.filePath.startsWith("//"))return{content:[{type:"text",text:"Error: UNC paths are not allowed."}],details:{type:"lsp",error:"unc_blocked"}};if(xH.includes(r.operation)){if(r.line==null||r.character==null)return{content:[{type:"text",text:`Error: line and character are required for ${r.operation}.`}],details:{type:"lsp",error:"missing_position"}};if(r.line<1||r.character<1)return{content:[{type:"text",text:"Error: line and character must be \u2265 1."}],details:{type:"lsp",error:"invalid_position"}}}if(r.operation==="rename"&&!r.newName)return{content:[{type:"text",text:"Error: newName is required for rename operation."}],details:{type:"lsp",error:"missing_newName"}};let n=t.resolvePath(r.filePath);if(t.statFile){let s=await t.statFile(n);if(!s||!s.exists)return{content:[{type:"text",text:`Error: file not found: ${r.filePath}`}],details:{type:"lsp",error:"file_not_found"}};if(s.size>PH)return{content:[{type:"text",text:`Error: file too large (${(s.size/1024/1024).toFixed(1)}MB, max 10MB).`}],details:{type:"lsp",error:"file_too_large"}}}let o=await t.executeOperation({operation:r.operation,filePath:n,line:r.line,character:r.character,newName:r.newName,includeContext:r.includeContext??!0});return{content:[{type:"text",text:CH(r.operation,o)}],details:{type:"lsp",operation:r.operation}}}}}function CH(t,e){switch(e.type){case"locations":{if(e.locations.length===0)return"No results found.";let r=[`Found ${e.locations.length} location(s):`,""];for(let n of e.locations.slice(0,50))r.push(` ${n.filePath}:${n.line}:${n.character}`),n.context&&r.push(` ${n.context.trim()}`);return e.locations.length>50&&r.push(` ... and ${e.locations.length-50} more`),r.join(`
|
|
1058
1058
|
`)}case"symbols":{if(e.symbols.length===0)return"No symbols found.";let r=[`Document symbols (${e.symbols.length}):`,""];for(let n of e.symbols)if(r.push(` ${n.kind} ${n.name} (L${n.range.startLine}-${n.range.endLine})`),n.children){for(let o of n.children.slice(0,10))r.push(` ${o.kind} ${o.name} (L${o.range.startLine})`);n.children.length>10&&r.push(` ... and ${n.children.length-10} more`)}return r.join(`
|
|
1059
1059
|
`)}case"diagnostics":{if(e.diagnostics.length===0)return"No diagnostics (clean file).";let r=[`Diagnostics (${e.diagnostics.length}):`,""];for(let n of e.diagnostics){let o=n.severity==="error"?"\u274C":n.severity==="warning"?"\u26A0\uFE0F":"\u2139\uFE0F";r.push(` ${o} L${n.line}:${n.character} [${n.source||""}${n.code?`:${n.code}`:""}] ${n.message}`)}return r.join(`
|
|
1060
1060
|
`)}case"hover":return e.hover?e.hover.contents:"No hover information available.";case"completions":{if(e.completions.length===0)return"No completions available.";let r=[`Completions (${e.completions.length}):`,""];for(let n of e.completions.slice(0,20))r.push(` [${n.kind}] ${n.label}${n.detail?` \u2014 ${n.detail}`:""}`);return e.completions.length>20&&r.push(` ... and ${e.completions.length-20} more`),r.join(`
|
|
@@ -1068,17 +1068,17 @@ ${i.map(c=>`\u2022 ${c.monitorId} [${c.source}] \u2192 ${c.target} (events: ${c.
|
|
|
1068
1068
|
- exec(command): Promise<{stdout, stderr, exitCode}> \u2014 run shell command
|
|
1069
1069
|
- glob(pattern): Promise<string[]> \u2014 find files by glob
|
|
1070
1070
|
- grep(pattern, path?): Promise<{file,line,text}[]> \u2014 search files
|
|
1071
|
-
Use this for batch operations (rename many files, transform data, etc) to reduce tool call round-trips.`}},required:["code"]};var
|
|
1071
|
+
Use this for batch operations (rename many files, transform data, etc) to reduce tool call round-trips.`}},required:["code"]};var jA=1e5,$A=5e4;function UA(t){return{name:IH,label:"REPL",description:"Execute JavaScript in a persistent VM with built-in file/shell primitives. Use for batch operations that would otherwise require many individual tool calls. The VM persists variables between calls within the same session. Each primitive (readFile, writeFile, exec, etc.) still goes through permission checks.",parameters:EH,execute:async(e,r)=>{if(!r.code||r.code.trim().length===0)return{content:[{type:"text",text:"Error: code is required."}],details:{type:"repl",error:"empty_code"}};if(r.code.length>jA)return{content:[{type:"text",text:`Error: code too large (${r.code.length} chars, max ${jA}).`}],details:{type:"repl",error:"code_too_large"}};let n=await t.executeInVm(r.code),o=n.output||"";return o.length>$A&&(o=o.slice(0,$A)+`
|
|
1072
1072
|
... (truncated)`),n.error?{content:[{type:"text",text:`Error: ${n.error}
|
|
1073
1073
|
|
|
1074
1074
|
Output:
|
|
1075
|
-
${o}`}],details:{type:"repl",error:n.error,duration:n.duration}}:{content:[{type:"text",text:o||"(no output)"}],details:{type:"repl",duration:n.duration,outputLength:o.length}}}}}import*as wa from"node:path";function
|
|
1076
|
-
`).filter(Boolean).slice(0,100)){let u=p.match(/^(.+?):(\d+):(.*)$/);u&&a.push({file:u[1],line:parseInt(u[2],10),text:u[3]})}}catch{}return a},console:{log:(...s)=>s.map(String).join(" ")}},setTimeout,clearTimeout,Promise,JSON,Math,Date,Array,Object,String,Number,Boolean,RegExp,Map,Set,Error,Buffer})),e);return{executeInVm:async o=>{let s=Date.now();try{let i=n(),a=await
|
|
1075
|
+
${o}`}],details:{type:"repl",error:n.error,duration:n.duration}}:{content:[{type:"text",text:o||"(no output)"}],details:{type:"repl",duration:n.duration,outputLength:o.length}}}}}import*as wa from"node:path";function FA(t){let e=t.workdir;return{executeOperation:async r=>{switch(r.operation){case"goToDefinition":case"findReferences":return{type:"locations",locations:[]};case"hover":return{type:"hover",hover:null};case"documentSymbol":return{type:"symbols",symbols:[]};case"diagnostics":return{type:"diagnostics",diagnostics:[]};case"completion":return{type:"completions",completions:[]};case"signatureHelp":return{type:"signatureHelp",signatures:[]};case"rename":return{type:"rename",edits:[]};case"codeAction":return{type:"codeActions",actions:[]};default:return{type:"locations",locations:[]}}},resolvePath:r=>wa.isAbsolute(r)?r:wa.resolve(e,r)}}import*as jo from"node:fs";import*as xn from"node:path";import*as Aa from"node:vm";function HA(t){let e,r=t.workdir,n=()=>(e||(e=Aa.createContext({...{readFile:async s=>jo.promises.readFile(xn.resolve(r,s),"utf8"),writeFile:async(s,i)=>{await jo.promises.writeFile(xn.resolve(r,s),i,"utf8")},editFile:async(s,i)=>{let a=await jo.promises.readFile(xn.resolve(r,s),"utf8");for(let c of i)a=a.replace(c.oldText,c.newText);return await jo.promises.writeFile(xn.resolve(r,s),a,"utf8"),a},exec:async s=>{let i=await import("node:child_process");return new Promise(a=>{i.execFile("bash",["-c",s],{cwd:r,timeout:3e4},(c,l,d)=>{a({stdout:l?.toString()??"",stderr:d?.toString()??"",exitCode:c?c.code??1:0})})})},glob:async s=>{try{let{globSync:i}=await import("node:fs");return i(s,{cwd:r})}catch{return[]}},grep:async(s,i)=>{let a=[],c=xn.resolve(r,i??".");try{let l=await import("node:child_process"),d=await new Promise(p=>{l.execFile("grep",["-rn",s,c,"--include=*"],{timeout:1e4},(u,m)=>{p(m?.toString()??"")})});for(let p of d.split(`
|
|
1076
|
+
`).filter(Boolean).slice(0,100)){let u=p.match(/^(.+?):(\d+):(.*)$/);u&&a.push({file:u[1],line:parseInt(u[2],10),text:u[3]})}}catch{}return a},console:{log:(...s)=>s.map(String).join(" ")}},setTimeout,clearTimeout,Promise,JSON,Math,Date,Array,Object,String,Number,Boolean,RegExp,Map,Set,Error,Buffer})),e);return{executeInVm:async o=>{let s=Date.now();try{let i=n(),a=await Aa.runInContext(`(async () => { ${o} })()`,i,{timeout:3e4});return{output:a!==void 0?String(a):"",duration:Date.now()-s}}catch(i){return{output:"",error:i instanceof Error?i.message:String(i),duration:Date.now()-s}}},resetVm:()=>{e=void 0}}}function BA(t){return[UA(HA({workdir:t.workdir})),OA(FA({workdir:t.workdir}))]}function qA(t){for(let e of BA({workdir:t.workdir}))t.toolCatalog.addTool(e)}var MH={id:"dev-tools",kind:"dev",register:_H};function WA(t){MH.register(t)}function _H(t){let e=typeof t.config.workdir=="string"?t.config.workdir:t.pathService?.getActiveProjectRoot();if(!e)throw new Error("Dev tool bootstrap requires a workdir or PathService active project root.");qA({workdir:e,toolCatalog:t.toolCatalog})}import*as Ma from"node:fs";import Ia from"node:path";import{fileURLToPath as HH}from"node:url";import{spawn as OH}from"node:child_process";import{createInterface as jH}from"node:readline";var DH=new Set(["describe","fetch","find","get","inspect","list","query","read","search","stat"]),NH=new Set(["append","copy","create","delete","edit","move","patch","remove","rename","set","update","upload","write"]);function Pa(t){let e=t.annotations,r=LH(t.name),n=r.some(c=>NH.has(c)),o=r.some(c=>DH.has(c)),s=e?.destructiveHint===!0||n,i=e?.readOnlyHint===!0||!s&&o,a=i||e?.idempotentHint===!0&&!s;return{isReadOnly:i,isConcurrencySafe:a,isDestructive:s}}function LH(t){return t.replace(/([a-z0-9])([A-Z])/g,"$1_$2").toLowerCase().split(/[^a-z0-9]+/).filter(Boolean)}var xa=class{process=null;readline=null;pending=new Map;nextId=1;connected=!1;toolsCache=[];serverName="";serverVersion="";supportsToolsListChanged=!1;onToolsChanged=null;stderrBuffer="";config;constructor(e){this.config=e}async connect(){if(this.connected)return;let e={...process.env,...this.config.env};this.process=OH(this.config.command,this.config.args??[],{stdio:["pipe","pipe","pipe"],env:e,cwd:this.config.cwd,windowsHide:!0}),this.process.on("error",n=>{this.handleProcessError(n)}),this.process.on("exit",n=>{this.handleProcessExit(n)}),this.process.stderr?.on("data",n=>{this.stderrBuffer+=n.toString(),this.stderrBuffer.length>4096&&(this.stderrBuffer=this.stderrBuffer.slice(-4096))}),this.readline=jH({input:this.process.stdout,crlfDelay:Number.POSITIVE_INFINITY}),this.readline.on("line",n=>this.handleLine(n));let r=await this.sendRequest("initialize",{protocolVersion:"2024-11-05",capabilities:{},clientInfo:{name:"qlogicagent",version:"0.3.0"}},this.config.initTimeoutMs??3e4);this.serverName=r.serverInfo?.name??this.config.name,this.serverVersion=r.serverInfo?.version??"unknown",this.supportsToolsListChanged=r.capabilities?.tools?.listChanged??!1,this.sendNotification("notifications/initialized",{}),this.connected=!0,await this.refreshTools()}async disconnect(){if(!this.connected)return;this.connected=!1;for(let[,r]of this.pending)r.reject(new Error("MCP client disconnecting"));this.pending.clear(),this.toolsCache=[],this.readline?.close(),this.readline=null;let e=this.process;this.process=null,e&&await new Promise(r=>{let n=!1,o=()=>{n||(n=!0,clearTimeout(s),r())},s=setTimeout(()=>{e.kill("SIGKILL"),o()},5e3);e.once("exit",o),e.kill("SIGTERM")})}get isConnected(){return this.connected}get info(){return{name:this.serverName,version:this.serverVersion}}async refreshTools(){if(!this.connected)return[];try{let e=await this.sendRequest("tools/list",{});this.toolsCache=e.tools??[]}catch{this.toolsCache=[]}return this.toolsCache}getCachedTools(){return this.toolsCache}async callTool(e,r,n){if(!this.connected)throw new Error(`MCP server ${this.config.name} not connected`);return await this.sendRequest("tools/call",{name:e,arguments:r??{}},12e4,n)}async listResources(){if(!this.connected)return[];try{return(await this.sendRequest("resources/list",{})).resources??[]}catch{return[]}}async readResource(e){if(!this.connected)throw new Error(`MCP server ${this.config.name} not connected`);return(await this.sendRequest("resources/read",{uri:e})).contents??[]}toPortableTools(){let e=$H(this.config.name);return this.toolsCache.map(r=>{let n=Pa(r);return{name:`mcp__${e}__${r.name}`,label:`[${this.config.name}] ${r.name}`,description:r.description??`MCP tool from ${this.config.name}`,parameters:r.inputSchema??{type:"object",properties:{}},isConcurrencySafe:n.isConcurrencySafe,isReadOnly:n.isReadOnly,isDestructive:n.isDestructive,searchHint:`mcp ${this.config.name} ${r.name}`,execute:async(o,s,i)=>this.executeAsTool(r.name,s,i)}})}setOnToolsChanged(e){this.onToolsChanged=e}async executeAsTool(e,r,n){try{let o=await this.callTool(e,r,n);return{content:[{type:"text",text:o.content.filter(a=>a.type==="text"&&a.text).map(a=>a.text).join(`
|
|
1077
1077
|
`)||"(no text output)"}],...o.isError?{details:{error:"mcp_tool_error"}}:{}}}catch(o){let s=o instanceof Error?o.message:String(o);return{content:[{type:"text",text:`MCP tool error: ${s}`}],details:{error:s}}}}sendRequest(e,r,n=3e4,o){return new Promise((s,i)=>{if(o?.aborted){i(new Error("Aborted"));return}let a=this.nextId++,c={jsonrpc:"2.0",id:a,method:e,params:r},l=setTimeout(()=>{this.pending.delete(a),i(new Error(`MCP request ${e} timed out after ${n}ms`))},n),d=()=>{clearTimeout(l),this.pending.delete(a)};o?.addEventListener("abort",()=>{d(),i(new Error("Aborted"))},{once:!0}),this.pending.set(a,{resolve:p=>{d(),p.error?i(new Error(`MCP error ${p.error.code}: ${p.error.message}`)):s(p.result)},reject:p=>{d(),i(p)}}),this.writeLine(JSON.stringify(c))})}sendNotification(e,r){let n={jsonrpc:"2.0",method:e,params:r};this.writeLine(JSON.stringify(n))}writeLine(e){this.process?.stdin?.writable&&this.process.stdin.write(e+`
|
|
1078
1078
|
`)}handleLine(e){let r=e.trim();if(!r)return;let n;try{n=JSON.parse(r)}catch{return}if("id"in n&&("result"in n||"error"in n)){let o=n.id,s=this.pending.get(o);s&&s.resolve(n)}else"method"in n&&!("id"in n)&&this.handleNotification(n)}handleNotification(e){e.method==="notifications/tools/list_changed"&&this.refreshTools().then(()=>{this.onToolsChanged?.()}).catch(()=>{})}handleProcessError(e){this.connected=!1;for(let[,r]of this.pending)r.reject(new Error(`MCP process error: ${e.message}`));this.pending.clear()}handleProcessExit(e){this.connected=!1;for(let[,r]of this.pending)r.reject(new Error(`MCP process exited with code ${e}`));this.pending.clear()}};function $H(t){return t.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}import{randomUUID as UH}from"node:crypto";var Ca=class{connected=!1;toolsCache=[];serverName="";serverVersion="";sessionId=null;onToolsChanged=null;config;constructor(e){this.config=e}async connect(){if(this.connected)return;let e=await this.sendRequest("initialize",{protocolVersion:"2025-03-26",capabilities:{},clientInfo:{name:"qlogicagent",version:"0.3.0"}},this.config.initTimeoutMs??3e4);this.serverName=e.serverInfo?.name??this.config.name,this.serverVersion=e.serverInfo?.version??"unknown",await this.sendNotification("notifications/initialized",{}),this.connected=!0,await this.refreshTools()}async disconnect(){this.connected=!1,this.toolsCache=[],this.sessionId=null}async callTool(e,r,n){if(!this.connected)throw new Error(`MCP server ${this.config.name} not connected`);return await this.sendRequest("tools/call",{name:e,arguments:r??{}},this.config.toolCallTimeoutMs??12e4,n)}async listResources(){if(!this.connected)return[];try{return(await this.sendRequest("resources/list",{})).resources??[]}catch{return[]}}async readResource(e){if(!this.connected)throw new Error(`MCP server ${this.config.name} not connected`);return(await this.sendRequest("resources/read",{uri:e})).contents??[]}toPortableTools(){return this.toolsCache.map(e=>this.schemaToPortableTool(e))}getCachedTools(){return[...this.toolsCache]}get isConnected(){return this.connected}get info(){return{name:this.serverName,version:this.serverVersion}}setOnToolsChanged(e){this.onToolsChanged=e}async refreshTools(){let e=await this.sendRequest("tools/list",{});this.toolsCache=e.tools??[]}async sendRequest(e,r,n=3e4,o){let s=UH(),i={jsonrpc:"2.0",id:s,method:e,params:r},a=new AbortController,c=setTimeout(()=>a.abort(),n);o&&o.addEventListener("abort",()=>a.abort(),{once:!0});try{let l={"Content-Type":"application/json",Accept:"application/json, text/event-stream",...this.config.headers};this.sessionId&&(l["Mcp-Session-Id"]=this.sessionId);let d=await fetch(this.config.url,{method:"POST",headers:l,body:JSON.stringify(i),signal:a.signal}),p=d.headers.get("mcp-session-id");if(p&&(this.sessionId=p),!d.ok)throw new Error(`MCP HTTP error ${d.status}: ${d.statusText}`);if((d.headers.get("content-type")??"").includes("text/event-stream"))return await this.parseSSEResponse(d,s);let m=await d.json();if(m.error)throw new Error(`MCP error ${m.error.code}: ${m.error.message}`);return m.result}finally{clearTimeout(c)}}async sendNotification(e,r){let n={jsonrpc:"2.0",method:e,params:r},o={"Content-Type":"application/json",...this.config.headers};this.sessionId&&(o["Mcp-Session-Id"]=this.sessionId),await fetch(this.config.url,{method:"POST",headers:o,body:JSON.stringify(n)}).catch(()=>{})}async parseSSEResponse(e,r){let n=e.body;if(!n)throw new Error("MCP SSE response has no body");let o=n.getReader(),s=new TextDecoder,i="";try{for(;;){let{done:a,value:c}=await o.read();if(a)break;i+=s.decode(c,{stream:!0});let l=i.split(`
|
|
1079
|
-
`);i=l.pop()??"";for(let d of l){if(!d.startsWith("data: "))continue;let p=d.slice(6).trim();if(p)try{let u=JSON.parse(p);if("method"in u&&u.method==="notifications/tools/list_changed"){this.onToolsChanged?.();continue}if(u.id===r){if(u.error)throw new Error(`MCP error ${u.error.code}: ${u.error.message}`);return u.result}}catch(u){if(u instanceof Error&&u.message.startsWith("MCP error"))throw u}}}}finally{o.releaseLock()}throw new Error("MCP SSE stream ended without response")}schemaToPortableTool(e){let r=this,n=FH(this.config.name),o=
|
|
1080
|
-
`)||"(no output)"}],details:c.isError?{type:"mcp",error:"tool_error"}:{type:"mcp"}}}catch(c){let l=c instanceof Error?c.message:String(c);return{content:[{type:"text",text:`MCP tool error: ${l}`}],details:{type:"mcp",error:l}}}}}}};function FH(t){return t.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}var Ea=class{clients=new Map;injected=!1;log;workspaceRoot;toolCatalog;constructor(e){this.log=e.log??{info:()=>{},warn:()=>{}},this.workspaceRoot=e.workspaceRoot?Ia.resolve(e.workspaceRoot):void 0,this.toolCatalog=e.toolCatalog;for(let r of e.servers){if(r.disabled)continue;if((r.type??(r.url?"http":"stdio"))==="http"){if(!r.url){this.log.warn(`[mcp] server "${r.name}" is type "http" but has no url, skipping`);continue}let o={name:r.name,url:r.url,headers:r.headers,initTimeoutMs:r.initTimeoutMs};this.clients.set(r.name,new Ca(o))}else{if(!r.command){this.log.warn(`[mcp] server "${r.name}" is type "stdio" but has no command, skipping`);continue}let o={name:r.name,command:r.command,args:r.args,env:r.env,cwd:r.cwd,initTimeoutMs:r.initTimeoutMs};this.clients.set(r.name,new xa(o))}}}async connectAll(){let e=Array.from(this.clients.entries()).map(async([r,n])=>{try{await n.connect(),this.log.info(`[mcp] connected to ${r} (${n.info.name} v${n.info.version})`),n.setOnToolsChanged(()=>{this.log.info(`[mcp] tools changed on ${r}, re-injecting`),this.injected&&this.reinjectTools(r,n)})}catch(o){this.log.warn(`[mcp] failed to connect to ${r}: ${o instanceof Error?o.message:o}`)}});await Promise.allSettled(e)}injectTools(){this.injected=!0;for(let[e,r]of this.clients){if(!r.isConnected)continue;let n=this.wrapToolsForWorkspaceBoundary(r.toPortableTools());this.registerTools(n),this.log.info(`[mcp] injected ${n.length} tools from ${e}`)}}getConnectedServers(){return Array.from(this.clients.entries()).filter(([,e])=>e.isConnected).map(([e])=>e)}getToolCount(){let e=0;for(let r of this.clients.values())r.isConnected&&(e+=r.getCachedTools().length);return e}async disconnectAll(){let e=Array.from(this.clients.values()).map(async r=>{try{await r.disconnect()}catch{}});await Promise.allSettled(e),this.clients.clear(),this.injected=!1}async listResources(e){let r=e?[[e,this.clients.get(e)]].filter(([,o])=>o):Array.from(this.clients.entries());return(await Promise.all(r.map(async([o,s])=>{if(!s?.isConnected||!s.listResources)return[];try{return(await s.listResources()).map(a=>({...a,server:o}))}catch{return this.log.warn(`[mcp] failed to list resources from ${o}`),[]}}))).flat()}async readResource(e,r){let n=this.clients.get(e);if(!n?.isConnected)throw new Error(`MCP server "${e}" is not connected`);if(!n.readResource)throw new Error(`MCP server "${e}" does not support resources`);let o=
|
|
1081
|
-
`).trim()}],details:{type:"list_mcp_resources",count:o.length}}}}}var VH={type:"object",properties:{server:{type:"string",description:"Name of the MCP server that hosts the resource."},uri:{type:"string",description:"URI of the resource to read (from list_mcp_resources output)."}},required:["server","uri"]};function
|
|
1079
|
+
`);i=l.pop()??"";for(let d of l){if(!d.startsWith("data: "))continue;let p=d.slice(6).trim();if(p)try{let u=JSON.parse(p);if("method"in u&&u.method==="notifications/tools/list_changed"){this.onToolsChanged?.();continue}if(u.id===r){if(u.error)throw new Error(`MCP error ${u.error.code}: ${u.error.message}`);return u.result}}catch(u){if(u instanceof Error&&u.message.startsWith("MCP error"))throw u}}}}finally{o.releaseLock()}throw new Error("MCP SSE stream ended without response")}schemaToPortableTool(e){let r=this,n=FH(this.config.name),o=Pa(e);return{name:`mcp__${n}__${e.name}`,label:`[${this.config.name}] ${e.name}`,description:e.description??`MCP tool from ${this.config.name}`,parameters:e.inputSchema??{type:"object",properties:{}},isConcurrencySafe:o.isConcurrencySafe,isReadOnly:o.isReadOnly,isDestructive:o.isDestructive,searchHint:`mcp ${this.config.name} ${e.name}`,execute:async(s,i,a)=>{try{let c=await r.callTool(e.name,i,a);return{content:[{type:"text",text:(c.content??[]).filter(p=>p.type==="text"&&p.text).map(p=>p.text).join(`
|
|
1080
|
+
`)||"(no output)"}],details:c.isError?{type:"mcp",error:"tool_error"}:{type:"mcp"}}}catch(c){let l=c instanceof Error?c.message:String(c);return{content:[{type:"text",text:`MCP tool error: ${l}`}],details:{type:"mcp",error:l}}}}}}};function FH(t){return t.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}var Ea=class{clients=new Map;injected=!1;log;workspaceRoot;toolCatalog;constructor(e){this.log=e.log??{info:()=>{},warn:()=>{}},this.workspaceRoot=e.workspaceRoot?Ia.resolve(e.workspaceRoot):void 0,this.toolCatalog=e.toolCatalog;for(let r of e.servers){if(r.disabled)continue;if((r.type??(r.url?"http":"stdio"))==="http"){if(!r.url){this.log.warn(`[mcp] server "${r.name}" is type "http" but has no url, skipping`);continue}let o={name:r.name,url:r.url,headers:r.headers,initTimeoutMs:r.initTimeoutMs};this.clients.set(r.name,new Ca(o))}else{if(!r.command){this.log.warn(`[mcp] server "${r.name}" is type "stdio" but has no command, skipping`);continue}let o={name:r.name,command:r.command,args:r.args,env:r.env,cwd:r.cwd,initTimeoutMs:r.initTimeoutMs};this.clients.set(r.name,new xa(o))}}}async connectAll(){let e=Array.from(this.clients.entries()).map(async([r,n])=>{try{await n.connect(),this.log.info(`[mcp] connected to ${r} (${n.info.name} v${n.info.version})`),n.setOnToolsChanged(()=>{this.log.info(`[mcp] tools changed on ${r}, re-injecting`),this.injected&&this.reinjectTools(r,n)})}catch(o){this.log.warn(`[mcp] failed to connect to ${r}: ${o instanceof Error?o.message:o}`)}});await Promise.allSettled(e)}injectTools(){this.injected=!0;for(let[e,r]of this.clients){if(!r.isConnected)continue;let n=this.wrapToolsForWorkspaceBoundary(r.toPortableTools());this.registerTools(n),this.log.info(`[mcp] injected ${n.length} tools from ${e}`)}}getConnectedServers(){return Array.from(this.clients.entries()).filter(([,e])=>e.isConnected).map(([e])=>e)}getToolCount(){let e=0;for(let r of this.clients.values())r.isConnected&&(e+=r.getCachedTools().length);return e}async disconnectAll(){let e=Array.from(this.clients.values()).map(async r=>{try{await r.disconnect()}catch{}});await Promise.allSettled(e),this.clients.clear(),this.injected=!1}async listResources(e){let r=e?[[e,this.clients.get(e)]].filter(([,o])=>o):Array.from(this.clients.entries());return(await Promise.all(r.map(async([o,s])=>{if(!s?.isConnected||!s.listResources)return[];try{return(await s.listResources()).map(a=>({...a,server:o}))}catch{return this.log.warn(`[mcp] failed to list resources from ${o}`),[]}}))).flat()}async readResource(e,r){let n=this.clients.get(e);if(!n?.isConnected)throw new Error(`MCP server "${e}" is not connected`);if(!n.readResource)throw new Error(`MCP server "${e}" does not support resources`);let o=GA(`mcp__${zA(e)}__read_resource`,{uri:r},this.workspaceRoot);if(o)throw new Error(o);return n.readResource(r)}wrapToolsForWorkspaceBoundary(e){return this.workspaceRoot?e.map(r=>{if(!r.execute)return r;let n=r.execute;return{...r,execute:async(o,s,i)=>{let a=GA(r.name,s,this.workspaceRoot);return a?{content:[{type:"text",text:a}],details:{type:"mcp",error:"workspace_boundary"}}:n(o,s,i)}}}):e}reinjectTools(e,r){if(!this.injected)return;let n=`mcp__${zA(e)}__`;for(let s of this.getRegisteredToolNames())s.startsWith(n)&&this.removeRegisteredTool(s);let o=this.wrapToolsForWorkspaceBoundary(r.toPortableTools());this.registerTools(o),this.log.info(`[mcp] re-injected ${o.length} tools from ${e}`)}registerTools(e){this.toolCatalog?this.toolCatalog.addTools(e):ni(e)}getRegisteredToolNames(){return this.toolCatalog?.getToolNames()??oi()}removeRegisteredTool(e){return this.toolCatalog?.removeTool(e)??pn(e)}},BH=/(?:^|_)(path|paths|file|files|filename|filenames|dir|dirs|directory|directories|folder|folders|cwd|root|uri)(?:$|_)/i;function GA(t,e,r){if(!r)return null;for(let n of xp(e)){let o=GH(n.value,r);if(o&&!KH(o.candidate,o.root,o.pathApi))return`Blocked: MCP tool "${t}" path "${n.value}" is outside the workspace boundary "${o.root}"`}return null}function xp(t,e="",r=0){if(r>8)return[];if(typeof t=="string")return qH(e,t)?[{key:e,value:t}]:[];if(Array.isArray(t))return t.flatMap(o=>xp(o,e,r+1));if(!t||typeof t!="object")return[];let n=[];for(let[o,s]of Object.entries(t))n.push(...xp(s,o,r+1));return n}function qH(t,e){if(!BH.test(t))return!1;let r=e.trim();return!r||/^https?:\/\//i.test(r)?!1:WH(r)}function WH(t){return Ia.isAbsolute(t)||/^[A-Za-z]:[\\/]/.test(t)||/^\\\\/.test(t)||/^file:\/\//i.test(t)||t.includes("../")||t.includes("..\\")||t.startsWith(".\\")||t.startsWith("./")||t.includes("/")||t.includes("\\")}function GH(t,e){let r=t.trim();if(/^file:\/\//i.test(r))try{r=HH(r)}catch{return null}let n=KA(r)||KA(e)?Ia.win32:Ia,o=n.resolve(e);return{candidate:n.isAbsolute(r)?n.resolve(r):n.resolve(o,r),root:o,pathApi:n}}function KH(t,e,r){let n=r.relative(e,t);return n===""||!n.startsWith("..")&&!r.isAbsolute(n)}function KA(t){return/^[A-Za-z]:[\\/]/.test(t)||/^\\\\/.test(t)}function zA(t){return t.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}function Cp(t){if(!t||typeof t!="object")return[];let e=t,r=[],n=e.mcpServers??e.servers??e;for(let[o,s]of Object.entries(n)){if(!s||typeof s!="object")continue;let i=s;if(typeof i.url=="string"){r.push({name:o,type:"http",url:i.url,headers:i.headers&&typeof i.headers=="object"?i.headers:void 0,disabled:i.disabled===!0,initTimeoutMs:typeof i.initTimeoutMs=="number"?i.initTimeoutMs:void 0});continue}typeof i.command=="string"&&r.push({name:o,type:"stdio",command:i.command,args:Array.isArray(i.args)?i.args:void 0,env:i.env&&typeof i.env=="object"?i.env:void 0,cwd:typeof i.cwd=="string"?i.cwd:void 0,disabled:i.disabled===!0})}return r}var zH={type:"object",properties:{server:{type:"string",description:"MCP server name to list resources from. Omit to list from all connected servers."}}};function VA(t){return{name:"list_mcp_resources",label:"List MCP Resources",description:"List resources available from connected MCP servers. Resources are data items (files, database records, API data) exposed by MCP servers that can be read with read_mcp_resource.",parameters:zH,shouldDefer:!0,isConcurrencySafe:!0,isReadOnly:!0,searchHint:"mcp resource list browse discover",execute:async(e,r)=>{let n=t();if(!n)return{content:[{type:"text",text:"No MCP servers configured."}],details:{type:"list_mcp_resources",count:0}};let o=await n.listResources(r.server);if(o.length===0)return{content:[{type:"text",text:r.server?`No resources found from MCP server "${r.server}".`:"No resources found from any connected MCP server."}],details:{type:"list_mcp_resources",count:0}};let s=new Map;for(let a of o){let c=s.get(a.server)??[];c.push(a),s.set(a.server,c)}let i=[];for(let[a,c]of s){i.push(`Server: ${a} (${c.length} resources)`);for(let l of c){let d=l.mimeType?` [${l.mimeType}]`:"",p=l.description?` \u2014 ${l.description}`:"";i.push(` ${l.name}: ${l.uri}${d}${p}`)}i.push("")}return{content:[{type:"text",text:i.join(`
|
|
1081
|
+
`).trim()}],details:{type:"list_mcp_resources",count:o.length}}}}}var VH={type:"object",properties:{server:{type:"string",description:"Name of the MCP server that hosts the resource."},uri:{type:"string",description:"URI of the resource to read (from list_mcp_resources output)."}},required:["server","uri"]};function XA(t){return{name:"read_mcp_resource",label:"Read MCP Resource",description:"Read a specific resource from an MCP server by URI. Returns the resource content (text or binary metadata). Use list_mcp_resources first to discover available URIs.",parameters:VH,shouldDefer:!0,isConcurrencySafe:!0,isReadOnly:!0,searchHint:"mcp resource read fetch content",execute:async(e,r)=>{let n=t();if(!n)return{content:[{type:"text",text:"No MCP servers configured."}],details:{error:"no_mcp"}};try{let o=await n.readResource(r.server,r.uri);if(o.length===0)return{content:[{type:"text",text:`Resource "${r.uri}" returned no content.`}],details:{type:"read_mcp_resource",empty:!0}};let s=[];for(let i of o)if(i.text){let a=i.mimeType?` (${i.mimeType})`:"";s.push({type:"text",text:`--- ${i.uri}${a}-
|
|
1082
1082
|
${i.text}`})}else if(i.blob){let a=Math.ceil(i.blob.length*3/4/1024);s.push({type:"text",text:`--- ${i.uri} (binary, ~${a}KB, ${i.mimeType??"unknown"})-
|
|
1083
1083
|
[Binary content not displayed. Use appropriate tool to process.]`})}return s.length===0?{content:[{type:"text",text:`Resource "${r.uri}" has no readable content.`}],details:{type:"read_mcp_resource",empty:!0}}:{content:s,details:{type:"read_mcp_resource",uri:r.uri,server:r.server,contentCount:o.length}}}catch(o){return{content:[{type:"text",text:`Error reading resource: ${o.message}`}],details:{error:o.message}}}}}}var YH="mcp",JH={type:"object",properties:{action:{type:"string",enum:["list_servers","list_tools","call_tool","list_resources","read_resource","list_prompts","get_prompt","authenticate","manage_server"],description:`MCP action:
|
|
1084
1084
|
- list_servers: List configured MCP servers, their status and capabilities
|
|
@@ -1089,7 +1089,7 @@ ${i.text}`})}else if(i.blob){let a=Math.ceil(i.blob.length*3/4/1024);s.push({typ
|
|
|
1089
1089
|
- list_prompts: List prompts available from a server
|
|
1090
1090
|
- get_prompt: Get a specific prompt with arguments
|
|
1091
1091
|
- authenticate: Initiate OAuth authentication with a server
|
|
1092
|
-
- manage_server: Add, remove, restart, or check server status`},server:{type:"string",description:"MCP server name. Required for all actions except list_servers."},toolName:{type:"string",description:"Tool name on the MCP server. Required for call_tool."},arguments:{type:"object",description:"Arguments for the tool call or prompt. Used with call_tool and get_prompt."},uri:{type:"string",description:"Resource URI. Required for read_resource."},promptName:{type:"string",description:"Prompt name. Required for get_prompt."},manageAction:{type:"string",enum:["add","remove","restart","health_check","enable","disable"],description:"Sub-action for manage_server."},config:{type:"object",description:"Server configuration. Required for manage_server add."}},required:["action"]};function
|
|
1092
|
+
- manage_server: Add, remove, restart, or check server status`},server:{type:"string",description:"MCP server name. Required for all actions except list_servers."},toolName:{type:"string",description:"Tool name on the MCP server. Required for call_tool."},arguments:{type:"object",description:"Arguments for the tool call or prompt. Used with call_tool and get_prompt."},uri:{type:"string",description:"Resource URI. Required for read_resource."},promptName:{type:"string",description:"Prompt name. Required for get_prompt."},manageAction:{type:"string",enum:["add","remove","restart","health_check","enable","disable"],description:"Sub-action for manage_server."},config:{type:"object",description:"Server configuration. Required for manage_server add."}},required:["action"]};function YA(t){return{name:YH,label:"MCP",description:`Interact with external MCP (Model Context Protocol) servers. Discover and call tools, read resources, get prompts, manage servers, and handle authentication. MCP servers extend agent capabilities with external integrations (databases, APIs, code analysis, custom tools).
|
|
1093
1093
|
|
|
1094
1094
|
Dynamic tools: When MCP servers are connected, their tools also appear as individual entries in the tool list (prefixed mcp__server__tool) for direct invocation without going through this management tool.`,parameters:JH,shouldDefer:!0,execute:async(e,r,n)=>{switch(r.action){case"list_servers":{let o=await t.listServers();if(o.length===0)return{content:[{type:"text",text:"No MCP servers configured. Use manage_server action to add one."}],details:{type:"mcp",action:"list_servers",count:0}};let s=[`MCP Servers (${o.length}):`,""];for(let i of o){let a=QH(i.status);if(s.push(`${a} **${i.name}** [${i.transport}] \u2014 ${i.status}`),s.push(` Tools: ${i.toolCount} | Resources: ${i.resourceCount} | Prompts: ${i.promptCount}`),i.capabilities){let c=[];i.capabilities.tools?.listChanged&&c.push("tools/listChanged"),i.capabilities.resources?.subscribe&&c.push("resources/subscribe"),i.capabilities.prompts?.listChanged&&c.push("prompts/listChanged"),c.length>0&&s.push(` Capabilities: ${c.join(", ")}`)}i.serverVersion&&s.push(` Version: ${i.serverVersion}`),i.error&&s.push(` \u26A0 Error: ${i.error}`),s.push("")}return{content:[{type:"text",text:s.join(`
|
|
1095
1095
|
`)}],details:{type:"mcp",action:"list_servers",count:o.length}}}case"list_tools":{if(!r.server)return ie("server is required for list_tools.");let o=await t.listTools(r.server);if(o.length===0)return{content:[{type:"text",text:`No tools available from server "${r.server}".`}],details:{type:"mcp",action:"list_tools",server:r.server,count:0}};let s=[`Tools from "${r.server}" (${o.length}):`,""];for(let i of o){let a=ZH(i.annotations);s.push(`- **${i.name}**${a}${i.description?`: ${i.description}`:""}`),i.prefixedName&&s.push(` Direct call: \`${i.prefixedName}\``)}return{content:[{type:"text",text:s.join(`
|
|
@@ -1105,11 +1105,11 @@ ${o.message||"Once you complete authentication, the server's tools will become a
|
|
|
1105
1105
|
Required scopes: ${o.requiredScopes?.join(", ")||"unknown"}
|
|
1106
1106
|
|
|
1107
1107
|
`+(o.authUrl?`Re-authorize at: ${o.authUrl}`:"Please re-authenticate with elevated permissions.")}],details:{type:"mcp",action:"authenticate",server:r.server,status:"step_up_required"}};case"unsupported":return{content:[{type:"text",text:`Authentication not supported for "${r.server}" (${o.message||"uses local transport"}).`}],details:{type:"mcp",action:"authenticate",server:r.server,status:"unsupported"}};default:return{content:[{type:"text",text:`Authentication error for "${r.server}": ${o.message||"unknown error"}`}],details:{type:"mcp",action:"authenticate",server:r.server,status:"error"}}}}case"manage_server":{if(!r.server)return ie("server is required for manage_server.");if(!r.manageAction)return ie("manageAction is required for manage_server.");switch(r.manageAction){case"add":{if(!t.addServer)return ie("Server addition not supported by the current MCP host.");if(!r.config)return ie("config is required for manage_server add.");let o=await t.addServer(r.server,r.config);return $o("add",r.server,o)}case"remove":{if(!t.removeServer)return ie("Server removal not supported by the current MCP host.");let o=await t.removeServer(r.server);return $o("remove",r.server,o)}case"restart":{if(!t.restartServer)return ie("Server restart not supported by the current MCP host.");let o=await t.restartServer(r.server);return $o("restart",r.server,o)}case"health_check":{if(!t.healthCheck)return ie("Health check not supported by the current MCP host.");let o=await t.healthCheck(r.server);return $o("health_check",r.server,o)}case"enable":case"disable":{if(!t.setServerEnabled)return ie("Server enable/disable not supported by the current MCP host.");let o=await t.setServerEnabled(r.server,r.manageAction==="enable");return $o(r.manageAction,r.server,o)}default:return ie(`Unknown manageAction: ${r.manageAction}`)}}default:return ie(`Unknown action: "${r.action}".`)}}}}function ie(t){return{content:[{type:"text",text:`Error: ${t}`}],details:{type:"mcp",error:t}}}function QH(t){switch(t){case"connected":return"\u2705";case"connecting":return"\u23F3";case"needs-auth":return"\u{1F511}";case"failed":return"\u274C";case"disconnected":return"\u26AA";case"disabled":return"\u{1F6AB}";default:return"\u2753"}}function ZH(t){if(!t)return"";let e=[];return t.readOnlyHint&&e.push("\u{1F4D6}"),t.destructiveHint&&e.push("\u26A0\uFE0F"),t.idempotentHint&&e.push("\u267B\uFE0F"),e.length>0?` ${e.join("")}`:""}function eB(t){return t<1024?`${t}B`:t<1024*1024?`${(t/1024).toFixed(1)}KB`:`${(t/(1024*1024)).toFixed(1)}MB`}function $o(t,e,r){let n=[];return n.push(`${r.success?"\u2705":"\u274C"} ${t} "${e}": ${r.message}`),r.serverState&&(n.push(""),n.push(` Status: ${r.serverState.status}`),n.push(` Tools: ${r.serverState.toolCount} | Resources: ${r.serverState.resourceCount}`)),{content:[{type:"text",text:n.join(`
|
|
1108
|
-
`)}],details:{type:"mcp",action:"manage_server",manageAction:t,server:e,success:r.success}}}var tB={id:"mcp-tools",kind:"mcp",register:rB};function
|
|
1109
|
-
`)}}catch(l){return{success:!1,error:l.message}}},listResources:async r=>(await t.listResources(r)).map(o=>({uri:o.uri,name:o.name,mimeType:o.mimeType,description:o.description,server:o.server})),readResource:async(r,n)=>(await t.readResource(r,n)).map(s=>({uri:s.uri,mimeType:s.mimeType,text:s.text})),authenticate:async()=>({status:"unsupported",message:"OAuth not yet implemented in McpManager"})})}import*as
|
|
1110
|
-
`).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 dB(){return
|
|
1111
|
-
`,"utf8"),o}};function yB(t){if(!t||typeof t!="object"||Array.isArray(t))return!1;let e=t;return typeof e.intentKey=="string"&&typeof e.resourceId=="string"&&typeof e.title=="string"}var La=class{client;cache;localIndex;topK;now;inMemory=new Map;constructor(e){this.client=e.client,this.cache=e.cache??new Da,this.localIndex=e.localIndex,this.topK=e.topK??1,this.now=e.now??(()=>new Date)}async matchForTurn(e){let r=
|
|
1112
|
-
`)},name:{type:"string",description:"Skill name (required for invoke/view/create/edit/patch/delete/promote)."},args:{type:"string",description:"Arguments or context to pass when invoking a skill."},category:{type:"string",description:"Filter skills by category (for 'list' action)."},content:{type:"string",description:"Full SKILL.md content for create/edit actions."},filePath:{type:"string",description:"View a specific file within the skill (for 'view' action)."},fileContent:{type:"string",description:"Content for writing supporting files."},oldString:{type:"string",description:"Text to find for patch action."},newString:{type:"string",description:"Replacement text for patch action."}},required:["action"]};function
|
|
1108
|
+
`)}],details:{type:"mcp",action:"manage_server",manageAction:t,server:e,success:r.success}}}var tB={id:"mcp-tools",kind:"mcp",register:rB};function QA(t){tB.register(t)}function rB(t){let e=oB({turnMcpConfig:t.config.mcpServers??{},userMcpConfig:nB(t.pathService),projectRoot:t.projectRoot});if(e.length===0)return;t.currentManager?.disconnectAll().catch(()=>{});let r=new Ea({servers:e,log:t.log,workspaceRoot:t.projectRoot,toolCatalog:t.toolCatalog});t.setManager(r),Xt(async()=>{await r.disconnectAll()});let n=()=>r;t.toolCatalog.addTool(VA(n)),t.toolCatalog.addTool(XA(n)),t.toolCatalog.addTool(sB(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 nB(t){let e=t.getUserMcpConfigPath();try{if(Ma.existsSync(e))return JSON.parse(Ma.readFileSync(e,"utf8"))}catch{}}function oB(t){let e=JA(Cp(t.turnMcpConfig??{}),t.projectRoot),r=JA(Cp(t.userMcpConfig??{}),t.projectRoot),n=new Set(e.map(o=>o.name));return[...e,...r.filter(o=>!n.has(o.name))]}function JA(t,e){return t.map(r=>(r.type??"stdio")!=="stdio"||r.cwd?r:{...r,cwd:e})}function sB(t,e){return YA({listServers:async()=>t.getConnectedServers().map(n=>({name:n,status:"connected",transport:"stdio",toolCount:0,resourceCount:0,promptCount:0})),listTools:async r=>{let n=`mcp__${r.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}__`;return e.getToolNames().filter(o=>o.startsWith(n)).map(o=>({name:o.slice(n.length),prefixedName:o}))},callTool:async(r,n,o,s)=>{let a=`mcp__${r.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}__`+n,c=e.findTool(a);if(!c||!("execute"in c)||typeof c.execute!="function")return{success:!1,error:`Tool not found: ${a}`};try{return{success:!0,content:(await c.execute(`mcp_${Date.now()}`,o??{},s)).content.map(p=>p.text??"").join(`
|
|
1109
|
+
`)}}catch(l){return{success:!1,error:l.message}}},listResources:async r=>(await t.listResources(r)).map(o=>({uri:o.uri,name:o.name,mimeType:o.mimeType,description:o.description,server:o.server})),readResource:async(r,n)=>(await t.readResource(r,n)).map(s=>({uri:s.uri,mimeType:s.mimeType,text:s.text})),authenticate:async()=>({status:"unsupported",message:"OAuth not yet implemented in McpManager"})})}import*as nP from"node:fs";import*as bt from"node:fs";import*as Cn from"node:path";import{pathToFileURL as iB}from"node:url";var ZA={preToolUse:"tool.before_invoke",postToolUse:"tool.after_invoke",onTurnStart:"turn.submitted",onTurnEnd:"turn.completed",onSessionEnd:"session.ended"};var _a=class{constructor(e){this.config=e;this.log=e.log??{info:()=>{},warn:()=>{}}}config;loaded=[];pluginSkills=[];pluginAssistants=[];activations=new Map;log;async loadAll(){for(let e of this.config.pluginDirs){if(!bt.existsSync(e))continue;let r;try{r=bt.readdirSync(e,{withFileTypes:!0})}catch{continue}for(let n of r){if(!n.isDirectory()||n.name.startsWith(".")||n.name.startsWith("_"))continue;let o=Cn.join(e,n.name);await this.loadPlugin(n.name,o)}}return this.log.info(`[plugins] loaded ${this.loaded.length} plugin(s): ${this.loaded.map(e=>e.name).join(", ")||"(none)"}`),this.loaded}getPluginSkills(){return this.pluginSkills}getPluginAssistants(){return this.pluginAssistants.map(e=>({...e,enabledSkills:[...e.enabledSkills],disabledBuiltinSkills:[...e.disabledBuiltinSkills],modelHints:[...e.modelHints],prompts:e.prompts.map(r=>({...r}))}))}getLoaded(){return this.loaded}async discoverNew(){let e=new Set(this.loaded.map(n=>n.name)),r=0;for(let n of this.config.pluginDirs){if(!bt.existsSync(n))continue;let o;try{o=bt.readdirSync(n,{withFileTypes:!0})}catch{continue}for(let s of o){if(!s.isDirectory()||s.name.startsWith(".")||s.name.startsWith("_")||e.has(s.name))continue;let i=Cn.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){$l(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=Cn.join(r,b);if(bt.existsSync(v)){i=v;break}}if(!i){n.found?(this.loaded.push({name:e,directory:r,toolCount:0,hookCount:0,skillCount:0,assistantCount:o}),this.log.info(`[plugins] ${e}: 0 tools, 0 hooks, 0 skills, ${o} assistants`)):this.log.warn(`[plugins] ${e}: no index.js found, skipping`);return}let a=0,c=0,l=0,d=[],p=[],u=null,m=6e4,f={},g=Cn.join(r,"config.json");if(bt.existsSync(g))try{f=JSON.parse(bt.readFileSync(g,"utf8"))}catch{}let h={pluginName:e,registerTool:b=>{this.addRegisteredTool(b),d.push(b),a++},registerHook:(b,v)=>{let R=ZA[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(iB(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=Cn.join(r,"assistants.json");if(!bt.existsSync(n))return{found:!1,count:0};try{let o=Ul(bt.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):ri(e)}removeRegisteredTool(e){return this.config.toolCatalog?.removeTool(e)??pn(e)}};import*as fe from"node:fs";import*as Uo from"node:path";function Ip(){return I().getUserPluginCacheDir()}function eP(){return Uo.join(Ip(),"installed_plugins.json")}function tP(){let t=eP();if(!fe.existsSync(t))return{version:1,plugins:[]};try{return JSON.parse(fe.readFileSync(t,"utf-8"))}catch{return{version:1,plugins:[]}}}function aB(t){let e=Ip();fe.existsSync(e)||fe.mkdirSync(e,{recursive:!0}),fe.writeFileSync(eP(),JSON.stringify(t,null,2),"utf-8")}function cB(t,e){return!(e.blocklist?.includes(t)||e.allowlist&&!e.allowlist.includes(t))}async function lB(t,e,r){let{execFile:n}=await import("node:child_process"),{promisify:o}=await import("node:util"),s=o(n),i=Ip(),a=e?`${t}@${e}`:t;try{let{stdout:c}=await s("npm",["pack",a,"--pack-destination",i],{timeout:6e4,cwd:i}),l=c.trim().split(`
|
|
1110
|
+
`).pop()?.trim();if(!l)return r.warn(`[marketplace] npm pack returned no output for ${a}`),null;let d=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 dB(){return tP().plugins.filter(e=>fe.existsSync(e.installPath)).map(e=>e.installPath)}async function uB(t,e){let r=tP(),n=[];for(let o of t.enabledPlugins){let s=o.specifier.split("/").pop()??o.specifier;if(!cB(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 lB(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 aB(r),n}function pB(){let t=I().getUserMarketplaceConfigPath();if(!fe.existsSync(t))return null;try{return JSON.parse(fe.readFileSync(t,"utf-8"))}catch{return null}}async function rP(t,e){let r=[...t],n=dB();r.push(...n);let o=pB();if(o&&o.enabledPlugins.length>0)try{let s=await uB(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 mB={id:"plugin-tools",kind:"plugin",register:gB};function oP(t){mB.register(t)}function gB(t){let e=fB(t.config,t.pathService);rP(e,t.log).then(r=>{if(r.length===0)return;let n=new _a({pluginDirs:r,hookRegistry:t.hooks,log:t.log,toolCatalog:t.toolCatalog});t.setPluginLoader(n),n.loadAll().then(o=>{t.log.info(`[plugins] ${o.length} loaded, ${n.getPluginSkills().length} skills`)}).catch(o=>{t.log.warn(`[plugins] load error: ${o instanceof Error?o.message:o}`)}),t.hooks.register({point:"turn.submitted",handler:async()=>(await n.discoverNew(),await n.refreshActivations(),{action:"continue"}),label:"plugin-activation-refresh",priority:50})}).catch(r=>{t.log.warn(`[plugins] marketplace resolve error: ${r instanceof Error?r.message:r}`)})}function fB(t,e){let r=[],n=i=>{!i||!nP.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 sP(){return ne()?.type==="group"}async function iP(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 aP(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=hB(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 hB(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 aP(t,e){return e!=="allow"?{approvalId:t.approvalId,decision:"deny"}:{approvalId:t.approvalId,decision:"allow"}}function cP(t){let e=Co(t.config.permissions),r=rT(e);if(vi(e.mode==="full_access"),sP()){let o=lb();for(let s of o)r.addRule(s);uu(!0),t.log.info(`[permissions] group security mode active: ${o.length} rules injected`)}else uu(!1);t.currentUnregister?.();let n=nT({ruleEngine:r,hookRegistry:t.hooks,auditLogger:new $i(t.getActiveProjectRoot()),sessionId:t.sessionId,getTurnId:t.getTurnId,communityTelemetryRecorder:Fs()??void 0,onRequestApproval:o=>iP(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 In from"node:fs";import*as Na from"node:path";var Da=class{filePath;constructor(e={}){this.filePath=e.filePath??Na.join(B(e.ownerUserId),"community","discovery-cache.json")}readAll(){try{let e=JSON.parse(In.readFileSync(this.filePath,"utf8"));return Array.isArray(e)?e.filter(yB):[]}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 In.mkdirSync(Na.dirname(this.filePath),{recursive:!0}),In.writeFileSync(this.filePath,`${JSON.stringify(s,null,2)}
|
|
1111
|
+
`,"utf8"),o}};function yB(t){if(!t||typeof t!="object"||Array.isArray(t))return!1;let e=t;return typeof e.intentKey=="string"&&typeof e.resourceId=="string"&&typeof e.title=="string"}var La=class{client;cache;localIndex;topK;now;inMemory=new Map;constructor(e){this.client=e.client,this.cache=e.cache??new Da,this.localIndex=e.localIndex,this.topK=e.topK??1,this.now=e.now??(()=>new Date)}async matchForTurn(e){let r=lP(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,dP(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,dP(r,a))}}async prefetchIdle(e){let r=[],n=new Set;for(let o of e){let s=lP(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 lP(t){return t.trim().toLowerCase().replace(/\s+/g," ")}function dP(t,e){return{status:"unavailable",intentKey:t,error:e instanceof Error?e.message:String(e)}}function uP(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 pP(t){let e=uP(t.log);t.taskStore.setHooks(e,t.sessionId),gb({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=Yw({hooks:e,currentUserId:t.currentUserId,log:t.log,prefetchState:t.prefetchState,getLastUserMessage:t.getLastUserMessage,getLastAssistantMessage:t.getLastAssistantMessage,resolveSmallModelClient:t.resolveSmallModelClient});return sh(e,{currentCwd:t.projectRoot,communityDiscovery:new La({client:Ot()}),log:{debug:n=>t.log.debug(n),warn:n=>t.log.warn(n)}}),rf(e,t.log,{transport:t.compressionClient.transport,apiKey:t.compressionClient.apiKey}),Jw({memdir:t.memdir,memoryProvider:r.toolProvider,memoryUserId:r.userId,toolCatalog:t.toolCatalog}),rm(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 vB}from"node:fs";import{stat as bB}from"node:fs/promises";import{join as mP,relative as kB,resolve as RB}from"node:path";var SB=[`${Kt}/settings.json`,"INSTRUCTIONS.md",`${Kt}/INSTRUCTIONS.md`,"INSTRUCTIONS.local.md",`${Kt}/rules`],TB=["INSTRUCTIONS.md","INSTRUCTIONS.local.md",`${Kt}/rules`],Ep=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 SB){let r=mP(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=vB(e,{persistent:!1,recursive:r.includes("/")?!1:void 0},(o,s)=>{let i=s?mP(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 bB(e)}catch{o="deleted"}let s=kB(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(()=>{}),TB.some(a=>s.includes(a)||e.includes(a))&&this.deps.onInstructionCacheReset?.()},300))}setCwd(e){let r=RB(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 gP(t){let e=new Ep(t);return await e.start(),e}import{watch as wB}from"node:fs";import{readFile as AB}from"node:fs/promises";function PB(t){return I().getProjectSettingsPath(t)}async function xB(t){try{let e=await AB(t,"utf-8");return JSON.parse(e)}catch{return null}}function CB(t,e,r,n){let o=!1,s=IB(t);s&&(s.mode!==e.getMode()&&(e.setMode(s.mode),n?.(`settings: permission mode -> ${s.mode}`),o=!0),EB(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 fP(t){let e=PB(t.projectRoot),r=null,n=null,o=async()=>{let s=await xB(e);s&&CB(s,t.ruleEngine,t.hooks,t.log)};o().catch(()=>{});try{r=wB(e,{persistent:!1},()=>{n&&clearTimeout(n),n=setTimeout(()=>{o().catch(()=>{})},200)}),r.on("error",()=>{})}catch{}return()=>{n&&clearTimeout(n),r?.close(),r=null}}function IB(t){return MB(t),t.permissions&&typeof t.permissions=="object"?Oi(t.permissions):null}function EB(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 MB(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 hP(t){let e=typeof t.config.workdir=="string"?t.config.workdir:process.cwd(),r=fP({projectRoot:e,ruleEngine:t.ruleEngine,hooks:t.hooks,log:n=>t.log.info(`[settings] ${n}`)});Xt(async()=>{r()}),t.currentFileWatcher?.stop(),t.setFileWatcher(null),gP({projectRoot:e,sessionId:t.sessionId,hooks:t.hooks,log:n=>t.log.debug(n),onInstructionCacheReset:PT}).then(n=>{t.setFileWatcher(n),Xt(async()=>{n.stop()})}).catch(n=>{t.log.warn(`[file-watcher] init error: ${n instanceof Error?n.message:n}`)})}import*as le from"node:fs";import*as Se from"node:path";var _B="skill",DB={type:"object",properties:{action:{type:"string",enum:["invoke","list","view","create","edit","patch","delete","promote"],description:["The operation to perform:","\u2022 'invoke' \u2014 Run a skill by name (provide 'name', optional 'args')","\u2022 'list' \u2014 List all available skills (optional 'category' filter)","\u2022 'view' \u2014 View full skill content (provide 'name', optional 'filePath')","\u2022 'create' \u2014 Create a new skill (provide 'name', 'content')","\u2022 'edit' \u2014 Overwrite skill content (provide 'name', 'content')","\u2022 'patch' \u2014 Find/replace in skill (provide 'name', 'oldString', 'newString')","\u2022 'delete' \u2014 Remove a skill (provide 'name')","\u2022 'promote' \u2014 Promote a project-level skill to global/user-level (provide 'name')"].join(`
|
|
1112
|
+
`)},name:{type:"string",description:"Skill name (required for invoke/view/create/edit/patch/delete/promote)."},args:{type:"string",description:"Arguments or context to pass when invoking a skill."},category:{type:"string",description:"Filter skills by category (for 'list' action)."},content:{type:"string",description:"Full SKILL.md content for create/edit actions."},filePath:{type:"string",description:"View a specific file within the skill (for 'view' action)."},fileContent:{type:"string",description:"Content for writing supporting files."},oldString:{type:"string",description:"Text to find for patch action."},newString:{type:"string",description:"Replacement text for patch action."}},required:["action"]};function yP(t){return{name:_B,label:"Skill",description:UB(t),parameters:DB,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 NB(t,r,n);case"list":return LB(t,r);case"view":return OB(t,r);case"create":case"edit":case"patch":case"delete":return jB(t,r);case"promote":return $B(t,r);default:return{content:[{type:"text",text:`Unknown action: ${o}. Use invoke, list, view, create, edit, patch, delete, or promote.`}]}}}}}async function NB(t,e,r){let{name:n,args:o}=e;if(!n)return{content:[{type:"text",text:`Error: 'name' is required for invoke. Available skills: ${t.listSkills().map(l=>l.name).join(", ")||"(none)"}`}]};let s=await t.readSkillContent(n);if(!s){let c=t.listSkills().map(l=>l.name).join(", ");return{content:[{type:"text",text:`Skill "${n}" not found. Available skills: ${c||"(none)"}`}]}}if(t.executeSkillSubturn)try{return{content:[{type:"text",text:await t.executeSkillSubturn(n,s,o,r)}],details:{skillName:n,action:"invoke",mode:"subturn"}}}catch(c){let l=c instanceof Error?c.message:String(c);return{content:[{type:"text",text:`Skill execution error: ${l}`}],details:{error:l,skillName:n}}}let i=`## Skill: ${n}
|
|
1113
1113
|
|
|
1114
1114
|
`,a=o?`
|
|
1115
1115
|
|
|
@@ -1128,10 +1128,10 @@ CROSS-PROJECT RECALL: When you see '[Cross-project skill available]' in recalled
|
|
|
1128
1128
|
`);return`${r}
|
|
1129
1129
|
|
|
1130
1130
|
Available skills:
|
|
1131
|
-
${n}`}import{randomUUID as KB}from"node:crypto";var FB=10080*60*1e3;function HB(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=Mp(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=Mp(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??FB,s=[];for(let i of Object.values(e.records)){if(!BB(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
|
|
1131
|
+
${n}`}import{randomUUID as KB}from"node:crypto";var FB=10080*60*1e3;function HB(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=Mp(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=Mp(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??FB,s=[];for(let i of Object.values(e.records)){if(!BB(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 vP(){let t=Ot();return t?HB(t):null}function Mp(t){return t?.source!=="installed"||t.registrySourceTier==="official"?null:t.registryResourceId??t.name}function BB(t,e,r){if(!Mp(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 Fte}from"node:child_process";function bP(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 kP(){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 qB(t={}){let e=t.availability??bP({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:GB(r,e.available?"allowed":"blocked",o)}}let n=r.riskTier??"unknown";return!WB(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 RP(){return qB()}function WB(t){return t==="R2"||t==="R3"}function GB(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:kP()}}async function wP(t){let{host:e,toolCatalog:r,skillName:n,skillContent:o,userArgs:s,signal:i}=t,a=`skill_${n}_${KB().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??vP(),m=(t.skillSandbox??RP()).decide({origin:PP(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=AP(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 SP(e,d,a,f,"normal"),TP(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 SP(e,d,a,f,R?"error":"normal",R),R?(Vu(l,n,!1),await u?.recordSkillUsage(p,"error"),`[skill "${n}"] error: ${R}`):(TP(l,n,!0),await u?.recordSkillUsage(p,"success"),v.join("")||`[skill "${n}"] completed (no output)`)}function AP(t,e){return zB(e)?`community-skill:${t}`:`skill:${t}`}function zB(t){return PP(t)}function PP(t){return t?.source!=="installed"?!1:t.registrySourceTier!=="official"}function SP(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 TP(t,e,r){Vu(t,e,r);let n=ue(t);uh(n,e),he(t,n)}var VB={id:"skill-meta-tool",kind:"skill",register:({host:t,...e})=>XB(t,e)};function xP(t,e){VB.register({...e,host:t})}function XB(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(yP({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(`---
|
|
1132
1132
|
`)?f.indexOf("---",4):-1,C=(R>=0?f.slice(R+3).trimStart():f).split(`
|
|
1133
|
-
`).find(E=>E.trim()&&!E.startsWith("#"))?.trim()??`Skill from ${g}`;a.push({name:u.name,description:C,category:g,scope:h,version:v})}catch{}}}catch{}for(let d of t.getPluginSkills())i&&d.source!==i||(c.add(d.source??"plugin"),a.push({name:d.name,description:`Plugin skill (${d.source})`,category:d.source,scope:"plugin"}));return{skills:a,categories:[...c]}},readSkillContent:async i=>{for(let a of s){let c=
|
|
1134
|
-
`).slice(0,3).join(" ").slice(0,200),T=a?
|
|
1135
|
-
`),n=e.length>0?[...e,...t.result.imageUrls??[]]:t.result.imageUrls,o=t.result.details?.error,s=o?r:void 0,i=t.result.details?.type,a=i?.split("_")[0];if(i==="three_d_generate"&&(a="3d"),a&&["image","tts","video","music","3d"].includes(a)){let l=t.result.details?.mediaUrls??[],d=a;for(let p of l)t.sendNotification("turn.media_result",{turnId:t.turnId,mediaType:d,url:p,model:t.result.details?.model,provider:t.result.details?.provider,...t.result.details?.durationMs?{durationSeconds:t.result.details.durationMs/1e3}:{},...t.result.details?.taskId?{taskId:t.result.details.taskId}:{}});if(l.length>0)try{let p=await t.mediaPersistence.downloadAll(l,{type:a,sessionId:t.sessionId||void 0},{warn:u=>t.log(u)});if(p.length>0){for(let u of p)r=r.replaceAll(u.remoteUrl,u.localPath);t.sendNotification("turn.media_persisted",{turnId:t.turnId,files:p.map(u=>({remoteUrl:u.remoteUrl,localPath:u.localPath,bytes:u.bytes,mimeType:u.mimeType}))})}}catch{}}if(i==="task"&&!o&&t.result.details?.taskList)try{let l=t.result.details;l?.taskList&&t.sendNotification("turn.todos_updated",{turnId:t.turnId,items:l.taskList,summary:{total:l.total??l.taskList.length,completed:l.completed??0,inProgress:l.inProgress??0,notStarted:l.notStarted??0}})}catch{}let c=Array.isArray(t.result.details?.matches)?t.result.details.matches:void 0;return{result:r,error:s,toolReferences:c,imageUrls:n,details:t.result.details}}function _A(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_${YB().slice(0,8)}`;try{let a=JSON.parse(n),c=await s.execute(i,a,o);return await MA({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 DA(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=_A({mediaPersistence:t.mediaPersistence,toolCatalog:t.toolCatalog,getSessionId:()=>t.sessionId,log:i=>t.log(i),sendNotification:t.sendNotification}),n=IA({resolvedConfig:t.resolvedTextConfig,providerRegistry:t.providerRegistry,sessionId:t.sessionId}),o=CA({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:EA({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 QB=JB(import.meta.url);function ZB(){for(let t of["../package.json","../../package.json"])try{return QB(t).version}catch{}return"0.0.0"}var NA=ZB();var e1=new Set(["thread.user_response","tool.approval.response"]);var Oa=class{running=!1;startedAt=Date.now();packageVersion=NA;rpcContract=new Un;rpcIds=new Map;rpcDeadlineTimers=new Map;activeTurn=null;turnDone=Promise.resolve();verbose;transport;runtimeServices;runtimeSession=new na;agent=null;lastLlmConfigKey="";currentSessionId="";currentTurnId="";currentTransport=null;currentApiKey="";currentModel="";currentProvider="";currentBaseUrl="";sessionState=null;currentMediaApiKeys=null;taskStore=new Zo;memoryPrefetchState=kt();lastUserMessageForAutoExtract;lastAssistantMessageForExtract;memdir=null;projectMemoryStoreFactory=Pw();pendingAskUser=new Map;sessionTaskDomain;multiAgentHandlerHost;acpServer=null;sessionHistory=new aa;idleDreamCoordinator;petConfirmCoordinator;modelRegistryHydration=null;get registry(){return this.runtimeServices.providerRegistry}get mediaClient(){return this.runtimeServices.mediaClient}get mediaPersistence(){return this.runtimeServices.mediaPersistence}get pathService(){return this.runtimeServices.pathService}get toolCatalog(){return this.runtimeServices.toolCatalog}get petRuntime(){return this.runtimeServices.petRuntime}get currentHooks(){return this.runtimeSession.currentHooks}get permissionChecker(){return this.runtimeSession.permissionChecker}set permissionChecker(e){this.runtimeSession.permissionChecker=e}set mcpManager(e){this.runtimeSession.mcpManager=e}get memoryProvider(){return this.runtimeSession.memoryProvider}set memoryProvider(e){this.runtimeSession.memoryProvider=e}get memoryDreamProvider(){return this.runtimeSession.memoryDreamProvider}set memoryDreamProvider(e){this.runtimeSession.memoryDreamProvider=e}get memoryUserId(){return this.runtimeSession.memoryUserId}set memoryUserId(e){this.runtimeSession.memoryUserId=e}constructor(e){this.verbose=e.verbose,this.runtimeServices=rP({verbose:e.verbose,getActiveProjectRoot:()=>this.getActiveProjectRoot(),resolveClientForPurpose:r=>this.resolveClientForPurpose(r),log:r=>this.log(r),sendNotification:(r,n)=>this.sendNotification(r,n)}),this.petConfirmCoordinator=new la({getPermissionResolver:()=>this.permissionChecker,sendNotification:(r,n)=>this.sendNotification(r,n)}),this.multiAgentHandlerHost=pw({getActiveProjectRoot:()=>this.getActiveProjectRoot(),emitAgentStatus:(r,n,o)=>this.emitAgentStatus(r,n,o),handleMcpToolCall:(r,n,o)=>this.handleMcpToolCall(r,n,o),log:r=>this.log(r),sendNotification:(r,n)=>this.sendNotification(r,n),sendResponse:(r,n,o)=>this.sendResponse(r,n,o)}),this.idleDreamCoordinator=new ca({log:r=>this.log(r),sendNotification:(r,n)=>this.sendNotification(r,n),getCurrentSessionId:()=>this.currentSessionId,getCurrentTurnCount:()=>this.sessionState?.turnCount??0,getActiveTurn:()=>this.activeTurn,resolveDreamClient:()=>this.resolveClientForPurpose("textGeneration"),resolveMemoryRoot:()=>_p.join(this.pathService.getProjectAgentDir(this.getActiveProjectRoot()),"memory"),resolveTranscriptDir:()=>this.pathService.getProjectSessionsRoot(this.getActiveProjectRoot()),listRecentSessions:()=>Rt(20,this.getActiveProjectRoot()),runDream:r=>an.call(this.createDreamHandlerHost(),r)}),D().onChange(()=>{this.lastLlmConfigKey=""}),this.ensureModelRegistryHydrated().catch(()=>{}),this.idleDreamCoordinator.applyEnvOverrides(process.env),this.transport=e.transport??new Gr({verbose:e.verbose}),this.taskStore.onTaskChange((r,n)=>{n&&this.sendNotification("task.updated",{taskId:r,type:n.type,lifecycle:n.lifecycle,label:n.label})})}getActiveProjectRoot(){return this.pathService.getActiveProjectRoot()}async ensureModelRegistryHydrated(){return this.modelRegistryHydration||(this.modelRegistryHydration=(async()=>{let e=D();e.load(),await $n(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(Hc(e)||Hn(e)){this.acpServer.dispatchMessage(e);return}if(Fn(e)){let r=e.method;if(r==="initialize"||r.startsWith("session/")||r.startsWith("x/")||r.startsWith("fs/")){this.acpServer.dispatchMessage(e);return}}}if(!Uc(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 bm(),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=MT(this);handleMessage(e){if(e.id!==void 0&&!e1.has(e.method)){let n=ss(e);if(!n.ok){this.sendContractError(e.id,n.error);return}let o=this.rpcContract.begin(e.method,n.meta);if(o.status==="rejected"){this.sendContractError(e.id,o.error);return}if(o.status==="deduped"){this.sendContractErrorOrResult(e.id,o.result,o.error);return}this.rpcIds.set(e.id,n.meta),this.scheduleRpcDeadline(e.id,e.method,n.meta)}let r=this.methodHandlers.get(e.method);r?r(e):e.id!==void 0&&this.sendResponse(e.id,void 0,{code:y.METHOD_NOT_FOUND,message:`Unknown method: ${e.method}`})}ensureDefaultProject(){this.memdir=bw({pathService:this.pathService,projectMemoryStoreFactory:this.projectMemoryStoreFactory,sendNotification:(e,r)=>this.sendNotification(e,r)})}resolveClientForPurpose(e){return gw({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=mw(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=DA({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",hw(e,r,n))}createDreamHandlerHost(){return yw({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:()=>_p.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 kw({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 fw({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)Om(this.acpServer,this.acpServer.sessionId,e,r);else{let n={jsonrpc:"2.0",method:e,params:r};this.writeStdout(n)}this.idleDreamCoordinator.handleTurnNotification(e)}writeStdout(e){this.transport.send(e)}log(e){this.verbose&&process.stderr.write(`${JSON.stringify({ts:new Date().toISOString(),level:"info",service:"qlogicagent",message:e})}
|
|
1136
|
-
`)}enableIdleDream(e){this.idleDreamCoordinator.enable(e)}cancelIdleDreamTimer(){this.idleDreamCoordinator.cancelTimer()}disposeSessionRuntime(){this.runtimeSession.unregisterPermissions(),this.closeMemoryProviders(),this.agent=null,this.lastLlmConfigKey="",this.memoryPrefetchState=kt(),this.runtimeSession.resetAfterSessionDispose()}closeMemoryProviders(){this.runtimeServices.closeMemoryProviders({memoryProvider:this.memoryProvider,memoryDreamProvider:this.memoryDreamProvider}),this.runtimeSession.resetMemoryProviders()}initAcpServer(){let e=aw(this,
|
|
1137
|
-
`;
|
|
1133
|
+
`).find(E=>E.trim()&&!E.startsWith("#"))?.trim()??`Skill from ${g}`;a.push({name:u.name,description:C,category:g,scope:h,version:v})}catch{}}}catch{}for(let d of t.getPluginSkills())i&&d.source!==i||(c.add(d.source??"plugin"),a.push({name:d.name,description:`Plugin skill (${d.source})`,category:d.source,scope:"plugin"}));return{skills:a,categories:[...c]}},readSkillContent:async i=>{for(let a of s){let c=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)=>wP({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=ad(u,i.name,`Skill: ${i.name}`)??u,g=Bs(f,i.name);if(!g.valid)return{success:!1,message:`Skill validation failed: ${g.errors.join("; ")}`};let h=ue(p);if(h.records[i.name]?.pinned&&le.existsSync(d))return{success:!1,message:`Skill "${i.name}" is pinned. Unpin it first.`};await le.promises.mkdir(l,{recursive:!0}),await le.promises.writeFile(d,f,"utf8"),t.sendNotification("turn.skill_instruction",{turnId:`skill-create-${Date.now()}`,instruction:{name:i.name,category:i.category??"learned",content:f,scope:"project"}}),gt(),It(h,i.name,"created"),he(p,h);let b=t.getMemoryLearningSink(),v=t.getMemoryUserId();if(b&&v){let S=f.split(`
|
|
1134
|
+
`).slice(0,3).join(" ").slice(0,200),T=a?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=ad(m,i.name)??m;return await le.promises.writeFile(d,g,"utf8"),od(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"),od(u,i.name),he(p,u),t.sendNotification("turn.skill_instruction",{turnId:`skill-patch-${Date.now()}`,instruction:{name:i.name,category:i.category??"learned",content:f,scope:"project"}}),{success:!0,message:`Skill "${i.name}" patched`,path:d}}case"delete":{let u=ue(p);return u.records[i.name]?.pinned?{success:!1,message:`Skill "${i.name}" is pinned. Unpin it first.`}:(await le.promises.rm(l,{recursive:!0,force:!0}),$s(u,i.name),he(p,u),t.sendNotification("turn.skill_instruction",{turnId:`skill-delete-${Date.now()}`,instruction:{name:i.name,category:i.category??"learned",action:"delete",scope:"project"}}),gt(),{success:!0,message:`Skill "${i.name}" deleted`})}default:return{success:!1,message:`Unknown action: ${i.action}`}}},promoteSkill:async i=>{let a=n.getProjectSkillsDir(t.getActiveProjectRoot()),c=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"}}),gt(),{success:!0,message:`Skill "${i}" promoted to global (user-level) and removed from project scope. It will now be available across all projects.`,path:d}}}))}function CP(t){let e=pP({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;QA({config:t.config,projectRoot:t.projectRoot,pathService:t.pathService,log:t.log,toolCatalog:t.toolCatalog,currentManager:t.currentMcpManager,setManager:t.setMcpManager,setReady:t.setMcpReady}),oP({config:t.config,hooks:r,log:t.log,pathService:t.pathService,toolCatalog:t.toolCatalog,setPluginLoader:t.setPluginLoader});let n=cP({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 xP({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}),LA({config:t.config,host:t.coreToolHost,hooks:r,log:t.log,toolCatalog:t.toolCatalog,toolInvoker:t.toolInvoker}),WA({config:t.config,pathService:t.pathService,toolCatalog:t.toolCatalog}),t.sessionId&&r.invoke("session.created",{sessionId:t.sessionId}).catch(()=>{}),hP({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 IP(t){let{provider:e,model:r,apiKey:n,baseUrl:o}=t.resolvedConfig,s=ei({provider:e,model:r,apiKey:n,baseUrl:o},t.providerRegistry);return s.transport=kv(s.transport,t.sessionId||"default"),{transport:s.transport,apiKey:n,model:r,provider:e,baseUrl:o??""}}function EP(t){return{agent:new on({llmTransport:t.client.transport,apiKey:t.client.apiKey,toolInvoker:t.toolInvoker,log:t.log,hooks:t.hooks,maxRounds:t.maxRounds,verbose:t.verbose,projectRoot:t.projectRoot,runtimePorts:Rs()}),...t.client}}import{randomUUID as YB}from"node:crypto";async function MP(t){let e=[],r=t.result.content.map(l=>{if(l.type==="image"&&l.data){let d=l.mimeType||"image/png";return e.push(`data:${d};base64,${l.data}`),"[Image]"}return l.text??""}).join(`
|
|
1135
|
+
`),n=e.length>0?[...e,...t.result.imageUrls??[]]:t.result.imageUrls,o=t.result.details?.error,s=o?r:void 0,i=t.result.details?.type,a=i?.split("_")[0];if(i==="three_d_generate"&&(a="3d"),a&&["image","tts","video","music","3d"].includes(a)){let l=t.result.details?.mediaUrls??[],d=a;for(let p of l)t.sendNotification("turn.media_result",{turnId:t.turnId,mediaType:d,url:p,model:t.result.details?.model,provider:t.result.details?.provider,...t.result.details?.durationMs?{durationSeconds:t.result.details.durationMs/1e3}:{},...t.result.details?.taskId?{taskId:t.result.details.taskId}:{}});if(l.length>0)try{let p=await t.mediaPersistence.downloadAll(l,{type:a,sessionId:t.sessionId||void 0},{warn:u=>t.log(u)});if(p.length>0){for(let u of p)r=r.replaceAll(u.remoteUrl,u.localPath);t.sendNotification("turn.media_persisted",{turnId:t.turnId,files:p.map(u=>({remoteUrl:u.remoteUrl,localPath:u.localPath,bytes:u.bytes,mimeType:u.mimeType}))})}}catch{}}if(i==="task"&&!o&&t.result.details?.taskList)try{let l=t.result.details;l?.taskList&&t.sendNotification("turn.todos_updated",{turnId:t.turnId,items:l.taskList,summary:{total:l.total??l.taskList.length,completed:l.completed??0,inProgress:l.inProgress??0,notStarted:l.notStarted??0}})}catch{}let c=Array.isArray(t.result.details?.matches)?t.result.details.matches:void 0;return{result:r,error:s,toolReferences:c,imageUrls:n,details:t.result.details}}function _P(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_${YB().slice(0,8)}`;try{let a=JSON.parse(n),c=await s.execute(i,a,o);return await MP({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 DP(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=_P({mediaPersistence:t.mediaPersistence,toolCatalog:t.toolCatalog,getSessionId:()=>t.sessionId,log:i=>t.log(i),sendNotification:t.sendNotification}),n=IP({resolvedConfig:t.resolvedTextConfig,providerRegistry:t.providerRegistry,sessionId:t.sessionId}),o=CP({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:EP({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 QB=JB(import.meta.url);function ZB(){for(let t of["../package.json","../../package.json"])try{return QB(t).version}catch{}return"0.0.0"}var NP=ZB();var e1=new Set(["thread.user_response","tool.approval.response"]);var Oa=class{running=!1;startedAt=Date.now();packageVersion=NP;rpcContract=new Un;rpcIds=new Map;rpcDeadlineTimers=new Map;activeTurn=null;turnDone=Promise.resolve();verbose;transport;runtimeServices;runtimeSession=new na;agent=null;lastLlmConfigKey="";currentSessionId="";currentTurnId="";currentTransport=null;currentApiKey="";currentModel="";currentProvider="";currentBaseUrl="";sessionState=null;currentMediaApiKeys=null;taskStore=new Zo;memoryPrefetchState=kt();lastUserMessageForAutoExtract;lastAssistantMessageForExtract;memdir=null;projectMemoryStoreFactory=Aw();pendingAskUser=new Map;sessionTaskDomain;multiAgentHandlerHost;acpServer=null;sessionHistory=new aa;idleDreamCoordinator;petConfirmCoordinator;modelRegistryHydration=null;get registry(){return this.runtimeServices.providerRegistry}get mediaClient(){return this.runtimeServices.mediaClient}get mediaPersistence(){return this.runtimeServices.mediaPersistence}get pathService(){return this.runtimeServices.pathService}get toolCatalog(){return this.runtimeServices.toolCatalog}get petRuntime(){return this.runtimeServices.petRuntime}get currentHooks(){return this.runtimeSession.currentHooks}get permissionChecker(){return this.runtimeSession.permissionChecker}set permissionChecker(e){this.runtimeSession.permissionChecker=e}set mcpManager(e){this.runtimeSession.mcpManager=e}get memoryProvider(){return this.runtimeSession.memoryProvider}set memoryProvider(e){this.runtimeSession.memoryProvider=e}get memoryDreamProvider(){return this.runtimeSession.memoryDreamProvider}set memoryDreamProvider(e){this.runtimeSession.memoryDreamProvider=e}get memoryUserId(){return this.runtimeSession.memoryUserId}set memoryUserId(e){this.runtimeSession.memoryUserId=e}constructor(e){this.verbose=e.verbose,this.runtimeServices=rA({verbose:e.verbose,getActiveProjectRoot:()=>this.getActiveProjectRoot(),resolveClientForPurpose:r=>this.resolveClientForPurpose(r),log:r=>this.log(r),sendNotification:(r,n)=>this.sendNotification(r,n)}),this.petConfirmCoordinator=new la({getPermissionResolver:()=>this.permissionChecker,sendNotification:(r,n)=>this.sendNotification(r,n)}),this.multiAgentHandlerHost=pw({getActiveProjectRoot:()=>this.getActiveProjectRoot(),emitAgentStatus:(r,n,o)=>this.emitAgentStatus(r,n,o),handleMcpToolCall:(r,n,o)=>this.handleMcpToolCall(r,n,o),log:r=>this.log(r),sendNotification:(r,n)=>this.sendNotification(r,n),sendResponse:(r,n,o)=>this.sendResponse(r,n,o)}),this.idleDreamCoordinator=new ca({log:r=>this.log(r),sendNotification:(r,n)=>this.sendNotification(r,n),getCurrentSessionId:()=>this.currentSessionId,getCurrentTurnCount:()=>this.sessionState?.turnCount??0,getActiveTurn:()=>this.activeTurn,resolveDreamClient:()=>this.resolveClientForPurpose("textGeneration"),resolveMemoryRoot:()=>_p.join(this.pathService.getProjectAgentDir(this.getActiveProjectRoot()),"memory"),resolveTranscriptDir:()=>this.pathService.getProjectSessionsRoot(this.getActiveProjectRoot()),listRecentSessions:()=>Rt(20,this.getActiveProjectRoot()),runDream:r=>an.call(this.createDreamHandlerHost(),r)}),D().onChange(()=>{this.lastLlmConfigKey=""}),this.ensureModelRegistryHydrated().catch(()=>{}),this.idleDreamCoordinator.applyEnvOverrides(process.env),this.transport=e.transport??new Gr({verbose:e.verbose}),this.taskStore.onTaskChange((r,n)=>{n&&this.sendNotification("task.updated",{taskId:r,type:n.type,lifecycle:n.lifecycle,label:n.label})})}getActiveProjectRoot(){return this.pathService.getActiveProjectRoot()}async ensureModelRegistryHydrated(){return this.modelRegistryHydration||(this.modelRegistryHydration=(async()=>{let e=D();e.load(),await $n(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(Hc(e)||Hn(e)){this.acpServer.dispatchMessage(e);return}if(Fn(e)){let r=e.method;if(r==="initialize"||r.startsWith("session/")||r.startsWith("x/")||r.startsWith("fs/")){this.acpServer.dispatchMessage(e);return}}}if(!Uc(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 bm(),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=MT(this);handleMessage(e){if(e.id!==void 0&&!e1.has(e.method)){let n=ss(e);if(!n.ok){this.sendContractError(e.id,n.error);return}let o=this.rpcContract.begin(e.method,n.meta);if(o.status==="rejected"){this.sendContractError(e.id,o.error);return}if(o.status==="deduped"){this.sendContractErrorOrResult(e.id,o.result,o.error);return}this.rpcIds.set(e.id,n.meta),this.scheduleRpcDeadline(e.id,e.method,n.meta)}let r=this.methodHandlers.get(e.method);r?r(e):e.id!==void 0&&this.sendResponse(e.id,void 0,{code:y.METHOD_NOT_FOUND,message:`Unknown method: ${e.method}`})}ensureDefaultProject(){this.memdir=bw({pathService:this.pathService,projectMemoryStoreFactory:this.projectMemoryStoreFactory,sendNotification:(e,r)=>this.sendNotification(e,r)})}resolveClientForPurpose(e){return gw({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=mw(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=DP({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",hw(e,r,n))}createDreamHandlerHost(){return yw({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:()=>_p.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 kw({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 fw({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)Om(this.acpServer,this.acpServer.sessionId,e,r);else{let n={jsonrpc:"2.0",method:e,params:r};this.writeStdout(n)}this.idleDreamCoordinator.handleTurnNotification(e)}writeStdout(e){this.transport.send(e)}log(e){this.verbose&&process.stderr.write(`${JSON.stringify({ts:new Date().toISOString(),level:"info",service:"qlogicagent",message:e})}
|
|
1136
|
+
`)}enableIdleDream(e){this.idleDreamCoordinator.enable(e)}cancelIdleDreamTimer(){this.idleDreamCoordinator.cancelTimer()}disposeSessionRuntime(){this.runtimeSession.unregisterPermissions(),this.closeMemoryProviders(),this.agent=null,this.lastLlmConfigKey="",this.memoryPrefetchState=kt(),this.runtimeSession.resetAfterSessionDispose()}closeMemoryProviders(){this.runtimeServices.closeMemoryProviders({memoryProvider:this.memoryProvider,memoryDreamProvider:this.memoryDreamProvider}),this.runtimeSession.resetMemoryProviders()}initAcpServer(){let e=aw(this,NP,this.createAcpExtendedHandlerHost());this.acpServer=new as(this.transport,e,{verbose:this.verbose})}getAcpServer(){return this.acpServer}};function LP(t){let e={verbose:!1};for(let r of t.slice(2))(r==="--verbose"||r==="-v")&&(e.verbose=!0);return e}import{writeFileSync as t1,appendFileSync as jP,mkdirSync as r1}from"node:fs";import{join as Dp}from"node:path";import{homedir as n1}from"node:os";var $P=Dp(process.env.QLOGICAGENT_HOME||Dp(n1(),".qlogicagent"),"debug-logs");try{r1($P,{recursive:!0})}catch{}var Np=Dp($P,"acp-session.log");try{t1(Np,"")}catch{}function ot(t){let e=`[${new Date().toISOString()}] ${t}
|
|
1137
|
+
`;UP.call(process.stderr,e);try{jP(Np,e)}catch{}}var UP=process.stderr.write.bind(process.stderr);process.stderr.write=((t,...e)=>{let r=typeof t=="string"?t:Buffer.from(t).toString();try{jP(Np,r)}catch{}return UP(t,...e)});ot(`PID=${process.pid} argv=${JSON.stringify(process.argv.slice(1))} cwd=${process.cwd()} HOME=${process.env.QLOGICAGENT_HOME??"(unset)"} NODE=${process.version}`);var FP=LP(process.argv),o1=!process.argv.includes("--no-acp"),s1=new Gr({verbose:FP.verbose}),Lp=new Oa({verbose:FP.verbose,transport:s1});o1&&(Lp.initAcpServer(),ot("ACP server initialized, waiting for messages"));process.on("unhandledRejection",t=>{ot(`unhandledRejection: ${t instanceof Error?t.stack??t.message:String(t)}`)});process.on("uncaughtException",t=>{ot(`uncaughtException: ${t.stack??t.message}`)});process.stdin.on("end",()=>{ot("stdin END received")});process.stdin.on("close",()=>{ot("stdin CLOSE received")});process.stdout.on("error",t=>{ot(`stdout ERROR: ${t.message}`)});process.stdout.on("close",()=>{ot("stdout CLOSE")});process.on("exit",t=>{ot(`process.exit code=${t}`)});var OP=!1;async function HP(t){if(!OP){OP=!0,ot(`${t} received`);try{await Lp.stop()}finally{process.exit(0)}}}process.on("SIGTERM",()=>{HP("SIGTERM")});process.on("SIGINT",()=>{HP("SIGINT")});process.on("SIGHUP",()=>{ot("SIGHUP received")});ot("calling server.start()");Lp.start();ot("server.start() returned, event loop active");
|