@crewx/sdk 0.9.0-rc.65 → 0.9.0-rc.67

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,52 +1,59 @@
1
- 'use strict';var fs=require('fs'),Y=require('path'),we=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 Y__namespace=/*#__PURE__*/_interopNamespace(Y);var we__default=/*#__PURE__*/_interopDefault(we);var kt=(o=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(o,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):o)(function(o){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+o+'" is not supported')});var tt=class{detach(t){}};function qt(o){let t=n=>String(n).padStart(2,"0");return `${o.getFullYear()}${t(o.getMonth()+1)}${t(o.getDate())}T${t(o.getHours())}${t(o.getMinutes())}${t(o.getSeconds())}`}function vt(o){let t=o.toISOString();return `${t.slice(0,10)} ${t.slice(11,19)} UTC`}var $t=class extends tt{name="file-logger";unsubs=[];logFiles=new Map;logsDir;version;constructor(t){super(),this.logsDir=Y.join(t?.workspaceRoot??process.cwd(),".crewx","logs"),this.version=t?.version??"unknown";}attach(t){this.unsubs.push(t.on("task:start",n=>{try{fs.existsSync(this.logsDir)||fs.mkdirSync(this.logsDir,{recursive:!0});let s=qt(n.timestamp),r=Y.join(this.logsDir,`${s}_${n.traceId}.log`);this.logFiles.set(n.traceId,r);let i=`=== TASK LOG: ${n.traceId} ===
1
+ 'use strict';var fs=require('fs'),V=require('path'),Ce=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 V__namespace=/*#__PURE__*/_interopNamespace(V);var Ce__default=/*#__PURE__*/_interopDefault(Ce);var yt=(r=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(r,{get:(t,e)=>(typeof require<"u"?require:t)[e]}):r)(function(r){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+r+'" is not supported')});var nt=class{detach(t){}};function Kt(r){let t=e=>String(e).padStart(2,"0");return `${r.getFullYear()}${t(r.getMonth()+1)}${t(r.getDate())}T${t(r.getHours())}${t(r.getMinutes())}${t(r.getSeconds())}`}function Ot(r){let t=r.toISOString();return `${t.slice(0,10)} ${t.slice(11,19)} UTC`}var It=class extends nt{name="file-logger";unsubs=[];logFiles=new Map;logsDir;version;constructor(t){super(),this.logsDir=V.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=Kt(e.timestamp),o=V.join(this.logsDir,`${s}_${e.traceId}.log`);this.logFiles.set(e.traceId,o);let i=`=== TASK LOG: ${e.traceId} ===
2
2
  CrewX Version: ${this.version}
3
- Mode: ${n.mode}
4
- Agent: ${n.agentRef}
5
- Started: ${vt(n.timestamp)}
6
- Message: ${n.message}
3
+ Mode: ${e.mode}
4
+ Agent: ${e.agentRef}
5
+ Started: ${Ot(e.timestamp)}
6
+ Message: ${e.message}
7
7
 
8
- `;fs.writeFileSync(r,i,{encoding:"utf8",mode:384});}catch{}}),t.on("task:output",n=>{try{let s=this.logFiles.get(n.traceId);if(!s)return;let r=new Date().toISOString();fs.appendFileSync(s,`[${r}] STDOUT: ${n.output}
9
- `,"utf8");}catch{}}),t.on("task:end",n=>{try{let s=this.logFiles.get(n.traceId);if(!s)return;let r=vt(new Date),i=n.error?`failed: ${n.error.message}`:"completed successfully",a=`[${r}] INFO: Task ${i} in ${n.durationMs}ms
10
- [${r}] INFO: Process closed with exit code: ${n.error?1:0}
11
- `;fs.appendFileSync(s,a,"utf8"),this.logFiles.delete(n.traceId);}catch{}}));}detach(t){this.unsubs.forEach(n=>n()),this.unsubs=[],this.logFiles.clear();}};function ge(o){let t=Y__namespace.resolve(o);return process.platform==="win32"&&(t=t.replace(/\\/g,"/"),t=t.replace(/^([A-Z]):/,(n,s)=>`${s.toLowerCase()}:`)),t.length>1&&!/^[a-zA-Z]:\/$/.test(t)&&(t=t.replace(/\/+$/,"")),t}function Kt(o){let t=ge(o);return crypto.createHash("sha256").update(t).digest("hex")}var ut=class{resolveDbPath(){return process.env.CREWX_DB?process.env.CREWX_DB:process.env.CREWX_TRACES_DB?process.env.CREWX_TRACES_DB:Y.join(we__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 R(o){let t=kt("better-sqlite3"),{drizzle:n}=kt("drizzle-orm/better-sqlite3"),s=new t(o);return s.exec("PRAGMA journal_mode = WAL"),s.exec("PRAGMA busy_timeout = 5000"),s.exec("PRAGMA foreign_keys = ON"),s.exec("PRAGMA analysis_limit = 400"),s.exec("PRAGMA optimize"),{db:n(s),runRaw:(r,i=[])=>s.prepare(r).run(...i),close:()=>s.close()}}var Gt=new Set,Ee={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 Dt(o,t){return (o.get(`SELECT count(*) as cnt FROM sqlite_master WHERE type='table' AND name='${t}'`)?.cnt??0)>0}function ye(o,t){if(t>0||!Dt(o,"tasks"))return;let n=o.all("PRAGMA table_info(tasks)"),s=new Set(n.map(r=>r.name));for(let[r,i]of Object.entries(Ee))s.has(r)||o.run(`ALTER TABLE tasks ADD COLUMN ${r} ${i}`);}var Se={"0002_normalize_task_names":{workspace_name:"TEXT",project_name:"TEXT"},"0015_panoramic_gorilla_man":{project_id:"TEXT",workspace_id:"TEXT"}};function Te(o,t,n){if(!Dt(o,"__drizzle_migrations")||!Dt(o,"tasks"))return;let s=o.all(n`SELECT hash FROM __drizzle_migrations`),r=new Set(s.map(a=>a.hash)),i=JSON.parse(fs.readFileSync(Y__namespace.default.join(t,"meta/_journal.json"),"utf-8"));for(let a of i.entries){let d=Se[a.tag];if(!d)continue;let u=Y__namespace.default.join(t,`${a.tag}.sql`);if(!fs.existsSync(u))continue;let c=fs.readFileSync(u,"utf-8"),l=crypto.createHash("sha256").update(c).digest("hex");if(r.has(l))continue;let h=o.all("PRAGMA table_info(tasks)"),m=new Set(h.map(k=>k.name));for(let[k,D]of Object.entries(d))m.has(k)||(o.run(`ALTER TABLE tasks ADD COLUMN ${k} ${D}`),m.add(k));}}function Re(o,t,n){let s=o.all(n`SELECT hash FROM __drizzle_migrations`),r=new Set(s.map(a=>a.hash)),i=JSON.parse(fs.readFileSync(Y__namespace.default.join(t,"meta/_journal.json"),"utf-8"));for(let a of i.entries){let d=Y__namespace.default.join(t,`${a.tag}.sql`);if(!fs.existsSync(d))continue;let u=fs.readFileSync(d,"utf-8"),c=crypto.createHash("sha256").update(u).digest("hex");if(r.has(c))continue;let l=/ALTER\s+TABLE\s+[`"]?(\w+)[`"]?\s+ADD\s+[`"]?(\w+)[`"]?/gi,h=[],m;for(;(m=l.exec(u))!==null;)h.push({table:m[1],column:m[2]});if(h.length===0||!u.split(/-->\s*statement-breakpoint/).map(O=>O.trim()).filter(Boolean).every(O=>/^ALTER\s+TABLE\s+.+\s+ADD\s+/i.test(O)))continue;h.every(({table:O,column:U})=>o.all(`PRAGMA table_info("${O}")`).some(X=>X.name===U))&&o.run(n`INSERT INTO __drizzle_migrations (hash, created_at) VALUES (${c}, ${a.when})`);}}function xe(o){let{migrate:t}=kt("drizzle-orm/better-sqlite3/migrator"),{sql:n}=kt("drizzle-orm"),s=[Y__namespace.default.join(__dirname,"../migrations"),Y__namespace.default.join(__dirname,"migrations"),Y__namespace.default.join(__dirname,"../../../../drizzle/migrations"),Y__namespace.default.join(process.cwd(),"drizzle/migrations")],r=s.find(c=>fs.existsSync(Y__namespace.default.join(c,"meta/_journal.json")));if(!r)throw new Error(`migrations folder not found. Searched:
8
+ `;fs.writeFileSync(o,i,{encoding:"utf8",mode:384});}catch{}}),t.on("task:output",e=>{try{let s=this.logFiles.get(e.traceId);if(!s)return;let o=new Date().toISOString();fs.appendFileSync(s,`[${o}] STDOUT: ${e.output}
9
+ `,"utf8");}catch{}}),t.on("task:end",e=>{try{let s=this.logFiles.get(e.traceId);if(!s)return;let o=Ot(new Date),i=e.error?`failed: ${e.error.message}`:"completed successfully",a=`[${o}] INFO: Task ${i} in ${e.durationMs}ms
10
+ [${o}] INFO: Process closed with exit code: ${e.error?1:0}
11
+ `;fs.appendFileSync(s,a,"utf8"),this.logFiles.delete(e.traceId);}catch{}}));}detach(t){this.unsubs.forEach(e=>e()),this.unsubs=[],this.logFiles.clear();}};function xe(r){let t=V__namespace.resolve(r);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 Yt(r){let t=xe(r);return crypto.createHash("sha256").update(t).digest("hex")}var st=class{resolveDbPath(){return process.env.CREWX_DB?process.env.CREWX_DB:process.env.CREWX_TRACES_DB?process.env.CREWX_TRACES_DB:V.join(Ce__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())}};var De=32*1024*1024;function R(r){let t=yt("better-sqlite3"),{drizzle:e}=yt("drizzle-orm/better-sqlite3"),s=new t(r);return s.exec("PRAGMA journal_mode = WAL"),s.exec(`PRAGMA journal_size_limit = ${De}`),s.exec("PRAGMA busy_timeout = 5000"),s.exec("PRAGMA foreign_keys = ON"),s.exec("PRAGMA analysis_limit = 400"),s.exec("PRAGMA optimize"),{db:e(s),runRaw:(o,i=[])=>s.prepare(o).run(...i),close:()=>s.close()}}var Vt=new Set,$e={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 Pt(r,t){return (r.get(`SELECT count(*) as cnt FROM sqlite_master WHERE type='table' AND name='${t}'`)?.cnt??0)>0}function Oe(r,t){if(t>0||!Pt(r,"tasks"))return;let e=r.all("PRAGMA table_info(tasks)"),s=new Set(e.map(o=>o.name));for(let[o,i]of Object.entries($e))s.has(o)||r.run(`ALTER TABLE tasks ADD COLUMN ${o} ${i}`);}var Ie={"0002_normalize_task_names":{workspace_name:"TEXT",project_name:"TEXT"},"0015_panoramic_gorilla_man":{project_id:"TEXT",workspace_id:"TEXT"}};function Pe(r,t,e){if(!Pt(r,"__drizzle_migrations")||!Pt(r,"tasks"))return;let s=r.all(e`SELECT hash FROM __drizzle_migrations`),o=new Set(s.map(a=>a.hash)),i=JSON.parse(fs.readFileSync(V__namespace.default.join(t,"meta/_journal.json"),"utf-8"));for(let a of i.entries){let d=Ie[a.tag];if(!d)continue;let u=V__namespace.default.join(t,`${a.tag}.sql`);if(!fs.existsSync(u))continue;let c=fs.readFileSync(u,"utf-8"),l=crypto.createHash("sha256").update(c).digest("hex");if(o.has(l))continue;let g=r.all("PRAGMA table_info(tasks)"),f=new Set(g.map(k=>k.name));for(let[k,D]of Object.entries(d))f.has(k)||(r.run(`ALTER TABLE tasks ADD COLUMN ${k} ${D}`),f.add(k));}}function Me(r,t,e){let s=r.all(e`SELECT hash FROM __drizzle_migrations`),o=new Set(s.map(a=>a.hash)),i=JSON.parse(fs.readFileSync(V__namespace.default.join(t,"meta/_journal.json"),"utf-8"));for(let a of i.entries){let d=V__namespace.default.join(t,`${a.tag}.sql`);if(!fs.existsSync(d))continue;let u=fs.readFileSync(d,"utf-8"),c=crypto.createHash("sha256").update(u).digest("hex");if(o.has(c))continue;let l=/ALTER\s+TABLE\s+[`"]?(\w+)[`"]?\s+ADD\s+[`"]?(\w+)[`"]?/gi,g=[],f;for(;(f=l.exec(u))!==null;)g.push({table:f[1],column:f[2]});if(g.length===0||!u.split(/-->\s*statement-breakpoint/).map($=>$.trim()).filter(Boolean).every($=>/^ALTER\s+TABLE\s+.+\s+ADD\s+/i.test($)))continue;g.every(({table:$,column:U})=>r.all(`PRAGMA table_info("${$}")`).some(Y=>Y.name===U))&&r.run(e`INSERT INTO __drizzle_migrations (hash, created_at) VALUES (${c}, ${a.when})`);}}function je(r){let{migrate:t}=yt("drizzle-orm/better-sqlite3/migrator"),{sql:e}=yt("drizzle-orm"),s=[V__namespace.default.join(__dirname,"../migrations"),V__namespace.default.join(__dirname,"migrations"),V__namespace.default.join(__dirname,"../../../../drizzle/migrations"),V__namespace.default.join(process.cwd(),"drizzle/migrations")],o=s.find(c=>fs.existsSync(V__namespace.default.join(c,"meta/_journal.json")));if(!o)throw new Error(`migrations folder not found. Searched:
12
12
  ${s.join(`
13
- `)}`);let i=o.get(n`SELECT count(*) as cnt FROM sqlite_master WHERE type='table' AND name='__drizzle_migrations'`),a=0;i?.cnt&&(a=o.get(n`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0),ye(o,a),i?.cnt&&(Re(o,r,n),Te(o,r,n)),t(o,{migrationsFolder:r});let u=(o.get(n`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0)-a;if(u>0){let c=i?.cnt?"Database migrated":"Database initialized";console.error(`[crewx] ${c} (${u} migration${u>1?"s":""} applied).`);}}function Et(o,t){Gt.has(t)||(xe(o),Gt.add(t));}var p=class extends Error{code;cause;constructor(t,n,s){super(n),this.name="RepositoryError",this.code=t,this.cause=s,Object.setPrototypeOf(this,new.target.prototype);}};var lt=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 e=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),run_epoch:sqliteCore.integer("run_epoch").default(0)},o=>({idx_tasks_agent_id:sqliteCore.index("idx_tasks_agent_id").on(o.agent_id),idx_tasks_status:sqliteCore.index("idx_tasks_status").on(o.status),idx_tasks_started_at:sqliteCore.index("idx_tasks_started_at").on(o.started_at),idx_tasks_trace_id:sqliteCore.index("idx_tasks_trace_id").on(o.trace_id),idx_tasks_parent_task_id:sqliteCore.index("idx_tasks_parent_task_id").on(o.parent_task_id),idx_tasks_crewx_version:sqliteCore.index("idx_tasks_crewx_version").on(o.crewx_version),idx_tasks_pid:sqliteCore.index("idx_tasks_pid").on(o.pid),idx_tasks_thread_id:sqliteCore.index("idx_tasks_thread_id").on(o.thread_id),idx_tasks_workspace_id:sqliteCore.index("idx_tasks_workspace_id").on(o.workspace_id),idx_tasks_workspace_ref:sqliteCore.index("idx_tasks_workspace_ref").on(o.workspace_ref),idx_tasks_project_id:sqliteCore.index("idx_tasks_project_id").on(o.project_id),idx_tasks_ws_started:sqliteCore.index("idx_tasks_ws_started").on(o.workspace_id,o.started_at)}));var _=sqliteCore.sqliteTable("threads",{id:sqliteCore.text("id").primaryKey(),workspace_id:sqliteCore.text("workspace_id").references(()=>lt.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)},o=>({idx_threads_updated_at:sqliteCore.index("idx_threads_updated_at").on(o.updated_at),idx_threads_workspace_id:sqliteCore.index("idx_threads_workspace_id").on(o.workspace_id),idx_threads_ws_updated:sqliteCore.index("idx_threads_ws_updated").on(o.workspace_id,o.updated_at),idx_threads_title:sqliteCore.index("idx_threads_title").on(o.title)}));var Oe=sqliteCore.sqliteTable("spans",{id:sqliteCore.text("id").primaryKey(),task_id:sqliteCore.text("task_id").references(()=>e.id,{onDelete:"set null"}),parent_span_id:sqliteCore.text("parent_span_id").references(()=>Oe.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")},o=>({idx_spans_task_id:sqliteCore.index("idx_spans_task_id").on(o.task_id),idx_spans_parent_span_id:sqliteCore.index("idx_spans_parent_span_id").on(o.parent_span_id)}));sqliteCore.sqliteTable("tool_calls",{id:sqliteCore.text("id").primaryKey(),task_id:sqliteCore.text("task_id").references(()=>e.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()},o=>({idx_tool_calls_task_id:sqliteCore.index("idx_tool_calls_task_id").on(o.task_id),idx_tool_calls_tool_name:sqliteCore.index("idx_tool_calls_tool_name").on(o.tool_name),idx_tool_calls_timestamp:sqliteCore.index("idx_tool_calls_timestamp").on(o.timestamp)}));sqliteCore.sqliteTable("thread_boxes",{id:sqliteCore.text("id").primaryKey(),thread_id:sqliteCore.text("thread_id").notNull().references(()=>_.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()},o=>({idx_thread_boxes_thread_id:sqliteCore.index("idx_thread_boxes_thread_id").on(o.thread_id),idx_thread_boxes_seq:sqliteCore.index("idx_thread_boxes_seq").on(o.thread_id,o.seq),uniq_thread_boxes_thread_seq:sqliteCore.unique().on(o.thread_id,o.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")},o=>({idx_request_logs_timestamp:sqliteCore.index("idx_request_logs_timestamp").on(o.timestamp),idx_request_logs_path:sqliteCore.index("idx_request_logs_path").on(o.path),idx_request_logs_status_code:sqliteCore.index("idx_request_logs_status_code").on(o.status_code),idx_request_logs_partition_key:sqliteCore.index("idx_request_logs_partition_key").on(o.partition_key)}));sqliteCore.sqliteTable("usage_limit_snapshots",{id:sqliteCore.text("id").primaryKey(),provider:sqliteCore.text("provider").notNull(),account_ref:sqliteCore.text("account_ref").notNull().default("default"),limit_window:sqliteCore.text("limit_window").notNull(),bucket_start:sqliteCore.text("bucket_start").notNull(),captured_at:sqliteCore.text("captured_at").notNull(),used_percent:sqliteCore.integer("used_percent").notNull(),remaining_percent:sqliteCore.integer("remaining_percent").notNull(),resets_at:sqliteCore.text("resets_at"),source:sqliteCore.text("source").notNull(),metadata:sqliteCore.text("metadata")},o=>({uniq_usage_limit_snapshots_bucket:sqliteCore.uniqueIndex("uniq_usage_limit_snapshots_bucket").on(o.provider,o.account_ref,o.limit_window,o.bucket_start),idx_usage_limit_snapshots_window_bucket:sqliteCore.index("idx_usage_limit_snapshots_window_bucket").on(o.limit_window,o.bucket_start),idx_usage_limit_snapshots_provider_window_bucket:sqliteCore.index("idx_usage_limit_snapshots_provider_window_bucket").on(o.provider,o.limit_window,o.bucket_start)}));sqliteCore.sqliteTable("usage_reports",{id:sqliteCore.text("id").primaryKey(),workspace_id:sqliteCore.text("workspace_id").notNull(),month:sqliteCore.text("month").notNull(),generated_at:sqliteCore.text("generated_at").notNull(),source_range:sqliteCore.text("source_range").notNull(),tier:sqliteCore.text("tier").notNull(),total_tokens:sqliteCore.integer("total_tokens").notNull(),total_cost_usd:sqliteCore.real("total_cost_usd").notNull(),payload:sqliteCore.text("payload").notNull(),payload_hash:sqliteCore.text("payload_hash"),signature:sqliteCore.text("signature"),signed_at:sqliteCore.text("signed_at"),issuer:sqliteCore.text("issuer")},o=>({uniq_usage_reports_ws_month:sqliteCore.uniqueIndex("uniq_usage_reports_ws_month").on(o.workspace_id,o.month)}));sqliteCore.sqliteTable("notifications",{id:sqliteCore.text("id").primaryKey(),workspace_id:sqliteCore.text("workspace_id").notNull(),agent_id:sqliteCore.text("agent_id"),task_id:sqliteCore.text("task_id"),thread_id:sqliteCore.text("thread_id"),source:sqliteCore.text("source").notNull().default("agent"),level:sqliteCore.text("level").notNull().default("info"),title:sqliteCore.text("title").notNull(),body:sqliteCore.text("body"),target_user_id:sqliteCore.text("target_user_id"),created_at:sqliteCore.text("created_at").notNull(),metadata:sqliteCore.text("metadata")},o=>({idx_notifications_ws_created:sqliteCore.index("idx_notifications_ws_created").on(o.workspace_id,drizzleOrm.sql`${o.created_at} DESC`)}));sqliteCore.sqliteTable("notification_reads",{notification_id:sqliteCore.text("notification_id").notNull(),user_id:sqliteCore.text("user_id").notNull(),read_at:sqliteCore.text("read_at").notNull()},o=>({pk:sqliteCore.primaryKey({columns:[o.notification_id,o.user_id]})}));sqliteCore.sqliteTable("agent_suggestions",{id:sqliteCore.text("id").primaryKey(),workspace_id:sqliteCore.text("workspace_id").notNull(),agent_id:sqliteCore.text("agent_id").notNull(),task_id:sqliteCore.text("task_id"),type:sqliteCore.text("type").notNull(),status:sqliteCore.text("status").notNull().default("pending"),payload:sqliteCore.text("payload").notNull(),applied_commit_sha:sqliteCore.text("applied_commit_sha"),created_at:sqliteCore.text("created_at").notNull(),updated_at:sqliteCore.text("updated_at").notNull()},o=>({idx_agent_suggestions_ws_agent:sqliteCore.index("idx_agent_suggestions_ws_agent").on(o.workspace_id,o.agent_id),idx_agent_suggestions_ws_created:sqliteCore.index("idx_agent_suggestions_ws_created").on(o.workspace_id,o.created_at)}));sqliteCore.sqliteTable("ui_instances",{id:sqliteCore.text("id").primaryKey().notNull(),definition_id:sqliteCore.text("definition_id").notNull(),definition_version:sqliteCore.integer("definition_version").notNull(),definition_hash:sqliteCore.text("definition_hash").notNull(),workspace_id:sqliteCore.text("workspace_id").notNull(),thread_id:sqliteCore.text("thread_id").notNull(),anchor_task_id:sqliteCore.text("anchor_task_id"),domain_ref_json:sqliteCore.text("domain_ref_json").notNull(),state_json:sqliteCore.text("state_json").notNull(),revision:sqliteCore.integer("revision").notNull().default(0),status:sqliteCore.text("status").notNull().default("active"),granted_capabilities_json:sqliteCore.text("granted_capabilities_json").notNull().default("[]"),created_at:sqliteCore.integer("created_at").notNull(),updated_at:sqliteCore.integer("updated_at").notNull()},o=>({idCheck:sqliteCore.check("ui_instances_id_ck",drizzleOrm.sql`length(${o.id}) BETWEEN 5 AND 128 AND ${o.id} GLOB 'uic_*'`),definitionIdCheck:sqliteCore.check("ui_instances_definition_id_ck",drizzleOrm.sql`length(${o.definition_id}) BETWEEN 1 AND 128`),definitionVersionCheck:sqliteCore.check("ui_instances_definition_version_ck",drizzleOrm.sql`${o.definition_version} >= 1`),definitionHashCheck:sqliteCore.check("ui_instances_definition_hash_ck",drizzleOrm.sql`length(${o.definition_hash}) = 64 AND ${o.definition_hash} NOT GLOB '*[^0-9a-f]*'`),workspaceIdCheck:sqliteCore.check("ui_instances_workspace_id_ck",drizzleOrm.sql`length(${o.workspace_id}) BETWEEN 1 AND 256`),threadIdCheck:sqliteCore.check("ui_instances_thread_id_ck",drizzleOrm.sql`length(${o.thread_id}) BETWEEN 1 AND 256`),domainRefJsonCheck:sqliteCore.check("ui_instances_domain_ref_json_ck",drizzleOrm.sql`json_valid(${o.domain_ref_json}) AND json_type(${o.domain_ref_json}) = 'object'`),stateJsonCheck:sqliteCore.check("ui_instances_state_json_ck",drizzleOrm.sql`json_valid(${o.state_json}) AND json_type(${o.state_json}) = 'object'`),revisionCheck:sqliteCore.check("ui_instances_revision_ck",drizzleOrm.sql`${o.revision} >= 0`),statusCheck:sqliteCore.check("ui_instances_status_ck",drizzleOrm.sql`${o.status} IN ('active', 'completed', 'expired', 'revoked', 'unsupported')`),grantedCapabilitiesJsonCheck:sqliteCore.check("ui_instances_granted_capabilities_json_ck",drizzleOrm.sql`json_valid(${o.granted_capabilities_json}) AND json_type(${o.granted_capabilities_json}) = 'array'`),createdAtCheck:sqliteCore.check("ui_instances_created_at_ck",drizzleOrm.sql`${o.created_at} >= 0`),updatedAtCheck:sqliteCore.check("ui_instances_updated_at_ck",drizzleOrm.sql`${o.updated_at} >= ${o.created_at}`),workspaceThreadIdx:sqliteCore.index("ui_instances_workspace_thread_idx").on(o.workspace_id,o.thread_id)}));sqliteCore.sqliteTable("ui_action_receipts",{id:sqliteCore.text("id").primaryKey().notNull(),instance_id:sqliteCore.text("instance_id").notNull(),request_id:sqliteCore.text("request_id").notNull(),action_id:sqliteCore.text("action_id").notNull(),actor_json:sqliteCore.text("actor_json").notNull(),source:sqliteCore.text("source").notNull(),expected_revision:sqliteCore.integer("expected_revision").notNull(),before_revision:sqliteCore.integer("before_revision").notNull(),after_revision:sqliteCore.integer("after_revision"),status:sqliteCore.text("status").notNull(),outcome:sqliteCore.text("outcome"),input_json:sqliteCore.text("input_json").notNull(),result_json:sqliteCore.text("result_json"),error_code:sqliteCore.text("error_code"),requested_at:sqliteCore.integer("requested_at").notNull(),settled_at:sqliteCore.integer("settled_at")},o=>({idCheck:sqliteCore.check("ui_action_receipts_id_ck",drizzleOrm.sql`length(${o.id}) BETWEEN 5 AND 128`),instanceIdCheck:sqliteCore.check("ui_action_receipts_instance_id_ck",drizzleOrm.sql`length(${o.instance_id}) BETWEEN 1 AND 128`),requestIdCheck:sqliteCore.check("ui_action_receipts_request_id_ck",drizzleOrm.sql`length(${o.request_id}) BETWEEN 1 AND 128`),actionIdCheck:sqliteCore.check("ui_action_receipts_action_id_ck",drizzleOrm.sql`length(${o.action_id}) BETWEEN 1 AND 128`),actorJsonCheck:sqliteCore.check("ui_action_receipts_actor_json_ck",drizzleOrm.sql`json_valid(${o.actor_json}) AND json_type(${o.actor_json}) = 'object'`),sourceCheck:sqliteCore.check("ui_action_receipts_source_ck",drizzleOrm.sql`${o.source} IN ('ui_host', 'cli', 'system')`),expectedRevisionCheck:sqliteCore.check("ui_action_receipts_expected_revision_ck",drizzleOrm.sql`${o.expected_revision} >= 0`),beforeRevisionCheck:sqliteCore.check("ui_action_receipts_before_revision_ck",drizzleOrm.sql`${o.before_revision} >= 0`),afterRevisionCheck:sqliteCore.check("ui_action_receipts_after_revision_ck",drizzleOrm.sql`${o.after_revision} IS NULL OR ${o.after_revision} >= 0`),statusCheck:sqliteCore.check("ui_action_receipts_status_ck",drizzleOrm.sql`${o.status} IN ('requested', 'settled')`),outcomeCheck:sqliteCore.check("ui_action_receipts_outcome_ck",drizzleOrm.sql`${o.outcome} IS NULL OR ${o.outcome} IN ('succeeded', 'rejected', 'failed', 'conflicted', 'expired')`),inputJsonCheck:sqliteCore.check("ui_action_receipts_input_json_ck",drizzleOrm.sql`json_valid(${o.input_json}) AND json_type(${o.input_json}) = 'object'`),resultJsonCheck:sqliteCore.check("ui_action_receipts_result_json_ck",drizzleOrm.sql`${o.result_json} IS NULL OR (json_valid(${o.result_json}) AND json_type(${o.result_json}) = 'object')`),requestedAtCheck:sqliteCore.check("ui_action_receipts_requested_at_ck",drizzleOrm.sql`${o.requested_at} >= 0`),settledAtCheck:sqliteCore.check("ui_action_receipts_settled_at_ck",drizzleOrm.sql`${o.settled_at} IS NULL OR ${o.settled_at} >= ${o.requested_at}`),statusTransitionCheck:sqliteCore.check("ui_action_receipts_status_transition_ck",drizzleOrm.sql`(
14
- (${o.status} = 'requested' AND ${o.after_revision} IS NULL AND ${o.outcome} IS NULL AND ${o.settled_at} IS NULL)
13
+ `)}`);let i=r.get(e`SELECT count(*) as cnt FROM sqlite_master WHERE type='table' AND name='__drizzle_migrations'`),a=0;i?.cnt&&(a=r.get(e`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0),Oe(r,a),i?.cnt&&(Me(r,o,e),Pe(r,o,e)),t(r,{migrationsFolder:o});let u=(r.get(e`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0)-a;if(u>0){let c=i?.cnt?"Database migrated":"Database initialized";console.error(`[crewx] ${c} (${u} migration${u>1?"s":""} applied).`);}}function _t(r,t){Vt.has(t)||(je(r),Vt.add(t));}var _=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 pt=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 n=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"),log_storage:sqliteCore.text("log_storage",{enum:["blob","events"]}).notNull().default("blob"),last_log_seq:sqliteCore.integer("last_log_seq").notNull().default(0),log_revision:sqliteCore.integer("log_revision").notNull().default(0),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),run_epoch:sqliteCore.integer("run_epoch").default(0)},r=>({log_storage_check:sqliteCore.check("tasks_log_storage_ck",drizzleOrm.sql`${r.log_storage} IN ('blob', 'events')`),idx_tasks_agent_id:sqliteCore.index("idx_tasks_agent_id").on(r.agent_id),idx_tasks_status:sqliteCore.index("idx_tasks_status").on(r.status),idx_tasks_started_at:sqliteCore.index("idx_tasks_started_at").on(r.started_at),idx_tasks_trace_id:sqliteCore.index("idx_tasks_trace_id").on(r.trace_id),idx_tasks_parent_task_id:sqliteCore.index("idx_tasks_parent_task_id").on(r.parent_task_id),idx_tasks_crewx_version:sqliteCore.index("idx_tasks_crewx_version").on(r.crewx_version),idx_tasks_pid:sqliteCore.index("idx_tasks_pid").on(r.pid),idx_tasks_thread_id:sqliteCore.index("idx_tasks_thread_id").on(r.thread_id),idx_tasks_workspace_id:sqliteCore.index("idx_tasks_workspace_id").on(r.workspace_id),idx_tasks_workspace_ref:sqliteCore.index("idx_tasks_workspace_ref").on(r.workspace_ref),idx_tasks_project_id:sqliteCore.index("idx_tasks_project_id").on(r.project_id),idx_tasks_ws_started:sqliteCore.index("idx_tasks_ws_started").on(r.workspace_id,r.started_at)}));var z=sqliteCore.sqliteTable("task_log_events",{id:sqliteCore.integer("id").primaryKey(),task_id:sqliteCore.text("task_id").notNull().references(()=>n.id,{onDelete:"cascade"}),seq:sqliteCore.integer("seq").notNull(),timestamp:sqliteCore.text("timestamp").notNull(),level:sqliteCore.text("level").notNull(),message:sqliteCore.text("message").notNull()},r=>({taskSeqUnique:sqliteCore.uniqueIndex("task_log_events_task_seq_uq").on(r.task_id,r.seq)}));var p=sqliteCore.sqliteTable("threads",{id:sqliteCore.text("id").primaryKey(),workspace_id:sqliteCore.text("workspace_id").references(()=>pt.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)},r=>({idx_threads_updated_at:sqliteCore.index("idx_threads_updated_at").on(r.updated_at),idx_threads_workspace_id:sqliteCore.index("idx_threads_workspace_id").on(r.workspace_id),idx_threads_ws_updated:sqliteCore.index("idx_threads_ws_updated").on(r.workspace_id,r.updated_at),idx_threads_title:sqliteCore.index("idx_threads_title").on(r.title)}));var Ye=sqliteCore.sqliteTable("spans",{id:sqliteCore.text("id").primaryKey(),task_id:sqliteCore.text("task_id").references(()=>n.id,{onDelete:"set null"}),parent_span_id:sqliteCore.text("parent_span_id").references(()=>Ye.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")},r=>({idx_spans_task_id:sqliteCore.index("idx_spans_task_id").on(r.task_id),idx_spans_parent_span_id:sqliteCore.index("idx_spans_parent_span_id").on(r.parent_span_id)}));sqliteCore.sqliteTable("tool_calls",{id:sqliteCore.text("id").primaryKey(),task_id:sqliteCore.text("task_id").references(()=>n.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()},r=>({idx_tool_calls_task_id:sqliteCore.index("idx_tool_calls_task_id").on(r.task_id),idx_tool_calls_tool_name:sqliteCore.index("idx_tool_calls_tool_name").on(r.tool_name),idx_tool_calls_timestamp:sqliteCore.index("idx_tool_calls_timestamp").on(r.timestamp)}));sqliteCore.sqliteTable("thread_boxes",{id:sqliteCore.text("id").primaryKey(),thread_id:sqliteCore.text("thread_id").notNull().references(()=>p.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()},r=>({idx_thread_boxes_thread_id:sqliteCore.index("idx_thread_boxes_thread_id").on(r.thread_id),idx_thread_boxes_seq:sqliteCore.index("idx_thread_boxes_seq").on(r.thread_id,r.seq),uniq_thread_boxes_thread_seq:sqliteCore.unique().on(r.thread_id,r.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")},r=>({idx_request_logs_timestamp:sqliteCore.index("idx_request_logs_timestamp").on(r.timestamp),idx_request_logs_path:sqliteCore.index("idx_request_logs_path").on(r.path),idx_request_logs_status_code:sqliteCore.index("idx_request_logs_status_code").on(r.status_code),idx_request_logs_partition_key:sqliteCore.index("idx_request_logs_partition_key").on(r.partition_key)}));sqliteCore.sqliteTable("usage_limit_snapshots",{id:sqliteCore.text("id").primaryKey(),provider:sqliteCore.text("provider").notNull(),account_ref:sqliteCore.text("account_ref").notNull().default("default"),limit_window:sqliteCore.text("limit_window").notNull(),bucket_start:sqliteCore.text("bucket_start").notNull(),captured_at:sqliteCore.text("captured_at").notNull(),used_percent:sqliteCore.integer("used_percent").notNull(),remaining_percent:sqliteCore.integer("remaining_percent").notNull(),resets_at:sqliteCore.text("resets_at"),source:sqliteCore.text("source").notNull(),metadata:sqliteCore.text("metadata")},r=>({uniq_usage_limit_snapshots_bucket:sqliteCore.uniqueIndex("uniq_usage_limit_snapshots_bucket").on(r.provider,r.account_ref,r.limit_window,r.bucket_start),idx_usage_limit_snapshots_window_bucket:sqliteCore.index("idx_usage_limit_snapshots_window_bucket").on(r.limit_window,r.bucket_start),idx_usage_limit_snapshots_provider_window_bucket:sqliteCore.index("idx_usage_limit_snapshots_provider_window_bucket").on(r.provider,r.limit_window,r.bucket_start)}));sqliteCore.sqliteTable("usage_reports",{id:sqliteCore.text("id").primaryKey(),workspace_id:sqliteCore.text("workspace_id").notNull(),month:sqliteCore.text("month").notNull(),generated_at:sqliteCore.text("generated_at").notNull(),source_range:sqliteCore.text("source_range").notNull(),tier:sqliteCore.text("tier").notNull(),total_tokens:sqliteCore.integer("total_tokens").notNull(),total_cost_usd:sqliteCore.real("total_cost_usd").notNull(),payload:sqliteCore.text("payload").notNull(),payload_hash:sqliteCore.text("payload_hash"),signature:sqliteCore.text("signature"),signed_at:sqliteCore.text("signed_at"),issuer:sqliteCore.text("issuer")},r=>({uniq_usage_reports_ws_month:sqliteCore.uniqueIndex("uniq_usage_reports_ws_month").on(r.workspace_id,r.month)}));sqliteCore.sqliteTable("notifications",{id:sqliteCore.text("id").primaryKey(),workspace_id:sqliteCore.text("workspace_id").notNull(),agent_id:sqliteCore.text("agent_id"),task_id:sqliteCore.text("task_id"),thread_id:sqliteCore.text("thread_id"),source:sqliteCore.text("source").notNull().default("agent"),level:sqliteCore.text("level").notNull().default("info"),title:sqliteCore.text("title").notNull(),body:sqliteCore.text("body"),target_user_id:sqliteCore.text("target_user_id"),created_at:sqliteCore.text("created_at").notNull(),metadata:sqliteCore.text("metadata")},r=>({idx_notifications_ws_created:sqliteCore.index("idx_notifications_ws_created").on(r.workspace_id,drizzleOrm.sql`${r.created_at} DESC`)}));sqliteCore.sqliteTable("notification_reads",{notification_id:sqliteCore.text("notification_id").notNull(),user_id:sqliteCore.text("user_id").notNull(),read_at:sqliteCore.text("read_at").notNull()},r=>({pk:sqliteCore.primaryKey({columns:[r.notification_id,r.user_id]})}));sqliteCore.sqliteTable("agent_suggestions",{id:sqliteCore.text("id").primaryKey(),workspace_id:sqliteCore.text("workspace_id").notNull(),agent_id:sqliteCore.text("agent_id").notNull(),task_id:sqliteCore.text("task_id"),type:sqliteCore.text("type").notNull(),status:sqliteCore.text("status").notNull().default("pending"),payload:sqliteCore.text("payload").notNull(),applied_commit_sha:sqliteCore.text("applied_commit_sha"),created_at:sqliteCore.text("created_at").notNull(),updated_at:sqliteCore.text("updated_at").notNull()},r=>({idx_agent_suggestions_ws_agent:sqliteCore.index("idx_agent_suggestions_ws_agent").on(r.workspace_id,r.agent_id),idx_agent_suggestions_ws_created:sqliteCore.index("idx_agent_suggestions_ws_created").on(r.workspace_id,r.created_at)}));sqliteCore.sqliteTable("ui_instances",{id:sqliteCore.text("id").primaryKey().notNull(),definition_id:sqliteCore.text("definition_id").notNull(),definition_version:sqliteCore.integer("definition_version").notNull(),definition_hash:sqliteCore.text("definition_hash").notNull(),workspace_id:sqliteCore.text("workspace_id").notNull(),thread_id:sqliteCore.text("thread_id").notNull(),anchor_task_id:sqliteCore.text("anchor_task_id"),domain_ref_json:sqliteCore.text("domain_ref_json").notNull(),state_json:sqliteCore.text("state_json").notNull(),revision:sqliteCore.integer("revision").notNull().default(0),status:sqliteCore.text("status").notNull().default("active"),granted_capabilities_json:sqliteCore.text("granted_capabilities_json").notNull().default("[]"),created_at:sqliteCore.integer("created_at").notNull(),updated_at:sqliteCore.integer("updated_at").notNull()},r=>({idCheck:sqliteCore.check("ui_instances_id_ck",drizzleOrm.sql`length(${r.id}) BETWEEN 5 AND 128 AND ${r.id} GLOB 'uic_*'`),definitionIdCheck:sqliteCore.check("ui_instances_definition_id_ck",drizzleOrm.sql`length(${r.definition_id}) BETWEEN 1 AND 128`),definitionVersionCheck:sqliteCore.check("ui_instances_definition_version_ck",drizzleOrm.sql`${r.definition_version} >= 1`),definitionHashCheck:sqliteCore.check("ui_instances_definition_hash_ck",drizzleOrm.sql`length(${r.definition_hash}) = 64 AND ${r.definition_hash} NOT GLOB '*[^0-9a-f]*'`),workspaceIdCheck:sqliteCore.check("ui_instances_workspace_id_ck",drizzleOrm.sql`length(${r.workspace_id}) BETWEEN 1 AND 256`),threadIdCheck:sqliteCore.check("ui_instances_thread_id_ck",drizzleOrm.sql`length(${r.thread_id}) BETWEEN 1 AND 256`),domainRefJsonCheck:sqliteCore.check("ui_instances_domain_ref_json_ck",drizzleOrm.sql`json_valid(${r.domain_ref_json}) AND json_type(${r.domain_ref_json}) = 'object'`),stateJsonCheck:sqliteCore.check("ui_instances_state_json_ck",drizzleOrm.sql`json_valid(${r.state_json}) AND json_type(${r.state_json}) = 'object'`),revisionCheck:sqliteCore.check("ui_instances_revision_ck",drizzleOrm.sql`${r.revision} >= 0`),statusCheck:sqliteCore.check("ui_instances_status_ck",drizzleOrm.sql`${r.status} IN ('active', 'completed', 'expired', 'revoked', 'unsupported')`),grantedCapabilitiesJsonCheck:sqliteCore.check("ui_instances_granted_capabilities_json_ck",drizzleOrm.sql`json_valid(${r.granted_capabilities_json}) AND json_type(${r.granted_capabilities_json}) = 'array'`),createdAtCheck:sqliteCore.check("ui_instances_created_at_ck",drizzleOrm.sql`${r.created_at} >= 0`),updatedAtCheck:sqliteCore.check("ui_instances_updated_at_ck",drizzleOrm.sql`${r.updated_at} >= ${r.created_at}`),workspaceThreadIdx:sqliteCore.index("ui_instances_workspace_thread_idx").on(r.workspace_id,r.thread_id)}));sqliteCore.sqliteTable("ui_action_receipts",{id:sqliteCore.text("id").primaryKey().notNull(),instance_id:sqliteCore.text("instance_id").notNull(),request_id:sqliteCore.text("request_id").notNull(),action_id:sqliteCore.text("action_id").notNull(),actor_json:sqliteCore.text("actor_json").notNull(),source:sqliteCore.text("source").notNull(),expected_revision:sqliteCore.integer("expected_revision").notNull(),before_revision:sqliteCore.integer("before_revision").notNull(),after_revision:sqliteCore.integer("after_revision"),status:sqliteCore.text("status").notNull(),outcome:sqliteCore.text("outcome"),input_json:sqliteCore.text("input_json").notNull(),result_json:sqliteCore.text("result_json"),error_code:sqliteCore.text("error_code"),requested_at:sqliteCore.integer("requested_at").notNull(),settled_at:sqliteCore.integer("settled_at")},r=>({idCheck:sqliteCore.check("ui_action_receipts_id_ck",drizzleOrm.sql`length(${r.id}) BETWEEN 5 AND 128`),instanceIdCheck:sqliteCore.check("ui_action_receipts_instance_id_ck",drizzleOrm.sql`length(${r.instance_id}) BETWEEN 1 AND 128`),requestIdCheck:sqliteCore.check("ui_action_receipts_request_id_ck",drizzleOrm.sql`length(${r.request_id}) BETWEEN 1 AND 128`),actionIdCheck:sqliteCore.check("ui_action_receipts_action_id_ck",drizzleOrm.sql`length(${r.action_id}) BETWEEN 1 AND 128`),actorJsonCheck:sqliteCore.check("ui_action_receipts_actor_json_ck",drizzleOrm.sql`json_valid(${r.actor_json}) AND json_type(${r.actor_json}) = 'object'`),sourceCheck:sqliteCore.check("ui_action_receipts_source_ck",drizzleOrm.sql`${r.source} IN ('ui_host', 'cli', 'system')`),expectedRevisionCheck:sqliteCore.check("ui_action_receipts_expected_revision_ck",drizzleOrm.sql`${r.expected_revision} >= 0`),beforeRevisionCheck:sqliteCore.check("ui_action_receipts_before_revision_ck",drizzleOrm.sql`${r.before_revision} >= 0`),afterRevisionCheck:sqliteCore.check("ui_action_receipts_after_revision_ck",drizzleOrm.sql`${r.after_revision} IS NULL OR ${r.after_revision} >= 0`),statusCheck:sqliteCore.check("ui_action_receipts_status_ck",drizzleOrm.sql`${r.status} IN ('requested', 'settled')`),outcomeCheck:sqliteCore.check("ui_action_receipts_outcome_ck",drizzleOrm.sql`${r.outcome} IS NULL OR ${r.outcome} IN ('succeeded', 'rejected', 'failed', 'conflicted', 'expired')`),inputJsonCheck:sqliteCore.check("ui_action_receipts_input_json_ck",drizzleOrm.sql`json_valid(${r.input_json}) AND json_type(${r.input_json}) = 'object'`),resultJsonCheck:sqliteCore.check("ui_action_receipts_result_json_ck",drizzleOrm.sql`${r.result_json} IS NULL OR (json_valid(${r.result_json}) AND json_type(${r.result_json}) = 'object')`),requestedAtCheck:sqliteCore.check("ui_action_receipts_requested_at_ck",drizzleOrm.sql`${r.requested_at} >= 0`),settledAtCheck:sqliteCore.check("ui_action_receipts_settled_at_ck",drizzleOrm.sql`${r.settled_at} IS NULL OR ${r.settled_at} >= ${r.requested_at}`),statusTransitionCheck:sqliteCore.check("ui_action_receipts_status_transition_ck",drizzleOrm.sql`(
14
+ (${r.status} = 'requested' AND ${r.after_revision} IS NULL AND ${r.outcome} IS NULL AND ${r.settled_at} IS NULL)
15
15
  OR
16
- (${o.status} = 'settled' AND ${o.after_revision} IS NOT NULL AND ${o.outcome} IS NOT NULL AND ${o.settled_at} IS NOT NULL)
17
- )`),instanceRequestUnique:sqliteCore.uniqueIndex("ui_action_receipts_instance_request_uq").on(o.instance_id,o.request_id),instanceIdIdx:sqliteCore.index("ui_action_receipts_instance_id_idx").on(o.instance_id),requestedAtIdx:sqliteCore.index("ui_action_receipts_requested_at_idx").on(o.requested_at)}));var re=sqliteCore.sqliteTable("projects",{id:sqliteCore.text("id").primaryKey().notNull(),workspace_id:sqliteCore.text("workspace_id").notNull(),name:sqliteCore.text("name").notNull(),outcome:sqliteCore.text("outcome").notNull(),due_date:sqliteCore.text("due_date"),scene:sqliteCore.text("scene").notNull().default("planning"),stages_json:sqliteCore.text("stages_json").notNull(),stage_index:sqliteCore.integer("stage_index").notNull(),created_at:sqliteCore.text("created_at").notNull(),updated_at:sqliteCore.text("updated_at").notNull(),accepted_at:sqliteCore.text("accepted_at"),archived_at:sqliteCore.text("archived_at")},o=>({idCheck:sqliteCore.check("projects_id_ck",drizzleOrm.sql`${o.id} GLOB 'prj_*'`),sceneCheck:sqliteCore.check("projects_scene_ck",drizzleOrm.sql`${o.scene} IN ('planning', 'plan_review', 'running', 'human_wait', 'limit_wait', 'failed_stop', 'analyzing_feedback', 'replanned', 'awaiting_review', 'accepted')`),stagesJsonCheck:sqliteCore.check("projects_stages_json_ck",drizzleOrm.sql`json_valid(${o.stages_json}) AND json_type(${o.stages_json}) = 'array'`),stageIndexCheck:sqliteCore.check("projects_stage_index_ck",drizzleOrm.sql`${o.stage_index} >= 1`)}));sqliteCore.sqliteTable("project_criteria",{id:sqliteCore.text("id").primaryKey().notNull(),project_id:sqliteCore.text("project_id").notNull().references(()=>re.id,{onDelete:"cascade"}),position:sqliteCore.integer("position").notNull(),statement:sqliteCore.text("statement").notNull(),verify_status:sqliteCore.text("verify_status").notNull().default("pending"),verified_at:sqliteCore.text("verified_at"),evidence_json:sqliteCore.text("evidence_json").notNull().default("[]"),created_at:sqliteCore.text("created_at").notNull(),updated_at:sqliteCore.text("updated_at").notNull()},o=>({idCheck:sqliteCore.check("project_criteria_id_ck",drizzleOrm.sql`${o.id} GLOB 'pjc_*'`),verifyStatusCheck:sqliteCore.check("project_criteria_verify_status_ck",drizzleOrm.sql`${o.verify_status} IN ('pending', 'verifying', 'passed', 'failed')`),evidenceJsonCheck:sqliteCore.check("project_criteria_evidence_json_ck",drizzleOrm.sql`json_valid(${o.evidence_json}) AND json_type(${o.evidence_json}) = 'array'`),projectPositionUnique:sqliteCore.uniqueIndex("project_criteria_project_position_uq").on(o.project_id,o.position)}));sqliteCore.sqliteTable("project_events",{id:sqliteCore.text("id").primaryKey().notNull(),project_id:sqliteCore.text("project_id").notNull().references(()=>re.id,{onDelete:"restrict"}),seq:sqliteCore.integer("seq").notNull(),actor_type:sqliteCore.text("actor_type").notNull(),actor_id:sqliteCore.text("actor_id"),type:sqliteCore.text("type").notNull(),title:sqliteCore.text("title").notNull(),summary:sqliteCore.text("summary"),payload_json:sqliteCore.text("payload_json").notNull().default("{}"),created_at:sqliteCore.text("created_at").notNull()},o=>({idCheck:sqliteCore.check("project_events_id_ck",drizzleOrm.sql`${o.id} GLOB 'pje_*'`),actorTypeCheck:sqliteCore.check("project_events_actor_type_ck",drizzleOrm.sql`${o.actor_type} IN ('user', 'project_manager', 'system')`),payloadJsonCheck:sqliteCore.check("project_events_payload_json_ck",drizzleOrm.sql`json_valid(${o.payload_json}) AND json_type(${o.payload_json}) = 'object'`),projectSeqUnique:sqliteCore.uniqueIndex("project_events_project_seq_uq").on(o.project_id,o.seq)}));function oe(o){let t=o.toLowerCase().trim();t=t.replace(/\[[^\]]*\]$/g,"");let n=t.lastIndexOf("/");return n>=0&&(t=t.slice(n+1)),t=t.replace(/-\d{8}$/,""),t}var st="2026-05-09",dn="0.8.9-rc.13",rt=10,ot=parseInt(dn.split("rc.")[1]);function ie(){let o=drizzleOrm.sql`
16
+ (${r.status} = 'settled' AND ${r.after_revision} IS NOT NULL AND ${r.outcome} IS NOT NULL AND ${r.settled_at} IS NOT NULL)
17
+ )`),instanceRequestUnique:sqliteCore.uniqueIndex("ui_action_receipts_instance_request_uq").on(r.instance_id,r.request_id),instanceIdIdx:sqliteCore.index("ui_action_receipts_instance_id_idx").on(r.instance_id),requestedAtIdx:sqliteCore.index("ui_action_receipts_requested_at_idx").on(r.requested_at)}));var ce=sqliteCore.sqliteTable("projects",{id:sqliteCore.text("id").primaryKey().notNull(),workspace_id:sqliteCore.text("workspace_id").notNull(),name:sqliteCore.text("name").notNull(),outcome:sqliteCore.text("outcome").notNull(),due_date:sqliteCore.text("due_date"),scene:sqliteCore.text("scene").notNull().default("planning"),stages_json:sqliteCore.text("stages_json").notNull(),stage_index:sqliteCore.integer("stage_index").notNull(),created_at:sqliteCore.text("created_at").notNull(),updated_at:sqliteCore.text("updated_at").notNull(),accepted_at:sqliteCore.text("accepted_at"),archived_at:sqliteCore.text("archived_at")},r=>({idCheck:sqliteCore.check("projects_id_ck",drizzleOrm.sql`${r.id} GLOB 'prj_*'`),sceneCheck:sqliteCore.check("projects_scene_ck",drizzleOrm.sql`${r.scene} IN ('planning', 'plan_review', 'running', 'human_wait', 'limit_wait', 'failed_stop', 'analyzing_feedback', 'replanned', 'awaiting_review', 'accepted')`),stagesJsonCheck:sqliteCore.check("projects_stages_json_ck",drizzleOrm.sql`json_valid(${r.stages_json}) AND json_type(${r.stages_json}) = 'array'`),stageIndexCheck:sqliteCore.check("projects_stage_index_ck",drizzleOrm.sql`${r.stage_index} >= 1`)}));sqliteCore.sqliteTable("project_criteria",{id:sqliteCore.text("id").primaryKey().notNull(),project_id:sqliteCore.text("project_id").notNull().references(()=>ce.id,{onDelete:"cascade"}),position:sqliteCore.integer("position").notNull(),statement:sqliteCore.text("statement").notNull(),verify_status:sqliteCore.text("verify_status").notNull().default("pending"),verified_at:sqliteCore.text("verified_at"),evidence_json:sqliteCore.text("evidence_json").notNull().default("[]"),created_at:sqliteCore.text("created_at").notNull(),updated_at:sqliteCore.text("updated_at").notNull()},r=>({idCheck:sqliteCore.check("project_criteria_id_ck",drizzleOrm.sql`${r.id} GLOB 'pjc_*'`),verifyStatusCheck:sqliteCore.check("project_criteria_verify_status_ck",drizzleOrm.sql`${r.verify_status} IN ('pending', 'verifying', 'passed', 'failed')`),evidenceJsonCheck:sqliteCore.check("project_criteria_evidence_json_ck",drizzleOrm.sql`json_valid(${r.evidence_json}) AND json_type(${r.evidence_json}) = 'array'`),projectPositionUnique:sqliteCore.uniqueIndex("project_criteria_project_position_uq").on(r.project_id,r.position)}));sqliteCore.sqliteTable("project_events",{id:sqliteCore.text("id").primaryKey().notNull(),project_id:sqliteCore.text("project_id").notNull().references(()=>ce.id,{onDelete:"restrict"}),seq:sqliteCore.integer("seq").notNull(),actor_type:sqliteCore.text("actor_type").notNull(),actor_id:sqliteCore.text("actor_id"),type:sqliteCore.text("type").notNull(),title:sqliteCore.text("title").notNull(),summary:sqliteCore.text("summary"),payload_json:sqliteCore.text("payload_json").notNull().default("{}"),created_at:sqliteCore.text("created_at").notNull()},r=>({idCheck:sqliteCore.check("project_events_id_ck",drizzleOrm.sql`${r.id} GLOB 'pje_*'`),actorTypeCheck:sqliteCore.check("project_events_actor_type_ck",drizzleOrm.sql`${r.actor_type} IN ('user', 'project_manager', 'system')`),payloadJsonCheck:sqliteCore.check("project_events_payload_json_ck",drizzleOrm.sql`json_valid(${r.payload_json}) AND json_type(${r.payload_json}) = 'object'`),projectSeqUnique:sqliteCore.uniqueIndex("project_events_project_seq_uq").on(r.project_id,r.seq)}));function le(r){let t=r.toLowerCase().trim();t=t.replace(/\[[^\]]*\]$/g,"");let e=t.lastIndexOf("/");return e>=0&&(t=t.slice(e+1)),t=t.replace(/-\d{8}$/,""),t}function fe(r,t){let e=t===void 0?"":` at index ${t}`;if(!r||typeof r!="object")throw new _("VALIDATION",`Task log entry${e} must be an object`);if(typeof r.timestamp!="string"||typeof r.level!="string"||typeof r.message!="string")throw new _("VALIDATION",`Task log entry${e} must contain string timestamp, level, and message fields`);return {timestamp:r.timestamp,level:r.level,message:r.message}}function pe(r,t){if(t===null||t.trim()==="")return [];let e;try{e=JSON.parse(t);}catch(s){throw new _("DB_ERROR",`Malformed legacy task logs: ${r}`,s)}if(!Array.isArray(e))throw new _("DB_ERROR",`Malformed legacy task logs: ${r} (expected an array)`);try{return e.map((s,o)=>fe(s,o))}catch(s){throw s instanceof _?new _("DB_ERROR",`Malformed legacy task logs: ${r}`,s):s}}function me(r){if(r.log_storage!=="blob"&&r.log_storage!=="events")throw new _("DB_ERROR",`Invalid task log storage for task: ${r.id}`);if(!Number.isInteger(r.last_log_seq)||r.last_log_seq<0)throw new _("DB_ERROR",`Invalid task log sequence for task: ${r.id}`);if(!Number.isInteger(r.log_revision)||r.log_revision<0)throw new _("DB_ERROR",`Invalid task log revision for task: ${r.id}`);return r.log_storage}function ge(r){return {taskId:r.id,source:me(r),revision:r.log_revision,lastSeq:r.last_log_seq}}function bn(r){if(!Number.isInteger(r)||r<0)throw new _("VALIDATION","Task log tail limit must be a non-negative integer")}var vt=class extends st{dbPath;constructor(t={}){super(),t.dbPath?this.dbPath=t.dbPath:t.dbRoot&&(this.dbPath=V.join(t.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(t){let e=this.resolveDbPath();if(t){let o=V.dirname(e);fs.existsSync(o)||fs.mkdirSync(o,{recursive:true});}else if(!fs.existsSync(e))throw new _("NOT_FOUND","Database not found");let s=R(e);if(t)try{_t(s.db,e);}catch(o){throw s.close(),o}return s}findStateRow(t,e){return t.db.select({id:n.id,log_storage:n.log_storage,last_log_seq:n.last_log_seq,log_revision:n.log_revision,logs:n.logs}).from(n).where(drizzleOrm.eq(n.id,e)).limit(1).get()}findStateRowInTransaction(t,e){return t.select({id:n.id,log_storage:n.log_storage,last_log_seq:n.last_log_seq,log_revision:n.log_revision,logs:n.logs}).from(n).where(drizzleOrm.eq(n.id,e)).limit(1).get()}requireStateRowInTransaction(t,e){let s=this.findStateRowInTransaction(t,e);if(!s)throw new _("NOT_FOUND",`Task not found: ${e}`);return s}appendLog(t,e){return this.appendLogs(t,[e])}appendLogs(t,e){let s=e.map((i,a)=>fe(i,a));if(s.length===0){let i=this.getLogState(t);if(!i)throw new _("NOT_FOUND",`Task not found: ${t}`);return i}let o=this.openHandle(true);try{return o.db.transaction(a=>{let d=this.requireStateRowInTransaction(a,t),u=me(d);if(u==="blob"){let f=pe(t,d.logs);if(a.update(n).set({logs:JSON.stringify([...f,...s]),log_revision:drizzleOrm.sql`${n.log_revision} + 1`}).where(drizzleOrm.eq(n.id,t)).run().changes!==1)throw new _("NOT_FOUND",`Task not found: ${t}`);return {taskId:t,source:u,revision:d.log_revision+1,lastSeq:d.last_log_seq}}let c=d.last_log_seq+1,l=d.last_log_seq+s.length;if(a.insert(z).values(s.map((f,k)=>({task_id:t,seq:c+k,timestamp:f.timestamp,level:f.level,message:f.message}))).run(),a.update(n).set({last_log_seq:l,log_revision:drizzleOrm.sql`${n.log_revision} + 1`}).where(drizzleOrm.eq(n.id,t)).run().changes!==1)throw new _("NOT_FOUND",`Task not found: ${t}`);return {taskId:t,source:u,revision:d.log_revision+1,lastSeq:l}},{behavior:"immediate"})}catch(i){throw i instanceof _?i:new _("DB_ERROR","Failed to append task log",i)}finally{o.close();}}getLogState(t){if(!this.dbExists())return;let e=this.openHandle(false);try{let s=this.findStateRow(e,t);return s?ge(s):void 0}catch(s){throw s instanceof _?s:new _("DB_ERROR","Failed to read task log state",s)}finally{e.close();}}readLogs(t){return this.readLogsInternal(t)}readLogsTail(t,e){return bn(e),this.readLogsInternal(t,e)}readTail(t,e){return this.readLogsTail(t,e)}readLogsInternal(t,e){if(!this.dbExists())return;let s=this.openHandle(false);try{return s.db.transaction(o=>{let i=this.findStateRowInTransaction(o,t);if(!i)return;let a=ge(i);if(a.source==="blob"){let l=pe(t,i.logs);return {...a,entries:e===void 0?l:l.slice(Math.max(0,l.length-e))}}let d=o.select({seq:z.seq,timestamp:z.timestamp,level:z.level,message:z.message}).from(z).where(drizzleOrm.eq(z.task_id,t)).orderBy(e===void 0?drizzleOrm.asc(z.seq):drizzleOrm.desc(z.seq)),c=(e===void 0?d.all():d.limit(e).all()).map(({timestamp:l,level:g,message:f})=>({timestamp:l,level:g,message:f}));return e!==void 0&&c.reverse(),{...a,entries:c}},{behavior:"deferred"})}catch(o){throw o instanceof _?o:new _("DB_ERROR","Failed to read task logs",o)}finally{s.close();}}};var it="2026-05-09",Ln="0.8.9-rc.13",at=10,dt=parseInt(Ln.split("rc.")[1]);function he(){let r=drizzleOrm.sql`
18
18
  CASE
19
- WHEN ${e.model} LIKE 'claude-%' OR ${e.model} IN ('opus', 'sonnet', 'haiku', 'opus[1m]', 'sonnet[1m]') THEN 'claude'
20
- WHEN ${e.model} LIKE 'gpt-%' OR ${e.model} LIKE 'codex-%' THEN 'codex'
21
- WHEN ${e.model} LIKE 'gemini-%' THEN 'gemini'
22
- WHEN ${e.model} LIKE 'grok-%' THEN 'grok'
23
- WHEN ${e.model} LIKE 'zai-%' OR ${e.model} LIKE 'openrouter/z-ai/%' THEN 'opencode'
24
- WHEN ${e.model} LIKE 'minimax/%' THEN 'minimax'
25
- WHEN ${e.model} LIKE 'qwen%' THEN 'qwen'
19
+ WHEN ${n.model} LIKE 'claude-%' OR ${n.model} IN ('opus', 'sonnet', 'haiku', 'opus[1m]', 'sonnet[1m]') THEN 'claude'
20
+ WHEN ${n.model} LIKE 'gpt-%' OR ${n.model} LIKE 'codex-%' THEN 'codex'
21
+ WHEN ${n.model} LIKE 'gemini-%' THEN 'gemini'
22
+ WHEN ${n.model} LIKE 'grok-%' THEN 'grok'
23
+ WHEN ${n.model} LIKE 'zai-%' OR ${n.model} LIKE 'openrouter/z-ai/%' THEN 'opencode'
24
+ WHEN ${n.model} LIKE 'minimax/%' THEN 'minimax'
25
+ WHEN ${n.model} LIKE 'qwen%' THEN 'qwen'
26
26
  ELSE 'unknown'
27
27
  END
28
- `,t=drizzleOrm.sql`json_extract(${e.metadata}, '$.provider')`,n=drizzleOrm.sql`trim(${t})`,s=drizzleOrm.sql`substr(${n}, 1, instr(${n}, '/') - 1)`,r=drizzleOrm.sql`
28
+ `,t=drizzleOrm.sql`json_extract(${n.metadata}, '$.provider')`,e=drizzleOrm.sql`trim(${t})`,s=drizzleOrm.sql`substr(${e}, 1, instr(${e}, '/') - 1)`,o=drizzleOrm.sql`
29
29
  CASE
30
- WHEN instr(${n}, '/') > 0
30
+ WHEN instr(${e}, '/') > 0
31
31
  AND ${s} IN ('cli', 'acp', 'api', 'plugin', 'remote')
32
- THEN substr(${n}, instr(${n}, '/') + 1)
33
- ELSE ${n}
32
+ THEN substr(${e}, instr(${e}, '/') + 1)
33
+ ELSE ${e}
34
34
  END
35
35
  `;return drizzleOrm.sql`
36
36
  CASE
37
- WHEN ${e.metadata} IS NULL THEN ${o}
38
- WHEN json_valid(${e.metadata}) = 0 THEN 'unknown'
39
- WHEN json_type(${e.metadata}, '$') IS NOT 'object' THEN 'unknown'
40
- WHEN json_type(${e.metadata}, '$.provider') IS NULL THEN ${o}
41
- WHEN json_type(${e.metadata}, '$.provider') IS NOT 'text' THEN 'unknown'
42
- WHEN ${n} = '' THEN 'unknown'
43
- WHEN trim(${r}) = '' THEN 'unknown'
44
- ELSE ${r}
37
+ WHEN ${n.metadata} IS NULL THEN ${r}
38
+ WHEN json_valid(${n.metadata}) = 0 THEN 'unknown'
39
+ WHEN json_type(${n.metadata}, '$') IS NOT 'object' THEN 'unknown'
40
+ WHEN json_type(${n.metadata}, '$.provider') IS NULL THEN ${r}
41
+ WHEN json_type(${n.metadata}, '$.provider') IS NOT 'text' THEN 'unknown'
42
+ WHEN ${e} = '' THEN 'unknown'
43
+ WHEN trim(${o}) = '' THEN 'unknown'
44
+ ELSE ${o}
45
45
  END
46
- `}var cn=new Set(["workflow","mcp"]),ae=600*1e3,At=class extends ut{dbPath;pidNullObservedSince=new Map;constructor(t={}){super(),t.dbPath?this.dbPath=t.dbPath:t.dbRoot&&(this.dbPath=Y.join(t.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(t){let n=this.resolveDbPath();if(t){let r=Y.dirname(n);fs.existsSync(r)||fs.mkdirSync(r,{recursive:true});}else if(!fs.existsSync(n))throw new p("NOT_FOUND","Database not found");let s=R(n);if(t)try{Et(s.db,n);}catch(r){throw s.close(),r}return s}startTask(t){let n=this.openHandle(true);try{n.db.insert(e).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,project_id:t.projectId??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}).onConflictDoUpdate({target:e.id,set:{pid:drizzleOrm.sql`COALESCE(excluded.pid, ${e.pid})`},setWhere:drizzleOrm.eq(e.status,"running")}).run();}catch(s){throw s instanceof p?s:new p("DB_ERROR","Failed to start task",s)}finally{n.close();}}listTasksByProjectId(t){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.select().from(e).where(drizzleOrm.eq(e.project_id,t)).orderBy(drizzleOrm.desc(e.started_at)).all()}catch(s){throw s instanceof p?s:new p("DB_ERROR","Failed to list tasks by project",s)}finally{n.close();}}finishTask(t){let n=this.openHandle(true);try{let s=t.runEpoch??null;n.runRaw(`UPDATE tasks SET status=?, result=?, error=?, completed_at=?, duration_ms=?,
46
+ `}var Dn=new Set(["workflow","mcp"]),ke=600*1e3,Lt=class extends st{dbPath;taskLogRepository;pidNullObservedSince=new Map;constructor(t={}){super(),t.dbPath?this.dbPath=t.dbPath:t.dbRoot&&(this.dbPath=V.join(t.dbRoot,".crewx","crewx.db")),this.taskLogRepository=new vt({dbPath:this.dbPath});}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(t){let e=this.resolveDbPath();if(t){let o=V.dirname(e);fs.existsSync(o)||fs.mkdirSync(o,{recursive:true});}else if(!fs.existsSync(e))throw new _("NOT_FOUND","Database not found");let s=R(e);if(t)try{_t(s.db,e);}catch(o){throw s.close(),o}return s}startTask(t){let e=this.openHandle(true);try{let s={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,project_id:t.projectId??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,log_storage:"events"},o=i=>{e.db.insert(n).values(i).onConflictDoUpdate({target:n.id,set:{pid:drizzleOrm.sql`COALESCE(excluded.pid, ${n.pid})`},setWhere:drizzleOrm.eq(n.status,"running")}).run();};try{o(s);}catch(i){let a=i instanceof Error?i.message:typeof i=="object"&&i!==null&&"message"in i?String(i.message):String(i);if(!/log_storage/i.test(a)||!/no such column|no column named/i.test(a))throw i;e.runRaw(`INSERT INTO tasks (
47
+ id, agent_id, prompt, mode, status, started_at, pid,
48
+ parent_task_id, caller_agent_id, trace_id, command, metadata,
49
+ workspace_id, project_id, platform, crewx_version, thread_id,
50
+ model, rendered_prompt, coding_agent_command
51
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
52
+ ON CONFLICT(id) DO UPDATE SET pid = COALESCE(excluded.pid, tasks.pid)
53
+ WHERE tasks.status = 'running'`,[s.id,s.agent_id,s.prompt,s.mode,s.status,s.started_at,s.pid,s.parent_task_id,s.caller_agent_id,s.trace_id,s.command,s.metadata,s.workspace_id,s.project_id,s.platform,s.crewx_version,s.thread_id,s.model,s.rendered_prompt,s.coding_agent_command]);}}catch(s){throw s instanceof _?s:new _("DB_ERROR","Failed to start task",s)}finally{e.close();}}listTasksByProjectId(t){if(!this.dbExists())return [];let e=this.openHandle(false);try{return e.db.select().from(n).where(drizzleOrm.eq(n.project_id,t)).orderBy(drizzleOrm.desc(n.started_at)).all()}catch(s){throw s instanceof _?s:new _("DB_ERROR","Failed to list tasks by project",s)}finally{e.close();}}finishTask(t){let e=this.openHandle(true);try{let s=t.runEpoch??null;e.runRaw(`UPDATE tasks SET status=?, result=?, error=?, completed_at=?, duration_ms=?,
47
54
  exit_code=?, input_tokens=?, output_tokens=?, cached_input_tokens=?, cost_usd=?,
48
55
  model=COALESCE(?, model)
49
- WHERE id=? AND status='running' AND COALESCE(run_epoch, 0) = COALESCE(?, 0)`,[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,s]);}catch(s){throw s instanceof p?s:new p("DB_ERROR","Failed to finish task",s)}finally{n.close();}}appendLog(t,n){let s=this.openHandle(true);try{s.db.transaction(r=>{let i=r.select({logs:e.logs}).from(e).where(drizzleOrm.eq(e.id,t)).limit(1).get(),a=i?.logs?JSON.parse(i.logs):[];a.push(n),r.update(e).set({logs:JSON.stringify(a)}).where(drizzleOrm.eq(e.id,t)).run();},{behavior:"immediate"});}catch(r){throw r instanceof p?r:new p("DB_ERROR","Failed to append log",r)}finally{s.close();}}getRunningTasks(){if(!this.dbExists())return [];let t=this.openHandle(false);try{return t.db.select().from(e).where(drizzleOrm.eq(e.status,"running")).orderBy(drizzleOrm.desc(e.started_at)).all()}catch(n){throw new p("DB_ERROR","Failed to get running tasks",n)}finally{t.close();}}getAllTasks(){if(!this.dbExists())return [];let t=this.openHandle(false);try{return t.db.select().from(e).orderBy(drizzleOrm.desc(e.started_at)).limit(100).all()}catch(n){throw new p("DB_ERROR","Failed to get all tasks",n)}finally{t.close();}}getTask(t){if(!this.dbExists())return;let n=this.openHandle(false);try{return n.db.select().from(e).where(drizzleOrm.eq(e.id,t)).limit(1).get()??void 0}catch(s){throw new p("DB_ERROR","Failed to get task",s)}finally{n.close();}}killTask(t){if(!this.dbExists())return {killed:false};let n=this.openHandle(true);try{let s=n.db.select({id:e.id,status:e.status,pid:e.pid}).from(e).where(drizzleOrm.eq(e.id,t)).limit(1).get();if(!s||s.status!=="running")return {killed:!1};if(s.pid)try{process.kill(s.pid,"SIGTERM");}catch{}return n.db.update(e).set({status:"failed",error:"Killed by user",completed_at:new Date().toISOString()}).where(drizzleOrm.and(drizzleOrm.eq(e.id,t),drizzleOrm.eq(e.status,"running"))).run(),{killed:!0,pid:s.pid??void 0}}catch(s){throw s instanceof p?s:new p("DB_ERROR","Failed to kill task",s)}finally{n.close();}}reapOrphanedTasks(){if(!this.dbExists())return 0;let t=this.openHandle(true);try{let n=t.db.select({id:e.id,pid:e.pid,platform:e.platform,run_epoch:e.run_epoch}).from(e).where(drizzleOrm.eq(e.status,"running")).all(),s=Date.now(),r=new Set,i=0;for(let a of n){if(a.pid){let c=!1;try{process.kill(a.pid,0),c=!0;}catch{}c||(t.db.update(e).set({status:"failed",error:"Reaped: process not found (orphaned task)",completed_at:new Date().toISOString()}).where(drizzleOrm.and(drizzleOrm.eq(e.id,a.id),drizzleOrm.eq(e.status,"running"))).run(),i++);continue}if(cn.has(a.platform??"cli"))continue;let d=`${a.id}:${a.run_epoch??0}`;r.add(d);let u=this.pidNullObservedSince.get(d);if(u===void 0){this.pidNullObservedSince.set(d,s);continue}s-u>=ae&&(t.db.update(e).set({status:"failed",error:"Reaped: pid never recorded after resume (stale running_instruction)",completed_at:new Date().toISOString()}).where(drizzleOrm.and(drizzleOrm.eq(e.id,a.id),drizzleOrm.eq(e.status,"running"))).run(),i++,this.pidNullObservedSince.delete(d));}for(let a of Array.from(this.pidNullObservedSince.keys()))r.has(a)||this.pidNullObservedSince.delete(a);return i}finally{t.close();}}reapRunningWorkflowTasks(t=ae){if(!this.dbExists())return 0;let n=this.openHandle(true);try{let s=new Date(Date.now()-t).toISOString();return n.db.update(e).set({status:"failed",error:"Reaped: stale workflow run (finally not executed)",completed_at:new Date().toISOString()}).where(drizzleOrm.and(drizzleOrm.eq(e.status,"running"),drizzleOrm.eq(e.platform,"workflow"),drizzleOrm.isNull(e.pid),drizzleOrm.lt(e.started_at,s),drizzleOrm.or(drizzleOrm.isNull(e.metadata),drizzleOrm.and(drizzleOrm.notLike(e.metadata,'%"kind":"workflow_card"%'),drizzleOrm.notLike(e.metadata,'%"kind":"workflow_ui_instance"%'))))).run().changes??0}finally{n.close();}}findTaskStatus(t,n){let s=this.resolveDbPaths();for(let r of s){if(!fs.existsSync(r))continue;let i=R(r);try{let a=n?drizzleOrm.eq(e.workspace_id,n):void 0,d=a?drizzleOrm.and(drizzleOrm.eq(e.id,t),a):drizzleOrm.eq(e.id,t),u=i.db.select().from(e).where(d).limit(1).get()??void 0;if(!u){let c=drizzleOrm.or(drizzleOrm.eq(e.thread_id,t),drizzleOrm.and(drizzleOrm.isNull(e.thread_id),drizzleOrm.like(e.command,`%--thread=${t}%`))),l=a?drizzleOrm.and(c,a):c;u=i.db.select().from(e).where(l).orderBy(drizzleOrm.desc(e.started_at)).limit(1).get()??void 0;}if(u)return u}catch(a){throw new p("DB_ERROR","Failed to find task status",a)}finally{i.close();}}}findChildTasks(t,n){let s=this.resolveDbPaths(),r=new Set,i=[];for(let a of s){if(!fs.existsSync(a))continue;let d=R(a);try{let u=n?drizzleOrm.and(drizzleOrm.eq(e.parent_task_id,t),drizzleOrm.eq(e.workspace_id,n)):drizzleOrm.eq(e.parent_task_id,t),c=d.db.select().from(e).where(u).orderBy(drizzleOrm.asc(e.started_at)).all();for(let l of c)r.has(l.id)||(r.add(l.id),i.push(l));}catch(u){throw new p("DB_ERROR","Failed to find child tasks",u)}finally{d.close();}}return i}getWorkspaceUsageSummary(t){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.all(t?drizzleOrm.sql`
56
+ WHERE id=? AND status='running' AND COALESCE(run_epoch, 0) = COALESCE(?, 0)`,[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,s]);}catch(s){throw s instanceof _?s:new _("DB_ERROR","Failed to finish task",s)}finally{e.close();}}appendLog(t,e){this.taskLogRepository.appendLog(t,e);}appendLogs(t,e){this.taskLogRepository.appendLogs(t,e);}readLogs(t){return this.taskLogRepository.readLogs(t)}readLogsTail(t,e){return this.taskLogRepository.readLogsTail(t,e)}getLogState(t){return this.taskLogRepository.getLogState(t)}getRunningTasks(){if(!this.dbExists())return [];let t=this.openHandle(false);try{return t.db.select().from(n).where(drizzleOrm.eq(n.status,"running")).orderBy(drizzleOrm.desc(n.started_at)).all()}catch(e){throw new _("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(n).orderBy(drizzleOrm.desc(n.started_at)).limit(100).all()}catch(e){throw new _("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(n).where(drizzleOrm.eq(n.id,t)).limit(1).get()??void 0}catch(s){throw new _("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:n.id,status:n.status,pid:n.pid}).from(n).where(drizzleOrm.eq(n.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(n).set({status:"failed",error:"Killed by user",completed_at:new Date().toISOString()}).where(drizzleOrm.and(drizzleOrm.eq(n.id,t),drizzleOrm.eq(n.status,"running"))).run(),{killed:!0,pid:s.pid??void 0}}catch(s){throw s instanceof _?s:new _("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:n.id,pid:n.pid,platform:n.platform,run_epoch:n.run_epoch}).from(n).where(drizzleOrm.eq(n.status,"running")).all(),s=Date.now(),o=new Set,i=0;for(let a of e){if(a.pid){let c=!1;try{process.kill(a.pid,0),c=!0;}catch{}c||(t.db.update(n).set({status:"failed",error:"Reaped: process not found (orphaned task)",completed_at:new Date().toISOString()}).where(drizzleOrm.and(drizzleOrm.eq(n.id,a.id),drizzleOrm.eq(n.status,"running"))).run(),i++);continue}if(Dn.has(a.platform??"cli"))continue;let d=`${a.id}:${a.run_epoch??0}`;o.add(d);let u=this.pidNullObservedSince.get(d);if(u===void 0){this.pidNullObservedSince.set(d,s);continue}s-u>=ke&&(t.db.update(n).set({status:"failed",error:"Reaped: pid never recorded after resume (stale running_instruction)",completed_at:new Date().toISOString()}).where(drizzleOrm.and(drizzleOrm.eq(n.id,a.id),drizzleOrm.eq(n.status,"running"))).run(),i++,this.pidNullObservedSince.delete(d));}for(let a of Array.from(this.pidNullObservedSince.keys()))o.has(a)||this.pidNullObservedSince.delete(a);return i}finally{t.close();}}reapRunningWorkflowTasks(t=ke){if(!this.dbExists())return 0;let e=this.openHandle(true);try{let s=new Date(Date.now()-t).toISOString();return e.db.update(n).set({status:"failed",error:"Reaped: stale workflow run (finally not executed)",completed_at:new Date().toISOString()}).where(drizzleOrm.and(drizzleOrm.eq(n.status,"running"),drizzleOrm.eq(n.platform,"workflow"),drizzleOrm.isNull(n.pid),drizzleOrm.lt(n.started_at,s),drizzleOrm.or(drizzleOrm.isNull(n.metadata),drizzleOrm.and(drizzleOrm.notLike(n.metadata,'%"kind":"workflow_card"%'),drizzleOrm.notLike(n.metadata,'%"kind":"workflow_ui_instance"%'))))).run().changes??0}finally{e.close();}}findTaskStatus(t,e){let s=this.resolveDbPaths();for(let o of s){if(!fs.existsSync(o))continue;let i=R(o);try{let a=e?drizzleOrm.eq(n.workspace_id,e):void 0,d=a?drizzleOrm.and(drizzleOrm.eq(n.id,t),a):drizzleOrm.eq(n.id,t),u=i.db.select().from(n).where(d).limit(1).get()??void 0;if(!u){let c=drizzleOrm.or(drizzleOrm.eq(n.thread_id,t),drizzleOrm.and(drizzleOrm.isNull(n.thread_id),drizzleOrm.like(n.command,`%--thread=${t}%`))),l=a?drizzleOrm.and(c,a):c;u=i.db.select().from(n).where(l).orderBy(drizzleOrm.desc(n.started_at)).limit(1).get()??void 0;}if(u)return u}catch(a){throw new _("DB_ERROR","Failed to find task status",a)}finally{i.close();}}}findChildTasks(t,e){let s=this.resolveDbPaths(),o=new Set,i=[];for(let a of s){if(!fs.existsSync(a))continue;let d=R(a);try{let u=e?drizzleOrm.and(drizzleOrm.eq(n.parent_task_id,t),drizzleOrm.eq(n.workspace_id,e)):drizzleOrm.eq(n.parent_task_id,t),c=d.db.select().from(n).where(u).orderBy(drizzleOrm.asc(n.started_at)).all();for(let l of c)o.has(l.id)||(o.add(l.id),i.push(l));}catch(u){throw new _("DB_ERROR","Failed to find child tasks",u)}finally{d.close();}}return i}getWorkspaceUsageSummary(t){if(!this.dbExists())return [];let e=this.openHandle(false);try{return e.db.all(t?drizzleOrm.sql`
50
57
  SELECT
51
58
  COALESCE(workspace_id, 'unknown') AS workspace_id,
52
59
  COALESCE(SUM(input_tokens), 0) AS input_tokens,
@@ -67,7 +74,7 @@ ${s.join(`
67
74
  FROM tasks
68
75
  GROUP BY workspace_id
69
76
  ORDER BY (COALESCE(SUM(input_tokens), 0) + COALESCE(SUM(output_tokens), 0)) DESC
70
- `)}catch(s){throw new p("DB_ERROR","Failed to get workspace usage summary",s)}finally{n.close();}}getThreadTokenUsage(t,n){let s=this.resolveDbPaths(),r=new Set,i=0,a=0,d=0;for(let u of s){if(!fs.existsSync(u))continue;let c=R(u);try{let l=drizzleOrm.or(drizzleOrm.eq(e.thread_id,t),drizzleOrm.and(drizzleOrm.isNull(e.thread_id),drizzleOrm.like(e.command,`%--thread=${t}%`))),h=n?drizzleOrm.and(l,drizzleOrm.eq(e.workspace_id,n)):l,m=c.db.select({id:e.id,input_tokens:e.input_tokens,output_tokens:e.output_tokens,cost_usd:e.cost_usd}).from(e).where(h).all();for(let k of m)r.has(k.id)||(r.add(k.id),i+=k.input_tokens??0,a+=k.output_tokens??0,d+=k.cost_usd??0);}catch(l){throw new p("DB_ERROR","Failed to get thread token usage",l)}finally{c.close();}}return {inputTokens:i,outputTokens:a,costUsd:d}}findTasksByThread(t,n){let s=this.resolveDbPaths(),r=new Set,i=[];for(let a of s){if(!fs.existsSync(a))continue;let d=R(a);try{let u=drizzleOrm.or(drizzleOrm.eq(e.thread_id,t),drizzleOrm.and(drizzleOrm.isNull(e.thread_id),drizzleOrm.like(e.command,`%--thread=${t}%`))),c=n?drizzleOrm.and(u,drizzleOrm.eq(e.workspace_id,n)):u,l=d.db.select().from(e).where(c).orderBy(drizzleOrm.asc(e.started_at)).all();for(let h of l)r.has(h.id)||(r.add(h.id),i.push(h));}catch(u){throw new p("DB_ERROR","Failed to find tasks by thread",u)}finally{d.close();}}return i}parseWorkflowCardMetadata(t){if(!t)return {};try{let n=JSON.parse(t);return {kind:typeof n.kind=="string"?n.kind:void 0,workflowRunId:typeof n.workflowRunId=="string"?n.workflowRunId:void 0}}catch{return {}}}extractThreadIdFromCommand(t){return t?/--thread=(\S+)/.exec(t)?.[1]??null:null}findRunningWorkflowParentTasks(){if(!this.dbExists())return [];let t=[];for(let n of this.resolveDbPaths()){if(!fs.existsSync(n))continue;let s=R(n);try{t.push(...s.db.select({id:e.id,agent_id:e.agent_id,thread_id:e.thread_id,workspace_id:e.workspace_id,platform:e.platform,status:e.status,error:e.error,completed_at:e.completed_at,duration_ms:e.duration_ms,started_at:e.started_at,metadata:e.metadata}).from(e).where(drizzleOrm.and(drizzleOrm.eq(e.platform,"workflow"),drizzleOrm.or(drizzleOrm.like(e.metadata,'%"kind":"workflow_card"%'),drizzleOrm.like(e.metadata,'%"kind":"workflow_ui_instance"%')))).orderBy(drizzleOrm.desc(e.started_at)).all());}catch(r){throw new p("DB_ERROR","Failed to find workflow parent tasks",r)}finally{s.close();}}return t}batchFetchWorkflowCards(t,n){let s=new Map;if(t.length===0)return s;let r=new Set(t),i=new Map,a=n?drizzleOrm.eq(e.workspace_id,n):void 0,d=(u,c)=>{if(!u)return;let l=i.get(u);if(l&&c.started_at<=l)return;let h=this.parseWorkflowCardMetadata(c.metadata);h.kind!=="workflow_card"&&h.kind!=="workflow_ui_instance"||(i.set(u,c.started_at),s.set(u,{taskId:c.id,workflowRunId:h.workflowRunId,raw:c.result??void 0}));};for(let u of this.resolveDbPaths()){if(!fs.existsSync(u))continue;let c=R(u);try{let l=drizzleOrm.and(drizzleOrm.inArray(e.thread_id,t),drizzleOrm.or(drizzleOrm.like(e.metadata,'%"kind":"workflow_card"%'),drizzleOrm.like(e.metadata,'%"kind":"workflow_ui_instance"%'))),h=c.db.select({id:e.id,thread_id:e.thread_id,metadata:e.metadata,result:e.result,started_at:e.started_at}).from(e).where(a?drizzleOrm.and(l,a):l).all();for(let D of h)d(D.thread_id,D);let m=drizzleOrm.and(drizzleOrm.isNull(e.thread_id),drizzleOrm.or(drizzleOrm.like(e.metadata,'%"kind":"workflow_card"%'),drizzleOrm.like(e.metadata,'%"kind":"workflow_ui_instance"%'))),k=c.db.select({id:e.id,command:e.command,metadata:e.metadata,result:e.result,started_at:e.started_at}).from(e).where(a?drizzleOrm.and(m,a):m).all();for(let D of k){let O=this.extractThreadIdFromCommand(D.command);!O||!r.has(O)||d(O,D);}}catch(l){throw new p("DB_ERROR","Failed to batch fetch workflow cards",l)}finally{c.close();}}return s}findAllTasks(t){if(!this.dbExists())return {rows:[],total:0};let n=this.openHandle(false);try{let s=[];t.workspaceId&&s.push(drizzleOrm.eq(e.workspace_id,t.workspaceId));let r=t.agents&&t.agents.length>0?t.agents:t.agentId?[t.agentId]:null;r&&s.push(drizzleOrm.inArray(e.agent_id,r));let i=t.statuses&&t.statuses.length>0?t.statuses:t.status?[t.status]:null;i&&s.push(drizzleOrm.inArray(e.status,i));let a=t.q??t.search;a&&s.push(drizzleOrm.like(e.prompt,`%${a}%`)),t.from&&s.push(drizzleOrm.gte(e.started_at,t.from)),t.to&&s.push(drizzleOrm.lt(e.started_at,t.to));let d=s.length>0?drizzleOrm.and(...s):void 0,u=n.db.select({count:drizzleOrm.sql`count(*)`}).from(e).where(d).get(),c=(t.sortDir??"DESC")==="ASC"?drizzleOrm.asc(e.started_at):drizzleOrm.desc(e.started_at);return {rows:n.db.select().from(e).where(d).orderBy(c).limit(t.limit).offset(t.offset).all(),total:u?.count??0}}catch(s){throw new p("DB_ERROR","Failed to find all tasks",s)}finally{n.close();}}getAgentUsage(t,n,s){if(!this.dbExists())return [];let r=this.openHandle(false);try{return r.db.all(s?drizzleOrm.sql`
77
+ `)}catch(s){throw new _("DB_ERROR","Failed to get workspace usage summary",s)}finally{e.close();}}getThreadTokenUsage(t,e){let s=this.resolveDbPaths(),o=new Set,i=0,a=0,d=0;for(let u of s){if(!fs.existsSync(u))continue;let c=R(u);try{let l=drizzleOrm.or(drizzleOrm.eq(n.thread_id,t),drizzleOrm.and(drizzleOrm.isNull(n.thread_id),drizzleOrm.like(n.command,`%--thread=${t}%`))),g=e?drizzleOrm.and(l,drizzleOrm.eq(n.workspace_id,e)):l,f=c.db.select({id:n.id,input_tokens:n.input_tokens,output_tokens:n.output_tokens,cost_usd:n.cost_usd}).from(n).where(g).all();for(let k of f)o.has(k.id)||(o.add(k.id),i+=k.input_tokens??0,a+=k.output_tokens??0,d+=k.cost_usd??0);}catch(l){throw new _("DB_ERROR","Failed to get thread token usage",l)}finally{c.close();}}return {inputTokens:i,outputTokens:a,costUsd:d}}findTasksByThread(t,e){let s=this.resolveDbPaths(),o=new Set,i=[];for(let a of s){if(!fs.existsSync(a))continue;let d=R(a);try{let u=drizzleOrm.or(drizzleOrm.eq(n.thread_id,t),drizzleOrm.and(drizzleOrm.isNull(n.thread_id),drizzleOrm.like(n.command,`%--thread=${t}%`))),c=e?drizzleOrm.and(u,drizzleOrm.eq(n.workspace_id,e)):u,l=d.db.select().from(n).where(c).orderBy(drizzleOrm.asc(n.started_at)).all();for(let g of l)o.has(g.id)||(o.add(g.id),i.push(g));}catch(u){throw new _("DB_ERROR","Failed to find tasks by thread",u)}finally{d.close();}}return i}parseWorkflowCardMetadata(t){if(!t)return {};try{let e=JSON.parse(t);return {kind:typeof e.kind=="string"?e.kind:void 0,workflowRunId:typeof e.workflowRunId=="string"?e.workflowRunId:void 0}}catch{return {}}}extractThreadIdFromCommand(t){return t?/--thread=(\S+)/.exec(t)?.[1]??null:null}findRunningWorkflowParentTasks(){if(!this.dbExists())return [];let t=[];for(let e of this.resolveDbPaths()){if(!fs.existsSync(e))continue;let s=R(e);try{t.push(...s.db.select({id:n.id,agent_id:n.agent_id,thread_id:n.thread_id,workspace_id:n.workspace_id,platform:n.platform,status:n.status,error:n.error,completed_at:n.completed_at,duration_ms:n.duration_ms,started_at:n.started_at,metadata:n.metadata}).from(n).where(drizzleOrm.and(drizzleOrm.eq(n.platform,"workflow"),drizzleOrm.or(drizzleOrm.like(n.metadata,'%"kind":"workflow_card"%'),drizzleOrm.like(n.metadata,'%"kind":"workflow_ui_instance"%')))).orderBy(drizzleOrm.desc(n.started_at)).all());}catch(o){throw new _("DB_ERROR","Failed to find workflow parent tasks",o)}finally{s.close();}}return t}batchFetchWorkflowCards(t,e){let s=new Map;if(t.length===0)return s;let o=new Set(t),i=new Map,a=e?drizzleOrm.eq(n.workspace_id,e):void 0,d=(u,c)=>{if(!u)return;let l=i.get(u);if(l&&c.started_at<=l)return;let g=this.parseWorkflowCardMetadata(c.metadata);g.kind!=="workflow_card"&&g.kind!=="workflow_ui_instance"||(i.set(u,c.started_at),s.set(u,{taskId:c.id,workflowRunId:g.workflowRunId,raw:c.result??void 0}));};for(let u of this.resolveDbPaths()){if(!fs.existsSync(u))continue;let c=R(u);try{let l=drizzleOrm.and(drizzleOrm.inArray(n.thread_id,t),drizzleOrm.or(drizzleOrm.like(n.metadata,'%"kind":"workflow_card"%'),drizzleOrm.like(n.metadata,'%"kind":"workflow_ui_instance"%'))),g=c.db.select({id:n.id,thread_id:n.thread_id,metadata:n.metadata,result:n.result,started_at:n.started_at}).from(n).where(a?drizzleOrm.and(l,a):l).all();for(let D of g)d(D.thread_id,D);let f=drizzleOrm.and(drizzleOrm.isNull(n.thread_id),drizzleOrm.or(drizzleOrm.like(n.metadata,'%"kind":"workflow_card"%'),drizzleOrm.like(n.metadata,'%"kind":"workflow_ui_instance"%'))),k=c.db.select({id:n.id,command:n.command,metadata:n.metadata,result:n.result,started_at:n.started_at}).from(n).where(a?drizzleOrm.and(f,a):f).all();for(let D of k){let $=this.extractThreadIdFromCommand(D.command);!$||!o.has($)||d($,D);}}catch(l){throw new _("DB_ERROR","Failed to batch fetch workflow cards",l)}finally{c.close();}}return s}findAllTasks(t){if(!this.dbExists())return {rows:[],total:0};let e=this.openHandle(false);try{let s=[];t.workspaceId&&s.push(drizzleOrm.eq(n.workspace_id,t.workspaceId));let o=t.agents&&t.agents.length>0?t.agents:t.agentId?[t.agentId]:null;o&&s.push(drizzleOrm.inArray(n.agent_id,o));let i=t.statuses&&t.statuses.length>0?t.statuses:t.status?[t.status]:null;i&&s.push(drizzleOrm.inArray(n.status,i));let a=t.q??t.search;a&&s.push(drizzleOrm.like(n.prompt,`%${a}%`)),t.from&&s.push(drizzleOrm.gte(n.started_at,t.from)),t.to&&s.push(drizzleOrm.lt(n.started_at,t.to));let d=s.length>0?drizzleOrm.and(...s):void 0,u=e.db.select({count:drizzleOrm.sql`count(*)`}).from(n).where(d).get(),c=(t.sortDir??"DESC")==="ASC"?drizzleOrm.asc(n.started_at):drizzleOrm.desc(n.started_at);return {rows:e.db.select().from(n).where(d).orderBy(c).limit(t.limit).offset(t.offset).all(),total:u?.count??0}}catch(s){throw new _("DB_ERROR","Failed to find all tasks",s)}finally{e.close();}}getAgentUsage(t,e,s){if(!this.dbExists())return [];let o=this.openHandle(false);try{return o.db.all(s?drizzleOrm.sql`
71
78
  SELECT
72
79
  t.agent_id,
73
80
  t.workspace_id,
@@ -75,11 +82,11 @@ ${s.join(`
75
82
  COALESCE(SUM(
76
83
  COALESCE(t.input_tokens, 0)
77
84
  + CASE
78
- WHEN t.started_at >= ${st}
85
+ WHEN t.started_at >= ${it}
79
86
  AND (
80
87
  t.crewx_version IS NULL
81
88
  OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
82
- OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${rt}) AS INTEGER) < ${ot})
89
+ OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${at}) AS INTEGER) < ${dt})
83
90
  )
84
91
  THEN COALESCE(t.cached_input_tokens, 0)
85
92
  ELSE 0
@@ -91,18 +98,18 @@ ${s.join(`
91
98
  FROM tasks t
92
99
  WHERE t.status IN ('completed', 'success')
93
100
  AND t.started_at >= ${t}
94
- AND t.started_at < ${n}
101
+ AND t.started_at < ${e}
95
102
  AND t.workspace_id = ${s}
96
103
  GROUP BY t.agent_id, t.workspace_id
97
104
  ORDER BY (
98
105
  COALESCE(SUM(
99
106
  COALESCE(t.input_tokens, 0)
100
107
  + CASE
101
- WHEN t.started_at >= ${st}
108
+ WHEN t.started_at >= ${it}
102
109
  AND (
103
110
  t.crewx_version IS NULL
104
111
  OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
105
- OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${rt}) AS INTEGER) < ${ot})
112
+ OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${at}) AS INTEGER) < ${dt})
106
113
  )
107
114
  THEN COALESCE(t.cached_input_tokens, 0)
108
115
  ELSE 0
@@ -118,11 +125,11 @@ ${s.join(`
118
125
  COALESCE(SUM(
119
126
  COALESCE(t.input_tokens, 0)
120
127
  + CASE
121
- WHEN t.started_at >= ${st}
128
+ WHEN t.started_at >= ${it}
122
129
  AND (
123
130
  t.crewx_version IS NULL
124
131
  OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
125
- OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${rt}) AS INTEGER) < ${ot})
132
+ OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${at}) AS INTEGER) < ${dt})
126
133
  )
127
134
  THEN COALESCE(t.cached_input_tokens, 0)
128
135
  ELSE 0
@@ -134,17 +141,17 @@ ${s.join(`
134
141
  FROM tasks t
135
142
  WHERE t.status IN ('completed', 'success')
136
143
  AND t.started_at >= ${t}
137
- AND t.started_at < ${n}
144
+ AND t.started_at < ${e}
138
145
  GROUP BY t.agent_id, t.workspace_id
139
146
  ORDER BY (
140
147
  COALESCE(SUM(
141
148
  COALESCE(t.input_tokens, 0)
142
149
  + CASE
143
- WHEN t.started_at >= ${st}
150
+ WHEN t.started_at >= ${it}
144
151
  AND (
145
152
  t.crewx_version IS NULL
146
153
  OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
147
- OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${rt}) AS INTEGER) < ${ot})
154
+ OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${at}) AS INTEGER) < ${dt})
148
155
  )
149
156
  THEN COALESCE(t.cached_input_tokens, 0)
150
157
  ELSE 0
@@ -152,18 +159,18 @@ ${s.join(`
152
159
  ), 0)
153
160
  + COALESCE(SUM(t.output_tokens), 0)
154
161
  ) DESC
155
- `).map(a=>({agentId:a.agent_id,workspaceId:a.workspace_id??null,totalTasks:a.total_tasks,inputTokens:a.input_tokens,outputTokens:a.output_tokens,cachedInputTokens:a.cached_input_tokens,costUsd:a.cost_usd,totalTokens:a.input_tokens+a.output_tokens}))}catch(i){throw new p("DB_ERROR","Failed to get agent usage",i)}finally{r.close();}}getAgentUsageTrendRaw(t,n,s){if(!this.dbExists())return [];let r=this.openHandle(false);try{return r.db.all(s?drizzleOrm.sql`
162
+ `).map(a=>({agentId:a.agent_id,workspaceId:a.workspace_id??null,totalTasks:a.total_tasks,inputTokens:a.input_tokens,outputTokens:a.output_tokens,cachedInputTokens:a.cached_input_tokens,costUsd:a.cost_usd,totalTokens:a.input_tokens+a.output_tokens}))}catch(i){throw new _("DB_ERROR","Failed to get agent usage",i)}finally{o.close();}}getAgentUsageTrendRaw(t,e,s){if(!this.dbExists())return [];let o=this.openHandle(false);try{return o.db.all(s?drizzleOrm.sql`
156
163
  SELECT
157
164
  date(t.started_at) AS date,
158
165
  t.agent_id,
159
166
  COALESCE(SUM(
160
167
  COALESCE(t.input_tokens, 0)
161
168
  + CASE
162
- WHEN t.started_at >= ${st}
169
+ WHEN t.started_at >= ${it}
163
170
  AND (
164
171
  t.crewx_version IS NULL
165
172
  OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
166
- OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${rt}) AS INTEGER) < ${ot})
173
+ OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${at}) AS INTEGER) < ${dt})
167
174
  )
