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

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.
@@ -8,9 +8,9 @@ Message: ${e.message}
8
8
  `;fs.writeFileSync(r,o,{encoding:"utf8",mode:384});}catch{}}),t.on("task:output",e=>{try{let s=this.logFiles.get(e.traceId);if(!s)return;let r=new Date().toISOString();fs.appendFileSync(s,`[${r}] STDOUT: ${e.output}
9
9
  `,"utf8");}catch{}}),t.on("task:end",e=>{try{let s=this.logFiles.get(e.traceId);if(!s)return;let r=new Date().toLocaleString(),o=e.error?`failed: ${e.error.message}`:"completed successfully",a=`[${r}] INFO: Task ${o} in ${e.durationMs}ms
10
10
  [${r}] INFO: Process closed with exit code: ${e.error?1:0}
11
- `;fs.appendFileSync(s,a,"utf8"),this.logFiles.delete(e.traceId);}catch{}}));}detach(t){this.unsubs.forEach(e=>e()),this.unsubs=[],this.logFiles.clear();}};function Qt(d){let t=B__namespace.resolve(d);return process.platform==="win32"&&(t=t.replace(/\\/g,"/"),t=t.replace(/^([A-Z]):/,(e,s)=>`${s.toLowerCase()}:`)),t.length>1&&!/^[a-zA-Z]:\/$/.test(t)&&(t=t.replace(/\/+$/,"")),t}function Dt(d){let t=Qt(d);return crypto.createHash("sha256").update(t).digest("hex")}var Z=class{resolveDbPath(){return process.env.CREWX_DB?process.env.CREWX_DB:process.env.CREWX_TRACES_DB?process.env.CREWX_TRACES_DB:B.join(ee__default.default.homedir(),".crewx","crewx.db")}resolveDbPaths(){return [this.resolveDbPath()]}isMissingTableError(t){return t instanceof Error&&/no such table:/i.test(t.message)}dbExists(t){return fs.existsSync(t??this.resolveDbPath())}};function T(d){let t=it("better-sqlite3"),{drizzle:e}=it("drizzle-orm/better-sqlite3"),s=new t(d);return s.exec("PRAGMA journal_mode = WAL"),s.exec("PRAGMA busy_timeout = 5000"),s.exec("PRAGMA foreign_keys = ON"),s.exec("PRAGMA analysis_limit = 400"),s.exec("PRAGMA optimize"),{db:e(s),runRaw:(r,o=[])=>s.prepare(r).run(...o),close:()=>s.close()}}var vt=new Set,ne={agent_id:"TEXT",status:"TEXT DEFAULT 'running'",started_at:"TEXT",trace_id:"TEXT",parent_task_id:"TEXT",crewx_version:"TEXT",pid:"INTEGER",thread_id:"TEXT",workspace_id:"TEXT",workspace_ref:"TEXT",workspace_name:"TEXT",project_id:"TEXT",project_name:"TEXT"};function wt(d,t){return (d.get(`SELECT count(*) as cnt FROM sqlite_master WHERE type='table' AND name='${t}'`)?.cnt??0)>0}function se(d,t){if(t>0||!wt(d,"tasks"))return;let e=d.all("PRAGMA table_info(tasks)"),s=new Set(e.map(r=>r.name));for(let[r,o]of Object.entries(ne))s.has(r)||d.run(`ALTER TABLE tasks ADD COLUMN ${r} ${o}`);}var re={"0002_normalize_task_names":{workspace_name:"TEXT",project_name:"TEXT"}};function oe(d,t,e){if(!wt(d,"__drizzle_migrations")||!wt(d,"tasks"))return;let s=d.all(e`SELECT hash FROM __drizzle_migrations`),r=new Set(s.map(a=>a.hash)),o=JSON.parse(fs.readFileSync(B__namespace.default.join(t,"meta/_journal.json"),"utf-8"));for(let a of o.entries){let i=re[a.tag];if(!i)continue;let c=B__namespace.default.join(t,`${a.tag}.sql`);if(!fs.existsSync(c))continue;let l=fs.readFileSync(c,"utf-8"),u=crypto.createHash("sha256").update(l).digest("hex");if(r.has(u))continue;let h=d.all("PRAGMA table_info(tasks)"),f=new Set(h.map(R=>R.name));for(let[R,A]of Object.entries(i))f.has(R)||(d.run(`ALTER TABLE tasks ADD COLUMN ${R} ${A}`),f.add(R));}}function ae(d,t,e){let s=d.all(e`SELECT hash FROM __drizzle_migrations`),r=new Set(s.map(a=>a.hash)),o=JSON.parse(fs.readFileSync(B__namespace.default.join(t,"meta/_journal.json"),"utf-8"));for(let a of o.entries){let i=B__namespace.default.join(t,`${a.tag}.sql`);if(!fs.existsSync(i))continue;let c=fs.readFileSync(i,"utf-8"),l=crypto.createHash("sha256").update(c).digest("hex");if(r.has(l))continue;let u=/ALTER\s+TABLE\s+[`"]?(\w+)[`"]?\s+ADD\s+[`"]?(\w+)[`"]?/gi,h=[],f;for(;(f=u.exec(c))!==null;)h.push({table:f[1],column:f[2]});if(h.length===0||!c.split(/-->\s*statement-breakpoint/).map(C=>C.trim()).filter(Boolean).every(C=>/^ALTER\s+TABLE\s+.+\s+ADD\s+/i.test(C)))continue;h.every(({table:C,column:$})=>d.all(`PRAGMA table_info("${C}")`).some(U=>U.name===$))&&d.run(e`INSERT INTO __drizzle_migrations (hash, created_at) VALUES (${l}, ${a.when})`);}}function ie(d){let{migrate:t}=it("drizzle-orm/better-sqlite3/migrator"),{sql:e}=it("drizzle-orm"),s=[B__namespace.default.join(__dirname,"../migrations"),B__namespace.default.join(__dirname,"migrations"),B__namespace.default.join(__dirname,"../../../../drizzle/migrations"),B__namespace.default.join(process.cwd(),"drizzle/migrations")],r=s.find(l=>fs.existsSync(B__namespace.default.join(l,"meta/_journal.json")));if(!r)throw new Error(`migrations folder not found. Searched:
11
+ `;fs.appendFileSync(s,a,"utf8"),this.logFiles.delete(e.traceId);}catch{}}));}detach(t){this.unsubs.forEach(e=>e()),this.unsubs=[],this.logFiles.clear();}};function Qt(d){let t=B__namespace.resolve(d);return process.platform==="win32"&&(t=t.replace(/\\/g,"/"),t=t.replace(/^([A-Z]):/,(e,s)=>`${s.toLowerCase()}:`)),t.length>1&&!/^[a-zA-Z]:\/$/.test(t)&&(t=t.replace(/\/+$/,"")),t}function Dt(d){let t=Qt(d);return crypto.createHash("sha256").update(t).digest("hex")}var Z=class{resolveDbPath(){return process.env.CREWX_DB?process.env.CREWX_DB:process.env.CREWX_TRACES_DB?process.env.CREWX_TRACES_DB:B.join(ee__default.default.homedir(),".crewx","crewx.db")}resolveDbPaths(){return [this.resolveDbPath()]}isMissingTableError(t){return t instanceof Error&&/no such table:/i.test(t.message)}dbExists(t){return fs.existsSync(t??this.resolveDbPath())}};function T(d){let t=it("better-sqlite3"),{drizzle:e}=it("drizzle-orm/better-sqlite3"),s=new t(d);return s.exec("PRAGMA journal_mode = WAL"),s.exec("PRAGMA busy_timeout = 5000"),s.exec("PRAGMA foreign_keys = ON"),s.exec("PRAGMA analysis_limit = 400"),s.exec("PRAGMA optimize"),{db:e(s),runRaw:(r,o=[])=>s.prepare(r).run(...o),close:()=>s.close()}}var vt=new Set,ne={agent_id:"TEXT",status:"TEXT DEFAULT 'running'",started_at:"TEXT",trace_id:"TEXT",parent_task_id:"TEXT",crewx_version:"TEXT",pid:"INTEGER",thread_id:"TEXT",workspace_id:"TEXT",workspace_ref:"TEXT",workspace_name:"TEXT",project_id:"TEXT",project_name:"TEXT"};function wt(d,t){return (d.get(`SELECT count(*) as cnt FROM sqlite_master WHERE type='table' AND name='${t}'`)?.cnt??0)>0}function se(d,t){if(t>0||!wt(d,"tasks"))return;let e=d.all("PRAGMA table_info(tasks)"),s=new Set(e.map(r=>r.name));for(let[r,o]of Object.entries(ne))s.has(r)||d.run(`ALTER TABLE tasks ADD COLUMN ${r} ${o}`);}var re={"0002_normalize_task_names":{workspace_name:"TEXT",project_name:"TEXT"}};function oe(d,t,e){if(!wt(d,"__drizzle_migrations")||!wt(d,"tasks"))return;let s=d.all(e`SELECT hash FROM __drizzle_migrations`),r=new Set(s.map(a=>a.hash)),o=JSON.parse(fs.readFileSync(B__namespace.default.join(t,"meta/_journal.json"),"utf-8"));for(let a of o.entries){let i=re[a.tag];if(!i)continue;let c=B__namespace.default.join(t,`${a.tag}.sql`);if(!fs.existsSync(c))continue;let l=fs.readFileSync(c,"utf-8"),u=crypto.createHash("sha256").update(l).digest("hex");if(r.has(u))continue;let h=d.all("PRAGMA table_info(tasks)"),g=new Set(h.map(R=>R.name));for(let[R,A]of Object.entries(i))g.has(R)||(d.run(`ALTER TABLE tasks ADD COLUMN ${R} ${A}`),g.add(R));}}function ae(d,t,e){let s=d.all(e`SELECT hash FROM __drizzle_migrations`),r=new Set(s.map(a=>a.hash)),o=JSON.parse(fs.readFileSync(B__namespace.default.join(t,"meta/_journal.json"),"utf-8"));for(let a of o.entries){let i=B__namespace.default.join(t,`${a.tag}.sql`);if(!fs.existsSync(i))continue;let c=fs.readFileSync(i,"utf-8"),l=crypto.createHash("sha256").update(c).digest("hex");if(r.has(l))continue;let u=/ALTER\s+TABLE\s+[`"]?(\w+)[`"]?\s+ADD\s+[`"]?(\w+)[`"]?/gi,h=[],g;for(;(g=u.exec(c))!==null;)h.push({table:g[1],column:g[2]});if(h.length===0||!c.split(/-->\s*statement-breakpoint/).map(C=>C.trim()).filter(Boolean).every(C=>/^ALTER\s+TABLE\s+.+\s+ADD\s+/i.test(C)))continue;h.every(({table:C,column:$})=>d.all(`PRAGMA table_info("${C}")`).some(U=>U.name===$))&&d.run(e`INSERT INTO __drizzle_migrations (hash, created_at) VALUES (${l}, ${a.when})`);}}function ie(d){let{migrate:t}=it("drizzle-orm/better-sqlite3/migrator"),{sql:e}=it("drizzle-orm"),s=[B__namespace.default.join(__dirname,"../migrations"),B__namespace.default.join(__dirname,"migrations"),B__namespace.default.join(__dirname,"../../../../drizzle/migrations"),B__namespace.default.join(process.cwd(),"drizzle/migrations")],r=s.find(l=>fs.existsSync(B__namespace.default.join(l,"meta/_journal.json")));if(!r)throw new Error(`migrations folder not found. Searched:
12
12
  ${s.join(`
13
- `)}`);let o=d.get(e`SELECT count(*) as cnt FROM sqlite_master WHERE type='table' AND name='__drizzle_migrations'`),a=0;o?.cnt&&(a=d.get(e`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0),se(d,a),o?.cnt&&(ae(d,r,e),oe(d,r,e)),t(d,{migrationsFolder:r});let c=(d.get(e`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0)-a;if(c>0){let l=o?.cnt?"Database migrated":"Database initialized";console.error(`[crewx] ${l} (${c} migration${c>1?"s":""} applied).`);}}function lt(d,t){vt.has(t)||(ie(d),vt.add(t));}var p=class extends Error{code;cause;constructor(t,e,s){super(e),this.name="RepositoryError",this.code=t,this.cause=s,Object.setPrototypeOf(this,new.target.prototype);}};var tt=sqliteCore.sqliteTable("workspaces",{id:sqliteCore.text("id").primaryKey(),slug:sqliteCore.text("slug").notNull().unique(),name:sqliteCore.text("name").notNull(),workspace_path:sqliteCore.text("workspace_path"),description:sqliteCore.text("description"),is_active:sqliteCore.integer("is_active").notNull().default(1),created_at:sqliteCore.text("created_at").notNull(),updated_at:sqliteCore.text("updated_at").notNull()});var n=sqliteCore.sqliteTable("tasks",{id:sqliteCore.text("id").primaryKey(),agent_id:sqliteCore.text("agent_id").notNull(),user_id:sqliteCore.text("user_id"),prompt:sqliteCore.text("prompt").notNull(),mode:sqliteCore.text("mode").notNull().default("execute"),status:sqliteCore.text("status").notNull().default("running"),result:sqliteCore.text("result"),error:sqliteCore.text("error"),started_at:sqliteCore.text("started_at").notNull(),completed_at:sqliteCore.text("completed_at"),duration_ms:sqliteCore.integer("duration_ms"),metadata:sqliteCore.text("metadata"),workspace_id:sqliteCore.text("workspace_id"),trace_id:sqliteCore.text("trace_id"),parent_task_id:sqliteCore.text("parent_task_id"),caller_agent_id:sqliteCore.text("caller_agent_id"),model:sqliteCore.text("model"),platform:sqliteCore.text("platform").default("cli"),crewx_version:sqliteCore.text("crewx_version"),input_tokens:sqliteCore.integer("input_tokens").default(0),output_tokens:sqliteCore.integer("output_tokens").default(0),cost_usd:sqliteCore.real("cost_usd").default(0),pid:sqliteCore.integer("pid"),rendered_prompt:sqliteCore.text("rendered_prompt"),command:sqliteCore.text("command"),coding_agent_command:sqliteCore.text("coding_agent_command"),exit_code:sqliteCore.integer("exit_code"),logs:sqliteCore.text("logs"),thread_id:sqliteCore.text("thread_id"),workspace_ref:sqliteCore.text("workspace_ref"),project_id:sqliteCore.text("project_id"),project_ref:sqliteCore.text("project_ref"),cached_input_tokens:sqliteCore.integer("cached_input_tokens").default(0),run_epoch:sqliteCore.integer("run_epoch").default(0)},d=>({idx_tasks_agent_id:sqliteCore.index("idx_tasks_agent_id").on(d.agent_id),idx_tasks_status:sqliteCore.index("idx_tasks_status").on(d.status),idx_tasks_started_at:sqliteCore.index("idx_tasks_started_at").on(d.started_at),idx_tasks_trace_id:sqliteCore.index("idx_tasks_trace_id").on(d.trace_id),idx_tasks_parent_task_id:sqliteCore.index("idx_tasks_parent_task_id").on(d.parent_task_id),idx_tasks_crewx_version:sqliteCore.index("idx_tasks_crewx_version").on(d.crewx_version),idx_tasks_pid:sqliteCore.index("idx_tasks_pid").on(d.pid),idx_tasks_thread_id:sqliteCore.index("idx_tasks_thread_id").on(d.thread_id),idx_tasks_workspace_id:sqliteCore.index("idx_tasks_workspace_id").on(d.workspace_id),idx_tasks_workspace_ref:sqliteCore.index("idx_tasks_workspace_ref").on(d.workspace_ref),idx_tasks_project_id:sqliteCore.index("idx_tasks_project_id").on(d.project_id),idx_tasks_ws_started:sqliteCore.index("idx_tasks_ws_started").on(d.workspace_id,d.started_at)}));var _=sqliteCore.sqliteTable("threads",{id:sqliteCore.text("id").primaryKey(),workspace_id:sqliteCore.text("workspace_id").references(()=>tt.id,{onDelete:"set null"}),platform:sqliteCore.text("platform").notNull().default("cli"),title:sqliteCore.text("title"),first_message:sqliteCore.text("first_message"),last_message:sqliteCore.text("last_message"),message_count:sqliteCore.integer("message_count").notNull().default(0),created_at:sqliteCore.text("created_at").notNull(),updated_at:sqliteCore.text("updated_at").notNull(),metadata:sqliteCore.text("metadata"),title_locked:sqliteCore.integer("title_locked").notNull().default(0),pinned:sqliteCore.integer("pinned").notNull().default(0),starred:sqliteCore.integer("starred").notNull().default(0)},d=>({idx_threads_updated_at:sqliteCore.index("idx_threads_updated_at").on(d.updated_at),idx_threads_workspace_id:sqliteCore.index("idx_threads_workspace_id").on(d.workspace_id),idx_threads_ws_updated:sqliteCore.index("idx_threads_ws_updated").on(d.workspace_id,d.updated_at),idx_threads_title:sqliteCore.index("idx_threads_title").on(d.title)}));var fe=sqliteCore.sqliteTable("spans",{id:sqliteCore.text("id").primaryKey(),task_id:sqliteCore.text("task_id").references(()=>n.id,{onDelete:"set null"}),parent_span_id:sqliteCore.text("parent_span_id").references(()=>fe.id,{onDelete:"set null"}),name:sqliteCore.text("name").notNull(),kind:sqliteCore.text("kind").notNull().default("internal"),status:sqliteCore.text("status").notNull().default("ok"),started_at:sqliteCore.text("started_at").notNull(),completed_at:sqliteCore.text("completed_at"),duration_ms:sqliteCore.integer("duration_ms"),input:sqliteCore.text("input"),output:sqliteCore.text("output"),error:sqliteCore.text("error"),attributes:sqliteCore.text("attributes")},d=>({idx_spans_task_id:sqliteCore.index("idx_spans_task_id").on(d.task_id),idx_spans_parent_span_id:sqliteCore.index("idx_spans_parent_span_id").on(d.parent_span_id)}));sqliteCore.sqliteTable("tool_calls",{id:sqliteCore.text("id").primaryKey(),task_id:sqliteCore.text("task_id").references(()=>n.id,{onDelete:"cascade"}),session_id:sqliteCore.text("session_id"),tool_name:sqliteCore.text("tool_name").notNull(),files:sqliteCore.text("files"),input:sqliteCore.text("input"),output:sqliteCore.text("output"),duration_ms:sqliteCore.integer("duration_ms"),timestamp:sqliteCore.text("timestamp").notNull()},d=>({idx_tool_calls_task_id:sqliteCore.index("idx_tool_calls_task_id").on(d.task_id),idx_tool_calls_tool_name:sqliteCore.index("idx_tool_calls_tool_name").on(d.tool_name),idx_tool_calls_timestamp:sqliteCore.index("idx_tool_calls_timestamp").on(d.timestamp)}));sqliteCore.sqliteTable("thread_boxes",{id:sqliteCore.text("id").primaryKey(),thread_id:sqliteCore.text("thread_id").notNull().references(()=>_.id,{onDelete:"cascade"}),seq:sqliteCore.integer("seq").notNull(),first_task_id:sqliteCore.text("first_task_id").notNull(),mid_task_id:sqliteCore.text("mid_task_id").notNull(),last_task_id:sqliteCore.text("last_task_id").notNull(),task_count:sqliteCore.integer("task_count").notNull(),summary:sqliteCore.text("summary"),source_tokens:sqliteCore.integer("source_tokens").notNull(),summary_tokens:sqliteCore.integer("summary_tokens"),created_at:sqliteCore.text("created_at").notNull()},d=>({idx_thread_boxes_thread_id:sqliteCore.index("idx_thread_boxes_thread_id").on(d.thread_id),idx_thread_boxes_seq:sqliteCore.index("idx_thread_boxes_seq").on(d.thread_id,d.seq),uniq_thread_boxes_thread_seq:sqliteCore.unique().on(d.thread_id,d.seq)}));sqliteCore.sqliteTable("request_logs",{id:sqliteCore.text("id").primaryKey(),path:sqliteCore.text("path").notNull(),method:sqliteCore.text("method").notNull(),status_code:sqliteCore.integer("status_code").notNull(),duration_ms:sqliteCore.integer("duration_ms").notNull(),ip:sqliteCore.text("ip"),request_headers:sqliteCore.text("request_headers"),response_headers:sqliteCore.text("response_headers"),request_body:sqliteCore.text("request_body"),response_body:sqliteCore.text("response_body"),query:sqliteCore.text("query"),user_id:sqliteCore.text("user_id"),project_id:sqliteCore.text("project_id"),partition_key:sqliteCore.text("partition_key").notNull(),timestamp:sqliteCore.text("timestamp").notNull().default(drizzleOrm.sql`(datetime('now'))`),metadata:sqliteCore.text("metadata")},d=>({idx_request_logs_timestamp:sqliteCore.index("idx_request_logs_timestamp").on(d.timestamp),idx_request_logs_path:sqliteCore.index("idx_request_logs_path").on(d.path),idx_request_logs_status_code:sqliteCore.index("idx_request_logs_status_code").on(d.status_code),idx_request_logs_partition_key:sqliteCore.index("idx_request_logs_partition_key").on(d.partition_key)}));sqliteCore.sqliteTable("usage_limit_snapshots",{id:sqliteCore.text("id").primaryKey(),provider:sqliteCore.text("provider").notNull(),account_ref:sqliteCore.text("account_ref").notNull().default("default"),limit_window:sqliteCore.text("limit_window").notNull(),bucket_start:sqliteCore.text("bucket_start").notNull(),captured_at:sqliteCore.text("captured_at").notNull(),used_percent:sqliteCore.integer("used_percent").notNull(),remaining_percent:sqliteCore.integer("remaining_percent").notNull(),resets_at:sqliteCore.text("resets_at"),source:sqliteCore.text("source").notNull(),metadata:sqliteCore.text("metadata")},d=>({uniq_usage_limit_snapshots_bucket:sqliteCore.uniqueIndex("uniq_usage_limit_snapshots_bucket").on(d.provider,d.account_ref,d.limit_window,d.bucket_start),idx_usage_limit_snapshots_window_bucket:sqliteCore.index("idx_usage_limit_snapshots_window_bucket").on(d.limit_window,d.bucket_start),idx_usage_limit_snapshots_provider_window_bucket:sqliteCore.index("idx_usage_limit_snapshots_provider_window_bucket").on(d.provider,d.limit_window,d.bucket_start)}));sqliteCore.sqliteTable("usage_reports",{id:sqliteCore.text("id").primaryKey(),workspace_id:sqliteCore.text("workspace_id").notNull(),month:sqliteCore.text("month").notNull(),generated_at:sqliteCore.text("generated_at").notNull(),source_range:sqliteCore.text("source_range").notNull(),tier:sqliteCore.text("tier").notNull(),total_tokens:sqliteCore.integer("total_tokens").notNull(),total_cost_usd:sqliteCore.real("total_cost_usd").notNull(),payload:sqliteCore.text("payload").notNull(),payload_hash:sqliteCore.text("payload_hash"),signature:sqliteCore.text("signature"),signed_at:sqliteCore.text("signed_at"),issuer:sqliteCore.text("issuer")},d=>({uniq_usage_reports_ws_month:sqliteCore.uniqueIndex("uniq_usage_reports_ws_month").on(d.workspace_id,d.month)}));sqliteCore.sqliteTable("notifications",{id:sqliteCore.text("id").primaryKey(),workspace_id:sqliteCore.text("workspace_id").notNull(),agent_id:sqliteCore.text("agent_id"),task_id:sqliteCore.text("task_id"),thread_id:sqliteCore.text("thread_id"),source:sqliteCore.text("source").notNull().default("agent"),level:sqliteCore.text("level").notNull().default("info"),title:sqliteCore.text("title").notNull(),body:sqliteCore.text("body"),target_user_id:sqliteCore.text("target_user_id"),created_at:sqliteCore.text("created_at").notNull(),metadata:sqliteCore.text("metadata")},d=>({idx_notifications_ws_created:sqliteCore.index("idx_notifications_ws_created").on(d.workspace_id,drizzleOrm.sql`${d.created_at} DESC`)}));sqliteCore.sqliteTable("notification_reads",{notification_id:sqliteCore.text("notification_id").notNull(),user_id:sqliteCore.text("user_id").notNull(),read_at:sqliteCore.text("read_at").notNull()},d=>({pk:sqliteCore.primaryKey({columns:[d.notification_id,d.user_id]})}));sqliteCore.sqliteTable("agent_suggestions",{id:sqliteCore.text("id").primaryKey(),workspace_id:sqliteCore.text("workspace_id").notNull(),agent_id:sqliteCore.text("agent_id").notNull(),task_id:sqliteCore.text("task_id"),type:sqliteCore.text("type").notNull(),status:sqliteCore.text("status").notNull().default("pending"),payload:sqliteCore.text("payload").notNull(),applied_commit_sha:sqliteCore.text("applied_commit_sha"),created_at:sqliteCore.text("created_at").notNull(),updated_at:sqliteCore.text("updated_at").notNull()},d=>({idx_agent_suggestions_ws_agent:sqliteCore.index("idx_agent_suggestions_ws_agent").on(d.workspace_id,d.agent_id),idx_agent_suggestions_ws_created:sqliteCore.index("idx_agent_suggestions_ws_created").on(d.workspace_id,d.created_at)}));function Ht(d){let t=d.toLowerCase().trim();t=t.replace(/\[[^\]]*\]$/g,"");let e=t.lastIndexOf("/");return e>=0&&(t=t.slice(e+1)),t=t.replace(/-\d{8}$/,""),t}var j="2026-05-09",Ue="0.8.9-rc.13",G=10,X=parseInt(Ue.split("rc.")[1]),Be=new Set(["workflow","mcp"]),zt=600*1e3,ft=class extends Z{dbPath;pidNullObservedSince=new Map;constructor(t={}){super(),t.dbPath?this.dbPath=t.dbPath:t.dbRoot&&(this.dbPath=B.join(t.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(t){let e=this.resolveDbPath();if(t){let r=B.dirname(e);fs.existsSync(r)||fs.mkdirSync(r,{recursive:true});}else if(!fs.existsSync(e))throw new p("NOT_FOUND","Database not found");let s=T(e);if(t)try{lt(s.db,e);}catch(r){throw s.close(),r}return s}startTask(t){let e=this.openHandle(true);try{e.db.insert(n).values({id:t.id,agent_id:t.agentId,prompt:t.prompt,mode:t.mode,status:t.status,started_at:t.startedAt,pid:t.pid??null,parent_task_id:t.parentTaskId??null,caller_agent_id:t.callerAgentId??null,trace_id:t.traceId??null,command:t.command??null,metadata:t.metadata??null,workspace_id:t.workspaceId??null,platform:t.platform??"cli",crewx_version:t.crewxVersion??null,thread_id:t.threadId??null,model:t.model??null,rendered_prompt:t.renderedPrompt??null,coding_agent_command:t.codingAgentCommand??null}).onConflictDoUpdate({target:n.id,set:{pid:drizzleOrm.sql`COALESCE(excluded.pid, ${n.pid})`},setWhere:drizzleOrm.eq(n.status,"running")}).run();}catch(s){throw s instanceof p?s:new p("DB_ERROR","Failed to start task",s)}finally{e.close();}}finishTask(t){let e=this.openHandle(true);try{let s=t.runEpoch??null;e.runRaw(`UPDATE tasks SET status=?, result=?, error=?, completed_at=?, duration_ms=?,
13
+ `)}`);let o=d.get(e`SELECT count(*) as cnt FROM sqlite_master WHERE type='table' AND name='__drizzle_migrations'`),a=0;o?.cnt&&(a=d.get(e`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0),se(d,a),o?.cnt&&(ae(d,r,e),oe(d,r,e)),t(d,{migrationsFolder:r});let c=(d.get(e`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0)-a;if(c>0){let l=o?.cnt?"Database migrated":"Database initialized";console.error(`[crewx] ${l} (${c} migration${c>1?"s":""} applied).`);}}function lt(d,t){vt.has(t)||(ie(d),vt.add(t));}var p=class extends Error{code;cause;constructor(t,e,s){super(e),this.name="RepositoryError",this.code=t,this.cause=s,Object.setPrototypeOf(this,new.target.prototype);}};var tt=sqliteCore.sqliteTable("workspaces",{id:sqliteCore.text("id").primaryKey(),slug:sqliteCore.text("slug").notNull().unique(),name:sqliteCore.text("name").notNull(),workspace_path:sqliteCore.text("workspace_path"),description:sqliteCore.text("description"),is_active:sqliteCore.integer("is_active").notNull().default(1),created_at:sqliteCore.text("created_at").notNull(),updated_at:sqliteCore.text("updated_at").notNull()});var n=sqliteCore.sqliteTable("tasks",{id:sqliteCore.text("id").primaryKey(),agent_id:sqliteCore.text("agent_id").notNull(),user_id:sqliteCore.text("user_id"),prompt:sqliteCore.text("prompt").notNull(),mode:sqliteCore.text("mode").notNull().default("execute"),status:sqliteCore.text("status").notNull().default("running"),result:sqliteCore.text("result"),error:sqliteCore.text("error"),started_at:sqliteCore.text("started_at").notNull(),completed_at:sqliteCore.text("completed_at"),duration_ms:sqliteCore.integer("duration_ms"),metadata:sqliteCore.text("metadata"),workspace_id:sqliteCore.text("workspace_id"),trace_id:sqliteCore.text("trace_id"),parent_task_id:sqliteCore.text("parent_task_id"),caller_agent_id:sqliteCore.text("caller_agent_id"),model:sqliteCore.text("model"),platform:sqliteCore.text("platform").default("cli"),crewx_version:sqliteCore.text("crewx_version"),input_tokens:sqliteCore.integer("input_tokens").default(0),output_tokens:sqliteCore.integer("output_tokens").default(0),cost_usd:sqliteCore.real("cost_usd").default(0),pid:sqliteCore.integer("pid"),rendered_prompt:sqliteCore.text("rendered_prompt"),command:sqliteCore.text("command"),coding_agent_command:sqliteCore.text("coding_agent_command"),exit_code:sqliteCore.integer("exit_code"),logs:sqliteCore.text("logs"),thread_id:sqliteCore.text("thread_id"),workspace_ref:sqliteCore.text("workspace_ref"),project_id:sqliteCore.text("project_id"),project_ref:sqliteCore.text("project_ref"),cached_input_tokens:sqliteCore.integer("cached_input_tokens").default(0),run_epoch:sqliteCore.integer("run_epoch").default(0)},d=>({idx_tasks_agent_id:sqliteCore.index("idx_tasks_agent_id").on(d.agent_id),idx_tasks_status:sqliteCore.index("idx_tasks_status").on(d.status),idx_tasks_started_at:sqliteCore.index("idx_tasks_started_at").on(d.started_at),idx_tasks_trace_id:sqliteCore.index("idx_tasks_trace_id").on(d.trace_id),idx_tasks_parent_task_id:sqliteCore.index("idx_tasks_parent_task_id").on(d.parent_task_id),idx_tasks_crewx_version:sqliteCore.index("idx_tasks_crewx_version").on(d.crewx_version),idx_tasks_pid:sqliteCore.index("idx_tasks_pid").on(d.pid),idx_tasks_thread_id:sqliteCore.index("idx_tasks_thread_id").on(d.thread_id),idx_tasks_workspace_id:sqliteCore.index("idx_tasks_workspace_id").on(d.workspace_id),idx_tasks_workspace_ref:sqliteCore.index("idx_tasks_workspace_ref").on(d.workspace_ref),idx_tasks_project_id:sqliteCore.index("idx_tasks_project_id").on(d.project_id),idx_tasks_ws_started:sqliteCore.index("idx_tasks_ws_started").on(d.workspace_id,d.started_at)}));var _=sqliteCore.sqliteTable("threads",{id:sqliteCore.text("id").primaryKey(),workspace_id:sqliteCore.text("workspace_id").references(()=>tt.id,{onDelete:"set null"}),platform:sqliteCore.text("platform").notNull().default("cli"),title:sqliteCore.text("title"),first_message:sqliteCore.text("first_message"),last_message:sqliteCore.text("last_message"),message_count:sqliteCore.integer("message_count").notNull().default(0),created_at:sqliteCore.text("created_at").notNull(),updated_at:sqliteCore.text("updated_at").notNull(),metadata:sqliteCore.text("metadata"),title_locked:sqliteCore.integer("title_locked").notNull().default(0),pinned:sqliteCore.integer("pinned").notNull().default(0),starred:sqliteCore.integer("starred").notNull().default(0)},d=>({idx_threads_updated_at:sqliteCore.index("idx_threads_updated_at").on(d.updated_at),idx_threads_workspace_id:sqliteCore.index("idx_threads_workspace_id").on(d.workspace_id),idx_threads_ws_updated:sqliteCore.index("idx_threads_ws_updated").on(d.workspace_id,d.updated_at),idx_threads_title:sqliteCore.index("idx_threads_title").on(d.title)}));var ge=sqliteCore.sqliteTable("spans",{id:sqliteCore.text("id").primaryKey(),task_id:sqliteCore.text("task_id").references(()=>n.id,{onDelete:"set null"}),parent_span_id:sqliteCore.text("parent_span_id").references(()=>ge.id,{onDelete:"set null"}),name:sqliteCore.text("name").notNull(),kind:sqliteCore.text("kind").notNull().default("internal"),status:sqliteCore.text("status").notNull().default("ok"),started_at:sqliteCore.text("started_at").notNull(),completed_at:sqliteCore.text("completed_at"),duration_ms:sqliteCore.integer("duration_ms"),input:sqliteCore.text("input"),output:sqliteCore.text("output"),error:sqliteCore.text("error"),attributes:sqliteCore.text("attributes")},d=>({idx_spans_task_id:sqliteCore.index("idx_spans_task_id").on(d.task_id),idx_spans_parent_span_id:sqliteCore.index("idx_spans_parent_span_id").on(d.parent_span_id)}));sqliteCore.sqliteTable("tool_calls",{id:sqliteCore.text("id").primaryKey(),task_id:sqliteCore.text("task_id").references(()=>n.id,{onDelete:"cascade"}),session_id:sqliteCore.text("session_id"),tool_name:sqliteCore.text("tool_name").notNull(),files:sqliteCore.text("files"),input:sqliteCore.text("input"),output:sqliteCore.text("output"),duration_ms:sqliteCore.integer("duration_ms"),timestamp:sqliteCore.text("timestamp").notNull()},d=>({idx_tool_calls_task_id:sqliteCore.index("idx_tool_calls_task_id").on(d.task_id),idx_tool_calls_tool_name:sqliteCore.index("idx_tool_calls_tool_name").on(d.tool_name),idx_tool_calls_timestamp:sqliteCore.index("idx_tool_calls_timestamp").on(d.timestamp)}));sqliteCore.sqliteTable("thread_boxes",{id:sqliteCore.text("id").primaryKey(),thread_id:sqliteCore.text("thread_id").notNull().references(()=>_.id,{onDelete:"cascade"}),seq:sqliteCore.integer("seq").notNull(),first_task_id:sqliteCore.text("first_task_id").notNull(),mid_task_id:sqliteCore.text("mid_task_id").notNull(),last_task_id:sqliteCore.text("last_task_id").notNull(),task_count:sqliteCore.integer("task_count").notNull(),summary:sqliteCore.text("summary"),source_tokens:sqliteCore.integer("source_tokens").notNull(),summary_tokens:sqliteCore.integer("summary_tokens"),created_at:sqliteCore.text("created_at").notNull()},d=>({idx_thread_boxes_thread_id:sqliteCore.index("idx_thread_boxes_thread_id").on(d.thread_id),idx_thread_boxes_seq:sqliteCore.index("idx_thread_boxes_seq").on(d.thread_id,d.seq),uniq_thread_boxes_thread_seq:sqliteCore.unique().on(d.thread_id,d.seq)}));sqliteCore.sqliteTable("request_logs",{id:sqliteCore.text("id").primaryKey(),path:sqliteCore.text("path").notNull(),method:sqliteCore.text("method").notNull(),status_code:sqliteCore.integer("status_code").notNull(),duration_ms:sqliteCore.integer("duration_ms").notNull(),ip:sqliteCore.text("ip"),request_headers:sqliteCore.text("request_headers"),response_headers:sqliteCore.text("response_headers"),request_body:sqliteCore.text("request_body"),response_body:sqliteCore.text("response_body"),query:sqliteCore.text("query"),user_id:sqliteCore.text("user_id"),project_id:sqliteCore.text("project_id"),partition_key:sqliteCore.text("partition_key").notNull(),timestamp:sqliteCore.text("timestamp").notNull().default(drizzleOrm.sql`(datetime('now'))`),metadata:sqliteCore.text("metadata")},d=>({idx_request_logs_timestamp:sqliteCore.index("idx_request_logs_timestamp").on(d.timestamp),idx_request_logs_path:sqliteCore.index("idx_request_logs_path").on(d.path),idx_request_logs_status_code:sqliteCore.index("idx_request_logs_status_code").on(d.status_code),idx_request_logs_partition_key:sqliteCore.index("idx_request_logs_partition_key").on(d.partition_key)}));sqliteCore.sqliteTable("usage_limit_snapshots",{id:sqliteCore.text("id").primaryKey(),provider:sqliteCore.text("provider").notNull(),account_ref:sqliteCore.text("account_ref").notNull().default("default"),limit_window:sqliteCore.text("limit_window").notNull(),bucket_start:sqliteCore.text("bucket_start").notNull(),captured_at:sqliteCore.text("captured_at").notNull(),used_percent:sqliteCore.integer("used_percent").notNull(),remaining_percent:sqliteCore.integer("remaining_percent").notNull(),resets_at:sqliteCore.text("resets_at"),source:sqliteCore.text("source").notNull(),metadata:sqliteCore.text("metadata")},d=>({uniq_usage_limit_snapshots_bucket:sqliteCore.uniqueIndex("uniq_usage_limit_snapshots_bucket").on(d.provider,d.account_ref,d.limit_window,d.bucket_start),idx_usage_limit_snapshots_window_bucket:sqliteCore.index("idx_usage_limit_snapshots_window_bucket").on(d.limit_window,d.bucket_start),idx_usage_limit_snapshots_provider_window_bucket:sqliteCore.index("idx_usage_limit_snapshots_provider_window_bucket").on(d.provider,d.limit_window,d.bucket_start)}));sqliteCore.sqliteTable("usage_reports",{id:sqliteCore.text("id").primaryKey(),workspace_id:sqliteCore.text("workspace_id").notNull(),month:sqliteCore.text("month").notNull(),generated_at:sqliteCore.text("generated_at").notNull(),source_range:sqliteCore.text("source_range").notNull(),tier:sqliteCore.text("tier").notNull(),total_tokens:sqliteCore.integer("total_tokens").notNull(),total_cost_usd:sqliteCore.real("total_cost_usd").notNull(),payload:sqliteCore.text("payload").notNull(),payload_hash:sqliteCore.text("payload_hash"),signature:sqliteCore.text("signature"),signed_at:sqliteCore.text("signed_at"),issuer:sqliteCore.text("issuer")},d=>({uniq_usage_reports_ws_month:sqliteCore.uniqueIndex("uniq_usage_reports_ws_month").on(d.workspace_id,d.month)}));sqliteCore.sqliteTable("notifications",{id:sqliteCore.text("id").primaryKey(),workspace_id:sqliteCore.text("workspace_id").notNull(),agent_id:sqliteCore.text("agent_id"),task_id:sqliteCore.text("task_id"),thread_id:sqliteCore.text("thread_id"),source:sqliteCore.text("source").notNull().default("agent"),level:sqliteCore.text("level").notNull().default("info"),title:sqliteCore.text("title").notNull(),body:sqliteCore.text("body"),target_user_id:sqliteCore.text("target_user_id"),created_at:sqliteCore.text("created_at").notNull(),metadata:sqliteCore.text("metadata")},d=>({idx_notifications_ws_created:sqliteCore.index("idx_notifications_ws_created").on(d.workspace_id,drizzleOrm.sql`${d.created_at} DESC`)}));sqliteCore.sqliteTable("notification_reads",{notification_id:sqliteCore.text("notification_id").notNull(),user_id:sqliteCore.text("user_id").notNull(),read_at:sqliteCore.text("read_at").notNull()},d=>({pk:sqliteCore.primaryKey({columns:[d.notification_id,d.user_id]})}));sqliteCore.sqliteTable("agent_suggestions",{id:sqliteCore.text("id").primaryKey(),workspace_id:sqliteCore.text("workspace_id").notNull(),agent_id:sqliteCore.text("agent_id").notNull(),task_id:sqliteCore.text("task_id"),type:sqliteCore.text("type").notNull(),status:sqliteCore.text("status").notNull().default("pending"),payload:sqliteCore.text("payload").notNull(),applied_commit_sha:sqliteCore.text("applied_commit_sha"),created_at:sqliteCore.text("created_at").notNull(),updated_at:sqliteCore.text("updated_at").notNull()},d=>({idx_agent_suggestions_ws_agent:sqliteCore.index("idx_agent_suggestions_ws_agent").on(d.workspace_id,d.agent_id),idx_agent_suggestions_ws_created:sqliteCore.index("idx_agent_suggestions_ws_created").on(d.workspace_id,d.created_at)}));function Ht(d){let t=d.toLowerCase().trim();t=t.replace(/\[[^\]]*\]$/g,"");let e=t.lastIndexOf("/");return e>=0&&(t=t.slice(e+1)),t=t.replace(/-\d{8}$/,""),t}var j="2026-05-09",Ue="0.8.9-rc.13",G=10,X=parseInt(Ue.split("rc.")[1]),Be=new Set(["workflow","mcp"]),zt=600*1e3,gt=class extends Z{dbPath;pidNullObservedSince=new Map;constructor(t={}){super(),t.dbPath?this.dbPath=t.dbPath:t.dbRoot&&(this.dbPath=B.join(t.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(t){let e=this.resolveDbPath();if(t){let r=B.dirname(e);fs.existsSync(r)||fs.mkdirSync(r,{recursive:true});}else if(!fs.existsSync(e))throw new p("NOT_FOUND","Database not found");let s=T(e);if(t)try{lt(s.db,e);}catch(r){throw s.close(),r}return s}startTask(t){let e=this.openHandle(true);try{e.db.insert(n).values({id:t.id,agent_id:t.agentId,prompt:t.prompt,mode:t.mode,status:t.status,started_at:t.startedAt,pid:t.pid??null,parent_task_id:t.parentTaskId??null,caller_agent_id:t.callerAgentId??null,trace_id:t.traceId??null,command:t.command??null,metadata:t.metadata??null,workspace_id:t.workspaceId??null,platform:t.platform??"cli",crewx_version:t.crewxVersion??null,thread_id:t.threadId??null,model:t.model??null,rendered_prompt:t.renderedPrompt??null,coding_agent_command:t.codingAgentCommand??null}).onConflictDoUpdate({target:n.id,set:{pid:drizzleOrm.sql`COALESCE(excluded.pid, ${n.pid})`},setWhere:drizzleOrm.eq(n.status,"running")}).run();}catch(s){throw s instanceof p?s:new p("DB_ERROR","Failed to start task",s)}finally{e.close();}}finishTask(t){let e=this.openHandle(true);try{let s=t.runEpoch??null;e.runRaw(`UPDATE tasks SET status=?, result=?, error=?, completed_at=?, duration_ms=?,
14
14
  exit_code=?, input_tokens=?, output_tokens=?, cached_input_tokens=?, cost_usd=?,
15
15
  model=COALESCE(?, model)
16
16
  WHERE id=? AND status='running' AND COALESCE(run_epoch, 0) = COALESCE(?, 0)`,[t.status,t.result??null,t.error??null,t.completedAt,t.durationMs??null,t.exitCode??null,t.inputTokens??0,t.outputTokens??0,t.cachedInputTokens??0,t.costUsd??0,t.model??null,t.id,s]);}catch(s){throw s instanceof p?s:new p("DB_ERROR","Failed to finish task",s)}finally{e.close();}}appendLog(t,e){let s=this.openHandle(true);try{s.db.transaction(r=>{let o=r.select({logs:n.logs}).from(n).where(drizzleOrm.eq(n.id,t)).limit(1).get(),a=o?.logs?JSON.parse(o.logs):[];a.push(e),r.update(n).set({logs:JSON.stringify(a)}).where(drizzleOrm.eq(n.id,t)).run();},{behavior:"immediate"});}catch(r){throw r instanceof p?r:new p("DB_ERROR","Failed to append log",r)}finally{s.close();}}getRunningTasks(){if(!this.dbExists())return [];let t=this.openHandle(false);try{return t.db.select().from(n).where(drizzleOrm.eq(n.status,"running")).orderBy(drizzleOrm.desc(n.started_at)).all()}catch(e){throw new p("DB_ERROR","Failed to get running tasks",e)}finally{t.close();}}getAllTasks(){if(!this.dbExists())return [];let t=this.openHandle(false);try{return t.db.select().from(n).orderBy(drizzleOrm.desc(n.started_at)).limit(100).all()}catch(e){throw new p("DB_ERROR","Failed to get all tasks",e)}finally{t.close();}}getTask(t){if(!this.dbExists())return;let e=this.openHandle(false);try{return e.db.select().from(n).where(drizzleOrm.eq(n.id,t)).limit(1).get()??void 0}catch(s){throw new p("DB_ERROR","Failed to get task",s)}finally{e.close();}}killTask(t){if(!this.dbExists())return {killed:false};let e=this.openHandle(true);try{let s=e.db.select({id:n.id,status:n.status,pid:n.pid}).from(n).where(drizzleOrm.eq(n.id,t)).limit(1).get();if(!s||s.status!=="running")return {killed:!1};if(s.pid)try{process.kill(s.pid,"SIGTERM");}catch{}return e.db.update(n).set({status:"failed",error:"Killed by user",completed_at:new Date().toISOString()}).where(drizzleOrm.and(drizzleOrm.eq(n.id,t),drizzleOrm.eq(n.status,"running"))).run(),{killed:!0,pid:s.pid??void 0}}catch(s){throw s instanceof p?s:new p("DB_ERROR","Failed to kill task",s)}finally{e.close();}}reapOrphanedTasks(){if(!this.dbExists())return 0;let t=this.openHandle(true);try{let e=t.db.select({id:n.id,pid:n.pid,platform:n.platform,run_epoch:n.run_epoch}).from(n).where(drizzleOrm.eq(n.status,"running")).all(),s=Date.now(),r=new Set,o=0;for(let a of e){if(a.pid){let l=!1;try{process.kill(a.pid,0),l=!0;}catch{}l||(t.db.update(n).set({status:"failed",error:"Reaped: process not found (orphaned task)",completed_at:new Date().toISOString()}).where(drizzleOrm.and(drizzleOrm.eq(n.id,a.id),drizzleOrm.eq(n.status,"running"))).run(),o++);continue}if(Be.has(a.platform??"cli"))continue;let i=`${a.id}:${a.run_epoch??0}`;r.add(i);let c=this.pidNullObservedSince.get(i);if(c===void 0){this.pidNullObservedSince.set(i,s);continue}s-c>=zt&&(t.db.update(n).set({status:"failed",error:"Reaped: pid never recorded after resume (stale running_instruction)",completed_at:new Date().toISOString()}).where(drizzleOrm.and(drizzleOrm.eq(n.id,a.id),drizzleOrm.eq(n.status,"running"))).run(),o++,this.pidNullObservedSince.delete(i));}for(let a of Array.from(this.pidNullObservedSince.keys()))r.has(a)||this.pidNullObservedSince.delete(a);return o}finally{t.close();}}reapRunningWorkflowTasks(t=zt){if(!this.dbExists())return 0;let e=this.openHandle(true);try{let s=new Date(Date.now()-t).toISOString();return e.db.update(n).set({status:"failed",error:"Reaped: stale workflow run (finally not executed)",completed_at:new Date().toISOString()}).where(drizzleOrm.and(drizzleOrm.eq(n.status,"running"),drizzleOrm.eq(n.platform,"workflow"),drizzleOrm.isNull(n.pid),drizzleOrm.lt(n.started_at,s))).run().changes??0}finally{e.close();}}findTaskStatus(t,e){let s=this.resolveDbPaths();for(let r of s){if(!fs.existsSync(r))continue;let o=T(r);try{let a=e?drizzleOrm.eq(n.workspace_id,e):void 0,i=a?drizzleOrm.and(drizzleOrm.eq(n.id,t),a):drizzleOrm.eq(n.id,t),c=o.db.select().from(n).where(i).limit(1).get()??void 0;if(!c){let l=drizzleOrm.or(drizzleOrm.eq(n.thread_id,t),drizzleOrm.and(drizzleOrm.isNull(n.thread_id),drizzleOrm.like(n.command,`%--thread=${t}%`))),u=a?drizzleOrm.and(l,a):l;c=o.db.select().from(n).where(u).orderBy(drizzleOrm.desc(n.started_at)).limit(1).get()??void 0;}if(c)return c}catch(a){throw new p("DB_ERROR","Failed to find task status",a)}finally{o.close();}}}findChildTasks(t,e){let s=this.resolveDbPaths(),r=new Set,o=[];for(let a of s){if(!fs.existsSync(a))continue;let i=T(a);try{let c=e?drizzleOrm.and(drizzleOrm.eq(n.parent_task_id,t),drizzleOrm.eq(n.workspace_id,e)):drizzleOrm.eq(n.parent_task_id,t),l=i.db.select().from(n).where(c).orderBy(drizzleOrm.asc(n.started_at)).all();for(let u of l)r.has(u.id)||(r.add(u.id),o.push(u));}catch(c){throw new p("DB_ERROR","Failed to find child tasks",c)}finally{i.close();}}return o}getWorkspaceUsageSummary(t){if(!this.dbExists())return [];let e=this.openHandle(false);try{return e.db.all(t?drizzleOrm.sql`
@@ -34,7 +34,7 @@ ${s.join(`
34
34
  FROM tasks
35
35
  GROUP BY workspace_id
36
36
  ORDER BY (COALESCE(SUM(input_tokens), 0) + COALESCE(SUM(output_tokens), 0)) DESC
37
- `)}catch(s){throw new p("DB_ERROR","Failed to get workspace usage summary",s)}finally{e.close();}}getThreadTokenUsage(t,e){let s=this.resolveDbPaths(),r=new Set,o=0,a=0,i=0;for(let c of s){if(!fs.existsSync(c))continue;let l=T(c);try{let u=drizzleOrm.or(drizzleOrm.eq(n.thread_id,t),drizzleOrm.and(drizzleOrm.isNull(n.thread_id),drizzleOrm.like(n.command,`%--thread=${t}%`))),h=e?drizzleOrm.and(u,drizzleOrm.eq(n.workspace_id,e)):u,f=l.db.select({id:n.id,input_tokens:n.input_tokens,output_tokens:n.output_tokens,cost_usd:n.cost_usd}).from(n).where(h).all();for(let R of f)r.has(R.id)||(r.add(R.id),o+=R.input_tokens??0,a+=R.output_tokens??0,i+=R.cost_usd??0);}catch(u){throw new p("DB_ERROR","Failed to get thread token usage",u)}finally{l.close();}}return {inputTokens:o,outputTokens:a,costUsd:i}}findTasksByThread(t,e){let s=this.resolveDbPaths(),r=new Set,o=[];for(let a of s){if(!fs.existsSync(a))continue;let i=T(a);try{let c=drizzleOrm.or(drizzleOrm.eq(n.thread_id,t),drizzleOrm.and(drizzleOrm.isNull(n.thread_id),drizzleOrm.like(n.command,`%--thread=${t}%`))),l=e?drizzleOrm.and(c,drizzleOrm.eq(n.workspace_id,e)):c,u=i.db.select().from(n).where(l).orderBy(drizzleOrm.asc(n.started_at)).all();for(let h of u)r.has(h.id)||(r.add(h.id),o.push(h));}catch(c){throw new p("DB_ERROR","Failed to find tasks by thread",c)}finally{i.close();}}return o}parseWorkflowCardMetadata(t){if(!t)return {};try{let e=JSON.parse(t);return {kind:typeof e.kind=="string"?e.kind:void 0,workflowRunId:typeof e.workflowRunId=="string"?e.workflowRunId:void 0}}catch{return {}}}extractThreadIdFromCommand(t){return t?/--thread=(\S+)/.exec(t)?.[1]??null:null}batchFetchWorkflowCards(t,e){let s=new Map;if(t.length===0)return s;let r=new Set(t),o=new Map,a=e?drizzleOrm.eq(n.workspace_id,e):void 0,i=(c,l)=>{if(!c)return;let u=o.get(c);if(u&&l.started_at<=u)return;let h=this.parseWorkflowCardMetadata(l.metadata);h.kind==="workflow_card"&&(o.set(c,l.started_at),s.set(c,{taskId:l.id,workflowRunId:h.workflowRunId,raw:l.result??void 0}));};for(let c of this.resolveDbPaths()){if(!fs.existsSync(c))continue;let l=T(c);try{let u=drizzleOrm.and(drizzleOrm.inArray(n.thread_id,t),drizzleOrm.like(n.metadata,'%"kind":"workflow_card"%')),h=l.db.select({id:n.id,thread_id:n.thread_id,metadata:n.metadata,result:n.result,started_at:n.started_at}).from(n).where(a?drizzleOrm.and(u,a):u).all();for(let A of h)i(A.thread_id,A);let f=drizzleOrm.and(drizzleOrm.isNull(n.thread_id),drizzleOrm.like(n.metadata,'%"kind":"workflow_card"%')),R=l.db.select({id:n.id,command:n.command,metadata:n.metadata,result:n.result,started_at:n.started_at}).from(n).where(a?drizzleOrm.and(f,a):f).all();for(let A of R){let C=this.extractThreadIdFromCommand(A.command);!C||!r.has(C)||i(C,A);}}catch(u){throw new p("DB_ERROR","Failed to batch fetch workflow cards",u)}finally{l.close();}}return s}findAllTasks(t){if(!this.dbExists())return {rows:[],total:0};let e=this.openHandle(false);try{let s=[];t.workspaceId&&s.push(drizzleOrm.eq(n.workspace_id,t.workspaceId));let r=t.agents&&t.agents.length>0?t.agents:t.agentId?[t.agentId]:null;r&&s.push(drizzleOrm.inArray(n.agent_id,r));let o=t.statuses&&t.statuses.length>0?t.statuses:t.status?[t.status]:null;o&&s.push(drizzleOrm.inArray(n.status,o));let a=t.q??t.search;a&&s.push(drizzleOrm.like(n.prompt,`%${a}%`)),t.from&&s.push(drizzleOrm.gte(n.started_at,t.from)),t.to&&s.push(drizzleOrm.lt(n.started_at,t.to));let i=s.length>0?drizzleOrm.and(...s):void 0,c=e.db.select({count:drizzleOrm.sql`count(*)`}).from(n).where(i).get(),l=(t.sortDir??"DESC")==="ASC"?drizzleOrm.asc(n.started_at):drizzleOrm.desc(n.started_at);return {rows:e.db.select().from(n).where(i).orderBy(l).limit(t.limit).offset(t.offset).all(),total:c?.count??0}}catch(s){throw new p("DB_ERROR","Failed to find all tasks",s)}finally{e.close();}}getAgentUsage(t,e,s){if(!this.dbExists())return [];let r=this.openHandle(false);try{return r.db.all(s?drizzleOrm.sql`
37
+ `)}catch(s){throw new p("DB_ERROR","Failed to get workspace usage summary",s)}finally{e.close();}}getThreadTokenUsage(t,e){let s=this.resolveDbPaths(),r=new Set,o=0,a=0,i=0;for(let c of s){if(!fs.existsSync(c))continue;let l=T(c);try{let u=drizzleOrm.or(drizzleOrm.eq(n.thread_id,t),drizzleOrm.and(drizzleOrm.isNull(n.thread_id),drizzleOrm.like(n.command,`%--thread=${t}%`))),h=e?drizzleOrm.and(u,drizzleOrm.eq(n.workspace_id,e)):u,g=l.db.select({id:n.id,input_tokens:n.input_tokens,output_tokens:n.output_tokens,cost_usd:n.cost_usd}).from(n).where(h).all();for(let R of g)r.has(R.id)||(r.add(R.id),o+=R.input_tokens??0,a+=R.output_tokens??0,i+=R.cost_usd??0);}catch(u){throw new p("DB_ERROR","Failed to get thread token usage",u)}finally{l.close();}}return {inputTokens:o,outputTokens:a,costUsd:i}}findTasksByThread(t,e){let s=this.resolveDbPaths(),r=new Set,o=[];for(let a of s){if(!fs.existsSync(a))continue;let i=T(a);try{let c=drizzleOrm.or(drizzleOrm.eq(n.thread_id,t),drizzleOrm.and(drizzleOrm.isNull(n.thread_id),drizzleOrm.like(n.command,`%--thread=${t}%`))),l=e?drizzleOrm.and(c,drizzleOrm.eq(n.workspace_id,e)):c,u=i.db.select().from(n).where(l).orderBy(drizzleOrm.asc(n.started_at)).all();for(let h of u)r.has(h.id)||(r.add(h.id),o.push(h));}catch(c){throw new p("DB_ERROR","Failed to find tasks by thread",c)}finally{i.close();}}return o}parseWorkflowCardMetadata(t){if(!t)return {};try{let e=JSON.parse(t);return {kind:typeof e.kind=="string"?e.kind:void 0,workflowRunId:typeof e.workflowRunId=="string"?e.workflowRunId:void 0}}catch{return {}}}extractThreadIdFromCommand(t){return t?/--thread=(\S+)/.exec(t)?.[1]??null:null}batchFetchWorkflowCards(t,e){let s=new Map;if(t.length===0)return s;let r=new Set(t),o=new Map,a=e?drizzleOrm.eq(n.workspace_id,e):void 0,i=(c,l)=>{if(!c)return;let u=o.get(c);if(u&&l.started_at<=u)return;let h=this.parseWorkflowCardMetadata(l.metadata);h.kind==="workflow_card"&&(o.set(c,l.started_at),s.set(c,{taskId:l.id,workflowRunId:h.workflowRunId,raw:l.result??void 0}));};for(let c of this.resolveDbPaths()){if(!fs.existsSync(c))continue;let l=T(c);try{let u=drizzleOrm.and(drizzleOrm.inArray(n.thread_id,t),drizzleOrm.like(n.metadata,'%"kind":"workflow_card"%')),h=l.db.select({id:n.id,thread_id:n.thread_id,metadata:n.metadata,result:n.result,started_at:n.started_at}).from(n).where(a?drizzleOrm.and(u,a):u).all();for(let A of h)i(A.thread_id,A);let g=drizzleOrm.and(drizzleOrm.isNull(n.thread_id),drizzleOrm.like(n.metadata,'%"kind":"workflow_card"%')),R=l.db.select({id:n.id,command:n.command,metadata:n.metadata,result:n.result,started_at:n.started_at}).from(n).where(a?drizzleOrm.and(g,a):g).all();for(let A of R){let C=this.extractThreadIdFromCommand(A.command);!C||!r.has(C)||i(C,A);}}catch(u){throw new p("DB_ERROR","Failed to batch fetch workflow cards",u)}finally{l.close();}}return s}findAllTasks(t){if(!this.dbExists())return {rows:[],total:0};let e=this.openHandle(false);try{let s=[];t.workspaceId&&s.push(drizzleOrm.eq(n.workspace_id,t.workspaceId));let r=t.agents&&t.agents.length>0?t.agents:t.agentId?[t.agentId]:null;r&&s.push(drizzleOrm.inArray(n.agent_id,r));let o=t.statuses&&t.statuses.length>0?t.statuses:t.status?[t.status]:null;o&&s.push(drizzleOrm.inArray(n.status,o));let a=t.q??t.search;a&&s.push(drizzleOrm.like(n.prompt,`%${a}%`)),t.from&&s.push(drizzleOrm.gte(n.started_at,t.from)),t.to&&s.push(drizzleOrm.lt(n.started_at,t.to));let i=s.length>0?drizzleOrm.and(...s):void 0,c=e.db.select({count:drizzleOrm.sql`count(*)`}).from(n).where(i).get(),l=(t.sortDir??"DESC")==="ASC"?drizzleOrm.asc(n.started_at):drizzleOrm.desc(n.started_at);return {rows:e.db.select().from(n).where(i).orderBy(l).limit(t.limit).offset(t.offset).all(),total:c?.count??0}}catch(s){throw new p("DB_ERROR","Failed to find all tasks",s)}finally{e.close();}}getAgentUsage(t,e,s){if(!this.dbExists())return [];let r=this.openHandle(false);try{return r.db.all(s?drizzleOrm.sql`
38
38
  SELECT
39
39
  t.agent_id,
40
40
  t.workspace_id,
@@ -244,7 +244,7 @@ ${s.join(`
244
244
  FROM ${n}
245
245
  ${i}
246
246
  GROUP BY ${n.model}
247
- `),l=new Map;for(let u of c){let h=Ht(u.model??""),f=l.get(h);f?(f.totalTasks+=u.total_tasks,f.inputTokens+=u.input_tokens,f.outputTokens+=u.output_tokens,f.cachedInputTokens+=u.cached_input_tokens,f.costUsd+=u.cost_usd,f.totalTokens+=u.input_tokens+u.output_tokens,f.activeDurationMs+=u.active_duration_ms??0,u.last_active_at&&(!f.lastActiveAt||u.last_active_at>f.lastActiveAt)&&(f.lastActiveAt=u.last_active_at)):l.set(h,{model:h,provider:u.provider,totalTasks:u.total_tasks,inputTokens:u.input_tokens,outputTokens:u.output_tokens,cachedInputTokens:u.cached_input_tokens,costUsd:u.cost_usd,totalTokens:u.input_tokens+u.output_tokens,activeDurationMs:u.active_duration_ms??0,lastActiveAt:u.last_active_at??null});}return Array.from(l.values()).sort((u,h)=>h.costUsd-u.costUsd)}catch(o){throw new p("DB_ERROR","Failed to get model usage",o)}finally{r.close();}}getTasksForReport(t,e,s){if(!this.dbExists())return [];let r=this.openHandle(false);try{let o=s?drizzleOrm.sql`WHERE ${n.started_at} >= ${t} AND ${n.started_at} < ${e} AND ${n.workspace_id} = ${s}`:drizzleOrm.sql`WHERE ${n.started_at} >= ${t} AND ${n.started_at} < ${e}`;return r.db.all(drizzleOrm.sql`
247
+ `),l=new Map;for(let u of c){let h=Ht(u.model??""),g=l.get(h);g?(g.totalTasks+=u.total_tasks,g.inputTokens+=u.input_tokens,g.outputTokens+=u.output_tokens,g.cachedInputTokens+=u.cached_input_tokens,g.costUsd+=u.cost_usd,g.totalTokens+=u.input_tokens+u.output_tokens,g.activeDurationMs+=u.active_duration_ms??0,u.last_active_at&&(!g.lastActiveAt||u.last_active_at>g.lastActiveAt)&&(g.lastActiveAt=u.last_active_at)):l.set(h,{model:h,provider:u.provider,totalTasks:u.total_tasks,inputTokens:u.input_tokens,outputTokens:u.output_tokens,cachedInputTokens:u.cached_input_tokens,costUsd:u.cost_usd,totalTokens:u.input_tokens+u.output_tokens,activeDurationMs:u.active_duration_ms??0,lastActiveAt:u.last_active_at??null});}return Array.from(l.values()).sort((u,h)=>h.costUsd-u.costUsd)}catch(o){throw new p("DB_ERROR","Failed to get model usage",o)}finally{r.close();}}getTasksForReport(t,e,s){if(!this.dbExists())return [];let r=this.openHandle(false);try{let o=s?drizzleOrm.sql`WHERE ${n.started_at} >= ${t} AND ${n.started_at} < ${e} AND ${n.workspace_id} = ${s}`:drizzleOrm.sql`WHERE ${n.started_at} >= ${t} AND ${n.started_at} < ${e}`;return r.db.all(drizzleOrm.sql`
248
248
  SELECT
249
249
  ${n.thread_id} AS thread_id,
250
250
  ${n.agent_id} AS agent_id,
@@ -255,11 +255,11 @@ ${s.join(`
255
255
  FROM ${n}
256
256
  ${o}
257
257
  ORDER BY ${n.started_at} ASC
258
- `).map(i=>({threadId:i.thread_id,agentId:i.agent_id,startedAt:i.started_at,status:i.status,error:i.error,exitCode:i.exit_code}))}catch(o){throw new p("DB_ERROR","Failed to get tasks for report",o)}finally{r.close();}}findTaskEvidence(t){if(!this.dbExists())return [];let e=this.openHandle(false);try{let s=[];t.workspaceId&&s.push(drizzleOrm.eq(n.workspace_id,t.workspaceId)),t.agents&&t.agents.length>0&&s.push(drizzleOrm.inArray(n.agent_id,t.agents)),t.statuses&&t.statuses.length>0&&s.push(drizzleOrm.inArray(n.status,t.statuses)),t.from&&s.push(drizzleOrm.gte(n.started_at,t.from)),t.to&&s.push(drizzleOrm.lt(n.started_at,t.to));let r=s.length>0?drizzleOrm.and(...s):void 0,o=(t.order??"DESC")==="ASC"?drizzleOrm.asc(n.started_at):drizzleOrm.desc(n.started_at),a={id:n.id,agent_id:n.agent_id,status:n.status,prompt:n.prompt,started_at:n.started_at,completed_at:n.completed_at,thread_id:n.thread_id};return t.limit?e.db.select(a).from(n).where(r).orderBy(o).limit(t.limit).all():e.db.select(a).from(n).where(r).orderBy(o).all()}catch(s){throw new p("DB_ERROR","Failed to find task evidence",s)}finally{e.close();}}findThreadChains(t){if(!this.dbExists())return [];let e=this.openHandle(false);try{let s=t.maxThreads??8,r=t.maxTurnsPerThread??4,o=[drizzleOrm.isNotNull(n.thread_id),drizzleOrm.isNull(n.parent_task_id),drizzleOrm.isNull(n.caller_agent_id),drizzleOrm.or(drizzleOrm.isNull(n.platform),drizzleOrm.ne(n.platform,"workflow")),drizzleOrm.or(drizzleOrm.isNull(n.metadata),drizzleOrm.notLike(n.metadata,'%"kind":"workflow_card"%')),drizzleOrm.or(drizzleOrm.isNull(n.metadata),drizzleOrm.notLike(n.metadata,'%"retriedFromTaskId"%'))];t.workspaceId&&o.push(drizzleOrm.eq(n.workspace_id,t.workspaceId)),t.from&&o.push(drizzleOrm.gte(n.started_at,t.from)),t.to&&o.push(drizzleOrm.lt(n.started_at,t.to));let a=e.db.select({id:n.id,agent_id:n.agent_id,status:n.status,prompt:n.prompt,started_at:n.started_at,completed_at:n.completed_at,thread_id:n.thread_id}).from(n).where(drizzleOrm.and(...o)).orderBy(drizzleOrm.asc(n.started_at),drizzleOrm.asc(n.id)).all(),i=new Map;for(let l of a){if(!l.thread_id)continue;let u={id:l.id,agentId:l.agent_id,status:l.status,prompt:l.prompt,startedAt:l.started_at,completedAt:l.completed_at},h=i.get(l.thread_id);h?h.push(u):i.set(l.thread_id,[u]);}let c=[];for(let[l,u]of i){let h=u.filter(f=>f.agentId===t.targetAgentId).length;h<2||c.push({threadId:l,targetAgentTurnCount:h,turns:u});}return c.sort((l,u)=>{let h=l.turns[l.turns.length-1].startedAt,f=u.turns[u.turns.length-1].startedAt;return h<f?1:h>f?-1:0}),c.slice(0,s).map(l=>({threadId:l.threadId,targetAgentTurnCount:l.targetAgentTurnCount,turns:l.turns.slice(-r)}))}catch(s){throw new p("DB_ERROR","Failed to find thread chains",s)}finally{e.close();}}};var Rt=class extends q{name="sqlite-tracing";unsubs=[];dbPath;version;constructor(t){super(),this.dbPath=B.join(t?.dbRoot??ee.homedir(),".crewx","crewx.db"),this.version=t?.version??"unknown";}attach(t){let e=new ft({dbPath:this.dbPath}),s=process.cwd(),o=fs.existsSync(B.join(s,"crewx.yaml"))||fs.existsSync(B.join(s,"crewx.yml"))?Dt(s):null,a=process.argv.join(" ");this.unsubs.push(t.on("task:start",i=>{try{let c=i.callerAgentId??null,l=i.parentTaskId??null,u=i.rootTraceId??i.traceId,h=i.metadata?JSON.stringify(i.metadata):JSON.stringify({provider:i.provider??"cli/claude"});e.startTask({id:i.traceId,agentId:i.agentRef.replace(/^@/,""),prompt:i.message,mode:i.mode,status:"running",pid:i.pid??null,startedAt:i.timestamp.toISOString(),crewxVersion:this.version,platform:i.platform??"cli",model:i.model??null,renderedPrompt:i.renderedPrompt??null,command:a,codingAgentCommand:i.codingAgentCommand??null,workspaceId:i.workspaceId??o,callerAgentId:c,parentTaskId:l,traceId:u,metadata:h,threadId:i.threadId??null});}catch{}}),t.on("task:output",i=>{try{e.appendLog(i.traceId,{timestamp:i.timestamp.toISOString(),level:i.level??"stdout",message:i.output});}catch{}}),t.on("task:end",i=>{try{let c=typeof i.metadata?.runEpoch=="number"?i.metadata.runEpoch:null;e.finishTask({id:i.traceId,status:i.error?"failed":"success",result:i.result??null,error:i.error?JSON.stringify(i.error):null,completedAt:i.timestamp.toISOString(),durationMs:i.durationMs,exitCode:i.exitCode??null,inputTokens:i.inputTokens??0,outputTokens:i.outputTokens??0,cachedInputTokens:i.cachedInputTokens??0,costUsd:i.costUsd??0,model:i.model??null,runEpoch:c});}catch{}}));}detach(t){this.unsubs.forEach(e=>e()),this.unsubs=[];}};var gt=class extends Z{dbPath;constructor(t={}){super(),t.dbPath?this.dbPath=t.dbPath:t.dbRoot&&(this.dbPath=B.join(t.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(t){let e=this.resolveDbPath();if(t){let r=B.dirname(e);fs.existsSync(r)||fs.mkdirSync(r,{recursive:true});}else if(!fs.existsSync(e))throw new p("NOT_FOUND","Database not found");let s=T(e);if(t)try{lt(s.db,e);}catch(r){throw s.close(),r}return s}validateWorkspaceId(t,e){return t.db.select({id:tt.id}).from(tt).where(drizzleOrm.eq(tt.id,e)).limit(1).get()?e:null}topLevelTaskPredicateSql(t="child"){return drizzleOrm.sql.raw(`NOT EXISTS (
258
+ `).map(i=>({threadId:i.thread_id,agentId:i.agent_id,startedAt:i.started_at,status:i.status,error:i.error,exitCode:i.exit_code}))}catch(o){throw new p("DB_ERROR","Failed to get tasks for report",o)}finally{r.close();}}findTaskEvidence(t){if(!this.dbExists())return [];let e=this.openHandle(false);try{let s=[];t.workspaceId&&s.push(drizzleOrm.eq(n.workspace_id,t.workspaceId)),t.agents&&t.agents.length>0&&s.push(drizzleOrm.inArray(n.agent_id,t.agents)),t.statuses&&t.statuses.length>0&&s.push(drizzleOrm.inArray(n.status,t.statuses)),t.from&&s.push(drizzleOrm.gte(n.started_at,t.from)),t.to&&s.push(drizzleOrm.lt(n.started_at,t.to));let r=s.length>0?drizzleOrm.and(...s):void 0,o=(t.order??"DESC")==="ASC"?drizzleOrm.asc(n.started_at):drizzleOrm.desc(n.started_at),a={id:n.id,agent_id:n.agent_id,status:n.status,prompt:n.prompt,started_at:n.started_at,completed_at:n.completed_at,thread_id:n.thread_id};return t.limit?e.db.select(a).from(n).where(r).orderBy(o).limit(t.limit).all():e.db.select(a).from(n).where(r).orderBy(o).all()}catch(s){throw new p("DB_ERROR","Failed to find task evidence",s)}finally{e.close();}}findThreadChains(t){if(!this.dbExists())return [];let e=this.openHandle(false);try{let s=t.maxThreads??8,r=t.maxTurnsPerThread??4,o=[drizzleOrm.isNotNull(n.thread_id),drizzleOrm.isNull(n.parent_task_id),drizzleOrm.isNull(n.caller_agent_id),drizzleOrm.or(drizzleOrm.isNull(n.platform),drizzleOrm.ne(n.platform,"workflow")),drizzleOrm.or(drizzleOrm.isNull(n.metadata),drizzleOrm.notLike(n.metadata,'%"kind":"workflow_card"%')),drizzleOrm.or(drizzleOrm.isNull(n.metadata),drizzleOrm.notLike(n.metadata,'%"retriedFromTaskId"%'))];t.workspaceId&&o.push(drizzleOrm.eq(n.workspace_id,t.workspaceId)),t.from&&o.push(drizzleOrm.gte(n.started_at,t.from)),t.to&&o.push(drizzleOrm.lt(n.started_at,t.to));let a=e.db.select({id:n.id,agent_id:n.agent_id,status:n.status,prompt:n.prompt,started_at:n.started_at,completed_at:n.completed_at,thread_id:n.thread_id}).from(n).where(drizzleOrm.and(...o)).orderBy(drizzleOrm.asc(n.started_at),drizzleOrm.asc(n.id)).all(),i=new Map;for(let l of a){if(!l.thread_id)continue;let u={id:l.id,agentId:l.agent_id,status:l.status,prompt:l.prompt,startedAt:l.started_at,completedAt:l.completed_at},h=i.get(l.thread_id);h?h.push(u):i.set(l.thread_id,[u]);}let c=[];for(let[l,u]of i){let h=u.filter(g=>g.agentId===t.targetAgentId).length;h<2||c.push({threadId:l,targetAgentTurnCount:h,turns:u});}return c.sort((l,u)=>{let h=l.turns[l.turns.length-1].startedAt,g=u.turns[u.turns.length-1].startedAt;return h<g?1:h>g?-1:0}),c.slice(0,s).map(l=>({threadId:l.threadId,targetAgentTurnCount:l.targetAgentTurnCount,turns:l.turns.slice(-r)}))}catch(s){throw new p("DB_ERROR","Failed to find thread chains",s)}finally{e.close();}}};var Rt=class extends q{name="sqlite-tracing";unsubs=[];dbPath;version;constructor(t){super(),this.dbPath=B.join(t?.dbRoot??ee.homedir(),".crewx","crewx.db"),this.version=t?.version??"unknown";}attach(t){let e=new gt({dbPath:this.dbPath}),s=process.cwd(),o=fs.existsSync(B.join(s,"crewx.yaml"))||fs.existsSync(B.join(s,"crewx.yml"))?Dt(s):null,a=process.argv.join(" ");this.unsubs.push(t.on("task:start",i=>{try{let c=i.callerAgentId??null,l=i.parentTaskId??null,u=i.rootTraceId??i.traceId,h=i.metadata?JSON.stringify(i.metadata):JSON.stringify({provider:i.provider??"cli/claude"});e.startTask({id:i.traceId,agentId:i.agentRef.replace(/^@/,""),prompt:i.message,mode:i.mode,status:"running",pid:i.pid??null,startedAt:i.timestamp.toISOString(),crewxVersion:this.version,platform:i.platform??"cli",model:i.model??null,renderedPrompt:i.renderedPrompt??null,command:a,codingAgentCommand:i.codingAgentCommand??null,workspaceId:i.workspaceId??o,callerAgentId:c,parentTaskId:l,traceId:u,metadata:h,threadId:i.threadId??null});}catch{}}),t.on("task:output",i=>{try{e.appendLog(i.traceId,{timestamp:i.timestamp.toISOString(),level:i.level??"stdout",message:i.output});}catch{}}),t.on("task:end",i=>{try{let c=typeof i.metadata?.runEpoch=="number"?i.metadata.runEpoch:null,l=i.error?JSON.stringify({code:i.error.code,message:i.error.message,...i.error.providerCode?{providerCode:i.error.providerCode}:{}}):null;e.finishTask({id:i.traceId,status:i.error?"failed":"success",result:i.result??null,error:l,completedAt:i.timestamp.toISOString(),durationMs:i.durationMs,exitCode:i.exitCode??null,inputTokens:i.inputTokens??0,outputTokens:i.outputTokens??0,cachedInputTokens:i.cachedInputTokens??0,costUsd:i.costUsd??0,model:i.model??null,runEpoch:c});}catch{}}));}detach(t){this.unsubs.forEach(e=>e()),this.unsubs=[];}};var ft=class extends Z{dbPath;constructor(t={}){super(),t.dbPath?this.dbPath=t.dbPath:t.dbRoot&&(this.dbPath=B.join(t.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(t){let e=this.resolveDbPath();if(t){let r=B.dirname(e);fs.existsSync(r)||fs.mkdirSync(r,{recursive:true});}else if(!fs.existsSync(e))throw new p("NOT_FOUND","Database not found");let s=T(e);if(t)try{lt(s.db,e);}catch(r){throw s.close(),r}return s}validateWorkspaceId(t,e){return t.db.select({id:tt.id}).from(tt).where(drizzleOrm.eq(tt.id,e)).limit(1).get()?e:null}topLevelTaskPredicateSql(t="child"){return drizzleOrm.sql.raw(`NOT EXISTS (
259
259
  SELECT 1 FROM tasks parent
260
260
  WHERE parent.id = ${t}.parent_task_id
261
261
  AND parent.thread_id = ${t}.thread_id
262
- )`)}findAllThreads(t){let e=this.resolveDbPaths(),s=new Set,r=[];for(let o of e){if(!fs.existsSync(o))continue;let a=T(o);try{let i=t?drizzleOrm.eq(_.workspace_id,t):void 0,c=a.db.select().from(_).where(i).orderBy(drizzleOrm.desc(_.updated_at)).all();for(let l of c)s.has(l.id)||(s.add(l.id),r.push(l));}catch(i){throw new p("DB_ERROR","Failed to find all threads",i)}finally{a.close();}}return r}findThreadsByIdsOrTitles(t,e){if(t.length===0)return [];let s=this.resolveDbPaths(),r=new Set,o=[];for(let a of s){if(!fs.existsSync(a))continue;let i=T(a);try{let c=drizzleOrm.or(drizzleOrm.inArray(_.id,t),drizzleOrm.inArray(_.title,t)),l=e?drizzleOrm.and(c,drizzleOrm.eq(_.workspace_id,e)):c,u=i.db.select().from(_).where(l).orderBy(drizzleOrm.desc(_.updated_at)).all();for(let h of u)r.has(h.id)||(r.add(h.id),o.push(h));}catch(c){throw new p("DB_ERROR","Failed to find threads by ids or titles",c)}finally{i.close();}}return o}findThreadById(t,e){let s=this.resolveDbPaths();for(let r of s){if(!fs.existsSync(r))continue;let o=T(r);try{let a=drizzleOrm.eq(_.id,t),i=e?drizzleOrm.and(a,drizzleOrm.eq(_.workspace_id,e)):a,c=o.db.select().from(_).where(i).limit(1).get()??void 0;if(c)return c}catch(a){throw new p("DB_ERROR","Failed to find thread by id",a)}finally{o.close();}}}threadExists(t,e){let s=this.resolveDbPaths();for(let r of s){if(!fs.existsSync(r))continue;let o=T(r);try{let a=drizzleOrm.eq(_.id,t),i=e?drizzleOrm.and(a,drizzleOrm.eq(_.workspace_id,e)):a;if(o.db.select({id:_.id}).from(_).where(i).limit(1).get())return !0}catch(a){throw new p("DB_ERROR","Failed to check thread existence",a)}finally{o.close();}}return false}aggregateTaskStats(t,e){let s=this.resolveDbPaths(),r=0,o=0,a=0,i=0,c=0,l=new Set;for(let u of s){if(!fs.existsSync(u))continue;let h=T(u);try{let f=h.db.get(drizzleOrm.sql`
262
+ )`)}findAllThreads(t){let e=this.resolveDbPaths(),s=new Set,r=[];for(let o of e){if(!fs.existsSync(o))continue;let a=T(o);try{let i=t?drizzleOrm.eq(_.workspace_id,t):void 0,c=a.db.select().from(_).where(i).orderBy(drizzleOrm.desc(_.updated_at)).all();for(let l of c)s.has(l.id)||(s.add(l.id),r.push(l));}catch(i){throw new p("DB_ERROR","Failed to find all threads",i)}finally{a.close();}}return r}findThreadsByIdsOrTitles(t,e){if(t.length===0)return [];let s=this.resolveDbPaths(),r=new Set,o=[];for(let a of s){if(!fs.existsSync(a))continue;let i=T(a);try{let c=drizzleOrm.or(drizzleOrm.inArray(_.id,t),drizzleOrm.inArray(_.title,t)),l=e?drizzleOrm.and(c,drizzleOrm.eq(_.workspace_id,e)):c,u=i.db.select().from(_).where(l).orderBy(drizzleOrm.desc(_.updated_at)).all();for(let h of u)r.has(h.id)||(r.add(h.id),o.push(h));}catch(c){throw new p("DB_ERROR","Failed to find threads by ids or titles",c)}finally{i.close();}}return o}findThreadById(t,e){let s=this.resolveDbPaths();for(let r of s){if(!fs.existsSync(r))continue;let o=T(r);try{let a=drizzleOrm.eq(_.id,t),i=e?drizzleOrm.and(a,drizzleOrm.eq(_.workspace_id,e)):a,c=o.db.select().from(_).where(i).limit(1).get()??void 0;if(c)return c}catch(a){throw new p("DB_ERROR","Failed to find thread by id",a)}finally{o.close();}}}threadExists(t,e){let s=this.resolveDbPaths();for(let r of s){if(!fs.existsSync(r))continue;let o=T(r);try{let a=drizzleOrm.eq(_.id,t),i=e?drizzleOrm.and(a,drizzleOrm.eq(_.workspace_id,e)):a;if(o.db.select({id:_.id}).from(_).where(i).limit(1).get())return !0}catch(a){throw new p("DB_ERROR","Failed to check thread existence",a)}finally{o.close();}}return false}aggregateTaskStats(t,e){let s=this.resolveDbPaths(),r=0,o=0,a=0,i=0,c=0,l=new Set;for(let u of s){if(!fs.existsSync(u))continue;let h=T(u);try{let g=h.db.get(drizzleOrm.sql`
263
263
  SELECT
264
264
  count(*) AS cnt,
265
265
  COALESCE(SUM(child.input_tokens), 0) AS total_input,
@@ -270,13 +270,13 @@ ${s.join(`
270
270
  WHERE child.thread_id = ${t}
271
271
  AND ${this.topLevelTaskPredicateSql()}
272
272
  ${e?drizzleOrm.sql`AND child.workspace_id = ${e}`:drizzleOrm.sql``}
273
- `);f&&(r+=f.cnt,o+=f.total_input,a+=f.total_output,i+=f.total_cached,c+=f.total_cost);let R=h.db.all(drizzleOrm.sql`
273
+ `);g&&(r+=g.cnt,o+=g.total_input,a+=g.total_output,i+=g.total_cached,c+=g.total_cost);let R=h.db.all(drizzleOrm.sql`
274
274
  SELECT DISTINCT child.agent_id FROM tasks child
275
275
  WHERE child.thread_id = ${t}
276
276
  AND child.agent_id IS NOT NULL AND child.agent_id != ''
277
277
  AND ${this.topLevelTaskPredicateSql()}
278
278
  ${e?drizzleOrm.sql`AND child.workspace_id = ${e}`:drizzleOrm.sql``}
279
- `);for(let A of R)l.add(A.agent_id);}catch(f){throw new p("DB_ERROR","Failed to aggregate task stats",f)}finally{h.close();}}return {taskCount:r,inputTokens:o,outputTokens:a,cachedInputTokens:i,costUsd:c,agentIds:Array.from(l)}}findTopLevelTasks(t,e,s){let r=this.resolveDbPaths(),o=new Set,a=[];for(let i of r){if(!fs.existsSync(i))continue;let c=T(i);try{let l;s!==void 0?l=c.db.all(drizzleOrm.sql`
279
+ `);for(let A of R)l.add(A.agent_id);}catch(g){throw new p("DB_ERROR","Failed to aggregate task stats",g)}finally{h.close();}}return {taskCount:r,inputTokens:o,outputTokens:a,cachedInputTokens:i,costUsd:c,agentIds:Array.from(l)}}findTopLevelTasks(t,e,s){let r=this.resolveDbPaths(),o=new Set,a=[];for(let i of r){if(!fs.existsSync(i))continue;let c=T(i);try{let l;s!==void 0?l=c.db.all(drizzleOrm.sql`
280
280
  SELECT * FROM (
281
281
  SELECT child.*,
282
282
  ROW_NUMBER() OVER (PARTITION BY child.agent_id ORDER BY child.started_at DESC) AS rn
@@ -311,8 +311,8 @@ ${s.join(`
311
311
  message_count = message_count + 1,
312
312
  updated_at = ${o}
313
313
  WHERE id = ${t}
314
- `),l},{behavior:"immediate"})}}catch(o){throw o instanceof p?o:new p("DB_ERROR","Failed to save user message",o)}finally{r.close();}}saveAssistantMessage(t,e,s){if(!this.dbExists())return;let r=this.openHandle(true);try{let o=new Date().toISOString();r.db.update(_).set({last_message:e,updated_at:o}).where(drizzleOrm.eq(_.id,t)).run();}catch(o){throw o instanceof p?o:new p("DB_ERROR","Failed to save assistant message",o)}finally{r.close();}}updateThread(t,e){if(!this.dbExists())return;let s=this.openHandle(true);try{let r={updated_at:new Date().toISOString()};e.title!==void 0&&(r.title=e.title,r.title_locked=1),e.titleLocked!==void 0&&(r.title_locked=e.titleLocked?1:0),s.db.update(_).set(r).where(drizzleOrm.eq(_.id,t)).run();}catch(r){throw r instanceof p?r:new p("DB_ERROR","Failed to update thread",r)}finally{s.close();}}togglePin(t,e){let s=this.openHandle(true);try{let r=e?drizzleOrm.and(drizzleOrm.eq(_.id,t),drizzleOrm.eq(_.workspace_id,e)):drizzleOrm.eq(_.id,t),o=s.db.select({pinned:_.pinned,metadata:_.metadata}).from(_).where(r).get();if(!o)return null;let a=o.pinned?0:1,i=o.metadata?JSON.parse(o.metadata):{};if(a){let c=e?drizzleOrm.and(drizzleOrm.eq(_.pinned,1),drizzleOrm.eq(_.workspace_id,e)):drizzleOrm.eq(_.pinned,1),l=s.db.select({metadata:_.metadata}).from(_).where(c).all(),u=null;for(let h of l){let f=h.metadata?JSON.parse(h.metadata):{};typeof f.pinOrder=="number"&&(u===null||f.pinOrder<u)&&(u=f.pinOrder);}i.pinOrder=u===null?0:u-1;}else delete i.pinOrder;return s.db.update(_).set({pinned:a,metadata:Object.keys(i).length>0?JSON.stringify(i):null}).where(r).run(),{pinned:!!a}}catch(r){throw r instanceof p?r:new p("DB_ERROR","Failed to toggle pin",r)}finally{s.close();}}reorderPins(t,e){let s=this.openHandle(true);try{for(let r=0;r<t.length;r++){let o=e?drizzleOrm.and(drizzleOrm.eq(_.id,t[r]),drizzleOrm.eq(_.workspace_id,e)):drizzleOrm.eq(_.id,t[r]),a=s.db.select({metadata:_.metadata}).from(_).where(o).get();if(!a)continue;let i=a.metadata?JSON.parse(a.metadata):{};i.pinOrder=r+1,s.db.update(_).set({metadata:JSON.stringify(i)}).where(o).run();}}catch(r){throw r instanceof p?r:new p("DB_ERROR","Failed to reorder pins",r)}finally{s.close();}}toggleStar(t,e){let s=this.openHandle(true);try{let r=e?drizzleOrm.and(drizzleOrm.eq(_.id,t),drizzleOrm.eq(_.workspace_id,e)):drizzleOrm.eq(_.id,t),o=s.db.select({starred:_.starred}).from(_).where(r).get();if(!o)return null;let a=o.starred?0:1;return s.db.update(_).set({starred:a}).where(r).run(),{starred:!!a}}catch(r){throw r instanceof p?r:new p("DB_ERROR","Failed to toggle star",r)}finally{s.close();}}resolveOverdriveForRequest(t,e,s,r){let a=this.openHandle(true);try{let i=e?drizzleOrm.and(drizzleOrm.eq(_.id,t),drizzleOrm.eq(_.workspace_id,e)):drizzleOrm.eq(_.id,t);return a.db.transaction(l=>{let u=l.select({metadata:_.metadata}).from(_).where(i).get();if(!u)return null;let h=u.metadata?JSON.parse(u.metadata):{},f=h.overdrive??{},R=r?.defaultTurns??f.defaultTurns??3,A=r?.updatedBy??"ui",C=new Date().toISOString(),$,L,U,st;switch(s){case "enable-count":{let rt=r?.turns??R,ot=r?.consumeCurrent?Math.max(rt-1,0):rt;$=ot>0?"count":"off",L=ot,U=!0,st="count";break}case "enable-latch":{$="latch",L=0,U=!0,st="latch";break}case "disable":{$="off",L=0,U=!1;break}default:{let rt=f.state??"off",ot=typeof f.remaining=="number"?f.remaining:0;if(rt==="count"&&ot>0){let xt=ot-1;xt<=0?($="off",L=0):($="count",L=xt),U=!0,st="count";}else rt==="latch"?($="latch",L=0,U=!0,st="latch"):($="off",L=0,U=!1);break}}return h.overdrive={state:$,remaining:L,defaultTurns:R,updatedAt:C,updatedBy:A},l.update(_).set({metadata:JSON.stringify(h),updated_at:C}).where(i).run(),{applied:U,appliedMode:st,state:$,remaining:L}},{behavior:"immediate"})}catch(i){throw i instanceof p?i:new p("DB_ERROR","Failed to resolve overdrive",i)}finally{a.close();}}};function Ge(d){return d.replace(/<conversation_history[^>]*>[\s\S]*?<\/conversation_history>/g,"").split(`
314
+ `),l},{behavior:"immediate"})}}catch(o){throw o instanceof p?o:new p("DB_ERROR","Failed to save user message",o)}finally{r.close();}}saveAssistantMessage(t,e,s){if(!this.dbExists())return;let r=this.openHandle(true);try{let o=new Date().toISOString();r.db.update(_).set({last_message:e,updated_at:o}).where(drizzleOrm.eq(_.id,t)).run();}catch(o){throw o instanceof p?o:new p("DB_ERROR","Failed to save assistant message",o)}finally{r.close();}}updateThread(t,e){if(!this.dbExists())return;let s=this.openHandle(true);try{let r={updated_at:new Date().toISOString()};e.title!==void 0&&(r.title=e.title,r.title_locked=1),e.titleLocked!==void 0&&(r.title_locked=e.titleLocked?1:0),s.db.update(_).set(r).where(drizzleOrm.eq(_.id,t)).run();}catch(r){throw r instanceof p?r:new p("DB_ERROR","Failed to update thread",r)}finally{s.close();}}togglePin(t,e){let s=this.openHandle(true);try{let r=e?drizzleOrm.and(drizzleOrm.eq(_.id,t),drizzleOrm.eq(_.workspace_id,e)):drizzleOrm.eq(_.id,t),o=s.db.select({pinned:_.pinned,metadata:_.metadata}).from(_).where(r).get();if(!o)return null;let a=o.pinned?0:1,i=o.metadata?JSON.parse(o.metadata):{};if(a){let c=e?drizzleOrm.and(drizzleOrm.eq(_.pinned,1),drizzleOrm.eq(_.workspace_id,e)):drizzleOrm.eq(_.pinned,1),l=s.db.select({metadata:_.metadata}).from(_).where(c).all(),u=null;for(let h of l){let g=h.metadata?JSON.parse(h.metadata):{};typeof g.pinOrder=="number"&&(u===null||g.pinOrder<u)&&(u=g.pinOrder);}i.pinOrder=u===null?0:u-1;}else delete i.pinOrder;return s.db.update(_).set({pinned:a,metadata:Object.keys(i).length>0?JSON.stringify(i):null}).where(r).run(),{pinned:!!a}}catch(r){throw r instanceof p?r:new p("DB_ERROR","Failed to toggle pin",r)}finally{s.close();}}reorderPins(t,e){let s=this.openHandle(true);try{for(let r=0;r<t.length;r++){let o=e?drizzleOrm.and(drizzleOrm.eq(_.id,t[r]),drizzleOrm.eq(_.workspace_id,e)):drizzleOrm.eq(_.id,t[r]),a=s.db.select({metadata:_.metadata}).from(_).where(o).get();if(!a)continue;let i=a.metadata?JSON.parse(a.metadata):{};i.pinOrder=r+1,s.db.update(_).set({metadata:JSON.stringify(i)}).where(o).run();}}catch(r){throw r instanceof p?r:new p("DB_ERROR","Failed to reorder pins",r)}finally{s.close();}}toggleStar(t,e){let s=this.openHandle(true);try{let r=e?drizzleOrm.and(drizzleOrm.eq(_.id,t),drizzleOrm.eq(_.workspace_id,e)):drizzleOrm.eq(_.id,t),o=s.db.select({starred:_.starred}).from(_).where(r).get();if(!o)return null;let a=o.starred?0:1;return s.db.update(_).set({starred:a}).where(r).run(),{starred:!!a}}catch(r){throw r instanceof p?r:new p("DB_ERROR","Failed to toggle star",r)}finally{s.close();}}resolveOverdriveForRequest(t,e,s,r){let a=this.openHandle(true);try{let i=e?drizzleOrm.and(drizzleOrm.eq(_.id,t),drizzleOrm.eq(_.workspace_id,e)):drizzleOrm.eq(_.id,t);return a.db.transaction(l=>{let u=l.select({metadata:_.metadata}).from(_).where(i).get();if(!u)return null;let h=u.metadata?JSON.parse(u.metadata):{},g=h.overdrive??{},R=r?.defaultTurns??g.defaultTurns??3,A=r?.updatedBy??"ui",C=new Date().toISOString(),$,L,U,st;switch(s){case "enable-count":{let rt=r?.turns??R,ot=r?.consumeCurrent?Math.max(rt-1,0):rt;$=ot>0?"count":"off",L=ot,U=!0,st="count";break}case "enable-latch":{$="latch",L=0,U=!0,st="latch";break}case "disable":{$="off",L=0,U=!1;break}default:{let rt=g.state??"off",ot=typeof g.remaining=="number"?g.remaining:0;if(rt==="count"&&ot>0){let xt=ot-1;xt<=0?($="off",L=0):($="count",L=xt),U=!0,st="count";}else rt==="latch"?($="latch",L=0,U=!0,st="latch"):($="off",L=0,U=!1);break}}return h.overdrive={state:$,remaining:L,defaultTurns:R,updatedAt:C,updatedBy:A},l.update(_).set({metadata:JSON.stringify(h),updated_at:C}).where(i).run(),{applied:U,appliedMode:st,state:$,remaining:L}},{behavior:"immediate"})}catch(i){throw i instanceof p?i:new p("DB_ERROR","Failed to resolve overdrive",i)}finally{a.close();}}};function Ge(d){return d.replace(/<conversation_history[^>]*>[\s\S]*?<\/conversation_history>/g,"").split(`
315
315
  `).filter(r=>!(r.startsWith("Loaded ")&&r.includes("layouts from")||r.includes("[dotenv@")||r.includes("[Nest]")&&r.includes("DEBUG")||r.startsWith("Registered custom layout:")||r.startsWith("Updated custom layout:"))).join(`
316
316
  `).trim()}function Xe(d){if(!d)return "";let t=d;try{let e=JSON.parse(t);Array.isArray(e)?t=e.filter(s=>s?.type==="text"&&s?.text).map(s=>s.text).join(`
317
- `):e&&typeof e=="object"&&e.result!==void 0&&(t=e.result||"");}catch{t=Ge(t);}return t}var mt=class{dbPath;constructor(t){this.dbPath=t??B.join(ee.homedir(),".crewx","crewx.db");}getThreadRepo(){return new gt({dbPath:this.dbPath})}updateThread(t,e){this.getThreadRepo().updateThread(t,{title:e.title});}async ensureThread(t,e,s){let r=this.getThreadRepo(),o=r.findThreadById(t);if(o){if(o.platform!==e)throw new Error(`Thread '${t}' already exists with platform '${o.platform}' \u2014 cannot change to '${e}' (platform is immutable)`);return {created:false}}return r.ensureThread(t,e,s),{created:true}}async fetchHistory(t,e){let s=e?.limit??100,r=this.getThreadRepo(),o=r.findThreadById(t),a=r.findTopLevelTasks(t,void 0,s),i=new Set(["queued","cancelled"]);a=a.filter(u=>(!u.status||!i.has(u.status))&&(!e?.currentTraceId||u.trace_id!==e.currentTraceId));let c=o?.platform??"cli",l=this.rowsToMessages(a);return {threadId:t,platform:c,messages:l,metadata:{title:o?.title??void 0,firstMessage:o?.first_message??void 0,lastMessage:o?.last_message??void 0,messageCount:o?.message_count??0,updatedAt:o?.updated_at?new Date(o.updated_at).getTime():void 0}}}async saveUserMessage(t,e,s,r){let{firstMessage:o}=this.getThreadRepo().saveUserMessage(t,e);return {id:t,firstMessage:o}}async saveAssistantMessage(t,e,s,r){return this.getThreadRepo().saveAssistantMessage(t,e),{id:t}}close(){}normalizeStatus(t){if(t&&!["success","completed","done"].includes(t)){if(["failed","error"].includes(t))return "failed";if(t==="running")return "running"}}rowsToMessages(t){let e=[];for(let s of t){s.prompt&&e.push({id:`${s.id}-user`,text:s.prompt,isAssistant:false,timestamp:new Date(s.started_at).getTime(),metadata:{caller_agent_id:s.caller_agent_id}});let r=Xe(s.result),o=this.normalizeStatus(s.status);if(r||o==="running"||o==="failed"){let a={agent_id:s.agent_id,task_id:s.id};o&&(a.status=o),o==="failed"&&s.error&&(a.reason=s.error.split(`
317
+ `):e&&typeof e=="object"&&e.result!==void 0&&(t=e.result||"");}catch{t=Ge(t);}return t}var mt=class{dbPath;constructor(t){this.dbPath=t??B.join(ee.homedir(),".crewx","crewx.db");}getThreadRepo(){return new ft({dbPath:this.dbPath})}updateThread(t,e){this.getThreadRepo().updateThread(t,{title:e.title});}async ensureThread(t,e,s){let r=this.getThreadRepo(),o=r.findThreadById(t);if(o){if(o.platform!==e)throw new Error(`Thread '${t}' already exists with platform '${o.platform}' \u2014 cannot change to '${e}' (platform is immutable)`);return {created:false}}return r.ensureThread(t,e,s),{created:true}}async fetchHistory(t,e){let s=e?.limit??100,r=this.getThreadRepo(),o=r.findThreadById(t),a=r.findTopLevelTasks(t,void 0,s),i=new Set(["queued","cancelled"]);a=a.filter(u=>(!u.status||!i.has(u.status))&&(!e?.currentTraceId||u.trace_id!==e.currentTraceId));let c=o?.platform??"cli",l=this.rowsToMessages(a);return {threadId:t,platform:c,messages:l,metadata:{title:o?.title??void 0,firstMessage:o?.first_message??void 0,lastMessage:o?.last_message??void 0,messageCount:o?.message_count??0,updatedAt:o?.updated_at?new Date(o.updated_at).getTime():void 0}}}async saveUserMessage(t,e,s,r){let{firstMessage:o}=this.getThreadRepo().saveUserMessage(t,e);return {id:t,firstMessage:o}}async saveAssistantMessage(t,e,s,r){return this.getThreadRepo().saveAssistantMessage(t,e),{id:t}}close(){}normalizeStatus(t){if(t&&!["success","completed","done"].includes(t)){if(["failed","error"].includes(t))return "failed";if(t==="running")return "running"}}rowsToMessages(t){let e=[];for(let s of t){s.prompt&&e.push({id:`${s.id}-user`,text:s.prompt,isAssistant:false,timestamp:new Date(s.started_at).getTime(),metadata:{caller_agent_id:s.caller_agent_id}});let r=Xe(s.result),o=this.normalizeStatus(s.status);if(r||o==="running"||o==="failed"){let a={agent_id:s.agent_id,task_id:s.id};o&&(a.status=o),o==="failed"&&s.error&&(a.reason=s.error.split(`
318
318
  `)[0].slice(0,200)),e.push({id:`${s.id}-assistant`,text:r,isAssistant:true,timestamp:new Date(s.started_at).getTime(),metadata:a});}}return e}};var yt=class extends q{name="conversation";_provider;unsubStart=null;unsubEnd=null;constructor(t){super(),this._provider=new mt(t?.dbPath);}get conversationProvider(){return this._provider}async afterUserMessage(t,e,s,r){}async afterAssistantMessage(t,e,s){}attach(t){this.unsubStart=t.on("task:start",async e=>{if(!e.threadId)return;let s=e.platform??"cli";try{let r=await this._provider.ensureThread(e.threadId,s,e.workspaceId),o=await this._provider.saveUserMessage(e.threadId,e.message??"");await this.afterUserMessage(e.threadId,o.id,r.created||o.firstMessage,e);}catch{}}),this.unsubEnd=t.on("task:end",async e=>{if(!e.result)return;let s=e.metadata?.threadId;if(!s)return;let r=e.agentRef?.replace(/^@/,"")??"";try{let{id:o}=await this._provider.saveAssistantMessage(s,e.result,r);await this.afterAssistantMessage(s,o,e);}catch{}});}detach(t){this.unsubStart?.(),this.unsubStart=null,this.unsubEnd?.(),this.unsubEnd=null,this._provider.close?.();}};exports.ConversationPlugin=yt;exports.FileLoggerPlugin=kt;exports.SqliteTracingPlugin=Rt;
@@ -0,0 +1,2 @@
1
+ import type { TaskErrorProjection } from './task-error.types.js';
2
+ export declare function classifyTaskError(input: unknown): TaskErrorProjection;
@@ -0,0 +1 @@
1
+ export declare function redactTechnicalMessage(value: unknown): string | undefined;
@@ -0,0 +1,16 @@
1
+ export type TaskErrorCode = 'USAGE_LIMITED' | 'CONTEXT_WINDOW_EXCEEDED' | 'INPUT_TOO_LARGE' | 'MODEL_NOT_SUPPORTED' | 'MODEL_AT_CAPACITY' | 'AUTH_REQUIRED' | 'CLI_NOT_AVAILABLE' | 'CLI_UPDATE_REQUIRED' | 'AGENT_NOT_FOUND' | 'PERMISSION_OR_TRUST' | 'TIMEOUT_OR_STUCK' | 'NETWORK_OR_PROVIDER_TRANSIENT' | 'PROVIDER_CONFIGURATION' | 'PROCESS_FAILED';
2
+ export interface TaskErrorMeta {
3
+ resetAt?: string | number;
4
+ model?: string;
5
+ cliName?: string;
6
+ envKey?: string;
7
+ upstreamType?: string;
8
+ upstreamCode?: string | number;
9
+ referenceId?: string;
10
+ technicalMessage?: string;
11
+ }
12
+ export interface TaskErrorProjection {
13
+ errorCode: TaskErrorCode | null;
14
+ errorProvider: string | null;
15
+ errorMeta?: TaskErrorMeta;
16
+ }
@@ -1 +1 @@
1
- 'use strict';var y=require('path'),d=require('fs'),G=require('crypto'),W=require('js-yaml'),O=require('os'),Y=require('tar'),zlib=require('zlib');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var y__namespace=/*#__PURE__*/_interopNamespace(y);var d__namespace=/*#__PURE__*/_interopNamespace(d);var G__namespace=/*#__PURE__*/_interopNamespace(G);var W__namespace=/*#__PURE__*/_interopNamespace(W);var O__namespace=/*#__PURE__*/_interopNamespace(O);var Y__namespace=/*#__PURE__*/_interopNamespace(Y);function ae(e){let t=n=>n.replace(/[.+^${}()|[\]\\]/g,"\\$&"),s=e.split("/").map(n=>n==="**"?".*":n.split("*").map(t).join("[^/]*"));return new RegExp(`^${s.join("\\/")}$`)}function E(e,t){try{return ae(t).test(e)}catch{return false}}function P(e,...t){let r=e.split("/");if(r.length<t.length)return false;let s=r.length-t.length;return t.every((n,i)=>E(r[s+i],n))}function ce(e,t){return e.split("/").some(r=>E(r,t))}var z=[{label:".env*",test:e=>E(e,".env*")},{label:".git/",test:(e,t,r)=>r&&e===".git"},{label:"memory/",test:(e,t,r)=>r&&e==="memory"},{label:"*.key",test:e=>E(e,"*.key")},{label:"*.pem",test:e=>E(e,"*.pem")},{label:"auth.json",test:e=>e==="auth.json"},{label:"node_modules/",test:(e,t,r)=>r&&e==="node_modules"},{label:"conversations/",test:(e,t,r)=>r&&e==="conversations"},{label:".crewx/threads/",test:(e,t,r)=>r&&P(t,".crewx","threads")},{label:".crewx/crewx.db",test:(e,t,r)=>!r&&P(t,".crewx","crewx.db")},{label:".crewx/*.log",test:(e,t,r)=>!r&&P(t,".crewx","*.log")},{label:".crewx/publish/",test:(e,t,r)=>r&&P(t,".crewx","publish")},{label:".crewx/",test:(e,t)=>ce(t,".crewx")}];function U(e,t,r){for(let s of z)if(s.test(e,t,r))return s.label;return null}function J(e){let t=[],r=[];function s(n,i,a){let m;try{m=d__namespace.readdirSync(n,{withFileTypes:!0});}catch{return}m.sort((c,u)=>c.name.localeCompare(u.name));for(let c of m){let u=i?`${i}/${c.name}`:c.name,p=y__namespace.join(n,c.name);if(c.isSymbolicLink()){let l;try{l=d__namespace.statSync(p);}catch{continue}if(l.isDirectory()){r.push({path:u,rule:a??"symlink-dir"});continue}let C=a??U(c.name,u,false);C?r.push({path:u,rule:C}):t.push(u);continue}if(c.isDirectory()){let l=a??U(c.name,u,true);s(p,u,l);continue}if(c.isFile()){let l=a??U(c.name,u,false);l?r.push({path:u,rule:l}):t.push(u);}}}return s(e,"",null),t.sort(),r.sort((n,i)=>n.path<i.path?-1:n.path>i.path?1:0),{included:t,excluded:r}}var ue=[{rule:"token-prefix",regex:/\b(?:sk-|ghp_|xoxb-)[A-Za-z0-9_-]{10,}/},{rule:"private-key",regex:/-----BEGIN [A-Z ]*PRIVATE KEY-----/},{rule:"aws-access-key",regex:/\bAKIA[0-9A-Z]{16}\b/}];function pe(e){return e.includes(0)}function L(e,t){let r=[];for(let s of t){let n=y__namespace.join(e,s),i;try{i=d__namespace.readFileSync(n);}catch{continue}if(pe(i))continue;i.toString("utf8").split(/\r\n|\r|\n/).forEach((m,c)=>{for(let{rule:u,regex:p}of ue)p.test(m)&&r.push({path:s,line:c+1,rule:u});});}return r}var X=/^[a-z0-9-]+$/,le=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/,fe=/^[A-Za-z_][A-Za-z0-9_]*$/;function me(e){let t=y__namespace.join(e,"crewx.yaml");if(!d__namespace.existsSync(t))return {};let r;try{r=W__namespace.load(d__namespace.readFileSync(t,"utf8"));}catch{return {}}if(!r||typeof r!="object")return {};let s=r.metadata;if(!s||typeof s!="object")return {};let n=s;return {name:typeof n.name=="string"?n.name:void 0,version:typeof n.version=="string"?n.version:void 0,description:typeof n.description=="string"?n.description:void 0,requiredEnv:n.requiredEnv,crewxMinVersion:typeof n.crewxMinVersion=="string"?n.crewxMinVersion:void 0}}function he(e){return G__namespace.createHash("sha256").update(new Uint8Array(d__namespace.readFileSync(e))).digest("hex")}function q(e,t,r={}){let s=me(e),n=s.name??y__namespace.basename(e);if(!X.test(n))throw new Error(`publish: invalid name "${n}" \u2014 must match ${X} (lowercase letters, numbers, hyphen only)`);let i=r.version??s.version;if(!i)throw new Error("publish: version is required \u2014 set crewx.yaml metadata.version or pass opts.version");if(!le.test(i))throw new Error(`publish: invalid version "${i}" \u2014 must be semver (e.g. 1.0.0)`);let a=Array.isArray(s.requiredEnv)?s.requiredEnv:[],m=[];for(let p of a){if(typeof p!="string"||!fe.test(p))throw new Error(`publish: requiredEnv must contain names only (no values), got "${String(p)}"`);m.push(p);}let c=t.map(p=>({path:p,sha256:he(y__namespace.join(e,p))})).sort((p,l)=>p.path<l.path?-1:p.path>l.path?1:0),u={name:n,version:i,type:"template",description:s.description??"",files:c,requiredEnv:m};return s.crewxMinVersion&&(u.crewxMinVersion=s.crewxMinVersion),u}async function Q(e,t){let r=y__namespace.join(e,".crewx","publish");d__namespace.mkdirSync(r,{recursive:true});let s=y__namespace.join(r,`${t.name}-${t.version}.tgz`),n=d__namespace.mkdtempSync(y__namespace.join(O__namespace.tmpdir(),"crewx-publish-"));try{d__namespace.writeFileSync(y__namespace.join(n,"manifest.json"),JSON.stringify(t,null,2));for(let i of t.files){let a=y__namespace.join(n,i.path);d__namespace.mkdirSync(y__namespace.dirname(a),{recursive:!0}),d__namespace.copyFileSync(y__namespace.join(e,i.path),a);}await Y__namespace.create({gzip:!0,file:s,cwd:n,portable:!0,noMtime:!0},["manifest.json",...t.files.map(i=>i.path)]);}finally{d__namespace.rmSync(n,{recursive:true,force:true});}return s}var A="/api/v1";var ye=201,be=409,I=401;function we(){return process.env.WI013_FAKE_UPLOAD==="1"}function Ee(e){let t=zlib.gunzipSync(new Uint8Array(e)),r=zlib.gzipSync(new Uint8Array(t),{level:1});if(Buffer.compare(new Uint8Array(r),new Uint8Array(e))===0)throw new Error("WI013_FAKE_UPLOAD: re-gzipped bytes are identical to the original \u2014 tamper is a no-op");return r}function Ae(e){return e.replace(/\/+$/,"")}async function v(e){try{return await e.json()}catch{return null}}function b(e){let t=e?.message;return typeof t=="string"?t:void 0}function ee(e,t,r){let s=e;if(!s||s.success!==true||s.data===void 0)throw new Error(`publish: ${t} response envelope malformed (expected { success: true, data }) \u2014 HTTP ${r}`);return s.data}async function Se(e){let t=Ae(e.baseUrl),r=e.accessPolicy??"private",s=e.manifest.name,n;try{n=await fetch(`${t}${A}/publisher/items`,{method:"POST",headers:{Authorization:`Bearer ${e.accessToken}`,"Content-Type":"application/json"},body:JSON.stringify({slug:s,displayName:s,description:e.manifest.description,type:"template",version:e.manifest.version,accessPolicy:r})});}catch(o){throw new Error(`publish: submit \uC694\uCCAD\uC774 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4 (\uB124\uD2B8\uC6CC\uD06C) \u2014 ${o instanceof Error?o.message:String(o)}`)}let i;if(n.status===ye)i="created";else if(n.status===be)i="existing";else {if(n.status===I)throw new Error("publish: \uC778\uC99D\uC774 \uB9CC\uB8CC\uB418\uC5C8\uAC70\uB098 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uB2E4\uC2DC \uB85C\uADF8\uC778\uD558\uC138\uC694");{let o=await v(n);throw new Error(`publish: submit \uC2E4\uD328 \u2014 HTTP ${n.status}${b(o)?` ${b(o)}`:""}`)}}let a="not-needed",m=null;if(i==="existing"){let o;try{o=await fetch(`${t}${A}/publisher/items`,{method:"GET",headers:{Authorization:`Bearer ${e.accessToken}`}});}catch(f){throw new Error(`publish: version \uC870\uD68C \uC694\uCCAD\uC774 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4 (\uB124\uD2B8\uC6CC\uD06C) \u2014 ${f instanceof Error?f.message:String(f)}`)}let M=await v(o);if(o.status!==200)throw new Error(`publish: publisher items \uC870\uD68C \uC2E4\uD328 \u2014 HTTP ${o.status}${b(M)?` ${b(M)}`:""}`);let H=ee(M,"publisher items",o.status)?.items;if(!Array.isArray(H))throw new Error(`publish: publisher items response malformed (expected data.items[]) \u2014 HTTP ${o.status}`);let $=H.find(f=>!f||typeof f!="object"?false:f.slug===s);if(!$||typeof $.version!="string")throw new Error(`publish: publisher items response does not contain slug "${s}" \u2014 HTTP ${o.status}`);if(m=$.version,m!==e.manifest.version){let f;try{f=await fetch(`${t}${A}/publisher/items/${encodeURIComponent(s)}`,{method:"PUT",headers:{Authorization:`Bearer ${e.accessToken}`,"Content-Type":"application/json"},body:JSON.stringify({version:e.manifest.version})});}catch(x){throw new Error(`publish: version update \uC694\uCCAD\uC774 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4 (\uB124\uD2B8\uC6CC\uD06C) \u2014 ${x instanceof Error?x.message:String(x)}`)}if(!f.ok){let x=await v(f),w=b(x);throw f.status===I?new Error(`publish: version update \uC778\uC99D\uC774 \uB9CC\uB8CC\uB418\uC5C8\uAC70\uB098 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uB2E4\uC2DC \uB85C\uADF8\uC778\uD558\uC138\uC694 (HTTP ${f.status})${w?` ${w}`:""}`):f.status===403?new Error(`publish: version update \uAD8C\uD55C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uAE30\uC874 \uD56D\uBAA9\uC758 \uC18C\uC720\uC790\uB9CC \uBC84\uC804\uC744 \uAC31\uC2E0\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4 (HTTP ${f.status})${w?` ${w}`:""}`):new Error(`publish: version update \uC2E4\uD328 \u2014 HTTP ${f.status}${w?` ${w}`:""}`)}a="applied";}}let c=d__namespace.readFileSync(e.tgzPath),u=we()?Ee(c):c,p=new FormData;p.set("archive",new Blob([new Uint8Array(u)],{type:"application/gzip"}),`${s}-${e.manifest.version}.tgz`);let l;try{l=await fetch(`${t}${A}/publisher/items/${encodeURIComponent(s)}/upload`,{method:"POST",headers:{Authorization:`Bearer ${e.accessToken}`},body:p});}catch(o){throw new Error(`publish: upload \uC694\uCCAD\uC774 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4 (\uB124\uD2B8\uC6CC\uD06C) \u2014 ${o instanceof Error?o.message:String(o)}`)}if(l.status===I)throw new Error("publish: \uC778\uC99D\uC774 \uB9CC\uB8CC\uB418\uC5C8\uAC70\uB098 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uB2E4\uC2DC \uB85C\uADF8\uC778\uD558\uC138\uC694");if(!l.ok){let o=await v(l);throw new Error(`publish: upload \uC2E4\uD328 \u2014 HTTP ${l.status}${b(o)?` ${b(o)}`:""}`)}let C=await v(l),F=ee(C,"upload",l.status);return {slug:s,version:e.manifest.version,artifactChecksum:F.artifactChecksum,artifactSizeBytes:F.artifactSizeBytes,submitOutcome:i,versionUpdate:a,serverVersionBefore:m}}function ne(){if(process.env.CREWX_HOME)try{return d__namespace.realpathSync(process.env.CREWX_HOME)}catch{return y__namespace.join(O__namespace.homedir(),".crewx")}return process.platform!=="win32"&&process.env.XDG_CONFIG_HOME?y__namespace.join(process.env.XDG_CONFIG_HOME,"crewx"):y__namespace.join(O__namespace.homedir(),".crewx")}var g=class extends Error{code;constructor(t,r){super(r),this.name="AccountAuthBoundaryError",this.code=t;}};function N(e=process.env){let t=e.CREWX_ACCOUNT_ISSUER?.trim(),r=e.CREWX_ACCOUNT_ANON_KEY?.trim();if(!t&&!r)throw new g("ACCOUNT_USER_PAIR_MISSING","CrewX user-realm issuer\uC640 anon/publishable key pair \uC124\uC815\uC774 \uC5C6\uC2B5\uB2C8\uB2E4");if(!t)throw new g("ACCOUNT_USER_ISSUER_MISSING","CrewX user-realm issuer \uC124\uC815\uC774 \uC5C6\uC2B5\uB2C8\uB2E4");if(!r)throw new g("ACCOUNT_USER_ANON_KEY_MISSING","CrewX user-realm anon/publishable key \uC124\uC815\uC774 \uC5C6\uC2B5\uB2C8\uB2E4");return {issuer:t,anonKey:r}}function S(){throw new g("ACCOUNT_ACCESS_TOKEN_INVALID","\uACC4\uC815 access token\uC744 \uAC80\uC99D\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4")}function se(e){try{return JSON.parse(Buffer.from(e,"base64url").toString("utf8"))}catch{return S()}}function ie(e){if(typeof e!="string")return S();let t=e.split(".");if(t.length!==3||t.some(i=>i.length===0))return S();let r=se(t[0]),s=se(t[1]);if(!r||typeof r!="object"||!s||typeof s!="object")return S();let n=s;return typeof n.iss!="string"||n.iss.length===0||typeof n.sub!="string"||n.sub.length===0?S():{issuer:n.iss,sub:n.sub}}function oe(e,t,r){let s=ie(e);if(s.issuer!==t.issuer)throw new g("ACCOUNT_TOKEN_ISSUER_MISMATCH","\uACC4\uC815 access token\uC774 \uC124\uC815\uB41C user realm\uACFC \uC77C\uCE58\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4");if(r!==void 0&&s.sub!==r)throw new g("ACCOUNT_TOKEN_SUB_MISMATCH","\uACC4\uC815 access token\uC758 subject\uAC00 \uC608\uC0C1 \uC2E0\uC6D0\uACFC \uC77C\uCE58\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4");return s}function j(e,t){if(e.issuer!==t.issuer)throw new g("ACCOUNT_AUTH_JSON_ISSUER_MISMATCH","auth.json\uC774 \uC124\uC815\uB41C user realm\uACFC \uC77C\uCE58\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4");let r=oe(e.access_token,t);if(r.sub!==e.sub)throw new g("ACCOUNT_AUTH_JSON_SUB_MISMATCH","auth.json subject\uAC00 access token \uC2E0\uC6D0\uACFC \uC77C\uCE58\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4");return r}function ve(e){if(!e||typeof e!="object")return false;let t=e;return t.version===1&&typeof t.sub=="string"&&typeof t.email=="string"&&typeof t.access_token=="string"&&typeof t.refresh_token=="string"&&typeof t.expires_at=="number"&&typeof t.issuer=="string"&&typeof t.updated_at=="string"}function Ce(){let e=y.join(ne(),"auth.json");if(!d.existsSync(e))throw new Error(`\uB85C\uADF8\uC778\uC774 \uD544\uC694\uD569\uB2C8\uB2E4 \u2014 ${e} \uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 (\uBA3C\uC800 \uB85C\uADF8\uC778\uD558\uC138\uC694)`);let t;try{t=d.readFileSync(e,"utf8");}catch(n){throw new Error(`auth.json \uC744 \uC77D\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 (${e}): ${n instanceof Error?n.message:String(n)}`)}let r;try{r=JSON.parse(t);}catch(n){throw new Error(`auth.json \uD30C\uC2F1\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4 (${e}): ${n instanceof Error?n.message:String(n)}`)}if(!ve(r))throw new Error(`auth.json \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 (${e}) \u2014 \uB2E4\uC2DC \uB85C\uADF8\uC778\uD558\uC138\uC694`);let s=N();return j(r,s),r}async function Pe(e,t={}){let r=y__namespace.resolve(e),{included:s,excluded:n}=J(r),i=q(r,s,{version:t.version}),a=L(r,s);return {manifest:i,included:s,excluded:n,secretFindings:a}}async function lt(e,t={}){let r=await Pe(e,t);if(r.secretFindings.length>0){let i=r.secretFindings.map(a=>`${a.path}:${a.line} (${a.rule})`).join(", ");throw new Error(`publish: aborted \u2014 secret findings must be resolved before packing: ${i}`)}let s=y__namespace.resolve(e),n=await Q(s,r.manifest);return {manifest:r.manifest,tgzPath:n}}exports.AccountAuthBoundaryError=g;exports.EXCLUDE_RULES=z;exports.MARKETPLACE_API_PREFIX=A;exports.assertAuthJsonUserRealm=j;exports.assertUserRealmAccessToken=oe;exports.decodeAccessTokenIdentity=ie;exports.packTemplate=lt;exports.planPublish=Pe;exports.readAuthJson=Ce;exports.resolveUserAccountConfig=N;exports.uploadToMarketplace=Se;
1
+ 'use strict';var y=require('path'),d=require('fs'),G=require('crypto'),q=require('js-yaml'),O=require('os'),Y=require('tar'),zlib=require('zlib');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var y__namespace=/*#__PURE__*/_interopNamespace(y);var d__namespace=/*#__PURE__*/_interopNamespace(d);var G__namespace=/*#__PURE__*/_interopNamespace(G);var q__namespace=/*#__PURE__*/_interopNamespace(q);var O__namespace=/*#__PURE__*/_interopNamespace(O);var Y__namespace=/*#__PURE__*/_interopNamespace(Y);function ae(e){let t=n=>n.replace(/[.+^${}()|[\]\\]/g,"\\$&"),s=e.split("/").map(n=>n==="**"?".*":n.split("*").map(t).join("[^/]*"));return new RegExp(`^${s.join("\\/")}$`)}function E(e,t){try{return ae(t).test(e)}catch{return false}}function P(e,...t){let r=e.split("/");if(r.length<t.length)return false;let s=r.length-t.length;return t.every((n,i)=>E(r[s+i],n))}function ce(e,t){return e.split("/").some(r=>E(r,t))}var z=[{label:".env*",test:e=>E(e,".env*")},{label:".git/",test:(e,t,r)=>r&&e===".git"},{label:"memory/",test:(e,t,r)=>r&&e==="memory"},{label:"*.key",test:e=>E(e,"*.key")},{label:"*.pem",test:e=>E(e,"*.pem")},{label:"auth.json",test:e=>e==="auth.json"},{label:"node_modules/",test:(e,t,r)=>r&&e==="node_modules"},{label:"conversations/",test:(e,t,r)=>r&&e==="conversations"},{label:".crewx/threads/",test:(e,t,r)=>r&&P(t,".crewx","threads")},{label:".crewx/crewx.db",test:(e,t,r)=>!r&&P(t,".crewx","crewx.db")},{label:".crewx/*.log",test:(e,t,r)=>!r&&P(t,".crewx","*.log")},{label:".crewx/publish/",test:(e,t,r)=>r&&P(t,".crewx","publish")},{label:".crewx/",test:(e,t)=>ce(t,".crewx")}];function U(e,t,r){for(let s of z)if(s.test(e,t,r))return s.label;return null}function J(e){let t=[],r=[];function s(n,i,a){let m;try{m=d__namespace.readdirSync(n,{withFileTypes:!0});}catch{return}m.sort((c,u)=>c.name.localeCompare(u.name));for(let c of m){let u=i?`${i}/${c.name}`:c.name,l=y__namespace.join(n,c.name);if(c.isSymbolicLink()){let p;try{p=d__namespace.statSync(l);}catch{continue}if(p.isDirectory()){r.push({path:u,rule:a??"symlink-dir"});continue}let C=a??U(c.name,u,false);C?r.push({path:u,rule:C}):t.push(u);continue}if(c.isDirectory()){let p=a??U(c.name,u,true);s(l,u,p);continue}if(c.isFile()){let p=a??U(c.name,u,false);p?r.push({path:u,rule:p}):t.push(u);}}}return s(e,"",null),t.sort(),r.sort((n,i)=>n.path<i.path?-1:n.path>i.path?1:0),{included:t,excluded:r}}var ue=[{rule:"token-prefix",regex:/\b(?:sk-|ghp_|xoxb-)[A-Za-z0-9_-]{10,}/},{rule:"private-key",regex:/-----BEGIN [A-Z ]*PRIVATE KEY-----/},{rule:"aws-access-key",regex:/\bAKIA[0-9A-Z]{16}\b/}];function le(e){return e.includes(0)}function V(e,t){let r=[];for(let s of t){let n=y__namespace.join(e,s),i;try{i=d__namespace.readFileSync(n);}catch{continue}if(le(i))continue;i.toString("utf8").split(/\r\n|\r|\n/).forEach((m,c)=>{for(let{rule:u,regex:l}of ue)l.test(m)&&r.push({path:s,line:c+1,rule:u});});}return r}var X=/^[a-z0-9-]+$/,pe=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/,fe=/^[A-Za-z_][A-Za-z0-9_]*$/;function me(e){let t=y__namespace.join(e,"crewx.yaml");if(!d__namespace.existsSync(t))return {};let r;try{r=q__namespace.load(d__namespace.readFileSync(t,"utf8"));}catch{return {}}if(!r||typeof r!="object")return {};let s=r.metadata;if(!s||typeof s!="object")return {};let n=s;return {name:typeof n.name=="string"?n.name:void 0,version:typeof n.version=="string"?n.version:void 0,description:typeof n.description=="string"?n.description:void 0,requiredEnv:n.requiredEnv,crewxMinVersion:typeof n.crewxMinVersion=="string"?n.crewxMinVersion:void 0}}function he(e){return G__namespace.createHash("sha256").update(new Uint8Array(d__namespace.readFileSync(e))).digest("hex")}function W(e,t,r={}){let s=me(e),n=s.name??y__namespace.basename(e);if(!X.test(n))throw new Error(`publish: invalid name "${n}" \u2014 must match ${X} (lowercase letters, numbers, hyphen only)`);let i=r.version??s.version;if(!i)throw new Error("publish: version is required \u2014 set crewx.yaml metadata.version or pass opts.version");if(!pe.test(i))throw new Error(`publish: invalid version "${i}" \u2014 must be semver (e.g. 1.0.0)`);let a=Array.isArray(s.requiredEnv)?s.requiredEnv:[],m=[];for(let l of a){if(typeof l!="string"||!fe.test(l))throw new Error(`publish: requiredEnv must contain names only (no values), got "${String(l)}"`);m.push(l);}let c=t.map(l=>({path:l,sha256:he(y__namespace.join(e,l))})).sort((l,p)=>l.path<p.path?-1:l.path>p.path?1:0),u={name:n,version:i,type:"template",description:s.description??"",files:c,requiredEnv:m};return s.crewxMinVersion&&(u.crewxMinVersion=s.crewxMinVersion),u}async function Q(e,t){let r=y__namespace.join(e,".crewx","publish");d__namespace.mkdirSync(r,{recursive:true});let s=y__namespace.join(r,`${t.name}-${t.version}.tgz`),n=d__namespace.mkdtempSync(y__namespace.join(O__namespace.tmpdir(),"crewx-publish-"));try{d__namespace.writeFileSync(y__namespace.join(n,"manifest.json"),JSON.stringify(t,null,2));for(let i of t.files){let a=y__namespace.join(n,i.path);d__namespace.mkdirSync(y__namespace.dirname(a),{recursive:!0}),d__namespace.copyFileSync(y__namespace.join(e,i.path),a);}await Y__namespace.create({gzip:!0,file:s,cwd:n,portable:!0,noMtime:!0},["manifest.json",...t.files.map(i=>i.path)]);}finally{d__namespace.rmSync(n,{recursive:true,force:true});}return s}var A="/api/v1";var ye=201,be=409,I=401;function we(){return process.env.WI013_FAKE_UPLOAD==="1"}function Ee(e){let t=zlib.gunzipSync(new Uint8Array(e)),r=zlib.gzipSync(new Uint8Array(t),{level:1});if(Buffer.compare(new Uint8Array(r),new Uint8Array(e))===0)throw new Error("WI013_FAKE_UPLOAD: re-gzipped bytes are identical to the original \u2014 tamper is a no-op");return r}function Ae(e){return e.replace(/\/+$/,"")}async function v(e){try{return await e.json()}catch{return null}}function b(e){let t=e?.message;return typeof t=="string"?t:void 0}function ee(e,t,r){let s=e;if(!s||s.success!==true||s.data===void 0)throw new Error(`publish: ${t} response envelope malformed (expected { success: true, data }) \u2014 HTTP ${r}`);return s.data}async function Se(e){let t=Ae(e.baseUrl),r=e.accessPolicy??"private",s=e.manifest.name,n;try{n=await fetch(`${t}${A}/publisher/items`,{method:"POST",headers:{Authorization:`Bearer ${e.accessToken}`,"Content-Type":"application/json"},body:JSON.stringify({slug:s,displayName:s,description:e.manifest.description,type:"template",version:e.manifest.version,accessPolicy:r})});}catch(o){throw new Error(`publish: submit \uC694\uCCAD\uC774 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4 (\uB124\uD2B8\uC6CC\uD06C) \u2014 ${o instanceof Error?o.message:String(o)}`)}let i;if(n.status===ye)i="created";else if(n.status===be)i="existing";else {if(n.status===I)throw new Error("publish: \uC778\uC99D\uC774 \uB9CC\uB8CC\uB418\uC5C8\uAC70\uB098 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uB2E4\uC2DC \uB85C\uADF8\uC778\uD558\uC138\uC694");{let o=await v(n);throw new Error(`publish: submit \uC2E4\uD328 \u2014 HTTP ${n.status}${b(o)?` ${b(o)}`:""}`)}}let a="not-needed",m=null;if(i==="existing"){let o;try{o=await fetch(`${t}${A}/publisher/items`,{method:"GET",headers:{Authorization:`Bearer ${e.accessToken}`}});}catch(f){throw new Error(`publish: version \uC870\uD68C \uC694\uCCAD\uC774 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4 (\uB124\uD2B8\uC6CC\uD06C) \u2014 ${f instanceof Error?f.message:String(f)}`)}let M=await v(o);if(o.status!==200)throw new Error(`publish: publisher items \uC870\uD68C \uC2E4\uD328 \u2014 HTTP ${o.status}${b(M)?` ${b(M)}`:""}`);let H=ee(M,"publisher items",o.status)?.items;if(!Array.isArray(H))throw new Error(`publish: publisher items response malformed (expected data.items[]) \u2014 HTTP ${o.status}`);let $=H.find(f=>!f||typeof f!="object"?false:f.slug===s);if(!$||typeof $.version!="string")throw new Error(`publish: publisher items response does not contain slug "${s}" \u2014 HTTP ${o.status}`);if(m=$.version,m!==e.manifest.version){let f;try{f=await fetch(`${t}${A}/publisher/items/${encodeURIComponent(s)}`,{method:"PUT",headers:{Authorization:`Bearer ${e.accessToken}`,"Content-Type":"application/json"},body:JSON.stringify({version:e.manifest.version})});}catch(x){throw new Error(`publish: version update \uC694\uCCAD\uC774 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4 (\uB124\uD2B8\uC6CC\uD06C) \u2014 ${x instanceof Error?x.message:String(x)}`)}if(!f.ok){let x=await v(f),w=b(x);throw f.status===I?new Error(`publish: version update \uC778\uC99D\uC774 \uB9CC\uB8CC\uB418\uC5C8\uAC70\uB098 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uB2E4\uC2DC \uB85C\uADF8\uC778\uD558\uC138\uC694 (HTTP ${f.status})${w?` ${w}`:""}`):f.status===403?new Error(`publish: version update \uAD8C\uD55C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uAE30\uC874 \uD56D\uBAA9\uC758 \uC18C\uC720\uC790\uB9CC \uBC84\uC804\uC744 \uAC31\uC2E0\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4 (HTTP ${f.status})${w?` ${w}`:""}`):new Error(`publish: version update \uC2E4\uD328 \u2014 HTTP ${f.status}${w?` ${w}`:""}`)}a="applied";}}let c=d__namespace.readFileSync(e.tgzPath),u=we()?Ee(c):c,l=new FormData;l.set("archive",new Blob([new Uint8Array(u)],{type:"application/gzip"}),`${s}-${e.manifest.version}.tgz`);let p;try{p=await fetch(`${t}${A}/publisher/items/${encodeURIComponent(s)}/upload`,{method:"POST",headers:{Authorization:`Bearer ${e.accessToken}`},body:l});}catch(o){throw new Error(`publish: upload \uC694\uCCAD\uC774 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4 (\uB124\uD2B8\uC6CC\uD06C) \u2014 ${o instanceof Error?o.message:String(o)}`)}if(p.status===I)throw new Error("publish: \uC778\uC99D\uC774 \uB9CC\uB8CC\uB418\uC5C8\uAC70\uB098 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uB2E4\uC2DC \uB85C\uADF8\uC778\uD558\uC138\uC694");if(!p.ok){let o=await v(p);throw new Error(`publish: upload \uC2E4\uD328 \u2014 HTTP ${p.status}${b(o)?` ${b(o)}`:""}`)}let C=await v(p),F=ee(C,"upload",p.status);return {slug:s,version:e.manifest.version,artifactChecksum:F.artifactChecksum,artifactSizeBytes:F.artifactSizeBytes,submitOutcome:i,versionUpdate:a,serverVersionBefore:m}}function ne(){if(process.env.CREWX_HOME)try{return d__namespace.realpathSync(process.env.CREWX_HOME)}catch{return y__namespace.join(O__namespace.homedir(),".crewx")}return process.platform!=="win32"&&process.env.XDG_CONFIG_HOME?y__namespace.join(process.env.XDG_CONFIG_HOME,"crewx"):y__namespace.join(O__namespace.homedir(),".crewx")}var g=class extends Error{code;constructor(t,r){super(r),this.name="AccountAuthBoundaryError",this.code=t;}};function N(e=process.env){let t=e.CREWX_ACCOUNT_ISSUER?.trim(),r=e.CREWX_ACCOUNT_ANON_KEY?.trim();if(!t&&!r)throw new g("ACCOUNT_USER_PAIR_MISSING","CrewX user-realm issuer and anon/publishable key pair are not configured");if(!t)throw new g("ACCOUNT_USER_ISSUER_MISSING","CrewX user-realm issuer is not configured");if(!r)throw new g("ACCOUNT_USER_ANON_KEY_MISSING","CrewX user-realm anon/publishable key is not configured");return {issuer:t,anonKey:r}}function S(){throw new g("ACCOUNT_ACCESS_TOKEN_INVALID","Account access token could not be verified")}function se(e){try{return JSON.parse(Buffer.from(e,"base64url").toString("utf8"))}catch{return S()}}function ie(e){if(typeof e!="string")return S();let t=e.split(".");if(t.length!==3||t.some(i=>i.length===0))return S();let r=se(t[0]),s=se(t[1]);if(!r||typeof r!="object"||!s||typeof s!="object")return S();let n=s;return typeof n.iss!="string"||n.iss.length===0||typeof n.sub!="string"||n.sub.length===0?S():{issuer:n.iss,sub:n.sub}}function oe(e,t,r){let s=ie(e);if(s.issuer!==t.issuer)throw new g("ACCOUNT_TOKEN_ISSUER_MISMATCH","Account access token does not match the configured user realm");if(r!==void 0&&s.sub!==r)throw new g("ACCOUNT_TOKEN_SUB_MISMATCH","Account access token subject does not match the expected identity");return s}function j(e,t){if(e.issuer!==t.issuer)throw new g("ACCOUNT_AUTH_JSON_ISSUER_MISMATCH","auth.json does not match the configured user realm");let r=oe(e.access_token,t);if(r.sub!==e.sub)throw new g("ACCOUNT_AUTH_JSON_SUB_MISMATCH","auth.json subject does not match the access token identity");return r}function ve(e){if(!e||typeof e!="object")return false;let t=e;return t.version===1&&typeof t.sub=="string"&&typeof t.email=="string"&&typeof t.access_token=="string"&&typeof t.refresh_token=="string"&&typeof t.expires_at=="number"&&typeof t.issuer=="string"&&typeof t.updated_at=="string"}function Ce(){let e=y.join(ne(),"auth.json");if(!d.existsSync(e))throw new Error(`Login required \u2014 ${e} was not found (please log in first)`);let t;try{t=d.readFileSync(e,"utf8");}catch(n){throw new Error(`Could not read auth.json (${e}): ${n instanceof Error?n.message:String(n)}`)}let r;try{r=JSON.parse(t);}catch(n){throw new Error(`Failed to parse auth.json (${e}): ${n instanceof Error?n.message:String(n)}`)}if(!ve(r))throw new Error(`auth.json is malformed (${e}) \u2014 please log in again`);let s=N();return j(r,s),r}async function Pe(e,t={}){let r=y__namespace.resolve(e),{included:s,excluded:n}=J(r),i=W(r,s,{version:t.version}),a=V(r,s);return {manifest:i,included:s,excluded:n,secretFindings:a}}async function pt(e,t={}){let r=await Pe(e,t);if(r.secretFindings.length>0){let i=r.secretFindings.map(a=>`${a.path}:${a.line} (${a.rule})`).join(", ");throw new Error(`publish: aborted \u2014 secret findings must be resolved before packing: ${i}`)}let s=y__namespace.resolve(e),n=await Q(s,r.manifest);return {manifest:r.manifest,tgzPath:n}}exports.AccountAuthBoundaryError=g;exports.EXCLUDE_RULES=z;exports.MARKETPLACE_API_PREFIX=A;exports.assertAuthJsonUserRealm=j;exports.assertUserRealmAccessToken=oe;exports.decodeAccessTokenIdentity=ie;exports.packTemplate=pt;exports.planPublish=Pe;exports.readAuthJson=Ce;exports.resolveUserAccountConfig=N;exports.uploadToMarketplace=Se;
@@ -1462,6 +1462,7 @@ export interface QueryResult {
1462
1462
  error?: {
1463
1463
  code: string;
1464
1464
  message: string;
1465
+ providerCode?: string;
1465
1466
  };
1466
1467
  meta: {
1467
1468
  agentId: string;
@@ -1496,6 +1497,7 @@ export interface ExecuteResult {
1496
1497
  error?: {
1497
1498
  code: string;
1498
1499
  message: string;
1500
+ providerCode?: string;
1499
1501
  };
1500
1502
  meta: {
1501
1503
  agentId: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crewx/sdk",
3
- "version": "0.9.0-rc.49",
3
+ "version": "0.9.0-rc.50",
4
4
  "license": "UNLICENSED",
5
5
  "engines": {
6
6
  "node": ">=20.19.0"