@crewx/sdk 0.9.0-rc.50 → 0.9.0-rc.51

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'),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} ===
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,n)=>(typeof require<"u"?require:t)[n]}):d)(function(d){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+d+'" is not supported')});var W=class{detach(t){}};function Ct(d){let t=n=>String(n).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 W{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",n=>{try{fs.existsSync(this.logsDir)||fs.mkdirSync(this.logsDir,{recursive:!0});let s=Ct(n.timestamp),r=B.join(this.logsDir,`${s}_${n.traceId}.log`);this.logFiles.set(n.traceId,r);let o=`=== TASK LOG: ${n.traceId} ===
2
2
  CrewX Version: ${this.version}
3
- Mode: ${e.mode}
4
- Agent: ${e.agentRef}
5
- Started: ${e.timestamp.toLocaleString()}
6
- Message: ${e.message}
3
+ Mode: ${n.mode}
4
+ Agent: ${n.agentRef}
5
+ Started: ${n.timestamp.toLocaleString()}
6
+ Message: ${n.message}
7
7
 
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
- [${r}] INFO: Process closed with exit code: ${e.error?1:0}
11
- `;fs.appendFileSync(s,a,"utf8"),this.logFiles.delete(e.traceId);}catch{}}));}detach(t){this.unsubs.forEach(e=>e()),this.unsubs=[],this.logFiles.clear();}};function 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)"),g=new Set(h.map(R=>R.name));for(let[R,A]of Object.entries(i))g.has(R)||(d.run(`ALTER TABLE tasks ADD COLUMN ${R} ${A}`),g.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=[],g;for(;(g=u.exec(c))!==null;)h.push({table:g[1],column:g[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:
8
+ `;fs.writeFileSync(r,o,{encoding:"utf8",mode:384});}catch{}}),t.on("task:output",n=>{try{let s=this.logFiles.get(n.traceId);if(!s)return;let r=new Date().toISOString();fs.appendFileSync(s,`[${r}] STDOUT: ${n.output}
9
+ `,"utf8");}catch{}}),t.on("task:end",n=>{try{let s=this.logFiles.get(n.traceId);if(!s)return;let r=new Date().toLocaleString(),o=n.error?`failed: ${n.error.message}`:"completed successfully",a=`[${r}] INFO: Task ${o} in ${n.durationMs}ms
10
+ [${r}] INFO: Process closed with exit code: ${n.error?1:0}
11
+ `;fs.appendFileSync(s,a,"utf8"),this.logFiles.delete(n.traceId);}catch{}}));}detach(t){this.unsubs.forEach(n=>n()),this.unsubs=[],this.logFiles.clear();}};function Qt(d){let t=B__namespace.resolve(d);return process.platform==="win32"&&(t=t.replace(/\\/g,"/"),t=t.replace(/^([A-Z]):/,(n,s)=>`${s.toLowerCase()}:`)),t.length>1&&!/^[a-zA-Z]:\/$/.test(t)&&(t=t.replace(/\/+$/,"")),t}function vt(d){let t=Qt(d);return crypto.createHash("sha256").update(t).digest("hex")}var et=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 b(d){let t=it("better-sqlite3"),{drizzle:n}=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:n(s),runRaw:(r,o=[])=>s.prepare(r).run(...o),close:()=>s.close()}}var $t=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 n=d.all("PRAGMA table_info(tasks)"),s=new Set(n.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,n){if(!wt(d,"__drizzle_migrations")||!wt(d,"tasks"))return;let s=d.all(n`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(T=>T.name));for(let[T,A]of Object.entries(i))f.has(T)||(d.run(`ALTER TABLE tasks ADD COLUMN ${T} ${A}`),f.add(T));}}function ae(d,t,n){let s=d.all(n`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(n`INSERT INTO __drizzle_migrations (hash, created_at) VALUES (${l}, ${a.when})`);}}function ie(d){let{migrate:t}=it("drizzle-orm/better-sqlite3/migrator"),{sql:n}=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
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 ge=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(()=>ge.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,gt=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=?,
13
+ `)}`);let o=d.get(n`SELECT count(*) as cnt FROM sqlite_master WHERE type='table' AND name='__drizzle_migrations'`),a=0;o?.cnt&&(a=d.get(n`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0),se(d,a),o?.cnt&&(ae(d,r,n),oe(d,r,n)),t(d,{migrationsFolder:r});let c=(d.get(n`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){$t.has(t)||(ie(d),$t.add(t));}var p=class extends Error{code;cause;constructor(t,n,s){super(n),this.name="RepositoryError",this.code=t,this.cause=s,Object.setPrototypeOf(this,new.target.prototype);}};var nt=sqliteCore.sqliteTable("workspaces",{id:sqliteCore.text("id").primaryKey(),slug:sqliteCore.text("slug").notNull().unique(),name:sqliteCore.text("name").notNull(),workspace_path:sqliteCore.text("workspace_path"),description:sqliteCore.text("description"),is_active:sqliteCore.integer("is_active").notNull().default(1),created_at:sqliteCore.text("created_at").notNull(),updated_at:sqliteCore.text("updated_at").notNull()});var e=sqliteCore.sqliteTable("tasks",{id:sqliteCore.text("id").primaryKey(),agent_id:sqliteCore.text("agent_id").notNull(),user_id:sqliteCore.text("user_id"),prompt:sqliteCore.text("prompt").notNull(),mode:sqliteCore.text("mode").notNull().default("execute"),status:sqliteCore.text("status").notNull().default("running"),result:sqliteCore.text("result"),error:sqliteCore.text("error"),started_at:sqliteCore.text("started_at").notNull(),completed_at:sqliteCore.text("completed_at"),duration_ms:sqliteCore.integer("duration_ms"),metadata:sqliteCore.text("metadata"),workspace_id:sqliteCore.text("workspace_id"),trace_id:sqliteCore.text("trace_id"),parent_task_id:sqliteCore.text("parent_task_id"),caller_agent_id:sqliteCore.text("caller_agent_id"),model:sqliteCore.text("model"),platform:sqliteCore.text("platform").default("cli"),crewx_version:sqliteCore.text("crewx_version"),input_tokens:sqliteCore.integer("input_tokens").default(0),output_tokens:sqliteCore.integer("output_tokens").default(0),cost_usd:sqliteCore.real("cost_usd").default(0),pid:sqliteCore.integer("pid"),rendered_prompt:sqliteCore.text("rendered_prompt"),command:sqliteCore.text("command"),coding_agent_command:sqliteCore.text("coding_agent_command"),exit_code:sqliteCore.integer("exit_code"),logs:sqliteCore.text("logs"),thread_id:sqliteCore.text("thread_id"),workspace_ref:sqliteCore.text("workspace_ref"),project_id:sqliteCore.text("project_id"),project_ref:sqliteCore.text("project_ref"),cached_input_tokens:sqliteCore.integer("cached_input_tokens").default(0),run_epoch:sqliteCore.integer("run_epoch").default(0)},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(()=>nt.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(()=>e.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(()=>e.id,{onDelete:"cascade"}),session_id:sqliteCore.text("session_id"),tool_name:sqliteCore.text("tool_name").notNull(),files:sqliteCore.text("files"),input:sqliteCore.text("input"),output:sqliteCore.text("output"),duration_ms:sqliteCore.integer("duration_ms"),timestamp:sqliteCore.text("timestamp").notNull()},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 qt(d){let t=d.toLowerCase().trim();t=t.replace(/\[[^\]]*\]$/g,"");let n=t.lastIndexOf("/");return n>=0&&(t=t.slice(n+1)),t=t.replace(/-\d{8}$/,""),t}var 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 et{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 n=this.resolveDbPath();if(t){let r=B.dirname(n);fs.existsSync(r)||fs.mkdirSync(r,{recursive:true});}else if(!fs.existsSync(n))throw new p("NOT_FOUND","Database not found");let s=b(n);if(t)try{lt(s.db,n);}catch(r){throw s.close(),r}return s}startTask(t){let n=this.openHandle(true);try{n.db.insert(e).values({id:t.id,agent_id:t.agentId,prompt:t.prompt,mode:t.mode,status:t.status,started_at:t.startedAt,pid:t.pid??null,parent_task_id:t.parentTaskId??null,caller_agent_id:t.callerAgentId??null,trace_id:t.traceId??null,command:t.command??null,metadata:t.metadata??null,workspace_id:t.workspaceId??null,platform:t.platform??"cli",crewx_version:t.crewxVersion??null,thread_id:t.threadId??null,model:t.model??null,rendered_prompt:t.renderedPrompt??null,coding_agent_command:t.codingAgentCommand??null}).onConflictDoUpdate({target:e.id,set:{pid:drizzleOrm.sql`COALESCE(excluded.pid, ${e.pid})`},setWhere:drizzleOrm.eq(e.status,"running")}).run();}catch(s){throw s instanceof p?s:new p("DB_ERROR","Failed to start task",s)}finally{n.close();}}finishTask(t){let n=this.openHandle(true);try{let s=t.runEpoch??null;n.runRaw(`UPDATE tasks SET status=?, result=?, error=?, completed_at=?, duration_ms=?,
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,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`
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{n.close();}}appendLog(t,n){let s=this.openHandle(true);try{s.db.transaction(r=>{let o=r.select({logs:e.logs}).from(e).where(drizzleOrm.eq(e.id,t)).limit(1).get(),a=o?.logs?JSON.parse(o.logs):[];a.push(n),r.update(e).set({logs:JSON.stringify(a)}).where(drizzleOrm.eq(e.id,t)).run();},{behavior:"immediate"});}catch(r){throw r instanceof p?r:new p("DB_ERROR","Failed to append log",r)}finally{s.close();}}getRunningTasks(){if(!this.dbExists())return [];let t=this.openHandle(false);try{return t.db.select().from(e).where(drizzleOrm.eq(e.status,"running")).orderBy(drizzleOrm.desc(e.started_at)).all()}catch(n){throw new p("DB_ERROR","Failed to get running tasks",n)}finally{t.close();}}getAllTasks(){if(!this.dbExists())return [];let t=this.openHandle(false);try{return t.db.select().from(e).orderBy(drizzleOrm.desc(e.started_at)).limit(100).all()}catch(n){throw new p("DB_ERROR","Failed to get all tasks",n)}finally{t.close();}}getTask(t){if(!this.dbExists())return;let n=this.openHandle(false);try{return n.db.select().from(e).where(drizzleOrm.eq(e.id,t)).limit(1).get()??void 0}catch(s){throw new p("DB_ERROR","Failed to get task",s)}finally{n.close();}}killTask(t){if(!this.dbExists())return {killed:false};let n=this.openHandle(true);try{let s=n.db.select({id:e.id,status:e.status,pid:e.pid}).from(e).where(drizzleOrm.eq(e.id,t)).limit(1).get();if(!s||s.status!=="running")return {killed:!1};if(s.pid)try{process.kill(s.pid,"SIGTERM");}catch{}return n.db.update(e).set({status:"failed",error:"Killed by user",completed_at:new Date().toISOString()}).where(drizzleOrm.and(drizzleOrm.eq(e.id,t),drizzleOrm.eq(e.status,"running"))).run(),{killed:!0,pid:s.pid??void 0}}catch(s){throw s instanceof p?s:new p("DB_ERROR","Failed to kill task",s)}finally{n.close();}}reapOrphanedTasks(){if(!this.dbExists())return 0;let t=this.openHandle(true);try{let n=t.db.select({id:e.id,pid:e.pid,platform:e.platform,run_epoch:e.run_epoch}).from(e).where(drizzleOrm.eq(e.status,"running")).all(),s=Date.now(),r=new Set,o=0;for(let a of n){if(a.pid){let l=!1;try{process.kill(a.pid,0),l=!0;}catch{}l||(t.db.update(e).set({status:"failed",error:"Reaped: process not found (orphaned task)",completed_at:new Date().toISOString()}).where(drizzleOrm.and(drizzleOrm.eq(e.id,a.id),drizzleOrm.eq(e.status,"running"))).run(),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(e).set({status:"failed",error:"Reaped: pid never recorded after resume (stale running_instruction)",completed_at:new Date().toISOString()}).where(drizzleOrm.and(drizzleOrm.eq(e.id,a.id),drizzleOrm.eq(e.status,"running"))).run(),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 n=this.openHandle(true);try{let s=new Date(Date.now()-t).toISOString();return n.db.update(e).set({status:"failed",error:"Reaped: stale workflow run (finally not executed)",completed_at:new Date().toISOString()}).where(drizzleOrm.and(drizzleOrm.eq(e.status,"running"),drizzleOrm.eq(e.platform,"workflow"),drizzleOrm.isNull(e.pid),drizzleOrm.lt(e.started_at,s),drizzleOrm.or(drizzleOrm.isNull(e.metadata),drizzleOrm.notLike(e.metadata,'%"kind":"workflow_card"%')))).run().changes??0}finally{n.close();}}findTaskStatus(t,n){let s=this.resolveDbPaths();for(let r of s){if(!fs.existsSync(r))continue;let o=b(r);try{let a=n?drizzleOrm.eq(e.workspace_id,n):void 0,i=a?drizzleOrm.and(drizzleOrm.eq(e.id,t),a):drizzleOrm.eq(e.id,t),c=o.db.select().from(e).where(i).limit(1).get()??void 0;if(!c){let l=drizzleOrm.or(drizzleOrm.eq(e.thread_id,t),drizzleOrm.and(drizzleOrm.isNull(e.thread_id),drizzleOrm.like(e.command,`%--thread=${t}%`))),u=a?drizzleOrm.and(l,a):l;c=o.db.select().from(e).where(u).orderBy(drizzleOrm.desc(e.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,n){let s=this.resolveDbPaths(),r=new Set,o=[];for(let a of s){if(!fs.existsSync(a))continue;let i=b(a);try{let c=n?drizzleOrm.and(drizzleOrm.eq(e.parent_task_id,t),drizzleOrm.eq(e.workspace_id,n)):drizzleOrm.eq(e.parent_task_id,t),l=i.db.select().from(e).where(c).orderBy(drizzleOrm.asc(e.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 n=this.openHandle(false);try{return n.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 @@ ${s.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(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,g=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 g)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 g=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(g,a):g).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`
37
+ `)}catch(s){throw new p("DB_ERROR","Failed to get workspace usage summary",s)}finally{n.close();}}getThreadTokenUsage(t,n){let s=this.resolveDbPaths(),r=new Set,o=0,a=0,i=0;for(let c of s){if(!fs.existsSync(c))continue;let l=b(c);try{let u=drizzleOrm.or(drizzleOrm.eq(e.thread_id,t),drizzleOrm.and(drizzleOrm.isNull(e.thread_id),drizzleOrm.like(e.command,`%--thread=${t}%`))),h=n?drizzleOrm.and(u,drizzleOrm.eq(e.workspace_id,n)):u,f=l.db.select({id:e.id,input_tokens:e.input_tokens,output_tokens:e.output_tokens,cost_usd:e.cost_usd}).from(e).where(h).all();for(let T of f)r.has(T.id)||(r.add(T.id),o+=T.input_tokens??0,a+=T.output_tokens??0,i+=T.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,n){let s=this.resolveDbPaths(),r=new Set,o=[];for(let a of s){if(!fs.existsSync(a))continue;let i=b(a);try{let c=drizzleOrm.or(drizzleOrm.eq(e.thread_id,t),drizzleOrm.and(drizzleOrm.isNull(e.thread_id),drizzleOrm.like(e.command,`%--thread=${t}%`))),l=n?drizzleOrm.and(c,drizzleOrm.eq(e.workspace_id,n)):c,u=i.db.select().from(e).where(l).orderBy(drizzleOrm.asc(e.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 n=JSON.parse(t);return {kind:typeof n.kind=="string"?n.kind:void 0,workflowRunId:typeof n.workflowRunId=="string"?n.workflowRunId:void 0}}catch{return {}}}extractThreadIdFromCommand(t){return t?/--thread=(\S+)/.exec(t)?.[1]??null:null}findRunningWorkflowParentTasks(){if(!this.dbExists())return [];let t=[];for(let n of this.resolveDbPaths()){if(!fs.existsSync(n))continue;let s=b(n);try{t.push(...s.db.select({id:e.id,agent_id:e.agent_id,thread_id:e.thread_id,workspace_id:e.workspace_id,platform:e.platform,status:e.status,error:e.error,completed_at:e.completed_at,duration_ms:e.duration_ms,started_at:e.started_at,metadata:e.metadata}).from(e).where(drizzleOrm.and(drizzleOrm.eq(e.platform,"workflow"),drizzleOrm.like(e.metadata,'%"kind":"workflow_card"%'))).orderBy(drizzleOrm.desc(e.started_at)).all());}catch(r){throw new p("DB_ERROR","Failed to find workflow parent tasks",r)}finally{s.close();}}return t}batchFetchWorkflowCards(t,n){let s=new Map;if(t.length===0)return s;let r=new Set(t),o=new Map,a=n?drizzleOrm.eq(e.workspace_id,n):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=b(c);try{let u=drizzleOrm.and(drizzleOrm.inArray(e.thread_id,t),drizzleOrm.like(e.metadata,'%"kind":"workflow_card"%')),h=l.db.select({id:e.id,thread_id:e.thread_id,metadata:e.metadata,result:e.result,started_at:e.started_at}).from(e).where(a?drizzleOrm.and(u,a):u).all();for(let A of h)i(A.thread_id,A);let f=drizzleOrm.and(drizzleOrm.isNull(e.thread_id),drizzleOrm.like(e.metadata,'%"kind":"workflow_card"%')),T=l.db.select({id:e.id,command:e.command,metadata:e.metadata,result:e.result,started_at:e.started_at}).from(e).where(a?drizzleOrm.and(f,a):f).all();for(let A of T){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 n=this.openHandle(false);try{let s=[];t.workspaceId&&s.push(drizzleOrm.eq(e.workspace_id,t.workspaceId));let r=t.agents&&t.agents.length>0?t.agents:t.agentId?[t.agentId]:null;r&&s.push(drizzleOrm.inArray(e.agent_id,r));let o=t.statuses&&t.statuses.length>0?t.statuses:t.status?[t.status]:null;o&&s.push(drizzleOrm.inArray(e.status,o));let a=t.q??t.search;a&&s.push(drizzleOrm.like(e.prompt,`%${a}%`)),t.from&&s.push(drizzleOrm.gte(e.started_at,t.from)),t.to&&s.push(drizzleOrm.lt(e.started_at,t.to));let i=s.length>0?drizzleOrm.and(...s):void 0,c=n.db.select({count:drizzleOrm.sql`count(*)`}).from(e).where(i).get(),l=(t.sortDir??"DESC")==="ASC"?drizzleOrm.asc(e.started_at):drizzleOrm.desc(e.started_at);return {rows:n.db.select().from(e).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{n.close();}}getAgentUsage(t,n,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,
@@ -58,7 +58,7 @@ ${s.join(`
58
58
  FROM tasks t
59
59
  WHERE t.status IN ('completed', 'success')
60
60
  AND t.started_at >= ${t}
61
- AND t.started_at < ${e}
61
+ AND t.started_at < ${n}
62
62
  AND t.workspace_id = ${s}
63
63
  GROUP BY t.agent_id, t.workspace_id
64
64
  ORDER BY (
@@ -101,7 +101,7 @@ ${s.join(`
101
101
  FROM tasks t
102
102
  WHERE t.status IN ('completed', 'success')
103
103
  AND t.started_at >= ${t}
104
- AND t.started_at < ${e}
104
+ AND t.started_at < ${n}
105
105
  GROUP BY t.agent_id, t.workspace_id
106
106
  ORDER BY (
107
107
  COALESCE(SUM(
@@ -119,7 +119,7 @@ ${s.join(`
119
119
  ), 0)
120
120
  + COALESCE(SUM(t.output_tokens), 0)
121
121
  ) DESC
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`
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,n,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,
@@ -142,7 +142,7 @@ ${s.join(`
142
142
  FROM tasks t
143
143
  WHERE t.status IN ('completed', 'success')
144
144
  AND t.started_at >= ${t}
145
- AND t.started_at < ${e}
145
+ AND t.started_at < ${n}
146
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
@@ -169,97 +169,97 @@ ${s.join(`
169
169
  FROM tasks t
170
170
  WHERE t.status IN ('completed', 'success')
171
171
  AND t.started_at >= ${t}
172
- AND t.started_at < ${e}
172
+ AND t.started_at < ${n}
173
173
  GROUP BY date(t.started_at), t.agent_id
174
174
  ORDER BY date(t.started_at) ASC
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`
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,n){if(!this.dbExists())return;let s=this.openHandle(false);try{return s.db.select().from(e).where(drizzleOrm.and(drizzleOrm.eq(e.id,t),drizzleOrm.eq(e.workspace_id,n))).limit(1).get()??void 0}catch(r){throw new p("DB_ERROR","Failed to find task for stop",r)}finally{s.close();}}findLatestTaskByMetadata(t){if(!this.dbExists())return null;let n=this.openHandle(false);try{return n.db.select({id:e.id,thread_id:e.thread_id,status:e.status,result:e.result,error:e.error,started_at:e.started_at,completed_at:e.completed_at}).from(e).where(drizzleOrm.and(drizzleOrm.eq(e.agent_id,t.agentId),drizzleOrm.eq(e.workspace_id,t.workspaceId),drizzleOrm.sql`${e.metadata} IS NOT NULL AND json_valid(${e.metadata}) AND json_extract(${e.metadata}, '$.' || ${t.metaKey}) = ${t.metaValue}`)).orderBy(drizzleOrm.desc(e.started_at)).limit(1).get()??null}catch(s){throw new p("DB_ERROR","Failed to find latest task by metadata",s)}finally{n.close();}}markTaskFailed(t,n,s){if(!this.dbExists())return;let r=this.openHandle(true);try{let o=new Date().toISOString(),a=s?drizzleOrm.and(drizzleOrm.eq(e.id,t),drizzleOrm.eq(e.status,"running"),drizzleOrm.eq(e.workspace_id,s)):drizzleOrm.and(drizzleOrm.eq(e.id,t),drizzleOrm.eq(e.status,"running"));r.db.update(e).set({status:"failed",error:n,completed_at: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,n){let s=this.resolveDbPaths(),r=new Set,o=[];for(let a of s){if(!fs.existsSync(a))continue;let i=b(a);try{let c=n?drizzleOrm.and(drizzleOrm.like(e.prompt,`%${t}%`),drizzleOrm.eq(e.workspace_id,n)):drizzleOrm.like(e.prompt,`%${t}%`),l=i.db.select().from(e).where(c).orderBy(drizzleOrm.asc(e.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,n,s){if(!this.dbExists())return [];let r=this.openHandle(false);try{let o=drizzleOrm.sql`
176
176
  CASE
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'
177
+ WHEN ${e.model} LIKE 'claude-%' OR ${e.model} IN ('opus', 'sonnet', 'haiku', 'opus[1m]', 'sonnet[1m]') THEN 'claude'
178
+ WHEN ${e.model} LIKE 'gpt-%' OR ${e.model} LIKE 'codex-%' THEN 'codex'
179
+ WHEN ${e.model} LIKE 'gemini-%' THEN 'gemini'
180
+ WHEN ${e.model} LIKE 'zai-%' OR ${e.model} LIKE 'openrouter/z-ai/%' THEN 'opencode'
181
+ WHEN ${e.model} LIKE 'minimax/%' THEN 'minimax'
182
+ WHEN ${e.model} LIKE 'qwen%' THEN 'qwen'
183
183
  ELSE 'unknown'
184
184
  END
185
185
  `,a=drizzleOrm.sql`
186
- COALESCE(${n.input_tokens}, 0)
186
+ COALESCE(${e.input_tokens}, 0)
187
187
  + CASE
188
- WHEN ${n.started_at} >= ${j}
188
+ WHEN ${e.started_at} >= ${j}
189
189
  AND (
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})
190
+ ${e.crewx_version} IS NULL
191
+ OR (${e.crewx_version} LIKE '0.8.%' AND ${e.crewx_version} NOT LIKE '0.8.9%')
192
+ OR (${e.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${e.crewx_version}, ${G}) AS INTEGER) < ${X})
193
193
  )
194
- THEN COALESCE(${n.cached_input_tokens}, 0)
194
+ THEN COALESCE(${e.cached_input_tokens}, 0)
195
195
  ELSE 0
196
196
  END
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`
197
+ `,i=s?drizzleOrm.sql`WHERE ${e.status} IN ('completed', 'success') AND ${e.started_at} >= ${t} AND ${e.started_at} < ${n} AND ${e.workspace_id} = ${s}`:drizzleOrm.sql`WHERE ${e.status} IN ('completed', 'success') AND ${e.started_at} >= ${t} AND ${e.started_at} < ${n}`;return r.db.all(drizzleOrm.sql`
198
198
  SELECT
199
199
  ${o} AS provider,
200
200
  COUNT(*) AS total_tasks,
201
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}
202
+ COALESCE(SUM(${e.output_tokens}), 0) AS output_tokens,
203
+ COALESCE(SUM(${e.cached_input_tokens}), 0) AS cached_input_tokens,
204
+ COALESCE(SUM(${e.cost_usd}), 0) AS cost_usd,
205
+ COALESCE(SUM(${e.duration_ms}), 0) AS active_duration_ms,
206
+ MAX(${e.completed_at}) AS last_active_at
207
+ FROM ${e}
208
208
  ${i}
209
209
  GROUP BY provider
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`
210
+ ORDER BY (COALESCE(SUM(${a}), 0) + COALESCE(SUM(${e.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,n,s){if(!this.dbExists())return [];let r=this.openHandle(false);try{let o=drizzleOrm.sql`
212
212
  CASE
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'
213
+ WHEN ${e.model} LIKE 'claude-%' OR ${e.model} IN ('opus', 'sonnet', 'haiku', 'opus[1m]', 'sonnet[1m]') THEN 'claude'
214
+ WHEN ${e.model} LIKE 'gpt-%' OR ${e.model} LIKE 'codex-%' THEN 'codex'
215
+ WHEN ${e.model} LIKE 'gemini-%' THEN 'gemini'
216
+ WHEN ${e.model} LIKE 'zai-%' OR ${e.model} LIKE 'openrouter/z-ai/%' THEN 'opencode'
217
+ WHEN ${e.model} LIKE 'minimax/%' THEN 'minimax'
218
+ WHEN ${e.model} LIKE 'qwen%' THEN 'qwen'
219
219
  ELSE 'unknown'
220
220
  END
221
221
  `,a=drizzleOrm.sql`
222
- COALESCE(${n.input_tokens}, 0)
222
+ COALESCE(${e.input_tokens}, 0)
223
223
  + CASE
224
- WHEN ${n.started_at} >= ${j}
224
+ WHEN ${e.started_at} >= ${j}
225
225
  AND (
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})
226
+ ${e.crewx_version} IS NULL
227
+ OR (${e.crewx_version} LIKE '0.8.%' AND ${e.crewx_version} NOT LIKE '0.8.9%')
228
+ OR (${e.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${e.crewx_version}, ${G}) AS INTEGER) < ${X})
229
229
  )
230
- THEN COALESCE(${n.cached_input_tokens}, 0)
230
+ THEN COALESCE(${e.cached_input_tokens}, 0)
231
231
  ELSE 0
232
232
  END
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`
233
+ `,i=s?drizzleOrm.sql`WHERE ${e.status} IN ('completed', 'success') AND ${e.started_at} >= ${t} AND ${e.started_at} < ${n} AND ${e.workspace_id} = ${s}`:drizzleOrm.sql`WHERE ${e.status} IN ('completed', 'success') AND ${e.started_at} >= ${t} AND ${e.started_at} < ${n}`,c=r.db.all(drizzleOrm.sql`
234
234
  SELECT
235
- ${n.model} AS model,
235
+ ${e.model} AS model,
236
236
  ${o} AS provider,
237
237
  COUNT(*) AS total_tasks,
238
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}
239
+ COALESCE(SUM(${e.output_tokens}), 0) AS output_tokens,
240
+ COALESCE(SUM(${e.cached_input_tokens}), 0) AS cached_input_tokens,
241
+ COALESCE(SUM(${e.cost_usd}), 0) AS cost_usd,
242
+ COALESCE(SUM(${e.duration_ms}), 0) AS active_duration_ms,
243
+ MAX(${e.completed_at}) AS last_active_at
244
+ FROM ${e}
245
245
  ${i}
246
- GROUP BY ${n.model}
247
- `),l=new Map;for(let u of c){let h=Ht(u.model??""),g=l.get(h);g?(g.totalTasks+=u.total_tasks,g.inputTokens+=u.input_tokens,g.outputTokens+=u.output_tokens,g.cachedInputTokens+=u.cached_input_tokens,g.costUsd+=u.cost_usd,g.totalTokens+=u.input_tokens+u.output_tokens,g.activeDurationMs+=u.active_duration_ms??0,u.last_active_at&&(!g.lastActiveAt||u.last_active_at>g.lastActiveAt)&&(g.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`
246
+ GROUP BY ${e.model}
247
+ `),l=new Map;for(let u of c){let h=qt(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,n,s){if(!this.dbExists())return [];let r=this.openHandle(false);try{let o=s?drizzleOrm.sql`WHERE ${e.started_at} >= ${t} AND ${e.started_at} < ${n} AND ${e.workspace_id} = ${s}`:drizzleOrm.sql`WHERE ${e.started_at} >= ${t} AND ${e.started_at} < ${n}`;return r.db.all(drizzleOrm.sql`
248
248
  SELECT
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}
249
+ ${e.thread_id} AS thread_id,
250
+ ${e.agent_id} AS agent_id,
251
+ ${e.started_at} AS started_at,
252
+ ${e.status} AS status,
253
+ ${e.error} AS error,
254
+ ${e.exit_code} AS exit_code
255
+ FROM ${e}
256
256
  ${o}
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(g=>g.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,g=u.turns[u.turns.length-1].startedAt;return h<g?1:h>g?-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 gt({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,l=i.error?JSON.stringify({code:i.error.code,message:i.error.message,...i.error.providerCode?{providerCode:i.error.providerCode}:{}}):null;e.finishTask({id:i.traceId,status:i.error?"failed":"success",result:i.result??null,error:l,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 ft=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 (
257
+ ORDER BY ${e.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 n=this.openHandle(false);try{let s=[];t.workspaceId&&s.push(drizzleOrm.eq(e.workspace_id,t.workspaceId)),t.agents&&t.agents.length>0&&s.push(drizzleOrm.inArray(e.agent_id,t.agents)),t.statuses&&t.statuses.length>0&&s.push(drizzleOrm.inArray(e.status,t.statuses)),t.from&&s.push(drizzleOrm.gte(e.started_at,t.from)),t.to&&s.push(drizzleOrm.lt(e.started_at,t.to));let r=s.length>0?drizzleOrm.and(...s):void 0,o=(t.order??"DESC")==="ASC"?drizzleOrm.asc(e.started_at):drizzleOrm.desc(e.started_at),a={id:e.id,agent_id:e.agent_id,status:e.status,prompt:e.prompt,started_at:e.started_at,completed_at:e.completed_at,thread_id:e.thread_id};return t.limit?n.db.select(a).from(e).where(r).orderBy(o).limit(t.limit).all():n.db.select(a).from(e).where(r).orderBy(o).all()}catch(s){throw new p("DB_ERROR","Failed to find task evidence",s)}finally{n.close();}}findThreadChains(t){if(!this.dbExists())return [];let n=this.openHandle(false);try{let s=t.maxThreads??8,r=t.maxTurnsPerThread??4,o=[drizzleOrm.isNotNull(e.thread_id),drizzleOrm.isNull(e.parent_task_id),drizzleOrm.isNull(e.caller_agent_id),drizzleOrm.or(drizzleOrm.isNull(e.platform),drizzleOrm.ne(e.platform,"workflow")),drizzleOrm.or(drizzleOrm.isNull(e.metadata),drizzleOrm.notLike(e.metadata,'%"kind":"workflow_card"%')),drizzleOrm.or(drizzleOrm.isNull(e.metadata),drizzleOrm.notLike(e.metadata,'%"retriedFromTaskId"%'))];t.workspaceId&&o.push(drizzleOrm.eq(e.workspace_id,t.workspaceId)),t.from&&o.push(drizzleOrm.gte(e.started_at,t.from)),t.to&&o.push(drizzleOrm.lt(e.started_at,t.to));let a=n.db.select({id:e.id,agent_id:e.agent_id,status:e.status,prompt:e.prompt,started_at:e.started_at,completed_at:e.completed_at,thread_id:e.thread_id}).from(e).where(drizzleOrm.and(...o)).orderBy(drizzleOrm.asc(e.started_at),drizzleOrm.asc(e.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{n.close();}}};var yt=class extends W{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 n=new ft({dbPath:this.dbPath}),s=process.cwd(),o=fs.existsSync(B.join(s,"crewx.yaml"))||fs.existsSync(B.join(s,"crewx.yml"))?vt(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"});n.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{n.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,l=i.error?JSON.stringify({code:i.error.code,message:i.error.message,...i.error.providerCode?{providerCode:i.error.providerCode}:{}}):null;n.finishTask({id:i.traceId,status:i.error?"failed":"success",result:i.result??null,error:l,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(n=>n()),this.unsubs=[];}};var mt=class extends et{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 n=this.resolveDbPath();if(t){let r=B.dirname(n);fs.existsSync(r)||fs.mkdirSync(r,{recursive:true});}else if(!fs.existsSync(n))throw new p("NOT_FOUND","Database not found");let s=b(n);if(t)try{lt(s.db,n);}catch(r){throw s.close(),r}return s}validateWorkspaceId(t,n){return t.db.select({id:nt.id}).from(nt).where(drizzleOrm.eq(nt.id,n)).limit(1).get()?n: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(),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 g=h.db.get(drizzleOrm.sql`
262
+ )`)}findAllThreads(t){let n=this.resolveDbPaths(),s=new Set,r=[];for(let o of n){if(!fs.existsSync(o))continue;let a=b(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,n){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=b(a);try{let c=drizzleOrm.or(drizzleOrm.inArray(_.id,t),drizzleOrm.inArray(_.title,t)),l=n?drizzleOrm.and(c,drizzleOrm.eq(_.workspace_id,n)):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,n){let s=this.resolveDbPaths();for(let r of s){if(!fs.existsSync(r))continue;let o=b(r);try{let a=drizzleOrm.eq(_.id,t),i=n?drizzleOrm.and(a,drizzleOrm.eq(_.workspace_id,n)):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,n){let s=this.resolveDbPaths();for(let r of s){if(!fs.existsSync(r))continue;let o=b(r);try{let a=drizzleOrm.eq(_.id,t),i=n?drizzleOrm.and(a,drizzleOrm.eq(_.workspace_id,n)):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,n){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=b(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,
@@ -269,21 +269,21 @@ ${s.join(`
269
269
  FROM tasks child
270
270
  WHERE child.thread_id = ${t}
271
271
  AND ${this.topLevelTaskPredicateSql()}
272
- ${e?drizzleOrm.sql`AND child.workspace_id = ${e}`:drizzleOrm.sql``}
273
- `);g&&(r+=g.cnt,o+=g.total_input,a+=g.total_output,i+=g.total_cached,c+=g.total_cost);let R=h.db.all(drizzleOrm.sql`
272
+ ${n?drizzleOrm.sql`AND child.workspace_id = ${n}`:drizzleOrm.sql``}
273
+ `);f&&(r+=f.cnt,o+=f.total_input,a+=f.total_output,i+=f.total_cached,c+=f.total_cost);let T=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
- ${e?drizzleOrm.sql`AND child.workspace_id = ${e}`:drizzleOrm.sql``}
279
- `);for(let A of R)l.add(A.agent_id);}catch(g){throw new p("DB_ERROR","Failed to aggregate task stats",g)}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`
278
+ ${n?drizzleOrm.sql`AND child.workspace_id = ${n}`:drizzleOrm.sql``}
279
+ `);for(let A of T)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,n,s){let r=this.resolveDbPaths(),o=new Set,a=[];for(let i of r){if(!fs.existsSync(i))continue;let c=b(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
283
283
  FROM tasks child
284
284
  WHERE child.thread_id = ${t}
285
285
  AND ${this.topLevelTaskPredicateSql()}
286
- ${e?drizzleOrm.sql`AND child.workspace_id = ${e}`:drizzleOrm.sql``}
286
+ ${n?drizzleOrm.sql`AND child.workspace_id = ${n}`:drizzleOrm.sql``}
287
287
  ) ranked
288
288
  WHERE rn <= ${s}
289
289
  ORDER BY started_at ASC
@@ -291,9 +291,9 @@ ${s.join(`
291
291
  SELECT child.* FROM tasks child
292
292
  WHERE child.thread_id = ${t}
293
293
  AND ${this.topLevelTaskPredicateSql()}
294
- ${e?drizzleOrm.sql`AND child.workspace_id = ${e}`:drizzleOrm.sql``}
294
+ ${n?drizzleOrm.sql`AND child.workspace_id = ${n}`:drizzleOrm.sql``}
295
295
  ORDER BY child.started_at ASC
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`
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,n){let s=this.resolveDbPaths(),r=new Set,o=[];for(let a of s){if(!fs.existsSync(a))continue;let i=b(a);try{let c=drizzleOrm.eq(e.thread_id,t),l=n?drizzleOrm.and(c,drizzleOrm.eq(e.workspace_id,n)):c,u=i.db.select().from(e).where(l).orderBy(drizzleOrm.asc(e.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,n,s){let r=this.resolveDbPaths();for(let o of r){if(!fs.existsSync(o))continue;let a=b(o);try{let i=drizzleOrm.and(drizzleOrm.eq(e.id,n),drizzleOrm.eq(e.thread_id,t)),c=s?drizzleOrm.and(i,drizzleOrm.eq(e.workspace_id,s)):i,l=a.db.select().from(e).where(c).limit(1).get();if(!l)continue;let u=a.db.select().from(e).where(drizzleOrm.eq(e.parent_task_id,l.id)).orderBy(drizzleOrm.asc(e.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,n){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,
@@ -301,18 +301,18 @@ ${s.join(`
301
301
  FROM tasks child INDEXED BY idx_tasks_thread_id
302
302
  WHERE child.thread_id IN (${drizzleOrm.sql.join(t.map(s=>drizzleOrm.sql`${s}`),drizzleOrm.sql`, `)})
303
303
  AND ${this.topLevelTaskPredicateSql()}
304
- ${e?drizzleOrm.sql`AND child.workspace_id = ${e}`:drizzleOrm.sql``}
304
+ ${n?drizzleOrm.sql`AND child.workspace_id = ${n}`:drizzleOrm.sql``}
305
305
  ORDER BY child.started_at ASC
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`
306
+ `}batchFetchTasks(t,n){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=b(o);try{let i=a.db.all(this.batchFetchTasksQuery(t,n));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,n){let s=this.resolveDbPaths();for(let r of s){if(!fs.existsSync(r))continue;let o=b(r);try{return o.db.all(drizzleOrm.sql`EXPLAIN QUERY PLAN ${this.batchFetchTasksQuery(t,n)}`).map(i=>i.detail)}finally{o.close();}}return []}updateThreadTitle(t,n,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:n,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,n){let s=this.openHandle(true);try{let r=n.workspaceId?this.validateWorkspaceId(s,n.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};n.title!==void 0&&(i.title=n.title),n.titleLocked!==void 0&&(i.title_locked=n.titleLocked?1:0),s.db.update(_).set(i).where(drizzleOrm.eq(_.id,t)).run();}else s.db.insert(_).values({id:t,platform:n.platform,workspace_id:r,title:n.title??null,title_locked:n.titleLocked?1:0,message_count:0,created_at: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,n,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:n,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,n,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
- SET first_message = COALESCE(first_message, ${e}),
309
- title = CASE WHEN title_locked = 0 AND title IS NULL THEN substr(${e}, 1, 60) ELSE title END,
310
- last_message = ${e},
308
+ SET first_message = COALESCE(first_message, ${n}),
309
+ title = CASE WHEN title_locked = 0 AND title IS NULL THEN substr(${n}, 1, 60) ELSE title END,
310
+ last_message = ${n},
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,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 g=h.metadata?JSON.parse(h.metadata):{};typeof g.pinOrder=="number"&&(u===null||g.pinOrder<u)&&(u=g.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):{},g=h.overdrive??{},R=r?.defaultTurns??g.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=g.state??"off",ot=typeof g.remaining=="number"?g.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(`
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,n,s){if(!this.dbExists())return;let r=this.openHandle(true);try{let o=new Date().toISOString();r.db.update(_).set({last_message:n,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,n){if(!this.dbExists())return;let s=this.openHandle(true);try{let r={updated_at:new Date().toISOString()};n.title!==void 0&&(r.title=n.title,r.title_locked=1),n.titleLocked!==void 0&&(r.title_locked=n.titleLocked?1:0),s.db.update(_).set(r).where(drizzleOrm.eq(_.id,t)).run();}catch(r){throw r instanceof p?r:new p("DB_ERROR","Failed to update thread",r)}finally{s.close();}}togglePin(t,n){let s=this.openHandle(true);try{let r=n?drizzleOrm.and(drizzleOrm.eq(_.id,t),drizzleOrm.eq(_.workspace_id,n)):drizzleOrm.eq(_.id,t),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=n?drizzleOrm.and(drizzleOrm.eq(_.pinned,1),drizzleOrm.eq(_.workspace_id,n)):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,n){let s=this.openHandle(true);try{for(let r=0;r<t.length;r++){let o=n?drizzleOrm.and(drizzleOrm.eq(_.id,t[r]),drizzleOrm.eq(_.workspace_id,n)):drizzleOrm.eq(_.id,t[r]),a=s.db.select({metadata:_.metadata}).from(_).where(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,n){let s=this.openHandle(true);try{let r=n?drizzleOrm.and(drizzleOrm.eq(_.id,t),drizzleOrm.eq(_.workspace_id,n)):drizzleOrm.eq(_.id,t),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,n,s,r){let a=this.openHandle(true);try{let i=n?drizzleOrm.and(drizzleOrm.eq(_.id,t),drizzleOrm.eq(_.workspace_id,n)):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??{},T=r?.defaultTurns??f.defaultTurns??3,A=r?.updatedBy??"ui",C=new Date().toISOString(),$,P,U,st;switch(s){case "enable-count":{let rt=r?.turns??T,ot=r?.consumeCurrent?Math.max(rt-1,0):rt;$=ot>0?"count":"off",P=ot,U=!0,st="count";break}case "enable-latch":{$="latch",P=0,U=!0,st="latch";break}case "disable":{$="off",P=0,U=!1;break}default:{let rt=f.state??"off",ot=typeof f.remaining=="number"?f.remaining:0;if(rt==="count"&&ot>0){let At=ot-1;At<=0?($="off",P=0):($="count",P=At),U=!0,st="count";}else rt==="latch"?($="latch",P=0,U=!0,st="latch"):($="off",P=0,U=!1);break}}return h.overdrive={state:$,remaining:P,defaultTurns:T,updatedAt:C,updatedBy:A},l.update(_).set({metadata:JSON.stringify(h),updated_at:C}).where(i).run(),{applied:U,appliedMode:st,state:$,remaining:P}},{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 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 ft({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;
316
+ `).trim()}function Xe(d){if(!d)return "";let t=d;try{let n=JSON.parse(t);Array.isArray(n)?t=n.filter(s=>s?.type==="text"&&s?.text).map(s=>s.text).join(`
317
+ `):n&&typeof n=="object"&&n.result!==void 0&&(t=n.result||"");}catch{t=Ge(t);}return t}var gt=class{dbPath;constructor(t){this.dbPath=t??B.join(ee.homedir(),".crewx","crewx.db");}getThreadRepo(){return new mt({dbPath:this.dbPath})}updateThread(t,n){this.getThreadRepo().updateThread(t,{title:n.title});}async ensureThread(t,n,s){let r=this.getThreadRepo(),o=r.findThreadById(t);if(o){if(o.platform!==n)throw new Error(`Thread '${t}' already exists with platform '${o.platform}' \u2014 cannot change to '${n}' (platform is immutable)`);return {created:false}}return r.ensureThread(t,n,s),{created:true}}async fetchHistory(t,n){let s=n?.limit??100,r=this.getThreadRepo(),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))&&(!n?.currentTraceId||u.trace_id!==n.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,n,s,r){let{firstMessage:o}=this.getThreadRepo().saveUserMessage(t,n);return {id:t,firstMessage:o}}async saveAssistantMessage(t,n,s,r){return this.getThreadRepo().saveAssistantMessage(t,n),{id:t}}close(){}normalizeStatus(t){if(t&&!["success","completed","done"].includes(t)){if(["failed","error"].includes(t))return "failed";if(t==="running")return "running"}}rowsToMessages(t){let n=[];for(let s of t){s.prompt&&n.push({id:`${s.id}-user`,text:s.prompt,isAssistant:false,timestamp:new Date(s.started_at).getTime(),metadata:{caller_agent_id:s.caller_agent_id}});let r=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)),n.push({id:`${s.id}-assistant`,text:r,isAssistant:true,timestamp:new Date(s.started_at).getTime(),metadata:a});}}return n}};var xt=class extends W{name="conversation";_provider;unsubStart=null;unsubEnd=null;constructor(t){super(),this._provider=new gt(t?.dbPath);}get conversationProvider(){return this._provider}async afterUserMessage(t,n,s,r){}async afterAssistantMessage(t,n,s){}attach(t){this.unsubStart=t.on("task:start",async n=>{if(!n.threadId)return;let s=n.platform??"cli";try{let r=await this._provider.ensureThread(n.threadId,s,n.workspaceId),o=await this._provider.saveUserMessage(n.threadId,n.message??"");await this.afterUserMessage(n.threadId,o.id,r.created||o.firstMessage,n);}catch{}}),this.unsubEnd=t.on("task:end",async n=>{if(!n.result)return;let s=n.metadata?.threadId;if(!s)return;let r=n.agentRef?.replace(/^@/,"")??"";try{let{id:o}=await this._provider.saveAssistantMessage(s,n.result,r);await this.afterAssistantMessage(s,o,n);}catch{}});}detach(t){this.unsubStart?.(),this.unsubStart=null,this.unsubEnd?.(),this.unsubEnd=null,this._provider.close?.();}};exports.ConversationPlugin=xt;exports.FileLoggerPlugin=kt;exports.SqliteTracingPlugin=yt;
@@ -11,7 +11,7 @@ export type { PushResult } from './push.js';
11
11
  export type { Workspace, NewWorkspace } from '../schema/index.js';
12
12
  export { tasks } from '../schema/index.js';
13
13
  export { TaskRepository } from './task.repository.js';
14
- export type { TaskRow, TaskListRow, NewTask, AgentUsageRow, TrendRow, ProviderUsageRow, ModelUsageRow, ReportTaskRow, WorkflowCardRow, } from './task.repository.js';
14
+ export type { TaskRow, TaskListRow, NewTask, AgentUsageRow, TrendRow, ProviderUsageRow, ModelUsageRow, ReportTaskRow, WorkflowCardRow, WorkflowParentTaskRow, } from './task.repository.js';
15
15
  export { ThreadRepository } from './thread.repository.js';
16
16
  export type { ThreadRow, NewThread } from './thread.repository.js';
17
17
  export { SpanRepository } from './span.repository.js';