@crewx/sdk 0.9.0-rc.104 → 0.9.0-rc.106
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.
- package/dist/boxing/box.types.d.ts +4 -0
- package/dist/config/default-agent-models.d.ts +11 -0
- package/dist/esm/index.js +230 -278
- package/dist/esm/plugins/index.js +163 -220
- package/dist/esm/repository/index.js +126 -182
- package/dist/events/types.d.ts +1 -0
- package/dist/index.browser.d.ts +2 -0
- package/dist/index.browser.js +4 -4
- package/dist/index.d.ts +12 -6
- package/dist/index.js +232 -280
- package/dist/lifecycle/task-stop.d.ts +4 -1
- package/dist/mcp-app/discovery.d.ts +105 -0
- package/dist/mcp-app/index.d.ts +9 -3
- package/dist/mcp-app/node-app-discovery-fs.d.ts +20 -0
- package/dist/mcp-app/registry.d.ts +9 -1
- package/dist/mcp-app/state-set.d.ts +9 -0
- package/dist/mcp-app/types.d.ts +134 -1
- package/dist/mcp-app/workspace-snapshot.d.ts +53 -0
- package/dist/migrations/0027_task_stop_scope_cleanup.sql +5 -0
- package/dist/migrations/0027_ui_instance_active_unique.sql +2 -0
- package/dist/migrations/0029_nice_rhino.sql +1 -0
- package/dist/migrations/meta/0029_snapshot.json +3206 -0
- package/dist/migrations/meta/_journal.json +21 -0
- package/dist/plugins/index.js +163 -220
- package/dist/plugins/sqlite-tracing.d.ts +2 -0
- package/dist/repository/index.d.ts +2 -2
- package/dist/repository/index.js +126 -182
- package/dist/repository/task.repository.d.ts +23 -1
- package/dist/schema/tasks.d.ts +19 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/ui-instance/runtime.d.ts +7 -2
- package/dist/ui-instance/store.d.ts +1 -0
- package/dist/ui-instance/types.d.ts +1 -0
- package/dist/ui-plugin/index.d.ts +3 -2
- package/dist/ui-plugin/limits.d.ts +27 -0
- package/dist/ui-plugin/types.d.ts +97 -2
- package/dist/ui-plugin/validator.d.ts +9 -3
- package/dist/utils/workspace.d.ts +1 -0
- package/package.json +1 -1
|
@@ -1,57 +1,64 @@
|
|
|
1
|
-
import*as
|
|
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
|
+
SELECT count(*) AS count
|
|
3
|
+
FROM tasks
|
|
4
|
+
WHERE status IN ('success', 'failed')
|
|
5
|
+
AND (stop_requested_at IS NOT NULL OR stop_requested_epoch IS NOT NULL)
|
|
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:
|
|
2
7
|
${r.join(`
|
|
3
|
-
`)}`);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),Vc(t,i),s?.cnt&&(Qc(t,o),Xc(t,o,n),Yc(t,o,n)),e(t,{migrationsFolder:o});let c=(t.get(n`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0)-i;if(c>0){let u=s?.cnt?"Database migrated":"Database initialized";console.error(`[crewx] ${u} (${c} migration${c>1?"s":""} applied).`);}}function K(t,e){ni.has(e)||(Jt(t),ni.add(e));}var ni,Kc,Jc,ae=v(()=>{h();ni=new Set,Kc={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"};Jc={"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"}};});var O,co=v(()=>{h();O=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,En=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"),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,si=v(()=>{h();En();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 du,cu,k,ur=v(()=>{h();co();du="json_extract(metadata, '$.threadTitle.state')",cu="json_extract(metadata, '$.threadTitle.priority')",k=sqliteTable("threads",{id:text("id").primaryKey(),workspace_id:text("workspace_id").references(()=>O.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(du)),idx_threads_workspace_thread_priority:index("idx_threads_workspace_thread_priority").on(t.workspace_id,sql.raw(cu))}));});var ht,di=v(()=>{h();En();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,ci=v(()=>{h();En();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 He,li=v(()=>{h();ur();He=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,fi=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 ge,mi=v(()=>{h();ge=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 Ne,_i=v(()=>{h();Ne=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,Ti=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 B,yi=v(()=>{h();B=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 Ei=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)}));});var Si=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`(
|
|
4
9
|
(${t.status} = 'requested' AND ${t.after_revision} IS NULL AND ${t.outcome} IS NULL AND ${t.settled_at} IS NULL)
|
|
5
10
|
OR
|
|
6
11
|
(${t.status} = 'settled' AND ${t.after_revision} IS NOT NULL AND ${t.outcome} IS NOT NULL AND ${t.settled_at} IS NOT NULL)
|
|
7
|
-
)`),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,xe,Ke,Ii=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`)})),xe=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 gr,hr,I,mo=v(()=>{h();gr=["THREAD_STATE","THREAD_PRIORITY"],hr=["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 vi,Ai,Oi,Ci,Ni,W,F,M,xi=v(()=>{h();ur();vi=["thread.snapshot.imported","thread.title.changed","thread.priority.changed","thread.state.changed","thread.highlight.created","thread.highlight.updated","thread.highlight.deleted","thread.highlights.regenerated"],Ai=["user","agent","system"],Oi=["auto","manual"],Ci=["decision","judgment","issue","result","pivot"],Ni=["queued","running","completed","failed"],W=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)})),F=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)})),M=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 Di=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();co();En();si();ur();di();ci();li();fi();mi();_i();Ti();yi();Ei();Si();Ii();mo();xi();Di();});var nn,vo,oa,Ao=v(()=>{h();nn={"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}},vo=new Set(["gpt-5.3-codex-spark"]),oa=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 Oo(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 Il(t){if(!t)return console.warn("[pricing] missing model id; cost is being recorded as 0"),vn;let e=Oo(t),n=bl[e];if(n)return Rr[n]??nn[n]??vn;if(Rr[e])return Rr[e];if(nn[e])return nn[e];if(vo.has(e))return console.warn(`[pricing] unpublished model pricing: ${t}, cost_usd=0`),vn;if(oa.has(e))return console.warn(`[pricing] missing catalog pricing: ${t}, cost_usd=0`),vn;let r={...nn,...Rr};for(let o of Object.keys(r))if(e.includes(o))return r[o];return console.warn(`[pricing] Unknown model: ${t}, cost_usd=0`),vn}function vl(t,e,n,r=0,o){let s=Il(n),i=Math.min(r,t),c=(t-i)*s.input/1e6,u=i*s.cachedInput/1e6,p=e*s.output/1e6;return c+u+p}function sa(t,e,n,r,o,s){return t&&t>0?t:!e&&!n?0:vl(e??0,n??0,o,r??0)}var bl,vn,Rr,Sr=v(()=>{h();Ao();Ao();bl={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"},vn={input:0,cachedInput:0,output:0},Rr={};});function ca(t){return t instanceof Error?t:t===void 0?void 0:new Error(String(t))}function aa(t){return typeof t=="object"&&t!==null&&"code"in t?String(t.code):void 0}function ua(t){return Number.isSafeInteger(t)&&t>0}function xl(t,e){return new Promise(n=>{let r;try{r=spawn(t,e,{windowsHide:!0});}catch(u){n({status:null,stdout:"",stderr:"",error:ca(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 ${ia}ms`)});},ia);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 la(t,e,n){return n.runCommandAsync?n.runCommandAsync(t,e):n.runCommand?n.runCommand(t,e):xl(t,e)}function Pl(t){return new Promise(e=>{setTimeout(e,Math.max(0,t));})}function Dl(){return new Promise(t=>{setImmediate(t);})}function Mt(t,e=process.kill){try{return e(t,0),"alive"}catch(n){return aa(n)==="ESRCH"?"not_found":aa(n)==="EPERM"?"alive":"unknown"}}function Ll(t,e){let n=Mt(-t,e),r=Mt(t,e);return n==="alive"||r==="alive"?"alive":n==="unknown"||r==="unknown"?"unknown":"not_found"}async function pa(t,e,n,r){let o=Math.max(0,n),s=Math.max(1,r.pollIntervalMs??Cl),i=Date.now()+o,d,c=o===0,u=r.sleep?Promise.resolve().then(()=>r.sleep(o)).then(()=>{},()=>{}):new Promise(p=>{d=setTimeout(p,o);});u.then(()=>{c=true;});try{for(await Dl();;){let p=Ll(t,e);if(p==="not_found")return p;let f=i-Date.now();if(c||f<=0)return p;await Promise.race([u,Pl(Math.min(s,f))]);}}finally{d!==void 0&&clearTimeout(d);}}async function da(t,e,n,r,o){let s=await pa(t,e,o.hardConfirmMs??Nl,{...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 No(t,e,n={}){if(!ua(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 la(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(p=>p.trim().length>0).some(p=>{let f=r==="win32"?p.toLowerCase():p;return c.includes(f)})?"owned":"not_owned"}async function xo(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(!ua(t))return o("Invalid process ID");let s=e.kill??process.kill,i=Mt(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 la("taskkill",["/PID",String(t),"/T","/F"],e);}catch(E){g={status:null,stdout:"",stderr:"",error:ca(E)};}let m=Mt(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 da(t,s,d,r,e);if(await pa(t,s,e.graceMs??Ol,e)==="not_found")return d?{status:"not_found",pid:t,method:r}:{status:"terminated",pid:t,method:r};let p;try{s(-t,"SIGKILL");}catch(g){p=g;}let f=await da(t,s,p,r,e);return f.status==="terminated"?f:f.status==="not_found"?d?f:{status:"terminated",pid:t,method:r}:o(f.error??"Process termination failed")}var ia,Co,Ol,Cl,Nl,Po=v(()=>{h();ia=3e3,Co="SIGINT",Ol=2e3,Cl=25,Nl=100;});function _a(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 ha(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)=>_a(r,o))}catch(r){throw r instanceof l?new l("DB_ERROR",`Malformed legacy task logs: ${t}`,r):r}}function ka(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 ma(t){return {taskId:t.id,source:ka(t),revision:t.log_revision,lastSeq:t.last_log_seq}}function jl(t){if(!Number.isInteger(t)||t<0)throw new l("VALIDATION","Task log tail limit must be a non-negative integer")}var Ht,br=v(()=>{h();oe();le();ae();ue();de();Ht=class extends q{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?qe(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)=>_a(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=ka(d);if(c==="blob"){let g=ha(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,p=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:p,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:p}},{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?ma(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 jl(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=ma(s);if(i.source==="blob"){let p=ha(e,s.logs);return {...i,entries:n===void 0?p:p.slice(Math.max(0,p.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:p,level:f,message:g})=>({timestamp:p,level:f,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 Ta=v(()=>{h();});var ke,On=v(()=>{h();ke=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,Do=v(()=>{h();On();_t=class extends ke{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 rn=v(()=>{h();});function Gl(t){let e=zl(t),n=e.map((s,i)=>({line:s,index:i})).filter(({line:s})=>Kl(s.value)),r=Wl(e);return {result:n.length===1&&n[0].index===r?Vl(n[0].line.value):null,resultPreview:Xl(e,n),hasReservedLine:n.length>0}}function kt(t,e){let n=Gl(t);return {resultPreview:n.resultPreview,isError:e||n.result?.isError===true,...n.hasReservedLine?{delegationResult:n.result}:{}}}function zl(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!==`
|
|
8
14
|
`&&o!=="\r")continue;let s=o==="\r"&&t[r+1]===`
|
|
9
15
|
`?`\r
|
|
10
|
-
`: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 Wl(t){for(let e=t.length-1;e>=0;e--)if(t[e].value.trim())return e;return -1}function Kl(t){return t.trimStart().startsWith(ql)}function Vl(t){let e=t.trim();if(!e.startsWith(wa)||!e.endsWith("]]"))return null;let n=e.slice(wa.length,-2);if(!n)return null;try{return Jl(JSON.parse(n))}catch{return null}}function Jl(t){return Yl(t)?Object.prototype.hasOwnProperty.call(t,"taskId")?{schema:1,taskId:t.taskId,agentId:t.agentId,isError:t.isError}:{schema:1,isError:true}:null}function Yl(t){if(!Ql(t)||Object.keys(t).some(r=>!Bl.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?ya(t.taskId)&&ya(t.agentId):t.isError===true}function Xl(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 ya(t){return typeof t=="string"&&t.trim().length>0}function Ql(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var wa,ql,Bl,Cn=v(()=>{h();wa="[[crewx:delegation-result ",ql="[[crewx:delegation-result",Bl=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 on=v(()=>{h();});var Ea,Ir,Lo,vr=v(()=>{h();Ea=["none","minimal","low","medium","high","xhigh","max","ultra"],Ir={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"]},Lo={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(Lo).map(([t,e])=>[t,e.models]));});function Mo(t){return ep[t]??t}function np(t){return tp.get(t)??t}function Ho(t){if(!t)return {};let e=op.get(t);return e?{...e}:{model:t}}function Uo(t,e){return t==="antigravity"||t==="cli/antigravity"?Ho(e):e===void 0?{}:{model:np(e)}}var Zl,ep,tp,rp,op,Nn=v(()=>{h();Zl=[{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]"}],ep={"accept-edits":"acceptEdits",yolo:"bypassPermissions","agent-full-access":"bypassPermissions"};tp=new Map(Zl.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"}],op=new Map(rp.map(({legacyId:t,model:e,effort:n})=>[t,n===void 0?{model:e}:{model:e,effort:n}]));});function ip(){return {models:[],modes:[],effort:[],modelOverrides:{},providerOptions:[]}}function At(t){return Ar(t).models}function Ar(t){return sp[t]??Lo[t]??ip()}function xn(t,e){let n=Ar(t);if(e){if(Object.prototype.hasOwnProperty.call(n.modelOverrides,e))return n.modelOverrides[e]?.effort??n.effort;let r=Uo(t,e);return r.model===void 0?n.effort:n.modelOverrides[r.model]?.effort??n.effort}return n.effort}function Ra(t){return Ar(t).modelOverrides}function Sa(){return At("claude")}function ba(){return At("codex")}function Ia(){return At("copilot")}function va(){return At("antigravity")}var sp,Ut=v(()=>{h();vr();Sr();Nn();sp={};});function Aa(t){return ap[t]??t}var ap,Oa=v(()=>{h();Ut();Nn();ap={auto:"default"};});function Or(t,e){return (Ir[t]??[]).includes(e)}function Ot(t){if(!t)return {};let e=t.match(/^(.+?)\[([^\]]+)\]$/);if(e){let n=e[2].toLowerCase();return dp.has(n)?{model:e[1],effort:n}:{model:t}}return {model:t}}function Ca(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 Na(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 xa(t){return !t||!Or("codex",t)?[]:["-c",`model_reasoning_effort=${t}`]}function Pa(t){if(!t)return [];let e=new Set(["acceptEdits","bypassPermissions","default","delegate","dontAsk","plan"]),n=Aa(t);return e.has(n)?["--permission-mode",n]:[]}function Da(t){return t?Or("claude",t)?["--effort",t]:[]:[]}function La(t){return t==="default"?[]:t&&cp.has(t)?["--permission-mode",t]:[]}function Ma(t){return t===true?["--always-approve"]:[]}function Ha(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 Ua(t){return t?Or("grok",t)?["--effort",t]:[]:[]}function $a(t){if(!t)return [];switch(Mo(t)){case "default":return [];case "plan":return ["--mode","plan"];case "acceptEdits":return ["--mode","accept-edits"];case "bypassPermissions":return ["--dangerously-skip-permissions"];default:return []}}function Fa(t){return t?Or("antigravity",t)?["--effort",t]:[]:[]}var dp,cp,Pn=v(()=>{h();Oa();Nn();vr();dp=new Set(Ea);cp=new Set(["default","acceptEdits","auto","dontAsk","bypassPermissions","plan"]);});function up(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 lp(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 pp(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(`
|
|
11
|
-
`))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
|
|
12
|
-
`))if(r.trim())try{let o=JSON.parse(r),s=
|
|
13
|
-
`).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
|
|
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(`
|
|
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(`
|
|
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(`
|
|
14
21
|
|
|
15
|
-
`):""}function
|
|
16
|
-
`):i=JSON.stringify(s),{timestamp:t,type:"tool_result",toolUseId:o,...
|
|
17
|
-
`);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=
|
|
18
|
-
`).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
|
|
19
|
-
`).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 yp(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 Ep(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=Rp(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 Rp(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 kp,Bo,Go=v(()=>{h();Dn();rn();on();Cn();Pn();Ut();$t();kp=new Set(["turn.started","turn.completed","item.updated"]);Bo={command:"codex",meta:{displayName:"Codex",models:ba(),capabilities:{resume:true}},buildArgs(t,e,n){let{model:r,effort:o}=Ot(e.model),s=e.effort??o,i=e.resumeSessionId?Na(e.mode):Ca(e.mode),d=xa(s),c=r?["-m",r]:[],u=wp(e.additionalArgs??[]),f=u.includes("--json")||u.includes("--experimental-json")?[]:["--json"];return e.resumeSessionId?{args:["exec","resume",...f,...i,...d,...c,...u,e.resumeSessionId,"-"],stdinMessage:t}:{args:["exec",...f,...i,...d,...c,...u],stdinMessage:t}},extractText(t){return Ga(t)??t.trim()},extractPartialText(t){return Ga(t)},parseResultMeta(t){let e=sn(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=Tp(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(...yp(c,u));continue}if(d==="item.completed"){let p=Ep(c,u);p&&r.push(p);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?kp.has(r):!1}catch{return false}}};});function Ip(t){return t?bp[t]??{agent:"build",autoApprove:false}:{agent:void 0,autoApprove:false}}function Cr(t,e){return t.some(n=>n===e||n.startsWith(`${e}=`))}function Ja(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 dn(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function vp(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);dn(i)?e.push(i):n=!0;continue}catch{}let s=Ja(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);dn(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,Va).trim()}function Ya(t){let e=dn(t.error)?t.error:void 0,n=e&&dn(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??Ka;return (s?`${i} (ref: ${s})`:i).slice(0,Va)}function za(t){let e=vp(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 p=dn(c.part)?c.part:void 0,f=typeof p?.text=="string"?p.text:void 0;f?.trim()&&n.push(f.trim());continue}if(u==="result"){typeof c.result=="string"&&(r=c.result);continue}if(u==="tool_use"){o++;continue}if(u==="error"){s.push(Ya(c));continue}if(u==="step_finish"){d=true;let p=dn(c.part)?c.part:void 0;i=typeof p?.reason=="string"?p.reason:void 0;}}}return {...e,texts:n,resultText:r,toolUseCount:o,errorMessages:s,terminalReason:i,hasTerminal:d}}function Xa(t){return (t??"unknown").trim().toLowerCase().replace(/_/g,"-")}function Nr(){return new ke("OpenCode returned no assistant output.",an,{code:"EMPTY_OUTPUT",kind:"transient"})}function Ap(){return new ke("OpenCode emitted malformed JSON output.",an,{code:"PROVIDER_CRASHED",kind:"transient"})}function Wa(t,e){switch(Xa(t)){case "length":return new ke("OpenCode stopped because the context window was exceeded.",an,{code:"UNKNOWN",kind:"permanent"});case "content-filter":return new ke("OpenCode stopped because the content filter blocked the response.",an,{code:"UNKNOWN",kind:"permanent"});case "error":return new ke(e?`OpenCode error: ${e}`:`${Ka} while generating a response.`,an,{code:"PROVIDER_CRASHED",kind:"transient"});default:return null}}var Sp,an,Ka,Va,bp,zo,Wo=v(()=>{h();On();Dn();on();$t();Sp=new Set(["step_start","step_finish"]),an="cli/opencode",Ka="OpenCode provider error",Va=240,bp={build:{agent:"build",autoApprove:false},"build-auto":{agent:"build",autoApprove:true},plan:{agent:"plan",autoApprove:false},"plan-auto":{agent:"plan",autoApprove:true}};zo={command:"opencode",meta:{displayName:"OpenCode",capabilities:{resume:true}},buildArgs(t,e,n){let r=e.additionalArgs,o=r!==void 0?[...r]:["run"];Cr(o,"--format")||o.push("--format","json"),e.resumeSessionId&&!o.includes("-s")&&!o.includes("--session")&&o.push("-s",e.resumeSessionId);let{agent:s,autoApprove:i}=Ip(e.mode);Cr(o,"--agent")||s!==void 0&&o.push("--agent",s),i&&!Cr(o,"--auto")&&o.push("--auto"),e.effort!==void 0&&!Cr(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=Wa("error",n);if(i)throw i}let r=Wa(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 Nr();return o}if(e.resultText?.trim()){if(!e.hasTerminal)throw Nr();return e.resultText}if(e.malformed)throw Ap();if(!e.hasTerminal)throw Nr();let s=Xa(e.terminalReason);if((s==="stop"||s==="tool-calls")&&e.toolUseCount>0)return "";throw Nr()},interpretExit(t,e,n=""){if(t===0)return null;let o=za(n).errorMessages[0];return o?new ke(`OpenCode error: ${o}`,an,{code:"PROVIDER_CRASHED",kind:"transient"}):null},parseResultMeta(t){let e=sn(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=Ja(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 p=i.part?.text;p&&r.push({timestamp:d,type:"text",content:p});continue}if(c==="tool_use"){let u=i.part;if(!u)continue;let p=String(u.tool||""),f=String(u.callID||""),g=u.state,m=String(g?.status||""),E=g?.input,_=ct(E);if(r.push({timestamp:d,type:"tool_use",toolName:p,toolUseId:f,toolInput:_}),m==="completed"&&g?.output!==void 0){let T=g.output,b=typeof T=="string"?T:JSON.stringify(T);r.push({timestamp:d,type:"tool_result",toolUseId:f,resultPreview:b,isError:false});}else m==="error"&&r.push({timestamp:d,type:"tool_result",toolUseId:f,resultPreview:String(g?.error||"tool error"),isError:true});continue}if(c==="error"){let u=Ya(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?Sp.has(r):!1}catch{return false}}};});function Ln(t,e){return t.some(n=>n===e||n.startsWith(`${e}=`))}function Op(t,e){if(!(t?At(Ko).some(s=>s.id===t):false)||!t)return e;let r=xn(Ko,t),o=Ra(Ko)[t]?.defaultEffort;if(r.length!==0)return e?r.includes(e)?e:o&&r.includes(o)?o:void 0:o}var Ko,Vo,Jo=v(()=>{h();On();Nn();Ut();Pn();Ko="antigravity";Vo={command:"agy",meta:{displayName:"Antigravity",models:va(),defaultTimeoutMs:{query:12e4,execute:3e5},defaultIdleMs:0},buildArgs(t,e,n){let{model:r,effort:o}=Ot(e.model),s=Ho(r),i=s.model,d=e.effort??o??s.effort,c=Op(i,d),u=e.additionalArgs??[],p=i&&!Ln(u,"--model")?["--model",i]:[],f=Ln(u,"--effort")?[]:Fa(c),g=Ln(u,"--mode")||Ln(u,"--dangerously-skip-permissions")?[]:$a(e.mode),m=Ln(u,"--print")?[]:["--print",t];return {args:[...p,...f,...g,...u,...m]}},extractText(t){let e=t.trim();if(!e)throw new ke("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 Qa=v(()=>{h();rn();on();Cn();$t();});function cn(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Pr(t){return cn(t)?t:void 0}function ve(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 Dp(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 Mn(t){let e=t.trim();if(!e)return [];try{let n=JSON.parse(e);return cn(n)?[n]:[]}catch{return Dp(e).flatMap(n=>{try{let r=JSON.parse(n);return cn(r)?[r]:[]}catch{return []}})}}function Hn(t){let e=JSON.stringify(t);return e===void 0?String(t):e}function Un(t){if(typeof t=="string")return t;if(Array.isArray(t)){let e=t.map(Un).filter(n=>n!==void 0);return e.length>0?e.join(`
|
|
20
|
-
`):void 0}if(
|
|
21
|
-
`).flatMap(
|
|
22
|
-
`),o=r.length>
|
|
23
|
-
`).flatMap(
|
|
24
|
-
`).flatMap(
|
|
25
|
-
`)??"";if(!n.trim())return;let r=ad(t.provider);if(!r)return;let o;try{o=r.parseResultMeta?.(n);}catch{return {stdout:n,adapter:r}}let s=jp(o?.model,t.model),i=o?.usage;if(!i)return {stdout:n,adapter:r};let d=Dr(i.inputTokens),c=Dr(i.outputTokens),u=Dr(i.cachedInputTokens),p=sa(Dr(i.costUsd),d,c,u,s);return d!==0||c!==0||u!==0||p!==0?{stdout:n,adapter:r,usage:{inputTokens:d,outputTokens:c,cachedInputTokens:u,costUsd:p,model:s}}:{stdout:n,adapter:r}}var Qo=v(()=>{h();dd();Sr();});function Bp(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"&&qp.has(n)?n:void 0}catch{return}}function Ct(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=Bp(t.metadata);return e==="user_stop"?"stopped":e==="runner_lost"?"runner_lost":e==="launch_failed"?"failed":typeof t.error=="string"&&Zo.stopped.test(t.error)?"stopped":typeof t.error=="string"&&Zo.runnerLost.test(t.error)?"runner_lost":"failed"}default:return t.status}}var es,Zo,qp,$n=v(()=>{h();es=["success","failed","stopped","runner_lost"],Zo={stopped:/^(Killed by user|Stopped by user|Cancelled by user|사용자에 의해 중지됨)/,runnerLost:/^Reaped: (process not found|pid never recorded|stale workflow run)/},qp=new Set(["user_stop","runner_lost","launch_failed"]);});function ss(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 Hr(){return ss("CREWX_TASK_HEARTBEAT_MS",1e4,200)}function qt(){return ss("CREWX_TASK_HEARTBEAT_STALE_MS",3e4)}function Fn(){return ss("CREWX_TASK_HEARTBEAT_HARD_STALE_MS",18e5)}function ln(t){return typeof t=="number"&&Number.isFinite(t)?Math.trunc(t):0}function Mr(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 zp(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 cd(t,e){return !!t.stop_requested_at&&ln(t.stop_requested_epoch)===ln(e)}function ts(t,e){let n=ln(e.runEpoch);if(!(e.writeHeartbeat===false?true:t.heartbeatTask({id:e.taskId,runEpoch:n})))return {accepted:false,row:null};let o=zp(t.getTask(e.taskId));return !o||o.status!=="running"||ln(o.run_epoch)!==n?{accepted:false,row:o}:{accepted:true,row:o}}function ud(t,e){let n=un.get(t);return !n||e&&n!==e?false:(clearInterval(n.timer),un.delete(t),true)}function ld(t,e){let n=un.get(t);return !n||e!==void 0&&n.runEpoch!==ln(e)?false:ud(t,n)}function Wp(t,e){let n=ln(e.runEpoch);ld(e.taskId);let r=true,o=null;try{let u=ts(t,{...e,runEpoch:n});r=u.accepted,o=u.row;}catch(u){Mr(u);}if(!r)return false;let s=Hr(),i=Math.min(s,1e3),d=setInterval(()=>{let u=un.get(e.taskId);if(!(!u||u.timer!==d))try{u.heartbeatElapsedMs+=i;let p=u.heartbeatElapsedMs>=s,f=ts(t,{taskId:e.taskId,runEpoch:n,writeHeartbeat:p});if(!f.accepted){ud(e.taskId,u);return}p&&(u.heartbeatElapsedMs%=s,u.lastHeartbeatAt=Date.now()),f.row&&cd(f.row,n)&&!u.stopRequested&&(u.stopRequested=!0,e.onStopRequested&&Promise.resolve(e.onStopRequested(f.row)).catch(Mr));}catch(p){Mr(p);}},i),c={timer:d,runEpoch:n,stopRequested:false,lastHeartbeatAt:Date.now(),heartbeatElapsedMs:0};return un.set(e.taskId,c),typeof d=="object"&&d!==null&&"unref"in d&&d.unref(),o&&cd(o,n)&&e.onStopRequested&&(c.stopRequested=true,Promise.resolve(e.onStopRequested(o)).catch(Mr)),true}var ns,rs,os,Gp,un,jn=v(()=>{h();ns=1e4,rs=3e4,os=18e5,Gp=1e3;un=new Map;});function ls(t,e=Date.now(),n=Fr){let r=t?Date.parse(t):Number.NaN,o=typeof e=="number"?e:Date.parse(e),s=us(n,Fr,0);return Number.isFinite(r)&&Number.isFinite(o)&&o-r>s?"forced":"cooperative"}function us(t,e,n){return t===void 0||!Number.isFinite(t)?e:Math.max(n,Math.trunc(t))}function Td(t){if(!t)return {};try{let e=JSON.parse(t);if(typeof e=="object"&&e!==null&&!Array.isArray(e))return e}catch{}return {}}function Kp(t){if(!t)return;let e=Td(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=Kp(t);return {status:"stopped",finalStatus:t.status,...r?{method:r}:{},...n?{pid:n}:{}}}return {status:"not_running",finalStatus:t.status,...n?{pid:n}:{}}}function wd(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 Te(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 is(t,e){return Te(t,_d,e)}function Vp(t,e){if(!t.heartbeat_at)return false;let n=Date.parse(t.heartbeat_at);return Number.isFinite(n)?e-n<=qt():false}function Jp(t){return {...t.processControlOptions,...t.platform?{platform:t.platform}:{}}}function Yp(t){let e=typeof t.pid=="number"&&t.pid>0?t.pid:void 0,n=Td(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 Xp(t,e,n){let r=t.getTask(e);if(!r||r.status!=="running")return ut(r,n)}async function Qp(t,e,n,r){let o=Date.now()+n;for(;;){let s=Xp(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 pd(t,e,n){let r=new Date().toISOString(),o=t.requestTaskStop({id:e,requestedAt:r}),s=t.getTask(e);if(!o.accepted){if(o.status==="pending"){let D=t.stopPendingTask(e),j=t.getTask(e);if(D||!j||j.status!=="running")return ut(j);if(o=t.requestTaskStop({id:e,requestedAt:r}),!o.accepted&&o.status!=="running"||!o.accepted&&!o.alreadyRequestedAt)return ut(t.getTask(e))}else if(!(o.status==="running"&&o.alreadyRequestedAt))return ut(s)}let i=o.runEpoch,d=us(n.graceMs,Fr,0),c=us(n.pollMs,hd,1),u=await Qp(t,e,d,c);if(u)return u;let p=t.getTask(e);if(!p||p.status!=="running")return ut(p);let f=Yp(p),g=f[0];if(!g){let D=t.finalizeTaskStop({id:e,runEpoch:i,method:"forced"}),j=t.getTask(e);return D||j?.status!=="running"?ut(j):Te(j,"Failed to finalize task stop")}let m=Jp(n),E="unknown";if(!Vp(p,Date.now())){let D=n.processControl?.checkProcessOwnershipAsync??No;try{E=await D(g,n.ownershipMarkers??ps,m);}catch{E="unknown";}if(E!=="owned")return wd(p)}let _=n.processControl?.terminateProcessTree??xo;for(let D of f){let j;try{j=await _(D,{...m,signal:Co});}catch(S){j={status:"failed",pid:D,method:m.platform==="win32"?"taskkill":"process-group",error:S instanceof Error?S.message:String(S)};}if(j.status==="failed")return Te(t.getTask(e),j.error??"Failed to terminate process tree")}let T=t.finalizeTaskStop({id:e,runEpoch:i,method:"forced"}),b=t.getTask(e);return T||b?.status!=="running"?ut(b,g):Te(b,"Task changed before stop was finalized")}function fd(t){return typeof t=="number"&&Number.isSafeInteger(t)&&t>0}function gd(t){return Number.isSafeInteger(t)&&t>=0}function as(t){return typeof t=="number"&&Number.isFinite(t)?Math.trunc(t):0}function Zp(t){return {...t.processControlOptions,...t.platform?{platform:t.platform}:{}}}async function yd(t,e){let n=t.getTask(e.taskId);if(!n||n.status!=="running")return is(n,fd(e.targetPid)?e.targetPid:void 0);if(!gd(e.sourceRunEpoch)||!gd(e.settleRunEpoch)||as(n.run_epoch)!==e.settleRunEpoch)return Te(n,Ur,e.targetPid);if(e.workspaceId!==void 0&&n.workspace_id!==e.workspaceId)return Te(n,$r,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 Te(n,kd,e.targetPid)}let s=t.getTask(e.taskId);if(!s||s.status!=="running")return is(s,e.targetPid);if(o.runEpoch!==e.settleRunEpoch||as(s.run_epoch)!==e.settleRunEpoch)return Te(s,Ur,e.targetPid);if(e.workspaceId!==void 0&&s.workspace_id!==e.workspaceId)return Te(s,$r,e.targetPid);if(!fd(e.targetPid))return Te(s,md);let i=Zp(e),d=e.processControl?.checkProcessOwnershipAsync??No,c="unknown";try{c=await d(e.targetPid,e.ownershipMarkers??ps,i);}catch{c="unknown";}if(c!=="owned")return wd(s,e.targetPid);let u=t.getTask(e.taskId);if(!u||u.status!=="running")return is(u,e.targetPid);if(as(u.run_epoch)!==e.settleRunEpoch)return Te(u,Ur,e.targetPid);if(e.workspaceId!==void 0&&u.workspace_id!==e.workspaceId)return Te(u,$r,e.targetPid);let p=e.processControl?.terminateProcessTree??xo,f;try{f=await p(e.targetPid,{...i,signal:Co});}catch{return Te(t.getTask(e.taskId),ds,e.targetPid)}if(f.status==="failed")return Te(t.getTask(e.taskId),ds,e.targetPid);let g;try{g=t.finalizeTaskStop({id:e.taskId,runEpoch:e.settleRunEpoch,method:"forced"});}catch{return Te(t.getTask(e.taskId),cs,e.targetPid)}return g?ut(t.getTask(e.taskId),e.targetPid):Te(t.getTask(e.taskId),cs,e.targetPid)}function fs(t,e,n={}){if(typeof t=="string"){let r=t,o=e??{};return Promise.resolve().then(()=>(qn(),Ed)).then(({TaskRepository:s})=>pd(new s,r,o))}return pd(t,e,n)}var Fr,hd,ps,md,Ur,$r,_d,ds,cs,kd,gs=v(()=>{h();Po();jn();Fr=5e3,hd=250;ps=["crewx","claude","codex","opencode","grok","node"],md="INSTRUCTION_STOP_TARGET_PID_MISSING",Ur="INSTRUCTION_STOP_EPOCH_MISMATCH",$r="INSTRUCTION_STOP_WORKSPACE_MISMATCH",_d="INSTRUCTION_STOP_GENERATION_ALREADY_SETTLED",ds="INSTRUCTION_STOP_PROCESS_TERMINATION_FAILED",cs="INSTRUCTION_STOP_SETTLE_CAS_FAILED",kd="INSTRUCTION_STOP_REQUEST_FAILED";});var Ed={};Hc(Ed,{DEFAULT_TASK_REAPER_TICK_INTERVAL_MS:()=>ws,HOST_SHUTDOWN_TERMINAL_ERROR:()=>Ad,PENDING_ADOPT_GRACE_MS:()=>Od,PID_NULL_REAP_GRACE_MS:()=>Ts,TASK_HEARTBEAT_HARD_STALE_MS:()=>os,TASK_HEARTBEAT_INTERVAL_MS:()=>ns,TASK_HEARTBEAT_STALE_MS:()=>rs,TaskRepository:()=>Gr,hasRecordedUsage:()=>fn,mergeTerminalReason:()=>Br,resolveTaskHeartbeatHardStaleMs:()=>Fn,resolveTaskHeartbeatIntervalMs:()=>Hr,resolveTaskHeartbeatStaleMs:()=>qt});function Xe(t){return {...t,status:Ct(t)}}function Sd(t){return {...t,status:Ct(t)}}function bd(){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`
|
|
26
33
|
CASE
|
|
27
|
-
WHEN ${
|
|
28
|
-
WHEN ${
|
|
29
|
-
WHEN ${
|
|
30
|
-
WHEN ${
|
|
31
|
-
WHEN ${
|
|
32
|
-
WHEN ${
|
|
33
|
-
WHEN ${
|
|
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'
|
|
34
41
|
ELSE 'unknown'
|
|
35
42
|
END
|
|
36
|
-
`,
|
|
43
|
+
`,r=sql`json_extract(${e}, '$.provider')`,o=sql`trim(${r})`,s=sql`substr(${o}, 1, instr(${o}, '/') - 1)`,i=sql`
|
|
37
44
|
CASE
|
|
38
|
-
WHEN instr(${
|
|
39
|
-
AND ${
|
|
40
|
-
THEN substr(${
|
|
41
|
-
ELSE ${
|
|
45
|
+
WHEN instr(${o}, '/') > 0
|
|
46
|
+
AND ${s} IN ('cli', 'acp', 'api', 'plugin', 'remote')
|
|
47
|
+
THEN substr(${o}, instr(${o}, '/') + 1)
|
|
48
|
+
ELSE ${o}
|
|
42
49
|
END
|
|
43
50
|
`;return sql`
|
|
44
51
|
CASE
|
|
45
|
-
WHEN ${
|
|
46
|
-
WHEN json_valid(${
|
|
47
|
-
WHEN json_type(${
|
|
48
|
-
WHEN json_type(${
|
|
49
|
-
WHEN json_type(${
|
|
50
|
-
WHEN ${
|
|
51
|
-
WHEN trim(${
|
|
52
|
-
ELSE ${
|
|
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}
|
|
53
60
|
END
|
|
54
|
-
`}function
|
|
61
|
+
`}function Yn(t){return sql`${t} NOT IN (${sql.join(Nf.map(e=>sql`${e}`),sql`, `)})`}function Jr(t){let e=sql`
|
|
55
62
|
CASE
|
|
56
63
|
WHEN json_valid(${t}) = 1
|
|
57
64
|
THEN json_extract(${t}, '$.usageAccounting')
|
|
@@ -61,29 +68,27 @@ ${r.join(`
|
|
|
61
68
|
COALESCE(SUM(
|
|
62
69
|
CASE WHEN ${e} = 'unavailable' THEN 1 ELSE 0 END
|
|
63
70
|
), 0)
|
|
64
|
-
`}function Kn(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Ae(t){if(!t)return {};try{let e=JSON.parse(t);return Kn(e)?{...e}:{}}catch{return {}}}function Br(t,e){let n=Ae(t??null);return n.terminalReason=e,JSON.stringify(n)}function ks(t,e){let n={...t,terminalReason:"user_stop"},r=e?.trim();return r&&r!==Id&&(n[af]=e),{error:Id,metadata:n}}function we(t){return typeof t=="number"&&Number.isFinite(t)?t:0}function fn(t){return we(t.input_tokens)!==0||we(t.output_tokens)!==0||we(t.cached_input_tokens)!==0||we(t.cost_usd)!==0}function Z(t){return typeof t=="number"&&Number.isFinite(t)?Math.trunc(t):0}function vd(t){return {inputTokens:we(t.inputTokens??0),outputTokens:we(t.outputTokens??0),cachedInputTokens:we(t.cachedInputTokens??0),costUsd:we(t.costUsd??0)}}function uf(t){if(Kn(t))return {inputTokens:we(t.inputTokens),outputTokens:we(t.outputTokens),cachedInputTokens:we(t.cachedInputTokens),costUsd:we(t.costUsd)}}function lf(t){let e={inputTokens:0,outputTokens:0,cachedInputTokens:0,costUsd:0};for(let n of Object.values(t)){let r=uf(n);r&&(e.inputTokens+=r.inputTokens,e.outputTokens+=r.outputTokens,e.cachedInputTokens+=r.cachedInputTokens,e.costUsd+=r.costUsd);}return e}function qr(t,e,n){let r=Date.parse(t),o=Date.parse(e);return Number.isFinite(r)&&Number.isFinite(o)?o-r:n??null}var ms,wt,of,yt,Et,sf,_s,zn,Qe,Id,Ad,af,df,cf,Ts,Od,ws,Gr,qn=v(()=>{h();oe();le();ae();ue();de();Sr();Po();br();Qo();$n();jn();gs();jn();ms=40,wt="2026-05-09",of="0.8.9-rc.13",yt=10,Et=parseInt(of.split("rc.")[1]);sf=new Set(["workflow","mcp"]),_s="usageByEpoch",zn="lateUsage",Qe="usageAccounting",Id="Stopped by user",Ad="Stopped by app shutdown",af="terminalErrorOriginal",df=new Set(["stopped","runner_lost"]),cf=["pending","running"];Ts=600*1e3,Od=600*1e3,ws=300*1e3,Gr=class extends q{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 Ht({dbPath:this.dbPath});}resolveDbPath(){return this.dbPath?qe(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}).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 c=s.stop_requested_at!==null&&Z(s.stop_requested_epoch)===i?s.stop_requested_at:e.requestedAt;if(o.update(a).set({stop_requested_at:e.requestedAt,stop_requested_epoch:sql`${a.run_epoch}`}).where(and(eq(a.id,e.id),eq(a.status,"running"),sql`${a.stop_requested_at} IS NULL
|
|
65
|
-
OR COALESCE(${a.stop_requested_epoch}, 0) <> COALESCE(${a.run_epoch}, 0)`)).run().changes===0){let g=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(!g||g.status!=="running"){r={accepted:!1,status:g?.status??"not_running",runEpoch:Z(g?.run_epoch)};return}r={accepted:!1,status:g.status,runEpoch:Z(g.run_epoch),...g.stop_requested_at&&Z(g.stop_requested_epoch)===Z(g.run_epoch)?{alreadyRequestedAt:g.stop_requested_at}:{}};}else r={accepted:!0,status:s.status,runEpoch:i};let p=new Set([e.id]),f=(g,m)=>{if(m>=8)return;let E=o.select({id:a.id,status:a.status}).from(a).where(and(eq(a.parent_task_id,g),eq(a.status,"running"))).all();for(let _ of E)p.has(_.id)||(p.add(_.id),o.update(a).set({stop_requested_at:c,stop_requested_epoch:sql`${a.run_epoch}`}).where(and(eq(a.id,_.id),eq(a.status,"running"),sql`${a.stop_requested_at} IS NULL
|
|
66
|
-
OR COALESCE(${a.stop_requested_epoch}, 0) <> COALESCE(${a.run_epoch}, 0)`)).run(),f(_.id,m+1));};f(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}).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),p=or$1(isNull(a.stop_requested_at),isNull(a.stop_requested_epoch),ne(a.stop_requested_epoch,d)),f=_=>o.update(a).set({stop_requested_at:e.requestedAt,stop_requested_epoch:d}).where(and(eq(a.id,e.id),eq(a.status,"running"),u,_,p)).run();if((e.workspaceId===void 0?f():e.workspaceId===null?f(isNull(a.workspace_id)):f(eq(a.workspace_id,e.workspaceId))).changes>0){r={accepted:!0,status:s.status,runEpoch:c};return}let m=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(!m||m.status!=="running"){r={accepted:!1,status:m?.status??"not_running",runEpoch:Z(m?.run_epoch)};return}let E=Z(m.run_epoch);r={accepted:!1,status:m.status,runEpoch:E,...m.stop_requested_at&&Z(m.stop_requested_epoch)===d?{alreadyRequestedAt:m.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=Ae(i.metadata),u=d?ks(c,e.error):{error:e.error??null,metadata:e.terminalReason===void 0?{...c}:{...c,terminalReason:e.terminalReason}},p={...u.metadata,stopMethod:e.method},f=i.duration_ms??e.durationMs??qr(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:f,metadata:JSON.stringify(p)}).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),p=e.workspaceId===void 0?void 0:e.workspaceId===null?isNull(a.workspace_id):eq(a.workspace_id,e.workspaceId),f={...Ae(d.metadata),terminalReason:"runner_lost"},g=d.duration_ms??qr(d.started_at,r,void 0);s=i.update(a).set({status:"runner_lost",error:Ad,completed_at:r,duration_ms:g,metadata:JSON.stringify(f)}).where(and(eq(a.id,e.id),eq(a.status,"running"),u,p)).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 fs(this,e,n)}async stopTaskGenerationForInstruction(e){return yd({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,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`,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/i.test(i)||!/no such column|no column named/i.test(i))throw s;let c=new Set(n.db.all("PRAGMA table_info(tasks)").map(g=>g.name)).has("log_storage"),u=c?", log_storage":"",p=c?", ?":"",f=c?`,
|
|
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?`,
|
|
67
72
|
log_storage = CASE WHEN tasks.status = 'pending' THEN excluded.log_storage ELSE tasks.log_storage END`:"";n.runRaw(`INSERT INTO tasks (
|
|
68
73
|
id, agent_id, prompt, mode, status, started_at, pid,
|
|
69
74
|
parent_task_id, caller_agent_id, trace_id, command, metadata,
|
|
70
|
-
workspace_id, project_id, platform, crewx_version, thread_id,
|
|
71
|
-
model, rendered_prompt, coding_agent_command${
|
|
72
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?${p})
|
|
75
|
+
workspace_id${f}, project_id, platform, crewx_version, thread_id,
|
|
76
|
+
model, rendered_prompt, coding_agent_command${m}
|
|
77
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?${p}${_})
|
|
73
78
|
ON CONFLICT(id) DO UPDATE SET
|
|
74
79
|
status = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN 'running' ELSE tasks.status END,
|
|
75
80
|
pid = COALESCE(excluded.pid, tasks.pid),
|
|
76
81
|
command = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN excluded.command ELSE tasks.command END,
|
|
77
82
|
metadata = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN excluded.metadata ELSE tasks.metadata END,
|
|
78
|
-
workspace_id = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN COALESCE(tasks.workspace_id, excluded.workspace_id) ELSE tasks.workspace_id END,
|
|
83
|
+
workspace_id = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN COALESCE(tasks.workspace_id, excluded.workspace_id) ELSE tasks.workspace_id END${g},
|
|
79
84
|
project_id = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN COALESCE(tasks.project_id, excluded.project_id) ELSE tasks.project_id END,
|
|
80
85
|
crewx_version = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN excluded.crewx_version ELSE tasks.crewx_version END,
|
|
81
86
|
model = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN excluded.model ELSE tasks.model END,
|
|
82
87
|
rendered_prompt = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN excluded.rendered_prompt ELSE tasks.rendered_prompt END,
|
|
83
|
-
coding_agent_command = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN excluded.coding_agent_command ELSE tasks.coding_agent_command END${
|
|
84
|
-
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,r.project_id,r.platform,r.crewx_version,r.thread_id,r.model,r.rendered_prompt,r.coding_agent_command,...
|
|
85
|
-
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()){let
|
|
86
|
-
`);}}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=
|
|
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`
|
|
87
92
|
SELECT
|
|
88
93
|
COALESCE(workspace_id, 'unknown') AS workspace_id,
|
|
89
94
|
COALESCE(SUM(input_tokens), 0) AS input_tokens,
|
|
@@ -104,94 +109,33 @@ ${r.join(`
|
|
|
104
109
|
FROM tasks
|
|
105
110
|
GROUP BY workspace_id
|
|
106
111
|
ORDER BY (COALESCE(SUM(input_tokens), 0) + COALESCE(SUM(output_tokens), 0)) DESC
|
|
107
|
-
`)}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
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
t.
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
GROUP BY t.agent_id, t.workspace_id
|
|
135
|
-
ORDER BY (
|
|
136
|
-
COALESCE(SUM(
|
|
137
|
-
COALESCE(t.input_tokens, 0)
|
|
138
|
-
+ CASE
|
|
139
|
-
WHEN t.started_at >= ${wt}
|
|
140
|
-
AND (
|
|
141
|
-
t.crewx_version IS NULL
|
|
142
|
-
OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
|
|
143
|
-
OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${yt}) AS INTEGER) < ${Et})
|
|
144
|
-
)
|
|
145
|
-
THEN COALESCE(t.cached_input_tokens, 0)
|
|
146
|
-
ELSE 0
|
|
147
|
-
END
|
|
148
|
-
), 0)
|
|
149
|
-
+ COALESCE(SUM(t.output_tokens), 0)
|
|
150
|
-
) DESC
|
|
151
|
-
`:sql`
|
|
152
|
-
SELECT
|
|
153
|
-
t.agent_id,
|
|
154
|
-
t.workspace_id,
|
|
155
|
-
COUNT(*) AS total_tasks,
|
|
156
|
-
${i} AS unavailable_task_count,
|
|
157
|
-
COALESCE(SUM(
|
|
158
|
-
COALESCE(t.input_tokens, 0)
|
|
159
|
-
+ CASE
|
|
160
|
-
WHEN t.started_at >= ${wt}
|
|
161
|
-
AND (
|
|
162
|
-
t.crewx_version IS NULL
|
|
163
|
-
OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
|
|
164
|
-
OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${yt}) AS INTEGER) < ${Et})
|
|
165
|
-
)
|
|
166
|
-
THEN COALESCE(t.cached_input_tokens, 0)
|
|
167
|
-
ELSE 0
|
|
168
|
-
END
|
|
169
|
-
), 0) AS input_tokens,
|
|
170
|
-
COALESCE(SUM(t.output_tokens), 0) AS output_tokens,
|
|
171
|
-
COALESCE(SUM(t.cached_input_tokens), 0) AS cached_input_tokens,
|
|
172
|
-
COALESCE(SUM(t.cost_usd), 0) AS cost_usd
|
|
173
|
-
FROM tasks t
|
|
174
|
-
WHERE ${s}
|
|
175
|
-
AND t.started_at >= ${e}
|
|
176
|
-
AND t.started_at < ${n}
|
|
177
|
-
GROUP BY t.agent_id, t.workspace_id
|
|
178
|
-
ORDER BY (
|
|
179
|
-
COALESCE(SUM(
|
|
180
|
-
COALESCE(t.input_tokens, 0)
|
|
181
|
-
+ CASE
|
|
182
|
-
WHEN t.started_at >= ${wt}
|
|
183
|
-
AND (
|
|
184
|
-
t.crewx_version IS NULL
|
|
185
|
-
OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
|
|
186
|
-
OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${yt}) AS INTEGER) < ${Et})
|
|
187
|
-
)
|
|
188
|
-
THEN COALESCE(t.cached_input_tokens, 0)
|
|
189
|
-
ELSE 0
|
|
190
|
-
END
|
|
191
|
-
), 0)
|
|
192
|
-
+ COALESCE(SUM(t.output_tokens), 0)
|
|
193
|
-
) DESC
|
|
194
|
-
`).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=Wn(sql.raw("t.status")),i=jr(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`
|
|
195
139
|
SELECT
|
|
196
140
|
date(t.started_at) AS date,
|
|
197
141
|
t.agent_id,
|
|
@@ -199,11 +143,11 @@ ${r.join(`
|
|
|
199
143
|
COALESCE(SUM(
|
|
200
144
|
COALESCE(t.input_tokens, 0)
|
|
201
145
|
+ CASE
|
|
202
|
-
WHEN t.started_at >= ${
|
|
146
|
+
WHEN t.started_at >= ${gn}
|
|
203
147
|
AND (
|
|
204
148
|
t.crewx_version IS NULL
|
|
205
149
|
OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
|
|
206
|
-
OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${
|
|
150
|
+
OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${hn}) AS INTEGER) < ${mn})
|
|
207
151
|
)
|
|
208
152
|
THEN COALESCE(t.cached_input_tokens, 0)
|
|
209
153
|
ELSE 0
|
|
@@ -227,11 +171,11 @@ ${r.join(`
|
|
|
227
171
|
COALESCE(SUM(
|
|
228
172
|
COALESCE(t.input_tokens, 0)
|
|
229
173
|
+ CASE
|
|
230
|
-
WHEN t.started_at >= ${
|
|
174
|
+
WHEN t.started_at >= ${gn}
|
|
231
175
|
AND (
|
|
232
176
|
t.crewx_version IS NULL
|
|
233
177
|
OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
|
|
234
|
-
OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${
|
|
178
|
+
OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${hn}) AS INTEGER) < ${mn})
|
|
235
179
|
)
|
|
236
180
|
THEN COALESCE(t.cached_input_tokens, 0)
|
|
237
181
|
ELSE 0
|
|
@@ -246,14 +190,14 @@ ${r.join(`
|
|
|
246
190
|
AND t.started_at < ${n}
|
|
247
191
|
GROUP BY date(t.started_at), t.agent_id
|
|
248
192
|
ORDER BY date(t.started_at) ASC
|
|
249
|
-
`).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?
|
|
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`
|
|
250
194
|
COALESCE(${a.input_tokens}, 0)
|
|
251
195
|
+ CASE
|
|
252
|
-
WHEN ${a.started_at} >= ${
|
|
196
|
+
WHEN ${a.started_at} >= ${gn}
|
|
253
197
|
AND (
|
|
254
198
|
${a.crewx_version} IS NULL
|
|
255
199
|
OR (${a.crewx_version} LIKE '0.8.%' AND ${a.crewx_version} NOT LIKE '0.8.9%')
|
|
256
|
-
OR (${a.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${a.crewx_version}, ${
|
|
200
|
+
OR (${a.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${a.crewx_version}, ${hn}) AS INTEGER) < ${mn})
|
|
257
201
|
)
|
|
258
202
|
THEN COALESCE(${a.cached_input_tokens}, 0)
|
|
259
203
|
ELSE 0
|
|
@@ -273,19 +217,19 @@ ${r.join(`
|
|
|
273
217
|
${u}
|
|
274
218
|
GROUP BY ${s}
|
|
275
219
|
ORDER BY (COALESCE(SUM(${c}), 0) + COALESCE(SUM(${a.output_tokens}), 0)) DESC
|
|
276
|
-
`).map(
|
|
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`
|
|
277
221
|
COALESCE(${a.input_tokens}, 0)
|
|
278
222
|
+ CASE
|
|
279
|
-
WHEN ${a.started_at} >= ${
|
|
223
|
+
WHEN ${a.started_at} >= ${gn}
|
|
280
224
|
AND (
|
|
281
225
|
${a.crewx_version} IS NULL
|
|
282
226
|
OR (${a.crewx_version} LIKE '0.8.%' AND ${a.crewx_version} NOT LIKE '0.8.9%')
|
|
283
|
-
OR (${a.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${a.crewx_version}, ${
|
|
227
|
+
OR (${a.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${a.crewx_version}, ${hn}) AS INTEGER) < ${mn})
|
|
284
228
|
)
|
|
285
229
|
THEN COALESCE(${a.cached_input_tokens}, 0)
|
|
286
230
|
ELSE 0
|
|
287
231
|
END
|
|
288
|
-
`,u=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}`,
|
|
232
|
+
`,u=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}`,f=o.db.all(sql`
|
|
289
233
|
SELECT
|
|
290
234
|
${a.model} AS model,
|
|
291
235
|
${s} AS provider,
|
|
@@ -300,7 +244,7 @@ ${r.join(`
|
|
|
300
244
|
FROM ${a}
|
|
301
245
|
${u}
|
|
302
246
|
GROUP BY ${a.model}, ${s}
|
|
303
|
-
`),
|
|
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`
|
|
304
248
|
SELECT
|
|
305
249
|
${a.thread_id} AS thread_id,
|
|
306
250
|
${a.agent_id} AS agent_id,
|
|
@@ -314,16 +258,16 @@ ${r.join(`
|
|
|
314
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`
|
|
315
259
|
COALESCE(${a.input_tokens}, 0)
|
|
316
260
|
+ CASE
|
|
317
|
-
WHEN ${a.started_at} >= ${
|
|
261
|
+
WHEN ${a.started_at} >= ${gn}
|
|
318
262
|
AND (
|
|
319
263
|
${a.crewx_version} IS NULL
|
|
320
264
|
OR (${a.crewx_version} LIKE '0.8.%' AND ${a.crewx_version} NOT LIKE '0.8.9%')
|
|
321
|
-
OR (${a.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${a.crewx_version}, ${
|
|
265
|
+
OR (${a.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${a.crewx_version}, ${hn}) AS INTEGER) < ${mn})
|
|
322
266
|
)
|
|
323
267
|
THEN COALESCE(${a.cached_input_tokens}, 0)
|
|
324
268
|
ELSE 0
|
|
325
269
|
END
|
|
326
|
-
`,i=
|
|
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`
|
|
327
271
|
SELECT
|
|
328
272
|
${a.caller_agent_id} AS caller_agent_id,
|
|
329
273
|
${a.agent_id} AS agent_id,
|
|
@@ -334,41 +278,41 @@ ${r.join(`
|
|
|
334
278
|
${d}
|
|
335
279
|
GROUP BY ${a.caller_agent_id}, ${a.agent_id}
|
|
336
280
|
ORDER BY task_count DESC, ${a.caller_agent_id} ASC, ${a.agent_id} ASC
|
|
337
|
-
LIMIT ${
|
|
338
|
-
`),u=c.length>ms;return {edges:c.slice(0,ms).map(f=>({callerAgentId:f.caller_agent_id??null,agentId:f.agent_id,taskCount:f.task_count,totalTokens:f.input_tokens+f.output_tokens,outputTokens:f.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,...p})=>({...p,status:Ct({status:p.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 p={id:u.id,agentId:u.agent_id,status:u.status,prompt:u.prompt,startedAt:u.started_at,completedAt:u.completed_at},f=d.get(u.thread_id);f?f.push(p):d.set(u.thread_id,[p]);}let c=[];for(let[u,p]of d){let f=p.filter(g=>g.agentId===e.targetAgentId).length;f<2||c.push({threadId:u,targetAgentTurnCount:f,turns:p});}return c.sort((u,p)=>{let f=u.turns[u.turns.length-1].startedAt,g=p.turns[p.turns.length-1].startedAt;return f<g?1:f>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();ue();h();oe();le();ae();ue();de();mo();var ee=class extends l{reason;constructor(e,n="VALIDATION",r=e,o){super(n,r,o),this.name="CommonCodeRepositoryError",this.reason=e;}},Mi="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function Ku(){let t=randomBytes(16),e="";for(let n of t)e+=Mi[n%Mi.length];return e.slice(0,12)}function ko(){return `c_${Ku()}`}function Vu(t){return typeof t=="string"&&gr.includes(t)}function Ju(t){return typeof t=="string"&&hr.includes(t)}function Zt(t){if(!Vu(t))throw new ee("COMMON_CODE_GROUP_INVALID","VALIDATION",`Unsupported common-code group: ${t}`)}function Hi(t){if(!Ju(t))throw new ee("COMMON_CODE_COLOR_INVALID","VALIDATION",`Unsupported common-code color: ${t}`)}function Ui(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 Tr(t){if(typeof t!="string"||t.trim().length===0)throw new ee("COMMON_CODE_CODE_INVALID","VALIDATION","Common-code code is required")}function vt(t,e){return and(eq(I.code_group,t),or$1(isNull(I.workspace_id),eq(I.workspace_id,e)))}var To=class extends q{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(vt(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(vt(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)Tr(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(vt(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 p=new Map(i.map(m=>[m.code,m])),f=e.codes.map(m=>{let E=p.get(m);if(!E)throw new ee("COMMON_CODE_REORDER_INVALID","VALIDATION",`Common code is not selectable in this scope: ${n}/${m}`);return E}),g;for(let[m,E]of f.entries())E.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,E.code))).run());return o.select().from(I).where(vt(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),Tr(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=Ui(e.name);Hi(e.color);let r=this.openHandle(true);try{return r.db.transaction(o=>{if(o.select({code:I.code}).from(I).where(and(vt("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(vt("THREAD_STATE",e.workspaceId)).get(),d=new Date().toISOString(),c=ko();for(;o.select({code:I.code}).from(I).where(and(eq(I.code_group,"THREAD_STATE"),eq(I.code,c))).limit(1).get();)c=ko();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),Tr(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:Ui(e.name);e.color!==void 0&&Hi(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(vt(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),Tr(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(vt(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();le();ae();ue();de();h();function wo(t){let e=Be.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 Fi(t){let e=wo(t);return createHash("sha256").update(e).digest("hex")}function wr(t){return t.toLowerCase().replace(/[^a-z0-9-]/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}var Ro=class extends q{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=wr(basename(r)),i=`${wr(basename(dirname(r)))}-${o}`,d=[o,i];try{let c=u=>e.select({id:O.id}).from(O).where(and(eq(O.slug,u),ne(O.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 p=`${i}-${u}`;if(!c(p))return p}}catch{}return o}normalizeLegacySlugs(){if(!this.dbExists())return {updated:0,checked:0};let e=this.openHandle(true);try{let n=e.db.select({id:O.id,slug:O.slug}).from(O).all(),r=0;for(let o of n)if(o.slug.includes("/")){let s=wr(o.slug.replace(/\//g,"-"));e.db.update(O).set({slug:s,updated_at:new Date().toISOString()}).where(eq(O.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(O).values({id:r,slug:o,name:s,workspace_path:i,is_active:1,created_at:d,updated_at:d}).onConflictDoNothing().run(),e.update(O).set({workspace_path:i,updated_at:d}).where(and(eq(O.id,r),isNull(O.workspace_path))).run();}registerWorkspace(e){let n=wo(e),r=this.openHandle(true);try{let o=Fi(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(O.is_active,e.isActive?1:0):void 0,o=n.db.select({count:sql`count(*)`}).from(O).where(r).get();return {rows:n.db.select().from(O).where(r).orderBy(desc(O.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(O).where(eq(O.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:O.starred}).from(O).where(eq(O.id,e)).get();if(!r)return null;let o=r.starred?0:1;return n.db.update(O).set({starred:o}).where(eq(O.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.*,
|
|
339
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
|
|
340
284
|
FROM threads t
|
|
341
285
|
WHERE t.workspace_id = ${e}
|
|
342
286
|
ORDER BY t.updated_at DESC
|
|
343
|
-
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(O).where(eq(O.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(O.slug,e),ne(O.id,n)):eq(O.slug,e);return !!r.db.select({id:O.id}).from(O).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(O).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(O).where(eq(O.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(O).where(eq(O.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:O.id,workspace_path:O.workspace_path}).from(O).where(and(eq(O.is_active,1),isNotNull(O.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(O).set({is_active:0,updated_at:new Date().toISOString()}).where(eq(O.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(O).where(eq(O.id,e)).run();}catch(r){throw r instanceof l?r:new l("DB_ERROR","Failed to delete workspace",r)}finally{n.close();}}};h();oe();le();ae();ue();h();var So="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function tl(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+=So[o%62]);}for(;n.length<t;)n+=So[randomBytes(1)[0]%62];return n}function De(t){return `${t}_${tl(8)}`}function Gi(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+=So[i%62];return `${t}_${s}`}de();var Io=["outcome_plan","contract_check","feature_link","use_verify","result_review"],dl=new Set(Io),Yi=Object.freeze(Io.map(t=>({key:t,labelOverride:null}))),cl=new Set(["created","plan_proposed","plan_approved","decision_requested","decision_answered","replanned","stage_advanced","criterion_verified","scene_changed","result_submitted","accepted"]),ul=new Set(["planning","plan_review","running","human_wait","limit_wait","failed_stop","analyzing_feedback","replanned","awaiting_review","accepted"]),ll=new Set(["pending","verifying","passed","failed"]),pl=new Set(["user","project_manager","system"]),fl=new Set(["task","wi","url"]),gl=/^\d{4}-\d{2}-\d{2}$/;function Q(t){throw new l("VALIDATION",t)}function Ue(t){throw new l("NOT_FOUND",t)}function pe(t,e){(typeof t!="string"||t.trim().length===0)&&Q(`${e} is required`);}function hl(t){if(t==null)return;gl.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 Xi(t){let e=t??Yi;(!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 pe(o.key,"stage.key"),o.labelOverride!==null&&typeof o.labelOverride!="string"&&Q("stage.labelOverride must be a string or null"),o.labelOverride!==null&&pe(o.labelOverride,"stage.labelOverride"),typeof o.key!="string"&&Q("stage.key is required"),!dl.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 ml(t){Array.isArray(t)||Q("criteria must be an array");for(let e of t)pe(e,"criterion.statement");}function tn(t={}){let e=t.actorType??"system";pl.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 Qi(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 _l(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"),fl.has(e.kind)||Q(`invalid evidence kind: ${String(e.kind)}`),pe(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 Ji(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 Xi(e)}catch(n){throw new l("DB_ERROR","Project stages JSON is invalid",n)}}function Zi(t){return pe(t.projectId,"projectId"),pe(t.title,"title"),cl.has(t.type)||Q(`invalid project event type: ${String(t.type)}`),{...tn(t),payloadJson:Qi(t.payload,t.type)}}function Lt(t,e,n){let r=Zi(e);t.select({id:z.id}).from(z).where(eq(z.id,e.projectId)).get()||Ue(`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=De("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 bo=class extends q{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(xe).where(eq(xe.project_id,n)).orderBy(asc(xe.position)).all();return {...r,stages:Ji(r.stages_json),criteria:o}}getDetailOrThrow(e){let n=this.getProject(e);return n||Ue(`Project ${e} not found`),n}createProject(e){pe(e.workspaceId,"workspaceId"),pe(e.name,"name"),pe(e.outcome,"outcome"),hl(e.dueDate);let n=Xi(e.stages);ml(e.criteria);let r=De("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(xe).values({id:De("pjc"),project_id:r,position:c+1,statement:d,verify_status:"pending",verified_at:null,evidence_json:"[]",created_at:o,updated_at:o}).run();}),Lt(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(pe(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){pe(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&&Ue(`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={}){pe(e,"projectId"),ul.has(n)||Q(`invalid project scene: ${String(n)}`);let o=tn(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||Ue(`Project ${e} not found`),d.update(z).set({scene:n,updated_at:s}).where(eq(z.id,e)).run(),Lt(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={}){pe(e,"projectId"),Number.isInteger(n)||Q("stage index must be an integer");let o=tn(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||Ue(`Project ${e} not found`);let u=Ji(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(),Lt(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||!ll.has(i))&&Q(`invalid criterion status: ${String(i)}`),pe(s.criterionId,"criterionId");let d=tn(s),c=new Date().toISOString(),u=this.openHandle(true),p;try{u.db.transaction(g=>{let m=g.select().from(xe).where(eq(xe.id,s.criterionId)).get();m||Ue(`Criterion ${s.criterionId} not found`),p=m.project_id,s.projectId&&s.projectId!==m.project_id&&Ue(`Criterion ${s.criterionId} not found in project ${s.projectId}`),g.update(xe).set({verify_status:i,verified_at:i==="passed"?c:null,updated_at:c}).where(eq(xe.id,s.criterionId)).run(),Lt(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 f=p?this.getProject(p)?.criteria.find(g=>g.id===s.criterionId):void 0;return f||Ue(`Criterion ${s.criterionId} not found`),f}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;pe(s.criterionId,"criterionId");let i=_l(s.evidence),d=tn(s),c=new Date().toISOString(),u=this.openHandle(true),p;try{u.db.transaction(g=>{let m=g.select().from(xe).where(eq(xe.id,s.criterionId)).get();m||Ue(`Criterion ${s.criterionId} not found`),p=m.project_id,s.projectId&&s.projectId!==m.project_id&&Ue(`Criterion ${s.criterionId} not found in project ${s.projectId}`),g.update(xe).set({evidence_json:JSON.stringify(i),updated_at:c}).where(eq(xe.id,s.criterionId)).run(),Lt(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 f=p?this.getProject(p)?.criteria.find(g=>g.id===s.criterionId):void 0;return f||Ue(`Criterion ${s.criterionId} not found`),f}appendEvent(e,n){let r=typeof e=="string"?{...n,projectId:e}:e;Zi(r);let o=new Date().toISOString(),s=this.openHandle(true),i;try{s.db.transaction(d=>{i=Lt(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(pe(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){pe(e,"projectId");let r=tn(n),o={remainingRisks:n.remainingRisks,nextPlan:n.nextPlan,lessons:n.lessons,evidenceRefs:n.evidenceRefs};Qi(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()||Ue(`Project ${e} not found`),d.update(z).set({scene:"accepted",accepted_at:s,updated_at:s}).where(eq(z.id,e)).run(),Lt(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)}};le();ae();h();ae();de();var na=[O,a,k,ht,rt,He,Xt];function wl(){return Be__default.join(Qs.homedir(),".crewx","crewx.db")}function yl(t){if(!ea__default.existsSync(t))return null;let e=Math.floor(Date.now()/1e3),n=`${t}.bak-${e}`;return ea__default.copyFileSync(t,n),n}function ra(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 El(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 Rl(t){let e=t.getSQLType(),n=`"${t.name}" ${e}`,r=El(t.default);return r!==null&&(n+=` DEFAULT ${r}`),t.notNull&&(n+=" NOT NULL"),n}function Sl(t,e){let n=e?.dbPath??wl(),r=e?.force??false,o=e?.dryRun??false,s=o?null:yl(n);if(r&&!o)try{t.run("DELETE FROM __drizzle_migrations");}catch{}let i=ra(t);if(!o)try{Jt(t);}catch(f){let g=f instanceof Error?`${f.message} ${f.cause?.message??""}`:"";if(!r||!g.includes("duplicate column"))throw f}let d,c;o?(d=na.map(g=>getTableConfig(g).name).filter(g=>!i.has(g)),c=i):(c=ra(t),d=[...c].filter(f=>!i.has(f)));let u=[],p=[];for(let f of na){let g=getTableConfig(f),m=g.name;if(!c.has(m))continue;let E=t.all(`PRAGMA table_info("${m}")`),_=new Set(E.map(b=>b.name)),T=new Set(g.columns.map(b=>b.name));for(let b of g.columns)if(!_.has(b.name)){if(!o){let D=Rl(b);t.run(`ALTER TABLE "${m}" ADD COLUMN ${D}`);}u.push({table:m,column:b.name});}for(let b of E)T.has(b.name)||p.push(`${m}.${b.name} exists in DB but not in schema (untouched)`);}return {created:d,altered:u,warnings:p,backupPath:s}}de();qn();gs();jn();$n();qn();h();oe();h();var Pd=["success","failed","completed"],Kr=10*1024*1024*1024,Dd=256,Tf=new Set(Pd),ye=class extends Error{constructor(n,r,o="metadata"){super(r);this.taskId=n;this.kind=o;this.name="MigrationTaskError";}taskId;kind};function Vr(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 wf(){return ft("better-sqlite3")}function Ld(t,e){let n=t===":memory:";if(!n&&!existsSync(t))throw new Error(`Database not found: ${t}`);let r=new(wf())(t,{readonly:e,fileMustExist:!n,timeout:5e3});return r.pragma("foreign_keys = ON"),r.pragma("busy_timeout = 5000"),r}function hn(t,e,n=[]){return t.prepare(e).all(...n)}function gn(t,e,n=[]){return t.prepare(e).get(...n)}function yf(t,e,n=[]){return t.prepare(e).run(...n)}function Ef(t,e,n=[]){return t.prepare(e).iterate(...n)}function Rf(t){return typeof t=="string"&&t.length>0?t:"<unknown>"}function Md(t){return typeof t=="string"&&Tf.has(t)}function Cd(t,e){t.set(e,(t.get(e)??0)+1);}function Nd(t){return Object.fromEntries([...t.entries()].sort(([e],[n])=>e.localeCompare(n)))}function Sf(t){let e=new Set(hn(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(hn(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 Hd(t,e){if(e==null)return {entries:[]};if(typeof e!="string")throw new ye(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 ye(t,`Malformed JSON in tasks.logs (${s})`,"malformed")}if(!Array.isArray(n))throw new ye(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 ye(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 Rs(t,e){if(!Number.isInteger(t.last_log_seq)||t.last_log_seq<0)throw new ye(t.id,"Invalid last_log_seq metadata","metadata");if(!Number.isInteger(t.log_revision)||t.log_revision<0)throw new ye(t.id,"Invalid log_revision metadata","metadata");if(e==="blob"&&t.last_log_seq!==0)throw new ye(t.id,"Blob source must have last_log_seq=0","metadata")}function bf(t){let e=hn(t,`SELECT task_id, COUNT(*) AS event_count
|
|
344
|
-
FROM task_log_events GROUP BY task_id`);return new Map(e.map(n=>[n.task_id,n.event_count]))}function
|
|
345
|
-
FROM tasks ORDER BY id`)){let _
|
|
346
|
-
FROM tasks WHERE id = ?`,[e]);if(!r)throw new
|
|
347
|
-
VALUES (?, ?, ?, ?, ?)`);for(let[
|
|
348
|
-
FROM task_log_events WHERE task_id = ? ORDER BY seq`,[e]);if(!
|
|
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
|
|
349
293
|
SET log_storage = 'events', last_log_seq = ?, log_revision = log_revision + 1, logs = NULL
|
|
350
|
-
WHERE id = ? AND log_storage = 'blob' AND logs IS ?`,[s.entries.length,e,o]).changes!==1)throw new
|
|
351
|
-
FROM tasks WHERE id = ?`,[e]);if(!
|
|
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,
|
|
352
296
|
COUNT(*) AS eventCount,
|
|
353
297
|
COUNT(DISTINCT seq) AS distinctSeqCount,
|
|
354
298
|
MIN(seq) AS minSeq,
|
|
355
299
|
MAX(seq) AS maxSeq
|
|
356
|
-
FROM task_log_events GROUP BY task_id`),n=e.reduce((r,o)=>r+o.eventCount,0);return {rows:e,eventCount:n}}function
|
|
357
|
-
FROM task_log_events GROUP BY task_id, seq HAVING COUNT(*) > 1`))r.push(
|
|
358
|
-
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(
|
|
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,
|
|
359
303
|
input_tokens, output_tokens, cached_input_tokens, cost_usd
|
|
360
304
|
FROM tasks
|
|
361
305
|
WHERE status IN (?, ?, ?)
|
|
362
|
-
ORDER BY completed_at ASC, id ASC`,[...
|
|
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
|
|
363
307
|
FROM tasks
|
|
364
308
|
WHERE json_valid(metadata) = 1
|
|
365
309
|
AND json_type(metadata, '$') = 'object'
|
|
366
|
-
AND json_extract(metadata, '$.usageAccounting') IN ('recorded', 'unavailable')`)[0]?.count??0,s=
|
|
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,
|
|
367
311
|
input_tokens, output_tokens, cached_input_tokens, cost_usd
|
|
368
|
-
FROM tasks WHERE id = ?`,[n.candidate.id]);if(!s||!
|
|
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
|
|
369
313
|
SET input_tokens = ?, output_tokens = ?, cached_input_tokens = ?, cost_usd = ?,
|
|
370
314
|
metadata = ?, model = ?
|
|
371
|
-
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
|
|
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(`
|
|
372
316
|
CREATE TABLE usage_undo_meta (
|
|
373
317
|
id INTEGER PRIMARY KEY CHECK (id = 1),
|
|
374
318
|
source_db_path TEXT NOT NULL,
|
|
@@ -400,29 +344,29 @@ ${r.join(`
|
|
|
400
344
|
after_usage_accounting_reason TEXT
|
|
401
345
|
);
|
|
402
346
|
`),i.prepare(`INSERT INTO usage_undo_meta (id, source_db_path, created_at, schema_version, plan_summary)
|
|
403
|
-
VALUES (1, ?, ?, ?, ?)`).run(resolve(t),n,
|
|
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 (
|
|
404
348
|
id, before_run_epoch, after_run_epoch, before_completed_at, after_completed_at,
|
|
405
349
|
before_input_tokens, after_input_tokens, before_output_tokens, after_output_tokens,
|
|
406
350
|
before_cached_input_tokens, after_cached_input_tokens, before_cost_usd, after_cost_usd,
|
|
407
351
|
before_model, after_model, before_usage_backfill, after_usage_backfill,
|
|
408
352
|
before_usage_accounting, after_usage_accounting,
|
|
409
353
|
before_usage_accounting_reason, after_usage_accounting_reason
|
|
410
|
-
) 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
|
|
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,
|
|
411
355
|
before_input_tokens, after_input_tokens, before_output_tokens, after_output_tokens,
|
|
412
356
|
before_cached_input_tokens, after_cached_input_tokens, before_cost_usd, after_cost_usd,
|
|
413
357
|
before_model, after_model, before_usage_backfill, after_usage_backfill,
|
|
414
358
|
before_usage_accounting, after_usage_accounting,
|
|
415
359
|
before_usage_accounting_reason, after_usage_accounting_reason
|
|
416
|
-
FROM usage_undo_rows ORDER BY rowid ASC`)}}finally{n.close();}}function
|
|
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,
|
|
417
361
|
input_tokens, output_tokens, cached_input_tokens, cost_usd
|
|
418
|
-
FROM tasks WHERE id = ?`,[e.id]);if(!r)return {taskId:e.id,fields:[...
|
|
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
|
|
419
363
|
SET run_epoch = ?, completed_at = ?, input_tokens = ?, output_tokens = ?,
|
|
420
364
|
cached_input_tokens = ?, cost_usd = ?, model = ?, metadata = ?
|
|
421
|
-
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:[...
|
|
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 (
|
|
422
366
|
SELECT 1 FROM tasks parent
|
|
423
367
|
WHERE parent.id = ${e}.parent_task_id
|
|
424
368
|
AND parent.thread_id = ${e}.thread_id
|
|
425
|
-
)`)}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(
|
|
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`
|
|
426
370
|
SELECT
|
|
427
371
|
count(*) AS cnt,
|
|
428
372
|
COALESCE(SUM(child.input_tokens), 0) AS total_input,
|
|
@@ -433,13 +377,13 @@ ${r.join(`
|
|
|
433
377
|
WHERE child.thread_id = ${e}
|
|
434
378
|
AND ${this.topLevelTaskPredicateSql()}
|
|
435
379
|
${n?sql`AND child.workspace_id = ${n}`:sql``}
|
|
436
|
-
`);g&&(o+=g.cnt,s+=g.total_input,i+=g.total_output,d+=g.total_cached,c+=g.total_cost);let m=
|
|
380
|
+
`);g&&(o+=g.cnt,s+=g.total_input,i+=g.total_output,d+=g.total_cached,c+=g.total_cost);let m=p.db.all(sql`
|
|
437
381
|
SELECT DISTINCT child.agent_id FROM tasks child
|
|
438
382
|
WHERE child.thread_id = ${e}
|
|
439
383
|
AND child.agent_id IS NOT NULL AND child.agent_id != ''
|
|
440
384
|
AND ${this.topLevelTaskPredicateSql()}
|
|
441
385
|
${n?sql`AND child.workspace_id = ${n}`:sql``}
|
|
442
|
-
`);for(let
|
|
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`
|
|
443
387
|
SELECT * FROM (
|
|
444
388
|
SELECT child.*,
|
|
445
389
|
ROW_NUMBER() OVER (PARTITION BY child.agent_id ORDER BY child.started_at DESC) AS rn
|
|
@@ -456,7 +400,7 @@ ${r.join(`
|
|
|
456
400
|
AND ${this.topLevelTaskPredicateSql()}
|
|
457
401
|
${n?sql`AND child.workspace_id = ${n}`:sql``}
|
|
458
402
|
ORDER BY child.started_at ASC
|
|
459
|
-
`);for(let
|
|
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`
|
|
460
404
|
SELECT child.id, child.thread_id, child.agent_id, child.status,
|
|
461
405
|
child.parent_task_id, child.started_at, child.completed_at,
|
|
462
406
|
child.duration_ms, child.input_tokens, child.output_tokens,
|
|
@@ -466,7 +410,7 @@ ${r.join(`
|
|
|
466
410
|
AND ${this.topLevelTaskPredicateSql()}
|
|
467
411
|
${n?sql`AND child.workspace_id = ${n}`:sql``}
|
|
468
412
|
ORDER BY child.started_at ASC
|
|
469
|
-
`}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(
|
|
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`
|
|
470
414
|
UPDATE threads
|
|
471
415
|
SET first_message = COALESCE(first_message, ${n}),
|
|
472
416
|
title = CASE WHEN title_locked = 0 AND title IS NULL THEN substr(${n}, 1, 60) ELSE title END,
|
|
@@ -474,7 +418,7 @@ ${r.join(`
|
|
|
474
418
|
message_count = message_count + 1,
|
|
475
419
|
updated_at = ${s}
|
|
476
420
|
WHERE id = ${e}
|
|
477
|
-
`),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 Wt("THREAD_TITLE_PATCH_INVALID","Thread-title metadata patch must be an object");if(Object.keys(o).some(c=>c!=="priority"&&c!=="state"))return new Wt("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 Wt("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 Wt("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 p=u.select({metadata:k.metadata}).from(k).where(c).get();if(!p)return null;let f=Yn(p.metadata),g=f.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?f.threadTitle=m:delete f.threadTitle;let E=Object.keys(f).length>0?JSON.stringify(f):null,_=new Date().toISOString();u.update(k).set({metadata:E,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 b=Ag(T.metadata);return {threadId:e,priority:b.priority,state:b.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=Yn(i.metadata);if(d){let u=n?and(eq(k.pinned,1),eq(k.workspace_id,n)):eq(k.pinned,1),p=s.select({metadata:k.metadata}).from(k).where(u).all(),f=null;for(let g of p){let m=Yn(g.metadata);typeof m.pinOrder=="number"&&(f===null||m.pinOrder<f)&&(f=m.pinOrder);}c.pinOrder=f===null?0:f-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=Yn(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 p=u.select({metadata:k.metadata}).from(k).where(d).get();if(!p)return null;let f=p.metadata?JSON.parse(p.metadata):{},g=f.overdrive??{},m=o?.defaultTurns??g.defaultTurns??3,E=o?.updatedBy??"ui",_=new Date().toISOString(),T,b,D,j;switch(r){case "enable-count":{let S=o?.turns??m,x=o?.consumeCurrent?Math.max(S-1,0):S;T=x>0?"count":"off",b=x,D=!0,j="count";break}case "enable-latch":{T="latch",b=0,D=!0,j="latch";break}case "disable":{T="off",b=0,D=!1;break}default:{let S=g.state??"off",x=typeof g.remaining=="number"?g.remaining:0;if(S==="count"&&x>0){let A=x-1;A<=0?(T="off",b=0):(T="count",b=A),D=!0,j="count";}else S==="latch"?(T="latch",b=0,D=!0,j="latch"):(T="off",b=0,D=!1);break}}return f.overdrive={state:T,remaining:b,defaultTurns:m,updatedAt:_,updatedBy:E},u.update(k).set({metadata:JSON.stringify(f),updated_at:_}).where(d).run(),{applied:D,appliedMode:j,state:T,remaining:b}},{behavior:"immediate"})}catch(d){throw d instanceof l?d:new l("DB_ERROR","Failed to resolve overdrive",d)}finally{i.close();}}};h();oe();le();ae();ue();de();h();var ic=["urgent","high","medium","low"],ac=["investigating","in-progress","in-review","on-hold","done"],Xn="custom:";var Og=new Set(ic),Cg=new Set(ac),Ng={urgent:"U \uAE34\uAE09 Urgent",high:"P0 \uAE09\uD568 High",medium:"P1 \uC911\uC694 Medium",low:"P2 \uBCF4\uD1B5 Low"},xs={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 sc(t,e){return !e||e.includes(t)?e??t:`${t} ${e}`}function Qn(t){return typeof t=="string"&&Og.has(t)}function Zn(t){if(typeof t!="string")return false;if(Cg.has(t))return true;if(t.startsWith("c_"))return t.length>2;if(!t.startsWith(Xn))return false;let e=t.slice(Xn.length);return e.length>=1&&e.length<=20}function dc(t){if(t.startsWith(Xn))return t.slice(Xn.length)}function Ps(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 xg(t){let e=Ps(t);return !!e&&Object.prototype.hasOwnProperty.call(e,"threadTitle")}function Qr(t){let e=Ps(t);if(!e)return {};let n=e.threadTitle;if(!n||typeof n!="object"||Array.isArray(n))return {};let r=n,o={};return Qn(r.priority)&&(o.priority=r.priority),Zn(r.state)&&(o.state=r.state),o}function Ds(t,e){let n=Ps(t)??{},r={...Qr(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 Pg(t,e=new Map){let n=[];return t.priority&&n.push(sc(Ng[t.priority],e.get(t.priority))),t.state&&(t.state.startsWith(Xn)?n.push(dc(t.state)??""):xs[t.state]?n.push(sc(xs[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(xs[t.state]??"")),n.filter(Boolean).join(" ")}function cc(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 Dg(t){return cc(t,Qn)}function Lg(t){return cc(t,Zn)}function Mg(t,e){return e?t?e.values.has(t):e.includeNone:true}$n();var gc="regeneration_replaced",jg="THREAD_HIGHLIGHT_REGENERATION_NO_ELIGIBLE_TURNS",hc="THREAD_HIGHLIGHT_REGENERATION_INTERRUPTED",qg="THREAD_HIGHLIGHT_REGENERATION_DETECTION_FAILED",mc="THREAD_HIGHLIGHT_REGENERATION_COMMIT_FAILED",no=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;}},Tn=class extends no{},ro=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;}},Bg=new Set(Ai),Gg=new Set(vi),zg=new Set(Oi),Wg=new Set(Ci),Kg=50,lc=100,pc=280,fc=40,Vg=new Set(Ni),Zr=["queued","running"];function Ms(t){return Vg.has(t)}function Y(t){throw new l("VALIDATION",t)}function et(t){throw new l("NOT_FOUND",t)}function L(t,e){(typeof t!="string"||t.trim().length===0)&&Y(`${e} is required`);}function tr(t={}){let e=t.actor??t,n=e.actorType??"system";return Bg.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 Jg(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&&!Qn(t.priority)&&Y(`invalid priority: ${String(t.priority)}`),t.state!==void 0&&t.state!==null&&!Zn(t.state)&&Y(`invalid state: ${String(t.state)}`);}function Yg(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??Kg;return (!Number.isInteger(e)||e<1||e>lc)&&Y(`limit must be between 1 and ${lc}`),e}function Us(t){typeof t!="string"&&Y("text is required");let e=t.trim();return e.length===0&&Y("text must not be empty"),e.length>pc&&Y(`text must be at most ${pc} characters`),e}function St(t,e){return L(t??"",e),t}function $s(t){Wg.has(t)||Y(`invalid highlight kind: ${String(t)}`);}function Xg(t){zg.has(t)||Y(`invalid highlight source: ${String(t)}`);}function Qg(t){L(t.threadId,"threadId"),L(t.workspaceId,"workspaceId");let e=t.source??"manual";Xg(e),$s(t.kind);let n=Us(t.text),r=t.coversFromTaskId??t.fromTaskId??t.taskId,o=t.coversToTaskId??t.toTaskId??t.taskId;if(e==="manual"){let p=t.taskId??(r&&o&&r===o?r:void 0),f=St(p,"taskId");return (r!==f||o!==f)&&Y("manual highlights must cover exactly one task"),{source:e,kind:t.kind,text:n,coversFromTaskId:f,coversToTaskId:f,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 Zg(t,e){(!t||typeof t!="object")&&Y(`candidates[${e}] is required`),$s(t.kind);let n=Us(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()||Gi("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 eh(t){Array.isArray(t)||Y("candidates must be an array"),t.length>fc&&Y(`candidates must contain at most ${fc} items`);let e=new Map;for(let[n,r]of t.entries()){let o=Zg(r,n);e.set(o.contentFingerprint,o);}return [...e.values()]}function sr(t){let e=Qr(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 th(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 nr(t,e){return t.select({maxSeq:sql`COALESCE(MAX(${W.seq}), 0)`}).from(W).where(eq(W.thread_id,e)).get()?.maxSeq??0}function rr(t,e){return !!t.select({id:W.id}).from(W).where(eq(W.thread_id,e)).limit(1).get()}function Kt(t,e){Gg.has(e.type)||Y(`invalid thread event type: ${String(e.type)}`);let n=De("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:th(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 or(t,e,n,r,o){let s=sr(e);Kt(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 to(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 eo(t,e,n,r,o,s,i){let d=o==="thread.highlight.created"?to(e):{before:i?to({...e,...i,id:e.id}):void 0,after:to(e)};return Kt(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 nh(t,e,n,r,o,s){return Kt(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:to(e),...s??{}}})}var Hs=class extends q{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(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: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(L(e,"threadId"),!existsSync(this.resolveDbPath()))return null;let r=this.openHandle(false);try{let o=this.findThread(r.db,e,n);return o?sr(o):null}catch(o){throw o instanceof l?o:new l("DB_ERROR","Failed to read thread snapshot",o)}finally{r.close();}}updateSnapshot(e){Jg(e);let n=tr(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=sr(i),c=e.title!==void 0,u=c&&e.title!==d.title,p=c&&i.title_locked!==1,f=e.priority!==void 0&&e.priority!==d.priority,g=e.state!==void 0&&e.state!==d.state,m=u||f||g;if(!m&&!p)return d;let E=i.metadata;(f||g)&&(E=Ds(i.metadata,{priority:e.priority,state:e.state}));let _={};if(m&&(_.metadata=E,_.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 D={...i,title_locked:1};return sr(D)}let T=nr(s,i.id)+1;rr(s,i.id)||(or(s,i,n,r,T),T+=1),u&&(Kt(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),f&&(Kt(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&&Kt(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 b={...i,title:u?e.title:i.title,metadata:E,title_locked:c?1:i.title_locked,updated_at:r};return sr(b)},{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,[...es,"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||et(`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,Zr))).orderBy(asc(F.requested_at),asc(F.id)).limit(1).get();if(d)throw new ro(d);let c=e.runId??De("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||et(`Highlight regeneration run ${e} not found`),Ms(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||et(`Highlight regeneration run ${e.runId} not found`),Ms(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,Zr))).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=hc){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,Zr)).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=eh(e.candidates),r=tr(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`),Ms(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||et(`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(),p=new Set(n.map(A=>A.contentFingerprint)),f=u.filter(A=>A.source==="auto"&&A.status==="active"&&A.revision===0&&!p.has(A.content_fingerprint??"")),g=u.filter(A=>A.source==="auto"&&A.status==="active").length,m=new Set(u.filter(A=>!f.includes(A)&&A.content_fingerprint).map(A=>A.content_fingerprint)),E=n.filter(A=>!m.has(A.contentFingerprint)),_=new Date().toISOString(),T=nr(i,c.id)+1;rr(i,c.id)||(or(i,c,r,_,T),T+=1);for(let A of f)i.delete(M).where(eq(M.id,A.id)).run(),nh(i,A,r,_,T,{runId:e.runId,reason:gc}),T+=1;let b=0,D=e.agentId??(r.actorType==="agent"?r.actorId:null);for(let A of E){let ce=De("thl");i.insert(M).values({id:ce,thread_id:c.id,source:"auto",kind:A.kind,status:"active",text:A.text,covers_from_task_id:A.coversFromTaskId,covers_to_task_id:A.coversToTaskId,revision:0,created_at:_,updated_at:_,agent_id:D,source_task_id:A.anchorTaskId,detector_version:e.detectorVersion,content_fingerprint:A.contentFingerprint,dismissed_at:null}).run();let je=i.select().from(M).where(eq(M.id,ce)).get();if(!je)throw new l("DB_ERROR","Regenerated highlight insert did not return a row");eo(i,je,r,_,"thread.highlight.created",T),T+=1,b+=1;}let S=i.select().from(M).where(eq(M.thread_id,c.id)).all().filter(A=>A.source==="auto"&&A.status==="active").length;Kt(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:S,deletedCount:f.length,createdCount:b}}),i.update(F).set({status:"completed",started_at:d.started_at??_,completed_at:_,error_code:null,previous_auto_count:g,new_auto_count:S}).where(and(eq(F.id,d.id),inArray(F.status,Zr))).run();let x=i.select().from(F).where(eq(F.id,d.id)).get();if(!x)throw new l("DB_ERROR","Highlight regeneration completion did not return a row");return {run:x,deletedCount:f.length,createdCount:b,previousAutoCount:g,newAutoCount:S}},{behavior:"immediate"})}catch(i){if(s)try{this.failHighlightRegenerationRun({runId:e.runId,workspaceId:e.workspaceId,errorCode:mc});}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=Yg(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(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,p=o.afterSeq!==void 0?c.slice(0,s):u?c.slice(1):c,f=!1,g=p[0];return g&&(f=!!i.db.select({id:W.id}).from(W).where(and(eq(W.thread_id,o.threadId),lt(W.seq,g.seq))).limit(1).get()),{items:p,latestSeq:d,hasMoreOlder:f}}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=Qg(e),r=tr(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(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??De("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 p=i.select().from(M).where(eq(M.id,c)).get();if(!p)throw new l("DB_ERROR","Highlight insert did not return a row");let f=nr(i,d.id)+1;return rr(i,d.id)||(or(i,d,r,o,f),f+=1),eo(i,p,r,o,"thread.highlight.created",f),p},{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&&$s(e.kind);let n=e.text===void 0?void 0:Us(e.text),r=tr(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(M).where(and(eq(M.id,e.highlightId),eq(M.thread_id,d.id))).limit(1).get();if(c||et(`Highlight ${e.highlightId} not found`),c.revision!==e.expectedRevision)throw new Tn(d.id,c.id,e.expectedRevision,c.revision);if(c.status!=="active")throw new Tn(d.id,c.id,e.expectedRevision,c.revision);let u=e.kind??c.kind,p=n??c.text,f=e.coversFromTaskId??c.covers_from_task_id,g=e.coversToTaskId??c.covers_to_task_id;(!p||f.length===0||g.length===0)&&Y("highlight projection is incomplete");let m=u!==c.kind||p!==c.text||f!==c.covers_from_task_id||g!==c.covers_to_task_id,E=r.actorType==="user"&&c.source==="auto"&&m?"manual":c.source;if(!(m||E!==c.source))return c;let T=c.revision+1;i.update(M).set({source:E,kind:u,text:p,covers_from_task_id:f,covers_to_task_id:g,revision:T,updated_at:o}).where(and(eq(M.id,c.id),eq(M.revision,c.revision))).run();let b=i.select().from(M).where(eq(M.id,c.id)).get();if(!b)throw new l("DB_ERROR","Highlight update did not return a row");let D=nr(i,d.id)+1;return rr(i,d.id)||(or(i,d,r,o,D),D+=1),eo(i,b,r,o,"thread.highlight.updated",D,c),b},{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=tr(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(M).where(and(eq(M.id,e.highlightId),eq(M.thread_id,i.id))).limit(1).get();if(d||et(`Highlight ${e.highlightId} not found`),d.revision!==e.expectedRevision)throw new Tn(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 p=nr(s,i.id)+1;return rr(s,i.id)||(or(s,i,n,r,p),p+=1),eo(s,u,n,r,"thread.highlight.deleted",p,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`
|
|
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`
|
|
478
422
|
SELECT id, started_at FROM tasks WHERE thread_id = ${e}
|
|
479
423
|
ORDER BY started_at ASC, id ASC
|
|
480
|
-
`),c=new Map(d.map((g,m)=>[g.id,m])),u=r.taskId===void 0?void 0:c.get(r.taskId),p=r.coversFromTaskId===void 0?void 0:c.get(r.coversFromTaskId),f=r.coversToTaskId===void 0?void 0:c.get(r.coversToTaskId);return i.filter(g=>{let m=c.get(g.covers_from_task_id),E=c.get(g.covers_to_task_id);if(m===void 0||E===void 0)return !1;let _=Math.min(m,E),T=Math.max(m,E);return !(u!==void 0&&(u<_||u>T)||p!==void 0&&T<p||f!==void 0&&_>f)})}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();le();ae();ue();de();var Fs=class extends q{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();le();ae();ue();de();var js=class extends q{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();le();ae();ue();de();var qs=class extends q{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(He).where(eq(He.thread_id,e)).orderBy(asc(He.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(He).where(and(eq(He.id,n),eq(He.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(He).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(He).where(eq(He.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();le();ae();ue();de();var Bs=class extends q{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();le();ae();ue();de();function Sc(t){return new Date(Math.floor(t/3e5)*3e5).toISOString()}var Gs=class extends q{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=Sc(e.bucketStartMs),o=e.accountRef??"default";n.db.insert(ge).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:[ge.provider,ge.account_ref,ge.limit_window,ge.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:ge.provider,bucket_start:ge.bucket_start,used_percent:ge.used_percent,remaining_percent:ge.remaining_percent,resets_at:ge.resets_at}).from(ge).where(and(eq(ge.limit_window,e.window),gte(ge.bucket_start,e.fromIso),lte(ge.bucket_start,e.toIso))).orderBy(asc(ge.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();le();ae();ue();de();var zs=class extends q{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(Ne).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:[Ne.workspace_id,Ne.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(Ne).where(and(eq(Ne.workspace_id,e.workspaceId),eq(Ne.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(Ne).where(and(eq(Ne.workspace_id,e),eq(Ne.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(Ne).where(eq(Ne.workspace_id,e)).orderBy(desc(Ne.month)).all()}catch(r){throw new l("DB_ERROR","Failed to list usage reports",r)}finally{n.close();}}};h();oe();le();ae();ue();de();var Nc=500,xc=50,Ws=class extends q{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??Nc;}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=De("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??xc,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();le();ae();ue();de();var Lc=50,Vs=class extends q{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=De("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(B).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:B.task_id}).from(B).where(and(eq(B.workspace_id,e),eq(B.agent_id,n))).orderBy(desc(B.created_at)).limit(1).get();if(!o)return [];let s=o.task_id===null?isNull(B.task_id):eq(B.task_id,o.task_id);return r.db.select().from(B).where(and(eq(B.workspace_id,e),eq(B.agent_id,n),s)).orderBy(asc(B.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(B).where(and(eq(B.workspace_id,e),eq(B.agent_id,n),eq(B.task_id,r))).orderBy(asc(B.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(B).where(and(eq(B.workspace_id,e),eq(B.agent_id,n),eq(B.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(B).set(s).where(eq(B.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=Lc){if(!this.dbExists())return [];let o=this.openHandle(false);try{return o.db.select().from(B).where(and(eq(B.workspace_id,e),eq(B.agent_id,n))).orderBy(desc(B.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(B).where(and(eq(B.workspace_id,e),eq(B.agent_id,n),eq(B.status,"dismissed"))).orderBy(desc(B.updated_at)).limit(r).all()}catch(s){throw new l("DB_ERROR","Failed to find dismissed agent suggestions",s)}finally{o.close();}}};export{Vs as AgentSuggestionRepository,ac as BUILTIN_THREAD_STATES,q as BaseSqliteRepository,hr as COMMON_CODE_COLORS,gr as COMMON_CODE_GROUPS,ti as CREWX_JOURNAL_SIZE_LIMIT_BYTES,To as CommonCodeRepository,ee as CommonCodeRepositoryError,Lc as DEFAULT_AGENT_SUGGESTION_LIST_LIMIT,Nc as DEFAULT_NOTIFICATION_CAP,xc as DEFAULT_NOTIFICATION_LIST_LIMIT,Yi as DEFAULT_PROJECT_STAGES,Io as DEFAULT_PROJECT_STAGE_KEYS,ws as DEFAULT_TASK_REAPER_TICK_INTERVAL_MS,Ur as INSTRUCTION_STOP_EPOCH_MISMATCH,_d as INSTRUCTION_STOP_GENERATION_ALREADY_SETTLED,ds as INSTRUCTION_STOP_PROCESS_TERMINATION_FAILED,kd as INSTRUCTION_STOP_REQUEST_FAILED,cs as INSTRUCTION_STOP_SETTLE_CAS_FAILED,md as INSTRUCTION_STOP_TARGET_PID_MISSING,$r as INSTRUCTION_STOP_WORKSPACE_MISMATCH,Zo as LEGACY_TASK_TERMINAL_ERROR_PATTERNS,Ws as NotificationRepository,bo as ProjectRepository,l as RepositoryError,Bs as RequestLogRepository,Fs as SpanRepository,os as TASK_HEARTBEAT_HARD_STALE_MS,ns as TASK_HEARTBEAT_INTERVAL_MS,rs as TASK_HEARTBEAT_STALE_MS,Dd as TASK_LOG_MIGRATION_EVENT_ROW_BYTES,Kr as TASK_LOG_MIGRATION_MIN_FREE_SPACE_BYTES,Pd as TASK_LOG_MIGRATION_TERMINAL_STATUSES,Fr as TASK_STOP_DEFAULT_GRACE_MS,hd as TASK_STOP_DEFAULT_POLL_MS,ps as TASK_STOP_OWNED_PROCESS_MARKERS,Gp as TASK_STOP_POLL_INTERVAL_MS,es as TASK_TERMINAL_STATUSES,gc as THREAD_HIGHLIGHT_DELETION_REASON_REGENERATION_REPLACED,mc as THREAD_HIGHLIGHT_REGENERATION_COMMIT_FAILED,qg as THREAD_HIGHLIGHT_REGENERATION_DETECTION_FAILED,hc as THREAD_HIGHLIGHT_REGENERATION_INTERRUPTED,jg as THREAD_HIGHLIGHT_REGENERATION_NO_ELIGIBLE_TURNS,ic as THREAD_PRIORITIES,Ht as TaskLogRepository,Gr as TaskRepository,qs as ThreadBoxRepository,Tn as ThreadHighlightConflictError,ro as ThreadHighlightRegenerationConflictError,no as ThreadHistoryConflictError,Hs as ThreadHistoryRepository,Ns as ThreadRepository,Wt as ThreadTitleMetadataPatchError,js as ToolCallRepository,zd as USAGE_BACKFILL_MAX_LATE_USAGE_AGE_MS,Yr as USAGE_BACKFILL_TERMINAL_STATUSES,Gs as UsageLimitSnapshotRepository,zs as UsageReportRepository,Ro as WorkspaceRepository,Sc as calcBucketStart,Qd as classifyUsageAccountingReason,dc as customStateLabel,ko as generateCommonCodeId,fn as hasRecordedUsage,Ud as hasSufficientTaskLogMigrationFreeSpace,xg as hasThreadTitleKey,Qn as isThreadPriority,Zn as isThreadState,Mg as matchesThreadTitleFilter,Br as mergeTerminalReason,Ds as mergeThreadTitleMeta,Ct as normalizeTaskStatus,P as openDrizzleDb,Dg as parseThreadPriorityFilter,Lg as parseThreadStateFilter,Sl as pushSchema,Qr as readThreadTitleMeta,Wc as reclaimTemporaryJournal,Fn as resolveTaskHeartbeatHardStaleMs,Hr as resolveTaskHeartbeatIntervalMs,qt as resolveTaskHeartbeatStaleMs,Vr as resolveTaskLogMigrationDbPath,ls as resolveTaskStopMethod,ts as runHeartbeatTick,Jt as runMigrations,K as runMigrationsOnce,Hf as runTaskLogMigration,Eg as runUsageBackfill,Wp as startTaskHeartbeat,fs as stopTask,ld as stopTaskHeartbeat,un as taskHeartbeatRegistry,Uf as taskLogBackupName,a as tasks,Pg as threadTitleSearchHaystack,Vn 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};
|