@crewx/sdk 0.8.9-rc.12 → 0.8.9-rc.13

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.
@@ -1,4 +1,4 @@
1
- 'use strict';var fs=require('fs'),O=require('path'),Pt=require('os'),crypto=require('crypto'),drizzleOrm=require('drizzle-orm'),sqliteCore=require('drizzle-orm/sqlite-core');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var O__namespace=/*#__PURE__*/_interopNamespace(O);var Pt__default=/*#__PURE__*/_interopDefault(Pt);var H=(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 v=class{detach(t){}};function lt(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 tt=class extends v{name="file-logger";unsubs=[];logFiles=new Map;logsDir;version;constructor(t){super(),this.logsDir=O.join(t?.workspaceRoot??process.cwd(),".crewx","logs"),this.version=t?.version??"unknown";}attach(t){this.unsubs.push(t.on("task:start",e=>{try{fs.existsSync(this.logsDir)||fs.mkdirSync(this.logsDir,{recursive:!0});let s=lt(e.timestamp),n=O.join(this.logsDir,`${s}_${e.traceId}.log`);this.logFiles.set(e.traceId,n);let r=`=== TASK LOG: ${e.traceId} ===
1
+ 'use strict';var fs=require('fs'),O=require('path'),It=require('os'),crypto=require('crypto'),drizzleOrm=require('drizzle-orm'),sqliteCore=require('drizzle-orm/sqlite-core');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var O__namespace=/*#__PURE__*/_interopNamespace(O);var It__default=/*#__PURE__*/_interopDefault(It);var K=(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 N=class{detach(t){}};function pt(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 nt=class extends N{name="file-logger";unsubs=[];logFiles=new Map;logsDir;version;constructor(t){super(),this.logsDir=O.join(t?.workspaceRoot??process.cwd(),".crewx","logs"),this.version=t?.version??"unknown";}attach(t){this.unsubs.push(t.on("task:start",e=>{try{fs.existsSync(this.logsDir)||fs.mkdirSync(this.logsDir,{recursive:!0});let s=pt(e.timestamp),n=O.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,11 +8,11 @@ Message: ${e.message}
8
8
  `;fs.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();fs.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",o=`[${n}] INFO: Task ${r} in ${e.durationMs}ms
10
10
  [${n}] INFO: Process closed with exit code: ${e.error?1:0}
11
- `;fs.appendFileSync(s,o,"utf8"),this.logFiles.delete(e.traceId);}catch{}}));}detach(t){this.unsubs.forEach(e=>e()),this.unsubs=[],this.logFiles.clear();}};function Ot(d){let t=O__namespace.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 _t(d){let t=Ot(d);return crypto.createHash("sha256").update(t).digest("hex")}var I=class{resolveDbPath(){return process.env.CREWX_DB?process.env.CREWX_DB:process.env.CREWX_TRACES_DB?process.env.CREWX_TRACES_DB:O.join(Pt__default.default.homedir(),".crewx","crewx.db")}resolveDbPaths(){return [this.resolveDbPath()]}isMissingTableError(t){return t instanceof Error&&/no such table:/i.test(t.message)}dbExists(t){return fs.existsSync(t??this.resolveDbPath())}};function b(d){let t=H("better-sqlite3"),{drizzle:e}=H("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 ht=new Set,Nt={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 et(d,t){return (d.get(`SELECT count(*) as cnt FROM sqlite_master WHERE type='table' AND name='${t}'`)?.cnt??0)>0}function Lt(d,t){if(t>0||!et(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(Nt))s.has(n)||d.run(`ALTER TABLE tasks ADD COLUMN ${n} ${r}`);}var Mt={"0002_normalize_task_names":{workspace_name:"TEXT",project_name:"TEXT"}};function $t(d,t,e){if(!et(d,"__drizzle_migrations")||!et(d,"tasks"))return;let s=d.all(e`SELECT hash FROM __drizzle_migrations`),n=new Set(s.map(o=>o.hash)),r=JSON.parse(fs.readFileSync(O__namespace.default.join(t,"meta/_journal.json"),"utf-8"));for(let o of r.entries){let i=Mt[o.tag];if(!i)continue;let l=O__namespace.default.join(t,`${o.tag}.sql`);if(!fs.existsSync(l))continue;let p=fs.readFileSync(l,"utf-8"),_=crypto.createHash("sha256").update(p).digest("hex");if(n.has(_))continue;let g=d.all("PRAGMA table_info(tasks)"),k=new Set(g.map(T=>T.name));for(let[T,q]of Object.entries(i))k.has(T)||(d.run(`ALTER TABLE tasks ADD COLUMN ${T} ${q}`),k.add(T));}}function It(d,t,e){let s=d.all(e`SELECT hash FROM __drizzle_migrations`),n=new Set(s.map(o=>o.hash)),r=JSON.parse(fs.readFileSync(O__namespace.default.join(t,"meta/_journal.json"),"utf-8"));for(let o of r.entries){let i=O__namespace.default.join(t,`${o.tag}.sql`);if(!fs.existsSync(i))continue;let l=fs.readFileSync(i,"utf-8"),p=crypto.createHash("sha256").update(l).digest("hex");if(n.has(p))continue;let _=/ALTER\s+TABLE\s+[`"]?(\w+)[`"]?\s+ADD\s+[`"]?(\w+)[`"]?/gi,g=[],k;for(;(k=_.exec(l))!==null;)g.push({table:k[1],column:k[2]});if(g.length===0||!l.split(/-->\s*statement-breakpoint/).map(z=>z.trim()).filter(Boolean).every(z=>/^ALTER\s+TABLE\s+.+\s+ADD\s+/i.test(z)))continue;g.every(({table:z,column:Tt})=>d.all(`PRAGMA table_info("${z}")`).some(St=>St.name===Tt))&&d.run(e`INSERT INTO __drizzle_migrations (hash, created_at) VALUES (${p}, ${o.when})`);}}function Ut(d){let{migrate:t}=H("drizzle-orm/better-sqlite3/migrator"),{sql:e}=H("drizzle-orm"),s=[O__namespace.default.join(__dirname,"../migrations"),O__namespace.default.join(__dirname,"migrations"),O__namespace.default.join(__dirname,"../../../../drizzle/migrations"),O__namespace.default.join(process.cwd(),"drizzle/migrations")],n=s.find(p=>fs.existsSync(O__namespace.default.join(p,"meta/_journal.json")));if(!n)throw new Error(`migrations folder not found. Searched:
11
+ `;fs.appendFileSync(s,o,"utf8"),this.logFiles.delete(e.traceId);}catch{}}));}detach(t){this.unsubs.forEach(e=>e()),this.unsubs=[],this.logFiles.clear();}};function vt(d){let t=O__namespace.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 ft(d){let t=vt(d);return crypto.createHash("sha256").update(t).digest("hex")}var M=class{resolveDbPath(){return process.env.CREWX_DB?process.env.CREWX_DB:process.env.CREWX_TRACES_DB?process.env.CREWX_TRACES_DB:O.join(It__default.default.homedir(),".crewx","crewx.db")}resolveDbPaths(){return [this.resolveDbPath()]}isMissingTableError(t){return t instanceof Error&&/no such table:/i.test(t.message)}dbExists(t){return fs.existsSync(t??this.resolveDbPath())}};function E(d){let t=K("better-sqlite3"),{drizzle:e}=K("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 gt=new Set,$t={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 rt(d,t){return (d.get(`SELECT count(*) as cnt FROM sqlite_master WHERE type='table' AND name='${t}'`)?.cnt??0)>0}function Mt(d,t){if(t>0||!rt(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($t))s.has(n)||d.run(`ALTER TABLE tasks ADD COLUMN ${n} ${r}`);}var Ut={"0002_normalize_task_names":{workspace_name:"TEXT",project_name:"TEXT"}};function Bt(d,t,e){if(!rt(d,"__drizzle_migrations")||!rt(d,"tasks"))return;let s=d.all(e`SELECT hash FROM __drizzle_migrations`),n=new Set(s.map(o=>o.hash)),r=JSON.parse(fs.readFileSync(O__namespace.default.join(t,"meta/_journal.json"),"utf-8"));for(let o of r.entries){let i=Ut[o.tag];if(!i)continue;let l=O__namespace.default.join(t,`${o.tag}.sql`);if(!fs.existsSync(l))continue;let p=fs.readFileSync(l,"utf-8"),_=crypto.createHash("sha256").update(p).digest("hex");if(n.has(_))continue;let g=d.all("PRAGMA table_info(tasks)"),k=new Set(g.map(T=>T.name));for(let[T,W]of Object.entries(i))k.has(T)||(d.run(`ALTER TABLE tasks ADD COLUMN ${T} ${W}`),k.add(T));}}function Ft(d,t,e){let s=d.all(e`SELECT hash FROM __drizzle_migrations`),n=new Set(s.map(o=>o.hash)),r=JSON.parse(fs.readFileSync(O__namespace.default.join(t,"meta/_journal.json"),"utf-8"));for(let o of r.entries){let i=O__namespace.default.join(t,`${o.tag}.sql`);if(!fs.existsSync(i))continue;let l=fs.readFileSync(i,"utf-8"),p=crypto.createHash("sha256").update(l).digest("hex");if(n.has(p))continue;let _=/ALTER\s+TABLE\s+[`"]?(\w+)[`"]?\s+ADD\s+[`"]?(\w+)[`"]?/gi,g=[],k;for(;(k=_.exec(l))!==null;)g.push({table:k[1],column:k[2]});if(g.length===0||!l.split(/-->\s*statement-breakpoint/).map(j=>j.trim()).filter(Boolean).every(j=>/^ALTER\s+TABLE\s+.+\s+ADD\s+/i.test(j)))continue;g.every(({table:j,column:xt})=>d.all(`PRAGMA table_info("${j}")`).some(At=>At.name===xt))&&d.run(e`INSERT INTO __drizzle_migrations (hash, created_at) VALUES (${p}, ${o.when})`);}}function zt(d){let{migrate:t}=K("drizzle-orm/better-sqlite3/migrator"),{sql:e}=K("drizzle-orm"),s=[O__namespace.default.join(__dirname,"../migrations"),O__namespace.default.join(__dirname,"migrations"),O__namespace.default.join(__dirname,"../../../../drizzle/migrations"),O__namespace.default.join(process.cwd(),"drizzle/migrations")],n=s.find(p=>fs.existsSync(O__namespace.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'`),o=0;r?.cnt&&(o=d.get(e`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0),Lt(d,o),r?.cnt&&(It(d,n,e),$t(d,n,e)),t(d,{migrationsFolder:n});let l=(d.get(e`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0)-o;if(l>0){let p=r?.cnt?"Database migrated":"Database initialized";console.log(`[crewx] ${p} (${l} migration${l>1?"s":""} applied).`);}}function W(d,t){ht.has(t)||(Ut(d),ht.add(t));}var u=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 U=sqliteCore.sqliteTable("workspaces",{id:sqliteCore.text("id").primaryKey(),slug:sqliteCore.text("slug").notNull().unique(),name:sqliteCore.text("name").notNull(),workspace_path:sqliteCore.text("workspace_path"),description:sqliteCore.text("description"),is_active:sqliteCore.integer("is_active").notNull().default(1),created_at:sqliteCore.text("created_at").notNull(),updated_at:sqliteCore.text("updated_at").notNull()});var a=sqliteCore.sqliteTable("tasks",{id:sqliteCore.text("id").primaryKey(),agent_id:sqliteCore.text("agent_id").notNull(),user_id:sqliteCore.text("user_id"),prompt:sqliteCore.text("prompt").notNull(),mode:sqliteCore.text("mode").notNull().default("execute"),status:sqliteCore.text("status").notNull().default("running"),result:sqliteCore.text("result"),error:sqliteCore.text("error"),started_at:sqliteCore.text("started_at").notNull(),completed_at:sqliteCore.text("completed_at"),duration_ms:sqliteCore.integer("duration_ms"),metadata:sqliteCore.text("metadata"),workspace_id:sqliteCore.text("workspace_id"),trace_id:sqliteCore.text("trace_id"),parent_task_id:sqliteCore.text("parent_task_id"),caller_agent_id:sqliteCore.text("caller_agent_id"),model:sqliteCore.text("model"),platform:sqliteCore.text("platform").default("cli"),crewx_version:sqliteCore.text("crewx_version"),input_tokens:sqliteCore.integer("input_tokens").default(0),output_tokens:sqliteCore.integer("output_tokens").default(0),cost_usd:sqliteCore.real("cost_usd").default(0),pid:sqliteCore.integer("pid"),rendered_prompt:sqliteCore.text("rendered_prompt"),command:sqliteCore.text("command"),coding_agent_command:sqliteCore.text("coding_agent_command"),exit_code:sqliteCore.integer("exit_code"),logs:sqliteCore.text("logs"),thread_id:sqliteCore.text("thread_id"),workspace_ref:sqliteCore.text("workspace_ref"),project_id:sqliteCore.text("project_id"),project_ref:sqliteCore.text("project_ref"),cached_input_tokens:sqliteCore.integer("cached_input_tokens").default(0)},d=>({idx_tasks_agent_id:sqliteCore.index("idx_tasks_agent_id").on(d.agent_id),idx_tasks_status:sqliteCore.index("idx_tasks_status").on(d.status),idx_tasks_started_at:sqliteCore.index("idx_tasks_started_at").on(d.started_at),idx_tasks_trace_id:sqliteCore.index("idx_tasks_trace_id").on(d.trace_id),idx_tasks_parent_task_id:sqliteCore.index("idx_tasks_parent_task_id").on(d.parent_task_id),idx_tasks_crewx_version:sqliteCore.index("idx_tasks_crewx_version").on(d.crewx_version),idx_tasks_pid:sqliteCore.index("idx_tasks_pid").on(d.pid),idx_tasks_thread_id:sqliteCore.index("idx_tasks_thread_id").on(d.thread_id),idx_tasks_workspace_id:sqliteCore.index("idx_tasks_workspace_id").on(d.workspace_id),idx_tasks_workspace_ref:sqliteCore.index("idx_tasks_workspace_ref").on(d.workspace_ref),idx_tasks_project_id:sqliteCore.index("idx_tasks_project_id").on(d.project_id),idx_tasks_ws_started:sqliteCore.index("idx_tasks_ws_started").on(d.workspace_id,d.started_at)}));var c=sqliteCore.sqliteTable("threads",{id:sqliteCore.text("id").primaryKey(),workspace_id:sqliteCore.text("workspace_id").references(()=>U.id,{onDelete:"set null"}),platform:sqliteCore.text("platform").notNull().default("cli"),title:sqliteCore.text("title"),first_message:sqliteCore.text("first_message"),last_message:sqliteCore.text("last_message"),message_count:sqliteCore.integer("message_count").notNull().default(0),created_at:sqliteCore.text("created_at").notNull(),updated_at:sqliteCore.text("updated_at").notNull(),metadata:sqliteCore.text("metadata"),title_locked:sqliteCore.integer("title_locked").notNull().default(0),pinned:sqliteCore.integer("pinned").notNull().default(0),starred:sqliteCore.integer("starred").notNull().default(0)},d=>({idx_threads_updated_at:sqliteCore.index("idx_threads_updated_at").on(d.updated_at),idx_threads_workspace_id:sqliteCore.index("idx_threads_workspace_id").on(d.workspace_id)}));var Xt=sqliteCore.sqliteTable("spans",{id:sqliteCore.text("id").primaryKey(),task_id:sqliteCore.text("task_id").references(()=>a.id,{onDelete:"set null"}),parent_span_id:sqliteCore.text("parent_span_id").references(()=>Xt.id,{onDelete:"set null"}),name:sqliteCore.text("name").notNull(),kind:sqliteCore.text("kind").notNull().default("internal"),status:sqliteCore.text("status").notNull().default("ok"),started_at:sqliteCore.text("started_at").notNull(),completed_at:sqliteCore.text("completed_at"),duration_ms:sqliteCore.integer("duration_ms"),input:sqliteCore.text("input"),output:sqliteCore.text("output"),error:sqliteCore.text("error"),attributes:sqliteCore.text("attributes")},d=>({idx_spans_task_id:sqliteCore.index("idx_spans_task_id").on(d.task_id),idx_spans_parent_span_id:sqliteCore.index("idx_spans_parent_span_id").on(d.parent_span_id)}));sqliteCore.sqliteTable("tool_calls",{id:sqliteCore.text("id").primaryKey(),task_id:sqliteCore.text("task_id").references(()=>a.id,{onDelete:"cascade"}),session_id:sqliteCore.text("session_id"),tool_name:sqliteCore.text("tool_name").notNull(),files:sqliteCore.text("files"),input:sqliteCore.text("input"),output:sqliteCore.text("output"),duration_ms:sqliteCore.integer("duration_ms"),timestamp:sqliteCore.text("timestamp").notNull()},d=>({idx_tool_calls_task_id:sqliteCore.index("idx_tool_calls_task_id").on(d.task_id),idx_tool_calls_tool_name:sqliteCore.index("idx_tool_calls_tool_name").on(d.tool_name),idx_tool_calls_timestamp:sqliteCore.index("idx_tool_calls_timestamp").on(d.timestamp)}));sqliteCore.sqliteTable("thread_boxes",{id:sqliteCore.text("id").primaryKey(),thread_id:sqliteCore.text("thread_id").notNull().references(()=>c.id,{onDelete:"cascade"}),seq:sqliteCore.integer("seq").notNull(),first_task_id:sqliteCore.text("first_task_id").notNull(),mid_task_id:sqliteCore.text("mid_task_id").notNull(),last_task_id:sqliteCore.text("last_task_id").notNull(),task_count:sqliteCore.integer("task_count").notNull(),summary:sqliteCore.text("summary"),source_tokens:sqliteCore.integer("source_tokens").notNull(),summary_tokens:sqliteCore.integer("summary_tokens"),created_at:sqliteCore.text("created_at").notNull()},d=>({idx_thread_boxes_thread_id:sqliteCore.index("idx_thread_boxes_thread_id").on(d.thread_id),idx_thread_boxes_seq:sqliteCore.index("idx_thread_boxes_seq").on(d.thread_id,d.seq),uniq_thread_boxes_thread_seq:sqliteCore.unique().on(d.thread_id,d.seq)}));sqliteCore.sqliteTable("request_logs",{id:sqliteCore.text("id").primaryKey(),path:sqliteCore.text("path").notNull(),method:sqliteCore.text("method").notNull(),status_code:sqliteCore.integer("status_code").notNull(),duration_ms:sqliteCore.integer("duration_ms").notNull(),ip:sqliteCore.text("ip"),request_headers:sqliteCore.text("request_headers"),response_headers:sqliteCore.text("response_headers"),request_body:sqliteCore.text("request_body"),response_body:sqliteCore.text("response_body"),query:sqliteCore.text("query"),user_id:sqliteCore.text("user_id"),project_id:sqliteCore.text("project_id"),partition_key:sqliteCore.text("partition_key").notNull(),timestamp:sqliteCore.text("timestamp").notNull().default(drizzleOrm.sql`(datetime('now'))`),metadata:sqliteCore.text("metadata")},d=>({idx_request_logs_timestamp:sqliteCore.index("idx_request_logs_timestamp").on(d.timestamp),idx_request_logs_path:sqliteCore.index("idx_request_logs_path").on(d.path),idx_request_logs_status_code:sqliteCore.index("idx_request_logs_status_code").on(d.status_code),idx_request_logs_partition_key:sqliteCore.index("idx_request_logs_partition_key").on(d.partition_key)}));var V=class extends I{dbPath;constructor(t={}){super(),t.dbPath?this.dbPath=t.dbPath:t.dbRoot&&(this.dbPath=O.join(t.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(t){let e=this.resolveDbPath();if(t){let n=O.dirname(e);fs.existsSync(n)||fs.mkdirSync(n,{recursive:true});}else if(!fs.existsSync(e))throw new u("NOT_FOUND","Database not found");let s=b(e);if(t)try{W(s.db,e);}catch(n){throw s.close(),n}return s}startTask(t){let e=this.openHandle(true);try{e.db.insert(a).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 u?s:new u("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'`),o=0;r?.cnt&&(o=d.get(e`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0),Mt(d,o),r?.cnt&&(Ft(d,n,e),Bt(d,n,e)),t(d,{migrationsFolder:n});let l=(d.get(e`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0)-o;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){gt.has(t)||(zt(d),gt.add(t));}var u=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 U=sqliteCore.sqliteTable("workspaces",{id:sqliteCore.text("id").primaryKey(),slug:sqliteCore.text("slug").notNull().unique(),name:sqliteCore.text("name").notNull(),workspace_path:sqliteCore.text("workspace_path"),description:sqliteCore.text("description"),is_active:sqliteCore.integer("is_active").notNull().default(1),created_at:sqliteCore.text("created_at").notNull(),updated_at:sqliteCore.text("updated_at").notNull()});var a=sqliteCore.sqliteTable("tasks",{id:sqliteCore.text("id").primaryKey(),agent_id:sqliteCore.text("agent_id").notNull(),user_id:sqliteCore.text("user_id"),prompt:sqliteCore.text("prompt").notNull(),mode:sqliteCore.text("mode").notNull().default("execute"),status:sqliteCore.text("status").notNull().default("running"),result:sqliteCore.text("result"),error:sqliteCore.text("error"),started_at:sqliteCore.text("started_at").notNull(),completed_at:sqliteCore.text("completed_at"),duration_ms:sqliteCore.integer("duration_ms"),metadata:sqliteCore.text("metadata"),workspace_id:sqliteCore.text("workspace_id"),trace_id:sqliteCore.text("trace_id"),parent_task_id:sqliteCore.text("parent_task_id"),caller_agent_id:sqliteCore.text("caller_agent_id"),model:sqliteCore.text("model"),platform:sqliteCore.text("platform").default("cli"),crewx_version:sqliteCore.text("crewx_version"),input_tokens:sqliteCore.integer("input_tokens").default(0),output_tokens:sqliteCore.integer("output_tokens").default(0),cost_usd:sqliteCore.real("cost_usd").default(0),pid:sqliteCore.integer("pid"),rendered_prompt:sqliteCore.text("rendered_prompt"),command:sqliteCore.text("command"),coding_agent_command:sqliteCore.text("coding_agent_command"),exit_code:sqliteCore.integer("exit_code"),logs:sqliteCore.text("logs"),thread_id:sqliteCore.text("thread_id"),workspace_ref:sqliteCore.text("workspace_ref"),project_id:sqliteCore.text("project_id"),project_ref:sqliteCore.text("project_ref"),cached_input_tokens:sqliteCore.integer("cached_input_tokens").default(0)},d=>({idx_tasks_agent_id:sqliteCore.index("idx_tasks_agent_id").on(d.agent_id),idx_tasks_status:sqliteCore.index("idx_tasks_status").on(d.status),idx_tasks_started_at:sqliteCore.index("idx_tasks_started_at").on(d.started_at),idx_tasks_trace_id:sqliteCore.index("idx_tasks_trace_id").on(d.trace_id),idx_tasks_parent_task_id:sqliteCore.index("idx_tasks_parent_task_id").on(d.parent_task_id),idx_tasks_crewx_version:sqliteCore.index("idx_tasks_crewx_version").on(d.crewx_version),idx_tasks_pid:sqliteCore.index("idx_tasks_pid").on(d.pid),idx_tasks_thread_id:sqliteCore.index("idx_tasks_thread_id").on(d.thread_id),idx_tasks_workspace_id:sqliteCore.index("idx_tasks_workspace_id").on(d.workspace_id),idx_tasks_workspace_ref:sqliteCore.index("idx_tasks_workspace_ref").on(d.workspace_ref),idx_tasks_project_id:sqliteCore.index("idx_tasks_project_id").on(d.project_id),idx_tasks_ws_started:sqliteCore.index("idx_tasks_ws_started").on(d.workspace_id,d.started_at)}));var c=sqliteCore.sqliteTable("threads",{id:sqliteCore.text("id").primaryKey(),workspace_id:sqliteCore.text("workspace_id").references(()=>U.id,{onDelete:"set null"}),platform:sqliteCore.text("platform").notNull().default("cli"),title:sqliteCore.text("title"),first_message:sqliteCore.text("first_message"),last_message:sqliteCore.text("last_message"),message_count:sqliteCore.integer("message_count").notNull().default(0),created_at:sqliteCore.text("created_at").notNull(),updated_at:sqliteCore.text("updated_at").notNull(),metadata:sqliteCore.text("metadata"),title_locked:sqliteCore.integer("title_locked").notNull().default(0),pinned:sqliteCore.integer("pinned").notNull().default(0),starred:sqliteCore.integer("starred").notNull().default(0)},d=>({idx_threads_updated_at:sqliteCore.index("idx_threads_updated_at").on(d.updated_at),idx_threads_workspace_id:sqliteCore.index("idx_threads_workspace_id").on(d.workspace_id)}));var Jt=sqliteCore.sqliteTable("spans",{id:sqliteCore.text("id").primaryKey(),task_id:sqliteCore.text("task_id").references(()=>a.id,{onDelete:"set null"}),parent_span_id:sqliteCore.text("parent_span_id").references(()=>Jt.id,{onDelete:"set null"}),name:sqliteCore.text("name").notNull(),kind:sqliteCore.text("kind").notNull().default("internal"),status:sqliteCore.text("status").notNull().default("ok"),started_at:sqliteCore.text("started_at").notNull(),completed_at:sqliteCore.text("completed_at"),duration_ms:sqliteCore.integer("duration_ms"),input:sqliteCore.text("input"),output:sqliteCore.text("output"),error:sqliteCore.text("error"),attributes:sqliteCore.text("attributes")},d=>({idx_spans_task_id:sqliteCore.index("idx_spans_task_id").on(d.task_id),idx_spans_parent_span_id:sqliteCore.index("idx_spans_parent_span_id").on(d.parent_span_id)}));sqliteCore.sqliteTable("tool_calls",{id:sqliteCore.text("id").primaryKey(),task_id:sqliteCore.text("task_id").references(()=>a.id,{onDelete:"cascade"}),session_id:sqliteCore.text("session_id"),tool_name:sqliteCore.text("tool_name").notNull(),files:sqliteCore.text("files"),input:sqliteCore.text("input"),output:sqliteCore.text("output"),duration_ms:sqliteCore.integer("duration_ms"),timestamp:sqliteCore.text("timestamp").notNull()},d=>({idx_tool_calls_task_id:sqliteCore.index("idx_tool_calls_task_id").on(d.task_id),idx_tool_calls_tool_name:sqliteCore.index("idx_tool_calls_tool_name").on(d.tool_name),idx_tool_calls_timestamp:sqliteCore.index("idx_tool_calls_timestamp").on(d.timestamp)}));sqliteCore.sqliteTable("thread_boxes",{id:sqliteCore.text("id").primaryKey(),thread_id:sqliteCore.text("thread_id").notNull().references(()=>c.id,{onDelete:"cascade"}),seq:sqliteCore.integer("seq").notNull(),first_task_id:sqliteCore.text("first_task_id").notNull(),mid_task_id:sqliteCore.text("mid_task_id").notNull(),last_task_id:sqliteCore.text("last_task_id").notNull(),task_count:sqliteCore.integer("task_count").notNull(),summary:sqliteCore.text("summary"),source_tokens:sqliteCore.integer("source_tokens").notNull(),summary_tokens:sqliteCore.integer("summary_tokens"),created_at:sqliteCore.text("created_at").notNull()},d=>({idx_thread_boxes_thread_id:sqliteCore.index("idx_thread_boxes_thread_id").on(d.thread_id),idx_thread_boxes_seq:sqliteCore.index("idx_thread_boxes_seq").on(d.thread_id,d.seq),uniq_thread_boxes_thread_seq:sqliteCore.unique().on(d.thread_id,d.seq)}));sqliteCore.sqliteTable("request_logs",{id:sqliteCore.text("id").primaryKey(),path:sqliteCore.text("path").notNull(),method:sqliteCore.text("method").notNull(),status_code:sqliteCore.integer("status_code").notNull(),duration_ms:sqliteCore.integer("duration_ms").notNull(),ip:sqliteCore.text("ip"),request_headers:sqliteCore.text("request_headers"),response_headers:sqliteCore.text("response_headers"),request_body:sqliteCore.text("request_body"),response_body:sqliteCore.text("response_body"),query:sqliteCore.text("query"),user_id:sqliteCore.text("user_id"),project_id:sqliteCore.text("project_id"),partition_key:sqliteCore.text("partition_key").notNull(),timestamp:sqliteCore.text("timestamp").notNull().default(drizzleOrm.sql`(datetime('now'))`),metadata:sqliteCore.text("metadata")},d=>({idx_request_logs_timestamp:sqliteCore.index("idx_request_logs_timestamp").on(d.timestamp),idx_request_logs_path:sqliteCore.index("idx_request_logs_path").on(d.path),idx_request_logs_status_code:sqliteCore.index("idx_request_logs_status_code").on(d.status_code),idx_request_logs_partition_key:sqliteCore.index("idx_request_logs_partition_key").on(d.partition_key)}));var z="2026-05-09",ae="0.8.9-rc.13",H=10,q=parseInt(ae.split("rc.")[1]),tt=class extends M{dbPath;constructor(t={}){super(),t.dbPath?this.dbPath=t.dbPath:t.dbRoot&&(this.dbPath=O.join(t.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(t){let e=this.resolveDbPath();if(t){let n=O.dirname(e);fs.existsSync(n)||fs.mkdirSync(n,{recursive:true});}else if(!fs.existsSync(e))throw new u("NOT_FOUND","Database not found");let s=E(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(a).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 u?s:new u("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 u?s:new u("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:a.logs}).from(a).where(drizzleOrm.eq(a.id,t)).limit(1).get(),o=r?.logs?JSON.parse(r.logs):[];o.push(e),n.update(a).set({logs:JSON.stringify(o)}).where(drizzleOrm.eq(a.id,t)).run();},{behavior:"immediate"});}catch(n){throw n instanceof u?n:new u("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(a).where(drizzleOrm.eq(a.status,"running")).orderBy(drizzleOrm.desc(a.started_at)).all()}catch(e){throw new u("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(a).orderBy(drizzleOrm.desc(a.started_at)).limit(100).all()}catch(e){throw new u("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(a).where(drizzleOrm.eq(a.id,t)).limit(1).get()??void 0}catch(s){throw new u("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:a.id,status:a.status,pid:a.pid}).from(a).where(drizzleOrm.eq(a.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(a).set({status:"failed",error:"Killed by user",completed_at:new Date().toISOString()}).where(drizzleOrm.and(drizzleOrm.eq(a.id,t),drizzleOrm.eq(a.status,"running"))).run(),{killed:!0,pid:s.pid??void 0}}catch(s){throw s instanceof u?s:new u("DB_ERROR","Failed to kill task",s)}finally{e.close();}}reapOrphanedTasks(){if(!this.dbExists())return 0;let t=this.openHandle(true);try{let e=t.db.select({id:a.id,pid:a.pid}).from(a).where(drizzleOrm.eq(a.status,"running")).all(),s=0;for(let n of e){if(!n.pid)continue;let r=!1;try{process.kill(n.pid,0),r=!0;}catch{}r||(t.db.update(a).set({status:"failed",error:"Reaped: process not found (orphaned task)",completed_at:new Date().toISOString()}).where(drizzleOrm.and(drizzleOrm.eq(a.id,n.id),drizzleOrm.eq(a.status,"running"))).run(),s++);}return s}finally{t.close();}}findTaskStatus(t,e){let s=this.resolveDbPaths();for(let n of s){if(!fs.existsSync(n))continue;let r=b(n);try{let o=e?drizzleOrm.eq(a.workspace_id,e):void 0,i=o?drizzleOrm.and(drizzleOrm.eq(a.id,t),o):drizzleOrm.eq(a.id,t),l=r.db.select().from(a).where(i).limit(1).get()??void 0;if(!l){let p=drizzleOrm.or(drizzleOrm.eq(a.thread_id,t),drizzleOrm.and(drizzleOrm.isNull(a.thread_id),drizzleOrm.like(a.command,`%--thread=${t}%`))),_=o?drizzleOrm.and(p,o):p;l=r.db.select().from(a).where(_).orderBy(drizzleOrm.desc(a.started_at)).limit(1).get()??void 0;}if(l)return l}catch(o){throw new u("DB_ERROR","Failed to find task status",o)}finally{r.close();}}}findChildTasks(t,e){let s=this.resolveDbPaths(),n=new Set,r=[];for(let o of s){if(!fs.existsSync(o))continue;let i=b(o);try{let l=e?drizzleOrm.and(drizzleOrm.eq(a.parent_task_id,t),drizzleOrm.eq(a.workspace_id,e)):drizzleOrm.eq(a.parent_task_id,t),p=i.db.select().from(a).where(l).orderBy(drizzleOrm.asc(a.started_at)).all();for(let _ of p)n.has(_.id)||(n.add(_.id),r.push(_));}catch(l){throw new u("DB_ERROR","Failed to find child tasks",l)}finally{i.close();}}return r}getWorkspaceUsageSummary(t){if(!this.dbExists())return [];let e=this.openHandle(false);try{return e.db.all(t?drizzleOrm.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 u?s:new u("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:a.logs}).from(a).where(drizzleOrm.eq(a.id,t)).limit(1).get(),o=r?.logs?JSON.parse(r.logs):[];o.push(e),n.update(a).set({logs:JSON.stringify(o)}).where(drizzleOrm.eq(a.id,t)).run();},{behavior:"immediate"});}catch(n){throw n instanceof u?n:new u("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(a).where(drizzleOrm.eq(a.status,"running")).orderBy(drizzleOrm.desc(a.started_at)).all()}catch(e){throw new u("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(a).orderBy(drizzleOrm.desc(a.started_at)).limit(100).all()}catch(e){throw new u("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(a).where(drizzleOrm.eq(a.id,t)).limit(1).get()??void 0}catch(s){throw new u("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:a.id,status:a.status,pid:a.pid}).from(a).where(drizzleOrm.eq(a.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(a).set({status:"failed",error:"Killed by user",completed_at:new Date().toISOString()}).where(drizzleOrm.and(drizzleOrm.eq(a.id,t),drizzleOrm.eq(a.status,"running"))).run(),{killed:!0,pid:s.pid??void 0}}catch(s){throw s instanceof u?s:new u("DB_ERROR","Failed to kill task",s)}finally{e.close();}}reapOrphanedTasks(){if(!this.dbExists())return 0;let t=this.openHandle(true);try{let e=t.db.select({id:a.id,pid:a.pid}).from(a).where(drizzleOrm.eq(a.status,"running")).all(),s=0;for(let n of e){if(!n.pid)continue;let r=!1;try{process.kill(n.pid,0),r=!0;}catch{}r||(t.db.update(a).set({status:"failed",error:"Reaped: process not found (orphaned task)",completed_at:new Date().toISOString()}).where(drizzleOrm.and(drizzleOrm.eq(a.id,n.id),drizzleOrm.eq(a.status,"running"))).run(),s++);}return s}finally{t.close();}}findTaskStatus(t,e){let s=this.resolveDbPaths();for(let n of s){if(!fs.existsSync(n))continue;let r=E(n);try{let o=e?drizzleOrm.eq(a.workspace_id,e):void 0,i=o?drizzleOrm.and(drizzleOrm.eq(a.id,t),o):drizzleOrm.eq(a.id,t),l=r.db.select().from(a).where(i).limit(1).get()??void 0;if(!l){let p=drizzleOrm.or(drizzleOrm.eq(a.thread_id,t),drizzleOrm.and(drizzleOrm.isNull(a.thread_id),drizzleOrm.like(a.command,`%--thread=${t}%`))),_=o?drizzleOrm.and(p,o):p;l=r.db.select().from(a).where(_).orderBy(drizzleOrm.desc(a.started_at)).limit(1).get()??void 0;}if(l)return l}catch(o){throw new u("DB_ERROR","Failed to find task status",o)}finally{r.close();}}}findChildTasks(t,e){let s=this.resolveDbPaths(),n=new Set,r=[];for(let o of s){if(!fs.existsSync(o))continue;let i=E(o);try{let l=e?drizzleOrm.and(drizzleOrm.eq(a.parent_task_id,t),drizzleOrm.eq(a.workspace_id,e)):drizzleOrm.eq(a.parent_task_id,t),p=i.db.select().from(a).where(l).orderBy(drizzleOrm.asc(a.started_at)).all();for(let _ of p)n.has(_.id)||(n.add(_.id),r.push(_));}catch(l){throw new u("DB_ERROR","Failed to find child tasks",l)}finally{i.close();}}return r}getWorkspaceUsageSummary(t){if(!this.dbExists())return [];let e=this.openHandle(false);try{return e.db.all(t?drizzleOrm.sql`
16
16
  SELECT
17
17
  COALESCE(workspace_id, 'unknown') AS workspace_id,
18
18
  COALESCE(SUM(input_tokens), 0) AS input_tokens,
@@ -33,12 +33,24 @@ ${s.join(`
33
33
  FROM tasks
34
34
  GROUP BY workspace_id
35
35
  ORDER BY (COALESCE(SUM(input_tokens), 0) + COALESCE(SUM(output_tokens), 0)) DESC
36
- `)}catch(s){throw new u("DB_ERROR","Failed to get workspace usage summary",s)}finally{e.close();}}getThreadTokenUsage(t,e){let s=this.resolveDbPaths(),n=new Set,r=0,o=0,i=0;for(let l of s){if(!fs.existsSync(l))continue;let p=b(l);try{let _=drizzleOrm.or(drizzleOrm.eq(a.thread_id,t),drizzleOrm.and(drizzleOrm.isNull(a.thread_id),drizzleOrm.like(a.command,`%--thread=${t}%`))),g=e?drizzleOrm.and(_,drizzleOrm.eq(a.workspace_id,e)):_,k=p.db.select({id:a.id,input_tokens:a.input_tokens,output_tokens:a.output_tokens,cost_usd:a.cost_usd}).from(a).where(g).all();for(let T of k)n.has(T.id)||(n.add(T.id),r+=T.input_tokens??0,o+=T.output_tokens??0,i+=T.cost_usd??0);}catch(_){throw new u("DB_ERROR","Failed to get thread token usage",_)}finally{p.close();}}return {inputTokens:r,outputTokens:o,costUsd:i}}findTasksByThread(t,e){let s=this.resolveDbPaths(),n=new Set,r=[];for(let o of s){if(!fs.existsSync(o))continue;let i=b(o);try{let l=drizzleOrm.or(drizzleOrm.eq(a.thread_id,t),drizzleOrm.and(drizzleOrm.isNull(a.thread_id),drizzleOrm.like(a.command,`%--thread=${t}%`))),p=e?drizzleOrm.and(l,drizzleOrm.eq(a.workspace_id,e)):l,_=i.db.select().from(a).where(p).orderBy(drizzleOrm.asc(a.started_at)).all();for(let g of _)n.has(g.id)||(n.add(g.id),r.push(g));}catch(l){throw new u("DB_ERROR","Failed to find tasks by thread",l)}finally{i.close();}}return r}findAllTasks(t){if(!this.dbExists())return {rows:[],total:0};let e=this.openHandle(false);try{let s=[];t.workspaceId&&s.push(drizzleOrm.eq(a.workspace_id,t.workspaceId));let n=t.agents&&t.agents.length>0?t.agents:t.agentId?[t.agentId]:null;n&&s.push(drizzleOrm.inArray(a.agent_id,n));let r=t.statuses&&t.statuses.length>0?t.statuses:t.status?[t.status]:null;r&&s.push(drizzleOrm.inArray(a.status,r));let o=t.q??t.search;o&&s.push(drizzleOrm.like(a.prompt,`%${o}%`)),t.from&&s.push(drizzleOrm.gte(a.started_at,t.from)),t.to&&s.push(drizzleOrm.lt(a.started_at,t.to));let i=s.length>0?drizzleOrm.and(...s):void 0,l=e.db.select({count:drizzleOrm.sql`count(*)`}).from(a).where(i).get(),p=(t.sortDir??"DESC")==="ASC"?drizzleOrm.asc(a.started_at):drizzleOrm.desc(a.started_at);return {rows:e.db.select().from(a).where(i).orderBy(p).limit(t.limit).offset(t.offset).all(),total:l?.count??0}}catch(s){throw new u("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?drizzleOrm.sql`
36
+ `)}catch(s){throw new u("DB_ERROR","Failed to get workspace usage summary",s)}finally{e.close();}}getThreadTokenUsage(t,e){let s=this.resolveDbPaths(),n=new Set,r=0,o=0,i=0;for(let l of s){if(!fs.existsSync(l))continue;let p=E(l);try{let _=drizzleOrm.or(drizzleOrm.eq(a.thread_id,t),drizzleOrm.and(drizzleOrm.isNull(a.thread_id),drizzleOrm.like(a.command,`%--thread=${t}%`))),g=e?drizzleOrm.and(_,drizzleOrm.eq(a.workspace_id,e)):_,k=p.db.select({id:a.id,input_tokens:a.input_tokens,output_tokens:a.output_tokens,cost_usd:a.cost_usd}).from(a).where(g).all();for(let T of k)n.has(T.id)||(n.add(T.id),r+=T.input_tokens??0,o+=T.output_tokens??0,i+=T.cost_usd??0);}catch(_){throw new u("DB_ERROR","Failed to get thread token usage",_)}finally{p.close();}}return {inputTokens:r,outputTokens:o,costUsd:i}}findTasksByThread(t,e){let s=this.resolveDbPaths(),n=new Set,r=[];for(let o of s){if(!fs.existsSync(o))continue;let i=E(o);try{let l=drizzleOrm.or(drizzleOrm.eq(a.thread_id,t),drizzleOrm.and(drizzleOrm.isNull(a.thread_id),drizzleOrm.like(a.command,`%--thread=${t}%`))),p=e?drizzleOrm.and(l,drizzleOrm.eq(a.workspace_id,e)):l,_=i.db.select().from(a).where(p).orderBy(drizzleOrm.asc(a.started_at)).all();for(let g of _)n.has(g.id)||(n.add(g.id),r.push(g));}catch(l){throw new u("DB_ERROR","Failed to find tasks by thread",l)}finally{i.close();}}return r}findAllTasks(t){if(!this.dbExists())return {rows:[],total:0};let e=this.openHandle(false);try{let s=[];t.workspaceId&&s.push(drizzleOrm.eq(a.workspace_id,t.workspaceId));let n=t.agents&&t.agents.length>0?t.agents:t.agentId?[t.agentId]:null;n&&s.push(drizzleOrm.inArray(a.agent_id,n));let r=t.statuses&&t.statuses.length>0?t.statuses:t.status?[t.status]:null;r&&s.push(drizzleOrm.inArray(a.status,r));let o=t.q??t.search;o&&s.push(drizzleOrm.like(a.prompt,`%${o}%`)),t.from&&s.push(drizzleOrm.gte(a.started_at,t.from)),t.to&&s.push(drizzleOrm.lt(a.started_at,t.to));let i=s.length>0?drizzleOrm.and(...s):void 0,l=e.db.select({count:drizzleOrm.sql`count(*)`}).from(a).where(i).get(),p=(t.sortDir??"DESC")==="ASC"?drizzleOrm.asc(a.started_at):drizzleOrm.desc(a.started_at);return {rows:e.db.select().from(a).where(i).orderBy(p).limit(t.limit).offset(t.offset).all(),total:l?.count??0}}catch(s){throw new u("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?drizzleOrm.sql`
37
37
  SELECT
38
38
  t.agent_id,
39
39
  t.workspace_id,
40
40
  COUNT(*) AS total_tasks,
41
- COALESCE(SUM(t.input_tokens), 0) AS input_tokens,
41
+ COALESCE(SUM(
42
+ COALESCE(t.input_tokens, 0)
43
+ + CASE
44
+ WHEN t.started_at >= ${z}
45
+ AND (
46
+ t.crewx_version IS NULL
47
+ OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
48
+ OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${H}) AS INTEGER) < ${q})
49
+ )
50
+ THEN COALESCE(t.cached_input_tokens, 0)
51
+ ELSE 0
52
+ END
53
+ ), 0) AS input_tokens,
42
54
  COALESCE(SUM(t.output_tokens), 0) AS output_tokens,
43
55
  COALESCE(SUM(t.cached_input_tokens), 0) AS cached_input_tokens,
44
56
  COALESCE(SUM(t.cost_usd), 0) AS cost_usd
@@ -48,13 +60,40 @@ ${s.join(`
48
60
  AND t.started_at < ${e}
49
61
  AND t.workspace_id = ${s}
50
62
  GROUP BY t.agent_id, t.workspace_id
51
- ORDER BY (COALESCE(SUM(t.input_tokens), 0) + COALESCE(SUM(t.output_tokens), 0)) DESC
63
+ ORDER BY (
64
+ COALESCE(SUM(
65
+ COALESCE(t.input_tokens, 0)
66
+ + CASE
67
+ WHEN t.started_at >= ${z}
68
+ AND (
69
+ t.crewx_version IS NULL
70
+ OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
71
+ OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${H}) AS INTEGER) < ${q})
72
+ )
73
+ THEN COALESCE(t.cached_input_tokens, 0)
74
+ ELSE 0
75
+ END
76
+ ), 0)
77
+ + COALESCE(SUM(t.output_tokens), 0)
78
+ ) DESC
52
79
  `:drizzleOrm.sql`
53
80
  SELECT
54
81
  t.agent_id,
55
82
  t.workspace_id,
56
83
  COUNT(*) AS total_tasks,
57
- COALESCE(SUM(t.input_tokens), 0) AS input_tokens,
84
+ COALESCE(SUM(
85
+ COALESCE(t.input_tokens, 0)
86
+ + CASE
87
+ WHEN t.started_at >= ${z}
88
+ AND (
89
+ t.crewx_version IS NULL
90
+ OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
91
+ OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${H}) AS INTEGER) < ${q})
92
+ )
93
+ THEN COALESCE(t.cached_input_tokens, 0)
94
+ ELSE 0
95
+ END
96
+ ), 0) AS input_tokens,
58
97
  COALESCE(SUM(t.output_tokens), 0) AS output_tokens,
59
98
  COALESCE(SUM(t.cached_input_tokens), 0) AS cached_input_tokens,
60
99
  COALESCE(SUM(t.cost_usd), 0) AS cost_usd
@@ -63,12 +102,39 @@ ${s.join(`
63
102
  AND t.started_at >= ${t}
64
103
  AND t.started_at < ${e}
65
104
  GROUP BY t.agent_id, t.workspace_id
66
- ORDER BY (COALESCE(SUM(t.input_tokens), 0) + COALESCE(SUM(t.output_tokens), 0)) DESC
67
- `).map(o=>({agentId:o.agent_id,workspaceId:o.workspace_id??null,totalTasks:o.total_tasks,inputTokens:o.input_tokens,outputTokens:o.output_tokens,cachedInputTokens:o.cached_input_tokens,costUsd:o.cost_usd}))}catch(r){throw new u("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?drizzleOrm.sql`
105
+ ORDER BY (
106
+ COALESCE(SUM(
107
+ COALESCE(t.input_tokens, 0)
108
+ + CASE
109
+ WHEN t.started_at >= ${z}
110
+ AND (
111
+ t.crewx_version IS NULL
112
+ OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
113
+ OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${H}) AS INTEGER) < ${q})
114
+ )
115
+ THEN COALESCE(t.cached_input_tokens, 0)
116
+ ELSE 0
117
+ END
118
+ ), 0)
119
+ + COALESCE(SUM(t.output_tokens), 0)
120
+ ) DESC
121
+ `).map(o=>({agentId:o.agent_id,workspaceId:o.workspace_id??null,totalTasks:o.total_tasks,inputTokens:o.input_tokens,outputTokens:o.output_tokens,cachedInputTokens:o.cached_input_tokens,costUsd:o.cost_usd,totalTokens:o.input_tokens+o.output_tokens}))}catch(r){throw new u("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?drizzleOrm.sql`
68
122
  SELECT
69
123
  date(t.started_at) AS date,
70
124
  t.agent_id,
71
- COALESCE(SUM(t.input_tokens), 0) AS input_tokens,
125
+ COALESCE(SUM(
126
+ COALESCE(t.input_tokens, 0)
127
+ + CASE
128
+ WHEN t.started_at >= ${z}
129
+ AND (
130
+ t.crewx_version IS NULL
131
+ OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
132
+ OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${H}) AS INTEGER) < ${q})
133
+ )
134
+ THEN COALESCE(t.cached_input_tokens, 0)
135
+ ELSE 0
136
+ END
137
+ ), 0) AS input_tokens,
72
138
  COALESCE(SUM(t.output_tokens), 0) AS output_tokens,
73
139
  COALESCE(SUM(t.cached_input_tokens), 0) AS cached_input_tokens,
74
140
  COALESCE(SUM(t.cost_usd), 0) AS cost_usd
@@ -83,7 +149,19 @@ ${s.join(`
83
149
  SELECT
84
150
  date(t.started_at) AS date,
85
151
  t.agent_id,
86
- COALESCE(SUM(t.input_tokens), 0) AS input_tokens,
152
+ COALESCE(SUM(
153
+ COALESCE(t.input_tokens, 0)
154
+ + CASE
155
+ WHEN t.started_at >= ${z}
156
+ AND (
157
+ t.crewx_version IS NULL
158
+ OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
159
+ OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${H}) AS INTEGER) < ${q})
160
+ )
161
+ THEN COALESCE(t.cached_input_tokens, 0)
162
+ ELSE 0
163
+ END
164
+ ), 0) AS input_tokens,
87
165
  COALESCE(SUM(t.output_tokens), 0) AS output_tokens,
88
166
  COALESCE(SUM(t.cached_input_tokens), 0) AS cached_input_tokens,
89
167
  COALESCE(SUM(t.cost_usd), 0) AS cost_usd
@@ -93,7 +171,7 @@ ${s.join(`
93
171
  AND t.started_at < ${e}
94
172
  GROUP BY date(t.started_at), t.agent_id
95
173
  ORDER BY date(t.started_at) ASC
96
- `).map(o=>({date:o.date,agentId:o.agent_id,inputTokens:o.input_tokens,outputTokens:o.output_tokens,cachedInputTokens:o.cached_input_tokens,costUsd:o.cost_usd}))}catch(r){throw new u("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(a).where(drizzleOrm.and(drizzleOrm.eq(a.id,t),drizzleOrm.eq(a.workspace_id,e))).limit(1).get()??void 0}catch(n){throw new u("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(),o=s?drizzleOrm.and(drizzleOrm.eq(a.id,t),drizzleOrm.eq(a.status,"running"),drizzleOrm.eq(a.workspace_id,s)):drizzleOrm.and(drizzleOrm.eq(a.id,t),drizzleOrm.eq(a.status,"running"));n.db.update(a).set({status:"failed",error:e,completed_at:r}).where(o).run();}catch(r){throw r instanceof u?r:new u("DB_ERROR","Failed to mark task failed",r)}finally{n.close();}}findTasksByPromptHint(t,e){let s=this.resolveDbPaths(),n=new Set,r=[];for(let o of s){if(!fs.existsSync(o))continue;let i=b(o);try{let l=e?drizzleOrm.and(drizzleOrm.like(a.prompt,`%${t}%`),drizzleOrm.eq(a.workspace_id,e)):drizzleOrm.like(a.prompt,`%${t}%`),p=i.db.select().from(a).where(l).orderBy(drizzleOrm.asc(a.started_at)).all();for(let _ of p)n.has(_.id)||(n.add(_.id),r.push(_));}catch(l){throw new u("DB_ERROR","Failed to find tasks by prompt hint",l)}finally{i.close();}}return r}};var at=class extends v{name="sqlite-tracing";unsubs=[];dbPath;version;constructor(t){super(),this.dbPath=O.join(t?.dbRoot??Pt.homedir(),".crewx","crewx.db"),this.version=t?.version??"unknown";}attach(t){let e=new V({dbPath:this.dbPath}),s=process.cwd(),r=fs.existsSync(O.join(s,"crewx.yaml"))||fs.existsSync(O.join(s,"crewx.yml"))?_t(s):null,o=process.argv.join(" ");this.unsubs.push(t.on("task:start",i=>{try{let l=i.callerAgentId??null,p=i.parentTaskId??null,_=i.rootTraceId??i.traceId,g=i.metadata?JSON.stringify(i.metadata):JSON.stringify({provider:i.provider??"cli/claude"});e.startTask({id:i.traceId,agentId:i.agentRef.replace(/^@/,""),prompt:i.message,mode:i.mode,status:"running",pid:i.pid??null,startedAt:i.timestamp.toISOString(),crewxVersion:this.version,platform:i.platform??"cli",model:i.model??null,renderedPrompt:i.renderedPrompt??null,command:o,codingAgentCommand:i.codingAgentCommand??null,workspaceId:i.workspaceId??r,callerAgentId:l,parentTaskId:p,traceId:_,metadata:g,threadId:i.threadId??null});}catch{}}),t.on("task:output",i=>{try{e.appendLog(i.traceId,{timestamp:i.timestamp.toISOString(),level:i.level??"stdout",message:i.output});}catch{}}),t.on("task:end",i=>{try{e.finishTask({id:i.traceId,status:i.error?"failed":"success",result:i.result??null,error:i.error?JSON.stringify(i.error):null,completedAt:i.timestamp.toISOString(),durationMs:i.durationMs,exitCode:i.exitCode??null,inputTokens:i.inputTokens??0,outputTokens:i.outputTokens??0,cachedInputTokens:i.cachedInputTokens??0,costUsd:i.costUsd??0,model:i.model??null});}catch{}}));}detach(t){this.unsubs.forEach(e=>e()),this.unsubs=[];}};var Q=class extends I{dbPath;constructor(t={}){super(),t.dbPath?this.dbPath=t.dbPath:t.dbRoot&&(this.dbPath=O.join(t.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(t){let e=this.resolveDbPath();if(t){let n=O.dirname(e);fs.existsSync(n)||fs.mkdirSync(n,{recursive:true});}else if(!fs.existsSync(e))throw new u("NOT_FOUND","Database not found");let s=b(e);if(t)try{W(s.db,e);}catch(n){throw s.close(),n}return s}validateWorkspaceId(t,e){return t.db.select({id:U.id}).from(U).where(drizzleOrm.eq(U.id,e)).limit(1).get()?e:null}topLevelTaskPredicateSql(t="child"){return drizzleOrm.sql.raw(`(
174
+ `).map(o=>({date:o.date,agentId:o.agent_id,inputTokens:o.input_tokens,outputTokens:o.output_tokens,cachedInputTokens:o.cached_input_tokens,costUsd:o.cost_usd,totalTokens:o.input_tokens+o.output_tokens}))}catch(r){throw new u("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(a).where(drizzleOrm.and(drizzleOrm.eq(a.id,t),drizzleOrm.eq(a.workspace_id,e))).limit(1).get()??void 0}catch(n){throw new u("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(),o=s?drizzleOrm.and(drizzleOrm.eq(a.id,t),drizzleOrm.eq(a.status,"running"),drizzleOrm.eq(a.workspace_id,s)):drizzleOrm.and(drizzleOrm.eq(a.id,t),drizzleOrm.eq(a.status,"running"));n.db.update(a).set({status:"failed",error:e,completed_at:r}).where(o).run();}catch(r){throw r instanceof u?r:new u("DB_ERROR","Failed to mark task failed",r)}finally{n.close();}}findTasksByPromptHint(t,e){let s=this.resolveDbPaths(),n=new Set,r=[];for(let o of s){if(!fs.existsSync(o))continue;let i=E(o);try{let l=e?drizzleOrm.and(drizzleOrm.like(a.prompt,`%${t}%`),drizzleOrm.eq(a.workspace_id,e)):drizzleOrm.like(a.prompt,`%${t}%`),p=i.db.select().from(a).where(l).orderBy(drizzleOrm.asc(a.started_at)).all();for(let _ of p)n.has(_.id)||(n.add(_.id),r.push(_));}catch(l){throw new u("DB_ERROR","Failed to find tasks by prompt hint",l)}finally{i.close();}}return r}};var ct=class extends N{name="sqlite-tracing";unsubs=[];dbPath;version;constructor(t){super(),this.dbPath=O.join(t?.dbRoot??It.homedir(),".crewx","crewx.db"),this.version=t?.version??"unknown";}attach(t){let e=new tt({dbPath:this.dbPath}),s=process.cwd(),r=fs.existsSync(O.join(s,"crewx.yaml"))||fs.existsSync(O.join(s,"crewx.yml"))?ft(s):null,o=process.argv.join(" ");this.unsubs.push(t.on("task:start",i=>{try{let l=i.callerAgentId??null,p=i.parentTaskId??null,_=i.rootTraceId??i.traceId,g=i.metadata?JSON.stringify(i.metadata):JSON.stringify({provider:i.provider??"cli/claude"});e.startTask({id:i.traceId,agentId:i.agentRef.replace(/^@/,""),prompt:i.message,mode:i.mode,status:"running",pid:i.pid??null,startedAt:i.timestamp.toISOString(),crewxVersion:this.version,platform:i.platform??"cli",model:i.model??null,renderedPrompt:i.renderedPrompt??null,command:o,codingAgentCommand:i.codingAgentCommand??null,workspaceId:i.workspaceId??r,callerAgentId:l,parentTaskId:p,traceId:_,metadata:g,threadId:i.threadId??null});}catch{}}),t.on("task:output",i=>{try{e.appendLog(i.traceId,{timestamp:i.timestamp.toISOString(),level:i.level??"stdout",message:i.output});}catch{}}),t.on("task:end",i=>{try{e.finishTask({id:i.traceId,status:i.error?"failed":"success",result:i.result??null,error:i.error?JSON.stringify(i.error):null,completedAt:i.timestamp.toISOString(),durationMs:i.durationMs,exitCode:i.exitCode??null,inputTokens:i.inputTokens??0,outputTokens:i.outputTokens??0,cachedInputTokens:i.cachedInputTokens??0,costUsd:i.costUsd??0,model:i.model??null});}catch{}}));}detach(t){this.unsubs.forEach(e=>e()),this.unsubs=[];}};var et=class extends M{dbPath;constructor(t={}){super(),t.dbPath?this.dbPath=t.dbPath:t.dbRoot&&(this.dbPath=O.join(t.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(t){let e=this.resolveDbPath();if(t){let n=O.dirname(e);fs.existsSync(n)||fs.mkdirSync(n,{recursive:true});}else if(!fs.existsSync(e))throw new u("NOT_FOUND","Database not found");let s=E(e);if(t)try{X(s.db,e);}catch(n){throw s.close(),n}return s}validateWorkspaceId(t,e){return t.db.select({id:U.id}).from(U).where(drizzleOrm.eq(U.id,e)).limit(1).get()?e:null}topLevelTaskPredicateSql(t="child"){return drizzleOrm.sql.raw(`(
97
175
  ${t}.parent_task_id IS NULL
98
176
  OR ${t}.parent_task_id = ''
99
177
  OR NOT EXISTS (
@@ -101,7 +179,7 @@ ${s.join(`
101
179
  WHERE parent.id = ${t}.parent_task_id
102
180
  AND parent.thread_id = ${t}.thread_id
103
181
  )
104
- )`)}findAllThreads(t){let e=this.resolveDbPaths(),s=new Set,n=[];for(let r of e){if(!fs.existsSync(r))continue;let o=b(r);try{let i=t?drizzleOrm.eq(c.workspace_id,t):void 0,l=o.db.select().from(c).where(i).orderBy(drizzleOrm.desc(c.updated_at)).all();for(let p of l)s.has(p.id)||(s.add(p.id),n.push(p));}catch(i){throw new u("DB_ERROR","Failed to find all threads",i)}finally{o.close();}}return n}findThreadById(t,e){let s=this.resolveDbPaths();for(let n of s){if(!fs.existsSync(n))continue;let r=b(n);try{let o=drizzleOrm.eq(c.id,t),i=e?drizzleOrm.and(o,drizzleOrm.eq(c.workspace_id,e)):o,l=r.db.select().from(c).where(i).limit(1).get()??void 0;if(l)return l}catch(o){throw new u("DB_ERROR","Failed to find thread by id",o)}finally{r.close();}}}threadExists(t,e){let s=this.resolveDbPaths();for(let n of s){if(!fs.existsSync(n))continue;let r=b(n);try{let o=drizzleOrm.eq(c.id,t),i=e?drizzleOrm.and(o,drizzleOrm.eq(c.workspace_id,e)):o;if(r.db.select({id:c.id}).from(c).where(i).limit(1).get())return !0}catch(o){throw new u("DB_ERROR","Failed to check thread existence",o)}finally{r.close();}}return false}aggregateTaskStats(t,e){let s=this.resolveDbPaths(),n=0,r=0,o=0,i=0,l=0,p=new Set;for(let _ of s){if(!fs.existsSync(_))continue;let g=b(_);try{let k=g.db.get(drizzleOrm.sql`
182
+ )`)}findAllThreads(t){let e=this.resolveDbPaths(),s=new Set,n=[];for(let r of e){if(!fs.existsSync(r))continue;let o=E(r);try{let i=t?drizzleOrm.eq(c.workspace_id,t):void 0,l=o.db.select().from(c).where(i).orderBy(drizzleOrm.desc(c.updated_at)).all();for(let p of l)s.has(p.id)||(s.add(p.id),n.push(p));}catch(i){throw new u("DB_ERROR","Failed to find all threads",i)}finally{o.close();}}return n}findThreadById(t,e){let s=this.resolveDbPaths();for(let n of s){if(!fs.existsSync(n))continue;let r=E(n);try{let o=drizzleOrm.eq(c.id,t),i=e?drizzleOrm.and(o,drizzleOrm.eq(c.workspace_id,e)):o,l=r.db.select().from(c).where(i).limit(1).get()??void 0;if(l)return l}catch(o){throw new u("DB_ERROR","Failed to find thread by id",o)}finally{r.close();}}}threadExists(t,e){let s=this.resolveDbPaths();for(let n of s){if(!fs.existsSync(n))continue;let r=E(n);try{let o=drizzleOrm.eq(c.id,t),i=e?drizzleOrm.and(o,drizzleOrm.eq(c.workspace_id,e)):o;if(r.db.select({id:c.id}).from(c).where(i).limit(1).get())return !0}catch(o){throw new u("DB_ERROR","Failed to check thread existence",o)}finally{r.close();}}return false}aggregateTaskStats(t,e){let s=this.resolveDbPaths(),n=0,r=0,o=0,i=0,l=0,p=new Set;for(let _ of s){if(!fs.existsSync(_))continue;let g=E(_);try{let k=g.db.get(drizzleOrm.sql`
105
183
  SELECT
106
184
  count(*) AS cnt,
107
185
  COALESCE(SUM(child.input_tokens), 0) AS total_input,
@@ -118,13 +196,13 @@ ${s.join(`
118
196
  AND child.agent_id IS NOT NULL AND child.agent_id != ''
119
197
  AND ${this.topLevelTaskPredicateSql()}
120
198
  ${e?drizzleOrm.sql`AND child.workspace_id = ${e}`:drizzleOrm.sql``}
121
- `);for(let q of T)p.add(q.agent_id);}catch(k){throw new u("DB_ERROR","Failed to aggregate task stats",k)}finally{g.close();}}return {taskCount:n,inputTokens:r,outputTokens:o,cachedInputTokens:i,costUsd:l,agentIds:Array.from(p)}}findTopLevelTasks(t,e){let s=this.resolveDbPaths(),n=new Set,r=[];for(let o of s){if(!fs.existsSync(o))continue;let i=b(o);try{let l=i.db.all(drizzleOrm.sql`
199
+ `);for(let W of T)p.add(W.agent_id);}catch(k){throw new u("DB_ERROR","Failed to aggregate task stats",k)}finally{g.close();}}return {taskCount:n,inputTokens:r,outputTokens:o,cachedInputTokens:i,costUsd:l,agentIds:Array.from(p)}}findTopLevelTasks(t,e){let s=this.resolveDbPaths(),n=new Set,r=[];for(let o of s){if(!fs.existsSync(o))continue;let i=E(o);try{let l=i.db.all(drizzleOrm.sql`
122
200
  SELECT child.* FROM tasks child
123
201
  WHERE child.thread_id = ${t}
124
202
  AND ${this.topLevelTaskPredicateSql()}
125
203
  ${e?drizzleOrm.sql`AND child.workspace_id = ${e}`:drizzleOrm.sql``}
126
204
  ORDER BY child.started_at ASC
127
- `);for(let p of l)n.has(p.id)||(n.add(p.id),r.push(p));}catch(l){throw new u("DB_ERROR","Failed to find top-level tasks",l)}finally{i.close();}}return r}findAllTasks(t,e){let s=this.resolveDbPaths(),n=new Set,r=[];for(let o of s){if(!fs.existsSync(o))continue;let i=b(o);try{let l=drizzleOrm.eq(a.thread_id,t),p=e?drizzleOrm.and(l,drizzleOrm.eq(a.workspace_id,e)):l,_=i.db.select().from(a).where(p).orderBy(drizzleOrm.asc(a.started_at)).all();for(let g of _)n.has(g.id)||(n.add(g.id),r.push(g));}catch(l){throw new u("DB_ERROR","Failed to find all tasks for thread",l)}finally{i.close();}}return r}findTaskById(t,e,s){let n=this.resolveDbPaths();for(let r of n){if(!fs.existsSync(r))continue;let o=b(r);try{let i=drizzleOrm.and(drizzleOrm.eq(a.id,e),drizzleOrm.eq(a.thread_id,t)),l=s?drizzleOrm.and(i,drizzleOrm.eq(a.workspace_id,s)):i,p=o.db.select().from(a).where(l).limit(1).get();if(!p)continue;let _=o.db.select().from(a).where(drizzleOrm.eq(a.parent_task_id,p.id)).orderBy(drizzleOrm.asc(a.started_at)).all();return {task:p,children:_}}catch(i){throw new u("DB_ERROR","Failed to find task by id",i)}finally{o.close();}}}batchFetchTasks(t,e){let s=new Map;if(t.length===0)return s;let n=this.resolveDbPaths();for(let r of n){if(!fs.existsSync(r))continue;let o=b(r);try{let i=o.db.all(drizzleOrm.sql`
205
+ `);for(let p of l)n.has(p.id)||(n.add(p.id),r.push(p));}catch(l){throw new u("DB_ERROR","Failed to find top-level tasks",l)}finally{i.close();}}return r}findAllTasks(t,e){let s=this.resolveDbPaths(),n=new Set,r=[];for(let o of s){if(!fs.existsSync(o))continue;let i=E(o);try{let l=drizzleOrm.eq(a.thread_id,t),p=e?drizzleOrm.and(l,drizzleOrm.eq(a.workspace_id,e)):l,_=i.db.select().from(a).where(p).orderBy(drizzleOrm.asc(a.started_at)).all();for(let g of _)n.has(g.id)||(n.add(g.id),r.push(g));}catch(l){throw new u("DB_ERROR","Failed to find all tasks for thread",l)}finally{i.close();}}return r}findTaskById(t,e,s){let n=this.resolveDbPaths();for(let r of n){if(!fs.existsSync(r))continue;let o=E(r);try{let i=drizzleOrm.and(drizzleOrm.eq(a.id,e),drizzleOrm.eq(a.thread_id,t)),l=s?drizzleOrm.and(i,drizzleOrm.eq(a.workspace_id,s)):i,p=o.db.select().from(a).where(l).limit(1).get();if(!p)continue;let _=o.db.select().from(a).where(drizzleOrm.eq(a.parent_task_id,p.id)).orderBy(drizzleOrm.asc(a.started_at)).all();return {task:p,children:_}}catch(i){throw new u("DB_ERROR","Failed to find task by id",i)}finally{o.close();}}}batchFetchTasks(t,e){let s=new Map;if(t.length===0)return s;let n=this.resolveDbPaths();for(let r of n){if(!fs.existsSync(r))continue;let o=E(r);try{let i=o.db.all(drizzleOrm.sql`
128
206
  SELECT child.* FROM tasks child
129
207
  WHERE child.thread_id IN (${drizzleOrm.sql.join(t.map(l=>drizzleOrm.sql`${l}`),drizzleOrm.sql`, `)})
130
208
  AND ${this.topLevelTaskPredicateSql()}
@@ -138,7 +216,7 @@ ${s.join(`
138
216
  message_count = message_count + 1,
139
217
  updated_at = ${r}
140
218
  WHERE id = ${t}
141
- `),p},{behavior:"immediate"})}}catch(r){throw r instanceof u?r:new u("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(c).set({last_message:e,updated_at:r}).where(drizzleOrm.eq(c.id,t)).run();}catch(r){throw r instanceof u?r:new u("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(c).set(n).where(drizzleOrm.eq(c.id,t)).run();}catch(n){throw n instanceof u?n:new u("DB_ERROR","Failed to update thread",n)}finally{s.close();}}togglePin(t,e){let s=this.openHandle(true);try{let n=e?drizzleOrm.and(drizzleOrm.eq(c.id,t),drizzleOrm.eq(c.workspace_id,e)):drizzleOrm.eq(c.id,t),r=s.db.select({pinned:c.pinned,metadata:c.metadata}).from(c).where(n).get();if(!r)return null;let o=r.pinned?0:1,i=r.metadata?JSON.parse(r.metadata):{};if(o){let l=e?drizzleOrm.and(drizzleOrm.eq(c.pinned,1),drizzleOrm.eq(c.workspace_id,e)):drizzleOrm.eq(c.pinned,1),p=s.db.select({metadata:c.metadata}).from(c).where(l).all(),_=0;for(let g of p){let k=g.metadata?JSON.parse(g.metadata):{};typeof k.pinOrder=="number"&&k.pinOrder>_&&(_=k.pinOrder);}i.pinOrder=_+1;}else delete i.pinOrder;return s.db.update(c).set({pinned:o,metadata:Object.keys(i).length>0?JSON.stringify(i):null}).where(n).run(),{pinned:!!o}}catch(n){throw n instanceof u?n:new u("DB_ERROR","Failed to toggle pin",n)}finally{s.close();}}reorderPins(t,e){let s=this.openHandle(true);try{for(let n=0;n<t.length;n++){let r=e?drizzleOrm.and(drizzleOrm.eq(c.id,t[n]),drizzleOrm.eq(c.workspace_id,e)):drizzleOrm.eq(c.id,t[n]),o=s.db.select({metadata:c.metadata}).from(c).where(r).get();if(!o)continue;let i=o.metadata?JSON.parse(o.metadata):{};i.pinOrder=n+1,s.db.update(c).set({metadata:JSON.stringify(i)}).where(r).run();}}catch(n){throw n instanceof u?n:new u("DB_ERROR","Failed to reorder pins",n)}finally{s.close();}}toggleStar(t,e){let s=this.openHandle(true);try{let n=e?drizzleOrm.and(drizzleOrm.eq(c.id,t),drizzleOrm.eq(c.workspace_id,e)):drizzleOrm.eq(c.id,t),r=s.db.select({starred:c.starred}).from(c).where(n).get();if(!r)return null;let o=r.starred?0:1;return s.db.update(c).set({starred:o}).where(n).run(),{starred:!!o}}catch(n){throw n instanceof u?n:new u("DB_ERROR","Failed to toggle star",n)}finally{s.close();}}};function ue(d){return d.replace(/<conversation_history[^>]*>[\s\S]*?<\/conversation_history>/g,"").split(`
219
+ `),p},{behavior:"immediate"})}}catch(r){throw r instanceof u?r:new u("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(c).set({last_message:e,updated_at:r}).where(drizzleOrm.eq(c.id,t)).run();}catch(r){throw r instanceof u?r:new u("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(c).set(n).where(drizzleOrm.eq(c.id,t)).run();}catch(n){throw n instanceof u?n:new u("DB_ERROR","Failed to update thread",n)}finally{s.close();}}togglePin(t,e){let s=this.openHandle(true);try{let n=e?drizzleOrm.and(drizzleOrm.eq(c.id,t),drizzleOrm.eq(c.workspace_id,e)):drizzleOrm.eq(c.id,t),r=s.db.select({pinned:c.pinned,metadata:c.metadata}).from(c).where(n).get();if(!r)return null;let o=r.pinned?0:1,i=r.metadata?JSON.parse(r.metadata):{};if(o){let l=e?drizzleOrm.and(drizzleOrm.eq(c.pinned,1),drizzleOrm.eq(c.workspace_id,e)):drizzleOrm.eq(c.pinned,1),p=s.db.select({metadata:c.metadata}).from(c).where(l).all(),_=0;for(let g of p){let k=g.metadata?JSON.parse(g.metadata):{};typeof k.pinOrder=="number"&&k.pinOrder>_&&(_=k.pinOrder);}i.pinOrder=_+1;}else delete i.pinOrder;return s.db.update(c).set({pinned:o,metadata:Object.keys(i).length>0?JSON.stringify(i):null}).where(n).run(),{pinned:!!o}}catch(n){throw n instanceof u?n:new u("DB_ERROR","Failed to toggle pin",n)}finally{s.close();}}reorderPins(t,e){let s=this.openHandle(true);try{for(let n=0;n<t.length;n++){let r=e?drizzleOrm.and(drizzleOrm.eq(c.id,t[n]),drizzleOrm.eq(c.workspace_id,e)):drizzleOrm.eq(c.id,t[n]),o=s.db.select({metadata:c.metadata}).from(c).where(r).get();if(!o)continue;let i=o.metadata?JSON.parse(o.metadata):{};i.pinOrder=n+1,s.db.update(c).set({metadata:JSON.stringify(i)}).where(r).run();}}catch(n){throw n instanceof u?n:new u("DB_ERROR","Failed to reorder pins",n)}finally{s.close();}}toggleStar(t,e){let s=this.openHandle(true);try{let n=e?drizzleOrm.and(drizzleOrm.eq(c.id,t),drizzleOrm.eq(c.workspace_id,e)):drizzleOrm.eq(c.id,t),r=s.db.select({starred:c.starred}).from(c).where(n).get();if(!r)return null;let o=r.starred?0:1;return s.db.update(c).set({starred:o}).where(n).run(),{starred:!!o}}catch(n){throw n instanceof u?n:new u("DB_ERROR","Failed to toggle star",n)}finally{s.close();}}};function me(d){return d.replace(/<conversation_history[^>]*>[\s\S]*?<\/conversation_history>/g,"").split(`
142
220
  `).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(`
143
- `).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(`
144
- `):e&&typeof e=="object"&&e.result!==void 0&&(t=e.result||"");}catch{t=ue(t);}return t}var Z=class{dbPath;constructor(t){this.dbPath=t??O.join(Pt.homedir(),".crewx","crewx.db");}getThreadRepo(){return new Q({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 {created:false}}return n.ensureThread(t,e,s),{created:true}}async fetchHistory(t,e){let s=e?.limit??100,n=this.getThreadRepo(),r=n.findThreadById(t),o=n.findTopLevelTasks(t),i=new Set(["done","completed","success"]);o=o.filter(_=>(!_.status||i.has(_.status))&&(!e?.currentTraceId||_.trace_id!==e.currentTraceId)),o=o.slice(0,s);let l=r?.platform??"cli",p=this.rowsToMessages(o);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){let{firstMessage:r}=this.getThreadRepo().saveUserMessage(t,e);return {id:t,firstMessage:r}}async saveAssistantMessage(t,e,s,n){return this.getThreadRepo().saveAssistantMessage(t,e),{id:t}}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(),metadata:{caller_agent_id:s.caller_agent_id}});let n=pe(s.result);n&&e.push({id:`${s.id}-assistant`,text:n,isAssistant:true,timestamp:new Date(s.started_at).getTime(),metadata:{agent_id:s.agent_id,task_id:s.id}});}return e}};var dt=class extends v{name="conversation";_provider;unsubStart=null;unsubEnd=null;constructor(t){super(),this._provider=new Z(t?.dbPath);}get conversationProvider(){return this._provider}async afterUserMessage(t,e,s,n){}async afterAssistantMessage(t,e,s){}attach(t){this.unsubStart=t.on("task:start",async e=>{if(!e.threadId)return;let s=e.platform??"cli";try{let n=await this._provider.ensureThread(e.threadId,s,e.workspaceId),r=await this._provider.saveUserMessage(e.threadId,e.message??"");await this.afterUserMessage(e.threadId,r.id,n.created||r.firstMessage,e);}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{let{id:r}=await this._provider.saveAssistantMessage(s,e.result,n);await this.afterAssistantMessage(s,r,e);}catch{}});}detach(t){this.unsubStart?.(),this.unsubStart=null,this.unsubEnd?.(),this.unsubEnd=null,this._provider.close?.();}};exports.ConversationPlugin=dt;exports.FileLoggerPlugin=tt;exports.SqliteTracingPlugin=at;
221
+ `).trim()}function fe(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(`
222
+ `):e&&typeof e=="object"&&e.result!==void 0&&(t=e.result||"");}catch{t=me(t);}return t}var st=class{dbPath;constructor(t){this.dbPath=t??O.join(It.homedir(),".crewx","crewx.db");}getThreadRepo(){return new et({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 {created:false}}return n.ensureThread(t,e,s),{created:true}}async fetchHistory(t,e){let s=e?.limit??100,n=this.getThreadRepo(),r=n.findThreadById(t),o=n.findTopLevelTasks(t),i=new Set(["done","completed","success"]);o=o.filter(_=>(!_.status||i.has(_.status))&&(!e?.currentTraceId||_.trace_id!==e.currentTraceId)),o=o.slice(0,s);let l=r?.platform??"cli",p=this.rowsToMessages(o);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){let{firstMessage:r}=this.getThreadRepo().saveUserMessage(t,e);return {id:t,firstMessage:r}}async saveAssistantMessage(t,e,s,n){return this.getThreadRepo().saveAssistantMessage(t,e),{id:t}}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(),metadata:{caller_agent_id:s.caller_agent_id}});let n=fe(s.result);n&&e.push({id:`${s.id}-assistant`,text:n,isAssistant:true,timestamp:new Date(s.started_at).getTime(),metadata:{agent_id:s.agent_id,task_id:s.id}});}return e}};var ut=class extends N{name="conversation";_provider;unsubStart=null;unsubEnd=null;constructor(t){super(),this._provider=new st(t?.dbPath);}get conversationProvider(){return this._provider}async afterUserMessage(t,e,s,n){}async afterAssistantMessage(t,e,s){}attach(t){this.unsubStart=t.on("task:start",async e=>{if(!e.threadId)return;let s=e.platform??"cli";try{let n=await this._provider.ensureThread(e.threadId,s,e.workspaceId),r=await this._provider.saveUserMessage(e.threadId,e.message??"");await this.afterUserMessage(e.threadId,r.id,n.created||r.firstMessage,e);}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{let{id:r}=await this._provider.saveAssistantMessage(s,e.result,n);await this.afterAssistantMessage(s,r,e);}catch{}});}detach(t){this.unsubStart?.(),this.unsubStart=null,this.unsubEnd?.(),this.unsubEnd=null,this._provider.close?.();}};exports.ConversationPlugin=ut;exports.FileLoggerPlugin=nt;exports.SqliteTracingPlugin=ct;
@@ -1,3 +1,4 @@
1
+ import type { InitializeResponse, NewSessionResponse } from './types.js';
1
2
  export interface AcpProviderMetaResult {
2
3
  id: string;
3
4
  name: string;
@@ -13,5 +14,7 @@ export interface AcpProviderMetaResult {
13
14
  }>;
14
15
  capabilities: Record<string, boolean>;
15
16
  }
17
+ declare function extractProviderMeta(adapterId: string, displayName: string | undefined, initResponse: InitializeResponse, sessionResponse: NewSessionResponse): AcpProviderMetaResult;
16
18
  export declare function queryAcpProviderMeta(adapterId: string): Promise<AcpProviderMetaResult | null>;
17
19
  export declare function queryAllAcpProviderMetas(): Promise<AcpProviderMetaResult[]>;
20
+ export { extractProviderMeta as _extractProviderMeta };