@crewx/sdk 0.8.6-rc.8 → 0.8.6

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 CHANGED
@@ -29,7 +29,7 @@ ${e}`:e}async runProcess(e,t,r){try{return await fr(this.adapter.command,e,this.
29
29
  `);this.stderrBuffer=v.pop()??"";for(let w of v)w.trim()&&this.options.onStderr?.(w);}),this.proc=n;let s=new WritableStream({write:g=>new Promise((y,v)=>{n.stdin.write(g,w=>{w?v(w):y();});}),close:()=>{n.stdin.end();}}),i=new ReadableStream({start:g=>{n.stdout.on("data",y=>{g.enqueue(new Uint8Array(y));}),n.stdout.on("end",()=>{g.close();}),n.stdout.on("error",y=>{g.error(y);});}}),a=ndJsonStream(s,i),d=this,u=new ClientSideConnection(g=>({requestPermission:async y=>{if(d.options.configOptions?.allow_all!==void 0){let v=y.options;if(Array.isArray(v)&&v.length>0)return {outcome:{outcome:"selected",optionId:(v.find(A=>A.kind==="allow_once")??v.find(A=>A.kind?.startsWith("allow_"))??v[0]).optionId}}}return {outcome:{outcome:"cancelled"}}},sessionUpdate:async y=>{d.pendingUpdateCallback?.(y);}}),a);this.sdkConnection=u;let c=new Promise((g,y)=>{n.on("error",v=>{if(v.code==="ENOENT"){let A=t.command==="npx"&&t.args.length>0?`@agentclientprotocol/${t.args[0]}`:t.command;y(new b(`ACP command "${t.command}" not found. Is the ACP adapter installed? Try: npm install -g ${A}`,"acp"));}else y(new b(`ACP spawn error: ${v.message}`,"acp"));});}),m=this.doInitialize(u,e),p=new Promise((g,y)=>{setTimeout(()=>{y(new ne(`ACP connect timeout after ${Hr}ms. The ACP adapter may not be installed or may require interactive setup.`));},Hr).unref();});await Promise.race([m,p,c]);}async doInitialize(e,t){let r=await e.initialize({protocolVersion:1,clientCapabilities:{auth:{}},clientInfo:{name:t?.name??"crewx-sdk",version:t?.version??"0.8.4"}});this._initResponse=r,this.authMethods=r.authMethods??[];}async newSession(e){if(!this.sdkConnection)throw new b("AcpConnection not connected. Call connect() first.","acp");try{return await this.newSessionWithTimeout(e)}catch(t){if(!this.isAuthError(t))throw t;return await this.tryAuthenticate(),this.newSessionWithTimeout(e)}}async newSessionWithTimeout(e){return (await this.newSessionRawTimeout(e)).sessionId}async newSessionRaw(e){if(!this.sdkConnection)throw new b("AcpConnection not connected. Call connect() first.","acp");try{return await this.newSessionRawTimeout(e)}catch(t){if(!this.isAuthError(t))throw t;return await this.tryAuthenticate(),this.newSessionRawTimeout(e)}}async newSessionRawTimeout(e){let t=this.sdkConnection.newSession(e),r=new Promise((n,s)=>{setTimeout(()=>{s(new ne(`ACP session/new timeout after ${Ur}ms`));},Ur).unref();});return Promise.race([t,r])}isAuthError(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code===Lo}async tryAuthenticate(){if(!this.sdkConnection)throw new b("AcpConnection not connected.","acp");let e=this.authMethods.find(r=>r.type==="env_var"&&this.hasEnvVarsFor(r));if(e){await this.sdkConnection.authenticate({methodId:e.id});return}let t=this.authMethods.map(r=>`${r.id} (${r.type??"agent"})`).join(", ");if(this.authMethods.length>0){let r=this.authMethods.filter(n=>n.type==="env_var");if(r.length>0){let n=r.flatMap(s=>(s.vars??[]).filter(i=>!i.optional&&!process.env[i.name]).map(i=>i.name));throw new ne(`ACP authentication required. Missing environment variables: ${n.join(", ")}. Set them in your shell or crewx.yaml env block.`)}throw new ne(`ACP authentication required but no supported method found. Available methods: ${t}. CrewX currently supports env_var authentication only.`)}throw new ne("ACP agent requires authentication but advertised no auth methods.")}hasEnvVarsFor(e){return !e.vars||e.vars.length===0?true:e.vars.filter(t=>!t.optional).every(t=>!!process.env[t.name])}async setModel(e,t){if(!this.sdkConnection)throw new b("AcpConnection not connected. Call connect() first.","acp");await this.sdkConnection.unstable_setSessionModel({sessionId:e,modelId:t});}async setMode(e,t){if(!this.sdkConnection)throw new b("AcpConnection not connected. Call connect() first.","acp");await this.sdkConnection.setSessionMode({sessionId:e,modeId:t});}async setConfigOption(e,t,r){if(!this.sdkConnection)throw new b("AcpConnection not connected. Call connect() first.","acp");await this.sdkConnection.setSessionConfigOption({sessionId:e,configId:t,value:r});}async prompt(e,t,r,n){if(!this.sdkConnection||!this.proc)throw new b("AcpConnection not connected. Call connect() first.","acp");this.pendingUpdateCallback=r??null;let s=this.sdkConnection,i=this.proc,a=n??36e5,d=s.prompt({sessionId:e,prompt:t}),u=new Promise((m,p)=>{setTimeout(()=>{s.cancel({sessionId:e}).catch(()=>{}),p(new be(`ACP prompt timeout after ${a}ms`,"acp"));},a).unref();}),c=new Promise((m,p)=>{let g=y=>{y!==0&&p(new b(`ACP process exited unexpectedly (code=${String(y)}): ${this.collectedStderr.slice(0,500)}`,"acp"));};i.once("close",g),d.then(()=>i.off("close",g)).catch(()=>i.off("close",g));});try{return await Promise.race([d,u,c])}finally{this.pendingUpdateCallback=null;}}async dispose(){if(this.disposed)return;this.disposed=true,this.pendingUpdateCallback=null,this.sdkConnection=null;let e=this.proc;e&&(this.proc=null,this.stderrBuffer.trim()&&(this.options.onStderr?.(this.stderrBuffer),this.stderrBuffer=""),await new Promise(t=>{let r=()=>{clearTimeout(n),t();};e.once("close",r),e.once("error",r);try{e.kill("SIGTERM");}catch{r();return}let n=setTimeout(()=>{try{e.kill("SIGKILL");}catch{}},Do);}));}get isConnected(){return !this.disposed&&this.sdkConnection!==null&&this.proc!==null}};});function Fr(o,e){if(o!=null&&typeof o=="object"){let t=o;if(typeof t.command=="string")return t.command;if(typeof t.file_path=="string")return t.file_path;if(typeof t.filePath=="string")return t.filePath;if(typeof t.path=="string")return t.path;if(typeof t.query=="string")return t.query;if(typeof t.pattern=="string")return t.pattern;if(typeof t.url=="string")return t.url;if(Object.keys(t).length>0)return JSON.stringify(t)}if(e&&e.length>0)return e.map(t=>t.path).join(", ")}var jo,Ne,Ft=M(()=>{l();ie();nt();jo={read:"Read",edit:"Edit",delete:"Delete",move:"Move",search:"Search",execute:"Bash",think:"Think",fetch:"WebFetch",switch_mode:"SwitchMode"};Ne=class{constructor(e,t,r){this.adapter=t;}adapter;async query(e,t){return this.runPrompt(e,t)}async execute(e,t){return this.runPrompt(e,t)}async dispose(){}async runPrompt(e,t){let{command:r,args:n}=this.adapter.spawn;t?.onCommand?.(`${r} ${n.join(" ")}`);let s=new me({spawn:this.adapter.spawn,env:t?.env,cwd:t?.cwd,timeoutMs:t?.timeoutMs,onPid:t?.onPid,onStderr:i=>t?.onOutput?.(i,"stderr"),configOptions:t?.configOptions});try{await s.connect(this.adapter.clientInfo);let i=this.adapter.buildSessionParams({cwd:t?.cwd,env:t?.env,model:t?.model,systemPrompt:t?.systemPrompt}),a=await s.newSession(i);await this.applySessionOptions(s,a,t);let d=this.composePrompt(e,t),u=[],c=await s.prompt(a,d,m=>this.handleUpdate(m,t,u),t?.timeoutMs);return this.handleUsage(c,t),u.join("")}finally{await s.dispose().catch(()=>{});}}async applySessionOptions(e,t,r){if(r?.model){let n=this.adapter.buildEffortAction?.(r.effort??"",r.model);n?.type==="set_model"?await e.setModel(t,n.modelId):await e.setModel(t,r.model);}if(r?.mode){let n=this.adapter.resolveMode?.(r.mode)??r.mode;if(n)try{await e.setMode(t,n);}catch(s){console.warn(`[acp] setMode(${n}) failed: ${s instanceof Error?s.message:String(s)}`);}}if(r?.effort){let n=this.adapter.buildEffortAction?.(r.effort,r.model);if(n&&n.type==="set_config_option")try{await e.setConfigOption(t,n.configId,n.value);}catch(s){console.warn(`[acp] setConfigOption(${n.configId}) effort failed: ${s instanceof Error?s.message:String(s)}`);}}if(r?.configOptions)for(let[n,s]of Object.entries(r.configOptions))try{await e.setConfigOption(t,n,s);}catch(i){console.warn(`[acp] setConfigOption(${n}) failed, retrying: ${i instanceof Error?i.message:String(i)}`);try{await new Promise(a=>setTimeout(a,500)),await e.setConfigOption(t,n,s);}catch(a){console.warn(`[acp] setConfigOption(${n}) retry failed: ${a instanceof Error?a.message:String(a)}`);}}}composePrompt(e,t){let r=[];return t?.systemPrompt?.trim()&&(r.push(t.systemPrompt),r.push("---")),t?.context&&(r.push(t.context),r.push("---")),r.push(e),[{type:"text",text:r.join(`
30
30
 
31
31
  `)}]}handleUpdate(e,t,r){let n=e.update;if(n.sessionUpdate==="agent_message_chunk"){let s=null;this.adapter.extractTextFromUpdate?s=this.adapter.extractTextFromUpdate(e):s=Ht(e),s!==null&&(r.push(s),t?.onOutput?.(s,"stdout"));}else if(n.sessionUpdate==="tool_call"){let s=new Date().toISOString(),i=n,a={title:i.title??"",kind:i.kind,rawInput:i.rawInput,rawOutput:i.rawOutput,locations:i.locations,_meta:i._meta},d=this.resolveToolCall(a),u={timestamp:s,type:"tool_use",toolUseId:i.toolCallId,toolName:d.toolName,toolInput:d.toolInput};t?.onTaskLog?.([u]);}else if(n.sessionUpdate==="tool_call_update"){let s=new Date().toISOString(),i=n;if(i.status==="completed"||i.status==="failed"){let d=this.extractResultPreview(i.rawOutput),u={timestamp:s,type:"tool_result",toolUseId:i.toolCallId,resultPreview:d,isError:i.status==="failed"};t?.onTaskLog?.([u]);}else if(i.rawInput!=null&&typeof i.rawInput=="object"&&Object.keys(i.rawInput).length>0){let d={title:i.title??"",kind:i.kind,rawInput:i.rawInput,rawOutput:i.rawOutput,locations:i.locations,_meta:i._meta},u=this.resolveToolCall(d),c={timestamp:s,type:"tool_use",toolUseId:i.toolCallId,toolName:u.toolName,toolInput:u.toolInput};t?.onTaskLog?.([c]);}}else n.sessionUpdate;}resolveToolCall(e){let t=e._meta;if(t?.claudeCode?.toolName)return {toolName:t.claudeCode.toolName,toolInput:Fr(e.rawInput,e.locations)??(e.title||void 0)};if(this.adapter.parseToolCall){let s=this.adapter.parseToolCall(e);if(s)return {toolName:s.toolName??e.title??"unknown",toolInput:s.toolInput}}let r=jo[e.kind??""]??e.title??"unknown",n=Fr(e.rawInput,e.locations)??(e.title||void 0);return {toolName:r,toolInput:n}}extractResultPreview(e){if(e!=null){if(typeof e=="string")return e;if(Array.isArray(e)){let t=e.filter(r=>r!=null&&typeof r=="object"&&r.type==="text"&&typeof r.text=="string").map(r=>r.text);if(t.length>0)return t.join(`
32
- `)}if(typeof e=="object"){let t=e;if(typeof t.formatted_output=="string")return t.formatted_output;if(typeof t.content=="string")return t.content;if(Array.isArray(t.content)){let r=this.extractResultPreview(t.content);if(r)return r}if(typeof t.output=="string")return t.output;if(typeof t.text=="string")return t.text;if(typeof t.message=="string")return t.message;if(t.result!=null){let r=this.extractResultPreview(t.result);if(r)return r}if(t.error!=null){let r=this.extractResultPreview(t.error);if(r)return r}}return JSON.stringify(e)}}handleUsage(e,t){if(!t?.onUsage)return;if(this.adapter.extractUsage){let n=this.adapter.extractUsage(e);if(n){t.onUsage(n);return}}let r=e.usage;r&&t.onUsage({inputTokens:r.inputTokens??0,outputTokens:r.outputTokens??0,cachedInputTokens:r.cachedReadTokens??0,costUsd:0});}};});var ot,qt=M(()=>{l();ie();ot={spawn:{command:"npx",args:["claude-agent-acp"],shellOnWindows:true},npmPackage:"@agentclientprotocol/claude-agent-acp",clientInfo:{name:"crewx-sdk",version:"0.8.4"},meta:{displayName:"Claude",defaultMode:"default"},buildSessionParams(o){return {cwd:o.cwd??process.cwd(),mcpServers:[]}},extractUsage(o){let e=o.usage;return e?{inputTokens:e.inputTokens??0,outputTokens:e.outputTokens??0,cachedInputTokens:e.cachedReadTokens??0,costUsd:0}:null},yoloModeId:"bypassPermissions",buildEffortAction(o){return o?{type:"set_config_option",configId:"effort",value:o}:null},resolveMode(o){return {yolo:"bypassPermissions"}[o]??o},parseEvent:J};});var st,Wt=M(()=>{l();ie();st={spawn:{command:"npx",args:["codex-acp"],shellOnWindows:true},npmPackage:"@agentclientprotocol/codex-acp",clientInfo:{name:"crewx-sdk",version:"0.8.4"},meta:{displayName:"Codex",defaultMode:"agent"},buildSessionParams(o){return {cwd:o.cwd??process.cwd(),mcpServers:[]}},extractUsage(o){let e=o.usage;return e?{inputTokens:e.inputTokens??0,outputTokens:e.outputTokens??0,cachedInputTokens:e.cachedReadTokens??0,costUsd:0}:null},yoloModeId:"agent-full-access",buildEffortAction(o,e){return e&&o?{type:"set_model",modelId:`${e}[${o}]`}:e&&!o?{type:"set_model",modelId:`${e}[medium]`}:null},resolveMode(o){return {yolo:"agent-full-access",default:"agent",plan:"read-only"}[o]??o},parseEvent:J};});var it,Bt=M(()=>{l();ie();it={spawn:{command:"gemini",args:["--acp"],shellOnWindows:false},clientInfo:{name:"crewx-sdk",version:"0.8.4"},meta:{displayName:"Gemini"},buildSessionParams(o){return {cwd:o.cwd??process.cwd(),mcpServers:[]}},yoloModeId:"yolo",buildEffortAction(o){return null},resolveMode(o){return {acceptEdits:"autoEdit"}[o]??o},parseEvent:J};});var Ae,at,Vt=M(()=>{l();ie();Ae="https://agentclientprotocol.com/protocol/session-modes",at={spawn:{command:"copilot",args:["--acp"],shellOnWindows:false},clientInfo:{name:"crewx-sdk",version:"0.8.4"},meta:{displayName:"GitHub Copilot"},buildSessionParams(o){return {cwd:o.cwd?resolve(o.cwd):process.cwd(),mcpServers:[]}},yoloModeId:`${Ae}#autopilot`,buildEffortAction(o){return o?{type:"set_config_option",configId:"reasoning_effort",value:o}:null},resolveMode(o){return o.startsWith("https://")?o:{yolo:`${Ae}#autopilot`,default:`${Ae}#agent`,agent:`${Ae}#agent`,plan:`${Ae}#plan`,autopilot:`${Ae}#autopilot`}[o]??null},parseEvent:J};});var dt,zt=M(()=>{l();ie();dt={spawn:{command:"opencode",args:["acp"],shellOnWindows:false},clientInfo:{name:"crewx-sdk",version:"0.8.4"},meta:{displayName:"OpenCode"},buildSessionParams(o){return {cwd:o.cwd??process.cwd(),mcpServers:[]}},yoloModeId:void 0,buildEffortAction(o){return o?{type:"set_config_option",configId:"effort",value:o}:null},resolveMode(o){let e={default:"build"};return o==="yolo"?null:e[o]??o},parseEvent:J};});var fe,lt=M(()=>{l();qt();Wt();Bt();Vt();zt();qt();Wt();Bt();Vt();zt();fe={claude:ot,codex:st,gemini:it,copilot:at,opencode:dt};});var Wr={};We(Wr,{registerAcpProviders:()=>qr});function qr(o){if(o){ee("acp",o);return}ee("acp",(e,t)=>{let r=fe[e];if(!r)throw new b(`Unknown ACP provider id: "${e}". Supported: ${Object.keys(fe).join(", ")}`,t);return new Ne(e,r,t)});}var Kt=M(()=>{l();Q();Ft();lt();Q();});function Uo(o){if(!o)return o;let e=o.trim().replace(/\/+$/,"");return e.toLowerCase().endsWith("/mcp")?e.slice(0,-4):e}var $e,Jt=M(()=>{l();$e=class{endpoint;headers;timeoutMs;constructor(e){let t=Uo(e.url);this.endpoint=`${t}/mcp`,this.headers={"Content-Type":"application/json",...e.headers??{}},e.apiKey&&(this.headers.Authorization=`Bearer ${e.apiKey}`),this.timeoutMs=e.timeoutMs??3e4;}async send(e){let t=new AbortController,r=setTimeout(()=>t.abort(),this.timeoutMs);try{let n=await fetch(this.endpoint,{method:"POST",headers:this.headers,body:JSON.stringify(e),signal:t.signal});if(clearTimeout(r),!n.ok){let a=await n.text();throw new Error(`HTTP ${n.status}: ${n.statusText}${a?` - ${a}`:""}`)}let s=n.headers.get("content-type");if(s?.includes("application/json"))return await n.json();let i=await n.text();return {jsonrpc:"2.0",id:e.id,error:{code:-32600,message:`Unexpected response content-type: ${s}`,data:i}}}catch(n){throw clearTimeout(r),n instanceof Error&&n.name==="AbortError"?new Error(`MCP-HTTP request timeout after ${this.timeoutMs}ms to ${this.endpoint}`):n}}async close(){}};});var Le,Xt=M(()=>{l();Jt();Le=class{logger;configs=new Map;transports=new Map;constructor(e={}){this.logger=e.logger??(()=>{});}loadConfig(e,t){this.validateConfig(t),this.configs.set(e,t),this.transports.set(e,new $e({url:t.url,apiKey:t.apiKey,headers:t.headers,timeoutMs:t.timeoutMs})),this.logger(`Loaded remote agent config for: ${e}`,"debug");}loadConfigWithTransport(e,t,r){this.validateConfig(t),this.configs.set(e,t),this.transports.set(e,r),this.logger(`Loaded remote agent config for: ${e} (custom transport)`,"debug");}getConfig(e){return this.configs.get(e)}isRemoteAgent(e){return this.configs.has(e)}getRemoteAgentIds(){return Array.from(this.configs.keys())}async query(e,t){let r=this.requireConfig(e),n=r.tools?.query??"crewx_queryAgent",i={agentId:r.agentId??e,query:t.query};t.context&&(i.context=t.context),t.model&&(i.model=t.model),t.platform&&(i.platform=t.platform),t.messages?.length&&(i.messages=t.messages);try{let a=await this.callRemoteTool(e,n,i);return this.normalizeResponse(a)}catch(a){let d=a instanceof Error?a.message:String(a);throw this.logger(`Remote query failed for agent ${e}: ${d}`,"error"),a}}async execute(e,t){let r=this.requireConfig(e),n=r.tools?.execute??"crewx_executeAgent",i={agentId:r.agentId??e,task:t.task};t.context&&(i.context=t.context),t.model&&(i.model=t.model),t.platform&&(i.platform=t.platform),t.messages?.length&&(i.messages=t.messages);try{let a=await this.callRemoteTool(e,n,i);return this.normalizeResponse(a)}catch(a){let d=a instanceof Error?a.message:String(a);throw this.logger(`Remote execute failed for agent ${e}: ${d}`,"error"),a}}mapToolNames(e,t){let r=this.requireConfig(e);r.tools={query:t.query??r.tools?.query??"crewx_queryAgent",execute:t.execute??r.tools?.execute??"crewx_executeAgent"},this.logger(`Updated tool name mapping for agent ${e}`,"debug");}async clearConfigs(){for(let e of this.transports.values())await e.close();this.configs.clear(),this.transports.clear(),this.logger("Cleared all remote agent configurations","debug");}requireConfig(e){let t=this.configs.get(e);if(!t)throw new Error(`Agent ${e} is not configured as a remote agent`);return t}async callRemoteTool(e,t,r){let n=this.transports.get(e);if(!n)throw new Error(`No transport available for agent ${e}`);let s={jsonrpc:"2.0",id:`${t}-${Date.now()}`,method:"tools/call",params:{name:t,arguments:r}};this.logger(`Calling remote MCP tool ${t} for agent ${e}`,"debug");let i=await n.send(s);if(i.error)throw new Error(i.error.message||"MCP server returned an error");return i.result}normalizeResponse(e){if(!e)return {success:false,content:[{type:"text",text:"Remote agent returned no response."}]};let t=e;if(Array.isArray(t.content)&&t.content.length>0)return t;let r=t.response??t.implementation??t.message??t.output,n=typeof r=="string"?r:JSON.stringify(r??e,null,2);return {...t,content:[{type:"text",text:n}]}}validateConfig(e){if(!e.url)throw new Error("Remote agent configuration requires a URL");if(!e.url.startsWith("http://")&&!e.url.startsWith("https://"))throw new Error("Remote agent URL must start with http:// or https://");if(e.type!=="mcp-http")throw new Error(`Unsupported remote agent type: ${e.type}`)}};});var Vr={};We(Vr,{RemoteProviderRuntime:()=>De,createRemoteProviderFactory:()=>Br,resolveFileRemoteAgent:()=>Jo});function zo(o){let e=readFileSync(o,"utf-8"),t=load(e);return {agents:Array.isArray(t?.agents)?t.agents:void 0}}function Ko(o){let e=Array.isArray(o.provider)?o.provider[0]:o.provider;return e||(Array.isArray(o.inline?.provider)?o.inline.provider[0]:o.inline?.provider)}function Jo(o,e=zo,t=existsSync){let r=o.location.replace("file://","");if(!t(r))throw new Error(`Remote config file not found: ${r}`);if(!o.external_agent_id)throw new Error(`external_agent_id is required for file:// remote provider "${o.id}"`);let s=e(r).agents?.find(d=>d.id===o.external_agent_id);if(!s)throw new Error(`Agent "${o.external_agent_id}" not found in ${r}`);let i=Ko(s);if(!i)throw new Error(`Agent "${o.external_agent_id}" in ${r} has no provider configured`);if(i.startsWith("remote/"))throw new Error(`Chained remotes not allowed: ${o.id} \u2192 ${i}`);let a=resolve(dirname(r),s.working_directory??".");return {agent:{...s,working_directory:a},provider:i}}function Br(o,e=te){return (t,r)=>{let n=o.get(t);if(!n)throw new Error(`Remote provider "${t}" not found. Available: ${Array.from(o.keys()).join(", ")||"(none)"}`);if(n.location.startsWith("file://"))throw new Error(`Remote provider "${t}" uses file:// location which is not supported at the SDK level. Use the CLI commands (crewx query / crewx execute) which handle file:// remotes automatically.`);return new De(t,n,e)}}function Xo(o,e){let t=e.location;if(!t)throw new Error("Remote provider config requires a location");if(!t.startsWith("http://")&&!t.startsWith("https://"))throw new Error(`Unsupported remote location protocol for MCP-HTTP: ${t}`);return {type:"mcp-http",url:t,apiKey:e.apiKey,headers:e.headers,timeoutMs:e.timeout?.query??3e4,agentId:e.external_agent_id??o}}var De,Qt=M(()=>{l();Q();Xt();De=class{manager;agentId;constructor(e,t,r=te){this.agentId=t.external_agent_id??e,this.manager=new Le;let n=Xo(e,t);this.manager.loadConfig(this.agentId,n);}async query(e,t){return (await this.manager.query(this.agentId,{agentId:this.agentId,query:e,model:t?.model,context:t?.context??t?.systemPrompt})).content.map(n=>n.text).join(`
32
+ `)}if(typeof e=="object"){let t=e;if(typeof t.formatted_output=="string")return t.formatted_output;if(typeof t.content=="string")return t.content;if(Array.isArray(t.content)){let r=this.extractResultPreview(t.content);if(r)return r}if(typeof t.output=="string")return t.output;if(typeof t.text=="string")return t.text;if(typeof t.message=="string")return t.message;if(t.result!=null){let r=this.extractResultPreview(t.result);if(r)return r}if(t.error!=null){let r=this.extractResultPreview(t.error);if(r)return r}}return JSON.stringify(e)}}handleUsage(e,t){if(!t?.onUsage)return;if(this.adapter.extractUsage){let n=this.adapter.extractUsage(e);if(n){t.onUsage(n);return}}let r=e.usage;r&&t.onUsage({inputTokens:r.inputTokens??0,outputTokens:r.outputTokens??0,cachedInputTokens:r.cachedReadTokens??0,costUsd:0});}};});var ot,qt=M(()=>{l();ie();ot={spawn:{command:"npx",args:["-y","@agentclientprotocol/claude-agent-acp"],shellOnWindows:true},npmPackage:"@agentclientprotocol/claude-agent-acp",clientInfo:{name:"crewx-sdk",version:"0.8.4"},meta:{displayName:"Claude",defaultMode:"default"},buildSessionParams(o){return {cwd:o.cwd??process.cwd(),mcpServers:[]}},extractUsage(o){let e=o.usage;return e?{inputTokens:e.inputTokens??0,outputTokens:e.outputTokens??0,cachedInputTokens:e.cachedReadTokens??0,costUsd:0}:null},yoloModeId:"bypassPermissions",buildEffortAction(o){return o?{type:"set_config_option",configId:"effort",value:o}:null},resolveMode(o){return {yolo:"bypassPermissions"}[o]??o},parseEvent:J};});var st,Wt=M(()=>{l();ie();st={spawn:{command:"npx",args:["-y","@agentclientprotocol/codex-acp"],shellOnWindows:true},npmPackage:"@agentclientprotocol/codex-acp",clientInfo:{name:"crewx-sdk",version:"0.8.4"},meta:{displayName:"Codex",defaultMode:"agent"},buildSessionParams(o){return {cwd:o.cwd??process.cwd(),mcpServers:[]}},extractUsage(o){let e=o.usage;return e?{inputTokens:e.inputTokens??0,outputTokens:e.outputTokens??0,cachedInputTokens:e.cachedReadTokens??0,costUsd:0}:null},yoloModeId:"agent-full-access",buildEffortAction(o,e){return e&&o?{type:"set_model",modelId:`${e}[${o}]`}:e&&!o?{type:"set_model",modelId:`${e}[medium]`}:null},resolveMode(o){return {yolo:"agent-full-access",default:"agent",plan:"read-only"}[o]??o},parseEvent:J};});var it,Bt=M(()=>{l();ie();it={spawn:{command:"gemini",args:["--acp"],shellOnWindows:false},clientInfo:{name:"crewx-sdk",version:"0.8.4"},meta:{displayName:"Gemini"},buildSessionParams(o){return {cwd:o.cwd??process.cwd(),mcpServers:[]}},yoloModeId:"yolo",buildEffortAction(o){return null},resolveMode(o){return {acceptEdits:"autoEdit"}[o]??o},parseEvent:J};});var Ae,at,Vt=M(()=>{l();ie();Ae="https://agentclientprotocol.com/protocol/session-modes",at={spawn:{command:"copilot",args:["--acp"],shellOnWindows:false},clientInfo:{name:"crewx-sdk",version:"0.8.4"},meta:{displayName:"GitHub Copilot"},buildSessionParams(o){return {cwd:o.cwd?resolve(o.cwd):process.cwd(),mcpServers:[]}},yoloModeId:`${Ae}#autopilot`,buildEffortAction(o){return o?{type:"set_config_option",configId:"reasoning_effort",value:o}:null},resolveMode(o){return o.startsWith("https://")?o:{yolo:`${Ae}#autopilot`,default:`${Ae}#agent`,agent:`${Ae}#agent`,plan:`${Ae}#plan`,autopilot:`${Ae}#autopilot`}[o]??null},parseEvent:J};});var dt,zt=M(()=>{l();ie();dt={spawn:{command:"opencode",args:["acp"],shellOnWindows:false},clientInfo:{name:"crewx-sdk",version:"0.8.4"},meta:{displayName:"OpenCode"},buildSessionParams(o){return {cwd:o.cwd??process.cwd(),mcpServers:[]}},yoloModeId:void 0,buildEffortAction(o){return o?{type:"set_config_option",configId:"effort",value:o}:null},resolveMode(o){let e={default:"build"};return o==="yolo"?null:e[o]??o},parseEvent:J};});var fe,lt=M(()=>{l();qt();Wt();Bt();Vt();zt();qt();Wt();Bt();Vt();zt();fe={claude:ot,codex:st,gemini:it,copilot:at,opencode:dt};});var Wr={};We(Wr,{registerAcpProviders:()=>qr});function qr(o){if(o){ee("acp",o);return}ee("acp",(e,t)=>{let r=fe[e];if(!r)throw new b(`Unknown ACP provider id: "${e}". Supported: ${Object.keys(fe).join(", ")}`,t);return new Ne(e,r,t)});}var Kt=M(()=>{l();Q();Ft();lt();Q();});function Uo(o){if(!o)return o;let e=o.trim().replace(/\/+$/,"");return e.toLowerCase().endsWith("/mcp")?e.slice(0,-4):e}var $e,Jt=M(()=>{l();$e=class{endpoint;headers;timeoutMs;constructor(e){let t=Uo(e.url);this.endpoint=`${t}/mcp`,this.headers={"Content-Type":"application/json",...e.headers??{}},e.apiKey&&(this.headers.Authorization=`Bearer ${e.apiKey}`),this.timeoutMs=e.timeoutMs??3e4;}async send(e){let t=new AbortController,r=setTimeout(()=>t.abort(),this.timeoutMs);try{let n=await fetch(this.endpoint,{method:"POST",headers:this.headers,body:JSON.stringify(e),signal:t.signal});if(clearTimeout(r),!n.ok){let a=await n.text();throw new Error(`HTTP ${n.status}: ${n.statusText}${a?` - ${a}`:""}`)}let s=n.headers.get("content-type");if(s?.includes("application/json"))return await n.json();let i=await n.text();return {jsonrpc:"2.0",id:e.id,error:{code:-32600,message:`Unexpected response content-type: ${s}`,data:i}}}catch(n){throw clearTimeout(r),n instanceof Error&&n.name==="AbortError"?new Error(`MCP-HTTP request timeout after ${this.timeoutMs}ms to ${this.endpoint}`):n}}async close(){}};});var Le,Xt=M(()=>{l();Jt();Le=class{logger;configs=new Map;transports=new Map;constructor(e={}){this.logger=e.logger??(()=>{});}loadConfig(e,t){this.validateConfig(t),this.configs.set(e,t),this.transports.set(e,new $e({url:t.url,apiKey:t.apiKey,headers:t.headers,timeoutMs:t.timeoutMs})),this.logger(`Loaded remote agent config for: ${e}`,"debug");}loadConfigWithTransport(e,t,r){this.validateConfig(t),this.configs.set(e,t),this.transports.set(e,r),this.logger(`Loaded remote agent config for: ${e} (custom transport)`,"debug");}getConfig(e){return this.configs.get(e)}isRemoteAgent(e){return this.configs.has(e)}getRemoteAgentIds(){return Array.from(this.configs.keys())}async query(e,t){let r=this.requireConfig(e),n=r.tools?.query??"crewx_queryAgent",i={agentId:r.agentId??e,query:t.query};t.context&&(i.context=t.context),t.model&&(i.model=t.model),t.platform&&(i.platform=t.platform),t.messages?.length&&(i.messages=t.messages);try{let a=await this.callRemoteTool(e,n,i);return this.normalizeResponse(a)}catch(a){let d=a instanceof Error?a.message:String(a);throw this.logger(`Remote query failed for agent ${e}: ${d}`,"error"),a}}async execute(e,t){let r=this.requireConfig(e),n=r.tools?.execute??"crewx_executeAgent",i={agentId:r.agentId??e,task:t.task};t.context&&(i.context=t.context),t.model&&(i.model=t.model),t.platform&&(i.platform=t.platform),t.messages?.length&&(i.messages=t.messages);try{let a=await this.callRemoteTool(e,n,i);return this.normalizeResponse(a)}catch(a){let d=a instanceof Error?a.message:String(a);throw this.logger(`Remote execute failed for agent ${e}: ${d}`,"error"),a}}mapToolNames(e,t){let r=this.requireConfig(e);r.tools={query:t.query??r.tools?.query??"crewx_queryAgent",execute:t.execute??r.tools?.execute??"crewx_executeAgent"},this.logger(`Updated tool name mapping for agent ${e}`,"debug");}async clearConfigs(){for(let e of this.transports.values())await e.close();this.configs.clear(),this.transports.clear(),this.logger("Cleared all remote agent configurations","debug");}requireConfig(e){let t=this.configs.get(e);if(!t)throw new Error(`Agent ${e} is not configured as a remote agent`);return t}async callRemoteTool(e,t,r){let n=this.transports.get(e);if(!n)throw new Error(`No transport available for agent ${e}`);let s={jsonrpc:"2.0",id:`${t}-${Date.now()}`,method:"tools/call",params:{name:t,arguments:r}};this.logger(`Calling remote MCP tool ${t} for agent ${e}`,"debug");let i=await n.send(s);if(i.error)throw new Error(i.error.message||"MCP server returned an error");return i.result}normalizeResponse(e){if(!e)return {success:false,content:[{type:"text",text:"Remote agent returned no response."}]};let t=e;if(Array.isArray(t.content)&&t.content.length>0)return t;let r=t.response??t.implementation??t.message??t.output,n=typeof r=="string"?r:JSON.stringify(r??e,null,2);return {...t,content:[{type:"text",text:n}]}}validateConfig(e){if(!e.url)throw new Error("Remote agent configuration requires a URL");if(!e.url.startsWith("http://")&&!e.url.startsWith("https://"))throw new Error("Remote agent URL must start with http:// or https://");if(e.type!=="mcp-http")throw new Error(`Unsupported remote agent type: ${e.type}`)}};});var Vr={};We(Vr,{RemoteProviderRuntime:()=>De,createRemoteProviderFactory:()=>Br,resolveFileRemoteAgent:()=>Jo});function zo(o){let e=readFileSync(o,"utf-8"),t=load(e);return {agents:Array.isArray(t?.agents)?t.agents:void 0}}function Ko(o){let e=Array.isArray(o.provider)?o.provider[0]:o.provider;return e||(Array.isArray(o.inline?.provider)?o.inline.provider[0]:o.inline?.provider)}function Jo(o,e=zo,t=existsSync){let r=o.location.replace("file://","");if(!t(r))throw new Error(`Remote config file not found: ${r}`);if(!o.external_agent_id)throw new Error(`external_agent_id is required for file:// remote provider "${o.id}"`);let s=e(r).agents?.find(d=>d.id===o.external_agent_id);if(!s)throw new Error(`Agent "${o.external_agent_id}" not found in ${r}`);let i=Ko(s);if(!i)throw new Error(`Agent "${o.external_agent_id}" in ${r} has no provider configured`);if(i.startsWith("remote/"))throw new Error(`Chained remotes not allowed: ${o.id} \u2192 ${i}`);let a=resolve(dirname(r),s.working_directory??".");return {agent:{...s,working_directory:a},provider:i}}function Br(o,e=te){return (t,r)=>{let n=o.get(t);if(!n)throw new Error(`Remote provider "${t}" not found. Available: ${Array.from(o.keys()).join(", ")||"(none)"}`);if(n.location.startsWith("file://"))throw new Error(`Remote provider "${t}" uses file:// location which is not supported at the SDK level. Use the CLI commands (crewx query / crewx execute) which handle file:// remotes automatically.`);return new De(t,n,e)}}function Xo(o,e){let t=e.location;if(!t)throw new Error("Remote provider config requires a location");if(!t.startsWith("http://")&&!t.startsWith("https://"))throw new Error(`Unsupported remote location protocol for MCP-HTTP: ${t}`);return {type:"mcp-http",url:t,apiKey:e.apiKey,headers:e.headers,timeoutMs:e.timeout?.query??3e4,agentId:e.external_agent_id??o}}var De,Qt=M(()=>{l();Q();Xt();De=class{manager;agentId;constructor(e,t,r=te){this.agentId=t.external_agent_id??e,this.manager=new Le;let n=Xo(e,t);this.manager.loadConfig(this.agentId,n);}async query(e,t){return (await this.manager.query(this.agentId,{agentId:this.agentId,query:e,model:t?.model,context:t?.context??t?.systemPrompt})).content.map(n=>n.text).join(`
33
33
  `)}async execute(e,t){return (await this.manager.execute(this.agentId,{agentId:this.agentId,task:e,model:t?.model,context:t?.context??t?.systemPrompt})).content.map(n=>n.text).join(`
34
34
  `)}};});var Xr={};We(Xr,{PluginProviderRuntime:()=>je,createPluginProviderFactory:()=>Jr});function Jr(o){return (e,t)=>{let r=o.get(e);if(!r)throw new b(`Plugin provider "${e}" not found. Available: ${Array.from(o.keys()).join(", ")||"(none)"}`,`plugin/${e}`);return new je(e,r)}}function zr(o,e,t,r){let n=o.map(s=>s.replace(/\{model\}/g,e));return r&&n.push(t),n}function Go(o){if(!o||typeof o!="string")throw new Error("Plugin provider requires a cli_command")}function Kr(o){if(!Array.isArray(o))throw new Error("CLI arguments must be an array");for(let e of o)if(typeof e!="string")throw new Error("Each CLI argument must be a string")}function Yo(o){for(let{pattern:e}of o)if(typeof e!="string")throw new Error("Error pattern must be a string")}function Zo(o){for(let[e,t]of Object.entries(o))if(typeof e!="string"||typeof t!="string")throw new Error("env entries must be string key/value pairs")}var je,Gt=M(()=>{l();Q();Qe();je=class{constructor(e,t){this.config=t;this.providerStr=`plugin/${e}`,Go(t.cli_command),Kr(t.query_args),Kr(t.execute_args),t.error_patterns&&Yo(t.error_patterns),t.env&&Zo(t.env);}config;providerStr;async query(e,t){let r=t?.model??this.config.default_model??"default",n=zr(this.config.query_args,r,e,this.config.prompt_in_args),s=this.config.prompt_in_args?void 0:e;t?.onCommand?.(`${this.config.cli_command} ${n.join(" ")}`);let i=this.config.timeout?.query??6e5;return this.runProcess(n,t,s,i)}async execute(e,t){let r=t?.model??this.config.default_model??"default",n=zr(this.config.execute_args,r,e,this.config.prompt_in_args),s=this.config.prompt_in_args?void 0:e;t?.onCommand?.(`${this.config.cli_command} ${n.join(" ")}`);let i=this.config.timeout?.execute??6e5;return this.runProcess(n,t,s,i)}runProcess(e,t,r,n){return new Promise((s,i)=>{let a={...process.env,...this.config.env??{}},d=Pe({command:this.config.cli_command,allowShellFallback:true}),u=Re(d,e),c=spawn(u.command,u.argv,{env:a,shell:u.shell??false,stdio:["pipe","pipe","pipe"],windowsHide:u.windowsHide});r!==void 0&&c.stdin.write(r),c.stdin.end(),c.pid!==void 0&&t?.onPid?.(c.pid);let m="",p="",g="",y="";c.stdout.on("data",w=>{let A=w.toString();m+=A,g+=A;let x=g.split(`
35
35
  `);g=x.pop()??"";for(let C of x)C.trim()&&t?.onOutput?.(C,"stdout");}),c.stderr.on("data",w=>{let A=w.toString();p+=A,y+=A;let x=y.split(`
@@ -1,4 +1,4 @@
1
- import*as j from'path';import j__default,{join,basename,dirname}from'path';import {fileURLToPath}from'url';import {existsSync,mkdirSync,writeFileSync,appendFileSync}from'fs';import It,{homedir}from'os';import {createHash}from'crypto';import {sql,eq,desc,and,or,isNull,like,asc,inArray,gte,lt}from'drizzle-orm';import {sqliteTable,text,integer,real,index,unique}from'drizzle-orm/sqlite-core';var W=(d=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(d,{get:(t,e)=>(typeof require<"u"?require:t)[e]}):d)(function(d){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+d+'" is not supported')});var Rt=()=>fileURLToPath(import.meta.url),Tt=()=>j__default.dirname(Rt()),g=Tt();var O=class{detach(t){}};function dt(d){let t=e=>String(e).padStart(2,"0");return `${d.getFullYear()}${t(d.getMonth()+1)}${t(d.getDate())}T${t(d.getHours())}${t(d.getMinutes())}${t(d.getSeconds())}`}var et=class extends O{name="file-logger";unsubs=[];logFiles=new Map;logsDir;version;constructor(t){super(),this.logsDir=join(t?.workspaceRoot??process.cwd(),".crewx","logs"),this.version=t?.version??"unknown";}attach(t){this.unsubs.push(t.on("task:start",e=>{try{existsSync(this.logsDir)||mkdirSync(this.logsDir,{recursive:!0});let s=dt(e.timestamp),n=join(this.logsDir,`${s}_${e.traceId}.log`);this.logFiles.set(e.traceId,n);let r=`=== TASK LOG: ${e.traceId} ===
1
+ import*as j from'path';import j__default,{join,dirname}from'path';import {fileURLToPath}from'url';import {existsSync,mkdirSync,writeFileSync,appendFileSync}from'fs';import Lt,{homedir}from'os';import {createHash}from'crypto';import {sql,eq,desc,and,or,isNull,like,asc,inArray,gte,lt}from'drizzle-orm';import {sqliteTable,text,integer,real,index,unique}from'drizzle-orm/sqlite-core';var W=(d=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(d,{get:(t,e)=>(typeof require<"u"?require:t)[e]}):d)(function(d){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+d+'" is not supported')});var Rt=()=>fileURLToPath(import.meta.url),St=()=>j__default.dirname(Rt()),g=St();var A=class{detach(t){}};function dt(d){let t=e=>String(e).padStart(2,"0");return `${d.getFullYear()}${t(d.getMonth()+1)}${t(d.getDate())}T${t(d.getHours())}${t(d.getMinutes())}${t(d.getSeconds())}`}var et=class extends A{name="file-logger";unsubs=[];logFiles=new Map;logsDir;version;constructor(t){super(),this.logsDir=join(t?.workspaceRoot??process.cwd(),".crewx","logs"),this.version=t?.version??"unknown";}attach(t){this.unsubs.push(t.on("task:start",e=>{try{existsSync(this.logsDir)||mkdirSync(this.logsDir,{recursive:!0});let s=dt(e.timestamp),n=join(this.logsDir,`${s}_${e.traceId}.log`);this.logFiles.set(e.traceId,n);let r=`=== TASK LOG: ${e.traceId} ===
2
2
  CrewX Version: ${this.version}
3
3
  Mode: ${e.mode}
4
4
  Agent: ${e.agentRef}
@@ -8,38 +8,35 @@ Message: ${e.message}
8
8
  `;writeFileSync(n,r,{encoding:"utf8",mode:384});}catch{}}),t.on("task:output",e=>{try{let s=this.logFiles.get(e.traceId);if(!s)return;let n=new Date().toISOString();appendFileSync(s,`[${n}] STDOUT: ${e.output}
9
9
  `,"utf8");}catch{}}),t.on("task:end",e=>{try{let s=this.logFiles.get(e.traceId);if(!s)return;let n=new Date().toLocaleString(),r=e.error?`failed: ${e.error.message}`:"completed successfully",i=`[${n}] INFO: Task ${r} in ${e.durationMs}ms
10
10
  [${n}] INFO: Process closed with exit code: ${e.error?1:0}
11
- `;appendFileSync(s,i,"utf8"),this.logFiles.delete(e.traceId);}catch{}}));}detach(t){this.unsubs.forEach(e=>e()),this.unsubs=[],this.logFiles.clear();}};function vt(d){let t=j.resolve(d);return process.platform==="win32"&&(t=t.replace(/\\/g,"/"),t=t.replace(/^([A-Z]):/,(e,s)=>`${s.toLowerCase()}:`)),t.length>1&&!/^[a-zA-Z]:\/$/.test(t)&&(t=t.replace(/\/+$/,"")),t}function pt(d){let t=vt(d);return createHash("sha256").update(t).digest("hex")}var B=class{resolveDbPath(){return process.env.CREWX_DB?process.env.CREWX_DB:process.env.CREWX_TRACES_DB?process.env.CREWX_TRACES_DB:join(It.homedir(),".crewx","crewx.db")}resolveDbPaths(){return [this.resolveDbPath()]}isMissingTableError(t){return t instanceof Error&&/no such table:/i.test(t.message)}dbExists(t){return existsSync(t??this.resolveDbPath())}};function b(d){let t=W("better-sqlite3"),{drizzle:e}=W("drizzle-orm/better-sqlite3"),s=new t(d);return s.exec("PRAGMA journal_mode = WAL"),s.exec("PRAGMA busy_timeout = 5000"),s.exec("PRAGMA foreign_keys = ON"),{db:e(s),runRaw:(n,r=[])=>s.prepare(n).run(...r),close:()=>s.close()}}var _t=new Set;function Ut(d){let{migrate:t}=W("drizzle-orm/better-sqlite3/migrator"),{sql:e}=W("drizzle-orm"),s=[j__default.join(g,"../migrations"),j__default.join(g,"migrations"),j__default.join(g,"../../../../drizzle/migrations"),j__default.join(process.cwd(),"drizzle/migrations")],n=s.find(p=>existsSync(j__default.join(p,"meta/_journal.json")));if(!n)throw new Error(`migrations folder not found. Searched:
11
+ `;appendFileSync(s,i,"utf8"),this.logFiles.delete(e.traceId);}catch{}}));}detach(t){this.unsubs.forEach(e=>e()),this.unsubs=[],this.logFiles.clear();}};function vt(d){let t=j.resolve(d);return process.platform==="win32"&&(t=t.replace(/\\/g,"/"),t=t.replace(/^([A-Z]):/,(e,s)=>`${s.toLowerCase()}:`)),t.length>1&&!/^[a-zA-Z]:\/$/.test(t)&&(t=t.replace(/\/+$/,"")),t}function pt(d){let t=vt(d);return createHash("sha256").update(t).digest("hex")}var B=class{resolveDbPath(){return process.env.CREWX_DB?process.env.CREWX_DB:process.env.CREWX_TRACES_DB?process.env.CREWX_TRACES_DB:join(Lt.homedir(),".crewx","crewx.db")}resolveDbPaths(){return [this.resolveDbPath()]}isMissingTableError(t){return t instanceof Error&&/no such table:/i.test(t.message)}dbExists(t){return existsSync(t??this.resolveDbPath())}};function b(d){let t=W("better-sqlite3"),{drizzle:e}=W("drizzle-orm/better-sqlite3"),s=new t(d);return s.exec("PRAGMA journal_mode = WAL"),s.exec("PRAGMA busy_timeout = 5000"),s.exec("PRAGMA foreign_keys = ON"),{db:e(s),runRaw:(n,r=[])=>s.prepare(n).run(...r),close:()=>s.close()}}var _t=new Set,Ut={agent_id:"TEXT",status:"TEXT DEFAULT 'running'",started_at:"TEXT",trace_id:"TEXT",parent_task_id:"TEXT",crewx_version:"TEXT",pid:"INTEGER",thread_id:"TEXT",workspace_id:"TEXT",workspace_ref:"TEXT",workspace_name:"TEXT",project_id:"TEXT",project_name:"TEXT"};function Mt(d,t){return (d.get(`SELECT count(*) as cnt FROM sqlite_master WHERE type='table' AND name='${t}'`)?.cnt??0)>0}function $t(d,t){if(t>0||!Mt(d,"tasks"))return;let e=d.all("PRAGMA table_info(tasks)"),s=new Set(e.map(n=>n.name));for(let[n,r]of Object.entries(Ut))s.has(n)||d.run(`ALTER TABLE tasks ADD COLUMN ${n} ${r}`);}function Ft(d){let{migrate:t}=W("drizzle-orm/better-sqlite3/migrator"),{sql:e}=W("drizzle-orm"),s=[j__default.join(g,"../migrations"),j__default.join(g,"migrations"),j__default.join(g,"../../../../drizzle/migrations"),j__default.join(process.cwd(),"drizzle/migrations")],n=s.find(p=>existsSync(j__default.join(p,"meta/_journal.json")));if(!n)throw new Error(`migrations folder not found. Searched:
12
12
  ${s.join(`
13
- `)}`);let r=d.get(e`SELECT count(*) as cnt FROM sqlite_master WHERE type='table' AND name='__drizzle_migrations'`),i=0;r?.cnt&&(i=d.get(e`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0),t(d,{migrationsFolder:n});let a=(d.get(e`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0)-i;if(a>0){let p=r?.cnt?"Database migrated":"Database initialized";console.log(`[crewx] ${p} (${a} migration${a>1?"s":""} applied).`);}}function G(d,t){_t.has(t)||(Ut(d),_t.add(t));}var c=class extends Error{code;cause;constructor(t,e,s){super(e),this.name="RepositoryError",this.code=t,this.cause=s,Object.setPrototypeOf(this,new.target.prototype);}};var q=sqliteTable("workspaces",{id:text("id").primaryKey(),slug:text("slug").notNull().unique(),name:text("name").notNull(),workspace_path:text("workspace_path"),description:text("description"),is_active:integer("is_active").notNull().default(1),created_at:text("created_at").notNull(),updated_at:text("updated_at").notNull()});var o=sqliteTable("tasks",{id:text("id").primaryKey(),agent_id:text("agent_id").notNull(),user_id:text("user_id"),prompt:text("prompt").notNull(),mode:text("mode").notNull().default("execute"),status:text("status").notNull().default("running"),result:text("result"),error:text("error"),started_at:text("started_at").notNull(),completed_at:text("completed_at"),duration_ms:integer("duration_ms"),metadata:text("metadata"),workspace_id:text("workspace_id"),workspace_name:text("workspace_name"),trace_id:text("trace_id"),parent_task_id:text("parent_task_id"),caller_agent_id:text("caller_agent_id"),model:text("model"),platform:text("platform").default("cli"),crewx_version:text("crewx_version"),input_tokens:integer("input_tokens").default(0),output_tokens:integer("output_tokens").default(0),cost_usd:real("cost_usd").default(0),pid:integer("pid"),rendered_prompt:text("rendered_prompt"),command:text("command"),coding_agent_command:text("coding_agent_command"),exit_code:integer("exit_code"),logs:text("logs"),thread_id:text("thread_id"),workspace_ref:text("workspace_ref"),project_id:text("project_id"),project_name:text("project_name"),project_ref:text("project_ref"),cached_input_tokens:integer("cached_input_tokens").default(0)},d=>({idx_tasks_agent_id:index("idx_tasks_agent_id").on(d.agent_id),idx_tasks_status:index("idx_tasks_status").on(d.status),idx_tasks_started_at:index("idx_tasks_started_at").on(d.started_at),idx_tasks_trace_id:index("idx_tasks_trace_id").on(d.trace_id),idx_tasks_parent_task_id:index("idx_tasks_parent_task_id").on(d.parent_task_id),idx_tasks_crewx_version:index("idx_tasks_crewx_version").on(d.crewx_version),idx_tasks_pid:index("idx_tasks_pid").on(d.pid),idx_tasks_thread_id:index("idx_tasks_thread_id").on(d.thread_id),idx_tasks_workspace_id:index("idx_tasks_workspace_id").on(d.workspace_id),idx_tasks_workspace_ref:index("idx_tasks_workspace_ref").on(d.workspace_ref),idx_tasks_project_id:index("idx_tasks_project_id").on(d.project_id),idx_tasks_ws_started:index("idx_tasks_ws_started").on(d.workspace_id,d.started_at)}));var u=sqliteTable("threads",{id:text("id").primaryKey(),workspace_id:text("workspace_id").references(()=>q.id,{onDelete:"set null"}),platform:text("platform").notNull().default("cli"),title:text("title"),first_message:text("first_message"),last_message:text("last_message"),message_count:integer("message_count").notNull().default(0),created_at:text("created_at").notNull(),updated_at:text("updated_at").notNull(),metadata:text("metadata"),title_locked:integer("title_locked").notNull().default(0)},d=>({idx_threads_updated_at:index("idx_threads_updated_at").on(d.updated_at),idx_threads_workspace_id:index("idx_threads_workspace_id").on(d.workspace_id)}));var jt=sqliteTable("spans",{id:text("id").primaryKey(),task_id:text("task_id").references(()=>o.id,{onDelete:"set null"}),parent_span_id:text("parent_span_id").references(()=>jt.id,{onDelete:"set null"}),name:text("name").notNull(),kind:text("kind").notNull().default("internal"),status:text("status").notNull().default("ok"),started_at:text("started_at").notNull(),completed_at:text("completed_at"),duration_ms:integer("duration_ms"),input:text("input"),output:text("output"),error:text("error"),attributes:text("attributes")},d=>({idx_spans_task_id:index("idx_spans_task_id").on(d.task_id),idx_spans_parent_span_id:index("idx_spans_parent_span_id").on(d.parent_span_id)}));sqliteTable("tool_calls",{id:text("id").primaryKey(),task_id:text("task_id").references(()=>o.id,{onDelete:"cascade"}),session_id:text("session_id"),tool_name:text("tool_name").notNull(),files:text("files"),input:text("input"),output:text("output"),duration_ms:integer("duration_ms"),timestamp:text("timestamp").notNull()},d=>({idx_tool_calls_task_id:index("idx_tool_calls_task_id").on(d.task_id),idx_tool_calls_tool_name:index("idx_tool_calls_tool_name").on(d.tool_name),idx_tool_calls_timestamp:index("idx_tool_calls_timestamp").on(d.timestamp)}));sqliteTable("thread_boxes",{id:text("id").primaryKey(),thread_id:text("thread_id").notNull().references(()=>u.id,{onDelete:"cascade"}),seq:integer("seq").notNull(),first_task_id:text("first_task_id").notNull(),mid_task_id:text("mid_task_id").notNull(),last_task_id:text("last_task_id").notNull(),task_count:integer("task_count").notNull(),summary:text("summary"),source_tokens:integer("source_tokens").notNull(),summary_tokens:integer("summary_tokens"),created_at:text("created_at").notNull()},d=>({idx_thread_boxes_thread_id:index("idx_thread_boxes_thread_id").on(d.thread_id),idx_thread_boxes_seq:index("idx_thread_boxes_seq").on(d.thread_id,d.seq),uniq_thread_boxes_thread_seq:unique().on(d.thread_id,d.seq)}));sqliteTable("request_logs",{id:text("id").primaryKey(),path:text("path").notNull(),method:text("method").notNull(),status_code:integer("status_code").notNull(),duration_ms:integer("duration_ms").notNull(),ip:text("ip"),request_headers:text("request_headers"),response_headers:text("response_headers"),request_body:text("request_body"),response_body:text("response_body"),query:text("query"),user_id:text("user_id"),project_id:text("project_id"),partition_key:text("partition_key").notNull(),timestamp:text("timestamp").notNull().default(sql`(datetime('now'))`),metadata:text("metadata")},d=>({idx_request_logs_timestamp:index("idx_request_logs_timestamp").on(d.timestamp),idx_request_logs_path:index("idx_request_logs_path").on(d.path),idx_request_logs_status_code:index("idx_request_logs_status_code").on(d.status_code),idx_request_logs_partition_key:index("idx_request_logs_partition_key").on(d.partition_key)}));var V=class extends B{dbPath;constructor(t={}){super(),t.dbPath?this.dbPath=t.dbPath:t.dbRoot&&(this.dbPath=join(t.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(t){let e=this.resolveDbPath();if(t){let n=dirname(e);existsSync(n)||mkdirSync(n,{recursive:true});}else if(!existsSync(e))throw new c("NOT_FOUND","Database not found");let s=b(e);if(t)try{G(s.db,e);}catch(n){throw s.close(),n}return s}startTask(t){let e=this.openHandle(true);try{e.db.insert(o).values({id:t.id,agent_id:t.agentId,prompt:t.prompt,mode:t.mode,status:t.status,started_at:t.startedAt,pid:t.pid??null,parent_task_id:t.parentTaskId??null,caller_agent_id:t.callerAgentId??null,trace_id:t.traceId??null,command:t.command??null,metadata:t.metadata??null,workspace_id:t.workspaceId??null,workspace_name:t.workspaceName??null,platform:t.platform??"cli",crewx_version:t.crewxVersion??null,thread_id:t.threadId??null,model:t.model??null,rendered_prompt:t.renderedPrompt??null,coding_agent_command:t.codingAgentCommand??null}).onConflictDoNothing().run();}catch(s){throw s instanceof c?s:new c("DB_ERROR","Failed to start task",s)}finally{e.close();}}finishTask(t){let e=this.openHandle(true);try{e.runRaw(`UPDATE tasks SET status=?, result=?, error=?, completed_at=?, duration_ms=?,
13
+ `)}`);let r=d.get(e`SELECT count(*) as cnt FROM sqlite_master WHERE type='table' AND name='__drizzle_migrations'`),i=0;r?.cnt&&(i=d.get(e`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0),$t(d,i),t(d,{migrationsFolder:n});let l=(d.get(e`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0)-i;if(l>0){let p=r?.cnt?"Database migrated":"Database initialized";console.log(`[crewx] ${p} (${l} migration${l>1?"s":""} applied).`);}}function X(d,t){_t.has(t)||(Ft(d),_t.add(t));}var c=class extends Error{code;cause;constructor(t,e,s){super(e),this.name="RepositoryError",this.code=t,this.cause=s,Object.setPrototypeOf(this,new.target.prototype);}};var q=sqliteTable("workspaces",{id:text("id").primaryKey(),slug:text("slug").notNull().unique(),name:text("name").notNull(),workspace_path:text("workspace_path"),description:text("description"),is_active:integer("is_active").notNull().default(1),created_at:text("created_at").notNull(),updated_at:text("updated_at").notNull()});var o=sqliteTable("tasks",{id:text("id").primaryKey(),agent_id:text("agent_id").notNull(),user_id:text("user_id"),prompt:text("prompt").notNull(),mode:text("mode").notNull().default("execute"),status:text("status").notNull().default("running"),result:text("result"),error:text("error"),started_at:text("started_at").notNull(),completed_at:text("completed_at"),duration_ms:integer("duration_ms"),metadata:text("metadata"),workspace_id:text("workspace_id"),trace_id:text("trace_id"),parent_task_id:text("parent_task_id"),caller_agent_id:text("caller_agent_id"),model:text("model"),platform:text("platform").default("cli"),crewx_version:text("crewx_version"),input_tokens:integer("input_tokens").default(0),output_tokens:integer("output_tokens").default(0),cost_usd:real("cost_usd").default(0),pid:integer("pid"),rendered_prompt:text("rendered_prompt"),command:text("command"),coding_agent_command:text("coding_agent_command"),exit_code:integer("exit_code"),logs:text("logs"),thread_id:text("thread_id"),workspace_ref:text("workspace_ref"),project_id:text("project_id"),project_ref:text("project_ref"),cached_input_tokens:integer("cached_input_tokens").default(0)},d=>({idx_tasks_agent_id:index("idx_tasks_agent_id").on(d.agent_id),idx_tasks_status:index("idx_tasks_status").on(d.status),idx_tasks_started_at:index("idx_tasks_started_at").on(d.started_at),idx_tasks_trace_id:index("idx_tasks_trace_id").on(d.trace_id),idx_tasks_parent_task_id:index("idx_tasks_parent_task_id").on(d.parent_task_id),idx_tasks_crewx_version:index("idx_tasks_crewx_version").on(d.crewx_version),idx_tasks_pid:index("idx_tasks_pid").on(d.pid),idx_tasks_thread_id:index("idx_tasks_thread_id").on(d.thread_id),idx_tasks_workspace_id:index("idx_tasks_workspace_id").on(d.workspace_id),idx_tasks_workspace_ref:index("idx_tasks_workspace_ref").on(d.workspace_ref),idx_tasks_project_id:index("idx_tasks_project_id").on(d.project_id),idx_tasks_ws_started:index("idx_tasks_ws_started").on(d.workspace_id,d.started_at)}));var u=sqliteTable("threads",{id:text("id").primaryKey(),workspace_id:text("workspace_id").references(()=>q.id,{onDelete:"set null"}),platform:text("platform").notNull().default("cli"),title:text("title"),first_message:text("first_message"),last_message:text("last_message"),message_count:integer("message_count").notNull().default(0),created_at:text("created_at").notNull(),updated_at:text("updated_at").notNull(),metadata:text("metadata"),title_locked:integer("title_locked").notNull().default(0)},d=>({idx_threads_updated_at:index("idx_threads_updated_at").on(d.updated_at),idx_threads_workspace_id:index("idx_threads_workspace_id").on(d.workspace_id)}));var Gt=sqliteTable("spans",{id:text("id").primaryKey(),task_id:text("task_id").references(()=>o.id,{onDelete:"set null"}),parent_span_id:text("parent_span_id").references(()=>Gt.id,{onDelete:"set null"}),name:text("name").notNull(),kind:text("kind").notNull().default("internal"),status:text("status").notNull().default("ok"),started_at:text("started_at").notNull(),completed_at:text("completed_at"),duration_ms:integer("duration_ms"),input:text("input"),output:text("output"),error:text("error"),attributes:text("attributes")},d=>({idx_spans_task_id:index("idx_spans_task_id").on(d.task_id),idx_spans_parent_span_id:index("idx_spans_parent_span_id").on(d.parent_span_id)}));sqliteTable("tool_calls",{id:text("id").primaryKey(),task_id:text("task_id").references(()=>o.id,{onDelete:"cascade"}),session_id:text("session_id"),tool_name:text("tool_name").notNull(),files:text("files"),input:text("input"),output:text("output"),duration_ms:integer("duration_ms"),timestamp:text("timestamp").notNull()},d=>({idx_tool_calls_task_id:index("idx_tool_calls_task_id").on(d.task_id),idx_tool_calls_tool_name:index("idx_tool_calls_tool_name").on(d.tool_name),idx_tool_calls_timestamp:index("idx_tool_calls_timestamp").on(d.timestamp)}));sqliteTable("thread_boxes",{id:text("id").primaryKey(),thread_id:text("thread_id").notNull().references(()=>u.id,{onDelete:"cascade"}),seq:integer("seq").notNull(),first_task_id:text("first_task_id").notNull(),mid_task_id:text("mid_task_id").notNull(),last_task_id:text("last_task_id").notNull(),task_count:integer("task_count").notNull(),summary:text("summary"),source_tokens:integer("source_tokens").notNull(),summary_tokens:integer("summary_tokens"),created_at:text("created_at").notNull()},d=>({idx_thread_boxes_thread_id:index("idx_thread_boxes_thread_id").on(d.thread_id),idx_thread_boxes_seq:index("idx_thread_boxes_seq").on(d.thread_id,d.seq),uniq_thread_boxes_thread_seq:unique().on(d.thread_id,d.seq)}));sqliteTable("request_logs",{id:text("id").primaryKey(),path:text("path").notNull(),method:text("method").notNull(),status_code:integer("status_code").notNull(),duration_ms:integer("duration_ms").notNull(),ip:text("ip"),request_headers:text("request_headers"),response_headers:text("response_headers"),request_body:text("request_body"),response_body:text("response_body"),query:text("query"),user_id:text("user_id"),project_id:text("project_id"),partition_key:text("partition_key").notNull(),timestamp:text("timestamp").notNull().default(sql`(datetime('now'))`),metadata:text("metadata")},d=>({idx_request_logs_timestamp:index("idx_request_logs_timestamp").on(d.timestamp),idx_request_logs_path:index("idx_request_logs_path").on(d.path),idx_request_logs_status_code:index("idx_request_logs_status_code").on(d.status_code),idx_request_logs_partition_key:index("idx_request_logs_partition_key").on(d.partition_key)}));var V=class extends B{dbPath;constructor(t={}){super(),t.dbPath?this.dbPath=t.dbPath:t.dbRoot&&(this.dbPath=join(t.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(t){let e=this.resolveDbPath();if(t){let n=dirname(e);existsSync(n)||mkdirSync(n,{recursive:true});}else if(!existsSync(e))throw new c("NOT_FOUND","Database not found");let s=b(e);if(t)try{X(s.db,e);}catch(n){throw s.close(),n}return s}startTask(t){let e=this.openHandle(true);try{e.db.insert(o).values({id:t.id,agent_id:t.agentId,prompt:t.prompt,mode:t.mode,status:t.status,started_at:t.startedAt,pid:t.pid??null,parent_task_id:t.parentTaskId??null,caller_agent_id:t.callerAgentId??null,trace_id:t.traceId??null,command:t.command??null,metadata:t.metadata??null,workspace_id:t.workspaceId??null,platform:t.platform??"cli",crewx_version:t.crewxVersion??null,thread_id:t.threadId??null,model:t.model??null,rendered_prompt:t.renderedPrompt??null,coding_agent_command:t.codingAgentCommand??null}).onConflictDoNothing().run();}catch(s){throw s instanceof c?s:new c("DB_ERROR","Failed to start task",s)}finally{e.close();}}finishTask(t){let e=this.openHandle(true);try{e.runRaw(`UPDATE tasks SET status=?, result=?, error=?, completed_at=?, duration_ms=?,
14
14
  exit_code=?, input_tokens=?, output_tokens=?, cached_input_tokens=?, cost_usd=?,
15
- model=COALESCE(?, model) WHERE id=?`,[t.status,t.result??null,t.error??null,t.completedAt,t.durationMs??null,t.exitCode??null,t.inputTokens??0,t.outputTokens??0,t.cachedInputTokens??0,t.costUsd??0,t.model??null,t.id]);}catch(s){throw s instanceof c?s:new c("DB_ERROR","Failed to finish task",s)}finally{e.close();}}appendLog(t,e){let s=this.openHandle(true);try{s.db.transaction(n=>{let r=n.select({logs:o.logs}).from(o).where(eq(o.id,t)).limit(1).get(),i=r?.logs?JSON.parse(r.logs):[];i.push(e),n.update(o).set({logs:JSON.stringify(i)}).where(eq(o.id,t)).run();},{behavior:"immediate"});}catch(n){throw n instanceof c?n:new c("DB_ERROR","Failed to append log",n)}finally{s.close();}}getRunningTasks(){if(!this.dbExists())return [];let t=this.openHandle(false);try{return t.db.select().from(o).where(eq(o.status,"running")).orderBy(desc(o.started_at)).all()}catch(e){throw new c("DB_ERROR","Failed to get running tasks",e)}finally{t.close();}}getAllTasks(){if(!this.dbExists())return [];let t=this.openHandle(false);try{return t.db.select().from(o).orderBy(desc(o.started_at)).limit(100).all()}catch(e){throw new c("DB_ERROR","Failed to get all tasks",e)}finally{t.close();}}getTask(t){if(!this.dbExists())return;let e=this.openHandle(false);try{return e.db.select().from(o).where(eq(o.id,t)).limit(1).get()??void 0}catch(s){throw new c("DB_ERROR","Failed to get task",s)}finally{e.close();}}killTask(t){if(!this.dbExists())return {killed:false};let e=this.openHandle(true);try{let s=e.db.select({id:o.id,status:o.status,pid:o.pid}).from(o).where(eq(o.id,t)).limit(1).get();if(!s||s.status!=="running")return {killed:!1};if(s.pid)try{process.kill(s.pid,"SIGTERM");}catch{}return e.db.update(o).set({status:"failed",error:"Killed by user",completed_at:new Date().toISOString()}).where(and(eq(o.id,t),eq(o.status,"running"))).run(),{killed:!0,pid:s.pid??void 0}}catch(s){throw s instanceof c?s:new c("DB_ERROR","Failed to kill task",s)}finally{e.close();}}findTaskStatus(t,e){let s=this.resolveDbPaths();for(let n of s){if(!existsSync(n))continue;let r=b(n);try{let i=e?eq(o.workspace_id,e):void 0,l=i?and(eq(o.id,t),i):eq(o.id,t),a=r.db.select().from(o).where(l).limit(1).get()??void 0;if(!a){let p=or(eq(o.thread_id,t),and(isNull(o.thread_id),like(o.command,`%--thread=${t}%`))),_=i?and(p,i):p;a=r.db.select().from(o).where(_).orderBy(desc(o.started_at)).limit(1).get()??void 0;}if(a)return a}catch(i){throw new c("DB_ERROR","Failed to find task status",i)}finally{r.close();}}}findChildTasks(t,e){let s=this.resolveDbPaths(),n=new Set,r=[];for(let i of s){if(!existsSync(i))continue;let l=b(i);try{let a=e?and(eq(o.parent_task_id,t),eq(o.workspace_id,e)):eq(o.parent_task_id,t),p=l.db.select().from(o).where(a).orderBy(asc(o.started_at)).all();for(let _ of p)n.has(_.id)||(n.add(_.id),r.push(_));}catch(a){throw new c("DB_ERROR","Failed to find child tasks",a)}finally{l.close();}}return r}getWorkspaceUsageSummary(t){if(!this.dbExists())return [];let e=this.openHandle(false);try{return e.db.all(t?sql`
15
+ model=COALESCE(?, model) WHERE id=?`,[t.status,t.result??null,t.error??null,t.completedAt,t.durationMs??null,t.exitCode??null,t.inputTokens??0,t.outputTokens??0,t.cachedInputTokens??0,t.costUsd??0,t.model??null,t.id]);}catch(s){throw s instanceof c?s:new c("DB_ERROR","Failed to finish task",s)}finally{e.close();}}appendLog(t,e){let s=this.openHandle(true);try{s.db.transaction(n=>{let r=n.select({logs:o.logs}).from(o).where(eq(o.id,t)).limit(1).get(),i=r?.logs?JSON.parse(r.logs):[];i.push(e),n.update(o).set({logs:JSON.stringify(i)}).where(eq(o.id,t)).run();},{behavior:"immediate"});}catch(n){throw n instanceof c?n:new c("DB_ERROR","Failed to append log",n)}finally{s.close();}}getRunningTasks(){if(!this.dbExists())return [];let t=this.openHandle(false);try{return t.db.select().from(o).where(eq(o.status,"running")).orderBy(desc(o.started_at)).all()}catch(e){throw new c("DB_ERROR","Failed to get running tasks",e)}finally{t.close();}}getAllTasks(){if(!this.dbExists())return [];let t=this.openHandle(false);try{return t.db.select().from(o).orderBy(desc(o.started_at)).limit(100).all()}catch(e){throw new c("DB_ERROR","Failed to get all tasks",e)}finally{t.close();}}getTask(t){if(!this.dbExists())return;let e=this.openHandle(false);try{return e.db.select().from(o).where(eq(o.id,t)).limit(1).get()??void 0}catch(s){throw new c("DB_ERROR","Failed to get task",s)}finally{e.close();}}killTask(t){if(!this.dbExists())return {killed:false};let e=this.openHandle(true);try{let s=e.db.select({id:o.id,status:o.status,pid:o.pid}).from(o).where(eq(o.id,t)).limit(1).get();if(!s||s.status!=="running")return {killed:!1};if(s.pid)try{process.kill(s.pid,"SIGTERM");}catch{}return e.db.update(o).set({status:"failed",error:"Killed by user",completed_at:new Date().toISOString()}).where(and(eq(o.id,t),eq(o.status,"running"))).run(),{killed:!0,pid:s.pid??void 0}}catch(s){throw s instanceof c?s:new c("DB_ERROR","Failed to kill task",s)}finally{e.close();}}findTaskStatus(t,e){let s=this.resolveDbPaths();for(let n of s){if(!existsSync(n))continue;let r=b(n);try{let i=e?eq(o.workspace_id,e):void 0,a=i?and(eq(o.id,t),i):eq(o.id,t),l=r.db.select().from(o).where(a).limit(1).get()??void 0;if(!l){let p=or(eq(o.thread_id,t),and(isNull(o.thread_id),like(o.command,`%--thread=${t}%`))),_=i?and(p,i):p;l=r.db.select().from(o).where(_).orderBy(desc(o.started_at)).limit(1).get()??void 0;}if(l)return l}catch(i){throw new c("DB_ERROR","Failed to find task status",i)}finally{r.close();}}}findChildTasks(t,e){let s=this.resolveDbPaths(),n=new Set,r=[];for(let i of s){if(!existsSync(i))continue;let a=b(i);try{let l=e?and(eq(o.parent_task_id,t),eq(o.workspace_id,e)):eq(o.parent_task_id,t),p=a.db.select().from(o).where(l).orderBy(asc(o.started_at)).all();for(let _ of p)n.has(_.id)||(n.add(_.id),r.push(_));}catch(l){throw new c("DB_ERROR","Failed to find child tasks",l)}finally{a.close();}}return r}getWorkspaceUsageSummary(t){if(!this.dbExists())return [];let e=this.openHandle(false);try{return e.db.all(t?sql`
16
16
  SELECT
17
17
  COALESCE(workspace_id, 'unknown') AS workspace_id,
18
- COALESCE(workspace_name, 'Unknown Workspace') AS workspace_name,
19
18
  COALESCE(SUM(input_tokens), 0) AS input_tokens,
20
19
  COALESCE(SUM(output_tokens), 0) AS output_tokens,
21
20
  COALESCE(SUM(cost_usd), 0) AS cost_usd,
22
21
  COUNT(*) AS task_count
23
22
  FROM tasks
24
23
  WHERE workspace_id = ${t}
25
- GROUP BY workspace_id, workspace_name
24
+ GROUP BY workspace_id
26
25
  ORDER BY (COALESCE(SUM(input_tokens), 0) + COALESCE(SUM(output_tokens), 0)) DESC
27
26
  `:sql`
28
27
  SELECT
29
28
  COALESCE(workspace_id, 'unknown') AS workspace_id,
30
- COALESCE(workspace_name, 'Unknown Workspace') AS workspace_name,
31
29
  COALESCE(SUM(input_tokens), 0) AS input_tokens,
32
30
  COALESCE(SUM(output_tokens), 0) AS output_tokens,
33
31
  COALESCE(SUM(cost_usd), 0) AS cost_usd,
34
32
  COUNT(*) AS task_count
35
33
  FROM tasks
36
- GROUP BY workspace_id, workspace_name
34
+ GROUP BY workspace_id
37
35
  ORDER BY (COALESCE(SUM(input_tokens), 0) + COALESCE(SUM(output_tokens), 0)) DESC
38
- `)}catch(s){throw new c("DB_ERROR","Failed to get workspace usage summary",s)}finally{e.close();}}getThreadTokenUsage(t,e){let s=this.resolveDbPaths(),n=new Set,r=0,i=0,l=0;for(let a of s){if(!existsSync(a))continue;let p=b(a);try{let _=or(eq(o.thread_id,t),and(isNull(o.thread_id),like(o.command,`%--thread=${t}%`))),k=e?and(_,eq(o.workspace_id,e)):_,A=p.db.select({id:o.id,input_tokens:o.input_tokens,output_tokens:o.output_tokens,cost_usd:o.cost_usd}).from(o).where(k).all();for(let P of A)n.has(P.id)||(n.add(P.id),r+=P.input_tokens??0,i+=P.output_tokens??0,l+=P.cost_usd??0);}catch(_){throw new c("DB_ERROR","Failed to get thread token usage",_)}finally{p.close();}}return {inputTokens:r,outputTokens:i,costUsd:l}}findTasksByThread(t,e){let s=this.resolveDbPaths(),n=new Set,r=[];for(let i of s){if(!existsSync(i))continue;let l=b(i);try{let a=or(eq(o.thread_id,t),and(isNull(o.thread_id),like(o.command,`%--thread=${t}%`))),p=e?and(a,eq(o.workspace_id,e)):a,_=l.db.select().from(o).where(p).orderBy(asc(o.started_at)).all();for(let k of _)n.has(k.id)||(n.add(k.id),r.push(k));}catch(a){throw new c("DB_ERROR","Failed to find tasks by thread",a)}finally{l.close();}}return r}findAllTasks(t){if(!this.dbExists())return {rows:[],total:0};let e=this.openHandle(false);try{let s=[];t.workspaceId&&s.push(eq(o.workspace_id,t.workspaceId));let n=t.agents&&t.agents.length>0?t.agents:t.agentId?[t.agentId]:null;n&&s.push(inArray(o.agent_id,n));let r=t.statuses&&t.statuses.length>0?t.statuses:t.status?[t.status]:null;r&&s.push(inArray(o.status,r));let i=t.q??t.search;i&&s.push(like(o.prompt,`%${i}%`)),t.from&&s.push(gte(o.started_at,t.from)),t.to&&s.push(lt(o.started_at,t.to));let l=s.length>0?and(...s):void 0,a=e.db.select({count:sql`count(*)`}).from(o).where(l).get(),p=(t.sortDir??"DESC")==="ASC"?asc(o.started_at):desc(o.started_at);return {rows:e.db.select().from(o).where(l).orderBy(p).limit(t.limit).offset(t.offset).all(),total:a?.count??0}}catch(s){throw new c("DB_ERROR","Failed to find all tasks",s)}finally{e.close();}}getAgentUsage(t,e,s){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.all(s?sql`
36
+ `)}catch(s){throw new c("DB_ERROR","Failed to get workspace usage summary",s)}finally{e.close();}}getThreadTokenUsage(t,e){let s=this.resolveDbPaths(),n=new Set,r=0,i=0,a=0;for(let l of s){if(!existsSync(l))continue;let p=b(l);try{let _=or(eq(o.thread_id,t),and(isNull(o.thread_id),like(o.command,`%--thread=${t}%`))),k=e?and(_,eq(o.workspace_id,e)):_,$=p.db.select({id:o.id,input_tokens:o.input_tokens,output_tokens:o.output_tokens,cost_usd:o.cost_usd}).from(o).where(k).all();for(let v of $)n.has(v.id)||(n.add(v.id),r+=v.input_tokens??0,i+=v.output_tokens??0,a+=v.cost_usd??0);}catch(_){throw new c("DB_ERROR","Failed to get thread token usage",_)}finally{p.close();}}return {inputTokens:r,outputTokens:i,costUsd:a}}findTasksByThread(t,e){let s=this.resolveDbPaths(),n=new Set,r=[];for(let i of s){if(!existsSync(i))continue;let a=b(i);try{let l=or(eq(o.thread_id,t),and(isNull(o.thread_id),like(o.command,`%--thread=${t}%`))),p=e?and(l,eq(o.workspace_id,e)):l,_=a.db.select().from(o).where(p).orderBy(asc(o.started_at)).all();for(let k of _)n.has(k.id)||(n.add(k.id),r.push(k));}catch(l){throw new c("DB_ERROR","Failed to find tasks by thread",l)}finally{a.close();}}return r}findAllTasks(t){if(!this.dbExists())return {rows:[],total:0};let e=this.openHandle(false);try{let s=[];t.workspaceId&&s.push(eq(o.workspace_id,t.workspaceId));let n=t.agents&&t.agents.length>0?t.agents:t.agentId?[t.agentId]:null;n&&s.push(inArray(o.agent_id,n));let r=t.statuses&&t.statuses.length>0?t.statuses:t.status?[t.status]:null;r&&s.push(inArray(o.status,r));let i=t.q??t.search;i&&s.push(like(o.prompt,`%${i}%`)),t.from&&s.push(gte(o.started_at,t.from)),t.to&&s.push(lt(o.started_at,t.to));let a=s.length>0?and(...s):void 0,l=e.db.select({count:sql`count(*)`}).from(o).where(a).get(),p=(t.sortDir??"DESC")==="ASC"?asc(o.started_at):desc(o.started_at);return {rows:e.db.select().from(o).where(a).orderBy(p).limit(t.limit).offset(t.offset).all(),total:l?.count??0}}catch(s){throw new c("DB_ERROR","Failed to find all tasks",s)}finally{e.close();}}getAgentUsage(t,e,s){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.all(s?sql`
39
37
  SELECT
40
38
  t.agent_id,
41
39
  t.workspace_id,
42
- t.workspace_name,
43
40
  COUNT(*) AS total_tasks,
44
41
  COALESCE(SUM(t.input_tokens), 0) AS input_tokens,
45
42
  COALESCE(SUM(t.output_tokens), 0) AS output_tokens,
@@ -49,14 +46,13 @@ ${s.join(`
49
46
  WHERE t.status IN ('completed', 'success')
50
47
  AND t.started_at >= ${t}
51
48
  AND t.started_at < ${e}
52
- AND t.workspace_name = ${s}
53
- GROUP BY t.agent_id, t.workspace_id, t.workspace_name
49
+ AND t.workspace_id = ${s}
50
+ GROUP BY t.agent_id, t.workspace_id
54
51
  ORDER BY (COALESCE(SUM(t.input_tokens), 0) + COALESCE(SUM(t.output_tokens), 0)) DESC
55
52
  `:sql`
56
53
  SELECT
57
54
  t.agent_id,
58
55
  t.workspace_id,
59
- t.workspace_name,
60
56
  COUNT(*) AS total_tasks,
61
57
  COALESCE(SUM(t.input_tokens), 0) AS input_tokens,
62
58
  COALESCE(SUM(t.output_tokens), 0) AS output_tokens,
@@ -66,9 +62,9 @@ ${s.join(`
66
62
  WHERE t.status IN ('completed', 'success')
67
63
  AND t.started_at >= ${t}
68
64
  AND t.started_at < ${e}
69
- GROUP BY t.agent_id, t.workspace_id, t.workspace_name
65
+ GROUP BY t.agent_id, t.workspace_id
70
66
  ORDER BY (COALESCE(SUM(t.input_tokens), 0) + COALESCE(SUM(t.output_tokens), 0)) DESC
71
- `).map(i=>({agentId:i.agent_id,workspaceId:i.workspace_id??null,workspaceName:i.workspace_name??null,totalTasks:i.total_tasks,inputTokens:i.input_tokens,outputTokens:i.output_tokens,cachedInputTokens:i.cached_input_tokens,costUsd:i.cost_usd}))}catch(r){throw new c("DB_ERROR","Failed to get agent usage",r)}finally{n.close();}}getAgentUsageTrendRaw(t,e,s){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.all(s?sql`
67
+ `).map(i=>({agentId:i.agent_id,workspaceId:i.workspace_id??null,totalTasks:i.total_tasks,inputTokens:i.input_tokens,outputTokens:i.output_tokens,cachedInputTokens:i.cached_input_tokens,costUsd:i.cost_usd}))}catch(r){throw new c("DB_ERROR","Failed to get agent usage",r)}finally{n.close();}}getAgentUsageTrendRaw(t,e,s){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.all(s?sql`
72
68
  SELECT
73
69
  date(t.started_at) AS date,
74
70
  t.agent_id,
@@ -80,7 +76,7 @@ ${s.join(`
80
76
  WHERE t.status IN ('completed', 'success')
81
77
  AND t.started_at >= ${t}
82
78
  AND t.started_at < ${e}
83
- AND t.workspace_name = ${s}
79
+ AND t.workspace_id = ${s}
84
80
  GROUP BY date(t.started_at), t.agent_id
85
81
  ORDER BY date(t.started_at) ASC
86
82
  `:sql`
@@ -97,13 +93,13 @@ ${s.join(`
97
93
  AND t.started_at < ${e}
98
94
  GROUP BY date(t.started_at), t.agent_id
99
95
  ORDER BY date(t.started_at) ASC
100
- `).map(i=>({date:i.date,agentId:i.agent_id,inputTokens:i.input_tokens,outputTokens:i.output_tokens,cachedInputTokens:i.cached_input_tokens,costUsd:i.cost_usd}))}catch(r){throw new c("DB_ERROR","Failed to get agent usage trend",r)}finally{n.close();}}findTaskForStop(t,e){if(!this.dbExists())return;let s=this.openHandle(false);try{return s.db.select().from(o).where(and(eq(o.id,t),eq(o.workspace_id,e))).limit(1).get()??void 0}catch(n){throw new c("DB_ERROR","Failed to find task for stop",n)}finally{s.close();}}markTaskFailed(t,e,s){if(!this.dbExists())return;let n=this.openHandle(true);try{let r=new Date().toISOString(),i=s?and(eq(o.id,t),eq(o.status,"running"),eq(o.workspace_id,s)):and(eq(o.id,t),eq(o.status,"running"));n.db.update(o).set({status:"failed",error:e,completed_at:r}).where(i).run();}catch(r){throw r instanceof c?r:new c("DB_ERROR","Failed to mark task failed",r)}finally{n.close();}}findTasksByPromptHint(t,e){let s=this.resolveDbPaths(),n=new Set,r=[];for(let i of s){if(!existsSync(i))continue;let l=b(i);try{let a=e?and(like(o.prompt,`%${t}%`),eq(o.workspace_id,e)):like(o.prompt,`%${t}%`),p=l.db.select().from(o).where(a).orderBy(asc(o.started_at)).all();for(let _ of p)n.has(_.id)||(n.add(_.id),r.push(_));}catch(a){throw new c("DB_ERROR","Failed to find tasks by prompt hint",a)}finally{l.close();}}return r}};var it=class extends O{name="sqlite-tracing";unsubs=[];dbPath;version;constructor(t){super(),this.dbPath=join(t?.dbRoot??homedir(),".crewx","crewx.db"),this.version=t?.version??"unknown";}attach(t){let e=new V({dbPath:this.dbPath}),s=process.cwd(),n=existsSync(join(s,"crewx.yaml"))||existsSync(join(s,"crewx.yml")),r=n?pt(s):null,i=n?basename(s):null,l=process.argv.join(" ");this.unsubs.push(t.on("task:start",a=>{try{let p=process.env.CREWX_CALLER_AGENT_ID||null,_=process.env.CREWX_PARENT_TASK_ID||null,k=process.env.CREWX_TRACE_ID||a.traceId,A=a.metadata?JSON.stringify(a.metadata):JSON.stringify({provider:a.provider??"cli/claude"});e.startTask({id:a.traceId,agentId:a.agentRef.replace(/^@/,""),prompt:a.message,mode:a.mode,status:"running",pid:a.pid??null,startedAt:a.timestamp.toISOString(),crewxVersion:this.version,platform:a.platform??"cli",model:a.model??null,renderedPrompt:a.renderedPrompt??null,command:l,codingAgentCommand:a.codingAgentCommand??null,workspaceId:a.workspaceId??r,workspaceName:a.workspaceName??i,callerAgentId:p,parentTaskId:_,traceId:k,metadata:A,threadId:a.threadId??null});}catch{}}),t.on("task:output",a=>{try{e.appendLog(a.traceId,{timestamp:a.timestamp.toISOString(),level:a.level??"stdout",message:a.output});}catch{}}),t.on("task:end",a=>{try{e.finishTask({id:a.traceId,status:a.error?"failed":"success",result:a.result??null,error:a.error?JSON.stringify(a.error):null,completedAt:a.timestamp.toISOString(),durationMs:a.durationMs,exitCode:a.exitCode??null,inputTokens:a.inputTokens??0,outputTokens:a.outputTokens??0,cachedInputTokens:a.cachedInputTokens??0,costUsd:a.costUsd??0,model:a.model??null});}catch{}}));}detach(t){this.unsubs.forEach(e=>e()),this.unsubs=[];}};var Z=class extends B{dbPath;constructor(t={}){super(),t.dbPath?this.dbPath=t.dbPath:t.dbRoot&&(this.dbPath=join(t.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(t){let e=this.resolveDbPath();if(t){let n=dirname(e);existsSync(n)||mkdirSync(n,{recursive:true});}else if(!existsSync(e))throw new c("NOT_FOUND","Database not found");let s=b(e);if(t)try{G(s.db,e);}catch(n){throw s.close(),n}return s}validateWorkspaceId(t,e){return t.db.select({id:q.id}).from(q).where(eq(q.id,e)).limit(1).get()?e:null}findAllThreads(t){let e=this.resolveDbPaths(),s=new Set,n=[];for(let r of e){if(!existsSync(r))continue;let i=b(r);try{let l=t?or(eq(u.workspace_id,t),isNull(u.workspace_id)):void 0,a=i.db.select().from(u).where(l).orderBy(desc(u.updated_at)).all();for(let p of a)s.has(p.id)||(s.add(p.id),n.push(p));}catch(l){throw new c("DB_ERROR","Failed to find all threads",l)}finally{i.close();}}return n}findThreadById(t,e){let s=this.resolveDbPaths();for(let n of s){if(!existsSync(n))continue;let r=b(n);try{let i=eq(u.id,t),l=e?and(i,or(eq(u.workspace_id,e),isNull(u.workspace_id))):i,a=r.db.select().from(u).where(l).limit(1).get()??void 0;if(a)return a}catch(i){throw new c("DB_ERROR","Failed to find thread by id",i)}finally{r.close();}}}threadExists(t,e){let s=this.resolveDbPaths();for(let n of s){if(!existsSync(n))continue;let r=b(n);try{let i=eq(u.id,t),l=e?and(i,or(eq(u.workspace_id,e),isNull(u.workspace_id))):i;if(r.db.select({id:u.id}).from(u).where(l).limit(1).get())return !0}catch(i){throw new c("DB_ERROR","Failed to check thread existence",i)}finally{r.close();}}return false}aggregateTaskStats(t,e){let s=this.resolveDbPaths(),n=0,r=0,i=0,l=0,a=0,p=new Set;for(let _ of s){if(!existsSync(_))continue;let k=b(_);try{let A=and(eq(o.thread_id,t),or(isNull(o.parent_task_id),eq(o.parent_task_id,""))),P=e?and(A,eq(o.workspace_id,e)):A,F=k.db.select({cnt:sql`count(*)`,total_input:sql`COALESCE(SUM(input_tokens), 0)`,total_output:sql`COALESCE(SUM(output_tokens), 0)`,total_cached:sql`COALESCE(SUM(cached_input_tokens), 0)`,total_cost:sql`COALESCE(SUM(cost_usd), 0)`}).from(o).where(P).get();F&&(n+=F.cnt,r+=F.total_input,i+=F.total_output,l+=F.total_cached,a+=F.total_cost);let yt=k.db.all(sql`
96
+ `).map(i=>({date:i.date,agentId:i.agent_id,inputTokens:i.input_tokens,outputTokens:i.output_tokens,cachedInputTokens:i.cached_input_tokens,costUsd:i.cost_usd}))}catch(r){throw new c("DB_ERROR","Failed to get agent usage trend",r)}finally{n.close();}}findTaskForStop(t,e){if(!this.dbExists())return;let s=this.openHandle(false);try{return s.db.select().from(o).where(and(eq(o.id,t),eq(o.workspace_id,e))).limit(1).get()??void 0}catch(n){throw new c("DB_ERROR","Failed to find task for stop",n)}finally{s.close();}}markTaskFailed(t,e,s){if(!this.dbExists())return;let n=this.openHandle(true);try{let r=new Date().toISOString(),i=s?and(eq(o.id,t),eq(o.status,"running"),eq(o.workspace_id,s)):and(eq(o.id,t),eq(o.status,"running"));n.db.update(o).set({status:"failed",error:e,completed_at:r}).where(i).run();}catch(r){throw r instanceof c?r:new c("DB_ERROR","Failed to mark task failed",r)}finally{n.close();}}findTasksByPromptHint(t,e){let s=this.resolveDbPaths(),n=new Set,r=[];for(let i of s){if(!existsSync(i))continue;let a=b(i);try{let l=e?and(like(o.prompt,`%${t}%`),eq(o.workspace_id,e)):like(o.prompt,`%${t}%`),p=a.db.select().from(o).where(l).orderBy(asc(o.started_at)).all();for(let _ of p)n.has(_.id)||(n.add(_.id),r.push(_));}catch(l){throw new c("DB_ERROR","Failed to find tasks by prompt hint",l)}finally{a.close();}}return r}};var it=class extends A{name="sqlite-tracing";unsubs=[];dbPath;version;constructor(t){super(),this.dbPath=join(t?.dbRoot??homedir(),".crewx","crewx.db"),this.version=t?.version??"unknown";}attach(t){let e=new V({dbPath:this.dbPath}),s=process.cwd(),r=existsSync(join(s,"crewx.yaml"))||existsSync(join(s,"crewx.yml"))?pt(s):null,i=process.argv.join(" ");this.unsubs.push(t.on("task:start",a=>{try{let l=process.env.CREWX_CALLER_AGENT_ID||null,p=process.env.CREWX_PARENT_TASK_ID||null,_=process.env.CREWX_TRACE_ID||a.traceId,k=a.metadata?JSON.stringify(a.metadata):JSON.stringify({provider:a.provider??"cli/claude"});e.startTask({id:a.traceId,agentId:a.agentRef.replace(/^@/,""),prompt:a.message,mode:a.mode,status:"running",pid:a.pid??null,startedAt:a.timestamp.toISOString(),crewxVersion:this.version,platform:a.platform??"cli",model:a.model??null,renderedPrompt:a.renderedPrompt??null,command:i,codingAgentCommand:a.codingAgentCommand??null,workspaceId:a.workspaceId??r,callerAgentId:l,parentTaskId:p,traceId:_,metadata:k,threadId:a.threadId??null});}catch{}}),t.on("task:output",a=>{try{e.appendLog(a.traceId,{timestamp:a.timestamp.toISOString(),level:a.level??"stdout",message:a.output});}catch{}}),t.on("task:end",a=>{try{e.finishTask({id:a.traceId,status:a.error?"failed":"success",result:a.result??null,error:a.error?JSON.stringify(a.error):null,completedAt:a.timestamp.toISOString(),durationMs:a.durationMs,exitCode:a.exitCode??null,inputTokens:a.inputTokens??0,outputTokens:a.outputTokens??0,cachedInputTokens:a.cachedInputTokens??0,costUsd:a.costUsd??0,model:a.model??null});}catch{}}));}detach(t){this.unsubs.forEach(e=>e()),this.unsubs=[];}};var Z=class extends B{dbPath;constructor(t={}){super(),t.dbPath?this.dbPath=t.dbPath:t.dbRoot&&(this.dbPath=join(t.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(t){let e=this.resolveDbPath();if(t){let n=dirname(e);existsSync(n)||mkdirSync(n,{recursive:true});}else if(!existsSync(e))throw new c("NOT_FOUND","Database not found");let s=b(e);if(t)try{X(s.db,e);}catch(n){throw s.close(),n}return s}validateWorkspaceId(t,e){return t.db.select({id:q.id}).from(q).where(eq(q.id,e)).limit(1).get()?e:null}findAllThreads(t){let e=this.resolveDbPaths(),s=new Set,n=[];for(let r of e){if(!existsSync(r))continue;let i=b(r);try{let a=t?or(eq(u.workspace_id,t),isNull(u.workspace_id)):void 0,l=i.db.select().from(u).where(a).orderBy(desc(u.updated_at)).all();for(let p of l)s.has(p.id)||(s.add(p.id),n.push(p));}catch(a){throw new c("DB_ERROR","Failed to find all threads",a)}finally{i.close();}}return n}findThreadById(t,e){let s=this.resolveDbPaths();for(let n of s){if(!existsSync(n))continue;let r=b(n);try{let i=eq(u.id,t),a=e?and(i,or(eq(u.workspace_id,e),isNull(u.workspace_id))):i,l=r.db.select().from(u).where(a).limit(1).get()??void 0;if(l)return l}catch(i){throw new c("DB_ERROR","Failed to find thread by id",i)}finally{r.close();}}}threadExists(t,e){let s=this.resolveDbPaths();for(let n of s){if(!existsSync(n))continue;let r=b(n);try{let i=eq(u.id,t),a=e?and(i,or(eq(u.workspace_id,e),isNull(u.workspace_id))):i;if(r.db.select({id:u.id}).from(u).where(a).limit(1).get())return !0}catch(i){throw new c("DB_ERROR","Failed to check thread existence",i)}finally{r.close();}}return false}aggregateTaskStats(t,e){let s=this.resolveDbPaths(),n=0,r=0,i=0,a=0,l=0,p=new Set;for(let _ of s){if(!existsSync(_))continue;let k=b(_);try{let $=and(eq(o.thread_id,t),or(isNull(o.parent_task_id),eq(o.parent_task_id,""))),v=e?and($,eq(o.workspace_id,e)):$,F=k.db.select({cnt:sql`count(*)`,total_input:sql`COALESCE(SUM(input_tokens), 0)`,total_output:sql`COALESCE(SUM(output_tokens), 0)`,total_cached:sql`COALESCE(SUM(cached_input_tokens), 0)`,total_cost:sql`COALESCE(SUM(cost_usd), 0)`}).from(o).where(v).get();F&&(n+=F.cnt,r+=F.total_input,i+=F.total_output,a+=F.total_cached,l+=F.total_cost);let yt=k.db.all(sql`
101
97
  SELECT DISTINCT agent_id FROM tasks
102
98
  WHERE thread_id = ${t}
103
99
  AND agent_id IS NOT NULL AND agent_id != ''
104
100
  AND (parent_task_id IS NULL OR parent_task_id = '')
105
101
  ${e?sql`AND workspace_id = ${e}`:sql``}
106
- `);for(let Et of yt)p.add(Et.agent_id);}catch(A){throw new c("DB_ERROR","Failed to aggregate task stats",A)}finally{k.close();}}return {taskCount:n,inputTokens:r,outputTokens:i,cachedInputTokens:l,costUsd:a,agentIds:Array.from(p)}}findTopLevelTasks(t,e){let s=this.resolveDbPaths(),n=new Set,r=[];for(let i of s){if(!existsSync(i))continue;let l=b(i);try{let a=and(eq(o.thread_id,t),or(isNull(o.parent_task_id),eq(o.parent_task_id,""))),p=e?and(a,eq(o.workspace_id,e)):a,_=l.db.select().from(o).where(p).orderBy(asc(o.started_at)).all();for(let k of _)n.has(k.id)||(n.add(k.id),r.push(k));}catch(a){throw new c("DB_ERROR","Failed to find top-level tasks",a)}finally{l.close();}}return r}findAllTasks(t,e){let s=this.resolveDbPaths(),n=new Set,r=[];for(let i of s){if(!existsSync(i))continue;let l=b(i);try{let a=eq(o.thread_id,t),p=e?and(a,eq(o.workspace_id,e)):a,_=l.db.select().from(o).where(p).orderBy(asc(o.started_at)).all();for(let k of _)n.has(k.id)||(n.add(k.id),r.push(k));}catch(a){throw new c("DB_ERROR","Failed to find all tasks for thread",a)}finally{l.close();}}return r}findTaskById(t,e,s){let n=this.resolveDbPaths();for(let r of n){if(!existsSync(r))continue;let i=b(r);try{let l=and(eq(o.id,e),eq(o.thread_id,t)),a=s?and(l,eq(o.workspace_id,s)):l,p=i.db.select().from(o).where(a).limit(1).get();if(!p)continue;let _=i.db.select().from(o).where(eq(o.parent_task_id,p.id)).orderBy(asc(o.started_at)).all();return {task:p,children:_}}catch(l){throw new c("DB_ERROR","Failed to find task by id",l)}finally{i.close();}}}batchFetchTasks(t,e){let s=new Map;if(t.length===0)return s;let n=this.resolveDbPaths();for(let r of n){if(!existsSync(r))continue;let i=b(r);try{let l=and(inArray(o.thread_id,t),or(isNull(o.parent_task_id),eq(o.parent_task_id,""))),a=e?and(l,eq(o.workspace_id,e)):l,p=i.db.select().from(o).where(a).orderBy(asc(o.started_at)).all();for(let _ of p){let k=_.thread_id;s.has(k)||s.set(k,[]),s.get(k).push(_);}}catch(l){throw new c("DB_ERROR","Failed to batch fetch tasks",l)}finally{i.close();}}return s}updateThreadTitle(t,e,s){if(!this.dbExists())return;let n=this.openHandle(true);try{let r=eq(u.id,t),i=s?and(r,or(eq(u.workspace_id,s),isNull(u.workspace_id))):r;if(!n.db.select({id:u.id}).from(u).where(i).limit(1).get())return;n.db.update(u).set({title:e,title_locked:1,updated_at:new Date().toISOString()}).where(eq(u.id,t)).run();}catch(r){throw r instanceof c?r:new c("DB_ERROR","Failed to update thread title",r)}finally{n.close();}}upsertThread(t,e){let s=this.openHandle(true);try{let n=e.workspaceId?this.validateWorkspaceId(s,e.workspaceId):null,r=new Date().toISOString();if(s.db.select({id:u.id,message_count:u.message_count}).from(u).where(eq(u.id,t)).limit(1).get()){let l={updated_at:r};e.title!==void 0&&(l.title=e.title),e.titleLocked!==void 0&&(l.title_locked=e.titleLocked?1:0),s.db.update(u).set(l).where(eq(u.id,t)).run();}else s.db.insert(u).values({id:t,platform:e.platform,workspace_id:n,title:e.title??null,title_locked:e.titleLocked?1:0,message_count:0,created_at:r,updated_at:r}).run();}catch(n){throw n instanceof c?n:new c("DB_ERROR","Failed to upsert thread",n)}finally{s.close();}}ensureThread(t,e,s){let n=this.openHandle(true);try{let r=s?this.validateWorkspaceId(n,s):null,i=n.db.select({id:u.id,platform:u.platform,workspace_id:u.workspace_id}).from(u).where(eq(u.id,t)).limit(1).get();if(i){r&&!i.workspace_id&&n.db.update(u).set({workspace_id:r}).where(eq(u.id,t)).run();return}let l=new Date().toISOString();n.db.insert(u).values({id:t,platform:e,workspace_id:r,message_count:0,created_at:l,updated_at:l}).run();}catch(r){throw r instanceof c?r:new c("DB_ERROR","Failed to ensure thread",r)}finally{n.close();}}saveUserMessage(t,e,s){if(!this.dbExists())return;let n=this.openHandle(true);try{let r=new Date().toISOString();n.db.run(sql`
102
+ `);for(let Et of yt)p.add(Et.agent_id);}catch($){throw new c("DB_ERROR","Failed to aggregate task stats",$)}finally{k.close();}}return {taskCount:n,inputTokens:r,outputTokens:i,cachedInputTokens:a,costUsd:l,agentIds:Array.from(p)}}findTopLevelTasks(t,e){let s=this.resolveDbPaths(),n=new Set,r=[];for(let i of s){if(!existsSync(i))continue;let a=b(i);try{let l=and(eq(o.thread_id,t),or(isNull(o.parent_task_id),eq(o.parent_task_id,""))),p=e?and(l,eq(o.workspace_id,e)):l,_=a.db.select().from(o).where(p).orderBy(asc(o.started_at)).all();for(let k of _)n.has(k.id)||(n.add(k.id),r.push(k));}catch(l){throw new c("DB_ERROR","Failed to find top-level tasks",l)}finally{a.close();}}return r}findAllTasks(t,e){let s=this.resolveDbPaths(),n=new Set,r=[];for(let i of s){if(!existsSync(i))continue;let a=b(i);try{let l=eq(o.thread_id,t),p=e?and(l,eq(o.workspace_id,e)):l,_=a.db.select().from(o).where(p).orderBy(asc(o.started_at)).all();for(let k of _)n.has(k.id)||(n.add(k.id),r.push(k));}catch(l){throw new c("DB_ERROR","Failed to find all tasks for thread",l)}finally{a.close();}}return r}findTaskById(t,e,s){let n=this.resolveDbPaths();for(let r of n){if(!existsSync(r))continue;let i=b(r);try{let a=and(eq(o.id,e),eq(o.thread_id,t)),l=s?and(a,eq(o.workspace_id,s)):a,p=i.db.select().from(o).where(l).limit(1).get();if(!p)continue;let _=i.db.select().from(o).where(eq(o.parent_task_id,p.id)).orderBy(asc(o.started_at)).all();return {task:p,children:_}}catch(a){throw new c("DB_ERROR","Failed to find task by id",a)}finally{i.close();}}}batchFetchTasks(t,e){let s=new Map;if(t.length===0)return s;let n=this.resolveDbPaths();for(let r of n){if(!existsSync(r))continue;let i=b(r);try{let a=and(inArray(o.thread_id,t),or(isNull(o.parent_task_id),eq(o.parent_task_id,""))),l=e?and(a,eq(o.workspace_id,e)):a,p=i.db.select().from(o).where(l).orderBy(asc(o.started_at)).all();for(let _ of p){let k=_.thread_id;s.has(k)||s.set(k,[]),s.get(k).push(_);}}catch(a){throw new c("DB_ERROR","Failed to batch fetch tasks",a)}finally{i.close();}}return s}updateThreadTitle(t,e,s){if(!this.dbExists())return;let n=this.openHandle(true);try{let r=eq(u.id,t),i=s?and(r,or(eq(u.workspace_id,s),isNull(u.workspace_id))):r;if(!n.db.select({id:u.id}).from(u).where(i).limit(1).get())return;n.db.update(u).set({title:e,title_locked:1,updated_at:new Date().toISOString()}).where(eq(u.id,t)).run();}catch(r){throw r instanceof c?r:new c("DB_ERROR","Failed to update thread title",r)}finally{n.close();}}upsertThread(t,e){let s=this.openHandle(true);try{let n=e.workspaceId?this.validateWorkspaceId(s,e.workspaceId):null,r=new Date().toISOString();if(s.db.select({id:u.id,message_count:u.message_count}).from(u).where(eq(u.id,t)).limit(1).get()){let a={updated_at:r};e.title!==void 0&&(a.title=e.title),e.titleLocked!==void 0&&(a.title_locked=e.titleLocked?1:0),s.db.update(u).set(a).where(eq(u.id,t)).run();}else s.db.insert(u).values({id:t,platform:e.platform,workspace_id:n,title:e.title??null,title_locked:e.titleLocked?1:0,message_count:0,created_at:r,updated_at:r}).run();}catch(n){throw n instanceof c?n:new c("DB_ERROR","Failed to upsert thread",n)}finally{s.close();}}ensureThread(t,e,s){let n=this.openHandle(true);try{let r=s?this.validateWorkspaceId(n,s):null,i=n.db.select({id:u.id,platform:u.platform,workspace_id:u.workspace_id}).from(u).where(eq(u.id,t)).limit(1).get();if(i){r&&!i.workspace_id&&n.db.update(u).set({workspace_id:r}).where(eq(u.id,t)).run();return}let a=new Date().toISOString();n.db.insert(u).values({id:t,platform:e,workspace_id:r,message_count:0,created_at:a,updated_at:a}).run();}catch(r){throw r instanceof c?r:new c("DB_ERROR","Failed to ensure thread",r)}finally{n.close();}}saveUserMessage(t,e,s){if(!this.dbExists())return;let n=this.openHandle(true);try{let r=new Date().toISOString();n.db.run(sql`
107
103
  UPDATE threads
108
104
  SET first_message = COALESCE(first_message, ${e}),
109
105
  title = CASE WHEN title_locked = 0 AND title IS NULL THEN substr(${e}, 1, 60) ELSE title END,
@@ -111,7 +107,7 @@ ${s.join(`
111
107
  message_count = message_count + 1,
112
108
  updated_at = ${r}
113
109
  WHERE id = ${t}
114
- `);}catch(r){throw r instanceof c?r:new c("DB_ERROR","Failed to save user message",r)}finally{n.close();}}saveAssistantMessage(t,e,s){if(!this.dbExists())return;let n=this.openHandle(true);try{let r=new Date().toISOString();n.db.update(u).set({last_message:e,updated_at:r}).where(eq(u.id,t)).run();}catch(r){throw r instanceof c?r:new c("DB_ERROR","Failed to save assistant message",r)}finally{n.close();}}updateThread(t,e){if(!this.dbExists())return;let s=this.openHandle(true);try{let n={updated_at:new Date().toISOString()};e.title!==void 0&&(n.title=e.title,n.title_locked=1),e.titleLocked!==void 0&&(n.title_locked=e.titleLocked?1:0),s.db.update(u).set(n).where(eq(u.id,t)).run();}catch(n){throw n instanceof c?n:new c("DB_ERROR","Failed to update thread",n)}finally{s.close();}}};function ue(d){return d.replace(/<conversation_history[^>]*>[\s\S]*?<\/conversation_history>/g,"").split(`
110
+ `);}catch(r){throw r instanceof c?r:new c("DB_ERROR","Failed to save user message",r)}finally{n.close();}}saveAssistantMessage(t,e,s){if(!this.dbExists())return;let n=this.openHandle(true);try{let r=new Date().toISOString();n.db.update(u).set({last_message:e,updated_at:r}).where(eq(u.id,t)).run();}catch(r){throw r instanceof c?r:new c("DB_ERROR","Failed to save assistant message",r)}finally{n.close();}}updateThread(t,e){if(!this.dbExists())return;let s=this.openHandle(true);try{let n={updated_at:new Date().toISOString()};e.title!==void 0&&(n.title=e.title,n.title_locked=1),e.titleLocked!==void 0&&(n.title_locked=e.titleLocked?1:0),s.db.update(u).set(n).where(eq(u.id,t)).run();}catch(n){throw n instanceof c?n:new c("DB_ERROR","Failed to update thread",n)}finally{s.close();}}};function _e(d){return d.replace(/<conversation_history[^>]*>[\s\S]*?<\/conversation_history>/g,"").split(`
115
111
  `).filter(n=>!(n.startsWith("Loaded ")&&n.includes("layouts from")||n.includes("[dotenv@")||n.includes("[Nest]")&&n.includes("DEBUG")||n.startsWith("Registered custom layout:")||n.startsWith("Updated custom layout:"))).join(`
116
- `).trim()}function pe(d){if(!d)return "";let t=d;try{let e=JSON.parse(t);Array.isArray(e)?t=e.filter(s=>s?.type==="text"&&s?.text).map(s=>s.text).join(`
117
- `):e&&typeof e=="object"&&e.result!==void 0&&(t=e.result||"");}catch{t=ue(t);}return t}var tt=class{dbPath;constructor(t){this.dbPath=t??join(homedir(),".crewx","crewx.db");}getThreadRepo(){return new Z({dbPath:this.dbPath})}updateThread(t,e){this.getThreadRepo().updateThread(t,{title:e.title});}async ensureThread(t,e,s){let n=this.getThreadRepo(),r=n.findThreadById(t);if(r){if(r.platform!==e)throw new Error(`Thread '${t}' already exists with platform '${r.platform}' \u2014 cannot change to '${e}' (platform is immutable)`);return}n.ensureThread(t,e,s);}async fetchHistory(t,e){let s=e?.limit??100,n=this.getThreadRepo(),r=n.findThreadById(t),i=n.findTopLevelTasks(t),l=new Set(["done","completed","success"]);i=i.filter(_=>(!_.status||l.has(_.status))&&(!e?.currentTraceId||_.trace_id!==e.currentTraceId)),i=i.slice(0,s);let a=r?.platform??"cli",p=this.rowsToMessages(i);return {threadId:t,platform:a,messages:p,metadata:{title:r?.title??void 0,firstMessage:r?.first_message??void 0,lastMessage:r?.last_message??void 0,messageCount:r?.message_count??0,updatedAt:r?.updated_at?new Date(r.updated_at).getTime():void 0}}}async saveUserMessage(t,e,s,n){this.getThreadRepo().saveUserMessage(t,e);}async saveAssistantMessage(t,e,s,n){this.getThreadRepo().saveAssistantMessage(t,e);}close(){}rowsToMessages(t){let e=[];for(let s of t){s.prompt&&e.push({id:`${s.id}-user`,text:s.prompt,isAssistant:false,timestamp:new Date(s.started_at).getTime()});let n=pe(s.result);n&&e.push({id:`${s.id}-assistant`,text:n,isAssistant:true,timestamp:new Date(s.started_at).getTime()});}return e}};var at=class extends O{name="conversation";_provider;unsubStart=null;unsubEnd=null;constructor(t){super(),this._provider=new tt(t?.dbPath);}get conversationProvider(){return this._provider}attach(t){this.unsubStart=t.on("task:start",async e=>{if(!e.threadId)return;let s=e.platform??"cli";try{await this._provider.ensureThread(e.threadId,s,e.workspaceId),await this._provider.saveUserMessage(e.threadId,e.message??"");}catch{}}),this.unsubEnd=t.on("task:end",async e=>{if(!e.result)return;let s=e.metadata?.threadId;if(!s)return;let n=e.agentRef?.replace(/^@/,"")??"";try{await this._provider.saveAssistantMessage(s,e.result,n);}catch{}});}detach(t){this.unsubStart?.(),this.unsubStart=null,this.unsubEnd?.(),this.unsubEnd=null,this._provider.close?.();}};export{at as ConversationPlugin,et as FileLoggerPlugin,it as SqliteTracingPlugin};
112
+ `).trim()}function me(d){if(!d)return "";let t=d;try{let e=JSON.parse(t);Array.isArray(e)?t=e.filter(s=>s?.type==="text"&&s?.text).map(s=>s.text).join(`
113
+ `):e&&typeof e=="object"&&e.result!==void 0&&(t=e.result||"");}catch{t=_e(t);}return t}var tt=class{dbPath;constructor(t){this.dbPath=t??join(homedir(),".crewx","crewx.db");}getThreadRepo(){return new Z({dbPath:this.dbPath})}updateThread(t,e){this.getThreadRepo().updateThread(t,{title:e.title});}async ensureThread(t,e,s){let n=this.getThreadRepo(),r=n.findThreadById(t);if(r){if(r.platform!==e)throw new Error(`Thread '${t}' already exists with platform '${r.platform}' \u2014 cannot change to '${e}' (platform is immutable)`);return}n.ensureThread(t,e,s);}async fetchHistory(t,e){let s=e?.limit??100,n=this.getThreadRepo(),r=n.findThreadById(t),i=n.findTopLevelTasks(t),a=new Set(["done","completed","success"]);i=i.filter(_=>(!_.status||a.has(_.status))&&(!e?.currentTraceId||_.trace_id!==e.currentTraceId)),i=i.slice(0,s);let l=r?.platform??"cli",p=this.rowsToMessages(i);return {threadId:t,platform:l,messages:p,metadata:{title:r?.title??void 0,firstMessage:r?.first_message??void 0,lastMessage:r?.last_message??void 0,messageCount:r?.message_count??0,updatedAt:r?.updated_at?new Date(r.updated_at).getTime():void 0}}}async saveUserMessage(t,e,s,n){this.getThreadRepo().saveUserMessage(t,e);}async saveAssistantMessage(t,e,s,n){this.getThreadRepo().saveAssistantMessage(t,e);}close(){}rowsToMessages(t){let e=[];for(let s of t){s.prompt&&e.push({id:`${s.id}-user`,text:s.prompt,isAssistant:false,timestamp:new Date(s.started_at).getTime()});let n=me(s.result);n&&e.push({id:`${s.id}-assistant`,text:n,isAssistant:true,timestamp:new Date(s.started_at).getTime()});}return e}};var at=class extends A{name="conversation";_provider;unsubStart=null;unsubEnd=null;constructor(t){super(),this._provider=new tt(t?.dbPath);}get conversationProvider(){return this._provider}attach(t){this.unsubStart=t.on("task:start",async e=>{if(!e.threadId)return;let s=e.platform??"cli";try{await this._provider.ensureThread(e.threadId,s,e.workspaceId),await this._provider.saveUserMessage(e.threadId,e.message??"");}catch{}}),this.unsubEnd=t.on("task:end",async e=>{if(!e.result)return;let s=e.metadata?.threadId;if(!s)return;let n=e.agentRef?.replace(/^@/,"")??"";try{await this._provider.saveAssistantMessage(s,e.result,n);}catch{}});}detach(t){this.unsubStart?.(),this.unsubStart=null,this.unsubEnd?.(),this.unsubEnd=null,this._provider.close?.();}};export{at as ConversationPlugin,et as FileLoggerPlugin,it as SqliteTracingPlugin};