@crewx/sdk 0.9.0-rc.105 → 0.9.0-rc.107

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,62 +1,64 @@
1
- import*as Ce from'path';import Ce__default,{join,dirname,basename,resolve}from'path';import {fileURLToPath}from'url';import*as na from'fs';import na__default,{existsSync,mkdirSync,readFileSync,statfsSync,realpathSync,statSync}from'fs';import ti,{homedir}from'os';import {randomUUID,createHash,randomBytes}from'crypto';import {sqliteTable,text,integer,index,check,primaryKey,getTableConfig,real,uniqueIndex,unique}from'drizzle-orm/sqlite-core';import {sql,eq,asc,desc,or as or$1,isNull,and,ne,inArray,lt,notLike,like,gte,isNotNull,gt,lte}from'drizzle-orm';import {spawn}from'child_process';var $c=Object.defineProperty;var ft=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,n)=>(typeof require<"u"?require:e)[n]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var v=(t,e)=>()=>(t&&(e=t(t=0)),e);var qc=(t,e)=>{for(var n in e)$c(t,n,{get:e[n],enumerable:true});};var Bc,zc,R,h=v(()=>{Bc=()=>fileURLToPath(import.meta.url),zc=()=>Ce__default.dirname(Bc()),R=zc();});function Zs(t){if(t===":memory:")return t;let e=resolve(t),n=e,r=[];for(;!existsSync(n);){let s=dirname(n);if(s===n)return e;r.unshift(n.slice(s.length+1)),n=s;}let o=realpathSync(n);for(let s of r)o=join(o,s);return resolve(o)}function Vc(t,e){let n=Zs(t),r=Zs(e);return process.platform==="win32"?n.toLowerCase()===r.toLowerCase():n===r}function Be(t){if((process.env.NODE_ENV==="test"||process.env.VITEST!==void 0)&&Vc(t,join(ti.homedir(),".crewx","crewx.db")))throw new Error(`${Kc}: ${t}. Set CREWX_DB or CREWX_TRACES_DB to an isolated temporary path or :memory:.`);return t}var Kc,F,oe=v(()=>{h();Kc="[crewx] Refusing to open the real CrewX database from a test process";F=class{resolveDbPath(){let e=process.env.CREWX_DB||process.env.CREWX_TRACES_DB||join(ti.homedir(),".crewx","crewx.db");return Be(e)}resolveDbPaths(){return [this.resolveDbPath()]}isMissingTableError(e){return e instanceof Error&&/no such table:/i.test(e.message)}dbExists(e){return existsSync(e??this.resolveDbPath())}};});var l,le=v(()=>{h();l=class extends Error{code;cause;constructor(e,n,r){super(n),this.name="RepositoryError",this.code=e,this.cause=r,Object.setPrototypeOf(this,new.target.prototype);}};});function P(t,e={}){let n=Be(t),r=ft("better-sqlite3"),{drizzle:o}=ft("drizzle-orm/better-sqlite3"),s=e.readOnly?new r(n,{readonly:true,fileMustExist:true}):new r(n);return e.readOnly||(s.exec("PRAGMA journal_mode = WAL"),s.exec(`PRAGMA journal_size_limit = ${oi}`),s.exec("PRAGMA busy_timeout = 5000"),s.exec("PRAGMA foreign_keys = ON"),s.exec("PRAGMA analysis_limit = 400")),{db:o(s),runRaw:(i,d=[])=>s.prepare(i).run(...d),close:()=>s.close()}}function Jc(t,e="TRUNCATE"){if(e!=="PASSIVE"&&e!=="TRUNCATE")throw new Error(`Unsupported journal reclaim mode: ${e}`);let n=Be(t),r=ft("better-sqlite3"),o=ni(n),s;try{s=new r(n),s.pragma("busy_timeout = 1000");let i=s.pragma(`wal_checkpoint(${e})`),d=ni(n);return {busy:i[0]?.busy===1,walBytesBefore:o,walBytesAfter:d}}finally{s?.close();}}var ni,oi,pe=v(()=>{h();oe();ni=t=>{try{return na.statSync(`${t}-wal`).size}catch{return 0}},oi=32*1024*1024;});function cr(t,e){return (t.get(`SELECT count(*) as cnt FROM sqlite_master WHERE type='table' AND name='${e}'`)?.cnt??0)>0}function Xc(t,e){if(e>0||!cr(t,"tasks"))return;let n=t.all("PRAGMA table_info(tasks)"),r=new Set(n.map(o=>o.name));for(let[o,s]of Object.entries(Yc))r.has(o)||t.run(`ALTER TABLE tasks ADD COLUMN ${o} ${s}`);}function Zc(t,e,n){if(!cr(t,"__drizzle_migrations")||!cr(t,"tasks"))return;let r=t.all(n`SELECT hash FROM __drizzle_migrations`),o=new Set(r.map(i=>i.hash)),s=JSON.parse(readFileSync(Ce__default.join(e,"meta/_journal.json"),"utf-8"));for(let i of s.entries){let d=Qc[i.tag];if(!d)continue;let c=Ce__default.join(e,`${i.tag}.sql`);if(!existsSync(c))continue;let u=readFileSync(c,"utf-8"),f=createHash("sha256").update(u).digest("hex");if(o.has(f))continue;let p=t.all("PRAGMA table_info(tasks)"),g=new Set(p.map(m=>m.name));for(let[m,w]of Object.entries(d))g.has(m)||(t.run(`ALTER TABLE tasks ADD COLUMN ${m} ${w}`),g.add(m));}}function eu(t,e,n){let r=t.all(n`SELECT hash FROM __drizzle_migrations`),o=new Set(r.map(i=>i.hash)),s=JSON.parse(readFileSync(Ce__default.join(e,"meta/_journal.json"),"utf-8"));for(let i of s.entries){let d=Ce__default.join(e,`${i.tag}.sql`);if(!existsSync(d))continue;let c=readFileSync(d,"utf-8"),u=createHash("sha256").update(c).digest("hex");if(o.has(u))continue;let f=/ALTER\s+TABLE\s+[`"]?(\w+)[`"]?\s+ADD\s+[`"]?(\w+)[`"]?/gi,p=[],g;for(;(g=f.exec(c))!==null;)p.push({table:g[1],column:g[2]});if(p.length===0||!c.split(/-->\s*statement-breakpoint/).map(_=>_.trim()).filter(Boolean).every(_=>/^ALTER\s+TABLE\s+.+\s+ADD\s+/i.test(_)))continue;p.every(({table:_,column:T})=>t.all(`PRAGMA table_info("${_}")`).some(M=>M.name===T))&&t.run(n`INSERT INTO __drizzle_migrations (hash, created_at) VALUES (${u}, ${i.when})`);}}function tu(t,e){let{sql:n}=ft("drizzle-orm"),r=JSON.parse(readFileSync(Ce__default.join(e,"meta/_journal.json"),"utf-8")),s=["0025_task_heartbeat","0025_thread_app_instance_ledger","0026_mcp_action_source","0027_ui_instance_active_unique"].map(i=>{let d=r.entries.find(u=>u.tag===i);if(!d)throw new Error(`Missing release/App compatibility migration: ${i}`);let c=readFileSync(Ce__default.join(e,`${i}.sql`),"utf-8");return {entry:d,content:c,hash:createHash("sha256").update(c).digest("hex")}});t.transaction(i=>{let d=new Set(i.all(n`SELECT hash FROM __drizzle_migrations`).map(c=>c.hash));if(d.has(s[0].hash)){for(let c of s.slice(1))if(!d.has(c.hash)){for(let u of c.content.split(/-->\s*statement-breakpoint/).filter(f=>f.trim()))i.run(n.raw(u));i.run(n`INSERT INTO __drizzle_migrations (hash, created_at) VALUES (${c.hash}, ${c.entry.when})`);}}},{behavior:"immediate"});}function ru(t,e,n,r){let s=JSON.parse(readFileSync(Ce__default.join(e,"meta/_journal.json"),"utf-8")).entries.find(({tag:p})=>p===nu);if(!s)return;let i=Ce__default.join(e,`${s.tag}.sql`);if(!existsSync(i))return;let d=createHash("sha256").update(readFileSync(i,"utf-8")).digest("hex");if(r&&t.all(n`SELECT hash FROM __drizzle_migrations`).some(g=>g.hash===d))return;if(!cr(t,"tasks"))return {hash:d,affectedRows:0};let c=t.all("PRAGMA table_info(tasks)"),u=new Set(c.map(p=>p.name));if(!u.has("stop_requested_at")||!u.has("stop_requested_epoch"))return {hash:d,affectedRows:0};let f=t.get(n`
1
+ import*as Ne from'path';import Ne__default,{join,dirname,basename,resolve}from'path';import {fileURLToPath}from'url';import*as ia from'fs';import ia__default,{existsSync,mkdirSync,readFileSync,statfsSync,realpathSync,statSync}from'fs';import si,{homedir}from'os';import {randomUUID,createHash,randomBytes}from'crypto';import {sqliteTable,text,integer,index,check,primaryKey,getTableConfig,real,uniqueIndex,unique}from'drizzle-orm/sqlite-core';import {sql,eq,asc,desc,or as or$1,isNull,and,ne,inArray,lt as lt$1,notLike,like,gte,isNotNull,gt as gt$1,lte}from'drizzle-orm';import {spawn}from'child_process';var zc=Object.defineProperty;var gt=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,n)=>(typeof require<"u"?require:e)[n]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var A=(t,e)=>()=>(t&&(e=t(t=0)),e);var Gc=(t,e)=>{for(var n in e)zc(t,n,{get:e[n],enumerable:true});};var Kc,Jc,E,h=A(()=>{Kc=()=>fileURLToPath(import.meta.url),Jc=()=>Ne__default.dirname(Kc()),E=Jc();});function ri(t){if(t===":memory:")return t;let e=resolve(t),n=e,r=[];for(;!existsSync(n);){let s=dirname(n);if(s===n)return e;r.unshift(n.slice(s.length+1)),n=s;}let o=realpathSync(n);for(let s of r)o=join(o,s);return resolve(o)}function Zc(t,e){let n=ri(t),r=ri(e);return process.platform==="win32"?n.toLowerCase()===r.toLowerCase():n===r}function ze(t){if((process.env.NODE_ENV==="test"||process.env.VITEST!==void 0)&&Zc(t,join(si.homedir(),".crewx","crewx.db")))throw new Error(`${Qc}: ${t}. Set CREWX_DB or CREWX_TRACES_DB to an isolated temporary path or :memory:.`);return t}var Qc,B,oe=A(()=>{h();Qc="[crewx] Refusing to open the real CrewX database from a test process";B=class{resolveDbPath(){let e=process.env.CREWX_DB||process.env.CREWX_TRACES_DB||join(si.homedir(),".crewx","crewx.db");return ze(e)}resolveDbPaths(){return [this.resolveDbPath()]}isMissingTableError(e){return e instanceof Error&&/no such table:/i.test(e.message)}dbExists(e){return existsSync(e??this.resolveDbPath())}};});var l,pe=A(()=>{h();l=class extends Error{code;cause;constructor(e,n,r){super(n),this.name="RepositoryError",this.code=e,this.cause=r,Object.setPrototypeOf(this,new.target.prototype);}};});function P(t,e={}){let n=ze(t),r=gt("better-sqlite3"),{drizzle:o}=gt("drizzle-orm/better-sqlite3"),s=e.readOnly?new r(n,{readonly:true,fileMustExist:true}):new r(n);return e.readOnly||(s.exec("PRAGMA journal_mode = WAL"),s.exec(`PRAGMA journal_size_limit = ${di}`),s.exec("PRAGMA busy_timeout = 5000"),s.exec("PRAGMA foreign_keys = ON"),s.exec("PRAGMA analysis_limit = 400")),{db:o(s),runRaw:(i,d=[])=>s.prepare(i).run(...d),close:()=>s.close()}}function eu(t,e="TRUNCATE"){if(e!=="PASSIVE"&&e!=="TRUNCATE")throw new Error(`Unsupported journal reclaim mode: ${e}`);let n=ze(t),r=gt("better-sqlite3"),o=ii(n),s;try{s=new r(n),s.pragma("busy_timeout = 1000");let i=s.pragma(`wal_checkpoint(${e})`),d=ii(n);return {busy:i[0]?.busy===1,walBytesBefore:o,walBytesAfter:d}}finally{s?.close();}}var ii,di,fe=A(()=>{h();oe();ii=t=>{try{return ia.statSync(`${t}-wal`).size}catch{return 0}},di=32*1024*1024;});function lr(t,e){return (t.get(`SELECT count(*) as cnt FROM sqlite_master WHERE type='table' AND name='${e}'`)?.cnt??0)>0}function nu(t,e){if(e>0||!lr(t,"tasks"))return;let n=t.all("PRAGMA table_info(tasks)"),r=new Set(n.map(o=>o.name));for(let[o,s]of Object.entries(tu))r.has(o)||t.run(`ALTER TABLE tasks ADD COLUMN ${o} ${s}`);}function ou(t,e,n){if(!lr(t,"__drizzle_migrations")||!lr(t,"tasks"))return;let r=t.all(n`SELECT hash FROM __drizzle_migrations`),o=new Set(r.map(i=>i.hash)),s=JSON.parse(readFileSync(Ne__default.join(e,"meta/_journal.json"),"utf-8"));for(let i of s.entries){let d=ru[i.tag];if(!d)continue;let c=Ne__default.join(e,`${i.tag}.sql`);if(!existsSync(c))continue;let u=readFileSync(c,"utf-8"),f=createHash("sha256").update(u).digest("hex");if(o.has(f))continue;let p=t.all("PRAGMA table_info(tasks)"),g=new Set(p.map(m=>m.name));for(let[m,_]of Object.entries(d))g.has(m)||(t.run(`ALTER TABLE tasks ADD COLUMN ${m} ${_}`),g.add(m));}}function su(t,e,n){let r=t.all(n`SELECT hash FROM __drizzle_migrations`),o=new Set(r.map(i=>i.hash)),s=JSON.parse(readFileSync(Ne__default.join(e,"meta/_journal.json"),"utf-8"));for(let i of s.entries){let d=Ne__default.join(e,`${i.tag}.sql`);if(!existsSync(d))continue;let c=readFileSync(d,"utf-8"),u=createHash("sha256").update(c).digest("hex");if(o.has(u))continue;let f=/ALTER\s+TABLE\s+[`"]?(\w+)[`"]?\s+ADD\s+[`"]?(\w+)[`"]?/gi,p=[],g;for(;(g=f.exec(c))!==null;)p.push({table:g[1],column:g[2]});if(p.length===0||!c.split(/-->\s*statement-breakpoint/).map(k=>k.trim()).filter(Boolean).every(k=>/^ALTER\s+TABLE\s+.+\s+ADD\s+/i.test(k)))continue;p.every(({table:k,column:T})=>t.all(`PRAGMA table_info("${k}")`).some(D=>D.name===T))&&t.run(n`INSERT INTO __drizzle_migrations (hash, created_at) VALUES (${u}, ${i.when})`);}}function iu(t,e){let{sql:n}=gt("drizzle-orm"),r=JSON.parse(readFileSync(Ne__default.join(e,"meta/_journal.json"),"utf-8")),s=["0025_task_heartbeat","0025_thread_app_instance_ledger","0026_mcp_action_source","0027_ui_instance_active_unique"].map(i=>{let d=r.entries.find(u=>u.tag===i);if(!d)throw new Error(`Missing release/App compatibility migration: ${i}`);let c=readFileSync(Ne__default.join(e,`${i}.sql`),"utf-8");return {entry:d,content:c,hash:createHash("sha256").update(c).digest("hex")}});t.transaction(i=>{let d=new Set(i.all(n`SELECT hash FROM __drizzle_migrations`).map(c=>c.hash));if(d.has(s[0].hash)){for(let c of s.slice(1))if(!d.has(c.hash)){for(let u of c.content.split(/-->\s*statement-breakpoint/).filter(f=>f.trim()))i.run(n.raw(u));i.run(n`INSERT INTO __drizzle_migrations (hash, created_at) VALUES (${c.hash}, ${c.entry.when})`);}}},{behavior:"immediate"});}function du(t,e,n,r){let s=JSON.parse(readFileSync(Ne__default.join(e,"meta/_journal.json"),"utf-8")).entries.find(({tag:p})=>p===au);if(!s)return;let i=Ne__default.join(e,`${s.tag}.sql`);if(!existsSync(i))return;let d=createHash("sha256").update(readFileSync(i,"utf-8")).digest("hex");if(r&&t.all(n`SELECT hash FROM __drizzle_migrations`).some(g=>g.hash===d))return;if(!lr(t,"tasks"))return {hash:d,affectedRows:0};let c=t.all("PRAGMA table_info(tasks)"),u=new Set(c.map(p=>p.name));if(!u.has("stop_requested_at")||!u.has("stop_requested_epoch"))return {hash:d,affectedRows:0};let f=t.get(n`
2
2
  SELECT count(*) AS count
3
3
  FROM tasks
4
4
  WHERE status IN ('success', 'failed')
5
5
  AND (stop_requested_at IS NOT NULL OR stop_requested_epoch IS NOT NULL)
6
- `);return {hash:d,affectedRows:f?.count??0}}function Jt(t){let{migrate:e}=ft("drizzle-orm/better-sqlite3/migrator"),{sql:n}=ft("drizzle-orm"),r=[Ce__default.join(R,"../migrations"),Ce__default.join(R,"migrations"),Ce__default.join(R,"../../../../drizzle/migrations"),Ce__default.join(process.cwd(),"drizzle/migrations")],o=r.find(f=>existsSync(Ce__default.join(f,"meta/_journal.json")));if(!o)throw new Error(`migrations folder not found. Searched:
6
+ `);return {hash:d,affectedRows:f?.count??0}}function Vt(t){let{migrate:e}=gt("drizzle-orm/better-sqlite3/migrator"),{sql:n}=gt("drizzle-orm"),r=[Ne__default.join(E,"../migrations"),Ne__default.join(E,"migrations"),Ne__default.join(E,"../../../../drizzle/migrations"),Ne__default.join(process.cwd(),"drizzle/migrations")],o=r.find(f=>existsSync(Ne__default.join(f,"meta/_journal.json")));if(!o)throw new Error(`migrations folder not found. Searched:
7
7
  ${r.join(`
8
- `)}`);let s=t.get(n`SELECT count(*) as cnt FROM sqlite_master WHERE type='table' AND name='__drizzle_migrations'`),i=0;s?.cnt&&(i=t.get(n`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0),Xc(t,i),s?.cnt&&(tu(t,o),eu(t,o,n),Zc(t,o,n));let d=ru(t,o,n,!!s?.cnt);e(t,{migrationsFolder:o});let u=(t.get(n`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0)-i;if(u>0){let f=s?.cnt?"Database migrated":"Database initialized";console.error(`[crewx] ${f} (${u} migration${u>1?"s":""} applied).`);}d&&t.all(n`SELECT hash FROM __drizzle_migrations`).some(p=>p.hash===d.hash)&&console.error(`[crewx] Task stop-marker cleanup (${d.affectedRows} success/failed row(s) affected).`);}function K(t,e){si.has(e)||(Jt(t),si.add(e));}var si,Yc,Qc,nu,ae=v(()=>{h();si=new Set,Yc={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",command:"TEXT"};Qc={"0002_normalize_task_names":{workspace_name:"TEXT",project_name:"TEXT"},"0015_panoramic_gorilla_man":{project_id:"TEXT",workspace_id:"TEXT"},"0019_backfill_task_thread_ids":{command:"TEXT",thread_id:"TEXT"},"0024_storage_metadata":{prompt:"TEXT",rendered_prompt:"TEXT",result:"TEXT",input_tokens:"INTEGER DEFAULT 0",output_tokens:"INTEGER DEFAULT 0",cost_usd:"REAL DEFAULT 0"}};nu="0027_task_stop_scope_cleanup";});var C,lo=v(()=>{h();C=sqliteTable("workspaces",{id:text("id").primaryKey(),slug:text("slug").notNull().unique(),name:text("name").notNull(),workspace_path:text("workspace_path"),description:text("description"),is_active:integer("is_active").notNull().default(1),created_at:text("created_at").notNull(),updated_at:text("updated_at").notNull(),starred:integer("starred").notNull().default(0)});});var a,Sn=v(()=>{h();a=sqliteTable("tasks",{id:text("id").primaryKey(),agent_id:text("agent_id").notNull(),user_id:text("user_id"),prompt:text("prompt").notNull(),mode:text("mode").notNull().default("execute"),status:text("status").notNull().default("running"),result:text("result"),error:text("error"),started_at:text("started_at").notNull(),completed_at:text("completed_at"),duration_ms:integer("duration_ms"),metadata:text("metadata"),workspace_id:text("workspace_id"),trace_id:text("trace_id"),parent_task_id:text("parent_task_id"),caller_agent_id:text("caller_agent_id"),model:text("model"),platform:text("platform").default("cli"),crewx_version:text("crewx_version"),input_tokens:integer("input_tokens").default(0),output_tokens:integer("output_tokens").default(0),cost_usd:real("cost_usd").default(0),pid:integer("pid"),heartbeat_at:text("heartbeat_at"),stop_requested_at:text("stop_requested_at"),stop_requested_epoch:integer("stop_requested_epoch"),rendered_prompt:text("rendered_prompt"),command:text("command"),coding_agent_command:text("coding_agent_command"),exit_code:integer("exit_code"),logs:text("logs"),log_storage:text("log_storage",{enum:["blob","events"]}).notNull().default("blob"),last_log_seq:integer("last_log_seq").notNull().default(0),log_revision:integer("log_revision").notNull().default(0),thread_id:text("thread_id"),workspace_ref:text("workspace_ref"),cwd:text("cwd"),project_id:text("project_id"),project_ref:text("project_ref"),cached_input_tokens:integer("cached_input_tokens").default(0),run_epoch:integer("run_epoch").default(0)},t=>({log_storage_check:check("tasks_log_storage_ck",sql`${t.log_storage} IN ('blob', 'events')`),idx_tasks_agent_id:index("idx_tasks_agent_id").on(t.agent_id),idx_tasks_status:index("idx_tasks_status").on(t.status),idx_tasks_started_at:index("idx_tasks_started_at").on(t.started_at),idx_tasks_trace_id:index("idx_tasks_trace_id").on(t.trace_id),idx_tasks_parent_task_id:index("idx_tasks_parent_task_id").on(t.parent_task_id),idx_tasks_crewx_version:index("idx_tasks_crewx_version").on(t.crewx_version),idx_tasks_pid:index("idx_tasks_pid").on(t.pid),idx_tasks_status_heartbeat:index("idx_tasks_status_heartbeat").on(t.status,t.heartbeat_at),idx_tasks_thread_id:index("idx_tasks_thread_id").on(t.thread_id),idx_tasks_workspace_id:index("idx_tasks_workspace_id").on(t.workspace_id),idx_tasks_workspace_ref:index("idx_tasks_workspace_ref").on(t.workspace_ref),idx_tasks_project_id:index("idx_tasks_project_id").on(t.project_id),idx_tasks_ws_started:index("idx_tasks_ws_started").on(t.workspace_id,t.started_at)}));});var nt,di=v(()=>{h();Sn();nt=sqliteTable("task_log_events",{id:integer("id").primaryKey(),task_id:text("task_id").notNull().references(()=>a.id,{onDelete:"cascade"}),seq:integer("seq").notNull(),timestamp:text("timestamp").notNull(),level:text("level").notNull(),message:text("message").notNull()},t=>({taskSeqUnique:uniqueIndex("task_log_events_task_seq_uq").on(t.task_id,t.seq),timestampIdIndex:index("task_log_events_timestamp_id_idx").on(t.timestamp,t.id)}));});var fu,gu,k,gr=v(()=>{h();lo();fu="json_extract(metadata, '$.threadTitle.state')",gu="json_extract(metadata, '$.threadTitle.priority')",k=sqliteTable("threads",{id:text("id").primaryKey(),workspace_id:text("workspace_id").references(()=>C.id,{onDelete:"set null"}),platform:text("platform").notNull().default("cli"),title:text("title"),first_message:text("first_message"),last_message:text("last_message"),message_count:integer("message_count").notNull().default(0),created_at:text("created_at").notNull(),updated_at:text("updated_at").notNull(),metadata:text("metadata"),title_locked:integer("title_locked").notNull().default(0),pinned:integer("pinned").notNull().default(0),starred:integer("starred").notNull().default(0)},t=>({idx_threads_updated_at:index("idx_threads_updated_at").on(t.updated_at),idx_threads_workspace_id:index("idx_threads_workspace_id").on(t.workspace_id),idx_threads_ws_updated:index("idx_threads_ws_updated").on(t.workspace_id,t.updated_at),idx_threads_title:index("idx_threads_title").on(t.title),idx_threads_workspace_thread_state:index("idx_threads_workspace_thread_state").on(t.workspace_id,sql.raw(fu)),idx_threads_workspace_thread_priority:index("idx_threads_workspace_thread_priority").on(t.workspace_id,sql.raw(gu))}));});var ht,li=v(()=>{h();Sn();ht=sqliteTable("spans",{id:text("id").primaryKey(),task_id:text("task_id").references(()=>a.id,{onDelete:"set null"}),parent_span_id:text("parent_span_id").references(()=>ht.id,{onDelete:"set null"}),name:text("name").notNull(),kind:text("kind").notNull().default("internal"),status:text("status").notNull().default("ok"),started_at:text("started_at").notNull(),completed_at:text("completed_at"),duration_ms:integer("duration_ms"),input:text("input"),output:text("output"),error:text("error"),attributes:text("attributes")},t=>({idx_spans_task_id:index("idx_spans_task_id").on(t.task_id),idx_spans_parent_span_id:index("idx_spans_parent_span_id").on(t.parent_span_id)}));});var rt,pi=v(()=>{h();Sn();rt=sqliteTable("tool_calls",{id:text("id").primaryKey(),task_id:text("task_id").references(()=>a.id,{onDelete:"cascade"}),session_id:text("session_id"),tool_name:text("tool_name").notNull(),files:text("files"),input:text("input"),output:text("output"),duration_ms:integer("duration_ms"),timestamp:text("timestamp").notNull()},t=>({idx_tool_calls_task_id:index("idx_tool_calls_task_id").on(t.task_id),idx_tool_calls_tool_name:index("idx_tool_calls_tool_name").on(t.tool_name),idx_tool_calls_timestamp:index("idx_tool_calls_timestamp").on(t.timestamp)}));});var $e,gi=v(()=>{h();gr();$e=sqliteTable("thread_boxes",{id:text("id").primaryKey(),thread_id:text("thread_id").notNull().references(()=>k.id,{onDelete:"cascade"}),seq:integer("seq").notNull(),first_task_id:text("first_task_id").notNull(),mid_task_id:text("mid_task_id").notNull(),last_task_id:text("last_task_id").notNull(),task_count:integer("task_count").notNull(),summary:text("summary"),source_tokens:integer("source_tokens").notNull(),summary_tokens:integer("summary_tokens"),created_at:text("created_at").notNull()},t=>({idx_thread_boxes_thread_id:index("idx_thread_boxes_thread_id").on(t.thread_id),idx_thread_boxes_seq:index("idx_thread_boxes_seq").on(t.thread_id,t.seq),uniq_thread_boxes_thread_seq:unique().on(t.thread_id,t.seq)}));});var Xt,mi=v(()=>{h();Xt=sqliteTable("request_logs",{id:text("id").primaryKey(),path:text("path").notNull(),method:text("method").notNull(),status_code:integer("status_code").notNull(),duration_ms:integer("duration_ms").notNull(),ip:text("ip"),request_headers:text("request_headers"),response_headers:text("response_headers"),request_body:text("request_body"),response_body:text("response_body"),query:text("query"),user_id:text("user_id"),project_id:text("project_id"),partition_key:text("partition_key").notNull(),timestamp:text("timestamp").notNull().default(sql`(datetime('now'))`),metadata:text("metadata")},t=>({idx_request_logs_timestamp:index("idx_request_logs_timestamp").on(t.timestamp),idx_request_logs_path:index("idx_request_logs_path").on(t.path),idx_request_logs_status_code:index("idx_request_logs_status_code").on(t.status_code),idx_request_logs_partition_key:index("idx_request_logs_partition_key").on(t.partition_key)}));});var he,Ti=v(()=>{h();he=sqliteTable("usage_limit_snapshots",{id:text("id").primaryKey(),provider:text("provider").notNull(),account_ref:text("account_ref").notNull().default("default"),limit_window:text("limit_window").notNull(),bucket_start:text("bucket_start").notNull(),captured_at:text("captured_at").notNull(),used_percent:integer("used_percent").notNull(),remaining_percent:integer("remaining_percent").notNull(),resets_at:text("resets_at"),source:text("source").notNull(),metadata:text("metadata")},t=>({uniq_usage_limit_snapshots_bucket:uniqueIndex("uniq_usage_limit_snapshots_bucket").on(t.provider,t.account_ref,t.limit_window,t.bucket_start),idx_usage_limit_snapshots_window_bucket:index("idx_usage_limit_snapshots_window_bucket").on(t.limit_window,t.bucket_start),idx_usage_limit_snapshots_provider_window_bucket:index("idx_usage_limit_snapshots_provider_window_bucket").on(t.provider,t.limit_window,t.bucket_start)}));});var xe,wi=v(()=>{h();xe=sqliteTable("usage_reports",{id:text("id").primaryKey(),workspace_id:text("workspace_id").notNull(),month:text("month").notNull(),generated_at:text("generated_at").notNull(),source_range:text("source_range").notNull(),tier:text("tier").notNull(),total_tokens:integer("total_tokens").notNull(),total_cost_usd:real("total_cost_usd").notNull(),payload:text("payload").notNull(),payload_hash:text("payload_hash"),signature:text("signature"),signed_at:text("signed_at"),issuer:text("issuer")},t=>({uniq_usage_reports_ws_month:uniqueIndex("uniq_usage_reports_ws_month").on(t.workspace_id,t.month)}));});var $,se,Ei=v(()=>{h();$=sqliteTable("notifications",{id:text("id").primaryKey(),workspace_id:text("workspace_id").notNull(),agent_id:text("agent_id"),task_id:text("task_id"),thread_id:text("thread_id"),source:text("source").notNull().default("agent"),level:text("level").notNull().default("info"),title:text("title").notNull(),body:text("body"),target_user_id:text("target_user_id"),created_at:text("created_at").notNull(),metadata:text("metadata")},t=>({idx_notifications_ws_created:index("idx_notifications_ws_created").on(t.workspace_id,sql`${t.created_at} DESC`)})),se=sqliteTable("notification_reads",{notification_id:text("notification_id").notNull(),user_id:text("user_id").notNull(),read_at:text("read_at").notNull()},t=>({pk:primaryKey({columns:[t.notification_id,t.user_id]})}));});var j,Si=v(()=>{h();j=sqliteTable("agent_suggestions",{id:text("id").primaryKey(),workspace_id:text("workspace_id").notNull(),agent_id:text("agent_id").notNull(),task_id:text("task_id"),type:text("type").notNull(),status:text("status").notNull().default("pending"),payload:text("payload").notNull(),applied_commit_sha:text("applied_commit_sha"),created_at:text("created_at").notNull(),updated_at:text("updated_at").notNull()},t=>({idx_agent_suggestions_ws_agent:index("idx_agent_suggestions_ws_agent").on(t.workspace_id,t.agent_id),idx_agent_suggestions_ws_created:index("idx_agent_suggestions_ws_created").on(t.workspace_id,t.created_at)}));});var bi=v(()=>{h();sqliteTable("ui_instances",{id:text("id").primaryKey().notNull(),definition_id:text("definition_id").notNull(),definition_version:integer("definition_version").notNull(),definition_hash:text("definition_hash").notNull(),workspace_id:text("workspace_id").notNull(),thread_id:text("thread_id").notNull(),app_id:text("app_id"),anchor_task_id:text("anchor_task_id"),domain_ref_json:text("domain_ref_json").notNull(),state_json:text("state_json").notNull(),revision:integer("revision").notNull().default(0),status:text("status").notNull().default("active"),granted_capabilities_json:text("granted_capabilities_json").notNull().default("[]"),created_at:integer("created_at").notNull(),updated_at:integer("updated_at").notNull()},t=>({idCheck:check("ui_instances_id_ck",sql`length(${t.id}) BETWEEN 5 AND 128 AND ${t.id} GLOB 'uic_*'`),definitionIdCheck:check("ui_instances_definition_id_ck",sql`length(${t.definition_id}) BETWEEN 1 AND 128`),definitionVersionCheck:check("ui_instances_definition_version_ck",sql`${t.definition_version} >= 1`),definitionHashCheck:check("ui_instances_definition_hash_ck",sql`length(${t.definition_hash}) = 64 AND ${t.definition_hash} NOT GLOB '*[^0-9a-f]*'`),workspaceIdCheck:check("ui_instances_workspace_id_ck",sql`length(${t.workspace_id}) BETWEEN 1 AND 256`),threadIdCheck:check("ui_instances_thread_id_ck",sql`length(${t.thread_id}) BETWEEN 1 AND 256`),appIdCheck:check("ui_instances_app_id_ck",sql`${t.app_id} IS NULL OR length(${t.app_id}) BETWEEN 1 AND 128`),domainRefJsonCheck:check("ui_instances_domain_ref_json_ck",sql`json_valid(${t.domain_ref_json}) AND json_type(${t.domain_ref_json}) = 'object'`),stateJsonCheck:check("ui_instances_state_json_ck",sql`json_valid(${t.state_json}) AND json_type(${t.state_json}) = 'object'`),revisionCheck:check("ui_instances_revision_ck",sql`${t.revision} >= 0`),statusCheck:check("ui_instances_status_ck",sql`${t.status} IN ('active', 'completed', 'expired', 'revoked', 'unsupported')`),grantedCapabilitiesJsonCheck:check("ui_instances_granted_capabilities_json_ck",sql`json_valid(${t.granted_capabilities_json}) AND json_type(${t.granted_capabilities_json}) = 'array'`),createdAtCheck:check("ui_instances_created_at_ck",sql`${t.created_at} >= 0`),updatedAtCheck:check("ui_instances_updated_at_ck",sql`${t.updated_at} >= ${t.created_at}`),workspaceThreadIdx:index("ui_instances_workspace_thread_idx").on(t.workspace_id,t.thread_id),workspaceThreadAppUnique:uniqueIndex("ui_instances_workspace_thread_app_uq").on(t.workspace_id,t.thread_id,t.app_id).where(sql`${t.status} = 'active'`)}));});var vi=v(()=>{h();sqliteTable("ui_action_receipts",{id:text("id").primaryKey().notNull(),instance_id:text("instance_id").notNull(),request_id:text("request_id").notNull(),action_id:text("action_id").notNull(),actor_json:text("actor_json").notNull(),source:text("source").notNull(),expected_revision:integer("expected_revision").notNull(),before_revision:integer("before_revision").notNull(),after_revision:integer("after_revision"),status:text("status").notNull(),outcome:text("outcome"),input_json:text("input_json").notNull(),result_json:text("result_json"),error_code:text("error_code"),requested_at:integer("requested_at").notNull(),settled_at:integer("settled_at")},t=>({idCheck:check("ui_action_receipts_id_ck",sql`length(${t.id}) BETWEEN 5 AND 128`),instanceIdCheck:check("ui_action_receipts_instance_id_ck",sql`length(${t.instance_id}) BETWEEN 1 AND 128`),requestIdCheck:check("ui_action_receipts_request_id_ck",sql`length(${t.request_id}) BETWEEN 1 AND 128`),actionIdCheck:check("ui_action_receipts_action_id_ck",sql`length(${t.action_id}) BETWEEN 1 AND 128`),actorJsonCheck:check("ui_action_receipts_actor_json_ck",sql`json_valid(${t.actor_json}) AND json_type(${t.actor_json}) = 'object'`),sourceCheck:check("ui_action_receipts_source_ck",sql`${t.source} IN ('ui_host', 'cli', 'system', 'mcp')`),expectedRevisionCheck:check("ui_action_receipts_expected_revision_ck",sql`${t.expected_revision} >= 0`),beforeRevisionCheck:check("ui_action_receipts_before_revision_ck",sql`${t.before_revision} >= 0`),afterRevisionCheck:check("ui_action_receipts_after_revision_ck",sql`${t.after_revision} IS NULL OR ${t.after_revision} >= 0`),statusCheck:check("ui_action_receipts_status_ck",sql`${t.status} IN ('requested', 'settled')`),outcomeCheck:check("ui_action_receipts_outcome_ck",sql`${t.outcome} IS NULL OR ${t.outcome} IN ('succeeded', 'rejected', 'failed', 'conflicted', 'expired')`),inputJsonCheck:check("ui_action_receipts_input_json_ck",sql`json_valid(${t.input_json}) AND json_type(${t.input_json}) = 'object'`),resultJsonCheck:check("ui_action_receipts_result_json_ck",sql`${t.result_json} IS NULL OR (json_valid(${t.result_json}) AND json_type(${t.result_json}) = 'object')`),requestedAtCheck:check("ui_action_receipts_requested_at_ck",sql`${t.requested_at} >= 0`),settledAtCheck:check("ui_action_receipts_settled_at_ck",sql`${t.settled_at} IS NULL OR ${t.settled_at} >= ${t.requested_at}`),statusTransitionCheck:check("ui_action_receipts_status_transition_ck",sql`(
8
+ `)}`);let s=t.get(n`SELECT count(*) as cnt FROM sqlite_master WHERE type='table' AND name='__drizzle_migrations'`),i=0;s?.cnt&&(i=t.get(n`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0),nu(t,i),s?.cnt&&(iu(t,o),su(t,o,n),ou(t,o,n));let d=du(t,o,n,!!s?.cnt);e(t,{migrationsFolder:o});let u=(t.get(n`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0)-i;if(u>0){let f=s?.cnt?"Database migrated":"Database initialized";console.error(`[crewx] ${f} (${u} migration${u>1?"s":""} applied).`);}d&&t.all(n`SELECT hash FROM __drizzle_migrations`).some(p=>p.hash===d.hash)&&console.error(`[crewx] Task stop-marker cleanup (${d.affectedRows} success/failed row(s) affected).`);}function K(t,e){ci.has(e)||(Vt(t),ci.add(e));}var ci,tu,ru,au,ae=A(()=>{h();ci=new Set,tu={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",command:"TEXT"};ru={"0002_normalize_task_names":{workspace_name:"TEXT",project_name:"TEXT"},"0015_panoramic_gorilla_man":{project_id:"TEXT",workspace_id:"TEXT"},"0019_backfill_task_thread_ids":{command:"TEXT",thread_id:"TEXT"},"0024_storage_metadata":{prompt:"TEXT",rendered_prompt:"TEXT",result:"TEXT",input_tokens:"INTEGER DEFAULT 0",output_tokens:"INTEGER DEFAULT 0",cost_usd:"REAL DEFAULT 0"}};au="0027_task_stop_scope_cleanup";});var x,ho=A(()=>{h();x=sqliteTable("workspaces",{id:text("id").primaryKey(),slug:text("slug").notNull().unique(),name:text("name").notNull(),workspace_path:text("workspace_path"),description:text("description"),is_active:integer("is_active").notNull().default(1),created_at:text("created_at").notNull(),updated_at:text("updated_at").notNull(),starred:integer("starred").notNull().default(0)});});var a,vn=A(()=>{h();a=sqliteTable("tasks",{id:text("id").primaryKey(),agent_id:text("agent_id").notNull(),user_id:text("user_id"),prompt:text("prompt").notNull(),mode:text("mode").notNull().default("execute"),status:text("status").notNull().default("running"),result:text("result"),error:text("error"),started_at:text("started_at").notNull(),completed_at:text("completed_at"),duration_ms:integer("duration_ms"),metadata:text("metadata"),workspace_id:text("workspace_id"),trace_id:text("trace_id"),parent_task_id:text("parent_task_id"),caller_agent_id:text("caller_agent_id"),model:text("model"),platform:text("platform").default("cli"),crewx_version:text("crewx_version"),input_tokens:integer("input_tokens").default(0),output_tokens:integer("output_tokens").default(0),cost_usd:real("cost_usd").default(0),pid:integer("pid"),heartbeat_at:text("heartbeat_at"),stop_requested_at:text("stop_requested_at"),stop_requested_epoch:integer("stop_requested_epoch"),rendered_prompt:text("rendered_prompt"),command:text("command"),coding_agent_command:text("coding_agent_command"),exit_code:integer("exit_code"),logs:text("logs"),log_storage:text("log_storage",{enum:["blob","events"]}).notNull().default("blob"),last_log_seq:integer("last_log_seq").notNull().default(0),log_revision:integer("log_revision").notNull().default(0),thread_id:text("thread_id"),workspace_ref:text("workspace_ref"),cwd:text("cwd"),project_id:text("project_id"),project_ref:text("project_ref"),cached_input_tokens:integer("cached_input_tokens").default(0),run_epoch:integer("run_epoch").default(0)},t=>({log_storage_check:check("tasks_log_storage_ck",sql`${t.log_storage} IN ('blob', 'events')`),idx_tasks_agent_id:index("idx_tasks_agent_id").on(t.agent_id),idx_tasks_status:index("idx_tasks_status").on(t.status),idx_tasks_started_at:index("idx_tasks_started_at").on(t.started_at),idx_tasks_trace_id:index("idx_tasks_trace_id").on(t.trace_id),idx_tasks_parent_task_id:index("idx_tasks_parent_task_id").on(t.parent_task_id),idx_tasks_crewx_version:index("idx_tasks_crewx_version").on(t.crewx_version),idx_tasks_pid:index("idx_tasks_pid").on(t.pid),idx_tasks_status_heartbeat:index("idx_tasks_status_heartbeat").on(t.status,t.heartbeat_at),idx_tasks_thread_id:index("idx_tasks_thread_id").on(t.thread_id),idx_tasks_workspace_id:index("idx_tasks_workspace_id").on(t.workspace_id),idx_tasks_workspace_ref:index("idx_tasks_workspace_ref").on(t.workspace_ref),idx_tasks_project_id:index("idx_tasks_project_id").on(t.project_id),idx_tasks_ws_started:index("idx_tasks_ws_started").on(t.workspace_id,t.started_at)}));});var rt,pi=A(()=>{h();vn();rt=sqliteTable("task_log_events",{id:integer("id").primaryKey(),task_id:text("task_id").notNull().references(()=>a.id,{onDelete:"cascade"}),seq:integer("seq").notNull(),timestamp:text("timestamp").notNull(),level:text("level").notNull(),message:text("message").notNull()},t=>({taskSeqUnique:uniqueIndex("task_log_events_task_seq_uq").on(t.task_id,t.seq),timestampIdIndex:index("task_log_events_timestamp_id_idx").on(t.timestamp,t.id)}));});var ku,Tu,w,mr=A(()=>{h();ho();ku="json_extract(metadata, '$.threadTitle.state')",Tu="json_extract(metadata, '$.threadTitle.priority')",w=sqliteTable("threads",{id:text("id").primaryKey(),workspace_id:text("workspace_id").references(()=>x.id,{onDelete:"set null"}),platform:text("platform").notNull().default("cli"),title:text("title"),first_message:text("first_message"),last_message:text("last_message"),message_count:integer("message_count").notNull().default(0),created_at:text("created_at").notNull(),updated_at:text("updated_at").notNull(),metadata:text("metadata"),title_locked:integer("title_locked").notNull().default(0),pinned:integer("pinned").notNull().default(0),starred:integer("starred").notNull().default(0)},t=>({idx_threads_updated_at:index("idx_threads_updated_at").on(t.updated_at),idx_threads_workspace_id:index("idx_threads_workspace_id").on(t.workspace_id),idx_threads_ws_updated:index("idx_threads_ws_updated").on(t.workspace_id,t.updated_at),idx_threads_title:index("idx_threads_title").on(t.title),idx_threads_workspace_thread_state:index("idx_threads_workspace_thread_state").on(t.workspace_id,sql.raw(ku)),idx_threads_workspace_thread_priority:index("idx_threads_workspace_thread_priority").on(t.workspace_id,sql.raw(Tu))}));});var mt,hi=A(()=>{h();vn();mt=sqliteTable("spans",{id:text("id").primaryKey(),task_id:text("task_id").references(()=>a.id,{onDelete:"set null"}),parent_span_id:text("parent_span_id").references(()=>mt.id,{onDelete:"set null"}),name:text("name").notNull(),kind:text("kind").notNull().default("internal"),status:text("status").notNull().default("ok"),started_at:text("started_at").notNull(),completed_at:text("completed_at"),duration_ms:integer("duration_ms"),input:text("input"),output:text("output"),error:text("error"),attributes:text("attributes")},t=>({idx_spans_task_id:index("idx_spans_task_id").on(t.task_id),idx_spans_parent_span_id:index("idx_spans_parent_span_id").on(t.parent_span_id)}));});var ot,mi=A(()=>{h();vn();ot=sqliteTable("tool_calls",{id:text("id").primaryKey(),task_id:text("task_id").references(()=>a.id,{onDelete:"cascade"}),session_id:text("session_id"),tool_name:text("tool_name").notNull(),files:text("files"),input:text("input"),output:text("output"),duration_ms:integer("duration_ms"),timestamp:text("timestamp").notNull()},t=>({idx_tool_calls_task_id:index("idx_tool_calls_task_id").on(t.task_id),idx_tool_calls_tool_name:index("idx_tool_calls_tool_name").on(t.tool_name),idx_tool_calls_timestamp:index("idx_tool_calls_timestamp").on(t.timestamp)}));});var $e,ki=A(()=>{h();mr();$e=sqliteTable("thread_boxes",{id:text("id").primaryKey(),thread_id:text("thread_id").notNull().references(()=>w.id,{onDelete:"cascade"}),seq:integer("seq").notNull(),first_task_id:text("first_task_id").notNull(),mid_task_id:text("mid_task_id").notNull(),last_task_id:text("last_task_id").notNull(),task_count:integer("task_count").notNull(),summary:text("summary"),source_tokens:integer("source_tokens").notNull(),summary_tokens:integer("summary_tokens"),created_at:text("created_at").notNull()},t=>({idx_thread_boxes_thread_id:index("idx_thread_boxes_thread_id").on(t.thread_id),idx_thread_boxes_seq:index("idx_thread_boxes_seq").on(t.thread_id,t.seq),uniq_thread_boxes_thread_seq:unique().on(t.thread_id,t.seq)}));});var Jt,wi=A(()=>{h();Jt=sqliteTable("request_logs",{id:text("id").primaryKey(),path:text("path").notNull(),method:text("method").notNull(),status_code:integer("status_code").notNull(),duration_ms:integer("duration_ms").notNull(),ip:text("ip"),request_headers:text("request_headers"),response_headers:text("response_headers"),request_body:text("request_body"),response_body:text("response_body"),query:text("query"),user_id:text("user_id"),project_id:text("project_id"),partition_key:text("partition_key").notNull(),timestamp:text("timestamp").notNull().default(sql`(datetime('now'))`),metadata:text("metadata")},t=>({idx_request_logs_timestamp:index("idx_request_logs_timestamp").on(t.timestamp),idx_request_logs_path:index("idx_request_logs_path").on(t.path),idx_request_logs_status_code:index("idx_request_logs_status_code").on(t.status_code),idx_request_logs_partition_key:index("idx_request_logs_partition_key").on(t.partition_key)}));});var me,Ei=A(()=>{h();me=sqliteTable("usage_limit_snapshots",{id:text("id").primaryKey(),provider:text("provider").notNull(),account_ref:text("account_ref").notNull().default("default"),limit_window:text("limit_window").notNull(),bucket_start:text("bucket_start").notNull(),captured_at:text("captured_at").notNull(),used_percent:integer("used_percent").notNull(),remaining_percent:integer("remaining_percent").notNull(),resets_at:text("resets_at"),source:text("source").notNull(),metadata:text("metadata")},t=>({uniq_usage_limit_snapshots_bucket:uniqueIndex("uniq_usage_limit_snapshots_bucket").on(t.provider,t.account_ref,t.limit_window,t.bucket_start),idx_usage_limit_snapshots_window_bucket:index("idx_usage_limit_snapshots_window_bucket").on(t.limit_window,t.bucket_start),idx_usage_limit_snapshots_provider_window_bucket:index("idx_usage_limit_snapshots_provider_window_bucket").on(t.provider,t.limit_window,t.bucket_start)}));});var Ce,Si=A(()=>{h();Ce=sqliteTable("usage_reports",{id:text("id").primaryKey(),workspace_id:text("workspace_id").notNull(),month:text("month").notNull(),generated_at:text("generated_at").notNull(),source_range:text("source_range").notNull(),tier:text("tier").notNull(),total_tokens:integer("total_tokens").notNull(),total_cost_usd:real("total_cost_usd").notNull(),payload:text("payload").notNull(),payload_hash:text("payload_hash"),signature:text("signature"),signed_at:text("signed_at"),issuer:text("issuer")},t=>({uniq_usage_reports_ws_month:uniqueIndex("uniq_usage_reports_ws_month").on(t.workspace_id,t.month)}));});var q,se,Ii=A(()=>{h();q=sqliteTable("notifications",{id:text("id").primaryKey(),workspace_id:text("workspace_id").notNull(),agent_id:text("agent_id"),task_id:text("task_id"),thread_id:text("thread_id"),source:text("source").notNull().default("agent"),level:text("level").notNull().default("info"),title:text("title").notNull(),body:text("body"),target_user_id:text("target_user_id"),created_at:text("created_at").notNull(),metadata:text("metadata")},t=>({idx_notifications_ws_created:index("idx_notifications_ws_created").on(t.workspace_id,sql`${t.created_at} DESC`)})),se=sqliteTable("notification_reads",{notification_id:text("notification_id").notNull(),user_id:text("user_id").notNull(),read_at:text("read_at").notNull()},t=>({pk:primaryKey({columns:[t.notification_id,t.user_id]})}));});var j,Ai=A(()=>{h();j=sqliteTable("agent_suggestions",{id:text("id").primaryKey(),workspace_id:text("workspace_id").notNull(),agent_id:text("agent_id").notNull(),task_id:text("task_id"),type:text("type").notNull(),status:text("status").notNull().default("pending"),payload:text("payload").notNull(),applied_commit_sha:text("applied_commit_sha"),created_at:text("created_at").notNull(),updated_at:text("updated_at").notNull()},t=>({idx_agent_suggestions_ws_agent:index("idx_agent_suggestions_ws_agent").on(t.workspace_id,t.agent_id),idx_agent_suggestions_ws_created:index("idx_agent_suggestions_ws_created").on(t.workspace_id,t.created_at)}));});var Oi=A(()=>{h();sqliteTable("ui_instances",{id:text("id").primaryKey().notNull(),definition_id:text("definition_id").notNull(),definition_version:integer("definition_version").notNull(),definition_hash:text("definition_hash").notNull(),workspace_id:text("workspace_id").notNull(),thread_id:text("thread_id").notNull(),app_id:text("app_id"),anchor_task_id:text("anchor_task_id"),domain_ref_json:text("domain_ref_json").notNull(),state_json:text("state_json").notNull(),revision:integer("revision").notNull().default(0),status:text("status").notNull().default("active"),granted_capabilities_json:text("granted_capabilities_json").notNull().default("[]"),created_at:integer("created_at").notNull(),updated_at:integer("updated_at").notNull()},t=>({idCheck:check("ui_instances_id_ck",sql`length(${t.id}) BETWEEN 5 AND 128 AND ${t.id} GLOB 'uic_*'`),definitionIdCheck:check("ui_instances_definition_id_ck",sql`length(${t.definition_id}) BETWEEN 1 AND 128`),definitionVersionCheck:check("ui_instances_definition_version_ck",sql`${t.definition_version} >= 1`),definitionHashCheck:check("ui_instances_definition_hash_ck",sql`length(${t.definition_hash}) = 64 AND ${t.definition_hash} NOT GLOB '*[^0-9a-f]*'`),workspaceIdCheck:check("ui_instances_workspace_id_ck",sql`length(${t.workspace_id}) BETWEEN 1 AND 256`),threadIdCheck:check("ui_instances_thread_id_ck",sql`length(${t.thread_id}) BETWEEN 1 AND 256`),appIdCheck:check("ui_instances_app_id_ck",sql`${t.app_id} IS NULL OR length(${t.app_id}) BETWEEN 1 AND 128`),domainRefJsonCheck:check("ui_instances_domain_ref_json_ck",sql`json_valid(${t.domain_ref_json}) AND json_type(${t.domain_ref_json}) = 'object'`),stateJsonCheck:check("ui_instances_state_json_ck",sql`json_valid(${t.state_json}) AND json_type(${t.state_json}) = 'object'`),revisionCheck:check("ui_instances_revision_ck",sql`${t.revision} >= 0`),statusCheck:check("ui_instances_status_ck",sql`${t.status} IN ('active', 'completed', 'expired', 'revoked', 'unsupported')`),grantedCapabilitiesJsonCheck:check("ui_instances_granted_capabilities_json_ck",sql`json_valid(${t.granted_capabilities_json}) AND json_type(${t.granted_capabilities_json}) = 'array'`),createdAtCheck:check("ui_instances_created_at_ck",sql`${t.created_at} >= 0`),updatedAtCheck:check("ui_instances_updated_at_ck",sql`${t.updated_at} >= ${t.created_at}`),workspaceThreadIdx:index("ui_instances_workspace_thread_idx").on(t.workspace_id,t.thread_id),workspaceThreadAppUnique:uniqueIndex("ui_instances_workspace_thread_app_uq").on(t.workspace_id,t.thread_id,t.app_id).where(sql`${t.status} = 'active'`)}));});var xi=A(()=>{h();sqliteTable("ui_action_receipts",{id:text("id").primaryKey().notNull(),instance_id:text("instance_id").notNull(),request_id:text("request_id").notNull(),action_id:text("action_id").notNull(),actor_json:text("actor_json").notNull(),source:text("source").notNull(),expected_revision:integer("expected_revision").notNull(),before_revision:integer("before_revision").notNull(),after_revision:integer("after_revision"),status:text("status").notNull(),outcome:text("outcome"),input_json:text("input_json").notNull(),result_json:text("result_json"),error_code:text("error_code"),requested_at:integer("requested_at").notNull(),settled_at:integer("settled_at")},t=>({idCheck:check("ui_action_receipts_id_ck",sql`length(${t.id}) BETWEEN 5 AND 128`),instanceIdCheck:check("ui_action_receipts_instance_id_ck",sql`length(${t.instance_id}) BETWEEN 1 AND 128`),requestIdCheck:check("ui_action_receipts_request_id_ck",sql`length(${t.request_id}) BETWEEN 1 AND 128`),actionIdCheck:check("ui_action_receipts_action_id_ck",sql`length(${t.action_id}) BETWEEN 1 AND 128`),actorJsonCheck:check("ui_action_receipts_actor_json_ck",sql`json_valid(${t.actor_json}) AND json_type(${t.actor_json}) = 'object'`),sourceCheck:check("ui_action_receipts_source_ck",sql`${t.source} IN ('ui_host', 'cli', 'system', 'mcp')`),expectedRevisionCheck:check("ui_action_receipts_expected_revision_ck",sql`${t.expected_revision} >= 0`),beforeRevisionCheck:check("ui_action_receipts_before_revision_ck",sql`${t.before_revision} >= 0`),afterRevisionCheck:check("ui_action_receipts_after_revision_ck",sql`${t.after_revision} IS NULL OR ${t.after_revision} >= 0`),statusCheck:check("ui_action_receipts_status_ck",sql`${t.status} IN ('requested', 'settled')`),outcomeCheck:check("ui_action_receipts_outcome_ck",sql`${t.outcome} IS NULL OR ${t.outcome} IN ('succeeded', 'rejected', 'failed', 'conflicted', 'expired')`),inputJsonCheck:check("ui_action_receipts_input_json_ck",sql`json_valid(${t.input_json}) AND json_type(${t.input_json}) = 'object'`),resultJsonCheck:check("ui_action_receipts_result_json_ck",sql`${t.result_json} IS NULL OR (json_valid(${t.result_json}) AND json_type(${t.result_json}) = 'object')`),requestedAtCheck:check("ui_action_receipts_requested_at_ck",sql`${t.requested_at} >= 0`),settledAtCheck:check("ui_action_receipts_settled_at_ck",sql`${t.settled_at} IS NULL OR ${t.settled_at} >= ${t.requested_at}`),statusTransitionCheck:check("ui_action_receipts_status_transition_ck",sql`(
9
9
  (${t.status} = 'requested' AND ${t.after_revision} IS NULL AND ${t.outcome} IS NULL AND ${t.settled_at} IS NULL)
10
10
  OR
11
11
  (${t.status} = 'settled' AND ${t.after_revision} IS NOT NULL AND ${t.outcome} IS NOT NULL AND ${t.settled_at} IS NOT NULL)
12
- )`),instanceRequestUnique:uniqueIndex("ui_action_receipts_instance_request_uq").on(t.instance_id,t.request_id),instanceIdIdx:index("ui_action_receipts_instance_id_idx").on(t.instance_id),requestedAtIdx:index("ui_action_receipts_requested_at_idx").on(t.requested_at)}));});var z,Pe,Ke,Oi=v(()=>{h();z=sqliteTable("projects",{id:text("id").primaryKey().notNull(),workspace_id:text("workspace_id").notNull(),name:text("name").notNull(),outcome:text("outcome").notNull(),due_date:text("due_date"),scene:text("scene").notNull().default("planning"),stages_json:text("stages_json").notNull(),stage_index:integer("stage_index").notNull(),created_at:text("created_at").notNull(),updated_at:text("updated_at").notNull(),accepted_at:text("accepted_at"),archived_at:text("archived_at")},t=>({idCheck:check("projects_id_ck",sql`${t.id} GLOB 'prj_*'`),sceneCheck:check("projects_scene_ck",sql`${t.scene} IN ('planning', 'plan_review', 'running', 'human_wait', 'limit_wait', 'failed_stop', 'analyzing_feedback', 'replanned', 'awaiting_review', 'accepted')`),stagesJsonCheck:check("projects_stages_json_ck",sql`json_valid(${t.stages_json}) AND json_type(${t.stages_json}) = 'array'`),stageIndexCheck:check("projects_stage_index_ck",sql`${t.stage_index} >= 1`)})),Pe=sqliteTable("project_criteria",{id:text("id").primaryKey().notNull(),project_id:text("project_id").notNull().references(()=>z.id,{onDelete:"cascade"}),position:integer("position").notNull(),statement:text("statement").notNull(),verify_status:text("verify_status").notNull().default("pending"),verified_at:text("verified_at"),evidence_json:text("evidence_json").notNull().default("[]"),created_at:text("created_at").notNull(),updated_at:text("updated_at").notNull()},t=>({idCheck:check("project_criteria_id_ck",sql`${t.id} GLOB 'pjc_*'`),verifyStatusCheck:check("project_criteria_verify_status_ck",sql`${t.verify_status} IN ('pending', 'verifying', 'passed', 'failed')`),evidenceJsonCheck:check("project_criteria_evidence_json_ck",sql`json_valid(${t.evidence_json}) AND json_type(${t.evidence_json}) = 'array'`),projectPositionUnique:uniqueIndex("project_criteria_project_position_uq").on(t.project_id,t.position)})),Ke=sqliteTable("project_events",{id:text("id").primaryKey().notNull(),project_id:text("project_id").notNull().references(()=>z.id,{onDelete:"restrict"}),seq:integer("seq").notNull(),actor_type:text("actor_type").notNull(),actor_id:text("actor_id"),type:text("type").notNull(),title:text("title").notNull(),summary:text("summary"),payload_json:text("payload_json").notNull().default("{}"),created_at:text("created_at").notNull()},t=>({idCheck:check("project_events_id_ck",sql`${t.id} GLOB 'pje_*'`),actorTypeCheck:check("project_events_actor_type_ck",sql`${t.actor_type} IN ('user', 'project_manager', 'system')`),payloadJsonCheck:check("project_events_payload_json_ck",sql`json_valid(${t.payload_json}) AND json_type(${t.payload_json}) = 'object'`),projectSeqUnique:uniqueIndex("project_events_project_seq_uq").on(t.project_id,t.seq)}));});var kr,Tr,I,ko=v(()=>{h();kr=["THREAD_STATE","THREAD_PRIORITY"],Tr=["gray","blue","violet","green","amber","orange","red","pink"],I=sqliteTable("common_codes",{code_group:text("code_group").notNull(),code:text("code").notNull(),code_name:text("code_name"),color:text("color").notNull().default("gray"),sort_order:integer("sort_order").notNull(),workspace_id:text("workspace_id"),is_builtin:integer("is_builtin").notNull().default(0),is_archived:integer("is_archived").notNull().default(0),metadata:text("metadata"),created_at:text("created_at").notNull(),updated_at:text("updated_at").notNull()},t=>({pk:primaryKey({columns:[t.code_group,t.code]}),metadataCheck:check("common_codes_metadata_ck",sql`${t.metadata} IS NULL OR (json_valid(${t.metadata}) AND json_type(${t.metadata}) = 'object')`),builtinCheck:check("common_codes_builtin_ck",sql`${t.is_builtin} IN (0, 1)`),archivedCheck:check("common_codes_archived_ck",sql`${t.is_archived} IN (0, 1)`),idxCommonCodesSelection:index("idx_common_codes_group_archived_order").on(t.code_group,t.is_archived,t.sort_order)}));});var Ci,Ni,xi,Pi,Di,G,q,L,Li=v(()=>{h();gr();Ci=["thread.snapshot.imported","thread.title.changed","thread.priority.changed","thread.state.changed","thread.highlight.created","thread.highlight.updated","thread.highlight.deleted","thread.highlights.regenerated"],Ni=["user","agent","system"],xi=["auto","manual"],Pi=["decision","judgment","issue","result","pivot"],Di=["queued","running","completed","failed"],G=sqliteTable("thread_events",{id:text("id").primaryKey().notNull(),thread_id:text("thread_id").notNull().references(()=>k.id,{onDelete:"cascade"}),seq:integer("seq").notNull(),type:text("type").notNull(),actor_type:text("actor_type").notNull(),payload_json:text("payload_json").notNull(),created_at:text("created_at").notNull(),actor_id:text("actor_id"),task_id:text("task_id"),highlight_id:text("highlight_id")},t=>({typeCheck:check("thread_events_type_ck",sql`${t.type} IN ('thread.snapshot.imported', 'thread.title.changed', 'thread.priority.changed', 'thread.state.changed', 'thread.highlight.created', 'thread.highlight.updated', 'thread.highlight.deleted', 'thread.highlights.regenerated')`),actorTypeCheck:check("thread_events_actor_type_ck",sql`${t.actor_type} IN ('user', 'agent', 'system')`),payloadJsonCheck:check("thread_events_payload_json_ck",sql`json_valid(${t.payload_json}) AND json_type(${t.payload_json}) = 'object'`),threadSeqIndex:index("idx_thread_events_thread_seq").on(t.thread_id,t.seq),threadCreatedIndex:index("idx_thread_events_thread_created").on(t.thread_id,t.created_at),threadSeqUnique:uniqueIndex("thread_events_thread_seq_uq").on(t.thread_id,t.seq)})),q=sqliteTable("thread_highlight_runs",{id:text("id").primaryKey().notNull(),thread_id:text("thread_id").notNull().references(()=>k.id,{onDelete:"cascade"}),request_id:text("request_id").notNull(),status:text("status").notNull(),detector_version:text("detector_version").notNull(),requested_at:text("requested_at").notNull(),started_at:text("started_at"),completed_at:text("completed_at"),error_code:text("error_code"),previous_auto_count:integer("previous_auto_count"),new_auto_count:integer("new_auto_count")},t=>({statusCheck:check("thread_highlight_runs_status_ck",sql`${t.status} IN ('queued', 'running', 'completed', 'failed')`),countCheck:check("thread_highlight_runs_counts_ck",sql`(${t.previous_auto_count} IS NULL OR ${t.previous_auto_count} >= 0) AND (${t.new_auto_count} IS NULL OR ${t.new_auto_count} >= 0)`),threadRequestUnique:uniqueIndex("thread_highlight_runs_thread_request_uq").on(t.thread_id,t.request_id),inProgressThreadUnique:uniqueIndex("thread_highlight_runs_in_progress_thread_uq").on(t.thread_id).where(sql`${t.status} IN ('queued', 'running')`),threadStatusRequestedIndex:index("idx_thread_highlight_runs_thread_status_requested").on(t.thread_id,t.status,t.requested_at)})),L=sqliteTable("thread_highlights",{id:text("id").primaryKey().notNull(),thread_id:text("thread_id").notNull().references(()=>k.id,{onDelete:"cascade"}),source:text("source").notNull(),kind:text("kind").notNull(),status:text("status").notNull().default("active"),text:text("text"),covers_from_task_id:text("covers_from_task_id").notNull(),covers_to_task_id:text("covers_to_task_id").notNull(),revision:integer("revision").notNull().default(0),created_at:text("created_at").notNull(),updated_at:text("updated_at").notNull(),agent_id:text("agent_id"),source_task_id:text("source_task_id"),detector_version:text("detector_version"),content_fingerprint:text("content_fingerprint"),dismissed_at:text("dismissed_at")},t=>({sourceCheck:check("thread_highlights_source_ck",sql`${t.source} IN ('auto', 'manual')`),kindCheck:check("thread_highlights_kind_ck",sql`${t.kind} IN ('decision', 'judgment', 'issue', 'result', 'pivot')`),statusCheck:check("thread_highlights_status_ck",sql`${t.status} IN ('active', 'dismissed')`),activeTextCheck:check("thread_highlights_active_text_ck",sql`${t.status} = 'dismissed' OR (${t.text} IS NOT NULL AND length(${t.text}) > 0)`),coversCheck:check("thread_highlights_covers_ck",sql`length(${t.covers_from_task_id}) > 0 AND length(${t.covers_to_task_id}) > 0`),autoKeyCheck:check("thread_highlights_auto_key_ck",sql`${t.source} = 'manual' OR (${t.source} = 'auto' AND ${t.source_task_id} IS NOT NULL AND ${t.detector_version} IS NOT NULL AND ${t.content_fingerprint} IS NOT NULL AND length(${t.source_task_id}) > 0 AND length(${t.detector_version}) > 0 AND length(${t.content_fingerprint}) > 0)`),threadStatusCreatedIndex:index("idx_thread_highlights_thread_status_created").on(t.thread_id,t.status,t.created_at),threadCoversIndex:index("idx_thread_highlights_thread_covers").on(t.thread_id,t.covers_from_task_id,t.covers_to_task_id),autoIdempotencyUnique:uniqueIndex("thread_highlights_auto_idempotency_uq").on(t.thread_id,t.source_task_id,t.detector_version,t.content_fingerprint).where(sql`${t.source} = 'auto'`)}));});var Hi=v(()=>{h();sqliteTable("storage_metadata",{source_kind:text("source_kind").notNull(),source_id:text("source_id").notNull(),utc_ts:text("utc_ts"),bytes:integer("bytes").notNull()},t=>({pk:primaryKey({columns:[t.source_kind,t.source_id]}),kindTimestampBytesIndex:index("idx_storage_metadata_kind_ts_bytes").on(t.source_kind,t.utc_ts,t.bytes)})),sqliteTable("storage_metadata_state",{unit:text("unit").primaryKey().notNull(),cursor_rowid:integer("cursor_rowid").notNull().default(0),end_rowid:integer("end_rowid"),complete:integer("complete").notNull().default(0),updated_at:text("updated_at").notNull()});});var de=v(()=>{h();lo();Sn();di();gr();li();pi();gi();mi();Ti();wi();Ei();Si();bi();vi();Oi();ko();Li();Hi();});var rn,Oo,ia,Co=v(()=>{h();rn={"claude-fable-5-1":{input:10,cachedInput:.25,output:50},"claude-fable-5":{input:10,cachedInput:1,output:50},"claude-opus-5":{input:5,cachedInput:.5,output:25},"claude-opus-4-8":{input:5,cachedInput:.5,output:25},"claude-opus-4-7":{input:5,cachedInput:.5,output:25},"claude-opus-4-6":{input:5,cachedInput:.5,output:25},"claude-sonnet-5":{input:2,cachedInput:.2,output:10},"claude-sonnet-4-6":{input:3,cachedInput:.3,output:15},"claude-haiku-4-5":{input:1,cachedInput:.1,output:5},"gpt-6-astra":{input:10,cachedInput:1,output:50},"gpt-5.6-sol":{input:5,cachedInput:.5,output:30},"gpt-5.6-terra":{input:2,cachedInput:.2,output:12},"gpt-5.6-luna":{input:.2,cachedInput:.02,output:1.2},"gpt-5.5":{input:5,cachedInput:.5,output:30},"gpt-5.4":{input:2.5,cachedInput:.25,output:15},"gpt-5.4-mini":{input:.75,cachedInput:.075,output:4.5},"gpt-5.3-codex":{input:1.75,cachedInput:.175,output:14},"gpt-5-mini":{input:.4,cachedInput:.1,output:1.6},"gpt-4.1":{input:2,cachedInput:.5,output:8},"gpt-4o":{input:2.5,cachedInput:1.25,output:10},"glm-5.2":{input:1.4,cachedInput:.26,output:4.4},"glm-5.1":{input:1.4,cachedInput:.26,output:4.4},"gemini-3.7-flash":{input:1.5,cachedInput:.15,output:7.5},"gemini-3.6-flash":{input:1.5,cachedInput:.15,output:7.5},"grok-4.6":{input:2,cachedInput:.5,output:6},"grok-4.5":{input:2,cachedInput:.3,output:6}},Oo=new Set(["gpt-5.3-codex-spark"]),ia=new Set(["auto","claude-fable-5","claude-fable-5-1","claude-haiku-4-5","claude-opus-4-6-thinking","claude-opus-4-6[1m]","claude-opus-4-7[1m]","claude-opus-4-8[1m]","claude-opus-5","claude-sonnet-4-6","claude-sonnet-4-6[1m]","claude-sonnet-5","gemini-3.1-pro","gemini-3.5-flash","gemini-3.6-flash","gemini-3.7-flash","gpt-5.3-codex","gpt-5.3-codex-spark","gpt-5.4","gpt-5.4-mini","gpt-5.5","gpt-5.6-luna","gpt-5.6-sol","gpt-5.6-terra","gpt-6-astra","gpt-oss-120b","grok-4.5","grok-4.6"]);});function No(t){let e=t.toLowerCase().trim();e=e.replace(/\[[^\]]*\]$/g,"");let n=e.lastIndexOf("/");return n>=0&&(e=e.slice(n+1)),e=e.replace(/-\d{8}$/,""),e}function Nl(t){if(!t)return console.warn("[pricing] missing model id; cost is being recorded as 0"),On;let e=No(t),n=Cl[e];if(n)return vr[n]??rn[n]??On;if(vr[e])return vr[e];if(rn[e])return rn[e];if(Oo.has(e))return console.warn(`[pricing] unpublished model pricing: ${t}, cost_usd=0`),On;if(ia.has(e))return console.warn(`[pricing] missing catalog pricing: ${t}, cost_usd=0`),On;let r={...rn,...vr};for(let o of Object.keys(r))if(e.includes(o))return r[o];return console.warn(`[pricing] Unknown model: ${t}, cost_usd=0`),On}function xl(t,e,n,r=0,o){let s=Nl(n),i=Math.min(r,t),c=(t-i)*s.input/1e6,u=i*s.cachedInput/1e6,f=e*s.output/1e6;return c+u+f}function aa(t,e,n,r,o,s){return t&&t>0?t:!e&&!n?0:xl(e??0,n??0,o,r??0)}var Cl,On,vr,Ar=v(()=>{h();Co();Co();Cl={opus:"claude-opus-4-8",sonnet:"claude-sonnet-4-6",haiku:"claude-haiku-4-5","codex-mini":"gpt-5.3-codex",codex:"gpt-5.3-codex"},On={input:0,cachedInput:0,output:0},vr={};});function la(t){return t instanceof Error?t:t===void 0?void 0:new Error(String(t))}function ca(t){return typeof t=="object"&&t!==null&&"code"in t?String(t.code):void 0}function pa(t){return Number.isSafeInteger(t)&&t>0}function Hl(t,e){return new Promise(n=>{let r;try{r=spawn(t,e,{windowsHide:!0});}catch(u){n({status:null,stdout:"",stderr:"",error:la(u)});return}let o="",s="",i=false,d,c=setTimeout(()=>{try{r.kill();}catch{}d({status:null,stdout:o,stderr:s,error:new Error(`Command timed out after ${da}ms`)});},da);d=u=>{i||(i=true,clearTimeout(c),n(u));},r.stdout?.setEncoding("utf8"),r.stderr?.setEncoding("utf8"),r.stdout?.on("data",u=>{o+=String(u);}),r.stderr?.on("data",u=>{s+=String(u);}),r.once("error",u=>{d({status:null,stdout:o,stderr:s,error:u});}),r.once("close",u=>{d({status:u,stdout:o,stderr:s});});})}async function fa(t,e,n){return n.runCommandAsync?n.runCommandAsync(t,e):n.runCommand?n.runCommand(t,e):Hl(t,e)}function Ul(t){return new Promise(e=>{setTimeout(e,Math.max(0,t));})}function $l(){return new Promise(t=>{setImmediate(t);})}function Ht(t,e=process.kill){try{return e(t,0),"alive"}catch(n){return ca(n)==="ESRCH"?"not_found":ca(n)==="EPERM"?"alive":"unknown"}}function ql(t,e){let n=Ht(-t,e),r=Ht(t,e);return n==="alive"||r==="alive"?"alive":n==="unknown"||r==="unknown"?"unknown":"not_found"}async function ga(t,e,n,r){let o=Math.max(0,n),s=Math.max(1,r.pollIntervalMs??Ll),i=Date.now()+o,d,c=o===0,u=r.sleep?Promise.resolve().then(()=>r.sleep(o)).then(()=>{},()=>{}):new Promise(f=>{d=setTimeout(f,o);});u.then(()=>{c=true;});try{for(await $l();;){let f=ql(t,e);if(f==="not_found")return f;let p=i-Date.now();if(c||p<=0)return f;await Promise.race([u,Ul(Math.min(s,p))]);}}finally{d!==void 0&&clearTimeout(d);}}async function ua(t,e,n,r,o){let s=await ga(t,e,o.hardConfirmMs??Ml,{...o,sleep:void 0});return s==="not_found"?n?{status:"not_found",pid:t,method:r}:{status:"terminated",pid:t,method:r}:s==="alive"?{status:"failed",pid:t,method:r,error:"Process is still running after termination attempt"}:{status:"failed",pid:t,method:r,error:"Unable to verify process termination"}}async function Po(t,e,n={}){if(!pa(t))return "unknown";let r=n.platform??process.platform,o=r==="win32"?"powershell.exe":"ps",s=r==="win32"?["-NoLogo","-NoProfile","-NonInteractive","-ExecutionPolicy","Bypass","-Command",`$p = Get-CimInstance -ClassName Win32_Process -Filter 'ProcessId = ${t}' -ErrorAction Stop; if ($null -ne $p) { [Console]::Write([string]$p.CommandLine) }`]:["-p",String(t),"-o","command="],i;try{i=await fa(o,s,n);}catch{return "unknown"}if(i.error||i.status!==0)return "unknown";let d=i.stdout.trim();if(!d)return "not_found";let c=r==="win32"?d.toLowerCase():d;return e.filter(f=>f.trim().length>0).some(f=>{let p=r==="win32"?f.toLowerCase():f;return c.includes(p)})?"owned":"not_owned"}async function Do(t,e={}){let n=e.platform??process.platform,r=n==="win32"?"taskkill":"process-group",o=g=>({status:"failed",pid:t,method:r,error:g});if(!pa(t))return o("Invalid process ID");let s=e.kill??process.kill,i=Ht(t,s);if(i==="not_found")return {status:"not_found",pid:t,method:r};if(i!=="alive")return o("Unable to determine whether the process is alive");if(n==="win32"){let g;try{g=await fa("taskkill",["/PID",String(t),"/T","/F"],e);}catch(w){g={status:null,stdout:"",stderr:"",error:la(w)};}let m=Ht(t,s);return m==="not_found"?g.status===0&&!g.error?{status:"terminated",pid:t,method:r}:{status:"not_found",pid:t,method:r}:o(m==="alive"?"Process is still running after termination attempt":"Unable to verify process termination")}let d,c=e.signal??"SIGKILL";try{s(-t,c);}catch(g){d=g;}if(c==="SIGKILL")return ua(t,s,d,r,e);if(await ga(t,s,e.graceMs??Dl,e)==="not_found")return d?{status:"not_found",pid:t,method:r}:{status:"terminated",pid:t,method:r};let f;try{s(-t,"SIGKILL");}catch(g){f=g;}let p=await ua(t,s,f,r,e);return p.status==="terminated"?p:p.status==="not_found"?d?p:{status:"terminated",pid:t,method:r}:o(p.error??"Process termination failed")}var da,xo,Dl,Ll,Ml,Lo=v(()=>{h();da=3e3,xo="SIGINT",Dl=2e3,Ll=25,Ml=100;});function Ta(t,e){let n=e===void 0?"":` at index ${e}`;if(!t||typeof t!="object")throw new l("VALIDATION",`Task log entry${n} must be an object`);if(typeof t.timestamp!="string"||typeof t.level!="string"||typeof t.message!="string")throw new l("VALIDATION",`Task log entry${n} must contain string timestamp, level, and message fields`);return {timestamp:t.timestamp,level:t.level,message:t.message}}function _a(t,e){if(e===null||e.trim()==="")return [];let n;try{n=JSON.parse(e);}catch(r){throw new l("DB_ERROR",`Malformed legacy task logs: ${t}`,r)}if(!Array.isArray(n))throw new l("DB_ERROR",`Malformed legacy task logs: ${t} (expected an array)`);try{return n.map((r,o)=>Ta(r,o))}catch(r){throw r instanceof l?new l("DB_ERROR",`Malformed legacy task logs: ${t}`,r):r}}function wa(t){if(t.log_storage!=="blob"&&t.log_storage!=="events")throw new l("DB_ERROR",`Invalid task log storage for task: ${t.id}`);if(!Number.isInteger(t.last_log_seq)||t.last_log_seq<0)throw new l("DB_ERROR",`Invalid task log sequence for task: ${t.id}`);if(!Number.isInteger(t.log_revision)||t.log_revision<0)throw new l("DB_ERROR",`Invalid task log revision for task: ${t.id}`);return t.log_storage}function ka(t){return {taskId:t.id,source:wa(t),revision:t.log_revision,lastSeq:t.last_log_seq}}function Wl(t){if(!Number.isInteger(t)||t<0)throw new l("VALIDATION","Task log tail limit must be a non-negative integer")}var Ut,Or=v(()=>{h();oe();pe();ae();le();de();Ut=class extends F{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?Be(this.dbPath):super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=dirname(n);existsSync(o)||mkdirSync(o,{recursive:true});}else if(!existsSync(n))throw new l("NOT_FOUND","Database not found");let r=P(n);if(e)try{K(r.db,n);}catch(o){throw r.close(),o}return r}findStateRow(e,n){return e.db.select({id:a.id,log_storage:a.log_storage,last_log_seq:a.last_log_seq,log_revision:a.log_revision,logs:a.logs}).from(a).where(eq(a.id,n)).limit(1).get()}findStateRowInTransaction(e,n){return e.select({id:a.id,log_storage:a.log_storage,last_log_seq:a.last_log_seq,log_revision:a.log_revision,logs:a.logs}).from(a).where(eq(a.id,n)).limit(1).get()}requireStateRowInTransaction(e,n){let r=this.findStateRowInTransaction(e,n);if(!r)throw new l("NOT_FOUND",`Task not found: ${n}`);return r}appendLog(e,n){return this.appendLogs(e,[n])}appendLogs(e,n){let r=n.map((s,i)=>Ta(s,i));if(r.length===0){let s=this.getLogState(e);if(!s)throw new l("NOT_FOUND",`Task not found: ${e}`);return s}let o=this.openHandle(true);try{return o.db.transaction(i=>{let d=this.requireStateRowInTransaction(i,e),c=wa(d);if(c==="blob"){let g=_a(e,d.logs);if(i.update(a).set({logs:JSON.stringify([...g,...r]),log_revision:sql`${a.log_revision} + 1`}).where(eq(a.id,e)).run().changes!==1)throw new l("NOT_FOUND",`Task not found: ${e}`);return {taskId:e,source:c,revision:d.log_revision+1,lastSeq:d.last_log_seq}}let u=d.last_log_seq+1,f=d.last_log_seq+r.length;if(i.insert(nt).values(r.map((g,m)=>({task_id:e,seq:u+m,timestamp:g.timestamp,level:g.level,message:g.message}))).run(),i.update(a).set({last_log_seq:f,log_revision:sql`${a.log_revision} + 1`}).where(eq(a.id,e)).run().changes!==1)throw new l("NOT_FOUND",`Task not found: ${e}`);return {taskId:e,source:c,revision:d.log_revision+1,lastSeq:f}},{behavior:"immediate"})}catch(s){throw s instanceof l?s:new l("DB_ERROR","Failed to append task log",s)}finally{o.close();}}getLogState(e){if(!this.dbExists())return;let n=this.openHandle(false);try{let r=this.findStateRow(n,e);return r?ka(r):void 0}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to read task log state",r)}finally{n.close();}}readLogs(e){return this.readLogsInternal(e)}readLogsTail(e,n){return Wl(n),this.readLogsInternal(e,n)}readTail(e,n){return this.readLogsTail(e,n)}readLogsInternal(e,n){if(!this.dbExists())return;let r=this.openHandle(false);try{return r.db.transaction(o=>{let s=this.findStateRowInTransaction(o,e);if(!s)return;let i=ka(s);if(i.source==="blob"){let f=_a(e,s.logs);return {...i,entries:n===void 0?f:f.slice(Math.max(0,f.length-n))}}let d=o.select({seq:nt.seq,timestamp:nt.timestamp,level:nt.level,message:nt.message}).from(nt).where(eq(nt.task_id,e)).orderBy(n===void 0?asc(nt.seq):desc(nt.seq)),u=(n===void 0?d.all():d.limit(n).all()).map(({timestamp:f,level:p,message:g})=>({timestamp:f,level:p,message:g}));return n!==void 0&&u.reverse(),{...i,entries:u}},{behavior:"deferred"})}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to read task logs",o)}finally{r.close();}}};});var ya=v(()=>{h();});var Te,Nn=v(()=>{h();Te=class extends Error{constructor(n,r,o){super(n);this.providerStr=r;this.name="ProviderError",this.code=o?.code??"UNKNOWN",this.kind=o?.kind??(this.code==="UNKNOWN"?"transient":void 0),this.retryAfterMs=o?.retryAfterMs;}providerStr;code;kind;retryAfterMs;stdout};});var _t,Mo=v(()=>{h();Nn();_t=class extends Te{name="RateLimitError";constructor(e,n="cli/claude"){super(e,n,{code:"QUOTA_EXHAUSTED",kind:"transient"});}};});function at(t){return /crewx\s+(q|query|x|execute)\s/.test(t)}function dt(t,e,n){let r=e.match(/@(\S+)/);return {timestamp:t,type:"agent_call",targetAgent:r?.[1]?.replace(/["']/g,""),toolInput:e,...typeof n=="string"&&n.length>0?{toolUseId:n}:{}}}var on=v(()=>{h();});function Jl(t){let e=Yl(t),n=e.map((s,i)=>({line:s,index:i})).filter(({line:s})=>Ql(s.value)),r=Xl(e);return {result:n.length===1&&n[0].index===r?Zl(n[0].line.value):null,resultPreview:np(e,n),hasReservedLine:n.length>0}}function kt(t,e){let n=Jl(t);return {resultPreview:n.resultPreview,isError:e||n.result?.isError===true,...n.hasReservedLine?{delegationResult:n.result}:{}}}function Yl(t){let e=[],n=0;for(let r=0;r<t.length;r++){let o=t[r];if(o!==`
12
+ )`),instanceRequestUnique:uniqueIndex("ui_action_receipts_instance_request_uq").on(t.instance_id,t.request_id),instanceIdIdx:index("ui_action_receipts_instance_id_idx").on(t.instance_id),requestedAtIdx:index("ui_action_receipts_requested_at_idx").on(t.requested_at)}));});var G,Pe,Ke,Pi=A(()=>{h();G=sqliteTable("projects",{id:text("id").primaryKey().notNull(),workspace_id:text("workspace_id").notNull(),name:text("name").notNull(),outcome:text("outcome").notNull(),due_date:text("due_date"),scene:text("scene").notNull().default("planning"),stages_json:text("stages_json").notNull(),stage_index:integer("stage_index").notNull(),created_at:text("created_at").notNull(),updated_at:text("updated_at").notNull(),accepted_at:text("accepted_at"),archived_at:text("archived_at")},t=>({idCheck:check("projects_id_ck",sql`${t.id} GLOB 'prj_*'`),sceneCheck:check("projects_scene_ck",sql`${t.scene} IN ('planning', 'plan_review', 'running', 'human_wait', 'limit_wait', 'failed_stop', 'analyzing_feedback', 'replanned', 'awaiting_review', 'accepted')`),stagesJsonCheck:check("projects_stages_json_ck",sql`json_valid(${t.stages_json}) AND json_type(${t.stages_json}) = 'array'`),stageIndexCheck:check("projects_stage_index_ck",sql`${t.stage_index} >= 1`)})),Pe=sqliteTable("project_criteria",{id:text("id").primaryKey().notNull(),project_id:text("project_id").notNull().references(()=>G.id,{onDelete:"cascade"}),position:integer("position").notNull(),statement:text("statement").notNull(),verify_status:text("verify_status").notNull().default("pending"),verified_at:text("verified_at"),evidence_json:text("evidence_json").notNull().default("[]"),created_at:text("created_at").notNull(),updated_at:text("updated_at").notNull()},t=>({idCheck:check("project_criteria_id_ck",sql`${t.id} GLOB 'pjc_*'`),verifyStatusCheck:check("project_criteria_verify_status_ck",sql`${t.verify_status} IN ('pending', 'verifying', 'passed', 'failed')`),evidenceJsonCheck:check("project_criteria_evidence_json_ck",sql`json_valid(${t.evidence_json}) AND json_type(${t.evidence_json}) = 'array'`),projectPositionUnique:uniqueIndex("project_criteria_project_position_uq").on(t.project_id,t.position)})),Ke=sqliteTable("project_events",{id:text("id").primaryKey().notNull(),project_id:text("project_id").notNull().references(()=>G.id,{onDelete:"restrict"}),seq:integer("seq").notNull(),actor_type:text("actor_type").notNull(),actor_id:text("actor_id"),type:text("type").notNull(),title:text("title").notNull(),summary:text("summary"),payload_json:text("payload_json").notNull().default("{}"),created_at:text("created_at").notNull()},t=>({idCheck:check("project_events_id_ck",sql`${t.id} GLOB 'pje_*'`),actorTypeCheck:check("project_events_actor_type_ck",sql`${t.actor_type} IN ('user', 'project_manager', 'system')`),payloadJsonCheck:check("project_events_payload_json_ck",sql`json_valid(${t.payload_json}) AND json_type(${t.payload_json}) = 'object'`),projectSeqUnique:uniqueIndex("project_events_project_seq_uq").on(t.project_id,t.seq)}));});var wr,yr,I,Ro=A(()=>{h();wr=["THREAD_STATE","THREAD_PRIORITY"],yr=["gray","blue","violet","green","amber","orange","red","pink"],I=sqliteTable("common_codes",{code_group:text("code_group").notNull(),code:text("code").notNull(),code_name:text("code_name"),color:text("color").notNull().default("gray"),sort_order:integer("sort_order").notNull(),workspace_id:text("workspace_id"),is_builtin:integer("is_builtin").notNull().default(0),is_archived:integer("is_archived").notNull().default(0),metadata:text("metadata"),created_at:text("created_at").notNull(),updated_at:text("updated_at").notNull()},t=>({pk:primaryKey({columns:[t.code_group,t.code]}),metadataCheck:check("common_codes_metadata_ck",sql`${t.metadata} IS NULL OR (json_valid(${t.metadata}) AND json_type(${t.metadata}) = 'object')`),builtinCheck:check("common_codes_builtin_ck",sql`${t.is_builtin} IN (0, 1)`),archivedCheck:check("common_codes_archived_ck",sql`${t.is_archived} IN (0, 1)`),idxCommonCodesSelection:index("idx_common_codes_group_archived_order").on(t.code_group,t.is_archived,t.sort_order)}));});var Di,Li,Mi,Hi,Ui,W,F,M,$i=A(()=>{h();mr();Di=["thread.snapshot.imported","thread.title.changed","thread.priority.changed","thread.state.changed","thread.highlight.created","thread.highlight.updated","thread.highlight.deleted","thread.highlights.regenerated"],Li=["user","agent","system"],Mi=["auto","manual"],Hi=["decision","judgment","issue","result","pivot"],Ui=["queued","running","completed","failed"],W=sqliteTable("thread_events",{id:text("id").primaryKey().notNull(),thread_id:text("thread_id").notNull().references(()=>w.id,{onDelete:"cascade"}),seq:integer("seq").notNull(),type:text("type").notNull(),actor_type:text("actor_type").notNull(),payload_json:text("payload_json").notNull(),created_at:text("created_at").notNull(),actor_id:text("actor_id"),task_id:text("task_id"),highlight_id:text("highlight_id")},t=>({typeCheck:check("thread_events_type_ck",sql`${t.type} IN ('thread.snapshot.imported', 'thread.title.changed', 'thread.priority.changed', 'thread.state.changed', 'thread.highlight.created', 'thread.highlight.updated', 'thread.highlight.deleted', 'thread.highlights.regenerated')`),actorTypeCheck:check("thread_events_actor_type_ck",sql`${t.actor_type} IN ('user', 'agent', 'system')`),payloadJsonCheck:check("thread_events_payload_json_ck",sql`json_valid(${t.payload_json}) AND json_type(${t.payload_json}) = 'object'`),threadSeqIndex:index("idx_thread_events_thread_seq").on(t.thread_id,t.seq),threadCreatedIndex:index("idx_thread_events_thread_created").on(t.thread_id,t.created_at),threadSeqUnique:uniqueIndex("thread_events_thread_seq_uq").on(t.thread_id,t.seq)})),F=sqliteTable("thread_highlight_runs",{id:text("id").primaryKey().notNull(),thread_id:text("thread_id").notNull().references(()=>w.id,{onDelete:"cascade"}),request_id:text("request_id").notNull(),status:text("status").notNull(),detector_version:text("detector_version").notNull(),requested_at:text("requested_at").notNull(),started_at:text("started_at"),completed_at:text("completed_at"),error_code:text("error_code"),previous_auto_count:integer("previous_auto_count"),new_auto_count:integer("new_auto_count")},t=>({statusCheck:check("thread_highlight_runs_status_ck",sql`${t.status} IN ('queued', 'running', 'completed', 'failed')`),countCheck:check("thread_highlight_runs_counts_ck",sql`(${t.previous_auto_count} IS NULL OR ${t.previous_auto_count} >= 0) AND (${t.new_auto_count} IS NULL OR ${t.new_auto_count} >= 0)`),threadRequestUnique:uniqueIndex("thread_highlight_runs_thread_request_uq").on(t.thread_id,t.request_id),inProgressThreadUnique:uniqueIndex("thread_highlight_runs_in_progress_thread_uq").on(t.thread_id).where(sql`${t.status} IN ('queued', 'running')`),threadStatusRequestedIndex:index("idx_thread_highlight_runs_thread_status_requested").on(t.thread_id,t.status,t.requested_at)})),M=sqliteTable("thread_highlights",{id:text("id").primaryKey().notNull(),thread_id:text("thread_id").notNull().references(()=>w.id,{onDelete:"cascade"}),source:text("source").notNull(),kind:text("kind").notNull(),status:text("status").notNull().default("active"),text:text("text"),covers_from_task_id:text("covers_from_task_id").notNull(),covers_to_task_id:text("covers_to_task_id").notNull(),revision:integer("revision").notNull().default(0),created_at:text("created_at").notNull(),updated_at:text("updated_at").notNull(),agent_id:text("agent_id"),source_task_id:text("source_task_id"),detector_version:text("detector_version"),content_fingerprint:text("content_fingerprint"),dismissed_at:text("dismissed_at")},t=>({sourceCheck:check("thread_highlights_source_ck",sql`${t.source} IN ('auto', 'manual')`),kindCheck:check("thread_highlights_kind_ck",sql`${t.kind} IN ('decision', 'judgment', 'issue', 'result', 'pivot')`),statusCheck:check("thread_highlights_status_ck",sql`${t.status} IN ('active', 'dismissed')`),activeTextCheck:check("thread_highlights_active_text_ck",sql`${t.status} = 'dismissed' OR (${t.text} IS NOT NULL AND length(${t.text}) > 0)`),coversCheck:check("thread_highlights_covers_ck",sql`length(${t.covers_from_task_id}) > 0 AND length(${t.covers_to_task_id}) > 0`),autoKeyCheck:check("thread_highlights_auto_key_ck",sql`${t.source} = 'manual' OR (${t.source} = 'auto' AND ${t.source_task_id} IS NOT NULL AND ${t.detector_version} IS NOT NULL AND ${t.content_fingerprint} IS NOT NULL AND length(${t.source_task_id}) > 0 AND length(${t.detector_version}) > 0 AND length(${t.content_fingerprint}) > 0)`),threadStatusCreatedIndex:index("idx_thread_highlights_thread_status_created").on(t.thread_id,t.status,t.created_at),threadCoversIndex:index("idx_thread_highlights_thread_covers").on(t.thread_id,t.covers_from_task_id,t.covers_to_task_id),autoIdempotencyUnique:uniqueIndex("thread_highlights_auto_idempotency_uq").on(t.thread_id,t.source_task_id,t.detector_version,t.content_fingerprint).where(sql`${t.source} = 'auto'`)}));});var Fi=A(()=>{h();sqliteTable("storage_metadata",{source_kind:text("source_kind").notNull(),source_id:text("source_id").notNull(),utc_ts:text("utc_ts"),bytes:integer("bytes").notNull()},t=>({pk:primaryKey({columns:[t.source_kind,t.source_id]}),kindTimestampBytesIndex:index("idx_storage_metadata_kind_ts_bytes").on(t.source_kind,t.utc_ts,t.bytes)})),sqliteTable("storage_metadata_state",{unit:text("unit").primaryKey().notNull(),cursor_rowid:integer("cursor_rowid").notNull().default(0),end_rowid:integer("end_rowid"),complete:integer("complete").notNull().default(0),updated_at:text("updated_at").notNull()});});var de=A(()=>{h();ho();vn();pi();mr();hi();mi();ki();wi();Ei();Si();Ii();Ai();Oi();xi();Pi();Ro();$i();Fi();});var tn,Po,ua,Do=A(()=>{h();tn={"claude-fable-5-1":{input:10,cachedInput:.25,output:50},"claude-fable-5":{input:10,cachedInput:1,output:50},"claude-opus-5":{input:5,cachedInput:.5,output:25},"claude-opus-4-8":{input:5,cachedInput:.5,output:25},"claude-opus-4-7":{input:5,cachedInput:.5,output:25},"claude-opus-4-6":{input:5,cachedInput:.5,output:25},"claude-sonnet-5":{input:2,cachedInput:.2,output:10},"claude-sonnet-4-6":{input:3,cachedInput:.3,output:15},"claude-haiku-4-5":{input:1,cachedInput:.1,output:5},"gpt-6-astra":{input:10,cachedInput:1,output:50},"gpt-5.6-sol":{input:5,cachedInput:.5,output:30},"gpt-5.6-terra":{input:2,cachedInput:.2,output:12},"gpt-5.6-luna":{input:.2,cachedInput:.02,output:1.2},"gpt-5.5":{input:5,cachedInput:.5,output:30},"gpt-5.4":{input:2.5,cachedInput:.25,output:15},"gpt-5.4-mini":{input:.75,cachedInput:.075,output:4.5},"gpt-5.3-codex":{input:1.75,cachedInput:.175,output:14},"gpt-5-mini":{input:.4,cachedInput:.1,output:1.6},"gpt-4.1":{input:2,cachedInput:.5,output:8},"gpt-4o":{input:2.5,cachedInput:1.25,output:10},"glm-5.2":{input:1.4,cachedInput:.26,output:4.4},"glm-5.1":{input:1.4,cachedInput:.26,output:4.4},"gemini-3.7-flash":{input:1.5,cachedInput:.15,output:7.5},"gemini-3.6-flash":{input:1.5,cachedInput:.15,output:7.5},"grok-4.6":{input:2,cachedInput:.5,output:6},"grok-4.5":{input:2,cachedInput:.3,output:6}},Po=new Set(["gpt-5.3-codex-spark"]),ua=new Set(["auto","claude-fable-5","claude-fable-5-1","claude-haiku-4-5","claude-opus-4-6-thinking","claude-opus-4-6[1m]","claude-opus-4-7[1m]","claude-opus-4-8[1m]","claude-opus-5","claude-sonnet-4-6","claude-sonnet-4-6[1m]","claude-sonnet-5","gemini-3.1-pro","gemini-3.5-flash","gemini-3.6-flash","gemini-3.7-flash","gpt-5.3-codex","gpt-5.3-codex-spark","gpt-5.4","gpt-5.4-mini","gpt-5.5","gpt-5.6-luna","gpt-5.6-sol","gpt-5.6-terra","gpt-6-astra","gpt-oss-120b","grok-4.5","grok-4.6"]);});function Lo(t){let e=t.toLowerCase().trim();e=e.replace(/\[[^\]]*\]$/g,"");let n=e.lastIndexOf("/");return n>=0&&(e=e.slice(n+1)),e=e.replace(/-\d{8}$/,""),e}function Ml(t){if(!t)return console.warn("[pricing] missing model id; cost is being recorded as 0"),Cn;let e=Lo(t),n=Ll[e];if(n)return Or[n]??tn[n]??Cn;if(Or[e])return Or[e];if(tn[e])return tn[e];if(Po.has(e))return console.warn(`[pricing] unpublished model pricing: ${t}, cost_usd=0`),Cn;if(ua.has(e))return console.warn(`[pricing] missing catalog pricing: ${t}, cost_usd=0`),Cn;let r={...tn,...Or};for(let o of Object.keys(r))if(e.includes(o))return r[o];return console.warn(`[pricing] Unknown model: ${t}, cost_usd=0`),Cn}function Hl(t,e,n,r=0,o){let s=Ml(n),i=Math.min(r,t),c=(t-i)*s.input/1e6,u=i*s.cachedInput/1e6,f=e*s.output/1e6;return c+u+f}function la(t,e,n,r,o,s){return t&&t>0?t:!e&&!n?0:Hl(e??0,n??0,o,r??0)}var Ll,Cn,Or,Nr=A(()=>{h();Do();Do();Ll={opus:"claude-opus-4-8",sonnet:"claude-sonnet-4-6",haiku:"claude-haiku-4-5","codex-mini":"gpt-5.3-codex",codex:"gpt-5.3-codex"},Cn={input:0,cachedInput:0,output:0},Or={};});function ha(t){return t instanceof Error?t:t===void 0?void 0:new Error(String(t))}function fa(t){return typeof t=="object"&&t!==null&&"code"in t?String(t.code):void 0}function ma(t){return Number.isSafeInteger(t)&&t>0}function Bl(t,e){return new Promise(n=>{let r;try{r=spawn(t,e,{windowsHide:!0});}catch(u){n({status:null,stdout:"",stderr:"",error:ha(u)});return}let o="",s="",i=false,d,c=setTimeout(()=>{try{r.kill();}catch{}d({status:null,stdout:o,stderr:s,error:new Error(`Command timed out after ${pa}ms`)});},pa);d=u=>{i||(i=true,clearTimeout(c),n(u));},r.stdout?.setEncoding("utf8"),r.stderr?.setEncoding("utf8"),r.stdout?.on("data",u=>{o+=String(u);}),r.stderr?.on("data",u=>{s+=String(u);}),r.once("error",u=>{d({status:null,stdout:o,stderr:s,error:u});}),r.once("close",u=>{d({status:u,stdout:o,stderr:s});});})}async function _a(t,e,n){return n.runCommandAsync?n.runCommandAsync(t,e):n.runCommand?n.runCommand(t,e):Bl(t,e)}function jl(t){return new Promise(e=>{setTimeout(e,Math.max(0,t));})}function zl(){return new Promise(t=>{setImmediate(t);})}function Lt(t,e=process.kill){try{return e(t,0),"alive"}catch(n){return fa(n)==="ESRCH"?"not_found":fa(n)==="EPERM"?"alive":"unknown"}}function Gl(t,e){let n=Lt(-t,e),r=Lt(t,e);return n==="alive"||r==="alive"?"alive":n==="unknown"||r==="unknown"?"unknown":"not_found"}async function ka(t,e,n,r){let o=Math.max(0,n),s=Math.max(1,r.pollIntervalMs??ql),i=Date.now()+o,d,c=o===0,u=r.sleep?Promise.resolve().then(()=>r.sleep(o)).then(()=>{},()=>{}):new Promise(f=>{d=setTimeout(f,o);});u.then(()=>{c=true;});try{for(await zl();;){let f=Gl(t,e);if(f==="not_found")return f;let p=i-Date.now();if(c||p<=0)return f;await Promise.race([u,jl(Math.min(s,p))]);}}finally{d!==void 0&&clearTimeout(d);}}async function ga(t,e,n,r,o){let s=await ka(t,e,o.hardConfirmMs??Fl,{...o,sleep:void 0});return s==="not_found"?n?{status:"not_found",pid:t,method:r}:{status:"terminated",pid:t,method:r}:s==="alive"?{status:"failed",pid:t,method:r,error:"Process is still running after termination attempt"}:{status:"failed",pid:t,method:r,error:"Unable to verify process termination"}}async function Ho(t,e,n={}){if(!ma(t))return "unknown";let r=n.platform??process.platform,o=r==="win32"?"powershell.exe":"ps",s=r==="win32"?["-NoLogo","-NoProfile","-NonInteractive","-ExecutionPolicy","Bypass","-Command",`$p = Get-CimInstance -ClassName Win32_Process -Filter 'ProcessId = ${t}' -ErrorAction Stop; if ($null -ne $p) { [Console]::Write([string]$p.CommandLine) }`]:["-p",String(t),"-o","command="],i;try{i=await _a(o,s,n);}catch{return "unknown"}if(i.error||i.status!==0)return "unknown";let d=i.stdout.trim();if(!d)return "not_found";let c=r==="win32"?d.toLowerCase():d;return e.filter(f=>f.trim().length>0).some(f=>{let p=r==="win32"?f.toLowerCase():f;return c.includes(p)})?"owned":"not_owned"}async function Uo(t,e={}){let n=e.platform??process.platform,r=n==="win32"?"taskkill":"process-group",o=g=>({status:"failed",pid:t,method:r,error:g});if(!ma(t))return o("Invalid process ID");let s=e.kill??process.kill,i=Lt(t,s);if(i==="not_found")return {status:"not_found",pid:t,method:r};if(i!=="alive")return o("Unable to determine whether the process is alive");if(n==="win32"){let g;try{g=await _a("taskkill",["/PID",String(t),"/T","/F"],e);}catch(_){g={status:null,stdout:"",stderr:"",error:ha(_)};}let m=Lt(t,s);return m==="not_found"?g.status===0&&!g.error?{status:"terminated",pid:t,method:r}:{status:"not_found",pid:t,method:r}:o(m==="alive"?"Process is still running after termination attempt":"Unable to verify process termination")}let d,c=e.signal??"SIGKILL";try{s(-t,c);}catch(g){d=g;}if(c==="SIGKILL")return ga(t,s,d,r,e);if(await ka(t,s,e.graceMs??$l,e)==="not_found")return d?{status:"not_found",pid:t,method:r}:{status:"terminated",pid:t,method:r};let f;try{s(-t,"SIGKILL");}catch(g){f=g;}let p=await ga(t,s,f,r,e);return p.status==="terminated"?p:p.status==="not_found"?d?p:{status:"terminated",pid:t,method:r}:o(p.error??"Process termination failed")}var pa,Mo,$l,ql,Fl,$o=A(()=>{h();pa=3e3,Mo="SIGINT",$l=2e3,ql=25,Fl=100;});function Ea(t,e){let n=e===void 0?"":` at index ${e}`;if(!t||typeof t!="object")throw new l("VALIDATION",`Task log entry${n} must be an object`);if(typeof t.timestamp!="string"||typeof t.level!="string"||typeof t.message!="string")throw new l("VALIDATION",`Task log entry${n} must contain string timestamp, level, and message fields`);return {timestamp:t.timestamp,level:t.level,message:t.message}}function ya(t,e){if(e===null||e.trim()==="")return [];let n;try{n=JSON.parse(e);}catch(r){throw new l("DB_ERROR",`Malformed legacy task logs: ${t}`,r)}if(!Array.isArray(n))throw new l("DB_ERROR",`Malformed legacy task logs: ${t} (expected an array)`);try{return n.map((r,o)=>Ea(r,o))}catch(r){throw r instanceof l?new l("DB_ERROR",`Malformed legacy task logs: ${t}`,r):r}}function Sa(t){if(t.log_storage!=="blob"&&t.log_storage!=="events")throw new l("DB_ERROR",`Invalid task log storage for task: ${t.id}`);if(!Number.isInteger(t.last_log_seq)||t.last_log_seq<0)throw new l("DB_ERROR",`Invalid task log sequence for task: ${t.id}`);if(!Number.isInteger(t.log_revision)||t.log_revision<0)throw new l("DB_ERROR",`Invalid task log revision for task: ${t.id}`);return t.log_storage}function Ra(t){return {taskId:t.id,source:Sa(t),revision:t.log_revision,lastSeq:t.last_log_seq}}function Xl(t){if(!Number.isInteger(t)||t<0)throw new l("VALIDATION","Task log tail limit must be a non-negative integer")}var Mt,xr=A(()=>{h();oe();fe();ae();pe();de();Mt=class extends B{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?ze(this.dbPath):super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=dirname(n);existsSync(o)||mkdirSync(o,{recursive:true});}else if(!existsSync(n))throw new l("NOT_FOUND","Database not found");let r=P(n);if(e)try{K(r.db,n);}catch(o){throw r.close(),o}return r}findStateRow(e,n){return e.db.select({id:a.id,log_storage:a.log_storage,last_log_seq:a.last_log_seq,log_revision:a.log_revision,logs:a.logs}).from(a).where(eq(a.id,n)).limit(1).get()}findStateRowInTransaction(e,n){return e.select({id:a.id,log_storage:a.log_storage,last_log_seq:a.last_log_seq,log_revision:a.log_revision,logs:a.logs}).from(a).where(eq(a.id,n)).limit(1).get()}requireStateRowInTransaction(e,n){let r=this.findStateRowInTransaction(e,n);if(!r)throw new l("NOT_FOUND",`Task not found: ${n}`);return r}appendLog(e,n){return this.appendLogs(e,[n])}appendLogs(e,n){let r=n.map((s,i)=>Ea(s,i));if(r.length===0){let s=this.getLogState(e);if(!s)throw new l("NOT_FOUND",`Task not found: ${e}`);return s}let o=this.openHandle(true);try{return o.db.transaction(i=>{let d=this.requireStateRowInTransaction(i,e),c=Sa(d);if(c==="blob"){let g=ya(e,d.logs);if(i.update(a).set({logs:JSON.stringify([...g,...r]),log_revision:sql`${a.log_revision} + 1`}).where(eq(a.id,e)).run().changes!==1)throw new l("NOT_FOUND",`Task not found: ${e}`);return {taskId:e,source:c,revision:d.log_revision+1,lastSeq:d.last_log_seq}}let u=d.last_log_seq+1,f=d.last_log_seq+r.length;if(i.insert(rt).values(r.map((g,m)=>({task_id:e,seq:u+m,timestamp:g.timestamp,level:g.level,message:g.message}))).run(),i.update(a).set({last_log_seq:f,log_revision:sql`${a.log_revision} + 1`}).where(eq(a.id,e)).run().changes!==1)throw new l("NOT_FOUND",`Task not found: ${e}`);return {taskId:e,source:c,revision:d.log_revision+1,lastSeq:f}},{behavior:"immediate"})}catch(s){throw s instanceof l?s:new l("DB_ERROR","Failed to append task log",s)}finally{o.close();}}getLogState(e){if(!this.dbExists())return;let n=this.openHandle(false);try{let r=this.findStateRow(n,e);return r?Ra(r):void 0}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to read task log state",r)}finally{n.close();}}readLogs(e){return this.readLogsInternal(e)}readLogsTail(e,n){return Xl(n),this.readLogsInternal(e,n)}readTail(e,n){return this.readLogsTail(e,n)}readLogsInternal(e,n){if(!this.dbExists())return;let r=this.openHandle(false);try{return r.db.transaction(o=>{let s=this.findStateRowInTransaction(o,e);if(!s)return;let i=Ra(s);if(i.source==="blob"){let f=ya(e,s.logs);return {...i,entries:n===void 0?f:f.slice(Math.max(0,f.length-n))}}let d=o.select({seq:rt.seq,timestamp:rt.timestamp,level:rt.level,message:rt.message}).from(rt).where(eq(rt.task_id,e)).orderBy(n===void 0?asc(rt.seq):desc(rt.seq)),u=(n===void 0?d.all():d.limit(n).all()).map(({timestamp:f,level:p,message:g})=>({timestamp:f,level:p,message:g}));return n!==void 0&&u.reverse(),{...i,entries:u}},{behavior:"deferred"})}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to read task logs",o)}finally{r.close();}}};});var ba=A(()=>{h();});var ce,nn=A(()=>{h();ce=class extends Error{constructor(n,r,o){super(n);this.providerStr=r;this.name="ProviderError",this.code=o?.code??"UNKNOWN",this.kind=o?.kind??(this.code==="UNKNOWN"?"transient":void 0),this.retryAfterMs=o?.retryAfterMs;}providerStr;code;kind;retryAfterMs;stdout};});var kt,qo=A(()=>{h();nn();kt=class extends ce{name="RateLimitError";constructor(e,n="cli/claude"){super(e,n,{code:"QUOTA_EXHAUSTED",kind:"transient"});}};});function Ql(t,e){let n=t.trimStart();if(!n.startsWith("{"))return false;let r;try{r=JSON.parse(n);}catch{return false}let o=r.type;if(typeof o!="string")return false;let s=e?ip[e]:void 0;return s?s(r,o):Object.values(va).some(i=>i(r,o))}function rn(t,e){let n=t.split(`
13
+ `).filter(r=>r.trim());return n.length===0?false:n.every(r=>Ql(r,e))}function Fe(t){return typeof t=="object"&&t!==null}function Ia(t,e){if(e==="assistant"||e==="user"){let n=t.message;return Fe(n)&&Array.isArray(n.content)}return e==="system"?typeof t.subtype=="string"||typeof t.session_id=="string":e==="result"?typeof t.result=="string"||Fe(t.usage)||typeof t.total_cost_usd=="number"||typeof t.is_error=="boolean":e==="rate_limit_event"?Fe(t.rate_limit_info):e==="tool_progress"?t.heartbeat===true&&typeof t.tool_use_id=="string":false}function Zl(t,e){return typeof t.session_id=="string"||typeof t.uuid=="string"?true:Ia(t,e)}function ep(t,e){if(e==="item.updated"||e.startsWith("thread.")||e.startsWith("turn."))return true;if(e==="item.started"||e==="item.completed"){let n=t.item;return Fe(n)&&typeof n.type=="string"}return false}function tp(t,e){return e==="step_start"||e==="step_finish"?typeof t.stepID=="string"||typeof t.sessionID=="string"||Fe(t.part):e==="text"||e==="tool_use"?Fe(t.part):e==="result"?typeof t.result=="string":false}function np(t,e){return !!(typeof t.stepID=="string"||typeof t.sessionID=="string"||Fe(t.part)||e==="result"&&typeof t.result=="string")}function rp(t,e){return e.startsWith("assistant.")||e.startsWith("tool.execution")||e==="user.message"?Fe(t.data):e==="result"?typeof t.result=="string":false}function op(t,e){return e==="message"?typeof t.role=="string":e==="tool_use"?typeof t.tool_name=="string"||typeof t.tool_id=="string":e==="tool_result"?typeof t.tool_id=="string"||typeof t.status=="string":false}function sp(t,e){return e==="available_commands"?Fe(t.tools)||Fe(t.commands):e==="usage"?Fe(t.usage):e==="end"?typeof t.sessionId=="string"||typeof t.stopReason=="string"||Fe(t.usage):e==="tool_call_update"?typeof t.toolCallId=="string"||typeof t.status=="string":false}var va,ip,Cr=A(()=>{h();va={claude:Ia,codex:ep,opencode:tp,copilot:rp,gemini:op},ip={...va,claude:Zl,opencode:np,grok:sp,antigravity:()=>false};});function dt(t){return /crewx\s+(q|query|x|execute)\s/.test(t)}function ct(t,e,n){let r=e.match(/@(\S+)/);return {timestamp:t,type:"agent_call",targetAgent:r?.[1]?.replace(/["']/g,""),toolInput:e,...typeof n=="string"&&n.length>0?{toolUseId:n}:{}}}var on=A(()=>{h();});function cp(t){let e=up(t),n=e.map((s,i)=>({line:s,index:i})).filter(({line:s})=>pp(s.value)),r=lp(e);return {result:n.length===1&&n[0].index===r?fp(n[0].line.value):null,resultPreview:mp(e,n),hasReservedLine:n.length>0}}function Tt(t,e){let n=cp(t);return {resultPreview:n.resultPreview,isError:e||n.result?.isError===true,...n.hasReservedLine?{delegationResult:n.result}:{}}}function up(t){let e=[],n=0;for(let r=0;r<t.length;r++){let o=t[r];if(o!==`
13
14
  `&&o!=="\r")continue;let s=o==="\r"&&t[r+1]===`
14
15
  `?`\r
15
- `:o;e.push({value:t.slice(n,r),separator:s}),r+=s.length-1,n=r+1;}return e.push({value:t.slice(n),separator:""}),e}function Xl(t){for(let e=t.length-1;e>=0;e--)if(t[e].value.trim())return e;return -1}function Ql(t){return t.trimStart().startsWith(Kl)}function Zl(t){let e=t.trim();if(!e.startsWith(Ea)||!e.endsWith("]]"))return null;let n=e.slice(Ea.length,-2);if(!n)return null;try{return ep(JSON.parse(n))}catch{return null}}function ep(t){return tp(t)?Object.prototype.hasOwnProperty.call(t,"taskId")?{schema:1,taskId:t.taskId,agentId:t.agentId,isError:t.isError}:{schema:1,isError:true}:null}function tp(t){if(!rp(t)||Object.keys(t).some(r=>!Vl.has(r))||t.schema!==1||typeof t.isError!="boolean")return false;let e=Object.prototype.hasOwnProperty.call(t,"taskId"),n=Object.prototype.hasOwnProperty.call(t,"agentId");return e!==n?false:e?Ra(t.taskId)&&Ra(t.agentId):t.isError===true}function np(t,e){if(e.length===0)return t.map(r=>r.value+r.separator).join("");let n=new Set(e.map(({index:r})=>r));return t.map((r,o)=>n.has(o)?"":r.value+r.separator).join("")}function Ra(t){return typeof t=="string"&&t.trim().length>0}function rp(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Ea,Kl,Vl,xn=v(()=>{h();Ea="[[crewx:delegation-result ",Kl="[[crewx:delegation-result",Vl=new Set(["schema","taskId","agentId","isError"]);});function ct(t){if(typeof t=="string")return t;if(!t||typeof t!="object")return JSON.stringify(t??{});let e=t;return typeof e.command=="string"?e.command:typeof e.file_path=="string"?e.file_path:typeof e.filePath=="string"?e.filePath:typeof e.path=="string"?e.path:typeof e.query=="string"?e.query:typeof e.pattern=="string"?e.pattern:typeof e.url=="string"?e.url:typeof e.prompt=="string"?e.prompt.length>200?e.prompt.slice(0,200)+"\u2026":e.prompt:typeof e.description=="string"?e.description:JSON.stringify(e)}var sn=v(()=>{h();});var Sa,Cr,Ho,Nr=v(()=>{h();Sa=["none","minimal","low","medium","high","xhigh","max","ultra"],Cr={claude:["low","medium","high","xhigh","max"],codex:["minimal","low","medium","high","xhigh","max","ultra"],opencode:[],copilot:["none","low","medium","high","xhigh","max"],antigravity:["low","medium","high"],grok:["low","medium","high","xhigh"]},Ho={claude:{models:[{id:"claude-fable-5-1",name:"Claude Fable 5.1",contextWindowTokens:1e6,tier:"flagship",recommended:true},{id:"claude-fable-5",name:"Claude Fable 5",contextWindowTokens:1e6,tier:"flagship"},{id:"claude-opus-5",name:"Claude Opus 5",contextWindowTokens:1e6,tier:"flagship",recommended:true},{id:"claude-sonnet-5",name:"Claude Sonnet 5",contextWindowTokens:1e6,tier:"balanced",recommended:true},{id:"claude-opus-4-8[1m]",name:"Claude Opus 4.8",contextWindowTokens:1e6,tier:"flagship"},{id:"claude-opus-4-7[1m]",name:"Claude Opus 4.7",contextWindowTokens:1e6,tier:"flagship"},{id:"claude-opus-4-6[1m]",name:"Claude Opus 4.6",contextWindowTokens:1e6,tier:"flagship"},{id:"claude-sonnet-4-6[1m]",name:"Claude Sonnet 4.6",contextWindowTokens:1e6,tier:"balanced"},{id:"claude-haiku-4-5",name:"Claude Haiku 4.5",contextWindowTokens:2e5,tier:"speed"}],modes:[{id:"default",name:"Default",description:"Uses Claude's default permission handling with normal approval prompts."},{id:"acceptEdits",name:"Accept Edits",description:"Allows file edits without approval; other permission checks remain in place."},{id:"plan",name:"Plan",description:"Keeps Claude in plan mode so it can inspect and propose changes without applying them."},{id:"dontAsk",name:"Don't Ask",description:"Does not ask for permissions; only pre-approved tool actions can proceed."},{id:"bypassPermissions",name:"Bypass Permissions",description:"Bypasses Claude permission checks so tools can run without approval prompts."}],effort:["low","medium","high"],modelOverrides:{"claude-fable-5-1":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-fable-5":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-opus-5":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-sonnet-5":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-opus-4-8[1m]":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-opus-4-7[1m]":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-opus-4-6[1m]":{effort:["low","medium","high","max"],defaultEffort:"high"},"claude-sonnet-4-6[1m]":{effort:["low","medium","high","max"],defaultEffort:"high"},"claude-haiku-4-5":{effort:[]}},providerOptions:[]},codex:{models:[{id:"gpt-6-astra",name:"GPT-6 Astra",contextWindowTokens:105e4,tier:"flagship"},{id:"gpt-5.6-sol",name:"GPT-5.6 Sol",contextWindowTokens:105e4,tier:"flagship",recommended:true},{id:"gpt-5.6-terra",name:"GPT-5.6 Terra",contextWindowTokens:105e4,tier:"balanced",recommended:true},{id:"gpt-5.6-luna",name:"GPT-5.6 Luna",contextWindowTokens:105e4,tier:"speed",recommended:true},{id:"gpt-5.5",name:"GPT-5.5",contextWindowTokens:105e4,tier:"flagship"},{id:"gpt-5.4",name:"GPT-5.4",contextWindowTokens:105e4,tier:"flagship"},{id:"gpt-5.4-mini",name:"GPT-5.4 Mini",contextWindowTokens:4e5,tier:"speed"},{id:"gpt-5.3-codex",name:"GPT-5.3 Codex",contextWindowTokens:4e5,tier:"flagship"},{id:"gpt-5.3-codex-spark",name:"GPT-5.3 Codex Spark",contextWindowTokens:128e3,tier:"speed"}],modes:[{id:"agent",name:"Agent",description:"Uses the workspace-write sandbox; can read and modify workspace files without full machine access."},{id:"read-only",name:"Read Only",description:"Uses the read-only sandbox; can inspect files but cannot write to the workspace."},{id:"plan",name:"Plan",description:"Uses the read-only sandbox for planning and inspection; cannot write to the workspace."},{id:"agent-full-access",name:"Agent Full Access",description:"Bypasses approvals and the sandbox; can access and modify files beyond the workspace."},{id:"yolo",name:"YOLO",description:"Bypasses approvals and the sandbox for unrestricted execution and full filesystem access."}],effort:["minimal","low","medium","high"],modelOverrides:{"gpt-6-astra":{effort:["low","medium","high","xhigh","max","ultra"],defaultEffort:"xhigh"},"gpt-5.6-sol":{effort:["low","medium","high","xhigh","max","ultra"],defaultEffort:"xhigh"},"gpt-5.6-terra":{effort:["low","medium","high","xhigh","max","ultra"],defaultEffort:"high"},"gpt-5.6-luna":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"gpt-5.5":{effort:["low","medium","high","xhigh"],defaultEffort:"high"}},providerOptions:[]},opencode:{models:[],modes:[{id:"plan",name:"Plan",description:"Uses the plan agent without --auto; planning follows standard approval behavior."},{id:"plan-auto",name:"Plan \xB7 Auto",description:"Uses the plan agent with --auto; planning uses automatic approvals."},{id:"build",name:"Build",description:"Uses the build agent without --auto; work follows standard approval behavior."},{id:"build-auto",name:"Build \xB7 Auto",description:"Uses the build agent with --auto; work uses automatic approvals."}],effort:[],modelOverrides:{},providerOptions:[]},copilot:{models:[{id:"auto",name:"Auto"},{id:"claude-sonnet-5",name:"Claude Sonnet 5",contextWindowTokens:1e6,tier:"balanced"},{id:"claude-sonnet-4-6",name:"Claude Sonnet 4.6",contextWindowTokens:1e6,tier:"balanced"},{id:"gpt-5.5",name:"GPT-5.5",contextWindowTokens:105e4,tier:"flagship"},{id:"gpt-5.4",name:"GPT-5.4",contextWindowTokens:105e4,tier:"flagship"},{id:"gemini-3.1-pro",name:"Gemini 3.1 Pro",contextWindowTokens:1048576,tier:"flagship"}],modes:[{id:"interactive",name:"Interactive",description:"Passes --mode interactive; tool access follows Copilot's interactive mode behavior."},{id:"plan",name:"Plan",description:"Passes --mode plan; planning and permission behavior follow Copilot's plan mode."},{id:"autopilot",name:"Autopilot",description:"Passes --mode autopilot; execution behavior follows Copilot's autonomous mode."}],effort:["none","low","medium","high","xhigh","max"],modelOverrides:{},providerOptions:[]},antigravity:{models:[{id:"gemini-3.7-flash",name:"Gemini 3.7 Flash",contextWindowTokens:1048576,tier:"balanced"},{id:"gemini-3.6-flash",name:"Gemini 3.6 Flash",contextWindowTokens:1048576,tier:"balanced"},{id:"gemini-3.5-flash",name:"Gemini 3.5 Flash",contextWindowTokens:1048576,tier:"balanced"},{id:"gemini-3.1-pro",name:"Gemini 3.1 Pro",contextWindowTokens:1048576,tier:"flagship"},{id:"claude-sonnet-4-6",name:"Claude Sonnet 4.6",contextWindowTokens:1e6,tier:"balanced"},{id:"claude-opus-4-6-thinking",name:"Claude Opus 4.6 Thinking",contextWindowTokens:1e6,tier:"flagship"},{id:"gpt-oss-120b",name:"GPT-OSS 120B",contextWindowTokens:128e3,tier:"balanced"}],modes:[{id:"default",name:"Default",description:"Uses Antigravity's default permission handling. No extra permission flags are passed."},{id:"plan",name:"Plan",description:"Passes --mode plan. This turns on /plan; it is not a Claude-style permission mode."},{id:"acceptEdits",name:"Accept Edits",description:"Passes --mode accept-edits."},{id:"bypassPermissions",name:"Bypass Permissions",description:"Passes --dangerously-skip-permissions so tools can run without approval prompts."}],effort:["low","medium","high"],modelOverrides:{"gemini-3.7-flash":{effort:["low","medium","high"],defaultEffort:"medium"},"gemini-3.6-flash":{effort:["low","medium","high"],defaultEffort:"medium"},"gemini-3.5-flash":{effort:["low","medium","high"],defaultEffort:"medium"},"gemini-3.1-pro":{effort:["low","high"],defaultEffort:"high"},"claude-sonnet-4-6":{effort:[]},"claude-opus-4-6-thinking":{effort:[]},"gpt-oss-120b":{effort:["medium"],defaultEffort:"medium"}},providerOptions:[]},grok:{models:[{id:"grok-4.6",name:"Grok 4.6",contextWindowTokens:5e5,tier:"flagship",recommended:true},{id:"grok-4.5",name:"Grok 4.5",contextWindowTokens:5e5,tier:"flagship"}],modes:[{id:"default",name:"Default",description:"Uses Grok's default permission handling."},{id:"acceptEdits",name:"Accept Edits",description:"Allows file edits without changing the selected sandbox profile."},{id:"auto",name:"Auto",description:"Uses Grok automatic permission handling."},{id:"dontAsk",name:"Don't Ask",description:"Does not ask for permission before tool execution."},{id:"bypassPermissions",name:"Bypass Permissions",description:"Bypasses Grok permission checks for tool execution."},{id:"plan",name:"Plan",description:"Keeps Grok in planning mode without applying changes."}],effort:["low","medium","high"],modelOverrides:{"grok-4.6":{effort:["low","medium","high","xhigh"],defaultEffort:"high"},"grok-4.5":{effort:["low","medium","high"],defaultEffort:"high"}},providerOptions:[{key:"alwaysApprove",type:"boolean"},{key:"sandbox",type:"enum",values:["workspace","read-only","off"]}]}},Object.fromEntries(Object.entries(Ho).map(([t,e])=>[t,e.models]));});function Uo(t){return sp[t]??t}function ap(t){return ip.get(t)??t}function $o(t){if(!t)return {};let e=cp.get(t);return e?{...e}:{model:t}}function qo(t,e){return t==="antigravity"||t==="cli/antigravity"?$o(e):e===void 0?{}:{model:ap(e)}}var op,sp,ip,dp,cp,Pn=v(()=>{h();op=[{baseModelId:"claude-opus-4-8",catalogModelId:"claude-opus-4-8[1m]"},{baseModelId:"claude-opus-4-7",catalogModelId:"claude-opus-4-7[1m]"},{baseModelId:"claude-opus-4-6",catalogModelId:"claude-opus-4-6[1m]"},{baseModelId:"claude-sonnet-4-6",catalogModelId:"claude-sonnet-4-6[1m]"}],sp={"accept-edits":"acceptEdits",yolo:"bypassPermissions","agent-full-access":"bypassPermissions"};ip=new Map(op.map(({baseModelId:t,catalogModelId:e})=>[t,e]));dp=[{legacyId:"Gemini 3.7 Flash (High)",model:"gemini-3.7-flash",effort:"high"},{legacyId:"Gemini 3.7 Flash (Medium)",model:"gemini-3.7-flash",effort:"medium"},{legacyId:"Gemini 3.7 Flash (Low)",model:"gemini-3.7-flash",effort:"low"},{legacyId:"Gemini 3.6 Flash (High)",model:"gemini-3.6-flash",effort:"high"},{legacyId:"Gemini 3.6 Flash (Medium)",model:"gemini-3.6-flash",effort:"medium"},{legacyId:"Gemini 3.6 Flash (Low)",model:"gemini-3.6-flash",effort:"low"},{legacyId:"Gemini 3.5 Flash (Medium)",model:"gemini-3.5-flash",effort:"medium"},{legacyId:"Gemini 3.5 Flash (High)",model:"gemini-3.5-flash",effort:"high"},{legacyId:"Gemini 3.5 Flash (Low)",model:"gemini-3.5-flash",effort:"low"},{legacyId:"Gemini 3.1 Pro (Low)",model:"gemini-3.1-pro",effort:"low"},{legacyId:"Gemini 3.1 Pro (High)",model:"gemini-3.1-pro",effort:"high"},{legacyId:"Claude Sonnet 4.6 (Thinking)",model:"claude-sonnet-4-6"},{legacyId:"Claude Opus 4.6 (Thinking)",model:"claude-opus-4-6-thinking"},{legacyId:"GPT-OSS 120B (Medium)",model:"gpt-oss-120b",effort:"medium"},{legacyId:"gemini-3.7-flash-high",model:"gemini-3.7-flash",effort:"high"},{legacyId:"gemini-3.7-flash-medium",model:"gemini-3.7-flash",effort:"medium"},{legacyId:"gemini-3.7-flash-low",model:"gemini-3.7-flash",effort:"low"},{legacyId:"gemini-3.6-flash-high",model:"gemini-3.6-flash",effort:"high"},{legacyId:"gemini-3.6-flash-medium",model:"gemini-3.6-flash",effort:"medium"},{legacyId:"gemini-3.6-flash-low",model:"gemini-3.6-flash",effort:"low"},{legacyId:"gemini-3.5-flash-high",model:"gemini-3.5-flash",effort:"high"},{legacyId:"gemini-3.5-flash-medium",model:"gemini-3.5-flash",effort:"medium"},{legacyId:"gemini-3.5-flash-low",model:"gemini-3.5-flash",effort:"low"},{legacyId:"gemini-3.1-pro-high",model:"gemini-3.1-pro",effort:"high"},{legacyId:"gemini-3.1-pro-low",model:"gemini-3.1-pro",effort:"low"},{legacyId:"gpt-oss-120b-medium",model:"gpt-oss-120b",effort:"medium"}],cp=new Map(dp.map(({legacyId:t,model:e,effort:n})=>[t,n===void 0?{model:e}:{model:e,effort:n}]));});function lp(){return {models:[],modes:[],effort:[],modelOverrides:{},providerOptions:[]}}function Ot(t){return xr(t).models}function xr(t){return up[t]??Ho[t]??lp()}function Dn(t,e){let n=xr(t);if(e){if(Object.prototype.hasOwnProperty.call(n.modelOverrides,e))return n.modelOverrides[e]?.effort??n.effort;let r=qo(t,e);return r.model===void 0?n.effort:n.modelOverrides[r.model]?.effort??n.effort}return n.effort}function ba(t){return xr(t).modelOverrides}function Ia(){return Ot("claude")}function va(){return Ot("codex")}function Aa(){return Ot("copilot")}function Oa(){return Ot("antigravity")}var up,$t=v(()=>{h();Nr();Ar();Pn();up={};});function Ca(t){return pp[t]??t}var pp,Na=v(()=>{h();$t();Pn();pp={auto:"default"};});function Pr(t,e){return (Cr[t]??[]).includes(e)}function Ct(t){if(!t)return {};let e=t.match(/^(.+?)\[([^\]]+)\]$/);if(e){let n=e[2].toLowerCase();return fp.has(n)?{model:e[1],effort:n}:{model:t}}return {model:t}}function xa(t){switch(t){case "agent-full-access":case "yolo":return ["--dangerously-bypass-approvals-and-sandbox"];case "read-only":case "plan":return ["--sandbox","read-only"];case "agent":return ["--sandbox","workspace-write"];default:return []}}function Pa(t){switch(t){case "agent-full-access":case "yolo":return ["--dangerously-bypass-approvals-and-sandbox"];case "read-only":case "plan":return ["-c","sandbox_mode=read-only"];case "agent":return ["-c","sandbox_mode=workspace-write"];default:return []}}function Da(t){return !t||!Pr("codex",t)?[]:["-c",`model_reasoning_effort=${t}`]}function La(t){if(!t)return [];let e=new Set(["acceptEdits","bypassPermissions","default","delegate","dontAsk","plan"]),n=Ca(t);return e.has(n)?["--permission-mode",n]:[]}function Ma(t){return t?Pr("claude",t)?["--effort",t]:[]:[]}function Ha(t){return t==="default"?[]:t&&gp.has(t)?["--permission-mode",t]:[]}function Ua(t){return t===true?["--always-approve"]:[]}function $a(t,e=n=>console.warn(n)){return t===void 0?[]:t==="workspace"||t==="read-only"||t==="off"?["--sandbox",t]:(e(`[grok] Invalid sandbox value ${JSON.stringify(t)}; using workspace.`),["--sandbox","workspace"])}function qa(t){return t?Pr("grok",t)?["--effort",t]:[]:[]}function Fa(t){if(!t)return [];switch(Uo(t)){case "default":return [];case "plan":return ["--mode","plan"];case "acceptEdits":return ["--mode","accept-edits"];case "bypassPermissions":return ["--dangerously-skip-permissions"];default:return []}}function ja(t){return t?Pr("antigravity",t)?["--effort",t]:[]:[]}var fp,gp,Ln=v(()=>{h();Na();Pn();Nr();fp=new Set(Sa);gp=new Set(["default","acceptEdits","auto","dontAsk","bypassPermissions","plan"]);});function hp(t){if(t.type!=="usage"||!("input_tokens"in t))return null;let e=Number(t.input_tokens??0),n=Number(t.output_tokens??0),o="cache_read_input_tokens"in t?Number(t.cache_read_input_tokens):void 0,s="cached_input_tokens"in t?Number(t.cached_input_tokens):void 0,i=o!==void 0?o:s??0;return {inputTokens:o!==void 0?e+o:e,outputTokens:n,cachedInputTokens:i}}function mp(t){let e=t.usage;if(!e||typeof e!="object"||Array.isArray(e))return null;let n=e;if(!("input_tokens"in n))return null;let r=Number(n.input_tokens??0),o=Number(n.output_tokens??0),i="cache_read_input_tokens"in n?Number(n.cache_read_input_tokens):void 0,d="cached_input_tokens"in n?Number(n.cached_input_tokens):void 0,c=i!==void 0?i:d??0;return {inputTokens:i!==void 0?r+i:r,outputTokens:o,cachedInputTokens:c}}function _p(t){if(t.type!=="step_finish")return null;let n=t.part?.tokens;if(!n)return null;let r=Number(n.input??0),o=Number(n.output??0),s=n.cache,i=s?Number(s.read??0):0;return {inputTokens:r+i,outputTokens:o,cachedInputTokens:i}}function Ba(t){let e=new Map,n;for(let s of t.split(`
16
+ `:o;e.push({value:t.slice(n,r),separator:s}),r+=s.length-1,n=r+1;}return e.push({value:t.slice(n),separator:""}),e}function lp(t){for(let e=t.length-1;e>=0;e--)if(t[e].value.trim())return e;return -1}function pp(t){return t.trimStart().startsWith(ap)}function fp(t){let e=t.trim();if(!e.startsWith(Aa)||!e.endsWith("]]"))return null;let n=e.slice(Aa.length,-2);if(!n)return null;try{return gp(JSON.parse(n))}catch{return null}}function gp(t){return hp(t)?Object.prototype.hasOwnProperty.call(t,"taskId")?{schema:1,taskId:t.taskId,agentId:t.agentId,isError:t.isError}:{schema:1,isError:true}:null}function hp(t){if(!_p(t)||Object.keys(t).some(r=>!dp.has(r))||t.schema!==1||typeof t.isError!="boolean")return false;let e=Object.prototype.hasOwnProperty.call(t,"taskId"),n=Object.prototype.hasOwnProperty.call(t,"agentId");return e!==n?false:e?Oa(t.taskId)&&Oa(t.agentId):t.isError===true}function mp(t,e){if(e.length===0)return t.map(r=>r.value+r.separator).join("");let n=new Set(e.map(({index:r})=>r));return t.map((r,o)=>n.has(o)?"":r.value+r.separator).join("")}function Oa(t){return typeof t=="string"&&t.trim().length>0}function _p(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Aa,ap,dp,Dn=A(()=>{h();Aa="[[crewx:delegation-result ",ap="[[crewx:delegation-result",dp=new Set(["schema","taskId","agentId","isError"]);});function ut(t){if(typeof t=="string")return t;if(!t||typeof t!="object")return JSON.stringify(t??{});let e=t;return typeof e.command=="string"?e.command:typeof e.file_path=="string"?e.file_path:typeof e.filePath=="string"?e.filePath:typeof e.path=="string"?e.path:typeof e.query=="string"?e.query:typeof e.pattern=="string"?e.pattern:typeof e.url=="string"?e.url:typeof e.prompt=="string"?e.prompt.length>200?e.prompt.slice(0,200)+"\u2026":e.prompt:typeof e.description=="string"?e.description:JSON.stringify(e)}var sn=A(()=>{h();});var Na,Pr,Fo,Dr=A(()=>{h();Na=["none","minimal","low","medium","high","xhigh","max","ultra"],Pr={claude:["low","medium","high","xhigh","max"],codex:["minimal","low","medium","high","xhigh","max","ultra"],opencode:[],copilot:["none","low","medium","high","xhigh","max"],antigravity:["low","medium","high"],grok:["low","medium","high","xhigh"]},Fo={claude:{models:[{id:"claude-fable-5-1",name:"Claude Fable 5.1",contextWindowTokens:1e6,tier:"flagship",recommended:true},{id:"claude-fable-5",name:"Claude Fable 5",contextWindowTokens:1e6,tier:"flagship"},{id:"claude-opus-5",name:"Claude Opus 5",contextWindowTokens:1e6,tier:"flagship",recommended:true},{id:"claude-sonnet-5",name:"Claude Sonnet 5",contextWindowTokens:1e6,tier:"balanced",recommended:true},{id:"claude-opus-4-8[1m]",name:"Claude Opus 4.8",contextWindowTokens:1e6,tier:"flagship"},{id:"claude-opus-4-7[1m]",name:"Claude Opus 4.7",contextWindowTokens:1e6,tier:"flagship"},{id:"claude-opus-4-6[1m]",name:"Claude Opus 4.6",contextWindowTokens:1e6,tier:"flagship"},{id:"claude-sonnet-4-6[1m]",name:"Claude Sonnet 4.6",contextWindowTokens:1e6,tier:"balanced"},{id:"claude-haiku-4-5",name:"Claude Haiku 4.5",contextWindowTokens:2e5,tier:"speed"}],modes:[{id:"default",name:"Default",description:"Uses Claude's default permission handling with normal approval prompts."},{id:"acceptEdits",name:"Accept Edits",description:"Allows file edits without approval; other permission checks remain in place."},{id:"plan",name:"Plan",description:"Keeps Claude in plan mode so it can inspect and propose changes without applying them."},{id:"dontAsk",name:"Don't Ask",description:"Does not ask for permissions; only pre-approved tool actions can proceed."},{id:"bypassPermissions",name:"Bypass Permissions",description:"Bypasses Claude permission checks so tools can run without approval prompts."}],effort:["low","medium","high"],modelOverrides:{"claude-fable-5-1":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-fable-5":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-opus-5":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-sonnet-5":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-opus-4-8[1m]":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-opus-4-7[1m]":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-opus-4-6[1m]":{effort:["low","medium","high","max"],defaultEffort:"high"},"claude-sonnet-4-6[1m]":{effort:["low","medium","high","max"],defaultEffort:"high"},"claude-haiku-4-5":{effort:[]}},providerOptions:[]},codex:{models:[{id:"gpt-6-astra",name:"GPT-6 Astra",contextWindowTokens:105e4,tier:"flagship"},{id:"gpt-5.6-sol",name:"GPT-5.6 Sol",contextWindowTokens:105e4,tier:"flagship",recommended:true},{id:"gpt-5.6-terra",name:"GPT-5.6 Terra",contextWindowTokens:105e4,tier:"balanced",recommended:true},{id:"gpt-5.6-luna",name:"GPT-5.6 Luna",contextWindowTokens:105e4,tier:"speed",recommended:true},{id:"gpt-5.5",name:"GPT-5.5",contextWindowTokens:105e4,tier:"flagship"},{id:"gpt-5.4",name:"GPT-5.4",contextWindowTokens:105e4,tier:"flagship"},{id:"gpt-5.4-mini",name:"GPT-5.4 Mini",contextWindowTokens:4e5,tier:"speed"},{id:"gpt-5.3-codex",name:"GPT-5.3 Codex",contextWindowTokens:4e5,tier:"flagship"},{id:"gpt-5.3-codex-spark",name:"GPT-5.3 Codex Spark",contextWindowTokens:128e3,tier:"speed"}],modes:[{id:"agent",name:"Agent",description:"Uses the workspace-write sandbox; can read and modify workspace files without full machine access."},{id:"read-only",name:"Read Only",description:"Uses the read-only sandbox; can inspect files but cannot write to the workspace."},{id:"plan",name:"Plan",description:"Uses the read-only sandbox for planning and inspection; cannot write to the workspace."},{id:"agent-full-access",name:"Agent Full Access",description:"Bypasses approvals and the sandbox; can access and modify files beyond the workspace."},{id:"yolo",name:"YOLO",description:"Bypasses approvals and the sandbox for unrestricted execution and full filesystem access."}],effort:["minimal","low","medium","high"],modelOverrides:{"gpt-6-astra":{effort:["low","medium","high","xhigh","max","ultra"],defaultEffort:"xhigh"},"gpt-5.6-sol":{effort:["low","medium","high","xhigh","max","ultra"],defaultEffort:"xhigh"},"gpt-5.6-terra":{effort:["low","medium","high","xhigh","max","ultra"],defaultEffort:"high"},"gpt-5.6-luna":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"gpt-5.5":{effort:["low","medium","high","xhigh"],defaultEffort:"high"}},providerOptions:[]},opencode:{models:[],modes:[{id:"plan",name:"Plan",description:"Uses the plan agent without --auto; planning follows standard approval behavior."},{id:"plan-auto",name:"Plan \xB7 Auto",description:"Uses the plan agent with --auto; planning uses automatic approvals."},{id:"build",name:"Build",description:"Uses the build agent without --auto; work follows standard approval behavior."},{id:"build-auto",name:"Build \xB7 Auto",description:"Uses the build agent with --auto; work uses automatic approvals."}],effort:[],modelOverrides:{},providerOptions:[]},copilot:{models:[{id:"auto",name:"Auto"},{id:"claude-sonnet-5",name:"Claude Sonnet 5",contextWindowTokens:1e6,tier:"balanced"},{id:"claude-sonnet-4-6",name:"Claude Sonnet 4.6",contextWindowTokens:1e6,tier:"balanced"},{id:"gpt-5.5",name:"GPT-5.5",contextWindowTokens:105e4,tier:"flagship"},{id:"gpt-5.4",name:"GPT-5.4",contextWindowTokens:105e4,tier:"flagship"},{id:"gemini-3.1-pro",name:"Gemini 3.1 Pro",contextWindowTokens:1048576,tier:"flagship"}],modes:[{id:"interactive",name:"Interactive",description:"Passes --mode interactive; tool access follows Copilot's interactive mode behavior."},{id:"plan",name:"Plan",description:"Passes --mode plan; planning and permission behavior follow Copilot's plan mode."},{id:"autopilot",name:"Autopilot",description:"Passes --mode autopilot; execution behavior follows Copilot's autonomous mode."}],effort:["none","low","medium","high","xhigh","max"],modelOverrides:{},providerOptions:[]},antigravity:{models:[{id:"gemini-3.7-flash",name:"Gemini 3.7 Flash",contextWindowTokens:1048576,tier:"balanced"},{id:"gemini-3.6-flash",name:"Gemini 3.6 Flash",contextWindowTokens:1048576,tier:"balanced"},{id:"gemini-3.5-flash",name:"Gemini 3.5 Flash",contextWindowTokens:1048576,tier:"balanced"},{id:"gemini-3.1-pro",name:"Gemini 3.1 Pro",contextWindowTokens:1048576,tier:"flagship"},{id:"claude-sonnet-4-6",name:"Claude Sonnet 4.6",contextWindowTokens:1e6,tier:"balanced"},{id:"claude-opus-4-6-thinking",name:"Claude Opus 4.6 Thinking",contextWindowTokens:1e6,tier:"flagship"},{id:"gpt-oss-120b",name:"GPT-OSS 120B",contextWindowTokens:128e3,tier:"balanced"}],modes:[{id:"default",name:"Default",description:"Uses Antigravity's default permission handling. No extra permission flags are passed."},{id:"plan",name:"Plan",description:"Passes --mode plan. This turns on /plan; it is not a Claude-style permission mode."},{id:"acceptEdits",name:"Accept Edits",description:"Passes --mode accept-edits."},{id:"bypassPermissions",name:"Bypass Permissions",description:"Passes --dangerously-skip-permissions so tools can run without approval prompts."}],effort:["low","medium","high"],modelOverrides:{"gemini-3.7-flash":{effort:["low","medium","high"],defaultEffort:"medium"},"gemini-3.6-flash":{effort:["low","medium","high"],defaultEffort:"medium"},"gemini-3.5-flash":{effort:["low","medium","high"],defaultEffort:"medium"},"gemini-3.1-pro":{effort:["low","high"],defaultEffort:"high"},"claude-sonnet-4-6":{effort:[]},"claude-opus-4-6-thinking":{effort:[]},"gpt-oss-120b":{effort:["medium"],defaultEffort:"medium"}},providerOptions:[]},grok:{models:[{id:"grok-4.6",name:"Grok 4.6",contextWindowTokens:5e5,tier:"flagship",recommended:true},{id:"grok-4.5",name:"Grok 4.5",contextWindowTokens:5e5,tier:"flagship"}],modes:[{id:"default",name:"Default",description:"Uses Grok's default permission handling."},{id:"acceptEdits",name:"Accept Edits",description:"Allows file edits without changing the selected sandbox profile."},{id:"auto",name:"Auto",description:"Uses Grok automatic permission handling."},{id:"dontAsk",name:"Don't Ask",description:"Does not ask for permission before tool execution."},{id:"bypassPermissions",name:"Bypass Permissions",description:"Bypasses Grok permission checks for tool execution."},{id:"plan",name:"Plan",description:"Keeps Grok in planning mode without applying changes."}],effort:["low","medium","high"],modelOverrides:{"grok-4.6":{effort:["low","medium","high","xhigh"],defaultEffort:"high"},"grok-4.5":{effort:["low","medium","high"],defaultEffort:"high"}},providerOptions:[{key:"alwaysApprove",type:"boolean"},{key:"sandbox",type:"enum",values:["workspace","read-only","off"]}]}},Object.fromEntries(Object.entries(Fo).map(([t,e])=>[t,e.models]));});function Bo(t){return Tp[t]??t}function yp(t){return wp.get(t)??t}function jo(t){if(!t)return {};let e=Ep.get(t);return e?{...e}:{model:t}}function zo(t,e){return t==="antigravity"||t==="cli/antigravity"?jo(e):e===void 0?{}:{model:yp(e)}}var kp,Tp,wp,Rp,Ep,Ln=A(()=>{h();kp=[{baseModelId:"claude-opus-4-8",catalogModelId:"claude-opus-4-8[1m]"},{baseModelId:"claude-opus-4-7",catalogModelId:"claude-opus-4-7[1m]"},{baseModelId:"claude-opus-4-6",catalogModelId:"claude-opus-4-6[1m]"},{baseModelId:"claude-sonnet-4-6",catalogModelId:"claude-sonnet-4-6[1m]"}],Tp={"accept-edits":"acceptEdits",yolo:"bypassPermissions","agent-full-access":"bypassPermissions"};wp=new Map(kp.map(({baseModelId:t,catalogModelId:e})=>[t,e]));Rp=[{legacyId:"Gemini 3.7 Flash (High)",model:"gemini-3.7-flash",effort:"high"},{legacyId:"Gemini 3.7 Flash (Medium)",model:"gemini-3.7-flash",effort:"medium"},{legacyId:"Gemini 3.7 Flash (Low)",model:"gemini-3.7-flash",effort:"low"},{legacyId:"Gemini 3.6 Flash (High)",model:"gemini-3.6-flash",effort:"high"},{legacyId:"Gemini 3.6 Flash (Medium)",model:"gemini-3.6-flash",effort:"medium"},{legacyId:"Gemini 3.6 Flash (Low)",model:"gemini-3.6-flash",effort:"low"},{legacyId:"Gemini 3.5 Flash (Medium)",model:"gemini-3.5-flash",effort:"medium"},{legacyId:"Gemini 3.5 Flash (High)",model:"gemini-3.5-flash",effort:"high"},{legacyId:"Gemini 3.5 Flash (Low)",model:"gemini-3.5-flash",effort:"low"},{legacyId:"Gemini 3.1 Pro (Low)",model:"gemini-3.1-pro",effort:"low"},{legacyId:"Gemini 3.1 Pro (High)",model:"gemini-3.1-pro",effort:"high"},{legacyId:"Claude Sonnet 4.6 (Thinking)",model:"claude-sonnet-4-6"},{legacyId:"Claude Opus 4.6 (Thinking)",model:"claude-opus-4-6-thinking"},{legacyId:"GPT-OSS 120B (Medium)",model:"gpt-oss-120b",effort:"medium"},{legacyId:"gemini-3.7-flash-high",model:"gemini-3.7-flash",effort:"high"},{legacyId:"gemini-3.7-flash-medium",model:"gemini-3.7-flash",effort:"medium"},{legacyId:"gemini-3.7-flash-low",model:"gemini-3.7-flash",effort:"low"},{legacyId:"gemini-3.6-flash-high",model:"gemini-3.6-flash",effort:"high"},{legacyId:"gemini-3.6-flash-medium",model:"gemini-3.6-flash",effort:"medium"},{legacyId:"gemini-3.6-flash-low",model:"gemini-3.6-flash",effort:"low"},{legacyId:"gemini-3.5-flash-high",model:"gemini-3.5-flash",effort:"high"},{legacyId:"gemini-3.5-flash-medium",model:"gemini-3.5-flash",effort:"medium"},{legacyId:"gemini-3.5-flash-low",model:"gemini-3.5-flash",effort:"low"},{legacyId:"gemini-3.1-pro-high",model:"gemini-3.1-pro",effort:"high"},{legacyId:"gemini-3.1-pro-low",model:"gemini-3.1-pro",effort:"low"},{legacyId:"gpt-oss-120b-medium",model:"gpt-oss-120b",effort:"medium"}],Ep=new Map(Rp.map(({legacyId:t,model:e,effort:n})=>[t,n===void 0?{model:e}:{model:e,effort:n}]));});function bp(){return {models:[],modes:[],effort:[],modelOverrides:{},providerOptions:[]}}function vt(t){return Lr(t).models}function Lr(t){return Sp[t]??Fo[t]??bp()}function Mn(t,e){let n=Lr(t);if(e){if(Object.prototype.hasOwnProperty.call(n.modelOverrides,e))return n.modelOverrides[e]?.effort??n.effort;let r=zo(t,e);return r.model===void 0?n.effort:n.modelOverrides[r.model]?.effort??n.effort}return n.effort}function xa(t){return Lr(t).modelOverrides}function Ca(){return vt("claude")}function Pa(){return vt("codex")}function Da(){return vt("copilot")}function La(){return vt("antigravity")}var Sp,Ht=A(()=>{h();Dr();Nr();Ln();Sp={};});function Ma(t){return Ip[t]??t}var Ip,Ha=A(()=>{h();Ht();Ln();Ip={auto:"default"};});function Mr(t,e){return (Pr[t]??[]).includes(e)}function At(t){if(!t)return {};let e=t.match(/^(.+?)\[([^\]]+)\]$/);if(e){let n=e[2].toLowerCase();return vp.has(n)?{model:e[1],effort:n}:{model:t}}return {model:t}}function Ua(t){switch(t){case "agent-full-access":case "yolo":return ["--dangerously-bypass-approvals-and-sandbox"];case "read-only":case "plan":return ["--sandbox","read-only"];case "agent":return ["--sandbox","workspace-write"];default:return []}}function $a(t){switch(t){case "agent-full-access":case "yolo":return ["--dangerously-bypass-approvals-and-sandbox"];case "read-only":case "plan":return ["-c","sandbox_mode=read-only"];case "agent":return ["-c","sandbox_mode=workspace-write"];default:return []}}function qa(t){return !t||!Mr("codex",t)?[]:["-c",`model_reasoning_effort=${t}`]}function Fa(t){if(!t)return [];let e=new Set(["acceptEdits","bypassPermissions","default","delegate","dontAsk","plan"]),n=Ma(t);return e.has(n)?["--permission-mode",n]:[]}function Ba(t){return t?Mr("claude",t)?["--effort",t]:[]:[]}function ja(t){return t==="default"?[]:t&&Ap.has(t)?["--permission-mode",t]:[]}function za(t){return t===true?["--always-approve"]:[]}function Ga(t,e=n=>console.warn(n)){return t===void 0?[]:t==="workspace"||t==="read-only"||t==="off"?["--sandbox",t]:(e(`[grok] Invalid sandbox value ${JSON.stringify(t)}; using workspace.`),["--sandbox","workspace"])}function Wa(t){return t?Mr("grok",t)?["--effort",t]:[]:[]}function Va(t){if(!t)return [];switch(Bo(t)){case "default":return [];case "plan":return ["--mode","plan"];case "acceptEdits":return ["--mode","accept-edits"];case "bypassPermissions":return ["--dangerously-skip-permissions"];default:return []}}function Ka(t){return t?Mr("antigravity",t)?["--effort",t]:[]:[]}var vp,Ap,Hn=A(()=>{h();Ha();Ln();Dr();vp=new Set(Na);Ap=new Set(["default","acceptEdits","auto","dontAsk","bypassPermissions","plan"]);});function Op(t){if(t.type!=="usage"||!("input_tokens"in t))return null;let e=Number(t.input_tokens??0),n=Number(t.output_tokens??0),o="cache_read_input_tokens"in t?Number(t.cache_read_input_tokens):void 0,s="cached_input_tokens"in t?Number(t.cached_input_tokens):void 0,i=o!==void 0?o:s??0;return {inputTokens:o!==void 0?e+o:e,outputTokens:n,cachedInputTokens:i}}function Np(t){let e=t.usage;if(!e||typeof e!="object"||Array.isArray(e))return null;let n=e;if(!("input_tokens"in n))return null;let r=Number(n.input_tokens??0),o=Number(n.output_tokens??0),i="cache_read_input_tokens"in n?Number(n.cache_read_input_tokens):void 0,d="cached_input_tokens"in n?Number(n.cached_input_tokens):void 0,c=i!==void 0?i:d??0;return {inputTokens:i!==void 0?r+i:r,outputTokens:o,cachedInputTokens:c}}function xp(t){if(t.type!=="step_finish")return null;let n=t.part?.tokens;if(!n)return null;let r=Number(n.input??0),o=Number(n.output??0),s=n.cache,i=s?Number(s.read??0):0;return {inputTokens:r+i,outputTokens:o,cachedInputTokens:i}}function Ja(t){let e=new Map,n;for(let s of t.split(`
16
17
  `))if(s.trim())try{let i=JSON.parse(s);if(i.type!=="assistant")continue;let d=i.message,c=d?.id,u=d?.usage;if(typeof c!="string"||!u)continue;let f=Number(u.input_tokens??0),p=Number(u.cache_read_input_tokens??0);e.set(c,{inputTokens:f+p,cachedInputTokens:p});let g=d?.model;typeof g=="string"&&g&&(n=g);}catch{}if(e.size===0)return;let r=0,o=0;for(let s of e.values())r+=s.inputTokens,o+=s.cachedInputTokens;return {inputTokens:r,cachedInputTokens:o,model:n}}function an(t){if(!t||!t.trim())return;let e=null,n=null;for(let r of t.split(`
17
- `))if(r.trim())try{let o=JSON.parse(r),s=_p(o);if(s){n||(n={inputTokens:0,outputTokens:0,cachedInputTokens:0}),n.inputTokens+=s.inputTokens,n.outputTokens+=s.outputTokens,n.cachedInputTokens+=s.cachedInputTokens;continue}let i=hp(o)??mp(o);i&&(e=i);}catch{}return n||(e??void 0)}var Mn=v(()=>{h();});function Je(t,e){if(typeof t!="object"||t===null||Array.isArray(t))return e;let n=t.timestamp;return typeof n!="string"||!Number.isFinite(Date.parse(n))?e:new Date(n).toISOString()}var qt=v(()=>{h();});function za(t){let e=t.split(`
18
- `).filter(o=>o.trim()),n=[],r=null;for(let o of e)try{let s=JSON.parse(o);if(s.type==="assistant"&&Array.isArray(s.message?.content))for(let i of s.message.content)i.type==="text"&&typeof i.text=="string"&&i.text.trim()&&n.push(i.text.trim());s.type==="result"&&typeof s.result=="string"&&(r=s.result);}catch{}if(n.length>0)return n[n.length-1];if(r)return r}function Tp(t){let n=t.message?.content;return Array.isArray(n)?n.map(r=>typeof r.text=="string"?r.text.trim():"").filter(Boolean).join(`
18
+ `))if(r.trim())try{let o=JSON.parse(r),s=xp(o);if(s){n||(n={inputTokens:0,outputTokens:0,cachedInputTokens:0}),n.inputTokens+=s.inputTokens,n.outputTokens+=s.outputTokens,n.cachedInputTokens+=s.cachedInputTokens;continue}let i=Op(o)??Np(o);i&&(e=i);}catch{}return n||(e??void 0)}var Un=A(()=>{h();});function Ye(t,e){if(typeof t!="object"||t===null||Array.isArray(t))return e;let n=t.timestamp;return typeof n!="string"||!Number.isFinite(Date.parse(n))?e:new Date(n).toISOString()}var Ut=A(()=>{h();});function Ya(t){let e=t.split(`
19
+ `).filter(o=>o.trim()),n=[],r=null;for(let o of e)try{let s=JSON.parse(o);if(s.type==="assistant"&&Array.isArray(s.message?.content))for(let i of s.message.content)i.type==="text"&&typeof i.text=="string"&&i.text.trim()&&n.push(i.text.trim());s.type==="result"&&typeof s.result=="string"&&(r=s.result);}catch{}if(n.length>0)return n[n.length-1];if(r)return r}function Dp(t){let e=t.split(`
20
+ `).filter(n=>n.trim());for(let n of e.reverse())try{let r=JSON.parse(n);if(typeof r=="object"&&r!==null&&r.type==="result")return r}catch{}}function Lp(t){let n=t.message?.content;return Array.isArray(n)?n.map(r=>typeof r.text=="string"?r.text.trim():"").filter(Boolean).join(`
19
21
 
20
- `):""}function wp(t){let e=t.toLowerCase();return e.includes("out of extra usage")||e.includes("rate limit")||e.includes("quota")}function yp(t,e){let n=e.type;if(n==="text"){let r=String(e.text||"");return r?{timestamp:t,type:"text",content:r}:null}if(n==="thinking"){let r=typeof e.thinking=="string"?e.thinking.trim():"";return r?{timestamp:t,type:"thinking",content:r}:null}if(n==="tool_use"){let r=String(e.name||""),o=e.id,s=e.input,i=ct(s);return r==="Bash"&&at(i)?dt(t,i,o):{timestamp:t,type:"tool_use",toolUseId:o,toolName:r,toolInput:i}}if(n==="tool_result"){let r=!!e.is_error,o=e.tool_use_id,s=e.output??e.content??"",i;return typeof s=="string"?i=s:Array.isArray(s)?i=s.filter(d=>d.type==="text"&&typeof d.text=="string").map(d=>d.text).join(`
21
- `):i=JSON.stringify(s),{timestamp:t,type:"tool_result",toolUseId:o,...kt(i,r)}}return null}var kp,Fo,jo=v(()=>{h();Mo();on();xn();sn();Ln();$t();Mn();qt();kp=new Set(["tool_progress"]);Fo={command:"claude",meta:{displayName:"Claude",models:Ia(),capabilities:{resume:true}},buildArgs(t,e,n){let{model:r,effort:o}=Ct(e.model),s=e.effort??o,i=La(e.mode),d=Ma(s),c=r?["--model",r]:[],u=e.resumeSessionId?["--resume",e.resumeSessionId]:[];if(e.additionalArgs!==void 0){let p=[...e.additionalArgs];return p.indexOf("-p")!==-1?{args:["--output-format","stream-json","--verbose",...u,...i,...d,...c,...p],stdinMessage:t}:{args:["--output-format","stream-json","--verbose",...u,...i,...d,...c,...p],stdinMessage:t}}return {args:["-p","--output-format","stream-json","--verbose",...u,...i,...d,...c],stdinMessage:t}},extractText(t){return za(t)??t.trim()},extractPartialText(t){return za(t)},extractFailure(t){try{let e=JSON.parse(t);if(e.type==="rate_limit_event"){let n=e.rate_limit_info??{};if(n.status==="rejected")return new _t(`Claude rate limit: ${n.rateLimitType??"unknown"} (status: ${n.status})`)}if(e.error==="rate_limit"){let n=Tp(e);return new _t(n?`Claude rate limit: ${n}`:"Claude rate limit")}if(e.type==="result"&&e.is_error===!0){let n=typeof e.result=="string"?e.result:"";if(wp(n))return new _t(`Claude rate limit: ${n}`)}}catch{}return null},parseResultMeta(t){let e=t.split(`
22
- `);for(let r of e)if(r.trim())try{let o=JSON.parse(r);if(o.type==="result"){let s=o.usage,i=s?{inputTokens:Number(s.input_tokens??0)+Number(s.cache_read_input_tokens??0),outputTokens:Number(s.output_tokens??0),cachedInputTokens:Number(s.cache_read_input_tokens??0),costUsd:Number(o.total_cost_usd??0)}:null,d=o.modelUsage,c=d?Object.keys(d)[0]??null:null;return {usage:i,model:c}}}catch{}let n=Ba(t);return n?{usage:{inputTokens:n.inputTokens,outputTokens:0,cachedInputTokens:n.cachedInputTokens,costUsd:0},model:n.model??null}:{usage:null,model:null}},parseEvent(t,e){let n;try{n=JSON.parse(t);}catch{return []}let r=n.type;if(!r)return [];if(r!=="assistant"&&r!=="user")return [];let s=n.message?.content;if(!Array.isArray(s))return [];let i=Je(n,e??new Date().toISOString()),d=[];for(let c of s){let u=yp(i,c);u&&d.push(u);}return d},suppressOutputLine(t){let e=t.trim();if(!e.startsWith("{")||!e.endsWith("}"))return false;try{let r=JSON.parse(e).type;return r?kp.has(r):!1}catch{return false}}};});function Ga(t){let e=t.split(`
23
- `).filter(o=>o.trim()),n=[],r=null;for(let o of e)try{let s=JSON.parse(o);if(s.type==="assistant.message"&&typeof s.data?.content=="string"){let i=s.data.content;i.trim()&&n.push(i.trim());}s.type==="result"&&typeof s.result=="string"&&(r=s.result);}catch{}if(n.length>0)return n[n.length-1];if(r)return r}var Ep,Bo,zo=v(()=>{h();Mn();on();sn();xn();$t();Nr();qt();Ep=new Set(["interactive","plan","autopilot"]);Bo={command:"copilot",meta:{displayName:"Copilot",models:Aa()},buildArgs(t,e,n){let r=e.additionalArgs?[...e.additionalArgs]:[];return e.model&&r.push("--model",e.model),e.mode&&Ep.has(e.mode)&&r.push("--mode",e.mode),e.effort&&(Cr.copilot??[]).includes(e.effort)&&r.push("--effort",e.effort),{args:r,stdinMessage:t}},extractText(t){return Ga(t)??t.trim()},extractPartialText(t){return Ga(t)},parseResultMeta(t){let e=an(t);return e?{usage:{inputTokens:e.inputTokens,outputTokens:e.outputTokens,cachedInputTokens:e.cachedInputTokens,costUsd:0},model:null}:{usage:null,model:null}},parseEvent(t,e){let n;try{n=JSON.parse(t);}catch{return []}let r=n.type;if(!r)return [];if(!r.startsWith("tool.execution")&&!r.startsWith("assistant.")&&r!=="user.message")return [];let o=n.data;if(!o)return [];let s=Je(n,e??new Date().toISOString()),i=o.toolCallId;if(r==="tool.execution_start"){let d=String(o.toolName||""),c=o.arguments,u=ct(c);return (d==="bash"||d==="Bash")&&at(u)?[dt(s,u,i)]:[{timestamp:s,type:"tool_use",toolName:d,toolInput:u,...i&&{toolUseId:i}}]}if(r==="tool.execution_complete"){let d=o.error;if(d)return [{timestamp:s,type:"tool_result",...i&&{toolUseId:i},...kt(String(d.message||""),true)}];let c=o.result,u=String(c?.content||"");return [{timestamp:s,type:"tool_result",...i&&{toolUseId:i},...kt(u,false)}]}if(r==="assistant.message"){let d=String(o.content||"");return d?[{timestamp:s,type:"text",content:d}]:[]}return []}};});function Sp(t){let e=[],n=0,r=false,o=false,s=0;for(let d=0;d<t.length;d++){let c=t[d];if(o){o=false;continue}if(c==="\\"&&r){o=true;continue}if(c==='"'){r=!r;continue}if(!r){if(c==="{")n++;else if(c==="}"&&(n--,n===0)){let u=t.slice(s,d+1).trim();u&&e.push(u),s=d+1;}}}let i=t.slice(s).trim();return i&&e.push(i),e}function bp(t){return t[0]==="exec"?t.slice(1):t}function Wa(t){let e=t.split(`
24
- `).map(o=>o.trim()).filter(Boolean),n=[],r=null;for(let o of e)try{let s=JSON.parse(o);if(s.type==="item.completed"&&(s.item?.type==="message"||s.item?.type==="agent_message")&&typeof s.item?.text=="string"){let i=s.item.text;i.trim()&&n.push(i.trim());}s.type==="result"&&typeof s.result=="string"&&(r=s.result);}catch{}if(n.length>0)return n[n.length-1];if(r)return r}function Ip(t,e){let n=e.type;if(n==="command_execution"){let r=String(e.command||"");return at(r)?[dt(t,r)]:[{timestamp:t,type:"tool_use",toolName:"Bash",toolInput:r}]}return n==="web_search"?[]:n==="file_change"?[]:[]}function vp(t,e){let n=e.type;if(n==="message"||n==="text"){let r=e.content;if(Array.isArray(r))for(let o of r){let s=Ap(t,o);if(s)return s}if(typeof e.text=="string")return {timestamp:t,type:"text",content:e.text}}if(n==="agent_message"&&typeof e.text=="string")return {timestamp:t,type:"text",content:e.text};if(n==="reasoning"){let r=typeof e.text=="string"?e.text.trim():"";return r?{timestamp:t,type:"thinking",content:r}:null}if(n==="command_execution"){let r=String(e.aggregated_output||e.output||""),o=!!e.is_error;return {timestamp:t,type:"tool_result",...kt(r,o)}}if(n==="tool_use"){let r=String(e.name||e.tool_name||""),o=e.input,s=ct(o);return r==="Bash"&&at(s)?dt(t,s):{timestamp:t,type:"tool_use",toolName:r,toolInput:s}}if(n==="tool_result"){let r=!!e.is_error,o=String(e.output||e.content||"");return {timestamp:t,type:"tool_result",...kt(o,r)}}if(n==="web_search"){let r=e.action,o;if(r?.type==="search"){let s=r.queries;o=String(r.query||"")||(s?.length?s.join(", "):"")||String(e.query||"");}else o=e.query?"open: "+String(e.query):"";return o?{timestamp:t,type:"tool_use",toolName:"WebSearch",toolInput:o}:null}if(n==="file_change"){let r=e.changes;if(!Array.isArray(r)||r.length===0)return null;let o=r.map(i=>String(i.path||"")).filter(Boolean);if(o.length===0)return null;let s=o.length===1?o[0]:`${o.slice(0,2).join(", ")}${o.length>2?` (+${o.length-2})`:""}`;return {timestamp:t,type:"tool_use",toolName:"Edit",toolInput:s}}return null}function Ap(t,e){let n=e.type;if(n==="text")return {timestamp:t,type:"text",content:String(e.text||"")};if(n==="tool_use"){let r=String(e.name||""),o=e.input,s=ct(o);return r==="Bash"&&at(s)?dt(t,s):{timestamp:t,type:"tool_use",toolName:r,toolInput:s}}return null}var Rp,Go,Wo=v(()=>{h();Mn();on();sn();xn();Ln();$t();qt();Rp=new Set(["turn.started","turn.completed","item.updated"]);Go={command:"codex",meta:{displayName:"Codex",models:va(),capabilities:{resume:true}},buildArgs(t,e,n){let{model:r,effort:o}=Ct(e.model),s=e.effort??o,i=e.resumeSessionId?Pa(e.mode):xa(e.mode),d=Da(s),c=r?["-m",r]:[],u=bp(e.additionalArgs??[]),p=u.includes("--json")||u.includes("--experimental-json")?[]:["--json"];return e.resumeSessionId?{args:["exec","resume",...p,...i,...d,...c,...u,e.resumeSessionId,"-"],stdinMessage:t}:{args:["exec",...p,...i,...d,...c,...u],stdinMessage:t}},extractText(t){return Wa(t)??t.trim()},extractPartialText(t){return Wa(t)},parseResultMeta(t){let e=an(t);return e?{usage:{inputTokens:e.inputTokens,outputTokens:e.outputTokens,cachedInputTokens:e.cachedInputTokens,costUsd:0},model:null}:{usage:null,model:null}},parseEvent(t,e){let n=e??new Date().toISOString(),r=[],o;try{JSON.parse(t),o=[t];}catch{o=Sp(t),o.length>1&&console.warn("[codex] parseEvent: falling back to concatenated-JSON split for a malformed line");}for(let s of o){let i;try{i=JSON.parse(s);}catch{continue}let d=i.type;if(!d||!d.startsWith("item.")&&!d.startsWith("turn.")&&!d.startsWith("thread."))continue;let c=Je(i,n),u=i.item;if(u){if(d==="item.started"){r.push(...Ip(c,u));continue}if(d==="item.completed"){let f=vp(c,u);f&&r.push(f);continue}}}return r},suppressOutputLine(t){let e=t.trim();if(!e.startsWith("{")||!e.endsWith("}"))return false;try{let r=JSON.parse(e).type;return r?Rp.has(r):!1}catch{return false}}};});function Np(t){return t?Cp[t]??{agent:"build",autoApprove:false}:{agent:void 0,autoApprove:false}}function Dr(t,e){return t.some(n=>n===e||n.startsWith(`${e}=`))}function Xa(t){let e=[],n=0,r=false,o=false,s=0;for(let d=0;d<t.length;d++){let c=t[d];if(o){o=false;continue}if(c==="\\"&&r){o=true;continue}if(c==='"'){r=!r;continue}if(!r){if(c==="{")n++;else if(c==="}"&&(n--,n===0)){let u=t.slice(s,d+1).trim();u&&e.push(u),s=d+1;}}}let i=t.slice(s).trim();return i&&e.push(i),e}function cn(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function xp(t){let e=[],n=false;for(let r of t.split(/\r?\n/)){let o=r.trim();if(!o)continue;try{let i=JSON.parse(o);cn(i)?e.push(i):n=!0;continue}catch{}let s=Xa(o);s.length>1&&console.warn("[opencode] extractText: falling back to concatenated-JSON split for a malformed line");for(let i of s)try{let d=JSON.parse(i);cn(d)?e.push(d):n=!0;}catch{n=true;}}return {events:e,malformed:n}}function Ft(t){if(typeof t!="string")return;let e=t.split(/\r?\n/).map(n=>n.trim()).find(n=>n&&!/^at\s+/.test(n));if(e)return e.replace(/\u001b\[[0-?]*[ -/]*[@-~]/g,"").replace(/(?:[A-Za-z]:[\\/]|\/)(?:[^\s"'`()\[\]{}]+[\\/])*[^\s"'`()\[\]{}]+/g,"[path]").slice(0,Ya).trim()}function Qa(t){let e=cn(t.error)?t.error:void 0,n=e&&cn(e.data)?e.data:void 0,r=Ft(e?.name),o=Ft(n?.message)??Ft(e?.message)??Ft(t.message)??Ft(t.errorMessage)??Ft(t.error),s=Ft(t.ref),i=r&&o&&r!==o?`${r}: ${o}`:r??o??Ja;return (s?`${i} (ref: ${s})`:i).slice(0,Ya)}function Ka(t){let e=xp(t),n=[],r=null,o=0,s=[],i,d=false;for(let c of e.events){let u=typeof c.type=="string"?c.type:void 0;if(u){if(u==="text"){let f=cn(c.part)?c.part:void 0,p=typeof f?.text=="string"?f.text:void 0;p?.trim()&&n.push(p.trim());continue}if(u==="result"){typeof c.result=="string"&&(r=c.result);continue}if(u==="tool_use"){o++;continue}if(u==="error"){s.push(Qa(c));continue}if(u==="step_finish"){d=true;let f=cn(c.part)?c.part:void 0;i=typeof f?.reason=="string"?f.reason:void 0;}}}return {...e,texts:n,resultText:r,toolUseCount:o,errorMessages:s,terminalReason:i,hasTerminal:d}}function Za(t){return (t??"unknown").trim().toLowerCase().replace(/_/g,"-")}function Lr(){return new Te("OpenCode returned no assistant output.",dn,{code:"EMPTY_OUTPUT",kind:"transient"})}function Pp(){return new Te("OpenCode emitted malformed JSON output.",dn,{code:"PROVIDER_CRASHED",kind:"transient"})}function Va(t,e){switch(Za(t)){case "length":return new Te("OpenCode stopped because the context window was exceeded.",dn,{code:"UNKNOWN",kind:"permanent"});case "content-filter":return new Te("OpenCode stopped because the content filter blocked the response.",dn,{code:"UNKNOWN",kind:"permanent"});case "error":return new Te(e?`OpenCode error: ${e}`:`${Ja} while generating a response.`,dn,{code:"PROVIDER_CRASHED",kind:"transient"});default:return null}}var Op,dn,Ja,Ya,Cp,Ko,Vo=v(()=>{h();Nn();Mn();sn();qt();Op=new Set(["step_start","step_finish"]),dn="cli/opencode",Ja="OpenCode provider error",Ya=240,Cp={build:{agent:"build",autoApprove:false},"build-auto":{agent:"build",autoApprove:true},plan:{agent:"plan",autoApprove:false},"plan-auto":{agent:"plan",autoApprove:true}};Ko={command:"opencode",meta:{displayName:"OpenCode",capabilities:{resume:true}},buildArgs(t,e,n){let r=e.additionalArgs,o=r!==void 0?[...r]:["run"];Dr(o,"--format")||o.push("--format","json"),e.resumeSessionId&&!o.includes("-s")&&!o.includes("--session")&&o.push("-s",e.resumeSessionId);let{agent:s,autoApprove:i}=Np(e.mode);Dr(o,"--agent")||s!==void 0&&o.push("--agent",s),i&&!Dr(o,"--auto")&&o.push("--auto"),e.effort!==void 0&&!Dr(o,"--variant")&&o.push("--variant",e.effort),e.model&&o.push("--model",e.model);let d;return !n&&!i&&!e.env?.OPENCODE_PERMISSION&&(d={OPENCODE_PERMISSION:JSON.stringify({external_directory:"allow"})}),{args:o,stdinMessage:t,env:d}},extractText(t){let e=Ka(t),n=e.errorMessages[0];if(n){let i=Va("error",n);if(i)throw i}let r=Va(e.terminalReason??"",void 0);if(r)throw r;let o=e.texts.length>0?e.texts[e.texts.length-1]:void 0;if(o!==void 0){if(!e.hasTerminal)throw Lr();return o}if(e.resultText?.trim()){if(!e.hasTerminal)throw Lr();return e.resultText}if(e.malformed)throw Pp();if(!e.hasTerminal)throw Lr();let s=Za(e.terminalReason);if((s==="stop"||s==="tool-calls")&&e.toolUseCount>0)return "";throw Lr()},interpretExit(t,e,n=""){if(t===0)return null;let o=Ka(n).errorMessages[0];return o?new Te(`OpenCode error: ${o}`,dn,{code:"PROVIDER_CRASHED",kind:"transient"}):null},parseResultMeta(t){let e=an(t);return e?{usage:{inputTokens:e.inputTokens,outputTokens:e.outputTokens,cachedInputTokens:e.cachedInputTokens,costUsd:0},model:null}:{usage:null,model:null}},parseEvent(t,e){let n=e??new Date().toISOString(),r=[],o;try{JSON.parse(t),o=[t];}catch{o=Xa(t),o.length>1&&console.warn("[opencode] parseEvent: falling back to concatenated-JSON split for a malformed line");}for(let s of o){let i;try{i=JSON.parse(s);}catch{continue}let d=Je(i,n),c=i.type;if(c){if(c==="text"){let f=i.part?.text;f&&r.push({timestamp:d,type:"text",content:f});continue}if(c==="tool_use"){let u=i.part;if(!u)continue;let f=String(u.tool||""),p=String(u.callID||""),g=u.state,m=String(g?.status||""),w=g?.input,_=ct(w);if(r.push({timestamp:d,type:"tool_use",toolName:f,toolUseId:p,toolInput:_}),m==="completed"&&g?.output!==void 0){let T=g.output,S=typeof T=="string"?T:JSON.stringify(T);r.push({timestamp:d,type:"tool_result",toolUseId:p,resultPreview:S,isError:false});}else m==="error"&&r.push({timestamp:d,type:"tool_result",toolUseId:p,resultPreview:String(g?.error||"tool error"),isError:true});continue}if(c==="error"){let u=Qa(i);r.push({timestamp:d,type:"error",content:u,errorMessage:u});continue}}}return r},suppressOutputLine(t){let e=t.trim();if(!e.startsWith("{")||!e.endsWith("}"))return false;try{let r=JSON.parse(e).type;return r?Op.has(r):!1}catch{return false}}};});function Hn(t,e){return t.some(n=>n===e||n.startsWith(`${e}=`))}function Dp(t,e){if(!(t?Ot(Jo).some(s=>s.id===t):false)||!t)return e;let r=Dn(Jo,t),o=ba(Jo)[t]?.defaultEffort;if(r.length!==0)return e?r.includes(e)?e:o&&r.includes(o)?o:void 0:o}var Jo,Yo,Xo=v(()=>{h();Nn();Pn();$t();Ln();Jo="antigravity";Yo={command:"agy",meta:{displayName:"Antigravity",models:Oa(),defaultTimeoutMs:{query:12e4,execute:3e5},defaultIdleMs:0},buildArgs(t,e,n){let{model:r,effort:o}=Ct(e.model),s=$o(r),i=s.model,d=e.effort??o??s.effort,c=Dp(i,d),u=e.additionalArgs??[],f=i&&!Hn(u,"--model")?["--model",i]:[],p=Hn(u,"--effort")?[]:ja(c),g=Hn(u,"--mode")||Hn(u,"--dangerously-skip-permissions")?[]:Fa(e.mode),m=Hn(u,"--print")?[]:["--print",t];return {args:[...f,...p,...g,...u,...m]}},extractText(t){let e=t.trim();if(!e)throw new Te("Antigravity CLI returned empty output with exit code 0. agy may have hidden an auth/quota/model error in its log file; inspect ~/.gemini/antigravity-cli/log for details.","cli/antigravity",{code:"EMPTY_OUTPUT",kind:"transient"});return e},parseResultMeta(t){return {usage:null,model:null}},parseEvent(t,e){return []}};});var ed=v(()=>{h();on();sn();xn();qt();});function un(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Hr(t){return un(t)?t:void 0}function Ae(t){return typeof t=="string"?t:void 0}function jt(t){let e=typeof t=="number"?t:Number(t??0);return Number.isFinite(e)?e:0}function $p(t){let e=[],n=-1,r=0,o=false,s=false;for(let i=0;i<t.length;i+=1){let d=t[i];if(n===-1){(d==="{"||d==="[")&&(n=i,r=1);continue}if(s){s=false;continue}if(d==="\\"&&o){s=true;continue}if(d==='"'){o=!o;continue}o||(d==="{"||d==="["?r+=1:(d==="}"||d==="]")&&(r-=1,r===0&&(e.push(t.slice(n,i+1)),n=-1)));}return n!==-1&&e.push(t.slice(n)),e}function Un(t){let e=t.trim();if(!e)return [];try{let n=JSON.parse(e);return un(n)?[n]:[]}catch{return $p(e).flatMap(n=>{try{let r=JSON.parse(n);return un(r)?[r]:[]}catch{return []}})}}function $n(t){let e=JSON.stringify(t);return e===void 0?String(t):e}function qn(t){if(typeof t=="string")return t;if(Array.isArray(t)){let e=t.map(qn).filter(n=>n!==void 0);return e.length>0?e.join(`
25
- `):void 0}if(un(t)){if(typeof t.text=="string")return t.text;if(typeof t.message=="string")return t.message;if(typeof t.error=="string")return t.error;if(t.type==="text"&&typeof t.data=="string")return t.data;for(let e of ["content","FileContent","rawOutput"]){let n=qn(t[e]);if(n!==void 0)return n}}}function qp(t){if(t.rawOutput!==null&&t.rawOutput!==void 0)return qn(t.rawOutput)??$n(t.rawOutput);if(t.content!==null&&t.content!==void 0)return qn(t.content)??$n(t.content);if(t.result!==null&&t.result!==void 0)return qn(t.result)??$n(t.result)}function sd(t){let e=Hr(t.error),n=[t.message,t.errorMessage,e?.message,e?.detail,typeof t.error=="string"?t.error:void 0].find(r=>typeof r=="string"&&r.trim().length>0);return n?id(n):"Grok CLI reported an error."}function id(t){return (t.replace(Up,"").split(/\r?\n/).map(n=>n.trim()).filter(Boolean)[0]??t.trim()).slice(0,500)}function od(t){return Hp.test(t)}function Fp(t){let e=Hr(t.modelUsage);return e?Object.keys(e)[0]??null:null}function jp(t){let e=Hr(t.usage);if(!e)return null;let n=jt(e.cache_read_input_tokens);return {inputTokens:jt(e.input_tokens)+n,cachedInputTokens:n,outputTokens:jt(e.output_tokens),costUsd:jt(t.total_cost_usd)}}function Bp(t){let e=0,n=0,r=0,o=false,s=new Set;for(let i of t.split(`
26
- `).flatMap(Un)){if(i.type!=="usage")continue;let d=Hr(i.usage);if(!d)continue;let c=Ae(i.signature);if(c&&c.length>0){let f=`signature:${c}`;if(s.has(f))continue;s.add(f);}let u=jt(d.cache_read_input_tokens);e+=jt(d.input_tokens)+u,n+=u,r+=jt(d.output_tokens),o=true;}return o?{inputTokens:e,cachedInputTokens:n,outputTokens:r,costUsd:0}:null}function zp(t,e){if(!Array.isArray(e.entries)||e.entries.length===0)return [];let n=[];for(let s of e.entries.slice(0,td)){if(!un(s))continue;let i=Ae(s.content)?.trim();if(!i)continue;let d=Ae(s.status)?.trim(),c=Ae(s.priority)?.trim(),u=[d?`status=${d}`:void 0,c?`priority=${c}`:void 0].filter(p=>!!p),f=u.length>0?` (${u.join(", ")})`:"";n.push(`- ${i}${f}`);}if(n.length===0)return [];e.entries.length>td&&n.push(rd);let r=n.join(`
27
- `),o=r.length>nd?`${r.slice(0,nd-1)}${rd}`:r;return [{timestamp:t,type:"info",content:o}]}function Gp(t,e){let n=Ae(e.type);if(n==="thought"){let r=Ae(e.data);return r===void 0?[]:[{timestamp:t,type:"thinking",content:r}]}if(n==="text"){let r=Ae(e.data);return r===void 0?[]:[{timestamp:t,type:"text",content:r}]}if(n==="plan")return zp(t,e);if(n==="tool_call"){let r=Ae(e.toolCallId),o=Ae(e.toolName)??Ae(e.title),s=e.rawInput===void 0?void 0:$n(e.rawInput);return [{timestamp:t,type:"tool_use",toolUseId:r,toolName:o,toolInput:s}]}if(n==="tool_call_update"){let r=Ae(e.status);return r!=="completed"&&r!=="failed"&&r!=="error"?[]:[{timestamp:t,type:"tool_result",toolUseId:Ae(e.toolCallId),toolName:Ae(e.toolName)??Ae(e.title),resultPreview:qp(e),isError:r!=="completed"||e.isError===true}]}if(n==="error"){let r=sd(e);return [{timestamp:t,type:"error",content:r,errorMessage:r}]}return []}var Mr,Mp,Hp,Up,td,nd,rd,Qo,Zo=v(()=>{h();Nn();Mo();$t();Ln();qt();Mr="cli/grok",Mp=new Set(["available_commands","usage","end"]),Hp=/(?:rate[\s_-]*limit|quota|usage[\s_-]*limit|too many requests|limit(?:ed|ing)?\s+(?:exceeded|reached))/i,Up=/\u001b\[[0-?]*[ -/]*[@-~]/g,td=20,nd=4e3,rd="\u2026";Qo={command:"grok",createSessionId:()=>randomUUID(),meta:{displayName:"Grok",capabilities:{resume:true}},buildArgs(t,e){let{model:n,effort:r}=Ct(e.model),o=e.effort??r,s=e.resumeSessionId?["--resume",e.resumeSessionId]:e.providerSessionId?["--session-id",e.providerSessionId]:[],i=n?["--model",n]:[],d=n?Ot("grok").some(Y=>Y.id===n):false,c=n&&d?Dn("grok",n):[],u=!o||c.length===0||c.includes(o)?o:void 0,f=qa(u),p=e.additionalArgs??[],g=Y=>p.some(E=>E===Y||E.startsWith(`${Y}=`)),m=e.providerOptions,w=m?.alwaysApprove,_=m?.sandbox,T=g("--permission-mode")?[]:Ha(e.mode),S=g("--always-approve")?[]:Ua(w),M=g("--sandbox")?[]:$a(_);return {args:["--no-auto-update",...s,"--single",t,"--output-format","streaming-json","--no-alt-screen",...i,...f,...T,...S,...M,...p]}},extractText(t){let e=[],n=false;for(let r of t.split(`
28
- `).flatMap(Un))typeof r.type=="string"&&(n=true),r.type==="text"&&typeof r.data=="string"&&e.push(r.data);return e.length>0?e.join(""):n?"":t.trim()},extractFailure(t){for(let e of Un(t))if(e.type==="error"){let n=sd(e);return od($n(e))?new _t(n,Mr):new Te(n,Mr)}return null},interpretExit(t,e){if(t===0)return null;let n=id(e)||`Grok CLI exited with code ${t}.`;return od(e)?new _t(n,Mr):new Te(n,Mr)},parseResultMeta(t){let n=t.split(`
29
- `).flatMap(Un).find(r=>r.type==="end");return n?{usage:jp(n),model:Fp(n)}:{usage:Bp(t),model:null}},parseEvent(t,e){let n=e??new Date().toISOString();return Un(t).flatMap(r=>Gp(Je(r,n),r))},suppressOutputLine(t){let e=t.trim();if(!e.startsWith("{")||!e.endsWith("}"))return false;try{let n=JSON.parse(e);return un(n)&&typeof n.type=="string"?Mp.has(n.type):!1}catch{return false}}};});var ad,dd=v(()=>{h();jo();zo();Wo();Vo();Xo();ed();Zo();jo();zo();Wo();Vo();Xo();Zo();on();ad={codex:Go,claude:Fo,opencode:Ko,antigravity:Yo,copilot:Bo,grok:Qo};});function cd(t){if(t.startsWith("cli/"))return ad[t.slice(4)]}var ud=v(()=>{h();ya();dd();});function Ur(t){return typeof t=="number"&&Number.isFinite(t)?t:0}function Wp(t,e){return typeof t=="string"&&t.length>0?t:typeof e=="string"&&e.length>0?e:null}function $r(t){if(typeof t.provider!="string"||t.provider.length===0)return;let n=t.taskLogRepository.readLogs(t.taskId)?.entries.filter(g=>g.level==="stdout").map(g=>g.message).join(`
30
- `)??"";if(!n.trim())return;let r=cd(t.provider);if(!r)return;let o;try{o=r.parseResultMeta?.(n);}catch{return {stdout:n,adapter:r}}let s=Wp(o?.model,t.model),i=o?.usage;if(!i)return {stdout:n,adapter:r};let d=Ur(i.inputTokens),c=Ur(i.outputTokens),u=Ur(i.cachedInputTokens),f=aa(Ur(i.costUsd),d,c,u,s);return d!==0||c!==0||u!==0||f!==0?{stdout:n,adapter:r,usage:{inputTokens:d,outputTokens:c,cachedInputTokens:u,costUsd:f,model:s}}:{stdout:n,adapter:r}}var es=v(()=>{h();ud();Ar();});function Vp(t){if(t)try{let e=JSON.parse(t);if(typeof e!="object"||e===null||Array.isArray(e))return;let n=e.terminalReason;return typeof n=="string"&&Kp.has(n)?n:void 0}catch{return}}function Nt(t){switch(t.status){case "stopped":case "runner_lost":case "pending":case "running":case "paused":case "success":return t.status;case "completed":case "done":return "success";case "error":return "failed";case "failed":{let e=Vp(t.metadata);return e==="user_stop"?"stopped":e==="runner_lost"?"runner_lost":e==="launch_failed"?"failed":typeof t.error=="string"&&ts.stopped.test(t.error)?"stopped":typeof t.error=="string"&&ts.runnerLost.test(t.error)?"runner_lost":"failed"}default:return t.status}}var ns,ts,Kp,Fn=v(()=>{h();ns=["success","failed","stopped","runner_lost"],ts={stopped:/^(Killed by user|Stopped by user|Cancelled by user|사용자에 의해 중지됨)/,runnerLost:/^Reaped: (process not found|pid never recorded|stale workflow run)/},Kp=new Set(["user_stop","runner_lost","launch_failed"]);});function as(t,e,n=1){let r=process.env[t];if(r===void 0||r==="")return e;let o=Number(r);return !Number.isFinite(o)||o<=0?e:Math.max(n,Math.trunc(o))}function Fr(){return as("CREWX_TASK_HEARTBEAT_MS",1e4,200)}function Bt(){return as("CREWX_TASK_HEARTBEAT_STALE_MS",3e4)}function jn(){return as("CREWX_TASK_HEARTBEAT_HARD_STALE_MS",18e5)}function pn(t){return typeof t=="number"&&Number.isFinite(t)?Math.trunc(t):0}function qr(t){let e=typeof t=="object"&&t!==null&&"code"in t?String(t.code):t instanceof Error?t.name:typeof t;console.warn(`[crewx] task heartbeat write failed (${e}); execution continues`);}function Yp(t){return t?{id:t.id,status:t.status,run_epoch:t.run_epoch,stop_requested_at:t.stop_requested_at,stop_requested_epoch:t.stop_requested_epoch,pid:t.pid,metadata:t.metadata,started_at:t.started_at,duration_ms:t.duration_ms}:null}function ld(t,e){return !!t.stop_requested_at&&pn(t.stop_requested_epoch)===pn(e)}function rs(t,e){let n=pn(e.runEpoch);if(!(e.writeHeartbeat===false?true:t.heartbeatTask({id:e.taskId,runEpoch:n})))return {accepted:false,row:null};let o=Yp(t.getTask(e.taskId));return !o||o.status!=="running"||pn(o.run_epoch)!==n?{accepted:false,row:o}:{accepted:true,row:o}}function pd(t,e){let n=ln.get(t);return !n||e&&n!==e?false:(clearInterval(n.timer),ln.delete(t),true)}function fd(t,e){let n=ln.get(t);return !n||e!==void 0&&n.runEpoch!==pn(e)?false:pd(t,n)}function Xp(t,e){let n=pn(e.runEpoch);fd(e.taskId);let r=true,o=null;try{let u=rs(t,{...e,runEpoch:n});r=u.accepted,o=u.row;}catch(u){qr(u);}if(!r)return false;let s=Fr(),i=Math.min(s,1e3),d=setInterval(()=>{let u=ln.get(e.taskId);if(!(!u||u.timer!==d))try{u.heartbeatElapsedMs+=i;let f=u.heartbeatElapsedMs>=s,p=rs(t,{taskId:e.taskId,runEpoch:n,writeHeartbeat:f});if(!p.accepted){pd(e.taskId,u);return}f&&(u.heartbeatElapsedMs%=s,u.lastHeartbeatAt=Date.now()),p.row&&ld(p.row,n)&&!u.stopRequested&&(u.stopRequested=!0,e.onStopRequested&&Promise.resolve(e.onStopRequested(p.row)).catch(qr));}catch(f){qr(f);}},i),c={timer:d,runEpoch:n,stopRequested:false,lastHeartbeatAt:Date.now(),heartbeatElapsedMs:0};return ln.set(e.taskId,c),typeof d=="object"&&d!==null&&"unref"in d&&d.unref(),o&&ld(o,n)&&e.onStopRequested&&(c.stopRequested=true,Promise.resolve(e.onStopRequested(o)).catch(qr)),true}var os,ss,is,Jp,ln,Bn=v(()=>{h();os=1e4,ss=3e4,is=18e5,Jp=1e3;ln=new Map;});function fs(t,e=Date.now(),n=zr){let r=t?Date.parse(t):Number.NaN,o=typeof e=="number"?e:Date.parse(e),s=ps(n,zr,0);return Number.isFinite(r)&&Number.isFinite(o)&&o-r>s?"forced":"cooperative"}function ps(t,e,n){return t===void 0||!Number.isFinite(t)?e:Math.max(n,Math.trunc(t))}function yd(t){if(!t)return {};try{let e=JSON.parse(t);if(typeof e=="object"&&e!==null&&!Array.isArray(e))return e}catch{}return {}}function Qp(t){if(!t)return;let e=yd(t.metadata).stopMethod;return e==="cooperative"||e==="forced"?e:void 0}function ut(t,e){if(!t)return {status:"not_running",finalStatus:"not_running",...e?{pid:e}:{}};let n=typeof t.pid=="number"&&t.pid>0?t.pid:e;if(t.status==="stopped"){let r=Qp(t);return {status:"stopped",finalStatus:t.status,...r?{method:r}:{},...n?{pid:n}:{}}}return {status:"not_running",finalStatus:t.status,...n?{pid:n}:{}}}function Ed(t,e,n="Process owner could not be verified"){let r=e??(t.pid&&t.pid>0?t.pid:void 0);return {status:"ownership_unverified",finalStatus:t.status,...r?{pid:r}:{},error:n}}function we(t,e,n){let r=n??(t?.pid&&t.pid>0?t.pid:void 0);return {status:"failed",finalStatus:t?.status??null,...r?{pid:r}:{},error:e}}function ds(t,e){return we(t,Td,e)}function Zp(t,e){if(!t.heartbeat_at)return false;let n=Date.parse(t.heartbeat_at);return Number.isFinite(n)?e-n<=Bt():false}function ef(t){return {...t.processControlOptions,...t.platform?{platform:t.platform}:{}}}function tf(t){let e=typeof t.pid=="number"&&t.pid>0?t.pid:void 0,n=yd(t.metadata),r=n.ownership==="runner"&&typeof n.providerPid=="number"&&Number.isSafeInteger(n.providerPid)&&n.providerPid>0?n.providerPid:void 0;return [...new Set([e,r].filter(o=>o!==void 0))]}function nf(t,e,n){let r=t.getTask(e);if(!r||r.status!=="running")return ut(r,n)}async function rf(t,e,n,r){let o=Date.now()+n;for(;;){let s=nf(t,e);if(s)return s;let i=o-Date.now();if(i<=0)return;await new Promise(d=>{setTimeout(d,Math.min(r,i));});}}async function gd(t,e,n){let r=new Date().toISOString(),o={origin:n.origin??"internal",...n.callerPid!==void 0?{callerPid:n.callerPid}:{},...n.callerTaskId!==void 0?{callerTaskId:n.callerTaskId}:{}},s=t.requestTaskStop({id:e,requestedAt:r,...o}),i=t.getTask(e);if(!s.accepted){if(s.status==="pending"){let Y=t.stopPendingTask(e,void 0,void 0,{...o,at:r}),E=t.getTask(e);if(Y||!E||E.status!=="running")return ut(E);if(s=t.requestTaskStop({id:e,requestedAt:r,...o}),!s.accepted&&s.status!=="running"||!s.accepted&&!s.alreadyRequestedAt)return ut(t.getTask(e))}else if(!(s.status==="running"&&s.alreadyRequestedAt))return ut(i)}let d=s.runEpoch,c=ps(n.graceMs,zr,0),u=ps(n.pollMs,_d,1),f=await rf(t,e,c,u);if(f)return f;let p=t.getTask(e);if(!p||p.status!=="running")return ut(p);let g=tf(p),m=g[0];if(!m){let Y=t.finalizeTaskStop({id:e,runEpoch:d,method:"forced"}),E=t.getTask(e);return Y||E?.status!=="running"?ut(E):we(E,"Failed to finalize task stop")}let w=ef(n),_="unknown";if(!Zp(p,Date.now())){let Y=n.processControl?.checkProcessOwnershipAsync??Po;try{_=await Y(m,n.ownershipMarkers??gs,w);}catch{_="unknown";}if(_!=="owned")return Ed(p)}let T=n.processControl?.terminateProcessTree??Do;for(let Y of g){let E;try{E=await T(Y,{...w,signal:xo});}catch(x){E={status:"failed",pid:Y,method:w.platform==="win32"?"taskkill":"process-group",error:x instanceof Error?x.message:String(x)};}if(E.status==="failed")return we(t.getTask(e),E.error??"Failed to terminate process tree")}let S=t.finalizeTaskStop({id:e,runEpoch:d,method:"forced"}),M=t.getTask(e);return S||M?.status!=="running"?ut(M,m):we(M,"Task changed before stop was finalized")}function hd(t){return typeof t=="number"&&Number.isSafeInteger(t)&&t>0}function md(t){return Number.isSafeInteger(t)&&t>=0}function cs(t){return typeof t=="number"&&Number.isFinite(t)?Math.trunc(t):0}function of(t){return {...t.processControlOptions,...t.platform?{platform:t.platform}:{}}}async function Rd(t,e){let n=t.getTask(e.taskId);if(!n||n.status!=="running")return ds(n,hd(e.targetPid)?e.targetPid:void 0);if(!md(e.sourceRunEpoch)||!md(e.settleRunEpoch)||cs(n.run_epoch)!==e.settleRunEpoch)return we(n,jr,e.targetPid);if(e.workspaceId!==void 0&&n.workspace_id!==e.workspaceId)return we(n,Br,e.targetPid);let r=new Date().toISOString(),o;try{o=t.requestTaskStop({id:e.taskId,requestedAt:r,sourceRunEpoch:e.sourceRunEpoch,settleRunEpoch:e.settleRunEpoch,...e.workspaceId!==void 0?{workspaceId:e.workspaceId}:{}});}catch{return we(n,wd,e.targetPid)}let s=t.getTask(e.taskId);if(!s||s.status!=="running")return ds(s,e.targetPid);if(o.runEpoch!==e.settleRunEpoch||cs(s.run_epoch)!==e.settleRunEpoch)return we(s,jr,e.targetPid);if(e.workspaceId!==void 0&&s.workspace_id!==e.workspaceId)return we(s,Br,e.targetPid);if(!hd(e.targetPid))return we(s,kd);let i=of(e),d=e.processControl?.checkProcessOwnershipAsync??Po,c="unknown";try{c=await d(e.targetPid,e.ownershipMarkers??gs,i);}catch{c="unknown";}if(c!=="owned")return Ed(s,e.targetPid);let u=t.getTask(e.taskId);if(!u||u.status!=="running")return ds(u,e.targetPid);if(cs(u.run_epoch)!==e.settleRunEpoch)return we(u,jr,e.targetPid);if(e.workspaceId!==void 0&&u.workspace_id!==e.workspaceId)return we(u,Br,e.targetPid);let f=e.processControl?.terminateProcessTree??Do,p;try{p=await f(e.targetPid,{...i,signal:xo});}catch{return we(t.getTask(e.taskId),us,e.targetPid)}if(p.status==="failed")return we(t.getTask(e.taskId),us,e.targetPid);let g;try{g=t.finalizeTaskStop({id:e.taskId,runEpoch:e.settleRunEpoch,method:"forced"});}catch{return we(t.getTask(e.taskId),ls,e.targetPid)}return g?ut(t.getTask(e.taskId),e.targetPid):we(t.getTask(e.taskId),ls,e.targetPid)}function hs(t,e,n={}){if(typeof t=="string"){let r=t,o=e??{};return Promise.resolve().then(()=>(zn(),Sd)).then(({TaskRepository:s})=>gd(new s,r,o))}return gd(t,e,n)}var zr,_d,gs,kd,jr,Br,Td,us,ls,wd,ms=v(()=>{h();Lo();Bn();zr=5e3,_d=250;gs=["crewx","claude","codex","opencode","grok","node"],kd="INSTRUCTION_STOP_TARGET_PID_MISSING",jr="INSTRUCTION_STOP_EPOCH_MISMATCH",Br="INSTRUCTION_STOP_WORKSPACE_MISMATCH",Td="INSTRUCTION_STOP_GENERATION_ALREADY_SETTLED",us="INSTRUCTION_STOP_PROCESS_TERMINATION_FAILED",ls="INSTRUCTION_STOP_SETTLE_CAS_FAILED",wd="INSTRUCTION_STOP_REQUEST_FAILED";});var Sd={};qc(Sd,{DEFAULT_TASK_REAPER_TICK_INTERVAL_MS:()=>Rs,HOST_SHUTDOWN_TERMINAL_ERROR:()=>Cd,PENDING_ADOPT_GRACE_MS:()=>xd,PID_NULL_REAP_GRACE_MS:()=>Es,TASK_HEARTBEAT_HARD_STALE_MS:()=>is,TASK_HEARTBEAT_INTERVAL_MS:()=>os,TASK_HEARTBEAT_STALE_MS:()=>ss,TaskRepository:()=>Jr,hasRecordedUsage:()=>hn,mergeTerminalReason:()=>Vr,resolveTaskHeartbeatHardStaleMs:()=>jn,resolveTaskHeartbeatIntervalMs:()=>Fr,resolveTaskHeartbeatStaleMs:()=>Bt});function Xe(t){return {...t,status:Nt(t)}}function bd(t){return {...t,status:Nt(t)}}function Id(){let t=sql`
22
+ `):""}function Mp(t){let e=t.toLowerCase();return e.includes("out of extra usage")||e.includes("rate limit")||e.includes("quota")}function Hp(t,e){let n=e.type;if(n==="text"){let r=String(e.text||"");return r?{timestamp:t,type:"text",content:r}:null}if(n==="thinking"){let r=typeof e.thinking=="string"?e.thinking.trim():"";return r?{timestamp:t,type:"thinking",content:r}:null}if(n==="tool_use"){let r=String(e.name||""),o=e.id,s=e.input,i=ut(s);return r==="Bash"&&dt(i)?ct(t,i,o):{timestamp:t,type:"tool_use",toolUseId:o,toolName:r,toolInput:i}}if(n==="tool_result"){let r=!!e.is_error,o=e.tool_use_id,s=e.output??e.content??"",i;return typeof s=="string"?i=s:Array.isArray(s)?i=s.filter(d=>d.type==="text"&&typeof d.text=="string").map(d=>d.text).join(`
23
+ `):i=JSON.stringify(s),{timestamp:t,type:"tool_result",toolUseId:o,...Tt(i,r)}}return null}var Cp,Pp,Hr,Go=A(()=>{h();qo();nn();Cr();on();Dn();sn();Hn();Ht();Un();Ut();Cp=new Set(["tool_progress"]),Pp="cli/claude";Hr={command:"claude",meta:{displayName:"Claude",models:Ca(),capabilities:{resume:true}},buildArgs(t,e,n){let{model:r,effort:o}=At(e.model),s=e.effort??o,i=Fa(e.mode),d=Ba(s),c=r?["--model",r]:[],u=e.resumeSessionId?["--resume",e.resumeSessionId]:[];if(e.additionalArgs!==void 0){let p=[...e.additionalArgs];return p.indexOf("-p")!==-1?{args:["--output-format","stream-json","--verbose",...u,...i,...d,...c,...p],stdinMessage:t}:{args:["--output-format","stream-json","--verbose",...u,...i,...d,...c,...p],stdinMessage:t}}return {args:["-p","--output-format","stream-json","--verbose",...u,...i,...d,...c],stdinMessage:t}},extractText(t){let e=Dp(t);if(e?.is_error===true){let o=Hr.extractFailure(JSON.stringify(e));if(o)throw o;let s=typeof e.subtype=="string"?e.subtype:"unknown",i=typeof e.terminal_reason=="string"?e.terminal_reason:"unknown";throw new ce(`Claude ended without an answer (subtype=${s}, terminal_reason=${i})`,Pp,{code:"EMPTY_OUTPUT",kind:"permanent"})}let n=Ya(t);if(n)return n;let r=t.trim();return rn(r,"claude")?"":r},extractPartialText(t){return Ya(t)},extractFailure(t){try{let e=JSON.parse(t);if(e.type==="rate_limit_event"){let n=e.rate_limit_info??{};if(n.status==="rejected")return new kt(`Claude rate limit: ${n.rateLimitType??"unknown"} (status: ${n.status})`)}if(e.error==="rate_limit"){let n=Lp(e);return new kt(n?`Claude rate limit: ${n}`:"Claude rate limit")}if(e.type==="result"&&e.is_error===!0){let n=typeof e.result=="string"?e.result:"";if(Mp(n))return new kt(`Claude rate limit: ${n}`)}}catch{}return null},parseResultMeta(t){let e=t.split(`
24
+ `);for(let r of e)if(r.trim())try{let o=JSON.parse(r);if(o.type==="result"){let s=o.usage,i=s?{inputTokens:Number(s.input_tokens??0)+Number(s.cache_read_input_tokens??0),outputTokens:Number(s.output_tokens??0),cachedInputTokens:Number(s.cache_read_input_tokens??0),costUsd:Number(o.total_cost_usd??0)}:null,d=o.modelUsage,c=d?Object.keys(d)[0]??null:null;return {usage:i,model:c}}}catch{}let n=Ja(t);return n?{usage:{inputTokens:n.inputTokens,outputTokens:0,cachedInputTokens:n.cachedInputTokens,costUsd:0},model:n.model??null}:{usage:null,model:null}},parseEvent(t,e){let n;try{n=JSON.parse(t);}catch{return []}let r=n.type;if(!r)return [];if(r!=="assistant"&&r!=="user")return [];let s=n.message?.content;if(!Array.isArray(s))return [];let i=Ye(n,e??new Date().toISOString()),d=[];for(let c of s){let u=Hp(i,c);u&&d.push(u);}return d},suppressOutputLine(t){let e=t.trim();if(!e.startsWith("{")||!e.endsWith("}"))return false;try{let r=JSON.parse(e).type;return r?Cp.has(r):!1}catch{return false}}};});function Xa(t){let e=t.split(`
25
+ `).filter(o=>o.trim()),n=[],r=null;for(let o of e)try{let s=JSON.parse(o);if(s.type==="assistant.message"&&typeof s.data?.content=="string"){let i=s.data.content;i.trim()&&n.push(i.trim());}s.type==="result"&&typeof s.result=="string"&&(r=s.result);}catch{}if(n.length>0)return n[n.length-1];if(r)return r}var Up,Wo,Vo=A(()=>{h();Cr();Un();on();sn();Dn();Ht();Dr();Ut();Up=new Set(["interactive","plan","autopilot"]);Wo={command:"copilot",meta:{displayName:"Copilot",models:Da()},buildArgs(t,e,n){let r=e.additionalArgs?[...e.additionalArgs]:[];return e.model&&r.push("--model",e.model),e.mode&&Up.has(e.mode)&&r.push("--mode",e.mode),e.effort&&(Pr.copilot??[]).includes(e.effort)&&r.push("--effort",e.effort),{args:r,stdinMessage:t}},extractText(t){let e=Xa(t);if(e)return e;let n=t.trim();return rn(n,"copilot")?"":n},extractPartialText(t){return Xa(t)},parseResultMeta(t){let e=an(t);return e?{usage:{inputTokens:e.inputTokens,outputTokens:e.outputTokens,cachedInputTokens:e.cachedInputTokens,costUsd:0},model:null}:{usage:null,model:null}},parseEvent(t,e){let n;try{n=JSON.parse(t);}catch{return []}let r=n.type;if(!r)return [];if(!r.startsWith("tool.execution")&&!r.startsWith("assistant.")&&r!=="user.message")return [];let o=n.data;if(!o)return [];let s=Ye(n,e??new Date().toISOString()),i=o.toolCallId;if(r==="tool.execution_start"){let d=String(o.toolName||""),c=o.arguments,u=ut(c);return (d==="bash"||d==="Bash")&&dt(u)?[ct(s,u,i)]:[{timestamp:s,type:"tool_use",toolName:d,toolInput:u,...i&&{toolUseId:i}}]}if(r==="tool.execution_complete"){let d=o.error;if(d)return [{timestamp:s,type:"tool_result",...i&&{toolUseId:i},...Tt(String(d.message||""),true)}];let c=o.result,u=String(c?.content||"");return [{timestamp:s,type:"tool_result",...i&&{toolUseId:i},...Tt(u,false)}]}if(r==="assistant.message"){let d=String(o.content||"");return d?[{timestamp:s,type:"text",content:d}]:[]}return []}};});function qp(t){let e=[],n=0,r=false,o=false,s=0;for(let d=0;d<t.length;d++){let c=t[d];if(o){o=false;continue}if(c==="\\"&&r){o=true;continue}if(c==='"'){r=!r;continue}if(!r){if(c==="{")n++;else if(c==="}"&&(n--,n===0)){let u=t.slice(s,d+1).trim();u&&e.push(u),s=d+1;}}}let i=t.slice(s).trim();return i&&e.push(i),e}function Fp(t){return t[0]==="exec"?t.slice(1):t}function Qa(t){let e=t.split(`
26
+ `).map(o=>o.trim()).filter(Boolean),n=[],r=null;for(let o of e)try{let s=JSON.parse(o);if(s.type==="item.completed"&&(s.item?.type==="message"||s.item?.type==="agent_message")&&typeof s.item?.text=="string"){let i=s.item.text;i.trim()&&n.push(i.trim());}s.type==="result"&&typeof s.result=="string"&&(r=s.result);}catch{}if(n.length>0)return n[n.length-1];if(r)return r}function Bp(t,e){let n=e.type;if(n==="command_execution"){let r=String(e.command||"");return dt(r)?[ct(t,r)]:[{timestamp:t,type:"tool_use",toolName:"Bash",toolInput:r}]}return n==="web_search"?[]:n==="file_change"?[]:[]}function jp(t,e){let n=e.type;if(n==="message"||n==="text"){let r=e.content;if(Array.isArray(r))for(let o of r){let s=zp(t,o);if(s)return s}if(typeof e.text=="string")return {timestamp:t,type:"text",content:e.text}}if(n==="agent_message"&&typeof e.text=="string")return {timestamp:t,type:"text",content:e.text};if(n==="reasoning"){let r=typeof e.text=="string"?e.text.trim():"";return r?{timestamp:t,type:"thinking",content:r}:null}if(n==="command_execution"){let r=String(e.aggregated_output||e.output||""),o=!!e.is_error;return {timestamp:t,type:"tool_result",...Tt(r,o)}}if(n==="tool_use"){let r=String(e.name||e.tool_name||""),o=e.input,s=ut(o);return r==="Bash"&&dt(s)?ct(t,s):{timestamp:t,type:"tool_use",toolName:r,toolInput:s}}if(n==="tool_result"){let r=!!e.is_error,o=String(e.output||e.content||"");return {timestamp:t,type:"tool_result",...Tt(o,r)}}if(n==="web_search"){let r=e.action,o;if(r?.type==="search"){let s=r.queries;o=String(r.query||"")||(s?.length?s.join(", "):"")||String(e.query||"");}else o=e.query?"open: "+String(e.query):"";return o?{timestamp:t,type:"tool_use",toolName:"WebSearch",toolInput:o}:null}if(n==="file_change"){let r=e.changes;if(!Array.isArray(r)||r.length===0)return null;let o=r.map(i=>String(i.path||"")).filter(Boolean);if(o.length===0)return null;let s=o.length===1?o[0]:`${o.slice(0,2).join(", ")}${o.length>2?` (+${o.length-2})`:""}`;return {timestamp:t,type:"tool_use",toolName:"Edit",toolInput:s}}return null}function zp(t,e){let n=e.type;if(n==="text")return {timestamp:t,type:"text",content:String(e.text||"")};if(n==="tool_use"){let r=String(e.name||""),o=e.input,s=ut(o);return r==="Bash"&&dt(s)?ct(t,s):{timestamp:t,type:"tool_use",toolName:r,toolInput:s}}return null}var $p,Ko,Jo=A(()=>{h();Cr();Un();on();sn();Dn();Hn();Ht();Ut();$p=new Set(["turn.started","turn.completed","item.updated"]);Ko={command:"codex",meta:{displayName:"Codex",models:Pa(),capabilities:{resume:true}},buildArgs(t,e,n){let{model:r,effort:o}=At(e.model),s=e.effort??o,i=e.resumeSessionId?$a(e.mode):Ua(e.mode),d=qa(s),c=r?["-m",r]:[],u=Fp(e.additionalArgs??[]),p=u.includes("--json")||u.includes("--experimental-json")?[]:["--json"];return e.resumeSessionId?{args:["exec","resume",...p,...i,...d,...c,...u,e.resumeSessionId,"-"],stdinMessage:t}:{args:["exec",...p,...i,...d,...c,...u],stdinMessage:t}},extractText(t){let e=Qa(t);if(e)return e;let n=t.trim();return rn(n,"codex")?"":n},extractPartialText(t){return Qa(t)},parseResultMeta(t){let e=an(t);return e?{usage:{inputTokens:e.inputTokens,outputTokens:e.outputTokens,cachedInputTokens:e.cachedInputTokens,costUsd:0},model:null}:{usage:null,model:null}},parseEvent(t,e){let n=e??new Date().toISOString(),r=[],o;try{JSON.parse(t),o=[t];}catch{o=qp(t),o.length>1&&console.warn("[codex] parseEvent: falling back to concatenated-JSON split for a malformed line");}for(let s of o){let i;try{i=JSON.parse(s);}catch{continue}let d=i.type;if(!d||!d.startsWith("item.")&&!d.startsWith("turn.")&&!d.startsWith("thread."))continue;let c=Ye(i,n),u=i.item;if(u){if(d==="item.started"){r.push(...Bp(c,u));continue}if(d==="item.completed"){let f=jp(c,u);f&&r.push(f);continue}}}return r},suppressOutputLine(t){let e=t.trim();if(!e.startsWith("{")||!e.endsWith("}"))return false;try{let r=JSON.parse(e).type;return r?$p.has(r):!1}catch{return false}}};});function Vp(t){return t?Wp[t]??{agent:"build",autoApprove:false}:{agent:void 0,autoApprove:false}}function Ur(t,e){return t.some(n=>n===e||n.startsWith(`${e}=`))}function rd(t){let e=[],n=0,r=false,o=false,s=0;for(let d=0;d<t.length;d++){let c=t[d];if(o){o=false;continue}if(c==="\\"&&r){o=true;continue}if(c==='"'){r=!r;continue}if(!r){if(c==="{")n++;else if(c==="}"&&(n--,n===0)){let u=t.slice(s,d+1).trim();u&&e.push(u),s=d+1;}}}let i=t.slice(s).trim();return i&&e.push(i),e}function cn(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Kp(t){let e=[],n=false;for(let r of t.split(/\r?\n/)){let o=r.trim();if(!o)continue;try{let i=JSON.parse(o);cn(i)?e.push(i):n=!0;continue}catch{}let s=rd(o);s.length>1&&console.warn("[opencode] extractText: falling back to concatenated-JSON split for a malformed line");for(let i of s)try{let d=JSON.parse(i);cn(d)?e.push(d):n=!0;}catch{n=true;}}return {events:e,malformed:n}}function $t(t){if(typeof t!="string")return;let e=t.split(/\r?\n/).map(n=>n.trim()).find(n=>n&&!/^at\s+/.test(n));if(e)return e.replace(/\u001b\[[0-?]*[ -/]*[@-~]/g,"").replace(/(?:[A-Za-z]:[\\/]|\/)(?:[^\s"'`()\[\]{}]+[\\/])*[^\s"'`()\[\]{}]+/g,"[path]").slice(0,nd).trim()}function od(t){let e=cn(t.error)?t.error:void 0,n=e&&cn(e.data)?e.data:void 0,r=$t(e?.name),o=$t(n?.message)??$t(e?.message)??$t(t.message)??$t(t.errorMessage)??$t(t.error),s=$t(t.ref),i=r&&o&&r!==o?`${r}: ${o}`:r??o??td;return (s?`${i} (ref: ${s})`:i).slice(0,nd)}function Za(t){let e=Kp(t),n=[],r=null,o=0,s=[],i,d=false;for(let c of e.events){let u=typeof c.type=="string"?c.type:void 0;if(u){if(u==="text"){let f=cn(c.part)?c.part:void 0,p=typeof f?.text=="string"?f.text:void 0;p?.trim()&&n.push(p.trim());continue}if(u==="result"){typeof c.result=="string"&&(r=c.result);continue}if(u==="tool_use"){o++;continue}if(u==="error"){s.push(od(c));continue}if(u==="step_finish"){d=true;let f=cn(c.part)?c.part:void 0;i=typeof f?.reason=="string"?f.reason:void 0;}}}return {...e,texts:n,resultText:r,toolUseCount:o,errorMessages:s,terminalReason:i,hasTerminal:d}}function sd(t){return (t??"unknown").trim().toLowerCase().replace(/_/g,"-")}function $r(){return new ce("OpenCode returned no assistant output.",dn,{code:"EMPTY_OUTPUT",kind:"transient"})}function Jp(){return new ce("OpenCode emitted malformed JSON output.",dn,{code:"PROVIDER_CRASHED",kind:"transient"})}function ed(t,e){switch(sd(t)){case "length":return new ce("OpenCode stopped because the context window was exceeded.",dn,{code:"UNKNOWN",kind:"permanent"});case "content-filter":return new ce("OpenCode stopped because the content filter blocked the response.",dn,{code:"UNKNOWN",kind:"permanent"});case "error":return new ce(e?`OpenCode error: ${e}`:`${td} while generating a response.`,dn,{code:"PROVIDER_CRASHED",kind:"transient"});default:return null}}var Gp,dn,td,nd,Wp,Yo,Xo=A(()=>{h();nn();Un();sn();Ut();Gp=new Set(["step_start","step_finish"]),dn="cli/opencode",td="OpenCode provider error",nd=240,Wp={build:{agent:"build",autoApprove:false},"build-auto":{agent:"build",autoApprove:true},plan:{agent:"plan",autoApprove:false},"plan-auto":{agent:"plan",autoApprove:true}};Yo={command:"opencode",meta:{displayName:"OpenCode",capabilities:{resume:true}},buildArgs(t,e,n){let r=e.additionalArgs,o=r!==void 0?[...r]:["run"];Ur(o,"--format")||o.push("--format","json"),e.resumeSessionId&&!o.includes("-s")&&!o.includes("--session")&&o.push("-s",e.resumeSessionId);let{agent:s,autoApprove:i}=Vp(e.mode);Ur(o,"--agent")||s!==void 0&&o.push("--agent",s),i&&!Ur(o,"--auto")&&o.push("--auto"),e.effort!==void 0&&!Ur(o,"--variant")&&o.push("--variant",e.effort),e.model&&o.push("--model",e.model);let d;return !n&&!i&&!e.env?.OPENCODE_PERMISSION&&(d={OPENCODE_PERMISSION:JSON.stringify({external_directory:"allow"})}),{args:o,stdinMessage:t,env:d}},extractText(t){let e=Za(t),n=e.errorMessages[0];if(n){let i=ed("error",n);if(i)throw i}let r=ed(e.terminalReason??"",void 0);if(r)throw r;let o=e.texts.length>0?e.texts[e.texts.length-1]:void 0;if(o!==void 0){if(!e.hasTerminal)throw $r();return o}if(e.resultText?.trim()){if(!e.hasTerminal)throw $r();return e.resultText}if(e.malformed)throw Jp();if(!e.hasTerminal)throw $r();let s=sd(e.terminalReason);if((s==="stop"||s==="tool-calls")&&e.toolUseCount>0)return "";throw $r()},interpretExit(t,e,n=""){if(t===0)return null;let o=Za(n).errorMessages[0];return o?new ce(`OpenCode error: ${o}`,dn,{code:"PROVIDER_CRASHED",kind:"transient"}):null},parseResultMeta(t){let e=an(t);return e?{usage:{inputTokens:e.inputTokens,outputTokens:e.outputTokens,cachedInputTokens:e.cachedInputTokens,costUsd:0},model:null}:{usage:null,model:null}},parseEvent(t,e){let n=e??new Date().toISOString(),r=[],o;try{JSON.parse(t),o=[t];}catch{o=rd(t),o.length>1&&console.warn("[opencode] parseEvent: falling back to concatenated-JSON split for a malformed line");}for(let s of o){let i;try{i=JSON.parse(s);}catch{continue}let d=Ye(i,n),c=i.type;if(c){if(c==="text"){let f=i.part?.text;f&&r.push({timestamp:d,type:"text",content:f});continue}if(c==="tool_use"){let u=i.part;if(!u)continue;let f=String(u.tool||""),p=String(u.callID||""),g=u.state,m=String(g?.status||""),_=g?.input,k=ut(_);if(r.push({timestamp:d,type:"tool_use",toolName:f,toolUseId:p,toolInput:k}),m==="completed"&&g?.output!==void 0){let T=g.output,S=typeof T=="string"?T:JSON.stringify(T);r.push({timestamp:d,type:"tool_result",toolUseId:p,resultPreview:S,isError:false});}else m==="error"&&r.push({timestamp:d,type:"tool_result",toolUseId:p,resultPreview:String(g?.error||"tool error"),isError:true});continue}if(c==="error"){let u=od(i);r.push({timestamp:d,type:"error",content:u,errorMessage:u});continue}}}return r},suppressOutputLine(t){let e=t.trim();if(!e.startsWith("{")||!e.endsWith("}"))return false;try{let r=JSON.parse(e).type;return r?Gp.has(r):!1}catch{return false}}};});function $n(t,e){return t.some(n=>n===e||n.startsWith(`${e}=`))}function Yp(t,e){if(!(t?vt(Qo).some(s=>s.id===t):false)||!t)return e;let r=Mn(Qo,t),o=xa(Qo)[t]?.defaultEffort;if(r.length!==0)return e?r.includes(e)?e:o&&r.includes(o)?o:void 0:o}var Qo,Zo,es=A(()=>{h();nn();Ln();Ht();Hn();Qo="antigravity";Zo={command:"agy",meta:{displayName:"Antigravity",models:La(),defaultTimeoutMs:{query:12e4,execute:3e5},defaultIdleMs:0},buildArgs(t,e,n){let{model:r,effort:o}=At(e.model),s=jo(r),i=s.model,d=e.effort??o??s.effort,c=Yp(i,d),u=e.additionalArgs??[],f=i&&!$n(u,"--model")?["--model",i]:[],p=$n(u,"--effort")?[]:Ka(c),g=$n(u,"--mode")||$n(u,"--dangerously-skip-permissions")?[]:Va(e.mode),m=$n(u,"--print")?[]:["--print",t];return {args:[...f,...p,...g,...u,...m]}},extractText(t){let e=t.trim();if(!e)throw new ce("Antigravity CLI returned empty output with exit code 0. agy may have hidden an auth/quota/model error in its log file; inspect ~/.gemini/antigravity-cli/log for details.","cli/antigravity",{code:"EMPTY_OUTPUT",kind:"transient"});return e},parseResultMeta(t){return {usage:null,model:null}},parseEvent(t,e){return []}};});var id=A(()=>{h();on();sn();Dn();Ut();});function un(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Fr(t){return un(t)?t:void 0}function Ae(t){return typeof t=="string"?t:void 0}function qt(t){let e=typeof t=="number"?t:Number(t??0);return Number.isFinite(e)?e:0}function tf(t){let e=[],n=-1,r=0,o=false,s=false;for(let i=0;i<t.length;i+=1){let d=t[i];if(n===-1){(d==="{"||d==="[")&&(n=i,r=1);continue}if(s){s=false;continue}if(d==="\\"&&o){s=true;continue}if(d==='"'){o=!o;continue}o||(d==="{"||d==="["?r+=1:(d==="}"||d==="]")&&(r-=1,r===0&&(e.push(t.slice(n,i+1)),n=-1)));}return n!==-1&&e.push(t.slice(n)),e}function qn(t){let e=t.trim();if(!e)return [];try{let n=JSON.parse(e);return un(n)?[n]:[]}catch{return tf(e).flatMap(n=>{try{let r=JSON.parse(n);return un(r)?[r]:[]}catch{return []}})}}function Fn(t){let e=JSON.stringify(t);return e===void 0?String(t):e}function Bn(t){if(typeof t=="string")return t;if(Array.isArray(t)){let e=t.map(Bn).filter(n=>n!==void 0);return e.length>0?e.join(`
27
+ `):void 0}if(un(t)){if(typeof t.text=="string")return t.text;if(typeof t.message=="string")return t.message;if(typeof t.error=="string")return t.error;if(t.type==="text"&&typeof t.data=="string")return t.data;for(let e of ["content","FileContent","rawOutput"]){let n=Bn(t[e]);if(n!==void 0)return n}}}function nf(t){if(t.rawOutput!==null&&t.rawOutput!==void 0)return Bn(t.rawOutput)??Fn(t.rawOutput);if(t.content!==null&&t.content!==void 0)return Bn(t.content)??Fn(t.content);if(t.result!==null&&t.result!==void 0)return Bn(t.result)??Fn(t.result)}function ld(t){let e=Fr(t.error),n=[t.message,t.errorMessage,e?.message,e?.detail,typeof t.error=="string"?t.error:void 0].find(r=>typeof r=="string"&&r.trim().length>0);return n?pd(n):"Grok CLI reported an error."}function pd(t){return (t.replace(ef,"").split(/\r?\n/).map(n=>n.trim()).filter(Boolean)[0]??t.trim()).slice(0,500)}function ud(t){return Zp.test(t)}function rf(t){let e=Fr(t.modelUsage);return e?Object.keys(e)[0]??null:null}function of(t){let e=Fr(t.usage);if(!e)return null;let n=qt(e.cache_read_input_tokens);return {inputTokens:qt(e.input_tokens)+n,cachedInputTokens:n,outputTokens:qt(e.output_tokens),costUsd:qt(t.total_cost_usd)}}function sf(t){let e=0,n=0,r=0,o=false,s=new Set;for(let i of t.split(`
28
+ `).flatMap(qn)){if(i.type!=="usage")continue;let d=Fr(i.usage);if(!d)continue;let c=Ae(i.signature);if(c&&c.length>0){let f=`signature:${c}`;if(s.has(f))continue;s.add(f);}let u=qt(d.cache_read_input_tokens);e+=qt(d.input_tokens)+u,n+=u,r+=qt(d.output_tokens),o=true;}return o?{inputTokens:e,cachedInputTokens:n,outputTokens:r,costUsd:0}:null}function af(t,e){if(!Array.isArray(e.entries)||e.entries.length===0)return [];let n=[];for(let s of e.entries.slice(0,ad)){if(!un(s))continue;let i=Ae(s.content)?.trim();if(!i)continue;let d=Ae(s.status)?.trim(),c=Ae(s.priority)?.trim(),u=[d?`status=${d}`:void 0,c?`priority=${c}`:void 0].filter(p=>!!p),f=u.length>0?` (${u.join(", ")})`:"";n.push(`- ${i}${f}`);}if(n.length===0)return [];e.entries.length>ad&&n.push(cd);let r=n.join(`
29
+ `),o=r.length>dd?`${r.slice(0,dd-1)}${cd}`:r;return [{timestamp:t,type:"info",content:o}]}function df(t,e){let n=Ae(e.type);if(n==="thought"){let r=Ae(e.data);return r===void 0?[]:[{timestamp:t,type:"thinking",content:r}]}if(n==="text"){let r=Ae(e.data);return r===void 0?[]:[{timestamp:t,type:"text",content:r}]}if(n==="plan")return af(t,e);if(n==="tool_call"){let r=Ae(e.toolCallId),o=Ae(e.toolName)??Ae(e.title),s=e.rawInput===void 0?void 0:Fn(e.rawInput);return [{timestamp:t,type:"tool_use",toolUseId:r,toolName:o,toolInput:s}]}if(n==="tool_call_update"){let r=Ae(e.status);return r!=="completed"&&r!=="failed"&&r!=="error"?[]:[{timestamp:t,type:"tool_result",toolUseId:Ae(e.toolCallId),toolName:Ae(e.toolName)??Ae(e.title),resultPreview:nf(e),isError:r!=="completed"||e.isError===true}]}if(n==="error"){let r=ld(e);return [{timestamp:t,type:"error",content:r,errorMessage:r}]}return []}var qr,Qp,Zp,ef,ad,dd,cd,ts,ns=A(()=>{h();nn();qo();Ht();Hn();Ut();qr="cli/grok",Qp=new Set(["available_commands","usage","end"]),Zp=/(?:rate[\s_-]*limit|quota|usage[\s_-]*limit|too many requests|limit(?:ed|ing)?\s+(?:exceeded|reached))/i,ef=/\u001b\[[0-?]*[ -/]*[@-~]/g,ad=20,dd=4e3,cd="\u2026";ts={command:"grok",createSessionId:()=>randomUUID(),meta:{displayName:"Grok",capabilities:{resume:true}},buildArgs(t,e){let{model:n,effort:r}=At(e.model),o=e.effort??r,s=e.resumeSessionId?["--resume",e.resumeSessionId]:e.providerSessionId?["--session-id",e.providerSessionId]:[],i=n?["--model",n]:[],d=n?vt("grok").some(U=>U.id===n):false,c=n&&d?Mn("grok",n):[],u=!o||c.length===0||c.includes(o)?o:void 0,f=Wa(u),p=e.additionalArgs??[],g=U=>p.some(R=>R===U||R.startsWith(`${U}=`)),m=e.providerOptions,_=m?.alwaysApprove,k=m?.sandbox,T=g("--permission-mode")?[]:ja(e.mode),S=g("--always-approve")?[]:za(_),D=g("--sandbox")?[]:Ga(k);return {args:["--no-auto-update",...s,"--single",t,"--output-format","streaming-json","--no-alt-screen",...i,...f,...T,...S,...D,...p]}},extractText(t){let e=[],n=false;for(let r of t.split(`
30
+ `).flatMap(qn))typeof r.type=="string"&&(n=true),r.type==="text"&&typeof r.data=="string"&&e.push(r.data);return e.length>0?e.join(""):n?"":t.trim()},extractFailure(t){for(let e of qn(t))if(e.type==="error"){let n=ld(e);return ud(Fn(e))?new kt(n,qr):new ce(n,qr)}return null},interpretExit(t,e){if(t===0)return null;let n=pd(e)||`Grok CLI exited with code ${t}.`;return ud(e)?new kt(n,qr):new ce(n,qr)},parseResultMeta(t){let n=t.split(`
31
+ `).flatMap(qn).find(r=>r.type==="end");return n?{usage:of(n),model:rf(n)}:{usage:sf(t),model:null}},parseEvent(t,e){let n=e??new Date().toISOString();return qn(t).flatMap(r=>df(Ye(r,n),r))},suppressOutputLine(t){let e=t.trim();if(!e.startsWith("{")||!e.endsWith("}"))return false;try{let n=JSON.parse(e);return un(n)&&typeof n.type=="string"?Qp.has(n.type):!1}catch{return false}}};});var fd,gd=A(()=>{h();Go();Vo();Jo();Xo();es();id();ns();Go();Vo();Jo();Xo();es();ns();on();fd={codex:Ko,claude:Hr,opencode:Yo,antigravity:Zo,copilot:Wo,grok:ts};});function hd(t){if(t.startsWith("cli/"))return fd[t.slice(4)]}var md=A(()=>{h();ba();gd();});function Br(t){return typeof t=="number"&&Number.isFinite(t)?t:0}function cf(t,e){return typeof t=="string"&&t.length>0?t:typeof e=="string"&&e.length>0?e:null}function jr(t){if(typeof t.provider!="string"||t.provider.length===0)return;let n=t.taskLogRepository.readLogs(t.taskId)?.entries.filter(g=>g.level==="stdout").map(g=>g.message).join(`
32
+ `)??"";if(!n.trim())return;let r=hd(t.provider);if(!r)return;let o;try{o=r.parseResultMeta?.(n);}catch{return {stdout:n,adapter:r}}let s=cf(o?.model,t.model),i=o?.usage;if(!i)return {stdout:n,adapter:r};let d=Br(i.inputTokens),c=Br(i.outputTokens),u=Br(i.cachedInputTokens),f=la(Br(i.costUsd),d,c,u,s);return d!==0||c!==0||u!==0||f!==0?{stdout:n,adapter:r,usage:{inputTokens:d,outputTokens:c,cachedInputTokens:u,costUsd:f,model:s}}:{stdout:n,adapter:r}}var rs=A(()=>{h();md();Nr();});function lf(t){if(t)try{let e=JSON.parse(t);if(typeof e!="object"||e===null||Array.isArray(e))return;let n=e.terminalReason;return typeof n=="string"&&uf.has(n)?n:void 0}catch{return}}function Ot(t){switch(t.status){case "stopped":case "runner_lost":case "pending":case "running":case "paused":case "success":return t.status;case "completed":case "done":return "success";case "error":return "failed";case "failed":{let e=lf(t.metadata);return e==="user_stop"?"stopped":e==="runner_lost"?"runner_lost":e==="launch_failed"?"failed":typeof t.error=="string"&&os.stopped.test(t.error)?"stopped":typeof t.error=="string"&&os.runnerLost.test(t.error)?"runner_lost":"failed"}default:return t.status}}var ss,os,uf,jn=A(()=>{h();ss=["success","failed","stopped","runner_lost"],os={stopped:/^(Killed by user|Stopped by user|Cancelled by user|사용자에 의해 중지됨)/,runnerLost:/^Reaped: (process not found|pid never recorded|stale workflow run)/},uf=new Set(["user_stop","runner_lost","launch_failed"]);});function us(t,e,n=1){let r=process.env[t];if(r===void 0||r==="")return e;let o=Number(r);return !Number.isFinite(o)||o<=0?e:Math.max(n,Math.trunc(o))}function Gr(){return us("CREWX_TASK_HEARTBEAT_MS",1e4,200)}function Ft(){return us("CREWX_TASK_HEARTBEAT_STALE_MS",3e4)}function zn(){return us("CREWX_TASK_HEARTBEAT_HARD_STALE_MS",18e5)}function pn(t){return typeof t=="number"&&Number.isFinite(t)?Math.trunc(t):0}function zr(t){let e=typeof t=="object"&&t!==null&&"code"in t?String(t.code):t instanceof Error?t.name:typeof t;console.warn(`[crewx] task heartbeat write failed (${e}); execution continues`);}function ff(t){return t?{id:t.id,status:t.status,run_epoch:t.run_epoch,stop_requested_at:t.stop_requested_at,stop_requested_epoch:t.stop_requested_epoch,pid:t.pid,metadata:t.metadata,started_at:t.started_at,duration_ms:t.duration_ms}:null}function _d(t,e){return !!t.stop_requested_at&&pn(t.stop_requested_epoch)===pn(e)}function is(t,e){let n=pn(e.runEpoch);if(!(e.writeHeartbeat===false?true:t.heartbeatTask({id:e.taskId,runEpoch:n})))return {accepted:false,row:null};let o=ff(t.getTask(e.taskId));return !o||o.status!=="running"||pn(o.run_epoch)!==n?{accepted:false,row:o}:{accepted:true,row:o}}function kd(t,e){let n=ln.get(t);return !n||e&&n!==e?false:(clearInterval(n.timer),ln.delete(t),true)}function Td(t,e){let n=ln.get(t);return !n||e!==void 0&&n.runEpoch!==pn(e)?false:kd(t,n)}function gf(t,e){let n=pn(e.runEpoch);Td(e.taskId);let r=true,o=null;try{let u=is(t,{...e,runEpoch:n});r=u.accepted,o=u.row;}catch(u){zr(u);}if(!r)return false;let s=Gr(),i=Math.min(s,1e3),d=setInterval(()=>{let u=ln.get(e.taskId);if(!(!u||u.timer!==d))try{u.heartbeatElapsedMs+=i;let f=u.heartbeatElapsedMs>=s,p=is(t,{taskId:e.taskId,runEpoch:n,writeHeartbeat:f});if(!p.accepted){kd(e.taskId,u);return}f&&(u.heartbeatElapsedMs%=s,u.lastHeartbeatAt=Date.now()),p.row&&_d(p.row,n)&&!u.stopRequested&&(u.stopRequested=!0,e.onStopRequested&&Promise.resolve(e.onStopRequested(p.row)).catch(zr));}catch(f){zr(f);}},i),c={timer:d,runEpoch:n,stopRequested:false,lastHeartbeatAt:Date.now(),heartbeatElapsedMs:0};return ln.set(e.taskId,c),typeof d=="object"&&d!==null&&"unref"in d&&d.unref(),o&&_d(o,n)&&e.onStopRequested&&(c.stopRequested=true,Promise.resolve(e.onStopRequested(o)).catch(zr)),true}var as,ds,cs,pf,ln,Gn=A(()=>{h();as=1e4,ds=3e4,cs=18e5,pf=1e3;ln=new Map;});function ms(t,e=Date.now(),n=Kr){let r=t?Date.parse(t):Number.NaN,o=typeof e=="number"?e:Date.parse(e),s=hs(n,Kr,0);return Number.isFinite(r)&&Number.isFinite(o)&&o-r>s?"forced":"cooperative"}function hs(t,e,n){return t===void 0||!Number.isFinite(t)?e:Math.max(n,Math.trunc(t))}function vd(t){if(!t)return {};try{let e=JSON.parse(t);if(typeof e=="object"&&e!==null&&!Array.isArray(e))return e}catch{}return {}}function hf(t){if(!t)return;let e=vd(t.metadata).stopMethod;return e==="cooperative"||e==="forced"?e:void 0}function lt(t,e){if(!t)return {status:"not_running",finalStatus:"not_running",...e?{pid:e}:{}};let n=typeof t.pid=="number"&&t.pid>0?t.pid:e;if(t.status==="stopped"){let r=hf(t);return {status:"stopped",finalStatus:t.status,...r?{method:r}:{},...n?{pid:n}:{}}}return {status:"not_running",finalStatus:t.status,...n?{pid:n}:{}}}function Ad(t,e,n="Process owner could not be verified"){let r=e??(t.pid&&t.pid>0?t.pid:void 0);return {status:"ownership_unverified",finalStatus:t.status,...r?{pid:r}:{},error:n}}function we(t,e,n){let r=n??(t?.pid&&t.pid>0?t.pid:void 0);return {status:"failed",finalStatus:t?.status??null,...r?{pid:r}:{},error:e}}function ls(t,e){return we(t,bd,e)}function mf(t,e){if(!t.heartbeat_at)return false;let n=Date.parse(t.heartbeat_at);return Number.isFinite(n)?e-n<=Ft():false}function _f(t){return {...t.processControlOptions,...t.platform?{platform:t.platform}:{}}}function kf(t){let e=typeof t.pid=="number"&&t.pid>0?t.pid:void 0,n=vd(t.metadata),r=n.ownership==="runner"&&typeof n.providerPid=="number"&&Number.isSafeInteger(n.providerPid)&&n.providerPid>0?n.providerPid:void 0;return [...new Set([e,r].filter(o=>o!==void 0))]}function Tf(t,e,n){let r=t.getTask(e);if(!r||r.status!=="running")return lt(r,n)}async function wf(t,e,n,r){let o=Date.now()+n;for(;;){let s=Tf(t,e);if(s)return s;let i=o-Date.now();if(i<=0)return;await new Promise(d=>{setTimeout(d,Math.min(r,i));});}}async function wd(t,e,n){let r=new Date().toISOString(),o={origin:n.origin??"internal",...n.callerPid!==void 0?{callerPid:n.callerPid}:{},...n.callerTaskId!==void 0?{callerTaskId:n.callerTaskId}:{}},s=t.requestTaskStop({id:e,requestedAt:r,...o}),i=t.getTask(e);if(!s.accepted){if(s.status==="pending"){let U=t.stopPendingTask(e,void 0,void 0,{...o,at:r}),R=t.getTask(e);if(U||!R||R.status!=="running")return lt(R);if(s=t.requestTaskStop({id:e,requestedAt:r,...o}),!s.accepted&&s.status!=="running"||!s.accepted&&!s.alreadyRequestedAt)return lt(t.getTask(e))}else if(!(s.status==="running"&&s.alreadyRequestedAt))return lt(i)}let d=s.runEpoch,c=hs(n.graceMs,Kr,0),u=hs(n.pollMs,Ed,1),f=await wf(t,e,c,u);if(f)return f;let p=t.getTask(e);if(!p||p.status!=="running")return lt(p);let g=kf(p),m=g[0];if(!m){let U=t.finalizeTaskStop({id:e,runEpoch:d,method:"forced"}),R=t.getTask(e);return U||R?.status!=="running"?lt(R):we(R,"Failed to finalize task stop")}let _=_f(n),k="unknown";if(!mf(p,Date.now())){let U=n.processControl?.checkProcessOwnershipAsync??Ho;try{k=await U(m,n.ownershipMarkers??_s,_);}catch{k="unknown";}if(k!=="owned")return Ad(p)}let T=n.processControl?.terminateProcessTree??Uo;for(let U of g){let R;try{R=await T(U,{..._,signal:Mo});}catch(O){R={status:"failed",pid:U,method:_.platform==="win32"?"taskkill":"process-group",error:O instanceof Error?O.message:String(O)};}if(R.status==="failed")return we(t.getTask(e),R.error??"Failed to terminate process tree")}let S=t.finalizeTaskStop({id:e,runEpoch:d,method:"forced"}),D=t.getTask(e);return S||D?.status!=="running"?lt(D,m):we(D,"Task changed before stop was finalized")}function yd(t){return typeof t=="number"&&Number.isSafeInteger(t)&&t>0}function Rd(t){return Number.isSafeInteger(t)&&t>=0}function ps(t){return typeof t=="number"&&Number.isFinite(t)?Math.trunc(t):0}function yf(t){return {...t.processControlOptions,...t.platform?{platform:t.platform}:{}}}async function Od(t,e){let n=t.getTask(e.taskId);if(!n||n.status!=="running")return ls(n,yd(e.targetPid)?e.targetPid:void 0);if(!Rd(e.sourceRunEpoch)||!Rd(e.settleRunEpoch)||ps(n.run_epoch)!==e.settleRunEpoch)return we(n,Wr,e.targetPid);if(e.workspaceId!==void 0&&n.workspace_id!==e.workspaceId)return we(n,Vr,e.targetPid);let r=new Date().toISOString(),o;try{o=t.requestTaskStop({id:e.taskId,requestedAt:r,sourceRunEpoch:e.sourceRunEpoch,settleRunEpoch:e.settleRunEpoch,...e.workspaceId!==void 0?{workspaceId:e.workspaceId}:{}});}catch{return we(n,Id,e.targetPid)}let s=t.getTask(e.taskId);if(!s||s.status!=="running")return ls(s,e.targetPid);if(o.runEpoch!==e.settleRunEpoch||ps(s.run_epoch)!==e.settleRunEpoch)return we(s,Wr,e.targetPid);if(e.workspaceId!==void 0&&s.workspace_id!==e.workspaceId)return we(s,Vr,e.targetPid);if(!yd(e.targetPid))return we(s,Sd);let i=yf(e),d=e.processControl?.checkProcessOwnershipAsync??Ho,c="unknown";try{c=await d(e.targetPid,e.ownershipMarkers??_s,i);}catch{c="unknown";}if(c!=="owned")return Ad(s,e.targetPid);let u=t.getTask(e.taskId);if(!u||u.status!=="running")return ls(u,e.targetPid);if(ps(u.run_epoch)!==e.settleRunEpoch)return we(u,Wr,e.targetPid);if(e.workspaceId!==void 0&&u.workspace_id!==e.workspaceId)return we(u,Vr,e.targetPid);let f=e.processControl?.terminateProcessTree??Uo,p;try{p=await f(e.targetPid,{...i,signal:Mo});}catch{return we(t.getTask(e.taskId),fs,e.targetPid)}if(p.status==="failed")return we(t.getTask(e.taskId),fs,e.targetPid);let g;try{g=t.finalizeTaskStop({id:e.taskId,runEpoch:e.settleRunEpoch,method:"forced"});}catch{return we(t.getTask(e.taskId),gs,e.targetPid)}return g?lt(t.getTask(e.taskId),e.targetPid):we(t.getTask(e.taskId),gs,e.targetPid)}function ks(t,e,n={}){if(typeof t=="string"){let r=t,o=e??{};return Promise.resolve().then(()=>(Wn(),Nd)).then(({TaskRepository:s})=>wd(new s,r,o))}return wd(t,e,n)}var Kr,Ed,_s,Sd,Wr,Vr,bd,fs,gs,Id,Ts=A(()=>{h();$o();Gn();Kr=5e3,Ed=250;_s=["crewx","claude","codex","opencode","grok","node"],Sd="INSTRUCTION_STOP_TARGET_PID_MISSING",Wr="INSTRUCTION_STOP_EPOCH_MISMATCH",Vr="INSTRUCTION_STOP_WORKSPACE_MISMATCH",bd="INSTRUCTION_STOP_GENERATION_ALREADY_SETTLED",fs="INSTRUCTION_STOP_PROCESS_TERMINATION_FAILED",gs="INSTRUCTION_STOP_SETTLE_CAS_FAILED",Id="INSTRUCTION_STOP_REQUEST_FAILED";});var Nd={};Gc(Nd,{DEFAULT_TASK_REAPER_TICK_INTERVAL_MS:()=>vs,HOST_SHUTDOWN_TERMINAL_ERROR:()=>Ld,PENDING_ADOPT_GRACE_MS:()=>Hd,PID_NULL_REAP_GRACE_MS:()=>Is,TASK_HEARTBEAT_HARD_STALE_MS:()=>cs,TASK_HEARTBEAT_INTERVAL_MS:()=>as,TASK_HEARTBEAT_STALE_MS:()=>ds,TaskRepository:()=>Zr,hasRecordedUsage:()=>kn,mergeTerminalReason:()=>Qr,resolveTaskHeartbeatHardStaleMs:()=>zn,resolveTaskHeartbeatIntervalMs:()=>Gr,resolveTaskHeartbeatStaleMs:()=>Ft});function Qe(t){return {...t,status:Ot(t)}}function xd(t){return {...t,status:Ot(t)}}function Rs(t=a.model,e=a.metadata){let n=sql`
31
33
  CASE
32
- WHEN ${a.model} LIKE 'claude-%' OR ${a.model} IN ('opus', 'sonnet', 'haiku', 'opus[1m]', 'sonnet[1m]') THEN 'claude'
33
- WHEN ${a.model} LIKE 'gpt-%' OR ${a.model} LIKE 'codex-%' THEN 'codex'
34
- WHEN ${a.model} LIKE 'gemini-%' THEN 'gemini'
35
- WHEN ${a.model} LIKE 'grok-%' THEN 'grok'
36
- WHEN ${a.model} LIKE 'zai-%' OR ${a.model} LIKE 'openrouter/z-ai/%' THEN 'opencode'
37
- WHEN ${a.model} LIKE 'minimax/%' THEN 'minimax'
38
- WHEN ${a.model} LIKE 'qwen%' THEN 'qwen'
34
+ WHEN ${t} LIKE 'claude-%' OR ${t} IN ('opus', 'sonnet', 'haiku', 'opus[1m]', 'sonnet[1m]') THEN 'claude'
35
+ WHEN ${t} LIKE 'gpt-%' OR ${t} LIKE 'codex-%' THEN 'codex'
36
+ WHEN ${t} LIKE 'gemini-%' THEN 'gemini'
37
+ WHEN ${t} LIKE 'grok-%' THEN 'grok'
38
+ WHEN ${t} LIKE 'zai-%' OR ${t} LIKE 'openrouter/z-ai/%' THEN 'opencode'
39
+ WHEN ${t} LIKE 'minimax/%' THEN 'minimax'
40
+ WHEN ${t} LIKE 'qwen%' THEN 'qwen'
39
41
  ELSE 'unknown'
40
42
  END
41
- `,e=sql`json_extract(${a.metadata}, '$.provider')`,n=sql`trim(${e})`,r=sql`substr(${n}, 1, instr(${n}, '/') - 1)`,o=sql`
43
+ `,r=sql`json_extract(${e}, '$.provider')`,o=sql`trim(${r})`,s=sql`substr(${o}, 1, instr(${o}, '/') - 1)`,i=sql`
42
44
  CASE
43
- WHEN instr(${n}, '/') > 0
44
- AND ${r} IN ('cli', 'acp', 'api', 'plugin', 'remote')
45
- THEN substr(${n}, instr(${n}, '/') + 1)
46
- ELSE ${n}
45
+ WHEN instr(${o}, '/') > 0
46
+ AND ${s} IN ('cli', 'acp', 'api', 'plugin', 'remote')
47
+ THEN substr(${o}, instr(${o}, '/') + 1)
48
+ ELSE ${o}
47
49
  END
48
50
  `;return sql`
49
51
  CASE
50
- WHEN ${a.metadata} IS NULL THEN ${t}
51
- WHEN json_valid(${a.metadata}) = 0 THEN 'unknown'
52
- WHEN json_type(${a.metadata}, '$') IS NOT 'object' THEN 'unknown'
53
- WHEN json_type(${a.metadata}, '$.provider') IS NULL THEN ${t}
54
- WHEN json_type(${a.metadata}, '$.provider') IS NOT 'text' THEN 'unknown'
55
- WHEN ${n} = '' THEN 'unknown'
56
- WHEN trim(${o}) = '' THEN 'unknown'
57
- ELSE ${o}
52
+ WHEN ${e} IS NULL THEN ${n}
53
+ WHEN json_valid(${e}) = 0 THEN 'unknown'
54
+ WHEN json_type(${e}, '$') IS NOT 'object' THEN 'unknown'
55
+ WHEN json_type(${e}, '$.provider') IS NULL THEN ${n}
56
+ WHEN json_type(${e}, '$.provider') IS NOT 'text' THEN 'unknown'
57
+ WHEN ${o} = '' THEN 'unknown'
58
+ WHEN trim(${i}) = '' THEN 'unknown'
59
+ ELSE ${i}
58
60
  END
59
- `}function Vn(t){return sql`${t} NOT IN (${sql.join(gf.map(e=>sql`${e}`),sql`, `)})`}function Gr(t){let e=sql`
61
+ `}function Yn(t){return sql`${t} NOT IN (${sql.join(Nf.map(e=>sql`${e}`),sql`, `)})`}function Jr(t){let e=sql`
60
62
  CASE
61
63
  WHEN json_valid(${t}) = 1
62
64
  THEN json_extract(${t}, '$.usageAccounting')
@@ -66,13 +68,13 @@ ${r.join(`
66
68
  COALESCE(SUM(
67
69
  CASE WHEN ${e} = 'unavailable' THEN 1 ELSE 0 END
68
70
  ), 0)
69
- `}function gn(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function ce(t){if(!t)return {};try{let e=JSON.parse(t);return gn(e)?{...e}:{}}catch{return {}}}function Wr(t,e){let n=t.origin&&Nd.has(t.origin)?t.origin:"internal",r=t.callerPid!==void 0&&Number.isInteger(t.callerPid)&&t.callerPid>0?t.callerPid:process.pid;return {origin:n,at:t.at??e,callerPid:r,...t.callerTaskId?{callerTaskId:t.callerTaskId}:{}}}function hf(t){let e=ce(t).stopRequest;if(gn(e)&&!(typeof e.origin!="string"||!Nd.has(e.origin)||typeof e.at!="string"||typeof e.callerPid!="number"))return {...e}}function Ad(){return or$1(isNull(a.stop_requested_at),ne(sql`COALESCE(${a.stop_requested_epoch}, 0)`,sql`COALESCE(${a.run_epoch}, 0)`))}function Vr(t,e){let n=ce(t??null);return n.terminalReason=e,JSON.stringify(n)}function ws(t,e){let n={...t,terminalReason:"user_stop"},r=e?.trim();return r&&r!==vd&&(n[pf]=e),{error:vd,metadata:n}}function ye(t){return typeof t=="number"&&Number.isFinite(t)?t:0}function hn(t){return ye(t.input_tokens)!==0||ye(t.output_tokens)!==0||ye(t.cached_input_tokens)!==0||ye(t.cost_usd)!==0}function Z(t){return typeof t=="number"&&Number.isFinite(t)?Math.trunc(t):0}function Od(t){return {inputTokens:ye(t.inputTokens??0),outputTokens:ye(t.outputTokens??0),cachedInputTokens:ye(t.cachedInputTokens??0),costUsd:ye(t.costUsd??0)}}function mf(t){if(gn(t))return {inputTokens:ye(t.inputTokens),outputTokens:ye(t.outputTokens),cachedInputTokens:ye(t.cachedInputTokens),costUsd:ye(t.costUsd)}}function _f(t){let e={inputTokens:0,outputTokens:0,cachedInputTokens:0,costUsd:0};for(let n of Object.values(t)){let r=mf(n);r&&(e.inputTokens+=r.inputTokens,e.outputTokens+=r.outputTokens,e.cachedInputTokens+=r.cachedInputTokens,e.costUsd+=r.costUsd);}return e}function Kr(t,e,n){let r=Date.parse(t),o=Date.parse(e);return Number.isFinite(r)&&Number.isFinite(o)?o-r:n??null}var ks,wt,uf,yt,Et,lf,Ts,Kn,Qe,vd,Cd,pf,ff,gf,Nd,Es,xd,Rs,Jr,zn=v(()=>{h();oe();pe();ae();le();de();Ar();Lo();Or();es();Fn();Bn();ms();Bn();ks=40,wt="2026-05-09",uf="0.8.9-rc.13",yt=10,Et=parseInt(uf.split("rc.")[1]);lf=new Set(["workflow","mcp"]),Ts="usageByEpoch",Kn="lateUsage",Qe="usageAccounting",vd="Stopped by user",Cd="Stopped by app shutdown",pf="terminalErrorOriginal",ff=new Set(["stopped","runner_lost"]),gf=["pending","running"];Nd=new Set(["http","cli","instruction","workflow","internal"]);Es=600*1e3,xd=600*1e3,Rs=300*1e3,Jr=class extends F{dbPath;clock;taskLogRepository;lastReaperTickAt;pidNullObservedSince=new Map;constructor(e={}){super(),this.clock=e.clock??(()=>Date.now()),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db")),this.taskLogRepository=new Ut({dbPath:this.dbPath});}resolveDbPath(){return this.dbPath?Be(this.dbPath):super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=dirname(n);existsSync(o)||mkdirSync(o,{recursive:true});}else if(!existsSync(n))throw new l("NOT_FOUND","Database not found");let r=P(n);if(e)try{K(r.db,n);}catch(o){throw r.close(),o}return r}heartbeatTask(e){let n=this.openHandle(true);try{let r=Z(e.runEpoch),o=r===0?or$1(eq(a.run_epoch,0),isNull(a.run_epoch)):eq(a.run_epoch,r);return n.db.update(a).set({heartbeat_at:new Date(this.clock()).toISOString()}).where(and(eq(a.id,e.id),o,eq(a.status,"running"))).run().changes>0}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to heartbeat task",r)}finally{n.close();}}requestTaskStop(e){if(!this.dbExists())return {accepted:false,status:"not_running",runEpoch:0};let n=this.openHandle(true);try{let r={accepted:!1,status:"not_running",runEpoch:0};return n.db.transaction(o=>{let s=o.select({id:a.id,status:a.status,run_epoch:a.run_epoch,stop_requested_at:a.stop_requested_at,stop_requested_epoch:a.stop_requested_epoch,metadata:a.metadata}).from(a).where(eq(a.id,e.id)).limit(1).get();if(!s)return;let i=Z(s.run_epoch);if(s.status!=="running"){r={accepted:!1,status:s.status,runEpoch:i};return}let d=s.stop_requested_at!==null&&Z(s.stop_requested_epoch)===i,c=d?s.stop_requested_at:e.requestedAt,u=ce(s.metadata),f=d?hf(s.metadata)??Wr({origin:e.origin,at:c,callerPid:e.callerPid,callerTaskId:e.callerTaskId},c):Wr({origin:e.origin,at:c,callerPid:e.callerPid,callerTaskId:e.callerTaskId},c);if(o.update(a).set({stop_requested_at:e.requestedAt,stop_requested_epoch:sql`${a.run_epoch}`,metadata:JSON.stringify({...u,stopRequest:f})}).where(and(eq(a.id,e.id),eq(a.status,"running"),Ad())).run().changes===0){let w=o.select({status:a.status,run_epoch:a.run_epoch,stop_requested_at:a.stop_requested_at,stop_requested_epoch:a.stop_requested_epoch}).from(a).where(eq(a.id,e.id)).limit(1).get();if(!w||w.status!=="running"){r={accepted:!1,status:w?.status??"not_running",runEpoch:Z(w?.run_epoch)};return}r={accepted:!1,status:w.status,runEpoch:Z(w.run_epoch),...w.stop_requested_at&&Z(w.stop_requested_epoch)===Z(w.run_epoch)?{alreadyRequestedAt:w.stop_requested_at}:{}};}else r={accepted:!0,status:s.status,runEpoch:i};let g=new Set([e.id]),m=(w,_)=>{if(_>=8)return;let T=o.select({id:a.id,status:a.status,metadata:a.metadata}).from(a).where(and(eq(a.parent_task_id,w),eq(a.status,"running"))).all();for(let S of T)g.has(S.id)||(g.add(S.id),o.update(a).set({stop_requested_at:c,stop_requested_epoch:sql`${a.run_epoch}`,metadata:JSON.stringify({...ce(S.metadata),stopRequest:f})}).where(and(eq(a.id,S.id),eq(a.status,"running"),Ad())).run(),m(S.id,_+1));};m(e.id,0);},{behavior:"immediate"}),r}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to request task stop",r)}finally{n.close();}}requestTaskStopForInstruction(e){if(!this.dbExists())return {accepted:false,status:"not_running",runEpoch:0};let n=this.openHandle(true);try{let r={accepted:!1,status:"not_running",runEpoch:0};return n.db.transaction(o=>{let s=o.select({id:a.id,status:a.status,run_epoch:a.run_epoch,workspace_id:a.workspace_id,stop_requested_at:a.stop_requested_at,stop_requested_epoch:a.stop_requested_epoch,metadata:a.metadata}).from(a).where(eq(a.id,e.id)).limit(1).get();if(!s)return;let i=Z(s.run_epoch),d=Z(e.sourceRunEpoch),c=Z(e.settleRunEpoch);if(s.status!=="running"||i!==c||e.workspaceId!==void 0&&s.workspace_id!==e.workspaceId){r={accepted:!1,status:s.status,runEpoch:i};return}let u=c===0?or$1(eq(a.run_epoch,0),isNull(a.run_epoch)):eq(a.run_epoch,c),f=or$1(isNull(a.stop_requested_at),isNull(a.stop_requested_epoch),ne(a.stop_requested_epoch,d)),p=Wr({origin:"instruction",at:e.requestedAt,callerPid:e.callerPid,callerTaskId:e.callerTaskId},e.requestedAt),g=T=>o.update(a).set({stop_requested_at:e.requestedAt,stop_requested_epoch:d,metadata:JSON.stringify({...ce(s.metadata),stopRequest:p})}).where(and(eq(a.id,e.id),eq(a.status,"running"),u,T,f)).run();if((e.workspaceId===void 0?g():e.workspaceId===null?g(isNull(a.workspace_id)):g(eq(a.workspace_id,e.workspaceId))).changes>0){r={accepted:!0,status:s.status,runEpoch:c};return}let w=o.select({status:a.status,run_epoch:a.run_epoch,stop_requested_at:a.stop_requested_at,stop_requested_epoch:a.stop_requested_epoch}).from(a).where(eq(a.id,e.id)).limit(1).get();if(!w||w.status!=="running"){r={accepted:!1,status:w?.status??"not_running",runEpoch:Z(w?.run_epoch)};return}let _=Z(w.run_epoch);r={accepted:!1,status:w.status,runEpoch:_,...w.stop_requested_at&&Z(w.stop_requested_epoch)===d?{alreadyRequestedAt:w.stop_requested_at}:{}};},{behavior:"immediate"}),r}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to request instruction task stop",r)}finally{n.close();}}finalizeTaskStop(e){if(!this.dbExists())return false;let n=this.openHandle(true);try{let r=e.completedAt??new Date(this.clock()).toISOString(),o=!1;return n.db.transaction(s=>{let i=s.select({status:a.status,run_epoch:a.run_epoch,stop_requested_at:a.stop_requested_at,stop_requested_epoch:a.stop_requested_epoch,started_at:a.started_at,duration_ms:a.duration_ms,metadata:a.metadata}).from(a).where(eq(a.id,e.id)).limit(1).get();if(!i||i.status!=="running"||Z(i.run_epoch)!==Z(e.runEpoch))return;let d=i.stop_requested_at!==null&&Z(i.stop_requested_epoch)===Z(e.runEpoch),c=ce(i.metadata),u=d?ws(c,e.error):{error:e.error??null,metadata:e.terminalReason===void 0?{...c}:{...c,terminalReason:e.terminalReason}},f={...u.metadata,stopMethod:e.method},p=i.duration_ms??e.durationMs??Kr(i.started_at,r,void 0),g=i.run_epoch===null?isNull(a.run_epoch):eq(a.run_epoch,i.run_epoch);o=s.update(a).set({status:"stopped",error:u.error,completed_at:r,duration_ms:p,metadata:JSON.stringify(f)}).where(and(eq(a.id,e.id),eq(a.status,"running"),g)).run().changes>0;},{behavior:"immediate"}),o}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to finalize task stop",r)}finally{n.close();}}finalizeTaskForHostShutdown(e){if(!this.dbExists())return "not_running";let n=this.openHandle(true);try{let r=e.completedAt??new Date(this.clock()).toISOString(),o=Z(e.expectedRunEpoch),s="not_running";return n.db.transaction(i=>{let d=i.select({status:a.status,run_epoch:a.run_epoch,workspace_id:a.workspace_id,started_at:a.started_at,duration_ms:a.duration_ms,metadata:a.metadata}).from(a).where(eq(a.id,e.id)).limit(1).get();if(!d||d.status!=="running"){s="not_running";return}if(Z(d.run_epoch)!==o){s="epoch_mismatch";return}if(e.workspaceId!==void 0&&d.workspace_id!==e.workspaceId){s="workspace_mismatch";return}let u=d.run_epoch===null?isNull(a.run_epoch):eq(a.run_epoch,d.run_epoch),f=e.workspaceId===void 0?void 0:e.workspaceId===null?isNull(a.workspace_id):eq(a.workspace_id,e.workspaceId),p={...ce(d.metadata),terminalReason:"runner_lost"},g=d.duration_ms??Kr(d.started_at,r,void 0);s=i.update(a).set({status:"runner_lost",error:Cd,completed_at:r,duration_ms:g,metadata:JSON.stringify(p)}).where(and(eq(a.id,e.id),eq(a.status,"running"),u,f)).run().changes>0?"settled":"not_running";},{behavior:"immediate"}),s}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to finalize task for host shutdown",r)}finally{n.close();}}async stopTask(e,n={}){return hs(this,e,n)}async stopTaskGenerationForInstruction(e){return Rd({requestTaskStop:n=>this.requestTaskStopForInstruction(n),getTask:n=>this.getTask(n),finalizeTaskStop:n=>this.finalizeTaskStop(n)},e)}startTask(e){let n=this.openHandle(true);try{let r={id:e.id,agent_id:e.agentId,prompt:e.prompt,mode:e.mode,status:e.status,started_at:e.startedAt,pid:e.pid??null,parent_task_id:e.parentTaskId??null,caller_agent_id:e.callerAgentId??null,trace_id:e.traceId??null,command:e.command??null,metadata:e.metadata??null,workspace_id:e.workspaceId??null,cwd:e.cwd??null,project_id:e.projectId??null,platform:e.platform??"cli",crewx_version:e.crewxVersion??null,thread_id:e.threadId??null,model:e.model??null,rendered_prompt:e.renderedPrompt??null,coding_agent_command:e.codingAgentCommand??null,log_storage:"events"},o=s=>{n.db.insert(a).values(s).onConflictDoUpdate({target:a.id,set:{status:sql`CASE WHEN ${a.status} = 'pending' AND ${a.pid} IS NULL THEN 'running' ELSE ${a.status} END`,pid:sql`COALESCE(excluded.pid, ${a.pid})`,command:sql`CASE WHEN ${a.status} = 'pending' AND ${a.pid} IS NULL THEN excluded.command ELSE ${a.command} END`,metadata:sql`CASE WHEN ${a.status} = 'pending' AND ${a.pid} IS NULL THEN excluded.metadata ELSE ${a.metadata} END`,workspace_id:sql`CASE WHEN ${a.status} = 'pending' AND ${a.pid} IS NULL THEN COALESCE(${a.workspace_id}, excluded.workspace_id) ELSE ${a.workspace_id} END`,cwd:sql`CASE WHEN ${a.status} = 'pending' AND ${a.pid} IS NULL THEN COALESCE(${a.cwd}, excluded.cwd) ELSE ${a.cwd} END`,project_id:sql`CASE WHEN ${a.status} = 'pending' AND ${a.pid} IS NULL THEN COALESCE(${a.project_id}, excluded.project_id) ELSE ${a.project_id} END`,crewx_version:sql`CASE WHEN ${a.status} = 'pending' AND ${a.pid} IS NULL THEN excluded.crewx_version ELSE ${a.crewx_version} END`,model:sql`CASE WHEN ${a.status} = 'pending' AND ${a.pid} IS NULL THEN excluded.model ELSE ${a.model} END`,rendered_prompt:sql`CASE WHEN ${a.status} = 'pending' AND ${a.pid} IS NULL THEN excluded.rendered_prompt ELSE ${a.rendered_prompt} END`,coding_agent_command:sql`CASE WHEN ${a.status} = 'pending' AND ${a.pid} IS NULL THEN excluded.coding_agent_command ELSE ${a.coding_agent_command} END`},setWhere:or$1(eq(a.status,"running"),and(eq(a.status,"pending"),isNull(a.pid)))}).run();};try{o(r);}catch(s){let i=s instanceof Error?s.message:typeof s=="object"&&s!==null&&"message"in s?String(s.message):String(s);if(!/log_storage|heartbeat_at|stop_requested_at|stop_requested_epoch|cwd/i.test(i)||!/no such column|no column named/i.test(i))throw s;let d=new Set(n.db.all("PRAGMA table_info(tasks)").map(T=>T.name)),c=d.has("cwd"),u=d.has("log_storage"),f=c?", cwd":"",p=c?", ?":"",g=c?", cwd = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN COALESCE(tasks.cwd, excluded.cwd) ELSE tasks.cwd END":"",m=u?", log_storage":"",w=u?", ?":"",_=u?`,
71
+ `}function _n(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function ue(t){if(!t)return {};try{let e=JSON.parse(t);return _n(e)?{...e}:{}}catch{return {}}}function Yr(t,e){let n=t.origin&&Md.has(t.origin)?t.origin:"internal",r=t.callerPid!==void 0&&Number.isInteger(t.callerPid)&&t.callerPid>0?t.callerPid:process.pid;return {origin:n,at:t.at??e,callerPid:r,...t.callerTaskId?{callerTaskId:t.callerTaskId}:{}}}function xf(t){let e=ue(t).stopRequest;if(_n(e)&&!(typeof e.origin!="string"||!Md.has(e.origin)||typeof e.at!="string"||typeof e.callerPid!="number"))return {...e}}function Pd(){return or$1(isNull(a.stop_requested_at),ne(sql`COALESCE(${a.stop_requested_epoch}, 0)`,sql`COALESCE(${a.run_epoch}, 0)`))}function Qr(t,e){let n=ue(t??null);return n.terminalReason=e,JSON.stringify(n)}function Ss(t,e){let n={...t,terminalReason:"user_stop"},r=e?.trim();return r&&r!==Cd&&(n[Af]=e),{error:Cd,metadata:n}}function ye(t){return typeof t=="number"&&Number.isFinite(t)?t:0}function kn(t){return ye(t.input_tokens)!==0||ye(t.output_tokens)!==0||ye(t.cached_input_tokens)!==0||ye(t.cost_usd)!==0}function Z(t){return typeof t=="number"&&Number.isFinite(t)?Math.trunc(t):0}function Dd(t){return {inputTokens:ye(t.inputTokens??0),outputTokens:ye(t.outputTokens??0),cachedInputTokens:ye(t.cachedInputTokens??0),costUsd:ye(t.costUsd??0)}}function Cf(t){if(_n(t))return {inputTokens:ye(t.inputTokens),outputTokens:ye(t.outputTokens),cachedInputTokens:ye(t.cachedInputTokens),costUsd:ye(t.costUsd)}}function Pf(t){let e={inputTokens:0,outputTokens:0,cachedInputTokens:0,costUsd:0};for(let n of Object.values(t)){let r=Cf(n);r&&(e.inputTokens+=r.inputTokens,e.outputTokens+=r.outputTokens,e.cachedInputTokens+=r.cachedInputTokens,e.costUsd+=r.costUsd);}return e}function Xr(t,e,n){let r=Date.parse(t),o=Date.parse(e);return Number.isFinite(r)&&Number.isFinite(o)?o-r:n??null}var ys,gn,If,hn,mn,vf,Es,Jn,Ze,Cd,Ld,Af,Of,Nf,Md,Is,Hd,vs,Zr,Wn=A(()=>{h();oe();fe();ae();pe();de();Nr();$o();xr();rs();jn();Gn();Ts();Gn();ys=40,gn="2026-05-09",If="0.8.9-rc.13",hn=10,mn=parseInt(If.split("rc.")[1]);vf=new Set(["workflow","mcp"]),Es="usageByEpoch",Jn="lateUsage",Ze="usageAccounting",Cd="Stopped by user",Ld="Stopped by app shutdown",Af="terminalErrorOriginal",Of=new Set(["stopped","runner_lost"]),Nf=["pending","running"];Md=new Set(["http","cli","instruction","workflow","internal"]);Is=600*1e3,Hd=600*1e3,vs=300*1e3,Zr=class extends B{dbPath;clock;taskLogRepository;lastReaperTickAt;pidNullObservedSince=new Map;constructor(e={}){super(),this.clock=e.clock??(()=>Date.now()),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db")),this.taskLogRepository=new Mt({dbPath:this.dbPath});}resolveDbPath(){return this.dbPath?ze(this.dbPath):super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=dirname(n);existsSync(o)||mkdirSync(o,{recursive:true});}else if(!existsSync(n))throw new l("NOT_FOUND","Database not found");let r=P(n);if(e)try{K(r.db,n);}catch(o){throw r.close(),o}return r}heartbeatTask(e){let n=this.openHandle(true);try{let r=Z(e.runEpoch),o=r===0?or$1(eq(a.run_epoch,0),isNull(a.run_epoch)):eq(a.run_epoch,r);return n.db.update(a).set({heartbeat_at:new Date(this.clock()).toISOString()}).where(and(eq(a.id,e.id),o,eq(a.status,"running"))).run().changes>0}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to heartbeat task",r)}finally{n.close();}}requestTaskStop(e){if(!this.dbExists())return {accepted:false,status:"not_running",runEpoch:0};let n=this.openHandle(true);try{let r={accepted:!1,status:"not_running",runEpoch:0};return n.db.transaction(o=>{let s=o.select({id:a.id,status:a.status,run_epoch:a.run_epoch,stop_requested_at:a.stop_requested_at,stop_requested_epoch:a.stop_requested_epoch,metadata:a.metadata}).from(a).where(eq(a.id,e.id)).limit(1).get();if(!s)return;let i=Z(s.run_epoch);if(s.status!=="running"){r={accepted:!1,status:s.status,runEpoch:i};return}let d=s.stop_requested_at!==null&&Z(s.stop_requested_epoch)===i,c=d?s.stop_requested_at:e.requestedAt,u=ue(s.metadata),f=d?xf(s.metadata)??Yr({origin:e.origin,at:c,callerPid:e.callerPid,callerTaskId:e.callerTaskId},c):Yr({origin:e.origin,at:c,callerPid:e.callerPid,callerTaskId:e.callerTaskId},c);if(o.update(a).set({stop_requested_at:e.requestedAt,stop_requested_epoch:sql`${a.run_epoch}`,metadata:JSON.stringify({...u,stopRequest:f})}).where(and(eq(a.id,e.id),eq(a.status,"running"),Pd())).run().changes===0){let _=o.select({status:a.status,run_epoch:a.run_epoch,stop_requested_at:a.stop_requested_at,stop_requested_epoch:a.stop_requested_epoch}).from(a).where(eq(a.id,e.id)).limit(1).get();if(!_||_.status!=="running"){r={accepted:!1,status:_?.status??"not_running",runEpoch:Z(_?.run_epoch)};return}r={accepted:!1,status:_.status,runEpoch:Z(_.run_epoch),..._.stop_requested_at&&Z(_.stop_requested_epoch)===Z(_.run_epoch)?{alreadyRequestedAt:_.stop_requested_at}:{}};}else r={accepted:!0,status:s.status,runEpoch:i};let g=new Set([e.id]),m=(_,k)=>{if(k>=8)return;let T=o.select({id:a.id,status:a.status,metadata:a.metadata}).from(a).where(and(eq(a.parent_task_id,_),eq(a.status,"running"))).all();for(let S of T)g.has(S.id)||(g.add(S.id),o.update(a).set({stop_requested_at:c,stop_requested_epoch:sql`${a.run_epoch}`,metadata:JSON.stringify({...ue(S.metadata),stopRequest:f})}).where(and(eq(a.id,S.id),eq(a.status,"running"),Pd())).run(),m(S.id,k+1));};m(e.id,0);},{behavior:"immediate"}),r}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to request task stop",r)}finally{n.close();}}requestTaskStopForInstruction(e){if(!this.dbExists())return {accepted:false,status:"not_running",runEpoch:0};let n=this.openHandle(true);try{let r={accepted:!1,status:"not_running",runEpoch:0};return n.db.transaction(o=>{let s=o.select({id:a.id,status:a.status,run_epoch:a.run_epoch,workspace_id:a.workspace_id,stop_requested_at:a.stop_requested_at,stop_requested_epoch:a.stop_requested_epoch,metadata:a.metadata}).from(a).where(eq(a.id,e.id)).limit(1).get();if(!s)return;let i=Z(s.run_epoch),d=Z(e.sourceRunEpoch),c=Z(e.settleRunEpoch);if(s.status!=="running"||i!==c||e.workspaceId!==void 0&&s.workspace_id!==e.workspaceId){r={accepted:!1,status:s.status,runEpoch:i};return}let u=c===0?or$1(eq(a.run_epoch,0),isNull(a.run_epoch)):eq(a.run_epoch,c),f=or$1(isNull(a.stop_requested_at),isNull(a.stop_requested_epoch),ne(a.stop_requested_epoch,d)),p=Yr({origin:"instruction",at:e.requestedAt,callerPid:e.callerPid,callerTaskId:e.callerTaskId},e.requestedAt),g=T=>o.update(a).set({stop_requested_at:e.requestedAt,stop_requested_epoch:d,metadata:JSON.stringify({...ue(s.metadata),stopRequest:p})}).where(and(eq(a.id,e.id),eq(a.status,"running"),u,T,f)).run();if((e.workspaceId===void 0?g():e.workspaceId===null?g(isNull(a.workspace_id)):g(eq(a.workspace_id,e.workspaceId))).changes>0){r={accepted:!0,status:s.status,runEpoch:c};return}let _=o.select({status:a.status,run_epoch:a.run_epoch,stop_requested_at:a.stop_requested_at,stop_requested_epoch:a.stop_requested_epoch}).from(a).where(eq(a.id,e.id)).limit(1).get();if(!_||_.status!=="running"){r={accepted:!1,status:_?.status??"not_running",runEpoch:Z(_?.run_epoch)};return}let k=Z(_.run_epoch);r={accepted:!1,status:_.status,runEpoch:k,..._.stop_requested_at&&Z(_.stop_requested_epoch)===d?{alreadyRequestedAt:_.stop_requested_at}:{}};},{behavior:"immediate"}),r}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to request instruction task stop",r)}finally{n.close();}}finalizeTaskStop(e){if(!this.dbExists())return false;let n=this.openHandle(true);try{let r=e.completedAt??new Date(this.clock()).toISOString(),o=!1;return n.db.transaction(s=>{let i=s.select({status:a.status,run_epoch:a.run_epoch,stop_requested_at:a.stop_requested_at,stop_requested_epoch:a.stop_requested_epoch,started_at:a.started_at,duration_ms:a.duration_ms,metadata:a.metadata}).from(a).where(eq(a.id,e.id)).limit(1).get();if(!i||i.status!=="running"||Z(i.run_epoch)!==Z(e.runEpoch))return;let d=i.stop_requested_at!==null&&Z(i.stop_requested_epoch)===Z(e.runEpoch),c=ue(i.metadata),u=d?Ss(c,e.error):{error:e.error??null,metadata:e.terminalReason===void 0?{...c}:{...c,terminalReason:e.terminalReason}},f={...u.metadata,stopMethod:e.method},p=i.duration_ms??e.durationMs??Xr(i.started_at,r,void 0),g=i.run_epoch===null?isNull(a.run_epoch):eq(a.run_epoch,i.run_epoch);o=s.update(a).set({status:"stopped",error:u.error,completed_at:r,duration_ms:p,metadata:JSON.stringify(f)}).where(and(eq(a.id,e.id),eq(a.status,"running"),g)).run().changes>0;},{behavior:"immediate"}),o}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to finalize task stop",r)}finally{n.close();}}finalizeTaskForHostShutdown(e){if(!this.dbExists())return "not_running";let n=this.openHandle(true);try{let r=e.completedAt??new Date(this.clock()).toISOString(),o=Z(e.expectedRunEpoch),s="not_running";return n.db.transaction(i=>{let d=i.select({status:a.status,run_epoch:a.run_epoch,workspace_id:a.workspace_id,started_at:a.started_at,duration_ms:a.duration_ms,metadata:a.metadata}).from(a).where(eq(a.id,e.id)).limit(1).get();if(!d||d.status!=="running"){s="not_running";return}if(Z(d.run_epoch)!==o){s="epoch_mismatch";return}if(e.workspaceId!==void 0&&d.workspace_id!==e.workspaceId){s="workspace_mismatch";return}let u=d.run_epoch===null?isNull(a.run_epoch):eq(a.run_epoch,d.run_epoch),f=e.workspaceId===void 0?void 0:e.workspaceId===null?isNull(a.workspace_id):eq(a.workspace_id,e.workspaceId),p={...ue(d.metadata),terminalReason:"runner_lost"},g=d.duration_ms??Xr(d.started_at,r,void 0);s=i.update(a).set({status:"runner_lost",error:Ld,completed_at:r,duration_ms:g,metadata:JSON.stringify(p)}).where(and(eq(a.id,e.id),eq(a.status,"running"),u,f)).run().changes>0?"settled":"not_running";},{behavior:"immediate"}),s}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to finalize task for host shutdown",r)}finally{n.close();}}async stopTask(e,n={}){return ks(this,e,n)}async stopTaskGenerationForInstruction(e){return Od({requestTaskStop:n=>this.requestTaskStopForInstruction(n),getTask:n=>this.getTask(n),finalizeTaskStop:n=>this.finalizeTaskStop(n)},e)}startTask(e){let n=this.openHandle(true);try{let r={id:e.id,agent_id:e.agentId,prompt:e.prompt,mode:e.mode,status:e.status,started_at:e.startedAt,pid:e.pid??null,parent_task_id:e.parentTaskId??null,caller_agent_id:e.callerAgentId??null,trace_id:e.traceId??null,command:e.command??null,metadata:e.metadata??null,workspace_id:e.workspaceId??null,cwd:e.cwd??null,project_id:e.projectId??null,platform:e.platform??"cli",crewx_version:e.crewxVersion??null,thread_id:e.threadId??null,model:e.model??null,rendered_prompt:e.renderedPrompt??null,coding_agent_command:e.codingAgentCommand??null,log_storage:"events"},o=s=>{n.db.insert(a).values(s).onConflictDoUpdate({target:a.id,set:{status:sql`CASE WHEN ${a.status} = 'pending' AND ${a.pid} IS NULL THEN 'running' ELSE ${a.status} END`,pid:sql`COALESCE(excluded.pid, ${a.pid})`,command:sql`CASE WHEN ${a.status} = 'pending' AND ${a.pid} IS NULL THEN excluded.command ELSE ${a.command} END`,metadata:sql`CASE WHEN ${a.status} = 'pending' AND ${a.pid} IS NULL THEN excluded.metadata ELSE ${a.metadata} END`,workspace_id:sql`CASE WHEN ${a.status} = 'pending' AND ${a.pid} IS NULL THEN COALESCE(${a.workspace_id}, excluded.workspace_id) ELSE ${a.workspace_id} END`,cwd:sql`CASE WHEN ${a.status} = 'pending' AND ${a.pid} IS NULL THEN COALESCE(${a.cwd}, excluded.cwd) ELSE ${a.cwd} END`,project_id:sql`CASE WHEN ${a.status} = 'pending' AND ${a.pid} IS NULL THEN COALESCE(${a.project_id}, excluded.project_id) ELSE ${a.project_id} END`,crewx_version:sql`CASE WHEN ${a.status} = 'pending' AND ${a.pid} IS NULL THEN excluded.crewx_version ELSE ${a.crewx_version} END`,model:sql`CASE WHEN ${a.status} = 'pending' AND ${a.pid} IS NULL THEN excluded.model ELSE ${a.model} END`,rendered_prompt:sql`CASE WHEN ${a.status} = 'pending' AND ${a.pid} IS NULL THEN excluded.rendered_prompt ELSE ${a.rendered_prompt} END`,coding_agent_command:sql`CASE WHEN ${a.status} = 'pending' AND ${a.pid} IS NULL THEN excluded.coding_agent_command ELSE ${a.coding_agent_command} END`},setWhere:or$1(eq(a.status,"running"),and(eq(a.status,"pending"),isNull(a.pid)))}).run();};try{o(r);}catch(s){let i=s instanceof Error?s.message:typeof s=="object"&&s!==null&&"message"in s?String(s.message):String(s);if(!/log_storage|heartbeat_at|stop_requested_at|stop_requested_epoch|cwd/i.test(i)||!/no such column|no column named/i.test(i))throw s;let d=new Set(n.db.all("PRAGMA table_info(tasks)").map(T=>T.name)),c=d.has("cwd"),u=d.has("log_storage"),f=c?", cwd":"",p=c?", ?":"",g=c?", cwd = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN COALESCE(tasks.cwd, excluded.cwd) ELSE tasks.cwd END":"",m=u?", log_storage":"",_=u?", ?":"",k=u?`,
70
72
  log_storage = CASE WHEN tasks.status = 'pending' THEN excluded.log_storage ELSE tasks.log_storage END`:"";n.runRaw(`INSERT INTO tasks (
71
73
  id, agent_id, prompt, mode, status, started_at, pid,
72
74
  parent_task_id, caller_agent_id, trace_id, command, metadata,
73
75
  workspace_id${f}, project_id, platform, crewx_version, thread_id,
74
76
  model, rendered_prompt, coding_agent_command${m}
75
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?${p}${w})
77
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?${p}${_})
76
78
  ON CONFLICT(id) DO UPDATE SET
77
79
  status = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN 'running' ELSE tasks.status END,
78
80
  pid = COALESCE(excluded.pid, tasks.pid),
@@ -83,10 +85,10 @@ ${r.join(`
83
85
  crewx_version = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN excluded.crewx_version ELSE tasks.crewx_version END,
84
86
  model = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN excluded.model ELSE tasks.model END,
85
87
  rendered_prompt = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN excluded.rendered_prompt ELSE tasks.rendered_prompt END,
86
- coding_agent_command = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN excluded.coding_agent_command ELSE tasks.coding_agent_command END${_}
87
- WHERE tasks.status = 'running' OR (tasks.status = 'pending' AND tasks.pid IS NULL)`,[r.id,r.agent_id,r.prompt,r.mode,r.status,r.started_at,r.pid,r.parent_task_id,r.caller_agent_id,r.trace_id,r.command,r.metadata,r.workspace_id,...c?[r.cwd]:[],r.project_id,r.platform,r.crewx_version,r.thread_id,r.model,r.rendered_prompt,r.coding_agent_command,...u?[r.log_storage]:[]]);}}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to start task",r)}finally{n.close();}}updateTaskOwnership(e){if(!this.dbExists())return false;let n=this.openHandle(true);try{let r=n.db.select({status:a.status,run_epoch:a.run_epoch,metadata:a.metadata}).from(a).where(eq(a.id,e.id)).limit(1).get();if(!r||r.status!=="running"||Z(r.run_epoch)!==Z(e.runEpoch))return !1;let o=ce(r.metadata);o.ownership=e.ownership,e.ownership==="runner"&&e.providerPid!==void 0&&(o.providerPid=e.providerPid);let s=r.run_epoch===null?isNull(a.run_epoch):eq(a.run_epoch,r.run_epoch),i=n.db.update(a).set({metadata:JSON.stringify(o)}).where(and(eq(a.id,e.id),eq(a.status,"running"),s)).run();return i.changes>0&&Z(e.runEpoch)>0&&n.db.update(a).set({stop_requested_at:null,stop_requested_epoch:null}).where(and(eq(a.id,e.id),eq(a.status,"running"),s,sql`${a.stop_requested_at} IS NOT NULL
88
- AND COALESCE(${a.stop_requested_epoch}, 0) <> COALESCE(${a.run_epoch}, 0)`)).run(),i.changes>0}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to update task ownership",r)}finally{n.close();}}adoptPendingTask(e){let n=this.openHandle(true);try{return n.db.update(a).set({status:"running"}).where(and(eq(a.id,e),eq(a.status,"pending"),isNull(a.pid))).run().changes===1}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to adopt pending task",r)}finally{n.close();}}failPendingTask(e,n,r=new Date().toISOString()){let o=this.openHandle(true);try{return o.db.update(a).set({status:"failed",error:n,completed_at:r}).where(and(eq(a.id,e),eq(a.status,"pending"))).run().changes>0}catch(s){throw s instanceof l?s:new l("DB_ERROR","Failed to fail pending task",s)}finally{o.close();}}stopPendingTask(e,n,r=new Date().toISOString(),o={}){let s=this.openHandle(true);try{let i=!1;return s.db.transaction(d=>{let c=d.select({metadata:a.metadata}).from(a).where(and(eq(a.id,e),eq(a.status,"pending"))).limit(1).get();if(!c)return;let u=ws(ce(c.metadata),n),f={...u.metadata,stopMethod:"cooperative",stopRequest:Wr(o,r)};i=d.update(a).set({status:"stopped",error:u.error,completed_at:r,metadata:JSON.stringify(f)}).where(and(eq(a.id,e),eq(a.status,"pending"))).run().changes===1;},{behavior:"immediate"}),i}catch(i){throw i instanceof l?i:new l("DB_ERROR","Failed to stop pending task",i)}finally{s.close();}}listTasksByProjectId(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.select().from(a).where(eq(a.project_id,e)).orderBy(desc(a.started_at)).all().map(Xe)}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to list tasks by project",r)}finally{n.close();}}finishTask(e){let n=this.openHandle(true),r,o;try{n.db.transaction(s=>{let i=s.select({status:a.status,run_epoch:a.run_epoch,stop_requested_at:a.stop_requested_at,stop_requested_epoch:a.stop_requested_epoch,started_at:a.started_at,duration_ms:a.duration_ms,result:a.result,exit_code:a.exit_code,error:a.error,metadata:a.metadata,model:a.model,input_tokens:a.input_tokens,output_tokens:a.output_tokens,cached_input_tokens:a.cached_input_tokens,cost_usd:a.cost_usd}).from(a).where(eq(a.id,e.id)).limit(1).get();if(!i)return;let d=Z(i.run_epoch),c=Z(e.runEpoch),u=i.status==="running"&&d===c,f=i.stop_requested_at!==null&&Z(i.stop_requested_epoch)===d,p=u&&f,g=i.status==="stopped"&&d===c&&f,m=ce(i.metadata),w=gn(m[Kn])?m[Kn]:{},_=String(c),T=ff.has(i.status),S=T&&d===c&&!hn(i)&&!Object.prototype.hasOwnProperty.call(w,_),M=T&&d===c&&!Object.prototype.hasOwnProperty.call(w,_),Y=d>0||c>0||e.runEpoch!==void 0&&e.runEpoch!==null||d!==c,E={},x;if(i.status!=="running"&&(r=i.status,o=e.result?.trim()||e.error?.trim()||`task:end status=${e.status}`),Y&&(i.status==="running"||M)){x=ce(i.metadata);let O=gn(x[Ts])?{...x[Ts]}:{};O[String(c)]=Od(e),x[Ts]=O;let ue=_f(O),je=ue.inputTokens!==0||ue.outputTokens!==0||ue.cachedInputTokens!==0||ue.costUsd!==0;je&&m[Qe]==="unavailable"?x[Qe]="recorded":i.status!=="running"&&!je&&m[Qe]===void 0&&(x[Qe]="unavailable"),E.metadata=JSON.stringify(x),E.input_tokens=ue.inputTokens,E.output_tokens=ue.outputTokens,E.cached_input_tokens=ue.cachedInputTokens,E.cost_usd=ue.costUsd;}else if(u||S)if(u)E.input_tokens=ye(e.inputTokens??0),E.output_tokens=ye(e.outputTokens??0),E.cached_input_tokens=ye(e.cachedInputTokens??0),E.cost_usd=ye(e.costUsd??0);else {let O=Od(e),ue=O.inputTokens!==0||O.outputTokens!==0||O.cachedInputTokens!==0||O.costUsd!==0;ue&&(E.input_tokens=O.inputTokens,E.output_tokens=O.outputTokens,E.cached_input_tokens=O.cachedInputTokens,E.cost_usd=O.costUsd),x={...m};let je=gn(m[Kn])?{...m[Kn]}:{};je[_]={at:e.completedAt},x[Kn]=je,x[Qe]===void 0?x[Qe]=ue?"recorded":"unavailable":ue&&x[Qe]==="unavailable"&&(x[Qe]="recorded"),E.metadata=JSON.stringify(x);}if((u||S)&&e.model!==void 0&&e.model!==null&&(!S||i.model===null)&&(E.model=e.model),p){x??=ce(i.metadata);let O=ws(x,e.error);x={...O.metadata,...e.partialResultRecovered===!0?{partialResultRecovered:!0}:{},stopMethod:fs(i.stop_requested_at,e.completedAt)},E.status="stopped",E.result=e.result??i.result,E.error=O.error,E.completed_at=e.completedAt,E.duration_ms=i.duration_ms??e.durationMs??Kr(i.started_at,e.completedAt,void 0),E.exit_code=e.exitCode??i.exit_code,E.metadata=JSON.stringify(x);}else if(u)e.partialResultRecovered===!0&&(x??=ce(i.metadata),x.partialResultRecovered=!0,E.metadata=JSON.stringify(x)),E.status=e.status,E.result=e.result??null,E.error=e.error??null,E.completed_at=e.completedAt,E.duration_ms=d>0?Kr(i.started_at,e.completedAt,e.durationMs):e.durationMs??null,E.exit_code=e.exitCode??null;else if(g){let O=!1;i.result===null&&e.result!==void 0&&e.result!==null&&(E.result=e.result,O=!0),i.exit_code===null&&e.exitCode!==void 0&&e.exitCode!==null&&(E.exit_code=e.exitCode),e.partialResultRecovered===!0&&(x??=ce(i.metadata),x.partialResultRecovered=!0,E.metadata=JSON.stringify(x)),O&&(r=void 0,o=void 0);}Object.keys(E).length>0&&s.update(a).set(E).where(eq(a.id,e.id)).run();},{behavior:"immediate"});}catch(s){throw s instanceof l?s:new l("DB_ERROR","Failed to finish task",s)}finally{n.close();}if(r!==void 0){try{this.taskLogRepository.appendLog(e.id,{timestamp:e.completedAt,level:"late-result",message:o??`task:end status=${e.status}`});}catch(s){console.error(`[crewx] failed to preserve late task result for ${e.id}: ${s instanceof Error?s.message:String(s)}`);}process.stderr.write(`Task ${e.id} was already finalized (${r}); late result kept in task log
89
- `);}}updateTaskLifecycle(e){let n=this.openHandle(true);try{let r=and(eq(a.id,e.id),eq(a.workspace_id,e.workspaceId)),o={status:e.status,error:e.error,completed_at:e.completedAt,duration_ms:e.durationMs};if(e.terminalReason){let s=n.db.select({metadata:a.metadata}).from(a).where(r).limit(1).get(),i=ce(s?.metadata??null);i.terminalReason=e.terminalReason,o.metadata=JSON.stringify(i);}n.db.update(a).set(o).where(r).run();}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to update task lifecycle",r)}finally{n.close();}}appendLog(e,n){this.taskLogRepository.appendLog(e,n);}appendLogs(e,n){this.taskLogRepository.appendLogs(e,n);}readLogs(e){return this.taskLogRepository.readLogs(e)}readLogsTail(e,n){return this.taskLogRepository.readLogsTail(e,n)}getLogState(e){return this.taskLogRepository.getLogState(e)}getRunningTasks(){if(!this.dbExists())return [];let e=this.openHandle(false);try{return e.db.select().from(a).where(eq(a.status,"running")).orderBy(desc(a.started_at)).all().map(Xe)}catch(n){throw new l("DB_ERROR","Failed to get running tasks",n)}finally{e.close();}}getActiveTasks(){if(!this.dbExists())return [];let e=this.openHandle(false);try{return e.db.select().from(a).where(inArray(a.status,["pending","running"])).orderBy(desc(a.started_at)).all().map(Xe)}catch(n){throw new l("DB_ERROR","Failed to get active tasks",n)}finally{e.close();}}getAllTasks(){if(!this.dbExists())return [];let e=this.openHandle(false);try{return e.db.select().from(a).orderBy(desc(a.started_at)).limit(100).all().map(Xe)}catch(n){throw new l("DB_ERROR","Failed to get all tasks",n)}finally{e.close();}}getTask(e){if(!this.dbExists())return;let n=this.openHandle(false);try{let r=n.db.select().from(a).where(eq(a.id,e)).limit(1).get();return r?Xe(r):void 0}catch(r){throw new l("DB_ERROR","Failed to get task",r)}finally{n.close();}}async killTask(e){let n=await this.stopTask(e);return n.status==="stopped"?{status:"terminated",killed:n.method==="forced"||n.method==="cooperative",...n.pid?{pid:n.pid}:{}}:n.status==="not_running"?{status:"not_running",killed:false,...n.pid?{pid:n.pid}:{},...n.error?{error:n.error}:{}}:{status:"failed",killed:false,...n.pid?{pid:n.pid}:{},...n.error?{error:n.error}:{}}}reapOrphanedTasks(e={}){if(!this.dbExists())return 0;let n=this.openHandle(true);try{let r=n.db.select({id:a.id,status:a.status,pid:a.pid,platform:a.platform,run_epoch:a.run_epoch,heartbeat_at:a.heartbeat_at,started_at:a.started_at,metadata:a.metadata,model:a.model,input_tokens:a.input_tokens,output_tokens:a.output_tokens,cached_input_tokens:a.cached_input_tokens,cost_usd:a.cost_usd}).from(a).where(or$1(eq(a.status,"running"),eq(a.status,"pending"))).all(),o=this.clock(),s=Math.max(1,Math.trunc(e.tickIntervalMs??Rs)),i=this.lastReaperTickAt,d=i===void 0?Number.POSITIVE_INFINITY:o-i,c=i!==void 0&&d>=0&&d<=s*2;this.lastReaperTickAt=o;let u=Bt(),f=jn(),p=new Date(o-xd).toISOString(),g=new Date(o).toISOString(),m=new Set,w=0,_=(T,S)=>{let M=ce(Vr(T.metadata,"runner_lost")),Y=typeof M.provider=="string"?M.provider:void 0,E;try{E=$r({taskLogRepository:this.taskLogRepository,taskId:T.id,provider:Y,model:T.model})?.usage;}catch{}let x={status:"runner_lost",error:S,completed_at:g};E?(x.input_tokens=E.inputTokens,x.output_tokens=E.outputTokens,x.cached_input_tokens=E.cachedInputTokens,x.cost_usd=E.costUsd,T.model===null&&E.model!==null&&(x.model=E.model),M[Qe]="recorded"):!hn(T)&&M[Qe]!=="recorded"&&(M[Qe]="unavailable"),x.metadata=JSON.stringify(M);let O=T.run_epoch===null?isNull(a.run_epoch):eq(a.run_epoch,T.run_epoch),ue=T.heartbeat_at===null?isNull(a.heartbeat_at):eq(a.heartbeat_at,T.heartbeat_at),je=n.db.update(a).set(x).where(and(eq(a.id,T.id),eq(a.status,"running"),O,ue)).run();return je.changes>0&&w++,je.changes>0};for(let T of r){if(T.status==="pending"){if(T.pid!==null||T.started_at>=p)continue;let E=Vr(T.metadata,"launch_failed");n.db.update(a).set({status:"failed",error:"Reaped: runner never adopted task (pending timeout)",completed_at:g,metadata:E}).where(and(eq(a.id,T.id),eq(a.status,"pending"),isNull(a.pid),lt(a.started_at,p))).run().changes>0&&w++;continue}if(lf.has(T.platform??"cli"))continue;if(T.pid===null){let E=`${T.id}:${T.run_epoch??0}`;m.add(E);let x=this.pidNullObservedSince.get(E);if(x===void 0){this.pidNullObservedSince.set(E,o);continue}o-x>=Es&&_(T,"Reaped: pid never recorded after resume (stale running_instruction)")&&this.pidNullObservedSince.delete(E);continue}if(T.heartbeat_at===null){Ht(T.pid)==="not_found"&&_(T,"Reaped: process not found (orphaned task)");continue}let S=Date.parse(T.heartbeat_at),M=Number.isFinite(S)?o-S:Number.POSITIVE_INFINITY;if(M<=u)continue;Ht(T.pid)==="not_found"?_(T,"Reaped: process not found (orphaned task)"):M>f&&c&&_(T,"Reaped: heartbeat stale beyond hard limit (orphaned task)");}for(let T of Array.from(this.pidNullObservedSince.keys()))m.has(T)||this.pidNullObservedSince.delete(T);return w}finally{n.close();}}reapRunningWorkflowTasks(e=Es){if(!this.dbExists())return 0;let n=this.openHandle(true);try{let r=new Date(Date.now()-e).toISOString(),o=and(eq(a.status,"running"),eq(a.platform,"workflow"),isNull(a.pid),lt(a.started_at,r),or$1(isNull(a.metadata),and(notLike(a.metadata,'%"kind":"workflow_card"%'),notLike(a.metadata,'%"kind":"workflow_ui_instance"%')))),s=n.db.select({id:a.id,metadata:a.metadata}).from(a).where(o).all(),i=new Date().toISOString(),d=0;for(let c of s){let u=ce(c.metadata);u.terminalReason="runner_lost";let f=n.db.update(a).set({status:"runner_lost",error:"Reaped: stale workflow run (finally not executed)",completed_at:i,metadata:JSON.stringify(u)}).where(and(eq(a.id,c.id),eq(a.status,"running"))).run();d+=f.changes??0;}return d}finally{n.close();}}findTaskStatus(e,n){let r=this.resolveDbPaths();for(let o of r){if(!existsSync(o))continue;let s=P(o);try{let i=n?eq(a.workspace_id,n):void 0,d=i?and(eq(a.id,e),i):eq(a.id,e),c=s.db.select().from(a).where(d).limit(1).get()??void 0;if(!c){let u=i?and(eq(a.thread_id,e),i):eq(a.thread_id,e);c=s.db.select().from(a).where(u).orderBy(desc(a.started_at)).limit(1).get()??void 0;}if(c)return Xe(c)}catch(i){throw new l("DB_ERROR","Failed to find task status",i)}finally{s.close();}}}findChildTasks(e,n){let r=this.resolveDbPaths(),o=new Set,s=[];for(let i of r){if(!existsSync(i))continue;let d=P(i);try{let c=n?and(eq(a.parent_task_id,e),eq(a.workspace_id,n)):eq(a.parent_task_id,e),u=d.db.select().from(a).where(c).orderBy(asc(a.started_at)).all();for(let f of u)o.has(f.id)||(o.add(f.id),s.push(Xe(f)));}catch(c){throw new l("DB_ERROR","Failed to find child tasks",c)}finally{d.close();}}return s}getWorkspaceUsageSummary(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.all(e?sql`
88
+ coding_agent_command = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN excluded.coding_agent_command ELSE tasks.coding_agent_command END${k}
89
+ WHERE tasks.status = 'running' OR (tasks.status = 'pending' AND tasks.pid IS NULL)`,[r.id,r.agent_id,r.prompt,r.mode,r.status,r.started_at,r.pid,r.parent_task_id,r.caller_agent_id,r.trace_id,r.command,r.metadata,r.workspace_id,...c?[r.cwd]:[],r.project_id,r.platform,r.crewx_version,r.thread_id,r.model,r.rendered_prompt,r.coding_agent_command,...u?[r.log_storage]:[]]);}}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to start task",r)}finally{n.close();}}updateTaskOwnership(e){if(!this.dbExists())return false;let n=this.openHandle(true);try{let r=n.db.select({status:a.status,run_epoch:a.run_epoch,metadata:a.metadata}).from(a).where(eq(a.id,e.id)).limit(1).get();if(!r||r.status!=="running"||Z(r.run_epoch)!==Z(e.runEpoch))return !1;let o=ue(r.metadata);o.ownership=e.ownership,e.ownership==="runner"&&e.providerPid!==void 0&&(o.providerPid=e.providerPid);let s=r.run_epoch===null?isNull(a.run_epoch):eq(a.run_epoch,r.run_epoch),i=n.db.update(a).set({metadata:JSON.stringify(o)}).where(and(eq(a.id,e.id),eq(a.status,"running"),s)).run();return i.changes>0&&Z(e.runEpoch)>0&&n.db.update(a).set({stop_requested_at:null,stop_requested_epoch:null}).where(and(eq(a.id,e.id),eq(a.status,"running"),s,sql`${a.stop_requested_at} IS NOT NULL
90
+ AND COALESCE(${a.stop_requested_epoch}, 0) <> COALESCE(${a.run_epoch}, 0)`)).run(),i.changes>0}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to update task ownership",r)}finally{n.close();}}adoptPendingTask(e){let n=this.openHandle(true);try{return n.db.update(a).set({status:"running"}).where(and(eq(a.id,e),eq(a.status,"pending"),isNull(a.pid))).run().changes===1}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to adopt pending task",r)}finally{n.close();}}failPendingTask(e,n,r=new Date().toISOString()){let o=this.openHandle(true);try{return o.db.update(a).set({status:"failed",error:n,completed_at:r}).where(and(eq(a.id,e),eq(a.status,"pending"))).run().changes>0}catch(s){throw s instanceof l?s:new l("DB_ERROR","Failed to fail pending task",s)}finally{o.close();}}stopPendingTask(e,n,r=new Date().toISOString(),o={}){let s=this.openHandle(true);try{let i=!1;return s.db.transaction(d=>{let c=d.select({metadata:a.metadata}).from(a).where(and(eq(a.id,e),eq(a.status,"pending"))).limit(1).get();if(!c)return;let u=Ss(ue(c.metadata),n),f={...u.metadata,stopMethod:"cooperative",stopRequest:Yr(o,r)};i=d.update(a).set({status:"stopped",error:u.error,completed_at:r,metadata:JSON.stringify(f)}).where(and(eq(a.id,e),eq(a.status,"pending"))).run().changes===1;},{behavior:"immediate"}),i}catch(i){throw i instanceof l?i:new l("DB_ERROR","Failed to stop pending task",i)}finally{s.close();}}listTasksByProjectId(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.select().from(a).where(eq(a.project_id,e)).orderBy(desc(a.started_at)).all().map(Qe)}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to list tasks by project",r)}finally{n.close();}}finishTask(e){let n=this.openHandle(true),r,o;try{n.db.transaction(s=>{let i=s.select({status:a.status,run_epoch:a.run_epoch,stop_requested_at:a.stop_requested_at,stop_requested_epoch:a.stop_requested_epoch,started_at:a.started_at,duration_ms:a.duration_ms,result:a.result,exit_code:a.exit_code,error:a.error,metadata:a.metadata,model:a.model,input_tokens:a.input_tokens,output_tokens:a.output_tokens,cached_input_tokens:a.cached_input_tokens,cost_usd:a.cost_usd}).from(a).where(eq(a.id,e.id)).limit(1).get();if(!i)return;let d=Z(i.run_epoch),c=Z(e.runEpoch),u=i.status==="running"&&d===c,f=i.stop_requested_at!==null&&Z(i.stop_requested_epoch)===d,p=u&&f,g=i.status==="stopped"&&d===c&&f,m=ue(i.metadata),_=_n(m[Jn])?m[Jn]:{},k=String(c),T=Of.has(i.status),S=T&&d===c&&!kn(i)&&!Object.prototype.hasOwnProperty.call(_,k),D=T&&d===c&&!Object.prototype.hasOwnProperty.call(_,k),U=d>0||c>0||e.runEpoch!==void 0&&e.runEpoch!==null||d!==c,R={},O;if(i.status!=="running"&&(r=i.status,o=e.result?.trim()||e.error?.trim()||`task:end status=${e.status}`),U&&(i.status==="running"||D)){O=ue(i.metadata);let N=_n(O[Es])?{...O[Es]}:{};N[String(c)]=Dd(e),O[Es]=N;let le=Pf(N),je=le.inputTokens!==0||le.outputTokens!==0||le.cachedInputTokens!==0||le.costUsd!==0;je&&m[Ze]==="unavailable"?O[Ze]="recorded":i.status!=="running"&&!je&&m[Ze]===void 0&&(O[Ze]="unavailable"),R.metadata=JSON.stringify(O),R.input_tokens=le.inputTokens,R.output_tokens=le.outputTokens,R.cached_input_tokens=le.cachedInputTokens,R.cost_usd=le.costUsd;}else if(u||S)if(u)R.input_tokens=ye(e.inputTokens??0),R.output_tokens=ye(e.outputTokens??0),R.cached_input_tokens=ye(e.cachedInputTokens??0),R.cost_usd=ye(e.costUsd??0);else {let N=Dd(e),le=N.inputTokens!==0||N.outputTokens!==0||N.cachedInputTokens!==0||N.costUsd!==0;le&&(R.input_tokens=N.inputTokens,R.output_tokens=N.outputTokens,R.cached_input_tokens=N.cachedInputTokens,R.cost_usd=N.costUsd),O={...m};let je=_n(m[Jn])?{...m[Jn]}:{};je[k]={at:e.completedAt},O[Jn]=je,O[Ze]===void 0?O[Ze]=le?"recorded":"unavailable":le&&O[Ze]==="unavailable"&&(O[Ze]="recorded"),R.metadata=JSON.stringify(O);}if((u||S)&&e.model!==void 0&&e.model!==null&&(!S||i.model===null)&&(R.model=e.model),p){O??=ue(i.metadata);let N=Ss(O,e.error);O={...N.metadata,...e.partialResultRecovered===!0?{partialResultRecovered:!0}:{},stopMethod:ms(i.stop_requested_at,e.completedAt)},R.status="stopped",R.result=e.result??i.result,R.error=N.error,R.completed_at=e.completedAt,R.duration_ms=i.duration_ms??e.durationMs??Xr(i.started_at,e.completedAt,void 0),R.exit_code=e.exitCode??i.exit_code,R.metadata=JSON.stringify(O);}else if(u)e.partialResultRecovered===!0&&(O??=ue(i.metadata),O.partialResultRecovered=!0,R.metadata=JSON.stringify(O)),R.status=e.status,R.result=e.result??null,R.error=e.error??null,R.completed_at=e.completedAt,R.duration_ms=d>0?Xr(i.started_at,e.completedAt,e.durationMs):e.durationMs??null,R.exit_code=e.exitCode??null;else if(g){let N=!1;i.result===null&&e.result!==void 0&&e.result!==null&&(R.result=e.result,N=!0),i.exit_code===null&&e.exitCode!==void 0&&e.exitCode!==null&&(R.exit_code=e.exitCode),e.partialResultRecovered===!0&&(O??=ue(i.metadata),O.partialResultRecovered=!0,R.metadata=JSON.stringify(O)),N&&(r=void 0,o=void 0);}Object.keys(R).length>0&&s.update(a).set(R).where(eq(a.id,e.id)).run();},{behavior:"immediate"});}catch(s){throw s instanceof l?s:new l("DB_ERROR","Failed to finish task",s)}finally{n.close();}if(r!==void 0){try{this.taskLogRepository.appendLog(e.id,{timestamp:e.completedAt,level:"late-result",message:o??`task:end status=${e.status}`});}catch(s){console.error(`[crewx] failed to preserve late task result for ${e.id}: ${s instanceof Error?s.message:String(s)}`);}process.stderr.write(`Task ${e.id} was already finalized (${r}); late result kept in task log
91
+ `);}}updateTaskLifecycle(e){let n=this.openHandle(true);try{let r=and(eq(a.id,e.id),eq(a.workspace_id,e.workspaceId)),o={status:e.status,error:e.error,completed_at:e.completedAt,duration_ms:e.durationMs};if(e.terminalReason){let s=n.db.select({metadata:a.metadata}).from(a).where(r).limit(1).get(),i=ue(s?.metadata??null);i.terminalReason=e.terminalReason,o.metadata=JSON.stringify(i);}n.db.update(a).set(o).where(r).run();}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to update task lifecycle",r)}finally{n.close();}}appendLog(e,n){this.taskLogRepository.appendLog(e,n);}appendLogs(e,n){this.taskLogRepository.appendLogs(e,n);}readLogs(e){return this.taskLogRepository.readLogs(e)}readLogsTail(e,n){return this.taskLogRepository.readLogsTail(e,n)}getLogState(e){return this.taskLogRepository.getLogState(e)}getRunningTasks(){if(!this.dbExists())return [];let e=this.openHandle(false);try{return e.db.select().from(a).where(eq(a.status,"running")).orderBy(desc(a.started_at)).all().map(Qe)}catch(n){throw new l("DB_ERROR","Failed to get running tasks",n)}finally{e.close();}}getActiveTasks(){if(!this.dbExists())return [];let e=this.openHandle(false);try{return e.db.select().from(a).where(inArray(a.status,["pending","running"])).orderBy(desc(a.started_at)).all().map(Qe)}catch(n){throw new l("DB_ERROR","Failed to get active tasks",n)}finally{e.close();}}getAllTasks(){if(!this.dbExists())return [];let e=this.openHandle(false);try{return e.db.select().from(a).orderBy(desc(a.started_at)).limit(100).all().map(Qe)}catch(n){throw new l("DB_ERROR","Failed to get all tasks",n)}finally{e.close();}}getTask(e){if(!this.dbExists())return;let n=this.openHandle(false);try{let r=n.db.select().from(a).where(eq(a.id,e)).limit(1).get();return r?Qe(r):void 0}catch(r){throw new l("DB_ERROR","Failed to get task",r)}finally{n.close();}}async killTask(e){let n=await this.stopTask(e);return n.status==="stopped"?{status:"terminated",killed:n.method==="forced"||n.method==="cooperative",...n.pid?{pid:n.pid}:{}}:n.status==="not_running"?{status:"not_running",killed:false,...n.pid?{pid:n.pid}:{},...n.error?{error:n.error}:{}}:{status:"failed",killed:false,...n.pid?{pid:n.pid}:{},...n.error?{error:n.error}:{}}}reapOrphanedTasks(e={}){if(!this.dbExists())return 0;let n=this.openHandle(true);try{let r=n.db.select({id:a.id,status:a.status,pid:a.pid,platform:a.platform,run_epoch:a.run_epoch,heartbeat_at:a.heartbeat_at,started_at:a.started_at,metadata:a.metadata,model:a.model,input_tokens:a.input_tokens,output_tokens:a.output_tokens,cached_input_tokens:a.cached_input_tokens,cost_usd:a.cost_usd}).from(a).where(or$1(eq(a.status,"running"),eq(a.status,"pending"))).all(),o=this.clock(),s=Math.max(1,Math.trunc(e.tickIntervalMs??vs)),i=this.lastReaperTickAt,d=i===void 0?Number.POSITIVE_INFINITY:o-i,c=i!==void 0&&d>=0&&d<=s*2;this.lastReaperTickAt=o;let u=Ft(),f=zn(),p=new Date(o-Hd).toISOString(),g=new Date(o).toISOString(),m=new Set,_=0,k=(T,S)=>{let D=ue(Qr(T.metadata,"runner_lost")),U=typeof D.provider=="string"?D.provider:void 0,R;try{R=jr({taskLogRepository:this.taskLogRepository,taskId:T.id,provider:U,model:T.model})?.usage;}catch{}let O={status:"runner_lost",error:S,completed_at:g};R?(O.input_tokens=R.inputTokens,O.output_tokens=R.outputTokens,O.cached_input_tokens=R.cachedInputTokens,O.cost_usd=R.costUsd,T.model===null&&R.model!==null&&(O.model=R.model),D[Ze]="recorded"):!kn(T)&&D[Ze]!=="recorded"&&(D[Ze]="unavailable"),O.metadata=JSON.stringify(D);let N=T.run_epoch===null?isNull(a.run_epoch):eq(a.run_epoch,T.run_epoch),le=T.heartbeat_at===null?isNull(a.heartbeat_at):eq(a.heartbeat_at,T.heartbeat_at),je=n.db.update(a).set(O).where(and(eq(a.id,T.id),eq(a.status,"running"),N,le)).run();return je.changes>0&&_++,je.changes>0};for(let T of r){if(T.status==="pending"){if(T.pid!==null||T.started_at>=p)continue;let R=Qr(T.metadata,"launch_failed");n.db.update(a).set({status:"failed",error:"Reaped: runner never adopted task (pending timeout)",completed_at:g,metadata:R}).where(and(eq(a.id,T.id),eq(a.status,"pending"),isNull(a.pid),lt$1(a.started_at,p))).run().changes>0&&_++;continue}if(vf.has(T.platform??"cli"))continue;if(T.pid===null){let R=`${T.id}:${T.run_epoch??0}`;m.add(R);let O=this.pidNullObservedSince.get(R);if(O===void 0){this.pidNullObservedSince.set(R,o);continue}o-O>=Is&&k(T,"Reaped: pid never recorded after resume (stale running_instruction)")&&this.pidNullObservedSince.delete(R);continue}if(T.heartbeat_at===null){Lt(T.pid)==="not_found"&&k(T,"Reaped: process not found (orphaned task)");continue}let S=Date.parse(T.heartbeat_at),D=Number.isFinite(S)?o-S:Number.POSITIVE_INFINITY;if(D<=u)continue;Lt(T.pid)==="not_found"?k(T,"Reaped: process not found (orphaned task)"):D>f&&c&&k(T,"Reaped: heartbeat stale beyond hard limit (orphaned task)");}for(let T of Array.from(this.pidNullObservedSince.keys()))m.has(T)||this.pidNullObservedSince.delete(T);return _}finally{n.close();}}reapRunningWorkflowTasks(e=Is){if(!this.dbExists())return 0;let n=this.openHandle(true);try{let r=new Date(Date.now()-e).toISOString(),o=and(eq(a.status,"running"),eq(a.platform,"workflow"),isNull(a.pid),lt$1(a.started_at,r),or$1(isNull(a.metadata),and(notLike(a.metadata,'%"kind":"workflow_card"%'),notLike(a.metadata,'%"kind":"workflow_ui_instance"%')))),s=n.db.select({id:a.id,metadata:a.metadata}).from(a).where(o).all(),i=new Date().toISOString(),d=0;for(let c of s){let u=ue(c.metadata);u.terminalReason="runner_lost";let f=n.db.update(a).set({status:"runner_lost",error:"Reaped: stale workflow run (finally not executed)",completed_at:i,metadata:JSON.stringify(u)}).where(and(eq(a.id,c.id),eq(a.status,"running"))).run();d+=f.changes??0;}return d}finally{n.close();}}findTaskStatus(e,n){let r=this.resolveDbPaths();for(let o of r){if(!existsSync(o))continue;let s=P(o);try{let i=n?eq(a.workspace_id,n):void 0,d=i?and(eq(a.id,e),i):eq(a.id,e),c=s.db.select().from(a).where(d).limit(1).get()??void 0;if(!c){let u=i?and(eq(a.thread_id,e),i):eq(a.thread_id,e);c=s.db.select().from(a).where(u).orderBy(desc(a.started_at)).limit(1).get()??void 0;}if(c)return Qe(c)}catch(i){throw new l("DB_ERROR","Failed to find task status",i)}finally{s.close();}}}findChildTasks(e,n){let r=this.resolveDbPaths(),o=new Set,s=[];for(let i of r){if(!existsSync(i))continue;let d=P(i);try{let c=n?and(eq(a.parent_task_id,e),eq(a.workspace_id,n)):eq(a.parent_task_id,e),u=d.db.select().from(a).where(c).orderBy(asc(a.started_at)).all();for(let f of u)o.has(f.id)||(o.add(f.id),s.push(Qe(f)));}catch(c){throw new l("DB_ERROR","Failed to find child tasks",c)}finally{d.close();}}return s}getWorkspaceUsageSummary(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.all(e?sql`
90
92
  SELECT
91
93
  COALESCE(workspace_id, 'unknown') AS workspace_id,
92
94
  COALESCE(SUM(input_tokens), 0) AS input_tokens,
@@ -107,94 +109,33 @@ ${r.join(`
107
109
  FROM tasks
108
110
  GROUP BY workspace_id
109
111
  ORDER BY (COALESCE(SUM(input_tokens), 0) + COALESCE(SUM(output_tokens), 0)) DESC
110
- `)}catch(r){throw new l("DB_ERROR","Failed to get workspace usage summary",r)}finally{n.close();}}getThreadTokenUsage(e,n){let r=this.resolveDbPaths(),o=new Set,s=0,i=0,d=0;for(let c of r){if(!existsSync(c))continue;let u=P(c);try{let f=eq(a.thread_id,e),p=n?and(f,eq(a.workspace_id,n)):f,g=u.db.select({id:a.id,input_tokens:a.input_tokens,output_tokens:a.output_tokens,cost_usd:a.cost_usd}).from(a).where(p).all();for(let m of g)o.has(m.id)||(o.add(m.id),s+=m.input_tokens??0,i+=m.output_tokens??0,d+=m.cost_usd??0);}catch(f){throw new l("DB_ERROR","Failed to get thread token usage",f)}finally{u.close();}}return {inputTokens:s,outputTokens:i,costUsd:d}}findTasksByThread(e,n,r){let o=this.resolveDbPaths(),s=new Set,i=[],d=r?.projection==="activity-log";for(let c of o){if(!existsSync(c))continue;let u=P(c);try{let f=eq(a.thread_id,e),p=n?and(f,eq(a.workspace_id,n)):f,g=d?u.db.select({id:a.id,thread_id:a.thread_id,agent_id:a.agent_id,parent_task_id:a.parent_task_id,started_at:a.started_at,completed_at:a.completed_at}).from(a).where(p).orderBy(asc(a.started_at)).all():u.db.select().from(a).where(p).orderBy(asc(a.started_at)).all().map(Xe);for(let m of g)s.has(m.id)||(s.add(m.id),i.push(m));}catch(f){throw new l("DB_ERROR","Failed to find tasks by thread",f)}finally{u.close();}}return i}parseWorkflowCardMetadata(e){if(!e)return {};try{let n=JSON.parse(e);return {kind:typeof n.kind=="string"?n.kind:void 0,workflowRunId:typeof n.workflowRunId=="string"?n.workflowRunId:void 0}}catch{return {}}}extractThreadIdFromCommand(e){return e?/--thread=(\S+)/.exec(e)?.[1]??null:null}findRunningWorkflowParentTasks(){if(!this.dbExists())return [];let e=[];for(let n of this.resolveDbPaths()){if(!existsSync(n))continue;let r=P(n);try{e.push(...r.db.select({id:a.id,agent_id:a.agent_id,thread_id:a.thread_id,workspace_id:a.workspace_id,platform:a.platform,status:a.status,error:a.error,completed_at:a.completed_at,duration_ms:a.duration_ms,started_at:a.started_at,metadata:a.metadata}).from(a).where(and(eq(a.platform,"workflow"),or$1(like(a.metadata,'%"kind":"workflow_card"%'),like(a.metadata,'%"kind":"workflow_ui_instance"%')))).orderBy(desc(a.started_at)).all().map(bd));}catch(o){throw new l("DB_ERROR","Failed to find workflow parent tasks",o)}finally{r.close();}}return e}findWorkflowParentTask(e){if(this.dbExists())for(let n of this.resolveDbPaths()){if(!existsSync(n))continue;let r=P(n);try{let o=r.db.select({id:a.id,agent_id:a.agent_id,thread_id:a.thread_id,workspace_id:a.workspace_id,platform:a.platform,status:a.status,error:a.error,completed_at:a.completed_at,duration_ms:a.duration_ms,started_at:a.started_at,metadata:a.metadata}).from(a).where(and(eq(a.platform,"workflow"),eq(a.workspace_id,e.workspaceId))).orderBy(desc(a.started_at),desc(a.id)).all();for(let s of o){let i=this.parseWorkflowCardMetadata(s.metadata);if(i.kind===e.kind&&i.workflowRunId===e.workflowRunId)return bd(s)}}catch(o){throw new l("DB_ERROR","Failed to find workflow parent task",o)}finally{r.close();}}}batchFetchWorkflowCards(e,n){let r=new Map;if(e.length===0)return r;let o=new Set(e),s=new Map,i=n?eq(a.workspace_id,n):void 0,d=(c,u)=>{if(!c)return;let f=s.get(c);if(f&&u.started_at<=f)return;let p=this.parseWorkflowCardMetadata(u.metadata);p.kind!=="workflow_card"&&p.kind!=="workflow_ui_instance"||(s.set(c,u.started_at),r.set(c,{taskId:u.id,workflowRunId:p.workflowRunId,raw:u.result??void 0}));};for(let c of this.resolveDbPaths()){if(!existsSync(c))continue;let u=P(c);try{let f=and(inArray(a.thread_id,e),or$1(like(a.metadata,'%"kind":"workflow_card"%'),like(a.metadata,'%"kind":"workflow_ui_instance"%'))),p=u.db.select({id:a.id,thread_id:a.thread_id,metadata:a.metadata,result:a.result,started_at:a.started_at}).from(a).where(i?and(f,i):f).all();for(let w of p)d(w.thread_id,w);let g=and(isNull(a.thread_id),or$1(like(a.metadata,'%"kind":"workflow_card"%'),like(a.metadata,'%"kind":"workflow_ui_instance"%'))),m=u.db.select({id:a.id,command:a.command,metadata:a.metadata,result:a.result,started_at:a.started_at}).from(a).where(i?and(g,i):g).all();for(let w of m){let _=this.extractThreadIdFromCommand(w.command);!_||!o.has(_)||d(_,w);}}catch(f){throw new l("DB_ERROR","Failed to batch fetch workflow cards",f)}finally{u.close();}}return r}findAllTasks(e){if(!this.dbExists())return {rows:[],total:0};let n=this.openHandle(false);try{let r=[];e.workspaceId&&r.push(eq(a.workspace_id,e.workspaceId));let o=e.agents&&e.agents.length>0?e.agents:e.agentId?[e.agentId]:null;o&&r.push(inArray(a.agent_id,o));let s=e.statuses&&e.statuses.length>0?e.statuses:e.status?[e.status]:null;s&&r.push(inArray(a.status,s));let i=e.q??e.search;i&&r.push(like(a.prompt,`%${i}%`)),e.from&&r.push(gte(a.started_at,e.from)),e.to&&r.push(lt(a.started_at,e.to));let d=r.length>0?and(...r):void 0,c=n.db.select({count:sql`count(*)`}).from(a).where(d).get(),u=(e.sortDir??"DESC")==="ASC"?asc(a.started_at):desc(a.started_at);return {rows:n.db.select().from(a).where(d).orderBy(u).limit(e.limit).offset(e.offset).all().map(Xe),total:c?.count??0}}catch(r){throw new l("DB_ERROR","Failed to find all tasks",r)}finally{n.close();}}getAgentUsage(e,n,r){if(!this.dbExists())return [];let o=this.openHandle(false);try{let s=Vn(sql.raw("t.status")),i=Gr(sql.raw("t.metadata"));return o.db.all(r?sql`
111
- SELECT
112
- t.agent_id,
113
- t.workspace_id,
114
- COUNT(*) AS total_tasks,
115
- ${i} AS unavailable_task_count,
116
- COALESCE(SUM(
117
- COALESCE(t.input_tokens, 0)
118
- + CASE
119
- WHEN t.started_at >= ${wt}
120
- AND (
121
- t.crewx_version IS NULL
122
- OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
123
- OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${yt}) AS INTEGER) < ${Et})
124
- )
125
- THEN COALESCE(t.cached_input_tokens, 0)
126
- ELSE 0
127
- END
128
- ), 0) AS input_tokens,
129
- COALESCE(SUM(t.output_tokens), 0) AS output_tokens,
130
- COALESCE(SUM(t.cached_input_tokens), 0) AS cached_input_tokens,
131
- COALESCE(SUM(t.cost_usd), 0) AS cost_usd
132
- FROM tasks t
133
- WHERE ${s}
134
- AND t.started_at >= ${e}
135
- AND t.started_at < ${n}
136
- AND t.workspace_id = ${r}
137
- GROUP BY t.agent_id, t.workspace_id
138
- ORDER BY (
139
- COALESCE(SUM(
140
- COALESCE(t.input_tokens, 0)
141
- + CASE
142
- WHEN t.started_at >= ${wt}
143
- AND (
144
- t.crewx_version IS NULL
145
- OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
146
- OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${yt}) AS INTEGER) < ${Et})
147
- )
148
- THEN COALESCE(t.cached_input_tokens, 0)
149
- ELSE 0
150
- END
151
- ), 0)
152
- + COALESCE(SUM(t.output_tokens), 0)
153
- ) DESC
154
- `:sql`
155
- SELECT
156
- t.agent_id,
157
- t.workspace_id,
158
- COUNT(*) AS total_tasks,
159
- ${i} AS unavailable_task_count,
160
- COALESCE(SUM(
161
- COALESCE(t.input_tokens, 0)
162
- + CASE
163
- WHEN t.started_at >= ${wt}
164
- AND (
165
- t.crewx_version IS NULL
166
- OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
167
- OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${yt}) AS INTEGER) < ${Et})
168
- )
169
- THEN COALESCE(t.cached_input_tokens, 0)
170
- ELSE 0
171
- END
172
- ), 0) AS input_tokens,
173
- COALESCE(SUM(t.output_tokens), 0) AS output_tokens,
174
- COALESCE(SUM(t.cached_input_tokens), 0) AS cached_input_tokens,
175
- COALESCE(SUM(t.cost_usd), 0) AS cost_usd
176
- FROM tasks t
177
- WHERE ${s}
178
- AND t.started_at >= ${e}
179
- AND t.started_at < ${n}
180
- GROUP BY t.agent_id, t.workspace_id
181
- ORDER BY (
182
- COALESCE(SUM(
183
- COALESCE(t.input_tokens, 0)
184
- + CASE
185
- WHEN t.started_at >= ${wt}
186
- AND (
187
- t.crewx_version IS NULL
188
- OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
189
- OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${yt}) AS INTEGER) < ${Et})
190
- )
191
- THEN COALESCE(t.cached_input_tokens, 0)
192
- ELSE 0
193
- END
194
- ), 0)
195
- + COALESCE(SUM(t.output_tokens), 0)
196
- ) DESC
197
- `).map(c=>({agentId:c.agent_id,workspaceId:c.workspace_id??null,totalTasks:c.total_tasks,unavailableTaskCount:c.unavailable_task_count,inputTokens:c.input_tokens,outputTokens:c.output_tokens,cachedInputTokens:c.cached_input_tokens,costUsd:c.cost_usd,totalTokens:c.input_tokens+c.output_tokens}))}catch(s){throw new l("DB_ERROR","Failed to get agent usage",s)}finally{o.close();}}getAgentUsageTrendRaw(e,n,r){if(!this.dbExists())return [];let o=this.openHandle(false);try{let s=Vn(sql.raw("t.status")),i=Gr(sql.raw("t.metadata"));return o.db.all(r?sql`
112
+ `)}catch(r){throw new l("DB_ERROR","Failed to get workspace usage summary",r)}finally{n.close();}}getThreadTokenUsage(e,n){let r=this.resolveDbPaths(),o=new Set,s=0,i=0,d=0;for(let c of r){if(!existsSync(c))continue;let u=P(c);try{let f=eq(a.thread_id,e),p=n?and(f,eq(a.workspace_id,n)):f,g=u.db.select({id:a.id,input_tokens:a.input_tokens,output_tokens:a.output_tokens,cost_usd:a.cost_usd}).from(a).where(p).all();for(let m of g)o.has(m.id)||(o.add(m.id),s+=m.input_tokens??0,i+=m.output_tokens??0,d+=m.cost_usd??0);}catch(f){throw new l("DB_ERROR","Failed to get thread token usage",f)}finally{u.close();}}return {inputTokens:s,outputTokens:i,costUsd:d}}findTasksByThread(e,n,r){let o=this.resolveDbPaths(),s=new Set,i=[],d=r?.projection==="activity-log";for(let c of o){if(!existsSync(c))continue;let u=P(c);try{let f=eq(a.thread_id,e),p=n?and(f,eq(a.workspace_id,n)):f,g=d?u.db.select({id:a.id,thread_id:a.thread_id,agent_id:a.agent_id,parent_task_id:a.parent_task_id,started_at:a.started_at,completed_at:a.completed_at}).from(a).where(p).orderBy(asc(a.started_at)).all():u.db.select().from(a).where(p).orderBy(asc(a.started_at)).all().map(Qe);for(let m of g)s.has(m.id)||(s.add(m.id),i.push(m));}catch(f){throw new l("DB_ERROR","Failed to find tasks by thread",f)}finally{u.close();}}return i}parseWorkflowCardMetadata(e){if(!e)return {};try{let n=JSON.parse(e);return {kind:typeof n.kind=="string"?n.kind:void 0,workflowRunId:typeof n.workflowRunId=="string"?n.workflowRunId:void 0}}catch{return {}}}extractThreadIdFromCommand(e){return e?/--thread=(\S+)/.exec(e)?.[1]??null:null}findRunningWorkflowParentTasks(){if(!this.dbExists())return [];let e=[];for(let n of this.resolveDbPaths()){if(!existsSync(n))continue;let r=P(n);try{e.push(...r.db.select({id:a.id,agent_id:a.agent_id,thread_id:a.thread_id,workspace_id:a.workspace_id,platform:a.platform,status:a.status,error:a.error,completed_at:a.completed_at,duration_ms:a.duration_ms,started_at:a.started_at,metadata:a.metadata}).from(a).where(and(eq(a.platform,"workflow"),or$1(like(a.metadata,'%"kind":"workflow_card"%'),like(a.metadata,'%"kind":"workflow_ui_instance"%')))).orderBy(desc(a.started_at)).all().map(xd));}catch(o){throw new l("DB_ERROR","Failed to find workflow parent tasks",o)}finally{r.close();}}return e}findWorkflowParentTask(e){if(this.dbExists())for(let n of this.resolveDbPaths()){if(!existsSync(n))continue;let r=P(n);try{let o=r.db.select({id:a.id,agent_id:a.agent_id,thread_id:a.thread_id,workspace_id:a.workspace_id,platform:a.platform,status:a.status,error:a.error,completed_at:a.completed_at,duration_ms:a.duration_ms,started_at:a.started_at,metadata:a.metadata}).from(a).where(and(eq(a.platform,"workflow"),eq(a.workspace_id,e.workspaceId))).orderBy(desc(a.started_at),desc(a.id)).all();for(let s of o){let i=this.parseWorkflowCardMetadata(s.metadata);if(i.kind===e.kind&&i.workflowRunId===e.workflowRunId)return xd(s)}}catch(o){throw new l("DB_ERROR","Failed to find workflow parent task",o)}finally{r.close();}}}batchFetchWorkflowCards(e,n){let r=new Map;if(e.length===0)return r;let o=new Set(e),s=new Map,i=n?eq(a.workspace_id,n):void 0,d=(c,u)=>{if(!c)return;let f=s.get(c);if(f&&u.started_at<=f)return;let p=this.parseWorkflowCardMetadata(u.metadata);p.kind!=="workflow_card"&&p.kind!=="workflow_ui_instance"||(s.set(c,u.started_at),r.set(c,{taskId:u.id,workflowRunId:p.workflowRunId,raw:u.result??void 0}));};for(let c of this.resolveDbPaths()){if(!existsSync(c))continue;let u=P(c);try{let f=and(inArray(a.thread_id,e),or$1(like(a.metadata,'%"kind":"workflow_card"%'),like(a.metadata,'%"kind":"workflow_ui_instance"%'))),p=u.db.select({id:a.id,thread_id:a.thread_id,metadata:a.metadata,result:a.result,started_at:a.started_at}).from(a).where(i?and(f,i):f).all();for(let _ of p)d(_.thread_id,_);let g=and(isNull(a.thread_id),or$1(like(a.metadata,'%"kind":"workflow_card"%'),like(a.metadata,'%"kind":"workflow_ui_instance"%'))),m=u.db.select({id:a.id,command:a.command,metadata:a.metadata,result:a.result,started_at:a.started_at}).from(a).where(i?and(g,i):g).all();for(let _ of m){let k=this.extractThreadIdFromCommand(_.command);!k||!o.has(k)||d(k,_);}}catch(f){throw new l("DB_ERROR","Failed to batch fetch workflow cards",f)}finally{u.close();}}return r}findAllTasks(e){if(!this.dbExists())return {rows:[],total:0};let n=this.openHandle(false);try{let r=[];e.workspaceId&&r.push(eq(a.workspace_id,e.workspaceId));let o=e.agents&&e.agents.length>0?e.agents:e.agentId?[e.agentId]:null;o&&r.push(inArray(a.agent_id,o));let s=e.statuses&&e.statuses.length>0?e.statuses:e.status?[e.status]:null;s&&r.push(inArray(a.status,s));let i=e.q??e.search;i&&r.push(like(a.prompt,`%${i}%`)),e.from&&r.push(gte(a.started_at,e.from)),e.to&&r.push(lt$1(a.started_at,e.to));let d=r.length>0?and(...r):void 0,c=n.db.select({count:sql`count(*)`}).from(a).where(d).get(),u=(e.sortDir??"DESC")==="ASC"?asc(a.started_at):desc(a.started_at);return {rows:n.db.select().from(a).where(d).orderBy(u).limit(e.limit).offset(e.offset).all().map(Qe),total:c?.count??0}}catch(r){throw new l("DB_ERROR","Failed to find all tasks",r)}finally{n.close();}}getAgentUsage(e,n,r){if(!this.dbExists())return [];let o=this.openHandle(false);try{let s=Rs(sql.raw("t.model"),sql.raw("t.metadata")),i=Yn(sql.raw("t.status")),d=Jr(sql.raw("t.metadata")),c=sql`
113
+ COALESCE(t.input_tokens, 0)
114
+ + CASE
115
+ WHEN t.started_at >= ${gn}
116
+ AND (
117
+ t.crewx_version IS NULL
118
+ OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
119
+ OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${hn}) AS INTEGER) < ${mn})
120
+ )
121
+ THEN COALESCE(t.cached_input_tokens, 0)
122
+ ELSE 0
123
+ END
124
+ `,u=r?sql`WHERE ${i} AND t.started_at >= ${e} AND t.started_at < ${n} AND t.workspace_id = ${r}`:sql`WHERE ${i} AND t.started_at >= ${e} AND t.started_at < ${n}`,f=o.db.all(sql`
125
+ SELECT
126
+ t.agent_id,
127
+ t.workspace_id,
128
+ ${s} AS provider,
129
+ COUNT(*) AS total_tasks,
130
+ ${d} AS unavailable_task_count,
131
+ COALESCE(SUM(${c}), 0) AS input_tokens,
132
+ COALESCE(SUM(t.output_tokens), 0) AS output_tokens,
133
+ COALESCE(SUM(t.cached_input_tokens), 0) AS cached_input_tokens,
134
+ COALESCE(SUM(t.cost_usd), 0) AS cost_usd
135
+ FROM tasks t
136
+ ${u}
137
+ GROUP BY t.agent_id, t.workspace_id, ${s}
138
+ `),p=new Map;for(let _ of f){let k=typeof _.provider=="string"&&_.provider.trim()!==""?_.provider:"unknown",T={provider:k,inputTokens:_.input_tokens,outputTokens:_.output_tokens,cachedInputTokens:_.cached_input_tokens,totalTokens:_.input_tokens+_.output_tokens,costUsd:_.cost_usd,totalTasks:_.total_tasks,unavailableTaskCount:_.unavailable_task_count},S=_.workspace_id??null,D=JSON.stringify([_.agent_id,S]),U=p.get(D);if(!U){p.set(D,{agentId:_.agent_id,workspaceId:S,totalTasks:_.total_tasks,unavailableTaskCount:_.unavailable_task_count,inputTokens:_.input_tokens,outputTokens:_.output_tokens,cachedInputTokens:_.cached_input_tokens,costUsd:_.cost_usd,totalTokens:_.input_tokens+_.output_tokens,providers:[T]});continue}U.totalTasks+=_.total_tasks,U.unavailableTaskCount=(U.unavailableTaskCount??0)+_.unavailable_task_count,U.inputTokens+=_.input_tokens,U.outputTokens+=_.output_tokens,U.cachedInputTokens+=_.cached_input_tokens,U.costUsd+=_.cost_usd,U.totalTokens+=_.input_tokens+_.output_tokens;let R=U.providers.find(O=>O.provider===k);R?(R.inputTokens+=T.inputTokens,R.outputTokens+=T.outputTokens,R.cachedInputTokens+=T.cachedInputTokens,R.totalTokens+=T.totalTokens,R.costUsd+=T.costUsd,R.totalTasks+=T.totalTasks,R.unavailableTaskCount+=T.unavailableTaskCount):U.providers.push(T);}let g=[...p.values()];for(let _ of g)_.providers.sort((k,T)=>k.provider===T.provider?0:k.provider==="unknown"?1:T.provider==="unknown"?-1:k.totalTokens!==T.totalTokens?T.totalTokens-k.totalTokens:k.provider<T.provider?-1:1);let m=(_,k)=>_===k?0:_<k?-1:1;return g.sort((_,k)=>{if(_.totalTokens!==k.totalTokens)return k.totalTokens-_.totalTokens;let T=m(_.agentId,k.agentId);return T!==0?T:_.workspaceId===k.workspaceId?0:_.workspaceId===null?1:k.workspaceId===null?-1:m(_.workspaceId,k.workspaceId)}),g}catch(s){throw new l("DB_ERROR","Failed to get agent usage",s)}finally{o.close();}}getAgentUsageTrendRaw(e,n,r){if(!this.dbExists())return [];let o=this.openHandle(false);try{let s=Yn(sql.raw("t.status")),i=Jr(sql.raw("t.metadata"));return o.db.all(r?sql`
198
139
  SELECT
199
140
  date(t.started_at) AS date,
200
141
  t.agent_id,
@@ -202,11 +143,11 @@ ${r.join(`
202
143
  COALESCE(SUM(
203
144
  COALESCE(t.input_tokens, 0)
204
145
  + CASE
205
- WHEN t.started_at >= ${wt}
146
+ WHEN t.started_at >= ${gn}
206
147
  AND (
207
148
  t.crewx_version IS NULL
208
149
  OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
209
- OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${yt}) AS INTEGER) < ${Et})
150
+ OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${hn}) AS INTEGER) < ${mn})
210
151
  )
211
152
  THEN COALESCE(t.cached_input_tokens, 0)
212
153
  ELSE 0
@@ -230,11 +171,11 @@ ${r.join(`
230
171
  COALESCE(SUM(
231
172
  COALESCE(t.input_tokens, 0)
232
173
  + CASE
233
- WHEN t.started_at >= ${wt}
174
+ WHEN t.started_at >= ${gn}
234
175
  AND (
235
176
  t.crewx_version IS NULL
236
177
  OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
237
- OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${yt}) AS INTEGER) < ${Et})
178
+ OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${hn}) AS INTEGER) < ${mn})
238
179
  )
239
180
  THEN COALESCE(t.cached_input_tokens, 0)
240
181
  ELSE 0
@@ -249,14 +190,14 @@ ${r.join(`
249
190
  AND t.started_at < ${n}
250
191
  GROUP BY date(t.started_at), t.agent_id
251
192
  ORDER BY date(t.started_at) ASC
252
- `).map(c=>({date:c.date,agentId:c.agent_id,unavailableTaskCount:c.unavailable_task_count,inputTokens:c.input_tokens,outputTokens:c.output_tokens,cachedInputTokens:c.cached_input_tokens,costUsd:c.cost_usd,totalTokens:c.input_tokens+c.output_tokens}))}catch(s){throw new l("DB_ERROR","Failed to get agent usage trend",s)}finally{o.close();}}findTaskForStop(e,n){if(!this.dbExists())return;let r=this.openHandle(false);try{let o=r.db.select().from(a).where(and(eq(a.id,e),eq(a.workspace_id,n))).limit(1).get();return o?Xe(o):void 0}catch(o){throw new l("DB_ERROR","Failed to find task for stop",o)}finally{r.close();}}findLatestTaskByMetadata(e){if(!this.dbExists())return null;let n=this.openHandle(false);try{return n.db.select({id:a.id,thread_id:a.thread_id,status:a.status,result:a.result,error:a.error,started_at:a.started_at,completed_at:a.completed_at,metadata:a.metadata}).from(a).where(and(eq(a.agent_id,e.agentId),eq(a.workspace_id,e.workspaceId),sql`${a.metadata} IS NOT NULL AND json_valid(${a.metadata}) AND json_extract(${a.metadata}, '$.' || ${e.metaKey}) = ${e.metaValue}`)).orderBy(desc(a.started_at)).limit(1).get()??null}catch(r){throw new l("DB_ERROR","Failed to find latest task by metadata",r)}finally{n.close();}}markTaskFailed(e,n,r,o="failed",s){if(!this.dbExists())return;let i=this.openHandle(true);try{let d=new Date().toISOString(),c=r?and(eq(a.id,e),eq(a.status,"running"),eq(a.workspace_id,r)):and(eq(a.id,e),eq(a.status,"running")),u=i.db.select({metadata:a.metadata}).from(a).where(c).limit(1).get();if(!u)return;let f={status:o,error:n,completed_at:d};if(s){let p=ce(u.metadata);p.terminalReason=s,f.metadata=JSON.stringify(p);}i.db.update(a).set(f).where(c).run();}catch(d){throw d instanceof l?d:new l("DB_ERROR","Failed to mark task failed",d)}finally{i.close();}}findTasksByPromptHint(e,n){let r=this.resolveDbPaths(),o=new Set,s=[];for(let i of r){if(!existsSync(i))continue;let d=P(i);try{let c=n?and(like(a.prompt,`%${e}%`),eq(a.workspace_id,n)):like(a.prompt,`%${e}%`),u=d.db.select().from(a).where(c).orderBy(asc(a.started_at)).all();for(let f of u)o.has(f.id)||(o.add(f.id),s.push(Xe(f)));}catch(c){throw new l("DB_ERROR","Failed to find tasks by prompt hint",c)}finally{d.close();}}return s}getProviderUsage(e,n,r){if(!this.dbExists())return [];let o=this.openHandle(false);try{let s=Id(),i=Vn(a.status),d=Gr(a.metadata),c=sql`
193
+ `).map(c=>({date:c.date,agentId:c.agent_id,unavailableTaskCount:c.unavailable_task_count,inputTokens:c.input_tokens,outputTokens:c.output_tokens,cachedInputTokens:c.cached_input_tokens,costUsd:c.cost_usd,totalTokens:c.input_tokens+c.output_tokens}))}catch(s){throw new l("DB_ERROR","Failed to get agent usage trend",s)}finally{o.close();}}findTaskForStop(e,n){if(!this.dbExists())return;let r=this.openHandle(false);try{let o=r.db.select().from(a).where(and(eq(a.id,e),eq(a.workspace_id,n))).limit(1).get();return o?Qe(o):void 0}catch(o){throw new l("DB_ERROR","Failed to find task for stop",o)}finally{r.close();}}findLatestTaskByMetadata(e){if(!this.dbExists())return null;let n=this.openHandle(false);try{return n.db.select({id:a.id,thread_id:a.thread_id,status:a.status,result:a.result,error:a.error,started_at:a.started_at,completed_at:a.completed_at,metadata:a.metadata}).from(a).where(and(eq(a.agent_id,e.agentId),eq(a.workspace_id,e.workspaceId),sql`${a.metadata} IS NOT NULL AND json_valid(${a.metadata}) AND json_extract(${a.metadata}, '$.' || ${e.metaKey}) = ${e.metaValue}`)).orderBy(desc(a.started_at)).limit(1).get()??null}catch(r){throw new l("DB_ERROR","Failed to find latest task by metadata",r)}finally{n.close();}}markTaskFailed(e,n,r,o="failed",s){if(!this.dbExists())return;let i=this.openHandle(true);try{let d=new Date().toISOString(),c=r?and(eq(a.id,e),eq(a.status,"running"),eq(a.workspace_id,r)):and(eq(a.id,e),eq(a.status,"running")),u=i.db.select({metadata:a.metadata}).from(a).where(c).limit(1).get();if(!u)return;let f={status:o,error:n,completed_at:d};if(s){let p=ue(u.metadata);p.terminalReason=s,f.metadata=JSON.stringify(p);}i.db.update(a).set(f).where(c).run();}catch(d){throw d instanceof l?d:new l("DB_ERROR","Failed to mark task failed",d)}finally{i.close();}}findTasksByPromptHint(e,n){let r=this.resolveDbPaths(),o=new Set,s=[];for(let i of r){if(!existsSync(i))continue;let d=P(i);try{let c=n?and(like(a.prompt,`%${e}%`),eq(a.workspace_id,n)):like(a.prompt,`%${e}%`),u=d.db.select().from(a).where(c).orderBy(asc(a.started_at)).all();for(let f of u)o.has(f.id)||(o.add(f.id),s.push(Qe(f)));}catch(c){throw new l("DB_ERROR","Failed to find tasks by prompt hint",c)}finally{d.close();}}return s}getProviderUsage(e,n,r){if(!this.dbExists())return [];let o=this.openHandle(false);try{let s=Rs(),i=Yn(a.status),d=Jr(a.metadata),c=sql`
253
194
  COALESCE(${a.input_tokens}, 0)
254
195
  + CASE
255
- WHEN ${a.started_at} >= ${wt}
196
+ WHEN ${a.started_at} >= ${gn}
256
197
  AND (
257
198
  ${a.crewx_version} IS NULL
258
199
  OR (${a.crewx_version} LIKE '0.8.%' AND ${a.crewx_version} NOT LIKE '0.8.9%')
259
- OR (${a.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${a.crewx_version}, ${yt}) AS INTEGER) < ${Et})
200
+ OR (${a.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${a.crewx_version}, ${hn}) AS INTEGER) < ${mn})
260
201
  )
261
202
  THEN COALESCE(${a.cached_input_tokens}, 0)
262
203
  ELSE 0
@@ -276,14 +217,14 @@ ${r.join(`
276
217
  ${u}
277
218
  GROUP BY ${s}
278
219
  ORDER BY (COALESCE(SUM(${c}), 0) + COALESCE(SUM(${a.output_tokens}), 0)) DESC
279
- `).map(p=>({provider:p.provider,totalTasks:p.total_tasks,unavailableTaskCount:p.unavailable_task_count,inputTokens:p.input_tokens,outputTokens:p.output_tokens,cachedInputTokens:p.cached_input_tokens,costUsd:p.cost_usd,totalTokens:p.input_tokens+p.output_tokens,activeDurationMs:p.active_duration_ms??0,lastActiveAt:p.last_active_at??null}))}catch(s){throw new l("DB_ERROR","Failed to get provider usage",s)}finally{o.close();}}getModelUsage(e,n,r){if(!this.dbExists())return [];let o=this.openHandle(false);try{let s=Id(),i=Vn(a.status),d=Gr(a.metadata),c=sql`
220
+ `).map(p=>({provider:p.provider,totalTasks:p.total_tasks,unavailableTaskCount:p.unavailable_task_count,inputTokens:p.input_tokens,outputTokens:p.output_tokens,cachedInputTokens:p.cached_input_tokens,costUsd:p.cost_usd,totalTokens:p.input_tokens+p.output_tokens,activeDurationMs:p.active_duration_ms??0,lastActiveAt:p.last_active_at??null}))}catch(s){throw new l("DB_ERROR","Failed to get provider usage",s)}finally{o.close();}}getModelUsage(e,n,r){if(!this.dbExists())return [];let o=this.openHandle(false);try{let s=Rs(),i=Yn(a.status),d=Jr(a.metadata),c=sql`
280
221
  COALESCE(${a.input_tokens}, 0)
281
222
  + CASE
282
- WHEN ${a.started_at} >= ${wt}
223
+ WHEN ${a.started_at} >= ${gn}
283
224
  AND (
284
225
  ${a.crewx_version} IS NULL
285
226
  OR (${a.crewx_version} LIKE '0.8.%' AND ${a.crewx_version} NOT LIKE '0.8.9%')
286
- OR (${a.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${a.crewx_version}, ${yt}) AS INTEGER) < ${Et})
227
+ OR (${a.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${a.crewx_version}, ${hn}) AS INTEGER) < ${mn})
287
228
  )
288
229
  THEN COALESCE(${a.cached_input_tokens}, 0)
289
230
  ELSE 0
@@ -303,7 +244,7 @@ ${r.join(`
303
244
  FROM ${a}
304
245
  ${u}
305
246
  GROUP BY ${a.model}, ${s}
306
- `),p=new Map;for(let g of f){let m=No(g.model??""),w=JSON.stringify([g.provider,m]),_=p.get(w);_?(_.totalTasks+=g.total_tasks,_.unavailableTaskCount=(_.unavailableTaskCount??0)+g.unavailable_task_count,_.inputTokens+=g.input_tokens,_.outputTokens+=g.output_tokens,_.cachedInputTokens+=g.cached_input_tokens,_.costUsd+=g.cost_usd,_.totalTokens+=g.input_tokens+g.output_tokens,_.activeDurationMs+=g.active_duration_ms??0,g.last_active_at&&(!_.lastActiveAt||g.last_active_at>_.lastActiveAt)&&(_.lastActiveAt=g.last_active_at)):p.set(w,{model:m,provider:g.provider,totalTasks:g.total_tasks,unavailableTaskCount:g.unavailable_task_count,inputTokens:g.input_tokens,outputTokens:g.output_tokens,cachedInputTokens:g.cached_input_tokens,costUsd:g.cost_usd,totalTokens:g.input_tokens+g.output_tokens,activeDurationMs:g.active_duration_ms??0,lastActiveAt:g.last_active_at??null});}return Array.from(p.values()).sort((g,m)=>m.costUsd-g.costUsd)}catch(s){throw new l("DB_ERROR","Failed to get model usage",s)}finally{o.close();}}getTasksForReport(e,n,r){if(!this.dbExists())return [];let o=this.openHandle(false);try{let s=r?sql`WHERE ${a.started_at} >= ${e} AND ${a.started_at} < ${n} AND ${a.workspace_id} = ${r}`:sql`WHERE ${a.started_at} >= ${e} AND ${a.started_at} < ${n}`;return o.db.all(sql`
247
+ `),p=new Map;for(let g of f){let m=Lo(g.model??""),_=JSON.stringify([g.provider,m]),k=p.get(_);k?(k.totalTasks+=g.total_tasks,k.unavailableTaskCount=(k.unavailableTaskCount??0)+g.unavailable_task_count,k.inputTokens+=g.input_tokens,k.outputTokens+=g.output_tokens,k.cachedInputTokens+=g.cached_input_tokens,k.costUsd+=g.cost_usd,k.totalTokens+=g.input_tokens+g.output_tokens,k.activeDurationMs+=g.active_duration_ms??0,g.last_active_at&&(!k.lastActiveAt||g.last_active_at>k.lastActiveAt)&&(k.lastActiveAt=g.last_active_at)):p.set(_,{model:m,provider:g.provider,totalTasks:g.total_tasks,unavailableTaskCount:g.unavailable_task_count,inputTokens:g.input_tokens,outputTokens:g.output_tokens,cachedInputTokens:g.cached_input_tokens,costUsd:g.cost_usd,totalTokens:g.input_tokens+g.output_tokens,activeDurationMs:g.active_duration_ms??0,lastActiveAt:g.last_active_at??null});}return Array.from(p.values()).sort((g,m)=>m.costUsd-g.costUsd)}catch(s){throw new l("DB_ERROR","Failed to get model usage",s)}finally{o.close();}}getTasksForReport(e,n,r){if(!this.dbExists())return [];let o=this.openHandle(false);try{let s=r?sql`WHERE ${a.started_at} >= ${e} AND ${a.started_at} < ${n} AND ${a.workspace_id} = ${r}`:sql`WHERE ${a.started_at} >= ${e} AND ${a.started_at} < ${n}`;return o.db.all(sql`
307
248
  SELECT
308
249
  ${a.thread_id} AS thread_id,
309
250
  ${a.agent_id} AS agent_id,
@@ -317,16 +258,16 @@ ${r.join(`
317
258
  `).map(d=>({threadId:d.thread_id,agentId:d.agent_id,startedAt:d.started_at,status:d.status,error:d.error,exitCode:d.exit_code}))}catch(s){throw new l("DB_ERROR","Failed to get tasks for report",s)}finally{o.close();}}getDelegationMatrix(e,n,r){if(!this.dbExists())return {edges:[],truncated:false};let o=this.openHandle(false);try{let s=sql`
318
259
  COALESCE(${a.input_tokens}, 0)
319
260
  + CASE
320
- WHEN ${a.started_at} >= ${wt}
261
+ WHEN ${a.started_at} >= ${gn}
321
262
  AND (
322
263
  ${a.crewx_version} IS NULL
323
264
  OR (${a.crewx_version} LIKE '0.8.%' AND ${a.crewx_version} NOT LIKE '0.8.9%')
324
- OR (${a.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${a.crewx_version}, ${yt}) AS INTEGER) < ${Et})
265
+ OR (${a.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${a.crewx_version}, ${hn}) AS INTEGER) < ${mn})
325
266
  )
326
267
  THEN COALESCE(${a.cached_input_tokens}, 0)
327
268
  ELSE 0
328
269
  END
329
- `,i=Vn(a.status),d=r?sql`WHERE ${i} AND ${a.started_at} >= ${e} AND ${a.started_at} < ${n} AND ${a.workspace_id} = ${r}`:sql`WHERE ${i} AND ${a.started_at} >= ${e} AND ${a.started_at} < ${n}`,c=o.db.all(sql`
270
+ `,i=Yn(a.status),d=r?sql`WHERE ${i} AND ${a.started_at} >= ${e} AND ${a.started_at} < ${n} AND ${a.workspace_id} = ${r}`:sql`WHERE ${i} AND ${a.started_at} >= ${e} AND ${a.started_at} < ${n}`,c=o.db.all(sql`
330
271
  SELECT
331
272
  ${a.caller_agent_id} AS caller_agent_id,
332
273
  ${a.agent_id} AS agent_id,
@@ -337,41 +278,41 @@ ${r.join(`
337
278
  ${d}
338
279
  GROUP BY ${a.caller_agent_id}, ${a.agent_id}
339
280
  ORDER BY task_count DESC, ${a.caller_agent_id} ASC, ${a.agent_id} ASC
340
- LIMIT ${ks+1}
341
- `),u=c.length>ks;return {edges:c.slice(0,ks).map(p=>({callerAgentId:p.caller_agent_id??null,agentId:p.agent_id,taskCount:p.task_count,totalTokens:p.input_tokens+p.output_tokens,outputTokens:p.output_tokens})),truncated:u}}catch(s){throw new l("DB_ERROR","Failed to get delegation matrix",s)}finally{o.close();}}findTaskEvidence(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{let r=[];e.workspaceId&&r.push(eq(a.workspace_id,e.workspaceId)),e.agents&&e.agents.length>0&&r.push(inArray(a.agent_id,e.agents)),e.statuses&&e.statuses.length>0&&r.push(inArray(a.status,e.statuses)),e.from&&r.push(gte(a.started_at,e.from)),e.to&&r.push(lt(a.started_at,e.to));let o=r.length>0?and(...r):void 0,s=(e.order??"DESC")==="ASC"?asc(a.started_at):desc(a.started_at),i={id:a.id,agent_id:a.agent_id,status:a.status,prompt:a.prompt,started_at:a.started_at,completed_at:a.completed_at,thread_id:a.thread_id,error:a.error,metadata:a.metadata};return (e.limit?n.db.select(i).from(a).where(o).orderBy(s).limit(e.limit).all():n.db.select(i).from(a).where(o).orderBy(s).all()).map(({error:c,metadata:u,...f})=>({...f,status:Nt({status:f.status,error:c,metadata:u})}))}catch(r){throw new l("DB_ERROR","Failed to find task evidence",r)}finally{n.close();}}findThreadChains(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{let r=e.maxThreads??8,o=e.maxTurnsPerThread??4,s=[isNotNull(a.thread_id),isNull(a.parent_task_id),isNull(a.caller_agent_id),or$1(isNull(a.platform),ne(a.platform,"workflow")),or$1(isNull(a.metadata),and(notLike(a.metadata,'%"kind":"workflow_card"%'),notLike(a.metadata,'%"kind":"workflow_ui_instance"%'))),or$1(isNull(a.metadata),notLike(a.metadata,'%"retriedFromTaskId"%'))];e.workspaceId&&s.push(eq(a.workspace_id,e.workspaceId)),e.from&&s.push(gte(a.started_at,e.from)),e.to&&s.push(lt(a.started_at,e.to));let i=n.db.select({id:a.id,agent_id:a.agent_id,status:a.status,prompt:a.prompt,started_at:a.started_at,completed_at:a.completed_at,thread_id:a.thread_id}).from(a).where(and(...s)).orderBy(asc(a.started_at),asc(a.id)).all(),d=new Map;for(let u of i){if(!u.thread_id)continue;let f={id:u.id,agentId:u.agent_id,status:u.status,prompt:u.prompt,startedAt:u.started_at,completedAt:u.completed_at},p=d.get(u.thread_id);p?p.push(f):d.set(u.thread_id,[f]);}let c=[];for(let[u,f]of d){let p=f.filter(g=>g.agentId===e.targetAgentId).length;p<2||c.push({threadId:u,targetAgentTurnCount:p,turns:f});}return c.sort((u,f)=>{let p=u.turns[u.turns.length-1].startedAt,g=f.turns[f.turns.length-1].startedAt;return p<g?1:p>g?-1:0}),c.slice(0,r).map(u=>({threadId:u.threadId,targetAgentTurnCount:u.targetAgentTurnCount,turns:u.turns.slice(-o)}))}catch(r){throw new l("DB_ERROR","Failed to find thread chains",r)}finally{n.close();}}};});h();oe();le();h();oe();pe();ae();le();de();ko();var ee=class extends l{reason;constructor(e,n="VALIDATION",r=e,o){super(n,r,o),this.name="CommonCodeRepositoryError",this.reason=e;}},$i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function Qu(){let t=randomBytes(16),e="";for(let n of t)e+=$i[n%$i.length];return e.slice(0,12)}function wo(){return `c_${Qu()}`}function Zu(t){return typeof t=="string"&&kr.includes(t)}function el(t){return typeof t=="string"&&Tr.includes(t)}function Zt(t){if(!Zu(t))throw new ee("COMMON_CODE_GROUP_INVALID","VALIDATION",`Unsupported common-code group: ${t}`)}function qi(t){if(!el(t))throw new ee("COMMON_CODE_COLOR_INVALID","VALIDATION",`Unsupported common-code color: ${t}`)}function Fi(t){let e=typeof t=="string"?t.trim():"",n=[...e].length;if(n<1||n>20)throw new ee("COMMON_CODE_NAME_INVALID","VALIDATION","Common-code names must contain 1 to 20 Unicode characters");return e}function en(t){if(typeof t!="string"||t.trim().length===0)throw new ee("COMMON_CODE_WORKSPACE_INVALID","VALIDATION","Workspace id is required for a user common code")}function Rr(t){if(typeof t!="string"||t.trim().length===0)throw new ee("COMMON_CODE_CODE_INVALID","VALIDATION","Common-code code is required")}function At(t,e){return and(eq(I.code_group,t),or$1(isNull(I.workspace_id),eq(I.workspace_id,e)))}var yo=class extends F{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath??super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(!e&&!existsSync(n))throw new l("NOT_FOUND","Database not found");e&&mkdirSync(dirname(n),{recursive:true});let r=P(n);if(e)try{K(r.db,n);}catch(o){throw r.close(),o}return r}listSelectable(e,n){if(Zt(e),en(n),!this.dbExists())return [];let r=this.openHandle(false);try{return r.db.select().from(I).where(and(At(e,n),eq(I.is_archived,0))).orderBy(asc(I.sort_order),asc(I.code)).all()}catch(o){throw new l("DB_ERROR","Failed to list selectable common codes",o)}finally{r.close();}}listForHistory(e,n){if(Zt(e),en(n),!this.dbExists())return [];let r=this.openHandle(false);try{return r.db.select().from(I).where(At(e,n)).orderBy(asc(I.sort_order),asc(I.code)).all()}catch(o){throw new l("DB_ERROR","Failed to list common-code history",o)}finally{r.close();}}reorder(e){let n=e.group;if(Zt(n),en(e.workspaceId),!Array.isArray(e.codes)||e.codes.length===0)throw new ee("COMMON_CODE_REORDER_INVALID","VALIDATION","At least one common-code code is required for reordering");for(let o of e.codes)Rr(o);if(new Set(e.codes).size!==e.codes.length)throw new ee("COMMON_CODE_REORDER_INVALID","VALIDATION","Common-code reorder entries must be unique");if(!this.dbExists())throw new ee("COMMON_CODE_REORDER_INVALID","VALIDATION","Common-code reorder scope does not exist");let r=this.openHandle(true);try{return r.db.transaction(o=>{let s=o.select().from(I).where(At(n,e.workspaceId)).all(),i=s.filter(m=>m.is_archived===0),d=new Set(s.map(m=>m.code)),c=new Set(i.map(m=>m.code)),u=e.codes.find(m=>!d.has(m));if(u)throw new ee("COMMON_CODE_REORDER_INVALID","VALIDATION",`Common code is not available in this scope: ${n}/${u}`);if(e.codes.length!==i.length||e.codes.some(m=>!c.has(m)))throw new ee("COMMON_CODE_REORDER_INVALID","VALIDATION","Common-code reorder must contain every non-archived code in the scope");let f=new Map(i.map(m=>[m.code,m])),p=e.codes.map(m=>{let w=f.get(m);if(!w)throw new ee("COMMON_CODE_REORDER_INVALID","VALIDATION",`Common code is not selectable in this scope: ${n}/${m}`);return w}),g;for(let[m,w]of p.entries())w.sort_order!==m&&(g??=new Date().toISOString(),o.update(I).set({sort_order:m,updated_at:g}).where(and(eq(I.code_group,n),eq(I.code,w.code))).run());return o.select().from(I).where(At(n,e.workspaceId)).orderBy(asc(I.sort_order),asc(I.code)).all()},{behavior:"immediate"})}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to reorder common codes",o)}finally{r.close();}}resolve(e,n){if(Zt(e),Rr(n),!this.dbExists())return null;let r=this.openHandle(false);try{return r.db.select().from(I).where(and(eq(I.code_group,e),eq(I.code,n))).limit(1).get()??null}catch(o){throw new l("DB_ERROR","Failed to resolve common code",o)}finally{r.close();}}createThreadState(e){en(e.workspaceId);let n=Fi(e.name);qi(e.color);let r=this.openHandle(true);try{return r.db.transaction(o=>{if(o.select({code:I.code}).from(I).where(and(At("THREAD_STATE",e.workspaceId),eq(I.is_archived,0),eq(I.code_name,n))).limit(1).get())throw new ee("COMMON_CODE_NAME_CONFLICT","CONFLICT",`Common-code name is already in use: ${n}`);let i=o.select({maxSortOrder:sql`max(${I.sort_order})`}).from(I).where(At("THREAD_STATE",e.workspaceId)).get(),d=new Date().toISOString(),c=wo();for(;o.select({code:I.code}).from(I).where(and(eq(I.code_group,"THREAD_STATE"),eq(I.code,c))).limit(1).get();)c=wo();o.insert(I).values({code_group:"THREAD_STATE",code:c,code_name:n,color:e.color,sort_order:(i?.maxSortOrder??-1)+1,workspace_id:e.workspaceId,is_builtin:0,is_archived:0,metadata:null,created_at:d,updated_at:d}).run();let u=o.select().from(I).where(and(eq(I.code_group,"THREAD_STATE"),eq(I.code,c))).limit(1).get();if(!u)throw new l("DB_ERROR","Created common code could not be read back");return u},{behavior:"immediate"})}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to create thread state common code",o)}finally{r.close();}}updateDisplay(e){if(Zt(e.group),Rr(e.code),en(e.workspaceId),e.name===void 0&&e.color===void 0)throw new ee("COMMON_CODE_UPDATE_EMPTY","VALIDATION","At least one display value is required");let n=e.name===void 0||e.name===null?e.name:Fi(e.name);e.color!==void 0&&qi(e.color);let r=this.openHandle(true);try{return r.db.transaction(o=>{let s=o.select().from(I).where(and(eq(I.code_group,e.group),eq(I.code,e.code))).limit(1).get();if(!s)throw new ee("COMMON_CODE_NOT_FOUND","NOT_FOUND",`Common code not found: ${e.group}/${e.code}`);if(this.assertOwnership(s,e.workspaceId),n===null&&s.is_builtin!==1)throw new ee("COMMON_CODE_NAME_INVALID","VALIDATION","User common-code names cannot be cleared");if(typeof n=="string"&&s.is_archived===0){let c=and(At(e.group,e.workspaceId),eq(I.is_archived,0));if(o.select({code:I.code}).from(I).where(and(c,eq(I.code_name,n),sql`${I.code} <> ${e.code}`)).limit(1).get())throw new ee("COMMON_CODE_NAME_CONFLICT","CONFLICT",`Common-code name is already in use: ${n}`)}let i={updated_at:new Date().toISOString()};e.name!==void 0&&(i.code_name=n??null),e.color!==void 0&&(i.color=e.color),o.update(I).set(i).where(and(eq(I.code_group,e.group),eq(I.code,e.code))).run();let d=o.select().from(I).where(and(eq(I.code_group,e.group),eq(I.code,e.code))).limit(1).get();if(!d)throw new l("DB_ERROR","Updated common code could not be read back");return d},{behavior:"immediate"})}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to update common-code display values",o)}finally{r.close();}}archive(e,n,r,o=true){if(Zt(e),Rr(n),en(r),typeof o!="boolean")throw new ee("COMMON_CODE_ARCHIVE_INVALID","VALIDATION","Archive state must be boolean");let s=this.openHandle(true);try{return s.db.transaction(i=>{let d=i.select().from(I).where(and(eq(I.code_group,e),eq(I.code,n))).limit(1).get();if(!d)throw new ee("COMMON_CODE_NOT_FOUND","NOT_FOUND",`Common code not found: ${e}/${n}`);if(d.is_builtin===1)throw new ee("COMMON_CODE_BUILTIN_ARCHIVE_FORBIDDEN","VALIDATION","Builtin common codes cannot be archived");if(this.assertOwnership(d,r),!o&&d.code_name!==null&&i.select({code:I.code}).from(I).where(and(At(e,r),eq(I.is_archived,0),eq(I.code_name,d.code_name),ne(I.code,n))).limit(1).get())throw new ee("COMMON_CODE_NAME_CONFLICT","CONFLICT",`Common-code name is already in use: ${d.code_name}`);i.update(I).set({is_archived:o?1:0,updated_at:new Date().toISOString()}).where(and(eq(I.code_group,e),eq(I.code,n))).run();let c=i.select().from(I).where(and(eq(I.code_group,e),eq(I.code,n))).limit(1).get();if(!c)throw new l("DB_ERROR","Archived common code could not be read back");return c},{behavior:"immediate"})}catch(i){throw i instanceof l?i:new l("DB_ERROR","Failed to archive common code",i)}finally{s.close();}}assertOwnership(e,n){if(e.workspace_id!==null&&e.workspace_id!==n)throw new ee("COMMON_CODE_SCOPE_FORBIDDEN","VALIDATION","Workspace does not own this common code")}};h();oe();pe();ae();le();de();h();function Eo(t){let e=Ce.resolve(t);return process.platform==="win32"&&(e=e.replace(/\\/g,"/"),e=e.replace(/^([A-Z]):/,(n,r)=>`${r.toLowerCase()}:`)),e.length>1&&!/^[a-zA-Z]:\/$/.test(e)&&(e=e.replace(/\/+$/,"")),e}function ji(t){let e=Eo(t);return createHash("sha256").update(e).digest("hex")}function Sr(t){return t.toLowerCase().replace(/[^a-z0-9-]/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}var bo=class extends F{dbRoot;constructor(e={}){super(),this.dbRoot=e.dbRoot;}resolveDbPath(){return this.dbRoot?join(this.dbRoot,".crewx","crewx.db"):super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=dirname(n);existsSync(o)||mkdirSync(o,{recursive:true});}else if(!existsSync(n))throw new l("NOT_FOUND","Database not found");let r=P(n);if(e)try{Jt(r.db);}catch(o){throw r.close(),o}return r}resolveSlug(e,n,r){let o=Sr(basename(r)),i=`${Sr(basename(dirname(r)))}-${o}`,d=[o,i];try{let c=u=>e.select({id:C.id}).from(C).where(and(eq(C.slug,u),ne(C.id,n))).limit(1).all().length>0;for(let u of d)if(!c(u))return u;for(let u=2;u<1e3;u+=1){let f=`${i}-${u}`;if(!c(f))return f}}catch{}return o}normalizeLegacySlugs(){if(!this.dbExists())return {updated:0,checked:0};let e=this.openHandle(true);try{let n=e.db.select({id:C.id,slug:C.slug}).from(C).all(),r=0;for(let o of n)if(o.slug.includes("/")){let s=Sr(o.slug.replace(/\//g,"-"));e.db.update(C).set({slug:s,updated_at:new Date().toISOString()}).where(eq(C.id,o.id)).run(),r+=1;}return {updated:r,checked:n.length}}catch(n){throw new l("DB_ERROR","Failed to normalize legacy slugs",n)}finally{e.close();}}ensureRow(e,n){let{id:r,slug:o,name:s,workspacePath:i}=n,d=new Date().toISOString();e.insert(C).values({id:r,slug:o,name:s,workspace_path:i,is_active:1,created_at:d,updated_at:d}).onConflictDoNothing().run(),e.update(C).set({workspace_path:i,updated_at:d}).where(and(eq(C.id,r),isNull(C.workspace_path))).run();}registerWorkspace(e){let n=Eo(e),r=this.openHandle(true);try{let o=ji(n),s=basename(n),i=this.resolveSlug(r.db,o,n);return this.ensureRow(r.db,{id:o,slug:i,name:s,workspacePath:n}),{id:o,slug:i}}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to register workspace",o)}finally{r.close();}}listProjects(e){if(!this.dbExists())return {rows:[],total:0};let n=this.openHandle(false);try{let r=e.isActive!==void 0?eq(C.is_active,e.isActive?1:0):void 0,o=n.db.select({count:sql`count(*)`}).from(C).where(r).get();return {rows:n.db.select().from(C).where(r).orderBy(desc(C.updated_at)).limit(e.limit).offset(e.offset).all(),total:o?.count??0}}catch(r){throw new l("DB_ERROR","Failed to list projects",r)}finally{n.close();}}findById(e){if(!this.dbExists())return;let n=this.openHandle(false);try{return n.db.select().from(C).where(eq(C.id,e)).limit(1).get()??void 0}catch(r){throw new l("DB_ERROR","Failed to find workspace",r)}finally{n.close();}}toggleStar(e){let n=this.openHandle(true);try{let r=n.db.select({starred:C.starred}).from(C).where(eq(C.id,e)).get();if(!r)return null;let o=r.starred?0:1;return n.db.update(C).set({starred:o}).where(eq(C.id,e)).run(),{starred:!!o}}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to toggle workspace star",r)}finally{n.close();}}findAgentsByProject(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.all(sql`SELECT DISTINCT agent_id FROM tasks WHERE workspace_id = ${e} AND agent_id IS NOT NULL ORDER BY agent_id`).map(o=>o.agent_id)}catch(r){throw new l("DB_ERROR","Failed to find agents by project",r)}finally{n.close();}}findThreadsByProject(e,n){if(!this.dbExists())return {rows:[],total:0};let r=this.openHandle(false);try{let o=r.db.get(sql`SELECT COUNT(*) as count FROM threads WHERE workspace_id = ${e}`);return {rows:r.db.all(sql`SELECT t.*,
281
+ LIMIT ${ys+1}
282
+ `),u=c.length>ys;return {edges:c.slice(0,ys).map(p=>({callerAgentId:p.caller_agent_id??null,agentId:p.agent_id,taskCount:p.task_count,totalTokens:p.input_tokens+p.output_tokens,outputTokens:p.output_tokens})),truncated:u}}catch(s){throw new l("DB_ERROR","Failed to get delegation matrix",s)}finally{o.close();}}findTaskEvidence(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{let r=[];e.workspaceId&&r.push(eq(a.workspace_id,e.workspaceId)),e.agents&&e.agents.length>0&&r.push(inArray(a.agent_id,e.agents)),e.statuses&&e.statuses.length>0&&r.push(inArray(a.status,e.statuses)),e.from&&r.push(gte(a.started_at,e.from)),e.to&&r.push(lt$1(a.started_at,e.to));let o=r.length>0?and(...r):void 0,s=(e.order??"DESC")==="ASC"?asc(a.started_at):desc(a.started_at),i={id:a.id,agent_id:a.agent_id,status:a.status,prompt:a.prompt,started_at:a.started_at,completed_at:a.completed_at,thread_id:a.thread_id,error:a.error,metadata:a.metadata};return (e.limit?n.db.select(i).from(a).where(o).orderBy(s).limit(e.limit).all():n.db.select(i).from(a).where(o).orderBy(s).all()).map(({error:c,metadata:u,...f})=>({...f,status:Ot({status:f.status,error:c,metadata:u})}))}catch(r){throw new l("DB_ERROR","Failed to find task evidence",r)}finally{n.close();}}findThreadChains(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{let r=e.maxThreads??8,o=e.maxTurnsPerThread??4,s=[isNotNull(a.thread_id),isNull(a.parent_task_id),isNull(a.caller_agent_id),or$1(isNull(a.platform),ne(a.platform,"workflow")),or$1(isNull(a.metadata),and(notLike(a.metadata,'%"kind":"workflow_card"%'),notLike(a.metadata,'%"kind":"workflow_ui_instance"%'))),or$1(isNull(a.metadata),notLike(a.metadata,'%"retriedFromTaskId"%'))];e.workspaceId&&s.push(eq(a.workspace_id,e.workspaceId)),e.from&&s.push(gte(a.started_at,e.from)),e.to&&s.push(lt$1(a.started_at,e.to));let i=n.db.select({id:a.id,agent_id:a.agent_id,status:a.status,prompt:a.prompt,started_at:a.started_at,completed_at:a.completed_at,thread_id:a.thread_id}).from(a).where(and(...s)).orderBy(asc(a.started_at),asc(a.id)).all(),d=new Map;for(let u of i){if(!u.thread_id)continue;let f={id:u.id,agentId:u.agent_id,status:u.status,prompt:u.prompt,startedAt:u.started_at,completedAt:u.completed_at},p=d.get(u.thread_id);p?p.push(f):d.set(u.thread_id,[f]);}let c=[];for(let[u,f]of d){let p=f.filter(g=>g.agentId===e.targetAgentId).length;p<2||c.push({threadId:u,targetAgentTurnCount:p,turns:f});}return c.sort((u,f)=>{let p=u.turns[u.turns.length-1].startedAt,g=f.turns[f.turns.length-1].startedAt;return p<g?1:p>g?-1:0}),c.slice(0,r).map(u=>({threadId:u.threadId,targetAgentTurnCount:u.targetAgentTurnCount,turns:u.turns.slice(-o)}))}catch(r){throw new l("DB_ERROR","Failed to find thread chains",r)}finally{n.close();}}};});h();oe();pe();h();oe();fe();ae();pe();de();Ro();var ee=class extends l{reason;constructor(e,n="VALIDATION",r=e,o){super(n,r,o),this.name="CommonCodeRepositoryError",this.reason=e;}},ji="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function rl(){let t=randomBytes(16),e="";for(let n of t)e+=ji[n%ji.length];return e.slice(0,12)}function So(){return `c_${rl()}`}function ol(t){return typeof t=="string"&&wr.includes(t)}function sl(t){return typeof t=="string"&&yr.includes(t)}function Xt(t){if(!ol(t))throw new ee("COMMON_CODE_GROUP_INVALID","VALIDATION",`Unsupported common-code group: ${t}`)}function zi(t){if(!sl(t))throw new ee("COMMON_CODE_COLOR_INVALID","VALIDATION",`Unsupported common-code color: ${t}`)}function Gi(t){let e=typeof t=="string"?t.trim():"",n=[...e].length;if(n<1||n>20)throw new ee("COMMON_CODE_NAME_INVALID","VALIDATION","Common-code names must contain 1 to 20 Unicode characters");return e}function Qt(t){if(typeof t!="string"||t.trim().length===0)throw new ee("COMMON_CODE_WORKSPACE_INVALID","VALIDATION","Workspace id is required for a user common code")}function br(t){if(typeof t!="string"||t.trim().length===0)throw new ee("COMMON_CODE_CODE_INVALID","VALIDATION","Common-code code is required")}function It(t,e){return and(eq(I.code_group,t),or$1(isNull(I.workspace_id),eq(I.workspace_id,e)))}var bo=class extends B{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath??super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(!e&&!existsSync(n))throw new l("NOT_FOUND","Database not found");e&&mkdirSync(dirname(n),{recursive:true});let r=P(n);if(e)try{K(r.db,n);}catch(o){throw r.close(),o}return r}listSelectable(e,n){if(Xt(e),Qt(n),!this.dbExists())return [];let r=this.openHandle(false);try{return r.db.select().from(I).where(and(It(e,n),eq(I.is_archived,0))).orderBy(asc(I.sort_order),asc(I.code)).all()}catch(o){throw new l("DB_ERROR","Failed to list selectable common codes",o)}finally{r.close();}}listForHistory(e,n){if(Xt(e),Qt(n),!this.dbExists())return [];let r=this.openHandle(false);try{return r.db.select().from(I).where(It(e,n)).orderBy(asc(I.sort_order),asc(I.code)).all()}catch(o){throw new l("DB_ERROR","Failed to list common-code history",o)}finally{r.close();}}reorder(e){let n=e.group;if(Xt(n),Qt(e.workspaceId),!Array.isArray(e.codes)||e.codes.length===0)throw new ee("COMMON_CODE_REORDER_INVALID","VALIDATION","At least one common-code code is required for reordering");for(let o of e.codes)br(o);if(new Set(e.codes).size!==e.codes.length)throw new ee("COMMON_CODE_REORDER_INVALID","VALIDATION","Common-code reorder entries must be unique");if(!this.dbExists())throw new ee("COMMON_CODE_REORDER_INVALID","VALIDATION","Common-code reorder scope does not exist");let r=this.openHandle(true);try{return r.db.transaction(o=>{let s=o.select().from(I).where(It(n,e.workspaceId)).all(),i=s.filter(m=>m.is_archived===0),d=new Set(s.map(m=>m.code)),c=new Set(i.map(m=>m.code)),u=e.codes.find(m=>!d.has(m));if(u)throw new ee("COMMON_CODE_REORDER_INVALID","VALIDATION",`Common code is not available in this scope: ${n}/${u}`);if(e.codes.length!==i.length||e.codes.some(m=>!c.has(m)))throw new ee("COMMON_CODE_REORDER_INVALID","VALIDATION","Common-code reorder must contain every non-archived code in the scope");let f=new Map(i.map(m=>[m.code,m])),p=e.codes.map(m=>{let _=f.get(m);if(!_)throw new ee("COMMON_CODE_REORDER_INVALID","VALIDATION",`Common code is not selectable in this scope: ${n}/${m}`);return _}),g;for(let[m,_]of p.entries())_.sort_order!==m&&(g??=new Date().toISOString(),o.update(I).set({sort_order:m,updated_at:g}).where(and(eq(I.code_group,n),eq(I.code,_.code))).run());return o.select().from(I).where(It(n,e.workspaceId)).orderBy(asc(I.sort_order),asc(I.code)).all()},{behavior:"immediate"})}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to reorder common codes",o)}finally{r.close();}}resolve(e,n){if(Xt(e),br(n),!this.dbExists())return null;let r=this.openHandle(false);try{return r.db.select().from(I).where(and(eq(I.code_group,e),eq(I.code,n))).limit(1).get()??null}catch(o){throw new l("DB_ERROR","Failed to resolve common code",o)}finally{r.close();}}createThreadState(e){Qt(e.workspaceId);let n=Gi(e.name);zi(e.color);let r=this.openHandle(true);try{return r.db.transaction(o=>{if(o.select({code:I.code}).from(I).where(and(It("THREAD_STATE",e.workspaceId),eq(I.is_archived,0),eq(I.code_name,n))).limit(1).get())throw new ee("COMMON_CODE_NAME_CONFLICT","CONFLICT",`Common-code name is already in use: ${n}`);let i=o.select({maxSortOrder:sql`max(${I.sort_order})`}).from(I).where(It("THREAD_STATE",e.workspaceId)).get(),d=new Date().toISOString(),c=So();for(;o.select({code:I.code}).from(I).where(and(eq(I.code_group,"THREAD_STATE"),eq(I.code,c))).limit(1).get();)c=So();o.insert(I).values({code_group:"THREAD_STATE",code:c,code_name:n,color:e.color,sort_order:(i?.maxSortOrder??-1)+1,workspace_id:e.workspaceId,is_builtin:0,is_archived:0,metadata:null,created_at:d,updated_at:d}).run();let u=o.select().from(I).where(and(eq(I.code_group,"THREAD_STATE"),eq(I.code,c))).limit(1).get();if(!u)throw new l("DB_ERROR","Created common code could not be read back");return u},{behavior:"immediate"})}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to create thread state common code",o)}finally{r.close();}}updateDisplay(e){if(Xt(e.group),br(e.code),Qt(e.workspaceId),e.name===void 0&&e.color===void 0)throw new ee("COMMON_CODE_UPDATE_EMPTY","VALIDATION","At least one display value is required");let n=e.name===void 0||e.name===null?e.name:Gi(e.name);e.color!==void 0&&zi(e.color);let r=this.openHandle(true);try{return r.db.transaction(o=>{let s=o.select().from(I).where(and(eq(I.code_group,e.group),eq(I.code,e.code))).limit(1).get();if(!s)throw new ee("COMMON_CODE_NOT_FOUND","NOT_FOUND",`Common code not found: ${e.group}/${e.code}`);if(this.assertOwnership(s,e.workspaceId),n===null&&s.is_builtin!==1)throw new ee("COMMON_CODE_NAME_INVALID","VALIDATION","User common-code names cannot be cleared");if(typeof n=="string"&&s.is_archived===0){let c=and(It(e.group,e.workspaceId),eq(I.is_archived,0));if(o.select({code:I.code}).from(I).where(and(c,eq(I.code_name,n),sql`${I.code} <> ${e.code}`)).limit(1).get())throw new ee("COMMON_CODE_NAME_CONFLICT","CONFLICT",`Common-code name is already in use: ${n}`)}let i={updated_at:new Date().toISOString()};e.name!==void 0&&(i.code_name=n??null),e.color!==void 0&&(i.color=e.color),o.update(I).set(i).where(and(eq(I.code_group,e.group),eq(I.code,e.code))).run();let d=o.select().from(I).where(and(eq(I.code_group,e.group),eq(I.code,e.code))).limit(1).get();if(!d)throw new l("DB_ERROR","Updated common code could not be read back");return d},{behavior:"immediate"})}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to update common-code display values",o)}finally{r.close();}}archive(e,n,r,o=true){if(Xt(e),br(n),Qt(r),typeof o!="boolean")throw new ee("COMMON_CODE_ARCHIVE_INVALID","VALIDATION","Archive state must be boolean");let s=this.openHandle(true);try{return s.db.transaction(i=>{let d=i.select().from(I).where(and(eq(I.code_group,e),eq(I.code,n))).limit(1).get();if(!d)throw new ee("COMMON_CODE_NOT_FOUND","NOT_FOUND",`Common code not found: ${e}/${n}`);if(d.is_builtin===1)throw new ee("COMMON_CODE_BUILTIN_ARCHIVE_FORBIDDEN","VALIDATION","Builtin common codes cannot be archived");if(this.assertOwnership(d,r),!o&&d.code_name!==null&&i.select({code:I.code}).from(I).where(and(It(e,r),eq(I.is_archived,0),eq(I.code_name,d.code_name),ne(I.code,n))).limit(1).get())throw new ee("COMMON_CODE_NAME_CONFLICT","CONFLICT",`Common-code name is already in use: ${d.code_name}`);i.update(I).set({is_archived:o?1:0,updated_at:new Date().toISOString()}).where(and(eq(I.code_group,e),eq(I.code,n))).run();let c=i.select().from(I).where(and(eq(I.code_group,e),eq(I.code,n))).limit(1).get();if(!c)throw new l("DB_ERROR","Archived common code could not be read back");return c},{behavior:"immediate"})}catch(i){throw i instanceof l?i:new l("DB_ERROR","Failed to archive common code",i)}finally{s.close();}}assertOwnership(e,n){if(e.workspace_id!==null&&e.workspace_id!==n)throw new ee("COMMON_CODE_SCOPE_FORBIDDEN","VALIDATION","Workspace does not own this common code")}};h();oe();fe();ae();pe();de();h();function Io(t){let e=Ne.resolve(t);return process.platform==="win32"&&(e=e.replace(/\\/g,"/"),e=e.replace(/^([A-Z]):/,(n,r)=>`${r.toLowerCase()}:`)),e.length>1&&!/^[a-zA-Z]:\/$/.test(e)&&(e=e.replace(/\/+$/,"")),e}function Wi(t){let e=Io(t);return createHash("sha256").update(e).digest("hex")}function Ir(t){return t.toLowerCase().replace(/[^a-z0-9-]/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}var Oo=class extends B{dbRoot;constructor(e={}){super(),this.dbRoot=e.dbRoot;}resolveDbPath(){return this.dbRoot?join(this.dbRoot,".crewx","crewx.db"):super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=dirname(n);existsSync(o)||mkdirSync(o,{recursive:true});}else if(!existsSync(n))throw new l("NOT_FOUND","Database not found");let r=P(n);if(e)try{Vt(r.db);}catch(o){throw r.close(),o}return r}resolveSlug(e,n,r){let o=Ir(basename(r)),i=`${Ir(basename(dirname(r)))}-${o}`,d=[o,i];try{let c=u=>e.select({id:x.id}).from(x).where(and(eq(x.slug,u),ne(x.id,n))).limit(1).all().length>0;for(let u of d)if(!c(u))return u;for(let u=2;u<1e3;u+=1){let f=`${i}-${u}`;if(!c(f))return f}}catch{}return o}normalizeLegacySlugs(){if(!this.dbExists())return {updated:0,checked:0};let e=this.openHandle(true);try{let n=e.db.select({id:x.id,slug:x.slug}).from(x).all(),r=0;for(let o of n)if(o.slug.includes("/")){let s=Ir(o.slug.replace(/\//g,"-"));e.db.update(x).set({slug:s,updated_at:new Date().toISOString()}).where(eq(x.id,o.id)).run(),r+=1;}return {updated:r,checked:n.length}}catch(n){throw new l("DB_ERROR","Failed to normalize legacy slugs",n)}finally{e.close();}}ensureRow(e,n){let{id:r,slug:o,name:s,workspacePath:i}=n,d=new Date().toISOString();e.insert(x).values({id:r,slug:o,name:s,workspace_path:i,is_active:1,created_at:d,updated_at:d}).onConflictDoNothing().run(),e.update(x).set({workspace_path:i,updated_at:d}).where(and(eq(x.id,r),isNull(x.workspace_path))).run();}registerWorkspace(e){let n=Io(e),r=this.openHandle(true);try{let o=Wi(n),s=basename(n),i=this.resolveSlug(r.db,o,n);return this.ensureRow(r.db,{id:o,slug:i,name:s,workspacePath:n}),{id:o,slug:i}}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to register workspace",o)}finally{r.close();}}listProjects(e){if(!this.dbExists())return {rows:[],total:0};let n=this.openHandle(false);try{let r=e.isActive!==void 0?eq(x.is_active,e.isActive?1:0):void 0,o=n.db.select({count:sql`count(*)`}).from(x).where(r).get();return {rows:n.db.select().from(x).where(r).orderBy(desc(x.updated_at)).limit(e.limit).offset(e.offset).all(),total:o?.count??0}}catch(r){throw new l("DB_ERROR","Failed to list projects",r)}finally{n.close();}}findById(e){if(!this.dbExists())return;let n=this.openHandle(false);try{return n.db.select().from(x).where(eq(x.id,e)).limit(1).get()??void 0}catch(r){throw new l("DB_ERROR","Failed to find workspace",r)}finally{n.close();}}toggleStar(e){let n=this.openHandle(true);try{let r=n.db.select({starred:x.starred}).from(x).where(eq(x.id,e)).get();if(!r)return null;let o=r.starred?0:1;return n.db.update(x).set({starred:o}).where(eq(x.id,e)).run(),{starred:!!o}}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to toggle workspace star",r)}finally{n.close();}}findAgentsByProject(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.all(sql`SELECT DISTINCT agent_id FROM tasks WHERE workspace_id = ${e} AND agent_id IS NOT NULL ORDER BY agent_id`).map(o=>o.agent_id)}catch(r){throw new l("DB_ERROR","Failed to find agents by project",r)}finally{n.close();}}findThreadsByProject(e,n){if(!this.dbExists())return {rows:[],total:0};let r=this.openHandle(false);try{let o=r.db.get(sql`SELECT COUNT(*) as count FROM threads WHERE workspace_id = ${e}`);return {rows:r.db.all(sql`SELECT t.*,
342
283
  (SELECT agent_id FROM tasks tk WHERE tk.thread_id = t.id AND tk.agent_id IS NOT NULL ORDER BY tk.started_at ASC LIMIT 1) AS agent_id
343
284
  FROM threads t
344
285
  WHERE t.workspace_id = ${e}
345
286
  ORDER BY t.updated_at DESC
346
- LIMIT ${n.limit} OFFSET ${n.offset}`),total:o?.count??0}}catch(o){throw new l("DB_ERROR","Failed to find threads by project",o)}finally{r.close();}}findBySlug(e){if(!this.dbExists())return;let n=this.openHandle(false);try{return n.db.select().from(C).where(eq(C.slug,e)).limit(1).get()??void 0}catch(r){throw new l("DB_ERROR","Failed to find workspace by slug",r)}finally{n.close();}}slugExists(e,n){if(!this.dbExists())return false;let r=this.openHandle(false);try{let o=n?and(eq(C.slug,e),ne(C.id,n)):eq(C.slug,e);return !!r.db.select({id:C.id}).from(C).where(o).limit(1).get()}catch(o){throw new l("DB_ERROR","Failed to check slug",o)}finally{r.close();}}insert(e,n,r,o){let s=this.openHandle(true);try{let i=new Date().toISOString();s.db.insert(C).values({id:e,slug:n,name:r,workspace_path:o,is_active:1,created_at:i,updated_at:i}).run();let d=s.db.select().from(C).where(eq(C.id,e)).limit(1).get();if(!d)throw new l("DB_ERROR","Insert did not return a row");return d}catch(i){throw i instanceof l?i:new l("DB_ERROR","Failed to insert workspace",i)}finally{s.close();}}update(e,n,r){let o=this.openHandle(true);try{o.runRaw(`UPDATE workspaces SET ${n.join(", ")} WHERE id = ?`,r);let s=o.db.select().from(C).where(eq(C.id,e)).limit(1).get();if(!s)throw new l("NOT_FOUND",`Workspace ${e} not found`);return s}catch(s){throw s instanceof l?s:new l("DB_ERROR","Failed to update workspace",s)}finally{o.close();}}cleanupOrphanWorkspaces(){if(!this.dbExists())return {softDeleted:0,checked:0};let e=this.openHandle(true);try{let n=e.db.select({id:C.id,workspace_path:C.workspace_path}).from(C).where(and(eq(C.is_active,1),isNotNull(C.workspace_path))).all(),r=0;for(let o of n){let s=o.workspace_path;existsSync(join(s,"crewx.yaml"))||existsSync(join(s,"crewx.yml"))||(e.db.update(C).set({is_active:0,updated_at:new Date().toISOString()}).where(eq(C.id,o.id)).run(),r+=1);}return {softDeleted:r,checked:n.length}}catch(n){throw new l("DB_ERROR","Failed to cleanup orphan workspaces",n)}finally{e.close();}}delete(e){let n=this.openHandle(true);try{n.db.run(sql`UPDATE threads SET workspace_id = NULL WHERE workspace_id = ${e}`),n.db.delete(C).where(eq(C.id,e)).run();}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to delete workspace",r)}finally{n.close();}}};h();oe();pe();ae();le();h();var Io="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function il(t){let e=randomBytes(t*2),n="";for(let r=0;r<e.length&&n.length<t;r++){let o=e[r];o<248&&(n+=Io[o%62]);}for(;n.length<t;)n+=Io[randomBytes(1)[0]%62];return n}function Le(t){return `${t}_${il(8)}`}function Wi(t,e){let{createHash:n}=ft("crypto"),r=n("sha256").update(e).digest(),o=Buffer.alloc(8);for(let i=0;i<32;i++)o[i%8]^=r[i];let s="";for(let i of o)s+=Io[i%62];return `${t}_${s}`}de();var Ao=["outcome_plan","contract_check","feature_link","use_verify","result_review"],fl=new Set(Ao),Qi=Object.freeze(Ao.map(t=>({key:t,labelOverride:null}))),gl=new Set(["created","plan_proposed","plan_approved","decision_requested","decision_answered","replanned","stage_advanced","criterion_verified","scene_changed","result_submitted","accepted"]),hl=new Set(["planning","plan_review","running","human_wait","limit_wait","failed_stop","analyzing_feedback","replanned","awaiting_review","accepted"]),ml=new Set(["pending","verifying","passed","failed"]),_l=new Set(["user","project_manager","system"]),kl=new Set(["task","wi","url"]),Tl=/^\d{4}-\d{2}-\d{2}$/;function Q(t){throw new l("VALIDATION",t)}function qe(t){throw new l("NOT_FOUND",t)}function fe(t,e){(typeof t!="string"||t.trim().length===0)&&Q(`${e} is required`);}function wl(t){if(t==null)return;Tl.test(t)||Q("dueDate must use YYYY-MM-DD");let e=new Date(`${t}T00:00:00.000Z`);(Number.isNaN(e.getTime())||e.toISOString().slice(0,10)!==t)&&Q("dueDate must be a valid calendar date");}function Zi(t){let e=t??Qi;(!Array.isArray(e)||e.length===0)&&Q("stages must contain at least one stage");let n=new Set;return e.map(r=>{(!r||typeof r!="object"||Array.isArray(r))&&Q("stage must be an object");let o=r;return fe(o.key,"stage.key"),o.labelOverride!==null&&typeof o.labelOverride!="string"&&Q("stage.labelOverride must be a string or null"),o.labelOverride!==null&&fe(o.labelOverride,"stage.labelOverride"),typeof o.key!="string"&&Q("stage.key is required"),!fl.has(o.key)&&o.labelOverride===null&&Q(`custom stage requires a labelOverride: ${o.key}`),n.has(o.key)&&Q(`duplicate stage key: ${o.key}`),n.add(o.key),{key:o.key,labelOverride:o.labelOverride}})}function yl(t){Array.isArray(t)||Q("criteria must be an array");for(let e of t)fe(e,"criterion.statement");}function nn(t={}){let e=t.actorType??"system";_l.has(e)||Q(`invalid actorType: ${String(e)}`);let n=t.actorId??null;return (e==="user"||e==="project_manager")&&(!n||n.trim().length===0)&&Q(`actorId is required for ${e}`),{actorType:e,actorId:n}}function ea(t,e){let n=t??{};if((n===null||typeof n!="object"||Array.isArray(n))&&Q("event payload must be a JSON object"),e==="accepted")for(let r of ["remainingRisks","nextPlan","lessons","evidenceRefs"])(!Object.prototype.hasOwnProperty.call(n,r)||n[r]===void 0)&&Q(`accepted payload requires ${r}`);try{return JSON.stringify(n)}catch(r){throw new l("VALIDATION","event payload must be JSON serializable",r)}}function El(t){return Array.isArray(t)||Q("evidence must be an array"),t.map(e=>((!e||typeof e!="object")&&Q("evidence item must be an object"),kl.has(e.kind)||Q(`invalid evidence kind: ${String(e.kind)}`),fe(e.ref,"evidence.ref"),e.label!==void 0&&typeof e.label!="string"&&Q("evidence.label must be a string"),e.label===void 0?{kind:e.kind,ref:e.ref}:{kind:e.kind,ref:e.ref,label:e.label}))}function Xi(t){let e;try{e=JSON.parse(t);}catch(n){throw new l("DB_ERROR","Project stages JSON is invalid",n)}try{if(!Array.isArray(e))throw new l("DB_ERROR","Project stages JSON is invalid");return Zi(e)}catch(n){throw new l("DB_ERROR","Project stages JSON is invalid",n)}}function ta(t){return fe(t.projectId,"projectId"),fe(t.title,"title"),gl.has(t.type)||Q(`invalid project event type: ${String(t.type)}`),{...nn(t),payloadJson:ea(t.payload,t.type)}}function Mt(t,e,n){let r=ta(e);t.select({id:z.id}).from(z).where(eq(z.id,e.projectId)).get()||qe(`Project ${e.projectId} not found`);let s=t.select({maxSeq:sql`COALESCE(MAX(${Ke.seq}), 0)`}).from(Ke).where(eq(Ke.project_id,e.projectId)).get()?.maxSeq??0,i=Le("pje");t.insert(Ke).values({id:i,project_id:e.projectId,seq:s+1,actor_type:r.actorType,actor_id:r.actorId,type:e.type,title:e.title,summary:e.summary??null,payload_json:r.payloadJson,created_at:n}).run();let d=t.select().from(Ke).where(eq(Ke.id,i)).get();if(!d)throw new l("DB_ERROR","Event insert did not return a row");return d}var vo=class extends F{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath??super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(!e&&!existsSync(n))throw new l("NOT_FOUND","Database not found");if(e){let o=dirname(n);existsSync(o)||mkdirSync(o,{recursive:true});}let r=P(n);if(e)try{K(r.db,n);}catch(o){throw r.close(),o}return r}getDetailFromHandle(e,n){let r=e.db.select().from(z).where(eq(z.id,n)).get();if(!r)return;let o=e.db.select().from(Pe).where(eq(Pe.project_id,n)).orderBy(asc(Pe.position)).all();return {...r,stages:Xi(r.stages_json),criteria:o}}getDetailOrThrow(e){let n=this.getProject(e);return n||qe(`Project ${e} not found`),n}createProject(e){fe(e.workspaceId,"workspaceId"),fe(e.name,"name"),fe(e.outcome,"outcome"),wl(e.dueDate);let n=Zi(e.stages);yl(e.criteria);let r=Le("prj"),o=new Date().toISOString(),s=this.openHandle(true);try{s.db.transaction(i=>{i.insert(z).values({id:r,workspace_id:e.workspaceId,name:e.name,outcome:e.outcome,due_date:e.dueDate??null,scene:"planning",stages_json:JSON.stringify(n),stage_index:1,created_at:o,updated_at:o,accepted_at:null,archived_at:null}).run(),e.criteria.forEach((d,c)=>{i.insert(Pe).values({id:Le("pjc"),project_id:r,position:c+1,statement:d,verify_status:"pending",verified_at:null,evidence_json:"[]",created_at:o,updated_at:o}).run();}),Mt(i,{projectId:r,actorType:"system",type:"created",title:"Project created",payload:{}},o);});}catch(i){throw i instanceof l?i:new l("DB_ERROR","Failed to create project",i)}finally{s.close();}return this.getDetailOrThrow(r)}getProject(e){if(!this.dbExists())return;let n=this.openHandle(false);try{return this.getDetailFromHandle(n,e)}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to get project",r)}finally{n.close();}}listProjectsByWorkspace(e,n={}){if(fe(e,"workspaceId"),!this.dbExists())return [];let r=this.openHandle(false);try{let o=n.includeArchived?eq(z.workspace_id,e):and(eq(z.workspace_id,e),isNull(z.archived_at));return r.db.select({id:z.id}).from(z).where(o).orderBy(desc(z.updated_at),desc(z.created_at)).all().map(i=>this.getDetailFromHandle(r,i.id)).filter(i=>i!==void 0)}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to list projects",o)}finally{r.close();}}archiveProject(e){fe(e,"projectId");let n=this.openHandle(true);try{n.db.update(z).set({archived_at:new Date().toISOString()}).where(eq(z.id,e)).run().changes===0&&qe(`Project ${e} not found`);}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to archive project",r)}finally{n.close();}return this.getDetailOrThrow(e)}setScene(e,n,r={}){fe(e,"projectId"),hl.has(n)||Q(`invalid project scene: ${String(n)}`);let o=nn(r),s=new Date().toISOString(),i=this.openHandle(true);try{i.db.transaction(d=>{let c=d.select().from(z).where(eq(z.id,e)).get();c||qe(`Project ${e} not found`),d.update(z).set({scene:n,updated_at:s}).where(eq(z.id,e)).run(),Mt(d,{projectId:e,...o,type:"scene_changed",title:"Project scene changed",payload:{before:c.scene,after:n}},s);});}catch(d){throw d instanceof l?d:new l("DB_ERROR","Failed to set project scene",d)}finally{i.close();}return this.getDetailOrThrow(e)}setStageIndex(e,n,r={}){fe(e,"projectId"),Number.isInteger(n)||Q("stage index must be an integer");let o=nn(r),s=new Date().toISOString(),i=this.openHandle(true);try{i.db.transaction(d=>{let c=d.select().from(z).where(eq(z.id,e)).get();c||qe(`Project ${e} not found`);let u=Xi(c.stages_json);(n<1||n>u.length)&&Q("stage index is outside the project stages"),d.update(z).set({stage_index:n,updated_at:s}).where(eq(z.id,e)).run(),Mt(d,{projectId:e,...o,type:"stage_advanced",title:"Project stage advanced",payload:{before:c.stage_index,after:n}},s);});}catch(d){throw d instanceof l?d:new l("DB_ERROR","Failed to set project stage",d)}finally{i.close();}return this.getDetailOrThrow(e)}setCriterionVerify(e,n,r,o={}){let s=typeof e=="string"?{projectId:typeof r=="string"?e:void 0,criterionId:typeof r=="string"?n:e,verifyStatus:typeof r=="string"?r:n,...typeof r=="string"?o:r}:e,i=s.verifyStatus??s.status;(!i||!ml.has(i))&&Q(`invalid criterion status: ${String(i)}`),fe(s.criterionId,"criterionId");let d=nn(s),c=new Date().toISOString(),u=this.openHandle(true),f;try{u.db.transaction(g=>{let m=g.select().from(Pe).where(eq(Pe.id,s.criterionId)).get();m||qe(`Criterion ${s.criterionId} not found`),f=m.project_id,s.projectId&&s.projectId!==m.project_id&&qe(`Criterion ${s.criterionId} not found in project ${s.projectId}`),g.update(Pe).set({verify_status:i,verified_at:i==="passed"?c:null,updated_at:c}).where(eq(Pe.id,s.criterionId)).run(),Mt(g,{projectId:m.project_id,...d,type:"criterion_verified",title:"Criterion verification updated",payload:{criterionId:s.criterionId,status:i}},c);});}catch(g){throw g instanceof l?g:new l("DB_ERROR","Failed to set criterion verification",g)}finally{u.close();}let p=f?this.getProject(f)?.criteria.find(g=>g.id===s.criterionId):void 0;return p||qe(`Criterion ${s.criterionId} not found`),p}setCriterionEvidence(e,n,r,o={}){let s=typeof e=="string"?{projectId:Array.isArray(r)?e:void 0,criterionId:Array.isArray(r)?n:e,evidence:Array.isArray(r)?r:n,...Array.isArray(r)?o:r}:e;fe(s.criterionId,"criterionId");let i=El(s.evidence),d=nn(s),c=new Date().toISOString(),u=this.openHandle(true),f;try{u.db.transaction(g=>{let m=g.select().from(Pe).where(eq(Pe.id,s.criterionId)).get();m||qe(`Criterion ${s.criterionId} not found`),f=m.project_id,s.projectId&&s.projectId!==m.project_id&&qe(`Criterion ${s.criterionId} not found in project ${s.projectId}`),g.update(Pe).set({evidence_json:JSON.stringify(i),updated_at:c}).where(eq(Pe.id,s.criterionId)).run(),Mt(g,{projectId:m.project_id,...d,type:"criterion_verified",title:"Criterion evidence updated",payload:{criterionId:s.criterionId,evidence:i}},c);});}catch(g){throw g instanceof l?g:new l("DB_ERROR","Failed to set criterion evidence",g)}finally{u.close();}let p=f?this.getProject(f)?.criteria.find(g=>g.id===s.criterionId):void 0;return p||qe(`Criterion ${s.criterionId} not found`),p}appendEvent(e,n){let r=typeof e=="string"?{...n,projectId:e}:e;ta(r);let o=new Date().toISOString(),s=this.openHandle(true),i;try{s.db.transaction(d=>{i=Mt(d,r,o);});}catch(d){throw d instanceof l?d:new l("DB_ERROR","Failed to append project event",d)}finally{s.close();}if(!i)throw new l("DB_ERROR","Event append did not return a row");return i}listEvents(e,n={}){if(fe(e,"projectId"),n.afterSeq!==void 0&&(!Number.isInteger(n.afterSeq)||n.afterSeq<0)&&Q("afterSeq must be a non-negative integer"),n.limit!==void 0&&(!Number.isInteger(n.limit)||n.limit<1)&&Q("limit must be a positive integer"),!this.dbExists())return [];let r=this.openHandle(false);try{let o=[eq(Ke.project_id,e)];n.afterSeq!==void 0&&o.push(gt(Ke.seq,n.afterSeq));let s=r.db.select().from(Ke).where(and(...o)).orderBy(asc(Ke.seq));return n.limit!==void 0&&(s=s.limit(n.limit)),s.all()}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to list project events",o)}finally{r.close();}}acceptProject(e,n){fe(e,"projectId");let r=nn(n),o={remainingRisks:n.remainingRisks,nextPlan:n.nextPlan,lessons:n.lessons,evidenceRefs:n.evidenceRefs};ea(o,"accepted");let s=new Date().toISOString(),i=this.openHandle(true);try{i.db.transaction(d=>{d.select({id:z.id}).from(z).where(eq(z.id,e)).get()||qe(`Project ${e} not found`),d.update(z).set({scene:"accepted",accepted_at:s,updated_at:s}).where(eq(z.id,e)).run(),Mt(d,{projectId:e,...r,type:"accepted",title:"Project accepted",payload:o},s);});}catch(d){throw d instanceof l?d:new l("DB_ERROR","Failed to accept project",d)}finally{i.close();}return this.getDetailOrThrow(e)}};pe();ae();h();ae();de();var oa=[C,a,k,ht,rt,$e,Xt];function bl(){return Ce__default.join(ti.homedir(),".crewx","crewx.db")}function Il(t){if(!na__default.existsSync(t))return null;let e=Math.floor(Date.now()/1e3),n=`${t}.bak-${e}`;return na__default.copyFileSync(t,n),n}function sa(t){let e=t.all("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'");return new Set(e.map(n=>n.name))}function vl(t){return t==null||typeof t=="object"&&"queryChunks"in t?null:typeof t=="number"?String(t):typeof t=="boolean"?t?"1":"0":typeof t=="string"?`'${t.replace(/'/g,"''")}'`:String(t)}function Al(t){let e=t.getSQLType(),n=`"${t.name}" ${e}`,r=vl(t.default);return r!==null&&(n+=` DEFAULT ${r}`),t.notNull&&(n+=" NOT NULL"),n}function Ol(t,e){let n=e?.dbPath??bl(),r=e?.force??false,o=e?.dryRun??false,s=o?null:Il(n);if(r&&!o)try{t.run("DELETE FROM __drizzle_migrations");}catch{}let i=sa(t);if(!o)try{Jt(t);}catch(p){let g=p instanceof Error?`${p.message} ${p.cause?.message??""}`:"";if(!r||!g.includes("duplicate column"))throw p}let d,c;o?(d=oa.map(g=>getTableConfig(g).name).filter(g=>!i.has(g)),c=i):(c=sa(t),d=[...c].filter(p=>!i.has(p)));let u=[],f=[];for(let p of oa){let g=getTableConfig(p),m=g.name;if(!c.has(m))continue;let w=t.all(`PRAGMA table_info("${m}")`),_=new Set(w.map(S=>S.name)),T=new Set(g.columns.map(S=>S.name));for(let S of g.columns)if(!_.has(S.name)){if(!o){let M=Al(S);t.run(`ALTER TABLE "${m}" ADD COLUMN ${M}`);}u.push({table:m,column:S.name});}for(let S of w)T.has(S.name)||f.push(`${m}.${S.name} exists in DB but not in schema (untouched)`);}return {created:d,altered:u,warnings:f,backupPath:s}}de();zn();ms();Bn();Fn();zn();h();oe();h();var Md=["success","failed","completed"],Qr=10*1024*1024*1024,Hd=256,bf=new Set(Md),Ee=class extends Error{constructor(n,r,o="metadata"){super(r);this.taskId=n;this.kind=o;this.name="MigrationTaskError";}taskId;kind};function Zr(t){return t||(process.env.CREWX_DB?process.env.CREWX_DB:process.env.CREWX_TRACES_DB?process.env.CREWX_TRACES_DB:join(homedir(),".crewx","crewx.db"))}function If(){return ft("better-sqlite3")}function Ud(t,e){let n=t===":memory:";if(!n&&!existsSync(t))throw new Error(`Database not found: ${t}`);let r=new(If())(t,{readonly:e,fileMustExist:!n,timeout:5e3});return r.pragma("foreign_keys = ON"),r.pragma("busy_timeout = 5000"),r}function _n(t,e,n=[]){return t.prepare(e).all(...n)}function mn(t,e,n=[]){return t.prepare(e).get(...n)}function vf(t,e,n=[]){return t.prepare(e).run(...n)}function Af(t,e,n=[]){return t.prepare(e).iterate(...n)}function Of(t){return typeof t=="string"&&t.length>0?t:"<unknown>"}function $d(t){return typeof t=="string"&&bf.has(t)}function Pd(t,e){t.set(e,(t.get(e)??0)+1);}function Dd(t){return Object.fromEntries([...t.entries()].sort(([e],[n])=>e.localeCompare(n)))}function Cf(t){let e=new Set(_n(t,"SELECT name FROM sqlite_master WHERE type = 'table' AND name IN ('tasks', 'task_log_events')").map(i=>i.name)),n=["tasks","task_log_events"].filter(i=>!e.has(i));if(n.length>0)throw new Error(`Database schema is missing required table(s): ${n.join(", ")}`);let r=new Set(_n(t,"PRAGMA table_info('tasks')").map(i=>i.name)),s=["id","status","logs","log_storage","last_log_seq","log_revision"].filter(i=>!r.has(i));if(s.length>0)throw new Error(`Database schema is missing required tasks column(s): ${s.join(", ")}`)}function qd(t,e){if(e==null)return {entries:[]};if(typeof e!="string")throw new Ee(t,"Malformed task logs: tasks.logs must be JSON text or null","malformed");if(e.trim()==="")return {entries:[]};let n;try{n=JSON.parse(e);}catch(o){let s=o instanceof Error?o.message:String(o);throw new Ee(t,`Malformed JSON in tasks.logs (${s})`,"malformed")}if(!Array.isArray(n))throw new Ee(t,"Malformed task logs: expected a JSON array","malformed");let r=[];for(let[o,s]of n.entries()){if(s===null||typeof s!="object"||typeof s.timestamp!="string"||typeof s.level!="string"||typeof s.message!="string")throw new Ee(t,`Malformed task logs: entry ${o} must contain string timestamp, level, and message fields`,"malformed");let i=s;r.push({timestamp:i.timestamp,level:i.level,message:i.message});}return {entries:r}}function Is(t,e){if(!Number.isInteger(t.last_log_seq)||t.last_log_seq<0)throw new Ee(t.id,"Invalid last_log_seq metadata","metadata");if(!Number.isInteger(t.log_revision)||t.log_revision<0)throw new Ee(t.id,"Invalid log_revision metadata","metadata");if(e==="blob"&&t.last_log_seq!==0)throw new Ee(t.id,"Blob source must have last_log_seq=0","metadata")}function Nf(t){let e=_n(t,`SELECT task_id, COUNT(*) AS event_count
347
- FROM task_log_events GROUP BY task_id`);return new Map(e.map(n=>[n.task_id,n.event_count]))}function xf(t){let e=Nf(t),n=new Map,r=[],o=[],s=[],i=new Map,d=new Map,c=0,u=0,f=0,p=0,g=0,m=0;for(let w of Af(t,`SELECT id, status, logs, log_storage, last_log_seq, log_revision
348
- FROM tasks ORDER BY id`)){let _=w,T=Of(_.status);if(Pd(i,T),n.set(_.id,{id:_.id,status:_.status,log_storage:_.log_storage,last_log_seq:_.last_log_seq,log_revision:_.log_revision}),c+=1,_.log_storage==="events"){p+=1;try{Is(_,"events");}catch(E){s.push(vs(E,_.id));}_.logs!==null&&s.push({taskId:_.id,reason:"Event source still has a non-null tasks.logs blob",kind:"mixed-source"});continue}if(_.log_storage!=="blob"){s.push({taskId:_.id,reason:`Unknown log_storage value: ${_.log_storage}`,kind:"invalid-source"});continue}u+=1;let S=$d(_.status);S||(f+=1,Pd(d,T)),typeof _.logs=="string"?m+=Buffer.byteLength(_.logs,"utf8"):Buffer.isBuffer(_.logs)&&(m+=_.logs.byteLength);let M=e.get(_.id)??0;M>0&&s.push({taskId:_.id,reason:`Blob source already has ${M} task_log_events row(s)`,kind:"mixed-source"});let Y;try{Y=qd(_.id,_.logs),g+=Y.entries.length,Is(_,"blob");}catch(E){let x=vs(E,_.id);s.push(x),x.kind==="malformed"&&o.push(x);continue}M>0||S&&r.push(_.id);}return {taskCount:c,candidateTaskCount:u,eligibleTaskCount:r.length,eventSourceTasks:p,statusCounts:Dd(i),deferredTaskCount:f,deferredStatusCounts:Dd(d),entryCount:g,sourceBytes:m,candidateIds:r,malformedRows:o,failures:s,tasks:n}}function vs(t,e){return t instanceof Ee?{taskId:t.taskId,reason:t.message,kind:t.kind}:{taskId:e,reason:t instanceof Error?t.message:String(t),kind:"metadata"}}function Pf(t){return mn(t,"SELECT COUNT(*) AS count FROM tasks WHERE status IN ('pending', 'running')")?.count??0}function Df(t){return mn(t,"SELECT COUNT(*) AS count FROM tasks WHERE log_storage = 'blob'")?.count??0}function Lf(t){if(t===":memory:")return 0;let e=n=>{try{return statSync(n).size}catch{return 0}};return e(t)+e(`${t}-wal`)}function Mf(t,e){return Lf(t)+e*Hd}function Fd(t,e){return Number.isFinite(t)&&Number.isFinite(e)&&t>=e+Qr}function Ld(t){let e=dirname(resolve(t));for(;!existsSync(e);){let n=dirname(e);if(n===e)break;e=n;}return e}function jd(t,e,n){let r=[...new Set([Ld(t),...n?[Ld(n)]:[]])],o=[],s=Number.POSITIVE_INFINITY;for(let c of r)try{let u=statfsSync(c);s=Math.min(s,u.bavail*u.bsize);}catch(u){s=0,o.push(`Unable to inspect free space for ${c}: ${u instanceof Error?u.message:String(u)}`);}let i=Mf(t,e),d=i+Qr;return {estimatedFreeSpaceBytes:i,requiredFreeSpaceBytes:d,availableFreeSpaceBytes:Number.isFinite(s)?Math.floor(s):0,minimumFreeSpaceReserveBytes:Qr,freeSpaceGatePassed:Fd(Number.isFinite(s)?Math.floor(s):0,i),warnings:o}}function Bd(t){return new Set(t.map(e=>e.taskId)).size}function Jn(t){try{let e=t.pragma("wal_checkpoint(TRUNCATE)"),n=Array.isArray(e)?e[0]:e,r=n!==null&&typeof n=="object"&&"busy"in n?Number(n.busy):0;return r>0?`WAL checkpoint(TRUNCATE) busy (${r}); continuing without failing migration`:void 0}catch(e){return `WAL checkpoint(TRUNCATE) warning; continuing without failing migration: ${e instanceof Error?e.message:String(e)}`}}function Yr(t,e,n,r,o=jd(e,n.entryCount)){let s=r.failures??n.failures,i=r.malformedRows??n.malformedRows,{ok:d,...c}=r;return {mode:t,ok:d,dbPath:e,activeTaskCount:r.activeTaskCount??0,taskCount:n.taskCount,candidateTaskCount:n.candidateTaskCount,eligibleTaskCount:n.eligibleTaskCount,statusCounts:n.statusCounts,deferredTaskCount:n.deferredTaskCount,deferredStatusCounts:n.deferredStatusCounts,entryCount:n.entryCount,sourceBytes:n.sourceBytes,estimatedFreeSpaceBytes:o.estimatedFreeSpaceBytes,requiredFreeSpaceBytes:o.requiredFreeSpaceBytes,availableFreeSpaceBytes:o.availableFreeSpaceBytes,minimumFreeSpaceReserveBytes:o.minimumFreeSpaceReserveBytes,freeSpaceGatePassed:o.freeSpaceGatePassed,migratedTasks:r.migratedTasks??0,migratedEntries:r.migratedEntries??0,skippedTasks:r.skippedTasks??n.eventSourceTasks,failedTasks:r.failedTasks??Bd(s),malformedRows:i,failures:s,logicalSourceBytesRemoved:r.logicalSourceBytesRemoved??0,warnings:r.warnings??o.warnings,remainingTaskCount:r.remainingTaskCount??n.candidateTaskCount,...c}}function Hf(t,e){return t.length!==e.length?false:t.every((n,r)=>{let o=e[r];return n.seq===r+1&&n.timestamp===o.timestamp&&n.level===o.level&&n.message===o.message})}function Uf(t,e){return t.transaction(()=>{let r=mn(t,`SELECT id, status, logs, log_storage, last_log_seq, log_revision
349
- FROM tasks WHERE id = ?`,[e]);if(!r)throw new Ee(e,"Task disappeared before migration","metadata");if(r.log_storage==="events")return {status:"skipped",entryCount:0,sourceBytes:0};if(r.log_storage!=="blob")throw new Ee(e,`Unknown log_storage value: ${r.log_storage}`,"invalid-source");if(!$d(r.status))return {status:"deferred",entryCount:0,sourceBytes:0};let o=r.logs,s=qd(e,o);Is(r,"blob");let i=mn(t,"SELECT COUNT(*) AS count FROM task_log_events WHERE task_id = ?",[e])?.count??0;if(i!==0)throw new Ee(e,`Blob source already has ${i} task_log_events row(s)`,"mixed-source");let d=t.prepare(`INSERT INTO task_log_events (task_id, seq, timestamp, level, message)
350
- VALUES (?, ?, ?, ?, ?)`);for(let[p,g]of s.entries.entries())d.run(e,p+1,g.timestamp,g.level,g.message);let c=_n(t,`SELECT seq, timestamp, level, message
351
- FROM task_log_events WHERE task_id = ? ORDER BY seq`,[e]);if(!Hf(c,s.entries))throw new Ee(e,"Event parity check failed before source clear","metadata");if(vf(t,`UPDATE tasks
287
+ LIMIT ${n.limit} OFFSET ${n.offset}`),total:o?.count??0}}catch(o){throw new l("DB_ERROR","Failed to find threads by project",o)}finally{r.close();}}findBySlug(e){if(!this.dbExists())return;let n=this.openHandle(false);try{return n.db.select().from(x).where(eq(x.slug,e)).limit(1).get()??void 0}catch(r){throw new l("DB_ERROR","Failed to find workspace by slug",r)}finally{n.close();}}slugExists(e,n){if(!this.dbExists())return false;let r=this.openHandle(false);try{let o=n?and(eq(x.slug,e),ne(x.id,n)):eq(x.slug,e);return !!r.db.select({id:x.id}).from(x).where(o).limit(1).get()}catch(o){throw new l("DB_ERROR","Failed to check slug",o)}finally{r.close();}}insert(e,n,r,o){let s=this.openHandle(true);try{let i=new Date().toISOString();s.db.insert(x).values({id:e,slug:n,name:r,workspace_path:o,is_active:1,created_at:i,updated_at:i}).run();let d=s.db.select().from(x).where(eq(x.id,e)).limit(1).get();if(!d)throw new l("DB_ERROR","Insert did not return a row");return d}catch(i){throw i instanceof l?i:new l("DB_ERROR","Failed to insert workspace",i)}finally{s.close();}}update(e,n,r){let o=this.openHandle(true);try{o.runRaw(`UPDATE workspaces SET ${n.join(", ")} WHERE id = ?`,r);let s=o.db.select().from(x).where(eq(x.id,e)).limit(1).get();if(!s)throw new l("NOT_FOUND",`Workspace ${e} not found`);return s}catch(s){throw s instanceof l?s:new l("DB_ERROR","Failed to update workspace",s)}finally{o.close();}}cleanupOrphanWorkspaces(){if(!this.dbExists())return {softDeleted:0,checked:0};let e=this.openHandle(true);try{let n=e.db.select({id:x.id,workspace_path:x.workspace_path}).from(x).where(and(eq(x.is_active,1),isNotNull(x.workspace_path))).all(),r=0;for(let o of n){let s=o.workspace_path;existsSync(join(s,"crewx.yaml"))||existsSync(join(s,"crewx.yml"))||(e.db.update(x).set({is_active:0,updated_at:new Date().toISOString()}).where(eq(x.id,o.id)).run(),r+=1);}return {softDeleted:r,checked:n.length}}catch(n){throw new l("DB_ERROR","Failed to cleanup orphan workspaces",n)}finally{e.close();}}delete(e){let n=this.openHandle(true);try{n.db.run(sql`UPDATE threads SET workspace_id = NULL WHERE workspace_id = ${e}`),n.db.delete(x).where(eq(x.id,e)).run();}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to delete workspace",r)}finally{n.close();}}};h();oe();fe();ae();pe();h();var No="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function ll(t){let e=randomBytes(t*2),n="";for(let r=0;r<e.length&&n.length<t;r++){let o=e[r];o<248&&(n+=No[o%62]);}for(;n.length<t;)n+=No[randomBytes(1)[0]%62];return n}function Le(t){return `${t}_${ll(8)}`}function Yi(t,e){let{createHash:n}=gt("crypto"),r=n("sha256").update(e).digest(),o=Buffer.alloc(8);for(let i=0;i<32;i++)o[i%8]^=r[i];let s="";for(let i of o)s+=No[i%62];return `${t}_${s}`}de();var Co=["outcome_plan","contract_check","feature_link","use_verify","result_review"],kl=new Set(Co),na=Object.freeze(Co.map(t=>({key:t,labelOverride:null}))),Tl=new Set(["created","plan_proposed","plan_approved","decision_requested","decision_answered","replanned","stage_advanced","criterion_verified","scene_changed","result_submitted","accepted"]),wl=new Set(["planning","plan_review","running","human_wait","limit_wait","failed_stop","analyzing_feedback","replanned","awaiting_review","accepted"]),yl=new Set(["pending","verifying","passed","failed"]),Rl=new Set(["user","project_manager","system"]),El=new Set(["task","wi","url"]),Sl=/^\d{4}-\d{2}-\d{2}$/;function Q(t){throw new l("VALIDATION",t)}function qe(t){throw new l("NOT_FOUND",t)}function ge(t,e){(typeof t!="string"||t.trim().length===0)&&Q(`${e} is required`);}function bl(t){if(t==null)return;Sl.test(t)||Q("dueDate must use YYYY-MM-DD");let e=new Date(`${t}T00:00:00.000Z`);(Number.isNaN(e.getTime())||e.toISOString().slice(0,10)!==t)&&Q("dueDate must be a valid calendar date");}function ra(t){let e=t??na;(!Array.isArray(e)||e.length===0)&&Q("stages must contain at least one stage");let n=new Set;return e.map(r=>{(!r||typeof r!="object"||Array.isArray(r))&&Q("stage must be an object");let o=r;return ge(o.key,"stage.key"),o.labelOverride!==null&&typeof o.labelOverride!="string"&&Q("stage.labelOverride must be a string or null"),o.labelOverride!==null&&ge(o.labelOverride,"stage.labelOverride"),typeof o.key!="string"&&Q("stage.key is required"),!kl.has(o.key)&&o.labelOverride===null&&Q(`custom stage requires a labelOverride: ${o.key}`),n.has(o.key)&&Q(`duplicate stage key: ${o.key}`),n.add(o.key),{key:o.key,labelOverride:o.labelOverride}})}function Il(t){Array.isArray(t)||Q("criteria must be an array");for(let e of t)ge(e,"criterion.statement");}function en(t={}){let e=t.actorType??"system";Rl.has(e)||Q(`invalid actorType: ${String(e)}`);let n=t.actorId??null;return (e==="user"||e==="project_manager")&&(!n||n.trim().length===0)&&Q(`actorId is required for ${e}`),{actorType:e,actorId:n}}function oa(t,e){let n=t??{};if((n===null||typeof n!="object"||Array.isArray(n))&&Q("event payload must be a JSON object"),e==="accepted")for(let r of ["remainingRisks","nextPlan","lessons","evidenceRefs"])(!Object.prototype.hasOwnProperty.call(n,r)||n[r]===void 0)&&Q(`accepted payload requires ${r}`);try{return JSON.stringify(n)}catch(r){throw new l("VALIDATION","event payload must be JSON serializable",r)}}function vl(t){return Array.isArray(t)||Q("evidence must be an array"),t.map(e=>((!e||typeof e!="object")&&Q("evidence item must be an object"),El.has(e.kind)||Q(`invalid evidence kind: ${String(e.kind)}`),ge(e.ref,"evidence.ref"),e.label!==void 0&&typeof e.label!="string"&&Q("evidence.label must be a string"),e.label===void 0?{kind:e.kind,ref:e.ref}:{kind:e.kind,ref:e.ref,label:e.label}))}function ta(t){let e;try{e=JSON.parse(t);}catch(n){throw new l("DB_ERROR","Project stages JSON is invalid",n)}try{if(!Array.isArray(e))throw new l("DB_ERROR","Project stages JSON is invalid");return ra(e)}catch(n){throw new l("DB_ERROR","Project stages JSON is invalid",n)}}function sa(t){return ge(t.projectId,"projectId"),ge(t.title,"title"),Tl.has(t.type)||Q(`invalid project event type: ${String(t.type)}`),{...en(t),payloadJson:oa(t.payload,t.type)}}function Dt(t,e,n){let r=sa(e);t.select({id:G.id}).from(G).where(eq(G.id,e.projectId)).get()||qe(`Project ${e.projectId} not found`);let s=t.select({maxSeq:sql`COALESCE(MAX(${Ke.seq}), 0)`}).from(Ke).where(eq(Ke.project_id,e.projectId)).get()?.maxSeq??0,i=Le("pje");t.insert(Ke).values({id:i,project_id:e.projectId,seq:s+1,actor_type:r.actorType,actor_id:r.actorId,type:e.type,title:e.title,summary:e.summary??null,payload_json:r.payloadJson,created_at:n}).run();let d=t.select().from(Ke).where(eq(Ke.id,i)).get();if(!d)throw new l("DB_ERROR","Event insert did not return a row");return d}var xo=class extends B{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath??super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(!e&&!existsSync(n))throw new l("NOT_FOUND","Database not found");if(e){let o=dirname(n);existsSync(o)||mkdirSync(o,{recursive:true});}let r=P(n);if(e)try{K(r.db,n);}catch(o){throw r.close(),o}return r}getDetailFromHandle(e,n){let r=e.db.select().from(G).where(eq(G.id,n)).get();if(!r)return;let o=e.db.select().from(Pe).where(eq(Pe.project_id,n)).orderBy(asc(Pe.position)).all();return {...r,stages:ta(r.stages_json),criteria:o}}getDetailOrThrow(e){let n=this.getProject(e);return n||qe(`Project ${e} not found`),n}createProject(e){ge(e.workspaceId,"workspaceId"),ge(e.name,"name"),ge(e.outcome,"outcome"),bl(e.dueDate);let n=ra(e.stages);Il(e.criteria);let r=Le("prj"),o=new Date().toISOString(),s=this.openHandle(true);try{s.db.transaction(i=>{i.insert(G).values({id:r,workspace_id:e.workspaceId,name:e.name,outcome:e.outcome,due_date:e.dueDate??null,scene:"planning",stages_json:JSON.stringify(n),stage_index:1,created_at:o,updated_at:o,accepted_at:null,archived_at:null}).run(),e.criteria.forEach((d,c)=>{i.insert(Pe).values({id:Le("pjc"),project_id:r,position:c+1,statement:d,verify_status:"pending",verified_at:null,evidence_json:"[]",created_at:o,updated_at:o}).run();}),Dt(i,{projectId:r,actorType:"system",type:"created",title:"Project created",payload:{}},o);});}catch(i){throw i instanceof l?i:new l("DB_ERROR","Failed to create project",i)}finally{s.close();}return this.getDetailOrThrow(r)}getProject(e){if(!this.dbExists())return;let n=this.openHandle(false);try{return this.getDetailFromHandle(n,e)}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to get project",r)}finally{n.close();}}listProjectsByWorkspace(e,n={}){if(ge(e,"workspaceId"),!this.dbExists())return [];let r=this.openHandle(false);try{let o=n.includeArchived?eq(G.workspace_id,e):and(eq(G.workspace_id,e),isNull(G.archived_at));return r.db.select({id:G.id}).from(G).where(o).orderBy(desc(G.updated_at),desc(G.created_at)).all().map(i=>this.getDetailFromHandle(r,i.id)).filter(i=>i!==void 0)}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to list projects",o)}finally{r.close();}}archiveProject(e){ge(e,"projectId");let n=this.openHandle(true);try{n.db.update(G).set({archived_at:new Date().toISOString()}).where(eq(G.id,e)).run().changes===0&&qe(`Project ${e} not found`);}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to archive project",r)}finally{n.close();}return this.getDetailOrThrow(e)}setScene(e,n,r={}){ge(e,"projectId"),wl.has(n)||Q(`invalid project scene: ${String(n)}`);let o=en(r),s=new Date().toISOString(),i=this.openHandle(true);try{i.db.transaction(d=>{let c=d.select().from(G).where(eq(G.id,e)).get();c||qe(`Project ${e} not found`),d.update(G).set({scene:n,updated_at:s}).where(eq(G.id,e)).run(),Dt(d,{projectId:e,...o,type:"scene_changed",title:"Project scene changed",payload:{before:c.scene,after:n}},s);});}catch(d){throw d instanceof l?d:new l("DB_ERROR","Failed to set project scene",d)}finally{i.close();}return this.getDetailOrThrow(e)}setStageIndex(e,n,r={}){ge(e,"projectId"),Number.isInteger(n)||Q("stage index must be an integer");let o=en(r),s=new Date().toISOString(),i=this.openHandle(true);try{i.db.transaction(d=>{let c=d.select().from(G).where(eq(G.id,e)).get();c||qe(`Project ${e} not found`);let u=ta(c.stages_json);(n<1||n>u.length)&&Q("stage index is outside the project stages"),d.update(G).set({stage_index:n,updated_at:s}).where(eq(G.id,e)).run(),Dt(d,{projectId:e,...o,type:"stage_advanced",title:"Project stage advanced",payload:{before:c.stage_index,after:n}},s);});}catch(d){throw d instanceof l?d:new l("DB_ERROR","Failed to set project stage",d)}finally{i.close();}return this.getDetailOrThrow(e)}setCriterionVerify(e,n,r,o={}){let s=typeof e=="string"?{projectId:typeof r=="string"?e:void 0,criterionId:typeof r=="string"?n:e,verifyStatus:typeof r=="string"?r:n,...typeof r=="string"?o:r}:e,i=s.verifyStatus??s.status;(!i||!yl.has(i))&&Q(`invalid criterion status: ${String(i)}`),ge(s.criterionId,"criterionId");let d=en(s),c=new Date().toISOString(),u=this.openHandle(true),f;try{u.db.transaction(g=>{let m=g.select().from(Pe).where(eq(Pe.id,s.criterionId)).get();m||qe(`Criterion ${s.criterionId} not found`),f=m.project_id,s.projectId&&s.projectId!==m.project_id&&qe(`Criterion ${s.criterionId} not found in project ${s.projectId}`),g.update(Pe).set({verify_status:i,verified_at:i==="passed"?c:null,updated_at:c}).where(eq(Pe.id,s.criterionId)).run(),Dt(g,{projectId:m.project_id,...d,type:"criterion_verified",title:"Criterion verification updated",payload:{criterionId:s.criterionId,status:i}},c);});}catch(g){throw g instanceof l?g:new l("DB_ERROR","Failed to set criterion verification",g)}finally{u.close();}let p=f?this.getProject(f)?.criteria.find(g=>g.id===s.criterionId):void 0;return p||qe(`Criterion ${s.criterionId} not found`),p}setCriterionEvidence(e,n,r,o={}){let s=typeof e=="string"?{projectId:Array.isArray(r)?e:void 0,criterionId:Array.isArray(r)?n:e,evidence:Array.isArray(r)?r:n,...Array.isArray(r)?o:r}:e;ge(s.criterionId,"criterionId");let i=vl(s.evidence),d=en(s),c=new Date().toISOString(),u=this.openHandle(true),f;try{u.db.transaction(g=>{let m=g.select().from(Pe).where(eq(Pe.id,s.criterionId)).get();m||qe(`Criterion ${s.criterionId} not found`),f=m.project_id,s.projectId&&s.projectId!==m.project_id&&qe(`Criterion ${s.criterionId} not found in project ${s.projectId}`),g.update(Pe).set({evidence_json:JSON.stringify(i),updated_at:c}).where(eq(Pe.id,s.criterionId)).run(),Dt(g,{projectId:m.project_id,...d,type:"criterion_verified",title:"Criterion evidence updated",payload:{criterionId:s.criterionId,evidence:i}},c);});}catch(g){throw g instanceof l?g:new l("DB_ERROR","Failed to set criterion evidence",g)}finally{u.close();}let p=f?this.getProject(f)?.criteria.find(g=>g.id===s.criterionId):void 0;return p||qe(`Criterion ${s.criterionId} not found`),p}appendEvent(e,n){let r=typeof e=="string"?{...n,projectId:e}:e;sa(r);let o=new Date().toISOString(),s=this.openHandle(true),i;try{s.db.transaction(d=>{i=Dt(d,r,o);});}catch(d){throw d instanceof l?d:new l("DB_ERROR","Failed to append project event",d)}finally{s.close();}if(!i)throw new l("DB_ERROR","Event append did not return a row");return i}listEvents(e,n={}){if(ge(e,"projectId"),n.afterSeq!==void 0&&(!Number.isInteger(n.afterSeq)||n.afterSeq<0)&&Q("afterSeq must be a non-negative integer"),n.limit!==void 0&&(!Number.isInteger(n.limit)||n.limit<1)&&Q("limit must be a positive integer"),!this.dbExists())return [];let r=this.openHandle(false);try{let o=[eq(Ke.project_id,e)];n.afterSeq!==void 0&&o.push(gt$1(Ke.seq,n.afterSeq));let s=r.db.select().from(Ke).where(and(...o)).orderBy(asc(Ke.seq));return n.limit!==void 0&&(s=s.limit(n.limit)),s.all()}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to list project events",o)}finally{r.close();}}acceptProject(e,n){ge(e,"projectId");let r=en(n),o={remainingRisks:n.remainingRisks,nextPlan:n.nextPlan,lessons:n.lessons,evidenceRefs:n.evidenceRefs};oa(o,"accepted");let s=new Date().toISOString(),i=this.openHandle(true);try{i.db.transaction(d=>{d.select({id:G.id}).from(G).where(eq(G.id,e)).get()||qe(`Project ${e} not found`),d.update(G).set({scene:"accepted",accepted_at:s,updated_at:s}).where(eq(G.id,e)).run(),Dt(d,{projectId:e,...r,type:"accepted",title:"Project accepted",payload:o},s);});}catch(d){throw d instanceof l?d:new l("DB_ERROR","Failed to accept project",d)}finally{i.close();}return this.getDetailOrThrow(e)}};fe();ae();h();ae();de();var da=[x,a,w,mt,ot,$e,Jt];function Nl(){return Ne__default.join(si.homedir(),".crewx","crewx.db")}function xl(t){if(!ia__default.existsSync(t))return null;let e=Math.floor(Date.now()/1e3),n=`${t}.bak-${e}`;return ia__default.copyFileSync(t,n),n}function ca(t){let e=t.all("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'");return new Set(e.map(n=>n.name))}function Cl(t){return t==null||typeof t=="object"&&"queryChunks"in t?null:typeof t=="number"?String(t):typeof t=="boolean"?t?"1":"0":typeof t=="string"?`'${t.replace(/'/g,"''")}'`:String(t)}function Pl(t){let e=t.getSQLType(),n=`"${t.name}" ${e}`,r=Cl(t.default);return r!==null&&(n+=` DEFAULT ${r}`),t.notNull&&(n+=" NOT NULL"),n}function Dl(t,e){let n=e?.dbPath??Nl(),r=e?.force??false,o=e?.dryRun??false,s=o?null:xl(n);if(r&&!o)try{t.run("DELETE FROM __drizzle_migrations");}catch{}let i=ca(t);if(!o)try{Vt(t);}catch(p){let g=p instanceof Error?`${p.message} ${p.cause?.message??""}`:"";if(!r||!g.includes("duplicate column"))throw p}let d,c;o?(d=da.map(g=>getTableConfig(g).name).filter(g=>!i.has(g)),c=i):(c=ca(t),d=[...c].filter(p=>!i.has(p)));let u=[],f=[];for(let p of da){let g=getTableConfig(p),m=g.name;if(!c.has(m))continue;let _=t.all(`PRAGMA table_info("${m}")`),k=new Set(_.map(S=>S.name)),T=new Set(g.columns.map(S=>S.name));for(let S of g.columns)if(!k.has(S.name)){if(!o){let D=Pl(S);t.run(`ALTER TABLE "${m}" ADD COLUMN ${D}`);}u.push({table:m,column:S.name});}for(let S of _)T.has(S.name)||f.push(`${m}.${S.name} exists in DB but not in schema (untouched)`);}return {created:d,altered:u,warnings:f,backupPath:s}}de();Wn();Ts();Gn();jn();Wn();h();oe();h();var Fd=["success","failed","completed"],no=10*1024*1024*1024,Bd=256,Ff=new Set(Fd),Re=class extends Error{constructor(n,r,o="metadata"){super(r);this.taskId=n;this.kind=o;this.name="MigrationTaskError";}taskId;kind};function ro(t){return t||(process.env.CREWX_DB?process.env.CREWX_DB:process.env.CREWX_TRACES_DB?process.env.CREWX_TRACES_DB:join(homedir(),".crewx","crewx.db"))}function Bf(){return gt("better-sqlite3")}function jd(t,e){let n=t===":memory:";if(!n&&!existsSync(t))throw new Error(`Database not found: ${t}`);let r=new(Bf())(t,{readonly:e,fileMustExist:!n,timeout:5e3});return r.pragma("foreign_keys = ON"),r.pragma("busy_timeout = 5000"),r}function wn(t,e,n=[]){return t.prepare(e).all(...n)}function Tn(t,e,n=[]){return t.prepare(e).get(...n)}function jf(t,e,n=[]){return t.prepare(e).run(...n)}function zf(t,e,n=[]){return t.prepare(e).iterate(...n)}function Gf(t){return typeof t=="string"&&t.length>0?t:"<unknown>"}function zd(t){return typeof t=="string"&&Ff.has(t)}function Ud(t,e){t.set(e,(t.get(e)??0)+1);}function $d(t){return Object.fromEntries([...t.entries()].sort(([e],[n])=>e.localeCompare(n)))}function Wf(t){let e=new Set(wn(t,"SELECT name FROM sqlite_master WHERE type = 'table' AND name IN ('tasks', 'task_log_events')").map(i=>i.name)),n=["tasks","task_log_events"].filter(i=>!e.has(i));if(n.length>0)throw new Error(`Database schema is missing required table(s): ${n.join(", ")}`);let r=new Set(wn(t,"PRAGMA table_info('tasks')").map(i=>i.name)),s=["id","status","logs","log_storage","last_log_seq","log_revision"].filter(i=>!r.has(i));if(s.length>0)throw new Error(`Database schema is missing required tasks column(s): ${s.join(", ")}`)}function Gd(t,e){if(e==null)return {entries:[]};if(typeof e!="string")throw new Re(t,"Malformed task logs: tasks.logs must be JSON text or null","malformed");if(e.trim()==="")return {entries:[]};let n;try{n=JSON.parse(e);}catch(o){let s=o instanceof Error?o.message:String(o);throw new Re(t,`Malformed JSON in tasks.logs (${s})`,"malformed")}if(!Array.isArray(n))throw new Re(t,"Malformed task logs: expected a JSON array","malformed");let r=[];for(let[o,s]of n.entries()){if(s===null||typeof s!="object"||typeof s.timestamp!="string"||typeof s.level!="string"||typeof s.message!="string")throw new Re(t,`Malformed task logs: entry ${o} must contain string timestamp, level, and message fields`,"malformed");let i=s;r.push({timestamp:i.timestamp,level:i.level,message:i.message});}return {entries:r}}function Ns(t,e){if(!Number.isInteger(t.last_log_seq)||t.last_log_seq<0)throw new Re(t.id,"Invalid last_log_seq metadata","metadata");if(!Number.isInteger(t.log_revision)||t.log_revision<0)throw new Re(t.id,"Invalid log_revision metadata","metadata");if(e==="blob"&&t.last_log_seq!==0)throw new Re(t.id,"Blob source must have last_log_seq=0","metadata")}function Vf(t){let e=wn(t,`SELECT task_id, COUNT(*) AS event_count
288
+ FROM task_log_events GROUP BY task_id`);return new Map(e.map(n=>[n.task_id,n.event_count]))}function Kf(t){let e=Vf(t),n=new Map,r=[],o=[],s=[],i=new Map,d=new Map,c=0,u=0,f=0,p=0,g=0,m=0;for(let _ of zf(t,`SELECT id, status, logs, log_storage, last_log_seq, log_revision
289
+ FROM tasks ORDER BY id`)){let k=_,T=Gf(k.status);if(Ud(i,T),n.set(k.id,{id:k.id,status:k.status,log_storage:k.log_storage,last_log_seq:k.last_log_seq,log_revision:k.log_revision}),c+=1,k.log_storage==="events"){p+=1;try{Ns(k,"events");}catch(R){s.push(xs(R,k.id));}k.logs!==null&&s.push({taskId:k.id,reason:"Event source still has a non-null tasks.logs blob",kind:"mixed-source"});continue}if(k.log_storage!=="blob"){s.push({taskId:k.id,reason:`Unknown log_storage value: ${k.log_storage}`,kind:"invalid-source"});continue}u+=1;let S=zd(k.status);S||(f+=1,Ud(d,T)),typeof k.logs=="string"?m+=Buffer.byteLength(k.logs,"utf8"):Buffer.isBuffer(k.logs)&&(m+=k.logs.byteLength);let D=e.get(k.id)??0;D>0&&s.push({taskId:k.id,reason:`Blob source already has ${D} task_log_events row(s)`,kind:"mixed-source"});let U;try{U=Gd(k.id,k.logs),g+=U.entries.length,Ns(k,"blob");}catch(R){let O=xs(R,k.id);s.push(O),O.kind==="malformed"&&o.push(O);continue}D>0||S&&r.push(k.id);}return {taskCount:c,candidateTaskCount:u,eligibleTaskCount:r.length,eventSourceTasks:p,statusCounts:$d(i),deferredTaskCount:f,deferredStatusCounts:$d(d),entryCount:g,sourceBytes:m,candidateIds:r,malformedRows:o,failures:s,tasks:n}}function xs(t,e){return t instanceof Re?{taskId:t.taskId,reason:t.message,kind:t.kind}:{taskId:e,reason:t instanceof Error?t.message:String(t),kind:"metadata"}}function Jf(t){return Tn(t,"SELECT COUNT(*) AS count FROM tasks WHERE status IN ('pending', 'running')")?.count??0}function Yf(t){return Tn(t,"SELECT COUNT(*) AS count FROM tasks WHERE log_storage = 'blob'")?.count??0}function Xf(t){if(t===":memory:")return 0;let e=n=>{try{return statSync(n).size}catch{return 0}};return e(t)+e(`${t}-wal`)}function Qf(t,e){return Xf(t)+e*Bd}function Wd(t,e){return Number.isFinite(t)&&Number.isFinite(e)&&t>=e+no}function qd(t){let e=dirname(resolve(t));for(;!existsSync(e);){let n=dirname(e);if(n===e)break;e=n;}return e}function Vd(t,e,n){let r=[...new Set([qd(t),...n?[qd(n)]:[]])],o=[],s=Number.POSITIVE_INFINITY;for(let c of r)try{let u=statfsSync(c);s=Math.min(s,u.bavail*u.bsize);}catch(u){s=0,o.push(`Unable to inspect free space for ${c}: ${u instanceof Error?u.message:String(u)}`);}let i=Qf(t,e),d=i+no;return {estimatedFreeSpaceBytes:i,requiredFreeSpaceBytes:d,availableFreeSpaceBytes:Number.isFinite(s)?Math.floor(s):0,minimumFreeSpaceReserveBytes:no,freeSpaceGatePassed:Wd(Number.isFinite(s)?Math.floor(s):0,i),warnings:o}}function Kd(t){return new Set(t.map(e=>e.taskId)).size}function Xn(t){try{let e=t.pragma("wal_checkpoint(TRUNCATE)"),n=Array.isArray(e)?e[0]:e,r=n!==null&&typeof n=="object"&&"busy"in n?Number(n.busy):0;return r>0?`WAL checkpoint(TRUNCATE) busy (${r}); continuing without failing migration`:void 0}catch(e){return `WAL checkpoint(TRUNCATE) warning; continuing without failing migration: ${e instanceof Error?e.message:String(e)}`}}function eo(t,e,n,r,o=Vd(e,n.entryCount)){let s=r.failures??n.failures,i=r.malformedRows??n.malformedRows,{ok:d,...c}=r;return {mode:t,ok:d,dbPath:e,activeTaskCount:r.activeTaskCount??0,taskCount:n.taskCount,candidateTaskCount:n.candidateTaskCount,eligibleTaskCount:n.eligibleTaskCount,statusCounts:n.statusCounts,deferredTaskCount:n.deferredTaskCount,deferredStatusCounts:n.deferredStatusCounts,entryCount:n.entryCount,sourceBytes:n.sourceBytes,estimatedFreeSpaceBytes:o.estimatedFreeSpaceBytes,requiredFreeSpaceBytes:o.requiredFreeSpaceBytes,availableFreeSpaceBytes:o.availableFreeSpaceBytes,minimumFreeSpaceReserveBytes:o.minimumFreeSpaceReserveBytes,freeSpaceGatePassed:o.freeSpaceGatePassed,migratedTasks:r.migratedTasks??0,migratedEntries:r.migratedEntries??0,skippedTasks:r.skippedTasks??n.eventSourceTasks,failedTasks:r.failedTasks??Kd(s),malformedRows:i,failures:s,logicalSourceBytesRemoved:r.logicalSourceBytesRemoved??0,warnings:r.warnings??o.warnings,remainingTaskCount:r.remainingTaskCount??n.candidateTaskCount,...c}}function Zf(t,e){return t.length!==e.length?false:t.every((n,r)=>{let o=e[r];return n.seq===r+1&&n.timestamp===o.timestamp&&n.level===o.level&&n.message===o.message})}function eg(t,e){return t.transaction(()=>{let r=Tn(t,`SELECT id, status, logs, log_storage, last_log_seq, log_revision
290
+ FROM tasks WHERE id = ?`,[e]);if(!r)throw new Re(e,"Task disappeared before migration","metadata");if(r.log_storage==="events")return {status:"skipped",entryCount:0,sourceBytes:0};if(r.log_storage!=="blob")throw new Re(e,`Unknown log_storage value: ${r.log_storage}`,"invalid-source");if(!zd(r.status))return {status:"deferred",entryCount:0,sourceBytes:0};let o=r.logs,s=Gd(e,o);Ns(r,"blob");let i=Tn(t,"SELECT COUNT(*) AS count FROM task_log_events WHERE task_id = ?",[e])?.count??0;if(i!==0)throw new Re(e,`Blob source already has ${i} task_log_events row(s)`,"mixed-source");let d=t.prepare(`INSERT INTO task_log_events (task_id, seq, timestamp, level, message)
291
+ VALUES (?, ?, ?, ?, ?)`);for(let[p,g]of s.entries.entries())d.run(e,p+1,g.timestamp,g.level,g.message);let c=wn(t,`SELECT seq, timestamp, level, message
292
+ FROM task_log_events WHERE task_id = ? ORDER BY seq`,[e]);if(!Zf(c,s.entries))throw new Re(e,"Event parity check failed before source clear","metadata");if(jf(t,`UPDATE tasks
352
293
  SET log_storage = 'events', last_log_seq = ?, log_revision = log_revision + 1, logs = NULL
353
- WHERE id = ? AND log_storage = 'blob' AND logs IS ?`,[s.entries.length,e,o]).changes!==1)throw new Ee(e,"Task changed while migration was in progress","metadata");let f=mn(t,`SELECT id, status, logs, log_storage, last_log_seq, log_revision
354
- FROM tasks WHERE id = ?`,[e]);if(!f||f.log_storage!=="events"||f.logs!==null||f.last_log_seq!==s.entries.length||f.log_revision!==r.log_revision+1)throw new Ee(e,"Final task metadata parity check failed","metadata");return {status:"migrated",entryCount:s.entries.length,sourceBytes:typeof o=="string"?Buffer.byteLength(o,"utf8"):Buffer.isBuffer(o)?o.byteLength:0}}).immediate()}function zd(t){let e=new Date().toISOString().replace(/[-:.TZ]/g,"").slice(0,14),n=randomBytes(6).toString("hex");return `${t}.task-log-backup-${e}-${n}.sqlite`}async function $f(t,e,n){let r=n??zd(e);if(resolve(r)===resolve(e))throw new Error("Backup path must be different from the source database");if(existsSync(r))throw new Error(`Refusing to overwrite existing backup: ${r}`);if(mkdirSync(dirname(r),{recursive:true}),await t.backup(r),!existsSync(r))throw new Error(`SQLite backup was not created: ${r}`);let o=Ud(r,true);try{let s=o.pragma("integrity_check",{simple:!0});if(s!=="ok")throw new Error(`Backup integrity check failed: ${s}`)}finally{o.close();}return r}function qf(t){let e=_n(t,`SELECT task_id AS taskId,
294
+ WHERE id = ? AND log_storage = 'blob' AND logs IS ?`,[s.entries.length,e,o]).changes!==1)throw new Re(e,"Task changed while migration was in progress","metadata");let f=Tn(t,`SELECT id, status, logs, log_storage, last_log_seq, log_revision
295
+ FROM tasks WHERE id = ?`,[e]);if(!f||f.log_storage!=="events"||f.logs!==null||f.last_log_seq!==s.entries.length||f.log_revision!==r.log_revision+1)throw new Re(e,"Final task metadata parity check failed","metadata");return {status:"migrated",entryCount:s.entries.length,sourceBytes:typeof o=="string"?Buffer.byteLength(o,"utf8"):Buffer.isBuffer(o)?o.byteLength:0}}).immediate()}function Jd(t){let e=new Date().toISOString().replace(/[-:.TZ]/g,"").slice(0,14),n=randomBytes(6).toString("hex");return `${t}.task-log-backup-${e}-${n}.sqlite`}async function tg(t,e,n){let r=n??Jd(e);if(resolve(r)===resolve(e))throw new Error("Backup path must be different from the source database");if(existsSync(r))throw new Error(`Refusing to overwrite existing backup: ${r}`);if(mkdirSync(dirname(r),{recursive:true}),await t.backup(r),!existsSync(r))throw new Error(`SQLite backup was not created: ${r}`);let o=jd(r,true);try{let s=o.pragma("integrity_check",{simple:!0});if(s!=="ok")throw new Error(`Backup integrity check failed: ${s}`)}finally{o.close();}return r}function ng(t){let e=wn(t,`SELECT task_id AS taskId,
355
296
  COUNT(*) AS eventCount,
356
297
  COUNT(DISTINCT seq) AS distinctSeqCount,
357
298
  MIN(seq) AS minSeq,
358
299
  MAX(seq) AS maxSeq
359
- FROM task_log_events GROUP BY task_id`),n=e.reduce((r,o)=>r+o.eventCount,0);return {rows:e,eventCount:n}}function Rt(t,e,n,r={}){return {taskId:t,kind:e,reason:n,...r}}function Ff(t,e,n){let r=[];for(let p of n.failures)p.kind==="malformed"?r.push(Rt(p.taskId,"malformed-blob",p.reason)):p.kind==="mixed-source"?r.push(Rt(p.taskId,"mixed-source",p.reason)):r.push(Rt(p.taskId,"source-invariant",p.reason));let o=qf(t),s=new Map(o.rows.map(p=>[p.taskId,p]));for(let p of o.rows){let g=n.tasks.get(p.taskId);if(!g){r.push(Rt(null,"orphan-event",`Event rows reference missing task ${p.taskId}`,{actual:p.eventCount}));continue}(p.minSeq===null||p.minSeq<1||p.distinctSeqCount!==p.maxSeq)&&r.push(Rt(g.id,"seq-gap","Task event sequence has a gap or invalid starting sequence",{expected:p.maxSeq??0,actual:p.distinctSeqCount})),g.log_storage==="events"&&g.last_log_seq!==p.eventCount&&r.push(Rt(g.id,"count-mismatch","last_log_seq does not match task_log_events row count",{expected:g.last_log_seq??0,actual:p.eventCount}));}for(let p of n.tasks.values())p.log_storage==="events"&&!s.has(p.id)&&p.last_log_seq!==0&&r.push(Rt(p.id,"count-mismatch","Event-source task has no rows for its last_log_seq",{expected:p.last_log_seq??0,actual:0}));for(let p of _n(t,`SELECT task_id AS taskId, seq, COUNT(*) AS duplicateCount
360
- FROM task_log_events GROUP BY task_id, seq HAVING COUNT(*) > 1`))r.push(Rt(p.taskId,"duplicate-seq",`Duplicate task event sequence ${p.seq}`,{actual:p.duplicateCount,seq:p.seq}));let i=mn(t,`SELECT COUNT(*) AS count FROM task_log_events
361
- WHERE seq IS NULL OR seq < 1 OR timestamp IS NULL OR level IS NULL OR message IS NULL`)?.count??0;i>0&&r.push(Rt(null,"invalid-event","Event rows contain invalid sequence or null payload fields",{actual:i}));let d=new Set(r.flatMap(p=>p.taskId?[p.taskId]:[])),c=r.map(p=>({taskId:p.taskId??"(orphan)",reason:p.reason,kind:p.kind==="malformed-blob"?"malformed":p.kind==="mixed-source"?"mixed-source":"metadata"})),u=c.filter(p=>p.kind==="malformed"),f={checkedTasks:n.taskCount,eventSourceTasks:n.eventSourceTasks,blobSourceTasks:n.candidateTaskCount,eventCount:o.eventCount,orphanEventCount:r.filter(p=>p.kind==="orphan-event").length,failedTasks:d.size,issues:r};return Yr("verify",e,n,{ok:r.length===0,migratedTasks:n.eventSourceTasks,migratedEntries:o.eventCount,skippedTasks:n.candidateTaskCount,failedTasks:d.size,malformedRows:u,failures:c,remainingTaskCount:n.candidateTaskCount,verification:f})}function jf(t){if(t.mode!=="apply"&&t.batchTasks!==void 0)throw new Error("--batch-tasks is only valid with --apply");if(t.batchTasks!==void 0&&(!Number.isInteger(t.batchTasks)||t.batchTasks<1))throw new Error("--batch-tasks must be a positive integer")}async function Bf(t){jf(t);let e=Zr(t.dbPath),n=Ud(e,t.mode!=="apply");try{Cf(n);let r=xf(n),o=Pf(n);if(t.mode==="verify")return {...Ff(n,e,r),activeTaskCount:o};if(t.mode==="dry-run")return Yr("dry-run",e,r,{ok:r.failures.length===0,activeTaskCount:o,skippedTasks:r.eventSourceTasks,remainingTaskCount:r.candidateTaskCount});let s=t.backupPath??zd(e),i=jd(e,r.entryCount,s);if(!i.freeSpaceGatePassed)return Yr("apply",e,r,{ok:!1,activeTaskCount:o,blockedReason:`Apply blocked: available free space (${i.availableFreeSpaceBytes} bytes) is below the required ${i.requiredFreeSpaceBytes} bytes (including a ${i.minimumFreeSpaceReserveBytes} byte reserve)`,skippedTasks:r.eventSourceTasks,remainingTaskCount:r.candidateTaskCount},i);let d=await $f(n,e,s),c=[...r.failures],u=t.batchTasks===void 0?r.candidateIds:r.candidateIds.slice(0,t.batchTasks),f=t.batchTasks??Math.max(u.length,1),p=0,g=0,m=0,w=[...i.warnings];for(let[_,T]of u.entries()){try{let S=Uf(n,T);S.status==="migrated"&&(p+=1,g+=S.entryCount,m+=S.sourceBytes);}catch(S){c.push(vs(S,T));}if((_+1)%f===0||_===u.length-1){let S=Jn(n);S&&w.push(S);}}return Yr("apply",e,r,{ok:c.length===0,activeTaskCount:o,backupPath:d,backupMethod:"sqlite-online-backup",migratedTasks:p,migratedEntries:g,logicalSourceBytesRemoved:m,failedTasks:Bd(c),failures:c,malformedRows:r.malformedRows,remainingTaskCount:Df(n),skippedTasks:r.eventSourceTasks,warnings:w},i)}finally{n.close();}}function zf(t){return basename(t)}Or();zn();es();var to=["success","failed","completed"],Vd=1440*60*1e3,Jd=1,Vf=2048,As=64*1024*1024,xs=[{key:"usageBackfill",field:"metadata.usageBackfill",before:"before_usage_backfill",after:"after_usage_backfill"},{key:"usageAccounting",field:"metadata.usageAccounting",before:"before_usage_accounting",after:"after_usage_accounting"},{key:"usageAccountingReason",field:"metadata.usageAccountingReason",before:"before_usage_accounting_reason",after:"after_usage_accounting_reason"}],Gd=["run_epoch","completed_at","input_tokens","output_tokens","cached_input_tokens","cost_usd","model",...xs.map(t=>t.field)],Jf=20,Yf=["pre-instrumentation","provider-no-usage","suppressed-by-adapter","not-captured"];function Yd(){return ft("better-sqlite3")}function Ps(t,e){let n=Be(t),r=t===":memory:";if(!r&&!existsSync(n))throw new Error(`Database not found: ${n}`);let o=new(Yd())(n,{readonly:e,fileMustExist:!r,timeout:5e3});return o.pragma("foreign_keys = ON"),o.pragma("busy_timeout = 5000"),o}function Yn(t,e,n=[]){return t.prepare(e).all(...n)}function Gt(t,e,n=[]){return t.prepare(e).get(...n)}function Pt(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Wt(t){if(!t)return {};try{let e=JSON.parse(t);return Pt(e)?{...e}:{}}catch{return {}}}function Xd(t){let e=t.provider;if(!(typeof e!="string"||e.trim().length===0))return e.trim()}function Qd(t){return typeof t=="number"&&Number.isFinite(t)?Math.trunc(t):0}function Xf(t){return t??"unknown"}function Qf(t){return to.includes(t)}function Zf(t){return t==="plugin/mock"}function Zd(t,e,n){return Qf(t.status)&&!hn(t)&&t.agent_id!=="workflow"&&t.platform!=="workflow"&&t.platform!=="mcp"&&t.agent_id!=="direct"&&n.direct_call!==true&&!Zf(e)}function eg(t,e){let n=t.usageBackfill;return Pt(n)&&Object.prototype.hasOwnProperty.call(n,String(e))}function tg(t){return typeof t=="string"&&Yf.includes(t)}function ec(t,e){return t.usageAccounting==="recorded"||t.usageAccounting==="unavailable"&&tg(t.usageAccountingReason)?true:eg(t,e)}function ng(t){return Yn(t,`SELECT id, agent_id, status, completed_at, metadata, model, platform, run_epoch,
300
+ FROM task_log_events GROUP BY task_id`),n=e.reduce((r,o)=>r+o.eventCount,0);return {rows:e,eventCount:n}}function yt(t,e,n,r={}){return {taskId:t,kind:e,reason:n,...r}}function rg(t,e,n){let r=[];for(let p of n.failures)p.kind==="malformed"?r.push(yt(p.taskId,"malformed-blob",p.reason)):p.kind==="mixed-source"?r.push(yt(p.taskId,"mixed-source",p.reason)):r.push(yt(p.taskId,"source-invariant",p.reason));let o=ng(t),s=new Map(o.rows.map(p=>[p.taskId,p]));for(let p of o.rows){let g=n.tasks.get(p.taskId);if(!g){r.push(yt(null,"orphan-event",`Event rows reference missing task ${p.taskId}`,{actual:p.eventCount}));continue}(p.minSeq===null||p.minSeq<1||p.distinctSeqCount!==p.maxSeq)&&r.push(yt(g.id,"seq-gap","Task event sequence has a gap or invalid starting sequence",{expected:p.maxSeq??0,actual:p.distinctSeqCount})),g.log_storage==="events"&&g.last_log_seq!==p.eventCount&&r.push(yt(g.id,"count-mismatch","last_log_seq does not match task_log_events row count",{expected:g.last_log_seq??0,actual:p.eventCount}));}for(let p of n.tasks.values())p.log_storage==="events"&&!s.has(p.id)&&p.last_log_seq!==0&&r.push(yt(p.id,"count-mismatch","Event-source task has no rows for its last_log_seq",{expected:p.last_log_seq??0,actual:0}));for(let p of wn(t,`SELECT task_id AS taskId, seq, COUNT(*) AS duplicateCount
301
+ FROM task_log_events GROUP BY task_id, seq HAVING COUNT(*) > 1`))r.push(yt(p.taskId,"duplicate-seq",`Duplicate task event sequence ${p.seq}`,{actual:p.duplicateCount,seq:p.seq}));let i=Tn(t,`SELECT COUNT(*) AS count FROM task_log_events
302
+ WHERE seq IS NULL OR seq < 1 OR timestamp IS NULL OR level IS NULL OR message IS NULL`)?.count??0;i>0&&r.push(yt(null,"invalid-event","Event rows contain invalid sequence or null payload fields",{actual:i}));let d=new Set(r.flatMap(p=>p.taskId?[p.taskId]:[])),c=r.map(p=>({taskId:p.taskId??"(orphan)",reason:p.reason,kind:p.kind==="malformed-blob"?"malformed":p.kind==="mixed-source"?"mixed-source":"metadata"})),u=c.filter(p=>p.kind==="malformed"),f={checkedTasks:n.taskCount,eventSourceTasks:n.eventSourceTasks,blobSourceTasks:n.candidateTaskCount,eventCount:o.eventCount,orphanEventCount:r.filter(p=>p.kind==="orphan-event").length,failedTasks:d.size,issues:r};return eo("verify",e,n,{ok:r.length===0,migratedTasks:n.eventSourceTasks,migratedEntries:o.eventCount,skippedTasks:n.candidateTaskCount,failedTasks:d.size,malformedRows:u,failures:c,remainingTaskCount:n.candidateTaskCount,verification:f})}function og(t){if(t.mode!=="apply"&&t.batchTasks!==void 0)throw new Error("--batch-tasks is only valid with --apply");if(t.batchTasks!==void 0&&(!Number.isInteger(t.batchTasks)||t.batchTasks<1))throw new Error("--batch-tasks must be a positive integer")}async function sg(t){og(t);let e=ro(t.dbPath),n=jd(e,t.mode!=="apply");try{Wf(n);let r=Kf(n),o=Jf(n);if(t.mode==="verify")return {...rg(n,e,r),activeTaskCount:o};if(t.mode==="dry-run")return eo("dry-run",e,r,{ok:r.failures.length===0,activeTaskCount:o,skippedTasks:r.eventSourceTasks,remainingTaskCount:r.candidateTaskCount});let s=t.backupPath??Jd(e),i=Vd(e,r.entryCount,s);if(!i.freeSpaceGatePassed)return eo("apply",e,r,{ok:!1,activeTaskCount:o,blockedReason:`Apply blocked: available free space (${i.availableFreeSpaceBytes} bytes) is below the required ${i.requiredFreeSpaceBytes} bytes (including a ${i.minimumFreeSpaceReserveBytes} byte reserve)`,skippedTasks:r.eventSourceTasks,remainingTaskCount:r.candidateTaskCount},i);let d=await tg(n,e,s),c=[...r.failures],u=t.batchTasks===void 0?r.candidateIds:r.candidateIds.slice(0,t.batchTasks),f=t.batchTasks??Math.max(u.length,1),p=0,g=0,m=0,_=[...i.warnings];for(let[k,T]of u.entries()){try{let S=eg(n,T);S.status==="migrated"&&(p+=1,g+=S.entryCount,m+=S.sourceBytes);}catch(S){c.push(xs(S,T));}if((k+1)%f===0||k===u.length-1){let S=Xn(n);S&&_.push(S);}}return eo("apply",e,r,{ok:c.length===0,activeTaskCount:o,backupPath:d,backupMethod:"sqlite-online-backup",migratedTasks:p,migratedEntries:g,logicalSourceBytesRemoved:m,failedTasks:Kd(c),failures:c,malformedRows:r.malformedRows,remainingTaskCount:Yf(n),skippedTasks:r.eventSourceTasks,warnings:_},i)}finally{n.close();}}function ig(t){return basename(t)}xr();Wn();rs();var so=["success","failed","completed"],Zd=1440*60*1e3,ec=1,ug=2048,Cs=64*1024*1024,Ms=[{key:"usageBackfill",field:"metadata.usageBackfill",before:"before_usage_backfill",after:"after_usage_backfill"},{key:"usageAccounting",field:"metadata.usageAccounting",before:"before_usage_accounting",after:"after_usage_accounting"},{key:"usageAccountingReason",field:"metadata.usageAccountingReason",before:"before_usage_accounting_reason",after:"after_usage_accounting_reason"}],Yd=["run_epoch","completed_at","input_tokens","output_tokens","cached_input_tokens","cost_usd","model",...Ms.map(t=>t.field)],lg=20,pg=["pre-instrumentation","provider-no-usage","suppressed-by-adapter","not-captured"];function tc(){return gt("better-sqlite3")}function Hs(t,e){let n=ze(t),r=t===":memory:";if(!r&&!existsSync(n))throw new Error(`Database not found: ${n}`);let o=new(tc())(n,{readonly:e,fileMustExist:!r,timeout:5e3});return o.pragma("foreign_keys = ON"),o.pragma("busy_timeout = 5000"),o}function Qn(t,e,n=[]){return t.prepare(e).all(...n)}function jt(t,e,n=[]){return t.prepare(e).get(...n)}function xt(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function zt(t){if(!t)return {};try{let e=JSON.parse(t);return xt(e)?{...e}:{}}catch{return {}}}function nc(t){let e=t.provider;if(!(typeof e!="string"||e.trim().length===0))return e.trim()}function rc(t){return typeof t=="number"&&Number.isFinite(t)?Math.trunc(t):0}function fg(t){return t??"unknown"}function gg(t){return so.includes(t)}function hg(t){return t==="plugin/mock"}function oc(t,e,n){return gg(t.status)&&!kn(t)&&t.agent_id!=="workflow"&&t.platform!=="workflow"&&t.platform!=="mcp"&&t.agent_id!=="direct"&&n.direct_call!==true&&!hg(e)}function mg(t,e){let n=t.usageBackfill;return xt(n)&&Object.prototype.hasOwnProperty.call(n,String(e))}function _g(t){return typeof t=="string"&&pg.includes(t)}function sc(t,e){return t.usageAccounting==="recorded"||t.usageAccounting==="unavailable"&&_g(t.usageAccountingReason)?true:mg(t,e)}function kg(t){return Qn(t,`SELECT id, agent_id, status, completed_at, metadata, model, platform, run_epoch,
362
303
  input_tokens, output_tokens, cached_input_tokens, cost_usd
363
304
  FROM tasks
364
305
  WHERE status IN (?, ?, ?)
365
- ORDER BY completed_at ASC, id ASC`,[...to])}function Os(t){let e=ng(t),n=e.flatMap(d=>{let c=Wt(d.metadata),u=Xd(c);return Zd(d,u,c)?[{...d,metadataObject:c,provider:u,epoch:Qd(d.run_epoch)}]:[]}),r=n.filter(d=>!ec(d.metadataObject,d.epoch)),o=Yn(t,`SELECT COUNT(*) AS count
306
+ ORDER BY completed_at ASC, id ASC`,[...so])}function Ps(t){let e=kg(t),n=e.flatMap(d=>{let c=zt(d.metadata),u=nc(c);return oc(d,u,c)?[{...d,metadataObject:c,provider:u,epoch:rc(d.run_epoch)}]:[]}),r=n.filter(d=>!sc(d.metadataObject,d.epoch)),o=Qn(t,`SELECT COUNT(*) AS count
366
307
  FROM tasks
367
308
  WHERE json_valid(metadata) = 1
368
309
  AND json_type(metadata, '$') = 'object'
369
- AND json_extract(metadata, '$.usageAccounting') IN ('recorded', 'unavailable')`)[0]?.count??0,s=Gt(t,"SELECT COUNT(*) AS count FROM tasks")?.count??0,i=Gt(t,"SELECT COUNT(*) AS count FROM tasks WHERE status IN (?, ?, ?)",[...to])?.count??e.length;return {scannedTasks:s,terminalTasks:i,rawTargetRows:n,candidates:r,accountingTasks:o}}function tc(t){return !t||t==="unknown"||t==="cli/unknown"?"pre-instrumentation":t==="cli/antigravity"||t.startsWith("acp/")||t.startsWith("remote/")?"provider-no-usage":t==="cli/codex"||t==="cli/opencode"?"suppressed-by-adapter":"not-captured"}function rg(t){let e=t instanceof Date?t.getTime():t===void 0?Date.now():new Date(t).getTime();if(!Number.isFinite(e))throw new Error("Usage backfill clock must be a valid date");return e}function og(t,e){if(!t)return false;let n=Date.parse(t);return Number.isFinite(n)&&n>=e-Vd}function sg(t,e,n){let r=tc(t.provider),o;try{o=$r({taskLogRepository:e,taskId:t.id,provider:t.provider,model:t.model})?.usage;}catch{o=void 0;}return o?{candidate:t,outcome:"recovered",usage:o}:og(t.completed_at,n)?{candidate:t,outcome:"deferred",reason:r}:{candidate:t,outcome:"unavailable",reason:r}}function ig(t,e,n){let r=Xf(e),o=t[r]??{candidates:0,recovered:0,unavailable:0,deferred:0};o.candidates+=1,o[n]+=1,t[r]=o;}function ag(t,e){e&&(t[e]+=1);}function dg(){return {"pre-instrumentation":0,"provider-no-usage":0,"suppressed-by-adapter":0,"not-captured":0}}function cg(t){return Object.fromEntries(Object.entries(t).sort(([e],[n])=>e.localeCompare(n)))}function Wd(t,e,n,r,o){let s=Wt(t),i=Pt(s.usageBackfill)?{...s.usageBackfill}:{};return i[String(e)]={at:n},s.usageBackfill=i,s.usageAccounting=r,r==="unavailable"&&o?s.usageAccountingReason=o:delete s.usageAccountingReason,JSON.stringify(s)}function ug(t,e){let n=Wt(t.metadata),r=Xd(n);return Zd(t,r,n)&&t.id===e.id&&r===e.provider&&Qd(t.run_epoch)===e.epoch&&t.completed_at===e.completed_at&&!ec(n,e.epoch)}function lg(t,e,n){if(e.outcome!=="deferred"){if(e.outcome==="unavailable")return {...t,metadata:Wd(t.metadata,e.candidate.epoch,n,"unavailable",e.reason)};if(e.usage)return {...t,input_tokens:e.usage.inputTokens,output_tokens:e.usage.outputTokens,cached_input_tokens:e.usage.cachedInputTokens,cost_usd:e.usage.costUsd,metadata:Wd(t.metadata,e.candidate.epoch,n,"recorded"),model:t.model===null&&e.usage.model?e.usage.model:t.model}}}function pg(t,e,n,r){return t.transaction(()=>{let s=Gt(t,`SELECT id, agent_id, status, completed_at, metadata, model, platform, run_epoch,
310
+ AND json_extract(metadata, '$.usageAccounting') IN ('recorded', 'unavailable')`)[0]?.count??0,s=jt(t,"SELECT COUNT(*) AS count FROM tasks")?.count??0,i=jt(t,"SELECT COUNT(*) AS count FROM tasks WHERE status IN (?, ?, ?)",[...so])?.count??e.length;return {scannedTasks:s,terminalTasks:i,rawTargetRows:n,candidates:r,accountingTasks:o}}function ic(t){return !t||t==="unknown"||t==="cli/unknown"?"pre-instrumentation":t==="cli/antigravity"||t.startsWith("acp/")||t.startsWith("remote/")?"provider-no-usage":t==="cli/codex"||t==="cli/opencode"?"suppressed-by-adapter":"not-captured"}function Tg(t){let e=t instanceof Date?t.getTime():t===void 0?Date.now():new Date(t).getTime();if(!Number.isFinite(e))throw new Error("Usage backfill clock must be a valid date");return e}function wg(t,e){if(!t)return false;let n=Date.parse(t);return Number.isFinite(n)&&n>=e-Zd}function yg(t,e,n){let r=ic(t.provider),o;try{o=jr({taskLogRepository:e,taskId:t.id,provider:t.provider,model:t.model})?.usage;}catch{o=void 0;}return o?{candidate:t,outcome:"recovered",usage:o}:wg(t.completed_at,n)?{candidate:t,outcome:"deferred",reason:r}:{candidate:t,outcome:"unavailable",reason:r}}function Rg(t,e,n){let r=fg(e),o=t[r]??{candidates:0,recovered:0,unavailable:0,deferred:0};o.candidates+=1,o[n]+=1,t[r]=o;}function Eg(t,e){e&&(t[e]+=1);}function Sg(){return {"pre-instrumentation":0,"provider-no-usage":0,"suppressed-by-adapter":0,"not-captured":0}}function bg(t){return Object.fromEntries(Object.entries(t).sort(([e],[n])=>e.localeCompare(n)))}function Xd(t,e,n,r,o){let s=zt(t),i=xt(s.usageBackfill)?{...s.usageBackfill}:{};return i[String(e)]={at:n},s.usageBackfill=i,s.usageAccounting=r,r==="unavailable"&&o?s.usageAccountingReason=o:delete s.usageAccountingReason,JSON.stringify(s)}function Ig(t,e){let n=zt(t.metadata),r=nc(n);return oc(t,r,n)&&t.id===e.id&&r===e.provider&&rc(t.run_epoch)===e.epoch&&t.completed_at===e.completed_at&&!sc(n,e.epoch)}function vg(t,e,n){if(e.outcome!=="deferred"){if(e.outcome==="unavailable")return {...t,metadata:Xd(t.metadata,e.candidate.epoch,n,"unavailable",e.reason)};if(e.usage)return {...t,input_tokens:e.usage.inputTokens,output_tokens:e.usage.outputTokens,cached_input_tokens:e.usage.cachedInputTokens,cost_usd:e.usage.costUsd,metadata:Xd(t.metadata,e.candidate.epoch,n,"recorded"),model:t.model===null&&e.usage.model?e.usage.model:t.model}}}function Ag(t,e,n,r){return t.transaction(()=>{let s=jt(t,`SELECT id, agent_id, status, completed_at, metadata, model, platform, run_epoch,
370
311
  input_tokens, output_tokens, cached_input_tokens, cost_usd
371
- FROM tasks WHERE id = ?`,[n.candidate.id]);if(!s||!ug(s,n.candidate)||n.outcome==="deferred")return "skipped";let i=lg(s,n,r);return i?(_g(e,hg(s,i)),n.outcome==="unavailable"?t.prepare("UPDATE tasks SET metadata = ? WHERE id = ?").run(i.metadata,s.id).changes===1?"changed":"skipped":t.prepare(`UPDATE tasks
312
+ FROM tasks WHERE id = ?`,[n.candidate.id]);if(!s||!Ig(s,n.candidate)||n.outcome==="deferred")return "skipped";let i=vg(s,n,r);return i?(Pg(e,xg(s,i)),n.outcome==="unavailable"?t.prepare("UPDATE tasks SET metadata = ? WHERE id = ?").run(i.metadata,s.id).changes===1?"changed":"skipped":t.prepare(`UPDATE tasks
372
313
  SET input_tokens = ?, output_tokens = ?, cached_input_tokens = ?, cost_usd = ?,
373
314
  metadata = ?, model = ?
374
- WHERE id = ?`).run(i.input_tokens,i.output_tokens,i.cached_input_tokens,i.cost_usd,i.metadata,i.model,s.id).changes===1?"changed":"skipped"):"skipped"}).immediate()}function Kd(t){let e=dirname(resolve(t));for(;!existsSync(e);){let n=dirname(e);if(n===e)break;e=n;}return e}function fg(t,e,n){let r=[...new Set([Kd(t),...n?[Kd(n)]:[]])],o=Number.POSITIVE_INFINITY,s=[];for(let c of r)try{let u=statfsSync(c);o=Math.min(o,u.bavail*u.bsize);}catch(u){o=0,s.push(`Unable to inspect free space for ${c}: ${u instanceof Error?u.message:String(u)}`);}let i=e*Vf,d=Number.isFinite(o)?Math.floor(o):0;return {estimatedFreeSpaceBytes:i,requiredFreeSpaceBytes:i+As,availableFreeSpaceBytes:d,minimumFreeSpaceReserveBytes:As,freeSpaceGatePassed:Number.isFinite(d)&&d>=i+As,warnings:s}}function nc(t){let e=new Date().toISOString().replace(/[-:.TZ]/g,"").slice(0,14),n=randomBytes(6).toString("hex");return `${t}.usage-undo-${e}-${n}.sqlite`}function kn(t,e){if(!Object.prototype.hasOwnProperty.call(t,e))return null;let n=JSON.stringify(t[e]);return n===void 0?null:n}function gg(t){if(t!==null)try{return JSON.parse(t)}catch{throw new Error("Usage undo snapshot contains invalid metadata JSON")}}function Ns(t,e){if(Object.is(t,e))return true;if(Array.isArray(t)||Array.isArray(e))return !Array.isArray(t)||!Array.isArray(e)||t.length!==e.length?false:t.every((n,r)=>Ns(n,e[r]));if(Pt(t)||Pt(e)){if(!Pt(t)||!Pt(e))return false;let n=Object.keys(t).sort(),r=Object.keys(e).sort();return n.length===r.length&&n.every((o,s)=>o===r[s]&&Ns(t[o],e[o]))}return false}function hg(t,e){let n=Wt(t.metadata),r=Wt(e.metadata);return {id:t.id,before_run_epoch:t.run_epoch,after_run_epoch:e.run_epoch,before_completed_at:t.completed_at,after_completed_at:e.completed_at,before_input_tokens:t.input_tokens,after_input_tokens:e.input_tokens,before_output_tokens:t.output_tokens,after_output_tokens:e.output_tokens,before_cached_input_tokens:t.cached_input_tokens,after_cached_input_tokens:e.cached_input_tokens,before_cost_usd:t.cost_usd,after_cost_usd:e.cost_usd,before_model:t.model,after_model:e.model,before_usage_backfill:kn(n,"usageBackfill"),after_usage_backfill:kn(r,"usageBackfill"),before_usage_accounting:kn(n,"usageAccounting"),after_usage_accounting:kn(r,"usageAccounting"),before_usage_accounting_reason:kn(n,"usageAccountingReason"),after_usage_accounting_reason:kn(r,"usageAccountingReason")}}function mg(t,e,n,r){let o=e??nc(t);if(o===":memory:")throw new Error("Usage undo snapshot path must be a file");if(resolve(o)===resolve(t))throw new Error("Undo snapshot path must be different from the source database");if(existsSync(o))throw new Error(`Refusing to overwrite existing undo snapshot: ${o}`);mkdirSync(dirname(o),{recursive:true});let s=Be(o),i=new(Yd())(s,{readonly:false,fileMustExist:false,timeout:5e3});try{return i.pragma("foreign_keys = ON"),i.pragma("busy_timeout = 5000"),i.exec(`
315
+ WHERE id = ?`).run(i.input_tokens,i.output_tokens,i.cached_input_tokens,i.cost_usd,i.metadata,i.model,s.id).changes===1?"changed":"skipped"):"skipped"}).immediate()}function Qd(t){let e=dirname(resolve(t));for(;!existsSync(e);){let n=dirname(e);if(n===e)break;e=n;}return e}function Og(t,e,n){let r=[...new Set([Qd(t),...n?[Qd(n)]:[]])],o=Number.POSITIVE_INFINITY,s=[];for(let c of r)try{let u=statfsSync(c);o=Math.min(o,u.bavail*u.bsize);}catch(u){o=0,s.push(`Unable to inspect free space for ${c}: ${u instanceof Error?u.message:String(u)}`);}let i=e*ug,d=Number.isFinite(o)?Math.floor(o):0;return {estimatedFreeSpaceBytes:i,requiredFreeSpaceBytes:i+Cs,availableFreeSpaceBytes:d,minimumFreeSpaceReserveBytes:Cs,freeSpaceGatePassed:Number.isFinite(d)&&d>=i+Cs,warnings:s}}function ac(t){let e=new Date().toISOString().replace(/[-:.TZ]/g,"").slice(0,14),n=randomBytes(6).toString("hex");return `${t}.usage-undo-${e}-${n}.sqlite`}function yn(t,e){if(!Object.prototype.hasOwnProperty.call(t,e))return null;let n=JSON.stringify(t[e]);return n===void 0?null:n}function Ng(t){if(t!==null)try{return JSON.parse(t)}catch{throw new Error("Usage undo snapshot contains invalid metadata JSON")}}function Ls(t,e){if(Object.is(t,e))return true;if(Array.isArray(t)||Array.isArray(e))return !Array.isArray(t)||!Array.isArray(e)||t.length!==e.length?false:t.every((n,r)=>Ls(n,e[r]));if(xt(t)||xt(e)){if(!xt(t)||!xt(e))return false;let n=Object.keys(t).sort(),r=Object.keys(e).sort();return n.length===r.length&&n.every((o,s)=>o===r[s]&&Ls(t[o],e[o]))}return false}function xg(t,e){let n=zt(t.metadata),r=zt(e.metadata);return {id:t.id,before_run_epoch:t.run_epoch,after_run_epoch:e.run_epoch,before_completed_at:t.completed_at,after_completed_at:e.completed_at,before_input_tokens:t.input_tokens,after_input_tokens:e.input_tokens,before_output_tokens:t.output_tokens,after_output_tokens:e.output_tokens,before_cached_input_tokens:t.cached_input_tokens,after_cached_input_tokens:e.cached_input_tokens,before_cost_usd:t.cost_usd,after_cost_usd:e.cost_usd,before_model:t.model,after_model:e.model,before_usage_backfill:yn(n,"usageBackfill"),after_usage_backfill:yn(r,"usageBackfill"),before_usage_accounting:yn(n,"usageAccounting"),after_usage_accounting:yn(r,"usageAccounting"),before_usage_accounting_reason:yn(n,"usageAccountingReason"),after_usage_accounting_reason:yn(r,"usageAccountingReason")}}function Cg(t,e,n,r){let o=e??ac(t);if(o===":memory:")throw new Error("Usage undo snapshot path must be a file");if(resolve(o)===resolve(t))throw new Error("Undo snapshot path must be different from the source database");if(existsSync(o))throw new Error(`Refusing to overwrite existing undo snapshot: ${o}`);mkdirSync(dirname(o),{recursive:true});let s=ze(o),i=new(tc())(s,{readonly:false,fileMustExist:false,timeout:5e3});try{return i.pragma("foreign_keys = ON"),i.pragma("busy_timeout = 5000"),i.exec(`
375
316
  CREATE TABLE usage_undo_meta (
376
317
  id INTEGER PRIMARY KEY CHECK (id = 1),
377
318
  source_db_path TEXT NOT NULL,
@@ -403,29 +344,29 @@ ${r.join(`
403
344
  after_usage_accounting_reason TEXT
404
345
  );
405
346
  `),i.prepare(`INSERT INTO usage_undo_meta (id, source_db_path, created_at, schema_version, plan_summary)
406
- VALUES (1, ?, ?, ?, ?)`).run(resolve(t),n,Jd,JSON.stringify(r)),{path:o,db:i}}catch(d){throw i.close(),d}}function _g(t,e){t.db.prepare(`INSERT INTO usage_undo_rows (
347
+ VALUES (1, ?, ?, ?, ?)`).run(resolve(t),n,ec,JSON.stringify(r)),{path:o,db:i}}catch(d){throw i.close(),d}}function Pg(t,e){t.db.prepare(`INSERT INTO usage_undo_rows (
407
348
  id, before_run_epoch, after_run_epoch, before_completed_at, after_completed_at,
408
349
  before_input_tokens, after_input_tokens, before_output_tokens, after_output_tokens,
409
350
  before_cached_input_tokens, after_cached_input_tokens, before_cost_usd, after_cost_usd,
410
351
  before_model, after_model, before_usage_backfill, after_usage_backfill,
411
352
  before_usage_accounting, after_usage_accounting,
412
353
  before_usage_accounting_reason, after_usage_accounting_reason
413
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(e.id,e.before_run_epoch,e.after_run_epoch,e.before_completed_at,e.after_completed_at,e.before_input_tokens,e.after_input_tokens,e.before_output_tokens,e.after_output_tokens,e.before_cached_input_tokens,e.after_cached_input_tokens,e.before_cost_usd,e.after_cost_usd,e.before_model,e.after_model,e.before_usage_backfill,e.after_usage_backfill,e.before_usage_accounting,e.after_usage_accounting,e.before_usage_accounting_reason,e.after_usage_accounting_reason);}function kg(t){let e=Yn(t,"SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name").map(n=>n.name);if(e.length!==2||e[0]!=="usage_undo_meta"||e[1]!=="usage_undo_rows")throw new Error("Invalid usage undo snapshot: expected usage_undo_meta and usage_undo_rows tables")}function rc(t){let e=Ps(t,true);try{let n=e.pragma("integrity_check",{simple:!0});if(n!=="ok")throw new Error(`Undo snapshot integrity check failed: ${n}`);kg(e);}finally{e.close();}}function Tg(t,e){if(!existsSync(t))throw new Error(`Usage undo snapshot not found: ${t}`);rc(t);let n=Ps(t,true);try{let r=Gt(n,"SELECT source_db_path, created_at, schema_version, plan_summary FROM usage_undo_meta WHERE id = 1");if(!r)throw new Error("Usage undo snapshot metadata is missing");if(resolve(r.source_db_path)!==resolve(e))throw new Error(`Usage undo snapshot source database ${r.source_db_path} does not match restore target ${resolve(e)}`);if(r.schema_version!==Jd)throw new Error(`Unsupported usage undo snapshot schema version: ${r.schema_version}`);try{let o=JSON.parse(r.plan_summary);if(!Pt(o))throw new Error("plan summary is not an object")}catch(o){throw new Error(`Usage undo snapshot plan summary is invalid: ${o instanceof Error?o.message:String(o)}`)}return {path:t,rows:Yn(n,`SELECT id, before_run_epoch, after_run_epoch, before_completed_at, after_completed_at,
354
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(e.id,e.before_run_epoch,e.after_run_epoch,e.before_completed_at,e.after_completed_at,e.before_input_tokens,e.after_input_tokens,e.before_output_tokens,e.after_output_tokens,e.before_cached_input_tokens,e.after_cached_input_tokens,e.before_cost_usd,e.after_cost_usd,e.before_model,e.after_model,e.before_usage_backfill,e.after_usage_backfill,e.before_usage_accounting,e.after_usage_accounting,e.before_usage_accounting_reason,e.after_usage_accounting_reason);}function Dg(t){let e=Qn(t,"SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name").map(n=>n.name);if(e.length!==2||e[0]!=="usage_undo_meta"||e[1]!=="usage_undo_rows")throw new Error("Invalid usage undo snapshot: expected usage_undo_meta and usage_undo_rows tables")}function dc(t){let e=Hs(t,true);try{let n=e.pragma("integrity_check",{simple:!0});if(n!=="ok")throw new Error(`Undo snapshot integrity check failed: ${n}`);Dg(e);}finally{e.close();}}function Lg(t,e){if(!existsSync(t))throw new Error(`Usage undo snapshot not found: ${t}`);dc(t);let n=Hs(t,true);try{let r=jt(n,"SELECT source_db_path, created_at, schema_version, plan_summary FROM usage_undo_meta WHERE id = 1");if(!r)throw new Error("Usage undo snapshot metadata is missing");if(resolve(r.source_db_path)!==resolve(e))throw new Error(`Usage undo snapshot source database ${r.source_db_path} does not match restore target ${resolve(e)}`);if(r.schema_version!==ec)throw new Error(`Unsupported usage undo snapshot schema version: ${r.schema_version}`);try{let o=JSON.parse(r.plan_summary);if(!xt(o))throw new Error("plan summary is not an object")}catch(o){throw new Error(`Usage undo snapshot plan summary is invalid: ${o instanceof Error?o.message:String(o)}`)}return {path:t,rows:Qn(n,`SELECT id, before_run_epoch, after_run_epoch, before_completed_at, after_completed_at,
414
355
  before_input_tokens, after_input_tokens, before_output_tokens, after_output_tokens,
415
356
  before_cached_input_tokens, after_cached_input_tokens, before_cost_usd, after_cost_usd,
416
357
  before_model, after_model, before_usage_backfill, after_usage_backfill,
417
358
  before_usage_accounting, after_usage_accounting,
418
359
  before_usage_accounting_reason, after_usage_accounting_reason
419
- FROM usage_undo_rows ORDER BY rowid ASC`)}}finally{n.close();}}function oc(t,e,n){let r=t[n==="before"?e.before:e.after];return gg(r)}function wg(t,e){return Object.prototype.hasOwnProperty.call(t,e)?t[e]:void 0}function yg(t,e){let n=[];Object.is(t.run_epoch,e.after_run_epoch)||n.push("run_epoch"),Object.is(t.completed_at,e.after_completed_at)||n.push("completed_at"),Object.is(t.input_tokens,e.after_input_tokens)||n.push("input_tokens"),Object.is(t.output_tokens,e.after_output_tokens)||n.push("output_tokens"),Object.is(t.cached_input_tokens,e.after_cached_input_tokens)||n.push("cached_input_tokens"),Object.is(t.cost_usd,e.after_cost_usd)||n.push("cost_usd"),Object.is(t.model,e.after_model)||n.push("model");let r=Wt(t.metadata);for(let o of xs){let s=oc(e,o,"after");Ns(wg(r,o.key),s)||n.push(o.field);}return n}function Eg(t,e){let n=Wt(t);for(let r of xs){let o=oc(e,r,"before");o===void 0?delete n[r.key]:n[r.key]=o;}return JSON.stringify(n)}function Rg(t,e){return t.transaction(()=>{let r=Gt(t,`SELECT id, agent_id, status, completed_at, metadata, model, platform, run_epoch,
360
+ FROM usage_undo_rows ORDER BY rowid ASC`)}}finally{n.close();}}function cc(t,e,n){let r=t[n==="before"?e.before:e.after];return Ng(r)}function Mg(t,e){return Object.prototype.hasOwnProperty.call(t,e)?t[e]:void 0}function Hg(t,e){let n=[];Object.is(t.run_epoch,e.after_run_epoch)||n.push("run_epoch"),Object.is(t.completed_at,e.after_completed_at)||n.push("completed_at"),Object.is(t.input_tokens,e.after_input_tokens)||n.push("input_tokens"),Object.is(t.output_tokens,e.after_output_tokens)||n.push("output_tokens"),Object.is(t.cached_input_tokens,e.after_cached_input_tokens)||n.push("cached_input_tokens"),Object.is(t.cost_usd,e.after_cost_usd)||n.push("cost_usd"),Object.is(t.model,e.after_model)||n.push("model");let r=zt(t.metadata);for(let o of Ms){let s=cc(e,o,"after");Ls(Mg(r,o.key),s)||n.push(o.field);}return n}function Ug(t,e){let n=zt(t);for(let r of Ms){let o=cc(e,r,"before");o===void 0?delete n[r.key]:n[r.key]=o;}return JSON.stringify(n)}function $g(t,e){return t.transaction(()=>{let r=jt(t,`SELECT id, agent_id, status, completed_at, metadata, model, platform, run_epoch,
420
361
  input_tokens, output_tokens, cached_input_tokens, cost_usd
421
- FROM tasks WHERE id = ?`,[e.id]);if(!r)return {taskId:e.id,fields:[...Gd]};let o=yg(r,e);if(o.length>0)return {taskId:e.id,fields:o};let s=Eg(r.metadata,e);return t.prepare(`UPDATE tasks
362
+ FROM tasks WHERE id = ?`,[e.id]);if(!r)return {taskId:e.id,fields:[...Yd]};let o=Hg(r,e);if(o.length>0)return {taskId:e.id,fields:o};let s=Ug(r.metadata,e);return t.prepare(`UPDATE tasks
422
363
  SET run_epoch = ?, completed_at = ?, input_tokens = ?, output_tokens = ?,
423
364
  cached_input_tokens = ?, cost_usd = ?, model = ?, metadata = ?
424
- WHERE id = ?`).run(e.before_run_epoch,e.before_completed_at,e.before_input_tokens,e.before_output_tokens,e.before_cached_input_tokens,e.before_cost_usd,e.before_model,s,e.id).changes===1?void 0:{taskId:e.id,fields:[...Gd]}}).immediate()}function Sg(t){if(!Gt(t,"SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'tasks'"))throw new Error("Usage backfill requires the tasks table");let n=new Set(Yn(t,"PRAGMA table_info(tasks)").map(i=>i.name)),o=["id","agent_id","status","completed_at","metadata","model","platform","run_epoch","input_tokens","output_tokens","cached_input_tokens","cost_usd"].filter(i=>!n.has(i));if(o.length>0)throw new Error(`Usage backfill requires task columns: ${o.join(", ")}`);if(!Gt(t,"SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'task_log_events'"))throw new Error("Usage backfill requires the task_log_events table")}function bg(t,e,n,r){return {mode:t,ok:true,dbPath:e,scannedTasks:n.scannedTasks,terminalTasks:n.terminalTasks,rawTargetTasks:n.rawTargetRows.length,candidateTasks:n.candidates.length,recoveredTasks:0,unavailableTasks:0,deferredTasks:0,changedTasks:0,wouldChangeTasks:0,restored:0,skippedConflict:0,conflictSamples:[],accountingTasks:n.accountingTasks,remainingTargetTasks:n.candidates.length,providerDistribution:{},reasonCounts:dg(),estimatedFreeSpaceBytes:r.estimatedFreeSpaceBytes,requiredFreeSpaceBytes:r.requiredFreeSpaceBytes,availableFreeSpaceBytes:r.availableFreeSpaceBytes,minimumFreeSpaceReserveBytes:r.minimumFreeSpaceReserveBytes,freeSpaceGatePassed:r.freeSpaceGatePassed,failures:[],warnings:[...r.warnings]}}function Ig(t,e){for(let n of e)ig(t.providerDistribution,n.candidate.provider,n.outcome),ag(t.reasonCounts,n.outcome==="unavailable"?n.reason:void 0),n.outcome==="recovered"&&(t.recoveredTasks+=1),n.outcome==="unavailable"&&(t.unavailableTasks+=1),n.outcome==="deferred"&&(t.deferredTasks+=1);t.providerDistribution=cg(t.providerDistribution),t.wouldChangeTasks=t.recoveredTasks+t.unavailableTasks;}function vg(t){if(!["dry-run","apply","verify","restore"].includes(t.mode))throw new Error(`Unsupported usage backfill mode: ${t.mode}`);if(t.backupPath&&t.mode!=="apply")throw new Error("--backup is only valid with --apply");if(t.restorePath&&t.mode!=="restore")throw new Error("--restore is only valid with restore mode");if(t.mode==="restore"&&!t.restorePath)throw new Error("Restore mode requires a usage undo snapshot path")}async function Ag(t){vg(t);let e=Zr(t.dbPath),n=rg(t.now),r=new Date(n).toISOString(),o=t.mode==="restore"?Tg(t.restorePath,e):void 0,s=Ps(e,t.mode!=="apply"&&t.mode!=="restore"),i;try{Sg(s);let d=Os(s),c=t.mode==="apply"&&d.candidates.length>0?t.backupPath??nc(e):void 0,u=fg(e,d.candidates.length,c),f=bg(t.mode,e,d,u);if(o){f.backupPath=o.path,f.snapshotPath=o.path;for(let T of o.rows)try{let S=Rg(s,T);S?(f.skippedConflict+=1,f.conflictSamples.length<Jf&&f.conflictSamples.push(S)):f.restored+=1;}catch(S){f.failures.push({taskId:T.id,reason:S instanceof Error?S.message:String(S)});}let w=Os(s);f.accountingTasks=w.accountingTasks,f.remainingTargetTasks=w.candidates.length,f.ok=f.failures.length===0;let _=Jn(s);return _&&f.warnings.push(_),f}if(t.mode==="verify")return f;if(t.mode==="apply"&&!u.freeSpaceGatePassed&&d.candidates.length>0)return f.ok=!1,f.blockedReason=`Apply blocked: available free space (${u.availableFreeSpaceBytes} bytes) is below the required ${u.requiredFreeSpaceBytes} bytes (including a ${u.minimumFreeSpaceReserveBytes} byte reserve)`,f;if(d.candidates.length===0)return f;let p=new Ut({dbPath:e}),g=[];for(let w of d.candidates){let _=sg(w,p,n);g.push(_);}if(Ig(f,g),t.mode==="dry-run"&&(f.changedTasks=0),t.mode==="apply"){i=mg(e,c,r,{candidates:g.length,recovered:f.recoveredTasks,unavailable:f.unavailableTasks,deferred:f.deferredTasks}),f.backupPath=i.path,f.snapshotPath=i.path,f.backupMethod="row-undo-snapshot";for(let _ of g)if(_.outcome!=="deferred")try{pg(s,i,_,r)==="changed"&&(f.changedTasks+=1);}catch(T){f.failures.push({taskId:_.candidate.id,reason:T instanceof Error?T.message:String(T)});}let w=i.path;i.db.close(),i=void 0,rc(w);}let m=Os(s);if(f.accountingTasks=m.accountingTasks,f.remainingTargetTasks=m.candidates.length,f.ok=f.failures.length===0,t.mode==="apply"){let w=Jn(s);w&&f.warnings.push(w);}return f}finally{i&&i.db.close(),s.close();}}Or();h();oe();pe();ae();le();de();Fn();function no(t){return {...t,status:Nt(t)}}function Pg({metadata:t,...e}){return {...e,status:Nt({...e,metadata:t})}}var Kt=class extends l{reason;constructor(e,n=e){super("VALIDATION",n),this.name="ThreadTitleMetadataPatchError",this.reason=e;}};function Xn(t){if(!t)return {};try{let e=JSON.parse(t);return !e||typeof e!="object"||Array.isArray(e)?{}:e}catch{return {}}}function Dg(t){let n=Xn(t).threadTitle;if(!n||typeof n!="object"||Array.isArray(n))return {priority:null,state:null};let r=n;return {priority:typeof r.priority=="string"?r.priority:null,state:typeof r.state=="string"?r.state:null}}var Ds=class extends F{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=dirname(n);existsSync(o)||mkdirSync(o,{recursive:true});}else if(!existsSync(n))throw new l("NOT_FOUND","Database not found");let r=P(n);if(e)try{K(r.db,n);}catch(o){throw r.close(),o}return r}validateWorkspaceId(e,n){return e.db.select({id:C.id}).from(C).where(eq(C.id,n)).limit(1).get()?n:null}topLevelTaskPredicateSql(e="child"){return sql.raw(`NOT EXISTS (
365
+ WHERE id = ?`).run(e.before_run_epoch,e.before_completed_at,e.before_input_tokens,e.before_output_tokens,e.before_cached_input_tokens,e.before_cost_usd,e.before_model,s,e.id).changes===1?void 0:{taskId:e.id,fields:[...Yd]}}).immediate()}function qg(t){if(!jt(t,"SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'tasks'"))throw new Error("Usage backfill requires the tasks table");let n=new Set(Qn(t,"PRAGMA table_info(tasks)").map(i=>i.name)),o=["id","agent_id","status","completed_at","metadata","model","platform","run_epoch","input_tokens","output_tokens","cached_input_tokens","cost_usd"].filter(i=>!n.has(i));if(o.length>0)throw new Error(`Usage backfill requires task columns: ${o.join(", ")}`);if(!jt(t,"SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'task_log_events'"))throw new Error("Usage backfill requires the task_log_events table")}function Fg(t,e,n,r){return {mode:t,ok:true,dbPath:e,scannedTasks:n.scannedTasks,terminalTasks:n.terminalTasks,rawTargetTasks:n.rawTargetRows.length,candidateTasks:n.candidates.length,recoveredTasks:0,unavailableTasks:0,deferredTasks:0,changedTasks:0,wouldChangeTasks:0,restored:0,skippedConflict:0,conflictSamples:[],accountingTasks:n.accountingTasks,remainingTargetTasks:n.candidates.length,providerDistribution:{},reasonCounts:Sg(),estimatedFreeSpaceBytes:r.estimatedFreeSpaceBytes,requiredFreeSpaceBytes:r.requiredFreeSpaceBytes,availableFreeSpaceBytes:r.availableFreeSpaceBytes,minimumFreeSpaceReserveBytes:r.minimumFreeSpaceReserveBytes,freeSpaceGatePassed:r.freeSpaceGatePassed,failures:[],warnings:[...r.warnings]}}function Bg(t,e){for(let n of e)Rg(t.providerDistribution,n.candidate.provider,n.outcome),Eg(t.reasonCounts,n.outcome==="unavailable"?n.reason:void 0),n.outcome==="recovered"&&(t.recoveredTasks+=1),n.outcome==="unavailable"&&(t.unavailableTasks+=1),n.outcome==="deferred"&&(t.deferredTasks+=1);t.providerDistribution=bg(t.providerDistribution),t.wouldChangeTasks=t.recoveredTasks+t.unavailableTasks;}function jg(t){if(!["dry-run","apply","verify","restore"].includes(t.mode))throw new Error(`Unsupported usage backfill mode: ${t.mode}`);if(t.backupPath&&t.mode!=="apply")throw new Error("--backup is only valid with --apply");if(t.restorePath&&t.mode!=="restore")throw new Error("--restore is only valid with restore mode");if(t.mode==="restore"&&!t.restorePath)throw new Error("Restore mode requires a usage undo snapshot path")}async function zg(t){jg(t);let e=ro(t.dbPath),n=Tg(t.now),r=new Date(n).toISOString(),o=t.mode==="restore"?Lg(t.restorePath,e):void 0,s=Hs(e,t.mode!=="apply"&&t.mode!=="restore"),i;try{qg(s);let d=Ps(s),c=t.mode==="apply"&&d.candidates.length>0?t.backupPath??ac(e):void 0,u=Og(e,d.candidates.length,c),f=Fg(t.mode,e,d,u);if(o){f.backupPath=o.path,f.snapshotPath=o.path;for(let T of o.rows)try{let S=$g(s,T);S?(f.skippedConflict+=1,f.conflictSamples.length<lg&&f.conflictSamples.push(S)):f.restored+=1;}catch(S){f.failures.push({taskId:T.id,reason:S instanceof Error?S.message:String(S)});}let _=Ps(s);f.accountingTasks=_.accountingTasks,f.remainingTargetTasks=_.candidates.length,f.ok=f.failures.length===0;let k=Xn(s);return k&&f.warnings.push(k),f}if(t.mode==="verify")return f;if(t.mode==="apply"&&!u.freeSpaceGatePassed&&d.candidates.length>0)return f.ok=!1,f.blockedReason=`Apply blocked: available free space (${u.availableFreeSpaceBytes} bytes) is below the required ${u.requiredFreeSpaceBytes} bytes (including a ${u.minimumFreeSpaceReserveBytes} byte reserve)`,f;if(d.candidates.length===0)return f;let p=new Mt({dbPath:e}),g=[];for(let _ of d.candidates){let k=yg(_,p,n);g.push(k);}if(Bg(f,g),t.mode==="dry-run"&&(f.changedTasks=0),t.mode==="apply"){i=Cg(e,c,r,{candidates:g.length,recovered:f.recoveredTasks,unavailable:f.unavailableTasks,deferred:f.deferredTasks}),f.backupPath=i.path,f.snapshotPath=i.path,f.backupMethod="row-undo-snapshot";for(let k of g)if(k.outcome!=="deferred")try{Ag(s,i,k,r)==="changed"&&(f.changedTasks+=1);}catch(T){f.failures.push({taskId:k.candidate.id,reason:T instanceof Error?T.message:String(T)});}let _=i.path;i.db.close(),i=void 0,dc(_);}let m=Ps(s);if(f.accountingTasks=m.accountingTasks,f.remainingTargetTasks=m.candidates.length,f.ok=f.failures.length===0,t.mode==="apply"){let _=Xn(s);_&&f.warnings.push(_);}return f}finally{i&&i.db.close(),s.close();}}xr();h();oe();fe();ae();pe();de();jn();function io(t){return {...t,status:Ot(t)}}function Jg({metadata:t,...e}){return {...e,status:Ot({...e,metadata:t})}}var Gt=class extends l{reason;constructor(e,n=e){super("VALIDATION",n),this.name="ThreadTitleMetadataPatchError",this.reason=e;}};function Zn(t){if(!t)return {};try{let e=JSON.parse(t);return !e||typeof e!="object"||Array.isArray(e)?{}:e}catch{return {}}}function Yg(t){let n=Zn(t).threadTitle;if(!n||typeof n!="object"||Array.isArray(n))return {priority:null,state:null};let r=n;return {priority:typeof r.priority=="string"?r.priority:null,state:typeof r.state=="string"?r.state:null}}var Us=class extends B{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=dirname(n);existsSync(o)||mkdirSync(o,{recursive:true});}else if(!existsSync(n))throw new l("NOT_FOUND","Database not found");let r=P(n);if(e)try{K(r.db,n);}catch(o){throw r.close(),o}return r}validateWorkspaceId(e,n){return e.db.select({id:x.id}).from(x).where(eq(x.id,n)).limit(1).get()?n:null}topLevelTaskPredicateSql(e="child"){return sql.raw(`NOT EXISTS (
425
366
  SELECT 1 FROM tasks parent
426
367
  WHERE parent.id = ${e}.parent_task_id
427
368
  AND parent.thread_id = ${e}.thread_id
428
- )`)}findAllThreads(e){let n=this.resolveDbPaths(),r=new Set,o=[];for(let s of n){if(!existsSync(s))continue;let i=P(s);try{let d=e?eq(k.workspace_id,e):void 0,c=i.db.select().from(k).where(d).orderBy(desc(k.updated_at)).all();for(let u of c)r.has(u.id)||(r.add(u.id),o.push(u));}catch(d){throw new l("DB_ERROR","Failed to find all threads",d)}finally{i.close();}}return o}findThreadsByIdsOrTitles(e,n){if(e.length===0)return [];let r=this.resolveDbPaths(),o=new Set,s=[];for(let i of r){if(!existsSync(i))continue;let d=P(i);try{let c=or$1(inArray(k.id,e),inArray(k.title,e)),u=n?and(c,eq(k.workspace_id,n)):c,f=d.db.select().from(k).where(u).orderBy(desc(k.updated_at)).all();for(let p of f)o.has(p.id)||(o.add(p.id),s.push(p));}catch(c){throw new l("DB_ERROR","Failed to find threads by ids or titles",c)}finally{d.close();}}return s}findThreadById(e,n){let r=this.resolveDbPaths();for(let o of r){if(!existsSync(o))continue;let s=P(o);try{let i=eq(k.id,e),d=n?and(i,eq(k.workspace_id,n)):i,c=s.db.select().from(k).where(d).limit(1).get()??void 0;if(c)return c}catch(i){throw new l("DB_ERROR","Failed to find thread by id",i)}finally{s.close();}}}threadExists(e,n){let r=this.resolveDbPaths();for(let o of r){if(!existsSync(o))continue;let s=P(o);try{let i=eq(k.id,e),d=n?and(i,eq(k.workspace_id,n)):i;if(s.db.select({id:k.id}).from(k).where(d).limit(1).get())return !0}catch(i){throw new l("DB_ERROR","Failed to check thread existence",i)}finally{s.close();}}return false}aggregateTaskStats(e,n){let r=this.resolveDbPaths(),o=0,s=0,i=0,d=0,c=0,u=new Set;for(let f of r){if(!existsSync(f))continue;let p=P(f);try{let g=p.db.get(sql`
369
+ )`)}findAllThreads(e){let n=this.resolveDbPaths(),r=new Set,o=[];for(let s of n){if(!existsSync(s))continue;let i=P(s);try{let d=e?eq(w.workspace_id,e):void 0,c=i.db.select().from(w).where(d).orderBy(desc(w.updated_at)).all();for(let u of c)r.has(u.id)||(r.add(u.id),o.push(u));}catch(d){throw new l("DB_ERROR","Failed to find all threads",d)}finally{i.close();}}return o}findThreadsByIdsOrTitles(e,n){if(e.length===0)return [];let r=this.resolveDbPaths(),o=new Set,s=[];for(let i of r){if(!existsSync(i))continue;let d=P(i);try{let c=or$1(inArray(w.id,e),inArray(w.title,e)),u=n?and(c,eq(w.workspace_id,n)):c,f=d.db.select().from(w).where(u).orderBy(desc(w.updated_at)).all();for(let p of f)o.has(p.id)||(o.add(p.id),s.push(p));}catch(c){throw new l("DB_ERROR","Failed to find threads by ids or titles",c)}finally{d.close();}}return s}findThreadById(e,n){let r=this.resolveDbPaths();for(let o of r){if(!existsSync(o))continue;let s=P(o);try{let i=eq(w.id,e),d=n?and(i,eq(w.workspace_id,n)):i,c=s.db.select().from(w).where(d).limit(1).get()??void 0;if(c)return c}catch(i){throw new l("DB_ERROR","Failed to find thread by id",i)}finally{s.close();}}}threadExists(e,n){let r=this.resolveDbPaths();for(let o of r){if(!existsSync(o))continue;let s=P(o);try{let i=eq(w.id,e),d=n?and(i,eq(w.workspace_id,n)):i;if(s.db.select({id:w.id}).from(w).where(d).limit(1).get())return !0}catch(i){throw new l("DB_ERROR","Failed to check thread existence",i)}finally{s.close();}}return false}aggregateTaskStats(e,n){let r=this.resolveDbPaths(),o=0,s=0,i=0,d=0,c=0,u=new Set;for(let f of r){if(!existsSync(f))continue;let p=P(f);try{let g=p.db.get(sql`
429
370
  SELECT
430
371
  count(*) AS cnt,
431
372
  COALESCE(SUM(child.input_tokens), 0) AS total_input,
@@ -442,7 +383,7 @@ ${r.join(`
442
383
  AND child.agent_id IS NOT NULL AND child.agent_id != ''
443
384
  AND ${this.topLevelTaskPredicateSql()}
444
385
  ${n?sql`AND child.workspace_id = ${n}`:sql``}
445
- `);for(let w of m)u.add(w.agent_id);}catch(g){throw new l("DB_ERROR","Failed to aggregate task stats",g)}finally{p.close();}}return {taskCount:o,inputTokens:s,outputTokens:i,cachedInputTokens:d,costUsd:c,agentIds:Array.from(u)}}findTopLevelTasks(e,n,r){let o=this.resolveDbPaths(),s=new Set,i=[];for(let d of o){if(!existsSync(d))continue;let c=P(d);try{let u;r!==void 0?u=c.db.all(sql`
386
+ `);for(let _ of m)u.add(_.agent_id);}catch(g){throw new l("DB_ERROR","Failed to aggregate task stats",g)}finally{p.close();}}return {taskCount:o,inputTokens:s,outputTokens:i,cachedInputTokens:d,costUsd:c,agentIds:Array.from(u)}}findTopLevelTasks(e,n,r){let o=this.resolveDbPaths(),s=new Set,i=[];for(let d of o){if(!existsSync(d))continue;let c=P(d);try{let u;r!==void 0?u=c.db.all(sql`
446
387
  SELECT * FROM (
447
388
  SELECT child.*,
448
389
  ROW_NUMBER() OVER (PARTITION BY child.agent_id ORDER BY child.started_at DESC) AS rn
@@ -459,7 +400,7 @@ ${r.join(`
459
400
  AND ${this.topLevelTaskPredicateSql()}
460
401
  ${n?sql`AND child.workspace_id = ${n}`:sql``}
461
402
  ORDER BY child.started_at ASC
462
- `);for(let f of u)s.has(f.id)||(s.add(f.id),i.push(no(f)));}catch(u){throw new l("DB_ERROR","Failed to find top-level tasks",u)}finally{c.close();}}if(r!==void 0&&o.length>1){let d=new Map;for(let c of i){let u=c.agent_id??"";d.has(u)||d.set(u,[]),d.get(u).push(c);}i=[];for(let c of d.values())c.sort((u,f)=>(f.started_at??"").localeCompare(u.started_at??"")),i.push(...c.slice(0,r));i.sort((c,u)=>(c.started_at??"").localeCompare(u.started_at??""));}return i}findAllTasks(e,n){let r=this.resolveDbPaths(),o=new Set,s=[];for(let i of r){if(!existsSync(i))continue;let d=P(i);try{let c=eq(a.thread_id,e),u=n?and(c,eq(a.workspace_id,n)):c,f=d.db.select().from(a).where(u).orderBy(asc(a.started_at)).all();for(let p of f)o.has(p.id)||(o.add(p.id),s.push(no(p)));}catch(c){throw new l("DB_ERROR","Failed to find all tasks for thread",c)}finally{d.close();}}return s}findTaskById(e,n,r){let o=this.resolveDbPaths();for(let s of o){if(!existsSync(s))continue;let i=P(s);try{let d=and(eq(a.id,n),eq(a.thread_id,e)),c=r?and(d,eq(a.workspace_id,r)):d,u=i.db.select().from(a).where(c).limit(1).get();if(!u)continue;let f=i.db.select().from(a).where(eq(a.parent_task_id,u.id)).orderBy(asc(a.started_at)).all().map(no);return {task:no(u),children:f}}catch(d){throw new l("DB_ERROR","Failed to find task by id",d)}finally{i.close();}}}batchFetchTasksQuery(e,n){return sql`
403
+ `);for(let f of u)s.has(f.id)||(s.add(f.id),i.push(io(f)));}catch(u){throw new l("DB_ERROR","Failed to find top-level tasks",u)}finally{c.close();}}if(r!==void 0&&o.length>1){let d=new Map;for(let c of i){let u=c.agent_id??"";d.has(u)||d.set(u,[]),d.get(u).push(c);}i=[];for(let c of d.values())c.sort((u,f)=>(f.started_at??"").localeCompare(u.started_at??"")),i.push(...c.slice(0,r));i.sort((c,u)=>(c.started_at??"").localeCompare(u.started_at??""));}return i}findAllTasks(e,n){let r=this.resolveDbPaths(),o=new Set,s=[];for(let i of r){if(!existsSync(i))continue;let d=P(i);try{let c=eq(a.thread_id,e),u=n?and(c,eq(a.workspace_id,n)):c,f=d.db.select().from(a).where(u).orderBy(asc(a.started_at)).all();for(let p of f)o.has(p.id)||(o.add(p.id),s.push(io(p)));}catch(c){throw new l("DB_ERROR","Failed to find all tasks for thread",c)}finally{d.close();}}return s}findTaskById(e,n,r){let o=this.resolveDbPaths();for(let s of o){if(!existsSync(s))continue;let i=P(s);try{let d=and(eq(a.id,n),eq(a.thread_id,e)),c=r?and(d,eq(a.workspace_id,r)):d,u=i.db.select().from(a).where(c).limit(1).get();if(!u)continue;let f=i.db.select().from(a).where(eq(a.parent_task_id,u.id)).orderBy(asc(a.started_at)).all().map(io);return {task:io(u),children:f}}catch(d){throw new l("DB_ERROR","Failed to find task by id",d)}finally{i.close();}}}batchFetchTasksQuery(e,n){return sql`
463
404
  SELECT child.id, child.thread_id, child.agent_id, child.status,
464
405
  child.parent_task_id, child.started_at, child.completed_at,
465
406
  child.duration_ms, child.input_tokens, child.output_tokens,
@@ -469,7 +410,7 @@ ${r.join(`
469
410
  AND ${this.topLevelTaskPredicateSql()}
470
411
  ${n?sql`AND child.workspace_id = ${n}`:sql``}
471
412
  ORDER BY child.started_at ASC
472
- `}batchFetchTasks(e,n){let r=new Map;if(e.length===0)return r;let o=this.resolveDbPaths();for(let s of o){if(!existsSync(s))continue;let i=P(s);try{let d=i.db.all(this.batchFetchTasksQuery(e,n));for(let c of d){let u=c.thread_id;r.has(u)||r.set(u,[]),r.get(u).push(Pg(c));}}catch(d){throw new l("DB_ERROR","Failed to batch fetch tasks",d)}finally{i.close();}}return r}explainBatchFetchTasksPlan(e,n){let r=this.resolveDbPaths();for(let o of r){if(!existsSync(o))continue;let s=P(o);try{return s.db.all(sql`EXPLAIN QUERY PLAN ${this.batchFetchTasksQuery(e,n)}`).map(d=>d.detail)}finally{s.close();}}return []}updateThreadTitle(e,n,r){if(!this.dbExists())return;let o=this.openHandle(true);try{let s=eq(k.id,e),i=r?and(s,eq(k.workspace_id,r)):s;if(!o.db.select({id:k.id}).from(k).where(i).limit(1).get())return;o.db.update(k).set({title:n,title_locked:1,updated_at:new Date().toISOString()}).where(eq(k.id,e)).run();}catch(s){throw s instanceof l?s:new l("DB_ERROR","Failed to update thread title",s)}finally{o.close();}}upsertThread(e,n){let r=this.openHandle(true);try{let o=n.workspaceId?this.validateWorkspaceId(r,n.workspaceId):null,s=new Date().toISOString();if(r.db.select({id:k.id,message_count:k.message_count}).from(k).where(eq(k.id,e)).limit(1).get()){let d={updated_at:s};n.title!==void 0&&(d.title=n.title),n.titleLocked!==void 0&&(d.title_locked=n.titleLocked?1:0),r.db.update(k).set(d).where(eq(k.id,e)).run();}else r.db.insert(k).values({id:e,platform:n.platform,workspace_id:o,title:n.title??null,title_locked:n.titleLocked?1:0,message_count:0,created_at:s,updated_at:s}).run();}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to upsert thread",o)}finally{r.close();}}ensureThread(e,n,r){let o=this.openHandle(true);try{let s=r?this.validateWorkspaceId(o,r):null,i=o.db.select({id:k.id,platform:k.platform,workspace_id:k.workspace_id}).from(k).where(eq(k.id,e)).limit(1).get();if(i){s&&!i.workspace_id&&o.db.update(k).set({workspace_id:s}).where(eq(k.id,e)).run();return}let d=new Date().toISOString();o.db.insert(k).values({id:e,platform:n,workspace_id:s,message_count:0,created_at:d,updated_at:d}).run();}catch(s){throw s instanceof l?s:new l("DB_ERROR","Failed to ensure thread",s)}finally{o.close();}}saveUserMessage(e,n,r){if(!this.dbExists())return {firstMessage:false};let o=this.openHandle(true);try{let s=new Date().toISOString();return {firstMessage:o.db.transaction(d=>{let u=d.select({message_count:k.message_count}).from(k).where(eq(k.id,e)).limit(1).get()?.message_count===0;return d.run(sql`
413
+ `}batchFetchTasks(e,n){let r=new Map;if(e.length===0)return r;let o=this.resolveDbPaths();for(let s of o){if(!existsSync(s))continue;let i=P(s);try{let d=i.db.all(this.batchFetchTasksQuery(e,n));for(let c of d){let u=c.thread_id;r.has(u)||r.set(u,[]),r.get(u).push(Jg(c));}}catch(d){throw new l("DB_ERROR","Failed to batch fetch tasks",d)}finally{i.close();}}return r}explainBatchFetchTasksPlan(e,n){let r=this.resolveDbPaths();for(let o of r){if(!existsSync(o))continue;let s=P(o);try{return s.db.all(sql`EXPLAIN QUERY PLAN ${this.batchFetchTasksQuery(e,n)}`).map(d=>d.detail)}finally{s.close();}}return []}updateThreadTitle(e,n,r){if(!this.dbExists())return;let o=this.openHandle(true);try{let s=eq(w.id,e),i=r?and(s,eq(w.workspace_id,r)):s;if(!o.db.select({id:w.id}).from(w).where(i).limit(1).get())return;o.db.update(w).set({title:n,title_locked:1,updated_at:new Date().toISOString()}).where(eq(w.id,e)).run();}catch(s){throw s instanceof l?s:new l("DB_ERROR","Failed to update thread title",s)}finally{o.close();}}upsertThread(e,n){let r=this.openHandle(true);try{let o=n.workspaceId?this.validateWorkspaceId(r,n.workspaceId):null,s=new Date().toISOString();if(r.db.select({id:w.id,message_count:w.message_count}).from(w).where(eq(w.id,e)).limit(1).get()){let d={updated_at:s};n.title!==void 0&&(d.title=n.title),n.titleLocked!==void 0&&(d.title_locked=n.titleLocked?1:0),r.db.update(w).set(d).where(eq(w.id,e)).run();}else r.db.insert(w).values({id:e,platform:n.platform,workspace_id:o,title:n.title??null,title_locked:n.titleLocked?1:0,message_count:0,created_at:s,updated_at:s}).run();}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to upsert thread",o)}finally{r.close();}}ensureThread(e,n,r){let o=this.openHandle(true);try{let s=r?this.validateWorkspaceId(o,r):null,i=o.db.select({id:w.id,platform:w.platform,workspace_id:w.workspace_id}).from(w).where(eq(w.id,e)).limit(1).get();if(i){s&&!i.workspace_id&&o.db.update(w).set({workspace_id:s}).where(eq(w.id,e)).run();return}let d=new Date().toISOString();o.db.insert(w).values({id:e,platform:n,workspace_id:s,message_count:0,created_at:d,updated_at:d}).run();}catch(s){throw s instanceof l?s:new l("DB_ERROR","Failed to ensure thread",s)}finally{o.close();}}saveUserMessage(e,n,r){if(!this.dbExists())return {firstMessage:false};let o=this.openHandle(true);try{let s=new Date().toISOString();return {firstMessage:o.db.transaction(d=>{let u=d.select({message_count:w.message_count}).from(w).where(eq(w.id,e)).limit(1).get()?.message_count===0;return d.run(sql`
473
414
  UPDATE threads
474
415
  SET first_message = COALESCE(first_message, ${n}),
475
416
  title = CASE WHEN title_locked = 0 AND title IS NULL THEN substr(${n}, 1, 60) ELSE title END,
@@ -477,7 +418,7 @@ ${r.join(`
477
418
  message_count = message_count + 1,
478
419
  updated_at = ${s}
479
420
  WHERE id = ${e}
480
- `),u},{behavior:"immediate"})}}catch(s){throw s instanceof l?s:new l("DB_ERROR","Failed to save user message",s)}finally{o.close();}}saveAssistantMessage(e,n,r){if(!this.dbExists())return;let o=this.openHandle(true);try{let s=new Date().toISOString();o.db.update(k).set({last_message:n,updated_at:s}).where(eq(k.id,e)).run();}catch(s){throw s instanceof l?s:new l("DB_ERROR","Failed to save assistant message",s)}finally{o.close();}}updateThread(e,n){if(!this.dbExists())return;let r=this.openHandle(true);try{let o={updated_at:new Date().toISOString()};n.title!==void 0&&(o.title=n.title,o.title_locked=1),n.titleLocked!==void 0&&(o.title_locked=n.titleLocked?1:0),r.db.update(k).set(o).where(eq(k.id,e)).run();}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to update thread",o)}finally{r.close();}}patchThreadTitleMetadata(e,n,r){let o=n;if(!o||typeof o!="object"||Array.isArray(o))return new Kt("THREAD_TITLE_PATCH_INVALID","Thread-title metadata patch must be an object");if(Object.keys(o).some(c=>c!=="priority"&&c!=="state"))return new Kt("THREAD_TITLE_PATCH_INVALID","Thread-title metadata patch only supports priority and state");let i=o;if(i.priority===void 0&&i.state===void 0)return new Kt("THREAD_TITLE_PATCH_EMPTY","Thread-title metadata patch must change priority or state");for(let c of [i.priority,i.state])if(c!=null&&(typeof c!="string"||c.length===0))return new Kt("THREAD_TITLE_PATCH_INVALID","Thread-title metadata values must be non-empty strings or null");let d=this.openHandle(true);try{let c=r?and(eq(k.id,e),eq(k.workspace_id,r)):eq(k.id,e);return d.db.transaction(u=>{let f=u.select({metadata:k.metadata}).from(k).where(c).get();if(!f)return null;let p=Xn(f.metadata),g=p.threadTitle,m=g&&typeof g=="object"&&!Array.isArray(g)?{...g}:{};i.priority===null?delete m.priority:i.priority!==void 0&&(m.priority=i.priority),i.state===null?delete m.state:i.state!==void 0&&(m.state=i.state),Object.keys(m).length>0?p.threadTitle=m:delete p.threadTitle;let w=Object.keys(p).length>0?JSON.stringify(p):null,_=new Date().toISOString();u.update(k).set({metadata:w,updated_at:_}).where(c).run();let T=u.select({metadata:k.metadata}).from(k).where(c).get();if(!T)throw new l("DB_ERROR","Thread-title metadata update could not be read back");let S=Dg(T.metadata);return {threadId:e,priority:S.priority,state:S.state}},{behavior:"immediate"})}catch(c){throw c instanceof l?c:new l("DB_ERROR","Failed to patch thread-title metadata",c)}finally{d.close();}}togglePin(e,n){let r=this.openHandle(true);try{let o=n?and(eq(k.id,e),eq(k.workspace_id,n)):eq(k.id,e);return r.db.transaction(s=>{let i=s.select({pinned:k.pinned,metadata:k.metadata}).from(k).where(o).get();if(!i)return null;let d=i.pinned?0:1,c=Xn(i.metadata);if(d){let u=n?and(eq(k.pinned,1),eq(k.workspace_id,n)):eq(k.pinned,1),f=s.select({metadata:k.metadata}).from(k).where(u).all(),p=null;for(let g of f){let m=Xn(g.metadata);typeof m.pinOrder=="number"&&(p===null||m.pinOrder<p)&&(p=m.pinOrder);}c.pinOrder=p===null?0:p-1;}else delete c.pinOrder;return s.update(k).set({pinned:d,metadata:Object.keys(c).length>0?JSON.stringify(c):null}).where(o).run(),{pinned:!!d}},{behavior:"immediate"})}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to toggle pin",o)}finally{r.close();}}reorderPins(e,n){let r=this.openHandle(true);try{r.db.transaction(o=>{for(let s=0;s<e.length;s++){let i=n?and(eq(k.id,e[s]),eq(k.workspace_id,n)):eq(k.id,e[s]),d=o.select({metadata:k.metadata}).from(k).where(i).get();if(!d)continue;let c=Xn(d.metadata);c.pinOrder=s+1,o.update(k).set({metadata:JSON.stringify(c)}).where(i).run();}},{behavior:"immediate"});}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to reorder pins",o)}finally{r.close();}}toggleStar(e,n){let r=this.openHandle(true);try{let o=n?and(eq(k.id,e),eq(k.workspace_id,n)):eq(k.id,e),s=r.db.select({starred:k.starred}).from(k).where(o).get();if(!s)return null;let i=s.starred?0:1;return r.db.update(k).set({starred:i}).where(o).run(),{starred:!!i}}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to toggle star",o)}finally{r.close();}}resolveOverdriveForRequest(e,n,r,o){let i=this.openHandle(true);try{let d=n?and(eq(k.id,e),eq(k.workspace_id,n)):eq(k.id,e);return i.db.transaction(u=>{let f=u.select({metadata:k.metadata}).from(k).where(d).get();if(!f)return null;let p=f.metadata?JSON.parse(f.metadata):{},g=p.overdrive??{},m=o?.defaultTurns??g.defaultTurns??3,w=o?.updatedBy??"ui",_=new Date().toISOString(),T,S,M,Y;switch(r){case "enable-count":{let E=o?.turns??m,x=o?.consumeCurrent?Math.max(E-1,0):E;T=x>0?"count":"off",S=x,M=!0,Y="count";break}case "enable-latch":{T="latch",S=0,M=!0,Y="latch";break}case "disable":{T="off",S=0,M=!1;break}default:{let E=g.state??"off",x=typeof g.remaining=="number"?g.remaining:0;if(E==="count"&&x>0){let O=x-1;O<=0?(T="off",S=0):(T="count",S=O),M=!0,Y="count";}else E==="latch"?(T="latch",S=0,M=!0,Y="latch"):(T="off",S=0,M=!1);break}}return p.overdrive={state:T,remaining:S,defaultTurns:m,updatedAt:_,updatedBy:w},u.update(k).set({metadata:JSON.stringify(p),updated_at:_}).where(d).run(),{applied:M,appliedMode:Y,state:T,remaining:S}},{behavior:"immediate"})}catch(d){throw d instanceof l?d:new l("DB_ERROR","Failed to resolve overdrive",d)}finally{i.close();}}};h();oe();pe();ae();le();de();h();var cc=["urgent","high","medium","low"],uc=["investigating","in-progress","in-review","on-hold","done"],Qn="custom:";var Lg=new Set(cc),Mg=new Set(uc),Hg={urgent:"U \uAE34\uAE09 Urgent",high:"P0 \uAE09\uD568 High",medium:"P1 \uC911\uC694 Medium",low:"P2 \uBCF4\uD1B5 Low"},Ls={investigating:"\uC870\uC0AC\uC911 Looking into","in-progress":"\uC9C4\uD589\uC911 In progress","in-review":"\uAC80\uD1A0\uC911 In review","on-hold":"\uBCF4\uB958 On hold",done:"\uC644\uB8CC Done"};function dc(t,e){return !e||e.includes(t)?e??t:`${t} ${e}`}function Zn(t){return typeof t=="string"&&Lg.has(t)}function er(t){if(typeof t!="string")return false;if(Mg.has(t))return true;if(t.startsWith("c_"))return t.length>2;if(!t.startsWith(Qn))return false;let e=t.slice(Qn.length);return e.length>=1&&e.length<=20}function lc(t){if(t.startsWith(Qn))return t.slice(Qn.length)}function Ms(t){if(!t)return null;try{let e=JSON.parse(t);return !e||typeof e!="object"||Array.isArray(e)?null:e}catch{return null}}function Ug(t){let e=Ms(t);return !!e&&Object.prototype.hasOwnProperty.call(e,"threadTitle")}function ro(t){let e=Ms(t);if(!e)return {};let n=e.threadTitle;if(!n||typeof n!="object"||Array.isArray(n))return {};let r=n,o={};return Zn(r.priority)&&(o.priority=r.priority),er(r.state)&&(o.state=r.state),o}function Hs(t,e){let n=Ms(t)??{},r={...ro(t)};return e.priority===null?delete r.priority:e.priority!==void 0&&(r.priority=e.priority),e.state===null?delete r.state:e.state!==void 0&&(r.state=e.state),r.priority===void 0&&r.state===void 0?delete n.threadTitle:n.threadTitle=r,Object.keys(n).length===0?null:JSON.stringify(n)}function $g(t,e=new Map){let n=[];return t.priority&&n.push(dc(Hg[t.priority],e.get(t.priority))),t.state&&(t.state.startsWith(Qn)?n.push(lc(t.state)??""):Ls[t.state]?n.push(dc(Ls[t.state],e.get(t.state))):e.has(t.state)?n.push(t.state,e.get(t.state)??""):t.state.startsWith("c_")?n.push(t.state):n.push(Ls[t.state]??"")),n.filter(Boolean).join(" ")}function pc(t,e){if(!t||t.trim().length===0)return;let n=new Set,r=false,o=false;for(let s of t.split(",")){let i=s.trim();if(i){if(i==="none"){r=true,o=true;continue}e(i)&&(n.add(i),o=true);}}if(o)return {values:n,includeNone:r}}function qg(t){return pc(t,Zn)}function Fg(t){return pc(t,er)}function jg(t,e){return e?t?e.values.has(t):e.includeNone:true}Fn();var _c="regeneration_replaced",Kg="THREAD_HIGHLIGHT_REGENERATION_NO_ELIGIBLE_TURNS",kc="THREAD_HIGHLIGHT_REGENERATION_INTERRUPTED",Vg="THREAD_HIGHLIGHT_REGENERATION_DETECTION_FAILED",Tc="THREAD_HIGHLIGHT_REGENERATION_COMMIT_FAILED",ao=class extends l{threadId;highlightId;expectedRevision;currentRevision;constructor(e,n,r,o){super("CONFLICT",`Highlight revision conflict: expected ${r}, current ${o}`),this.name="ThreadHistoryConflictError",this.threadId=e,this.highlightId=n,this.expectedRevision=r,this.currentRevision=o;}},yn=class extends ao{},co=class extends l{stableCode="THREAD_HIGHLIGHT_REGENERATION_IN_PROGRESS";run;constructor(e){super("CONFLICT","THREAD_HIGHLIGHT_REGENERATION_IN_PROGRESS"),this.name="ThreadHighlightRegenerationConflictError",this.run=e;}},Jg=new Set(Ni),Yg=new Set(Ci),Xg=new Set(xi),Qg=new Set(Pi),Zg=50,gc=100,hc=280,mc=40,eh=new Set(Di),oo=["queued","running"];function $s(t){return eh.has(t)}function J(t){throw new l("VALIDATION",t)}function et(t){throw new l("NOT_FOUND",t)}function D(t,e){(typeof t!="string"||t.trim().length===0)&&J(`${e} is required`);}function nr(t={}){let e=t.actor??t,n=e.actorType??"system";return Jg.has(n)||J(`invalid actorType: ${String(n)}`),e.actorId!==void 0&&e.actorId!==null&&typeof e.actorId!="string"&&J("actorId must be a string or null"),{actorType:n,actorId:e.actorId??null}}function th(t){D(t.threadId,"threadId"),t.workspaceId!==void 0&&t.workspaceId!==null&&D(t.workspaceId,"workspaceId"),t.title!==void 0&&t.title!==null&&((typeof t.title!="string"||t.title.trim().length===0)&&J("title must not be empty"),t.title.length>120&&J("title must be at most 120 characters")),t.priority!==void 0&&t.priority!==null&&!Zn(t.priority)&&J(`invalid priority: ${String(t.priority)}`),t.state!==void 0&&t.state!==null&&!er(t.state)&&J(`invalid state: ${String(t.state)}`);}function nh(t){t.beforeSeq!==void 0&&t.afterSeq!==void 0&&J("beforeSeq and afterSeq cannot be used together");for(let[n,r]of [["beforeSeq",t.beforeSeq],["afterSeq",t.afterSeq]])r!==void 0&&(!Number.isInteger(r)||r<0)&&J(`${n} must be a non-negative integer`);let e=t.limit??Zg;return (!Number.isInteger(e)||e<1||e>gc)&&J(`limit must be between 1 and ${gc}`),e}function Fs(t){typeof t!="string"&&J("text is required");let e=t.trim();return e.length===0&&J("text must not be empty"),e.length>hc&&J(`text must be at most ${hc} characters`),e}function St(t,e){return D(t??"",e),t}function js(t){Qg.has(t)||J(`invalid highlight kind: ${String(t)}`);}function rh(t){Xg.has(t)||J(`invalid highlight source: ${String(t)}`);}function oh(t){D(t.threadId,"threadId"),D(t.workspaceId,"workspaceId");let e=t.source??"manual";rh(e),js(t.kind);let n=Fs(t.text),r=t.coversFromTaskId??t.fromTaskId??t.taskId,o=t.coversToTaskId??t.toTaskId??t.taskId;if(e==="manual"){let f=t.taskId??(r&&o&&r===o?r:void 0),p=St(f,"taskId");return (r!==p||o!==p)&&J("manual highlights must cover exactly one task"),{source:e,kind:t.kind,text:n,coversFromTaskId:p,coversToTaskId:p,agentId:t.agentId??null,sourceTaskId:null,detectorVersion:null,contentFingerprint:null}}let s=St(r,"coversFromTaskId"),i=St(o,"coversToTaskId"),d=t.sourceTaskId??s,c=t.detectorVersion??(t.idempotencyKey!==void 0?"default":null),u=t.contentFingerprint??t.idempotencyKey??null;return St(d??void 0,"sourceTaskId"),St(c??void 0,"detectorVersion"),St(u??void 0,"contentFingerprint"),{source:e,kind:t.kind,text:n,coversFromTaskId:s,coversToTaskId:i,agentId:t.agentId??null,sourceTaskId:d,detectorVersion:c,contentFingerprint:u}}function sh(t,e){(!t||typeof t!="object")&&J(`candidates[${e}] is required`),js(t.kind);let n=Fs(t.text),r=St(t.anchorTaskId,`candidates[${e}].anchorTaskId`),o=St(t.coversFromTaskId,`candidates[${e}].coversFromTaskId`),s=St(t.coversToTaskId,`candidates[${e}].coversToTaskId`),i=t.contentFingerprint?.trim()||Wi("thl",JSON.stringify({kind:t.kind,text:n,anchorTaskId:r,coversFromTaskId:o,coversToTaskId:s}));return D(i,`candidates[${e}].contentFingerprint`),{kind:t.kind,text:n,anchorTaskId:r,coversFromTaskId:o,coversToTaskId:s,contentFingerprint:i}}function ih(t){Array.isArray(t)||J("candidates must be an array"),t.length>mc&&J(`candidates must contain at most ${mc} items`);let e=new Map;for(let[n,r]of t.entries()){let o=sh(r,n);e.set(o.contentFingerprint,o);}return [...e.values()]}function ir(t){let e=ro(t.metadata);return {threadId:t.id,workspaceId:t.workspace_id,title:t.title,priority:e.priority??null,state:e.state??null,metadata:t.metadata,titleLocked:t.title_locked===1,updatedAt:t.updated_at}}function ah(t){try{let e=JSON.stringify(t);return (!e||e==="null"||e.startsWith("["))&&J("event payload must be a JSON object"),e}catch(e){throw new l("VALIDATION","event payload must be JSON serializable",e)}}function rr(t,e){return t.select({maxSeq:sql`COALESCE(MAX(${G.seq}), 0)`}).from(G).where(eq(G.thread_id,e)).get()?.maxSeq??0}function or(t,e){return !!t.select({id:G.id}).from(G).where(eq(G.thread_id,e)).limit(1).get()}function Vt(t,e){Yg.has(e.type)||J(`invalid thread event type: ${String(e.type)}`);let n=Le("the");t.insert(G).values({id:n,thread_id:e.threadId,seq:e.seq,type:e.type,actor_type:e.actorType,actor_id:e.actorId,task_id:e.taskId??null,highlight_id:e.highlightId??null,payload_json:ah(e.payload),created_at:e.createdAt}).run();let r=t.select().from(G).where(eq(G.id,n)).get();if(!r)throw new l("DB_ERROR","Thread event insert did not return a row");return r}function sr(t,e,n,r,o){let s=ir(e);Vt(t,{threadId:e.id,seq:o,type:"thread.snapshot.imported",actorType:n.actorType,actorId:n.actorId,createdAt:r,payload:{title:s.title,priority:s.priority,state:s.state}});}function io(t){return {highlightId:t.id,source:t.source,kind:t.kind,status:t.status,coversFromTaskId:t.covers_from_task_id,coversToTaskId:t.covers_to_task_id,revision:t.revision,...t.dismissed_at===null?{}:{dismissedAt:t.dismissed_at}}}function so(t,e,n,r,o,s,i){let d=o==="thread.highlight.created"?io(e):{before:i?io({...e,...i,id:e.id}):void 0,after:io(e)};return Vt(t,{threadId:e.thread_id,seq:s,type:o,actorType:n.actorType,actorId:n.actorId,createdAt:r,taskId:e.source==="manual"?e.covers_from_task_id:e.source_task_id??e.covers_from_task_id,highlightId:e.id,payload:d})}function dh(t,e,n,r,o,s){return Vt(t,{threadId:e.thread_id,seq:o,type:"thread.highlight.deleted",actorType:n.actorType,actorId:n.actorId,createdAt:r,taskId:e.source_task_id??e.covers_from_task_id,highlightId:e.id,payload:{before:io(e),...s??{}}})}var qs=class extends F{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath??super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(!e&&!existsSync(n))throw new l("NOT_FOUND","Database not found");if(e){let o=dirname(n);existsSync(o)||mkdirSync(o,{recursive:true});}let r=P(n);if(e)try{K(r.db,n);}catch(o){throw r.close(),o}return r}findThread(e,n,r){let o=eq(k.id,n),s=r===void 0?o:r===null?and(o,isNull(k.workspace_id)):and(o,eq(k.workspace_id,r));return e.select().from(k).where(s).limit(1).get()}findRegenerationRun(e,n,r){let o=e.select().from(q).where(eq(q.id,n)).limit(1).get();if(o&&!(r!==void 0&&!this.findThread(e,o.thread_id,r)))return o}resolveWorkspaceId(e){if(D(e,"threadId"),!existsSync(this.resolveDbPath()))return null;let n=this.openHandle(false);try{return n.db.select({workspaceId:k.workspace_id}).from(k).where(eq(k.id,e)).limit(1).get()?.workspaceId??null}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to resolve thread workspace",r)}finally{n.close();}}getSnapshot(e,n){if(D(e,"threadId"),!existsSync(this.resolveDbPath()))return null;let r=this.openHandle(false);try{let o=this.findThread(r.db,e,n);return o?ir(o):null}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to read thread snapshot",o)}finally{r.close();}}updateSnapshot(e){th(e);let n=nr(e),r=new Date().toISOString(),o=this.openHandle(true);try{return o.db.transaction(s=>{let i=this.findThread(s,e.threadId,e.workspaceId);i||et(`Thread ${e.threadId} not found`);let d=ir(i),c=e.title!==void 0,u=c&&e.title!==d.title,f=c&&i.title_locked!==1,p=e.priority!==void 0&&e.priority!==d.priority,g=e.state!==void 0&&e.state!==d.state,m=u||p||g;if(!m&&!f)return d;let w=i.metadata;(p||g)&&(w=Hs(i.metadata,{priority:e.priority,state:e.state}));let _={};if(m&&(_.metadata=w,_.updated_at=r),u&&(_.title=e.title),c&&(_.title_locked=1),s.update(k).set(_).where(e.workspaceId===void 0?eq(k.id,e.threadId):e.workspaceId===null?and(eq(k.id,e.threadId),isNull(k.workspace_id)):and(eq(k.id,e.threadId),eq(k.workspace_id,e.workspaceId))).run(),!m){let M={...i,title_locked:1};return ir(M)}let T=rr(s,i.id)+1;or(s,i.id)||(sr(s,i,n,r,T),T+=1),u&&(Vt(s,{threadId:i.id,seq:T,type:"thread.title.changed",actorType:n.actorType,actorId:n.actorId,createdAt:r,taskId:e.taskId,payload:{before:d.title,after:e.title}}),T+=1),p&&(Vt(s,{threadId:i.id,seq:T,type:"thread.priority.changed",actorType:n.actorType,actorId:n.actorId,createdAt:r,taskId:e.taskId,payload:{before:d.priority,after:e.priority}}),T+=1),g&&Vt(s,{threadId:i.id,seq:T,type:"thread.state.changed",actorType:n.actorType,actorId:n.actorId,createdAt:r,taskId:e.taskId,payload:{before:d.state,after:e.state}});let S={...i,title:u?e.title:i.title,metadata:w,title_locked:c?1:i.title_locked,updated_at:r};return ir(S)},{behavior:"immediate"})}catch(s){throw s instanceof l?s:new l("DB_ERROR","Failed to update thread snapshot",s)}finally{o.close();}}mutateSnapshot(e){return this.updateSnapshot(e)}updateThreadSnapshot(e){return this.updateSnapshot(e)}getLatestSeq(e,n){if(D(e,"threadId"),!existsSync(this.resolveDbPath()))return null;let r=this.openHandle(false);try{return this.findThread(r.db,e,n)?r.db.select({maxSeq:sql`COALESCE(MAX(${G.seq}), 0)`}).from(G).where(eq(G.thread_id,e)).get()?.maxSeq??0:null}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to read latest thread event sequence",o)}finally{r.close();}}listCompletedThreadHighlightTurns(e,n){if(D(e,"threadId"),D(n,"workspaceId"),!existsSync(this.resolveDbPath()))return null;let r=this.openHandle(false);try{return this.findThread(r.db,e,n)?r.db.select({taskId:a.id,prompt:a.prompt,result:a.result,status:a.status,startedAt:a.started_at,completedAt:a.completed_at}).from(a).where(and(eq(a.thread_id,e),eq(a.workspace_id,n),inArray(a.status,[...ns,"completed","done","error"]),or$1(isNull(a.parent_task_id),eq(a.parent_task_id,"")),sql`${a.result} IS NOT NULL AND length(trim(${a.result})) > 0`)).orderBy(asc(a.started_at),asc(a.id)).all().map(i=>({taskId:i.taskId,prompt:i.prompt,result:i.result,status:i.status,startedAt:i.startedAt,completedAt:i.completedAt})):null}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to read completed thread highlight turns",o)}finally{r.close();}}createHighlightRegenerationRun(e){D(e.threadId,"threadId"),D(e.workspaceId,"workspaceId"),D(e.requestId,"requestId"),D(e.detectorVersion,"detectorVersion"),e.runId!==void 0&&D(e.runId,"runId");let n=new Date().toISOString(),r=this.openHandle(true);try{return r.db.transaction(o=>{let s=this.findThread(o,e.threadId,e.workspaceId);s||et(`Thread ${e.threadId} not found`);let i=o.select().from(q).where(and(eq(q.thread_id,s.id),eq(q.request_id,e.requestId))).orderBy(desc(q.requested_at),desc(q.id)).limit(1).get();if(i)return {run:i,created:!1};let d=o.select().from(q).where(and(eq(q.thread_id,s.id),inArray(q.status,oo))).orderBy(asc(q.requested_at),asc(q.id)).limit(1).get();if(d)throw new co(d);let c=e.runId??Le("thr");o.insert(q).values({id:c,thread_id:s.id,request_id:e.requestId,status:"queued",detector_version:e.detectorVersion,requested_at:n,started_at:null,completed_at:null,error_code:null,previous_auto_count:null,new_auto_count:null}).run();let u=o.select().from(q).where(eq(q.id,c)).get();if(!u)throw new l("DB_ERROR","Highlight regeneration run insert did not return a row");return {run:u,created:!0}},{behavior:"immediate"})}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to create highlight regeneration run",o)}finally{r.close();}}beginHighlightRegenerationRun(e){return this.createHighlightRegenerationRun(e)}queueHighlightRegenerationRun(e){return this.createHighlightRegenerationRun(e)}getHighlightRegenerationRun(e,n){if(D(e,"runId"),n!==void 0&&D(n,"workspaceId"),!existsSync(this.resolveDbPath()))return null;let r=this.openHandle(false);try{return this.findRegenerationRun(r.db,e,n)??null}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to read highlight regeneration run",o)}finally{r.close();}}getHighlightRegenerationRunByRequest(e,n,r){if(D(e,"threadId"),D(n,"workspaceId"),D(r,"requestId"),!existsSync(this.resolveDbPath()))return null;let o=this.openHandle(false);try{return this.findThread(o.db,e,n)?o.db.select().from(q).where(and(eq(q.thread_id,e),eq(q.request_id,r))).orderBy(desc(q.requested_at),desc(q.id)).limit(1).get()??null:null}catch(s){throw s instanceof l?s:new l("DB_ERROR","Failed to read highlight regeneration request",s)}finally{o.close();}}findHighlightRegenerationRun(e,n,r){return this.getHighlightRegenerationRunByRequest(e,n,r)}startHighlightRegenerationRun(e,n){D(e,"runId"),n!==void 0&&D(n,"workspaceId");let r=new Date().toISOString(),o=this.openHandle(true);try{return o.db.transaction(s=>{let i=this.findRegenerationRun(s,e,n);if(i||et(`Highlight regeneration run ${e} not found`),$s(i.status)||J(`invalid highlight regeneration status: ${i.status}`),i.status!=="queued")return i;s.update(q).set({status:"running",started_at:r}).where(and(eq(q.id,i.id),eq(q.status,"queued"))).run();let d=s.select().from(q).where(eq(q.id,i.id)).get();if(!d)throw new l("DB_ERROR","Highlight regeneration run start did not return a row");return d},{behavior:"immediate"})}catch(s){throw s instanceof l?s:new l("DB_ERROR","Failed to start highlight regeneration run",s)}finally{o.close();}}startHighlightRegeneration(e,n){return this.startHighlightRegenerationRun(e,n)}failHighlightRegenerationRun(e){D(e.runId,"runId"),D(e.errorCode,"errorCode"),e.workspaceId!==void 0&&D(e.workspaceId,"workspaceId");let n=new Date().toISOString(),r=this.openHandle(true);try{return r.db.transaction(o=>{let s=this.findRegenerationRun(o,e.runId,e.workspaceId);if(s||et(`Highlight regeneration run ${e.runId} not found`),$s(s.status)||J(`invalid highlight regeneration status: ${s.status}`),s.status==="completed"||s.status==="failed")return s;o.update(q).set({status:"failed",completed_at:n,error_code:e.errorCode}).where(and(eq(q.id,s.id),inArray(q.status,oo))).run();let i=o.select().from(q).where(eq(q.id,s.id)).get();if(!i)throw new l("DB_ERROR","Highlight regeneration run failure did not return a row");return i},{behavior:"immediate"})}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to fail highlight regeneration run",o)}finally{r.close();}}failHighlightRegeneration(e){return this.failHighlightRegenerationRun(e)}recoverInterruptedHighlightRegenerationRuns(e=kc){D(e,"errorCode");let n=new Date().toISOString(),r=this.openHandle(true);try{return r.db.transaction(o=>o.update(q).set({status:"failed",completed_at:n,error_code:e}).where(inArray(q.status,oo)).run().changes,{behavior:"immediate"})}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to recover interrupted highlight runs",o)}finally{r.close();}}completeHighlightRegenerationRun(e){D(e.runId,"runId"),D(e.threadId,"threadId"),D(e.workspaceId,"workspaceId"),D(e.detectorVersion,"detectorVersion");let n=ih(e.candidates),r=nr(e),o=this.openHandle(true),s=false;try{return o.db.transaction(i=>{let d=this.findRegenerationRun(i,e.runId,e.workspaceId);if((!d||d.thread_id!==e.threadId)&&et(`Highlight regeneration run ${e.runId} not found`),$s(d.status)||J(`invalid highlight regeneration status: ${d.status}`),d.status==="failed")throw new l("CONFLICT","Highlight regeneration run has already failed");if(d.status==="completed")return {run:d,deletedCount:0,createdCount:0,previousAutoCount:d.previous_auto_count??0,newAutoCount:d.new_auto_count??0};s=!0;let c=this.findThread(i,e.threadId,e.workspaceId);c||et(`Thread ${e.threadId} not found`),d.detector_version!==e.detectorVersion&&J("detectorVersion does not match the regeneration run");let u=i.select().from(L).where(eq(L.thread_id,c.id)).orderBy(asc(L.created_at),asc(L.id)).all(),f=new Set(n.map(O=>O.contentFingerprint)),p=u.filter(O=>O.source==="auto"&&O.status==="active"&&O.revision===0&&!f.has(O.content_fingerprint??"")),g=u.filter(O=>O.source==="auto"&&O.status==="active").length,m=new Set(u.filter(O=>!p.includes(O)&&O.content_fingerprint).map(O=>O.content_fingerprint)),w=n.filter(O=>!m.has(O.contentFingerprint)),_=new Date().toISOString(),T=rr(i,c.id)+1;or(i,c.id)||(sr(i,c,r,_,T),T+=1);for(let O of p)i.delete(L).where(eq(L.id,O.id)).run(),dh(i,O,r,_,T,{runId:e.runId,reason:_c}),T+=1;let S=0,M=e.agentId??(r.actorType==="agent"?r.actorId:null);for(let O of w){let ue=Le("thl");i.insert(L).values({id:ue,thread_id:c.id,source:"auto",kind:O.kind,status:"active",text:O.text,covers_from_task_id:O.coversFromTaskId,covers_to_task_id:O.coversToTaskId,revision:0,created_at:_,updated_at:_,agent_id:M,source_task_id:O.anchorTaskId,detector_version:e.detectorVersion,content_fingerprint:O.contentFingerprint,dismissed_at:null}).run();let je=i.select().from(L).where(eq(L.id,ue)).get();if(!je)throw new l("DB_ERROR","Regenerated highlight insert did not return a row");so(i,je,r,_,"thread.highlight.created",T),T+=1,S+=1;}let E=i.select().from(L).where(eq(L.thread_id,c.id)).all().filter(O=>O.source==="auto"&&O.status==="active").length;Vt(i,{threadId:c.id,seq:T,type:"thread.highlights.regenerated",actorType:r.actorType,actorId:r.actorId,createdAt:_,payload:{runId:d.id,detectorVersion:e.detectorVersion,previousAutoCount:g,newAutoCount:E,deletedCount:p.length,createdCount:S}}),i.update(q).set({status:"completed",started_at:d.started_at??_,completed_at:_,error_code:null,previous_auto_count:g,new_auto_count:E}).where(and(eq(q.id,d.id),inArray(q.status,oo))).run();let x=i.select().from(q).where(eq(q.id,d.id)).get();if(!x)throw new l("DB_ERROR","Highlight regeneration completion did not return a row");return {run:x,deletedCount:p.length,createdCount:S,previousAutoCount:g,newAutoCount:E}},{behavior:"immediate"})}catch(i){if(s)try{this.failHighlightRegenerationRun({runId:e.runId,workspaceId:e.workspaceId,errorCode:Tc});}catch{}throw i instanceof l?i:new l("DB_ERROR","Failed to complete highlight regeneration",i)}finally{o.close();}}completeHighlightRegeneration(e){return this.completeHighlightRegenerationRun(e)}replaceAutoHighlightsAtomically(e){return this.completeHighlightRegenerationRun(e)}listTimeline(e,n,r={}){let o=typeof e=="string"?{...r,threadId:e,workspaceId:n}:e;D(o.threadId,"threadId"),D(o.workspaceId,"workspaceId");let s=nh(o);if(!existsSync(this.resolveDbPath()))return null;let i=this.openHandle(false);try{if(!this.findThread(i.db,o.threadId,o.workspaceId))return null;let d=i.db.select({maxSeq:sql`COALESCE(MAX(${G.seq}), 0)`}).from(G).where(eq(G.thread_id,o.threadId)).get()?.maxSeq??0,c;o.beforeSeq!==void 0?c=i.db.select().from(G).where(and(eq(G.thread_id,o.threadId),lt(G.seq,o.beforeSeq))).orderBy(desc(G.seq)).limit(s+1).all().reverse():o.afterSeq!==void 0?c=i.db.select().from(G).where(and(eq(G.thread_id,o.threadId),sql`${G.seq} > ${o.afterSeq}`)).orderBy(asc(G.seq)).limit(s+1).all():c=i.db.select().from(G).where(eq(G.thread_id,o.threadId)).orderBy(desc(G.seq)).limit(s+1).all().reverse();let u=c.length>s,f=o.afterSeq!==void 0?c.slice(0,s):u?c.slice(1):c,p=!1,g=f[0];return g&&(p=!!i.db.select({id:G.id}).from(G).where(and(eq(G.thread_id,o.threadId),lt(G.seq,g.seq))).limit(1).get()),{items:f,latestSeq:d,hasMoreOlder:p}}catch(d){throw d instanceof l?d:new l("DB_ERROR","Failed to list thread timeline",d)}finally{i.close();}}listEvents(e,n,r){return this.listTimeline(e,n,r)}getTimeline(e,n,r){return this.listTimeline(e,n,r)}createHighlight(e){let n=oh(e),r=nr(e),o=new Date().toISOString(),s=this.openHandle(true);try{return s.db.transaction(i=>{let d=this.findThread(i,e.threadId,e.workspaceId);if(d||et(`Thread ${e.threadId} not found`),n.source==="auto"){let g=i.select().from(L).where(and(eq(L.thread_id,e.threadId),eq(L.source_task_id,n.sourceTaskId),eq(L.detector_version,n.detectorVersion),eq(L.content_fingerprint,n.contentFingerprint))).orderBy(asc(L.created_at),asc(L.id)).limit(1).get();if(g)return g}let c=e.id??Le("thl"),u={id:c,thread_id:e.threadId,source:n.source,kind:n.kind,status:"active",text:n.text,covers_from_task_id:n.coversFromTaskId,covers_to_task_id:n.coversToTaskId,revision:0,created_at:o,updated_at:o,agent_id:n.agentId,source_task_id:n.sourceTaskId,detector_version:n.detectorVersion,content_fingerprint:n.contentFingerprint,dismissed_at:null};i.insert(L).values(u).run();let f=i.select().from(L).where(eq(L.id,c)).get();if(!f)throw new l("DB_ERROR","Highlight insert did not return a row");let p=rr(i,d.id)+1;return or(i,d.id)||(sr(i,d,r,o,p),p+=1),so(i,f,r,o,"thread.highlight.created",p),f},{behavior:"immediate"})}catch(i){throw i instanceof l?i:new l("DB_ERROR","Failed to create thread highlight",i)}finally{s.close();}}updateHighlight(e){D(e.threadId,"threadId"),D(e.workspaceId,"workspaceId"),D(e.highlightId,"highlightId"),(!Number.isInteger(e.expectedRevision)||e.expectedRevision<0)&&J("expectedRevision must be a non-negative integer"),e.text===void 0&&e.kind===void 0&&e.coversFromTaskId===void 0&&e.coversToTaskId===void 0&&J("highlight update requires at least one field"),e.kind!==void 0&&js(e.kind);let n=e.text===void 0?void 0:Fs(e.text),r=nr(e),o=new Date().toISOString(),s=this.openHandle(true);try{return s.db.transaction(i=>{let d=this.findThread(i,e.threadId,e.workspaceId);d||et(`Thread ${e.threadId} not found`);let c=i.select().from(L).where(and(eq(L.id,e.highlightId),eq(L.thread_id,d.id))).limit(1).get();if(c||et(`Highlight ${e.highlightId} not found`),c.revision!==e.expectedRevision)throw new yn(d.id,c.id,e.expectedRevision,c.revision);if(c.status!=="active")throw new yn(d.id,c.id,e.expectedRevision,c.revision);let u=e.kind??c.kind,f=n??c.text,p=e.coversFromTaskId??c.covers_from_task_id,g=e.coversToTaskId??c.covers_to_task_id;(!f||p.length===0||g.length===0)&&J("highlight projection is incomplete");let m=u!==c.kind||f!==c.text||p!==c.covers_from_task_id||g!==c.covers_to_task_id,w=r.actorType==="user"&&c.source==="auto"&&m?"manual":c.source;if(!(m||w!==c.source))return c;let T=c.revision+1;i.update(L).set({source:w,kind:u,text:f,covers_from_task_id:p,covers_to_task_id:g,revision:T,updated_at:o}).where(and(eq(L.id,c.id),eq(L.revision,c.revision))).run();let S=i.select().from(L).where(eq(L.id,c.id)).get();if(!S)throw new l("DB_ERROR","Highlight update did not return a row");let M=rr(i,d.id)+1;return or(i,d.id)||(sr(i,d,r,o,M),M+=1),so(i,S,r,o,"thread.highlight.updated",M,c),S},{behavior:"immediate"})}catch(i){throw i instanceof l?i:new l("DB_ERROR","Failed to update thread highlight",i)}finally{s.close();}}dismissHighlight(e){D(e.threadId,"threadId"),D(e.workspaceId,"workspaceId"),D(e.highlightId,"highlightId"),(!Number.isInteger(e.expectedRevision)||e.expectedRevision<0)&&J("expectedRevision must be a non-negative integer");let n=nr(e),r=new Date().toISOString(),o=this.openHandle(true);try{return o.db.transaction(s=>{let i=this.findThread(s,e.threadId,e.workspaceId);i||et(`Thread ${e.threadId} not found`);let d=s.select().from(L).where(and(eq(L.id,e.highlightId),eq(L.thread_id,i.id))).limit(1).get();if(d||et(`Highlight ${e.highlightId} not found`),d.revision!==e.expectedRevision)throw new yn(i.id,d.id,e.expectedRevision,d.revision);if(d.status==="dismissed")return d;let c=d.revision+1;s.update(L).set({status:"dismissed",text:null,revision:c,updated_at:r,dismissed_at:r}).where(and(eq(L.id,d.id),eq(L.revision,d.revision))).run();let u=s.select().from(L).where(eq(L.id,d.id)).get();if(!u)throw new l("DB_ERROR","Highlight dismissal did not return a row");let f=rr(s,i.id)+1;return or(s,i.id)||(sr(s,i,n,r,f),f+=1),so(s,u,n,r,"thread.highlight.deleted",f,d),u},{behavior:"immediate"})}catch(s){throw s instanceof l?s:new l("DB_ERROR","Failed to dismiss thread highlight",s)}finally{o.close();}}listActiveHighlights(e,n,r={}){if(D(e,"threadId"),D(n,"workspaceId"),r.taskId!==void 0&&D(r.taskId,"taskId"),r.coversFromTaskId!==void 0&&D(r.coversFromTaskId,"coversFromTaskId"),r.coversToTaskId!==void 0&&D(r.coversToTaskId,"coversToTaskId"),!existsSync(this.resolveDbPath()))return null;let o=this.openHandle(false);try{if(!this.findThread(o.db,e,n))return null;let i=o.db.select().from(L).where(and(eq(L.thread_id,e),eq(L.status,"active"))).orderBy(asc(L.created_at),asc(L.id)).all();if(r.taskId===void 0&&r.coversFromTaskId===void 0&&r.coversToTaskId===void 0)return i;let d=o.db.all(sql`
421
+ `),u},{behavior:"immediate"})}}catch(s){throw s instanceof l?s:new l("DB_ERROR","Failed to save user message",s)}finally{o.close();}}saveAssistantMessage(e,n,r){if(!this.dbExists())return;let o=this.openHandle(true);try{let s=new Date().toISOString();o.db.update(w).set({last_message:n,updated_at:s}).where(eq(w.id,e)).run();}catch(s){throw s instanceof l?s:new l("DB_ERROR","Failed to save assistant message",s)}finally{o.close();}}updateThread(e,n){if(!this.dbExists())return;let r=this.openHandle(true);try{let o={updated_at:new Date().toISOString()};n.title!==void 0&&(o.title=n.title,o.title_locked=1),n.titleLocked!==void 0&&(o.title_locked=n.titleLocked?1:0),r.db.update(w).set(o).where(eq(w.id,e)).run();}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to update thread",o)}finally{r.close();}}patchThreadTitleMetadata(e,n,r){let o=n;if(!o||typeof o!="object"||Array.isArray(o))return new Gt("THREAD_TITLE_PATCH_INVALID","Thread-title metadata patch must be an object");if(Object.keys(o).some(c=>c!=="priority"&&c!=="state"))return new Gt("THREAD_TITLE_PATCH_INVALID","Thread-title metadata patch only supports priority and state");let i=o;if(i.priority===void 0&&i.state===void 0)return new Gt("THREAD_TITLE_PATCH_EMPTY","Thread-title metadata patch must change priority or state");for(let c of [i.priority,i.state])if(c!=null&&(typeof c!="string"||c.length===0))return new Gt("THREAD_TITLE_PATCH_INVALID","Thread-title metadata values must be non-empty strings or null");let d=this.openHandle(true);try{let c=r?and(eq(w.id,e),eq(w.workspace_id,r)):eq(w.id,e);return d.db.transaction(u=>{let f=u.select({metadata:w.metadata}).from(w).where(c).get();if(!f)return null;let p=Zn(f.metadata),g=p.threadTitle,m=g&&typeof g=="object"&&!Array.isArray(g)?{...g}:{};i.priority===null?delete m.priority:i.priority!==void 0&&(m.priority=i.priority),i.state===null?delete m.state:i.state!==void 0&&(m.state=i.state),Object.keys(m).length>0?p.threadTitle=m:delete p.threadTitle;let _=Object.keys(p).length>0?JSON.stringify(p):null,k=new Date().toISOString();u.update(w).set({metadata:_,updated_at:k}).where(c).run();let T=u.select({metadata:w.metadata}).from(w).where(c).get();if(!T)throw new l("DB_ERROR","Thread-title metadata update could not be read back");let S=Yg(T.metadata);return {threadId:e,priority:S.priority,state:S.state}},{behavior:"immediate"})}catch(c){throw c instanceof l?c:new l("DB_ERROR","Failed to patch thread-title metadata",c)}finally{d.close();}}togglePin(e,n){let r=this.openHandle(true);try{let o=n?and(eq(w.id,e),eq(w.workspace_id,n)):eq(w.id,e);return r.db.transaction(s=>{let i=s.select({pinned:w.pinned,metadata:w.metadata}).from(w).where(o).get();if(!i)return null;let d=i.pinned?0:1,c=Zn(i.metadata);if(d){let u=n?and(eq(w.pinned,1),eq(w.workspace_id,n)):eq(w.pinned,1),f=s.select({metadata:w.metadata}).from(w).where(u).all(),p=null;for(let g of f){let m=Zn(g.metadata);typeof m.pinOrder=="number"&&(p===null||m.pinOrder<p)&&(p=m.pinOrder);}c.pinOrder=p===null?0:p-1;}else delete c.pinOrder;return s.update(w).set({pinned:d,metadata:Object.keys(c).length>0?JSON.stringify(c):null}).where(o).run(),{pinned:!!d}},{behavior:"immediate"})}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to toggle pin",o)}finally{r.close();}}reorderPins(e,n){let r=this.openHandle(true);try{r.db.transaction(o=>{for(let s=0;s<e.length;s++){let i=n?and(eq(w.id,e[s]),eq(w.workspace_id,n)):eq(w.id,e[s]),d=o.select({metadata:w.metadata}).from(w).where(i).get();if(!d)continue;let c=Zn(d.metadata);c.pinOrder=s+1,o.update(w).set({metadata:JSON.stringify(c)}).where(i).run();}},{behavior:"immediate"});}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to reorder pins",o)}finally{r.close();}}toggleStar(e,n){let r=this.openHandle(true);try{let o=n?and(eq(w.id,e),eq(w.workspace_id,n)):eq(w.id,e),s=r.db.select({starred:w.starred}).from(w).where(o).get();if(!s)return null;let i=s.starred?0:1;return r.db.update(w).set({starred:i}).where(o).run(),{starred:!!i}}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to toggle star",o)}finally{r.close();}}resolveOverdriveForRequest(e,n,r,o){let i=this.openHandle(true);try{let d=n?and(eq(w.id,e),eq(w.workspace_id,n)):eq(w.id,e);return i.db.transaction(u=>{let f=u.select({metadata:w.metadata}).from(w).where(d).get();if(!f)return null;let p=f.metadata?JSON.parse(f.metadata):{},g=p.overdrive??{},m=o?.defaultTurns??g.defaultTurns??3,_=o?.updatedBy??"ui",k=new Date().toISOString(),T,S,D,U;switch(r){case "enable-count":{let R=o?.turns??m,O=o?.consumeCurrent?Math.max(R-1,0):R;T=O>0?"count":"off",S=O,D=!0,U="count";break}case "enable-latch":{T="latch",S=0,D=!0,U="latch";break}case "disable":{T="off",S=0,D=!1;break}default:{let R=g.state??"off",O=typeof g.remaining=="number"?g.remaining:0;if(R==="count"&&O>0){let N=O-1;N<=0?(T="off",S=0):(T="count",S=N),D=!0,U="count";}else R==="latch"?(T="latch",S=0,D=!0,U="latch"):(T="off",S=0,D=!1);break}}return p.overdrive={state:T,remaining:S,defaultTurns:m,updatedAt:k,updatedBy:_},u.update(w).set({metadata:JSON.stringify(p),updated_at:k}).where(d).run(),{applied:D,appliedMode:U,state:T,remaining:S}},{behavior:"immediate"})}catch(d){throw d instanceof l?d:new l("DB_ERROR","Failed to resolve overdrive",d)}finally{i.close();}}};h();oe();fe();ae();pe();de();h();var gc=["urgent","high","medium","low"],hc=["investigating","in-progress","in-review","on-hold","done"],er="custom:";var Xg=new Set(gc),Qg=new Set(hc),Zg={urgent:"U \uAE34\uAE09 Urgent",high:"P0 \uAE09\uD568 High",medium:"P1 \uC911\uC694 Medium",low:"P2 \uBCF4\uD1B5 Low"},$s={investigating:"\uC870\uC0AC\uC911 Looking into","in-progress":"\uC9C4\uD589\uC911 In progress","in-review":"\uAC80\uD1A0\uC911 In review","on-hold":"\uBCF4\uB958 On hold",done:"\uC644\uB8CC Done"};function fc(t,e){return !e||e.includes(t)?e??t:`${t} ${e}`}function tr(t){return typeof t=="string"&&Xg.has(t)}function nr(t){if(typeof t!="string")return false;if(Qg.has(t))return true;if(t.startsWith("c_"))return t.length>2;if(!t.startsWith(er))return false;let e=t.slice(er.length);return e.length>=1&&e.length<=20}function mc(t){if(t.startsWith(er))return t.slice(er.length)}function qs(t){if(!t)return null;try{let e=JSON.parse(t);return !e||typeof e!="object"||Array.isArray(e)?null:e}catch{return null}}function eh(t){let e=qs(t);return !!e&&Object.prototype.hasOwnProperty.call(e,"threadTitle")}function ao(t){let e=qs(t);if(!e)return {};let n=e.threadTitle;if(!n||typeof n!="object"||Array.isArray(n))return {};let r=n,o={};return tr(r.priority)&&(o.priority=r.priority),nr(r.state)&&(o.state=r.state),o}function Fs(t,e){let n=qs(t)??{},r={...ao(t)};return e.priority===null?delete r.priority:e.priority!==void 0&&(r.priority=e.priority),e.state===null?delete r.state:e.state!==void 0&&(r.state=e.state),r.priority===void 0&&r.state===void 0?delete n.threadTitle:n.threadTitle=r,Object.keys(n).length===0?null:JSON.stringify(n)}function th(t,e=new Map){let n=[];return t.priority&&n.push(fc(Zg[t.priority],e.get(t.priority))),t.state&&(t.state.startsWith(er)?n.push(mc(t.state)??""):$s[t.state]?n.push(fc($s[t.state],e.get(t.state))):e.has(t.state)?n.push(t.state,e.get(t.state)??""):t.state.startsWith("c_")?n.push(t.state):n.push($s[t.state]??"")),n.filter(Boolean).join(" ")}function _c(t,e){if(!t||t.trim().length===0)return;let n=new Set,r=false,o=false;for(let s of t.split(",")){let i=s.trim();if(i){if(i==="none"){r=true,o=true;continue}e(i)&&(n.add(i),o=true);}}if(o)return {values:n,includeNone:r}}function nh(t){return _c(t,tr)}function rh(t){return _c(t,nr)}function oh(t,e){return e?t?e.values.has(t):e.includeNone:true}jn();var Rc="regeneration_replaced",ch="THREAD_HIGHLIGHT_REGENERATION_NO_ELIGIBLE_TURNS",Ec="THREAD_HIGHLIGHT_REGENERATION_INTERRUPTED",uh="THREAD_HIGHLIGHT_REGENERATION_DETECTION_FAILED",Sc="THREAD_HIGHLIGHT_REGENERATION_COMMIT_FAILED",po=class extends l{threadId;highlightId;expectedRevision;currentRevision;constructor(e,n,r,o){super("CONFLICT",`Highlight revision conflict: expected ${r}, current ${o}`),this.name="ThreadHistoryConflictError",this.threadId=e,this.highlightId=n,this.expectedRevision=r,this.currentRevision=o;}},Sn=class extends po{},fo=class extends l{stableCode="THREAD_HIGHLIGHT_REGENERATION_IN_PROGRESS";run;constructor(e){super("CONFLICT","THREAD_HIGHLIGHT_REGENERATION_IN_PROGRESS"),this.name="ThreadHighlightRegenerationConflictError",this.run=e;}},lh=new Set(Li),ph=new Set(Di),fh=new Set(Mi),gh=new Set(Hi),hh=50,Tc=100,wc=280,yc=40,mh=new Set(Ui),co=["queued","running"];function js(t){return mh.has(t)}function Y(t){throw new l("VALIDATION",t)}function tt(t){throw new l("NOT_FOUND",t)}function L(t,e){(typeof t!="string"||t.trim().length===0)&&Y(`${e} is required`);}function or(t={}){let e=t.actor??t,n=e.actorType??"system";return lh.has(n)||Y(`invalid actorType: ${String(n)}`),e.actorId!==void 0&&e.actorId!==null&&typeof e.actorId!="string"&&Y("actorId must be a string or null"),{actorType:n,actorId:e.actorId??null}}function _h(t){L(t.threadId,"threadId"),t.workspaceId!==void 0&&t.workspaceId!==null&&L(t.workspaceId,"workspaceId"),t.title!==void 0&&t.title!==null&&((typeof t.title!="string"||t.title.trim().length===0)&&Y("title must not be empty"),t.title.length>120&&Y("title must be at most 120 characters")),t.priority!==void 0&&t.priority!==null&&!tr(t.priority)&&Y(`invalid priority: ${String(t.priority)}`),t.state!==void 0&&t.state!==null&&!nr(t.state)&&Y(`invalid state: ${String(t.state)}`);}function kh(t){t.beforeSeq!==void 0&&t.afterSeq!==void 0&&Y("beforeSeq and afterSeq cannot be used together");for(let[n,r]of [["beforeSeq",t.beforeSeq],["afterSeq",t.afterSeq]])r!==void 0&&(!Number.isInteger(r)||r<0)&&Y(`${n} must be a non-negative integer`);let e=t.limit??hh;return (!Number.isInteger(e)||e<1||e>Tc)&&Y(`limit must be between 1 and ${Tc}`),e}function Gs(t){typeof t!="string"&&Y("text is required");let e=t.trim();return e.length===0&&Y("text must not be empty"),e.length>wc&&Y(`text must be at most ${wc} characters`),e}function Rt(t,e){return L(t??"",e),t}function Ws(t){gh.has(t)||Y(`invalid highlight kind: ${String(t)}`);}function Th(t){fh.has(t)||Y(`invalid highlight source: ${String(t)}`);}function wh(t){L(t.threadId,"threadId"),L(t.workspaceId,"workspaceId");let e=t.source??"manual";Th(e),Ws(t.kind);let n=Gs(t.text),r=t.coversFromTaskId??t.fromTaskId??t.taskId,o=t.coversToTaskId??t.toTaskId??t.taskId;if(e==="manual"){let f=t.taskId??(r&&o&&r===o?r:void 0),p=Rt(f,"taskId");return (r!==p||o!==p)&&Y("manual highlights must cover exactly one task"),{source:e,kind:t.kind,text:n,coversFromTaskId:p,coversToTaskId:p,agentId:t.agentId??null,sourceTaskId:null,detectorVersion:null,contentFingerprint:null}}let s=Rt(r,"coversFromTaskId"),i=Rt(o,"coversToTaskId"),d=t.sourceTaskId??s,c=t.detectorVersion??(t.idempotencyKey!==void 0?"default":null),u=t.contentFingerprint??t.idempotencyKey??null;return Rt(d??void 0,"sourceTaskId"),Rt(c??void 0,"detectorVersion"),Rt(u??void 0,"contentFingerprint"),{source:e,kind:t.kind,text:n,coversFromTaskId:s,coversToTaskId:i,agentId:t.agentId??null,sourceTaskId:d,detectorVersion:c,contentFingerprint:u}}function yh(t,e){(!t||typeof t!="object")&&Y(`candidates[${e}] is required`),Ws(t.kind);let n=Gs(t.text),r=Rt(t.anchorTaskId,`candidates[${e}].anchorTaskId`),o=Rt(t.coversFromTaskId,`candidates[${e}].coversFromTaskId`),s=Rt(t.coversToTaskId,`candidates[${e}].coversToTaskId`),i=t.contentFingerprint?.trim()||Yi("thl",JSON.stringify({kind:t.kind,text:n,anchorTaskId:r,coversFromTaskId:o,coversToTaskId:s}));return L(i,`candidates[${e}].contentFingerprint`),{kind:t.kind,text:n,anchorTaskId:r,coversFromTaskId:o,coversToTaskId:s,contentFingerprint:i}}function Rh(t){Array.isArray(t)||Y("candidates must be an array"),t.length>yc&&Y(`candidates must contain at most ${yc} items`);let e=new Map;for(let[n,r]of t.entries()){let o=yh(r,n);e.set(o.contentFingerprint,o);}return [...e.values()]}function dr(t){let e=ao(t.metadata);return {threadId:t.id,workspaceId:t.workspace_id,title:t.title,priority:e.priority??null,state:e.state??null,metadata:t.metadata,titleLocked:t.title_locked===1,updatedAt:t.updated_at}}function Eh(t){try{let e=JSON.stringify(t);return (!e||e==="null"||e.startsWith("["))&&Y("event payload must be a JSON object"),e}catch(e){throw new l("VALIDATION","event payload must be JSON serializable",e)}}function sr(t,e){return t.select({maxSeq:sql`COALESCE(MAX(${W.seq}), 0)`}).from(W).where(eq(W.thread_id,e)).get()?.maxSeq??0}function ir(t,e){return !!t.select({id:W.id}).from(W).where(eq(W.thread_id,e)).limit(1).get()}function Wt(t,e){ph.has(e.type)||Y(`invalid thread event type: ${String(e.type)}`);let n=Le("the");t.insert(W).values({id:n,thread_id:e.threadId,seq:e.seq,type:e.type,actor_type:e.actorType,actor_id:e.actorId,task_id:e.taskId??null,highlight_id:e.highlightId??null,payload_json:Eh(e.payload),created_at:e.createdAt}).run();let r=t.select().from(W).where(eq(W.id,n)).get();if(!r)throw new l("DB_ERROR","Thread event insert did not return a row");return r}function ar(t,e,n,r,o){let s=dr(e);Wt(t,{threadId:e.id,seq:o,type:"thread.snapshot.imported",actorType:n.actorType,actorId:n.actorId,createdAt:r,payload:{title:s.title,priority:s.priority,state:s.state}});}function lo(t){return {highlightId:t.id,source:t.source,kind:t.kind,status:t.status,coversFromTaskId:t.covers_from_task_id,coversToTaskId:t.covers_to_task_id,revision:t.revision,...t.dismissed_at===null?{}:{dismissedAt:t.dismissed_at}}}function uo(t,e,n,r,o,s,i){let d=o==="thread.highlight.created"?lo(e):{before:i?lo({...e,...i,id:e.id}):void 0,after:lo(e)};return Wt(t,{threadId:e.thread_id,seq:s,type:o,actorType:n.actorType,actorId:n.actorId,createdAt:r,taskId:e.source==="manual"?e.covers_from_task_id:e.source_task_id??e.covers_from_task_id,highlightId:e.id,payload:d})}function Sh(t,e,n,r,o,s){return Wt(t,{threadId:e.thread_id,seq:o,type:"thread.highlight.deleted",actorType:n.actorType,actorId:n.actorId,createdAt:r,taskId:e.source_task_id??e.covers_from_task_id,highlightId:e.id,payload:{before:lo(e),...s??{}}})}var zs=class extends B{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath??super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(!e&&!existsSync(n))throw new l("NOT_FOUND","Database not found");if(e){let o=dirname(n);existsSync(o)||mkdirSync(o,{recursive:true});}let r=P(n);if(e)try{K(r.db,n);}catch(o){throw r.close(),o}return r}findThread(e,n,r){let o=eq(w.id,n),s=r===void 0?o:r===null?and(o,isNull(w.workspace_id)):and(o,eq(w.workspace_id,r));return e.select().from(w).where(s).limit(1).get()}findRegenerationRun(e,n,r){let o=e.select().from(F).where(eq(F.id,n)).limit(1).get();if(o&&!(r!==void 0&&!this.findThread(e,o.thread_id,r)))return o}resolveWorkspaceId(e){if(L(e,"threadId"),!existsSync(this.resolveDbPath()))return null;let n=this.openHandle(false);try{return n.db.select({workspaceId:w.workspace_id}).from(w).where(eq(w.id,e)).limit(1).get()?.workspaceId??null}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to resolve thread workspace",r)}finally{n.close();}}getSnapshot(e,n){if(L(e,"threadId"),!existsSync(this.resolveDbPath()))return null;let r=this.openHandle(false);try{let o=this.findThread(r.db,e,n);return o?dr(o):null}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to read thread snapshot",o)}finally{r.close();}}updateSnapshot(e){_h(e);let n=or(e),r=new Date().toISOString(),o=this.openHandle(true);try{return o.db.transaction(s=>{let i=this.findThread(s,e.threadId,e.workspaceId);i||tt(`Thread ${e.threadId} not found`);let d=dr(i),c=e.title!==void 0,u=c&&e.title!==d.title,f=c&&i.title_locked!==1,p=e.priority!==void 0&&e.priority!==d.priority,g=e.state!==void 0&&e.state!==d.state,m=u||p||g;if(!m&&!f)return d;let _=i.metadata;(p||g)&&(_=Fs(i.metadata,{priority:e.priority,state:e.state}));let k={};if(m&&(k.metadata=_,k.updated_at=r),u&&(k.title=e.title),c&&(k.title_locked=1),s.update(w).set(k).where(e.workspaceId===void 0?eq(w.id,e.threadId):e.workspaceId===null?and(eq(w.id,e.threadId),isNull(w.workspace_id)):and(eq(w.id,e.threadId),eq(w.workspace_id,e.workspaceId))).run(),!m){let D={...i,title_locked:1};return dr(D)}let T=sr(s,i.id)+1;ir(s,i.id)||(ar(s,i,n,r,T),T+=1),u&&(Wt(s,{threadId:i.id,seq:T,type:"thread.title.changed",actorType:n.actorType,actorId:n.actorId,createdAt:r,taskId:e.taskId,payload:{before:d.title,after:e.title}}),T+=1),p&&(Wt(s,{threadId:i.id,seq:T,type:"thread.priority.changed",actorType:n.actorType,actorId:n.actorId,createdAt:r,taskId:e.taskId,payload:{before:d.priority,after:e.priority}}),T+=1),g&&Wt(s,{threadId:i.id,seq:T,type:"thread.state.changed",actorType:n.actorType,actorId:n.actorId,createdAt:r,taskId:e.taskId,payload:{before:d.state,after:e.state}});let S={...i,title:u?e.title:i.title,metadata:_,title_locked:c?1:i.title_locked,updated_at:r};return dr(S)},{behavior:"immediate"})}catch(s){throw s instanceof l?s:new l("DB_ERROR","Failed to update thread snapshot",s)}finally{o.close();}}mutateSnapshot(e){return this.updateSnapshot(e)}updateThreadSnapshot(e){return this.updateSnapshot(e)}getLatestSeq(e,n){if(L(e,"threadId"),!existsSync(this.resolveDbPath()))return null;let r=this.openHandle(false);try{return this.findThread(r.db,e,n)?r.db.select({maxSeq:sql`COALESCE(MAX(${W.seq}), 0)`}).from(W).where(eq(W.thread_id,e)).get()?.maxSeq??0:null}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to read latest thread event sequence",o)}finally{r.close();}}listCompletedThreadHighlightTurns(e,n){if(L(e,"threadId"),L(n,"workspaceId"),!existsSync(this.resolveDbPath()))return null;let r=this.openHandle(false);try{return this.findThread(r.db,e,n)?r.db.select({taskId:a.id,prompt:a.prompt,result:a.result,status:a.status,startedAt:a.started_at,completedAt:a.completed_at}).from(a).where(and(eq(a.thread_id,e),eq(a.workspace_id,n),inArray(a.status,[...ss,"completed","done","error"]),or$1(isNull(a.parent_task_id),eq(a.parent_task_id,"")),sql`${a.result} IS NOT NULL AND length(trim(${a.result})) > 0`)).orderBy(asc(a.started_at),asc(a.id)).all().map(i=>({taskId:i.taskId,prompt:i.prompt,result:i.result,status:i.status,startedAt:i.startedAt,completedAt:i.completedAt})):null}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to read completed thread highlight turns",o)}finally{r.close();}}createHighlightRegenerationRun(e){L(e.threadId,"threadId"),L(e.workspaceId,"workspaceId"),L(e.requestId,"requestId"),L(e.detectorVersion,"detectorVersion"),e.runId!==void 0&&L(e.runId,"runId");let n=new Date().toISOString(),r=this.openHandle(true);try{return r.db.transaction(o=>{let s=this.findThread(o,e.threadId,e.workspaceId);s||tt(`Thread ${e.threadId} not found`);let i=o.select().from(F).where(and(eq(F.thread_id,s.id),eq(F.request_id,e.requestId))).orderBy(desc(F.requested_at),desc(F.id)).limit(1).get();if(i)return {run:i,created:!1};let d=o.select().from(F).where(and(eq(F.thread_id,s.id),inArray(F.status,co))).orderBy(asc(F.requested_at),asc(F.id)).limit(1).get();if(d)throw new fo(d);let c=e.runId??Le("thr");o.insert(F).values({id:c,thread_id:s.id,request_id:e.requestId,status:"queued",detector_version:e.detectorVersion,requested_at:n,started_at:null,completed_at:null,error_code:null,previous_auto_count:null,new_auto_count:null}).run();let u=o.select().from(F).where(eq(F.id,c)).get();if(!u)throw new l("DB_ERROR","Highlight regeneration run insert did not return a row");return {run:u,created:!0}},{behavior:"immediate"})}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to create highlight regeneration run",o)}finally{r.close();}}beginHighlightRegenerationRun(e){return this.createHighlightRegenerationRun(e)}queueHighlightRegenerationRun(e){return this.createHighlightRegenerationRun(e)}getHighlightRegenerationRun(e,n){if(L(e,"runId"),n!==void 0&&L(n,"workspaceId"),!existsSync(this.resolveDbPath()))return null;let r=this.openHandle(false);try{return this.findRegenerationRun(r.db,e,n)??null}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to read highlight regeneration run",o)}finally{r.close();}}getHighlightRegenerationRunByRequest(e,n,r){if(L(e,"threadId"),L(n,"workspaceId"),L(r,"requestId"),!existsSync(this.resolveDbPath()))return null;let o=this.openHandle(false);try{return this.findThread(o.db,e,n)?o.db.select().from(F).where(and(eq(F.thread_id,e),eq(F.request_id,r))).orderBy(desc(F.requested_at),desc(F.id)).limit(1).get()??null:null}catch(s){throw s instanceof l?s:new l("DB_ERROR","Failed to read highlight regeneration request",s)}finally{o.close();}}findHighlightRegenerationRun(e,n,r){return this.getHighlightRegenerationRunByRequest(e,n,r)}startHighlightRegenerationRun(e,n){L(e,"runId"),n!==void 0&&L(n,"workspaceId");let r=new Date().toISOString(),o=this.openHandle(true);try{return o.db.transaction(s=>{let i=this.findRegenerationRun(s,e,n);if(i||tt(`Highlight regeneration run ${e} not found`),js(i.status)||Y(`invalid highlight regeneration status: ${i.status}`),i.status!=="queued")return i;s.update(F).set({status:"running",started_at:r}).where(and(eq(F.id,i.id),eq(F.status,"queued"))).run();let d=s.select().from(F).where(eq(F.id,i.id)).get();if(!d)throw new l("DB_ERROR","Highlight regeneration run start did not return a row");return d},{behavior:"immediate"})}catch(s){throw s instanceof l?s:new l("DB_ERROR","Failed to start highlight regeneration run",s)}finally{o.close();}}startHighlightRegeneration(e,n){return this.startHighlightRegenerationRun(e,n)}failHighlightRegenerationRun(e){L(e.runId,"runId"),L(e.errorCode,"errorCode"),e.workspaceId!==void 0&&L(e.workspaceId,"workspaceId");let n=new Date().toISOString(),r=this.openHandle(true);try{return r.db.transaction(o=>{let s=this.findRegenerationRun(o,e.runId,e.workspaceId);if(s||tt(`Highlight regeneration run ${e.runId} not found`),js(s.status)||Y(`invalid highlight regeneration status: ${s.status}`),s.status==="completed"||s.status==="failed")return s;o.update(F).set({status:"failed",completed_at:n,error_code:e.errorCode}).where(and(eq(F.id,s.id),inArray(F.status,co))).run();let i=o.select().from(F).where(eq(F.id,s.id)).get();if(!i)throw new l("DB_ERROR","Highlight regeneration run failure did not return a row");return i},{behavior:"immediate"})}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to fail highlight regeneration run",o)}finally{r.close();}}failHighlightRegeneration(e){return this.failHighlightRegenerationRun(e)}recoverInterruptedHighlightRegenerationRuns(e=Ec){L(e,"errorCode");let n=new Date().toISOString(),r=this.openHandle(true);try{return r.db.transaction(o=>o.update(F).set({status:"failed",completed_at:n,error_code:e}).where(inArray(F.status,co)).run().changes,{behavior:"immediate"})}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to recover interrupted highlight runs",o)}finally{r.close();}}completeHighlightRegenerationRun(e){L(e.runId,"runId"),L(e.threadId,"threadId"),L(e.workspaceId,"workspaceId"),L(e.detectorVersion,"detectorVersion");let n=Rh(e.candidates),r=or(e),o=this.openHandle(true),s=false;try{return o.db.transaction(i=>{let d=this.findRegenerationRun(i,e.runId,e.workspaceId);if((!d||d.thread_id!==e.threadId)&&tt(`Highlight regeneration run ${e.runId} not found`),js(d.status)||Y(`invalid highlight regeneration status: ${d.status}`),d.status==="failed")throw new l("CONFLICT","Highlight regeneration run has already failed");if(d.status==="completed")return {run:d,deletedCount:0,createdCount:0,previousAutoCount:d.previous_auto_count??0,newAutoCount:d.new_auto_count??0};s=!0;let c=this.findThread(i,e.threadId,e.workspaceId);c||tt(`Thread ${e.threadId} not found`),d.detector_version!==e.detectorVersion&&Y("detectorVersion does not match the regeneration run");let u=i.select().from(M).where(eq(M.thread_id,c.id)).orderBy(asc(M.created_at),asc(M.id)).all(),f=new Set(n.map(N=>N.contentFingerprint)),p=u.filter(N=>N.source==="auto"&&N.status==="active"&&N.revision===0&&!f.has(N.content_fingerprint??"")),g=u.filter(N=>N.source==="auto"&&N.status==="active").length,m=new Set(u.filter(N=>!p.includes(N)&&N.content_fingerprint).map(N=>N.content_fingerprint)),_=n.filter(N=>!m.has(N.contentFingerprint)),k=new Date().toISOString(),T=sr(i,c.id)+1;ir(i,c.id)||(ar(i,c,r,k,T),T+=1);for(let N of p)i.delete(M).where(eq(M.id,N.id)).run(),Sh(i,N,r,k,T,{runId:e.runId,reason:Rc}),T+=1;let S=0,D=e.agentId??(r.actorType==="agent"?r.actorId:null);for(let N of _){let le=Le("thl");i.insert(M).values({id:le,thread_id:c.id,source:"auto",kind:N.kind,status:"active",text:N.text,covers_from_task_id:N.coversFromTaskId,covers_to_task_id:N.coversToTaskId,revision:0,created_at:k,updated_at:k,agent_id:D,source_task_id:N.anchorTaskId,detector_version:e.detectorVersion,content_fingerprint:N.contentFingerprint,dismissed_at:null}).run();let je=i.select().from(M).where(eq(M.id,le)).get();if(!je)throw new l("DB_ERROR","Regenerated highlight insert did not return a row");uo(i,je,r,k,"thread.highlight.created",T),T+=1,S+=1;}let R=i.select().from(M).where(eq(M.thread_id,c.id)).all().filter(N=>N.source==="auto"&&N.status==="active").length;Wt(i,{threadId:c.id,seq:T,type:"thread.highlights.regenerated",actorType:r.actorType,actorId:r.actorId,createdAt:k,payload:{runId:d.id,detectorVersion:e.detectorVersion,previousAutoCount:g,newAutoCount:R,deletedCount:p.length,createdCount:S}}),i.update(F).set({status:"completed",started_at:d.started_at??k,completed_at:k,error_code:null,previous_auto_count:g,new_auto_count:R}).where(and(eq(F.id,d.id),inArray(F.status,co))).run();let O=i.select().from(F).where(eq(F.id,d.id)).get();if(!O)throw new l("DB_ERROR","Highlight regeneration completion did not return a row");return {run:O,deletedCount:p.length,createdCount:S,previousAutoCount:g,newAutoCount:R}},{behavior:"immediate"})}catch(i){if(s)try{this.failHighlightRegenerationRun({runId:e.runId,workspaceId:e.workspaceId,errorCode:Sc});}catch{}throw i instanceof l?i:new l("DB_ERROR","Failed to complete highlight regeneration",i)}finally{o.close();}}completeHighlightRegeneration(e){return this.completeHighlightRegenerationRun(e)}replaceAutoHighlightsAtomically(e){return this.completeHighlightRegenerationRun(e)}listTimeline(e,n,r={}){let o=typeof e=="string"?{...r,threadId:e,workspaceId:n}:e;L(o.threadId,"threadId"),L(o.workspaceId,"workspaceId");let s=kh(o);if(!existsSync(this.resolveDbPath()))return null;let i=this.openHandle(false);try{if(!this.findThread(i.db,o.threadId,o.workspaceId))return null;let d=i.db.select({maxSeq:sql`COALESCE(MAX(${W.seq}), 0)`}).from(W).where(eq(W.thread_id,o.threadId)).get()?.maxSeq??0,c;o.beforeSeq!==void 0?c=i.db.select().from(W).where(and(eq(W.thread_id,o.threadId),lt$1(W.seq,o.beforeSeq))).orderBy(desc(W.seq)).limit(s+1).all().reverse():o.afterSeq!==void 0?c=i.db.select().from(W).where(and(eq(W.thread_id,o.threadId),sql`${W.seq} > ${o.afterSeq}`)).orderBy(asc(W.seq)).limit(s+1).all():c=i.db.select().from(W).where(eq(W.thread_id,o.threadId)).orderBy(desc(W.seq)).limit(s+1).all().reverse();let u=c.length>s,f=o.afterSeq!==void 0?c.slice(0,s):u?c.slice(1):c,p=!1,g=f[0];return g&&(p=!!i.db.select({id:W.id}).from(W).where(and(eq(W.thread_id,o.threadId),lt$1(W.seq,g.seq))).limit(1).get()),{items:f,latestSeq:d,hasMoreOlder:p}}catch(d){throw d instanceof l?d:new l("DB_ERROR","Failed to list thread timeline",d)}finally{i.close();}}listEvents(e,n,r){return this.listTimeline(e,n,r)}getTimeline(e,n,r){return this.listTimeline(e,n,r)}createHighlight(e){let n=wh(e),r=or(e),o=new Date().toISOString(),s=this.openHandle(true);try{return s.db.transaction(i=>{let d=this.findThread(i,e.threadId,e.workspaceId);if(d||tt(`Thread ${e.threadId} not found`),n.source==="auto"){let g=i.select().from(M).where(and(eq(M.thread_id,e.threadId),eq(M.source_task_id,n.sourceTaskId),eq(M.detector_version,n.detectorVersion),eq(M.content_fingerprint,n.contentFingerprint))).orderBy(asc(M.created_at),asc(M.id)).limit(1).get();if(g)return g}let c=e.id??Le("thl"),u={id:c,thread_id:e.threadId,source:n.source,kind:n.kind,status:"active",text:n.text,covers_from_task_id:n.coversFromTaskId,covers_to_task_id:n.coversToTaskId,revision:0,created_at:o,updated_at:o,agent_id:n.agentId,source_task_id:n.sourceTaskId,detector_version:n.detectorVersion,content_fingerprint:n.contentFingerprint,dismissed_at:null};i.insert(M).values(u).run();let f=i.select().from(M).where(eq(M.id,c)).get();if(!f)throw new l("DB_ERROR","Highlight insert did not return a row");let p=sr(i,d.id)+1;return ir(i,d.id)||(ar(i,d,r,o,p),p+=1),uo(i,f,r,o,"thread.highlight.created",p),f},{behavior:"immediate"})}catch(i){throw i instanceof l?i:new l("DB_ERROR","Failed to create thread highlight",i)}finally{s.close();}}updateHighlight(e){L(e.threadId,"threadId"),L(e.workspaceId,"workspaceId"),L(e.highlightId,"highlightId"),(!Number.isInteger(e.expectedRevision)||e.expectedRevision<0)&&Y("expectedRevision must be a non-negative integer"),e.text===void 0&&e.kind===void 0&&e.coversFromTaskId===void 0&&e.coversToTaskId===void 0&&Y("highlight update requires at least one field"),e.kind!==void 0&&Ws(e.kind);let n=e.text===void 0?void 0:Gs(e.text),r=or(e),o=new Date().toISOString(),s=this.openHandle(true);try{return s.db.transaction(i=>{let d=this.findThread(i,e.threadId,e.workspaceId);d||tt(`Thread ${e.threadId} not found`);let c=i.select().from(M).where(and(eq(M.id,e.highlightId),eq(M.thread_id,d.id))).limit(1).get();if(c||tt(`Highlight ${e.highlightId} not found`),c.revision!==e.expectedRevision)throw new Sn(d.id,c.id,e.expectedRevision,c.revision);if(c.status!=="active")throw new Sn(d.id,c.id,e.expectedRevision,c.revision);let u=e.kind??c.kind,f=n??c.text,p=e.coversFromTaskId??c.covers_from_task_id,g=e.coversToTaskId??c.covers_to_task_id;(!f||p.length===0||g.length===0)&&Y("highlight projection is incomplete");let m=u!==c.kind||f!==c.text||p!==c.covers_from_task_id||g!==c.covers_to_task_id,_=r.actorType==="user"&&c.source==="auto"&&m?"manual":c.source;if(!(m||_!==c.source))return c;let T=c.revision+1;i.update(M).set({source:_,kind:u,text:f,covers_from_task_id:p,covers_to_task_id:g,revision:T,updated_at:o}).where(and(eq(M.id,c.id),eq(M.revision,c.revision))).run();let S=i.select().from(M).where(eq(M.id,c.id)).get();if(!S)throw new l("DB_ERROR","Highlight update did not return a row");let D=sr(i,d.id)+1;return ir(i,d.id)||(ar(i,d,r,o,D),D+=1),uo(i,S,r,o,"thread.highlight.updated",D,c),S},{behavior:"immediate"})}catch(i){throw i instanceof l?i:new l("DB_ERROR","Failed to update thread highlight",i)}finally{s.close();}}dismissHighlight(e){L(e.threadId,"threadId"),L(e.workspaceId,"workspaceId"),L(e.highlightId,"highlightId"),(!Number.isInteger(e.expectedRevision)||e.expectedRevision<0)&&Y("expectedRevision must be a non-negative integer");let n=or(e),r=new Date().toISOString(),o=this.openHandle(true);try{return o.db.transaction(s=>{let i=this.findThread(s,e.threadId,e.workspaceId);i||tt(`Thread ${e.threadId} not found`);let d=s.select().from(M).where(and(eq(M.id,e.highlightId),eq(M.thread_id,i.id))).limit(1).get();if(d||tt(`Highlight ${e.highlightId} not found`),d.revision!==e.expectedRevision)throw new Sn(i.id,d.id,e.expectedRevision,d.revision);if(d.status==="dismissed")return d;let c=d.revision+1;s.update(M).set({status:"dismissed",text:null,revision:c,updated_at:r,dismissed_at:r}).where(and(eq(M.id,d.id),eq(M.revision,d.revision))).run();let u=s.select().from(M).where(eq(M.id,d.id)).get();if(!u)throw new l("DB_ERROR","Highlight dismissal did not return a row");let f=sr(s,i.id)+1;return ir(s,i.id)||(ar(s,i,n,r,f),f+=1),uo(s,u,n,r,"thread.highlight.deleted",f,d),u},{behavior:"immediate"})}catch(s){throw s instanceof l?s:new l("DB_ERROR","Failed to dismiss thread highlight",s)}finally{o.close();}}listActiveHighlights(e,n,r={}){if(L(e,"threadId"),L(n,"workspaceId"),r.taskId!==void 0&&L(r.taskId,"taskId"),r.coversFromTaskId!==void 0&&L(r.coversFromTaskId,"coversFromTaskId"),r.coversToTaskId!==void 0&&L(r.coversToTaskId,"coversToTaskId"),!existsSync(this.resolveDbPath()))return null;let o=this.openHandle(false);try{if(!this.findThread(o.db,e,n))return null;let i=o.db.select().from(M).where(and(eq(M.thread_id,e),eq(M.status,"active"))).orderBy(asc(M.created_at),asc(M.id)).all();if(r.taskId===void 0&&r.coversFromTaskId===void 0&&r.coversToTaskId===void 0)return i;let d=o.db.all(sql`
481
422
  SELECT id, started_at FROM tasks WHERE thread_id = ${e}
482
423
  ORDER BY started_at ASC, id ASC
483
- `),c=new Map(d.map((g,m)=>[g.id,m])),u=r.taskId===void 0?void 0:c.get(r.taskId),f=r.coversFromTaskId===void 0?void 0:c.get(r.coversFromTaskId),p=r.coversToTaskId===void 0?void 0:c.get(r.coversToTaskId);return i.filter(g=>{let m=c.get(g.covers_from_task_id),w=c.get(g.covers_to_task_id);if(m===void 0||w===void 0)return !1;let _=Math.min(m,w),T=Math.max(m,w);return !(u!==void 0&&(u<_||u>T)||f!==void 0&&T<f||p!==void 0&&_>p)})}catch(s){throw s instanceof l?s:new l("DB_ERROR","Failed to list active thread highlights",s)}finally{o.close();}}listHighlights(e,n,r){return this.listActiveHighlights(e,n,r)}getActiveHighlights(e,n,r){return this.listActiveHighlights(e,n,r)}};h();oe();pe();ae();le();de();var Bs=class extends F{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=dirname(n);existsSync(o)||mkdirSync(o,{recursive:true});}else if(!existsSync(n))throw new l("NOT_FOUND","Database not found");let r=P(n);if(e)try{K(r.db,n);}catch(o){throw r.close(),o}return r}insertSpan(e){let n=this.openHandle(true);try{n.db.insert(ht).values(e).run();}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to insert span",r)}finally{n.close();}}findByTaskId(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.select().from(ht).where(eq(ht.task_id,e)).all()}catch(r){throw new l("DB_ERROR","Failed to find spans by task id",r)}finally{n.close();}}findById(e){if(!this.dbExists())return;let n=this.openHandle(false);try{return n.db.select().from(ht).where(eq(ht.id,e)).limit(1).get()??void 0}catch(r){throw new l("DB_ERROR","Failed to find span by id",r)}finally{n.close();}}};h();oe();pe();ae();le();de();var zs=class extends F{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=dirname(n);existsSync(o)||mkdirSync(o,{recursive:true});}else if(!existsSync(n))throw new l("NOT_FOUND","Database not found");let r=P(n);if(e)try{K(r.db,n);}catch(o){throw r.close(),o}return r}insertToolCall(e){let n=this.openHandle(true);try{n.db.insert(rt).values(e).run();}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to insert tool call",r)}finally{n.close();}}findByTaskId(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.select().from(rt).where(eq(rt.task_id,e)).all()}catch(r){throw new l("DB_ERROR","Failed to find tool calls by task id",r)}finally{n.close();}}aggregateByName(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.select({toolName:rt.tool_name,count:sql`count(*)`}).from(rt).where(eq(rt.task_id,e)).groupBy(rt.tool_name).all().map(r=>({toolName:r.toolName,count:r.count}))}catch(r){throw new l("DB_ERROR","Failed to aggregate tool calls by name",r)}finally{n.close();}}};h();oe();pe();ae();le();de();var Gs=class extends F{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=dirname(n);existsSync(o)||mkdirSync(o,{recursive:true});}else if(!existsSync(n))throw new l("NOT_FOUND","Database not found");let r=P(n);if(e)try{K(r.db,n);}catch(o){throw r.close(),o}return r}ensureThreadExists(e,n){if(!e.db.select({id:k.id}).from(k).where(eq(k.id,n)).limit(1).get())throw new l("NOT_FOUND",`Thread not found: ${n}`)}findByThreadId(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{return this.ensureThreadExists(n,e),n.db.select().from($e).where(eq($e.thread_id,e)).orderBy(asc($e.seq)).all()}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to find boxes by thread id",r)}finally{n.close();}}findById(e,n){if(!this.dbExists())return;let r=this.openHandle(false);try{return r.db.select().from($e).where(and(eq($e.id,n),eq($e.thread_id,e))).limit(1).get()??void 0}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to find box by id",o)}finally{r.close();}}insert(e){let n=this.openHandle(true);try{this.ensureThreadExists(n,e.threadId);try{n.db.insert($e).values({id:e.id,thread_id:e.threadId,seq:e.seq,first_task_id:e.first_task_id,mid_task_id:e.mid_task_id,last_task_id:e.last_task_id,task_count:e.task_count,summary:e.summary??null,source_tokens:e.source_tokens,summary_tokens:e.summary_tokens??null,created_at:e.created_at}).run();}catch(o){throw o instanceof Error&&/UNIQUE constraint failed/i.test(o.message)?new l("CONFLICT",`Duplicate seq ${String(e.seq)} for thread ${e.threadId}`,o):o}let r=n.db.select().from($e).where(eq($e.id,e.id)).limit(1).get();if(!r)throw new l("DB_ERROR","Insert did not return a row");return r}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to insert thread box",r)}finally{n.close();}}};h();oe();pe();ae();le();de();var Ws=class extends F{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=dirname(n);existsSync(o)||mkdirSync(o,{recursive:true});}else if(!existsSync(n))throw new l("NOT_FOUND","Database not found");let r=P(n);if(e)try{K(r.db,n);}catch(o){throw r.close(),o}return r}bulkInsert(e){if(e.length===0)return;let n=this.openHandle(true);try{n.db.transaction(r=>{for(let o of e)r.insert(Xt).values({id:randomUUID(),path:o.path,method:o.method,status_code:o.statusCode,duration_ms:o.durationMs,ip:o.ip??null,request_headers:o.requestHeaders??null,response_headers:o.responseHeaders??null,request_body:o.requestBody??null,response_body:o.responseBody??null,query:o.query??null,user_id:o.userId??null,project_id:o.projectId??null,partition_key:o.partitionKey??"default",timestamp:o.timestamp??new Date().toISOString(),metadata:o.metadata??null}).run();});}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to bulk insert request logs",r)}finally{n.close();}}findRecent(e=100){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.select().from(Xt).orderBy(desc(Xt.timestamp)).limit(e).all()}catch(r){throw new l("DB_ERROR","Failed to find recent request logs",r)}finally{n.close();}}};h();oe();pe();ae();le();de();function vc(t){return new Date(Math.floor(t/3e5)*3e5).toISOString()}var Ks=class extends F{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=dirname(n);existsSync(o)||mkdirSync(o,{recursive:true});}else if(!existsSync(n))throw new l("NOT_FOUND","Database not found");let r=P(n);if(e)try{K(r.db,n);}catch(o){throw r.close(),o}return r}upsert(e){let n=this.openHandle(true);try{let r=vc(e.bucketStartMs),o=e.accountRef??"default";n.db.insert(he).values({id:e.id,provider:e.provider,account_ref:o,limit_window:e.limitWindow,bucket_start:r,captured_at:e.capturedAt,used_percent:e.usedPercent,remaining_percent:e.remainingPercent,resets_at:e.resetsAt??null,source:e.source,metadata:e.metadata??null}).onConflictDoUpdate({target:[he.provider,he.account_ref,he.limit_window,he.bucket_start],set:{captured_at:e.capturedAt,used_percent:e.usedPercent,remaining_percent:e.remainingPercent,resets_at:e.resetsAt??null,metadata:e.metadata??null}}).run();}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to upsert usage limit snapshot",r)}finally{n.close();}}getTrends(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{let r=n.db.select({provider:he.provider,bucket_start:he.bucket_start,used_percent:he.used_percent,remaining_percent:he.remaining_percent,resets_at:he.resets_at}).from(he).where(and(eq(he.limit_window,e.window),gte(he.bucket_start,e.fromIso),lte(he.bucket_start,e.toIso))).orderBy(asc(he.bucket_start)).all(),o=new Map;for(let s of r)o.has(s.provider)||o.set(s.provider,[]),o.get(s.provider).push({bucketStart:s.bucket_start,usedPercent:s.used_percent,remainingPercent:s.remaining_percent,resetsAt:s.resets_at??null});return Array.from(o.entries()).map(([s,i])=>({provider:s,points:i}))}catch(r){throw new l("DB_ERROR","Failed to get usage limit trends",r)}finally{n.close();}}};h();oe();pe();ae();le();de();var Vs=class extends F{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=dirname(n);existsSync(o)||mkdirSync(o,{recursive:true});}else if(!existsSync(n))throw new l("NOT_FOUND","Database not found");let r=P(n);if(e)try{K(r.db,n);}catch(o){throw r.close(),o}return r}publish(e){let n=this.openHandle(true);try{n.db.insert(xe).values({id:e.id,workspace_id:e.workspaceId,month:e.month,generated_at:e.generatedAt,source_range:e.sourceRange,tier:e.tier,total_tokens:e.totalTokens,total_cost_usd:e.totalCostUsd,payload:e.payload}).onConflictDoUpdate({target:[xe.workspace_id,xe.month],set:{generated_at:e.generatedAt,source_range:e.sourceRange,tier:e.tier,total_tokens:e.totalTokens,total_cost_usd:e.totalCostUsd,payload:e.payload}}).run();let r=n.db.select().from(xe).where(and(eq(xe.workspace_id,e.workspaceId),eq(xe.month,e.month))).limit(1).get();if(!r)throw new l("DB_ERROR","Failed to read back published usage report");return r}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to publish usage report",r)}finally{n.close();}}findByMonth(e,n){if(!this.dbExists())return;let r=this.openHandle(false);try{return r.db.select().from(xe).where(and(eq(xe.workspace_id,e),eq(xe.month,n))).limit(1).get()??void 0}catch(o){throw new l("DB_ERROR","Failed to find usage report",o)}finally{r.close();}}listByWorkspace(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.select().from(xe).where(eq(xe.workspace_id,e)).orderBy(desc(xe.month)).all()}catch(r){throw new l("DB_ERROR","Failed to list usage reports",r)}finally{n.close();}}};h();oe();pe();ae();le();de();var Dc=500,Lc=50,Js=class extends F{dbPath;cap;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db")),this.cap=e.cap??Dc;}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=dirname(n);existsSync(o)||mkdirSync(o,{recursive:true});}else if(!existsSync(n))throw new l("NOT_FOUND","Database not found");let r=P(n);if(e)try{K(r.db,n);}catch(o){throw r.close(),o}return r}create(e){let n=this.openHandle(true);try{let r=Le("ntf"),o=new Date().toISOString();return n.db.insert($).values({id:r,workspace_id:e.workspaceId,agent_id:e.agentId??null,task_id:e.taskId??null,thread_id:e.threadId??null,source:e.source??"agent",level:e.level??"info",title:e.title,body:e.body??null,target_user_id:e.targetUserId??null,created_at:o,metadata:e.metadata??null}).run(),this.enforceCap(n,e.workspaceId),{id:r}}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to create notification",r)}finally{n.close();}}enforceCap(e,n){let s=(e.db.select({count:sql`count(*)`}).from($).where(eq($.workspace_id,n)).get()?.count??0)-this.cap;if(s<=0)return;let d=e.db.select({id:$.id}).from($).innerJoin(se,eq(se.notification_id,$.id)).where(eq($.workspace_id,n)).groupBy($.id).orderBy(asc($.created_at)).limit(s).all().map(c=>c.id);d.length!==0&&(e.db.delete(se).where(inArray(se.notification_id,d)).run(),e.db.delete($).where(inArray($.id,d)).run());}list(e){if(!this.dbExists())return [];let n=e.limit??Lc,r=this.openHandle(false);try{return r.db.select({id:$.id,workspace_id:$.workspace_id,agent_id:$.agent_id,task_id:$.task_id,thread_id:$.thread_id,source:$.source,level:$.level,title:$.title,body:$.body,target_user_id:$.target_user_id,created_at:$.created_at,metadata:$.metadata,read_at:se.read_at}).from($).leftJoin(se,and(eq(se.notification_id,$.id),eq(se.user_id,e.userId))).where(eq($.workspace_id,e.workspaceId)).orderBy(desc($.created_at)).limit(n).all().map(s=>({...s,read_at:s.read_at??null,read:s.read_at!=null}))}catch(o){throw new l("DB_ERROR","Failed to list notifications",o)}finally{r.close();}}unreadCount(e){if(!this.dbExists())return 0;let n=this.openHandle(false);try{return n.db.select({count:sql`count(*)`}).from($).leftJoin(se,and(eq(se.notification_id,$.id),eq(se.user_id,e.userId))).where(and(eq($.workspace_id,e.workspaceId),isNull(se.notification_id))).get()?.count??0}catch(r){throw new l("DB_ERROR","Failed to count unread notifications",r)}finally{n.close();}}markRead(e){let n=this.openHandle(true);try{if(!n.db.select({id:$.id}).from($).where(and(eq($.id,e.notificationId),eq($.workspace_id,e.workspaceId))).get())throw new l("NOT_FOUND","Notification not found in workspace");return n.db.insert(se).values({notification_id:e.notificationId,user_id:e.userId,read_at:new Date().toISOString()}).onConflictDoNothing().run().changes>0}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to mark notification read",r)}finally{n.close();}}markAllRead(e){let n=this.openHandle(true);try{let r=n.db.select({id:$.id}).from($).leftJoin(se,and(eq(se.notification_id,$.id),eq(se.user_id,e.userId))).where(and(eq($.workspace_id,e.workspaceId),isNull(se.notification_id))).all();if(r.length===0)return 0;let o=new Date().toISOString();return n.db.transaction(s=>{for(let i of r)s.insert(se).values({notification_id:i.id,user_id:e.userId,read_at:o}).onConflictDoNothing().run();}),r.length}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to mark all notifications read",r)}finally{n.close();}}};h();oe();pe();ae();le();de();var Uc=50,Xs=class extends F{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=dirname(n);existsSync(o)||mkdirSync(o,{recursive:true});}else if(!existsSync(n))throw new l("NOT_FOUND","Database not found");let r=P(n);if(e)try{K(r.db,n);}catch(o){throw r.close(),o}return r}create(e){let n=this.openHandle(true);try{let r=new Date().toISOString(),o=[],s=e.map(i=>{let d=Le("sug");return o.push(d),{id:d,workspace_id:i.workspaceId,agent_id:i.agentId,task_id:i.taskId??null,type:i.type,status:i.status??"pending",payload:i.payload,applied_commit_sha:i.appliedCommitSha??null,created_at:r,updated_at:r}});return s.length>0&&n.db.insert(j).values(s).run(),{ids:o}}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to create agent suggestions",r)}finally{n.close();}}findLatestSet(e,n){if(!this.dbExists())return [];let r=this.openHandle(false);try{let o=r.db.select({task_id:j.task_id}).from(j).where(and(eq(j.workspace_id,e),eq(j.agent_id,n))).orderBy(desc(j.created_at)).limit(1).get();if(!o)return [];let s=o.task_id===null?isNull(j.task_id):eq(j.task_id,o.task_id);return r.db.select().from(j).where(and(eq(j.workspace_id,e),eq(j.agent_id,n),s)).orderBy(asc(j.created_at)).all()}catch(o){throw new l("DB_ERROR","Failed to find latest agent suggestion set",o)}finally{r.close();}}findSetByTaskId(e,n,r){if(!this.dbExists())return [];let o=this.openHandle(false);try{return o.db.select().from(j).where(and(eq(j.workspace_id,e),eq(j.agent_id,n),eq(j.task_id,r))).orderBy(asc(j.created_at)).all()}catch(s){throw new l("DB_ERROR","Failed to find agent suggestion set by task id",s)}finally{o.close();}}findById(e,n,r){if(!this.dbExists())return null;let o=this.openHandle(false);try{return o.db.select().from(j).where(and(eq(j.workspace_id,e),eq(j.agent_id,n),eq(j.id,r))).get()??null}catch(s){throw new l("DB_ERROR","Failed to find agent suggestion by id",s)}finally{o.close();}}updateStatus(e,n,r){let o=this.openHandle(true);try{let s={status:n,updated_at:new Date().toISOString()};return r!==void 0&&(s.applied_commit_sha=r),o.db.update(j).set(s).where(eq(j.id,e)).run().changes>0}catch(s){throw s instanceof l?s:new l("DB_ERROR","Failed to update agent suggestion status",s)}finally{o.close();}}listByAgent(e,n,r=Uc){if(!this.dbExists())return [];let o=this.openHandle(false);try{return o.db.select().from(j).where(and(eq(j.workspace_id,e),eq(j.agent_id,n))).orderBy(desc(j.created_at)).limit(r).all()}catch(s){throw new l("DB_ERROR","Failed to list agent suggestions",s)}finally{o.close();}}findDismissed(e,n,r=20){if(!this.dbExists())return [];let o=this.openHandle(false);try{return o.db.select().from(j).where(and(eq(j.workspace_id,e),eq(j.agent_id,n),eq(j.status,"dismissed"))).orderBy(desc(j.updated_at)).limit(r).all()}catch(s){throw new l("DB_ERROR","Failed to find dismissed agent suggestions",s)}finally{o.close();}}};export{Xs as AgentSuggestionRepository,uc as BUILTIN_THREAD_STATES,F as BaseSqliteRepository,Tr as COMMON_CODE_COLORS,kr as COMMON_CODE_GROUPS,oi as CREWX_JOURNAL_SIZE_LIMIT_BYTES,yo as CommonCodeRepository,ee as CommonCodeRepositoryError,Uc as DEFAULT_AGENT_SUGGESTION_LIST_LIMIT,Dc as DEFAULT_NOTIFICATION_CAP,Lc as DEFAULT_NOTIFICATION_LIST_LIMIT,Qi as DEFAULT_PROJECT_STAGES,Ao as DEFAULT_PROJECT_STAGE_KEYS,Rs as DEFAULT_TASK_REAPER_TICK_INTERVAL_MS,jr as INSTRUCTION_STOP_EPOCH_MISMATCH,Td as INSTRUCTION_STOP_GENERATION_ALREADY_SETTLED,us as INSTRUCTION_STOP_PROCESS_TERMINATION_FAILED,wd as INSTRUCTION_STOP_REQUEST_FAILED,ls as INSTRUCTION_STOP_SETTLE_CAS_FAILED,kd as INSTRUCTION_STOP_TARGET_PID_MISSING,Br as INSTRUCTION_STOP_WORKSPACE_MISMATCH,ts as LEGACY_TASK_TERMINAL_ERROR_PATTERNS,Js as NotificationRepository,vo as ProjectRepository,l as RepositoryError,Ws as RequestLogRepository,Bs as SpanRepository,is as TASK_HEARTBEAT_HARD_STALE_MS,os as TASK_HEARTBEAT_INTERVAL_MS,ss as TASK_HEARTBEAT_STALE_MS,Hd as TASK_LOG_MIGRATION_EVENT_ROW_BYTES,Qr as TASK_LOG_MIGRATION_MIN_FREE_SPACE_BYTES,Md as TASK_LOG_MIGRATION_TERMINAL_STATUSES,zr as TASK_STOP_DEFAULT_GRACE_MS,_d as TASK_STOP_DEFAULT_POLL_MS,gs as TASK_STOP_OWNED_PROCESS_MARKERS,Jp as TASK_STOP_POLL_INTERVAL_MS,ns as TASK_TERMINAL_STATUSES,_c as THREAD_HIGHLIGHT_DELETION_REASON_REGENERATION_REPLACED,Tc as THREAD_HIGHLIGHT_REGENERATION_COMMIT_FAILED,Vg as THREAD_HIGHLIGHT_REGENERATION_DETECTION_FAILED,kc as THREAD_HIGHLIGHT_REGENERATION_INTERRUPTED,Kg as THREAD_HIGHLIGHT_REGENERATION_NO_ELIGIBLE_TURNS,cc as THREAD_PRIORITIES,Ut as TaskLogRepository,Jr as TaskRepository,Gs as ThreadBoxRepository,yn as ThreadHighlightConflictError,co as ThreadHighlightRegenerationConflictError,ao as ThreadHistoryConflictError,qs as ThreadHistoryRepository,Ds as ThreadRepository,Kt as ThreadTitleMetadataPatchError,zs as ToolCallRepository,Vd as USAGE_BACKFILL_MAX_LATE_USAGE_AGE_MS,to as USAGE_BACKFILL_TERMINAL_STATUSES,Ks as UsageLimitSnapshotRepository,Vs as UsageReportRepository,bo as WorkspaceRepository,vc as calcBucketStart,tc as classifyUsageAccountingReason,lc as customStateLabel,wo as generateCommonCodeId,hn as hasRecordedUsage,Fd as hasSufficientTaskLogMigrationFreeSpace,Ug as hasThreadTitleKey,Zn as isThreadPriority,er as isThreadState,jg as matchesThreadTitleFilter,Vr as mergeTerminalReason,Hs as mergeThreadTitleMeta,Nt as normalizeTaskStatus,P as openDrizzleDb,qg as parseThreadPriorityFilter,Fg as parseThreadStateFilter,Ol as pushSchema,ro as readThreadTitleMeta,Jc as reclaimTemporaryJournal,jn as resolveTaskHeartbeatHardStaleMs,Fr as resolveTaskHeartbeatIntervalMs,Bt as resolveTaskHeartbeatStaleMs,Zr as resolveTaskLogMigrationDbPath,fs as resolveTaskStopMethod,rs as runHeartbeatTick,Jt as runMigrations,K as runMigrationsOnce,Bf as runTaskLogMigration,Ag as runUsageBackfill,Xp as startTaskHeartbeat,hs as stopTask,fd as stopTaskHeartbeat,ln as taskHeartbeatRegistry,zf as taskLogBackupName,a as tasks,$g as threadTitleSearchHaystack,Jn as tryCheckpointTaskLogWal};
424
+ `),c=new Map(d.map((g,m)=>[g.id,m])),u=r.taskId===void 0?void 0:c.get(r.taskId),f=r.coversFromTaskId===void 0?void 0:c.get(r.coversFromTaskId),p=r.coversToTaskId===void 0?void 0:c.get(r.coversToTaskId);return i.filter(g=>{let m=c.get(g.covers_from_task_id),_=c.get(g.covers_to_task_id);if(m===void 0||_===void 0)return !1;let k=Math.min(m,_),T=Math.max(m,_);return !(u!==void 0&&(u<k||u>T)||f!==void 0&&T<f||p!==void 0&&k>p)})}catch(s){throw s instanceof l?s:new l("DB_ERROR","Failed to list active thread highlights",s)}finally{o.close();}}listHighlights(e,n,r){return this.listActiveHighlights(e,n,r)}getActiveHighlights(e,n,r){return this.listActiveHighlights(e,n,r)}};h();oe();fe();ae();pe();de();var Vs=class extends B{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=dirname(n);existsSync(o)||mkdirSync(o,{recursive:true});}else if(!existsSync(n))throw new l("NOT_FOUND","Database not found");let r=P(n);if(e)try{K(r.db,n);}catch(o){throw r.close(),o}return r}insertSpan(e){let n=this.openHandle(true);try{n.db.insert(mt).values(e).run();}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to insert span",r)}finally{n.close();}}findByTaskId(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.select().from(mt).where(eq(mt.task_id,e)).all()}catch(r){throw new l("DB_ERROR","Failed to find spans by task id",r)}finally{n.close();}}findById(e){if(!this.dbExists())return;let n=this.openHandle(false);try{return n.db.select().from(mt).where(eq(mt.id,e)).limit(1).get()??void 0}catch(r){throw new l("DB_ERROR","Failed to find span by id",r)}finally{n.close();}}};h();oe();fe();ae();pe();de();var Ks=class extends B{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=dirname(n);existsSync(o)||mkdirSync(o,{recursive:true});}else if(!existsSync(n))throw new l("NOT_FOUND","Database not found");let r=P(n);if(e)try{K(r.db,n);}catch(o){throw r.close(),o}return r}insertToolCall(e){let n=this.openHandle(true);try{n.db.insert(ot).values(e).run();}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to insert tool call",r)}finally{n.close();}}findByTaskId(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.select().from(ot).where(eq(ot.task_id,e)).all()}catch(r){throw new l("DB_ERROR","Failed to find tool calls by task id",r)}finally{n.close();}}aggregateByName(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.select({toolName:ot.tool_name,count:sql`count(*)`}).from(ot).where(eq(ot.task_id,e)).groupBy(ot.tool_name).all().map(r=>({toolName:r.toolName,count:r.count}))}catch(r){throw new l("DB_ERROR","Failed to aggregate tool calls by name",r)}finally{n.close();}}};h();oe();fe();ae();pe();de();var Js=class extends B{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=dirname(n);existsSync(o)||mkdirSync(o,{recursive:true});}else if(!existsSync(n))throw new l("NOT_FOUND","Database not found");let r=P(n);if(e)try{K(r.db,n);}catch(o){throw r.close(),o}return r}ensureThreadExists(e,n){if(!e.db.select({id:w.id}).from(w).where(eq(w.id,n)).limit(1).get())throw new l("NOT_FOUND",`Thread not found: ${n}`)}findByThreadId(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{return this.ensureThreadExists(n,e),n.db.select().from($e).where(eq($e.thread_id,e)).orderBy(asc($e.seq)).all()}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to find boxes by thread id",r)}finally{n.close();}}findById(e,n){if(!this.dbExists())return;let r=this.openHandle(false);try{return r.db.select().from($e).where(and(eq($e.id,n),eq($e.thread_id,e))).limit(1).get()??void 0}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to find box by id",o)}finally{r.close();}}insert(e){let n=this.openHandle(true);try{this.ensureThreadExists(n,e.threadId);try{n.db.insert($e).values({id:e.id,thread_id:e.threadId,seq:e.seq,first_task_id:e.first_task_id,mid_task_id:e.mid_task_id,last_task_id:e.last_task_id,task_count:e.task_count,summary:e.summary??null,source_tokens:e.source_tokens,summary_tokens:e.summary_tokens??null,created_at:e.created_at}).run();}catch(o){throw o instanceof Error&&/UNIQUE constraint failed/i.test(o.message)?new l("CONFLICT",`Duplicate seq ${String(e.seq)} for thread ${e.threadId}`,o):o}let r=n.db.select().from($e).where(eq($e.id,e.id)).limit(1).get();if(!r)throw new l("DB_ERROR","Insert did not return a row");return r}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to insert thread box",r)}finally{n.close();}}};h();oe();fe();ae();pe();de();var Ys=class extends B{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=dirname(n);existsSync(o)||mkdirSync(o,{recursive:true});}else if(!existsSync(n))throw new l("NOT_FOUND","Database not found");let r=P(n);if(e)try{K(r.db,n);}catch(o){throw r.close(),o}return r}bulkInsert(e){if(e.length===0)return;let n=this.openHandle(true);try{n.db.transaction(r=>{for(let o of e)r.insert(Jt).values({id:randomUUID(),path:o.path,method:o.method,status_code:o.statusCode,duration_ms:o.durationMs,ip:o.ip??null,request_headers:o.requestHeaders??null,response_headers:o.responseHeaders??null,request_body:o.requestBody??null,response_body:o.responseBody??null,query:o.query??null,user_id:o.userId??null,project_id:o.projectId??null,partition_key:o.partitionKey??"default",timestamp:o.timestamp??new Date().toISOString(),metadata:o.metadata??null}).run();});}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to bulk insert request logs",r)}finally{n.close();}}findRecent(e=100){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.select().from(Jt).orderBy(desc(Jt.timestamp)).limit(e).all()}catch(r){throw new l("DB_ERROR","Failed to find recent request logs",r)}finally{n.close();}}};h();oe();fe();ae();pe();de();function Cc(t){return new Date(Math.floor(t/3e5)*3e5).toISOString()}var Xs=class extends B{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=dirname(n);existsSync(o)||mkdirSync(o,{recursive:true});}else if(!existsSync(n))throw new l("NOT_FOUND","Database not found");let r=P(n);if(e)try{K(r.db,n);}catch(o){throw r.close(),o}return r}upsert(e){let n=this.openHandle(true);try{let r=Cc(e.bucketStartMs),o=e.accountRef??"default";n.db.insert(me).values({id:e.id,provider:e.provider,account_ref:o,limit_window:e.limitWindow,bucket_start:r,captured_at:e.capturedAt,used_percent:e.usedPercent,remaining_percent:e.remainingPercent,resets_at:e.resetsAt??null,source:e.source,metadata:e.metadata??null}).onConflictDoUpdate({target:[me.provider,me.account_ref,me.limit_window,me.bucket_start],set:{captured_at:e.capturedAt,used_percent:e.usedPercent,remaining_percent:e.remainingPercent,resets_at:e.resetsAt??null,metadata:e.metadata??null}}).run();}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to upsert usage limit snapshot",r)}finally{n.close();}}getTrends(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{let r=n.db.select({provider:me.provider,bucket_start:me.bucket_start,used_percent:me.used_percent,remaining_percent:me.remaining_percent,resets_at:me.resets_at}).from(me).where(and(eq(me.limit_window,e.window),gte(me.bucket_start,e.fromIso),lte(me.bucket_start,e.toIso))).orderBy(asc(me.bucket_start)).all(),o=new Map;for(let s of r)o.has(s.provider)||o.set(s.provider,[]),o.get(s.provider).push({bucketStart:s.bucket_start,usedPercent:s.used_percent,remainingPercent:s.remaining_percent,resetsAt:s.resets_at??null});return Array.from(o.entries()).map(([s,i])=>({provider:s,points:i}))}catch(r){throw new l("DB_ERROR","Failed to get usage limit trends",r)}finally{n.close();}}};h();oe();fe();ae();pe();de();var Qs=class extends B{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=dirname(n);existsSync(o)||mkdirSync(o,{recursive:true});}else if(!existsSync(n))throw new l("NOT_FOUND","Database not found");let r=P(n);if(e)try{K(r.db,n);}catch(o){throw r.close(),o}return r}publish(e){let n=this.openHandle(true);try{n.db.insert(Ce).values({id:e.id,workspace_id:e.workspaceId,month:e.month,generated_at:e.generatedAt,source_range:e.sourceRange,tier:e.tier,total_tokens:e.totalTokens,total_cost_usd:e.totalCostUsd,payload:e.payload}).onConflictDoUpdate({target:[Ce.workspace_id,Ce.month],set:{generated_at:e.generatedAt,source_range:e.sourceRange,tier:e.tier,total_tokens:e.totalTokens,total_cost_usd:e.totalCostUsd,payload:e.payload}}).run();let r=n.db.select().from(Ce).where(and(eq(Ce.workspace_id,e.workspaceId),eq(Ce.month,e.month))).limit(1).get();if(!r)throw new l("DB_ERROR","Failed to read back published usage report");return r}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to publish usage report",r)}finally{n.close();}}findByMonth(e,n){if(!this.dbExists())return;let r=this.openHandle(false);try{return r.db.select().from(Ce).where(and(eq(Ce.workspace_id,e),eq(Ce.month,n))).limit(1).get()??void 0}catch(o){throw new l("DB_ERROR","Failed to find usage report",o)}finally{r.close();}}listByWorkspace(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.select().from(Ce).where(eq(Ce.workspace_id,e)).orderBy(desc(Ce.month)).all()}catch(r){throw new l("DB_ERROR","Failed to list usage reports",r)}finally{n.close();}}};h();oe();fe();ae();pe();de();var $c=500,qc=50,Zs=class extends B{dbPath;cap;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db")),this.cap=e.cap??$c;}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=dirname(n);existsSync(o)||mkdirSync(o,{recursive:true});}else if(!existsSync(n))throw new l("NOT_FOUND","Database not found");let r=P(n);if(e)try{K(r.db,n);}catch(o){throw r.close(),o}return r}create(e){let n=this.openHandle(true);try{let r=Le("ntf"),o=new Date().toISOString();return n.db.insert(q).values({id:r,workspace_id:e.workspaceId,agent_id:e.agentId??null,task_id:e.taskId??null,thread_id:e.threadId??null,source:e.source??"agent",level:e.level??"info",title:e.title,body:e.body??null,target_user_id:e.targetUserId??null,created_at:o,metadata:e.metadata??null}).run(),this.enforceCap(n,e.workspaceId),{id:r}}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to create notification",r)}finally{n.close();}}enforceCap(e,n){let s=(e.db.select({count:sql`count(*)`}).from(q).where(eq(q.workspace_id,n)).get()?.count??0)-this.cap;if(s<=0)return;let d=e.db.select({id:q.id}).from(q).innerJoin(se,eq(se.notification_id,q.id)).where(eq(q.workspace_id,n)).groupBy(q.id).orderBy(asc(q.created_at)).limit(s).all().map(c=>c.id);d.length!==0&&(e.db.delete(se).where(inArray(se.notification_id,d)).run(),e.db.delete(q).where(inArray(q.id,d)).run());}list(e){if(!this.dbExists())return [];let n=e.limit??qc,r=this.openHandle(false);try{return r.db.select({id:q.id,workspace_id:q.workspace_id,agent_id:q.agent_id,task_id:q.task_id,thread_id:q.thread_id,source:q.source,level:q.level,title:q.title,body:q.body,target_user_id:q.target_user_id,created_at:q.created_at,metadata:q.metadata,read_at:se.read_at}).from(q).leftJoin(se,and(eq(se.notification_id,q.id),eq(se.user_id,e.userId))).where(eq(q.workspace_id,e.workspaceId)).orderBy(desc(q.created_at)).limit(n).all().map(s=>({...s,read_at:s.read_at??null,read:s.read_at!=null}))}catch(o){throw new l("DB_ERROR","Failed to list notifications",o)}finally{r.close();}}unreadCount(e){if(!this.dbExists())return 0;let n=this.openHandle(false);try{return n.db.select({count:sql`count(*)`}).from(q).leftJoin(se,and(eq(se.notification_id,q.id),eq(se.user_id,e.userId))).where(and(eq(q.workspace_id,e.workspaceId),isNull(se.notification_id))).get()?.count??0}catch(r){throw new l("DB_ERROR","Failed to count unread notifications",r)}finally{n.close();}}markRead(e){let n=this.openHandle(true);try{if(!n.db.select({id:q.id}).from(q).where(and(eq(q.id,e.notificationId),eq(q.workspace_id,e.workspaceId))).get())throw new l("NOT_FOUND","Notification not found in workspace");return n.db.insert(se).values({notification_id:e.notificationId,user_id:e.userId,read_at:new Date().toISOString()}).onConflictDoNothing().run().changes>0}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to mark notification read",r)}finally{n.close();}}markAllRead(e){let n=this.openHandle(true);try{let r=n.db.select({id:q.id}).from(q).leftJoin(se,and(eq(se.notification_id,q.id),eq(se.user_id,e.userId))).where(and(eq(q.workspace_id,e.workspaceId),isNull(se.notification_id))).all();if(r.length===0)return 0;let o=new Date().toISOString();return n.db.transaction(s=>{for(let i of r)s.insert(se).values({notification_id:i.id,user_id:e.userId,read_at:o}).onConflictDoNothing().run();}),r.length}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to mark all notifications read",r)}finally{n.close();}}};h();oe();fe();ae();pe();de();var jc=50,ti=class extends B{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=dirname(n);existsSync(o)||mkdirSync(o,{recursive:true});}else if(!existsSync(n))throw new l("NOT_FOUND","Database not found");let r=P(n);if(e)try{K(r.db,n);}catch(o){throw r.close(),o}return r}create(e){let n=this.openHandle(true);try{let r=new Date().toISOString(),o=[],s=e.map(i=>{let d=Le("sug");return o.push(d),{id:d,workspace_id:i.workspaceId,agent_id:i.agentId,task_id:i.taskId??null,type:i.type,status:i.status??"pending",payload:i.payload,applied_commit_sha:i.appliedCommitSha??null,created_at:r,updated_at:r}});return s.length>0&&n.db.insert(j).values(s).run(),{ids:o}}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to create agent suggestions",r)}finally{n.close();}}findLatestSet(e,n){if(!this.dbExists())return [];let r=this.openHandle(false);try{let o=r.db.select({task_id:j.task_id}).from(j).where(and(eq(j.workspace_id,e),eq(j.agent_id,n))).orderBy(desc(j.created_at)).limit(1).get();if(!o)return [];let s=o.task_id===null?isNull(j.task_id):eq(j.task_id,o.task_id);return r.db.select().from(j).where(and(eq(j.workspace_id,e),eq(j.agent_id,n),s)).orderBy(asc(j.created_at)).all()}catch(o){throw new l("DB_ERROR","Failed to find latest agent suggestion set",o)}finally{r.close();}}findSetByTaskId(e,n,r){if(!this.dbExists())return [];let o=this.openHandle(false);try{return o.db.select().from(j).where(and(eq(j.workspace_id,e),eq(j.agent_id,n),eq(j.task_id,r))).orderBy(asc(j.created_at)).all()}catch(s){throw new l("DB_ERROR","Failed to find agent suggestion set by task id",s)}finally{o.close();}}findById(e,n,r){if(!this.dbExists())return null;let o=this.openHandle(false);try{return o.db.select().from(j).where(and(eq(j.workspace_id,e),eq(j.agent_id,n),eq(j.id,r))).get()??null}catch(s){throw new l("DB_ERROR","Failed to find agent suggestion by id",s)}finally{o.close();}}updateStatus(e,n,r){let o=this.openHandle(true);try{let s={status:n,updated_at:new Date().toISOString()};return r!==void 0&&(s.applied_commit_sha=r),o.db.update(j).set(s).where(eq(j.id,e)).run().changes>0}catch(s){throw s instanceof l?s:new l("DB_ERROR","Failed to update agent suggestion status",s)}finally{o.close();}}listByAgent(e,n,r=jc){if(!this.dbExists())return [];let o=this.openHandle(false);try{return o.db.select().from(j).where(and(eq(j.workspace_id,e),eq(j.agent_id,n))).orderBy(desc(j.created_at)).limit(r).all()}catch(s){throw new l("DB_ERROR","Failed to list agent suggestions",s)}finally{o.close();}}findDismissed(e,n,r=20){if(!this.dbExists())return [];let o=this.openHandle(false);try{return o.db.select().from(j).where(and(eq(j.workspace_id,e),eq(j.agent_id,n),eq(j.status,"dismissed"))).orderBy(desc(j.updated_at)).limit(r).all()}catch(s){throw new l("DB_ERROR","Failed to find dismissed agent suggestions",s)}finally{o.close();}}};export{ti as AgentSuggestionRepository,hc as BUILTIN_THREAD_STATES,B as BaseSqliteRepository,yr as COMMON_CODE_COLORS,wr as COMMON_CODE_GROUPS,di as CREWX_JOURNAL_SIZE_LIMIT_BYTES,bo as CommonCodeRepository,ee as CommonCodeRepositoryError,jc as DEFAULT_AGENT_SUGGESTION_LIST_LIMIT,$c as DEFAULT_NOTIFICATION_CAP,qc as DEFAULT_NOTIFICATION_LIST_LIMIT,na as DEFAULT_PROJECT_STAGES,Co as DEFAULT_PROJECT_STAGE_KEYS,vs as DEFAULT_TASK_REAPER_TICK_INTERVAL_MS,Wr as INSTRUCTION_STOP_EPOCH_MISMATCH,bd as INSTRUCTION_STOP_GENERATION_ALREADY_SETTLED,fs as INSTRUCTION_STOP_PROCESS_TERMINATION_FAILED,Id as INSTRUCTION_STOP_REQUEST_FAILED,gs as INSTRUCTION_STOP_SETTLE_CAS_FAILED,Sd as INSTRUCTION_STOP_TARGET_PID_MISSING,Vr as INSTRUCTION_STOP_WORKSPACE_MISMATCH,os as LEGACY_TASK_TERMINAL_ERROR_PATTERNS,Zs as NotificationRepository,xo as ProjectRepository,l as RepositoryError,Ys as RequestLogRepository,Vs as SpanRepository,cs as TASK_HEARTBEAT_HARD_STALE_MS,as as TASK_HEARTBEAT_INTERVAL_MS,ds as TASK_HEARTBEAT_STALE_MS,Bd as TASK_LOG_MIGRATION_EVENT_ROW_BYTES,no as TASK_LOG_MIGRATION_MIN_FREE_SPACE_BYTES,Fd as TASK_LOG_MIGRATION_TERMINAL_STATUSES,Kr as TASK_STOP_DEFAULT_GRACE_MS,Ed as TASK_STOP_DEFAULT_POLL_MS,_s as TASK_STOP_OWNED_PROCESS_MARKERS,pf as TASK_STOP_POLL_INTERVAL_MS,ss as TASK_TERMINAL_STATUSES,Rc as THREAD_HIGHLIGHT_DELETION_REASON_REGENERATION_REPLACED,Sc as THREAD_HIGHLIGHT_REGENERATION_COMMIT_FAILED,uh as THREAD_HIGHLIGHT_REGENERATION_DETECTION_FAILED,Ec as THREAD_HIGHLIGHT_REGENERATION_INTERRUPTED,ch as THREAD_HIGHLIGHT_REGENERATION_NO_ELIGIBLE_TURNS,gc as THREAD_PRIORITIES,Mt as TaskLogRepository,Zr as TaskRepository,Js as ThreadBoxRepository,Sn as ThreadHighlightConflictError,fo as ThreadHighlightRegenerationConflictError,po as ThreadHistoryConflictError,zs as ThreadHistoryRepository,Us as ThreadRepository,Gt as ThreadTitleMetadataPatchError,Ks as ToolCallRepository,Zd as USAGE_BACKFILL_MAX_LATE_USAGE_AGE_MS,so as USAGE_BACKFILL_TERMINAL_STATUSES,Xs as UsageLimitSnapshotRepository,Qs as UsageReportRepository,Oo as WorkspaceRepository,Cc as calcBucketStart,ic as classifyUsageAccountingReason,mc as customStateLabel,So as generateCommonCodeId,kn as hasRecordedUsage,Wd as hasSufficientTaskLogMigrationFreeSpace,eh as hasThreadTitleKey,tr as isThreadPriority,nr as isThreadState,oh as matchesThreadTitleFilter,Qr as mergeTerminalReason,Fs as mergeThreadTitleMeta,Ot as normalizeTaskStatus,P as openDrizzleDb,nh as parseThreadPriorityFilter,rh as parseThreadStateFilter,Dl as pushSchema,ao as readThreadTitleMeta,eu as reclaimTemporaryJournal,zn as resolveTaskHeartbeatHardStaleMs,Gr as resolveTaskHeartbeatIntervalMs,Ft as resolveTaskHeartbeatStaleMs,ro as resolveTaskLogMigrationDbPath,ms as resolveTaskStopMethod,is as runHeartbeatTick,Vt as runMigrations,K as runMigrationsOnce,sg as runTaskLogMigration,zg as runUsageBackfill,gf as startTaskHeartbeat,ks as stopTask,Td as stopTaskHeartbeat,ln as taskHeartbeatRegistry,ig as taskLogBackupName,a as tasks,th as threadTitleSearchHaystack,Xn as tryCheckpointTaskLogWal};