168
175
  THEN COALESCE(t.cached_input_tokens, 0)
169
176
  ELSE 0
@@ -175,7 +182,7 @@ ${s.join(`
175
182
  FROM tasks t
176
183
  WHERE t.status IN ('completed', 'success')
177
184
  AND t.started_at >= ${t}
178
- AND t.started_at < ${n}
185
+ AND t.started_at < ${e}
179
186
  AND t.workspace_id = ${s}
180
187
  GROUP BY date(t.started_at), t.agent_id
181
188
  ORDER BY date(t.started_at) ASC
@@ -186,11 +193,11 @@ ${s.join(`
186
193
  COALESCE(SUM(
187
194
  COALESCE(t.input_tokens, 0)
188
195
  + CASE
189
- WHEN t.started_at >= ${st}
196
+ WHEN t.started_at >= ${it}
190
197
  AND (
191
198
  t.crewx_version IS NULL
192
199
  OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
193
- OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${rt}) AS INTEGER) < ${ot})
200
+ OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${at}) AS INTEGER) < ${dt})
194
201
  )
195
202
  THEN COALESCE(t.cached_input_tokens, 0)
196
203
  ELSE 0
@@ -202,77 +209,77 @@ ${s.join(`
202
209
  FROM tasks t
203
210
  WHERE t.status IN ('completed', 'success')
204
211
  AND t.started_at >= ${t}
205
- AND t.started_at < ${n}
212
+ AND t.started_at < ${e}
206
213
  GROUP BY date(t.started_at), t.agent_id
207
214
  ORDER BY date(t.started_at) ASC
208
- `).map(a=>({date:a.date,agentId:a.agent_id,inputTokens:a.input_tokens,outputTokens:a.output_tokens,cachedInputTokens:a.cached_input_tokens,costUsd:a.cost_usd,totalTokens:a.input_tokens+a.output_tokens}))}catch(i){throw new p("DB_ERROR","Failed to get agent usage trend",i)}finally{r.close();}}findTaskForStop(t,n){if(!this.dbExists())return;let s=this.openHandle(false);try{return s.db.select().from(e).where(drizzleOrm.and(drizzleOrm.eq(e.id,t),drizzleOrm.eq(e.workspace_id,n))).limit(1).get()??void 0}catch(r){throw new p("DB_ERROR","Failed to find task for stop",r)}finally{s.close();}}findLatestTaskByMetadata(t){if(!this.dbExists())return null;let n=this.openHandle(false);try{return n.db.select({id:e.id,thread_id:e.thread_id,status:e.status,result:e.result,error:e.error,started_at:e.started_at,completed_at:e.completed_at,metadata:e.metadata}).from(e).where(drizzleOrm.and(drizzleOrm.eq(e.agent_id,t.agentId),drizzleOrm.eq(e.workspace_id,t.workspaceId),drizzleOrm.sql`${e.metadata} IS NOT NULL AND json_valid(${e.metadata}) AND json_extract(${e.metadata}, '$.' || ${t.metaKey}) = ${t.metaValue}`)).orderBy(drizzleOrm.desc(e.started_at)).limit(1).get()??null}catch(s){throw new p("DB_ERROR","Failed to find latest task by metadata",s)}finally{n.close();}}markTaskFailed(t,n,s){if(!this.dbExists())return;let r=this.openHandle(true);try{let i=new Date().toISOString(),a=s?drizzleOrm.and(drizzleOrm.eq(e.id,t),drizzleOrm.eq(e.status,"running"),drizzleOrm.eq(e.workspace_id,s)):drizzleOrm.and(drizzleOrm.eq(e.id,t),drizzleOrm.eq(e.status,"running"));r.db.update(e).set({status:"failed",error:n,completed_at:i}).where(a).run();}catch(i){throw i instanceof p?i:new p("DB_ERROR","Failed to mark task failed",i)}finally{r.close();}}findTasksByPromptHint(t,n){let s=this.resolveDbPaths(),r=new Set,i=[];for(let a of s){if(!fs.existsSync(a))continue;let d=R(a);try{let u=n?drizzleOrm.and(drizzleOrm.like(e.prompt,`%${t}%`),drizzleOrm.eq(e.workspace_id,n)):drizzleOrm.like(e.prompt,`%${t}%`),c=d.db.select().from(e).where(u).orderBy(drizzleOrm.asc(e.started_at)).all();for(let l of c)r.has(l.id)||(r.add(l.id),i.push(l));}catch(u){throw new p("DB_ERROR","Failed to find tasks by prompt hint",u)}finally{d.close();}}return i}getProviderUsage(t,n,s){if(!this.dbExists())return [];let r=this.openHandle(false);try{let i=ie(),a=drizzleOrm.sql`
209
- COALESCE(${e.input_tokens}, 0)
215
+ `).map(a=>({date:a.date,agentId:a.agent_id,inputTokens:a.input_tokens,outputTokens:a.output_tokens,cachedInputTokens:a.cached_input_tokens,costUsd:a.cost_usd,totalTokens:a.input_tokens+a.output_tokens}))}catch(i){throw new _("DB_ERROR","Failed to get agent usage trend",i)}finally{o.close();}}findTaskForStop(t,e){if(!this.dbExists())return;let s=this.openHandle(false);try{return s.db.select().from(n).where(drizzleOrm.and(drizzleOrm.eq(n.id,t),drizzleOrm.eq(n.workspace_id,e))).limit(1).get()??void 0}catch(o){throw new _("DB_ERROR","Failed to find task for stop",o)}finally{s.close();}}findLatestTaskByMetadata(t){if(!this.dbExists())return null;let e=this.openHandle(false);try{return e.db.select({id:n.id,thread_id:n.thread_id,status:n.status,result:n.result,error:n.error,started_at:n.started_at,completed_at:n.completed_at,metadata:n.metadata}).from(n).where(drizzleOrm.and(drizzleOrm.eq(n.agent_id,t.agentId),drizzleOrm.eq(n.workspace_id,t.workspaceId),drizzleOrm.sql`${n.metadata} IS NOT NULL AND json_valid(${n.metadata}) AND json_extract(${n.metadata}, '$.' || ${t.metaKey}) = ${t.metaValue}`)).orderBy(drizzleOrm.desc(n.started_at)).limit(1).get()??null}catch(s){throw new _("DB_ERROR","Failed to find latest task by metadata",s)}finally{e.close();}}markTaskFailed(t,e,s){if(!this.dbExists())return;let o=this.openHandle(true);try{let i=new Date().toISOString(),a=s?drizzleOrm.and(drizzleOrm.eq(n.id,t),drizzleOrm.eq(n.status,"running"),drizzleOrm.eq(n.workspace_id,s)):drizzleOrm.and(drizzleOrm.eq(n.id,t),drizzleOrm.eq(n.status,"running"));o.db.update(n).set({status:"failed",error:e,completed_at:i}).where(a).run();}catch(i){throw i instanceof _?i:new _("DB_ERROR","Failed to mark task failed",i)}finally{o.close();}}findTasksByPromptHint(t,e){let s=this.resolveDbPaths(),o=new Set,i=[];for(let a of s){if(!fs.existsSync(a))continue;let d=R(a);try{let u=e?drizzleOrm.and(drizzleOrm.like(n.prompt,`%${t}%`),drizzleOrm.eq(n.workspace_id,e)):drizzleOrm.like(n.prompt,`%${t}%`),c=d.db.select().from(n).where(u).orderBy(drizzleOrm.asc(n.started_at)).all();for(let l of c)o.has(l.id)||(o.add(l.id),i.push(l));}catch(u){throw new _("DB_ERROR","Failed to find tasks by prompt hint",u)}finally{d.close();}}return i}getProviderUsage(t,e,s){if(!this.dbExists())return [];let o=this.openHandle(false);try{let i=he(),a=drizzleOrm.sql`
216
+ COALESCE(${n.input_tokens}, 0)
210
217
  + CASE
211
- WHEN ${e.started_at} >= ${st}
218
+ WHEN ${n.started_at} >= ${it}
212
219
  AND (
213
- ${e.crewx_version} IS NULL
214
- OR (${e.crewx_version} LIKE '0.8.%' AND ${e.crewx_version} NOT LIKE '0.8.9%')
215
- OR (${e.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${e.crewx_version}, ${rt}) AS INTEGER) < ${ot})
220
+ ${n.crewx_version} IS NULL
221
+ OR (${n.crewx_version} LIKE '0.8.%' AND ${n.crewx_version} NOT LIKE '0.8.9%')
222
+ OR (${n.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${n.crewx_version}, ${at}) AS INTEGER) < ${dt})
216
223
  )
217
- THEN COALESCE(${e.cached_input_tokens}, 0)
224
+ THEN COALESCE(${n.cached_input_tokens}, 0)
218
225
  ELSE 0
219
226
  END
220
- `,d=s?drizzleOrm.sql`WHERE ${e.status} IN ('completed', 'success') AND ${e.started_at} >= ${t} AND ${e.started_at} < ${n} AND ${e.workspace_id} = ${s}`:drizzleOrm.sql`WHERE ${e.status} IN ('completed', 'success') AND ${e.started_at} >= ${t} AND ${e.started_at} < ${n}`;return r.db.all(drizzleOrm.sql`
227
+ `,d=s?drizzleOrm.sql`WHERE ${n.status} IN ('completed', 'success') AND ${n.started_at} >= ${t} AND ${n.started_at} < ${e} AND ${n.workspace_id} = ${s}`:drizzleOrm.sql`WHERE ${n.status} IN ('completed', 'success') AND ${n.started_at} >= ${t} AND ${n.started_at} < ${e}`;return o.db.all(drizzleOrm.sql`
221
228
  SELECT
222
229
  ${i} AS provider,
223
230
  COUNT(*) AS total_tasks,
224
231
  COALESCE(SUM(${a}), 0) AS input_tokens,
225
- COALESCE(SUM(${e.output_tokens}), 0) AS output_tokens,
226
- COALESCE(SUM(${e.cached_input_tokens}), 0) AS cached_input_tokens,
227
- COALESCE(SUM(${e.cost_usd}), 0) AS cost_usd,
228
- COALESCE(SUM(${e.duration_ms}), 0) AS active_duration_ms,
229
- MAX(${e.completed_at}) AS last_active_at
230
- FROM ${e}
232
+ COALESCE(SUM(${n.output_tokens}), 0) AS output_tokens,
233
+ COALESCE(SUM(${n.cached_input_tokens}), 0) AS cached_input_tokens,
234
+ COALESCE(SUM(${n.cost_usd}), 0) AS cost_usd,
235
+ COALESCE(SUM(${n.duration_ms}), 0) AS active_duration_ms,
236
+ MAX(${n.completed_at}) AS last_active_at
237
+ FROM ${n}
231
238
  ${d}
232
239
  GROUP BY ${i}
233
- ORDER BY (COALESCE(SUM(${a}), 0) + COALESCE(SUM(${e.output_tokens}), 0)) DESC
234
- `).map(c=>({provider:c.provider,totalTasks:c.total_tasks,inputTokens:c.input_tokens,outputTokens:c.output_tokens,cachedInputTokens:c.cached_input_tokens,costUsd:c.cost_usd,totalTokens:c.input_tokens+c.output_tokens,activeDurationMs:c.active_duration_ms??0,lastActiveAt:c.last_active_at??null}))}catch(i){throw new p("DB_ERROR","Failed to get provider usage",i)}finally{r.close();}}getModelUsage(t,n,s){if(!this.dbExists())return [];let r=this.openHandle(false);try{let i=ie(),a=drizzleOrm.sql`
235
- COALESCE(${e.input_tokens}, 0)
240
+ ORDER BY (COALESCE(SUM(${a}), 0) + COALESCE(SUM(${n.output_tokens}), 0)) DESC
241
+ `).map(c=>({provider:c.provider,totalTasks:c.total_tasks,inputTokens:c.input_tokens,outputTokens:c.output_tokens,cachedInputTokens:c.cached_input_tokens,costUsd:c.cost_usd,totalTokens:c.input_tokens+c.output_tokens,activeDurationMs:c.active_duration_ms??0,lastActiveAt:c.last_active_at??null}))}catch(i){throw new _("DB_ERROR","Failed to get provider usage",i)}finally{o.close();}}getModelUsage(t,e,s){if(!this.dbExists())return [];let o=this.openHandle(false);try{let i=he(),a=drizzleOrm.sql`
242
+ COALESCE(${n.input_tokens}, 0)
236
243
  + CASE
237
- WHEN ${e.started_at} >= ${st}
244
+ WHEN ${n.started_at} >= ${it}
238
245
  AND (
239
- ${e.crewx_version} IS NULL
240
- OR (${e.crewx_version} LIKE '0.8.%' AND ${e.crewx_version} NOT LIKE '0.8.9%')
241
- OR (${e.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${e.crewx_version}, ${rt}) AS INTEGER) < ${ot})
246
+ ${n.crewx_version} IS NULL
247
+ OR (${n.crewx_version} LIKE '0.8.%' AND ${n.crewx_version} NOT LIKE '0.8.9%')
248
+ OR (${n.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${n.crewx_version}, ${at}) AS INTEGER) < ${dt})
242
249
  )
243
- THEN COALESCE(${e.cached_input_tokens}, 0)
250
+ THEN COALESCE(${n.cached_input_tokens}, 0)
244
251
  ELSE 0
245
252
  END
246
- `,d=s?drizzleOrm.sql`WHERE ${e.status} IN ('completed', 'success') AND ${e.started_at} >= ${t} AND ${e.started_at} < ${n} AND ${e.workspace_id} = ${s}`:drizzleOrm.sql`WHERE ${e.status} IN ('completed', 'success') AND ${e.started_at} >= ${t} AND ${e.started_at} < ${n}`,u=r.db.all(drizzleOrm.sql`
253
+ `,d=s?drizzleOrm.sql`WHERE ${n.status} IN ('completed', 'success') AND ${n.started_at} >= ${t} AND ${n.started_at} < ${e} AND ${n.workspace_id} = ${s}`:drizzleOrm.sql`WHERE ${n.status} IN ('completed', 'success') AND ${n.started_at} >= ${t} AND ${n.started_at} < ${e}`,u=o.db.all(drizzleOrm.sql`
247
254
  SELECT
248
- ${e.model} AS model,
255
+ ${n.model} AS model,
249
256
  ${i} AS provider,
250
257
  COUNT(*) AS total_tasks,
251
258
  COALESCE(SUM(${a}), 0) AS input_tokens,
252
- COALESCE(SUM(${e.output_tokens}), 0) AS output_tokens,
253
- COALESCE(SUM(${e.cached_input_tokens}), 0) AS cached_input_tokens,
254
- COALESCE(SUM(${e.cost_usd}), 0) AS cost_usd,
255
- COALESCE(SUM(${e.duration_ms}), 0) AS active_duration_ms,
256
- MAX(${e.completed_at}) AS last_active_at
257
- FROM ${e}
259
+ COALESCE(SUM(${n.output_tokens}), 0) AS output_tokens,
260
+ COALESCE(SUM(${n.cached_input_tokens}), 0) AS cached_input_tokens,
261
+ COALESCE(SUM(${n.cost_usd}), 0) AS cost_usd,
262
+ COALESCE(SUM(${n.duration_ms}), 0) AS active_duration_ms,
263
+ MAX(${n.completed_at}) AS last_active_at
264
+ FROM ${n}
258
265
  ${d}
259
- GROUP BY ${e.model}, ${i}
260
- `),c=new Map;for(let l of u){let h=oe(l.model??""),m=JSON.stringify([l.provider,h]),k=c.get(m);k?(k.totalTasks+=l.total_tasks,k.inputTokens+=l.input_tokens,k.outputTokens+=l.output_tokens,k.cachedInputTokens+=l.cached_input_tokens,k.costUsd+=l.cost_usd,k.totalTokens+=l.input_tokens+l.output_tokens,k.activeDurationMs+=l.active_duration_ms??0,l.last_active_at&&(!k.lastActiveAt||l.last_active_at>k.lastActiveAt)&&(k.lastActiveAt=l.last_active_at)):c.set(m,{model:h,provider:l.provider,totalTasks:l.total_tasks,inputTokens:l.input_tokens,outputTokens:l.output_tokens,cachedInputTokens:l.cached_input_tokens,costUsd:l.cost_usd,totalTokens:l.input_tokens+l.output_tokens,activeDurationMs:l.active_duration_ms??0,lastActiveAt:l.last_active_at??null});}return Array.from(c.values()).sort((l,h)=>h.costUsd-l.costUsd)}catch(i){throw new p("DB_ERROR","Failed to get model usage",i)}finally{r.close();}}getTasksForReport(t,n,s){if(!this.dbExists())return [];let r=this.openHandle(false);try{let i=s?drizzleOrm.sql`WHERE ${e.started_at} >= ${t} AND ${e.started_at} < ${n} AND ${e.workspace_id} = ${s}`:drizzleOrm.sql`WHERE ${e.started_at} >= ${t} AND ${e.started_at} < ${n}`;return r.db.all(drizzleOrm.sql`
266
+ GROUP BY ${n.model}, ${i}
267
+ `),c=new Map;for(let l of u){let g=le(l.model??""),f=JSON.stringify([l.provider,g]),k=c.get(f);k?(k.totalTasks+=l.total_tasks,k.inputTokens+=l.input_tokens,k.outputTokens+=l.output_tokens,k.cachedInputTokens+=l.cached_input_tokens,k.costUsd+=l.cost_usd,k.totalTokens+=l.input_tokens+l.output_tokens,k.activeDurationMs+=l.active_duration_ms??0,l.last_active_at&&(!k.lastActiveAt||l.last_active_at>k.lastActiveAt)&&(k.lastActiveAt=l.last_active_at)):c.set(f,{model:g,provider:l.provider,totalTasks:l.total_tasks,inputTokens:l.input_tokens,outputTokens:l.output_tokens,cachedInputTokens:l.cached_input_tokens,costUsd:l.cost_usd,totalTokens:l.input_tokens+l.output_tokens,activeDurationMs:l.active_duration_ms??0,lastActiveAt:l.last_active_at??null});}return Array.from(c.values()).sort((l,g)=>g.costUsd-l.costUsd)}catch(i){throw new _("DB_ERROR","Failed to get model usage",i)}finally{o.close();}}getTasksForReport(t,e,s){if(!this.dbExists())return [];let o=this.openHandle(false);try{let i=s?drizzleOrm.sql`WHERE ${n.started_at} >= ${t} AND ${n.started_at} < ${e} AND ${n.workspace_id} = ${s}`:drizzleOrm.sql`WHERE ${n.started_at} >= ${t} AND ${n.started_at} < ${e}`;return o.db.all(drizzleOrm.sql`
261
268
  SELECT
262
- ${e.thread_id} AS thread_id,
263
- ${e.agent_id} AS agent_id,
264
- ${e.started_at} AS started_at,
265
- ${e.status} AS status,
266
- ${e.error} AS error,
267
- ${e.exit_code} AS exit_code
268
- FROM ${e}
269
+ ${n.thread_id} AS thread_id,
270
+ ${n.agent_id} AS agent_id,
271
+ ${n.started_at} AS started_at,
272
+ ${n.status} AS status,
273
+ ${n.error} AS error,
274
+ ${n.exit_code} AS exit_code
275
+ FROM ${n}
269
276
  ${i}
270
- ORDER BY ${e.started_at} ASC
271
- `).map(d=>({threadId:d.thread_id,agentId:d.agent_id,startedAt:d.started_at,status:d.status,error:d.error,exitCode:d.exit_code}))}catch(i){throw new p("DB_ERROR","Failed to get tasks for report",i)}finally{r.close();}}findTaskEvidence(t){if(!this.dbExists())return [];let n=this.openHandle(false);try{let s=[];t.workspaceId&&s.push(drizzleOrm.eq(e.workspace_id,t.workspaceId)),t.agents&&t.agents.length>0&&s.push(drizzleOrm.inArray(e.agent_id,t.agents)),t.statuses&&t.statuses.length>0&&s.push(drizzleOrm.inArray(e.status,t.statuses)),t.from&&s.push(drizzleOrm.gte(e.started_at,t.from)),t.to&&s.push(drizzleOrm.lt(e.started_at,t.to));let r=s.length>0?drizzleOrm.and(...s):void 0,i=(t.order??"DESC")==="ASC"?drizzleOrm.asc(e.started_at):drizzleOrm.desc(e.started_at),a={id:e.id,agent_id:e.agent_id,status:e.status,prompt:e.prompt,started_at:e.started_at,completed_at:e.completed_at,thread_id:e.thread_id};return t.limit?n.db.select(a).from(e).where(r).orderBy(i).limit(t.limit).all():n.db.select(a).from(e).where(r).orderBy(i).all()}catch(s){throw new p("DB_ERROR","Failed to find task evidence",s)}finally{n.close();}}findThreadChains(t){if(!this.dbExists())return [];let n=this.openHandle(false);try{let s=t.maxThreads??8,r=t.maxTurnsPerThread??4,i=[drizzleOrm.isNotNull(e.thread_id),drizzleOrm.isNull(e.parent_task_id),drizzleOrm.isNull(e.caller_agent_id),drizzleOrm.or(drizzleOrm.isNull(e.platform),drizzleOrm.ne(e.platform,"workflow")),drizzleOrm.or(drizzleOrm.isNull(e.metadata),drizzleOrm.and(drizzleOrm.notLike(e.metadata,'%"kind":"workflow_card"%'),drizzleOrm.notLike(e.metadata,'%"kind":"workflow_ui_instance"%'))),drizzleOrm.or(drizzleOrm.isNull(e.metadata),drizzleOrm.notLike(e.metadata,'%"retriedFromTaskId"%'))];t.workspaceId&&i.push(drizzleOrm.eq(e.workspace_id,t.workspaceId)),t.from&&i.push(drizzleOrm.gte(e.started_at,t.from)),t.to&&i.push(drizzleOrm.lt(e.started_at,t.to));let a=n.db.select({id:e.id,agent_id:e.agent_id,status:e.status,prompt:e.prompt,started_at:e.started_at,completed_at:e.completed_at,thread_id:e.thread_id}).from(e).where(drizzleOrm.and(...i)).orderBy(drizzleOrm.asc(e.started_at),drizzleOrm.asc(e.id)).all(),d=new Map;for(let c of a){if(!c.thread_id)continue;let l={id:c.id,agentId:c.agent_id,status:c.status,prompt:c.prompt,startedAt:c.started_at,completedAt:c.completed_at},h=d.get(c.thread_id);h?h.push(l):d.set(c.thread_id,[l]);}let u=[];for(let[c,l]of d){let h=l.filter(m=>m.agentId===t.targetAgentId).length;h<2||u.push({threadId:c,targetAgentTurnCount:h,turns:l});}return u.sort((c,l)=>{let h=c.turns[c.turns.length-1].startedAt,m=l.turns[l.turns.length-1].startedAt;return h<m?1:h>m?-1:0}),u.slice(0,s).map(c=>({threadId:c.threadId,targetAgentTurnCount:c.targetAgentTurnCount,turns:c.turns.slice(-r)}))}catch(s){throw new p("DB_ERROR","Failed to find thread chains",s)}finally{n.close();}}};var Ut=class extends tt{name="sqlite-tracing";unsubs=[];dbPath;version;constructor(t){super(),this.dbPath=Y.join(t?.dbRoot??we.homedir(),".crewx","crewx.db"),this.version=t?.version??"unknown";}attach(t){let n=new At({dbPath:this.dbPath}),s=process.cwd(),i=fs.existsSync(Y.join(s,"crewx.yaml"))||fs.existsSync(Y.join(s,"crewx.yml"))?Kt(s):null,a=process.argv.join(" ");this.unsubs.push(t.on("task:start",d=>{try{let u=d.callerAgentId??null,c=d.parentTaskId??null,l=d.rootTraceId??d.traceId,h=d.metadata?JSON.stringify(d.metadata):JSON.stringify({provider:d.provider??"cli/claude"});n.startTask({id:d.traceId,agentId:d.agentRef.replace(/^@/,""),prompt:d.message,mode:d.mode,status:"running",pid:d.pid??null,startedAt:d.timestamp.toISOString(),crewxVersion:this.version,platform:d.platform??"cli",model:d.model??null,renderedPrompt:d.renderedPrompt??null,command:a,codingAgentCommand:d.codingAgentCommand??null,workspaceId:d.workspaceId??i,projectId:d.projectId??null,callerAgentId:u,parentTaskId:c,traceId:l,metadata:h,threadId:d.threadId??null});}catch{}}),t.on("task:output",d=>{try{n.appendLog(d.traceId,{timestamp:d.timestamp.toISOString(),level:d.level??"stdout",message:d.output});}catch{}}),t.on("task:end",d=>{try{let u=typeof d.metadata?.runEpoch=="number"?d.metadata.runEpoch:null,c=d.error?JSON.stringify({code:d.error.code,message:d.error.message,...d.error.providerCode?{providerCode:d.error.providerCode}:{}}):null;n.finishTask({id:d.traceId,status:d.error?"failed":"success",result:d.result??null,error:c,completedAt:d.timestamp.toISOString(),durationMs:d.durationMs,exitCode:d.exitCode??null,inputTokens:d.inputTokens??0,outputTokens:d.outputTokens??0,cachedInputTokens:d.cachedInputTokens??0,costUsd:d.costUsd??0,model:d.model??null,runEpoch:u});}catch{}}));}detach(t){this.unsubs.forEach(n=>n()),this.unsubs=[];}};var bt=class extends ut{dbPath;constructor(t={}){super(),t.dbPath?this.dbPath=t.dbPath:t.dbRoot&&(this.dbPath=Y.join(t.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(t){let n=this.resolveDbPath();if(t){let r=Y.dirname(n);fs.existsSync(r)||fs.mkdirSync(r,{recursive:true});}else if(!fs.existsSync(n))throw new p("NOT_FOUND","Database not found");let s=R(n);if(t)try{Et(s.db,n);}catch(r){throw s.close(),r}return s}validateWorkspaceId(t,n){return t.db.select({id:lt.id}).from(lt).where(drizzleOrm.eq(lt.id,n)).limit(1).get()?n:null}topLevelTaskPredicateSql(t="child"){return drizzleOrm.sql.raw(`NOT EXISTS (
277
+ ORDER BY ${n.started_at} ASC
278
+ `).map(d=>({threadId:d.thread_id,agentId:d.agent_id,startedAt:d.started_at,status:d.status,error:d.error,exitCode:d.exit_code}))}catch(i){throw new _("DB_ERROR","Failed to get tasks for report",i)}finally{o.close();}}findTaskEvidence(t){if(!this.dbExists())return [];let e=this.openHandle(false);try{let s=[];t.workspaceId&&s.push(drizzleOrm.eq(n.workspace_id,t.workspaceId)),t.agents&&t.agents.length>0&&s.push(drizzleOrm.inArray(n.agent_id,t.agents)),t.statuses&&t.statuses.length>0&&s.push(drizzleOrm.inArray(n.status,t.statuses)),t.from&&s.push(drizzleOrm.gte(n.started_at,t.from)),t.to&&s.push(drizzleOrm.lt(n.started_at,t.to));let o=s.length>0?drizzleOrm.and(...s):void 0,i=(t.order??"DESC")==="ASC"?drizzleOrm.asc(n.started_at):drizzleOrm.desc(n.started_at),a={id:n.id,agent_id:n.agent_id,status:n.status,prompt:n.prompt,started_at:n.started_at,completed_at:n.completed_at,thread_id:n.thread_id};return t.limit?e.db.select(a).from(n).where(o).orderBy(i).limit(t.limit).all():e.db.select(a).from(n).where(o).orderBy(i).all()}catch(s){throw new _("DB_ERROR","Failed to find task evidence",s)}finally{e.close();}}findThreadChains(t){if(!this.dbExists())return [];let e=this.openHandle(false);try{let s=t.maxThreads??8,o=t.maxTurnsPerThread??4,i=[drizzleOrm.isNotNull(n.thread_id),drizzleOrm.isNull(n.parent_task_id),drizzleOrm.isNull(n.caller_agent_id),drizzleOrm.or(drizzleOrm.isNull(n.platform),drizzleOrm.ne(n.platform,"workflow")),drizzleOrm.or(drizzleOrm.isNull(n.metadata),drizzleOrm.and(drizzleOrm.notLike(n.metadata,'%"kind":"workflow_card"%'),drizzleOrm.notLike(n.metadata,'%"kind":"workflow_ui_instance"%'))),drizzleOrm.or(drizzleOrm.isNull(n.metadata),drizzleOrm.notLike(n.metadata,'%"retriedFromTaskId"%'))];t.workspaceId&&i.push(drizzleOrm.eq(n.workspace_id,t.workspaceId)),t.from&&i.push(drizzleOrm.gte(n.started_at,t.from)),t.to&&i.push(drizzleOrm.lt(n.started_at,t.to));let a=e.db.select({id:n.id,agent_id:n.agent_id,status:n.status,prompt:n.prompt,started_at:n.started_at,completed_at:n.completed_at,thread_id:n.thread_id}).from(n).where(drizzleOrm.and(...i)).orderBy(drizzleOrm.asc(n.started_at),drizzleOrm.asc(n.id)).all(),d=new Map;for(let c of a){if(!c.thread_id)continue;let l={id:c.id,agentId:c.agent_id,status:c.status,prompt:c.prompt,startedAt:c.started_at,completedAt:c.completed_at},g=d.get(c.thread_id);g?g.push(l):d.set(c.thread_id,[l]);}let u=[];for(let[c,l]of d){let g=l.filter(f=>f.agentId===t.targetAgentId).length;g<2||u.push({threadId:c,targetAgentTurnCount:g,turns:l});}return u.sort((c,l)=>{let g=c.turns[c.turns.length-1].startedAt,f=l.turns[l.turns.length-1].startedAt;return g<f?1:g>f?-1:0}),u.slice(0,s).map(c=>({threadId:c.threadId,targetAgentTurnCount:c.targetAgentTurnCount,turns:c.turns.slice(-o)}))}catch(s){throw new _("DB_ERROR","Failed to find thread chains",s)}finally{e.close();}}};var Ft=class extends nt{name="sqlite-tracing";unsubs=[];dbPath;version;constructor(t){super(),this.dbPath=V.join(t?.dbRoot??Ce.homedir(),".crewx","crewx.db"),this.version=t?.version??"unknown";}attach(t){let e=new Lt({dbPath:this.dbPath}),s=process.cwd(),i=fs.existsSync(V.join(s,"crewx.yaml"))||fs.existsSync(V.join(s,"crewx.yml"))?Yt(s):null,a=process.argv.join(" ");this.unsubs.push(t.on("task:start",d=>{try{let u=d.callerAgentId??null,c=d.parentTaskId??null,l=d.rootTraceId??d.traceId,g=d.metadata?JSON.stringify(d.metadata):JSON.stringify({provider:d.provider??"cli/claude"});e.startTask({id:d.traceId,agentId:d.agentRef.replace(/^@/,""),prompt:d.message,mode:d.mode,status:"running",pid:d.pid??null,startedAt:d.timestamp.toISOString(),crewxVersion:this.version,platform:d.platform??"cli",model:d.model??null,renderedPrompt:d.renderedPrompt??null,command:a,codingAgentCommand:d.codingAgentCommand??null,workspaceId:d.workspaceId??i,projectId:d.projectId??null,callerAgentId:u,parentTaskId:c,traceId:l,metadata:g,threadId:d.threadId??null});}catch{}}),t.on("task:output",d=>{try{e.appendLog(d.traceId,{timestamp:d.timestamp.toISOString(),level:d.level??"stdout",message:d.output});}catch{}}),t.on("task:end",d=>{try{let u=typeof d.metadata?.runEpoch=="number"?d.metadata.runEpoch:null,c=d.error?JSON.stringify({code:d.error.code,message:d.error.message,...d.error.providerCode?{providerCode:d.error.providerCode}:{}}):null;e.finishTask({id:d.traceId,status:d.error?"failed":"success",result:d.result??null,error:c,completedAt:d.timestamp.toISOString(),durationMs:d.durationMs,exitCode:d.exitCode??null,inputTokens:d.inputTokens??0,outputTokens:d.outputTokens??0,cachedInputTokens:d.cachedInputTokens??0,costUsd:d.costUsd??0,model:d.model??null,runEpoch:u});}catch{}}));}detach(t){this.unsubs.forEach(e=>e()),this.unsubs=[];}};var Dt=class extends st{dbPath;constructor(t={}){super(),t.dbPath?this.dbPath=t.dbPath:t.dbRoot&&(this.dbPath=V.join(t.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(t){let e=this.resolveDbPath();if(t){let o=V.dirname(e);fs.existsSync(o)||fs.mkdirSync(o,{recursive:true});}else if(!fs.existsSync(e))throw new _("NOT_FOUND","Database not found");let s=R(e);if(t)try{_t(s.db,e);}catch(o){throw s.close(),o}return s}validateWorkspaceId(t,e){return t.db.select({id:pt.id}).from(pt).where(drizzleOrm.eq(pt.id,e)).limit(1).get()?e:null}topLevelTaskPredicateSql(t="child"){return drizzleOrm.sql.raw(`NOT EXISTS (
272
279
  SELECT 1 FROM tasks parent
273
280
  WHERE parent.id = ${t}.parent_task_id
274
281
  AND parent.thread_id = ${t}.thread_id
275
- )`)}findAllThreads(t){let n=this.resolveDbPaths(),s=new Set,r=[];for(let i of n){if(!fs.existsSync(i))continue;let a=R(i);try{let d=t?drizzleOrm.eq(_.workspace_id,t):void 0,u=a.db.select().from(_).where(d).orderBy(drizzleOrm.desc(_.updated_at)).all();for(let c of u)s.has(c.id)||(s.add(c.id),r.push(c));}catch(d){throw new p("DB_ERROR","Failed to find all threads",d)}finally{a.close();}}return r}findThreadsByIdsOrTitles(t,n){if(t.length===0)return [];let s=this.resolveDbPaths(),r=new Set,i=[];for(let a of s){if(!fs.existsSync(a))continue;let d=R(a);try{let u=drizzleOrm.or(drizzleOrm.inArray(_.id,t),drizzleOrm.inArray(_.title,t)),c=n?drizzleOrm.and(u,drizzleOrm.eq(_.workspace_id,n)):u,l=d.db.select().from(_).where(c).orderBy(drizzleOrm.desc(_.updated_at)).all();for(let h of l)r.has(h.id)||(r.add(h.id),i.push(h));}catch(u){throw new p("DB_ERROR","Failed to find threads by ids or titles",u)}finally{d.close();}}return i}findThreadById(t,n){let s=this.resolveDbPaths();for(let r of s){if(!fs.existsSync(r))continue;let i=R(r);try{let a=drizzleOrm.eq(_.id,t),d=n?drizzleOrm.and(a,drizzleOrm.eq(_.workspace_id,n)):a,u=i.db.select().from(_).where(d).limit(1).get()??void 0;if(u)return u}catch(a){throw new p("DB_ERROR","Failed to find thread by id",a)}finally{i.close();}}}threadExists(t,n){let s=this.resolveDbPaths();for(let r of s){if(!fs.existsSync(r))continue;let i=R(r);try{let a=drizzleOrm.eq(_.id,t),d=n?drizzleOrm.and(a,drizzleOrm.eq(_.workspace_id,n)):a;if(i.db.select({id:_.id}).from(_).where(d).limit(1).get())return !0}catch(a){throw new p("DB_ERROR","Failed to check thread existence",a)}finally{i.close();}}return false}aggregateTaskStats(t,n){let s=this.resolveDbPaths(),r=0,i=0,a=0,d=0,u=0,c=new Set;for(let l of s){if(!fs.existsSync(l))continue;let h=R(l);try{let m=h.db.get(drizzleOrm.sql`
282
+ )`)}findAllThreads(t){let e=this.resolveDbPaths(),s=new Set,o=[];for(let i of e){if(!fs.existsSync(i))continue;let a=R(i);try{let d=t?drizzleOrm.eq(p.workspace_id,t):void 0,u=a.db.select().from(p).where(d).orderBy(drizzleOrm.desc(p.updated_at)).all();for(let c of u)s.has(c.id)||(s.add(c.id),o.push(c));}catch(d){throw new _("DB_ERROR","Failed to find all threads",d)}finally{a.close();}}return o}findThreadsByIdsOrTitles(t,e){if(t.length===0)return [];let s=this.resolveDbPaths(),o=new Set,i=[];for(let a of s){if(!fs.existsSync(a))continue;let d=R(a);try{let u=drizzleOrm.or(drizzleOrm.inArray(p.id,t),drizzleOrm.inArray(p.title,t)),c=e?drizzleOrm.and(u,drizzleOrm.eq(p.workspace_id,e)):u,l=d.db.select().from(p).where(c).orderBy(drizzleOrm.desc(p.updated_at)).all();for(let g of l)o.has(g.id)||(o.add(g.id),i.push(g));}catch(u){throw new _("DB_ERROR","Failed to find threads by ids or titles",u)}finally{d.close();}}return i}findThreadById(t,e){let s=this.resolveDbPaths();for(let o of s){if(!fs.existsSync(o))continue;let i=R(o);try{let a=drizzleOrm.eq(p.id,t),d=e?drizzleOrm.and(a,drizzleOrm.eq(p.workspace_id,e)):a,u=i.db.select().from(p).where(d).limit(1).get()??void 0;if(u)return u}catch(a){throw new _("DB_ERROR","Failed to find thread by id",a)}finally{i.close();}}}threadExists(t,e){let s=this.resolveDbPaths();for(let o of s){if(!fs.existsSync(o))continue;let i=R(o);try{let a=drizzleOrm.eq(p.id,t),d=e?drizzleOrm.and(a,drizzleOrm.eq(p.workspace_id,e)):a;if(i.db.select({id:p.id}).from(p).where(d).limit(1).get())return !0}catch(a){throw new _("DB_ERROR","Failed to check thread existence",a)}finally{i.close();}}return false}aggregateTaskStats(t,e){let s=this.resolveDbPaths(),o=0,i=0,a=0,d=0,u=0,c=new Set;for(let l of s){if(!fs.existsSync(l))continue;let g=R(l);try{let f=g.db.get(drizzleOrm.sql`
276
283
  SELECT
277
284
  count(*) AS cnt,
278
285
  COALESCE(SUM(child.input_tokens), 0) AS total_input,
@@ -282,21 +289,21 @@ ${s.join(`
282
289
  FROM tasks child
283
290
  WHERE child.thread_id = ${t}
284
291
  AND ${this.topLevelTaskPredicateSql()}
285
- ${n?drizzleOrm.sql`AND child.workspace_id = ${n}`:drizzleOrm.sql``}
286
- `);m&&(r+=m.cnt,i+=m.total_input,a+=m.total_output,d+=m.total_cached,u+=m.total_cost);let k=h.db.all(drizzleOrm.sql`
292
+ ${e?drizzleOrm.sql`AND child.workspace_id = ${e}`:drizzleOrm.sql``}
293
+ `);f&&(o+=f.cnt,i+=f.total_input,a+=f.total_output,d+=f.total_cached,u+=f.total_cost);let k=g.db.all(drizzleOrm.sql`
287
294
  SELECT DISTINCT child.agent_id FROM tasks child
288
295
  WHERE child.thread_id = ${t}
289
296
  AND child.agent_id IS NOT NULL AND child.agent_id != ''
290
297
  AND ${this.topLevelTaskPredicateSql()}
291
- ${n?drizzleOrm.sql`AND child.workspace_id = ${n}`:drizzleOrm.sql``}
292
- `);for(let D of k)c.add(D.agent_id);}catch(m){throw new p("DB_ERROR","Failed to aggregate task stats",m)}finally{h.close();}}return {taskCount:r,inputTokens:i,outputTokens:a,cachedInputTokens:d,costUsd:u,agentIds:Array.from(c)}}findTopLevelTasks(t,n,s){let r=this.resolveDbPaths(),i=new Set,a=[];for(let d of r){if(!fs.existsSync(d))continue;let u=R(d);try{let c;s!==void 0?c=u.db.all(drizzleOrm.sql`
298
+ ${e?drizzleOrm.sql`AND child.workspace_id = ${e}`:drizzleOrm.sql``}
299
+ `);for(let D of k)c.add(D.agent_id);}catch(f){throw new _("DB_ERROR","Failed to aggregate task stats",f)}finally{g.close();}}return {taskCount:o,inputTokens:i,outputTokens:a,cachedInputTokens:d,costUsd:u,agentIds:Array.from(c)}}findTopLevelTasks(t,e,s){let o=this.resolveDbPaths(),i=new Set,a=[];for(let d of o){if(!fs.existsSync(d))continue;let u=R(d);try{let c;s!==void 0?c=u.db.all(drizzleOrm.sql`
293
300
  SELECT * FROM (
294
301
  SELECT child.*,
295
302
  ROW_NUMBER() OVER (PARTITION BY child.agent_id ORDER BY child.started_at DESC) AS rn
296
303
  FROM tasks child
297
304
  WHERE child.thread_id = ${t}
298
305
  AND ${this.topLevelTaskPredicateSql()}
299
- ${n?drizzleOrm.sql`AND child.workspace_id = ${n}`:drizzleOrm.sql``}
306
+ ${e?drizzleOrm.sql`AND child.workspace_id = ${e}`:drizzleOrm.sql``}
300
307
  ) ranked
301
308
  WHERE rn <= ${s}
302
309
  ORDER BY started_at ASC
@@ -304,9 +311,9 @@ ${s.join(`
304
311
  SELECT child.* FROM tasks child
305
312
  WHERE child.thread_id = ${t}
306
313
  AND ${this.topLevelTaskPredicateSql()}
307
- ${n?drizzleOrm.sql`AND child.workspace_id = ${n}`:drizzleOrm.sql``}
314
+ ${e?drizzleOrm.sql`AND child.workspace_id = ${e}`:drizzleOrm.sql``}
308
315
  ORDER BY child.started_at ASC
309
- `);for(let l of c)i.has(l.id)||(i.add(l.id),a.push(l));}catch(c){throw new p("DB_ERROR","Failed to find top-level tasks",c)}finally{u.close();}}if(s!==void 0&&r.length>1){let d=new Map;for(let u of a){let c=u.agent_id??"";d.has(c)||d.set(c,[]),d.get(c).push(u);}a=[];for(let u of d.values())u.sort((c,l)=>(l.started_at??"").localeCompare(c.started_at??"")),a.push(...u.slice(0,s));a.sort((u,c)=>(u.started_at??"").localeCompare(c.started_at??""));}return a}findAllTasks(t,n){let s=this.resolveDbPaths(),r=new Set,i=[];for(let a of s){if(!fs.existsSync(a))continue;let d=R(a);try{let u=drizzleOrm.eq(e.thread_id,t),c=n?drizzleOrm.and(u,drizzleOrm.eq(e.workspace_id,n)):u,l=d.db.select().from(e).where(c).orderBy(drizzleOrm.asc(e.started_at)).all();for(let h of l)r.has(h.id)||(r.add(h.id),i.push(h));}catch(u){throw new p("DB_ERROR","Failed to find all tasks for thread",u)}finally{d.close();}}return i}findTaskById(t,n,s){let r=this.resolveDbPaths();for(let i of r){if(!fs.existsSync(i))continue;let a=R(i);try{let d=drizzleOrm.and(drizzleOrm.eq(e.id,n),drizzleOrm.eq(e.thread_id,t)),u=s?drizzleOrm.and(d,drizzleOrm.eq(e.workspace_id,s)):d,c=a.db.select().from(e).where(u).limit(1).get();if(!c)continue;let l=a.db.select().from(e).where(drizzleOrm.eq(e.parent_task_id,c.id)).orderBy(drizzleOrm.asc(e.started_at)).all();return {task:c,children:l}}catch(d){throw new p("DB_ERROR","Failed to find task by id",d)}finally{a.close();}}}batchFetchTasksQuery(t,n){return drizzleOrm.sql`
316
+ `);for(let l of c)i.has(l.id)||(i.add(l.id),a.push(l));}catch(c){throw new _("DB_ERROR","Failed to find top-level tasks",c)}finally{u.close();}}if(s!==void 0&&o.length>1){let d=new Map;for(let u of a){let c=u.agent_id??"";d.has(c)||d.set(c,[]),d.get(c).push(u);}a=[];for(let u of d.values())u.sort((c,l)=>(l.started_at??"").localeCompare(c.started_at??"")),a.push(...u.slice(0,s));a.sort((u,c)=>(u.started_at??"").localeCompare(c.started_at??""));}return a}findAllTasks(t,e){let s=this.resolveDbPaths(),o=new Set,i=[];for(let a of s){if(!fs.existsSync(a))continue;let d=R(a);try{let u=drizzleOrm.eq(n.thread_id,t),c=e?drizzleOrm.and(u,drizzleOrm.eq(n.workspace_id,e)):u,l=d.db.select().from(n).where(c).orderBy(drizzleOrm.asc(n.started_at)).all();for(let g of l)o.has(g.id)||(o.add(g.id),i.push(g));}catch(u){throw new _("DB_ERROR","Failed to find all tasks for thread",u)}finally{d.close();}}return i}findTaskById(t,e,s){let o=this.resolveDbPaths();for(let i of o){if(!fs.existsSync(i))continue;let a=R(i);try{let d=drizzleOrm.and(drizzleOrm.eq(n.id,e),drizzleOrm.eq(n.thread_id,t)),u=s?drizzleOrm.and(d,drizzleOrm.eq(n.workspace_id,s)):d,c=a.db.select().from(n).where(u).limit(1).get();if(!c)continue;let l=a.db.select().from(n).where(drizzleOrm.eq(n.parent_task_id,c.id)).orderBy(drizzleOrm.asc(n.started_at)).all();return {task:c,children:l}}catch(d){throw new _("DB_ERROR","Failed to find task by id",d)}finally{a.close();}}}batchFetchTasksQuery(t,e){return drizzleOrm.sql`
310
317
  SELECT child.id, child.thread_id, child.agent_id, child.status,
311
318
  child.parent_task_id, child.started_at, child.completed_at,
312
319
  child.duration_ms, child.input_tokens, child.output_tokens,
@@ -314,18 +321,18 @@ ${s.join(`
314
321
  FROM tasks child INDEXED BY idx_tasks_thread_id
315
322
  WHERE child.thread_id IN (${drizzleOrm.sql.join(t.map(s=>drizzleOrm.sql`${s}`),drizzleOrm.sql`, `)})
316
323
  AND ${this.topLevelTaskPredicateSql()}
317
- ${n?drizzleOrm.sql`AND child.workspace_id = ${n}`:drizzleOrm.sql``}
324
+ ${e?drizzleOrm.sql`AND child.workspace_id = ${e}`:drizzleOrm.sql``}
318
325
  ORDER BY child.started_at ASC
319
- `}batchFetchTasks(t,n){let s=new Map;if(t.length===0)return s;let r=this.resolveDbPaths();for(let i of r){if(!fs.existsSync(i))continue;let a=R(i);try{let d=a.db.all(this.batchFetchTasksQuery(t,n));for(let u of d){let c=u.thread_id;s.has(c)||s.set(c,[]),s.get(c).push(u);}}catch(d){throw new p("DB_ERROR","Failed to batch fetch tasks",d)}finally{a.close();}}return s}explainBatchFetchTasksPlan(t,n){let s=this.resolveDbPaths();for(let r of s){if(!fs.existsSync(r))continue;let i=R(r);try{return i.db.all(drizzleOrm.sql`EXPLAIN QUERY PLAN ${this.batchFetchTasksQuery(t,n)}`).map(d=>d.detail)}finally{i.close();}}return []}updateThreadTitle(t,n,s){if(!this.dbExists())return;let r=this.openHandle(true);try{let i=drizzleOrm.eq(_.id,t),a=s?drizzleOrm.and(i,drizzleOrm.eq(_.workspace_id,s)):i;if(!r.db.select({id:_.id}).from(_).where(a).limit(1).get())return;r.db.update(_).set({title:n,title_locked:1,updated_at:new Date().toISOString()}).where(drizzleOrm.eq(_.id,t)).run();}catch(i){throw i instanceof p?i:new p("DB_ERROR","Failed to update thread title",i)}finally{r.close();}}upsertThread(t,n){let s=this.openHandle(true);try{let r=n.workspaceId?this.validateWorkspaceId(s,n.workspaceId):null,i=new Date().toISOString();if(s.db.select({id:_.id,message_count:_.message_count}).from(_).where(drizzleOrm.eq(_.id,t)).limit(1).get()){let d={updated_at:i};n.title!==void 0&&(d.title=n.title),n.titleLocked!==void 0&&(d.title_locked=n.titleLocked?1:0),s.db.update(_).set(d).where(drizzleOrm.eq(_.id,t)).run();}else s.db.insert(_).values({id:t,platform:n.platform,workspace_id:r,title:n.title??null,title_locked:n.titleLocked?1:0,message_count:0,created_at:i,updated_at:i}).run();}catch(r){throw r instanceof p?r:new p("DB_ERROR","Failed to upsert thread",r)}finally{s.close();}}ensureThread(t,n,s){let r=this.openHandle(true);try{let i=s?this.validateWorkspaceId(r,s):null,a=r.db.select({id:_.id,platform:_.platform,workspace_id:_.workspace_id}).from(_).where(drizzleOrm.eq(_.id,t)).limit(1).get();if(a){i&&!a.workspace_id&&r.db.update(_).set({workspace_id:i}).where(drizzleOrm.eq(_.id,t)).run();return}let d=new Date().toISOString();r.db.insert(_).values({id:t,platform:n,workspace_id:i,message_count:0,created_at:d,updated_at:d}).run();}catch(i){throw i instanceof p?i:new p("DB_ERROR","Failed to ensure thread",i)}finally{r.close();}}saveUserMessage(t,n,s){if(!this.dbExists())return {firstMessage:false};let r=this.openHandle(true);try{let i=new Date().toISOString();return {firstMessage:r.db.transaction(d=>{let c=d.select({message_count:_.message_count}).from(_).where(drizzleOrm.eq(_.id,t)).limit(1).get()?.message_count===0;return d.run(drizzleOrm.sql`
326
+ `}batchFetchTasks(t,e){let s=new Map;if(t.length===0)return s;let o=this.resolveDbPaths();for(let i of o){if(!fs.existsSync(i))continue;let a=R(i);try{let d=a.db.all(this.batchFetchTasksQuery(t,e));for(let u of d){let c=u.thread_id;s.has(c)||s.set(c,[]),s.get(c).push(u);}}catch(d){throw new _("DB_ERROR","Failed to batch fetch tasks",d)}finally{a.close();}}return s}explainBatchFetchTasksPlan(t,e){let s=this.resolveDbPaths();for(let o of s){if(!fs.existsSync(o))continue;let i=R(o);try{return i.db.all(drizzleOrm.sql`EXPLAIN QUERY PLAN ${this.batchFetchTasksQuery(t,e)}`).map(d=>d.detail)}finally{i.close();}}return []}updateThreadTitle(t,e,s){if(!this.dbExists())return;let o=this.openHandle(true);try{let i=drizzleOrm.eq(p.id,t),a=s?drizzleOrm.and(i,drizzleOrm.eq(p.workspace_id,s)):i;if(!o.db.select({id:p.id}).from(p).where(a).limit(1).get())return;o.db.update(p).set({title:e,title_locked:1,updated_at:new Date().toISOString()}).where(drizzleOrm.eq(p.id,t)).run();}catch(i){throw i instanceof _?i:new _("DB_ERROR","Failed to update thread title",i)}finally{o.close();}}upsertThread(t,e){let s=this.openHandle(true);try{let o=e.workspaceId?this.validateWorkspaceId(s,e.workspaceId):null,i=new Date().toISOString();if(s.db.select({id:p.id,message_count:p.message_count}).from(p).where(drizzleOrm.eq(p.id,t)).limit(1).get()){let d={updated_at:i};e.title!==void 0&&(d.title=e.title),e.titleLocked!==void 0&&(d.title_locked=e.titleLocked?1:0),s.db.update(p).set(d).where(drizzleOrm.eq(p.id,t)).run();}else s.db.insert(p).values({id:t,platform:e.platform,workspace_id:o,title:e.title??null,title_locked:e.titleLocked?1:0,message_count:0,created_at:i,updated_at:i}).run();}catch(o){throw o instanceof _?o:new _("DB_ERROR","Failed to upsert thread",o)}finally{s.close();}}ensureThread(t,e,s){let o=this.openHandle(true);try{let i=s?this.validateWorkspaceId(o,s):null,a=o.db.select({id:p.id,platform:p.platform,workspace_id:p.workspace_id}).from(p).where(drizzleOrm.eq(p.id,t)).limit(1).get();if(a){i&&!a.workspace_id&&o.db.update(p).set({workspace_id:i}).where(drizzleOrm.eq(p.id,t)).run();return}let d=new Date().toISOString();o.db.insert(p).values({id:t,platform:e,workspace_id:i,message_count:0,created_at:d,updated_at:d}).run();}catch(i){throw i instanceof _?i:new _("DB_ERROR","Failed to ensure thread",i)}finally{o.close();}}saveUserMessage(t,e,s){if(!this.dbExists())return {firstMessage:false};let o=this.openHandle(true);try{let i=new Date().toISOString();return {firstMessage:o.db.transaction(d=>{let c=d.select({message_count:p.message_count}).from(p).where(drizzleOrm.eq(p.id,t)).limit(1).get()?.message_count===0;return d.run(drizzleOrm.sql`
320
327
  UPDATE threads
321
- SET first_message = COALESCE(first_message, ${n}),
322
- title = CASE WHEN title_locked = 0 AND title IS NULL THEN substr(${n}, 1, 60) ELSE title END,
323
- last_message = ${n},
328
+ SET first_message = COALESCE(first_message, ${e}),
329
+ title = CASE WHEN title_locked = 0 AND title IS NULL THEN substr(${e}, 1, 60) ELSE title END,
330
+ last_message = ${e},
324
331
  message_count = message_count + 1,
325
332
  updated_at = ${i}
326
333
  WHERE id = ${t}
327
- `),c},{behavior:"immediate"})}}catch(i){throw i instanceof p?i:new p("DB_ERROR","Failed to save user message",i)}finally{r.close();}}saveAssistantMessage(t,n,s){if(!this.dbExists())return;let r=this.openHandle(true);try{let i=new Date().toISOString();r.db.update(_).set({last_message:n,updated_at:i}).where(drizzleOrm.eq(_.id,t)).run();}catch(i){throw i instanceof p?i:new p("DB_ERROR","Failed to save assistant message",i)}finally{r.close();}}updateThread(t,n){if(!this.dbExists())return;let s=this.openHandle(true);try{let r={updated_at:new Date().toISOString()};n.title!==void 0&&(r.title=n.title,r.title_locked=1),n.titleLocked!==void 0&&(r.title_locked=n.titleLocked?1:0),s.db.update(_).set(r).where(drizzleOrm.eq(_.id,t)).run();}catch(r){throw r instanceof p?r:new p("DB_ERROR","Failed to update thread",r)}finally{s.close();}}togglePin(t,n){let s=this.openHandle(true);try{let r=n?drizzleOrm.and(drizzleOrm.eq(_.id,t),drizzleOrm.eq(_.workspace_id,n)):drizzleOrm.eq(_.id,t),i=s.db.select({pinned:_.pinned,metadata:_.metadata}).from(_).where(r).get();if(!i)return null;let a=i.pinned?0:1,d=i.metadata?JSON.parse(i.metadata):{};if(a){let u=n?drizzleOrm.and(drizzleOrm.eq(_.pinned,1),drizzleOrm.eq(_.workspace_id,n)):drizzleOrm.eq(_.pinned,1),c=s.db.select({metadata:_.metadata}).from(_).where(u).all(),l=null;for(let h of c){let m=h.metadata?JSON.parse(h.metadata):{};typeof m.pinOrder=="number"&&(l===null||m.pinOrder<l)&&(l=m.pinOrder);}d.pinOrder=l===null?0:l-1;}else delete d.pinOrder;return s.db.update(_).set({pinned:a,metadata:Object.keys(d).length>0?JSON.stringify(d):null}).where(r).run(),{pinned:!!a}}catch(r){throw r instanceof p?r:new p("DB_ERROR","Failed to toggle pin",r)}finally{s.close();}}reorderPins(t,n){let s=this.openHandle(true);try{for(let r=0;r<t.length;r++){let i=n?drizzleOrm.and(drizzleOrm.eq(_.id,t[r]),drizzleOrm.eq(_.workspace_id,n)):drizzleOrm.eq(_.id,t[r]),a=s.db.select({metadata:_.metadata}).from(_).where(i).get();if(!a)continue;let d=a.metadata?JSON.parse(a.metadata):{};d.pinOrder=r+1,s.db.update(_).set({metadata:JSON.stringify(d)}).where(i).run();}}catch(r){throw r instanceof p?r:new p("DB_ERROR","Failed to reorder pins",r)}finally{s.close();}}toggleStar(t,n){let s=this.openHandle(true);try{let r=n?drizzleOrm.and(drizzleOrm.eq(_.id,t),drizzleOrm.eq(_.workspace_id,n)):drizzleOrm.eq(_.id,t),i=s.db.select({starred:_.starred}).from(_).where(r).get();if(!i)return null;let a=i.starred?0:1;return s.db.update(_).set({starred:a}).where(r).run(),{starred:!!a}}catch(r){throw r instanceof p?r:new p("DB_ERROR","Failed to toggle star",r)}finally{s.close();}}resolveOverdriveForRequest(t,n,s,r){let a=this.openHandle(true);try{let d=n?drizzleOrm.and(drizzleOrm.eq(_.id,t),drizzleOrm.eq(_.workspace_id,n)):drizzleOrm.eq(_.id,t);return a.db.transaction(c=>{let l=c.select({metadata:_.metadata}).from(_).where(d).get();if(!l)return null;let h=l.metadata?JSON.parse(l.metadata):{},m=h.overdrive??{},k=r?.defaultTurns??m.defaultTurns??3,D=r?.updatedBy??"ui",O=new Date().toISOString(),U,F,X,_t;switch(s){case "enable-count":{let pt=r?.turns??k,ht=r?.consumeCurrent?Math.max(pt-1,0):pt;U=ht>0?"count":"off",F=ht,X=!0,_t="count";break}case "enable-latch":{U="latch",F=0,X=!0,_t="latch";break}case "disable":{U="off",F=0,X=!1;break}default:{let pt=m.state??"off",ht=typeof m.remaining=="number"?m.remaining:0;if(pt==="count"&&ht>0){let Ht=ht-1;Ht<=0?(U="off",F=0):(U="count",F=Ht),X=!0,_t="count";}else pt==="latch"?(U="latch",F=0,X=!0,_t="latch"):(U="off",F=0,X=!1);break}}return h.overdrive={state:U,remaining:F,defaultTurns:k,updatedAt:O,updatedBy:D},c.update(_).set({metadata:JSON.stringify(h),updated_at:O}).where(d).run(),{applied:X,appliedMode:_t,state:U,remaining:F}},{behavior:"immediate"})}catch(d){throw d instanceof p?d:new p("DB_ERROR","Failed to resolve overdrive",d)}finally{a.close();}}};function mn(o){return o.replace(/<conversation_history[^>]*>[\s\S]*?<\/conversation_history>/g,"").split(`
328
- `).filter(r=>!(r.startsWith("Loaded ")&&r.includes("layouts from")||r.includes("[dotenv@")||r.includes("[Nest]")&&r.includes("DEBUG")||r.startsWith("Registered custom layout:")||r.startsWith("Updated custom layout:"))).join(`
329
- `).trim()}function kn(o){if(!o)return "";let t=o;try{let n=JSON.parse(t);Array.isArray(n)?t=n.filter(s=>s?.type==="text"&&s?.text).map(s=>s.text).join(`
330
- `):n&&typeof n=="object"&&n.result!==void 0&&(t=n.result||"");}catch{t=mn(t);}return t}var Ct=class{dbPath;constructor(t){this.dbPath=t??Y.join(we.homedir(),".crewx","crewx.db");}getThreadRepo(){return new bt({dbPath:this.dbPath})}updateThread(t,n){this.getThreadRepo().updateThread(t,{title:n.title});}async ensureThread(t,n,s){let r=this.getThreadRepo(),i=r.findThreadById(t);if(i){if(i.platform!==n)throw new Error(`Thread '${t}' already exists with platform '${i.platform}' \u2014 cannot change to '${n}' (platform is immutable)`);return {created:false}}return r.ensureThread(t,n,s),{created:true}}async fetchHistory(t,n){let s=n?.limit??100,r=this.getThreadRepo(),i=r.findThreadById(t),a=r.findTopLevelTasks(t,void 0,s),d=new Set(["queued","cancelled"]);a=a.filter(l=>(!l.status||!d.has(l.status))&&(!n?.currentTraceId||l.trace_id!==n.currentTraceId));let u=i?.platform??"cli",c=this.rowsToMessages(a);return {threadId:t,platform:u,messages:c,metadata:{title:i?.title??void 0,firstMessage:i?.first_message??void 0,lastMessage:i?.last_message??void 0,messageCount:i?.message_count??0,updatedAt:i?.updated_at?new Date(i.updated_at).getTime():void 0}}}async saveUserMessage(t,n,s,r){let{firstMessage:i}=this.getThreadRepo().saveUserMessage(t,n);return {id:t,firstMessage:i}}async saveAssistantMessage(t,n,s,r){return this.getThreadRepo().saveAssistantMessage(t,n),{id:t}}close(){}normalizeStatus(t){if(t&&!["success","completed","done"].includes(t)){if(["failed","error"].includes(t))return "failed";if(t==="running")return "running"}}rowsToMessages(t){let n=[];for(let s of t){s.prompt&&n.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 r=kn(s.result),i=this.normalizeStatus(s.status);if(r||i==="running"||i==="failed"){let a={agent_id:s.agent_id,task_id:s.id};i&&(a.status=i),i==="failed"&&s.error&&(a.reason=s.error.split(`
331
- `)[0].slice(0,200)),n.push({id:`${s.id}-assistant`,text:r,isAssistant:true,timestamp:new Date(s.started_at).getTime(),metadata:a});}}return n}};var Bt=class extends tt{name="conversation";_provider;unsubStart=null;unsubEnd=null;constructor(t){super(),this._provider=new Ct(t?.dbPath);}get conversationProvider(){return this._provider}async afterUserMessage(t,n,s,r){}async afterAssistantMessage(t,n,s){}attach(t){this.unsubStart=t.on("task:start",async n=>{if(!n.threadId)return;let s=n.platform??"cli";try{let r=await this._provider.ensureThread(n.threadId,s,n.workspaceId),i=await this._provider.saveUserMessage(n.threadId,n.message??"");await this.afterUserMessage(n.threadId,i.id,r.created||i.firstMessage,n);}catch{}}),this.unsubEnd=t.on("task:end",async n=>{if(!n.result)return;let s=n.metadata?.threadId;if(!s)return;let r=n.agentRef?.replace(/^@/,"")??"";try{let{id:i}=await this._provider.saveAssistantMessage(s,n.result,r);await this.afterAssistantMessage(s,i,n);}catch{}});}detach(t){this.unsubStart?.(),this.unsubStart=null,this.unsubEnd?.(),this.unsubEnd=null,this._provider.close?.();}};exports.ConversationPlugin=Bt;exports.FileLoggerPlugin=$t;exports.SqliteTracingPlugin=Ut;
334
+ `),c},{behavior:"immediate"})}}catch(i){throw i instanceof _?i:new _("DB_ERROR","Failed to save user message",i)}finally{o.close();}}saveAssistantMessage(t,e,s){if(!this.dbExists())return;let o=this.openHandle(true);try{let i=new Date().toISOString();o.db.update(p).set({last_message:e,updated_at:i}).where(drizzleOrm.eq(p.id,t)).run();}catch(i){throw i instanceof _?i:new _("DB_ERROR","Failed to save assistant message",i)}finally{o.close();}}updateThread(t,e){if(!this.dbExists())return;let s=this.openHandle(true);try{let o={updated_at:new Date().toISOString()};e.title!==void 0&&(o.title=e.title,o.title_locked=1),e.titleLocked!==void 0&&(o.title_locked=e.titleLocked?1:0),s.db.update(p).set(o).where(drizzleOrm.eq(p.id,t)).run();}catch(o){throw o instanceof _?o:new _("DB_ERROR","Failed to update thread",o)}finally{s.close();}}togglePin(t,e){let s=this.openHandle(true);try{let o=e?drizzleOrm.and(drizzleOrm.eq(p.id,t),drizzleOrm.eq(p.workspace_id,e)):drizzleOrm.eq(p.id,t),i=s.db.select({pinned:p.pinned,metadata:p.metadata}).from(p).where(o).get();if(!i)return null;let a=i.pinned?0:1,d=i.metadata?JSON.parse(i.metadata):{};if(a){let u=e?drizzleOrm.and(drizzleOrm.eq(p.pinned,1),drizzleOrm.eq(p.workspace_id,e)):drizzleOrm.eq(p.pinned,1),c=s.db.select({metadata:p.metadata}).from(p).where(u).all(),l=null;for(let g of c){let f=g.metadata?JSON.parse(g.metadata):{};typeof f.pinOrder=="number"&&(l===null||f.pinOrder<l)&&(l=f.pinOrder);}d.pinOrder=l===null?0:l-1;}else delete d.pinOrder;return s.db.update(p).set({pinned:a,metadata:Object.keys(d).length>0?JSON.stringify(d):null}).where(o).run(),{pinned:!!a}}catch(o){throw o instanceof _?o:new _("DB_ERROR","Failed to toggle pin",o)}finally{s.close();}}reorderPins(t,e){let s=this.openHandle(true);try{for(let o=0;o<t.length;o++){let i=e?drizzleOrm.and(drizzleOrm.eq(p.id,t[o]),drizzleOrm.eq(p.workspace_id,e)):drizzleOrm.eq(p.id,t[o]),a=s.db.select({metadata:p.metadata}).from(p).where(i).get();if(!a)continue;let d=a.metadata?JSON.parse(a.metadata):{};d.pinOrder=o+1,s.db.update(p).set({metadata:JSON.stringify(d)}).where(i).run();}}catch(o){throw o instanceof _?o:new _("DB_ERROR","Failed to reorder pins",o)}finally{s.close();}}toggleStar(t,e){let s=this.openHandle(true);try{let o=e?drizzleOrm.and(drizzleOrm.eq(p.id,t),drizzleOrm.eq(p.workspace_id,e)):drizzleOrm.eq(p.id,t),i=s.db.select({starred:p.starred}).from(p).where(o).get();if(!i)return null;let a=i.starred?0:1;return s.db.update(p).set({starred:a}).where(o).run(),{starred:!!a}}catch(o){throw o instanceof _?o:new _("DB_ERROR","Failed to toggle star",o)}finally{s.close();}}resolveOverdriveForRequest(t,e,s,o){let a=this.openHandle(true);try{let d=e?drizzleOrm.and(drizzleOrm.eq(p.id,t),drizzleOrm.eq(p.workspace_id,e)):drizzleOrm.eq(p.id,t);return a.db.transaction(c=>{let l=c.select({metadata:p.metadata}).from(p).where(d).get();if(!l)return null;let g=l.metadata?JSON.parse(l.metadata):{},f=g.overdrive??{},k=o?.defaultTurns??f.defaultTurns??3,D=o?.updatedBy??"ui",$=new Date().toISOString(),U,F,Y,gt;switch(s){case "enable-count":{let ft=o?.turns??k,mt=o?.consumeCurrent?Math.max(ft-1,0):ft;U=mt>0?"count":"off",F=mt,Y=!0,gt="count";break}case "enable-latch":{U="latch",F=0,Y=!0,gt="latch";break}case "disable":{U="off",F=0,Y=!1;break}default:{let ft=f.state??"off",mt=typeof f.remaining=="number"?f.remaining:0;if(ft==="count"&&mt>0){let Wt=mt-1;Wt<=0?(U="off",F=0):(U="count",F=Wt),Y=!0,gt="count";}else ft==="latch"?(U="latch",F=0,Y=!0,gt="latch"):(U="off",F=0,Y=!1);break}}return g.overdrive={state:U,remaining:F,defaultTurns:k,updatedAt:$,updatedBy:D},c.update(p).set({metadata:JSON.stringify(g),updated_at:$}).where(d).run(),{applied:Y,appliedMode:gt,state:U,remaining:F}},{behavior:"immediate"})}catch(d){throw d instanceof _?d:new _("DB_ERROR","Failed to resolve overdrive",d)}finally{a.close();}}};function qn(r){return r.replace(/<conversation_history[^>]*>[\s\S]*?<\/conversation_history>/g,"").split(`
335
+ `).filter(o=>!(o.startsWith("Loaded ")&&o.includes("layouts from")||o.includes("[dotenv@")||o.includes("[Nest]")&&o.includes("DEBUG")||o.startsWith("Registered custom layout:")||o.startsWith("Updated custom layout:"))).join(`
336
+ `).trim()}function Bn(r){if(!r)return "";let t=r;try{let e=JSON.parse(t);Array.isArray(e)?t=e.filter(s=>s?.type==="text"&&s?.text).map(s=>s.text).join(`
337
+ `):e&&typeof e=="object"&&e.result!==void 0&&(t=e.result||"");}catch{t=qn(t);}return t}var $t=class{dbPath;constructor(t){this.dbPath=t??V.join(Ce.homedir(),".crewx","crewx.db");}getThreadRepo(){return new Dt({dbPath:this.dbPath})}updateThread(t,e){this.getThreadRepo().updateThread(t,{title:e.title});}async ensureThread(t,e,s){let o=this.getThreadRepo(),i=o.findThreadById(t);if(i){if(i.platform!==e)throw new Error(`Thread '${t}' already exists with platform '${i.platform}' \u2014 cannot change to '${e}' (platform is immutable)`);return {created:false}}return o.ensureThread(t,e,s),{created:true}}async fetchHistory(t,e){let s=e?.limit??100,o=this.getThreadRepo(),i=o.findThreadById(t),a=o.findTopLevelTasks(t,void 0,s),d=new Set(["queued","cancelled"]);a=a.filter(l=>(!l.status||!d.has(l.status))&&(!e?.currentTraceId||l.trace_id!==e.currentTraceId));let u=i?.platform??"cli",c=this.rowsToMessages(a);return {threadId:t,platform:u,messages:c,metadata:{title:i?.title??void 0,firstMessage:i?.first_message??void 0,lastMessage:i?.last_message??void 0,messageCount:i?.message_count??0,updatedAt:i?.updated_at?new Date(i.updated_at).getTime():void 0}}}async saveUserMessage(t,e,s,o){let{firstMessage:i}=this.getThreadRepo().saveUserMessage(t,e);return {id:t,firstMessage:i}}async saveAssistantMessage(t,e,s,o){return this.getThreadRepo().saveAssistantMessage(t,e),{id:t}}close(){}normalizeStatus(t){if(t&&!["success","completed","done"].includes(t)){if(["failed","error"].includes(t))return "failed";if(t==="running")return "running"}}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 o=Bn(s.result),i=this.normalizeStatus(s.status);if(o||i==="running"||i==="failed"){let a={agent_id:s.agent_id,task_id:s.id};i&&(a.status=i),i==="failed"&&s.error&&(a.reason=s.error.split(`
338
+ `)[0].slice(0,200)),e.push({id:`${s.id}-assistant`,text:o,isAssistant:true,timestamp:new Date(s.started_at).getTime(),metadata:a});}}return e}};var zt=class extends nt{name="conversation";_provider;unsubStart=null;unsubEnd=null;constructor(t){super(),this._provider=new $t(t?.dbPath);}get conversationProvider(){return this._provider}async afterUserMessage(t,e,s,o){}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 o=await this._provider.ensureThread(e.threadId,s,e.workspaceId),i=await this._provider.saveUserMessage(e.threadId,e.message??"");await this.afterUserMessage(e.threadId,i.id,o.created||i.firstMessage,e);}catch{}}),this.unsubEnd=t.on("task:end",async e=>{if(!e.result)return;let s=e.metadata?.threadId;if(!s)return;let o=e.agentRef?.replace(/^@/,"")??"";try{let{id:i}=await this._provider.saveAssistantMessage(s,e.result,o);await this.afterAssistantMessage(s,i,e);}catch{}});}detach(t){this.unsubStart?.(),this.unsubStart=null,this.unsubEnd?.(),this.unsubEnd=null,this._provider.close?.();}};exports.ConversationPlugin=zt;exports.FileLoggerPlugin=It;exports.SqliteTracingPlugin=Ft;