@crewx/sdk 0.9.0-rc.34 → 0.9.0-rc.35

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,19 +1,19 @@
1
- 'use strict';var fs=require('fs'),U=require('path'),Zt=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 U__namespace=/*#__PURE__*/_interopNamespace(U);var Zt__default=/*#__PURE__*/_interopDefault(Zt);var rt=(d=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(d,{get:(t,e)=>(typeof require<"u"?require:t)[e]}):d)(function(d){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+d+'" is not supported')});var F=class{detach(t){}};function Tt(d){let t=e=>String(e).padStart(2,"0");return `${d.getFullYear()}${t(d.getMonth()+1)}${t(d.getDate())}T${t(d.getHours())}${t(d.getMinutes())}${t(d.getSeconds())}`}var mt=class extends F{name="file-logger";unsubs=[];logFiles=new Map;logsDir;version;constructor(t){super(),this.logsDir=U.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 n=Tt(e.timestamp),r=U.join(this.logsDir,`${n}_${e.traceId}.log`);this.logFiles.set(e.traceId,r);let o=`=== TASK LOG: ${e.traceId} ===
1
+ 'use strict';var fs=require('fs'),B=require('path'),ee=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 B__namespace=/*#__PURE__*/_interopNamespace(B);var ee__default=/*#__PURE__*/_interopDefault(ee);var it=(d=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(d,{get:(t,e)=>(typeof require<"u"?require:t)[e]}):d)(function(d){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+d+'" is not supported')});var q=class{detach(t){}};function At(d){let t=e=>String(e).padStart(2,"0");return `${d.getFullYear()}${t(d.getMonth()+1)}${t(d.getDate())}T${t(d.getHours())}${t(d.getMinutes())}${t(d.getSeconds())}`}var kt=class extends q{name="file-logger";unsubs=[];logFiles=new Map;logsDir;version;constructor(t){super(),this.logsDir=B.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=At(e.timestamp),r=B.join(this.logsDir,`${s}_${e.traceId}.log`);this.logFiles.set(e.traceId,r);let o=`=== TASK LOG: ${e.traceId} ===
2
2
  CrewX Version: ${this.version}
3
3
  Mode: ${e.mode}
4
4
  Agent: ${e.agentRef}
5
5
  Started: ${e.timestamp.toLocaleString()}
6
6
  Message: ${e.message}
7
7
 
8
- `;fs.writeFileSync(r,o,{encoding:"utf8",mode:384});}catch{}}),t.on("task:output",e=>{try{let n=this.logFiles.get(e.traceId);if(!n)return;let r=new Date().toISOString();fs.appendFileSync(n,`[${r}] STDOUT: ${e.output}
9
- `,"utf8");}catch{}}),t.on("task:end",e=>{try{let n=this.logFiles.get(e.traceId);if(!n)return;let r=new Date().toLocaleString(),o=e.error?`failed: ${e.error.message}`:"completed successfully",i=`[${r}] INFO: Task ${o} in ${e.durationMs}ms
8
+ `;fs.writeFileSync(r,o,{encoding:"utf8",mode:384});}catch{}}),t.on("task:output",e=>{try{let s=this.logFiles.get(e.traceId);if(!s)return;let r=new Date().toISOString();fs.appendFileSync(s,`[${r}] STDOUT: ${e.output}
9
+ `,"utf8");}catch{}}),t.on("task:end",e=>{try{let s=this.logFiles.get(e.traceId);if(!s)return;let r=new Date().toLocaleString(),o=e.error?`failed: ${e.error.message}`:"completed successfully",a=`[${r}] INFO: Task ${o} in ${e.durationMs}ms
10
10
  [${r}] INFO: Process closed with exit code: ${e.error?1:0}
11
- `;fs.appendFileSync(n,i,"utf8"),this.logFiles.delete(e.traceId);}catch{}}));}detach(t){this.unsubs.forEach(e=>e()),this.unsubs=[],this.logFiles.clear();}};function Jt(d){let t=U__namespace.resolve(d);return process.platform==="win32"&&(t=t.replace(/\\/g,"/"),t=t.replace(/^([A-Z]):/,(e,n)=>`${n.toLowerCase()}:`)),t.length>1&&!/^[a-zA-Z]:\/$/.test(t)&&(t=t.replace(/\/+$/,"")),t}function Nt(d){let t=Jt(d);return crypto.createHash("sha256").update(t).digest("hex")}var V=class{resolveDbPath(){return process.env.CREWX_DB?process.env.CREWX_DB:process.env.CREWX_TRACES_DB?process.env.CREWX_TRACES_DB:U.join(Zt__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(d){let t=rt("better-sqlite3"),{drizzle:e}=rt("drizzle-orm/better-sqlite3"),n=new t(d);return n.exec("PRAGMA journal_mode = WAL"),n.exec("PRAGMA busy_timeout = 5000"),n.exec("PRAGMA foreign_keys = ON"),n.exec("PRAGMA analysis_limit = 400"),n.exec("PRAGMA optimize"),{db:e(n),runRaw:(r,o=[])=>n.prepare(r).run(...o),close:()=>n.close()}}var Ot=new Set,te={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 ft(d,t){return (d.get(`SELECT count(*) as cnt FROM sqlite_master WHERE type='table' AND name='${t}'`)?.cnt??0)>0}function ee(d,t){if(t>0||!ft(d,"tasks"))return;let e=d.all("PRAGMA table_info(tasks)"),n=new Set(e.map(r=>r.name));for(let[r,o]of Object.entries(te))n.has(r)||d.run(`ALTER TABLE tasks ADD COLUMN ${r} ${o}`);}var ne={"0002_normalize_task_names":{workspace_name:"TEXT",project_name:"TEXT"}};function se(d,t,e){if(!ft(d,"__drizzle_migrations")||!ft(d,"tasks"))return;let n=d.all(e`SELECT hash FROM __drizzle_migrations`),r=new Set(n.map(i=>i.hash)),o=JSON.parse(fs.readFileSync(U__namespace.default.join(t,"meta/_journal.json"),"utf-8"));for(let i of o.entries){let a=ne[i.tag];if(!a)continue;let c=U__namespace.default.join(t,`${i.tag}.sql`);if(!fs.existsSync(c))continue;let l=fs.readFileSync(c,"utf-8"),u=crypto.createHash("sha256").update(l).digest("hex");if(r.has(u))continue;let h=d.all("PRAGMA table_info(tasks)"),m=new Set(h.map(y=>y.name));for(let[y,A]of Object.entries(a))m.has(y)||(d.run(`ALTER TABLE tasks ADD COLUMN ${y} ${A}`),m.add(y));}}function re(d,t,e){let n=d.all(e`SELECT hash FROM __drizzle_migrations`),r=new Set(n.map(i=>i.hash)),o=JSON.parse(fs.readFileSync(U__namespace.default.join(t,"meta/_journal.json"),"utf-8"));for(let i of o.entries){let a=U__namespace.default.join(t,`${i.tag}.sql`);if(!fs.existsSync(a))continue;let c=fs.readFileSync(a,"utf-8"),l=crypto.createHash("sha256").update(c).digest("hex");if(r.has(l))continue;let u=/ALTER\s+TABLE\s+[`"]?(\w+)[`"]?\s+ADD\s+[`"]?(\w+)[`"]?/gi,h=[],m;for(;(m=u.exec(c))!==null;)h.push({table:m[1],column:m[2]});if(h.length===0||!c.split(/-->\s*statement-breakpoint/).map(C=>C.trim()).filter(Boolean).every(C=>/^ALTER\s+TABLE\s+.+\s+ADD\s+/i.test(C)))continue;h.every(({table:C,column:$})=>d.all(`PRAGMA table_info("${C}")`).some(M=>M.name===$))&&d.run(e`INSERT INTO __drizzle_migrations (hash, created_at) VALUES (${l}, ${i.when})`);}}function oe(d){let{migrate:t}=rt("drizzle-orm/better-sqlite3/migrator"),{sql:e}=rt("drizzle-orm"),n=[U__namespace.default.join(__dirname,"../migrations"),U__namespace.default.join(__dirname,"migrations"),U__namespace.default.join(__dirname,"../../../../drizzle/migrations"),U__namespace.default.join(process.cwd(),"drizzle/migrations")],r=n.find(l=>fs.existsSync(U__namespace.default.join(l,"meta/_journal.json")));if(!r)throw new Error(`migrations folder not found. Searched:
12
- ${n.join(`
13
- `)}`);let o=d.get(e`SELECT count(*) as cnt FROM sqlite_master WHERE type='table' AND name='__drizzle_migrations'`),i=0;o?.cnt&&(i=d.get(e`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0),ee(d,i),o?.cnt&&(re(d,r,e),se(d,r,e)),t(d,{migrationsFolder:r});let c=(d.get(e`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0)-i;if(c>0){let l=o?.cnt?"Database migrated":"Database initialized";console.error(`[crewx] ${l} (${c} migration${c>1?"s":""} applied).`);}}function it(d,t){Ot.has(t)||(oe(d),Ot.add(t));}var p=class extends Error{code;cause;constructor(t,e,n){super(e),this.name="RepositoryError",this.code=t,this.cause=n,Object.setPrototypeOf(this,new.target.prototype);}};var Q=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 s=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)},d=>({idx_tasks_agent_id:sqliteCore.index("idx_tasks_agent_id").on(d.agent_id),idx_tasks_status:sqliteCore.index("idx_tasks_status").on(d.status),idx_tasks_started_at:sqliteCore.index("idx_tasks_started_at").on(d.started_at),idx_tasks_trace_id:sqliteCore.index("idx_tasks_trace_id").on(d.trace_id),idx_tasks_parent_task_id:sqliteCore.index("idx_tasks_parent_task_id").on(d.parent_task_id),idx_tasks_crewx_version:sqliteCore.index("idx_tasks_crewx_version").on(d.crewx_version),idx_tasks_pid:sqliteCore.index("idx_tasks_pid").on(d.pid),idx_tasks_thread_id:sqliteCore.index("idx_tasks_thread_id").on(d.thread_id),idx_tasks_workspace_id:sqliteCore.index("idx_tasks_workspace_id").on(d.workspace_id),idx_tasks_workspace_ref:sqliteCore.index("idx_tasks_workspace_ref").on(d.workspace_ref),idx_tasks_project_id:sqliteCore.index("idx_tasks_project_id").on(d.project_id),idx_tasks_ws_started:sqliteCore.index("idx_tasks_ws_started").on(d.workspace_id,d.started_at)}));var _=sqliteCore.sqliteTable("threads",{id:sqliteCore.text("id").primaryKey(),workspace_id:sqliteCore.text("workspace_id").references(()=>Q.id,{onDelete:"set null"}),platform:sqliteCore.text("platform").notNull().default("cli"),title:sqliteCore.text("title"),first_message:sqliteCore.text("first_message"),last_message:sqliteCore.text("last_message"),message_count:sqliteCore.integer("message_count").notNull().default(0),created_at:sqliteCore.text("created_at").notNull(),updated_at:sqliteCore.text("updated_at").notNull(),metadata:sqliteCore.text("metadata"),title_locked:sqliteCore.integer("title_locked").notNull().default(0),pinned:sqliteCore.integer("pinned").notNull().default(0),starred:sqliteCore.integer("starred").notNull().default(0)},d=>({idx_threads_updated_at:sqliteCore.index("idx_threads_updated_at").on(d.updated_at),idx_threads_workspace_id:sqliteCore.index("idx_threads_workspace_id").on(d.workspace_id),idx_threads_ws_updated:sqliteCore.index("idx_threads_ws_updated").on(d.workspace_id,d.updated_at),idx_threads_title:sqliteCore.index("idx_threads_title").on(d.title)}));var pe=sqliteCore.sqliteTable("spans",{id:sqliteCore.text("id").primaryKey(),task_id:sqliteCore.text("task_id").references(()=>s.id,{onDelete:"set null"}),parent_span_id:sqliteCore.text("parent_span_id").references(()=>pe.id,{onDelete:"set null"}),name:sqliteCore.text("name").notNull(),kind:sqliteCore.text("kind").notNull().default("internal"),status:sqliteCore.text("status").notNull().default("ok"),started_at:sqliteCore.text("started_at").notNull(),completed_at:sqliteCore.text("completed_at"),duration_ms:sqliteCore.integer("duration_ms"),input:sqliteCore.text("input"),output:sqliteCore.text("output"),error:sqliteCore.text("error"),attributes:sqliteCore.text("attributes")},d=>({idx_spans_task_id:sqliteCore.index("idx_spans_task_id").on(d.task_id),idx_spans_parent_span_id:sqliteCore.index("idx_spans_parent_span_id").on(d.parent_span_id)}));sqliteCore.sqliteTable("tool_calls",{id:sqliteCore.text("id").primaryKey(),task_id:sqliteCore.text("task_id").references(()=>s.id,{onDelete:"cascade"}),session_id:sqliteCore.text("session_id"),tool_name:sqliteCore.text("tool_name").notNull(),files:sqliteCore.text("files"),input:sqliteCore.text("input"),output:sqliteCore.text("output"),duration_ms:sqliteCore.integer("duration_ms"),timestamp:sqliteCore.text("timestamp").notNull()},d=>({idx_tool_calls_task_id:sqliteCore.index("idx_tool_calls_task_id").on(d.task_id),idx_tool_calls_tool_name:sqliteCore.index("idx_tool_calls_tool_name").on(d.tool_name),idx_tool_calls_timestamp:sqliteCore.index("idx_tool_calls_timestamp").on(d.timestamp)}));sqliteCore.sqliteTable("thread_boxes",{id:sqliteCore.text("id").primaryKey(),thread_id:sqliteCore.text("thread_id").notNull().references(()=>_.id,{onDelete:"cascade"}),seq:sqliteCore.integer("seq").notNull(),first_task_id:sqliteCore.text("first_task_id").notNull(),mid_task_id:sqliteCore.text("mid_task_id").notNull(),last_task_id:sqliteCore.text("last_task_id").notNull(),task_count:sqliteCore.integer("task_count").notNull(),summary:sqliteCore.text("summary"),source_tokens:sqliteCore.integer("source_tokens").notNull(),summary_tokens:sqliteCore.integer("summary_tokens"),created_at:sqliteCore.text("created_at").notNull()},d=>({idx_thread_boxes_thread_id:sqliteCore.index("idx_thread_boxes_thread_id").on(d.thread_id),idx_thread_boxes_seq:sqliteCore.index("idx_thread_boxes_seq").on(d.thread_id,d.seq),uniq_thread_boxes_thread_seq:sqliteCore.unique().on(d.thread_id,d.seq)}));sqliteCore.sqliteTable("request_logs",{id:sqliteCore.text("id").primaryKey(),path:sqliteCore.text("path").notNull(),method:sqliteCore.text("method").notNull(),status_code:sqliteCore.integer("status_code").notNull(),duration_ms:sqliteCore.integer("duration_ms").notNull(),ip:sqliteCore.text("ip"),request_headers:sqliteCore.text("request_headers"),response_headers:sqliteCore.text("response_headers"),request_body:sqliteCore.text("request_body"),response_body:sqliteCore.text("response_body"),query:sqliteCore.text("query"),user_id:sqliteCore.text("user_id"),project_id:sqliteCore.text("project_id"),partition_key:sqliteCore.text("partition_key").notNull(),timestamp:sqliteCore.text("timestamp").notNull().default(drizzleOrm.sql`(datetime('now'))`),metadata:sqliteCore.text("metadata")},d=>({idx_request_logs_timestamp:sqliteCore.index("idx_request_logs_timestamp").on(d.timestamp),idx_request_logs_path:sqliteCore.index("idx_request_logs_path").on(d.path),idx_request_logs_status_code:sqliteCore.index("idx_request_logs_status_code").on(d.status_code),idx_request_logs_partition_key:sqliteCore.index("idx_request_logs_partition_key").on(d.partition_key)}));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")},d=>({uniq_usage_limit_snapshots_bucket:sqliteCore.uniqueIndex("uniq_usage_limit_snapshots_bucket").on(d.provider,d.account_ref,d.limit_window,d.bucket_start),idx_usage_limit_snapshots_window_bucket:sqliteCore.index("idx_usage_limit_snapshots_window_bucket").on(d.limit_window,d.bucket_start),idx_usage_limit_snapshots_provider_window_bucket:sqliteCore.index("idx_usage_limit_snapshots_provider_window_bucket").on(d.provider,d.limit_window,d.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")},d=>({uniq_usage_reports_ws_month:sqliteCore.uniqueIndex("uniq_usage_reports_ws_month").on(d.workspace_id,d.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")},d=>({idx_notifications_ws_created:sqliteCore.index("idx_notifications_ws_created").on(d.workspace_id,drizzleOrm.sql`${d.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()},d=>({pk:sqliteCore.primaryKey({columns:[d.notification_id,d.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()},d=>({idx_agent_suggestions_ws_agent:sqliteCore.index("idx_agent_suggestions_ws_agent").on(d.workspace_id,d.agent_id),idx_agent_suggestions_ws_created:sqliteCore.index("idx_agent_suggestions_ws_created").on(d.workspace_id,d.created_at)}));function Bt(d){let t=d.toLowerCase().trim();t=t.replace(/\[[^\]]*\]$/g,"");let e=t.lastIndexOf("/");return e>=0&&(t=t.slice(e+1)),t=t.replace(/-\d{8}$/,""),t}var K="2026-05-09",Ie="0.8.9-rc.13",j=10,G=parseInt(Ie.split("rc.")[1]),Pe=new Set(["workflow","mcp"]),Ft=600*1e3,_t=class extends V{dbPath;pidNullObservedSince=new Map;constructor(t={}){super(),t.dbPath?this.dbPath=t.dbPath:t.dbRoot&&(this.dbPath=U.join(t.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(t){let e=this.resolveDbPath();if(t){let r=U.dirname(e);fs.existsSync(r)||fs.mkdirSync(r,{recursive:true});}else if(!fs.existsSync(e))throw new p("NOT_FOUND","Database not found");let n=R(e);if(t)try{it(n.db,e);}catch(r){throw n.close(),r}return n}startTask(t){let e=this.openHandle(true);try{e.db.insert(s).values({id:t.id,agent_id:t.agentId,prompt:t.prompt,mode:t.mode,status:t.status,started_at:t.startedAt,pid:t.pid??null,parent_task_id:t.parentTaskId??null,caller_agent_id:t.callerAgentId??null,trace_id:t.traceId??null,command:t.command??null,metadata:t.metadata??null,workspace_id:t.workspaceId??null,platform:t.platform??"cli",crewx_version:t.crewxVersion??null,thread_id:t.threadId??null,model:t.model??null,rendered_prompt:t.renderedPrompt??null,coding_agent_command:t.codingAgentCommand??null}).onConflictDoUpdate({target:s.id,set:{pid:drizzleOrm.sql`COALESCE(excluded.pid, ${s.pid})`},setWhere:drizzleOrm.eq(s.status,"running")}).run();}catch(n){throw n instanceof p?n:new p("DB_ERROR","Failed to start task",n)}finally{e.close();}}finishTask(t){let e=this.openHandle(true);try{let n=t.runEpoch??null;e.runRaw(`UPDATE tasks SET status=?, result=?, error=?, completed_at=?, duration_ms=?,
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 Qt(d){let t=B__namespace.resolve(d);return process.platform==="win32"&&(t=t.replace(/\\/g,"/"),t=t.replace(/^([A-Z]):/,(e,s)=>`${s.toLowerCase()}:`)),t.length>1&&!/^[a-zA-Z]:\/$/.test(t)&&(t=t.replace(/\/+$/,"")),t}function Dt(d){let t=Qt(d);return crypto.createHash("sha256").update(t).digest("hex")}var Z=class{resolveDbPath(){return process.env.CREWX_DB?process.env.CREWX_DB:process.env.CREWX_TRACES_DB?process.env.CREWX_TRACES_DB:B.join(ee__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 T(d){let t=it("better-sqlite3"),{drizzle:e}=it("drizzle-orm/better-sqlite3"),s=new t(d);return s.exec("PRAGMA journal_mode = WAL"),s.exec("PRAGMA busy_timeout = 5000"),s.exec("PRAGMA foreign_keys = ON"),s.exec("PRAGMA analysis_limit = 400"),s.exec("PRAGMA optimize"),{db:e(s),runRaw:(r,o=[])=>s.prepare(r).run(...o),close:()=>s.close()}}var vt=new Set,ne={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 wt(d,t){return (d.get(`SELECT count(*) as cnt FROM sqlite_master WHERE type='table' AND name='${t}'`)?.cnt??0)>0}function se(d,t){if(t>0||!wt(d,"tasks"))return;let e=d.all("PRAGMA table_info(tasks)"),s=new Set(e.map(r=>r.name));for(let[r,o]of Object.entries(ne))s.has(r)||d.run(`ALTER TABLE tasks ADD COLUMN ${r} ${o}`);}var re={"0002_normalize_task_names":{workspace_name:"TEXT",project_name:"TEXT"}};function oe(d,t,e){if(!wt(d,"__drizzle_migrations")||!wt(d,"tasks"))return;let s=d.all(e`SELECT hash FROM __drizzle_migrations`),r=new Set(s.map(a=>a.hash)),o=JSON.parse(fs.readFileSync(B__namespace.default.join(t,"meta/_journal.json"),"utf-8"));for(let a of o.entries){let i=re[a.tag];if(!i)continue;let c=B__namespace.default.join(t,`${a.tag}.sql`);if(!fs.existsSync(c))continue;let l=fs.readFileSync(c,"utf-8"),u=crypto.createHash("sha256").update(l).digest("hex");if(r.has(u))continue;let h=d.all("PRAGMA table_info(tasks)"),f=new Set(h.map(R=>R.name));for(let[R,A]of Object.entries(i))f.has(R)||(d.run(`ALTER TABLE tasks ADD COLUMN ${R} ${A}`),f.add(R));}}function ae(d,t,e){let s=d.all(e`SELECT hash FROM __drizzle_migrations`),r=new Set(s.map(a=>a.hash)),o=JSON.parse(fs.readFileSync(B__namespace.default.join(t,"meta/_journal.json"),"utf-8"));for(let a of o.entries){let i=B__namespace.default.join(t,`${a.tag}.sql`);if(!fs.existsSync(i))continue;let c=fs.readFileSync(i,"utf-8"),l=crypto.createHash("sha256").update(c).digest("hex");if(r.has(l))continue;let u=/ALTER\s+TABLE\s+[`"]?(\w+)[`"]?\s+ADD\s+[`"]?(\w+)[`"]?/gi,h=[],f;for(;(f=u.exec(c))!==null;)h.push({table:f[1],column:f[2]});if(h.length===0||!c.split(/-->\s*statement-breakpoint/).map(C=>C.trim()).filter(Boolean).every(C=>/^ALTER\s+TABLE\s+.+\s+ADD\s+/i.test(C)))continue;h.every(({table:C,column:$})=>d.all(`PRAGMA table_info("${C}")`).some(U=>U.name===$))&&d.run(e`INSERT INTO __drizzle_migrations (hash, created_at) VALUES (${l}, ${a.when})`);}}function ie(d){let{migrate:t}=it("drizzle-orm/better-sqlite3/migrator"),{sql:e}=it("drizzle-orm"),s=[B__namespace.default.join(__dirname,"../migrations"),B__namespace.default.join(__dirname,"migrations"),B__namespace.default.join(__dirname,"../../../../drizzle/migrations"),B__namespace.default.join(process.cwd(),"drizzle/migrations")],r=s.find(l=>fs.existsSync(B__namespace.default.join(l,"meta/_journal.json")));if(!r)throw new Error(`migrations folder not found. Searched:
12
+ ${s.join(`
13
+ `)}`);let o=d.get(e`SELECT count(*) as cnt FROM sqlite_master WHERE type='table' AND name='__drizzle_migrations'`),a=0;o?.cnt&&(a=d.get(e`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0),se(d,a),o?.cnt&&(ae(d,r,e),oe(d,r,e)),t(d,{migrationsFolder:r});let c=(d.get(e`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0)-a;if(c>0){let l=o?.cnt?"Database migrated":"Database initialized";console.error(`[crewx] ${l} (${c} migration${c>1?"s":""} applied).`);}}function lt(d,t){vt.has(t)||(ie(d),vt.add(t));}var p=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 tt=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"),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)},d=>({idx_tasks_agent_id:sqliteCore.index("idx_tasks_agent_id").on(d.agent_id),idx_tasks_status:sqliteCore.index("idx_tasks_status").on(d.status),idx_tasks_started_at:sqliteCore.index("idx_tasks_started_at").on(d.started_at),idx_tasks_trace_id:sqliteCore.index("idx_tasks_trace_id").on(d.trace_id),idx_tasks_parent_task_id:sqliteCore.index("idx_tasks_parent_task_id").on(d.parent_task_id),idx_tasks_crewx_version:sqliteCore.index("idx_tasks_crewx_version").on(d.crewx_version),idx_tasks_pid:sqliteCore.index("idx_tasks_pid").on(d.pid),idx_tasks_thread_id:sqliteCore.index("idx_tasks_thread_id").on(d.thread_id),idx_tasks_workspace_id:sqliteCore.index("idx_tasks_workspace_id").on(d.workspace_id),idx_tasks_workspace_ref:sqliteCore.index("idx_tasks_workspace_ref").on(d.workspace_ref),idx_tasks_project_id:sqliteCore.index("idx_tasks_project_id").on(d.project_id),idx_tasks_ws_started:sqliteCore.index("idx_tasks_ws_started").on(d.workspace_id,d.started_at)}));var _=sqliteCore.sqliteTable("threads",{id:sqliteCore.text("id").primaryKey(),workspace_id:sqliteCore.text("workspace_id").references(()=>tt.id,{onDelete:"set null"}),platform:sqliteCore.text("platform").notNull().default("cli"),title:sqliteCore.text("title"),first_message:sqliteCore.text("first_message"),last_message:sqliteCore.text("last_message"),message_count:sqliteCore.integer("message_count").notNull().default(0),created_at:sqliteCore.text("created_at").notNull(),updated_at:sqliteCore.text("updated_at").notNull(),metadata:sqliteCore.text("metadata"),title_locked:sqliteCore.integer("title_locked").notNull().default(0),pinned:sqliteCore.integer("pinned").notNull().default(0),starred:sqliteCore.integer("starred").notNull().default(0)},d=>({idx_threads_updated_at:sqliteCore.index("idx_threads_updated_at").on(d.updated_at),idx_threads_workspace_id:sqliteCore.index("idx_threads_workspace_id").on(d.workspace_id),idx_threads_ws_updated:sqliteCore.index("idx_threads_ws_updated").on(d.workspace_id,d.updated_at),idx_threads_title:sqliteCore.index("idx_threads_title").on(d.title)}));var fe=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(()=>fe.id,{onDelete:"set null"}),name:sqliteCore.text("name").notNull(),kind:sqliteCore.text("kind").notNull().default("internal"),status:sqliteCore.text("status").notNull().default("ok"),started_at:sqliteCore.text("started_at").notNull(),completed_at:sqliteCore.text("completed_at"),duration_ms:sqliteCore.integer("duration_ms"),input:sqliteCore.text("input"),output:sqliteCore.text("output"),error:sqliteCore.text("error"),attributes:sqliteCore.text("attributes")},d=>({idx_spans_task_id:sqliteCore.index("idx_spans_task_id").on(d.task_id),idx_spans_parent_span_id:sqliteCore.index("idx_spans_parent_span_id").on(d.parent_span_id)}));sqliteCore.sqliteTable("tool_calls",{id:sqliteCore.text("id").primaryKey(),task_id:sqliteCore.text("task_id").references(()=>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()},d=>({idx_tool_calls_task_id:sqliteCore.index("idx_tool_calls_task_id").on(d.task_id),idx_tool_calls_tool_name:sqliteCore.index("idx_tool_calls_tool_name").on(d.tool_name),idx_tool_calls_timestamp:sqliteCore.index("idx_tool_calls_timestamp").on(d.timestamp)}));sqliteCore.sqliteTable("thread_boxes",{id:sqliteCore.text("id").primaryKey(),thread_id:sqliteCore.text("thread_id").notNull().references(()=>_.id,{onDelete:"cascade"}),seq:sqliteCore.integer("seq").notNull(),first_task_id:sqliteCore.text("first_task_id").notNull(),mid_task_id:sqliteCore.text("mid_task_id").notNull(),last_task_id:sqliteCore.text("last_task_id").notNull(),task_count:sqliteCore.integer("task_count").notNull(),summary:sqliteCore.text("summary"),source_tokens:sqliteCore.integer("source_tokens").notNull(),summary_tokens:sqliteCore.integer("summary_tokens"),created_at:sqliteCore.text("created_at").notNull()},d=>({idx_thread_boxes_thread_id:sqliteCore.index("idx_thread_boxes_thread_id").on(d.thread_id),idx_thread_boxes_seq:sqliteCore.index("idx_thread_boxes_seq").on(d.thread_id,d.seq),uniq_thread_boxes_thread_seq:sqliteCore.unique().on(d.thread_id,d.seq)}));sqliteCore.sqliteTable("request_logs",{id:sqliteCore.text("id").primaryKey(),path:sqliteCore.text("path").notNull(),method:sqliteCore.text("method").notNull(),status_code:sqliteCore.integer("status_code").notNull(),duration_ms:sqliteCore.integer("duration_ms").notNull(),ip:sqliteCore.text("ip"),request_headers:sqliteCore.text("request_headers"),response_headers:sqliteCore.text("response_headers"),request_body:sqliteCore.text("request_body"),response_body:sqliteCore.text("response_body"),query:sqliteCore.text("query"),user_id:sqliteCore.text("user_id"),project_id:sqliteCore.text("project_id"),partition_key:sqliteCore.text("partition_key").notNull(),timestamp:sqliteCore.text("timestamp").notNull().default(drizzleOrm.sql`(datetime('now'))`),metadata:sqliteCore.text("metadata")},d=>({idx_request_logs_timestamp:sqliteCore.index("idx_request_logs_timestamp").on(d.timestamp),idx_request_logs_path:sqliteCore.index("idx_request_logs_path").on(d.path),idx_request_logs_status_code:sqliteCore.index("idx_request_logs_status_code").on(d.status_code),idx_request_logs_partition_key:sqliteCore.index("idx_request_logs_partition_key").on(d.partition_key)}));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")},d=>({uniq_usage_limit_snapshots_bucket:sqliteCore.uniqueIndex("uniq_usage_limit_snapshots_bucket").on(d.provider,d.account_ref,d.limit_window,d.bucket_start),idx_usage_limit_snapshots_window_bucket:sqliteCore.index("idx_usage_limit_snapshots_window_bucket").on(d.limit_window,d.bucket_start),idx_usage_limit_snapshots_provider_window_bucket:sqliteCore.index("idx_usage_limit_snapshots_provider_window_bucket").on(d.provider,d.limit_window,d.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")},d=>({uniq_usage_reports_ws_month:sqliteCore.uniqueIndex("uniq_usage_reports_ws_month").on(d.workspace_id,d.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")},d=>({idx_notifications_ws_created:sqliteCore.index("idx_notifications_ws_created").on(d.workspace_id,drizzleOrm.sql`${d.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()},d=>({pk:sqliteCore.primaryKey({columns:[d.notification_id,d.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()},d=>({idx_agent_suggestions_ws_agent:sqliteCore.index("idx_agent_suggestions_ws_agent").on(d.workspace_id,d.agent_id),idx_agent_suggestions_ws_created:sqliteCore.index("idx_agent_suggestions_ws_created").on(d.workspace_id,d.created_at)}));function Ht(d){let t=d.toLowerCase().trim();t=t.replace(/\[[^\]]*\]$/g,"");let e=t.lastIndexOf("/");return e>=0&&(t=t.slice(e+1)),t=t.replace(/-\d{8}$/,""),t}var j="2026-05-09",Ue="0.8.9-rc.13",G=10,X=parseInt(Ue.split("rc.")[1]),Be=new Set(["workflow","mcp"]),zt=600*1e3,ft=class extends Z{dbPath;pidNullObservedSince=new Map;constructor(t={}){super(),t.dbPath?this.dbPath=t.dbPath:t.dbRoot&&(this.dbPath=B.join(t.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(t){let e=this.resolveDbPath();if(t){let r=B.dirname(e);fs.existsSync(r)||fs.mkdirSync(r,{recursive:true});}else if(!fs.existsSync(e))throw new p("NOT_FOUND","Database not found");let s=T(e);if(t)try{lt(s.db,e);}catch(r){throw s.close(),r}return s}startTask(t){let e=this.openHandle(true);try{e.db.insert(n).values({id:t.id,agent_id:t.agentId,prompt:t.prompt,mode:t.mode,status:t.status,started_at:t.startedAt,pid:t.pid??null,parent_task_id:t.parentTaskId??null,caller_agent_id:t.callerAgentId??null,trace_id:t.traceId??null,command:t.command??null,metadata:t.metadata??null,workspace_id:t.workspaceId??null,platform:t.platform??"cli",crewx_version:t.crewxVersion??null,thread_id:t.threadId??null,model:t.model??null,rendered_prompt:t.renderedPrompt??null,coding_agent_command:t.codingAgentCommand??null}).onConflictDoUpdate({target:n.id,set:{pid:drizzleOrm.sql`COALESCE(excluded.pid, ${n.pid})`},setWhere:drizzleOrm.eq(n.status,"running")}).run();}catch(s){throw s instanceof p?s:new p("DB_ERROR","Failed to start task",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=?,
14
14
  exit_code=?, input_tokens=?, output_tokens=?, cached_input_tokens=?, cost_usd=?,
15
15
  model=COALESCE(?, model)
16
- 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,n]);}catch(n){throw n instanceof p?n:new p("DB_ERROR","Failed to finish task",n)}finally{e.close();}}appendLog(t,e){let n=this.openHandle(true);try{n.db.transaction(r=>{let o=r.select({logs:s.logs}).from(s).where(drizzleOrm.eq(s.id,t)).limit(1).get(),i=o?.logs?JSON.parse(o.logs):[];i.push(e),r.update(s).set({logs:JSON.stringify(i)}).where(drizzleOrm.eq(s.id,t)).run();},{behavior:"immediate"});}catch(r){throw r instanceof p?r:new p("DB_ERROR","Failed to append log",r)}finally{n.close();}}getRunningTasks(){if(!this.dbExists())return [];let t=this.openHandle(false);try{return t.db.select().from(s).where(drizzleOrm.eq(s.status,"running")).orderBy(drizzleOrm.desc(s.started_at)).all()}catch(e){throw new p("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(s).orderBy(drizzleOrm.desc(s.started_at)).limit(100).all()}catch(e){throw new p("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(s).where(drizzleOrm.eq(s.id,t)).limit(1).get()??void 0}catch(n){throw new p("DB_ERROR","Failed to get task",n)}finally{e.close();}}killTask(t){if(!this.dbExists())return {killed:false};let e=this.openHandle(true);try{let n=e.db.select({id:s.id,status:s.status,pid:s.pid}).from(s).where(drizzleOrm.eq(s.id,t)).limit(1).get();if(!n||n.status!=="running")return {killed:!1};if(n.pid)try{process.kill(n.pid,"SIGTERM");}catch{}return e.db.update(s).set({status:"failed",error:"Killed by user",completed_at:new Date().toISOString()}).where(drizzleOrm.and(drizzleOrm.eq(s.id,t),drizzleOrm.eq(s.status,"running"))).run(),{killed:!0,pid:n.pid??void 0}}catch(n){throw n instanceof p?n:new p("DB_ERROR","Failed to kill task",n)}finally{e.close();}}reapOrphanedTasks(){if(!this.dbExists())return 0;let t=this.openHandle(true);try{let e=t.db.select({id:s.id,pid:s.pid,platform:s.platform,run_epoch:s.run_epoch}).from(s).where(drizzleOrm.eq(s.status,"running")).all(),n=Date.now(),r=new Set,o=0;for(let i of e){if(i.pid){let l=!1;try{process.kill(i.pid,0),l=!0;}catch{}l||(t.db.update(s).set({status:"failed",error:"Reaped: process not found (orphaned task)",completed_at:new Date().toISOString()}).where(drizzleOrm.and(drizzleOrm.eq(s.id,i.id),drizzleOrm.eq(s.status,"running"))).run(),o++);continue}if(Pe.has(i.platform??"cli"))continue;let a=`${i.id}:${i.run_epoch??0}`;r.add(a);let c=this.pidNullObservedSince.get(a);if(c===void 0){this.pidNullObservedSince.set(a,n);continue}n-c>=Ft&&(t.db.update(s).set({status:"failed",error:"Reaped: pid never recorded after resume (stale running_instruction)",completed_at:new Date().toISOString()}).where(drizzleOrm.and(drizzleOrm.eq(s.id,i.id),drizzleOrm.eq(s.status,"running"))).run(),o++,this.pidNullObservedSince.delete(a));}for(let i of Array.from(this.pidNullObservedSince.keys()))r.has(i)||this.pidNullObservedSince.delete(i);return o}finally{t.close();}}reapRunningWorkflowTasks(t=Ft){if(!this.dbExists())return 0;let e=this.openHandle(true);try{let n=new Date(Date.now()-t).toISOString();return e.db.update(s).set({status:"failed",error:"Reaped: stale workflow run (finally not executed)",completed_at:new Date().toISOString()}).where(drizzleOrm.and(drizzleOrm.eq(s.status,"running"),drizzleOrm.eq(s.platform,"workflow"),drizzleOrm.isNull(s.pid),drizzleOrm.lt(s.started_at,n))).run().changes??0}finally{e.close();}}findTaskStatus(t,e){let n=this.resolveDbPaths();for(let r of n){if(!fs.existsSync(r))continue;let o=R(r);try{let i=e?drizzleOrm.eq(s.workspace_id,e):void 0,a=i?drizzleOrm.and(drizzleOrm.eq(s.id,t),i):drizzleOrm.eq(s.id,t),c=o.db.select().from(s).where(a).limit(1).get()??void 0;if(!c){let l=drizzleOrm.or(drizzleOrm.eq(s.thread_id,t),drizzleOrm.and(drizzleOrm.isNull(s.thread_id),drizzleOrm.like(s.command,`%--thread=${t}%`))),u=i?drizzleOrm.and(l,i):l;c=o.db.select().from(s).where(u).orderBy(drizzleOrm.desc(s.started_at)).limit(1).get()??void 0;}if(c)return c}catch(i){throw new p("DB_ERROR","Failed to find task status",i)}finally{o.close();}}}findChildTasks(t,e){let n=this.resolveDbPaths(),r=new Set,o=[];for(let i of n){if(!fs.existsSync(i))continue;let a=R(i);try{let c=e?drizzleOrm.and(drizzleOrm.eq(s.parent_task_id,t),drizzleOrm.eq(s.workspace_id,e)):drizzleOrm.eq(s.parent_task_id,t),l=a.db.select().from(s).where(c).orderBy(drizzleOrm.asc(s.started_at)).all();for(let u of l)r.has(u.id)||(r.add(u.id),o.push(u));}catch(c){throw new p("DB_ERROR","Failed to find child tasks",c)}finally{a.close();}}return o}getWorkspaceUsageSummary(t){if(!this.dbExists())return [];let e=this.openHandle(false);try{return e.db.all(t?drizzleOrm.sql`
16
+ 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{e.close();}}appendLog(t,e){let s=this.openHandle(true);try{s.db.transaction(r=>{let o=r.select({logs:n.logs}).from(n).where(drizzleOrm.eq(n.id,t)).limit(1).get(),a=o?.logs?JSON.parse(o.logs):[];a.push(e),r.update(n).set({logs:JSON.stringify(a)}).where(drizzleOrm.eq(n.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(n).where(drizzleOrm.eq(n.status,"running")).orderBy(drizzleOrm.desc(n.started_at)).all()}catch(e){throw new p("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 p("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 p("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 p?s:new p("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(),r=new Set,o=0;for(let a of e){if(a.pid){let l=!1;try{process.kill(a.pid,0),l=!0;}catch{}l||(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(),o++);continue}if(Be.has(a.platform??"cli"))continue;let i=`${a.id}:${a.run_epoch??0}`;r.add(i);let c=this.pidNullObservedSince.get(i);if(c===void 0){this.pidNullObservedSince.set(i,s);continue}s-c>=zt&&(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(),o++,this.pidNullObservedSince.delete(i));}for(let a of Array.from(this.pidNullObservedSince.keys()))r.has(a)||this.pidNullObservedSince.delete(a);return o}finally{t.close();}}reapRunningWorkflowTasks(t=zt){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))).run().changes??0}finally{e.close();}}findTaskStatus(t,e){let s=this.resolveDbPaths();for(let r of s){if(!fs.existsSync(r))continue;let o=T(r);try{let a=e?drizzleOrm.eq(n.workspace_id,e):void 0,i=a?drizzleOrm.and(drizzleOrm.eq(n.id,t),a):drizzleOrm.eq(n.id,t),c=o.db.select().from(n).where(i).limit(1).get()??void 0;if(!c){let l=drizzleOrm.or(drizzleOrm.eq(n.thread_id,t),drizzleOrm.and(drizzleOrm.isNull(n.thread_id),drizzleOrm.like(n.command,`%--thread=${t}%`))),u=a?drizzleOrm.and(l,a):l;c=o.db.select().from(n).where(u).orderBy(drizzleOrm.desc(n.started_at)).limit(1).get()??void 0;}if(c)return c}catch(a){throw new p("DB_ERROR","Failed to find task status",a)}finally{o.close();}}}findChildTasks(t,e){let s=this.resolveDbPaths(),r=new Set,o=[];for(let a of s){if(!fs.existsSync(a))continue;let i=T(a);try{let c=e?drizzleOrm.and(drizzleOrm.eq(n.parent_task_id,t),drizzleOrm.eq(n.workspace_id,e)):drizzleOrm.eq(n.parent_task_id,t),l=i.db.select().from(n).where(c).orderBy(drizzleOrm.asc(n.started_at)).all();for(let u of l)r.has(u.id)||(r.add(u.id),o.push(u));}catch(c){throw new p("DB_ERROR","Failed to find child tasks",c)}finally{i.close();}}return o}getWorkspaceUsageSummary(t){if(!this.dbExists())return [];let e=this.openHandle(false);try{return e.db.all(t?drizzleOrm.sql`
17
17
  SELECT
18
18
  COALESCE(workspace_id, 'unknown') AS workspace_id,
19
19
  COALESCE(SUM(input_tokens), 0) AS input_tokens,
@@ -34,7 +34,7 @@ ${n.join(`
34
34
  FROM tasks
35
35
  GROUP BY workspace_id
36
36
  ORDER BY (COALESCE(SUM(input_tokens), 0) + COALESCE(SUM(output_tokens), 0)) DESC
37
- `)}catch(n){throw new p("DB_ERROR","Failed to get workspace usage summary",n)}finally{e.close();}}getThreadTokenUsage(t,e){let n=this.resolveDbPaths(),r=new Set,o=0,i=0,a=0;for(let c of n){if(!fs.existsSync(c))continue;let l=R(c);try{let u=drizzleOrm.or(drizzleOrm.eq(s.thread_id,t),drizzleOrm.and(drizzleOrm.isNull(s.thread_id),drizzleOrm.like(s.command,`%--thread=${t}%`))),h=e?drizzleOrm.and(u,drizzleOrm.eq(s.workspace_id,e)):u,m=l.db.select({id:s.id,input_tokens:s.input_tokens,output_tokens:s.output_tokens,cost_usd:s.cost_usd}).from(s).where(h).all();for(let y of m)r.has(y.id)||(r.add(y.id),o+=y.input_tokens??0,i+=y.output_tokens??0,a+=y.cost_usd??0);}catch(u){throw new p("DB_ERROR","Failed to get thread token usage",u)}finally{l.close();}}return {inputTokens:o,outputTokens:i,costUsd:a}}findTasksByThread(t,e){let n=this.resolveDbPaths(),r=new Set,o=[];for(let i of n){if(!fs.existsSync(i))continue;let a=R(i);try{let c=drizzleOrm.or(drizzleOrm.eq(s.thread_id,t),drizzleOrm.and(drizzleOrm.isNull(s.thread_id),drizzleOrm.like(s.command,`%--thread=${t}%`))),l=e?drizzleOrm.and(c,drizzleOrm.eq(s.workspace_id,e)):c,u=a.db.select().from(s).where(l).orderBy(drizzleOrm.asc(s.started_at)).all();for(let h of u)r.has(h.id)||(r.add(h.id),o.push(h));}catch(c){throw new p("DB_ERROR","Failed to find tasks by thread",c)}finally{a.close();}}return o}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}batchFetchWorkflowCards(t,e){let n=new Map;if(t.length===0)return n;let r=new Set(t),o=new Map,i=e?drizzleOrm.eq(s.workspace_id,e):void 0,a=(c,l)=>{if(!c)return;let u=o.get(c);if(u&&l.started_at<=u)return;let h=this.parseWorkflowCardMetadata(l.metadata);h.kind==="workflow_card"&&(o.set(c,l.started_at),n.set(c,{taskId:l.id,workflowRunId:h.workflowRunId,raw:l.result??void 0}));};for(let c of this.resolveDbPaths()){if(!fs.existsSync(c))continue;let l=R(c);try{let u=drizzleOrm.and(drizzleOrm.inArray(s.thread_id,t),drizzleOrm.like(s.metadata,'%"kind":"workflow_card"%')),h=l.db.select({id:s.id,thread_id:s.thread_id,metadata:s.metadata,result:s.result,started_at:s.started_at}).from(s).where(i?drizzleOrm.and(u,i):u).all();for(let A of h)a(A.thread_id,A);let m=drizzleOrm.and(drizzleOrm.isNull(s.thread_id),drizzleOrm.like(s.metadata,'%"kind":"workflow_card"%')),y=l.db.select({id:s.id,command:s.command,metadata:s.metadata,result:s.result,started_at:s.started_at}).from(s).where(i?drizzleOrm.and(m,i):m).all();for(let A of y){let C=this.extractThreadIdFromCommand(A.command);!C||!r.has(C)||a(C,A);}}catch(u){throw new p("DB_ERROR","Failed to batch fetch workflow cards",u)}finally{l.close();}}return n}findAllTasks(t){if(!this.dbExists())return {rows:[],total:0};let e=this.openHandle(false);try{let n=[];t.workspaceId&&n.push(drizzleOrm.eq(s.workspace_id,t.workspaceId));let r=t.agents&&t.agents.length>0?t.agents:t.agentId?[t.agentId]:null;r&&n.push(drizzleOrm.inArray(s.agent_id,r));let o=t.statuses&&t.statuses.length>0?t.statuses:t.status?[t.status]:null;o&&n.push(drizzleOrm.inArray(s.status,o));let i=t.q??t.search;i&&n.push(drizzleOrm.like(s.prompt,`%${i}%`)),t.from&&n.push(drizzleOrm.gte(s.started_at,t.from)),t.to&&n.push(drizzleOrm.lt(s.started_at,t.to));let a=n.length>0?drizzleOrm.and(...n):void 0,c=e.db.select({count:drizzleOrm.sql`count(*)`}).from(s).where(a).get(),l=(t.sortDir??"DESC")==="ASC"?drizzleOrm.asc(s.started_at):drizzleOrm.desc(s.started_at);return {rows:e.db.select().from(s).where(a).orderBy(l).limit(t.limit).offset(t.offset).all(),total:c?.count??0}}catch(n){throw new p("DB_ERROR","Failed to find all tasks",n)}finally{e.close();}}getAgentUsage(t,e,n){if(!this.dbExists())return [];let r=this.openHandle(false);try{return r.db.all(n?drizzleOrm.sql`
37
+ `)}catch(s){throw new p("DB_ERROR","Failed to get workspace usage summary",s)}finally{e.close();}}getThreadTokenUsage(t,e){let s=this.resolveDbPaths(),r=new Set,o=0,a=0,i=0;for(let c of s){if(!fs.existsSync(c))continue;let l=T(c);try{let u=drizzleOrm.or(drizzleOrm.eq(n.thread_id,t),drizzleOrm.and(drizzleOrm.isNull(n.thread_id),drizzleOrm.like(n.command,`%--thread=${t}%`))),h=e?drizzleOrm.and(u,drizzleOrm.eq(n.workspace_id,e)):u,f=l.db.select({id:n.id,input_tokens:n.input_tokens,output_tokens:n.output_tokens,cost_usd:n.cost_usd}).from(n).where(h).all();for(let R of f)r.has(R.id)||(r.add(R.id),o+=R.input_tokens??0,a+=R.output_tokens??0,i+=R.cost_usd??0);}catch(u){throw new p("DB_ERROR","Failed to get thread token usage",u)}finally{l.close();}}return {inputTokens:o,outputTokens:a,costUsd:i}}findTasksByThread(t,e){let s=this.resolveDbPaths(),r=new Set,o=[];for(let a of s){if(!fs.existsSync(a))continue;let i=T(a);try{let c=drizzleOrm.or(drizzleOrm.eq(n.thread_id,t),drizzleOrm.and(drizzleOrm.isNull(n.thread_id),drizzleOrm.like(n.command,`%--thread=${t}%`))),l=e?drizzleOrm.and(c,drizzleOrm.eq(n.workspace_id,e)):c,u=i.db.select().from(n).where(l).orderBy(drizzleOrm.asc(n.started_at)).all();for(let h of u)r.has(h.id)||(r.add(h.id),o.push(h));}catch(c){throw new p("DB_ERROR","Failed to find tasks by thread",c)}finally{i.close();}}return o}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}batchFetchWorkflowCards(t,e){let s=new Map;if(t.length===0)return s;let r=new Set(t),o=new Map,a=e?drizzleOrm.eq(n.workspace_id,e):void 0,i=(c,l)=>{if(!c)return;let u=o.get(c);if(u&&l.started_at<=u)return;let h=this.parseWorkflowCardMetadata(l.metadata);h.kind==="workflow_card"&&(o.set(c,l.started_at),s.set(c,{taskId:l.id,workflowRunId:h.workflowRunId,raw:l.result??void 0}));};for(let c of this.resolveDbPaths()){if(!fs.existsSync(c))continue;let l=T(c);try{let u=drizzleOrm.and(drizzleOrm.inArray(n.thread_id,t),drizzleOrm.like(n.metadata,'%"kind":"workflow_card"%')),h=l.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(u,a):u).all();for(let A of h)i(A.thread_id,A);let f=drizzleOrm.and(drizzleOrm.isNull(n.thread_id),drizzleOrm.like(n.metadata,'%"kind":"workflow_card"%')),R=l.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 A of R){let C=this.extractThreadIdFromCommand(A.command);!C||!r.has(C)||i(C,A);}}catch(u){throw new p("DB_ERROR","Failed to batch fetch workflow cards",u)}finally{l.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 r=t.agents&&t.agents.length>0?t.agents:t.agentId?[t.agentId]:null;r&&s.push(drizzleOrm.inArray(n.agent_id,r));let o=t.statuses&&t.statuses.length>0?t.statuses:t.status?[t.status]:null;o&&s.push(drizzleOrm.inArray(n.status,o));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 i=s.length>0?drizzleOrm.and(...s):void 0,c=e.db.select({count:drizzleOrm.sql`count(*)`}).from(n).where(i).get(),l=(t.sortDir??"DESC")==="ASC"?drizzleOrm.asc(n.started_at):drizzleOrm.desc(n.started_at);return {rows:e.db.select().from(n).where(i).orderBy(l).limit(t.limit).offset(t.offset).all(),total:c?.count??0}}catch(s){throw new p("DB_ERROR","Failed to find all tasks",s)}finally{e.close();}}getAgentUsage(t,e,s){if(!this.dbExists())return [];let r=this.openHandle(false);try{return r.db.all(s?drizzleOrm.sql`
38
38
  SELECT
39
39
  t.agent_id,
40
40
  t.workspace_id,
@@ -42,11 +42,11 @@ ${n.join(`
42
42
  COALESCE(SUM(
43
43
  COALESCE(t.input_tokens, 0)
44
44
  + CASE
45
- WHEN t.started_at >= ${K}
45
+ WHEN t.started_at >= ${j}
46
46
  AND (
47
47
  t.crewx_version IS NULL
48
48
  OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
49
- OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${j}) AS INTEGER) < ${G})
49
+ OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${G}) AS INTEGER) < ${X})
50
50
  )
51
51
  THEN COALESCE(t.cached_input_tokens, 0)
52
52
  ELSE 0
@@ -59,17 +59,17 @@ ${n.join(`
59
59
  WHERE t.status IN ('completed', 'success')
60
60
  AND t.started_at >= ${t}
61
61
  AND t.started_at < ${e}
62
- AND t.workspace_id = ${n}
62
+ AND t.workspace_id = ${s}
63
63
  GROUP BY t.agent_id, t.workspace_id
64
64
  ORDER BY (
65
65
  COALESCE(SUM(
66
66
  COALESCE(t.input_tokens, 0)
67
67
  + CASE
68
- WHEN t.started_at >= ${K}
68
+ WHEN t.started_at >= ${j}
69
69
  AND (
70
70
  t.crewx_version IS NULL
71
71
  OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
72
- OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${j}) AS INTEGER) < ${G})
72
+ OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${G}) AS INTEGER) < ${X})
73
73
  )
74
74
  THEN COALESCE(t.cached_input_tokens, 0)
75
75
  ELSE 0
@@ -85,11 +85,11 @@ ${n.join(`
85
85
  COALESCE(SUM(
86
86
  COALESCE(t.input_tokens, 0)
87
87
  + CASE
88
- WHEN t.started_at >= ${K}
88
+ WHEN t.started_at >= ${j}
89
89
  AND (
90
90
  t.crewx_version IS NULL
91
91
  OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
92
- OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${j}) AS INTEGER) < ${G})
92
+ OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${G}) AS INTEGER) < ${X})
93
93
  )
94
94
  THEN COALESCE(t.cached_input_tokens, 0)
95
95
  ELSE 0
@@ -107,11 +107,11 @@ ${n.join(`
107
107
  COALESCE(SUM(
108
108
  COALESCE(t.input_tokens, 0)
109
109
  + CASE
110
- WHEN t.started_at >= ${K}
110
+ WHEN t.started_at >= ${j}
111
111
  AND (
112
112
  t.crewx_version IS NULL
113
113
  OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
114
- OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${j}) AS INTEGER) < ${G})
114
+ OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${G}) AS INTEGER) < ${X})
115
115
  )
116
116
  THEN COALESCE(t.cached_input_tokens, 0)
117
117
  ELSE 0
@@ -119,18 +119,18 @@ ${n.join(`
119
119
  ), 0)
120
120
  + COALESCE(SUM(t.output_tokens), 0)
121
121
  ) DESC
122
- `).map(i=>({agentId:i.agent_id,workspaceId:i.workspace_id??null,totalTasks:i.total_tasks,inputTokens:i.input_tokens,outputTokens:i.output_tokens,cachedInputTokens:i.cached_input_tokens,costUsd:i.cost_usd,totalTokens:i.input_tokens+i.output_tokens}))}catch(o){throw new p("DB_ERROR","Failed to get agent usage",o)}finally{r.close();}}getAgentUsageTrendRaw(t,e,n){if(!this.dbExists())return [];let r=this.openHandle(false);try{return r.db.all(n?drizzleOrm.sql`
122
+ `).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(o){throw new p("DB_ERROR","Failed to get agent usage",o)}finally{r.close();}}getAgentUsageTrendRaw(t,e,s){if(!this.dbExists())return [];let r=this.openHandle(false);try{return r.db.all(s?drizzleOrm.sql`
123
123
  SELECT
124
124
  date(t.started_at) AS date,
125
125
  t.agent_id,
126
126
  COALESCE(SUM(
127
127
  COALESCE(t.input_tokens, 0)
128
128
  + CASE
129
- WHEN t.started_at >= ${K}
129
+ WHEN t.started_at >= ${j}
130
130
  AND (
131
131
  t.crewx_version IS NULL
132
132
  OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
133
- OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${j}) AS INTEGER) < ${G})
133
+ OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${G}) AS INTEGER) < ${X})
134
134
  )
135
135
  THEN COALESCE(t.cached_input_tokens, 0)
136
136
  ELSE 0
@@ -143,7 +143,7 @@ ${n.join(`
143
143
  WHERE t.status IN ('completed', 'success')
144
144
  AND t.started_at >= ${t}
145
145
  AND t.started_at < ${e}
146
- AND t.workspace_id = ${n}
146
+ AND t.workspace_id = ${s}
147
147
  GROUP BY date(t.started_at), t.agent_id
148
148
  ORDER BY date(t.started_at) ASC
149
149
  `:drizzleOrm.sql`
@@ -153,11 +153,11 @@ ${n.join(`
153
153
  COALESCE(SUM(
154
154
  COALESCE(t.input_tokens, 0)
155
155
  + CASE
156
- WHEN t.started_at >= ${K}
156
+ WHEN t.started_at >= ${j}
157
157
  AND (
158
158
  t.crewx_version IS NULL
159
159
  OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
160
- OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${j}) AS INTEGER) < ${G})
160
+ OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${G}) AS INTEGER) < ${X})
161
161
  )
162
162
  THEN COALESCE(t.cached_input_tokens, 0)
163
163
  ELSE 0
@@ -172,94 +172,94 @@ ${n.join(`
172
172
  AND t.started_at < ${e}
173
173
  GROUP BY date(t.started_at), t.agent_id
174
174
  ORDER BY date(t.started_at) ASC
175
- `).map(i=>({date:i.date,agentId:i.agent_id,inputTokens:i.input_tokens,outputTokens:i.output_tokens,cachedInputTokens:i.cached_input_tokens,costUsd:i.cost_usd,totalTokens:i.input_tokens+i.output_tokens}))}catch(o){throw new p("DB_ERROR","Failed to get agent usage trend",o)}finally{r.close();}}findTaskForStop(t,e){if(!this.dbExists())return;let n=this.openHandle(false);try{return n.db.select().from(s).where(drizzleOrm.and(drizzleOrm.eq(s.id,t),drizzleOrm.eq(s.workspace_id,e))).limit(1).get()??void 0}catch(r){throw new p("DB_ERROR","Failed to find task for stop",r)}finally{n.close();}}findLatestTaskByMetadata(t){if(!this.dbExists())return null;let e=this.openHandle(false);try{return e.db.select({id:s.id,thread_id:s.thread_id,status:s.status,result:s.result,error:s.error,started_at:s.started_at,completed_at:s.completed_at}).from(s).where(drizzleOrm.and(drizzleOrm.eq(s.agent_id,t.agentId),drizzleOrm.eq(s.workspace_id,t.workspaceId),drizzleOrm.sql`${s.metadata} IS NOT NULL AND json_valid(${s.metadata}) AND json_extract(${s.metadata}, '$.' || ${t.metaKey}) = ${t.metaValue}`)).orderBy(drizzleOrm.desc(s.started_at)).limit(1).get()??null}catch(n){throw new p("DB_ERROR","Failed to find latest task by metadata",n)}finally{e.close();}}markTaskFailed(t,e,n){if(!this.dbExists())return;let r=this.openHandle(true);try{let o=new Date().toISOString(),i=n?drizzleOrm.and(drizzleOrm.eq(s.id,t),drizzleOrm.eq(s.status,"running"),drizzleOrm.eq(s.workspace_id,n)):drizzleOrm.and(drizzleOrm.eq(s.id,t),drizzleOrm.eq(s.status,"running"));r.db.update(s).set({status:"failed",error:e,completed_at:o}).where(i).run();}catch(o){throw o instanceof p?o:new p("DB_ERROR","Failed to mark task failed",o)}finally{r.close();}}findTasksByPromptHint(t,e){let n=this.resolveDbPaths(),r=new Set,o=[];for(let i of n){if(!fs.existsSync(i))continue;let a=R(i);try{let c=e?drizzleOrm.and(drizzleOrm.like(s.prompt,`%${t}%`),drizzleOrm.eq(s.workspace_id,e)):drizzleOrm.like(s.prompt,`%${t}%`),l=a.db.select().from(s).where(c).orderBy(drizzleOrm.asc(s.started_at)).all();for(let u of l)r.has(u.id)||(r.add(u.id),o.push(u));}catch(c){throw new p("DB_ERROR","Failed to find tasks by prompt hint",c)}finally{a.close();}}return o}getProviderUsage(t,e,n){if(!this.dbExists())return [];let r=this.openHandle(false);try{let o=drizzleOrm.sql`
175
+ `).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(o){throw new p("DB_ERROR","Failed to get agent usage trend",o)}finally{r.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(r){throw new p("DB_ERROR","Failed to find task for stop",r)}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}).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 p("DB_ERROR","Failed to find latest task by metadata",s)}finally{e.close();}}markTaskFailed(t,e,s){if(!this.dbExists())return;let r=this.openHandle(true);try{let o=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"));r.db.update(n).set({status:"failed",error:e,completed_at:o}).where(a).run();}catch(o){throw o instanceof p?o:new p("DB_ERROR","Failed to mark task failed",o)}finally{r.close();}}findTasksByPromptHint(t,e){let s=this.resolveDbPaths(),r=new Set,o=[];for(let a of s){if(!fs.existsSync(a))continue;let i=T(a);try{let c=e?drizzleOrm.and(drizzleOrm.like(n.prompt,`%${t}%`),drizzleOrm.eq(n.workspace_id,e)):drizzleOrm.like(n.prompt,`%${t}%`),l=i.db.select().from(n).where(c).orderBy(drizzleOrm.asc(n.started_at)).all();for(let u of l)r.has(u.id)||(r.add(u.id),o.push(u));}catch(c){throw new p("DB_ERROR","Failed to find tasks by prompt hint",c)}finally{i.close();}}return o}getProviderUsage(t,e,s){if(!this.dbExists())return [];let r=this.openHandle(false);try{let o=drizzleOrm.sql`
176
176
  CASE
177
- WHEN ${s.model} LIKE 'claude-%' OR ${s.model} IN ('opus', 'sonnet', 'haiku', 'opus[1m]', 'sonnet[1m]') THEN 'claude'
178
- WHEN ${s.model} LIKE 'gpt-%' OR ${s.model} LIKE 'codex-%' THEN 'codex'
179
- WHEN ${s.model} LIKE 'gemini-%' THEN 'gemini'
180
- WHEN ${s.model} LIKE 'zai-%' OR ${s.model} LIKE 'openrouter/z-ai/%' THEN 'opencode'
181
- WHEN ${s.model} LIKE 'minimax/%' THEN 'minimax'
182
- WHEN ${s.model} LIKE 'qwen%' THEN 'qwen'
177
+ WHEN ${n.model} LIKE 'claude-%' OR ${n.model} IN ('opus', 'sonnet', 'haiku', 'opus[1m]', 'sonnet[1m]') THEN 'claude'
178
+ WHEN ${n.model} LIKE 'gpt-%' OR ${n.model} LIKE 'codex-%' THEN 'codex'
179
+ WHEN ${n.model} LIKE 'gemini-%' THEN 'gemini'
180
+ WHEN ${n.model} LIKE 'zai-%' OR ${n.model} LIKE 'openrouter/z-ai/%' THEN 'opencode'
181
+ WHEN ${n.model} LIKE 'minimax/%' THEN 'minimax'
182
+ WHEN ${n.model} LIKE 'qwen%' THEN 'qwen'
183
183
  ELSE 'unknown'
184
184
  END
185
- `,i=drizzleOrm.sql`
186
- COALESCE(${s.input_tokens}, 0)
185
+ `,a=drizzleOrm.sql`
186
+ COALESCE(${n.input_tokens}, 0)
187
187
  + CASE
188
- WHEN ${s.started_at} >= ${K}
188
+ WHEN ${n.started_at} >= ${j}
189
189
  AND (
190
- ${s.crewx_version} IS NULL
191
- OR (${s.crewx_version} LIKE '0.8.%' AND ${s.crewx_version} NOT LIKE '0.8.9%')
192
- OR (${s.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${s.crewx_version}, ${j}) AS INTEGER) < ${G})
190
+ ${n.crewx_version} IS NULL
191
+ OR (${n.crewx_version} LIKE '0.8.%' AND ${n.crewx_version} NOT LIKE '0.8.9%')
192
+ OR (${n.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${n.crewx_version}, ${G}) AS INTEGER) < ${X})
193
193
  )
194
- THEN COALESCE(${s.cached_input_tokens}, 0)
194
+ THEN COALESCE(${n.cached_input_tokens}, 0)
195
195
  ELSE 0
196
196
  END
197
- `,a=n?drizzleOrm.sql`WHERE ${s.status} IN ('completed', 'success') AND ${s.started_at} >= ${t} AND ${s.started_at} < ${e} AND ${s.workspace_id} = ${n}`:drizzleOrm.sql`WHERE ${s.status} IN ('completed', 'success') AND ${s.started_at} >= ${t} AND ${s.started_at} < ${e}`;return r.db.all(drizzleOrm.sql`
197
+ `,i=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 r.db.all(drizzleOrm.sql`
198
198
  SELECT
199
199
  ${o} AS provider,
200
200
  COUNT(*) AS total_tasks,
201
- COALESCE(SUM(${i}), 0) AS input_tokens,
202
- COALESCE(SUM(${s.output_tokens}), 0) AS output_tokens,
203
- COALESCE(SUM(${s.cached_input_tokens}), 0) AS cached_input_tokens,
204
- COALESCE(SUM(${s.cost_usd}), 0) AS cost_usd,
205
- COALESCE(SUM(${s.duration_ms}), 0) AS active_duration_ms,
206
- MAX(${s.completed_at}) AS last_active_at
207
- FROM ${s}
208
- ${a}
201
+ COALESCE(SUM(${a}), 0) AS input_tokens,
202
+ COALESCE(SUM(${n.output_tokens}), 0) AS output_tokens,
203
+ COALESCE(SUM(${n.cached_input_tokens}), 0) AS cached_input_tokens,
204
+ COALESCE(SUM(${n.cost_usd}), 0) AS cost_usd,
205
+ COALESCE(SUM(${n.duration_ms}), 0) AS active_duration_ms,
206
+ MAX(${n.completed_at}) AS last_active_at
207
+ FROM ${n}
208
+ ${i}
209
209
  GROUP BY provider
210
- ORDER BY (COALESCE(SUM(${i}), 0) + COALESCE(SUM(${s.output_tokens}), 0)) DESC
211
- `).map(l=>({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}))}catch(o){throw new p("DB_ERROR","Failed to get provider usage",o)}finally{r.close();}}getModelUsage(t,e,n){if(!this.dbExists())return [];let r=this.openHandle(false);try{let o=drizzleOrm.sql`
210
+ ORDER BY (COALESCE(SUM(${a}), 0) + COALESCE(SUM(${n.output_tokens}), 0)) DESC
211
+ `).map(l=>({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}))}catch(o){throw new p("DB_ERROR","Failed to get provider usage",o)}finally{r.close();}}getModelUsage(t,e,s){if(!this.dbExists())return [];let r=this.openHandle(false);try{let o=drizzleOrm.sql`
212
212
  CASE
213
- WHEN ${s.model} LIKE 'claude-%' OR ${s.model} IN ('opus', 'sonnet', 'haiku', 'opus[1m]', 'sonnet[1m]') THEN 'claude'
214
- WHEN ${s.model} LIKE 'gpt-%' OR ${s.model} LIKE 'codex-%' THEN 'codex'
215
- WHEN ${s.model} LIKE 'gemini-%' THEN 'gemini'
216
- WHEN ${s.model} LIKE 'zai-%' OR ${s.model} LIKE 'openrouter/z-ai/%' THEN 'opencode'
217
- WHEN ${s.model} LIKE 'minimax/%' THEN 'minimax'
218
- WHEN ${s.model} LIKE 'qwen%' THEN 'qwen'
213
+ WHEN ${n.model} LIKE 'claude-%' OR ${n.model} IN ('opus', 'sonnet', 'haiku', 'opus[1m]', 'sonnet[1m]') THEN 'claude'
214
+ WHEN ${n.model} LIKE 'gpt-%' OR ${n.model} LIKE 'codex-%' THEN 'codex'
215
+ WHEN ${n.model} LIKE 'gemini-%' THEN 'gemini'
216
+ WHEN ${n.model} LIKE 'zai-%' OR ${n.model} LIKE 'openrouter/z-ai/%' THEN 'opencode'
217
+ WHEN ${n.model} LIKE 'minimax/%' THEN 'minimax'
218
+ WHEN ${n.model} LIKE 'qwen%' THEN 'qwen'
219
219
  ELSE 'unknown'
220
220
  END
221
- `,i=drizzleOrm.sql`
222
- COALESCE(${s.input_tokens}, 0)
221
+ `,a=drizzleOrm.sql`
222
+ COALESCE(${n.input_tokens}, 0)
223
223
  + CASE
224
- WHEN ${s.started_at} >= ${K}
224
+ WHEN ${n.started_at} >= ${j}
225
225
  AND (
226
- ${s.crewx_version} IS NULL
227
- OR (${s.crewx_version} LIKE '0.8.%' AND ${s.crewx_version} NOT LIKE '0.8.9%')
228
- OR (${s.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${s.crewx_version}, ${j}) AS INTEGER) < ${G})
226
+ ${n.crewx_version} IS NULL
227
+ OR (${n.crewx_version} LIKE '0.8.%' AND ${n.crewx_version} NOT LIKE '0.8.9%')
228
+ OR (${n.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${n.crewx_version}, ${G}) AS INTEGER) < ${X})
229
229
  )
230
- THEN COALESCE(${s.cached_input_tokens}, 0)
230
+ THEN COALESCE(${n.cached_input_tokens}, 0)
231
231
  ELSE 0
232
232
  END
233
- `,a=n?drizzleOrm.sql`WHERE ${s.status} IN ('completed', 'success') AND ${s.started_at} >= ${t} AND ${s.started_at} < ${e} AND ${s.workspace_id} = ${n}`:drizzleOrm.sql`WHERE ${s.status} IN ('completed', 'success') AND ${s.started_at} >= ${t} AND ${s.started_at} < ${e}`,c=r.db.all(drizzleOrm.sql`
233
+ `,i=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}`,c=r.db.all(drizzleOrm.sql`
234
234
  SELECT
235
- ${s.model} AS model,
235
+ ${n.model} AS model,
236
236
  ${o} AS provider,
237
237
  COUNT(*) AS total_tasks,
238
- COALESCE(SUM(${i}), 0) AS input_tokens,
239
- COALESCE(SUM(${s.output_tokens}), 0) AS output_tokens,
240
- COALESCE(SUM(${s.cached_input_tokens}), 0) AS cached_input_tokens,
241
- COALESCE(SUM(${s.cost_usd}), 0) AS cost_usd,
242
- COALESCE(SUM(${s.duration_ms}), 0) AS active_duration_ms,
243
- MAX(${s.completed_at}) AS last_active_at
244
- FROM ${s}
245
- ${a}
246
- GROUP BY ${s.model}
247
- `),l=new Map;for(let u of c){let h=Bt(u.model??""),m=l.get(h);m?(m.totalTasks+=u.total_tasks,m.inputTokens+=u.input_tokens,m.outputTokens+=u.output_tokens,m.cachedInputTokens+=u.cached_input_tokens,m.costUsd+=u.cost_usd,m.totalTokens+=u.input_tokens+u.output_tokens,m.activeDurationMs+=u.active_duration_ms??0,u.last_active_at&&(!m.lastActiveAt||u.last_active_at>m.lastActiveAt)&&(m.lastActiveAt=u.last_active_at)):l.set(h,{model:h,provider:u.provider,totalTasks:u.total_tasks,inputTokens:u.input_tokens,outputTokens:u.output_tokens,cachedInputTokens:u.cached_input_tokens,costUsd:u.cost_usd,totalTokens:u.input_tokens+u.output_tokens,activeDurationMs:u.active_duration_ms??0,lastActiveAt:u.last_active_at??null});}return Array.from(l.values()).sort((u,h)=>h.costUsd-u.costUsd)}catch(o){throw new p("DB_ERROR","Failed to get model usage",o)}finally{r.close();}}getTasksForReport(t,e,n){if(!this.dbExists())return [];let r=this.openHandle(false);try{let o=n?drizzleOrm.sql`WHERE ${s.started_at} >= ${t} AND ${s.started_at} < ${e} AND ${s.workspace_id} = ${n}`:drizzleOrm.sql`WHERE ${s.started_at} >= ${t} AND ${s.started_at} < ${e}`;return r.db.all(drizzleOrm.sql`
238
+ COALESCE(SUM(${a}), 0) AS input_tokens,
239
+ COALESCE(SUM(${n.output_tokens}), 0) AS output_tokens,
240
+ COALESCE(SUM(${n.cached_input_tokens}), 0) AS cached_input_tokens,
241
+ COALESCE(SUM(${n.cost_usd}), 0) AS cost_usd,
242
+ COALESCE(SUM(${n.duration_ms}), 0) AS active_duration_ms,
243
+ MAX(${n.completed_at}) AS last_active_at
244
+ FROM ${n}
245
+ ${i}
246
+ GROUP BY ${n.model}
247
+ `),l=new Map;for(let u of c){let h=Ht(u.model??""),f=l.get(h);f?(f.totalTasks+=u.total_tasks,f.inputTokens+=u.input_tokens,f.outputTokens+=u.output_tokens,f.cachedInputTokens+=u.cached_input_tokens,f.costUsd+=u.cost_usd,f.totalTokens+=u.input_tokens+u.output_tokens,f.activeDurationMs+=u.active_duration_ms??0,u.last_active_at&&(!f.lastActiveAt||u.last_active_at>f.lastActiveAt)&&(f.lastActiveAt=u.last_active_at)):l.set(h,{model:h,provider:u.provider,totalTasks:u.total_tasks,inputTokens:u.input_tokens,outputTokens:u.output_tokens,cachedInputTokens:u.cached_input_tokens,costUsd:u.cost_usd,totalTokens:u.input_tokens+u.output_tokens,activeDurationMs:u.active_duration_ms??0,lastActiveAt:u.last_active_at??null});}return Array.from(l.values()).sort((u,h)=>h.costUsd-u.costUsd)}catch(o){throw new p("DB_ERROR","Failed to get model usage",o)}finally{r.close();}}getTasksForReport(t,e,s){if(!this.dbExists())return [];let r=this.openHandle(false);try{let o=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 r.db.all(drizzleOrm.sql`
248
248
  SELECT
249
- ${s.thread_id} AS thread_id,
250
- ${s.agent_id} AS agent_id,
251
- ${s.started_at} AS started_at,
252
- ${s.status} AS status,
253
- ${s.error} AS error,
254
- ${s.exit_code} AS exit_code
255
- FROM ${s}
249
+ ${n.thread_id} AS thread_id,
250
+ ${n.agent_id} AS agent_id,
251
+ ${n.started_at} AS started_at,
252
+ ${n.status} AS status,
253
+ ${n.error} AS error,
254
+ ${n.exit_code} AS exit_code
255
+ FROM ${n}
256
256
  ${o}
257
- ORDER BY ${s.started_at} ASC
258
- `).map(a=>({threadId:a.thread_id,agentId:a.agent_id,startedAt:a.started_at,status:a.status,error:a.error,exitCode:a.exit_code}))}catch(o){throw new p("DB_ERROR","Failed to get tasks for report",o)}finally{r.close();}}};var bt=class extends F{name="sqlite-tracing";unsubs=[];dbPath;version;constructor(t){super(),this.dbPath=U.join(t?.dbRoot??Zt.homedir(),".crewx","crewx.db"),this.version=t?.version??"unknown";}attach(t){let e=new _t({dbPath:this.dbPath}),n=process.cwd(),o=fs.existsSync(U.join(n,"crewx.yaml"))||fs.existsSync(U.join(n,"crewx.yml"))?Nt(n):null,i=process.argv.join(" ");this.unsubs.push(t.on("task:start",a=>{try{let c=a.callerAgentId??null,l=a.parentTaskId??null,u=a.rootTraceId??a.traceId,h=a.metadata?JSON.stringify(a.metadata):JSON.stringify({provider:a.provider??"cli/claude"});e.startTask({id:a.traceId,agentId:a.agentRef.replace(/^@/,""),prompt:a.message,mode:a.mode,status:"running",pid:a.pid??null,startedAt:a.timestamp.toISOString(),crewxVersion:this.version,platform:a.platform??"cli",model:a.model??null,renderedPrompt:a.renderedPrompt??null,command:i,codingAgentCommand:a.codingAgentCommand??null,workspaceId:a.workspaceId??o,callerAgentId:c,parentTaskId:l,traceId:u,metadata:h,threadId:a.threadId??null});}catch{}}),t.on("task:output",a=>{try{e.appendLog(a.traceId,{timestamp:a.timestamp.toISOString(),level:a.level??"stdout",message:a.output});}catch{}}),t.on("task:end",a=>{try{let c=typeof a.metadata?.runEpoch=="number"?a.metadata.runEpoch:null;e.finishTask({id:a.traceId,status:a.error?"failed":"success",result:a.result??null,error:a.error?JSON.stringify(a.error):null,completedAt:a.timestamp.toISOString(),durationMs:a.durationMs,exitCode:a.exitCode??null,inputTokens:a.inputTokens??0,outputTokens:a.outputTokens??0,cachedInputTokens:a.cachedInputTokens??0,costUsd:a.costUsd??0,model:a.model??null,runEpoch:c});}catch{}}));}detach(t){this.unsubs.forEach(e=>e()),this.unsubs=[];}};var pt=class extends V{dbPath;constructor(t={}){super(),t.dbPath?this.dbPath=t.dbPath:t.dbRoot&&(this.dbPath=U.join(t.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(t){let e=this.resolveDbPath();if(t){let r=U.dirname(e);fs.existsSync(r)||fs.mkdirSync(r,{recursive:true});}else if(!fs.existsSync(e))throw new p("NOT_FOUND","Database not found");let n=R(e);if(t)try{it(n.db,e);}catch(r){throw n.close(),r}return n}validateWorkspaceId(t,e){return t.db.select({id:Q.id}).from(Q).where(drizzleOrm.eq(Q.id,e)).limit(1).get()?e:null}topLevelTaskPredicateSql(t="child"){return drizzleOrm.sql.raw(`NOT EXISTS (
257
+ ORDER BY ${n.started_at} ASC
258
+ `).map(i=>({threadId:i.thread_id,agentId:i.agent_id,startedAt:i.started_at,status:i.status,error:i.error,exitCode:i.exit_code}))}catch(o){throw new p("DB_ERROR","Failed to get tasks for report",o)}finally{r.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 r=s.length>0?drizzleOrm.and(...s):void 0,o=(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(r).orderBy(o).limit(t.limit).all():e.db.select(a).from(n).where(r).orderBy(o).all()}catch(s){throw new p("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,r=t.maxTurnsPerThread??4,o=[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.notLike(n.metadata,'%"kind":"workflow_card"%')),drizzleOrm.or(drizzleOrm.isNull(n.metadata),drizzleOrm.notLike(n.metadata,'%"retriedFromTaskId"%'))];t.workspaceId&&o.push(drizzleOrm.eq(n.workspace_id,t.workspaceId)),t.from&&o.push(drizzleOrm.gte(n.started_at,t.from)),t.to&&o.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(...o)).orderBy(drizzleOrm.asc(n.started_at),drizzleOrm.asc(n.id)).all(),i=new Map;for(let l of a){if(!l.thread_id)continue;let u={id:l.id,agentId:l.agent_id,status:l.status,prompt:l.prompt,startedAt:l.started_at,completedAt:l.completed_at},h=i.get(l.thread_id);h?h.push(u):i.set(l.thread_id,[u]);}let c=[];for(let[l,u]of i){let h=u.filter(f=>f.agentId===t.targetAgentId).length;h<2||c.push({threadId:l,targetAgentTurnCount:h,turns:u});}return c.sort((l,u)=>{let h=l.turns[l.turns.length-1].startedAt,f=u.turns[u.turns.length-1].startedAt;return h<f?1:h>f?-1:0}),c.slice(0,s).map(l=>({threadId:l.threadId,targetAgentTurnCount:l.targetAgentTurnCount,turns:l.turns.slice(-r)}))}catch(s){throw new p("DB_ERROR","Failed to find thread chains",s)}finally{e.close();}}};var Rt=class extends q{name="sqlite-tracing";unsubs=[];dbPath;version;constructor(t){super(),this.dbPath=B.join(t?.dbRoot??ee.homedir(),".crewx","crewx.db"),this.version=t?.version??"unknown";}attach(t){let e=new ft({dbPath:this.dbPath}),s=process.cwd(),o=fs.existsSync(B.join(s,"crewx.yaml"))||fs.existsSync(B.join(s,"crewx.yml"))?Dt(s):null,a=process.argv.join(" ");this.unsubs.push(t.on("task:start",i=>{try{let c=i.callerAgentId??null,l=i.parentTaskId??null,u=i.rootTraceId??i.traceId,h=i.metadata?JSON.stringify(i.metadata):JSON.stringify({provider:i.provider??"cli/claude"});e.startTask({id:i.traceId,agentId:i.agentRef.replace(/^@/,""),prompt:i.message,mode:i.mode,status:"running",pid:i.pid??null,startedAt:i.timestamp.toISOString(),crewxVersion:this.version,platform:i.platform??"cli",model:i.model??null,renderedPrompt:i.renderedPrompt??null,command:a,codingAgentCommand:i.codingAgentCommand??null,workspaceId:i.workspaceId??o,callerAgentId:c,parentTaskId:l,traceId:u,metadata:h,threadId:i.threadId??null});}catch{}}),t.on("task:output",i=>{try{e.appendLog(i.traceId,{timestamp:i.timestamp.toISOString(),level:i.level??"stdout",message:i.output});}catch{}}),t.on("task:end",i=>{try{let c=typeof i.metadata?.runEpoch=="number"?i.metadata.runEpoch:null;e.finishTask({id:i.traceId,status:i.error?"failed":"success",result:i.result??null,error:i.error?JSON.stringify(i.error):null,completedAt:i.timestamp.toISOString(),durationMs:i.durationMs,exitCode:i.exitCode??null,inputTokens:i.inputTokens??0,outputTokens:i.outputTokens??0,cachedInputTokens:i.cachedInputTokens??0,costUsd:i.costUsd??0,model:i.model??null,runEpoch:c});}catch{}}));}detach(t){this.unsubs.forEach(e=>e()),this.unsubs=[];}};var gt=class extends Z{dbPath;constructor(t={}){super(),t.dbPath?this.dbPath=t.dbPath:t.dbRoot&&(this.dbPath=B.join(t.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(t){let e=this.resolveDbPath();if(t){let r=B.dirname(e);fs.existsSync(r)||fs.mkdirSync(r,{recursive:true});}else if(!fs.existsSync(e))throw new p("NOT_FOUND","Database not found");let s=T(e);if(t)try{lt(s.db,e);}catch(r){throw s.close(),r}return s}validateWorkspaceId(t,e){return t.db.select({id:tt.id}).from(tt).where(drizzleOrm.eq(tt.id,e)).limit(1).get()?e:null}topLevelTaskPredicateSql(t="child"){return drizzleOrm.sql.raw(`NOT EXISTS (
259
259
  SELECT 1 FROM tasks parent
260
260
  WHERE parent.id = ${t}.parent_task_id
261
261
  AND parent.thread_id = ${t}.thread_id
262
- )`)}findAllThreads(t){let e=this.resolveDbPaths(),n=new Set,r=[];for(let o of e){if(!fs.existsSync(o))continue;let i=R(o);try{let a=t?drizzleOrm.eq(_.workspace_id,t):void 0,c=i.db.select().from(_).where(a).orderBy(drizzleOrm.desc(_.updated_at)).all();for(let l of c)n.has(l.id)||(n.add(l.id),r.push(l));}catch(a){throw new p("DB_ERROR","Failed to find all threads",a)}finally{i.close();}}return r}findThreadsByIdsOrTitles(t,e){if(t.length===0)return [];let n=this.resolveDbPaths(),r=new Set,o=[];for(let i of n){if(!fs.existsSync(i))continue;let a=R(i);try{let c=drizzleOrm.or(drizzleOrm.inArray(_.id,t),drizzleOrm.inArray(_.title,t)),l=e?drizzleOrm.and(c,drizzleOrm.eq(_.workspace_id,e)):c,u=a.db.select().from(_).where(l).orderBy(drizzleOrm.desc(_.updated_at)).all();for(let h of u)r.has(h.id)||(r.add(h.id),o.push(h));}catch(c){throw new p("DB_ERROR","Failed to find threads by ids or titles",c)}finally{a.close();}}return o}findThreadById(t,e){let n=this.resolveDbPaths();for(let r of n){if(!fs.existsSync(r))continue;let o=R(r);try{let i=drizzleOrm.eq(_.id,t),a=e?drizzleOrm.and(i,drizzleOrm.eq(_.workspace_id,e)):i,c=o.db.select().from(_).where(a).limit(1).get()??void 0;if(c)return c}catch(i){throw new p("DB_ERROR","Failed to find thread by id",i)}finally{o.close();}}}threadExists(t,e){let n=this.resolveDbPaths();for(let r of n){if(!fs.existsSync(r))continue;let o=R(r);try{let i=drizzleOrm.eq(_.id,t),a=e?drizzleOrm.and(i,drizzleOrm.eq(_.workspace_id,e)):i;if(o.db.select({id:_.id}).from(_).where(a).limit(1).get())return !0}catch(i){throw new p("DB_ERROR","Failed to check thread existence",i)}finally{o.close();}}return false}aggregateTaskStats(t,e){let n=this.resolveDbPaths(),r=0,o=0,i=0,a=0,c=0,l=new Set;for(let u of n){if(!fs.existsSync(u))continue;let h=R(u);try{let m=h.db.get(drizzleOrm.sql`
262
+ )`)}findAllThreads(t){let e=this.resolveDbPaths(),s=new Set,r=[];for(let o of e){if(!fs.existsSync(o))continue;let a=T(o);try{let i=t?drizzleOrm.eq(_.workspace_id,t):void 0,c=a.db.select().from(_).where(i).orderBy(drizzleOrm.desc(_.updated_at)).all();for(let l of c)s.has(l.id)||(s.add(l.id),r.push(l));}catch(i){throw new p("DB_ERROR","Failed to find all threads",i)}finally{a.close();}}return r}findThreadsByIdsOrTitles(t,e){if(t.length===0)return [];let s=this.resolveDbPaths(),r=new Set,o=[];for(let a of s){if(!fs.existsSync(a))continue;let i=T(a);try{let c=drizzleOrm.or(drizzleOrm.inArray(_.id,t),drizzleOrm.inArray(_.title,t)),l=e?drizzleOrm.and(c,drizzleOrm.eq(_.workspace_id,e)):c,u=i.db.select().from(_).where(l).orderBy(drizzleOrm.desc(_.updated_at)).all();for(let h of u)r.has(h.id)||(r.add(h.id),o.push(h));}catch(c){throw new p("DB_ERROR","Failed to find threads by ids or titles",c)}finally{i.close();}}return o}findThreadById(t,e){let s=this.resolveDbPaths();for(let r of s){if(!fs.existsSync(r))continue;let o=T(r);try{let a=drizzleOrm.eq(_.id,t),i=e?drizzleOrm.and(a,drizzleOrm.eq(_.workspace_id,e)):a,c=o.db.select().from(_).where(i).limit(1).get()??void 0;if(c)return c}catch(a){throw new p("DB_ERROR","Failed to find thread by id",a)}finally{o.close();}}}threadExists(t,e){let s=this.resolveDbPaths();for(let r of s){if(!fs.existsSync(r))continue;let o=T(r);try{let a=drizzleOrm.eq(_.id,t),i=e?drizzleOrm.and(a,drizzleOrm.eq(_.workspace_id,e)):a;if(o.db.select({id:_.id}).from(_).where(i).limit(1).get())return !0}catch(a){throw new p("DB_ERROR","Failed to check thread existence",a)}finally{o.close();}}return false}aggregateTaskStats(t,e){let s=this.resolveDbPaths(),r=0,o=0,a=0,i=0,c=0,l=new Set;for(let u of s){if(!fs.existsSync(u))continue;let h=T(u);try{let f=h.db.get(drizzleOrm.sql`
263
263
  SELECT
264
264
  count(*) AS cnt,
265
265
  COALESCE(SUM(child.input_tokens), 0) AS total_input,
@@ -270,13 +270,13 @@ ${n.join(`
270
270
  WHERE child.thread_id = ${t}
271
271
  AND ${this.topLevelTaskPredicateSql()}
272
272
  ${e?drizzleOrm.sql`AND child.workspace_id = ${e}`:drizzleOrm.sql``}
273
- `);m&&(r+=m.cnt,o+=m.total_input,i+=m.total_output,a+=m.total_cached,c+=m.total_cost);let y=h.db.all(drizzleOrm.sql`
273
+ `);f&&(r+=f.cnt,o+=f.total_input,a+=f.total_output,i+=f.total_cached,c+=f.total_cost);let R=h.db.all(drizzleOrm.sql`
274
274
  SELECT DISTINCT child.agent_id FROM tasks child
275
275
  WHERE child.thread_id = ${t}
276
276
  AND child.agent_id IS NOT NULL AND child.agent_id != ''
277
277
  AND ${this.topLevelTaskPredicateSql()}
278
278
  ${e?drizzleOrm.sql`AND child.workspace_id = ${e}`:drizzleOrm.sql``}
279
- `);for(let A of y)l.add(A.agent_id);}catch(m){throw new p("DB_ERROR","Failed to aggregate task stats",m)}finally{h.close();}}return {taskCount:r,inputTokens:o,outputTokens:i,cachedInputTokens:a,costUsd:c,agentIds:Array.from(l)}}findTopLevelTasks(t,e,n){let r=this.resolveDbPaths(),o=new Set,i=[];for(let a of r){if(!fs.existsSync(a))continue;let c=R(a);try{let l;n!==void 0?l=c.db.all(drizzleOrm.sql`
279
+ `);for(let A of R)l.add(A.agent_id);}catch(f){throw new p("DB_ERROR","Failed to aggregate task stats",f)}finally{h.close();}}return {taskCount:r,inputTokens:o,outputTokens:a,cachedInputTokens:i,costUsd:c,agentIds:Array.from(l)}}findTopLevelTasks(t,e,s){let r=this.resolveDbPaths(),o=new Set,a=[];for(let i of r){if(!fs.existsSync(i))continue;let c=T(i);try{let l;s!==void 0?l=c.db.all(drizzleOrm.sql`
280
280
  SELECT * FROM (
281
281
  SELECT child.*,
282
282
  ROW_NUMBER() OVER (PARTITION BY child.agent_id ORDER BY child.started_at DESC) AS rn
@@ -285,7 +285,7 @@ ${n.join(`
285
285
  AND ${this.topLevelTaskPredicateSql()}
286
286
  ${e?drizzleOrm.sql`AND child.workspace_id = ${e}`:drizzleOrm.sql``}
287
287
  ) ranked
288
- WHERE rn <= ${n}
288
+ WHERE rn <= ${s}
289
289
  ORDER BY started_at ASC
290
290
  `):l=c.db.all(drizzleOrm.sql`
291
291
  SELECT child.* FROM tasks child
@@ -293,17 +293,17 @@ ${n.join(`
293
293
  AND ${this.topLevelTaskPredicateSql()}
294
294
  ${e?drizzleOrm.sql`AND child.workspace_id = ${e}`:drizzleOrm.sql``}
295
295
  ORDER BY child.started_at ASC
296
- `);for(let u of l)o.has(u.id)||(o.add(u.id),i.push(u));}catch(l){throw new p("DB_ERROR","Failed to find top-level tasks",l)}finally{c.close();}}if(n!==void 0&&r.length>1){let a=new Map;for(let c of i){let l=c.agent_id??"";a.has(l)||a.set(l,[]),a.get(l).push(c);}i=[];for(let c of a.values())c.sort((l,u)=>(u.started_at??"").localeCompare(l.started_at??"")),i.push(...c.slice(0,n));i.sort((c,l)=>(c.started_at??"").localeCompare(l.started_at??""));}return i}findAllTasks(t,e){let n=this.resolveDbPaths(),r=new Set,o=[];for(let i of n){if(!fs.existsSync(i))continue;let a=R(i);try{let c=drizzleOrm.eq(s.thread_id,t),l=e?drizzleOrm.and(c,drizzleOrm.eq(s.workspace_id,e)):c,u=a.db.select().from(s).where(l).orderBy(drizzleOrm.asc(s.started_at)).all();for(let h of u)r.has(h.id)||(r.add(h.id),o.push(h));}catch(c){throw new p("DB_ERROR","Failed to find all tasks for thread",c)}finally{a.close();}}return o}findTaskById(t,e,n){let r=this.resolveDbPaths();for(let o of r){if(!fs.existsSync(o))continue;let i=R(o);try{let a=drizzleOrm.and(drizzleOrm.eq(s.id,e),drizzleOrm.eq(s.thread_id,t)),c=n?drizzleOrm.and(a,drizzleOrm.eq(s.workspace_id,n)):a,l=i.db.select().from(s).where(c).limit(1).get();if(!l)continue;let u=i.db.select().from(s).where(drizzleOrm.eq(s.parent_task_id,l.id)).orderBy(drizzleOrm.asc(s.started_at)).all();return {task:l,children:u}}catch(a){throw new p("DB_ERROR","Failed to find task by id",a)}finally{i.close();}}}batchFetchTasksQuery(t,e){return drizzleOrm.sql`
296
+ `);for(let u of l)o.has(u.id)||(o.add(u.id),a.push(u));}catch(l){throw new p("DB_ERROR","Failed to find top-level tasks",l)}finally{c.close();}}if(s!==void 0&&r.length>1){let i=new Map;for(let c of a){let l=c.agent_id??"";i.has(l)||i.set(l,[]),i.get(l).push(c);}a=[];for(let c of i.values())c.sort((l,u)=>(u.started_at??"").localeCompare(l.started_at??"")),a.push(...c.slice(0,s));a.sort((c,l)=>(c.started_at??"").localeCompare(l.started_at??""));}return a}findAllTasks(t,e){let s=this.resolveDbPaths(),r=new Set,o=[];for(let a of s){if(!fs.existsSync(a))continue;let i=T(a);try{let c=drizzleOrm.eq(n.thread_id,t),l=e?drizzleOrm.and(c,drizzleOrm.eq(n.workspace_id,e)):c,u=i.db.select().from(n).where(l).orderBy(drizzleOrm.asc(n.started_at)).all();for(let h of u)r.has(h.id)||(r.add(h.id),o.push(h));}catch(c){throw new p("DB_ERROR","Failed to find all tasks for thread",c)}finally{i.close();}}return o}findTaskById(t,e,s){let r=this.resolveDbPaths();for(let o of r){if(!fs.existsSync(o))continue;let a=T(o);try{let i=drizzleOrm.and(drizzleOrm.eq(n.id,e),drizzleOrm.eq(n.thread_id,t)),c=s?drizzleOrm.and(i,drizzleOrm.eq(n.workspace_id,s)):i,l=a.db.select().from(n).where(c).limit(1).get();if(!l)continue;let u=a.db.select().from(n).where(drizzleOrm.eq(n.parent_task_id,l.id)).orderBy(drizzleOrm.asc(n.started_at)).all();return {task:l,children:u}}catch(i){throw new p("DB_ERROR","Failed to find task by id",i)}finally{a.close();}}}batchFetchTasksQuery(t,e){return drizzleOrm.sql`
297
297
  SELECT child.id, child.thread_id, child.agent_id, child.status,
298
298
  child.parent_task_id, child.started_at, child.completed_at,
299
299
  child.duration_ms, child.input_tokens, child.output_tokens,
300
300
  child.cost_usd, child.error
301
301
  FROM tasks child INDEXED BY idx_tasks_thread_id
302
- WHERE child.thread_id IN (${drizzleOrm.sql.join(t.map(n=>drizzleOrm.sql`${n}`),drizzleOrm.sql`, `)})
302
+ WHERE child.thread_id IN (${drizzleOrm.sql.join(t.map(s=>drizzleOrm.sql`${s}`),drizzleOrm.sql`, `)})
303
303
  AND ${this.topLevelTaskPredicateSql()}
304
304
  ${e?drizzleOrm.sql`AND child.workspace_id = ${e}`:drizzleOrm.sql``}
305
305
  ORDER BY child.started_at ASC
306
- `}batchFetchTasks(t,e){let n=new Map;if(t.length===0)return n;let r=this.resolveDbPaths();for(let o of r){if(!fs.existsSync(o))continue;let i=R(o);try{let a=i.db.all(this.batchFetchTasksQuery(t,e));for(let c of a){let l=c.thread_id;n.has(l)||n.set(l,[]),n.get(l).push(c);}}catch(a){throw new p("DB_ERROR","Failed to batch fetch tasks",a)}finally{i.close();}}return n}explainBatchFetchTasksPlan(t,e){let n=this.resolveDbPaths();for(let r of n){if(!fs.existsSync(r))continue;let o=R(r);try{return o.db.all(drizzleOrm.sql`EXPLAIN QUERY PLAN ${this.batchFetchTasksQuery(t,e)}`).map(a=>a.detail)}finally{o.close();}}return []}updateThreadTitle(t,e,n){if(!this.dbExists())return;let r=this.openHandle(true);try{let o=drizzleOrm.eq(_.id,t),i=n?drizzleOrm.and(o,drizzleOrm.eq(_.workspace_id,n)):o;if(!r.db.select({id:_.id}).from(_).where(i).limit(1).get())return;r.db.update(_).set({title:e,title_locked:1,updated_at:new Date().toISOString()}).where(drizzleOrm.eq(_.id,t)).run();}catch(o){throw o instanceof p?o:new p("DB_ERROR","Failed to update thread title",o)}finally{r.close();}}upsertThread(t,e){let n=this.openHandle(true);try{let r=e.workspaceId?this.validateWorkspaceId(n,e.workspaceId):null,o=new Date().toISOString();if(n.db.select({id:_.id,message_count:_.message_count}).from(_).where(drizzleOrm.eq(_.id,t)).limit(1).get()){let a={updated_at:o};e.title!==void 0&&(a.title=e.title),e.titleLocked!==void 0&&(a.title_locked=e.titleLocked?1:0),n.db.update(_).set(a).where(drizzleOrm.eq(_.id,t)).run();}else n.db.insert(_).values({id:t,platform:e.platform,workspace_id:r,title:e.title??null,title_locked:e.titleLocked?1:0,message_count:0,created_at:o,updated_at:o}).run();}catch(r){throw r instanceof p?r:new p("DB_ERROR","Failed to upsert thread",r)}finally{n.close();}}ensureThread(t,e,n){let r=this.openHandle(true);try{let o=n?this.validateWorkspaceId(r,n):null,i=r.db.select({id:_.id,platform:_.platform,workspace_id:_.workspace_id}).from(_).where(drizzleOrm.eq(_.id,t)).limit(1).get();if(i){o&&!i.workspace_id&&r.db.update(_).set({workspace_id:o}).where(drizzleOrm.eq(_.id,t)).run();return}let a=new Date().toISOString();r.db.insert(_).values({id:t,platform:e,workspace_id:o,message_count:0,created_at:a,updated_at:a}).run();}catch(o){throw o instanceof p?o:new p("DB_ERROR","Failed to ensure thread",o)}finally{r.close();}}saveUserMessage(t,e,n){if(!this.dbExists())return {firstMessage:false};let r=this.openHandle(true);try{let o=new Date().toISOString();return {firstMessage:r.db.transaction(a=>{let l=a.select({message_count:_.message_count}).from(_).where(drizzleOrm.eq(_.id,t)).limit(1).get()?.message_count===0;return a.run(drizzleOrm.sql`
306
+ `}batchFetchTasks(t,e){let s=new Map;if(t.length===0)return s;let r=this.resolveDbPaths();for(let o of r){if(!fs.existsSync(o))continue;let a=T(o);try{let i=a.db.all(this.batchFetchTasksQuery(t,e));for(let c of i){let l=c.thread_id;s.has(l)||s.set(l,[]),s.get(l).push(c);}}catch(i){throw new p("DB_ERROR","Failed to batch fetch tasks",i)}finally{a.close();}}return s}explainBatchFetchTasksPlan(t,e){let s=this.resolveDbPaths();for(let r of s){if(!fs.existsSync(r))continue;let o=T(r);try{return o.db.all(drizzleOrm.sql`EXPLAIN QUERY PLAN ${this.batchFetchTasksQuery(t,e)}`).map(i=>i.detail)}finally{o.close();}}return []}updateThreadTitle(t,e,s){if(!this.dbExists())return;let r=this.openHandle(true);try{let o=drizzleOrm.eq(_.id,t),a=s?drizzleOrm.and(o,drizzleOrm.eq(_.workspace_id,s)):o;if(!r.db.select({id:_.id}).from(_).where(a).limit(1).get())return;r.db.update(_).set({title:e,title_locked:1,updated_at:new Date().toISOString()}).where(drizzleOrm.eq(_.id,t)).run();}catch(o){throw o instanceof p?o:new p("DB_ERROR","Failed to update thread title",o)}finally{r.close();}}upsertThread(t,e){let s=this.openHandle(true);try{let r=e.workspaceId?this.validateWorkspaceId(s,e.workspaceId):null,o=new Date().toISOString();if(s.db.select({id:_.id,message_count:_.message_count}).from(_).where(drizzleOrm.eq(_.id,t)).limit(1).get()){let i={updated_at:o};e.title!==void 0&&(i.title=e.title),e.titleLocked!==void 0&&(i.title_locked=e.titleLocked?1:0),s.db.update(_).set(i).where(drizzleOrm.eq(_.id,t)).run();}else s.db.insert(_).values({id:t,platform:e.platform,workspace_id:r,title:e.title??null,title_locked:e.titleLocked?1:0,message_count:0,created_at:o,updated_at:o}).run();}catch(r){throw r instanceof p?r:new p("DB_ERROR","Failed to upsert thread",r)}finally{s.close();}}ensureThread(t,e,s){let r=this.openHandle(true);try{let o=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){o&&!a.workspace_id&&r.db.update(_).set({workspace_id:o}).where(drizzleOrm.eq(_.id,t)).run();return}let i=new Date().toISOString();r.db.insert(_).values({id:t,platform:e,workspace_id:o,message_count:0,created_at:i,updated_at:i}).run();}catch(o){throw o instanceof p?o:new p("DB_ERROR","Failed to ensure thread",o)}finally{r.close();}}saveUserMessage(t,e,s){if(!this.dbExists())return {firstMessage:false};let r=this.openHandle(true);try{let o=new Date().toISOString();return {firstMessage:r.db.transaction(i=>{let l=i.select({message_count:_.message_count}).from(_).where(drizzleOrm.eq(_.id,t)).limit(1).get()?.message_count===0;return i.run(drizzleOrm.sql`
307
307
  UPDATE threads
308
308
  SET first_message = COALESCE(first_message, ${e}),
309
309
  title = CASE WHEN title_locked = 0 AND title IS NULL THEN substr(${e}, 1, 60) ELSE title END,
@@ -311,8 +311,8 @@ ${n.join(`
311
311
  message_count = message_count + 1,
312
312
  updated_at = ${o}
313
313
  WHERE id = ${t}
314
- `),l},{behavior:"immediate"})}}catch(o){throw o instanceof p?o:new p("DB_ERROR","Failed to save user message",o)}finally{r.close();}}saveAssistantMessage(t,e,n){if(!this.dbExists())return;let r=this.openHandle(true);try{let o=new Date().toISOString();r.db.update(_).set({last_message:e,updated_at:o}).where(drizzleOrm.eq(_.id,t)).run();}catch(o){throw o instanceof p?o:new p("DB_ERROR","Failed to save assistant message",o)}finally{r.close();}}updateThread(t,e){if(!this.dbExists())return;let n=this.openHandle(true);try{let r={updated_at:new Date().toISOString()};e.title!==void 0&&(r.title=e.title,r.title_locked=1),e.titleLocked!==void 0&&(r.title_locked=e.titleLocked?1:0),n.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{n.close();}}togglePin(t,e){let n=this.openHandle(true);try{let r=e?drizzleOrm.and(drizzleOrm.eq(_.id,t),drizzleOrm.eq(_.workspace_id,e)):drizzleOrm.eq(_.id,t),o=n.db.select({pinned:_.pinned,metadata:_.metadata}).from(_).where(r).get();if(!o)return null;let i=o.pinned?0:1,a=o.metadata?JSON.parse(o.metadata):{};if(i){let c=e?drizzleOrm.and(drizzleOrm.eq(_.pinned,1),drizzleOrm.eq(_.workspace_id,e)):drizzleOrm.eq(_.pinned,1),l=n.db.select({metadata:_.metadata}).from(_).where(c).all(),u=null;for(let h of l){let m=h.metadata?JSON.parse(h.metadata):{};typeof m.pinOrder=="number"&&(u===null||m.pinOrder<u)&&(u=m.pinOrder);}a.pinOrder=u===null?0:u-1;}else delete a.pinOrder;return n.db.update(_).set({pinned:i,metadata:Object.keys(a).length>0?JSON.stringify(a):null}).where(r).run(),{pinned:!!i}}catch(r){throw r instanceof p?r:new p("DB_ERROR","Failed to toggle pin",r)}finally{n.close();}}reorderPins(t,e){let n=this.openHandle(true);try{for(let r=0;r<t.length;r++){let o=e?drizzleOrm.and(drizzleOrm.eq(_.id,t[r]),drizzleOrm.eq(_.workspace_id,e)):drizzleOrm.eq(_.id,t[r]),i=n.db.select({metadata:_.metadata}).from(_).where(o).get();if(!i)continue;let a=i.metadata?JSON.parse(i.metadata):{};a.pinOrder=r+1,n.db.update(_).set({metadata:JSON.stringify(a)}).where(o).run();}}catch(r){throw r instanceof p?r:new p("DB_ERROR","Failed to reorder pins",r)}finally{n.close();}}toggleStar(t,e){let n=this.openHandle(true);try{let r=e?drizzleOrm.and(drizzleOrm.eq(_.id,t),drizzleOrm.eq(_.workspace_id,e)):drizzleOrm.eq(_.id,t),o=n.db.select({starred:_.starred}).from(_).where(r).get();if(!o)return null;let i=o.starred?0:1;return n.db.update(_).set({starred:i}).where(r).run(),{starred:!!i}}catch(r){throw r instanceof p?r:new p("DB_ERROR","Failed to toggle star",r)}finally{n.close();}}resolveOverdriveForRequest(t,e,n,r){let i=this.openHandle(true);try{let a=e?drizzleOrm.and(drizzleOrm.eq(_.id,t),drizzleOrm.eq(_.workspace_id,e)):drizzleOrm.eq(_.id,t);return i.db.transaction(l=>{let u=l.select({metadata:_.metadata}).from(_).where(a).get();if(!u)return null;let h=u.metadata?JSON.parse(u.metadata):{},m=h.overdrive??{},y=r?.defaultTurns??m.defaultTurns??3,A=r?.updatedBy??"ui",C=new Date().toISOString(),$,I,M,Z;switch(n){case "enable-count":{let tt=r?.turns??y,et=r?.consumeCurrent?Math.max(tt-1,0):tt;$=et>0?"count":"off",I=et,M=!0,Z="count";break}case "enable-latch":{$="latch",I=0,M=!0,Z="latch";break}case "disable":{$="off",I=0,M=!1;break}default:{let tt=m.state??"off",et=typeof m.remaining=="number"?m.remaining:0;if(tt==="count"&&et>0){let yt=et-1;yt<=0?($="off",I=0):($="count",I=yt),M=!0,Z="count";}else tt==="latch"?($="latch",I=0,M=!0,Z="latch"):($="off",I=0,M=!1);break}}return h.overdrive={state:$,remaining:I,defaultTurns:y,updatedAt:C,updatedBy:A},l.update(_).set({metadata:JSON.stringify(h),updated_at:C}).where(a).run(),{applied:M,appliedMode:Z,state:$,remaining:I}},{behavior:"immediate"})}catch(a){throw a instanceof p?a:new p("DB_ERROR","Failed to resolve overdrive",a)}finally{i.close();}}};function We(d){return d.replace(/<conversation_history[^>]*>[\s\S]*?<\/conversation_history>/g,"").split(`
314
+ `),l},{behavior:"immediate"})}}catch(o){throw o instanceof p?o:new p("DB_ERROR","Failed to save user message",o)}finally{r.close();}}saveAssistantMessage(t,e,s){if(!this.dbExists())return;let r=this.openHandle(true);try{let o=new Date().toISOString();r.db.update(_).set({last_message:e,updated_at:o}).where(drizzleOrm.eq(_.id,t)).run();}catch(o){throw o instanceof p?o:new p("DB_ERROR","Failed to save assistant message",o)}finally{r.close();}}updateThread(t,e){if(!this.dbExists())return;let s=this.openHandle(true);try{let r={updated_at:new Date().toISOString()};e.title!==void 0&&(r.title=e.title,r.title_locked=1),e.titleLocked!==void 0&&(r.title_locked=e.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,e){let s=this.openHandle(true);try{let r=e?drizzleOrm.and(drizzleOrm.eq(_.id,t),drizzleOrm.eq(_.workspace_id,e)):drizzleOrm.eq(_.id,t),o=s.db.select({pinned:_.pinned,metadata:_.metadata}).from(_).where(r).get();if(!o)return null;let a=o.pinned?0:1,i=o.metadata?JSON.parse(o.metadata):{};if(a){let c=e?drizzleOrm.and(drizzleOrm.eq(_.pinned,1),drizzleOrm.eq(_.workspace_id,e)):drizzleOrm.eq(_.pinned,1),l=s.db.select({metadata:_.metadata}).from(_).where(c).all(),u=null;for(let h of l){let f=h.metadata?JSON.parse(h.metadata):{};typeof f.pinOrder=="number"&&(u===null||f.pinOrder<u)&&(u=f.pinOrder);}i.pinOrder=u===null?0:u-1;}else delete i.pinOrder;return s.db.update(_).set({pinned:a,metadata:Object.keys(i).length>0?JSON.stringify(i):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,e){let s=this.openHandle(true);try{for(let r=0;r<t.length;r++){let o=e?drizzleOrm.and(drizzleOrm.eq(_.id,t[r]),drizzleOrm.eq(_.workspace_id,e)):drizzleOrm.eq(_.id,t[r]),a=s.db.select({metadata:_.metadata}).from(_).where(o).get();if(!a)continue;let i=a.metadata?JSON.parse(a.metadata):{};i.pinOrder=r+1,s.db.update(_).set({metadata:JSON.stringify(i)}).where(o).run();}}catch(r){throw r instanceof p?r:new p("DB_ERROR","Failed to reorder pins",r)}finally{s.close();}}toggleStar(t,e){let s=this.openHandle(true);try{let r=e?drizzleOrm.and(drizzleOrm.eq(_.id,t),drizzleOrm.eq(_.workspace_id,e)):drizzleOrm.eq(_.id,t),o=s.db.select({starred:_.starred}).from(_).where(r).get();if(!o)return null;let a=o.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,e,s,r){let a=this.openHandle(true);try{let i=e?drizzleOrm.and(drizzleOrm.eq(_.id,t),drizzleOrm.eq(_.workspace_id,e)):drizzleOrm.eq(_.id,t);return a.db.transaction(l=>{let u=l.select({metadata:_.metadata}).from(_).where(i).get();if(!u)return null;let h=u.metadata?JSON.parse(u.metadata):{},f=h.overdrive??{},R=r?.defaultTurns??f.defaultTurns??3,A=r?.updatedBy??"ui",C=new Date().toISOString(),$,L,U,st;switch(s){case "enable-count":{let rt=r?.turns??R,ot=r?.consumeCurrent?Math.max(rt-1,0):rt;$=ot>0?"count":"off",L=ot,U=!0,st="count";break}case "enable-latch":{$="latch",L=0,U=!0,st="latch";break}case "disable":{$="off",L=0,U=!1;break}default:{let rt=f.state??"off",ot=typeof f.remaining=="number"?f.remaining:0;if(rt==="count"&&ot>0){let xt=ot-1;xt<=0?($="off",L=0):($="count",L=xt),U=!0,st="count";}else rt==="latch"?($="latch",L=0,U=!0,st="latch"):($="off",L=0,U=!1);break}}return h.overdrive={state:$,remaining:L,defaultTurns:R,updatedAt:C,updatedBy:A},l.update(_).set({metadata:JSON.stringify(h),updated_at:C}).where(i).run(),{applied:U,appliedMode:st,state:$,remaining:L}},{behavior:"immediate"})}catch(i){throw i instanceof p?i:new p("DB_ERROR","Failed to resolve overdrive",i)}finally{a.close();}}};function Ge(d){return d.replace(/<conversation_history[^>]*>[\s\S]*?<\/conversation_history>/g,"").split(`
315
315
  `).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(`
316
- `).trim()}function Ke(d){if(!d)return "";let t=d;try{let e=JSON.parse(t);Array.isArray(e)?t=e.filter(n=>n?.type==="text"&&n?.text).map(n=>n.text).join(`
317
- `):e&&typeof e=="object"&&e.result!==void 0&&(t=e.result||"");}catch{t=We(t);}return t}var ht=class{dbPath;constructor(t){this.dbPath=t??U.join(Zt.homedir(),".crewx","crewx.db");}getThreadRepo(){return new pt({dbPath:this.dbPath})}updateThread(t,e){this.getThreadRepo().updateThread(t,{title:e.title});}async ensureThread(t,e,n){let r=this.getThreadRepo(),o=r.findThreadById(t);if(o){if(o.platform!==e)throw new Error(`Thread '${t}' already exists with platform '${o.platform}' \u2014 cannot change to '${e}' (platform is immutable)`);return {created:false}}return r.ensureThread(t,e,n),{created:true}}async fetchHistory(t,e){let n=e?.limit??100,r=this.getThreadRepo(),o=r.findThreadById(t),i=r.findTopLevelTasks(t,void 0,n),a=new Set(["queued","cancelled"]);i=i.filter(u=>(!u.status||!a.has(u.status))&&(!e?.currentTraceId||u.trace_id!==e.currentTraceId));let c=o?.platform??"cli",l=this.rowsToMessages(i);return {threadId:t,platform:c,messages:l,metadata:{title:o?.title??void 0,firstMessage:o?.first_message??void 0,lastMessage:o?.last_message??void 0,messageCount:o?.message_count??0,updatedAt:o?.updated_at?new Date(o.updated_at).getTime():void 0}}}async saveUserMessage(t,e,n,r){let{firstMessage:o}=this.getThreadRepo().saveUserMessage(t,e);return {id:t,firstMessage:o}}async saveAssistantMessage(t,e,n,r){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 n of t){n.prompt&&e.push({id:`${n.id}-user`,text:n.prompt,isAssistant:false,timestamp:new Date(n.started_at).getTime(),metadata:{caller_agent_id:n.caller_agent_id}});let r=Ke(n.result),o=this.normalizeStatus(n.status);if(r||o==="running"||o==="failed"){let i={agent_id:n.agent_id,task_id:n.id};o&&(i.status=o),o==="failed"&&n.error&&(i.reason=n.error.split(`
318
- `)[0].slice(0,200)),e.push({id:`${n.id}-assistant`,text:r,isAssistant:true,timestamp:new Date(n.started_at).getTime(),metadata:i});}}return e}};var Rt=class extends F{name="conversation";_provider;unsubStart=null;unsubEnd=null;constructor(t){super(),this._provider=new ht(t?.dbPath);}get conversationProvider(){return this._provider}async afterUserMessage(t,e,n,r){}async afterAssistantMessage(t,e,n){}attach(t){this.unsubStart=t.on("task:start",async e=>{if(!e.threadId)return;let n=e.platform??"cli";try{let r=await this._provider.ensureThread(e.threadId,n,e.workspaceId),o=await this._provider.saveUserMessage(e.threadId,e.message??"");await this.afterUserMessage(e.threadId,o.id,r.created||o.firstMessage,e);}catch{}}),this.unsubEnd=t.on("task:end",async e=>{if(!e.result)return;let n=e.metadata?.threadId;if(!n)return;let r=e.agentRef?.replace(/^@/,"")??"";try{let{id:o}=await this._provider.saveAssistantMessage(n,e.result,r);await this.afterAssistantMessage(n,o,e);}catch{}});}detach(t){this.unsubStart?.(),this.unsubStart=null,this.unsubEnd?.(),this.unsubEnd=null,this._provider.close?.();}};exports.ConversationPlugin=Rt;exports.FileLoggerPlugin=mt;exports.SqliteTracingPlugin=bt;
316
+ `).trim()}function Xe(d){if(!d)return "";let t=d;try{let e=JSON.parse(t);Array.isArray(e)?t=e.filter(s=>s?.type==="text"&&s?.text).map(s=>s.text).join(`
317
+ `):e&&typeof e=="object"&&e.result!==void 0&&(t=e.result||"");}catch{t=Ge(t);}return t}var mt=class{dbPath;constructor(t){this.dbPath=t??B.join(ee.homedir(),".crewx","crewx.db");}getThreadRepo(){return new gt({dbPath:this.dbPath})}updateThread(t,e){this.getThreadRepo().updateThread(t,{title:e.title});}async ensureThread(t,e,s){let r=this.getThreadRepo(),o=r.findThreadById(t);if(o){if(o.platform!==e)throw new Error(`Thread '${t}' already exists with platform '${o.platform}' \u2014 cannot change to '${e}' (platform is immutable)`);return {created:false}}return r.ensureThread(t,e,s),{created:true}}async fetchHistory(t,e){let s=e?.limit??100,r=this.getThreadRepo(),o=r.findThreadById(t),a=r.findTopLevelTasks(t,void 0,s),i=new Set(["queued","cancelled"]);a=a.filter(u=>(!u.status||!i.has(u.status))&&(!e?.currentTraceId||u.trace_id!==e.currentTraceId));let c=o?.platform??"cli",l=this.rowsToMessages(a);return {threadId:t,platform:c,messages:l,metadata:{title:o?.title??void 0,firstMessage:o?.first_message??void 0,lastMessage:o?.last_message??void 0,messageCount:o?.message_count??0,updatedAt:o?.updated_at?new Date(o.updated_at).getTime():void 0}}}async saveUserMessage(t,e,s,r){let{firstMessage:o}=this.getThreadRepo().saveUserMessage(t,e);return {id:t,firstMessage:o}}async saveAssistantMessage(t,e,s,r){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 r=Xe(s.result),o=this.normalizeStatus(s.status);if(r||o==="running"||o==="failed"){let a={agent_id:s.agent_id,task_id:s.id};o&&(a.status=o),o==="failed"&&s.error&&(a.reason=s.error.split(`
318
+ `)[0].slice(0,200)),e.push({id:`${s.id}-assistant`,text:r,isAssistant:true,timestamp:new Date(s.started_at).getTime(),metadata:a});}}return e}};var yt=class extends q{name="conversation";_provider;unsubStart=null;unsubEnd=null;constructor(t){super(),this._provider=new mt(t?.dbPath);}get conversationProvider(){return this._provider}async afterUserMessage(t,e,s,r){}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 r=await this._provider.ensureThread(e.threadId,s,e.workspaceId),o=await this._provider.saveUserMessage(e.threadId,e.message??"");await this.afterUserMessage(e.threadId,o.id,r.created||o.firstMessage,e);}catch{}}),this.unsubEnd=t.on("task:end",async e=>{if(!e.result)return;let s=e.metadata?.threadId;if(!s)return;let r=e.agentRef?.replace(/^@/,"")??"";try{let{id:o}=await this._provider.saveAssistantMessage(s,e.result,r);await this.afterAssistantMessage(s,o,e);}catch{}});}detach(t){this.unsubStart?.(),this.unsubStart=null,this.unsubEnd?.(),this.unsubEnd=null,this._provider.close?.();}};exports.ConversationPlugin=yt;exports.FileLoggerPlugin=kt;exports.SqliteTracingPlugin=Rt;