@crewx/sdk 0.9.0-rc.43 → 0.9.0-rc.45
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/esm/index.js +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
package/dist/esm/index.js
CHANGED
|
@@ -305,7 +305,7 @@ ${r.join(`
|
|
|
305
305
|
`).find(s=>s.trim()&&!s.startsWith("Read "))?.trim()??e.trim();if(!o)return "unknown";try{let s=us.statSync(o);if(t){let i=Date.parse(t);if(!Number.isNaN(i)&&s.mtimeMs>i)return "stale"}return "ok"}catch{return "unknown"}}function Xd(n){let e=new Set;for(let t of n)try{let r=JSON.parse(t);r.type&&e.add(r.type);}catch{}return e.has("turn.started")||e.has("thread.started")?"codex":e.has("assistant.message_delta")?"copilot":e.has("step_start")&&e.has("step_finish")?"opencode":e.has("system")&&e.has("result")?"claude":e.has("init")&&e.has("message")?"gemini":e.has("result")&&e.has("assistant")?"claude":null}function Yd(n){if(!Array.isArray(n))return [];let e=n,t=e.filter(a=>a.level==="stdout"&&a.message).map(a=>a.message),r=Xd(t),o=[];for(let a of e)a.level==="info"&&a.message?o.push(...ye(a.message,a.timestamp)):a.level==="stdout"&&a.message&&r&&o.push(...Ut("",a.message,r));let s=new Map,i=[];for(let a of o)if(a.type==="tool_use"){let d={tool:Gd(a.toolName??""),input:a.toolInput??null,result:null,isError:false},l=a.toolUseId;if(l){if(s.has(l)){s.get(l).input=d.input;continue}s.set(l,d);}i.push(d);}else if(a.type==="tool_result"){if(a.toolUseId&&s.has(a.toolUseId)){let d=s.get(a.toolUseId);d.isError=a.isError===true,d.result=a.resultPreview??null;}else for(let d=i.length-1;d>=0;d--)if(i[d].result===null){i[d].isError=a.isError===true,i[d].result=a.resultPreview??null;break}}return i}function Qd(n,e){let t=Yd(n),r=[];for(let o of t){let s=o.tool==="Bash"?o.input?.split(`
|
|
306
306
|
`)[0]?.slice(0,150)??null:o.input?.slice(0,150)??null,i=Vd(o.tool,o.input)&&!o.isError;r.push({tool:o.tool,cmd:s,result:o.result,status:Jd(o.tool,o.input,e),reusable:i});}return r}function Zd(n,e,t){let r=["<activity_log>"];if(n.length===0&&e===0)r.push(" <!-- no activity found in previous tasks -->");else {r.push(" <!-- tool activity from previous tasks -->"),e>0&&r.push(` <!-- ${e} entries omitted (cap) -->`);for(let o of n){let s=`tool="${Nr(o.tool)}"`,i=o.cmd?` cmd="${Nr(o.cmd)}"`:"",a="";if(o.reusable&&(a=o.status==="stale"?' reused="stale"':' reused="ok"'),o.reusable&&o.status==="stale")r.push(` <entry ${s}${i}${a}>\u26A0\uFE0F changed since \u2014 re-read</entry>`);else if(o.result){r.push(` <entry ${s}${i}${a}>`);let d=t&&t>0?t:8e3,l=o.result;l.length>d?r.push(Nr(l.slice(0,d))+` \u2026 [truncated, ${d}/${l.length} chars shown]`):r.push(Nr(l)),r.push(" </entry>");}else r.push(` <entry ${s}${i}${a} />`);}}return r.push("</activity_log>"),r}function ps(n){let{threadId:e,agentId:t,lookback:r,maxEntryChars:o,decayRate:s}=n;if(!r||!e||!t)return new Map;let i;try{i=new Yt().findTasksByThread(e).filter(g=>!g.parent_task_id&&g.agent_id===t).sort((g,m)=>m.started_at>g.started_at?1:-1).slice(0,Math.min(r,5));}catch{return new Map}if(!i.length)return new Map;let a=[];for(let f of i){let g=[];try{let m=JSON.parse(f.logs??"[]");Array.isArray(m)&&(g=m);}catch{}a.push({taskId:f.id,entries:Qd(g,f.completed_at)});}let d=new Map,l=typeof s=="number"&&s>0&&s<=1?s:1,c=1e3;for(let f=0;f<a.length;f++){let{taskId:g,entries:m}=a[f];if(m.length===0)continue;let _=Math.max(Math.floor((o??8e3)*Math.pow(l,f)),c),v=Math.max(0,m.length-200),x=v>0?m.slice(v):m,w=Zd(x,v,_);d.set(g,w.join(`
|
|
307
307
|
`));}return d}u();u();var el={agentId:z.string().describe("The agent ID to query"),query:z.string().describe("The query message to send"),context:z.string().optional().describe("Additional context"),thread:z.string().optional().describe("Thread ID for conversation continuity")},tl={agentId:z.string().describe("The agent ID to execute"),task:z.string().describe("The task description to execute"),context:z.string().optional().describe("Additional context"),thread:z.string().optional().describe("Thread ID for conversation continuity")};function gs(n,e,t){n.tool("crewx_listAgents","List available CrewX agents exposed by this server",async()=>{let r=[];for(let o of t){let s=e.agents.get(o);s&&r.push({id:s.id,name:s.name??s.id,description:s.description??""});}return {content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),n.tool("crewx_queryAgent","Query a CrewX agent with a read-only question",el,async({agentId:r,query:o,context:s,thread:i})=>{if(!t.has(r))return {content:[{type:"text",text:`Agent '${r}' is not exposed by this server`}],isError:true};let a=await e.query(r,o,{context:s,threadId:i});return a.ok?{content:[{type:"text",text:a.data}]}:{content:[{type:"text",text:a.error?.message??"Query failed"}],isError:true}}),n.tool("crewx_executeAgent","Execute a task on a CrewX agent (may modify state)",tl,async({agentId:r,task:o,context:s,thread:i})=>{if(!t.has(r))return {content:[{type:"text",text:`Agent '${r}' is not exposed by this server`}],isError:true};let a=await e.execute(r,o,{context:s,threadId:i});return a.ok?{content:[{type:"text",text:a.data}]}:{content:[{type:"text",text:a.error?.message??"Execute failed"}],isError:true}});}u();function fs(n){return n.headers.get("Origin")?null:new Response(JSON.stringify({error:"Forbidden: Origin header required"}),{status:403,headers:{"Content-Type":"application/json"}})}async function ms(n,e){return e?await e(n)?null:new Response(JSON.stringify({error:"Unauthorized"}),{status:401,headers:{"Content-Type":"application/json"}}):null}function ol(n,e){let t=new McpServer({name:"crewx-mcp-server",version:"1.0.0"},{capabilities:{tools:{}}});return gs(t,n,e),t}function Mn(n,e){if(!e.agents||e.agents.length===0)throw new Error("crewx.handler() requires at least one agent in the agents option");let t=new Set(e.agents),r=new Map;return async o=>{let s=fs(o);if(s)return s;let i=await ms(o,e.auth);if(i)return i;let a=o.headers.get("mcp-session-id");if(a&&r.has(a))return r.get(a).transport.handleRequest(o);let d=ol(n,t),l=new WebStandardStreamableHTTPServerTransport({sessionIdGenerator:()=>crypto.randomUUID(),onsessioninitialized:c=>{r.set(c,{transport:l,server:d});},onsessionclosed:c=>{r.delete(c);},enableJsonResponse:true});return await d.connect(l),l.handleRequest(o)}}u();function ys(n){let e=G.resolve(n);return process.platform==="win32"&&(e=e.replace(/\\/g,"/"),e=e.replace(/^([A-Z]):/,(t,r)=>`${r.toLowerCase()}:`)),e.length>1&&!/^[a-zA-Z]:\/$/.test(e)&&(e=e.replace(/\/+$/,"")),e}function Nn(n){let e=ys(n);return createHash("sha256").update(e).digest("hex")}function Il(n){return n?n.settings?.template?.exec:void 0}function Ol(){try{let n=new Uint8Array(8);return globalThis.crypto.getRandomValues(n),Array.from(n,e=>e.toString(16).padStart(2,"0")).join("")}catch{let{randomBytes:n}=se("crypto");return n(8).toString("hex")}}var Xn=class n extends Vt{_agents;_templateEngine;_documentLoader;_layoutLoader;_layoutRenderer;_config;_projectRoot;_workspaceId;_workspaceName;_plugins=[];_tools=new Map;_activeAdapters=new Map;_pendingThreads=new Map;_activeTasks=new Map;_remoteFactory;_remoteTargets=new Map;_additionalArgsProvider;_callerIdentityOverrides=new Map;constructor(e,t={},r,o,s){super(),this._agents=new Map(e.map(d=>[d.id,d])),this._config=r,this._projectRoot=s??(typeof process<"u"?process.cwd():"/");let i=s??(typeof process<"u"?process.env.CREWX_WORKSPACE??process.cwd():"/");this._workspaceId=Nn(i),this._workspaceName=basename(i);let a=Il(r);this._templateEngine=new Bt({execPolicy:t.execPolicy??a}),this._documentLoader=o??new st,this._layoutLoader=new qt({templatesPath:ht()}),this._layoutRenderer=new Gt,this._remoteFactory=t.remoteFactory,this._additionalArgsProvider=t.additionalArgsProvider;}async resolveFileRemoteTarget(e){let t=this.getAgent(e),r=Array.isArray(t?.provider)?t?.provider[0]:t?.provider;if(!r?.startsWith("remote/"))return null;let o=r.slice(7),s=this.getRemoteProviderConfig(o);if(!s?.location?.startsWith("file://"))return null;let i=resolve(s.location.replace("file://","")),a=s.external_agent_id??e.replace(/^@/,""),d=this._remoteTargets.get(i);d||(d=(this._remoteFactory??(m=>n.loadYaml(m)))(i),this._remoteTargets.set(i,d),d.catch(()=>this._remoteTargets.delete(i)));let l=await d,c=l.getAgent("@"+a),f=Array.isArray(c?.provider)?c?.provider[0]:c?.provider;if(f?.startsWith("remote/"))throw new Error(`Chained remotes not allowed: "${o}" \u2192 "${f}"`);return {target:l,agentRef:"@"+a}}static async loadBuiltInConfig(e){let{yamlPath:t,dir:r}=Gr(),o;try{o=readFileSync(t,"utf-8");}catch(i){throw new Error(`[@crewx/sdk] Cannot read built-in config: ${t}
|
|
308
|
-
${i.message}`)}let s=ur(o);if(s.documents&&typeof s.documents=="object"){let i={};for(let[a,d]of Object.entries(s.documents))if(d&&typeof d=="object"){let l=d;typeof l.path=="string"&&!isAbsolute(l.path)?i[a]={...l,path:resolve(r,l.path)}:i[a]=l;}else i[a]=d;return {...s,documents:i}}return s}static mergeCrewxConfig(e,t){let r=new Map;for(let k of e.agents??[])r.set(k.id,k);for(let k of t.agents??[])r.has(k.id)&&console.warn(`[agent-loader] User agent "${k.id}" overrides built-in`),r.set(k.id,k);let o=Array.from(r.values()),s={...e.layouts??{},...t.layouts??{}},i={...e.documents??{},...t.documents??{}},a=e,d=t,l=Ns(a.vars,d.vars),c=Ns(a.settings,d.settings),f;e.skills&&t.skills&&typeof e.skills=="object"&&typeof t.skills=="object"&&!Array.isArray(e.skills)&&!Array.isArray(t.skills)?f={...e.skills,...t.skills}:f=t.skills??e.skills;let g=[...e.hooks??[],...t.hooks??[]],m=Ml(a.providers,d.providers),_={...e},v={...t};for(let k of ["agents","layouts","documents","skills","hooks","vars","settings","providers"])delete _[k],delete v[k];let w={...{..._,...v},agents:o,layouts:s,documents:i,skills:f};return g.length>0&&(w.hooks=g),l!==void 0&&(w.vars=l),c!==void 0&&(w.settings=c),m!==void 0&&(w.providers=m),w}static async loadYaml(e,t,r){let o=t?.includeBuiltIns!==false,s,i;if(o){let c=await n.loadBuiltInConfig(r);if(e!==void 0){let f=pr(e);s=n.mergeCrewxConfig(c,f),i=dirname(e);}else s=c,i=process.cwd();}else {if(e===void 0)throw new Error("[@crewx/sdk] loadYaml: path is required when includeBuiltIns is false");s=pr(e),i=dirname(e);}let a=new st(r);await a.load(s.documents,i);let d=s.agents??[];return await Ds(d,s,t),new n(d,t??{},s,a,i)}static async fromConfig(e,t,r,o){let s=t?.includeBuiltIns===true,i=e;if(s){let c=await n.loadBuiltInConfig(o);i=n.mergeCrewxConfig(c,e);}let a=new st(o);await a.load(i.documents,r??(typeof process<"u"?process.cwd():"/"));let d=i.agents??[];return await Ds(d,i,t),new n(d,t??{},i,a,r)}get agents(){return this._agents}get config(){return this._config}get plugins(){return this._plugins}get tools(){return this._tools}get workspaceId(){return this._workspaceId}get workspaceName(){return this._workspaceName}getAgent(e){let t=e.startsWith("@")?e.slice(1):e;return this._agents.get(t)}getRemoteProviderConfig(e){let t=this._config?.providers;return Array.isArray(t)?t.find(o=>o.type==="remote"&&o.id===e):void 0}computeTaskLogPath(e,t){let r=vn(t);return join(this._projectRoot,".crewx","logs",`${r}_${e}.log`)}registerTool(e,t){this._tools.set(e,{name:e,...t});}async use(e){this._plugins.includes(e)||(await e.attach(this),this._plugins.push(e));}handler(e){return Mn(this,e)}async registerChannelAdapter(e){let{adapter:t,instanceId:r,config:o}=e;if(this._activeAdapters.has(r))throw new Error(`Adapter instance already registered: ${r}`);let s=new Set(t.manifest.capabilities),i=e.store??kn(r),a=e.defaultMode??"query",d=t.manifest.platform,l=e.agentRunner??{run:async(m,_,v)=>{let w=await(a==="execute"?this.execute.bind(this):this.query.bind(this))(`@${m}`,_,{threadId:v?.threadId,platform:d});return {output:w.ok?w.data:w.error?.message??""}}},c=e.onInbound??(async m=>{let _=m.routingHints?.agentId??e.defaultAgent;if(!_)return {accepted:false,reason:"no_agent"};let{output:v}=await l.run(_,m.text,{threadId:m.threadId});return {accepted:true,output:v}}),f=An({instanceId:r,config:o,capabilities:s,db:i,agentRunner:l,onInbound:c}),g={adapter:t,ctx:f,state:"starting"};this._activeAdapters.set(r,g),this.emit("adapter:lifecycle",{adapterId:t.manifest.id,instanceId:r,state:"starting",timestamp:new Date});try{await t.start(f),g.state="started",this.emit("adapter:lifecycle",{adapterId:t.manifest.id,instanceId:r,state:"started",timestamp:new Date});}catch(m){throw g.state="failed",this.emit("adapter:lifecycle",{adapterId:t.manifest.id,instanceId:r,state:"failed",error:m instanceof Error?m:new Error(String(m)),timestamp:new Date}),this._activeAdapters.delete(r),m}}async unregisterChannelAdapter(e){let t=this._activeAdapters.get(e);if(t){t.state="stopping",this.emit("adapter:lifecycle",{adapterId:t.adapter.manifest.id,instanceId:e,state:"stopping",timestamp:new Date});try{await t.adapter.stop(t.ctx),t.state="stopped",this.emit("adapter:lifecycle",{adapterId:t.adapter.manifest.id,instanceId:e,state:"stopped",timestamp:new Date});}catch(r){t.state="failed",this.emit("adapter:lifecycle",{adapterId:t.adapter.manifest.id,instanceId:e,state:"failed",error:r instanceof Error?r:new Error(String(r)),timestamp:new Date});}finally{this._activeAdapters.delete(e);}}}async stopAllAdapters(e={}){let t=e.timeoutMs??1e4,r=Array.from(this._activeAdapters.keys()),o=await Promise.allSettled(r.map(s=>Promise.race([this.unregisterChannelAdapter(s),new Promise((i,a)=>setTimeout(()=>a(new Error(`Adapter stop timeout: ${s}`)),t))])));for(let s=0;s<o.length;s++)o[s].status==="rejected"&&console.error(`[crewx] adapter stop error (${r[s]}): ${o[s].reason}`);}abortAll(){for(let[e,t]of this._activeTasks)if(t.pid!==void 0)try{process.platform==="win32"?process.kill(t.pid,"SIGTERM"):process.kill(-t.pid,"SIGTERM");}catch(r){console.error(`[crewx] abort task ${e} (pid=${t.pid}) error: ${r instanceof Error?r.message:String(r)}`);}}async _drainActiveTasks(e){let t=Array.from(this._activeTasks.values()).map(r=>r.done);t.length!==0&&await Promise.race([Promise.allSettled(t),new Promise(r=>setTimeout(r,e).unref())]);}async close(){this.abortAll(),await this._drainActiveTasks(jt+1e3),await this.stopAllAdapters({timeoutMs:1e4});let e=[...this._remoteTargets.values()];this._remoteTargets.clear(),await Promise.allSettled(e.map(async r=>{try{await(await r).close();}catch(o){console.error(`[crewx] remote target close error: ${o instanceof Error?o.message:String(o)}`);}}));let t=[...this._plugins].reverse();for(let r of t)try{await r.detach(this);}catch(o){console.error(`[crewx] plugin ${r.name} detach error: ${o instanceof Error?o.message:String(o)}`);}this._plugins.length=0;}filterAgents(e){let t=a=>a?a.split(",").map(d=>d.trim().toLowerCase()).filter(Boolean):void 0,r=t(e.role),o=t(e.team),s=t(e.provider),i=Array.from(this._agents.values());return r&&(i=i.filter(a=>a.role&&r.some(d=>_e(a.role.toLowerCase(),d)))),o&&(i=i.filter(a=>a.team&&o.some(d=>_e(a.team.toLowerCase(),d)))),s&&(i=i.filter(a=>(Array.isArray(a.provider)?a.provider:[a.provider]).some(l=>s.some(c=>_e(l.toLowerCase(),c))))),i}renderAgentPrompt(e){let t=e.startsWith("@")?e.slice(1):e,r=this._agents.get(t);if(!r)throw new Te(t,Array.from(this._agents.keys()));return r.inline?.prompt??r.inline?.system_prompt??r.description??`You are an expert ${t}.`}async renderPrompt(e,t){let o={...await this._documentLoader.buildContext(),...t?.documents??{}},s={...t,documents:o};return this._templateEngine.render(e,s)}registerLayout(e,t){this._layoutLoader.registerLayout(e,t);}async renderAgentPromptFull(e,t){let r=e.startsWith("@")?e.slice(1):e,o=this._agents.get(r);if(!o)throw new Te(r,Array.from(this._agents.keys()));let s=this._resolveLayoutSpec(o,t?.layout),i=this._extractLayoutId(s),a=this._extractLayoutProps(o,s,t?.layout),d=this._layoutLoader.load(i,a),l=o.inline?.prompt??o.inline?.system_prompt??o.description??`You are an expert ${r}.`,c=await this._documentLoader.buildContext(),f=t?.env??(typeof process<"u"?process.env:{}),g=t?.vars?.security_key??Ol(),m={...t?.vars??{},documents:c,env:f,agent:{id:o.id,name:o.name??o.id,role:o.role??"",team:o.team??"",description:o.description??""}},_=await this._templateEngine.render(l,m),v={mode:t?.session?.mode??"query",platform:t?.session?.platform??"cli",options:t?.session?.options??[]},x=o.provider,w=Array.isArray(x)?x:typeof x=="string"&&x.length>0?[x]:[],k=w.join(", ")||(typeof x=="string"?x:""),E=o.options,P=["goals","daily"],T={goals:false,daily:false},J;if(!Array.isArray(E)&&typeof E=="object"&&E!==null){let F=E;if("goals"in F){let M=F.goals;typeof M=="string"||Array.isArray(M)?T.goals=M:T.goals=!!M;}"daily"in F&&(T.daily=!!F.daily);let A={};for(let[M,W]of Object.entries(F))P.includes(M)||(A[M]=W);if(Object.keys(A).length>0){let M=w.some(b=>b.startsWith("cli/")),W={};for(let[b,K]of Object.entries(A)){let ce={};if(Array.isArray(K))M&&(ce.rawArgs=K);else if(typeof K=="object"&&K!==null){let mt=K;Object.keys(mt).length>0&&(ce.named=mt);}(ce.named||ce.rawArgs&&ce.rawArgs.length>0)&&(W[b]=ce);}J=Object.keys(W).length>0?W:void 0;}}let U=Array.isArray(E)?E:void 0,O={};for(let[F,A]of Object.entries(c))O[F]={content:A.content??"",toc:A.toc,summary:A.summary,path:A.path};if(T.goals){let F=join(this._projectRoot,"docs","goal"),A=await Xo(F,void 0,T.goals);A&&(O.active_goals={content:A});}if(T.daily){let F=join(this._projectRoot,"docs","daily"),A=await Yo(F);A&&(O.today_daily={content:A});}let D=t?.vars?.user_input??void 0,L=this._config?.settings?.dreaming?.continuity,ee=L?.reuseReadOnly!==false,j=typeof L?.lookback=="number"?L.lookback:5,oe=typeof L?.maxEntryChars=="number"?L.maxEntryChars:8e3,q=typeof L?.decayRate=="number"?L.decayRate:.5,H=t?.threadId??"",Z=o.id,X=ee&&j>0&&H&&t?.messages&&t.messages.length>0?ps({threadId:H,agentId:Z,lookback:j,maxEntryChars:oe,decayRate:q}):new Map,z=(t?.messages??[]).map(F=>{if(!F.isAssistant)return F;let A=F.metadata?.task_id;return !A||!X.has(A)?F:{...F,activity_log:X.get(A)}}),Ge={user_input:D,agent:{id:o.id,name:o.name??o.id,role:o.role??"",team:o.team??"",description:o.description??"",provider:k,providerList:w,model:o.inline?.model,workingDirectory:o.working_directory??o.workingDirectory??".",inline:{...o.inline??{},prompt:_},specialties:o.specialties??[],capabilities:o.capabilities??[],remote:o.remote??null,optionsByMode:J,optionsArray:U},agentMetadata:{specialties:o.specialties??[],capabilities:o.capabilities??[],description:o.description??""},contextOptions:T,documents:O,skills:t?.skills??[],session:v,env:f,vars:{security_key:g,...t?.vars??{}},props:{...a??{},...t?.messages&&t.messages.length>0?{showConversationHistory:true}:{}},platform:v.platform,mode:v.mode,thread_id:H,now:zt(new Date),has_activity_log:X.size>0,messages:z,tools:this._tools.size>0?{list:Array.from(this._tools.values()).map(F=>({name:F.name,description:F.description,parameters:F.parameters})),json:JSON.stringify(Array.from(this._tools.values()).map(F=>({name:F.name,description:F.description,parameters:F.parameters})),null,2),count:this._tools.size}:null,metadata:{}};return this._layoutRenderer.render(d,Ge)}_filterToolsByMode(e){return e?e.map(t=>this._tools.get(t)).filter(t=>t!==void 0):Array.from(this._tools.values())}_resolveLayoutSpec(e,t){if(t!==void 0)return t;let r=e.inline?.layout;if(r!==void 0)return r;let o=this._config?.layouts?.default;return typeof o=="string"&&o?o:"crewx/default"}_extractLayoutId(e){if(typeof e=="string")return e;if("id"in e)return e.id;if("template"in e&&typeof e.template=="string"&&e.template.trim()){let t=`crewx/__inline_${Date.now()}`;return this._layoutLoader.registerLayout(t,e.template),t}return "crewx/default"}_extractLayoutProps(e,t,r){let o=e.inline?.layout,s=o&&typeof o=="object"&&"props"in o?o.props:void 0,i=r&&typeof r=="object"&&"id"in r?r.props:void 0;if(s||i)return {...s??{},...i??{}}}_getConversationProvider(){return this._plugins.find(t=>t.name==="conversation")?.conversationProvider}async _fetchHistoryMessages(e,t,r){if(r&&r.length>0)return r;if(!e)return;let o=this._getConversationProvider();if(o)try{let s=await o.fetchHistory(e,{currentTraceId:t});return s.messages.length===0?void 0:bn(s)}catch{return}}_resolveTimeout(e,t){let r=e==="query"?"CREWX_TIMEOUT_QUERY":"CREWX_TIMEOUT_EXECUTE";if(process.env[r]!=null&&process.env[r]!==""){let o=Oo();return e==="query"?o.queryMs:o.executeMs}if(t?.meta?.defaultTimeoutMs){let o=e==="query"?t.meta.defaultTimeoutMs.query:t.meta.defaultTimeoutMs.execute;if(o!==void 0)return o}return 8*36e5}_resolveIdleTimeout(e){let t=cn();return t!==void 0?t:e?.meta?.defaultIdleMs!==void 0?e.meta.defaultIdleMs:6e5}_lookupCliAdapter(e){return En(e)}_resolveEffectiveCost(e,t,r){return Uo(e?.costUsd,e?.inputTokens,e?.outputTokens,e?.cachedInputTokens,t)}_resolveEffectiveCwd(e,t){return t?.cwd??(e.working_directory?resolve(this._projectRoot,e.working_directory):this._projectRoot)}_buildFileRemoteOptions(e,t){let r={path:this._projectRoot,id:this._workspaceId,name:this._workspaceName,agentRef:e};return {...t,cwd:void 0,callerIdentity:r,metadata:{...t?.metadata??{},crewx:{...t?.metadata?.crewx??{},callerWorkspace:r}},vars:{...t?.vars??{},crewx_caller_workspace_path:r.path,crewx_caller_workspace_id:r.id,crewx_caller_workspace_name:r.name}}}_registerCallerIdentityOverride(e,t,r){let o=Symbol("callerIdentityOverride");return this._callerIdentityOverrides.set(e,{token:o,callerIdentity:t,targetIdentity:r}),o}_clearCallerIdentityOverride(e,t){if(!t)return;let r=this._callerIdentityOverrides.get(e);r&&r.token===t&&this._callerIdentityOverrides.delete(e);}_rewriteCallerFacingPayload(e,t,r){let{callerIdentity:o,targetIdentity:s}=r,i={...t,agentRef:o.agentRef};if(e==="task:output")return i;let a=i,d=a.metadata??{},l=d.crewx??{};return {...a,workspaceId:o.id,workspaceName:o.name,metadata:{...d,crewx:{...l,remoteExecution:s}}}}emit(e,t){if(e==="task:start"||e==="task:end"||e==="task:output"){let r=t.traceId,o=this._callerIdentityOverrides.get(r);if(o){let s=this._rewriteCallerFacingPayload(e,t,o);super.emit(e,s);return}}super.emit(e,t);}emitToolEvents(e,t,r,o,s,i,a){try{let l=this._lookupCliAdapter(r)?.parseEvent?.(o)??Ut(new Date().toISOString(),o);for(let c of l)c.type==="tool_use"&&c.toolName&&this.emit("tool:observed:before",{traceId:e,timestamp:new Date,agentRef:t,agentId:s,threadId:i,sessionId:a,provider:r,tool:{name:c.toolName,rawName:c.toolName,input:c.toolInput?this.tryParseJson(c.toolInput):void 0,toolUseId:c.toolUseId}}),c.type==="tool_result"&&this.emit("tool:observed:after",{traceId:e,timestamp:new Date,agentRef:t,agentId:s,threadId:i,sessionId:a,provider:r,tool:{name:c.toolName??"unknown",rawName:c.toolName??"unknown",toolUseId:c.toolUseId,result:c.resultPreview,isError:c.isError}});}catch{}}emitTaskLogEntries(e,t,r,o,s,i,a){try{for(let d of a)d.type==="tool_use"&&d.toolName&&this.emit("tool:observed:before",{traceId:e,timestamp:new Date,agentRef:t,agentId:r,threadId:o,sessionId:s,provider:i,tool:{name:d.toolName,rawName:d.toolName,input:d.toolInput?this.tryParseJson(d.toolInput):void 0,toolUseId:d.toolUseId}}),d.type==="tool_result"&&this.emit("tool:observed:after",{traceId:e,timestamp:new Date,agentRef:t,agentId:r,threadId:o,sessionId:s,provider:i,tool:{name:d.toolName??"unknown",rawName:d.toolName??"unknown",toolUseId:d.toolUseId,result:d.resultPreview,isError:d.isError}});}catch{}}tryParseJson(e){try{return JSON.parse(e)}catch{return e}}async query(e,t,r){let o=await this.resolveFileRemoteTarget(e);if(o){let c=await o.target.query(o.agentRef,t,this._buildFileRemoteOptions(e,r));return {...c,meta:{...c.meta,agentId:e.replace(/^@/,"")}}}let s=Jt.getStore()??Cn(r?.trace),i=r?.taskId??at("tsk"),a={parentTaskId:s?.parentTaskId??null,rootTraceId:s?.rootTraceId??i,callerAgentId:s?.callerAgentId??null},d={parentTaskId:i,rootTraceId:s?.rootTraceId??i,callerAgentId:null},l=r?.callerIdentity?this._registerCallerIdentityOverride(i,r.callerIdentity,{agentId:e.replace(/^@/,""),workspaceId:this._workspaceId,workspaceName:this._workspaceName}):void 0;try{return await Jt.run(d,async()=>{let c=Date.now(),f=new Date,g;try{g=gr(e,Array.from(this._agents.values()));}catch(A){if(A instanceof Te){this.emit("task:start",{traceId:i,timestamp:f,agentRef:e,message:t,mode:"query",parentTaskId:a.parentTaskId,rootTraceId:a.rootTraceId,callerAgentId:a.callerAgentId,metadata:{...r?.metadata??{}},threadId:r?.threadId,platform:r?.platform??"cli",workspaceId:this._workspaceId,workspaceName:this._workspaceName});let M=Date.now()-c,W={code:"AGENT_NOT_FOUND",message:A.message};return this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"query",durationMs:M,error:W,metadata:r?.metadata?{...r.metadata}:void 0}),this._clearCallerIdentityOverride(i,l),{ok:!1,data:"",error:W,meta:{agentId:e.replace(/^@/,""),provider:"",durationMs:M,taskId:i}}}throw A}d.callerAgentId=g.id;let m=Rn(g.provider),_=Er(g.options,"query",m,Ar(r?.overdrive)),v=Rr(g.options,"query"),x=_.active&&_.provider?_.provider:r?.provider??v.provider??m,w=_.active&&_.model?_.model:r?.model??v.model??g.inline?.model;w&&w.includes("{{")&&(w=await this._templateEngine.render(w,{...r?.vars??{}}));let k=x!==m?void 0:r?.resumeSessionId,E;try{E=Ie(x,this._additionalArgsProvider);}catch(A){this.emit("task:start",{traceId:i,timestamp:f,agentRef:e,message:t,mode:"query",parentTaskId:a.parentTaskId,rootTraceId:a.rootTraceId,callerAgentId:a.callerAgentId,metadata:{...r?.metadata??{}},threadId:r?.threadId,platform:r?.platform??"cli",workspaceId:this._workspaceId,workspaceName:this._workspaceName});let M=Date.now()-c,W={code:"PROVIDER_ERROR",message:A.message};return this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"query",durationMs:M,error:W,metadata:r?.metadata?{...r.metadata}:void 0}),this._clearCallerIdentityOverride(i,l),{ok:!1,data:"",error:W,meta:{agentId:g.id,provider:x,model:w,durationMs:M,taskId:i}}}let P=await this._fetchHistoryMessages(r?.threadId,i,r?.messages),T;try{T=await this.renderAgentPromptFull(e,{session:{mode:"query",platform:r?.platform},vars:{user_input:t,...r?.vars??{},crewx_workspace_path:this._resolveEffectiveCwd(g,r)},messages:P,threadId:r?.threadId});}catch(A){console.error(`[crewx] renderAgentPromptFull failed for ${e}: ${A instanceof Error?A.message:String(A)}`);}let J,U,O,D=w,le=!1,Q=A=>{le||(le=!0,this.emit("task:start",{traceId:i,timestamp:f,agentRef:e,message:t,mode:"query",pid:A,parentTaskId:a.parentTaskId,rootTraceId:a.rootTraceId,callerAgentId:a.callerAgentId,model:D,provider:x,codingAgentCommand:J,renderedPrompt:T,metadata:{...r?.metadata??{},provider:x,..._.active?{overdrive:!0}:{}},threadId:r?.threadId,platform:r?.platform??"cli",workspaceId:this._workspaceId,workspaceName:this._workspaceName}));},L=g.options,ee=_.active?_.mode:L?.query?.mode,j=_.active?_.effort:L?.query?.effort,oe=Array.isArray(L?.query?.tools)?L.query.tools:void 0,q=this._tools.size>0?this._filterToolsByMode(oe):[],H=(()=>{let A=L?.query;if(!A||Array.isArray(A))return;let{tools:M,effort:W,mode:b,provider:K,model:ce,profiles:mt,...qr}=A,It=Object.entries(qr).filter(([,be])=>be!=null);if(It.length!==0)return Object.fromEntries(It.map(([be,zr])=>[be,String(zr)]))})(),Z=g.inline?.max_steps;x.startsWith("api/")&&Q();let X=!1,z=0,Ge=()=>{},F=new Promise(A=>{Ge=A;});this._activeTasks.set(i,{pid:void 0,done:F});try{let A=await E.query(t,{model:w,effort:j,mode:ee,context:r?.context,systemPrompt:T??g.inline?.system_prompt??g.inline?.prompt??g.description??`You are ${g.id}.`,additionalArgs:Array.isArray(L?.query)?L.query:void 0,resumeSessionId:k,tools:q.length>0?q:void 0,maxSteps:Z,configOptions:H,timeoutMs:this._resolveTimeout("query",this._lookupCliAdapter(x)),idleMs:this._resolveIdleTimeout(this._lookupCliAdapter(x)),cwd:this._resolveEffectiveCwd(g,r),env:{CREWX_AGENT_ID:g.id,CREWX_AGENT_ROLE:g.role??"",CREWX_AGENT_TEAM:g.team??"",CREWX_USER_ID:process.env.USER||process.env.USERNAME||"unknown",CREWX_TRACE_ID:i,CREWX_PARENT_TASK_ID:i,CREWX_TASK_ID:i,CREWX_CALLER_AGENT_ID:process.env.CREWX_AGENT_ID??"",CREWX_THREAD_ID:r?.threadId??"",CREWX_PROVIDER:x,CREWX_SESSION_ID:"",CREWX_TASK_LOG_PATH:this.computeTaskLogPath(i,f)},onPid:b=>{let K=this._activeTasks.get(i);K&&(K.pid=b),Q(b);},onOutput:(b,K)=>{let ce=this._lookupCliAdapter(x);K==="stdout"&&ce?.suppressOutputLine?.(b)===!0||this.emit("task:output",{traceId:i,timestamp:new Date,agentRef:e,output:b,level:K}),K==="stdout"&&this.emitToolEvents(i,e,x,b,g.id,r?.threadId??"","");},onTaskLog:b=>{this.emitTaskLogEntries(i,e,g.id,r?.threadId??"","",x,b);for(let K of b)this.emit("task:output",{traceId:i,timestamp:new Date,agentRef:e,output:JSON.stringify(K),level:"info"});},onCommand:b=>{J=b;},onUsage:b=>{U=b;},onExitCode:b=>{O=b;},onModel:b=>{D||(D=b);}});z=this._resolveEffectiveCost(U,D,c),Q();let M=Date.now()-c,W={...r?.metadata??{},...r?.threadId?{threadId:r.threadId}:{}};return this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"query",result:A,durationMs:M,exitCode:O,inputTokens:U?.inputTokens,outputTokens:U?.outputTokens,cachedInputTokens:U?.cachedInputTokens,costUsd:z,model:D,metadata:Object.keys(W).length>0?W:void 0}),X=!0,{ok:!0,data:A,meta:{agentId:g.id,provider:x,model:w,durationMs:M,taskId:i}}}catch(A){if(A instanceof he){let b=at("thd");return this._pendingThreads.set(b,{agentRef:g.id,providerStr:x,continuationState:A.continuationState,toolCall:A.toolCall,traceId:i,startMs:c,model:w}),X=!0,{ok:!0,status:"requires_action",data:"",toolCall:A.toolCall,threadId:b,meta:{agentId:g.id,provider:x,model:w,durationMs:Date.now()-c,taskId:i}}}z=this._resolveEffectiveCost(U,D,c),Q();let M=Date.now()-c,W={code:"QUERY_FAILED",message:A.message};return this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"query",durationMs:M,error:W,exitCode:O,inputTokens:U?.inputTokens,outputTokens:U?.outputTokens,cachedInputTokens:U?.cachedInputTokens,costUsd:z,model:D,metadata:r?.metadata?{...r.metadata}:void 0}),X=!0,{ok:!1,data:"",error:W,meta:{agentId:g.id,provider:x,model:w,durationMs:M,taskId:i}}}finally{X||this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"query",durationMs:Date.now()-c,error:{code:"TASK_END_GUARD",message:"task:end was not emitted normally"},exitCode:O??-1,inputTokens:U?.inputTokens,outputTokens:U?.outputTokens,cachedInputTokens:U?.cachedInputTokens,costUsd:z,model:D}),this._activeTasks.delete(i),this._clearCallerIdentityOverride(i,l),Ge();}})}finally{this._clearCallerIdentityOverride(i,l);}}async continueQuery(e,t){let r=this._pendingThreads.get(e);if(!r)return {ok:false,data:"",error:{code:"THREAD_NOT_FOUND",message:`No pending thread: ${e}`},meta:{agentId:"",provider:"",durationMs:0}};this._pendingThreads.delete(e);let o=Ie(r.providerStr,this._additionalArgsProvider);if(!o.continueWithToolResults)return {ok:false,data:"",error:{code:"UNSUPPORTED",message:"Provider does not support client tool continuation"},meta:{agentId:r.agentRef,provider:r.providerStr,durationMs:0}};let s=t.map(i=>({...i,toolName:r.toolCall.toolCallId===i.toolCallId?r.toolCall.toolName:i.toolCallId}));try{let i=await o.continueWithToolResults(r.continuationState,s),a=Date.now()-r.startMs;return this.emit("task:end",{traceId:r.traceId,timestamp:new Date,agentRef:r.agentRef,mode:"query",result:i,durationMs:a}),{ok:!0,status:"complete",data:i,meta:{agentId:r.agentRef,provider:r.providerStr,model:r.model,durationMs:a}}}catch(i){if(i instanceof he)return this._pendingThreads.set(e,{...r,continuationState:i.continuationState,toolCall:i.toolCall}),{ok:true,status:"requires_action",data:"",toolCall:i.toolCall,threadId:e,meta:{agentId:r.agentRef,provider:r.providerStr,model:r.model,durationMs:Date.now()-r.startMs}};let a=Date.now()-r.startMs;return {ok:false,data:"",error:{code:"CONTINUE_FAILED",message:i.message},meta:{agentId:r.agentRef,provider:r.providerStr,model:r.model,durationMs:a}}}}async execute(e,t,r){let o=await this.resolveFileRemoteTarget(e);if(o){let c=await o.target.execute(o.agentRef,t,this._buildFileRemoteOptions(e,r));return {...c,meta:{...c.meta,agentId:e.replace(/^@/,"")}}}let s=Jt.getStore()??Cn(r?.trace),i=r?.taskId??at("tsk"),a={parentTaskId:s?.parentTaskId??null,rootTraceId:s?.rootTraceId??i,callerAgentId:s?.callerAgentId??null},d={parentTaskId:i,rootTraceId:s?.rootTraceId??i,callerAgentId:null},l=r?.callerIdentity?this._registerCallerIdentityOverride(i,r.callerIdentity,{agentId:e.replace(/^@/,""),workspaceId:this._workspaceId,workspaceName:this._workspaceName}):void 0;try{return await Jt.run(d,async()=>{let c=Date.now(),f=new Date,g;try{g=gr(e,Array.from(this._agents.values()));}catch(A){if(A instanceof Te){this.emit("task:start",{traceId:i,timestamp:f,agentRef:e,message:t,mode:"execute",parentTaskId:a.parentTaskId,rootTraceId:a.rootTraceId,callerAgentId:a.callerAgentId,metadata:{...r?.metadata??{}},threadId:r?.threadId,platform:r?.platform??"cli",workspaceId:this._workspaceId,workspaceName:this._workspaceName});let M=Date.now()-c,W={code:"AGENT_NOT_FOUND",message:A.message};return this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"execute",durationMs:M,error:W,metadata:r?.metadata?{...r.metadata}:void 0}),this._clearCallerIdentityOverride(i,l),{ok:!1,data:"",error:W,meta:{agentId:e.replace(/^@/,""),provider:"",durationMs:M,taskId:i}}}throw A}d.callerAgentId=g.id;let m=Rn(g.provider),_=Er(g.options,"execute",m,Ar(r?.overdrive)),v=Rr(g.options,"execute"),x=_.active&&_.provider?_.provider:r?.provider??v.provider??m,w=_.active&&_.model?_.model:r?.model??v.model??g.inline?.model;w&&w.includes("{{")&&(w=await this._templateEngine.render(w,{...r?.vars??{}}));let k=x!==m?void 0:r?.resumeSessionId,E;try{E=Ie(x,this._additionalArgsProvider);}catch(A){this.emit("task:start",{traceId:i,timestamp:f,agentRef:e,message:t,mode:"execute",parentTaskId:a.parentTaskId,rootTraceId:a.rootTraceId,callerAgentId:a.callerAgentId,metadata:{...r?.metadata??{}},threadId:r?.threadId,platform:r?.platform??"cli",workspaceId:this._workspaceId,workspaceName:this._workspaceName});let M=Date.now()-c,W={code:"PROVIDER_ERROR",message:A.message};return this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"execute",durationMs:M,error:W,metadata:r?.metadata?{...r.metadata}:void 0}),this._clearCallerIdentityOverride(i,l),{ok:!1,data:"",error:W,meta:{agentId:g.id,provider:x,model:w,durationMs:M,taskId:i}}}let P=await this._fetchHistoryMessages(r?.threadId,i,r?.messages),T;try{T=await this.renderAgentPromptFull(e,{session:{mode:"execute",platform:r?.platform},vars:{user_input:t,...r?.vars??{},crewx_workspace_path:this._resolveEffectiveCwd(g,r)},messages:P,threadId:r?.threadId});}catch(A){console.error(`[crewx] renderAgentPromptFull failed for ${e}: ${A instanceof Error?A.message:String(A)}`);}let J,U,O,D=w,le=!1,Q=A=>{le||(le=!0,this.emit("task:start",{traceId:i,timestamp:f,agentRef:e,message:t,mode:"execute",pid:A,parentTaskId:a.parentTaskId,rootTraceId:a.rootTraceId,callerAgentId:a.callerAgentId,model:D,provider:x,codingAgentCommand:J,renderedPrompt:T,metadata:{...r?.metadata??{},provider:x,..._.active?{overdrive:!0}:{}},threadId:r?.threadId,platform:r?.platform??"cli",workspaceId:this._workspaceId,workspaceName:this._workspaceName}));},L=g.options,ee=_.active?_.mode:L?.execute?.mode,j=_.active?_.effort:L?.execute?.effort,oe=Array.isArray(L?.execute?.tools)?L.execute.tools:void 0,q=this._tools.size>0?this._filterToolsByMode(oe):[],H=(()=>{let A=L?.execute;if(!A||Array.isArray(A))return;let{tools:M,effort:W,mode:b,provider:K,model:ce,profiles:mt,...qr}=A,It=Object.entries(qr).filter(([,be])=>be!=null);if(It.length!==0)return Object.fromEntries(It.map(([be,zr])=>[be,String(zr)]))})(),Z=g.inline?.max_steps;x.startsWith("api/")&&Q();let X=!1,z=0,Ge=()=>{},F=new Promise(A=>{Ge=A;});this._activeTasks.set(i,{pid:void 0,done:F});try{let A=await E.execute(t,{model:w,effort:j,mode:ee,context:r?.context,systemPrompt:T??g.inline?.system_prompt??g.inline?.prompt??g.description??`You are ${g.id}.`,additionalArgs:Array.isArray(L?.execute)?L.execute:void 0,resumeSessionId:k,tools:q.length>0?q:void 0,maxSteps:Z,configOptions:H,timeoutMs:this._resolveTimeout("execute",this._lookupCliAdapter(x)),idleMs:this._resolveIdleTimeout(this._lookupCliAdapter(x)),cwd:this._resolveEffectiveCwd(g,r),env:{CREWX_AGENT_ID:g.id,CREWX_AGENT_ROLE:g.role??"",CREWX_AGENT_TEAM:g.team??"",CREWX_USER_ID:process.env.USER||process.env.USERNAME||"unknown",CREWX_TRACE_ID:i,CREWX_PARENT_TASK_ID:i,CREWX_TASK_ID:i,CREWX_CALLER_AGENT_ID:process.env.CREWX_AGENT_ID??"",CREWX_THREAD_ID:r?.threadId??"",CREWX_PROVIDER:x,CREWX_SESSION_ID:"",CREWX_TASK_LOG_PATH:this.computeTaskLogPath(i,f)},onPid:b=>{let K=this._activeTasks.get(i);K&&(K.pid=b),Q(b);},onOutput:(b,K)=>{let ce=this._lookupCliAdapter(x);K==="stdout"&&ce?.suppressOutputLine?.(b)===!0||this.emit("task:output",{traceId:i,timestamp:new Date,agentRef:e,output:b,level:K}),K==="stdout"&&this.emitToolEvents(i,e,x,b,g.id,r?.threadId??"","");},onTaskLog:b=>{this.emitTaskLogEntries(i,e,g.id,r?.threadId??"","",x,b);for(let K of b)this.emit("task:output",{traceId:i,timestamp:new Date,agentRef:e,output:JSON.stringify(K),level:"info"});},onCommand:b=>{J=b;},onUsage:b=>{U=b;},onExitCode:b=>{O=b;},onModel:b=>{D||(D=b);}});z=this._resolveEffectiveCost(U,D,c),Q();let M=Date.now()-c,W={...r?.metadata??{},...r?.threadId?{threadId:r.threadId}:{}};return this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"execute",result:A,durationMs:M,exitCode:O,inputTokens:U?.inputTokens,outputTokens:U?.outputTokens,cachedInputTokens:U?.cachedInputTokens,costUsd:z,model:D,metadata:Object.keys(W).length>0?W:void 0}),X=!0,{ok:!0,data:A,meta:{agentId:g.id,provider:x,model:w,durationMs:M,taskId:i}}}catch(A){z=this._resolveEffectiveCost(U,D,c),Q();let M=Date.now()-c,W={code:"EXECUTE_FAILED",message:A.message};return this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"execute",durationMs:M,error:W,exitCode:O,inputTokens:U?.inputTokens,outputTokens:U?.outputTokens,cachedInputTokens:U?.cachedInputTokens,costUsd:z,model:D,metadata:r?.metadata?{...r.metadata}:void 0}),X=!0,{ok:!1,data:"",error:W,meta:{agentId:g.id,provider:x,model:w,durationMs:M,taskId:i}}}finally{X||this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"execute",durationMs:Date.now()-c,error:{code:"TASK_END_GUARD",message:"task:end was not emitted normally"},exitCode:O??-1,inputTokens:U?.inputTokens,outputTokens:U?.outputTokens,cachedInputTokens:U?.cachedInputTokens,costUsd:z,model:D}),this._activeTasks.delete(i),this._clearCallerIdentityOverride(i,l),Ge();}})}finally{this._clearCallerIdentityOverride(i,l);}}};function Ns(n,e){let t=Yn(n)?n:void 0,r=Yn(e)?e:void 0;if(!(!t&&!r))return {...t??{},...r??{}}}function Yn(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function Ml(n,e){let t=Array.isArray(n)?n:void 0,r=Array.isArray(e)?e:void 0;if(!t&&!r)return;let o=a=>{if(!Yn(a))return;let d=a.id;if(typeof d=="string")return `id:${d}`;let l=a.name;if(typeof l=="string")return `name:${l}`},s=new Set;for(let a of r??[]){let d=o(a);d&&s.add(d);}let i=[];for(let a of t??[]){let d=o(a);d&&s.has(d)||i.push(a);}for(let a of r??[])i.push(a);return i}function Nl(n){let e=Array.isArray(n.provider)?n.provider:[n.provider],t=n.options,r=[...e];for(let o of ["query","execute"]){let s=Rr(t,o);s.provider&&r.push(s.provider);let i=t&&typeof t=="object"&&!Array.isArray(t)?t[o]:void 0,a=i&&typeof i=="object"&&!Array.isArray(i)?xr(i.overdrive):void 0;a?.provider&&r.push(a.provider);}return r}async function Ds(n,e,t){let r=n.flatMap(Nl);if(r.some(s=>s.startsWith("api/"))){let{registerApiProviders:s}=await Promise.resolve().then(()=>(Ln(),ks));s(t?.api);}await Ll(r,e),$l(r,e),Dl(r);}function Dl(n){if(!n.some(r=>r.startsWith("acp/")))return;let{registerAcpProviders:t}=(Bn(),fo(Cs));t();}async function Ll(n,e){if(!n.some(i=>i.startsWith("remote/")))return;let r=e.providers;if(!Array.isArray(r))return;let{createRemoteProviderFactory:o}=await Promise.resolve().then(()=>(Kn(),Ts)),s=new Map;for(let i of r)i.type==="remote"&&typeof i.id=="string"&&s.set(i.id,i);s.size>0&&Se("remote",o(s,Ie));}function $l(n,e){if(!n.some(i=>i.startsWith("plugin/")))return;let r=e.providers;if(!Array.isArray(r))return;let{createPluginProviderFactory:o}=(Gn(),fo(Os)),s=new Map;for(let i of r)i.type==="plugin"&&typeof i.id=="string"&&s.set(i.id,i);s.size>0&&Se("plugin",o(s));}u();var Qn=class{detach(e){}};u();var Ul="crewx:fs:",Zn=class{prefix;store;constructor(e){this.prefix=e?.prefix??Ul,this.store=e?.storage??new Map;}async readFile(e){let t=this.toKey(e),r=this.store.get(t);if(r===void 0)throw new Error(`BrowserFsAdapter: file not found: ${e}`);return r}async exists(e){return this.store.has(this.toKey(e))}resolvePath(...e){let t=e.map(i=>i.replace(/\\/g,"/")).join("/").replace(/\/+/g,"/"),r=t.split("/"),o=[];for(let i of r)i==="."||i===""||(i===".."?o.pop():o.push(i));let s=o.join("/");return t.startsWith("/")?`/${s}`:s}isAbsolute(e){return e.startsWith("/")}setItem(e,t){this.store.set(this.toKey(e),t);}removeItem(e){this.store.delete(this.toKey(e));}keys(){return Array.from(this.store.keys()).filter(e=>e.startsWith(this.prefix)).map(e=>e.slice(this.prefix.length))}async readdir(e){let t=e.replace(/\\/g,"/").replace(/\/$/,""),r=this.toKey(t+"/"),o=[];for(let s of this.store.keys())if(s.startsWith(r)){let a=s.slice(r.length).split("/")[0];a&&!o.includes(a)&&o.push(a);}return o}toKey(e){return `${this.prefix}${e.replace(/\\/g,"/")}`}};u();var Tt="default",Pt="archive",Ls="wi-default-flow",jl="wi-plan-flow",Wl="wi-default-flow.yaml",Fl="wi-plan-flow.yaml",Fr=/^[a-zA-Z0-9_-]{1,64}$/;function $s(n){return n===Tt||n===Pt}function Hl(n){let e={id:Tt,name:"Default",workflowId:Ls,system:true,readOnly:false},t={id:Pt,name:"Archive",workflowId:"",system:true,readOnly:true},r=n?.settings?.wi?.boards;if(!Array.isArray(r)||r.length===0)return [e,t];let o=new Set,s=[];for(let i of r){if(!i||typeof i!="object")continue;let a=i,d=a.id,l=a.name,c=a.workflow_id;if(typeof d!="string"||d.length===0||typeof l!="string"||l.length===0||typeof c!="string"||c.length===0||$s(d)||!Fr.test(d)||o.has(d))continue;o.add(d);let f=typeof a.description=="string"?a.description:void 0,g=typeof a.goal_id=="string"?a.goal_id:void 0;s.push({id:d,name:l,workflowId:c,...f!==void 0?{description:f}:{},...g!==void 0?{goalId:g}:{},system:false,readOnly:false});}return [e,...s,t]}u();var te=class extends Error{constructor(e){super(e),this.name="WiCreateError";}},ql=300*1e3,zl=300*1e3,Kl=1e4,Gl=50;function Vl(n){return new Promise(e=>setTimeout(e,n))}function Jl(n){let e=n.getFullYear(),t=String(n.getMonth()+1).padStart(2,"0"),r=String(n.getDate()).padStart(2,"0");return {compact:`${e}${t}${r}`,iso:`${e}-${t}-${r}`}}function Xl(n){return n.normalize("NFKD").replace(/[^\x00-\x7F]/g,"").replace(/[^a-zA-Z0-9]+/g,"-").replace(/^-+|-+$/g,"").toUpperCase().slice(0,60)}function Yl(n,e){let t=n.replace(/\\/g,"/").toLowerCase(),r=e.replace(/\\/g,"/").toLowerCase();if(r!==t&&!r.startsWith(t+"/"))throw new te("Path is outside wi directory")}function Us(n){let e=typeof n=="string"?n.trim():"";if(!e)throw new te("title is required");if(e.length>200)throw new te("title must be 200 characters or fewer");return e}function js(n){let e=typeof n=="string"?n.trim():"";if(!e)return "manual";if(e.length>128)throw new te("source must be 128 characters or fewer");if(/[\r\n]/.test(e))throw new te("source must be a single line");return e}function Ws(n){return (typeof n=="string"?n.trim().replace(/^@+/,""):"")||void 0}function Fs(n){if(n==null)return [];if(!Array.isArray(n))throw new te("depends_on must be an array");return n.map(e=>String(e).trim()).filter(Boolean)}function Hs(n,e){let t=typeof n=="string"?n.trim():"";if(!t){if(e?.required)throw new te("board is required");return}if(!Fr.test(t))throw new te("board must match ^[a-zA-Z0-9_-]{1,64}$");if(t===Pt)throw new te(`board cannot be '${Pt}'`);return t}function St(n){return JSON.stringify(n)}function Ql(n,e){return e.length===0?[`${n}: []`]:[`${n}:`,...e.map(t=>` - ${St(t)}`)]}async function Zl(n){let e=await promises.stat(n).catch(()=>null);e&&Date.now()-e.mtimeMs>zl&&await promises.rm(n,{recursive:true,force:true}).catch(()=>{});}async function ec(n,e){let t=join(n,".wi-create.lock"),r=Date.now()+Kl;for(;Date.now()<r;)try{await promises.mkdir(t);try{return await e()}finally{await promises.rm(t,{recursive:!0,force:!0}).catch(()=>{});}}catch(o){if(o.code!=="EEXIST")throw o;await Zl(t),await Vl(Gl);}throw new te("WI create lock timeout: docs/wi/.wi-create.lock")}async function Bs(n){let e=[],t=await promises.readdir(n,{withFileTypes:true}).catch(r=>{if(r.code==="ENOENT")return [];throw r});for(let r of t){let o=join(n,r.name);r.isDirectory()?e.push(...await Bs(o)):r.isFile()&&r.name.endsWith(".md")&&e.push(r.name);}return e}async function tc(n){let e=await promises.readdir(n).catch(r=>{if(r.code==="ENOENT")return [];throw r}),t=await Bs(join(n,"archive"));return [...e,...t]}function rc(n,e){return n.reduce((t,r)=>{if(!r.startsWith(e))return t;let o=r.slice(e.length).match(/^(\d+)/);return o?Math.max(t,parseInt(o[1],10)):t},0)+1}function nc(n,e){return n.some(t=>t===`${e}.md`||t.startsWith(`${e}-`))}async function oc(n,e){let t=join(n,`.wi-${e}.lock`);try{return await promises.writeFile(t,"",{flag:"wx"}),{claimed:!0,lockPath:t}}catch(r){if(r.code!=="EEXIST")throw r;return await promises.stat(t).then(s=>Date.now()-s.mtimeMs>ql).catch(()=>false)&&await promises.unlink(t).then(()=>true).catch(()=>false)?(await promises.writeFile(t,"",{flag:"wx"}),{claimed:true,lockPath:t}):{claimed:false,lockPath:t}}}function sc(n){return {title:Us(n.title),assignee:Ws(n.assignee),body:(n.body??"").trim(),board:Hs(n.board),source:js(n.source),depends_on:Fs(n.depends_on)}}function ic(n,e,t){if(n==null)return;let r=typeof n=="string"?n.trim():"";if(!r)throw new te(`items[${e}].key must be a non-empty string when provided`);if(t.has(r))throw new te(`items[${e}].key "${r}" is duplicated`);return t.add(r),r}function ac(n){let e=Hs(n.board,{required:true}),t=js(n.source);if(!Array.isArray(n.items)||n.items.length===0)throw new te("items must contain at least one WI");let r=new Set;return n.items.map((o,s)=>{if(!o||typeof o!="object")throw new te(`items[${s}] must be an object`);if(typeof o.body!="string")throw new te(`items[${s}].body is required`);return {key:ic(o.key,s,r),title:Us(o.title),assignee:Ws(o.assignee),body:o.body.trim(),board:e,source:t,depends_on:Fs(o.depends_on)}})}function dc(n,e){return n.map(t=>e.get(t)??t)}function lc(n,e,t){let r=!!n.board&&n.board!==Tt,o={wi_id:e,title:n.title,date:t,status:"draft",priority:"normal",source:n.source};return n.assignee&&(o.assignee=n.assignee),r&&(o.board=n.board),o.depends_on=n.depends_on,{raw:`---
|
|
308
|
+
${i.message}`)}let s=ur(o);if(s.documents&&typeof s.documents=="object"){let i={};for(let[a,d]of Object.entries(s.documents))if(d&&typeof d=="object"){let l=d;typeof l.path=="string"&&!isAbsolute(l.path)?i[a]={...l,path:resolve(r,l.path)}:i[a]=l;}else i[a]=d;return {...s,documents:i}}return s}static mergeCrewxConfig(e,t){let r=new Map;for(let k of e.agents??[])r.set(k.id,k);for(let k of t.agents??[])r.has(k.id)&&console.warn(`[agent-loader] User agent "${k.id}" overrides built-in`),r.set(k.id,k);let o=Array.from(r.values()),s={...e.layouts??{},...t.layouts??{}},i={...e.documents??{},...t.documents??{}},a=e,d=t,l=Ns(a.vars,d.vars),c=Ns(a.settings,d.settings),f;e.skills&&t.skills&&typeof e.skills=="object"&&typeof t.skills=="object"&&!Array.isArray(e.skills)&&!Array.isArray(t.skills)?f={...e.skills,...t.skills}:f=t.skills??e.skills;let g=[...e.hooks??[],...t.hooks??[]],m=Ml(a.providers,d.providers),_={...e},v={...t};for(let k of ["agents","layouts","documents","skills","hooks","vars","settings","providers"])delete _[k],delete v[k];let w={...{..._,...v},agents:o,layouts:s,documents:i,skills:f};return g.length>0&&(w.hooks=g),l!==void 0&&(w.vars=l),c!==void 0&&(w.settings=c),m!==void 0&&(w.providers=m),w}static async loadYaml(e,t,r){let o=t?.includeBuiltIns!==false,s,i;if(o){let c=await n.loadBuiltInConfig(r);if(e!==void 0){let f=pr(e);s=n.mergeCrewxConfig(c,f),i=dirname(e);}else s=c,i=process.cwd();}else {if(e===void 0)throw new Error("[@crewx/sdk] loadYaml: path is required when includeBuiltIns is false");s=pr(e),i=dirname(e);}let a=new st(r);await a.load(s.documents,i);let d=s.agents??[];return await Ds(d,s,t),new n(d,t??{},s,a,i)}static async fromConfig(e,t,r,o){let s=t?.includeBuiltIns===true,i=e;if(s){let c=await n.loadBuiltInConfig(o);i=n.mergeCrewxConfig(c,e);}let a=new st(o);await a.load(i.documents,r??(typeof process<"u"?process.cwd():"/"));let d=i.agents??[];return await Ds(d,i,t),new n(d,t??{},i,a,r)}get agents(){return this._agents}get config(){return this._config}get plugins(){return this._plugins}get tools(){return this._tools}get workspaceId(){return this._workspaceId}get workspaceName(){return this._workspaceName}getAgent(e){let t=e.startsWith("@")?e.slice(1):e;return this._agents.get(t)}getRemoteProviderConfig(e){let t=this._config?.providers;return Array.isArray(t)?t.find(o=>o.type==="remote"&&o.id===e):void 0}computeTaskLogPath(e,t){let r=vn(t);return join(this._projectRoot,".crewx","logs",`${r}_${e}.log`)}registerTool(e,t){this._tools.set(e,{name:e,...t});}async use(e){this._plugins.includes(e)||(await e.attach(this),this._plugins.push(e));}handler(e){return Mn(this,e)}async registerChannelAdapter(e){let{adapter:t,instanceId:r,config:o}=e;if(this._activeAdapters.has(r))throw new Error(`Adapter instance already registered: ${r}`);let s=new Set(t.manifest.capabilities),i=e.store??kn(r),a=e.defaultMode??"query",d=t.manifest.platform,l=e.agentRunner??{run:async(m,_,v)=>{let w=await(a==="execute"?this.execute.bind(this):this.query.bind(this))(`@${m}`,_,{threadId:v?.threadId,platform:d});return {output:w.ok?w.data:w.error?.message??""}}},c=e.onInbound??(async m=>{let _=m.routingHints?.agentId??e.defaultAgent;if(!_)return {accepted:false,reason:"no_agent"};let{output:v}=await l.run(_,m.text,{threadId:m.threadId});return {accepted:true,output:v}}),f=An({instanceId:r,config:o,capabilities:s,db:i,agentRunner:l,onInbound:c}),g={adapter:t,ctx:f,state:"starting"};this._activeAdapters.set(r,g),this.emit("adapter:lifecycle",{adapterId:t.manifest.id,instanceId:r,state:"starting",timestamp:new Date});try{await t.start(f),g.state="started",this.emit("adapter:lifecycle",{adapterId:t.manifest.id,instanceId:r,state:"started",timestamp:new Date});}catch(m){throw g.state="failed",this.emit("adapter:lifecycle",{adapterId:t.manifest.id,instanceId:r,state:"failed",error:m instanceof Error?m:new Error(String(m)),timestamp:new Date}),this._activeAdapters.delete(r),m}}async unregisterChannelAdapter(e){let t=this._activeAdapters.get(e);if(t){t.state="stopping",this.emit("adapter:lifecycle",{adapterId:t.adapter.manifest.id,instanceId:e,state:"stopping",timestamp:new Date});try{await t.adapter.stop(t.ctx),t.state="stopped",this.emit("adapter:lifecycle",{adapterId:t.adapter.manifest.id,instanceId:e,state:"stopped",timestamp:new Date});}catch(r){t.state="failed",this.emit("adapter:lifecycle",{adapterId:t.adapter.manifest.id,instanceId:e,state:"failed",error:r instanceof Error?r:new Error(String(r)),timestamp:new Date});}finally{this._activeAdapters.delete(e);}}}async stopAllAdapters(e={}){let t=e.timeoutMs??1e4,r=Array.from(this._activeAdapters.keys()),o=await Promise.allSettled(r.map(s=>Promise.race([this.unregisterChannelAdapter(s),new Promise((i,a)=>setTimeout(()=>a(new Error(`Adapter stop timeout: ${s}`)),t))])));for(let s=0;s<o.length;s++)o[s].status==="rejected"&&console.error(`[crewx] adapter stop error (${r[s]}): ${o[s].reason}`);}abortAll(){for(let[e,t]of this._activeTasks)if(t.pid!==void 0)try{process.platform==="win32"?process.kill(t.pid,"SIGTERM"):process.kill(-t.pid,"SIGTERM");}catch(r){console.error(`[crewx] abort task ${e} (pid=${t.pid}) error: ${r instanceof Error?r.message:String(r)}`);}}async _drainActiveTasks(e){let t=Array.from(this._activeTasks.values()).map(r=>r.done);t.length!==0&&await Promise.race([Promise.allSettled(t),new Promise(r=>setTimeout(r,e).unref())]);}async close(){this.abortAll(),await this._drainActiveTasks(jt+1e3),await this.stopAllAdapters({timeoutMs:1e4});let e=[...this._remoteTargets.values()];this._remoteTargets.clear(),await Promise.allSettled(e.map(async r=>{try{await(await r).close();}catch(o){console.error(`[crewx] remote target close error: ${o instanceof Error?o.message:String(o)}`);}}));let t=[...this._plugins].reverse();for(let r of t)try{await r.detach(this);}catch(o){console.error(`[crewx] plugin ${r.name} detach error: ${o instanceof Error?o.message:String(o)}`);}this._plugins.length=0;}filterAgents(e){let t=a=>a?a.split(",").map(d=>d.trim().toLowerCase()).filter(Boolean):void 0,r=t(e.role),o=t(e.team),s=t(e.provider),i=Array.from(this._agents.values());return r&&(i=i.filter(a=>a.role&&r.some(d=>_e(a.role.toLowerCase(),d)))),o&&(i=i.filter(a=>a.team&&o.some(d=>_e(a.team.toLowerCase(),d)))),s&&(i=i.filter(a=>(Array.isArray(a.provider)?a.provider:[a.provider]).some(l=>s.some(c=>_e(l.toLowerCase(),c))))),i}renderAgentPrompt(e){let t=e.startsWith("@")?e.slice(1):e,r=this._agents.get(t);if(!r)throw new Te(t,Array.from(this._agents.keys()));return r.inline?.prompt??r.inline?.system_prompt??r.description??`You are an expert ${t}.`}async renderPrompt(e,t){let o={...await this._documentLoader.buildContext(),...t?.documents??{}},s={...t,documents:o};return this._templateEngine.render(e,s)}registerLayout(e,t){this._layoutLoader.registerLayout(e,t);}async renderAgentPromptFull(e,t){let r=e.startsWith("@")?e.slice(1):e,o=this._agents.get(r);if(!o)throw new Te(r,Array.from(this._agents.keys()));let s=this._resolveLayoutSpec(o,t?.layout),i=this._extractLayoutId(s),a=this._extractLayoutProps(o,s,t?.layout),d=this._layoutLoader.load(i,a),l=o.inline?.prompt??o.inline?.system_prompt??o.description??`You are an expert ${r}.`,c=await this._documentLoader.buildContext(),f=t?.env??(typeof process<"u"?process.env:{}),g=t?.vars?.security_key??Ol(),m={...t?.vars??{},documents:c,env:f,agent:{id:o.id,name:o.name??o.id,role:o.role??"",team:o.team??"",description:o.description??""}},_=await this._templateEngine.render(l,m),v={mode:t?.session?.mode??"query",platform:t?.session?.platform??"cli",options:t?.session?.options??[]},x=o.provider,w=Array.isArray(x)?x:typeof x=="string"&&x.length>0?[x]:[],k=w.join(", ")||(typeof x=="string"?x:""),E=o.options,P=["goals","daily"],T={goals:false,daily:false},J;if(!Array.isArray(E)&&typeof E=="object"&&E!==null){let F=E;if("goals"in F){let M=F.goals;typeof M=="string"||Array.isArray(M)?T.goals=M:T.goals=!!M;}"daily"in F&&(T.daily=!!F.daily);let A={};for(let[M,W]of Object.entries(F))P.includes(M)||(A[M]=W);if(Object.keys(A).length>0){let M=w.some(b=>b.startsWith("cli/")),W={};for(let[b,K]of Object.entries(A)){let ce={};if(Array.isArray(K))M&&(ce.rawArgs=K);else if(typeof K=="object"&&K!==null){let mt=K;Object.keys(mt).length>0&&(ce.named=mt);}(ce.named||ce.rawArgs&&ce.rawArgs.length>0)&&(W[b]=ce);}J=Object.keys(W).length>0?W:void 0;}}let U=Array.isArray(E)?E:void 0,O={};for(let[F,A]of Object.entries(c))O[F]={content:A.content??"",toc:A.toc,summary:A.summary,path:A.path};if(T.goals){let F=join(this._projectRoot,"docs","goal"),A=await Xo(F,void 0,T.goals);A&&(O.active_goals={content:A});}if(T.daily){let F=join(this._projectRoot,"docs","daily"),A=await Yo(F);A&&(O.today_daily={content:A});}let D=t?.vars?.user_input??void 0,L=this._config?.settings?.dreaming?.continuity,ee=L?.reuseReadOnly!==false,j=typeof L?.lookback=="number"?L.lookback:5,oe=typeof L?.maxEntryChars=="number"?L.maxEntryChars:8e3,q=typeof L?.decayRate=="number"?L.decayRate:.5,H=t?.threadId??"",Z=o.id,X=ee&&j>0&&H&&t?.messages&&t.messages.length>0?ps({threadId:H,agentId:Z,lookback:j,maxEntryChars:oe,decayRate:q}):new Map,z=(t?.messages??[]).map(F=>{if(!F.isAssistant)return F;let A=F.metadata?.task_id;return !A||!X.has(A)?F:{...F,activity_log:X.get(A)}}),Ge={user_input:D,agent:{id:o.id,name:o.name??o.id,role:o.role??"",team:o.team??"",description:o.description??"",provider:k,providerList:w,model:o.inline?.model,workingDirectory:o.working_directory??o.workingDirectory??".",inline:{...o.inline??{},prompt:_},specialties:o.specialties??[],capabilities:o.capabilities??[],remote:o.remote??null,optionsByMode:J,optionsArray:U},agentMetadata:{specialties:o.specialties??[],capabilities:o.capabilities??[],description:o.description??""},contextOptions:T,documents:O,skills:t?.skills??[],session:v,env:f,vars:{security_key:g,...t?.vars??{}},props:{...a??{},...t?.messages&&t.messages.length>0?{showConversationHistory:true}:{}},platform:v.platform,mode:v.mode,thread_id:H,now:zt(new Date),has_activity_log:X.size>0,messages:z,tools:this._tools.size>0?{list:Array.from(this._tools.values()).map(F=>({name:F.name,description:F.description,parameters:F.parameters})),json:JSON.stringify(Array.from(this._tools.values()).map(F=>({name:F.name,description:F.description,parameters:F.parameters})),null,2),count:this._tools.size}:null,metadata:{}};return this._layoutRenderer.render(d,Ge)}_filterToolsByMode(e){return e?e.map(t=>this._tools.get(t)).filter(t=>t!==void 0):Array.from(this._tools.values())}_resolveLayoutSpec(e,t){if(t!==void 0)return t;let r=e.inline?.layout;if(r!==void 0)return r;let o=this._config?.layouts?.default;return typeof o=="string"&&o?o:"crewx/default"}_extractLayoutId(e){if(typeof e=="string")return e;if("id"in e)return e.id;if("template"in e&&typeof e.template=="string"&&e.template.trim()){let t=`crewx/__inline_${Date.now()}`;return this._layoutLoader.registerLayout(t,e.template),t}return "crewx/default"}_extractLayoutProps(e,t,r){let o=e.inline?.layout,s=o&&typeof o=="object"&&"props"in o?o.props:void 0,i=r&&typeof r=="object"&&"id"in r?r.props:void 0;if(s||i)return {...s??{},...i??{}}}_getConversationProvider(){return this._plugins.find(t=>t.name==="conversation")?.conversationProvider}async _fetchHistoryMessages(e,t,r){if(r&&r.length>0)return r;if(!e)return;let o=this._getConversationProvider();if(o)try{let s=await o.fetchHistory(e,{currentTraceId:t});return s.messages.length===0?void 0:bn(s)}catch{return}}_resolveTimeout(e,t){let r=e==="query"?"CREWX_TIMEOUT_QUERY":"CREWX_TIMEOUT_EXECUTE";if(process.env[r]!=null&&process.env[r]!==""){let o=Oo();return e==="query"?o.queryMs:o.executeMs}if(t?.meta?.defaultTimeoutMs){let o=e==="query"?t.meta.defaultTimeoutMs.query:t.meta.defaultTimeoutMs.execute;if(o!==void 0)return o}return 8*36e5}_resolveIdleTimeout(e){let t=cn();return t!==void 0?t:e?.meta?.defaultIdleMs!==void 0?e.meta.defaultIdleMs:6e5}_lookupCliAdapter(e){return En(e)}_resolveEffectiveCost(e,t,r){return Uo(e?.costUsd,e?.inputTokens,e?.outputTokens,e?.cachedInputTokens,t)}_resolveEffectiveCwd(e,t){return t?.cwd??(e.working_directory?resolve(this._projectRoot,e.working_directory):this._projectRoot)}_buildFileRemoteOptions(e,t){let r={path:this._projectRoot,id:this._workspaceId,name:this._workspaceName,agentRef:e};return {...t,cwd:void 0,callerIdentity:r,metadata:{...t?.metadata??{},crewx:{...t?.metadata?.crewx??{},callerWorkspace:r}},vars:{...t?.vars??{},crewx_caller_workspace_path:r.path,crewx_caller_workspace_id:r.id,crewx_caller_workspace_name:r.name}}}_registerCallerIdentityOverride(e,t,r){let o=Symbol("callerIdentityOverride");return this._callerIdentityOverrides.set(e,{token:o,callerIdentity:t,targetIdentity:r}),o}_clearCallerIdentityOverride(e,t){if(!t)return;let r=this._callerIdentityOverrides.get(e);r&&r.token===t&&this._callerIdentityOverrides.delete(e);}_rewriteCallerFacingPayload(e,t,r){let{callerIdentity:o,targetIdentity:s}=r,i={...t,agentRef:o.agentRef};if(e==="task:output")return i;let a=i,d=a.metadata??{},l=d.crewx??{};return {...a,workspaceId:o.id,workspaceName:o.name,metadata:{...d,crewx:{...l,remoteExecution:s}}}}emit(e,t){if(e==="task:start"||e==="task:end"||e==="task:output"){let r=t.traceId,o=this._callerIdentityOverrides.get(r);if(o){let s=this._rewriteCallerFacingPayload(e,t,o);super.emit(e,s);return}}super.emit(e,t);}emitToolEvents(e,t,r,o,s,i,a){try{let l=this._lookupCliAdapter(r)?.parseEvent?.(o)??Ut(new Date().toISOString(),o);for(let c of l)c.type==="tool_use"&&c.toolName&&this.emit("tool:observed:before",{traceId:e,timestamp:new Date,agentRef:t,agentId:s,threadId:i,sessionId:a,provider:r,tool:{name:c.toolName,rawName:c.toolName,input:c.toolInput?this.tryParseJson(c.toolInput):void 0,toolUseId:c.toolUseId}}),c.type==="tool_result"&&this.emit("tool:observed:after",{traceId:e,timestamp:new Date,agentRef:t,agentId:s,threadId:i,sessionId:a,provider:r,tool:{name:c.toolName??"unknown",rawName:c.toolName??"unknown",toolUseId:c.toolUseId,result:c.resultPreview,isError:c.isError}});}catch{}}emitTaskLogEntries(e,t,r,o,s,i,a){try{for(let d of a)d.type==="tool_use"&&d.toolName&&this.emit("tool:observed:before",{traceId:e,timestamp:new Date,agentRef:t,agentId:r,threadId:o,sessionId:s,provider:i,tool:{name:d.toolName,rawName:d.toolName,input:d.toolInput?this.tryParseJson(d.toolInput):void 0,toolUseId:d.toolUseId}}),d.type==="tool_result"&&this.emit("tool:observed:after",{traceId:e,timestamp:new Date,agentRef:t,agentId:r,threadId:o,sessionId:s,provider:i,tool:{name:d.toolName??"unknown",rawName:d.toolName??"unknown",toolUseId:d.toolUseId,result:d.resultPreview,isError:d.isError}});}catch{}}tryParseJson(e){try{return JSON.parse(e)}catch{return e}}async query(e,t,r){let o=await this.resolveFileRemoteTarget(e);if(o){let c=await o.target.query(o.agentRef,t,this._buildFileRemoteOptions(e,r));return {...c,meta:{...c.meta,agentId:e.replace(/^@/,"")}}}let s=Jt.getStore()??Cn(r?.trace),i=r?.taskId??at("tsk"),a={parentTaskId:s?.parentTaskId??null,rootTraceId:s?.rootTraceId??i,callerAgentId:s?.callerAgentId??null},d={parentTaskId:i,rootTraceId:s?.rootTraceId??i,callerAgentId:null},l=r?.callerIdentity?this._registerCallerIdentityOverride(i,r.callerIdentity,{agentId:e.replace(/^@/,""),workspaceId:this._workspaceId,workspaceName:this._workspaceName}):void 0;try{return await Jt.run(d,async()=>{let c=Date.now(),f=new Date,g;try{g=gr(e,Array.from(this._agents.values()));}catch(A){if(A instanceof Te){this.emit("task:start",{traceId:i,timestamp:f,agentRef:e,message:t,mode:"query",parentTaskId:a.parentTaskId,rootTraceId:a.rootTraceId,callerAgentId:a.callerAgentId,metadata:{...r?.metadata??{}},threadId:r?.threadId,platform:r?.platform??"cli",workspaceId:this._workspaceId,workspaceName:this._workspaceName});let M=Date.now()-c,W={code:"AGENT_NOT_FOUND",message:A.message};return this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"query",durationMs:M,error:W,metadata:r?.metadata?{...r.metadata}:void 0}),this._clearCallerIdentityOverride(i,l),{ok:!1,data:"",error:W,meta:{agentId:e.replace(/^@/,""),provider:"",durationMs:M,taskId:i}}}throw A}d.callerAgentId=g.id;let m=Rn(g.provider),_=Er(g.options,"query",m,Ar(r?.overdrive)),v=Rr(g.options,"query"),x=_.active&&_.provider?_.provider:r?.provider??v.provider??m,w=_.active&&_.model?_.model:r?.model??v.model??g.inline?.model;w&&w.includes("{{")&&(w=await this._templateEngine.render(w,{...r?.vars??{}}));let k=x!==m?void 0:r?.resumeSessionId,E;try{E=Ie(x,this._additionalArgsProvider);}catch(A){this.emit("task:start",{traceId:i,timestamp:f,agentRef:e,message:t,mode:"query",parentTaskId:a.parentTaskId,rootTraceId:a.rootTraceId,callerAgentId:a.callerAgentId,metadata:{...r?.metadata??{}},threadId:r?.threadId,platform:r?.platform??"cli",workspaceId:this._workspaceId,workspaceName:this._workspaceName});let M=Date.now()-c,W={code:"PROVIDER_ERROR",message:A.message};return this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"query",durationMs:M,error:W,metadata:r?.metadata?{...r.metadata}:void 0}),this._clearCallerIdentityOverride(i,l),{ok:!1,data:"",error:W,meta:{agentId:g.id,provider:x,model:w,durationMs:M,taskId:i}}}let P=await this._fetchHistoryMessages(r?.threadId,i,r?.messages),T;try{T=await this.renderAgentPromptFull(e,{session:{mode:"query",platform:r?.platform},vars:{user_input:t,...r?.vars??{},crewx_workspace_path:this._resolveEffectiveCwd(g,r)},messages:P,threadId:r?.threadId});}catch(A){console.error(`[crewx] renderAgentPromptFull failed for ${e}: ${A instanceof Error?A.message:String(A)}`);}let J,U,O,D=w,le=!1,Q=A=>{le||(le=!0,this.emit("task:start",{traceId:i,timestamp:f,agentRef:e,message:t,mode:"query",pid:A,parentTaskId:a.parentTaskId,rootTraceId:a.rootTraceId,callerAgentId:a.callerAgentId,model:D,provider:x,codingAgentCommand:J,renderedPrompt:T,metadata:{...r?.metadata??{},provider:x,..._.active?{overdrive:!0}:{}},threadId:r?.threadId,platform:r?.platform??"cli",workspaceId:this._workspaceId,workspaceName:this._workspaceName}));},L=g.options,ee=_.active?_.mode:L?.query?.mode,j=_.effort??r?.effort??L?.query?.effort,oe=Array.isArray(L?.query?.tools)?L.query.tools:void 0,q=this._tools.size>0?this._filterToolsByMode(oe):[],H=(()=>{let A=L?.query;if(!A||Array.isArray(A))return;let{tools:M,effort:W,mode:b,provider:K,model:ce,profiles:mt,...qr}=A,It=Object.entries(qr).filter(([,be])=>be!=null);if(It.length!==0)return Object.fromEntries(It.map(([be,zr])=>[be,String(zr)]))})(),Z=g.inline?.max_steps;x.startsWith("api/")&&Q();let X=!1,z=0,Ge=()=>{},F=new Promise(A=>{Ge=A;});this._activeTasks.set(i,{pid:void 0,done:F});try{let A=await E.query(t,{model:w,effort:j,mode:ee,context:r?.context,systemPrompt:T??g.inline?.system_prompt??g.inline?.prompt??g.description??`You are ${g.id}.`,additionalArgs:Array.isArray(L?.query)?L.query:void 0,resumeSessionId:k,tools:q.length>0?q:void 0,maxSteps:Z,configOptions:H,timeoutMs:this._resolveTimeout("query",this._lookupCliAdapter(x)),idleMs:this._resolveIdleTimeout(this._lookupCliAdapter(x)),cwd:this._resolveEffectiveCwd(g,r),env:{CREWX_AGENT_ID:g.id,CREWX_AGENT_ROLE:g.role??"",CREWX_AGENT_TEAM:g.team??"",CREWX_USER_ID:process.env.USER||process.env.USERNAME||"unknown",CREWX_TRACE_ID:i,CREWX_PARENT_TASK_ID:i,CREWX_TASK_ID:i,CREWX_CALLER_AGENT_ID:process.env.CREWX_AGENT_ID??"",CREWX_THREAD_ID:r?.threadId??"",CREWX_PROVIDER:x,CREWX_SESSION_ID:"",CREWX_TASK_LOG_PATH:this.computeTaskLogPath(i,f)},onPid:b=>{let K=this._activeTasks.get(i);K&&(K.pid=b),Q(b);},onOutput:(b,K)=>{let ce=this._lookupCliAdapter(x);K==="stdout"&&ce?.suppressOutputLine?.(b)===!0||this.emit("task:output",{traceId:i,timestamp:new Date,agentRef:e,output:b,level:K}),K==="stdout"&&this.emitToolEvents(i,e,x,b,g.id,r?.threadId??"","");},onTaskLog:b=>{this.emitTaskLogEntries(i,e,g.id,r?.threadId??"","",x,b);for(let K of b)this.emit("task:output",{traceId:i,timestamp:new Date,agentRef:e,output:JSON.stringify(K),level:"info"});},onCommand:b=>{J=b;},onUsage:b=>{U=b;},onExitCode:b=>{O=b;},onModel:b=>{D||(D=b);}});z=this._resolveEffectiveCost(U,D,c),Q();let M=Date.now()-c,W={...r?.metadata??{},...r?.threadId?{threadId:r.threadId}:{}};return this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"query",result:A,durationMs:M,exitCode:O,inputTokens:U?.inputTokens,outputTokens:U?.outputTokens,cachedInputTokens:U?.cachedInputTokens,costUsd:z,model:D,metadata:Object.keys(W).length>0?W:void 0}),X=!0,{ok:!0,data:A,meta:{agentId:g.id,provider:x,model:w,durationMs:M,taskId:i}}}catch(A){if(A instanceof he){let b=at("thd");return this._pendingThreads.set(b,{agentRef:g.id,providerStr:x,continuationState:A.continuationState,toolCall:A.toolCall,traceId:i,startMs:c,model:w}),X=!0,{ok:!0,status:"requires_action",data:"",toolCall:A.toolCall,threadId:b,meta:{agentId:g.id,provider:x,model:w,durationMs:Date.now()-c,taskId:i}}}z=this._resolveEffectiveCost(U,D,c),Q();let M=Date.now()-c,W={code:"QUERY_FAILED",message:A.message};return this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"query",durationMs:M,error:W,exitCode:O,inputTokens:U?.inputTokens,outputTokens:U?.outputTokens,cachedInputTokens:U?.cachedInputTokens,costUsd:z,model:D,metadata:r?.metadata?{...r.metadata}:void 0}),X=!0,{ok:!1,data:"",error:W,meta:{agentId:g.id,provider:x,model:w,durationMs:M,taskId:i}}}finally{X||this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"query",durationMs:Date.now()-c,error:{code:"TASK_END_GUARD",message:"task:end was not emitted normally"},exitCode:O??-1,inputTokens:U?.inputTokens,outputTokens:U?.outputTokens,cachedInputTokens:U?.cachedInputTokens,costUsd:z,model:D}),this._activeTasks.delete(i),this._clearCallerIdentityOverride(i,l),Ge();}})}finally{this._clearCallerIdentityOverride(i,l);}}async continueQuery(e,t){let r=this._pendingThreads.get(e);if(!r)return {ok:false,data:"",error:{code:"THREAD_NOT_FOUND",message:`No pending thread: ${e}`},meta:{agentId:"",provider:"",durationMs:0}};this._pendingThreads.delete(e);let o=Ie(r.providerStr,this._additionalArgsProvider);if(!o.continueWithToolResults)return {ok:false,data:"",error:{code:"UNSUPPORTED",message:"Provider does not support client tool continuation"},meta:{agentId:r.agentRef,provider:r.providerStr,durationMs:0}};let s=t.map(i=>({...i,toolName:r.toolCall.toolCallId===i.toolCallId?r.toolCall.toolName:i.toolCallId}));try{let i=await o.continueWithToolResults(r.continuationState,s),a=Date.now()-r.startMs;return this.emit("task:end",{traceId:r.traceId,timestamp:new Date,agentRef:r.agentRef,mode:"query",result:i,durationMs:a}),{ok:!0,status:"complete",data:i,meta:{agentId:r.agentRef,provider:r.providerStr,model:r.model,durationMs:a}}}catch(i){if(i instanceof he)return this._pendingThreads.set(e,{...r,continuationState:i.continuationState,toolCall:i.toolCall}),{ok:true,status:"requires_action",data:"",toolCall:i.toolCall,threadId:e,meta:{agentId:r.agentRef,provider:r.providerStr,model:r.model,durationMs:Date.now()-r.startMs}};let a=Date.now()-r.startMs;return {ok:false,data:"",error:{code:"CONTINUE_FAILED",message:i.message},meta:{agentId:r.agentRef,provider:r.providerStr,model:r.model,durationMs:a}}}}async execute(e,t,r){let o=await this.resolveFileRemoteTarget(e);if(o){let c=await o.target.execute(o.agentRef,t,this._buildFileRemoteOptions(e,r));return {...c,meta:{...c.meta,agentId:e.replace(/^@/,"")}}}let s=Jt.getStore()??Cn(r?.trace),i=r?.taskId??at("tsk"),a={parentTaskId:s?.parentTaskId??null,rootTraceId:s?.rootTraceId??i,callerAgentId:s?.callerAgentId??null},d={parentTaskId:i,rootTraceId:s?.rootTraceId??i,callerAgentId:null},l=r?.callerIdentity?this._registerCallerIdentityOverride(i,r.callerIdentity,{agentId:e.replace(/^@/,""),workspaceId:this._workspaceId,workspaceName:this._workspaceName}):void 0;try{return await Jt.run(d,async()=>{let c=Date.now(),f=new Date,g;try{g=gr(e,Array.from(this._agents.values()));}catch(A){if(A instanceof Te){this.emit("task:start",{traceId:i,timestamp:f,agentRef:e,message:t,mode:"execute",parentTaskId:a.parentTaskId,rootTraceId:a.rootTraceId,callerAgentId:a.callerAgentId,metadata:{...r?.metadata??{}},threadId:r?.threadId,platform:r?.platform??"cli",workspaceId:this._workspaceId,workspaceName:this._workspaceName});let M=Date.now()-c,W={code:"AGENT_NOT_FOUND",message:A.message};return this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"execute",durationMs:M,error:W,metadata:r?.metadata?{...r.metadata}:void 0}),this._clearCallerIdentityOverride(i,l),{ok:!1,data:"",error:W,meta:{agentId:e.replace(/^@/,""),provider:"",durationMs:M,taskId:i}}}throw A}d.callerAgentId=g.id;let m=Rn(g.provider),_=Er(g.options,"execute",m,Ar(r?.overdrive)),v=Rr(g.options,"execute"),x=_.active&&_.provider?_.provider:r?.provider??v.provider??m,w=_.active&&_.model?_.model:r?.model??v.model??g.inline?.model;w&&w.includes("{{")&&(w=await this._templateEngine.render(w,{...r?.vars??{}}));let k=x!==m?void 0:r?.resumeSessionId,E;try{E=Ie(x,this._additionalArgsProvider);}catch(A){this.emit("task:start",{traceId:i,timestamp:f,agentRef:e,message:t,mode:"execute",parentTaskId:a.parentTaskId,rootTraceId:a.rootTraceId,callerAgentId:a.callerAgentId,metadata:{...r?.metadata??{}},threadId:r?.threadId,platform:r?.platform??"cli",workspaceId:this._workspaceId,workspaceName:this._workspaceName});let M=Date.now()-c,W={code:"PROVIDER_ERROR",message:A.message};return this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"execute",durationMs:M,error:W,metadata:r?.metadata?{...r.metadata}:void 0}),this._clearCallerIdentityOverride(i,l),{ok:!1,data:"",error:W,meta:{agentId:g.id,provider:x,model:w,durationMs:M,taskId:i}}}let P=await this._fetchHistoryMessages(r?.threadId,i,r?.messages),T;try{T=await this.renderAgentPromptFull(e,{session:{mode:"execute",platform:r?.platform},vars:{user_input:t,...r?.vars??{},crewx_workspace_path:this._resolveEffectiveCwd(g,r)},messages:P,threadId:r?.threadId});}catch(A){console.error(`[crewx] renderAgentPromptFull failed for ${e}: ${A instanceof Error?A.message:String(A)}`);}let J,U,O,D=w,le=!1,Q=A=>{le||(le=!0,this.emit("task:start",{traceId:i,timestamp:f,agentRef:e,message:t,mode:"execute",pid:A,parentTaskId:a.parentTaskId,rootTraceId:a.rootTraceId,callerAgentId:a.callerAgentId,model:D,provider:x,codingAgentCommand:J,renderedPrompt:T,metadata:{...r?.metadata??{},provider:x,..._.active?{overdrive:!0}:{}},threadId:r?.threadId,platform:r?.platform??"cli",workspaceId:this._workspaceId,workspaceName:this._workspaceName}));},L=g.options,ee=_.active?_.mode:L?.execute?.mode,j=_.effort??r?.effort??L?.execute?.effort,oe=Array.isArray(L?.execute?.tools)?L.execute.tools:void 0,q=this._tools.size>0?this._filterToolsByMode(oe):[],H=(()=>{let A=L?.execute;if(!A||Array.isArray(A))return;let{tools:M,effort:W,mode:b,provider:K,model:ce,profiles:mt,...qr}=A,It=Object.entries(qr).filter(([,be])=>be!=null);if(It.length!==0)return Object.fromEntries(It.map(([be,zr])=>[be,String(zr)]))})(),Z=g.inline?.max_steps;x.startsWith("api/")&&Q();let X=!1,z=0,Ge=()=>{},F=new Promise(A=>{Ge=A;});this._activeTasks.set(i,{pid:void 0,done:F});try{let A=await E.execute(t,{model:w,effort:j,mode:ee,context:r?.context,systemPrompt:T??g.inline?.system_prompt??g.inline?.prompt??g.description??`You are ${g.id}.`,additionalArgs:Array.isArray(L?.execute)?L.execute:void 0,resumeSessionId:k,tools:q.length>0?q:void 0,maxSteps:Z,configOptions:H,timeoutMs:this._resolveTimeout("execute",this._lookupCliAdapter(x)),idleMs:this._resolveIdleTimeout(this._lookupCliAdapter(x)),cwd:this._resolveEffectiveCwd(g,r),env:{CREWX_AGENT_ID:g.id,CREWX_AGENT_ROLE:g.role??"",CREWX_AGENT_TEAM:g.team??"",CREWX_USER_ID:process.env.USER||process.env.USERNAME||"unknown",CREWX_TRACE_ID:i,CREWX_PARENT_TASK_ID:i,CREWX_TASK_ID:i,CREWX_CALLER_AGENT_ID:process.env.CREWX_AGENT_ID??"",CREWX_THREAD_ID:r?.threadId??"",CREWX_PROVIDER:x,CREWX_SESSION_ID:"",CREWX_TASK_LOG_PATH:this.computeTaskLogPath(i,f)},onPid:b=>{let K=this._activeTasks.get(i);K&&(K.pid=b),Q(b);},onOutput:(b,K)=>{let ce=this._lookupCliAdapter(x);K==="stdout"&&ce?.suppressOutputLine?.(b)===!0||this.emit("task:output",{traceId:i,timestamp:new Date,agentRef:e,output:b,level:K}),K==="stdout"&&this.emitToolEvents(i,e,x,b,g.id,r?.threadId??"","");},onTaskLog:b=>{this.emitTaskLogEntries(i,e,g.id,r?.threadId??"","",x,b);for(let K of b)this.emit("task:output",{traceId:i,timestamp:new Date,agentRef:e,output:JSON.stringify(K),level:"info"});},onCommand:b=>{J=b;},onUsage:b=>{U=b;},onExitCode:b=>{O=b;},onModel:b=>{D||(D=b);}});z=this._resolveEffectiveCost(U,D,c),Q();let M=Date.now()-c,W={...r?.metadata??{},...r?.threadId?{threadId:r.threadId}:{}};return this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"execute",result:A,durationMs:M,exitCode:O,inputTokens:U?.inputTokens,outputTokens:U?.outputTokens,cachedInputTokens:U?.cachedInputTokens,costUsd:z,model:D,metadata:Object.keys(W).length>0?W:void 0}),X=!0,{ok:!0,data:A,meta:{agentId:g.id,provider:x,model:w,durationMs:M,taskId:i}}}catch(A){z=this._resolveEffectiveCost(U,D,c),Q();let M=Date.now()-c,W={code:"EXECUTE_FAILED",message:A.message};return this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"execute",durationMs:M,error:W,exitCode:O,inputTokens:U?.inputTokens,outputTokens:U?.outputTokens,cachedInputTokens:U?.cachedInputTokens,costUsd:z,model:D,metadata:r?.metadata?{...r.metadata}:void 0}),X=!0,{ok:!1,data:"",error:W,meta:{agentId:g.id,provider:x,model:w,durationMs:M,taskId:i}}}finally{X||this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"execute",durationMs:Date.now()-c,error:{code:"TASK_END_GUARD",message:"task:end was not emitted normally"},exitCode:O??-1,inputTokens:U?.inputTokens,outputTokens:U?.outputTokens,cachedInputTokens:U?.cachedInputTokens,costUsd:z,model:D}),this._activeTasks.delete(i),this._clearCallerIdentityOverride(i,l),Ge();}})}finally{this._clearCallerIdentityOverride(i,l);}}};function Ns(n,e){let t=Yn(n)?n:void 0,r=Yn(e)?e:void 0;if(!(!t&&!r))return {...t??{},...r??{}}}function Yn(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function Ml(n,e){let t=Array.isArray(n)?n:void 0,r=Array.isArray(e)?e:void 0;if(!t&&!r)return;let o=a=>{if(!Yn(a))return;let d=a.id;if(typeof d=="string")return `id:${d}`;let l=a.name;if(typeof l=="string")return `name:${l}`},s=new Set;for(let a of r??[]){let d=o(a);d&&s.add(d);}let i=[];for(let a of t??[]){let d=o(a);d&&s.has(d)||i.push(a);}for(let a of r??[])i.push(a);return i}function Nl(n){let e=Array.isArray(n.provider)?n.provider:[n.provider],t=n.options,r=[...e];for(let o of ["query","execute"]){let s=Rr(t,o);s.provider&&r.push(s.provider);let i=t&&typeof t=="object"&&!Array.isArray(t)?t[o]:void 0,a=i&&typeof i=="object"&&!Array.isArray(i)?xr(i.overdrive):void 0;a?.provider&&r.push(a.provider);}return r}async function Ds(n,e,t){let r=n.flatMap(Nl);if(r.some(s=>s.startsWith("api/"))){let{registerApiProviders:s}=await Promise.resolve().then(()=>(Ln(),ks));s(t?.api);}await Ll(r,e),$l(r,e),Dl(r);}function Dl(n){if(!n.some(r=>r.startsWith("acp/")))return;let{registerAcpProviders:t}=(Bn(),fo(Cs));t();}async function Ll(n,e){if(!n.some(i=>i.startsWith("remote/")))return;let r=e.providers;if(!Array.isArray(r))return;let{createRemoteProviderFactory:o}=await Promise.resolve().then(()=>(Kn(),Ts)),s=new Map;for(let i of r)i.type==="remote"&&typeof i.id=="string"&&s.set(i.id,i);s.size>0&&Se("remote",o(s,Ie));}function $l(n,e){if(!n.some(i=>i.startsWith("plugin/")))return;let r=e.providers;if(!Array.isArray(r))return;let{createPluginProviderFactory:o}=(Gn(),fo(Os)),s=new Map;for(let i of r)i.type==="plugin"&&typeof i.id=="string"&&s.set(i.id,i);s.size>0&&Se("plugin",o(s));}u();var Qn=class{detach(e){}};u();var Ul="crewx:fs:",Zn=class{prefix;store;constructor(e){this.prefix=e?.prefix??Ul,this.store=e?.storage??new Map;}async readFile(e){let t=this.toKey(e),r=this.store.get(t);if(r===void 0)throw new Error(`BrowserFsAdapter: file not found: ${e}`);return r}async exists(e){return this.store.has(this.toKey(e))}resolvePath(...e){let t=e.map(i=>i.replace(/\\/g,"/")).join("/").replace(/\/+/g,"/"),r=t.split("/"),o=[];for(let i of r)i==="."||i===""||(i===".."?o.pop():o.push(i));let s=o.join("/");return t.startsWith("/")?`/${s}`:s}isAbsolute(e){return e.startsWith("/")}setItem(e,t){this.store.set(this.toKey(e),t);}removeItem(e){this.store.delete(this.toKey(e));}keys(){return Array.from(this.store.keys()).filter(e=>e.startsWith(this.prefix)).map(e=>e.slice(this.prefix.length))}async readdir(e){let t=e.replace(/\\/g,"/").replace(/\/$/,""),r=this.toKey(t+"/"),o=[];for(let s of this.store.keys())if(s.startsWith(r)){let a=s.slice(r.length).split("/")[0];a&&!o.includes(a)&&o.push(a);}return o}toKey(e){return `${this.prefix}${e.replace(/\\/g,"/")}`}};u();var Tt="default",Pt="archive",Ls="wi-default-flow",jl="wi-plan-flow",Wl="wi-default-flow.yaml",Fl="wi-plan-flow.yaml",Fr=/^[a-zA-Z0-9_-]{1,64}$/;function $s(n){return n===Tt||n===Pt}function Hl(n){let e={id:Tt,name:"Default",workflowId:Ls,system:true,readOnly:false},t={id:Pt,name:"Archive",workflowId:"",system:true,readOnly:true},r=n?.settings?.wi?.boards;if(!Array.isArray(r)||r.length===0)return [e,t];let o=new Set,s=[];for(let i of r){if(!i||typeof i!="object")continue;let a=i,d=a.id,l=a.name,c=a.workflow_id;if(typeof d!="string"||d.length===0||typeof l!="string"||l.length===0||typeof c!="string"||c.length===0||$s(d)||!Fr.test(d)||o.has(d))continue;o.add(d);let f=typeof a.description=="string"?a.description:void 0,g=typeof a.goal_id=="string"?a.goal_id:void 0;s.push({id:d,name:l,workflowId:c,...f!==void 0?{description:f}:{},...g!==void 0?{goalId:g}:{},system:false,readOnly:false});}return [e,...s,t]}u();var te=class extends Error{constructor(e){super(e),this.name="WiCreateError";}},ql=300*1e3,zl=300*1e3,Kl=1e4,Gl=50;function Vl(n){return new Promise(e=>setTimeout(e,n))}function Jl(n){let e=n.getFullYear(),t=String(n.getMonth()+1).padStart(2,"0"),r=String(n.getDate()).padStart(2,"0");return {compact:`${e}${t}${r}`,iso:`${e}-${t}-${r}`}}function Xl(n){return n.normalize("NFKD").replace(/[^\x00-\x7F]/g,"").replace(/[^a-zA-Z0-9]+/g,"-").replace(/^-+|-+$/g,"").toUpperCase().slice(0,60)}function Yl(n,e){let t=n.replace(/\\/g,"/").toLowerCase(),r=e.replace(/\\/g,"/").toLowerCase();if(r!==t&&!r.startsWith(t+"/"))throw new te("Path is outside wi directory")}function Us(n){let e=typeof n=="string"?n.trim():"";if(!e)throw new te("title is required");if(e.length>200)throw new te("title must be 200 characters or fewer");return e}function js(n){let e=typeof n=="string"?n.trim():"";if(!e)return "manual";if(e.length>128)throw new te("source must be 128 characters or fewer");if(/[\r\n]/.test(e))throw new te("source must be a single line");return e}function Ws(n){return (typeof n=="string"?n.trim().replace(/^@+/,""):"")||void 0}function Fs(n){if(n==null)return [];if(!Array.isArray(n))throw new te("depends_on must be an array");return n.map(e=>String(e).trim()).filter(Boolean)}function Hs(n,e){let t=typeof n=="string"?n.trim():"";if(!t){if(e?.required)throw new te("board is required");return}if(!Fr.test(t))throw new te("board must match ^[a-zA-Z0-9_-]{1,64}$");if(t===Pt)throw new te(`board cannot be '${Pt}'`);return t}function St(n){return JSON.stringify(n)}function Ql(n,e){return e.length===0?[`${n}: []`]:[`${n}:`,...e.map(t=>` - ${St(t)}`)]}async function Zl(n){let e=await promises.stat(n).catch(()=>null);e&&Date.now()-e.mtimeMs>zl&&await promises.rm(n,{recursive:true,force:true}).catch(()=>{});}async function ec(n,e){let t=join(n,".wi-create.lock"),r=Date.now()+Kl;for(;Date.now()<r;)try{await promises.mkdir(t);try{return await e()}finally{await promises.rm(t,{recursive:!0,force:!0}).catch(()=>{});}}catch(o){if(o.code!=="EEXIST")throw o;await Zl(t),await Vl(Gl);}throw new te("WI create lock timeout: docs/wi/.wi-create.lock")}async function Bs(n){let e=[],t=await promises.readdir(n,{withFileTypes:true}).catch(r=>{if(r.code==="ENOENT")return [];throw r});for(let r of t){let o=join(n,r.name);r.isDirectory()?e.push(...await Bs(o)):r.isFile()&&r.name.endsWith(".md")&&e.push(r.name);}return e}async function tc(n){let e=await promises.readdir(n).catch(r=>{if(r.code==="ENOENT")return [];throw r}),t=await Bs(join(n,"archive"));return [...e,...t]}function rc(n,e){return n.reduce((t,r)=>{if(!r.startsWith(e))return t;let o=r.slice(e.length).match(/^(\d+)/);return o?Math.max(t,parseInt(o[1],10)):t},0)+1}function nc(n,e){return n.some(t=>t===`${e}.md`||t.startsWith(`${e}-`))}async function oc(n,e){let t=join(n,`.wi-${e}.lock`);try{return await promises.writeFile(t,"",{flag:"wx"}),{claimed:!0,lockPath:t}}catch(r){if(r.code!=="EEXIST")throw r;return await promises.stat(t).then(s=>Date.now()-s.mtimeMs>ql).catch(()=>false)&&await promises.unlink(t).then(()=>true).catch(()=>false)?(await promises.writeFile(t,"",{flag:"wx"}),{claimed:true,lockPath:t}):{claimed:false,lockPath:t}}}function sc(n){return {title:Us(n.title),assignee:Ws(n.assignee),body:(n.body??"").trim(),board:Hs(n.board),source:js(n.source),depends_on:Fs(n.depends_on)}}function ic(n,e,t){if(n==null)return;let r=typeof n=="string"?n.trim():"";if(!r)throw new te(`items[${e}].key must be a non-empty string when provided`);if(t.has(r))throw new te(`items[${e}].key "${r}" is duplicated`);return t.add(r),r}function ac(n){let e=Hs(n.board,{required:true}),t=js(n.source);if(!Array.isArray(n.items)||n.items.length===0)throw new te("items must contain at least one WI");let r=new Set;return n.items.map((o,s)=>{if(!o||typeof o!="object")throw new te(`items[${s}] must be an object`);if(typeof o.body!="string")throw new te(`items[${s}].body is required`);return {key:ic(o.key,s,r),title:Us(o.title),assignee:Ws(o.assignee),body:o.body.trim(),board:e,source:t,depends_on:Fs(o.depends_on)}})}function dc(n,e){return n.map(t=>e.get(t)??t)}function lc(n,e,t){let r=!!n.board&&n.board!==Tt,o={wi_id:e,title:n.title,date:t,status:"draft",priority:"normal",source:n.source};return n.assignee&&(o.assignee=n.assignee),r&&(o.board=n.board),o.depends_on=n.depends_on,{raw:`---
|
|
309
309
|
${[`wi_id: ${e}`,`title: ${St(n.title)}`,`date: ${St(t)}`,"status: draft",...n.assignee?[`assignee: ${St(n.assignee)}`]:[],"priority: normal",`source: ${St(n.source)}`,...r?[`board: ${St(n.board)}`]:[],...Ql("depends_on",n.depends_on)].join(`
|
|
310
310
|
`)}
|
|
311
311
|
---
|
package/dist/index.js
CHANGED
|
@@ -305,7 +305,7 @@ ${r.join(`
|
|
|
305
305
|
`).find(s=>s.trim()&&!s.startsWith("Read "))?.trim()??e.trim();if(!o)return "unknown";try{let s=ls__namespace.statSync(o);if(t){let i=Date.parse(t);if(!Number.isNaN(i)&&s.mtimeMs>i)return "stale"}return "ok"}catch{return "unknown"}}function zd(n){let e=new Set;for(let t of n)try{let r=JSON.parse(t);r.type&&e.add(r.type);}catch{}return e.has("turn.started")||e.has("thread.started")?"codex":e.has("assistant.message_delta")?"copilot":e.has("step_start")&&e.has("step_finish")?"opencode":e.has("system")&&e.has("result")?"claude":e.has("init")&&e.has("message")?"gemini":e.has("result")&&e.has("assistant")?"claude":null}function Kd(n){if(!Array.isArray(n))return [];let e=n,t=e.filter(a=>a.level==="stdout"&&a.message).map(a=>a.message),r=zd(t),o=[];for(let a of e)a.level==="info"&&a.message?o.push(...he(a.message,a.timestamp)):a.level==="stdout"&&a.message&&r&&o.push(...$t("",a.message,r));let s=new Map,i=[];for(let a of o)if(a.type==="tool_use"){let d={tool:Hd(a.toolName??""),input:a.toolInput??null,result:null,isError:false},l=a.toolUseId;if(l){if(s.has(l)){s.get(l).input=d.input;continue}s.set(l,d);}i.push(d);}else if(a.type==="tool_result"){if(a.toolUseId&&s.has(a.toolUseId)){let d=s.get(a.toolUseId);d.isError=a.isError===true,d.result=a.resultPreview??null;}else for(let d=i.length-1;d>=0;d--)if(i[d].result===null){i[d].isError=a.isError===true,i[d].result=a.resultPreview??null;break}}return i}function Gd(n,e){let t=Kd(n),r=[];for(let o of t){let s=o.tool==="Bash"?o.input?.split(`
|
|
306
306
|
`)[0]?.slice(0,150)??null:o.input?.slice(0,150)??null,i=Bd(o.tool,o.input)&&!o.isError;r.push({tool:o.tool,cmd:s,result:o.result,status:qd(o.tool,o.input,e),reusable:i});}return r}function Vd(n,e,t){let r=["<activity_log>"];if(n.length===0&&e===0)r.push(" <!-- no activity found in previous tasks -->");else {r.push(" <!-- tool activity from previous tasks -->"),e>0&&r.push(` <!-- ${e} entries omitted (cap) -->`);for(let o of n){let s=`tool="${Mr(o.tool)}"`,i=o.cmd?` cmd="${Mr(o.cmd)}"`:"",a="";if(o.reusable&&(a=o.status==="stale"?' reused="stale"':' reused="ok"'),o.reusable&&o.status==="stale")r.push(` <entry ${s}${i}${a}>\u26A0\uFE0F changed since \u2014 re-read</entry>`);else if(o.result){r.push(` <entry ${s}${i}${a}>`);let d=t&&t>0?t:8e3,l=o.result;l.length>d?r.push(Mr(l.slice(0,d))+` \u2026 [truncated, ${d}/${l.length} chars shown]`):r.push(Mr(l)),r.push(" </entry>");}else r.push(` <entry ${s}${i}${a} />`);}}return r.push("</activity_log>"),r}function cs(n){let{threadId:e,agentId:t,lookback:r,maxEntryChars:o,decayRate:s}=n;if(!r||!e||!t)return new Map;let i;try{i=new Xt().findTasksByThread(e).filter(g=>!g.parent_task_id&&g.agent_id===t).sort((g,m)=>m.started_at>g.started_at?1:-1).slice(0,Math.min(r,5));}catch{return new Map}if(!i.length)return new Map;let a=[];for(let f of i){let g=[];try{let m=JSON.parse(f.logs??"[]");Array.isArray(m)&&(g=m);}catch{}a.push({taskId:f.id,entries:Gd(g,f.completed_at)});}let d=new Map,l=typeof s=="number"&&s>0&&s<=1?s:1,c=1e3;for(let f=0;f<a.length;f++){let{taskId:g,entries:m}=a[f];if(m.length===0)continue;let w=Math.max(Math.floor((o??8e3)*Math.pow(l,f)),c),_=Math.max(0,m.length-200),k=_>0?m.slice(_):m,y=Vd(k,_,w);d.set(g,y.join(`
|
|
307
307
|
`));}return d}u();u();var Jd={agentId:zod.z.string().describe("The agent ID to query"),query:zod.z.string().describe("The query message to send"),context:zod.z.string().optional().describe("Additional context"),thread:zod.z.string().optional().describe("Thread ID for conversation continuity")},Xd={agentId:zod.z.string().describe("The agent ID to execute"),task:zod.z.string().describe("The task description to execute"),context:zod.z.string().optional().describe("Additional context"),thread:zod.z.string().optional().describe("Thread ID for conversation continuity")};function us(n,e,t){n.tool("crewx_listAgents","List available CrewX agents exposed by this server",async()=>{let r=[];for(let o of t){let s=e.agents.get(o);s&&r.push({id:s.id,name:s.name??s.id,description:s.description??""});}return {content:[{type:"text",text:JSON.stringify(r,null,2)}]}}),n.tool("crewx_queryAgent","Query a CrewX agent with a read-only question",Jd,async({agentId:r,query:o,context:s,thread:i})=>{if(!t.has(r))return {content:[{type:"text",text:`Agent '${r}' is not exposed by this server`}],isError:true};let a=await e.query(r,o,{context:s,threadId:i});return a.ok?{content:[{type:"text",text:a.data}]}:{content:[{type:"text",text:a.error?.message??"Query failed"}],isError:true}}),n.tool("crewx_executeAgent","Execute a task on a CrewX agent (may modify state)",Xd,async({agentId:r,task:o,context:s,thread:i})=>{if(!t.has(r))return {content:[{type:"text",text:`Agent '${r}' is not exposed by this server`}],isError:true};let a=await e.execute(r,o,{context:s,threadId:i});return a.ok?{content:[{type:"text",text:a.data}]}:{content:[{type:"text",text:a.error?.message??"Execute failed"}],isError:true}});}u();function ps(n){return n.headers.get("Origin")?null:new Response(JSON.stringify({error:"Forbidden: Origin header required"}),{status:403,headers:{"Content-Type":"application/json"}})}async function gs(n,e){return e?await e(n)?null:new Response(JSON.stringify({error:"Unauthorized"}),{status:401,headers:{"Content-Type":"application/json"}}):null}function Zd(n,e){let t=new mcp_js.McpServer({name:"crewx-mcp-server",version:"1.0.0"},{capabilities:{tools:{}}});return us(t,n,e),t}function On(n,e){if(!e.agents||e.agents.length===0)throw new Error("crewx.handler() requires at least one agent in the agents option");let t=new Set(e.agents),r=new Map;return async o=>{let s=ps(o);if(s)return s;let i=await gs(o,e.auth);if(i)return i;let a=o.headers.get("mcp-session-id");if(a&&r.has(a))return r.get(a).transport.handleRequest(o);let d=Zd(n,t),l=new webStandardStreamableHttp_js.WebStandardStreamableHTTPServerTransport({sessionIdGenerator:()=>crypto.randomUUID(),onsessioninitialized:c=>{r.set(c,{transport:l,server:d});},onsessionclosed:c=>{r.delete(c);},enableJsonResponse:true});return await d.connect(l),l.handleRequest(o)}}u();function ms(n){let e=K__namespace.resolve(n);return process.platform==="win32"&&(e=e.replace(/\\/g,"/"),e=e.replace(/^([A-Z]):/,(t,r)=>`${r.toLowerCase()}:`)),e.length>1&&!/^[a-zA-Z]:\/$/.test(e)&&(e=e.replace(/\/+$/,"")),e}function Mn(n){let e=ms(n);return crypto$1.createHash("sha256").update(e).digest("hex")}function Cl(n){return n?n.settings?.template?.exec:void 0}function bl(){try{let n=new Uint8Array(8);return globalThis.crypto.getRandomValues(n),Array.from(n,e=>e.toString(16).padStart(2,"0")).join("")}catch{let{randomBytes:n}=oe("crypto");return n(8).toString("hex")}}var Jn=class n extends Gt{_agents;_templateEngine;_documentLoader;_layoutLoader;_layoutRenderer;_config;_projectRoot;_workspaceId;_workspaceName;_plugins=[];_tools=new Map;_activeAdapters=new Map;_pendingThreads=new Map;_activeTasks=new Map;_remoteFactory;_remoteTargets=new Map;_additionalArgsProvider;_callerIdentityOverrides=new Map;constructor(e,t={},r,o,s){super(),this._agents=new Map(e.map(d=>[d.id,d])),this._config=r,this._projectRoot=s??(typeof process<"u"?process.cwd():"/");let i=s??(typeof process<"u"?process.env.CREWX_WORKSPACE??process.cwd():"/");this._workspaceId=Mn(i),this._workspaceName=K.basename(i);let a=Cl(r);this._templateEngine=new Ht({execPolicy:t.execPolicy??a}),this._documentLoader=o??new ot,this._layoutLoader=new Bt({templatesPath:mt()}),this._layoutRenderer=new Kt,this._remoteFactory=t.remoteFactory,this._additionalArgsProvider=t.additionalArgsProvider;}async resolveFileRemoteTarget(e){let t=this.getAgent(e),r=Array.isArray(t?.provider)?t?.provider[0]:t?.provider;if(!r?.startsWith("remote/"))return null;let o=r.slice(7),s=this.getRemoteProviderConfig(o);if(!s?.location?.startsWith("file://"))return null;let i=K.resolve(s.location.replace("file://","")),a=s.external_agent_id??e.replace(/^@/,""),d=this._remoteTargets.get(i);d||(d=(this._remoteFactory??(m=>n.loadYaml(m)))(i),this._remoteTargets.set(i,d),d.catch(()=>this._remoteTargets.delete(i)));let l=await d,c=l.getAgent("@"+a),f=Array.isArray(c?.provider)?c?.provider[0]:c?.provider;if(f?.startsWith("remote/"))throw new Error(`Chained remotes not allowed: "${o}" \u2192 "${f}"`);return {target:l,agentRef:"@"+a}}static async loadBuiltInConfig(e){let{yamlPath:t,dir:r}=Kr(),o;try{o=ls.readFileSync(t,"utf-8");}catch(i){throw new Error(`[@crewx/sdk] Cannot read built-in config: ${t}
|
|
308
|
-
${i.message}`)}let s=cr(o);if(s.documents&&typeof s.documents=="object"){let i={};for(let[a,d]of Object.entries(s.documents))if(d&&typeof d=="object"){let l=d;typeof l.path=="string"&&!K.isAbsolute(l.path)?i[a]={...l,path:K.resolve(r,l.path)}:i[a]=l;}else i[a]=d;return {...s,documents:i}}return s}static mergeCrewxConfig(e,t){let r=new Map;for(let v of e.agents??[])r.set(v.id,v);for(let v of t.agents??[])r.has(v.id)&&console.warn(`[agent-loader] User agent "${v.id}" overrides built-in`),r.set(v.id,v);let o=Array.from(r.values()),s={...e.layouts??{},...t.layouts??{}},i={...e.documents??{},...t.documents??{}},a=e,d=t,l=Os(a.vars,d.vars),c=Os(a.settings,d.settings),f;e.skills&&t.skills&&typeof e.skills=="object"&&typeof t.skills=="object"&&!Array.isArray(e.skills)&&!Array.isArray(t.skills)?f={...e.skills,...t.skills}:f=t.skills??e.skills;let g=[...e.hooks??[],...t.hooks??[]],m=Tl(a.providers,d.providers),w={...e},_={...t};for(let v of ["agents","layouts","documents","skills","hooks","vars","settings","providers"])delete w[v],delete _[v];let y={...{...w,..._},agents:o,layouts:s,documents:i,skills:f};return g.length>0&&(y.hooks=g),l!==void 0&&(y.vars=l),c!==void 0&&(y.settings=c),m!==void 0&&(y.providers=m),y}static async loadYaml(e,t,r){let o=t?.includeBuiltIns!==false,s,i;if(o){let c=await n.loadBuiltInConfig(r);if(e!==void 0){let f=ur(e);s=n.mergeCrewxConfig(c,f),i=K.dirname(e);}else s=c,i=process.cwd();}else {if(e===void 0)throw new Error("[@crewx/sdk] loadYaml: path is required when includeBuiltIns is false");s=ur(e),i=K.dirname(e);}let a=new ot(r);await a.load(s.documents,i);let d=s.agents??[];return await Ms(d,s,t),new n(d,t??{},s,a,i)}static async fromConfig(e,t,r,o){let s=t?.includeBuiltIns===true,i=e;if(s){let c=await n.loadBuiltInConfig(o);i=n.mergeCrewxConfig(c,e);}let a=new ot(o);await a.load(i.documents,r??(typeof process<"u"?process.cwd():"/"));let d=i.agents??[];return await Ms(d,i,t),new n(d,t??{},i,a,r)}get agents(){return this._agents}get config(){return this._config}get plugins(){return this._plugins}get tools(){return this._tools}get workspaceId(){return this._workspaceId}get workspaceName(){return this._workspaceName}getAgent(e){let t=e.startsWith("@")?e.slice(1):e;return this._agents.get(t)}getRemoteProviderConfig(e){let t=this._config?.providers;return Array.isArray(t)?t.find(o=>o.type==="remote"&&o.id===e):void 0}computeTaskLogPath(e,t){let r=_n(t);return K.join(this._projectRoot,".crewx","logs",`${r}_${e}.log`)}registerTool(e,t){this._tools.set(e,{name:e,...t});}async use(e){this._plugins.includes(e)||(await e.attach(this),this._plugins.push(e));}handler(e){return On(this,e)}async registerChannelAdapter(e){let{adapter:t,instanceId:r,config:o}=e;if(this._activeAdapters.has(r))throw new Error(`Adapter instance already registered: ${r}`);let s=new Set(t.manifest.capabilities),i=e.store??vn(r),a=e.defaultMode??"query",d=t.manifest.platform,l=e.agentRunner??{run:async(m,w,_)=>{let y=await(a==="execute"?this.execute.bind(this):this.query.bind(this))(`@${m}`,w,{threadId:_?.threadId,platform:d});return {output:y.ok?y.data:y.error?.message??""}}},c=e.onInbound??(async m=>{let w=m.routingHints?.agentId??e.defaultAgent;if(!w)return {accepted:false,reason:"no_agent"};let{output:_}=await l.run(w,m.text,{threadId:m.threadId});return {accepted:true,output:_}}),f=xn({instanceId:r,config:o,capabilities:s,db:i,agentRunner:l,onInbound:c}),g={adapter:t,ctx:f,state:"starting"};this._activeAdapters.set(r,g),this.emit("adapter:lifecycle",{adapterId:t.manifest.id,instanceId:r,state:"starting",timestamp:new Date});try{await t.start(f),g.state="started",this.emit("adapter:lifecycle",{adapterId:t.manifest.id,instanceId:r,state:"started",timestamp:new Date});}catch(m){throw g.state="failed",this.emit("adapter:lifecycle",{adapterId:t.manifest.id,instanceId:r,state:"failed",error:m instanceof Error?m:new Error(String(m)),timestamp:new Date}),this._activeAdapters.delete(r),m}}async unregisterChannelAdapter(e){let t=this._activeAdapters.get(e);if(t){t.state="stopping",this.emit("adapter:lifecycle",{adapterId:t.adapter.manifest.id,instanceId:e,state:"stopping",timestamp:new Date});try{await t.adapter.stop(t.ctx),t.state="stopped",this.emit("adapter:lifecycle",{adapterId:t.adapter.manifest.id,instanceId:e,state:"stopped",timestamp:new Date});}catch(r){t.state="failed",this.emit("adapter:lifecycle",{adapterId:t.adapter.manifest.id,instanceId:e,state:"failed",error:r instanceof Error?r:new Error(String(r)),timestamp:new Date});}finally{this._activeAdapters.delete(e);}}}async stopAllAdapters(e={}){let t=e.timeoutMs??1e4,r=Array.from(this._activeAdapters.keys()),o=await Promise.allSettled(r.map(s=>Promise.race([this.unregisterChannelAdapter(s),new Promise((i,a)=>setTimeout(()=>a(new Error(`Adapter stop timeout: ${s}`)),t))])));for(let s=0;s<o.length;s++)o[s].status==="rejected"&&console.error(`[crewx] adapter stop error (${r[s]}): ${o[s].reason}`);}abortAll(){for(let[e,t]of this._activeTasks)if(t.pid!==void 0)try{process.platform==="win32"?process.kill(t.pid,"SIGTERM"):process.kill(-t.pid,"SIGTERM");}catch(r){console.error(`[crewx] abort task ${e} (pid=${t.pid}) error: ${r instanceof Error?r.message:String(r)}`);}}async _drainActiveTasks(e){let t=Array.from(this._activeTasks.values()).map(r=>r.done);t.length!==0&&await Promise.race([Promise.allSettled(t),new Promise(r=>setTimeout(r,e).unref())]);}async close(){this.abortAll(),await this._drainActiveTasks(Ut+1e3),await this.stopAllAdapters({timeoutMs:1e4});let e=[...this._remoteTargets.values()];this._remoteTargets.clear(),await Promise.allSettled(e.map(async r=>{try{await(await r).close();}catch(o){console.error(`[crewx] remote target close error: ${o instanceof Error?o.message:String(o)}`);}}));let t=[...this._plugins].reverse();for(let r of t)try{await r.detach(this);}catch(o){console.error(`[crewx] plugin ${r.name} detach error: ${o instanceof Error?o.message:String(o)}`);}this._plugins.length=0;}filterAgents(e){let t=a=>a?a.split(",").map(d=>d.trim().toLowerCase()).filter(Boolean):void 0,r=t(e.role),o=t(e.team),s=t(e.provider),i=Array.from(this._agents.values());return r&&(i=i.filter(a=>a.role&&r.some(d=>we(a.role.toLowerCase(),d)))),o&&(i=i.filter(a=>a.team&&o.some(d=>we(a.team.toLowerCase(),d)))),s&&(i=i.filter(a=>(Array.isArray(a.provider)?a.provider:[a.provider]).some(l=>s.some(c=>we(l.toLowerCase(),c))))),i}renderAgentPrompt(e){let t=e.startsWith("@")?e.slice(1):e,r=this._agents.get(t);if(!r)throw new be(t,Array.from(this._agents.keys()));return r.inline?.prompt??r.inline?.system_prompt??r.description??`You are an expert ${t}.`}async renderPrompt(e,t){let o={...await this._documentLoader.buildContext(),...t?.documents??{}},s={...t,documents:o};return this._templateEngine.render(e,s)}registerLayout(e,t){this._layoutLoader.registerLayout(e,t);}async renderAgentPromptFull(e,t){let r=e.startsWith("@")?e.slice(1):e,o=this._agents.get(r);if(!o)throw new be(r,Array.from(this._agents.keys()));let s=this._resolveLayoutSpec(o,t?.layout),i=this._extractLayoutId(s),a=this._extractLayoutProps(o,s,t?.layout),d=this._layoutLoader.load(i,a),l=o.inline?.prompt??o.inline?.system_prompt??o.description??`You are an expert ${r}.`,c=await this._documentLoader.buildContext(),f=t?.env??(typeof process<"u"?process.env:{}),g=t?.vars?.security_key??bl(),m={...t?.vars??{},documents:c,env:f,agent:{id:o.id,name:o.name??o.id,role:o.role??"",team:o.team??"",description:o.description??""}},w=await this._templateEngine.render(l,m),_={mode:t?.session?.mode??"query",platform:t?.session?.platform??"cli",options:t?.session?.options??[]},k=o.provider,y=Array.isArray(k)?k:typeof k=="string"&&k.length>0?[k]:[],v=y.join(", ")||(typeof k=="string"?k:""),A=o.options,T=["goals","daily"],b={goals:false,daily:false},V;if(!Array.isArray(A)&&typeof A=="object"&&A!==null){let W=A;if("goals"in W){let O=W.goals;typeof O=="string"||Array.isArray(O)?b.goals=O:b.goals=!!O;}"daily"in W&&(b.daily=!!W.daily);let x={};for(let[O,j]of Object.entries(W))T.includes(O)||(x[O]=j);if(Object.keys(x).length>0){let O=y.some(C=>C.startsWith("cli/")),j={};for(let[C,z]of Object.entries(x)){let le={};if(Array.isArray(z))O&&(le.rawArgs=z);else if(typeof z=="object"&&z!==null){let ft=z;Object.keys(ft).length>0&&(le.named=ft);}(le.named||le.rawArgs&&le.rawArgs.length>0)&&(j[C]=le);}V=Object.keys(j).length>0?j:void 0;}}let $=Array.isArray(A)?A:void 0,I={};for(let[W,x]of Object.entries(c))I[W]={content:x.content??"",toc:x.toc,summary:x.summary,path:x.path};if(b.goals){let W=K.join(this._projectRoot,"docs","goal"),x=await Vo(W,void 0,b.goals);x&&(I.active_goals={content:x});}if(b.daily){let W=K.join(this._projectRoot,"docs","daily"),x=await Jo(W);x&&(I.today_daily={content:x});}let N=t?.vars?.user_input??void 0,D=this._config?.settings?.dreaming?.continuity,Z=D?.reuseReadOnly!==false,U=typeof D?.lookback=="number"?D.lookback:5,ne=typeof D?.maxEntryChars=="number"?D.maxEntryChars:8e3,B=typeof D?.decayRate=="number"?D.decayRate:.5,F=t?.threadId??"",Q=o.id,J=Z&&U>0&&F&&t?.messages&&t.messages.length>0?cs({threadId:F,agentId:Q,lookback:U,maxEntryChars:ne,decayRate:B}):new Map,q=(t?.messages??[]).map(W=>{if(!W.isAssistant)return W;let x=W.metadata?.task_id;return !x||!J.has(x)?W:{...W,activity_log:J.get(x)}}),Ke={user_input:N,agent:{id:o.id,name:o.name??o.id,role:o.role??"",team:o.team??"",description:o.description??"",provider:v,providerList:y,model:o.inline?.model,workingDirectory:o.working_directory??o.workingDirectory??".",inline:{...o.inline??{},prompt:w},specialties:o.specialties??[],capabilities:o.capabilities??[],remote:o.remote??null,optionsByMode:V,optionsArray:$},agentMetadata:{specialties:o.specialties??[],capabilities:o.capabilities??[],description:o.description??""},contextOptions:b,documents:I,skills:t?.skills??[],session:_,env:f,vars:{security_key:g,...t?.vars??{}},props:{...a??{},...t?.messages&&t.messages.length>0?{showConversationHistory:true}:{}},platform:_.platform,mode:_.mode,thread_id:F,now:qt(new Date),has_activity_log:J.size>0,messages:q,tools:this._tools.size>0?{list:Array.from(this._tools.values()).map(W=>({name:W.name,description:W.description,parameters:W.parameters})),json:JSON.stringify(Array.from(this._tools.values()).map(W=>({name:W.name,description:W.description,parameters:W.parameters})),null,2),count:this._tools.size}:null,metadata:{}};return this._layoutRenderer.render(d,Ke)}_filterToolsByMode(e){return e?e.map(t=>this._tools.get(t)).filter(t=>t!==void 0):Array.from(this._tools.values())}_resolveLayoutSpec(e,t){if(t!==void 0)return t;let r=e.inline?.layout;if(r!==void 0)return r;let o=this._config?.layouts?.default;return typeof o=="string"&&o?o:"crewx/default"}_extractLayoutId(e){if(typeof e=="string")return e;if("id"in e)return e.id;if("template"in e&&typeof e.template=="string"&&e.template.trim()){let t=`crewx/__inline_${Date.now()}`;return this._layoutLoader.registerLayout(t,e.template),t}return "crewx/default"}_extractLayoutProps(e,t,r){let o=e.inline?.layout,s=o&&typeof o=="object"&&"props"in o?o.props:void 0,i=r&&typeof r=="object"&&"id"in r?r.props:void 0;if(s||i)return {...s??{},...i??{}}}_getConversationProvider(){return this._plugins.find(t=>t.name==="conversation")?.conversationProvider}async _fetchHistoryMessages(e,t,r){if(r&&r.length>0)return r;if(!e)return;let o=this._getConversationProvider();if(o)try{let s=await o.fetchHistory(e,{currentTraceId:t});return s.messages.length===0?void 0:Cn(s)}catch{return}}_resolveTimeout(e,t){let r=e==="query"?"CREWX_TIMEOUT_QUERY":"CREWX_TIMEOUT_EXECUTE";if(process.env[r]!=null&&process.env[r]!==""){let o=So();return e==="query"?o.queryMs:o.executeMs}if(t?.meta?.defaultTimeoutMs){let o=e==="query"?t.meta.defaultTimeoutMs.query:t.meta.defaultTimeoutMs.execute;if(o!==void 0)return o}return 8*36e5}_resolveIdleTimeout(e){let t=ln();return t!==void 0?t:e?.meta?.defaultIdleMs!==void 0?e.meta.defaultIdleMs:6e5}_lookupCliAdapter(e){return An(e)}_resolveEffectiveCost(e,t,r){return Lo(e?.costUsd,e?.inputTokens,e?.outputTokens,e?.cachedInputTokens,t)}_resolveEffectiveCwd(e,t){return t?.cwd??(e.working_directory?K.resolve(this._projectRoot,e.working_directory):this._projectRoot)}_buildFileRemoteOptions(e,t){let r={path:this._projectRoot,id:this._workspaceId,name:this._workspaceName,agentRef:e};return {...t,cwd:void 0,callerIdentity:r,metadata:{...t?.metadata??{},crewx:{...t?.metadata?.crewx??{},callerWorkspace:r}},vars:{...t?.vars??{},crewx_caller_workspace_path:r.path,crewx_caller_workspace_id:r.id,crewx_caller_workspace_name:r.name}}}_registerCallerIdentityOverride(e,t,r){let o=Symbol("callerIdentityOverride");return this._callerIdentityOverrides.set(e,{token:o,callerIdentity:t,targetIdentity:r}),o}_clearCallerIdentityOverride(e,t){if(!t)return;let r=this._callerIdentityOverrides.get(e);r&&r.token===t&&this._callerIdentityOverrides.delete(e);}_rewriteCallerFacingPayload(e,t,r){let{callerIdentity:o,targetIdentity:s}=r,i={...t,agentRef:o.agentRef};if(e==="task:output")return i;let a=i,d=a.metadata??{},l=d.crewx??{};return {...a,workspaceId:o.id,workspaceName:o.name,metadata:{...d,crewx:{...l,remoteExecution:s}}}}emit(e,t){if(e==="task:start"||e==="task:end"||e==="task:output"){let r=t.traceId,o=this._callerIdentityOverrides.get(r);if(o){let s=this._rewriteCallerFacingPayload(e,t,o);super.emit(e,s);return}}super.emit(e,t);}emitToolEvents(e,t,r,o,s,i,a){try{let l=this._lookupCliAdapter(r)?.parseEvent?.(o)??$t(new Date().toISOString(),o);for(let c of l)c.type==="tool_use"&&c.toolName&&this.emit("tool:observed:before",{traceId:e,timestamp:new Date,agentRef:t,agentId:s,threadId:i,sessionId:a,provider:r,tool:{name:c.toolName,rawName:c.toolName,input:c.toolInput?this.tryParseJson(c.toolInput):void 0,toolUseId:c.toolUseId}}),c.type==="tool_result"&&this.emit("tool:observed:after",{traceId:e,timestamp:new Date,agentRef:t,agentId:s,threadId:i,sessionId:a,provider:r,tool:{name:c.toolName??"unknown",rawName:c.toolName??"unknown",toolUseId:c.toolUseId,result:c.resultPreview,isError:c.isError}});}catch{}}emitTaskLogEntries(e,t,r,o,s,i,a){try{for(let d of a)d.type==="tool_use"&&d.toolName&&this.emit("tool:observed:before",{traceId:e,timestamp:new Date,agentRef:t,agentId:r,threadId:o,sessionId:s,provider:i,tool:{name:d.toolName,rawName:d.toolName,input:d.toolInput?this.tryParseJson(d.toolInput):void 0,toolUseId:d.toolUseId}}),d.type==="tool_result"&&this.emit("tool:observed:after",{traceId:e,timestamp:new Date,agentRef:t,agentId:r,threadId:o,sessionId:s,provider:i,tool:{name:d.toolName??"unknown",rawName:d.toolName??"unknown",toolUseId:d.toolUseId,result:d.resultPreview,isError:d.isError}});}catch{}}tryParseJson(e){try{return JSON.parse(e)}catch{return e}}async query(e,t,r){let o=await this.resolveFileRemoteTarget(e);if(o){let c=await o.target.query(o.agentRef,t,this._buildFileRemoteOptions(e,r));return {...c,meta:{...c.meta,agentId:e.replace(/^@/,"")}}}let s=Vt.getStore()??Rn(r?.trace),i=r?.taskId??it("tsk"),a={parentTaskId:s?.parentTaskId??null,rootTraceId:s?.rootTraceId??i,callerAgentId:s?.callerAgentId??null},d={parentTaskId:i,rootTraceId:s?.rootTraceId??i,callerAgentId:null},l=r?.callerIdentity?this._registerCallerIdentityOverride(i,r.callerIdentity,{agentId:e.replace(/^@/,""),workspaceId:this._workspaceId,workspaceName:this._workspaceName}):void 0;try{return await Vt.run(d,async()=>{let c=Date.now(),f=new Date,g;try{g=pr(e,Array.from(this._agents.values()));}catch(x){if(x instanceof be){this.emit("task:start",{traceId:i,timestamp:f,agentRef:e,message:t,mode:"query",parentTaskId:a.parentTaskId,rootTraceId:a.rootTraceId,callerAgentId:a.callerAgentId,metadata:{...r?.metadata??{}},threadId:r?.threadId,platform:r?.platform??"cli",workspaceId:this._workspaceId,workspaceName:this._workspaceName});let O=Date.now()-c,j={code:"AGENT_NOT_FOUND",message:x.message};return this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"query",durationMs:O,error:j,metadata:r?.metadata?{...r.metadata}:void 0}),this._clearCallerIdentityOverride(i,l),{ok:!1,data:"",error:j,meta:{agentId:e.replace(/^@/,""),provider:"",durationMs:O,taskId:i}}}throw x}d.callerAgentId=g.id;let m=En(g.provider),w=Ar(g.options,"query",m,xr(r?.overdrive)),_=Er(g.options,"query"),k=w.active&&w.provider?w.provider:r?.provider??_.provider??m,y=w.active&&w.model?w.model:r?.model??_.model??g.inline?.model;y&&y.includes("{{")&&(y=await this._templateEngine.render(y,{...r?.vars??{}}));let v=k!==m?void 0:r?.resumeSessionId,A;try{A=Se(k,this._additionalArgsProvider);}catch(x){this.emit("task:start",{traceId:i,timestamp:f,agentRef:e,message:t,mode:"query",parentTaskId:a.parentTaskId,rootTraceId:a.rootTraceId,callerAgentId:a.callerAgentId,metadata:{...r?.metadata??{}},threadId:r?.threadId,platform:r?.platform??"cli",workspaceId:this._workspaceId,workspaceName:this._workspaceName});let O=Date.now()-c,j={code:"PROVIDER_ERROR",message:x.message};return this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"query",durationMs:O,error:j,metadata:r?.metadata?{...r.metadata}:void 0}),this._clearCallerIdentityOverride(i,l),{ok:!1,data:"",error:j,meta:{agentId:g.id,provider:k,model:y,durationMs:O,taskId:i}}}let T=await this._fetchHistoryMessages(r?.threadId,i,r?.messages),b;try{b=await this.renderAgentPromptFull(e,{session:{mode:"query",platform:r?.platform},vars:{user_input:t,...r?.vars??{},crewx_workspace_path:this._resolveEffectiveCwd(g,r)},messages:T,threadId:r?.threadId});}catch(x){console.error(`[crewx] renderAgentPromptFull failed for ${e}: ${x instanceof Error?x.message:String(x)}`);}let V,$,I,N=y,de=!1,Y=x=>{de||(de=!0,this.emit("task:start",{traceId:i,timestamp:f,agentRef:e,message:t,mode:"query",pid:x,parentTaskId:a.parentTaskId,rootTraceId:a.rootTraceId,callerAgentId:a.callerAgentId,model:N,provider:k,codingAgentCommand:V,renderedPrompt:b,metadata:{...r?.metadata??{},provider:k,...w.active?{overdrive:!0}:{}},threadId:r?.threadId,platform:r?.platform??"cli",workspaceId:this._workspaceId,workspaceName:this._workspaceName}));},D=g.options,Z=w.active?w.mode:D?.query?.mode,U=w.active?w.effort:D?.query?.effort,ne=Array.isArray(D?.query?.tools)?D.query.tools:void 0,B=this._tools.size>0?this._filterToolsByMode(ne):[],F=(()=>{let x=D?.query;if(!x||Array.isArray(x))return;let{tools:O,effort:j,mode:C,provider:z,model:le,profiles:ft,...Br}=x,St=Object.entries(Br).filter(([,Ce])=>Ce!=null);if(St.length!==0)return Object.fromEntries(St.map(([Ce,qr])=>[Ce,String(qr)]))})(),Q=g.inline?.max_steps;k.startsWith("api/")&&Y();let J=!1,q=0,Ke=()=>{},W=new Promise(x=>{Ke=x;});this._activeTasks.set(i,{pid:void 0,done:W});try{let x=await A.query(t,{model:y,effort:U,mode:Z,context:r?.context,systemPrompt:b??g.inline?.system_prompt??g.inline?.prompt??g.description??`You are ${g.id}.`,additionalArgs:Array.isArray(D?.query)?D.query:void 0,resumeSessionId:v,tools:B.length>0?B:void 0,maxSteps:Q,configOptions:F,timeoutMs:this._resolveTimeout("query",this._lookupCliAdapter(k)),idleMs:this._resolveIdleTimeout(this._lookupCliAdapter(k)),cwd:this._resolveEffectiveCwd(g,r),env:{CREWX_AGENT_ID:g.id,CREWX_AGENT_ROLE:g.role??"",CREWX_AGENT_TEAM:g.team??"",CREWX_USER_ID:process.env.USER||process.env.USERNAME||"unknown",CREWX_TRACE_ID:i,CREWX_PARENT_TASK_ID:i,CREWX_TASK_ID:i,CREWX_CALLER_AGENT_ID:process.env.CREWX_AGENT_ID??"",CREWX_THREAD_ID:r?.threadId??"",CREWX_PROVIDER:k,CREWX_SESSION_ID:"",CREWX_TASK_LOG_PATH:this.computeTaskLogPath(i,f)},onPid:C=>{let z=this._activeTasks.get(i);z&&(z.pid=C),Y(C);},onOutput:(C,z)=>{let le=this._lookupCliAdapter(k);z==="stdout"&&le?.suppressOutputLine?.(C)===!0||this.emit("task:output",{traceId:i,timestamp:new Date,agentRef:e,output:C,level:z}),z==="stdout"&&this.emitToolEvents(i,e,k,C,g.id,r?.threadId??"","");},onTaskLog:C=>{this.emitTaskLogEntries(i,e,g.id,r?.threadId??"","",k,C);for(let z of C)this.emit("task:output",{traceId:i,timestamp:new Date,agentRef:e,output:JSON.stringify(z),level:"info"});},onCommand:C=>{V=C;},onUsage:C=>{$=C;},onExitCode:C=>{I=C;},onModel:C=>{N||(N=C);}});q=this._resolveEffectiveCost($,N,c),Y();let O=Date.now()-c,j={...r?.metadata??{},...r?.threadId?{threadId:r.threadId}:{}};return this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"query",result:x,durationMs:O,exitCode:I,inputTokens:$?.inputTokens,outputTokens:$?.outputTokens,cachedInputTokens:$?.cachedInputTokens,costUsd:q,model:N,metadata:Object.keys(j).length>0?j:void 0}),J=!0,{ok:!0,data:x,meta:{agentId:g.id,provider:k,model:y,durationMs:O,taskId:i}}}catch(x){if(x instanceof exports.ClientToolCallRequiredError){let C=it("thd");return this._pendingThreads.set(C,{agentRef:g.id,providerStr:k,continuationState:x.continuationState,toolCall:x.toolCall,traceId:i,startMs:c,model:y}),J=!0,{ok:!0,status:"requires_action",data:"",toolCall:x.toolCall,threadId:C,meta:{agentId:g.id,provider:k,model:y,durationMs:Date.now()-c,taskId:i}}}q=this._resolveEffectiveCost($,N,c),Y();let O=Date.now()-c,j={code:"QUERY_FAILED",message:x.message};return this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"query",durationMs:O,error:j,exitCode:I,inputTokens:$?.inputTokens,outputTokens:$?.outputTokens,cachedInputTokens:$?.cachedInputTokens,costUsd:q,model:N,metadata:r?.metadata?{...r.metadata}:void 0}),J=!0,{ok:!1,data:"",error:j,meta:{agentId:g.id,provider:k,model:y,durationMs:O,taskId:i}}}finally{J||this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"query",durationMs:Date.now()-c,error:{code:"TASK_END_GUARD",message:"task:end was not emitted normally"},exitCode:I??-1,inputTokens:$?.inputTokens,outputTokens:$?.outputTokens,cachedInputTokens:$?.cachedInputTokens,costUsd:q,model:N}),this._activeTasks.delete(i),this._clearCallerIdentityOverride(i,l),Ke();}})}finally{this._clearCallerIdentityOverride(i,l);}}async continueQuery(e,t){let r=this._pendingThreads.get(e);if(!r)return {ok:false,data:"",error:{code:"THREAD_NOT_FOUND",message:`No pending thread: ${e}`},meta:{agentId:"",provider:"",durationMs:0}};this._pendingThreads.delete(e);let o=Se(r.providerStr,this._additionalArgsProvider);if(!o.continueWithToolResults)return {ok:false,data:"",error:{code:"UNSUPPORTED",message:"Provider does not support client tool continuation"},meta:{agentId:r.agentRef,provider:r.providerStr,durationMs:0}};let s=t.map(i=>({...i,toolName:r.toolCall.toolCallId===i.toolCallId?r.toolCall.toolName:i.toolCallId}));try{let i=await o.continueWithToolResults(r.continuationState,s),a=Date.now()-r.startMs;return this.emit("task:end",{traceId:r.traceId,timestamp:new Date,agentRef:r.agentRef,mode:"query",result:i,durationMs:a}),{ok:!0,status:"complete",data:i,meta:{agentId:r.agentRef,provider:r.providerStr,model:r.model,durationMs:a}}}catch(i){if(i instanceof exports.ClientToolCallRequiredError)return this._pendingThreads.set(e,{...r,continuationState:i.continuationState,toolCall:i.toolCall}),{ok:true,status:"requires_action",data:"",toolCall:i.toolCall,threadId:e,meta:{agentId:r.agentRef,provider:r.providerStr,model:r.model,durationMs:Date.now()-r.startMs}};let a=Date.now()-r.startMs;return {ok:false,data:"",error:{code:"CONTINUE_FAILED",message:i.message},meta:{agentId:r.agentRef,provider:r.providerStr,model:r.model,durationMs:a}}}}async execute(e,t,r){let o=await this.resolveFileRemoteTarget(e);if(o){let c=await o.target.execute(o.agentRef,t,this._buildFileRemoteOptions(e,r));return {...c,meta:{...c.meta,agentId:e.replace(/^@/,"")}}}let s=Vt.getStore()??Rn(r?.trace),i=r?.taskId??it("tsk"),a={parentTaskId:s?.parentTaskId??null,rootTraceId:s?.rootTraceId??i,callerAgentId:s?.callerAgentId??null},d={parentTaskId:i,rootTraceId:s?.rootTraceId??i,callerAgentId:null},l=r?.callerIdentity?this._registerCallerIdentityOverride(i,r.callerIdentity,{agentId:e.replace(/^@/,""),workspaceId:this._workspaceId,workspaceName:this._workspaceName}):void 0;try{return await Vt.run(d,async()=>{let c=Date.now(),f=new Date,g;try{g=pr(e,Array.from(this._agents.values()));}catch(x){if(x instanceof be){this.emit("task:start",{traceId:i,timestamp:f,agentRef:e,message:t,mode:"execute",parentTaskId:a.parentTaskId,rootTraceId:a.rootTraceId,callerAgentId:a.callerAgentId,metadata:{...r?.metadata??{}},threadId:r?.threadId,platform:r?.platform??"cli",workspaceId:this._workspaceId,workspaceName:this._workspaceName});let O=Date.now()-c,j={code:"AGENT_NOT_FOUND",message:x.message};return this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"execute",durationMs:O,error:j,metadata:r?.metadata?{...r.metadata}:void 0}),this._clearCallerIdentityOverride(i,l),{ok:!1,data:"",error:j,meta:{agentId:e.replace(/^@/,""),provider:"",durationMs:O,taskId:i}}}throw x}d.callerAgentId=g.id;let m=En(g.provider),w=Ar(g.options,"execute",m,xr(r?.overdrive)),_=Er(g.options,"execute"),k=w.active&&w.provider?w.provider:r?.provider??_.provider??m,y=w.active&&w.model?w.model:r?.model??_.model??g.inline?.model;y&&y.includes("{{")&&(y=await this._templateEngine.render(y,{...r?.vars??{}}));let v=k!==m?void 0:r?.resumeSessionId,A;try{A=Se(k,this._additionalArgsProvider);}catch(x){this.emit("task:start",{traceId:i,timestamp:f,agentRef:e,message:t,mode:"execute",parentTaskId:a.parentTaskId,rootTraceId:a.rootTraceId,callerAgentId:a.callerAgentId,metadata:{...r?.metadata??{}},threadId:r?.threadId,platform:r?.platform??"cli",workspaceId:this._workspaceId,workspaceName:this._workspaceName});let O=Date.now()-c,j={code:"PROVIDER_ERROR",message:x.message};return this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"execute",durationMs:O,error:j,metadata:r?.metadata?{...r.metadata}:void 0}),this._clearCallerIdentityOverride(i,l),{ok:!1,data:"",error:j,meta:{agentId:g.id,provider:k,model:y,durationMs:O,taskId:i}}}let T=await this._fetchHistoryMessages(r?.threadId,i,r?.messages),b;try{b=await this.renderAgentPromptFull(e,{session:{mode:"execute",platform:r?.platform},vars:{user_input:t,...r?.vars??{},crewx_workspace_path:this._resolveEffectiveCwd(g,r)},messages:T,threadId:r?.threadId});}catch(x){console.error(`[crewx] renderAgentPromptFull failed for ${e}: ${x instanceof Error?x.message:String(x)}`);}let V,$,I,N=y,de=!1,Y=x=>{de||(de=!0,this.emit("task:start",{traceId:i,timestamp:f,agentRef:e,message:t,mode:"execute",pid:x,parentTaskId:a.parentTaskId,rootTraceId:a.rootTraceId,callerAgentId:a.callerAgentId,model:N,provider:k,codingAgentCommand:V,renderedPrompt:b,metadata:{...r?.metadata??{},provider:k,...w.active?{overdrive:!0}:{}},threadId:r?.threadId,platform:r?.platform??"cli",workspaceId:this._workspaceId,workspaceName:this._workspaceName}));},D=g.options,Z=w.active?w.mode:D?.execute?.mode,U=w.active?w.effort:D?.execute?.effort,ne=Array.isArray(D?.execute?.tools)?D.execute.tools:void 0,B=this._tools.size>0?this._filterToolsByMode(ne):[],F=(()=>{let x=D?.execute;if(!x||Array.isArray(x))return;let{tools:O,effort:j,mode:C,provider:z,model:le,profiles:ft,...Br}=x,St=Object.entries(Br).filter(([,Ce])=>Ce!=null);if(St.length!==0)return Object.fromEntries(St.map(([Ce,qr])=>[Ce,String(qr)]))})(),Q=g.inline?.max_steps;k.startsWith("api/")&&Y();let J=!1,q=0,Ke=()=>{},W=new Promise(x=>{Ke=x;});this._activeTasks.set(i,{pid:void 0,done:W});try{let x=await A.execute(t,{model:y,effort:U,mode:Z,context:r?.context,systemPrompt:b??g.inline?.system_prompt??g.inline?.prompt??g.description??`You are ${g.id}.`,additionalArgs:Array.isArray(D?.execute)?D.execute:void 0,resumeSessionId:v,tools:B.length>0?B:void 0,maxSteps:Q,configOptions:F,timeoutMs:this._resolveTimeout("execute",this._lookupCliAdapter(k)),idleMs:this._resolveIdleTimeout(this._lookupCliAdapter(k)),cwd:this._resolveEffectiveCwd(g,r),env:{CREWX_AGENT_ID:g.id,CREWX_AGENT_ROLE:g.role??"",CREWX_AGENT_TEAM:g.team??"",CREWX_USER_ID:process.env.USER||process.env.USERNAME||"unknown",CREWX_TRACE_ID:i,CREWX_PARENT_TASK_ID:i,CREWX_TASK_ID:i,CREWX_CALLER_AGENT_ID:process.env.CREWX_AGENT_ID??"",CREWX_THREAD_ID:r?.threadId??"",CREWX_PROVIDER:k,CREWX_SESSION_ID:"",CREWX_TASK_LOG_PATH:this.computeTaskLogPath(i,f)},onPid:C=>{let z=this._activeTasks.get(i);z&&(z.pid=C),Y(C);},onOutput:(C,z)=>{let le=this._lookupCliAdapter(k);z==="stdout"&&le?.suppressOutputLine?.(C)===!0||this.emit("task:output",{traceId:i,timestamp:new Date,agentRef:e,output:C,level:z}),z==="stdout"&&this.emitToolEvents(i,e,k,C,g.id,r?.threadId??"","");},onTaskLog:C=>{this.emitTaskLogEntries(i,e,g.id,r?.threadId??"","",k,C);for(let z of C)this.emit("task:output",{traceId:i,timestamp:new Date,agentRef:e,output:JSON.stringify(z),level:"info"});},onCommand:C=>{V=C;},onUsage:C=>{$=C;},onExitCode:C=>{I=C;},onModel:C=>{N||(N=C);}});q=this._resolveEffectiveCost($,N,c),Y();let O=Date.now()-c,j={...r?.metadata??{},...r?.threadId?{threadId:r.threadId}:{}};return this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"execute",result:x,durationMs:O,exitCode:I,inputTokens:$?.inputTokens,outputTokens:$?.outputTokens,cachedInputTokens:$?.cachedInputTokens,costUsd:q,model:N,metadata:Object.keys(j).length>0?j:void 0}),J=!0,{ok:!0,data:x,meta:{agentId:g.id,provider:k,model:y,durationMs:O,taskId:i}}}catch(x){q=this._resolveEffectiveCost($,N,c),Y();let O=Date.now()-c,j={code:"EXECUTE_FAILED",message:x.message};return this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"execute",durationMs:O,error:j,exitCode:I,inputTokens:$?.inputTokens,outputTokens:$?.outputTokens,cachedInputTokens:$?.cachedInputTokens,costUsd:q,model:N,metadata:r?.metadata?{...r.metadata}:void 0}),J=!0,{ok:!1,data:"",error:j,meta:{agentId:g.id,provider:k,model:y,durationMs:O,taskId:i}}}finally{J||this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"execute",durationMs:Date.now()-c,error:{code:"TASK_END_GUARD",message:"task:end was not emitted normally"},exitCode:I??-1,inputTokens:$?.inputTokens,outputTokens:$?.outputTokens,cachedInputTokens:$?.cachedInputTokens,costUsd:q,model:N}),this._activeTasks.delete(i),this._clearCallerIdentityOverride(i,l),Ke();}})}finally{this._clearCallerIdentityOverride(i,l);}}};function Os(n,e){let t=Xn(n)?n:void 0,r=Xn(e)?e:void 0;if(!(!t&&!r))return {...t??{},...r??{}}}function Xn(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function Tl(n,e){let t=Array.isArray(n)?n:void 0,r=Array.isArray(e)?e:void 0;if(!t&&!r)return;let o=a=>{if(!Xn(a))return;let d=a.id;if(typeof d=="string")return `id:${d}`;let l=a.name;if(typeof l=="string")return `name:${l}`},s=new Set;for(let a of r??[]){let d=o(a);d&&s.add(d);}let i=[];for(let a of t??[]){let d=o(a);d&&s.has(d)||i.push(a);}for(let a of r??[])i.push(a);return i}function Pl(n){let e=Array.isArray(n.provider)?n.provider:[n.provider],t=n.options,r=[...e];for(let o of ["query","execute"]){let s=Er(t,o);s.provider&&r.push(s.provider);let i=t&&typeof t=="object"&&!Array.isArray(t)?t[o]:void 0,a=i&&typeof i=="object"&&!Array.isArray(i)?kr(i.overdrive):void 0;a?.provider&&r.push(a.provider);}return r}async function Ms(n,e,t){let r=n.flatMap(Pl);if(r.some(s=>s.startsWith("api/"))){let{registerApiProviders:s}=await Promise.resolve().then(()=>(Dn(),_s));s(t?.api);}await Il(r,e),Ol(r,e),Sl(r);}function Sl(n){if(!n.some(r=>r.startsWith("acp/")))return;let{registerAcpProviders:t}=(Hn(),go(Es));t();}async function Il(n,e){if(!n.some(i=>i.startsWith("remote/")))return;let r=e.providers;if(!Array.isArray(r))return;let{createRemoteProviderFactory:o}=await Promise.resolve().then(()=>(zn(),Cs)),s=new Map;for(let i of r)i.type==="remote"&&typeof i.id=="string"&&s.set(i.id,i);s.size>0&&Pe("remote",o(s,Se));}function Ol(n,e){if(!n.some(i=>i.startsWith("plugin/")))return;let r=e.providers;if(!Array.isArray(r))return;let{createPluginProviderFactory:o}=(Kn(),go(Ss)),s=new Map;for(let i of r)i.type==="plugin"&&typeof i.id=="string"&&s.set(i.id,i);s.size>0&&Pe("plugin",o(s));}u();var Yn=class{detach(e){}};u();var Ml="crewx:fs:",Qn=class{prefix;store;constructor(e){this.prefix=e?.prefix??Ml,this.store=e?.storage??new Map;}async readFile(e){let t=this.toKey(e),r=this.store.get(t);if(r===void 0)throw new Error(`BrowserFsAdapter: file not found: ${e}`);return r}async exists(e){return this.store.has(this.toKey(e))}resolvePath(...e){let t=e.map(i=>i.replace(/\\/g,"/")).join("/").replace(/\/+/g,"/"),r=t.split("/"),o=[];for(let i of r)i==="."||i===""||(i===".."?o.pop():o.push(i));let s=o.join("/");return t.startsWith("/")?`/${s}`:s}isAbsolute(e){return e.startsWith("/")}setItem(e,t){this.store.set(this.toKey(e),t);}removeItem(e){this.store.delete(this.toKey(e));}keys(){return Array.from(this.store.keys()).filter(e=>e.startsWith(this.prefix)).map(e=>e.slice(this.prefix.length))}async readdir(e){let t=e.replace(/\\/g,"/").replace(/\/$/,""),r=this.toKey(t+"/"),o=[];for(let s of this.store.keys())if(s.startsWith(r)){let a=s.slice(r.length).split("/")[0];a&&!o.includes(a)&&o.push(a);}return o}toKey(e){return `${this.prefix}${e.replace(/\\/g,"/")}`}};u();var bt="default",Tt="archive",Ns="wi-default-flow",Nl="wi-plan-flow",Dl="wi-default-flow.yaml",Ll="wi-plan-flow.yaml",Wr=/^[a-zA-Z0-9_-]{1,64}$/;function Ds(n){return n===bt||n===Tt}function $l(n){let e={id:bt,name:"Default",workflowId:Ns,system:true,readOnly:false},t={id:Tt,name:"Archive",workflowId:"",system:true,readOnly:true},r=n?.settings?.wi?.boards;if(!Array.isArray(r)||r.length===0)return [e,t];let o=new Set,s=[];for(let i of r){if(!i||typeof i!="object")continue;let a=i,d=a.id,l=a.name,c=a.workflow_id;if(typeof d!="string"||d.length===0||typeof l!="string"||l.length===0||typeof c!="string"||c.length===0||Ds(d)||!Wr.test(d)||o.has(d))continue;o.add(d);let f=typeof a.description=="string"?a.description:void 0,g=typeof a.goal_id=="string"?a.goal_id:void 0;s.push({id:d,name:l,workflowId:c,...f!==void 0?{description:f}:{},...g!==void 0?{goalId:g}:{},system:false,readOnly:false});}return [e,...s,t]}u();var ee=class extends Error{constructor(e){super(e),this.name="WiCreateError";}},jl=300*1e3,Wl=300*1e3,Fl=1e4,Hl=50;function Bl(n){return new Promise(e=>setTimeout(e,n))}function ql(n){let e=n.getFullYear(),t=String(n.getMonth()+1).padStart(2,"0"),r=String(n.getDate()).padStart(2,"0");return {compact:`${e}${t}${r}`,iso:`${e}-${t}-${r}`}}function zl(n){return n.normalize("NFKD").replace(/[^\x00-\x7F]/g,"").replace(/[^a-zA-Z0-9]+/g,"-").replace(/^-+|-+$/g,"").toUpperCase().slice(0,60)}function Kl(n,e){let t=n.replace(/\\/g,"/").toLowerCase(),r=e.replace(/\\/g,"/").toLowerCase();if(r!==t&&!r.startsWith(t+"/"))throw new ee("Path is outside wi directory")}function Ls(n){let e=typeof n=="string"?n.trim():"";if(!e)throw new ee("title is required");if(e.length>200)throw new ee("title must be 200 characters or fewer");return e}function $s(n){let e=typeof n=="string"?n.trim():"";if(!e)return "manual";if(e.length>128)throw new ee("source must be 128 characters or fewer");if(/[\r\n]/.test(e))throw new ee("source must be a single line");return e}function Us(n){return (typeof n=="string"?n.trim().replace(/^@+/,""):"")||void 0}function js(n){if(n==null)return [];if(!Array.isArray(n))throw new ee("depends_on must be an array");return n.map(e=>String(e).trim()).filter(Boolean)}function Ws(n,e){let t=typeof n=="string"?n.trim():"";if(!t){if(e?.required)throw new ee("board is required");return}if(!Wr.test(t))throw new ee("board must match ^[a-zA-Z0-9_-]{1,64}$");if(t===Tt)throw new ee(`board cannot be '${Tt}'`);return t}function Pt(n){return JSON.stringify(n)}function Gl(n,e){return e.length===0?[`${n}: []`]:[`${n}:`,...e.map(t=>` - ${Pt(t)}`)]}async function Vl(n){let e=await ls.promises.stat(n).catch(()=>null);e&&Date.now()-e.mtimeMs>Wl&&await ls.promises.rm(n,{recursive:true,force:true}).catch(()=>{});}async function Jl(n,e){let t=K.join(n,".wi-create.lock"),r=Date.now()+Fl;for(;Date.now()<r;)try{await ls.promises.mkdir(t);try{return await e()}finally{await ls.promises.rm(t,{recursive:!0,force:!0}).catch(()=>{});}}catch(o){if(o.code!=="EEXIST")throw o;await Vl(t),await Bl(Hl);}throw new ee("WI create lock timeout: docs/wi/.wi-create.lock")}async function Fs(n){let e=[],t=await ls.promises.readdir(n,{withFileTypes:true}).catch(r=>{if(r.code==="ENOENT")return [];throw r});for(let r of t){let o=K.join(n,r.name);r.isDirectory()?e.push(...await Fs(o)):r.isFile()&&r.name.endsWith(".md")&&e.push(r.name);}return e}async function Xl(n){let e=await ls.promises.readdir(n).catch(r=>{if(r.code==="ENOENT")return [];throw r}),t=await Fs(K.join(n,"archive"));return [...e,...t]}function Yl(n,e){return n.reduce((t,r)=>{if(!r.startsWith(e))return t;let o=r.slice(e.length).match(/^(\d+)/);return o?Math.max(t,parseInt(o[1],10)):t},0)+1}function Ql(n,e){return n.some(t=>t===`${e}.md`||t.startsWith(`${e}-`))}async function Zl(n,e){let t=K.join(n,`.wi-${e}.lock`);try{return await ls.promises.writeFile(t,"",{flag:"wx"}),{claimed:!0,lockPath:t}}catch(r){if(r.code!=="EEXIST")throw r;return await ls.promises.stat(t).then(s=>Date.now()-s.mtimeMs>jl).catch(()=>false)&&await ls.promises.unlink(t).then(()=>true).catch(()=>false)?(await ls.promises.writeFile(t,"",{flag:"wx"}),{claimed:true,lockPath:t}):{claimed:false,lockPath:t}}}function ec(n){return {title:Ls(n.title),assignee:Us(n.assignee),body:(n.body??"").trim(),board:Ws(n.board),source:$s(n.source),depends_on:js(n.depends_on)}}function tc(n,e,t){if(n==null)return;let r=typeof n=="string"?n.trim():"";if(!r)throw new ee(`items[${e}].key must be a non-empty string when provided`);if(t.has(r))throw new ee(`items[${e}].key "${r}" is duplicated`);return t.add(r),r}function rc(n){let e=Ws(n.board,{required:true}),t=$s(n.source);if(!Array.isArray(n.items)||n.items.length===0)throw new ee("items must contain at least one WI");let r=new Set;return n.items.map((o,s)=>{if(!o||typeof o!="object")throw new ee(`items[${s}] must be an object`);if(typeof o.body!="string")throw new ee(`items[${s}].body is required`);return {key:tc(o.key,s,r),title:Ls(o.title),assignee:Us(o.assignee),body:o.body.trim(),board:e,source:t,depends_on:js(o.depends_on)}})}function nc(n,e){return n.map(t=>e.get(t)??t)}function oc(n,e,t){let r=!!n.board&&n.board!==bt,o={wi_id:e,title:n.title,date:t,status:"draft",priority:"normal",source:n.source};return n.assignee&&(o.assignee=n.assignee),r&&(o.board=n.board),o.depends_on=n.depends_on,{raw:`---
|
|
308
|
+
${i.message}`)}let s=cr(o);if(s.documents&&typeof s.documents=="object"){let i={};for(let[a,d]of Object.entries(s.documents))if(d&&typeof d=="object"){let l=d;typeof l.path=="string"&&!K.isAbsolute(l.path)?i[a]={...l,path:K.resolve(r,l.path)}:i[a]=l;}else i[a]=d;return {...s,documents:i}}return s}static mergeCrewxConfig(e,t){let r=new Map;for(let v of e.agents??[])r.set(v.id,v);for(let v of t.agents??[])r.has(v.id)&&console.warn(`[agent-loader] User agent "${v.id}" overrides built-in`),r.set(v.id,v);let o=Array.from(r.values()),s={...e.layouts??{},...t.layouts??{}},i={...e.documents??{},...t.documents??{}},a=e,d=t,l=Os(a.vars,d.vars),c=Os(a.settings,d.settings),f;e.skills&&t.skills&&typeof e.skills=="object"&&typeof t.skills=="object"&&!Array.isArray(e.skills)&&!Array.isArray(t.skills)?f={...e.skills,...t.skills}:f=t.skills??e.skills;let g=[...e.hooks??[],...t.hooks??[]],m=Tl(a.providers,d.providers),w={...e},_={...t};for(let v of ["agents","layouts","documents","skills","hooks","vars","settings","providers"])delete w[v],delete _[v];let y={...{...w,..._},agents:o,layouts:s,documents:i,skills:f};return g.length>0&&(y.hooks=g),l!==void 0&&(y.vars=l),c!==void 0&&(y.settings=c),m!==void 0&&(y.providers=m),y}static async loadYaml(e,t,r){let o=t?.includeBuiltIns!==false,s,i;if(o){let c=await n.loadBuiltInConfig(r);if(e!==void 0){let f=ur(e);s=n.mergeCrewxConfig(c,f),i=K.dirname(e);}else s=c,i=process.cwd();}else {if(e===void 0)throw new Error("[@crewx/sdk] loadYaml: path is required when includeBuiltIns is false");s=ur(e),i=K.dirname(e);}let a=new ot(r);await a.load(s.documents,i);let d=s.agents??[];return await Ms(d,s,t),new n(d,t??{},s,a,i)}static async fromConfig(e,t,r,o){let s=t?.includeBuiltIns===true,i=e;if(s){let c=await n.loadBuiltInConfig(o);i=n.mergeCrewxConfig(c,e);}let a=new ot(o);await a.load(i.documents,r??(typeof process<"u"?process.cwd():"/"));let d=i.agents??[];return await Ms(d,i,t),new n(d,t??{},i,a,r)}get agents(){return this._agents}get config(){return this._config}get plugins(){return this._plugins}get tools(){return this._tools}get workspaceId(){return this._workspaceId}get workspaceName(){return this._workspaceName}getAgent(e){let t=e.startsWith("@")?e.slice(1):e;return this._agents.get(t)}getRemoteProviderConfig(e){let t=this._config?.providers;return Array.isArray(t)?t.find(o=>o.type==="remote"&&o.id===e):void 0}computeTaskLogPath(e,t){let r=_n(t);return K.join(this._projectRoot,".crewx","logs",`${r}_${e}.log`)}registerTool(e,t){this._tools.set(e,{name:e,...t});}async use(e){this._plugins.includes(e)||(await e.attach(this),this._plugins.push(e));}handler(e){return On(this,e)}async registerChannelAdapter(e){let{adapter:t,instanceId:r,config:o}=e;if(this._activeAdapters.has(r))throw new Error(`Adapter instance already registered: ${r}`);let s=new Set(t.manifest.capabilities),i=e.store??vn(r),a=e.defaultMode??"query",d=t.manifest.platform,l=e.agentRunner??{run:async(m,w,_)=>{let y=await(a==="execute"?this.execute.bind(this):this.query.bind(this))(`@${m}`,w,{threadId:_?.threadId,platform:d});return {output:y.ok?y.data:y.error?.message??""}}},c=e.onInbound??(async m=>{let w=m.routingHints?.agentId??e.defaultAgent;if(!w)return {accepted:false,reason:"no_agent"};let{output:_}=await l.run(w,m.text,{threadId:m.threadId});return {accepted:true,output:_}}),f=xn({instanceId:r,config:o,capabilities:s,db:i,agentRunner:l,onInbound:c}),g={adapter:t,ctx:f,state:"starting"};this._activeAdapters.set(r,g),this.emit("adapter:lifecycle",{adapterId:t.manifest.id,instanceId:r,state:"starting",timestamp:new Date});try{await t.start(f),g.state="started",this.emit("adapter:lifecycle",{adapterId:t.manifest.id,instanceId:r,state:"started",timestamp:new Date});}catch(m){throw g.state="failed",this.emit("adapter:lifecycle",{adapterId:t.manifest.id,instanceId:r,state:"failed",error:m instanceof Error?m:new Error(String(m)),timestamp:new Date}),this._activeAdapters.delete(r),m}}async unregisterChannelAdapter(e){let t=this._activeAdapters.get(e);if(t){t.state="stopping",this.emit("adapter:lifecycle",{adapterId:t.adapter.manifest.id,instanceId:e,state:"stopping",timestamp:new Date});try{await t.adapter.stop(t.ctx),t.state="stopped",this.emit("adapter:lifecycle",{adapterId:t.adapter.manifest.id,instanceId:e,state:"stopped",timestamp:new Date});}catch(r){t.state="failed",this.emit("adapter:lifecycle",{adapterId:t.adapter.manifest.id,instanceId:e,state:"failed",error:r instanceof Error?r:new Error(String(r)),timestamp:new Date});}finally{this._activeAdapters.delete(e);}}}async stopAllAdapters(e={}){let t=e.timeoutMs??1e4,r=Array.from(this._activeAdapters.keys()),o=await Promise.allSettled(r.map(s=>Promise.race([this.unregisterChannelAdapter(s),new Promise((i,a)=>setTimeout(()=>a(new Error(`Adapter stop timeout: ${s}`)),t))])));for(let s=0;s<o.length;s++)o[s].status==="rejected"&&console.error(`[crewx] adapter stop error (${r[s]}): ${o[s].reason}`);}abortAll(){for(let[e,t]of this._activeTasks)if(t.pid!==void 0)try{process.platform==="win32"?process.kill(t.pid,"SIGTERM"):process.kill(-t.pid,"SIGTERM");}catch(r){console.error(`[crewx] abort task ${e} (pid=${t.pid}) error: ${r instanceof Error?r.message:String(r)}`);}}async _drainActiveTasks(e){let t=Array.from(this._activeTasks.values()).map(r=>r.done);t.length!==0&&await Promise.race([Promise.allSettled(t),new Promise(r=>setTimeout(r,e).unref())]);}async close(){this.abortAll(),await this._drainActiveTasks(Ut+1e3),await this.stopAllAdapters({timeoutMs:1e4});let e=[...this._remoteTargets.values()];this._remoteTargets.clear(),await Promise.allSettled(e.map(async r=>{try{await(await r).close();}catch(o){console.error(`[crewx] remote target close error: ${o instanceof Error?o.message:String(o)}`);}}));let t=[...this._plugins].reverse();for(let r of t)try{await r.detach(this);}catch(o){console.error(`[crewx] plugin ${r.name} detach error: ${o instanceof Error?o.message:String(o)}`);}this._plugins.length=0;}filterAgents(e){let t=a=>a?a.split(",").map(d=>d.trim().toLowerCase()).filter(Boolean):void 0,r=t(e.role),o=t(e.team),s=t(e.provider),i=Array.from(this._agents.values());return r&&(i=i.filter(a=>a.role&&r.some(d=>we(a.role.toLowerCase(),d)))),o&&(i=i.filter(a=>a.team&&o.some(d=>we(a.team.toLowerCase(),d)))),s&&(i=i.filter(a=>(Array.isArray(a.provider)?a.provider:[a.provider]).some(l=>s.some(c=>we(l.toLowerCase(),c))))),i}renderAgentPrompt(e){let t=e.startsWith("@")?e.slice(1):e,r=this._agents.get(t);if(!r)throw new be(t,Array.from(this._agents.keys()));return r.inline?.prompt??r.inline?.system_prompt??r.description??`You are an expert ${t}.`}async renderPrompt(e,t){let o={...await this._documentLoader.buildContext(),...t?.documents??{}},s={...t,documents:o};return this._templateEngine.render(e,s)}registerLayout(e,t){this._layoutLoader.registerLayout(e,t);}async renderAgentPromptFull(e,t){let r=e.startsWith("@")?e.slice(1):e,o=this._agents.get(r);if(!o)throw new be(r,Array.from(this._agents.keys()));let s=this._resolveLayoutSpec(o,t?.layout),i=this._extractLayoutId(s),a=this._extractLayoutProps(o,s,t?.layout),d=this._layoutLoader.load(i,a),l=o.inline?.prompt??o.inline?.system_prompt??o.description??`You are an expert ${r}.`,c=await this._documentLoader.buildContext(),f=t?.env??(typeof process<"u"?process.env:{}),g=t?.vars?.security_key??bl(),m={...t?.vars??{},documents:c,env:f,agent:{id:o.id,name:o.name??o.id,role:o.role??"",team:o.team??"",description:o.description??""}},w=await this._templateEngine.render(l,m),_={mode:t?.session?.mode??"query",platform:t?.session?.platform??"cli",options:t?.session?.options??[]},k=o.provider,y=Array.isArray(k)?k:typeof k=="string"&&k.length>0?[k]:[],v=y.join(", ")||(typeof k=="string"?k:""),A=o.options,T=["goals","daily"],b={goals:false,daily:false},V;if(!Array.isArray(A)&&typeof A=="object"&&A!==null){let W=A;if("goals"in W){let O=W.goals;typeof O=="string"||Array.isArray(O)?b.goals=O:b.goals=!!O;}"daily"in W&&(b.daily=!!W.daily);let x={};for(let[O,j]of Object.entries(W))T.includes(O)||(x[O]=j);if(Object.keys(x).length>0){let O=y.some(C=>C.startsWith("cli/")),j={};for(let[C,z]of Object.entries(x)){let le={};if(Array.isArray(z))O&&(le.rawArgs=z);else if(typeof z=="object"&&z!==null){let ft=z;Object.keys(ft).length>0&&(le.named=ft);}(le.named||le.rawArgs&&le.rawArgs.length>0)&&(j[C]=le);}V=Object.keys(j).length>0?j:void 0;}}let $=Array.isArray(A)?A:void 0,I={};for(let[W,x]of Object.entries(c))I[W]={content:x.content??"",toc:x.toc,summary:x.summary,path:x.path};if(b.goals){let W=K.join(this._projectRoot,"docs","goal"),x=await Vo(W,void 0,b.goals);x&&(I.active_goals={content:x});}if(b.daily){let W=K.join(this._projectRoot,"docs","daily"),x=await Jo(W);x&&(I.today_daily={content:x});}let N=t?.vars?.user_input??void 0,D=this._config?.settings?.dreaming?.continuity,Z=D?.reuseReadOnly!==false,U=typeof D?.lookback=="number"?D.lookback:5,ne=typeof D?.maxEntryChars=="number"?D.maxEntryChars:8e3,B=typeof D?.decayRate=="number"?D.decayRate:.5,F=t?.threadId??"",Q=o.id,J=Z&&U>0&&F&&t?.messages&&t.messages.length>0?cs({threadId:F,agentId:Q,lookback:U,maxEntryChars:ne,decayRate:B}):new Map,q=(t?.messages??[]).map(W=>{if(!W.isAssistant)return W;let x=W.metadata?.task_id;return !x||!J.has(x)?W:{...W,activity_log:J.get(x)}}),Ke={user_input:N,agent:{id:o.id,name:o.name??o.id,role:o.role??"",team:o.team??"",description:o.description??"",provider:v,providerList:y,model:o.inline?.model,workingDirectory:o.working_directory??o.workingDirectory??".",inline:{...o.inline??{},prompt:w},specialties:o.specialties??[],capabilities:o.capabilities??[],remote:o.remote??null,optionsByMode:V,optionsArray:$},agentMetadata:{specialties:o.specialties??[],capabilities:o.capabilities??[],description:o.description??""},contextOptions:b,documents:I,skills:t?.skills??[],session:_,env:f,vars:{security_key:g,...t?.vars??{}},props:{...a??{},...t?.messages&&t.messages.length>0?{showConversationHistory:true}:{}},platform:_.platform,mode:_.mode,thread_id:F,now:qt(new Date),has_activity_log:J.size>0,messages:q,tools:this._tools.size>0?{list:Array.from(this._tools.values()).map(W=>({name:W.name,description:W.description,parameters:W.parameters})),json:JSON.stringify(Array.from(this._tools.values()).map(W=>({name:W.name,description:W.description,parameters:W.parameters})),null,2),count:this._tools.size}:null,metadata:{}};return this._layoutRenderer.render(d,Ke)}_filterToolsByMode(e){return e?e.map(t=>this._tools.get(t)).filter(t=>t!==void 0):Array.from(this._tools.values())}_resolveLayoutSpec(e,t){if(t!==void 0)return t;let r=e.inline?.layout;if(r!==void 0)return r;let o=this._config?.layouts?.default;return typeof o=="string"&&o?o:"crewx/default"}_extractLayoutId(e){if(typeof e=="string")return e;if("id"in e)return e.id;if("template"in e&&typeof e.template=="string"&&e.template.trim()){let t=`crewx/__inline_${Date.now()}`;return this._layoutLoader.registerLayout(t,e.template),t}return "crewx/default"}_extractLayoutProps(e,t,r){let o=e.inline?.layout,s=o&&typeof o=="object"&&"props"in o?o.props:void 0,i=r&&typeof r=="object"&&"id"in r?r.props:void 0;if(s||i)return {...s??{},...i??{}}}_getConversationProvider(){return this._plugins.find(t=>t.name==="conversation")?.conversationProvider}async _fetchHistoryMessages(e,t,r){if(r&&r.length>0)return r;if(!e)return;let o=this._getConversationProvider();if(o)try{let s=await o.fetchHistory(e,{currentTraceId:t});return s.messages.length===0?void 0:Cn(s)}catch{return}}_resolveTimeout(e,t){let r=e==="query"?"CREWX_TIMEOUT_QUERY":"CREWX_TIMEOUT_EXECUTE";if(process.env[r]!=null&&process.env[r]!==""){let o=So();return e==="query"?o.queryMs:o.executeMs}if(t?.meta?.defaultTimeoutMs){let o=e==="query"?t.meta.defaultTimeoutMs.query:t.meta.defaultTimeoutMs.execute;if(o!==void 0)return o}return 8*36e5}_resolveIdleTimeout(e){let t=ln();return t!==void 0?t:e?.meta?.defaultIdleMs!==void 0?e.meta.defaultIdleMs:6e5}_lookupCliAdapter(e){return An(e)}_resolveEffectiveCost(e,t,r){return Lo(e?.costUsd,e?.inputTokens,e?.outputTokens,e?.cachedInputTokens,t)}_resolveEffectiveCwd(e,t){return t?.cwd??(e.working_directory?K.resolve(this._projectRoot,e.working_directory):this._projectRoot)}_buildFileRemoteOptions(e,t){let r={path:this._projectRoot,id:this._workspaceId,name:this._workspaceName,agentRef:e};return {...t,cwd:void 0,callerIdentity:r,metadata:{...t?.metadata??{},crewx:{...t?.metadata?.crewx??{},callerWorkspace:r}},vars:{...t?.vars??{},crewx_caller_workspace_path:r.path,crewx_caller_workspace_id:r.id,crewx_caller_workspace_name:r.name}}}_registerCallerIdentityOverride(e,t,r){let o=Symbol("callerIdentityOverride");return this._callerIdentityOverrides.set(e,{token:o,callerIdentity:t,targetIdentity:r}),o}_clearCallerIdentityOverride(e,t){if(!t)return;let r=this._callerIdentityOverrides.get(e);r&&r.token===t&&this._callerIdentityOverrides.delete(e);}_rewriteCallerFacingPayload(e,t,r){let{callerIdentity:o,targetIdentity:s}=r,i={...t,agentRef:o.agentRef};if(e==="task:output")return i;let a=i,d=a.metadata??{},l=d.crewx??{};return {...a,workspaceId:o.id,workspaceName:o.name,metadata:{...d,crewx:{...l,remoteExecution:s}}}}emit(e,t){if(e==="task:start"||e==="task:end"||e==="task:output"){let r=t.traceId,o=this._callerIdentityOverrides.get(r);if(o){let s=this._rewriteCallerFacingPayload(e,t,o);super.emit(e,s);return}}super.emit(e,t);}emitToolEvents(e,t,r,o,s,i,a){try{let l=this._lookupCliAdapter(r)?.parseEvent?.(o)??$t(new Date().toISOString(),o);for(let c of l)c.type==="tool_use"&&c.toolName&&this.emit("tool:observed:before",{traceId:e,timestamp:new Date,agentRef:t,agentId:s,threadId:i,sessionId:a,provider:r,tool:{name:c.toolName,rawName:c.toolName,input:c.toolInput?this.tryParseJson(c.toolInput):void 0,toolUseId:c.toolUseId}}),c.type==="tool_result"&&this.emit("tool:observed:after",{traceId:e,timestamp:new Date,agentRef:t,agentId:s,threadId:i,sessionId:a,provider:r,tool:{name:c.toolName??"unknown",rawName:c.toolName??"unknown",toolUseId:c.toolUseId,result:c.resultPreview,isError:c.isError}});}catch{}}emitTaskLogEntries(e,t,r,o,s,i,a){try{for(let d of a)d.type==="tool_use"&&d.toolName&&this.emit("tool:observed:before",{traceId:e,timestamp:new Date,agentRef:t,agentId:r,threadId:o,sessionId:s,provider:i,tool:{name:d.toolName,rawName:d.toolName,input:d.toolInput?this.tryParseJson(d.toolInput):void 0,toolUseId:d.toolUseId}}),d.type==="tool_result"&&this.emit("tool:observed:after",{traceId:e,timestamp:new Date,agentRef:t,agentId:r,threadId:o,sessionId:s,provider:i,tool:{name:d.toolName??"unknown",rawName:d.toolName??"unknown",toolUseId:d.toolUseId,result:d.resultPreview,isError:d.isError}});}catch{}}tryParseJson(e){try{return JSON.parse(e)}catch{return e}}async query(e,t,r){let o=await this.resolveFileRemoteTarget(e);if(o){let c=await o.target.query(o.agentRef,t,this._buildFileRemoteOptions(e,r));return {...c,meta:{...c.meta,agentId:e.replace(/^@/,"")}}}let s=Vt.getStore()??Rn(r?.trace),i=r?.taskId??it("tsk"),a={parentTaskId:s?.parentTaskId??null,rootTraceId:s?.rootTraceId??i,callerAgentId:s?.callerAgentId??null},d={parentTaskId:i,rootTraceId:s?.rootTraceId??i,callerAgentId:null},l=r?.callerIdentity?this._registerCallerIdentityOverride(i,r.callerIdentity,{agentId:e.replace(/^@/,""),workspaceId:this._workspaceId,workspaceName:this._workspaceName}):void 0;try{return await Vt.run(d,async()=>{let c=Date.now(),f=new Date,g;try{g=pr(e,Array.from(this._agents.values()));}catch(x){if(x instanceof be){this.emit("task:start",{traceId:i,timestamp:f,agentRef:e,message:t,mode:"query",parentTaskId:a.parentTaskId,rootTraceId:a.rootTraceId,callerAgentId:a.callerAgentId,metadata:{...r?.metadata??{}},threadId:r?.threadId,platform:r?.platform??"cli",workspaceId:this._workspaceId,workspaceName:this._workspaceName});let O=Date.now()-c,j={code:"AGENT_NOT_FOUND",message:x.message};return this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"query",durationMs:O,error:j,metadata:r?.metadata?{...r.metadata}:void 0}),this._clearCallerIdentityOverride(i,l),{ok:!1,data:"",error:j,meta:{agentId:e.replace(/^@/,""),provider:"",durationMs:O,taskId:i}}}throw x}d.callerAgentId=g.id;let m=En(g.provider),w=Ar(g.options,"query",m,xr(r?.overdrive)),_=Er(g.options,"query"),k=w.active&&w.provider?w.provider:r?.provider??_.provider??m,y=w.active&&w.model?w.model:r?.model??_.model??g.inline?.model;y&&y.includes("{{")&&(y=await this._templateEngine.render(y,{...r?.vars??{}}));let v=k!==m?void 0:r?.resumeSessionId,A;try{A=Se(k,this._additionalArgsProvider);}catch(x){this.emit("task:start",{traceId:i,timestamp:f,agentRef:e,message:t,mode:"query",parentTaskId:a.parentTaskId,rootTraceId:a.rootTraceId,callerAgentId:a.callerAgentId,metadata:{...r?.metadata??{}},threadId:r?.threadId,platform:r?.platform??"cli",workspaceId:this._workspaceId,workspaceName:this._workspaceName});let O=Date.now()-c,j={code:"PROVIDER_ERROR",message:x.message};return this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"query",durationMs:O,error:j,metadata:r?.metadata?{...r.metadata}:void 0}),this._clearCallerIdentityOverride(i,l),{ok:!1,data:"",error:j,meta:{agentId:g.id,provider:k,model:y,durationMs:O,taskId:i}}}let T=await this._fetchHistoryMessages(r?.threadId,i,r?.messages),b;try{b=await this.renderAgentPromptFull(e,{session:{mode:"query",platform:r?.platform},vars:{user_input:t,...r?.vars??{},crewx_workspace_path:this._resolveEffectiveCwd(g,r)},messages:T,threadId:r?.threadId});}catch(x){console.error(`[crewx] renderAgentPromptFull failed for ${e}: ${x instanceof Error?x.message:String(x)}`);}let V,$,I,N=y,de=!1,Y=x=>{de||(de=!0,this.emit("task:start",{traceId:i,timestamp:f,agentRef:e,message:t,mode:"query",pid:x,parentTaskId:a.parentTaskId,rootTraceId:a.rootTraceId,callerAgentId:a.callerAgentId,model:N,provider:k,codingAgentCommand:V,renderedPrompt:b,metadata:{...r?.metadata??{},provider:k,...w.active?{overdrive:!0}:{}},threadId:r?.threadId,platform:r?.platform??"cli",workspaceId:this._workspaceId,workspaceName:this._workspaceName}));},D=g.options,Z=w.active?w.mode:D?.query?.mode,U=w.effort??r?.effort??D?.query?.effort,ne=Array.isArray(D?.query?.tools)?D.query.tools:void 0,B=this._tools.size>0?this._filterToolsByMode(ne):[],F=(()=>{let x=D?.query;if(!x||Array.isArray(x))return;let{tools:O,effort:j,mode:C,provider:z,model:le,profiles:ft,...Br}=x,St=Object.entries(Br).filter(([,Ce])=>Ce!=null);if(St.length!==0)return Object.fromEntries(St.map(([Ce,qr])=>[Ce,String(qr)]))})(),Q=g.inline?.max_steps;k.startsWith("api/")&&Y();let J=!1,q=0,Ke=()=>{},W=new Promise(x=>{Ke=x;});this._activeTasks.set(i,{pid:void 0,done:W});try{let x=await A.query(t,{model:y,effort:U,mode:Z,context:r?.context,systemPrompt:b??g.inline?.system_prompt??g.inline?.prompt??g.description??`You are ${g.id}.`,additionalArgs:Array.isArray(D?.query)?D.query:void 0,resumeSessionId:v,tools:B.length>0?B:void 0,maxSteps:Q,configOptions:F,timeoutMs:this._resolveTimeout("query",this._lookupCliAdapter(k)),idleMs:this._resolveIdleTimeout(this._lookupCliAdapter(k)),cwd:this._resolveEffectiveCwd(g,r),env:{CREWX_AGENT_ID:g.id,CREWX_AGENT_ROLE:g.role??"",CREWX_AGENT_TEAM:g.team??"",CREWX_USER_ID:process.env.USER||process.env.USERNAME||"unknown",CREWX_TRACE_ID:i,CREWX_PARENT_TASK_ID:i,CREWX_TASK_ID:i,CREWX_CALLER_AGENT_ID:process.env.CREWX_AGENT_ID??"",CREWX_THREAD_ID:r?.threadId??"",CREWX_PROVIDER:k,CREWX_SESSION_ID:"",CREWX_TASK_LOG_PATH:this.computeTaskLogPath(i,f)},onPid:C=>{let z=this._activeTasks.get(i);z&&(z.pid=C),Y(C);},onOutput:(C,z)=>{let le=this._lookupCliAdapter(k);z==="stdout"&&le?.suppressOutputLine?.(C)===!0||this.emit("task:output",{traceId:i,timestamp:new Date,agentRef:e,output:C,level:z}),z==="stdout"&&this.emitToolEvents(i,e,k,C,g.id,r?.threadId??"","");},onTaskLog:C=>{this.emitTaskLogEntries(i,e,g.id,r?.threadId??"","",k,C);for(let z of C)this.emit("task:output",{traceId:i,timestamp:new Date,agentRef:e,output:JSON.stringify(z),level:"info"});},onCommand:C=>{V=C;},onUsage:C=>{$=C;},onExitCode:C=>{I=C;},onModel:C=>{N||(N=C);}});q=this._resolveEffectiveCost($,N,c),Y();let O=Date.now()-c,j={...r?.metadata??{},...r?.threadId?{threadId:r.threadId}:{}};return this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"query",result:x,durationMs:O,exitCode:I,inputTokens:$?.inputTokens,outputTokens:$?.outputTokens,cachedInputTokens:$?.cachedInputTokens,costUsd:q,model:N,metadata:Object.keys(j).length>0?j:void 0}),J=!0,{ok:!0,data:x,meta:{agentId:g.id,provider:k,model:y,durationMs:O,taskId:i}}}catch(x){if(x instanceof exports.ClientToolCallRequiredError){let C=it("thd");return this._pendingThreads.set(C,{agentRef:g.id,providerStr:k,continuationState:x.continuationState,toolCall:x.toolCall,traceId:i,startMs:c,model:y}),J=!0,{ok:!0,status:"requires_action",data:"",toolCall:x.toolCall,threadId:C,meta:{agentId:g.id,provider:k,model:y,durationMs:Date.now()-c,taskId:i}}}q=this._resolveEffectiveCost($,N,c),Y();let O=Date.now()-c,j={code:"QUERY_FAILED",message:x.message};return this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"query",durationMs:O,error:j,exitCode:I,inputTokens:$?.inputTokens,outputTokens:$?.outputTokens,cachedInputTokens:$?.cachedInputTokens,costUsd:q,model:N,metadata:r?.metadata?{...r.metadata}:void 0}),J=!0,{ok:!1,data:"",error:j,meta:{agentId:g.id,provider:k,model:y,durationMs:O,taskId:i}}}finally{J||this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"query",durationMs:Date.now()-c,error:{code:"TASK_END_GUARD",message:"task:end was not emitted normally"},exitCode:I??-1,inputTokens:$?.inputTokens,outputTokens:$?.outputTokens,cachedInputTokens:$?.cachedInputTokens,costUsd:q,model:N}),this._activeTasks.delete(i),this._clearCallerIdentityOverride(i,l),Ke();}})}finally{this._clearCallerIdentityOverride(i,l);}}async continueQuery(e,t){let r=this._pendingThreads.get(e);if(!r)return {ok:false,data:"",error:{code:"THREAD_NOT_FOUND",message:`No pending thread: ${e}`},meta:{agentId:"",provider:"",durationMs:0}};this._pendingThreads.delete(e);let o=Se(r.providerStr,this._additionalArgsProvider);if(!o.continueWithToolResults)return {ok:false,data:"",error:{code:"UNSUPPORTED",message:"Provider does not support client tool continuation"},meta:{agentId:r.agentRef,provider:r.providerStr,durationMs:0}};let s=t.map(i=>({...i,toolName:r.toolCall.toolCallId===i.toolCallId?r.toolCall.toolName:i.toolCallId}));try{let i=await o.continueWithToolResults(r.continuationState,s),a=Date.now()-r.startMs;return this.emit("task:end",{traceId:r.traceId,timestamp:new Date,agentRef:r.agentRef,mode:"query",result:i,durationMs:a}),{ok:!0,status:"complete",data:i,meta:{agentId:r.agentRef,provider:r.providerStr,model:r.model,durationMs:a}}}catch(i){if(i instanceof exports.ClientToolCallRequiredError)return this._pendingThreads.set(e,{...r,continuationState:i.continuationState,toolCall:i.toolCall}),{ok:true,status:"requires_action",data:"",toolCall:i.toolCall,threadId:e,meta:{agentId:r.agentRef,provider:r.providerStr,model:r.model,durationMs:Date.now()-r.startMs}};let a=Date.now()-r.startMs;return {ok:false,data:"",error:{code:"CONTINUE_FAILED",message:i.message},meta:{agentId:r.agentRef,provider:r.providerStr,model:r.model,durationMs:a}}}}async execute(e,t,r){let o=await this.resolveFileRemoteTarget(e);if(o){let c=await o.target.execute(o.agentRef,t,this._buildFileRemoteOptions(e,r));return {...c,meta:{...c.meta,agentId:e.replace(/^@/,"")}}}let s=Vt.getStore()??Rn(r?.trace),i=r?.taskId??it("tsk"),a={parentTaskId:s?.parentTaskId??null,rootTraceId:s?.rootTraceId??i,callerAgentId:s?.callerAgentId??null},d={parentTaskId:i,rootTraceId:s?.rootTraceId??i,callerAgentId:null},l=r?.callerIdentity?this._registerCallerIdentityOverride(i,r.callerIdentity,{agentId:e.replace(/^@/,""),workspaceId:this._workspaceId,workspaceName:this._workspaceName}):void 0;try{return await Vt.run(d,async()=>{let c=Date.now(),f=new Date,g;try{g=pr(e,Array.from(this._agents.values()));}catch(x){if(x instanceof be){this.emit("task:start",{traceId:i,timestamp:f,agentRef:e,message:t,mode:"execute",parentTaskId:a.parentTaskId,rootTraceId:a.rootTraceId,callerAgentId:a.callerAgentId,metadata:{...r?.metadata??{}},threadId:r?.threadId,platform:r?.platform??"cli",workspaceId:this._workspaceId,workspaceName:this._workspaceName});let O=Date.now()-c,j={code:"AGENT_NOT_FOUND",message:x.message};return this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"execute",durationMs:O,error:j,metadata:r?.metadata?{...r.metadata}:void 0}),this._clearCallerIdentityOverride(i,l),{ok:!1,data:"",error:j,meta:{agentId:e.replace(/^@/,""),provider:"",durationMs:O,taskId:i}}}throw x}d.callerAgentId=g.id;let m=En(g.provider),w=Ar(g.options,"execute",m,xr(r?.overdrive)),_=Er(g.options,"execute"),k=w.active&&w.provider?w.provider:r?.provider??_.provider??m,y=w.active&&w.model?w.model:r?.model??_.model??g.inline?.model;y&&y.includes("{{")&&(y=await this._templateEngine.render(y,{...r?.vars??{}}));let v=k!==m?void 0:r?.resumeSessionId,A;try{A=Se(k,this._additionalArgsProvider);}catch(x){this.emit("task:start",{traceId:i,timestamp:f,agentRef:e,message:t,mode:"execute",parentTaskId:a.parentTaskId,rootTraceId:a.rootTraceId,callerAgentId:a.callerAgentId,metadata:{...r?.metadata??{}},threadId:r?.threadId,platform:r?.platform??"cli",workspaceId:this._workspaceId,workspaceName:this._workspaceName});let O=Date.now()-c,j={code:"PROVIDER_ERROR",message:x.message};return this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"execute",durationMs:O,error:j,metadata:r?.metadata?{...r.metadata}:void 0}),this._clearCallerIdentityOverride(i,l),{ok:!1,data:"",error:j,meta:{agentId:g.id,provider:k,model:y,durationMs:O,taskId:i}}}let T=await this._fetchHistoryMessages(r?.threadId,i,r?.messages),b;try{b=await this.renderAgentPromptFull(e,{session:{mode:"execute",platform:r?.platform},vars:{user_input:t,...r?.vars??{},crewx_workspace_path:this._resolveEffectiveCwd(g,r)},messages:T,threadId:r?.threadId});}catch(x){console.error(`[crewx] renderAgentPromptFull failed for ${e}: ${x instanceof Error?x.message:String(x)}`);}let V,$,I,N=y,de=!1,Y=x=>{de||(de=!0,this.emit("task:start",{traceId:i,timestamp:f,agentRef:e,message:t,mode:"execute",pid:x,parentTaskId:a.parentTaskId,rootTraceId:a.rootTraceId,callerAgentId:a.callerAgentId,model:N,provider:k,codingAgentCommand:V,renderedPrompt:b,metadata:{...r?.metadata??{},provider:k,...w.active?{overdrive:!0}:{}},threadId:r?.threadId,platform:r?.platform??"cli",workspaceId:this._workspaceId,workspaceName:this._workspaceName}));},D=g.options,Z=w.active?w.mode:D?.execute?.mode,U=w.effort??r?.effort??D?.execute?.effort,ne=Array.isArray(D?.execute?.tools)?D.execute.tools:void 0,B=this._tools.size>0?this._filterToolsByMode(ne):[],F=(()=>{let x=D?.execute;if(!x||Array.isArray(x))return;let{tools:O,effort:j,mode:C,provider:z,model:le,profiles:ft,...Br}=x,St=Object.entries(Br).filter(([,Ce])=>Ce!=null);if(St.length!==0)return Object.fromEntries(St.map(([Ce,qr])=>[Ce,String(qr)]))})(),Q=g.inline?.max_steps;k.startsWith("api/")&&Y();let J=!1,q=0,Ke=()=>{},W=new Promise(x=>{Ke=x;});this._activeTasks.set(i,{pid:void 0,done:W});try{let x=await A.execute(t,{model:y,effort:U,mode:Z,context:r?.context,systemPrompt:b??g.inline?.system_prompt??g.inline?.prompt??g.description??`You are ${g.id}.`,additionalArgs:Array.isArray(D?.execute)?D.execute:void 0,resumeSessionId:v,tools:B.length>0?B:void 0,maxSteps:Q,configOptions:F,timeoutMs:this._resolveTimeout("execute",this._lookupCliAdapter(k)),idleMs:this._resolveIdleTimeout(this._lookupCliAdapter(k)),cwd:this._resolveEffectiveCwd(g,r),env:{CREWX_AGENT_ID:g.id,CREWX_AGENT_ROLE:g.role??"",CREWX_AGENT_TEAM:g.team??"",CREWX_USER_ID:process.env.USER||process.env.USERNAME||"unknown",CREWX_TRACE_ID:i,CREWX_PARENT_TASK_ID:i,CREWX_TASK_ID:i,CREWX_CALLER_AGENT_ID:process.env.CREWX_AGENT_ID??"",CREWX_THREAD_ID:r?.threadId??"",CREWX_PROVIDER:k,CREWX_SESSION_ID:"",CREWX_TASK_LOG_PATH:this.computeTaskLogPath(i,f)},onPid:C=>{let z=this._activeTasks.get(i);z&&(z.pid=C),Y(C);},onOutput:(C,z)=>{let le=this._lookupCliAdapter(k);z==="stdout"&&le?.suppressOutputLine?.(C)===!0||this.emit("task:output",{traceId:i,timestamp:new Date,agentRef:e,output:C,level:z}),z==="stdout"&&this.emitToolEvents(i,e,k,C,g.id,r?.threadId??"","");},onTaskLog:C=>{this.emitTaskLogEntries(i,e,g.id,r?.threadId??"","",k,C);for(let z of C)this.emit("task:output",{traceId:i,timestamp:new Date,agentRef:e,output:JSON.stringify(z),level:"info"});},onCommand:C=>{V=C;},onUsage:C=>{$=C;},onExitCode:C=>{I=C;},onModel:C=>{N||(N=C);}});q=this._resolveEffectiveCost($,N,c),Y();let O=Date.now()-c,j={...r?.metadata??{},...r?.threadId?{threadId:r.threadId}:{}};return this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"execute",result:x,durationMs:O,exitCode:I,inputTokens:$?.inputTokens,outputTokens:$?.outputTokens,cachedInputTokens:$?.cachedInputTokens,costUsd:q,model:N,metadata:Object.keys(j).length>0?j:void 0}),J=!0,{ok:!0,data:x,meta:{agentId:g.id,provider:k,model:y,durationMs:O,taskId:i}}}catch(x){q=this._resolveEffectiveCost($,N,c),Y();let O=Date.now()-c,j={code:"EXECUTE_FAILED",message:x.message};return this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"execute",durationMs:O,error:j,exitCode:I,inputTokens:$?.inputTokens,outputTokens:$?.outputTokens,cachedInputTokens:$?.cachedInputTokens,costUsd:q,model:N,metadata:r?.metadata?{...r.metadata}:void 0}),J=!0,{ok:!1,data:"",error:j,meta:{agentId:g.id,provider:k,model:y,durationMs:O,taskId:i}}}finally{J||this.emit("task:end",{traceId:i,timestamp:new Date,agentRef:e,mode:"execute",durationMs:Date.now()-c,error:{code:"TASK_END_GUARD",message:"task:end was not emitted normally"},exitCode:I??-1,inputTokens:$?.inputTokens,outputTokens:$?.outputTokens,cachedInputTokens:$?.cachedInputTokens,costUsd:q,model:N}),this._activeTasks.delete(i),this._clearCallerIdentityOverride(i,l),Ke();}})}finally{this._clearCallerIdentityOverride(i,l);}}};function Os(n,e){let t=Xn(n)?n:void 0,r=Xn(e)?e:void 0;if(!(!t&&!r))return {...t??{},...r??{}}}function Xn(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function Tl(n,e){let t=Array.isArray(n)?n:void 0,r=Array.isArray(e)?e:void 0;if(!t&&!r)return;let o=a=>{if(!Xn(a))return;let d=a.id;if(typeof d=="string")return `id:${d}`;let l=a.name;if(typeof l=="string")return `name:${l}`},s=new Set;for(let a of r??[]){let d=o(a);d&&s.add(d);}let i=[];for(let a of t??[]){let d=o(a);d&&s.has(d)||i.push(a);}for(let a of r??[])i.push(a);return i}function Pl(n){let e=Array.isArray(n.provider)?n.provider:[n.provider],t=n.options,r=[...e];for(let o of ["query","execute"]){let s=Er(t,o);s.provider&&r.push(s.provider);let i=t&&typeof t=="object"&&!Array.isArray(t)?t[o]:void 0,a=i&&typeof i=="object"&&!Array.isArray(i)?kr(i.overdrive):void 0;a?.provider&&r.push(a.provider);}return r}async function Ms(n,e,t){let r=n.flatMap(Pl);if(r.some(s=>s.startsWith("api/"))){let{registerApiProviders:s}=await Promise.resolve().then(()=>(Dn(),_s));s(t?.api);}await Il(r,e),Ol(r,e),Sl(r);}function Sl(n){if(!n.some(r=>r.startsWith("acp/")))return;let{registerAcpProviders:t}=(Hn(),go(Es));t();}async function Il(n,e){if(!n.some(i=>i.startsWith("remote/")))return;let r=e.providers;if(!Array.isArray(r))return;let{createRemoteProviderFactory:o}=await Promise.resolve().then(()=>(zn(),Cs)),s=new Map;for(let i of r)i.type==="remote"&&typeof i.id=="string"&&s.set(i.id,i);s.size>0&&Pe("remote",o(s,Se));}function Ol(n,e){if(!n.some(i=>i.startsWith("plugin/")))return;let r=e.providers;if(!Array.isArray(r))return;let{createPluginProviderFactory:o}=(Kn(),go(Ss)),s=new Map;for(let i of r)i.type==="plugin"&&typeof i.id=="string"&&s.set(i.id,i);s.size>0&&Pe("plugin",o(s));}u();var Yn=class{detach(e){}};u();var Ml="crewx:fs:",Qn=class{prefix;store;constructor(e){this.prefix=e?.prefix??Ml,this.store=e?.storage??new Map;}async readFile(e){let t=this.toKey(e),r=this.store.get(t);if(r===void 0)throw new Error(`BrowserFsAdapter: file not found: ${e}`);return r}async exists(e){return this.store.has(this.toKey(e))}resolvePath(...e){let t=e.map(i=>i.replace(/\\/g,"/")).join("/").replace(/\/+/g,"/"),r=t.split("/"),o=[];for(let i of r)i==="."||i===""||(i===".."?o.pop():o.push(i));let s=o.join("/");return t.startsWith("/")?`/${s}`:s}isAbsolute(e){return e.startsWith("/")}setItem(e,t){this.store.set(this.toKey(e),t);}removeItem(e){this.store.delete(this.toKey(e));}keys(){return Array.from(this.store.keys()).filter(e=>e.startsWith(this.prefix)).map(e=>e.slice(this.prefix.length))}async readdir(e){let t=e.replace(/\\/g,"/").replace(/\/$/,""),r=this.toKey(t+"/"),o=[];for(let s of this.store.keys())if(s.startsWith(r)){let a=s.slice(r.length).split("/")[0];a&&!o.includes(a)&&o.push(a);}return o}toKey(e){return `${this.prefix}${e.replace(/\\/g,"/")}`}};u();var bt="default",Tt="archive",Ns="wi-default-flow",Nl="wi-plan-flow",Dl="wi-default-flow.yaml",Ll="wi-plan-flow.yaml",Wr=/^[a-zA-Z0-9_-]{1,64}$/;function Ds(n){return n===bt||n===Tt}function $l(n){let e={id:bt,name:"Default",workflowId:Ns,system:true,readOnly:false},t={id:Tt,name:"Archive",workflowId:"",system:true,readOnly:true},r=n?.settings?.wi?.boards;if(!Array.isArray(r)||r.length===0)return [e,t];let o=new Set,s=[];for(let i of r){if(!i||typeof i!="object")continue;let a=i,d=a.id,l=a.name,c=a.workflow_id;if(typeof d!="string"||d.length===0||typeof l!="string"||l.length===0||typeof c!="string"||c.length===0||Ds(d)||!Wr.test(d)||o.has(d))continue;o.add(d);let f=typeof a.description=="string"?a.description:void 0,g=typeof a.goal_id=="string"?a.goal_id:void 0;s.push({id:d,name:l,workflowId:c,...f!==void 0?{description:f}:{},...g!==void 0?{goalId:g}:{},system:false,readOnly:false});}return [e,...s,t]}u();var ee=class extends Error{constructor(e){super(e),this.name="WiCreateError";}},jl=300*1e3,Wl=300*1e3,Fl=1e4,Hl=50;function Bl(n){return new Promise(e=>setTimeout(e,n))}function ql(n){let e=n.getFullYear(),t=String(n.getMonth()+1).padStart(2,"0"),r=String(n.getDate()).padStart(2,"0");return {compact:`${e}${t}${r}`,iso:`${e}-${t}-${r}`}}function zl(n){return n.normalize("NFKD").replace(/[^\x00-\x7F]/g,"").replace(/[^a-zA-Z0-9]+/g,"-").replace(/^-+|-+$/g,"").toUpperCase().slice(0,60)}function Kl(n,e){let t=n.replace(/\\/g,"/").toLowerCase(),r=e.replace(/\\/g,"/").toLowerCase();if(r!==t&&!r.startsWith(t+"/"))throw new ee("Path is outside wi directory")}function Ls(n){let e=typeof n=="string"?n.trim():"";if(!e)throw new ee("title is required");if(e.length>200)throw new ee("title must be 200 characters or fewer");return e}function $s(n){let e=typeof n=="string"?n.trim():"";if(!e)return "manual";if(e.length>128)throw new ee("source must be 128 characters or fewer");if(/[\r\n]/.test(e))throw new ee("source must be a single line");return e}function Us(n){return (typeof n=="string"?n.trim().replace(/^@+/,""):"")||void 0}function js(n){if(n==null)return [];if(!Array.isArray(n))throw new ee("depends_on must be an array");return n.map(e=>String(e).trim()).filter(Boolean)}function Ws(n,e){let t=typeof n=="string"?n.trim():"";if(!t){if(e?.required)throw new ee("board is required");return}if(!Wr.test(t))throw new ee("board must match ^[a-zA-Z0-9_-]{1,64}$");if(t===Tt)throw new ee(`board cannot be '${Tt}'`);return t}function Pt(n){return JSON.stringify(n)}function Gl(n,e){return e.length===0?[`${n}: []`]:[`${n}:`,...e.map(t=>` - ${Pt(t)}`)]}async function Vl(n){let e=await ls.promises.stat(n).catch(()=>null);e&&Date.now()-e.mtimeMs>Wl&&await ls.promises.rm(n,{recursive:true,force:true}).catch(()=>{});}async function Jl(n,e){let t=K.join(n,".wi-create.lock"),r=Date.now()+Fl;for(;Date.now()<r;)try{await ls.promises.mkdir(t);try{return await e()}finally{await ls.promises.rm(t,{recursive:!0,force:!0}).catch(()=>{});}}catch(o){if(o.code!=="EEXIST")throw o;await Vl(t),await Bl(Hl);}throw new ee("WI create lock timeout: docs/wi/.wi-create.lock")}async function Fs(n){let e=[],t=await ls.promises.readdir(n,{withFileTypes:true}).catch(r=>{if(r.code==="ENOENT")return [];throw r});for(let r of t){let o=K.join(n,r.name);r.isDirectory()?e.push(...await Fs(o)):r.isFile()&&r.name.endsWith(".md")&&e.push(r.name);}return e}async function Xl(n){let e=await ls.promises.readdir(n).catch(r=>{if(r.code==="ENOENT")return [];throw r}),t=await Fs(K.join(n,"archive"));return [...e,...t]}function Yl(n,e){return n.reduce((t,r)=>{if(!r.startsWith(e))return t;let o=r.slice(e.length).match(/^(\d+)/);return o?Math.max(t,parseInt(o[1],10)):t},0)+1}function Ql(n,e){return n.some(t=>t===`${e}.md`||t.startsWith(`${e}-`))}async function Zl(n,e){let t=K.join(n,`.wi-${e}.lock`);try{return await ls.promises.writeFile(t,"",{flag:"wx"}),{claimed:!0,lockPath:t}}catch(r){if(r.code!=="EEXIST")throw r;return await ls.promises.stat(t).then(s=>Date.now()-s.mtimeMs>jl).catch(()=>false)&&await ls.promises.unlink(t).then(()=>true).catch(()=>false)?(await ls.promises.writeFile(t,"",{flag:"wx"}),{claimed:true,lockPath:t}):{claimed:false,lockPath:t}}}function ec(n){return {title:Ls(n.title),assignee:Us(n.assignee),body:(n.body??"").trim(),board:Ws(n.board),source:$s(n.source),depends_on:js(n.depends_on)}}function tc(n,e,t){if(n==null)return;let r=typeof n=="string"?n.trim():"";if(!r)throw new ee(`items[${e}].key must be a non-empty string when provided`);if(t.has(r))throw new ee(`items[${e}].key "${r}" is duplicated`);return t.add(r),r}function rc(n){let e=Ws(n.board,{required:true}),t=$s(n.source);if(!Array.isArray(n.items)||n.items.length===0)throw new ee("items must contain at least one WI");let r=new Set;return n.items.map((o,s)=>{if(!o||typeof o!="object")throw new ee(`items[${s}] must be an object`);if(typeof o.body!="string")throw new ee(`items[${s}].body is required`);return {key:tc(o.key,s,r),title:Ls(o.title),assignee:Us(o.assignee),body:o.body.trim(),board:e,source:t,depends_on:js(o.depends_on)}})}function nc(n,e){return n.map(t=>e.get(t)??t)}function oc(n,e,t){let r=!!n.board&&n.board!==bt,o={wi_id:e,title:n.title,date:t,status:"draft",priority:"normal",source:n.source};return n.assignee&&(o.assignee=n.assignee),r&&(o.board=n.board),o.depends_on=n.depends_on,{raw:`---
|
|
309
309
|
${[`wi_id: ${e}`,`title: ${Pt(n.title)}`,`date: ${Pt(t)}`,"status: draft",...n.assignee?[`assignee: ${Pt(n.assignee)}`]:[],"priority: normal",`source: ${Pt(n.source)}`,...r?[`board: ${Pt(n.board)}`]:[],...Gl("depends_on",n.depends_on)].join(`
|
|
310
310
|
`)}
|
|
311
311
|
---
|