@crewx/sdk 0.9.0-rc.94 → 0.9.0-rc.96
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/conversation/to-template-messages.d.ts +2 -0
- package/dist/desktop/index.d.ts +1 -0
- package/dist/desktop/index.js +3 -3
- package/dist/esm/desktop/index.js +3 -3
- package/dist/esm/index.js +305 -234
- package/dist/esm/plugins/index.js +119 -88
- package/dist/esm/process/index.js +1 -0
- package/dist/esm/repository/index.js +205 -93
- package/dist/highlight/thread-highlighter.d.ts +24 -24
- package/dist/index.browser.js +3 -3
- package/dist/index.d.ts +17 -4
- package/dist/index.js +306 -235
- package/dist/lifecycle/task-heartbeat.d.ts +41 -0
- package/dist/lifecycle/task-stop.d.ts +30 -0
- package/dist/mcp-app/errors.d.ts +7 -0
- package/dist/mcp-app/index.d.ts +6 -0
- package/dist/mcp-app/projection.d.ts +12 -0
- package/dist/mcp-app/registry.d.ts +7 -0
- package/dist/mcp-app/types.d.ts +165 -0
- package/dist/migrations/0025_task_heartbeat.sql +8 -0
- package/dist/migrations/0025_thread_app_instance_ledger.sql +2 -0
- package/dist/migrations/0026_mcp_action_source.sql +47 -0
- package/dist/migrations/meta/_journal.json +21 -0
- package/dist/plugins/index.d.ts +1 -1
- package/dist/plugins/index.js +119 -88
- package/dist/plugins/sqlite-tracing.d.ts +10 -0
- package/dist/process/index.d.ts +2 -0
- package/dist/process/index.js +1 -0
- package/dist/process/process-control.d.ts +40 -0
- package/dist/repository/index.d.ts +13 -2
- package/dist/repository/index.js +255 -143
- package/dist/repository/task-status.d.ts +14 -0
- package/dist/repository/task.repository.d.ts +69 -8
- package/dist/repository/usage-backfill.d.ts +62 -0
- package/dist/repository/usage-from-logs.d.ts +21 -0
- package/dist/schema/tasks.d.ts +55 -0
- package/dist/schema/ui-instances.d.ts +19 -0
- package/dist/types/index.d.ts +5 -2
- package/dist/ui-instance/index.d.ts +2 -1
- package/dist/ui-instance/store.d.ts +20 -1
- package/dist/ui-instance/types.d.ts +9 -3
- package/dist/utils/runner-env.d.ts +3 -0
- package/package.json +8 -1
- package/templates/agents/default.yaml +16 -10
|
@@ -1,20 +1,28 @@
|
|
|
1
|
-
import*as
|
|
2
|
-
CrewX Version: ${this.version}
|
|
3
|
-
Mode: ${n.mode}
|
|
4
|
-
Agent: ${n.agentRef}
|
|
5
|
-
Started: ${dn(n.timestamp)}
|
|
6
|
-
Message: ${n.message}
|
|
7
|
-
|
|
8
|
-
`;writeFileSync(o,s,{encoding:"utf8",mode:384});}catch{}}),e.on("task:output",n=>{try{let r=this.logFiles.get(n.traceId);if(!r)return;let o=new Date().toISOString();appendFileSync(r,`[${o}] STDOUT: ${n.output}
|
|
9
|
-
`,"utf8");}catch{}}),e.on("task:end",n=>{try{let r=this.logFiles.get(n.traceId);if(!r)return;let o=dn(new Date),s=n.error?`failed: ${n.error.message}`:"completed successfully",i=`[${o}] INFO: Task ${s} in ${n.durationMs}ms
|
|
10
|
-
[${o}] INFO: Process closed with exit code: ${n.error?1:0}
|
|
11
|
-
`;appendFileSync(r,i,"utf8"),this.logFiles.delete(n.traceId);}catch{}}));}detach(e){this.unsubs.forEach(n=>n()),this.unsubs=[],this.logFiles.clear();}};function ts(t){let e=xe.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 or(t){let e=ts(t);return createHash("sha256").update(e).digest("hex")}var p=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);}};var os="[crewx] Refusing to open the real CrewX database from a test process";function ir(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 ss(t,e){let n=ir(t),r=ir(e);return process.platform==="win32"?n.toLowerCase()===r.toLowerCase():n===r}function Ve(t){if((process.env.NODE_ENV==="test"||process.env.VITEST!==void 0)&&ss(t,join(dr.homedir(),".crewx","crewx.db")))throw new Error(`${os}: ${t}. Set CREWX_DB or CREWX_TRACES_DB to an isolated temporary path or :memory:.`);return t}var ne=class{resolveDbPath(){let e=process.env.CREWX_DB||process.env.CREWX_TRACES_DB||join(dr.homedir(),".crewx","crewx.db");return Ve(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 as=32*1024*1024;function L(t,e={}){let n=Ve(t),r=pt("better-sqlite3"),{drizzle:o}=pt("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 = ${as}`),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()}}var lr=new Set,ds={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"};function un(t,e){return (t.get(`SELECT count(*) as cnt FROM sqlite_master WHERE type='table' AND name='${e}'`)?.cnt??0)>0}function ls(t,e){if(e>0||!un(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(ds))r.has(o)||t.run(`ALTER TABLE tasks ADD COLUMN ${o} ${s}`);}var cs={"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"}};function us(t,e,n){if(!un(t,"__drizzle_migrations")||!un(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(xe__default.join(e,"meta/_journal.json"),"utf-8"));for(let i of s.entries){let d=cs[i.tag];if(!d)continue;let l=xe__default.join(e,`${i.tag}.sql`);if(!existsSync(l))continue;let c=readFileSync(l,"utf-8"),u=createHash("sha256").update(c).digest("hex");if(o.has(u))continue;let g=t.all("PRAGMA table_info(tasks)"),f=new Set(g.map(m=>m.name));for(let[m,I]of Object.entries(d))f.has(m)||(t.run(`ALTER TABLE tasks ADD COLUMN ${m} ${I}`),f.add(m));}}function ps(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(xe__default.join(e,"meta/_journal.json"),"utf-8"));for(let i of s.entries){let d=xe__default.join(e,`${i.tag}.sql`);if(!existsSync(d))continue;let l=readFileSync(d,"utf-8"),c=createHash("sha256").update(l).digest("hex");if(o.has(c))continue;let u=/ALTER\s+TABLE\s+[`"]?(\w+)[`"]?\s+ADD\s+[`"]?(\w+)[`"]?/gi,g=[],f;for(;(f=u.exec(l))!==null;)g.push({table:f[1],column:f[2]});if(g.length===0||!l.split(/-->\s*statement-breakpoint/).map(S=>S.trim()).filter(Boolean).every(S=>/^ALTER\s+TABLE\s+.+\s+ADD\s+/i.test(S)))continue;g.every(({table:S,column:v})=>t.all(`PRAGMA table_info("${S}")`).some(j=>j.name===v))&&t.run(n`INSERT INTO __drizzle_migrations (hash, created_at) VALUES (${c}, ${i.when})`);}}function gs(t){let{migrate:e}=pt("drizzle-orm/better-sqlite3/migrator"),{sql:n}=pt("drizzle-orm"),r=[xe__default.join(_,"../migrations"),xe__default.join(_,"migrations"),xe__default.join(_,"../../../../drizzle/migrations"),xe__default.join(process.cwd(),"drizzle/migrations")],o=r.find(c=>existsSync(xe__default.join(c,"meta/_journal.json")));if(!o)throw new Error(`migrations folder not found. Searched:
|
|
1
|
+
import*as _e from'path';import _e__default,{join,dirname,resolve}from'path';import {fileURLToPath}from'url';import {existsSync,mkdirSync,writeFileSync,appendFileSync,realpathSync,readFileSync}from'fs';import Ao,{homedir}from'os';import {createHash,randomBytes,randomUUID}from'crypto';import {sqliteTable,text,integer,index,check,primaryKey,real,uniqueIndex,unique}from'drizzle-orm/sqlite-core';import {sql,or as or$1,eq,isNull,and,desc,inArray,lt as lt$1,notLike,asc,like,gte,isNotNull,ne}from'drizzle-orm';import {spawn}from'child_process';var ea=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 ta=(t,e)=>{for(var n in e)ea(t,n,{get:e[n],enumerable:true});};var oa,sa,w,h=A(()=>{oa=()=>fileURLToPath(import.meta.url),sa=()=>_e__default.dirname(oa()),w=sa();});var f,nt=A(()=>{h();f=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 So(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 ga(t,e){let n=So(t),r=So(e);return process.platform==="win32"?n.toLowerCase()===r.toLowerCase():n===r}function rt(t){if((process.env.NODE_ENV==="test"||process.env.VITEST!==void 0)&&ga(t,join(Ao.homedir(),".crewx","crewx.db")))throw new Error(`${fa}: ${t}. Set CREWX_DB or CREWX_TRACES_DB to an isolated temporary path or :memory:.`);return t}var fa,le,ot=A(()=>{h();fa="[crewx] Refusing to open the real CrewX database from a test process";le=class{resolveDbPath(){let e=process.env.CREWX_DB||process.env.CREWX_TRACES_DB||join(Ao.homedir(),".crewx","crewx.db");return rt(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())}};});function j(t,e={}){let n=rt(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 = ${ma}`),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()}}var ma,ht=A(()=>{h();ot();ma=32*1024*1024;});function cr(t,e){return (t.get(`SELECT count(*) as cnt FROM sqlite_master WHERE type='table' AND name='${e}'`)?.cnt??0)>0}function ka(t,e){if(e>0||!cr(t,"tasks"))return;let n=t.all("PRAGMA table_info(tasks)"),r=new Set(n.map(o=>o.name));for(let[o,s]of Object.entries(_a))r.has(o)||t.run(`ALTER TABLE tasks ADD COLUMN ${o} ${s}`);}function wa(t,e,n){if(!cr(t,"__drizzle_migrations")||!cr(t,"tasks"))return;let r=t.all(n`SELECT hash FROM __drizzle_migrations`),o=new Set(r.map(i=>i.hash)),s=JSON.parse(readFileSync(_e__default.join(e,"meta/_journal.json"),"utf-8"));for(let i of s.entries){let d=Ta[i.tag];if(!d)continue;let u=_e__default.join(e,`${i.tag}.sql`);if(!existsSync(u))continue;let c=readFileSync(u,"utf-8"),l=createHash("sha256").update(c).digest("hex");if(o.has(l))continue;let p=t.all("PRAGMA table_info(tasks)"),g=new Set(p.map(m=>m.name));for(let[m,I]of Object.entries(d))g.has(m)||(t.run(`ALTER TABLE tasks ADD COLUMN ${m} ${I}`),g.add(m));}}function ya(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(_e__default.join(e,"meta/_journal.json"),"utf-8"));for(let i of s.entries){let d=_e__default.join(e,`${i.tag}.sql`);if(!existsSync(d))continue;let u=readFileSync(d,"utf-8"),c=createHash("sha256").update(u).digest("hex");if(o.has(c))continue;let l=/ALTER\s+TABLE\s+[`"]?(\w+)[`"]?\s+ADD\s+[`"]?(\w+)[`"]?/gi,p=[],g;for(;(g=l.exec(u))!==null;)p.push({table:g[1],column:g[2]});if(p.length===0||!u.split(/-->\s*statement-breakpoint/).map(y=>y.trim()).filter(Boolean).every(y=>/^ALTER\s+TABLE\s+.+\s+ADD\s+/i.test(y)))continue;p.every(({table:y,column:k})=>t.all(`PRAGMA table_info("${y}")`).some(L=>L.name===k))&&t.run(n`INSERT INTO __drizzle_migrations (hash, created_at) VALUES (${c}, ${i.when})`);}}function Ea(t,e){let{sql:n}=gt("drizzle-orm"),r=JSON.parse(readFileSync(_e__default.join(e,"meta/_journal.json"),"utf-8")),s=["0025_task_heartbeat","0025_thread_app_instance_ledger","0026_mcp_action_source"].map(i=>{let d=r.entries.find(c=>c.tag===i);if(!d)throw new Error(`Missing release/App compatibility migration: ${i}`);let u=readFileSync(_e__default.join(e,`${i}.sql`),"utf-8");return {entry:d,content:u,hash:createHash("sha256").update(u).digest("hex")}});t.transaction(i=>{let d=new Set(i.all(n`SELECT hash FROM __drizzle_migrations`).map(u=>u.hash));if(d.has(s[0].hash)){for(let u of s.slice(1))if(!d.has(u.hash)){for(let c of u.content.split(/-->\s*statement-breakpoint/).filter(l=>l.trim()))i.run(n.raw(c));i.run(n`INSERT INTO __drizzle_migrations (hash, created_at) VALUES (${u.hash}, ${u.entry.when})`);}}},{behavior:"immediate"});}function Ra(t){let{migrate:e}=gt("drizzle-orm/better-sqlite3/migrator"),{sql:n}=gt("drizzle-orm"),r=[_e__default.join(w,"../migrations"),_e__default.join(w,"migrations"),_e__default.join(w,"../../../../drizzle/migrations"),_e__default.join(process.cwd(),"drizzle/migrations")],o=r.find(c=>existsSync(_e__default.join(c,"meta/_journal.json")));if(!o)throw new Error(`migrations folder not found. Searched:
|
|
12
2
|
${r.join(`
|
|
13
|
-
`)}`);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),ls(t,i),s?.cnt&&(ps(t,o,n),us(t,o,n)),e(t,{migrationsFolder:o});let l=(t.get(n`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0)-i;if(l>0){let c=s?.cnt?"Database migrated":"Database initialized";console.error(`[crewx] ${c} (${l} migration${l>1?"s":""} applied).`);}}function he(t,e){lr.has(e)||(gs(t),lr.add(e));}var et=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=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"),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_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 me=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 Rs="json_extract(metadata, '$.threadTitle.state')",Is="json_extract(metadata, '$.threadTitle.priority')",h=sqliteTable("threads",{id:text("id").primaryKey(),workspace_id:text("workspace_id").references(()=>et.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(Rs)),idx_threads_workspace_thread_priority:index("idx_threads_workspace_thread_priority").on(t.workspace_id,sql.raw(Is))}));var xs=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(()=>xs.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)}));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)}));sqliteTable("thread_boxes",{id:text("id").primaryKey(),thread_id:text("thread_id").notNull().references(()=>h.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)}));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)}));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)}));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)}));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`)}));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]})}));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)}));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(),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`),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)}));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')`),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`(
|
|
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),ka(t,i),s?.cnt&&(Ea(t,o),ya(t,o,n),wa(t,o,n)),e(t,{migrationsFolder:o});let u=(t.get(n`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0)-i;if(u>0){let c=s?.cnt?"Database migrated":"Database initialized";console.error(`[crewx] ${c} (${u} migration${u>1?"s":""} applied).`);}}function be(t,e){vo.has(e)||(Ra(t),vo.add(e));}var vo,_a,Ta,_t=A(()=>{h();vo=new Set,_a={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"};Ta={"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 kt,fr=A(()=>{h();kt=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,Ht=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"),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 Oe,Oo=A(()=>{h();Ht();Oe=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 Da,Pa,_,yn=A(()=>{h();fr();Da="json_extract(metadata, '$.threadTitle.state')",Pa="json_extract(metadata, '$.threadTitle.priority')",_=sqliteTable("threads",{id:text("id").primaryKey(),workspace_id:text("workspace_id").references(()=>kt.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(Da)),idx_threads_workspace_thread_priority:index("idx_threads_workspace_thread_priority").on(t.workspace_id,sql.raw(Pa))}));});var Ha,Do=A(()=>{h();Ht();Ha=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(()=>Ha.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 Po=A(()=>{h();Ht();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 Mo=A(()=>{h();yn();sqliteTable("thread_boxes",{id:text("id").primaryKey(),thread_id:text("thread_id").notNull().references(()=>_.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 $o=A(()=>{h();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 Fo=A(()=>{h();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 Bo=A(()=>{h();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 Wo=A(()=>{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`)})),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 zo=A(()=>{h();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 Vo=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)}));});var Jo=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`(
|
|
14
4
|
(${t.status} = 'requested' AND ${t.after_revision} IS NULL AND ${t.outcome} IS NULL AND ${t.settled_at} IS NULL)
|
|
15
5
|
OR
|
|
16
6
|
(${t.status} = 'settled' AND ${t.after_revision} IS NOT NULL AND ${t.outcome} IS NOT NULL AND ${t.settled_at} IS NOT NULL)
|
|
17
|
-
)`),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 Rr=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`)}));sqliteTable("project_criteria",{id:text("id").primaryKey().notNull(),project_id:text("project_id").notNull().references(()=>Rr.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)}));sqliteTable("project_events",{id:text("id").primaryKey().notNull(),project_id:text("project_id").notNull().references(()=>Rr.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 yn=["THREAD_STATE","THREAD_PRIORITY"],Tn=["gray","blue","violet","green","amber","orange","red","pink"],k=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 Ir=["thread.snapshot.imported","thread.title.changed","thread.priority.changed","thread.state.changed","thread.highlight.created","thread.highlight.updated","thread.highlight.deleted","thread.highlights.regenerated"],vr=["user","agent","system"],Ar=["auto","manual"],xr=["decision","judgment","issue","result","pivot"];var Sr=["queued","running","completed","failed"],C=sqliteTable("thread_events",{id:text("id").primaryKey().notNull(),thread_id:text("thread_id").notNull().references(()=>h.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)})),x=sqliteTable("thread_highlight_runs",{id:text("id").primaryKey().notNull(),thread_id:text("thread_id").notNull().references(()=>h.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)})),R=sqliteTable("thread_highlights",{id:text("id").primaryKey().notNull(),thread_id:text("thread_id").notNull().references(()=>h.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'`)}));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()});function br(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 Lr(t,e){let n=e===void 0?"":` at index ${e}`;if(!t||typeof t!="object")throw new p("VALIDATION",`Task log entry${n} must be an object`);if(typeof t.timestamp!="string"||typeof t.level!="string"||typeof t.message!="string")throw new p("VALIDATION",`Task log entry${n} must contain string timestamp, level, and message fields`);return {timestamp:t.timestamp,level:t.level,message:t.message}}function Dr(t,e){if(e===null||e.trim()==="")return [];let n;try{n=JSON.parse(e);}catch(r){throw new p("DB_ERROR",`Malformed legacy task logs: ${t}`,r)}if(!Array.isArray(n))throw new p("DB_ERROR",`Malformed legacy task logs: ${t} (expected an array)`);try{return n.map((r,o)=>Lr(r,o))}catch(r){throw r instanceof p?new p("DB_ERROR",`Malformed legacy task logs: ${t}`,r):r}}function Mr(t){if(t.log_storage!=="blob"&&t.log_storage!=="events")throw new p("DB_ERROR",`Invalid task log storage for task: ${t.id}`);if(!Number.isInteger(t.last_log_seq)||t.last_log_seq<0)throw new p("DB_ERROR",`Invalid task log sequence for task: ${t.id}`);if(!Number.isInteger(t.log_revision)||t.log_revision<0)throw new p("DB_ERROR",`Invalid task log revision for task: ${t.id}`);return t.log_storage}function Pr(t){return {taskId:t.id,source:Mr(t),revision:t.log_revision,lastSeq:t.last_log_seq}}function ii(t){if(!Number.isInteger(t)||t<0)throw new p("VALIDATION","Task log tail limit must be a non-negative integer")}var Bt=class extends ne{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?Ve(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 p("NOT_FOUND","Database not found");let r=L(n);if(e)try{he(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 p("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)=>Lr(s,i));if(r.length===0){let s=this.getLogState(e);if(!s)throw new p("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),l=Mr(d);if(l==="blob"){let f=Dr(e,d.logs);if(i.update(a).set({logs:JSON.stringify([...f,...r]),log_revision:sql`${a.log_revision} + 1`}).where(eq(a.id,e)).run().changes!==1)throw new p("NOT_FOUND",`Task not found: ${e}`);return {taskId:e,source:l,revision:d.log_revision+1,lastSeq:d.last_log_seq}}let c=d.last_log_seq+1,u=d.last_log_seq+r.length;if(i.insert(me).values(r.map((f,m)=>({task_id:e,seq:c+m,timestamp:f.timestamp,level:f.level,message:f.message}))).run(),i.update(a).set({last_log_seq:u,log_revision:sql`${a.log_revision} + 1`}).where(eq(a.id,e)).run().changes!==1)throw new p("NOT_FOUND",`Task not found: ${e}`);return {taskId:e,source:l,revision:d.log_revision+1,lastSeq:u}},{behavior:"immediate"})}catch(s){throw s instanceof p?s:new p("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?Pr(r):void 0}catch(r){throw r instanceof p?r:new p("DB_ERROR","Failed to read task log state",r)}finally{n.close();}}readLogs(e){return this.readLogsInternal(e)}readLogsTail(e,n){return ii(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=Pr(s);if(i.source==="blob"){let u=Dr(e,s.logs);return {...i,entries:n===void 0?u:u.slice(Math.max(0,u.length-n))}}let d=o.select({seq:me.seq,timestamp:me.timestamp,level:me.level,message:me.message}).from(me).where(eq(me.task_id,e)).orderBy(n===void 0?asc(me.seq):desc(me.seq)),c=(n===void 0?d.all():d.limit(n).all()).map(({timestamp:u,level:g,message:f})=>({timestamp:u,level:g,message:f}));return n!==void 0&&c.reverse(),{...i,entries:c}},{behavior:"deferred"})}catch(o){throw o instanceof p?o:new p("DB_ERROR","Failed to read task logs",o)}finally{r.close();}}};var Rn=40,Ne="2026-05-09",pi="0.8.9-rc.13",De=10,Pe=parseInt(pi.split("rc.")[1]);function $r(){let t=sql`
|
|
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 Yo,Qo=A(()=>{h();Yo=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`)})),sqliteTable("project_criteria",{id:text("id").primaryKey().notNull(),project_id:text("project_id").notNull().references(()=>Yo.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)})),sqliteTable("project_events",{id:text("id").primaryKey().notNull(),project_id:text("project_id").notNull().references(()=>Yo.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,S,Er=A(()=>{h();wr=["THREAD_STATE","THREAD_PRIORITY"],yr=["gray","blue","violet","green","amber","orange","red","pink"],S=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 Zo,es,ts,ns,rs,U,M,N,os=A(()=>{h();yn();Zo=["thread.snapshot.imported","thread.title.changed","thread.priority.changed","thread.state.changed","thread.highlight.created","thread.highlight.updated","thread.highlight.deleted","thread.highlights.regenerated"],es=["user","agent","system"],ts=["auto","manual"],ns=["decision","judgment","issue","result","pivot"],rs=["queued","running","completed","failed"],U=sqliteTable("thread_events",{id:text("id").primaryKey().notNull(),thread_id:text("thread_id").notNull().references(()=>_.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)})),M=sqliteTable("thread_highlight_runs",{id:text("id").primaryKey().notNull(),thread_id:text("thread_id").notNull().references(()=>_.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)})),N=sqliteTable("thread_highlights",{id:text("id").primaryKey().notNull(),thread_id:text("thread_id").notNull().references(()=>_.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 is=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 wt=A(()=>{h();fr();Ht();Oo();yn();Do();Po();Mo();$o();Fo();Bo();Wo();zo();Vo();Jo();Qo();Er();os();is();});var yt,Sr,as,Ir=A(()=>{h();yt={"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}},Sr=new Set(["gpt-5.3-codex-spark"]),as=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 Ar(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 ld(t){if(!t)return console.warn("[pricing] missing model id; cost is being recorded as 0"),Ft;let e=Ar(t),n=cd[e];if(n)return bn[n]??yt[n]??Ft;if(bn[e])return bn[e];if(yt[e])return yt[e];if(Sr.has(e))return console.warn(`[pricing] unpublished model pricing: ${t}, cost_usd=0`),Ft;if(as.has(e))return console.warn(`[pricing] missing catalog pricing: ${t}, cost_usd=0`),Ft;let r={...yt,...bn};for(let o of Object.keys(r))if(e.includes(o))return r[o];return console.warn(`[pricing] Unknown model: ${t}, cost_usd=0`),Ft}function pd(t,e,n,r=0,o){let s=ld(n),i=Math.min(r,t),u=(t-i)*s.input/1e6,c=i*s.cachedInput/1e6,l=e*s.output/1e6;return u+c+l}function ds(t,e,n,r,o,s){return t&&t>0?t:!e&&!n?0:pd(e??0,n??0,o,r??0)}var cd,Ft,bn,xn=A(()=>{h();Ir();Ir();cd={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"},Ft={input:0,cachedInput:0,output:0},bn={};});function ps(t){return t instanceof Error?t:t===void 0?void 0:new Error(String(t))}function cs(t){return typeof t=="object"&&t!==null&&"code"in t?String(t.code):void 0}function fs(t){return Number.isSafeInteger(t)&&t>0}function _d(t,e){return new Promise(n=>{let r;try{r=spawn(t,e,{windowsHide:!0});}catch(c){n({status:null,stdout:"",stderr:"",error:ps(c)});return}let o="",s="",i=false,d,u=setTimeout(()=>{try{r.kill();}catch{}d({status:null,stdout:o,stderr:s,error:new Error(`Command timed out after ${us}ms`)});},us);d=c=>{i||(i=true,clearTimeout(u),n(c));},r.stdout?.setEncoding("utf8"),r.stderr?.setEncoding("utf8"),r.stdout?.on("data",c=>{o+=String(c);}),r.stderr?.on("data",c=>{s+=String(c);}),r.once("error",c=>{d({status:null,stdout:o,stderr:s,error:c});}),r.once("close",c=>{d({status:c,stdout:o,stderr:s});});})}async function gs(t,e,n){return n.runCommandAsync?n.runCommandAsync(t,e):n.runCommand?n.runCommand(t,e):_d(t,e)}function kd(t){return new Promise(e=>{setTimeout(e,Math.max(0,t));})}function Td(){return new Promise(t=>{setImmediate(t);})}function at(t,e=process.kill){try{return e(t,0),"alive"}catch(n){return cs(n)==="ESRCH"?"not_found":cs(n)==="EPERM"?"alive":"unknown"}}function wd(t,e){let n=at(-t,e),r=at(t,e);return n==="alive"||r==="alive"?"alive":n==="unknown"||r==="unknown"?"unknown":"not_found"}async function hs(t,e,n,r){let o=Math.max(0,n),s=Math.max(1,r.pollIntervalMs??hd),i=Date.now()+o,d,u=o===0,c=r.sleep?Promise.resolve().then(()=>r.sleep(o)).then(()=>{},()=>{}):new Promise(l=>{d=setTimeout(l,o);});c.then(()=>{u=true;});try{for(await Td();;){let l=wd(t,e);if(l==="not_found")return l;let p=i-Date.now();if(u||p<=0)return l;await Promise.race([c,kd(Math.min(s,p))]);}}finally{d!==void 0&&clearTimeout(d);}}async function ls(t,e,n,r,o){let s=await hs(t,e,o.hardConfirmMs??md,{...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 ms(t,e,n={}){if(!fs(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 gs(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 u=r==="win32"?d.toLowerCase():d;return e.filter(l=>l.trim().length>0).some(l=>{let p=r==="win32"?l.toLowerCase():l;return u.includes(p)})?"owned":"not_owned"}async function On(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(!fs(t))return o("Invalid process ID");let s=e.kill??process.kill,i=at(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 gs("taskkill",["/PID",String(t),"/T","/F"],e);}catch(I){g={status:null,stdout:"",stderr:"",error:ps(I)};}let m=at(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,u=e.signal??"SIGKILL";try{s(-t,u);}catch(g){d=g;}if(u==="SIGKILL")return ls(t,s,d,r,e);if(await hs(t,s,e.graceMs??gd,e)==="not_found")return d?{status:"not_found",pid:t,method:r}:{status:"terminated",pid:t,method:r};let l;try{s(-t,"SIGKILL");}catch(g){l=g;}let p=await ls(t,s,l,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 us,gd,hd,md,Cn=A(()=>{h();us=3e3,gd=2e3,hd=25,md=100;});function ys(t,e){let n=e===void 0?"":` at index ${e}`;if(!t||typeof t!="object")throw new f("VALIDATION",`Task log entry${n} must be an object`);if(typeof t.timestamp!="string"||typeof t.level!="string"||typeof t.message!="string")throw new f("VALIDATION",`Task log entry${n} must contain string timestamp, level, and message fields`);return {timestamp:t.timestamp,level:t.level,message:t.message}}function Ts(t,e){if(e===null||e.trim()==="")return [];let n;try{n=JSON.parse(e);}catch(r){throw new f("DB_ERROR",`Malformed legacy task logs: ${t}`,r)}if(!Array.isArray(n))throw new f("DB_ERROR",`Malformed legacy task logs: ${t} (expected an array)`);try{return n.map((r,o)=>ys(r,o))}catch(r){throw r instanceof f?new f("DB_ERROR",`Malformed legacy task logs: ${t}`,r):r}}function Es(t){if(t.log_storage!=="blob"&&t.log_storage!=="events")throw new f("DB_ERROR",`Invalid task log storage for task: ${t.id}`);if(!Number.isInteger(t.last_log_seq)||t.last_log_seq<0)throw new f("DB_ERROR",`Invalid task log sequence for task: ${t.id}`);if(!Number.isInteger(t.log_revision)||t.log_revision<0)throw new f("DB_ERROR",`Invalid task log revision for task: ${t.id}`);return t.log_storage}function ws(t){return {taskId:t.id,source:Es(t),revision:t.log_revision,lastSeq:t.last_log_seq}}function Ad(t){if(!Number.isInteger(t)||t<0)throw new f("VALIDATION","Task log tail limit must be a non-negative integer")}var Nn,Rs=A(()=>{h();ot();ht();_t();nt();wt();Nn=class extends le{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?rt(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 f("NOT_FOUND","Database not found");let r=j(n);if(e)try{be(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 f("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)=>ys(s,i));if(r.length===0){let s=this.getLogState(e);if(!s)throw new f("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),u=Es(d);if(u==="blob"){let g=Ts(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 f("NOT_FOUND",`Task not found: ${e}`);return {taskId:e,source:u,revision:d.log_revision+1,lastSeq:d.last_log_seq}}let c=d.last_log_seq+1,l=d.last_log_seq+r.length;if(i.insert(Oe).values(r.map((g,m)=>({task_id:e,seq:c+m,timestamp:g.timestamp,level:g.level,message:g.message}))).run(),i.update(a).set({last_log_seq:l,log_revision:sql`${a.log_revision} + 1`}).where(eq(a.id,e)).run().changes!==1)throw new f("NOT_FOUND",`Task not found: ${e}`);return {taskId:e,source:u,revision:d.log_revision+1,lastSeq:l}},{behavior:"immediate"})}catch(s){throw s instanceof f?s:new f("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?ws(r):void 0}catch(r){throw r instanceof f?r:new f("DB_ERROR","Failed to read task log state",r)}finally{n.close();}}readLogs(e){return this.readLogsInternal(e)}readLogsTail(e,n){return Ad(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=ws(s);if(i.source==="blob"){let l=Ts(e,s.logs);return {...i,entries:n===void 0?l:l.slice(Math.max(0,l.length-n))}}let d=o.select({seq:Oe.seq,timestamp:Oe.timestamp,level:Oe.level,message:Oe.message}).from(Oe).where(eq(Oe.task_id,e)).orderBy(n===void 0?asc(Oe.seq):desc(Oe.seq)),c=(n===void 0?d.all():d.limit(n).all()).map(({timestamp:l,level:p,message:g})=>({timestamp:l,level:p,message:g}));return n!==void 0&&c.reverse(),{...i,entries:c}},{behavior:"deferred"})}catch(o){throw o instanceof f?o:new f("DB_ERROR","Failed to read task logs",o)}finally{r.close();}}};});var Ss=A(()=>{h();});var Q,jt=A(()=>{h();Q=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 Be,vr=A(()=>{h();jt();Be=class extends Q{name="RateLimitError";constructor(e,n="cli/claude"){super(e,n,{code:"QUOTA_EXHAUSTED",kind:"transient"});}};});function Pe(t){return /crewx\s+(q|query|x|execute)\s/.test(t)}function Le(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 Et=A(()=>{h();});function xd(t){let e=Od(t),n=e.map((s,i)=>({line:s,index:i})).filter(({line:s})=>Nd(s.value)),r=Cd(e);return {result:n.length===1&&n[0].index===r?Dd(n[0].line.value):null,resultPreview:Md(e,n),hasReservedLine:n.length>0}}function je(t,e){let n=xd(t);return {resultPreview:n.resultPreview,isError:e||n.result?.isError===true,...n.hasReservedLine?{delegationResult:n.result}:{}}}function Od(t){let e=[],n=0;for(let r=0;r<t.length;r++){let o=t[r];if(o!==`
|
|
8
|
+
`&&o!=="\r")continue;let s=o==="\r"&&t[r+1]===`
|
|
9
|
+
`?`\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 Cd(t){for(let e=t.length-1;e>=0;e--)if(t[e].value.trim())return e;return -1}function Nd(t){return t.trimStart().startsWith(vd)}function Dd(t){let e=t.trim();if(!e.startsWith(Is)||!e.endsWith("]]"))return null;let n=e.slice(Is.length,-2);if(!n)return null;try{return Pd(JSON.parse(n))}catch{return null}}function Pd(t){return Ld(t)?Object.prototype.hasOwnProperty.call(t,"taskId")?{schema:1,taskId:t.taskId,agentId:t.agentId,isError:t.isError}:{schema:1,isError:true}:null}function Ld(t){if(!Hd(t)||Object.keys(t).some(r=>!bd.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?As(t.taskId)&&As(t.agentId):t.isError===true}function Md(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 As(t){return typeof t=="string"&&t.trim().length>0}function Hd(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Is,vd,bd,Wt=A(()=>{h();Is="[[crewx:delegation-result ",vd="[[crewx:delegation-result",bd=new Set(["schema","taskId","agentId","isError"]);});function Me(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 Rt=A(()=>{h();});var vs,Dn,br,Pn=A(()=>{h();vs=["none","minimal","low","medium","high","xhigh","max","ultra"],Dn={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"]},br={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(br).map(([t,e])=>[t,e.models]));});function xr(t){return Ud[t]??t}function Fd(t){return qd.get(t)??t}function Or(t){if(!t)return {};let e=jd.get(t);return e?{...e}:{model:t}}function Cr(t,e){return t==="antigravity"||t==="cli/antigravity"?Or(e):e===void 0?{}:{model:Fd(e)}}var $d,Ud,qd,Bd,jd,Gt=A(()=>{h();$d=[{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]"}],Ud={"accept-edits":"acceptEdits",yolo:"bypassPermissions","agent-full-access":"bypassPermissions"};qd=new Map($d.map(({baseModelId:t,catalogModelId:e})=>[t,e]));Bd=[{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"}],jd=new Map(Bd.map(({legacyId:t,model:e,effort:n})=>[t,n===void 0?{model:e}:{model:e,effort:n}]));});function Gd(){return {models:[],modes:[],effort:[],modelOverrides:{},providerOptions:[]}}function Qe(t){return Ln(t).models}function Ln(t){return Wd[t]??br[t]??Gd()}function zt(t,e){let n=Ln(t);if(e){if(Object.prototype.hasOwnProperty.call(n.modelOverrides,e))return n.modelOverrides[e]?.effort??n.effort;let r=Cr(t,e);return r.model===void 0?n.effort:n.modelOverrides[r.model]?.effort??n.effort}return n.effort}function bs(t){return Ln(t).modelOverrides}function xs(){return Qe("claude")}function Os(){return Qe("codex")}function Cs(){return Qe("copilot")}function Ns(){return Qe("antigravity")}var Wd,dt=A(()=>{h();Pn();xn();Gt();Wd={};});function Ds(t){return zd[t]??t}var zd,Ps=A(()=>{h();dt();Gt();zd={auto:"default"};});function Mn(t,e){return (Dn[t]??[]).includes(e)}function Ze(t){if(!t)return {};let e=t.match(/^(.+?)\[([^\]]+)\]$/);if(e){let n=e[2].toLowerCase();return Vd.has(n)?{model:e[1],effort:n}:{model:t}}return {model:t}}function Ls(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 Ms(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 Hs(t){return !t||!Mn("codex",t)?[]:["-c",`model_reasoning_effort=${t}`]}function $s(t){if(!t)return [];let e=new Set(["acceptEdits","bypassPermissions","default","delegate","dontAsk","plan"]),n=Ds(t);return e.has(n)?["--permission-mode",n]:[]}function Us(t){return t?Mn("claude",t)?["--effort",t]:[]:[]}function qs(t){return t==="default"?[]:t&&Kd.has(t)?["--permission-mode",t]:[]}function Fs(t){return t===true?["--always-approve"]:[]}function Bs(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 js(t){return t?Mn("grok",t)?["--effort",t]:[]:[]}function Ws(t){if(!t)return [];switch(xr(t)){case "default":return [];case "plan":return ["--mode","plan"];case "acceptEdits":return ["--mode","accept-edits"];case "bypassPermissions":return ["--dangerously-skip-permissions"];default:return []}}function Gs(t){return t?Mn("antigravity",t)?["--effort",t]:[]:[]}var Vd,Kd,Vt=A(()=>{h();Ps();Gt();Pn();Vd=new Set(vs);Kd=new Set(["default","acceptEdits","auto","dontAsk","bypassPermissions","plan"]);});function Jd(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 Xd(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,u=i!==void 0?i:d??0;return {inputTokens:i!==void 0?r+i:r,outputTokens:o,cachedInputTokens:u}}function Yd(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 zs(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,u=d?.id,c=d?.usage;if(typeof u!="string"||!c)continue;let l=Number(c.input_tokens??0),p=Number(c.cache_read_input_tokens??0);e.set(u,{inputTokens:l+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 St(t){if(!t||!t.trim())return;let e=null,n=null;for(let r of t.split(`
|
|
12
|
+
`))if(r.trim())try{let o=JSON.parse(r),s=Yd(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=Jd(o)??Xd(o);i&&(e=i);}catch{}return n||(e??void 0)}var Kt=A(()=>{h();});function Ee(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 Vs(t){let e=t.split(`
|
|
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 Zd(t){let n=t.message?.content;return Array.isArray(n)?n.map(r=>typeof r.text=="string"?r.text.trim():"").filter(Boolean).join(`
|
|
14
|
+
|
|
15
|
+
`):""}function eu(t){let e=t.toLowerCase();return e.includes("out of extra usage")||e.includes("rate limit")||e.includes("quota")}function tu(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=Me(s);return r==="Bash"&&Pe(i)?Le(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(`
|
|
16
|
+
`):i=JSON.stringify(s),{timestamp:t,type:"tool_result",toolUseId:o,...je(i,r)}}return null}var Qd,Nr,Dr=A(()=>{h();vr();Et();Wt();Rt();Vt();dt();Kt();ut();Qd=new Set(["tool_progress"]);Nr={command:"claude",meta:{displayName:"Claude",models:xs(),capabilities:{resume:true}},buildArgs(t,e,n){let{model:r,effort:o}=Ze(e.model),s=e.effort??o,i=$s(e.mode),d=Us(s),u=r?["--model",r]:[],c=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",...c,...i,...d,...u,...p],stdinMessage:t}:{args:["--output-format","stream-json","--verbose",...c,...i,...d,...u,...p],stdinMessage:t}}return {args:["-p","--output-format","stream-json","--verbose",...c,...i,...d,...u],stdinMessage:t}},extractText(t){return Vs(t)??t.trim()},extractPartialText(t){return Vs(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 Be(`Claude rate limit: ${n.rateLimitType??"unknown"} (status: ${n.status})`)}if(e.error==="rate_limit"){let n=Zd(e);return new Be(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(eu(n))return new Be(`Claude rate limit: ${n}`)}}catch{}return null},parseResultMeta(t){let e=t.split(`
|
|
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,u=d?Object.keys(d)[0]??null:null;return {usage:i,model:u}}}catch{}let n=zs(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=Ee(n,e??new Date().toISOString()),d=[];for(let u of s){let c=tu(i,u);c&&d.push(c);}return d},suppressOutputLine(t){let e=t.trim();if(!e.startsWith("{")||!e.endsWith("}"))return false;try{let r=JSON.parse(e).type;return r?Qd.has(r):!1}catch{return false}}};});function Ks(t){let e=t.split(`
|
|
18
|
+
`).filter(o=>o.trim()),n=[],r=null;for(let o of e)try{let s=JSON.parse(o);if(s.type==="assistant.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 nu,Pr,Lr=A(()=>{h();Kt();Et();Rt();Wt();dt();Pn();ut();nu=new Set(["interactive","plan","autopilot"]);Pr={command:"copilot",meta:{displayName:"Copilot",models:Cs()},buildArgs(t,e,n){let r=e.additionalArgs?[...e.additionalArgs]:[];return e.model&&r.push("--model",e.model),e.mode&&nu.has(e.mode)&&r.push("--mode",e.mode),e.effort&&(Dn.copilot??[]).includes(e.effort)&&r.push("--effort",e.effort),{args:r,stdinMessage:t}},extractText(t){return Ks(t)??t.trim()},extractPartialText(t){return Ks(t)},parseResultMeta(t){let e=St(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=Ee(n,e??new Date().toISOString()),i=o.toolCallId;if(r==="tool.execution_start"){let d=String(o.toolName||""),u=o.arguments,c=Me(u);return (d==="bash"||d==="Bash")&&Pe(c)?[Le(s,c,i)]:[{timestamp:s,type:"tool_use",toolName:d,toolInput:c,...i&&{toolUseId:i}}]}if(r==="tool.execution_complete"){let d=o.error;if(d)return [{timestamp:s,type:"tool_result",...i&&{toolUseId:i},...je(String(d.message||""),true)}];let u=o.result,c=String(u?.content||"");return [{timestamp:s,type:"tool_result",...i&&{toolUseId:i},...je(c,false)}]}if(r==="assistant.message"){let d=String(o.content||"");return d?[{timestamp:s,type:"text",content:d}]:[]}return []}};});function ou(t){let e=[],n=0,r=false,o=false,s=0;for(let d=0;d<t.length;d++){let u=t[d];if(o){o=false;continue}if(u==="\\"&&r){o=true;continue}if(u==='"'){r=!r;continue}if(!r){if(u==="{")n++;else if(u==="}"&&(n--,n===0)){let c=t.slice(s,d+1).trim();c&&e.push(c),s=d+1;}}}let i=t.slice(s).trim();return i&&e.push(i),e}function su(t){return t[0]==="exec"?t.slice(1):t}function Js(t){let e=t.split(`
|
|
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 iu(t,e){let n=e.type;if(n==="command_execution"){let r=String(e.command||"");return Pe(r)?[Le(t,r)]:[{timestamp:t,type:"tool_use",toolName:"Bash",toolInput:r}]}return n==="web_search"?[]:n==="file_change"?[]:[]}function au(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=du(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",...je(r,o)}}if(n==="tool_use"){let r=String(e.name||e.tool_name||""),o=e.input,s=Me(o);return r==="Bash"&&Pe(s)?Le(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",...je(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 du(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=Me(o);return r==="Bash"&&Pe(s)?Le(t,s):{timestamp:t,type:"tool_use",toolName:r,toolInput:s}}return null}var ru,Mr,Hr=A(()=>{h();Kt();Et();Rt();Wt();Vt();dt();ut();ru=new Set(["turn.started","turn.completed","item.updated"]);Mr={command:"codex",meta:{displayName:"Codex",models:Os(),capabilities:{resume:true}},buildArgs(t,e,n){let{model:r,effort:o}=Ze(e.model),s=e.effort??o,i=e.resumeSessionId?Ms(e.mode):Ls(e.mode),d=Hs(s),u=r?["-m",r]:[],c=su(e.additionalArgs??[]),p=c.includes("--json")||c.includes("--experimental-json")?[]:["--json"];return e.resumeSessionId?{args:["exec","resume",...p,...i,...d,...u,...c,e.resumeSessionId,"-"],stdinMessage:t}:{args:["exec",...p,...i,...d,...u,...c],stdinMessage:t}},extractText(t){return Js(t)??t.trim()},extractPartialText(t){return Js(t)},parseResultMeta(t){let e=St(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=ou(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 u=Ee(i,n),c=i.item;if(c){if(d==="item.started"){r.push(...iu(u,c));continue}if(d==="item.completed"){let l=au(u,c);l&&r.push(l);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?ru.has(r):!1}catch{return false}}};});function lu(t){return t?cu[t]??{agent:"build",autoApprove:false}:{agent:void 0,autoApprove:false}}function Hn(t,e){return t.some(n=>n===e||n.startsWith(`${e}=`))}function ei(t){let e=[],n=0,r=false,o=false,s=0;for(let d=0;d<t.length;d++){let u=t[d];if(o){o=false;continue}if(u==="\\"&&r){o=true;continue}if(u==='"'){r=!r;continue}if(!r){if(u==="{")n++;else if(u==="}"&&(n--,n===0)){let c=t.slice(s,d+1).trim();c&&e.push(c),s=d+1;}}}let i=t.slice(s).trim();return i&&e.push(i),e}function At(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function pu(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);At(i)?e.push(i):n=!0;continue}catch{}let s=ei(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);At(d)?e.push(d):n=!0;}catch{n=true;}}return {events:e,malformed:n}}function ct(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,Zs).trim()}function ti(t){let e=At(t.error)?t.error:void 0,n=e&&At(e.data)?e.data:void 0,r=ct(e?.name),o=ct(n?.message)??ct(e?.message)??ct(t.message)??ct(t.errorMessage)??ct(t.error),s=ct(t.ref),i=r&&o&&r!==o?`${r}: ${o}`:r??o??Qs;return (s?`${i} (ref: ${s})`:i).slice(0,Zs)}function Xs(t){let e=pu(t),n=[],r=null,o=0,s=[],i,d=false;for(let u of e.events){let c=typeof u.type=="string"?u.type:void 0;if(c){if(c==="text"){let l=At(u.part)?u.part:void 0,p=typeof l?.text=="string"?l.text:void 0;p?.trim()&&n.push(p.trim());continue}if(c==="result"){typeof u.result=="string"&&(r=u.result);continue}if(c==="tool_use"){o++;continue}if(c==="error"){s.push(ti(u));continue}if(c==="step_finish"){d=true;let l=At(u.part)?u.part:void 0;i=typeof l?.reason=="string"?l.reason:void 0;}}}return {...e,texts:n,resultText:r,toolUseCount:o,errorMessages:s,terminalReason:i,hasTerminal:d}}function ni(t){return (t??"unknown").trim().toLowerCase().replace(/_/g,"-")}function $n(){return new Q("OpenCode returned no assistant output.",It,{code:"EMPTY_OUTPUT",kind:"transient"})}function fu(){return new Q("OpenCode emitted malformed JSON output.",It,{code:"PROVIDER_CRASHED",kind:"transient"})}function Ys(t,e){switch(ni(t)){case "length":return new Q("OpenCode stopped because the context window was exceeded.",It,{code:"UNKNOWN",kind:"permanent"});case "content-filter":return new Q("OpenCode stopped because the content filter blocked the response.",It,{code:"UNKNOWN",kind:"permanent"});case "error":return new Q(e?`OpenCode error: ${e}`:`${Qs} while generating a response.`,It,{code:"PROVIDER_CRASHED",kind:"transient"});default:return null}}var uu,It,Qs,Zs,cu,$r,Ur=A(()=>{h();jt();Kt();Rt();ut();uu=new Set(["step_start","step_finish"]),It="cli/opencode",Qs="OpenCode provider error",Zs=240,cu={build:{agent:"build",autoApprove:false},"build-auto":{agent:"build",autoApprove:true},plan:{agent:"plan",autoApprove:false},"plan-auto":{agent:"plan",autoApprove:true}};$r={command:"opencode",meta:{displayName:"OpenCode",capabilities:{resume:true}},buildArgs(t,e,n){let r=e.additionalArgs,o=r!==void 0?[...r]:["run"];Hn(o,"--format")||o.push("--format","json"),e.resumeSessionId&&!o.includes("-s")&&!o.includes("--session")&&o.push("-s",e.resumeSessionId);let{agent:s,autoApprove:i}=lu(e.mode);Hn(o,"--agent")||s!==void 0&&o.push("--agent",s),i&&!Hn(o,"--auto")&&o.push("--auto"),e.effort!==void 0&&!Hn(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=Xs(t),n=e.errorMessages[0];if(n){let i=Ys("error",n);if(i)throw i}let r=Ys(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 $n();return o}if(e.resultText?.trim()){if(!e.hasTerminal)throw $n();return e.resultText}if(e.malformed)throw fu();if(!e.hasTerminal)throw $n();let s=ni(e.terminalReason);if((s==="stop"||s==="tool-calls")&&e.toolUseCount>0)return "";throw $n()},interpretExit(t,e,n=""){if(t===0)return null;let o=Xs(n).errorMessages[0];return o?new Q(`OpenCode error: ${o}`,It,{code:"PROVIDER_CRASHED",kind:"transient"}):null},parseResultMeta(t){let e=St(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=ei(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=Ee(i,n),u=i.type;if(u){if(u==="text"){let l=i.part?.text;l&&r.push({timestamp:d,type:"text",content:l});continue}if(u==="tool_use"){let c=i.part;if(!c)continue;let l=String(c.tool||""),p=String(c.callID||""),g=c.state,m=String(g?.status||""),I=g?.input,y=Me(I);if(r.push({timestamp:d,type:"tool_use",toolName:l,toolUseId:p,toolInput:y}),m==="completed"&&g?.output!==void 0){let k=g.output,D=typeof k=="string"?k:JSON.stringify(k);r.push({timestamp:d,type:"tool_result",toolUseId:p,resultPreview:D,isError:false});}else m==="error"&&r.push({timestamp:d,type:"tool_result",toolUseId:p,resultPreview:String(g?.error||"tool error"),isError:true});continue}if(u==="error"){let c=ti(i);r.push({timestamp:d,type:"error",content:c,errorMessage:c});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?uu.has(r):!1}catch{return false}}};});function Jt(t,e){return t.some(n=>n===e||n.startsWith(`${e}=`))}function gu(t,e){if(!(t?Qe(qr).some(s=>s.id===t):false)||!t)return e;let r=zt(qr,t),o=bs(qr)[t]?.defaultEffort;if(r.length!==0)return e?r.includes(e)?e:o&&r.includes(o)?o:void 0:o}var qr,Fr,Br=A(()=>{h();jt();Gt();dt();Vt();qr="antigravity";Fr={command:"agy",meta:{displayName:"Antigravity",models:Ns(),defaultTimeoutMs:{query:12e4,execute:3e5},defaultIdleMs:0},buildArgs(t,e,n){let{model:r,effort:o}=Ze(e.model),s=Or(r),i=s.model,d=e.effort??o??s.effort,u=gu(i,d),c=e.additionalArgs??[],l=i&&!Jt(c,"--model")?["--model",i]:[],p=Jt(c,"--effort")?[]:Gs(u),g=Jt(c,"--mode")||Jt(c,"--dangerously-skip-permissions")?[]:Ws(e.mode),m=Jt(c,"--print")?[]:["--print",t];return {args:[...l,...p,...g,...c,...m]}},extractText(t){let e=t.trim();if(!e)throw new Q("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 ri=A(()=>{h();Et();Rt();Wt();ut();});function vt(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function qn(t){return vt(t)?t:void 0}function ae(t){return typeof t=="string"?t:void 0}function lt(t){let e=typeof t=="number"?t:Number(t??0);return Number.isFinite(e)?e:0}function Tu(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 Xt(t){let e=t.trim();if(!e)return [];try{let n=JSON.parse(e);return vt(n)?[n]:[]}catch{return Tu(e).flatMap(n=>{try{let r=JSON.parse(n);return vt(r)?[r]:[]}catch{return []}})}}function Yt(t){let e=JSON.stringify(t);return e===void 0?String(t):e}function Qt(t){if(typeof t=="string")return t;if(Array.isArray(t)){let e=t.map(Qt).filter(n=>n!==void 0);return e.length>0?e.join(`
|
|
20
|
+
`):void 0}if(vt(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=Qt(t[e]);if(n!==void 0)return n}}}function wu(t){if(t.rawOutput!==null&&t.rawOutput!==void 0)return Qt(t.rawOutput)??Yt(t.rawOutput);if(t.content!==null&&t.content!==void 0)return Qt(t.content)??Yt(t.content);if(t.result!==null&&t.result!==void 0)return Qt(t.result)??Yt(t.result)}function di(t){let e=qn(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?ui(n):"Grok CLI reported an error."}function ui(t){return (t.replace(ku,"").split(/\r?\n/).map(n=>n.trim()).filter(Boolean)[0]??t.trim()).slice(0,500)}function ai(t){return _u.test(t)}function yu(t){let e=qn(t.modelUsage);return e?Object.keys(e)[0]??null:null}function Eu(t){let e=qn(t.usage);if(!e)return null;let n=lt(e.cache_read_input_tokens);return {inputTokens:lt(e.input_tokens)+n,cachedInputTokens:n,outputTokens:lt(e.output_tokens),costUsd:lt(t.total_cost_usd)}}function Ru(t){let e=0,n=0,r=0,o=false,s=new Set;for(let i of t.split(`
|
|
21
|
+
`).flatMap(Xt)){if(i.type!=="usage")continue;let d=qn(i.usage);if(!d)continue;let u=ae(i.signature);if(u&&u.length>0){let l=`signature:${u}`;if(s.has(l))continue;s.add(l);}let c=lt(d.cache_read_input_tokens);e+=lt(d.input_tokens)+c,n+=c,r+=lt(d.output_tokens),o=true;}return o?{inputTokens:e,cachedInputTokens:n,outputTokens:r,costUsd:0}:null}function Su(t,e){if(!Array.isArray(e.entries)||e.entries.length===0)return [];let n=[];for(let s of e.entries.slice(0,oi)){if(!vt(s))continue;let i=ae(s.content)?.trim();if(!i)continue;let d=ae(s.status)?.trim(),u=ae(s.priority)?.trim(),c=[d?`status=${d}`:void 0,u?`priority=${u}`:void 0].filter(p=>!!p),l=c.length>0?` (${c.join(", ")})`:"";n.push(`- ${i}${l}`);}if(n.length===0)return [];e.entries.length>oi&&n.push(ii);let r=n.join(`
|
|
22
|
+
`),o=r.length>si?`${r.slice(0,si-1)}${ii}`:r;return [{timestamp:t,type:"info",content:o}]}function Iu(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 Su(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:Yt(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:wu(e),isError:r!=="completed"||e.isError===true}]}if(n==="error"){let r=di(e);return [{timestamp:t,type:"error",content:r,errorMessage:r}]}return []}var Un,mu,_u,ku,oi,si,ii,jr,Wr=A(()=>{h();jt();vr();dt();Vt();ut();Un="cli/grok",mu=new Set(["available_commands","usage","end"]),_u=/(?:rate[\s_-]*limit|quota|usage[\s_-]*limit|too many requests|limit(?:ed|ing)?\s+(?:exceeded|reached))/i,ku=/\u001b\[[0-?]*[ -/]*[@-~]/g,oi=20,si=4e3,ii="\u2026";jr={command:"grok",createSessionId:()=>randomUUID(),meta:{displayName:"Grok",capabilities:{resume:true}},buildArgs(t,e){let{model:n,effort:r}=Ze(e.model),o=e.effort??r,s=e.resumeSessionId?["--resume",e.resumeSessionId]:e.providerSessionId?["--session-id",e.providerSessionId]:[],i=n?["--model",n]:[],d=n?Qe("grok").some(G=>G.id===n):false,u=n&&d?zt("grok",n):[],c=!o||u.length===0||u.includes(o)?o:void 0,l=js(c),p=e.additionalArgs??[],g=G=>p.some(E=>E===G||E.startsWith(`${G}=`)),m=e.providerOptions,I=m?.alwaysApprove,y=m?.sandbox,k=g("--permission-mode")?[]:qs(e.mode),D=g("--always-approve")?[]:Fs(I),L=g("--sandbox")?[]:Bs(y);return {args:["--no-auto-update",...s,"--single",t,"--output-format","streaming-json","--no-alt-screen",...i,...l,...k,...D,...L,...p]}},extractText(t){let e=[],n=false;for(let r of t.split(`
|
|
23
|
+
`).flatMap(Xt))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 Xt(t))if(e.type==="error"){let n=di(e);return ai(Yt(e))?new Be(n,Un):new Q(n,Un)}return null},interpretExit(t,e){if(t===0)return null;let n=ui(e)||`Grok CLI exited with code ${t}.`;return ai(e)?new Be(n,Un):new Q(n,Un)},parseResultMeta(t){let n=t.split(`
|
|
24
|
+
`).flatMap(Xt).find(r=>r.type==="end");return n?{usage:Eu(n),model:yu(n)}:{usage:Ru(t),model:null}},parseEvent(t,e){let n=e??new Date().toISOString();return Xt(t).flatMap(r=>Iu(Ee(r,n),r))},suppressOutputLine(t){let e=t.trim();if(!e.startsWith("{")||!e.endsWith("}"))return false;try{let n=JSON.parse(e);return vt(n)&&typeof n.type=="string"?mu.has(n.type):!1}catch{return false}}};});var ci,li=A(()=>{h();Dr();Lr();Hr();Ur();Br();ri();Wr();Dr();Lr();Hr();Ur();Br();Wr();Et();ci={codex:Mr,claude:Nr,opencode:$r,antigravity:Fr,copilot:Pr,grok:jr};});function pi(t){if(t.startsWith("cli/"))return ci[t.slice(4)]}var fi=A(()=>{h();Ss();li();});function Fn(t){return typeof t=="number"&&Number.isFinite(t)?t:0}function Au(t,e){return typeof t=="string"&&t.length>0?t:typeof e=="string"&&e.length>0?e:null}function Bn(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(`
|
|
25
|
+
`)??"";if(!n.trim())return;let r=pi(t.provider);if(!r)return;let o;try{o=r.parseResultMeta?.(n);}catch{return {stdout:n,adapter:r}}let s=Au(o?.model,t.model),i=o?.usage;if(!i)return {stdout:n,adapter:r};let d=Fn(i.inputTokens),u=Fn(i.outputTokens),c=Fn(i.cachedInputTokens),l=ds(Fn(i.costUsd),d,u,c,s);return d!==0||u!==0||c!==0||l!==0?{stdout:n,adapter:r,usage:{inputTokens:d,outputTokens:u,cachedInputTokens:c,costUsd:l,model:s}}:{stdout:n,adapter:r}}var Gr=A(()=>{h();fi();xn();});function bu(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"&&vu.has(n)?n:void 0}catch{return}}function pt(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=bu(t.metadata);return e==="user_stop"?"stopped":e==="runner_lost"?"runner_lost":e==="launch_failed"?"failed":typeof t.error=="string"&&gi.stopped.test(t.error)?"stopped":typeof t.error=="string"&&gi.runnerLost.test(t.error)?"runner_lost":"failed"}default:return t.status}}var hi,gi,vu,jn=A(()=>{h();hi=["success","failed","stopped","runner_lost"],gi={stopped:/^(Killed by user|Stopped by user|Cancelled by user|사용자에 의해 중지됨)/,runnerLost:/^Reaped: (process not found|pid never recorded|stale workflow run)/},vu=new Set(["user_stop","runner_lost","launch_failed"]);});function zr(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 Vr(){return zr("CREWX_TASK_HEARTBEAT_MS",1e4,200)}function xt(){return zr("CREWX_TASK_HEARTBEAT_STALE_MS",3e4)}function Gn(){return zr("CREWX_TASK_HEARTBEAT_HARD_STALE_MS",18e5)}function bt(t){return typeof t=="number"&&Number.isFinite(t)?Math.trunc(t):0}function Wn(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 xu(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 mi(t,e){return !!t.stop_requested_at&&bt(t.stop_requested_epoch)===bt(e)}function _i(t,e){let n=bt(e.runEpoch);if(!(e.writeHeartbeat===false?true:t.heartbeatTask({id:e.taskId,runEpoch:n})))return {accepted:false,row:null};let o=xu(t.getTask(e.taskId));return !o||o.status!=="running"||bt(o.run_epoch)!==n?{accepted:false,row:o}:{accepted:true,row:o}}function yi(t,e){let n=Zt.get(t);return !n||e&&n!==e?false:(clearInterval(n.timer),Zt.delete(t),true)}function en(t,e){let n=Zt.get(t);return !n||e!==void 0&&n.runEpoch!==bt(e)?false:yi(t,n)}function Ei(t,e){let n=bt(e.runEpoch);en(e.taskId);let r=true,o=null;try{let c=_i(t,{...e,runEpoch:n});r=c.accepted,o=c.row;}catch(c){Wn(c);}if(!r)return false;let s=Vr(),i=Math.min(s,1e3),d=setInterval(()=>{let c=Zt.get(e.taskId);if(!(!c||c.timer!==d))try{c.heartbeatElapsedMs+=i;let l=c.heartbeatElapsedMs>=s,p=_i(t,{taskId:e.taskId,runEpoch:n,writeHeartbeat:l});if(!p.accepted){yi(e.taskId,c);return}l&&(c.heartbeatElapsedMs%=s,c.lastHeartbeatAt=Date.now()),p.row&&mi(p.row,n)&&!c.stopRequested&&(c.stopRequested=!0,e.onStopRequested&&Promise.resolve(e.onStopRequested(p.row)).catch(Wn));}catch(l){Wn(l);}},i),u={timer:d,runEpoch:n,stopRequested:false,lastHeartbeatAt:Date.now(),heartbeatElapsedMs:0};return Zt.set(e.taskId,u),typeof d=="object"&&d!==null&&"unref"in d&&d.unref(),o&&mi(o,n)&&e.onStopRequested&&(u.stopRequested=true,Promise.resolve(e.onStopRequested(o)).catch(Wn)),true}var ki,Ti,wi,Zt,tn=A(()=>{h();ki=1e4,Ti=3e4,wi=18e5;Zt=new Map;});function zn(t,e=Date.now(),n=Jr){let r=t?Date.parse(t):Number.NaN,o=typeof e=="number"?e:Date.parse(e),s=Xr(n,Jr,0);return Number.isFinite(r)&&Number.isFinite(o)&&o-r>s?"forced":"cooperative"}function Xr(t,e,n){return t===void 0||!Number.isFinite(t)?e:Math.max(n,Math.trunc(t))}function Si(t){if(!t)return {};try{let e=JSON.parse(t);if(typeof e=="object"&&e!==null&&!Array.isArray(e))return e}catch{}return {}}function Nu(t){if(!t)return;let e=Si(t.metadata).stopMethod;return e==="cooperative"||e==="forced"?e:void 0}function nn(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=Nu(t);return {status:"stopped",finalStatus:t.status,...r?{method:r}:{},...n?{pid:n}:{}}}return {status:"not_running",finalStatus:t.status,...n?{pid:n}:{}}}function Du(t){return {status:"ownership_unverified",finalStatus:t.status,...t.pid&&t.pid>0?{pid:t.pid}:{},error:"Process owner could not be verified"}}function Kr(t,e){return {status:"failed",finalStatus:t?.status??null,...t?.pid&&t.pid>0?{pid:t.pid}:{},error:e}}function Pu(t,e){if(!t.heartbeat_at)return false;let n=Date.parse(t.heartbeat_at);return Number.isFinite(n)?e-n<=xt():false}function Lu(t){return {...t.processControlOptions,...t.platform?{platform:t.platform}:{}}}function Mu(t){let e=typeof t.pid=="number"&&t.pid>0?t.pid:void 0,n=Si(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 Hu(t,e,n){let r=t.getTask(e);if(!r||r.status!=="running")return nn(r,n)}async function $u(t,e,n,r){let o=Date.now()+n;for(;;){let s=Hu(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 Ri(t,e,n){let r=new Date().toISOString(),o=t.requestTaskStop({id:e,requestedAt:r}),s=t.getTask(e);if(!o.accepted&&!(o.status==="running"&&o.alreadyRequestedAt))return nn(s);let i=o.runEpoch,d=Xr(n.graceMs,Jr,0),u=Xr(n.pollMs,Ou,1),c=await $u(t,e,d,u);if(c)return c;let l=t.getTask(e);if(!l||l.status!=="running")return nn(l);let p=Mu(l),g=p[0];if(!g){let L=t.finalizeTaskStop({id:e,runEpoch:i,method:"forced"}),G=t.getTask(e);return L||G?.status!=="running"?nn(G):Kr(G,"Failed to finalize task stop")}let m=Lu(n),I="unknown";if(!Pu(l,Date.now())){let L=n.processControl?.checkProcessOwnershipAsync??ms;try{I=await L(g,n.ownershipMarkers??Cu,m);}catch{I="unknown";}if(I!=="owned")return Du(l)}let y=n.processControl?.terminateProcessTree??On;for(let L of p){let G;try{G=await y(L,{...m,signal:"SIGTERM"});}catch(E){G={status:"failed",pid:L,method:m.platform==="win32"?"taskkill":"process-group",error:E instanceof Error?E.message:String(E)};}if(G.status==="failed")return Kr(t.getTask(e),G.error??"Failed to terminate process tree")}let k=t.finalizeTaskStop({id:e,runEpoch:i,method:"forced"}),D=t.getTask(e);return k||D?.status!=="running"?nn(D,g):Kr(D,"Task changed before stop was finalized")}function Ii(t,e,n={}){if(typeof t=="string"){let r=t,o=e??{};return Promise.resolve().then(()=>(Qr(),Ai)).then(({TaskRepository:s})=>Ri(new s,r,o))}return Ri(t,e,n)}var Jr,Ou,Cu,Yr=A(()=>{h();Cn();tn();Jr=5e3,Ou=250;Cu=["crewx","claude","codex","opencode","grok","node"];});var Ai={};ta(Ai,{DEFAULT_TASK_REAPER_TICK_INTERVAL_MS:()=>Ci,PENDING_ADOPT_GRACE_MS:()=>Oi,PID_NULL_REAP_GRACE_MS:()=>oo,TASK_HEARTBEAT_HARD_STALE_MS:()=>wi,TASK_HEARTBEAT_INTERVAL_MS:()=>ki,TASK_HEARTBEAT_STALE_MS:()=>Ti,TaskRepository:()=>un,hasRecordedUsage:()=>ro,mergeTerminalReason:()=>Kn,resolveTaskHeartbeatHardStaleMs:()=>Gn,resolveTaskHeartbeatIntervalMs:()=>Vr,resolveTaskHeartbeatStaleMs:()=>xt});function Se(t){return {...t,status:pt(t)}}function vi(t){return {...t,status:pt(t)}}function bi(){let t=sql`
|
|
18
26
|
CASE
|
|
19
27
|
WHEN ${a.model} LIKE 'claude-%' OR ${a.model} IN ('opus', 'sonnet', 'haiku', 'opus[1m]', 'sonnet[1m]') THEN 'claude'
|
|
20
28
|
WHEN ${a.model} LIKE 'gpt-%' OR ${a.model} LIKE 'codex-%' THEN 'codex'
|
|
@@ -43,14 +51,39 @@ ${r.join(`
|
|
|
43
51
|
WHEN trim(${o}) = '' THEN 'unknown'
|
|
44
52
|
ELSE ${o}
|
|
45
53
|
END
|
|
46
|
-
`}
|
|
54
|
+
`}function an(t){return sql`${t} NOT IN (${sql.join(Vu.map(e=>sql`${e}`),sql`, `)})`}function Vn(t){let e=sql`
|
|
55
|
+
CASE
|
|
56
|
+
WHEN json_valid(${t}) = 1
|
|
57
|
+
THEN json_extract(${t}, '$.usageAccounting')
|
|
58
|
+
ELSE NULL
|
|
59
|
+
END
|
|
60
|
+
`;return sql`
|
|
61
|
+
COALESCE(SUM(
|
|
62
|
+
CASE WHEN ${e} = 'unavailable' THEN 1 ELSE 0 END
|
|
63
|
+
), 0)
|
|
64
|
+
`}function dn(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function fe(t){if(!t)return {};try{let e=JSON.parse(t);return dn(e)?{...e}:{}}catch{return {}}}function Kn(t,e){let n=fe(t??null);return n.terminalReason=e,JSON.stringify(n)}function ee(t){return typeof t=="number"&&Number.isFinite(t)?t:0}function ro(t){return ee(t.input_tokens)!==0||ee(t.output_tokens)!==0||ee(t.cached_input_tokens)!==0||ee(t.cost_usd)!==0}function re(t){return typeof t=="number"&&Number.isFinite(t)?Math.trunc(t):0}function xi(t){return {inputTokens:ee(t.inputTokens??0),outputTokens:ee(t.outputTokens??0),cachedInputTokens:ee(t.cachedInputTokens??0),costUsd:ee(t.costUsd??0)}}function Ku(t){if(dn(t))return {inputTokens:ee(t.inputTokens),outputTokens:ee(t.outputTokens),cachedInputTokens:ee(t.cachedInputTokens),costUsd:ee(t.costUsd)}}function Ju(t){let e={inputTokens:0,outputTokens:0,cachedInputTokens:0,costUsd:0};for(let n of Object.values(t)){let r=Ku(n);r&&(e.inputTokens+=r.inputTokens,e.outputTokens+=r.outputTokens,e.cachedInputTokens+=r.cachedInputTokens,e.costUsd+=r.costUsd);}return e}function no(t,e,n){let r=Date.parse(t),o=Date.parse(e);return Number.isFinite(r)&&Number.isFinite(o)?o-r:n??null}var eo,Ge,Wu,ze,Ve,Gu,to,sn,Ie,zu,Vu,oo,Oi,Ci,un,Qr=A(()=>{h();ot();ht();_t();nt();wt();xn();Cn();Rs();Gr();jn();tn();Yr();tn();eo=40,Ge="2026-05-09",Wu="0.8.9-rc.13",ze=10,Ve=parseInt(Wu.split("rc.")[1]);Gu=new Set(["workflow","mcp"]),to="usageByEpoch",sn="lateUsage",Ie="usageAccounting",zu=new Set(["stopped","runner_lost"]),Vu=["pending","running"];oo=600*1e3,Oi=600*1e3,Ci=300*1e3,un=class extends le{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 Nn({dbPath:this.dbPath});}resolveDbPath(){return this.dbPath?rt(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 f("NOT_FOUND","Database not found");let r=j(n);if(e)try{be(r.db,n);}catch(o){throw r.close(),o}return r}heartbeatTask(e){let n=this.openHandle(true);try{let r=re(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 f?r:new f("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=re(s.run_epoch);if(s.status!=="running"){r={accepted:!1,status:s.status,runEpoch:i};return}let u=s.stop_requested_at!==null&&re(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:re(g?.run_epoch)};return}r={accepted:!1,status:g.status,runEpoch:re(g.run_epoch),...g.stop_requested_at&&re(g.stop_requested_epoch)===re(g.run_epoch)?{alreadyRequestedAt:g.stop_requested_at}:{}};}else r={accepted:!0,status:s.status,runEpoch:i};let l=new Set([e.id]),p=(g,m)=>{if(m>=8)return;let I=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 y of I)l.has(y.id)||(l.add(y.id),o.update(a).set({stop_requested_at:u,stop_requested_epoch:sql`${a.run_epoch}`}).where(and(eq(a.id,y.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(),p(y.id,m+1));};p(e.id,0);},{behavior:"immediate"}),r}catch(r){throw r instanceof f?r:new f("DB_ERROR","Failed to request 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,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"||re(i.run_epoch)!==re(e.runEpoch))return;let d=fe(Kn(i.metadata,e.terminalReason??"user_stop"));d.stopMethod=e.method;let u=i.duration_ms??e.durationMs??no(i.started_at,r,void 0),c=i.run_epoch===null?isNull(a.run_epoch):eq(a.run_epoch,i.run_epoch);o=s.update(a).set({status:"stopped",error:e.error??"Stopped by user",completed_at:r,duration_ms:u,metadata:JSON.stringify(d)}).where(and(eq(a.id,e.id),eq(a.status,"running"),c)).run().changes>0;},{behavior:"immediate"}),o}catch(r){throw r instanceof f?r:new f("DB_ERROR","Failed to finalize task stop",r)}finally{n.close();}}async stopTask(e,n={}){return Ii(this,e,n)}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 u=new Set(n.db.all("PRAGMA table_info(tasks)").map(g=>g.name)).has("log_storage"),c=u?", log_storage":"",l=u?", ?":"",p=u?`,
|
|
67
|
+
log_storage = CASE WHEN tasks.status = 'pending' THEN excluded.log_storage ELSE tasks.log_storage END`:"";n.runRaw(`INSERT INTO tasks (
|
|
47
68
|
id, agent_id, prompt, mode, status, started_at, pid,
|
|
48
69
|
parent_task_id, caller_agent_id, trace_id, command, metadata,
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
|
|
52
|
-
ON CONFLICT(id) DO UPDATE SET
|
|
53
|
-
|
|
70
|
+
workspace_id, project_id, platform, crewx_version, thread_id,
|
|
71
|
+
model, rendered_prompt, coding_agent_command${c}
|
|
72
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?${l})
|
|
73
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
74
|
+
status = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN 'running' ELSE tasks.status END,
|
|
75
|
+
pid = COALESCE(excluded.pid, tasks.pid),
|
|
76
|
+
command = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN excluded.command ELSE tasks.command END,
|
|
77
|
+
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,
|
|
79
|
+
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
|
+
crewx_version = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN excluded.crewx_version ELSE tasks.crewx_version END,
|
|
81
|
+
model = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN excluded.model ELSE tasks.model END,
|
|
82
|
+
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${p}
|
|
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,...u?[r.log_storage]:[]]);}}catch(r){throw r instanceof f?r:new f("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"||re(r.run_epoch)!==re(e.runEpoch))return !1;let o=fe(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&&re(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
|
|
85
|
+
AND COALESCE(${a.stop_requested_epoch}, 0) <> COALESCE(${a.run_epoch}, 0)`)).run(),i.changes>0}catch(r){throw r instanceof f?r:new f("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 f?r:new f("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 f?s:new f("DB_ERROR","Failed to fail pending task",s)}finally{o.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(Se)}catch(r){throw r instanceof f?r:new f("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=re(i.run_epoch),u=re(e.runEpoch),c=i.status==="running"&&d===u,l=i.stop_requested_at!==null&&re(i.stop_requested_epoch)===d,p=c&&l,g=i.status==="stopped"&&d===u&&l,m=fe(i.metadata),I=dn(m[sn])?m[sn]:{},y=String(u),k=zu.has(i.status),D=k&&d===u&&!ro(i)&&!Object.prototype.hasOwnProperty.call(I,y),L=k&&d===u&&!Object.prototype.hasOwnProperty.call(I,y),G=d>0||u>0||e.runEpoch!==void 0&&e.runEpoch!==null||d!==u,E={},O;if(i.status!=="running"&&(r=i.status,o=e.result?.trim()||e.error?.trim()||`task:end status=${e.status}`),G&&(i.status==="running"||L)){O=fe(i.metadata);let x=dn(O[to])?{...O[to]}:{};x[String(u)]=xi(e),O[to]=x;let J=Ju(x),me=J.inputTokens!==0||J.outputTokens!==0||J.cachedInputTokens!==0||J.costUsd!==0;me&&m[Ie]==="unavailable"?O[Ie]="recorded":i.status!=="running"&&!me&&m[Ie]===void 0&&(O[Ie]="unavailable"),E.metadata=JSON.stringify(O),E.input_tokens=J.inputTokens,E.output_tokens=J.outputTokens,E.cached_input_tokens=J.cachedInputTokens,E.cost_usd=J.costUsd;}else if(c||D)if(c)E.input_tokens=ee(e.inputTokens??0),E.output_tokens=ee(e.outputTokens??0),E.cached_input_tokens=ee(e.cachedInputTokens??0),E.cost_usd=ee(e.costUsd??0);else {let x=xi(e),J=x.inputTokens!==0||x.outputTokens!==0||x.cachedInputTokens!==0||x.costUsd!==0;J&&(E.input_tokens=x.inputTokens,E.output_tokens=x.outputTokens,E.cached_input_tokens=x.cachedInputTokens,E.cost_usd=x.costUsd),O={...m};let me=dn(m[sn])?{...m[sn]}:{};me[y]={at:e.completedAt},O[sn]=me,O[Ie]===void 0?O[Ie]=J?"recorded":"unavailable":J&&O[Ie]==="unavailable"&&(O[Ie]="recorded"),E.metadata=JSON.stringify(O);}if((c||D)&&e.model!==void 0&&e.model!==null&&(!D||i.model===null)&&(E.model=e.model),p)O??=fe(i.metadata),e.partialResultRecovered===!0&&(O.partialResultRecovered=!0),O.terminalReason="user_stop",O.stopMethod=zn(i.stop_requested_at,e.completedAt),E.status="stopped",E.result=e.result??i.result,E.error=e.error??"Stopped by user",E.completed_at=e.completedAt,E.duration_ms=i.duration_ms??e.durationMs??no(i.started_at,e.completedAt,void 0),E.exit_code=e.exitCode??i.exit_code,E.metadata=JSON.stringify(O);else if(c)e.partialResultRecovered===!0&&(O??=fe(i.metadata),O.partialResultRecovered=!0,E.metadata=JSON.stringify(O)),E.status=e.status,E.result=e.result??null,E.error=e.error??null,E.completed_at=e.completedAt,E.duration_ms=d>0?no(i.started_at,e.completedAt,e.durationMs):e.durationMs??null,E.exit_code=e.exitCode??null;else if(g){let x=!1;i.result===null&&e.result!==void 0&&e.result!==null&&(E.result=e.result,x=!0),i.exit_code===null&&e.exitCode!==void 0&&e.exitCode!==null&&(E.exit_code=e.exitCode),e.partialResultRecovered===!0&&(O??=fe(i.metadata),O.partialResultRecovered=!0,E.metadata=JSON.stringify(O)),x&&(r=void 0,o=void 0);}Object.keys(E).length>0&&s.update(a).set(E).where(eq(a.id,e.id)).run();},{behavior:"immediate"});}catch(s){throw s instanceof f?s:new f("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
|
|
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=fe(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 f?r:new f("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(Se)}catch(n){throw new f("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(Se)}catch(n){throw new f("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(Se)}catch(n){throw new f("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?Se(r):void 0}catch(r){throw new f("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??Ci)),i=this.lastReaperTickAt,d=i===void 0?Number.POSITIVE_INFINITY:o-i,u=i!==void 0&&d>=0&&d<=s*2;this.lastReaperTickAt=o;let c=xt(),l=Gn(),p=new Date(o-Oi).toISOString(),g=new Date(o).toISOString(),m=new Set,I=0,y=(k,D)=>{let L=fe(Kn(k.metadata,"runner_lost")),G=typeof L.provider=="string"?L.provider:void 0,E;try{E=Bn({taskLogRepository:this.taskLogRepository,taskId:k.id,provider:G,model:k.model})?.usage;}catch{}let O={status:"runner_lost",error:D,completed_at:g};E?(O.input_tokens=E.inputTokens,O.output_tokens=E.outputTokens,O.cached_input_tokens=E.cachedInputTokens,O.cost_usd=E.costUsd,k.model===null&&E.model!==null&&(O.model=E.model),L[Ie]="recorded"):!ro(k)&&L[Ie]!=="recorded"&&(L[Ie]="unavailable"),O.metadata=JSON.stringify(L);let x=k.run_epoch===null?isNull(a.run_epoch):eq(a.run_epoch,k.run_epoch),J=k.heartbeat_at===null?isNull(a.heartbeat_at):eq(a.heartbeat_at,k.heartbeat_at),me=n.db.update(a).set(O).where(and(eq(a.id,k.id),eq(a.status,"running"),x,J)).run();return me.changes>0&&I++,me.changes>0};for(let k of r){if(k.status==="pending"){if(k.pid!==null||k.started_at>=p)continue;let E=Kn(k.metadata,"launch_failed");n.db.update(a).set({status:"failed",error:"Reaped: runner never adopted task (pending timeout)",completed_at:g,metadata:E}).where(and(eq(a.id,k.id),eq(a.status,"pending"),isNull(a.pid),lt$1(a.started_at,p))).run().changes>0&&I++;continue}if(Gu.has(k.platform??"cli"))continue;if(k.pid===null){let E=`${k.id}:${k.run_epoch??0}`;m.add(E);let O=this.pidNullObservedSince.get(E);if(O===void 0){this.pidNullObservedSince.set(E,o);continue}o-O>=oo&&y(k,"Reaped: pid never recorded after resume (stale running_instruction)")&&this.pidNullObservedSince.delete(E);continue}if(k.heartbeat_at===null){at(k.pid)==="not_found"&&y(k,"Reaped: process not found (orphaned task)");continue}let D=Date.parse(k.heartbeat_at),L=Number.isFinite(D)?o-D:Number.POSITIVE_INFINITY;if(L<=c)continue;at(k.pid)==="not_found"?y(k,"Reaped: process not found (orphaned task)"):L>l&&u&&y(k,"Reaped: heartbeat stale beyond hard limit (orphaned task)");}for(let k of Array.from(this.pidNullObservedSince.keys()))m.has(k)||this.pidNullObservedSince.delete(k);return I}finally{n.close();}}reapRunningWorkflowTasks(e=oo){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 u of s){let c=fe(u.metadata);c.terminalReason="runner_lost";let l=n.db.update(a).set({status:"runner_lost",error:"Reaped: stale workflow run (finally not executed)",completed_at:i,metadata:JSON.stringify(c)}).where(and(eq(a.id,u.id),eq(a.status,"running"))).run();d+=l.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=j(o);try{let i=n?eq(a.workspace_id,n):void 0,d=i?and(eq(a.id,e),i):eq(a.id,e),u=s.db.select().from(a).where(d).limit(1).get()??void 0;if(!u){let c=i?and(eq(a.thread_id,e),i):eq(a.thread_id,e);u=s.db.select().from(a).where(c).orderBy(desc(a.started_at)).limit(1).get()??void 0;}if(u)return Se(u)}catch(i){throw new f("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=j(i);try{let u=n?and(eq(a.parent_task_id,e),eq(a.workspace_id,n)):eq(a.parent_task_id,e),c=d.db.select().from(a).where(u).orderBy(asc(a.started_at)).all();for(let l of c)o.has(l.id)||(o.add(l.id),s.push(Se(l)));}catch(u){throw new f("DB_ERROR","Failed to find child tasks",u)}finally{d.close();}}return s}getWorkspaceUsageSummary(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.all(e?sql`
|
|
54
87
|
SELECT
|
|
55
88
|
COALESCE(workspace_id, 'unknown') AS workspace_id,
|
|
56
89
|
COALESCE(SUM(input_tokens), 0) AS input_tokens,
|
|
@@ -71,19 +104,20 @@ ${r.join(`
|
|
|
71
104
|
FROM tasks
|
|
72
105
|
GROUP BY workspace_id
|
|
73
106
|
ORDER BY (COALESCE(SUM(input_tokens), 0) + COALESCE(SUM(output_tokens), 0)) DESC
|
|
74
|
-
`)}catch(r){throw new
|
|
107
|
+
`)}catch(r){throw new f("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 u of r){if(!existsSync(u))continue;let c=j(u);try{let l=eq(a.thread_id,e),p=n?and(l,eq(a.workspace_id,n)):l,g=c.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(l){throw new f("DB_ERROR","Failed to get thread token usage",l)}finally{c.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 u of o){if(!existsSync(u))continue;let c=j(u);try{let l=eq(a.thread_id,e),p=n?and(l,eq(a.workspace_id,n)):l,g=d?c.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():c.db.select().from(a).where(p).orderBy(asc(a.started_at)).all().map(Se);for(let m of g)s.has(m.id)||(s.add(m.id),i.push(m));}catch(l){throw new f("DB_ERROR","Failed to find tasks by thread",l)}finally{c.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=j(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(vi));}catch(o){throw new f("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=j(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 vi(s)}}catch(o){throw new f("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=(u,c)=>{if(!u)return;let l=s.get(u);if(l&&c.started_at<=l)return;let p=this.parseWorkflowCardMetadata(c.metadata);p.kind!=="workflow_card"&&p.kind!=="workflow_ui_instance"||(s.set(u,c.started_at),r.set(u,{taskId:c.id,workflowRunId:p.workflowRunId,raw:c.result??void 0}));};for(let u of this.resolveDbPaths()){if(!existsSync(u))continue;let c=j(u);try{let l=and(inArray(a.thread_id,e),or$1(like(a.metadata,'%"kind":"workflow_card"%'),like(a.metadata,'%"kind":"workflow_ui_instance"%'))),p=c.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(l,i):l).all();for(let I of p)d(I.thread_id,I);let g=and(isNull(a.thread_id),or$1(like(a.metadata,'%"kind":"workflow_card"%'),like(a.metadata,'%"kind":"workflow_ui_instance"%'))),m=c.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 I of m){let y=this.extractThreadIdFromCommand(I.command);!y||!o.has(y)||d(y,I);}}catch(l){throw new f("DB_ERROR","Failed to batch fetch workflow cards",l)}finally{c.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,u=n.db.select({count:sql`count(*)`}).from(a).where(d).get(),c=(e.sortDir??"DESC")==="ASC"?asc(a.started_at):desc(a.started_at);return {rows:n.db.select().from(a).where(d).orderBy(c).limit(e.limit).offset(e.offset).all().map(Se),total:u?.count??0}}catch(r){throw new f("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=an(sql.raw("t.status")),i=Vn(sql.raw("t.metadata"));return o.db.all(r?sql`
|
|
75
108
|
SELECT
|
|
76
109
|
t.agent_id,
|
|
77
110
|
t.workspace_id,
|
|
78
111
|
COUNT(*) AS total_tasks,
|
|
112
|
+
${i} AS unavailable_task_count,
|
|
79
113
|
COALESCE(SUM(
|
|
80
114
|
COALESCE(t.input_tokens, 0)
|
|
81
115
|
+ CASE
|
|
82
|
-
WHEN t.started_at >= ${
|
|
116
|
+
WHEN t.started_at >= ${Ge}
|
|
83
117
|
AND (
|
|
84
118
|
t.crewx_version IS NULL
|
|
85
119
|
OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
|
|
86
|
-
OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${
|
|
120
|
+
OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${ze}) AS INTEGER) < ${Ve})
|
|
87
121
|
)
|
|
88
122
|
THEN COALESCE(t.cached_input_tokens, 0)
|
|
89
123
|
ELSE 0
|
|
@@ -93,7 +127,7 @@ ${r.join(`
|
|
|
93
127
|
COALESCE(SUM(t.cached_input_tokens), 0) AS cached_input_tokens,
|
|
94
128
|
COALESCE(SUM(t.cost_usd), 0) AS cost_usd
|
|
95
129
|
FROM tasks t
|
|
96
|
-
WHERE
|
|
130
|
+
WHERE ${s}
|
|
97
131
|
AND t.started_at >= ${e}
|
|
98
132
|
AND t.started_at < ${n}
|
|
99
133
|
AND t.workspace_id = ${r}
|
|
@@ -102,11 +136,11 @@ ${r.join(`
|
|
|
102
136
|
COALESCE(SUM(
|
|
103
137
|
COALESCE(t.input_tokens, 0)
|
|
104
138
|
+ CASE
|
|
105
|
-
WHEN t.started_at >= ${
|
|
139
|
+
WHEN t.started_at >= ${Ge}
|
|
106
140
|
AND (
|
|
107
141
|
t.crewx_version IS NULL
|
|
108
142
|
OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
|
|
109
|
-
OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${
|
|
143
|
+
OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${ze}) AS INTEGER) < ${Ve})
|
|
110
144
|
)
|
|
111
145
|
THEN COALESCE(t.cached_input_tokens, 0)
|
|
112
146
|
ELSE 0
|
|
@@ -119,14 +153,15 @@ ${r.join(`
|
|
|
119
153
|
t.agent_id,
|
|
120
154
|
t.workspace_id,
|
|
121
155
|
COUNT(*) AS total_tasks,
|
|
156
|
+
${i} AS unavailable_task_count,
|
|
122
157
|
COALESCE(SUM(
|
|
123
158
|
COALESCE(t.input_tokens, 0)
|
|
124
159
|
+ CASE
|
|
125
|
-
WHEN t.started_at >= ${
|
|
160
|
+
WHEN t.started_at >= ${Ge}
|
|
126
161
|
AND (
|
|
127
162
|
t.crewx_version IS NULL
|
|
128
163
|
OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
|
|
129
|
-
OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${
|
|
164
|
+
OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${ze}) AS INTEGER) < ${Ve})
|
|
130
165
|
)
|
|
131
166
|
THEN COALESCE(t.cached_input_tokens, 0)
|
|
132
167
|
ELSE 0
|
|
@@ -136,7 +171,7 @@ ${r.join(`
|
|
|
136
171
|
COALESCE(SUM(t.cached_input_tokens), 0) AS cached_input_tokens,
|
|
137
172
|
COALESCE(SUM(t.cost_usd), 0) AS cost_usd
|
|
138
173
|
FROM tasks t
|
|
139
|
-
WHERE
|
|
174
|
+
WHERE ${s}
|
|
140
175
|
AND t.started_at >= ${e}
|
|
141
176
|
AND t.started_at < ${n}
|
|
142
177
|
GROUP BY t.agent_id, t.workspace_id
|
|
@@ -144,11 +179,11 @@ ${r.join(`
|
|
|
144
179
|
COALESCE(SUM(
|
|
145
180
|
COALESCE(t.input_tokens, 0)
|
|
146
181
|
+ CASE
|
|
147
|
-
WHEN t.started_at >= ${
|
|
182
|
+
WHEN t.started_at >= ${Ge}
|
|
148
183
|
AND (
|
|
149
184
|
t.crewx_version IS NULL
|
|
150
185
|
OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
|
|
151
|
-
OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${
|
|
186
|
+
OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${ze}) AS INTEGER) < ${Ve})
|
|
152
187
|
)
|
|
153
188
|
THEN COALESCE(t.cached_input_tokens, 0)
|
|
154
189
|
ELSE 0
|
|
@@ -156,18 +191,19 @@ ${r.join(`
|
|
|
156
191
|
), 0)
|
|
157
192
|
+ COALESCE(SUM(t.output_tokens), 0)
|
|
158
193
|
) DESC
|
|
159
|
-
`).map(
|
|
194
|
+
`).map(u=>({agentId:u.agent_id,workspaceId:u.workspace_id??null,totalTasks:u.total_tasks,unavailableTaskCount:u.unavailable_task_count,inputTokens:u.input_tokens,outputTokens:u.output_tokens,cachedInputTokens:u.cached_input_tokens,costUsd:u.cost_usd,totalTokens:u.input_tokens+u.output_tokens}))}catch(s){throw new f("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=an(sql.raw("t.status")),i=Vn(sql.raw("t.metadata"));return o.db.all(r?sql`
|
|
160
195
|
SELECT
|
|
161
196
|
date(t.started_at) AS date,
|
|
162
197
|
t.agent_id,
|
|
198
|
+
${i} AS unavailable_task_count,
|
|
163
199
|
COALESCE(SUM(
|
|
164
200
|
COALESCE(t.input_tokens, 0)
|
|
165
201
|
+ CASE
|
|
166
|
-
WHEN t.started_at >= ${
|
|
202
|
+
WHEN t.started_at >= ${Ge}
|
|
167
203
|
AND (
|
|
168
204
|
t.crewx_version IS NULL
|
|
169
205
|
OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
|
|
170
|
-
OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${
|
|
206
|
+
OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${ze}) AS INTEGER) < ${Ve})
|
|
171
207
|
)
|
|
172
208
|
THEN COALESCE(t.cached_input_tokens, 0)
|
|
173
209
|
ELSE 0
|
|
@@ -177,7 +213,7 @@ ${r.join(`
|
|
|
177
213
|
COALESCE(SUM(t.cached_input_tokens), 0) AS cached_input_tokens,
|
|
178
214
|
COALESCE(SUM(t.cost_usd), 0) AS cost_usd
|
|
179
215
|
FROM tasks t
|
|
180
|
-
WHERE
|
|
216
|
+
WHERE ${s}
|
|
181
217
|
AND t.started_at >= ${e}
|
|
182
218
|
AND t.started_at < ${n}
|
|
183
219
|
AND t.workspace_id = ${r}
|
|
@@ -187,14 +223,15 @@ ${r.join(`
|
|
|
187
223
|
SELECT
|
|
188
224
|
date(t.started_at) AS date,
|
|
189
225
|
t.agent_id,
|
|
226
|
+
${i} AS unavailable_task_count,
|
|
190
227
|
COALESCE(SUM(
|
|
191
228
|
COALESCE(t.input_tokens, 0)
|
|
192
229
|
+ CASE
|
|
193
|
-
WHEN t.started_at >= ${
|
|
230
|
+
WHEN t.started_at >= ${Ge}
|
|
194
231
|
AND (
|
|
195
232
|
t.crewx_version IS NULL
|
|
196
233
|
OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
|
|
197
|
-
OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${
|
|
234
|
+
OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${ze}) AS INTEGER) < ${Ve})
|
|
198
235
|
)
|
|
199
236
|
THEN COALESCE(t.cached_input_tokens, 0)
|
|
200
237
|
ELSE 0
|
|
@@ -204,64 +241,66 @@ ${r.join(`
|
|
|
204
241
|
COALESCE(SUM(t.cached_input_tokens), 0) AS cached_input_tokens,
|
|
205
242
|
COALESCE(SUM(t.cost_usd), 0) AS cost_usd
|
|
206
243
|
FROM tasks t
|
|
207
|
-
WHERE
|
|
244
|
+
WHERE ${s}
|
|
208
245
|
AND t.started_at >= ${e}
|
|
209
246
|
AND t.started_at < ${n}
|
|
210
247
|
GROUP BY date(t.started_at), t.agent_id
|
|
211
248
|
ORDER BY date(t.started_at) ASC
|
|
212
|
-
`).map(
|
|
249
|
+
`).map(u=>({date:u.date,agentId:u.agent_id,unavailableTaskCount:u.unavailable_task_count,inputTokens:u.input_tokens,outputTokens:u.output_tokens,cachedInputTokens:u.cached_input_tokens,costUsd:u.cost_usd,totalTokens:u.input_tokens+u.output_tokens}))}catch(s){throw new f("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?Se(o):void 0}catch(o){throw new f("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 f("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(),u=r?and(eq(a.id,e),eq(a.status,"running"),eq(a.workspace_id,r)):and(eq(a.id,e),eq(a.status,"running")),c=i.db.select({metadata:a.metadata}).from(a).where(u).limit(1).get();if(!c)return;let l={status:o,error:n,completed_at:d};if(s){let p=fe(c.metadata);p.terminalReason=s,l.metadata=JSON.stringify(p);}i.db.update(a).set(l).where(u).run();}catch(d){throw d instanceof f?d:new f("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=j(i);try{let u=n?and(like(a.prompt,`%${e}%`),eq(a.workspace_id,n)):like(a.prompt,`%${e}%`),c=d.db.select().from(a).where(u).orderBy(asc(a.started_at)).all();for(let l of c)o.has(l.id)||(o.add(l.id),s.push(Se(l)));}catch(u){throw new f("DB_ERROR","Failed to find tasks by prompt hint",u)}finally{d.close();}}return s}getProviderUsage(e,n,r){if(!this.dbExists())return [];let o=this.openHandle(false);try{let s=bi(),i=an(a.status),d=Vn(a.metadata),u=sql`
|
|
213
250
|
COALESCE(${a.input_tokens}, 0)
|
|
214
251
|
+ CASE
|
|
215
|
-
WHEN ${a.started_at} >= ${
|
|
252
|
+
WHEN ${a.started_at} >= ${Ge}
|
|
216
253
|
AND (
|
|
217
254
|
${a.crewx_version} IS NULL
|
|
218
255
|
OR (${a.crewx_version} LIKE '0.8.%' AND ${a.crewx_version} NOT LIKE '0.8.9%')
|
|
219
|
-
OR (${a.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${a.crewx_version}, ${
|
|
256
|
+
OR (${a.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${a.crewx_version}, ${ze}) AS INTEGER) < ${Ve})
|
|
220
257
|
)
|
|
221
258
|
THEN COALESCE(${a.cached_input_tokens}, 0)
|
|
222
259
|
ELSE 0
|
|
223
260
|
END
|
|
224
|
-
`,
|
|
261
|
+
`,c=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}`;return o.db.all(sql`
|
|
225
262
|
SELECT
|
|
226
263
|
${s} AS provider,
|
|
227
264
|
COUNT(*) AS total_tasks,
|
|
228
|
-
|
|
265
|
+
${d} AS unavailable_task_count,
|
|
266
|
+
COALESCE(SUM(${u}), 0) AS input_tokens,
|
|
229
267
|
COALESCE(SUM(${a.output_tokens}), 0) AS output_tokens,
|
|
230
268
|
COALESCE(SUM(${a.cached_input_tokens}), 0) AS cached_input_tokens,
|
|
231
269
|
COALESCE(SUM(${a.cost_usd}), 0) AS cost_usd,
|
|
232
270
|
COALESCE(SUM(${a.duration_ms}), 0) AS active_duration_ms,
|
|
233
271
|
MAX(${a.completed_at}) AS last_active_at
|
|
234
272
|
FROM ${a}
|
|
235
|
-
${
|
|
273
|
+
${c}
|
|
236
274
|
GROUP BY ${s}
|
|
237
|
-
ORDER BY (COALESCE(SUM(${
|
|
238
|
-
`).map(
|
|
275
|
+
ORDER BY (COALESCE(SUM(${u}), 0) + COALESCE(SUM(${a.output_tokens}), 0)) DESC
|
|
276
|
+
`).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 f("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=bi(),i=an(a.status),d=Vn(a.metadata),u=sql`
|
|
239
277
|
COALESCE(${a.input_tokens}, 0)
|
|
240
278
|
+ CASE
|
|
241
|
-
WHEN ${a.started_at} >= ${
|
|
279
|
+
WHEN ${a.started_at} >= ${Ge}
|
|
242
280
|
AND (
|
|
243
281
|
${a.crewx_version} IS NULL
|
|
244
282
|
OR (${a.crewx_version} LIKE '0.8.%' AND ${a.crewx_version} NOT LIKE '0.8.9%')
|
|
245
|
-
OR (${a.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${a.crewx_version}, ${
|
|
283
|
+
OR (${a.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${a.crewx_version}, ${ze}) AS INTEGER) < ${Ve})
|
|
246
284
|
)
|
|
247
285
|
THEN COALESCE(${a.cached_input_tokens}, 0)
|
|
248
286
|
ELSE 0
|
|
249
287
|
END
|
|
250
|
-
`,
|
|
288
|
+
`,c=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}`,l=o.db.all(sql`
|
|
251
289
|
SELECT
|
|
252
290
|
${a.model} AS model,
|
|
253
291
|
${s} AS provider,
|
|
254
292
|
COUNT(*) AS total_tasks,
|
|
255
|
-
|
|
293
|
+
${d} AS unavailable_task_count,
|
|
294
|
+
COALESCE(SUM(${u}), 0) AS input_tokens,
|
|
256
295
|
COALESCE(SUM(${a.output_tokens}), 0) AS output_tokens,
|
|
257
296
|
COALESCE(SUM(${a.cached_input_tokens}), 0) AS cached_input_tokens,
|
|
258
297
|
COALESCE(SUM(${a.cost_usd}), 0) AS cost_usd,
|
|
259
298
|
COALESCE(SUM(${a.duration_ms}), 0) AS active_duration_ms,
|
|
260
299
|
MAX(${a.completed_at}) AS last_active_at
|
|
261
300
|
FROM ${a}
|
|
262
|
-
${
|
|
301
|
+
${c}
|
|
263
302
|
GROUP BY ${a.model}, ${s}
|
|
264
|
-
`),
|
|
303
|
+
`),p=new Map;for(let g of l){let m=Ar(g.model??""),I=JSON.stringify([g.provider,m]),y=p.get(I);y?(y.totalTasks+=g.total_tasks,y.unavailableTaskCount=(y.unavailableTaskCount??0)+g.unavailable_task_count,y.inputTokens+=g.input_tokens,y.outputTokens+=g.output_tokens,y.cachedInputTokens+=g.cached_input_tokens,y.costUsd+=g.cost_usd,y.totalTokens+=g.input_tokens+g.output_tokens,y.activeDurationMs+=g.active_duration_ms??0,g.last_active_at&&(!y.lastActiveAt||g.last_active_at>y.lastActiveAt)&&(y.lastActiveAt=g.last_active_at)):p.set(I,{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 f("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`
|
|
265
304
|
SELECT
|
|
266
305
|
${a.thread_id} AS thread_id,
|
|
267
306
|
${a.agent_id} AS agent_id,
|
|
@@ -272,19 +311,19 @@ ${r.join(`
|
|
|
272
311
|
FROM ${a}
|
|
273
312
|
${s}
|
|
274
313
|
ORDER BY ${a.started_at} ASC
|
|
275
|
-
`).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
|
|
314
|
+
`).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 f("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`
|
|
276
315
|
COALESCE(${a.input_tokens}, 0)
|
|
277
316
|
+ CASE
|
|
278
|
-
WHEN ${a.started_at} >= ${
|
|
317
|
+
WHEN ${a.started_at} >= ${Ge}
|
|
279
318
|
AND (
|
|
280
319
|
${a.crewx_version} IS NULL
|
|
281
320
|
OR (${a.crewx_version} LIKE '0.8.%' AND ${a.crewx_version} NOT LIKE '0.8.9%')
|
|
282
|
-
OR (${a.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${a.crewx_version}, ${
|
|
321
|
+
OR (${a.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${a.crewx_version}, ${ze}) AS INTEGER) < ${Ve})
|
|
283
322
|
)
|
|
284
323
|
THEN COALESCE(${a.cached_input_tokens}, 0)
|
|
285
324
|
ELSE 0
|
|
286
325
|
END
|
|
287
|
-
`,i=r?sql`WHERE ${
|
|
326
|
+
`,i=an(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}`,u=o.db.all(sql`
|
|
288
327
|
SELECT
|
|
289
328
|
${a.caller_agent_id} AS caller_agent_id,
|
|
290
329
|
${a.agent_id} AS agent_id,
|
|
@@ -292,34 +331,26 @@ ${r.join(`
|
|
|
292
331
|
COALESCE(SUM(${s}), 0) AS input_tokens,
|
|
293
332
|
COALESCE(SUM(${a.output_tokens}), 0) AS output_tokens
|
|
294
333
|
FROM ${a}
|
|
295
|
-
${
|
|
334
|
+
${d}
|
|
296
335
|
GROUP BY ${a.caller_agent_id}, ${a.agent_id}
|
|
297
336
|
ORDER BY task_count DESC, ${a.caller_agent_id} ASC, ${a.agent_id} ASC
|
|
298
|
-
LIMIT ${
|
|
299
|
-
`),
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
`: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 Ei(t){for(let e=t.length-1;e>=0;e--)if(t[e].value.trim())return e;return -1}function Ri(t){return t.trimStart().startsWith(ki)}function Ii(t){let e=t.trim();if(!e.startsWith(Ur)||!e.endsWith("]]"))return null;let n=e.slice(Ur.length,-2);if(!n)return null;try{return vi(JSON.parse(n))}catch{return null}}function vi(t){return Ai(t)?Object.prototype.hasOwnProperty.call(t,"taskId")?{schema:1,taskId:t.taskId,agentId:t.agentId,isError:t.isError}:{schema:1,isError:true}:null}function Ai(t){if(!Si(t)||Object.keys(t).some(r=>!yi.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?Fr(t.taskId)&&Fr(t.agentId):t.isError===true}function xi(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 Fr(t){return typeof t=="string"&&t.trim().length>0}function Si(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function ve(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 qr=["none","minimal","low","medium","high","xhigh","max","ultra"],Wt={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"]};var Sn={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(Sn).map(([t,e])=>[t,e.models]));var Oi=[{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]"}],bi={"accept-edits":"acceptEdits",yolo:"bypassPermissions","agent-full-access":"bypassPermissions"};function On(t){return bi[t]??t}var Ci=new Map(Oi.map(({baseModelId:t,catalogModelId:e})=>[t,e]));function Ni(t){return Ci.get(t)??t}var Di=[{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"}],Pi=new Map(Di.map(({legacyId:t,model:e,effort:n})=>[t,n===void 0?{model:e}:{model:e,effort:n}]));function bn(t){if(!t)return {};let e=Pi.get(t);return e?{...e}:{model:t}}function Cn(t,e){return t==="antigravity"||t==="cli/antigravity"?bn(e):e===void 0?{}:{model:Ni(e)}}var Li={};function Mi(){return {models:[],modes:[],effort:[],modelOverrides:{},providerOptions:[]}}function Ge(t){return zt(t).models}function zt(t){return Li[t]??Sn[t]??Mi()}function yt(t,e){let n=zt(t);if(e){if(Object.prototype.hasOwnProperty.call(n.modelOverrides,e))return n.modelOverrides[e]?.effort??n.effort;let r=Cn(t,e);return r.model===void 0?n.effort:n.modelOverrides[r.model]?.effort??n.effort}return n.effort}function Br(t){return zt(t).modelOverrides}function jr(){return Ge("claude")}function Gr(){return Ge("codex")}function Wr(){return Ge("copilot")}function zr(){return Ge("antigravity")}var $i={auto:"default"};function Vr(t){return $i[t]??t}var Hi=new Set(qr);function Vt(t,e){return (Wt[t]??[]).includes(e)}function We(t){if(!t)return {};let e=t.match(/^(.+?)\[([^\]]+)\]$/);if(e){let n=e[2].toLowerCase();return Hi.has(n)?{model:e[1],effort:n}:{model:t}}return {model:t}}function Kr(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 Jr(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 Yr(t){return !t||!Vt("codex",t)?[]:["-c",`model_reasoning_effort=${t}`]}function Xr(t){if(!t)return [];let e=new Set(["acceptEdits","bypassPermissions","default","delegate","dontAsk","plan"]),n=Vr(t);return e.has(n)?["--permission-mode",n]:[]}function Qr(t){return t?Vt("claude",t)?["--effort",t]:[]:[]}var Ui=new Set(["default","acceptEdits","auto","dontAsk","bypassPermissions","plan"]);function Zr(t){return t==="default"?[]:t&&Ui.has(t)?["--permission-mode",t]:[]}function eo(t){return t===true?["--always-approve"]:[]}function to(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 no(t){return t?Vt("grok",t)?["--effort",t]:[]:[]}function ro(t){if(!t)return [];switch(On(t)){case "default":return [];case "plan":return ["--mode","plan"];case "acceptEdits":return ["--mode","accept-edits"];case "bypassPermissions":return ["--dangerously-skip-permissions"];default:return []}}function oo(t){return t?Vt("antigravity",t)?["--effort",t]:[]:[]}function Fi(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 qi(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,l=i!==void 0?i:d??0;return {inputTokens:i!==void 0?r+i:r,outputTokens:o,cachedInputTokens:l}}function Bi(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 so(t){let e=new Map,n;for(let s of t.split(`
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
`).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}var Nn={command:"claude",meta:{displayName:"Claude",models:jr(),capabilities:{resume:true}},buildArgs(t,e,n){let{model:r,effort:o}=We(e.model),s=e.effort??o,i=Xr(e.mode),d=Qr(s),l=r?["--model",r]:[],c=e.resumeSessionId?["--resume",e.resumeSessionId]:[];if(e.additionalArgs!==void 0){let g=[...e.additionalArgs];return g.indexOf("-p")!==-1?{args:["--output-format","stream-json","--verbose",...c,...i,...d,...l,...g],stdinMessage:t}:{args:["--output-format","stream-json","--verbose",...c,...i,...d,...l,...g],stdinMessage:t}}return {args:["-p","--output-format","stream-json","--verbose",...c,...i,...d,...l],stdinMessage:t}},extractText(t){return io(t)??t.trim()},extractPartialText(t){return io(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 Le(`Claude rate limit: ${n.rateLimitType??"unknown"} (status: ${n.status})`)}if(e.error==="rate_limit"){let n=Gi(e);return new Le(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(Wi(n))return new Le(`Claude rate limit: ${n}`)}}catch{}return null},parseResultMeta(t){let e=t.split(`
|
|
306
|
-
`);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,l=d?Object.keys(d)[0]??null:null;return {usage:i,model:l}}}catch{}let n=so(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=pe(n,e??new Date().toISOString()),d=[];for(let l of s){let c=zi(i,l);c&&d.push(c);}return d},suppressOutputLine(t){let e=t.trim();if(!e.startsWith("{")||!e.endsWith("}"))return false;try{let r=JSON.parse(e).type;return r?ji.has(r):!1}catch{return false}}};function Gi(t){let n=t.message?.content;return Array.isArray(n)?n.map(r=>typeof r.text=="string"?r.text.trim():"").filter(Boolean).join(`
|
|
337
|
+
LIMIT ${eo+1}
|
|
338
|
+
`),c=u.length>eo;return {edges:u.slice(0,eo).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:c}}catch(s){throw new f("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:u,metadata:c,...l})=>({...l,status:pt({status:l.status,error:u,metadata:c})}))}catch(r){throw new f("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 c of i){if(!c.thread_id)continue;let l={id:c.id,agentId:c.agent_id,status:c.status,prompt:c.prompt,startedAt:c.started_at,completedAt:c.completed_at},p=d.get(c.thread_id);p?p.push(l):d.set(c.thread_id,[l]);}let u=[];for(let[c,l]of d){let p=l.filter(g=>g.agentId===e.targetAgentId).length;p<2||u.push({threadId:c,targetAgentTurnCount:p,turns:l});}return u.sort((c,l)=>{let p=c.turns[c.turns.length-1].startedAt,g=l.turns[l.turns.length-1].startedAt;return p<g?1:p>g?-1:0}),u.slice(0,r).map(c=>({threadId:c.threadId,targetAgentTurnCount:c.targetAgentTurnCount,turns:c.turns.slice(-o)}))}catch(r){throw new f("DB_ERROR","Failed to find thread chains",r)}finally{n.close();}}};});h();h();h();var Je=class{detach(e){}};h();function ko(t){let e=n=>String(n).padStart(2,"0");return `${t.getFullYear()}${e(t.getMonth()+1)}${e(t.getDate())}T${e(t.getHours())}${e(t.getMinutes())}${e(t.getSeconds())}`}function ar(t){let e=t.toISOString();return `${e.slice(0,10)} ${e.slice(11,19)} UTC`}var dr=class extends Je{name="file-logger";unsubs=[];logFiles=new Map;logsDir;version;constructor(e){super(),this.logsDir=join(e?.workspaceRoot??process.cwd(),".crewx","logs"),this.version=e?.version??"unknown";}attach(e){this.unsubs.push(e.on("task:start",n=>{try{existsSync(this.logsDir)||mkdirSync(this.logsDir,{recursive:!0});let r=ko(n.timestamp),o=join(this.logsDir,`${r}_${n.traceId}.log`);this.logFiles.set(n.traceId,o);let s=`=== TASK LOG: ${n.traceId} ===
|
|
339
|
+
CrewX Version: ${this.version}
|
|
340
|
+
Mode: ${n.mode}
|
|
341
|
+
Agent: ${n.agentRef}
|
|
342
|
+
Started: ${ar(n.timestamp)}
|
|
343
|
+
Message: ${n.message}
|
|
307
344
|
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
`).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}var Pn={command:"codex",meta:{displayName:"Codex",models:Gr(),capabilities:{resume:true}},buildArgs(t,e,n){let{model:r,effort:o}=We(e.model),s=e.effort??o,i=e.resumeSessionId?Jr(e.mode):Kr(e.mode),d=Yr(s),l=r?["-m",r]:[],c=Yi(e.additionalArgs??[]),g=c.includes("--json")||c.includes("--experimental-json")?[]:["--json"];return e.resumeSessionId?{args:["exec","resume",...g,...i,...d,...l,...c,e.resumeSessionId,"-"],stdinMessage:t}:{args:["exec",...g,...i,...d,...l,...c],stdinMessage:t}},extractText(t){return lo(t)??t.trim()},extractPartialText(t){return lo(t)},parseResultMeta(t){let e=nt(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=Ji(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 l=pe(i,n),c=i.item;if(c){if(d==="item.started"){r.push(...Xi(l,c));continue}if(d==="item.completed"){let u=Qi(l,c);u&&r.push(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?Ki.has(r):!1}catch{return false}}};function Xi(t,e){let n=e.type;if(n==="command_execution"){let r=String(e.command||"");return Re(r)?[Ie(t,r)]:[{timestamp:t,type:"tool_use",toolName:"Bash",toolInput:r}]}return n==="web_search"?[]:n==="file_change"?[]:[]}function Qi(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=Zi(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",...Me(r,o)}}if(n==="tool_use"){let r=String(e.name||e.tool_name||""),o=e.input,s=ve(o);return r==="Bash"&&Re(s)?Ie(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",...Me(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 Zi(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=ve(o);return r==="Bash"&&Re(s)?Ie(t,s):{timestamp:t,type:"tool_use",toolName:r,toolInput:s}}return null}var ea=new Set(["step_start","step_finish"]),rt="cli/opencode",po="OpenCode provider error",go=240,ta={build:{agent:"build",autoApprove:false},"build-auto":{agent:"build",autoApprove:true},plan:{agent:"plan",autoApprove:false},"plan-auto":{agent:"plan",autoApprove:true}};function na(t){return t?ta[t]??{agent:"build",autoApprove:false}:{agent:void 0,autoApprove:false}}function Kt(t,e){return t.some(n=>n===e||n.startsWith(`${e}=`))}function fo(t){let e=[],n=0,r=false,o=false,s=0;for(let d=0;d<t.length;d++){let l=t[d];if(o){o=false;continue}if(l==="\\"&&r){o=true;continue}if(l==='"'){r=!r;continue}if(!r){if(l==="{")n++;else if(l==="}"&&(n--,n===0)){let c=t.slice(s,d+1).trim();c&&e.push(c),s=d+1;}}}let i=t.slice(s).trim();return i&&e.push(i),e}function ot(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function ra(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);ot(i)?e.push(i):n=!0;continue}catch{}let s=fo(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);ot(d)?e.push(d):n=!0;}catch{n=true;}}return {events:e,malformed:n}}function Xe(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,go).trim()}function ho(t){let e=ot(t.error)?t.error:void 0,n=e&&ot(e.data)?e.data:void 0,r=Xe(e?.name),o=Xe(n?.message)??Xe(e?.message)??Xe(t.message)??Xe(t.errorMessage)??Xe(t.error),s=Xe(t.ref),i=r&&o&&r!==o?`${r}: ${o}`:r??o??po;return (s?`${i} (ref: ${s})`:i).slice(0,go)}function co(t){let e=ra(t),n=[],r=null,o=0,s=[],i,d=false;for(let l of e.events){let c=typeof l.type=="string"?l.type:void 0;if(c){if(c==="text"){let u=ot(l.part)?l.part:void 0,g=typeof u?.text=="string"?u.text:void 0;g?.trim()&&n.push(g.trim());continue}if(c==="result"){typeof l.result=="string"&&(r=l.result);continue}if(c==="tool_use"){o++;continue}if(c==="error"){s.push(ho(l));continue}if(c==="step_finish"){d=true;let u=ot(l.part)?l.part:void 0;i=typeof u?.reason=="string"?u.reason:void 0;}}}return {...e,texts:n,resultText:r,toolUseCount:o,errorMessages:s,terminalReason:i,hasTerminal:d}}function mo(t){return (t??"unknown").trim().toLowerCase().replace(/_/g,"-")}function Jt(){return new z("OpenCode returned no assistant output.",rt,{code:"EMPTY_OUTPUT",kind:"transient"})}function oa(){return new z("OpenCode emitted malformed JSON output.",rt,{code:"PROVIDER_CRASHED",kind:"transient"})}function uo(t,e){switch(mo(t)){case "length":return new z("OpenCode stopped because the context window was exceeded.",rt,{code:"UNKNOWN",kind:"permanent"});case "content-filter":return new z("OpenCode stopped because the content filter blocked the response.",rt,{code:"UNKNOWN",kind:"permanent"});case "error":return new z(e?`OpenCode error: ${e}`:`${po} while generating a response.`,rt,{code:"PROVIDER_CRASHED",kind:"transient"});default:return null}}var Ln={command:"opencode",meta:{displayName:"OpenCode",capabilities:{resume:true}},buildArgs(t,e,n){let r=e.additionalArgs,o=r!==void 0?[...r]:["run"];Kt(o,"--format")||o.push("--format","json"),e.resumeSessionId&&!o.includes("-s")&&!o.includes("--session")&&o.push("-s",e.resumeSessionId);let{agent:s,autoApprove:i}=na(e.mode);Kt(o,"--agent")||s!==void 0&&o.push("--agent",s),i&&!Kt(o,"--auto")&&o.push("--auto"),e.effort!==void 0&&!Kt(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=co(t),n=e.errorMessages[0];if(n){let i=uo("error",n);if(i)throw i}let r=uo(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 Jt();return o}if(e.resultText?.trim()){if(!e.hasTerminal)throw Jt();return e.resultText}if(e.malformed)throw oa();if(!e.hasTerminal)throw Jt();let s=mo(e.terminalReason);if((s==="stop"||s==="tool-calls")&&e.toolUseCount>0)return "";throw Jt()},interpretExit(t,e,n=""){if(t===0)return null;let o=co(n).errorMessages[0];return o?new z(`OpenCode error: ${o}`,rt,{code:"PROVIDER_CRASHED",kind:"transient"}):null},parseResultMeta(t){let e=nt(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=fo(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=pe(i,n),l=i.type;if(l){if(l==="text"){let u=i.part?.text;u&&r.push({timestamp:d,type:"text",content:u});continue}if(l==="tool_use"){let c=i.part;if(!c)continue;let u=String(c.tool||""),g=String(c.callID||""),f=c.state,m=String(f?.status||""),I=f?.input,S=ve(I);if(r.push({timestamp:d,type:"tool_use",toolName:u,toolUseId:g,toolInput:S}),m==="completed"&&f?.output!==void 0){let v=f.output,$=typeof v=="string"?v:JSON.stringify(v);r.push({timestamp:d,type:"tool_result",toolUseId:g,resultPreview:$,isError:false});}else m==="error"&&r.push({timestamp:d,type:"tool_result",toolUseId:g,resultPreview:String(f?.error||"tool error"),isError:true});continue}if(l==="error"){let c=ho(i);r.push({timestamp:d,type:"error",content:c,errorMessage:c});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?ea.has(r):!1}catch{return false}}};var Mn="antigravity";function Tt(t,e){return t.some(n=>n===e||n.startsWith(`${e}=`))}function sa(t,e){if(!(t?Ge(Mn).some(s=>s.id===t):false)||!t)return e;let r=yt(Mn,t),o=Br(Mn)[t]?.defaultEffort;if(r.length!==0)return e?r.includes(e)?e:o&&r.includes(o)?o:void 0:o}var $n={command:"agy",meta:{displayName:"Antigravity",models:zr(),defaultTimeoutMs:{query:12e4,execute:3e5},defaultIdleMs:0},buildArgs(t,e,n){let{model:r,effort:o}=We(e.model),s=bn(r),i=s.model,d=e.effort??o??s.effort,l=sa(i,d),c=e.additionalArgs??[],u=i&&!Tt(c,"--model")?["--model",i]:[],g=Tt(c,"--effort")?[]:oo(l),f=Tt(c,"--mode")||Tt(c,"--dangerously-skip-permissions")?[]:ro(e.mode),m=Tt(c,"--print")?[]:["--print",t];return {args:[...u,...g,...f,...c,...m]}},extractText(t){let e=t.trim();if(!e)throw new z("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 Yt="cli/grok",aa=new Set(["available_commands","usage","end"]),da=/(?:rate[\s_-]*limit|quota|usage[\s_-]*limit|too many requests|limit(?:ed|ing)?\s+(?:exceeded|reached))/i,la=/\u001b\[[0-?]*[ -/]*[@-~]/g,_o=20,ko=4e3,yo="\u2026";function st(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Xt(t){return st(t)?t:void 0}function Y(t){return typeof t=="string"?t:void 0}function Qe(t){let e=typeof t=="number"?t:Number(t??0);return Number.isFinite(e)?e:0}function ca(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 wt(t){let e=t.trim();if(!e)return [];try{let n=JSON.parse(e);return st(n)?[n]:[]}catch{return ca(e).flatMap(n=>{try{let r=JSON.parse(n);return st(r)?[r]:[]}catch{return []}})}}function Et(t){let e=JSON.stringify(t);return e===void 0?String(t):e}function Rt(t){if(typeof t=="string")return t;if(Array.isArray(t)){let e=t.map(Rt).filter(n=>n!==void 0);return e.length>0?e.join(`
|
|
312
|
-
`):void 0}if(st(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=Rt(t[e]);if(n!==void 0)return n}}}function ua(t){if(t.rawOutput!==null&&t.rawOutput!==void 0)return Rt(t.rawOutput)??Et(t.rawOutput);if(t.content!==null&&t.content!==void 0)return Rt(t.content)??Et(t.content);if(t.result!==null&&t.result!==void 0)return Rt(t.result)??Et(t.result)}function wo(t){let e=Xt(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?Eo(n):"Grok CLI reported an error."}function Eo(t){return (t.replace(la,"").split(/\r?\n/).map(n=>n.trim()).filter(Boolean)[0]??t.trim()).slice(0,500)}function To(t){return da.test(t)}function pa(t){let e=Xt(t.modelUsage);return e?Object.keys(e)[0]??null:null}function ga(t){let e=Xt(t.usage);if(!e)return null;let n=Qe(e.cache_read_input_tokens);return {inputTokens:Qe(e.input_tokens)+n,cachedInputTokens:n,outputTokens:Qe(e.output_tokens),costUsd:Qe(t.total_cost_usd)}}function fa(t){let e=0,n=0,r=0,o=false,s=new Set;for(let i of t.split(`
|
|
313
|
-
`).flatMap(wt)){if(i.type!=="usage")continue;let d=Xt(i.usage);if(!d)continue;let l=Y(i.signature);if(l&&l.length>0){let u=`signature:${l}`;if(s.has(u))continue;s.add(u);}let c=Qe(d.cache_read_input_tokens);e+=Qe(d.input_tokens)+c,n+=c,r+=Qe(d.output_tokens),o=true;}return o?{inputTokens:e,cachedInputTokens:n,outputTokens:r,costUsd:0}:null}function ha(t,e){if(!Array.isArray(e.entries)||e.entries.length===0)return [];let n=[];for(let s of e.entries.slice(0,_o)){if(!st(s))continue;let i=Y(s.content)?.trim();if(!i)continue;let d=Y(s.status)?.trim(),l=Y(s.priority)?.trim(),c=[d?`status=${d}`:void 0,l?`priority=${l}`:void 0].filter(g=>!!g),u=c.length>0?` (${c.join(", ")})`:"";n.push(`- ${i}${u}`);}if(n.length===0)return [];e.entries.length>_o&&n.push(yo);let r=n.join(`
|
|
314
|
-
`),o=r.length>ko?`${r.slice(0,ko-1)}${yo}`:r;return [{timestamp:t,type:"info",content:o}]}function ma(t,e){let n=Y(e.type);if(n==="thought"){let r=Y(e.data);return r===void 0?[]:[{timestamp:t,type:"thinking",content:r}]}if(n==="text"){let r=Y(e.data);return r===void 0?[]:[{timestamp:t,type:"text",content:r}]}if(n==="plan")return ha(t,e);if(n==="tool_call"){let r=Y(e.toolCallId),o=Y(e.toolName)??Y(e.title),s=e.rawInput===void 0?void 0:Et(e.rawInput);return [{timestamp:t,type:"tool_use",toolUseId:r,toolName:o,toolInput:s}]}if(n==="tool_call_update"){let r=Y(e.status);return r!=="completed"&&r!=="failed"&&r!=="error"?[]:[{timestamp:t,type:"tool_result",toolUseId:Y(e.toolCallId),toolName:Y(e.toolName)??Y(e.title),resultPreview:ua(e),isError:r!=="completed"||e.isError===true}]}if(n==="error"){let r=wo(e);return [{timestamp:t,type:"error",content:r,errorMessage:r}]}return []}var Hn={command:"grok",createSessionId:()=>randomUUID(),meta:{displayName:"Grok",capabilities:{resume:true}},buildArgs(t,e){let{model:n,effort:r}=We(e.model),o=e.effort??r,s=e.resumeSessionId?["--resume",e.resumeSessionId]:e.providerSessionId?["--session-id",e.providerSessionId]:[],i=n?["--model",n]:[],d=n?Ge("grok").some(de=>de.id===n):false,l=n&&d?yt("grok",n):[],c=!o||l.length===0||l.includes(o)?o:void 0,u=no(c),g=e.additionalArgs??[],f=de=>g.some(te=>te===de||te.startsWith(`${de}=`)),m=e.providerOptions,I=m?.alwaysApprove,S=m?.sandbox,v=f("--permission-mode")?[]:Zr(e.mode),$=f("--always-approve")?[]:eo(I),j=f("--sandbox")?[]:to(S);return {args:["--no-auto-update",...s,"--single",t,"--output-format","streaming-json","--no-alt-screen",...i,...u,...v,...$,...j,...g]}},extractText(t){let e=[],n=false;for(let r of t.split(`
|
|
315
|
-
`).flatMap(wt))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 wt(t))if(e.type==="error"){let n=wo(e);return To(Et(e))?new Le(n,Yt):new z(n,Yt)}return null},interpretExit(t,e){if(t===0)return null;let n=Eo(e)||`Grok CLI exited with code ${t}.`;return To(e)?new Le(n,Yt):new z(n,Yt)},parseResultMeta(t){let n=t.split(`
|
|
316
|
-
`).flatMap(wt).find(r=>r.type==="end");return n?{usage:ga(n),model:pa(n)}:{usage:fa(t),model:null}},parseEvent(t,e){let n=e??new Date().toISOString();return wt(t).flatMap(r=>ma(pe(r,n),r))},suppressOutputLine(t){let e=t.trim();if(!e.startsWith("{")||!e.endsWith("}"))return false;try{let n=JSON.parse(e);return st(n)&&typeof n.type=="string"?aa.has(n.type):!1}catch{return false}}};var Ro={codex:Pn,claude:Nn,opencode:Ln,antigravity:$n,copilot:Dn,grok:Hn};function Io(t){if(t.startsWith("cli/"))return Ro[t.slice(4)]}function _a(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?va[e]:void 0;return s?s(r,o):Object.values(Ao).some(i=>i(r,o))}function Qt(t,e){let n=t.split(`
|
|
317
|
-
`).filter(r=>r.trim());return n.length===0?false:n.every(r=>_a(r,e))}function ie(t){return typeof t=="object"&&t!==null}function vo(t,e){if(e==="assistant"||e==="user"){let n=t.message;return ie(n)&&Array.isArray(n.content)}return e==="system"?typeof t.subtype=="string"||typeof t.session_id=="string":e==="result"?typeof t.result=="string"||ie(t.usage)||typeof t.total_cost_usd=="number"||typeof t.is_error=="boolean":e==="rate_limit_event"?ie(t.rate_limit_info):e==="tool_progress"?t.heartbeat===true&&typeof t.tool_use_id=="string":false}function ka(t,e){return typeof t.session_id=="string"||typeof t.uuid=="string"?true:vo(t,e)}function ya(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 ie(n)&&typeof n.type=="string"}return false}function Ta(t,e){return e==="step_start"||e==="step_finish"?typeof t.stepID=="string"||typeof t.sessionID=="string"||ie(t.part):e==="text"||e==="tool_use"?ie(t.part):e==="result"?typeof t.result=="string":false}function wa(t,e){return !!(typeof t.stepID=="string"||typeof t.sessionID=="string"||ie(t.part)||e==="result"&&typeof t.result=="string")}function Ea(t,e){return e.startsWith("assistant.")||e.startsWith("tool.execution")||e==="user.message"?ie(t.data):e==="result"?typeof t.result=="string":false}function Ra(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 Ia(t,e){return e==="available_commands"?ie(t.tools)||ie(t.commands):e==="usage"?ie(t.usage):e==="end"?typeof t.sessionId=="string"||typeof t.stopReason=="string"||ie(t.usage):e==="tool_call_update"?typeof t.toolCallId=="string"||typeof t.status=="string":false}var Ao={claude:vo,codex:ya,opencode:Ta,copilot:Ea,gemini:Ra},va={...Ao,claude:ka,opencode:wa,grok:Ia,antigravity:()=>false};var xa=200,Sa=200;function Oa(t){if(typeof t!="object"||t===null||!("code"in t))return;let e=t.code;return typeof e=="string"&&e.length>0?e:void 0}function ba(t){let e=t instanceof p?t.code:void 0,n=t instanceof p?t.cause:t,r=Oa(n);return {code:e??r??"DB_ERROR",cause:r??(n instanceof Error?n.name:e??typeof n)}}function So(t){return Buffer.byteLength(JSON.stringify(t),"utf8")}function Ca(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Na(t){if(!t)return {};try{let e=JSON.parse(t);return Ca(e)?e:{}}catch{return {}}}function Oo(t){return typeof t=="number"&&Number.isFinite(t)?Math.trunc(t):0}var Fn=class extends Ue{name="sqlite-tracing";unsubs=[];dbPath;version;taskRepo;queues=new Map;metrics={flushCount:0,flushedEntries:0,maxQueueEntries:0,maxQueueBytes:0,appendFailureCount:0,appendFailureEntries:0,appendFailureBytes:0,appendFailureByCode:{},appendFailureByCause:{}};constructor(e){super(),this.dbPath=join(e?.dbRoot??homedir(),".crewx","crewx.db"),this.version=e?.version??"unknown";}attach(e){let n=new Gt({dbPath:this.dbPath});n.resolveDbPath(),this.taskRepo=n;let r=process.cwd(),s=existsSync(join(r,"crewx.yaml"))||existsSync(join(r,"crewx.yml"))?or(r):null,i=process.argv.join(" ");this.unsubs.push(e.on("task:start",d=>{try{let l=d.callerAgentId??null,c=d.parentTaskId??null,u=d.rootTraceId??d.traceId,g=d.metadata?JSON.stringify(d.metadata):JSON.stringify({provider:d.provider??"cli/claude"});n.startTask({id:d.traceId,agentId:d.agentRef.replace(/^@/,""),prompt:d.message,mode:d.mode,status:"running",pid:d.pid??null,startedAt:d.timestamp.toISOString(),crewxVersion:this.version,platform:d.platform??"cli",model:d.model??null,renderedPrompt:d.renderedPrompt??null,command:i,codingAgentCommand:d.codingAgentCommand??null,workspaceId:d.workspaceId??s,projectId:d.projectId??null,callerAgentId:l,parentTaskId:c,traceId:u,metadata:g,threadId:d.threadId??null});}catch{}}),e.on("task:output",d=>{try{this.enqueueLog(d.traceId,{timestamp:d.timestamp.toISOString(),level:d.level??"stdout",message:d.output});}catch(l){let c={timestamp:d.timestamp.toISOString(),level:d.level??"stdout",message:d.output};this.recordAppendFailure(l,[c],So(c));}}),e.on("task:end",d=>{try{this.flushTaskLogs(d.traceId);let l=typeof d.metadata?.runEpoch=="number"?d.metadata.runEpoch:null,c=d.error?JSON.stringify({code:d.error.code,message:d.error.message,...d.error.providerCode?{providerCode:d.error.providerCode}:{},...d.error.mode?{mode:d.error.mode}:{}}):null,u=d.result??null,g=!1;if(d.error&&(!u||u.trim()==="")){let f=this.recoverPartialResult(d.traceId,d,l);f&&(u=f,g=!0);}n.finishTask({id:d.traceId,status:d.error?"failed":"success",result:u,error:c,completedAt:d.timestamp.toISOString(),durationMs:d.durationMs,exitCode:d.exitCode??null,inputTokens:d.inputTokens??0,outputTokens:d.outputTokens??0,cachedInputTokens:d.cachedInputTokens??0,costUsd:d.costUsd??0,model:d.model??null,runEpoch:l,partialResultRecovered:g});}catch{}}));}detach(e){try{this.flushAllTaskLogs();}finally{this.clearAllTimers(),this.unsubs.forEach(n=>n()),this.unsubs=[],this.queues.clear(),this.taskRepo=void 0;}}getMetrics(){let e=0,n=0;for(let r of this.queues.values())e+=r.entries.length,n+=r.bytes;return {...this.metrics,appendFailureByCode:{...this.metrics.appendFailureByCode},appendFailureByCause:{...this.metrics.appendFailureByCause},pendingQueueEntries:e,pendingQueueBytes:n}}enqueueLog(e,n){let r=this.queues.get(e);if(r||(r={entries:[],bytes:0},this.queues.set(e,r)),r.entries.push(n),r.bytes+=So(n),this.metrics.maxQueueEntries=Math.max(this.metrics.maxQueueEntries,r.entries.length),this.metrics.maxQueueBytes=Math.max(this.metrics.maxQueueBytes,r.bytes),r.entries.length>=xa){this.flushTaskLogs(e);return}if(!r.timer){let o=setTimeout(()=>{let s=this.queues.get(e);!s||s.timer!==o||(s.timer=void 0,this.flushTaskLogs(e));},Sa);r.timer=o;}}recoverPartialResult(e,n,r){try{let o=this.taskRepo?.getTask(e);if(!o||o.status!=="running"||Oo(o.run_epoch)!==Oo(r))return;let s=Na(o.metadata),i=typeof s.provider=="string"?s.provider:typeof n.metadata?.provider=="string"?n.metadata.provider:void 0;if(!i)return;let d=Io(i);if(!d?.extractPartialText)return;let c=this.taskRepo?.readLogs(e)?.entries.filter(g=>g.level==="stdout").map(g=>g.message).join(`
|
|
318
|
-
`)??"";if(!c.trim())return;let u=d.extractPartialText(c);return !u||!u.trim()||Qt(u,i)?void 0:u}catch{return}}flushTaskLogs(e){let n=this.queues.get(e);if(!n||n.entries.length===0){n?.timer&&clearTimeout(n.timer),this.queues.delete(e);return}n.timer&&(clearTimeout(n.timer),n.timer=void 0);let r=n.entries,o=n.bytes;n.entries=[],n.bytes=0,this.metrics.flushCount+=1;try{this.taskRepo?.appendLogs(e,r),this.metrics.flushedEntries+=r.length;}catch(i){this.recordAppendFailure(i,r,o);}let s=this.queues.get(e);s&&s.entries.length===0&&(s.timer&&clearTimeout(s.timer),this.queues.delete(e));}flushAllTaskLogs(){for(let e of [...this.queues.keys()])this.flushTaskLogs(e);}clearAllTimers(){for(let e of this.queues.values())e.timer&&(clearTimeout(e.timer),e.timer=void 0);}recordAppendFailure(e,n,r){let o=ba(e);this.metrics.appendFailureCount+=1,this.metrics.appendFailureEntries+=n.length,this.metrics.appendFailureBytes+=r,this.metrics.appendFailureByCode[o.code]=(this.metrics.appendFailureByCode[o.code]??0)+1,this.metrics.appendFailureByCause[o.cause]=(this.metrics.appendFailureByCause[o.cause]??0)+1,console.warn("[crewx] sqlite tracing append failed",{code:o.code,cause:o.cause,pendingEntries:n.length,pendingBytes:r});}};var it=class extends p{reason;constructor(e,n=e){super("VALIDATION",n),this.name="ThreadTitleMetadataPatchError",this.reason=e;}};function It(t){if(!t)return {};try{let e=JSON.parse(t);return !e||typeof e!="object"||Array.isArray(e)?{}:e}catch{return {}}}function $a(t){let n=It(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 Zt=class extends ne{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 p("NOT_FOUND","Database not found");let r=L(n);if(e)try{he(r.db,n);}catch(o){throw r.close(),o}return r}validateWorkspaceId(e,n){return e.db.select({id:et.id}).from(et).where(eq(et.id,n)).limit(1).get()?n:null}topLevelTaskPredicateSql(e="child"){return sql.raw(`NOT EXISTS (
|
|
345
|
+
`;writeFileSync(o,s,{encoding:"utf8",mode:384});}catch{}}),e.on("task:output",n=>{try{let r=this.logFiles.get(n.traceId);if(!r)return;let o=new Date().toISOString();appendFileSync(r,`[${o}] STDOUT: ${n.output}
|
|
346
|
+
`,"utf8");}catch{}}),e.on("task:end",n=>{try{let r=this.logFiles.get(n.traceId);if(!r)return;let o=ar(new Date),s=n.error?`failed: ${n.error.message}`:"completed successfully",i=`[${o}] INFO: Task ${s} in ${n.durationMs}ms
|
|
347
|
+
[${o}] INFO: Process closed with exit code: ${n.error?1:0}
|
|
348
|
+
`;appendFileSync(r,i,"utf8"),this.logFiles.delete(n.traceId);}catch{}}));}detach(e){this.unsubs.forEach(n=>n()),this.unsubs=[],this.logFiles.clear();}};h();h();function ca(t){let e=_e.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 Eo(t){let e=ca(t);return createHash("sha256").update(e).digest("hex")}nt();Qr();h();function Xu(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?oc[e]:void 0;return s?s(r,o):Object.values(Di).some(i=>i(r,o))}function Jn(t,e){let n=t.split(`
|
|
349
|
+
`).filter(r=>r.trim());return n.length===0?false:n.every(r=>Xu(r,e))}function ge(t){return typeof t=="object"&&t!==null}function Ni(t,e){if(e==="assistant"||e==="user"){let n=t.message;return ge(n)&&Array.isArray(n.content)}return e==="system"?typeof t.subtype=="string"||typeof t.session_id=="string":e==="result"?typeof t.result=="string"||ge(t.usage)||typeof t.total_cost_usd=="number"||typeof t.is_error=="boolean":e==="rate_limit_event"?ge(t.rate_limit_info):e==="tool_progress"?t.heartbeat===true&&typeof t.tool_use_id=="string":false}function Yu(t,e){return typeof t.session_id=="string"||typeof t.uuid=="string"?true:Ni(t,e)}function Qu(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 ge(n)&&typeof n.type=="string"}return false}function Zu(t,e){return e==="step_start"||e==="step_finish"?typeof t.stepID=="string"||typeof t.sessionID=="string"||ge(t.part):e==="text"||e==="tool_use"?ge(t.part):e==="result"?typeof t.result=="string":false}function ec(t,e){return !!(typeof t.stepID=="string"||typeof t.sessionID=="string"||ge(t.part)||e==="result"&&typeof t.result=="string")}function tc(t,e){return e.startsWith("assistant.")||e.startsWith("tool.execution")||e==="user.message"?ge(t.data):e==="result"?typeof t.result=="string":false}function nc(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 rc(t,e){return e==="available_commands"?ge(t.tools)||ge(t.commands):e==="usage"?ge(t.usage):e==="end"?typeof t.sessionId=="string"||typeof t.stopReason=="string"||ge(t.usage):e==="tool_call_update"?typeof t.toolCallId=="string"||typeof t.status=="string":false}var Di={claude:Ni,codex:Qu,opencode:Zu,copilot:tc,gemini:nc},oc={...Di,claude:Yu,opencode:ec,grok:rc,antigravity:()=>false};Gr();tn();Yr();Cn();var ic=200,ac=200;function dc(t){if(typeof t!="object"||t===null||!("code"in t))return;let e=t.code;return typeof e=="string"&&e.length>0?e:void 0}function uc(t){let e=t instanceof f?t.code:void 0,n=t instanceof f?t.cause:t,r=dc(n);return {code:e??r??"DB_ERROR",cause:r??(n instanceof Error?n.name:e??typeof n)}}function Li(t){return Buffer.byteLength(JSON.stringify(t),"utf8")}function cc(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Mi(t){if(!t)return {};try{let e=JSON.parse(t);return cc(e)?e:{}}catch{return {}}}function Yn(t){return typeof t=="number"&&Number.isFinite(t)?Math.trunc(t):0}var lc=new Set(["workflow","mcp"]),so=class extends Je{name="sqlite-tracing";unsubs=[];dbPath;version;runnerIdentity;taskRepo;heartbeatTaskIds=new Set;ignoredDetachedTaskIds=new Set;queues=new Map;metrics={flushCount:0,flushedEntries:0,maxQueueEntries:0,maxQueueBytes:0,appendFailureCount:0,appendFailureEntries:0,appendFailureBytes:0,appendFailureByCode:{},appendFailureByCause:{}};constructor(e){super();let n=process.env.CREWX_DB||process.env.CREWX_TRACES_DB;this.dbPath=e?.dbRoot!==void 0?join(e.dbRoot,".crewx","crewx.db"):n??join(homedir(),".crewx","crewx.db"),this.version=e?.version??"unknown";let r=e?.runnerIdentity;this.runnerIdentity={detachedRunner:r?.detachedRunner===true,assignedTaskId:r?.detachedRunner===true&&r.assignedTaskId?.trim()||void 0};}attach(e){let n=new un({dbPath:this.dbPath});n.resolveDbPath(),this.taskRepo=n;let r=process.cwd(),s=existsSync(join(r,"crewx.yaml"))||existsSync(join(r,"crewx.yml"))?Eo(r):null,i=process.argv.join(" ");this.unsubs.push(e.on("task:start",d=>{try{let u=d.callerAgentId??null,c=d.parentTaskId??null,l=d.rootTraceId??d.traceId,{detachedRunner:p,assignedTaskId:g}=this.runnerIdentity,m=g??d.traceId,I=Yn(d.metadata?.runEpoch),y=p?n.getTask(m):void 0,k=d.pid??null,D={...d.metadata??{provider:d.provider??"cli/claude"},ownership:p?"runner":"caller",...p&&k!==null?{providerPid:k}:{}},L=JSON.stringify(D);if(p&&y?.status==="running"&&y.pid!==null&&I===0){this.ignoredDetachedTaskIds.add(m);return}n.startTask({id:m,agentId:d.agentRef.replace(/^@/,""),prompt:d.message,mode:d.mode,status:"running",pid:p?process.pid:k,startedAt:d.timestamp.toISOString(),crewxVersion:this.version,platform:d.platform??"cli",model:d.model??null,renderedPrompt:d.renderedPrompt??null,command:i,codingAgentCommand:d.codingAgentCommand??null,workspaceId:d.workspaceId??s,projectId:d.projectId??null,callerAgentId:u,parentTaskId:c,traceId:l,metadata:L,threadId:d.threadId??null}),n.updateTaskOwnership({id:m,runEpoch:I,ownership:p?"runner":"caller",...p?{providerPid:k}:{}}),lc.has(d.platform??"cli")||Ei(n,{taskId:m,runEpoch:I,onStopRequested:O=>this.handleStopRequested(n,O)})&&this.heartbeatTaskIds.add(m);}catch{}}),e.on("task:output",d=>{try{let u=this.resolveTaskId(d.traceId);if(this.ignoredDetachedTaskIds.has(u))return;this.enqueueLog(u,{timestamp:d.timestamp.toISOString(),level:d.level??"stdout",message:d.output});}catch(u){let c={timestamp:d.timestamp.toISOString(),level:d.level??"stdout",message:d.output};this.recordAppendFailure(u,[c],Li(c));}}),e.on("task:end",d=>{try{let u=this.resolveTaskId(d.traceId);if(this.ignoredDetachedTaskIds.delete(u))return;let c=typeof d.metadata?.runEpoch=="number"?d.metadata.runEpoch:null;en(u,c)&&this.heartbeatTaskIds.delete(u),this.flushTaskLogs(u);let p=d.error?JSON.stringify({code:d.error.code,message:d.error.message,...d.error.providerCode?{providerCode:d.error.providerCode}:{},...d.error.mode?{mode:d.error.mode}:{}}):null,g=d.result??null,m=!1;if(d.error&&(!g||g.trim()==="")){let I=this.recoverPartialResult(u,d,c);I&&(g=I,m=!0);}n.finishTask({id:u,status:d.error?"failed":"success",result:g,error:p,completedAt:d.timestamp.toISOString(),durationMs:d.durationMs,exitCode:d.exitCode??null,inputTokens:d.inputTokens??0,outputTokens:d.outputTokens??0,cachedInputTokens:d.cachedInputTokens??0,costUsd:d.costUsd??0,model:d.model??null,runEpoch:c,partialResultRecovered:m});}catch{}}));}detach(e){try{this.flushAllTaskLogs();}finally{this.clearAllTimers();for(let n of this.heartbeatTaskIds)en(n);this.heartbeatTaskIds.clear(),this.unsubs.forEach(n=>n()),this.unsubs=[],this.queues.clear(),this.ignoredDetachedTaskIds.clear(),this.taskRepo=void 0;}}getMetrics(){let e=0,n=0;for(let r of this.queues.values())e+=r.entries.length,n+=r.bytes;return {...this.metrics,appendFailureByCode:{...this.metrics.appendFailureByCode},appendFailureByCause:{...this.metrics.appendFailureByCause},pendingQueueEntries:e,pendingQueueBytes:n}}resolveTaskId(e){return this.runnerIdentity.detachedRunner?this.runnerIdentity.assignedTaskId??e:e}enqueueLog(e,n){let r=this.queues.get(e);if(r||(r={entries:[],bytes:0},this.queues.set(e,r)),r.entries.push(n),r.bytes+=Li(n),this.metrics.maxQueueEntries=Math.max(this.metrics.maxQueueEntries,r.entries.length),this.metrics.maxQueueBytes=Math.max(this.metrics.maxQueueBytes,r.bytes),r.entries.length>=ic){this.flushTaskLogs(e);return}if(!r.timer){let o=setTimeout(()=>{let s=this.queues.get(e);!s||s.timer!==o||(s.timer=void 0,this.flushTaskLogs(e));},ac);r.timer=o;}}recoverPartialResult(e,n,r){try{let o=this.taskRepo;if(!o)return;let s=o.getTask(e);if(!s||s.status!=="running"||Yn(s.run_epoch)!==Yn(r))return;let i=Mi(s.metadata),d=typeof i.provider=="string"?i.provider:typeof n.metadata?.provider=="string"?n.metadata.provider:void 0;if(!d)return;let u=Bn({taskLogRepository:o,taskId:e,provider:d,model:s.model});if(!u?.adapter.extractPartialText)return;let c=u.adapter.extractPartialText(u.stdout);return !c||!c.trim()||Jn(c,d)?void 0:c}catch{return}}async handleStopRequested(e,n){let r=n.id;if(!r)return;let o=Yn(n.run_epoch),s=Mi(n.metadata??null),i=s.ownership==="runner"?"runner":"caller";if(i==="runner"&&n.pid!==process.pid){console.warn("[crewx] ignored stop request for task owned by another runner",{taskId:r});return}let d=typeof s.providerPid=="number"&&Number.isSafeInteger(s.providerPid)&&s.providerPid>0?s.providerPid:void 0,u=i==="runner"?d:typeof n.pid=="number"&&n.pid>0?n.pid:void 0;if(u!==void 0){let c;try{c=await On(u,{signal:"SIGTERM"});}catch(l){console.warn("[crewx] cooperative task stop failed",{taskId:r,cause:l instanceof Error?l.name:typeof l});return}if(c.status==="failed"){console.warn("[crewx] cooperative task stop failed",{taskId:r,cause:c.error??"process termination failed"});return}}try{let c=e.finalizeTaskStop({id:r,runEpoch:o,method:zn(n.stop_requested_at)}),l=e.getTask(r);(c||l?.status!=="running")&&en(r,o)&&this.heartbeatTaskIds.delete(r);}catch(c){console.warn("[crewx] cooperative task stop finalization failed",{taskId:r,cause:c instanceof Error?c.name:typeof c});}}flushTaskLogs(e){let n=this.queues.get(e);if(!n||n.entries.length===0){n?.timer&&clearTimeout(n.timer),this.queues.delete(e);return}n.timer&&(clearTimeout(n.timer),n.timer=void 0);let r=n.entries,o=n.bytes;n.entries=[],n.bytes=0,this.metrics.flushCount+=1;try{this.taskRepo?.appendLogs(e,r),this.metrics.flushedEntries+=r.length;}catch(i){this.recordAppendFailure(i,r,o);}let s=this.queues.get(e);s&&s.entries.length===0&&(s.timer&&clearTimeout(s.timer),this.queues.delete(e));}flushAllTaskLogs(){for(let e of [...this.queues.keys()])this.flushTaskLogs(e);}clearAllTimers(){for(let e of this.queues.values())e.timer&&(clearTimeout(e.timer),e.timer=void 0);}recordAppendFailure(e,n,r){let o=uc(e);this.metrics.appendFailureCount+=1,this.metrics.appendFailureEntries+=n.length,this.metrics.appendFailureBytes+=r,this.metrics.appendFailureByCode[o.code]=(this.metrics.appendFailureByCode[o.code]??0)+1,this.metrics.appendFailureByCause[o.cause]=(this.metrics.appendFailureByCause[o.cause]??0)+1,console.warn("[crewx] sqlite tracing append failed",{code:o.code,cause:o.cause,pendingEntries:n.length,pendingBytes:r});}};h();h();h();ot();ht();_t();nt();wt();jn();function Qn(t){return {...t,status:pt(t)}}function mc({metadata:t,...e}){return {...e,status:pt({...e,metadata:t})}}var Ct=class extends f{reason;constructor(e,n=e){super("VALIDATION",n),this.name="ThreadTitleMetadataPatchError",this.reason=e;}};function cn(t){if(!t)return {};try{let e=JSON.parse(t);return !e||typeof e!="object"||Array.isArray(e)?{}:e}catch{return {}}}function _c(t){let n=cn(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 Zn=class extends le{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 f("NOT_FOUND","Database not found");let r=j(n);if(e)try{be(r.db,n);}catch(o){throw r.close(),o}return r}validateWorkspaceId(e,n){return e.db.select({id:kt.id}).from(kt).where(eq(kt.id,n)).limit(1).get()?n:null}topLevelTaskPredicateSql(e="child"){return sql.raw(`NOT EXISTS (
|
|
319
350
|
SELECT 1 FROM tasks parent
|
|
320
351
|
WHERE parent.id = ${e}.parent_task_id
|
|
321
352
|
AND parent.thread_id = ${e}.thread_id
|
|
322
|
-
)`)}findAllThreads(e){let n=this.resolveDbPaths(),r=new Set,o=[];for(let s of n){if(!existsSync(s))continue;let i=
|
|
353
|
+
)`)}findAllThreads(e){let n=this.resolveDbPaths(),r=new Set,o=[];for(let s of n){if(!existsSync(s))continue;let i=j(s);try{let d=e?eq(_.workspace_id,e):void 0,u=i.db.select().from(_).where(d).orderBy(desc(_.updated_at)).all();for(let c of u)r.has(c.id)||(r.add(c.id),o.push(c));}catch(d){throw new f("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=j(i);try{let u=or$1(inArray(_.id,e),inArray(_.title,e)),c=n?and(u,eq(_.workspace_id,n)):u,l=d.db.select().from(_).where(c).orderBy(desc(_.updated_at)).all();for(let p of l)o.has(p.id)||(o.add(p.id),s.push(p));}catch(u){throw new f("DB_ERROR","Failed to find threads by ids or titles",u)}finally{d.close();}}return s}findThreadById(e,n){let r=this.resolveDbPaths();for(let o of r){if(!existsSync(o))continue;let s=j(o);try{let i=eq(_.id,e),d=n?and(i,eq(_.workspace_id,n)):i,u=s.db.select().from(_).where(d).limit(1).get()??void 0;if(u)return u}catch(i){throw new f("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=j(o);try{let i=eq(_.id,e),d=n?and(i,eq(_.workspace_id,n)):i;if(s.db.select({id:_.id}).from(_).where(d).limit(1).get())return !0}catch(i){throw new f("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,u=0,c=new Set;for(let l of r){if(!existsSync(l))continue;let p=j(l);try{let g=p.db.get(sql`
|
|
323
354
|
SELECT
|
|
324
355
|
count(*) AS cnt,
|
|
325
356
|
COALESCE(SUM(child.input_tokens), 0) AS total_input,
|
|
@@ -330,13 +361,13 @@ ${r.join(`
|
|
|
330
361
|
WHERE child.thread_id = ${e}
|
|
331
362
|
AND ${this.topLevelTaskPredicateSql()}
|
|
332
363
|
${n?sql`AND child.workspace_id = ${n}`:sql``}
|
|
333
|
-
`);
|
|
364
|
+
`);g&&(o+=g.cnt,s+=g.total_input,i+=g.total_output,d+=g.total_cached,u+=g.total_cost);let m=p.db.all(sql`
|
|
334
365
|
SELECT DISTINCT child.agent_id FROM tasks child
|
|
335
366
|
WHERE child.thread_id = ${e}
|
|
336
367
|
AND child.agent_id IS NOT NULL AND child.agent_id != ''
|
|
337
368
|
AND ${this.topLevelTaskPredicateSql()}
|
|
338
369
|
${n?sql`AND child.workspace_id = ${n}`:sql``}
|
|
339
|
-
`);for(let I of m)c.add(I.agent_id);}catch(
|
|
370
|
+
`);for(let I of m)c.add(I.agent_id);}catch(g){throw new f("DB_ERROR","Failed to aggregate task stats",g)}finally{p.close();}}return {taskCount:o,inputTokens:s,outputTokens:i,cachedInputTokens:d,costUsd:u,agentIds:Array.from(c)}}findTopLevelTasks(e,n,r){let o=this.resolveDbPaths(),s=new Set,i=[];for(let d of o){if(!existsSync(d))continue;let u=j(d);try{let c;r!==void 0?c=u.db.all(sql`
|
|
340
371
|
SELECT * FROM (
|
|
341
372
|
SELECT child.*,
|
|
342
373
|
ROW_NUMBER() OVER (PARTITION BY child.agent_id ORDER BY child.started_at DESC) AS rn
|
|
@@ -347,23 +378,23 @@ ${r.join(`
|
|
|
347
378
|
) ranked
|
|
348
379
|
WHERE rn <= ${r}
|
|
349
380
|
ORDER BY started_at ASC
|
|
350
|
-
`):c=
|
|
381
|
+
`):c=u.db.all(sql`
|
|
351
382
|
SELECT child.* FROM tasks child
|
|
352
383
|
WHERE child.thread_id = ${e}
|
|
353
384
|
AND ${this.topLevelTaskPredicateSql()}
|
|
354
385
|
${n?sql`AND child.workspace_id = ${n}`:sql``}
|
|
355
386
|
ORDER BY child.started_at ASC
|
|
356
|
-
`);for(let
|
|
387
|
+
`);for(let l of c)s.has(l.id)||(s.add(l.id),i.push(Qn(l)));}catch(c){throw new f("DB_ERROR","Failed to find top-level tasks",c)}finally{u.close();}}if(r!==void 0&&o.length>1){let d=new Map;for(let u of i){let c=u.agent_id??"";d.has(c)||d.set(c,[]),d.get(c).push(u);}i=[];for(let u of d.values())u.sort((c,l)=>(l.started_at??"").localeCompare(c.started_at??"")),i.push(...u.slice(0,r));i.sort((u,c)=>(u.started_at??"").localeCompare(c.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=j(i);try{let u=eq(a.thread_id,e),c=n?and(u,eq(a.workspace_id,n)):u,l=d.db.select().from(a).where(c).orderBy(asc(a.started_at)).all();for(let p of l)o.has(p.id)||(o.add(p.id),s.push(Qn(p)));}catch(u){throw new f("DB_ERROR","Failed to find all tasks for thread",u)}finally{d.close();}}return s}findTaskById(e,n,r){let o=this.resolveDbPaths();for(let s of o){if(!existsSync(s))continue;let i=j(s);try{let d=and(eq(a.id,n),eq(a.thread_id,e)),u=r?and(d,eq(a.workspace_id,r)):d,c=i.db.select().from(a).where(u).limit(1).get();if(!c)continue;let l=i.db.select().from(a).where(eq(a.parent_task_id,c.id)).orderBy(asc(a.started_at)).all().map(Qn);return {task:Qn(c),children:l}}catch(d){throw new f("DB_ERROR","Failed to find task by id",d)}finally{i.close();}}}batchFetchTasksQuery(e,n){return sql`
|
|
357
388
|
SELECT child.id, child.thread_id, child.agent_id, child.status,
|
|
358
389
|
child.parent_task_id, child.started_at, child.completed_at,
|
|
359
390
|
child.duration_ms, child.input_tokens, child.output_tokens,
|
|
360
|
-
child.cost_usd, child.error
|
|
391
|
+
child.cost_usd, child.error, child.metadata
|
|
361
392
|
FROM tasks child INDEXED BY idx_tasks_thread_id
|
|
362
393
|
WHERE child.thread_id IN (${sql.join(e.map(r=>sql`${r}`),sql`, `)})
|
|
363
394
|
AND ${this.topLevelTaskPredicateSql()}
|
|
364
395
|
${n?sql`AND child.workspace_id = ${n}`:sql``}
|
|
365
396
|
ORDER BY child.started_at ASC
|
|
366
|
-
`}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=
|
|
397
|
+
`}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=j(s);try{let d=i.db.all(this.batchFetchTasksQuery(e,n));for(let u of d){let c=u.thread_id;r.has(c)||r.set(c,[]),r.get(c).push(mc(u));}}catch(d){throw new f("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=j(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(_.id,e),i=r?and(s,eq(_.workspace_id,r)):s;if(!o.db.select({id:_.id}).from(_).where(i).limit(1).get())return;o.db.update(_).set({title:n,title_locked:1,updated_at:new Date().toISOString()}).where(eq(_.id,e)).run();}catch(s){throw s instanceof f?s:new f("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:_.id,message_count:_.message_count}).from(_).where(eq(_.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(_).set(d).where(eq(_.id,e)).run();}else r.db.insert(_).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 f?o:new f("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:_.id,platform:_.platform,workspace_id:_.workspace_id}).from(_).where(eq(_.id,e)).limit(1).get();if(i){s&&!i.workspace_id&&o.db.update(_).set({workspace_id:s}).where(eq(_.id,e)).run();return}let d=new Date().toISOString();o.db.insert(_).values({id:e,platform:n,workspace_id:s,message_count:0,created_at:d,updated_at:d}).run();}catch(s){throw s instanceof f?s:new f("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 c=d.select({message_count:_.message_count}).from(_).where(eq(_.id,e)).limit(1).get()?.message_count===0;return d.run(sql`
|
|
367
398
|
UPDATE threads
|
|
368
399
|
SET first_message = COALESCE(first_message, ${n}),
|
|
369
400
|
title = CASE WHEN title_locked = 0 AND title IS NULL THEN substr(${n}, 1, 60) ELSE title END,
|
|
@@ -371,11 +402,11 @@ ${r.join(`
|
|
|
371
402
|
message_count = message_count + 1,
|
|
372
403
|
updated_at = ${s}
|
|
373
404
|
WHERE id = ${e}
|
|
374
|
-
`),c},{behavior:"immediate"})}}catch(s){throw s instanceof p?s:new p("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(h).set({last_message:n,updated_at:s}).where(eq(h.id,e)).run();}catch(s){throw s instanceof p?s:new p("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(h).set(o).where(eq(h.id,e)).run();}catch(o){throw o instanceof p?o:new p("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 it("THREAD_TITLE_PATCH_INVALID","Thread-title metadata patch must be an object");if(Object.keys(o).some(l=>l!=="priority"&&l!=="state"))return new it("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 it("THREAD_TITLE_PATCH_EMPTY","Thread-title metadata patch must change priority or state");for(let l of [i.priority,i.state])if(l!=null&&(typeof l!="string"||l.length===0))return new it("THREAD_TITLE_PATCH_INVALID","Thread-title metadata values must be non-empty strings or null");let d=this.openHandle(true);try{let l=r?and(eq(h.id,e),eq(h.workspace_id,r)):eq(h.id,e);return d.db.transaction(c=>{let u=c.select({metadata:h.metadata}).from(h).where(l).get();if(!u)return null;let g=It(u.metadata),f=g.threadTitle,m=f&&typeof f=="object"&&!Array.isArray(f)?{...f}:{};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?g.threadTitle=m:delete g.threadTitle;let I=Object.keys(g).length>0?JSON.stringify(g):null,S=new Date().toISOString();c.update(h).set({metadata:I,updated_at:S}).where(l).run();let v=c.select({metadata:h.metadata}).from(h).where(l).get();if(!v)throw new p("DB_ERROR","Thread-title metadata update could not be read back");let $=$a(v.metadata);return {threadId:e,priority:$.priority,state:$.state}},{behavior:"immediate"})}catch(l){throw l instanceof p?l:new p("DB_ERROR","Failed to patch thread-title metadata",l)}finally{d.close();}}togglePin(e,n){let r=this.openHandle(true);try{let o=n?and(eq(h.id,e),eq(h.workspace_id,n)):eq(h.id,e);return r.db.transaction(s=>{let i=s.select({pinned:h.pinned,metadata:h.metadata}).from(h).where(o).get();if(!i)return null;let d=i.pinned?0:1,l=It(i.metadata);if(d){let c=n?and(eq(h.pinned,1),eq(h.workspace_id,n)):eq(h.pinned,1),u=s.select({metadata:h.metadata}).from(h).where(c).all(),g=null;for(let f of u){let m=It(f.metadata);typeof m.pinOrder=="number"&&(g===null||m.pinOrder<g)&&(g=m.pinOrder);}l.pinOrder=g===null?0:g-1;}else delete l.pinOrder;return s.update(h).set({pinned:d,metadata:Object.keys(l).length>0?JSON.stringify(l):null}).where(o).run(),{pinned:!!d}},{behavior:"immediate"})}catch(o){throw o instanceof p?o:new p("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(h.id,e[s]),eq(h.workspace_id,n)):eq(h.id,e[s]),d=o.select({metadata:h.metadata}).from(h).where(i).get();if(!d)continue;let l=It(d.metadata);l.pinOrder=s+1,o.update(h).set({metadata:JSON.stringify(l)}).where(i).run();}},{behavior:"immediate"});}catch(o){throw o instanceof p?o:new p("DB_ERROR","Failed to reorder pins",o)}finally{r.close();}}toggleStar(e,n){let r=this.openHandle(true);try{let o=n?and(eq(h.id,e),eq(h.workspace_id,n)):eq(h.id,e),s=r.db.select({starred:h.starred}).from(h).where(o).get();if(!s)return null;let i=s.starred?0:1;return r.db.update(h).set({starred:i}).where(o).run(),{starred:!!i}}catch(o){throw o instanceof p?o:new p("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(h.id,e),eq(h.workspace_id,n)):eq(h.id,e);return i.db.transaction(c=>{let u=c.select({metadata:h.metadata}).from(h).where(d).get();if(!u)return null;let g=u.metadata?JSON.parse(u.metadata):{},f=g.overdrive??{},m=o?.defaultTurns??f.defaultTurns??3,I=o?.updatedBy??"ui",S=new Date().toISOString(),v,$,j,de;switch(r){case "enable-count":{let te=o?.turns??m,He=o?.consumeCurrent?Math.max(te-1,0):te;v=He>0?"count":"off",$=He,j=!0,de="count";break}case "enable-latch":{v="latch",$=0,j=!0,de="latch";break}case "disable":{v="off",$=0,j=!1;break}default:{let te=f.state??"off",He=typeof f.remaining=="number"?f.remaining:0;if(te==="count"&&He>0){let b=He-1;b<=0?(v="off",$=0):(v="count",$=b),j=!0,de="count";}else te==="latch"?(v="latch",$=0,j=!0,de="latch"):(v="off",$=0,j=!1);break}}return g.overdrive={state:v,remaining:$,defaultTurns:m,updatedAt:S,updatedBy:I},c.update(h).set({metadata:JSON.stringify(g),updated_at:S}).where(d).run(),{applied:j,appliedMode:de,state:v,remaining:$}},{behavior:"immediate"})}catch(d){throw d instanceof p?d:new p("DB_ERROR","Failed to resolve overdrive",d)}finally{i.close();}}};var qn="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function Ha(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+=qn[o%62]);}for(;n.length<t;)n+=qn[randomBytes(1)[0]%62];return n}function vt(t){return `${t}_${Ha(8)}`}function Po(t,e){let{createHash:n}=pt("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+=qn[i%62];return `${t}_${s}`}var Ua=["urgent","high","medium","low"],Fa=["investigating","in-progress","in-review","on-hold","done"],Lo="custom:";var qa=new Set(Ua),Ba=new Set(Fa);function Bn(t){return typeof t=="string"&&qa.has(t)}function jn(t){if(typeof t!="string")return false;if(Ba.has(t))return true;if(t.startsWith("c_"))return t.length>2;if(!t.startsWith(Lo))return false;let e=t.slice(Lo.length);return e.length>=1&&e.length<=20}function Mo(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 Gn(t){let e=Mo(t);if(!e)return {};let n=e.threadTitle;if(!n||typeof n!="object"||Array.isArray(n))return {};let r=n,o={};return Bn(r.priority)&&(o.priority=r.priority),jn(r.state)&&(o.state=r.state),o}function $o(t,e){let n=Mo(t)??{},r={...Gn(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)}var Va="regeneration_replaced";var Ka="THREAD_HIGHLIGHT_REGENERATION_INTERRUPTED";var Ja="THREAD_HIGHLIGHT_REGENERATION_COMMIT_FAILED",Vn=class extends p{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;}},Nt=class extends Vn{},Kn=class extends p{stableCode="THREAD_HIGHLIGHT_REGENERATION_IN_PROGRESS";run;constructor(e){super("CONFLICT","THREAD_HIGHLIGHT_REGENERATION_IN_PROGRESS"),this.name="ThreadHighlightRegenerationConflictError",this.run=e;}},Ya=new Set(vr),Xa=new Set(Ir),Qa=new Set(Ar),Za=new Set(xr),ed=50,Uo=100,Fo=280,qo=40,td=new Set(Sr),en=["queued","running"],nd=["success","completed","done","failed","error"];function zn(t){return td.has(t)}function D(t){throw new p("VALIDATION",t)}function fe(t){throw new p("NOT_FOUND",t)}function E(t,e){(typeof t!="string"||t.trim().length===0)&&D(`${e} is required`);}function xt(t={}){let e=t.actor??t,n=e.actorType??"system";return Ya.has(n)||D(`invalid actorType: ${String(n)}`),e.actorId!==void 0&&e.actorId!==null&&typeof e.actorId!="string"&&D("actorId must be a string or null"),{actorType:n,actorId:e.actorId??null}}function rd(t){E(t.threadId,"threadId"),t.workspaceId!==void 0&&t.workspaceId!==null&&E(t.workspaceId,"workspaceId"),t.title!==void 0&&t.title!==null&&((typeof t.title!="string"||t.title.trim().length===0)&&D("title must not be empty"),t.title.length>120&&D("title must be at most 120 characters")),t.priority!==void 0&&t.priority!==null&&!Bn(t.priority)&&D(`invalid priority: ${String(t.priority)}`),t.state!==void 0&&t.state!==null&&!jn(t.state)&&D(`invalid state: ${String(t.state)}`);}function od(t){t.beforeSeq!==void 0&&t.afterSeq!==void 0&&D("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)&&D(`${n} must be a non-negative integer`);let e=t.limit??ed;return (!Number.isInteger(e)||e<1||e>Uo)&&D(`limit must be between 1 and ${Uo}`),e}function Jn(t){typeof t!="string"&&D("text is required");let e=t.trim();return e.length===0&&D("text must not be empty"),e.length>Fo&&D(`text must be at most ${Fo} characters`),e}function $e(t,e){return E(t??"",e),t}function Yn(t){Za.has(t)||D(`invalid highlight kind: ${String(t)}`);}function sd(t){Qa.has(t)||D(`invalid highlight source: ${String(t)}`);}function id(t){E(t.threadId,"threadId"),E(t.workspaceId,"workspaceId");let e=t.source??"manual";sd(e),Yn(t.kind);let n=Jn(t.text),r=t.coversFromTaskId??t.fromTaskId??t.taskId,o=t.coversToTaskId??t.toTaskId??t.taskId;if(e==="manual"){let u=t.taskId??(r&&o&&r===o?r:void 0),g=$e(u,"taskId");return (r!==g||o!==g)&&D("manual highlights must cover exactly one task"),{source:e,kind:t.kind,text:n,coversFromTaskId:g,coversToTaskId:g,agentId:t.agentId??null,sourceTaskId:null,detectorVersion:null,contentFingerprint:null}}let s=$e(r,"coversFromTaskId"),i=$e(o,"coversToTaskId"),d=t.sourceTaskId??s,l=t.detectorVersion??(t.idempotencyKey!==void 0?"default":null),c=t.contentFingerprint??t.idempotencyKey??null;return $e(d??void 0,"sourceTaskId"),$e(l??void 0,"detectorVersion"),$e(c??void 0,"contentFingerprint"),{source:e,kind:t.kind,text:n,coversFromTaskId:s,coversToTaskId:i,agentId:t.agentId??null,sourceTaskId:d,detectorVersion:l,contentFingerprint:c}}function ad(t,e){(!t||typeof t!="object")&&D(`candidates[${e}] is required`),Yn(t.kind);let n=Jn(t.text),r=$e(t.anchorTaskId,`candidates[${e}].anchorTaskId`),o=$e(t.coversFromTaskId,`candidates[${e}].coversFromTaskId`),s=$e(t.coversToTaskId,`candidates[${e}].coversToTaskId`),i=t.contentFingerprint?.trim()||Po("thl",JSON.stringify({kind:t.kind,text:n,anchorTaskId:r,coversFromTaskId:o,coversToTaskId:s}));return E(i,`candidates[${e}].contentFingerprint`),{kind:t.kind,text:n,anchorTaskId:r,coversFromTaskId:o,coversToTaskId:s,contentFingerprint:i}}function dd(t){Array.isArray(t)||D("candidates must be an array"),t.length>qo&&D(`candidates must contain at most ${qo} items`);let e=new Map;for(let[n,r]of t.entries()){let o=ad(r,n);e.set(o.contentFingerprint,o);}return [...e.values()]}function Ct(t){let e=Gn(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 ld(t){try{let e=JSON.stringify(t);return (!e||e==="null"||e.startsWith("["))&&D("event payload must be a JSON object"),e}catch(e){throw new p("VALIDATION","event payload must be JSON serializable",e)}}function St(t,e){return t.select({maxSeq:sql`COALESCE(MAX(${C.seq}), 0)`}).from(C).where(eq(C.thread_id,e)).get()?.maxSeq??0}function Ot(t,e){return !!t.select({id:C.id}).from(C).where(eq(C.thread_id,e)).limit(1).get()}function Ze(t,e){Xa.has(e.type)||D(`invalid thread event type: ${String(e.type)}`);let n=vt("the");t.insert(C).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:ld(e.payload),created_at:e.createdAt}).run();let r=t.select().from(C).where(eq(C.id,n)).get();if(!r)throw new p("DB_ERROR","Thread event insert did not return a row");return r}function bt(t,e,n,r,o){let s=Ct(e);Ze(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 nn(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 tn(t,e,n,r,o,s,i){let d=o==="thread.highlight.created"?nn(e):{before:i?nn({...e,...i,id:e.id}):void 0,after:nn(e)};return Ze(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 cd(t,e,n,r,o,s){return Ze(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:nn(e),...s??{}}})}var rn=class extends ne{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 p("NOT_FOUND","Database not found");if(e){let o=dirname(n);existsSync(o)||mkdirSync(o,{recursive:true});}let r=L(n);if(e)try{he(r.db,n);}catch(o){throw r.close(),o}return r}findThread(e,n,r){let o=eq(h.id,n),s=r===void 0?o:r===null?and(o,isNull(h.workspace_id)):and(o,eq(h.workspace_id,r));return e.select().from(h).where(s).limit(1).get()}findRegenerationRun(e,n,r){let o=e.select().from(x).where(eq(x.id,n)).limit(1).get();if(o&&!(r!==void 0&&!this.findThread(e,o.thread_id,r)))return o}resolveWorkspaceId(e){if(E(e,"threadId"),!existsSync(this.resolveDbPath()))return null;let n=this.openHandle(false);try{return n.db.select({workspaceId:h.workspace_id}).from(h).where(eq(h.id,e)).limit(1).get()?.workspaceId??null}catch(r){throw r instanceof p?r:new p("DB_ERROR","Failed to resolve thread workspace",r)}finally{n.close();}}getSnapshot(e,n){if(E(e,"threadId"),!existsSync(this.resolveDbPath()))return null;let r=this.openHandle(false);try{let o=this.findThread(r.db,e,n);return o?Ct(o):null}catch(o){throw o instanceof p?o:new p("DB_ERROR","Failed to read thread snapshot",o)}finally{r.close();}}updateSnapshot(e){rd(e);let n=xt(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||fe(`Thread ${e.threadId} not found`);let d=Ct(i),l=e.title!==void 0,c=l&&e.title!==d.title,u=l&&i.title_locked!==1,g=e.priority!==void 0&&e.priority!==d.priority,f=e.state!==void 0&&e.state!==d.state,m=c||g||f;if(!m&&!u)return d;let I=i.metadata;(g||f)&&(I=$o(i.metadata,{priority:e.priority,state:e.state}));let S={};if(m&&(S.metadata=I,S.updated_at=r),c&&(S.title=e.title),l&&(S.title_locked=1),s.update(h).set(S).where(e.workspaceId===void 0?eq(h.id,e.threadId):e.workspaceId===null?and(eq(h.id,e.threadId),isNull(h.workspace_id)):and(eq(h.id,e.threadId),eq(h.workspace_id,e.workspaceId))).run(),!m){let j={...i,title_locked:1};return Ct(j)}let v=St(s,i.id)+1;Ot(s,i.id)||(bt(s,i,n,r,v),v+=1),c&&(Ze(s,{threadId:i.id,seq:v,type:"thread.title.changed",actorType:n.actorType,actorId:n.actorId,createdAt:r,taskId:e.taskId,payload:{before:d.title,after:e.title}}),v+=1),g&&(Ze(s,{threadId:i.id,seq:v,type:"thread.priority.changed",actorType:n.actorType,actorId:n.actorId,createdAt:r,taskId:e.taskId,payload:{before:d.priority,after:e.priority}}),v+=1),f&&Ze(s,{threadId:i.id,seq:v,type:"thread.state.changed",actorType:n.actorType,actorId:n.actorId,createdAt:r,taskId:e.taskId,payload:{before:d.state,after:e.state}});let $={...i,title:c?e.title:i.title,metadata:I,title_locked:l?1:i.title_locked,updated_at:r};return Ct($)},{behavior:"immediate"})}catch(s){throw s instanceof p?s:new p("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(E(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(${C.seq}), 0)`}).from(C).where(eq(C.thread_id,e)).get()?.maxSeq??0:null}catch(o){throw o instanceof p?o:new p("DB_ERROR","Failed to read latest thread event sequence",o)}finally{r.close();}}listCompletedThreadHighlightTurns(e,n){if(E(e,"threadId"),E(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,nd),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 p?o:new p("DB_ERROR","Failed to read completed thread highlight turns",o)}finally{r.close();}}createHighlightRegenerationRun(e){E(e.threadId,"threadId"),E(e.workspaceId,"workspaceId"),E(e.requestId,"requestId"),E(e.detectorVersion,"detectorVersion"),e.runId!==void 0&&E(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||fe(`Thread ${e.threadId} not found`);let i=o.select().from(x).where(and(eq(x.thread_id,s.id),eq(x.request_id,e.requestId))).orderBy(desc(x.requested_at),desc(x.id)).limit(1).get();if(i)return {run:i,created:!1};let d=o.select().from(x).where(and(eq(x.thread_id,s.id),inArray(x.status,en))).orderBy(asc(x.requested_at),asc(x.id)).limit(1).get();if(d)throw new Kn(d);let l=e.runId??vt("thr");o.insert(x).values({id:l,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 c=o.select().from(x).where(eq(x.id,l)).get();if(!c)throw new p("DB_ERROR","Highlight regeneration run insert did not return a row");return {run:c,created:!0}},{behavior:"immediate"})}catch(o){throw o instanceof p?o:new p("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(E(e,"runId"),n!==void 0&&E(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 p?o:new p("DB_ERROR","Failed to read highlight regeneration run",o)}finally{r.close();}}getHighlightRegenerationRunByRequest(e,n,r){if(E(e,"threadId"),E(n,"workspaceId"),E(r,"requestId"),!existsSync(this.resolveDbPath()))return null;let o=this.openHandle(false);try{return this.findThread(o.db,e,n)?o.db.select().from(x).where(and(eq(x.thread_id,e),eq(x.request_id,r))).orderBy(desc(x.requested_at),desc(x.id)).limit(1).get()??null:null}catch(s){throw s instanceof p?s:new p("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){E(e,"runId"),n!==void 0&&E(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||fe(`Highlight regeneration run ${e} not found`),zn(i.status)||D(`invalid highlight regeneration status: ${i.status}`),i.status!=="queued")return i;s.update(x).set({status:"running",started_at:r}).where(and(eq(x.id,i.id),eq(x.status,"queued"))).run();let d=s.select().from(x).where(eq(x.id,i.id)).get();if(!d)throw new p("DB_ERROR","Highlight regeneration run start did not return a row");return d},{behavior:"immediate"})}catch(s){throw s instanceof p?s:new p("DB_ERROR","Failed to start highlight regeneration run",s)}finally{o.close();}}startHighlightRegeneration(e,n){return this.startHighlightRegenerationRun(e,n)}failHighlightRegenerationRun(e){E(e.runId,"runId"),E(e.errorCode,"errorCode"),e.workspaceId!==void 0&&E(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||fe(`Highlight regeneration run ${e.runId} not found`),zn(s.status)||D(`invalid highlight regeneration status: ${s.status}`),s.status==="completed"||s.status==="failed")return s;o.update(x).set({status:"failed",completed_at:n,error_code:e.errorCode}).where(and(eq(x.id,s.id),inArray(x.status,en))).run();let i=o.select().from(x).where(eq(x.id,s.id)).get();if(!i)throw new p("DB_ERROR","Highlight regeneration run failure did not return a row");return i},{behavior:"immediate"})}catch(o){throw o instanceof p?o:new p("DB_ERROR","Failed to fail highlight regeneration run",o)}finally{r.close();}}failHighlightRegeneration(e){return this.failHighlightRegenerationRun(e)}recoverInterruptedHighlightRegenerationRuns(e=Ka){E(e,"errorCode");let n=new Date().toISOString(),r=this.openHandle(true);try{return r.db.transaction(o=>o.update(x).set({status:"failed",completed_at:n,error_code:e}).where(inArray(x.status,en)).run().changes,{behavior:"immediate"})}catch(o){throw o instanceof p?o:new p("DB_ERROR","Failed to recover interrupted highlight runs",o)}finally{r.close();}}completeHighlightRegenerationRun(e){E(e.runId,"runId"),E(e.threadId,"threadId"),E(e.workspaceId,"workspaceId"),E(e.detectorVersion,"detectorVersion");let n=dd(e.candidates),r=xt(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)&&fe(`Highlight regeneration run ${e.runId} not found`),zn(d.status)||D(`invalid highlight regeneration status: ${d.status}`),d.status==="failed")throw new p("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 l=this.findThread(i,e.threadId,e.workspaceId);l||fe(`Thread ${e.threadId} not found`),d.detector_version!==e.detectorVersion&&D("detectorVersion does not match the regeneration run");let c=i.select().from(R).where(eq(R.thread_id,l.id)).orderBy(asc(R.created_at),asc(R.id)).all(),u=new Set(n.map(b=>b.contentFingerprint)),g=c.filter(b=>b.source==="auto"&&b.status==="active"&&b.revision===0&&!u.has(b.content_fingerprint??"")),f=c.filter(b=>b.source==="auto"&&b.status==="active").length,m=new Set(c.filter(b=>!g.includes(b)&&b.content_fingerprint).map(b=>b.content_fingerprint)),I=n.filter(b=>!m.has(b.contentFingerprint)),S=new Date().toISOString(),v=St(i,l.id)+1;Ot(i,l.id)||(bt(i,l,r,S,v),v+=1);for(let b of g)i.delete(R).where(eq(R.id,b.id)).run(),cd(i,b,r,S,v,{runId:e.runId,reason:Va}),v+=1;let $=0,j=e.agentId??(r.actorType==="agent"?r.actorId:null);for(let b of I){let Qn=vt("thl");i.insert(R).values({id:Qn,thread_id:l.id,source:"auto",kind:b.kind,status:"active",text:b.text,covers_from_task_id:b.coversFromTaskId,covers_to_task_id:b.coversToTaskId,revision:0,created_at:S,updated_at:S,agent_id:j,source_task_id:b.anchorTaskId,detector_version:e.detectorVersion,content_fingerprint:b.contentFingerprint,dismissed_at:null}).run();let Zn=i.select().from(R).where(eq(R.id,Qn)).get();if(!Zn)throw new p("DB_ERROR","Regenerated highlight insert did not return a row");tn(i,Zn,r,S,"thread.highlight.created",v),v+=1,$+=1;}let te=i.select().from(R).where(eq(R.thread_id,l.id)).all().filter(b=>b.source==="auto"&&b.status==="active").length;Ze(i,{threadId:l.id,seq:v,type:"thread.highlights.regenerated",actorType:r.actorType,actorId:r.actorId,createdAt:S,payload:{runId:d.id,detectorVersion:e.detectorVersion,previousAutoCount:f,newAutoCount:te,deletedCount:g.length,createdCount:$}}),i.update(x).set({status:"completed",started_at:d.started_at??S,completed_at:S,error_code:null,previous_auto_count:f,new_auto_count:te}).where(and(eq(x.id,d.id),inArray(x.status,en))).run();let He=i.select().from(x).where(eq(x.id,d.id)).get();if(!He)throw new p("DB_ERROR","Highlight regeneration completion did not return a row");return {run:He,deletedCount:g.length,createdCount:$,previousAutoCount:f,newAutoCount:te}},{behavior:"immediate"})}catch(i){if(s)try{this.failHighlightRegenerationRun({runId:e.runId,workspaceId:e.workspaceId,errorCode:Ja});}catch{}throw i instanceof p?i:new p("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;E(o.threadId,"threadId"),E(o.workspaceId,"workspaceId");let s=od(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(${C.seq}), 0)`}).from(C).where(eq(C.thread_id,o.threadId)).get()?.maxSeq??0,l;o.beforeSeq!==void 0?l=i.db.select().from(C).where(and(eq(C.thread_id,o.threadId),lt(C.seq,o.beforeSeq))).orderBy(desc(C.seq)).limit(s+1).all().reverse():o.afterSeq!==void 0?l=i.db.select().from(C).where(and(eq(C.thread_id,o.threadId),sql`${C.seq} > ${o.afterSeq}`)).orderBy(asc(C.seq)).limit(s+1).all():l=i.db.select().from(C).where(eq(C.thread_id,o.threadId)).orderBy(desc(C.seq)).limit(s+1).all().reverse();let c=l.length>s,u=o.afterSeq!==void 0?l.slice(0,s):c?l.slice(1):l,g=!1,f=u[0];return f&&(g=!!i.db.select({id:C.id}).from(C).where(and(eq(C.thread_id,o.threadId),lt(C.seq,f.seq))).limit(1).get()),{items:u,latestSeq:d,hasMoreOlder:g}}catch(d){throw d instanceof p?d:new p("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=id(e),r=xt(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||fe(`Thread ${e.threadId} not found`),n.source==="auto"){let f=i.select().from(R).where(and(eq(R.thread_id,e.threadId),eq(R.source_task_id,n.sourceTaskId),eq(R.detector_version,n.detectorVersion),eq(R.content_fingerprint,n.contentFingerprint))).orderBy(asc(R.created_at),asc(R.id)).limit(1).get();if(f)return f}let l=e.id??vt("thl"),c={id:l,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(R).values(c).run();let u=i.select().from(R).where(eq(R.id,l)).get();if(!u)throw new p("DB_ERROR","Highlight insert did not return a row");let g=St(i,d.id)+1;return Ot(i,d.id)||(bt(i,d,r,o,g),g+=1),tn(i,u,r,o,"thread.highlight.created",g),u},{behavior:"immediate"})}catch(i){throw i instanceof p?i:new p("DB_ERROR","Failed to create thread highlight",i)}finally{s.close();}}updateHighlight(e){E(e.threadId,"threadId"),E(e.workspaceId,"workspaceId"),E(e.highlightId,"highlightId"),(!Number.isInteger(e.expectedRevision)||e.expectedRevision<0)&&D("expectedRevision must be a non-negative integer"),e.text===void 0&&e.kind===void 0&&e.coversFromTaskId===void 0&&e.coversToTaskId===void 0&&D("highlight update requires at least one field"),e.kind!==void 0&&Yn(e.kind);let n=e.text===void 0?void 0:Jn(e.text),r=xt(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||fe(`Thread ${e.threadId} not found`);let l=i.select().from(R).where(and(eq(R.id,e.highlightId),eq(R.thread_id,d.id))).limit(1).get();if(l||fe(`Highlight ${e.highlightId} not found`),l.revision!==e.expectedRevision)throw new Nt(d.id,l.id,e.expectedRevision,l.revision);if(l.status!=="active")throw new Nt(d.id,l.id,e.expectedRevision,l.revision);let c=e.kind??l.kind,u=n??l.text,g=e.coversFromTaskId??l.covers_from_task_id,f=e.coversToTaskId??l.covers_to_task_id;(!u||g.length===0||f.length===0)&&D("highlight projection is incomplete");let m=c!==l.kind||u!==l.text||g!==l.covers_from_task_id||f!==l.covers_to_task_id,I=r.actorType==="user"&&l.source==="auto"&&m?"manual":l.source;if(!(m||I!==l.source))return l;let v=l.revision+1;i.update(R).set({source:I,kind:c,text:u,covers_from_task_id:g,covers_to_task_id:f,revision:v,updated_at:o}).where(and(eq(R.id,l.id),eq(R.revision,l.revision))).run();let $=i.select().from(R).where(eq(R.id,l.id)).get();if(!$)throw new p("DB_ERROR","Highlight update did not return a row");let j=St(i,d.id)+1;return Ot(i,d.id)||(bt(i,d,r,o,j),j+=1),tn(i,$,r,o,"thread.highlight.updated",j,l),$},{behavior:"immediate"})}catch(i){throw i instanceof p?i:new p("DB_ERROR","Failed to update thread highlight",i)}finally{s.close();}}dismissHighlight(e){E(e.threadId,"threadId"),E(e.workspaceId,"workspaceId"),E(e.highlightId,"highlightId"),(!Number.isInteger(e.expectedRevision)||e.expectedRevision<0)&&D("expectedRevision must be a non-negative integer");let n=xt(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||fe(`Thread ${e.threadId} not found`);let d=s.select().from(R).where(and(eq(R.id,e.highlightId),eq(R.thread_id,i.id))).limit(1).get();if(d||fe(`Highlight ${e.highlightId} not found`),d.revision!==e.expectedRevision)throw new Nt(i.id,d.id,e.expectedRevision,d.revision);if(d.status==="dismissed")return d;let l=d.revision+1;s.update(R).set({status:"dismissed",text:null,revision:l,updated_at:r,dismissed_at:r}).where(and(eq(R.id,d.id),eq(R.revision,d.revision))).run();let c=s.select().from(R).where(eq(R.id,d.id)).get();if(!c)throw new p("DB_ERROR","Highlight dismissal did not return a row");let u=St(s,i.id)+1;return Ot(s,i.id)||(bt(s,i,n,r,u),u+=1),tn(s,c,n,r,"thread.highlight.deleted",u,d),c},{behavior:"immediate"})}catch(s){throw s instanceof p?s:new p("DB_ERROR","Failed to dismiss thread highlight",s)}finally{o.close();}}listActiveHighlights(e,n,r={}){if(E(e,"threadId"),E(n,"workspaceId"),r.taskId!==void 0&&E(r.taskId,"taskId"),r.coversFromTaskId!==void 0&&E(r.coversFromTaskId,"coversFromTaskId"),r.coversToTaskId!==void 0&&E(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(R).where(and(eq(R.thread_id,e),eq(R.status,"active"))).orderBy(asc(R.created_at),asc(R.id)).all();if(r.taskId===void 0&&r.coversFromTaskId===void 0&&r.coversToTaskId===void 0)return i;let d=o.db.all(sql`
|
|
405
|
+
`),c},{behavior:"immediate"})}}catch(s){throw s instanceof f?s:new f("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(_).set({last_message:n,updated_at:s}).where(eq(_.id,e)).run();}catch(s){throw s instanceof f?s:new f("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(_).set(o).where(eq(_.id,e)).run();}catch(o){throw o instanceof f?o:new f("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 Ct("THREAD_TITLE_PATCH_INVALID","Thread-title metadata patch must be an object");if(Object.keys(o).some(u=>u!=="priority"&&u!=="state"))return new Ct("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 Ct("THREAD_TITLE_PATCH_EMPTY","Thread-title metadata patch must change priority or state");for(let u of [i.priority,i.state])if(u!=null&&(typeof u!="string"||u.length===0))return new Ct("THREAD_TITLE_PATCH_INVALID","Thread-title metadata values must be non-empty strings or null");let d=this.openHandle(true);try{let u=r?and(eq(_.id,e),eq(_.workspace_id,r)):eq(_.id,e);return d.db.transaction(c=>{let l=c.select({metadata:_.metadata}).from(_).where(u).get();if(!l)return null;let p=cn(l.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 I=Object.keys(p).length>0?JSON.stringify(p):null,y=new Date().toISOString();c.update(_).set({metadata:I,updated_at:y}).where(u).run();let k=c.select({metadata:_.metadata}).from(_).where(u).get();if(!k)throw new f("DB_ERROR","Thread-title metadata update could not be read back");let D=_c(k.metadata);return {threadId:e,priority:D.priority,state:D.state}},{behavior:"immediate"})}catch(u){throw u instanceof f?u:new f("DB_ERROR","Failed to patch thread-title metadata",u)}finally{d.close();}}togglePin(e,n){let r=this.openHandle(true);try{let o=n?and(eq(_.id,e),eq(_.workspace_id,n)):eq(_.id,e);return r.db.transaction(s=>{let i=s.select({pinned:_.pinned,metadata:_.metadata}).from(_).where(o).get();if(!i)return null;let d=i.pinned?0:1,u=cn(i.metadata);if(d){let c=n?and(eq(_.pinned,1),eq(_.workspace_id,n)):eq(_.pinned,1),l=s.select({metadata:_.metadata}).from(_).where(c).all(),p=null;for(let g of l){let m=cn(g.metadata);typeof m.pinOrder=="number"&&(p===null||m.pinOrder<p)&&(p=m.pinOrder);}u.pinOrder=p===null?0:p-1;}else delete u.pinOrder;return s.update(_).set({pinned:d,metadata:Object.keys(u).length>0?JSON.stringify(u):null}).where(o).run(),{pinned:!!d}},{behavior:"immediate"})}catch(o){throw o instanceof f?o:new f("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(_.id,e[s]),eq(_.workspace_id,n)):eq(_.id,e[s]),d=o.select({metadata:_.metadata}).from(_).where(i).get();if(!d)continue;let u=cn(d.metadata);u.pinOrder=s+1,o.update(_).set({metadata:JSON.stringify(u)}).where(i).run();}},{behavior:"immediate"});}catch(o){throw o instanceof f?o:new f("DB_ERROR","Failed to reorder pins",o)}finally{r.close();}}toggleStar(e,n){let r=this.openHandle(true);try{let o=n?and(eq(_.id,e),eq(_.workspace_id,n)):eq(_.id,e),s=r.db.select({starred:_.starred}).from(_).where(o).get();if(!s)return null;let i=s.starred?0:1;return r.db.update(_).set({starred:i}).where(o).run(),{starred:!!i}}catch(o){throw o instanceof f?o:new f("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(_.id,e),eq(_.workspace_id,n)):eq(_.id,e);return i.db.transaction(c=>{let l=c.select({metadata:_.metadata}).from(_).where(d).get();if(!l)return null;let p=l.metadata?JSON.parse(l.metadata):{},g=p.overdrive??{},m=o?.defaultTurns??g.defaultTurns??3,I=o?.updatedBy??"ui",y=new Date().toISOString(),k,D,L,G;switch(r){case "enable-count":{let E=o?.turns??m,O=o?.consumeCurrent?Math.max(E-1,0):E;k=O>0?"count":"off",D=O,L=!0,G="count";break}case "enable-latch":{k="latch",D=0,L=!0,G="latch";break}case "disable":{k="off",D=0,L=!1;break}default:{let E=g.state??"off",O=typeof g.remaining=="number"?g.remaining:0;if(E==="count"&&O>0){let x=O-1;x<=0?(k="off",D=0):(k="count",D=x),L=!0,G="count";}else E==="latch"?(k="latch",D=0,L=!0,G="latch"):(k="off",D=0,L=!1);break}}return p.overdrive={state:k,remaining:D,defaultTurns:m,updatedAt:y,updatedBy:I},c.update(_).set({metadata:JSON.stringify(p),updated_at:y}).where(d).run(),{applied:L,appliedMode:G,state:k,remaining:D}},{behavior:"immediate"})}catch(d){throw d instanceof f?d:new f("DB_ERROR","Failed to resolve overdrive",d)}finally{i.close();}}};h();ot();ht();_t();nt();h();var io="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function kc(t){let e=randomBytes(t*2),n="";for(let r=0;r<e.length&&n.length<t;r++){let o=e[r];o<248&&(n+=io[o%62]);}for(;n.length<t;)n+=io[randomBytes(1)[0]%62];return n}function ln(t){return `${t}_${kc(8)}`}function Fi(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+=io[i%62];return `${t}_${s}`}wt();h();var Tc=["urgent","high","medium","low"],wc=["investigating","in-progress","in-review","on-hold","done"],Bi="custom:";var yc=new Set(Tc),Ec=new Set(wc);function ao(t){return typeof t=="string"&&yc.has(t)}function uo(t){if(typeof t!="string")return false;if(Ec.has(t))return true;if(t.startsWith("c_"))return t.length>2;if(!t.startsWith(Bi))return false;let e=t.slice(Bi.length);return e.length>=1&&e.length<=20}function ji(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 co(t){let e=ji(t);if(!e)return {};let n=e.threadTitle;if(!n||typeof n!="object"||Array.isArray(n))return {};let r=n,o={};return ao(r.priority)&&(o.priority=r.priority),uo(r.state)&&(o.state=r.state),o}function Wi(t,e){let n=ji(t)??{},r={...co(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)}jn();var vc="regeneration_replaced";var bc="THREAD_HIGHLIGHT_REGENERATION_INTERRUPTED";var xc="THREAD_HIGHLIGHT_REGENERATION_COMMIT_FAILED",fo=class extends f{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;}},kn=class extends fo{},go=class extends f{stableCode="THREAD_HIGHLIGHT_REGENERATION_IN_PROGRESS";run;constructor(e){super("CONFLICT","THREAD_HIGHLIGHT_REGENERATION_IN_PROGRESS"),this.name="ThreadHighlightRegenerationConflictError",this.run=e;}},Oc=new Set(es),Cc=new Set(Zo),Nc=new Set(ts),Dc=new Set(ns),Pc=50,zi=100,Vi=280,Ki=40,Lc=new Set(rs),er=["queued","running"];function po(t){return Lc.has(t)}function F(t){throw new f("VALIDATION",t)}function ve(t){throw new f("NOT_FOUND",t)}function C(t,e){(typeof t!="string"||t.trim().length===0)&&F(`${e} is required`);}function fn(t={}){let e=t.actor??t,n=e.actorType??"system";return Oc.has(n)||F(`invalid actorType: ${String(n)}`),e.actorId!==void 0&&e.actorId!==null&&typeof e.actorId!="string"&&F("actorId must be a string or null"),{actorType:n,actorId:e.actorId??null}}function Mc(t){C(t.threadId,"threadId"),t.workspaceId!==void 0&&t.workspaceId!==null&&C(t.workspaceId,"workspaceId"),t.title!==void 0&&t.title!==null&&((typeof t.title!="string"||t.title.trim().length===0)&&F("title must not be empty"),t.title.length>120&&F("title must be at most 120 characters")),t.priority!==void 0&&t.priority!==null&&!ao(t.priority)&&F(`invalid priority: ${String(t.priority)}`),t.state!==void 0&&t.state!==null&&!uo(t.state)&&F(`invalid state: ${String(t.state)}`);}function Hc(t){t.beforeSeq!==void 0&&t.afterSeq!==void 0&&F("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)&&F(`${n} must be a non-negative integer`);let e=t.limit??Pc;return (!Number.isInteger(e)||e<1||e>zi)&&F(`limit must be between 1 and ${zi}`),e}function ho(t){typeof t!="string"&&F("text is required");let e=t.trim();return e.length===0&&F("text must not be empty"),e.length>Vi&&F(`text must be at most ${Vi} characters`),e}function Ke(t,e){return C(t??"",e),t}function mo(t){Dc.has(t)||F(`invalid highlight kind: ${String(t)}`);}function $c(t){Nc.has(t)||F(`invalid highlight source: ${String(t)}`);}function Uc(t){C(t.threadId,"threadId"),C(t.workspaceId,"workspaceId");let e=t.source??"manual";$c(e),mo(t.kind);let n=ho(t.text),r=t.coversFromTaskId??t.fromTaskId??t.taskId,o=t.coversToTaskId??t.toTaskId??t.taskId;if(e==="manual"){let l=t.taskId??(r&&o&&r===o?r:void 0),p=Ke(l,"taskId");return (r!==p||o!==p)&&F("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=Ke(r,"coversFromTaskId"),i=Ke(o,"coversToTaskId"),d=t.sourceTaskId??s,u=t.detectorVersion??(t.idempotencyKey!==void 0?"default":null),c=t.contentFingerprint??t.idempotencyKey??null;return Ke(d??void 0,"sourceTaskId"),Ke(u??void 0,"detectorVersion"),Ke(c??void 0,"contentFingerprint"),{source:e,kind:t.kind,text:n,coversFromTaskId:s,coversToTaskId:i,agentId:t.agentId??null,sourceTaskId:d,detectorVersion:u,contentFingerprint:c}}function qc(t,e){(!t||typeof t!="object")&&F(`candidates[${e}] is required`),mo(t.kind);let n=ho(t.text),r=Ke(t.anchorTaskId,`candidates[${e}].anchorTaskId`),o=Ke(t.coversFromTaskId,`candidates[${e}].coversFromTaskId`),s=Ke(t.coversToTaskId,`candidates[${e}].coversToTaskId`),i=t.contentFingerprint?.trim()||Fi("thl",JSON.stringify({kind:t.kind,text:n,anchorTaskId:r,coversFromTaskId:o,coversToTaskId:s}));return C(i,`candidates[${e}].contentFingerprint`),{kind:t.kind,text:n,anchorTaskId:r,coversFromTaskId:o,coversToTaskId:s,contentFingerprint:i}}function Fc(t){Array.isArray(t)||F("candidates must be an array"),t.length>Ki&&F(`candidates must contain at most ${Ki} items`);let e=new Map;for(let[n,r]of t.entries()){let o=qc(r,n);e.set(o.contentFingerprint,o);}return [...e.values()]}function _n(t){let e=co(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 Bc(t){try{let e=JSON.stringify(t);return (!e||e==="null"||e.startsWith("["))&&F("event payload must be a JSON object"),e}catch(e){throw new f("VALIDATION","event payload must be JSON serializable",e)}}function gn(t,e){return t.select({maxSeq:sql`COALESCE(MAX(${U.seq}), 0)`}).from(U).where(eq(U.thread_id,e)).get()?.maxSeq??0}function hn(t,e){return !!t.select({id:U.id}).from(U).where(eq(U.thread_id,e)).limit(1).get()}function ft(t,e){Cc.has(e.type)||F(`invalid thread event type: ${String(e.type)}`);let n=ln("the");t.insert(U).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:Bc(e.payload),created_at:e.createdAt}).run();let r=t.select().from(U).where(eq(U.id,n)).get();if(!r)throw new f("DB_ERROR","Thread event insert did not return a row");return r}function mn(t,e,n,r,o){let s=_n(e);ft(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 nr(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 tr(t,e,n,r,o,s,i){let d=o==="thread.highlight.created"?nr(e):{before:i?nr({...e,...i,id:e.id}):void 0,after:nr(e)};return ft(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 jc(t,e,n,r,o,s){return ft(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:nr(e),...s??{}}})}var rr=class extends le{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 f("NOT_FOUND","Database not found");if(e){let o=dirname(n);existsSync(o)||mkdirSync(o,{recursive:true});}let r=j(n);if(e)try{be(r.db,n);}catch(o){throw r.close(),o}return r}findThread(e,n,r){let o=eq(_.id,n),s=r===void 0?o:r===null?and(o,isNull(_.workspace_id)):and(o,eq(_.workspace_id,r));return e.select().from(_).where(s).limit(1).get()}findRegenerationRun(e,n,r){let o=e.select().from(M).where(eq(M.id,n)).limit(1).get();if(o&&!(r!==void 0&&!this.findThread(e,o.thread_id,r)))return o}resolveWorkspaceId(e){if(C(e,"threadId"),!existsSync(this.resolveDbPath()))return null;let n=this.openHandle(false);try{return n.db.select({workspaceId:_.workspace_id}).from(_).where(eq(_.id,e)).limit(1).get()?.workspaceId??null}catch(r){throw r instanceof f?r:new f("DB_ERROR","Failed to resolve thread workspace",r)}finally{n.close();}}getSnapshot(e,n){if(C(e,"threadId"),!existsSync(this.resolveDbPath()))return null;let r=this.openHandle(false);try{let o=this.findThread(r.db,e,n);return o?_n(o):null}catch(o){throw o instanceof f?o:new f("DB_ERROR","Failed to read thread snapshot",o)}finally{r.close();}}updateSnapshot(e){Mc(e);let n=fn(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||ve(`Thread ${e.threadId} not found`);let d=_n(i),u=e.title!==void 0,c=u&&e.title!==d.title,l=u&&i.title_locked!==1,p=e.priority!==void 0&&e.priority!==d.priority,g=e.state!==void 0&&e.state!==d.state,m=c||p||g;if(!m&&!l)return d;let I=i.metadata;(p||g)&&(I=Wi(i.metadata,{priority:e.priority,state:e.state}));let y={};if(m&&(y.metadata=I,y.updated_at=r),c&&(y.title=e.title),u&&(y.title_locked=1),s.update(_).set(y).where(e.workspaceId===void 0?eq(_.id,e.threadId):e.workspaceId===null?and(eq(_.id,e.threadId),isNull(_.workspace_id)):and(eq(_.id,e.threadId),eq(_.workspace_id,e.workspaceId))).run(),!m){let L={...i,title_locked:1};return _n(L)}let k=gn(s,i.id)+1;hn(s,i.id)||(mn(s,i,n,r,k),k+=1),c&&(ft(s,{threadId:i.id,seq:k,type:"thread.title.changed",actorType:n.actorType,actorId:n.actorId,createdAt:r,taskId:e.taskId,payload:{before:d.title,after:e.title}}),k+=1),p&&(ft(s,{threadId:i.id,seq:k,type:"thread.priority.changed",actorType:n.actorType,actorId:n.actorId,createdAt:r,taskId:e.taskId,payload:{before:d.priority,after:e.priority}}),k+=1),g&&ft(s,{threadId:i.id,seq:k,type:"thread.state.changed",actorType:n.actorType,actorId:n.actorId,createdAt:r,taskId:e.taskId,payload:{before:d.state,after:e.state}});let D={...i,title:c?e.title:i.title,metadata:I,title_locked:u?1:i.title_locked,updated_at:r};return _n(D)},{behavior:"immediate"})}catch(s){throw s instanceof f?s:new f("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(C(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(${U.seq}), 0)`}).from(U).where(eq(U.thread_id,e)).get()?.maxSeq??0:null}catch(o){throw o instanceof f?o:new f("DB_ERROR","Failed to read latest thread event sequence",o)}finally{r.close();}}listCompletedThreadHighlightTurns(e,n){if(C(e,"threadId"),C(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,[...hi,"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 f?o:new f("DB_ERROR","Failed to read completed thread highlight turns",o)}finally{r.close();}}createHighlightRegenerationRun(e){C(e.threadId,"threadId"),C(e.workspaceId,"workspaceId"),C(e.requestId,"requestId"),C(e.detectorVersion,"detectorVersion"),e.runId!==void 0&&C(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||ve(`Thread ${e.threadId} not found`);let i=o.select().from(M).where(and(eq(M.thread_id,s.id),eq(M.request_id,e.requestId))).orderBy(desc(M.requested_at),desc(M.id)).limit(1).get();if(i)return {run:i,created:!1};let d=o.select().from(M).where(and(eq(M.thread_id,s.id),inArray(M.status,er))).orderBy(asc(M.requested_at),asc(M.id)).limit(1).get();if(d)throw new go(d);let u=e.runId??ln("thr");o.insert(M).values({id:u,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 c=o.select().from(M).where(eq(M.id,u)).get();if(!c)throw new f("DB_ERROR","Highlight regeneration run insert did not return a row");return {run:c,created:!0}},{behavior:"immediate"})}catch(o){throw o instanceof f?o:new f("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(C(e,"runId"),n!==void 0&&C(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 f?o:new f("DB_ERROR","Failed to read highlight regeneration run",o)}finally{r.close();}}getHighlightRegenerationRunByRequest(e,n,r){if(C(e,"threadId"),C(n,"workspaceId"),C(r,"requestId"),!existsSync(this.resolveDbPath()))return null;let o=this.openHandle(false);try{return this.findThread(o.db,e,n)?o.db.select().from(M).where(and(eq(M.thread_id,e),eq(M.request_id,r))).orderBy(desc(M.requested_at),desc(M.id)).limit(1).get()??null:null}catch(s){throw s instanceof f?s:new f("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){C(e,"runId"),n!==void 0&&C(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||ve(`Highlight regeneration run ${e} not found`),po(i.status)||F(`invalid highlight regeneration status: ${i.status}`),i.status!=="queued")return i;s.update(M).set({status:"running",started_at:r}).where(and(eq(M.id,i.id),eq(M.status,"queued"))).run();let d=s.select().from(M).where(eq(M.id,i.id)).get();if(!d)throw new f("DB_ERROR","Highlight regeneration run start did not return a row");return d},{behavior:"immediate"})}catch(s){throw s instanceof f?s:new f("DB_ERROR","Failed to start highlight regeneration run",s)}finally{o.close();}}startHighlightRegeneration(e,n){return this.startHighlightRegenerationRun(e,n)}failHighlightRegenerationRun(e){C(e.runId,"runId"),C(e.errorCode,"errorCode"),e.workspaceId!==void 0&&C(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||ve(`Highlight regeneration run ${e.runId} not found`),po(s.status)||F(`invalid highlight regeneration status: ${s.status}`),s.status==="completed"||s.status==="failed")return s;o.update(M).set({status:"failed",completed_at:n,error_code:e.errorCode}).where(and(eq(M.id,s.id),inArray(M.status,er))).run();let i=o.select().from(M).where(eq(M.id,s.id)).get();if(!i)throw new f("DB_ERROR","Highlight regeneration run failure did not return a row");return i},{behavior:"immediate"})}catch(o){throw o instanceof f?o:new f("DB_ERROR","Failed to fail highlight regeneration run",o)}finally{r.close();}}failHighlightRegeneration(e){return this.failHighlightRegenerationRun(e)}recoverInterruptedHighlightRegenerationRuns(e=bc){C(e,"errorCode");let n=new Date().toISOString(),r=this.openHandle(true);try{return r.db.transaction(o=>o.update(M).set({status:"failed",completed_at:n,error_code:e}).where(inArray(M.status,er)).run().changes,{behavior:"immediate"})}catch(o){throw o instanceof f?o:new f("DB_ERROR","Failed to recover interrupted highlight runs",o)}finally{r.close();}}completeHighlightRegenerationRun(e){C(e.runId,"runId"),C(e.threadId,"threadId"),C(e.workspaceId,"workspaceId"),C(e.detectorVersion,"detectorVersion");let n=Fc(e.candidates),r=fn(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)&&ve(`Highlight regeneration run ${e.runId} not found`),po(d.status)||F(`invalid highlight regeneration status: ${d.status}`),d.status==="failed")throw new f("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 u=this.findThread(i,e.threadId,e.workspaceId);u||ve(`Thread ${e.threadId} not found`),d.detector_version!==e.detectorVersion&&F("detectorVersion does not match the regeneration run");let c=i.select().from(N).where(eq(N.thread_id,u.id)).orderBy(asc(N.created_at),asc(N.id)).all(),l=new Set(n.map(x=>x.contentFingerprint)),p=c.filter(x=>x.source==="auto"&&x.status==="active"&&x.revision===0&&!l.has(x.content_fingerprint??"")),g=c.filter(x=>x.source==="auto"&&x.status==="active").length,m=new Set(c.filter(x=>!p.includes(x)&&x.content_fingerprint).map(x=>x.content_fingerprint)),I=n.filter(x=>!m.has(x.contentFingerprint)),y=new Date().toISOString(),k=gn(i,u.id)+1;hn(i,u.id)||(mn(i,u,r,y,k),k+=1);for(let x of p)i.delete(N).where(eq(N.id,x.id)).run(),jc(i,x,r,y,k,{runId:e.runId,reason:vc}),k+=1;let D=0,L=e.agentId??(r.actorType==="agent"?r.actorId:null);for(let x of I){let J=ln("thl");i.insert(N).values({id:J,thread_id:u.id,source:"auto",kind:x.kind,status:"active",text:x.text,covers_from_task_id:x.coversFromTaskId,covers_to_task_id:x.coversToTaskId,revision:0,created_at:y,updated_at:y,agent_id:L,source_task_id:x.anchorTaskId,detector_version:e.detectorVersion,content_fingerprint:x.contentFingerprint,dismissed_at:null}).run();let me=i.select().from(N).where(eq(N.id,J)).get();if(!me)throw new f("DB_ERROR","Regenerated highlight insert did not return a row");tr(i,me,r,y,"thread.highlight.created",k),k+=1,D+=1;}let E=i.select().from(N).where(eq(N.thread_id,u.id)).all().filter(x=>x.source==="auto"&&x.status==="active").length;ft(i,{threadId:u.id,seq:k,type:"thread.highlights.regenerated",actorType:r.actorType,actorId:r.actorId,createdAt:y,payload:{runId:d.id,detectorVersion:e.detectorVersion,previousAutoCount:g,newAutoCount:E,deletedCount:p.length,createdCount:D}}),i.update(M).set({status:"completed",started_at:d.started_at??y,completed_at:y,error_code:null,previous_auto_count:g,new_auto_count:E}).where(and(eq(M.id,d.id),inArray(M.status,er))).run();let O=i.select().from(M).where(eq(M.id,d.id)).get();if(!O)throw new f("DB_ERROR","Highlight regeneration completion did not return a row");return {run:O,deletedCount:p.length,createdCount:D,previousAutoCount:g,newAutoCount:E}},{behavior:"immediate"})}catch(i){if(s)try{this.failHighlightRegenerationRun({runId:e.runId,workspaceId:e.workspaceId,errorCode:xc});}catch{}throw i instanceof f?i:new f("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;C(o.threadId,"threadId"),C(o.workspaceId,"workspaceId");let s=Hc(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(${U.seq}), 0)`}).from(U).where(eq(U.thread_id,o.threadId)).get()?.maxSeq??0,u;o.beforeSeq!==void 0?u=i.db.select().from(U).where(and(eq(U.thread_id,o.threadId),lt$1(U.seq,o.beforeSeq))).orderBy(desc(U.seq)).limit(s+1).all().reverse():o.afterSeq!==void 0?u=i.db.select().from(U).where(and(eq(U.thread_id,o.threadId),sql`${U.seq} > ${o.afterSeq}`)).orderBy(asc(U.seq)).limit(s+1).all():u=i.db.select().from(U).where(eq(U.thread_id,o.threadId)).orderBy(desc(U.seq)).limit(s+1).all().reverse();let c=u.length>s,l=o.afterSeq!==void 0?u.slice(0,s):c?u.slice(1):u,p=!1,g=l[0];return g&&(p=!!i.db.select({id:U.id}).from(U).where(and(eq(U.thread_id,o.threadId),lt$1(U.seq,g.seq))).limit(1).get()),{items:l,latestSeq:d,hasMoreOlder:p}}catch(d){throw d instanceof f?d:new f("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=Uc(e),r=fn(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||ve(`Thread ${e.threadId} not found`),n.source==="auto"){let g=i.select().from(N).where(and(eq(N.thread_id,e.threadId),eq(N.source_task_id,n.sourceTaskId),eq(N.detector_version,n.detectorVersion),eq(N.content_fingerprint,n.contentFingerprint))).orderBy(asc(N.created_at),asc(N.id)).limit(1).get();if(g)return g}let u=e.id??ln("thl"),c={id:u,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(N).values(c).run();let l=i.select().from(N).where(eq(N.id,u)).get();if(!l)throw new f("DB_ERROR","Highlight insert did not return a row");let p=gn(i,d.id)+1;return hn(i,d.id)||(mn(i,d,r,o,p),p+=1),tr(i,l,r,o,"thread.highlight.created",p),l},{behavior:"immediate"})}catch(i){throw i instanceof f?i:new f("DB_ERROR","Failed to create thread highlight",i)}finally{s.close();}}updateHighlight(e){C(e.threadId,"threadId"),C(e.workspaceId,"workspaceId"),C(e.highlightId,"highlightId"),(!Number.isInteger(e.expectedRevision)||e.expectedRevision<0)&&F("expectedRevision must be a non-negative integer"),e.text===void 0&&e.kind===void 0&&e.coversFromTaskId===void 0&&e.coversToTaskId===void 0&&F("highlight update requires at least one field"),e.kind!==void 0&&mo(e.kind);let n=e.text===void 0?void 0:ho(e.text),r=fn(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||ve(`Thread ${e.threadId} not found`);let u=i.select().from(N).where(and(eq(N.id,e.highlightId),eq(N.thread_id,d.id))).limit(1).get();if(u||ve(`Highlight ${e.highlightId} not found`),u.revision!==e.expectedRevision)throw new kn(d.id,u.id,e.expectedRevision,u.revision);if(u.status!=="active")throw new kn(d.id,u.id,e.expectedRevision,u.revision);let c=e.kind??u.kind,l=n??u.text,p=e.coversFromTaskId??u.covers_from_task_id,g=e.coversToTaskId??u.covers_to_task_id;(!l||p.length===0||g.length===0)&&F("highlight projection is incomplete");let m=c!==u.kind||l!==u.text||p!==u.covers_from_task_id||g!==u.covers_to_task_id,I=r.actorType==="user"&&u.source==="auto"&&m?"manual":u.source;if(!(m||I!==u.source))return u;let k=u.revision+1;i.update(N).set({source:I,kind:c,text:l,covers_from_task_id:p,covers_to_task_id:g,revision:k,updated_at:o}).where(and(eq(N.id,u.id),eq(N.revision,u.revision))).run();let D=i.select().from(N).where(eq(N.id,u.id)).get();if(!D)throw new f("DB_ERROR","Highlight update did not return a row");let L=gn(i,d.id)+1;return hn(i,d.id)||(mn(i,d,r,o,L),L+=1),tr(i,D,r,o,"thread.highlight.updated",L,u),D},{behavior:"immediate"})}catch(i){throw i instanceof f?i:new f("DB_ERROR","Failed to update thread highlight",i)}finally{s.close();}}dismissHighlight(e){C(e.threadId,"threadId"),C(e.workspaceId,"workspaceId"),C(e.highlightId,"highlightId"),(!Number.isInteger(e.expectedRevision)||e.expectedRevision<0)&&F("expectedRevision must be a non-negative integer");let n=fn(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||ve(`Thread ${e.threadId} not found`);let d=s.select().from(N).where(and(eq(N.id,e.highlightId),eq(N.thread_id,i.id))).limit(1).get();if(d||ve(`Highlight ${e.highlightId} not found`),d.revision!==e.expectedRevision)throw new kn(i.id,d.id,e.expectedRevision,d.revision);if(d.status==="dismissed")return d;let u=d.revision+1;s.update(N).set({status:"dismissed",text:null,revision:u,updated_at:r,dismissed_at:r}).where(and(eq(N.id,d.id),eq(N.revision,d.revision))).run();let c=s.select().from(N).where(eq(N.id,d.id)).get();if(!c)throw new f("DB_ERROR","Highlight dismissal did not return a row");let l=gn(s,i.id)+1;return hn(s,i.id)||(mn(s,i,n,r,l),l+=1),tr(s,c,n,r,"thread.highlight.deleted",l,d),c},{behavior:"immediate"})}catch(s){throw s instanceof f?s:new f("DB_ERROR","Failed to dismiss thread highlight",s)}finally{o.close();}}listActiveHighlights(e,n,r={}){if(C(e,"threadId"),C(n,"workspaceId"),r.taskId!==void 0&&C(r.taskId,"taskId"),r.coversFromTaskId!==void 0&&C(r.coversFromTaskId,"coversFromTaskId"),r.coversToTaskId!==void 0&&C(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(N).where(and(eq(N.thread_id,e),eq(N.status,"active"))).orderBy(asc(N.created_at),asc(N.id)).all();if(r.taskId===void 0&&r.coversFromTaskId===void 0&&r.coversToTaskId===void 0)return i;let d=o.db.all(sql`
|
|
375
406
|
SELECT id, started_at FROM tasks WHERE thread_id = ${e}
|
|
376
407
|
ORDER BY started_at ASC, id ASC
|
|
377
|
-
`),
|
|
408
|
+
`),u=new Map(d.map((g,m)=>[g.id,m])),c=r.taskId===void 0?void 0:u.get(r.taskId),l=r.coversFromTaskId===void 0?void 0:u.get(r.coversFromTaskId),p=r.coversToTaskId===void 0?void 0:u.get(r.coversToTaskId);return i.filter(g=>{let m=u.get(g.covers_from_task_id),I=u.get(g.covers_to_task_id);if(m===void 0||I===void 0)return !1;let y=Math.min(m,I),k=Math.max(m,I);return !(c!==void 0&&(c<y||c>k)||l!==void 0&&k<l||p!==void 0&&y>p)})}catch(s){throw s instanceof f?s:new f("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();ot();ht();_t();nt();wt();Er();var z=class extends f{reason;constructor(e,n="VALIDATION",r=e,o){super(n,r,o),this.name="CommonCodeRepositoryError",this.reason=e;}},Xi="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function Qc(){let t=randomBytes(16),e="";for(let n of t)e+=Xi[n%Xi.length];return e.slice(0,12)}function Yi(){return `c_${Qc()}`}function Zc(t){return typeof t=="string"&&wr.includes(t)}function el(t){return typeof t=="string"&&yr.includes(t)}function Lt(t){if(!Zc(t))throw new z("COMMON_CODE_GROUP_INVALID","VALIDATION",`Unsupported common-code group: ${t}`)}function Qi(t){if(!el(t))throw new z("COMMON_CODE_COLOR_INVALID","VALIDATION",`Unsupported common-code color: ${t}`)}function Zi(t){let e=typeof t=="string"?t.trim():"",n=[...e].length;if(n<1||n>20)throw new z("COMMON_CODE_NAME_INVALID","VALIDATION","Common-code names must contain 1 to 20 Unicode characters");return e}function Mt(t){if(typeof t!="string"||t.trim().length===0)throw new z("COMMON_CODE_WORKSPACE_INVALID","VALIDATION","Workspace id is required for a user common code")}function or(t){if(typeof t!="string"||t.trim().length===0)throw new z("COMMON_CODE_CODE_INVALID","VALIDATION","Common-code code is required")}function tt(t,e){return and(eq(S.code_group,t),or$1(isNull(S.workspace_id),eq(S.workspace_id,e)))}var sr=class extends le{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 f("NOT_FOUND","Database not found");e&&mkdirSync(dirname(n),{recursive:true});let r=j(n);if(e)try{be(r.db,n);}catch(o){throw r.close(),o}return r}listSelectable(e,n){if(Lt(e),Mt(n),!this.dbExists())return [];let r=this.openHandle(false);try{return r.db.select().from(S).where(and(tt(e,n),eq(S.is_archived,0))).orderBy(asc(S.sort_order),asc(S.code)).all()}catch(o){throw new f("DB_ERROR","Failed to list selectable common codes",o)}finally{r.close();}}listForHistory(e,n){if(Lt(e),Mt(n),!this.dbExists())return [];let r=this.openHandle(false);try{return r.db.select().from(S).where(tt(e,n)).orderBy(asc(S.sort_order),asc(S.code)).all()}catch(o){throw new f("DB_ERROR","Failed to list common-code history",o)}finally{r.close();}}reorder(e){let n=e.group;if(Lt(n),Mt(e.workspaceId),!Array.isArray(e.codes)||e.codes.length===0)throw new z("COMMON_CODE_REORDER_INVALID","VALIDATION","At least one common-code code is required for reordering");for(let o of e.codes)or(o);if(new Set(e.codes).size!==e.codes.length)throw new z("COMMON_CODE_REORDER_INVALID","VALIDATION","Common-code reorder entries must be unique");if(!this.dbExists())throw new z("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(S).where(tt(n,e.workspaceId)).all(),i=s.filter(m=>m.is_archived===0),d=new Set(s.map(m=>m.code)),u=new Set(i.map(m=>m.code)),c=e.codes.find(m=>!d.has(m));if(c)throw new z("COMMON_CODE_REORDER_INVALID","VALIDATION",`Common code is not available in this scope: ${n}/${c}`);if(e.codes.length!==i.length||e.codes.some(m=>!u.has(m)))throw new z("COMMON_CODE_REORDER_INVALID","VALIDATION","Common-code reorder must contain every non-archived code in the scope");let l=new Map(i.map(m=>[m.code,m])),p=e.codes.map(m=>{let I=l.get(m);if(!I)throw new z("COMMON_CODE_REORDER_INVALID","VALIDATION",`Common code is not selectable in this scope: ${n}/${m}`);return I}),g;for(let[m,I]of p.entries())I.sort_order!==m&&(g??=new Date().toISOString(),o.update(S).set({sort_order:m,updated_at:g}).where(and(eq(S.code_group,n),eq(S.code,I.code))).run());return o.select().from(S).where(tt(n,e.workspaceId)).orderBy(asc(S.sort_order),asc(S.code)).all()},{behavior:"immediate"})}catch(o){throw o instanceof f?o:new f("DB_ERROR","Failed to reorder common codes",o)}finally{r.close();}}resolve(e,n){if(Lt(e),or(n),!this.dbExists())return null;let r=this.openHandle(false);try{return r.db.select().from(S).where(and(eq(S.code_group,e),eq(S.code,n))).limit(1).get()??null}catch(o){throw new f("DB_ERROR","Failed to resolve common code",o)}finally{r.close();}}createThreadState(e){Mt(e.workspaceId);let n=Zi(e.name);Qi(e.color);let r=this.openHandle(true);try{return r.db.transaction(o=>{if(o.select({code:S.code}).from(S).where(and(tt("THREAD_STATE",e.workspaceId),eq(S.is_archived,0),eq(S.code_name,n))).limit(1).get())throw new z("COMMON_CODE_NAME_CONFLICT","CONFLICT",`Common-code name is already in use: ${n}`);let i=o.select({maxSortOrder:sql`max(${S.sort_order})`}).from(S).where(tt("THREAD_STATE",e.workspaceId)).get(),d=new Date().toISOString(),u=Yi();for(;o.select({code:S.code}).from(S).where(and(eq(S.code_group,"THREAD_STATE"),eq(S.code,u))).limit(1).get();)u=Yi();o.insert(S).values({code_group:"THREAD_STATE",code:u,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 c=o.select().from(S).where(and(eq(S.code_group,"THREAD_STATE"),eq(S.code,u))).limit(1).get();if(!c)throw new f("DB_ERROR","Created common code could not be read back");return c},{behavior:"immediate"})}catch(o){throw o instanceof f?o:new f("DB_ERROR","Failed to create thread state common code",o)}finally{r.close();}}updateDisplay(e){if(Lt(e.group),or(e.code),Mt(e.workspaceId),e.name===void 0&&e.color===void 0)throw new z("COMMON_CODE_UPDATE_EMPTY","VALIDATION","At least one display value is required");let n=e.name===void 0||e.name===null?e.name:Zi(e.name);e.color!==void 0&&Qi(e.color);let r=this.openHandle(true);try{return r.db.transaction(o=>{let s=o.select().from(S).where(and(eq(S.code_group,e.group),eq(S.code,e.code))).limit(1).get();if(!s)throw new z("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 z("COMMON_CODE_NAME_INVALID","VALIDATION","User common-code names cannot be cleared");if(typeof n=="string"&&s.is_archived===0){let u=and(tt(e.group,e.workspaceId),eq(S.is_archived,0));if(o.select({code:S.code}).from(S).where(and(u,eq(S.code_name,n),sql`${S.code} <> ${e.code}`)).limit(1).get())throw new z("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(S).set(i).where(and(eq(S.code_group,e.group),eq(S.code,e.code))).run();let d=o.select().from(S).where(and(eq(S.code_group,e.group),eq(S.code,e.code))).limit(1).get();if(!d)throw new f("DB_ERROR","Updated common code could not be read back");return d},{behavior:"immediate"})}catch(o){throw o instanceof f?o:new f("DB_ERROR","Failed to update common-code display values",o)}finally{r.close();}}archive(e,n,r,o=true){if(Lt(e),or(n),Mt(r),typeof o!="boolean")throw new z("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(S).where(and(eq(S.code_group,e),eq(S.code,n))).limit(1).get();if(!d)throw new z("COMMON_CODE_NOT_FOUND","NOT_FOUND",`Common code not found: ${e}/${n}`);if(d.is_builtin===1)throw new z("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:S.code}).from(S).where(and(tt(e,r),eq(S.is_archived,0),eq(S.code_name,d.code_name),ne(S.code,n))).limit(1).get())throw new z("COMMON_CODE_NAME_CONFLICT","CONFLICT",`Common-code name is already in use: ${d.code_name}`);i.update(S).set({is_archived:o?1:0,updated_at:new Date().toISOString()}).where(and(eq(S.code_group,e),eq(S.code,n))).run();let u=i.select().from(S).where(and(eq(S.code_group,e),eq(S.code,n))).limit(1).get();if(!u)throw new f("DB_ERROR","Archived common code could not be read back");return u},{behavior:"immediate"})}catch(i){throw i instanceof f?i:new f("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 z("COMMON_CODE_SCOPE_FORBIDDEN","VALIDATION","Workspace does not own this common code")}};function rl(t){return t.replace(/<crewx_thread_context[^>]*>[\s\S]*?<\/crewx_thread_context>/g,"").replace(/<conversation_history[^>]*>[\s\S]*?<\/conversation_history>/g,"").split(`
|
|
378
409
|
`).filter(o=>!(o.startsWith("Loaded ")&&o.includes("layouts from")||o.includes("[dotenv@")||o.includes("[Nest]")&&o.includes("DEBUG")||o.startsWith("Registered custom layout:")||o.startsWith("Updated custom layout:"))).join(`
|
|
379
|
-
`).trim()}function
|
|
380
|
-
`):o&&typeof o=="object"&&o.result!==void 0&&(r=o.result||"");}catch{r=
|
|
381
|
-
`)[0].slice(0,200)),n.push({id:`${r.id}-assistant`,text:i,isAssistant:true,timestamp:new Date(r.started_at).getTime(),taskId:r.id,metadata:d});}}return n}};var
|
|
410
|
+
`).trim()}function ol(t){if(t)try{let e=JSON.parse(t);if(typeof e!="object"||e===null||Array.isArray(e))return;let n=e.provider;return typeof n=="string"?n:void 0}catch{return}}function sl(t,e,n){if(!t||e==="failed"&&Jn(t,n))return "";let r=t;try{let o=JSON.parse(r);Array.isArray(o)?r=o.filter(s=>s?.type==="text"&&s?.text).map(s=>s.text).join(`
|
|
411
|
+
`):o&&typeof o=="object"&&o.result!==void 0&&(r=o.result||"");}catch{r=rl(r);}return r}var ir=class{dbPath;constructor(e){this.dbPath=e??join(homedir(),".crewx","crewx.db");}getThreadRepo(){return new Zn({dbPath:this.dbPath})}getThreadHistoryRepo(){return new rr({dbPath:this.dbPath})}updateThread(e,n){this.getThreadRepo().updateThread(e,{title:n.title});}async ensureThread(e,n,r){let o=this.getThreadRepo(),s=o.findThreadById(e);if(s){if(s.platform!==n)throw new Error(`Thread '${e}' already exists with platform '${s.platform}' \u2014 cannot change to '${n}' (platform is immutable)`);return {created:false}}return o.ensureThread(e,n,r),{created:true}}async fetchHistory(e,n){let r=n?.limit??100,o=this.getThreadRepo(),s=o.findThreadById(e),i=o.findTopLevelTasks(e,void 0,r),d=new Set(["queued","cancelled"]);i=i.filter(p=>(!p.status||!d.has(p.status))&&(!n?.currentTraceId||p.trace_id!==n.currentTraceId));let u=s?.platform??"cli",c=this.rowsToMessages(i),l=n?.includeHighlights===false?void 0:this.readActiveHighlights(e,s?.workspace_id??null);return {threadId:e,platform:u,messages:c,...l?{highlights:l}:{},metadata:{title:s?.title??void 0,firstMessage:s?.first_message??void 0,lastMessage:s?.last_message??void 0,messageCount:s?.message_count??0,updatedAt:s?.updated_at?new Date(s.updated_at).getTime():void 0}}}async fetchThreadState(e){try{let n=this.getThreadHistoryRepo().getSnapshot(e);if(!n)return;let r=new sr({dbPath:this.dbPath}),o=(s,i)=>{try{return r.resolve(s,i)?.code_name||i}catch{return i}};return {...n.title?{title:n.title}:{},...n.priority?{priority:{code:n.priority,name:o("THREAD_PRIORITY",n.priority)}}:{},...n.state?{state:{code:n.state,name:o("THREAD_STATE",n.state)}}:{}}}catch{return}}async fetchHighlights(e){let n=this.getThreadRepo().findThreadById(e);return this.readActiveHighlights(e,n?.workspace_id??null)}async saveUserMessage(e,n,r,o){let{firstMessage:s}=this.getThreadRepo().saveUserMessage(e,n);return {id:e,firstMessage:s}}async saveAssistantMessage(e,n,r,o){return this.getThreadRepo().saveAssistantMessage(e,n),{id:e}}close(){}normalizeStatus(e){if(e&&!["success","completed","done"].includes(e)){if(["failed","error"].includes(e))return "failed";if(e==="running")return "running"}}readActiveHighlights(e,n){if(!n)return [];try{return (this.getThreadHistoryRepo().listActiveHighlights(e,n)??[]).filter(o=>typeof o.text=="string"&&o.text.length>0).map(o=>({id:o.id,text:o.text,kind:o.kind,source:o.source,coversFromTaskId:o.covers_from_task_id,coversToTaskId:o.covers_to_task_id,createdAt:o.created_at}))}catch{return}}rowsToMessages(e){let n=[];for(let r of e){r.prompt&&n.push({id:`${r.id}-user`,text:r.prompt,isAssistant:false,timestamp:new Date(r.started_at).getTime(),taskId:r.id,metadata:{caller_agent_id:r.caller_agent_id,task_id:r.id}});let o=this.normalizeStatus(r.status),s=ol(r.metadata),i=sl(r.result,o??r.status??null,s);if(i||o==="running"||o==="failed"){let d={agent_id:r.agent_id,task_id:r.id};o&&(d.status=o),o==="failed"&&r.error&&(d.reason=r.error.split(`
|
|
412
|
+
`)[0].slice(0,200)),n.push({id:`${r.id}-assistant`,text:i,isAssistant:true,timestamp:new Date(r.started_at).getTime(),taskId:r.id,metadata:d});}}return n}};var _o=class extends Je{name="conversation";_provider;unsubStart=null;unsubEnd=null;constructor(e){super(),this._provider=new ir(e?.dbPath);}get conversationProvider(){return this._provider}async afterUserMessage(e,n,r,o){}async afterAssistantMessage(e,n,r){}attach(e){this.unsubStart=e.on("task:start",async n=>{if(!n.threadId)return;let r=n.platform??"cli";try{let o=await this._provider.ensureThread(n.threadId,r,n.workspaceId),s=await this._provider.saveUserMessage(n.threadId,n.message??"");await this.afterUserMessage(n.threadId,s.id,o.created||s.firstMessage,n);}catch{}}),this.unsubEnd=e.on("task:end",async n=>{if(!n.result)return;let r=n.metadata?.threadId;if(!r)return;let o=n.agentRef?.replace(/^@/,"")??"";try{let{id:s}=await this._provider.saveAssistantMessage(r,n.result,o);await this.afterAssistantMessage(r,s,n);}catch{}});}detach(e){this.unsubStart?.(),this.unsubStart=null,this.unsubEnd?.(),this.unsubEnd=null,this._provider.close?.();}};export{_o as ConversationPlugin,dr as FileLoggerPlugin,so as SqliteTracingPlugin};
|