qlogicagent 2.10.24 → 2.10.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var JS=Object.defineProperty;var go=(t,e)=>()=>(t&&(e=t(t=0)),e);var Dd=(t,e)=>{for(var r in e)JS(t,r,{get:e[r],enumerable:!0})};import{homedir as GT}from"node:os";import{join as J}from"node:path";import{existsSync as KT}from"node:fs";function B(){return process.env.QLOGICAGENT_HOME||J(GT(),Oe)}function ru(){return J(B(),"settings.json")}function nu(){return J(B(),"memory","memories.db")}function Er(){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 zT(t){let e=t.trim();if(!e)throw new Error("ownerUserId is required for profile-scoped storage");return encodeURIComponent(e).replace(/\./g,"%2E")}function q(t=Er()){return J(B(),"profiles",zT(t))}function ou(t=Er()){return J(q(t),"memory")}function su(){return J(q(),"plugins")}function ft(){return J(q(),"skills")}function de(){return J(q(),"settings.json")}function iu(){return J(B(),"cache")}function au(){return J(q(),"plugin-cache")}function cu(){return J(q(),"mcp.json")}function lu(){return J(q(),"marketplace.json")}function du(){return J(q(),"workflows")}function uu(){return J(q(),"rules")}function ae(t){if(!t)throw new Error("getProjectAgentDir: cwd is required (must not fall back to process.cwd())");return J(t,Oe)}function pu(t){return J(ae(t),"workflows")}function Et(t){return J(ae(t),"skills")}function cr(t){return J(ae(t),"INSTRUCTIONS.md")}function Zt(t){return J(ae(t),"rules")}function _t(t){return J(ae(t),"sessions")}function mu(t,e){let r=J(ae(t),"checkpoints");return e?J(r,e):r}function gu(t){return J(t,Oe,"hooks")}function fu(t,e){return t.filter(r=>r!==e&&KT(J(r,Oe,"skills")))}var Oe,N=go(()=>{"use strict";Oe=".qlogicagent"});var So,Au=go(()=>{"use strict";So=class{pools=new Map;runtimeStates=new Map;constructor(e){if(e)for(let r of e){this.pools.set(r.providerId,r);for(let n of r.keys)this.runtimeStates.set(n.id,this.createInitialState())}}acquireKey(e){let r=this.pools.get(e);if(!r||r.keys.length===0)return null;let n=Date.now(),o=this.getHealthyCandidates(r,n);if(o.length===0)return null;let s=this.selectByStrategy(o,r.strategy,n);if(!s)return null;let i=this.runtimeStates.get(s.id);return i.inFlight++,i.totalRequests++,i.lastUsedAt=n,i.requestTimestamps.push(n),{keyId:s.id,apiKey:s.key,providerId:e,release:a=>this.releaseKey(s.id,a)}}releaseKey(e,r){let n=this.runtimeStates.get(e);if(n)if(n.inFlight=Math.max(0,n.inFlight-1),r.success)n.consecutiveErrors=0,n.healthStatus="healthy",r.tokens&&(n.totalTokens+=r.tokens,n.tokenCounts.push(r.tokens));else if(n.consecutiveErrors++,n.lastErrorAt=Date.now(),r.errorCode===429){let o=r.retryAfter?r.retryAfter*1e3:3e4;n.cooldownUntil=Date.now()+o,n.healthStatus="cooldown"}else n.consecutiveErrors>=5?(n.cooldownUntil=Date.now()+6e4,n.healthStatus="cooldown"):n.consecutiveErrors>=3&&(n.healthStatus="degraded")}addProvider(e,r){this.pools.has(e)||this.pools.set(e,{providerId:e,baseUrl:r?.baseUrl,strategy:r?.strategy??"weighted-round-robin",keys:[],rateLimit:r?.rateLimit})}removeProvider(e){let r=this.pools.get(e);if(r){for(let n of r.keys)this.runtimeStates.delete(n.id);this.pools.delete(e)}}addKey(e,r,n){let o=this.pools.get(e);o||(o={providerId:e,strategy:"weighted-round-robin",keys:[]},this.pools.set(e,o));let s=n?.id??crypto.randomUUID(),i={id:s,key:r,label:n?.label,weight:n?.weight??1,enabled:n?.enabled??!0};return o.keys.push(i),this.runtimeStates.set(s,this.createInitialState()),s}removeKey(e){for(let r of this.pools.values()){let n=r.keys.findIndex(o=>o.id===e);if(n!==-1){r.keys.splice(n,1),this.runtimeStates.delete(e);return}}}updateKey(e,r){for(let n of this.pools.values()){let o=n.keys.find(s=>s.id===e);if(o){if(r.label!==void 0&&(o.label=r.label),r.weight!==void 0&&(o.weight=r.weight),r.enabled!==void 0){o.enabled=r.enabled;let s=this.runtimeStates.get(e);s&&(s.healthStatus=r.enabled?"healthy":"disabled")}return}}}setKeyHealth(e,r){let n=this.runtimeStates.get(e);n&&(n.healthStatus=r)}setStrategy(e,r){let n=this.pools.get(e);n&&(n.strategy=r)}setRateLimit(e,r){let n=this.pools.get(e);n&&(n.rateLimit=r)}getPoolStatus(e){let r=this.pools.get(e);return r?this.buildPoolStatus(r):null}getAllStatus(){return[...this.pools.values()].map(e=>this.buildPoolStatus(e))}getProviderIds(){return[...this.pools.keys()]}hasProvider(e){return this.pools.has(e)}hasAvailableKey(e){let r=this.pools.get(e);return r?this.getHealthyCandidates(r,Date.now()).length>0:!1}exportConfig(){return[...this.pools.values()]}reloadConfig(e){let r=new Set;for(let n of e){this.pools.set(n.providerId,n);for(let o of n.keys)r.add(o.id),this.runtimeStates.has(o.id)||this.runtimeStates.set(o.id,this.createInitialState())}for(let n of[...this.pools.keys()])e.some(o=>o.providerId===n)||this.pools.delete(n);for(let n of[...this.runtimeStates.keys()])r.has(n)||this.runtimeStates.delete(n)}createInitialState(){return{inFlight:0,totalRequests:0,totalTokens:0,lastUsedAt:0,lastErrorAt:0,consecutiveErrors:0,cooldownUntil:0,healthStatus:"healthy",requestTimestamps:[],tokenCounts:[]}}getHealthyCandidates(e,r){let n=[];for(let o of e.keys){if(!o.enabled)continue;let s=this.runtimeStates.get(o.id);if(s){if(s.healthStatus==="cooldown")if(r>=s.cooldownUntil)s.healthStatus="healthy",s.consecutiveErrors=0;else continue;s.healthStatus!=="disabled"&&(e.rateLimit?.rpm&&(this.pruneWindow(s.requestTimestamps,r),s.requestTimestamps.length>=e.rateLimit.rpm*.9)||e.rateLimit?.tpm&&(this.pruneWindow(s.tokenCounts,r),s.tokenCounts.reduce((a,c)=>a+c,0)>=e.rateLimit.tpm*.9)||n.push(o))}}return n}selectByStrategy(e,r,n){if(e.length===0)return null;if(e.length===1)return e[0];switch(r){case"weighted-round-robin":return this.weightedRandom(e);case"least-busy":return this.leastBusy(e);case"random":return e[Math.floor(Math.random()*e.length)];default:return this.weightedRandom(e)}}weightedRandom(e){let r=e.reduce((o,s)=>o+s.weight,0),n=Math.random()*r;for(let o of e)if(n-=o.weight,n<=0)return o;return e[e.length-1]}leastBusy(e){let r=1/0,n=e[0];for(let o of e){let i=this.runtimeStates.get(o.id)?.inFlight??0;(i<r||i===r&&o.weight>n.weight)&&(r=i,n=o)}return n}pruneWindow(e,r){let n=r-6e4;for(;e.length>0&&e[0]<n;)e.shift()}buildPoolStatus(e){return{providerId:e.providerId,baseUrl:e.baseUrl,strategy:e.strategy,rateLimit:e.rateLimit,keys:e.keys.map(r=>{let n=this.runtimeStates.get(r.id)??this.createInitialState();return{...r,inFlight:n.inFlight,totalRequests:n.totalRequests,totalTokens:n.totalTokens,lastUsedAt:n.lastUsedAt,lastErrorAt:n.lastErrorAt,consecutiveErrors:n.consecutiveErrors,cooldownUntil:n.cooldownUntil,healthStatus:r.enabled?n.healthStatus:"disabled"}})}}}});var Cu={};Dd(Cu,{ALL_PURPOSES:()=>dn,ModelRegistry:()=>To,deriveModelPurposes:()=>xu,getModelRegistry:()=>M,resetModelRegistry:()=>tA});import*as he from"node:fs";import{ProviderRegistry as ZT,ProviderVariantResolver as eA}from"@xiaozhiclaw/provider-core";function M(){return ln||(ln=new To,ln.load()),ln}function tA(){ln=null}function rA(t){let e=ru();if(t===e||!he.existsSync(e))return;let r=wu(e);if(!Pu(r))return;let n=wu(t);if(Pu(n))return;let o={...r,...n,providers:r.providers,models:r.models??n.models,bindings:nA(n)?n.bindings:r.bindings,migrations:{...ba(r.migrations)?r.migrations:{},...ba(n.migrations)?n.migrations:{},legacyGlobalSettingsImportedAt:new Date().toISOString()}},s=t.replace(/[/\\][^/\\]+$/,"");he.existsSync(s)||he.mkdirSync(s,{recursive:!0}),he.writeFileSync(t,JSON.stringify(o,null,2),"utf-8")}function wu(t){try{return JSON.parse(he.readFileSync(t,"utf-8"))}catch{return{}}}function Pu(t){return Array.isArray(t.providers)&&t.providers.length>0}function nA(t){return ba(t.bindings)&&Object.keys(t.bindings).length>0}function ba(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function xu(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 oA(t){switch(t){case"openai-chat":case"openai-responses":case"anthropic-messages":case"volcengine-responses":return t;default:return}}function sA(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 oA(e)}}function iA(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 dn,To,ln,qe=go(()=>{"use strict";N();Au();dn=["textGeneration","smallModel","stt","tts","imageGeneration","imageUnderstanding","videoGeneration","videoUnderstanding","threeDGeneration","embedding","voiceClone","musicGeneration","realtimeAudio","realtimeVideo"],To=class{keyPool;coreProviderRegistry=new ZT;providerVariantResolver=new eA(this.coreProviderRegistry);models=new Map;modelEnabledOverrides=new Map;bindings={};settingsPath;changeListeners=[];constructor(e){this.settingsPath=de(),this.keyPool=new So(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),u=this.getProviderBaseUrl(l);return{provider:s,model:i,apiKey:c.apiKey,baseUrl:d??(n.provider===s?n.baseUrl:void 0)??u,keyHandle:c}}peekActiveModel(e){let r=this.bindings[e];return r?this.models.get(r)??null:null}isAvailable(e){let r=this.peekActiveModel(e);return!!r?.enabled&&this.hasAvailableKeyForProviderVariant(r.provider)}resolveModelForPurpose(e){let r=this.peekActiveModel(e);return r?r.model:null}addProvider(e,r){this.keyPool.addProvider(e,r),this.emitChange()}removeProvider(e){this.keyPool.removeProvider(e);for(let[r,n]of this.models)n.provider===e&&this.removeModel(r);this.emitChange()}addKey(e,r,n){let o=this.keyPool.addKey(e,r,n);return this.emitChange(),o}removeKey(e){this.keyPool.removeKey(e),this.emitChange()}updateKey(e,r){this.keyPool.updateKey(e,r),this.emitChange()}setKeyHealth(e,r){this.keyPool.setKeyHealth(e,r),this.emitChange()}setStrategy(e,r){this.keyPool.setStrategy(e,r),this.emitChange()}addModel(e){let r=e.id??`${e.provider}:${e.model}`;return this.models.set(r,{...e,id:r,enabled:this.modelEnabledOverrides.get(r)??e.enabled}),this.emitChange(),r}replaceCatalogModels(e){let r=new Map;for(let n of e)r.set(n.id,{...n,enabled:this.modelEnabledOverrides.get(n.id)??n.enabled});for(let n of this.modelEnabledOverrides.keys())r.has(n)||this.modelEnabledOverrides.delete(n);this.models=r;for(let[n,o]of Object.entries(this.bindings))o&&!this.models.has(o)&&delete this.bindings[n];this.emitChange()}replaceProviderModels(e,r){let n=new Map;for(let[s,i]of this.models)i.provider!==e&&n.set(s,i);for(let s of r)s.provider===e&&n.set(s.id,{...s,enabled:this.modelEnabledOverrides.get(s.id)??s.enabled});let o=`${e}:`;for(let s of this.modelEnabledOverrides.keys())s.startsWith(o)&&!n.has(s)&&this.modelEnabledOverrides.delete(s);this.models=n;for(let[s,i]of Object.entries(this.bindings))i&&!this.models.has(i)&&delete this.bindings[s];this.emitChange()}migrateModelIds(e){for(let[r,n]of e){let o=this.modelEnabledOverrides.get(r);o!==void 0&&!this.modelEnabledOverrides.has(n)&&this.modelEnabledOverrides.set(n,o),this.modelEnabledOverrides.delete(r);for(let[s,i]of Object.entries(this.bindings))i===r&&(this.bindings[s]=n)}this.emitChange()}removeModel(e){this.models.delete(e),this.modelEnabledOverrides.delete(e);for(let[r,n]of Object.entries(this.bindings))n===e&&delete this.bindings[r];this.emitChange()}enableModel(e){let r=this.models.get(e);r&&(r.enabled=!0),this.modelEnabledOverrides.set(e,!0),this.emitChange()}disableModel(e){let r=this.models.get(e);r&&(r.enabled=!1),this.modelEnabledOverrides.set(e,!1),this.emitChange()}listModels(e){let r=[...this.models.values()];return e?.purpose&&(r=r.filter(n=>n.purposes.includes(e.purpose))),e?.provider&&(r=r.filter(n=>n.provider===e.provider)),e?.enabledOnly&&(r=r.filter(n=>n.enabled)),r}getModel(e){return this.models.get(e)??null}setBinding(e,r){let n=this.models.get(r);if(!n)throw new Error(`Model "${r}" not found in pool.`);if(!n.purposes.includes(e))throw new Error(`Model "${r}" does not support purpose "${e}".`);this.bindings[e]=r,this.emitChange()}removeBinding(e){delete this.bindings[e],this.emitChange()}getBinding(e){let r=this.bindings[e];return r?this.models.get(r)??null:null}getAllBindings(){let e={};for(let r of dn){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{he.existsSync(this.settingsPath)&&(e=JSON.parse(he.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(/[/\\][^/\\]+$/,"");he.existsSync(n)||he.mkdirSync(n,{recursive:!0}),he.writeFileSync(this.settingsPath,JSON.stringify(r,null,2),"utf-8")}load(){try{if(rA(this.settingsPath),!he.existsSync(this.settingsPath))return!1;let e=he.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(!he.existsSync(this.settingsPath))return;let r=he.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.coreProviderRegistry.getProvider(e);return r?{id:r.id,name:r.name,transport:r.transport,baseUrl:r.baseUrl,defaultModel:r.defaultModel,group:r.group,models:this.coreProviderRegistry.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.coreProviderRegistry.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.providerVariantResolver.resolveBest({publicModel:e.model,requestedProtocol:sA(r,e.transport),capabilities:iA(r),purpose:r,userPreference:{providerIds:n}});if(o)return{provider:o.provider,nativeModelId:o.nativeModelId}}providerVariantKeyCandidates(e){let r=[e],n=this.coreProviderRegistry.getProvider(e),o=n?.group??n?.id??e;for(let s of this.coreProviderRegistry.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.coreProviderRegistry.listProviders())for(let o of this.coreProviderRegistry.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:xu(o),baseUrl:n.baseUrl,enabled:this.modelEnabledOverrides.get(i)??!1,nativeModelId:o.id,transport:n.transport,contextWindow:o.contextWindow,maxOutput:o.maxOutput,streamRequired:o.streamRequired,capabilities:[...o.toolCall?["toolCall"]:[],...o.reasoning?["reasoning"]:[],...o.vision?["vision"]:[],...o.mediaType?[o.mediaType]:[]],pricing:{inputPer1M:o.costInput,outputPer1M:o.costOutput,cacheReadPer1M:o.costCacheRead,cacheWritePer1M:o.costCacheWrite}})}let r=new Map;for(let n of e)r.set(n.id,n);this.models=r}exportModelState(){let e=new Map;for(let[r,n]of this.modelEnabledOverrides)e.set(r,n);for(let r of this.models.values())e.set(r.id,r.enabled);return[...e.entries()].map(([r,n])=>({id:r,enabled:n}))}emitChange(){for(let e of this.changeListeners)try{e()}catch{}}},ln=null});var em={};Dd(em,{resolveToolEligibility:()=>YP});function zP(t,e){if(KP.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 VP(t,e){let r=t.function.name,n=t.meta,o=[];return e.blockedToolNames?.includes(r)?(o.push("policy_blocked"),{level:5,reasons:o}):n?.isReadOnly?(o.push("always_allowed"),{level:1,reasons:o}):n?.requiresApproval?(o.push("approval_required"),{level:4,reasons:o}):n?.isDangerous||zP(r,e.dangerousPatterns)?(o.push("dangerous_tool"),{level:3,reasons:o}):{level:2,reasons:o}}function XP(t){switch(t){case 1:return"eligible";case 2:return"eligible";case 3:return"dangerous-notify";case 4:return"approval-required";case 5:return"blocked-by-policy"}}function YP(t,e={}){let r=new Map,n=[],o=[],s=[];for(let i of t){let a=i.function.name,{level:c,reasons:l}=VP(i,e),d=XP(c),u={toolName:a,status:d,permissionLevel:c,approvalRequired:c===4,reasonCodes:l};r.set(a,u),c===5?o.push(u):(n.push(i),c===4&&s.push(u))}return{eligibleTools:n,blockedTools:o,approvalRequiredTools:s,eligibilityByName:r}}var KP,tm=go(()=>{"use strict";KP=[/^(?:bash|shell|exec|terminal|run_command)$/i,/^(?:write_file|delete_file|move_file|create_directory)$/i,/^(?:git_push|git_reset|git_force)$/i]});import{createRequire as FO}from"node:module";import{createInterface as QS}from"node:readline";var xr=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 JS=Object.defineProperty;var go=(t,e)=>()=>(t&&(e=t(t=0)),e);var Dd=(t,e)=>{for(var r in e)JS(t,r,{get:e[r],enumerable:!0})};import{homedir as GT}from"node:os";import{join as J}from"node:path";import{existsSync as KT}from"node:fs";function B(){return process.env.QLOGICAGENT_HOME||J(GT(),Oe)}function ru(){return J(B(),"settings.json")}function nu(){return J(B(),"memory","memories.db")}function Er(){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 zT(t){let e=t.trim();if(!e)throw new Error("ownerUserId is required for profile-scoped storage");return encodeURIComponent(e).replace(/\./g,"%2E")}function q(t=Er()){return J(B(),"profiles",zT(t))}function ou(t=Er()){return J(q(t),"memory")}function su(){return J(q(),"plugins")}function ft(){return J(q(),"skills")}function de(){return J(q(),"settings.json")}function iu(){return J(B(),"cache")}function au(){return J(q(),"plugin-cache")}function cu(){return J(q(),"mcp.json")}function lu(){return J(q(),"marketplace.json")}function du(){return J(q(),"workflows")}function uu(){return J(q(),"rules")}function ae(t){if(!t)throw new Error("getProjectAgentDir: cwd is required (must not fall back to process.cwd())");return J(t,Oe)}function pu(t){return J(ae(t),"workflows")}function Et(t){return J(ae(t),"skills")}function cr(t){return J(ae(t),"INSTRUCTIONS.md")}function Zt(t){return J(ae(t),"rules")}function _t(t){return J(ae(t),"sessions")}function mu(t,e){let r=J(ae(t),"checkpoints");return e?J(r,e):r}function gu(t){return J(t,Oe,"hooks")}function fu(t,e){return t.filter(r=>r!==e&&KT(J(r,Oe,"skills")))}var Oe,N=go(()=>{"use strict";Oe=".qlogicagent"});var So,Au=go(()=>{"use strict";So=class{pools=new Map;runtimeStates=new Map;constructor(e){if(e)for(let r of e){this.pools.set(r.providerId,r);for(let n of r.keys)this.runtimeStates.set(n.id,this.createInitialState())}}acquireKey(e){let r=this.pools.get(e);if(!r||r.keys.length===0)return null;let n=Date.now(),o=this.getHealthyCandidates(r,n);if(o.length===0)return null;let s=this.selectByStrategy(o,r.strategy,n);if(!s)return null;let i=this.runtimeStates.get(s.id);return i.inFlight++,i.totalRequests++,i.lastUsedAt=n,i.requestTimestamps.push(n),{keyId:s.id,apiKey:s.key,providerId:e,release:a=>this.releaseKey(s.id,a)}}releaseKey(e,r){let n=this.runtimeStates.get(e);if(n)if(n.inFlight=Math.max(0,n.inFlight-1),r.success)n.consecutiveErrors=0,n.healthStatus="healthy",r.tokens&&(n.totalTokens+=r.tokens,n.tokenCounts.push(r.tokens));else if(n.consecutiveErrors++,n.lastErrorAt=Date.now(),r.errorCode===429){let o=r.retryAfter?r.retryAfter*1e3:3e4;n.cooldownUntil=Date.now()+o,n.healthStatus="cooldown"}else n.consecutiveErrors>=5?(n.cooldownUntil=Date.now()+6e4,n.healthStatus="cooldown"):n.consecutiveErrors>=3&&(n.healthStatus="degraded")}addProvider(e,r){this.pools.has(e)||this.pools.set(e,{providerId:e,baseUrl:r?.baseUrl,strategy:r?.strategy??"weighted-round-robin",keys:[],rateLimit:r?.rateLimit})}removeProvider(e){let r=this.pools.get(e);if(r){for(let n of r.keys)this.runtimeStates.delete(n.id);this.pools.delete(e)}}addKey(e,r,n){let o=this.pools.get(e);o||(o={providerId:e,strategy:"weighted-round-robin",keys:[]},this.pools.set(e,o));let s=n?.id??crypto.randomUUID(),i={id:s,key:r,label:n?.label,weight:n?.weight??1,enabled:n?.enabled??!0};return o.keys.push(i),this.runtimeStates.set(s,this.createInitialState()),s}removeKey(e){for(let r of this.pools.values()){let n=r.keys.findIndex(o=>o.id===e);if(n!==-1){r.keys.splice(n,1),this.runtimeStates.delete(e);return}}}updateKey(e,r){for(let n of this.pools.values()){let o=n.keys.find(s=>s.id===e);if(o){if(r.label!==void 0&&(o.label=r.label),r.weight!==void 0&&(o.weight=r.weight),r.enabled!==void 0){o.enabled=r.enabled;let s=this.runtimeStates.get(e);s&&(s.healthStatus=r.enabled?"healthy":"disabled")}return}}}setKeyHealth(e,r){let n=this.runtimeStates.get(e);n&&(n.healthStatus=r)}setStrategy(e,r){let n=this.pools.get(e);n&&(n.strategy=r)}setRateLimit(e,r){let n=this.pools.get(e);n&&(n.rateLimit=r)}getPoolStatus(e){let r=this.pools.get(e);return r?this.buildPoolStatus(r):null}getAllStatus(){return[...this.pools.values()].map(e=>this.buildPoolStatus(e))}getProviderIds(){return[...this.pools.keys()]}hasProvider(e){return this.pools.has(e)}hasAvailableKey(e){let r=this.pools.get(e);return r?this.getHealthyCandidates(r,Date.now()).length>0:!1}exportConfig(){return[...this.pools.values()]}reloadConfig(e){let r=new Set;for(let n of e){this.pools.set(n.providerId,n);for(let o of n.keys)r.add(o.id),this.runtimeStates.has(o.id)||this.runtimeStates.set(o.id,this.createInitialState())}for(let n of[...this.pools.keys()])e.some(o=>o.providerId===n)||this.pools.delete(n);for(let n of[...this.runtimeStates.keys()])r.has(n)||this.runtimeStates.delete(n)}createInitialState(){return{inFlight:0,totalRequests:0,totalTokens:0,lastUsedAt:0,lastErrorAt:0,consecutiveErrors:0,cooldownUntil:0,healthStatus:"healthy",requestTimestamps:[],tokenCounts:[]}}getHealthyCandidates(e,r){let n=[];for(let o of e.keys){if(!o.enabled)continue;let s=this.runtimeStates.get(o.id);if(s){if(s.healthStatus==="cooldown")if(r>=s.cooldownUntil)s.healthStatus="healthy",s.consecutiveErrors=0;else continue;s.healthStatus!=="disabled"&&(e.rateLimit?.rpm&&(this.pruneWindow(s.requestTimestamps,r),s.requestTimestamps.length>=e.rateLimit.rpm*.9)||e.rateLimit?.tpm&&(this.pruneWindow(s.tokenCounts,r),s.tokenCounts.reduce((a,c)=>a+c,0)>=e.rateLimit.tpm*.9)||n.push(o))}}return n}selectByStrategy(e,r,n){if(e.length===0)return null;if(e.length===1)return e[0];switch(r){case"weighted-round-robin":return this.weightedRandom(e);case"least-busy":return this.leastBusy(e);case"random":return e[Math.floor(Math.random()*e.length)];default:return this.weightedRandom(e)}}weightedRandom(e){let r=e.reduce((o,s)=>o+s.weight,0),n=Math.random()*r;for(let o of e)if(n-=o.weight,n<=0)return o;return e[e.length-1]}leastBusy(e){let r=1/0,n=e[0];for(let o of e){let i=this.runtimeStates.get(o.id)?.inFlight??0;(i<r||i===r&&o.weight>n.weight)&&(r=i,n=o)}return n}pruneWindow(e,r){let n=r-6e4;for(;e.length>0&&e[0]<n;)e.shift()}buildPoolStatus(e){return{providerId:e.providerId,baseUrl:e.baseUrl,strategy:e.strategy,rateLimit:e.rateLimit,keys:e.keys.map(r=>{let n=this.runtimeStates.get(r.id)??this.createInitialState();return{...r,inFlight:n.inFlight,totalRequests:n.totalRequests,totalTokens:n.totalTokens,lastUsedAt:n.lastUsedAt,lastErrorAt:n.lastErrorAt,consecutiveErrors:n.consecutiveErrors,cooldownUntil:n.cooldownUntil,healthStatus:r.enabled?n.healthStatus:"disabled"}})}}}});var Cu={};Dd(Cu,{ALL_PURPOSES:()=>dn,ModelRegistry:()=>To,deriveModelPurposes:()=>xu,getModelRegistry:()=>M,resetModelRegistry:()=>tA});import*as he from"node:fs";import{ProviderRegistry as ZT,ProviderVariantResolver as eA}from"@xiaozhiclaw/provider-core";function M(){return ln||(ln=new To,ln.load()),ln}function tA(){ln=null}function rA(t){let e=ru();if(t===e||!he.existsSync(e))return;let r=wu(e);if(!Pu(r))return;let n=wu(t);if(Pu(n))return;let o={...r,...n,providers:r.providers,models:r.models??n.models,bindings:nA(n)?n.bindings:r.bindings,migrations:{...ba(r.migrations)?r.migrations:{},...ba(n.migrations)?n.migrations:{},legacyGlobalSettingsImportedAt:new Date().toISOString()}},s=t.replace(/[/\\][^/\\]+$/,"");he.existsSync(s)||he.mkdirSync(s,{recursive:!0}),he.writeFileSync(t,JSON.stringify(o,null,2),"utf-8")}function wu(t){try{return JSON.parse(he.readFileSync(t,"utf-8"))}catch{return{}}}function Pu(t){return Array.isArray(t.providers)&&t.providers.length>0}function nA(t){return ba(t.bindings)&&Object.keys(t.bindings).length>0}function ba(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function xu(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 oA(t){switch(t){case"openai-chat":case"openai-responses":case"anthropic-messages":case"volcengine-responses":return t;default:return}}function sA(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 oA(e)}}function iA(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 dn,To,ln,qe=go(()=>{"use strict";N();Au();dn=["textGeneration","smallModel","stt","tts","imageGeneration","imageUnderstanding","videoGeneration","videoUnderstanding","threeDGeneration","embedding","voiceClone","musicGeneration","realtimeAudio","realtimeVideo"],To=class{keyPool;coreProviderRegistry=new ZT;providerVariantResolver=new eA(this.coreProviderRegistry);models=new Map;modelEnabledOverrides=new Map;bindings={};settingsPath;changeListeners=[];constructor(e){this.settingsPath=de(),this.keyPool=new So(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),u=this.getProviderBaseUrl(l);return{provider:s,model:i,apiKey:c.apiKey,baseUrl:d??(n.provider===s?n.baseUrl:void 0)??u,keyHandle:c}}peekActiveModel(e){let r=this.bindings[e];return r?this.models.get(r)??null:null}isAvailable(e){let r=this.peekActiveModel(e);return!!r?.enabled&&this.hasAvailableKeyForProviderVariant(r.provider)}resolveModelForPurpose(e){let r=this.peekActiveModel(e);return r?r.model:null}addProvider(e,r){this.keyPool.addProvider(e,r),this.emitChange()}removeProvider(e){this.keyPool.removeProvider(e);for(let[r,n]of this.models)n.provider===e&&this.removeModel(r);this.emitChange()}addKey(e,r,n){let o=this.keyPool.addKey(e,r,n);return this.emitChange(),o}removeKey(e){this.keyPool.removeKey(e),this.emitChange()}updateKey(e,r){this.keyPool.updateKey(e,r),this.emitChange()}setKeyHealth(e,r){this.keyPool.setKeyHealth(e,r),this.emitChange()}setStrategy(e,r){this.keyPool.setStrategy(e,r),this.emitChange()}addModel(e){let r=e.id??`${e.provider}:${e.model}`;return this.models.set(r,{...e,id:r,enabled:this.modelEnabledOverrides.get(r)??e.enabled}),this.emitChange(),r}replaceCatalogModels(e){let r=new Map;for(let n of e)r.set(n.id,{...n,enabled:this.modelEnabledOverrides.get(n.id)??n.enabled});for(let n of this.modelEnabledOverrides.keys())r.has(n)||this.modelEnabledOverrides.delete(n);this.models=r;for(let[n,o]of Object.entries(this.bindings))o&&!this.models.has(o)&&delete this.bindings[n];this.emitChange()}replaceProviderModels(e,r){let n=new Map;for(let[s,i]of this.models)i.provider!==e&&n.set(s,i);for(let s of r)s.provider===e&&n.set(s.id,{...s,enabled:this.modelEnabledOverrides.get(s.id)??s.enabled});let o=`${e}:`;for(let s of this.modelEnabledOverrides.keys())s.startsWith(o)&&!n.has(s)&&this.modelEnabledOverrides.delete(s);this.models=n;for(let[s,i]of Object.entries(this.bindings))i&&!this.models.has(i)&&delete this.bindings[s];this.emitChange()}migrateModelIds(e){for(let[r,n]of e){let o=this.modelEnabledOverrides.get(r);o!==void 0&&!this.modelEnabledOverrides.has(n)&&this.modelEnabledOverrides.set(n,o),this.modelEnabledOverrides.delete(r);for(let[s,i]of Object.entries(this.bindings))i===r&&(this.bindings[s]=n)}this.emitChange()}removeModel(e){this.models.delete(e),this.modelEnabledOverrides.delete(e);for(let[r,n]of Object.entries(this.bindings))n===e&&delete this.bindings[r];this.emitChange()}enableModel(e){let r=this.models.get(e);r&&(r.enabled=!0),this.modelEnabledOverrides.set(e,!0),this.emitChange()}disableModel(e){let r=this.models.get(e);r&&(r.enabled=!1),this.modelEnabledOverrides.set(e,!1),this.emitChange()}listModels(e){let r=[...this.models.values()];return e?.purpose&&(r=r.filter(n=>n.purposes.includes(e.purpose))),e?.provider&&(r=r.filter(n=>n.provider===e.provider)),e?.enabledOnly&&(r=r.filter(n=>n.enabled)),r}getModel(e){return this.models.get(e)??null}setBinding(e,r){let n=this.models.get(r);if(!n)throw new Error(`Model "${r}" not found in pool.`);if(!n.purposes.includes(e))throw new Error(`Model "${r}" does not support purpose "${e}".`);this.bindings[e]=r,this.emitChange()}removeBinding(e){delete this.bindings[e],this.emitChange()}getBinding(e){let r=this.bindings[e];return r?this.models.get(r)??null:null}getAllBindings(){let e={};for(let r of dn){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{he.existsSync(this.settingsPath)&&(e=JSON.parse(he.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(/[/\\][^/\\]+$/,"");he.existsSync(n)||he.mkdirSync(n,{recursive:!0}),he.writeFileSync(this.settingsPath,JSON.stringify(r,null,2),"utf-8")}load(){try{if(rA(this.settingsPath),!he.existsSync(this.settingsPath))return!1;let e=he.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(!he.existsSync(this.settingsPath))return;let r=he.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.coreProviderRegistry.getProvider(e);return r?{id:r.id,name:r.name,transport:r.transport,baseUrl:r.baseUrl,defaultModel:r.defaultModel,group:r.group,models:this.coreProviderRegistry.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.coreProviderRegistry.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.providerVariantResolver.resolveBest({publicModel:e.model,requestedProtocol:sA(r,e.transport),capabilities:iA(r),purpose:r,userPreference:{providerIds:n}});if(o)return{provider:o.provider,nativeModelId:o.nativeModelId}}providerVariantKeyCandidates(e){let r=[e],n=this.coreProviderRegistry.getProvider(e),o=n?.group??n?.id??e;for(let s of this.coreProviderRegistry.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.coreProviderRegistry.listProviders())for(let o of this.coreProviderRegistry.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:xu(o),baseUrl:n.baseUrl,enabled:this.modelEnabledOverrides.get(i)??!1,nativeModelId:o.id,transport:n.transport,contextWindow:o.contextWindow,maxOutput:o.maxOutput,streamRequired:o.streamRequired,capabilities:[...o.toolCall?["toolCall"]:[],...o.reasoning?["reasoning"]:[],...o.vision?["vision"]:[],...o.mediaType?[o.mediaType]:[]],pricing:{inputPer1M:o.costInput,outputPer1M:o.costOutput,cacheReadPer1M:o.costCacheRead,cacheWritePer1M:o.costCacheWrite}})}let r=new Map;for(let n of e)r.set(n.id,n);this.models=r}exportModelState(){let e=new Map;for(let[r,n]of this.modelEnabledOverrides)e.set(r,n);for(let r of this.models.values())e.set(r.id,r.enabled);return[...e.entries()].map(([r,n])=>({id:r,enabled:n}))}emitChange(){for(let e of this.changeListeners)try{e()}catch{}}},ln=null});var em={};Dd(em,{resolveToolEligibility:()=>YP});function zP(t,e){if(KP.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 VP(t,e){let r=t.function.name,n=t.meta,o=[];return e.blockedToolNames?.includes(r)?(o.push("policy_blocked"),{level:5,reasons:o}):n?.isReadOnly?(o.push("always_allowed"),{level:1,reasons:o}):n?.requiresApproval?(o.push("approval_required"),{level:4,reasons:o}):n?.isDangerous||zP(r,e.dangerousPatterns)?(o.push("dangerous_tool"),{level:3,reasons:o}):{level:2,reasons:o}}function XP(t){switch(t){case 1:return"eligible";case 2:return"eligible";case 3:return"dangerous-notify";case 4:return"approval-required";case 5:return"blocked-by-policy"}}function YP(t,e={}){let r=new Map,n=[],o=[],s=[];for(let i of t){let a=i.function.name,{level:c,reasons:l}=VP(i,e),d=XP(c),u={toolName:a,status:d,permissionLevel:c,approvalRequired:c===4,reasonCodes:l};r.set(a,u),c===5?o.push(u):(n.push(i),c===4&&s.push(u))}return{eligibleTools:n,blockedTools:o,approvalRequiredTools:s,eligibilityByName:r}}var KP,tm=go(()=>{"use strict";KP=[/^(?:bash|shell|exec|terminal|run_command)$/i,/^(?:write_file|delete_file|move_file|create_directory)$/i,/^(?:git_push|git_reset|git_force)$/i]});import{createRequire as BO}from"node:module";import{createInterface as QS}from"node:readline";var xr=class{messageHandler=null;closeHandler=null;verbose;constructor(e){this.verbose=e?.verbose??!1}onMessage(e){this.messageHandler=e}onClose(e){this.closeHandler=e}send(e){process.stdout.write(`${JSON.stringify(e)}
|
|
3
3
|
`)}start(){process.stdin.on("data",r=>{process.stderr.write(`[transport] raw stdin data (${r.length} bytes): ${r.toString().slice(0,300)}
|
|
4
4
|
`)});let e=QS({input:process.stdin,crlfDelay:Number.POSITIVE_INFINITY});e.on("line",r=>{let n=r.trim();if(n){process.stderr.write(`[transport] line: ${n.slice(0,300)}
|
|
5
5
|
`);try{let o=JSON.parse(n);this.messageHandler?.(o)}catch{this.log(`invalid JSON on stdin: ${n.slice(0,200)}`)}}}),e.on("close",()=>{this.closeHandler?.()})}close(){}log(e){this.verbose&&process.stderr.write(`[transport] ${e}
|
|
@@ -35,7 +35,7 @@ Respond ONLY with a JSON array (or empty array [] if nothing worth extracting):
|
|
|
35
35
|
[{"text": "...", "category": "personal_fact|preference|event|lesson", "importance": 0.5-0.9, "eventDate": "YYYY-MM-DD or null"}]`;async function RT(t,e,r){let n=kT.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:ST(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 ST(t){return new Set(["personal_fact","preference","event","lesson","pattern","decision"]).has(t)?t:"personal_fact"}async function zd(t,e){if(!Ci(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 RT(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 Ii=Math.min(Math.max(1,Number(process.env.TOOL_LOOP_DEFAULT_BUDGET)||25),100),Ei=3,_i=2,yo=2,Mi=128e3,Di=13e3,Ni=16384,Li=65536,Oi=3,ji=65536,bo=500,$i=3,Ui=5e4,Fi=2e5,vo=2e3,Hi=3e4,Bi=3,Cr=2,TT=3e5,AT=216e5,wT=.75,PT=16e3,xT=12e4,CT=3,IT=4,ET=50,qi=20,Vd=50,Wi=3,Gi=2,Ki=300*1e3,Xd=3,Yd=720*60*60*1e3,_T=4e3,MT=5,zi=3,Vi=800,Xi=300*1e3,Yi=4,Ji=0,Qi=50,Zi=50,ea=30,Jd=3600*1e3,Qd=200,ta=5,DT=4e4,ra=50*1024,na=500*1024,oa=500*1024*1024,NT=50*1024*1024,sa=3e5,ia=2,aa=3e3,ca=3,la=5e3,LT=1e3,OT=3e3,jT=3e4,da=60*1024,ua=10,pa=100,$T=24,UT=5,FT=6e5,HT=30,BT=144e5,qT=3e5;function ma(){return{maxRoundsLimit:100,defaultMaxRounds:25,defaultTemperature:0,maxToolBudgetCap:100,defaultToolBudget:Ii,maxConsecutiveFailures:Ei,maxIdenticalCallRepeats:_i,defaultContextWindowTokens:Mi,responseBufferTokens:Di,defaultMaxOutputTokens:Ni,defaultModelMaxOutputTokens:Li,maxOutputTokensRecoveryLimit:Oi,escalatedMaxOutputTokens:ji,diminishingReturnsThreshold:bo,diminishingReturnsMinContinuations:$i,defaultMaxResultSizeChars:Ui,maxToolResultsPerMessageChars:Fi,toolResultPreviewBytes:vo,heartbeatIntervalMs:Hi,max529Retries:Bi,maxApiRetries:Cr,persistentRetryMaxBackoffMs:TT,persistentRetryResetCapMs:AT,compressionTargetUsageRatio:wT,compressionMinBudget:PT,compressionMaxBudget:xT,reactiveCompactMaxFailures:CT,reactiveCompactMinMessages:IT,reactiveCompactTargetPercent:ET,maxSkillsPerProject:qi,maxSkillsGlobal:Vd,minToolCallsForSkill:Wi,minDistinctToolsForSkill:Gi,skillCreationCooldownMs:Ki,skillInjectionMaxChars:_T,skillInjectionMaxCount:MT,skillRecallMaxSkills:zi,skillRecallMaxContentChars:Vi,skillRecallCacheTtlMs:Xi,maxForkDepth:Yi,maxSessions:Qi,taskSummaryTurnThreshold:Zi,taskSummaryRegenInterval:ea,maxIncludeDepth:ta,maxInstructionChars:DT,instructionsMaxFileSize:ra,instructionsMaxDirSize:na,mediaMaxDownloadSize:oa,mediaMaxUploadSize:NT,mediaDownloadTimeoutMs:sa,acpMaxSpawnRetries:ia,acpRetryBackoffBase:aa,acpRuntimeRestartMax:ca,acpRuntimeRestartBackoffBase:la,taskPollIntervalMs:LT,taskStoppedDisplayMs:OT,taskPanelGraceMs:jT,memoryPrefetchMaxSessionBytes:da,memoryPrefetchLimitPerRecall:ua,memoryMaxSurfacedEntries:pa,dreamMinIntervalHours:$T,dreamMinSessions:UT,dreamScanIntervalMs:FT,idleDreamMinutes:HT,dreamCooldownMs:BT,dreamMaxDurationMs:qT,teamBudgetTokens:Ji}}var Ir={MAX_SESSION_BYTES:da,LIMIT_PER_RECALL:ua,MAX_SURFACED_ENTRIES:pa};function gt(){return{surfacedPaths:new Set,sessionBytes:0}}function eu(t,e,r){let n=[],o=r??gt(),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>=Ir.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:Ir.LIMIT_PER_RECALL}),d=l.filter(m=>{let g=m,f=g.path??g.id??"";if(!f)return!0;if(o.surfacedPaths.has(f))return!1;let h=(g.content?.length??0)*2;if(o.sessionBytes+h>Ir.MAX_SESSION_BYTES)return!1;if(o.surfacedPaths.add(f),o.sessionBytes+=h,o.surfacedPaths.size>Ir.MAX_SURFACED_ENTRIES){let v=o.surfacedPaths.values().next().value;v!==void 0&&o.surfacedPaths.delete(v)}return!0});s=c.turnId,i=d,e.log.debug(`memory.before_recall: prefetched ${l.length} \u922B?${d.length} after dedup (${o.sessionBytes} bytes used)`);let u=d.map(m=>{let g=m;return{text:g.text??g.content??"",score:g.score,category:g.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};u=u.map(g=>({...g,score:xi(g.score??.5,g.category,m)})).sort((g,f)=>(f.score??0)-(g.score??0))}let p=.15;return u=u.filter(m=>(m.score??0)>=p),{action:"continue",context:{...c,recalledMemories:[...c.recalledMemories??[],...u]}}}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=Zd(l);if(d.length===0)return{action:"continue",context:c};for(let u of d)try{await e.localMemoryProvider.addText(u.text,e.userId,{source:"auto-extract",category:u.category,importance:.6}),e.log.debug(`memory-auto-extract: stored "${u.text.slice(0,50)}..." (${u.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(Zd(l).length>0)return{action:"continue",context:c};if(!Ci(l))return{action:"continue",context:c};let u=e.getLastAssistantMessage?.();return!u||!e.llmExtract?{action:"continue",context:c}:(zd({userMessage:l,assistantMessage:u},{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 tu(t,e,r){let n=r??gt();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>=Ir.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 qd(i.query,c,n.surfacedPaths);if(l.length===0)return{action:"continue",context:i};if(i.preferredCategories?.length||i.deprioritizedCategories?.length){let g={scenario:"general",preferred:i.preferredCategories??[],deprioritized:i.deprioritizedCategories??[],confidence:1};l=l.map(f=>({...f,score:xi(f.score,Kd(f.filename),g)})).sort((f,h)=>h.score-f.score)}let d=l.filter(g=>{let f=Buffer.byteLength(g.content,"utf-8");return n.sessionBytes+f>Ir.MAX_SESSION_BYTES?!1:(n.surfacedPaths.add(g.filePath),n.sessionBytes+=f,!0)});if(d.length===0)return{action:"continue",context:i};e.log.debug(`memdir-recall: found ${l.length} \u922B?accepted ${d.length} files (${n.sessionBytes} bytes used)`);let u=Wd(d),p=i.recalledMemories??[];return{action:"continue",context:{...i,recalledMemories:[...[{text:u,score:.9,category:"project",source:"l1-project-md",label:"L1 project MD"}],...p]}}}catch(c){e.log.warn(`memdir-recall: cross-file recall failed: ${c instanceof Error?c.message:String(c)}`)}return{action:"continue",context:i}}})}var WT=[{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 Zd(t){let e=[],r=t.slice(0,500);for(let{pattern:n,category:o,extractor:s}of WT){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}N();import*as G from"node:fs";import*as xe from"node:path";var bu="transcript.jsonl",qt="metadata.json",hu="state.json";function VT(t){return _t(t)}function _r(t,e){let r=t.replace(/[^a-zA-Z0-9_-]/g,"_");return xe.join(VT(e),r)}function yu(t){if(!t)return Date.now();let e=Date.parse(t);return Number.isFinite(e)?e:Date.now()}async function XT(t,e,r){let n={metadata:{sessionId:e.sessionId,createdAt:yu(e.createdAt),lastActiveAt:yu(e.lastActiveAt),model:e.model,cwd:e.cwd,turnCount:e.turnCount,messageCount:e.messageCount,title:e.title},costSnapshot:r},o=xe.join(t,hu+".tmp");await G.promises.writeFile(o,JSON.stringify(n,null,2),"utf8"),await G.promises.rename(o,xe.join(t,hu))}function vu(t,e){let r=t.replace(/[^a-zA-Z0-9_-]/g,"_"),n=xe.join(_t(e),r),o=xe.join(n,qt);if(G.existsSync(o))return n}function Wt(t,e){let r=vu(t,e);if(!r)return null;try{let n=G.readFileSync(xe.join(r,qt),"utf8");return JSON.parse(n)}catch{return null}}async function ga(t,e,r,n){let o=_r(t,r);try{await G.promises.mkdir(o,{recursive:!0});let s={role:e.role,content:e.content,ts:Date.now()};n&&(s.turnId=n);let i=JSON.stringify(s)+`
|
|
36
36
|
`;return await G.promises.appendFile(xe.join(o,bu),i,"utf8"),!0}catch(s){return console.error(`[session-persistence] appendMessage failed for ${t}: ${s.message}`),!1}}async function ku(t,e,r,n){let o=_r(t,n);await G.promises.mkdir(o,{recursive:!0});let s={};try{let l=await G.promises.readFile(xe.join(o,qt),"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,sealedAt:r.sealedAt??s.sealedAt,previousSessionId:r.previousSessionId??s.previousSessionId,carryoverSummary:r.carryoverSummary??s.carryoverSummary,totalInputTokens:e.totalInputTokens,totalOutputTokens:e.totalOutputTokens},c=xe.join(o,qt+".tmp");await G.promises.writeFile(c,JSON.stringify(a,null,2),"utf8"),await G.promises.rename(c,xe.join(o,qt)),await XT(o,a,e)}async function Je(t,e,r){let o=vu(t,r)??_r(t,r),s=xe.join(o,qt),i=new Date().toISOString(),a;try{let d=await G.promises.readFile(s,"utf8");a=JSON.parse(d)}catch{await G.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 G.promises.writeFile(d,JSON.stringify(a,null,2),"utf8"),await G.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),c.lastActiveAt=i;let l=s+".tmp";return await G.promises.writeFile(l,JSON.stringify(c,null,2),"utf8"),await G.promises.rename(l,s),c}async function fa(t,e){try{await G.promises.access(e,G.constants.R_OK)}catch{return console.error(`[session-persistence] loadSessionForResume: projectRoot not accessible: ${e}`),null}let r=_r(t,e),n=xe.join(r,bu),o=xe.join(r,qt),s=[],i=0;try{let d=await G.promises.readFile(n,"utf8");for(let u of d.split(`
|
|
37
37
|
`))if(u.trim())try{let p=JSON.parse(u);s.push({role:p.role,content:p.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 G.promises.readFile(o,"utf8");c=JSON.parse(d)}catch{}let l=s.filter(d=>d.role!=="system");return{metadata:c,messages:l}}async function Mt(t=Qi,e){let r=_t(e),n;try{n=await G.promises.readdir(r)}catch{return[]}let o=[];for(let s of n){let i=xe.join(r,s,qt);try{let a=await G.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 ha(t,e){let r=_r(t,e);await G.promises.rm(r,{recursive:!0,force:!0})}function YT(t){return t.turnCount<Zi?!1:t.taskSummaryGeneratedAt?t.turnCount-(t.taskSummaryGeneratedAt??0)>=ea:!0}var JT="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 Ru(t,e){if(!t.trim())return null;try{let r=e.transport.stream({model:e.model,messages:[{role:"system",content:JT},{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 Su(t,e,r,n,o){if(!YT(e))return null;try{let i=r.slice(-20).map(u=>`[${u.role}]: ${typeof u.content=="string"?u.content.slice(0,500):JSON.stringify(u.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 u of a)u.type==="delta"&&(c+=u.text);if(c=c.trim(),!c)return null;let l=_r(t,o),d=xe.join(l,qt);try{let u=await G.promises.readFile(d,"utf8"),p=JSON.parse(u);p.taskSummary=c,p.taskSummaryGeneratedAt=e.turnCount;let m=d+".tmp";await G.promises.writeFile(m,JSON.stringify(p,null,2),"utf8"),await G.promises.rename(m,d)}catch{}return c}catch{return null}}import{randomUUID as Aj}from"node:crypto";var QT=3e4;var Ro=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),!ko(n.lifecycle)&&ko(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&&ko(r.lifecycle)&&(this.tasks.delete(e),this.notify(e,null))}evictStaleTasks(e=QT){let r=Date.now();for(let[n,o]of this.tasks)ko(o.lifecycle)&&o.endedAt&&r-o.endedAt>e&&(this.tasks.delete(n),this.notify(n,null))}};function ko(t){return t==="completed"||t==="failed"||t==="cancelled"||t==="timeout"}var ya=new Set;function ht(t){return ya.add(t),()=>{ya.delete(t)}}async function Tu(){await Promise.all(Array.from(ya).map(t=>t()))}N();qe();var Ao="\u65E0\u6CD5\u8FDE\u63A5 llmrouter \u6A21\u578B\u76EE\u5F55",re="llmrouter",va="LLMRouter",Gt=class extends Error{constructor(e=Ao){super(e),this.name="LlmrouterCatalogUnavailableError"}};function Iu(){let t=process.env.QLOGIC_LLMROUTER_BASE_URL?.trim().replace(/\/+$/,"");if(!t)throw new Gt;return t}function Eu(){return Iu()}function aA(){let t={accept:"application/json"},e=process.env.QLOGIC_LLMROUTER_ACCESS_TOKEN?.trim();return e&&(t.authorization=`Bearer ${e}`),t}async function _u(t){let e=Iu(),r;try{r=await fetch(`${e}${t}`,{method:"GET",headers:aA(),signal:AbortSignal.timeout(1e4)})}catch{throw new Gt}if(!r.ok)throw new Gt;let n=await r.json().catch(()=>null),o=Array.isArray(n)?n:ju(n)&&Array.isArray(n.data)?n.data:null;if(!o)throw new Gt;return o}function ka(t){let e=t.trim().replace(/\/+$/,"");return e.endsWith("/v1")?`${e}/models`:`${e}/v1/models`}async function cA(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 Gt}if(!r.ok)throw new Gt;let n=await r.json().catch(()=>null),o=Array.isArray(n)?n:ju(n)&&Array.isArray(n.data)?n.data:null;if(!o)throw new Gt;return o}async function Ra(){return _u("/ext/model-catalog/providers")}async function lA(){return _u("/ext/model-catalog/models")}async function dA(t,e){return cA(ka(t),e)}function Mu(t){let e={zhipu:"Zhipu GLM","zhipu-openai":"Zhipu GLM OpenAI","zhipu-coding":"Zhipu GLM Coding",volcengine:"Doubao / Volcengine"};return e[t.id]?e[t.id]:t.displayName??t.name??t.id}function Sa(t){return t.baseUrl??t.base_url}async function Du(t){return(await Ra()).find(r=>r.id===t)??null}async function un(t){let e=await lA();t.migrateModelIds(Nu(e));let r=e.flatMap(Lu);return t.replaceCatalogModels(r),r}async function Ta(t,e){let r=await dA(e.baseUrl,e.apiKey);if(r.length===0)return[];t.migrateModelIds(Nu(r));let n=r.flatMap(Lu).filter(o=>o.provider===re).map(o=>({...o,baseUrl:e.baseUrl}));return t.replaceProviderModels(re,n),n}function Nu(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=`${re}:${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=`${re}:${a}`;c!==i&&e.set(c,i)}}return e}function Lu(t){return[uA(t),pA(t)].filter(e=>!!e)}function uA(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:Ou(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 pA(t){let e=t.public_model??t.publicModel??t.id;return e?{id:`${re}:${e}`,provider:re,model:e,displayName:t.display_name??t.displayName??t.name??t.id,purposes:Ou(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 Ou(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 ju(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}import{join as Aa}from"node:path";import{mkdirSync as mA,existsSync as gA,createWriteStream as fA}from"node:fs";import{pipeline as hA}from"node:stream/promises";import{Readable as yA}from"node:stream";var bA=oa,vA=sa,$u={"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"},wo=class{projectDir;maxFileSize;timeoutMs;constructor(e){this.projectDir=e?.projectDir??null,this.maxFileSize=e?.maxFileSize??bA,this.timeoutMs=e?.timeoutMs??vA}setProjectDir(e){this.projectDir=e}resolveMediaDir(e){if(!this.projectDir)throw new Error("MediaPersistence requires projectDir \u2014 call setProjectDir() first");if(!e)return Aa(this.projectDir,".qlogicagent","media",kA());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`),Aa(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.`);gA(n)||mA(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=SA(e,l),u=RA(r?.type??TA(l),d);i=Aa(n,u);let p=a.body;if(!p)throw new Error("No response body");let m=fA(i);await hA(yA.fromWeb(p),m);let{size:g}=await import("node:fs/promises").then(f=>f.stat(i));if(g===0)throw await import("node:fs/promises").then(f=>f.unlink(i).catch(()=>{})),new Error("Download produced empty file (connection dropped)");return{remoteUrl:e,localPath:i,bytes:g,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 kA(){let t=new Date;return`${t.getFullYear()}${String(t.getMonth()+1).padStart(2,"0")}${String(t.getDate()).padStart(2,"0")}`}function RA(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 SA(t,e){if($u[e])return $u[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 TA(t){return t.startsWith("image/")?"image":t.startsWith("video/")?"video":t.startsWith("audio/")?"audio":t.startsWith("model/")?"3d":"file"}var lr="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 wa(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 AA}from"node:crypto";var wA=["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","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"],PA=new Set(["thread.turn","memory.dream","memory.propose","memory.consolidate","media.stt","pet.forge","solo.start","solo.evaluate","product.plan","product.create","product.message"]),xA=["memory.","pet.","usage."],CA=new Set(["memory.atlas","memory.activity","memory.list","memory.read","memory.search","pet.status"]);function Po(t){return PA.has(t)?{channel:"task",mutability:"write",defaultTimeoutMs:t==="thread.turn"?3e5:12e4}:wA.some(e=>t===e||t.startsWith(`${e}.`)||t.startsWith(e))?{channel:"query",mutability:"read",defaultTimeoutMs:1e4}:{channel:"task",mutability:"write",defaultTimeoutMs:3e4}}function Uu(t){return CA.has(t)||Po(t).mutability==="read"?!1:xA.some(e=>t.startsWith(e))}function Pa(t,e={}){let r=e.now??Date.now(),n=Po(t),o=e.timeoutMs??n.defaultTimeoutMs;return{requestId:e.requestId??AA(),createdAt:r,deadlineAt:r+o,channel:e.channel??n.channel,idempotencyKey:e.idempotencyKey,traceId:e.traceId}}function xo(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=Po(t.method).channel;return r.channel!==n?{ok:!1,error:{code:y.INVALID_REQUEST,message:`RPC request channel mismatch: expected ${n}, got ${r.channel}.`}}:Uu(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 pn=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=xo({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 Fu=["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"],Hu=["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"],IA=[...Fu,...Hu];var yt={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"},ee={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"},bt={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"},ue={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 mn(t){if(!t||typeof t!="object")return!1;let e=t;return e.jsonrpc==="2.0"&&typeof e.method=="string"&&"id"in e}function gn(t){if(!t||typeof t!="object")return!1;let e=t;return e.jsonrpc==="2.0"&&typeof e.method=="string"&&!("id"in e)}function xa(t){if(!t||typeof t!="object")return!1;let e=t;return e.jsonrpc==="2.0"&&"id"in e&&!("method"in e)}var Bu="openai-codex";var Jj={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"},[Bu]:{providerFamily:"openai"},openrouter:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},opencode:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},kilocode:{providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]}};import{randomUUID as EA}from"node:crypto";var Co={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},Io=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(mn(e)){let r=e;return process.stderr.write(`[acp-server] \u922B?recv id=${String(r.id)} method=${r.method}
|
|
38
|
+
`),a=n.transport.stream({model:n.model,messages:[{role:"system",content:"Generate a concise task summary (~100 words) of what the user is working on in this session. Focus on the goal, key decisions, and current progress. Reply with ONLY the summary."},{role:"user",content:i}],tools:[],maxTokens:200},n.apiKey),c="";for await(let u of a)u.type==="delta"&&(c+=u.text);if(c=c.trim(),!c)return null;let l=_r(t,o),d=xe.join(l,qt);try{let u=await G.promises.readFile(d,"utf8"),p=JSON.parse(u);p.taskSummary=c,p.taskSummaryGeneratedAt=e.turnCount;let m=d+".tmp";await G.promises.writeFile(m,JSON.stringify(p,null,2),"utf8"),await G.promises.rename(m,d)}catch{}return c}catch{return null}}import{randomUUID as Pj}from"node:crypto";var QT=3e4;var Ro=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),!ko(n.lifecycle)&&ko(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&&ko(r.lifecycle)&&(this.tasks.delete(e),this.notify(e,null))}evictStaleTasks(e=QT){let r=Date.now();for(let[n,o]of this.tasks)ko(o.lifecycle)&&o.endedAt&&r-o.endedAt>e&&(this.tasks.delete(n),this.notify(n,null))}};function ko(t){return t==="completed"||t==="failed"||t==="cancelled"||t==="timeout"}var ya=new Set;function ht(t){return ya.add(t),()=>{ya.delete(t)}}async function Tu(){await Promise.all(Array.from(ya).map(t=>t()))}N();qe();var Ao="\u65E0\u6CD5\u8FDE\u63A5 llmrouter \u6A21\u578B\u76EE\u5F55",re="llmrouter",va="LLMRouter",Gt=class extends Error{constructor(e=Ao){super(e),this.name="LlmrouterCatalogUnavailableError"}};function Iu(){let t=process.env.QLOGIC_LLMROUTER_BASE_URL?.trim().replace(/\/+$/,"");if(!t)throw new Gt;return t}function Eu(){return Iu()}function aA(){let t={accept:"application/json"},e=process.env.QLOGIC_LLMROUTER_ACCESS_TOKEN?.trim();return e&&(t.authorization=`Bearer ${e}`),t}async function _u(t){let e=Iu(),r;try{r=await fetch(`${e}${t}`,{method:"GET",headers:aA(),signal:AbortSignal.timeout(1e4)})}catch{throw new Gt}if(!r.ok)throw new Gt;let n=await r.json().catch(()=>null),o=Array.isArray(n)?n:ju(n)&&Array.isArray(n.data)?n.data:null;if(!o)throw new Gt;return o}function ka(t){let e=t.trim().replace(/\/+$/,"");return e.endsWith("/v1")?`${e}/models`:`${e}/v1/models`}async function cA(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 Gt}if(!r.ok)throw new Gt;let n=await r.json().catch(()=>null),o=Array.isArray(n)?n:ju(n)&&Array.isArray(n.data)?n.data:null;if(!o)throw new Gt;return o}async function Ra(){return _u("/ext/model-catalog/providers")}async function lA(){return _u("/ext/model-catalog/models")}async function dA(t,e){return cA(ka(t),e)}function Mu(t){let e={zhipu:"Zhipu GLM","zhipu-openai":"Zhipu GLM OpenAI","zhipu-coding":"Zhipu GLM Coding",volcengine:"Doubao / Volcengine"};return e[t.id]?e[t.id]:t.displayName??t.name??t.id}function Sa(t){return t.baseUrl??t.base_url}async function Du(t){return(await Ra()).find(r=>r.id===t)??null}async function un(t){let e=await lA();t.migrateModelIds(Nu(e));let r=e.flatMap(Lu);return t.replaceCatalogModels(r),r}async function Ta(t,e){let r=await dA(e.baseUrl,e.apiKey);if(r.length===0)return[];t.migrateModelIds(Nu(r));let n=r.flatMap(Lu).filter(o=>o.provider===re).map(o=>({...o,baseUrl:e.baseUrl}));return t.replaceProviderModels(re,n),n}function Nu(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=`${re}:${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=`${re}:${a}`;c!==i&&e.set(c,i)}}return e}function Lu(t){return[uA(t),pA(t)].filter(e=>!!e)}function uA(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:Ou(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 pA(t){let e=t.public_model??t.publicModel??t.id;return e?{id:`${re}:${e}`,provider:re,model:e,displayName:t.display_name??t.displayName??t.name??t.id,purposes:Ou(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 Ou(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 ju(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}import{join as Aa}from"node:path";import{mkdirSync as mA,existsSync as gA,createWriteStream as fA}from"node:fs";import{pipeline as hA}from"node:stream/promises";import{Readable as yA}from"node:stream";var bA=oa,vA=sa,$u={"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"},wo=class{projectDir;maxFileSize;timeoutMs;constructor(e){this.projectDir=e?.projectDir??null,this.maxFileSize=e?.maxFileSize??bA,this.timeoutMs=e?.timeoutMs??vA}setProjectDir(e){this.projectDir=e}resolveMediaDir(e){if(!this.projectDir)throw new Error("MediaPersistence requires projectDir \u2014 call setProjectDir() first");if(!e)return Aa(this.projectDir,".qlogicagent","media",kA());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`),Aa(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.`);gA(n)||mA(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=SA(e,l),u=RA(r?.type??TA(l),d);i=Aa(n,u);let p=a.body;if(!p)throw new Error("No response body");let m=fA(i);await hA(yA.fromWeb(p),m);let{size:g}=await import("node:fs/promises").then(f=>f.stat(i));if(g===0)throw await import("node:fs/promises").then(f=>f.unlink(i).catch(()=>{})),new Error("Download produced empty file (connection dropped)");return{remoteUrl:e,localPath:i,bytes:g,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 kA(){let t=new Date;return`${t.getFullYear()}${String(t.getMonth()+1).padStart(2,"0")}${String(t.getDate()).padStart(2,"0")}`}function RA(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 SA(t,e){if($u[e])return $u[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 TA(t){return t.startsWith("image/")?"image":t.startsWith("video/")?"video":t.startsWith("audio/")?"audio":t.startsWith("model/")?"3d":"file"}var lr="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 wa(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 AA}from"node:crypto";var wA=["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","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"],PA=new Set(["thread.turn","memory.dream","memory.propose","memory.consolidate","media.stt","pet.forge","solo.start","solo.evaluate","product.plan","product.create","product.message"]),xA=["memory.","pet.","usage."],CA=new Set(["memory.atlas","memory.activity","memory.list","memory.read","memory.search","pet.status"]);function Po(t){return PA.has(t)?{channel:"task",mutability:"write",defaultTimeoutMs:t==="thread.turn"?3e5:12e4}:wA.some(e=>t===e||t.startsWith(`${e}.`)||t.startsWith(e))?{channel:"query",mutability:"read",defaultTimeoutMs:1e4}:{channel:"task",mutability:"write",defaultTimeoutMs:3e4}}function Uu(t){return CA.has(t)||Po(t).mutability==="read"?!1:xA.some(e=>t.startsWith(e))}function Pa(t,e={}){let r=e.now??Date.now(),n=Po(t),o=e.timeoutMs??n.defaultTimeoutMs;return{requestId:e.requestId??AA(),createdAt:r,deadlineAt:r+o,channel:e.channel??n.channel,idempotencyKey:e.idempotencyKey,traceId:e.traceId}}function xo(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=Po(t.method).channel;return r.channel!==n?{ok:!1,error:{code:y.INVALID_REQUEST,message:`RPC request channel mismatch: expected ${n}, got ${r.channel}.`}}:Uu(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 pn=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=xo({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 Fu=["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"],Hu=["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"],IA=[...Fu,...Hu];var yt={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"},ee={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"},bt={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"},ue={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 mn(t){if(!t||typeof t!="object")return!1;let e=t;return e.jsonrpc==="2.0"&&typeof e.method=="string"&&"id"in e}function gn(t){if(!t||typeof t!="object")return!1;let e=t;return e.jsonrpc==="2.0"&&typeof e.method=="string"&&!("id"in e)}function xa(t){if(!t||typeof t!="object")return!1;let e=t;return e.jsonrpc==="2.0"&&"id"in e&&!("method"in e)}var Bu="openai-codex";var Zj={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"},[Bu]:{providerFamily:"openai"},openrouter:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},opencode:{openAiCompatTurnValidation:!1,providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]},kilocode:{providerThoughtSignatureSanitization:!0,providerThoughtSignatureModelHints:["gemini"]}};import{randomUUID as EA}from"node:crypto";var Co={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},Io=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(mn(e)){let r=e;return process.stderr.write(`[acp-server] \u922B?recv id=${String(r.id)} method=${r.method}
|
|
39
39
|
`),this.handleRequest(r),!0}return gn(e)?(this.handleNotification(e),!0):!1}emitSessionUpdate(e,r,n){if(r.startsWith("x_")&&!this.hostSupportsExtendedEvents)return;let o={jsonrpc:"2.0",method:yt.SESSION_UPDATE,params:{sessionId:e,update:{sessionUpdate:r,...n}}};this.transport.send(o)}async requestPermission(e){let r=`perm-${EA().slice(0,8)}`,n={jsonrpc:"2.0",method:yt.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 yt.INITIALIZE:await this.onInitialize(o,s);break;case yt.SESSION_NEW:await this.onSessionNew(o,s);break;case yt.SESSION_PROMPT:await this.onSessionPrompt(o,s);break;case yt.SESSION_END:await this.onSessionEnd(o,s);break;case yt.SESSION_SET_CONFIG:await this.onSessionSetConfig(o,s);break;case yt.SESSION_SET_MODEL:await this.handler.handleAcpSessionSetModel(s.sessionId??this.activeSessionId??"",s.modelId??s.model??""),this.sendResult(o,{});break;case yt.SESSION_SET_MODE:await this.handler.handleAcpSessionSetMode(s.sessionId??this.activeSessionId??"",s.modeId??s.mode??""),this.sendResult(o,{});break;case ee.ABORT:await this.onAbort(o,s);break;case ee.DREAM:await this.onDream(o,s);break;case ee.AGENTS_LIST:{let i=await this.handler.handleAcpAgentsList();this.sendResult(o,i);break}case ee.SOLO_START:{let i=await this.handler.handleAcpSoloStart(s);this.sendResult(o,i);break}case ee.SOLO_STATUS:{let i=await this.handler.handleAcpSoloStatus(s);this.sendResult(o,i);break}case ee.SOLO_SELECT:{let i=await this.handler.handleAcpSoloSelect(s);this.sendResult(o,i);break}case ee.SOLO_CANCEL:{let i=await this.handler.handleAcpSoloCancel(s);this.sendResult(o,i);break}case ee.SOLO_SUBSCRIBE:{let i=await this.handler.handleAcpSoloSubscribe(s);this.sendResult(o,i);break}case ee.SOLO_MESSAGE:{let i=await this.handler.handleAcpSoloMessage(s);this.sendResult(o,i);break}case ee.SOLO_EVALUATE:{let i=await this.handler.handleAcpSoloEvaluate(s);this.sendResult(o,i);break}case ee.PRODUCT_CREATE:{let i=await this.handler.handleAcpProductCreate(s);this.sendResult(o,i);break}case ee.PRODUCT_PLAN:{let i=await this.handler.handleAcpProductPlan(s);this.sendResult(o,i);break}case ee.PRODUCT_CONFIRM:{let i=await this.handler.handleAcpProductConfirm(s);this.sendResult(o,i);break}case ee.PRODUCT_MESSAGE:{let i=await this.handler.handleAcpProductMessage(s);this.sendResult(o,i);break}case ee.PRODUCT_PAUSE:{let i=await this.handler.handleAcpProductPause(s);this.sendResult(o,i);break}case ee.PRODUCT_RESUME:{let i=await this.handler.handleAcpProductResume(s);this.sendResult(o,i);break}case ee.PRODUCT_CANCEL:{let i=await this.handler.handleAcpProductCancel(s);this.sendResult(o,i);break}case ee.PRODUCT_ROLLBACK:{let i=await this.handler.handleAcpProductRollback(s);this.sendResult(o,i);break}case ee.PRODUCT_STATUS:{let i=await this.handler.handleAcpProductStatus(s);this.sendResult(o,i);break}case ee.PRODUCT_SUBSCRIBE:{let i=await this.handler.handleAcpProductSubscribe(s);this.sendResult(o,i);break}case ee.TEAM_DELEGATE:{let i=await this.handler.handleAcpTeamDelegate(s);this.sendResult(o,i);break}default:this.sendError(o,Co.METHOD_NOT_FOUND,`Unknown method: ${r}`)}}catch(i){this.sendError(o,Co.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,Co.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,Co.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] \u922B?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] \u922B?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}
|
|
@@ -147,7 +147,7 @@ Return a brief summary of what you consolidated, updated, or pruned. If nothing
|
|
|
147
147
|
`}}catch{}let c="";if(i&&t.memoryProvider?.getAllProfiles)try{let h=t.memoryProvider.getAllProfiles(t.memoryUserId),v=Object.entries(h);if(v.length>0){let b=["## Known User Profile"];b.push("");for(let[R,T]of v.slice(0,20))b.push(`- **${R}**: ${T}`);c=`
|
|
148
148
|
`+b.join(`
|
|
149
149
|
`)+`
|
|
150
|
-
`}}catch{}let l=cp(t.context.memoryRoot,t.context.transcriptDir,o,{hasQMemory:i,categoryContext:s||void 0,temporalContext:a||void 0,profileContext:c||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 d=(h,v)=>nw(t.context.memoryRoot,{toolName:h,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"]}}}]:[],p=i?{invoke:async(h,v,b,R)=>{let T=t.memoryProvider,A=t.memoryUserId;if(v==="qmemory_search"){let{query:P,limit:I}=JSON.parse(b),E=await T.search(P,A,{limit:I??10});return{result:JSON.stringify(E)}}if(v==="qmemory_store"){if(!T.proposeExtracted)return{result:"",error:"memory proposals are not supported"};let{text:P,source:I}=JSON.parse(b),E=await T.proposeExtracted([{text:P,category:"insight",importance:.45}],A,{sessionId:t.context.currentSessionId,source:I??"dream-consolidation"});return{result:JSON.stringify(E)}}if(v==="qmemory_feedback"){if(!T.feedback)return{result:"Feedback noted (no handler)."};let{memoryIds:P,signal:I}=JSON.parse(b);return{result:`Feedback applied to ${(await T.feedback(P,I)).affected} memories.`}}if(v==="qmemory_temporal"){if(!T.synthesizeTimeline)return{result:"Temporal synthesis not available."};let{days:P,category:I}=JSON.parse(b),E=P??7,L=Date.now()-E*864e5;return{result:T.synthesizeTimeline(A,L,Date.now())}}if(v==="qmemory_profile"){let{action:P,key:I,value:E}=JSON.parse(b);if(P==="get"){if(!T.getAllProfiles)return{result:"{}"};let L=T.getAllProfiles(A);return{result:JSON.stringify(L)}}return P==="set"&&I&&E?T.setProfile?(T.setProfile(A,I,E),{result:`Profile updated: ${I} = ${E}`}):{result:"Profile write not available."}:{result:"Invalid profile action. Use 'get' or 'set' with key/value."}}return t.toolInvoker.invoke(h,v,b,R)}}:t.toolInvoker,m=new Set(["read","write","edit","patch","exec","search","qmemory_search","qmemory_store","qmemory_feedback","qmemory_temporal","qmemory_profile"]),f=[...t.tools.filter(h=>m.has(h.function.name)),...u];try{let h=await Mr({promptMessages:[{role:"user",content:"Begin memory consolidation."}],systemPrompt:l,tools:f,canUseTool:d,transport:t.transport,toolInvoker:p,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 b of h.events)if(b.type==="tool_call")try{let R=JSON.parse(b.arguments),T=R.file_path??R.path??R.filePath;T&&ap(T,t.context.memoryRoot)&&v.push(T)}catch{}return h.ok?(await aw(t.context.memoryRoot),t.log.info(`[dream] consolidation complete \u2014 ${v.length} files touched, ${h.durationMs}ms`)):(await op(t.context.memoryRoot,n.priorLockMtime),t.log.warn(`[dream] consolidation failed: ${h.error}`)),t.hooks?.invoke("subagent.stopped",{sessionId:t.context.currentSessionId,turnId:n.taskId,subagentId:n.taskId,agentType:"dream",reason:h.ok?"normal":"error",error:h.error}).catch(()=>{}),{ok:h.ok,sessionsReviewed:o.length,filesTouched:[...new Set(v)],turns:[],durationMs:Date.now()-e,error:h.error}}catch(h){await op(t.context.memoryRoot,n.priorLockMtime).catch(()=>{});let v=h instanceof Error?h.message:String(h);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 Mo from"node:fs/promises";import*as Ea from"node:path";var up={minIntervalHours:24,temporalExpiry:!0,stalenessDecay:!0,noiseArchival:!0},pp=".last-decay";async function dw(t,e={}){let r=(e.minIntervalHours??up.minIntervalHours)*36e5,n=Ea.join(t,pp);try{let o=await Mo.readFile(n,"utf-8"),s=parseInt(o.trim(),10);return isNaN(s)?!0:Date.now()-s>=r}catch{return!0}}async function uw(t){let e=Ea.join(t,pp);await Mo.writeFile(e,String(Date.now()),"utf-8")}async function mp(t){let e=Date.now(),r={...up,...t.config};if(!await dw(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 uw(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}}}qe();var _a=new Set(["gateway","agents_list","session_status","sessions_send","sessions_list","sessions_history","sessions_spawn","cron","config","workflow"]),gp=new Set([..._a,"agent"]);function Ma(t,e){let r=e?_a:gp;return t.filter(n=>n.function.name.startsWith("mcp__")?!0:!r.has(n.function.name))}var Kt=new Map,Da=new Set;function fp(t){Kt.clear(),Da.clear();for(let e of t)Kt.set(e.name,e)}function K(t){Kt.set(t.name,t)}function Na(t){for(let e of t)Kt.set(e.name,e)}function Do(t){return Kt.delete(t)}function Ce(t){return Kt.get(t)}function zt(){return Array.from(Kt.keys())}function hp(t){let e=Kt.get(t);return!e||e.isEnabled?.()===!1?!1:(Da.add(t),!0)}function Ie(t=!1){let e=[];for(let r of Kt.values())r.isEnabled?.()!==!1&&(!t&&r.shouldDefer&&!Da.has(r.name)||e.push({type:"function",function:{name:r.name,description:r.description,parameters:r.parameters},meta:{category:r.category??"other",displayName:r.displayName??{key:`capability.tool.${r.name}.name`,fallback:r.label},displayDescription:r.displayDescription??{key:`capability.tool.${r.name}.description`,fallback:""},parallelSafe:r.isConcurrencySafe??!1,isReadOnly:r.isReadOnly??!1,isDangerous:!(r.isReadOnly??!1)&&!(r.isConcurrencySafe??!1)}}));return e}import{cleanSchemaForGemini as tF}from"@xiaozhiclaw/provider-core/gemini-schema-utils";function La(t,e,r,n){return{role:"assistant",content:e||null,tool_calls:t,...r&&r.length>0?{thinkingBlocks:r}:{},...n?{reasoning_content:n}:{}}}function No(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 pw=/\b(?:daily|weekly|monthly)(?:\/(?:daily|weekly|monthly))* (?:usage )?limit(?:s)?(?: (?:exhausted|reached|exceeded))?\b/i,ur={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]},mw=/^(?:error[:\s-]+)?billing(?:\s+error)?(?:[:\s-]+|$)|^(?:error[:\s-]+)?(?:credit balance|insufficient credits?|payment required|http\s*402\b)/i,gw=/["']?(?:status|code)["']?\s*[:=]\s*402\b|\bhttp\s*402\b|\berror(?:\s+code)?\s*[:=]?\s*402\b|^\s*402\s+payment/i,fw=512,hw=/^(?:http\s*)?(\d{3})(?:\s+([\s\S]+))?$/i;var yw=new Set([500,502,503,504,521,522,523,524,529]),bw=["insufficient credits","insufficient quota","credit balance","insufficient balance","plans & billing","add more credits","top up"],vw=["upgrade your plan","upgrade plan","current plan","subscription"],kw=["daily","weekly","monthly"],Rw=["try again","retry","temporary","cooldown"],Sw=["usage limit","rate limit","organization usage"],Tw=["organization","workspace"],Aw=["billing period","exceeded","reached","exhausted"],ww=/["']?(?: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,Pw=/^(?:error[:\s-]+)?(?:(?:http\s*)?402(?:\s+payment required)?|payment required)(?:[:\s-]+|$)/i;function pr(t,e){if(!t)return!1;let r=t.toLowerCase();return e.some(n=>n instanceof RegExp?n.test(r):r.includes(n))}function xw(t){return pr(t,ur.format)}function yp(t){return pr(t,ur.rateLimit)}function Cw(t){return pr(t,ur.timeout)}function Iw(t){return pw.test(t)}function Oa(t){let e=t.toLowerCase();return e?t.length>fw?gw.test(e):pr(e,ur.billing)?!0:mw.test(t)?e.includes("upgrade")||e.includes("credits")||e.includes("payment")||e.includes("plan"):!1:!1}function bp(t){return pr(t,ur.authPermanent)}function Ew(t){return pr(t,ur.auth)}function vp(t){return pr(t,ur.overloaded)}function dr(t,e){return e.some(r=>t.includes(r))}function _w(t){return dr(t,bw)||dr(t,vw)&&t.includes("limit")||t.includes("billing hard limit")||t.includes("hard limit reached")||t.includes("maximum allowed")&&t.includes("limit")}function Mw(t){let e=dr(t,kw),r=t.includes("spend limit")||t.includes("spending limit"),n=dr(t,Tw);return dr(t,Rw)&&dr(t,Sw)||e&&(t.includes("usage limit")||r)||e&&t.includes("limit")&&t.includes("reset")||n&&t.includes("limit")&&(r||dr(t,Aw))}function Dw(t){return t.trim().toLowerCase().replace(Pw,"").trim()}function kp(t){let e=Dw(t);return!e||_w(e)?"billing":yp(e)||Mw(e)?"rate_limit":"billing"}function Nw(t){return ww.test(t)?kp(t):null}function Rp(t){let e=t.match(hw);if(!e)return null;let r=Number(e[1]);return Number.isFinite(r)?{code:r,rest:(e[2]??"").trim()}:null}function Lw(t){if(!t)return!1;let e=t.toLowerCase();return e.includes('"type":"api_error"')&&e.includes("internal server error")}function Ow(t){let e=t.trim();if(!e)return!1;let r=Rp(e);return r?yw.has(r.code):!1}function Sp(t,e){return typeof t!="number"||!Number.isFinite(t)?null:t===402?e?kp(e):"billing":t===429?"rate_limit":t===401||t===403?e&&bp(e)?"auth_permanent":"auth":t===408?"timeout":t===503?e&&vp(e)?"overloaded":"timeout":t===502||t===504?"timeout":t===529?"overloaded":t===400?e&&Oa(e)?"billing":"format":null}function jw(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 $w(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 Tp(t){if($w(t))return"session_expired";if(jw(t))return"model_not_found";let e=Nw(t);return e||(Iw(t)?Oa(t)?"billing":"rate_limit":yp(t)?"rate_limit":vp(t)?"overloaded":Ow(t)?Rp(t.trim())?.code===529?"overloaded":"timeout":Lw(t)?"timeout":xw(t)?"format":Oa(t)?"billing":Cw(t)?"timeout":bp(t)?"auth_permanent":Ew(t)?"auth":null)}var Uw={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"},Fw=new Set(["RETRYABLE_TRANSIENT","RETRYABLE_DEGRADED","TOOL_EXECUTION_FAILED"]);function Dr(t,e){let r=Sp(t,e)??(e?Tp(e):null);return r?Uw[r]:typeof t=="number"&&t>=400&&t<500?"NON_RETRYABLE_CONTENT":"RETRYABLE_TRANSIENT"}function ja(t){return Fw.has(t)}function vn(t){return typeof t.compressAsync=="function"}var Ap=4,Nr=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 u=o[d];if(u===i)continue;let p=this.estimateTokens(u);if(s-p<0&&c>=Ap)break;if(s-p<0&&c<Ap){a.unshift(u),c++;continue}s-=p,a.unshift(u),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 mr=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:Hw(s.content,this.maxToolResultChars)})),droppedCount:n,strategy:"tool-result-trim"}}};function Hw(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(`}
|
|
150
|
+
`}}catch{}let l=cp(t.context.memoryRoot,t.context.transcriptDir,o,{hasQMemory:i,categoryContext:s||void 0,temporalContext:a||void 0,profileContext:c||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 d=(h,v)=>nw(t.context.memoryRoot,{toolName:h,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"]}}}]:[],p=i?{invoke:async(h,v,b,R)=>{let T=t.memoryProvider,A=t.memoryUserId;if(v==="qmemory_search"){let{query:P,limit:I}=JSON.parse(b),E=await T.search(P,A,{limit:I??10});return{result:JSON.stringify(E)}}if(v==="qmemory_store"){if(!T.proposeExtracted)return{result:"",error:"memory proposals are not supported"};let{text:P,source:I}=JSON.parse(b),E=await T.proposeExtracted([{text:P,category:"insight",importance:.45}],A,{sessionId:t.context.currentSessionId,source:I??"dream-consolidation"});return{result:JSON.stringify(E)}}if(v==="qmemory_feedback"){if(!T.feedback)return{result:"Feedback noted (no handler)."};let{memoryIds:P,signal:I}=JSON.parse(b);return{result:`Feedback applied to ${(await T.feedback(P,I)).affected} memories.`}}if(v==="qmemory_temporal"){if(!T.synthesizeTimeline)return{result:"Temporal synthesis not available."};let{days:P,category:I}=JSON.parse(b),E=P??7,L=Date.now()-E*864e5;return{result:T.synthesizeTimeline(A,L,Date.now())}}if(v==="qmemory_profile"){let{action:P,key:I,value:E}=JSON.parse(b);if(P==="get"){if(!T.getAllProfiles)return{result:"{}"};let L=T.getAllProfiles(A);return{result:JSON.stringify(L)}}return P==="set"&&I&&E?T.setProfile?(T.setProfile(A,I,E),{result:`Profile updated: ${I} = ${E}`}):{result:"Profile write not available."}:{result:"Invalid profile action. Use 'get' or 'set' with key/value."}}return t.toolInvoker.invoke(h,v,b,R)}}:t.toolInvoker,m=new Set(["read","write","edit","patch","exec","search","qmemory_search","qmemory_store","qmemory_feedback","qmemory_temporal","qmemory_profile"]),f=[...t.tools.filter(h=>m.has(h.function.name)),...u];try{let h=await Mr({promptMessages:[{role:"user",content:"Begin memory consolidation."}],systemPrompt:l,tools:f,canUseTool:d,transport:t.transport,toolInvoker:p,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 b of h.events)if(b.type==="tool_call")try{let R=JSON.parse(b.arguments),T=R.file_path??R.path??R.filePath;T&&ap(T,t.context.memoryRoot)&&v.push(T)}catch{}return h.ok?(await aw(t.context.memoryRoot),t.log.info(`[dream] consolidation complete \u2014 ${v.length} files touched, ${h.durationMs}ms`)):(await op(t.context.memoryRoot,n.priorLockMtime),t.log.warn(`[dream] consolidation failed: ${h.error}`)),t.hooks?.invoke("subagent.stopped",{sessionId:t.context.currentSessionId,turnId:n.taskId,subagentId:n.taskId,agentType:"dream",reason:h.ok?"normal":"error",error:h.error}).catch(()=>{}),{ok:h.ok,sessionsReviewed:o.length,filesTouched:[...new Set(v)],turns:[],durationMs:Date.now()-e,error:h.error}}catch(h){await op(t.context.memoryRoot,n.priorLockMtime).catch(()=>{});let v=h instanceof Error?h.message:String(h);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 Mo from"node:fs/promises";import*as Ea from"node:path";var up={minIntervalHours:24,temporalExpiry:!0,stalenessDecay:!0,noiseArchival:!0},pp=".last-decay";async function dw(t,e={}){let r=(e.minIntervalHours??up.minIntervalHours)*36e5,n=Ea.join(t,pp);try{let o=await Mo.readFile(n,"utf-8"),s=parseInt(o.trim(),10);return isNaN(s)?!0:Date.now()-s>=r}catch{return!0}}async function uw(t){let e=Ea.join(t,pp);await Mo.writeFile(e,String(Date.now()),"utf-8")}async function mp(t){let e=Date.now(),r={...up,...t.config};if(!await dw(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 uw(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}}}qe();var _a=new Set(["gateway","agents_list","session_status","sessions_send","sessions_list","sessions_history","sessions_spawn","cron","config","workflow"]),gp=new Set([..._a,"agent"]);function Ma(t,e){let r=e?_a:gp;return t.filter(n=>n.function.name.startsWith("mcp__")?!0:!r.has(n.function.name))}var Kt=new Map,Da=new Set;function fp(t){Kt.clear(),Da.clear();for(let e of t)Kt.set(e.name,e)}function K(t){Kt.set(t.name,t)}function Na(t){for(let e of t)Kt.set(e.name,e)}function Do(t){return Kt.delete(t)}function Ce(t){return Kt.get(t)}function zt(){return Array.from(Kt.keys())}function hp(t){let e=Kt.get(t);return!e||e.isEnabled?.()===!1?!1:(Da.add(t),!0)}function Ie(t=!1){let e=[];for(let r of Kt.values())r.isEnabled?.()!==!1&&(!t&&r.shouldDefer&&!Da.has(r.name)||e.push({type:"function",function:{name:r.name,description:r.description,parameters:r.parameters},meta:{category:r.category??"other",displayName:r.displayName??{key:`capability.tool.${r.name}.name`,fallback:r.label},displayDescription:r.displayDescription??{key:`capability.tool.${r.name}.description`,fallback:""},parallelSafe:r.isConcurrencySafe??!1,isReadOnly:r.isReadOnly??!1,isDangerous:!(r.isReadOnly??!1)&&!(r.isConcurrencySafe??!1)}}));return e}import{cleanSchemaForGemini as nF}from"@xiaozhiclaw/provider-core/gemini-schema-utils";function La(t,e,r,n){return{role:"assistant",content:e||null,tool_calls:t,...r&&r.length>0?{thinkingBlocks:r}:{},...n?{reasoning_content:n}:{}}}function No(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 pw=/\b(?:daily|weekly|monthly)(?:\/(?:daily|weekly|monthly))* (?:usage )?limit(?:s)?(?: (?:exhausted|reached|exceeded))?\b/i,ur={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]},mw=/^(?:error[:\s-]+)?billing(?:\s+error)?(?:[:\s-]+|$)|^(?:error[:\s-]+)?(?:credit balance|insufficient credits?|payment required|http\s*402\b)/i,gw=/["']?(?:status|code)["']?\s*[:=]\s*402\b|\bhttp\s*402\b|\berror(?:\s+code)?\s*[:=]?\s*402\b|^\s*402\s+payment/i,fw=512,hw=/^(?:http\s*)?(\d{3})(?:\s+([\s\S]+))?$/i;var yw=new Set([500,502,503,504,521,522,523,524,529]),bw=["insufficient credits","insufficient quota","credit balance","insufficient balance","plans & billing","add more credits","top up"],vw=["upgrade your plan","upgrade plan","current plan","subscription"],kw=["daily","weekly","monthly"],Rw=["try again","retry","temporary","cooldown"],Sw=["usage limit","rate limit","organization usage"],Tw=["organization","workspace"],Aw=["billing period","exceeded","reached","exhausted"],ww=/["']?(?: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,Pw=/^(?:error[:\s-]+)?(?:(?:http\s*)?402(?:\s+payment required)?|payment required)(?:[:\s-]+|$)/i;function pr(t,e){if(!t)return!1;let r=t.toLowerCase();return e.some(n=>n instanceof RegExp?n.test(r):r.includes(n))}function xw(t){return pr(t,ur.format)}function yp(t){return pr(t,ur.rateLimit)}function Cw(t){return pr(t,ur.timeout)}function Iw(t){return pw.test(t)}function Oa(t){let e=t.toLowerCase();return e?t.length>fw?gw.test(e):pr(e,ur.billing)?!0:mw.test(t)?e.includes("upgrade")||e.includes("credits")||e.includes("payment")||e.includes("plan"):!1:!1}function bp(t){return pr(t,ur.authPermanent)}function Ew(t){return pr(t,ur.auth)}function vp(t){return pr(t,ur.overloaded)}function dr(t,e){return e.some(r=>t.includes(r))}function _w(t){return dr(t,bw)||dr(t,vw)&&t.includes("limit")||t.includes("billing hard limit")||t.includes("hard limit reached")||t.includes("maximum allowed")&&t.includes("limit")}function Mw(t){let e=dr(t,kw),r=t.includes("spend limit")||t.includes("spending limit"),n=dr(t,Tw);return dr(t,Rw)&&dr(t,Sw)||e&&(t.includes("usage limit")||r)||e&&t.includes("limit")&&t.includes("reset")||n&&t.includes("limit")&&(r||dr(t,Aw))}function Dw(t){return t.trim().toLowerCase().replace(Pw,"").trim()}function kp(t){let e=Dw(t);return!e||_w(e)?"billing":yp(e)||Mw(e)?"rate_limit":"billing"}function Nw(t){return ww.test(t)?kp(t):null}function Rp(t){let e=t.match(hw);if(!e)return null;let r=Number(e[1]);return Number.isFinite(r)?{code:r,rest:(e[2]??"").trim()}:null}function Lw(t){if(!t)return!1;let e=t.toLowerCase();return e.includes('"type":"api_error"')&&e.includes("internal server error")}function Ow(t){let e=t.trim();if(!e)return!1;let r=Rp(e);return r?yw.has(r.code):!1}function Sp(t,e){return typeof t!="number"||!Number.isFinite(t)?null:t===402?e?kp(e):"billing":t===429?"rate_limit":t===401||t===403?e&&bp(e)?"auth_permanent":"auth":t===408?"timeout":t===503?e&&vp(e)?"overloaded":"timeout":t===502||t===504?"timeout":t===529?"overloaded":t===400?e&&Oa(e)?"billing":"format":null}function jw(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 $w(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 Tp(t){if($w(t))return"session_expired";if(jw(t))return"model_not_found";let e=Nw(t);return e||(Iw(t)?Oa(t)?"billing":"rate_limit":yp(t)?"rate_limit":vp(t)?"overloaded":Ow(t)?Rp(t.trim())?.code===529?"overloaded":"timeout":Lw(t)?"timeout":xw(t)?"format":Oa(t)?"billing":Cw(t)?"timeout":bp(t)?"auth_permanent":Ew(t)?"auth":null)}var Uw={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"},Fw=new Set(["RETRYABLE_TRANSIENT","RETRYABLE_DEGRADED","TOOL_EXECUTION_FAILED"]);function Dr(t,e){let r=Sp(t,e)??(e?Tp(e):null);return r?Uw[r]:typeof t=="number"&&t>=400&&t<500?"NON_RETRYABLE_CONTENT":"RETRYABLE_TRANSIENT"}function ja(t){return Fw.has(t)}function vn(t){return typeof t.compressAsync=="function"}var Ap=4,Nr=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 u=o[d];if(u===i)continue;let p=this.estimateTokens(u);if(s-p<0&&c>=Ap)break;if(s-p<0&&c<Ap){a.unshift(u),c++;continue}s-=p,a.unshift(u),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 mr=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:Hw(s.content,this.maxToolResultChars)})),droppedCount:n,strategy:"tool-result-trim"}}};function Hw(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(`}
|
|
151
151
|
`),r.lastIndexOf(`]
|
|
152
152
|
`));if(s>e*.5)return r.slice(0,s+1)+`
|
|
153
153
|
[...truncated: ${t.length-s-1} chars omitted]`}let o=r.lastIndexOf(`
|
|
@@ -160,7 +160,7 @@ ${f}`},v=[...o,...u,h,...m],b=Date.now()-n,R=v.reduce((T,A)=>T+this.config.estim
|
|
|
160
160
|
`),i=o.filter(p=>!s.includes(p));if(i.length===0)return t;let a=r.maxTokenBudget,c=[],l=0;for(let p of i){if(l>=r.maxFiles||a<=0)break;let m=await r.readFile(p);if(!m)continue;let g=n(m);g>a||(a-=g,l++,c.push({role:"system",content:`[Post-compact file recovery: ${p}]
|
|
161
161
|
|
|
162
162
|
${m}`}))}if(c.length===0)return t;let d=[...t],u=-1;for(let p=0;p<d.length;p++)d[p].role==="system"&&(u=p);return d.splice(u+1,0,...c),d}function Ba(t,e,r=Fa){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 qa(){return{stages:[]}}function Wa(t,e,r){let n=r?.thresholdMessages??40;if(t.filter(a=>a.role!=="system").length<=n)return{messages:t,stagedCount:0};let s=xp(t,e),i=Gw(s,e,n);if(i.length===0)return{messages:s,stagedCount:0};for(let a of i)e.stages.push(a);return s=xp(t,e),{messages:s,stagedCount:i.length}}function Ga(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:Cp(t,e),committed:r}}function xp(t,e){return e.stages.filter(n=>n.committed).length===0?t:Cp(t,e)}function Cp(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 Gw(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 u=`${i}-${i+a}`;s.has(u)||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 Ka,readFileSync as Ep,writeFileSync as Kw,readdirSync as _p,mkdirSync as zw}from"node:fs";import{join as za,dirname as Vw}from"node:path";var Mp=0;var Xw="skill-patterns.json";function Dp(t){return za(t,".qlogicagent",Xw)}function Yw(t){let e=Dp(t);try{return JSON.parse(Ep(e,"utf8"))}catch{return{version:1,patterns:{}}}}function Ip(t,e){let r=Dp(t);zw(Vw(r),{recursive:!0}),Kw(r,JSON.stringify(e,null,2),"utf8")}function Jw(t){let e=Date.now()-Yd;for(let[r,n]of Object.entries(t.patterns))new Date(n.lastSeen).getTime()<e&&delete t.patterns[r]}function Np(t,e){if(e.length===0)return!1;let r=jo(e),n=Yw(t);Jw(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 Ip(t,n),!1;s.count++,s.lastSeen=o;let i=s.count>=Xd;return i&&(s.promoted=!0),Ip(t,n),i}function jo(t){return[...t].sort().join("+")}function Qw(t,e){if(!Ka(e))return null;let r=jo(t);try{let n=_p(e,{withFileTypes:!0});for(let o of n){if(!o.isDirectory())continue;let s=za(e,o.name,"SKILL.md");try{let a=Ep(s,"utf8").match(/^tools:\s*\n((?:\s+-\s+\S+\n?)+)/m);if(a){let c=a[1].split(`
|
|
163
|
-
`).map(l=>l.replace(/^\s*-\s*/,"").trim()).filter(Boolean);if(jo(c)===r)return o.name}}catch{}}}catch{}return null}function Zw(t){if(!Ka(t))return 0;try{return _p(t,{withFileTypes:!0}).filter(e=>e.isDirectory()&&Ka(za(t,e.name,"SKILL.md"))).length}catch{return 0}}function eP(t,e){return!(!t.ok||t.existingSkillName||!t.multiStep||t.toolCallCount<Wi||t.distinctToolCount<Gi||Date.now()-Mp<Ki||e?.projectSkillsDir&&(Zw(e.projectSkillsDir)>=qi||e.tools.length>0&&Qw(e.tools,e.projectSkillsDir))||e?.projectRoot&&e.tools.length>0&&!Np(e.projectRoot,e.tools))}function tP(t){return t.existingSkillName?t.feedback==="negative":!1}function $o(t,e){return tP(t)?{type:"skill.improve",skillName:t.existingSkillName,reason:"negative user feedback on existing skill execution"}:eP(t,e)?(Mp=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 Lp(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 rP(t){return t==="enabled-eligible"||t==="installed-awaiting-approval"}function nP(t){return new Map((t??[]).map(e=>[e.toolName,e]))}function oP(t){if(!t.eligibility?.length)return[...t.tools];let e=nP(t.eligibility);return t.tools.filter(r=>{let n=Lp(r);if(!n)return!1;let o=e.get(n);return!o||rP(o.status)})}function sP(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 Va(t){let e=sP({toolChoice:t.toolChoice,thinkingEnabled:t.thinkingEnabled,compatibility:t.compatibility}),r=e.normalizedToolChoice,n=[...e.warnings],o=oP({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=>Lp(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 iP=["stop","aborted","timeout","cancelled","interrupted","error"],aP=["tool_calls","toolCalls","function_call","functionCall","raw_tool_calls","rawToolCalls"];function Op(t){return t==null?[]:typeof t=="string"?t.length>0?[{type:"text",text:t}]:[]:Array.isArray(t)?t:[{type:"text",text:String(t)}]}function cP(t,e){return{...t,content:[...Op(t.content),...Op(e.content)]}}function lP(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 dP(t){return new Set((t??iP).map(e=>e.trim().toLowerCase()))}function uP(t,e){return t?dP(e).has(t.trim().toLowerCase()):!1}function Xa(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=>lP(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]=cP(c,a);continue}i.push(a)}return i}function Ya(t,e){return uP(e?.stopReason,e?.forcedStopReasons)?t.map(r=>{if(r.role!=="assistant")return{...r};let n={...r};for(let o of aP)delete n[o];return n}):[...t]}function Ja(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 Qa(t,e){let r=Xa(t),n=Ya(r,e);return Ja(n,e)}function pP(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 mP(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 gP(t){return{round:t.round??0,maxRounds:t.maxRounds,pendingToolCallIds:[...t.pendingToolCallIds??[]],completedToolCallIds:[...t.completedToolCallIds??[]],lastStopReason:t.lastStopReason,replayMessages:[...t.replayMessages??[]]}}function Za(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 Uo(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 Fo(t){let e=[],r=Xa(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=Ya(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=Ja(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:gP({maxRounds:t.maxRounds,round:t.round,lastStopReason:t.lastStopReason,replayMessages:o,pendingToolCallIds:pP(o),completedToolCallIds:mP(o)}),recoveryActions:e}}var fP=new Set(["main","sdk","agent","compact","hook","verification","side_question"]);function ec(t){return t?fP.has(t):!0}function tc(t){return t===429||t===529}function Ho(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 yF={maxBackoffMs:300*1e3,resetCapMs:360*60*1e3,heartbeatIntervalMs:3e4};function Bo(){let t=process.env.QLOGICAGENT_PERSISTENT_RETRY;return t==="1"||t==="true"}var Rn=class extends Error{constructor(r,n){super(`Model fallback triggered: ${r} -> ${n}`);this.originalModel=r;this.fallbackModel=n;this.name="FallbackTriggeredError"}originalModel;fallbackModel};function rc(t,e){if(e.allowedTools&&e.allowedTools.length>0){let r=new Set(e.allowedTools);return t.filter(n=>r.has(n))}if(e.toolAccessMode==="none")return[];if(e.toolAccessMode==="read-only"){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 hP={name:"general",label:"General Purpose",description:"A general-purpose sub-agent that can perform any task with full tool access.",maxTurns:200,toolAccessMode:"full",canFork:!1},yP={name:"explore",label:"Explore",description:"Fast read-only codebase exploration. Search files, read code, analyze structure. Cannot write or execute.",maxTurns:50,toolAccessMode:"read-only",allowedTools:["read_file","search","web_search","web_fetch","think","memory","tool_search"],canFork:!1},bP={name:"plan",label:"Plan",description:"Planning mode. Explore, analyze, and produce a structured plan. Cannot write files or execute commands.",maxTurns:80,toolAccessMode:"read-only",allowedTools:["read_file","search","web_search","web_fetch","think","memory","task","tool_search"],canFork:!1},vP={name:"code",label:"Code",description:"A coding sub-agent with full tool access for implementation tasks.",maxTurns:200,toolAccessMode:"full",canFork:!0},kP={name:"research",label:"Research",description:"Web research and information gathering. Searches the web, fetches pages, and synthesizes findings.",maxTurns:30,toolAccessMode:"read-only",allowedTools:["web_search","web_fetch","read_file","search","think","memory"],canFork:!1},RP={name:"verify",label:"Verify",description:"Verification agent. Runs tests, checks build output, validates changes are correct.",maxTurns:40,toolAccessMode:"full",allowedTools:["exec","read_file","search","think"],canFork:!1},jp=[hP,yP,bP,vP,kP,RP];function nc(){return[...jp]}function Sn(t){return jp.find(e=>e.name===t)}function oc(t){return{promptTokens:0,hasAttemptedReactiveCompact:!1,currentMaxOutputTokens:t.maxOutputTokens,consecutiveTruncations:0,aborted:t.abortSignal?.aborted??!1}}function sc(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 ic(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 ac(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 cc(t,e){return t.aborted?!0:e.abortSignal?.aborted?(t.aborted=!0,!0):!1}var SP={maxConsecutiveFailures:3,minMessagesAfterCompact:4,targetUsagePercent:50};function lc(){return{consecutiveFailures:0,attemptedThisTurn:!1,lastCompactAt:null,toolsAtLastCompact:[]}}function Lr(t,e=SP){return!(t.attemptedThisTurn||t.consecutiveFailures>=e.maxConsecutiveFailures)}import{accumulateToolCalls as ZP}from"@xiaozhiclaw/provider-core";function qo(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}:{}}}import{mkdir as AP,writeFile as wP}from"fs/promises";import{join as $p}from"path";import{tmpdir as PP}from"os";var xP="tool-results",Up="<persisted-output>",CP="</persisted-output>";function Fp(){return{seenIds:new Set,replacements:new Map}}function Hp(t){return $p(PP(),"qlogicagent-sessions",t,xP)}async function IP(t){try{await AP(Hp(t),{recursive:!0})}catch{}}function EP(t,e){let r=e.replace(/[^a-zA-Z0-9_-]/g,"_");return $p(Hp(t),`${r}.txt`)}function _P(t,e){if(t.length<=e)return{preview:t,hasMore:!1};let n=t.slice(0,e).lastIndexOf(`
|
|
163
|
+
`).map(l=>l.replace(/^\s*-\s*/,"").trim()).filter(Boolean);if(jo(c)===r)return o.name}}catch{}}}catch{}return null}function Zw(t){if(!Ka(t))return 0;try{return _p(t,{withFileTypes:!0}).filter(e=>e.isDirectory()&&Ka(za(t,e.name,"SKILL.md"))).length}catch{return 0}}function eP(t,e){return!(!t.ok||t.existingSkillName||!t.multiStep||t.toolCallCount<Wi||t.distinctToolCount<Gi||Date.now()-Mp<Ki||e?.projectSkillsDir&&(Zw(e.projectSkillsDir)>=qi||e.tools.length>0&&Qw(e.tools,e.projectSkillsDir))||e?.projectRoot&&e.tools.length>0&&!Np(e.projectRoot,e.tools))}function tP(t){return t.existingSkillName?t.feedback==="negative":!1}function $o(t,e){return tP(t)?{type:"skill.improve",skillName:t.existingSkillName,reason:"negative user feedback on existing skill execution"}:eP(t,e)?(Mp=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 Lp(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 rP(t){return t==="enabled-eligible"||t==="installed-awaiting-approval"}function nP(t){return new Map((t??[]).map(e=>[e.toolName,e]))}function oP(t){if(!t.eligibility?.length)return[...t.tools];let e=nP(t.eligibility);return t.tools.filter(r=>{let n=Lp(r);if(!n)return!1;let o=e.get(n);return!o||rP(o.status)})}function sP(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 Va(t){let e=sP({toolChoice:t.toolChoice,thinkingEnabled:t.thinkingEnabled,compatibility:t.compatibility}),r=e.normalizedToolChoice,n=[...e.warnings],o=oP({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=>Lp(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 iP=["stop","aborted","timeout","cancelled","interrupted","error"],aP=["tool_calls","toolCalls","function_call","functionCall","raw_tool_calls","rawToolCalls"];function Op(t){return t==null?[]:typeof t=="string"?t.length>0?[{type:"text",text:t}]:[]:Array.isArray(t)?t:[{type:"text",text:String(t)}]}function cP(t,e){return{...t,content:[...Op(t.content),...Op(e.content)]}}function lP(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 dP(t){return new Set((t??iP).map(e=>e.trim().toLowerCase()))}function uP(t,e){return t?dP(e).has(t.trim().toLowerCase()):!1}function Xa(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=>lP(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]=cP(c,a);continue}i.push(a)}return i}function Ya(t,e){return uP(e?.stopReason,e?.forcedStopReasons)?t.map(r=>{if(r.role!=="assistant")return{...r};let n={...r};for(let o of aP)delete n[o];return n}):[...t]}function Ja(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 Qa(t,e){let r=Xa(t),n=Ya(r,e);return Ja(n,e)}function pP(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 mP(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 gP(t){return{round:t.round??0,maxRounds:t.maxRounds,pendingToolCallIds:[...t.pendingToolCallIds??[]],completedToolCallIds:[...t.completedToolCallIds??[]],lastStopReason:t.lastStopReason,replayMessages:[...t.replayMessages??[]]}}function Za(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 Uo(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 Fo(t){let e=[],r=Xa(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=Ya(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=Ja(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:gP({maxRounds:t.maxRounds,round:t.round,lastStopReason:t.lastStopReason,replayMessages:o,pendingToolCallIds:pP(o),completedToolCallIds:mP(o)}),recoveryActions:e}}var fP=new Set(["main","sdk","agent","compact","hook","verification","side_question"]);function ec(t){return t?fP.has(t):!0}function tc(t){return t===429||t===529}function Ho(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 vF={maxBackoffMs:300*1e3,resetCapMs:360*60*1e3,heartbeatIntervalMs:3e4};function Bo(){let t=process.env.QLOGICAGENT_PERSISTENT_RETRY;return t==="1"||t==="true"}var Rn=class extends Error{constructor(r,n){super(`Model fallback triggered: ${r} -> ${n}`);this.originalModel=r;this.fallbackModel=n;this.name="FallbackTriggeredError"}originalModel;fallbackModel};function rc(t,e){if(e.allowedTools&&e.allowedTools.length>0){let r=new Set(e.allowedTools);return t.filter(n=>r.has(n))}if(e.toolAccessMode==="none")return[];if(e.toolAccessMode==="read-only"){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 hP={name:"general",label:"General Purpose",description:"A general-purpose sub-agent that can perform any task with full tool access.",maxTurns:200,toolAccessMode:"full",canFork:!1},yP={name:"explore",label:"Explore",description:"Fast read-only codebase exploration. Search files, read code, analyze structure. Cannot write or execute.",maxTurns:50,toolAccessMode:"read-only",allowedTools:["read_file","search","web_search","web_fetch","think","memory","tool_search"],canFork:!1},bP={name:"plan",label:"Plan",description:"Planning mode. Explore, analyze, and produce a structured plan. Cannot write files or execute commands.",maxTurns:80,toolAccessMode:"read-only",allowedTools:["read_file","search","web_search","web_fetch","think","memory","task","tool_search"],canFork:!1},vP={name:"code",label:"Code",description:"A coding sub-agent with full tool access for implementation tasks.",maxTurns:200,toolAccessMode:"full",canFork:!0},kP={name:"research",label:"Research",description:"Web research and information gathering. Searches the web, fetches pages, and synthesizes findings.",maxTurns:30,toolAccessMode:"read-only",allowedTools:["web_search","web_fetch","read_file","search","think","memory"],canFork:!1},RP={name:"verify",label:"Verify",description:"Verification agent. Runs tests, checks build output, validates changes are correct.",maxTurns:40,toolAccessMode:"full",allowedTools:["exec","read_file","search","think"],canFork:!1},jp=[hP,yP,bP,vP,kP,RP];function nc(){return[...jp]}function Sn(t){return jp.find(e=>e.name===t)}function oc(t){return{promptTokens:0,hasAttemptedReactiveCompact:!1,currentMaxOutputTokens:t.maxOutputTokens,consecutiveTruncations:0,aborted:t.abortSignal?.aborted??!1}}function sc(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 ic(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 ac(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 cc(t,e){return t.aborted?!0:e.abortSignal?.aborted?(t.aborted=!0,!0):!1}var SP={maxConsecutiveFailures:3,minMessagesAfterCompact:4,targetUsagePercent:50};function lc(){return{consecutiveFailures:0,attemptedThisTurn:!1,lastCompactAt:null,toolsAtLastCompact:[]}}function Lr(t,e=SP){return!(t.attemptedThisTurn||t.consecutiveFailures>=e.maxConsecutiveFailures)}import{accumulateToolCalls as ZP}from"@xiaozhiclaw/provider-core";function qo(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}:{}}}import{mkdir as AP,writeFile as wP}from"fs/promises";import{join as $p}from"path";import{tmpdir as PP}from"os";var xP="tool-results",Up="<persisted-output>",CP="</persisted-output>";function Fp(){return{seenIds:new Set,replacements:new Map}}function Hp(t){return $p(PP(),"qlogicagent-sessions",t,xP)}async function IP(t){try{await AP(Hp(t),{recursive:!0})}catch{}}function EP(t,e){let r=e.replace(/[^a-zA-Z0-9_-]/g,"_");return $p(Hp(t),`${r}.txt`)}function _P(t,e){if(t.length<=e)return{preview:t,hasMore:!1};let n=t.slice(0,e).lastIndexOf(`
|
|
164
164
|
`),o=n>e*.5?n:e;return{preview:t.slice(0,o),hasMore:!0}}function Bp(t){return t.includes(Up)}async function qp(t,e,r){await IP(r);let n=EP(r,e);try{await wP(n,t,{encoding:"utf-8",flag:"wx"})}catch(i){if(i.code!=="EEXIST")return null}let{preview:o,hasMore:s}=_P(t,vo);return{filepath:n,originalSize:t.length,preview:o,hasMore:s}}function Wp(t){let e=`${Up}
|
|
165
165
|
`;return e+=`Output too large (${t.originalSize} chars). Full output saved to: ${t.filepath}
|
|
166
166
|
|
|
@@ -250,7 +250,7 @@ ${c||"(\u65E0)"}`].join(`
|
|
|
250
250
|
|
|
251
251
|
\u521A\u624D\u53D1\u751F\u4E86: ${t.turnSummary}
|
|
252
252
|
|
|
253
|
-
\u7528\u4E00\u53E5\u8BDD(\u226420\u5B57)\u4EE5\u4F60\u7684\u6027\u683C\u505A\u51FA\u7B80\u77ED\u53CD\u5E94\u3002\u53EA\u8F93\u51FA\u53CD\u5E94\u6587\u672C\uFF0C\u4E0D\u8981\u5176\u4ED6\u5185\u5BB9\u3002${r}`;try{let o=await e(n,50);if(!o||o.length>50)return null;_n.push(o),_n.length>GI&&_n.shift();let s=/[!!✨🎉]|搞定|完美|太棒/.test(o)?"excited":/[.。…]|嗯|想|看看/.test(o)?"thinking":/[zZ]|困|睡|累/.test(o)?"sleepy":"normal";return{text:o,style:s}}catch{return null}}var Uc=[{id:"bubble_detail",name:"Bubble Detail",description:"Longer speech bubbles for status text",unlockedAtLevel:2,surface:"presentation"},{id:"gaze_follow",name:"Gaze Follow",description:"Eyes follow pointer focus more smoothly",unlockedAtLevel:3,surface:"presentation"},{id:"micro_expression",name:"Micro Expression",description:"Tiny antenna and eye sparkle animations",unlockedAtLevel:5,surface:"presentation"},{id:"tidy_motion",name:"Tidy Motion",description:"A gentle tidying animation after local profile updates",unlockedAtLevel:7,surface:"presentation"},{id:"mood_badge",name:"Mood Badge",description:"Small weather-like mood badges in bubbles",unlockedAtLevel:10,surface:"presentation"},{id:"quiet_rest",name:"Quiet Rest",description:"Calmer idle and sleeping animations",unlockedAtLevel:12,surface:"presentation"},{id:"activity_glow",name:"Activity Glow",description:"Soft glow during visible activity changes",unlockedAtLevel:15,surface:"presentation"},{id:"style_tint",name:"Style Tint",description:"Subtle color accents for the companion style",unlockedAtLevel:20,surface:"presentation"}],wf=["\u7B2C\u4E00\u6B21\u8131\u58F3\uFF01\u5C0F\u867E\u58F3\u53D8\u5F97\u66F4\u6709\u5149\u6CFD\u4E86","\u58F3\u9762\u5F00\u59CB\u51FA\u73B0\u7EC6\u5FAE\u7684\u5F69\u8679\u7EB9\u7406","\u94B3\u5B50\u53D8\u5F97\u66F4\u52A0\u6709\u529B\uFF0C\u80FD\u5939\u8D77\u66F4\u591A\u4E1C\u897F\u4E86","\u89E6\u89D2\u7075\u654F\u5EA6\u63D0\u5347\uFF0C\u611F\u77E5\u8303\u56F4\u6269\u5927","\u5168\u8EAB\u6563\u53D1\u5FAE\u5149\uFF0C\u50CF\u662F\u5185\u5728\u529B\u91CF\u5728\u89C9\u9192","\u8FDB\u5165\u7A00\u6709\u4F53\u8272\u53D8\u5F02\u9636\u6BB5..."],oe=class t{static xpForLevel(e){return e*100}static processXpGain(e,r){let n=[],o={},s=e.level,i=e.experience+r;for(;i>=t.xpForLevel(s);){if(i-=t.xpForLevel(s),s++,n.push({type:"level_up",level:s}),s%5===0){let c=Math.floor(s/5),l=t.getMoltResult(c,e.stats);n.push({type:"molt",level:s,moltStage:c});for(let[d,u]of Object.entries(l.statBoost)){let p=d;o[p]=(o[p]??0)+(u??0)}}let a=Uc.find(c=>c.unlockedAtLevel===s);a&&n.push({type:"display_trait_unlock",level:s,displayTrait:a})}return{newLevel:s,newXp:i,events:n,statBoosts:o}}static getMoltResult(e,r){let n=wf[Math.min(e-1,wf.length-1)]??"\u7EE7\u7EED\u6210\u957F\u4E2D...",o=["grip","patience","curiosity","appetite","humor"],i={[o[(e-1)%o.length]]:1};return{stage:e,description:n,statBoost:i}}static getUnlockedDisplayTraits(e){return Uc.filter(r=>r.unlockedAtLevel<=e)}static getNextDisplayTrait(e){return Uc.find(r=>r.unlockedAtLevel>e)??null}static xpForEvent(e){switch(e){case"turn.end":return 10;case"turn.error":return 2;case"session.created":return 5;case"interact.pat":return 3;case"interact.feed":return 5;case"interact.poke":return 1;case"tool.success":return 2;default:return 1}}};import{createHash as
|
|
253
|
+
\u7528\u4E00\u53E5\u8BDD(\u226420\u5B57)\u4EE5\u4F60\u7684\u6027\u683C\u505A\u51FA\u7B80\u77ED\u53CD\u5E94\u3002\u53EA\u8F93\u51FA\u53CD\u5E94\u6587\u672C\uFF0C\u4E0D\u8981\u5176\u4ED6\u5185\u5BB9\u3002${r}`;try{let o=await e(n,50);if(!o||o.length>50)return null;_n.push(o),_n.length>GI&&_n.shift();let s=/[!!✨🎉]|搞定|完美|太棒/.test(o)?"excited":/[.。…]|嗯|想|看看/.test(o)?"thinking":/[zZ]|困|睡|累/.test(o)?"sleepy":"normal";return{text:o,style:s}}catch{return null}}var Uc=[{id:"bubble_detail",name:"Bubble Detail",description:"Longer speech bubbles for status text",unlockedAtLevel:2,surface:"presentation"},{id:"gaze_follow",name:"Gaze Follow",description:"Eyes follow pointer focus more smoothly",unlockedAtLevel:3,surface:"presentation"},{id:"micro_expression",name:"Micro Expression",description:"Tiny antenna and eye sparkle animations",unlockedAtLevel:5,surface:"presentation"},{id:"tidy_motion",name:"Tidy Motion",description:"A gentle tidying animation after local profile updates",unlockedAtLevel:7,surface:"presentation"},{id:"mood_badge",name:"Mood Badge",description:"Small weather-like mood badges in bubbles",unlockedAtLevel:10,surface:"presentation"},{id:"quiet_rest",name:"Quiet Rest",description:"Calmer idle and sleeping animations",unlockedAtLevel:12,surface:"presentation"},{id:"activity_glow",name:"Activity Glow",description:"Soft glow during visible activity changes",unlockedAtLevel:15,surface:"presentation"},{id:"style_tint",name:"Style Tint",description:"Subtle color accents for the companion style",unlockedAtLevel:20,surface:"presentation"}],wf=["\u7B2C\u4E00\u6B21\u8131\u58F3\uFF01\u5C0F\u867E\u58F3\u53D8\u5F97\u66F4\u6709\u5149\u6CFD\u4E86","\u58F3\u9762\u5F00\u59CB\u51FA\u73B0\u7EC6\u5FAE\u7684\u5F69\u8679\u7EB9\u7406","\u94B3\u5B50\u53D8\u5F97\u66F4\u52A0\u6709\u529B\uFF0C\u80FD\u5939\u8D77\u66F4\u591A\u4E1C\u897F\u4E86","\u89E6\u89D2\u7075\u654F\u5EA6\u63D0\u5347\uFF0C\u611F\u77E5\u8303\u56F4\u6269\u5927","\u5168\u8EAB\u6563\u53D1\u5FAE\u5149\uFF0C\u50CF\u662F\u5185\u5728\u529B\u91CF\u5728\u89C9\u9192","\u8FDB\u5165\u7A00\u6709\u4F53\u8272\u53D8\u5F02\u9636\u6BB5..."],oe=class t{static xpForLevel(e){return e*100}static processXpGain(e,r){let n=[],o={},s=e.level,i=e.experience+r;for(;i>=t.xpForLevel(s);){if(i-=t.xpForLevel(s),s++,n.push({type:"level_up",level:s}),s%5===0){let c=Math.floor(s/5),l=t.getMoltResult(c,e.stats);n.push({type:"molt",level:s,moltStage:c});for(let[d,u]of Object.entries(l.statBoost)){let p=d;o[p]=(o[p]??0)+(u??0)}}let a=Uc.find(c=>c.unlockedAtLevel===s);a&&n.push({type:"display_trait_unlock",level:s,displayTrait:a})}return{newLevel:s,newXp:i,events:n,statBoosts:o}}static getMoltResult(e,r){let n=wf[Math.min(e-1,wf.length-1)]??"\u7EE7\u7EED\u6210\u957F\u4E2D...",o=["grip","patience","curiosity","appetite","humor"],i={[o[(e-1)%o.length]]:1};return{stage:e,description:n,statBoost:i}}static getUnlockedDisplayTraits(e){return Uc.filter(r=>r.unlockedAtLevel<=e)}static getNextDisplayTrait(e){return Uc.find(r=>r.unlockedAtLevel>e)??null}static xpForEvent(e){switch(e){case"turn.end":return 10;case"turn.error":return 2;case"session.created":return 5;case"interact.pat":return 3;case"interact.feed":return 5;case"interact.poke":return 1;case"tool.success":return 2;default:return 1}}};import{createHash as Y1}from"node:crypto";import Q1 from"node:fs";var Z1=500*1024,eq=20*1024,KI=["idle"];function Fc(t){if(!t||typeof t!="object")throw new Error("Manifest must be an object");let e=t;if(e.version!==1)throw new Error(`Unsupported manifest version: ${e.version}`);for(let o of["name","author","created"])if(typeof e[o]!="string"||e[o].length===0)throw new Error(`Manifest missing or invalid field: ${o}`);if(e.name.length>30)throw new Error("Manifest name exceeds 30 characters");if(!e.dimensions||typeof e.dimensions!="object")throw new Error("Manifest missing dimensions");let r=e.dimensions;if(typeof r.width!="number"||typeof r.height!="number")throw new Error("Manifest dimensions must be numbers");if(r.width>400||r.height>400||r.width<50||r.height<50)throw new Error("Manifest dimensions must be 50-400px");if(!e.states||typeof e.states!="object")throw new Error("Manifest missing states");let n=e.states;for(let o of KI)if(!(o in n))throw new Error(`Manifest missing required state: ${o}`);for(let[o,s]of Object.entries(n)){if(!s||typeof s!="object")throw new Error(`Invalid state config for "${o}"`);let i=s;if(typeof i.file!="string")throw new Error(`State "${o}" missing file path`);if(typeof i.loop!="boolean")throw new Error(`State "${o}" missing loop flag`);if(i.file.includes("..")||i.file.startsWith("/"))throw new Error(`State "${o}" file path contains path traversal`)}}function br(t){let e=t.replace(/<\?xml[^?]*\?>/gi,"").replace(/<!DOCTYPE[^>]*>/gi,"");return e=e.replace(/<script[\s\S]*?<\/script>/gi,""),e=e.replace(/<script[^>]*\/>/gi,""),e=e.replace(/<foreignObject[\s\S]*?<\/foreignObject>/gi,""),e=e.replace(/<foreignObject[^>]*\/>/gi,""),e=e.replace(/\s+on\w+\s*=\s*"[^"]*"/gi,""),e=e.replace(/\s+on\w+\s*=\s*'[^']*'/gi,""),e=e.replace(/href\s*=\s*"javascript:[^"]*"/gi,'href=""'),e=e.replace(/href\s*=\s*'javascript:[^']*'/gi,"href=''"),e=e.replace(/xlink:href\s*=\s*"javascript:[^"]*"/gi,'xlink:href=""'),e=e.replace(/(href|src)\s*=\s*"(https?:\/\/[^"]*)"/gi,'$1=""'),e=e.replace(/(href|src)\s*=\s*'(https?:\/\/[^']*)'/gi,"$1=''"),e=e.replace(/<use[^>]*href\s*=\s*"https?:\/\/[^"]*"[^>]*\/?>/gi,""),e=e.replace(/@import\s+url\([^)]*https?:\/\/[^)]*\)[^;]*;/gi,""),e=e.replace(/url\(\s*['"]?https?:\/\/[^)]*\)/gi,"url()"),e.trim()}var Hc={idle:{body:"breathe",eyes:"blink",arms:"sway"},thinking:{body:"tilt",eyes:"lookup",arms:"still",effects:["ellipsis"]},working:{body:"lean",eyes:"focus",arms:"hammer"},done:{body:"bounce",eyes:"sparkle",arms:"raised",effects:["sparkle"]},happy:{body:"sway",eyes:"sparkle",arms:"wave",effects:["heart"]},error:{body:"shrink",eyes:"dizzy",arms:"covering",effects:["sweat"]},sleeping:{body:"still",eyes:"closed",arms:"still",effects:["zzz"]},eating:{body:"still",eyes:"blink",arms:"eat"},plan:{body:"tilt",eyes:"focus",arms:"hold",effects:["ellipsis"]},dream:{body:"float",eyes:"closed",arms:"sway",effects:["sparkle","music"]},subagent:{body:"lean",eyes:"focus",arms:"hammer"},"random-look":{body:"breathe",eyes:"lookup",arms:"still"}},zI={breathe:"@keyframes body-anim { 0%,100% { transform: scaleY(1); } 50% { transform: scaleY(1.03); } }",sway:"@keyframes body-anim { 0%,100% { transform: rotate(0deg); } 25% { transform: rotate(2deg); } 75% { transform: rotate(-2deg); } }",lean:"@keyframes body-anim { 0%,100% { transform: rotate(0deg) translateX(0); } 50% { transform: rotate(-3deg) translateX(-2px); } }",tilt:"@keyframes body-anim { 0%,100% { transform: rotate(0deg); } 50% { transform: rotate(5deg); } }",shrink:"@keyframes body-anim { 0%,100% { transform: scale(0.92); } 50% { transform: scale(0.88); } }",bounce:"@keyframes body-anim { 0%,100% { transform: translateY(0); } 50% { transform: translateY(-8px); } }",still:"@keyframes body-anim { 0%,100% { transform: none; } }",float:"@keyframes body-anim { 0%,100% { transform: translateY(0); } 50% { transform: translateY(-5px); } }"},VI={blink:"@keyframes eye-anim { 0%,90%,100% { transform: scaleY(1); } 95% { transform: scaleY(0.1); } }",lookup:"@keyframes eye-anim { 0%,100% { transform: translateY(0); } 50% { transform: translateY(-2px); } }",focus:"@keyframes eye-anim { 0%,100% { transform: scale(1); } 50% { transform: scale(0.9); } }",closed:"@keyframes eye-anim { 0%,100% { transform: scaleY(0.1); } }",wide:"@keyframes eye-anim { 0%,100% { transform: scale(1.2); } }",sparkle:"@keyframes eye-anim { 0%,100% { transform: scale(1); opacity: 1; } 50% { transform: scale(1.1); opacity: 0.8; } }",dizzy:"@keyframes eye-anim { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }",sleepy:"@keyframes eye-anim { 0%,100% { transform: scaleY(0.3); } }"},XI={sway:`@keyframes left-arm-anim { 0%,100% { transform: rotate(0deg); } 50% { transform: rotate(5deg); } }
|
|
254
254
|
@keyframes right-arm-anim { 0%,100% { transform: rotate(0deg); } 50% { transform: rotate(-5deg); } }`,still:`@keyframes left-arm-anim { 0%,100% { transform: none; } }
|
|
255
255
|
@keyframes right-arm-anim { 0%,100% { transform: none; } }`,hammer:`@keyframes left-arm-anim { 0%,100% { transform: rotate(0deg); } 50% { transform: rotate(-20deg); } }
|
|
256
256
|
@keyframes right-arm-anim { 0%,100% { transform: rotate(0deg); } 50% { transform: rotate(-25deg); } }`,wave:`@keyframes left-arm-anim { 0%,100% { transform: rotate(0deg); } 50% { transform: rotate(15deg); } }
|
|
@@ -409,7 +409,7 @@ ${r}`)}let c=`solo-${EE().slice(0,8)}`,l={soloId:c,state:"running",task:r,cwd:o,
|
|
|
409
409
|
`),warn:r=>process.stderr.write(`[solo:pm] WARN ${r}
|
|
410
410
|
`)},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:gy.join(B(),"agent-logs")}),e={log:{info:r=>process.stderr.write(`${r}
|
|
411
411
|
`),warn:r=>process.stderr.write(`${r}
|
|
412
|
-
`)},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 vs(t,this.acpDetector,this.agentConfigStore,e),this.soloProcessManager=t}return this.soloEvaluator}async function fy(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=ze.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 hy(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=ze.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 yy(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 ze.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 by(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 ze.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 vy(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 ky(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 ze.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 Ry(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 ze.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 Sy(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 ze.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)})}}qe();import{randomUUID as
|
|
412
|
+
`)},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 vs(t,this.acpDetector,this.agentConfigStore,e),this.soloProcessManager=t}return this.soloEvaluator}async function fy(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=ze.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 hy(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=ze.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 yy(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 ze.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 by(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 ze.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 vy(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 ky(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 ze.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 Ry(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 ze.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 Sy(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 ze.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)})}}qe();import{randomUUID as $D}from"node:crypto";import*as j from"node:fs";import*as U from"node:path";import{execFile as t0}from"node:child_process";var _E="think",ME={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(`
|
|
413
413
|
`)}},required:["thought"]};function Ty(){return{name:_E,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(`
|
|
414
414
|
`),parameters:ME,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 n_,resolve as o_}from"node:path";var Ay=new Set(["find","grep","rg","ag","ack","locate","which","whereis"]),wy=new Set(["cat","head","tail","less","more","wc","stat","file","strings","jq","awk","cut","sort","uniq","tr"]),Py=new Set(["ls","tree","du"]);var xy=new Set(["mv","cp","rm","mkdir","rmdir","chmod","chown","chgrp","touch","ln","cd","export","unset","wait"]);function DE(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 Cy(t){return/(?:^|[;&|])\s*(?:cd|pushd|popd)\b/.test(t)}function al(t){let e=DE(t),r=e!==null&&Ay.has(e),n=e!==null&&wy.has(e),o=e!==null&&Py.has(e),s=e!==null&&xy.has(e),i=/(?:[^2]>|^>|\|>)/.test(t),a=Cy(t),c=(r||n||o)&&!i&&!a;return{firstCommand:e,isSearch:r,isRead:n,isList:o,isSilent:s,isConcurrencySafe:c,isReadOnly:c}}var NE=t=>({isError:t!==0,message:t!==0?`Command failed with exit code ${t}`:void 0}),LE=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 OE(t){let e=t.trim(),r=e.split(/\s*\|\s*/);return(r[r.length-1]??e).trim().split(/\s+/)[0]??""}function cl(t,e,r,n){let o=OE(t);return(LE.get(o)??NE)(e,r,n)}function ll(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 XE}from"node:child_process";import{constants as Ss,readFileSync as YE,unlinkSync as JE}from"node:fs";import{mkdir as QE,open as ZE,realpath as My}from"node:fs/promises";import{isAbsolute as e_,resolve as t_}from"node:path";function Tr(){if(process.platform!=="win32")return!1;let t=process.env.QLOGICAGENT_USE_POWERSHELL;return t==="1"||t==="true"}function dl(){return Tr()?"powershell":"bash"}function ul(){return Math.floor(Math.random()*65536).toString(16).padStart(4,"0")}import{mkdir as jE,readFile as $E,writeFile as UE,unlink as FE}from"node:fs/promises";import{join as Iy}from"node:path";import{tmpdir as HE}from"node:os";var BE=8*1024*1024,qE=5*1024*1024*1024;var pl;function Un(){if(!pl){let t=Math.random().toString(36).slice(2,10);pl=Iy(HE(),"qla-tasks",t)}return pl}function Ey(t){return Iy(Un(),`${t}.output`)}function Vt(t="local_bash"){return`${t}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}var nr=class{taskId;path;stdoutToFile;#e="";#r="";#o=0;#s=0;#t;#i;#n=0;#a=!1;constructor(e,r,n=!1,o=BE){this.taskId=e,this.path=Ey(e),this.stdoutToFile=n,this.#t=o,this.#i=r}writeStdout(e){this.#e+=e,this.#s+=e.length,this.#o+=WE(e),this.#d()}writeStderr(e){this.#r+=e}async getStdout(){if(this.stdoutToFile)try{let e=await $E(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&&jE(Un(),{recursive:!0}).then(()=>UE(this.path,this.#e).catch(()=>{}))}async deleteOutputFile(){try{await FE(this.path)}catch{}}clear(){this.#a||(this.#a=!0,this.#e="",this.#r="",this.#i=null,this.deleteOutputFile())}};function WE(t){let e=0;for(let r=0;r<t.length;r++)t.charCodeAt(r)===10&&e++;return e}var ml=137,_y=143,GE=5e3,gl=5*1024*1024*1024,ks=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)}},fl=class t{#e="running";#r;#o;#s;#t;#i=null;#n=null;#a=!1;#d;#c;#u;#g;#b;#p=null;#m=null;#l=null;taskOutput;result;onTimeout;constructor(e,r,n,o,s=!1,i=gl){this.#t=e,this.#c=r,this.#g=n,this.#b=s,this.#d=i,this.taskOutput=o,this.#s=e.stderr?new ks(e.stderr,o,!0):null,this.#o=e.stdout?new ks(e.stdout,o,!1):null,s&&(this.onTimeout=a=>{this.#u=a}),this.result=this.#w()}get status(){return this.#e}static#k(e){e.#b&&e.#u?e.#u(e.background.bind(e)):e.#y(_y)}#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.#v(),this.#i&&(clearTimeout(this.#i),this.#i=null),this.#l&&(this.#c.removeEventListener("abort",this.#l),this.#l=null)}#v(){this.#n&&(clearInterval(this.#n),this.#n=null)}#A(){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.#v(),this.#y(ml))},()=>{}))},GE),this.#n.unref?.()}#w(){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===ml,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 ${gl} bytes. ${n.stderr}`:e===_y&&(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??ml)}kill(){this.#y()}background(e){return this.#e==="running"?(this.#r=e,this.#e="backgrounded",this.#h(),this.taskOutput.stdoutToFile?this.#A():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 hl(t,e,r,n,o=!1,s=gl){return new fl(t,e,r,n,o,s)}function Rs(t,e){let r=new nr(Vt("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 yl(t){let e=new nr(Vt("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 KE=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"]),zE=["_SECRET","_TOKEN","_PASSWORD","_CREDENTIAL","_API_KEY","SECRET_","TOKEN_","PASSWORD_","CREDENTIAL_","_AUTH_","PRIVATE_KEY"];function bl(){let t={...process.env};for(let e of Object.keys(t))VE(e)&&delete t[e];return t}function VE(t){if(KE.has(t))return!0;let e=t.toUpperCase();for(let r of zE)if(e.includes(r))return!0;return!1}var r_=1800*1e3,Ts=process.cwd(),Dy=process.cwd();function As(){return Ts}function vl(t,e){Ts=e_(t)?t:t_(e||Ts,t)}function Ny(){return Dy}function ws(t){Ts=t,Dy=t}var kl=null;function Fn(t){kl={provider:t}}function Ly(){if(!kl)throw new Error("Shell provider not configured. Call setShellProvider() at startup.");return kl.provider}async function Ps(t,e,r,n){let{timeout:o,onProgress:s,preventCwdChanges:i,shouldAutoBackground:a,onStdout:c,cwd:l}=n??{},d=o||r_,u=r??dl(),p=Ly(),m=ul(),{commandString:g,cwdFilePath:f}=await p.buildExecCommand(t,{id:m,useSandbox:!1}),h=g,v=l??As();try{await My(v)}catch{let L=Ny();try{await My(L),vl(L),v=L}catch{return yl(`Working directory "${v}" no longer exists.`)}}if(e.aborted)return Rs();let b=p.shellPath,R=p.getSpawnArgs(h),T=await p.getEnvironmentOverrides(t),A=!!c,P=Vt("local_bash"),I=new nr(P,s??null,!A);await QE(Un(),{recursive:!0});let E;if(!A){let L=Ss.O_NOFOLLOW??0;E=await ZE(I.path,process.platform==="win32"?"w":Ss.O_WRONLY|Ss.O_CREAT|Ss.O_APPEND|L)}try{let L=XE(b,R,{env:{...bl(),GIT_EDITOR:"true",QLOGICAGENT:"1",...T},cwd:v,stdio:A?["pipe","pipe","pipe"]:["pipe",E?.fd,E?.fd],detached:p.detached,windowsHide:!0}),ve=hl(L,e,d,I,a);if(E!==void 0)try{await E.close()}catch{}return L.stdout&&c&&L.stdout.on("data",k=>{c(typeof k=="string"?k:k.toString())}),f&&ve.result.then(k=>{if(k&&!i&&!k.backgroundTaskId){try{let Z=YE(f,{encoding:"utf8"}).trim();Z&&Z.normalize("NFC")!==v&&vl(Z,v)}catch{}try{JE(f)}catch{}}}),ve}catch(L){if(E!==void 0)try{await E.close()}catch{}return I.clear(),Rs(void 0,{code:126,stderr:L instanceof Error?L.message:String(L)})}}var s_="exec",i_={type:"object",properties:{command:{type:"string",description:Tr()?"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"]},a_=12e4,c_=6e5,xs=3e4;function Hn(t,e){if(t.length<=e)return t;let r=Math.floor(e/2)-50;return`${t.slice(0,r)}
|
|
415
415
|
|
|
@@ -503,7 +503,7 @@ exit: Leave worktree (keep or remove it).
|
|
|
503
503
|
list: Show all active worktrees.`},name:{type:"string",description:"Worktree/branch name (for enter). Must be kebab-case, max 64 characters. If omitted, auto-generated from task context."},exitAction:{type:"string",enum:["keep","remove"],description:"For exit: 'keep' retains the worktree for later use; 'remove' deletes it."},discardChanges:{type:"boolean",description:"Required true to confirm discarding uncommitted changes when exitAction='remove'. Safety mechanism to prevent data loss."}},required:["action"]},J_=/^[a-z0-9][a-z0-9-]{0,62}[a-z0-9]?$/;function ob(t){return{name:X_,label:"Git Worktree",description:"Create isolated git worktree branches for parallel development. Each worktree has its own working directory independent of the main branch. Use for: parallel features, safe experimentation, sub-agent isolation. Exit to keep or remove the worktree when done.",parameters:Y_,execute:async(e,r)=>{switch(r.action){case"enter":{if(t.isInWorktree())return{content:[{type:"text",text:"Error: already in a worktree. Exit first before entering another."}],details:{type:"worktree",error:"already_in_worktree"}};if(r.name&&!J_.test(r.name))return{content:[{type:"text",text:"Error: name must be kebab-case (a-z, 0-9, hyphens), 2-64 characters."}],details:{type:"worktree",error:"invalid_name"}};let n=await t.enterWorktree(r.name);if(!n.success)return{content:[{type:"text",text:`Error: ${n.error||"failed to create worktree"}`}],details:{type:"worktree",error:n.error}};let o=n.worktree;return{content:[{type:"text",text:[`Entered worktree: ${o.name}`,` Branch: ${o.branch}`,` Path: ${o.path}`,"","Working in isolated branch. Changes here do not affect the main branch.","Use action='exit' when done (keep or remove)."].join(`
|
|
504
504
|
`)}],details:{type:"worktree",action:"enter",name:o.name,branch:o.branch,path:o.path}}}case"exit":{if(!t.isInWorktree())return{content:[{type:"text",text:"Error: not in a worktree."}],details:{type:"worktree",error:"not_in_worktree"}};let n=r.exitAction||"keep";if(n==="remove"){let i=t.currentWorktree?.();if(i&&(i.hasChanges||i.unpushedCommits>0)&&!r.discardChanges){let a=[];return i.hasChanges&&a.push("uncommitted changes"),i.unpushedCommits>0&&a.push(`${i.unpushedCommits} unpushed commit(s)`),{content:[{type:"text",text:`Error: worktree has ${a.join(" and ")}. Set discardChanges=true to confirm removal, or use exitAction='keep'.`}],details:{type:"worktree",error:"has_changes",hasChanges:i.hasChanges,unpushedCommits:i.unpushedCommits}}}}let o=await t.exitWorktree(n,r.discardChanges);return o.success?{content:[{type:"text",text:`Exited worktree. ${n==="keep"?"Worktree kept for later use.":"Worktree removed."}
|
|
505
505
|
Restored to: ${o.previousCwd||"main workspace"}`}],details:{type:"worktree",action:"exit",exitAction:n,previousCwd:o.previousCwd}}:{content:[{type:"text",text:`Error: ${o.error||"failed to exit worktree"}`}],details:{type:"worktree",error:o.error}}}case"list":{let n=await t.listWorktrees();if(!n.worktrees||n.worktrees.length===0)return{content:[{type:"text",text:"No worktrees (only the main working tree)."}],details:{type:"worktree",action:"list",count:0}};let o=[`Worktrees (${n.worktrees.length}):`,""];for(let s of n.worktrees){let i=s.isCurrent?" \u2190 current":"",a=s.hasChanges?" (has changes)":"";o.push(` ${s.name} [${s.branch}]${i}${a}`),o.push(` path: ${s.path}`)}return{content:[{type:"text",text:o.join(`
|
|
506
|
-
`)}],details:{type:"worktree",action:"list",count:n.worktrees.length}}}default:return{content:[{type:"text",text:`Error: unknown action "${r.action}".`}],details:{type:"worktree",error:"unknown_action"}}}}}}N();import{execFile as Q_}from"node:child_process";import{promisify as Z_}from"node:util";import{join as Ar,resolve as sb,basename as Cl}from"node:path";import{mkdir as ub,rm as pb,symlink as eM,readdir as
|
|
506
|
+
`)}],details:{type:"worktree",action:"list",count:n.worktrees.length}}}default:return{content:[{type:"text",text:`Error: unknown action "${r.action}".`}],details:{type:"worktree",error:"unknown_action"}}}}}}N();import{execFile as Q_}from"node:child_process";import{promisify as Z_}from"node:util";import{join as Ar,resolve as sb,basename as Cl}from"node:path";import{mkdir as ub,rm as pb,symlink as eM,readdir as f2,stat as tM}from"node:fs/promises";var qn=Z_(Q_),rM=/^[a-zA-Z0-9._-]+$/,ib=64;function mb(t){if(t.length>ib)throw new Error(`Invalid worktree name: must be ${ib} characters or fewer (got ${t.length})`);for(let e of t.split("/")){if(e==="."||e==="..")throw new Error(`Invalid worktree name "${t}": must not contain "." or ".." path segments`);if(!rM.test(e))throw new Error(`Invalid worktree name "${t}": segment must contain only letters, digits, dots, underscores, and dashes`)}}function Il(t){return t.replaceAll("/","+")}function gb(t){return`worktree-${Il(t)}`}var Ze=null;async function Ae(t,e){try{let{stdout:r,stderr:n}=await qn("git",t,{cwd:e??process.cwd(),env:{...process.env,GIT_TERMINAL_PROMPT:"0",GIT_ASKPASS:""},timeout:3e4});return{stdout:r,stderr:n,code:0}}catch(r){let n=r;return{stdout:n.stdout??"",stderr:n.stderr??String(r),code:n.code??1}}}async function Bn(t){let{stdout:e,code:r}=await Ae(["rev-parse","--show-toplevel"],t);return r===0?e.trim():null}async function ab(t){let{stdout:e,code:r}=await Ae(["status","--porcelain"],t);return r!==0?-1:e.trim().split(`
|
|
507
507
|
`).filter(Boolean).length}async function cb(t,e){let{stdout:r,code:n}=await Ae(["rev-list",`origin/${e}..${e}`,"--count"],t);return n!==0?0:parseInt(r.trim(),10)||0}async function fb(t,e,r,n){for(let o of r){if(o.includes("..")||o.startsWith("/")||o.startsWith("\\")){n?.warn(`[worktree] skipping symlink for "${o}": path traversal detected`);continue}let s=Ar(t,o),i=Ar(e,o);try{await eM(s,i,"dir"),n?.info(`[worktree] symlinked ${o} from main repo to worktree`)}catch(a){let c=a.code;c!=="ENOENT"&&c!=="EEXIST"&&n?.warn(`[worktree] failed to symlink ${o} (${c??"unknown"}): ${a}`)}}}async function nM(t,e,r){let{code:n,stderr:o}=await Ae(["sparse-checkout","set","--cone","--",...r],t);if(n!==0)throw await Ae(["worktree","remove","--force",t],e),new Error(`Failed to configure sparse-checkout: ${o}`);let{code:s,stderr:i}=await Ae(["checkout","HEAD"],t);if(s!==0)throw await Ae(["worktree","remove","--force",t],e),new Error(`Failed to checkout sparse worktree: ${i}`);return!0}async function oM(){try{return await qn("tmux",["-V"],{timeout:5e3}),!0}catch{return!1}}function sM(t,e){return`${Cl(t)}_${e}`.replace(/[/.]/g,"_")}async function iM(t,e){if(!await oM())return null;try{return await qn("tmux",["new-session","-d","-s",e,"-c",t],{timeout:1e4}),e}catch{return null}}async function lb(t){try{return await qn("tmux",["kill-session","-t",t],{timeout:5e3}),!0}catch{return!1}}async function db(t,e,r,n){let o=gu(e),s=Ar(o,t);try{if(!(await tM(s)).isFile())return null}catch{return null}try{let{stdout:i,stderr:a}=await qn(s,[],{cwd:e,env:{...process.env,...r},timeout:3e4});return n?.info(`[worktree] hook ${t} succeeded: ${i.trim()}`),i.trim()||null}catch(i){return n?.warn(`[worktree] hook ${t} failed: ${i}`),null}}async function hb(t,e,r){mb(e);let n=Il(e),o=gb(e),s=Ar(t,".worktrees"),i=Ar(s,n);await ub(s,{recursive:!0});let{code:a,stderr:c}=await Ae(["worktree","add","-B",o,i,"HEAD"],t);return a!==0?(r?.warn(`[worktree] agent worktree creation failed: ${c}`),null):(await fb(t,i,["node_modules"],r),r?.info(`[worktree] agent worktree created: ${e} at ${i}`),{worktreePath:i,branch:o})}async function yb(t,e,r,n){let{code:o}=await Ae(["worktree","remove","--force",e],t);return o!==0&&(await pb(e,{recursive:!0,force:!0}).catch(()=>{}),await Ae(["worktree","prune"],t)),await Ae(["branch","-D",r],t),n?.info(`[worktree] agent worktree removed: ${e}`),!0}function bb(t){let{log:e,symlinkDirs:r=["node_modules"],sparsePaths:n}=t;return{async enterWorktree(o){try{let s=Date.now(),i=await Bn();if(!i)return{success:!1,error:"Not in a git repository"};let a=await db("worktree-create",i,{WORKTREE_NAME:o??""},e);if(a){let I=process.cwd();return process.chdir(a),Ze={originalCwd:I,worktreePath:a,worktreeName:o??Cl(a),worktreeBranch:"",hookBased:!0,creationDurationMs:Date.now()-s},{success:!0,worktree:{name:Ze.worktreeName,path:a,branch:"",isCurrent:!0,hasChanges:!1,unpushedCommits:0}}}let c=o??`agent-${Date.now().toString(36)}`;mb(c);let l=Il(c),d=gb(c),u=Ar(i,".worktrees"),p=Ar(u,l);await ub(u,{recursive:!0});let{stdout:m}=await Ae(["worktree","list","--porcelain"],i),g=m.split(`
|
|
508
508
|
`).find(I=>I.startsWith("worktree ")&&I.includes(l));if(g){let I=g.replace("worktree ","").trim(),E=process.cwd();return process.chdir(I),Ze={originalCwd:E,worktreePath:I,worktreeName:c,worktreeBranch:d},e.info(`[worktree] resumed existing worktree: ${c} at ${I}`),{success:!0,worktree:{name:c,path:I,branch:d,isCurrent:!0,hasChanges:!1,unpushedCommits:0}}}let f=n&&n.length>0,h=["worktree","add"];f&&h.push("--no-checkout"),h.push("-B",d,p,"HEAD");let{code:v,stderr:b}=await Ae(h,i);if(v!==0)return{success:!1,error:`git worktree add failed: ${b.trim()}`};let R=!1;f&&n&&(await nM(p,i,n),R=!0),await fb(i,p,r,e);let T=process.cwd();process.chdir(p);let A=sM(i,d),P=await iM(p,A);return Ze={originalCwd:T,worktreePath:p,worktreeName:c,worktreeBranch:d,tmuxSessionName:P??void 0,creationDurationMs:Date.now()-s,usedSparsePaths:R},e.info(`[worktree] entered: ${c} at ${p}`),{success:!0,worktree:{name:c,path:p,branch:d,isCurrent:!0,hasChanges:!1,unpushedCommits:0}}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}},async exitWorktree(o,s){if(!Ze)return{success:!1,error:"Not in a worktree"};try{let i=Ze,a=await Bn(i.originalCwd);if(!a)return{success:!1,error:"Original git root not found"};if(o==="remove"){let c=await ab(i.worktreePath),l=await cb(i.worktreePath,i.worktreeBranch);if((c>0||l>0)&&!s)return{success:!1,error:`Worktree has ${c} uncommitted change(s) and ${l} unpushed commit(s). Set discardChanges=true to confirm.`};process.chdir(i.originalCwd),Ze=null,i.tmuxSessionName&&await lb(i.tmuxSessionName),await db("worktree-remove",a,{WORKTREE_PATH:i.worktreePath},e);let d=["worktree","remove"];s&&d.push("--force"),d.push(i.worktreePath);let{code:u,stderr:p}=await Ae(d,a);u!==0&&(e.warn(`[worktree] git worktree remove failed: ${p.trim()}, cleaning up manually`),await pb(i.worktreePath,{recursive:!0,force:!0}).catch(()=>{}),await Ae(["worktree","prune"],a)),await Ae(["branch","-D",i.worktreeBranch],a),e.info(`[worktree] removed: ${i.worktreeName}`)}else process.chdir(i.originalCwd),i.tmuxSessionName&&await lb(i.tmuxSessionName),Ze=null,e.info(`[worktree] exited (kept): ${i.worktreeName}`);return{success:!0,previousCwd:i.originalCwd}}catch(i){return{success:!1,error:i instanceof Error?i.message:String(i)}}},async listWorktrees(){try{let{stdout:o,code:s}=await Ae(["worktree","list","--porcelain"]);if(s!==0)return{success:!0,worktrees:[]};let i=[],a=process.cwd(),c=o.split(`
|
|
509
509
|
|
|
@@ -540,36 +540,36 @@ describe: Show workflow steps and variables.`},workflow:{type:"string",descripti
|
|
|
540
540
|
`);for(let m=0;m<p.length;m++)if(n.test(p[m])&&(a.push({path:l,line:m+1,text:p[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 Zb=!1;function y0(){if(!Zb)if(Zb=!0,Tr()){let t=process.env.QLOGICAGENT_POWERSHELL_PATH??"powershell.exe";Fn(Sl(t))}else if(process.platform==="win32"){let t=b0();Fn(Cs(t))}else{let t=process.env.SHELL?.endsWith("bash")?process.env.SHELL:"/bin/bash";Fn(Cs(t))}}function b0(){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 v0(){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=k0(s)),{content:s,title:R0(s)}}finally{clearTimeout(r)}}}}function k0(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 R0(t){return t.match(/<title[^>]*>([^<]+)<\/title>/i)?.[1]?.trim()}function S0(){let t=async(e,r)=>{let{getModelRegistry:n}=await Promise.resolve().then(()=>(qe(),Cu)),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(),u=(d.results??[]).slice(0,s).map(p=>({title:p.title??"",url:p.url??"",snippet:p.content??""}));if(r?.allowedDomains?.length){let p=new Set(r.allowedDomains.map(m=>m.toLowerCase()));return{query:e,results:u.filter(m=>{try{return p.has(new URL(m.url).hostname.toLowerCase())}catch{return!1}})}}if(r?.blockedDomains?.length){let p=new Set(r.blockedDomains.map(m=>m.toLowerCase()));return{query:e,results:u.filter(m=>{try{return!p.has(new URL(m.url).hostname.toLowerCase())}catch{return!0}})}}return{query:e,results:u,totalResults:d.number_of_results}}finally{clearTimeout(c)}};return{search:(e,r)=>Xb(tv,t)(e,r)}}function T0(){function t(o){if(o==="default")return ne()?.workspaceDir??Ve;let s=Ee(o);if(!s)throw new Error(`Unknown project: ${o}`);return s.workspaceDir}function e(o){return Zt(t(o))}function r(o,s){if(!s.endsWith(".md"))throw new Error("Filename must end with .md");if(s.includes(".."))throw new Error("Path traversal not allowed");let i=e(o),a=U.resolve(i,s);if(!a.startsWith(i+U.sep)&&a!==i)throw new Error("Path traversal not allowed");return a}function n(o,s){if(!j.existsSync(o))return[];let i=[];for(let a of j.readdirSync(o,{withFileTypes:!0})){let c=U.join(o,a.name);if(a.isDirectory())i.push(...n(c,s));else if(a.isFile()&&a.name.endsWith(".md")){let l=j.statSync(c);i.push({filename:U.relative(s,c).replace(/\\/g,"/"),path:c,size:l.size,updatedAt:l.mtime.toISOString(),content:j.readFileSync(c,"utf-8")})}}return i}return{list(o){let s=e(o);return n(s,s).map(i=>({filename:i.filename,path:i.path,size:i.size,updatedAt:i.updatedAt}))},read(o,s){try{let i=r(o,s);if(!j.existsSync(i))return null;let a=j.statSync(i),c=j.readFileSync(i,"utf-8");return{filename:s,path:i,size:a.size,updatedAt:a.mtime.toISOString(),content:c}}catch{return null}},write(o,s,i){let a=r(o,s);j.mkdirSync(U.dirname(a),{recursive:!0}),j.writeFileSync(a,i,"utf-8");let c=j.statSync(a);return{filename:s,path:a,size:c.size,updatedAt:c.mtime.toISOString(),content:i}},remove(o,s){try{let i=r(o,s);return j.existsSync(i)?(j.unlinkSync(i),!0):!1}catch{return!1}}}}var A0={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 w0(t){for(let e of t)e.category??=A0[e.name]??"other",e.displayName??={key:`capability.tool.${e.name}.name`,fallback:e.label},e.displayDescription??={key:`capability.tool.${e.name}.description`,fallback:""}}function lv(t){t?.workdir&&(Ve=t.workdir),y0(),ws(Ve);let e=[];e.push(Ty()),e.push(wg(void 0,{onTaskCreated:u=>Fl?.onTaskCreated?.(u),onTaskCompleted:u=>Fl?.onTaskCompleted?.(u)})),e.push(qb({askUser:async u=>rv?.(u)??null})),e.push(Oy({onProgress:t?.onExecProgress,validateCommand:async u=>{let p=/(?:>>?|[12]>)\s*(?:"([^"]+)"|'([^']+)'|(\S+))/g,m;for(;(m=p.exec(u))!==null;){let f=m[1]||m[2]||m[3];if(f){let h=U.isAbsolute(f)?U.normalize(f):U.resolve(Ve,f);if(!Wn(h))return`Blocked: output redirection to path outside workspace: ${f}`}}let g=[/(?:^|[\s;|&(])(?:"(\/[^"]+)"|'(\/[^']+)'|(\/(?!dev\/null\b)[^\s;|&><)]+))/g,/(?:^|[\s;|&(])(?:"([A-Za-z]:[\\\/][^"]+)"|'([A-Za-z]:[\\\/][^']+)'|([A-Za-z]:[\\\/][^\s;|&><)]+))/g,/(?:^|[\s;|&(])(?:"([^"]*\.\.[\\/][^"]+)"|'([^']*\.\.[\\/][^']+)'|([^\s;|&><)"']*\.\.[\\/][^\s;|&><)]+))/g];for(let f of g){let h;for(;(h=f.exec(u))!==null;){let v=h[1]||h[2]||h[3];if(!v||/^\/[a-zA-Z](?:[- ]|$)/.test(v)||/^\/[a-zA-Z]{1,3}$/.test(v))continue;let b;if(process.platform==="win32"&&/^\/[a-zA-Z]\//.test(v)){let R=v.replace(/^\/([a-zA-Z])\//,(T,A)=>`${A.toUpperCase()}:\\`).replace(/\//g,"\\");b=U.normalize(R)}else b=U.isAbsolute(v)?U.normalize(v):U.resolve(Ve,v);if(!Wn(b))return`Blocked: command references path outside workspace: ${v}`}}return null},interpretExitCode:(u,p)=>{if(u===127)return"command not found";if(u===126)return"permission denied";if(u===137)return"killed (SIGKILL / OOM)";if(u===143)return"terminated (SIGTERM)";if(u===130)return"interrupted (Ctrl+C)"}}));let r=l0(),n=d0(),o=u0(),s=p0();e.push(Uy(r)),e.push(Hy(n)),e.push(By(o)),e.push(xl(s)),e.push(Ky(s)),e.push(Gy(m0())),e.push(tb(v0())),e.push(rb(S0()));let i=T0();e.push(nb(i));let a=t?.log??{info:()=>{},warn:()=>{}};e.push(ob(bb({log:a}))),e.push(Sb());let c={invokeTool:async(u,p,m)=>{let g=Ce(u);if(!g)return{result:"",error:`Unknown tool: ${u}`};try{let f=await g.execute(`wf_${Date.now()}`,p,m);return{result:f.content.map(v=>v.text??"").join(`
|
|
541
541
|
`),error:f.details?.error}}catch(f){return{result:"",error:f.message}}},getCwd:()=>Ve};e.push(wb(c)),e.push(Pb({sleep:(u,p)=>new Promise(m=>{let g=Date.now(),f=setTimeout(()=>{m({sleptSeconds:Math.round((Date.now()-g)/1e3),interrupted:!1})},u),h=()=>{clearTimeout(f),m({sleptSeconds:Math.round((Date.now()-g)/1e3),interrupted:!0,interruptReason:"aborted"})};p.addEventListener("abort",h,{once:!0}),p.aborted&&(clearTimeout(f),h())})}));let l={listProjects:()=>V(),switchProject:u=>St(u),onSwitched:u=>r0?.(u)};e.push(Wb(l)),e.push(Cb({searchTools:async(u,p)=>{let m=p?.maxResults??5,g=zt(),f=u.toLowerCase().split(/\s+/).filter(Boolean),h=[],v=[];for(let P of f)P.startsWith("+")&&P.length>1?h.push(P.slice(1)):v.push(P);let b=[...h,...v],R=P=>P.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/_/g," ").toLowerCase().split(/\s+/).filter(Boolean);return{matches:g.map(P=>{let I=Ce(P),E=R(P),L=(I?.description??"").toLowerCase(),ve=(I?.searchHint??"").toLowerCase();if(h.length>0){let Z=`${E.join(" ")} ${L} ${ve}`;if(!h.every(D=>Z.includes(D)))return null}let k=0;for(let Z of b){let ke=0;E.some(D=>D===Z)?ke=10:E.some(D=>D.includes(Z))?ke=5:P.toLowerCase().includes(Z)&&(ke=3),ve&&new RegExp(`\\b${Z}`,"i").test(ve)&&(ke+=4),new RegExp(`\\b${Z}`,"i").test(L)&&(ke+=2),k+=ke}return{name:P,description:I?.description??"",searchHint:I?.searchHint,score:k}}).filter(P=>P!==null&&P.score>0).sort((P,I)=>I.score-P.score).slice(0,m),query:u,totalDeferred:g.length}},activateTool:async u=>hp(u)})),e.push({...Ib({generateImage:async u=>{let p=await Ut({mediaType:"image",model:"",prompt:u.prompt,purpose:u.purpose,style:u.style,size:u.size,imageUrl:u.imageUrl,n:u.n,quality:u.quality,seed:u.seed});return{mediaUrls:p.mediaUrls,model:p.model,size:p.size,durationMs:p.durationMs}}}),isEnabled:()=>Ft("image")}),e.push({...Eb({textToSpeech:async u=>{let p=await Ut({mediaType:"tts",model:"",prompt:"",text:u.text,channel:u.channel,voice:u.voice,speed:u.speed});return{audioPath:"",provider:p.model,mediaUrls:p.mediaUrls}}}),isEnabled:()=>Ft("tts")}),e.push({..._b({generateVideo:async u=>{let p=await Ut({mediaType:"video",model:"",prompt:u.prompt,purpose:u.purpose,style:u.style,imageUrl:u.imageUrl,referenceVideos:u.referenceVideos,referenceAudios:u.referenceAudios,generateAudio:u.generateAudio,aspectRatio:u.aspectRatio,duration:u.duration,resolution:u.resolution,fps:u.fps,seed:u.seed,cameraFixed:u.cameraFixed,returnLastFrame:u.returnLastFrame,draft:u.draft,serviceTier:u.serviceTier,callbackUrl:u.callbackUrl,safetyIdentifier:u.safetyIdentifier,executionExpiresAfterSeconds:u.executionExpiresAfterSeconds,videoTools:u.videoTools});return{mediaUrls:p.mediaUrls,model:p.model,durationMs:p.durationMs,lastFrameUrl:p.lastFrameUrl,taskId:p.taskId}}}),isEnabled:()=>Ft("video")}),e.push({...Mb({generateMusic:async u=>{let p=await Ut({mediaType:"music",model:"",prompt:u.prompt,purpose:u.purpose,style:u.style,lyrics:u.lyrics,duration:u.duration,isInstrumental:u.isInstrumental,audioUrl:u.audioUrl,audioFormat:u.audioFormat});return{mediaUrls:p.mediaUrls,model:p.model,durationMs:p.durationMs}},generateLyrics:async u=>{let p=or.music;if(!p||!De)return"";let m=De.getTransport(p.provider);if(!$d(m))return"";let g=Qt(wr,p.provider);return g?m.generateLyrics(u,g):""}}),isEnabled:()=>Ft("music")}),e.push({...Db({editVideo:async u=>{let p=await Ut({mediaType:"video",model:"",prompt:u.prompt,operation:"edit",sourceVideos:u.sourceVideos,referenceImages:u.referenceImages,duration:u.duration,aspectRatio:u.aspectRatio,resolution:u.resolution});return{mediaUrls:p.mediaUrls,model:p.model,durationMs:p.durationMs}}}),shouldDefer:!0,isEnabled:()=>$l("video","edit")}),e.push({...Nb({mergeVideos:async u=>{let p=[`merge ${u.clips.length} clips`];u.transition&&p.push(`transition: ${u.transition}${u.transitionDuration?` (${u.transitionDuration}s)`:""}`),u.subtitles&&p.push(`burn-in subtitles: ${u.subtitles}`),u.bgm&&p.push(`background music: ${u.bgm}${u.bgmVolume!==void 0?` at volume ${u.bgmVolume}`:""}`);let m=await Ut({mediaType:"video",model:"",prompt:p.join("; "),operation:"merge",sourceVideos:u.clips.map(g=>g.video),resolution:u.outputResolution,fps:u.outputFps});return{localPath:"",servePath:m.mediaUrls[0]??"",durationSec:(m.durationMs??0)/1e3,clipCount:u.clips.length,mediaUrls:m.mediaUrls}}}),shouldDefer:!0,isEnabled:()=>$l("video","merge")}),e.push({...Lb({upscaleVideo:async u=>{let p=["upscale"];u.sharpness&&p.push(`sharpness: ${u.sharpness}`);let m=await Ut({mediaType:"video",model:"",prompt:p.join(", "),operation:"upscale",sourceVideos:[u.video],resolution:u.targetResolution??"1080p"});return{localPath:"",servePath:m.mediaUrls[0]??"",resolution:u.targetResolution??"1080p",durationSec:(m.durationMs??0)/1e3,mediaUrls:m.mediaUrls}}}),shouldDefer:!0,isEnabled:()=>$l("video","upscale")}),e.push({...Ob({generate3D:async u=>{let p=await Ut({mediaType:"3d",model:"",prompt:u.prompt,imageUrl:u.imageUrl,outputFormat:u.outputFormat,seed:u.seed});return{mediaUrls:p.mediaUrls,model:p.model,durationMs:p.durationMs,metadata:p.metadata}}}),shouldDefer:!0,isEnabled:()=>Ft("3d")}),e.push({...jb({speechToText:async u=>{let p=await Ut({mediaType:"stt",model:"",prompt:"",audioUrl:u.audioUrl,metadata:u.language?{language:u.language}:void 0});return{transcription:p.metadata?.transcription??"",model:p.model,durationMs:p.durationMs}}}),shouldDefer:!0,isEnabled:()=>Ft("stt")}),e.push({...$b({cloneVoice:async u=>{let p=await Ut({mediaType:"voice_clone",model:"",prompt:"",text:u.text,audioUrl:u.sampleAudioUrl,speed:u.speed});return{mediaUrls:p.mediaUrls,model:p.model,voiceId:p.metadata?.voiceId,durationMs:p.durationMs}}}),shouldDefer:!0,isEnabled:()=>Ft("voice_clone")}),e.push({...Ub({cancelTask:async u=>{let p=u.provider??"doubao";if(!De)return{ok:!1,message:"Media client not configured."};let m=De.getTransport(p);if(!m)return{ok:!1,message:`No transport for provider: ${p}`};let g=Qt(wr,p);if(!g)return{ok:!1,message:`No API key for provider: ${p}`};try{return"deleteVideoTask"in m&&typeof m.deleteVideoTask=="function"?(await m.deleteVideoTask(u.taskId,g),{ok:!0,message:"Task cancelled."}):{ok:!1,message:`Provider ${p} does not support task cancellation.`}}catch(f){return{ok:!1,message:f instanceof Error?f.message:String(f)}}}}),shouldDefer:!0,isEnabled:()=>Ft("video")||Ft("3d")});let d=zb({getContext:()=>({mediaClient:De,mediaProviders:or,mediaApiKeys:wr}),resolvePath:Ne});return e.push({...Fb(d),shouldDefer:!0,isEnabled:()=>d.isAvailable()}),e.push({...Hb(d),shouldDefer:!0,isEnabled:()=>d.isAvailable()}),e.push({...Bb(d),shouldDefer:!0,isEnabled:()=>d.isAvailable()}),w0(e),fp(e),t?.log?.info(`[tool-bootstrap] Registered ${e.length} local tools (${e.filter(u=>u.isEnabled?.()!==!1).length} enabled): ${zt().join(", ")}`),e}var Zr=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)}applyUpdate(e){let r={pattern:e.pattern,behavior:e.behavior,reason:e.description,source:"user"};this.rules=[r,...this.rules.filter(n=>!E0(n.pattern,e.pattern))],this.compiledPatterns=this.compileRules(this.rules)}check(e){let{toolName:r,meta:n}=e;switch(this.mode){case"bypassPermissions":return{behavior:"allow",decisionReason:{type:"mode",mode:"bypassPermissions"}};case"dontAsk":return n?.isReadOnly?{behavior:"allow",decisionReason:{type:"mode",mode:"dontAsk"}}:{behavior:"deny",message:`Tool "${r}" denied \u2014 mode is dontAsk`,decisionReason:{type:"mode",mode:"dontAsk"}};case"plan":return{behavior:"deny",message:`Tool "${r}" paused \u2014 mode is plan (execution suspended)`,decisionReason:{type:"mode",mode:"plan"}}}for(let{rule:o,regex:s}of this.compiledPatterns)if(s.test(r))return x0(o,e);return n?.isReadOnly?{behavior:"allow",decisionReason:{type:"tool_check",reason:"isReadOnly"}}:n?.requiresApproval?{behavior:"ask",message:`Tool "${r}" requires approval`,toolName:r,input:e.arguments,decisionReason:{type:"tool_check",reason:"requiresApproval"}}:n?.isDangerous?{behavior:"ask",message:`Tool "${r}" is marked dangerous`,toolName:r,input:e.arguments,decisionReason:{type:"tool_check",reason:"isDangerous"}}:this.mode==="acceptEdits"?{behavior:"allow",decisionReason:{type:"mode",mode:"acceptEdits"}}: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:P0(r.pattern)}))}};function Pr(t){if(!t||typeof t!="object")return{mode:"default",rules:[],defaultBehavior:"allow"};let e=t,r=[];for(let a of["allow","deny","ask"]){let c=e[a];if(Array.isArray(c))for(let l of c)typeof l=="string"&&r.push({pattern:l,behavior:a,source:"config"})}if(Array.isArray(e.rules)){for(let a of e.rules)if(a&&typeof a=="object"){let c=a,l=c.pattern,d=c.behavior??c.action;typeof l=="string"&&typeof d=="string"&&(d==="allow"||d==="deny"||d==="ask")&&r.push({pattern:l,behavior:d,reason:typeof c.reason=="string"?c.reason:void 0,source:typeof c.source=="string"?c.source:"config"})}}let n=e.mode,o=typeof n=="string"&&C0(n)?n:"default",s=e.default??e.defaultBehavior,i=typeof s=="string"&&I0(s)?s:"allow";return{mode:o,rules:r,defaultBehavior:i}}function P0(t){let r=t.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*+/g,".*");return new RegExp(`^${r}$`,"i")}function x0(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 C0(t){return t==="default"||t==="bypassPermissions"||t==="acceptEdits"||t==="dontAsk"||t==="plan"||t==="auto"}function I0(t){return t==="allow"||t==="deny"||t==="ask"}function E0(t,e){return t.toLocaleLowerCase()===e.toLocaleLowerCase()}function dv(t,e){let r=Pr(e);return t.setMode(r.mode),t.replaceRules(r.rules),t.setDefaultBehavior(r.defaultBehavior),r}import{randomUUID as _0}from"node:crypto";function uv(t){ov(async e=>{let r=`ask-${_0().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 Ms(t,e){return{name:t,compute:e,cacheBreak:!1}}function Yt(t,e,r){return{name:t,compute:e,cacheBreak:!0}}var _s=new Map;async function M0(t){return(await Promise.all(t.map(async r=>{if(!r.cacheBreak&&_s.has(r.name))return _s.get(r.name)??null;let n=await r.compute();return _s.set(r.name,n),n}))).filter(r=>r!=null)}function pv(){_s.clear()}async function Ds(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 M0(t.sections);e.push(...r)}return t.appendSystemPrompt&&e.push(t.appendSystemPrompt),e.filter(Boolean).join(`
|
|
542
542
|
|
|
543
|
-
`)}var D0=250;async function mv(t,e){let r=new AbortController;t.activeTurn&&(t.activeTurn.abort(),await N0(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(()=>{}),pv()),t.currentSessionId=e,t.sessionState=new tr(e),t.sessionTaskDomain=void 0,t.memoryPrefetchState=gt(),t.enableIdleDream()),{abortController:r,resolveTurnDone:n}}async function N0(t){let e;try{await Promise.race([t,new Promise(r=>{e=setTimeout(r,D0),e.unref?.()})])}finally{e&&clearTimeout(e)}}function Vl(t,e){t.activeTurn===e.abortController&&(t.activeTurn=null),e.resolveTurnDone()}qe();function gv(t){let{host:e,config:r,turnId:n}=t,o=M(),s=o.snapshotProviderKeys();e.currentMediaApiKeys=s
|
|
543
|
+
`)}var D0=250;async function mv(t,e){let r=new AbortController;t.activeTurn&&(t.activeTurn.abort(),await N0(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(()=>{}),pv()),t.currentSessionId=e,t.sessionState=new tr(e),t.sessionTaskDomain=void 0,t.memoryPrefetchState=gt(),t.enableIdleDream()),{abortController:r,resolveTurnDone:n}}async function N0(t){let e;try{await Promise.race([t,new Promise(r=>{e=setTimeout(r,D0),e.unref?.()})])}finally{e&&clearTimeout(e)}}function Vl(t,e){t.activeTurn===e.abortController&&(t.activeTurn=null),e.resolveTurnDone()}qe();var L0=[{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 O0(t){let e={};for(let{purpose:r,capability:n}of L0){let o=t.getBinding(r);o&&(e[n]={provider:o.provider,model:o.nativeModelId??o.model})}return e}function gv(t){let{host:e,config:r,turnId:n}=t,o=M(),s=o.snapshotProviderKeys();e.currentMediaApiKeys=s;let i={...O0(o),...r?.mediaProviders};sv(e.mediaClient,s,(c,l,d)=>{e.sessionState?.addMediaUsage(c,l,d)},i,(c,l,d,u,p)=>{e.sendNotification("turn.media_progress",{turnId:n,taskId:c,mediaType:l,percent:d,status:u,...p?{provider:p}:{}})});let a=o.getActiveModel("textGeneration");a?(Gl(Od(a.provider,a.apiKey)),a.keyHandle.release({success:!0})):Gl(void 0)}import*as Gn from"node:path";N();var j0=1800*1e3,hv=new Yr;function yv(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=hv.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"&&$0(e,r);let o=U0(e,r,t.nowMs??Date.now()),s=F0(e,r);return{sessionProjectRoot:s,sessionProjectId:H0(e,s,n),projectHintStale:o.projectHintStale,staleProjectHintContext:o.staleProjectHintContext}}function $0(t,e){let r=t.groupKey,n=r.split(":"),o=n.length>=3?n.slice(1).join(":"):r,s=Yo(o);if(s){e.setActiveWorkdir(s.workspaceDir),ne()?.id!==s.id&&St(s.id);return}let i=t.groupName||o,a=o.replace(/[<>:"/\\|?*\x00-\x1f]/g,"_").trim()||"group",c=Gn.join(B(),"workspaces","groups",a),l=Xo({name:i,workspaceDir:c,type:"group",groupId:o});e.setActiveWorkdir(l.workspaceDir),St(l.id),e.sendNotification("project.created",{id:l.id,name:l.name,type:"group",groupId:o,workspaceDir:l.workspaceDir})}function U0(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>j0)return e.log(`[projectHint] stale (${Math.round(s/6e4)}min old), skipping auto-switch`),{projectHintStale:!0,staleProjectHintContext:{activeProjectName:ne()?.name,projectNames:V().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=V(),l=i.toLowerCase(),d=c.find(u=>u.name.toLowerCase()===l)??c.find(u=>u.name.toLowerCase().includes(l));d&&d.status==="active"&&(St(d.id),e.setActiveWorkdir(d.workspaceDir))}return{projectHintStale:!1}}function F0(t,e){if(typeof t?.workdir=="string"&&t.workdir)return t.workdir;let r=t?.projectId;if(r)try{return hv.getProjectWorkspaceDir(r)}catch{}return e.getActiveProjectRoot()}function H0(t,e,r){if(r){let i=Wt(r,e);if(i?.projectId)return i.projectId}let n=t?.projectId;if(n&&Ee(n))return n;let o=ne();return o&&fv(o.workspaceDir,e)?o.id:V().find(i=>fv(i.workspaceDir,e))?.id}function fv(t,e){return Gn.resolve(t).toLowerCase()===Gn.resolve(e).toLowerCase()}import{randomUUID as bv}from"node:crypto";function Ns(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-${bv().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-${bv().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 B0=`[SUGGESTION MODE]
|
|
544
544
|
Based on the conversation, suggest 1-3 short follow-up actions the user might naturally do next.
|
|
545
545
|
Be specific: "run the tests" beats "continue".
|
|
546
546
|
Stay silent if the next step isn't obvious.
|
|
547
|
-
Reply with ONLY a JSON array: [{"text":"short suggestion"}]. No explanation.`;async function vv({turnId:t,messages:e,client:r,sendNotification:n}){if(e.filter(i=>i.role==="assistant").length<1||!r)return;let s=[...e.slice(-6),{role:"user",content:
|
|
547
|
+
Reply with ONLY a JSON array: [{"text":"short suggestion"}]. No explanation.`;async function vv({turnId:t,messages:e,client:r,sendNotification:n}){if(e.filter(i=>i.role==="assistant").length<1||!r)return;let s=[...e.slice(-6),{role:"user",content:B0}];try{let i="";for await(let d of r.transport.stream({model:r.model,messages:s,temperature:.3,maxTokens:200},r.apiKey))d.type==="delta"&&(i+=d.text);let a=i.match(/\[[\s\S]*\]/);if(!a)return;let c=JSON.parse(a[0]),l=Array.isArray(c)?c.filter(d=>typeof d.text=="string"&&d.text.length>0).slice(0,5):[];l.length>0&&n("turn.suggestions",{turnId:t,items:l})}catch{}}N();import{existsSync as kv,mkdirSync as q0,readFileSync as Kn,writeFileSync as Rv}from"node:fs";import{join as zn}from"node:path";var Ls=new Set(["coding","office","creative","general"]),Sv="settings.yaml";function W0(t){try{let e=zn(t,Oe,Sv),n=Kn(e,"utf-8").match(/^taskDomain\s*:\s*(\w+)/m);if(n){let o=n[1].toLowerCase();if(Ls.has(o))return o}}catch{}try{let e=zn(t,Oe,"INSTRUCTIONS.md"),n=Kn(e,"utf-8").match(/^---\r?\n[\s\S]*?\r?\n---/);if(n){let o=n[0].match(/^domain\s*:\s*(\w+)/m);if(o){let s=o[1].toLowerCase();if(Ls.has(s))return s}}}catch{}try{let e=zn(t,"INSTRUCTIONS.md"),n=Kn(e,"utf-8").match(/^---\r?\n[\s\S]*?\r?\n---/);if(n){let o=n[0].match(/^domain\s*:\s*(\w+)/m);if(o){let s=o[1].toLowerCase();if(Ls.has(s))return s}}}catch{}}var G0=3;function K0(t,e){let r=Y0(t);return e?r===e||r==="general"?e:(Yl(t)[r]??0)>=G0?r:e:r}var z0=/\b(?:code|coding|bug|debug|fix|refactor|function|class|method|api|compile|build|deploy|test|unittest|lint|git|commit|merge|branch|pull\s*request|PR|npm|pnpm|yarn|pip|docker|k8s|kubernetes|sql|database|migration|endpoint|route|middleware|typescript|javascript|python|java|rust|go(?:lang)?|css|html|react|vue|angular|nextjs|express|fastapi|flask|django|springboot|webpack|vite|rollup|esbuild|CI\/?CD|GitHub\s*Actions|workflow|pipeline|variable|const|let|var|import|export|module|package|dependency|dependencies|node_modules|tsconfig|eslint|prettier|interface|type\b|enum|struct|async|await|promise|callback|exception|error\s*handling|stack\s*trace|breakpoint|源码|代码|编程|编码|调试|重构|修复|Bug|函数|类|方法|接口|模块|依赖|组件|编译|构建|部署|测试|单元测试|提交|合并|分支|数据库|迁移|路由|中间件)\b/i,V0=/\b(?:report|document|spreadsheet|excel|csv|table|chart|graph|data\s*analysis|statistics|slides?|presentation|ppt|powerpoint|email|mail|memo|minutes|meeting|schedule|calendar|summary|summarize|brief|overview|outline|template|format|agenda|invoice|budget|forecast|dashboard|KPI|OKR|metric|analytics|insight|文档|报告|报表|表格|数据分析|统计|幻灯片|PPT|演示|邮件|信件|备忘录|会议纪要|日程|摘要|总结|概要|简报|模板|格式|议程|发票|预算|预测|看板|报表|分析)\b/i,X0=/\b(?:write|writing|essay|article|blog|story|novel|poem|poetry|lyrics|copywriting|copy|slogan|tagline|headline|marketing|campaign|branding|creative|brainstorm|idea|concept|draft|narrative|character|dialogue|script|screenplay|pitch|proposal|content\s*strategy|social\s*media|SEO|newsletter|press\s*release|写作|文章|博客|故事|小说|诗|歌词|文案|标语|营销|策划|品牌|创意|头脑风暴|灵感|构思|草稿|叙事|角色|对话|剧本|策划案|提案|内容策略|自媒体|公众号|推文|软文|种草)\b/i;function Y0(t){if(!t||t.trim().length===0)return"general";let e=Yl(t),r=Math.max(e.coding,e.office,e.creative);return r===0||[e.coding,e.office,e.creative].filter(o=>o>=r-1&&o>0).length>=2&&r<=2?"general":e.coding===r?"coding":e.office===r?"office":e.creative===r?"creative":"general"}function Yl(t){return{coding:Xl(t,z0),office:Xl(t,V0),creative:Xl(t,X0),general:0}}function Xl(t,e){let r=new RegExp(e.source,"gi"),n=t.match(r);return n?n.length:0}function Tv(t){let e=W0(t.cwd);if(e)return{domain:e,source:"project-file"};if(t.hostOverride&&Ls.has(t.hostOverride))return{domain:t.hostOverride,source:"host-override"};let r=K0(t.userText,t.sessionDomain);return t.sessionDomain&&r===t.sessionDomain?{domain:r,source:"session-sticky"}:{domain:r,source:"auto-detect"}}var J0=3;function Av(t,e){if(e==="general")return!1;try{let r=zn(t,Oe),n=zn(r,Sv);if(kv(n)){let s=Kn(n,"utf-8");if(/^taskDomain\s*:/m.test(s))return!1}q0(r,{recursive:!0});let o=`# Auto-detected task domain for this workspace.
|
|
548
548
|
# Values: coding | office | creative | general
|
|
549
549
|
`;if(kv(n)){let s=Kn(n,"utf-8");Rv(n,s.trimEnd()+`
|
|
550
550
|
|
|
551
551
|
`+o+`taskDomain: ${e}
|
|
552
552
|
`,"utf-8")}else Rv(n,o+`taskDomain: ${e}
|
|
553
|
-
`,"utf-8");return!0}catch{return!1}}function wv(t,e){return e==="general"?!1:(Yl(t)[e]??0)>=
|
|
554
|
-
`)})}function Os(){return["## Problem Solving","- If an approach fails, diagnose why before switching tactics \u2014 read the error, check your assumptions, try a focused fix. Don't retry the identical action blindly, but don't abandon a viable approach after a single failure either.","- Report outcomes faithfully: if verification fails, say so with the relevant output; if you did not run a verification step, say that rather than implying it succeeded.","- Do not create files unless they are absolutely necessary for achieving your goal. Prefer editing an existing file to creating a new one.","","## Safety","- Be careful not to introduce security vulnerabilities such as command injection, XSS, SQL injection, and other OWASP top 10 vulnerabilities.","- If you notice that you wrote insecure code, immediately fix it. Prioritize writing safe, secure, and correct code."]}function
|
|
553
|
+
`,"utf-8");return!0}catch{return!1}}function wv(t,e){return e==="general"?!1:(Yl(t)[e]??0)>=J0}import{release as Q0,homedir as Z0}from"node:os";import{resolve as Pv}from"node:path";function eD(){let e=(process.env.SHELL??process.env.ComSpec??"").toLowerCase();return e.includes("zsh")?"zsh":e.includes("bash")?"bash":e.includes("fish")?"fish":e.includes("powershell")||e.includes("pwsh")?"powershell":e.includes("cmd")?"cmd":process.platform==="win32"?"powershell":"bash"}function tD(){let t=process.platform,e=Q0();return t==="win32"?e.toLowerCase().includes("microsoft")||e.toLowerCase().includes("wsl")?"Windows (WSL)":`Windows ${e.split(".")[0]??""}`.trim():t==="darwin"?"macOS":t==="linux"?"Linux":t}function js(t){let e=Pv(t??process.cwd());return Ms(`environment_context:${e}`,()=>{let r=eD(),n=tD(),o=process.version,s=Z0(),i=["# Environment","",`- Platform: ${n}`,`- Shell: ${r}`,`- Working directory: ${Pv(e)}`,`- Home directory: ${s}`,`- Node.js: ${o}`];return r==="powershell"?i.push("- Note: Use PowerShell syntax (semicolons, not &&; use $env: for env vars)"):r==="cmd"&&i.push("- Note: Use CMD syntax (%VAR%, not $VAR)"),i.join(`
|
|
554
|
+
`)})}function Os(){return["## Problem Solving","- If an approach fails, diagnose why before switching tactics \u2014 read the error, check your assumptions, try a focused fix. Don't retry the identical action blindly, but don't abandon a viable approach after a single failure either.","- Report outcomes faithfully: if verification fails, say so with the relevant output; if you did not run a verification step, say that rather than implying it succeeded.","- Do not create files unless they are absolutely necessary for achieving your goal. Prefer editing an existing file to creating a new one.","","## Safety","- Be careful not to introduce security vulnerabilities such as command injection, XSS, SQL injection, and other OWASP top 10 vulnerabilities.","- If you notice that you wrote insecure code, immediately fix it. Prioritize writing safe, secure, and correct code."]}function rD(){return["# Doing Tasks","","You will primarily perform software engineering tasks: solving bugs, adding new functionality, refactoring code, and more.","","## Code Quality","- In general, do not propose changes to code you haven't read. If you need to modify a file, read it first. Understand existing code before suggesting modifications.","","## Implementation Discipline",`- Don't add features, refactor code, or make "improvements" beyond what was asked. A bug fix doesn't need surrounding code cleaned up. A simple feature doesn't need extra configurability.`,"- Don't add error handling, fallbacks, or validation for scenarios that can't happen. Trust internal code and framework guarantees. Only validate at system boundaries (user input, external APIs).","- Don't create helpers, utilities, or abstractions for one-time operations. Don't design for hypothetical future requirements. Three similar lines of code is better than a premature abstraction.","- Default to writing no comments unless the WHY is non-obvious: a hidden constraint, a subtle invariant, a workaround for a specific bug. Don't explain WHAT the code does \u2014 well-named identifiers already do that.",'- Avoid backwards-compatibility hacks like renaming unused _vars, re-exporting types, adding "// removed" comments for removed code. If code is unused, delete it completely.',"","## Completeness and Correctness","- When a task lists multiple constraints or requirements, implement ALL of them explicitly. Do not drop any.","- When refactoring, commit fully to the new pattern. Do NOT mix old and new patterns in the same codebase.","- After making changes, verify you met every requirement from the original request.","- For security fixes, use standard proven patterns (parameterized queries, input validation, etc.).","- NEVER leave TODO comments, placeholder implementations, or stub functions. Every function you write must have a complete, working implementation.","- When creating multiple files that import from each other, ensure every import resolves to a real export. Do not leave dead imports or forward declarations without implementations.","- If you create a file with a function signature, you MUST provide the full body \u2014 not `// implement later` or `throw new Error('not implemented')`.","","## Proactive Action","- When asked to fix, change, or improve code, implement the changes directly by writing to the file. Do not merely describe what should be changed.","- When you identify issues (bugs, security vulnerabilities, style problems), fix them immediately using your tools rather than listing recommendations.","- Default to action: read the file, make the fix, write it back. Only describe without acting when explicitly asked for advice or review only.","","## Faithful Reporting","- Report outcomes faithfully: if a tool call failed, say so with the error output. Do not claim success when a tool returned an error.","- If you did not run a verification step, say that rather than implying it succeeded.","- Never claim 'all tests pass' or 'file created successfully' when tool output shows otherwise.","- If you are unsure whether your changes are complete, state that explicitly rather than asserting completeness."]}function nD(){return["# Doing Tasks","","You will assist with office and analytical tasks: reports, data analysis, documents, presentations, and more.","","## Accuracy and Rigor","- Verify numerical calculations and statistical claims. When presenting data, ensure totals, percentages, and comparisons are mathematically correct.","- Distinguish clearly between facts, inferences, and assumptions. Label uncertain information explicitly.","- When summarizing source material, preserve the original meaning. Do not introduce information not present in the source.","","## Structure and Formatting","- Use clear headings, bullet points, and tables to organize information. Match the formatting conventions of the document type (report, memo, email, slides).","- For data-heavy outputs, prefer tables over prose. Include units, time periods, and comparison baselines.","- Keep language professional and concise. Avoid filler, hedging, and unnecessary qualifiers.","","## Completeness","- When the task lists multiple sections, data points, or requirements, address ALL of them. Do not silently omit items.","- If source data is insufficient to answer a question, state what is missing rather than guessing."]}function oD(){return["# Doing Tasks","","You will assist with creative and content tasks: writing, copywriting, brainstorming, and content strategy.","","## Voice and Style","- Match the requested tone, register, and style. If no style is specified, adapt to the content type (formal for press releases, conversational for blog posts, punchy for ad copy).","- Vary sentence length and structure for rhythm. Avoid monotonous patterns.","- Show, don't tell where appropriate. Use concrete details and vivid language over abstract statements.","","## Audience Awareness","- Write for the intended audience. Consider their knowledge level, interests, and expectations.","- For marketing/copywriting, lead with the benefit. Focus on what matters to the reader, not the feature list.","- Respect cultural context and sensitivity in language choices.","","## Creative Process","- When brainstorming, provide diverse options rather than variations on a single idea. Quantity and variety first, then refine.","- When editing existing text, preserve the author's voice. Make targeted improvements rather than rewriting from scratch.","- If creative constraints are given (word count, format, platform), follow them precisely."]}function xv(t="general"){return Yt("task_guidance",()=>{let e;switch(t){case"coding":e=[...rD(),"",...Os()];break;case"office":e=[...nD(),"",...Os()];break;case"creative":e=[...oD(),"",...Os()];break;default:e=["# Doing Tasks","","You are a versatile assistant that handles software engineering, office, and creative tasks.","",...Os(),"","## When Coding","- Read existing code before modifying it. Understand the structure before making changes.","- When refactoring, commit fully to the new pattern. Do NOT mix old and new patterns.","- Implement ALL listed constraints or requirements explicitly. Do not drop any.","- Don't add features or abstractions beyond what was asked.","- When asked to fix or change code, implement changes directly by writing to the file \u2014 do not merely describe what to change.","","## When Writing Documents or Analyzing Data","- Verify numerical calculations and statistical claims for correctness.","- Use clear structure: headings, tables, bullet points as appropriate.","- Distinguish facts from inferences. Label uncertain information.","","## When Creating Content","- Match the requested tone, style, and audience. Adapt if not specified.","- Lead with the benefit for marketing/copywriting tasks.","- Provide diverse options when brainstorming."];break}return e.join(`
|
|
555
555
|
`)})}function $s(){return Ms("tool_guidance",()=>["# Tool Usage Guidance","","You have access to specialized tools. Use them appropriately:","","## Agent Delegation","Use the `agent` tool to delegate complex, multi-step tasks to sub-agents:","- Research/exploration tasks that benefit from focused attention","- File analysis across multiple files that need independent reasoning","- Any task the user explicitly asks you to delegate","- **When the user says 'delegate', 'sub-agent', 'fork', or 'hand off', you MUST use the `agent` tool \u2014 never handle it yourself**","Do NOT use `agent` for simple file reads or single-step operations.","","## Skill System","Use the `skill` tool (unified meta-tool) for all skill operations:","- action 'invoke' \u2014 run a skill by name","- action 'list' \u2014 discover available skills (shows scope: project/global)","- action 'create' \u2014 save a new skill to current project","- action 'promote' \u2014 copy a project skill to global (user-level)","When recalled memories show '[Cross-project skill available]', proactively offer to use or save the skill.","","## Checkpoint","Use the `checkpoint` tool (not raw git commands) to:","- Save workspace state before making changes","- Restore to a previous state if changes go wrong","The checkpoint tool manages git shadow history automatically.","","## Ask User","Use `ask_user` to clarify ambiguous requests before proceeding,","especially for expensive operations like media generation.","","## Project Rules Management","You can create, edit, and delete project rule files at `.qlogicagent/rules/*.md`.","These files are loaded into your system prompt every turn \u2014 changes take effect immediately.","Use this to help users establish coding conventions, workflow guidelines, or project-specific instructions.","When the user asks to 'add a rule', 'set up conventions', or 'configure instructions', write to `.qlogicagent/rules/<descriptive-name>.md`.","You may also create or edit `.qlogicagent/INSTRUCTIONS.md` for a single top-level instruction file."].join(`
|
|
556
556
|
`))}function Us(t){return Ms("language",()=>t?["# Language","",`Always respond in ${t}.`,`Use ${t} for all text output, explanations, and descriptions.`,"Use English only for: code, file paths, tool arguments, variable names, and technical identifiers."].join(`
|
|
557
557
|
`):["# Language","","Respond in the same language as the user's message.","If the user writes in English, respond in English. If in Chinese, respond in Chinese.","Use English only for: code, file paths, tool arguments, variable names, and technical identifiers."].join(`
|
|
558
|
-
`))}var Cv={requiresFreshTool:!1,allowedToolNames:[]},
|
|
558
|
+
`))}var Cv={requiresFreshTool:!1,allowedToolNames:[]},sD=["txt","json","jsonl","ts","tsx","js","jsx","mjs","cjs","md","mdx","yaml","yml","toml","ini","xml","csv","tsv","env","py","go","rs","java","kt","kts","cs","cpp","c","h","hpp","html","css","scss","sass","less","sql","lock","log","sh","ps1","bat","cmd"],Jl=new RegExp(`(?:^|[\\s"'\`([{:,])(?:\\.?[\\w@~.-]+[\\\\/])*[\\w@~.-]+\\.(?:${sD.join("|")})\\b`,"i"),iD=/write|create|edit|replace|change|update|modify|overwrite|fix|implement|\u5199|\u65b0\u5efa|\u521b\u5efa|\u7f16\u8f91|\u66ff\u6362|\u6539\u6210|\u4fee\u6539|\u4fee\u590d|\u5b9e\u73b0|\u8986\u76d6/i,aD=/(?:memory|\u8bb0\u5fc6).*(?:create_file|\u8bb0\u5fc6\u6587\u4ef6|\u6587\u4ef6)|(?:create_file).*(?:memory|\u8bb0\u5fc6)/i,cD=/(?:memory|\u8bb0\u5fc6).*(?:(?:add|replace|remove|create_file|write_file|read_file|delete_file|list_files|search|remember|temporal|feedback)\s+action\b|action\s*[:=]?\s*['"]?(?:add|replace|remove|create_file|write_file|read_file|delete_file|list_files|search|remember|temporal|feedback)\b|\u5220\u9664|\u79fb\u9664|\u66ff\u6362|\u521b\u5efa|\u8bfb\u53d6|\u641c\u7d22)|(?:(?:add|replace|remove|create_file|write_file|read_file|delete_file|list_files|search|remember|temporal|feedback)\s+action\b|action\s*[:=]?\s*['"]?(?:add|replace|remove|create_file|write_file|read_file|delete_file|list_files|search|remember|temporal|feedback)\b).*(?:memory|\u8bb0\u5fc6)/i,lD=/(?:current\s+directory|directory\s+(?:contains|listing|files)|list\s+(?:the\s+)?files|what\s+files|\u5f53\u524d\u76ee\u5f55|\u76ee\u5f55\u4e0b|\u54ea\u4e9b\u6587\u4ef6|\u5217\u51fa.*\u6587\u4ef6)/i,dD=/(?:which\s+file.*contains|contains.*which\s+file|\u54ea(?:\u4e2a|\u4e9b|\u4e00\u4e2a)?\u6587\u4ef6.*\u5305\u542b|\u5305\u542b.*\u54ea(?:\u4e2a|\u4e9b|\u4e00\u4e2a)?\u6587\u4ef6)/i,uD=/(?:^|\s)(?:run|execute)\s+(?:this\s+)?(?:command|shell)?\b|\b(?:echo|pwd|ls|dir|cat|type)\b|\u6267\u884c|\u8fd0\u884c/i,pD=/https?:\/\/\S+/i,mD=/fetch|open|visit|url|return|response|httpbin|\u8bbf\u95ee|\u7f51\u9875|\u8fd4\u56de|\u770b\u4e0b|\u770b\u770b/i;function Fs(t){let e=typeof t=="string"?t:gD(t);return e.trim()?pD.test(e)&&mD.test(e)?{requiresFreshTool:!0,reason:"web",allowedToolNames:["web_fetch"]}:aD.test(e)&&Jl.test(e)||cD.test(e)?{requiresFreshTool:!0,reason:"memory-mutation",allowedToolNames:["memory"]}:iD.test(e)&&Jl.test(e)?{requiresFreshTool:!0,reason:"file-mutation",allowedToolNames:["read","search","write","edit","patch","apply_patch"]}:Jl.test(e)?{requiresFreshTool:!0,reason:"file-read",allowedToolNames:["read","search"]}:lD.test(e)?{requiresFreshTool:!0,reason:"directory-list",allowedToolNames:["exec"]}:dD.test(e)?{requiresFreshTool:!0,reason:"content-search",allowedToolNames:["search"]}:uD.test(e)?{requiresFreshTool:!0,reason:"shell",allowedToolNames:["exec"]}:Cv:Cv}function Hs(t,e){if(!e.requiresFreshTool||e.allowedToolNames.length===0)return[...t];let r=new Set(e.allowedToolNames),n=t.filter(o=>r.has(hD(o)));return n.length>0?n:[...t]}function Bs(t){if(!t.requiresFreshTool)return null;let e=t.allowedToolNames.join(", ");return t.reason==="file-mutation"?Yt("fresh_workspace_evidence",()=>["# Workspace File Action Required","","The latest user request asks you to create, edit, fix, or implement files in the workspace.",`Before answering, call the appropriate tool for this turn: ${e}.`,"Use write/edit/patch/apply_patch to make the requested on-disk change. Reading or searching can locate context, but does not satisfy the requested action.","Do not merely describe code, print snippets, or claim completion without a successful file-changing tool result.","If a file-changing tool fails, make at most two focused attempts, then report the exact failure."].join(`
|
|
559
559
|
`)):t.reason==="memory-mutation"?Yt("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(`
|
|
560
560
|
`)):Yt("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(`
|
|
561
|
-
`))}function
|
|
561
|
+
`))}function gD(t){for(let e=t.length-1;e>=0;e--){let r=t[e];if(r?.role==="user")return fD(r.content)}return""}function fD(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 hD(t){return t.function?.name??t.name??""}N();import{readFile as yD,readdir as bD,stat as vD}from"node:fs/promises";import{dirname as Ws,extname as kD,isAbsolute as RD,join as Xn,parse as Ev,resolve as Iv}from"node:path";import{homedir as SD}from"node:os";var TD="INSTRUCTIONS.md",AD="INSTRUCTIONS.local.md",wD=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 PD(t){try{return await yD(t,"utf-8")}catch{return null}}function xD(t){return t.includes("<!--")?t.replace(/^[ \t]*<!--[\s\S]*?-->[ \t]*$/gm,""):t}function CD(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 ID(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=Xn(SD(),a.slice(2));else if(RD(a))l=a;else if(a.startsWith("./"))l=Iv(Ws(e),a);else if(/^[a-zA-Z0-9._-]/.test(a)&&!a.startsWith("@"))l=Iv(Ws(e),a);else continue;r.add(l)}return[...r]}async function Vn(t,e,r,n=0,o){let s=t.toLowerCase();if(r.has(s)||n>=ta)return[];let i=kD(t).toLowerCase();if(i&&!wD.has(i))return[];r.add(s);let a=await PD(t);if(!a?.trim())return[];let{content:c,globs:l}=CD(a),d=xD(c);if(!d.trim())return[];let u=[],p={path:t,type:e,content:d.trim()};o&&(p.parent=o),l&&(p.globs=l),u.push(p);let m=ID(c,t);for(let g of m){let f=await Vn(g,e,r,n+1,t);u.push(...f)}return u}async function _v(t,e,r,n,o=new Set){if(o.has(t))return[];o.add(t);let s=[];try{let i=await bD(t,{withFileTypes:!0});for(let a of i){let c=Xn(t,a.name);if(a.isDirectory())s.push(...await _v(c,e,r,n,o));else if(a.isFile()&&a.name.endsWith(".md")){let l=await Vn(c,e,r);s.push(...l.filter(d=>n?!!d.globs:!d.globs))}}}catch{}return s}async function ED(t){let e=t,r=Ev(e).root;for(;e!==r;){try{let n=Xn(e,".git"),o=await vD(n);if(o.isDirectory()||o.isFile())return e}catch{}e=Ws(e)}return null}async function _D(t,e){let r=[],n=new Set,s=await ED(t)??Ev(t).root,i=[],a=t;for(;i.push(a),!(a===s&&a!==t);){let c=Ws(a);if(c===a)break;a=c}for(let c of i.reverse())r.push(...await Vn(Xn(c,TD),"Project",n)),r.push(...await Vn(cr(c),"Project",n)),r.push(...await _v(Zt(c),"Project",n,!1)),r.push(...await Vn(Xn(c,AD),"Local",n));return e&&r.length>0&&e.invoke("instructions.loaded",{sessionId:"",source:t,fileCount:r.length}).catch(()=>{}),r}function Gs(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=Ql(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(`
|
|
562
562
|
`));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}:
|
|
563
563
|
|
|
564
564
|
${o.content.trim()}`)}return r.length>0?`${e}
|
|
565
565
|
|
|
566
566
|
${r.join(`
|
|
567
567
|
|
|
568
|
-
`)}`:""}function Ql(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||!
|
|
568
|
+
`)}`:""}function Ql(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||!LD(i))continue;let a=MD(n,s.index,o.lastIndex);DD(a)&&e.set(i,{marker:i,placement:ND(a)})}}return[...e.values()]}function MD(t,e,r){let n=[`
|
|
569
569
|
`,".","\u3002",";","\uFF1B"].map(a=>t.lastIndexOf(a,e)),o=Math.max(-1,...n)+1,s=[`
|
|
570
|
-
`,".","\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 Mv(t,e){let r=t;for(let n of e)
|
|
571
|
-
${n.marker}`:n.marker));return r}function
|
|
572
|
-
`):null},"memory INDEX.md may change between turns")]}),D=[...s].reverse().find(x=>x.role==="user");D&&ga(o,D,l,r).catch(()=>{}),await this.mcpReady;let Pe=Ie(),X=new Set(Pe.map(x=>x.function.name)),Ue=Hs([...Pe,...i.filter(x=>!X.has(x.function.name))],E);UD(this.permissionChecker,Ue);let rt=s;if(u&&s.length>0){let x=p?.activeProjectName,F=p?.projectNames.join(", ")??"";rt=[{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${x??"\u65E0"}\u3002\u53EF\u7528\u9879\u76EE\uFF1A${F||"\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 Y=a?.desktopRecentContext;if(!u&&Y&&Y.length>0&&s.length>0){let x=s[s.length-1],F=x?.role==="user"&&typeof x.content=="string"?x.content:"";if($D(F)){let $={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]"},pt={role:"system",content:"[\u684C\u9762\u5BF9\u8BDD\u4E0A\u4E0B\u6587\u7ED3\u675F\uFF0C\u4EE5\u4E0B\u662F\u5F53\u524D IM \u7AEF\u7684\u5BF9\u8BDD]"};rt=[$,...Y,pt,...rt],this.log(`[continuation] injected ${Y.length} desktop messages as reference`)}}if(!Wt(o,l)?.title){let x=typeof D?.content=="string"?D.content:Array.isArray(D?.content)?D.content.filter(F=>F.type==="text").map(F=>F.text??"").join(""):"";if(x.trim()){let F=null,$=this.resolveClientForPurpose("smallModel");$&&(F=await Ru(x,{transport:$.transport,apiKey:$.apiKey,model:$.model})),F||(F=x.trim().slice(0,20)+(x.trim().length>20?"\u2026":"")),await Je(o,{title:F,projectId:d},l).catch(()=>{}),this.sendNotification("session.info",{sessionId:o,title:F,projectId:d}),this.log(`[title-gen] generated title for session ${o}: "${F}"`)}}for await(let x of v.run({turnId:r,sessionId:o,messages:rt,tools:Ue,systemPrompt:ke,config:h},g.signal)){let F=new Date().toISOString();if(Ns({event:x,turnId:r,now:F,host:this})){x.type==="tool_call"&&this.sessionState?.recordToolCall();continue}switch(x.type){case"start":break;case"end":{let $=Mv(x.content,R);if(this.sendNotification("turn.end",{turnId:x.turnId,content:$,usage:x.usage,model:x.model,provider:x.provider,item:{id:`${r}-end`,type:"message",role:"assistant",text:$,createdAt:F}}),x.usage&&this.sessionState){this.sessionState.addUsage(x.usage,x.model??this.currentModel);let pt=this.sessionState.createSnapshot();this.sendNotification("turn.usage_update",{turnId:x.turnId,usage:x.usage,model:x.model??this.currentModel,sessionCostUSD:pt.totalInputTokens*3e-6+pt.totalOutputTokens*15e-6})}$&&(this.lastAssistantMessageForExtract=$,ga(o,{role:"assistant",content:$},l,r).catch(()=>{}));break}case"error":if(this.sendNotification("turn.error",{turnId:x.turnId,error:{message:x.error,code:x.code}}),x.usage&&this.sessionState){this.sessionState.addUsage(x.usage,this.currentModel);let $=this.sessionState.createSnapshot();this.sendNotification("turn.usage_update",{turnId:x.turnId,usage:x.usage,model:this.currentModel,sessionCostUSD:$.totalInputTokens*3e-6+$.totalOutputTokens*15e-6})}break;case"skill_instruction":this.sendNotification("turn.skill_instruction",{turnId:x.turnId,instruction:x.instruction}),sg({instruction:x.instruction,eventTurnId:x.turnId,projectRoot:l,host:this});break}}if(this.log(`turn ${r} completed`),this.sessionState?.recordTurnCompleted(),this.sessionState){ku(o,this.sessionState.createSnapshot(),{model:this.currentModel,cwd:l,projectId:d,messageCount:s.length},l).catch(()=>{});let x=this.sessionState.createSnapshot();this.sendNotification("session.info",{sessionId:o,model:this.currentModel||void 0,cwd:l,turnCount:x.turnCount,projectId:d});let F=this.resolveClientForPurpose("smallModel");if(F&&Su(o,{sessionId:o,projectId:d??"",createdAt:"",lastActiveAt:"",turnCount:x.turnCount,messageCount:s.length},s,{transport:F.transport,apiKey:F.apiKey,model:F.model},l),vv({turnId:r,messages:s,client:this.resolveClientForPurpose("textGeneration"),sendNotification:($,pt)=>this.sendNotification($,pt)}),this.petRuntime.awardXp("turn.end"),this.petRuntime.reactAfterTurn(s),a?.sessionType==="group"&&this.sessionState){let $=this.sessionState.createSnapshot(),pt=Wt(o,l);pt&&gh({...pt,turnCount:$.turnCount},l).then(ar=>{ar.split&&this.sendNotification("session-update",{sessionId:ar.activeSessionId,projectId:d??"",title:"",type:"group"})}).catch(()=>{})}}}catch(h){if(g.signal.aborted)this.sendNotification("turn.error",{turnId:r,error:{message:"Turn aborted",code:"ABORTED"}});else{let v=h instanceof Error?h.message:String(h);this.sendNotification("turn.error",{turnId:r,error:{message:v,code:"INTERNAL_ERROR"}})}}finally{Vl(this,m)}}function Xe(t){return Zl(t)}function ut(t){return Zl(t)}function sr(t){return Zl(t)}function Zl(t){return t.multiAgentHandlerHost??t}function $v(t){return new Map([["initialize",e=>jg.call(t,e)],["agent.ping",e=>$g.call(t,e)],["agent.health",e=>Ug.call(t,e)],["agent.metrics",e=>Fg.call(t,e)],["agent.cancel",e=>Hg.call(t,e)],["thread.turn",e=>jv.call(t,e)],["memory.dream",e=>$r.call(t,e)],["agent.abort",e=>Nv.call(t,e)],["tool.approval.response",e=>Lv.call(t,e)],["thread.user_response",e=>Ov.call(t,e)],["thread.list",e=>hh.call(t,e)],["session.resume",e=>Ph.call(t,e)],["thread.create",e=>fh.call(t,e)],["session.getInfo",e=>xh.call(t,e)],["session.create",e=>yh.call(t,e)],["session.resolve",e=>bh.call(t,e)],["session.list",e=>vh.call(t,e)],["session.get",e=>kh.call(t,e)],["session.getMessages",e=>Rh.call(t,e)],["session.update",e=>Sh.call(t,e)],["session.delete",e=>Th.call(t,e)],["session.deleteAll",e=>Ah.call(t,e)],["session.archive",e=>wh.call(t,e)],["memory.list",e=>uf.call(t,e)],["memory.atlas",e=>pf.call(t,e)],["memory.activity",e=>mf.call(t,e)],["memory.observe",e=>gf.call(t,e)],["memory.propose",e=>ff.call(t,e)],["memory.consolidate",e=>hf.call(t,e)],["memory.read",e=>yf.call(t,e)],["memory.write",e=>bf.call(t,e)],["memory.search",e=>vf.call(t,e)],["memory.delete",e=>kf.call(t,e)],["memory.update",e=>Rf.call(t,e)],["tools.list",e=>Pg.call(t,e)],["media.listModels",e=>nf.call(t,e)],["media.cancel",e=>of.call(t,e)],["media.status",e=>sf.call(t,e)],["media.stt",e=>af.call(t,e)],["settings.listProviders",e=>Lh.call(t,e)],["settings.addKey",e=>Oh.call(t,e)],["settings.removeKey",e=>jh.call(t,e)],["settings.toggleKey",e=>$h.call(t,e)],["settings.toggleModel",e=>Uh.call(t,e)],["settings.listModels",e=>Fh.call(t,e)],["settings.setActiveModel",e=>Hh.call(t,e)],["settings.getActiveModel",e=>Bh.call(t,e)],["settings.getOverview",e=>qh.call(t,e)],["settings.refreshModels",e=>Wh.call(t,e)],["settings.validateKey",e=>Gh.call(t,e)],["provider.list",e=>xg.call(t,e)],["config.get",e=>Cg.call(t,e)],["config.update",e=>Eg.call(t,e)],["config.tunables",e=>_g.call(t,e)],["config.updateTunable",e=>Mg.call(t,e)],["community.getConsent",e=>pg.call(t,e)],["community.setConsent",e=>mg.call(t,e)],["community.listShared",e=>gg.call(t,e)],["community.withdrawShared",e=>Rg.call(t,e)],["community.withdrawAllShared",e=>Sg.call(t,e)],["community.listNotices",e=>Tg.call(t,e)],["community.markNoticeRead",e=>Ag.call(t,e)],["community.listPublishAudit",e=>kg.call(t,e)],["community.resolveInstall",e=>fg.call(t,e)],["community.installResource",e=>hg.call(t,e)],["community.publishSkill",e=>yg.call(t,e)],["community.recordSignal",e=>bg.call(t,e)],["community.recordTelemetry",e=>vg.call(t,e)],["todos.list",e=>Dg.call(t,e)],["tasks.list",e=>Ng.call(t,e)],["tasks.cancel",e=>Lg.call(t,e)],["agents.scan",e=>fm.call(Xe(t),e)],["agents.list",e=>hm.call(Xe(t),e)],["agents.prompt",e=>Cm.call(Xe(t),e)],["agents.config",e=>ym.call(Xe(t),e)],["agents.setConfig",e=>bm.call(Xe(t),e)],["agents.getConfig",e=>vm.call(Xe(t),e)],["agents.removeConfig",e=>km.call(Xe(t),e)],["agents.setGateway",e=>Rm.call(Xe(t),e)],["agents.getGateway",e=>Sm.call(Xe(t),e)],["agents.processes",e=>Am.call(Xe(t),e)],["agents.kill",e=>wm.call(Xe(t),e)],["agents.listConfigured",e=>Tm.call(Xe(t),e)],["agents.getLog",e=>Pm.call(Xe(t),e)],["agents.testConnection",e=>xm.call(Xe(t),e)],["solo.start",e=>fy.call(sr(t),e)],["solo.status",e=>hy.call(sr(t),e)],["solo.cancel",e=>yy.call(sr(t),e)],["solo.select",e=>by.call(sr(t),e)],["solo.list",e=>vy.call(sr(t),e)],["solo.delete",e=>ky.call(sr(t),e)],["solo.message",e=>Ry.call(sr(t),e)],["solo.evaluate",e=>Sy.call(sr(t),e)],["product.plan",e=>Wf.call(ut(t),e)],["product.confirm",e=>Gf.call(ut(t),e)],["product.message",e=>Kf.call(ut(t),e)],["product.create",e=>zf.call(ut(t),e)],["product.resume",e=>Vf.call(ut(t),e)],["product.pause",e=>Xf.call(ut(t),e)],["product.checkpoint",e=>Yf.call(ut(t),e)],["product.status",e=>Jf.call(ut(t),e)],["product.list",e=>Qf.call(ut(t),e)],["product.delete",e=>Zf.call(ut(t),e)],["product.cancel",e=>eh.call(ut(t),e)],["product.rollback",e=>th.call(ut(t),e)],["project.create",e=>rh.call(t,e)],["project.list",e=>nh.call(t,e)],["project.delete",e=>oh.call(t,e)],["project.purgeAll",e=>sh.call(t,e)],["project.rename",e=>ih.call(t,e)],["project.archive",e=>ah.call(t,e)],["project.unarchive",e=>ch.call(t,e)],["project.update",e=>dh.call(t,e)],["project.archiveByGroup",e=>lh.call(t,e)],["session.switchProject",e=>Ch.call(t,e)],["session.focus",e=>Eh.call(t,e)],["session.moveToProject",e=>_h.call(t,e)],["session.getState",e=>Ih.call(t,e)],["files.list",e=>Wg.call(t,e)],["files.create",e=>Gg.call(t,e)],["files.rename",e=>Kg.call(t,e)],["files.delete",e=>zg.call(t,e)],["files.gitStatus",e=>Vg.call(t,e)],["instructions.list",e=>Xg.call(t,e)],["instructions.read",e=>Yg.call(t,e)],["instructions.write",e=>Jg.call(t,e)],["instructions.delete",e=>Qg.call(t,e)],["plans.list",e=>Zg.call(t,e)],["skills.list",e=>ey.call(t,e)],["skills.activate",e=>ty.call(t,e)],["skills.deactivate",e=>ry.call(t,e)],["skills.delete",e=>ny.call(t,e)],["skills.promote",e=>oy.call(t,e)],["skills.stats",e=>sy.call(t,e)],["skills.pin",e=>iy.call(t,e)],["skills.unpin",e=>ay.call(t,e)],["skills.curator",e=>cy.call(t,e)],["skills.lifecycle",e=>ly.call(t,e)],["pet.hatch",e=>If.call(t,e)],["pet.interact",e=>Ef.call(t,e)],["pet.status",e=>_f.call(t,e)],["pet.forge",e=>Mf.call(t,e)],["pet.confirm_response",e=>Sf.call(t,e)]])}import{randomUUID as Uv}from"node:crypto";import*as Fv from"node:path";N();async function Hv(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=B(),o={jsonrpc:"2.0",id:`acp-dream-${Uv().slice(0,8)}`,method:"memory.dream",params:{turnId:`dream-${Uv().slice(0,8)}`,sessionId:e.sessionId||t.currentSessionId,config:{memoryRoot:e.config?.memoryRoot||n,transcriptDir:e.config?.transcriptDir||Fv.join(n,"agent-logs"),model:r.model,apiKey:r.apiKey,...e.config}}};return await $r.call(t,o),{ok:!0,summary:"Dream consolidation triggered"}}async function Bv(t,e){t.log("[acp] x/solo.start");let r=ze.call(t),n=await r.start(e);return r.getStatus(n)}async function qv(t,e){t.log("[acp] x/solo.status");let r=e.soloId;if(!r)return t.soloEvaluator?t.soloEvaluator.listSessions():[];let o=ze.call(t).getStatus(r);if(!o)throw new Error(`Solo session ${r} not found`);return o}async function Wv(t,e){return t.log("[acp] x/solo.select"),{ok:!0,mergedBranch:await ze.call(t).select(e)}}async function Gv(t,e){t.log("[acp] x/solo.cancel");let r=ze.call(t),n=e.soloId;return await r.cancel(n),{ok:!0}}async function Kv(t,e){return t.log("[acp] x/solo.subscribe"),{ok:!0,soloId:e.soloId}}async function zv(t,e){t.log("[acp] x/solo.message");let r=ze.call(t),{soloId:n,agentId:o,content:s,agentIndex:i}=e;return r.message(n,o,s,i)}async function Vv(t,e){t.log("[acp] x/solo.evaluate");let r=ze.call(t),{soloId:n,evaluatorAgentId:o,evaluatorIndex:s}=e;return r.triggerEvaluation(n,o,s)}async function Xv(t){return t.log("[acp] x/agents.list"),nc()}async function Yv(t,e){return t.log("[acp] x/product.create"),{productId:await ye.call(t).create(e)}}async function Jv(t,e){return t.log("[acp] x/product.plan"),Rr.call(t).plan(e)}async function Qv(t,e){t.log("[acp] x/product.confirm");let r=Rr.call(t),n=e,o=await r.confirm(n),s=r.getSession(n.productId);return s&&await ye.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 Zv(t,e){t.log("[acp] x/product.message");let r=Rr.call(t),n=e;return r.message(n.productId,n.content)}async function ek(t,e){t.log("[acp] x/product.resume");let r=ye.call(t),n=e.productId;return await r.resume(n,t.getActiveProjectRoot()),{ok:!0}}async function tk(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 rk(t,e){t.log("[acp] x/product.pause");let r=ye.call(t),n=e.productId;return await r.pause(n),{ok:!0}}async function nk(t,e){t.log("[acp] x/product.cancel");let r=ye.call(t),n=e.productId;return await r.delete(n),{ok:!0}}async function ok(t,e){t.log("[acp] x/product.rollback");let r=ye.call(t),n=e.productId,o=e.checkpointId??"latest";return await r.rollback(n,o),{ok:!0}}async function sk(t,e){return t.log("[acp] x/product.subscribe"),{ok:!0,productId:e.productId}}async function ik(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=Sn(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}`),lt.isTeamBudgetExceeded())return{ok:!1,agentType:r,output:void 0,error:lt.teamBudgetExceededError(),tokensUsed:0};let a={invoke:async()=>({result:"Tool execution not available in delegated mode"})},c={info:p=>t.log(`[delegate:${r}] ${p}`),warn:p=>t.log(`[delegate:${r}] WARN: ${p}`),error:p=>t.log(`[delegate:${r}] ERROR: ${p}`),debug:p=>t.log(`[delegate:${r}] ${p}`)},l=await Mr({promptMessages:[{role:"user",content:n}],tools:[],transport:i.transport,toolInvoker:a,createAgentRunner:jr,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(p=>p.type==="end"&&"content"in p).map(p=>p.content??"").join("")||l.events.filter(p=>p.type==="delta"&&"text"in p).map(p=>p.text).join(""),u=l.totalUsage.inputTokens+l.totalUsage.outputTokens;return lt.recordForkTokens(u),{ok:l.ok,agentType:r,output:d||void 0,error:l.error,tokensUsed:u}}import{randomUUID as ak}from"node:crypto";async function ck(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 lk(t,e){let r=e.sessionId??ak();return t.log(`[acp] session/new: id=${r}`),t.currentSessionId=r,t.sessionState=new tr(r),t.sessionTaskDomain=void 0,t.memoryPrefetchState=gt(),e.cwd&&typeof e.cwd=="string"&&t.setActiveWorkdir(e.cwd),t.enableIdleDream(),{sessionId:r}}async function dk(t,e){let r=ak(),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 qD(t,r,n,[...s]);return i.content&&t.sessionHistory.appendAcpAssistantMessage(n,i.content),i}async function qD(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=Fs(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=Hs(Ie(),i),l=t.getActiveProjectRoot(),d=await Ks(l,t.currentHooks??void 0),u=d.length>0?Gs(d):void 0,p=Bs(i),m=await Ds({instructionBlock:u,sections:[js(l),Us(),$s(),...p?[p]:[]]}),g,f="end_turn",h="";for await(let v of a.run({turnId:e,sessionId:r,messages:n,tools:c,systemPrompt:m,config:s},o.signal)){let b=new Date().toISOString();if(!Ns({event:v,turnId:e,now:b,host:t}))switch(v.type){case"start":break;case"end":v.usage&&(g={inputTokens:v.usage.inputTokens??0,outputTokens:v.usage.outputTokens??0,cacheReadTokens:v.usage.cacheRead,cacheWriteTokens:v.usage.cacheWrite}),h=v.content??"",t.sendNotification("turn.end",{turnId:v.turnId,content:v.content,usage:v.usage,model:v.model,provider:v.provider,item:{id:`${e}-end`,type:"message",role:"assistant",text:v.content,createdAt:b}});break;case"error":f="end_turn",t.sendNotification("turn.error",{turnId:v.turnId,error:{message:v.error,code:v.code}});break}}return t.activeTurn=null,{stopReason:f,usage:g,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 uk(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 pk(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 mk(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 gk(t,e,r){t.log(`[acp] session/set_mode: ${r}`)}function fk(t,e,r=t){return{handleAcpInitialize:n=>ck(t,n,e),handleAcpSessionNew:n=>lk(t,n),handleAcpSessionPrompt:n=>dk(t,n),handleAcpSessionEnd:n=>uk(t,n),handleAcpSessionSetConfig:n=>pk(t,n),handleAcpSessionSetModel:(n,o)=>mk(t,n,o),handleAcpSessionSetMode:(n,o)=>gk(t,n,o),handleAcpPermissionResponse:(n,o)=>{t.log(`[acp] permission response: ${n} -> ${o}`),t.permissionChecker?.resolveApproval({approvalId:n,decision:o==="allow"||o==="allowAlways"?"approved":"denied"})},handleAcpAbort:async n=>{t.log(`[acp] abort: session=${n.sessionId}`),t.activeTurn&&(t.activeTurn.abort(),t.activeTurn=null)},handleAcpDream:n=>Hv(r,n),handleAcpAgentsList:()=>Xv(r),handleAcpSoloStart:n=>Bv(r,n),handleAcpSoloStatus:n=>qv(r,n),handleAcpSoloSelect:n=>Wv(r,n),handleAcpSoloCancel:n=>Gv(r,n),handleAcpSoloSubscribe:n=>Kv(r,n),handleAcpSoloMessage:n=>zv(r,n),handleAcpSoloEvaluate:n=>Vv(r,n),handleAcpProductCreate:n=>Yv(r,n),handleAcpProductPlan:n=>Jv(r,n),handleAcpProductConfirm:n=>Qv(r,n),handleAcpProductMessage:n=>Zv(r,n),handleAcpProductPause:n=>rk(r,n),handleAcpProductResume:n=>ek(r,n),handleAcpProductCancel:n=>nk(r,n),handleAcpProductRollback:n=>ok(r,n),handleAcpProductStatus:n=>tk(r,n),handleAcpProductSubscribe:n=>sk(r,n),handleAcpTeamDelegate:n=>ik(r,n)}}import{resolve as GD}from"node:path";var zs=class{constructor(e){this.mediaPersistence=e}mediaPersistence;activeWorkdir=null;getActiveProjectRoot(){if(this.activeWorkdir)return this.activeWorkdir;let e=ne();return e?.workspaceDir?e.workspaceDir:process.cwd()}setActiveWorkdir(e){let r=GD(e);this.activeWorkdir!==r&&(this.activeWorkdir=r,iv(r),this.mediaPersistence.setProjectDir(r))}resolveProjectDir(e){if(e)return $t(e)??void 0}};import{createRequire as cN}from"node:module";N();import*as Xs from"node:fs";import*as bk from"node:path";import{randomUUID as Yn}from"node:crypto";var KD=`
|
|
570
|
+
`,".","\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 Mv(t,e){let r=t;for(let n of e)OD(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()}
|
|
571
|
+
${n.marker}`:n.marker));return r}function DD(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 ND(t){let e=t.toLowerCase(),r=qs(e,["start with","begin with"])+qs(t,["\u5F00\u5934","\u5FC5\u987B\u4EE5"]),n=qs(e,["end with","append","at the end"])+qs(t,["\u672B\u5C3E","\u7ED3\u5C3E","\u7ED3\u675F\u6807\u8BB0"]);return r>=0||n>=0?r>n?"prefix":"suffix":"include"}function qs(t,e){let r=-1;for(let n of e){let o=t.lastIndexOf(n);o>r&&(r=o)}return r}function LD(t){let e=t.trim();return e.length<2||e.length>100||/https?:\/\//i.test(e)?!1:/[A-Z0-9_\-[\]—-]/.test(e)}function OD(t){return/[A-Z\[\]—-]/.test(t)}async function Ks(t,e){return _D(t,e)}function Dv(){}var UD=[/继续(桌面|电脑|刚才|上次|之前)的/,/接着(桌面|电脑|刚才|上次|之前)的/,/刚才(那个|那件|说的|聊的|做的)/,/上次(说到|聊到|做到|讲到)/,/桌面(端|上)?(那个|那边|的任务|的对话|在做)/,/电脑(端|上)?(那个|那边|的任务|的对话|在做)/,/之前(那个|在做的|讨论的|说的)/,/帮我继续/,/接着(做|干|搞|写|改)/,/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 FD(t){return!t||t.length<3?!1:UD.some(e=>e.test(t))}function Nv(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 Lv(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:BD(n)?"approved":"denied",updatedInput:e.updatedInput,permissionUpdate:qD(e,n)};this.permissionChecker&&this.permissionChecker.resolveApproval(o),t.id!==void 0&&this.sendResponse(t.id,{received:!0})}function HD(t,e){t?.setToolMeta?.(e)}function BD(t){return t==="approved"||t==="allow"||t==="allow-once"||t==="allow-session"||t==="allow-always"}function qD(t,e){if(t.permissionUpdate)return t.permissionUpdate;if(e!=="allow-always")return;let r=t.toolName;if(!(typeof r!="string"||!r))return{pattern:r,behavior:"allow",scope:"persistent",description:`Always allow ${r}`}}function Ov(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 jv(t){let e=t.params??{},r=e.turnId??$D(),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=yv({config:a,sessionId:o,host:this}),{sessionProjectRoot:l,sessionProjectId:d,projectHintStale:u,staleProjectHintContext:p}=c;gv({host:this,config:a,turnId:r}),uv(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 mv(this,o),g=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 f=[...s].reverse().find(h=>h.role==="user");if(this.lastUserMessageForAutoExtract=typeof f?.content=="string"?f.content:void 0,!f||!String(f.content??"").trim()){this.sendNotification("turn.end",{turnId:r,content:"",item:{id:`${r}-end`,type:"message",role:"assistant",text:"",createdAt:new Date().toISOString()}}),Vl(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,mcpServers:a?.mcpServers,fallbackModel:M().resolveModelForPurpose("smallModel")??void 0};{let x=h.provider??"",F=h.model??"";x&&F&&M().getModelInfo(x,F)?.streamRequired&&(h.streamRequired=!0)}let v=this.resolveAgent(h);if(this.permissionChecker?.ruleEngineRef&&a?.permissions){let x=dv(this.permissionChecker.ruleEngineRef,a.permissions);x.mode}if(!v){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 b,R=[],T=a?.workdir??this.getActiveProjectRoot();this.setActiveWorkdir(T);try{let x=await Ks(T,this.currentHooks??void 0);x.length>0&&(b=Gs(x),R=Ql(x))}catch{}let A=s.filter(x=>x.role==="user").map(x=>typeof x.content=="string"?x.content:"").join(" "),{domain:P,source:I}=Tv({cwd:T,hostOverride:a?.taskDomain,sessionDomain:this.sessionTaskDomain,userText:A});this.sessionTaskDomain=P,I==="auto-detect"&&wv(A,P)&&Av(T,P);let E=Fs(s),L=Bs(E);!h.toolChoice&&E.requiresFreshTool&&(h.toolChoice="required");let ve=this.projectMemoryStoreFactory.getRootPath(T);if(!this.memdir||this.memdir.getRootPath()!==ve){let x=this.projectMemoryStoreFactory.create(T);x.ensureInitialized(),this.memdir=x}let k=this.memdir,Z;if(o){let x=Wt(o,l);x?.carryoverSummary&&(Z=x.carryoverSummary)}let ke=await Ds({basePrompt:a?.systemPrompt,instructionBlock:b,customSystemPrompt:a?.customSystemPrompt,appendSystemPrompt:a?.appendSystemPrompt,sections:[js(T),Us(),xv(P),$s(),...L?[L]:[],...Z?[Yt("carryover",()=>Z,"carryover from predecessor session")]:[],Yt("memory",()=>{if(!k)return null;let x=k.getIndexForPrompt();return x?["## Your Memory (project-level notes \u2014 always visible)","",x,"","<!-- 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(`
|
|
572
|
+
`):null},"memory INDEX.md may change between turns")]}),D=[...s].reverse().find(x=>x.role==="user");D&&ga(o,D,l,r).catch(()=>{}),await this.mcpReady;let Pe=Ie(),X=new Set(Pe.map(x=>x.function.name)),Ue=Hs([...Pe,...i.filter(x=>!X.has(x.function.name))],E);HD(this.permissionChecker,Ue);let rt=s;if(u&&s.length>0){let x=p?.activeProjectName,F=p?.projectNames.join(", ")??"";rt=[{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${x??"\u65E0"}\u3002\u53EF\u7528\u9879\u76EE\uFF1A${F||"\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 Y=a?.desktopRecentContext;if(!u&&Y&&Y.length>0&&s.length>0){let x=s[s.length-1],F=x?.role==="user"&&typeof x.content=="string"?x.content:"";if(FD(F)){let $={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]"},pt={role:"system",content:"[\u684C\u9762\u5BF9\u8BDD\u4E0A\u4E0B\u6587\u7ED3\u675F\uFF0C\u4EE5\u4E0B\u662F\u5F53\u524D IM \u7AEF\u7684\u5BF9\u8BDD]"};rt=[$,...Y,pt,...rt],this.log(`[continuation] injected ${Y.length} desktop messages as reference`)}}if(!Wt(o,l)?.title){let x=typeof D?.content=="string"?D.content:Array.isArray(D?.content)?D.content.filter(F=>F.type==="text").map(F=>F.text??"").join(""):"";if(x.trim()){let F=null,$=this.resolveClientForPurpose("smallModel");$&&(F=await Ru(x,{transport:$.transport,apiKey:$.apiKey,model:$.model})),F||(F=x.trim().slice(0,20)+(x.trim().length>20?"\u2026":"")),await Je(o,{title:F,projectId:d},l).catch(()=>{}),this.sendNotification("session.info",{sessionId:o,title:F,projectId:d}),this.log(`[title-gen] generated title for session ${o}: "${F}"`)}}for await(let x of v.run({turnId:r,sessionId:o,messages:rt,tools:Ue,systemPrompt:ke,config:h},g.signal)){let F=new Date().toISOString();if(Ns({event:x,turnId:r,now:F,host:this})){x.type==="tool_call"&&this.sessionState?.recordToolCall();continue}switch(x.type){case"start":break;case"end":{let $=Mv(x.content,R);if(this.sendNotification("turn.end",{turnId:x.turnId,content:$,usage:x.usage,model:x.model,provider:x.provider,item:{id:`${r}-end`,type:"message",role:"assistant",text:$,createdAt:F}}),x.usage&&this.sessionState){this.sessionState.addUsage(x.usage,x.model??this.currentModel);let pt=this.sessionState.createSnapshot();this.sendNotification("turn.usage_update",{turnId:x.turnId,usage:x.usage,model:x.model??this.currentModel,sessionCostUSD:pt.totalInputTokens*3e-6+pt.totalOutputTokens*15e-6})}$&&(this.lastAssistantMessageForExtract=$,ga(o,{role:"assistant",content:$},l,r).catch(()=>{}));break}case"error":if(this.sendNotification("turn.error",{turnId:x.turnId,error:{message:x.error,code:x.code}}),x.usage&&this.sessionState){this.sessionState.addUsage(x.usage,this.currentModel);let $=this.sessionState.createSnapshot();this.sendNotification("turn.usage_update",{turnId:x.turnId,usage:x.usage,model:this.currentModel,sessionCostUSD:$.totalInputTokens*3e-6+$.totalOutputTokens*15e-6})}break;case"skill_instruction":this.sendNotification("turn.skill_instruction",{turnId:x.turnId,instruction:x.instruction}),sg({instruction:x.instruction,eventTurnId:x.turnId,projectRoot:l,host:this});break}}if(this.log(`turn ${r} completed`),this.sessionState?.recordTurnCompleted(),this.sessionState){ku(o,this.sessionState.createSnapshot(),{model:this.currentModel,cwd:l,projectId:d,messageCount:s.length},l).catch(()=>{});let x=this.sessionState.createSnapshot();this.sendNotification("session.info",{sessionId:o,model:this.currentModel||void 0,cwd:l,turnCount:x.turnCount,projectId:d});let F=this.resolveClientForPurpose("smallModel");if(F&&Su(o,{sessionId:o,projectId:d??"",createdAt:"",lastActiveAt:"",turnCount:x.turnCount,messageCount:s.length},s,{transport:F.transport,apiKey:F.apiKey,model:F.model},l),vv({turnId:r,messages:s,client:this.resolveClientForPurpose("textGeneration"),sendNotification:($,pt)=>this.sendNotification($,pt)}),this.petRuntime.awardXp("turn.end"),this.petRuntime.reactAfterTurn(s),a?.sessionType==="group"&&this.sessionState){let $=this.sessionState.createSnapshot(),pt=Wt(o,l);pt&&gh({...pt,turnCount:$.turnCount},l).then(ar=>{ar.split&&this.sendNotification("session-update",{sessionId:ar.activeSessionId,projectId:d??"",title:"",type:"group"})}).catch(()=>{})}}}catch(h){if(g.signal.aborted)this.sendNotification("turn.error",{turnId:r,error:{message:"Turn aborted",code:"ABORTED"}});else{let v=h instanceof Error?h.message:String(h);this.sendNotification("turn.error",{turnId:r,error:{message:v,code:"INTERNAL_ERROR"}})}}finally{Vl(this,m)}}function Xe(t){return Zl(t)}function ut(t){return Zl(t)}function sr(t){return Zl(t)}function Zl(t){return t.multiAgentHandlerHost??t}function $v(t){return new Map([["initialize",e=>jg.call(t,e)],["agent.ping",e=>$g.call(t,e)],["agent.health",e=>Ug.call(t,e)],["agent.metrics",e=>Fg.call(t,e)],["agent.cancel",e=>Hg.call(t,e)],["thread.turn",e=>jv.call(t,e)],["memory.dream",e=>$r.call(t,e)],["agent.abort",e=>Nv.call(t,e)],["tool.approval.response",e=>Lv.call(t,e)],["thread.user_response",e=>Ov.call(t,e)],["thread.list",e=>hh.call(t,e)],["session.resume",e=>Ph.call(t,e)],["thread.create",e=>fh.call(t,e)],["session.getInfo",e=>xh.call(t,e)],["session.create",e=>yh.call(t,e)],["session.resolve",e=>bh.call(t,e)],["session.list",e=>vh.call(t,e)],["session.get",e=>kh.call(t,e)],["session.getMessages",e=>Rh.call(t,e)],["session.update",e=>Sh.call(t,e)],["session.delete",e=>Th.call(t,e)],["session.deleteAll",e=>Ah.call(t,e)],["session.archive",e=>wh.call(t,e)],["memory.list",e=>uf.call(t,e)],["memory.atlas",e=>pf.call(t,e)],["memory.activity",e=>mf.call(t,e)],["memory.observe",e=>gf.call(t,e)],["memory.propose",e=>ff.call(t,e)],["memory.consolidate",e=>hf.call(t,e)],["memory.read",e=>yf.call(t,e)],["memory.write",e=>bf.call(t,e)],["memory.search",e=>vf.call(t,e)],["memory.delete",e=>kf.call(t,e)],["memory.update",e=>Rf.call(t,e)],["tools.list",e=>Pg.call(t,e)],["media.listModels",e=>nf.call(t,e)],["media.cancel",e=>of.call(t,e)],["media.status",e=>sf.call(t,e)],["media.stt",e=>af.call(t,e)],["settings.listProviders",e=>Lh.call(t,e)],["settings.addKey",e=>Oh.call(t,e)],["settings.removeKey",e=>jh.call(t,e)],["settings.toggleKey",e=>$h.call(t,e)],["settings.toggleModel",e=>Uh.call(t,e)],["settings.listModels",e=>Fh.call(t,e)],["settings.setActiveModel",e=>Hh.call(t,e)],["settings.getActiveModel",e=>Bh.call(t,e)],["settings.getOverview",e=>qh.call(t,e)],["settings.refreshModels",e=>Wh.call(t,e)],["settings.validateKey",e=>Gh.call(t,e)],["provider.list",e=>xg.call(t,e)],["config.get",e=>Cg.call(t,e)],["config.update",e=>Eg.call(t,e)],["config.tunables",e=>_g.call(t,e)],["config.updateTunable",e=>Mg.call(t,e)],["community.getConsent",e=>pg.call(t,e)],["community.setConsent",e=>mg.call(t,e)],["community.listShared",e=>gg.call(t,e)],["community.withdrawShared",e=>Rg.call(t,e)],["community.withdrawAllShared",e=>Sg.call(t,e)],["community.listNotices",e=>Tg.call(t,e)],["community.markNoticeRead",e=>Ag.call(t,e)],["community.listPublishAudit",e=>kg.call(t,e)],["community.resolveInstall",e=>fg.call(t,e)],["community.installResource",e=>hg.call(t,e)],["community.publishSkill",e=>yg.call(t,e)],["community.recordSignal",e=>bg.call(t,e)],["community.recordTelemetry",e=>vg.call(t,e)],["todos.list",e=>Dg.call(t,e)],["tasks.list",e=>Ng.call(t,e)],["tasks.cancel",e=>Lg.call(t,e)],["agents.scan",e=>fm.call(Xe(t),e)],["agents.list",e=>hm.call(Xe(t),e)],["agents.prompt",e=>Cm.call(Xe(t),e)],["agents.config",e=>ym.call(Xe(t),e)],["agents.setConfig",e=>bm.call(Xe(t),e)],["agents.getConfig",e=>vm.call(Xe(t),e)],["agents.removeConfig",e=>km.call(Xe(t),e)],["agents.setGateway",e=>Rm.call(Xe(t),e)],["agents.getGateway",e=>Sm.call(Xe(t),e)],["agents.processes",e=>Am.call(Xe(t),e)],["agents.kill",e=>wm.call(Xe(t),e)],["agents.listConfigured",e=>Tm.call(Xe(t),e)],["agents.getLog",e=>Pm.call(Xe(t),e)],["agents.testConnection",e=>xm.call(Xe(t),e)],["solo.start",e=>fy.call(sr(t),e)],["solo.status",e=>hy.call(sr(t),e)],["solo.cancel",e=>yy.call(sr(t),e)],["solo.select",e=>by.call(sr(t),e)],["solo.list",e=>vy.call(sr(t),e)],["solo.delete",e=>ky.call(sr(t),e)],["solo.message",e=>Ry.call(sr(t),e)],["solo.evaluate",e=>Sy.call(sr(t),e)],["product.plan",e=>Wf.call(ut(t),e)],["product.confirm",e=>Gf.call(ut(t),e)],["product.message",e=>Kf.call(ut(t),e)],["product.create",e=>zf.call(ut(t),e)],["product.resume",e=>Vf.call(ut(t),e)],["product.pause",e=>Xf.call(ut(t),e)],["product.checkpoint",e=>Yf.call(ut(t),e)],["product.status",e=>Jf.call(ut(t),e)],["product.list",e=>Qf.call(ut(t),e)],["product.delete",e=>Zf.call(ut(t),e)],["product.cancel",e=>eh.call(ut(t),e)],["product.rollback",e=>th.call(ut(t),e)],["project.create",e=>rh.call(t,e)],["project.list",e=>nh.call(t,e)],["project.delete",e=>oh.call(t,e)],["project.purgeAll",e=>sh.call(t,e)],["project.rename",e=>ih.call(t,e)],["project.archive",e=>ah.call(t,e)],["project.unarchive",e=>ch.call(t,e)],["project.update",e=>dh.call(t,e)],["project.archiveByGroup",e=>lh.call(t,e)],["session.switchProject",e=>Ch.call(t,e)],["session.focus",e=>Eh.call(t,e)],["session.moveToProject",e=>_h.call(t,e)],["session.getState",e=>Ih.call(t,e)],["files.list",e=>Wg.call(t,e)],["files.create",e=>Gg.call(t,e)],["files.rename",e=>Kg.call(t,e)],["files.delete",e=>zg.call(t,e)],["files.gitStatus",e=>Vg.call(t,e)],["instructions.list",e=>Xg.call(t,e)],["instructions.read",e=>Yg.call(t,e)],["instructions.write",e=>Jg.call(t,e)],["instructions.delete",e=>Qg.call(t,e)],["plans.list",e=>Zg.call(t,e)],["skills.list",e=>ey.call(t,e)],["skills.activate",e=>ty.call(t,e)],["skills.deactivate",e=>ry.call(t,e)],["skills.delete",e=>ny.call(t,e)],["skills.promote",e=>oy.call(t,e)],["skills.stats",e=>sy.call(t,e)],["skills.pin",e=>iy.call(t,e)],["skills.unpin",e=>ay.call(t,e)],["skills.curator",e=>cy.call(t,e)],["skills.lifecycle",e=>ly.call(t,e)],["pet.hatch",e=>If.call(t,e)],["pet.interact",e=>Ef.call(t,e)],["pet.status",e=>_f.call(t,e)],["pet.forge",e=>Mf.call(t,e)],["pet.confirm_response",e=>Sf.call(t,e)]])}import{randomUUID as Uv}from"node:crypto";import*as Fv from"node:path";N();async function Hv(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=B(),o={jsonrpc:"2.0",id:`acp-dream-${Uv().slice(0,8)}`,method:"memory.dream",params:{turnId:`dream-${Uv().slice(0,8)}`,sessionId:e.sessionId||t.currentSessionId,config:{memoryRoot:e.config?.memoryRoot||n,transcriptDir:e.config?.transcriptDir||Fv.join(n,"agent-logs"),model:r.model,apiKey:r.apiKey,...e.config}}};return await $r.call(t,o),{ok:!0,summary:"Dream consolidation triggered"}}async function Bv(t,e){t.log("[acp] x/solo.start");let r=ze.call(t),n=await r.start(e);return r.getStatus(n)}async function qv(t,e){t.log("[acp] x/solo.status");let r=e.soloId;if(!r)return t.soloEvaluator?t.soloEvaluator.listSessions():[];let o=ze.call(t).getStatus(r);if(!o)throw new Error(`Solo session ${r} not found`);return o}async function Wv(t,e){return t.log("[acp] x/solo.select"),{ok:!0,mergedBranch:await ze.call(t).select(e)}}async function Gv(t,e){t.log("[acp] x/solo.cancel");let r=ze.call(t),n=e.soloId;return await r.cancel(n),{ok:!0}}async function Kv(t,e){return t.log("[acp] x/solo.subscribe"),{ok:!0,soloId:e.soloId}}async function zv(t,e){t.log("[acp] x/solo.message");let r=ze.call(t),{soloId:n,agentId:o,content:s,agentIndex:i}=e;return r.message(n,o,s,i)}async function Vv(t,e){t.log("[acp] x/solo.evaluate");let r=ze.call(t),{soloId:n,evaluatorAgentId:o,evaluatorIndex:s}=e;return r.triggerEvaluation(n,o,s)}async function Xv(t){return t.log("[acp] x/agents.list"),nc()}async function Yv(t,e){return t.log("[acp] x/product.create"),{productId:await ye.call(t).create(e)}}async function Jv(t,e){return t.log("[acp] x/product.plan"),Rr.call(t).plan(e)}async function Qv(t,e){t.log("[acp] x/product.confirm");let r=Rr.call(t),n=e,o=await r.confirm(n),s=r.getSession(n.productId);return s&&await ye.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 Zv(t,e){t.log("[acp] x/product.message");let r=Rr.call(t),n=e;return r.message(n.productId,n.content)}async function ek(t,e){t.log("[acp] x/product.resume");let r=ye.call(t),n=e.productId;return await r.resume(n,t.getActiveProjectRoot()),{ok:!0}}async function tk(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 rk(t,e){t.log("[acp] x/product.pause");let r=ye.call(t),n=e.productId;return await r.pause(n),{ok:!0}}async function nk(t,e){t.log("[acp] x/product.cancel");let r=ye.call(t),n=e.productId;return await r.delete(n),{ok:!0}}async function ok(t,e){t.log("[acp] x/product.rollback");let r=ye.call(t),n=e.productId,o=e.checkpointId??"latest";return await r.rollback(n,o),{ok:!0}}async function sk(t,e){return t.log("[acp] x/product.subscribe"),{ok:!0,productId:e.productId}}async function ik(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=Sn(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}`),lt.isTeamBudgetExceeded())return{ok:!1,agentType:r,output:void 0,error:lt.teamBudgetExceededError(),tokensUsed:0};let a={invoke:async()=>({result:"Tool execution not available in delegated mode"})},c={info:p=>t.log(`[delegate:${r}] ${p}`),warn:p=>t.log(`[delegate:${r}] WARN: ${p}`),error:p=>t.log(`[delegate:${r}] ERROR: ${p}`),debug:p=>t.log(`[delegate:${r}] ${p}`)},l=await Mr({promptMessages:[{role:"user",content:n}],tools:[],transport:i.transport,toolInvoker:a,createAgentRunner:jr,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(p=>p.type==="end"&&"content"in p).map(p=>p.content??"").join("")||l.events.filter(p=>p.type==="delta"&&"text"in p).map(p=>p.text).join(""),u=l.totalUsage.inputTokens+l.totalUsage.outputTokens;return lt.recordForkTokens(u),{ok:l.ok,agentType:r,output:d||void 0,error:l.error,tokensUsed:u}}import{randomUUID as ak}from"node:crypto";async function ck(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 lk(t,e){let r=e.sessionId??ak();return t.log(`[acp] session/new: id=${r}`),t.currentSessionId=r,t.sessionState=new tr(r),t.sessionTaskDomain=void 0,t.memoryPrefetchState=gt(),e.cwd&&typeof e.cwd=="string"&&t.setActiveWorkdir(e.cwd),t.enableIdleDream(),{sessionId:r}}async function dk(t,e){let r=ak(),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 GD(t,r,n,[...s]);return i.content&&t.sessionHistory.appendAcpAssistantMessage(n,i.content),i}async function GD(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=Fs(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=Hs(Ie(),i),l=t.getActiveProjectRoot(),d=await Ks(l,t.currentHooks??void 0),u=d.length>0?Gs(d):void 0,p=Bs(i),m=await Ds({instructionBlock:u,sections:[js(l),Us(),$s(),...p?[p]:[]]}),g,f="end_turn",h="";for await(let v of a.run({turnId:e,sessionId:r,messages:n,tools:c,systemPrompt:m,config:s},o.signal)){let b=new Date().toISOString();if(!Ns({event:v,turnId:e,now:b,host:t}))switch(v.type){case"start":break;case"end":v.usage&&(g={inputTokens:v.usage.inputTokens??0,outputTokens:v.usage.outputTokens??0,cacheReadTokens:v.usage.cacheRead,cacheWriteTokens:v.usage.cacheWrite}),h=v.content??"",t.sendNotification("turn.end",{turnId:v.turnId,content:v.content,usage:v.usage,model:v.model,provider:v.provider,item:{id:`${e}-end`,type:"message",role:"assistant",text:v.content,createdAt:b}});break;case"error":f="end_turn",t.sendNotification("turn.error",{turnId:v.turnId,error:{message:v.error,code:v.code}});break}}return t.activeTurn=null,{stopReason:f,usage:g,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 uk(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 pk(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 mk(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 gk(t,e,r){t.log(`[acp] session/set_mode: ${r}`)}function fk(t,e,r=t){return{handleAcpInitialize:n=>ck(t,n,e),handleAcpSessionNew:n=>lk(t,n),handleAcpSessionPrompt:n=>dk(t,n),handleAcpSessionEnd:n=>uk(t,n),handleAcpSessionSetConfig:n=>pk(t,n),handleAcpSessionSetModel:(n,o)=>mk(t,n,o),handleAcpSessionSetMode:(n,o)=>gk(t,n,o),handleAcpPermissionResponse:(n,o)=>{t.log(`[acp] permission response: ${n} -> ${o}`),t.permissionChecker?.resolveApproval({approvalId:n,decision:o==="allow"||o==="allowAlways"?"approved":"denied"})},handleAcpAbort:async n=>{t.log(`[acp] abort: session=${n.sessionId}`),t.activeTurn&&(t.activeTurn.abort(),t.activeTurn=null)},handleAcpDream:n=>Hv(r,n),handleAcpAgentsList:()=>Xv(r),handleAcpSoloStart:n=>Bv(r,n),handleAcpSoloStatus:n=>qv(r,n),handleAcpSoloSelect:n=>Wv(r,n),handleAcpSoloCancel:n=>Gv(r,n),handleAcpSoloSubscribe:n=>Kv(r,n),handleAcpSoloMessage:n=>zv(r,n),handleAcpSoloEvaluate:n=>Vv(r,n),handleAcpProductCreate:n=>Yv(r,n),handleAcpProductPlan:n=>Jv(r,n),handleAcpProductConfirm:n=>Qv(r,n),handleAcpProductMessage:n=>Zv(r,n),handleAcpProductPause:n=>rk(r,n),handleAcpProductResume:n=>ek(r,n),handleAcpProductCancel:n=>nk(r,n),handleAcpProductRollback:n=>ok(r,n),handleAcpProductStatus:n=>tk(r,n),handleAcpProductSubscribe:n=>sk(r,n),handleAcpTeamDelegate:n=>ik(r,n)}}import{resolve as zD}from"node:path";var zs=class{constructor(e){this.mediaPersistence=e}mediaPersistence;activeWorkdir=null;getActiveProjectRoot(){if(this.activeWorkdir)return this.activeWorkdir;let e=ne();return e?.workspaceDir?e.workspaceDir:process.cwd()}setActiveWorkdir(e){let r=zD(e);this.activeWorkdir!==r&&(this.activeWorkdir=r,iv(r),this.mediaPersistence.setProjectDir(r))}resolveProjectDir(e){if(e)return $t(e)??void 0}};import{createRequire as dN}from"node:module";N();import*as Xs from"node:fs";import*as bk from"node:path";import{randomUUID as Yn}from"node:crypto";var VD=`
|
|
573
573
|
CREATE TABLE IF NOT EXISTS memories (
|
|
574
574
|
id TEXT PRIMARY KEY,
|
|
575
575
|
text TEXT NOT NULL,
|
|
@@ -699,7 +699,7 @@ CREATE TRIGGER IF NOT EXISTS memories_au AFTER UPDATE ON memories BEGIN
|
|
|
699
699
|
INSERT INTO memories_fts(rowid, id, user_id, text, category, tags)
|
|
700
700
|
VALUES (new.rowid, new.id, new.user_id, new.text, new.category, new.tags);
|
|
701
701
|
END;
|
|
702
|
-
`,Vs=class{db;constructor(e){this.db=e,this.initSchema()}initSchema(){this.db.pragma("journal_mode = WAL"),this.db.pragma("foreign_keys = ON"),this.db.exec(
|
|
702
|
+
`,Vs=class{db;constructor(e){this.db=e,this.initSchema()}initSchema(){this.db.pragma("journal_mode = WAL"),this.db.pragma("foreign_keys = ON"),this.db.exec(VD)}insert(e){let r=`mem_${Yn().replace(/-/g,"").slice(0,16)}`,n=Date.now(),o=JSON.stringify(e.tags??[]),s=e.embedding?Buffer.from(e.embedding.buffer,e.embedding.byteOffset,e.embedding.byteLength):null;return this.db.prepare(`
|
|
703
703
|
INSERT INTO memories (id, text, user_id, category, importance, confidence, source, session_id, event_date, tags, embedding, created_at, updated_at, last_accessed_at)
|
|
704
704
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
705
705
|
`).run(r,e.text,e.userId,e.category??"general",e.importance??.5,e.confidence??1,e.source??"agent",e.sessionId??"",e.eventDate??"",o,s,n,n,n),r}searchFts(e,r,n=10){let o=e.replace(/['"*()]/g," ").trim();return o?this.db.prepare(`
|
|
@@ -714,7 +714,7 @@ END;
|
|
|
714
714
|
SELECT id, text, category, importance, tags, created_at, access_count, embedding
|
|
715
715
|
FROM memories
|
|
716
716
|
WHERE user_id = ? AND is_archived = 0 AND embedding IS NOT NULL
|
|
717
|
-
`).all(r),i=[],a=yk(e);for(let c of s){let l=new Float32Array(c.embedding.buffer,c.embedding.byteOffset,c.embedding.byteLength/4),d=yk(l),u=
|
|
717
|
+
`).all(r),i=[],a=yk(e);for(let c of s){let l=new Float32Array(c.embedding.buffer,c.embedding.byteOffset,c.embedding.byteLength/4),d=yk(l),u=JD(a,d);u>=o&&i.push({id:c.id,text:c.text,score:u*.7+c.importance*.3,category:c.category,importance:c.importance,metadata:{tags:JSON.parse(c.tags||"[]"),createdAt:c.created_at,accessCount:c.access_count,cosineSimilarity:u}})}return i.sort((c,l)=>l.score-c.score),i.slice(0,n)}searchHybrid(e,r,n,o=10){let s=this.searchFts(e,n,o*2);if(!r)return s.slice(0,o);let i=this.searchVector(r,n,o*2),a=new Map;for(let c of s)a.set(c.id,c);for(let c of i){let l=a.get(c.id);(!l||c.score>l.score)&&a.set(c.id,c)}return Array.from(a.values()).sort((c,l)=>l.score-c.score).slice(0,o)}listByUser(e,r=1,n=50,o=!0){let s=(r-1)*n,i=o?"AND is_archived = 0":"";return this.db.prepare(`
|
|
718
718
|
SELECT * FROM memories
|
|
719
719
|
WHERE user_id = ? ${i}
|
|
720
720
|
ORDER BY created_at DESC
|
|
@@ -904,11 +904,11 @@ END;
|
|
|
904
904
|
SELECT * FROM memory_conflicts
|
|
905
905
|
WHERE user_id = ?
|
|
906
906
|
ORDER BY updated_at DESC
|
|
907
|
-
`).all(e).map(zD)}close(){this.db.close()}};function ed(t){return{id:t.id,text:t.text,userId:t.user_id,category:t.category,importance:t.importance,confidence:t.confidence??1,source:t.source,sessionId:t.session_id,eventDate:t.event_date,tags:JSON.parse(t.tags||"[]"),embedding:t.embedding?new Float32Array(t.embedding.buffer,t.embedding.byteOffset,t.embedding.byteLength/4):null,createdAt:t.created_at,updatedAt:t.updated_at,accessCount:t.access_count,lastAccessedAt:t.last_accessed_at,isArchived:!!t.is_archived}}function hk(t){return{id:t.id,memoryId:t.memory_id??"",userId:t.user_id,entity:t.entity??"",predicate:t.predicate??"",value:VD(t.value_json),text:t.text,category:t.category,importance:t.importance,confidence:t.confidence,source:t.source,sourcePriority:t.source_priority,status:t.status,validTime:t.valid_time??"",evidenceIds:vk(t.evidence_ids),supersedesClaimId:t.supersedes_claim_id??"",conflictGroupId:t.conflict_group_id??"",createdAt:t.created_at,updatedAt:t.updated_at}}function zD(t){return{id:t.id,userId:t.user_id,claimAId:t.claim_a_id,claimBId:t.claim_b_id,reason:t.reason,status:t.status,createdAt:t.created_at,updatedAt:t.updated_at}}function VD(t){if(!t)return{};try{let e=JSON.parse(t);return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{return{}}}function vk(t){if(!t)return[];try{let e=JSON.parse(t);return Array.isArray(e)?e.filter(r=>typeof r=="string"):[]}catch{return[]}}function yk(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 XD(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}function kk(t=Er()){let e=ou(t);return Xs.existsSync(e)||Xs.mkdirSync(e,{recursive:!0}),bk.join(e,"memories.db")}var td=class{dimensions=0;model="none";async embed(e){return new Float32Array(0)}async embedBatch(e){return e.map(()=>new Float32Array(0))}},rd=class{dimensions;model;baseUrl;apiKey;timeoutMs;format;constructor(e){this.baseUrl=e.baseUrl.replace(/\/$/,""),this.apiKey=e.apiKey,this.model=e.model,this.dimensions=e.dimensions??1536,this.timeoutMs=e.timeoutMs??1e4,this.format=e.format??"openai"}async embed(e){return(await this.embedBatch([e]))[0]}async embedBatch(e){if(e.length===0)return[];let r=new AbortController,n=setTimeout(()=>r.abort(),this.timeoutMs);try{let{url:o,body:s}=this.buildRequest(e),i=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify(s),signal:r.signal});if(!i.ok){let c=await i.text().catch(()=>"");throw new Error(`Embedding API error [${this.format}]: ${i.status} ${i.statusText}${c?` \u2014 ${c.slice(0,200)}`:""}`)}let a=await i.json();return this.parseResponse(a,e.length)}finally{clearTimeout(n)}}buildRequest(e){switch(this.format){case"minimax":return{url:`${this.baseUrl}/v1/embeddings`,body:{model:this.model,texts:e,type:"db"}};case"volcengine":return{url:`${this.baseUrl}/v1/embeddings/multimodal`,body:{model:this.model,input:e.map(r=>({type:"text",text:r})),dimensions:this.dimensions}};default:return{url:`${this.baseUrl}/v1/embeddings`,body:{model:this.model,input:e,dimensions:this.dimensions}}}}parseResponse(e,r){switch(this.format){case"minimax":{let n=e.vectors;if(!n||n.length===0)throw new Error("MiniMax embedding returned empty vectors");return n.map(o=>new Float32Array(o))}case"volcengine":{let n=e.data;if(Array.isArray(n))return n.map(o=>new Float32Array(o.embedding));if(n?.embedding)return[new Float32Array(n.embedding)];throw new Error("Volcengine embedding returned unexpected structure")}default:{let n=e.data;if(!n||n.length===0)throw new Error("OpenAI embedding returned empty data");return n.sort((s,i)=>s.index-i.index).map(s=>new Float32Array(s.embedding))}}}};function Rk(t){return t?.api?new rd(t.api):new td}var YD={qwen:{format:"openai",baseUrl:"https://dashscope.aliyuncs.com/compatible-mode",defaultModel:"text-embedding-v3",defaultDimensions:1024},zhipu:{format:"openai",baseUrl:"https://open.bigmodel.cn/api/paas",defaultModel:"embedding-3",defaultDimensions:2048},minimax:{format:"minimax",baseUrl:"https://api.minimax.chat",defaultModel:"embo-01",defaultDimensions:1024},volcengine:{format:"volcengine",baseUrl:"https://ark.cn-beijing.volces.com/api",defaultModel:"doubao-embedding-vision-251215",defaultDimensions:1024},openai:{format:"openai",baseUrl:"https://api.openai.com",defaultModel:"text-embedding-3-small",defaultDimensions:1536},google:{format:"openai",baseUrl:"https://generativelanguage.googleapis.com",defaultModel:"text-embedding-004",defaultDimensions:768},deepseek:{format:"openai",baseUrl:"https://api.deepseek.com",defaultModel:"text-embedding-v1",defaultDimensions:1024}};function Sk(t,e,r){let n=YD[t.toLowerCase()];return n?{baseUrl:r?.baseUrl||n.baseUrl,apiKey:e,model:r?.model||n.defaultModel,dimensions:r?.dimensions||n.defaultDimensions,format:n.format}:null}var JD={observationsAdded:0,proposalsAdded:0,claimsAdded:0,conflictsAdded:0,memoriesAdded:0,observationIds:[],proposalIds:[],claimIds:[],conflictIds:[]},Qs=class{constructor(e,r){this.store=e;this.embed=r}store;embed;async observe(e,r,n){let o=Js(n?.source),s=Jn(o),i=od();for(let a of e){let c=a.text?.trim();if(!c)continue;let l=this.store.insertObservation({userId:r,text:c,source:o,sourcePriority:s,sessionId:n?.sessionId??"",evidenceType:"text",payload:{category:a.category,importance:a.importance,tags:a.tags??[]}});i.observationsAdded++,i.observationIds.push(l)}return i}async proposeExtracted(e,r,n){let o=Js(n?.source),s=Jn(o),i=od();for(let a of e){let c=a.text?.trim();if(!c)continue;let l=this.store.insertObservation({userId:r,text:c,source:o,sourcePriority:s,sessionId:n?.sessionId??"",evidenceType:"text",payload:{category:a.category,importance:a.importance,eventDate:a.event_date,tags:a.tags??[]}});i.observationsAdded++,i.observationIds.push(l);let d=Tk(c,a,o),u=this.store.insertProposal({userId:r,observationIds:[l],text:c,category:a.category??"general",importance:Jt(a.importance??.5,.1,1),confidence:d.confidence,source:o,sourcePriority:s,entity:d.entity,predicate:d.predicate,value:d.value,validTime:d.validTime,tags:a.tags??[],status:"pending"});i.proposalsAdded++,i.proposalIds.push(u)}return i}async commitExtracted(e,r,n){let o=Js(n?.source),s=Jn(o),i=od();for(let a of e){let c=a.text?.trim();if(!c)continue;let l=this.store.insertObservation({userId:r,text:c,source:o,sourcePriority:s,sessionId:n?.sessionId??"",evidenceType:"text",payload:{category:a.category,importance:a.importance,eventDate:a.event_date,tags:a.tags??[]}});i.observationsAdded++,i.observationIds.push(l);let d=Tk(c,a,o),u=this.store.insertProposal({userId:r,observationIds:[l],text:c,category:a.category??"general",importance:Jt(a.importance??.5,.1,1),confidence:d.confidence,source:o,sourcePriority:s,entity:d.entity,predicate:d.predicate,value:d.value,validTime:d.validTime,tags:a.tags??[],status:"pending"});i.proposalsAdded++,i.proposalIds.push(u);let p=this.store.findClaimsByFact(r,d.entity,d.predicate,d.validTime),m=p.find(b=>rN(b.value,d.value));if(m){this.store.mergeClaimEvidence(m.id,[l],Math.max(m.confidence,d.confidence),Jt(a.importance??m.importance,.1,1)),this.store.updateProposalStatus(u,"merged",[m.id]),i.claimIds.push(m.id);continue}let g=p.find(b=>b.status==="active"||b.status==="pending_confirmation");if(g){let b=this.store.insertClaim({userId:r,entity:d.entity,predicate:d.predicate,value:d.value,text:c,category:a.category??"general",importance:Jt(a.importance??.5,.1,1),confidence:d.confidence,source:o,sourcePriority:s,status:"conflicted",validTime:d.validTime,evidenceIds:[l]}),R=this.store.insertConflict({userId:r,claimAId:g.id,claimBId:b,reason:`same entity + same predicate + different value: ${d.entity}.${d.predicate}`});this.store.updateProposalStatus(u,"conflicted",[g.id,b]),i.claimsAdded++,i.conflictsAdded++,i.claimIds.push(b),i.conflictIds.push(R);continue}let f=QD(o,d.confidence),h=f==="active"?this.store.insert({text:c,userId:r,category:a.category??"general",importance:Jt(a.importance??.5,.1,1),confidence:d.confidence,source:o,sessionId:n?.sessionId??"",eventDate:a.event_date??"",tags:a.tags??[],embedding:await this.embed(c)}):"",v=this.store.insertClaim({userId:r,memoryId:h,entity:d.entity,predicate:d.predicate,value:d.value,text:c,category:a.category??"general",importance:Jt(a.importance??.5,.1,1),confidence:d.confidence,source:o,sourcePriority:s,status:f,validTime:d.validTime,evidenceIds:[l]});this.store.updateProposalStatus(u,f==="active"?"accepted":"pending",[v]),i.claimsAdded++,i.memoriesAdded+=h?1:0,i.claimIds.push(v)}return i}};function Jn(t){let e=Js(t);return e==="manual"||e==="user_edit"?100:e==="explicit"||e==="agent-remember"||e==="agent"?90:e==="document"||e==="image"||e==="video"?70:e==="auto"||e==="turn"?45:e==="dream"||e==="dream-consolidation"||e==="profile-extraction"?20:40}function QD(t,e){return Jn(t)>=45&&e>=.55?"active":"pending_confirmation"}function Tk(t,e,r){let n=oN(t),o=(e.tags??[]).join(" "),s=ZD(t,o),i=eN(t);if(i)return{entity:s,predicate:"contract_amount",value:i,validTime:wk(e.event_date),confidence:nd(r,.92)};let a=tN(t);if(a)return{entity:s,predicate:"progress_update_schedule",value:a,validTime:"",confidence:nd(r,.86)};let c=nN(e.category??"general");return{entity:s,predicate:c,value:{text:n},validTime:wk(e.event_date),confidence:nd(r,.7)}}function nd(t,e){let r=Jn(t);return r>=90?Jt(e+.04,.1,.99):r<=20?Jt(e-.18,.1,.95):Jt(e,.1,.98)}function ZD(t,e){let r=`${t} ${e}`;if(/Galaxy\s*Tech|Galaxy/i.test(r))return"Galaxy Tech";let n=r.match(/\b[A-Z][A-Za-z0-9]*(?:\s+[A-Z][A-Za-z0-9]*){0,3}\b/);if(n?.[0])return n[0].trim();let o=r.match(/([\u4e00-\u9fa5A-Za-z0-9]{2,18})(?:公司|客户|合同|项目)/);return o?.[1]?o[1]:"user"}function eN(t){if(!/(合同|contract)/i.test(t))return null;let e=t.match(/(\d+(?:\.\d+)?)\s*k\b/i);if(e)return{amount:Math.round(Number(e[1])*1e3),currency:Ys(t)};let r=t.match(/(\d+(?:\.\d+)?)\s*万/);if(r)return{amount:Math.round(Number(r[1])*1e4),currency:Ys(t)};let n=t.match(/(?:金额|amount)[^\d]*(\d{5,})/i);return n?{amount:Number(n[1]),currency:Ys(t)}:/一十八万/.test(t)?{amount:18e4,currency:Ys(t)}:null}function tN(t){if(!/(提醒|进展|更新|progress|schedule|每周)/i.test(t))return null;let e=/周一|星期一|Monday/i.test(t)?"monday":/周二|星期二|Tuesday/i.test(t)?"tuesday":/周三|星期三|Wednesday/i.test(t)?"wednesday":/周四|星期四|Thursday/i.test(t)?"thursday":/周五|星期五|Friday/i.test(t)?"friday":/周六|星期六|Saturday/i.test(t)?"saturday":/周日|周天|星期日|星期天|Sunday/i.test(t)?"sunday":"";if(!e)return null;let r=t.match(/(?:上午|早上)?\s*(\d{1,2})\s*点/);return{cadence:"weekly",weekday:e,hour:r?Number(r[1]):null}}function rN(t,e){return Ak(t)===Ak(e)}function Ak(t){let e=Object.keys(t).sort();return JSON.stringify(e.reduce((r,n)=>(r[n]=t[n],r),{}))}function Ys(t){return/[¥¥]|人民币|CNY/i.test(t)?"CNY":/\$|USD/i.test(t)?"USD":"unknown"}function nN(t){return t.trim().toLowerCase().replace(/[^a-z0-9_\-\u4e00-\u9fa5]+/g,"_")||"general"}function wk(t){if(!t)return"";let e=new Date(t);return Number.isNaN(e.getTime())?"":`${e.getUTCFullYear()}-${String(e.getUTCMonth()+1).padStart(2,"0")}`}function oN(t){return t.trim().replace(/\s+/g," ").toLowerCase()}function Js(t){return t?.trim()||"agent"}function Jt(t,e,r){return Number.isFinite(t)?Math.max(e,Math.min(r,t)):e}function od(){return{...JD,observationIds:[],proposalIds:[],claimIds:[],conflictIds:[]}}N();import*as Ht from"node:fs";var Pk="qmemory-local",id=class{providerId=Pk;store;embedding;consolidator;userIdPrefix;dbPath;constructor(e){if(this.dbPath=kk(e.ownerUserId),this.userIdPrefix=e.userIdPrefix??"",this.embedding=Rk(e.embedding),!e.createDatabase)throw new Error("LocalMemoryProvider requires a createDatabase factory. Install better-sqlite3 and pass: (path) => new Database(path)");e.migrateLegacyMemory&&sN(this.dbPath,e.createDatabase);let r=e.createDatabase(this.dbPath);this.store=new Vs(r),this.consolidator=new Qs(this.store,n=>this.buildEmbedding(n))}resolveUserId(e){return this.userIdPrefix?`${this.userIdPrefix}:${e}`:e}async buildEmbedding(e){if(this.embedding.dimensions!==0)try{let r=await this.embedding.embed(e);return r.length?r:void 0}catch{return}}async search(e,r,n){let o=this.resolveUserId(r),s=n?.limit??10,i=n?.minScore??.1,a=null;if(this.embedding.dimensions>0)try{a=await this.embedding.embed(e)}catch{}let c=Math.min(s*3,50),l=this.store.searchHybrid(e,a,o,c),d=this.rerank(l.map(u=>({id:u.id,text:u.text,score:u.score,category:u.category,metadata:{...u.metadata,createdAt:u.metadata?.createdAt,accessCount:u.metadata?.accessCount}})),{preferredCategories:n?.preferredCategories});for(let u of d.slice(0,3))this.store.recordAccess(u.id);return d.filter(u=>u.score>=i).slice(0,s).map(u=>({blockId:u.id,text:u.text,score:u.score,source:Pk,metadata:u.metadata}))}async ingest(e,r,n){let o=this.resolveUserId(r),s=e.filter(i=>i.content?.trim()&&i.content.trim().length>=10).map(i=>({text:i.content,category:"conversation",importance:.4}));await this.consolidator.observe(s,o,{source:n?.source??"turn",sessionId:n?.sessionId??""})}async addText(e,r,n){return this.ingestExtracted([{text:e,category:n?.category??"fact",importance:n?.importance??.6}],r,{...n,source:n?.source??"agent",sessionId:n?.sessionId??""})}async remove(e){return this.store.updateClaimsByMemoryId(e,"archived"),this.store.delete(e)}async update(e,r){let n=this.store.getById(e);if(!n)return!1;let o=r.text?.trim(),s=o&&o!==n.text?await this.buildEmbedding(o):void 0,i=this.store.update(e,{...r,text:o||void 0,embedding:s});return i&&this.store.updateClaimsByMemoryId(e,"superseded"),i}async ingestExtracted(e,r,n){if(e.length===0)return sd();let o=this.resolveUserId(r);return this.consolidator.commitExtracted(e,o,{source:n?.source??"agent",sessionId:n?.sessionId??""})}async observeExtracted(e,r,n){return e.length===0?sd():this.consolidator.observe(e,this.resolveUserId(r),{source:n?.source??"agent",sessionId:n?.sessionId??""})}async proposeExtracted(e,r,n){return e.length===0?sd():this.consolidator.proposeExtracted(e,this.resolveUserId(r),{source:n?.source??"agent",sessionId:n?.sessionId??""})}listClaims(e){return this.store.listClaims(this.resolveUserId(e))}listConflicts(e){return this.store.listConflicts(this.resolveUserId(e))}async triggerDecay(e,r=90){let n=this.resolveUserId(e),o=this.store.runFullDecay(n),s=this.store.enforceCapacityLimit(n,1e4);return o.total+s>10&&(this.store.exportAndPurgeArchived(n,200),this.store.vacuum()),{decayed:o.total+s}}async feedback(e,r){let n=0;for(let o of e)this.store.applyFeedback(o,r)&&n++;return{affected:n}}getProfile(e,r){return this.store.getProfile(this.resolveUserId(e),r)}setProfile(e,r,n){this.store.setProfile(this.resolveUserId(e),r,n)}getAllProfiles(e){return this.store.getAllProfiles(this.resolveUserId(e))}deleteProfile(e,r){return this.store.deleteProfile(this.resolveUserId(e),r)}getTemporalSlice(e,r,n,o){return this.store.getTemporalSlice(this.resolveUserId(e),r,n,o)}getActivitySummary(e,r=7){return this.store.getActivitySummary(this.resolveUserId(e),r)}list(e,r){return this.store.listByUser(this.resolveUserId(e),r?.page??1,r?.pageSize??500,r?.activeOnly??!0)}getAtlas(e,r){return this.store.getAtlas(this.resolveUserId(e),r)}findByEventDate(e,r,n=1){return this.store.findByEventDate(this.resolveUserId(e),r,n)}async findRelatedEvents(e,r,n){let o=this.resolveUserId(r),s=n?.minSimilarity??.55,i=n?.maxSimilarity??.82,a=n?.maxDaysBack??14,c=n?.limit??5;if(this.embedding.dimensions===0)return[];let l;try{l=await this.embedding.embed(e)}catch{return[]}let d=this.store.searchVector(l,o,c*3,s),u=Date.now()-a*864e5;return d.filter(p=>{let m=p.metadata?.cosineSimilarity??p.score,g=p.metadata?.createdAt??0;return m>=s&&m<i&&g>=u}).slice(0,c).map(p=>({id:p.id,text:p.text,score:p.metadata?.cosineSimilarity??p.score,date:new Date(p.metadata?.createdAt??Date.now()).toISOString().slice(0,10)}))}synthesizeTimeline(e,r,n){let o=this.getTemporalSlice(e,r,n);if(o.length===0)return"No memories in this time range.";let s=[];for(let i of o){s.push(`## ${i.date}`);for(let a of i.memories){let c=a.importance>=.7?"*":"-";s.push(`${c} [${a.category}] ${a.text}`)}}return s.join(`
|
|
908
|
-
`)}rerank(e,r){let n=(r?.recencyBoostDays??7)*864e5,o=Date.now(),s=new Set(r?.preferredCategories??[]);return e.map(i=>{let a=i.score,c=i.metadata?.createdAt??0;if(c>0){let d=o-c;d<n&&(a+=.1*(1-d/n))}let l=i.metadata?.accessCount??0;return l>0&&(a+=Math.min(.05,l*.01)),s.size>0&&i.category&&s.has(i.category)&&(a+=.08),{...i,score:Math.min(1,a)}}).sort((i,a)=>a.score-i.score)}async health(){return{status:"healthy",memoryCount:0,dbPath:this.dbPath}}count(e){return this.store.count(this.resolveUserId(e))}async resetUser(e){return this.store.resetUser(this.resolveUserId(e))}close(){this.store.close()}};function Ck(t){return new id(t)}function
|
|
907
|
+
`).all(e).map(XD)}close(){this.db.close()}};function ed(t){return{id:t.id,text:t.text,userId:t.user_id,category:t.category,importance:t.importance,confidence:t.confidence??1,source:t.source,sessionId:t.session_id,eventDate:t.event_date,tags:JSON.parse(t.tags||"[]"),embedding:t.embedding?new Float32Array(t.embedding.buffer,t.embedding.byteOffset,t.embedding.byteLength/4):null,createdAt:t.created_at,updatedAt:t.updated_at,accessCount:t.access_count,lastAccessedAt:t.last_accessed_at,isArchived:!!t.is_archived}}function hk(t){return{id:t.id,memoryId:t.memory_id??"",userId:t.user_id,entity:t.entity??"",predicate:t.predicate??"",value:YD(t.value_json),text:t.text,category:t.category,importance:t.importance,confidence:t.confidence,source:t.source,sourcePriority:t.source_priority,status:t.status,validTime:t.valid_time??"",evidenceIds:vk(t.evidence_ids),supersedesClaimId:t.supersedes_claim_id??"",conflictGroupId:t.conflict_group_id??"",createdAt:t.created_at,updatedAt:t.updated_at}}function XD(t){return{id:t.id,userId:t.user_id,claimAId:t.claim_a_id,claimBId:t.claim_b_id,reason:t.reason,status:t.status,createdAt:t.created_at,updatedAt:t.updated_at}}function YD(t){if(!t)return{};try{let e=JSON.parse(t);return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}catch{return{}}}function vk(t){if(!t)return[];try{let e=JSON.parse(t);return Array.isArray(e)?e.filter(r=>typeof r=="string"):[]}catch{return[]}}function yk(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 JD(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}function kk(t=Er()){let e=ou(t);return Xs.existsSync(e)||Xs.mkdirSync(e,{recursive:!0}),bk.join(e,"memories.db")}var td=class{dimensions=0;model="none";async embed(e){return new Float32Array(0)}async embedBatch(e){return e.map(()=>new Float32Array(0))}},rd=class{dimensions;model;baseUrl;apiKey;timeoutMs;format;constructor(e){this.baseUrl=e.baseUrl.replace(/\/$/,""),this.apiKey=e.apiKey,this.model=e.model,this.dimensions=e.dimensions??1536,this.timeoutMs=e.timeoutMs??1e4,this.format=e.format??"openai"}async embed(e){return(await this.embedBatch([e]))[0]}async embedBatch(e){if(e.length===0)return[];let r=new AbortController,n=setTimeout(()=>r.abort(),this.timeoutMs);try{let{url:o,body:s}=this.buildRequest(e),i=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify(s),signal:r.signal});if(!i.ok){let c=await i.text().catch(()=>"");throw new Error(`Embedding API error [${this.format}]: ${i.status} ${i.statusText}${c?` \u2014 ${c.slice(0,200)}`:""}`)}let a=await i.json();return this.parseResponse(a,e.length)}finally{clearTimeout(n)}}buildRequest(e){switch(this.format){case"minimax":return{url:`${this.baseUrl}/v1/embeddings`,body:{model:this.model,texts:e,type:"db"}};case"volcengine":return{url:`${this.baseUrl}/v1/embeddings/multimodal`,body:{model:this.model,input:e.map(r=>({type:"text",text:r})),dimensions:this.dimensions}};default:return{url:`${this.baseUrl}/v1/embeddings`,body:{model:this.model,input:e,dimensions:this.dimensions}}}}parseResponse(e,r){switch(this.format){case"minimax":{let n=e.vectors;if(!n||n.length===0)throw new Error("MiniMax embedding returned empty vectors");return n.map(o=>new Float32Array(o))}case"volcengine":{let n=e.data;if(Array.isArray(n))return n.map(o=>new Float32Array(o.embedding));if(n?.embedding)return[new Float32Array(n.embedding)];throw new Error("Volcengine embedding returned unexpected structure")}default:{let n=e.data;if(!n||n.length===0)throw new Error("OpenAI embedding returned empty data");return n.sort((s,i)=>s.index-i.index).map(s=>new Float32Array(s.embedding))}}}};function Rk(t){return t?.api?new rd(t.api):new td}var QD={qwen:{format:"openai",baseUrl:"https://dashscope.aliyuncs.com/compatible-mode",defaultModel:"text-embedding-v3",defaultDimensions:1024},zhipu:{format:"openai",baseUrl:"https://open.bigmodel.cn/api/paas",defaultModel:"embedding-3",defaultDimensions:2048},minimax:{format:"minimax",baseUrl:"https://api.minimax.chat",defaultModel:"embo-01",defaultDimensions:1024},volcengine:{format:"volcengine",baseUrl:"https://ark.cn-beijing.volces.com/api",defaultModel:"doubao-embedding-vision-251215",defaultDimensions:1024},openai:{format:"openai",baseUrl:"https://api.openai.com",defaultModel:"text-embedding-3-small",defaultDimensions:1536},google:{format:"openai",baseUrl:"https://generativelanguage.googleapis.com",defaultModel:"text-embedding-004",defaultDimensions:768},deepseek:{format:"openai",baseUrl:"https://api.deepseek.com",defaultModel:"text-embedding-v1",defaultDimensions:1024}};function Sk(t,e,r){let n=QD[t.toLowerCase()];return n?{baseUrl:r?.baseUrl||n.baseUrl,apiKey:e,model:r?.model||n.defaultModel,dimensions:r?.dimensions||n.defaultDimensions,format:n.format}:null}var ZD={observationsAdded:0,proposalsAdded:0,claimsAdded:0,conflictsAdded:0,memoriesAdded:0,observationIds:[],proposalIds:[],claimIds:[],conflictIds:[]},Qs=class{constructor(e,r){this.store=e;this.embed=r}store;embed;async observe(e,r,n){let o=Js(n?.source),s=Jn(o),i=od();for(let a of e){let c=a.text?.trim();if(!c)continue;let l=this.store.insertObservation({userId:r,text:c,source:o,sourcePriority:s,sessionId:n?.sessionId??"",evidenceType:"text",payload:{category:a.category,importance:a.importance,tags:a.tags??[]}});i.observationsAdded++,i.observationIds.push(l)}return i}async proposeExtracted(e,r,n){let o=Js(n?.source),s=Jn(o),i=od();for(let a of e){let c=a.text?.trim();if(!c)continue;let l=this.store.insertObservation({userId:r,text:c,source:o,sourcePriority:s,sessionId:n?.sessionId??"",evidenceType:"text",payload:{category:a.category,importance:a.importance,eventDate:a.event_date,tags:a.tags??[]}});i.observationsAdded++,i.observationIds.push(l);let d=Tk(c,a,o),u=this.store.insertProposal({userId:r,observationIds:[l],text:c,category:a.category??"general",importance:Jt(a.importance??.5,.1,1),confidence:d.confidence,source:o,sourcePriority:s,entity:d.entity,predicate:d.predicate,value:d.value,validTime:d.validTime,tags:a.tags??[],status:"pending"});i.proposalsAdded++,i.proposalIds.push(u)}return i}async commitExtracted(e,r,n){let o=Js(n?.source),s=Jn(o),i=od();for(let a of e){let c=a.text?.trim();if(!c)continue;let l=this.store.insertObservation({userId:r,text:c,source:o,sourcePriority:s,sessionId:n?.sessionId??"",evidenceType:"text",payload:{category:a.category,importance:a.importance,eventDate:a.event_date,tags:a.tags??[]}});i.observationsAdded++,i.observationIds.push(l);let d=Tk(c,a,o),u=this.store.insertProposal({userId:r,observationIds:[l],text:c,category:a.category??"general",importance:Jt(a.importance??.5,.1,1),confidence:d.confidence,source:o,sourcePriority:s,entity:d.entity,predicate:d.predicate,value:d.value,validTime:d.validTime,tags:a.tags??[],status:"pending"});i.proposalsAdded++,i.proposalIds.push(u);let p=this.store.findClaimsByFact(r,d.entity,d.predicate,d.validTime),m=p.find(b=>oN(b.value,d.value));if(m){this.store.mergeClaimEvidence(m.id,[l],Math.max(m.confidence,d.confidence),Jt(a.importance??m.importance,.1,1)),this.store.updateProposalStatus(u,"merged",[m.id]),i.claimIds.push(m.id);continue}let g=p.find(b=>b.status==="active"||b.status==="pending_confirmation");if(g){let b=this.store.insertClaim({userId:r,entity:d.entity,predicate:d.predicate,value:d.value,text:c,category:a.category??"general",importance:Jt(a.importance??.5,.1,1),confidence:d.confidence,source:o,sourcePriority:s,status:"conflicted",validTime:d.validTime,evidenceIds:[l]}),R=this.store.insertConflict({userId:r,claimAId:g.id,claimBId:b,reason:`same entity + same predicate + different value: ${d.entity}.${d.predicate}`});this.store.updateProposalStatus(u,"conflicted",[g.id,b]),i.claimsAdded++,i.conflictsAdded++,i.claimIds.push(b),i.conflictIds.push(R);continue}let f=eN(o,d.confidence),h=f==="active"?this.store.insert({text:c,userId:r,category:a.category??"general",importance:Jt(a.importance??.5,.1,1),confidence:d.confidence,source:o,sessionId:n?.sessionId??"",eventDate:a.event_date??"",tags:a.tags??[],embedding:await this.embed(c)}):"",v=this.store.insertClaim({userId:r,memoryId:h,entity:d.entity,predicate:d.predicate,value:d.value,text:c,category:a.category??"general",importance:Jt(a.importance??.5,.1,1),confidence:d.confidence,source:o,sourcePriority:s,status:f,validTime:d.validTime,evidenceIds:[l]});this.store.updateProposalStatus(u,f==="active"?"accepted":"pending",[v]),i.claimsAdded++,i.memoriesAdded+=h?1:0,i.claimIds.push(v)}return i}};function Jn(t){let e=Js(t);return e==="manual"||e==="user_edit"?100:e==="explicit"||e==="agent-remember"||e==="agent"?90:e==="document"||e==="image"||e==="video"?70:e==="auto"||e==="turn"?45:e==="dream"||e==="dream-consolidation"||e==="profile-extraction"?20:40}function eN(t,e){return Jn(t)>=45&&e>=.55?"active":"pending_confirmation"}function Tk(t,e,r){let n=iN(t),o=(e.tags??[]).join(" "),s=tN(t,o),i=rN(t);if(i)return{entity:s,predicate:"contract_amount",value:i,validTime:wk(e.event_date),confidence:nd(r,.92)};let a=nN(t);if(a)return{entity:s,predicate:"progress_update_schedule",value:a,validTime:"",confidence:nd(r,.86)};let c=sN(e.category??"general");return{entity:s,predicate:c,value:{text:n},validTime:wk(e.event_date),confidence:nd(r,.7)}}function nd(t,e){let r=Jn(t);return r>=90?Jt(e+.04,.1,.99):r<=20?Jt(e-.18,.1,.95):Jt(e,.1,.98)}function tN(t,e){let r=`${t} ${e}`;if(/Galaxy\s*Tech|Galaxy/i.test(r))return"Galaxy Tech";let n=r.match(/\b[A-Z][A-Za-z0-9]*(?:\s+[A-Z][A-Za-z0-9]*){0,3}\b/);if(n?.[0])return n[0].trim();let o=r.match(/([\u4e00-\u9fa5A-Za-z0-9]{2,18})(?:公司|客户|合同|项目)/);return o?.[1]?o[1]:"user"}function rN(t){if(!/(合同|contract)/i.test(t))return null;let e=t.match(/(\d+(?:\.\d+)?)\s*k\b/i);if(e)return{amount:Math.round(Number(e[1])*1e3),currency:Ys(t)};let r=t.match(/(\d+(?:\.\d+)?)\s*万/);if(r)return{amount:Math.round(Number(r[1])*1e4),currency:Ys(t)};let n=t.match(/(?:金额|amount)[^\d]*(\d{5,})/i);return n?{amount:Number(n[1]),currency:Ys(t)}:/一十八万/.test(t)?{amount:18e4,currency:Ys(t)}:null}function nN(t){if(!/(提醒|进展|更新|progress|schedule|每周)/i.test(t))return null;let e=/周一|星期一|Monday/i.test(t)?"monday":/周二|星期二|Tuesday/i.test(t)?"tuesday":/周三|星期三|Wednesday/i.test(t)?"wednesday":/周四|星期四|Thursday/i.test(t)?"thursday":/周五|星期五|Friday/i.test(t)?"friday":/周六|星期六|Saturday/i.test(t)?"saturday":/周日|周天|星期日|星期天|Sunday/i.test(t)?"sunday":"";if(!e)return null;let r=t.match(/(?:上午|早上)?\s*(\d{1,2})\s*点/);return{cadence:"weekly",weekday:e,hour:r?Number(r[1]):null}}function oN(t,e){return Ak(t)===Ak(e)}function Ak(t){let e=Object.keys(t).sort();return JSON.stringify(e.reduce((r,n)=>(r[n]=t[n],r),{}))}function Ys(t){return/[¥¥]|人民币|CNY/i.test(t)?"CNY":/\$|USD/i.test(t)?"USD":"unknown"}function sN(t){return t.trim().toLowerCase().replace(/[^a-z0-9_\-\u4e00-\u9fa5]+/g,"_")||"general"}function wk(t){if(!t)return"";let e=new Date(t);return Number.isNaN(e.getTime())?"":`${e.getUTCFullYear()}-${String(e.getUTCMonth()+1).padStart(2,"0")}`}function iN(t){return t.trim().replace(/\s+/g," ").toLowerCase()}function Js(t){return t?.trim()||"agent"}function Jt(t,e,r){return Number.isFinite(t)?Math.max(e,Math.min(r,t)):e}function od(){return{...ZD,observationIds:[],proposalIds:[],claimIds:[],conflictIds:[]}}N();import*as Ht from"node:fs";var Pk="qmemory-local",id=class{providerId=Pk;store;embedding;consolidator;userIdPrefix;dbPath;constructor(e){if(this.dbPath=kk(e.ownerUserId),this.userIdPrefix=e.userIdPrefix??"",this.embedding=Rk(e.embedding),!e.createDatabase)throw new Error("LocalMemoryProvider requires a createDatabase factory. Install better-sqlite3 and pass: (path) => new Database(path)");e.migrateLegacyMemory&&aN(this.dbPath,e.createDatabase);let r=e.createDatabase(this.dbPath);this.store=new Vs(r),this.consolidator=new Qs(this.store,n=>this.buildEmbedding(n))}resolveUserId(e){return this.userIdPrefix?`${this.userIdPrefix}:${e}`:e}async buildEmbedding(e){if(this.embedding.dimensions!==0)try{let r=await this.embedding.embed(e);return r.length?r:void 0}catch{return}}async search(e,r,n){let o=this.resolveUserId(r),s=n?.limit??10,i=n?.minScore??.1,a=null;if(this.embedding.dimensions>0)try{a=await this.embedding.embed(e)}catch{}let c=Math.min(s*3,50),l=this.store.searchHybrid(e,a,o,c),d=this.rerank(l.map(u=>({id:u.id,text:u.text,score:u.score,category:u.category,metadata:{...u.metadata,createdAt:u.metadata?.createdAt,accessCount:u.metadata?.accessCount}})),{preferredCategories:n?.preferredCategories});for(let u of d.slice(0,3))this.store.recordAccess(u.id);return d.filter(u=>u.score>=i).slice(0,s).map(u=>({blockId:u.id,text:u.text,score:u.score,source:Pk,metadata:u.metadata}))}async ingest(e,r,n){let o=this.resolveUserId(r),s=e.filter(i=>i.content?.trim()&&i.content.trim().length>=10).map(i=>({text:i.content,category:"conversation",importance:.4}));await this.consolidator.observe(s,o,{source:n?.source??"turn",sessionId:n?.sessionId??""})}async addText(e,r,n){return this.ingestExtracted([{text:e,category:n?.category??"fact",importance:n?.importance??.6}],r,{...n,source:n?.source??"agent",sessionId:n?.sessionId??""})}async remove(e){return this.store.updateClaimsByMemoryId(e,"archived"),this.store.delete(e)}async update(e,r){let n=this.store.getById(e);if(!n)return!1;let o=r.text?.trim(),s=o&&o!==n.text?await this.buildEmbedding(o):void 0,i=this.store.update(e,{...r,text:o||void 0,embedding:s});return i&&this.store.updateClaimsByMemoryId(e,"superseded"),i}async ingestExtracted(e,r,n){if(e.length===0)return sd();let o=this.resolveUserId(r);return this.consolidator.commitExtracted(e,o,{source:n?.source??"agent",sessionId:n?.sessionId??""})}async observeExtracted(e,r,n){return e.length===0?sd():this.consolidator.observe(e,this.resolveUserId(r),{source:n?.source??"agent",sessionId:n?.sessionId??""})}async proposeExtracted(e,r,n){return e.length===0?sd():this.consolidator.proposeExtracted(e,this.resolveUserId(r),{source:n?.source??"agent",sessionId:n?.sessionId??""})}listClaims(e){return this.store.listClaims(this.resolveUserId(e))}listConflicts(e){return this.store.listConflicts(this.resolveUserId(e))}async triggerDecay(e,r=90){let n=this.resolveUserId(e),o=this.store.runFullDecay(n),s=this.store.enforceCapacityLimit(n,1e4);return o.total+s>10&&(this.store.exportAndPurgeArchived(n,200),this.store.vacuum()),{decayed:o.total+s}}async feedback(e,r){let n=0;for(let o of e)this.store.applyFeedback(o,r)&&n++;return{affected:n}}getProfile(e,r){return this.store.getProfile(this.resolveUserId(e),r)}setProfile(e,r,n){this.store.setProfile(this.resolveUserId(e),r,n)}getAllProfiles(e){return this.store.getAllProfiles(this.resolveUserId(e))}deleteProfile(e,r){return this.store.deleteProfile(this.resolveUserId(e),r)}getTemporalSlice(e,r,n,o){return this.store.getTemporalSlice(this.resolveUserId(e),r,n,o)}getActivitySummary(e,r=7){return this.store.getActivitySummary(this.resolveUserId(e),r)}list(e,r){return this.store.listByUser(this.resolveUserId(e),r?.page??1,r?.pageSize??500,r?.activeOnly??!0)}getAtlas(e,r){return this.store.getAtlas(this.resolveUserId(e),r)}findByEventDate(e,r,n=1){return this.store.findByEventDate(this.resolveUserId(e),r,n)}async findRelatedEvents(e,r,n){let o=this.resolveUserId(r),s=n?.minSimilarity??.55,i=n?.maxSimilarity??.82,a=n?.maxDaysBack??14,c=n?.limit??5;if(this.embedding.dimensions===0)return[];let l;try{l=await this.embedding.embed(e)}catch{return[]}let d=this.store.searchVector(l,o,c*3,s),u=Date.now()-a*864e5;return d.filter(p=>{let m=p.metadata?.cosineSimilarity??p.score,g=p.metadata?.createdAt??0;return m>=s&&m<i&&g>=u}).slice(0,c).map(p=>({id:p.id,text:p.text,score:p.metadata?.cosineSimilarity??p.score,date:new Date(p.metadata?.createdAt??Date.now()).toISOString().slice(0,10)}))}synthesizeTimeline(e,r,n){let o=this.getTemporalSlice(e,r,n);if(o.length===0)return"No memories in this time range.";let s=[];for(let i of o){s.push(`## ${i.date}`);for(let a of i.memories){let c=a.importance>=.7?"*":"-";s.push(`${c} [${a.category}] ${a.text}`)}}return s.join(`
|
|
908
|
+
`)}rerank(e,r){let n=(r?.recencyBoostDays??7)*864e5,o=Date.now(),s=new Set(r?.preferredCategories??[]);return e.map(i=>{let a=i.score,c=i.metadata?.createdAt??0;if(c>0){let d=o-c;d<n&&(a+=.1*(1-d/n))}let l=i.metadata?.accessCount??0;return l>0&&(a+=Math.min(.05,l*.01)),s.size>0&&i.category&&s.has(i.category)&&(a+=.08),{...i,score:Math.min(1,a)}}).sort((i,a)=>a.score-i.score)}async health(){return{status:"healthy",memoryCount:0,dbPath:this.dbPath}}count(e){return this.store.count(this.resolveUserId(e))}async resetUser(e){return this.store.resetUser(this.resolveUserId(e))}close(){this.store.close()}};function Ck(t){return new id(t)}function aN(t,e){let r=nu();t===r||!Ht.existsSync(r)||xk(t,e)>0||xk(r,e)===0||(Ht.mkdirSync(lN(t),{recursive:!0}),cN(r,t))}function xk(t,e){let r=null;try{r=e(t),r.pragma("wal_checkpoint(FULL)");let n=r.prepare("SELECT COUNT(*) AS count FROM memories").get();return Number(n?.count??0)}catch{return 0}finally{try{r?.close()}catch{}}}function cN(t,e){for(let r of["","-wal","-shm"]){let n=`${e}${r}`;Ht.existsSync(n)&&Ht.rmSync(n,{force:!0})}for(let r of["","-wal","-shm"]){let n=`${t}${r}`;Ht.existsSync(n)&&Ht.copyFileSync(n,`${e}${r}`)}}function lN(t){return t.replace(/[/\\][^/\\]+$/,"")}function sd(){return{observationsAdded:0,proposalsAdded:0,claimsAdded:0,conflictsAdded:0,memoriesAdded:0,observationIds:[],proposalIds:[],claimIds:[],conflictIds:[]}}qe();N();function Ik(t){try{let e=uN();if(e){let r={projectRoot:t.projectRoot,ownerUserId:t.ownerUserId,userIdPrefix:t.userIdPrefix,embedding:t.embedding,createDatabase:e,migrateLegacyMemory:!0};return{provider:Ck(r),mode:"local"}}}catch(e){return{provider:null,mode:"none",error:`Local provider failed: ${e.message}`}}return{provider:null,mode:"none",error:"better-sqlite3 not available"}}function uN(){try{let e=dN(import.meta.url)("better-sqlite3"),r=e.default??e;if(typeof r!="function")return null;let n=r;return o=>new n(o)}catch{return null}}function Ek(t){let e=process.env.QMEMORY_USER_PREFIX||void 0,r=Er(),o=M().getActiveModel("embedding");if(o){let i=mN({provider:o.provider,apiKey:o.apiKey,model:o.model||"text-embedding-3-small",baseUrl:o.baseUrl}),a={projectRoot:t,ownerUserId:r,userIdPrefix:e,embedding:{api:i}};return o.keyHandle.release({success:!0}),a}let s=pN();return{projectRoot:t,ownerUserId:r,userIdPrefix:e,embedding:s?{api:s}:void 0}}function pN(){let t=_k(process.env.QLOGIC_LLMROUTER_BASE_URL);if(!t)return;let e=process.env.QLOGIC_LLMROUTER_ACCESS_TOKEN?.trim();if(!e)return;let r=parseInt(process.env.QLOGIC_LLMROUTER_EMBEDDING_DIMENSIONS||process.env.QMEMORY_EMBEDDING_DIMENSIONS||"1024",10);return{baseUrl:t,apiKey:e,model:process.env.QLOGIC_LLMROUTER_EMBEDDING_MODEL||"BAAI/bge-m3",dimensions:Number.isFinite(r)?r:1024,format:"openai",timeoutMs:Mk()}}function mN(t){return{...Sk(t.provider,t.apiKey,{model:t.model,baseUrl:t.baseUrl})??{baseUrl:_k(t.baseUrl)||"",apiKey:t.apiKey,model:t.model,format:"openai"},timeoutMs:Mk()}}function _k(t){return t?.trim().replace(/\/+$/,"")??""}function Mk(){let t=parseInt(process.env.QMEMORY_EMBEDDING_TIMEOUT_MS||"1500",10);return Number.isFinite(t)&&t>0?t:1500}var Dk="memory",Nk="Memory",gN=["add","replace","remove","create_file","write_file","read_file","delete_file","list_files","search","remember","temporal","feedback"],Lk={type:"object",properties:{action:{type:"string",enum:gN,description:["Operation to perform:","","INDEX.md operations (project-level notes, always visible in system prompt):","- 'add' - Append a note to INDEX.md","- 'replace' - Replace text in INDEX.md (str_replace semantics)","- 'remove' - Remove text from INDEX.md","","Topic file operations (project-level, on-demand, for longer content):","- 'create_file' - Create a new .md topic file","- 'write_file' - Overwrite an existing topic file","- 'read_file' - Read a topic file","- 'delete_file' - Delete a topic file","- 'list_files' - List all memory topic files","","Long-term memory (user-level, persists across projects):","- 'remember' - Submit a fact/preference/lesson to the memory consolidation pipeline","- 'search' - Search long-term memory + local keyword match","- 'temporal' - Query memories by time range ('what happened last week')","","Feedback:","- 'feedback' - Mark memories as useful/irrelevant/outdated/wrong"].join(`
|
|
909
909
|
`)},content:{type:"string",description:["Content for add/replace/create_file/write_file.","For INDEX.md notes: write concise, factual statements.","For topic files: can be longer (up to 8KB), use markdown formatting."].join(`
|
|
910
910
|
`)},old_text:{type:"string",description:"For 'replace'/'remove': the exact text to find in INDEX.md."},new_text:{type:"string",description:"For 'replace': the replacement text."},file:{type:"string",description:"Filename for file operations (e.g. 'project-notes.md', 'lesson-esbuild.md'). Must be kebab-case .md."},query:{type:"string",description:"For 'search'/'temporal': natural language query to find relevant memories."},days:{type:"number",description:"For 'temporal': look back N days from today (default: 7)."},memory_ids:{type:"array",items:{type:"string"},description:"For 'feedback': IDs of memories to give feedback on."},signal:{type:"string",enum:["useful","irrelevant","outdated","wrong"],description:"For 'feedback': the feedback signal to apply."},category:{type:"string",enum:["preference","personal_fact","lesson","pattern","decision","context"],description:"For 'remember': categorize the memory (helps with future recall precision)."}},required:["action"]},Ok=["Manage persistent memory across sessions. Two distinct systems with clear roles:","","## Project memory (INDEX.md + topic files)","Scope: current project / workspace. Visible every turn.","Use for: architecture decisions, file conventions, build commands, known issues, task logs.","Actions: add, replace, remove, create_file, write_file, read_file, delete_file, list_files.","","## Long-term memory (QMemory)","Scope: user-level, persists across all projects. Searched on demand.","Use for: user preferences, personal facts, recurring lessons, communication style, past insights.","Actions: remember, search, temporal, feedback.","","## When to store (guidelines):","- User explicitly says 'remember this' or 'note that' -> submit a high-priority memory candidate","- User states a preference (style, format, tools, habits) -> remember (long-term)","- Project-specific decision or fact -> add/create_file (project memory)","- A debugging lesson or insight that applies broadly -> remember (long-term)","- DO NOT store: trivial/obvious info, one-off questions, transient state","- DO NOT store: information the user did not share or confirm","","## When to recall:","- Use 'search' when you suspect relevant past context exists for the current task","- Use 'temporal' to find what happened in a specific time period","- Memory is auto-recalled each turn - manual search is for deeper queries"].join(`
|
|
911
|
-
`),
|
|
911
|
+
`),fN=[/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 hN(t){return!fN.some(e=>e.test(t))}async function jk(t,e){let{action:r}=t,{memdir:n}=e;if(r==="add"){let o=t.content?.trim();if(!o)return{ok:!1,message:"content is required for 'add'.",action:r};let s=await n.addToIndex(o);return{ok:s.ok,message:s.message,action:r}}if(r==="replace"){let o=t.old_text?.trim(),s=t.new_text?.trim()||t.content?.trim();if(!o)return{ok:!1,message:"old_text is required for 'replace'.",action:r};if(!s)return{ok:!1,message:"new_text (or content) is required for 'replace'.",action:r};let i=await n.replaceInIndex(o,s);return{ok:i.ok,message:i.message,action:r}}if(r==="remove"){let o=t.old_text?.trim();if(!o)return{ok:!1,message:"old_text is required for 'remove'.",action:r};let s=await n.removeFromIndex(o);return{ok:s.ok,message:s.message,action:r}}if(r==="create_file"){let o=t.file?.trim(),s=t.content?.trim();if(!o)return{ok:!1,message:"file is required for 'create_file'.",action:r};if(!s)return{ok:!1,message:"content is required for 'create_file'.",action:r};let i=await n.createFile(o,s);return{ok:i.ok,message:i.message,action:r}}if(r==="write_file"){let o=t.file?.trim(),s=t.content?.trim();if(!o)return{ok:!1,message:"file is required for 'write_file'.",action:r};if(!s)return{ok:!1,message:"content is required for 'write_file'.",action:r};let i=await n.writeFile(o,s);return{ok:i.ok,message:i.message,action:r}}if(r==="read_file"){let o=t.file?.trim();if(!o)return{ok:!1,message:"file is required for 'read_file'.",action:r};let s=await n.readFile(o);return s.ok?{ok:!0,message:s.content,action:r}:{ok:!1,message:s.message,action:r}}if(r==="delete_file"){let o=t.file?.trim();if(!o)return{ok:!1,message:"file is required for 'delete_file'.",action:r};let s=await n.deleteFile(o);return{ok:s.ok,message:s.message,action:r}}if(r==="list_files"){let o=await n.listFiles();if(o.length===0)return{ok:!0,message:"No topic files yet. Use 'create_file' to create one.",action:r};let s=o.map(i=>{let a=(i.size/1024).toFixed(1),c=i.modifiedAt.slice(0,10);return`--${i.name} (${a}KB, ${c})${i.preview?""+i.preview:""}`}).join(`
|
|
912
912
|
`);return{ok:!0,message:`Memory files (${o.length}):
|
|
913
913
|
${s}`,action:r}}if(r==="search"){let o=t.query?.trim();if(!o)return{ok:!1,message:"query is required for 'search'.",action:r};let s=[],i;try{let a=await n.searchLocal(o);a.length>0&&s.push(`## Local Memory
|
|
914
914
|
`+a.map(c=>`--[${c.file}] ${c.snippet}`).join(`
|
|
@@ -916,39 +916,39 @@ ${s}`,action:r}}if(r==="search"){let o=t.query?.trim();if(!o)return{ok:!1,messag
|
|
|
916
916
|
`+a.map((c,l)=>`${l+1}. ${c.text}`).join(`
|
|
917
917
|
`))}catch{}return s.length===0?{ok:!0,message:"No matching memories found.",action:r,results:[]}:{ok:!0,message:s.join(`
|
|
918
918
|
|
|
919
|
-
`),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(!
|
|
919
|
+
`),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(!hN(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 $k(t,e){return{recallProvider:t,runtimeHookProvider:t,learningSink:t,toolProvider:t,handlerProvider:t,dreamProvider:t,userId:e}}function ad(t,e){try{let r=Ek(t),n=Ik(r);if(n.provider)return $k(n.provider,r.ownerUserId||e)}catch{}return $k(null,e)}function Uk(t){let e=ad(t.projectRoot,t.currentUserId);return!e.recallProvider||!e.runtimeHookProvider||!e.userId||(eu(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 Fk(t){K({name:Dk,label:Nk,description:Ok,parameters:Lk,execute:async(e,r)=>{let n=t.memoryUserId?t.memoryProvider??void 0:void 0,o=await jk(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}}}})}function Hk(){return{findTool:Ce,getToolManifest:Ie,getToolNames:zt}}function Bk(t){lv({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})}})}var yN="agent",qk=["general","explore","plan","code","research","verify"],bN={type:"object",properties:{agent:{type:"string",enum:["general","explore","plan","code","research","verify"],description:`Sub-agent type to fork:
|
|
920
920
|
- general: Full tool access, any task
|
|
921
921
|
- explore: Read-only codebase exploration (search, read, analyze)
|
|
922
922
|
- plan: Planning mode (explore + produce plan, no writes)
|
|
923
923
|
- code: Coding agent with full tool access
|
|
924
924
|
- research: Web research and information gathering
|
|
925
|
-
- 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},Wk=4;function Gk(t){return{name:
|
|
925
|
+
- 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},Wk=4;function Gk(t){return{name:yN,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:bN,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(!qk.includes(r.agent))return{content:[{type:"text",text:`Error: unknown agent "${r.agent}". Available: ${qk.join(", ")}`}],details:{type:"agent",error:"invalid_agent_type"}};let n=t.currentForkDepth??0;if(n>=Wk)return{content:[{type:"text",text:`Error: maximum fork depth (${Wk}) 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.
|
|
926
926
|
Agent ID: ${o.agentId}
|
|
927
927
|
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?`
|
|
928
928
|
|
|
929
|
-
[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
|
|
929
|
+
[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 vN}from"node:crypto";function Kk({host:t,hooks:e,log:r,toolInvoker:n}){return{abortSignal:void 0,currentForkDepth:0,forkAgent:async o=>{let s=Sn(o.agent);if(!s)return{agentId:"",status:"failed",error:`Unknown agent type: ${o.agent}`};if(!t.agent||!t.currentTransport||!t.currentApiKey||!t.currentModel)return{agentId:"",status:"failed",error:"No LLM provider configured"};let i=zt(),a=rc(i,s),l=Ie().filter(f=>a.includes(f.function.name)),d=Ma(l,!0),u=o.maxTurns??s.maxTurns??200;if(lt.isTeamBudgetExceeded())return{agentId:`fork-${o.agent}-budget-exceeded`,status:"failed",output:void 0,error:lt.teamBudgetExceededError(),tokensUsed:0};let p=await Mr({promptMessages:[{role:"user",content:o.prompt}],tools:d,transport:t.currentTransport,toolInvoker:n,createAgentRunner:jr,apiKey:t.currentApiKey,model:t.currentModel,log:r,hooks:e,forkLabel:`agent-${o.agent}`,maxTurns:u,parentSignal:o.abortSignal,parentDepth:0,onEvent:f=>{f.type==="delta"&&f.text&&t.sendNotification("turn.subagent_delta",{agentType:o.agent,text:f.text})}}),m=p.events.filter(f=>f.type==="end"&&"content"in f).map(f=>f.content??"").join("")||p.events.filter(f=>f.type==="delta"&&"text"in f).map(f=>f.text).join(""),g=p.totalUsage.inputTokens+p.totalUsage.outputTokens;return lt.recordForkTokens(g),{agentId:`fork-${o.agent}-${vN().slice(0,8)}`,status:p.ok?"completed":"failed",output:m||void 0,error:p.error,tokensUsed:g}}}}function zk({host:t,hooks:e,log:r,toolInvoker:n}){K(Gk(Kk({host:t,hooks:e,log:r,toolInvoker:n})))}var kN="checkpoint",RN={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"]},Vk=/^[0-9a-fA-F]{4,64}$/;function Xk(t){return{name:kN,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:RN,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}
|
|
930
930
|
Message: ${n.checkpoint.message}
|
|
931
931
|
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(`
|
|
932
932
|
`)}],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(!Vk.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(!Vk.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"}}}}}}N();import*as Ye from"node:fs";import*as en from"node:path";function Yk(t,e){let r=mu(t,e);return{createCheckpoint:async n=>{try{Ye.mkdirSync(r,{recursive:!0});let{execSync:o}=await import("node:child_process"),s=en.join(r,".git");Ye.existsSync(s)||(o("git init",{cwd:r,stdio:"pipe"}),o('git config user.email "checkpoint@agent"',{cwd:r,stdio:"pipe"}),o('git config user.name "Checkpoint"',{cwd:r,stdio:"pipe"})),Ye.cpSync(t,r,{recursive:!0,filter:l=>!l.includes(".git")&&!l.includes("node_modules")}),o("git add -A",{cwd:r,stdio:"pipe"});let i=n||`checkpoint ${new Date().toISOString()}`;o(`git commitallow-empty -m "${i.replace(/"/g,'\\"')}"`,{cwd:r,stdio:"pipe"});let a=o("git rev-parse HEAD",{cwd:r,stdio:"pipe"}).toString().trim(),c=parseInt(o("git ls-files | wc -l",{cwd:r,stdio:"pipe"}).toString().trim(),10)||0;return{success:!0,checkpoint:{id:a,message:i,timestamp:new Date().toISOString(),fileCount:c}}}catch(o){return{success:!1,error:o.message}}},listCheckpoints:async()=>{try{let{execSync:n}=await import("node:child_process"),o=en.join(r,".git");if(!Ye.existsSync(o))return{success:!0,checkpoints:[]};let s=n('git logformat="%H|%aI|%s"max-count=20',{cwd:r,stdio:"pipe"}).toString().trim();return s?{success:!0,checkpoints:s.split(`
|
|
933
|
-
`).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=en.join(r,i),c=en.join(t,i);Ye.existsSync(a)&&Ye.cpSync(a,c,{recursive:!0})}}else{s(`git checkout ${n} .`,{cwd:r,stdio:"pipe"});let i=Ye.readdirSync(t);for(let a of i){if(a===".git"||a==="node_modules")continue;let c=en.join(t,a);Ye.rmSync(c,{recursive:!0,force:!0})}Ye.cpSync(r,t,{recursive:!0,filter:a=>!a.includes(".git")})}return{success:!0}}catch(s){return{success:!1,error:s.message}}},diffCheckpoint:async n=>{try{let{execSync:o}=await import("node:child_process");return{success:!0,diff:o(`git diff ${n} HEAD`,{cwd:r,stdio:"pipe"}).toString()}}catch(o){return{success:!1,error:o.message}}}}}function Jk(t){let e=typeof t.config.workdir=="string"?t.config.workdir:t.cwd??process.cwd();return Yk(e,t.sessionId||"default")}function Qk({config:t,host:e}){K(Xk(Jk({config:t,sessionId:e.currentSessionId})))}var
|
|
933
|
+
`).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=en.join(r,i),c=en.join(t,i);Ye.existsSync(a)&&Ye.cpSync(a,c,{recursive:!0})}}else{s(`git checkout ${n} .`,{cwd:r,stdio:"pipe"});let i=Ye.readdirSync(t);for(let a of i){if(a===".git"||a==="node_modules")continue;let c=en.join(t,a);Ye.rmSync(c,{recursive:!0,force:!0})}Ye.cpSync(r,t,{recursive:!0,filter:a=>!a.includes(".git")})}return{success:!0}}catch(s){return{success:!1,error:s.message}}},diffCheckpoint:async n=>{try{let{execSync:o}=await import("node:child_process");return{success:!0,diff:o(`git diff ${n} HEAD`,{cwd:r,stdio:"pipe"}).toString()}}catch(o){return{success:!1,error:o.message}}}}}function Jk(t){let e=typeof t.config.workdir=="string"?t.config.workdir:t.cwd??process.cwd();return Yk(e,t.sessionId||"default")}function Qk({config:t,host:e}){K(Xk(Jk({config:t,sessionId:e.currentSessionId})))}var SN="config",TN={type:"object",properties:{action:{type:"string",enum:["get","set","list","reset"],description:`Action:
|
|
934
934
|
- get: Read a config setting
|
|
935
935
|
- set: Write a config setting
|
|
936
936
|
- list: List all available settings
|
|
937
|
-
- reset: Reset a setting to default`},key:{type:"string",description:"Config key path (e.g. 'model', 'language', 'theme', 'permissions.defaultMode'). Required for get/set/reset."},value:{description:"Value to set. Type depends on the setting. Required for 'set' action."}},required:["action"]},Qn=["permissions.securityPolicy","api.key","api.secret","auth.token","system.adminMode"];function Zk(t){return{name:
|
|
937
|
+
- reset: Reset a setting to default`},key:{type:"string",description:"Config key path (e.g. 'model', 'language', 'theme', 'permissions.defaultMode'). Required for get/set/reset."},value:{description:"Value to set. Type depends on the setting. Required for 'set' action."}},required:["action"]},Qn=["permissions.securityPolicy","api.key","api.secret","auth.token","system.adminMode"];function Zk(t){return{name:SN,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:TN,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(`
|
|
938
938
|
`)}],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(Qn.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(`
|
|
939
|
-
`)}],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(Qn.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"}}}}}}N();import*as Zs from"node:fs";import*as eR from"node:path";function tR(t){let e=t.configFilePath??de(),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 Zs.promises.readFile(e,"utf8"))}catch{return{}}},o=async s=>{await Zs.promises.mkdir(eR.dirname(e),{recursive:!0}),await Zs.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:Qn.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:Qn.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 rR({host:t}){K(Zk(tR({currentModel:t.currentModel,verbose:t.verbose})))}var
|
|
939
|
+
`)}],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(Qn.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"}}}}}}N();import*as Zs from"node:fs";import*as eR from"node:path";function tR(t){let e=t.configFilePath??de(),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 Zs.promises.readFile(e,"utf8"))}catch{return{}}},o=async s=>{await Zs.promises.mkdir(eR.dirname(e),{recursive:!0}),await Zs.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:Qn.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:Qn.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 rR({host:t}){K(Zk(tR({currentModel:t.currentModel,verbose:t.verbose})))}var AN="cron",wN={type:"object",properties:{action:{type:"string",enum:["create","list","get","update","delete","pause","resume","trigger"],description:"CRUD 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. Supports:
|
|
940
940
|
- Cron: '0 9 * * *' (every day at 9am)
|
|
941
941
|
- Shorthand: '5m' (every 5 min), '1h' (hourly), '1d' (daily)
|
|
942
|
-
Required for create.`},name:{type:"string",description:"Human-readable job name."},repeat:{type:"number",description:"Number of times to repeat (null = infinite). Default: null."},allowedTools:{type:"array",items:{type:"string"},description:"Tools the scheduled task is allowed to use."},enabled:{type:"boolean",description:"Whether the job is enabled (for update)."}},required:["action"]},nR=50;function oR(t){return{name:
|
|
942
|
+
Required for create.`},name:{type:"string",description:"Human-readable job name."},repeat:{type:"number",description:"Number of times to repeat (null = infinite). Default: null."},allowedTools:{type:"array",items:{type:"string"},description:"Tools the scheduled task is allowed to use."},enabled:{type:"boolean",description:"Whether the job is enabled (for update)."}},required:["action"]},nR=50;function oR(t){return{name:AN,label:"Cron",description:"Manage scheduled tasks. Create recurring jobs with cron expressions or shorthand ('5m', '1h', '0 9 * * *'). Jobs persist locally and survive restarts. Actions: create, list, get, update, delete, pause, resume, trigger (run now).",parameters:wN,execute:async(e,r)=>{switch(r.action){case"create":{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 s=t.validateSchedule(r.schedule);if(s)return{content:[{type:"text",text:`Error: invalid schedule \u2014 ${s}`}],details:{type:"cron",error:"invalid_schedule"}}}let n=await t.listJobs();if(n.jobs&&n.jobs.length>=nR)return{content:[{type:"text",text:`Error: maximum ${nR} jobs reached. Delete unused jobs first.`}],details:{type:"cron",error:"max_jobs_reached"}};let o=await t.createJob({prompt:r.prompt,schedule:r.schedule,name:r.name,repeat:r.repeat,allowedTools:r.allowedTools});return o.success?{content:[{type:"text",text:cd(o.job)}],details:{type:"cron",action:"create",jobId:o.job.id}}:{content:[{type:"text",text:`Error: ${o.error}`}],details:{type:"cron",error:o.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(`
|
|
943
943
|
`)}],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:cd(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.prompt!==void 0&&(n.prompt=r.prompt),r.schedule!==void 0&&(n.schedule=r.schedule),r.name!==void 0&&(n.name=r.name),r.enabled!==void 0&&(n.enabled=r.enabled),r.repeat!==void 0&&(n.repeat=r.repeat),r.allowedTools!==void 0&&(n.allowedTools=r.allowedTools);let o=await t.updateJob(r.jobId,n);return o.success?{content:[{type:"text",text:`Job updated.
|
|
944
944
|
${cd(o.job)}`}],details:{type:"cron",action:"update",jobId:r.jobId}}:{content:[{type:"text",text:`Error: ${o.error}`}],details:{type:"cron",error:o.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 cd(t){let e=[`Job: ${t.name||t.id}`,`ID: ${t.id}`,`Schedule: ${t.scheduleDisplay} (${t.schedule})`,`State: ${t.state}`,`Repeat: ${t.repeat.times===null?"infinite":`${t.repeat.completed}/${t.repeat.times}`}`];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(`
|
|
945
|
-
`)}import{randomUUID as
|
|
946
|
-
`),parameters:
|
|
945
|
+
`)}import{randomUUID as PN}from"node:crypto";var xN={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)};function sR(t){let e=t.host,r=t.log,n=t.idFactory??(()=>PN().slice(0,8)),o=t.now??(()=>Date.now()),s=t.timers??xN,i=new Map,a=m=>new Date(m).toISOString(),c=m=>{let{timerId:g,...f}=m;return{...f}},l=m=>{m.timerId!==void 0&&(s.clearTimeout(m.timerId),m.timerId=void 0)},d=m=>{let g=/^(\d+)([smhd])$/.exec(m.trim());if(!g)return null;let f=parseInt(g[1],10),h=g[2];return f*({s:1e3,m:6e4,h:36e5,d:864e5}[h]??6e4)},u=m=>{l(m);let g=d(m.schedule);if(!g)return;let f=o(),h=g-f%g||g;m.timerId=s.setTimeout(()=>p(m),h),m.nextRunAt=a(f+h)},p=m=>{m.timerId=void 0,m.lastRunAt=a(o()),m.repeat.completed++,m.lastStatus="success",r.info(`[cron] triggered job ${m.id} (${m.name})`),e.sendNotification("system.activity",{category:"cron",level:"info",title:`\u5B9A\u65F6\u4EFB\u52A1\u89E6\u53D1: ${m.name}`,detail:`\u8C03\u5EA6 ${m.scheduleDisplay}\uFF0C\u7B2C ${m.repeat.completed} \u6B21\u6267\u884C`}),m.repeat.times===null||m.repeat.completed<m.repeat.times?u(m):(m.state="paused",m.enabled=!1,e.sendNotification("system.activity",{category:"cron",level:"info",title:`\u5B9A\u65F6\u4EFB\u52A1\u5B8C\u6210: ${m.name}`,detail:`\u5DF2\u8FBE\u5230\u6700\u5927\u6267\u884C\u6B21\u6570 (${m.repeat.completed} \u6B21)`}))};return{async createJob(m){let g=`cron_${n().slice(0,8)}`,f={id:g,name:m.name??`Job ${g}`,prompt:m.prompt,schedule:m.schedule,scheduleDisplay:m.schedule,state:"scheduled",enabled:!0,repeat:{times:m.repeat??null,completed:0},allowedTools:m.allowedTools};return i.set(g,f),u(f),{success:!0,job:c(f)}},async listJobs(){return{success:!0,jobs:[...i.values()].map(c)}},async getJob(m){let g=i.get(m);return g?{success:!0,job:c(g)}:{success:!1,error:`Job not found: ${m}`}},async updateJob(m,g){let f=i.get(m);return f?(g.prompt!==void 0&&(f.prompt=g.prompt),g.schedule!==void 0&&(f.schedule=g.schedule,f.scheduleDisplay=g.schedule),g.name!==void 0&&(f.name=g.name),g.enabled!==void 0&&(f.enabled=g.enabled,f.state=g.enabled?"scheduled":"paused"),g.repeat!==void 0&&(f.repeat.times=g.repeat),g.allowedTools!==void 0&&(f.allowedTools=g.allowedTools),f.enabled?u(f):l(f),{success:!0,job:c(f)}):{success:!1,error:`Job not found: ${m}`}},async deleteJob(m){let g=i.get(m);return g?(l(g),i.delete(m),{success:!0}):{success:!1,error:`Job not found: ${m}`}},async pauseJob(m){let g=i.get(m);return g?(g.state="paused",g.enabled=!1,l(g),{success:!0,job:c(g)}):{success:!1,error:`Job not found: ${m}`}},async resumeJob(m){let g=i.get(m);return g?(g.state="scheduled",g.enabled=!0,u(g),{success:!0,job:c(g)}):{success:!1,error:`Job not found: ${m}`}},async triggerJob(m){let g=i.get(m);return g?(g.lastRunAt=a(o()),g.repeat.completed++,g.lastStatus="success",{success:!0,job:c(g)}):{success:!1,error:`Job not found: ${m}`}},validateSchedule(m){return d(m)!==null||/^\d{1,2}\s/.test(m)?null:`Invalid schedule: ${m}. Use shorthand (5m, 1h, 1d) or cron expression.`},dispose(){for(let m of i.values())l(m);i.clear()}}}function iR({host:t,log:e}){let r=sR({host:t,log:e});ht(async()=>r.dispose()),K(oR(r))}var CN="monitor",IN={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 aR(t){return{name:CN,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(`
|
|
946
|
+
`),parameters:IN,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:
|
|
947
947
|
${i.map(c=>`\u2022 ${c.monitorId} [${c.source}] \u2192 ${c.target} (events: ${c.eventCount}, timeout: ${c.timeoutSeconds}s)`).join(`
|
|
948
|
-
`)}`}],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 cR from"node:fs";function lR(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=cR.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 dR({log:t}){let e=lR(t);ht(async()=>e.dispose()),K(aR(e))}var
|
|
948
|
+
`)}`}],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 cR from"node:fs";function lR(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=cR.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 dR({log:t}){let e=lR(t);ht(async()=>e.dispose()),K(aR(e))}var EN="team",_N={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 uR(t){return{name:EN,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:_N,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(`
|
|
949
949
|
`)}],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(`
|
|
950
950
|
`)}],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],u=a.isActive===!1?" (idle)":" (active)";if(d){let p=[];if(d.runningFor&&p.push(`running ${Math.round(d.runningFor/1e3)}s`),d.lastToolCall&&p.push(`tool: ${d.lastToolCall}`),d.idleFor!==void 0&&d.idleFor>5&&p.push(`idle ${d.idleFor}s`),d.mediaProgress){let m=d.mediaProgress;p.push(`${m.mediaType} ${m.percent}% [${m.status}] taskId=${m.taskId}${m.provider?` provider=${m.provider}`:""}`)}p.length&&(u=` (${p.join(", ")})`)}i.push(` - ${a.name} (${a.role})${c}${l}${u}`)}return{content:[{type:"text",text:i.join(`
|
|
951
|
-
`)}],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 pR from"node:path";N();function mR(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&&Zn(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:pR.join(B(),"agent-logs")});return{async createTeam(s){if(r.has(s.teamName))return{success:!1,error:`Team "${s.teamName}" already exists.`};let i=await Bn(),a=[];for(let l of s.members??[]){let d={...l,isActive:!0};if(i){let u=`team-${s.teamName}-${l.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase(),p=await hb(i,u,n);p?(d.worktreePath=p.worktreePath,d.worktreeBranch=p.branch,d.cwd=p.worktreePath,e.info(`[team] provisioned worktree for ${l.name}: ${p.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=Zn(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(u){e.warn(`[team] failed to spawn child process for ${l.name}: ${u instanceof Error?u.message:String(u)}`),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(Zn(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=Zn(s,c.name);o.kill(l),o.remove(l)}let a=await Bn();if(a)for(let c of i.members)c.worktreePath&&c.worktreeBranch&&(await yb(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=Zn(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 Zn(t,e){return`team-${t}-${e}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase()}function gR({host:t,log:e}){let r=mR(t,e);ht(async()=>r.dispose()),K(uR(r))}var
|
|
951
|
+
`)}],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 pR from"node:path";N();function mR(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&&Zn(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:pR.join(B(),"agent-logs")});return{async createTeam(s){if(r.has(s.teamName))return{success:!1,error:`Team "${s.teamName}" already exists.`};let i=await Bn(),a=[];for(let l of s.members??[]){let d={...l,isActive:!0};if(i){let u=`team-${s.teamName}-${l.name}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase(),p=await hb(i,u,n);p?(d.worktreePath=p.worktreePath,d.worktreeBranch=p.branch,d.cwd=p.worktreePath,e.info(`[team] provisioned worktree for ${l.name}: ${p.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=Zn(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(u){e.warn(`[team] failed to spawn child process for ${l.name}: ${u instanceof Error?u.message:String(u)}`),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(Zn(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=Zn(s,c.name);o.kill(l),o.remove(l)}let a=await Bn();if(a)for(let c of i.members)c.worktreePath&&c.worktreeBranch&&(await yb(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=Zn(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 Zn(t,e){return`team-${t}-${e}`.replace(/[^a-zA-Z0-9-]/g,"-").toLowerCase()}function gR({host:t,log:e}){let r=mR(t,e);ht(async()=>r.dispose()),K(uR(r))}var MN="notify",DN={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 fR(t){return{name:MN,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:DN,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 NN="send_message",LN={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 hR(t){return{name:NN,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:LN,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 yR({host:t,log:e}){K(fR({sendNotification:async r=>(e.info(`[notify] ${r.title??""}: ${r.message}`),{delivered:!0,channel:r.channel??"cli"})})),K(hR({sendMessage:async r=>(e.info(`[send_message] ${r.senderId} -> ${r.to}: ${r.message}`),{success:!0,recipients:[r.to]}),getSenderId:()=>t.currentSessionId??"default",listTeammates:()=>[]}))}function bR(t){zk({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,toolInvoker:t.toolInvoker}),rR({host:{currentModel:t.host.currentModel,verbose:t.host.verbose}}),iR({host:{sendNotification:t.host.sendNotification.bind(t.host)},log:t.log}),dR({log:t.log}),Qk({config:t.config,host:{currentSessionId:t.host.currentSessionId}}),gR({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}),yR({host:{get currentSessionId(){return t.host.currentSessionId}},log:t.log})}function vR(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()},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,toolInvoker:t.toolInvoker};bR(r)}var ON={type:"object",properties:{operation:{type:"string",enum:["goToDefinition","findReferences","hover","documentSymbol","diagnostics","completion","signatureHelp","rename","codeAction"],description:`LSP operation:
|
|
952
952
|
- goToDefinition: jump to symbol definition
|
|
953
953
|
- findReferences: find all usages of a symbol
|
|
954
954
|
- hover: get type/docs for symbol at position
|
|
@@ -957,33 +957,33 @@ ${i.map(c=>`\u2022 ${c.monitorId} [${c.source}] \u2192 ${c.target} (events: ${c.
|
|
|
957
957
|
- completion: get completions at position
|
|
958
958
|
- signatureHelp: get function signature at call site
|
|
959
959
|
- rename: preview rename of symbol
|
|
960
|
-
- 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"]},
|
|
960
|
+
- 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"]},jN=10*1024*1024,$N=["goToDefinition","findReferences","hover","completion","signatureHelp","rename","codeAction"];function kR(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:ON,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($N.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>jN)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:UN(r.operation,o)}],details:{type:"lsp",operation:r.operation}}}}}function UN(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(`
|
|
961
961
|
`)}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(`
|
|
962
962
|
`)}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(`
|
|
963
963
|
`)}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(`
|
|
964
964
|
`)}case"signatureHelp":return e.signatures.length===0?"No signature information available.":e.signatures.join(`
|
|
965
965
|
`);case"rename":{if(e.edits.length===0)return"No edits generated for rename.";let n=[`Rename would affect ${e.edits.reduce((o,s)=>o+s.edits.length,0)} location(s) in ${e.edits.length} file(s):`,""];for(let o of e.edits)n.push(` ${o.filePath} (${o.edits.length} edits)`);return n.join(`
|
|
966
966
|
`)}case"codeActions":{if(e.actions.length===0)return"No code actions available.";let r=[`Available code actions (${e.actions.length}):`,""];for(let n of e.actions)r.push(` ${n.isPreferred?"\u2605":"-"} ${n.title}${n.kind?` [${n.kind}]`:""}`);return r.join(`
|
|
967
|
-
`)}default:return"Unknown result type."}}var
|
|
967
|
+
`)}default:return"Unknown result type."}}var FN="repl",HN={type:"object",properties:{code:{type:"string",description:`JavaScript code to execute. The VM has access to these built-in primitives:
|
|
968
968
|
- readFile(path): Promise<string> \u2014 read a file
|
|
969
969
|
- writeFile(path, content): Promise<void> \u2014 write a file
|
|
970
970
|
- editFile(path, edits): Promise<string> \u2014 apply edits [{oldText, newText}]
|
|
971
971
|
- exec(command): Promise<{stdout, stderr, exitCode}> \u2014 run shell command
|
|
972
972
|
- glob(pattern): Promise<string[]> \u2014 find files by glob
|
|
973
973
|
- grep(pattern, path?): Promise<{file,line,text}[]> \u2014 search files
|
|
974
|
-
Use this for batch operations (rename many files, transform data, etc) to reduce tool call round-trips.`}},required:["code"]};var RR=1e5,SR=5e4;function TR(t){return{name
|
|
974
|
+
Use this for batch operations (rename many files, transform data, etc) to reduce tool call round-trips.`}},required:["code"]};var RR=1e5,SR=5e4;function TR(t){return{name:FN,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:HN,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>RR)return{content:[{type:"text",text:`Error: code too large (${r.code.length} chars, max ${RR}).`}],details:{type:"repl",error:"code_too_large"}};let n=await t.executeInVm(r.code),o=n.output||"";return o.length>SR&&(o=o.slice(0,SR)+`
|
|
975
975
|
... (truncated)`),n.error?{content:[{type:"text",text:`Error: ${n.error}
|
|
976
976
|
|
|
977
977
|
Output:
|
|
978
978
|
${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 ei from"node:path";function AR(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=>ei.isAbsolute(r)?r:ei.resolve(e,r)}}import*as eo from"node:fs";import*as tn from"node:path";import*as ti from"node:vm";function wR(t){let e,r=t.workdir,n=()=>(e||(e=ti.createContext({...{readFile:async s=>eo.promises.readFile(tn.resolve(r,s),"utf8"),writeFile:async(s,i)=>{await eo.promises.writeFile(tn.resolve(r,s),i,"utf8")},editFile:async(s,i)=>{let a=await eo.promises.readFile(tn.resolve(r,s),"utf8");for(let c of i)a=a.replace(c.oldText,c.newText);return await eo.promises.writeFile(tn.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=tn.resolve(r,i??".");try{let l=await import("node:child_process"),d=await new Promise(u=>{l.execFile("grep",["-rn",s,c,"--include=*"],{timeout:1e4},(p,m)=>{u(m?.toString()??"")})});for(let u of d.split(`
|
|
979
|
-
`).filter(Boolean).slice(0,100)){let p=u.match(/^(.+?):(\d+):(.*)$/);p&&a.push({file:p[1],line:parseInt(p[2],10),text:p[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 ti.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 PR(t){let e=typeof t.config.workdir=="string"?t.config.workdir:process.cwd();K(TR(wR({workdir:e}))),K(kR(AR({workdir:e})))}import*as rn from"node:fs";import si from"node:path";import{fileURLToPath as
|
|
979
|
+
`).filter(Boolean).slice(0,100)){let p=u.match(/^(.+?):(\d+):(.*)$/);p&&a.push({file:p[1],line:parseInt(p[2],10),text:p[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 ti.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 PR(t){let e=typeof t.config.workdir=="string"?t.config.workdir:process.cwd();K(TR(wR({workdir:e}))),K(kR(AR({workdir:e})))}import*as rn from"node:fs";import si from"node:path";import{fileURLToPath as YN}from"node:url";import{spawn as GN}from"node:child_process";import{createInterface as KN}from"node:readline";var BN=new Set(["describe","fetch","find","get","inspect","list","query","read","search","stat"]),qN=new Set(["append","copy","create","delete","edit","move","patch","remove","rename","set","update","upload","write"]);function ri(t){let e=t.annotations,r=WN(t.name),n=r.some(c=>qN.has(c)),o=r.some(c=>BN.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 WN(t){return t.replace(/([a-z0-9])([A-Z])/g,"$1_$2").toLowerCase().split(/[^a-z0-9]+/).filter(Boolean)}var ni=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=GN(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=KN({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=zN(this.config.name);return this.toolsCache.map(r=>{let n=ri(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(`
|
|
980
980
|
`)||"(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:u=>{d(),u.error?i(new Error(`MCP error ${u.error.code}: ${u.error.message}`)):s(u.result)},reject:u=>{d(),i(u)}}),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+`
|
|
981
|
-
`)}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
|
|
982
|
-
`);i=l.pop()??"";for(let d of l){if(!d.startsWith("data: "))continue;let u=d.slice(6).trim();if(u)try{let p=JSON.parse(u);if("method"in p&&p.method==="notifications/tools/list_changed"){this.onToolsChanged?.();continue}if(p.id===r){if(p.error)throw new Error(`MCP error ${p.error.code}: ${p.error.message}`);return p.result}}catch(p){if(p instanceof Error&&p.message.startsWith("MCP error"))throw p}}}}finally{o.releaseLock()}throw new Error("MCP SSE stream ended without response")}schemaToPortableTool(e){let r=this,n=
|
|
983
|
-
`)||"(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
|
|
984
|
-
`).trim()}],details:{type:"list_mcp_resources",count:o.length}}}}}var
|
|
981
|
+
`)}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 zN(t){return t.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}import{randomUUID as VN}from"node:crypto";var oi=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=VN(),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}),u=d.headers.get("mcp-session-id");if(u&&(this.sessionId=u),!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(`
|
|
982
|
+
`);i=l.pop()??"";for(let d of l){if(!d.startsWith("data: "))continue;let u=d.slice(6).trim();if(u)try{let p=JSON.parse(u);if("method"in p&&p.method==="notifications/tools/list_changed"){this.onToolsChanged?.();continue}if(p.id===r){if(p.error)throw new Error(`MCP error ${p.error.code}: ${p.error.message}`);return p.result}}catch(p){if(p instanceof Error&&p.message.startsWith("MCP error"))throw p}}}}finally{o.releaseLock()}throw new Error("MCP SSE stream ended without response")}schemaToPortableTool(e){let r=this,n=XN(this.config.name),o=ri(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(u=>u.type==="text"&&u.text).map(u=>u.text).join(`
|
|
983
|
+
`)||"(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 XN(t){return t.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}var ii=class{clients=new Map;injected=!1;log;workspaceRoot;constructor(e){this.log=e.log??{info:()=>{},warn:()=>{}},this.workspaceRoot=e.workspaceRoot?si.resolve(e.workspaceRoot):void 0;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 oi(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 ni(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());Na(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=xR(`mcp__${IR(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=xR(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__${IR(e)}__`;for(let s of zt())s.startsWith(n)&&Do(s);let o=this.wrapToolsForWorkspaceBoundary(r.toPortableTools());Na(o),this.log.info(`[mcp] re-injected ${o.length} tools from ${e}`)}},JN=/(?:^|_)(path|paths|file|files|filename|filenames|dir|dirs|directory|directories|folder|folders|cwd|root|uri)(?:$|_)/i;function xR(t,e,r){if(!r)return null;for(let n of ld(e)){let o=eL(n.value,r);if(o&&!tL(o.candidate,o.root,o.pathApi))return`Blocked: MCP tool "${t}" path "${n.value}" is outside the workspace boundary "${o.root}"`}return null}function ld(t,e="",r=0){if(r>8)return[];if(typeof t=="string")return QN(e,t)?[{key:e,value:t}]:[];if(Array.isArray(t))return t.flatMap(o=>ld(o,e,r+1));if(!t||typeof t!="object")return[];let n=[];for(let[o,s]of Object.entries(t))n.push(...ld(s,o,r+1));return n}function QN(t,e){if(!JN.test(t))return!1;let r=e.trim();return!r||/^https?:\/\//i.test(r)?!1:ZN(r)}function ZN(t){return si.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 eL(t,e){let r=t.trim();if(/^file:\/\//i.test(r))try{r=YN(r)}catch{return null}let n=CR(r)||CR(e)?si.win32:si,o=n.resolve(e);return{candidate:n.isAbsolute(r)?n.resolve(r):n.resolve(o,r),root:o,pathApi:n}}function tL(t,e,r){let n=r.relative(e,t);return n===""||!n.startsWith("..")&&!r.isAbsolute(n)}function CR(t){return/^[A-Za-z]:[\\/]/.test(t)||/^\\\\/.test(t)}function IR(t){return t.replace(/[^a-zA-Z0-9_]/g,"_").toLowerCase()}function dd(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 rL={type:"object",properties:{server:{type:"string",description:"MCP server name to list resources from. Omit to list from all connected servers."}}};function ER(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:rL,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}]`:"",u=l.description?` \u2014 ${l.description}`:"";i.push(` ${l.name}: ${l.uri}${d}${u}`)}i.push("")}return{content:[{type:"text",text:i.join(`
|
|
984
|
+
`).trim()}],details:{type:"list_mcp_resources",count:o.length}}}}}var nL={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 _R(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:nL,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}-
|
|
985
985
|
${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"})-
|
|
986
|
-
[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
|
|
986
|
+
[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 sL="mcp",iL={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:
|
|
987
987
|
- list_servers: List configured MCP servers, their status and capabilities
|
|
988
988
|
- list_tools: List tools provided by a specific server
|
|
989
989
|
- call_tool: Execute a tool on an MCP server
|
|
@@ -992,12 +992,12 @@ ${i.text}`})}else if(i.blob){let a=Math.ceil(i.blob.length*3/4/1024);s.push({typ
|
|
|
992
992
|
- list_prompts: List prompts available from a server
|
|
993
993
|
- get_prompt: Get a specific prompt with arguments
|
|
994
994
|
- authenticate: Initiate OAuth authentication with a server
|
|
995
|
-
- 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 MR(t){return{name:
|
|
995
|
+
- 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 MR(t){return{name:sL,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).
|
|
996
996
|
|
|
997
|
-
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:
|
|
998
|
-
`)}],details:{type:"mcp",action:"list_servers",count:o.length}}}case"list_tools":{if(!r.server)return le("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=
|
|
997
|
+
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:iL,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=aL(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(`
|
|
998
|
+
`)}],details:{type:"mcp",action:"list_servers",count:o.length}}}case"list_tools":{if(!r.server)return le("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=cL(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(`
|
|
999
999
|
`)}],details:{type:"mcp",action:"list_tools",server:r.server,count:o.length}}}case"call_tool":{if(!r.server)return le("server is required for call_tool.");if(!r.toolName)return le("toolName is required for call_tool.");let o=await t.callTool(r.server,r.toolName,r.arguments,n);return!o.success||o.isError?{content:[{type:"text",text:`MCP tool error (${r.server}/${r.toolName}): ${o.error||o.content||"unknown error"}`}],details:{type:"mcp",action:"call_tool",server:r.server,toolName:r.toolName,success:!1}}:o.contentBlocks&&o.contentBlocks.length>0?{content:o.contentBlocks.map(i=>i.type==="image"&&i.data?{type:"image",data:i.data,mimeType:i.mimeType}:{type:"text",text:i.text||""}),details:{type:"mcp",action:"call_tool",server:r.server,toolName:r.toolName,success:!0}}:{content:[{type:"text",text:o.content||"(no output)"}],details:{type:"mcp",action:"call_tool",server:r.server,toolName:r.toolName,success:!0}}}case"list_resources":{let o=await t.listResources(r.server);if(o.length===0)return{content:[{type:"text",text:r.server?`No resources from "${r.server}".`:"No MCP resources available."}],details:{type:"mcp",action:"list_resources",count:0}};let s=[`MCP Resources (${o.length}):`,""];for(let i of o)s.push(`- **${i.name}** \`${i.uri}\`${i.mimeType?` [${i.mimeType}]`:""}`),i.description&&s.push(` ${i.description}`),i.server&&s.push(` Server: ${i.server}`);return{content:[{type:"text",text:s.join(`
|
|
1000
|
-
`)}],details:{type:"mcp",action:"list_resources",count:o.length,server:r.server}}}case"read_resource":{if(!r.server)return le("server is required for read_resource.");if(!r.uri)return le("uri is required for read_resource.");let o=await t.readResource(r.server,r.uri);if(o.length===0)return{content:[{type:"text",text:"Resource returned no content."}],details:{type:"mcp",action:"read_resource",server:r.server,uri:r.uri}};let s=[];for(let i of o)i.blobSavedTo?s.push({type:"text",text:`[Binary content saved to: ${i.blobSavedTo}${i.blobSize?` (${
|
|
1000
|
+
`)}],details:{type:"mcp",action:"list_resources",count:o.length,server:r.server}}}case"read_resource":{if(!r.server)return le("server is required for read_resource.");if(!r.uri)return le("uri is required for read_resource.");let o=await t.readResource(r.server,r.uri);if(o.length===0)return{content:[{type:"text",text:"Resource returned no content."}],details:{type:"mcp",action:"read_resource",server:r.server,uri:r.uri}};let s=[];for(let i of o)i.blobSavedTo?s.push({type:"text",text:`[Binary content saved to: ${i.blobSavedTo}${i.blobSize?` (${lL(i.blobSize)})`:""}]`}):i.text&&s.push({type:"text",text:i.text});return s.length===0&&s.push({type:"text",text:"(empty content)"}),{content:s,details:{type:"mcp",action:"read_resource",server:r.server,uri:r.uri}}}case"list_prompts":{if(!r.server)return le("server is required for list_prompts.");if(!t.listPrompts)return le("Prompt listing not supported by the current MCP host.");let o=await t.listPrompts(r.server);if(o.length===0)return{content:[{type:"text",text:`No prompts available from "${r.server}".`}],details:{type:"mcp",action:"list_prompts",server:r.server,count:0}};let s=[`Prompts from "${r.server}" (${o.length}):`,""];for(let i of o)if(s.push(`- **${i.name}**${i.description?`: ${i.description}`:""}`),i.arguments&&i.arguments.length>0){let a=i.arguments.map(c=>`${c.name}${c.required?" (required)":""}${c.description?`: ${c.description}`:""}`);s.push(` Arguments: ${a.join(", ")}`)}return{content:[{type:"text",text:s.join(`
|
|
1001
1001
|
`)}],details:{type:"mcp",action:"list_prompts",server:r.server,count:o.length}}}case"get_prompt":{if(!r.server)return le("server is required for get_prompt.");if(!r.promptName)return le("promptName is required for get_prompt.");if(!t.getPrompt)return le("Prompt retrieval not supported by the current MCP host.");let o=r.arguments?Object.fromEntries(Object.entries(r.arguments).map(([a,c])=>[a,String(c)])):void 0,s=await t.getPrompt(r.server,r.promptName,o),i=[];s.description&&i.push(`> ${s.description}`,"");for(let a of s.messages)i.push(`**[${a.role}]:**`),a.content.type==="text"?i.push(a.content.text):a.content.type==="resource"?(i.push(`[Resource: ${a.content.resource.uri}]`),a.content.resource.text&&i.push(a.content.resource.text)):a.content.type==="image"&&i.push("[Image content]"),i.push("");return{content:[{type:"text",text:i.join(`
|
|
1002
1002
|
`)||"(empty prompt)"}],details:{type:"mcp",action:"get_prompt",server:r.server,promptName:r.promptName}}}case"authenticate":{if(!r.server)return le("server is required for authenticate.");let o=await t.authenticate(r.server);switch(o.status){case"auth_url":return{content:[{type:"text",text:`Authentication required for "${r.server}".
|
|
1003
1003
|
|
|
@@ -1007,11 +1007,11 @@ ${o.authUrl}
|
|
|
1007
1007
|
${o.message||"Once you complete authentication, the server's tools will become available automatically."}`}],details:{type:"mcp",action:"authenticate",server:r.server,status:"auth_url"}};case"already_authenticated":return{content:[{type:"text",text:`Server "${r.server}" is already authenticated.`}],details:{type:"mcp",action:"authenticate",server:r.server,status:"already_authenticated"}};case"step_up_required":return{content:[{type:"text",text:`Server "${r.server}" requires elevated permissions.
|
|
1008
1008
|
Required scopes: ${o.requiredScopes?.join(", ")||"unknown"}
|
|
1009
1009
|
|
|
1010
|
-
`+(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 le("server is required for manage_server.");if(!r.manageAction)return le("manageAction is required for manage_server.");switch(r.manageAction){case"add":{if(!t.addServer)return le("Server addition not supported by the current MCP host.");if(!r.config)return le("config is required for manage_server add.");let o=await t.addServer(r.server,r.config);return to("add",r.server,o)}case"remove":{if(!t.removeServer)return le("Server removal not supported by the current MCP host.");let o=await t.removeServer(r.server);return to("remove",r.server,o)}case"restart":{if(!t.restartServer)return le("Server restart not supported by the current MCP host.");let o=await t.restartServer(r.server);return to("restart",r.server,o)}case"health_check":{if(!t.healthCheck)return le("Health check not supported by the current MCP host.");let o=await t.healthCheck(r.server);return to("health_check",r.server,o)}case"enable":case"disable":{if(!t.setServerEnabled)return le("Server enable/disable not supported by the current MCP host.");let o=await t.setServerEnabled(r.server,r.manageAction==="enable");return to(r.manageAction,r.server,o)}default:return le(`Unknown manageAction: ${r.manageAction}`)}}default:return le(`Unknown action: "${r.action}".`)}}}}function le(t){return{content:[{type:"text",text:`Error: ${t}`}],details:{type:"mcp",error:t}}}function
|
|
1011
|
-
`)}],details:{type:"mcp",action:"manage_server",manageAction:t,server:e,success:r.success}}}import*as Bt from"node:fs";import*as ro from"node:path";import{pathToFileURL as
|
|
1012
|
-
`).pop()?.trim();if(!l)return r.warn(`[marketplace] npm pack returned no output for ${a}`),null;let d=no.join(i,l),p=l.match(/^(.+)-(\d+\.\d+\.\d+.*)\.tgz$/)?.[2]??"0.0.0",m=no.join(i,`${t}@${p}`);be.existsSync(m)||be.mkdirSync(m,{recursive:!0}),await s("tar",["xzf",d,"-C",m,"--strip-components=1"],{timeout:3e4});try{be.unlinkSync(d)}catch{}let g=no.join(m,"package.json");if(be.existsSync(g))try{await s("npm",["install","--production","--no-save"],{cwd:m,timeout:12e4})}catch(f){r.warn(`[marketplace] npm install for ${t} failed: ${f.message}`)}return r.info(`[marketplace] installed ${t}@${p} from npm`),{name:t,version:p,installPath:m}}catch(c){return r.warn(`[marketplace] failed to install ${a} from npm: ${c.message}`),null}}function
|
|
1013
|
-
`)}}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"})})}function UR(t){let e=[],r=su();rn.existsSync(r)&&e.push(r);let n=t.config.pluginPaths;if(Array.isArray(n))for(let o of n)typeof o=="string"&&rn.existsSync(o)&&e.push(o);OR(e,t.log).then(o=>{if(o.length===0)return;let s=new ai({pluginDirs:o,hookRegistry:t.hooks,log:t.log});t.setPluginLoader(s),s.loadAll().then(i=>{t.log.info(`[plugins] ${i.length} loaded, ${s.getPluginSkills().length} skills`)}).catch(i=>{t.log.warn(`[plugins] load error: ${i instanceof Error?i.message:i}`)}),t.hooks.register({point:"turn.submitted",handler:async()=>(await s.discoverNew(),await s.refreshActivations(),{action:"continue"}),label:"plugin-activation-refresh",priority:50})}).catch(o=>{t.log.warn(`[plugins] marketplace resolve error: ${o instanceof Error?o.message:o}`)})}import*as Pt from"node:fs";import*as oo from"node:path";var
|
|
1014
|
-
`;Pt.appendFileSync(this.filePath,n,"utf-8")}catch{}}};function FR(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}import{randomUUID as
|
|
1010
|
+
`+(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 le("server is required for manage_server.");if(!r.manageAction)return le("manageAction is required for manage_server.");switch(r.manageAction){case"add":{if(!t.addServer)return le("Server addition not supported by the current MCP host.");if(!r.config)return le("config is required for manage_server add.");let o=await t.addServer(r.server,r.config);return to("add",r.server,o)}case"remove":{if(!t.removeServer)return le("Server removal not supported by the current MCP host.");let o=await t.removeServer(r.server);return to("remove",r.server,o)}case"restart":{if(!t.restartServer)return le("Server restart not supported by the current MCP host.");let o=await t.restartServer(r.server);return to("restart",r.server,o)}case"health_check":{if(!t.healthCheck)return le("Health check not supported by the current MCP host.");let o=await t.healthCheck(r.server);return to("health_check",r.server,o)}case"enable":case"disable":{if(!t.setServerEnabled)return le("Server enable/disable not supported by the current MCP host.");let o=await t.setServerEnabled(r.server,r.manageAction==="enable");return to(r.manageAction,r.server,o)}default:return le(`Unknown manageAction: ${r.manageAction}`)}}default:return le(`Unknown action: "${r.action}".`)}}}}function le(t){return{content:[{type:"text",text:`Error: ${t}`}],details:{type:"mcp",error:t}}}function aL(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 cL(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 lL(t){return t<1024?`${t}B`:t<1024*1024?`${(t/1024).toFixed(1)}KB`:`${(t/(1024*1024)).toFixed(1)}MB`}function to(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(`
|
|
1011
|
+
`)}],details:{type:"mcp",action:"manage_server",manageAction:t,server:e,success:r.success}}}import*as Bt from"node:fs";import*as ro from"node:path";import{pathToFileURL as dL}from"node:url";var DR={preToolUse:"tool.before_invoke",postToolUse:"tool.after_invoke",onTurnStart:"turn.submitted",onTurnEnd:"turn.completed",onSessionEnd:"session.ended"};var ai=class{constructor(e){this.config=e;this.log=e.log??{info:()=>{},warn:()=>{}}}config;loaded=[];pluginSkills=[];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=ro.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}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=ro.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){for(let s of n.tools)K(s);n.active=!0,this.log.info(`[plugins] ${r}: reactivated (${n.tools.length} tools)`)}else if(!o&&n.active){for(let s of n.tools)Do(s.name);for(let s of n.hookUnregisterFns)s();n.active=!1,this.log.info(`[plugins] ${r}: deactivated`)}}}}async loadPlugin(e,r){let n=["index.js","index.mjs"],o=null;for(let f of n){let h=ro.join(r,f);if(Bt.existsSync(h)){o=h;break}}if(!o){this.log.warn(`[plugins] ${e}: no index.js found, skipping`);return}let s=0,i=0,a=0,c=[],l=[],d=null,u=6e4,p={},m=ro.join(r,"config.json");if(Bt.existsSync(m))try{p=JSON.parse(Bt.readFileSync(m,"utf8"))}catch{}let g={pluginName:e,registerTool:f=>{K(f),c.push(f),s++},registerHook:(f,h)=>{let v=DR[f];if(!v){this.log.warn(`[plugins] ${e}: unknown hook phase "${f}"`);return}let b=this.config.hookRegistry.register({point:v,handler:h,label:`plugin:${e}:${f}`,priority:200});l.push(b),i++},registerSkill:f=>{this.pluginSkills.push(f),a++},getConfig:()=>p,setActivationCheck:(f,h)=>{d=f,h!==void 0&&(u=h)}};try{let h=await import(dL(o).href);if(typeof h.register!="function"){this.log.warn(`[plugins] ${e}: no register() export, skipping`);return}await h.register(g),d&&this.activations.set(e,{checkFn:d,ttlMs:u,lastCheckAt:Date.now(),lastResult:!0,tools:c,hookUnregisterFns:l,active:!0}),this.loaded.push({name:e,directory:r,toolCount:s,hookCount:i,skillCount:a}),this.log.info(`[plugins] ${e}: ${s} tools, ${i} hooks, ${a} skills`)}catch(f){this.log.warn(`[plugins] ${e}: load error: ${f instanceof Error?f.message:f}`)}}};N();import*as be from"node:fs";import*as no from"node:path";function ud(){return au()}function NR(){return no.join(ud(),"installed_plugins.json")}function LR(){let t=NR();if(!be.existsSync(t))return{version:1,plugins:[]};try{return JSON.parse(be.readFileSync(t,"utf-8"))}catch{return{version:1,plugins:[]}}}function uL(t){let e=ud();be.existsSync(e)||be.mkdirSync(e,{recursive:!0}),be.writeFileSync(NR(),JSON.stringify(t,null,2),"utf-8")}function pL(t,e){return!(e.blocklist?.includes(t)||e.allowlist&&!e.allowlist.includes(t))}async function mL(t,e,r){let{execFile:n}=await import("node:child_process"),{promisify:o}=await import("node:util"),s=o(n),i=ud(),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(`
|
|
1012
|
+
`).pop()?.trim();if(!l)return r.warn(`[marketplace] npm pack returned no output for ${a}`),null;let d=no.join(i,l),p=l.match(/^(.+)-(\d+\.\d+\.\d+.*)\.tgz$/)?.[2]??"0.0.0",m=no.join(i,`${t}@${p}`);be.existsSync(m)||be.mkdirSync(m,{recursive:!0}),await s("tar",["xzf",d,"-C",m,"--strip-components=1"],{timeout:3e4});try{be.unlinkSync(d)}catch{}let g=no.join(m,"package.json");if(be.existsSync(g))try{await s("npm",["install","--production","--no-save"],{cwd:m,timeout:12e4})}catch(f){r.warn(`[marketplace] npm install for ${t} failed: ${f.message}`)}return r.info(`[marketplace] installed ${t}@${p} from npm`),{name:t,version:p,installPath:m}}catch(c){return r.warn(`[marketplace] failed to install ${a} from npm: ${c.message}`),null}}function gL(){return LR().plugins.filter(e=>be.existsSync(e.installPath)).map(e=>e.installPath)}async function fL(t,e){let r=LR(),n=[];for(let o of t.enabledPlugins){let s=o.specifier.split("/").pop()??o.specifier;if(!pL(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&&be.existsSync(i.installPath)&&(!o.version||i.version===o.version)){n.push(i.installPath);continue}let a=null;switch(o.type){case"npm":a=await mL(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 uL(r),n}function hL(){let t=lu();if(!be.existsSync(t))return null;try{return JSON.parse(be.readFileSync(t,"utf-8"))}catch{return null}}async function OR(t,e){let r=[...t],n=gL();r.push(...n);let o=hL();if(o&&o.enabledPlugins.length>0)try{let s=await fL(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}N();function $R(t){let e=t.config.mcpServers,r,n=cu();try{rn.existsSync(n)&&(r=JSON.parse(rn.readFileSync(n,"utf8")))}catch{}let o=yL({turnMcpConfig:e??{},userMcpConfig:r,projectRoot:t.projectRoot});if(o.length===0)return;t.currentManager?.disconnectAll().catch(()=>{});let s=new ii({servers:o,log:t.log,workspaceRoot:t.projectRoot});t.setManager(s),ht(async()=>{await s.disconnectAll()});let i=()=>s;K(ER(i)),K(_R(i)),K(bL(s,t.toolCatalog)),t.setReady(s.connectAll().then(()=>{s.injectTools(),t.log.info(`[mcp] ${s.getToolCount()} tools from ${s.getConnectedServers().length} servers`)}).catch(a=>{t.log.warn(`[mcp] connection error: ${a instanceof Error?a.message:a}`)}))}function yL(t){let e=jR(dd(t.turnMcpConfig??{}),t.projectRoot),r=jR(dd(t.userMcpConfig??{}),t.projectRoot),n=new Set(e.map(o=>o.name));return[...e,...r.filter(o=>!n.has(o.name))]}function jR(t,e){return t.map(r=>(r.type??"stdio")!=="stdio"||r.cwd?r:{...r,cwd:e})}function bL(t,e){return MR({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(u=>u.text??"").join(`
|
|
1013
|
+
`)}}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"})})}function UR(t){let e=[],r=su();rn.existsSync(r)&&e.push(r);let n=t.config.pluginPaths;if(Array.isArray(n))for(let o of n)typeof o=="string"&&rn.existsSync(o)&&e.push(o);OR(e,t.log).then(o=>{if(o.length===0)return;let s=new ai({pluginDirs:o,hookRegistry:t.hooks,log:t.log});t.setPluginLoader(s),s.loadAll().then(i=>{t.log.info(`[plugins] ${i.length} loaded, ${s.getPluginSkills().length} skills`)}).catch(i=>{t.log.warn(`[plugins] load error: ${i instanceof Error?i.message:i}`)}),t.hooks.register({point:"turn.submitted",handler:async()=>(await s.discoverNew(),await s.refreshActivations(),{action:"continue"}),label:"plugin-activation-refresh",priority:50})}).catch(o=>{t.log.warn(`[plugins] marketplace resolve error: ${o instanceof Error?o.message:o}`)})}import*as Pt from"node:fs";import*as oo from"node:path";var vL="audit",kL="denials.jsonl",RL=10*1024*1024,ci=class{filePath;writeQueue=Promise.resolve();constructor(e){let r=oo.join(e,".qlogicagent",vL);this.filePath=oo.join(r,kL)}record(e){this.writeQueue=this.writeQueue.then(()=>this.doWrite(e)).catch(()=>{})}getFilePath(){return this.filePath}async doWrite(e){try{let r=oo.dirname(this.filePath);if(Pt.existsSync(r)||Pt.mkdirSync(r,{recursive:!0}),Pt.existsSync(this.filePath)&&Pt.statSync(this.filePath).size>RL){let s=this.filePath+".1";Pt.renameSync(this.filePath,s)}let n=JSON.stringify(e)+`
|
|
1014
|
+
`;Pt.appendFileSync(this.filePath,n,"utf-8")}catch{}}};function FR(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}import{randomUUID as EL}from"node:crypto";var SL=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"]),HR=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"]),TL=[/\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],BR=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 qR(t,e,r){let n=t.trim();if(!n)return{decision:"allow",reason:"empty command"};let o=Tl(n)??Al(n)??void 0;for(let l of TL)if(l.test(n))return{decision:"deny",reason:`matches dangerous pattern: ${l.source}`,destructiveWarning:o};for(let l of SL)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 HR.has(i)||HR.has(a)?{decision:"allow",reason:`known safe command: ${i}`,destructiveWarning:o}:e&&r&&e.startsWith(r)&&(BR.has(i)||BR.has(a))?{decision:"allow",reason:`safe in project: ${a}`,destructiveWarning:o}:{decision:"defer",reason:"unknown command \u2014 needs LLM classification",destructiveWarning:o}}function AL(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 pd(t,e){return`${t}::${AL(e)}`}var wL=500,li=class{cache=new Map;get(e,r){let n=pd(e,r),o=this.cache.get(n);if(o)return o.hitCount++,o}set(e,r,n){if(this.cache.size>=wL){let s=this.cache.keys().next().value;s!==void 0&&this.cache.delete(s)}let o=pd(e,r);this.cache.set(o,{shouldBlock:n.shouldBlock,reason:n.reason,classifiedAt:Date.now(),hitCount:0})}has(e,r){return this.cache.has(pd(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 PL=new Set(["read","search","instructions","think","task","memory","skill","tool_search","plan_mode","lsp","brief","web_search","checkpoint"]);function so(t){return PL.has(t)}var WR=`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.
|
|
1015
1015
|
|
|
1016
1016
|
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).
|
|
1017
1017
|
|
|
@@ -1033,7 +1033,7 @@ DANGEROUS operations (SHOULD be blocked):
|
|
|
1033
1033
|
- Running commands with sudo/admin privileges
|
|
1034
1034
|
- Downloading and executing unknown scripts
|
|
1035
1035
|
|
|
1036
|
-
Respond ONLY with XML. No other text.`;async function md(t,e,r,n){let o=Date.now();if(so(t))return{shouldBlock:!1,reason:"allowlisted safe tool",stage:"allowlist",durationMs:Date.now()-o};let s=
|
|
1036
|
+
Respond ONLY with XML. No other text.`;async function md(t,e,r,n){let o=Date.now();if(so(t))return{shouldBlock:!1,reason:"allowlisted safe tool",stage:"allowlist",durationMs:Date.now()-o};let s=xL(r),i=CL(t,e),a=`<transcript>
|
|
1037
1037
|
${s}
|
|
1038
1038
|
</transcript>
|
|
1039
1039
|
|
|
@@ -1049,24 +1049,24 @@ ${s}
|
|
|
1049
1049
|
${i}
|
|
1050
1050
|
</action>
|
|
1051
1051
|
|
|
1052
|
-
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>.`,p=await n({system:WR,messages:[{role:"user",content:u}],maxTokens:4096,temperature:0,cacheSystemPrompt:!0}),m=zR(p.text),g=GR(m),f=KR(m)??KR(l)??"classifier decision";return{shouldBlock:g!==!1,reason:f,stage:"thinking",durationMs:Date.now()-o}}catch{return{shouldBlock:!0,reason:"classifier unavailable",stage:"fast",durationMs:Date.now()-o}}}function
|
|
1053
|
-
`)}function
|
|
1054
|
-
Arguments: ${n}`}function GR(t){let e=t.match(/<block>(yes|no)<\/block>/i);return e?e[1].toLowerCase()==="yes":null}function KR(t){let e=t.match(/<reason>([\s\S]*?)(?:<\/reason>|$)/i);return e?e[1].trim():null}function zR(t){return t.replace(/<thinking>[\s\S]*?<\/thinking>/gi,"").trim()}var VR={maxConsecutive:3,maxTotal:20};function XR(){return{consecutiveDenials:0,totalDenials:0}}function gd(t){return{consecutiveDenials:t.consecutiveDenials+1,totalDenials:t.totalDenials+1}}function fd(t){return t.consecutiveDenials===0?t:{...t,consecutiveDenials:0}}function YR(t){return t.consecutiveDenials>=VR.maxConsecutive||t.totalDenials>=VR.maxTotal}var xL=[{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 JR(){return xL.map(({ruleId:t,...e})=>({...e}))}var IL=12e4,di=class{ruleEngine;hookRegistry;onRequestApproval;onPermissionUpdate;onDenied;classifierLLMCall;getRecentMessages;permissionRole;pendingApprovals=new Map;auditLogger;sessionId;getTurnId;communityTelemetryRecorder;communitySandboxTurnIds=new Set;communitySandboxRuleEngine=new Zr({mode:"default",defaultBehavior:"allow",rules:JR()});unregisterHook=null;toolMetaCache=new Map;classifierCache=new li;denialTracking=XR();constructor(e){this.ruleEngine=e.ruleEngine,this.hookRegistry=e.hookRegistry,this.onRequestApproval=e.onRequestApproval,this.onPermissionUpdate=e.onPermissionUpdate,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,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){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:"denied",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:FR(s),cumulativeDenials:this.denialTracking.totalDenials,consecutiveDenials:this.denialTracking.consecutiveDenials}),EL(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.fireDenied(r,n,e.message,"rule-engine",o,hd(e.decisionReason)),{action:"abort",reason:e.message};let s=ML(e),i=e.decisionReason?.type==="tool_check"&&(e.decisionReason.reason==="isDangerous"||e.decisionReason.reason==="requiresApproval");if(s&&this.permissionRole!=="interactive")return this.fireDenied(r,n,`community sandbox requires interactive approval: ${e.message}`,"safety",o,hd(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,hd(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=qR(c);if(l.decision==="allow")return{action:"continue"};if(l.decision==="deny")return 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.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")return this.toolMetaCache.get(n)?.isReadOnly||so(n)?{action:"continue"}:this.handleWorkerAsk(r,n,o);if(this.ruleEngine.getMode()==="auto"){if(so(n))return{action:"continue"};let c=YR(this.denialTracking);if(this.classifierLLMCall&&!c)try{let l=this.getRecentMessages?.()??[],d=await md(n,o??{},l,this.classifierLLMCall);if(o&&this.classifierCache.set(n,o,{shouldBlock:d.shouldBlock,reason:d.reason}),!d.shouldBlock)return this.denialTracking=fd(this.denialTracking),{action:"continue",context:{decisionReason:{type:"classifier",classifier:"auto",reason:d.reason}}};this.denialTracking=gd(this.denialTracking)}catch{}}return this.handleInteractiveApproval(e,r,n,o)}async handleInteractiveApproval(e,r,n,o){let s=CL(),i={approvalId:s,callId:r,toolName:n,arguments:o,message:e.message,suggestions:e.suggestions};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==="approved"?"approved":"denied"}).catch(()=>{}),a.permissionUpdate&&(this.ruleEngine.applyUpdate(a.permissionUpdate),this.onPermissionUpdate?.(a.permissionUpdate)),a.decision==="approved"?{action:"continue",context:a.updatedInput?{arguments:a.updatedInput}:void 0}:(this.fireDenied(r,n,`denied by user (approval ${s})`,"user",o),{action:"abort",reason:`Tool "${n}" denied by user`})}catch{return this.fireDenied(r,n,`approval timeout or error (approval ${s})`,"timeout",o),{action:"abort",reason:`Tool "${n}"approval timed out`}}}async handleWorkerAsk(e,r,n){if(so(r))return{action:"continue"};if(this.classifierLLMCall)try{let o=this.getRecentMessages?.()??[],s=await md(r,n??{},o,this.classifierLLMCall);return n&&this.classifierCache.set(r,n,{shouldBlock:s.shouldBlock,reason:s.reason}),s.shouldBlock?(this.denialTracking=gd(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=fd(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"))},IL);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 EL(t){return t==="classifier"||t==="rule-engine"||t==="safety"||t==="static-deny"}function _L(t){return`${t}-deny`}function hd(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 ML(t){return t.behavior==="ask"&&t.decisionReason?.type==="rule"&&t.decisionReason.rule.source==="community-sandbox"}N();import*as nn from"node:fs";import*as ZR from"node:path";function eS(t,e=de()){if(t.scope==="session")return;let r=DL(e),n=NL(r),s=[{pattern:t.pattern,behavior:t.behavior,reason:t.description,source:"user"},...n.rules.filter(i=>!UL(i.pattern,t.pattern))];r.permissions={...yd(r.permissions),mode:n.mode,defaultBehavior:n.defaultBehavior,rules:s},nn.mkdirSync(ZR.dirname(e),{recursive:!0}),nn.writeFileSync(e,`${JSON.stringify(r,null,2)}
|
|
1055
|
-
`,"utf-8")}function DL(t){try{return JSON.parse(nn.readFileSync(t,"utf-8"))}catch{return{}}}function NL(t){let e=yd(t.permissions);return{mode:jL(e.mode??t.permissionMode),defaultBehavior:$L(e.defaultBehavior??e.default??t.defaultBehavior),rules:LL(t,e)}}function LL(t,e){return OL(e)?QR(e,"rules"):Array.isArray(t.permissionRules)?tS(t.permissionRules):QR(t,"rules")}function QR(t,e){let r=[];for(let n of["allow","deny","ask"]){let o=t[n];if(Array.isArray(o))for(let s of o)typeof s=="string"&&s.trim()&&r.push({pattern:s,behavior:n,source:"config"})}return r.push(...tS(t[e])),r}function tS(t){if(!Array.isArray(t))return[];let e=[];for(let r of t){let n=yd(r);if(!n)continue;let o=n.pattern,s=rS(n.behavior??n.action);if(typeof o!="string"||!o.trim()||!s)continue;let i={pattern:o,behavior:s};typeof n.reason=="string"&&(i.reason=n.reason),typeof n.source=="string"&&(i.source=n.source),e.push(i)}return e}function OL(t){return Array.isArray(t.rules)||Array.isArray(t.allow)||Array.isArray(t.ask)||Array.isArray(t.deny)}function jL(t){return t==="default"||t==="bypassPermissions"||t==="acceptEdits"||t==="dontAsk"||t==="plan"||t==="auto"?t:"default"}function $L(t){return rS(t)??"allow"}function rS(t){return t==="allow"||t==="ask"||t==="deny"?t:void 0}function UL(t,e){return t.toLocaleLowerCase()===e.toLocaleLowerCase()}function yd(t){return t&&typeof t=="object"?t:{}}function nS(){return ne()?.type==="group"}function oS(t){let e=Pr(t.config.permissions),r=new Zr(e);if(e.mode,nS()){let o=Yb();for(let s of o)r.addRule(s);Wl(!0),t.log.info(`[permissions] group security mode active: ${o.length} rules injected`)}else Wl(!1);t.currentUnregister?.();let n=new di({ruleEngine:r,hookRegistry:t.hooks,auditLogger:new ci(t.getActiveProjectRoot()),sessionId:t.sessionId,getTurnId:t.getTurnId,communityTelemetryRecorder:rs()??void 0,onRequestApproval:o=>FL(o,t),onPermissionUpdate:o=>{try{eS(o)}catch(s){t.log.warn(`[permissions] failed to persist rule "${o.pattern}": ${s instanceof Error?s.message:String(s)}`)}t.log.info(`[permissions] rule saved: ${o.pattern} -> ${o.behavior}`),t.sendNotification("permission.rule_updated",{pattern:o.pattern,behavior:o.behavior,scope:o.scope??"persistent"})},onDenied:(o,s)=>{t.log.warn(`[permissions] blocked "${o}": ${s}`)}});return n.setToolMeta(Ie()),{permissionChecker:n,permissionUnregister:n.register(),ruleEngine:r}}async function FL(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:"Allow"},{id:"deny",label:"Deny"},{id:"allowAlways",label:"Always allow",persistent:!0}]});return HL(t,n.optionId)}catch{return{approvalId:t.approvalId,decision:"denied"}}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,suggestions:t.suggestions?.map(n=>`${n.pattern}:${n.behavior}`)}),e.isPetActive()){let n=t.toolName.match(/delete|rm|drop|reset|force/i)?"high":t.toolName.match(/write|exec|bash|shell|move/i)?"medium":"low";e.sendNotification("pet.confirm",{confirmId:t.approvalId,toolName:t.toolName,description:t.message??`Allow ${t.toolName}`,risk:n,timeoutMs:3e4})}return new Promise(()=>{})}function HL(t,e){if(e!=="allow"&&e!=="allowAlways")return{approvalId:t.approvalId,decision:"denied"};let r={approvalId:t.approvalId,decision:"approved"};return e==="allowAlways"&&(r.permissionUpdate={pattern:t.toolName,behavior:"allow",scope:"persistent",description:`Always allow ${t.toolName}`}),r}function sS(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 iS(t){let e=sS(t.log);t.taskStore.setHooks(e,t.sessionId),nv({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=Uk({hooks:e,projectRoot:t.projectRoot,currentUserId:t.currentUserId,log:t.log,prefetchState:t.prefetchState,getLastUserMessage:t.getLastUserMessage,getLastAssistantMessage:t.getLastAssistantMessage,resolveSmallModelClient:t.resolveSmallModelClient});return qm(e,{currentCwd:t.projectRoot,log:{debug:n=>t.log.debug(n),warn:n=>t.log.warn(n)}}),Qp(e,t.log,{transport:t.compressionClient.transport,apiKey:t.compressionClient.apiKey}),Fk({memdir:t.memdir,memoryProvider:r.toolProvider,memoryUserId:r.userId}),tu(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}}N();import{watch as BL}from"node:fs";import{stat as qL}from"node:fs/promises";import{join as aS,relative as WL,resolve as GL}from"node:path";var KL=[`${Oe}/settings.json`,"INSTRUCTIONS.md",`${Oe}/INSTRUCTIONS.md`,"INSTRUCTIONS.local.md",`${Oe}/rules`],zL=["INSTRUCTIONS.md","INSTRUCTIONS.local.md",`${Oe}/rules`],bd=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 KL){let r=aS(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=BL(e,{persistent:!1,recursive:r.includes("/")?!1:void 0},(o,s)=>{let i=s?aS(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 qL(e)}catch{o="deleted"}let s=WL(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(()=>{}),zL.some(a=>s.includes(a)||e.includes(a))&&this.deps.onInstructionCacheReset?.()},300))}setCwd(e){let r=GL(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 cS(t){let e=new bd(t);return await e.start(),e}import{readFile as VL}from"node:fs/promises";import{watch as XL}from"node:fs";import{join as YL}from"node:path";N();var JL=Oe,QL="settings.json";function ZL(t){return YL(t,JL,QL)}async function eO(t){try{let e=await VL(t,"utf-8");return JSON.parse(e)}catch{return null}}function tO(t,e,r,n){let o=!1,s=rO(t);s&&(t.permissionMode=s.mode,t.permissionRules=[...s.rules],t.defaultBehavior=s.defaultBehavior,s.mode!==e.getMode()&&(e.setMode(s.mode),n?.(`settings: permission mode \u2192 ${t.permissionMode}`),o=!0),nO(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 \u2192 ${t.defaultBehavior}`),o=!0),o&&r&&r.invoke("config.changed",{sessionId:"",key:"permissions",oldValue:void 0,newValue:t}).catch(()=>{}))}function lS(t){let e=ZL(t.projectRoot),r=null,n=null,o=async()=>{let s=await eO(e);s&&tO(s,t.ruleEngine,t.hooks,t.log)};o().catch(()=>{});try{r=XL(e,{persistent:!1},s=>{n&&clearTimeout(n),n=setTimeout(()=>{o().catch(()=>{})},200)}),r.on("error",()=>{})}catch{}return()=>{n&&clearTimeout(n),r?.close(),r=null}}function rO(t){return t.permissions&&typeof t.permissions=="object"?Pr(t.permissions):t.permissionMode===void 0&&t.permissionRules===void 0&&t.defaultBehavior===void 0?null:Pr({mode:t.permissionMode,rules:t.permissionRules,defaultBehavior:t.defaultBehavior})}function nO(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 dS(t){let e=typeof t.config.workdir=="string"?t.config.workdir:process.cwd(),r=lS({projectRoot:e,ruleEngine:t.ruleEngine,hooks:t.hooks,log:n=>t.log.info(`[settings] ${n}`)});ht(async()=>{r()}),t.currentFileWatcher?.stop(),t.setFileWatcher(null),cS({projectRoot:e,sessionId:t.sessionId,hooks:t.hooks,log:n=>t.log.debug(n),onInstructionCacheReset:Dv}).then(n=>{t.setFileWatcher(n),ht(async()=>{n.stop()})}).catch(n=>{t.log.warn(`[file-watcher] init error: ${n instanceof Error?n.message:n}`)})}import{randomUUID as pO}from"node:crypto";import*as pe from"node:fs";import*as we from"node:path";N();var oO="skill",sO={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(`
|
|
1056
|
-
`)},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 uS(t){return{name:
|
|
1052
|
+
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>.`,p=await n({system:WR,messages:[{role:"user",content:u}],maxTokens:4096,temperature:0,cacheSystemPrompt:!0}),m=zR(p.text),g=GR(m),f=KR(m)??KR(l)??"classifier decision";return{shouldBlock:g!==!1,reason:f,stage:"thinking",durationMs:Date.now()-o}}catch{return{shouldBlock:!0,reason:"classifier unavailable",stage:"fast",durationMs:Date.now()-o}}}function xL(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(`
|
|
1053
|
+
`)}function CL(t,e){let r=JSON.stringify(e,null,0),n=r.length>2e3?r.slice(0,2e3)+"...":r;return`Tool: ${t}
|
|
1054
|
+
Arguments: ${n}`}function GR(t){let e=t.match(/<block>(yes|no)<\/block>/i);return e?e[1].toLowerCase()==="yes":null}function KR(t){let e=t.match(/<reason>([\s\S]*?)(?:<\/reason>|$)/i);return e?e[1].trim():null}function zR(t){return t.replace(/<thinking>[\s\S]*?<\/thinking>/gi,"").trim()}var VR={maxConsecutive:3,maxTotal:20};function XR(){return{consecutiveDenials:0,totalDenials:0}}function gd(t){return{consecutiveDenials:t.consecutiveDenials+1,totalDenials:t.totalDenials+1}}function fd(t){return t.consecutiveDenials===0?t:{...t,consecutiveDenials:0}}function YR(t){return t.consecutiveDenials>=VR.maxConsecutive||t.totalDenials>=VR.maxTotal}var IL=[{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 JR(){return IL.map(({ruleId:t,...e})=>({...e}))}var _L=12e4,di=class{ruleEngine;hookRegistry;onRequestApproval;onPermissionUpdate;onDenied;classifierLLMCall;getRecentMessages;permissionRole;pendingApprovals=new Map;auditLogger;sessionId;getTurnId;communityTelemetryRecorder;communitySandboxTurnIds=new Set;communitySandboxRuleEngine=new Zr({mode:"default",defaultBehavior:"allow",rules:JR()});unregisterHook=null;toolMetaCache=new Map;classifierCache=new li;denialTracking=XR();constructor(e){this.ruleEngine=e.ruleEngine,this.hookRegistry=e.hookRegistry,this.onRequestApproval=e.onRequestApproval,this.onPermissionUpdate=e.onPermissionUpdate,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,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){let r=this.communitySandboxRuleEngine.check(e);return r.behavior!=="allow"?r:this.ruleEngine.check(e)}fireDenied(e,r,n,o="classifier",s,i=DL(o)){this.onDenied?.(r,n),this.hookRegistry.invoke("permission.denied",{sessionId:this.sessionId,turnId:this.getTurnId(),approvalId:e,callId:e,toolName:r,decision:"denied",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:FR(s),cumulativeDenials:this.denialTracking.totalDenials,consecutiveDenials:this.denialTracking.consecutiveDenials}),ML(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.fireDenied(r,n,e.message,"rule-engine",o,hd(e.decisionReason)),{action:"abort",reason:e.message};let s=NL(e),i=e.decisionReason?.type==="tool_check"&&(e.decisionReason.reason==="isDangerous"||e.decisionReason.reason==="requiresApproval");if(s&&this.permissionRole!=="interactive")return this.fireDenied(r,n,`community sandbox requires interactive approval: ${e.message}`,"safety",o,hd(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,hd(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=qR(c);if(l.decision==="allow")return{action:"continue"};if(l.decision==="deny")return 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.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")return this.toolMetaCache.get(n)?.isReadOnly||so(n)?{action:"continue"}:this.handleWorkerAsk(r,n,o);if(this.ruleEngine.getMode()==="auto"){if(so(n))return{action:"continue"};let c=YR(this.denialTracking);if(this.classifierLLMCall&&!c)try{let l=this.getRecentMessages?.()??[],d=await md(n,o??{},l,this.classifierLLMCall);if(o&&this.classifierCache.set(n,o,{shouldBlock:d.shouldBlock,reason:d.reason}),!d.shouldBlock)return this.denialTracking=fd(this.denialTracking),{action:"continue",context:{decisionReason:{type:"classifier",classifier:"auto",reason:d.reason}}};this.denialTracking=gd(this.denialTracking)}catch{}}return this.handleInteractiveApproval(e,r,n,o)}async handleInteractiveApproval(e,r,n,o){let s=EL(),i={approvalId:s,callId:r,toolName:n,arguments:o,message:e.message,suggestions:e.suggestions};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==="approved"?"approved":"denied"}).catch(()=>{}),a.permissionUpdate&&(this.ruleEngine.applyUpdate(a.permissionUpdate),this.onPermissionUpdate?.(a.permissionUpdate)),a.decision==="approved"?{action:"continue",context:a.updatedInput?{arguments:a.updatedInput}:void 0}:(this.fireDenied(r,n,`denied by user (approval ${s})`,"user",o),{action:"abort",reason:`Tool "${n}" denied by user`})}catch{return this.fireDenied(r,n,`approval timeout or error (approval ${s})`,"timeout",o),{action:"abort",reason:`Tool "${n}"approval timed out`}}}async handleWorkerAsk(e,r,n){if(so(r))return{action:"continue"};if(this.classifierLLMCall)try{let o=this.getRecentMessages?.()??[],s=await md(r,n??{},o,this.classifierLLMCall);return n&&this.classifierCache.set(r,n,{shouldBlock:s.shouldBlock,reason:s.reason}),s.shouldBlock?(this.denialTracking=gd(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=fd(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"))},_L);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 ML(t){return t==="classifier"||t==="rule-engine"||t==="safety"||t==="static-deny"}function DL(t){return`${t}-deny`}function hd(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 NL(t){return t.behavior==="ask"&&t.decisionReason?.type==="rule"&&t.decisionReason.rule.source==="community-sandbox"}N();import*as nn from"node:fs";import*as ZR from"node:path";function eS(t,e=de()){if(t.scope==="session")return;let r=LL(e),n=OL(r),s=[{pattern:t.pattern,behavior:t.behavior,reason:t.description,source:"user"},...n.rules.filter(i=>!HL(i.pattern,t.pattern))];r.permissions={...yd(r.permissions),mode:n.mode,defaultBehavior:n.defaultBehavior,rules:s},nn.mkdirSync(ZR.dirname(e),{recursive:!0}),nn.writeFileSync(e,`${JSON.stringify(r,null,2)}
|
|
1055
|
+
`,"utf-8")}function LL(t){try{return JSON.parse(nn.readFileSync(t,"utf-8"))}catch{return{}}}function OL(t){let e=yd(t.permissions);return{mode:UL(e.mode??t.permissionMode),defaultBehavior:FL(e.defaultBehavior??e.default??t.defaultBehavior),rules:jL(t,e)}}function jL(t,e){return $L(e)?QR(e,"rules"):Array.isArray(t.permissionRules)?tS(t.permissionRules):QR(t,"rules")}function QR(t,e){let r=[];for(let n of["allow","deny","ask"]){let o=t[n];if(Array.isArray(o))for(let s of o)typeof s=="string"&&s.trim()&&r.push({pattern:s,behavior:n,source:"config"})}return r.push(...tS(t[e])),r}function tS(t){if(!Array.isArray(t))return[];let e=[];for(let r of t){let n=yd(r);if(!n)continue;let o=n.pattern,s=rS(n.behavior??n.action);if(typeof o!="string"||!o.trim()||!s)continue;let i={pattern:o,behavior:s};typeof n.reason=="string"&&(i.reason=n.reason),typeof n.source=="string"&&(i.source=n.source),e.push(i)}return e}function $L(t){return Array.isArray(t.rules)||Array.isArray(t.allow)||Array.isArray(t.ask)||Array.isArray(t.deny)}function UL(t){return t==="default"||t==="bypassPermissions"||t==="acceptEdits"||t==="dontAsk"||t==="plan"||t==="auto"?t:"default"}function FL(t){return rS(t)??"allow"}function rS(t){return t==="allow"||t==="ask"||t==="deny"?t:void 0}function HL(t,e){return t.toLocaleLowerCase()===e.toLocaleLowerCase()}function yd(t){return t&&typeof t=="object"?t:{}}function nS(){return ne()?.type==="group"}function oS(t){let e=Pr(t.config.permissions),r=new Zr(e);if(e.mode,nS()){let o=Yb();for(let s of o)r.addRule(s);Wl(!0),t.log.info(`[permissions] group security mode active: ${o.length} rules injected`)}else Wl(!1);t.currentUnregister?.();let n=new di({ruleEngine:r,hookRegistry:t.hooks,auditLogger:new ci(t.getActiveProjectRoot()),sessionId:t.sessionId,getTurnId:t.getTurnId,communityTelemetryRecorder:rs()??void 0,onRequestApproval:o=>BL(o,t),onPermissionUpdate:o=>{try{eS(o)}catch(s){t.log.warn(`[permissions] failed to persist rule "${o.pattern}": ${s instanceof Error?s.message:String(s)}`)}t.log.info(`[permissions] rule saved: ${o.pattern} -> ${o.behavior}`),t.sendNotification("permission.rule_updated",{pattern:o.pattern,behavior:o.behavior,scope:o.scope??"persistent"})},onDenied:(o,s)=>{t.log.warn(`[permissions] blocked "${o}": ${s}`)}});return n.setToolMeta(Ie()),{permissionChecker:n,permissionUnregister:n.register(),ruleEngine:r}}async function BL(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:"Allow"},{id:"deny",label:"Deny"},{id:"allowAlways",label:"Always allow",persistent:!0}]});return qL(t,n.optionId)}catch{return{approvalId:t.approvalId,decision:"denied"}}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,suggestions:t.suggestions?.map(n=>`${n.pattern}:${n.behavior}`)}),e.isPetActive()){let n=t.toolName.match(/delete|rm|drop|reset|force/i)?"high":t.toolName.match(/write|exec|bash|shell|move/i)?"medium":"low";e.sendNotification("pet.confirm",{confirmId:t.approvalId,toolName:t.toolName,description:t.message??`Allow ${t.toolName}`,risk:n,timeoutMs:3e4})}return new Promise(()=>{})}function qL(t,e){if(e!=="allow"&&e!=="allowAlways")return{approvalId:t.approvalId,decision:"denied"};let r={approvalId:t.approvalId,decision:"approved"};return e==="allowAlways"&&(r.permissionUpdate={pattern:t.toolName,behavior:"allow",scope:"persistent",description:`Always allow ${t.toolName}`}),r}function sS(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 iS(t){let e=sS(t.log);t.taskStore.setHooks(e,t.sessionId),nv({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=Uk({hooks:e,projectRoot:t.projectRoot,currentUserId:t.currentUserId,log:t.log,prefetchState:t.prefetchState,getLastUserMessage:t.getLastUserMessage,getLastAssistantMessage:t.getLastAssistantMessage,resolveSmallModelClient:t.resolveSmallModelClient});return qm(e,{currentCwd:t.projectRoot,log:{debug:n=>t.log.debug(n),warn:n=>t.log.warn(n)}}),Qp(e,t.log,{transport:t.compressionClient.transport,apiKey:t.compressionClient.apiKey}),Fk({memdir:t.memdir,memoryProvider:r.toolProvider,memoryUserId:r.userId}),tu(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}}N();import{watch as WL}from"node:fs";import{stat as GL}from"node:fs/promises";import{join as aS,relative as KL,resolve as zL}from"node:path";var VL=[`${Oe}/settings.json`,"INSTRUCTIONS.md",`${Oe}/INSTRUCTIONS.md`,"INSTRUCTIONS.local.md",`${Oe}/rules`],XL=["INSTRUCTIONS.md","INSTRUCTIONS.local.md",`${Oe}/rules`],bd=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 VL){let r=aS(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=WL(e,{persistent:!1,recursive:r.includes("/")?!1:void 0},(o,s)=>{let i=s?aS(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 GL(e)}catch{o="deleted"}let s=KL(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(()=>{}),XL.some(a=>s.includes(a)||e.includes(a))&&this.deps.onInstructionCacheReset?.()},300))}setCwd(e){let r=zL(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 cS(t){let e=new bd(t);return await e.start(),e}import{readFile as YL}from"node:fs/promises";import{watch as JL}from"node:fs";import{join as QL}from"node:path";N();var ZL=Oe,eO="settings.json";function tO(t){return QL(t,ZL,eO)}async function rO(t){try{let e=await YL(t,"utf-8");return JSON.parse(e)}catch{return null}}function nO(t,e,r,n){let o=!1,s=oO(t);s&&(t.permissionMode=s.mode,t.permissionRules=[...s.rules],t.defaultBehavior=s.defaultBehavior,s.mode!==e.getMode()&&(e.setMode(s.mode),n?.(`settings: permission mode \u2192 ${t.permissionMode}`),o=!0),sO(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 \u2192 ${t.defaultBehavior}`),o=!0),o&&r&&r.invoke("config.changed",{sessionId:"",key:"permissions",oldValue:void 0,newValue:t}).catch(()=>{}))}function lS(t){let e=tO(t.projectRoot),r=null,n=null,o=async()=>{let s=await rO(e);s&&nO(s,t.ruleEngine,t.hooks,t.log)};o().catch(()=>{});try{r=JL(e,{persistent:!1},s=>{n&&clearTimeout(n),n=setTimeout(()=>{o().catch(()=>{})},200)}),r.on("error",()=>{})}catch{}return()=>{n&&clearTimeout(n),r?.close(),r=null}}function oO(t){return t.permissions&&typeof t.permissions=="object"?Pr(t.permissions):t.permissionMode===void 0&&t.permissionRules===void 0&&t.defaultBehavior===void 0?null:Pr({mode:t.permissionMode,rules:t.permissionRules,defaultBehavior:t.defaultBehavior})}function sO(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 dS(t){let e=typeof t.config.workdir=="string"?t.config.workdir:process.cwd(),r=lS({projectRoot:e,ruleEngine:t.ruleEngine,hooks:t.hooks,log:n=>t.log.info(`[settings] ${n}`)});ht(async()=>{r()}),t.currentFileWatcher?.stop(),t.setFileWatcher(null),cS({projectRoot:e,sessionId:t.sessionId,hooks:t.hooks,log:n=>t.log.debug(n),onInstructionCacheReset:Dv}).then(n=>{t.setFileWatcher(n),ht(async()=>{n.stop()})}).catch(n=>{t.log.warn(`[file-watcher] init error: ${n instanceof Error?n.message:n}`)})}import{randomUUID as gO}from"node:crypto";import*as pe from"node:fs";import*as we from"node:path";N();var iO="skill",aO={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(`
|
|
1056
|
+
`)},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 uS(t){return{name:iO,label:"Skill",description:mO(t),parameters:aO,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 cO(t,r,n);case"list":return lO(t,r);case"view":return dO(t,r);case"create":case"edit":case"patch":case"delete":return uO(t,r);case"promote":return pO(t,r);default:return{content:[{type:"text",text:`Unknown action: ${o}. Use invoke, list, view, create, edit, patch, delete, or promote.`}]}}}}}async function cO(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}
|
|
1057
1057
|
|
|
1058
1058
|
`,a=o?`
|
|
1059
1059
|
|
|
1060
1060
|
### User Context
|
|
1061
1061
|
${o}`:"";return{content:[{type:"text",text:`${i}Follow these instructions:
|
|
1062
1062
|
|
|
1063
|
-
${s}${a}`}],details:{skillName:n,action:"invoke",mode:"inline"}}}async function
|
|
1064
|
-
`)}],details:{action:"list",count:r.skills.length}}}async function
|
|
1063
|
+
${s}${a}`}],details:{skillName:n,action:"invoke",mode:"inline"}}}async function lO(t,e){let r=await t.listSkillsFull(e.category);if(r.skills.length===0)return{content:[{type:"text",text:e.category?`No skills found in category "${e.category}".`:"No skills available."}],details:{action:"list",count:0}};let n=[`Available skills (${r.skills.length}):`];r.categories.length>0&&n.push(`Categories: ${r.categories.join(", ")}`),n.push("");for(let o of r.skills){let s=o.category?` [${o.category}]`:"",i=o.version?` (v${o.version})`:"",a=o.scope?` {${o.scope}}`:"";n.push(`- **${o.name}**${i}${s}${a}: ${o.description}`)}return{content:[{type:"text",text:n.join(`
|
|
1064
|
+
`)}],details:{action:"list",count:r.skills.length}}}async function dO(t,e){if(!e.name)return{content:[{type:"text",text:"Error: 'name' is required for view."}]};let r=await t.viewSkill(e.name,e.filePath);if(!r)return{content:[{type:"text",text:`Skill "${e.name}" not found. Use action: "list" to see available skills.`}],details:{action:"view",error:"not_found"}};let n=[`## Skill: ${r.name}
|
|
1065
1065
|
`,r.content];return r.referenceFiles&&r.referenceFiles.length>0&&n.push(`
|
|
1066
1066
|
### Reference Files
|
|
1067
1067
|
${r.referenceFiles.map(o=>`- ${o}`).join(`
|
|
1068
1068
|
`)}`),{content:[{type:"text",text:n.join(`
|
|
1069
|
-
`)}],details:{action:"view",name:r.name}}}async function
|
|
1069
|
+
`)}],details:{action:"view",name:r.name}}}async function uO(t,e){if(!e.name)return{content:[{type:"text",text:`Error: 'name' is required for ${e.action}.`}]};let r=await t.manageSkill({action:e.action,name:e.name,category:e.category,content:e.content,filePath:e.filePath,fileContent:e.fileContent,oldString:e.oldString,newString:e.newString});return{content:[{type:"text",text:r.message}],details:{action:e.action,success:r.success,path:r.path}}}async function pO(t,e){if(!e.name)return{content:[{type:"text",text:"Error: 'name' is required for promote."}]};if(!t.promoteSkill)return{content:[{type:"text",text:"Promote is not available in this configuration. Skills may already be at user-level."}]};let r=await t.promoteSkill(e.name);return{content:[{type:"text",text:r.message}],details:{action:"promote",success:r.success,name:e.name}}}function mO(t){let e=t.listSkills(),r=`Manage and invoke skills \u2014 reusable workflows and domain-specific knowledge packages. Use action: 'list' to discover skills, 'view' to read content, 'invoke' to run a skill. Skills can also be created, edited, patched, or deleted. Use 'promote' (with name) to copy a project skill to global (user-level) so it's available across all projects.
|
|
1070
1070
|
|
|
1071
1071
|
CROSS-PROJECT RECALL: When you see '[Cross-project skill available]' in recalled memories, it means a relevant skill exists in another project. You should proactively inform the user and offer to use it (invoke) or promote it to global. Do not wait for explicit instructions \u2014 the user may not know the skill exists. Typical user signals: '\u4E4B\u524D\u505A\u8FC7', '\u53C2\u8003XX\u9879\u76EE', 'didn't you do this before', 'same as the other project'.`;if(e.length===0)return r;let n=e.slice(0,50).map(o=>`- ${o.name}: ${o.description??"(no description)"}`).join(`
|
|
1072
1072
|
`);return`${r}
|
|
@@ -1074,16 +1074,16 @@ CROSS-PROJECT RECALL: When you see '[Cross-project skill available]' in recalled
|
|
|
1074
1074
|
Available skills:
|
|
1075
1075
|
${n}`}function pS(t,e){let r=e.config,n=Et(t.getActiveProjectRoot()),o=[n,ft(),...Array.isArray(r?.skillPaths)?r.skillPaths:[]];K(uS({listSkills:()=>{let s=[];s.push(...t.getPluginSkills());let i=r?.skillPaths;if(Array.isArray(i)){for(let a of i)if(typeof a=="string"){let c=we.basename(a);s.some(l=>l.name===c)||s.push({name:c,source:"gateway",filePath:we.join(a,"SKILL.md"),baseDir:a})}}return s},listSkillsFull:async s=>{let i=[],a=new Set,c=ft();for(let l of o)try{let d=await pe.promises.readdir(l,{withFileTypes:!0});for(let u of d){if(!u.isDirectory())continue;let p=we.join(l,u.name,"SKILL.md");try{let m=await pe.promises.readFile(p,"utf8"),g=we.basename(l);if(s&&g!==s)continue;a.add(g);let f=l===c?"global":l===n?"project":"config",v=m.match(/^---\n[\s\S]*?^version:\s*(\S+)/m)?.[1],b=m.startsWith(`---
|
|
1076
1076
|
`)?m.indexOf("---",4):-1,A=(b>=0?m.slice(b+3).trimStart():m).split(`
|
|
1077
|
-
`).find(P=>P.trim()&&!P.startsWith("#"))?.trim()??`Skill from ${g}`;i.push({name:u.name,description:A,category:g,scope:f,version:v})}catch{}}}catch{}for(let l of t.getPluginSkills())s&&l.source!==s||(a.add(l.source??"plugin"),i.push({name:l.name,description:`Plugin skill (${l.source})`,category:l.source,scope:"plugin"}));return{skills:i,categories:[...a]}},readSkillContent:async s=>{for(let i of o){let a=we.join(i,s,"SKILL.md");try{return await pe.promises.readFile(a,"utf8")}catch{}}return null},viewSkill:async(s,i)=>{for(let a of o){let c=i?we.join(a,s,i):we.join(a,s,"SKILL.md");try{let l=await pe.promises.readFile(c,"utf8");return{name:s,content:l}}catch{}}return null},executeSkillSubturn:async(s,i,a,c)=>{let l=`skill_${s}_${
|
|
1078
|
-
`).slice(0,3).join(" ").slice(0,200),T=i?we.basename(i):"unknown";h.ingestExtracted([{text:`Learned skill "${s.name}" in project "${T}": ${R}`,category:"skill-learning"}],v).catch(()=>{})}let b=i?` (project-scoped). To make it available across all projects, use: skill promote name:"${s.name}"`:"";return{success:!0,message:`Skill "${s.name}" created${b}`,path:c}}case"edit":{let u=ge(d);if(u.records[s.name]?.pinned)return{success:!1,message:`Skill "${s.name}" is pinned. Unpin it first.`};let p=s.content??"",g=xc(p,s.name)??p;return await pe.promises.writeFile(l,g,"utf8"),Ac(u,s.name),Re(d,u),t.sendNotification("turn.skill_instruction",{turnId:`skill-edit-${Date.now()}`,instruction:{name:s.name,category:s.category??"learned",content:g,scope:"project"}}),{success:!0,message:`Skill "${s.name}" updated`,path:l}}case"patch":{let u=ge(d);if(u.records[s.name]?.pinned)return{success:!1,message:`Skill "${s.name}" is pinned. Unpin it first.`};let p=await pe.promises.readFile(l,"utf8");if(!s.oldString||!p.includes(s.oldString))return{success:!1,message:"oldString not found in SKILL.md"};let m=p.replace(s.oldString,s.newString??"");return await pe.promises.writeFile(l,m,"utf8"),Ac(u,s.name),Re(d,u),t.sendNotification("turn.skill_instruction",{turnId:`skill-patch-${Date.now()}`,instruction:{name:s.name,category:s.category??"learned",content:m,scope:"project"}}),{success:!0,message:`Skill "${s.name}" patched`,path:l}}case"delete":{let u=ge(d);return u.records[s.name]?.pinned?{success:!1,message:`Skill "${s.name}" is pinned. Unpin it first.`}:(await pe.promises.rm(c,{recursive:!0,force:!0}),es(u,s.name),Re(d,u),t.sendNotification("turn.skill_instruction",{turnId:`skill-delete-${Date.now()}`,instruction:{name:s.name,category:s.category??"learned",action:"delete",scope:"project"}}),it(),{success:!0,message:`Skill "${s.name}" deleted`})}default:return{success:!1,message:`Unknown action: ${s.action}`}}},promoteSkill:async s=>{let i=Et(t.getActiveProjectRoot()),a=we.join(i,s,"SKILL.md");try{await pe.promises.access(a)}catch{return{success:!1,message:`Skill "${s}" not found in project skills. Cannot promote.`}}let c=ft(),l=we.join(c,s);await pe.promises.mkdir(l,{recursive:!0});let d=we.join(i,s),u=await pe.promises.readdir(d);for(let p of u){let m=await pe.promises.readFile(we.join(d,p));await pe.promises.writeFile(we.join(l,p),m)}return t.sendNotification("turn.skill_instruction",{turnId:`skill-promote-${Date.now()}`,instruction:{name:s,category:"promoted",content:await pe.promises.readFile(a,"utf8"),scope:"global"}}),await pe.promises.rm(d,{recursive:!0,force:!0}),t.sendNotification("turn.skill_instruction",{turnId:`skill-promote-cleanup-${Date.now()}`,instruction:{name:s,category:"learned",action:"delete",scope:"project"}}),it(),{success:!0,message:`Skill "${s}" promoted to global (user-level) and removed from project scope. It will now be available across all projects.`,path:l}}}))}function
|
|
1079
|
-
`),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 u of l)t.sendNotification("turn.media_result",{turnId:t.turnId,mediaType:d,url:u,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 u=await t.mediaPersistence.downloadAll(l,{type:a,sessionId:t.sessionId||void 0},{warn:p=>t.log(p)});if(u.length>0){for(let p of u)r=r.replaceAll(p.remoteUrl,p.localPath);t.sendNotification("turn.media_persisted",{turnId:t.turnId,files:u.map(p=>({remoteUrl:p.remoteUrl,localPath:p.localPath,bytes:p.bytes,mimeType:p.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 fS(t){return{invoke:async(e,r,n,o)=>{if(r.startsWith("$"))return{result:n};let s=Ce(r);if(!s)return{result:"",error:`Unknown tool: ${r}`};let i=`tc_${
|
|
1077
|
+
`).find(P=>P.trim()&&!P.startsWith("#"))?.trim()??`Skill from ${g}`;i.push({name:u.name,description:A,category:g,scope:f,version:v})}catch{}}}catch{}for(let l of t.getPluginSkills())s&&l.source!==s||(a.add(l.source??"plugin"),i.push({name:l.name,description:`Plugin skill (${l.source})`,category:l.source,scope:"plugin"}));return{skills:i,categories:[...a]}},readSkillContent:async s=>{for(let i of o){let a=we.join(i,s,"SKILL.md");try{return await pe.promises.readFile(a,"utf8")}catch{}}return null},viewSkill:async(s,i)=>{for(let a of o){let c=i?we.join(a,s,i):we.join(a,s,"SKILL.md");try{let l=await pe.promises.readFile(c,"utf8");return{name:s,content:l}}catch{}}return null},executeSkillSubturn:async(s,i,a,c)=>{let l=`skill_${s}_${gO().slice(0,8)}`,d=t.getAgent();if(!d)return"[skill] Cannot execute: no LLM provider configured";let u=q(),p=t.getCurrentSessionId()||"skill",m=ge(u).records[s],g=fO(s,m);t.getCurrentHooks()?.invoke("subagent.started",{sessionId:p,turnId:l,subagentId:l,agentType:g}).catch(()=>{});let f=new Set(["skill","agent"]),h=Ie().filter(A=>!f.has(A.function.name)),v=a??`Execute skill "${s}" instructions.`,b=[],R;for await(let A of d.run({turnId:l,sessionId:p,messages:[{role:"user",content:v}],tools:h,systemPrompt:i,config:{parentDepth:1,maxRounds:5}},c)){if(A.type==="end"&&A.content){t.getCurrentHooks()?.invoke("subagent.stopped",{sessionId:p,turnId:l,subagentId:l,agentType:g,reason:"normal"}).catch(()=>{}),bs(u,s,!0);let P=ge(u);return Tc(P,s),Re(u,P),A.content}if(A.type==="delta"&&A.text&&b.push(A.text),A.type==="error"){R=A.error;break}}if(t.getCurrentHooks()?.invoke("subagent.stopped",{sessionId:p,turnId:l,subagentId:l,agentType:g,reason:R?"error":"normal",error:R}).catch(()=>{}),R)return bs(u,s,!1),`[skill "${s}"] error: ${R}`;bs(u,s,!0);let T=ge(u);return Tc(T,s),Re(u,T),b.join("")||`[skill "${s}"] completed (no output)`},manageSkill:async s=>{let i=t.getActiveProjectRoot(),a=Et(i),c=we.join(a,s.name),l=we.join(c,"SKILL.md"),d=q();switch(s.action){case"create":{let u=s.content??"",m=xc(u,s.name,`Skill: ${s.name}`)??u,g=os(m,s.name);if(!g.valid)return{success:!1,message:`Skill validation failed: ${g.errors.join("; ")}`};let f=ge(d);if(f.records[s.name]?.pinned&&pe.existsSync(l))return{success:!1,message:`Skill "${s.name}" is pinned. Unpin it first.`};await pe.promises.mkdir(c,{recursive:!0}),await pe.promises.writeFile(l,m,"utf8"),t.sendNotification("turn.skill_instruction",{turnId:`skill-create-${Date.now()}`,instruction:{name:s.name,category:s.category??"learned",content:m,scope:"project"}}),it(),At(f,s.name,"created"),Re(d,f);let h=t.getMemoryLearningSink(),v=t.getMemoryUserId();if(h&&v){let R=m.split(`
|
|
1078
|
+
`).slice(0,3).join(" ").slice(0,200),T=i?we.basename(i):"unknown";h.ingestExtracted([{text:`Learned skill "${s.name}" in project "${T}": ${R}`,category:"skill-learning"}],v).catch(()=>{})}let b=i?` (project-scoped). To make it available across all projects, use: skill promote name:"${s.name}"`:"";return{success:!0,message:`Skill "${s.name}" created${b}`,path:c}}case"edit":{let u=ge(d);if(u.records[s.name]?.pinned)return{success:!1,message:`Skill "${s.name}" is pinned. Unpin it first.`};let p=s.content??"",g=xc(p,s.name)??p;return await pe.promises.writeFile(l,g,"utf8"),Ac(u,s.name),Re(d,u),t.sendNotification("turn.skill_instruction",{turnId:`skill-edit-${Date.now()}`,instruction:{name:s.name,category:s.category??"learned",content:g,scope:"project"}}),{success:!0,message:`Skill "${s.name}" updated`,path:l}}case"patch":{let u=ge(d);if(u.records[s.name]?.pinned)return{success:!1,message:`Skill "${s.name}" is pinned. Unpin it first.`};let p=await pe.promises.readFile(l,"utf8");if(!s.oldString||!p.includes(s.oldString))return{success:!1,message:"oldString not found in SKILL.md"};let m=p.replace(s.oldString,s.newString??"");return await pe.promises.writeFile(l,m,"utf8"),Ac(u,s.name),Re(d,u),t.sendNotification("turn.skill_instruction",{turnId:`skill-patch-${Date.now()}`,instruction:{name:s.name,category:s.category??"learned",content:m,scope:"project"}}),{success:!0,message:`Skill "${s.name}" patched`,path:l}}case"delete":{let u=ge(d);return u.records[s.name]?.pinned?{success:!1,message:`Skill "${s.name}" is pinned. Unpin it first.`}:(await pe.promises.rm(c,{recursive:!0,force:!0}),es(u,s.name),Re(d,u),t.sendNotification("turn.skill_instruction",{turnId:`skill-delete-${Date.now()}`,instruction:{name:s.name,category:s.category??"learned",action:"delete",scope:"project"}}),it(),{success:!0,message:`Skill "${s.name}" deleted`})}default:return{success:!1,message:`Unknown action: ${s.action}`}}},promoteSkill:async s=>{let i=Et(t.getActiveProjectRoot()),a=we.join(i,s,"SKILL.md");try{await pe.promises.access(a)}catch{return{success:!1,message:`Skill "${s}" not found in project skills. Cannot promote.`}}let c=ft(),l=we.join(c,s);await pe.promises.mkdir(l,{recursive:!0});let d=we.join(i,s),u=await pe.promises.readdir(d);for(let p of u){let m=await pe.promises.readFile(we.join(d,p));await pe.promises.writeFile(we.join(l,p),m)}return t.sendNotification("turn.skill_instruction",{turnId:`skill-promote-${Date.now()}`,instruction:{name:s,category:"promoted",content:await pe.promises.readFile(a,"utf8"),scope:"global"}}),await pe.promises.rm(d,{recursive:!0,force:!0}),t.sendNotification("turn.skill_instruction",{turnId:`skill-promote-cleanup-${Date.now()}`,instruction:{name:s,category:"learned",action:"delete",scope:"project"}}),it(),{success:!0,message:`Skill "${s}" promoted to global (user-level) and removed from project scope. It will now be available across all projects.`,path:l}}}))}function fO(t,e){return hO(e)?`community-skill:${t}`:`skill:${t}`}function hO(t){return t?.source!=="installed"?!1:t.registrySourceTier!=="official"}function mS(t){let e=iS({log:t.log,taskStore:t.taskStore,sessionId:t.sessionId,projectRoot:t.projectRoot,memdir:t.memdir,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;$R({config:t.config,projectRoot:t.projectRoot,log:t.log,toolCatalog:t.toolCatalog,currentManager:t.currentMcpManager,setManager:t.setMcpManager,setReady:t.setMcpReady}),UR({config:t.config,hooks:r,log:t.log,setPluginLoader:t.setPluginLoader});let n=oS({config:t.config,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 pS({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}),vR({config:t.config,host:t.coreToolHost,hooks:r,log:t.log,toolInvoker:t.toolInvoker}),PR({config:t.config}),t.sessionId&&r.invoke("session.created",{sessionId:t.sessionId}).catch(()=>{}),dS({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}}import{randomUUID as yO}from"node:crypto";async function gS(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(`
|
|
1079
|
+
`),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 u of l)t.sendNotification("turn.media_result",{turnId:t.turnId,mediaType:d,url:u,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 u=await t.mediaPersistence.downloadAll(l,{type:a,sessionId:t.sessionId||void 0},{warn:p=>t.log(p)});if(u.length>0){for(let p of u)r=r.replaceAll(p.remoteUrl,p.localPath);t.sendNotification("turn.media_persisted",{turnId:t.turnId,files:u.map(p=>({remoteUrl:p.remoteUrl,localPath:p.localPath,bytes:p.bytes,mimeType:p.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 fS(t){return{invoke:async(e,r,n,o)=>{if(r.startsWith("$"))return{result:n};let s=Ce(r);if(!s)return{result:"",error:`Unknown tool: ${r}`};let i=`tc_${yO().slice(0,8)}`;try{let a=JSON.parse(n),c=await s.execute(i,a,o);return await gS({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)}}}}}N();import{join as yS}from"node:path";import{chmod as bO}from"node:fs/promises";var bS="agent-configs.json";function hS(){return yS(q(),bS)}function vO(t){return yS(ae(t),bS)}function kO(){return{agents:{}}}var ui=class{data=kO();cwd;constructor(e){this.cwd=e}async load(){let e=await kr(hS()),r=this.cwd?await kr(vO(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=hS();await Vr(e,this.data);try{await bO(e,384)}catch{}}};var pi=class{constructor(e){this.deps=e}deps;store=null;get currentStore(){return this.store}async ensureStore(){return this.store||(this.store=new ui(this.deps.getActiveProjectRoot()),await this.store.load(),this.deps.acpDetector.setConfigStore(this.store.getData())),this.store}};function vS(t){return new pi(t)}var mi=class{soloEvaluator=null;productOrchestrator=null;productPlanner=null;soloProcessManager=null;productProcessManager=null};function kS(t){let e=t.acpDetector??new Go,r=new mi,o=(t.createAgentConfigRuntime??vS)({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 gi=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=RO(r,n)?r.slice(n.length):r;return[TO(n),...n,...o]}getOrCreateAcpHistory(e){let r=this.acpSessionHistories.get(e);return r||(r=[],this.acpSessionHistories.set(e,r)),r}};function RO(t,e){if(t.length<e.length)return!1;for(let r=0;r<e.length;r++)if(!SO(t[r],e[r]))return!1;return!0}function SO(t,e){return t.role===e.role&&JSON.stringify(t.content)===JSON.stringify(e.content)}function TO(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:
|
|
1080
1080
|
${e.map(n=>`- ${n.slice(0,500)}`).join(`
|
|
1081
|
-
`)}`:""].join(" ")}}import{randomUUID as
|
|
1082
|
-
`)||"OK"}catch(n){return`Error: ${n instanceof Error?n.message:String(n)}`}}var
|
|
1083
|
-
`);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:Bc(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,${ES.from(r).toString("base64")}`,c=`data:image/svg+xml;base64,${ES.from(n).toString("base64")}`,l=await e(i,{model:i.model,messages:[{role:"user",content:qc(s,o),imageUrls:[a,c]}],maxTokens:200});return Wc(l)},async awardXp(r){try{let n=new wt(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,u]of Object.entries(l)){let p=d;o.stats[p]=Math.min(10,o.stats[p]+(u??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 wt(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 Dn({turnSummary:c,soul:o},async(d,u)=>await e(s,{model:s.model,messages:[{role:"user",content:d}],maxTokens:u})||null);if(l){t.sendNotification("pet.reaction",{text:l.text,style:l.style,duration:1e4});return}}let i=Mn("turn.end");i&&t.sendNotification("pet.reaction",{text:i.text,style:i.style,duration:1e4})}catch{}},isActive(){return new wt(t.getActiveProjectRoot()).load()!==null}}}var hi=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?"approved":"denied"});let n=this.pendingConfirms.get(e);n&&(this.pendingConfirms.delete(e),n(!!r))}};function MS(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 verbose(){return e.verbose},log:t.log,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}}N();import{readFile as vd,readdir as DS,unlink as
|
|
1084
|
-
`),n=[],o=!1;for(let s=0;s<r.length;s++){let i=r[s];if(
|
|
1085
|
-
`):null}function
|
|
1086
|
-
`)
|
|
1081
|
+
`)}`:""].join(" ")}}import{randomUUID as AO}from"node:crypto";var wO={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},fi=class{constructor(e){this.options=e;this.dreamState=e.dreamState??lt.dream,this.now=e.now??(()=>Date.now()),this.randomId=e.randomId??(()=>AO().slice(0,8)),this.timers=e.timers??wO}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 a=this.options.getActiveTurn();a&&(this.options.log("[dream:idle] Aborting - max duration reached"),a.abort())},this.dreamState.maxDurationMs);r.unref?.();let n=this.options.getAgentHome(),o=this.options.getCurrentSessionId(),s=[];try{s=(await this.options.listRecentSessions()).filter(c=>c.sessionId!==o).map(c=>c.sessionId)}catch{}let i={jsonrpc:"2.0",method:"memory.dream",params:{turnId:`idle-dream-${this.randomId()}`,sessionId:o,config:{memoryRoot:n,transcriptDir:PO(n),dreamSessionIds:s,currentSessionTurnCount:this.options.getCurrentTurnCount(),model:e.model,apiKey:e.apiKey,force:!1}}};try{await this.options.runDream(i)}finally{this.timers.clearTimeout(r)}this.resetTimer()}};function PO(t){let e=t.replace(/[\\/]+$/,""),r=e.includes("\\")&&!e.includes("/")?"\\":"/";return`${e}${r}agent-logs`}qe();function RS(t,e){let r=t.provider,n=t.model,o=t.apiKey,s=t.baseUrl;if(!r||!o){let a=M().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??M().getProviderDefaultModel(r)??"",{provider:r,model:n,apiKey:o,baseUrl:s,configKey:`${r}:${n}:${o.slice(0,8)}:${s??""}`})}function SS(t){let r=M().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:fo({provider:n,model:o,apiKey:s,baseUrl:i},t.providerRegistry).transport,apiKey:s,model:o}}function TS(t){let{provider:e,model:r,apiKey:n,baseUrl:o}=t.resolvedConfig,s=fo({provider:e,model:r,apiKey:n,baseUrl:o},t.providerRegistry);return s.transport=jd(s.transport,t.sessionId||"default"),{transport:s.transport,apiKey:n,model:r,provider:e,baseUrl:o??""}}function AS(t){return{agent:new Or({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}),...t.client}}import{randomUUID as xO}from"node:crypto";async function wS(t){let e=t.toolCatalog.findTool(t.toolName);if(!e?.execute)return`Error: Unknown tool "${t.toolName}"`;let r=`mcp_${t.memberId}_${xO().slice(0,8)}`;try{return(await e.execute(r,t.args)).content.map(o=>o.text??"").join(`
|
|
1082
|
+
`)||"OK"}catch(n){return`Error: ${n instanceof Error?n.message:String(n)}`}}var CO={starting:"spawning",ready:"available",running:"running",completed:"available",failed:"failed",killed:"unavailable"};function PS(t,e,r){let n={agentId:t,status:CO[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 xS(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 verbose(){return t.getVerbose()},log(e){t.log(e)},resolveAgent(e){return t.resolveAgent(e)},sendNotification(e,r){t.sendNotification(e,r)},sendResponse(e,r,n){t.sendResponse(e,r,n)}}}N();import*as on from"node:fs";import*as CS from"node:path";function IS(t){let e=ne();if(e)e.workspaceDir&&t.pathService.setActiveWorkdir(e.workspaceDir);else{let n=CS.join(B(),"workspaces","default");on.existsSync(n)||on.mkdirSync(n,{recursive:!0});let o=jm(n);ys(n),t.pathService.setActiveWorkdir(n),t.sendNotification("project.created",{id:o.id,name:o.name,workspaceDir:o.workspaceDir,type:o.type})}IO();let r=t.projectMemoryStoreFactory.create(t.pathService.getActiveProjectRoot());return r.ensureInitialized(),r}function IO(){let e=V().find(r=>r.type==="default"&&r.status==="active");e&&(on.existsSync(e.workspaceDir)||on.mkdirSync(e.workspaceDir,{recursive:!0}))}import{Buffer as ES}from"node:buffer";function _S(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(`
|
|
1083
|
+
`);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:Bc(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,${ES.from(r).toString("base64")}`,c=`data:image/svg+xml;base64,${ES.from(n).toString("base64")}`,l=await e(i,{model:i.model,messages:[{role:"user",content:qc(s,o),imageUrls:[a,c]}],maxTokens:200});return Wc(l)},async awardXp(r){try{let n=new wt(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,u]of Object.entries(l)){let p=d;o.stats[p]=Math.min(10,o.stats[p]+(u??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 wt(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 Dn({turnSummary:c,soul:o},async(d,u)=>await e(s,{model:s.model,messages:[{role:"user",content:d}],maxTokens:u})||null);if(l){t.sendNotification("pet.reaction",{text:l.text,style:l.style,duration:1e4});return}}let i=Mn("turn.end");i&&t.sendNotification("pet.reaction",{text:i.text,style:i.style,duration:1e4})}catch{}},isActive(){return new wt(t.getActiveProjectRoot()).load()!==null}}}var hi=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?"approved":"denied"});let n=this.pendingConfirms.get(e);n&&(this.pendingConfirms.delete(e),n(!!r))}};function MS(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 verbose(){return e.verbose},log:t.log,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}}N();import{readFile as vd,readdir as DS,unlink as EO,stat as _O,mkdir as MO}from"node:fs/promises";import{existsSync as xt,readFileSync as NS,mkdirSync as LS,writeFileSync as DO}from"node:fs";import{join as et}from"node:path";var fe=12288,kd=200,yi=8192,NO="memory",ir="INDEX.md";function Rd(t){return et(ae(t),NO)}var LO=[/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 bi(t){return!LO.some(e=>e.test(t))}var OO=/^[a-z0-9][a-z0-9\-_.]*\.md$/i;function vi(t){return!(!OO.test(t)||t===ir||t.includes("..")||t.includes("/")||t.includes("\\"))}function jO(t){return t.trim().match(/^([A-Za-z][A-Za-z0-9_-]{2,})\s*:/)?.[1]??null}function $O(t,e){let r=t.split(`
|
|
1084
|
+
`),n=[],o=!1;for(let s=0;s<r.length;s++){let i=r[s];if(UO(i)&&i.includes(e)){for(o=!0;s+1<r.length&&OS(r[s+1]);)s++;continue}n.push(i)}return o?n.join(`
|
|
1085
|
+
`):null}function UO(t){return t.trim()!==""&&!t.startsWith("#")&&!t.startsWith("<!--")&&!OS(t)}function OS(t){return t.startsWith(" ")||t.startsWith(" ")}var ki=class{root;indexCache=null;constructor(e){this.root=Rd(e)}getRootPath(){return this.root}ensureInitialized(){xt(this.root)||LS(this.root,{recursive:!0});let e=et(this.root,ir);if(!xt(e)){let r=["# Memory Index","","<!-- Agent-managed memory. Lines here are always visible in system prompt.>","<!-- Use memory tool to add notes, or create topic files for longer content.>","","## User Profile","","## Notes",""].join(`
|
|
1086
|
+
`);FO(e,r)}}getIndexForPrompt(){let e=et(this.root,ir);if(!xt(e))return"";let r;try{r=NS(e,"utf-8")}catch{return""}this.indexCache=r;let n=r.split(`
|
|
1087
1087
|
`);return n.length>kd&&(r=n.slice(0,kd).join(`
|
|
1088
1088
|
`)+`
|
|
1089
1089
|
|
|
@@ -1102,18 +1102,18 @@ ${e.map(n=>`- ${n.slice(0,500)}`).join(`
|
|
|
1102
1102
|
`)?u+r+`
|
|
1103
1103
|
`:u+`
|
|
1104
1104
|
`+r+`
|
|
1105
|
-
`;return Buffer.byteLength(p,"utf-8")<=fe?p:null}async replaceInIndex(e,r){if(!e.trim())return{ok:!1,message:"old_text cannot be empty."};if(!r.trim())return{ok:!1,message:"new_text cannot be empty. Use 'remove' to delete."};if(!bi(r))return{ok:!1,message:"Content rejected: potential injection detected."};let n=this.getIndexRaw(),o=n.split(e).length-1;if(o===0)return{ok:!1,message:`No match found for: "${e.slice(0,80)}"`};if(o>1)return{ok:!1,message:`Multiple matches (${o}) for: "${e.slice(0,80)}". Be more specific.`};let s=n.replace(e,r);if(Buffer.byteLength(s,"utf-8")>fe)return{ok:!1,message:`Replacement would exceed INDEX.md limit (${Buffer.byteLength(s,"utf-8")}/${fe} bytes).`};await this.writeIndex(s);let i=this.getIndexUsage();return{ok:!0,message:`Replaced in INDEX.md. [${i.chars}/${fe} chars]`,indexUsage:`${i.chars}/${fe}`}}async removeFromIndex(e){if(!e.trim())return{ok:!1,message:"old_text cannot be empty."};let r=this.getIndexRaw(),n=
|
|
1105
|
+
`;return Buffer.byteLength(p,"utf-8")<=fe?p:null}async replaceInIndex(e,r){if(!e.trim())return{ok:!1,message:"old_text cannot be empty."};if(!r.trim())return{ok:!1,message:"new_text cannot be empty. Use 'remove' to delete."};if(!bi(r))return{ok:!1,message:"Content rejected: potential injection detected."};let n=this.getIndexRaw(),o=n.split(e).length-1;if(o===0)return{ok:!1,message:`No match found for: "${e.slice(0,80)}"`};if(o>1)return{ok:!1,message:`Multiple matches (${o}) for: "${e.slice(0,80)}". Be more specific.`};let s=n.replace(e,r);if(Buffer.byteLength(s,"utf-8")>fe)return{ok:!1,message:`Replacement would exceed INDEX.md limit (${Buffer.byteLength(s,"utf-8")}/${fe} bytes).`};await this.writeIndex(s);let i=this.getIndexUsage();return{ok:!0,message:`Replaced in INDEX.md. [${i.chars}/${fe} chars]`,indexUsage:`${i.chars}/${fe}`}}async removeFromIndex(e){if(!e.trim())return{ok:!1,message:"old_text cannot be empty."};let r=this.getIndexRaw(),n=jO(e),o=n?$O(r,n):null;if(o===null){if(!r.includes(e))return{ok:!1,message:`No match found for: "${e.slice(0,80)}"`};o=r.replace(e,"")}o=o.replace(/\n{3,}/g,`
|
|
1106
1106
|
|
|
1107
|
-
`),await this.writeIndex(o);let s=this.getIndexUsage();return{ok:!0,message:`Removed from INDEX.md. [${s.chars}/${fe} chars]`,indexUsage:`${s.chars}/${fe}`}}async listFiles(){if(!xt(this.root))return[];let e=await DS(this.root),r=[];for(let n of e){if(n===ir||!n.endsWith(".md"))continue;let o=et(this.root,n);try{let s=await
|
|
1107
|
+
`),await this.writeIndex(o);let s=this.getIndexUsage();return{ok:!0,message:`Removed from INDEX.md. [${s.chars}/${fe} chars]`,indexUsage:`${s.chars}/${fe}`}}async listFiles(){if(!xt(this.root))return[];let e=await DS(this.root),r=[];for(let n of e){if(n===ir||!n.endsWith(".md"))continue;let o=et(this.root,n);try{let s=await _O(o);if(!s.isFile())continue;let a=(await vd(o,"utf-8")).split(`
|
|
1108
1108
|
`).find(c=>c.trim()&&!c.startsWith("#"))?.trim();r.push({name:n,size:s.size,modifiedAt:s.mtime.toISOString(),preview:a?.slice(0,100)})}catch{}}return r.sort((n,o)=>o.modifiedAt.localeCompare(n.modifiedAt))}async createFile(e,r){if(!vi(e))return{ok:!1,message:`Invalid filename: "${e}". Use kebab-case .md files (e.g. "project-notes.md").`};if(!bi(r))return{ok:!1,message:"Content rejected: potential injection detected."};if(r.length>yi)return{ok:!1,message:`Content too long (${r.length} chars, max ${yi}).`};let n=et(this.root,e);if(xt(n))return{ok:!1,message:`File already exists: "${e}". Use write_file to update.`};await this.ensureDir(),await zr(n,r);let o=`- [${e}] \u2014 created ${new Date().toISOString().slice(0,10)}`;return await this.appendIndexEntry(o),{ok:!0,message:`Created "${e}" (${r.length} chars). Entry added to INDEX.md.`,file:e}}async writeFile(e,r){if(!vi(e))return{ok:!1,message:`Invalid filename: "${e}". Use kebab-case .md files.`};if(!bi(r))return{ok:!1,message:"Content rejected: potential injection detected."};if(r.length>yi)return this.writeFileSplit(e,r);let n=et(this.root,e),o=!xt(n);if(await this.ensureDir(),await zr(n,r),o){let s=`- [${e}] \u2014 created ${new Date().toISOString().slice(0,10)}`;await this.appendIndexEntry(s)}return{ok:!0,message:`${o?"Created":"Updated"} "${e}" (${r.length} chars).`,file:e}}async writeFileSplit(e,r){let n=e.replace(/\.md$/,""),o=r.split(/\n{2,}/),s=[],i="";for(let l of o)i.length+l.length+2>yi*.9&&i.length>0?(s.push(i),i=l):i=i?i+`
|
|
1109
1109
|
|
|
1110
|
-
`+l:l;i&&s.push(i);let a=[];for(let l=0;l<s.length;l++){let d=`${n}-${l+1}.md`,u=et(this.root,d);await this.ensureDir(),await zr(u,s[l]),a.push(d)}let c=this.getIndexRaw();for(let l of a)if(!c.includes(`[${l}]`)){let d=`- [${l}] \u2014 auto-split ${new Date().toISOString().slice(0,10)}`;await this.appendIndexEntry(d)}return{ok:!0,message:`Auto-split "${e}" into ${s.length} parts (${r.length} chars total): ${a.join(", ")}`,file:a[0]}}async readFile(e){if(!vi(e)&&e!==ir)return{ok:!1,message:`Invalid filename: "${e}".`};let r=et(this.root,e);try{let n=await vd(r,"utf-8");return{ok:!0,content:n,message:`Read "${e}" (${n.length} chars).`}}catch(n){return n.code==="ENOENT"?{ok:!1,message:`File not found: "${e}".`}:{ok:!1,message:`Error reading "${e}": ${n.message}`}}}async deleteFile(e){if(e===ir)return{ok:!1,message:"Cannot delete INDEX.md. Use 'remove' to clear entries."};if(!vi(e))return{ok:!1,message:`Invalid filename: "${e}".`};let r=et(this.root,e);if(!xt(r))return{ok:!1,message:`File not found: "${e}".`};await
|
|
1110
|
+
`+l:l;i&&s.push(i);let a=[];for(let l=0;l<s.length;l++){let d=`${n}-${l+1}.md`,u=et(this.root,d);await this.ensureDir(),await zr(u,s[l]),a.push(d)}let c=this.getIndexRaw();for(let l of a)if(!c.includes(`[${l}]`)){let d=`- [${l}] \u2014 auto-split ${new Date().toISOString().slice(0,10)}`;await this.appendIndexEntry(d)}return{ok:!0,message:`Auto-split "${e}" into ${s.length} parts (${r.length} chars total): ${a.join(", ")}`,file:a[0]}}async readFile(e){if(!vi(e)&&e!==ir)return{ok:!1,message:`Invalid filename: "${e}".`};let r=et(this.root,e);try{let n=await vd(r,"utf-8");return{ok:!0,content:n,message:`Read "${e}" (${n.length} chars).`}}catch(n){return n.code==="ENOENT"?{ok:!1,message:`File not found: "${e}".`}:{ok:!1,message:`Error reading "${e}": ${n.message}`}}}async deleteFile(e){if(e===ir)return{ok:!1,message:"Cannot delete INDEX.md. Use 'remove' to clear entries."};if(!vi(e))return{ok:!1,message:`Invalid filename: "${e}".`};let r=et(this.root,e);if(!xt(r))return{ok:!1,message:`File not found: "${e}".`};await EO(r);let n=this.getIndexRaw(),o=new RegExp(`^.*\\[${HO(e)}\\].*$\\n?`,"m");if(o.test(n)){let s=n.replace(o,"").replace(/\n{3,}/g,`
|
|
1111
1111
|
|
|
1112
1112
|
`);await this.writeIndex(s)}return{ok:!0,message:`Deleted "${e}" and removed INDEX.md entry.`,file:e}}async searchLocal(e){if(!xt(this.root))return[];let r=e.toLowerCase().split(/\s+/).filter(s=>s.length>1);if(r.length===0)return[];let n=await DS(this.root),o=[];for(let s of n){if(!s.endsWith(".md"))continue;let i=et(this.root,s);try{let a=await vd(i,"utf-8"),c=a.toLowerCase(),l=r.filter(m=>c.includes(m)).length;if(l===0)continue;let d=a.split(`
|
|
1113
|
-
`),u="",p=0;for(let m of d){let g=m.toLowerCase(),f=r.filter(h=>g.includes(h)).length;f>p&&(p=f,u=m.trim())}o.push({file:s,snippet:u.slice(0,200),score:l/r.length})}catch{}}return o.sort((s,i)=>i.score-s.score).slice(0,10)}async writeIndex(e){await this.ensureDir(),await zr(et(this.root,ir),e),this.indexCache=e}async ensureDir(){xt(this.root)||await
|
|
1113
|
+
`),u="",p=0;for(let m of d){let g=m.toLowerCase(),f=r.filter(h=>g.includes(h)).length;f>p&&(p=f,u=m.trim())}o.push({file:s,snippet:u.slice(0,200),score:l/r.length})}catch{}}return o.sort((s,i)=>i.score-s.score).slice(0,10)}async writeIndex(e){await this.ensureDir(),await zr(et(this.root,ir),e),this.indexCache=e}async ensureDir(){xt(this.root)||await MO(this.root,{recursive:!0})}async appendIndexEntry(e){let r=this.getIndexRaw();if(r.includes(e))return;let n=r.endsWith(`
|
|
1114
1114
|
`)?r+e+`
|
|
1115
1115
|
`:r+`
|
|
1116
1116
|
`+e+`
|
|
1117
|
-
`;Buffer.byteLength(n,"utf-8")<=fe&&await this.writeIndex(n)}};function $O(t,e){let r=et(t,"..");xt(r)||LS(r,{recursive:!0}),_O(t,e,"utf-8")}function UO(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function jS(){return{getRootPath(t){return Rd(t)},create(t){return new ki(t)}}}var HO=FO(import.meta.url);function BO(){for(let t of["../package.json","../../package.json"])try{return HO(t).version}catch{}return"0.0.0"}var $S=BO();var qO=new Set(["thread.user_response","tool.approval.response"]);var Ri=class{running=!1;startedAt=Date.now();packageVersion=$S;rpcContract=new pn;rpcIds=new Map;rpcDeadlineTimers=new Map;activeTurn=null;turnDone=Promise.resolve();verbose;transport;registry;mediaClient;agent=null;lastLlmConfigKey="";currentSessionId="";currentTurnId="";currentHooks=null;mcpManager=null;mcpReady=Promise.resolve();pluginLoader=null;permissionChecker=null;permissionUnregister=null;currentTransport=null;currentApiKey="";currentModel="";currentProvider="";currentBaseUrl="";sessionState=null;currentMediaApiKeys=null;taskStore=new Ro;mediaPersistence=new wo;pathService;toolCatalog=Hk();memoryPrefetchState=gt();memoryProvider=null;memoryDreamProvider=null;memoryUserId="";lastUserMessageForAutoExtract;lastAssistantMessageForExtract;memdir=null;projectMemoryStoreFactory=jS();fileWatcher=null;pendingAskUser=new Map;sessionTaskDomain;multiAgentHandlerHost;acpServer=null;sessionHistory=new gi;idleDreamCoordinator;petRuntime;petConfirmCoordinator;modelRegistryHydration=null;constructor(e){this.verbose=e.verbose,this.registry=new Ld,this.mediaClient=new Nd({registry:this.registry}),this.pathService=new zs(this.mediaPersistence),this.petRuntime=_S({getActiveProjectRoot:()=>this.getActiveProjectRoot(),resolveClientForPurpose:r=>this.resolveClientForPurpose(r),sendNotification:(r,n)=>this.sendNotification(r,n)}),this.petConfirmCoordinator=new hi({getPermissionResolver:()=>this.permissionChecker,sendNotification:(r,n)=>this.sendNotification(r,n)}),this.multiAgentHandlerHost=kS({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 fi({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"),getAgentHome:()=>B(),listRecentSessions:()=>Mt(20,this.getActiveProjectRoot()),runDream:r=>$r.call(this.createDreamHandlerHost(),r)}),M().onChange(()=>{this.lastLlmConfigKey=""}),this.ensureModelRegistryHydrated().catch(()=>{}),this.idleDreamCoordinator.applyEnvOverrides(process.env),this.transport=e.transport??new xr({verbose:e.verbose}),this.taskStore.onTaskChange((r,n)=>{n&&this.sendNotification("task.updated",{taskId:r,type:n.type,lifecycle:n.lifecycle,label:n.label})}),Bk({verbose:e.verbose,log:r=>this.log(r),sendNotification:(r,n)=>this.sendNotification(r,n)})}getActiveProjectRoot(){return this.pathService.getActiveProjectRoot()}async ensureModelRegistryHydrated(){return this.modelRegistryHydration||(this.modelRegistryHydration=(async()=>{let e=M();e.load(),await un(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}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(xa(e)||gn(e)){this.acpServer.dispatchMessage(e);return}if(mn(e)){let r=e.method;if(r==="initialize"||r.startsWith("session/")||r.startsWith("x/")||r.startsWith("fs/")){this.acpServer.dispatchMessage(e);return}}}if(!wa(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{if(await Tu(),this.fileWatcher&&(this.fileWatcher.stop(),this.fileWatcher=null),this.mcpManager){let e=this.mcpManager;this.mcpManager=null,await e.disconnectAll()}this.permissionUnregister&&(this.permissionUnregister(),this.permissionUnregister=null),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=$v(this);handleMessage(e){if(e.id!==void 0&&!qO.has(e.method)){let n=xo(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=IS({pathService:this.pathService,projectMemoryStoreFactory:this.projectMemoryStoreFactory,sendNotification:(e,r)=>this.sendNotification(e,r)})}resolveClientForPurpose(e){return SS({purpose:e,providerRegistry:this.registry,currentProvider:this.currentProvider,currentTransport:this.currentTransport})}ensureMemoryProvider(){if(this.memoryProvider)return;let e=ad(this.getActiveProjectRoot(),this.memoryUserId);this.memoryProvider=e.handlerProvider,this.memoryDreamProvider=e.dreamProvider,this.memoryUserId=e.userId}resolveAgent(e){let r=RS(e,g=>this.log(g));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={info:g=>this.log(g),warn:g=>this.log(`[warn] ${g}`),error:g=>this.log(`[error] ${g}`),debug:g=>{this.verbose&&this.log(`[debug] ${g}`)}},l=fS({mediaPersistence:this.mediaPersistence,getSessionId:()=>this.currentSessionId,log:g=>this.log(g),sendNotification:(g,f)=>this.sendNotification(g,f)}),d=TS({resolvedConfig:r,providerRegistry:this.registry,sessionId:this.currentSessionId}),u=mS({config:e,log:c,taskStore:this.taskStore,sessionId:this.currentSessionId??"",getTurnId:()=>this.currentTurnId,projectRoot:this.getActiveProjectRoot(),memdir:this.memdir,currentUserId:this.memoryUserId,memoryPrefetchState:this.memoryPrefetchState,getLastUserMessage:()=>this.lastUserMessageForAutoExtract,getLastAssistantMessage:()=>this.lastAssistantMessageForExtract,resolveSmallModelClient:()=>this.resolveClientForPurpose("smallModel"),agentClient:d,toolCatalog:this.toolCatalog,currentMcpManager:this.mcpManager,setMcpManager:g=>{this.mcpManager=g},setMcpReady:g=>{this.mcpReady=g},setPluginLoader:g=>{this.pluginLoader=g},getPluginSkills:()=>this.pluginLoader?.getPluginSkills()??[],getAgent:()=>this.agent,getAcpPermissionSession:()=>this.acpServer?.sessionId?{sessionId:this.acpServer.sessionId,requestPermission:g=>this.acpServer.requestPermission(g)}:void 0,sendNotification:(g,f)=>this.sendNotification(g,f),isPetActive:()=>this.petRuntime.isActive(),currentPermissionUnregister:this.permissionUnregister,coreToolHost:{getAgent:()=>this.agent,getCurrentTransport:()=>this.currentTransport,getCurrentApiKey:()=>this.currentApiKey,getCurrentModel:()=>this.currentModel,getCurrentSessionId:()=>this.currentSessionId,getVerbose:()=>this.verbose,sendNotification:(g,f)=>this.sendNotification(g,f),emitAgentStatus:(g,f,h)=>this.emitAgentStatus(g,f,h),handleMcpToolCall:(g,f,h)=>this.handleMcpToolCall(g,f,h)},toolInvoker:l,currentFileWatcher:this.fileWatcher,setFileWatcher:g=>{this.fileWatcher=g}}),p=u.hooks;this.currentHooks=p,this.memoryProvider=u.memoryHandlerProvider,this.memoryDreamProvider=u.memoryDreamProvider,this.memoryUserId=u.memoryUserId,this.permissionChecker=u.permissionChecker,this.permissionUnregister=u.permissionUnregister;let m=AS({client:d,toolInvoker:l,log:c,hooks:p,maxRounds:e.maxRounds,verbose:this.verbose,projectRoot:this.getActiveProjectRoot()});return this.agent=m.agent,this.lastLlmConfigKey=a,this.currentTransport=m.transport,this.currentApiKey=m.apiKey,this.currentModel=m.model,this.currentProvider=m.provider,this.currentBaseUrl=m.baseUrl,this.log(`created Agent (provider: ${n}, model: ${o})`),this.agent}emitAgentStatus(e,r,n){this.sendNotification("agents.status",PS(e,r,n))}createDreamHandlerHost(){return xS({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,getVerbose:()=>this.verbose,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)})}createAcpExtendedHandlerHost(){return MS({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 wS({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)Wu(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})}
|
|
1118
|
-
`)}enableIdleDream(e){this.idleDreamCoordinator.enable(e)}cancelIdleDreamTimer(){this.idleDreamCoordinator.cancelTimer()}disposeSessionRuntime(){this.permissionUnregister&&(this.permissionUnregister(),this.permissionUnregister=null),this.closeMemoryProviders(),this.agent=null,this.currentHooks=null,this.lastLlmConfigKey="",this.memoryPrefetchState=gt()}closeMemoryProviders(){let e=new Set;for(let r of[this.memoryProvider,this.memoryDreamProvider]){if(!r||e.has(r))continue;e.add(r);let n=r.close;if(typeof n=="function")try{n.call(r)}catch{}}this.memoryProvider=null,this.memoryDreamProvider=null}initAcpServer(){let e=fk(this,$S,this.createAcpExtendedHandlerHost());this.acpServer=new Io(this.transport,e,{verbose:this.verbose})}getAcpServer(){return this.acpServer}};function US(t){let e={verbose:!1};for(let r of t.slice(2))(r==="--verbose"||r==="-v")&&(e.verbose=!0);return e}import{writeFileSync as
|
|
1119
|
-
`;qS.call(process.stderr,e);try{HS(Td,e)}catch{}}var qS=process.stderr.write.bind(process.stderr);process.stderr.write=((t,...e)=>{let r=typeof t=="string"?t:Buffer.from(t).toString();try{HS(Td,r)}catch{}return qS(t,...e)});tt(`PID=${process.pid} argv=${JSON.stringify(process.argv.slice(1))} cwd=${process.cwd()} HOME=${process.env.QLOGICAGENT_HOME??"(unset)"} NODE=${process.version}`);var WS=US(process.argv),
|
|
1117
|
+
`;Buffer.byteLength(n,"utf-8")<=fe&&await this.writeIndex(n)}};function FO(t,e){let r=et(t,"..");xt(r)||LS(r,{recursive:!0}),DO(t,e,"utf-8")}function HO(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function jS(){return{getRootPath(t){return Rd(t)},create(t){return new ki(t)}}}var qO=BO(import.meta.url);function WO(){for(let t of["../package.json","../../package.json"])try{return qO(t).version}catch{}return"0.0.0"}var $S=WO();var GO=new Set(["thread.user_response","tool.approval.response"]);var Ri=class{running=!1;startedAt=Date.now();packageVersion=$S;rpcContract=new pn;rpcIds=new Map;rpcDeadlineTimers=new Map;activeTurn=null;turnDone=Promise.resolve();verbose;transport;registry;mediaClient;agent=null;lastLlmConfigKey="";currentSessionId="";currentTurnId="";currentHooks=null;mcpManager=null;mcpReady=Promise.resolve();pluginLoader=null;permissionChecker=null;permissionUnregister=null;currentTransport=null;currentApiKey="";currentModel="";currentProvider="";currentBaseUrl="";sessionState=null;currentMediaApiKeys=null;taskStore=new Ro;mediaPersistence=new wo;pathService;toolCatalog=Hk();memoryPrefetchState=gt();memoryProvider=null;memoryDreamProvider=null;memoryUserId="";lastUserMessageForAutoExtract;lastAssistantMessageForExtract;memdir=null;projectMemoryStoreFactory=jS();fileWatcher=null;pendingAskUser=new Map;sessionTaskDomain;multiAgentHandlerHost;acpServer=null;sessionHistory=new gi;idleDreamCoordinator;petRuntime;petConfirmCoordinator;modelRegistryHydration=null;constructor(e){this.verbose=e.verbose,this.registry=new Ld,this.mediaClient=new Nd({registry:this.registry}),this.pathService=new zs(this.mediaPersistence),this.petRuntime=_S({getActiveProjectRoot:()=>this.getActiveProjectRoot(),resolveClientForPurpose:r=>this.resolveClientForPurpose(r),sendNotification:(r,n)=>this.sendNotification(r,n)}),this.petConfirmCoordinator=new hi({getPermissionResolver:()=>this.permissionChecker,sendNotification:(r,n)=>this.sendNotification(r,n)}),this.multiAgentHandlerHost=kS({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 fi({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"),getAgentHome:()=>B(),listRecentSessions:()=>Mt(20,this.getActiveProjectRoot()),runDream:r=>$r.call(this.createDreamHandlerHost(),r)}),M().onChange(()=>{this.lastLlmConfigKey=""}),this.ensureModelRegistryHydrated().catch(()=>{}),this.idleDreamCoordinator.applyEnvOverrides(process.env),this.transport=e.transport??new xr({verbose:e.verbose}),this.taskStore.onTaskChange((r,n)=>{n&&this.sendNotification("task.updated",{taskId:r,type:n.type,lifecycle:n.lifecycle,label:n.label})}),Bk({verbose:e.verbose,log:r=>this.log(r),sendNotification:(r,n)=>this.sendNotification(r,n)})}getActiveProjectRoot(){return this.pathService.getActiveProjectRoot()}async ensureModelRegistryHydrated(){return this.modelRegistryHydration||(this.modelRegistryHydration=(async()=>{let e=M();e.load(),await un(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}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(xa(e)||gn(e)){this.acpServer.dispatchMessage(e);return}if(mn(e)){let r=e.method;if(r==="initialize"||r.startsWith("session/")||r.startsWith("x/")||r.startsWith("fs/")){this.acpServer.dispatchMessage(e);return}}}if(!wa(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{if(await Tu(),this.fileWatcher&&(this.fileWatcher.stop(),this.fileWatcher=null),this.mcpManager){let e=this.mcpManager;this.mcpManager=null,await e.disconnectAll()}this.permissionUnregister&&(this.permissionUnregister(),this.permissionUnregister=null),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=$v(this);handleMessage(e){if(e.id!==void 0&&!GO.has(e.method)){let n=xo(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=IS({pathService:this.pathService,projectMemoryStoreFactory:this.projectMemoryStoreFactory,sendNotification:(e,r)=>this.sendNotification(e,r)})}resolveClientForPurpose(e){return SS({purpose:e,providerRegistry:this.registry,currentProvider:this.currentProvider,currentTransport:this.currentTransport})}ensureMemoryProvider(){if(this.memoryProvider)return;let e=ad(this.getActiveProjectRoot(),this.memoryUserId);this.memoryProvider=e.handlerProvider,this.memoryDreamProvider=e.dreamProvider,this.memoryUserId=e.userId}resolveAgent(e){let r=RS(e,g=>this.log(g));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={info:g=>this.log(g),warn:g=>this.log(`[warn] ${g}`),error:g=>this.log(`[error] ${g}`),debug:g=>{this.verbose&&this.log(`[debug] ${g}`)}},l=fS({mediaPersistence:this.mediaPersistence,getSessionId:()=>this.currentSessionId,log:g=>this.log(g),sendNotification:(g,f)=>this.sendNotification(g,f)}),d=TS({resolvedConfig:r,providerRegistry:this.registry,sessionId:this.currentSessionId}),u=mS({config:e,log:c,taskStore:this.taskStore,sessionId:this.currentSessionId??"",getTurnId:()=>this.currentTurnId,projectRoot:this.getActiveProjectRoot(),memdir:this.memdir,currentUserId:this.memoryUserId,memoryPrefetchState:this.memoryPrefetchState,getLastUserMessage:()=>this.lastUserMessageForAutoExtract,getLastAssistantMessage:()=>this.lastAssistantMessageForExtract,resolveSmallModelClient:()=>this.resolveClientForPurpose("smallModel"),agentClient:d,toolCatalog:this.toolCatalog,currentMcpManager:this.mcpManager,setMcpManager:g=>{this.mcpManager=g},setMcpReady:g=>{this.mcpReady=g},setPluginLoader:g=>{this.pluginLoader=g},getPluginSkills:()=>this.pluginLoader?.getPluginSkills()??[],getAgent:()=>this.agent,getAcpPermissionSession:()=>this.acpServer?.sessionId?{sessionId:this.acpServer.sessionId,requestPermission:g=>this.acpServer.requestPermission(g)}:void 0,sendNotification:(g,f)=>this.sendNotification(g,f),isPetActive:()=>this.petRuntime.isActive(),currentPermissionUnregister:this.permissionUnregister,coreToolHost:{getAgent:()=>this.agent,getCurrentTransport:()=>this.currentTransport,getCurrentApiKey:()=>this.currentApiKey,getCurrentModel:()=>this.currentModel,getCurrentSessionId:()=>this.currentSessionId,getVerbose:()=>this.verbose,sendNotification:(g,f)=>this.sendNotification(g,f),emitAgentStatus:(g,f,h)=>this.emitAgentStatus(g,f,h),handleMcpToolCall:(g,f,h)=>this.handleMcpToolCall(g,f,h)},toolInvoker:l,currentFileWatcher:this.fileWatcher,setFileWatcher:g=>{this.fileWatcher=g}}),p=u.hooks;this.currentHooks=p,this.memoryProvider=u.memoryHandlerProvider,this.memoryDreamProvider=u.memoryDreamProvider,this.memoryUserId=u.memoryUserId,this.permissionChecker=u.permissionChecker,this.permissionUnregister=u.permissionUnregister;let m=AS({client:d,toolInvoker:l,log:c,hooks:p,maxRounds:e.maxRounds,verbose:this.verbose,projectRoot:this.getActiveProjectRoot()});return this.agent=m.agent,this.lastLlmConfigKey=a,this.currentTransport=m.transport,this.currentApiKey=m.apiKey,this.currentModel=m.model,this.currentProvider=m.provider,this.currentBaseUrl=m.baseUrl,this.log(`created Agent (provider: ${n}, model: ${o})`),this.agent}emitAgentStatus(e,r,n){this.sendNotification("agents.status",PS(e,r,n))}createDreamHandlerHost(){return xS({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,getVerbose:()=>this.verbose,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)})}createAcpExtendedHandlerHost(){return MS({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 wS({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)Wu(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})}
|
|
1118
|
+
`)}enableIdleDream(e){this.idleDreamCoordinator.enable(e)}cancelIdleDreamTimer(){this.idleDreamCoordinator.cancelTimer()}disposeSessionRuntime(){this.permissionUnregister&&(this.permissionUnregister(),this.permissionUnregister=null),this.closeMemoryProviders(),this.agent=null,this.currentHooks=null,this.lastLlmConfigKey="",this.memoryPrefetchState=gt()}closeMemoryProviders(){let e=new Set;for(let r of[this.memoryProvider,this.memoryDreamProvider]){if(!r||e.has(r))continue;e.add(r);let n=r.close;if(typeof n=="function")try{n.call(r)}catch{}}this.memoryProvider=null,this.memoryDreamProvider=null}initAcpServer(){let e=fk(this,$S,this.createAcpExtendedHandlerHost());this.acpServer=new Io(this.transport,e,{verbose:this.verbose})}getAcpServer(){return this.acpServer}};function US(t){let e={verbose:!1};for(let r of t.slice(2))(r==="--verbose"||r==="-v")&&(e.verbose=!0);return e}import{writeFileSync as KO,appendFileSync as HS,mkdirSync as zO}from"node:fs";import{join as Sd}from"node:path";import{homedir as VO}from"node:os";var BS=Sd(process.env.QLOGICAGENT_HOME||Sd(VO(),".qlogicagent"),"debug-logs");try{zO(BS,{recursive:!0})}catch{}var Td=Sd(BS,"acp-session.log");try{KO(Td,"")}catch{}function tt(t){let e=`[${new Date().toISOString()}] ${t}
|
|
1119
|
+
`;qS.call(process.stderr,e);try{HS(Td,e)}catch{}}var qS=process.stderr.write.bind(process.stderr);process.stderr.write=((t,...e)=>{let r=typeof t=="string"?t:Buffer.from(t).toString();try{HS(Td,r)}catch{}return qS(t,...e)});tt(`PID=${process.pid} argv=${JSON.stringify(process.argv.slice(1))} cwd=${process.cwd()} HOME=${process.env.QLOGICAGENT_HOME??"(unset)"} NODE=${process.version}`);var WS=US(process.argv),XO=!process.argv.includes("--no-acp"),YO=new xr({verbose:WS.verbose}),Ad=new Ri({verbose:WS.verbose,transport:YO});XO&&(Ad.initAcpServer(),tt("ACP server initialized, waiting for messages"));process.on("unhandledRejection",t=>{tt(`unhandledRejection: ${t instanceof Error?t.stack??t.message:String(t)}`)});process.on("uncaughtException",t=>{tt(`uncaughtException: ${t.stack??t.message}`)});process.stdin.on("end",()=>{tt("stdin END received")});process.stdin.on("close",()=>{tt("stdin CLOSE received")});process.stdout.on("error",t=>{tt(`stdout ERROR: ${t.message}`)});process.stdout.on("close",()=>{tt("stdout CLOSE")});process.on("exit",t=>{tt(`process.exit code=${t}`)});var FS=!1;async function GS(t){if(!FS){FS=!0,tt(`${t} received`);try{await Ad.stop()}finally{process.exit(0)}}}process.on("SIGTERM",()=>{GS("SIGTERM")});process.on("SIGINT",()=>{GS("SIGINT")});process.on("SIGHUP",()=>{tt("SIGHUP received")});tt("calling server.start()");Ad.start();tt("server.start() returned, event loop active");
|