@crewx/sdk 0.9.0-rc.124 → 0.9.0-rc.126
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/models.generated.d.ts +2 -2
- package/dist/config/pricing.generated.d.ts +2 -2
- package/dist/esm/index.js +382 -257
- package/dist/esm/plugins/index.js +70 -64
- package/dist/esm/publish/index.js +2 -2
- package/dist/esm/repository/index.js +84 -78
- package/dist/esm/testing/index.js +1 -1
- package/dist/index.browser.js +4 -4
- package/dist/index.d.ts +7 -5
- package/dist/index.js +383 -258
- package/dist/mcp-app/agent-access.d.ts +12 -1
- package/dist/mcp-app/bundle-provenance.d.ts +2 -0
- package/dist/mcp-app/dev-checks.d.ts +27 -0
- package/dist/mcp-app/discovery.d.ts +51 -4
- package/dist/mcp-app/index.d.ts +10 -8
- package/dist/mcp-app/projection.d.ts +2 -1
- package/dist/mcp-app/registry.d.ts +9 -2
- package/dist/mcp-app/skill-backend.d.ts +40 -3
- package/dist/mcp-app/types.d.ts +52 -3
- package/dist/mcp-app/workspace-snapshot.d.ts +3 -2
- package/dist/migrations/0034_keen_fallen_one.sql +36 -0
- package/dist/migrations/meta/0034_snapshot.json +3473 -0
- package/dist/migrations/meta/_journal.json +8 -1
- package/dist/plugins/index.js +71 -65
- package/dist/publish/index.js +2 -2
- package/dist/repository/index.js +86 -80
- package/dist/schema/index.d.ts +1 -0
- package/dist/schema/ui-action-receipts.d.ts +55 -0
- package/dist/schema/ui-instance-repins.d.ts +222 -0
- package/dist/testing/index.js +1 -1
- package/dist/ui-instance/index.d.ts +4 -2
- package/dist/ui-instance/json.d.ts +10 -0
- package/dist/ui-instance/lineage.d.ts +22 -0
- package/dist/ui-instance/store.d.ts +38 -1
- package/dist/ui-instance/types.d.ts +24 -0
- package/package.json +1 -1
package/dist/repository/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
'use strict';var
|
|
1
|
+
'use strict';var Oa=require('fs'),Se=require('path'),wi=require('os'),crypto=require('crypto'),sqliteCore=require('drizzle-orm/sqlite-core'),drizzleOrm=require('drizzle-orm'),child_process=require('child_process');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var Oa__namespace=/*#__PURE__*/_interopNamespace(Oa);var Se__namespace=/*#__PURE__*/_interopNamespace(Se);var wi__default=/*#__PURE__*/_interopDefault(wi);var bu=Object.defineProperty;var kt=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,n)=>(typeof require<"u"?require:e)[n]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var v=(t,e)=>()=>(t&&(e=t(t=0)),e);var Iu=(t,e)=>{for(var n in e)bu(t,n,{get:e[n],enumerable:true});};var h=v(()=>{});function ki(t){if(t===":memory:")return t;let e=Se.resolve(t),n=e,r=[];for(;!Oa.existsSync(n);){let s=Se.dirname(n);if(s===n)return e;r.unshift(n.slice(s.length+1)),n=s;}let o=Oa.realpathSync(n);for(let s of r)o=Se.join(o,s);return Se.resolve(o)}function Nu(t,e){let n=ki(t),r=ki(e);return process.platform==="win32"?n.toLowerCase()===r.toLowerCase():n===r}function Ke(t){if((process.env.NODE_ENV==="test"||process.env.VITEST!==void 0)&&Nu(t,Se.join(wi__default.default.homedir(),".crewx","crewx.db")))throw new Error(`${Ou}: ${t}. Set CREWX_DB to an isolated temporary path or :memory:.`);return t}var Ou;exports.BaseSqliteRepository=void 0;var se=v(()=>{h();Ou="[crewx] Refusing to open the real CrewX database from a test process";exports.BaseSqliteRepository=class{resolveDbPath(){if(process.env.CREWX_TRACES_DB!==void 0)throw new Error(`CREWX_TRACES_DB is removed. Use CREWX_DB instead. (got: ${process.env.CREWX_TRACES_DB})`);let e=process.env.CREWX_DB||Se.join(wi__default.default.homedir(),".crewx","crewx.db");return Ke(e)}resolveDbPaths(){return [this.resolveDbPath()]}isMissingTableError(e){return e instanceof Error&&/no such table:/i.test(e.message)}dbExists(e){return Oa.existsSync(e??this.resolveDbPath())}};});exports.RepositoryError=void 0;var pe=v(()=>{h();exports.RepositoryError=class extends Error{code;cause;constructor(e,n,r){super(n),this.name="RepositoryError",this.code=e,this.cause=r,Object.setPrototypeOf(this,new.target.prototype);}};});function C(t,e={}){let n=Ke(t),r=kt("better-sqlite3"),{drizzle:o}=kt("drizzle-orm/better-sqlite3"),s=e.readOnly?new r(n,{readonly:true,fileMustExist:true}):new r(n);return e.readOnly||(s.exec("PRAGMA journal_mode = WAL"),s.exec(`PRAGMA journal_size_limit = ${exports.CREWX_JOURNAL_SIZE_LIMIT_BYTES}`),s.exec("PRAGMA busy_timeout = 5000"),s.exec("PRAGMA foreign_keys = ON"),s.exec("PRAGMA analysis_limit = 400")),{db:o(s),runRaw:(i,d=[])=>s.prepare(i).run(...d),close:()=>s.close()}}function Cu(t,e="TRUNCATE"){if(e!=="PASSIVE"&&e!=="TRUNCATE")throw new Error(`Unsupported journal reclaim mode: ${e}`);let n=Ke(t),r=kt("better-sqlite3"),o=yi(n),s;try{s=new r(n),s.pragma("busy_timeout = 1000");let i=s.pragma(`wal_checkpoint(${e})`),d=yi(n);return {busy:i[0]?.busy===1,walBytesBefore:o,walBytesAfter:d}}finally{s?.close();}}var yi;exports.CREWX_JOURNAL_SIZE_LIMIT_BYTES=void 0;var fe=v(()=>{h();se();yi=t=>{try{return Oa__namespace.statSync(`${t}-wal`).size}catch{return 0}},exports.CREWX_JOURNAL_SIZE_LIMIT_BYTES=32*1024*1024;});function en(t,e){return (t.get(`SELECT count(*) as cnt FROM sqlite_master WHERE type='table' AND name='${e}'`)?.cnt??0)>0}function Pu(t,e){if(e>0||!en(t,"tasks"))return;let n=t.all("PRAGMA table_info(tasks)"),r=new Set(n.map(o=>o.name));for(let[o,s]of Object.entries(xu))r.has(o)||t.run(`ALTER TABLE tasks ADD COLUMN ${o} ${s}`);}function Lu(t,e,n){if(!en(t,"__drizzle_migrations")||!en(t,"tasks"))return;let r=t.all(n`SELECT hash FROM __drizzle_migrations`),o=new Set(r.map(i=>i.hash)),s=JSON.parse(Oa.readFileSync(Se__namespace.default.join(e,"meta/_journal.json"),"utf-8"));for(let i of s.entries){let d=Du[i.tag];if(!d)continue;let c=Se__namespace.default.join(e,`${i.tag}.sql`);if(!Oa.existsSync(c))continue;let u=Oa.readFileSync(c,"utf-8"),f=crypto.createHash("sha256").update(u).digest("hex");if(o.has(f))continue;let p=t.all("PRAGMA table_info(tasks)"),g=new Set(p.map(_=>_.name));for(let[_,m]of Object.entries(d))g.has(_)||(t.run(`ALTER TABLE tasks ADD COLUMN ${_} ${m}`),g.add(_));}}function Ii(t){let e=t.trim().replace(/;+\s*$/,"").trim(),n=e.match(/^ALTER\s+TABLE\s+[`"]?([A-Za-z_][\w$]*)[`"]?\s+ADD\s+(?:COLUMN\s+)?[`"]?([A-Za-z_][\w$]*)[`"]?/i);if(n)return {kind:"add-column",table:n[1],column:n[2]};let r=e.match(/^CREATE\s+(?:UNIQUE\s+)?INDEX(?:\s+IF\s+NOT\s+EXISTS)?\s+[`"]?([A-Za-z_][\w$]*)[`"]?\s+ON\s+/i);if(r)return {kind:"create-index",name:r[1]};let o=e.match(/^DROP\s+INDEX\s+IF\s+EXISTS\s+[`"]?([A-Za-z_][\w$]*)[`"]?/i);if(o)return {kind:"drop-index",name:o[1]}}function Ai(t){return t.split(/-->\s*statement-breakpoint/).map(e=>e.trim()).filter(Boolean)}function Mu(t,e,n){return t.all(`PRAGMA table_info("${e}")`).some(s=>s.name===n)}function Hu(t,e){return t.all(`SELECT name FROM sqlite_master WHERE type = 'index' AND name = '${e}'`).length>0}function kr(t,e){return e.kind==="add-column"?Mu(t,e.table,e.column):Hu(t,e.name)}function vi(t,e,n){let r=t;for(let o of Ai(e)){let s=Ii(o);s?.kind==="add-column"&&kr(r,s)||s?.kind==="create-index"&&kr(r,s)||s?.kind==="drop-index"&&!kr(r,s)||r.run(n.raw(o));}}function $u(t,e,n){let r=t.all(n`SELECT hash FROM __drizzle_migrations`),o=new Set(r.map(i=>i.hash)),s=JSON.parse(Oa.readFileSync(Se__namespace.default.join(e,"meta/_journal.json"),"utf-8"));for(let i of s.entries){let d=Se__namespace.default.join(e,`${i.tag}.sql`);if(!Oa.existsSync(d))continue;let c=Oa.readFileSync(d,"utf-8"),u=crypto.createHash("sha256").update(c).digest("hex");if(o.has(u))continue;let p=Ai(c).map(Ii);if(p.some(_=>!_))continue;let g=p;g.some(_=>_.kind==="add-column")&&g.some(_=>kr(t,_))&&(t.transaction(_=>{vi(_,c,n),_.run(n`INSERT INTO __drizzle_migrations (hash, created_at) VALUES (${u}, ${i.when})`);},{behavior:"immediate"}),o.add(u),console.error(`[crewx] Reconciled additive migration ${i.tag} from existing schema objects.`));}}function Uu(t,e){let{sql:n}=kt("drizzle-orm"),r=JSON.parse(Oa.readFileSync(Se__namespace.default.join(e,"meta/_journal.json"),"utf-8")),s=["0025_task_heartbeat","0025_thread_app_instance_ledger","0026_mcp_action_source","0027_ui_instance_active_unique"].map(i=>{let d=r.entries.find(u=>u.tag===i);if(!d)throw new Error(`Missing release/App compatibility migration: ${i}`);let c=Oa.readFileSync(Se__namespace.default.join(e,`${i}.sql`),"utf-8");return {entry:d,content:c,hash:crypto.createHash("sha256").update(c).digest("hex")}});t.transaction(i=>{let d=new Set(i.all(n`SELECT hash FROM __drizzle_migrations`).map(c=>c.hash));if(d.has(s[0].hash))for(let c of s.slice(1))d.has(c.hash)||(vi(i,c.content,n),i.run(n`INSERT INTO __drizzle_migrations (hash, created_at) VALUES (${c.hash}, ${c.entry.when})`),d.add(c.hash),console.error(`[crewx] Replayed release/App migration ${c.entry.tag} safely.`));},{behavior:"immediate"});}function ju(t,e,n,r){let s=JSON.parse(Oa.readFileSync(Se__namespace.default.join(e,"meta/_journal.json"),"utf-8")).entries.find(({tag:p})=>p===Fu);if(!s)return;let i=Se__namespace.default.join(e,`${s.tag}.sql`);if(!Oa.existsSync(i))return;let d=crypto.createHash("sha256").update(Oa.readFileSync(i,"utf-8")).digest("hex");if(r&&t.all(n`SELECT hash FROM __drizzle_migrations`).some(g=>g.hash===d))return;if(!en(t,"tasks"))return {hash:d,affectedRows:0};let c=t.all("PRAGMA table_info(tasks)"),u=new Set(c.map(p=>p.name));if(!u.has("stop_requested_at")||!u.has("stop_requested_epoch"))return {hash:d,affectedRows:0};let f=t.get(n`
|
|
2
2
|
SELECT count(*) AS count
|
|
3
3
|
FROM tasks
|
|
4
4
|
WHERE status IN ('success', 'failed')
|
|
5
5
|
AND (stop_requested_at IS NOT NULL OR stop_requested_epoch IS NOT NULL)
|
|
6
|
-
`);return {hash:d,affectedRows:f?.count??0}}function
|
|
6
|
+
`);return {hash:d,affectedRows:f?.count??0}}function Wu(t,e,n,r){let s=JSON.parse(Oa.readFileSync(Se__namespace.default.join(e,"meta/_journal.json"),"utf-8")).entries.find(({tag:p})=>p===Bu);if(!s)return;let i=Se__namespace.default.join(e,`${s.tag}.sql`);if(!Oa.existsSync(i))return;let d=crypto.createHash("sha256").update(Oa.readFileSync(i,"utf-8")).digest("hex");if(r&&t.all(n`SELECT hash FROM __drizzle_migrations`).some(g=>g.hash===d))return;if(!en(t,"threads"))return {hash:d,markedPointers:0};if(!t.all("PRAGMA table_info(threads)").some(p=>p.name==="created_by_task_id"))return {hash:d,markedPointers:0};let u=en(t,bi)?`AND NOT EXISTS (
|
|
7
7
|
SELECT 1
|
|
8
|
-
FROM ${
|
|
8
|
+
FROM ${bi} AS marked
|
|
9
9
|
WHERE marked.thread_id = current.id
|
|
10
10
|
AND marked.created_by_task_id = current.created_by_task_id
|
|
11
11
|
)`:"",f=t.get(`SELECT count(*) AS count
|
|
@@ -15,38 +15,44 @@
|
|
|
15
15
|
SELECT 1
|
|
16
16
|
FROM sqlite_master
|
|
17
17
|
WHERE type = 'trigger'
|
|
18
|
-
AND name = '${
|
|
18
|
+
AND name = '${qu}'
|
|
19
19
|
)
|
|
20
|
-
${u}`);return {hash:d,markedPointers:f?.count??0}}function
|
|
20
|
+
${u}`);return {hash:d,markedPointers:f?.count??0}}function tn(t){let{migrate:e}=kt("drizzle-orm/better-sqlite3/migrator"),{sql:n}=kt("drizzle-orm"),r=[Se__namespace.default.join(__dirname,"../migrations"),Se__namespace.default.join(__dirname,"migrations"),Se__namespace.default.join(__dirname,"../../../../drizzle/migrations"),Se__namespace.default.join(process.cwd(),"drizzle/migrations")],o=r.find(p=>Oa.existsSync(Se__namespace.default.join(p,"meta/_journal.json")));if(!o)throw new Error(`migrations folder not found. Searched:
|
|
21
21
|
${r.join(`
|
|
22
|
-
`)}`);let s=t.get(n`SELECT count(*) as cnt FROM sqlite_master WHERE type='table' AND name='__drizzle_migrations'`),i=0;s?.cnt&&(i=t.get(n`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0),vu(t,i),s?.cnt&&(Du(t,o),Pu(t,o,n),Nu(t,o,n));let d=Uu(t,o,n,!!s?.cnt),c=$u(t,o,n,!!s?.cnt);e(t,{migrationsFolder:o});let f=(t.get(n`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0)-i;if(f>0){let p=s?.cnt?"Database migrated":"Database initialized";console.error(`[crewx] ${p} (${f} migration${f>1?"s":""} applied).`);}d&&t.all(n`SELECT hash FROM __drizzle_migrations`).some(g=>g.hash===d.hash)&&console.error(`[crewx] Task stop-marker cleanup (${d.affectedRows} success/failed row(s) affected).`),c&&t.all(n`SELECT hash FROM __drizzle_migrations`).some(g=>g.hash===c.hash)&&console.error(`[crewx] Thread creator pointer migration (${c.markedPointers} pointer(s) marked unverified).`);}function V(t,e){wi.has(e)||(Qt(t),wi.add(e));}var wi,Au,Ou,Lu,Mu,Hu,yi,ce=v(()=>{h();wi=new Set,Au={agent_id:"TEXT",status:"TEXT DEFAULT 'running'",started_at:"TEXT",trace_id:"TEXT",parent_task_id:"TEXT",crewx_version:"TEXT",pid:"INTEGER",thread_id:"TEXT",workspace_id:"TEXT",workspace_ref:"TEXT",workspace_name:"TEXT",project_id:"TEXT",project_name:"TEXT",command:"TEXT"};Ou={"0002_normalize_task_names":{workspace_name:"TEXT",project_name:"TEXT"},"0015_panoramic_gorilla_man":{project_id:"TEXT",workspace_id:"TEXT"},"0019_backfill_task_thread_ids":{command:"TEXT",thread_id:"TEXT"},"0024_storage_metadata":{prompt:"TEXT",rendered_prompt:"TEXT",result:"TEXT",input_tokens:"INTEGER DEFAULT 0",output_tokens:"INTEGER DEFAULT 0",cost_usd:"REAL DEFAULT 0"}};Lu="0027_task_stop_scope_cleanup",Mu="0033_thread_creator_boundary_guard",Hu="trg_threads_creator_late_fill_guard",yi="thread_creator_unverified";});var x,wo=v(()=>{h();x=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(),starred:sqliteCore.integer("starred").notNull().default(0)});});exports.tasks=void 0;var Pn=v(()=>{h();exports.tasks=sqliteCore.sqliteTable("tasks",{id:sqliteCore.text("id").primaryKey(),agent_id:sqliteCore.text("agent_id").notNull(),user_id:sqliteCore.text("user_id"),actor_kind:sqliteCore.text("actor_kind",{enum:["human","agent","system","unknown"]}),actor_id:sqliteCore.text("actor_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"),heartbeat_at:sqliteCore.text("heartbeat_at"),stop_requested_at:sqliteCore.text("stop_requested_at"),stop_requested_epoch:sqliteCore.integer("stop_requested_epoch"),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"),log_storage:sqliteCore.text("log_storage",{enum:["blob","events"]}).notNull().default("blob"),last_log_seq:sqliteCore.integer("last_log_seq").notNull().default(0),log_revision:sqliteCore.integer("log_revision").notNull().default(0),thread_id:sqliteCore.text("thread_id"),workspace_ref:sqliteCore.text("workspace_ref"),cwd:sqliteCore.text("cwd"),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)},t=>({log_storage_check:sqliteCore.check("tasks_log_storage_ck",drizzleOrm.sql`${t.log_storage} IN ('blob', 'events')`),idx_tasks_agent_id:sqliteCore.index("idx_tasks_agent_id").on(t.agent_id),idx_tasks_status:sqliteCore.index("idx_tasks_status").on(t.status),idx_tasks_started_at:sqliteCore.index("idx_tasks_started_at").on(t.started_at),idx_tasks_trace_id:sqliteCore.index("idx_tasks_trace_id").on(t.trace_id),idx_tasks_parent_task_id:sqliteCore.index("idx_tasks_parent_task_id").on(t.parent_task_id),idx_tasks_crewx_version:sqliteCore.index("idx_tasks_crewx_version").on(t.crewx_version),idx_tasks_pid:sqliteCore.index("idx_tasks_pid").on(t.pid),idx_tasks_status_heartbeat:sqliteCore.index("idx_tasks_status_heartbeat").on(t.status,t.heartbeat_at),idx_tasks_thread_id:sqliteCore.index("idx_tasks_thread_id").on(t.thread_id),idx_tasks_thread_creator:sqliteCore.index("idx_tasks_thread_creator").on(t.id,t.thread_id,t.actor_kind,t.actor_id),idx_tasks_workspace_id:sqliteCore.index("idx_tasks_workspace_id").on(t.workspace_id),idx_tasks_workspace_ref:sqliteCore.index("idx_tasks_workspace_ref").on(t.workspace_ref),idx_tasks_project_id:sqliteCore.index("idx_tasks_project_id").on(t.project_id),idx_tasks_ws_started:sqliteCore.index("idx_tasks_ws_started").on(t.workspace_id,t.started_at)}));});var at,Ai=v(()=>{h();Pn();at=sqliteCore.sqliteTable("task_log_events",{id:sqliteCore.integer("id").primaryKey(),task_id:sqliteCore.text("task_id").notNull().references(()=>exports.tasks.id,{onDelete:"cascade"}),seq:sqliteCore.integer("seq").notNull(),timestamp:sqliteCore.text("timestamp").notNull(),level:sqliteCore.text("level").notNull(),message:sqliteCore.text("message").notNull()},t=>({taskSeqUnique:sqliteCore.uniqueIndex("task_log_events_task_seq_uq").on(t.task_id,t.seq),timestampIdIndex:sqliteCore.index("task_log_events_timestamp_id_idx").on(t.timestamp,t.id)}));});var Ju,Yu,w,mr=v(()=>{h();wo();Ju="json_extract(metadata, '$.threadTitle.state')",Yu="json_extract(metadata, '$.threadTitle.priority')",w=sqliteCore.sqliteTable("threads",{id:sqliteCore.text("id").primaryKey(),workspace_id:sqliteCore.text("workspace_id").references(()=>x.id,{onDelete:"set null"}),created_by_kind:sqliteCore.text("created_by_kind",{enum:["human","agent","system","unknown"]}),created_by_id:sqliteCore.text("created_by_id"),created_by_task_id:sqliteCore.text("created_by_task_id"),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)},t=>({idx_threads_updated_at:sqliteCore.index("idx_threads_updated_at").on(t.updated_at),idx_threads_workspace_id:sqliteCore.index("idx_threads_workspace_id").on(t.workspace_id),idx_threads_ws_updated:sqliteCore.index("idx_threads_ws_updated").on(t.workspace_id,t.updated_at),idx_threads_workspace_created_by_kind_updated_at:sqliteCore.index("idx_threads_workspace_created_by_kind_updated_at").on(t.workspace_id,t.created_by_kind,t.updated_at),idx_threads_title:sqliteCore.index("idx_threads_title").on(t.title),idx_threads_workspace_thread_state:sqliteCore.index("idx_threads_workspace_thread_state").on(t.workspace_id,drizzleOrm.sql.raw(Ju)),idx_threads_workspace_thread_priority:sqliteCore.index("idx_threads_workspace_thread_priority").on(t.workspace_id,drizzleOrm.sql.raw(Yu))}));});var Ni,Ci=v(()=>{h();Ni=sqliteCore.sqliteTable("thread_creator_unverified",{thread_id:sqliteCore.text("thread_id").notNull(),created_by_task_id:sqliteCore.text("created_by_task_id").notNull()},t=>({pk:sqliteCore.primaryKey({columns:[t.thread_id,t.created_by_task_id]})}));});var mt,Pi=v(()=>{h();Pn();mt=sqliteCore.sqliteTable("spans",{id:sqliteCore.text("id").primaryKey(),task_id:sqliteCore.text("task_id").references(()=>exports.tasks.id,{onDelete:"set null"}),parent_span_id:sqliteCore.text("parent_span_id").references(()=>mt.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")},t=>({idx_spans_task_id:sqliteCore.index("idx_spans_task_id").on(t.task_id),idx_spans_parent_span_id:sqliteCore.index("idx_spans_parent_span_id").on(t.parent_span_id)}));});var dt,Di=v(()=>{h();Pn();dt=sqliteCore.sqliteTable("tool_calls",{id:sqliteCore.text("id").primaryKey(),task_id:sqliteCore.text("task_id").references(()=>exports.tasks.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()},t=>({idx_tool_calls_task_id:sqliteCore.index("idx_tool_calls_task_id").on(t.task_id),idx_tool_calls_tool_name:sqliteCore.index("idx_tool_calls_tool_name").on(t.tool_name),idx_tool_calls_timestamp:sqliteCore.index("idx_tool_calls_timestamp").on(t.timestamp)}));});var je,Mi=v(()=>{h();mr();je=sqliteCore.sqliteTable("thread_boxes",{id:sqliteCore.text("id").primaryKey(),thread_id:sqliteCore.text("thread_id").notNull().references(()=>w.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()},t=>({idx_thread_boxes_thread_id:sqliteCore.index("idx_thread_boxes_thread_id").on(t.thread_id),idx_thread_boxes_seq:sqliteCore.index("idx_thread_boxes_seq").on(t.thread_id,t.seq),uniq_thread_boxes_thread_seq:sqliteCore.unique().on(t.thread_id,t.seq)}));});var Zt,Ui=v(()=>{h();Zt=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")},t=>({idx_request_logs_timestamp:sqliteCore.index("idx_request_logs_timestamp").on(t.timestamp),idx_request_logs_path:sqliteCore.index("idx_request_logs_path").on(t.path),idx_request_logs_status_code:sqliteCore.index("idx_request_logs_status_code").on(t.status_code),idx_request_logs_partition_key:sqliteCore.index("idx_request_logs_partition_key").on(t.partition_key)}));});var _e,Bi=v(()=>{h();_e=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")},t=>({uniq_usage_limit_snapshots_bucket:sqliteCore.uniqueIndex("uniq_usage_limit_snapshots_bucket").on(t.provider,t.account_ref,t.limit_window,t.bucket_start),idx_usage_limit_snapshots_window_bucket:sqliteCore.index("idx_usage_limit_snapshots_window_bucket").on(t.limit_window,t.bucket_start),idx_usage_limit_snapshots_provider_window_bucket:sqliteCore.index("idx_usage_limit_snapshots_provider_window_bucket").on(t.provider,t.limit_window,t.bucket_start)}));});var De,qi=v(()=>{h();De=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")},t=>({uniq_usage_reports_ws_month:sqliteCore.uniqueIndex("uniq_usage_reports_ws_month").on(t.workspace_id,t.month)}));});var F,ie,Wi=v(()=>{h();F=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")},t=>({idx_notifications_ws_created:sqliteCore.index("idx_notifications_ws_created").on(t.workspace_id,drizzleOrm.sql`${t.created_at} DESC`)})),ie=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()},t=>({pk:sqliteCore.primaryKey({columns:[t.notification_id,t.user_id]})}));});var j,zi=v(()=>{h();j=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()},t=>({idx_agent_suggestions_ws_agent:sqliteCore.index("idx_agent_suggestions_ws_agent").on(t.workspace_id,t.agent_id),idx_agent_suggestions_ws_created:sqliteCore.index("idx_agent_suggestions_ws_created").on(t.workspace_id,t.created_at)}));});var Ki=v(()=>{h();sqliteCore.sqliteTable("ui_instances",{id:sqliteCore.text("id").primaryKey().notNull(),definition_id:sqliteCore.text("definition_id").notNull(),definition_version:sqliteCore.integer("definition_version").notNull(),definition_hash:sqliteCore.text("definition_hash").notNull(),workspace_id:sqliteCore.text("workspace_id").notNull(),thread_id:sqliteCore.text("thread_id").notNull(),app_id:sqliteCore.text("app_id"),anchor_task_id:sqliteCore.text("anchor_task_id"),domain_ref_json:sqliteCore.text("domain_ref_json").notNull(),state_json:sqliteCore.text("state_json").notNull(),revision:sqliteCore.integer("revision").notNull().default(0),status:sqliteCore.text("status").notNull().default("active"),granted_capabilities_json:sqliteCore.text("granted_capabilities_json").notNull().default("[]"),opened_by_json:sqliteCore.text("opened_by_json"),created_at:sqliteCore.integer("created_at").notNull(),updated_at:sqliteCore.integer("updated_at").notNull()},t=>({idCheck:sqliteCore.check("ui_instances_id_ck",drizzleOrm.sql`length(${t.id}) BETWEEN 5 AND 128 AND ${t.id} GLOB 'uic_*'`),definitionIdCheck:sqliteCore.check("ui_instances_definition_id_ck",drizzleOrm.sql`length(${t.definition_id}) BETWEEN 1 AND 128`),definitionVersionCheck:sqliteCore.check("ui_instances_definition_version_ck",drizzleOrm.sql`${t.definition_version} >= 1`),definitionHashCheck:sqliteCore.check("ui_instances_definition_hash_ck",drizzleOrm.sql`length(${t.definition_hash}) = 64 AND ${t.definition_hash} NOT GLOB '*[^0-9a-f]*'`),workspaceIdCheck:sqliteCore.check("ui_instances_workspace_id_ck",drizzleOrm.sql`length(${t.workspace_id}) BETWEEN 1 AND 256`),threadIdCheck:sqliteCore.check("ui_instances_thread_id_ck",drizzleOrm.sql`length(${t.thread_id}) BETWEEN 1 AND 256`),appIdCheck:sqliteCore.check("ui_instances_app_id_ck",drizzleOrm.sql`${t.app_id} IS NULL OR length(${t.app_id}) BETWEEN 1 AND 128`),domainRefJsonCheck:sqliteCore.check("ui_instances_domain_ref_json_ck",drizzleOrm.sql`json_valid(${t.domain_ref_json}) AND json_type(${t.domain_ref_json}) = 'object'`),stateJsonCheck:sqliteCore.check("ui_instances_state_json_ck",drizzleOrm.sql`json_valid(${t.state_json}) AND json_type(${t.state_json}) = 'object'`),revisionCheck:sqliteCore.check("ui_instances_revision_ck",drizzleOrm.sql`${t.revision} >= 0`),statusCheck:sqliteCore.check("ui_instances_status_ck",drizzleOrm.sql`${t.status} IN ('active', 'completed', 'expired', 'revoked', 'unsupported')`),grantedCapabilitiesJsonCheck:sqliteCore.check("ui_instances_granted_capabilities_json_ck",drizzleOrm.sql`json_valid(${t.granted_capabilities_json}) AND json_type(${t.granted_capabilities_json}) = 'array'`),openedByJsonCheck:sqliteCore.check("ui_instances_opened_by_json_ck",drizzleOrm.sql`${t.opened_by_json} IS NULL OR (json_valid(${t.opened_by_json}) AND json_type(${t.opened_by_json}) = 'object')`),createdAtCheck:sqliteCore.check("ui_instances_created_at_ck",drizzleOrm.sql`${t.created_at} >= 0`),updatedAtCheck:sqliteCore.check("ui_instances_updated_at_ck",drizzleOrm.sql`${t.updated_at} >= ${t.created_at}`),workspaceThreadIdx:sqliteCore.index("ui_instances_workspace_thread_idx").on(t.workspace_id,t.thread_id),workspaceThreadAppUnique:sqliteCore.uniqueIndex("ui_instances_workspace_thread_app_uq").on(t.workspace_id,t.thread_id,t.app_id).where(drizzleOrm.sql`${t.status} = 'active'`)}));});var Ji=v(()=>{h();sqliteCore.sqliteTable("ui_action_receipts",{id:sqliteCore.text("id").primaryKey().notNull(),instance_id:sqliteCore.text("instance_id").notNull(),request_id:sqliteCore.text("request_id").notNull(),action_id:sqliteCore.text("action_id").notNull(),actor_json:sqliteCore.text("actor_json").notNull(),source:sqliteCore.text("source").notNull(),expected_revision:sqliteCore.integer("expected_revision").notNull(),before_revision:sqliteCore.integer("before_revision").notNull(),after_revision:sqliteCore.integer("after_revision"),status:sqliteCore.text("status").notNull(),outcome:sqliteCore.text("outcome"),input_json:sqliteCore.text("input_json").notNull(),result_json:sqliteCore.text("result_json"),error_code:sqliteCore.text("error_code"),requested_at:sqliteCore.integer("requested_at").notNull(),settled_at:sqliteCore.integer("settled_at")},t=>({idCheck:sqliteCore.check("ui_action_receipts_id_ck",drizzleOrm.sql`length(${t.id}) BETWEEN 5 AND 128`),instanceIdCheck:sqliteCore.check("ui_action_receipts_instance_id_ck",drizzleOrm.sql`length(${t.instance_id}) BETWEEN 1 AND 128`),requestIdCheck:sqliteCore.check("ui_action_receipts_request_id_ck",drizzleOrm.sql`length(${t.request_id}) BETWEEN 1 AND 128`),actionIdCheck:sqliteCore.check("ui_action_receipts_action_id_ck",drizzleOrm.sql`length(${t.action_id}) BETWEEN 1 AND 128`),actorJsonCheck:sqliteCore.check("ui_action_receipts_actor_json_ck",drizzleOrm.sql`json_valid(${t.actor_json}) AND json_type(${t.actor_json}) = 'object'`),sourceCheck:sqliteCore.check("ui_action_receipts_source_ck",drizzleOrm.sql`${t.source} IN ('ui_host', 'cli', 'system', 'mcp')`),expectedRevisionCheck:sqliteCore.check("ui_action_receipts_expected_revision_ck",drizzleOrm.sql`${t.expected_revision} >= 0`),beforeRevisionCheck:sqliteCore.check("ui_action_receipts_before_revision_ck",drizzleOrm.sql`${t.before_revision} >= 0`),afterRevisionCheck:sqliteCore.check("ui_action_receipts_after_revision_ck",drizzleOrm.sql`${t.after_revision} IS NULL OR ${t.after_revision} >= 0`),statusCheck:sqliteCore.check("ui_action_receipts_status_ck",drizzleOrm.sql`${t.status} IN ('requested', 'settled')`),outcomeCheck:sqliteCore.check("ui_action_receipts_outcome_ck",drizzleOrm.sql`${t.outcome} IS NULL OR ${t.outcome} IN ('succeeded', 'rejected', 'failed', 'conflicted', 'expired')`),inputJsonCheck:sqliteCore.check("ui_action_receipts_input_json_ck",drizzleOrm.sql`json_valid(${t.input_json}) AND json_type(${t.input_json}) = 'object'`),resultJsonCheck:sqliteCore.check("ui_action_receipts_result_json_ck",drizzleOrm.sql`${t.result_json} IS NULL OR (json_valid(${t.result_json}) AND json_type(${t.result_json}) = 'object')`),requestedAtCheck:sqliteCore.check("ui_action_receipts_requested_at_ck",drizzleOrm.sql`${t.requested_at} >= 0`),settledAtCheck:sqliteCore.check("ui_action_receipts_settled_at_ck",drizzleOrm.sql`${t.settled_at} IS NULL OR ${t.settled_at} >= ${t.requested_at}`),statusTransitionCheck:sqliteCore.check("ui_action_receipts_status_transition_ck",drizzleOrm.sql`(
|
|
22
|
+
`)}`);let s=t.get(n`SELECT count(*) as cnt FROM sqlite_master WHERE type='table' AND name='__drizzle_migrations'`),i=0;s?.cnt&&(i=t.get(n`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0),Pu(t,i),s?.cnt&&(Uu(t,o),$u(t,o,n),Lu(t,o,n));let d=ju(t,o,n,!!s?.cnt),c=Wu(t,o,n,!!s?.cnt);e(t,{migrationsFolder:o});let f=(t.get(n`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0)-i;if(f>0){let p=s?.cnt?"Database migrated":"Database initialized";console.error(`[crewx] ${p} (${f} migration${f>1?"s":""} applied).`);}d&&t.all(n`SELECT hash FROM __drizzle_migrations`).some(g=>g.hash===d.hash)&&console.error(`[crewx] Task stop-marker cleanup (${d.affectedRows} success/failed row(s) affected).`),c&&t.all(n`SELECT hash FROM __drizzle_migrations`).some(g=>g.hash===c.hash)&&console.error(`[crewx] Thread creator pointer migration (${c.markedPointers} pointer(s) marked unverified).`);}function V(t,e){Si.has(e)||(tn(t),Si.add(e));}var Si,xu,Du,Fu,Bu,qu,bi,ce=v(()=>{h();Si=new Set,xu={agent_id:"TEXT",status:"TEXT DEFAULT 'running'",started_at:"TEXT",trace_id:"TEXT",parent_task_id:"TEXT",crewx_version:"TEXT",pid:"INTEGER",thread_id:"TEXT",workspace_id:"TEXT",workspace_ref:"TEXT",workspace_name:"TEXT",project_id:"TEXT",project_name:"TEXT",command:"TEXT"};Du={"0002_normalize_task_names":{workspace_name:"TEXT",project_name:"TEXT"},"0015_panoramic_gorilla_man":{project_id:"TEXT",workspace_id:"TEXT"},"0019_backfill_task_thread_ids":{command:"TEXT",thread_id:"TEXT"},"0024_storage_metadata":{prompt:"TEXT",rendered_prompt:"TEXT",result:"TEXT",input_tokens:"INTEGER DEFAULT 0",output_tokens:"INTEGER DEFAULT 0",cost_usd:"REAL DEFAULT 0"}};Fu="0027_task_stop_scope_cleanup",Bu="0033_thread_creator_boundary_guard",qu="trg_threads_creator_late_fill_guard",bi="thread_creator_unverified";});var x,So=v(()=>{h();x=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(),starred:sqliteCore.integer("starred").notNull().default(0)});});exports.tasks=void 0;var Hn=v(()=>{h();exports.tasks=sqliteCore.sqliteTable("tasks",{id:sqliteCore.text("id").primaryKey(),agent_id:sqliteCore.text("agent_id").notNull(),user_id:sqliteCore.text("user_id"),actor_kind:sqliteCore.text("actor_kind",{enum:["human","agent","system","unknown"]}),actor_id:sqliteCore.text("actor_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"),heartbeat_at:sqliteCore.text("heartbeat_at"),stop_requested_at:sqliteCore.text("stop_requested_at"),stop_requested_epoch:sqliteCore.integer("stop_requested_epoch"),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"),log_storage:sqliteCore.text("log_storage",{enum:["blob","events"]}).notNull().default("blob"),last_log_seq:sqliteCore.integer("last_log_seq").notNull().default(0),log_revision:sqliteCore.integer("log_revision").notNull().default(0),thread_id:sqliteCore.text("thread_id"),workspace_ref:sqliteCore.text("workspace_ref"),cwd:sqliteCore.text("cwd"),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)},t=>({log_storage_check:sqliteCore.check("tasks_log_storage_ck",drizzleOrm.sql`${t.log_storage} IN ('blob', 'events')`),idx_tasks_agent_id:sqliteCore.index("idx_tasks_agent_id").on(t.agent_id),idx_tasks_status:sqliteCore.index("idx_tasks_status").on(t.status),idx_tasks_started_at:sqliteCore.index("idx_tasks_started_at").on(t.started_at),idx_tasks_trace_id:sqliteCore.index("idx_tasks_trace_id").on(t.trace_id),idx_tasks_parent_task_id:sqliteCore.index("idx_tasks_parent_task_id").on(t.parent_task_id),idx_tasks_crewx_version:sqliteCore.index("idx_tasks_crewx_version").on(t.crewx_version),idx_tasks_pid:sqliteCore.index("idx_tasks_pid").on(t.pid),idx_tasks_status_heartbeat:sqliteCore.index("idx_tasks_status_heartbeat").on(t.status,t.heartbeat_at),idx_tasks_thread_id:sqliteCore.index("idx_tasks_thread_id").on(t.thread_id),idx_tasks_thread_creator:sqliteCore.index("idx_tasks_thread_creator").on(t.id,t.thread_id,t.actor_kind,t.actor_id),idx_tasks_workspace_id:sqliteCore.index("idx_tasks_workspace_id").on(t.workspace_id),idx_tasks_workspace_ref:sqliteCore.index("idx_tasks_workspace_ref").on(t.workspace_ref),idx_tasks_project_id:sqliteCore.index("idx_tasks_project_id").on(t.project_id),idx_tasks_ws_started:sqliteCore.index("idx_tasks_ws_started").on(t.workspace_id,t.started_at)}));});var ct,Ci=v(()=>{h();Hn();ct=sqliteCore.sqliteTable("task_log_events",{id:sqliteCore.integer("id").primaryKey(),task_id:sqliteCore.text("task_id").notNull().references(()=>exports.tasks.id,{onDelete:"cascade"}),seq:sqliteCore.integer("seq").notNull(),timestamp:sqliteCore.text("timestamp").notNull(),level:sqliteCore.text("level").notNull(),message:sqliteCore.text("message").notNull()},t=>({taskSeqUnique:sqliteCore.uniqueIndex("task_log_events_task_seq_uq").on(t.task_id,t.seq),timestampIdIndex:sqliteCore.index("task_log_events_timestamp_id_idx").on(t.timestamp,t.id)}));});var el,tl,w,yr=v(()=>{h();So();el="json_extract(metadata, '$.threadTitle.state')",tl="json_extract(metadata, '$.threadTitle.priority')",w=sqliteCore.sqliteTable("threads",{id:sqliteCore.text("id").primaryKey(),workspace_id:sqliteCore.text("workspace_id").references(()=>x.id,{onDelete:"set null"}),created_by_kind:sqliteCore.text("created_by_kind",{enum:["human","agent","system","unknown"]}),created_by_id:sqliteCore.text("created_by_id"),created_by_task_id:sqliteCore.text("created_by_task_id"),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)},t=>({idx_threads_updated_at:sqliteCore.index("idx_threads_updated_at").on(t.updated_at),idx_threads_workspace_id:sqliteCore.index("idx_threads_workspace_id").on(t.workspace_id),idx_threads_ws_updated:sqliteCore.index("idx_threads_ws_updated").on(t.workspace_id,t.updated_at),idx_threads_workspace_created_by_kind_updated_at:sqliteCore.index("idx_threads_workspace_created_by_kind_updated_at").on(t.workspace_id,t.created_by_kind,t.updated_at),idx_threads_title:sqliteCore.index("idx_threads_title").on(t.title),idx_threads_workspace_thread_state:sqliteCore.index("idx_threads_workspace_thread_state").on(t.workspace_id,drizzleOrm.sql.raw(el)),idx_threads_workspace_thread_priority:sqliteCore.index("idx_threads_workspace_thread_priority").on(t.workspace_id,drizzleOrm.sql.raw(tl))}));});var Di,Li=v(()=>{h();Di=sqliteCore.sqliteTable("thread_creator_unverified",{thread_id:sqliteCore.text("thread_id").notNull(),created_by_task_id:sqliteCore.text("created_by_task_id").notNull()},t=>({pk:sqliteCore.primaryKey({columns:[t.thread_id,t.created_by_task_id]})}));});var Tt,Hi=v(()=>{h();Hn();Tt=sqliteCore.sqliteTable("spans",{id:sqliteCore.text("id").primaryKey(),task_id:sqliteCore.text("task_id").references(()=>exports.tasks.id,{onDelete:"set null"}),parent_span_id:sqliteCore.text("parent_span_id").references(()=>Tt.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")},t=>({idx_spans_task_id:sqliteCore.index("idx_spans_task_id").on(t.task_id),idx_spans_parent_span_id:sqliteCore.index("idx_spans_parent_span_id").on(t.parent_span_id)}));});var ut,$i=v(()=>{h();Hn();ut=sqliteCore.sqliteTable("tool_calls",{id:sqliteCore.text("id").primaryKey(),task_id:sqliteCore.text("task_id").references(()=>exports.tasks.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()},t=>({idx_tool_calls_task_id:sqliteCore.index("idx_tool_calls_task_id").on(t.task_id),idx_tool_calls_tool_name:sqliteCore.index("idx_tool_calls_tool_name").on(t.tool_name),idx_tool_calls_timestamp:sqliteCore.index("idx_tool_calls_timestamp").on(t.timestamp)}));});var We,Fi=v(()=>{h();yr();We=sqliteCore.sqliteTable("thread_boxes",{id:sqliteCore.text("id").primaryKey(),thread_id:sqliteCore.text("thread_id").notNull().references(()=>w.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()},t=>({idx_thread_boxes_thread_id:sqliteCore.index("idx_thread_boxes_thread_id").on(t.thread_id),idx_thread_boxes_seq:sqliteCore.index("idx_thread_boxes_seq").on(t.thread_id,t.seq),uniq_thread_boxes_thread_seq:sqliteCore.unique().on(t.thread_id,t.seq)}));});var nn,qi=v(()=>{h();nn=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")},t=>({idx_request_logs_timestamp:sqliteCore.index("idx_request_logs_timestamp").on(t.timestamp),idx_request_logs_path:sqliteCore.index("idx_request_logs_path").on(t.path),idx_request_logs_status_code:sqliteCore.index("idx_request_logs_status_code").on(t.status_code),idx_request_logs_partition_key:sqliteCore.index("idx_request_logs_partition_key").on(t.partition_key)}));});var _e,Gi=v(()=>{h();_e=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")},t=>({uniq_usage_limit_snapshots_bucket:sqliteCore.uniqueIndex("uniq_usage_limit_snapshots_bucket").on(t.provider,t.account_ref,t.limit_window,t.bucket_start),idx_usage_limit_snapshots_window_bucket:sqliteCore.index("idx_usage_limit_snapshots_window_bucket").on(t.limit_window,t.bucket_start),idx_usage_limit_snapshots_provider_window_bucket:sqliteCore.index("idx_usage_limit_snapshots_provider_window_bucket").on(t.provider,t.limit_window,t.bucket_start)}));});var De,zi=v(()=>{h();De=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")},t=>({uniq_usage_reports_ws_month:sqliteCore.uniqueIndex("uniq_usage_reports_ws_month").on(t.workspace_id,t.month)}));});var F,ie,Vi=v(()=>{h();F=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")},t=>({idx_notifications_ws_created:sqliteCore.index("idx_notifications_ws_created").on(t.workspace_id,drizzleOrm.sql`${t.created_at} DESC`)})),ie=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()},t=>({pk:sqliteCore.primaryKey({columns:[t.notification_id,t.user_id]})}));});var j,Yi=v(()=>{h();j=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()},t=>({idx_agent_suggestions_ws_agent:sqliteCore.index("idx_agent_suggestions_ws_agent").on(t.workspace_id,t.agent_id),idx_agent_suggestions_ws_created:sqliteCore.index("idx_agent_suggestions_ws_created").on(t.workspace_id,t.created_at)}));});var Xi=v(()=>{h();sqliteCore.sqliteTable("ui_instances",{id:sqliteCore.text("id").primaryKey().notNull(),definition_id:sqliteCore.text("definition_id").notNull(),definition_version:sqliteCore.integer("definition_version").notNull(),definition_hash:sqliteCore.text("definition_hash").notNull(),workspace_id:sqliteCore.text("workspace_id").notNull(),thread_id:sqliteCore.text("thread_id").notNull(),app_id:sqliteCore.text("app_id"),anchor_task_id:sqliteCore.text("anchor_task_id"),domain_ref_json:sqliteCore.text("domain_ref_json").notNull(),state_json:sqliteCore.text("state_json").notNull(),revision:sqliteCore.integer("revision").notNull().default(0),status:sqliteCore.text("status").notNull().default("active"),granted_capabilities_json:sqliteCore.text("granted_capabilities_json").notNull().default("[]"),opened_by_json:sqliteCore.text("opened_by_json"),created_at:sqliteCore.integer("created_at").notNull(),updated_at:sqliteCore.integer("updated_at").notNull()},t=>({idCheck:sqliteCore.check("ui_instances_id_ck",drizzleOrm.sql`length(${t.id}) BETWEEN 5 AND 128 AND ${t.id} GLOB 'uic_*'`),definitionIdCheck:sqliteCore.check("ui_instances_definition_id_ck",drizzleOrm.sql`length(${t.definition_id}) BETWEEN 1 AND 128`),definitionVersionCheck:sqliteCore.check("ui_instances_definition_version_ck",drizzleOrm.sql`${t.definition_version} >= 1`),definitionHashCheck:sqliteCore.check("ui_instances_definition_hash_ck",drizzleOrm.sql`length(${t.definition_hash}) = 64 AND ${t.definition_hash} NOT GLOB '*[^0-9a-f]*'`),workspaceIdCheck:sqliteCore.check("ui_instances_workspace_id_ck",drizzleOrm.sql`length(${t.workspace_id}) BETWEEN 1 AND 256`),threadIdCheck:sqliteCore.check("ui_instances_thread_id_ck",drizzleOrm.sql`length(${t.thread_id}) BETWEEN 1 AND 256`),appIdCheck:sqliteCore.check("ui_instances_app_id_ck",drizzleOrm.sql`${t.app_id} IS NULL OR length(${t.app_id}) BETWEEN 1 AND 128`),domainRefJsonCheck:sqliteCore.check("ui_instances_domain_ref_json_ck",drizzleOrm.sql`json_valid(${t.domain_ref_json}) AND json_type(${t.domain_ref_json}) = 'object'`),stateJsonCheck:sqliteCore.check("ui_instances_state_json_ck",drizzleOrm.sql`json_valid(${t.state_json}) AND json_type(${t.state_json}) = 'object'`),revisionCheck:sqliteCore.check("ui_instances_revision_ck",drizzleOrm.sql`${t.revision} >= 0`),statusCheck:sqliteCore.check("ui_instances_status_ck",drizzleOrm.sql`${t.status} IN ('active', 'completed', 'expired', 'revoked', 'unsupported')`),grantedCapabilitiesJsonCheck:sqliteCore.check("ui_instances_granted_capabilities_json_ck",drizzleOrm.sql`json_valid(${t.granted_capabilities_json}) AND json_type(${t.granted_capabilities_json}) = 'array'`),openedByJsonCheck:sqliteCore.check("ui_instances_opened_by_json_ck",drizzleOrm.sql`${t.opened_by_json} IS NULL OR (json_valid(${t.opened_by_json}) AND json_type(${t.opened_by_json}) = 'object')`),createdAtCheck:sqliteCore.check("ui_instances_created_at_ck",drizzleOrm.sql`${t.created_at} >= 0`),updatedAtCheck:sqliteCore.check("ui_instances_updated_at_ck",drizzleOrm.sql`${t.updated_at} >= ${t.created_at}`),workspaceThreadIdx:sqliteCore.index("ui_instances_workspace_thread_idx").on(t.workspace_id,t.thread_id),workspaceThreadAppUnique:sqliteCore.uniqueIndex("ui_instances_workspace_thread_app_uq").on(t.workspace_id,t.thread_id,t.app_id).where(drizzleOrm.sql`${t.status} = 'active'`)}));});var Zi=v(()=>{h();sqliteCore.sqliteTable("ui_action_receipts",{id:sqliteCore.text("id").primaryKey().notNull(),instance_id:sqliteCore.text("instance_id").notNull(),definition_id:sqliteCore.text("definition_id"),definition_version:sqliteCore.integer("definition_version"),definition_hash:sqliteCore.text("definition_hash"),request_id:sqliteCore.text("request_id").notNull(),action_id:sqliteCore.text("action_id").notNull(),actor_json:sqliteCore.text("actor_json").notNull(),source:sqliteCore.text("source").notNull(),expected_revision:sqliteCore.integer("expected_revision").notNull(),before_revision:sqliteCore.integer("before_revision").notNull(),after_revision:sqliteCore.integer("after_revision"),status:sqliteCore.text("status").notNull(),outcome:sqliteCore.text("outcome"),input_json:sqliteCore.text("input_json").notNull(),result_json:sqliteCore.text("result_json"),error_code:sqliteCore.text("error_code"),requested_at:sqliteCore.integer("requested_at").notNull(),settled_at:sqliteCore.integer("settled_at")},t=>({idCheck:sqliteCore.check("ui_action_receipts_id_ck",drizzleOrm.sql`length(${t.id}) BETWEEN 5 AND 128`),instanceIdCheck:sqliteCore.check("ui_action_receipts_instance_id_ck",drizzleOrm.sql`length(${t.instance_id}) BETWEEN 1 AND 128`),requestIdCheck:sqliteCore.check("ui_action_receipts_request_id_ck",drizzleOrm.sql`length(${t.request_id}) BETWEEN 1 AND 128`),actionIdCheck:sqliteCore.check("ui_action_receipts_action_id_ck",drizzleOrm.sql`length(${t.action_id}) BETWEEN 1 AND 128`),actorJsonCheck:sqliteCore.check("ui_action_receipts_actor_json_ck",drizzleOrm.sql`json_valid(${t.actor_json}) AND json_type(${t.actor_json}) = 'object'`),sourceCheck:sqliteCore.check("ui_action_receipts_source_ck",drizzleOrm.sql`${t.source} IN ('ui_host', 'cli', 'system', 'mcp')`),expectedRevisionCheck:sqliteCore.check("ui_action_receipts_expected_revision_ck",drizzleOrm.sql`${t.expected_revision} >= 0`),beforeRevisionCheck:sqliteCore.check("ui_action_receipts_before_revision_ck",drizzleOrm.sql`${t.before_revision} >= 0`),afterRevisionCheck:sqliteCore.check("ui_action_receipts_after_revision_ck",drizzleOrm.sql`${t.after_revision} IS NULL OR ${t.after_revision} >= 0`),statusCheck:sqliteCore.check("ui_action_receipts_status_ck",drizzleOrm.sql`${t.status} IN ('requested', 'settled')`),outcomeCheck:sqliteCore.check("ui_action_receipts_outcome_ck",drizzleOrm.sql`${t.outcome} IS NULL OR ${t.outcome} IN ('succeeded', 'rejected', 'failed', 'conflicted', 'expired')`),inputJsonCheck:sqliteCore.check("ui_action_receipts_input_json_ck",drizzleOrm.sql`json_valid(${t.input_json}) AND json_type(${t.input_json}) = 'object'`),resultJsonCheck:sqliteCore.check("ui_action_receipts_result_json_ck",drizzleOrm.sql`${t.result_json} IS NULL OR (json_valid(${t.result_json}) AND json_type(${t.result_json}) = 'object')`),requestedAtCheck:sqliteCore.check("ui_action_receipts_requested_at_ck",drizzleOrm.sql`${t.requested_at} >= 0`),settledAtCheck:sqliteCore.check("ui_action_receipts_settled_at_ck",drizzleOrm.sql`${t.settled_at} IS NULL OR ${t.settled_at} >= ${t.requested_at}`),statusTransitionCheck:sqliteCore.check("ui_action_receipts_status_transition_ck",drizzleOrm.sql`(
|
|
23
23
|
(${t.status} = 'requested' AND ${t.after_revision} IS NULL AND ${t.outcome} IS NULL AND ${t.settled_at} IS NULL)
|
|
24
24
|
OR
|
|
25
25
|
(${t.status} = 'settled' AND ${t.after_revision} IS NOT NULL AND ${t.outcome} IS NOT NULL AND ${t.settled_at} IS NOT NULL)
|
|
26
|
-
)`),instanceRequestUnique:sqliteCore.uniqueIndex("ui_action_receipts_instance_request_uq").on(t.instance_id,t.request_id),instanceIdIdx:sqliteCore.index("ui_action_receipts_instance_id_idx").on(t.instance_id),requestedAtIdx:sqliteCore.index("ui_action_receipts_requested_at_idx").on(t.requested_at)}));});var z,Le,Je,Xi=v(()=>{h();z=sqliteCore.sqliteTable("projects",{id:sqliteCore.text("id").primaryKey().notNull(),workspace_id:sqliteCore.text("workspace_id").notNull(),name:sqliteCore.text("name").notNull(),outcome:sqliteCore.text("outcome").notNull(),due_date:sqliteCore.text("due_date"),scene:sqliteCore.text("scene").notNull().default("planning"),stages_json:sqliteCore.text("stages_json").notNull(),stage_index:sqliteCore.integer("stage_index").notNull(),created_at:sqliteCore.text("created_at").notNull(),updated_at:sqliteCore.text("updated_at").notNull(),accepted_at:sqliteCore.text("accepted_at"),archived_at:sqliteCore.text("archived_at")},t=>({idCheck:sqliteCore.check("projects_id_ck",drizzleOrm.sql`${t.id} GLOB 'prj_*'`),sceneCheck:sqliteCore.check("projects_scene_ck",drizzleOrm.sql`${t.scene} IN ('planning', 'plan_review', 'running', 'human_wait', 'limit_wait', 'failed_stop', 'analyzing_feedback', 'replanned', 'awaiting_review', 'accepted')`),stagesJsonCheck:sqliteCore.check("projects_stages_json_ck",drizzleOrm.sql`json_valid(${t.stages_json}) AND json_type(${t.stages_json}) = 'array'`),stageIndexCheck:sqliteCore.check("projects_stage_index_ck",drizzleOrm.sql`${t.stage_index} >= 1`)})),Le=sqliteCore.sqliteTable("project_criteria",{id:sqliteCore.text("id").primaryKey().notNull(),project_id:sqliteCore.text("project_id").notNull().references(()=>z.id,{onDelete:"cascade"}),position:sqliteCore.integer("position").notNull(),statement:sqliteCore.text("statement").notNull(),verify_status:sqliteCore.text("verify_status").notNull().default("pending"),verified_at:sqliteCore.text("verified_at"),evidence_json:sqliteCore.text("evidence_json").notNull().default("[]"),created_at:sqliteCore.text("created_at").notNull(),updated_at:sqliteCore.text("updated_at").notNull()},t=>({idCheck:sqliteCore.check("project_criteria_id_ck",drizzleOrm.sql`${t.id} GLOB 'pjc_*'`),verifyStatusCheck:sqliteCore.check("project_criteria_verify_status_ck",drizzleOrm.sql`${t.verify_status} IN ('pending', 'verifying', 'passed', 'failed')`),evidenceJsonCheck:sqliteCore.check("project_criteria_evidence_json_ck",drizzleOrm.sql`json_valid(${t.evidence_json}) AND json_type(${t.evidence_json}) = 'array'`),projectPositionUnique:sqliteCore.uniqueIndex("project_criteria_project_position_uq").on(t.project_id,t.position)})),Je=sqliteCore.sqliteTable("project_events",{id:sqliteCore.text("id").primaryKey().notNull(),project_id:sqliteCore.text("project_id").notNull().references(()=>z.id,{onDelete:"restrict"}),seq:sqliteCore.integer("seq").notNull(),actor_type:sqliteCore.text("actor_type").notNull(),actor_id:sqliteCore.text("actor_id"),type:sqliteCore.text("type").notNull(),title:sqliteCore.text("title").notNull(),summary:sqliteCore.text("summary"),payload_json:sqliteCore.text("payload_json").notNull().default("{}"),created_at:sqliteCore.text("created_at").notNull()},t=>({idCheck:sqliteCore.check("project_events_id_ck",drizzleOrm.sql`${t.id} GLOB 'pje_*'`),actorTypeCheck:sqliteCore.check("project_events_actor_type_ck",drizzleOrm.sql`${t.actor_type} IN ('user', 'project_manager', 'system')`),payloadJsonCheck:sqliteCore.check("project_events_payload_json_ck",drizzleOrm.sql`json_valid(${t.payload_json}) AND json_type(${t.payload_json}) = 'object'`),projectSeqUnique:sqliteCore.uniqueIndex("project_events_project_seq_uq").on(t.project_id,t.seq)}));});exports.COMMON_CODE_GROUPS=void 0;exports.COMMON_CODE_COLORS=void 0;var I,Ao=v(()=>{h();exports.COMMON_CODE_GROUPS=["THREAD_STATE","THREAD_PRIORITY"],exports.COMMON_CODE_COLORS=["gray","blue","violet","green","amber","orange","red","pink"],I=sqliteCore.sqliteTable("common_codes",{code_group:sqliteCore.text("code_group").notNull(),code:sqliteCore.text("code").notNull(),code_name:sqliteCore.text("code_name"),color:sqliteCore.text("color").notNull().default("gray"),sort_order:sqliteCore.integer("sort_order").notNull(),workspace_id:sqliteCore.text("workspace_id"),is_builtin:sqliteCore.integer("is_builtin").notNull().default(0),is_archived:sqliteCore.integer("is_archived").notNull().default(0),metadata:sqliteCore.text("metadata"),created_at:sqliteCore.text("created_at").notNull(),updated_at:sqliteCore.text("updated_at").notNull()},t=>({pk:sqliteCore.primaryKey({columns:[t.code_group,t.code]}),metadataCheck:sqliteCore.check("common_codes_metadata_ck",drizzleOrm.sql`${t.metadata} IS NULL OR (json_valid(${t.metadata}) AND json_type(${t.metadata}) = 'object')`),builtinCheck:sqliteCore.check("common_codes_builtin_ck",drizzleOrm.sql`${t.is_builtin} IN (0, 1)`),archivedCheck:sqliteCore.check("common_codes_archived_ck",drizzleOrm.sql`${t.is_archived} IN (0, 1)`),idxCommonCodesSelection:sqliteCore.index("idx_common_codes_group_archived_order").on(t.code_group,t.is_archived,t.sort_order)}));});var Qi,Zi,ea,ta,na,K,B,H,ra=v(()=>{h();mr();Qi=["thread.snapshot.imported","thread.title.changed","thread.priority.changed","thread.state.changed","thread.highlight.created","thread.highlight.updated","thread.highlight.deleted","thread.highlights.regenerated"],Zi=["user","agent","system"],ea=["auto","manual"],ta=["decision","judgment","issue","result","pivot"],na=["queued","running","completed","failed"],K=sqliteCore.sqliteTable("thread_events",{id:sqliteCore.text("id").primaryKey().notNull(),thread_id:sqliteCore.text("thread_id").notNull().references(()=>w.id,{onDelete:"cascade"}),seq:sqliteCore.integer("seq").notNull(),type:sqliteCore.text("type").notNull(),actor_type:sqliteCore.text("actor_type").notNull(),payload_json:sqliteCore.text("payload_json").notNull(),created_at:sqliteCore.text("created_at").notNull(),actor_id:sqliteCore.text("actor_id"),task_id:sqliteCore.text("task_id"),highlight_id:sqliteCore.text("highlight_id")},t=>({typeCheck:sqliteCore.check("thread_events_type_ck",drizzleOrm.sql`${t.type} IN ('thread.snapshot.imported', 'thread.title.changed', 'thread.priority.changed', 'thread.state.changed', 'thread.highlight.created', 'thread.highlight.updated', 'thread.highlight.deleted', 'thread.highlights.regenerated')`),actorTypeCheck:sqliteCore.check("thread_events_actor_type_ck",drizzleOrm.sql`${t.actor_type} IN ('user', 'agent', 'system')`),payloadJsonCheck:sqliteCore.check("thread_events_payload_json_ck",drizzleOrm.sql`json_valid(${t.payload_json}) AND json_type(${t.payload_json}) = 'object'`),threadSeqIndex:sqliteCore.index("idx_thread_events_thread_seq").on(t.thread_id,t.seq),threadCreatedIndex:sqliteCore.index("idx_thread_events_thread_created").on(t.thread_id,t.created_at),threadSeqUnique:sqliteCore.uniqueIndex("thread_events_thread_seq_uq").on(t.thread_id,t.seq)})),B=sqliteCore.sqliteTable("thread_highlight_runs",{id:sqliteCore.text("id").primaryKey().notNull(),thread_id:sqliteCore.text("thread_id").notNull().references(()=>w.id,{onDelete:"cascade"}),request_id:sqliteCore.text("request_id").notNull(),status:sqliteCore.text("status").notNull(),detector_version:sqliteCore.text("detector_version").notNull(),requested_at:sqliteCore.text("requested_at").notNull(),started_at:sqliteCore.text("started_at"),completed_at:sqliteCore.text("completed_at"),error_code:sqliteCore.text("error_code"),previous_auto_count:sqliteCore.integer("previous_auto_count"),new_auto_count:sqliteCore.integer("new_auto_count")},t=>({statusCheck:sqliteCore.check("thread_highlight_runs_status_ck",drizzleOrm.sql`${t.status} IN ('queued', 'running', 'completed', 'failed')`),countCheck:sqliteCore.check("thread_highlight_runs_counts_ck",drizzleOrm.sql`(${t.previous_auto_count} IS NULL OR ${t.previous_auto_count} >= 0) AND (${t.new_auto_count} IS NULL OR ${t.new_auto_count} >= 0)`),threadRequestUnique:sqliteCore.uniqueIndex("thread_highlight_runs_thread_request_uq").on(t.thread_id,t.request_id),inProgressThreadUnique:sqliteCore.uniqueIndex("thread_highlight_runs_in_progress_thread_uq").on(t.thread_id).where(drizzleOrm.sql`${t.status} IN ('queued', 'running')`),threadStatusRequestedIndex:sqliteCore.index("idx_thread_highlight_runs_thread_status_requested").on(t.thread_id,t.status,t.requested_at)})),H=sqliteCore.sqliteTable("thread_highlights",{id:sqliteCore.text("id").primaryKey().notNull(),thread_id:sqliteCore.text("thread_id").notNull().references(()=>w.id,{onDelete:"cascade"}),source:sqliteCore.text("source").notNull(),kind:sqliteCore.text("kind").notNull(),status:sqliteCore.text("status").notNull().default("active"),text:sqliteCore.text("text"),covers_from_task_id:sqliteCore.text("covers_from_task_id").notNull(),covers_to_task_id:sqliteCore.text("covers_to_task_id").notNull(),revision:sqliteCore.integer("revision").notNull().default(0),created_at:sqliteCore.text("created_at").notNull(),updated_at:sqliteCore.text("updated_at").notNull(),agent_id:sqliteCore.text("agent_id"),source_task_id:sqliteCore.text("source_task_id"),detector_version:sqliteCore.text("detector_version"),content_fingerprint:sqliteCore.text("content_fingerprint"),dismissed_at:sqliteCore.text("dismissed_at")},t=>({sourceCheck:sqliteCore.check("thread_highlights_source_ck",drizzleOrm.sql`${t.source} IN ('auto', 'manual')`),kindCheck:sqliteCore.check("thread_highlights_kind_ck",drizzleOrm.sql`${t.kind} IN ('decision', 'judgment', 'issue', 'result', 'pivot')`),statusCheck:sqliteCore.check("thread_highlights_status_ck",drizzleOrm.sql`${t.status} IN ('active', 'dismissed')`),activeTextCheck:sqliteCore.check("thread_highlights_active_text_ck",drizzleOrm.sql`${t.status} = 'dismissed' OR (${t.text} IS NOT NULL AND length(${t.text}) > 0)`),coversCheck:sqliteCore.check("thread_highlights_covers_ck",drizzleOrm.sql`length(${t.covers_from_task_id}) > 0 AND length(${t.covers_to_task_id}) > 0`),autoKeyCheck:sqliteCore.check("thread_highlights_auto_key_ck",drizzleOrm.sql`${t.source} = 'manual' OR (${t.source} = 'auto' AND ${t.source_task_id} IS NOT NULL AND ${t.detector_version} IS NOT NULL AND ${t.content_fingerprint} IS NOT NULL AND length(${t.source_task_id}) > 0 AND length(${t.detector_version}) > 0 AND length(${t.content_fingerprint}) > 0)`),threadStatusCreatedIndex:sqliteCore.index("idx_thread_highlights_thread_status_created").on(t.thread_id,t.status,t.created_at),threadCoversIndex:sqliteCore.index("idx_thread_highlights_thread_covers").on(t.thread_id,t.covers_from_task_id,t.covers_to_task_id),autoIdempotencyUnique:sqliteCore.uniqueIndex("thread_highlights_auto_idempotency_uq").on(t.thread_id,t.source_task_id,t.detector_version,t.content_fingerprint).where(drizzleOrm.sql`${t.source} = 'auto'`)}));});var sa=v(()=>{h();sqliteCore.sqliteTable("storage_metadata",{source_kind:sqliteCore.text("source_kind").notNull(),source_id:sqliteCore.text("source_id").notNull(),utc_ts:sqliteCore.text("utc_ts"),bytes:sqliteCore.integer("bytes").notNull()},t=>({pk:sqliteCore.primaryKey({columns:[t.source_kind,t.source_id]}),kindTimestampBytesIndex:sqliteCore.index("idx_storage_metadata_kind_ts_bytes").on(t.source_kind,t.utc_ts,t.bytes)})),sqliteCore.sqliteTable("storage_metadata_state",{unit:sqliteCore.text("unit").primaryKey().notNull(),cursor_rowid:sqliteCore.integer("cursor_rowid").notNull().default(0),end_rowid:sqliteCore.integer("end_rowid"),complete:sqliteCore.integer("complete").notNull().default(0),updated_at:sqliteCore.text("updated_at").notNull()});});var ue=v(()=>{h();wo();Pn();Ai();mr();Ci();Pi();Di();Mi();Ui();Bi();qi();Wi();zi();Ki();Ji();Xi();Ao();ra();sa();});var sn,Uo,va,$o=v(()=>{h();sn={"claude-fable-5-1":{input:10,cachedInput:.25,output:50},"claude-fable-5":{input:10,cachedInput:1,output:50},"claude-opus-5-5":{input:4,cachedInput:.2,output:20},"claude-opus-5":{input:5,cachedInput:.5,output:25},"claude-opus-4-8":{input:5,cachedInput:.5,output:25},"claude-opus-4-7":{input:5,cachedInput:.5,output:25},"claude-opus-4-6":{input:5,cachedInput:.5,output:25},"claude-sonnet-5":{input:2,cachedInput:.2,output:10},"claude-sonnet-4-6":{input:3,cachedInput:.3,output:15},"claude-haiku-4-5":{input:1,cachedInput:.1,output:5},"gpt-6-astra":{input:10,cachedInput:1,output:50},"gpt-6-sol":{input:2,cachedInput:.2,output:10},"gpt-6-luna":{input:.1,cachedInput:.01,output:.5},"gpt-5.6-sol":{input:4,cachedInput:.4,output:20},"gpt-5.6-terra":{input:2,cachedInput:.2,output:12},"gpt-5.6-luna":{input:.2,cachedInput:.02,output:1.2},"gpt-5.5":{input:5,cachedInput:.5,output:30},"gpt-5.4":{input:2.5,cachedInput:.25,output:15},"gpt-5.4-mini":{input:.75,cachedInput:.075,output:4.5},"gpt-5.3-codex":{input:1.75,cachedInput:.175,output:14},"gpt-5-mini":{input:.4,cachedInput:.1,output:1.6},"gpt-4.1":{input:2,cachedInput:.5,output:8},"gpt-4o":{input:2.5,cachedInput:1.25,output:10},"glm-5.2":{input:1.4,cachedInput:.26,output:4.4},"glm-5.1":{input:1.4,cachedInput:.26,output:4.4},"gemini-3.7-flash":{input:1.5,cachedInput:.15,output:7.5},"gemini-3.6-flash":{input:1.5,cachedInput:.15,output:7.5},"grok-4.7":{input:2,cachedInput:.5,output:6},"grok-4.6":{input:2,cachedInput:.5,output:6},"grok-4.5":{input:2,cachedInput:.3,output:6}},Uo=new Set(["gpt-5.3-codex-spark"]),va=new Set(["auto","claude-fable-5","claude-fable-5-1","claude-haiku-4-5","claude-opus-4-6-thinking","claude-opus-4-6[1m]","claude-opus-4-7[1m]","claude-opus-4-8[1m]","claude-opus-5","claude-opus-5-5","claude-sonnet-4-6","claude-sonnet-4-6[1m]","claude-sonnet-5","gemini-3.1-pro","gemini-3.5-flash","gemini-3.6-flash","gemini-3.7-flash","gpt-5.3-codex","gpt-5.3-codex-spark","gpt-5.4","gpt-5.4-mini","gpt-5.5","gpt-5.6-luna","gpt-5.6-sol","gpt-5.6-terra","gpt-6-astra","gpt-6-luna","gpt-6-sol","gpt-oss-120b","grok-4.5","grok-4.6","grok-4.7"]);});function Fo(t){let e=t.toLowerCase().trim();e=e.replace(/\[[^\]]*\]$/g,"");let n=e.lastIndexOf("/");return n>=0&&(e=e.slice(n+1)),e=e.replace(/-\d{8}$/,""),e}function hp(t){if(!t)return console.warn("[pricing] missing model id; cost is being recorded as 0"),Un;let e=Fo(t),n=gp[e];if(n)return Nr[n]??sn[n]??Un;if(Nr[e])return Nr[e];if(sn[e])return sn[e];if(Uo.has(e))return console.warn(`[pricing] unpublished model pricing: ${t}, cost_usd=0`),Un;if(va.has(e))return console.warn(`[pricing] missing catalog pricing: ${t}, cost_usd=0`),Un;let r={...sn,...Nr};for(let o of Object.keys(r))if(e.includes(o))return r[o];return console.warn(`[pricing] Unknown model: ${t}, cost_usd=0`),Un}function _p(t,e,n,r=0,o){let s=hp(n),i=Math.min(r,t),c=(t-i)*s.input/1e6,u=i*s.cachedInput/1e6,f=e*s.output/1e6;return c+u+f}function Oa(t,e,n,r,o,s){return t&&t>0?t:!e&&!n?0:_p(e??0,n??0,o,r??0)}var gp,Un,Nr,Cr=v(()=>{h();$o();$o();gp={opus:"claude-opus-4-8",sonnet:"claude-sonnet-4-6",haiku:"claude-haiku-4-5","codex-mini":"gpt-5.3-codex",codex:"gpt-5.3-codex"},Un={input:0,cachedInput:0,output:0},Nr={};});function Pa(t){return t instanceof Error?t:t===void 0?void 0:new Error(String(t))}function Ca(t){return typeof t=="object"&&t!==null&&"code"in t?String(t.code):void 0}function Da(t){return Number.isSafeInteger(t)&&t>0}function yp(t,e){return new Promise(n=>{let r;try{r=child_process.spawn(t,e,{windowsHide:!0});}catch(u){n({status:null,stdout:"",stderr:"",error:Pa(u)});return}let o="",s="",i=false,d,c=setTimeout(()=>{try{r.kill();}catch{}d({status:null,stdout:o,stderr:s,error:new Error(`Command timed out after ${Na}ms`)});},Na);d=u=>{i||(i=true,clearTimeout(c),n(u));},r.stdout?.setEncoding("utf8"),r.stderr?.setEncoding("utf8"),r.stdout?.on("data",u=>{o+=String(u);}),r.stderr?.on("data",u=>{s+=String(u);}),r.once("error",u=>{d({status:null,stdout:o,stderr:s,error:u});}),r.once("close",u=>{d({status:u,stdout:o,stderr:s});});})}async function La(t,e,n){return n.runCommandAsync?n.runCommandAsync(t,e):n.runCommand?n.runCommand(t,e):yp(t,e)}function Rp(t){return new Promise(e=>{setTimeout(e,Math.max(0,t));})}function Ep(){return new Promise(t=>{setImmediate(t);})}function Lt(t,e=process.kill){try{return e(t,0),"alive"}catch(n){return Ca(n)==="ESRCH"?"not_found":Ca(n)==="EPERM"?"alive":"unknown"}}function Sp(t,e){let n=Lt(-t,e),r=Lt(t,e);return n==="alive"||r==="alive"?"alive":n==="unknown"||r==="unknown"?"unknown":"not_found"}async function Ma(t,e,n,r){let o=Math.max(0,n),s=Math.max(1,r.pollIntervalMs??Tp),i=Date.now()+o,d,c=o===0,u=r.sleep?Promise.resolve().then(()=>r.sleep(o)).then(()=>{},()=>{}):new Promise(f=>{d=setTimeout(f,o);});u.then(()=>{c=true;});try{for(await Ep();;){let f=Sp(t,e);if(f==="not_found")return f;let p=i-Date.now();if(c||p<=0)return f;await Promise.race([u,Rp(Math.min(s,p))]);}}finally{d!==void 0&&clearTimeout(d);}}async function xa(t,e,n,r,o){let s=await Ma(t,e,o.hardConfirmMs??wp,{...o,sleep:void 0});return s==="not_found"?n?{status:"not_found",pid:t,method:r}:{status:"terminated",pid:t,method:r}:s==="alive"?{status:"failed",pid:t,method:r,error:"Process is still running after termination attempt"}:{status:"failed",pid:t,method:r,error:"Unable to verify process termination"}}async function qo(t,e,n={}){if(!Da(t))return "unknown";let r=n.platform??process.platform,o=r==="win32"?"powershell.exe":"ps",s=r==="win32"?["-NoLogo","-NoProfile","-NonInteractive","-ExecutionPolicy","Bypass","-Command",`$p = Get-CimInstance -ClassName Win32_Process -Filter 'ProcessId = ${t}' -ErrorAction Stop; if ($null -ne $p) { [Console]::Write([string]$p.CommandLine) }`]:["-p",String(t),"-o","command="],i;try{i=await La(o,s,n);}catch{return "unknown"}if(i.error||i.status!==0)return "unknown";let d=i.stdout.trim();if(!d)return "not_found";let c=r==="win32"?d.toLowerCase():d;return e.filter(f=>f.trim().length>0).some(f=>{let p=r==="win32"?f.toLowerCase():f;return c.includes(p)})?"owned":"not_owned"}async function jo(t,e={}){let n=e.platform??process.platform,r=n==="win32"?"taskkill":"process-group",o=g=>({status:"failed",pid:t,method:r,error:g});if(!Da(t))return o("Invalid process ID");let s=e.kill??process.kill,i=Lt(t,s);if(i==="not_found")return {status:"not_found",pid:t,method:r};if(i!=="alive")return o("Unable to determine whether the process is alive");if(n==="win32"){let g;try{g=await La("taskkill",["/PID",String(t),"/T","/F"],e);}catch(m){g={status:null,stdout:"",stderr:"",error:Pa(m)};}let _=Lt(t,s);return _==="not_found"?g.status===0&&!g.error?{status:"terminated",pid:t,method:r}:{status:"not_found",pid:t,method:r}:o(_==="alive"?"Process is still running after termination attempt":"Unable to verify process termination")}let d,c=e.signal??"SIGKILL";try{s(-t,c);}catch(g){d=g;}if(c==="SIGKILL")return xa(t,s,d,r,e);if(await Ma(t,s,e.graceMs??kp,e)==="not_found")return d?{status:"not_found",pid:t,method:r}:{status:"terminated",pid:t,method:r};let f;try{s(-t,"SIGKILL");}catch(g){f=g;}let p=await xa(t,s,f,r,e);return p.status==="terminated"?p:p.status==="not_found"?d?p:{status:"terminated",pid:t,method:r}:o(p.error??"Process termination failed")}var Na,Bo,kp,Tp,wp,Wo=v(()=>{h();Na=3e3,Bo="SIGINT",kp=2e3,Tp=25,wp=100;});function Ba(t,e){let n=e===void 0?"":` at index ${e}`;if(!t||typeof t!="object")throw new exports.RepositoryError("VALIDATION",`Task log entry${n} must be an object`);if(typeof t.timestamp!="string"||typeof t.level!="string"||typeof t.message!="string")throw new exports.RepositoryError("VALIDATION",`Task log entry${n} must contain string timestamp, level, and message fields`);return {timestamp:t.timestamp,level:t.level,message:t.message}}function $a(t,e){if(e===null||e.trim()==="")return [];let n;try{n=JSON.parse(e);}catch(r){throw new exports.RepositoryError("DB_ERROR",`Malformed legacy task logs: ${t}`,r)}if(!Array.isArray(n))throw new exports.RepositoryError("DB_ERROR",`Malformed legacy task logs: ${t} (expected an array)`);try{return n.map((r,o)=>Ba(r,o))}catch(r){throw r instanceof exports.RepositoryError?new exports.RepositoryError("DB_ERROR",`Malformed legacy task logs: ${t}`,r):r}}function qa(t){if(t.log_storage!=="blob"&&t.log_storage!=="events")throw new exports.RepositoryError("DB_ERROR",`Invalid task log storage for task: ${t.id}`);if(!Number.isInteger(t.last_log_seq)||t.last_log_seq<0)throw new exports.RepositoryError("DB_ERROR",`Invalid task log sequence for task: ${t.id}`);if(!Number.isInteger(t.log_revision)||t.log_revision<0)throw new exports.RepositoryError("DB_ERROR",`Invalid task log revision for task: ${t.id}`);return t.log_storage}function Fa(t){return {taskId:t.id,source:qa(t),revision:t.log_revision,lastSeq:t.last_log_seq}}function Np(t){if(!Number.isInteger(t)||t<0)throw new exports.RepositoryError("VALIDATION","Task log tail limit must be a non-negative integer")}exports.TaskLogRepository=void 0;var xr=v(()=>{h();se();fe();ce();pe();ue();exports.TaskLogRepository=class extends exports.BaseSqliteRepository{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=Se.join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?ze(this.dbPath):super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=Se.dirname(n);Sa.existsSync(o)||Sa.mkdirSync(o,{recursive:true});}else if(!Sa.existsSync(n))throw new exports.RepositoryError("NOT_FOUND","Database not found");let r=C(n);if(e)try{V(r.db,n);}catch(o){throw r.close(),o}return r}findStateRow(e,n){return e.db.select({id:exports.tasks.id,log_storage:exports.tasks.log_storage,last_log_seq:exports.tasks.last_log_seq,log_revision:exports.tasks.log_revision,logs:exports.tasks.logs}).from(exports.tasks).where(drizzleOrm.eq(exports.tasks.id,n)).limit(1).get()}findStateRowInTransaction(e,n){return e.select({id:exports.tasks.id,log_storage:exports.tasks.log_storage,last_log_seq:exports.tasks.last_log_seq,log_revision:exports.tasks.log_revision,logs:exports.tasks.logs}).from(exports.tasks).where(drizzleOrm.eq(exports.tasks.id,n)).limit(1).get()}requireStateRowInTransaction(e,n){let r=this.findStateRowInTransaction(e,n);if(!r)throw new exports.RepositoryError("NOT_FOUND",`Task not found: ${n}`);return r}appendLog(e,n){return this.appendLogs(e,[n])}appendLogs(e,n){let r=n.map((s,i)=>Ba(s,i));if(r.length===0){let s=this.getLogState(e);if(!s)throw new exports.RepositoryError("NOT_FOUND",`Task not found: ${e}`);return s}let o=this.openHandle(true);try{return o.db.transaction(i=>{let d=this.requireStateRowInTransaction(i,e),c=qa(d);if(c==="blob"){let g=$a(e,d.logs);if(i.update(exports.tasks).set({logs:JSON.stringify([...g,...r]),log_revision:drizzleOrm.sql`${exports.tasks.log_revision} + 1`}).where(drizzleOrm.eq(exports.tasks.id,e)).run().changes!==1)throw new exports.RepositoryError("NOT_FOUND",`Task not found: ${e}`);return {taskId:e,source:c,revision:d.log_revision+1,lastSeq:d.last_log_seq}}let u=d.last_log_seq+1,f=d.last_log_seq+r.length;if(i.insert(at).values(r.map((g,_)=>({task_id:e,seq:u+_,timestamp:g.timestamp,level:g.level,message:g.message}))).run(),i.update(exports.tasks).set({last_log_seq:f,log_revision:drizzleOrm.sql`${exports.tasks.log_revision} + 1`}).where(drizzleOrm.eq(exports.tasks.id,e)).run().changes!==1)throw new exports.RepositoryError("NOT_FOUND",`Task not found: ${e}`);return {taskId:e,source:c,revision:d.log_revision+1,lastSeq:f}},{behavior:"immediate"})}catch(s){throw s instanceof exports.RepositoryError?s:new exports.RepositoryError("DB_ERROR","Failed to append task log",s)}finally{o.close();}}getLogState(e){if(!this.dbExists())return;let n=this.openHandle(false);try{let r=this.findStateRow(n,e);return r?Fa(r):void 0}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to read task log state",r)}finally{n.close();}}readLogs(e){return this.readLogsInternal(e)}readLogsTail(e,n){return Np(n),this.readLogsInternal(e,n)}readTail(e,n){return this.readLogsTail(e,n)}readLogsInternal(e,n){if(!this.dbExists())return;let r=this.openHandle(false);try{return r.db.transaction(o=>{let s=this.findStateRowInTransaction(o,e);if(!s)return;let i=Fa(s);if(i.source==="blob"){let f=$a(e,s.logs);return {...i,entries:n===void 0?f:f.slice(Math.max(0,f.length-n))}}let d=o.select({seq:at.seq,timestamp:at.timestamp,level:at.level,message:at.message}).from(at).where(drizzleOrm.eq(at.task_id,e)).orderBy(n===void 0?drizzleOrm.asc(at.seq):drizzleOrm.desc(at.seq)),u=(n===void 0?d.all():d.limit(n).all()).map(({timestamp:f,level:p,message:g})=>({timestamp:f,level:p,message:g}));return n!==void 0&&u.reverse(),{...i,entries:u}},{behavior:"deferred"})}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to read task logs",o)}finally{r.close();}}};});var ja=v(()=>{h();});var ne,Ht=v(()=>{h();ne=class extends Error{constructor(n,r,o){super(n);this.providerStr=r;this.name="ProviderError",this.code=o?.code??"UNKNOWN",this.kind=o?.kind??(this.code==="UNKNOWN"?"transient":void 0),this.retryAfterMs=o?.retryAfterMs;}providerStr;code;kind;retryAfterMs;stdout};});var Ut,Go=v(()=>{h();Ht();Ut=class extends ne{name="RateLimitError";constructor(e,n="cli/claude"){super(e,n,{code:"QUOTA_EXHAUSTED",kind:"transient"});}};});function Ko(t){if(!Pr(t)||t.type!=="item.started"||!Ga(t)||!Wa(t))return false;let e=t.item;return !Pr(e)||!Ga(e)||!Wa(e)||!zo(e.id)?false:e.type==="web_search"?e.query===""&&Pr(e.action)&&e.action.type==="other":e.type==="file_change"?e.status!=="in_progress"||!Array.isArray(e.changes)||e.changes.length===0?false:e.changes.every(n=>Pr(n)&&zo(n.path)&&zo(n.kind)):false}function Pr(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function za(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function zo(t){return typeof t=="string"&&t.trim().length>0}function Wa(t){return !za(t,"status")||t.status==="in_progress"}function Ga(t){for(let e of ["error","errors","isError","is_error"])if(za(t,e))return false;return true}var Vo=v(()=>{h();});function Cp(t,e){let n=t.trimStart();if(!n.startsWith("{"))return false;let r;try{r=JSON.parse(n);}catch{return false}let o=r.type;if(typeof o!="string")return false;let s=e?$p[e]:void 0;return s?s(r,o):Object.values(Va).some(i=>i(r,o))}function an(t,e){let n=t.split(`
|
|
27
|
-
|
|
26
|
+
)`),instanceRequestUnique:sqliteCore.uniqueIndex("ui_action_receipts_instance_request_uq").on(t.instance_id,t.request_id),instanceIdIdx:sqliteCore.index("ui_action_receipts_instance_id_idx").on(t.instance_id),requestedAtIdx:sqliteCore.index("ui_action_receipts_requested_at_idx").on(t.requested_at)}));});var ea=v(()=>{h();sqliteCore.sqliteTable("ui_instance_repins",{instance_id:sqliteCore.text("instance_id").notNull(),from_version:sqliteCore.integer("from_version").notNull(),from_hash:sqliteCore.text("from_hash").notNull(),to_version:sqliteCore.integer("to_version").notNull(),to_hash:sqliteCore.text("to_hash").notNull(),from_revision:sqliteCore.integer("from_revision").notNull(),to_revision:sqliteCore.integer("to_revision"),status:sqliteCore.text("status").notNull(),code:sqliteCore.text("code"),attempts:sqliteCore.integer("attempts").notNull().default(1),first_at:sqliteCore.integer("first_at").notNull(),last_at:sqliteCore.integer("last_at").notNull()},t=>({pk:sqliteCore.primaryKey({columns:[t.instance_id,t.to_hash],name:"ui_instance_repins_pk"}),instanceIdCheck:sqliteCore.check("ui_instance_repins_instance_id_ck",drizzleOrm.sql`length(${t.instance_id}) BETWEEN 5 AND 128 AND ${t.instance_id} GLOB 'uic_*'`),fromVersionCheck:sqliteCore.check("ui_instance_repins_from_version_ck",drizzleOrm.sql`${t.from_version} >= 1`),toVersionCheck:sqliteCore.check("ui_instance_repins_to_version_ck",drizzleOrm.sql`${t.to_version} >= 1`),fromHashCheck:sqliteCore.check("ui_instance_repins_from_hash_ck",drizzleOrm.sql`length(${t.from_hash}) = 64 AND ${t.from_hash} NOT GLOB '*[^0-9a-f]*'`),toHashCheck:sqliteCore.check("ui_instance_repins_to_hash_ck",drizzleOrm.sql`length(${t.to_hash}) = 64 AND ${t.to_hash} NOT GLOB '*[^0-9a-f]*'`),fromRevisionCheck:sqliteCore.check("ui_instance_repins_from_revision_ck",drizzleOrm.sql`${t.from_revision} >= 0`),toRevisionCheck:sqliteCore.check("ui_instance_repins_to_revision_ck",drizzleOrm.sql`${t.to_revision} IS NULL OR ${t.to_revision} >= 0`),statusCheck:sqliteCore.check("ui_instance_repins_status_ck",drizzleOrm.sql`${t.status} IN ('applied', 'deferred', 'failed')`),attemptsCheck:sqliteCore.check("ui_instance_repins_attempts_ck",drizzleOrm.sql`${t.attempts} >= 1`),datesCheck:sqliteCore.check("ui_instance_repins_dates_ck",drizzleOrm.sql`${t.first_at} >= 0 AND ${t.last_at} >= ${t.first_at}`),resultCheck:sqliteCore.check("ui_instance_repins_result_ck",drizzleOrm.sql`(
|
|
27
|
+
(${t.status} = 'applied' AND ${t.code} IS NULL
|
|
28
|
+
AND ${t.to_revision} = ${t.from_revision} + 1)
|
|
29
|
+
OR
|
|
30
|
+
(${t.status} IN ('deferred', 'failed') AND ${t.code} IS NOT NULL
|
|
31
|
+
AND ${t.to_revision} IS NULL)
|
|
32
|
+
)`)}));});var z,Me,Xe,na=v(()=>{h();z=sqliteCore.sqliteTable("projects",{id:sqliteCore.text("id").primaryKey().notNull(),workspace_id:sqliteCore.text("workspace_id").notNull(),name:sqliteCore.text("name").notNull(),outcome:sqliteCore.text("outcome").notNull(),due_date:sqliteCore.text("due_date"),scene:sqliteCore.text("scene").notNull().default("planning"),stages_json:sqliteCore.text("stages_json").notNull(),stage_index:sqliteCore.integer("stage_index").notNull(),created_at:sqliteCore.text("created_at").notNull(),updated_at:sqliteCore.text("updated_at").notNull(),accepted_at:sqliteCore.text("accepted_at"),archived_at:sqliteCore.text("archived_at")},t=>({idCheck:sqliteCore.check("projects_id_ck",drizzleOrm.sql`${t.id} GLOB 'prj_*'`),sceneCheck:sqliteCore.check("projects_scene_ck",drizzleOrm.sql`${t.scene} IN ('planning', 'plan_review', 'running', 'human_wait', 'limit_wait', 'failed_stop', 'analyzing_feedback', 'replanned', 'awaiting_review', 'accepted')`),stagesJsonCheck:sqliteCore.check("projects_stages_json_ck",drizzleOrm.sql`json_valid(${t.stages_json}) AND json_type(${t.stages_json}) = 'array'`),stageIndexCheck:sqliteCore.check("projects_stage_index_ck",drizzleOrm.sql`${t.stage_index} >= 1`)})),Me=sqliteCore.sqliteTable("project_criteria",{id:sqliteCore.text("id").primaryKey().notNull(),project_id:sqliteCore.text("project_id").notNull().references(()=>z.id,{onDelete:"cascade"}),position:sqliteCore.integer("position").notNull(),statement:sqliteCore.text("statement").notNull(),verify_status:sqliteCore.text("verify_status").notNull().default("pending"),verified_at:sqliteCore.text("verified_at"),evidence_json:sqliteCore.text("evidence_json").notNull().default("[]"),created_at:sqliteCore.text("created_at").notNull(),updated_at:sqliteCore.text("updated_at").notNull()},t=>({idCheck:sqliteCore.check("project_criteria_id_ck",drizzleOrm.sql`${t.id} GLOB 'pjc_*'`),verifyStatusCheck:sqliteCore.check("project_criteria_verify_status_ck",drizzleOrm.sql`${t.verify_status} IN ('pending', 'verifying', 'passed', 'failed')`),evidenceJsonCheck:sqliteCore.check("project_criteria_evidence_json_ck",drizzleOrm.sql`json_valid(${t.evidence_json}) AND json_type(${t.evidence_json}) = 'array'`),projectPositionUnique:sqliteCore.uniqueIndex("project_criteria_project_position_uq").on(t.project_id,t.position)})),Xe=sqliteCore.sqliteTable("project_events",{id:sqliteCore.text("id").primaryKey().notNull(),project_id:sqliteCore.text("project_id").notNull().references(()=>z.id,{onDelete:"restrict"}),seq:sqliteCore.integer("seq").notNull(),actor_type:sqliteCore.text("actor_type").notNull(),actor_id:sqliteCore.text("actor_id"),type:sqliteCore.text("type").notNull(),title:sqliteCore.text("title").notNull(),summary:sqliteCore.text("summary"),payload_json:sqliteCore.text("payload_json").notNull().default("{}"),created_at:sqliteCore.text("created_at").notNull()},t=>({idCheck:sqliteCore.check("project_events_id_ck",drizzleOrm.sql`${t.id} GLOB 'pje_*'`),actorTypeCheck:sqliteCore.check("project_events_actor_type_ck",drizzleOrm.sql`${t.actor_type} IN ('user', 'project_manager', 'system')`),payloadJsonCheck:sqliteCore.check("project_events_payload_json_ck",drizzleOrm.sql`json_valid(${t.payload_json}) AND json_type(${t.payload_json}) = 'object'`),projectSeqUnique:sqliteCore.uniqueIndex("project_events_project_seq_uq").on(t.project_id,t.seq)}));});exports.COMMON_CODE_GROUPS=void 0;exports.COMMON_CODE_COLORS=void 0;var I,Co=v(()=>{h();exports.COMMON_CODE_GROUPS=["THREAD_STATE","THREAD_PRIORITY"],exports.COMMON_CODE_COLORS=["gray","blue","violet","green","amber","orange","red","pink"],I=sqliteCore.sqliteTable("common_codes",{code_group:sqliteCore.text("code_group").notNull(),code:sqliteCore.text("code").notNull(),code_name:sqliteCore.text("code_name"),color:sqliteCore.text("color").notNull().default("gray"),sort_order:sqliteCore.integer("sort_order").notNull(),workspace_id:sqliteCore.text("workspace_id"),is_builtin:sqliteCore.integer("is_builtin").notNull().default(0),is_archived:sqliteCore.integer("is_archived").notNull().default(0),metadata:sqliteCore.text("metadata"),created_at:sqliteCore.text("created_at").notNull(),updated_at:sqliteCore.text("updated_at").notNull()},t=>({pk:sqliteCore.primaryKey({columns:[t.code_group,t.code]}),metadataCheck:sqliteCore.check("common_codes_metadata_ck",drizzleOrm.sql`${t.metadata} IS NULL OR (json_valid(${t.metadata}) AND json_type(${t.metadata}) = 'object')`),builtinCheck:sqliteCore.check("common_codes_builtin_ck",drizzleOrm.sql`${t.is_builtin} IN (0, 1)`),archivedCheck:sqliteCore.check("common_codes_archived_ck",drizzleOrm.sql`${t.is_archived} IN (0, 1)`),idxCommonCodesSelection:sqliteCore.index("idx_common_codes_group_archived_order").on(t.code_group,t.is_archived,t.sort_order)}));});var ra,oa,sa,ia,aa,K,B,H,da=v(()=>{h();yr();ra=["thread.snapshot.imported","thread.title.changed","thread.priority.changed","thread.state.changed","thread.highlight.created","thread.highlight.updated","thread.highlight.deleted","thread.highlights.regenerated"],oa=["user","agent","system"],sa=["auto","manual"],ia=["decision","judgment","issue","result","pivot"],aa=["queued","running","completed","failed"],K=sqliteCore.sqliteTable("thread_events",{id:sqliteCore.text("id").primaryKey().notNull(),thread_id:sqliteCore.text("thread_id").notNull().references(()=>w.id,{onDelete:"cascade"}),seq:sqliteCore.integer("seq").notNull(),type:sqliteCore.text("type").notNull(),actor_type:sqliteCore.text("actor_type").notNull(),payload_json:sqliteCore.text("payload_json").notNull(),created_at:sqliteCore.text("created_at").notNull(),actor_id:sqliteCore.text("actor_id"),task_id:sqliteCore.text("task_id"),highlight_id:sqliteCore.text("highlight_id")},t=>({typeCheck:sqliteCore.check("thread_events_type_ck",drizzleOrm.sql`${t.type} IN ('thread.snapshot.imported', 'thread.title.changed', 'thread.priority.changed', 'thread.state.changed', 'thread.highlight.created', 'thread.highlight.updated', 'thread.highlight.deleted', 'thread.highlights.regenerated')`),actorTypeCheck:sqliteCore.check("thread_events_actor_type_ck",drizzleOrm.sql`${t.actor_type} IN ('user', 'agent', 'system')`),payloadJsonCheck:sqliteCore.check("thread_events_payload_json_ck",drizzleOrm.sql`json_valid(${t.payload_json}) AND json_type(${t.payload_json}) = 'object'`),threadSeqIndex:sqliteCore.index("idx_thread_events_thread_seq").on(t.thread_id,t.seq),threadCreatedIndex:sqliteCore.index("idx_thread_events_thread_created").on(t.thread_id,t.created_at),threadSeqUnique:sqliteCore.uniqueIndex("thread_events_thread_seq_uq").on(t.thread_id,t.seq)})),B=sqliteCore.sqliteTable("thread_highlight_runs",{id:sqliteCore.text("id").primaryKey().notNull(),thread_id:sqliteCore.text("thread_id").notNull().references(()=>w.id,{onDelete:"cascade"}),request_id:sqliteCore.text("request_id").notNull(),status:sqliteCore.text("status").notNull(),detector_version:sqliteCore.text("detector_version").notNull(),requested_at:sqliteCore.text("requested_at").notNull(),started_at:sqliteCore.text("started_at"),completed_at:sqliteCore.text("completed_at"),error_code:sqliteCore.text("error_code"),previous_auto_count:sqliteCore.integer("previous_auto_count"),new_auto_count:sqliteCore.integer("new_auto_count")},t=>({statusCheck:sqliteCore.check("thread_highlight_runs_status_ck",drizzleOrm.sql`${t.status} IN ('queued', 'running', 'completed', 'failed')`),countCheck:sqliteCore.check("thread_highlight_runs_counts_ck",drizzleOrm.sql`(${t.previous_auto_count} IS NULL OR ${t.previous_auto_count} >= 0) AND (${t.new_auto_count} IS NULL OR ${t.new_auto_count} >= 0)`),threadRequestUnique:sqliteCore.uniqueIndex("thread_highlight_runs_thread_request_uq").on(t.thread_id,t.request_id),inProgressThreadUnique:sqliteCore.uniqueIndex("thread_highlight_runs_in_progress_thread_uq").on(t.thread_id).where(drizzleOrm.sql`${t.status} IN ('queued', 'running')`),threadStatusRequestedIndex:sqliteCore.index("idx_thread_highlight_runs_thread_status_requested").on(t.thread_id,t.status,t.requested_at)})),H=sqliteCore.sqliteTable("thread_highlights",{id:sqliteCore.text("id").primaryKey().notNull(),thread_id:sqliteCore.text("thread_id").notNull().references(()=>w.id,{onDelete:"cascade"}),source:sqliteCore.text("source").notNull(),kind:sqliteCore.text("kind").notNull(),status:sqliteCore.text("status").notNull().default("active"),text:sqliteCore.text("text"),covers_from_task_id:sqliteCore.text("covers_from_task_id").notNull(),covers_to_task_id:sqliteCore.text("covers_to_task_id").notNull(),revision:sqliteCore.integer("revision").notNull().default(0),created_at:sqliteCore.text("created_at").notNull(),updated_at:sqliteCore.text("updated_at").notNull(),agent_id:sqliteCore.text("agent_id"),source_task_id:sqliteCore.text("source_task_id"),detector_version:sqliteCore.text("detector_version"),content_fingerprint:sqliteCore.text("content_fingerprint"),dismissed_at:sqliteCore.text("dismissed_at")},t=>({sourceCheck:sqliteCore.check("thread_highlights_source_ck",drizzleOrm.sql`${t.source} IN ('auto', 'manual')`),kindCheck:sqliteCore.check("thread_highlights_kind_ck",drizzleOrm.sql`${t.kind} IN ('decision', 'judgment', 'issue', 'result', 'pivot')`),statusCheck:sqliteCore.check("thread_highlights_status_ck",drizzleOrm.sql`${t.status} IN ('active', 'dismissed')`),activeTextCheck:sqliteCore.check("thread_highlights_active_text_ck",drizzleOrm.sql`${t.status} = 'dismissed' OR (${t.text} IS NOT NULL AND length(${t.text}) > 0)`),coversCheck:sqliteCore.check("thread_highlights_covers_ck",drizzleOrm.sql`length(${t.covers_from_task_id}) > 0 AND length(${t.covers_to_task_id}) > 0`),autoKeyCheck:sqliteCore.check("thread_highlights_auto_key_ck",drizzleOrm.sql`${t.source} = 'manual' OR (${t.source} = 'auto' AND ${t.source_task_id} IS NOT NULL AND ${t.detector_version} IS NOT NULL AND ${t.content_fingerprint} IS NOT NULL AND length(${t.source_task_id}) > 0 AND length(${t.detector_version}) > 0 AND length(${t.content_fingerprint}) > 0)`),threadStatusCreatedIndex:sqliteCore.index("idx_thread_highlights_thread_status_created").on(t.thread_id,t.status,t.created_at),threadCoversIndex:sqliteCore.index("idx_thread_highlights_thread_covers").on(t.thread_id,t.covers_from_task_id,t.covers_to_task_id),autoIdempotencyUnique:sqliteCore.uniqueIndex("thread_highlights_auto_idempotency_uq").on(t.thread_id,t.source_task_id,t.detector_version,t.content_fingerprint).where(drizzleOrm.sql`${t.source} = 'auto'`)}));});var ua=v(()=>{h();sqliteCore.sqliteTable("storage_metadata",{source_kind:sqliteCore.text("source_kind").notNull(),source_id:sqliteCore.text("source_id").notNull(),utc_ts:sqliteCore.text("utc_ts"),bytes:sqliteCore.integer("bytes").notNull()},t=>({pk:sqliteCore.primaryKey({columns:[t.source_kind,t.source_id]}),kindTimestampBytesIndex:sqliteCore.index("idx_storage_metadata_kind_ts_bytes").on(t.source_kind,t.utc_ts,t.bytes)})),sqliteCore.sqliteTable("storage_metadata_state",{unit:sqliteCore.text("unit").primaryKey().notNull(),cursor_rowid:sqliteCore.integer("cursor_rowid").notNull().default(0),end_rowid:sqliteCore.integer("end_rowid"),complete:sqliteCore.integer("complete").notNull().default(0),updated_at:sqliteCore.text("updated_at").notNull()});});var ue=v(()=>{h();So();Hn();Ci();yr();Li();Hi();$i();Fi();qi();Gi();zi();Vi();Yi();Xi();Zi();ea();na();Co();da();ua();});var un,qo,Pa,jo=v(()=>{h();un={"claude-fable-5-1":{input:10,cachedInput:.25,output:50},"claude-fable-5":{input:10,cachedInput:1,output:50},"claude-opus-5-5":{input:4,cachedInput:.2,output:20},"claude-opus-5":{input:5,cachedInput:.5,output:25},"claude-opus-4-8":{input:5,cachedInput:.5,output:25},"claude-opus-4-7":{input:5,cachedInput:.5,output:25},"claude-opus-4-6":{input:5,cachedInput:.5,output:25},"claude-sonnet-5":{input:2,cachedInput:.2,output:10},"claude-sonnet-4-6":{input:3,cachedInput:.3,output:15},"claude-haiku-4-5":{input:1,cachedInput:.1,output:5},"gpt-6-astra":{input:10,cachedInput:1,output:50},"gpt-6-sol":{input:2,cachedInput:.2,output:10},"gpt-6-luna":{input:.1,cachedInput:.01,output:.5},"gpt-5.6-sol":{input:4,cachedInput:.4,output:20},"gpt-5.6-terra":{input:2,cachedInput:.2,output:12},"gpt-5.6-luna":{input:.2,cachedInput:.02,output:1.2},"gpt-5.5":{input:5,cachedInput:.5,output:30},"gpt-5.4":{input:2.5,cachedInput:.25,output:15},"gpt-5.4-mini":{input:.75,cachedInput:.075,output:4.5},"gpt-5.3-codex":{input:1.75,cachedInput:.175,output:14},"gpt-5-mini":{input:.4,cachedInput:.1,output:1.6},"gpt-4.1":{input:2,cachedInput:.5,output:8},"gpt-4o":{input:2.5,cachedInput:1.25,output:10},"glm-5.2":{input:1.4,cachedInput:.26,output:4.4},"glm-5.1":{input:1.4,cachedInput:.26,output:4.4},"gemini-3.7-flash":{input:1.5,cachedInput:.15,output:7.5},"gemini-3.6-flash":{input:1.5,cachedInput:.15,output:7.5},"grok-4.7":{input:2,cachedInput:.5,output:6},"grok-4.6":{input:2,cachedInput:.5,output:6},"grok-4.5":{input:2,cachedInput:.3,output:6}},qo=new Set(["gpt-5.3-codex-spark"]),Pa=new Set(["auto","claude-fable-5","claude-fable-5-1","claude-haiku-4-5","claude-opus-4-6-thinking","claude-opus-4-6[1m]","claude-opus-4-7[1m]","claude-opus-4-8[1m]","claude-opus-5","claude-opus-5-5","claude-sonnet-4-6","claude-sonnet-4-6[1m]","claude-sonnet-5","gemini-3.1-pro","gemini-3.5-flash","gemini-3.6-flash","gemini-3.7-flash","gpt-5.3-codex","gpt-5.3-codex-spark","gpt-5.4","gpt-5.4-mini","gpt-5.5","gpt-5.6-luna","gpt-5.6-sol","gpt-5.6-terra","gpt-6-astra","gpt-6-luna","gpt-6-sol","gpt-oss-120b","grok-4.5","grok-4.6","grok-4.7"]);});function Wo(t){let e=t.toLowerCase().trim();e=e.replace(/\[[^\]]*\]$/g,"");let n=e.lastIndexOf("/");return n>=0&&(e=e.slice(n+1)),e=e.replace(/-\d{8}$/,""),e}function Rp(t){if(!t)return console.warn("[pricing] missing model id; cost is being recorded as 0"),qn;let e=Wo(t),n=yp[e];if(n)return Dr[n]??un[n]??qn;if(Dr[e])return Dr[e];if(un[e])return un[e];if(qo.has(e))return console.warn(`[pricing] unpublished model pricing: ${t}, cost_usd=0`),qn;if(Pa.has(e))return console.warn(`[pricing] missing catalog pricing: ${t}, cost_usd=0`),qn;let r={...un,...Dr};for(let o of Object.keys(r))if(e.includes(o))return r[o];return console.warn(`[pricing] Unknown model: ${t}, cost_usd=0`),qn}function Ep(t,e,n,r=0,o){let s=Rp(n),i=Math.min(r,t),c=(t-i)*s.input/1e6,u=i*s.cachedInput/1e6,f=e*s.output/1e6;return c+u+f}function Da(t,e,n,r,o,s){return t&&t>0?t:!e&&!n?0:Ep(e??0,n??0,o,r??0)}var yp,qn,Dr,Lr=v(()=>{h();jo();jo();yp={opus:"claude-opus-4-8",sonnet:"claude-sonnet-4-6",haiku:"claude-haiku-4-5","codex-mini":"gpt-5.3-codex",codex:"gpt-5.3-codex"},qn={input:0,cachedInput:0,output:0},Dr={};});function $a(t){return t instanceof Error?t:t===void 0?void 0:new Error(String(t))}function Ma(t){return typeof t=="object"&&t!==null&&"code"in t?String(t.code):void 0}function Ua(t){return Number.isSafeInteger(t)&&t>0}function vp(t,e){return new Promise(n=>{let r;try{r=child_process.spawn(t,e,{windowsHide:!0});}catch(u){n({status:null,stdout:"",stderr:"",error:$a(u)});return}let o="",s="",i=false,d,c=setTimeout(()=>{try{r.kill();}catch{}d({status:null,stdout:o,stderr:s,error:new Error(`Command timed out after ${La}ms`)});},La);d=u=>{i||(i=true,clearTimeout(c),n(u));},r.stdout?.setEncoding("utf8"),r.stderr?.setEncoding("utf8"),r.stdout?.on("data",u=>{o+=String(u);}),r.stderr?.on("data",u=>{s+=String(u);}),r.once("error",u=>{d({status:null,stdout:o,stderr:s,error:u});}),r.once("close",u=>{d({status:u,stdout:o,stderr:s});});})}async function Fa(t,e,n){return n.runCommandAsync?n.runCommandAsync(t,e):n.runCommand?n.runCommand(t,e):vp(t,e)}function Op(t){return new Promise(e=>{setTimeout(e,Math.max(0,t));})}function Np(){return new Promise(t=>{setImmediate(t);})}function $t(t,e=process.kill){try{return e(t,0),"alive"}catch(n){return Ma(n)==="ESRCH"?"not_found":Ma(n)==="EPERM"?"alive":"unknown"}}function Cp(t,e){let n=$t(-t,e),r=$t(t,e);return n==="alive"||r==="alive"?"alive":n==="unknown"||r==="unknown"?"unknown":"not_found"}async function Ba(t,e,n,r){let o=Math.max(0,n),s=Math.max(1,r.pollIntervalMs??Ip),i=Date.now()+o,d,c=o===0,u=r.sleep?Promise.resolve().then(()=>r.sleep(o)).then(()=>{},()=>{}):new Promise(f=>{d=setTimeout(f,o);});u.then(()=>{c=true;});try{for(await Np();;){let f=Cp(t,e);if(f==="not_found")return f;let p=i-Date.now();if(c||p<=0)return f;await Promise.race([u,Op(Math.min(s,p))]);}}finally{d!==void 0&&clearTimeout(d);}}async function Ha(t,e,n,r,o){let s=await Ba(t,e,o.hardConfirmMs??Ap,{...o,sleep:void 0});return s==="not_found"?n?{status:"not_found",pid:t,method:r}:{status:"terminated",pid:t,method:r}:s==="alive"?{status:"failed",pid:t,method:r,error:"Process is still running after termination attempt"}:{status:"failed",pid:t,method:r,error:"Unable to verify process termination"}}async function zo(t,e,n={}){if(!Ua(t))return "unknown";let r=n.platform??process.platform,o=r==="win32"?"powershell.exe":"ps",s=r==="win32"?["-NoLogo","-NoProfile","-NonInteractive","-ExecutionPolicy","Bypass","-Command",`$p = Get-CimInstance -ClassName Win32_Process -Filter 'ProcessId = ${t}' -ErrorAction Stop; if ($null -ne $p) { [Console]::Write([string]$p.CommandLine) }`]:["-p",String(t),"-o","command="],i;try{i=await Fa(o,s,n);}catch{return "unknown"}if(i.error||i.status!==0)return "unknown";let d=i.stdout.trim();if(!d)return "not_found";let c=r==="win32"?d.toLowerCase():d;return e.filter(f=>f.trim().length>0).some(f=>{let p=r==="win32"?f.toLowerCase():f;return c.includes(p)})?"owned":"not_owned"}async function Ko(t,e={}){let n=e.platform??process.platform,r=n==="win32"?"taskkill":"process-group",o=g=>({status:"failed",pid:t,method:r,error:g});if(!Ua(t))return o("Invalid process ID");let s=e.kill??process.kill,i=$t(t,s);if(i==="not_found")return {status:"not_found",pid:t,method:r};if(i!=="alive")return o("Unable to determine whether the process is alive");if(n==="win32"){let g;try{g=await Fa("taskkill",["/PID",String(t),"/T","/F"],e);}catch(m){g={status:null,stdout:"",stderr:"",error:$a(m)};}let _=$t(t,s);return _==="not_found"?g.status===0&&!g.error?{status:"terminated",pid:t,method:r}:{status:"not_found",pid:t,method:r}:o(_==="alive"?"Process is still running after termination attempt":"Unable to verify process termination")}let d,c=e.signal??"SIGKILL";try{s(-t,c);}catch(g){d=g;}if(c==="SIGKILL")return Ha(t,s,d,r,e);if(await Ba(t,s,e.graceMs??bp,e)==="not_found")return d?{status:"not_found",pid:t,method:r}:{status:"terminated",pid:t,method:r};let f;try{s(-t,"SIGKILL");}catch(g){f=g;}let p=await Ha(t,s,f,r,e);return p.status==="terminated"?p:p.status==="not_found"?d?p:{status:"terminated",pid:t,method:r}:o(p.error??"Process termination failed")}var La,Go,bp,Ip,Ap,Vo=v(()=>{h();La=3e3,Go="SIGINT",bp=2e3,Ip=25,Ap=100;});function za(t,e){let n=e===void 0?"":` at index ${e}`;if(!t||typeof t!="object")throw new exports.RepositoryError("VALIDATION",`Task log entry${n} must be an object`);if(typeof t.timestamp!="string"||typeof t.level!="string"||typeof t.message!="string")throw new exports.RepositoryError("VALIDATION",`Task log entry${n} must contain string timestamp, level, and message fields`);return {timestamp:t.timestamp,level:t.level,message:t.message}}function Wa(t,e){if(e===null||e.trim()==="")return [];let n;try{n=JSON.parse(e);}catch(r){throw new exports.RepositoryError("DB_ERROR",`Malformed legacy task logs: ${t}`,r)}if(!Array.isArray(n))throw new exports.RepositoryError("DB_ERROR",`Malformed legacy task logs: ${t} (expected an array)`);try{return n.map((r,o)=>za(r,o))}catch(r){throw r instanceof exports.RepositoryError?new exports.RepositoryError("DB_ERROR",`Malformed legacy task logs: ${t}`,r):r}}function Ka(t){if(t.log_storage!=="blob"&&t.log_storage!=="events")throw new exports.RepositoryError("DB_ERROR",`Invalid task log storage for task: ${t.id}`);if(!Number.isInteger(t.last_log_seq)||t.last_log_seq<0)throw new exports.RepositoryError("DB_ERROR",`Invalid task log sequence for task: ${t.id}`);if(!Number.isInteger(t.log_revision)||t.log_revision<0)throw new exports.RepositoryError("DB_ERROR",`Invalid task log revision for task: ${t.id}`);return t.log_storage}function Ga(t){return {taskId:t.id,source:Ka(t),revision:t.log_revision,lastSeq:t.last_log_seq}}function Hp(t){if(!Number.isInteger(t)||t<0)throw new exports.RepositoryError("VALIDATION","Task log tail limit must be a non-negative integer")}exports.TaskLogRepository=void 0;var Mr=v(()=>{h();se();fe();ce();pe();ue();exports.TaskLogRepository=class extends exports.BaseSqliteRepository{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=Se.join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?Ke(this.dbPath):super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=Se.dirname(n);Oa.existsSync(o)||Oa.mkdirSync(o,{recursive:true});}else if(!Oa.existsSync(n))throw new exports.RepositoryError("NOT_FOUND","Database not found");let r=C(n);if(e)try{V(r.db,n);}catch(o){throw r.close(),o}return r}findStateRow(e,n){return e.db.select({id:exports.tasks.id,log_storage:exports.tasks.log_storage,last_log_seq:exports.tasks.last_log_seq,log_revision:exports.tasks.log_revision,logs:exports.tasks.logs}).from(exports.tasks).where(drizzleOrm.eq(exports.tasks.id,n)).limit(1).get()}findStateRowInTransaction(e,n){return e.select({id:exports.tasks.id,log_storage:exports.tasks.log_storage,last_log_seq:exports.tasks.last_log_seq,log_revision:exports.tasks.log_revision,logs:exports.tasks.logs}).from(exports.tasks).where(drizzleOrm.eq(exports.tasks.id,n)).limit(1).get()}requireStateRowInTransaction(e,n){let r=this.findStateRowInTransaction(e,n);if(!r)throw new exports.RepositoryError("NOT_FOUND",`Task not found: ${n}`);return r}appendLog(e,n){return this.appendLogs(e,[n])}appendLogs(e,n){let r=n.map((s,i)=>za(s,i));if(r.length===0){let s=this.getLogState(e);if(!s)throw new exports.RepositoryError("NOT_FOUND",`Task not found: ${e}`);return s}let o=this.openHandle(true);try{return o.db.transaction(i=>{let d=this.requireStateRowInTransaction(i,e),c=Ka(d);if(c==="blob"){let g=Wa(e,d.logs);if(i.update(exports.tasks).set({logs:JSON.stringify([...g,...r]),log_revision:drizzleOrm.sql`${exports.tasks.log_revision} + 1`}).where(drizzleOrm.eq(exports.tasks.id,e)).run().changes!==1)throw new exports.RepositoryError("NOT_FOUND",`Task not found: ${e}`);return {taskId:e,source:c,revision:d.log_revision+1,lastSeq:d.last_log_seq}}let u=d.last_log_seq+1,f=d.last_log_seq+r.length;if(i.insert(ct).values(r.map((g,_)=>({task_id:e,seq:u+_,timestamp:g.timestamp,level:g.level,message:g.message}))).run(),i.update(exports.tasks).set({last_log_seq:f,log_revision:drizzleOrm.sql`${exports.tasks.log_revision} + 1`}).where(drizzleOrm.eq(exports.tasks.id,e)).run().changes!==1)throw new exports.RepositoryError("NOT_FOUND",`Task not found: ${e}`);return {taskId:e,source:c,revision:d.log_revision+1,lastSeq:f}},{behavior:"immediate"})}catch(s){throw s instanceof exports.RepositoryError?s:new exports.RepositoryError("DB_ERROR","Failed to append task log",s)}finally{o.close();}}getLogState(e){if(!this.dbExists())return;let n=this.openHandle(false);try{let r=this.findStateRow(n,e);return r?Ga(r):void 0}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to read task log state",r)}finally{n.close();}}readLogs(e){return this.readLogsInternal(e)}readLogsTail(e,n){return Hp(n),this.readLogsInternal(e,n)}readTail(e,n){return this.readLogsTail(e,n)}readLogsInternal(e,n){if(!this.dbExists())return;let r=this.openHandle(false);try{return r.db.transaction(o=>{let s=this.findStateRowInTransaction(o,e);if(!s)return;let i=Ga(s);if(i.source==="blob"){let f=Wa(e,s.logs);return {...i,entries:n===void 0?f:f.slice(Math.max(0,f.length-n))}}let d=o.select({seq:ct.seq,timestamp:ct.timestamp,level:ct.level,message:ct.message}).from(ct).where(drizzleOrm.eq(ct.task_id,e)).orderBy(n===void 0?drizzleOrm.asc(ct.seq):drizzleOrm.desc(ct.seq)),u=(n===void 0?d.all():d.limit(n).all()).map(({timestamp:f,level:p,message:g})=>({timestamp:f,level:p,message:g}));return n!==void 0&&u.reverse(),{...i,entries:u}},{behavior:"deferred"})}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to read task logs",o)}finally{r.close();}}};});var Va=v(()=>{h();});var ne,Ft=v(()=>{h();ne=class extends Error{constructor(n,r,o){super(n);this.providerStr=r;this.name="ProviderError",this.code=o?.code??"UNKNOWN",this.kind=o?.kind??(this.code==="UNKNOWN"?"transient":void 0),this.retryAfterMs=o?.retryAfterMs;}providerStr;code;kind;retryAfterMs;stdout};});var Bt,Jo=v(()=>{h();Ft();Bt=class extends ne{name="RateLimitError";constructor(e,n="cli/claude"){super(e,n,{code:"QUOTA_EXHAUSTED",kind:"transient"});}};});function Xo(t){if(!Hr(t)||t.type!=="item.started"||!Ya(t)||!Ja(t))return false;let e=t.item;return !Hr(e)||!Ya(e)||!Ja(e)||!Yo(e.id)?false:e.type==="web_search"?e.query===""&&Hr(e.action)&&e.action.type==="other":e.type==="file_change"?e.status!=="in_progress"||!Array.isArray(e.changes)||e.changes.length===0?false:e.changes.every(n=>Hr(n)&&Yo(n.path)&&Yo(n.kind)):false}function Hr(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Xa(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function Yo(t){return typeof t=="string"&&t.trim().length>0}function Ja(t){return !Xa(t,"status")||t.status==="in_progress"}function Ya(t){for(let e of ["error","errors","isError","is_error"])if(Xa(t,e))return false;return true}var Qo=v(()=>{h();});function $p(t,e){let n=t.trimStart();if(!n.startsWith("{"))return false;let r;try{r=JSON.parse(n);}catch{return false}let o=r.type;if(typeof o!="string")return false;let s=e?zp[e]:void 0;return s?s(r,o):Object.values(Za).some(i=>i(r,o))}function ln(t,e){let n=t.split(`
|
|
33
|
+
`).filter(r=>r.trim());return n.length===0?false:n.every(r=>$p(r,e))}function Ue(t){return typeof t=="object"&&t!==null}function Qa(t,e){if(e==="assistant"||e==="user"){let n=t.message;return Ue(n)&&Array.isArray(n.content)}return e==="system"?typeof t.subtype=="string"||typeof t.session_id=="string":e==="result"?typeof t.result=="string"||Ue(t.usage)||typeof t.total_cost_usd=="number"||typeof t.is_error=="boolean":e==="rate_limit_event"?Ue(t.rate_limit_info):e==="tool_progress"?t.heartbeat===true&&typeof t.tool_use_id=="string":false}function Up(t,e){return typeof t.session_id=="string"||typeof t.uuid=="string"?true:Qa(t,e)}function Fp(t,e){if(e==="error")return typeof t.message=="string"||typeof t.errorMessage=="string"||typeof t.error=="string"||Ue(t.error);if(e==="item.updated"||e.startsWith("thread.")||e.startsWith("turn."))return true;if(e==="item.started"||e==="item.completed"){let n=t.item;return Ue(n)&&typeof n.type=="string"}return false}function Bp(t,e){return e==="step_start"||e==="step_finish"?typeof t.stepID=="string"||typeof t.sessionID=="string"||Ue(t.part):e==="text"||e==="tool_use"?Ue(t.part):e==="result"?typeof t.result=="string":false}function qp(t,e){return !!(typeof t.stepID=="string"||typeof t.sessionID=="string"||Ue(t.part)||e==="result"&&typeof t.result=="string")}function jp(t,e){return e.startsWith("assistant.")||e.startsWith("tool.execution")||e==="user.message"?Ue(t.data):e==="result"?typeof t.result=="string":false}function Wp(t,e){return e==="message"?typeof t.role=="string":e==="tool_use"?typeof t.tool_name=="string"||typeof t.tool_id=="string":e==="tool_result"?typeof t.tool_id=="string"||typeof t.status=="string":false}function Gp(t,e){return e==="available_commands"?Ue(t.tools)||Ue(t.commands):e==="usage"?Ue(t.usage):e==="end"?typeof t.sessionId=="string"||typeof t.stopReason=="string"||Ue(t.usage):e==="tool_call_update"?typeof t.toolCallId=="string"||typeof t.status=="string":false}var Za,zp,$r=v(()=>{h();Qo();Za={claude:Qa,codex:Fp,opencode:Bp,copilot:jp,gemini:Wp},zp={...Za,claude:Up,opencode:qp,grok:Gp,antigravity:()=>false};});function gt(t){return /crewx\s+(q|query|x|execute)\s/.test(t)}function ht(t,e,n){let r=e.match(/@(\S+)/);return {timestamp:t,type:"agent_call",targetAgent:r?.[1]?.replace(/["']/g,""),toolInput:e,...typeof n=="string"&&n.length>0?{toolUseId:n}:{}}}var pn=v(()=>{h();});function Jp(t){let e=Yp(t),n=e.map((s,i)=>({line:s,index:i})).filter(({line:s})=>Qp(s.value)),r=Xp(e);return {result:n.length===1&&n[0].index===r?Zp(n[0].line.value):null,resultPreview:nf(e,n),hasReservedLine:n.length>0}}function Ze(t,e){let n=Jp(t);return {resultPreview:n.resultPreview,isError:e||n.result?.isError===true,...n.hasReservedLine?{delegationResult:n.result}:{}}}function Yp(t){let e=[],n=0;for(let r=0;r<t.length;r++){let o=t[r];if(o!==`
|
|
28
34
|
`&&o!=="\r")continue;let s=o==="\r"&&t[r+1]===`
|
|
29
35
|
`?`\r
|
|
30
|
-
`:o;e.push({value:t.slice(n,r),separator:s}),r+=s.length-1,n=r+1;}return e.push({value:t.slice(n),separator:""}),e}function Wp(t){for(let e=t.length-1;e>=0;e--)if(t[e].value.trim())return e;return -1}function Gp(t){return t.trimStart().startsWith(Fp)}function zp(t){let e=t.trim();if(!e.startsWith(Ja)||!e.endsWith("]]"))return null;let n=e.slice(Ja.length,-2);if(!n)return null;try{return Kp(JSON.parse(n))}catch{return null}}function Kp(t){return Vp(t)?Object.prototype.hasOwnProperty.call(t,"taskId")?{schema:1,taskId:t.taskId,agentId:t.agentId,isError:t.isError}:{schema:1,isError:true}:null}function Vp(t){if(!Yp(t)||Object.keys(t).some(r=>!Bp.has(r))||t.schema!==1||typeof t.isError!="boolean")return false;let e=Object.prototype.hasOwnProperty.call(t,"taskId"),n=Object.prototype.hasOwnProperty.call(t,"agentId");return e!==n?false:e?Ya(t.taskId)&&Ya(t.agentId):t.isError===true}function Jp(t,e){if(e.length===0)return t.map(r=>r.value+r.separator).join("");let n=new Set(e.map(({index:r})=>r));return t.map((r,o)=>n.has(o)?"":r.value+r.separator).join("")}function Ya(t){return typeof t=="string"&&t.trim().length>0}function Yp(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Ja,Fp,Bp,cn=v(()=>{h();Ja="[[crewx:delegation-result ",Fp="[[crewx:delegation-result",Bp=new Set(["schema","taskId","agentId","isError"]);});function Qe(t){if(typeof t=="string")return t;if(!t||typeof t!="object")return JSON.stringify(t??{});let e=t;return typeof e.command=="string"?e.command:typeof e.file_path=="string"?e.file_path:typeof e.filePath=="string"?e.filePath:typeof e.path=="string"?e.path:typeof e.query=="string"?e.query:typeof e.pattern=="string"?e.pattern:typeof e.url=="string"?e.url:typeof e.prompt=="string"?e.prompt.length>200?e.prompt.slice(0,200)+"\u2026":e.prompt:typeof e.description=="string"?e.description:JSON.stringify(e)}var un=v(()=>{h();});var Xa,Lr,Jo,Mr=v(()=>{h();Xa=["none","minimal","low","medium","high","xhigh","max","ultra"],Lr={claude:["low","medium","high","xhigh","max"],codex:["none","minimal","low","medium","high","xhigh","max","ultra"],opencode:[],copilot:["none","low","medium","high","xhigh","max"],antigravity:["low","medium","high"],grok:["low","medium","high","xhigh"]},Jo={claude:{models:[{id:"claude-fable-5-1",name:"Claude Fable 5.1",contextWindowTokens:1e6,tier:"flagship",recommended:true},{id:"claude-fable-5",name:"Claude Fable 5",contextWindowTokens:1e6,tier:"flagship"},{id:"claude-opus-5-5",name:"Claude Opus 5.5",contextWindowTokens:1e6,tier:"flagship",recommended:true},{id:"claude-opus-5",name:"Claude Opus 5",contextWindowTokens:1e6,tier:"flagship"},{id:"claude-sonnet-5",name:"Claude Sonnet 5",contextWindowTokens:1e6,tier:"balanced",recommended:true},{id:"claude-opus-4-8[1m]",name:"Claude Opus 4.8",contextWindowTokens:1e6,tier:"flagship"},{id:"claude-opus-4-7[1m]",name:"Claude Opus 4.7",contextWindowTokens:1e6,tier:"flagship"},{id:"claude-opus-4-6[1m]",name:"Claude Opus 4.6",contextWindowTokens:1e6,tier:"flagship"},{id:"claude-sonnet-4-6[1m]",name:"Claude Sonnet 4.6",contextWindowTokens:1e6,tier:"balanced"},{id:"claude-haiku-4-5",name:"Claude Haiku 4.5",contextWindowTokens:2e5,tier:"speed"}],modes:[{id:"default",name:"Default",description:"Uses Claude's default permission handling with normal approval prompts."},{id:"acceptEdits",name:"Accept Edits",description:"Allows file edits without approval; other permission checks remain in place."},{id:"plan",name:"Plan",description:"Keeps Claude in plan mode so it can inspect and propose changes without applying them."},{id:"dontAsk",name:"Don't Ask",description:"Does not ask for permissions; only pre-approved tool actions can proceed."},{id:"bypassPermissions",name:"Bypass Permissions",description:"Bypasses Claude permission checks so tools can run without approval prompts."}],effort:["low","medium","high"],modelOverrides:{"claude-fable-5-1":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-fable-5":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-opus-5-5":{effort:["low","medium","high","xhigh","max"],defaultEffort:"medium"},"claude-opus-5":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-sonnet-5":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-opus-4-8[1m]":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-opus-4-7[1m]":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-opus-4-6[1m]":{effort:["low","medium","high","max"],defaultEffort:"high"},"claude-sonnet-4-6[1m]":{effort:["low","medium","high","max"],defaultEffort:"high"},"claude-haiku-4-5":{effort:[]}},providerOptions:[]},codex:{models:[{id:"gpt-6-astra",name:"GPT-6 Astra",contextWindowTokens:105e4,tier:"flagship"},{id:"gpt-6-sol",name:"GPT-6 Sol",contextWindowTokens:105e4,tier:"balanced",recommended:true},{id:"gpt-6-luna",name:"GPT-6 Luna",contextWindowTokens:105e4,tier:"speed",recommended:true},{id:"gpt-5.6-sol",name:"GPT-5.6 Sol",contextWindowTokens:105e4,tier:"flagship"},{id:"gpt-5.6-terra",name:"GPT-5.6 Terra",contextWindowTokens:105e4,tier:"balanced"},{id:"gpt-5.6-luna",name:"GPT-5.6 Luna",contextWindowTokens:105e4,tier:"speed"},{id:"gpt-5.5",name:"GPT-5.5",contextWindowTokens:105e4,tier:"flagship"},{id:"gpt-5.4",name:"GPT-5.4",contextWindowTokens:105e4,tier:"flagship"},{id:"gpt-5.4-mini",name:"GPT-5.4 Mini",contextWindowTokens:4e5,tier:"speed"},{id:"gpt-5.3-codex",name:"GPT-5.3 Codex",contextWindowTokens:4e5,tier:"flagship"},{id:"gpt-5.3-codex-spark",name:"GPT-5.3 Codex Spark",contextWindowTokens:128e3,tier:"speed"}],modes:[{id:"agent",name:"Agent",description:"Uses the workspace-write sandbox; can read and modify workspace files without full machine access."},{id:"read-only",name:"Read Only",description:"Uses the read-only sandbox; can inspect files but cannot write to the workspace."},{id:"plan",name:"Plan",description:"Uses the read-only sandbox for planning and inspection; cannot write to the workspace."},{id:"agent-full-access",name:"Agent Full Access",description:"Bypasses approvals and the sandbox; can access and modify files beyond the workspace."},{id:"yolo",name:"YOLO",description:"Bypasses approvals and the sandbox for unrestricted execution and full filesystem access."}],effort:["minimal","low","medium","high"],modelOverrides:{"gpt-6-astra":{effort:["low","medium","high","xhigh","max"],defaultEffort:"xhigh"},"gpt-6-sol":{effort:["none","low","medium","high","xhigh","max"],defaultEffort:"medium"},"gpt-6-luna":{effort:["none","low","medium","high","xhigh","max"],defaultEffort:"medium"},"gpt-5.6-sol":{effort:["low","medium","high","xhigh","max","ultra"],defaultEffort:"xhigh"},"gpt-5.6-terra":{effort:["low","medium","high","xhigh","max","ultra"],defaultEffort:"high"},"gpt-5.6-luna":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"gpt-5.5":{effort:["low","medium","high","xhigh"],defaultEffort:"high"}},providerOptions:[]},opencode:{models:[],modes:[{id:"plan",name:"Plan",description:"Uses the plan agent without --auto; planning follows standard approval behavior."},{id:"plan-auto",name:"Plan \xB7 Auto",description:"Uses the plan agent with --auto; planning uses automatic approvals."},{id:"build",name:"Build",description:"Uses the build agent without --auto; work follows standard approval behavior."},{id:"build-auto",name:"Build \xB7 Auto",description:"Uses the build agent with --auto; work uses automatic approvals."}],effort:[],modelOverrides:{},providerOptions:[]},copilot:{models:[{id:"auto",name:"Auto"},{id:"claude-sonnet-5",name:"Claude Sonnet 5",contextWindowTokens:1e6,tier:"balanced"},{id:"claude-sonnet-4-6",name:"Claude Sonnet 4.6",contextWindowTokens:1e6,tier:"balanced"},{id:"gpt-5.5",name:"GPT-5.5",contextWindowTokens:105e4,tier:"flagship"},{id:"gpt-5.4",name:"GPT-5.4",contextWindowTokens:105e4,tier:"flagship"},{id:"gemini-3.1-pro",name:"Gemini 3.1 Pro",contextWindowTokens:1048576,tier:"flagship"}],modes:[{id:"interactive",name:"Interactive",description:"Passes --mode interactive; tool access follows Copilot's interactive mode behavior."},{id:"plan",name:"Plan",description:"Passes --mode plan; planning and permission behavior follow Copilot's plan mode."},{id:"autopilot",name:"Autopilot",description:"Passes --mode autopilot; execution behavior follows Copilot's autonomous mode."}],effort:["none","low","medium","high","xhigh","max"],modelOverrides:{},providerOptions:[]},antigravity:{models:[{id:"gemini-3.7-flash",name:"Gemini 3.7 Flash",contextWindowTokens:1048576,tier:"balanced"},{id:"gemini-3.6-flash",name:"Gemini 3.6 Flash",contextWindowTokens:1048576,tier:"balanced"},{id:"gemini-3.5-flash",name:"Gemini 3.5 Flash",contextWindowTokens:1048576,tier:"balanced"},{id:"gemini-3.1-pro",name:"Gemini 3.1 Pro",contextWindowTokens:1048576,tier:"flagship"},{id:"claude-sonnet-4-6",name:"Claude Sonnet 4.6",contextWindowTokens:1e6,tier:"balanced"},{id:"claude-opus-4-6-thinking",name:"Claude Opus 4.6 Thinking",contextWindowTokens:1e6,tier:"flagship"},{id:"gpt-oss-120b",name:"GPT-OSS 120B",contextWindowTokens:128e3,tier:"balanced"}],modes:[{id:"default",name:"Default",description:"Uses Antigravity's default permission handling. No extra permission flags are passed."},{id:"plan",name:"Plan",description:"Passes --mode plan. This turns on /plan; it is not a Claude-style permission mode."},{id:"acceptEdits",name:"Accept Edits",description:"Passes --mode accept-edits."},{id:"bypassPermissions",name:"Bypass Permissions",description:"Passes --dangerously-skip-permissions so tools can run without approval prompts."}],effort:["low","medium","high"],modelOverrides:{"gemini-3.7-flash":{effort:["low","medium","high"],defaultEffort:"medium"},"gemini-3.6-flash":{effort:["low","medium","high"],defaultEffort:"medium"},"gemini-3.5-flash":{effort:["low","medium","high"],defaultEffort:"medium"},"gemini-3.1-pro":{effort:["low","high"],defaultEffort:"high"},"claude-sonnet-4-6":{effort:[]},"claude-opus-4-6-thinking":{effort:[]},"gpt-oss-120b":{effort:["medium"],defaultEffort:"medium"}},providerOptions:[]},grok:{models:[{id:"grok-4.7",name:"Grok 4.7",contextWindowTokens:5e5,tier:"flagship",recommended:true},{id:"grok-4.6",name:"Grok 4.6",contextWindowTokens:5e5,tier:"flagship"},{id:"grok-4.5",name:"Grok 4.5",contextWindowTokens:5e5,tier:"flagship"}],modes:[{id:"default",name:"Default",description:"Uses Grok's default permission handling."},{id:"acceptEdits",name:"Accept Edits",description:"Allows file edits without changing the selected sandbox profile."},{id:"auto",name:"Auto",description:"Uses Grok automatic permission handling."},{id:"dontAsk",name:"Don't Ask",description:"Does not ask for permission before tool execution."},{id:"bypassPermissions",name:"Bypass Permissions",description:"Bypasses Grok permission checks for tool execution."},{id:"plan",name:"Plan",description:"Keeps Grok in planning mode without applying changes."}],effort:["low","medium","high"],modelOverrides:{"grok-4.7":{effort:["low","medium","high","xhigh"],defaultEffort:"high"},"grok-4.6":{effort:["low","medium","high","xhigh"],defaultEffort:"high"},"grok-4.5":{effort:["low","medium","high"],defaultEffort:"high"}},providerOptions:[{key:"alwaysApprove",type:"boolean"},{key:"sandbox",type:"enum",values:["workspace","read-only","off"]}]}},Object.fromEntries(Object.entries(Jo).map(([t,e])=>[t,e.models]));});function Yo(t){return Qp[t]??t}function ef(t){return Zp.get(t)??t}function Xo(t){if(!t)return {};let e=nf.get(t);return e?{...e}:{model:t}}function Qo(t,e){return t==="antigravity"||t==="cli/antigravity"?Xo(e):e===void 0?{}:{model:ef(e)}}var Xp,Qp,Zp,tf,nf,Fn=v(()=>{h();Xp=[{baseModelId:"claude-opus-4-8",catalogModelId:"claude-opus-4-8[1m]"},{baseModelId:"claude-opus-4-7",catalogModelId:"claude-opus-4-7[1m]"},{baseModelId:"claude-opus-4-6",catalogModelId:"claude-opus-4-6[1m]"},{baseModelId:"claude-sonnet-4-6",catalogModelId:"claude-sonnet-4-6[1m]"}],Qp={"accept-edits":"acceptEdits",yolo:"bypassPermissions","agent-full-access":"bypassPermissions"};Zp=new Map(Xp.map(({baseModelId:t,catalogModelId:e})=>[t,e]));tf=[{legacyId:"Gemini 3.7 Flash (High)",model:"gemini-3.7-flash",effort:"high"},{legacyId:"Gemini 3.7 Flash (Medium)",model:"gemini-3.7-flash",effort:"medium"},{legacyId:"Gemini 3.7 Flash (Low)",model:"gemini-3.7-flash",effort:"low"},{legacyId:"Gemini 3.6 Flash (High)",model:"gemini-3.6-flash",effort:"high"},{legacyId:"Gemini 3.6 Flash (Medium)",model:"gemini-3.6-flash",effort:"medium"},{legacyId:"Gemini 3.6 Flash (Low)",model:"gemini-3.6-flash",effort:"low"},{legacyId:"Gemini 3.5 Flash (Medium)",model:"gemini-3.5-flash",effort:"medium"},{legacyId:"Gemini 3.5 Flash (High)",model:"gemini-3.5-flash",effort:"high"},{legacyId:"Gemini 3.5 Flash (Low)",model:"gemini-3.5-flash",effort:"low"},{legacyId:"Gemini 3.1 Pro (Low)",model:"gemini-3.1-pro",effort:"low"},{legacyId:"Gemini 3.1 Pro (High)",model:"gemini-3.1-pro",effort:"high"},{legacyId:"Claude Sonnet 4.6 (Thinking)",model:"claude-sonnet-4-6"},{legacyId:"Claude Opus 4.6 (Thinking)",model:"claude-opus-4-6-thinking"},{legacyId:"GPT-OSS 120B (Medium)",model:"gpt-oss-120b",effort:"medium"},{legacyId:"gemini-3.7-flash-high",model:"gemini-3.7-flash",effort:"high"},{legacyId:"gemini-3.7-flash-medium",model:"gemini-3.7-flash",effort:"medium"},{legacyId:"gemini-3.7-flash-low",model:"gemini-3.7-flash",effort:"low"},{legacyId:"gemini-3.6-flash-high",model:"gemini-3.6-flash",effort:"high"},{legacyId:"gemini-3.6-flash-medium",model:"gemini-3.6-flash",effort:"medium"},{legacyId:"gemini-3.6-flash-low",model:"gemini-3.6-flash",effort:"low"},{legacyId:"gemini-3.5-flash-high",model:"gemini-3.5-flash",effort:"high"},{legacyId:"gemini-3.5-flash-medium",model:"gemini-3.5-flash",effort:"medium"},{legacyId:"gemini-3.5-flash-low",model:"gemini-3.5-flash",effort:"low"},{legacyId:"gemini-3.1-pro-high",model:"gemini-3.1-pro",effort:"high"},{legacyId:"gemini-3.1-pro-low",model:"gemini-3.1-pro",effort:"low"},{legacyId:"gpt-oss-120b-medium",model:"gpt-oss-120b",effort:"medium"}],nf=new Map(tf.map(({legacyId:t,model:e,effort:n})=>[t,n===void 0?{model:e}:{model:e,effort:n}]));});function of(){return {models:[],modes:[],effort:[],modelOverrides:{},providerOptions:[]}}function bt(t){return Hr(t).models}function Hr(t){return rf[t]??Jo[t]??of()}function Bn(t,e){let n=Hr(t);if(e){if(Object.prototype.hasOwnProperty.call(n.modelOverrides,e))return n.modelOverrides[e]?.effort??n.effort;let r=Qo(t,e);return r.model===void 0?n.effort:n.modelOverrides[r.model]?.effort??n.effort}return n.effort}function Qa(t){return Hr(t).modelOverrides}function Za(){return bt("claude")}function ed(){return bt("codex")}function td(){return bt("copilot")}function nd(){return bt("antigravity")}var rf,$t=v(()=>{h();Mr();Cr();Fn();rf={};});function rd(t){return sf[t]??t}var sf,od=v(()=>{h();$t();Fn();sf={auto:"default"};});function Ur(t,e){return (Lr[t]??[]).includes(e)}function It(t){if(!t)return {};let e=t.match(/^(.+?)\[([^\]]+)\]$/);if(e){let n=e[2].toLowerCase();return af.has(n)?{model:e[1],effort:n}:{model:t}}return {model:t}}function sd(t){switch(t){case "agent-full-access":case "yolo":return ["--dangerously-bypass-approvals-and-sandbox"];case "read-only":case "plan":return ["--sandbox","read-only"];case "agent":return ["--sandbox","workspace-write"];default:return []}}function id(t){switch(t){case "agent-full-access":case "yolo":return ["--dangerously-bypass-approvals-and-sandbox"];case "read-only":case "plan":return ["-c","sandbox_mode=read-only"];case "agent":return ["-c","sandbox_mode=workspace-write"];default:return []}}function ad(t){return !t||!Ur("codex",t)?[]:["-c",`model_reasoning_effort=${t}`]}function dd(t){if(!t)return [];let e=new Set(["acceptEdits","bypassPermissions","default","delegate","dontAsk","plan"]),n=rd(t);return e.has(n)?["--permission-mode",n]:[]}function cd(t){return t?Ur("claude",t)?["--effort",t]:[]:[]}function ud(t){return t==="default"?[]:t&&df.has(t)?["--permission-mode",t]:[]}function ld(t){return t===true?["--always-approve"]:[]}function pd(t,e=n=>console.warn(n)){return t===void 0?[]:t==="workspace"||t==="read-only"||t==="off"?["--sandbox",t]:(e(`[grok] Invalid sandbox value ${JSON.stringify(t)}; using workspace.`),["--sandbox","workspace"])}function fd(t){return t?Ur("grok",t)?["--effort",t]:[]:[]}function gd(t){if(!t)return [];switch(Yo(t)){case "default":return [];case "plan":return ["--mode","plan"];case "acceptEdits":return ["--mode","accept-edits"];case "bypassPermissions":return ["--dangerously-skip-permissions"];default:return []}}function hd(t){return t?Ur("antigravity",t)?["--effort",t]:[]:[]}var af,df,qn=v(()=>{h();od();Fn();Mr();af=new Set(Xa);df=new Set(["default","acceptEdits","auto","dontAsk","bypassPermissions","plan"]);});function cf(t){if(t.type!=="usage"||!("input_tokens"in t))return null;let e=Number(t.input_tokens??0),n=Number(t.output_tokens??0),o="cache_read_input_tokens"in t?Number(t.cache_read_input_tokens):void 0,s="cached_input_tokens"in t?Number(t.cached_input_tokens):void 0,i=o!==void 0?o:s??0;return {inputTokens:o!==void 0?e+o:e,outputTokens:n,cachedInputTokens:i}}function uf(t){let e=t.usage;if(!e||typeof e!="object"||Array.isArray(e))return null;let n=e;if(!("input_tokens"in n))return null;let r=Number(n.input_tokens??0),o=Number(n.output_tokens??0),i="cache_read_input_tokens"in n?Number(n.cache_read_input_tokens):void 0,d="cached_input_tokens"in n?Number(n.cached_input_tokens):void 0,c=i!==void 0?i:d??0;return {inputTokens:i!==void 0?r+i:r,outputTokens:o,cachedInputTokens:c}}function lf(t){if(t.type!=="step_finish")return null;let n=t.part?.tokens;if(!n)return null;let r=Number(n.input??0),o=Number(n.output??0),s=n.cache,i=s?Number(s.read??0):0;return {inputTokens:r+i,outputTokens:o,cachedInputTokens:i}}function _d(t){let e=new Map,n;for(let s of t.split(`
|
|
31
|
-
`))if(s.trim())try{let i=JSON.parse(s);if(i.type!=="assistant")continue;let d=i.message,c=d?.id,u=d?.usage;if(typeof c!="string"||!u)continue;let f=Number(u.input_tokens??0),p=Number(u.cache_read_input_tokens??0);e.set(c,{inputTokens:f+p,cachedInputTokens:p});let g=d?.model;typeof g=="string"&&g&&(n=g);}catch{}if(e.size===0)return;let r=0,o=0;for(let s of e.values())r+=s.inputTokens,o+=s.cachedInputTokens;return {inputTokens:r,cachedInputTokens:o,model:n}}function
|
|
32
|
-
`))if(r.trim())try{let o=JSON.parse(r),s=
|
|
33
|
-
`).filter(o=>o.trim()),n=[],r=null;for(let o of e)try{let s=JSON.parse(o);if(s.type==="assistant"&&Array.isArray(s.message?.content))for(let i of s.message.content)i.type==="text"&&typeof i.text=="string"&&i.text.trim()&&n.push(i.text.trim());s.type==="result"&&typeof s.result=="string"&&(r=s.result);}catch{}if(n.length>0)return n[n.length-1];if(r)return r}function
|
|
34
|
-
`).filter(n=>n.trim());for(let n of e.reverse())try{let r=JSON.parse(n);if(typeof r=="object"&&r!==null&&r.type==="result")return r}catch{}}function
|
|
36
|
+
`:o;e.push({value:t.slice(n,r),separator:s}),r+=s.length-1,n=r+1;}return e.push({value:t.slice(n),separator:""}),e}function Xp(t){for(let e=t.length-1;e>=0;e--)if(t[e].value.trim())return e;return -1}function Qp(t){return t.trimStart().startsWith(Kp)}function Zp(t){let e=t.trim();if(!e.startsWith(ed)||!e.endsWith("]]"))return null;let n=e.slice(ed.length,-2);if(!n)return null;try{return ef(JSON.parse(n))}catch{return null}}function ef(t){return tf(t)?Object.prototype.hasOwnProperty.call(t,"taskId")?{schema:1,taskId:t.taskId,agentId:t.agentId,isError:t.isError}:{schema:1,isError:true}:null}function tf(t){if(!rf(t)||Object.keys(t).some(r=>!Vp.has(r))||t.schema!==1||typeof t.isError!="boolean")return false;let e=Object.prototype.hasOwnProperty.call(t,"taskId"),n=Object.prototype.hasOwnProperty.call(t,"agentId");return e!==n?false:e?td(t.taskId)&&td(t.agentId):t.isError===true}function nf(t,e){if(e.length===0)return t.map(r=>r.value+r.separator).join("");let n=new Set(e.map(({index:r})=>r));return t.map((r,o)=>n.has(o)?"":r.value+r.separator).join("")}function td(t){return typeof t=="string"&&t.trim().length>0}function rf(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var ed,Kp,Vp,fn=v(()=>{h();ed="[[crewx:delegation-result ",Kp="[[crewx:delegation-result",Vp=new Set(["schema","taskId","agentId","isError"]);});function et(t){if(typeof t=="string")return t;if(!t||typeof t!="object")return JSON.stringify(t??{});let e=t;return typeof e.command=="string"?e.command:typeof e.file_path=="string"?e.file_path:typeof e.filePath=="string"?e.filePath:typeof e.path=="string"?e.path:typeof e.query=="string"?e.query:typeof e.pattern=="string"?e.pattern:typeof e.url=="string"?e.url:typeof e.prompt=="string"?e.prompt.length>200?e.prompt.slice(0,200)+"\u2026":e.prompt:typeof e.description=="string"?e.description:JSON.stringify(e)}var gn=v(()=>{h();});var nd,Ur,Zo,Fr=v(()=>{h();nd=["none","minimal","low","medium","high","xhigh","max","ultra"],Ur={claude:["low","medium","high","xhigh","max"],codex:["none","minimal","low","medium","high","xhigh","max","ultra"],opencode:[],copilot:["none","low","medium","high","xhigh","max"],antigravity:["low","medium","high"],grok:["low","medium","high","xhigh"]},Zo={claude:{models:[{id:"claude-fable-5-1",name:"Claude Fable 5.1",contextWindowTokens:1e6,tier:"flagship",recommended:true},{id:"claude-fable-5",name:"Claude Fable 5",contextWindowTokens:1e6,tier:"flagship"},{id:"claude-opus-5-5",name:"Claude Opus 5.5",contextWindowTokens:1e6,tier:"flagship",recommended:true},{id:"claude-opus-5",name:"Claude Opus 5",contextWindowTokens:1e6,tier:"flagship"},{id:"claude-sonnet-5",name:"Claude Sonnet 5",contextWindowTokens:1e6,tier:"balanced",recommended:true},{id:"claude-opus-4-8[1m]",name:"Claude Opus 4.8",contextWindowTokens:1e6,tier:"flagship"},{id:"claude-opus-4-7[1m]",name:"Claude Opus 4.7",contextWindowTokens:1e6,tier:"flagship"},{id:"claude-opus-4-6[1m]",name:"Claude Opus 4.6",contextWindowTokens:1e6,tier:"flagship"},{id:"claude-sonnet-4-6[1m]",name:"Claude Sonnet 4.6",contextWindowTokens:1e6,tier:"balanced"},{id:"claude-haiku-4-5",name:"Claude Haiku 4.5",contextWindowTokens:2e5,tier:"speed"}],modes:[{id:"default",name:"Default",description:"Uses Claude's default permission handling with normal approval prompts."},{id:"acceptEdits",name:"Accept Edits",description:"Allows file edits without approval; other permission checks remain in place."},{id:"plan",name:"Plan",description:"Keeps Claude in plan mode so it can inspect and propose changes without applying them."},{id:"dontAsk",name:"Don't Ask",description:"Does not ask for permissions; only pre-approved tool actions can proceed."},{id:"bypassPermissions",name:"Bypass Permissions",description:"Bypasses Claude permission checks so tools can run without approval prompts."}],effort:["low","medium","high"],modelOverrides:{"claude-fable-5-1":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-fable-5":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-opus-5-5":{effort:["low","medium","high","xhigh","max"],defaultEffort:"medium"},"claude-opus-5":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-sonnet-5":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-opus-4-8[1m]":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-opus-4-7[1m]":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-opus-4-6[1m]":{effort:["low","medium","high","max"],defaultEffort:"high"},"claude-sonnet-4-6[1m]":{effort:["low","medium","high","max"],defaultEffort:"high"},"claude-haiku-4-5":{effort:[]}},providerOptions:[]},codex:{models:[{id:"gpt-6-astra",name:"GPT-6 Astra",contextWindowTokens:105e4,tier:"flagship"},{id:"gpt-6-sol",name:"GPT-6 Sol",contextWindowTokens:105e4,tier:"balanced",recommended:true},{id:"gpt-6-luna",name:"GPT-6 Luna",contextWindowTokens:105e4,tier:"speed",recommended:true},{id:"gpt-5.6-sol",name:"GPT-5.6 Sol",contextWindowTokens:105e4,tier:"flagship"},{id:"gpt-5.6-terra",name:"GPT-5.6 Terra",contextWindowTokens:105e4,tier:"balanced"},{id:"gpt-5.6-luna",name:"GPT-5.6 Luna",contextWindowTokens:105e4,tier:"speed"},{id:"gpt-5.5",name:"GPT-5.5",contextWindowTokens:105e4,tier:"flagship"},{id:"gpt-5.4",name:"GPT-5.4",contextWindowTokens:105e4,tier:"flagship"},{id:"gpt-5.4-mini",name:"GPT-5.4 Mini",contextWindowTokens:4e5,tier:"speed"},{id:"gpt-5.3-codex",name:"GPT-5.3 Codex",contextWindowTokens:4e5,tier:"flagship"},{id:"gpt-5.3-codex-spark",name:"GPT-5.3 Codex Spark",contextWindowTokens:128e3,tier:"speed"}],modes:[{id:"agent",name:"Agent",description:"Uses the workspace-write sandbox; can read and modify workspace files without full machine access."},{id:"read-only",name:"Read Only",description:"Uses the read-only sandbox; can inspect files but cannot write to the workspace."},{id:"plan",name:"Plan",description:"Uses the read-only sandbox for planning and inspection; cannot write to the workspace."},{id:"agent-full-access",name:"Agent Full Access",description:"Bypasses approvals and the sandbox; can access and modify files beyond the workspace."},{id:"yolo",name:"YOLO",description:"Bypasses approvals and the sandbox for unrestricted execution and full filesystem access."}],effort:["minimal","low","medium","high"],modelOverrides:{"gpt-6-astra":{effort:["low","medium","high","xhigh","max"],defaultEffort:"xhigh"},"gpt-6-sol":{effort:["none","low","medium","high","xhigh","max"],defaultEffort:"max"},"gpt-6-luna":{effort:["none","low","medium","high","xhigh","max"],defaultEffort:"medium"},"gpt-5.6-sol":{effort:["low","medium","high","xhigh","max","ultra"],defaultEffort:"xhigh"},"gpt-5.6-terra":{effort:["low","medium","high","xhigh","max","ultra"],defaultEffort:"high"},"gpt-5.6-luna":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"gpt-5.5":{effort:["low","medium","high","xhigh"],defaultEffort:"high"}},providerOptions:[]},opencode:{models:[],modes:[{id:"plan",name:"Plan",description:"Uses the plan agent without --auto; planning follows standard approval behavior."},{id:"plan-auto",name:"Plan \xB7 Auto",description:"Uses the plan agent with --auto; planning uses automatic approvals."},{id:"build",name:"Build",description:"Uses the build agent without --auto; work follows standard approval behavior."},{id:"build-auto",name:"Build \xB7 Auto",description:"Uses the build agent with --auto; work uses automatic approvals."}],effort:[],modelOverrides:{},providerOptions:[]},copilot:{models:[{id:"auto",name:"Auto"},{id:"claude-sonnet-5",name:"Claude Sonnet 5",contextWindowTokens:1e6,tier:"balanced"},{id:"claude-sonnet-4-6",name:"Claude Sonnet 4.6",contextWindowTokens:1e6,tier:"balanced"},{id:"gpt-5.5",name:"GPT-5.5",contextWindowTokens:105e4,tier:"flagship"},{id:"gpt-5.4",name:"GPT-5.4",contextWindowTokens:105e4,tier:"flagship"},{id:"gemini-3.1-pro",name:"Gemini 3.1 Pro",contextWindowTokens:1048576,tier:"flagship"}],modes:[{id:"interactive",name:"Interactive",description:"Passes --mode interactive; tool access follows Copilot's interactive mode behavior."},{id:"plan",name:"Plan",description:"Passes --mode plan; planning and permission behavior follow Copilot's plan mode."},{id:"autopilot",name:"Autopilot",description:"Passes --mode autopilot; execution behavior follows Copilot's autonomous mode."}],effort:["none","low","medium","high","xhigh","max"],modelOverrides:{},providerOptions:[]},antigravity:{models:[{id:"gemini-3.7-flash",name:"Gemini 3.7 Flash",contextWindowTokens:1048576,tier:"balanced"},{id:"gemini-3.6-flash",name:"Gemini 3.6 Flash",contextWindowTokens:1048576,tier:"balanced"},{id:"gemini-3.5-flash",name:"Gemini 3.5 Flash",contextWindowTokens:1048576,tier:"balanced"},{id:"gemini-3.1-pro",name:"Gemini 3.1 Pro",contextWindowTokens:1048576,tier:"flagship"},{id:"claude-sonnet-4-6",name:"Claude Sonnet 4.6",contextWindowTokens:1e6,tier:"balanced"},{id:"claude-opus-4-6-thinking",name:"Claude Opus 4.6 Thinking",contextWindowTokens:1e6,tier:"flagship"},{id:"gpt-oss-120b",name:"GPT-OSS 120B",contextWindowTokens:128e3,tier:"balanced"}],modes:[{id:"default",name:"Default",description:"Uses Antigravity's default permission handling. No extra permission flags are passed."},{id:"plan",name:"Plan",description:"Passes --mode plan. This turns on /plan; it is not a Claude-style permission mode."},{id:"acceptEdits",name:"Accept Edits",description:"Passes --mode accept-edits."},{id:"bypassPermissions",name:"Bypass Permissions",description:"Passes --dangerously-skip-permissions so tools can run without approval prompts."}],effort:["low","medium","high"],modelOverrides:{"gemini-3.7-flash":{effort:["low","medium","high"],defaultEffort:"medium"},"gemini-3.6-flash":{effort:["low","medium","high"],defaultEffort:"medium"},"gemini-3.5-flash":{effort:["low","medium","high"],defaultEffort:"medium"},"gemini-3.1-pro":{effort:["low","high"],defaultEffort:"high"},"claude-sonnet-4-6":{effort:[]},"claude-opus-4-6-thinking":{effort:[]},"gpt-oss-120b":{effort:["medium"],defaultEffort:"medium"}},providerOptions:[]},grok:{models:[{id:"grok-4.7",name:"Grok 4.7",contextWindowTokens:5e5,tier:"flagship",recommended:true},{id:"grok-4.6",name:"Grok 4.6",contextWindowTokens:5e5,tier:"flagship"},{id:"grok-4.5",name:"Grok 4.5",contextWindowTokens:5e5,tier:"flagship"}],modes:[{id:"default",name:"Default",description:"Uses Grok's default permission handling."},{id:"acceptEdits",name:"Accept Edits",description:"Allows file edits without changing the selected sandbox profile."},{id:"auto",name:"Auto",description:"Uses Grok automatic permission handling."},{id:"dontAsk",name:"Don't Ask",description:"Does not ask for permission before tool execution."},{id:"bypassPermissions",name:"Bypass Permissions",description:"Bypasses Grok permission checks for tool execution."},{id:"plan",name:"Plan",description:"Keeps Grok in planning mode without applying changes."}],effort:["low","medium","high"],modelOverrides:{"grok-4.7":{effort:["low","medium","high","xhigh"],defaultEffort:"high"},"grok-4.6":{effort:["low","medium","high","xhigh"],defaultEffort:"high"},"grok-4.5":{effort:["low","medium","high"],defaultEffort:"high"}},providerOptions:[{key:"alwaysApprove",type:"boolean"},{key:"sandbox",type:"enum",values:["workspace","read-only","off"]}]}},Object.fromEntries(Object.entries(Zo).map(([t,e])=>[t,e.models]));});function es(t){return sf[t]??t}function df(t){return af.get(t)??t}function ts(t){if(!t)return {};let e=uf.get(t);return e?{...e}:{model:t}}function ns(t,e){return t==="antigravity"||t==="cli/antigravity"?ts(e):e===void 0?{}:{model:df(e)}}var of,sf,af,cf,uf,Wn=v(()=>{h();of=[{baseModelId:"claude-opus-4-8",catalogModelId:"claude-opus-4-8[1m]"},{baseModelId:"claude-opus-4-7",catalogModelId:"claude-opus-4-7[1m]"},{baseModelId:"claude-opus-4-6",catalogModelId:"claude-opus-4-6[1m]"},{baseModelId:"claude-sonnet-4-6",catalogModelId:"claude-sonnet-4-6[1m]"}],sf={"accept-edits":"acceptEdits",yolo:"bypassPermissions","agent-full-access":"bypassPermissions"};af=new Map(of.map(({baseModelId:t,catalogModelId:e})=>[t,e]));cf=[{legacyId:"Gemini 3.7 Flash (High)",model:"gemini-3.7-flash",effort:"high"},{legacyId:"Gemini 3.7 Flash (Medium)",model:"gemini-3.7-flash",effort:"medium"},{legacyId:"Gemini 3.7 Flash (Low)",model:"gemini-3.7-flash",effort:"low"},{legacyId:"Gemini 3.6 Flash (High)",model:"gemini-3.6-flash",effort:"high"},{legacyId:"Gemini 3.6 Flash (Medium)",model:"gemini-3.6-flash",effort:"medium"},{legacyId:"Gemini 3.6 Flash (Low)",model:"gemini-3.6-flash",effort:"low"},{legacyId:"Gemini 3.5 Flash (Medium)",model:"gemini-3.5-flash",effort:"medium"},{legacyId:"Gemini 3.5 Flash (High)",model:"gemini-3.5-flash",effort:"high"},{legacyId:"Gemini 3.5 Flash (Low)",model:"gemini-3.5-flash",effort:"low"},{legacyId:"Gemini 3.1 Pro (Low)",model:"gemini-3.1-pro",effort:"low"},{legacyId:"Gemini 3.1 Pro (High)",model:"gemini-3.1-pro",effort:"high"},{legacyId:"Claude Sonnet 4.6 (Thinking)",model:"claude-sonnet-4-6"},{legacyId:"Claude Opus 4.6 (Thinking)",model:"claude-opus-4-6-thinking"},{legacyId:"GPT-OSS 120B (Medium)",model:"gpt-oss-120b",effort:"medium"},{legacyId:"gemini-3.7-flash-high",model:"gemini-3.7-flash",effort:"high"},{legacyId:"gemini-3.7-flash-medium",model:"gemini-3.7-flash",effort:"medium"},{legacyId:"gemini-3.7-flash-low",model:"gemini-3.7-flash",effort:"low"},{legacyId:"gemini-3.6-flash-high",model:"gemini-3.6-flash",effort:"high"},{legacyId:"gemini-3.6-flash-medium",model:"gemini-3.6-flash",effort:"medium"},{legacyId:"gemini-3.6-flash-low",model:"gemini-3.6-flash",effort:"low"},{legacyId:"gemini-3.5-flash-high",model:"gemini-3.5-flash",effort:"high"},{legacyId:"gemini-3.5-flash-medium",model:"gemini-3.5-flash",effort:"medium"},{legacyId:"gemini-3.5-flash-low",model:"gemini-3.5-flash",effort:"low"},{legacyId:"gemini-3.1-pro-high",model:"gemini-3.1-pro",effort:"high"},{legacyId:"gemini-3.1-pro-low",model:"gemini-3.1-pro",effort:"low"},{legacyId:"gpt-oss-120b-medium",model:"gpt-oss-120b",effort:"medium"}],uf=new Map(cf.map(({legacyId:t,model:e,effort:n})=>[t,n===void 0?{model:e}:{model:e,effort:n}]));});function pf(){return {models:[],modes:[],effort:[],modelOverrides:{},providerOptions:[]}}function At(t){return Br(t).models}function Br(t){return lf[t]??Zo[t]??pf()}function Gn(t,e){let n=Br(t);if(e){if(Object.prototype.hasOwnProperty.call(n.modelOverrides,e))return n.modelOverrides[e]?.effort??n.effort;let r=ns(t,e);return r.model===void 0?n.effort:n.modelOverrides[r.model]?.effort??n.effort}return n.effort}function rd(t){return Br(t).modelOverrides}function od(){return At("claude")}function sd(){return At("codex")}function id(){return At("copilot")}function ad(){return At("antigravity")}var lf,qt=v(()=>{h();Fr();Lr();Wn();lf={};});function dd(t){return ff[t]??t}var ff,cd=v(()=>{h();qt();Wn();ff={auto:"default"};});function qr(t,e){return (Ur[t]??[]).includes(e)}function vt(t){if(!t)return {};let e=t.match(/^(.+?)\[([^\]]+)\]$/);if(e){let n=e[2].toLowerCase();return gf.has(n)?{model:e[1],effort:n}:{model:t}}return {model:t}}function ud(t){switch(t){case "agent-full-access":case "yolo":return ["--dangerously-bypass-approvals-and-sandbox"];case "read-only":case "plan":return ["--sandbox","read-only"];case "agent":return ["--sandbox","workspace-write"];default:return []}}function ld(t){switch(t){case "agent-full-access":case "yolo":return ["--dangerously-bypass-approvals-and-sandbox"];case "read-only":case "plan":return ["-c","sandbox_mode=read-only"];case "agent":return ["-c","sandbox_mode=workspace-write"];default:return []}}function pd(t){return !t||!qr("codex",t)?[]:["-c",`model_reasoning_effort=${t}`]}function fd(t){if(!t)return [];let e=new Set(["acceptEdits","bypassPermissions","default","delegate","dontAsk","plan"]),n=dd(t);return e.has(n)?["--permission-mode",n]:[]}function gd(t){return t?qr("claude",t)?["--effort",t]:[]:[]}function hd(t){return t==="default"?[]:t&&hf.has(t)?["--permission-mode",t]:[]}function _d(t){return t===true?["--always-approve"]:[]}function md(t,e=n=>console.warn(n)){return t===void 0?[]:t==="workspace"||t==="read-only"||t==="off"?["--sandbox",t]:(e(`[grok] Invalid sandbox value ${JSON.stringify(t)}; using workspace.`),["--sandbox","workspace"])}function kd(t){return t?qr("grok",t)?["--effort",t]:[]:[]}function Td(t){if(!t)return [];switch(es(t)){case "default":return [];case "plan":return ["--mode","plan"];case "acceptEdits":return ["--mode","accept-edits"];case "bypassPermissions":return ["--dangerously-skip-permissions"];default:return []}}function wd(t){return t?qr("antigravity",t)?["--effort",t]:[]:[]}var gf,hf,zn=v(()=>{h();cd();Wn();Fr();gf=new Set(nd);hf=new Set(["default","acceptEdits","auto","dontAsk","bypassPermissions","plan"]);});function _f(t){if(t.type!=="usage"||!("input_tokens"in t))return null;let e=Number(t.input_tokens??0),n=Number(t.output_tokens??0),o="cache_read_input_tokens"in t?Number(t.cache_read_input_tokens):void 0,s="cached_input_tokens"in t?Number(t.cached_input_tokens):void 0,i=o!==void 0?o:s??0;return {inputTokens:o!==void 0?e+o:e,outputTokens:n,cachedInputTokens:i}}function mf(t){let e=t.usage;if(!e||typeof e!="object"||Array.isArray(e))return null;let n=e;if(!("input_tokens"in n))return null;let r=Number(n.input_tokens??0),o=Number(n.output_tokens??0),i="cache_read_input_tokens"in n?Number(n.cache_read_input_tokens):void 0,d="cached_input_tokens"in n?Number(n.cached_input_tokens):void 0,c=i!==void 0?i:d??0;return {inputTokens:i!==void 0?r+i:r,outputTokens:o,cachedInputTokens:c}}function kf(t){if(t.type!=="step_finish")return null;let n=t.part?.tokens;if(!n)return null;let r=Number(n.input??0),o=Number(n.output??0),s=n.cache,i=s?Number(s.read??0):0;return {inputTokens:r+i,outputTokens:o,cachedInputTokens:i}}function yd(t){let e=new Map,n;for(let s of t.split(`
|
|
37
|
+
`))if(s.trim())try{let i=JSON.parse(s);if(i.type!=="assistant")continue;let d=i.message,c=d?.id,u=d?.usage;if(typeof c!="string"||!u)continue;let f=Number(u.input_tokens??0),p=Number(u.cache_read_input_tokens??0);e.set(c,{inputTokens:f+p,cachedInputTokens:p});let g=d?.model;typeof g=="string"&&g&&(n=g);}catch{}if(e.size===0)return;let r=0,o=0;for(let s of e.values())r+=s.inputTokens,o+=s.cachedInputTokens;return {inputTokens:r,cachedInputTokens:o,model:n}}function hn(t){if(!t||!t.trim())return;let e=null,n=null;for(let r of t.split(`
|
|
38
|
+
`))if(r.trim())try{let o=JSON.parse(r),s=kf(o);if(s){n||(n={inputTokens:0,outputTokens:0,cachedInputTokens:0}),n.inputTokens+=s.inputTokens,n.outputTokens+=s.outputTokens,n.cachedInputTokens+=s.cachedInputTokens;continue}let i=_f(o)??mf(o);i&&(e=i);}catch{}return n||(e??void 0)}var Kn=v(()=>{h();});function tt(t,e){if(typeof t!="object"||t===null||Array.isArray(t))return e;let n=t.timestamp;return typeof n!="string"||!Number.isFinite(Date.parse(n))?e:new Date(n).toISOString()}var jt=v(()=>{h();});function Rd(t){let e=t.split(`
|
|
39
|
+
`).filter(o=>o.trim()),n=[],r=null;for(let o of e)try{let s=JSON.parse(o);if(s.type==="assistant"&&Array.isArray(s.message?.content))for(let i of s.message.content)i.type==="text"&&typeof i.text=="string"&&i.text.trim()&&n.push(i.text.trim());s.type==="result"&&typeof s.result=="string"&&(r=s.result);}catch{}if(n.length>0)return n[n.length-1];if(r)return r}function yf(t){let e=t.split(`
|
|
40
|
+
`).filter(n=>n.trim());for(let n of e.reverse())try{let r=JSON.parse(n);if(typeof r=="object"&&r!==null&&r.type==="result")return r}catch{}}function Rf(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)?t:void 0}function Ed(t){let e=Rf(t.rate_limit_info);if(t.type==="rate_limit_event"&&e?.status==="rejected")return `Claude rate limit: ${typeof e.rateLimitType=="string"?e.rateLimitType:"unknown"} (status: rejected)`;if(t.error==="rate_limit"){let n=Sf(t);return n?`Claude rate limit: ${n}`:"Claude rate limit"}if(t.type==="result"&&t.is_error===true){let n=typeof t.result=="string"?t.result:"";if(bf(n))return `Claude rate limit: ${n}`}}function Ef(t){let e=Ed(t);if(e)return e;if(t.type!=="result"||t.is_error!==true)return;let n=typeof t.result=="string"?t.result:"";if(n.trim())return n;let r=typeof t.subtype=="string"?t.subtype:"unknown",o=typeof t.terminal_reason=="string"?t.terminal_reason:"unknown";return `Claude ended without an answer (subtype=${r}, terminal_reason=${o})`}function Sf(t){let n=t.message?.content;return Array.isArray(n)?n.map(r=>typeof r.text=="string"?r.text.trim():"").filter(Boolean).join(`
|
|
35
41
|
|
|
36
|
-
`):""}function
|
|
37
|
-
`):i=JSON.stringify(s),{timestamp:t,type:"tool_result",toolUseId:o,...
|
|
38
|
-
`);for(let r of e)if(r.trim())try{let o=JSON.parse(r);if(o.type==="result"){let s=o.usage,i=s?{inputTokens:Number(s.input_tokens??0)+Number(s.cache_read_input_tokens??0),outputTokens:Number(s.output_tokens??0),cachedInputTokens:Number(s.cache_read_input_tokens??0),costUsd:Number(o.total_cost_usd??0)}:null,d=o.modelUsage,c=d?Object.keys(d)[0]??null:null;return {usage:i,model:c}}}catch{}let n=
|
|
39
|
-
`).filter(o=>o.trim()),n=[],r=null;for(let o of e)try{let s=JSON.parse(o);if(s.type==="assistant.message"&&typeof s.data?.content=="string"){let i=s.data.content;i.trim()&&n.push(i.trim());}s.type==="result"&&typeof s.result=="string"&&(r=s.result);}catch{}if(n.length>0)return n[n.length-1];if(r)return r}var
|
|
40
|
-
`).map(o=>o.trim()).filter(Boolean),n=[],r=null;for(let o of e)try{let s=JSON.parse(o);if(s.type==="item.completed"&&(s.item?.type==="message"||s.item?.type==="agent_message")&&typeof s.item?.text=="string"){let i=s.item.text;i.trim()&&n.push(i.trim());}s.type==="result"&&typeof s.result=="string"&&(r=s.result);}catch{}if(n.length>0)return n[n.length-1];if(r)return r}function
|
|
41
|
-
`),d=typeof e.error=="string"?e.error:At(e.error)&&typeof e.error.message=="string"?e.error.message:"";return {timestamp:t,type:"tool_result",resultPreview:i||d,isError:e.status==="failed"||e.status==="error"||e.is_error===true||e.error!=null,...n?{toolUseId:n}:{}}}if(r==="tool_use"){let o=String(e.name||e.tool_name||""),s=e.input,i=Qe(s);return o==="Bash"&&pt(i)?ft(t,i):{timestamp:t,type:"tool_use",toolName:o,toolInput:i}}if(r==="tool_result"){let o=!!e.is_error,s=String(e.output||e.content||"");return {timestamp:t,type:"tool_result",...Xe(s,o)}}if(r==="web_search"){let o=e.action,s;if(o?.type==="search"){let i=o.queries;s=String(o.query||"")||(i?.length?i.join(", "):"")||String(e.query||"");}else s=e.query?"open: "+String(e.query):"";return !s&&!(At(o)&&o.type==="other"&&e.query==="")?null:{timestamp:t,type:"tool_use",toolName:"WebSearch",toolInput:s}}if(r==="file_change"){let o=e.changes;if(!Array.isArray(o)||o.length===0)return null;let s=o.map(d=>String(d.path||"")).filter(Boolean);if(s.length===0)return null;let i=s.length===1?s[0]:`${s.slice(0,2).join(", ")}${s.length>2?` (+${s.length-2})`:""}`;return {timestamp:t,type:"tool_use",toolName:"Edit",toolInput:i}}return null}function vf(t,e){let n=e.type;if(n==="text")return {timestamp:t,type:"text",content:String(e.text||"")};if(n==="tool_use"){let r=String(e.name||""),o=e.input,s=Qe(o);return r==="Bash"&&pt(s)?ft(t,s):{timestamp:t,type:"tool_use",toolName:r,toolInput:s}}return null}var yf,Rf,ns,rs=v(()=>{h();Ht();Dr();jn();dn();un();Vo();cn();qn();$t();Ft();yf=new Set(["turn.started","turn.completed","item.updated"]),Rf="cli/codex";ns={command:"codex",meta:{displayName:"Codex",models:ed(),capabilities:{resume:true}},buildArgs(t,e,n){let{model:r,effort:o}=It(e.model),s=e.effort??o,i=e.resumeSessionId?id(e.mode):sd(e.mode),d=ad(s),c=r?["-m",r]:[],u=Sf(e.additionalArgs??[]),p=u.includes("--json")||u.includes("--experimental-json")?[]:["--json"];return e.resumeSessionId?{args:["exec","resume",...p,...i,...d,...c,...u,e.resumeSessionId,"-"],stdinMessage:t}:{args:["exec",...p,...i,...d,...c,...u],stdinMessage:t}},extractText(t){let e=bf(t);if(e)throw new ne(e,Rf);let n=wd(t);if(n)return n;let r=t.trim();return an(r,"codex")?"":r},extractPartialText(t){return wd(t)},parseResultMeta(t){let e=ln(t);return e?{usage:{inputTokens:e.inputTokens,outputTokens:e.outputTokens,cachedInputTokens:e.cachedInputTokens,costUsd:0},model:null}:{usage:null,model:null}},parseEvent(t,e,n){let r=e??new Date().toISOString(),o=[],s;try{JSON.parse(t),s=[t];}catch{s=Ef(t),s.length>1&&console.warn("[codex] parseEvent: falling back to concatenated-JSON split for a malformed line");}for(let[i,d]of s.entries()){let c;try{c=JSON.parse(d);}catch{continue}if(!At(c))continue;let u=c.type;if(!u)continue;let f=Ze(c,r);if(Rd(c)){let g=Ed(c);o.push({timestamp:f,type:"error",content:g,errorMessage:g});continue}if(!u.startsWith("item.")&&!u.startsWith("turn.")&&!u.startsWith("thread.")||Ko(c))continue;u==="thread.started"&&n&&n.state.delete("codex.pending");let p=c.item;if(p){if(u==="item.started"){o.push(...If(f,p,yd(p,u,n,i)));continue}if(u==="item.completed"){let g=Af(f,p,yd(p,u,n,i));g&&o.push(g);continue}}}return o},suppressOutputLine(t){let e=t.trim();if(!e.startsWith("{")||!e.endsWith("}"))return false;try{let r=JSON.parse(e).type;return r?yf.has(r):!1}catch{return false}}};});function Cf(t){return t?Nf[t]??{agent:"build",autoApprove:false}:{agent:void 0,autoApprove:false}}function Fr(t,e){return t.some(n=>n===e||n.startsWith(`${e}=`))}function vd(t){let e=[],n=0,r=false,o=false,s=0;for(let d=0;d<t.length;d++){let c=t[d];if(o){o=false;continue}if(c==="\\"&&r){o=true;continue}if(c==='"'){r=!r;continue}if(!r){if(c==="{")n++;else if(c==="}"&&(n--,n===0)){let u=t.slice(s,d+1).trim();u&&e.push(u),s=d+1;}}}let i=t.slice(s).trim();return i&&e.push(i),e}function fn(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function xf(t){let e=[],n=false;for(let r of t.split(/\r?\n/)){let o=r.trim();if(!o)continue;try{let i=JSON.parse(o);fn(i)?e.push(i):n=!0;continue}catch{}let s=vd(o);s.length>1&&console.warn("[opencode] extractText: falling back to concatenated-JSON split for a malformed line");for(let i of s)try{let d=JSON.parse(i);fn(d)?e.push(d):n=!0;}catch{n=true;}}return {events:e,malformed:n}}function Bt(t){if(typeof t!="string")return;let e=t.split(/\r?\n/).map(n=>n.trim()).find(n=>n&&!/^at\s+/.test(n));if(e)return e.replace(/\u001b\[[0-?]*[ -/]*[@-~]/g,"").replace(/(?:[A-Za-z]:[\\/]|\/)(?:[^\s"'`()\[\]{}]+[\\/])*[^\s"'`()\[\]{}]+/g,"[path]").slice(0,Ad).trim()}function Od(t){let e=fn(t.error)?t.error:void 0,n=e&&fn(e.data)?e.data:void 0,r=Bt(e?.name),o=Bt(n?.message)??Bt(e?.message)??Bt(t.message)??Bt(t.errorMessage)??Bt(t.error),s=Bt(t.ref),i=r&&o&&r!==o?`${r}: ${o}`:r??o??Id;return (s?`${i} (ref: ${s})`:i).slice(0,Ad)}function Sd(t){let e=xf(t),n=[],r=null,o=0,s=[],i,d=false;for(let c of e.events){let u=typeof c.type=="string"?c.type:void 0;if(u){if(u==="text"){let f=fn(c.part)?c.part:void 0,p=typeof f?.text=="string"?f.text:void 0;p?.trim()&&n.push(p.trim());continue}if(u==="result"){typeof c.result=="string"&&(r=c.result);continue}if(u==="tool_use"){o++;continue}if(u==="error"){s.push(Od(c));continue}if(u==="step_finish"){d=true;let f=fn(c.part)?c.part:void 0;i=typeof f?.reason=="string"?f.reason:void 0;}}}return {...e,texts:n,resultText:r,toolUseCount:o,errorMessages:s,terminalReason:i,hasTerminal:d}}function Nd(t){return (t??"unknown").trim().toLowerCase().replace(/_/g,"-")}function Br(){return new ne("OpenCode returned no assistant output.",pn,{code:"EMPTY_OUTPUT",kind:"transient"})}function Pf(){return new ne("OpenCode emitted malformed JSON output.",pn,{code:"PROVIDER_CRASHED",kind:"transient"})}function bd(t,e){switch(Nd(t)){case "length":return new ne("OpenCode stopped because the context window was exceeded.",pn,{code:"UNKNOWN",kind:"permanent"});case "content-filter":return new ne("OpenCode stopped because the content filter blocked the response.",pn,{code:"UNKNOWN",kind:"permanent"});case "error":return new ne(e?`OpenCode error: ${e}`:`${Id} while generating a response.`,pn,{code:"PROVIDER_CRASHED",kind:"transient"});default:return null}}var Of,pn,Id,Ad,Nf,os,ss=v(()=>{h();Ht();jn();un();Ft();Of=new Set(["step_start","step_finish"]),pn="cli/opencode",Id="OpenCode provider error",Ad=240,Nf={build:{agent:"build",autoApprove:false},"build-auto":{agent:"build",autoApprove:true},plan:{agent:"plan",autoApprove:false},"plan-auto":{agent:"plan",autoApprove:true}};os={command:"opencode",meta:{displayName:"OpenCode",capabilities:{resume:true}},buildArgs(t,e,n){let r=e.additionalArgs,o=r!==void 0?[...r]:["run"];Fr(o,"--format")||o.push("--format","json"),e.resumeSessionId&&!o.includes("-s")&&!o.includes("--session")&&o.push("-s",e.resumeSessionId);let{agent:s,autoApprove:i}=Cf(e.mode);Fr(o,"--agent")||s!==void 0&&o.push("--agent",s),i&&!Fr(o,"--auto")&&o.push("--auto"),e.effort!==void 0&&!Fr(o,"--variant")&&o.push("--variant",e.effort),e.model&&o.push("--model",e.model);let d;return !n&&!i&&!e.env?.OPENCODE_PERMISSION&&(d={OPENCODE_PERMISSION:JSON.stringify({external_directory:"allow"})}),{args:o,stdinMessage:t,env:d}},extractText(t){let e=Sd(t),n=e.errorMessages[0];if(n){let i=bd("error",n);if(i)throw i}let r=bd(e.terminalReason??"",void 0);if(r)throw r;let o=e.texts.length>0?e.texts[e.texts.length-1]:void 0;if(o!==void 0){if(!e.hasTerminal)throw Br();return o}if(e.resultText?.trim()){if(!e.hasTerminal)throw Br();return e.resultText}if(e.malformed)throw Pf();if(!e.hasTerminal)throw Br();let s=Nd(e.terminalReason);if((s==="stop"||s==="tool-calls")&&e.toolUseCount>0)return "";throw Br()},interpretExit(t,e,n=""){if(t===0)return null;let o=Sd(n).errorMessages[0];return o?new ne(`OpenCode error: ${o}`,pn,{code:"PROVIDER_CRASHED",kind:"transient"}):null},parseResultMeta(t){let e=ln(t);return e?{usage:{inputTokens:e.inputTokens,outputTokens:e.outputTokens,cachedInputTokens:e.cachedInputTokens,costUsd:0},model:null}:{usage:null,model:null}},parseEvent(t,e){let n=e??new Date().toISOString(),r=[],o;try{JSON.parse(t),o=[t];}catch{o=vd(t),o.length>1&&console.warn("[opencode] parseEvent: falling back to concatenated-JSON split for a malformed line");}for(let s of o){let i;try{i=JSON.parse(s);}catch{continue}let d=Ze(i,n),c=i.type;if(c){if(c==="text"){let f=i.part?.text;f&&r.push({timestamp:d,type:"text",content:f});continue}if(c==="tool_use"){let u=i.part;if(!u)continue;let f=String(u.tool||""),p=String(u.callID||""),g=u.state,_=String(g?.status||""),m=g?.input,k=Qe(m);if(r.push({timestamp:d,type:"tool_use",toolName:f,toolUseId:p,toolInput:k}),_==="completed"&&g?.output!==void 0){let T=g.output,E=typeof T=="string"?T:JSON.stringify(T);r.push({timestamp:d,type:"tool_result",toolUseId:p,resultPreview:E,isError:false});}else _==="error"&&r.push({timestamp:d,type:"tool_result",toolUseId:p,resultPreview:String(g?.error||"tool error"),isError:true});continue}if(c==="error"){let u=Od(i);r.push({timestamp:d,type:"error",content:u,errorMessage:u});continue}}}return r},suppressOutputLine(t){let e=t.trim();if(!e.startsWith("{")||!e.endsWith("}"))return false;try{let r=JSON.parse(e).type;return r?Of.has(r):!1}catch{return false}}};});function Wn(t,e){return t.some(n=>n===e||n.startsWith(`${e}=`))}function Df(t,e){if(!(t?bt(is).some(s=>s.id===t):false)||!t)return e;let r=Bn(is,t),o=Qa(is)[t]?.defaultEffort;if(r.length!==0)return e?r.includes(e)?e:o&&r.includes(o)?o:void 0:o}var is,as,ds=v(()=>{h();Ht();Fn();$t();qn();is="antigravity";as={command:"agy",meta:{displayName:"Antigravity",models:nd(),defaultTimeoutMs:{query:12e4,execute:3e5},defaultIdleMs:0},buildArgs(t,e,n){let{model:r,effort:o}=It(e.model),s=Xo(r),i=s.model,d=e.effort??o??s.effort,c=Df(i,d),u=e.additionalArgs??[],f=i&&!Wn(u,"--model")?["--model",i]:[],p=Wn(u,"--effort")?[]:hd(c),g=Wn(u,"--mode")||Wn(u,"--dangerously-skip-permissions")?[]:gd(e.mode),_=Wn(u,"--print")?[]:["--print",t];return {args:[...f,...p,...g,...u,..._]}},extractText(t){let e=t.trim();if(!e)throw new ne("Antigravity CLI returned empty output with exit code 0. agy may have hidden an auth/quota/model error in its log file; inspect ~/.gemini/antigravity-cli/log for details.","cli/antigravity",{code:"EMPTY_OUTPUT",kind:"transient"});return e},parseResultMeta(t){return {usage:null,model:null}},parseEvent(t,e){return []}};});var Cd=v(()=>{h();dn();un();cn();Ft();});function gn(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function hn(t){return gn(t)?t:void 0}function Ne(t){return typeof t=="string"?t:void 0}function jt(t){let e=typeof t=="number"?t:Number(t??0);return Number.isFinite(e)?e:0}function $f(t){let e=[],n=-1,r=0,o=false,s=false;for(let i=0;i<t.length;i+=1){let d=t[i];if(n===-1){(d==="{"||d==="[")&&(n=i,r=1);continue}if(s){s=false;continue}if(d==="\\"&&o){s=true;continue}if(d==='"'){o=!o;continue}o||(d==="{"||d==="["?r+=1:(d==="}"||d==="]")&&(r-=1,r===0&&(e.push(t.slice(n,i+1)),n=-1)));}return n!==-1&&e.push(t.slice(n)),e}function Gn(t){let e=t.trim();if(!e)return [];try{let n=JSON.parse(e);return gn(n)?[n]:[]}catch{return $f(e).flatMap(n=>{try{let r=JSON.parse(n);return gn(r)?[r]:[]}catch{return []}})}}function Md(t){let e=JSON.stringify(t);return e===void 0?String(t):e}function qt(t){if(typeof t=="string")return t;if(Array.isArray(t)){let e=t.map(qt).filter(n=>n!==void 0);return e.length>0?e.join(`
|
|
42
|
-
`):void 0}if(
|
|
42
|
+
`):""}function bf(t){let e=t.toLowerCase();return e.includes("out of extra usage")||e.includes("rate limit")||e.includes("quota")}function If(t,e){let n=e.type;if(n==="text"){let r=String(e.text||"");return r?{timestamp:t,type:"text",content:r}:null}if(n==="thinking"){let r=typeof e.thinking=="string"?e.thinking.trim():"";return r?{timestamp:t,type:"thinking",content:r}:null}if(n==="tool_use"){let r=String(e.name||""),o=e.id,s=e.input,i=et(s);return r==="Bash"&>(i)?ht(t,i,o):{timestamp:t,type:"tool_use",toolUseId:o,toolName:r,toolInput:i}}if(n==="tool_result"){let r=!!e.is_error,o=e.tool_use_id,s=e.output??e.content??"",i;return typeof s=="string"?i=s:Array.isArray(s)?i=s.filter(d=>d.type==="text"&&typeof d.text=="string").map(d=>d.text).join(`
|
|
43
|
+
`):i=JSON.stringify(s),{timestamp:t,type:"tool_result",toolUseId:o,...Ze(i,r)}}return null}var Tf,wf,jr,rs=v(()=>{h();Jo();Ft();$r();pn();fn();gn();zn();qt();Kn();jt();Tf=new Set(["tool_progress"]),wf="cli/claude";jr={command:"claude",meta:{displayName:"Claude",models:od(),capabilities:{resume:true}},buildArgs(t,e,n){let{model:r,effort:o}=vt(e.model),s=e.effort??o,i=fd(e.mode),d=gd(s),c=r?["--model",r]:[],u=e.resumeSessionId?["--resume",e.resumeSessionId]:[];if(e.additionalArgs!==void 0){let p=[...e.additionalArgs];return p.indexOf("-p")!==-1?{args:["--output-format","stream-json","--verbose",...u,...i,...d,...c,...p],stdinMessage:t}:{args:["--output-format","stream-json","--verbose",...u,...i,...d,...c,...p],stdinMessage:t}}return {args:["-p","--output-format","stream-json","--verbose",...u,...i,...d,...c],stdinMessage:t}},extractText(t){let e=yf(t);if(e?.is_error===true){let o=jr.extractFailure(JSON.stringify(e));if(o)throw o;let s=typeof e.subtype=="string"?e.subtype:"unknown",i=typeof e.terminal_reason=="string"?e.terminal_reason:"unknown";throw new ne(`Claude ended without an answer (subtype=${s}, terminal_reason=${i})`,wf,{code:"EMPTY_OUTPUT",kind:"permanent"})}let n=Rd(t);if(n)return n;let r=t.trim();return ln(r,"claude")?"":r},extractPartialText(t){return Rd(t)},extractFailure(t){try{let e=JSON.parse(t),n=Ed(e);if(n)return new Bt(n)}catch{}return null},parseResultMeta(t){let e=t.split(`
|
|
44
|
+
`);for(let r of e)if(r.trim())try{let o=JSON.parse(r);if(o.type==="result"){let s=o.usage,i=s?{inputTokens:Number(s.input_tokens??0)+Number(s.cache_read_input_tokens??0),outputTokens:Number(s.output_tokens??0),cachedInputTokens:Number(s.cache_read_input_tokens??0),costUsd:Number(o.total_cost_usd??0)}:null,d=o.modelUsage,c=d?Object.keys(d)[0]??null:null;return {usage:i,model:c}}}catch{}let n=yd(t);return n?{usage:{inputTokens:n.inputTokens,outputTokens:0,cachedInputTokens:n.cachedInputTokens,costUsd:0},model:n.model??null}:{usage:null,model:null}},parseEvent(t,e){let n;try{n=JSON.parse(t);}catch{return []}let r=n.type;if(!r)return [];let o=tt(n,e??new Date().toISOString()),s=Ef(n);if(s)return [{timestamp:o,type:"error",content:s,errorMessage:s}];let i=n.output_file,d=n.summary;if(r==="system"&&n.subtype==="task_notification"&&n.status==="completed"&&typeof i=="string"&&i.trim().length>0&&typeof d=="string"&&d.trim().length>0)return [{timestamp:o,type:"text",content:d}];if(r!=="assistant"&&r!=="user")return [];let u=n.message?.content;if(!Array.isArray(u))return [];let f=[];for(let p of u){let g=If(o,p);g&&f.push(g);}return f},suppressOutputLine(t){let e=t.trim();if(!e.startsWith("{")||!e.endsWith("}"))return false;try{let r=JSON.parse(e).type;return r?Tf.has(r):!1}catch{return false}}};});function Sd(t){let e=t.split(`
|
|
45
|
+
`).filter(o=>o.trim()),n=[],r=null;for(let o of e)try{let s=JSON.parse(o);if(s.type==="assistant.message"&&typeof s.data?.content=="string"){let i=s.data.content;i.trim()&&n.push(i.trim());}s.type==="result"&&typeof s.result=="string"&&(r=s.result);}catch{}if(n.length>0)return n[n.length-1];if(r)return r}var Af,os,ss=v(()=>{h();$r();Kn();pn();gn();fn();qt();Fr();jt();Af=new Set(["interactive","plan","autopilot"]);os={command:"copilot",meta:{displayName:"Copilot",models:id()},buildArgs(t,e,n){let r=e.additionalArgs?[...e.additionalArgs]:[];return e.model&&r.push("--model",e.model),e.mode&&Af.has(e.mode)&&r.push("--mode",e.mode),e.effort&&(Ur.copilot??[]).includes(e.effort)&&r.push("--effort",e.effort),{args:r,stdinMessage:t}},extractText(t){let e=Sd(t);if(e)return e;let n=t.trim();return ln(n,"copilot")?"":n},extractPartialText(t){return Sd(t)},parseResultMeta(t){let e=hn(t);return e?{usage:{inputTokens:e.inputTokens,outputTokens:e.outputTokens,cachedInputTokens:e.cachedInputTokens,costUsd:0},model:null}:{usage:null,model:null}},parseEvent(t,e){let n;try{n=JSON.parse(t);}catch{return []}let r=n.type;if(!r)return [];if(!r.startsWith("tool.execution")&&!r.startsWith("assistant.")&&r!=="user.message")return [];let o=n.data;if(!o)return [];let s=tt(n,e??new Date().toISOString()),i=o.toolCallId;if(r==="tool.execution_start"){let d=String(o.toolName||""),c=o.arguments,u=et(c);return (d==="bash"||d==="Bash")&>(u)?[ht(s,u,i)]:[{timestamp:s,type:"tool_use",toolName:d,toolInput:u,...i&&{toolUseId:i}}]}if(r==="tool.execution_complete"){let d=o.error;if(d)return [{timestamp:s,type:"tool_result",...i&&{toolUseId:i},...Ze(String(d.message||""),true)}];let c=o.result,u=String(c?.content||"");return [{timestamp:s,type:"tool_result",...i&&{toolUseId:i},...Ze(u,false)}]}if(r==="assistant.message"){let d=String(o.content||"");return d?[{timestamp:s,type:"text",content:d}]:[]}return []}};});function Nf(t){let e=[],n=0,r=false,o=false,s=0;for(let d=0;d<t.length;d++){let c=t[d];if(o){o=false;continue}if(c==="\\"&&r){o=true;continue}if(c==='"'){r=!r;continue}if(!r){if(c==="{")n++;else if(c==="}"&&(n--,n===0)){let u=t.slice(s,d+1).trim();u&&e.push(u),s=d+1;}}}let i=t.slice(s).trim();return i&&e.push(i),e}function Cf(t){return t[0]==="exec"?t.slice(1):t}function bd(t){let e=t.split(`
|
|
46
|
+
`).map(o=>o.trim()).filter(Boolean),n=[],r=null;for(let o of e)try{let s=JSON.parse(o);if(s.type==="item.completed"&&(s.item?.type==="message"||s.item?.type==="agent_message")&&typeof s.item?.text=="string"){let i=s.item.text;i.trim()&&n.push(i.trim());}s.type==="result"&&typeof s.result=="string"&&(r=s.result);}catch{}if(n.length>0)return n[n.length-1];if(r)return r}function Ot(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Ad(t){return t.type==="turn.failed"?true:t.type!=="error"?false:typeof t.message=="string"||typeof t.errorMessage=="string"||typeof t.error=="string"||Ot(t.error)}function vd(t){let e=Ot(t.error)?t.error:void 0,n=[t.message,t.errorMessage,e?.message,e?.detail,typeof t.error=="string"?t.error:void 0];for(let r of n)if(typeof r=="string"&&r.trim())return r;return t.type==="turn.failed"?"Codex turn failed.":"Codex CLI reported an error."}function xf(t){for(let e of t.split(/\r?\n/)){if(!e.trim())continue;let n;try{n=JSON.parse(e);}catch{continue}if(Ot(n)&&Ad(n))return vd(n)}}function Id(t,e,n,r){if(!n||t.type!=="command_execution"&&t.type!=="mcp_tool_call"||typeof t.id!="string"||!t.id.trim()||t.type==="mcp_tool_call"&&e==="item.started"&&(typeof t.server!="string"||typeof t.tool!="string"))return;let o=n.state.get("codex.pending");o||(o=new Map,n.state.set("codex.pending",o));let s=JSON.stringify([t.type,t.id]);if(e==="item.started"){let c=`codex:${JSON.stringify(t.id)}#${n.rowIndex}:${r}`,u=o.get(s)??[];return u.push(c),o.set(s,u),c}let i=o.get(s),d=i?.pop();return i?.length||o.delete(s),d}function Pf(t,e,n){let r=e.type;if(r==="command_execution"){let o=String(e.command||"");return gt(o)?[ht(t,o,n)]:[{timestamp:t,type:"tool_use",toolName:"Bash",toolInput:o,...n?{toolUseId:n}:{}}]}return r==="mcp_tool_call"?typeof e.server!="string"||typeof e.tool!="string"?[]:[{timestamp:t,type:"tool_use",toolName:`${e.server}/${e.tool}`,toolInput:et(e.arguments),...n?{toolUseId:n}:{}}]:[]}function Df(t,e,n){let r=e.type;if(r==="message"||r==="text"){let o=e.content;if(Array.isArray(o))for(let s of o){let i=Lf(t,s);if(i)return i}if(typeof e.text=="string")return {timestamp:t,type:"text",content:e.text}}if(r==="agent_message"&&typeof e.text=="string")return {timestamp:t,type:"text",content:e.text};if(r==="reasoning"){let o=typeof e.text=="string"?e.text.trim():"";return o?{timestamp:t,type:"thinking",content:o}:null}if(r==="command_execution"){let o=String(e.aggregated_output||e.output||""),s=!!e.is_error;return {timestamp:t,type:"tool_result",...Ze(o,s),...n?{toolUseId:n}:{}}}if(r==="mcp_tool_call"){let o=Ot(e.result)?e.result:void 0,i=(Array.isArray(o?.content)?o.content:[]).filter(c=>Ot(c)&&c.type==="text"&&typeof c.text=="string").map(c=>c.text).join(`
|
|
47
|
+
`),d=typeof e.error=="string"?e.error:Ot(e.error)&&typeof e.error.message=="string"?e.error.message:"";return {timestamp:t,type:"tool_result",resultPreview:i||d,isError:e.status==="failed"||e.status==="error"||e.is_error===true||e.error!=null,...n?{toolUseId:n}:{}}}if(r==="tool_use"){let o=String(e.name||e.tool_name||""),s=e.input,i=et(s);return o==="Bash"&>(i)?ht(t,i):{timestamp:t,type:"tool_use",toolName:o,toolInput:i}}if(r==="tool_result"){let o=!!e.is_error,s=String(e.output||e.content||"");return {timestamp:t,type:"tool_result",...Ze(s,o)}}if(r==="web_search"){let o=e.action,s;if(o?.type==="search"){let i=o.queries;s=String(o.query||"")||(i?.length?i.join(", "):"")||String(e.query||"");}else s=e.query?"open: "+String(e.query):"";return !s&&!(Ot(o)&&o.type==="other"&&e.query==="")?null:{timestamp:t,type:"tool_use",toolName:"WebSearch",toolInput:s}}if(r==="file_change"){let o=e.changes;if(!Array.isArray(o)||o.length===0)return null;let s=o.map(d=>String(d.path||"")).filter(Boolean);if(s.length===0)return null;let i=s.length===1?s[0]:`${s.slice(0,2).join(", ")}${s.length>2?` (+${s.length-2})`:""}`;return {timestamp:t,type:"tool_use",toolName:"Edit",toolInput:i}}return null}function Lf(t,e){let n=e.type;if(n==="text")return {timestamp:t,type:"text",content:String(e.text||"")};if(n==="tool_use"){let r=String(e.name||""),o=e.input,s=et(o);return r==="Bash"&>(s)?ht(t,s):{timestamp:t,type:"tool_use",toolName:r,toolInput:s}}return null}var vf,Of,is,as=v(()=>{h();Ft();$r();Kn();pn();gn();Qo();fn();zn();qt();jt();vf=new Set(["turn.started","turn.completed","item.updated"]),Of="cli/codex";is={command:"codex",meta:{displayName:"Codex",models:sd(),capabilities:{resume:true}},buildArgs(t,e,n){let{model:r,effort:o}=vt(e.model),s=e.effort??o,i=e.resumeSessionId?ld(e.mode):ud(e.mode),d=pd(s),c=r?["-m",r]:[],u=Cf(e.additionalArgs??[]),p=u.includes("--json")||u.includes("--experimental-json")?[]:["--json"];return e.resumeSessionId?{args:["exec","resume",...p,...i,...d,...c,...u,e.resumeSessionId,"-"],stdinMessage:t}:{args:["exec",...p,...i,...d,...c,...u],stdinMessage:t}},extractText(t){let e=xf(t);if(e)throw new ne(e,Of);let n=bd(t);if(n)return n;let r=t.trim();return ln(r,"codex")?"":r},extractPartialText(t){return bd(t)},parseResultMeta(t){let e=hn(t);return e?{usage:{inputTokens:e.inputTokens,outputTokens:e.outputTokens,cachedInputTokens:e.cachedInputTokens,costUsd:0},model:null}:{usage:null,model:null}},parseEvent(t,e,n){let r=e??new Date().toISOString(),o=[],s;try{JSON.parse(t),s=[t];}catch{s=Nf(t),s.length>1&&console.warn("[codex] parseEvent: falling back to concatenated-JSON split for a malformed line");}for(let[i,d]of s.entries()){let c;try{c=JSON.parse(d);}catch{continue}if(!Ot(c))continue;let u=c.type;if(!u)continue;let f=tt(c,r);if(Ad(c)){let g=vd(c);o.push({timestamp:f,type:"error",content:g,errorMessage:g});continue}if(!u.startsWith("item.")&&!u.startsWith("turn.")&&!u.startsWith("thread.")||Xo(c))continue;u==="thread.started"&&n&&n.state.delete("codex.pending");let p=c.item;if(p){if(u==="item.started"){o.push(...Pf(f,p,Id(p,u,n,i)));continue}if(u==="item.completed"){let g=Df(f,p,Id(p,u,n,i));g&&o.push(g);continue}}}return o},suppressOutputLine(t){let e=t.trim();if(!e.startsWith("{")||!e.endsWith("}"))return false;try{let r=JSON.parse(e).type;return r?vf.has(r):!1}catch{return false}}};});function $f(t){return t?Hf[t]??{agent:"build",autoApprove:false}:{agent:void 0,autoApprove:false}}function Wr(t,e){return t.some(n=>n===e||n.startsWith(`${e}=`))}function Pd(t){let e=[],n=0,r=false,o=false,s=0;for(let d=0;d<t.length;d++){let c=t[d];if(o){o=false;continue}if(c==="\\"&&r){o=true;continue}if(c==='"'){r=!r;continue}if(!r){if(c==="{")n++;else if(c==="}"&&(n--,n===0)){let u=t.slice(s,d+1).trim();u&&e.push(u),s=d+1;}}}let i=t.slice(s).trim();return i&&e.push(i),e}function mn(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Uf(t){let e=[],n=false;for(let r of t.split(/\r?\n/)){let o=r.trim();if(!o)continue;try{let i=JSON.parse(o);mn(i)?e.push(i):n=!0;continue}catch{}let s=Pd(o);s.length>1&&console.warn("[opencode] extractText: falling back to concatenated-JSON split for a malformed line");for(let i of s)try{let d=JSON.parse(i);mn(d)?e.push(d):n=!0;}catch{n=true;}}return {events:e,malformed:n}}function Wt(t){if(typeof t!="string")return;let e=t.split(/\r?\n/).map(n=>n.trim()).find(n=>n&&!/^at\s+/.test(n));if(e)return e.replace(/\u001b\[[0-?]*[ -/]*[@-~]/g,"").replace(/(?:[A-Za-z]:[\\/]|\/)(?:[^\s"'`()\[\]{}]+[\\/])*[^\s"'`()\[\]{}]+/g,"[path]").slice(0,xd).trim()}function Dd(t){let e=mn(t.error)?t.error:void 0,n=e&&mn(e.data)?e.data:void 0,r=Wt(e?.name),o=Wt(n?.message)??Wt(e?.message)??Wt(t.message)??Wt(t.errorMessage)??Wt(t.error),s=Wt(t.ref),i=r&&o&&r!==o?`${r}: ${o}`:r??o??Cd;return (s?`${i} (ref: ${s})`:i).slice(0,xd)}function Od(t){let e=Uf(t),n=[],r=null,o=0,s=[],i,d=false;for(let c of e.events){let u=typeof c.type=="string"?c.type:void 0;if(u){if(u==="text"){let f=mn(c.part)?c.part:void 0,p=typeof f?.text=="string"?f.text:void 0;p?.trim()&&n.push(p.trim());continue}if(u==="result"){typeof c.result=="string"&&(r=c.result);continue}if(u==="tool_use"){o++;continue}if(u==="error"){s.push(Dd(c));continue}if(u==="step_finish"){d=true;let f=mn(c.part)?c.part:void 0;i=typeof f?.reason=="string"?f.reason:void 0;}}}return {...e,texts:n,resultText:r,toolUseCount:o,errorMessages:s,terminalReason:i,hasTerminal:d}}function Ld(t){return (t??"unknown").trim().toLowerCase().replace(/_/g,"-")}function Gr(){return new ne("OpenCode returned no assistant output.",_n,{code:"EMPTY_OUTPUT",kind:"transient"})}function Ff(){return new ne("OpenCode emitted malformed JSON output.",_n,{code:"PROVIDER_CRASHED",kind:"transient"})}function Nd(t,e){switch(Ld(t)){case "length":return new ne("OpenCode stopped because the context window was exceeded.",_n,{code:"UNKNOWN",kind:"permanent"});case "content-filter":return new ne("OpenCode stopped because the content filter blocked the response.",_n,{code:"UNKNOWN",kind:"permanent"});case "error":return new ne(e?`OpenCode error: ${e}`:`${Cd} while generating a response.`,_n,{code:"PROVIDER_CRASHED",kind:"transient"});default:return null}}var Mf,_n,Cd,xd,Hf,ds,cs=v(()=>{h();Ft();Kn();gn();jt();Mf=new Set(["step_start","step_finish"]),_n="cli/opencode",Cd="OpenCode provider error",xd=240,Hf={build:{agent:"build",autoApprove:false},"build-auto":{agent:"build",autoApprove:true},plan:{agent:"plan",autoApprove:false},"plan-auto":{agent:"plan",autoApprove:true}};ds={command:"opencode",meta:{displayName:"OpenCode",capabilities:{resume:true}},buildArgs(t,e,n){let r=e.additionalArgs,o=r!==void 0?[...r]:["run"];Wr(o,"--format")||o.push("--format","json"),e.resumeSessionId&&!o.includes("-s")&&!o.includes("--session")&&o.push("-s",e.resumeSessionId);let{agent:s,autoApprove:i}=$f(e.mode);Wr(o,"--agent")||s!==void 0&&o.push("--agent",s),i&&!Wr(o,"--auto")&&o.push("--auto"),e.effort!==void 0&&!Wr(o,"--variant")&&o.push("--variant",e.effort),e.model&&o.push("--model",e.model);let d;return !n&&!i&&!e.env?.OPENCODE_PERMISSION&&(d={OPENCODE_PERMISSION:JSON.stringify({external_directory:"allow"})}),{args:o,stdinMessage:t,env:d}},extractText(t){let e=Od(t),n=e.errorMessages[0];if(n){let i=Nd("error",n);if(i)throw i}let r=Nd(e.terminalReason??"",void 0);if(r)throw r;let o=e.texts.length>0?e.texts[e.texts.length-1]:void 0;if(o!==void 0){if(!e.hasTerminal)throw Gr();return o}if(e.resultText?.trim()){if(!e.hasTerminal)throw Gr();return e.resultText}if(e.malformed)throw Ff();if(!e.hasTerminal)throw Gr();let s=Ld(e.terminalReason);if((s==="stop"||s==="tool-calls")&&e.toolUseCount>0)return "";throw Gr()},interpretExit(t,e,n=""){if(t===0)return null;let o=Od(n).errorMessages[0];return o?new ne(`OpenCode error: ${o}`,_n,{code:"PROVIDER_CRASHED",kind:"transient"}):null},parseResultMeta(t){let e=hn(t);return e?{usage:{inputTokens:e.inputTokens,outputTokens:e.outputTokens,cachedInputTokens:e.cachedInputTokens,costUsd:0},model:null}:{usage:null,model:null}},parseEvent(t,e){let n=e??new Date().toISOString(),r=[],o;try{JSON.parse(t),o=[t];}catch{o=Pd(t),o.length>1&&console.warn("[opencode] parseEvent: falling back to concatenated-JSON split for a malformed line");}for(let s of o){let i;try{i=JSON.parse(s);}catch{continue}let d=tt(i,n),c=i.type;if(c){if(c==="text"){let f=i.part?.text;f&&r.push({timestamp:d,type:"text",content:f});continue}if(c==="tool_use"){let u=i.part;if(!u)continue;let f=String(u.tool||""),p=String(u.callID||""),g=u.state,_=String(g?.status||""),m=g?.input,k=et(m);if(r.push({timestamp:d,type:"tool_use",toolName:f,toolUseId:p,toolInput:k}),_==="completed"&&g?.output!==void 0){let T=g.output,E=typeof T=="string"?T:JSON.stringify(T);r.push({timestamp:d,type:"tool_result",toolUseId:p,resultPreview:E,isError:false});}else _==="error"&&r.push({timestamp:d,type:"tool_result",toolUseId:p,resultPreview:String(g?.error||"tool error"),isError:true});continue}if(c==="error"){let u=Dd(i);r.push({timestamp:d,type:"error",content:u,errorMessage:u});continue}}}return r},suppressOutputLine(t){let e=t.trim();if(!e.startsWith("{")||!e.endsWith("}"))return false;try{let r=JSON.parse(e).type;return r?Mf.has(r):!1}catch{return false}}};});function Vn(t,e){return t.some(n=>n===e||n.startsWith(`${e}=`))}function Bf(t,e){if(!(t?At(us).some(s=>s.id===t):false)||!t)return e;let r=Gn(us,t),o=rd(us)[t]?.defaultEffort;if(r.length!==0)return e?r.includes(e)?e:o&&r.includes(o)?o:void 0:o}var us,ls,ps=v(()=>{h();Ft();Wn();qt();zn();us="antigravity";ls={command:"agy",meta:{displayName:"Antigravity",models:ad(),defaultTimeoutMs:{query:12e4,execute:3e5},defaultIdleMs:0},buildArgs(t,e,n){let{model:r,effort:o}=vt(e.model),s=ts(r),i=s.model,d=e.effort??o??s.effort,c=Bf(i,d),u=e.additionalArgs??[],f=i&&!Vn(u,"--model")?["--model",i]:[],p=Vn(u,"--effort")?[]:wd(c),g=Vn(u,"--mode")||Vn(u,"--dangerously-skip-permissions")?[]:Td(e.mode),_=Vn(u,"--print")?[]:["--print",t];return {args:[...f,...p,...g,...u,..._]}},extractText(t){let e=t.trim();if(!e)throw new ne("Antigravity CLI returned empty output with exit code 0. agy may have hidden an auth/quota/model error in its log file; inspect ~/.gemini/antigravity-cli/log for details.","cli/antigravity",{code:"EMPTY_OUTPUT",kind:"transient"});return e},parseResultMeta(t){return {usage:null,model:null}},parseEvent(t,e){return []}};});var Md=v(()=>{h();pn();gn();fn();jt();});function kn(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Tn(t){return kn(t)?t:void 0}function Ne(t){return typeof t=="string"?t:void 0}function zt(t){let e=typeof t=="number"?t:Number(t??0);return Number.isFinite(e)?e:0}function zf(t){let e=[],n=-1,r=0,o=false,s=false;for(let i=0;i<t.length;i+=1){let d=t[i];if(n===-1){(d==="{"||d==="[")&&(n=i,r=1);continue}if(s){s=false;continue}if(d==="\\"&&o){s=true;continue}if(d==='"'){o=!o;continue}o||(d==="{"||d==="["?r+=1:(d==="}"||d==="]")&&(r-=1,r===0&&(e.push(t.slice(n,i+1)),n=-1)));}return n!==-1&&e.push(t.slice(n)),e}function Jn(t){let e=t.trim();if(!e)return [];try{let n=JSON.parse(e);return kn(n)?[n]:[]}catch{return zf(e).flatMap(n=>{try{let r=JSON.parse(n);return kn(r)?[r]:[]}catch{return []}})}}function Bd(t){let e=JSON.stringify(t);return e===void 0?String(t):e}function Gt(t){if(typeof t=="string")return t;if(Array.isArray(t)){let e=t.map(Gt).filter(n=>n!==void 0);return e.length>0?e.join(`
|
|
48
|
+
`):void 0}if(kn(t)){if(typeof t.text=="string")return t.text;if(typeof t.message=="string")return t.message;if(typeof t.error=="string")return t.error;if(t.type==="text"&&typeof t.data=="string")return t.data;for(let e of ["content","FileContent","rawOutput"]){let n=Gt(t[e]);if(n!==void 0)return n}}}function Kf(t){let e=i=>Array.isArray(i)&&i.every(d=>Number.isInteger(d)&&d>=0&&d<=255),n=i=>typeof i=="string"&&i.trim().length>0?i:void 0,r=i=>new TextDecoder("utf-8",{fatal:false}).decode(Uint8Array.from(i)),o=i=>{let d=JSON.stringify(i,(c,u)=>e(u)?`<bytes:${u.length}>`:u);return d===void 0?String(i):d},s=t.rawOutput;if(s!=null){let i=Tn(s);if(!i)return n(Gt(s))??o(s);let d;if(e(i.output)&&i.output.length>0&&(d=n(r(i.output))),!d&&e(i.stdout)&&i.stdout.length>0&&(d=n(r(i.stdout))),!d){let f=Tn(i.Result);d=n(i.output)??n(f?.output)??n(Gt(s));}let c=e(i.stderr)&&i.stderr.length>0?r(i.stderr):void 0;if(c!==void 0)if(d){let f=d.endsWith(`
|
|
43
49
|
`)||d.endsWith("\r")?"":`
|
|
44
|
-
`;d=`${d}${f}${c}`;}else d=n(c);if(d)return d;let u=n(i.summary)??n(
|
|
45
|
-
`).flatMap(
|
|
46
|
-
`),o=r.length
|
|
47
|
-
`).flatMap(
|
|
48
|
-
`).flatMap(
|
|
49
|
-
`)??"";if(!n.trim())return;let r=Bd(t.provider);if(!r)return;let o;try{o=r.parseResultMeta?.(n);}catch{return {stdout:n,adapter:r}}let s=zf(o?.model,t.model),i=o?.usage;if(!i)return {stdout:n,adapter:r};let d=jr(i.inputTokens),c=jr(i.outputTokens),u=jr(i.cachedInputTokens),f=Oa(jr(i.costUsd),d,c,u,s);return d!==0||c!==0||u!==0||f!==0?{stdout:n,adapter:r,usage:{inputTokens:d,outputTokens:c,cachedInputTokens:u,costUsd:f,model:s}}:{stdout:n,adapter:r}}var ls=v(()=>{h();qd();Cr();});function Vf(t){if(t)try{let e=JSON.parse(t);if(typeof e!="object"||e===null||Array.isArray(e))return;let n=e.terminalReason;return typeof n=="string"&&Kf.has(n)?n:void 0}catch{return}}function vt(t){switch(t.status){case "stopped":case "runner_lost":case "pending":case "running":case "paused":case "success":return t.status;case "completed":case "done":return "success";case "error":return "failed";case "failed":{let e=Vf(t.metadata);return e==="user_stop"?"stopped":e==="runner_lost"?"runner_lost":e==="launch_failed"?"failed":typeof t.error=="string"&&exports.LEGACY_TASK_TERMINAL_ERROR_PATTERNS.stopped.test(t.error)?"stopped":typeof t.error=="string"&&exports.LEGACY_TASK_TERMINAL_ERROR_PATTERNS.runnerLost.test(t.error)?"runner_lost":"failed"}default:return t.status}}exports.TASK_TERMINAL_STATUSES=void 0;exports.LEGACY_TASK_TERMINAL_ERROR_PATTERNS=void 0;var Kf,zn=v(()=>{h();exports.TASK_TERMINAL_STATUSES=["success","failed","stopped","runner_lost"],exports.LEGACY_TASK_TERMINAL_ERROR_PATTERNS={stopped:/^(Killed by user|Stopped by user|Cancelled by user|사용자에 의해 중지됨)/,runnerLost:/^Reaped: (process not found|pid never recorded|stale workflow run)/},Kf=new Set(["user_stop","runner_lost","launch_failed"]);});function ks(t,e,n=1){let r=process.env[t];if(r===void 0||r==="")return e;let o=Number(r);return !Number.isFinite(o)||o<=0?e:Math.max(n,Math.trunc(o))}function zr(){return ks("CREWX_TASK_HEARTBEAT_MS",1e4,200)}function Wt(){return ks("CREWX_TASK_HEARTBEAT_STALE_MS",3e4)}function Kn(){return ks("CREWX_TASK_HEARTBEAT_HARD_STALE_MS",18e5)}function mn(t){return typeof t=="number"&&Number.isFinite(t)?Math.trunc(t):0}function Gr(t){let e=typeof t=="object"&&t!==null&&"code"in t?String(t.code):t instanceof Error?t.name:typeof t;console.warn(`[crewx] task heartbeat write failed (${e}); execution continues`);}function Yf(t){return t?{id:t.id,status:t.status,run_epoch:t.run_epoch,stop_requested_at:t.stop_requested_at,stop_requested_epoch:t.stop_requested_epoch,pid:t.pid,metadata:t.metadata,started_at:t.started_at,duration_ms:t.duration_ms}:null}function jd(t,e){return !!t.stop_requested_at&&mn(t.stop_requested_epoch)===mn(e)}function gs(t,e){let n=mn(e.runEpoch);if(!(e.writeHeartbeat===false?true:t.heartbeatTask({id:e.taskId,runEpoch:n})))return {accepted:false,row:null};let o=Yf(t.getTask(e.taskId));return !o||o.status!=="running"||mn(o.run_epoch)!==n?{accepted:false,row:o}:{accepted:true,row:o}}function Wd(t,e){let n=exports.taskHeartbeatRegistry.get(t);return !n||e&&n!==e?false:(clearInterval(n.timer),exports.taskHeartbeatRegistry.delete(t),true)}function Gd(t,e){let n=exports.taskHeartbeatRegistry.get(t);return !n||e!==void 0&&n.runEpoch!==mn(e)?false:Wd(t,n)}function Xf(t,e){let n=mn(e.runEpoch);Gd(e.taskId);let r=true,o=null;try{let u=gs(t,{...e,runEpoch:n});r=u.accepted,o=u.row;}catch(u){Gr(u);}if(!r)return false;let s=zr(),i=Math.min(s,1e3),d=setInterval(()=>{let u=exports.taskHeartbeatRegistry.get(e.taskId);if(!(!u||u.timer!==d))try{u.heartbeatElapsedMs+=i;let f=u.heartbeatElapsedMs>=s,p=gs(t,{taskId:e.taskId,runEpoch:n,writeHeartbeat:f});if(!p.accepted){Wd(e.taskId,u);return}f&&(u.heartbeatElapsedMs%=s,u.lastHeartbeatAt=Date.now()),p.row&&jd(p.row,n)&&!u.stopRequested&&(u.stopRequested=!0,e.onStopRequested&&Promise.resolve(e.onStopRequested(p.row)).catch(Gr));}catch(f){Gr(f);}},i),c={timer:d,runEpoch:n,stopRequested:false,lastHeartbeatAt:Date.now(),heartbeatElapsedMs:0};return exports.taskHeartbeatRegistry.set(e.taskId,c),typeof d=="object"&&d!==null&&"unref"in d&&d.unref(),o&&jd(o,n)&&e.onStopRequested&&(c.stopRequested=true,Promise.resolve(e.onStopRequested(o)).catch(Gr)),true}exports.TASK_HEARTBEAT_INTERVAL_MS=void 0;exports.TASK_HEARTBEAT_STALE_MS=void 0;exports.TASK_HEARTBEAT_HARD_STALE_MS=void 0;exports.TASK_STOP_POLL_INTERVAL_MS=void 0;exports.taskHeartbeatRegistry=void 0;var Vn=v(()=>{h();exports.TASK_HEARTBEAT_INTERVAL_MS=1e4,exports.TASK_HEARTBEAT_STALE_MS=3e4,exports.TASK_HEARTBEAT_HARD_STALE_MS=18e5,exports.TASK_STOP_POLL_INTERVAL_MS=1e3;exports.taskHeartbeatRegistry=new Map;});function Ss(t,e=Date.now(),n=exports.TASK_STOP_DEFAULT_GRACE_MS){let r=t?Date.parse(t):Number.NaN,o=typeof e=="number"?e:Date.parse(e),s=Es(n,exports.TASK_STOP_DEFAULT_GRACE_MS,0);return Number.isFinite(r)&&Number.isFinite(o)&&o-r>s?"forced":"cooperative"}function Es(t,e,n){return t===void 0||!Number.isFinite(t)?e:Math.max(n,Math.trunc(t))}function Zd(t){if(!t)return {};try{let e=JSON.parse(t);if(typeof e=="object"&&e!==null&&!Array.isArray(e))return e}catch{}return {}}function Qf(t){if(!t)return;let e=Zd(t.metadata).stopMethod;return e==="cooperative"||e==="forced"?e:void 0}function gt(t,e){if(!t)return {status:"not_running",finalStatus:"not_running",...e?{pid:e}:{}};let n=typeof t.pid=="number"&&t.pid>0?t.pid:e;if(t.status==="stopped"){let r=Qf(t);return {status:"stopped",finalStatus:t.status,...r?{method:r}:{},...n?{pid:n}:{}}}return {status:"not_running",finalStatus:t.status,...n?{pid:n}:{}}}function ec(t,e,n="Process owner could not be verified"){let r=e??(t.pid&&t.pid>0?t.pid:void 0);return {status:"ownership_unverified",finalStatus:t.status,...r?{pid:r}:{},error:n}}function ye(t,e,n){let r=n??(t?.pid&&t.pid>0?t.pid:void 0);return {status:"failed",finalStatus:t?.status??null,...r?{pid:r}:{},error:e}}function Ts(t,e){return ye(t,exports.INSTRUCTION_STOP_GENERATION_ALREADY_SETTLED,e)}function Zf(t,e){if(!t.heartbeat_at)return false;let n=Date.parse(t.heartbeat_at);return Number.isFinite(n)?e-n<=Wt():false}function eg(t){return {...t.processControlOptions,...t.platform?{platform:t.platform}:{}}}function tg(t){let e=typeof t.pid=="number"&&t.pid>0?t.pid:void 0,n=Zd(t.metadata),r=n.ownership==="runner"&&typeof n.providerPid=="number"&&Number.isSafeInteger(n.providerPid)&&n.providerPid>0?n.providerPid:void 0;return [...new Set([e,r].filter(o=>o!==void 0))]}function ng(t,e,n){let r=t.getTask(e);if(!r||r.status!=="running")return gt(r,n)}async function rg(t,e,n,r){let o=Date.now()+n;for(;;){let s=ng(t,e);if(s)return s;let i=o-Date.now();if(i<=0)return;await new Promise(d=>{setTimeout(d,Math.min(r,i));});}}async function zd(t,e,n){let r=new Date().toISOString(),o={origin:n.origin??"internal",...n.callerPid!==void 0?{callerPid:n.callerPid}:{},...n.callerTaskId!==void 0?{callerTaskId:n.callerTaskId}:{}},s=t.requestTaskStop({id:e,requestedAt:r,...o}),i=t.getTask(e);if(!s.accepted){if(s.status==="pending"){let L=t.stopPendingTask(e,void 0,void 0,{...o,at:r}),y=t.getTask(e);if(L||!y||y.status!=="running")return gt(y);if(s=t.requestTaskStop({id:e,requestedAt:r,...o}),!s.accepted&&s.status!=="running"||!s.accepted&&!s.alreadyRequestedAt)return gt(t.getTask(e))}else if(!(s.status==="running"&&s.alreadyRequestedAt))return gt(i)}let d=s.runEpoch,c=Es(n.graceMs,exports.TASK_STOP_DEFAULT_GRACE_MS,0),u=Es(n.pollMs,exports.TASK_STOP_DEFAULT_POLL_MS,1),f=await rg(t,e,c,u);if(f)return f;let p=t.getTask(e);if(!p||p.status!=="running")return gt(p);let g=tg(p),_=g[0];if(!_){let L=t.finalizeTaskStop({id:e,runEpoch:d,method:"forced"}),y=t.getTask(e);return L||y?.status!=="running"?gt(y):ye(y,"Failed to finalize task stop")}let m=eg(n),k="unknown";if(!Zf(p,Date.now())){let L=n.processControl?.checkProcessOwnershipAsync??qo;try{k=await L(_,n.ownershipMarkers??exports.TASK_STOP_OWNED_PROCESS_MARKERS,m);}catch{k="unknown";}if(k!=="owned")return ec(p)}let T=n.processControl?.terminateProcessTree??jo;for(let L of g){let y;try{y=await T(L,{...m,signal:Bo});}catch(N){y={status:"failed",pid:L,method:m.platform==="win32"?"taskkill":"process-group",error:N instanceof Error?N.message:String(N)};}if(y.status==="failed")return ye(t.getTask(e),y.error??"Failed to terminate process tree")}let E=t.finalizeTaskStop({id:e,runEpoch:d,method:"forced"}),b=t.getTask(e);return E||b?.status!=="running"?gt(b,_):ye(b,"Task changed before stop was finalized")}function Kd(t){return typeof t=="number"&&Number.isSafeInteger(t)&&t>0}function Vd(t){return Number.isSafeInteger(t)&&t>=0}function ws(t){return typeof t=="number"&&Number.isFinite(t)?Math.trunc(t):0}function og(t){return {...t.processControlOptions,...t.platform?{platform:t.platform}:{}}}async function tc(t,e){let n=t.getTask(e.taskId);if(!n||n.status!=="running")return Ts(n,Kd(e.targetPid)?e.targetPid:void 0);if(!Vd(e.sourceRunEpoch)||!Vd(e.settleRunEpoch)||ws(n.run_epoch)!==e.settleRunEpoch)return ye(n,exports.INSTRUCTION_STOP_EPOCH_MISMATCH,e.targetPid);if(e.workspaceId!==void 0&&n.workspace_id!==e.workspaceId)return ye(n,exports.INSTRUCTION_STOP_WORKSPACE_MISMATCH,e.targetPid);let r=new Date().toISOString(),o;try{o=t.requestTaskStop({id:e.taskId,requestedAt:r,sourceRunEpoch:e.sourceRunEpoch,settleRunEpoch:e.settleRunEpoch,...e.workspaceId!==void 0?{workspaceId:e.workspaceId}:{}});}catch{return ye(n,exports.INSTRUCTION_STOP_REQUEST_FAILED,e.targetPid)}let s=t.getTask(e.taskId);if(!s||s.status!=="running")return Ts(s,e.targetPid);if(o.runEpoch!==e.settleRunEpoch||ws(s.run_epoch)!==e.settleRunEpoch)return ye(s,exports.INSTRUCTION_STOP_EPOCH_MISMATCH,e.targetPid);if(e.workspaceId!==void 0&&s.workspace_id!==e.workspaceId)return ye(s,exports.INSTRUCTION_STOP_WORKSPACE_MISMATCH,e.targetPid);if(!Kd(e.targetPid))return ye(s,exports.INSTRUCTION_STOP_TARGET_PID_MISSING);let i=og(e),d=e.processControl?.checkProcessOwnershipAsync??qo,c="unknown";try{c=await d(e.targetPid,e.ownershipMarkers??exports.TASK_STOP_OWNED_PROCESS_MARKERS,i);}catch{c="unknown";}if(c!=="owned")return ec(s,e.targetPid);let u=t.getTask(e.taskId);if(!u||u.status!=="running")return Ts(u,e.targetPid);if(ws(u.run_epoch)!==e.settleRunEpoch)return ye(u,exports.INSTRUCTION_STOP_EPOCH_MISMATCH,e.targetPid);if(e.workspaceId!==void 0&&u.workspace_id!==e.workspaceId)return ye(u,exports.INSTRUCTION_STOP_WORKSPACE_MISMATCH,e.targetPid);let f=e.processControl?.terminateProcessTree??jo,p;try{p=await f(e.targetPid,{...i,signal:Bo});}catch{return ye(t.getTask(e.taskId),exports.INSTRUCTION_STOP_PROCESS_TERMINATION_FAILED,e.targetPid)}if(p.status==="failed")return ye(t.getTask(e.taskId),exports.INSTRUCTION_STOP_PROCESS_TERMINATION_FAILED,e.targetPid);let g;try{g=t.finalizeTaskStop({id:e.taskId,runEpoch:e.settleRunEpoch,method:"forced"});}catch{return ye(t.getTask(e.taskId),exports.INSTRUCTION_STOP_SETTLE_CAS_FAILED,e.targetPid)}return g?gt(t.getTask(e.taskId),e.targetPid):ye(t.getTask(e.taskId),exports.INSTRUCTION_STOP_SETTLE_CAS_FAILED,e.targetPid)}function Is(t,e,n={}){if(typeof t=="string"){let r=t,o=e??{};return Promise.resolve().then(()=>(Jn(),nc)).then(({TaskRepository:s})=>zd(new s,r,o))}return zd(t,e,n)}exports.TASK_STOP_DEFAULT_GRACE_MS=void 0;exports.TASK_STOP_DEFAULT_POLL_MS=void 0;exports.TASK_STOP_OWNED_PROCESS_MARKERS=void 0;exports.INSTRUCTION_STOP_TARGET_PID_MISSING=void 0;exports.INSTRUCTION_STOP_EPOCH_MISMATCH=void 0;exports.INSTRUCTION_STOP_WORKSPACE_MISMATCH=void 0;exports.INSTRUCTION_STOP_GENERATION_ALREADY_SETTLED=void 0;exports.INSTRUCTION_STOP_PROCESS_TERMINATION_FAILED=void 0;exports.INSTRUCTION_STOP_SETTLE_CAS_FAILED=void 0;exports.INSTRUCTION_STOP_REQUEST_FAILED=void 0;var As=v(()=>{h();Wo();Vn();exports.TASK_STOP_DEFAULT_GRACE_MS=5e3,exports.TASK_STOP_DEFAULT_POLL_MS=250;exports.TASK_STOP_OWNED_PROCESS_MARKERS=["crewx","claude","codex","opencode","grok","node"],exports.INSTRUCTION_STOP_TARGET_PID_MISSING="INSTRUCTION_STOP_TARGET_PID_MISSING",exports.INSTRUCTION_STOP_EPOCH_MISMATCH="INSTRUCTION_STOP_EPOCH_MISMATCH",exports.INSTRUCTION_STOP_WORKSPACE_MISMATCH="INSTRUCTION_STOP_WORKSPACE_MISMATCH",exports.INSTRUCTION_STOP_GENERATION_ALREADY_SETTLED="INSTRUCTION_STOP_GENERATION_ALREADY_SETTLED",exports.INSTRUCTION_STOP_PROCESS_TERMINATION_FAILED="INSTRUCTION_STOP_PROCESS_TERMINATION_FAILED",exports.INSTRUCTION_STOP_SETTLE_CAS_FAILED="INSTRUCTION_STOP_SETTLE_CAS_FAILED",exports.INSTRUCTION_STOP_REQUEST_FAILED="INSTRUCTION_STOP_REQUEST_FAILED";});var nc={};yu(nc,{DEFAULT_TASK_REAPER_TICK_INTERVAL_MS:()=>exports.DEFAULT_TASK_REAPER_TICK_INTERVAL_MS,HOST_SHUTDOWN_TERMINAL_ERROR:()=>ic,PENDING_ADOPT_GRACE_MS:()=>dc,PID_NULL_REAP_GRACE_MS:()=>Ms,TASK_HEARTBEAT_HARD_STALE_MS:()=>exports.TASK_HEARTBEAT_HARD_STALE_MS,TASK_HEARTBEAT_INTERVAL_MS:()=>exports.TASK_HEARTBEAT_INTERVAL_MS,TASK_HEARTBEAT_STALE_MS:()=>exports.TASK_HEARTBEAT_STALE_MS,TaskRepository:()=>exports.TaskRepository,hasRecordedUsage:()=>Rn,mergeTerminalReason:()=>eo,resolveTaskHeartbeatHardStaleMs:()=>Kn,resolveTaskHeartbeatIntervalMs:()=>zr,resolveTaskHeartbeatStaleMs:()=>Wt});function tt(t){return {...t,status:vt(t)}}function Os(t){return {...t,status:vt(t)}}function Cs(t=exports.tasks.model,e=exports.tasks.metadata){let n=drizzleOrm.sql`
|
|
50
|
+
`;d=`${d}${f}${c}`;}else d=n(c);if(d)return d;let u=n(i.summary)??n(Gt(t.content))??n(i.output_for_prompt);return u!==void 0?u:o(s)}if(t.content!==null&&t.content!==void 0)return Gt(t.content)??o(t.content);if(t.result!==null&&t.result!==void 0)return Gt(t.result)??o(t.result)}function qd(t){let e=Tn(t.error),n=[t.message,t.errorMessage,e?.message,e?.detail,typeof t.error=="string"?t.error:void 0].find(r=>typeof r=="string"&&r.trim().length>0);return n?jd(n):"Grok CLI reported an error."}function jd(t){return (t.replace(Gf,"").split(/\r?\n/).map(n=>n.trim()).filter(Boolean)[0]??t.trim()).slice(0,500)}function Fd(t){return Wf.test(t)}function Vf(t){let e=Tn(t.modelUsage);return e?Object.keys(e)[0]??null:null}function Jf(t){let e=Tn(t.usage);if(!e)return null;let n=zt(e.cache_read_input_tokens);return {inputTokens:zt(e.input_tokens)+n,cachedInputTokens:n,outputTokens:zt(e.output_tokens),costUsd:zt(t.total_cost_usd)}}function Yf(t){let e=0,n=0,r=0,o=false,s=new Set;for(let i of t.split(`
|
|
51
|
+
`).flatMap(Jn)){if(i.type!=="usage")continue;let d=Tn(i.usage);if(!d)continue;let c=Ne(i.signature);if(c&&c.length>0){let f=`signature:${c}`;if(s.has(f))continue;s.add(f);}let u=zt(d.cache_read_input_tokens);e+=zt(d.input_tokens)+u,n+=u,r+=zt(d.output_tokens),o=true;}return o?{inputTokens:e,cachedInputTokens:n,outputTokens:r,costUsd:0}:null}function Xf(t,e){if(!Array.isArray(e.entries)||e.entries.length===0)return [];let n=[];for(let s of e.entries.slice(0,Hd)){if(!kn(s))continue;let i=Ne(s.content)?.trim();if(!i)continue;let d=Ne(s.status)?.trim(),c=Ne(s.priority)?.trim(),u=[d?`status=${d}`:void 0,c?`priority=${c}`:void 0].filter(p=>!!p),f=u.length>0?` (${u.join(", ")})`:"";n.push(`- ${i}${f}`);}if(n.length===0)return [];e.entries.length>Hd&&n.push(Ud);let r=n.join(`
|
|
52
|
+
`),o=r.length>$d?`${r.slice(0,$d-1)}${Ud}`:r;return [{timestamp:t,type:"info",content:o}]}function Qf(t,e){let n=Ne(e.type);if(n==="thought"){let r=Ne(e.data);return r===void 0?[]:[{timestamp:t,type:"thinking",content:r}]}if(n==="text"){let r=Ne(e.data);return r===void 0?[]:[{timestamp:t,type:"text",content:r}]}if(n==="plan")return Xf(t,e);if(n==="tool_call"){let r=Ne(e.toolCallId),o=Ne(e.toolName)??Ne(e.title),s=e.rawInput===void 0?void 0:Bd(e.rawInput);return [{timestamp:t,type:"tool_use",toolUseId:r,toolName:o,toolInput:s}]}if(n==="tool_call_update"){let r=Ne(e.status);if(r!=="completed"&&r!=="failed"&&r!=="error")return [];let o=Kf(e),s=r!=="completed"||e.isError===true;return [{timestamp:t,type:"tool_result",toolUseId:Ne(e.toolCallId),toolName:Ne(e.toolName)??Ne(e.title),...o!==void 0?Ze(o,s):{isError:s}}]}if(n==="error"){let r=qd(e);return [{timestamp:t,type:"error",content:r,errorMessage:r}]}return []}var zr,jf,Wf,Gf,Hd,$d,Ud,fs,gs=v(()=>{h();Ft();Jo();qt();fn();zn();jt();zr="cli/grok",jf=new Set(["available_commands","usage","end"]),Wf=/(?:rate[\s_-]*limit|quota|usage[\s_-]*limit|too many requests|limit(?:ed|ing)?\s+(?:exceeded|reached))/i,Gf=/\u001b\[[0-?]*[ -/]*[@-~]/g,Hd=20,$d=4e3,Ud="\u2026";fs={command:"grok",createSessionId:()=>crypto.randomUUID(),meta:{displayName:"Grok",capabilities:{resume:true}},buildArgs(t,e){let{model:n,effort:r}=vt(e.model),o=e.effort??r,s=e.resumeSessionId?["--resume",e.resumeSessionId]:e.providerSessionId?["--session-id",e.providerSessionId]:[],i=n?["--model",n]:[],d=n?At("grok").some(L=>L.id===n):false,c=n&&d?Gn("grok",n):[],u=!o||c.length===0||c.includes(o)?o:void 0,f=kd(u),p=e.additionalArgs??[],g=L=>p.some(y=>y===L||y.startsWith(`${L}=`)),_=e.providerOptions,m=_?.alwaysApprove,k=_?.sandbox,T=g("--permission-mode")?[]:hd(e.mode),E=g("--always-approve")?[]:_d(m),b=g("--sandbox")?[]:md(k);return {args:["--no-auto-update",...s,"--single",t,"--output-format","streaming-json","--no-alt-screen",...i,...f,...T,...E,...b,...p]}},extractText(t){let e=[],n=false;for(let r of t.split(`
|
|
53
|
+
`).flatMap(Jn))typeof r.type=="string"&&(n=true),r.type==="text"&&typeof r.data=="string"&&e.push(r.data);return e.length>0?e.join(""):n?"":t.trim()},extractFailure(t){for(let e of Jn(t))if(e.type==="error"){let n=qd(e);return Fd(Bd(e))?new Bt(n,zr):new ne(n,zr)}return null},interpretExit(t,e){if(t===0)return null;let n=jd(e)||`Grok CLI exited with code ${t}.`;return Fd(e)?new Bt(n,zr):new ne(n,zr)},parseResultMeta(t){let n=t.split(`
|
|
54
|
+
`).flatMap(Jn).find(r=>r.type==="end");return n?{usage:Jf(n),model:Vf(n)}:{usage:Yf(t),model:null}},parseEvent(t,e){let n=e??new Date().toISOString();return Jn(t).flatMap(r=>Qf(tt(r,n),r))},suppressOutputLine(t){let e=t.trim();if(!e.startsWith("{")||!e.endsWith("}"))return false;try{let n=JSON.parse(e);return kn(n)&&typeof n.type=="string"?jf.has(n.type):!1}catch{return false}}};});var Wd,Gd=v(()=>{h();rs();ss();as();cs();ps();Md();gs();rs();ss();as();cs();ps();gs();pn();Wd={codex:is,claude:jr,opencode:ds,antigravity:ls,copilot:os,grok:fs};});function zd(t){if(t.startsWith("cli/"))return Wd[t.slice(4)]}var Kd=v(()=>{h();Va();Gd();});function Kr(t){return typeof t=="number"&&Number.isFinite(t)?t:0}function Zf(t,e){return typeof t=="string"&&t.length>0?t:typeof e=="string"&&e.length>0?e:null}function Vr(t){if(typeof t.provider!="string"||t.provider.length===0)return;let n=t.taskLogRepository.readLogs(t.taskId)?.entries.filter(g=>g.level==="stdout").map(g=>g.message).join(`
|
|
55
|
+
`)??"";if(!n.trim())return;let r=zd(t.provider);if(!r)return;let o;try{o=r.parseResultMeta?.(n);}catch{return {stdout:n,adapter:r}}let s=Zf(o?.model,t.model),i=o?.usage;if(!i)return {stdout:n,adapter:r};let d=Kr(i.inputTokens),c=Kr(i.outputTokens),u=Kr(i.cachedInputTokens),f=Da(Kr(i.costUsd),d,c,u,s);return d!==0||c!==0||u!==0||f!==0?{stdout:n,adapter:r,usage:{inputTokens:d,outputTokens:c,cachedInputTokens:u,costUsd:f,model:s}}:{stdout:n,adapter:r}}var hs=v(()=>{h();Kd();Lr();});function tg(t){if(t)try{let e=JSON.parse(t);if(typeof e!="object"||e===null||Array.isArray(e))return;let n=e.terminalReason;return typeof n=="string"&&eg.has(n)?n:void 0}catch{return}}function Nt(t){switch(t.status){case "stopped":case "runner_lost":case "pending":case "running":case "paused":case "success":return t.status;case "completed":case "done":return "success";case "error":return "failed";case "failed":{let e=tg(t.metadata);return e==="user_stop"?"stopped":e==="runner_lost"?"runner_lost":e==="launch_failed"?"failed":typeof t.error=="string"&&exports.LEGACY_TASK_TERMINAL_ERROR_PATTERNS.stopped.test(t.error)?"stopped":typeof t.error=="string"&&exports.LEGACY_TASK_TERMINAL_ERROR_PATTERNS.runnerLost.test(t.error)?"runner_lost":"failed"}default:return t.status}}exports.TASK_TERMINAL_STATUSES=void 0;exports.LEGACY_TASK_TERMINAL_ERROR_PATTERNS=void 0;var eg,Yn=v(()=>{h();exports.TASK_TERMINAL_STATUSES=["success","failed","stopped","runner_lost"],exports.LEGACY_TASK_TERMINAL_ERROR_PATTERNS={stopped:/^(Killed by user|Stopped by user|Cancelled by user|사용자에 의해 중지됨)/,runnerLost:/^Reaped: (process not found|pid never recorded|stale workflow run)/},eg=new Set(["user_stop","runner_lost","launch_failed"]);});function Rs(t,e,n=1){let r=process.env[t];if(r===void 0||r==="")return e;let o=Number(r);return !Number.isFinite(o)||o<=0?e:Math.max(n,Math.trunc(o))}function Yr(){return Rs("CREWX_TASK_HEARTBEAT_MS",1e4,200)}function Kt(){return Rs("CREWX_TASK_HEARTBEAT_STALE_MS",3e4)}function Xn(){return Rs("CREWX_TASK_HEARTBEAT_HARD_STALE_MS",18e5)}function yn(t){return typeof t=="number"&&Number.isFinite(t)?Math.trunc(t):0}function Jr(t){let e=typeof t=="object"&&t!==null&&"code"in t?String(t.code):t instanceof Error?t.name:typeof t;console.warn(`[crewx] task heartbeat write failed (${e}); execution continues`);}function rg(t){return t?{id:t.id,status:t.status,run_epoch:t.run_epoch,stop_requested_at:t.stop_requested_at,stop_requested_epoch:t.stop_requested_epoch,pid:t.pid,metadata:t.metadata,started_at:t.started_at,duration_ms:t.duration_ms}:null}function Vd(t,e){return !!t.stop_requested_at&&yn(t.stop_requested_epoch)===yn(e)}function ks(t,e){let n=yn(e.runEpoch);if(!(e.writeHeartbeat===false?true:t.heartbeatTask({id:e.taskId,runEpoch:n})))return {accepted:false,row:null};let o=rg(t.getTask(e.taskId));return !o||o.status!=="running"||yn(o.run_epoch)!==n?{accepted:false,row:o}:{accepted:true,row:o}}function Jd(t,e){let n=exports.taskHeartbeatRegistry.get(t);return !n||e&&n!==e?false:(clearInterval(n.timer),exports.taskHeartbeatRegistry.delete(t),true)}function Yd(t,e){let n=exports.taskHeartbeatRegistry.get(t);return !n||e!==void 0&&n.runEpoch!==yn(e)?false:Jd(t,n)}function og(t,e){let n=yn(e.runEpoch);Yd(e.taskId);let r=true,o=null;try{let u=ks(t,{...e,runEpoch:n});r=u.accepted,o=u.row;}catch(u){Jr(u);}if(!r)return false;let s=Yr(),i=Math.min(s,1e3),d=setInterval(()=>{let u=exports.taskHeartbeatRegistry.get(e.taskId);if(!(!u||u.timer!==d))try{u.heartbeatElapsedMs+=i;let f=u.heartbeatElapsedMs>=s,p=ks(t,{taskId:e.taskId,runEpoch:n,writeHeartbeat:f});if(!p.accepted){Jd(e.taskId,u);return}f&&(u.heartbeatElapsedMs%=s,u.lastHeartbeatAt=Date.now()),p.row&&Vd(p.row,n)&&!u.stopRequested&&(u.stopRequested=!0,e.onStopRequested&&Promise.resolve(e.onStopRequested(p.row)).catch(Jr));}catch(f){Jr(f);}},i),c={timer:d,runEpoch:n,stopRequested:false,lastHeartbeatAt:Date.now(),heartbeatElapsedMs:0};return exports.taskHeartbeatRegistry.set(e.taskId,c),typeof d=="object"&&d!==null&&"unref"in d&&d.unref(),o&&Vd(o,n)&&e.onStopRequested&&(c.stopRequested=true,Promise.resolve(e.onStopRequested(o)).catch(Jr)),true}exports.TASK_HEARTBEAT_INTERVAL_MS=void 0;exports.TASK_HEARTBEAT_STALE_MS=void 0;exports.TASK_HEARTBEAT_HARD_STALE_MS=void 0;exports.TASK_STOP_POLL_INTERVAL_MS=void 0;exports.taskHeartbeatRegistry=void 0;var Qn=v(()=>{h();exports.TASK_HEARTBEAT_INTERVAL_MS=1e4,exports.TASK_HEARTBEAT_STALE_MS=3e4,exports.TASK_HEARTBEAT_HARD_STALE_MS=18e5,exports.TASK_STOP_POLL_INTERVAL_MS=1e3;exports.taskHeartbeatRegistry=new Map;});function vs(t,e=Date.now(),n=exports.TASK_STOP_DEFAULT_GRACE_MS){let r=t?Date.parse(t):Number.NaN,o=typeof e=="number"?e:Date.parse(e),s=As(n,exports.TASK_STOP_DEFAULT_GRACE_MS,0);return Number.isFinite(r)&&Number.isFinite(o)&&o-r>s?"forced":"cooperative"}function As(t,e,n){return t===void 0||!Number.isFinite(t)?e:Math.max(n,Math.trunc(t))}function oc(t){if(!t)return {};try{let e=JSON.parse(t);if(typeof e=="object"&&e!==null&&!Array.isArray(e))return e}catch{}return {}}function sg(t){if(!t)return;let e=oc(t.metadata).stopMethod;return e==="cooperative"||e==="forced"?e:void 0}function _t(t,e){if(!t)return {status:"not_running",finalStatus:"not_running",...e?{pid:e}:{}};let n=typeof t.pid=="number"&&t.pid>0?t.pid:e;if(t.status==="stopped"){let r=sg(t);return {status:"stopped",finalStatus:t.status,...r?{method:r}:{},...n?{pid:n}:{}}}return {status:"not_running",finalStatus:t.status,...n?{pid:n}:{}}}function sc(t,e,n="Process owner could not be verified"){let r=e??(t.pid&&t.pid>0?t.pid:void 0);return {status:"ownership_unverified",finalStatus:t.status,...r?{pid:r}:{},error:n}}function ye(t,e,n){let r=n??(t?.pid&&t.pid>0?t.pid:void 0);return {status:"failed",finalStatus:t?.status??null,...r?{pid:r}:{},error:e}}function Es(t,e){return ye(t,exports.INSTRUCTION_STOP_GENERATION_ALREADY_SETTLED,e)}function ig(t,e){if(!t.heartbeat_at)return false;let n=Date.parse(t.heartbeat_at);return Number.isFinite(n)?e-n<=Kt():false}function ag(t){return {...t.processControlOptions,...t.platform?{platform:t.platform}:{}}}function dg(t){let e=typeof t.pid=="number"&&t.pid>0?t.pid:void 0,n=oc(t.metadata),r=n.ownership==="runner"&&typeof n.providerPid=="number"&&Number.isSafeInteger(n.providerPid)&&n.providerPid>0?n.providerPid:void 0;return [...new Set([e,r].filter(o=>o!==void 0))]}function cg(t,e,n){let r=t.getTask(e);if(!r||r.status!=="running")return _t(r,n)}async function ug(t,e,n,r){let o=Date.now()+n;for(;;){let s=cg(t,e);if(s)return s;let i=o-Date.now();if(i<=0)return;await new Promise(d=>{setTimeout(d,Math.min(r,i));});}}async function Xd(t,e,n){let r=new Date().toISOString(),o={origin:n.origin??"internal",...n.callerPid!==void 0?{callerPid:n.callerPid}:{},...n.callerTaskId!==void 0?{callerTaskId:n.callerTaskId}:{}},s=t.requestTaskStop({id:e,requestedAt:r,...o}),i=t.getTask(e);if(!s.accepted){if(s.status==="pending"){let L=t.stopPendingTask(e,void 0,void 0,{...o,at:r}),y=t.getTask(e);if(L||!y||y.status!=="running")return _t(y);if(s=t.requestTaskStop({id:e,requestedAt:r,...o}),!s.accepted&&s.status!=="running"||!s.accepted&&!s.alreadyRequestedAt)return _t(t.getTask(e))}else if(!(s.status==="running"&&s.alreadyRequestedAt))return _t(i)}let d=s.runEpoch,c=As(n.graceMs,exports.TASK_STOP_DEFAULT_GRACE_MS,0),u=As(n.pollMs,exports.TASK_STOP_DEFAULT_POLL_MS,1),f=await ug(t,e,c,u);if(f)return f;let p=t.getTask(e);if(!p||p.status!=="running")return _t(p);let g=dg(p),_=g[0];if(!_){let L=t.finalizeTaskStop({id:e,runEpoch:d,method:"forced"}),y=t.getTask(e);return L||y?.status!=="running"?_t(y):ye(y,"Failed to finalize task stop")}let m=ag(n),k="unknown";if(!ig(p,Date.now())){let L=n.processControl?.checkProcessOwnershipAsync??zo;try{k=await L(_,n.ownershipMarkers??exports.TASK_STOP_OWNED_PROCESS_MARKERS,m);}catch{k="unknown";}if(k!=="owned")return sc(p)}let T=n.processControl?.terminateProcessTree??Ko;for(let L of g){let y;try{y=await T(L,{...m,signal:Go});}catch(N){y={status:"failed",pid:L,method:m.platform==="win32"?"taskkill":"process-group",error:N instanceof Error?N.message:String(N)};}if(y.status==="failed")return ye(t.getTask(e),y.error??"Failed to terminate process tree")}let E=t.finalizeTaskStop({id:e,runEpoch:d,method:"forced"}),b=t.getTask(e);return E||b?.status!=="running"?_t(b,_):ye(b,"Task changed before stop was finalized")}function Qd(t){return typeof t=="number"&&Number.isSafeInteger(t)&&t>0}function Zd(t){return Number.isSafeInteger(t)&&t>=0}function Ss(t){return typeof t=="number"&&Number.isFinite(t)?Math.trunc(t):0}function lg(t){return {...t.processControlOptions,...t.platform?{platform:t.platform}:{}}}async function ic(t,e){let n=t.getTask(e.taskId);if(!n||n.status!=="running")return Es(n,Qd(e.targetPid)?e.targetPid:void 0);if(!Zd(e.sourceRunEpoch)||!Zd(e.settleRunEpoch)||Ss(n.run_epoch)!==e.settleRunEpoch)return ye(n,exports.INSTRUCTION_STOP_EPOCH_MISMATCH,e.targetPid);if(e.workspaceId!==void 0&&n.workspace_id!==e.workspaceId)return ye(n,exports.INSTRUCTION_STOP_WORKSPACE_MISMATCH,e.targetPid);let r=new Date().toISOString(),o;try{o=t.requestTaskStop({id:e.taskId,requestedAt:r,sourceRunEpoch:e.sourceRunEpoch,settleRunEpoch:e.settleRunEpoch,...e.workspaceId!==void 0?{workspaceId:e.workspaceId}:{}});}catch{return ye(n,exports.INSTRUCTION_STOP_REQUEST_FAILED,e.targetPid)}let s=t.getTask(e.taskId);if(!s||s.status!=="running")return Es(s,e.targetPid);if(o.runEpoch!==e.settleRunEpoch||Ss(s.run_epoch)!==e.settleRunEpoch)return ye(s,exports.INSTRUCTION_STOP_EPOCH_MISMATCH,e.targetPid);if(e.workspaceId!==void 0&&s.workspace_id!==e.workspaceId)return ye(s,exports.INSTRUCTION_STOP_WORKSPACE_MISMATCH,e.targetPid);if(!Qd(e.targetPid))return ye(s,exports.INSTRUCTION_STOP_TARGET_PID_MISSING);let i=lg(e),d=e.processControl?.checkProcessOwnershipAsync??zo,c="unknown";try{c=await d(e.targetPid,e.ownershipMarkers??exports.TASK_STOP_OWNED_PROCESS_MARKERS,i);}catch{c="unknown";}if(c!=="owned")return sc(s,e.targetPid);let u=t.getTask(e.taskId);if(!u||u.status!=="running")return Es(u,e.targetPid);if(Ss(u.run_epoch)!==e.settleRunEpoch)return ye(u,exports.INSTRUCTION_STOP_EPOCH_MISMATCH,e.targetPid);if(e.workspaceId!==void 0&&u.workspace_id!==e.workspaceId)return ye(u,exports.INSTRUCTION_STOP_WORKSPACE_MISMATCH,e.targetPid);let f=e.processControl?.terminateProcessTree??Ko,p;try{p=await f(e.targetPid,{...i,signal:Go});}catch{return ye(t.getTask(e.taskId),exports.INSTRUCTION_STOP_PROCESS_TERMINATION_FAILED,e.targetPid)}if(p.status==="failed")return ye(t.getTask(e.taskId),exports.INSTRUCTION_STOP_PROCESS_TERMINATION_FAILED,e.targetPid);let g;try{g=t.finalizeTaskStop({id:e.taskId,runEpoch:e.settleRunEpoch,method:"forced"});}catch{return ye(t.getTask(e.taskId),exports.INSTRUCTION_STOP_SETTLE_CAS_FAILED,e.targetPid)}return g?_t(t.getTask(e.taskId),e.targetPid):ye(t.getTask(e.taskId),exports.INSTRUCTION_STOP_SETTLE_CAS_FAILED,e.targetPid)}function Ns(t,e,n={}){if(typeof t=="string"){let r=t,o=e??{};return Promise.resolve().then(()=>(Zn(),ac)).then(({TaskRepository:s})=>Xd(new s,r,o))}return Xd(t,e,n)}exports.TASK_STOP_DEFAULT_GRACE_MS=void 0;exports.TASK_STOP_DEFAULT_POLL_MS=void 0;exports.TASK_STOP_OWNED_PROCESS_MARKERS=void 0;exports.INSTRUCTION_STOP_TARGET_PID_MISSING=void 0;exports.INSTRUCTION_STOP_EPOCH_MISMATCH=void 0;exports.INSTRUCTION_STOP_WORKSPACE_MISMATCH=void 0;exports.INSTRUCTION_STOP_GENERATION_ALREADY_SETTLED=void 0;exports.INSTRUCTION_STOP_PROCESS_TERMINATION_FAILED=void 0;exports.INSTRUCTION_STOP_SETTLE_CAS_FAILED=void 0;exports.INSTRUCTION_STOP_REQUEST_FAILED=void 0;var Cs=v(()=>{h();Vo();Qn();exports.TASK_STOP_DEFAULT_GRACE_MS=5e3,exports.TASK_STOP_DEFAULT_POLL_MS=250;exports.TASK_STOP_OWNED_PROCESS_MARKERS=["crewx","claude","codex","opencode","grok","node"],exports.INSTRUCTION_STOP_TARGET_PID_MISSING="INSTRUCTION_STOP_TARGET_PID_MISSING",exports.INSTRUCTION_STOP_EPOCH_MISMATCH="INSTRUCTION_STOP_EPOCH_MISMATCH",exports.INSTRUCTION_STOP_WORKSPACE_MISMATCH="INSTRUCTION_STOP_WORKSPACE_MISMATCH",exports.INSTRUCTION_STOP_GENERATION_ALREADY_SETTLED="INSTRUCTION_STOP_GENERATION_ALREADY_SETTLED",exports.INSTRUCTION_STOP_PROCESS_TERMINATION_FAILED="INSTRUCTION_STOP_PROCESS_TERMINATION_FAILED",exports.INSTRUCTION_STOP_SETTLE_CAS_FAILED="INSTRUCTION_STOP_SETTLE_CAS_FAILED",exports.INSTRUCTION_STOP_REQUEST_FAILED="INSTRUCTION_STOP_REQUEST_FAILED";});var ac={};Iu(ac,{DEFAULT_TASK_REAPER_TICK_INTERVAL_MS:()=>exports.DEFAULT_TASK_REAPER_TICK_INTERVAL_MS,HOST_SHUTDOWN_TERMINAL_ERROR:()=>lc,PENDING_ADOPT_GRACE_MS:()=>fc,PID_NULL_REAP_GRACE_MS:()=>Fs,TASK_HEARTBEAT_HARD_STALE_MS:()=>exports.TASK_HEARTBEAT_HARD_STALE_MS,TASK_HEARTBEAT_INTERVAL_MS:()=>exports.TASK_HEARTBEAT_INTERVAL_MS,TASK_HEARTBEAT_STALE_MS:()=>exports.TASK_HEARTBEAT_STALE_MS,TaskRepository:()=>exports.TaskRepository,hasRecordedUsage:()=>In,mergeTerminalReason:()=>oo,resolveTaskHeartbeatHardStaleMs:()=>Xn,resolveTaskHeartbeatIntervalMs:()=>Yr,resolveTaskHeartbeatStaleMs:()=>Kt});function rt(t){return {...t,status:Nt(t)}}function Ps(t){return {...t,status:Nt(t)}}function Ls(t=exports.tasks.model,e=exports.tasks.metadata){let n=drizzleOrm.sql`
|
|
50
56
|
CASE
|
|
51
57
|
WHEN ${t} LIKE 'claude-%' OR ${t} IN ('opus', 'sonnet', 'haiku', 'opus[1m]', 'sonnet[1m]') THEN 'claude'
|
|
52
58
|
WHEN ${t} LIKE 'gpt-%' OR ${t} LIKE 'codex-%' THEN 'codex'
|
|
@@ -75,7 +81,7 @@ ${r.join(`
|
|
|
75
81
|
WHEN trim(${i}) = '' THEN 'unknown'
|
|
76
82
|
ELSE ${i}
|
|
77
83
|
END
|
|
78
|
-
`}function
|
|
84
|
+
`}function rr(t){return drizzleOrm.sql`${t} NOT IN (${drizzleOrm.sql.join(wg.map(e=>drizzleOrm.sql`${e}`),drizzleOrm.sql`, `)})`}function eo(t){let e=drizzleOrm.sql`
|
|
79
85
|
CASE
|
|
80
86
|
WHEN json_valid(${t}) = 1
|
|
81
87
|
THEN json_extract(${t}, '$.usageAccounting')
|
|
@@ -85,7 +91,7 @@ ${r.join(`
|
|
|
85
91
|
COALESCE(SUM(
|
|
86
92
|
CASE WHEN ${e} = 'unavailable' THEN 1 ELSE 0 END
|
|
87
93
|
), 0)
|
|
88
|
-
`}function yn(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function le(t){if(!t)return {};try{let e=JSON.parse(t);return yn(e)?{...e}:{}}catch{return {}}}function Zr(t){return t==null||t===""}function Ps(t,e){return Zr(t)&&!Zr(e)?e:t}function gg(t,e){let n=le(t);if(!e)return n;for(let[r,o]of Object.entries(e))Zr(n[r])&&!Zr(o)&&(n[r]=o);return n}function Xr(t,e){let n=t.origin&&ac.has(t.origin)?t.origin:"internal",r=t.callerPid!==void 0&&Number.isInteger(t.callerPid)&&t.callerPid>0?t.callerPid:process.pid;return {origin:n,at:t.at??e,callerPid:r,...t.callerTaskId?{callerTaskId:t.callerTaskId}:{}}}function hg(t){let e=le(t).stopRequest;if(yn(e)&&!(typeof e.origin!="string"||!ac.has(e.origin)||typeof e.at!="string"||typeof e.callerPid!="number"))return {...e}}function oc(){return drizzleOrm.or(drizzleOrm.isNull(exports.tasks.stop_requested_at),drizzleOrm.ne(drizzleOrm.sql`COALESCE(${exports.tasks.stop_requested_epoch}, 0)`,drizzleOrm.sql`COALESCE(${exports.tasks.run_epoch}, 0)`))}function eo(t,e){let n=le(t??null);return n.terminalReason=e,JSON.stringify(n)}function Ds(t,e){let n={...t,terminalReason:"user_stop"},r=e?.trim();return r&&r!==rc&&(n[lg]=e),{error:rc,metadata:n}}function Re(t){return typeof t=="number"&&Number.isFinite(t)?t:0}function Rn(t){return Re(t.input_tokens)!==0||Re(t.output_tokens)!==0||Re(t.cached_input_tokens)!==0||Re(t.cost_usd)!==0}function Z(t){return typeof t=="number"&&Number.isFinite(t)?Math.trunc(t):0}function sc(t){return {inputTokens:Re(t.inputTokens??0),outputTokens:Re(t.outputTokens??0),cachedInputTokens:Re(t.cachedInputTokens??0),costUsd:Re(t.costUsd??0)}}function _g(t){if(yn(t))return {inputTokens:Re(t.inputTokens),outputTokens:Re(t.outputTokens),cachedInputTokens:Re(t.cachedInputTokens),costUsd:Re(t.costUsd)}}function mg(t){let e={inputTokens:0,outputTokens:0,cachedInputTokens:0,costUsd:0};for(let n of Object.values(t)){let r=_g(n);r&&(e.inputTokens+=r.inputTokens,e.outputTokens+=r.outputTokens,e.cachedInputTokens+=r.cachedInputTokens,e.costUsd+=r.costUsd);}return e}function Qr(t,e,n){let r=Date.parse(t),o=Date.parse(e);return Number.isFinite(r)&&Number.isFinite(o)?o-r:n??null}var Ns,kn,cg,Tn,wn,ug,xs,Qn,nt,rc,ic,lg,pg,fg,ac,Ms,dc;exports.DEFAULT_TASK_REAPER_TICK_INTERVAL_MS=void 0;exports.TaskRepository=void 0;var Jn=v(()=>{h();se();fe();ce();pe();ue();Cr();Wo();xr();ls();zn();Vn();As();Vn();Ns=40,kn="2026-05-09",cg="0.8.9-rc.13",Tn=10,wn=parseInt(cg.split("rc.")[1]);ug=new Set(["workflow","mcp"]),xs="usageByEpoch",Qn="lateUsage",nt="usageAccounting",rc="Stopped by user",ic="Stopped by app shutdown",lg="terminalErrorOriginal",pg=new Set(["stopped","runner_lost"]),fg=["pending","running"];ac=new Set(["http","cli","instruction","workflow","internal"]);Ms=600*1e3,dc=600*1e3,exports.DEFAULT_TASK_REAPER_TICK_INTERVAL_MS=300*1e3,exports.TaskRepository=class extends exports.BaseSqliteRepository{dbPath;clock;taskLogRepository;lastReaperTickAt;pidNullObservedSince=new Map;constructor(e={}){super(),this.clock=e.clock??(()=>Date.now()),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=Se.join(e.dbRoot,".crewx","crewx.db")),this.taskLogRepository=new exports.TaskLogRepository({dbPath:this.dbPath});}resolveDbPath(){return this.dbPath?ze(this.dbPath):super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=Se.dirname(n);Sa.existsSync(o)||Sa.mkdirSync(o,{recursive:true});}else if(!Sa.existsSync(n))throw new exports.RepositoryError("NOT_FOUND","Database not found");let r=C(n);if(e)try{V(r.db,n);}catch(o){throw r.close(),o}return r}heartbeatTask(e){let n=this.openHandle(true);try{let r=Z(e.runEpoch),o=r===0?drizzleOrm.or(drizzleOrm.eq(exports.tasks.run_epoch,0),drizzleOrm.isNull(exports.tasks.run_epoch)):drizzleOrm.eq(exports.tasks.run_epoch,r);return n.db.update(exports.tasks).set({heartbeat_at:new Date(this.clock()).toISOString()}).where(drizzleOrm.and(drizzleOrm.eq(exports.tasks.id,e.id),o,drizzleOrm.eq(exports.tasks.status,"running"))).run().changes>0}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to heartbeat task",r)}finally{n.close();}}requestTaskStop(e){if(!this.dbExists())return {accepted:false,status:"not_running",runEpoch:0};let n=this.openHandle(true);try{let r={accepted:!1,status:"not_running",runEpoch:0};return n.db.transaction(o=>{let s=o.select({id:exports.tasks.id,status:exports.tasks.status,run_epoch:exports.tasks.run_epoch,stop_requested_at:exports.tasks.stop_requested_at,stop_requested_epoch:exports.tasks.stop_requested_epoch,metadata:exports.tasks.metadata}).from(exports.tasks).where(drizzleOrm.eq(exports.tasks.id,e.id)).limit(1).get();if(!s)return;let i=Z(s.run_epoch);if(s.status!=="running"){r={accepted:!1,status:s.status,runEpoch:i};return}let d=s.stop_requested_at!==null&&Z(s.stop_requested_epoch)===i,c=d?s.stop_requested_at:e.requestedAt,u=le(s.metadata),f=d?hg(s.metadata)??Xr({origin:e.origin,at:c,callerPid:e.callerPid,callerTaskId:e.callerTaskId},c):Xr({origin:e.origin,at:c,callerPid:e.callerPid,callerTaskId:e.callerTaskId},c);if(o.update(exports.tasks).set({stop_requested_at:e.requestedAt,stop_requested_epoch:drizzleOrm.sql`${exports.tasks.run_epoch}`,metadata:JSON.stringify({...u,stopRequest:f})}).where(drizzleOrm.and(drizzleOrm.eq(exports.tasks.id,e.id),drizzleOrm.eq(exports.tasks.status,"running"),oc())).run().changes===0){let m=o.select({status:exports.tasks.status,run_epoch:exports.tasks.run_epoch,stop_requested_at:exports.tasks.stop_requested_at,stop_requested_epoch:exports.tasks.stop_requested_epoch}).from(exports.tasks).where(drizzleOrm.eq(exports.tasks.id,e.id)).limit(1).get();if(!m||m.status!=="running"){r={accepted:!1,status:m?.status??"not_running",runEpoch:Z(m?.run_epoch)};return}r={accepted:!1,status:m.status,runEpoch:Z(m.run_epoch),...m.stop_requested_at&&Z(m.stop_requested_epoch)===Z(m.run_epoch)?{alreadyRequestedAt:m.stop_requested_at}:{}};}else r={accepted:!0,status:s.status,runEpoch:i};let g=new Set([e.id]),_=(m,k)=>{if(k>=8)return;let T=o.select({id:exports.tasks.id,status:exports.tasks.status,metadata:exports.tasks.metadata}).from(exports.tasks).where(drizzleOrm.and(drizzleOrm.eq(exports.tasks.parent_task_id,m),drizzleOrm.eq(exports.tasks.status,"running"))).all();for(let E of T)g.has(E.id)||(g.add(E.id),o.update(exports.tasks).set({stop_requested_at:c,stop_requested_epoch:drizzleOrm.sql`${exports.tasks.run_epoch}`,metadata:JSON.stringify({...le(E.metadata),stopRequest:f})}).where(drizzleOrm.and(drizzleOrm.eq(exports.tasks.id,E.id),drizzleOrm.eq(exports.tasks.status,"running"),oc())).run(),_(E.id,k+1));};_(e.id,0);},{behavior:"immediate"}),r}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to request task stop",r)}finally{n.close();}}requestTaskStopForInstruction(e){if(!this.dbExists())return {accepted:false,status:"not_running",runEpoch:0};let n=this.openHandle(true);try{let r={accepted:!1,status:"not_running",runEpoch:0};return n.db.transaction(o=>{let s=o.select({id:exports.tasks.id,status:exports.tasks.status,run_epoch:exports.tasks.run_epoch,workspace_id:exports.tasks.workspace_id,stop_requested_at:exports.tasks.stop_requested_at,stop_requested_epoch:exports.tasks.stop_requested_epoch,metadata:exports.tasks.metadata}).from(exports.tasks).where(drizzleOrm.eq(exports.tasks.id,e.id)).limit(1).get();if(!s)return;let i=Z(s.run_epoch),d=Z(e.sourceRunEpoch),c=Z(e.settleRunEpoch);if(s.status!=="running"||i!==c||e.workspaceId!==void 0&&s.workspace_id!==e.workspaceId){r={accepted:!1,status:s.status,runEpoch:i};return}let u=c===0?drizzleOrm.or(drizzleOrm.eq(exports.tasks.run_epoch,0),drizzleOrm.isNull(exports.tasks.run_epoch)):drizzleOrm.eq(exports.tasks.run_epoch,c),f=drizzleOrm.or(drizzleOrm.isNull(exports.tasks.stop_requested_at),drizzleOrm.isNull(exports.tasks.stop_requested_epoch),drizzleOrm.ne(exports.tasks.stop_requested_epoch,d)),p=Xr({origin:"instruction",at:e.requestedAt,callerPid:e.callerPid,callerTaskId:e.callerTaskId},e.requestedAt),g=T=>o.update(exports.tasks).set({stop_requested_at:e.requestedAt,stop_requested_epoch:d,metadata:JSON.stringify({...le(s.metadata),stopRequest:p})}).where(drizzleOrm.and(drizzleOrm.eq(exports.tasks.id,e.id),drizzleOrm.eq(exports.tasks.status,"running"),u,T,f)).run();if((e.workspaceId===void 0?g():e.workspaceId===null?g(drizzleOrm.isNull(exports.tasks.workspace_id)):g(drizzleOrm.eq(exports.tasks.workspace_id,e.workspaceId))).changes>0){r={accepted:!0,status:s.status,runEpoch:c};return}let m=o.select({status:exports.tasks.status,run_epoch:exports.tasks.run_epoch,stop_requested_at:exports.tasks.stop_requested_at,stop_requested_epoch:exports.tasks.stop_requested_epoch}).from(exports.tasks).where(drizzleOrm.eq(exports.tasks.id,e.id)).limit(1).get();if(!m||m.status!=="running"){r={accepted:!1,status:m?.status??"not_running",runEpoch:Z(m?.run_epoch)};return}let k=Z(m.run_epoch);r={accepted:!1,status:m.status,runEpoch:k,...m.stop_requested_at&&Z(m.stop_requested_epoch)===d?{alreadyRequestedAt:m.stop_requested_at}:{}};},{behavior:"immediate"}),r}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to request instruction task stop",r)}finally{n.close();}}finalizeTaskStop(e){if(!this.dbExists())return false;let n=this.openHandle(true);try{let r=e.completedAt??new Date(this.clock()).toISOString(),o=!1;return n.db.transaction(s=>{let i=s.select({status:exports.tasks.status,run_epoch:exports.tasks.run_epoch,stop_requested_at:exports.tasks.stop_requested_at,stop_requested_epoch:exports.tasks.stop_requested_epoch,started_at:exports.tasks.started_at,duration_ms:exports.tasks.duration_ms,metadata:exports.tasks.metadata}).from(exports.tasks).where(drizzleOrm.eq(exports.tasks.id,e.id)).limit(1).get();if(!i||i.status!=="running"||Z(i.run_epoch)!==Z(e.runEpoch))return;let d=i.stop_requested_at!==null&&Z(i.stop_requested_epoch)===Z(e.runEpoch),c=le(i.metadata),u=d?Ds(c,e.error):{error:e.error??null,metadata:e.terminalReason===void 0?{...c}:{...c,terminalReason:e.terminalReason}},f={...u.metadata,stopMethod:e.method},p=i.duration_ms??e.durationMs??Qr(i.started_at,r,void 0),g=i.run_epoch===null?drizzleOrm.isNull(exports.tasks.run_epoch):drizzleOrm.eq(exports.tasks.run_epoch,i.run_epoch);o=s.update(exports.tasks).set({status:"stopped",error:u.error,completed_at:r,duration_ms:p,metadata:JSON.stringify(f)}).where(drizzleOrm.and(drizzleOrm.eq(exports.tasks.id,e.id),drizzleOrm.eq(exports.tasks.status,"running"),g)).run().changes>0;},{behavior:"immediate"}),o}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to finalize task stop",r)}finally{n.close();}}finalizeTaskForHostShutdown(e){if(!this.dbExists())return "not_running";let n=this.openHandle(true);try{let r=e.completedAt??new Date(this.clock()).toISOString(),o=Z(e.expectedRunEpoch),s="not_running";return n.db.transaction(i=>{let d=i.select({status:exports.tasks.status,run_epoch:exports.tasks.run_epoch,workspace_id:exports.tasks.workspace_id,started_at:exports.tasks.started_at,duration_ms:exports.tasks.duration_ms,metadata:exports.tasks.metadata}).from(exports.tasks).where(drizzleOrm.eq(exports.tasks.id,e.id)).limit(1).get();if(!d||d.status!=="running"){s="not_running";return}if(Z(d.run_epoch)!==o){s="epoch_mismatch";return}if(e.workspaceId!==void 0&&d.workspace_id!==e.workspaceId){s="workspace_mismatch";return}let u=d.run_epoch===null?drizzleOrm.isNull(exports.tasks.run_epoch):drizzleOrm.eq(exports.tasks.run_epoch,d.run_epoch),f=e.workspaceId===void 0?void 0:e.workspaceId===null?drizzleOrm.isNull(exports.tasks.workspace_id):drizzleOrm.eq(exports.tasks.workspace_id,e.workspaceId),p={...le(d.metadata),terminalReason:"runner_lost"},g=d.duration_ms??Qr(d.started_at,r,void 0);s=i.update(exports.tasks).set({status:"runner_lost",error:ic,completed_at:r,duration_ms:g,metadata:JSON.stringify(p)}).where(drizzleOrm.and(drizzleOrm.eq(exports.tasks.id,e.id),drizzleOrm.eq(exports.tasks.status,"running"),u,f)).run().changes>0?"settled":"not_running";},{behavior:"immediate"}),s}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to finalize task for host shutdown",r)}finally{n.close();}}async stopTask(e,n={}){return Is(this,e,n)}async stopTaskGenerationForInstruction(e){return tc({requestTaskStop:n=>this.requestTaskStopForInstruction(n),getTask:n=>this.getTask(n),finalizeTaskStop:n=>this.finalizeTaskStop(n)},e)}startTask(e){let n=this.openHandle(true);try{let r={id:e.id,agent_id:e.agentId,actor_kind:e.actorKind??null,actor_id:e.actorId??null,user_id:e.userId??null,prompt:e.prompt,mode:e.mode,status:e.status,started_at:e.startedAt,pid:e.pid??null,parent_task_id:e.parentTaskId??null,caller_agent_id:e.callerAgentId??null,trace_id:e.traceId??null,command:e.command??null,metadata:e.metadata??null,workspace_id:e.workspaceId??null,cwd:e.cwd??null,project_id:e.projectId??null,platform:e.platform??"cli",crewx_version:e.crewxVersion??null,thread_id:e.threadId??null,model:e.model??null,rendered_prompt:e.renderedPrompt??null,coding_agent_command:e.codingAgentCommand??null,log_storage:"events"},o=s=>{n.db.insert(exports.tasks).values(s).onConflictDoUpdate({target:exports.tasks.id,set:{status:drizzleOrm.sql`CASE WHEN ${exports.tasks.status} = 'pending' AND ${exports.tasks.pid} IS NULL THEN 'running' ELSE ${exports.tasks.status} END`,pid:drizzleOrm.sql`COALESCE(excluded.pid, ${exports.tasks.pid})`,actor_kind:drizzleOrm.sql`CASE WHEN ${exports.tasks.status} IN ('pending', 'running') AND ${exports.tasks.pid} IS NULL AND ${exports.tasks.actor_kind} IS NULL AND COALESCE(${exports.tasks.run_epoch}, 0) = 0 THEN excluded.actor_kind ELSE ${exports.tasks.actor_kind} END`,actor_id:drizzleOrm.sql`CASE WHEN ${exports.tasks.status} IN ('pending', 'running') AND ${exports.tasks.pid} IS NULL AND ${exports.tasks.actor_kind} IS NULL AND COALESCE(${exports.tasks.run_epoch}, 0) = 0 THEN excluded.actor_id ELSE ${exports.tasks.actor_id} END`,command:drizzleOrm.sql`CASE WHEN ${exports.tasks.status} = 'pending' AND ${exports.tasks.pid} IS NULL THEN excluded.command ELSE ${exports.tasks.command} END`,metadata:drizzleOrm.sql`CASE WHEN ${exports.tasks.status} = 'pending' AND ${exports.tasks.pid} IS NULL THEN excluded.metadata ELSE ${exports.tasks.metadata} END`,workspace_id:drizzleOrm.sql`CASE WHEN ${exports.tasks.status} = 'pending' AND ${exports.tasks.pid} IS NULL THEN COALESCE(${exports.tasks.workspace_id}, excluded.workspace_id) ELSE ${exports.tasks.workspace_id} END`,cwd:drizzleOrm.sql`CASE WHEN ${exports.tasks.status} = 'pending' AND ${exports.tasks.pid} IS NULL THEN COALESCE(${exports.tasks.cwd}, excluded.cwd) ELSE ${exports.tasks.cwd} END`,project_id:drizzleOrm.sql`CASE WHEN ${exports.tasks.status} = 'pending' AND ${exports.tasks.pid} IS NULL THEN COALESCE(${exports.tasks.project_id}, excluded.project_id) ELSE ${exports.tasks.project_id} END`,crewx_version:drizzleOrm.sql`CASE WHEN ${exports.tasks.status} = 'pending' AND ${exports.tasks.pid} IS NULL THEN excluded.crewx_version ELSE ${exports.tasks.crewx_version} END`,model:drizzleOrm.sql`CASE WHEN ${exports.tasks.status} = 'pending' AND ${exports.tasks.pid} IS NULL THEN excluded.model ELSE ${exports.tasks.model} END`,rendered_prompt:drizzleOrm.sql`CASE WHEN ${exports.tasks.status} = 'pending' AND ${exports.tasks.pid} IS NULL THEN excluded.rendered_prompt ELSE ${exports.tasks.rendered_prompt} END`,coding_agent_command:drizzleOrm.sql`CASE WHEN ${exports.tasks.status} = 'pending' AND ${exports.tasks.pid} IS NULL THEN excluded.coding_agent_command ELSE ${exports.tasks.coding_agent_command} END`},setWhere:drizzleOrm.or(drizzleOrm.eq(exports.tasks.status,"running"),drizzleOrm.and(drizzleOrm.eq(exports.tasks.status,"pending"),drizzleOrm.isNull(exports.tasks.pid)))}).run();};try{o(r);}catch(s){let i=s instanceof Error?s.message:typeof s=="object"&&s!==null&&"message"in s?String(s.message):String(s);if(!/log_storage|heartbeat_at|stop_requested_at|stop_requested_epoch|cwd|actor_kind|actor_id/i.test(i)||!/no such column|no column named/i.test(i))throw s;let d=new Set(n.db.all("PRAGMA table_info(tasks)").map(Tu=>Tu.name)),c=d.has("cwd"),u=d.has("user_id"),f=d.has("actor_kind"),p=d.has("actor_id"),g=d.has("log_storage"),_=c?", cwd":"",m=c?", ?":"",k=c?", cwd = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN COALESCE(tasks.cwd, excluded.cwd) ELSE tasks.cwd END":"",T=g?", log_storage":"",E=g?", ?":"",b=u?", user_id":"",L=u?", ?":"",y=f?", actor_kind":"",N=f?", ?":"",P=p?", actor_id":"",oe=p?", ?":"",Pe=g?`,
|
|
94
|
+
`}function bn(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function le(t){if(!t)return {};try{let e=JSON.parse(t);return bn(e)?{...e}:{}}catch{return {}}}function ro(t){return t==null||t===""}function Hs(t,e){return ro(t)&&!ro(e)?e:t}function yg(t,e){let n=le(t);if(!e)return n;for(let[r,o]of Object.entries(e))ro(n[r])&&!ro(o)&&(n[r]=o);return n}function to(t,e){let n=t.origin&&pc.has(t.origin)?t.origin:"internal",r=t.callerPid!==void 0&&Number.isInteger(t.callerPid)&&t.callerPid>0?t.callerPid:process.pid;return {origin:n,at:t.at??e,callerPid:r,...t.callerTaskId?{callerTaskId:t.callerTaskId}:{}}}function Rg(t){let e=le(t).stopRequest;if(bn(e)&&!(typeof e.origin!="string"||!pc.has(e.origin)||typeof e.at!="string"||typeof e.callerPid!="number"))return {...e}}function cc(){return drizzleOrm.or(drizzleOrm.isNull(exports.tasks.stop_requested_at),drizzleOrm.ne(drizzleOrm.sql`COALESCE(${exports.tasks.stop_requested_epoch}, 0)`,drizzleOrm.sql`COALESCE(${exports.tasks.run_epoch}, 0)`))}function oo(t,e){let n=le(t??null);return n.terminalReason=e,JSON.stringify(n)}function $s(t,e){let n={...t,terminalReason:"user_stop"},r=e?.trim();return r&&r!==dc&&(n[kg]=e),{error:dc,metadata:n}}function Re(t){return typeof t=="number"&&Number.isFinite(t)?t:0}function In(t){return Re(t.input_tokens)!==0||Re(t.output_tokens)!==0||Re(t.cached_input_tokens)!==0||Re(t.cost_usd)!==0}function Z(t){return typeof t=="number"&&Number.isFinite(t)?Math.trunc(t):0}function uc(t){return {inputTokens:Re(t.inputTokens??0),outputTokens:Re(t.outputTokens??0),cachedInputTokens:Re(t.cachedInputTokens??0),costUsd:Re(t.costUsd??0)}}function Eg(t){if(bn(t))return {inputTokens:Re(t.inputTokens),outputTokens:Re(t.outputTokens),cachedInputTokens:Re(t.cachedInputTokens),costUsd:Re(t.costUsd)}}function Sg(t){let e={inputTokens:0,outputTokens:0,cachedInputTokens:0,costUsd:0};for(let n of Object.values(t)){let r=Eg(n);r&&(e.inputTokens+=r.inputTokens,e.outputTokens+=r.outputTokens,e.cachedInputTokens+=r.cachedInputTokens,e.costUsd+=r.costUsd);}return e}function no(t,e,n){let r=Date.parse(t),o=Date.parse(e);return Number.isFinite(r)&&Number.isFinite(o)?o-r:n??null}var Ds,Rn,_g,En,Sn,mg,Ms,nr,ot,dc,lc,kg,Tg,wg,pc,Fs,fc;exports.DEFAULT_TASK_REAPER_TICK_INTERVAL_MS=void 0;exports.TaskRepository=void 0;var Zn=v(()=>{h();se();fe();ce();pe();ue();Lr();Vo();Mr();hs();Yn();Qn();Cs();Qn();Ds=40,Rn="2026-05-09",_g="0.8.9-rc.13",En=10,Sn=parseInt(_g.split("rc.")[1]);mg=new Set(["workflow","mcp"]),Ms="usageByEpoch",nr="lateUsage",ot="usageAccounting",dc="Stopped by user",lc="Stopped by app shutdown",kg="terminalErrorOriginal",Tg=new Set(["stopped","runner_lost"]),wg=["pending","running"];pc=new Set(["http","cli","instruction","workflow","internal"]);Fs=600*1e3,fc=600*1e3,exports.DEFAULT_TASK_REAPER_TICK_INTERVAL_MS=300*1e3,exports.TaskRepository=class extends exports.BaseSqliteRepository{dbPath;clock;taskLogRepository;lastReaperTickAt;pidNullObservedSince=new Map;constructor(e={}){super(),this.clock=e.clock??(()=>Date.now()),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=Se.join(e.dbRoot,".crewx","crewx.db")),this.taskLogRepository=new exports.TaskLogRepository({dbPath:this.dbPath});}resolveDbPath(){return this.dbPath?Ke(this.dbPath):super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=Se.dirname(n);Oa.existsSync(o)||Oa.mkdirSync(o,{recursive:true});}else if(!Oa.existsSync(n))throw new exports.RepositoryError("NOT_FOUND","Database not found");let r=C(n);if(e)try{V(r.db,n);}catch(o){throw r.close(),o}return r}heartbeatTask(e){let n=this.openHandle(true);try{let r=Z(e.runEpoch),o=r===0?drizzleOrm.or(drizzleOrm.eq(exports.tasks.run_epoch,0),drizzleOrm.isNull(exports.tasks.run_epoch)):drizzleOrm.eq(exports.tasks.run_epoch,r);return n.db.update(exports.tasks).set({heartbeat_at:new Date(this.clock()).toISOString()}).where(drizzleOrm.and(drizzleOrm.eq(exports.tasks.id,e.id),o,drizzleOrm.eq(exports.tasks.status,"running"))).run().changes>0}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to heartbeat task",r)}finally{n.close();}}requestTaskStop(e){if(!this.dbExists())return {accepted:false,status:"not_running",runEpoch:0};let n=this.openHandle(true);try{let r={accepted:!1,status:"not_running",runEpoch:0};return n.db.transaction(o=>{let s=o.select({id:exports.tasks.id,status:exports.tasks.status,run_epoch:exports.tasks.run_epoch,stop_requested_at:exports.tasks.stop_requested_at,stop_requested_epoch:exports.tasks.stop_requested_epoch,metadata:exports.tasks.metadata}).from(exports.tasks).where(drizzleOrm.eq(exports.tasks.id,e.id)).limit(1).get();if(!s)return;let i=Z(s.run_epoch);if(s.status!=="running"){r={accepted:!1,status:s.status,runEpoch:i};return}let d=s.stop_requested_at!==null&&Z(s.stop_requested_epoch)===i,c=d?s.stop_requested_at:e.requestedAt,u=le(s.metadata),f=d?Rg(s.metadata)??to({origin:e.origin,at:c,callerPid:e.callerPid,callerTaskId:e.callerTaskId},c):to({origin:e.origin,at:c,callerPid:e.callerPid,callerTaskId:e.callerTaskId},c);if(o.update(exports.tasks).set({stop_requested_at:e.requestedAt,stop_requested_epoch:drizzleOrm.sql`${exports.tasks.run_epoch}`,metadata:JSON.stringify({...u,stopRequest:f})}).where(drizzleOrm.and(drizzleOrm.eq(exports.tasks.id,e.id),drizzleOrm.eq(exports.tasks.status,"running"),cc())).run().changes===0){let m=o.select({status:exports.tasks.status,run_epoch:exports.tasks.run_epoch,stop_requested_at:exports.tasks.stop_requested_at,stop_requested_epoch:exports.tasks.stop_requested_epoch}).from(exports.tasks).where(drizzleOrm.eq(exports.tasks.id,e.id)).limit(1).get();if(!m||m.status!=="running"){r={accepted:!1,status:m?.status??"not_running",runEpoch:Z(m?.run_epoch)};return}r={accepted:!1,status:m.status,runEpoch:Z(m.run_epoch),...m.stop_requested_at&&Z(m.stop_requested_epoch)===Z(m.run_epoch)?{alreadyRequestedAt:m.stop_requested_at}:{}};}else r={accepted:!0,status:s.status,runEpoch:i};let g=new Set([e.id]),_=(m,k)=>{if(k>=8)return;let T=o.select({id:exports.tasks.id,status:exports.tasks.status,metadata:exports.tasks.metadata}).from(exports.tasks).where(drizzleOrm.and(drizzleOrm.eq(exports.tasks.parent_task_id,m),drizzleOrm.eq(exports.tasks.status,"running"))).all();for(let E of T)g.has(E.id)||(g.add(E.id),o.update(exports.tasks).set({stop_requested_at:c,stop_requested_epoch:drizzleOrm.sql`${exports.tasks.run_epoch}`,metadata:JSON.stringify({...le(E.metadata),stopRequest:f})}).where(drizzleOrm.and(drizzleOrm.eq(exports.tasks.id,E.id),drizzleOrm.eq(exports.tasks.status,"running"),cc())).run(),_(E.id,k+1));};_(e.id,0);},{behavior:"immediate"}),r}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to request task stop",r)}finally{n.close();}}requestTaskStopForInstruction(e){if(!this.dbExists())return {accepted:false,status:"not_running",runEpoch:0};let n=this.openHandle(true);try{let r={accepted:!1,status:"not_running",runEpoch:0};return n.db.transaction(o=>{let s=o.select({id:exports.tasks.id,status:exports.tasks.status,run_epoch:exports.tasks.run_epoch,workspace_id:exports.tasks.workspace_id,stop_requested_at:exports.tasks.stop_requested_at,stop_requested_epoch:exports.tasks.stop_requested_epoch,metadata:exports.tasks.metadata}).from(exports.tasks).where(drizzleOrm.eq(exports.tasks.id,e.id)).limit(1).get();if(!s)return;let i=Z(s.run_epoch),d=Z(e.sourceRunEpoch),c=Z(e.settleRunEpoch);if(s.status!=="running"||i!==c||e.workspaceId!==void 0&&s.workspace_id!==e.workspaceId){r={accepted:!1,status:s.status,runEpoch:i};return}let u=c===0?drizzleOrm.or(drizzleOrm.eq(exports.tasks.run_epoch,0),drizzleOrm.isNull(exports.tasks.run_epoch)):drizzleOrm.eq(exports.tasks.run_epoch,c),f=drizzleOrm.or(drizzleOrm.isNull(exports.tasks.stop_requested_at),drizzleOrm.isNull(exports.tasks.stop_requested_epoch),drizzleOrm.ne(exports.tasks.stop_requested_epoch,d)),p=to({origin:"instruction",at:e.requestedAt,callerPid:e.callerPid,callerTaskId:e.callerTaskId},e.requestedAt),g=T=>o.update(exports.tasks).set({stop_requested_at:e.requestedAt,stop_requested_epoch:d,metadata:JSON.stringify({...le(s.metadata),stopRequest:p})}).where(drizzleOrm.and(drizzleOrm.eq(exports.tasks.id,e.id),drizzleOrm.eq(exports.tasks.status,"running"),u,T,f)).run();if((e.workspaceId===void 0?g():e.workspaceId===null?g(drizzleOrm.isNull(exports.tasks.workspace_id)):g(drizzleOrm.eq(exports.tasks.workspace_id,e.workspaceId))).changes>0){r={accepted:!0,status:s.status,runEpoch:c};return}let m=o.select({status:exports.tasks.status,run_epoch:exports.tasks.run_epoch,stop_requested_at:exports.tasks.stop_requested_at,stop_requested_epoch:exports.tasks.stop_requested_epoch}).from(exports.tasks).where(drizzleOrm.eq(exports.tasks.id,e.id)).limit(1).get();if(!m||m.status!=="running"){r={accepted:!1,status:m?.status??"not_running",runEpoch:Z(m?.run_epoch)};return}let k=Z(m.run_epoch);r={accepted:!1,status:m.status,runEpoch:k,...m.stop_requested_at&&Z(m.stop_requested_epoch)===d?{alreadyRequestedAt:m.stop_requested_at}:{}};},{behavior:"immediate"}),r}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to request instruction task stop",r)}finally{n.close();}}finalizeTaskStop(e){if(!this.dbExists())return false;let n=this.openHandle(true);try{let r=e.completedAt??new Date(this.clock()).toISOString(),o=!1;return n.db.transaction(s=>{let i=s.select({status:exports.tasks.status,run_epoch:exports.tasks.run_epoch,stop_requested_at:exports.tasks.stop_requested_at,stop_requested_epoch:exports.tasks.stop_requested_epoch,started_at:exports.tasks.started_at,duration_ms:exports.tasks.duration_ms,metadata:exports.tasks.metadata}).from(exports.tasks).where(drizzleOrm.eq(exports.tasks.id,e.id)).limit(1).get();if(!i||i.status!=="running"||Z(i.run_epoch)!==Z(e.runEpoch))return;let d=i.stop_requested_at!==null&&Z(i.stop_requested_epoch)===Z(e.runEpoch),c=le(i.metadata),u=d?$s(c,e.error):{error:e.error??null,metadata:e.terminalReason===void 0?{...c}:{...c,terminalReason:e.terminalReason}},f={...u.metadata,stopMethod:e.method},p=i.duration_ms??e.durationMs??no(i.started_at,r,void 0),g=i.run_epoch===null?drizzleOrm.isNull(exports.tasks.run_epoch):drizzleOrm.eq(exports.tasks.run_epoch,i.run_epoch);o=s.update(exports.tasks).set({status:"stopped",error:u.error,completed_at:r,duration_ms:p,metadata:JSON.stringify(f)}).where(drizzleOrm.and(drizzleOrm.eq(exports.tasks.id,e.id),drizzleOrm.eq(exports.tasks.status,"running"),g)).run().changes>0;},{behavior:"immediate"}),o}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to finalize task stop",r)}finally{n.close();}}finalizeTaskForHostShutdown(e){if(!this.dbExists())return "not_running";let n=this.openHandle(true);try{let r=e.completedAt??new Date(this.clock()).toISOString(),o=Z(e.expectedRunEpoch),s="not_running";return n.db.transaction(i=>{let d=i.select({status:exports.tasks.status,run_epoch:exports.tasks.run_epoch,workspace_id:exports.tasks.workspace_id,started_at:exports.tasks.started_at,duration_ms:exports.tasks.duration_ms,metadata:exports.tasks.metadata}).from(exports.tasks).where(drizzleOrm.eq(exports.tasks.id,e.id)).limit(1).get();if(!d||d.status!=="running"){s="not_running";return}if(Z(d.run_epoch)!==o){s="epoch_mismatch";return}if(e.workspaceId!==void 0&&d.workspace_id!==e.workspaceId){s="workspace_mismatch";return}let u=d.run_epoch===null?drizzleOrm.isNull(exports.tasks.run_epoch):drizzleOrm.eq(exports.tasks.run_epoch,d.run_epoch),f=e.workspaceId===void 0?void 0:e.workspaceId===null?drizzleOrm.isNull(exports.tasks.workspace_id):drizzleOrm.eq(exports.tasks.workspace_id,e.workspaceId),p={...le(d.metadata),terminalReason:"runner_lost"},g=d.duration_ms??no(d.started_at,r,void 0);s=i.update(exports.tasks).set({status:"runner_lost",error:lc,completed_at:r,duration_ms:g,metadata:JSON.stringify(p)}).where(drizzleOrm.and(drizzleOrm.eq(exports.tasks.id,e.id),drizzleOrm.eq(exports.tasks.status,"running"),u,f)).run().changes>0?"settled":"not_running";},{behavior:"immediate"}),s}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to finalize task for host shutdown",r)}finally{n.close();}}async stopTask(e,n={}){return Ns(this,e,n)}async stopTaskGenerationForInstruction(e){return ic({requestTaskStop:n=>this.requestTaskStopForInstruction(n),getTask:n=>this.getTask(n),finalizeTaskStop:n=>this.finalizeTaskStop(n)},e)}startTask(e){let n=this.openHandle(true);try{let r={id:e.id,agent_id:e.agentId,actor_kind:e.actorKind??null,actor_id:e.actorId??null,user_id:e.userId??null,prompt:e.prompt,mode:e.mode,status:e.status,started_at:e.startedAt,pid:e.pid??null,parent_task_id:e.parentTaskId??null,caller_agent_id:e.callerAgentId??null,trace_id:e.traceId??null,command:e.command??null,metadata:e.metadata??null,workspace_id:e.workspaceId??null,cwd:e.cwd??null,project_id:e.projectId??null,platform:e.platform??"cli",crewx_version:e.crewxVersion??null,thread_id:e.threadId??null,model:e.model??null,rendered_prompt:e.renderedPrompt??null,coding_agent_command:e.codingAgentCommand??null,log_storage:"events"},o=s=>{n.db.insert(exports.tasks).values(s).onConflictDoUpdate({target:exports.tasks.id,set:{status:drizzleOrm.sql`CASE WHEN ${exports.tasks.status} = 'pending' AND ${exports.tasks.pid} IS NULL THEN 'running' ELSE ${exports.tasks.status} END`,pid:drizzleOrm.sql`COALESCE(excluded.pid, ${exports.tasks.pid})`,actor_kind:drizzleOrm.sql`CASE WHEN ${exports.tasks.status} IN ('pending', 'running') AND ${exports.tasks.pid} IS NULL AND ${exports.tasks.actor_kind} IS NULL AND COALESCE(${exports.tasks.run_epoch}, 0) = 0 THEN excluded.actor_kind ELSE ${exports.tasks.actor_kind} END`,actor_id:drizzleOrm.sql`CASE WHEN ${exports.tasks.status} IN ('pending', 'running') AND ${exports.tasks.pid} IS NULL AND ${exports.tasks.actor_kind} IS NULL AND COALESCE(${exports.tasks.run_epoch}, 0) = 0 THEN excluded.actor_id ELSE ${exports.tasks.actor_id} END`,command:drizzleOrm.sql`CASE WHEN ${exports.tasks.status} = 'pending' AND ${exports.tasks.pid} IS NULL THEN excluded.command ELSE ${exports.tasks.command} END`,metadata:drizzleOrm.sql`CASE WHEN ${exports.tasks.status} = 'pending' AND ${exports.tasks.pid} IS NULL THEN excluded.metadata ELSE ${exports.tasks.metadata} END`,workspace_id:drizzleOrm.sql`CASE WHEN ${exports.tasks.status} = 'pending' AND ${exports.tasks.pid} IS NULL THEN COALESCE(${exports.tasks.workspace_id}, excluded.workspace_id) ELSE ${exports.tasks.workspace_id} END`,cwd:drizzleOrm.sql`CASE WHEN ${exports.tasks.status} = 'pending' AND ${exports.tasks.pid} IS NULL THEN COALESCE(${exports.tasks.cwd}, excluded.cwd) ELSE ${exports.tasks.cwd} END`,project_id:drizzleOrm.sql`CASE WHEN ${exports.tasks.status} = 'pending' AND ${exports.tasks.pid} IS NULL THEN COALESCE(${exports.tasks.project_id}, excluded.project_id) ELSE ${exports.tasks.project_id} END`,crewx_version:drizzleOrm.sql`CASE WHEN ${exports.tasks.status} = 'pending' AND ${exports.tasks.pid} IS NULL THEN excluded.crewx_version ELSE ${exports.tasks.crewx_version} END`,model:drizzleOrm.sql`CASE WHEN ${exports.tasks.status} = 'pending' AND ${exports.tasks.pid} IS NULL THEN excluded.model ELSE ${exports.tasks.model} END`,rendered_prompt:drizzleOrm.sql`CASE WHEN ${exports.tasks.status} = 'pending' AND ${exports.tasks.pid} IS NULL THEN excluded.rendered_prompt ELSE ${exports.tasks.rendered_prompt} END`,coding_agent_command:drizzleOrm.sql`CASE WHEN ${exports.tasks.status} = 'pending' AND ${exports.tasks.pid} IS NULL THEN excluded.coding_agent_command ELSE ${exports.tasks.coding_agent_command} END`},setWhere:drizzleOrm.or(drizzleOrm.eq(exports.tasks.status,"running"),drizzleOrm.and(drizzleOrm.eq(exports.tasks.status,"pending"),drizzleOrm.isNull(exports.tasks.pid)))}).run();};try{o(r);}catch(s){let i=s instanceof Error?s.message:typeof s=="object"&&s!==null&&"message"in s?String(s.message):String(s);if(!/log_storage|heartbeat_at|stop_requested_at|stop_requested_epoch|cwd|actor_kind|actor_id/i.test(i)||!/no such column|no column named/i.test(i))throw s;let d=new Set(n.db.all("PRAGMA table_info(tasks)").map(Su=>Su.name)),c=d.has("cwd"),u=d.has("user_id"),f=d.has("actor_kind"),p=d.has("actor_id"),g=d.has("log_storage"),_=c?", cwd":"",m=c?", ?":"",k=c?", cwd = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN COALESCE(tasks.cwd, excluded.cwd) ELSE tasks.cwd END":"",T=g?", log_storage":"",E=g?", ?":"",b=u?", user_id":"",L=u?", ?":"",y=f?", actor_kind":"",N=f?", ?":"",P=p?", actor_id":"",oe=p?", ?":"",Pe=g?`,
|
|
89
95
|
log_storage = CASE WHEN tasks.status = 'pending' THEN excluded.log_storage ELSE tasks.log_storage END`:"";n.runRaw(`INSERT INTO tasks (
|
|
90
96
|
id, agent_id, prompt, mode, status, started_at, pid,
|
|
91
97
|
parent_task_id, caller_agent_id, trace_id, command, metadata,
|
|
@@ -103,9 +109,9 @@ ${r.join(`
|
|
|
103
109
|
model = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN excluded.model ELSE tasks.model END,
|
|
104
110
|
rendered_prompt = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN excluded.rendered_prompt ELSE tasks.rendered_prompt END,
|
|
105
111
|
coding_agent_command = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN excluded.coding_agent_command ELSE tasks.coding_agent_command END${Pe}
|
|
106
|
-
WHERE tasks.status = 'running' OR (tasks.status = 'pending' AND tasks.pid IS NULL)`,[r.id,r.agent_id,r.prompt,r.mode,r.status,r.started_at,r.pid,r.parent_task_id,r.caller_agent_id,r.trace_id,r.command,r.metadata,r.workspace_id,...c?[r.cwd]:[],r.project_id,r.platform,r.crewx_version,r.thread_id,r.model,r.rendered_prompt,r.coding_agent_command,...u?[r.user_id]:[],...f?[r.actor_kind]:[],...p?[r.actor_id]:[],...g?[r.log_storage]:[]]);}}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to start task",r)}finally{n.close();}}updateTaskOwnership(e){if(!this.dbExists())return false;let n=this.openHandle(true);try{let r=n.db.select({status:exports.tasks.status,run_epoch:exports.tasks.run_epoch,metadata:exports.tasks.metadata,model:exports.tasks.model,rendered_prompt:exports.tasks.rendered_prompt,coding_agent_command:exports.tasks.coding_agent_command}).from(exports.tasks).where(drizzleOrm.eq(exports.tasks.id,e.id)).limit(1).get();if(!r||r.status!=="running"||Z(r.run_epoch)!==Z(e.runEpoch))return !1;let o=
|
|
107
|
-
AND COALESCE(${exports.tasks.stop_requested_epoch}, 0) <> COALESCE(${exports.tasks.run_epoch}, 0)`)).run(),i.changes>0}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to update task ownership",r)}finally{n.close();}}adoptPendingTask(e){let n=this.openHandle(true);try{return n.db.update(exports.tasks).set({status:"running"}).where(drizzleOrm.and(drizzleOrm.eq(exports.tasks.id,e),drizzleOrm.eq(exports.tasks.status,"pending"),drizzleOrm.isNull(exports.tasks.pid))).run().changes===1}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to adopt pending task",r)}finally{n.close();}}failPendingTask(e,n,r=new Date().toISOString()){let o=this.openHandle(true);try{return o.db.update(exports.tasks).set({status:"failed",error:n,completed_at:r}).where(drizzleOrm.and(drizzleOrm.eq(exports.tasks.id,e),drizzleOrm.eq(exports.tasks.status,"pending"))).run().changes>0}catch(s){throw s instanceof exports.RepositoryError?s:new exports.RepositoryError("DB_ERROR","Failed to fail pending task",s)}finally{o.close();}}stopPendingTask(e,n,r=new Date().toISOString(),o={}){let s=this.openHandle(true);try{let i=!1;return s.db.transaction(d=>{let c=d.select({metadata:exports.tasks.metadata}).from(exports.tasks).where(drizzleOrm.and(drizzleOrm.eq(exports.tasks.id,e),drizzleOrm.eq(exports.tasks.status,"pending"))).limit(1).get();if(!c)return;let u
|
|
108
|
-
`);}}updateTaskLifecycle(e){let n=this.openHandle(true);try{let r=drizzleOrm.and(drizzleOrm.eq(exports.tasks.id,e.id),drizzleOrm.eq(exports.tasks.workspace_id,e.workspaceId)),o={status:e.status,error:e.error,completed_at:e.completedAt,duration_ms:e.durationMs};if(e.terminalReason){let s=n.db.select({metadata:exports.tasks.metadata}).from(exports.tasks).where(r).limit(1).get(),i=le(s?.metadata??null);i.terminalReason=e.terminalReason,o.metadata=JSON.stringify(i);}n.db.update(exports.tasks).set(o).where(r).run();}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to update task lifecycle",r)}finally{n.close();}}appendLog(e,n){this.taskLogRepository.appendLog(e,n);}appendLogs(e,n){this.taskLogRepository.appendLogs(e,n);}readLogs(e){return this.taskLogRepository.readLogs(e)}readLogsTail(e,n){return this.taskLogRepository.readLogsTail(e,n)}getLogState(e){return this.taskLogRepository.getLogState(e)}getRunningTasks(){if(!this.dbExists())return [];let e=this.openHandle(false);try{return e.db.select().from(exports.tasks).where(drizzleOrm.eq(exports.tasks.status,"running")).orderBy(drizzleOrm.desc(exports.tasks.started_at)).all().map(
|
|
112
|
+
WHERE tasks.status = 'running' OR (tasks.status = 'pending' AND tasks.pid IS NULL)`,[r.id,r.agent_id,r.prompt,r.mode,r.status,r.started_at,r.pid,r.parent_task_id,r.caller_agent_id,r.trace_id,r.command,r.metadata,r.workspace_id,...c?[r.cwd]:[],r.project_id,r.platform,r.crewx_version,r.thread_id,r.model,r.rendered_prompt,r.coding_agent_command,...u?[r.user_id]:[],...f?[r.actor_kind]:[],...p?[r.actor_id]:[],...g?[r.log_storage]:[]]);}}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to start task",r)}finally{n.close();}}updateTaskOwnership(e){if(!this.dbExists())return false;let n=this.openHandle(true);try{let r=n.db.select({status:exports.tasks.status,run_epoch:exports.tasks.run_epoch,metadata:exports.tasks.metadata,model:exports.tasks.model,rendered_prompt:exports.tasks.rendered_prompt,coding_agent_command:exports.tasks.coding_agent_command}).from(exports.tasks).where(drizzleOrm.eq(exports.tasks.id,e.id)).limit(1).get();if(!r||r.status!=="running"||Z(r.run_epoch)!==Z(e.runEpoch))return !1;let o=yg(r.metadata,e.runtime?.metadata);o.ownership=e.ownership,e.ownership==="runner"&&e.providerPid!==void 0&&(o.providerPid=e.providerPid);let s=r.run_epoch===null?drizzleOrm.isNull(exports.tasks.run_epoch):drizzleOrm.eq(exports.tasks.run_epoch,r.run_epoch),i=n.db.update(exports.tasks).set({metadata:JSON.stringify(o),model:Hs(r.model,e.runtime?.model),rendered_prompt:Hs(r.rendered_prompt,e.runtime?.renderedPrompt),coding_agent_command:Hs(r.coding_agent_command,e.runtime?.codingAgentCommand)}).where(drizzleOrm.and(drizzleOrm.eq(exports.tasks.id,e.id),drizzleOrm.eq(exports.tasks.status,"running"),s)).run();return i.changes>0&&Z(e.runEpoch)>0&&n.db.update(exports.tasks).set({stop_requested_at:null,stop_requested_epoch:null}).where(drizzleOrm.and(drizzleOrm.eq(exports.tasks.id,e.id),drizzleOrm.eq(exports.tasks.status,"running"),s,drizzleOrm.sql`${exports.tasks.stop_requested_at} IS NOT NULL
|
|
113
|
+
AND COALESCE(${exports.tasks.stop_requested_epoch}, 0) <> COALESCE(${exports.tasks.run_epoch}, 0)`)).run(),i.changes>0}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to update task ownership",r)}finally{n.close();}}adoptPendingTask(e){let n=this.openHandle(true);try{return n.db.update(exports.tasks).set({status:"running"}).where(drizzleOrm.and(drizzleOrm.eq(exports.tasks.id,e),drizzleOrm.eq(exports.tasks.status,"pending"),drizzleOrm.isNull(exports.tasks.pid))).run().changes===1}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to adopt pending task",r)}finally{n.close();}}failPendingTask(e,n,r=new Date().toISOString()){let o=this.openHandle(true);try{return o.db.update(exports.tasks).set({status:"failed",error:n,completed_at:r}).where(drizzleOrm.and(drizzleOrm.eq(exports.tasks.id,e),drizzleOrm.eq(exports.tasks.status,"pending"))).run().changes>0}catch(s){throw s instanceof exports.RepositoryError?s:new exports.RepositoryError("DB_ERROR","Failed to fail pending task",s)}finally{o.close();}}stopPendingTask(e,n,r=new Date().toISOString(),o={}){let s=this.openHandle(true);try{let i=!1;return s.db.transaction(d=>{let c=d.select({metadata:exports.tasks.metadata}).from(exports.tasks).where(drizzleOrm.and(drizzleOrm.eq(exports.tasks.id,e),drizzleOrm.eq(exports.tasks.status,"pending"))).limit(1).get();if(!c)return;let u=$s(le(c.metadata),n),f={...u.metadata,stopMethod:"cooperative",stopRequest:to(o,r)};i=d.update(exports.tasks).set({status:"stopped",error:u.error,completed_at:r,metadata:JSON.stringify(f)}).where(drizzleOrm.and(drizzleOrm.eq(exports.tasks.id,e),drizzleOrm.eq(exports.tasks.status,"pending"))).run().changes===1;},{behavior:"immediate"}),i}catch(i){throw i instanceof exports.RepositoryError?i:new exports.RepositoryError("DB_ERROR","Failed to stop pending task",i)}finally{s.close();}}listTasksByProjectId(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.select().from(exports.tasks).where(drizzleOrm.eq(exports.tasks.project_id,e)).orderBy(drizzleOrm.desc(exports.tasks.started_at)).all().map(rt)}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to list tasks by project",r)}finally{n.close();}}finishTask(e){let n=this.openHandle(true),r,o;try{n.db.transaction(s=>{let i=s.select({status:exports.tasks.status,run_epoch:exports.tasks.run_epoch,stop_requested_at:exports.tasks.stop_requested_at,stop_requested_epoch:exports.tasks.stop_requested_epoch,started_at:exports.tasks.started_at,duration_ms:exports.tasks.duration_ms,result:exports.tasks.result,exit_code:exports.tasks.exit_code,error:exports.tasks.error,metadata:exports.tasks.metadata,model:exports.tasks.model,input_tokens:exports.tasks.input_tokens,output_tokens:exports.tasks.output_tokens,cached_input_tokens:exports.tasks.cached_input_tokens,cost_usd:exports.tasks.cost_usd}).from(exports.tasks).where(drizzleOrm.eq(exports.tasks.id,e.id)).limit(1).get();if(!i)return;let d=Z(i.run_epoch),c=Z(e.runEpoch),u=i.status==="running"&&d===c,f=i.stop_requested_at!==null&&Z(i.stop_requested_epoch)===d,p=u&&f,g=i.status==="stopped"&&d===c&&f,_=le(i.metadata),m=bn(_[nr])?_[nr]:{},k=String(c),T=Tg.has(i.status),E=T&&d===c&&!In(i)&&!Object.prototype.hasOwnProperty.call(m,k),b=T&&d===c&&!Object.prototype.hasOwnProperty.call(m,k),L=d>0||c>0||e.runEpoch!==void 0&&e.runEpoch!==null||d!==c,y={},N;if(i.status!=="running"&&(r=i.status,o=e.result?.trim()||e.error?.trim()||`task:end status=${e.status}`),L&&(i.status==="running"||b)){N=le(i.metadata);let P=bn(N[Ms])?{...N[Ms]}:{};P[String(c)]=uc(e),N[Ms]=P;let oe=Sg(P),Pe=oe.inputTokens!==0||oe.outputTokens!==0||oe.cachedInputTokens!==0||oe.costUsd!==0;Pe&&_[ot]==="unavailable"?N[ot]="recorded":i.status!=="running"&&!Pe&&_[ot]===void 0&&(N[ot]="unavailable"),y.metadata=JSON.stringify(N),y.input_tokens=oe.inputTokens,y.output_tokens=oe.outputTokens,y.cached_input_tokens=oe.cachedInputTokens,y.cost_usd=oe.costUsd;}else if(u||E)if(u)y.input_tokens=Re(e.inputTokens??0),y.output_tokens=Re(e.outputTokens??0),y.cached_input_tokens=Re(e.cachedInputTokens??0),y.cost_usd=Re(e.costUsd??0);else {let P=uc(e),oe=P.inputTokens!==0||P.outputTokens!==0||P.cachedInputTokens!==0||P.costUsd!==0;oe&&(y.input_tokens=P.inputTokens,y.output_tokens=P.outputTokens,y.cached_input_tokens=P.cachedInputTokens,y.cost_usd=P.costUsd),N={..._};let Pe=bn(_[nr])?{..._[nr]}:{};Pe[k]={at:e.completedAt},N[nr]=Pe,N[ot]===void 0?N[ot]=oe?"recorded":"unavailable":oe&&N[ot]==="unavailable"&&(N[ot]="recorded"),y.metadata=JSON.stringify(N);}if((u||E)&&e.model!==void 0&&e.model!==null&&(!E||i.model===null)&&(y.model=e.model),p){N??=le(i.metadata);let P=$s(N,e.error);N={...P.metadata,...e.partialResultRecovered===!0?{partialResultRecovered:!0}:{},stopMethod:vs(i.stop_requested_at,e.completedAt)},y.status="stopped",y.result=e.result??i.result,y.error=P.error,y.completed_at=e.completedAt,y.duration_ms=i.duration_ms??e.durationMs??no(i.started_at,e.completedAt,void 0),y.exit_code=e.exitCode??i.exit_code,y.metadata=JSON.stringify(N);}else if(u)e.partialResultRecovered===!0&&(N??=le(i.metadata),N.partialResultRecovered=!0,y.metadata=JSON.stringify(N)),y.status=e.status,y.result=e.result??null,y.error=e.error??null,y.completed_at=e.completedAt,y.duration_ms=d>0?no(i.started_at,e.completedAt,e.durationMs):e.durationMs??null,y.exit_code=e.exitCode??null;else if(g){let P=!1;i.result===null&&e.result!==void 0&&e.result!==null&&(y.result=e.result,P=!0),i.exit_code===null&&e.exitCode!==void 0&&e.exitCode!==null&&(y.exit_code=e.exitCode),e.partialResultRecovered===!0&&(N??=le(i.metadata),N.partialResultRecovered=!0,y.metadata=JSON.stringify(N)),P&&(r=void 0,o=void 0);}Object.keys(y).length>0&&s.update(exports.tasks).set(y).where(drizzleOrm.eq(exports.tasks.id,e.id)).run();},{behavior:"immediate"});}catch(s){throw s instanceof exports.RepositoryError?s:new exports.RepositoryError("DB_ERROR","Failed to finish task",s)}finally{n.close();}if(r!==void 0){try{this.taskLogRepository.appendLog(e.id,{timestamp:e.completedAt,level:"late-result",message:o??`task:end status=${e.status}`});}catch(s){console.error(`[crewx] failed to preserve late task result for ${e.id}: ${s instanceof Error?s.message:String(s)}`);}process.stderr.write(`Task ${e.id} was already finalized (${r}); late result kept in task log
|
|
114
|
+
`);}}updateTaskLifecycle(e){let n=this.openHandle(true);try{let r=drizzleOrm.and(drizzleOrm.eq(exports.tasks.id,e.id),drizzleOrm.eq(exports.tasks.workspace_id,e.workspaceId)),o={status:e.status,error:e.error,completed_at:e.completedAt,duration_ms:e.durationMs};if(e.terminalReason){let s=n.db.select({metadata:exports.tasks.metadata}).from(exports.tasks).where(r).limit(1).get(),i=le(s?.metadata??null);i.terminalReason=e.terminalReason,o.metadata=JSON.stringify(i);}n.db.update(exports.tasks).set(o).where(r).run();}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to update task lifecycle",r)}finally{n.close();}}appendLog(e,n){this.taskLogRepository.appendLog(e,n);}appendLogs(e,n){this.taskLogRepository.appendLogs(e,n);}readLogs(e){return this.taskLogRepository.readLogs(e)}readLogsTail(e,n){return this.taskLogRepository.readLogsTail(e,n)}getLogState(e){return this.taskLogRepository.getLogState(e)}getRunningTasks(){if(!this.dbExists())return [];let e=this.openHandle(false);try{return e.db.select().from(exports.tasks).where(drizzleOrm.eq(exports.tasks.status,"running")).orderBy(drizzleOrm.desc(exports.tasks.started_at)).all().map(rt)}catch(n){throw new exports.RepositoryError("DB_ERROR","Failed to get running tasks",n)}finally{e.close();}}getActiveTasks(){if(!this.dbExists())return [];let e=this.openHandle(false);try{return e.db.select().from(exports.tasks).where(drizzleOrm.inArray(exports.tasks.status,["pending","running"])).orderBy(drizzleOrm.desc(exports.tasks.started_at)).all().map(rt)}catch(n){throw new exports.RepositoryError("DB_ERROR","Failed to get active tasks",n)}finally{e.close();}}getAllTasks(){if(!this.dbExists())return [];let e=this.openHandle(false);try{return e.db.select().from(exports.tasks).orderBy(drizzleOrm.desc(exports.tasks.started_at)).limit(100).all().map(rt)}catch(n){throw new exports.RepositoryError("DB_ERROR","Failed to get all tasks",n)}finally{e.close();}}getTask(e){if(!this.dbExists())return;let n=this.openHandle(false);try{let r=n.db.select().from(exports.tasks).where(drizzleOrm.eq(exports.tasks.id,e)).limit(1).get();return r?rt(r):void 0}catch(r){throw new exports.RepositoryError("DB_ERROR","Failed to get task",r)}finally{n.close();}}async killTask(e){let n=await this.stopTask(e);return n.status==="stopped"?{status:"terminated",killed:n.method==="forced"||n.method==="cooperative",...n.pid?{pid:n.pid}:{}}:n.status==="not_running"?{status:"not_running",killed:false,...n.pid?{pid:n.pid}:{},...n.error?{error:n.error}:{}}:{status:"failed",killed:false,...n.pid?{pid:n.pid}:{},...n.error?{error:n.error}:{}}}reapOrphanedTasks(e={}){if(!this.dbExists())return 0;let n=this.openHandle(true);try{let r=n.db.select({id:exports.tasks.id,status:exports.tasks.status,pid:exports.tasks.pid,platform:exports.tasks.platform,run_epoch:exports.tasks.run_epoch,heartbeat_at:exports.tasks.heartbeat_at,started_at:exports.tasks.started_at,metadata:exports.tasks.metadata,model:exports.tasks.model,input_tokens:exports.tasks.input_tokens,output_tokens:exports.tasks.output_tokens,cached_input_tokens:exports.tasks.cached_input_tokens,cost_usd:exports.tasks.cost_usd}).from(exports.tasks).where(drizzleOrm.or(drizzleOrm.eq(exports.tasks.status,"running"),drizzleOrm.eq(exports.tasks.status,"pending"))).all(),o=this.clock(),s=Math.max(1,Math.trunc(e.tickIntervalMs??exports.DEFAULT_TASK_REAPER_TICK_INTERVAL_MS)),i=this.lastReaperTickAt,d=i===void 0?Number.POSITIVE_INFINITY:o-i,c=i!==void 0&&d>=0&&d<=s*2;this.lastReaperTickAt=o;let u=Kt(),f=Xn(),p=new Date(o-fc).toISOString(),g=new Date(o).toISOString(),_=new Set,m=0,k=(T,E)=>{let b=le(oo(T.metadata,"runner_lost")),L=typeof b.provider=="string"?b.provider:void 0,y;try{y=Vr({taskLogRepository:this.taskLogRepository,taskId:T.id,provider:L,model:T.model})?.usage;}catch{}let N={status:"runner_lost",error:E,completed_at:g};y?(N.input_tokens=y.inputTokens,N.output_tokens=y.outputTokens,N.cached_input_tokens=y.cachedInputTokens,N.cost_usd=y.costUsd,T.model===null&&y.model!==null&&(N.model=y.model),b[ot]="recorded"):!In(T)&&b[ot]!=="recorded"&&(b[ot]="unavailable"),N.metadata=JSON.stringify(b);let P=T.run_epoch===null?drizzleOrm.isNull(exports.tasks.run_epoch):drizzleOrm.eq(exports.tasks.run_epoch,T.run_epoch),oe=T.heartbeat_at===null?drizzleOrm.isNull(exports.tasks.heartbeat_at):drizzleOrm.eq(exports.tasks.heartbeat_at,T.heartbeat_at),Pe=n.db.update(exports.tasks).set(N).where(drizzleOrm.and(drizzleOrm.eq(exports.tasks.id,T.id),drizzleOrm.eq(exports.tasks.status,"running"),P,oe)).run();return Pe.changes>0&&m++,Pe.changes>0};for(let T of r){if(T.status==="pending"){if(T.pid!==null||T.started_at>=p)continue;let y=oo(T.metadata,"launch_failed");n.db.update(exports.tasks).set({status:"failed",error:"Reaped: runner never adopted task (pending timeout)",completed_at:g,metadata:y}).where(drizzleOrm.and(drizzleOrm.eq(exports.tasks.id,T.id),drizzleOrm.eq(exports.tasks.status,"pending"),drizzleOrm.isNull(exports.tasks.pid),drizzleOrm.lt(exports.tasks.started_at,p))).run().changes>0&&m++;continue}if(mg.has(T.platform??"cli"))continue;if(T.pid===null){let y=`${T.id}:${T.run_epoch??0}`;_.add(y);let N=this.pidNullObservedSince.get(y);if(N===void 0){this.pidNullObservedSince.set(y,o);continue}o-N>=Fs&&k(T,"Reaped: pid never recorded after resume (stale running_instruction)")&&this.pidNullObservedSince.delete(y);continue}if(T.heartbeat_at===null){$t(T.pid)==="not_found"&&k(T,"Reaped: process not found (orphaned task)");continue}let E=Date.parse(T.heartbeat_at),b=Number.isFinite(E)?o-E:Number.POSITIVE_INFINITY;if(b<=u)continue;$t(T.pid)==="not_found"?k(T,"Reaped: process not found (orphaned task)"):b>f&&c&&k(T,"Reaped: heartbeat stale beyond hard limit (orphaned task)");}for(let T of Array.from(this.pidNullObservedSince.keys()))_.has(T)||this.pidNullObservedSince.delete(T);return m}finally{n.close();}}reapRunningWorkflowTasks(e=Fs){if(!this.dbExists())return 0;let n=this.openHandle(true);try{let r=new Date(Date.now()-e).toISOString(),o=drizzleOrm.and(drizzleOrm.eq(exports.tasks.status,"running"),drizzleOrm.eq(exports.tasks.platform,"workflow"),drizzleOrm.isNull(exports.tasks.pid),drizzleOrm.lt(exports.tasks.started_at,r),drizzleOrm.or(drizzleOrm.isNull(exports.tasks.metadata),drizzleOrm.and(drizzleOrm.notLike(exports.tasks.metadata,'%"kind":"workflow_card"%'),drizzleOrm.notLike(exports.tasks.metadata,'%"kind":"workflow_ui_instance"%')))),s=n.db.select({id:exports.tasks.id,metadata:exports.tasks.metadata}).from(exports.tasks).where(o).all(),i=new Date().toISOString(),d=0;for(let c of s){let u=le(c.metadata);u.terminalReason="runner_lost";let f=n.db.update(exports.tasks).set({status:"runner_lost",error:"Reaped: stale workflow run (finally not executed)",completed_at:i,metadata:JSON.stringify(u)}).where(drizzleOrm.and(drizzleOrm.eq(exports.tasks.id,c.id),drizzleOrm.eq(exports.tasks.status,"running"))).run();d+=f.changes??0;}return d}finally{n.close();}}findTaskStatus(e,n){let r=this.resolveDbPaths();for(let o of r){if(!Oa.existsSync(o))continue;let s=C(o);try{let i=n?drizzleOrm.eq(exports.tasks.workspace_id,n):void 0,d=i?drizzleOrm.and(drizzleOrm.eq(exports.tasks.id,e),i):drizzleOrm.eq(exports.tasks.id,e),c=s.db.select().from(exports.tasks).where(d).limit(1).get()??void 0;if(!c){let u=i?drizzleOrm.and(drizzleOrm.eq(exports.tasks.thread_id,e),i):drizzleOrm.eq(exports.tasks.thread_id,e);c=s.db.select().from(exports.tasks).where(u).orderBy(drizzleOrm.desc(exports.tasks.started_at)).limit(1).get()??void 0;}if(c)return rt(c)}catch(i){throw new exports.RepositoryError("DB_ERROR","Failed to find task status",i)}finally{s.close();}}}findChildTasks(e,n){let r=this.resolveDbPaths(),o=new Set,s=[];for(let i of r){if(!Oa.existsSync(i))continue;let d=C(i);try{let c=n?drizzleOrm.and(drizzleOrm.eq(exports.tasks.parent_task_id,e),drizzleOrm.eq(exports.tasks.workspace_id,n)):drizzleOrm.eq(exports.tasks.parent_task_id,e),u=d.db.select().from(exports.tasks).where(c).orderBy(drizzleOrm.asc(exports.tasks.started_at)).all();for(let f of u)o.has(f.id)||(o.add(f.id),s.push(rt(f)));}catch(c){throw new exports.RepositoryError("DB_ERROR","Failed to find child tasks",c)}finally{d.close();}}return s}getWorkspaceUsageSummary(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.all(e?drizzleOrm.sql`
|
|
109
115
|
SELECT
|
|
110
116
|
COALESCE(workspace_id, 'unknown') AS workspace_id,
|
|
111
117
|
COALESCE(SUM(input_tokens), 0) AS input_tokens,
|
|
@@ -126,14 +132,14 @@ ${r.join(`
|
|
|
126
132
|
FROM tasks
|
|
127
133
|
GROUP BY workspace_id
|
|
128
134
|
ORDER BY (COALESCE(SUM(input_tokens), 0) + COALESCE(SUM(output_tokens), 0)) DESC
|
|
129
|
-
`)}catch(r){throw new exports.RepositoryError("DB_ERROR","Failed to get workspace usage summary",r)}finally{n.close();}}getThreadTokenUsage(e,n){let r=this.resolveDbPaths(),o=new Set,s=0,i=0,d=0;for(let c of r){if(!
|
|
135
|
+
`)}catch(r){throw new exports.RepositoryError("DB_ERROR","Failed to get workspace usage summary",r)}finally{n.close();}}getThreadTokenUsage(e,n){let r=this.resolveDbPaths(),o=new Set,s=0,i=0,d=0;for(let c of r){if(!Oa.existsSync(c))continue;let u=C(c);try{let f=drizzleOrm.eq(exports.tasks.thread_id,e),p=n?drizzleOrm.and(f,drizzleOrm.eq(exports.tasks.workspace_id,n)):f,g=u.db.select({id:exports.tasks.id,input_tokens:exports.tasks.input_tokens,output_tokens:exports.tasks.output_tokens,cost_usd:exports.tasks.cost_usd}).from(exports.tasks).where(p).all();for(let _ of g)o.has(_.id)||(o.add(_.id),s+=_.input_tokens??0,i+=_.output_tokens??0,d+=_.cost_usd??0);}catch(f){throw new exports.RepositoryError("DB_ERROR","Failed to get thread token usage",f)}finally{u.close();}}return {inputTokens:s,outputTokens:i,costUsd:d}}findTasksByThread(e,n,r){let o=this.resolveDbPaths(),s=new Set,i=[],d=r?.projection==="activity-log";for(let c of o){if(!Oa.existsSync(c))continue;let u=C(c);try{let f=drizzleOrm.eq(exports.tasks.thread_id,e),p=n?drizzleOrm.and(f,drizzleOrm.eq(exports.tasks.workspace_id,n)):f,g=d?u.db.select({id:exports.tasks.id,thread_id:exports.tasks.thread_id,agent_id:exports.tasks.agent_id,parent_task_id:exports.tasks.parent_task_id,started_at:exports.tasks.started_at,completed_at:exports.tasks.completed_at}).from(exports.tasks).where(p).orderBy(drizzleOrm.asc(exports.tasks.started_at)).all():u.db.select().from(exports.tasks).where(p).orderBy(drizzleOrm.asc(exports.tasks.started_at)).all().map(rt);for(let _ of g)s.has(_.id)||(s.add(_.id),i.push(_));}catch(f){throw new exports.RepositoryError("DB_ERROR","Failed to find tasks by thread",f)}finally{u.close();}}return i}parseWorkflowCardMetadata(e){if(!e)return {};try{let n=JSON.parse(e);return {kind:typeof n.kind=="string"?n.kind:void 0,workflowRunId:typeof n.workflowRunId=="string"?n.workflowRunId:void 0}}catch{return {}}}extractThreadIdFromCommand(e){return e?/--thread=(\S+)/.exec(e)?.[1]??null:null}findRunningWorkflowParentTasks(){if(!this.dbExists())return [];let e=[];for(let n of this.resolveDbPaths()){if(!Oa.existsSync(n))continue;let r=C(n);try{e.push(...r.db.select({id:exports.tasks.id,agent_id:exports.tasks.agent_id,thread_id:exports.tasks.thread_id,workspace_id:exports.tasks.workspace_id,platform:exports.tasks.platform,status:exports.tasks.status,error:exports.tasks.error,completed_at:exports.tasks.completed_at,duration_ms:exports.tasks.duration_ms,started_at:exports.tasks.started_at,metadata:exports.tasks.metadata}).from(exports.tasks).where(drizzleOrm.and(drizzleOrm.eq(exports.tasks.platform,"workflow"),drizzleOrm.inArray(exports.tasks.status,["running","pending"]),drizzleOrm.or(drizzleOrm.like(exports.tasks.metadata,'%"kind":"workflow_card"%'),drizzleOrm.like(exports.tasks.metadata,'%"kind":"workflow_ui_instance"%')))).orderBy(drizzleOrm.desc(exports.tasks.started_at)).all().map(Ps));}catch(o){throw new exports.RepositoryError("DB_ERROR","Failed to find workflow parent tasks",o)}finally{r.close();}}return e}findWorkflowParentTasksByWorkspace(e){let n=[],r=new Map;for(let o of this.resolveDbPaths()){if(!Oa.existsSync(o))continue;let s=C(o);try{let i=s.db.select({id:exports.tasks.id,agent_id:exports.tasks.agent_id,thread_id:exports.tasks.thread_id,workspace_id:exports.tasks.workspace_id,platform:exports.tasks.platform,status:exports.tasks.status,error:exports.tasks.error,completed_at:exports.tasks.completed_at,duration_ms:exports.tasks.duration_ms,started_at:exports.tasks.started_at,metadata:exports.tasks.metadata}).from(exports.tasks).where(drizzleOrm.and(drizzleOrm.eq(exports.tasks.platform,"workflow"),drizzleOrm.eq(exports.tasks.workspace_id,e))).orderBy(drizzleOrm.desc(exports.tasks.started_at),drizzleOrm.desc(exports.tasks.id)).all();for(let d of i){let c=this.parseWorkflowCardMetadata(d.metadata);if(c.kind!=="workflow_card"&&c.kind!=="workflow_ui_instance"||typeof c.workflowRunId!="string")continue;let u=c.kind,f=r.get(u)??new Set;f.has(c.workflowRunId)||(f.add(c.workflowRunId),r.set(u,f),n.push(Ps(d)));}}catch(i){throw new exports.RepositoryError("DB_ERROR","Failed to find workflow parent tasks by workspace",i)}finally{s.close();}}return n}findWorkflowParentTask(e){if(this.dbExists())for(let n of this.resolveDbPaths()){if(!Oa.existsSync(n))continue;let r=C(n);try{let o=r.db.select({id:exports.tasks.id,agent_id:exports.tasks.agent_id,thread_id:exports.tasks.thread_id,workspace_id:exports.tasks.workspace_id,platform:exports.tasks.platform,status:exports.tasks.status,error:exports.tasks.error,completed_at:exports.tasks.completed_at,duration_ms:exports.tasks.duration_ms,started_at:exports.tasks.started_at,metadata:exports.tasks.metadata}).from(exports.tasks).where(drizzleOrm.and(drizzleOrm.eq(exports.tasks.platform,"workflow"),drizzleOrm.eq(exports.tasks.workspace_id,e.workspaceId))).orderBy(drizzleOrm.desc(exports.tasks.started_at),drizzleOrm.desc(exports.tasks.id)).all();for(let s of o){let i=this.parseWorkflowCardMetadata(s.metadata);if(i.kind===e.kind&&i.workflowRunId===e.workflowRunId)return Ps(s)}}catch(o){throw new exports.RepositoryError("DB_ERROR","Failed to find workflow parent task",o)}finally{r.close();}}}batchFetchWorkflowCards(e,n){let r=new Map;if(e.length===0)return r;let o=new Set(e),s=new Map,i=n?drizzleOrm.eq(exports.tasks.workspace_id,n):void 0,d=(c,u)=>{if(!c)return;let f=s.get(c);if(f&&u.started_at<=f)return;let p=this.parseWorkflowCardMetadata(u.metadata);p.kind!=="workflow_card"&&p.kind!=="workflow_ui_instance"||(s.set(c,u.started_at),r.set(c,{taskId:u.id,workflowRunId:p.workflowRunId,raw:u.result??void 0}));};for(let c of this.resolveDbPaths()){if(!Oa.existsSync(c))continue;let u=C(c);try{let f=drizzleOrm.and(drizzleOrm.inArray(exports.tasks.thread_id,e),drizzleOrm.or(drizzleOrm.like(exports.tasks.metadata,'%"kind":"workflow_card"%'),drizzleOrm.like(exports.tasks.metadata,'%"kind":"workflow_ui_instance"%'))),p=u.db.select({id:exports.tasks.id,thread_id:exports.tasks.thread_id,metadata:exports.tasks.metadata,result:exports.tasks.result,started_at:exports.tasks.started_at}).from(exports.tasks).where(i?drizzleOrm.and(f,i):f).all();for(let m of p)d(m.thread_id,m);let g=drizzleOrm.and(drizzleOrm.isNull(exports.tasks.thread_id),drizzleOrm.or(drizzleOrm.like(exports.tasks.metadata,'%"kind":"workflow_card"%'),drizzleOrm.like(exports.tasks.metadata,'%"kind":"workflow_ui_instance"%'))),_=u.db.select({id:exports.tasks.id,command:exports.tasks.command,metadata:exports.tasks.metadata,result:exports.tasks.result,started_at:exports.tasks.started_at}).from(exports.tasks).where(i?drizzleOrm.and(g,i):g).all();for(let m of _){let k=this.extractThreadIdFromCommand(m.command);!k||!o.has(k)||d(k,m);}}catch(f){throw new exports.RepositoryError("DB_ERROR","Failed to batch fetch workflow cards",f)}finally{u.close();}}return r}findAllTasks(e){if(!this.dbExists())return {rows:[],total:0};let n=this.openHandle(false);try{let r=[];e.workspaceId&&r.push(drizzleOrm.eq(exports.tasks.workspace_id,e.workspaceId));let o=e.agents&&e.agents.length>0?e.agents:e.agentId?[e.agentId]:null;o&&r.push(drizzleOrm.inArray(exports.tasks.agent_id,o));let s=e.statuses&&e.statuses.length>0?e.statuses:e.status?[e.status]:null;s&&r.push(drizzleOrm.inArray(exports.tasks.status,s));let i=e.q??e.search;i&&r.push(drizzleOrm.like(exports.tasks.prompt,`%${i}%`)),e.from&&r.push(drizzleOrm.gte(exports.tasks.started_at,e.from)),e.to&&r.push(drizzleOrm.lt(exports.tasks.started_at,e.to));let d=r.length>0?drizzleOrm.and(...r):void 0,c=n.db.select({count:drizzleOrm.sql`count(*)`}).from(exports.tasks).where(d).get(),u=(e.sortDir??"DESC")==="ASC"?drizzleOrm.asc(exports.tasks.started_at):drizzleOrm.desc(exports.tasks.started_at);return {rows:n.db.select().from(exports.tasks).where(d).orderBy(u).limit(e.limit).offset(e.offset).all().map(rt),total:c?.count??0}}catch(r){throw new exports.RepositoryError("DB_ERROR","Failed to find all tasks",r)}finally{n.close();}}getAgentUsage(e,n,r){if(!this.dbExists())return [];let o=this.openHandle(false);try{let s=Ls(drizzleOrm.sql.raw("t.model"),drizzleOrm.sql.raw("t.metadata")),i=rr(drizzleOrm.sql.raw("t.status")),d=eo(drizzleOrm.sql.raw("t.metadata")),c=drizzleOrm.sql`
|
|
130
136
|
COALESCE(t.input_tokens, 0)
|
|
131
137
|
+ CASE
|
|
132
|
-
WHEN t.started_at >= ${
|
|
138
|
+
WHEN t.started_at >= ${Rn}
|
|
133
139
|
AND (
|
|
134
140
|
t.crewx_version IS NULL
|
|
135
141
|
OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
|
|
136
|
-
OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${
|
|
142
|
+
OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${En}) AS INTEGER) < ${Sn})
|
|
137
143
|
)
|
|
138
144
|
THEN COALESCE(t.cached_input_tokens, 0)
|
|
139
145
|
ELSE 0
|
|
@@ -152,7 +158,7 @@ ${r.join(`
|
|
|
152
158
|
FROM tasks t
|
|
153
159
|
${u}
|
|
154
160
|
GROUP BY t.agent_id, t.workspace_id, ${s}
|
|
155
|
-
`),p=new Map;for(let m of f){let k=typeof m.provider=="string"&&m.provider.trim()!==""?m.provider:"unknown",T={provider:k,inputTokens:m.input_tokens,outputTokens:m.output_tokens,cachedInputTokens:m.cached_input_tokens,totalTokens:m.input_tokens+m.output_tokens,costUsd:m.cost_usd,totalTasks:m.total_tasks,unavailableTaskCount:m.unavailable_task_count},E=m.workspace_id??null,b=JSON.stringify([m.agent_id,E]),L=p.get(b);if(!L){p.set(b,{agentId:m.agent_id,workspaceId:E,totalTasks:m.total_tasks,unavailableTaskCount:m.unavailable_task_count,inputTokens:m.input_tokens,outputTokens:m.output_tokens,cachedInputTokens:m.cached_input_tokens,costUsd:m.cost_usd,totalTokens:m.input_tokens+m.output_tokens,providers:[T]});continue}L.totalTasks+=m.total_tasks,L.unavailableTaskCount=(L.unavailableTaskCount??0)+m.unavailable_task_count,L.inputTokens+=m.input_tokens,L.outputTokens+=m.output_tokens,L.cachedInputTokens+=m.cached_input_tokens,L.costUsd+=m.cost_usd,L.totalTokens+=m.input_tokens+m.output_tokens;let y=L.providers.find(N=>N.provider===k);y?(y.inputTokens+=T.inputTokens,y.outputTokens+=T.outputTokens,y.cachedInputTokens+=T.cachedInputTokens,y.totalTokens+=T.totalTokens,y.costUsd+=T.costUsd,y.totalTasks+=T.totalTasks,y.unavailableTaskCount+=T.unavailableTaskCount):L.providers.push(T);}let g=[...p.values()];for(let m of g)m.providers.sort((k,T)=>k.provider===T.provider?0:k.provider==="unknown"?1:T.provider==="unknown"?-1:k.totalTokens!==T.totalTokens?T.totalTokens-k.totalTokens:k.provider<T.provider?-1:1);let _=(m,k)=>m===k?0:m<k?-1:1;return g.sort((m,k)=>{if(m.totalTokens!==k.totalTokens)return k.totalTokens-m.totalTokens;let T=_(m.agentId,k.agentId);return T!==0?T:m.workspaceId===k.workspaceId?0:m.workspaceId===null?1:k.workspaceId===null?-1:_(m.workspaceId,k.workspaceId)}),g}catch(s){throw new exports.RepositoryError("DB_ERROR","Failed to get agent usage",s)}finally{o.close();}}getAgentUsageTrendRaw(e,n,r){if(!this.dbExists())return [];let o=this.openHandle(false);try{let s=
|
|
161
|
+
`),p=new Map;for(let m of f){let k=typeof m.provider=="string"&&m.provider.trim()!==""?m.provider:"unknown",T={provider:k,inputTokens:m.input_tokens,outputTokens:m.output_tokens,cachedInputTokens:m.cached_input_tokens,totalTokens:m.input_tokens+m.output_tokens,costUsd:m.cost_usd,totalTasks:m.total_tasks,unavailableTaskCount:m.unavailable_task_count},E=m.workspace_id??null,b=JSON.stringify([m.agent_id,E]),L=p.get(b);if(!L){p.set(b,{agentId:m.agent_id,workspaceId:E,totalTasks:m.total_tasks,unavailableTaskCount:m.unavailable_task_count,inputTokens:m.input_tokens,outputTokens:m.output_tokens,cachedInputTokens:m.cached_input_tokens,costUsd:m.cost_usd,totalTokens:m.input_tokens+m.output_tokens,providers:[T]});continue}L.totalTasks+=m.total_tasks,L.unavailableTaskCount=(L.unavailableTaskCount??0)+m.unavailable_task_count,L.inputTokens+=m.input_tokens,L.outputTokens+=m.output_tokens,L.cachedInputTokens+=m.cached_input_tokens,L.costUsd+=m.cost_usd,L.totalTokens+=m.input_tokens+m.output_tokens;let y=L.providers.find(N=>N.provider===k);y?(y.inputTokens+=T.inputTokens,y.outputTokens+=T.outputTokens,y.cachedInputTokens+=T.cachedInputTokens,y.totalTokens+=T.totalTokens,y.costUsd+=T.costUsd,y.totalTasks+=T.totalTasks,y.unavailableTaskCount+=T.unavailableTaskCount):L.providers.push(T);}let g=[...p.values()];for(let m of g)m.providers.sort((k,T)=>k.provider===T.provider?0:k.provider==="unknown"?1:T.provider==="unknown"?-1:k.totalTokens!==T.totalTokens?T.totalTokens-k.totalTokens:k.provider<T.provider?-1:1);let _=(m,k)=>m===k?0:m<k?-1:1;return g.sort((m,k)=>{if(m.totalTokens!==k.totalTokens)return k.totalTokens-m.totalTokens;let T=_(m.agentId,k.agentId);return T!==0?T:m.workspaceId===k.workspaceId?0:m.workspaceId===null?1:k.workspaceId===null?-1:_(m.workspaceId,k.workspaceId)}),g}catch(s){throw new exports.RepositoryError("DB_ERROR","Failed to get agent usage",s)}finally{o.close();}}getAgentUsageTrendRaw(e,n,r){if(!this.dbExists())return [];let o=this.openHandle(false);try{let s=rr(drizzleOrm.sql.raw("t.status")),i=eo(drizzleOrm.sql.raw("t.metadata"));return o.db.all(r?drizzleOrm.sql`
|
|
156
162
|
SELECT
|
|
157
163
|
date(t.started_at) AS date,
|
|
158
164
|
t.agent_id,
|
|
@@ -160,11 +166,11 @@ ${r.join(`
|
|
|
160
166
|
COALESCE(SUM(
|
|
161
167
|
COALESCE(t.input_tokens, 0)
|
|
162
168
|
+ CASE
|
|
163
|
-
WHEN t.started_at >= ${
|
|
169
|
+
WHEN t.started_at >= ${Rn}
|
|
164
170
|
AND (
|
|
165
171
|
t.crewx_version IS NULL
|
|
166
172
|
OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
|
|
167
|
-
OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${
|
|
173
|
+
OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${En}) AS INTEGER) < ${Sn})
|
|
168
174
|
)
|
|
169
175
|
THEN COALESCE(t.cached_input_tokens, 0)
|
|
170
176
|
ELSE 0
|
|
@@ -188,11 +194,11 @@ ${r.join(`
|
|
|
188
194
|
COALESCE(SUM(
|
|
189
195
|
COALESCE(t.input_tokens, 0)
|
|
190
196
|
+ CASE
|
|
191
|
-
WHEN t.started_at >= ${
|
|
197
|
+
WHEN t.started_at >= ${Rn}
|
|
192
198
|
AND (
|
|
193
199
|
t.crewx_version IS NULL
|
|
194
200
|
OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
|
|
195
|
-
OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${
|
|
201
|
+
OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${En}) AS INTEGER) < ${Sn})
|
|
196
202
|
)
|
|
197
203
|
THEN COALESCE(t.cached_input_tokens, 0)
|
|
198
204
|
ELSE 0
|
|
@@ -207,14 +213,14 @@ ${r.join(`
|
|
|
207
213
|
AND t.started_at < ${n}
|
|
208
214
|
GROUP BY date(t.started_at), t.agent_id
|
|
209
215
|
ORDER BY date(t.started_at) ASC
|
|
210
|
-
`).map(c=>({date:c.date,agentId:c.agent_id,unavailableTaskCount:c.unavailable_task_count,inputTokens:c.input_tokens,outputTokens:c.output_tokens,cachedInputTokens:c.cached_input_tokens,costUsd:c.cost_usd,totalTokens:c.input_tokens+c.output_tokens}))}catch(s){throw new exports.RepositoryError("DB_ERROR","Failed to get agent usage trend",s)}finally{o.close();}}findTaskForStop(e,n){if(!this.dbExists())return;let r=this.openHandle(false);try{let o=r.db.select().from(exports.tasks).where(drizzleOrm.and(drizzleOrm.eq(exports.tasks.id,e),drizzleOrm.eq(exports.tasks.workspace_id,n))).limit(1).get();return o?
|
|
216
|
+
`).map(c=>({date:c.date,agentId:c.agent_id,unavailableTaskCount:c.unavailable_task_count,inputTokens:c.input_tokens,outputTokens:c.output_tokens,cachedInputTokens:c.cached_input_tokens,costUsd:c.cost_usd,totalTokens:c.input_tokens+c.output_tokens}))}catch(s){throw new exports.RepositoryError("DB_ERROR","Failed to get agent usage trend",s)}finally{o.close();}}findTaskForStop(e,n){if(!this.dbExists())return;let r=this.openHandle(false);try{let o=r.db.select().from(exports.tasks).where(drizzleOrm.and(drizzleOrm.eq(exports.tasks.id,e),drizzleOrm.eq(exports.tasks.workspace_id,n))).limit(1).get();return o?rt(o):void 0}catch(o){throw new exports.RepositoryError("DB_ERROR","Failed to find task for stop",o)}finally{r.close();}}findLatestTaskByMetadata(e){if(!this.dbExists())return null;let n=this.openHandle(false);try{return n.db.select({id:exports.tasks.id,thread_id:exports.tasks.thread_id,status:exports.tasks.status,result:exports.tasks.result,error:exports.tasks.error,started_at:exports.tasks.started_at,completed_at:exports.tasks.completed_at,metadata:exports.tasks.metadata}).from(exports.tasks).where(drizzleOrm.and(drizzleOrm.eq(exports.tasks.agent_id,e.agentId),drizzleOrm.eq(exports.tasks.workspace_id,e.workspaceId),drizzleOrm.sql`${exports.tasks.metadata} IS NOT NULL AND json_valid(${exports.tasks.metadata}) AND json_extract(${exports.tasks.metadata}, '$.' || ${e.metaKey}) = ${e.metaValue}`)).orderBy(drizzleOrm.desc(exports.tasks.started_at)).limit(1).get()??null}catch(r){throw new exports.RepositoryError("DB_ERROR","Failed to find latest task by metadata",r)}finally{n.close();}}markTaskFailed(e,n,r,o="failed",s){if(!this.dbExists())return;let i=this.openHandle(true);try{let d=new Date().toISOString(),c=r?drizzleOrm.and(drizzleOrm.eq(exports.tasks.id,e),drizzleOrm.eq(exports.tasks.status,"running"),drizzleOrm.eq(exports.tasks.workspace_id,r)):drizzleOrm.and(drizzleOrm.eq(exports.tasks.id,e),drizzleOrm.eq(exports.tasks.status,"running")),u=i.db.select({metadata:exports.tasks.metadata}).from(exports.tasks).where(c).limit(1).get();if(!u)return;let f={status:o,error:n,completed_at:d};if(s){let p=le(u.metadata);p.terminalReason=s,f.metadata=JSON.stringify(p);}i.db.update(exports.tasks).set(f).where(c).run();}catch(d){throw d instanceof exports.RepositoryError?d:new exports.RepositoryError("DB_ERROR","Failed to mark task failed",d)}finally{i.close();}}findTasksByPromptHint(e,n){let r=this.resolveDbPaths(),o=new Set,s=[];for(let i of r){if(!Oa.existsSync(i))continue;let d=C(i);try{let c=n?drizzleOrm.and(drizzleOrm.like(exports.tasks.prompt,`%${e}%`),drizzleOrm.eq(exports.tasks.workspace_id,n)):drizzleOrm.like(exports.tasks.prompt,`%${e}%`),u=d.db.select().from(exports.tasks).where(c).orderBy(drizzleOrm.asc(exports.tasks.started_at)).all();for(let f of u)o.has(f.id)||(o.add(f.id),s.push(rt(f)));}catch(c){throw new exports.RepositoryError("DB_ERROR","Failed to find tasks by prompt hint",c)}finally{d.close();}}return s}getProviderUsage(e,n,r){if(!this.dbExists())return [];let o=this.openHandle(false);try{let s=Ls(),i=rr(exports.tasks.status),d=eo(exports.tasks.metadata),c=drizzleOrm.sql`
|
|
211
217
|
COALESCE(${exports.tasks.input_tokens}, 0)
|
|
212
218
|
+ CASE
|
|
213
|
-
WHEN ${exports.tasks.started_at} >= ${
|
|
219
|
+
WHEN ${exports.tasks.started_at} >= ${Rn}
|
|
214
220
|
AND (
|
|
215
221
|
${exports.tasks.crewx_version} IS NULL
|
|
216
222
|
OR (${exports.tasks.crewx_version} LIKE '0.8.%' AND ${exports.tasks.crewx_version} NOT LIKE '0.8.9%')
|
|
217
|
-
OR (${exports.tasks.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${exports.tasks.crewx_version}, ${
|
|
223
|
+
OR (${exports.tasks.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${exports.tasks.crewx_version}, ${En}) AS INTEGER) < ${Sn})
|
|
218
224
|
)
|
|
219
225
|
THEN COALESCE(${exports.tasks.cached_input_tokens}, 0)
|
|
220
226
|
ELSE 0
|
|
@@ -234,14 +240,14 @@ ${r.join(`
|
|
|
234
240
|
${u}
|
|
235
241
|
GROUP BY ${s}
|
|
236
242
|
ORDER BY (COALESCE(SUM(${c}), 0) + COALESCE(SUM(${exports.tasks.output_tokens}), 0)) DESC
|
|
237
|
-
`).map(p=>({provider:p.provider,totalTasks:p.total_tasks,unavailableTaskCount:p.unavailable_task_count,inputTokens:p.input_tokens,outputTokens:p.output_tokens,cachedInputTokens:p.cached_input_tokens,costUsd:p.cost_usd,totalTokens:p.input_tokens+p.output_tokens,activeDurationMs:p.active_duration_ms??0,lastActiveAt:p.last_active_at??null}))}catch(s){throw new exports.RepositoryError("DB_ERROR","Failed to get provider usage",s)}finally{o.close();}}getModelUsage(e,n,r){if(!this.dbExists())return [];let o=this.openHandle(false);try{let s=
|
|
243
|
+
`).map(p=>({provider:p.provider,totalTasks:p.total_tasks,unavailableTaskCount:p.unavailable_task_count,inputTokens:p.input_tokens,outputTokens:p.output_tokens,cachedInputTokens:p.cached_input_tokens,costUsd:p.cost_usd,totalTokens:p.input_tokens+p.output_tokens,activeDurationMs:p.active_duration_ms??0,lastActiveAt:p.last_active_at??null}))}catch(s){throw new exports.RepositoryError("DB_ERROR","Failed to get provider usage",s)}finally{o.close();}}getModelUsage(e,n,r){if(!this.dbExists())return [];let o=this.openHandle(false);try{let s=Ls(),i=rr(exports.tasks.status),d=eo(exports.tasks.metadata),c=drizzleOrm.sql`
|
|
238
244
|
COALESCE(${exports.tasks.input_tokens}, 0)
|
|
239
245
|
+ CASE
|
|
240
|
-
WHEN ${exports.tasks.started_at} >= ${
|
|
246
|
+
WHEN ${exports.tasks.started_at} >= ${Rn}
|
|
241
247
|
AND (
|
|
242
248
|
${exports.tasks.crewx_version} IS NULL
|
|
243
249
|
OR (${exports.tasks.crewx_version} LIKE '0.8.%' AND ${exports.tasks.crewx_version} NOT LIKE '0.8.9%')
|
|
244
|
-
OR (${exports.tasks.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${exports.tasks.crewx_version}, ${
|
|
250
|
+
OR (${exports.tasks.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${exports.tasks.crewx_version}, ${En}) AS INTEGER) < ${Sn})
|
|
245
251
|
)
|
|
246
252
|
THEN COALESCE(${exports.tasks.cached_input_tokens}, 0)
|
|
247
253
|
ELSE 0
|
|
@@ -261,7 +267,7 @@ ${r.join(`
|
|
|
261
267
|
FROM ${exports.tasks}
|
|
262
268
|
${u}
|
|
263
269
|
GROUP BY ${exports.tasks.model}, ${s}
|
|
264
|
-
`),p=new Map;for(let g of f){let _=
|
|
270
|
+
`),p=new Map;for(let g of f){let _=Wo(g.model??""),m=JSON.stringify([g.provider,_]),k=p.get(m);k?(k.totalTasks+=g.total_tasks,k.unavailableTaskCount=(k.unavailableTaskCount??0)+g.unavailable_task_count,k.inputTokens+=g.input_tokens,k.outputTokens+=g.output_tokens,k.cachedInputTokens+=g.cached_input_tokens,k.costUsd+=g.cost_usd,k.totalTokens+=g.input_tokens+g.output_tokens,k.activeDurationMs+=g.active_duration_ms??0,g.last_active_at&&(!k.lastActiveAt||g.last_active_at>k.lastActiveAt)&&(k.lastActiveAt=g.last_active_at)):p.set(m,{model:_,provider:g.provider,totalTasks:g.total_tasks,unavailableTaskCount:g.unavailable_task_count,inputTokens:g.input_tokens,outputTokens:g.output_tokens,cachedInputTokens:g.cached_input_tokens,costUsd:g.cost_usd,totalTokens:g.input_tokens+g.output_tokens,activeDurationMs:g.active_duration_ms??0,lastActiveAt:g.last_active_at??null});}return Array.from(p.values()).sort((g,_)=>_.costUsd-g.costUsd)}catch(s){throw new exports.RepositoryError("DB_ERROR","Failed to get model usage",s)}finally{o.close();}}getTasksForReport(e,n,r){if(!this.dbExists())return [];let o=this.openHandle(false);try{let s=r?drizzleOrm.sql`WHERE ${exports.tasks.started_at} >= ${e} AND ${exports.tasks.started_at} < ${n} AND ${exports.tasks.workspace_id} = ${r}`:drizzleOrm.sql`WHERE ${exports.tasks.started_at} >= ${e} AND ${exports.tasks.started_at} < ${n}`;return o.db.all(drizzleOrm.sql`
|
|
265
271
|
SELECT
|
|
266
272
|
${exports.tasks.thread_id} AS thread_id,
|
|
267
273
|
${exports.tasks.agent_id} AS agent_id,
|
|
@@ -275,16 +281,16 @@ ${r.join(`
|
|
|
275
281
|
`).map(d=>({threadId:d.thread_id,agentId:d.agent_id,startedAt:d.started_at,status:d.status,error:d.error,exitCode:d.exit_code}))}catch(s){throw new exports.RepositoryError("DB_ERROR","Failed to get tasks for report",s)}finally{o.close();}}getDelegationMatrix(e,n,r){if(!this.dbExists())return {edges:[],truncated:false};let o=this.openHandle(false);try{let s=drizzleOrm.sql`
|
|
276
282
|
COALESCE(${exports.tasks.input_tokens}, 0)
|
|
277
283
|
+ CASE
|
|
278
|
-
WHEN ${exports.tasks.started_at} >= ${
|
|
284
|
+
WHEN ${exports.tasks.started_at} >= ${Rn}
|
|
279
285
|
AND (
|
|
280
286
|
${exports.tasks.crewx_version} IS NULL
|
|
281
287
|
OR (${exports.tasks.crewx_version} LIKE '0.8.%' AND ${exports.tasks.crewx_version} NOT LIKE '0.8.9%')
|
|
282
|
-
OR (${exports.tasks.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${exports.tasks.crewx_version}, ${
|
|
288
|
+
OR (${exports.tasks.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${exports.tasks.crewx_version}, ${En}) AS INTEGER) < ${Sn})
|
|
283
289
|
)
|
|
284
290
|
THEN COALESCE(${exports.tasks.cached_input_tokens}, 0)
|
|
285
291
|
ELSE 0
|
|
286
292
|
END
|
|
287
|
-
`,i=
|
|
293
|
+
`,i=rr(exports.tasks.status),d=r?drizzleOrm.sql`WHERE ${i} AND ${exports.tasks.started_at} >= ${e} AND ${exports.tasks.started_at} < ${n} AND ${exports.tasks.workspace_id} = ${r}`:drizzleOrm.sql`WHERE ${i} AND ${exports.tasks.started_at} >= ${e} AND ${exports.tasks.started_at} < ${n}`,c=o.db.all(drizzleOrm.sql`
|
|
288
294
|
SELECT
|
|
289
295
|
${exports.tasks.caller_agent_id} AS caller_agent_id,
|
|
290
296
|
${exports.tasks.agent_id} AS agent_id,
|
|
@@ -295,41 +301,41 @@ ${r.join(`
|
|
|
295
301
|
${d}
|
|
296
302
|
GROUP BY ${exports.tasks.caller_agent_id}, ${exports.tasks.agent_id}
|
|
297
303
|
ORDER BY task_count DESC, ${exports.tasks.caller_agent_id} ASC, ${exports.tasks.agent_id} ASC
|
|
298
|
-
LIMIT ${
|
|
299
|
-
`),u=c.length>Ns;return {edges:c.slice(0,Ns).map(p=>({callerAgentId:p.caller_agent_id??null,agentId:p.agent_id,taskCount:p.task_count,totalTokens:p.input_tokens+p.output_tokens,outputTokens:p.output_tokens})),truncated:u}}catch(s){throw new exports.RepositoryError("DB_ERROR","Failed to get delegation matrix",s)}finally{o.close();}}findTaskEvidence(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{let r=[];e.workspaceId&&r.push(drizzleOrm.eq(exports.tasks.workspace_id,e.workspaceId)),e.agents&&e.agents.length>0&&r.push(drizzleOrm.inArray(exports.tasks.agent_id,e.agents)),e.statuses&&e.statuses.length>0&&r.push(drizzleOrm.inArray(exports.tasks.status,e.statuses)),e.from&&r.push(drizzleOrm.gte(exports.tasks.started_at,e.from)),e.to&&r.push(drizzleOrm.lt(exports.tasks.started_at,e.to));let o=r.length>0?drizzleOrm.and(...r):void 0,s=(e.order??"DESC")==="ASC"?drizzleOrm.asc(exports.tasks.started_at):drizzleOrm.desc(exports.tasks.started_at),i={id:exports.tasks.id,agent_id:exports.tasks.agent_id,status:exports.tasks.status,prompt:exports.tasks.prompt,started_at:exports.tasks.started_at,completed_at:exports.tasks.completed_at,thread_id:exports.tasks.thread_id,error:exports.tasks.error,metadata:exports.tasks.metadata};return (e.limit?n.db.select(i).from(exports.tasks).where(o).orderBy(s).limit(e.limit).all():n.db.select(i).from(exports.tasks).where(o).orderBy(s).all()).map(({error:c,metadata:u,...f})=>({...f,status:vt({status:f.status,error:c,metadata:u})}))}catch(r){throw new exports.RepositoryError("DB_ERROR","Failed to find task evidence",r)}finally{n.close();}}findThreadChains(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{let r=e.maxThreads??8,o=e.maxTurnsPerThread??4,s=[drizzleOrm.isNotNull(exports.tasks.thread_id),drizzleOrm.isNull(exports.tasks.parent_task_id),drizzleOrm.isNull(exports.tasks.caller_agent_id),drizzleOrm.or(drizzleOrm.isNull(exports.tasks.platform),drizzleOrm.ne(exports.tasks.platform,"workflow")),drizzleOrm.or(drizzleOrm.isNull(exports.tasks.metadata),drizzleOrm.and(drizzleOrm.notLike(exports.tasks.metadata,'%"kind":"workflow_card"%'),drizzleOrm.notLike(exports.tasks.metadata,'%"kind":"workflow_ui_instance"%'))),drizzleOrm.or(drizzleOrm.isNull(exports.tasks.metadata),drizzleOrm.notLike(exports.tasks.metadata,'%"retriedFromTaskId"%'))];e.workspaceId&&s.push(drizzleOrm.eq(exports.tasks.workspace_id,e.workspaceId)),e.from&&s.push(drizzleOrm.gte(exports.tasks.started_at,e.from)),e.to&&s.push(drizzleOrm.lt(exports.tasks.started_at,e.to));let i=n.db.select({id:exports.tasks.id,agent_id:exports.tasks.agent_id,status:exports.tasks.status,prompt:exports.tasks.prompt,started_at:exports.tasks.started_at,completed_at:exports.tasks.completed_at,thread_id:exports.tasks.thread_id}).from(exports.tasks).where(drizzleOrm.and(...s)).orderBy(drizzleOrm.asc(exports.tasks.started_at),drizzleOrm.asc(exports.tasks.id)).all(),d=new Map;for(let u of i){if(!u.thread_id)continue;let f={id:u.id,agentId:u.agent_id,status:u.status,prompt:u.prompt,startedAt:u.started_at,completedAt:u.completed_at},p=d.get(u.thread_id);p?p.push(f):d.set(u.thread_id,[f]);}let c=[];for(let[u,f]of d){let p=f.filter(g=>g.agentId===e.targetAgentId).length;p<2||c.push({threadId:u,targetAgentTurnCount:p,turns:f});}return c.sort((u,f)=>{let p=u.turns[u.turns.length-1].startedAt,g=f.turns[f.turns.length-1].startedAt;return p<g?1:p>g?-1:0}),c.slice(0,r).map(u=>({threadId:u.threadId,targetAgentTurnCount:u.targetAgentTurnCount,turns:u.turns.slice(-o)}))}catch(r){throw new exports.RepositoryError("DB_ERROR","Failed to find thread chains",r)}finally{n.close();}}};});h();se();pe();h();se();fe();ce();pe();ue();Ao();var ee=class extends exports.RepositoryError{reason;constructor(e,n="VALIDATION",r=e,o){super(n,r,o),this.name="CommonCodeRepositoryError",this.reason=e;}},aa="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function Ml(){let t=crypto.randomBytes(16),e="";for(let n of t)e+=aa[n%aa.length];return e.slice(0,12)}function Oo(){return `c_${Ml()}`}function Hl(t){return typeof t=="string"&&exports.COMMON_CODE_GROUPS.includes(t)}function Ul(t){return typeof t=="string"&&exports.COMMON_CODE_COLORS.includes(t)}function tn(t){if(!Hl(t))throw new ee("COMMON_CODE_GROUP_INVALID","VALIDATION",`Unsupported common-code group: ${t}`)}function da(t){if(!Ul(t))throw new ee("COMMON_CODE_COLOR_INVALID","VALIDATION",`Unsupported common-code color: ${t}`)}function ca(t){let e=typeof t=="string"?t.trim():"",n=[...e].length;if(n<1||n>20)throw new ee("COMMON_CODE_NAME_INVALID","VALIDATION","Common-code names must contain 1 to 20 Unicode characters");return e}function nn(t){if(typeof t!="string"||t.trim().length===0)throw new ee("COMMON_CODE_WORKSPACE_INVALID","VALIDATION","Workspace id is required for a user common code")}function Ir(t){if(typeof t!="string"||t.trim().length===0)throw new ee("COMMON_CODE_CODE_INVALID","VALIDATION","Common-code code is required")}function St(t,e){return drizzleOrm.and(drizzleOrm.eq(I.code_group,t),drizzleOrm.or(drizzleOrm.isNull(I.workspace_id),drizzleOrm.eq(I.workspace_id,e)))}var No=class extends exports.BaseSqliteRepository{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=Se.join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath??super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(!e&&!Sa.existsSync(n))throw new exports.RepositoryError("NOT_FOUND","Database not found");e&&Sa.mkdirSync(Se.dirname(n),{recursive:true});let r=C(n);if(e)try{V(r.db,n);}catch(o){throw r.close(),o}return r}listSelectable(e,n){if(tn(e),nn(n),!this.dbExists())return [];let r=this.openHandle(false);try{return r.db.select().from(I).where(drizzleOrm.and(St(e,n),drizzleOrm.eq(I.is_archived,0))).orderBy(drizzleOrm.asc(I.sort_order),drizzleOrm.asc(I.code)).all()}catch(o){throw new exports.RepositoryError("DB_ERROR","Failed to list selectable common codes",o)}finally{r.close();}}listForHistory(e,n){if(tn(e),nn(n),!this.dbExists())return [];let r=this.openHandle(false);try{return r.db.select().from(I).where(St(e,n)).orderBy(drizzleOrm.asc(I.sort_order),drizzleOrm.asc(I.code)).all()}catch(o){throw new exports.RepositoryError("DB_ERROR","Failed to list common-code history",o)}finally{r.close();}}reorder(e){let n=e.group;if(tn(n),nn(e.workspaceId),!Array.isArray(e.codes)||e.codes.length===0)throw new ee("COMMON_CODE_REORDER_INVALID","VALIDATION","At least one common-code code is required for reordering");for(let o of e.codes)Ir(o);if(new Set(e.codes).size!==e.codes.length)throw new ee("COMMON_CODE_REORDER_INVALID","VALIDATION","Common-code reorder entries must be unique");if(!this.dbExists())throw new ee("COMMON_CODE_REORDER_INVALID","VALIDATION","Common-code reorder scope does not exist");let r=this.openHandle(true);try{return r.db.transaction(o=>{let s=o.select().from(I).where(St(n,e.workspaceId)).all(),i=s.filter(_=>_.is_archived===0),d=new Set(s.map(_=>_.code)),c=new Set(i.map(_=>_.code)),u=e.codes.find(_=>!d.has(_));if(u)throw new ee("COMMON_CODE_REORDER_INVALID","VALIDATION",`Common code is not available in this scope: ${n}/${u}`);if(e.codes.length!==i.length||e.codes.some(_=>!c.has(_)))throw new ee("COMMON_CODE_REORDER_INVALID","VALIDATION","Common-code reorder must contain every non-archived code in the scope");let f=new Map(i.map(_=>[_.code,_])),p=e.codes.map(_=>{let m=f.get(_);if(!m)throw new ee("COMMON_CODE_REORDER_INVALID","VALIDATION",`Common code is not selectable in this scope: ${n}/${_}`);return m}),g;for(let[_,m]of p.entries())m.sort_order!==_&&(g??=new Date().toISOString(),o.update(I).set({sort_order:_,updated_at:g}).where(drizzleOrm.and(drizzleOrm.eq(I.code_group,n),drizzleOrm.eq(I.code,m.code))).run());return o.select().from(I).where(St(n,e.workspaceId)).orderBy(drizzleOrm.asc(I.sort_order),drizzleOrm.asc(I.code)).all()},{behavior:"immediate"})}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to reorder common codes",o)}finally{r.close();}}resolve(e,n){if(tn(e),Ir(n),!this.dbExists())return null;let r=this.openHandle(false);try{return r.db.select().from(I).where(drizzleOrm.and(drizzleOrm.eq(I.code_group,e),drizzleOrm.eq(I.code,n))).limit(1).get()??null}catch(o){throw new exports.RepositoryError("DB_ERROR","Failed to resolve common code",o)}finally{r.close();}}createThreadState(e){nn(e.workspaceId);let n=ca(e.name);da(e.color);let r=this.openHandle(true);try{return r.db.transaction(o=>{if(o.select({code:I.code}).from(I).where(drizzleOrm.and(St("THREAD_STATE",e.workspaceId),drizzleOrm.eq(I.is_archived,0),drizzleOrm.eq(I.code_name,n))).limit(1).get())throw new ee("COMMON_CODE_NAME_CONFLICT","CONFLICT",`Common-code name is already in use: ${n}`);let i=o.select({maxSortOrder:drizzleOrm.sql`max(${I.sort_order})`}).from(I).where(St("THREAD_STATE",e.workspaceId)).get(),d=new Date().toISOString(),c=Oo();for(;o.select({code:I.code}).from(I).where(drizzleOrm.and(drizzleOrm.eq(I.code_group,"THREAD_STATE"),drizzleOrm.eq(I.code,c))).limit(1).get();)c=Oo();o.insert(I).values({code_group:"THREAD_STATE",code:c,code_name:n,color:e.color,sort_order:(i?.maxSortOrder??-1)+1,workspace_id:e.workspaceId,is_builtin:0,is_archived:0,metadata:null,created_at:d,updated_at:d}).run();let u=o.select().from(I).where(drizzleOrm.and(drizzleOrm.eq(I.code_group,"THREAD_STATE"),drizzleOrm.eq(I.code,c))).limit(1).get();if(!u)throw new exports.RepositoryError("DB_ERROR","Created common code could not be read back");return u},{behavior:"immediate"})}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to create thread state common code",o)}finally{r.close();}}updateDisplay(e){if(tn(e.group),Ir(e.code),nn(e.workspaceId),e.name===void 0&&e.color===void 0)throw new ee("COMMON_CODE_UPDATE_EMPTY","VALIDATION","At least one display value is required");let n=e.name===void 0||e.name===null?e.name:ca(e.name);e.color!==void 0&&da(e.color);let r=this.openHandle(true);try{return r.db.transaction(o=>{let s=o.select().from(I).where(drizzleOrm.and(drizzleOrm.eq(I.code_group,e.group),drizzleOrm.eq(I.code,e.code))).limit(1).get();if(!s)throw new ee("COMMON_CODE_NOT_FOUND","NOT_FOUND",`Common code not found: ${e.group}/${e.code}`);if(this.assertOwnership(s,e.workspaceId),n===null&&s.is_builtin!==1)throw new ee("COMMON_CODE_NAME_INVALID","VALIDATION","User common-code names cannot be cleared");if(typeof n=="string"&&s.is_archived===0){let c=drizzleOrm.and(St(e.group,e.workspaceId),drizzleOrm.eq(I.is_archived,0));if(o.select({code:I.code}).from(I).where(drizzleOrm.and(c,drizzleOrm.eq(I.code_name,n),drizzleOrm.sql`${I.code} <> ${e.code}`)).limit(1).get())throw new ee("COMMON_CODE_NAME_CONFLICT","CONFLICT",`Common-code name is already in use: ${n}`)}let i={updated_at:new Date().toISOString()};e.name!==void 0&&(i.code_name=n??null),e.color!==void 0&&(i.color=e.color),o.update(I).set(i).where(drizzleOrm.and(drizzleOrm.eq(I.code_group,e.group),drizzleOrm.eq(I.code,e.code))).run();let d=o.select().from(I).where(drizzleOrm.and(drizzleOrm.eq(I.code_group,e.group),drizzleOrm.eq(I.code,e.code))).limit(1).get();if(!d)throw new exports.RepositoryError("DB_ERROR","Updated common code could not be read back");return d},{behavior:"immediate"})}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to update common-code display values",o)}finally{r.close();}}archive(e,n,r,o=true){if(tn(e),Ir(n),nn(r),typeof o!="boolean")throw new ee("COMMON_CODE_ARCHIVE_INVALID","VALIDATION","Archive state must be boolean");let s=this.openHandle(true);try{return s.db.transaction(i=>{let d=i.select().from(I).where(drizzleOrm.and(drizzleOrm.eq(I.code_group,e),drizzleOrm.eq(I.code,n))).limit(1).get();if(!d)throw new ee("COMMON_CODE_NOT_FOUND","NOT_FOUND",`Common code not found: ${e}/${n}`);if(d.is_builtin===1)throw new ee("COMMON_CODE_BUILTIN_ARCHIVE_FORBIDDEN","VALIDATION","Builtin common codes cannot be archived");if(this.assertOwnership(d,r),!o&&d.code_name!==null&&i.select({code:I.code}).from(I).where(drizzleOrm.and(St(e,r),drizzleOrm.eq(I.is_archived,0),drizzleOrm.eq(I.code_name,d.code_name),drizzleOrm.ne(I.code,n))).limit(1).get())throw new ee("COMMON_CODE_NAME_CONFLICT","CONFLICT",`Common-code name is already in use: ${d.code_name}`);i.update(I).set({is_archived:o?1:0,updated_at:new Date().toISOString()}).where(drizzleOrm.and(drizzleOrm.eq(I.code_group,e),drizzleOrm.eq(I.code,n))).run();let c=i.select().from(I).where(drizzleOrm.and(drizzleOrm.eq(I.code_group,e),drizzleOrm.eq(I.code,n))).limit(1).get();if(!c)throw new exports.RepositoryError("DB_ERROR","Archived common code could not be read back");return c},{behavior:"immediate"})}catch(i){throw i instanceof exports.RepositoryError?i:new exports.RepositoryError("DB_ERROR","Failed to archive common code",i)}finally{s.close();}}assertOwnership(e,n){if(e.workspace_id!==null&&e.workspace_id!==n)throw new ee("COMMON_CODE_SCOPE_FORBIDDEN","VALIDATION","Workspace does not own this common code")}};h();se();fe();ce();pe();ue();h();function Co(t){let e=Se__namespace.resolve(t);return process.platform==="win32"&&(e=e.replace(/\\/g,"/"),e=e.replace(/^([A-Z]):/,(n,r)=>`${r.toLowerCase()}:`)),e.length>1&&!/^[a-zA-Z]:\/$/.test(e)&&(e=e.replace(/\/+$/,"")),e}function ua(t){let e=Co(t);return crypto.createHash("sha256").update(e).digest("hex")}function Ar(t){return t.toLowerCase().replace(/[^a-z0-9-]/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}var Do=class extends exports.BaseSqliteRepository{dbRoot;constructor(e={}){super(),this.dbRoot=e.dbRoot;}resolveDbPath(){return this.dbRoot?Se.join(this.dbRoot,".crewx","crewx.db"):super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=Se.dirname(n);Sa.existsSync(o)||Sa.mkdirSync(o,{recursive:true});}else if(!Sa.existsSync(n))throw new exports.RepositoryError("NOT_FOUND","Database not found");let r=C(n);if(e)try{Qt(r.db);}catch(o){throw r.close(),o}return r}resolveSlug(e,n,r){let o=Ar(Se.basename(r)),i=`${Ar(Se.basename(Se.dirname(r)))}-${o}`,d=[o,i];try{let c=u=>e.select({id:x.id}).from(x).where(drizzleOrm.and(drizzleOrm.eq(x.slug,u),drizzleOrm.ne(x.id,n))).limit(1).all().length>0;for(let u of d)if(!c(u))return u;for(let u=2;u<1e3;u+=1){let f=`${i}-${u}`;if(!c(f))return f}}catch{}return o}normalizeLegacySlugs(){if(!this.dbExists())return {updated:0,checked:0};let e=this.openHandle(true);try{let n=e.db.select({id:x.id,slug:x.slug}).from(x).all(),r=0;for(let o of n)if(o.slug.includes("/")){let s=Ar(o.slug.replace(/\//g,"-"));e.db.update(x).set({slug:s,updated_at:new Date().toISOString()}).where(drizzleOrm.eq(x.id,o.id)).run(),r+=1;}return {updated:r,checked:n.length}}catch(n){throw new exports.RepositoryError("DB_ERROR","Failed to normalize legacy slugs",n)}finally{e.close();}}ensureRow(e,n){let{id:r,slug:o,name:s,workspacePath:i}=n,d=new Date().toISOString();e.insert(x).values({id:r,slug:o,name:s,workspace_path:i,is_active:1,created_at:d,updated_at:d}).onConflictDoNothing().run(),e.update(x).set({workspace_path:i,updated_at:d}).where(drizzleOrm.and(drizzleOrm.eq(x.id,r),drizzleOrm.isNull(x.workspace_path))).run();}registerWorkspace(e){let n=Co(e),r=this.openHandle(true);try{let o=ua(n),s=Se.basename(n),i=this.resolveSlug(r.db,o,n);return this.ensureRow(r.db,{id:o,slug:i,name:s,workspacePath:n}),{id:o,slug:i}}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to register workspace",o)}finally{r.close();}}listProjects(e){if(!this.dbExists())return {rows:[],total:0};let n=this.openHandle(false);try{let r=e.isActive!==void 0?drizzleOrm.eq(x.is_active,e.isActive?1:0):void 0,o=n.db.select({count:drizzleOrm.sql`count(*)`}).from(x).where(r).get();return {rows:n.db.select().from(x).where(r).orderBy(drizzleOrm.desc(x.updated_at)).limit(e.limit).offset(e.offset).all(),total:o?.count??0}}catch(r){throw new exports.RepositoryError("DB_ERROR","Failed to list projects",r)}finally{n.close();}}findById(e){if(!this.dbExists())return;let n=this.openHandle(false);try{return n.db.select().from(x).where(drizzleOrm.eq(x.id,e)).limit(1).get()??void 0}catch(r){throw new exports.RepositoryError("DB_ERROR","Failed to find workspace",r)}finally{n.close();}}toggleStar(e){let n=this.openHandle(true);try{let r=n.db.select({starred:x.starred}).from(x).where(drizzleOrm.eq(x.id,e)).get();if(!r)return null;let o=r.starred?0:1;return n.db.update(x).set({starred:o}).where(drizzleOrm.eq(x.id,e)).run(),{starred:!!o}}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to toggle workspace star",r)}finally{n.close();}}findAgentsByProject(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.all(drizzleOrm.sql`SELECT DISTINCT agent_id FROM tasks WHERE workspace_id = ${e} AND agent_id IS NOT NULL ORDER BY agent_id`).map(o=>o.agent_id)}catch(r){throw new exports.RepositoryError("DB_ERROR","Failed to find agents by project",r)}finally{n.close();}}findThreadsByProject(e,n){if(!this.dbExists())return {rows:[],total:0};let r=this.openHandle(false);try{let o=r.db.get(drizzleOrm.sql`SELECT COUNT(*) as count FROM threads WHERE workspace_id = ${e}`);return {rows:r.db.all(drizzleOrm.sql`SELECT t.*,
|
|
304
|
+
LIMIT ${Ds+1}
|
|
305
|
+
`),u=c.length>Ds;return {edges:c.slice(0,Ds).map(p=>({callerAgentId:p.caller_agent_id??null,agentId:p.agent_id,taskCount:p.task_count,totalTokens:p.input_tokens+p.output_tokens,outputTokens:p.output_tokens})),truncated:u}}catch(s){throw new exports.RepositoryError("DB_ERROR","Failed to get delegation matrix",s)}finally{o.close();}}findTaskEvidence(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{let r=[];e.workspaceId&&r.push(drizzleOrm.eq(exports.tasks.workspace_id,e.workspaceId)),e.agents&&e.agents.length>0&&r.push(drizzleOrm.inArray(exports.tasks.agent_id,e.agents)),e.statuses&&e.statuses.length>0&&r.push(drizzleOrm.inArray(exports.tasks.status,e.statuses)),e.from&&r.push(drizzleOrm.gte(exports.tasks.started_at,e.from)),e.to&&r.push(drizzleOrm.lt(exports.tasks.started_at,e.to));let o=r.length>0?drizzleOrm.and(...r):void 0,s=(e.order??"DESC")==="ASC"?drizzleOrm.asc(exports.tasks.started_at):drizzleOrm.desc(exports.tasks.started_at),i={id:exports.tasks.id,agent_id:exports.tasks.agent_id,status:exports.tasks.status,prompt:exports.tasks.prompt,started_at:exports.tasks.started_at,completed_at:exports.tasks.completed_at,thread_id:exports.tasks.thread_id,error:exports.tasks.error,metadata:exports.tasks.metadata};return (e.limit?n.db.select(i).from(exports.tasks).where(o).orderBy(s).limit(e.limit).all():n.db.select(i).from(exports.tasks).where(o).orderBy(s).all()).map(({error:c,metadata:u,...f})=>({...f,status:Nt({status:f.status,error:c,metadata:u})}))}catch(r){throw new exports.RepositoryError("DB_ERROR","Failed to find task evidence",r)}finally{n.close();}}findThreadChains(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{let r=e.maxThreads??8,o=e.maxTurnsPerThread??4,s=[drizzleOrm.isNotNull(exports.tasks.thread_id),drizzleOrm.isNull(exports.tasks.parent_task_id),drizzleOrm.isNull(exports.tasks.caller_agent_id),drizzleOrm.or(drizzleOrm.isNull(exports.tasks.platform),drizzleOrm.ne(exports.tasks.platform,"workflow")),drizzleOrm.or(drizzleOrm.isNull(exports.tasks.metadata),drizzleOrm.and(drizzleOrm.notLike(exports.tasks.metadata,'%"kind":"workflow_card"%'),drizzleOrm.notLike(exports.tasks.metadata,'%"kind":"workflow_ui_instance"%'))),drizzleOrm.or(drizzleOrm.isNull(exports.tasks.metadata),drizzleOrm.notLike(exports.tasks.metadata,'%"retriedFromTaskId"%'))];e.workspaceId&&s.push(drizzleOrm.eq(exports.tasks.workspace_id,e.workspaceId)),e.from&&s.push(drizzleOrm.gte(exports.tasks.started_at,e.from)),e.to&&s.push(drizzleOrm.lt(exports.tasks.started_at,e.to));let i=n.db.select({id:exports.tasks.id,agent_id:exports.tasks.agent_id,status:exports.tasks.status,prompt:exports.tasks.prompt,started_at:exports.tasks.started_at,completed_at:exports.tasks.completed_at,thread_id:exports.tasks.thread_id}).from(exports.tasks).where(drizzleOrm.and(...s)).orderBy(drizzleOrm.asc(exports.tasks.started_at),drizzleOrm.asc(exports.tasks.id)).all(),d=new Map;for(let u of i){if(!u.thread_id)continue;let f={id:u.id,agentId:u.agent_id,status:u.status,prompt:u.prompt,startedAt:u.started_at,completedAt:u.completed_at},p=d.get(u.thread_id);p?p.push(f):d.set(u.thread_id,[f]);}let c=[];for(let[u,f]of d){let p=f.filter(g=>g.agentId===e.targetAgentId).length;p<2||c.push({threadId:u,targetAgentTurnCount:p,turns:f});}return c.sort((u,f)=>{let p=u.turns[u.turns.length-1].startedAt,g=f.turns[f.turns.length-1].startedAt;return p<g?1:p>g?-1:0}),c.slice(0,r).map(u=>({threadId:u.threadId,targetAgentTurnCount:u.targetAgentTurnCount,turns:u.turns.slice(-o)}))}catch(r){throw new exports.RepositoryError("DB_ERROR","Failed to find thread chains",r)}finally{n.close();}}};});h();se();pe();h();se();fe();ce();pe();ue();Co();var ee=class extends exports.RepositoryError{reason;constructor(e,n="VALIDATION",r=e,o){super(n,r,o),this.name="CommonCodeRepositoryError",this.reason=e;}},pa="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function jl(){let t=crypto.randomBytes(16),e="";for(let n of t)e+=pa[n%pa.length];return e.slice(0,12)}function Po(){return `c_${jl()}`}function Wl(t){return typeof t=="string"&&exports.COMMON_CODE_GROUPS.includes(t)}function Gl(t){return typeof t=="string"&&exports.COMMON_CODE_COLORS.includes(t)}function sn(t){if(!Wl(t))throw new ee("COMMON_CODE_GROUP_INVALID","VALIDATION",`Unsupported common-code group: ${t}`)}function fa(t){if(!Gl(t))throw new ee("COMMON_CODE_COLOR_INVALID","VALIDATION",`Unsupported common-code color: ${t}`)}function ga(t){let e=typeof t=="string"?t.trim():"",n=[...e].length;if(n<1||n>20)throw new ee("COMMON_CODE_NAME_INVALID","VALIDATION","Common-code names must contain 1 to 20 Unicode characters");return e}function an(t){if(typeof t!="string"||t.trim().length===0)throw new ee("COMMON_CODE_WORKSPACE_INVALID","VALIDATION","Workspace id is required for a user common code")}function Nr(t){if(typeof t!="string"||t.trim().length===0)throw new ee("COMMON_CODE_CODE_INVALID","VALIDATION","Common-code code is required")}function It(t,e){return drizzleOrm.and(drizzleOrm.eq(I.code_group,t),drizzleOrm.or(drizzleOrm.isNull(I.workspace_id),drizzleOrm.eq(I.workspace_id,e)))}var Do=class extends exports.BaseSqliteRepository{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=Se.join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath??super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(!e&&!Oa.existsSync(n))throw new exports.RepositoryError("NOT_FOUND","Database not found");e&&Oa.mkdirSync(Se.dirname(n),{recursive:true});let r=C(n);if(e)try{V(r.db,n);}catch(o){throw r.close(),o}return r}listSelectable(e,n){if(sn(e),an(n),!this.dbExists())return [];let r=this.openHandle(false);try{return r.db.select().from(I).where(drizzleOrm.and(It(e,n),drizzleOrm.eq(I.is_archived,0))).orderBy(drizzleOrm.asc(I.sort_order),drizzleOrm.asc(I.code)).all()}catch(o){throw new exports.RepositoryError("DB_ERROR","Failed to list selectable common codes",o)}finally{r.close();}}listForHistory(e,n){if(sn(e),an(n),!this.dbExists())return [];let r=this.openHandle(false);try{return r.db.select().from(I).where(It(e,n)).orderBy(drizzleOrm.asc(I.sort_order),drizzleOrm.asc(I.code)).all()}catch(o){throw new exports.RepositoryError("DB_ERROR","Failed to list common-code history",o)}finally{r.close();}}reorder(e){let n=e.group;if(sn(n),an(e.workspaceId),!Array.isArray(e.codes)||e.codes.length===0)throw new ee("COMMON_CODE_REORDER_INVALID","VALIDATION","At least one common-code code is required for reordering");for(let o of e.codes)Nr(o);if(new Set(e.codes).size!==e.codes.length)throw new ee("COMMON_CODE_REORDER_INVALID","VALIDATION","Common-code reorder entries must be unique");if(!this.dbExists())throw new ee("COMMON_CODE_REORDER_INVALID","VALIDATION","Common-code reorder scope does not exist");let r=this.openHandle(true);try{return r.db.transaction(o=>{let s=o.select().from(I).where(It(n,e.workspaceId)).all(),i=s.filter(_=>_.is_archived===0),d=new Set(s.map(_=>_.code)),c=new Set(i.map(_=>_.code)),u=e.codes.find(_=>!d.has(_));if(u)throw new ee("COMMON_CODE_REORDER_INVALID","VALIDATION",`Common code is not available in this scope: ${n}/${u}`);if(e.codes.length!==i.length||e.codes.some(_=>!c.has(_)))throw new ee("COMMON_CODE_REORDER_INVALID","VALIDATION","Common-code reorder must contain every non-archived code in the scope");let f=new Map(i.map(_=>[_.code,_])),p=e.codes.map(_=>{let m=f.get(_);if(!m)throw new ee("COMMON_CODE_REORDER_INVALID","VALIDATION",`Common code is not selectable in this scope: ${n}/${_}`);return m}),g;for(let[_,m]of p.entries())m.sort_order!==_&&(g??=new Date().toISOString(),o.update(I).set({sort_order:_,updated_at:g}).where(drizzleOrm.and(drizzleOrm.eq(I.code_group,n),drizzleOrm.eq(I.code,m.code))).run());return o.select().from(I).where(It(n,e.workspaceId)).orderBy(drizzleOrm.asc(I.sort_order),drizzleOrm.asc(I.code)).all()},{behavior:"immediate"})}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to reorder common codes",o)}finally{r.close();}}resolve(e,n){if(sn(e),Nr(n),!this.dbExists())return null;let r=this.openHandle(false);try{return r.db.select().from(I).where(drizzleOrm.and(drizzleOrm.eq(I.code_group,e),drizzleOrm.eq(I.code,n))).limit(1).get()??null}catch(o){throw new exports.RepositoryError("DB_ERROR","Failed to resolve common code",o)}finally{r.close();}}createThreadState(e){an(e.workspaceId);let n=ga(e.name);fa(e.color);let r=this.openHandle(true);try{return r.db.transaction(o=>{if(o.select({code:I.code}).from(I).where(drizzleOrm.and(It("THREAD_STATE",e.workspaceId),drizzleOrm.eq(I.is_archived,0),drizzleOrm.eq(I.code_name,n))).limit(1).get())throw new ee("COMMON_CODE_NAME_CONFLICT","CONFLICT",`Common-code name is already in use: ${n}`);let i=o.select({maxSortOrder:drizzleOrm.sql`max(${I.sort_order})`}).from(I).where(It("THREAD_STATE",e.workspaceId)).get(),d=new Date().toISOString(),c=Po();for(;o.select({code:I.code}).from(I).where(drizzleOrm.and(drizzleOrm.eq(I.code_group,"THREAD_STATE"),drizzleOrm.eq(I.code,c))).limit(1).get();)c=Po();o.insert(I).values({code_group:"THREAD_STATE",code:c,code_name:n,color:e.color,sort_order:(i?.maxSortOrder??-1)+1,workspace_id:e.workspaceId,is_builtin:0,is_archived:0,metadata:null,created_at:d,updated_at:d}).run();let u=o.select().from(I).where(drizzleOrm.and(drizzleOrm.eq(I.code_group,"THREAD_STATE"),drizzleOrm.eq(I.code,c))).limit(1).get();if(!u)throw new exports.RepositoryError("DB_ERROR","Created common code could not be read back");return u},{behavior:"immediate"})}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to create thread state common code",o)}finally{r.close();}}updateDisplay(e){if(sn(e.group),Nr(e.code),an(e.workspaceId),e.name===void 0&&e.color===void 0)throw new ee("COMMON_CODE_UPDATE_EMPTY","VALIDATION","At least one display value is required");let n=e.name===void 0||e.name===null?e.name:ga(e.name);e.color!==void 0&&fa(e.color);let r=this.openHandle(true);try{return r.db.transaction(o=>{let s=o.select().from(I).where(drizzleOrm.and(drizzleOrm.eq(I.code_group,e.group),drizzleOrm.eq(I.code,e.code))).limit(1).get();if(!s)throw new ee("COMMON_CODE_NOT_FOUND","NOT_FOUND",`Common code not found: ${e.group}/${e.code}`);if(this.assertOwnership(s,e.workspaceId),n===null&&s.is_builtin!==1)throw new ee("COMMON_CODE_NAME_INVALID","VALIDATION","User common-code names cannot be cleared");if(typeof n=="string"&&s.is_archived===0){let c=drizzleOrm.and(It(e.group,e.workspaceId),drizzleOrm.eq(I.is_archived,0));if(o.select({code:I.code}).from(I).where(drizzleOrm.and(c,drizzleOrm.eq(I.code_name,n),drizzleOrm.sql`${I.code} <> ${e.code}`)).limit(1).get())throw new ee("COMMON_CODE_NAME_CONFLICT","CONFLICT",`Common-code name is already in use: ${n}`)}let i={updated_at:new Date().toISOString()};e.name!==void 0&&(i.code_name=n??null),e.color!==void 0&&(i.color=e.color),o.update(I).set(i).where(drizzleOrm.and(drizzleOrm.eq(I.code_group,e.group),drizzleOrm.eq(I.code,e.code))).run();let d=o.select().from(I).where(drizzleOrm.and(drizzleOrm.eq(I.code_group,e.group),drizzleOrm.eq(I.code,e.code))).limit(1).get();if(!d)throw new exports.RepositoryError("DB_ERROR","Updated common code could not be read back");return d},{behavior:"immediate"})}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to update common-code display values",o)}finally{r.close();}}archive(e,n,r,o=true){if(sn(e),Nr(n),an(r),typeof o!="boolean")throw new ee("COMMON_CODE_ARCHIVE_INVALID","VALIDATION","Archive state must be boolean");let s=this.openHandle(true);try{return s.db.transaction(i=>{let d=i.select().from(I).where(drizzleOrm.and(drizzleOrm.eq(I.code_group,e),drizzleOrm.eq(I.code,n))).limit(1).get();if(!d)throw new ee("COMMON_CODE_NOT_FOUND","NOT_FOUND",`Common code not found: ${e}/${n}`);if(d.is_builtin===1)throw new ee("COMMON_CODE_BUILTIN_ARCHIVE_FORBIDDEN","VALIDATION","Builtin common codes cannot be archived");if(this.assertOwnership(d,r),!o&&d.code_name!==null&&i.select({code:I.code}).from(I).where(drizzleOrm.and(It(e,r),drizzleOrm.eq(I.is_archived,0),drizzleOrm.eq(I.code_name,d.code_name),drizzleOrm.ne(I.code,n))).limit(1).get())throw new ee("COMMON_CODE_NAME_CONFLICT","CONFLICT",`Common-code name is already in use: ${d.code_name}`);i.update(I).set({is_archived:o?1:0,updated_at:new Date().toISOString()}).where(drizzleOrm.and(drizzleOrm.eq(I.code_group,e),drizzleOrm.eq(I.code,n))).run();let c=i.select().from(I).where(drizzleOrm.and(drizzleOrm.eq(I.code_group,e),drizzleOrm.eq(I.code,n))).limit(1).get();if(!c)throw new exports.RepositoryError("DB_ERROR","Archived common code could not be read back");return c},{behavior:"immediate"})}catch(i){throw i instanceof exports.RepositoryError?i:new exports.RepositoryError("DB_ERROR","Failed to archive common code",i)}finally{s.close();}}assertOwnership(e,n){if(e.workspace_id!==null&&e.workspace_id!==n)throw new ee("COMMON_CODE_SCOPE_FORBIDDEN","VALIDATION","Workspace does not own this common code")}};h();se();fe();ce();pe();ue();h();function Lo(t){let e=Se__namespace.resolve(t);return process.platform==="win32"&&(e=e.replace(/\\/g,"/"),e=e.replace(/^([A-Z]):/,(n,r)=>`${r.toLowerCase()}:`)),e.length>1&&!/^[a-zA-Z]:\/$/.test(e)&&(e=e.replace(/\/+$/,"")),e}function ha(t){let e=Lo(t);return crypto.createHash("sha256").update(e).digest("hex")}function Cr(t){return t.toLowerCase().replace(/[^a-z0-9-]/g,"-").replace(/-{2,}/g,"-").replace(/^-+|-+$/g,"")}var $o=class extends exports.BaseSqliteRepository{dbRoot;constructor(e={}){super(),this.dbRoot=e.dbRoot;}resolveDbPath(){return this.dbRoot?Se.join(this.dbRoot,".crewx","crewx.db"):super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=Se.dirname(n);Oa.existsSync(o)||Oa.mkdirSync(o,{recursive:true});}else if(!Oa.existsSync(n))throw new exports.RepositoryError("NOT_FOUND","Database not found");let r=C(n);if(e)try{tn(r.db);}catch(o){throw r.close(),o}return r}resolveSlug(e,n,r){let o=Cr(Se.basename(r)),i=`${Cr(Se.basename(Se.dirname(r)))}-${o}`,d=[o,i];try{let c=u=>e.select({id:x.id}).from(x).where(drizzleOrm.and(drizzleOrm.eq(x.slug,u),drizzleOrm.ne(x.id,n))).limit(1).all().length>0;for(let u of d)if(!c(u))return u;for(let u=2;u<1e3;u+=1){let f=`${i}-${u}`;if(!c(f))return f}}catch{}return o}normalizeLegacySlugs(){if(!this.dbExists())return {updated:0,checked:0};let e=this.openHandle(true);try{let n=e.db.select({id:x.id,slug:x.slug}).from(x).all(),r=0;for(let o of n)if(o.slug.includes("/")){let s=Cr(o.slug.replace(/\//g,"-"));e.db.update(x).set({slug:s,updated_at:new Date().toISOString()}).where(drizzleOrm.eq(x.id,o.id)).run(),r+=1;}return {updated:r,checked:n.length}}catch(n){throw new exports.RepositoryError("DB_ERROR","Failed to normalize legacy slugs",n)}finally{e.close();}}ensureRow(e,n){let{id:r,slug:o,name:s,workspacePath:i}=n,d=new Date().toISOString();e.insert(x).values({id:r,slug:o,name:s,workspace_path:i,is_active:1,created_at:d,updated_at:d}).onConflictDoNothing().run(),e.update(x).set({workspace_path:i,updated_at:d}).where(drizzleOrm.and(drizzleOrm.eq(x.id,r),drizzleOrm.isNull(x.workspace_path))).run();}registerWorkspace(e){let n=Lo(e),r=this.openHandle(true);try{let o=ha(n),s=Se.basename(n),i=this.resolveSlug(r.db,o,n);return this.ensureRow(r.db,{id:o,slug:i,name:s,workspacePath:n}),{id:o,slug:i}}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to register workspace",o)}finally{r.close();}}listProjects(e){if(!this.dbExists())return {rows:[],total:0};let n=this.openHandle(false);try{let r=e.isActive!==void 0?drizzleOrm.eq(x.is_active,e.isActive?1:0):void 0,o=n.db.select({count:drizzleOrm.sql`count(*)`}).from(x).where(r).get();return {rows:n.db.select().from(x).where(r).orderBy(drizzleOrm.desc(x.updated_at)).limit(e.limit).offset(e.offset).all(),total:o?.count??0}}catch(r){throw new exports.RepositoryError("DB_ERROR","Failed to list projects",r)}finally{n.close();}}findById(e){if(!this.dbExists())return;let n=this.openHandle(false);try{return n.db.select().from(x).where(drizzleOrm.eq(x.id,e)).limit(1).get()??void 0}catch(r){throw new exports.RepositoryError("DB_ERROR","Failed to find workspace",r)}finally{n.close();}}toggleStar(e){let n=this.openHandle(true);try{let r=n.db.select({starred:x.starred}).from(x).where(drizzleOrm.eq(x.id,e)).get();if(!r)return null;let o=r.starred?0:1;return n.db.update(x).set({starred:o}).where(drizzleOrm.eq(x.id,e)).run(),{starred:!!o}}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to toggle workspace star",r)}finally{n.close();}}findAgentsByProject(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.all(drizzleOrm.sql`SELECT DISTINCT agent_id FROM tasks WHERE workspace_id = ${e} AND agent_id IS NOT NULL ORDER BY agent_id`).map(o=>o.agent_id)}catch(r){throw new exports.RepositoryError("DB_ERROR","Failed to find agents by project",r)}finally{n.close();}}findThreadsByProject(e,n){if(!this.dbExists())return {rows:[],total:0};let r=this.openHandle(false);try{let o=r.db.get(drizzleOrm.sql`SELECT COUNT(*) as count FROM threads WHERE workspace_id = ${e}`);return {rows:r.db.all(drizzleOrm.sql`SELECT t.*,
|
|
300
306
|
(SELECT agent_id FROM tasks tk WHERE tk.thread_id = t.id AND tk.agent_id IS NOT NULL ORDER BY tk.started_at ASC LIMIT 1) AS agent_id
|
|
301
307
|
FROM threads t
|
|
302
308
|
WHERE t.workspace_id = ${e}
|
|
303
309
|
ORDER BY t.updated_at DESC
|
|
304
|
-
LIMIT ${n.limit} OFFSET ${n.offset}`),total:o?.count??0}}catch(o){throw new exports.RepositoryError("DB_ERROR","Failed to find threads by project",o)}finally{r.close();}}findBySlug(e){if(!this.dbExists())return;let n=this.openHandle(false);try{return n.db.select().from(x).where(drizzleOrm.eq(x.slug,e)).limit(1).get()??void 0}catch(r){throw new exports.RepositoryError("DB_ERROR","Failed to find workspace by slug",r)}finally{n.close();}}slugExists(e,n){if(!this.dbExists())return false;let r=this.openHandle(false);try{let o=n?drizzleOrm.and(drizzleOrm.eq(x.slug,e),drizzleOrm.ne(x.id,n)):drizzleOrm.eq(x.slug,e);return !!r.db.select({id:x.id}).from(x).where(o).limit(1).get()}catch(o){throw new exports.RepositoryError("DB_ERROR","Failed to check slug",o)}finally{r.close();}}insert(e,n,r,o){let s=this.openHandle(true);try{let i=new Date().toISOString();s.db.insert(x).values({id:e,slug:n,name:r,workspace_path:o,is_active:1,created_at:i,updated_at:i}).run();let d=s.db.select().from(x).where(drizzleOrm.eq(x.id,e)).limit(1).get();if(!d)throw new exports.RepositoryError("DB_ERROR","Insert did not return a row");return d}catch(i){throw i instanceof exports.RepositoryError?i:new exports.RepositoryError("DB_ERROR","Failed to insert workspace",i)}finally{s.close();}}update(e,n,r){let o=this.openHandle(true);try{o.runRaw(`UPDATE workspaces SET ${n.join(", ")} WHERE id = ?`,r);let s=o.db.select().from(x).where(drizzleOrm.eq(x.id,e)).limit(1).get();if(!s)throw new exports.RepositoryError("NOT_FOUND",`Workspace ${e} not found`);return s}catch(s){throw s instanceof exports.RepositoryError?s:new exports.RepositoryError("DB_ERROR","Failed to update workspace",s)}finally{o.close();}}cleanupOrphanWorkspaces(){if(!this.dbExists())return {softDeleted:0,checked:0};let e=this.openHandle(true);try{let n=e.db.select({id:x.id,workspace_path:x.workspace_path}).from(x).where(drizzleOrm.and(drizzleOrm.eq(x.is_active,1),drizzleOrm.isNotNull(x.workspace_path))).all(),r=0;for(let o of n){let s=o.workspace_path;Sa.existsSync(Se.join(s,"crewx.yaml"))||Sa.existsSync(Se.join(s,"crewx.yml"))||(e.db.update(x).set({is_active:0,updated_at:new Date().toISOString()}).where(drizzleOrm.eq(x.id,o.id)).run(),r+=1);}return {softDeleted:r,checked:n.length}}catch(n){throw new exports.RepositoryError("DB_ERROR","Failed to cleanup orphan workspaces",n)}finally{e.close();}}delete(e){let n=this.openHandle(true);try{n.db.run(drizzleOrm.sql`UPDATE threads SET workspace_id = NULL WHERE workspace_id = ${e}`),n.db.delete(x).where(drizzleOrm.eq(x.id,e)).run();}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to delete workspace",r)}finally{n.close();}}};h();se();fe();ce();pe();h();var Lo="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function Wl(t){let e=crypto.randomBytes(t*2),n="";for(let r=0;r<e.length&&n.length<t;r++){let o=e[r];o<248&&(n+=Lo[o%62]);}for(;n.length<t;)n+=Lo[crypto.randomBytes(1)[0]%62];return n}function He(t){return `${t}_${Wl(8)}`}function ga(t,e){let{createHash:n}=_t("crypto"),r=n("sha256").update(e).digest(),o=Buffer.alloc(8);for(let i=0;i<32;i++)o[i%8]^=r[i];let s="";for(let i of o)s+=Lo[i%62];return `${t}_${s}`}ue();var Ho=["outcome_plan","contract_check","feature_link","use_verify","result_review"],Xl=new Set(Ho),wa=Object.freeze(Ho.map(t=>({key:t,labelOverride:null}))),Ql=new Set(["created","plan_proposed","plan_approved","decision_requested","decision_answered","replanned","stage_advanced","criterion_verified","scene_changed","result_submitted","accepted"]),Zl=new Set(["planning","plan_review","running","human_wait","limit_wait","failed_stop","analyzing_feedback","replanned","awaiting_review","accepted"]),ep=new Set(["pending","verifying","passed","failed"]),tp=new Set(["user","project_manager","system"]),np=new Set(["task","wi","url"]),rp=/^\d{4}-\d{2}-\d{2}$/;function Q(t){throw new exports.RepositoryError("VALIDATION",t)}function Ge(t){throw new exports.RepositoryError("NOT_FOUND",t)}function ge(t,e){(typeof t!="string"||t.trim().length===0)&&Q(`${e} is required`);}function op(t){if(t==null)return;rp.test(t)||Q("dueDate must use YYYY-MM-DD");let e=new Date(`${t}T00:00:00.000Z`);(Number.isNaN(e.getTime())||e.toISOString().slice(0,10)!==t)&&Q("dueDate must be a valid calendar date");}function ya(t){let e=t??wa;(!Array.isArray(e)||e.length===0)&&Q("stages must contain at least one stage");let n=new Set;return e.map(r=>{(!r||typeof r!="object"||Array.isArray(r))&&Q("stage must be an object");let o=r;return ge(o.key,"stage.key"),o.labelOverride!==null&&typeof o.labelOverride!="string"&&Q("stage.labelOverride must be a string or null"),o.labelOverride!==null&&ge(o.labelOverride,"stage.labelOverride"),typeof o.key!="string"&&Q("stage.key is required"),!Xl.has(o.key)&&o.labelOverride===null&&Q(`custom stage requires a labelOverride: ${o.key}`),n.has(o.key)&&Q(`duplicate stage key: ${o.key}`),n.add(o.key),{key:o.key,labelOverride:o.labelOverride}})}function sp(t){Array.isArray(t)||Q("criteria must be an array");for(let e of t)ge(e,"criterion.statement");}function on(t={}){let e=t.actorType??"system";tp.has(e)||Q(`invalid actorType: ${String(e)}`);let n=t.actorId??null;return (e==="user"||e==="project_manager")&&(!n||n.trim().length===0)&&Q(`actorId is required for ${e}`),{actorType:e,actorId:n}}function Ra(t,e){let n=t??{};if((n===null||typeof n!="object"||Array.isArray(n))&&Q("event payload must be a JSON object"),e==="accepted")for(let r of ["remainingRisks","nextPlan","lessons","evidenceRefs"])(!Object.prototype.hasOwnProperty.call(n,r)||n[r]===void 0)&&Q(`accepted payload requires ${r}`);try{return JSON.stringify(n)}catch(r){throw new exports.RepositoryError("VALIDATION","event payload must be JSON serializable",r)}}function ip(t){return Array.isArray(t)||Q("evidence must be an array"),t.map(e=>((!e||typeof e!="object")&&Q("evidence item must be an object"),np.has(e.kind)||Q(`invalid evidence kind: ${String(e.kind)}`),ge(e.ref,"evidence.ref"),e.label!==void 0&&typeof e.label!="string"&&Q("evidence.label must be a string"),e.label===void 0?{kind:e.kind,ref:e.ref}:{kind:e.kind,ref:e.ref,label:e.label}))}function Ta(t){let e;try{e=JSON.parse(t);}catch(n){throw new exports.RepositoryError("DB_ERROR","Project stages JSON is invalid",n)}try{if(!Array.isArray(e))throw new exports.RepositoryError("DB_ERROR","Project stages JSON is invalid");return ya(e)}catch(n){throw new exports.RepositoryError("DB_ERROR","Project stages JSON is invalid",n)}}function Ea(t){return ge(t.projectId,"projectId"),ge(t.title,"title"),Ql.has(t.type)||Q(`invalid project event type: ${String(t.type)}`),{...on(t),payloadJson:Ra(t.payload,t.type)}}function Dt(t,e,n){let r=Ea(e);t.select({id:z.id}).from(z).where(drizzleOrm.eq(z.id,e.projectId)).get()||Ge(`Project ${e.projectId} not found`);let s=t.select({maxSeq:drizzleOrm.sql`COALESCE(MAX(${Je.seq}), 0)`}).from(Je).where(drizzleOrm.eq(Je.project_id,e.projectId)).get()?.maxSeq??0,i=He("pje");t.insert(Je).values({id:i,project_id:e.projectId,seq:s+1,actor_type:r.actorType,actor_id:r.actorId,type:e.type,title:e.title,summary:e.summary??null,payload_json:r.payloadJson,created_at:n}).run();let d=t.select().from(Je).where(drizzleOrm.eq(Je.id,i)).get();if(!d)throw new exports.RepositoryError("DB_ERROR","Event insert did not return a row");return d}var Mo=class extends exports.BaseSqliteRepository{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=Se.join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath??super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(!e&&!Sa.existsSync(n))throw new exports.RepositoryError("NOT_FOUND","Database not found");if(e){let o=Se.dirname(n);Sa.existsSync(o)||Sa.mkdirSync(o,{recursive:true});}let r=C(n);if(e)try{V(r.db,n);}catch(o){throw r.close(),o}return r}getDetailFromHandle(e,n){let r=e.db.select().from(z).where(drizzleOrm.eq(z.id,n)).get();if(!r)return;let o=e.db.select().from(Le).where(drizzleOrm.eq(Le.project_id,n)).orderBy(drizzleOrm.asc(Le.position)).all();return {...r,stages:Ta(r.stages_json),criteria:o}}getDetailOrThrow(e){let n=this.getProject(e);return n||Ge(`Project ${e} not found`),n}createProject(e){ge(e.workspaceId,"workspaceId"),ge(e.name,"name"),ge(e.outcome,"outcome"),op(e.dueDate);let n=ya(e.stages);sp(e.criteria);let r=He("prj"),o=new Date().toISOString(),s=this.openHandle(true);try{s.db.transaction(i=>{i.insert(z).values({id:r,workspace_id:e.workspaceId,name:e.name,outcome:e.outcome,due_date:e.dueDate??null,scene:"planning",stages_json:JSON.stringify(n),stage_index:1,created_at:o,updated_at:o,accepted_at:null,archived_at:null}).run(),e.criteria.forEach((d,c)=>{i.insert(Le).values({id:He("pjc"),project_id:r,position:c+1,statement:d,verify_status:"pending",verified_at:null,evidence_json:"[]",created_at:o,updated_at:o}).run();}),Dt(i,{projectId:r,actorType:"system",type:"created",title:"Project created",payload:{}},o);});}catch(i){throw i instanceof exports.RepositoryError?i:new exports.RepositoryError("DB_ERROR","Failed to create project",i)}finally{s.close();}return this.getDetailOrThrow(r)}getProject(e){if(!this.dbExists())return;let n=this.openHandle(false);try{return this.getDetailFromHandle(n,e)}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to get project",r)}finally{n.close();}}listProjectsByWorkspace(e,n={}){if(ge(e,"workspaceId"),!this.dbExists())return [];let r=this.openHandle(false);try{let o=n.includeArchived?drizzleOrm.eq(z.workspace_id,e):drizzleOrm.and(drizzleOrm.eq(z.workspace_id,e),drizzleOrm.isNull(z.archived_at));return r.db.select({id:z.id}).from(z).where(o).orderBy(drizzleOrm.desc(z.updated_at),drizzleOrm.desc(z.created_at)).all().map(i=>this.getDetailFromHandle(r,i.id)).filter(i=>i!==void 0)}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to list projects",o)}finally{r.close();}}archiveProject(e){ge(e,"projectId");let n=this.openHandle(true);try{n.db.update(z).set({archived_at:new Date().toISOString()}).where(drizzleOrm.eq(z.id,e)).run().changes===0&&Ge(`Project ${e} not found`);}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to archive project",r)}finally{n.close();}return this.getDetailOrThrow(e)}setScene(e,n,r={}){ge(e,"projectId"),Zl.has(n)||Q(`invalid project scene: ${String(n)}`);let o=on(r),s=new Date().toISOString(),i=this.openHandle(true);try{i.db.transaction(d=>{let c=d.select().from(z).where(drizzleOrm.eq(z.id,e)).get();c||Ge(`Project ${e} not found`),d.update(z).set({scene:n,updated_at:s}).where(drizzleOrm.eq(z.id,e)).run(),Dt(d,{projectId:e,...o,type:"scene_changed",title:"Project scene changed",payload:{before:c.scene,after:n}},s);});}catch(d){throw d instanceof exports.RepositoryError?d:new exports.RepositoryError("DB_ERROR","Failed to set project scene",d)}finally{i.close();}return this.getDetailOrThrow(e)}setStageIndex(e,n,r={}){ge(e,"projectId"),Number.isInteger(n)||Q("stage index must be an integer");let o=on(r),s=new Date().toISOString(),i=this.openHandle(true);try{i.db.transaction(d=>{let c=d.select().from(z).where(drizzleOrm.eq(z.id,e)).get();c||Ge(`Project ${e} not found`);let u=Ta(c.stages_json);(n<1||n>u.length)&&Q("stage index is outside the project stages"),d.update(z).set({stage_index:n,updated_at:s}).where(drizzleOrm.eq(z.id,e)).run(),Dt(d,{projectId:e,...o,type:"stage_advanced",title:"Project stage advanced",payload:{before:c.stage_index,after:n}},s);});}catch(d){throw d instanceof exports.RepositoryError?d:new exports.RepositoryError("DB_ERROR","Failed to set project stage",d)}finally{i.close();}return this.getDetailOrThrow(e)}setCriterionVerify(e,n,r,o={}){let s=typeof e=="string"?{projectId:typeof r=="string"?e:void 0,criterionId:typeof r=="string"?n:e,verifyStatus:typeof r=="string"?r:n,...typeof r=="string"?o:r}:e,i=s.verifyStatus??s.status;(!i||!ep.has(i))&&Q(`invalid criterion status: ${String(i)}`),ge(s.criterionId,"criterionId");let d=on(s),c=new Date().toISOString(),u=this.openHandle(true),f;try{u.db.transaction(g=>{let _=g.select().from(Le).where(drizzleOrm.eq(Le.id,s.criterionId)).get();_||Ge(`Criterion ${s.criterionId} not found`),f=_.project_id,s.projectId&&s.projectId!==_.project_id&&Ge(`Criterion ${s.criterionId} not found in project ${s.projectId}`),g.update(Le).set({verify_status:i,verified_at:i==="passed"?c:null,updated_at:c}).where(drizzleOrm.eq(Le.id,s.criterionId)).run(),Dt(g,{projectId:_.project_id,...d,type:"criterion_verified",title:"Criterion verification updated",payload:{criterionId:s.criterionId,status:i}},c);});}catch(g){throw g instanceof exports.RepositoryError?g:new exports.RepositoryError("DB_ERROR","Failed to set criterion verification",g)}finally{u.close();}let p=f?this.getProject(f)?.criteria.find(g=>g.id===s.criterionId):void 0;return p||Ge(`Criterion ${s.criterionId} not found`),p}setCriterionEvidence(e,n,r,o={}){let s=typeof e=="string"?{projectId:Array.isArray(r)?e:void 0,criterionId:Array.isArray(r)?n:e,evidence:Array.isArray(r)?r:n,...Array.isArray(r)?o:r}:e;ge(s.criterionId,"criterionId");let i=ip(s.evidence),d=on(s),c=new Date().toISOString(),u=this.openHandle(true),f;try{u.db.transaction(g=>{let _=g.select().from(Le).where(drizzleOrm.eq(Le.id,s.criterionId)).get();_||Ge(`Criterion ${s.criterionId} not found`),f=_.project_id,s.projectId&&s.projectId!==_.project_id&&Ge(`Criterion ${s.criterionId} not found in project ${s.projectId}`),g.update(Le).set({evidence_json:JSON.stringify(i),updated_at:c}).where(drizzleOrm.eq(Le.id,s.criterionId)).run(),Dt(g,{projectId:_.project_id,...d,type:"criterion_verified",title:"Criterion evidence updated",payload:{criterionId:s.criterionId,evidence:i}},c);});}catch(g){throw g instanceof exports.RepositoryError?g:new exports.RepositoryError("DB_ERROR","Failed to set criterion evidence",g)}finally{u.close();}let p=f?this.getProject(f)?.criteria.find(g=>g.id===s.criterionId):void 0;return p||Ge(`Criterion ${s.criterionId} not found`),p}appendEvent(e,n){let r=typeof e=="string"?{...n,projectId:e}:e;Ea(r);let o=new Date().toISOString(),s=this.openHandle(true),i;try{s.db.transaction(d=>{i=Dt(d,r,o);});}catch(d){throw d instanceof exports.RepositoryError?d:new exports.RepositoryError("DB_ERROR","Failed to append project event",d)}finally{s.close();}if(!i)throw new exports.RepositoryError("DB_ERROR","Event append did not return a row");return i}listEvents(e,n={}){if(ge(e,"projectId"),n.afterSeq!==void 0&&(!Number.isInteger(n.afterSeq)||n.afterSeq<0)&&Q("afterSeq must be a non-negative integer"),n.limit!==void 0&&(!Number.isInteger(n.limit)||n.limit<1)&&Q("limit must be a positive integer"),!this.dbExists())return [];let r=this.openHandle(false);try{let o=[drizzleOrm.eq(Je.project_id,e)];n.afterSeq!==void 0&&o.push(drizzleOrm.gt(Je.seq,n.afterSeq));let s=r.db.select().from(Je).where(drizzleOrm.and(...o)).orderBy(drizzleOrm.asc(Je.seq));return n.limit!==void 0&&(s=s.limit(n.limit)),s.all()}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to list project events",o)}finally{r.close();}}acceptProject(e,n){ge(e,"projectId");let r=on(n),o={remainingRisks:n.remainingRisks,nextPlan:n.nextPlan,lessons:n.lessons,evidenceRefs:n.evidenceRefs};Ra(o,"accepted");let s=new Date().toISOString(),i=this.openHandle(true);try{i.db.transaction(d=>{d.select({id:z.id}).from(z).where(drizzleOrm.eq(z.id,e)).get()||Ge(`Project ${e} not found`),d.update(z).set({scene:"accepted",accepted_at:s,updated_at:s}).where(drizzleOrm.eq(z.id,e)).run(),Dt(d,{projectId:e,...r,type:"accepted",title:"Project accepted",payload:o},s);});}catch(d){throw d instanceof exports.RepositoryError?d:new exports.RepositoryError("DB_ERROR","Failed to accept project",d)}finally{i.close();}return this.getDetailOrThrow(e)}};fe();ce();h();ce();ue();var Ia=[x,exports.tasks,w,Ni,mt,dt,je,Zt];function cp(){return Se__namespace.default.join(_i__default.default.homedir(),".crewx","crewx.db")}function up(t){if(!Sa__namespace.default.existsSync(t))return null;let e=Math.floor(Date.now()/1e3),n=`${t}.bak-${e}`;return Sa__namespace.default.copyFileSync(t,n),n}function Aa(t){let e=t.all("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'");return new Set(e.map(n=>n.name))}function lp(t){return t==null||typeof t=="object"&&"queryChunks"in t?null:typeof t=="number"?String(t):typeof t=="boolean"?t?"1":"0":typeof t=="string"?`'${t.replace(/'/g,"''")}'`:String(t)}function pp(t){let e=t.getSQLType(),n=`"${t.name}" ${e}`,r=lp(t.default);return r!==null&&(n+=` DEFAULT ${r}`),t.notNull&&(n+=" NOT NULL"),n}function fp(t,e){let n=e?.dbPath??cp(),r=e?.force??false,o=e?.dryRun??false,s=o?null:up(n);if(r&&!o)try{t.run("DELETE FROM __drizzle_migrations");}catch{}let i=Aa(t);if(!o)try{Qt(t);}catch(p){let g=p instanceof Error?`${p.message} ${p.cause?.message??""}`:"";if(!r||!g.includes("duplicate column"))throw p}let d,c;o?(d=Ia.map(g=>sqliteCore.getTableConfig(g).name).filter(g=>!i.has(g)),c=i):(c=Aa(t),d=[...c].filter(p=>!i.has(p)));let u=[],f=[];for(let p of Ia){let g=sqliteCore.getTableConfig(p),_=g.name;if(!c.has(_))continue;let m=t.all(`PRAGMA table_info("${_}")`),k=new Set(m.map(E=>E.name)),T=new Set(g.columns.map(E=>E.name));for(let E of g.columns)if(!k.has(E.name)){if(!o){let b=pp(E);t.run(`ALTER TABLE "${_}" ADD COLUMN ${b}`);}u.push({table:_,column:E.name});}for(let E of m)T.has(E.name)||f.push(`${_}.${E.name} exists in DB but not in schema (untouched)`);}return {created:d,altered:u,warnings:f,backupPath:s}}ue();Jn();As();Vn();zn();Jn();h();se();h();var pc=["success","failed","completed"],oo=10*1024*1024*1024,fc=256,bg=new Set(pc),Ee=class extends Error{constructor(n,r,o="metadata"){super(r);this.taskId=n;this.kind=o;this.name="MigrationTaskError";}taskId;kind};function so(t){return t||(process.env.CREWX_DB?process.env.CREWX_DB:Se.join(_i.homedir(),".crewx","crewx.db"))}function Ig(){return _t("better-sqlite3")}function gc(t,e){let n=t===":memory:";if(!n&&!Sa.existsSync(t))throw new Error(`Database not found: ${t}`);let r=new(Ig())(t,{readonly:e,fileMustExist:!n,timeout:5e3});return r.pragma("foreign_keys = ON"),r.pragma("busy_timeout = 5000"),r}function Sn(t,e,n=[]){return t.prepare(e).all(...n)}function En(t,e,n=[]){return t.prepare(e).get(...n)}function Ag(t,e,n=[]){return t.prepare(e).run(...n)}function vg(t,e,n=[]){return t.prepare(e).iterate(...n)}function Og(t){return typeof t=="string"&&t.length>0?t:"<unknown>"}function hc(t){return typeof t=="string"&&bg.has(t)}function cc(t,e){t.set(e,(t.get(e)??0)+1);}function uc(t){return Object.fromEntries([...t.entries()].sort(([e],[n])=>e.localeCompare(n)))}function Ng(t){let e=new Set(Sn(t,"SELECT name FROM sqlite_master WHERE type = 'table' AND name IN ('tasks', 'task_log_events')").map(i=>i.name)),n=["tasks","task_log_events"].filter(i=>!e.has(i));if(n.length>0)throw new Error(`Database schema is missing required table(s): ${n.join(", ")}`);let r=new Set(Sn(t,"PRAGMA table_info('tasks')").map(i=>i.name)),s=["id","status","logs","log_storage","last_log_seq","log_revision"].filter(i=>!r.has(i));if(s.length>0)throw new Error(`Database schema is missing required tasks column(s): ${s.join(", ")}`)}function _c(t,e){if(e==null)return {entries:[]};if(typeof e!="string")throw new Ee(t,"Malformed task logs: tasks.logs must be JSON text or null","malformed");if(e.trim()==="")return {entries:[]};let n;try{n=JSON.parse(e);}catch(o){let s=o instanceof Error?o.message:String(o);throw new Ee(t,`Malformed JSON in tasks.logs (${s})`,"malformed")}if(!Array.isArray(n))throw new Ee(t,"Malformed task logs: expected a JSON array","malformed");let r=[];for(let[o,s]of n.entries()){if(s===null||typeof s!="object"||typeof s.timestamp!="string"||typeof s.level!="string"||typeof s.message!="string")throw new Ee(t,`Malformed task logs: entry ${o} must contain string timestamp, level, and message fields`,"malformed");let i=s;r.push({timestamp:i.timestamp,level:i.level,message:i.message});}return {entries:r}}function Fs(t,e){if(!Number.isInteger(t.last_log_seq)||t.last_log_seq<0)throw new Ee(t.id,"Invalid last_log_seq metadata","metadata");if(!Number.isInteger(t.log_revision)||t.log_revision<0)throw new Ee(t.id,"Invalid log_revision metadata","metadata");if(e==="blob"&&t.last_log_seq!==0)throw new Ee(t.id,"Blob source must have last_log_seq=0","metadata")}function Cg(t){let e=Sn(t,`SELECT task_id, COUNT(*) AS event_count
|
|
305
|
-
FROM task_log_events GROUP BY task_id`);return new Map(e.map(n=>[n.task_id,n.event_count]))}function
|
|
306
|
-
FROM tasks ORDER BY id`)){let k=m,T=
|
|
307
|
-
FROM tasks WHERE id = ?`,[e]);if(!r)throw new Ee(e,"Task disappeared before migration","metadata");if(r.log_storage==="events")return {status:"skipped",entryCount:0,sourceBytes:0};if(r.log_storage!=="blob")throw new Ee(e,`Unknown log_storage value: ${r.log_storage}`,"invalid-source");if(!
|
|
308
|
-
VALUES (?, ?, ?, ?, ?)`);for(let[p,g]of s.entries.entries())d.run(e,p+1,g.timestamp,g.level,g.message);let c=
|
|
309
|
-
FROM task_log_events WHERE task_id = ? ORDER BY seq`,[e]);if(!
|
|
310
|
+
LIMIT ${n.limit} OFFSET ${n.offset}`),total:o?.count??0}}catch(o){throw new exports.RepositoryError("DB_ERROR","Failed to find threads by project",o)}finally{r.close();}}findBySlug(e){if(!this.dbExists())return;let n=this.openHandle(false);try{return n.db.select().from(x).where(drizzleOrm.eq(x.slug,e)).limit(1).get()??void 0}catch(r){throw new exports.RepositoryError("DB_ERROR","Failed to find workspace by slug",r)}finally{n.close();}}slugExists(e,n){if(!this.dbExists())return false;let r=this.openHandle(false);try{let o=n?drizzleOrm.and(drizzleOrm.eq(x.slug,e),drizzleOrm.ne(x.id,n)):drizzleOrm.eq(x.slug,e);return !!r.db.select({id:x.id}).from(x).where(o).limit(1).get()}catch(o){throw new exports.RepositoryError("DB_ERROR","Failed to check slug",o)}finally{r.close();}}insert(e,n,r,o){let s=this.openHandle(true);try{let i=new Date().toISOString();s.db.insert(x).values({id:e,slug:n,name:r,workspace_path:o,is_active:1,created_at:i,updated_at:i}).run();let d=s.db.select().from(x).where(drizzleOrm.eq(x.id,e)).limit(1).get();if(!d)throw new exports.RepositoryError("DB_ERROR","Insert did not return a row");return d}catch(i){throw i instanceof exports.RepositoryError?i:new exports.RepositoryError("DB_ERROR","Failed to insert workspace",i)}finally{s.close();}}update(e,n,r){let o=this.openHandle(true);try{o.runRaw(`UPDATE workspaces SET ${n.join(", ")} WHERE id = ?`,r);let s=o.db.select().from(x).where(drizzleOrm.eq(x.id,e)).limit(1).get();if(!s)throw new exports.RepositoryError("NOT_FOUND",`Workspace ${e} not found`);return s}catch(s){throw s instanceof exports.RepositoryError?s:new exports.RepositoryError("DB_ERROR","Failed to update workspace",s)}finally{o.close();}}cleanupOrphanWorkspaces(){if(!this.dbExists())return {softDeleted:0,checked:0};let e=this.openHandle(true);try{let n=e.db.select({id:x.id,workspace_path:x.workspace_path}).from(x).where(drizzleOrm.and(drizzleOrm.eq(x.is_active,1),drizzleOrm.isNotNull(x.workspace_path))).all(),r=0;for(let o of n){let s=o.workspace_path;Oa.existsSync(Se.join(s,"crewx.yaml"))||Oa.existsSync(Se.join(s,"crewx.yml"))||(e.db.update(x).set({is_active:0,updated_at:new Date().toISOString()}).where(drizzleOrm.eq(x.id,o.id)).run(),r+=1);}return {softDeleted:r,checked:n.length}}catch(n){throw new exports.RepositoryError("DB_ERROR","Failed to cleanup orphan workspaces",n)}finally{e.close();}}delete(e){let n=this.openHandle(true);try{n.db.run(drizzleOrm.sql`UPDATE threads SET workspace_id = NULL WHERE workspace_id = ${e}`),n.db.delete(x).where(drizzleOrm.eq(x.id,e)).run();}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to delete workspace",r)}finally{n.close();}}};h();se();fe();ce();pe();h();var Uo="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function Xl(t){let e=crypto.randomBytes(t*2),n="";for(let r=0;r<e.length&&n.length<t;r++){let o=e[r];o<248&&(n+=Uo[o%62]);}for(;n.length<t;)n+=Uo[crypto.randomBytes(1)[0]%62];return n}function $e(t){return `${t}_${Xl(8)}`}function Ta(t,e){let{createHash:n}=kt("crypto"),r=n("sha256").update(e).digest(),o=Buffer.alloc(8);for(let i=0;i<32;i++)o[i%8]^=r[i];let s="";for(let i of o)s+=Uo[i%62];return `${t}_${s}`}ue();var Bo=["outcome_plan","contract_check","feature_link","use_verify","result_review"],op=new Set(Bo),ba=Object.freeze(Bo.map(t=>({key:t,labelOverride:null}))),sp=new Set(["created","plan_proposed","plan_approved","decision_requested","decision_answered","replanned","stage_advanced","criterion_verified","scene_changed","result_submitted","accepted"]),ip=new Set(["planning","plan_review","running","human_wait","limit_wait","failed_stop","analyzing_feedback","replanned","awaiting_review","accepted"]),ap=new Set(["pending","verifying","passed","failed"]),dp=new Set(["user","project_manager","system"]),cp=new Set(["task","wi","url"]),up=/^\d{4}-\d{2}-\d{2}$/;function Q(t){throw new exports.RepositoryError("VALIDATION",t)}function ze(t){throw new exports.RepositoryError("NOT_FOUND",t)}function ge(t,e){(typeof t!="string"||t.trim().length===0)&&Q(`${e} is required`);}function lp(t){if(t==null)return;up.test(t)||Q("dueDate must use YYYY-MM-DD");let e=new Date(`${t}T00:00:00.000Z`);(Number.isNaN(e.getTime())||e.toISOString().slice(0,10)!==t)&&Q("dueDate must be a valid calendar date");}function Ia(t){let e=t??ba;(!Array.isArray(e)||e.length===0)&&Q("stages must contain at least one stage");let n=new Set;return e.map(r=>{(!r||typeof r!="object"||Array.isArray(r))&&Q("stage must be an object");let o=r;return ge(o.key,"stage.key"),o.labelOverride!==null&&typeof o.labelOverride!="string"&&Q("stage.labelOverride must be a string or null"),o.labelOverride!==null&&ge(o.labelOverride,"stage.labelOverride"),typeof o.key!="string"&&Q("stage.key is required"),!op.has(o.key)&&o.labelOverride===null&&Q(`custom stage requires a labelOverride: ${o.key}`),n.has(o.key)&&Q(`duplicate stage key: ${o.key}`),n.add(o.key),{key:o.key,labelOverride:o.labelOverride}})}function pp(t){Array.isArray(t)||Q("criteria must be an array");for(let e of t)ge(e,"criterion.statement");}function cn(t={}){let e=t.actorType??"system";dp.has(e)||Q(`invalid actorType: ${String(e)}`);let n=t.actorId??null;return (e==="user"||e==="project_manager")&&(!n||n.trim().length===0)&&Q(`actorId is required for ${e}`),{actorType:e,actorId:n}}function Aa(t,e){let n=t??{};if((n===null||typeof n!="object"||Array.isArray(n))&&Q("event payload must be a JSON object"),e==="accepted")for(let r of ["remainingRisks","nextPlan","lessons","evidenceRefs"])(!Object.prototype.hasOwnProperty.call(n,r)||n[r]===void 0)&&Q(`accepted payload requires ${r}`);try{return JSON.stringify(n)}catch(r){throw new exports.RepositoryError("VALIDATION","event payload must be JSON serializable",r)}}function fp(t){return Array.isArray(t)||Q("evidence must be an array"),t.map(e=>((!e||typeof e!="object")&&Q("evidence item must be an object"),cp.has(e.kind)||Q(`invalid evidence kind: ${String(e.kind)}`),ge(e.ref,"evidence.ref"),e.label!==void 0&&typeof e.label!="string"&&Q("evidence.label must be a string"),e.label===void 0?{kind:e.kind,ref:e.ref}:{kind:e.kind,ref:e.ref,label:e.label}))}function Sa(t){let e;try{e=JSON.parse(t);}catch(n){throw new exports.RepositoryError("DB_ERROR","Project stages JSON is invalid",n)}try{if(!Array.isArray(e))throw new exports.RepositoryError("DB_ERROR","Project stages JSON is invalid");return Ia(e)}catch(n){throw new exports.RepositoryError("DB_ERROR","Project stages JSON is invalid",n)}}function va(t){return ge(t.projectId,"projectId"),ge(t.title,"title"),sp.has(t.type)||Q(`invalid project event type: ${String(t.type)}`),{...cn(t),payloadJson:Aa(t.payload,t.type)}}function Ht(t,e,n){let r=va(e);t.select({id:z.id}).from(z).where(drizzleOrm.eq(z.id,e.projectId)).get()||ze(`Project ${e.projectId} not found`);let s=t.select({maxSeq:drizzleOrm.sql`COALESCE(MAX(${Xe.seq}), 0)`}).from(Xe).where(drizzleOrm.eq(Xe.project_id,e.projectId)).get()?.maxSeq??0,i=$e("pje");t.insert(Xe).values({id:i,project_id:e.projectId,seq:s+1,actor_type:r.actorType,actor_id:r.actorId,type:e.type,title:e.title,summary:e.summary??null,payload_json:r.payloadJson,created_at:n}).run();let d=t.select().from(Xe).where(drizzleOrm.eq(Xe.id,i)).get();if(!d)throw new exports.RepositoryError("DB_ERROR","Event insert did not return a row");return d}var Fo=class extends exports.BaseSqliteRepository{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=Se.join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath??super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(!e&&!Oa.existsSync(n))throw new exports.RepositoryError("NOT_FOUND","Database not found");if(e){let o=Se.dirname(n);Oa.existsSync(o)||Oa.mkdirSync(o,{recursive:true});}let r=C(n);if(e)try{V(r.db,n);}catch(o){throw r.close(),o}return r}getDetailFromHandle(e,n){let r=e.db.select().from(z).where(drizzleOrm.eq(z.id,n)).get();if(!r)return;let o=e.db.select().from(Me).where(drizzleOrm.eq(Me.project_id,n)).orderBy(drizzleOrm.asc(Me.position)).all();return {...r,stages:Sa(r.stages_json),criteria:o}}getDetailOrThrow(e){let n=this.getProject(e);return n||ze(`Project ${e} not found`),n}createProject(e){ge(e.workspaceId,"workspaceId"),ge(e.name,"name"),ge(e.outcome,"outcome"),lp(e.dueDate);let n=Ia(e.stages);pp(e.criteria);let r=$e("prj"),o=new Date().toISOString(),s=this.openHandle(true);try{s.db.transaction(i=>{i.insert(z).values({id:r,workspace_id:e.workspaceId,name:e.name,outcome:e.outcome,due_date:e.dueDate??null,scene:"planning",stages_json:JSON.stringify(n),stage_index:1,created_at:o,updated_at:o,accepted_at:null,archived_at:null}).run(),e.criteria.forEach((d,c)=>{i.insert(Me).values({id:$e("pjc"),project_id:r,position:c+1,statement:d,verify_status:"pending",verified_at:null,evidence_json:"[]",created_at:o,updated_at:o}).run();}),Ht(i,{projectId:r,actorType:"system",type:"created",title:"Project created",payload:{}},o);});}catch(i){throw i instanceof exports.RepositoryError?i:new exports.RepositoryError("DB_ERROR","Failed to create project",i)}finally{s.close();}return this.getDetailOrThrow(r)}getProject(e){if(!this.dbExists())return;let n=this.openHandle(false);try{return this.getDetailFromHandle(n,e)}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to get project",r)}finally{n.close();}}listProjectsByWorkspace(e,n={}){if(ge(e,"workspaceId"),!this.dbExists())return [];let r=this.openHandle(false);try{let o=n.includeArchived?drizzleOrm.eq(z.workspace_id,e):drizzleOrm.and(drizzleOrm.eq(z.workspace_id,e),drizzleOrm.isNull(z.archived_at));return r.db.select({id:z.id}).from(z).where(o).orderBy(drizzleOrm.desc(z.updated_at),drizzleOrm.desc(z.created_at)).all().map(i=>this.getDetailFromHandle(r,i.id)).filter(i=>i!==void 0)}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to list projects",o)}finally{r.close();}}archiveProject(e){ge(e,"projectId");let n=this.openHandle(true);try{n.db.update(z).set({archived_at:new Date().toISOString()}).where(drizzleOrm.eq(z.id,e)).run().changes===0&&ze(`Project ${e} not found`);}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to archive project",r)}finally{n.close();}return this.getDetailOrThrow(e)}setScene(e,n,r={}){ge(e,"projectId"),ip.has(n)||Q(`invalid project scene: ${String(n)}`);let o=cn(r),s=new Date().toISOString(),i=this.openHandle(true);try{i.db.transaction(d=>{let c=d.select().from(z).where(drizzleOrm.eq(z.id,e)).get();c||ze(`Project ${e} not found`),d.update(z).set({scene:n,updated_at:s}).where(drizzleOrm.eq(z.id,e)).run(),Ht(d,{projectId:e,...o,type:"scene_changed",title:"Project scene changed",payload:{before:c.scene,after:n}},s);});}catch(d){throw d instanceof exports.RepositoryError?d:new exports.RepositoryError("DB_ERROR","Failed to set project scene",d)}finally{i.close();}return this.getDetailOrThrow(e)}setStageIndex(e,n,r={}){ge(e,"projectId"),Number.isInteger(n)||Q("stage index must be an integer");let o=cn(r),s=new Date().toISOString(),i=this.openHandle(true);try{i.db.transaction(d=>{let c=d.select().from(z).where(drizzleOrm.eq(z.id,e)).get();c||ze(`Project ${e} not found`);let u=Sa(c.stages_json);(n<1||n>u.length)&&Q("stage index is outside the project stages"),d.update(z).set({stage_index:n,updated_at:s}).where(drizzleOrm.eq(z.id,e)).run(),Ht(d,{projectId:e,...o,type:"stage_advanced",title:"Project stage advanced",payload:{before:c.stage_index,after:n}},s);});}catch(d){throw d instanceof exports.RepositoryError?d:new exports.RepositoryError("DB_ERROR","Failed to set project stage",d)}finally{i.close();}return this.getDetailOrThrow(e)}setCriterionVerify(e,n,r,o={}){let s=typeof e=="string"?{projectId:typeof r=="string"?e:void 0,criterionId:typeof r=="string"?n:e,verifyStatus:typeof r=="string"?r:n,...typeof r=="string"?o:r}:e,i=s.verifyStatus??s.status;(!i||!ap.has(i))&&Q(`invalid criterion status: ${String(i)}`),ge(s.criterionId,"criterionId");let d=cn(s),c=new Date().toISOString(),u=this.openHandle(true),f;try{u.db.transaction(g=>{let _=g.select().from(Me).where(drizzleOrm.eq(Me.id,s.criterionId)).get();_||ze(`Criterion ${s.criterionId} not found`),f=_.project_id,s.projectId&&s.projectId!==_.project_id&&ze(`Criterion ${s.criterionId} not found in project ${s.projectId}`),g.update(Me).set({verify_status:i,verified_at:i==="passed"?c:null,updated_at:c}).where(drizzleOrm.eq(Me.id,s.criterionId)).run(),Ht(g,{projectId:_.project_id,...d,type:"criterion_verified",title:"Criterion verification updated",payload:{criterionId:s.criterionId,status:i}},c);});}catch(g){throw g instanceof exports.RepositoryError?g:new exports.RepositoryError("DB_ERROR","Failed to set criterion verification",g)}finally{u.close();}let p=f?this.getProject(f)?.criteria.find(g=>g.id===s.criterionId):void 0;return p||ze(`Criterion ${s.criterionId} not found`),p}setCriterionEvidence(e,n,r,o={}){let s=typeof e=="string"?{projectId:Array.isArray(r)?e:void 0,criterionId:Array.isArray(r)?n:e,evidence:Array.isArray(r)?r:n,...Array.isArray(r)?o:r}:e;ge(s.criterionId,"criterionId");let i=fp(s.evidence),d=cn(s),c=new Date().toISOString(),u=this.openHandle(true),f;try{u.db.transaction(g=>{let _=g.select().from(Me).where(drizzleOrm.eq(Me.id,s.criterionId)).get();_||ze(`Criterion ${s.criterionId} not found`),f=_.project_id,s.projectId&&s.projectId!==_.project_id&&ze(`Criterion ${s.criterionId} not found in project ${s.projectId}`),g.update(Me).set({evidence_json:JSON.stringify(i),updated_at:c}).where(drizzleOrm.eq(Me.id,s.criterionId)).run(),Ht(g,{projectId:_.project_id,...d,type:"criterion_verified",title:"Criterion evidence updated",payload:{criterionId:s.criterionId,evidence:i}},c);});}catch(g){throw g instanceof exports.RepositoryError?g:new exports.RepositoryError("DB_ERROR","Failed to set criterion evidence",g)}finally{u.close();}let p=f?this.getProject(f)?.criteria.find(g=>g.id===s.criterionId):void 0;return p||ze(`Criterion ${s.criterionId} not found`),p}appendEvent(e,n){let r=typeof e=="string"?{...n,projectId:e}:e;va(r);let o=new Date().toISOString(),s=this.openHandle(true),i;try{s.db.transaction(d=>{i=Ht(d,r,o);});}catch(d){throw d instanceof exports.RepositoryError?d:new exports.RepositoryError("DB_ERROR","Failed to append project event",d)}finally{s.close();}if(!i)throw new exports.RepositoryError("DB_ERROR","Event append did not return a row");return i}listEvents(e,n={}){if(ge(e,"projectId"),n.afterSeq!==void 0&&(!Number.isInteger(n.afterSeq)||n.afterSeq<0)&&Q("afterSeq must be a non-negative integer"),n.limit!==void 0&&(!Number.isInteger(n.limit)||n.limit<1)&&Q("limit must be a positive integer"),!this.dbExists())return [];let r=this.openHandle(false);try{let o=[drizzleOrm.eq(Xe.project_id,e)];n.afterSeq!==void 0&&o.push(drizzleOrm.gt(Xe.seq,n.afterSeq));let s=r.db.select().from(Xe).where(drizzleOrm.and(...o)).orderBy(drizzleOrm.asc(Xe.seq));return n.limit!==void 0&&(s=s.limit(n.limit)),s.all()}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to list project events",o)}finally{r.close();}}acceptProject(e,n){ge(e,"projectId");let r=cn(n),o={remainingRisks:n.remainingRisks,nextPlan:n.nextPlan,lessons:n.lessons,evidenceRefs:n.evidenceRefs};Aa(o,"accepted");let s=new Date().toISOString(),i=this.openHandle(true);try{i.db.transaction(d=>{d.select({id:z.id}).from(z).where(drizzleOrm.eq(z.id,e)).get()||ze(`Project ${e} not found`),d.update(z).set({scene:"accepted",accepted_at:s,updated_at:s}).where(drizzleOrm.eq(z.id,e)).run(),Ht(d,{projectId:e,...r,type:"accepted",title:"Project accepted",payload:o},s);});}catch(d){throw d instanceof exports.RepositoryError?d:new exports.RepositoryError("DB_ERROR","Failed to accept project",d)}finally{i.close();}return this.getDetailOrThrow(e)}};fe();ce();h();ce();ue();var Ca=[x,exports.tasks,w,Di,Tt,ut,We,nn];function _p(){return Se__namespace.default.join(wi__default.default.homedir(),".crewx","crewx.db")}function mp(t){if(!Oa__namespace.default.existsSync(t))return null;let e=Math.floor(Date.now()/1e3),n=`${t}.bak-${e}`;return Oa__namespace.default.copyFileSync(t,n),n}function xa(t){let e=t.all("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'");return new Set(e.map(n=>n.name))}function kp(t){return t==null||typeof t=="object"&&"queryChunks"in t?null:typeof t=="number"?String(t):typeof t=="boolean"?t?"1":"0":typeof t=="string"?`'${t.replace(/'/g,"''")}'`:String(t)}function Tp(t){let e=t.getSQLType(),n=`"${t.name}" ${e}`,r=kp(t.default);return r!==null&&(n+=` DEFAULT ${r}`),t.notNull&&(n+=" NOT NULL"),n}function wp(t,e){let n=e?.dbPath??_p(),r=e?.force??false,o=e?.dryRun??false,s=o?null:mp(n);if(r&&!o)try{t.run("DELETE FROM __drizzle_migrations");}catch{}let i=xa(t);if(!o)try{tn(t);}catch(p){let g=p instanceof Error?`${p.message} ${p.cause?.message??""}`:"";if(!r||!g.includes("duplicate column"))throw p}let d,c;o?(d=Ca.map(g=>sqliteCore.getTableConfig(g).name).filter(g=>!i.has(g)),c=i):(c=xa(t),d=[...c].filter(p=>!i.has(p)));let u=[],f=[];for(let p of Ca){let g=sqliteCore.getTableConfig(p),_=g.name;if(!c.has(_))continue;let m=t.all(`PRAGMA table_info("${_}")`),k=new Set(m.map(E=>E.name)),T=new Set(g.columns.map(E=>E.name));for(let E of g.columns)if(!k.has(E.name)){if(!o){let b=Tp(E);t.run(`ALTER TABLE "${_}" ADD COLUMN ${b}`);}u.push({table:_,column:E.name});}for(let E of m)T.has(E.name)||f.push(`${_}.${E.name} exists in DB but not in schema (untouched)`);}return {created:d,altered:u,warnings:f,backupPath:s}}ue();Zn();Cs();Qn();Yn();Zn();h();se();h();var mc=["success","failed","completed"],co=10*1024*1024*1024,kc=256,xg=new Set(mc),Ee=class extends Error{constructor(n,r,o="metadata"){super(r);this.taskId=n;this.kind=o;this.name="MigrationTaskError";}taskId;kind};function uo(t){return t||(process.env.CREWX_DB?process.env.CREWX_DB:Se.join(wi.homedir(),".crewx","crewx.db"))}function Pg(){return kt("better-sqlite3")}function Tc(t,e){let n=t===":memory:";if(!n&&!Oa.existsSync(t))throw new Error(`Database not found: ${t}`);let r=new(Pg())(t,{readonly:e,fileMustExist:!n,timeout:5e3});return r.pragma("foreign_keys = ON"),r.pragma("busy_timeout = 5000"),r}function vn(t,e,n=[]){return t.prepare(e).all(...n)}function An(t,e,n=[]){return t.prepare(e).get(...n)}function Dg(t,e,n=[]){return t.prepare(e).run(...n)}function Lg(t,e,n=[]){return t.prepare(e).iterate(...n)}function Mg(t){return typeof t=="string"&&t.length>0?t:"<unknown>"}function wc(t){return typeof t=="string"&&xg.has(t)}function gc(t,e){t.set(e,(t.get(e)??0)+1);}function hc(t){return Object.fromEntries([...t.entries()].sort(([e],[n])=>e.localeCompare(n)))}function Hg(t){let e=new Set(vn(t,"SELECT name FROM sqlite_master WHERE type = 'table' AND name IN ('tasks', 'task_log_events')").map(i=>i.name)),n=["tasks","task_log_events"].filter(i=>!e.has(i));if(n.length>0)throw new Error(`Database schema is missing required table(s): ${n.join(", ")}`);let r=new Set(vn(t,"PRAGMA table_info('tasks')").map(i=>i.name)),s=["id","status","logs","log_storage","last_log_seq","log_revision"].filter(i=>!r.has(i));if(s.length>0)throw new Error(`Database schema is missing required tasks column(s): ${s.join(", ")}`)}function yc(t,e){if(e==null)return {entries:[]};if(typeof e!="string")throw new Ee(t,"Malformed task logs: tasks.logs must be JSON text or null","malformed");if(e.trim()==="")return {entries:[]};let n;try{n=JSON.parse(e);}catch(o){let s=o instanceof Error?o.message:String(o);throw new Ee(t,`Malformed JSON in tasks.logs (${s})`,"malformed")}if(!Array.isArray(n))throw new Ee(t,"Malformed task logs: expected a JSON array","malformed");let r=[];for(let[o,s]of n.entries()){if(s===null||typeof s!="object"||typeof s.timestamp!="string"||typeof s.level!="string"||typeof s.message!="string")throw new Ee(t,`Malformed task logs: entry ${o} must contain string timestamp, level, and message fields`,"malformed");let i=s;r.push({timestamp:i.timestamp,level:i.level,message:i.message});}return {entries:r}}function Ws(t,e){if(!Number.isInteger(t.last_log_seq)||t.last_log_seq<0)throw new Ee(t.id,"Invalid last_log_seq metadata","metadata");if(!Number.isInteger(t.log_revision)||t.log_revision<0)throw new Ee(t.id,"Invalid log_revision metadata","metadata");if(e==="blob"&&t.last_log_seq!==0)throw new Ee(t.id,"Blob source must have last_log_seq=0","metadata")}function $g(t){let e=vn(t,`SELECT task_id, COUNT(*) AS event_count
|
|
311
|
+
FROM task_log_events GROUP BY task_id`);return new Map(e.map(n=>[n.task_id,n.event_count]))}function Ug(t){let e=$g(t),n=new Map,r=[],o=[],s=[],i=new Map,d=new Map,c=0,u=0,f=0,p=0,g=0,_=0;for(let m of Lg(t,`SELECT id, status, logs, log_storage, last_log_seq, log_revision
|
|
312
|
+
FROM tasks ORDER BY id`)){let k=m,T=Mg(k.status);if(gc(i,T),n.set(k.id,{id:k.id,status:k.status,log_storage:k.log_storage,last_log_seq:k.last_log_seq,log_revision:k.log_revision}),c+=1,k.log_storage==="events"){p+=1;try{Ws(k,"events");}catch(y){s.push(Gs(y,k.id));}k.logs!==null&&s.push({taskId:k.id,reason:"Event source still has a non-null tasks.logs blob",kind:"mixed-source"});continue}if(k.log_storage!=="blob"){s.push({taskId:k.id,reason:`Unknown log_storage value: ${k.log_storage}`,kind:"invalid-source"});continue}u+=1;let E=wc(k.status);E||(f+=1,gc(d,T)),typeof k.logs=="string"?_+=Buffer.byteLength(k.logs,"utf8"):Buffer.isBuffer(k.logs)&&(_+=k.logs.byteLength);let b=e.get(k.id)??0;b>0&&s.push({taskId:k.id,reason:`Blob source already has ${b} task_log_events row(s)`,kind:"mixed-source"});let L;try{L=yc(k.id,k.logs),g+=L.entries.length,Ws(k,"blob");}catch(y){let N=Gs(y,k.id);s.push(N),N.kind==="malformed"&&o.push(N);continue}b>0||E&&r.push(k.id);}return {taskCount:c,candidateTaskCount:u,eligibleTaskCount:r.length,eventSourceTasks:p,statusCounts:hc(i),deferredTaskCount:f,deferredStatusCounts:hc(d),entryCount:g,sourceBytes:_,candidateIds:r,malformedRows:o,failures:s,tasks:n}}function Gs(t,e){return t instanceof Ee?{taskId:t.taskId,reason:t.message,kind:t.kind}:{taskId:e,reason:t instanceof Error?t.message:String(t),kind:"metadata"}}function Fg(t){return An(t,"SELECT COUNT(*) AS count FROM tasks WHERE status IN ('pending', 'running')")?.count??0}function Bg(t){return An(t,"SELECT COUNT(*) AS count FROM tasks WHERE log_storage = 'blob'")?.count??0}function qg(t){if(t===":memory:")return 0;let e=n=>{try{return Oa.statSync(n).size}catch{return 0}};return e(t)+e(`${t}-wal`)}function jg(t,e){return qg(t)+e*kc}function Rc(t,e){return Number.isFinite(t)&&Number.isFinite(e)&&t>=e+co}function _c(t){let e=Se.dirname(Se.resolve(t));for(;!Oa.existsSync(e);){let n=Se.dirname(e);if(n===e)break;e=n;}return e}function Ec(t,e,n){let r=[...new Set([_c(t),...n?[_c(n)]:[]])],o=[],s=Number.POSITIVE_INFINITY;for(let c of r)try{let u=Oa.statfsSync(c);s=Math.min(s,u.bavail*u.bsize);}catch(u){s=0,o.push(`Unable to inspect free space for ${c}: ${u instanceof Error?u.message:String(u)}`);}let i=jg(t,e),d=i+co;return {estimatedFreeSpaceBytes:i,requiredFreeSpaceBytes:d,availableFreeSpaceBytes:Number.isFinite(s)?Math.floor(s):0,minimumFreeSpaceReserveBytes:co,freeSpaceGatePassed:Rc(Number.isFinite(s)?Math.floor(s):0,i),warnings:o}}function Sc(t){return new Set(t.map(e=>e.taskId)).size}function or(t){try{let e=t.pragma("wal_checkpoint(TRUNCATE)"),n=Array.isArray(e)?e[0]:e,r=n!==null&&typeof n=="object"&&"busy"in n?Number(n.busy):0;return r>0?`WAL checkpoint(TRUNCATE) busy (${r}); continuing without failing migration`:void 0}catch(e){return `WAL checkpoint(TRUNCATE) warning; continuing without failing migration: ${e instanceof Error?e.message:String(e)}`}}function io(t,e,n,r,o=Ec(e,n.entryCount)){let s=r.failures??n.failures,i=r.malformedRows??n.malformedRows,{ok:d,...c}=r;return {mode:t,ok:d,dbPath:e,activeTaskCount:r.activeTaskCount??0,taskCount:n.taskCount,candidateTaskCount:n.candidateTaskCount,eligibleTaskCount:n.eligibleTaskCount,statusCounts:n.statusCounts,deferredTaskCount:n.deferredTaskCount,deferredStatusCounts:n.deferredStatusCounts,entryCount:n.entryCount,sourceBytes:n.sourceBytes,estimatedFreeSpaceBytes:o.estimatedFreeSpaceBytes,requiredFreeSpaceBytes:o.requiredFreeSpaceBytes,availableFreeSpaceBytes:o.availableFreeSpaceBytes,minimumFreeSpaceReserveBytes:o.minimumFreeSpaceReserveBytes,freeSpaceGatePassed:o.freeSpaceGatePassed,migratedTasks:r.migratedTasks??0,migratedEntries:r.migratedEntries??0,skippedTasks:r.skippedTasks??n.eventSourceTasks,failedTasks:r.failedTasks??Sc(s),malformedRows:i,failures:s,logicalSourceBytesRemoved:r.logicalSourceBytesRemoved??0,warnings:r.warnings??o.warnings,remainingTaskCount:r.remainingTaskCount??n.candidateTaskCount,...c}}function Wg(t,e){return t.length!==e.length?false:t.every((n,r)=>{let o=e[r];return n.seq===r+1&&n.timestamp===o.timestamp&&n.level===o.level&&n.message===o.message})}function Gg(t,e){return t.transaction(()=>{let r=An(t,`SELECT id, status, logs, log_storage, last_log_seq, log_revision
|
|
313
|
+
FROM tasks WHERE id = ?`,[e]);if(!r)throw new Ee(e,"Task disappeared before migration","metadata");if(r.log_storage==="events")return {status:"skipped",entryCount:0,sourceBytes:0};if(r.log_storage!=="blob")throw new Ee(e,`Unknown log_storage value: ${r.log_storage}`,"invalid-source");if(!wc(r.status))return {status:"deferred",entryCount:0,sourceBytes:0};let o=r.logs,s=yc(e,o);Ws(r,"blob");let i=An(t,"SELECT COUNT(*) AS count FROM task_log_events WHERE task_id = ?",[e])?.count??0;if(i!==0)throw new Ee(e,`Blob source already has ${i} task_log_events row(s)`,"mixed-source");let d=t.prepare(`INSERT INTO task_log_events (task_id, seq, timestamp, level, message)
|
|
314
|
+
VALUES (?, ?, ?, ?, ?)`);for(let[p,g]of s.entries.entries())d.run(e,p+1,g.timestamp,g.level,g.message);let c=vn(t,`SELECT seq, timestamp, level, message
|
|
315
|
+
FROM task_log_events WHERE task_id = ? ORDER BY seq`,[e]);if(!Wg(c,s.entries))throw new Ee(e,"Event parity check failed before source clear","metadata");if(Dg(t,`UPDATE tasks
|
|
310
316
|
SET log_storage = 'events', last_log_seq = ?, log_revision = log_revision + 1, logs = NULL
|
|
311
|
-
WHERE id = ? AND log_storage = 'blob' AND logs IS ?`,[s.entries.length,e,o]).changes!==1)throw new Ee(e,"Task changed while migration was in progress","metadata");let f=
|
|
312
|
-
FROM tasks WHERE id = ?`,[e]);if(!f||f.log_storage!=="events"||f.logs!==null||f.last_log_seq!==s.entries.length||f.log_revision!==r.log_revision+1)throw new Ee(e,"Final task metadata parity check failed","metadata");return {status:"migrated",entryCount:s.entries.length,sourceBytes:typeof o=="string"?Buffer.byteLength(o,"utf8"):Buffer.isBuffer(o)?o.byteLength:0}}).immediate()}function
|
|
317
|
+
WHERE id = ? AND log_storage = 'blob' AND logs IS ?`,[s.entries.length,e,o]).changes!==1)throw new Ee(e,"Task changed while migration was in progress","metadata");let f=An(t,`SELECT id, status, logs, log_storage, last_log_seq, log_revision
|
|
318
|
+
FROM tasks WHERE id = ?`,[e]);if(!f||f.log_storage!=="events"||f.logs!==null||f.last_log_seq!==s.entries.length||f.log_revision!==r.log_revision+1)throw new Ee(e,"Final task metadata parity check failed","metadata");return {status:"migrated",entryCount:s.entries.length,sourceBytes:typeof o=="string"?Buffer.byteLength(o,"utf8"):Buffer.isBuffer(o)?o.byteLength:0}}).immediate()}function bc(t){let e=new Date().toISOString().replace(/[-:.TZ]/g,"").slice(0,14),n=crypto.randomBytes(6).toString("hex");return `${t}.task-log-backup-${e}-${n}.sqlite`}async function zg(t,e,n){let r=n??bc(e);if(Se.resolve(r)===Se.resolve(e))throw new Error("Backup path must be different from the source database");if(Oa.existsSync(r))throw new Error(`Refusing to overwrite existing backup: ${r}`);if(Oa.mkdirSync(Se.dirname(r),{recursive:true}),await t.backup(r),!Oa.existsSync(r))throw new Error(`SQLite backup was not created: ${r}`);let o=Tc(r,true);try{let s=o.pragma("integrity_check",{simple:!0});if(s!=="ok")throw new Error(`Backup integrity check failed: ${s}`)}finally{o.close();}return r}function Kg(t){let e=vn(t,`SELECT task_id AS taskId,
|
|
313
319
|
COUNT(*) AS eventCount,
|
|
314
320
|
COUNT(DISTINCT seq) AS distinctSeqCount,
|
|
315
321
|
MIN(seq) AS minSeq,
|
|
316
322
|
MAX(seq) AS maxSeq
|
|
317
|
-
FROM task_log_events GROUP BY task_id`),n=e.reduce((r,o)=>r+o.eventCount,0);return {rows:e,eventCount:n}}function
|
|
318
|
-
FROM task_log_events GROUP BY task_id, seq HAVING COUNT(*) > 1`))r.push(
|
|
319
|
-
WHERE seq IS NULL OR seq < 1 OR timestamp IS NULL OR level IS NULL OR message IS NULL`)?.count??0;i>0&&r.push(
|
|
323
|
+
FROM task_log_events GROUP BY task_id`),n=e.reduce((r,o)=>r+o.eventCount,0);return {rows:e,eventCount:n}}function Rt(t,e,n,r={}){return {taskId:t,kind:e,reason:n,...r}}function Vg(t,e,n){let r=[];for(let p of n.failures)p.kind==="malformed"?r.push(Rt(p.taskId,"malformed-blob",p.reason)):p.kind==="mixed-source"?r.push(Rt(p.taskId,"mixed-source",p.reason)):r.push(Rt(p.taskId,"source-invariant",p.reason));let o=Kg(t),s=new Map(o.rows.map(p=>[p.taskId,p]));for(let p of o.rows){let g=n.tasks.get(p.taskId);if(!g){r.push(Rt(null,"orphan-event",`Event rows reference missing task ${p.taskId}`,{actual:p.eventCount}));continue}(p.minSeq===null||p.minSeq<1||p.distinctSeqCount!==p.maxSeq)&&r.push(Rt(g.id,"seq-gap","Task event sequence has a gap or invalid starting sequence",{expected:p.maxSeq??0,actual:p.distinctSeqCount})),g.log_storage==="events"&&g.last_log_seq!==p.eventCount&&r.push(Rt(g.id,"count-mismatch","last_log_seq does not match task_log_events row count",{expected:g.last_log_seq??0,actual:p.eventCount}));}for(let p of n.tasks.values())p.log_storage==="events"&&!s.has(p.id)&&p.last_log_seq!==0&&r.push(Rt(p.id,"count-mismatch","Event-source task has no rows for its last_log_seq",{expected:p.last_log_seq??0,actual:0}));for(let p of vn(t,`SELECT task_id AS taskId, seq, COUNT(*) AS duplicateCount
|
|
324
|
+
FROM task_log_events GROUP BY task_id, seq HAVING COUNT(*) > 1`))r.push(Rt(p.taskId,"duplicate-seq",`Duplicate task event sequence ${p.seq}`,{actual:p.duplicateCount,seq:p.seq}));let i=An(t,`SELECT COUNT(*) AS count FROM task_log_events
|
|
325
|
+
WHERE seq IS NULL OR seq < 1 OR timestamp IS NULL OR level IS NULL OR message IS NULL`)?.count??0;i>0&&r.push(Rt(null,"invalid-event","Event rows contain invalid sequence or null payload fields",{actual:i}));let d=new Set(r.flatMap(p=>p.taskId?[p.taskId]:[])),c=r.map(p=>({taskId:p.taskId??"(orphan)",reason:p.reason,kind:p.kind==="malformed-blob"?"malformed":p.kind==="mixed-source"?"mixed-source":"metadata"})),u=c.filter(p=>p.kind==="malformed"),f={checkedTasks:n.taskCount,eventSourceTasks:n.eventSourceTasks,blobSourceTasks:n.candidateTaskCount,eventCount:o.eventCount,orphanEventCount:r.filter(p=>p.kind==="orphan-event").length,failedTasks:d.size,issues:r};return io("verify",e,n,{ok:r.length===0,migratedTasks:n.eventSourceTasks,migratedEntries:o.eventCount,skippedTasks:n.candidateTaskCount,failedTasks:d.size,malformedRows:u,failures:c,remainingTaskCount:n.candidateTaskCount,verification:f})}function Jg(t){if(t.mode!=="apply"&&t.batchTasks!==void 0)throw new Error("--batch-tasks is only valid with --apply");if(t.batchTasks!==void 0&&(!Number.isInteger(t.batchTasks)||t.batchTasks<1))throw new Error("--batch-tasks must be a positive integer")}async function Yg(t){Jg(t);let e=uo(t.dbPath),n=Tc(e,t.mode!=="apply");try{Hg(n);let r=Ug(n),o=Fg(n);if(t.mode==="verify")return {...Vg(n,e,r),activeTaskCount:o};if(t.mode==="dry-run")return io("dry-run",e,r,{ok:r.failures.length===0,activeTaskCount:o,skippedTasks:r.eventSourceTasks,remainingTaskCount:r.candidateTaskCount});let s=t.backupPath??bc(e),i=Ec(e,r.entryCount,s);if(!i.freeSpaceGatePassed)return io("apply",e,r,{ok:!1,activeTaskCount:o,blockedReason:`Apply blocked: available free space (${i.availableFreeSpaceBytes} bytes) is below the required ${i.requiredFreeSpaceBytes} bytes (including a ${i.minimumFreeSpaceReserveBytes} byte reserve)`,skippedTasks:r.eventSourceTasks,remainingTaskCount:r.candidateTaskCount},i);let d=await zg(n,e,s),c=[...r.failures],u=t.batchTasks===void 0?r.candidateIds:r.candidateIds.slice(0,t.batchTasks),f=t.batchTasks??Math.max(u.length,1),p=0,g=0,_=0,m=[...i.warnings];for(let[k,T]of u.entries()){try{let E=Gg(n,T);E.status==="migrated"&&(p+=1,g+=E.entryCount,_+=E.sourceBytes);}catch(E){c.push(Gs(E,T));}if((k+1)%f===0||k===u.length-1){let E=or(n);E&&m.push(E);}}return io("apply",e,r,{ok:c.length===0,activeTaskCount:o,backupPath:d,backupMethod:"sqlite-online-backup",migratedTasks:p,migratedEntries:g,logicalSourceBytesRemoved:_,failedTasks:Sc(c),failures:c,malformedRows:r.malformedRows,remainingTaskCount:Bg(n),skippedTasks:r.eventSourceTasks,warnings:m},i)}finally{n.close();}}function Xg(t){return Se.basename(t)}Mr();Zn();hs();var po=["success","failed","completed"],Oc=1440*60*1e3,Nc=1,th=2048,zs=64*1024*1024,Ys=[{key:"usageBackfill",field:"metadata.usageBackfill",before:"before_usage_backfill",after:"after_usage_backfill"},{key:"usageAccounting",field:"metadata.usageAccounting",before:"before_usage_accounting",after:"after_usage_accounting"},{key:"usageAccountingReason",field:"metadata.usageAccountingReason",before:"before_usage_accounting_reason",after:"after_usage_accounting_reason"}],Ic=["run_epoch","completed_at","input_tokens","output_tokens","cached_input_tokens","cost_usd","model",...Ys.map(t=>t.field)],nh=20,rh=["pre-instrumentation","provider-no-usage","suppressed-by-adapter","not-captured"];function Cc(){return kt("better-sqlite3")}function Xs(t,e){let n=Ke(t),r=t===":memory:";if(!r&&!Oa.existsSync(n))throw new Error(`Database not found: ${n}`);let o=new(Cc())(n,{readonly:e,fileMustExist:!r,timeout:5e3});return o.pragma("foreign_keys = ON"),o.pragma("busy_timeout = 5000"),o}function sr(t,e,n=[]){return t.prepare(e).all(...n)}function Yt(t,e,n=[]){return t.prepare(e).get(...n)}function xt(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Xt(t){if(!t)return {};try{let e=JSON.parse(t);return xt(e)?{...e}:{}}catch{return {}}}function xc(t){let e=t.provider;if(!(typeof e!="string"||e.trim().length===0))return e.trim()}function Pc(t){return typeof t=="number"&&Number.isFinite(t)?Math.trunc(t):0}function oh(t){return t??"unknown"}function sh(t){return po.includes(t)}function ih(t){return t==="plugin/mock"}function Dc(t,e,n){return sh(t.status)&&!In(t)&&t.agent_id!=="workflow"&&t.platform!=="workflow"&&t.platform!=="mcp"&&t.agent_id!=="direct"&&n.direct_call!==true&&!ih(e)}function ah(t,e){let n=t.usageBackfill;return xt(n)&&Object.prototype.hasOwnProperty.call(n,String(e))}function dh(t){return typeof t=="string"&&rh.includes(t)}function Lc(t,e){return t.usageAccounting==="recorded"||t.usageAccounting==="unavailable"&&dh(t.usageAccountingReason)?true:ah(t,e)}function ch(t){return sr(t,`SELECT id, agent_id, status, completed_at, metadata, model, platform, run_epoch,
|
|
320
326
|
input_tokens, output_tokens, cached_input_tokens, cost_usd
|
|
321
327
|
FROM tasks
|
|
322
328
|
WHERE status IN (?, ?, ?)
|
|
323
|
-
ORDER BY completed_at ASC, id ASC`,[...
|
|
329
|
+
ORDER BY completed_at ASC, id ASC`,[...po])}function Ks(t){let e=ch(t),n=e.flatMap(d=>{let c=Xt(d.metadata),u=xc(c);return Dc(d,u,c)?[{...d,metadataObject:c,provider:u,epoch:Pc(d.run_epoch)}]:[]}),r=n.filter(d=>!Lc(d.metadataObject,d.epoch)),o=sr(t,`SELECT COUNT(*) AS count
|
|
324
330
|
FROM tasks
|
|
325
331
|
WHERE json_valid(metadata) = 1
|
|
326
332
|
AND json_type(metadata, '$') = 'object'
|
|
327
|
-
AND json_extract(metadata, '$.usageAccounting') IN ('recorded', 'unavailable')`)[0]?.count??0,s=
|
|
333
|
+
AND json_extract(metadata, '$.usageAccounting') IN ('recorded', 'unavailable')`)[0]?.count??0,s=Yt(t,"SELECT COUNT(*) AS count FROM tasks")?.count??0,i=Yt(t,"SELECT COUNT(*) AS count FROM tasks WHERE status IN (?, ?, ?)",[...po])?.count??e.length;return {scannedTasks:s,terminalTasks:i,rawTargetRows:n,candidates:r,accountingTasks:o}}function Mc(t){return !t||t==="unknown"||t==="cli/unknown"?"pre-instrumentation":t==="cli/antigravity"||t.startsWith("acp/")||t.startsWith("remote/")?"provider-no-usage":t==="cli/codex"||t==="cli/opencode"?"suppressed-by-adapter":"not-captured"}function uh(t){let e=t instanceof Date?t.getTime():t===void 0?Date.now():new Date(t).getTime();if(!Number.isFinite(e))throw new Error("Usage backfill clock must be a valid date");return e}function lh(t,e){if(!t)return false;let n=Date.parse(t);return Number.isFinite(n)&&n>=e-Oc}function ph(t,e,n){let r=Mc(t.provider),o;try{o=Vr({taskLogRepository:e,taskId:t.id,provider:t.provider,model:t.model})?.usage;}catch{o=void 0;}return o?{candidate:t,outcome:"recovered",usage:o}:lh(t.completed_at,n)?{candidate:t,outcome:"deferred",reason:r}:{candidate:t,outcome:"unavailable",reason:r}}function fh(t,e,n){let r=oh(e),o=t[r]??{candidates:0,recovered:0,unavailable:0,deferred:0};o.candidates+=1,o[n]+=1,t[r]=o;}function gh(t,e){e&&(t[e]+=1);}function hh(){return {"pre-instrumentation":0,"provider-no-usage":0,"suppressed-by-adapter":0,"not-captured":0}}function _h(t){return Object.fromEntries(Object.entries(t).sort(([e],[n])=>e.localeCompare(n)))}function Ac(t,e,n,r,o){let s=Xt(t),i=xt(s.usageBackfill)?{...s.usageBackfill}:{};return i[String(e)]={at:n},s.usageBackfill=i,s.usageAccounting=r,r==="unavailable"&&o?s.usageAccountingReason=o:delete s.usageAccountingReason,JSON.stringify(s)}function mh(t,e){let n=Xt(t.metadata),r=xc(n);return Dc(t,r,n)&&t.id===e.id&&r===e.provider&&Pc(t.run_epoch)===e.epoch&&t.completed_at===e.completed_at&&!Lc(n,e.epoch)}function kh(t,e,n){if(e.outcome!=="deferred"){if(e.outcome==="unavailable")return {...t,metadata:Ac(t.metadata,e.candidate.epoch,n,"unavailable",e.reason)};if(e.usage)return {...t,input_tokens:e.usage.inputTokens,output_tokens:e.usage.outputTokens,cached_input_tokens:e.usage.cachedInputTokens,cost_usd:e.usage.costUsd,metadata:Ac(t.metadata,e.candidate.epoch,n,"recorded"),model:t.model===null&&e.usage.model?e.usage.model:t.model}}}function Th(t,e,n,r){return t.transaction(()=>{let s=Yt(t,`SELECT id, agent_id, status, completed_at, metadata, model, platform, run_epoch,
|
|
328
334
|
input_tokens, output_tokens, cached_input_tokens, cost_usd
|
|
329
|
-
FROM tasks WHERE id = ?`,[n.candidate.id]);if(!s||!
|
|
335
|
+
FROM tasks WHERE id = ?`,[n.candidate.id]);if(!s||!mh(s,n.candidate)||n.outcome==="deferred")return "skipped";let i=kh(s,n,r);return i?(Sh(e,Rh(s,i)),n.outcome==="unavailable"?t.prepare("UPDATE tasks SET metadata = ? WHERE id = ?").run(i.metadata,s.id).changes===1?"changed":"skipped":t.prepare(`UPDATE tasks
|
|
330
336
|
SET input_tokens = ?, output_tokens = ?, cached_input_tokens = ?, cost_usd = ?,
|
|
331
337
|
metadata = ?, model = ?
|
|
332
|
-
WHERE id = ?`).run(i.input_tokens,i.output_tokens,i.cached_input_tokens,i.cost_usd,i.metadata,i.model,s.id).changes===1?"changed":"skipped"):"skipped"}).immediate()}function
|
|
338
|
+
WHERE id = ?`).run(i.input_tokens,i.output_tokens,i.cached_input_tokens,i.cost_usd,i.metadata,i.model,s.id).changes===1?"changed":"skipped"):"skipped"}).immediate()}function vc(t){let e=Se.dirname(Se.resolve(t));for(;!Oa.existsSync(e);){let n=Se.dirname(e);if(n===e)break;e=n;}return e}function wh(t,e,n){let r=[...new Set([vc(t),...n?[vc(n)]:[]])],o=Number.POSITIVE_INFINITY,s=[];for(let c of r)try{let u=Oa.statfsSync(c);o=Math.min(o,u.bavail*u.bsize);}catch(u){o=0,s.push(`Unable to inspect free space for ${c}: ${u instanceof Error?u.message:String(u)}`);}let i=e*th,d=Number.isFinite(o)?Math.floor(o):0;return {estimatedFreeSpaceBytes:i,requiredFreeSpaceBytes:i+zs,availableFreeSpaceBytes:d,minimumFreeSpaceReserveBytes:zs,freeSpaceGatePassed:Number.isFinite(d)&&d>=i+zs,warnings:s}}function Hc(t){let e=new Date().toISOString().replace(/[-:.TZ]/g,"").slice(0,14),n=crypto.randomBytes(6).toString("hex");return `${t}.usage-undo-${e}-${n}.sqlite`}function On(t,e){if(!Object.prototype.hasOwnProperty.call(t,e))return null;let n=JSON.stringify(t[e]);return n===void 0?null:n}function yh(t){if(t!==null)try{return JSON.parse(t)}catch{throw new Error("Usage undo snapshot contains invalid metadata JSON")}}function Js(t,e){if(Object.is(t,e))return true;if(Array.isArray(t)||Array.isArray(e))return !Array.isArray(t)||!Array.isArray(e)||t.length!==e.length?false:t.every((n,r)=>Js(n,e[r]));if(xt(t)||xt(e)){if(!xt(t)||!xt(e))return false;let n=Object.keys(t).sort(),r=Object.keys(e).sort();return n.length===r.length&&n.every((o,s)=>o===r[s]&&Js(t[o],e[o]))}return false}function Rh(t,e){let n=Xt(t.metadata),r=Xt(e.metadata);return {id:t.id,before_run_epoch:t.run_epoch,after_run_epoch:e.run_epoch,before_completed_at:t.completed_at,after_completed_at:e.completed_at,before_input_tokens:t.input_tokens,after_input_tokens:e.input_tokens,before_output_tokens:t.output_tokens,after_output_tokens:e.output_tokens,before_cached_input_tokens:t.cached_input_tokens,after_cached_input_tokens:e.cached_input_tokens,before_cost_usd:t.cost_usd,after_cost_usd:e.cost_usd,before_model:t.model,after_model:e.model,before_usage_backfill:On(n,"usageBackfill"),after_usage_backfill:On(r,"usageBackfill"),before_usage_accounting:On(n,"usageAccounting"),after_usage_accounting:On(r,"usageAccounting"),before_usage_accounting_reason:On(n,"usageAccountingReason"),after_usage_accounting_reason:On(r,"usageAccountingReason")}}function Eh(t,e,n,r){let o=e??Hc(t);if(o===":memory:")throw new Error("Usage undo snapshot path must be a file");if(Se.resolve(o)===Se.resolve(t))throw new Error("Undo snapshot path must be different from the source database");if(Oa.existsSync(o))throw new Error(`Refusing to overwrite existing undo snapshot: ${o}`);Oa.mkdirSync(Se.dirname(o),{recursive:true});let s=Ke(o),i=new(Cc())(s,{readonly:false,fileMustExist:false,timeout:5e3});try{return i.pragma("foreign_keys = ON"),i.pragma("busy_timeout = 5000"),i.exec(`
|
|
333
339
|
CREATE TABLE usage_undo_meta (
|
|
334
340
|
id INTEGER PRIMARY KEY CHECK (id = 1),
|
|
335
341
|
source_db_path TEXT NOT NULL,
|
|
@@ -361,39 +367,39 @@ ${r.join(`
|
|
|
361
367
|
after_usage_accounting_reason TEXT
|
|
362
368
|
);
|
|
363
369
|
`),i.prepare(`INSERT INTO usage_undo_meta (id, source_db_path, created_at, schema_version, plan_summary)
|
|
364
|
-
VALUES (1, ?, ?, ?, ?)`).run(Se.resolve(t),n,
|
|
370
|
+
VALUES (1, ?, ?, ?, ?)`).run(Se.resolve(t),n,Nc,JSON.stringify(r)),{path:o,db:i}}catch(d){throw i.close(),d}}function Sh(t,e){t.db.prepare(`INSERT INTO usage_undo_rows (
|
|
365
371
|
id, before_run_epoch, after_run_epoch, before_completed_at, after_completed_at,
|
|
366
372
|
before_input_tokens, after_input_tokens, before_output_tokens, after_output_tokens,
|
|
367
373
|
before_cached_input_tokens, after_cached_input_tokens, before_cost_usd, after_cost_usd,
|
|
368
374
|
before_model, after_model, before_usage_backfill, after_usage_backfill,
|
|
369
375
|
before_usage_accounting, after_usage_accounting,
|
|
370
376
|
before_usage_accounting_reason, after_usage_accounting_reason
|
|
371
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(e.id,e.before_run_epoch,e.after_run_epoch,e.before_completed_at,e.after_completed_at,e.before_input_tokens,e.after_input_tokens,e.before_output_tokens,e.after_output_tokens,e.before_cached_input_tokens,e.after_cached_input_tokens,e.before_cost_usd,e.after_cost_usd,e.before_model,e.after_model,e.before_usage_backfill,e.after_usage_backfill,e.before_usage_accounting,e.after_usage_accounting,e.before_usage_accounting_reason,e.after_usage_accounting_reason);}function
|
|
377
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(e.id,e.before_run_epoch,e.after_run_epoch,e.before_completed_at,e.after_completed_at,e.before_input_tokens,e.after_input_tokens,e.before_output_tokens,e.after_output_tokens,e.before_cached_input_tokens,e.after_cached_input_tokens,e.before_cost_usd,e.after_cost_usd,e.before_model,e.after_model,e.before_usage_backfill,e.after_usage_backfill,e.before_usage_accounting,e.after_usage_accounting,e.before_usage_accounting_reason,e.after_usage_accounting_reason);}function bh(t){let e=sr(t,"SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name").map(n=>n.name);if(e.length!==2||e[0]!=="usage_undo_meta"||e[1]!=="usage_undo_rows")throw new Error("Invalid usage undo snapshot: expected usage_undo_meta and usage_undo_rows tables")}function $c(t){let e=Xs(t,true);try{let n=e.pragma("integrity_check",{simple:!0});if(n!=="ok")throw new Error(`Undo snapshot integrity check failed: ${n}`);bh(e);}finally{e.close();}}function Ih(t,e){if(!Oa.existsSync(t))throw new Error(`Usage undo snapshot not found: ${t}`);$c(t);let n=Xs(t,true);try{let r=Yt(n,"SELECT source_db_path, created_at, schema_version, plan_summary FROM usage_undo_meta WHERE id = 1");if(!r)throw new Error("Usage undo snapshot metadata is missing");if(Se.resolve(r.source_db_path)!==Se.resolve(e))throw new Error(`Usage undo snapshot source database ${r.source_db_path} does not match restore target ${Se.resolve(e)}`);if(r.schema_version!==Nc)throw new Error(`Unsupported usage undo snapshot schema version: ${r.schema_version}`);try{let o=JSON.parse(r.plan_summary);if(!xt(o))throw new Error("plan summary is not an object")}catch(o){throw new Error(`Usage undo snapshot plan summary is invalid: ${o instanceof Error?o.message:String(o)}`)}return {path:t,rows:sr(n,`SELECT id, before_run_epoch, after_run_epoch, before_completed_at, after_completed_at,
|
|
372
378
|
before_input_tokens, after_input_tokens, before_output_tokens, after_output_tokens,
|
|
373
379
|
before_cached_input_tokens, after_cached_input_tokens, before_cost_usd, after_cost_usd,
|
|
374
380
|
before_model, after_model, before_usage_backfill, after_usage_backfill,
|
|
375
381
|
before_usage_accounting, after_usage_accounting,
|
|
376
382
|
before_usage_accounting_reason, after_usage_accounting_reason
|
|
377
|
-
FROM usage_undo_rows ORDER BY rowid ASC`)}}finally{n.close();}}function
|
|
383
|
+
FROM usage_undo_rows ORDER BY rowid ASC`)}}finally{n.close();}}function Uc(t,e,n){let r=t[n==="before"?e.before:e.after];return yh(r)}function Ah(t,e){return Object.prototype.hasOwnProperty.call(t,e)?t[e]:void 0}function vh(t,e){let n=[];Object.is(t.run_epoch,e.after_run_epoch)||n.push("run_epoch"),Object.is(t.completed_at,e.after_completed_at)||n.push("completed_at"),Object.is(t.input_tokens,e.after_input_tokens)||n.push("input_tokens"),Object.is(t.output_tokens,e.after_output_tokens)||n.push("output_tokens"),Object.is(t.cached_input_tokens,e.after_cached_input_tokens)||n.push("cached_input_tokens"),Object.is(t.cost_usd,e.after_cost_usd)||n.push("cost_usd"),Object.is(t.model,e.after_model)||n.push("model");let r=Xt(t.metadata);for(let o of Ys){let s=Uc(e,o,"after");Js(Ah(r,o.key),s)||n.push(o.field);}return n}function Oh(t,e){let n=Xt(t);for(let r of Ys){let o=Uc(e,r,"before");o===void 0?delete n[r.key]:n[r.key]=o;}return JSON.stringify(n)}function Nh(t,e){return t.transaction(()=>{let r=Yt(t,`SELECT id, agent_id, status, completed_at, metadata, model, platform, run_epoch,
|
|
378
384
|
input_tokens, output_tokens, cached_input_tokens, cost_usd
|
|
379
|
-
FROM tasks WHERE id = ?`,[e.id]);if(!r)return {taskId:e.id,fields:[...
|
|
385
|
+
FROM tasks WHERE id = ?`,[e.id]);if(!r)return {taskId:e.id,fields:[...Ic]};let o=vh(r,e);if(o.length>0)return {taskId:e.id,fields:o};let s=Oh(r.metadata,e);return t.prepare(`UPDATE tasks
|
|
380
386
|
SET run_epoch = ?, completed_at = ?, input_tokens = ?, output_tokens = ?,
|
|
381
387
|
cached_input_tokens = ?, cost_usd = ?, model = ?, metadata = ?
|
|
382
|
-
WHERE id = ?`).run(e.before_run_epoch,e.before_completed_at,e.before_input_tokens,e.before_output_tokens,e.before_cached_input_tokens,e.before_cost_usd,e.before_model,s,e.id).changes===1?void 0:{taskId:e.id,fields:[...
|
|
388
|
+
WHERE id = ?`).run(e.before_run_epoch,e.before_completed_at,e.before_input_tokens,e.before_output_tokens,e.before_cached_input_tokens,e.before_cost_usd,e.before_model,s,e.id).changes===1?void 0:{taskId:e.id,fields:[...Ic]}}).immediate()}function Ch(t){if(!Yt(t,"SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'tasks'"))throw new Error("Usage backfill requires the tasks table");let n=new Set(sr(t,"PRAGMA table_info(tasks)").map(i=>i.name)),o=["id","agent_id","status","completed_at","metadata","model","platform","run_epoch","input_tokens","output_tokens","cached_input_tokens","cost_usd"].filter(i=>!n.has(i));if(o.length>0)throw new Error(`Usage backfill requires task columns: ${o.join(", ")}`);if(!Yt(t,"SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'task_log_events'"))throw new Error("Usage backfill requires the task_log_events table")}function xh(t,e,n,r){return {mode:t,ok:true,dbPath:e,scannedTasks:n.scannedTasks,terminalTasks:n.terminalTasks,rawTargetTasks:n.rawTargetRows.length,candidateTasks:n.candidates.length,recoveredTasks:0,unavailableTasks:0,deferredTasks:0,changedTasks:0,wouldChangeTasks:0,restored:0,skippedConflict:0,conflictSamples:[],accountingTasks:n.accountingTasks,remainingTargetTasks:n.candidates.length,providerDistribution:{},reasonCounts:hh(),estimatedFreeSpaceBytes:r.estimatedFreeSpaceBytes,requiredFreeSpaceBytes:r.requiredFreeSpaceBytes,availableFreeSpaceBytes:r.availableFreeSpaceBytes,minimumFreeSpaceReserveBytes:r.minimumFreeSpaceReserveBytes,freeSpaceGatePassed:r.freeSpaceGatePassed,failures:[],warnings:[...r.warnings]}}function Ph(t,e){for(let n of e)fh(t.providerDistribution,n.candidate.provider,n.outcome),gh(t.reasonCounts,n.outcome==="unavailable"?n.reason:void 0),n.outcome==="recovered"&&(t.recoveredTasks+=1),n.outcome==="unavailable"&&(t.unavailableTasks+=1),n.outcome==="deferred"&&(t.deferredTasks+=1);t.providerDistribution=_h(t.providerDistribution),t.wouldChangeTasks=t.recoveredTasks+t.unavailableTasks;}function Dh(t){if(!["dry-run","apply","verify","restore"].includes(t.mode))throw new Error(`Unsupported usage backfill mode: ${t.mode}`);if(t.backupPath&&t.mode!=="apply")throw new Error("--backup is only valid with --apply");if(t.restorePath&&t.mode!=="restore")throw new Error("--restore is only valid with restore mode");if(t.mode==="restore"&&!t.restorePath)throw new Error("Restore mode requires a usage undo snapshot path")}async function Lh(t){Dh(t);let e=uo(t.dbPath),n=uh(t.now),r=new Date(n).toISOString(),o=t.mode==="restore"?Ih(t.restorePath,e):void 0,s=Xs(e,t.mode!=="apply"&&t.mode!=="restore"),i;try{Ch(s);let d=Ks(s),c=t.mode==="apply"&&d.candidates.length>0?t.backupPath??Hc(e):void 0,u=wh(e,d.candidates.length,c),f=xh(t.mode,e,d,u);if(o){f.backupPath=o.path,f.snapshotPath=o.path;for(let T of o.rows)try{let E=Nh(s,T);E?(f.skippedConflict+=1,f.conflictSamples.length<nh&&f.conflictSamples.push(E)):f.restored+=1;}catch(E){f.failures.push({taskId:T.id,reason:E instanceof Error?E.message:String(E)});}let m=Ks(s);f.accountingTasks=m.accountingTasks,f.remainingTargetTasks=m.candidates.length,f.ok=f.failures.length===0;let k=or(s);return k&&f.warnings.push(k),f}if(t.mode==="verify")return f;if(t.mode==="apply"&&!u.freeSpaceGatePassed&&d.candidates.length>0)return f.ok=!1,f.blockedReason=`Apply blocked: available free space (${u.availableFreeSpaceBytes} bytes) is below the required ${u.requiredFreeSpaceBytes} bytes (including a ${u.minimumFreeSpaceReserveBytes} byte reserve)`,f;if(d.candidates.length===0)return f;let p=new exports.TaskLogRepository({dbPath:e}),g=[];for(let m of d.candidates){let k=ph(m,p,n);g.push(k);}if(Ph(f,g),t.mode==="dry-run"&&(f.changedTasks=0),t.mode==="apply"){i=Eh(e,c,r,{candidates:g.length,recovered:f.recoveredTasks,unavailable:f.unavailableTasks,deferred:f.deferredTasks}),f.backupPath=i.path,f.snapshotPath=i.path,f.backupMethod="row-undo-snapshot";for(let k of g)if(k.outcome!=="deferred")try{Th(s,i,k,r)==="changed"&&(f.changedTasks+=1);}catch(T){f.failures.push({taskId:k.candidate.id,reason:T instanceof Error?T.message:String(T)});}let m=i.path;i.db.close(),i=void 0,$c(m);}let _=Ks(s);if(f.accountingTasks=_.accountingTasks,f.remainingTargetTasks=_.candidates.length,f.ok=f.failures.length===0,t.mode==="apply"){let m=or(s);m&&f.warnings.push(m);}return f}finally{i&&i.db.close(),s.close();}}Mr();h();se();fe();ce();pe();ue();Yn();h();function fo(t){return t!==null&&t!==""}function Mh(t){return t.schedule_id!==null&&t.schedule_id!==void 0?"system":fo(t.parent_task_id)||fo(t.caller_agent_id)?"agent":t.platform==="workflow"?"system":"human"}function Fc(t,e){return {origin:t==="human"?"direct":"delegated",delegatedByAgentId:t==="agent"&&fo(e)?e:null}}function go(t){let e=Mh(t),n=fo(t.caller_agent_id)?t.caller_agent_id:null,r=t.parent_thread_id!==null&&t.parent_thread_id!==t.thread_id;return {origin:e==="human"?"direct":"delegated",delegatedByAgentId:e==="agent"?n??(r&&t.parent_agent_id||null):null}}function Bc(t,e,n){return t.creator_task_id!==null&&t.creator_pointer_unverified===0?t.creator_actor_kind!==null?Fc(t.creator_actor_kind,t.creator_actor_id):e?go(e):{origin:"direct",delegatedByAgentId:null}:t.created_by_kind!==null?Fc(t.created_by_kind,t.created_by_id):n?go(n):void 0}function ho(t){return {...t,status:Nt(t)}}function qh({metadata:t,...e}){return {...e,status:Nt({...e,metadata:t})}}var _o=900,jc=20;function Wc(t,e){return (t?.origin??"direct")===e}function Gc(t,e){let n=new Date(e.updated_at).getTime()-new Date(t.updated_at).getTime();return n!==0?n:t.id.localeCompare(e.id)}var Qt=class extends exports.RepositoryError{reason;constructor(e,n=e){super("VALIDATION",n),this.name="ThreadTitleMetadataPatchError",this.reason=e;}};function ir(t){if(!t)return {};try{let e=JSON.parse(t);return !e||typeof e!="object"||Array.isArray(e)?{}:e}catch{return {}}}function jh(t){let n=ir(t).threadTitle;if(!n||typeof n!="object"||Array.isArray(n))return {priority:null,state:null};let r=n;return {priority:typeof r.priority=="string"?r.priority:null,state:typeof r.state=="string"?r.state:null}}function zc(t,e,n){return t.get(drizzleOrm.sql`
|
|
383
389
|
SELECT id
|
|
384
390
|
FROM tasks INDEXED BY idx_tasks_thread_id
|
|
385
391
|
WHERE thread_id = ${e}
|
|
386
392
|
AND id <> ${n}
|
|
387
393
|
LIMIT 1
|
|
388
|
-
`)!==void 0}var
|
|
394
|
+
`)!==void 0}var Zs=class extends exports.BaseSqliteRepository{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=Se.join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=Se.dirname(n);Oa.existsSync(o)||Oa.mkdirSync(o,{recursive:true});}else if(!Oa.existsSync(n))throw new exports.RepositoryError("NOT_FOUND","Database not found");let r=C(n);if(e)try{V(r.db,n);}catch(o){throw r.close(),o}return r}topLevelTaskPredicateSql(e="child",n){let r=n?`tasks parent INDEXED BY ${n}`:"tasks parent";return drizzleOrm.sql.raw(`NOT EXISTS (
|
|
389
395
|
SELECT 1 FROM ${r}
|
|
390
396
|
WHERE parent.id = ${e}.parent_task_id
|
|
391
397
|
AND parent.thread_id = ${e}.thread_id
|
|
392
398
|
)`)}findAllThreadsQuery(e,n){let r=[];e&&r.push(drizzleOrm.sql`workspace_id = ${e}`),n&&r.push(drizzleOrm.sql`created_by_kind = ${n}`);let o=r.length>0?drizzleOrm.sql` WHERE ${drizzleOrm.sql.join(r,drizzleOrm.sql` AND `)}`:drizzleOrm.sql``;return drizzleOrm.sql`SELECT * FROM threads${o} ORDER BY updated_at DESC`}findThreadIdsQuery(e){return e?drizzleOrm.sql`SELECT id FROM threads INDEXED BY idx_threads_ws_updated
|
|
393
399
|
WHERE workspace_id = ${e}
|
|
394
|
-
ORDER BY updated_at DESC`:drizzleOrm.sql`SELECT id FROM threads`}readThreadIds(e,n="Failed to find thread ids"){let r=this.resolveDbPaths(),o=new Set,s=[];for(let i of r){if(!
|
|
400
|
+
ORDER BY updated_at DESC`:drizzleOrm.sql`SELECT id FROM threads`}readThreadIds(e,n="Failed to find thread ids"){let r=this.resolveDbPaths(),o=new Set,s=[];for(let i of r){if(!Oa.existsSync(i))continue;let d=C(i);try{let c=d.db.all(this.findThreadIdsQuery(e));for(let u of c)o.has(u.id)||(o.add(u.id),s.push(u.id));}catch(c){throw new exports.RepositoryError("DB_ERROR",n,c)}finally{d.close();}}return s}findThreadSortKeysQuery(e){return drizzleOrm.sql`SELECT id, updated_at
|
|
395
401
|
FROM threads INDEXED BY idx_threads_ws_updated
|
|
396
|
-
WHERE workspace_id = ${e}`}readThreadSortKeys(e){let n=this.resolveDbPaths(),r=new Set,o=[];for(let s of n){if(!
|
|
402
|
+
WHERE workspace_id = ${e}`}readThreadSortKeys(e){let n=this.resolveDbPaths(),r=new Set,o=[];for(let s of n){if(!Oa.existsSync(s))continue;let i=C(s);try{let d=i.db.all(this.findThreadSortKeysQuery(e));for(let c of d)r.has(c.id)||(r.add(c.id),o.push(c));}catch(d){throw new exports.RepositoryError("DB_ERROR","Failed to find recent direct threads",d)}finally{i.close();}}return o}readThreadRowsByIds(e,n,r="Failed to find threads by ids"){if(e.length===0)return [];let o=this.resolveDbPaths(),s=new Set,i=[];for(let d of o){if(!Oa.existsSync(d))continue;let c=C(d);try{for(let u=0;u<e.length;u+=_o){let f=e.slice(u,u+_o),p=drizzleOrm.inArray(w.id,f),g=n?drizzleOrm.and(p,drizzleOrm.eq(w.workspace_id,n)):p,_=c.db.select().from(w).where(g).all();for(let m of _)s.has(m.id)||(s.add(m.id),i.push(m));}}catch(u){throw new exports.RepositoryError("DB_ERROR",r,u)}finally{c.close();}}return i}readThreadRows(e,n,r="Failed to find all threads"){let o=this.resolveDbPaths(),s=new Set,i=[];for(let d of o){if(!Oa.existsSync(d))continue;let c=C(d);try{let u=c.db.all(this.findAllThreadsQuery(e,n));for(let f of u)s.has(f.id)||(s.add(f.id),i.push(f));}catch(u){throw new exports.RepositoryError("DB_ERROR",r,u)}finally{c.close();}}return i}findAllThreads(e,n){return this.readThreadRows(e,n)}explainFindAllThreadsPlan(e,n){let r=this.resolveDbPaths();for(let o of r){if(!Oa.existsSync(o))continue;let s=C(o);try{return s.db.all(drizzleOrm.sql`EXPLAIN QUERY PLAN ${this.findAllThreadsQuery(e,n)}`).map(d=>d.detail)}finally{s.close();}}return []}findThreadsByIdsOrTitles(e,n){if(e.length===0)return [];let r=this.resolveDbPaths(),o=new Set,s=[];for(let i of r){if(!Oa.existsSync(i))continue;let d=C(i);try{let c=drizzleOrm.or(drizzleOrm.inArray(w.id,e),drizzleOrm.inArray(w.title,e)),u=n?drizzleOrm.and(c,drizzleOrm.eq(w.workspace_id,n)):c,f=d.db.select().from(w).where(u).orderBy(drizzleOrm.desc(w.updated_at)).all();for(let p of f)o.has(p.id)||(o.add(p.id),s.push(p));}catch(c){throw new exports.RepositoryError("DB_ERROR","Failed to find threads by ids or titles",c)}finally{d.close();}}return s}findThreadById(e,n){let r=this.resolveDbPaths();for(let o of r){if(!Oa.existsSync(o))continue;let s=C(o);try{let i=drizzleOrm.eq(w.id,e),d=n?drizzleOrm.and(i,drizzleOrm.eq(w.workspace_id,n)):i,c=s.db.select().from(w).where(d).limit(1).get()??void 0;if(c)return c}catch(i){throw new exports.RepositoryError("DB_ERROR","Failed to find thread by id",i)}finally{s.close();}}}threadExists(e,n){let r=this.resolveDbPaths();for(let o of r){if(!Oa.existsSync(o))continue;let s=C(o);try{let i=drizzleOrm.eq(w.id,e),d=n?drizzleOrm.and(i,drizzleOrm.eq(w.workspace_id,n)):i;if(s.db.select({id:w.id}).from(w).where(d).limit(1).get())return !0}catch(i){throw new exports.RepositoryError("DB_ERROR","Failed to check thread existence",i)}finally{s.close();}}return false}aggregateTaskStats(e,n){let r=this.resolveDbPaths(),o=0,s=0,i=0,d=0,c=0,u=new Set;for(let f of r){if(!Oa.existsSync(f))continue;let p=C(f);try{let g=p.db.get(drizzleOrm.sql`
|
|
397
403
|
SELECT
|
|
398
404
|
count(*) AS cnt,
|
|
399
405
|
COALESCE(SUM(child.input_tokens), 0) AS total_input,
|
|
@@ -410,7 +416,7 @@ ${r.join(`
|
|
|
410
416
|
AND child.agent_id IS NOT NULL AND child.agent_id != ''
|
|
411
417
|
AND ${this.topLevelTaskPredicateSql()}
|
|
412
418
|
${n?drizzleOrm.sql`AND child.workspace_id = ${n}`:drizzleOrm.sql``}
|
|
413
|
-
`);for(let m of _)u.add(m.agent_id);}catch(g){throw new exports.RepositoryError("DB_ERROR","Failed to aggregate task stats",g)}finally{p.close();}}return {taskCount:o,inputTokens:s,outputTokens:i,cachedInputTokens:d,costUsd:c,agentIds:Array.from(u)}}findTopLevelTasks(e,n,r){let o=this.resolveDbPaths(),s=new Set,i=[];for(let d of o){if(!
|
|
419
|
+
`);for(let m of _)u.add(m.agent_id);}catch(g){throw new exports.RepositoryError("DB_ERROR","Failed to aggregate task stats",g)}finally{p.close();}}return {taskCount:o,inputTokens:s,outputTokens:i,cachedInputTokens:d,costUsd:c,agentIds:Array.from(u)}}findTopLevelTasks(e,n,r){let o=this.resolveDbPaths(),s=new Set,i=[];for(let d of o){if(!Oa.existsSync(d))continue;let c=C(d);try{let u;r!==void 0?u=c.db.all(drizzleOrm.sql`
|
|
414
420
|
SELECT * FROM (
|
|
415
421
|
SELECT child.*,
|
|
416
422
|
ROW_NUMBER() OVER (PARTITION BY child.agent_id ORDER BY child.started_at DESC) AS rn
|
|
@@ -427,7 +433,7 @@ ${r.join(`
|
|
|
427
433
|
AND ${this.topLevelTaskPredicateSql()}
|
|
428
434
|
${n?drizzleOrm.sql`AND child.workspace_id = ${n}`:drizzleOrm.sql``}
|
|
429
435
|
ORDER BY child.started_at ASC
|
|
430
|
-
`);for(let f of u)s.has(f.id)||(s.add(f.id),i.push(
|
|
436
|
+
`);for(let f of u)s.has(f.id)||(s.add(f.id),i.push(ho(f)));}catch(u){throw new exports.RepositoryError("DB_ERROR","Failed to find top-level tasks",u)}finally{c.close();}}if(r!==void 0&&o.length>1){let d=new Map;for(let c of i){let u=c.agent_id??"";d.has(u)||d.set(u,[]),d.get(u).push(c);}i=[];for(let c of d.values())c.sort((u,f)=>(f.started_at??"").localeCompare(u.started_at??"")),i.push(...c.slice(0,r));i.sort((c,u)=>(c.started_at??"").localeCompare(u.started_at??""));}return i}findAllTasks(e,n){let r=this.resolveDbPaths(),o=new Set,s=[];for(let i of r){if(!Oa.existsSync(i))continue;let d=C(i);try{let c=drizzleOrm.eq(exports.tasks.thread_id,e),u=n?drizzleOrm.and(c,drizzleOrm.eq(exports.tasks.workspace_id,n)):c,f=d.db.select().from(exports.tasks).where(u).orderBy(drizzleOrm.asc(exports.tasks.started_at)).all();for(let p of f)o.has(p.id)||(o.add(p.id),s.push(ho(p)));}catch(c){throw new exports.RepositoryError("DB_ERROR","Failed to find all tasks for thread",c)}finally{d.close();}}return s}findTaskById(e,n,r){let o=this.resolveDbPaths();for(let s of o){if(!Oa.existsSync(s))continue;let i=C(s);try{let d=drizzleOrm.and(drizzleOrm.eq(exports.tasks.id,n),drizzleOrm.eq(exports.tasks.thread_id,e)),c=r?drizzleOrm.and(d,drizzleOrm.eq(exports.tasks.workspace_id,r)):d,u=i.db.select().from(exports.tasks).where(c).limit(1).get();if(!u)continue;let f=i.db.select().from(exports.tasks).where(drizzleOrm.eq(exports.tasks.parent_task_id,u.id)).orderBy(drizzleOrm.asc(exports.tasks.started_at)).all().map(ho);return {task:ho(u),children:f}}catch(d){throw new exports.RepositoryError("DB_ERROR","Failed to find task by id",d)}finally{i.close();}}}batchFetchTasksQuery(e,n){return drizzleOrm.sql`
|
|
431
437
|
SELECT child.id, child.thread_id, child.agent_id, child.status,
|
|
432
438
|
child.parent_task_id, child.started_at, child.completed_at,
|
|
433
439
|
child.duration_ms, child.input_tokens, child.output_tokens,
|
|
@@ -437,7 +443,7 @@ ${r.join(`
|
|
|
437
443
|
AND ${this.topLevelTaskPredicateSql()}
|
|
438
444
|
${n?drizzleOrm.sql`AND child.workspace_id = ${n}`:drizzleOrm.sql``}
|
|
439
445
|
ORDER BY child.started_at ASC
|
|
440
|
-
`}batchFetchTasks(e,n){let r=new Map;if(e.length===0)return r;let o=this.resolveDbPaths();for(let s of o){if(!
|
|
446
|
+
`}batchFetchTasks(e,n){let r=new Map;if(e.length===0)return r;let o=this.resolveDbPaths();for(let s of o){if(!Oa.existsSync(s))continue;let i=C(s);try{let d=i.db.all(this.batchFetchTasksQuery(e,n));for(let c of d){let u=c.thread_id;r.has(u)||r.set(u,[]),r.get(u).push(qh(c));}}catch(d){throw new exports.RepositoryError("DB_ERROR","Failed to batch fetch tasks",d)}finally{i.close();}}return r}findThreadOriginsQuery(e,n){return drizzleOrm.sql`
|
|
441
447
|
WITH root AS (
|
|
442
448
|
SELECT child.thread_id, child.id, child.caller_agent_id, child.parent_task_id,
|
|
443
449
|
CASE
|
|
@@ -489,7 +495,7 @@ ${r.join(`
|
|
|
489
495
|
FROM tasks AS child
|
|
490
496
|
LEFT JOIN tasks AS parent ON parent.id = child.parent_task_id
|
|
491
497
|
WHERE child.id IN (${drizzleOrm.sql.join(e.map(n=>drizzleOrm.sql`${n}`),drizzleOrm.sql`, `)})
|
|
492
|
-
`}findThreadOrigins(e,n){let r=new Map;if(e.length===0)return r;let o=this.resolveDbPaths();for(let s of o){if(!
|
|
498
|
+
`}findThreadOrigins(e,n){let r=new Map;if(e.length===0)return r;let o=this.resolveDbPaths();for(let s of o){if(!Oa.existsSync(s))continue;let i=C(s);try{for(let d=0;d<e.length;d+=_o){let c=e.slice(d,d+_o),f=i.db.all(this.findCreatorPointersQuery(c,n)).filter(b=>!r.has(b.thread_id)),p=f.filter(b=>b.creator_task_id!==null&&b.creator_pointer_unverified===0&&b.creator_actor_kind===null).map(b=>b.creator_task_id),g=p.length>0?i.db.all(this.findTaskOriginLineageQuery(p)):[],_=new Map(g.map(b=>[b.task_id,b])),m=new Map(f.map(b=>[b.thread_id,b])),k=c.filter(b=>{if(r.has(b))return !1;let L=m.get(b);return L?!(L.creator_task_id!==null&&L.creator_pointer_unverified===0)&&L.created_by_kind===null:!0}),T=k.length>0?i.db.all(this.findThreadOriginsQuery(k,n)):[],E=new Map(T.map(b=>[b.thread_id,b]));for(let b of f){if(r.has(b.thread_id))continue;let L=Bc(b,b.created_by_task_id!==null?_.get(b.created_by_task_id):void 0,E.get(b.thread_id));L&&r.set(b.thread_id,L);}for(let b of T)r.has(b.thread_id)||m.has(b.thread_id)||r.set(b.thread_id,go(b));}}catch(d){throw new exports.RepositoryError("DB_ERROR","Failed to fetch thread origins",d)}finally{i.close();}}return r}findThreadsByOrigin(e,n){let r=this.readThreadIds(n,"Failed to find threads by origin"),o=this.findThreadOrigins(r,n),s=r.filter(d=>Wc(o.get(d),e));return this.readThreadRowsByIds(s,n,"Failed to find threads by origin").sort(Gc)}findRecentDirectThreads(e,n=5){if(typeof e!="string"||e.trim().length===0)throw new exports.RepositoryError("VALIDATION","workspaceId is required");if(!Number.isInteger(n)||n<=0)throw new exports.RepositoryError("VALIDATION","limit must be a positive integer");let r=this.readThreadSortKeys(e).sort(Gc),o=[],s=new Map;for(let u=0;u<r.length;u+=jc){let f=r.slice(u,u+jc),p=this.findThreadOrigins(f.map(g=>g.id),e);for(let[g,_]of p)s.set(g,_);for(let g of f)if(Wc(p.get(g.id),"direct")&&(o.push(g.id),o.length===n))break;if(o.length===n)break}let i=new Map;if(o.length>0){let u=this.readThreadRowsByIds(o,e,"Failed to find recent direct threads");for(let f of u)i.set(f.id,f);}let d=[],c=new Map;for(let u of o){let f=i.get(u);if(!f)continue;d.push(f);let p=s.get(u);p&&c.set(u,p);}return {threads:d,originsByThread:c}}explainBatchFetchTasksPlan(e,n){let r=this.resolveDbPaths();for(let o of r){if(!Oa.existsSync(o))continue;let s=C(o);try{return s.db.all(drizzleOrm.sql`EXPLAIN QUERY PLAN ${this.batchFetchTasksQuery(e,n)}`).map(d=>d.detail)}finally{s.close();}}return []}explainFindThreadOriginsPlan(e,n){if(e.length===0)return [];let r=this.resolveDbPaths();for(let o of r){if(!Oa.existsSync(o))continue;let s=C(o);try{let i=s.db.all(drizzleOrm.sql`EXPLAIN QUERY PLAN ${this.findCreatorPointersQuery(e,n)}`),d=s.db.all(drizzleOrm.sql`EXPLAIN QUERY PLAN ${this.findTaskOriginLineageQuery(e)}`),c=s.db.all(drizzleOrm.sql`EXPLAIN QUERY PLAN ${this.findThreadOriginsQuery(e,n)}`);return [...i,...d,...c].map(u=>u.detail)}finally{s.close();}}return []}explainFindThreadsByOriginPlan(e,n){let r=`__thread_origin_${e}_plan__`,o=this.resolveDbPaths();for(let s of o){if(!Oa.existsSync(s))continue;let i=C(s);try{let d=i.db.all(drizzleOrm.sql`EXPLAIN QUERY PLAN ${this.findThreadIdsQuery(n)}`),c=i.db.all(drizzleOrm.sql`EXPLAIN QUERY PLAN ${this.findCreatorPointersQuery([r],n)}`),u=i.db.all(drizzleOrm.sql`EXPLAIN QUERY PLAN ${this.findTaskOriginLineageQuery([r])}`),f=i.db.all(drizzleOrm.sql`EXPLAIN QUERY PLAN ${this.findThreadOriginsQuery([r],n)}`);return [...d,...c,...u,...f].map(p=>p.detail)}finally{i.close();}}return []}updateThreadTitle(e,n,r){if(!this.dbExists())return;let o=this.openHandle(true);try{let s=drizzleOrm.eq(w.id,e),i=r?drizzleOrm.and(s,drizzleOrm.eq(w.workspace_id,r)):s;if(!o.db.select({id:w.id}).from(w).where(i).limit(1).get())return;o.db.update(w).set({title:n,title_locked:1,updated_at:new Date().toISOString()}).where(drizzleOrm.eq(w.id,e)).run();}catch(s){throw s instanceof exports.RepositoryError?s:new exports.RepositoryError("DB_ERROR","Failed to update thread title",s)}finally{o.close();}}upsertThread(e,n){let r=this.openHandle(true);try{r.db.transaction(o=>{let i=(n.workspaceId?o.select({id:x.id}).from(x).where(drizzleOrm.eq(x.id,n.workspaceId)).limit(1).get():void 0)?n.workspaceId:null,d=new Date().toISOString(),c=o.select({id:w.id,message_count:w.message_count,created_by_task_id:w.created_by_task_id}).from(w).where(drizzleOrm.eq(w.id,e)).limit(1).get();if(c){let u={updated_at:d};n.title!==void 0&&(u.title=n.title),n.titleLocked!==void 0&&(u.title_locked=n.titleLocked?1:0),c.created_by_task_id===null&&n.createdByTaskId!=null&&c.message_count===0&&!zc(o,e,n.createdByTaskId)&&(u.created_by_task_id=n.createdByTaskId),o.update(w).set(u).where(drizzleOrm.eq(w.id,e)).run();}else o.insert(w).values({id:e,platform:n.platform,workspace_id:i,created_by_kind:null,created_by_id:null,created_by_task_id:n.createdByTaskId??null,title:n.title??null,title_locked:n.titleLocked?1:0,message_count:0,created_at:d,updated_at:d}).run();},{behavior:"immediate"});}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to upsert thread",o)}finally{r.close();}}ensureThread(e,n,r,o){let s=this.openHandle(true);try{s.db.transaction(i=>{let c=(r?i.select({id:x.id}).from(x).where(drizzleOrm.eq(x.id,r)).limit(1).get():void 0)?r:null,u=i.select({id:w.id,platform:w.platform,workspace_id:w.workspace_id,message_count:w.message_count,created_by_task_id:w.created_by_task_id}).from(w).where(drizzleOrm.eq(w.id,e)).limit(1).get();if(u){let p={};c&&!u.workspace_id&&(p.workspace_id=c),u.created_by_task_id===null&&o?.createdByTaskId!=null&&u.message_count===0&&!zc(i,e,o.createdByTaskId)&&(p.created_by_task_id=o.createdByTaskId),Object.keys(p).length>0&&i.update(w).set(p).where(drizzleOrm.eq(w.id,e)).run();return}let f=new Date().toISOString();i.insert(w).values({id:e,platform:n,workspace_id:c,created_by_kind:null,created_by_id:null,created_by_task_id:o?.createdByTaskId??null,message_count:0,created_at:f,updated_at:f}).run();},{behavior:"immediate"});}catch(i){throw i instanceof exports.RepositoryError?i:new exports.RepositoryError("DB_ERROR","Failed to ensure thread",i)}finally{s.close();}}saveUserMessage(e,n,r){if(!this.dbExists())return {firstMessage:false};let o=this.openHandle(true);try{let s=new Date().toISOString();return {firstMessage:o.db.transaction(d=>{let u=d.select({message_count:w.message_count}).from(w).where(drizzleOrm.eq(w.id,e)).limit(1).get()?.message_count===0;return d.run(drizzleOrm.sql`
|
|
493
499
|
UPDATE threads
|
|
494
500
|
SET first_message = COALESCE(first_message, ${n}),
|
|
495
501
|
title = CASE WHEN title_locked = 0 AND title IS NULL THEN substr(${n}, 1, 60) ELSE title END,
|
|
@@ -497,7 +503,7 @@ ${r.join(`
|
|
|
497
503
|
message_count = message_count + 1,
|
|
498
504
|
updated_at = ${s}
|
|
499
505
|
WHERE id = ${e}
|
|
500
|
-
`),u},{behavior:"immediate"})}}catch(s){throw s instanceof exports.RepositoryError?s:new exports.RepositoryError("DB_ERROR","Failed to save user message",s)}finally{o.close();}}saveAssistantMessage(e,n,r){if(!this.dbExists())return;let o=this.openHandle(true);try{let s=new Date().toISOString();o.db.update(w).set({last_message:n,updated_at:s}).where(drizzleOrm.eq(w.id,e)).run();}catch(s){throw s instanceof exports.RepositoryError?s:new exports.RepositoryError("DB_ERROR","Failed to save assistant message",s)}finally{o.close();}}updateThread(e,n){if(!this.dbExists())return;let r=this.openHandle(true);try{let o={updated_at:new Date().toISOString()};n.title!==void 0&&(o.title=n.title,o.title_locked=1),n.titleLocked!==void 0&&(o.title_locked=n.titleLocked?1:0),r.db.update(w).set(o).where(drizzleOrm.eq(w.id,e)).run();}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to update thread",o)}finally{r.close();}}patchThreadTitleMetadata(e,n,r){let o=n;if(!o||typeof o!="object"||Array.isArray(o))return new Jt("THREAD_TITLE_PATCH_INVALID","Thread-title metadata patch must be an object");if(Object.keys(o).some(c=>c!=="priority"&&c!=="state"))return new Jt("THREAD_TITLE_PATCH_INVALID","Thread-title metadata patch only supports priority and state");let i=o;if(i.priority===void 0&&i.state===void 0)return new Jt("THREAD_TITLE_PATCH_EMPTY","Thread-title metadata patch must change priority or state");for(let c of [i.priority,i.state])if(c!=null&&(typeof c!="string"||c.length===0))return new Jt("THREAD_TITLE_PATCH_INVALID","Thread-title metadata values must be non-empty strings or null");let d=this.openHandle(true);try{let c=r?drizzleOrm.and(drizzleOrm.eq(w.id,e),drizzleOrm.eq(w.workspace_id,r)):drizzleOrm.eq(w.id,e);return d.db.transaction(u=>{let f=u.select({metadata:w.metadata}).from(w).where(c).get();if(!f)return null;let p=nr(f.metadata),g=p.threadTitle,_=g&&typeof g=="object"&&!Array.isArray(g)?{...g}:{};i.priority===null?delete _.priority:i.priority!==void 0&&(_.priority=i.priority),i.state===null?delete _.state:i.state!==void 0&&(_.state=i.state),Object.keys(_).length>0?p.threadTitle=_:delete p.threadTitle;let m=Object.keys(p).length>0?JSON.stringify(p):null,k=new Date().toISOString();u.update(w).set({metadata:m,updated_at:k}).where(c).run();let T=u.select({metadata:w.metadata}).from(w).where(c).get();if(!T)throw new exports.RepositoryError("DB_ERROR","Thread-title metadata update could not be read back");let E=Mh(T.metadata);return {threadId:e,priority:E.priority,state:E.state}},{behavior:"immediate"})}catch(c){throw c instanceof exports.RepositoryError?c:new exports.RepositoryError("DB_ERROR","Failed to patch thread-title metadata",c)}finally{d.close();}}togglePin(e,n){let r=this.openHandle(true);try{let o=n?drizzleOrm.and(drizzleOrm.eq(w.id,e),drizzleOrm.eq(w.workspace_id,n)):drizzleOrm.eq(w.id,e);return r.db.transaction(s=>{let i=s.select({pinned:w.pinned,metadata:w.metadata}).from(w).where(o).get();if(!i)return null;let d=i.pinned?0:1,c=nr(i.metadata);if(d){let u=n?drizzleOrm.and(drizzleOrm.eq(w.pinned,1),drizzleOrm.eq(w.workspace_id,n)):drizzleOrm.eq(w.pinned,1),f=s.select({metadata:w.metadata}).from(w).where(u).all(),p=null;for(let g of f){let _=nr(g.metadata);typeof _.pinOrder=="number"&&(p===null||_.pinOrder<p)&&(p=_.pinOrder);}c.pinOrder=p===null?0:p-1;}else delete c.pinOrder;return s.update(w).set({pinned:d,metadata:Object.keys(c).length>0?JSON.stringify(c):null}).where(o).run(),{pinned:!!d}},{behavior:"immediate"})}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to toggle pin",o)}finally{r.close();}}reorderPins(e,n){let r=this.openHandle(true);try{r.db.transaction(o=>{for(let s=0;s<e.length;s++){let i=n?drizzleOrm.and(drizzleOrm.eq(w.id,e[s]),drizzleOrm.eq(w.workspace_id,n)):drizzleOrm.eq(w.id,e[s]),d=o.select({metadata:w.metadata}).from(w).where(i).get();if(!d)continue;let c=nr(d.metadata);c.pinOrder=s+1,o.update(w).set({metadata:JSON.stringify(c)}).where(i).run();}},{behavior:"immediate"});}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to reorder pins",o)}finally{r.close();}}toggleStar(e,n){let r=this.openHandle(true);try{let o=n?drizzleOrm.and(drizzleOrm.eq(w.id,e),drizzleOrm.eq(w.workspace_id,n)):drizzleOrm.eq(w.id,e),s=r.db.select({starred:w.starred}).from(w).where(o).get();if(!s)return null;let i=s.starred?0:1;return r.db.update(w).set({starred:i}).where(o).run(),{starred:!!i}}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to toggle star",o)}finally{r.close();}}resolveOverdriveForRequest(e,n,r,o){let i=this.openHandle(true);try{let d=n?drizzleOrm.and(drizzleOrm.eq(w.id,e),drizzleOrm.eq(w.workspace_id,n)):drizzleOrm.eq(w.id,e);return i.db.transaction(u=>{let f=u.select({metadata:w.metadata}).from(w).where(d).get();if(!f)return null;let p=f.metadata?JSON.parse(f.metadata):{},g=p.overdrive??{},_=o?.defaultTurns??g.defaultTurns??3,m=o?.updatedBy??"ui",k=new Date().toISOString(),T,E,b,L;switch(r){case "enable-count":{let y=o?.turns??_,N=o?.consumeCurrent?Math.max(y-1,0):y;T=N>0?"count":"off",E=N,b=!0,L="count";break}case "enable-latch":{T="latch",E=0,b=!0,L="latch";break}case "disable":{T="off",E=0,b=!1;break}default:{let y=g.state??"off",N=typeof g.remaining=="number"?g.remaining:0;if(y==="count"&&N>0){let P=N-1;P<=0?(T="off",E=0):(T="count",E=P),b=!0,L="count";}else y==="latch"?(T="latch",E=0,b=!0,L="latch"):(T="off",E=0,b=!1);break}}return p.overdrive={state:T,remaining:E,defaultTurns:_,updatedAt:k,updatedBy:m},u.update(w).set({metadata:JSON.stringify(p),updated_at:k}).where(d).run(),{applied:b,appliedMode:L,state:T,remaining:E}},{behavior:"immediate"})}catch(d){throw d instanceof exports.RepositoryError?d:new exports.RepositoryError("DB_ERROR","Failed to resolve overdrive",d)}finally{i.close();}}};h();se();fe();ce();pe();ue();h();var jc=["urgent","high","medium","low"],Wc=["investigating","in-progress","in-review","on-hold","done"],rr="custom:";var Hh=new Set(jc),Uh=new Set(Wc),$h={urgent:"U \uAE34\uAE09 Urgent",high:"P0 \uAE09\uD568 High",medium:"P1 \uC911\uC694 Medium",low:"P2 \uBCF4\uD1B5 Low"},Ys={investigating:"\uC870\uC0AC\uC911 Looking into","in-progress":"\uC9C4\uD589\uC911 In progress","in-review":"\uAC80\uD1A0\uC911 In review","on-hold":"\uBCF4\uB958 On hold",done:"\uC644\uB8CC Done"};function qc(t,e){return !e||e.includes(t)?e??t:`${t} ${e}`}function or(t){return typeof t=="string"&&Hh.has(t)}function sr(t){if(typeof t!="string")return false;if(Uh.has(t))return true;if(t.startsWith("c_"))return t.length>2;if(!t.startsWith(rr))return false;let e=t.slice(rr.length);return e.length>=1&&e.length<=20}function Gc(t){if(t.startsWith(rr))return t.slice(rr.length)}function Xs(t){if(!t)return null;try{let e=JSON.parse(t);return !e||typeof e!="object"||Array.isArray(e)?null:e}catch{return null}}function Fh(t){let e=Xs(t);return !!e&&Object.prototype.hasOwnProperty.call(e,"threadTitle")}function fo(t){let e=Xs(t);if(!e)return {};let n=e.threadTitle;if(!n||typeof n!="object"||Array.isArray(n))return {};let r=n,o={};return or(r.priority)&&(o.priority=r.priority),sr(r.state)&&(o.state=r.state),o}function Qs(t,e){let n=Xs(t)??{},r={...fo(t)};return e.priority===null?delete r.priority:e.priority!==void 0&&(r.priority=e.priority),e.state===null?delete r.state:e.state!==void 0&&(r.state=e.state),r.priority===void 0&&r.state===void 0?delete n.threadTitle:n.threadTitle=r,Object.keys(n).length===0?null:JSON.stringify(n)}function Bh(t,e=new Map){let n=[];return t.priority&&n.push(qc($h[t.priority],e.get(t.priority))),t.state&&(t.state.startsWith(rr)?n.push(Gc(t.state)??""):Ys[t.state]?n.push(qc(Ys[t.state],e.get(t.state))):e.has(t.state)?n.push(t.state,e.get(t.state)??""):t.state.startsWith("c_")?n.push(t.state):n.push(Ys[t.state]??"")),n.filter(Boolean).join(" ")}function zc(t,e){if(!t||t.trim().length===0)return;let n=new Set,r=false,o=false;for(let s of t.split(",")){let i=s.trim();if(i){if(i==="none"){r=true,o=true;continue}e(i)&&(n.add(i),o=true);}}if(o)return {values:n,includeNone:r}}function qh(t){return zc(t,or)}function jh(t){return zc(t,sr)}function Wh(t,e){return e?t?e.values.has(t):e.includeNone:true}zn();var Xc="regeneration_replaced",Jh="THREAD_HIGHLIGHT_REGENERATION_NO_ELIGIBLE_TURNS",Qc="THREAD_HIGHLIGHT_REGENERATION_INTERRUPTED",Yh="THREAD_HIGHLIGHT_REGENERATION_DETECTION_FAILED",Zc="THREAD_HIGHLIGHT_REGENERATION_COMMIT_FAILED",mo=class extends exports.RepositoryError{threadId;highlightId;expectedRevision;currentRevision;constructor(e,n,r,o){super("CONFLICT",`Highlight revision conflict: expected ${r}, current ${o}`),this.name="ThreadHistoryConflictError",this.threadId=e,this.highlightId=n,this.expectedRevision=r,this.currentRevision=o;}},vn=class extends mo{},ko=class extends exports.RepositoryError{stableCode="THREAD_HIGHLIGHT_REGENERATION_IN_PROGRESS";run;constructor(e){super("CONFLICT","THREAD_HIGHLIGHT_REGENERATION_IN_PROGRESS"),this.name="ThreadHighlightRegenerationConflictError",this.run=e;}},Xh=new Set(Zi),Qh=new Set(Qi),Zh=new Set(ea),e_=new Set(ta),t_=50,Vc=100,Jc=280,Yc=40,n_=new Set(na),go=["queued","running"];function ei(t){return n_.has(t)}function Y(t){throw new exports.RepositoryError("VALIDATION",t)}function ot(t){throw new exports.RepositoryError("NOT_FOUND",t)}function M(t,e){(typeof t!="string"||t.trim().length===0)&&Y(`${e} is required`);}function ar(t={}){let e=t.actor??t,n=e.actorType??"system";return Xh.has(n)||Y(`invalid actorType: ${String(n)}`),e.actorId!==void 0&&e.actorId!==null&&typeof e.actorId!="string"&&Y("actorId must be a string or null"),{actorType:n,actorId:e.actorId??null}}function r_(t){M(t.threadId,"threadId"),t.workspaceId!==void 0&&t.workspaceId!==null&&M(t.workspaceId,"workspaceId"),t.title!==void 0&&t.title!==null&&((typeof t.title!="string"||t.title.trim().length===0)&&Y("title must not be empty"),t.title.length>120&&Y("title must be at most 120 characters")),t.priority!==void 0&&t.priority!==null&&!or(t.priority)&&Y(`invalid priority: ${String(t.priority)}`),t.state!==void 0&&t.state!==null&&!sr(t.state)&&Y(`invalid state: ${String(t.state)}`);}function o_(t){t.beforeSeq!==void 0&&t.afterSeq!==void 0&&Y("beforeSeq and afterSeq cannot be used together");for(let[n,r]of [["beforeSeq",t.beforeSeq],["afterSeq",t.afterSeq]])r!==void 0&&(!Number.isInteger(r)||r<0)&&Y(`${n} must be a non-negative integer`);let e=t.limit??t_;return (!Number.isInteger(e)||e<1||e>Vc)&&Y(`limit must be between 1 and ${Vc}`),e}function ni(t){typeof t!="string"&&Y("text is required");let e=t.trim();return e.length===0&&Y("text must not be empty"),e.length>Jc&&Y(`text must be at most ${Jc} characters`),e}function yt(t,e){return M(t??"",e),t}function ri(t){e_.has(t)||Y(`invalid highlight kind: ${String(t)}`);}function s_(t){Zh.has(t)||Y(`invalid highlight source: ${String(t)}`);}function i_(t){M(t.threadId,"threadId"),M(t.workspaceId,"workspaceId");let e=t.source??"manual";s_(e),ri(t.kind);let n=ni(t.text),r=t.coversFromTaskId??t.fromTaskId??t.taskId,o=t.coversToTaskId??t.toTaskId??t.taskId;if(e==="manual"){let f=t.taskId??(r&&o&&r===o?r:void 0),p=yt(f,"taskId");return (r!==p||o!==p)&&Y("manual highlights must cover exactly one task"),{source:e,kind:t.kind,text:n,coversFromTaskId:p,coversToTaskId:p,agentId:t.agentId??null,sourceTaskId:null,detectorVersion:null,contentFingerprint:null}}let s=yt(r,"coversFromTaskId"),i=yt(o,"coversToTaskId"),d=t.sourceTaskId??s,c=t.detectorVersion??(t.idempotencyKey!==void 0?"default":null),u=t.contentFingerprint??t.idempotencyKey??null;return yt(d??void 0,"sourceTaskId"),yt(c??void 0,"detectorVersion"),yt(u??void 0,"contentFingerprint"),{source:e,kind:t.kind,text:n,coversFromTaskId:s,coversToTaskId:i,agentId:t.agentId??null,sourceTaskId:d,detectorVersion:c,contentFingerprint:u}}function a_(t,e){(!t||typeof t!="object")&&Y(`candidates[${e}] is required`),ri(t.kind);let n=ni(t.text),r=yt(t.anchorTaskId,`candidates[${e}].anchorTaskId`),o=yt(t.coversFromTaskId,`candidates[${e}].coversFromTaskId`),s=yt(t.coversToTaskId,`candidates[${e}].coversToTaskId`),i=t.contentFingerprint?.trim()||ga("thl",JSON.stringify({kind:t.kind,text:n,anchorTaskId:r,coversFromTaskId:o,coversToTaskId:s}));return M(i,`candidates[${e}].contentFingerprint`),{kind:t.kind,text:n,anchorTaskId:r,coversFromTaskId:o,coversToTaskId:s,contentFingerprint:i}}function d_(t){Array.isArray(t)||Y("candidates must be an array"),t.length>Yc&&Y(`candidates must contain at most ${Yc} items`);let e=new Map;for(let[n,r]of t.entries()){let o=a_(r,n);e.set(o.contentFingerprint,o);}return [...e.values()]}function lr(t){let e=fo(t.metadata);return {threadId:t.id,workspaceId:t.workspace_id,title:t.title,priority:e.priority??null,state:e.state??null,metadata:t.metadata,titleLocked:t.title_locked===1,updatedAt:t.updated_at}}function c_(t){try{let e=JSON.stringify(t);return (!e||e==="null"||e.startsWith("["))&&Y("event payload must be a JSON object"),e}catch(e){throw new exports.RepositoryError("VALIDATION","event payload must be JSON serializable",e)}}function dr(t,e){return t.select({maxSeq:drizzleOrm.sql`COALESCE(MAX(${K.seq}), 0)`}).from(K).where(drizzleOrm.eq(K.thread_id,e)).get()?.maxSeq??0}function cr(t,e){return !!t.select({id:K.id}).from(K).where(drizzleOrm.eq(K.thread_id,e)).limit(1).get()}function Yt(t,e){Qh.has(e.type)||Y(`invalid thread event type: ${String(e.type)}`);let n=He("the");t.insert(K).values({id:n,thread_id:e.threadId,seq:e.seq,type:e.type,actor_type:e.actorType,actor_id:e.actorId,task_id:e.taskId??null,highlight_id:e.highlightId??null,payload_json:c_(e.payload),created_at:e.createdAt}).run();let r=t.select().from(K).where(drizzleOrm.eq(K.id,n)).get();if(!r)throw new exports.RepositoryError("DB_ERROR","Thread event insert did not return a row");return r}function ur(t,e,n,r,o){let s=lr(e);Yt(t,{threadId:e.id,seq:o,type:"thread.snapshot.imported",actorType:n.actorType,actorId:n.actorId,createdAt:r,payload:{title:s.title,priority:s.priority,state:s.state}});}function _o(t){return {highlightId:t.id,source:t.source,kind:t.kind,status:t.status,coversFromTaskId:t.covers_from_task_id,coversToTaskId:t.covers_to_task_id,revision:t.revision,...t.dismissed_at===null?{}:{dismissedAt:t.dismissed_at}}}function ho(t,e,n,r,o,s,i){let d=o==="thread.highlight.created"?_o(e):{before:i?_o({...e,...i,id:e.id}):void 0,after:_o(e)};return Yt(t,{threadId:e.thread_id,seq:s,type:o,actorType:n.actorType,actorId:n.actorId,createdAt:r,taskId:e.source==="manual"?e.covers_from_task_id:e.source_task_id??e.covers_from_task_id,highlightId:e.id,payload:d})}function u_(t,e,n,r,o,s){return Yt(t,{threadId:e.thread_id,seq:o,type:"thread.highlight.deleted",actorType:n.actorType,actorId:n.actorId,createdAt:r,taskId:e.source_task_id??e.covers_from_task_id,highlightId:e.id,payload:{before:_o(e),...s??{}}})}var ti=class extends exports.BaseSqliteRepository{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=Se.join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath??super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(!e&&!Sa.existsSync(n))throw new exports.RepositoryError("NOT_FOUND","Database not found");if(e){let o=Se.dirname(n);Sa.existsSync(o)||Sa.mkdirSync(o,{recursive:true});}let r=C(n);if(e)try{V(r.db,n);}catch(o){throw r.close(),o}return r}findThread(e,n,r){let o=drizzleOrm.eq(w.id,n),s=r===void 0?o:r===null?drizzleOrm.and(o,drizzleOrm.isNull(w.workspace_id)):drizzleOrm.and(o,drizzleOrm.eq(w.workspace_id,r));return e.select().from(w).where(s).limit(1).get()}findRegenerationRun(e,n,r){let o=e.select().from(B).where(drizzleOrm.eq(B.id,n)).limit(1).get();if(o&&!(r!==void 0&&!this.findThread(e,o.thread_id,r)))return o}resolveWorkspaceId(e){if(M(e,"threadId"),!Sa.existsSync(this.resolveDbPath()))return null;let n=this.openHandle(false);try{return n.db.select({workspaceId:w.workspace_id}).from(w).where(drizzleOrm.eq(w.id,e)).limit(1).get()?.workspaceId??null}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to resolve thread workspace",r)}finally{n.close();}}getSnapshot(e,n){if(M(e,"threadId"),!Sa.existsSync(this.resolveDbPath()))return null;let r=this.openHandle(false);try{let o=this.findThread(r.db,e,n);return o?lr(o):null}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to read thread snapshot",o)}finally{r.close();}}updateSnapshot(e){r_(e);let n=ar(e),r=new Date().toISOString(),o=this.openHandle(true);try{return o.db.transaction(s=>{let i=this.findThread(s,e.threadId,e.workspaceId);i||ot(`Thread ${e.threadId} not found`);let d=lr(i),c=e.title!==void 0,u=c&&e.title!==d.title,f=c&&i.title_locked!==1,p=e.priority!==void 0&&e.priority!==d.priority,g=e.state!==void 0&&e.state!==d.state,_=u||p||g;if(!_&&!f)return d;let m=i.metadata;(p||g)&&(m=Qs(i.metadata,{priority:e.priority,state:e.state}));let k={};if(_&&(k.metadata=m,k.updated_at=r),u&&(k.title=e.title),c&&(k.title_locked=1),s.update(w).set(k).where(e.workspaceId===void 0?drizzleOrm.eq(w.id,e.threadId):e.workspaceId===null?drizzleOrm.and(drizzleOrm.eq(w.id,e.threadId),drizzleOrm.isNull(w.workspace_id)):drizzleOrm.and(drizzleOrm.eq(w.id,e.threadId),drizzleOrm.eq(w.workspace_id,e.workspaceId))).run(),!_){let b={...i,title_locked:1};return lr(b)}let T=dr(s,i.id)+1;cr(s,i.id)||(ur(s,i,n,r,T),T+=1),u&&(Yt(s,{threadId:i.id,seq:T,type:"thread.title.changed",actorType:n.actorType,actorId:n.actorId,createdAt:r,taskId:e.taskId,payload:{before:d.title,after:e.title}}),T+=1),p&&(Yt(s,{threadId:i.id,seq:T,type:"thread.priority.changed",actorType:n.actorType,actorId:n.actorId,createdAt:r,taskId:e.taskId,payload:{before:d.priority,after:e.priority}}),T+=1),g&&Yt(s,{threadId:i.id,seq:T,type:"thread.state.changed",actorType:n.actorType,actorId:n.actorId,createdAt:r,taskId:e.taskId,payload:{before:d.state,after:e.state}});let E={...i,title:u?e.title:i.title,metadata:m,title_locked:c?1:i.title_locked,updated_at:r};return lr(E)},{behavior:"immediate"})}catch(s){throw s instanceof exports.RepositoryError?s:new exports.RepositoryError("DB_ERROR","Failed to update thread snapshot",s)}finally{o.close();}}mutateSnapshot(e){return this.updateSnapshot(e)}updateThreadSnapshot(e){return this.updateSnapshot(e)}getLatestSeq(e,n){if(M(e,"threadId"),!Sa.existsSync(this.resolveDbPath()))return null;let r=this.openHandle(false);try{return this.findThread(r.db,e,n)?r.db.select({maxSeq:drizzleOrm.sql`COALESCE(MAX(${K.seq}), 0)`}).from(K).where(drizzleOrm.eq(K.thread_id,e)).get()?.maxSeq??0:null}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to read latest thread event sequence",o)}finally{r.close();}}listCompletedThreadHighlightTurns(e,n){if(M(e,"threadId"),M(n,"workspaceId"),!Sa.existsSync(this.resolveDbPath()))return null;let r=this.openHandle(false);try{return this.findThread(r.db,e,n)?r.db.select({taskId:exports.tasks.id,prompt:exports.tasks.prompt,result:exports.tasks.result,status:exports.tasks.status,startedAt:exports.tasks.started_at,completedAt:exports.tasks.completed_at}).from(exports.tasks).where(drizzleOrm.and(drizzleOrm.eq(exports.tasks.thread_id,e),drizzleOrm.eq(exports.tasks.workspace_id,n),drizzleOrm.inArray(exports.tasks.status,[...exports.TASK_TERMINAL_STATUSES,"completed","done","error"]),drizzleOrm.or(drizzleOrm.isNull(exports.tasks.parent_task_id),drizzleOrm.eq(exports.tasks.parent_task_id,"")),drizzleOrm.sql`${exports.tasks.result} IS NOT NULL AND length(trim(${exports.tasks.result})) > 0`)).orderBy(drizzleOrm.asc(exports.tasks.started_at),drizzleOrm.asc(exports.tasks.id)).all().map(i=>({taskId:i.taskId,prompt:i.prompt,result:i.result,status:i.status,startedAt:i.startedAt,completedAt:i.completedAt})):null}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to read completed thread highlight turns",o)}finally{r.close();}}createHighlightRegenerationRun(e){M(e.threadId,"threadId"),M(e.workspaceId,"workspaceId"),M(e.requestId,"requestId"),M(e.detectorVersion,"detectorVersion"),e.runId!==void 0&&M(e.runId,"runId");let n=new Date().toISOString(),r=this.openHandle(true);try{return r.db.transaction(o=>{let s=this.findThread(o,e.threadId,e.workspaceId);s||ot(`Thread ${e.threadId} not found`);let i=o.select().from(B).where(drizzleOrm.and(drizzleOrm.eq(B.thread_id,s.id),drizzleOrm.eq(B.request_id,e.requestId))).orderBy(drizzleOrm.desc(B.requested_at),drizzleOrm.desc(B.id)).limit(1).get();if(i)return {run:i,created:!1};let d=o.select().from(B).where(drizzleOrm.and(drizzleOrm.eq(B.thread_id,s.id),drizzleOrm.inArray(B.status,go))).orderBy(drizzleOrm.asc(B.requested_at),drizzleOrm.asc(B.id)).limit(1).get();if(d)throw new ko(d);let c=e.runId??He("thr");o.insert(B).values({id:c,thread_id:s.id,request_id:e.requestId,status:"queued",detector_version:e.detectorVersion,requested_at:n,started_at:null,completed_at:null,error_code:null,previous_auto_count:null,new_auto_count:null}).run();let u=o.select().from(B).where(drizzleOrm.eq(B.id,c)).get();if(!u)throw new exports.RepositoryError("DB_ERROR","Highlight regeneration run insert did not return a row");return {run:u,created:!0}},{behavior:"immediate"})}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to create highlight regeneration run",o)}finally{r.close();}}beginHighlightRegenerationRun(e){return this.createHighlightRegenerationRun(e)}queueHighlightRegenerationRun(e){return this.createHighlightRegenerationRun(e)}getHighlightRegenerationRun(e,n){if(M(e,"runId"),n!==void 0&&M(n,"workspaceId"),!Sa.existsSync(this.resolveDbPath()))return null;let r=this.openHandle(false);try{return this.findRegenerationRun(r.db,e,n)??null}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to read highlight regeneration run",o)}finally{r.close();}}getHighlightRegenerationRunByRequest(e,n,r){if(M(e,"threadId"),M(n,"workspaceId"),M(r,"requestId"),!Sa.existsSync(this.resolveDbPath()))return null;let o=this.openHandle(false);try{return this.findThread(o.db,e,n)?o.db.select().from(B).where(drizzleOrm.and(drizzleOrm.eq(B.thread_id,e),drizzleOrm.eq(B.request_id,r))).orderBy(drizzleOrm.desc(B.requested_at),drizzleOrm.desc(B.id)).limit(1).get()??null:null}catch(s){throw s instanceof exports.RepositoryError?s:new exports.RepositoryError("DB_ERROR","Failed to read highlight regeneration request",s)}finally{o.close();}}findHighlightRegenerationRun(e,n,r){return this.getHighlightRegenerationRunByRequest(e,n,r)}startHighlightRegenerationRun(e,n){M(e,"runId"),n!==void 0&&M(n,"workspaceId");let r=new Date().toISOString(),o=this.openHandle(true);try{return o.db.transaction(s=>{let i=this.findRegenerationRun(s,e,n);if(i||ot(`Highlight regeneration run ${e} not found`),ei(i.status)||Y(`invalid highlight regeneration status: ${i.status}`),i.status!=="queued")return i;s.update(B).set({status:"running",started_at:r}).where(drizzleOrm.and(drizzleOrm.eq(B.id,i.id),drizzleOrm.eq(B.status,"queued"))).run();let d=s.select().from(B).where(drizzleOrm.eq(B.id,i.id)).get();if(!d)throw new exports.RepositoryError("DB_ERROR","Highlight regeneration run start did not return a row");return d},{behavior:"immediate"})}catch(s){throw s instanceof exports.RepositoryError?s:new exports.RepositoryError("DB_ERROR","Failed to start highlight regeneration run",s)}finally{o.close();}}startHighlightRegeneration(e,n){return this.startHighlightRegenerationRun(e,n)}failHighlightRegenerationRun(e){M(e.runId,"runId"),M(e.errorCode,"errorCode"),e.workspaceId!==void 0&&M(e.workspaceId,"workspaceId");let n=new Date().toISOString(),r=this.openHandle(true);try{return r.db.transaction(o=>{let s=this.findRegenerationRun(o,e.runId,e.workspaceId);if(s||ot(`Highlight regeneration run ${e.runId} not found`),ei(s.status)||Y(`invalid highlight regeneration status: ${s.status}`),s.status==="completed"||s.status==="failed")return s;o.update(B).set({status:"failed",completed_at:n,error_code:e.errorCode}).where(drizzleOrm.and(drizzleOrm.eq(B.id,s.id),drizzleOrm.inArray(B.status,go))).run();let i=o.select().from(B).where(drizzleOrm.eq(B.id,s.id)).get();if(!i)throw new exports.RepositoryError("DB_ERROR","Highlight regeneration run failure did not return a row");return i},{behavior:"immediate"})}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to fail highlight regeneration run",o)}finally{r.close();}}failHighlightRegeneration(e){return this.failHighlightRegenerationRun(e)}recoverInterruptedHighlightRegenerationRuns(e=Qc){M(e,"errorCode");let n=new Date().toISOString(),r=this.openHandle(true);try{return r.db.transaction(o=>o.update(B).set({status:"failed",completed_at:n,error_code:e}).where(drizzleOrm.inArray(B.status,go)).run().changes,{behavior:"immediate"})}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to recover interrupted highlight runs",o)}finally{r.close();}}completeHighlightRegenerationRun(e){M(e.runId,"runId"),M(e.threadId,"threadId"),M(e.workspaceId,"workspaceId"),M(e.detectorVersion,"detectorVersion");let n=d_(e.candidates),r=ar(e),o=this.openHandle(true),s=false;try{return o.db.transaction(i=>{let d=this.findRegenerationRun(i,e.runId,e.workspaceId);if((!d||d.thread_id!==e.threadId)&&ot(`Highlight regeneration run ${e.runId} not found`),ei(d.status)||Y(`invalid highlight regeneration status: ${d.status}`),d.status==="failed")throw new exports.RepositoryError("CONFLICT","Highlight regeneration run has already failed");if(d.status==="completed")return {run:d,deletedCount:0,createdCount:0,previousAutoCount:d.previous_auto_count??0,newAutoCount:d.new_auto_count??0};s=!0;let c=this.findThread(i,e.threadId,e.workspaceId);c||ot(`Thread ${e.threadId} not found`),d.detector_version!==e.detectorVersion&&Y("detectorVersion does not match the regeneration run");let u=i.select().from(H).where(drizzleOrm.eq(H.thread_id,c.id)).orderBy(drizzleOrm.asc(H.created_at),drizzleOrm.asc(H.id)).all(),f=new Set(n.map(P=>P.contentFingerprint)),p=u.filter(P=>P.source==="auto"&&P.status==="active"&&P.revision===0&&!f.has(P.content_fingerprint??"")),g=u.filter(P=>P.source==="auto"&&P.status==="active").length,_=new Set(u.filter(P=>!p.includes(P)&&P.content_fingerprint).map(P=>P.content_fingerprint)),m=n.filter(P=>!_.has(P.contentFingerprint)),k=new Date().toISOString(),T=dr(i,c.id)+1;cr(i,c.id)||(ur(i,c,r,k,T),T+=1);for(let P of p)i.delete(H).where(drizzleOrm.eq(H.id,P.id)).run(),u_(i,P,r,k,T,{runId:e.runId,reason:Xc}),T+=1;let E=0,b=e.agentId??(r.actorType==="agent"?r.actorId:null);for(let P of m){let oe=He("thl");i.insert(H).values({id:oe,thread_id:c.id,source:"auto",kind:P.kind,status:"active",text:P.text,covers_from_task_id:P.coversFromTaskId,covers_to_task_id:P.coversToTaskId,revision:0,created_at:k,updated_at:k,agent_id:b,source_task_id:P.anchorTaskId,detector_version:e.detectorVersion,content_fingerprint:P.contentFingerprint,dismissed_at:null}).run();let Pe=i.select().from(H).where(drizzleOrm.eq(H.id,oe)).get();if(!Pe)throw new exports.RepositoryError("DB_ERROR","Regenerated highlight insert did not return a row");ho(i,Pe,r,k,"thread.highlight.created",T),T+=1,E+=1;}let y=i.select().from(H).where(drizzleOrm.eq(H.thread_id,c.id)).all().filter(P=>P.source==="auto"&&P.status==="active").length;Yt(i,{threadId:c.id,seq:T,type:"thread.highlights.regenerated",actorType:r.actorType,actorId:r.actorId,createdAt:k,payload:{runId:d.id,detectorVersion:e.detectorVersion,previousAutoCount:g,newAutoCount:y,deletedCount:p.length,createdCount:E}}),i.update(B).set({status:"completed",started_at:d.started_at??k,completed_at:k,error_code:null,previous_auto_count:g,new_auto_count:y}).where(drizzleOrm.and(drizzleOrm.eq(B.id,d.id),drizzleOrm.inArray(B.status,go))).run();let N=i.select().from(B).where(drizzleOrm.eq(B.id,d.id)).get();if(!N)throw new exports.RepositoryError("DB_ERROR","Highlight regeneration completion did not return a row");return {run:N,deletedCount:p.length,createdCount:E,previousAutoCount:g,newAutoCount:y}},{behavior:"immediate"})}catch(i){if(s)try{this.failHighlightRegenerationRun({runId:e.runId,workspaceId:e.workspaceId,errorCode:Zc});}catch{}throw i instanceof exports.RepositoryError?i:new exports.RepositoryError("DB_ERROR","Failed to complete highlight regeneration",i)}finally{o.close();}}completeHighlightRegeneration(e){return this.completeHighlightRegenerationRun(e)}replaceAutoHighlightsAtomically(e){return this.completeHighlightRegenerationRun(e)}listTimeline(e,n,r={}){let o=typeof e=="string"?{...r,threadId:e,workspaceId:n}:e;M(o.threadId,"threadId"),M(o.workspaceId,"workspaceId");let s=o_(o);if(!Sa.existsSync(this.resolveDbPath()))return null;let i=this.openHandle(false);try{if(!this.findThread(i.db,o.threadId,o.workspaceId))return null;let d=i.db.select({maxSeq:drizzleOrm.sql`COALESCE(MAX(${K.seq}), 0)`}).from(K).where(drizzleOrm.eq(K.thread_id,o.threadId)).get()?.maxSeq??0,c;o.beforeSeq!==void 0?c=i.db.select().from(K).where(drizzleOrm.and(drizzleOrm.eq(K.thread_id,o.threadId),drizzleOrm.lt(K.seq,o.beforeSeq))).orderBy(drizzleOrm.desc(K.seq)).limit(s+1).all().reverse():o.afterSeq!==void 0?c=i.db.select().from(K).where(drizzleOrm.and(drizzleOrm.eq(K.thread_id,o.threadId),drizzleOrm.sql`${K.seq} > ${o.afterSeq}`)).orderBy(drizzleOrm.asc(K.seq)).limit(s+1).all():c=i.db.select().from(K).where(drizzleOrm.eq(K.thread_id,o.threadId)).orderBy(drizzleOrm.desc(K.seq)).limit(s+1).all().reverse();let u=c.length>s,f=o.afterSeq!==void 0?c.slice(0,s):u?c.slice(1):c,p=!1,g=f[0];return g&&(p=!!i.db.select({id:K.id}).from(K).where(drizzleOrm.and(drizzleOrm.eq(K.thread_id,o.threadId),drizzleOrm.lt(K.seq,g.seq))).limit(1).get()),{items:f,latestSeq:d,hasMoreOlder:p}}catch(d){throw d instanceof exports.RepositoryError?d:new exports.RepositoryError("DB_ERROR","Failed to list thread timeline",d)}finally{i.close();}}listEvents(e,n,r){return this.listTimeline(e,n,r)}getTimeline(e,n,r){return this.listTimeline(e,n,r)}createHighlight(e){let n=i_(e),r=ar(e),o=new Date().toISOString(),s=this.openHandle(true);try{return s.db.transaction(i=>{let d=this.findThread(i,e.threadId,e.workspaceId);if(d||ot(`Thread ${e.threadId} not found`),n.source==="auto"){let g=i.select().from(H).where(drizzleOrm.and(drizzleOrm.eq(H.thread_id,e.threadId),drizzleOrm.eq(H.source_task_id,n.sourceTaskId),drizzleOrm.eq(H.detector_version,n.detectorVersion),drizzleOrm.eq(H.content_fingerprint,n.contentFingerprint))).orderBy(drizzleOrm.asc(H.created_at),drizzleOrm.asc(H.id)).limit(1).get();if(g)return g}let c=e.id??He("thl"),u={id:c,thread_id:e.threadId,source:n.source,kind:n.kind,status:"active",text:n.text,covers_from_task_id:n.coversFromTaskId,covers_to_task_id:n.coversToTaskId,revision:0,created_at:o,updated_at:o,agent_id:n.agentId,source_task_id:n.sourceTaskId,detector_version:n.detectorVersion,content_fingerprint:n.contentFingerprint,dismissed_at:null};i.insert(H).values(u).run();let f=i.select().from(H).where(drizzleOrm.eq(H.id,c)).get();if(!f)throw new exports.RepositoryError("DB_ERROR","Highlight insert did not return a row");let p=dr(i,d.id)+1;return cr(i,d.id)||(ur(i,d,r,o,p),p+=1),ho(i,f,r,o,"thread.highlight.created",p),f},{behavior:"immediate"})}catch(i){throw i instanceof exports.RepositoryError?i:new exports.RepositoryError("DB_ERROR","Failed to create thread highlight",i)}finally{s.close();}}updateHighlight(e){M(e.threadId,"threadId"),M(e.workspaceId,"workspaceId"),M(e.highlightId,"highlightId"),(!Number.isInteger(e.expectedRevision)||e.expectedRevision<0)&&Y("expectedRevision must be a non-negative integer"),e.text===void 0&&e.kind===void 0&&e.coversFromTaskId===void 0&&e.coversToTaskId===void 0&&Y("highlight update requires at least one field"),e.kind!==void 0&&ri(e.kind);let n=e.text===void 0?void 0:ni(e.text),r=ar(e),o=new Date().toISOString(),s=this.openHandle(true);try{return s.db.transaction(i=>{let d=this.findThread(i,e.threadId,e.workspaceId);d||ot(`Thread ${e.threadId} not found`);let c=i.select().from(H).where(drizzleOrm.and(drizzleOrm.eq(H.id,e.highlightId),drizzleOrm.eq(H.thread_id,d.id))).limit(1).get();if(c||ot(`Highlight ${e.highlightId} not found`),c.revision!==e.expectedRevision)throw new vn(d.id,c.id,e.expectedRevision,c.revision);if(c.status!=="active")throw new vn(d.id,c.id,e.expectedRevision,c.revision);let u=e.kind??c.kind,f=n??c.text,p=e.coversFromTaskId??c.covers_from_task_id,g=e.coversToTaskId??c.covers_to_task_id;(!f||p.length===0||g.length===0)&&Y("highlight projection is incomplete");let _=u!==c.kind||f!==c.text||p!==c.covers_from_task_id||g!==c.covers_to_task_id,m=r.actorType==="user"&&c.source==="auto"&&_?"manual":c.source;if(!(_||m!==c.source))return c;let T=c.revision+1;i.update(H).set({source:m,kind:u,text:f,covers_from_task_id:p,covers_to_task_id:g,revision:T,updated_at:o}).where(drizzleOrm.and(drizzleOrm.eq(H.id,c.id),drizzleOrm.eq(H.revision,c.revision))).run();let E=i.select().from(H).where(drizzleOrm.eq(H.id,c.id)).get();if(!E)throw new exports.RepositoryError("DB_ERROR","Highlight update did not return a row");let b=dr(i,d.id)+1;return cr(i,d.id)||(ur(i,d,r,o,b),b+=1),ho(i,E,r,o,"thread.highlight.updated",b,c),E},{behavior:"immediate"})}catch(i){throw i instanceof exports.RepositoryError?i:new exports.RepositoryError("DB_ERROR","Failed to update thread highlight",i)}finally{s.close();}}dismissHighlight(e){M(e.threadId,"threadId"),M(e.workspaceId,"workspaceId"),M(e.highlightId,"highlightId"),(!Number.isInteger(e.expectedRevision)||e.expectedRevision<0)&&Y("expectedRevision must be a non-negative integer");let n=ar(e),r=new Date().toISOString(),o=this.openHandle(true);try{return o.db.transaction(s=>{let i=this.findThread(s,e.threadId,e.workspaceId);i||ot(`Thread ${e.threadId} not found`);let d=s.select().from(H).where(drizzleOrm.and(drizzleOrm.eq(H.id,e.highlightId),drizzleOrm.eq(H.thread_id,i.id))).limit(1).get();if(d||ot(`Highlight ${e.highlightId} not found`),d.revision!==e.expectedRevision)throw new vn(i.id,d.id,e.expectedRevision,d.revision);if(d.status==="dismissed")return d;let c=d.revision+1;s.update(H).set({status:"dismissed",text:null,revision:c,updated_at:r,dismissed_at:r}).where(drizzleOrm.and(drizzleOrm.eq(H.id,d.id),drizzleOrm.eq(H.revision,d.revision))).run();let u=s.select().from(H).where(drizzleOrm.eq(H.id,d.id)).get();if(!u)throw new exports.RepositoryError("DB_ERROR","Highlight dismissal did not return a row");let f=dr(s,i.id)+1;return cr(s,i.id)||(ur(s,i,n,r,f),f+=1),ho(s,u,n,r,"thread.highlight.deleted",f,d),u},{behavior:"immediate"})}catch(s){throw s instanceof exports.RepositoryError?s:new exports.RepositoryError("DB_ERROR","Failed to dismiss thread highlight",s)}finally{o.close();}}listActiveHighlights(e,n,r={}){if(M(e,"threadId"),M(n,"workspaceId"),r.taskId!==void 0&&M(r.taskId,"taskId"),r.coversFromTaskId!==void 0&&M(r.coversFromTaskId,"coversFromTaskId"),r.coversToTaskId!==void 0&&M(r.coversToTaskId,"coversToTaskId"),!Sa.existsSync(this.resolveDbPath()))return null;let o=this.openHandle(false);try{if(!this.findThread(o.db,e,n))return null;let i=o.db.select().from(H).where(drizzleOrm.and(drizzleOrm.eq(H.thread_id,e),drizzleOrm.eq(H.status,"active"))).orderBy(drizzleOrm.asc(H.created_at),drizzleOrm.asc(H.id)).all();if(r.taskId===void 0&&r.coversFromTaskId===void 0&&r.coversToTaskId===void 0)return i;let d=o.db.all(drizzleOrm.sql`
|
|
506
|
+
`),u},{behavior:"immediate"})}}catch(s){throw s instanceof exports.RepositoryError?s:new exports.RepositoryError("DB_ERROR","Failed to save user message",s)}finally{o.close();}}saveAssistantMessage(e,n,r){if(!this.dbExists())return;let o=this.openHandle(true);try{let s=new Date().toISOString();o.db.update(w).set({last_message:n,updated_at:s}).where(drizzleOrm.eq(w.id,e)).run();}catch(s){throw s instanceof exports.RepositoryError?s:new exports.RepositoryError("DB_ERROR","Failed to save assistant message",s)}finally{o.close();}}updateThread(e,n){if(!this.dbExists())return;let r=this.openHandle(true);try{let o={updated_at:new Date().toISOString()};n.title!==void 0&&(o.title=n.title,o.title_locked=1),n.titleLocked!==void 0&&(o.title_locked=n.titleLocked?1:0),r.db.update(w).set(o).where(drizzleOrm.eq(w.id,e)).run();}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to update thread",o)}finally{r.close();}}patchThreadTitleMetadata(e,n,r){let o=n;if(!o||typeof o!="object"||Array.isArray(o))return new Qt("THREAD_TITLE_PATCH_INVALID","Thread-title metadata patch must be an object");if(Object.keys(o).some(c=>c!=="priority"&&c!=="state"))return new Qt("THREAD_TITLE_PATCH_INVALID","Thread-title metadata patch only supports priority and state");let i=o;if(i.priority===void 0&&i.state===void 0)return new Qt("THREAD_TITLE_PATCH_EMPTY","Thread-title metadata patch must change priority or state");for(let c of [i.priority,i.state])if(c!=null&&(typeof c!="string"||c.length===0))return new Qt("THREAD_TITLE_PATCH_INVALID","Thread-title metadata values must be non-empty strings or null");let d=this.openHandle(true);try{let c=r?drizzleOrm.and(drizzleOrm.eq(w.id,e),drizzleOrm.eq(w.workspace_id,r)):drizzleOrm.eq(w.id,e);return d.db.transaction(u=>{let f=u.select({metadata:w.metadata}).from(w).where(c).get();if(!f)return null;let p=ir(f.metadata),g=p.threadTitle,_=g&&typeof g=="object"&&!Array.isArray(g)?{...g}:{};i.priority===null?delete _.priority:i.priority!==void 0&&(_.priority=i.priority),i.state===null?delete _.state:i.state!==void 0&&(_.state=i.state),Object.keys(_).length>0?p.threadTitle=_:delete p.threadTitle;let m=Object.keys(p).length>0?JSON.stringify(p):null,k=new Date().toISOString();u.update(w).set({metadata:m,updated_at:k}).where(c).run();let T=u.select({metadata:w.metadata}).from(w).where(c).get();if(!T)throw new exports.RepositoryError("DB_ERROR","Thread-title metadata update could not be read back");let E=jh(T.metadata);return {threadId:e,priority:E.priority,state:E.state}},{behavior:"immediate"})}catch(c){throw c instanceof exports.RepositoryError?c:new exports.RepositoryError("DB_ERROR","Failed to patch thread-title metadata",c)}finally{d.close();}}togglePin(e,n){let r=this.openHandle(true);try{let o=n?drizzleOrm.and(drizzleOrm.eq(w.id,e),drizzleOrm.eq(w.workspace_id,n)):drizzleOrm.eq(w.id,e);return r.db.transaction(s=>{let i=s.select({pinned:w.pinned,metadata:w.metadata}).from(w).where(o).get();if(!i)return null;let d=i.pinned?0:1,c=ir(i.metadata);if(d){let u=n?drizzleOrm.and(drizzleOrm.eq(w.pinned,1),drizzleOrm.eq(w.workspace_id,n)):drizzleOrm.eq(w.pinned,1),f=s.select({metadata:w.metadata}).from(w).where(u).all(),p=null;for(let g of f){let _=ir(g.metadata);typeof _.pinOrder=="number"&&(p===null||_.pinOrder<p)&&(p=_.pinOrder);}c.pinOrder=p===null?0:p-1;}else delete c.pinOrder;return s.update(w).set({pinned:d,metadata:Object.keys(c).length>0?JSON.stringify(c):null}).where(o).run(),{pinned:!!d}},{behavior:"immediate"})}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to toggle pin",o)}finally{r.close();}}reorderPins(e,n){let r=this.openHandle(true);try{r.db.transaction(o=>{for(let s=0;s<e.length;s++){let i=n?drizzleOrm.and(drizzleOrm.eq(w.id,e[s]),drizzleOrm.eq(w.workspace_id,n)):drizzleOrm.eq(w.id,e[s]),d=o.select({metadata:w.metadata}).from(w).where(i).get();if(!d)continue;let c=ir(d.metadata);c.pinOrder=s+1,o.update(w).set({metadata:JSON.stringify(c)}).where(i).run();}},{behavior:"immediate"});}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to reorder pins",o)}finally{r.close();}}toggleStar(e,n){let r=this.openHandle(true);try{let o=n?drizzleOrm.and(drizzleOrm.eq(w.id,e),drizzleOrm.eq(w.workspace_id,n)):drizzleOrm.eq(w.id,e),s=r.db.select({starred:w.starred}).from(w).where(o).get();if(!s)return null;let i=s.starred?0:1;return r.db.update(w).set({starred:i}).where(o).run(),{starred:!!i}}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to toggle star",o)}finally{r.close();}}resolveOverdriveForRequest(e,n,r,o){let i=this.openHandle(true);try{let d=n?drizzleOrm.and(drizzleOrm.eq(w.id,e),drizzleOrm.eq(w.workspace_id,n)):drizzleOrm.eq(w.id,e);return i.db.transaction(u=>{let f=u.select({metadata:w.metadata}).from(w).where(d).get();if(!f)return null;let p=f.metadata?JSON.parse(f.metadata):{},g=p.overdrive??{},_=o?.defaultTurns??g.defaultTurns??3,m=o?.updatedBy??"ui",k=new Date().toISOString(),T,E,b,L;switch(r){case "enable-count":{let y=o?.turns??_,N=o?.consumeCurrent?Math.max(y-1,0):y;T=N>0?"count":"off",E=N,b=!0,L="count";break}case "enable-latch":{T="latch",E=0,b=!0,L="latch";break}case "disable":{T="off",E=0,b=!1;break}default:{let y=g.state??"off",N=typeof g.remaining=="number"?g.remaining:0;if(y==="count"&&N>0){let P=N-1;P<=0?(T="off",E=0):(T="count",E=P),b=!0,L="count";}else y==="latch"?(T="latch",E=0,b=!0,L="latch"):(T="off",E=0,b=!1);break}}return p.overdrive={state:T,remaining:E,defaultTurns:_,updatedAt:k,updatedBy:m},u.update(w).set({metadata:JSON.stringify(p),updated_at:k}).where(d).run(),{applied:b,appliedMode:L,state:T,remaining:E}},{behavior:"immediate"})}catch(d){throw d instanceof exports.RepositoryError?d:new exports.RepositoryError("DB_ERROR","Failed to resolve overdrive",d)}finally{i.close();}}};h();se();fe();ce();pe();ue();h();var Vc=["urgent","high","medium","low"],Jc=["investigating","in-progress","in-review","on-hold","done"],ar="custom:";var Wh=new Set(Vc),Gh=new Set(Jc),zh={urgent:"U \uAE34\uAE09 Urgent",high:"P0 \uAE09\uD568 High",medium:"P1 \uC911\uC694 Medium",low:"P2 \uBCF4\uD1B5 Low"},ei={investigating:"\uC870\uC0AC\uC911 Looking into","in-progress":"\uC9C4\uD589\uC911 In progress","in-review":"\uAC80\uD1A0\uC911 In review","on-hold":"\uBCF4\uB958 On hold",done:"\uC644\uB8CC Done"};function Kc(t,e){return !e||e.includes(t)?e??t:`${t} ${e}`}function dr(t){return typeof t=="string"&&Wh.has(t)}function cr(t){if(typeof t!="string")return false;if(Gh.has(t))return true;if(t.startsWith("c_"))return t.length>2;if(!t.startsWith(ar))return false;let e=t.slice(ar.length);return e.length>=1&&e.length<=20}function Yc(t){if(t.startsWith(ar))return t.slice(ar.length)}function ti(t){if(!t)return null;try{let e=JSON.parse(t);return !e||typeof e!="object"||Array.isArray(e)?null:e}catch{return null}}function Kh(t){let e=ti(t);return !!e&&Object.prototype.hasOwnProperty.call(e,"threadTitle")}function mo(t){let e=ti(t);if(!e)return {};let n=e.threadTitle;if(!n||typeof n!="object"||Array.isArray(n))return {};let r=n,o={};return dr(r.priority)&&(o.priority=r.priority),cr(r.state)&&(o.state=r.state),o}function ni(t,e){let n=ti(t)??{},r={...mo(t)};return e.priority===null?delete r.priority:e.priority!==void 0&&(r.priority=e.priority),e.state===null?delete r.state:e.state!==void 0&&(r.state=e.state),r.priority===void 0&&r.state===void 0?delete n.threadTitle:n.threadTitle=r,Object.keys(n).length===0?null:JSON.stringify(n)}function Vh(t,e=new Map){let n=[];return t.priority&&n.push(Kc(zh[t.priority],e.get(t.priority))),t.state&&(t.state.startsWith(ar)?n.push(Yc(t.state)??""):ei[t.state]?n.push(Kc(ei[t.state],e.get(t.state))):e.has(t.state)?n.push(t.state,e.get(t.state)??""):t.state.startsWith("c_")?n.push(t.state):n.push(ei[t.state]??"")),n.filter(Boolean).join(" ")}function Xc(t,e){if(!t||t.trim().length===0)return;let n=new Set,r=false,o=false;for(let s of t.split(",")){let i=s.trim();if(i){if(i==="none"){r=true,o=true;continue}e(i)&&(n.add(i),o=true);}}if(o)return {values:n,includeNone:r}}function Jh(t){return Xc(t,dr)}function Yh(t){return Xc(t,cr)}function Xh(t,e){return e?t?e.values.has(t):e.includeNone:true}Yn();var nu="regeneration_replaced",n_="THREAD_HIGHLIGHT_REGENERATION_NO_ELIGIBLE_TURNS",ru="THREAD_HIGHLIGHT_REGENERATION_INTERRUPTED",r_="THREAD_HIGHLIGHT_REGENERATION_DETECTION_FAILED",ou="THREAD_HIGHLIGHT_REGENERATION_COMMIT_FAILED",yo=class extends exports.RepositoryError{threadId;highlightId;expectedRevision;currentRevision;constructor(e,n,r,o){super("CONFLICT",`Highlight revision conflict: expected ${r}, current ${o}`),this.name="ThreadHistoryConflictError",this.threadId=e,this.highlightId=n,this.expectedRevision=r,this.currentRevision=o;}},xn=class extends yo{},Ro=class extends exports.RepositoryError{stableCode="THREAD_HIGHLIGHT_REGENERATION_IN_PROGRESS";run;constructor(e){super("CONFLICT","THREAD_HIGHLIGHT_REGENERATION_IN_PROGRESS"),this.name="ThreadHighlightRegenerationConflictError",this.run=e;}},o_=new Set(oa),s_=new Set(ra),i_=new Set(sa),a_=new Set(ia),d_=50,Zc=100,eu=280,tu=40,c_=new Set(aa),ko=["queued","running"];function oi(t){return c_.has(t)}function Y(t){throw new exports.RepositoryError("VALIDATION",t)}function it(t){throw new exports.RepositoryError("NOT_FOUND",t)}function M(t,e){(typeof t!="string"||t.trim().length===0)&&Y(`${e} is required`);}function lr(t={}){let e=t.actor??t,n=e.actorType??"system";return o_.has(n)||Y(`invalid actorType: ${String(n)}`),e.actorId!==void 0&&e.actorId!==null&&typeof e.actorId!="string"&&Y("actorId must be a string or null"),{actorType:n,actorId:e.actorId??null}}function u_(t){M(t.threadId,"threadId"),t.workspaceId!==void 0&&t.workspaceId!==null&&M(t.workspaceId,"workspaceId"),t.title!==void 0&&t.title!==null&&((typeof t.title!="string"||t.title.trim().length===0)&&Y("title must not be empty"),t.title.length>120&&Y("title must be at most 120 characters")),t.priority!==void 0&&t.priority!==null&&!dr(t.priority)&&Y(`invalid priority: ${String(t.priority)}`),t.state!==void 0&&t.state!==null&&!cr(t.state)&&Y(`invalid state: ${String(t.state)}`);}function l_(t){t.beforeSeq!==void 0&&t.afterSeq!==void 0&&Y("beforeSeq and afterSeq cannot be used together");for(let[n,r]of [["beforeSeq",t.beforeSeq],["afterSeq",t.afterSeq]])r!==void 0&&(!Number.isInteger(r)||r<0)&&Y(`${n} must be a non-negative integer`);let e=t.limit??d_;return (!Number.isInteger(e)||e<1||e>Zc)&&Y(`limit must be between 1 and ${Zc}`),e}function ii(t){typeof t!="string"&&Y("text is required");let e=t.trim();return e.length===0&&Y("text must not be empty"),e.length>eu&&Y(`text must be at most ${eu} characters`),e}function Et(t,e){return M(t??"",e),t}function ai(t){a_.has(t)||Y(`invalid highlight kind: ${String(t)}`);}function p_(t){i_.has(t)||Y(`invalid highlight source: ${String(t)}`);}function f_(t){M(t.threadId,"threadId"),M(t.workspaceId,"workspaceId");let e=t.source??"manual";p_(e),ai(t.kind);let n=ii(t.text),r=t.coversFromTaskId??t.fromTaskId??t.taskId,o=t.coversToTaskId??t.toTaskId??t.taskId;if(e==="manual"){let f=t.taskId??(r&&o&&r===o?r:void 0),p=Et(f,"taskId");return (r!==p||o!==p)&&Y("manual highlights must cover exactly one task"),{source:e,kind:t.kind,text:n,coversFromTaskId:p,coversToTaskId:p,agentId:t.agentId??null,sourceTaskId:null,detectorVersion:null,contentFingerprint:null}}let s=Et(r,"coversFromTaskId"),i=Et(o,"coversToTaskId"),d=t.sourceTaskId??s,c=t.detectorVersion??(t.idempotencyKey!==void 0?"default":null),u=t.contentFingerprint??t.idempotencyKey??null;return Et(d??void 0,"sourceTaskId"),Et(c??void 0,"detectorVersion"),Et(u??void 0,"contentFingerprint"),{source:e,kind:t.kind,text:n,coversFromTaskId:s,coversToTaskId:i,agentId:t.agentId??null,sourceTaskId:d,detectorVersion:c,contentFingerprint:u}}function g_(t,e){(!t||typeof t!="object")&&Y(`candidates[${e}] is required`),ai(t.kind);let n=ii(t.text),r=Et(t.anchorTaskId,`candidates[${e}].anchorTaskId`),o=Et(t.coversFromTaskId,`candidates[${e}].coversFromTaskId`),s=Et(t.coversToTaskId,`candidates[${e}].coversToTaskId`),i=t.contentFingerprint?.trim()||Ta("thl",JSON.stringify({kind:t.kind,text:n,anchorTaskId:r,coversFromTaskId:o,coversToTaskId:s}));return M(i,`candidates[${e}].contentFingerprint`),{kind:t.kind,text:n,anchorTaskId:r,coversFromTaskId:o,coversToTaskId:s,contentFingerprint:i}}function h_(t){Array.isArray(t)||Y("candidates must be an array"),t.length>tu&&Y(`candidates must contain at most ${tu} items`);let e=new Map;for(let[n,r]of t.entries()){let o=g_(r,n);e.set(o.contentFingerprint,o);}return [...e.values()]}function hr(t){let e=mo(t.metadata);return {threadId:t.id,workspaceId:t.workspace_id,title:t.title,priority:e.priority??null,state:e.state??null,metadata:t.metadata,titleLocked:t.title_locked===1,updatedAt:t.updated_at}}function __(t){try{let e=JSON.stringify(t);return (!e||e==="null"||e.startsWith("["))&&Y("event payload must be a JSON object"),e}catch(e){throw new exports.RepositoryError("VALIDATION","event payload must be JSON serializable",e)}}function pr(t,e){return t.select({maxSeq:drizzleOrm.sql`COALESCE(MAX(${K.seq}), 0)`}).from(K).where(drizzleOrm.eq(K.thread_id,e)).get()?.maxSeq??0}function fr(t,e){return !!t.select({id:K.id}).from(K).where(drizzleOrm.eq(K.thread_id,e)).limit(1).get()}function Zt(t,e){s_.has(e.type)||Y(`invalid thread event type: ${String(e.type)}`);let n=$e("the");t.insert(K).values({id:n,thread_id:e.threadId,seq:e.seq,type:e.type,actor_type:e.actorType,actor_id:e.actorId,task_id:e.taskId??null,highlight_id:e.highlightId??null,payload_json:__(e.payload),created_at:e.createdAt}).run();let r=t.select().from(K).where(drizzleOrm.eq(K.id,n)).get();if(!r)throw new exports.RepositoryError("DB_ERROR","Thread event insert did not return a row");return r}function gr(t,e,n,r,o){let s=hr(e);Zt(t,{threadId:e.id,seq:o,type:"thread.snapshot.imported",actorType:n.actorType,actorId:n.actorId,createdAt:r,payload:{title:s.title,priority:s.priority,state:s.state}});}function wo(t){return {highlightId:t.id,source:t.source,kind:t.kind,status:t.status,coversFromTaskId:t.covers_from_task_id,coversToTaskId:t.covers_to_task_id,revision:t.revision,...t.dismissed_at===null?{}:{dismissedAt:t.dismissed_at}}}function To(t,e,n,r,o,s,i){let d=o==="thread.highlight.created"?wo(e):{before:i?wo({...e,...i,id:e.id}):void 0,after:wo(e)};return Zt(t,{threadId:e.thread_id,seq:s,type:o,actorType:n.actorType,actorId:n.actorId,createdAt:r,taskId:e.source==="manual"?e.covers_from_task_id:e.source_task_id??e.covers_from_task_id,highlightId:e.id,payload:d})}function m_(t,e,n,r,o,s){return Zt(t,{threadId:e.thread_id,seq:o,type:"thread.highlight.deleted",actorType:n.actorType,actorId:n.actorId,createdAt:r,taskId:e.source_task_id??e.covers_from_task_id,highlightId:e.id,payload:{before:wo(e),...s??{}}})}var si=class extends exports.BaseSqliteRepository{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=Se.join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath??super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(!e&&!Oa.existsSync(n))throw new exports.RepositoryError("NOT_FOUND","Database not found");if(e){let o=Se.dirname(n);Oa.existsSync(o)||Oa.mkdirSync(o,{recursive:true});}let r=C(n);if(e)try{V(r.db,n);}catch(o){throw r.close(),o}return r}findThread(e,n,r){let o=drizzleOrm.eq(w.id,n),s=r===void 0?o:r===null?drizzleOrm.and(o,drizzleOrm.isNull(w.workspace_id)):drizzleOrm.and(o,drizzleOrm.eq(w.workspace_id,r));return e.select().from(w).where(s).limit(1).get()}findRegenerationRun(e,n,r){let o=e.select().from(B).where(drizzleOrm.eq(B.id,n)).limit(1).get();if(o&&!(r!==void 0&&!this.findThread(e,o.thread_id,r)))return o}resolveWorkspaceId(e){if(M(e,"threadId"),!Oa.existsSync(this.resolveDbPath()))return null;let n=this.openHandle(false);try{return n.db.select({workspaceId:w.workspace_id}).from(w).where(drizzleOrm.eq(w.id,e)).limit(1).get()?.workspaceId??null}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to resolve thread workspace",r)}finally{n.close();}}getSnapshot(e,n){if(M(e,"threadId"),!Oa.existsSync(this.resolveDbPath()))return null;let r=this.openHandle(false);try{let o=this.findThread(r.db,e,n);return o?hr(o):null}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to read thread snapshot",o)}finally{r.close();}}updateSnapshot(e){u_(e);let n=lr(e),r=new Date().toISOString(),o=this.openHandle(true);try{return o.db.transaction(s=>{let i=this.findThread(s,e.threadId,e.workspaceId);i||it(`Thread ${e.threadId} not found`);let d=hr(i),c=e.title!==void 0,u=c&&e.title!==d.title,f=c&&i.title_locked!==1,p=e.priority!==void 0&&e.priority!==d.priority,g=e.state!==void 0&&e.state!==d.state,_=u||p||g;if(!_&&!f)return d;let m=i.metadata;(p||g)&&(m=ni(i.metadata,{priority:e.priority,state:e.state}));let k={};if(_&&(k.metadata=m,k.updated_at=r),u&&(k.title=e.title),c&&(k.title_locked=1),s.update(w).set(k).where(e.workspaceId===void 0?drizzleOrm.eq(w.id,e.threadId):e.workspaceId===null?drizzleOrm.and(drizzleOrm.eq(w.id,e.threadId),drizzleOrm.isNull(w.workspace_id)):drizzleOrm.and(drizzleOrm.eq(w.id,e.threadId),drizzleOrm.eq(w.workspace_id,e.workspaceId))).run(),!_){let b={...i,title_locked:1};return hr(b)}let T=pr(s,i.id)+1;fr(s,i.id)||(gr(s,i,n,r,T),T+=1),u&&(Zt(s,{threadId:i.id,seq:T,type:"thread.title.changed",actorType:n.actorType,actorId:n.actorId,createdAt:r,taskId:e.taskId,payload:{before:d.title,after:e.title}}),T+=1),p&&(Zt(s,{threadId:i.id,seq:T,type:"thread.priority.changed",actorType:n.actorType,actorId:n.actorId,createdAt:r,taskId:e.taskId,payload:{before:d.priority,after:e.priority}}),T+=1),g&&Zt(s,{threadId:i.id,seq:T,type:"thread.state.changed",actorType:n.actorType,actorId:n.actorId,createdAt:r,taskId:e.taskId,payload:{before:d.state,after:e.state}});let E={...i,title:u?e.title:i.title,metadata:m,title_locked:c?1:i.title_locked,updated_at:r};return hr(E)},{behavior:"immediate"})}catch(s){throw s instanceof exports.RepositoryError?s:new exports.RepositoryError("DB_ERROR","Failed to update thread snapshot",s)}finally{o.close();}}mutateSnapshot(e){return this.updateSnapshot(e)}updateThreadSnapshot(e){return this.updateSnapshot(e)}getLatestSeq(e,n){if(M(e,"threadId"),!Oa.existsSync(this.resolveDbPath()))return null;let r=this.openHandle(false);try{return this.findThread(r.db,e,n)?r.db.select({maxSeq:drizzleOrm.sql`COALESCE(MAX(${K.seq}), 0)`}).from(K).where(drizzleOrm.eq(K.thread_id,e)).get()?.maxSeq??0:null}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to read latest thread event sequence",o)}finally{r.close();}}listCompletedThreadHighlightTurns(e,n){if(M(e,"threadId"),M(n,"workspaceId"),!Oa.existsSync(this.resolveDbPath()))return null;let r=this.openHandle(false);try{return this.findThread(r.db,e,n)?r.db.select({taskId:exports.tasks.id,prompt:exports.tasks.prompt,result:exports.tasks.result,status:exports.tasks.status,startedAt:exports.tasks.started_at,completedAt:exports.tasks.completed_at}).from(exports.tasks).where(drizzleOrm.and(drizzleOrm.eq(exports.tasks.thread_id,e),drizzleOrm.eq(exports.tasks.workspace_id,n),drizzleOrm.inArray(exports.tasks.status,[...exports.TASK_TERMINAL_STATUSES,"completed","done","error"]),drizzleOrm.or(drizzleOrm.isNull(exports.tasks.parent_task_id),drizzleOrm.eq(exports.tasks.parent_task_id,"")),drizzleOrm.sql`${exports.tasks.result} IS NOT NULL AND length(trim(${exports.tasks.result})) > 0`)).orderBy(drizzleOrm.asc(exports.tasks.started_at),drizzleOrm.asc(exports.tasks.id)).all().map(i=>({taskId:i.taskId,prompt:i.prompt,result:i.result,status:i.status,startedAt:i.startedAt,completedAt:i.completedAt})):null}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to read completed thread highlight turns",o)}finally{r.close();}}createHighlightRegenerationRun(e){M(e.threadId,"threadId"),M(e.workspaceId,"workspaceId"),M(e.requestId,"requestId"),M(e.detectorVersion,"detectorVersion"),e.runId!==void 0&&M(e.runId,"runId");let n=new Date().toISOString(),r=this.openHandle(true);try{return r.db.transaction(o=>{let s=this.findThread(o,e.threadId,e.workspaceId);s||it(`Thread ${e.threadId} not found`);let i=o.select().from(B).where(drizzleOrm.and(drizzleOrm.eq(B.thread_id,s.id),drizzleOrm.eq(B.request_id,e.requestId))).orderBy(drizzleOrm.desc(B.requested_at),drizzleOrm.desc(B.id)).limit(1).get();if(i)return {run:i,created:!1};let d=o.select().from(B).where(drizzleOrm.and(drizzleOrm.eq(B.thread_id,s.id),drizzleOrm.inArray(B.status,ko))).orderBy(drizzleOrm.asc(B.requested_at),drizzleOrm.asc(B.id)).limit(1).get();if(d)throw new Ro(d);let c=e.runId??$e("thr");o.insert(B).values({id:c,thread_id:s.id,request_id:e.requestId,status:"queued",detector_version:e.detectorVersion,requested_at:n,started_at:null,completed_at:null,error_code:null,previous_auto_count:null,new_auto_count:null}).run();let u=o.select().from(B).where(drizzleOrm.eq(B.id,c)).get();if(!u)throw new exports.RepositoryError("DB_ERROR","Highlight regeneration run insert did not return a row");return {run:u,created:!0}},{behavior:"immediate"})}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to create highlight regeneration run",o)}finally{r.close();}}beginHighlightRegenerationRun(e){return this.createHighlightRegenerationRun(e)}queueHighlightRegenerationRun(e){return this.createHighlightRegenerationRun(e)}getHighlightRegenerationRun(e,n){if(M(e,"runId"),n!==void 0&&M(n,"workspaceId"),!Oa.existsSync(this.resolveDbPath()))return null;let r=this.openHandle(false);try{return this.findRegenerationRun(r.db,e,n)??null}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to read highlight regeneration run",o)}finally{r.close();}}getHighlightRegenerationRunByRequest(e,n,r){if(M(e,"threadId"),M(n,"workspaceId"),M(r,"requestId"),!Oa.existsSync(this.resolveDbPath()))return null;let o=this.openHandle(false);try{return this.findThread(o.db,e,n)?o.db.select().from(B).where(drizzleOrm.and(drizzleOrm.eq(B.thread_id,e),drizzleOrm.eq(B.request_id,r))).orderBy(drizzleOrm.desc(B.requested_at),drizzleOrm.desc(B.id)).limit(1).get()??null:null}catch(s){throw s instanceof exports.RepositoryError?s:new exports.RepositoryError("DB_ERROR","Failed to read highlight regeneration request",s)}finally{o.close();}}findHighlightRegenerationRun(e,n,r){return this.getHighlightRegenerationRunByRequest(e,n,r)}startHighlightRegenerationRun(e,n){M(e,"runId"),n!==void 0&&M(n,"workspaceId");let r=new Date().toISOString(),o=this.openHandle(true);try{return o.db.transaction(s=>{let i=this.findRegenerationRun(s,e,n);if(i||it(`Highlight regeneration run ${e} not found`),oi(i.status)||Y(`invalid highlight regeneration status: ${i.status}`),i.status!=="queued")return i;s.update(B).set({status:"running",started_at:r}).where(drizzleOrm.and(drizzleOrm.eq(B.id,i.id),drizzleOrm.eq(B.status,"queued"))).run();let d=s.select().from(B).where(drizzleOrm.eq(B.id,i.id)).get();if(!d)throw new exports.RepositoryError("DB_ERROR","Highlight regeneration run start did not return a row");return d},{behavior:"immediate"})}catch(s){throw s instanceof exports.RepositoryError?s:new exports.RepositoryError("DB_ERROR","Failed to start highlight regeneration run",s)}finally{o.close();}}startHighlightRegeneration(e,n){return this.startHighlightRegenerationRun(e,n)}failHighlightRegenerationRun(e){M(e.runId,"runId"),M(e.errorCode,"errorCode"),e.workspaceId!==void 0&&M(e.workspaceId,"workspaceId");let n=new Date().toISOString(),r=this.openHandle(true);try{return r.db.transaction(o=>{let s=this.findRegenerationRun(o,e.runId,e.workspaceId);if(s||it(`Highlight regeneration run ${e.runId} not found`),oi(s.status)||Y(`invalid highlight regeneration status: ${s.status}`),s.status==="completed"||s.status==="failed")return s;o.update(B).set({status:"failed",completed_at:n,error_code:e.errorCode}).where(drizzleOrm.and(drizzleOrm.eq(B.id,s.id),drizzleOrm.inArray(B.status,ko))).run();let i=o.select().from(B).where(drizzleOrm.eq(B.id,s.id)).get();if(!i)throw new exports.RepositoryError("DB_ERROR","Highlight regeneration run failure did not return a row");return i},{behavior:"immediate"})}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to fail highlight regeneration run",o)}finally{r.close();}}failHighlightRegeneration(e){return this.failHighlightRegenerationRun(e)}recoverInterruptedHighlightRegenerationRuns(e=ru){M(e,"errorCode");let n=new Date().toISOString(),r=this.openHandle(true);try{return r.db.transaction(o=>o.update(B).set({status:"failed",completed_at:n,error_code:e}).where(drizzleOrm.inArray(B.status,ko)).run().changes,{behavior:"immediate"})}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to recover interrupted highlight runs",o)}finally{r.close();}}completeHighlightRegenerationRun(e){M(e.runId,"runId"),M(e.threadId,"threadId"),M(e.workspaceId,"workspaceId"),M(e.detectorVersion,"detectorVersion");let n=h_(e.candidates),r=lr(e),o=this.openHandle(true),s=false;try{return o.db.transaction(i=>{let d=this.findRegenerationRun(i,e.runId,e.workspaceId);if((!d||d.thread_id!==e.threadId)&&it(`Highlight regeneration run ${e.runId} not found`),oi(d.status)||Y(`invalid highlight regeneration status: ${d.status}`),d.status==="failed")throw new exports.RepositoryError("CONFLICT","Highlight regeneration run has already failed");if(d.status==="completed")return {run:d,deletedCount:0,createdCount:0,previousAutoCount:d.previous_auto_count??0,newAutoCount:d.new_auto_count??0};s=!0;let c=this.findThread(i,e.threadId,e.workspaceId);c||it(`Thread ${e.threadId} not found`),d.detector_version!==e.detectorVersion&&Y("detectorVersion does not match the regeneration run");let u=i.select().from(H).where(drizzleOrm.eq(H.thread_id,c.id)).orderBy(drizzleOrm.asc(H.created_at),drizzleOrm.asc(H.id)).all(),f=new Set(n.map(P=>P.contentFingerprint)),p=u.filter(P=>P.source==="auto"&&P.status==="active"&&P.revision===0&&!f.has(P.content_fingerprint??"")),g=u.filter(P=>P.source==="auto"&&P.status==="active").length,_=new Set(u.filter(P=>!p.includes(P)&&P.content_fingerprint).map(P=>P.content_fingerprint)),m=n.filter(P=>!_.has(P.contentFingerprint)),k=new Date().toISOString(),T=pr(i,c.id)+1;fr(i,c.id)||(gr(i,c,r,k,T),T+=1);for(let P of p)i.delete(H).where(drizzleOrm.eq(H.id,P.id)).run(),m_(i,P,r,k,T,{runId:e.runId,reason:nu}),T+=1;let E=0,b=e.agentId??(r.actorType==="agent"?r.actorId:null);for(let P of m){let oe=$e("thl");i.insert(H).values({id:oe,thread_id:c.id,source:"auto",kind:P.kind,status:"active",text:P.text,covers_from_task_id:P.coversFromTaskId,covers_to_task_id:P.coversToTaskId,revision:0,created_at:k,updated_at:k,agent_id:b,source_task_id:P.anchorTaskId,detector_version:e.detectorVersion,content_fingerprint:P.contentFingerprint,dismissed_at:null}).run();let Pe=i.select().from(H).where(drizzleOrm.eq(H.id,oe)).get();if(!Pe)throw new exports.RepositoryError("DB_ERROR","Regenerated highlight insert did not return a row");To(i,Pe,r,k,"thread.highlight.created",T),T+=1,E+=1;}let y=i.select().from(H).where(drizzleOrm.eq(H.thread_id,c.id)).all().filter(P=>P.source==="auto"&&P.status==="active").length;Zt(i,{threadId:c.id,seq:T,type:"thread.highlights.regenerated",actorType:r.actorType,actorId:r.actorId,createdAt:k,payload:{runId:d.id,detectorVersion:e.detectorVersion,previousAutoCount:g,newAutoCount:y,deletedCount:p.length,createdCount:E}}),i.update(B).set({status:"completed",started_at:d.started_at??k,completed_at:k,error_code:null,previous_auto_count:g,new_auto_count:y}).where(drizzleOrm.and(drizzleOrm.eq(B.id,d.id),drizzleOrm.inArray(B.status,ko))).run();let N=i.select().from(B).where(drizzleOrm.eq(B.id,d.id)).get();if(!N)throw new exports.RepositoryError("DB_ERROR","Highlight regeneration completion did not return a row");return {run:N,deletedCount:p.length,createdCount:E,previousAutoCount:g,newAutoCount:y}},{behavior:"immediate"})}catch(i){if(s)try{this.failHighlightRegenerationRun({runId:e.runId,workspaceId:e.workspaceId,errorCode:ou});}catch{}throw i instanceof exports.RepositoryError?i:new exports.RepositoryError("DB_ERROR","Failed to complete highlight regeneration",i)}finally{o.close();}}completeHighlightRegeneration(e){return this.completeHighlightRegenerationRun(e)}replaceAutoHighlightsAtomically(e){return this.completeHighlightRegenerationRun(e)}listTimeline(e,n,r={}){let o=typeof e=="string"?{...r,threadId:e,workspaceId:n}:e;M(o.threadId,"threadId"),M(o.workspaceId,"workspaceId");let s=l_(o);if(!Oa.existsSync(this.resolveDbPath()))return null;let i=this.openHandle(false);try{if(!this.findThread(i.db,o.threadId,o.workspaceId))return null;let d=i.db.select({maxSeq:drizzleOrm.sql`COALESCE(MAX(${K.seq}), 0)`}).from(K).where(drizzleOrm.eq(K.thread_id,o.threadId)).get()?.maxSeq??0,c;o.beforeSeq!==void 0?c=i.db.select().from(K).where(drizzleOrm.and(drizzleOrm.eq(K.thread_id,o.threadId),drizzleOrm.lt(K.seq,o.beforeSeq))).orderBy(drizzleOrm.desc(K.seq)).limit(s+1).all().reverse():o.afterSeq!==void 0?c=i.db.select().from(K).where(drizzleOrm.and(drizzleOrm.eq(K.thread_id,o.threadId),drizzleOrm.sql`${K.seq} > ${o.afterSeq}`)).orderBy(drizzleOrm.asc(K.seq)).limit(s+1).all():c=i.db.select().from(K).where(drizzleOrm.eq(K.thread_id,o.threadId)).orderBy(drizzleOrm.desc(K.seq)).limit(s+1).all().reverse();let u=c.length>s,f=o.afterSeq!==void 0?c.slice(0,s):u?c.slice(1):c,p=!1,g=f[0];return g&&(p=!!i.db.select({id:K.id}).from(K).where(drizzleOrm.and(drizzleOrm.eq(K.thread_id,o.threadId),drizzleOrm.lt(K.seq,g.seq))).limit(1).get()),{items:f,latestSeq:d,hasMoreOlder:p}}catch(d){throw d instanceof exports.RepositoryError?d:new exports.RepositoryError("DB_ERROR","Failed to list thread timeline",d)}finally{i.close();}}listEvents(e,n,r){return this.listTimeline(e,n,r)}getTimeline(e,n,r){return this.listTimeline(e,n,r)}createHighlight(e){let n=f_(e),r=lr(e),o=new Date().toISOString(),s=this.openHandle(true);try{return s.db.transaction(i=>{let d=this.findThread(i,e.threadId,e.workspaceId);if(d||it(`Thread ${e.threadId} not found`),n.source==="auto"){let g=i.select().from(H).where(drizzleOrm.and(drizzleOrm.eq(H.thread_id,e.threadId),drizzleOrm.eq(H.source_task_id,n.sourceTaskId),drizzleOrm.eq(H.detector_version,n.detectorVersion),drizzleOrm.eq(H.content_fingerprint,n.contentFingerprint))).orderBy(drizzleOrm.asc(H.created_at),drizzleOrm.asc(H.id)).limit(1).get();if(g)return g}let c=e.id??$e("thl"),u={id:c,thread_id:e.threadId,source:n.source,kind:n.kind,status:"active",text:n.text,covers_from_task_id:n.coversFromTaskId,covers_to_task_id:n.coversToTaskId,revision:0,created_at:o,updated_at:o,agent_id:n.agentId,source_task_id:n.sourceTaskId,detector_version:n.detectorVersion,content_fingerprint:n.contentFingerprint,dismissed_at:null};i.insert(H).values(u).run();let f=i.select().from(H).where(drizzleOrm.eq(H.id,c)).get();if(!f)throw new exports.RepositoryError("DB_ERROR","Highlight insert did not return a row");let p=pr(i,d.id)+1;return fr(i,d.id)||(gr(i,d,r,o,p),p+=1),To(i,f,r,o,"thread.highlight.created",p),f},{behavior:"immediate"})}catch(i){throw i instanceof exports.RepositoryError?i:new exports.RepositoryError("DB_ERROR","Failed to create thread highlight",i)}finally{s.close();}}updateHighlight(e){M(e.threadId,"threadId"),M(e.workspaceId,"workspaceId"),M(e.highlightId,"highlightId"),(!Number.isInteger(e.expectedRevision)||e.expectedRevision<0)&&Y("expectedRevision must be a non-negative integer"),e.text===void 0&&e.kind===void 0&&e.coversFromTaskId===void 0&&e.coversToTaskId===void 0&&Y("highlight update requires at least one field"),e.kind!==void 0&&ai(e.kind);let n=e.text===void 0?void 0:ii(e.text),r=lr(e),o=new Date().toISOString(),s=this.openHandle(true);try{return s.db.transaction(i=>{let d=this.findThread(i,e.threadId,e.workspaceId);d||it(`Thread ${e.threadId} not found`);let c=i.select().from(H).where(drizzleOrm.and(drizzleOrm.eq(H.id,e.highlightId),drizzleOrm.eq(H.thread_id,d.id))).limit(1).get();if(c||it(`Highlight ${e.highlightId} not found`),c.revision!==e.expectedRevision)throw new xn(d.id,c.id,e.expectedRevision,c.revision);if(c.status!=="active")throw new xn(d.id,c.id,e.expectedRevision,c.revision);let u=e.kind??c.kind,f=n??c.text,p=e.coversFromTaskId??c.covers_from_task_id,g=e.coversToTaskId??c.covers_to_task_id;(!f||p.length===0||g.length===0)&&Y("highlight projection is incomplete");let _=u!==c.kind||f!==c.text||p!==c.covers_from_task_id||g!==c.covers_to_task_id,m=r.actorType==="user"&&c.source==="auto"&&_?"manual":c.source;if(!(_||m!==c.source))return c;let T=c.revision+1;i.update(H).set({source:m,kind:u,text:f,covers_from_task_id:p,covers_to_task_id:g,revision:T,updated_at:o}).where(drizzleOrm.and(drizzleOrm.eq(H.id,c.id),drizzleOrm.eq(H.revision,c.revision))).run();let E=i.select().from(H).where(drizzleOrm.eq(H.id,c.id)).get();if(!E)throw new exports.RepositoryError("DB_ERROR","Highlight update did not return a row");let b=pr(i,d.id)+1;return fr(i,d.id)||(gr(i,d,r,o,b),b+=1),To(i,E,r,o,"thread.highlight.updated",b,c),E},{behavior:"immediate"})}catch(i){throw i instanceof exports.RepositoryError?i:new exports.RepositoryError("DB_ERROR","Failed to update thread highlight",i)}finally{s.close();}}dismissHighlight(e){M(e.threadId,"threadId"),M(e.workspaceId,"workspaceId"),M(e.highlightId,"highlightId"),(!Number.isInteger(e.expectedRevision)||e.expectedRevision<0)&&Y("expectedRevision must be a non-negative integer");let n=lr(e),r=new Date().toISOString(),o=this.openHandle(true);try{return o.db.transaction(s=>{let i=this.findThread(s,e.threadId,e.workspaceId);i||it(`Thread ${e.threadId} not found`);let d=s.select().from(H).where(drizzleOrm.and(drizzleOrm.eq(H.id,e.highlightId),drizzleOrm.eq(H.thread_id,i.id))).limit(1).get();if(d||it(`Highlight ${e.highlightId} not found`),d.revision!==e.expectedRevision)throw new xn(i.id,d.id,e.expectedRevision,d.revision);if(d.status==="dismissed")return d;let c=d.revision+1;s.update(H).set({status:"dismissed",text:null,revision:c,updated_at:r,dismissed_at:r}).where(drizzleOrm.and(drizzleOrm.eq(H.id,d.id),drizzleOrm.eq(H.revision,d.revision))).run();let u=s.select().from(H).where(drizzleOrm.eq(H.id,d.id)).get();if(!u)throw new exports.RepositoryError("DB_ERROR","Highlight dismissal did not return a row");let f=pr(s,i.id)+1;return fr(s,i.id)||(gr(s,i,n,r,f),f+=1),To(s,u,n,r,"thread.highlight.deleted",f,d),u},{behavior:"immediate"})}catch(s){throw s instanceof exports.RepositoryError?s:new exports.RepositoryError("DB_ERROR","Failed to dismiss thread highlight",s)}finally{o.close();}}listActiveHighlights(e,n,r={}){if(M(e,"threadId"),M(n,"workspaceId"),r.taskId!==void 0&&M(r.taskId,"taskId"),r.coversFromTaskId!==void 0&&M(r.coversFromTaskId,"coversFromTaskId"),r.coversToTaskId!==void 0&&M(r.coversToTaskId,"coversToTaskId"),!Oa.existsSync(this.resolveDbPath()))return null;let o=this.openHandle(false);try{if(!this.findThread(o.db,e,n))return null;let i=o.db.select().from(H).where(drizzleOrm.and(drizzleOrm.eq(H.thread_id,e),drizzleOrm.eq(H.status,"active"))).orderBy(drizzleOrm.asc(H.created_at),drizzleOrm.asc(H.id)).all();if(r.taskId===void 0&&r.coversFromTaskId===void 0&&r.coversToTaskId===void 0)return i;let d=o.db.all(drizzleOrm.sql`
|
|
501
507
|
SELECT id, started_at FROM tasks WHERE thread_id = ${e}
|
|
502
508
|
ORDER BY started_at ASC, id ASC
|
|
503
|
-
`),c=new Map(d.map((g,_)=>[g.id,_])),u=r.taskId===void 0?void 0:c.get(r.taskId),f=r.coversFromTaskId===void 0?void 0:c.get(r.coversFromTaskId),p=r.coversToTaskId===void 0?void 0:c.get(r.coversToTaskId);return i.filter(g=>{let _=c.get(g.covers_from_task_id),m=c.get(g.covers_to_task_id);if(_===void 0||m===void 0)return !1;let k=Math.min(_,m),T=Math.max(_,m);return !(u!==void 0&&(u<k||u>T)||f!==void 0&&T<f||p!==void 0&&k>p)})}catch(s){throw s instanceof exports.RepositoryError?s:new exports.RepositoryError("DB_ERROR","Failed to list active thread highlights",s)}finally{o.close();}}listHighlights(e,n,r){return this.listActiveHighlights(e,n,r)}getActiveHighlights(e,n,r){return this.listActiveHighlights(e,n,r)}};h();se();fe();ce();pe();ue();var oi=class extends exports.BaseSqliteRepository{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=Se.join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=Se.dirname(n);Sa.existsSync(o)||Sa.mkdirSync(o,{recursive:true});}else if(!Sa.existsSync(n))throw new exports.RepositoryError("NOT_FOUND","Database not found");let r=C(n);if(e)try{V(r.db,n);}catch(o){throw r.close(),o}return r}insertSpan(e){let n=this.openHandle(true);try{n.db.insert(mt).values(e).run();}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to insert span",r)}finally{n.close();}}findByTaskId(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.select().from(mt).where(drizzleOrm.eq(mt.task_id,e)).all()}catch(r){throw new exports.RepositoryError("DB_ERROR","Failed to find spans by task id",r)}finally{n.close();}}findById(e){if(!this.dbExists())return;let n=this.openHandle(false);try{return n.db.select().from(mt).where(drizzleOrm.eq(mt.id,e)).limit(1).get()??void 0}catch(r){throw new exports.RepositoryError("DB_ERROR","Failed to find span by id",r)}finally{n.close();}}};h();se();fe();ce();pe();ue();var si=class extends exports.BaseSqliteRepository{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=Se.join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=Se.dirname(n);Sa.existsSync(o)||Sa.mkdirSync(o,{recursive:true});}else if(!Sa.existsSync(n))throw new exports.RepositoryError("NOT_FOUND","Database not found");let r=C(n);if(e)try{V(r.db,n);}catch(o){throw r.close(),o}return r}insertToolCall(e){let n=this.openHandle(true);try{n.db.insert(dt).values(e).run();}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to insert tool call",r)}finally{n.close();}}findByTaskId(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.select().from(dt).where(drizzleOrm.eq(dt.task_id,e)).all()}catch(r){throw new exports.RepositoryError("DB_ERROR","Failed to find tool calls by task id",r)}finally{n.close();}}aggregateByName(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.select({toolName:dt.tool_name,count:drizzleOrm.sql`count(*)`}).from(dt).where(drizzleOrm.eq(dt.task_id,e)).groupBy(dt.tool_name).all().map(r=>({toolName:r.toolName,count:r.count}))}catch(r){throw new exports.RepositoryError("DB_ERROR","Failed to aggregate tool calls by name",r)}finally{n.close();}}};h();se();fe();ce();pe();ue();var ii=class extends exports.BaseSqliteRepository{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=Se.join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=Se.dirname(n);Sa.existsSync(o)||Sa.mkdirSync(o,{recursive:true});}else if(!Sa.existsSync(n))throw new exports.RepositoryError("NOT_FOUND","Database not found");let r=C(n);if(e)try{V(r.db,n);}catch(o){throw r.close(),o}return r}ensureThreadExists(e,n){if(!e.db.select({id:w.id}).from(w).where(drizzleOrm.eq(w.id,n)).limit(1).get())throw new exports.RepositoryError("NOT_FOUND",`Thread not found: ${n}`)}findByThreadId(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{return this.ensureThreadExists(n,e),n.db.select().from(je).where(drizzleOrm.eq(je.thread_id,e)).orderBy(drizzleOrm.asc(je.seq)).all()}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to find boxes by thread id",r)}finally{n.close();}}findById(e,n){if(!this.dbExists())return;let r=this.openHandle(false);try{return r.db.select().from(je).where(drizzleOrm.and(drizzleOrm.eq(je.id,n),drizzleOrm.eq(je.thread_id,e))).limit(1).get()??void 0}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to find box by id",o)}finally{r.close();}}insert(e){let n=this.openHandle(true);try{this.ensureThreadExists(n,e.threadId);try{n.db.insert(je).values({id:e.id,thread_id:e.threadId,seq:e.seq,first_task_id:e.first_task_id,mid_task_id:e.mid_task_id,last_task_id:e.last_task_id,task_count:e.task_count,summary:e.summary??null,source_tokens:e.source_tokens,summary_tokens:e.summary_tokens??null,created_at:e.created_at}).run();}catch(o){throw o instanceof Error&&/UNIQUE constraint failed/i.test(o.message)?new exports.RepositoryError("CONFLICT",`Duplicate seq ${String(e.seq)} for thread ${e.threadId}`,o):o}let r=n.db.select().from(je).where(drizzleOrm.eq(je.id,e.id)).limit(1).get();if(!r)throw new exports.RepositoryError("DB_ERROR","Insert did not return a row");return r}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to insert thread box",r)}finally{n.close();}}};h();se();fe();ce();pe();ue();var ai=class extends exports.BaseSqliteRepository{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=Se.join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=Se.dirname(n);Sa.existsSync(o)||Sa.mkdirSync(o,{recursive:true});}else if(!Sa.existsSync(n))throw new exports.RepositoryError("NOT_FOUND","Database not found");let r=C(n);if(e)try{V(r.db,n);}catch(o){throw r.close(),o}return r}bulkInsert(e){if(e.length===0)return;let n=this.openHandle(true);try{n.db.transaction(r=>{for(let o of e)r.insert(Zt).values({id:crypto.randomUUID(),path:o.path,method:o.method,status_code:o.statusCode,duration_ms:o.durationMs,ip:o.ip??null,request_headers:o.requestHeaders??null,response_headers:o.responseHeaders??null,request_body:o.requestBody??null,response_body:o.responseBody??null,query:o.query??null,user_id:o.userId??null,project_id:o.projectId??null,partition_key:o.partitionKey??"default",timestamp:o.timestamp??new Date().toISOString(),metadata:o.metadata??null}).run();});}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to bulk insert request logs",r)}finally{n.close();}}findRecent(e=100){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.select().from(Zt).orderBy(drizzleOrm.desc(Zt.timestamp)).limit(e).all()}catch(r){throw new exports.RepositoryError("DB_ERROR","Failed to find recent request logs",r)}finally{n.close();}}};h();se();fe();ce();pe();ue();function au(t){return new Date(Math.floor(t/3e5)*3e5).toISOString()}var di=class extends exports.BaseSqliteRepository{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=Se.join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=Se.dirname(n);Sa.existsSync(o)||Sa.mkdirSync(o,{recursive:true});}else if(!Sa.existsSync(n))throw new exports.RepositoryError("NOT_FOUND","Database not found");let r=C(n);if(e)try{V(r.db,n);}catch(o){throw r.close(),o}return r}upsert(e){let n=this.openHandle(true);try{let r=au(e.bucketStartMs),o=e.accountRef??"default";n.db.insert(_e).values({id:e.id,provider:e.provider,account_ref:o,limit_window:e.limitWindow,bucket_start:r,captured_at:e.capturedAt,used_percent:e.usedPercent,remaining_percent:e.remainingPercent,resets_at:e.resetsAt??null,source:e.source,metadata:e.metadata??null}).onConflictDoUpdate({target:[_e.provider,_e.account_ref,_e.limit_window,_e.bucket_start],set:{captured_at:e.capturedAt,used_percent:e.usedPercent,remaining_percent:e.remainingPercent,resets_at:e.resetsAt??null,metadata:e.metadata??null}}).run();}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to upsert usage limit snapshot",r)}finally{n.close();}}getTrends(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{let r=n.db.select({provider:_e.provider,bucket_start:_e.bucket_start,used_percent:_e.used_percent,remaining_percent:_e.remaining_percent,resets_at:_e.resets_at}).from(_e).where(drizzleOrm.and(drizzleOrm.eq(_e.limit_window,e.window),drizzleOrm.gte(_e.bucket_start,e.fromIso),drizzleOrm.lte(_e.bucket_start,e.toIso))).orderBy(drizzleOrm.asc(_e.bucket_start)).all(),o=new Map;for(let s of r)o.has(s.provider)||o.set(s.provider,[]),o.get(s.provider).push({bucketStart:s.bucket_start,usedPercent:s.used_percent,remainingPercent:s.remaining_percent,resetsAt:s.resets_at??null});return Array.from(o.entries()).map(([s,i])=>({provider:s,points:i}))}catch(r){throw new exports.RepositoryError("DB_ERROR","Failed to get usage limit trends",r)}finally{n.close();}}};h();se();fe();ce();pe();ue();var ci=class extends exports.BaseSqliteRepository{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=Se.join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=Se.dirname(n);Sa.existsSync(o)||Sa.mkdirSync(o,{recursive:true});}else if(!Sa.existsSync(n))throw new exports.RepositoryError("NOT_FOUND","Database not found");let r=C(n);if(e)try{V(r.db,n);}catch(o){throw r.close(),o}return r}publish(e){let n=this.openHandle(true);try{n.db.insert(De).values({id:e.id,workspace_id:e.workspaceId,month:e.month,generated_at:e.generatedAt,source_range:e.sourceRange,tier:e.tier,total_tokens:e.totalTokens,total_cost_usd:e.totalCostUsd,payload:e.payload}).onConflictDoUpdate({target:[De.workspace_id,De.month],set:{generated_at:e.generatedAt,source_range:e.sourceRange,tier:e.tier,total_tokens:e.totalTokens,total_cost_usd:e.totalCostUsd,payload:e.payload}}).run();let r=n.db.select().from(De).where(drizzleOrm.and(drizzleOrm.eq(De.workspace_id,e.workspaceId),drizzleOrm.eq(De.month,e.month))).limit(1).get();if(!r)throw new exports.RepositoryError("DB_ERROR","Failed to read back published usage report");return r}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to publish usage report",r)}finally{n.close();}}findByMonth(e,n){if(!this.dbExists())return;let r=this.openHandle(false);try{return r.db.select().from(De).where(drizzleOrm.and(drizzleOrm.eq(De.workspace_id,e),drizzleOrm.eq(De.month,n))).limit(1).get()??void 0}catch(o){throw new exports.RepositoryError("DB_ERROR","Failed to find usage report",o)}finally{r.close();}}listByWorkspace(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.select().from(De).where(drizzleOrm.eq(De.workspace_id,e)).orderBy(drizzleOrm.desc(De.month)).all()}catch(r){throw new exports.RepositoryError("DB_ERROR","Failed to list usage reports",r)}finally{n.close();}}};h();se();fe();ce();pe();ue();var gu=500,hu=50,ui=class extends exports.BaseSqliteRepository{dbPath;cap;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=Se.join(e.dbRoot,".crewx","crewx.db")),this.cap=e.cap??gu;}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=Se.dirname(n);Sa.existsSync(o)||Sa.mkdirSync(o,{recursive:true});}else if(!Sa.existsSync(n))throw new exports.RepositoryError("NOT_FOUND","Database not found");let r=C(n);if(e)try{V(r.db,n);}catch(o){throw r.close(),o}return r}create(e){let n=this.openHandle(true);try{let r=He("ntf"),o=new Date().toISOString();return n.db.insert(F).values({id:r,workspace_id:e.workspaceId,agent_id:e.agentId??null,task_id:e.taskId??null,thread_id:e.threadId??null,source:e.source??"agent",level:e.level??"info",title:e.title,body:e.body??null,target_user_id:e.targetUserId??null,created_at:o,metadata:e.metadata??null}).run(),this.enforceCap(n,e.workspaceId),{id:r}}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to create notification",r)}finally{n.close();}}enforceCap(e,n){let s=(e.db.select({count:drizzleOrm.sql`count(*)`}).from(F).where(drizzleOrm.eq(F.workspace_id,n)).get()?.count??0)-this.cap;if(s<=0)return;let d=e.db.select({id:F.id}).from(F).innerJoin(ie,drizzleOrm.eq(ie.notification_id,F.id)).where(drizzleOrm.eq(F.workspace_id,n)).groupBy(F.id).orderBy(drizzleOrm.asc(F.created_at)).limit(s).all().map(c=>c.id);d.length!==0&&(e.db.delete(ie).where(drizzleOrm.inArray(ie.notification_id,d)).run(),e.db.delete(F).where(drizzleOrm.inArray(F.id,d)).run());}list(e){if(!this.dbExists())return [];let n=e.limit??hu,r=this.openHandle(false);try{return r.db.select({id:F.id,workspace_id:F.workspace_id,agent_id:F.agent_id,task_id:F.task_id,thread_id:F.thread_id,source:F.source,level:F.level,title:F.title,body:F.body,target_user_id:F.target_user_id,created_at:F.created_at,metadata:F.metadata,read_at:ie.read_at}).from(F).leftJoin(ie,drizzleOrm.and(drizzleOrm.eq(ie.notification_id,F.id),drizzleOrm.eq(ie.user_id,e.userId))).where(drizzleOrm.eq(F.workspace_id,e.workspaceId)).orderBy(drizzleOrm.desc(F.created_at)).limit(n).all().map(s=>({...s,read_at:s.read_at??null,read:s.read_at!=null}))}catch(o){throw new exports.RepositoryError("DB_ERROR","Failed to list notifications",o)}finally{r.close();}}unreadCount(e){if(!this.dbExists())return 0;let n=this.openHandle(false);try{return n.db.select({count:drizzleOrm.sql`count(*)`}).from(F).leftJoin(ie,drizzleOrm.and(drizzleOrm.eq(ie.notification_id,F.id),drizzleOrm.eq(ie.user_id,e.userId))).where(drizzleOrm.and(drizzleOrm.eq(F.workspace_id,e.workspaceId),drizzleOrm.isNull(ie.notification_id))).get()?.count??0}catch(r){throw new exports.RepositoryError("DB_ERROR","Failed to count unread notifications",r)}finally{n.close();}}markRead(e){let n=this.openHandle(true);try{if(!n.db.select({id:F.id}).from(F).where(drizzleOrm.and(drizzleOrm.eq(F.id,e.notificationId),drizzleOrm.eq(F.workspace_id,e.workspaceId))).get())throw new exports.RepositoryError("NOT_FOUND","Notification not found in workspace");return n.db.insert(ie).values({notification_id:e.notificationId,user_id:e.userId,read_at:new Date().toISOString()}).onConflictDoNothing().run().changes>0}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to mark notification read",r)}finally{n.close();}}markAllRead(e){let n=this.openHandle(true);try{let r=n.db.select({id:F.id}).from(F).leftJoin(ie,drizzleOrm.and(drizzleOrm.eq(ie.notification_id,F.id),drizzleOrm.eq(ie.user_id,e.userId))).where(drizzleOrm.and(drizzleOrm.eq(F.workspace_id,e.workspaceId),drizzleOrm.isNull(ie.notification_id))).all();if(r.length===0)return 0;let o=new Date().toISOString();return n.db.transaction(s=>{for(let i of r)s.insert(ie).values({notification_id:i.id,user_id:e.userId,read_at:o}).onConflictDoNothing().run();}),r.length}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to mark all notifications read",r)}finally{n.close();}}};h();se();fe();ce();pe();ue();var ku=50,pi=class extends exports.BaseSqliteRepository{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=Se.join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=Se.dirname(n);Sa.existsSync(o)||Sa.mkdirSync(o,{recursive:true});}else if(!Sa.existsSync(n))throw new exports.RepositoryError("NOT_FOUND","Database not found");let r=C(n);if(e)try{V(r.db,n);}catch(o){throw r.close(),o}return r}create(e){let n=this.openHandle(true);try{let r=new Date().toISOString(),o=[],s=e.map(i=>{let d=He("sug");return o.push(d),{id:d,workspace_id:i.workspaceId,agent_id:i.agentId,task_id:i.taskId??null,type:i.type,status:i.status??"pending",payload:i.payload,applied_commit_sha:i.appliedCommitSha??null,created_at:r,updated_at:r}});return s.length>0&&n.db.insert(j).values(s).run(),{ids:o}}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to create agent suggestions",r)}finally{n.close();}}findLatestSet(e,n){if(!this.dbExists())return [];let r=this.openHandle(false);try{let o=r.db.select({task_id:j.task_id}).from(j).where(drizzleOrm.and(drizzleOrm.eq(j.workspace_id,e),drizzleOrm.eq(j.agent_id,n))).orderBy(drizzleOrm.desc(j.created_at)).limit(1).get();if(!o)return [];let s=o.task_id===null?drizzleOrm.isNull(j.task_id):drizzleOrm.eq(j.task_id,o.task_id);return r.db.select().from(j).where(drizzleOrm.and(drizzleOrm.eq(j.workspace_id,e),drizzleOrm.eq(j.agent_id,n),s)).orderBy(drizzleOrm.asc(j.created_at)).all()}catch(o){throw new exports.RepositoryError("DB_ERROR","Failed to find latest agent suggestion set",o)}finally{r.close();}}findSetByTaskId(e,n,r){if(!this.dbExists())return [];let o=this.openHandle(false);try{return o.db.select().from(j).where(drizzleOrm.and(drizzleOrm.eq(j.workspace_id,e),drizzleOrm.eq(j.agent_id,n),drizzleOrm.eq(j.task_id,r))).orderBy(drizzleOrm.asc(j.created_at)).all()}catch(s){throw new exports.RepositoryError("DB_ERROR","Failed to find agent suggestion set by task id",s)}finally{o.close();}}findById(e,n,r){if(!this.dbExists())return null;let o=this.openHandle(false);try{return o.db.select().from(j).where(drizzleOrm.and(drizzleOrm.eq(j.workspace_id,e),drizzleOrm.eq(j.agent_id,n),drizzleOrm.eq(j.id,r))).get()??null}catch(s){throw new exports.RepositoryError("DB_ERROR","Failed to find agent suggestion by id",s)}finally{o.close();}}updateStatus(e,n,r){let o=this.openHandle(true);try{let s={status:n,updated_at:new Date().toISOString()};return r!==void 0&&(s.applied_commit_sha=r),o.db.update(j).set(s).where(drizzleOrm.eq(j.id,e)).run().changes>0}catch(s){throw s instanceof exports.RepositoryError?s:new exports.RepositoryError("DB_ERROR","Failed to update agent suggestion status",s)}finally{o.close();}}listByAgent(e,n,r=ku){if(!this.dbExists())return [];let o=this.openHandle(false);try{return o.db.select().from(j).where(drizzleOrm.and(drizzleOrm.eq(j.workspace_id,e),drizzleOrm.eq(j.agent_id,n))).orderBy(drizzleOrm.desc(j.created_at)).limit(r).all()}catch(s){throw new exports.RepositoryError("DB_ERROR","Failed to list agent suggestions",s)}finally{o.close();}}findDismissed(e,n,r=20){if(!this.dbExists())return [];let o=this.openHandle(false);try{return o.db.select().from(j).where(drizzleOrm.and(drizzleOrm.eq(j.workspace_id,e),drizzleOrm.eq(j.agent_id,n),drizzleOrm.eq(j.status,"dismissed"))).orderBy(drizzleOrm.desc(j.updated_at)).limit(r).all()}catch(s){throw new exports.RepositoryError("DB_ERROR","Failed to find dismissed agent suggestions",s)}finally{o.close();}}};exports.AgentSuggestionRepository=pi;exports.BUILTIN_THREAD_STATES=Wc;exports.CommonCodeRepository=No;exports.CommonCodeRepositoryError=ee;exports.DEFAULT_AGENT_SUGGESTION_LIST_LIMIT=ku;exports.DEFAULT_NOTIFICATION_CAP=gu;exports.DEFAULT_NOTIFICATION_LIST_LIMIT=hu;exports.DEFAULT_PROJECT_STAGES=wa;exports.DEFAULT_PROJECT_STAGE_KEYS=Ho;exports.NotificationRepository=ui;exports.ProjectRepository=Mo;exports.RequestLogRepository=ai;exports.SpanRepository=oi;exports.TASK_LOG_MIGRATION_EVENT_ROW_BYTES=fc;exports.TASK_LOG_MIGRATION_MIN_FREE_SPACE_BYTES=oo;exports.TASK_LOG_MIGRATION_TERMINAL_STATUSES=pc;exports.THREAD_HIGHLIGHT_DELETION_REASON_REGENERATION_REPLACED=Xc;exports.THREAD_HIGHLIGHT_REGENERATION_COMMIT_FAILED=Zc;exports.THREAD_HIGHLIGHT_REGENERATION_DETECTION_FAILED=Yh;exports.THREAD_HIGHLIGHT_REGENERATION_INTERRUPTED=Qc;exports.THREAD_HIGHLIGHT_REGENERATION_NO_ELIGIBLE_TURNS=Jh;exports.THREAD_PRIORITIES=jc;exports.ThreadBoxRepository=ii;exports.ThreadHighlightConflictError=vn;exports.ThreadHighlightRegenerationConflictError=ko;exports.ThreadHistoryConflictError=mo;exports.ThreadHistoryRepository=ti;exports.ThreadRepository=Js;exports.ThreadTitleMetadataPatchError=Jt;exports.ToolCallRepository=si;exports.USAGE_BACKFILL_MAX_LATE_USAGE_AGE_MS=Sc;exports.USAGE_BACKFILL_TERMINAL_STATUSES=ao;exports.UsageLimitSnapshotRepository=di;exports.UsageReportRepository=ci;exports.WorkspaceRepository=Do;exports.calcBucketStart=au;exports.classifyUsageAccountingReason=Cc;exports.customStateLabel=Gc;exports.generateCommonCodeId=Oo;exports.hasRecordedUsage=Rn;exports.hasSufficientTaskLogMigrationFreeSpace=mc;exports.hasThreadTitleKey=Fh;exports.isThreadPriority=or;exports.isThreadState=sr;exports.matchesThreadTitleFilter=Wh;exports.mergeTerminalReason=eo;exports.mergeThreadTitleMeta=Qs;exports.normalizeTaskStatus=vt;exports.openDrizzleDb=C;exports.parseThreadPriorityFilter=qh;exports.parseThreadStateFilter=jh;exports.pushSchema=fp;exports.readThreadTitleMeta=fo;exports.reclaimTemporaryJournal=Iu;exports.resolveTaskHeartbeatHardStaleMs=Kn;exports.resolveTaskHeartbeatIntervalMs=zr;exports.resolveTaskHeartbeatStaleMs=Wt;exports.resolveTaskLogMigrationDbPath=so;exports.resolveTaskStopMethod=Ss;exports.runHeartbeatTick=gs;exports.runMigrations=Qt;exports.runMigrationsOnce=V;exports.runTaskLogMigration=jg;exports.runUsageBackfill=vh;exports.startTaskHeartbeat=Xf;exports.stopTask=Is;exports.stopTaskHeartbeat=Gd;exports.taskLogBackupName=Wg;exports.threadTitleSearchHaystack=Bh;exports.tryCheckpointTaskLogWal=er;
|
|
509
|
+
`),c=new Map(d.map((g,_)=>[g.id,_])),u=r.taskId===void 0?void 0:c.get(r.taskId),f=r.coversFromTaskId===void 0?void 0:c.get(r.coversFromTaskId),p=r.coversToTaskId===void 0?void 0:c.get(r.coversToTaskId);return i.filter(g=>{let _=c.get(g.covers_from_task_id),m=c.get(g.covers_to_task_id);if(_===void 0||m===void 0)return !1;let k=Math.min(_,m),T=Math.max(_,m);return !(u!==void 0&&(u<k||u>T)||f!==void 0&&T<f||p!==void 0&&k>p)})}catch(s){throw s instanceof exports.RepositoryError?s:new exports.RepositoryError("DB_ERROR","Failed to list active thread highlights",s)}finally{o.close();}}listHighlights(e,n,r){return this.listActiveHighlights(e,n,r)}getActiveHighlights(e,n,r){return this.listActiveHighlights(e,n,r)}};h();se();fe();ce();pe();ue();var di=class extends exports.BaseSqliteRepository{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=Se.join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=Se.dirname(n);Oa.existsSync(o)||Oa.mkdirSync(o,{recursive:true});}else if(!Oa.existsSync(n))throw new exports.RepositoryError("NOT_FOUND","Database not found");let r=C(n);if(e)try{V(r.db,n);}catch(o){throw r.close(),o}return r}insertSpan(e){let n=this.openHandle(true);try{n.db.insert(Tt).values(e).run();}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to insert span",r)}finally{n.close();}}findByTaskId(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.select().from(Tt).where(drizzleOrm.eq(Tt.task_id,e)).all()}catch(r){throw new exports.RepositoryError("DB_ERROR","Failed to find spans by task id",r)}finally{n.close();}}findById(e){if(!this.dbExists())return;let n=this.openHandle(false);try{return n.db.select().from(Tt).where(drizzleOrm.eq(Tt.id,e)).limit(1).get()??void 0}catch(r){throw new exports.RepositoryError("DB_ERROR","Failed to find span by id",r)}finally{n.close();}}};h();se();fe();ce();pe();ue();var ci=class extends exports.BaseSqliteRepository{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=Se.join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=Se.dirname(n);Oa.existsSync(o)||Oa.mkdirSync(o,{recursive:true});}else if(!Oa.existsSync(n))throw new exports.RepositoryError("NOT_FOUND","Database not found");let r=C(n);if(e)try{V(r.db,n);}catch(o){throw r.close(),o}return r}insertToolCall(e){let n=this.openHandle(true);try{n.db.insert(ut).values(e).run();}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to insert tool call",r)}finally{n.close();}}findByTaskId(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.select().from(ut).where(drizzleOrm.eq(ut.task_id,e)).all()}catch(r){throw new exports.RepositoryError("DB_ERROR","Failed to find tool calls by task id",r)}finally{n.close();}}aggregateByName(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.select({toolName:ut.tool_name,count:drizzleOrm.sql`count(*)`}).from(ut).where(drizzleOrm.eq(ut.task_id,e)).groupBy(ut.tool_name).all().map(r=>({toolName:r.toolName,count:r.count}))}catch(r){throw new exports.RepositoryError("DB_ERROR","Failed to aggregate tool calls by name",r)}finally{n.close();}}};h();se();fe();ce();pe();ue();var ui=class extends exports.BaseSqliteRepository{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=Se.join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=Se.dirname(n);Oa.existsSync(o)||Oa.mkdirSync(o,{recursive:true});}else if(!Oa.existsSync(n))throw new exports.RepositoryError("NOT_FOUND","Database not found");let r=C(n);if(e)try{V(r.db,n);}catch(o){throw r.close(),o}return r}ensureThreadExists(e,n){if(!e.db.select({id:w.id}).from(w).where(drizzleOrm.eq(w.id,n)).limit(1).get())throw new exports.RepositoryError("NOT_FOUND",`Thread not found: ${n}`)}findByThreadId(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{return this.ensureThreadExists(n,e),n.db.select().from(We).where(drizzleOrm.eq(We.thread_id,e)).orderBy(drizzleOrm.asc(We.seq)).all()}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to find boxes by thread id",r)}finally{n.close();}}findById(e,n){if(!this.dbExists())return;let r=this.openHandle(false);try{return r.db.select().from(We).where(drizzleOrm.and(drizzleOrm.eq(We.id,n),drizzleOrm.eq(We.thread_id,e))).limit(1).get()??void 0}catch(o){throw o instanceof exports.RepositoryError?o:new exports.RepositoryError("DB_ERROR","Failed to find box by id",o)}finally{r.close();}}insert(e){let n=this.openHandle(true);try{this.ensureThreadExists(n,e.threadId);try{n.db.insert(We).values({id:e.id,thread_id:e.threadId,seq:e.seq,first_task_id:e.first_task_id,mid_task_id:e.mid_task_id,last_task_id:e.last_task_id,task_count:e.task_count,summary:e.summary??null,source_tokens:e.source_tokens,summary_tokens:e.summary_tokens??null,created_at:e.created_at}).run();}catch(o){throw o instanceof Error&&/UNIQUE constraint failed/i.test(o.message)?new exports.RepositoryError("CONFLICT",`Duplicate seq ${String(e.seq)} for thread ${e.threadId}`,o):o}let r=n.db.select().from(We).where(drizzleOrm.eq(We.id,e.id)).limit(1).get();if(!r)throw new exports.RepositoryError("DB_ERROR","Insert did not return a row");return r}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to insert thread box",r)}finally{n.close();}}};h();se();fe();ce();pe();ue();var li=class extends exports.BaseSqliteRepository{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=Se.join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=Se.dirname(n);Oa.existsSync(o)||Oa.mkdirSync(o,{recursive:true});}else if(!Oa.existsSync(n))throw new exports.RepositoryError("NOT_FOUND","Database not found");let r=C(n);if(e)try{V(r.db,n);}catch(o){throw r.close(),o}return r}bulkInsert(e){if(e.length===0)return;let n=this.openHandle(true);try{n.db.transaction(r=>{for(let o of e)r.insert(nn).values({id:crypto.randomUUID(),path:o.path,method:o.method,status_code:o.statusCode,duration_ms:o.durationMs,ip:o.ip??null,request_headers:o.requestHeaders??null,response_headers:o.responseHeaders??null,request_body:o.requestBody??null,response_body:o.responseBody??null,query:o.query??null,user_id:o.userId??null,project_id:o.projectId??null,partition_key:o.partitionKey??"default",timestamp:o.timestamp??new Date().toISOString(),metadata:o.metadata??null}).run();});}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to bulk insert request logs",r)}finally{n.close();}}findRecent(e=100){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.select().from(nn).orderBy(drizzleOrm.desc(nn.timestamp)).limit(e).all()}catch(r){throw new exports.RepositoryError("DB_ERROR","Failed to find recent request logs",r)}finally{n.close();}}};h();se();fe();ce();pe();ue();function pu(t){return new Date(Math.floor(t/3e5)*3e5).toISOString()}var pi=class extends exports.BaseSqliteRepository{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=Se.join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=Se.dirname(n);Oa.existsSync(o)||Oa.mkdirSync(o,{recursive:true});}else if(!Oa.existsSync(n))throw new exports.RepositoryError("NOT_FOUND","Database not found");let r=C(n);if(e)try{V(r.db,n);}catch(o){throw r.close(),o}return r}upsert(e){let n=this.openHandle(true);try{let r=pu(e.bucketStartMs),o=e.accountRef??"default";n.db.insert(_e).values({id:e.id,provider:e.provider,account_ref:o,limit_window:e.limitWindow,bucket_start:r,captured_at:e.capturedAt,used_percent:e.usedPercent,remaining_percent:e.remainingPercent,resets_at:e.resetsAt??null,source:e.source,metadata:e.metadata??null}).onConflictDoUpdate({target:[_e.provider,_e.account_ref,_e.limit_window,_e.bucket_start],set:{captured_at:e.capturedAt,used_percent:e.usedPercent,remaining_percent:e.remainingPercent,resets_at:e.resetsAt??null,metadata:e.metadata??null}}).run();}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to upsert usage limit snapshot",r)}finally{n.close();}}getTrends(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{let r=n.db.select({provider:_e.provider,bucket_start:_e.bucket_start,used_percent:_e.used_percent,remaining_percent:_e.remaining_percent,resets_at:_e.resets_at}).from(_e).where(drizzleOrm.and(drizzleOrm.eq(_e.limit_window,e.window),drizzleOrm.gte(_e.bucket_start,e.fromIso),drizzleOrm.lte(_e.bucket_start,e.toIso))).orderBy(drizzleOrm.asc(_e.bucket_start)).all(),o=new Map;for(let s of r)o.has(s.provider)||o.set(s.provider,[]),o.get(s.provider).push({bucketStart:s.bucket_start,usedPercent:s.used_percent,remainingPercent:s.remaining_percent,resetsAt:s.resets_at??null});return Array.from(o.entries()).map(([s,i])=>({provider:s,points:i}))}catch(r){throw new exports.RepositoryError("DB_ERROR","Failed to get usage limit trends",r)}finally{n.close();}}};h();se();fe();ce();pe();ue();var fi=class extends exports.BaseSqliteRepository{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=Se.join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=Se.dirname(n);Oa.existsSync(o)||Oa.mkdirSync(o,{recursive:true});}else if(!Oa.existsSync(n))throw new exports.RepositoryError("NOT_FOUND","Database not found");let r=C(n);if(e)try{V(r.db,n);}catch(o){throw r.close(),o}return r}publish(e){let n=this.openHandle(true);try{n.db.insert(De).values({id:e.id,workspace_id:e.workspaceId,month:e.month,generated_at:e.generatedAt,source_range:e.sourceRange,tier:e.tier,total_tokens:e.totalTokens,total_cost_usd:e.totalCostUsd,payload:e.payload}).onConflictDoUpdate({target:[De.workspace_id,De.month],set:{generated_at:e.generatedAt,source_range:e.sourceRange,tier:e.tier,total_tokens:e.totalTokens,total_cost_usd:e.totalCostUsd,payload:e.payload}}).run();let r=n.db.select().from(De).where(drizzleOrm.and(drizzleOrm.eq(De.workspace_id,e.workspaceId),drizzleOrm.eq(De.month,e.month))).limit(1).get();if(!r)throw new exports.RepositoryError("DB_ERROR","Failed to read back published usage report");return r}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to publish usage report",r)}finally{n.close();}}findByMonth(e,n){if(!this.dbExists())return;let r=this.openHandle(false);try{return r.db.select().from(De).where(drizzleOrm.and(drizzleOrm.eq(De.workspace_id,e),drizzleOrm.eq(De.month,n))).limit(1).get()??void 0}catch(o){throw new exports.RepositoryError("DB_ERROR","Failed to find usage report",o)}finally{r.close();}}listByWorkspace(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.select().from(De).where(drizzleOrm.eq(De.workspace_id,e)).orderBy(drizzleOrm.desc(De.month)).all()}catch(r){throw new exports.RepositoryError("DB_ERROR","Failed to list usage reports",r)}finally{n.close();}}};h();se();fe();ce();pe();ue();var Tu=500,wu=50,gi=class extends exports.BaseSqliteRepository{dbPath;cap;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=Se.join(e.dbRoot,".crewx","crewx.db")),this.cap=e.cap??Tu;}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=Se.dirname(n);Oa.existsSync(o)||Oa.mkdirSync(o,{recursive:true});}else if(!Oa.existsSync(n))throw new exports.RepositoryError("NOT_FOUND","Database not found");let r=C(n);if(e)try{V(r.db,n);}catch(o){throw r.close(),o}return r}create(e){let n=this.openHandle(true);try{let r=$e("ntf"),o=new Date().toISOString();return n.db.insert(F).values({id:r,workspace_id:e.workspaceId,agent_id:e.agentId??null,task_id:e.taskId??null,thread_id:e.threadId??null,source:e.source??"agent",level:e.level??"info",title:e.title,body:e.body??null,target_user_id:e.targetUserId??null,created_at:o,metadata:e.metadata??null}).run(),this.enforceCap(n,e.workspaceId),{id:r}}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to create notification",r)}finally{n.close();}}enforceCap(e,n){let s=(e.db.select({count:drizzleOrm.sql`count(*)`}).from(F).where(drizzleOrm.eq(F.workspace_id,n)).get()?.count??0)-this.cap;if(s<=0)return;let d=e.db.select({id:F.id}).from(F).innerJoin(ie,drizzleOrm.eq(ie.notification_id,F.id)).where(drizzleOrm.eq(F.workspace_id,n)).groupBy(F.id).orderBy(drizzleOrm.asc(F.created_at)).limit(s).all().map(c=>c.id);d.length!==0&&(e.db.delete(ie).where(drizzleOrm.inArray(ie.notification_id,d)).run(),e.db.delete(F).where(drizzleOrm.inArray(F.id,d)).run());}list(e){if(!this.dbExists())return [];let n=e.limit??wu,r=this.openHandle(false);try{return r.db.select({id:F.id,workspace_id:F.workspace_id,agent_id:F.agent_id,task_id:F.task_id,thread_id:F.thread_id,source:F.source,level:F.level,title:F.title,body:F.body,target_user_id:F.target_user_id,created_at:F.created_at,metadata:F.metadata,read_at:ie.read_at}).from(F).leftJoin(ie,drizzleOrm.and(drizzleOrm.eq(ie.notification_id,F.id),drizzleOrm.eq(ie.user_id,e.userId))).where(drizzleOrm.eq(F.workspace_id,e.workspaceId)).orderBy(drizzleOrm.desc(F.created_at)).limit(n).all().map(s=>({...s,read_at:s.read_at??null,read:s.read_at!=null}))}catch(o){throw new exports.RepositoryError("DB_ERROR","Failed to list notifications",o)}finally{r.close();}}unreadCount(e){if(!this.dbExists())return 0;let n=this.openHandle(false);try{return n.db.select({count:drizzleOrm.sql`count(*)`}).from(F).leftJoin(ie,drizzleOrm.and(drizzleOrm.eq(ie.notification_id,F.id),drizzleOrm.eq(ie.user_id,e.userId))).where(drizzleOrm.and(drizzleOrm.eq(F.workspace_id,e.workspaceId),drizzleOrm.isNull(ie.notification_id))).get()?.count??0}catch(r){throw new exports.RepositoryError("DB_ERROR","Failed to count unread notifications",r)}finally{n.close();}}markRead(e){let n=this.openHandle(true);try{if(!n.db.select({id:F.id}).from(F).where(drizzleOrm.and(drizzleOrm.eq(F.id,e.notificationId),drizzleOrm.eq(F.workspace_id,e.workspaceId))).get())throw new exports.RepositoryError("NOT_FOUND","Notification not found in workspace");return n.db.insert(ie).values({notification_id:e.notificationId,user_id:e.userId,read_at:new Date().toISOString()}).onConflictDoNothing().run().changes>0}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to mark notification read",r)}finally{n.close();}}markAllRead(e){let n=this.openHandle(true);try{let r=n.db.select({id:F.id}).from(F).leftJoin(ie,drizzleOrm.and(drizzleOrm.eq(ie.notification_id,F.id),drizzleOrm.eq(ie.user_id,e.userId))).where(drizzleOrm.and(drizzleOrm.eq(F.workspace_id,e.workspaceId),drizzleOrm.isNull(ie.notification_id))).all();if(r.length===0)return 0;let o=new Date().toISOString();return n.db.transaction(s=>{for(let i of r)s.insert(ie).values({notification_id:i.id,user_id:e.userId,read_at:o}).onConflictDoNothing().run();}),r.length}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to mark all notifications read",r)}finally{n.close();}}};h();se();fe();ce();pe();ue();var Eu=50,_i=class extends exports.BaseSqliteRepository{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=Se.join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let o=Se.dirname(n);Oa.existsSync(o)||Oa.mkdirSync(o,{recursive:true});}else if(!Oa.existsSync(n))throw new exports.RepositoryError("NOT_FOUND","Database not found");let r=C(n);if(e)try{V(r.db,n);}catch(o){throw r.close(),o}return r}create(e){let n=this.openHandle(true);try{let r=new Date().toISOString(),o=[],s=e.map(i=>{let d=$e("sug");return o.push(d),{id:d,workspace_id:i.workspaceId,agent_id:i.agentId,task_id:i.taskId??null,type:i.type,status:i.status??"pending",payload:i.payload,applied_commit_sha:i.appliedCommitSha??null,created_at:r,updated_at:r}});return s.length>0&&n.db.insert(j).values(s).run(),{ids:o}}catch(r){throw r instanceof exports.RepositoryError?r:new exports.RepositoryError("DB_ERROR","Failed to create agent suggestions",r)}finally{n.close();}}findLatestSet(e,n){if(!this.dbExists())return [];let r=this.openHandle(false);try{let o=r.db.select({task_id:j.task_id}).from(j).where(drizzleOrm.and(drizzleOrm.eq(j.workspace_id,e),drizzleOrm.eq(j.agent_id,n))).orderBy(drizzleOrm.desc(j.created_at)).limit(1).get();if(!o)return [];let s=o.task_id===null?drizzleOrm.isNull(j.task_id):drizzleOrm.eq(j.task_id,o.task_id);return r.db.select().from(j).where(drizzleOrm.and(drizzleOrm.eq(j.workspace_id,e),drizzleOrm.eq(j.agent_id,n),s)).orderBy(drizzleOrm.asc(j.created_at)).all()}catch(o){throw new exports.RepositoryError("DB_ERROR","Failed to find latest agent suggestion set",o)}finally{r.close();}}findSetByTaskId(e,n,r){if(!this.dbExists())return [];let o=this.openHandle(false);try{return o.db.select().from(j).where(drizzleOrm.and(drizzleOrm.eq(j.workspace_id,e),drizzleOrm.eq(j.agent_id,n),drizzleOrm.eq(j.task_id,r))).orderBy(drizzleOrm.asc(j.created_at)).all()}catch(s){throw new exports.RepositoryError("DB_ERROR","Failed to find agent suggestion set by task id",s)}finally{o.close();}}findById(e,n,r){if(!this.dbExists())return null;let o=this.openHandle(false);try{return o.db.select().from(j).where(drizzleOrm.and(drizzleOrm.eq(j.workspace_id,e),drizzleOrm.eq(j.agent_id,n),drizzleOrm.eq(j.id,r))).get()??null}catch(s){throw new exports.RepositoryError("DB_ERROR","Failed to find agent suggestion by id",s)}finally{o.close();}}updateStatus(e,n,r){let o=this.openHandle(true);try{let s={status:n,updated_at:new Date().toISOString()};return r!==void 0&&(s.applied_commit_sha=r),o.db.update(j).set(s).where(drizzleOrm.eq(j.id,e)).run().changes>0}catch(s){throw s instanceof exports.RepositoryError?s:new exports.RepositoryError("DB_ERROR","Failed to update agent suggestion status",s)}finally{o.close();}}listByAgent(e,n,r=Eu){if(!this.dbExists())return [];let o=this.openHandle(false);try{return o.db.select().from(j).where(drizzleOrm.and(drizzleOrm.eq(j.workspace_id,e),drizzleOrm.eq(j.agent_id,n))).orderBy(drizzleOrm.desc(j.created_at)).limit(r).all()}catch(s){throw new exports.RepositoryError("DB_ERROR","Failed to list agent suggestions",s)}finally{o.close();}}findDismissed(e,n,r=20){if(!this.dbExists())return [];let o=this.openHandle(false);try{return o.db.select().from(j).where(drizzleOrm.and(drizzleOrm.eq(j.workspace_id,e),drizzleOrm.eq(j.agent_id,n),drizzleOrm.eq(j.status,"dismissed"))).orderBy(drizzleOrm.desc(j.updated_at)).limit(r).all()}catch(s){throw new exports.RepositoryError("DB_ERROR","Failed to find dismissed agent suggestions",s)}finally{o.close();}}};exports.AgentSuggestionRepository=_i;exports.BUILTIN_THREAD_STATES=Jc;exports.CommonCodeRepository=Do;exports.CommonCodeRepositoryError=ee;exports.DEFAULT_AGENT_SUGGESTION_LIST_LIMIT=Eu;exports.DEFAULT_NOTIFICATION_CAP=Tu;exports.DEFAULT_NOTIFICATION_LIST_LIMIT=wu;exports.DEFAULT_PROJECT_STAGES=ba;exports.DEFAULT_PROJECT_STAGE_KEYS=Bo;exports.NotificationRepository=gi;exports.ProjectRepository=Fo;exports.RequestLogRepository=li;exports.SpanRepository=di;exports.TASK_LOG_MIGRATION_EVENT_ROW_BYTES=kc;exports.TASK_LOG_MIGRATION_MIN_FREE_SPACE_BYTES=co;exports.TASK_LOG_MIGRATION_TERMINAL_STATUSES=mc;exports.THREAD_HIGHLIGHT_DELETION_REASON_REGENERATION_REPLACED=nu;exports.THREAD_HIGHLIGHT_REGENERATION_COMMIT_FAILED=ou;exports.THREAD_HIGHLIGHT_REGENERATION_DETECTION_FAILED=r_;exports.THREAD_HIGHLIGHT_REGENERATION_INTERRUPTED=ru;exports.THREAD_HIGHLIGHT_REGENERATION_NO_ELIGIBLE_TURNS=n_;exports.THREAD_PRIORITIES=Vc;exports.ThreadBoxRepository=ui;exports.ThreadHighlightConflictError=xn;exports.ThreadHighlightRegenerationConflictError=Ro;exports.ThreadHistoryConflictError=yo;exports.ThreadHistoryRepository=si;exports.ThreadRepository=Zs;exports.ThreadTitleMetadataPatchError=Qt;exports.ToolCallRepository=ci;exports.USAGE_BACKFILL_MAX_LATE_USAGE_AGE_MS=Oc;exports.USAGE_BACKFILL_TERMINAL_STATUSES=po;exports.UsageLimitSnapshotRepository=pi;exports.UsageReportRepository=fi;exports.WorkspaceRepository=$o;exports.calcBucketStart=pu;exports.classifyUsageAccountingReason=Mc;exports.customStateLabel=Yc;exports.generateCommonCodeId=Po;exports.hasRecordedUsage=In;exports.hasSufficientTaskLogMigrationFreeSpace=Rc;exports.hasThreadTitleKey=Kh;exports.isThreadPriority=dr;exports.isThreadState=cr;exports.matchesThreadTitleFilter=Xh;exports.mergeTerminalReason=oo;exports.mergeThreadTitleMeta=ni;exports.normalizeTaskStatus=Nt;exports.openDrizzleDb=C;exports.parseThreadPriorityFilter=Jh;exports.parseThreadStateFilter=Yh;exports.pushSchema=wp;exports.readThreadTitleMeta=mo;exports.reclaimTemporaryJournal=Cu;exports.resolveTaskHeartbeatHardStaleMs=Xn;exports.resolveTaskHeartbeatIntervalMs=Yr;exports.resolveTaskHeartbeatStaleMs=Kt;exports.resolveTaskLogMigrationDbPath=uo;exports.resolveTaskStopMethod=vs;exports.runHeartbeatTick=ks;exports.runMigrations=tn;exports.runMigrationsOnce=V;exports.runTaskLogMigration=Yg;exports.runUsageBackfill=Lh;exports.startTaskHeartbeat=og;exports.stopTask=Ns;exports.stopTaskHeartbeat=Yd;exports.taskLogBackupName=Xg;exports.threadTitleSearchHaystack=Vh;exports.tryCheckpointTaskLogWal=or;
|