@desplega.ai/agent-fs 0.13.3 → 0.13.4

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/cli.js CHANGED
@@ -212,12 +212,12 @@ ${It.toHex(s)}`}getCanonicalPath({path:e}){if(this.uriEscapePath){let t=[];for(l
212
212
  FROM chunk_vectors
213
213
  WHERE embedding MATCH ?
214
214
  ORDER BY distance
215
- LIMIT ?`).all(s,r),c=[],l=new Set;for(let u of a){let p=e.db.select().from(d.contentChunks).where(Fs(d.contentChunks.id,u.chunk_id)).get();if(!p||p.driveId!==e.driveId)continue;if(l.has(p.filePath))continue;l.add(p.filePath);let m=e.db.select().from(d.files).where(_b(Fs(d.files.path,p.filePath),Fs(d.files.driveId,e.driveId))).get();c.push({path:p.filePath,snippet:p.content.slice(0,200),author:m?.author,modifiedAt:m?.modifiedAt})}return c}function Cb(e,t,r){let n=t.split(/\s+/).filter(Boolean).map((o)=>`"${o}"`).join(" OR ");if(!n)return[];try{return zn(e.db,{pattern:n,driveId:e.driveId}).slice(0,r).map((s)=>({path:s.path,snippet:s.snippet}))}catch{return[]}}var wu=f(()=>{Z();at()});import{eq as Wn,and as Ob,or as Pb,isNull as kb}from"drizzle-orm";async function Eu(e,t){let r=[Wn(d.files.driveId,e.driveId),Wn(d.files.isDeleted,!1),Pb(Wn(d.files.embeddingStatus,"failed"),kb(d.files.embeddingStatus),Wn(d.files.embeddingStatus,"pending"))];if(t.path){let{like:c}=await import("drizzle-orm"),l=t.path.endsWith("/")?t.path:t.path+"/";r.push(c(d.files.path,l+"%"))}let n=e.db.select({path:d.files.path}).from(d.files).where(Ob(...r)).all(),o=0,s=0,i=0,a=3;for(let c=0;c<n.length;c+=a){let l=n.slice(c,c+a),u=await Promise.allSettled(l.map(async(p)=>{let m=L(e.orgId,e.driveId,p.path),g=await e.s3.getObject(m),v=g.contentType??be(p.path),E=At(g.body,v);if(E===null)return Jr(e,p.path),"skipped";if(it(e.db,{path:p.path,driveId:e.driveId,content:E}),e.embeddingProvider)return await ks(e.db,e.embeddingProvider,{path:p.path,driveId:e.driveId,content:E}),"reindexed";return"skipped"}));for(let p of u)if(p.status==="fulfilled")if(p.value==="reindexed")o++;else i++;else console.error("Reindex failed:",p.reason),s++}return{reindexed:o,failed:s,skipped:i}}var Iu=f(()=>{Z();ye();Yr();at();gr();Ue()});import{eq as Su,and as Nb,like as Db}from"drizzle-orm";async function Au(e,t){let r=St(t.path??"/"),n=L(e.orgId,e.driveId,r),{objects:o}=await e.s3.listObjects(n),s=e.db.select().from(d.files).where(Nb(Su(d.files.driveId,e.driveId),Db(d.files.path,r+"%"),Su(d.files.isDeleted,!1))).all(),i=new Map(s.map((c)=>[c.path,c])),a=[];for(let c of o){let l=c.key.slice(n.length);if(!l)continue;let u=l.split("/").filter(Boolean);if(u.length===0)continue;if(t.depth!==void 0&&u.length>t.depth)continue;let p=a;for(let m=0;m<u.length;m++){let g=u[m],v=m===u.length-1,E=!v||l.endsWith("/");if(E&&!v){let I=p.find((R)=>R.name===g&&R.type==="directory");if(!I)I={name:g,type:"directory",children:[]},p.push(I);if(!I.children)I.children=[];p=I.children}else if(E&&v){let I=p.find((R)=>R.name===g&&R.type==="directory");if(!I)I={name:g,type:"directory",children:[]},p.push(I)}else{let I=r+u.slice(0,m+1).join("/"),R=i.get(I),P={name:g,type:"file",size:R?.size??c.size};if(R?.author)P.author=R.author;if(R?.modifiedAt??c.lastModified)P.modifiedAt=R?.modifiedAt??c.lastModified;p.push(P)}}}return{tree:a}}var Ru=f(()=>{Z();ye()});import{eq as xu,and as Lb,like as $b}from"drizzle-orm";function Ub(e){let t="",r=0;while(r<e.length){let n=e[r];if(n==="*")if(e[r+1]==="*"){if(t+=".*",r+=2,e[r]==="/")r++}else t+="[^/]*",r++;else if(n==="?")t+="[^/]",r++;else if(".+^${}()|[]\\".includes(n))t+="\\"+n,r++;else t+=n,r++}return new RegExp("^"+t+"$")}async function _u(e,t){let r=t.path?St(t.path):"/",n=L(e.orgId,e.driveId,r),{objects:o}=await e.s3.listObjects(n),s=e.db.select().from(d.files).where(Lb(xu(d.files.driveId,e.driveId),$b(d.files.path,r+"%"),xu(d.files.isDeleted,!1))).all(),i=new Map(s.map((l)=>[l.path,l])),a=Ub(t.pattern),c=[];for(let l of o){let u=l.key.slice(n.length);if(!u||u.endsWith("/"))continue;if(a.test(u)){let p=r+u,m=i.get(p);c.push({path:p,size:m?.size??l.size,modifiedAt:m?.modifiedAt??l.lastModified})}}return{matches:c}}var Tu=f(()=>{Z();ye()});import{mkdtemp as Mb,rm as Cu,writeFile as Fb}from"fs/promises";import{tmpdir as jb}from"os";import{join as Hs}from"path";import{eq as js,and as Hb}from"drizzle-orm";function Ou(e){let r=(e.toLowerCase().split("/").pop()??"").split(".");if(r.length<2)return null;let n=!1,o=r.pop();if(o==="gz"&&r.length>=2)n=!0,o=r.pop();let s=qb[o];if(!s)return null;if(n&&!Du.has(s))return null;return{format:s,gzip:n}}function Pu(e,t){let r=process.env[e];if(!r)return t;let n=parseInt(r,10);return Number.isFinite(n)&&n>0?n:t}function Gb(){let e=process.env.AGENT_FS_SQL_MEMORY_LIMIT?.trim();if(e&&/^[0-9]+(\.[0-9]+)?\s*(B|KB|MB|GB|TB|KiB|MiB|GiB)?$/i.test(e))return e;return"512MB"}function Ve(e){return`'${e.replace(/'/g,"''")}'`}function ke(e){return`"${e.replace(/"/g,'""')}"`}function zb(e,t){switch(e){case"csv":return`read_csv(${Ve(t)})`;case"tsv":return`read_csv(${Ve(t)}, delim=E'\\t')`;case"parquet":return`read_parquet(${Ve(t)})`;case"json":case"ndjson":return`read_json_auto(${Ve(t)})`;case"xlsx":return`read_xlsx(${Ve(t)})`;default:throw new G(`Format ${e} is not file-readable`)}}function Wb(e,t){return/\.gz$/i.test(e)&&Du.has(t)}function ku(e,t){return e.db.select({path:d.files.path,size:d.files.size}).from(d.files).where(Hb(js(d.files.driveId,e.driveId),js(d.files.path,t),js(d.files.isDeleted,!1))).get()??null}function Nu(e,t){let r=ku(e,t);if(r)return r;let n=t.startsWith("/")?t.slice(1):"/"+t;return ku(e,n)}function Yb(e,t){let r=[],n=new Set;for(let[i,a]of Object.entries(t.tables??{})){if(!Xb.test(i))throw new G(`Invalid table name: ${i}`,{field:"tables",suggestion:"Table names must match [A-Za-z_][A-Za-z0-9_]*"});if(n.has(i.toLowerCase()))throw new G(`Duplicate table name: ${i}`,{field:"tables"});n.add(i.toLowerCase());let c=ft(typeof a==="string"?a:a.path),l=typeof a==="string"?void 0:a.format,u=Ou(c),p=l??u?.format;if(!p)throw new G(`Cannot infer format for ${c}`,{field:"tables",suggestion:'Pass an explicit format: { path, format: "csv" | "tsv" | "parquet" | "xlsx" | "json" | "ndjson" | "sqlite" | "duckdb" }'});let m=Nu(e,c);if(!m)throw new U(`File not found: ${c}`,{path:c});r.push({table:i,path:c,format:p,gzip:Wb(c,p),size:m.size})}let o=new Set,s=1;for(let i of t.query.matchAll(Lu)){let a=i[3],c=Ou(a);if(!c||!Kb.has(c.format))continue;let l=ft(a);if(o.has(l))continue;o.add(l);let u=Nu(e,l);if(!u)continue;let p=`doc_${s++}`;while(n.has(p))p=`doc_${s++}`;n.add(p),r.push({table:p,path:l,format:c.format,gzip:c.gzip,autoBound:!0,size:u.size})}return r}function Qr(e){if(e===null||e===void 0)return null;let t=typeof e;if(t==="bigint"){let n=e;return n>=BigInt(Number.MIN_SAFE_INTEGER)&&n<=BigInt(Number.MAX_SAFE_INTEGER)?Number(n):n.toString()}if(t==="number"||t==="string"||t==="boolean")return e;if(e instanceof Uint8Array)return`<blob ${e.byteLength} bytes>`;let r=e;if(typeof r.toDouble==="function")return r.toDouble();if(r.bytes instanceof Uint8Array)return`<blob ${r.bytes.byteLength} bytes>`;if(Array.isArray(r.items))return r.items.map(Qr);if(Array.isArray(r.entries))return r.entries.map((n)=>({key:Qr(n.key),value:Qr(n.value)}));if(r.entries&&typeof r.entries==="object"){let n={};for(let[o,s]of Object.entries(r.entries))n[o]=Qr(s);return n}return String(e)}function Jb(e,t,r){if(t)return new G(`Query timed out after ${r}ms`,{suggestion:"Simplify the query or reduce the amount of data it scans"});let n=e instanceof Error?e.message:String(e);if(/disabled by configuration|has been locked|external access/i.test(n))return new G(n,{suggestion:"Queries can only access bound documents. Reference documents by drive path (e.g. FROM '/data/sales.csv') or bind them via `tables` \u2014 and check the path exists with `ls`."});return new G(n)}async function $u(e,t){let r=Date.now(),n=t.maxRows??Bb,o=Pu("AGENT_FS_SQL_TIMEOUT_MS",30000),s=Pu("AGENT_FS_SQL_MAX_FILE_BYTES",268435456),i=Yb(e,t);for(let I of i)if(I.size>s)throw new G(`File too large for SQL: ${I.path} (${I.size} bytes, limit ${s})`,{suggestion:"Raise AGENT_FS_SQL_MAX_FILE_BYTES on the server if needed"});let{DuckDBInstance:a}=await import("@duckdb/node-api"),c=null,l=null,u=null,p=null,m=null,g=!1,v=new AbortController;m=setTimeout(()=>{g=!0,v.abort();for(let I of[u,p])try{I?.interrupt()}catch{}},o);let E=()=>{if(g)throw new G(`Query timed out after ${o}ms`,{suggestion:"Reduce the amount of data the query loads or scans"})};try{if(i.length>0){c=await Mb(Hs(jb(),"agent-fs-sql-"));for(let _=0;_<i.length;_++){let D=i[_],X=Vb[D.format]+(D.gzip?".gz":""),W=Hs(c,`t${_}${X}`);try{let x=await e.s3.getObject(L(e.orgId,e.driveId,D.path),void 0,{abortSignal:v.signal});await Fb(W,x.body)}catch(x){E();let k=x;if(k?.name==="NoSuchKey"||k?.$metadata?.httpStatusCode===404)throw new U(`File not found: ${D.path}`,{path:D.path});throw x}D.localFile=W,E()}}if(l=await a.create(":memory:"),u=await l.connect(),await u.run(`SET memory_limit=${Ve(Gb())}`),i.some((_)=>_.format==="xlsx"))await u.run("INSTALL excel"),await u.run("LOAD excel");let I=i.filter((_)=>_.format==="sqlite"),R=new Map;if(I.length>0&&c)R=await Qb(a,I,c,E,(_)=>{p=_});E();for(let _ of i)try{if(_.format==="sqlite"){await u.run(`CREATE SCHEMA ${ke(_.table)}`);for(let{table:D,parquetFile:X}of R.get(_.table)??[])await u.run(`CREATE TABLE ${ke(_.table)}.${ke(D)} AS SELECT * FROM read_parquet(${Ve(X)})`)}else if(_.format==="duckdb"){let D=`src_${_.table}`;await u.run(`ATTACH ${Ve(_.localFile)} AS ${ke(D)} (READ_ONLY)`);let W=(await u.runAndReadAll(`SELECT table_name FROM duckdb_tables() WHERE database_name = ${Ve(D)} AND schema_name = 'main'`)).getRowObjectsJson().map((x)=>String(x.table_name));if(W.length===0)throw new G(`No tables found in ${_.path}`);await u.run(`CREATE SCHEMA ${ke(_.table)}`);for(let x of W)await u.run(`CREATE TABLE ${ke(_.table)}.${ke(x)} AS SELECT * FROM ${ke(D)}.main.${ke(x)}`);await u.run(`DETACH ${ke(D)}`)}else await u.run(`CREATE TABLE ${ke(_.table)} AS SELECT * FROM ${zb(_.format,_.localFile)}`)}catch(D){if(D instanceof G)throw D;E();let X=D instanceof Error?D.message:String(D);throw new G(`Failed to load ${_.path} as ${_.format}: ${X}`)}if(E(),await u.run("SET enable_external_access=false"),await u.run("SET disabled_filesystems='LocalFileSystem'"),await u.run("SET lock_configuration=true"),c)await Cu(c,{recursive:!0,force:!0}),c=null;let P=new Map(i.filter((_)=>_.autoBound).map((_)=>[_.path,_.table])),ee=t.query.replace(Lu,(_,D,X,W)=>{let x=P.get(ft(W));return x?`${D} ${ke(x)}`:_});try{let _=await u.extractStatements(ee);if(_.count===0)throw new G("Query contains no statements",{field:"query"});for(let h=0;h<_.count-1;h++)await(await _.prepare(h)).run();let X=await(await _.prepare(_.count-1)).runAndReadUntil(n+1),W=new Map,x=X.columnNames().map((h)=>{let de=W.get(h)??0;return W.set(h,de+1),de===0?h:`${h}_${de+1}`}),k=X.columnTypes(),w=x.map((h,de)=>({name:h,type:String(k[de]??"UNKNOWN")})),we=X.getRows(),ce=we.length>n||!X.done,re=we.slice(0,n).map((h)=>{let de={};for(let z=0;z<x.length;z++)de[x[z]]=Qr(h[z]);return de}),b=i.map((h)=>({table:h.table,path:h.path,format:h.format}));return{columns:w,rows:re,rowCount:re.length,truncated:ce,files:b,elapsedMs:Date.now()-r}}catch(_){if(_ instanceof G)throw _;throw Jb(_,g,o)}}finally{if(m)clearTimeout(m);try{u?.closeSync()}catch{}try{l?.closeSync()}catch{}if(c)await Cu(c,{recursive:!0,force:!0}).catch(()=>{})}}async function Qb(e,t,r,n,o){let s=new Map,i=await e.create(":memory:"),a=await i.connect();o(a);try{await a.run("INSTALL sqlite"),await a.run("LOAD sqlite");for(let c=0;c<t.length;c++){let l=t[c];try{n(),await a.run(`ATTACH ${Ve(l.localFile)} AS src (TYPE sqlite, READ_ONLY)`);let p=(await a.runAndReadAll("SELECT table_name FROM duckdb_tables() WHERE database_name = 'src'")).getRowObjectsJson().map((g)=>String(g.table_name));if(p.length===0)throw new G(`No tables found in ${l.path}`);let m=[];for(let g=0;g<p.length;g++){n();let v=Hs(r,`sq_${c}_${g}.parquet`);await a.run(`COPY (SELECT * FROM src.${ke(p[g])}) TO ${Ve(v)} (FORMAT parquet)`),m.push({table:p[g],parquetFile:v})}s.set(l.table,m),await a.run("DETACH src")}catch(u){if(u instanceof G)throw u;n();let p=u instanceof Error?u.message:String(u);throw new G(`Failed to load ${l.path} as sqlite: ${p}`)}}}finally{o(null);try{a.closeSync()}catch{}try{i.closeSync()}catch{}}return s}var Bb=1000,qb,Kb,Du,Vb,Xb,Lu;var Uu=f(()=>{Z();ye();pe();qb={csv:"csv",tsv:"tsv",tab:"tsv",parquet:"parquet",xlsx:"xlsx",json:"json",jsonl:"ndjson",ndjson:"ndjson",db:"sqlite",sqlite:"sqlite",sqlite3:"sqlite",duckdb:"duckdb"},Kb=new Set(["csv","tsv","parquet","xlsx","json","ndjson"]),Du=new Set(["csv","tsv","json","ndjson"]),Vb={csv:".csv",tsv:".tsv",parquet:".parquet",xlsx:".xlsx",json:".json",ndjson:".ndjson",sqlite:".db",duckdb:".duckdb"};Xb=/^[A-Za-z_][A-Za-z0-9_]*$/,Lu=/\b(from|join)\s+(['"])([^'"]+\.[A-Za-z0-9]+(?:\.gz)?)\2/gi});function Zr(e,t,r,n){let o=n.startsWith("/")?n.slice(1):n;return`${e}/file/~/${t}/${r}/${o}`}async function Mu(e,t){let r=ft(t.path),n=L(e.orgId,e.driveId,r),o=t.expiresIn??86400;try{await e.s3.headObject(n)}catch(c){if(c?.name==="NotFound"||c?.name==="NoSuchKey"||c?.$metadata?.httpStatusCode===404)throw new U(`File not found: ${r}`,{path:r});throw c}if(!e.s3.capabilities.presignedUrls){if(!e.appUrl)throw new qe("signed-url",void 0,{suggestion:"This storage backend cannot mint presigned URLs and no app URL is configured to fall back to."});return{url:Zr(e.appUrl,e.orgId,e.driveId,r),path:r,expiresIn:0,expiresAt:"",kind:"app"}}let s=Vn(be(r)),i=r.split("/").pop()??"download";return{url:await e.s3.getPresignedUrl(n,o,s!=="application/octet-stream"?s:void 0,`attachment; filename*=UTF-8''${Gn(i)}`),path:r,expiresIn:o,expiresAt:new Date(Date.now()+o*1000).toISOString(),kind:"presigned"}}var Fu=f(()=>{ye();pe();Ue()});import{eq as F,and as Ge,sql as Bs,desc as ju,ne as Zb}from"drizzle-orm";function qs(e,t){e.db.insert(d.events).values({id:crypto.randomUUID(),orgId:e.orgId,type:t.type,resourceType:t.resourceType,resourceId:t.resourceId,actor:e.userId,target:t.target??null,status:"created",metadata:t.metadata?JSON.stringify(t.metadata):null,createdAt:new Date}).run()}function ew(e,t){let r=e.db.select({userId:d.driveMembers.userId}).from(d.driveMembers).where(Ge(F(d.driveMembers.driveId,e.driveId),Zb(d.driveMembers.userId,e.userId))).all();if(r.length===0)return;e.db.insert(d.events).values(r.map(({userId:n})=>({id:crypto.randomUUID(),orgId:e.orgId,type:"comment_notification",resourceType:"comment",resourceId:t.commentId,actor:e.userId,target:n,status:"created",metadata:JSON.stringify({path:t.path,parentId:t.parentId}),createdAt:t.createdAt}))).run()}function en(e,t){return e.db.select().from(d.comments).where(Ge(F(d.comments.id,t),F(d.comments.orgId,e.orgId),F(d.comments.driveId,e.driveId),F(d.comments.isDeleted,!1))).get()}function Yn(e){return{id:e.id,parentId:e.parentId??void 0,path:e.path,lineStart:e.lineStart??void 0,lineEnd:e.lineEnd??void 0,quotedContent:e.quotedContent??void 0,body:e.body,author:e.author,resolved:e.resolved??!1,resolvedBy:e.resolvedBy??void 0,resolvedAt:e.resolvedAt??void 0,fileVersionId:e.fileVersionId??void 0,replyCount:e.replyCount??0,createdAt:e.createdAt,updatedAt:e.updatedAt}}async function Jn(e,t){let r=new Date,n=crypto.randomUUID(),o=t.path;if(t.parentId){let i=en(e,t.parentId);if(!i)throw new U("Parent comment not found",{suggestion:"Check that the parent comment ID is correct and not deleted"});if(i.parentId)throw new G("Cannot reply to a reply \u2014 only root comments accept replies",{suggestion:"Reply to the root comment instead"});if(!o)o=i.path}if(!o)throw new G("path is required for root comments",{field:"path"});let s=e.db.select({id:d.fileVersions.id}).from(d.fileVersions).where(Ge(F(d.fileVersions.path,o),F(d.fileVersions.driveId,e.driveId))).orderBy(ju(d.fileVersions.id)).limit(1).get();return e.db.insert(d.comments).values({id:n,parentId:t.parentId??null,orgId:e.orgId,driveId:e.driveId,path:o,lineStart:t.lineStart??null,lineEnd:t.lineEnd??null,quotedContent:t.quotedContent??null,fileVersionId:s?.id??null,body:t.body,author:e.userId,resolved:!1,createdAt:r,updatedAt:r,isDeleted:!1}).run(),qs(e,{type:"comment_created",resourceType:"comment",resourceId:n,metadata:{path:o,parentId:t.parentId}}),ew(e,{commentId:n,path:o,parentId:t.parentId,createdAt:r}),{id:n,path:o,body:t.body,parentId:t.parentId,lineStart:t.lineStart,lineEnd:t.lineEnd,author:e.userId,createdAt:r}}async function Qn(e,t){let r=[F(d.comments.orgId,e.orgId),F(d.comments.driveId,e.driveId),F(d.comments.isDeleted,!1)];if(t.path)r.push(F(d.comments.path,t.path));if(t.parentId)r.push(F(d.comments.parentId,t.parentId));else if(t.parentId===void 0&&!t.resolved)r.push(Bs`${d.comments.parentId} IS NULL`),r.push(F(d.comments.resolved,!1));else if(t.parentId===void 0&&t.resolved)r.push(Bs`${d.comments.parentId} IS NULL`);if(t.orgId)r.push(F(d.comments.orgId,t.orgId));let n=t.limit??50,o=t.offset??0;return{comments:e.db.select().from(d.comments).where(Ge(...r)).orderBy(ju(d.comments.createdAt)).limit(n).offset(o).all().map((a)=>{let l=e.db.select().from(d.comments).where(Ge(F(d.comments.parentId,a.id),F(d.comments.orgId,e.orgId),F(d.comments.driveId,e.driveId),F(d.comments.isDeleted,!1))).orderBy(d.comments.createdAt).all().map((u)=>Yn({...u,replyCount:0}));return{...Yn({...a,replyCount:l.length}),replies:l}})}}async function Zn(e,t){let r=en(e,t.id);if(!r)throw new U("Comment not found",{suggestion:"Check that the comment ID is correct"});let n=e.db.select({count:Bs`count(*)`}).from(d.comments).where(Ge(F(d.comments.parentId,r.id),F(d.comments.orgId,e.orgId),F(d.comments.driveId,e.driveId),F(d.comments.isDeleted,!1))).get(),o=Yn({...r,replyCount:n?.count??0}),i=e.db.select().from(d.comments).where(Ge(F(d.comments.parentId,t.id),F(d.comments.orgId,e.orgId),F(d.comments.driveId,e.driveId),F(d.comments.isDeleted,!1))).orderBy(d.comments.createdAt).all().map((a)=>Yn({...a,replyCount:0}));return{comment:o,replies:i}}async function eo(e,t){let r=en(e,t.id);if(!r)throw new U("Comment not found",{suggestion:"Check that the comment ID is correct"});if(r.author!==e.userId)throw new Se("You can only edit your own comments",{suggestion:"Only the comment author can update it"});let n=new Date;return e.db.update(d.comments).set({body:t.body,updatedAt:n}).where(Ge(F(d.comments.id,t.id),F(d.comments.orgId,e.orgId),F(d.comments.driveId,e.driveId))).run(),{id:t.id,body:t.body,updatedAt:n}}async function to(e,t){let r=en(e,t.id);if(!r)throw new U("Comment not found",{suggestion:"Check that the comment ID is correct"});if(r.author!==e.userId)throw new Se("You can only delete your own comments",{suggestion:"Only the comment author can delete it"});let n=new Date;if(e.db.update(d.comments).set({isDeleted:!0,updatedAt:n}).where(Ge(F(d.comments.id,t.id),F(d.comments.orgId,e.orgId),F(d.comments.driveId,e.driveId))).run(),!r.parentId)e.db.update(d.comments).set({isDeleted:!0,updatedAt:n}).where(Ge(F(d.comments.parentId,t.id),F(d.comments.orgId,e.orgId),F(d.comments.driveId,e.driveId))).run();return qs(e,{type:"comment_deleted",resourceType:"comment",resourceId:t.id}),{deleted:!0}}async function ro(e,t){let r=en(e,t.id);if(!r)throw new U("Comment not found",{suggestion:"Check that the comment ID is correct"});if(r.parentId)throw new G("Cannot resolve a reply \u2014 only root comments can be resolved",{suggestion:"Resolve the parent comment instead"});let n=new Date,o=t.resolved?n:null,s=t.resolved?e.userId:null;return e.db.update(d.comments).set({resolved:t.resolved,resolvedBy:s,resolvedAt:o,updatedAt:n}).where(Ge(F(d.comments.id,t.id),F(d.comments.orgId,e.orgId),F(d.comments.driveId,e.driveId))).run(),qs(e,{type:t.resolved?"comment_resolved":"comment_reopened",resourceType:"comment",resourceId:t.id}),{id:t.id,resolved:t.resolved,resolvedBy:s??void 0,resolvedAt:o??void 0}}var Hu=f(()=>{Z();pe()});import{and as $t,count as tw,desc as rw,eq as me,inArray as Bu,ne as nw,sql as ow}from"drizzle-orm";function Ks(e){return[me(d.events.orgId,e.orgId),me(d.events.type,Ku),me(d.events.resourceType,"comment"),me(d.events.target,e.userId),me(d.comments.orgId,e.orgId),me(d.comments.driveId,e.driveId),me(d.comments.isDeleted,!1)]}async function Vu(e,t){let r=[...Ks(e),nw(d.events.status,"deleted")];if(t.unreadOnly)r.push(me(d.events.status,"created"));let n=e.db.select({id:d.events.id,commentId:d.comments.id,parentId:d.comments.parentId,path:d.comments.path,body:d.comments.body,actor:d.events.actor,createdAt:d.events.createdAt,status:d.events.status}).from(d.events).innerJoin(d.comments,$t(me(d.events.resourceId,d.comments.id),me(d.events.resourceType,"comment"))).where($t(...r)).orderBy(ow`CASE WHEN ${d.events.status} = 'created' THEN 0 ELSE 1 END`,rw(d.events.createdAt)).limit(t.limit??sw).offset(t.offset??0).all(),o=e.db.select({value:tw()}).from(d.events).innerJoin(d.comments,$t(me(d.events.resourceId,d.comments.id),me(d.events.resourceType,"comment"))).where($t(...Ks(e),me(d.events.status,"created"))).get();return{notifications:n.map((i)=>({id:i.id,commentId:i.commentId,parentId:i.parentId??void 0,path:i.path,body:i.body,actor:i.actor,createdAt:i.createdAt,read:i.status==="ack"})),unreadCount:Number(o?.value??0)}}async function Gu(e,t){if(t.all===!0&&t.ids&&t.ids.length>0)throw new G("Provide notification IDs or set all=true, not both",{suggestion:"Remove ids to mark all notifications, or omit all to mark selected IDs"});if(t.all!==!0&&(!t.ids||t.ids.length===0))throw new G("Provide notification IDs or set all=true",{suggestion:"Pass ids: [...] to mark selected notifications, or all: true"});let r=[...Ks(e),me(d.events.status,"created")];if(!t.all){let s=t.ids??[];if(s.length===0)return{markedRead:0};r.push(Bu(d.events.id,s))}let n=e.db.select({id:d.events.id}).from(d.events).innerJoin(d.comments,$t(me(d.events.resourceId,d.comments.id),me(d.events.resourceType,"comment"))).where($t(...r)).all().map((s)=>s.id),o=0;for(let s=0;s<n.length;s+=qu){let i=n.slice(s,s+qu),a=e.db.update(d.events).set({status:"ack"}).where($t(Bu(d.events.id,i),me(d.events.orgId,e.orgId),me(d.events.target,e.userId),me(d.events.type,Ku),me(d.events.status,"created"))).returning({id:d.events.id}).all();o+=a.length}return{markedRead:o}}var Ku="comment_notification",sw=50,qu=500;var zu=f(()=>{Z();pe()});import{z as y}from"zod";async function Re(e,t,r,n){let o=Vs[t];if(!o)throw Error(`Unknown operation: ${t}`);if(!n?.skipAuth){let a=Kr(t);Gr(e.db,{userId:e.userId,driveId:e.driveId,requiredRole:a})}let s=o.schema.parse(r),i=await o.handler(e,s);if(e.appUrl&&i&&typeof i==="object"){if("path"in i)i.appUrl=Zr(e.appUrl,e.orgId,e.driveId,i.path);else if("to"in i)i.appUrl=Zr(e.appUrl,e.orgId,e.driveId,i.to)}return i}function vr(){return Object.keys(Vs)}function ct(e){return Vs[e]}var Vs;var Gs=f(()=>{Xr();kl();Dl();$l();Ml();Hl();Kl();Gl();Wl();Jl();Zl();ru();su();du();pu();fu();hu();vu();wu();Iu();Ru();Tu();Uu();Fu();Hu();zu();Vs={write:{description:"Write or overwrite a file. Creates the file if it doesn't exist, or creates a new version. Use expectedVersion for optimistic concurrency. Returns { version, path, size }.",handler:Xn,schema:y.object({path:y.string(),content:y.string(),message:y.string().optional(),expectedVersion:y.number().int().optional()})},cat:{description:"Read file content with optional pagination via offset/limit; defaults to the first 200 lines when limit is omitted. Returns { content, totalLines, truncated } \u2014 always check `truncated` before trusting a row/line count. For a complete, byte-exact read (e.g. before parsing as CSV/JSON), use `download` instead.",handler:Nl,schema:y.object({path:y.string(),offset:y.number().int().min(0).optional(),limit:y.number().int().min(1).optional()})},edit:{description:"Replace a specific string in a file (surgical find-and-replace). Captures the edit intent as a diff summary in version history. Returns { version, path, changes }.",handler:Ll,schema:y.object({path:y.string(),old_string:y.string(),new_string:y.string(),message:y.string().optional(),expectedVersion:y.number().int().optional()})},append:{description:"Append content to the end of an existing file. Creates a new version. Returns { version, size }.",handler:Ul,schema:y.object({path:y.string(),content:y.string(),message:y.string().optional(),expectedVersion:y.number().int().optional()})},ls:{description:"List immediate children of a directory. Returns { entries } where each entry has name, type (file/directory), size, author, modifiedAt.",handler:jl,schema:y.object({path:y.string().optional()})},stat:{description:"Get file metadata without reading content. Returns path, size, contentType, author, currentVersion, createdAt, modifiedAt, isDeleted, embeddingStatus.",handler:ql,schema:y.object({path:y.string()})},rm:{description:"Delete a file. Removes from S3, cleans up FTS5 index and vector embeddings. Returns { path, deleted }.",handler:Vl,schema:y.object({path:y.string(),expectedVersion:y.number().int().optional()})},mv:{description:"Move or rename a file. Preserves version history at the new path. Returns { from, to, version }.",handler:Xl,schema:y.object({from:y.string(),to:y.string(),message:y.string().optional(),expectedVersion:y.number().int().optional()})},cp:{description:"Copy a file using server-side S3 copy. Creates a new version at the destination. Returns { from, to, version }.",handler:Yl,schema:y.object({from:y.string(),to:y.string(),expectedVersion:y.number().int().optional()})},tail:{description:"Read the last N lines of a file (default 20). Returns { content, totalLines, truncated }.",handler:Ql,schema:y.object({path:y.string(),lines:y.number().int().min(1).optional()})},log:{description:"Show version history for a file. Returns { versions } with version number, author, timestamp, operation type, message, and diff summary.",handler:tu,schema:y.object({path:y.string(),limit:y.number().int().min(1).optional()})},diff:{description:"Show the diff between two versions of a file. Specify v1 and v2 version numbers. Returns { changes } as add/remove/context hunks.",handler:ou,schema:y.object({path:y.string(),v1:y.number().int(),v2:y.number().int()})},revert:{description:"Revert a file to a previous version. Creates a new version with the old content. Returns { version, revertedTo }.",handler:cu,schema:y.object({path:y.string(),version:y.number().int(),expectedVersion:y.number().int().optional()})},recent:{description:"Show recent activity across the drive. Optionally filter by path prefix and time window (since). Returns { entries } with path and version details.",handler:uu,schema:y.object({path:y.string().optional(),since:y.coerce.date().optional(),limit:y.number().int().min(1).optional()})},grep:{description:"Search file content using regex pattern within a specific path. Returns matching lines with line numbers. Searches the FTS5 index, not S3 directly.",handler:mu,schema:y.object({pattern:y.string(),path:y.string()})},fts:{description:"Full-text search across all file content using FTS5 tokens. Different from grep (regex) and search (semantic). Returns { matches } with path, snippet, and rank.",handler:gu,schema:y.object({pattern:y.string(),path:y.string().optional()})},search:{description:"Hybrid search combining semantic (vector) and keyword (FTS5) matching. Best for natural language queries. Degrades to keyword-only without an embedding provider.",handler:bu,schema:y.object({query:y.string(),limit:y.number().int().min(1).optional()})},"vec-search":{description:"Vector-only semantic search using embeddings. Returns results ranked by cosine similarity. Requires an embedding provider (OPENAI_API_KEY, GEMINI_API_KEY, or local).",handler:yu,schema:y.object({query:y.string(),limit:y.number().int().min(1).optional()})},reindex:{description:"Re-index files with failed or missing FTS5/embedding entries. Optionally scope to a path prefix. Use after bulk writes or provider changes.",handler:Eu,schema:y.object({path:y.string().optional()})},tree:{description:"Recursively list all files and directories. Use depth to limit recursion. Returns a nested tree structure with name, type, size, and children.",handler:Au,schema:y.object({path:y.string().optional(),depth:y.number().int().min(1).optional()})},glob:{description:"Find files by name pattern. Use `*.md` for root-level files only, `**/*.md` for recursive matching across all subdirectories. Supports `*` (any chars except /), `?` (single char), `**` (any path depth). Optionally scope to a path prefix. Returns { matches } with path, size, and modifiedAt.",handler:_u,schema:y.object({pattern:y.string(),path:y.string().optional()})},sql:{description:"Run a DuckDB SQL query over documents stored in the drive. Reference documents directly by path string literal (e.g. SELECT * FROM '/data/sales.csv') or bind them as named tables via `tables` ({ name: path } or { name: { path, format } } to override format detection). Supports csv, tsv, parquet, xlsx, json, ndjson/jsonl (each also .gz except parquet/xlsx), sqlite (.db/.sqlite/.sqlite3, tables exposed as name.tablename), and .duckdb files. Queries run sandboxed: no filesystem or network access beyond the bound documents. Returns { columns, rows, rowCount, truncated, files, elapsedMs }.",handler:$u,schema:y.object({query:y.string(),tables:y.record(y.union([y.string(),y.object({path:y.string(),format:y.enum(["csv","tsv","parquet","xlsx","json","ndjson","sqlite","duckdb"]).optional()})])).optional(),maxRows:y.number().int().min(1).max(1e4).optional()})},"signed-url":{description:"Generate a temporary presigned URL for direct file download. Default expiry is 24 hours (86400 seconds). The URL requires no authentication. Returns { url, path, expiresIn, expiresAt }.",handler:Mu,schema:y.object({path:y.string(),expiresIn:y.number().int().min(60).max(604800).optional()})},"comment-add":{description:"Add a comment to a file. Supports line ranges and threading via parentId. Replies auto-resolve path from parent. Returns { id, path, body, author, createdAt }.",handler:Jn,schema:y.object({path:y.string().optional(),body:y.string(),parentId:y.string().optional(),lineStart:y.number().int().optional(),lineEnd:y.number().int().optional(),quotedContent:y.string().optional()})},"comment-list":{description:"List comments on a file. Filter by path, resolved state, or parentId. Defaults to unresolved root comments. Returns { comments } with inline replies.",handler:Qn,schema:y.object({path:y.string().optional(),parentId:y.string().optional(),resolved:y.boolean().optional(),orgId:y.string().optional(),limit:y.number().int().min(1).optional(),offset:y.number().int().min(0).optional()})},"comment-get":{description:"Get a single comment by ID with all its replies. Returns { comment, replies }.",handler:Zn,schema:y.object({id:y.string()})},"comment-update":{description:"Update a comment's body. Only the original author can update. Returns { id, body, updatedAt }.",handler:eo,schema:y.object({id:y.string(),body:y.string()})},"comment-delete":{description:"Soft-delete a comment. Only the original author can delete. Deleting a root comment also soft-deletes its replies. Returns { deleted }.",handler:to,schema:y.object({id:y.string()})},"comment-resolve":{description:"Resolve or reopen a root comment. Set resolved=true to resolve, resolved=false to reopen. Only root comments can be resolved. Returns { id, resolved, resolvedBy, resolvedAt }.",handler:ro,schema:y.object({id:y.string(),resolved:y.boolean()})},"comment-notification-list":{description:"List comment notifications for the current user in the active drive. Returns { notifications, unreadCount }.",handler:Vu,schema:y.object({unreadOnly:y.boolean().optional(),limit:y.number().int().min(1).max(100).optional(),offset:y.number().int().min(0).optional()})},"comment-notification-read":{description:"Mark selected comment notification IDs, or all comment notifications in the active drive, as read. Returns { markedRead }.",handler:Gu,schema:y.object({ids:y.array(y.string()).min(1).max(100).optional(),all:y.literal(!0).optional()})}}});import{eq as xe,and as tn}from"drizzle-orm";function Ut(e,t){let r=crypto.randomUUID(),n=new Date;if(e.insert(d.drives).values({id:r,orgId:t.orgId,name:t.name,isDefault:t.isDefault??!1,createdAt:n}).run(),t.creatorUserId)e.insert(d.driveMembers).values({driveId:r,userId:t.creatorUserId,role:"admin"}).run();return{id:r,name:t.name}}function zs(e,t){return e.select().from(d.drives).where(xe(d.drives.orgId,t)).all().map((r)=>({id:r.id,name:r.name,isDefault:r.isDefault}))}function ze(e,t,r){return e.select({id:d.drives.id,name:d.drives.name,isDefault:d.drives.isDefault}).from(d.drives).innerJoin(d.driveMembers,xe(d.driveMembers.driveId,d.drives.id)).where(tn(xe(d.drives.orgId,t),xe(d.driveMembers.userId,r))).all().map((n)=>({id:n.id,name:n.name,isDefault:n.isDefault}))}function Xs(e,t){let r=e.select().from(d.drives).where(xe(d.drives.id,t)).get();if(!r)return null;return{id:r.id,name:r.name,orgId:r.orgId,isDefault:r.isDefault}}function Mt(e,t){return e.select({userId:d.driveMembers.userId,email:d.users.email,role:d.driveMembers.role}).from(d.driveMembers).innerJoin(d.users,xe(d.driveMembers.userId,d.users.id)).where(xe(d.driveMembers.driveId,t)).all()}function Ft(e,t){if(!e.select({role:d.driveMembers.role}).from(d.driveMembers).where(tn(xe(d.driveMembers.driveId,t.driveId),xe(d.driveMembers.userId,t.userId))).get())throw Error("Member not found in drive");e.update(d.driveMembers).set({role:t.role}).where(tn(xe(d.driveMembers.driveId,t.driveId),xe(d.driveMembers.userId,t.userId))).run()}function jt(e,t){if(!e.select({role:d.driveMembers.role}).from(d.driveMembers).where(tn(xe(d.driveMembers.driveId,t.driveId),xe(d.driveMembers.userId,t.userId))).get())throw Error("Member not found in drive");e.delete(d.driveMembers).where(tn(xe(d.driveMembers.driveId,t.driveId),xe(d.driveMembers.userId,t.userId))).run()}function Ws(e,t){e.insert(d.driveMembers).values({driveId:t.driveId,userId:t.userId,role:t.role}).onConflictDoUpdate({target:[d.driveMembers.driveId,d.driveMembers.userId],set:{role:t.role}}).run()}var Ys=f(()=>{Z()});import{eq as oe,and as Rt,sql as Xu}from"drizzle-orm";function Ht(e,t){let r=crypto.randomUUID(),n=new Date;return e.insert(d.orgs).values({id:r,name:t.name,isPersonal:t.isPersonal??!1,createdAt:n}).run(),e.insert(d.orgMembers).values({orgId:r,userId:t.userId,role:"admin"}).run(),Ut(e,{orgId:r,name:"default",isDefault:!0,creatorUserId:t.userId}),{id:r,name:t.name}}function ve(e,t){return e.select({orgId:d.orgMembers.orgId,role:d.orgMembers.role,name:d.orgs.name,isPersonal:d.orgs.isPersonal}).from(d.orgMembers).innerJoin(d.orgs,oe(d.orgMembers.orgId,d.orgs.id)).where(oe(d.orgMembers.userId,t)).all().map((n)=>({id:n.orgId,name:n.name,role:n.role,isPersonal:n.isPersonal}))}function rn(e,t){let r=e.select().from(d.orgs).where(oe(d.orgs.id,t)).get();if(!r)return null;return{id:r.id,name:r.name,isPersonal:r.isPersonal}}function Bt(e,t){return e.select({userId:d.orgMembers.userId,email:d.users.email,role:d.orgMembers.role}).from(d.orgMembers).innerJoin(d.users,oe(d.orgMembers.userId,d.users.id)).where(oe(d.orgMembers.orgId,t)).all()}function qt(e,t){let r=e.select({role:d.orgMembers.role}).from(d.orgMembers).where(Rt(oe(d.orgMembers.orgId,t.orgId),oe(d.orgMembers.userId,t.userId))).get();if(!r)throw Error("Member not found in org");if(r.role==="admin"&&t.role!=="admin"){if(e.select({count:Xu`count(*)`}).from(d.orgMembers).where(Rt(oe(d.orgMembers.orgId,t.orgId),oe(d.orgMembers.role,"admin"))).get().count<=1)throw Error("Cannot remove the last admin from the org")}e.update(d.orgMembers).set({role:t.role}).where(Rt(oe(d.orgMembers.orgId,t.orgId),oe(d.orgMembers.userId,t.userId))).run()}function Kt(e,t){if(e.select({isPersonal:d.orgs.isPersonal}).from(d.orgs).where(oe(d.orgs.id,t.orgId)).get()?.isPersonal)throw Error("Cannot remove members from a personal org");let n=e.select({role:d.orgMembers.role}).from(d.orgMembers).where(Rt(oe(d.orgMembers.orgId,t.orgId),oe(d.orgMembers.userId,t.userId))).get();if(!n)throw Error("Member not found in org");if(n.role==="admin"){if(e.select({count:Xu`count(*)`}).from(d.orgMembers).where(Rt(oe(d.orgMembers.orgId,t.orgId),oe(d.orgMembers.role,"admin"))).get().count<=1)throw Error("Cannot remove the last admin from the org")}let o=e.select({id:d.drives.id}).from(d.drives).where(oe(d.drives.orgId,t.orgId)).all();for(let s of o)e.delete(d.driveMembers).where(Rt(oe(d.driveMembers.driveId,s.id),oe(d.driveMembers.userId,t.userId))).run();e.delete(d.orgMembers).where(Rt(oe(d.orgMembers.orgId,t.orgId),oe(d.orgMembers.userId,t.userId))).run()}function Vt(e,t){let r=e.select().from(d.users).where(oe(d.users.email,t.email)).get();if(!r)throw Error(`User with email ${t.email} not found`);e.insert(d.orgMembers).values({orgId:t.orgId,userId:r.id,role:t.role}).onConflictDoUpdate({target:[d.orgMembers.orgId,d.orgMembers.userId],set:{role:t.role}}).run();let n=e.select().from(d.drives).where(Rt(oe(d.drives.orgId,t.orgId),oe(d.drives.isDefault,!0))).get();if(n)e.insert(d.driveMembers).values({driveId:n.id,userId:r.id,role:t.role}).onConflictDoUpdate({target:[d.driveMembers.driveId,d.driveMembers.userId],set:{role:t.role}}).run()}var Js=f(()=>{Z();Ys()});import{eq as nn}from"drizzle-orm";function no(e){let t=new Bun.CryptoHasher("sha256");return t.update(e),t.digest("hex")}function Qs(){let e=new Uint8Array(32);return crypto.getRandomValues(e),`af_${Array.from(e,(r)=>r.toString(16).padStart(2,"0")).join("")}`}function iw(){return crypto.randomUUID()}function Xe(e,t){let r=iw(),n=Qs(),o=no(n),s=new Date;return e.insert(d.users).values({id:r,email:t.email,apiKeyHash:o,createdAt:s}).run(),Ht(e,{name:t.email.split("@")[0],userId:r,isPersonal:!0}),{user:{id:r,email:t.email},apiKey:n}}function Gt(e,t){let r=e.select().from(d.users).where(nn(d.users.id,t.userId)).get();if(!r)throw new U("User not found",{suggestion:"Check the user id"});let n=Qs(),o=no(n),s=new Date;return e.transaction((i)=>{i.update(d.users).set({apiKeyHash:o}).where(nn(d.users.id,t.userId)).run(),i.insert(d.events).values({id:crypto.randomUUID(),orgId:t.orgId,type:"api_key_reset",resourceType:"user",resourceId:t.userId,actor:t.actorId,target:t.userId,status:"created",metadata:JSON.stringify({method:t.actorId===t.userId?"self":"admin"}),createdAt:s}).run()}),{user:{id:r.id,email:r.email},apiKey:n}}function on(e,t){let r=Qs(),n=no(r);return e.transaction((o)=>{o.update(d.users).set({apiKeyHash:n}).where(nn(d.users.id,t)).run()}),{apiKey:r}}function We(e,t){let r=no(t),n=e.select().from(d.users).where(nn(d.users.apiKeyHash,r)).get();if(!n)return null;return{id:n.id,email:n.email}}function br(e,t){let r=e.select().from(d.users).where(nn(d.users.email,t)).get();if(!r)return null;return{id:r.id,email:r.email}}var Zs=f(()=>{Z();Js();pe()});import{eq as xt,and as ei}from"drizzle-orm";function Ce(e,t){if(t.driveId){let s=e.select().from(d.drives).where(xt(d.drives.id,t.driveId)).get();if(!s||t.orgId&&s.orgId!==t.orgId)throw new U(`Drive not found: ${t.driveId}`,{suggestion:t.orgId?"Check the driveId belongs to the org you are addressing":void 0});let i=Ke(e,t.userId,t.driveId);if(!i)throw new U(`Drive not found: ${t.driveId}`,{suggestion:t.orgId?"Check the driveId belongs to the org you are addressing":void 0});return{orgId:s.orgId,driveId:t.driveId,role:i}}if(t.orgId){let s=e.select().from(d.drives).where(ei(xt(d.drives.orgId,t.orgId),xt(d.drives.isDefault,!0))).get();if(!s)throw new U(`No default drive for org: ${t.orgId}`);let i=Ke(e,t.userId,s.id);if(!i)throw new U(`No default drive for org: ${t.orgId}`);return{orgId:t.orgId,driveId:s.id,role:i}}let r=e.select({orgId:d.orgMembers.orgId}).from(d.orgMembers).innerJoin(d.orgs,xt(d.orgMembers.orgId,d.orgs.id)).where(ei(xt(d.orgMembers.userId,t.userId),xt(d.orgs.isPersonal,!0))).get();if(!r)throw Error("No personal org found for user");let n=e.select().from(d.drives).where(ei(xt(d.drives.orgId,r.orgId),xt(d.drives.isDefault,!0))).get();if(!n)throw Error("No default drive found");let o=Ke(e,t.userId,n.id);if(!o)throw Error("You do not have access to your default drive");return{orgId:r.orgId,driveId:n.id,role:o}}var Wu=f(()=>{Z();pe();Xr()});function sn(e){let t=q();if(t.auth.apiKey){if(We(e,t.auth.apiKey))return{apiKey:t.auth.apiKey}}console.error("[agent-fs] No local user found, creating one...");let r=Xe(e,{email:"local@agent-fs.local"});return N("auth.apiKey",r.apiKey),console.error("[agent-fs] Local user created automatically."),{apiKey:r.apiKey}}var Yu=f(()=>{Pt();Zs()});var Ju=f(()=>{Zs();Js();Ys();Xr();Wu();Yu()});var Zu;var Qu=f(()=>{Zu={name:"agent-fs",version:"0.13.3",packageManager:"bun@1.4.0",private:!0,workspaces:["packages/*"],scripts:{typecheck:"tsc --build",test:"bun test packages/*/src/ live/src/lib/","test:coverage":"bun test --coverage packages/*/src/ live/src/lib/",build:"cd packages/cli && bun run build:npm","install-local":"bun run build && cd packages/cli && bun link","uninstall-local":"bun remove -g @desplega.ai/agent-fs && rm -f ~/.bun/bin/agent-fs","deploy:fly":"fly deploy -a agent-fs-taras"},devDependencies:{"@duckdb/node-api":"1.5.3-r.3","bun-types":"^1.4.0",msgpackr:"^1",typescript:"^5.7.0",yaml:"^2.8.2","zod-to-json-schema":"^3.25.1"},overrides:{chromadb:"npm:empty-npm-package@1.0.0","chromadb-default-embed":"npm:empty-npm-package@1.0.0","@xenova/transformers":"npm:empty-npm-package@1.0.0","tree-sitter-wasms":"npm:empty-npm-package@1.0.0","web-tree-sitter":"npm:empty-npm-package@1.0.0","cohere-ai":"npm:empty-npm-package@1.0.0",voyageai:"npm:empty-npm-package@1.0.0",ollama:"npm:empty-npm-package@1.0.0"}}});var Oe;var ti=f(()=>{Qu();Oe=Zu.version});var tp={};Jt(tp,{LocalEmbeddingProvider:()=>ep});import{join as cw}from"path";import{mkdirSync as dw,existsSync as lw}from"fs";class ep{name="local";dimensions=768;llama=null;model=null;embeddingContext=null;initPromise=null;async init(){if(this.embeddingContext)return;if(this.initPromise)return this.initPromise;return this.initPromise=this._doInit(),this.initPromise}async _doInit(){let{getLlama:e,resolveModelFile:t}=await import("node-llama-cpp");this.llama=await e();let r=cw(le(),"models");if(!lw(r))dw(r,{recursive:!0});console.error("[agent-fs] Resolving local embedding model...");let n=await t(uw,r);console.error("[agent-fs] Model ready:",n),this.model=await this.llama.loadModel({modelPath:n}),this.embeddingContext=await this.model.createEmbeddingContext()}async embed(e){await this.init();let t=await this.embeddingContext.getEmbeddingFor(e);return Array.from(t.vector)}async embedBatch(e){await this.init();let t=[];for(let r of e){let n=await this.embeddingContext.getEmbeddingFor(r);t.push(Array.from(n.vector))}return t}async dispose(){if(this.embeddingContext)await this.embeddingContext.dispose(),this.embeddingContext=null;if(this.model)await this.model.dispose(),this.model=null;this.initPromise=null}}var uw="hf:nomic-ai/nomic-embed-text-v1.5-GGUF:Q8_0";var rp=f(()=>{Pt()});var ri={};Jt(ri,{OpenAIEmbeddingProvider:()=>np});import pw from"openai";class np{name="openai";dimensions=768;client;constructor(e){this.client=new pw({apiKey:e})}async embed(e){return(await this.client.embeddings.create({model:"text-embedding-3-small",input:e,dimensions:768})).data[0].embedding}async embedBatch(e){return(await this.client.embeddings.create({model:"text-embedding-3-small",input:e,dimensions:768})).data.sort((r,n)=>r.index-n.index).map((r)=>r.embedding)}}var ni=()=>{};var oi={};Jt(oi,{GeminiEmbeddingProvider:()=>op});import{GoogleGenAI as mw}from"@google/genai";class op{name="gemini";dimensions=768;client;constructor(e){this.client=new mw({apiKey:e})}async embed(e){return(await this.client.models.embedContent({model:"gemini-embedding-001",contents:e,config:{outputDimensionality:768}})).embeddings[0].values}async embedBatch(e){let t=[];for(let r of e){let n=await this.client.models.embedContent({model:"gemini-embedding-001",contents:r,config:{outputDimensionality:768}});t.push(n.embeddings[0].values)}return t}}var si=()=>{};async function sp(e){switch(e.provider){case"local":{let{LocalEmbeddingProvider:t}=await Promise.resolve().then(() => (rp(),tp));return new t}case"openai":{if(!e.apiKey)throw Error("OpenAI API key required. Set embedding.apiKey in config.");let{OpenAIEmbeddingProvider:t}=await Promise.resolve().then(() => (ni(),ri));return new t(e.apiKey)}case"gemini":{if(!e.apiKey)throw Error("Gemini API key required. Set embedding.apiKey in config.");let{GeminiEmbeddingProvider:t}=await Promise.resolve().then(() => (si(),oi));return new t(e.apiKey)}default:throw Error(`Unknown embedding provider: ${e.provider}`)}}async function wr(e){if(process.env.OPENAI_API_KEY)try{let{OpenAIEmbeddingProvider:t}=await Promise.resolve().then(() => (ni(),ri));return new t(process.env.OPENAI_API_KEY)}catch(t){console.error("[agent-fs] Failed to load OpenAI provider:",t)}if(process.env.GEMINI_API_KEY)try{let{GeminiEmbeddingProvider:t}=await Promise.resolve().then(() => (si(),oi));return new t(process.env.GEMINI_API_KEY)}catch(t){console.error("[agent-fs] Failed to load Gemini provider:",t)}if(e?.provider&&e.provider!=="local"&&e.apiKey)try{return await sp(e)}catch(t){console.error("[agent-fs] Failed to create embedding provider from config:",t)}if(e?.provider==="local")try{return await sp(e)}catch(t){console.error("[agent-fs] Failed to load local embedding provider:",t)}return null}var ap,ip,cp=(e)=>typeof e==="string"?{...ip,name:e}:{...ip,...e};var oo=f(()=>{ap=Symbol("Let zodToJsonSchema decide on which parser to use"),ip={name:void 0,$refStrategy:"root",basePath:["#"],effectStrategy:"input",pipeStrategy:"all",dateStrategy:"format:date-time",mapStrategy:"entries",removeAdditionalStrategy:"passthrough",allowedAdditionalProperties:!0,rejectedAdditionalProperties:!1,definitionPath:"definitions",target:"jsonSchema7",strictUnions:!1,definitions:{},errorMessages:!1,markdownDescription:!1,patternStrategy:"escape",applyRegexFlags:!1,emailStrategy:"format:email",base64Strategy:"contentEncoding:base64",nameStrategy:"ref",openAiAnyTypeName:"OpenAiAnyType"}});var dp=(e)=>{let t=cp(e),r=t.name!==void 0?[...t.basePath,t.definitionPath,t.name]:t.basePath;return{...t,flags:{hasReferencedOpenAiAnyType:!1},currentPath:r,propertyPath:void 0,seen:new Map(Object.entries(t.definitions).map(([n,o])=>[o._def,{def:o._def,path:[...t.basePath,t.definitionPath,n],jsonSchema:void 0}]))}};var ii=f(()=>{oo()});function ai(e,t,r,n){if(!n?.errorMessages)return;if(r)e.errorMessage={...e.errorMessage,[t]:r}}function K(e,t,r,n,o){e[t]=r,ai(e,t,n,o)}var so=(e,t)=>{let r=0;for(;r<e.length&&r<t.length;r++)if(e[r]!==t[r])break;return[(e.length-r).toString(),...t.slice(r)].join("/")};function se(e){if(e.target!=="openAi")return{};let t=[...e.basePath,e.definitionPath,e.openAiAnyTypeName];return e.flags.hasReferencedOpenAiAnyType=!0,{$ref:e.$refStrategy==="relative"?so(t,e.currentPath):t.join("/")}}var Fe=()=>{};import{ZodFirstPartyTypeKind as fw}from"zod/v3";function lp(e,t){let r={type:"array"};if(e.type?._def&&e.type?._def?.typeName!==fw.ZodAny)r.items=O(e.type._def,{...t,currentPath:[...t.currentPath,"items"]});if(e.minLength)K(r,"minItems",e.minLength.value,e.minLength.message,t);if(e.maxLength)K(r,"maxItems",e.maxLength.value,e.maxLength.message,t);if(e.exactLength)K(r,"minItems",e.exactLength.value,e.exactLength.message,t),K(r,"maxItems",e.exactLength.value,e.exactLength.message,t);return r}var ci=f(()=>{fe()});function up(e,t){let r={type:"integer",format:"int64"};if(!e.checks)return r;for(let n of e.checks)switch(n.kind){case"min":if(t.target==="jsonSchema7")if(n.inclusive)K(r,"minimum",n.value,n.message,t);else K(r,"exclusiveMinimum",n.value,n.message,t);else{if(!n.inclusive)r.exclusiveMinimum=!0;K(r,"minimum",n.value,n.message,t)}break;case"max":if(t.target==="jsonSchema7")if(n.inclusive)K(r,"maximum",n.value,n.message,t);else K(r,"exclusiveMaximum",n.value,n.message,t);else{if(!n.inclusive)r.exclusiveMaximum=!0;K(r,"maximum",n.value,n.message,t)}break;case"multipleOf":K(r,"multipleOf",n.value,n.message,t);break}return r}var di=()=>{};function pp(){return{type:"boolean"}}function io(e,t){return O(e.type._def,t)}var ao=f(()=>{fe()});var mp=(e,t)=>O(e.innerType._def,t);var li=f(()=>{fe()});function ui(e,t,r){let n=r??t.dateStrategy;if(Array.isArray(n))return{anyOf:n.map((o,s)=>ui(e,t,o))};switch(n){case"string":case"format:date-time":return{type:"string",format:"date-time"};case"format:date":return{type:"string",format:"date"};case"integer":return gw(e,t)}}var gw=(e,t)=>{let r={type:"integer",format:"unix-time"};if(t.target==="openApi3")return r;for(let n of e.checks)switch(n.kind){case"min":K(r,"minimum",n.value,n.message,t);break;case"max":K(r,"maximum",n.value,n.message,t);break}return r};var pi=()=>{};function fp(e,t){return{...O(e.innerType._def,t),default:e.defaultValue()}}var mi=f(()=>{fe()});function gp(e,t){return t.effectStrategy==="input"?O(e.schema._def,t):se(t)}var fi=f(()=>{fe();Fe()});function hp(e){return{type:"string",enum:Array.from(e.values)}}function yp(e,t){let r=[O(e.left._def,{...t,currentPath:[...t.currentPath,"allOf","0"]}),O(e.right._def,{...t,currentPath:[...t.currentPath,"allOf","1"]})].filter((s)=>!!s),n=t.target==="jsonSchema2019-09"?{unevaluatedProperties:!1}:void 0,o=[];return r.forEach((s)=>{if(hw(s)){if(o.push(...s.allOf),s.unevaluatedProperties===void 0)n=void 0}else{let i=s;if("additionalProperties"in s&&s.additionalProperties===!1){let{additionalProperties:a,...c}=s;i=c}else n=void 0;o.push(i)}}),o.length?{allOf:o,...n}:void 0}var hw=(e)=>{if("type"in e&&e.type==="string")return!1;return"allOf"in e};var gi=f(()=>{fe()});function vp(e,t){let r=typeof e.value;if(r!=="bigint"&&r!=="number"&&r!=="boolean"&&r!=="string")return{type:Array.isArray(e.value)?"array":"object"};if(t.target==="openApi3")return{type:r==="bigint"?"integer":r,enum:[e.value]};return{type:r==="bigint"?"integer":r,const:e.value}}function co(e,t){let r={type:"string"};if(e.checks)for(let n of e.checks)switch(n.kind){case"min":K(r,"minLength",typeof r.minLength==="number"?Math.max(r.minLength,n.value):n.value,n.message,t);break;case"max":K(r,"maxLength",typeof r.maxLength==="number"?Math.min(r.maxLength,n.value):n.value,n.message,t);break;case"email":switch(t.emailStrategy){case"format:email":Je(r,"email",n.message,t);break;case"format:idn-email":Je(r,"idn-email",n.message,t);break;case"pattern:zod":_e(r,Ye.email,n.message,t);break}break;case"url":Je(r,"uri",n.message,t);break;case"uuid":Je(r,"uuid",n.message,t);break;case"regex":_e(r,n.regex,n.message,t);break;case"cuid":_e(r,Ye.cuid,n.message,t);break;case"cuid2":_e(r,Ye.cuid2,n.message,t);break;case"startsWith":_e(r,RegExp(`^${yi(n.value,t)}`),n.message,t);break;case"endsWith":_e(r,RegExp(`${yi(n.value,t)}$`),n.message,t);break;case"datetime":Je(r,"date-time",n.message,t);break;case"date":Je(r,"date",n.message,t);break;case"time":Je(r,"time",n.message,t);break;case"duration":Je(r,"duration",n.message,t);break;case"length":K(r,"minLength",typeof r.minLength==="number"?Math.max(r.minLength,n.value):n.value,n.message,t),K(r,"maxLength",typeof r.maxLength==="number"?Math.min(r.maxLength,n.value):n.value,n.message,t);break;case"includes":{_e(r,RegExp(yi(n.value,t)),n.message,t);break}case"ip":{if(n.version!=="v6")Je(r,"ipv4",n.message,t);if(n.version!=="v4")Je(r,"ipv6",n.message,t);break}case"base64url":_e(r,Ye.base64url,n.message,t);break;case"jwt":_e(r,Ye.jwt,n.message,t);break;case"cidr":{if(n.version!=="v6")_e(r,Ye.ipv4Cidr,n.message,t);if(n.version!=="v4")_e(r,Ye.ipv6Cidr,n.message,t);break}case"emoji":_e(r,Ye.emoji(),n.message,t);break;case"ulid":{_e(r,Ye.ulid,n.message,t);break}case"base64":{switch(t.base64Strategy){case"format:binary":{Je(r,"binary",n.message,t);break}case"contentEncoding:base64":{K(r,"contentEncoding","base64",n.message,t);break}case"pattern:zod":{_e(r,Ye.base64,n.message,t);break}}break}case"nanoid":_e(r,Ye.nanoid,n.message,t);case"toLowerCase":case"toUpperCase":case"trim":break;default:((o)=>{})(n)}return r}function yi(e,t){return t.patternStrategy==="escape"?vw(e):e}function vw(e){let t="";for(let r=0;r<e.length;r++){if(!yw.has(e[r]))t+="\\";t+=e[r]}return t}function Je(e,t,r,n){if(e.format||e.anyOf?.some((o)=>o.format)){if(!e.anyOf)e.anyOf=[];if(e.format){if(e.anyOf.push({format:e.format,...e.errorMessage&&n.errorMessages&&{errorMessage:{format:e.errorMessage.format}}}),delete e.format,e.errorMessage){if(delete e.errorMessage.format,Object.keys(e.errorMessage).length===0)delete e.errorMessage}}e.anyOf.push({format:t,...r&&n.errorMessages&&{errorMessage:{format:r}}})}else K(e,"format",t,r,n)}function _e(e,t,r,n){if(e.pattern||e.allOf?.some((o)=>o.pattern)){if(!e.allOf)e.allOf=[];if(e.pattern){if(e.allOf.push({pattern:e.pattern,...e.errorMessage&&n.errorMessages&&{errorMessage:{pattern:e.errorMessage.pattern}}}),delete e.pattern,e.errorMessage){if(delete e.errorMessage.pattern,Object.keys(e.errorMessage).length===0)delete e.errorMessage}}e.allOf.push({pattern:bp(t,n),...r&&n.errorMessages&&{errorMessage:{pattern:r}}})}else K(e,"pattern",bp(t,n),r,n)}function bp(e,t){if(!t.applyRegexFlags||!e.flags)return e.source;let r={i:e.flags.includes("i"),m:e.flags.includes("m"),s:e.flags.includes("s")},n=r.i?e.source.toLowerCase():e.source,o="",s=!1,i=!1,a=!1;for(let c=0;c<n.length;c++){if(s){o+=n[c],s=!1;continue}if(r.i){if(i){if(n[c].match(/[a-z]/)){if(a)o+=n[c],o+=`${n[c-2]}-${n[c]}`.toUpperCase(),a=!1;else if(n[c+1]==="-"&&n[c+2]?.match(/[a-z]/))o+=n[c],a=!0;else o+=`${n[c]}${n[c].toUpperCase()}`;continue}}else if(n[c].match(/[a-z]/)){o+=`[${n[c]}${n[c].toUpperCase()}]`;continue}}if(r.m){if(n[c]==="^"){o+=`(^|(?<=[\r
215
+ LIMIT ?`).all(s,r),c=[],l=new Set;for(let u of a){let p=e.db.select().from(d.contentChunks).where(Fs(d.contentChunks.id,u.chunk_id)).get();if(!p||p.driveId!==e.driveId)continue;if(l.has(p.filePath))continue;l.add(p.filePath);let m=e.db.select().from(d.files).where(_b(Fs(d.files.path,p.filePath),Fs(d.files.driveId,e.driveId))).get();c.push({path:p.filePath,snippet:p.content.slice(0,200),author:m?.author,modifiedAt:m?.modifiedAt})}return c}function Cb(e,t,r){let n=t.split(/\s+/).filter(Boolean).map((o)=>`"${o}"`).join(" OR ");if(!n)return[];try{return zn(e.db,{pattern:n,driveId:e.driveId}).slice(0,r).map((s)=>({path:s.path,snippet:s.snippet}))}catch{return[]}}var wu=f(()=>{Z();at()});import{eq as Wn,and as Ob,or as Pb,isNull as kb}from"drizzle-orm";async function Eu(e,t){let r=[Wn(d.files.driveId,e.driveId),Wn(d.files.isDeleted,!1),Pb(Wn(d.files.embeddingStatus,"failed"),kb(d.files.embeddingStatus),Wn(d.files.embeddingStatus,"pending"))];if(t.path){let{like:c}=await import("drizzle-orm"),l=t.path.endsWith("/")?t.path:t.path+"/";r.push(c(d.files.path,l+"%"))}let n=e.db.select({path:d.files.path}).from(d.files).where(Ob(...r)).all(),o=0,s=0,i=0,a=3;for(let c=0;c<n.length;c+=a){let l=n.slice(c,c+a),u=await Promise.allSettled(l.map(async(p)=>{let m=L(e.orgId,e.driveId,p.path),g=await e.s3.getObject(m),v=g.contentType??be(p.path),E=At(g.body,v);if(E===null)return Jr(e,p.path),"skipped";if(it(e.db,{path:p.path,driveId:e.driveId,content:E}),e.embeddingProvider)return await ks(e.db,e.embeddingProvider,{path:p.path,driveId:e.driveId,content:E}),"reindexed";return"skipped"}));for(let p of u)if(p.status==="fulfilled")if(p.value==="reindexed")o++;else i++;else console.error("Reindex failed:",p.reason),s++}return{reindexed:o,failed:s,skipped:i}}var Iu=f(()=>{Z();ye();Yr();at();gr();Ue()});import{eq as Su,and as Nb,like as Db}from"drizzle-orm";async function Au(e,t){let r=St(t.path??"/"),n=L(e.orgId,e.driveId,r),{objects:o}=await e.s3.listObjects(n),s=e.db.select().from(d.files).where(Nb(Su(d.files.driveId,e.driveId),Db(d.files.path,r+"%"),Su(d.files.isDeleted,!1))).all(),i=new Map(s.map((c)=>[c.path,c])),a=[];for(let c of o){let l=c.key.slice(n.length);if(!l)continue;let u=l.split("/").filter(Boolean);if(u.length===0)continue;if(t.depth!==void 0&&u.length>t.depth)continue;let p=a;for(let m=0;m<u.length;m++){let g=u[m],v=m===u.length-1,E=!v||l.endsWith("/");if(E&&!v){let I=p.find((R)=>R.name===g&&R.type==="directory");if(!I)I={name:g,type:"directory",children:[]},p.push(I);if(!I.children)I.children=[];p=I.children}else if(E&&v){let I=p.find((R)=>R.name===g&&R.type==="directory");if(!I)I={name:g,type:"directory",children:[]},p.push(I)}else{let I=r+u.slice(0,m+1).join("/"),R=i.get(I),P={name:g,type:"file",size:R?.size??c.size};if(R?.author)P.author=R.author;if(R?.modifiedAt??c.lastModified)P.modifiedAt=R?.modifiedAt??c.lastModified;p.push(P)}}}return{tree:a}}var Ru=f(()=>{Z();ye()});import{eq as xu,and as Lb,like as $b}from"drizzle-orm";function Ub(e){let t="",r=0;while(r<e.length){let n=e[r];if(n==="*")if(e[r+1]==="*"){if(t+=".*",r+=2,e[r]==="/")r++}else t+="[^/]*",r++;else if(n==="?")t+="[^/]",r++;else if(".+^${}()|[]\\".includes(n))t+="\\"+n,r++;else t+=n,r++}return new RegExp("^"+t+"$")}async function _u(e,t){let r=t.path?St(t.path):"/",n=L(e.orgId,e.driveId,r),{objects:o}=await e.s3.listObjects(n),s=e.db.select().from(d.files).where(Lb(xu(d.files.driveId,e.driveId),$b(d.files.path,r+"%"),xu(d.files.isDeleted,!1))).all(),i=new Map(s.map((l)=>[l.path,l])),a=Ub(t.pattern),c=[];for(let l of o){let u=l.key.slice(n.length);if(!u||u.endsWith("/"))continue;if(a.test(u)){let p=r+u,m=i.get(p);c.push({path:p,size:m?.size??l.size,modifiedAt:m?.modifiedAt??l.lastModified})}}return{matches:c}}var Tu=f(()=>{Z();ye()});import{mkdtemp as Mb,rm as Cu,writeFile as Fb}from"fs/promises";import{tmpdir as jb}from"os";import{join as Hs}from"path";import{eq as js,and as Hb}from"drizzle-orm";function Ou(e){let r=(e.toLowerCase().split("/").pop()??"").split(".");if(r.length<2)return null;let n=!1,o=r.pop();if(o==="gz"&&r.length>=2)n=!0,o=r.pop();let s=qb[o];if(!s)return null;if(n&&!Du.has(s))return null;return{format:s,gzip:n}}function Pu(e,t){let r=process.env[e];if(!r)return t;let n=parseInt(r,10);return Number.isFinite(n)&&n>0?n:t}function Gb(){let e=process.env.AGENT_FS_SQL_MEMORY_LIMIT?.trim();if(e&&/^[0-9]+(\.[0-9]+)?\s*(B|KB|MB|GB|TB|KiB|MiB|GiB)?$/i.test(e))return e;return"512MB"}function Ve(e){return`'${e.replace(/'/g,"''")}'`}function ke(e){return`"${e.replace(/"/g,'""')}"`}function zb(e,t){switch(e){case"csv":return`read_csv(${Ve(t)})`;case"tsv":return`read_csv(${Ve(t)}, delim=E'\\t')`;case"parquet":return`read_parquet(${Ve(t)})`;case"json":case"ndjson":return`read_json_auto(${Ve(t)})`;case"xlsx":return`read_xlsx(${Ve(t)})`;default:throw new G(`Format ${e} is not file-readable`)}}function Wb(e,t){return/\.gz$/i.test(e)&&Du.has(t)}function ku(e,t){return e.db.select({path:d.files.path,size:d.files.size}).from(d.files).where(Hb(js(d.files.driveId,e.driveId),js(d.files.path,t),js(d.files.isDeleted,!1))).get()??null}function Nu(e,t){let r=ku(e,t);if(r)return r;let n=t.startsWith("/")?t.slice(1):"/"+t;return ku(e,n)}function Yb(e,t){let r=[],n=new Set;for(let[i,a]of Object.entries(t.tables??{})){if(!Xb.test(i))throw new G(`Invalid table name: ${i}`,{field:"tables",suggestion:"Table names must match [A-Za-z_][A-Za-z0-9_]*"});if(n.has(i.toLowerCase()))throw new G(`Duplicate table name: ${i}`,{field:"tables"});n.add(i.toLowerCase());let c=ft(typeof a==="string"?a:a.path),l=typeof a==="string"?void 0:a.format,u=Ou(c),p=l??u?.format;if(!p)throw new G(`Cannot infer format for ${c}`,{field:"tables",suggestion:'Pass an explicit format: { path, format: "csv" | "tsv" | "parquet" | "xlsx" | "json" | "ndjson" | "sqlite" | "duckdb" }'});let m=Nu(e,c);if(!m)throw new U(`File not found: ${c}`,{path:c});r.push({table:i,path:c,format:p,gzip:Wb(c,p),size:m.size})}let o=new Set,s=1;for(let i of t.query.matchAll(Lu)){let a=i[3],c=Ou(a);if(!c||!Kb.has(c.format))continue;let l=ft(a);if(o.has(l))continue;o.add(l);let u=Nu(e,l);if(!u)continue;let p=`doc_${s++}`;while(n.has(p))p=`doc_${s++}`;n.add(p),r.push({table:p,path:l,format:c.format,gzip:c.gzip,autoBound:!0,size:u.size})}return r}function Qr(e){if(e===null||e===void 0)return null;let t=typeof e;if(t==="bigint"){let n=e;return n>=BigInt(Number.MIN_SAFE_INTEGER)&&n<=BigInt(Number.MAX_SAFE_INTEGER)?Number(n):n.toString()}if(t==="number"||t==="string"||t==="boolean")return e;if(e instanceof Uint8Array)return`<blob ${e.byteLength} bytes>`;let r=e;if(typeof r.toDouble==="function")return r.toDouble();if(r.bytes instanceof Uint8Array)return`<blob ${r.bytes.byteLength} bytes>`;if(Array.isArray(r.items))return r.items.map(Qr);if(Array.isArray(r.entries))return r.entries.map((n)=>({key:Qr(n.key),value:Qr(n.value)}));if(r.entries&&typeof r.entries==="object"){let n={};for(let[o,s]of Object.entries(r.entries))n[o]=Qr(s);return n}return String(e)}function Jb(e,t,r){if(t)return new G(`Query timed out after ${r}ms`,{suggestion:"Simplify the query or reduce the amount of data it scans"});let n=e instanceof Error?e.message:String(e);if(/disabled by configuration|has been locked|external access/i.test(n))return new G(n,{suggestion:"Queries can only access bound documents. Reference documents by drive path (e.g. FROM '/data/sales.csv') or bind them via `tables` \u2014 and check the path exists with `ls`."});return new G(n)}async function $u(e,t){let r=Date.now(),n=t.maxRows??Bb,o=Pu("AGENT_FS_SQL_TIMEOUT_MS",30000),s=Pu("AGENT_FS_SQL_MAX_FILE_BYTES",268435456),i=Yb(e,t);for(let I of i)if(I.size>s)throw new G(`File too large for SQL: ${I.path} (${I.size} bytes, limit ${s})`,{suggestion:"Raise AGENT_FS_SQL_MAX_FILE_BYTES on the server if needed"});let{DuckDBInstance:a}=await import("@duckdb/node-api"),c=null,l=null,u=null,p=null,m=null,g=!1,v=new AbortController;m=setTimeout(()=>{g=!0,v.abort();for(let I of[u,p])try{I?.interrupt()}catch{}},o);let E=()=>{if(g)throw new G(`Query timed out after ${o}ms`,{suggestion:"Reduce the amount of data the query loads or scans"})};try{if(i.length>0){c=await Mb(Hs(jb(),"agent-fs-sql-"));for(let _=0;_<i.length;_++){let D=i[_],X=Vb[D.format]+(D.gzip?".gz":""),W=Hs(c,`t${_}${X}`);try{let x=await e.s3.getObject(L(e.orgId,e.driveId,D.path),void 0,{abortSignal:v.signal});await Fb(W,x.body)}catch(x){E();let k=x;if(k?.name==="NoSuchKey"||k?.$metadata?.httpStatusCode===404)throw new U(`File not found: ${D.path}`,{path:D.path});throw x}D.localFile=W,E()}}if(l=await a.create(":memory:"),u=await l.connect(),await u.run(`SET memory_limit=${Ve(Gb())}`),i.some((_)=>_.format==="xlsx"))await u.run("INSTALL excel"),await u.run("LOAD excel");let I=i.filter((_)=>_.format==="sqlite"),R=new Map;if(I.length>0&&c)R=await Qb(a,I,c,E,(_)=>{p=_});E();for(let _ of i)try{if(_.format==="sqlite"){await u.run(`CREATE SCHEMA ${ke(_.table)}`);for(let{table:D,parquetFile:X}of R.get(_.table)??[])await u.run(`CREATE TABLE ${ke(_.table)}.${ke(D)} AS SELECT * FROM read_parquet(${Ve(X)})`)}else if(_.format==="duckdb"){let D=`src_${_.table}`;await u.run(`ATTACH ${Ve(_.localFile)} AS ${ke(D)} (READ_ONLY)`);let W=(await u.runAndReadAll(`SELECT table_name FROM duckdb_tables() WHERE database_name = ${Ve(D)} AND schema_name = 'main'`)).getRowObjectsJson().map((x)=>String(x.table_name));if(W.length===0)throw new G(`No tables found in ${_.path}`);await u.run(`CREATE SCHEMA ${ke(_.table)}`);for(let x of W)await u.run(`CREATE TABLE ${ke(_.table)}.${ke(x)} AS SELECT * FROM ${ke(D)}.main.${ke(x)}`);await u.run(`DETACH ${ke(D)}`)}else await u.run(`CREATE TABLE ${ke(_.table)} AS SELECT * FROM ${zb(_.format,_.localFile)}`)}catch(D){if(D instanceof G)throw D;E();let X=D instanceof Error?D.message:String(D);throw new G(`Failed to load ${_.path} as ${_.format}: ${X}`)}if(E(),await u.run("SET enable_external_access=false"),await u.run("SET disabled_filesystems='LocalFileSystem'"),await u.run("SET lock_configuration=true"),c)await Cu(c,{recursive:!0,force:!0}),c=null;let P=new Map(i.filter((_)=>_.autoBound).map((_)=>[_.path,_.table])),ee=t.query.replace(Lu,(_,D,X,W)=>{let x=P.get(ft(W));return x?`${D} ${ke(x)}`:_});try{let _=await u.extractStatements(ee);if(_.count===0)throw new G("Query contains no statements",{field:"query"});for(let h=0;h<_.count-1;h++)await(await _.prepare(h)).run();let X=await(await _.prepare(_.count-1)).runAndReadUntil(n+1),W=new Map,x=X.columnNames().map((h)=>{let de=W.get(h)??0;return W.set(h,de+1),de===0?h:`${h}_${de+1}`}),k=X.columnTypes(),w=x.map((h,de)=>({name:h,type:String(k[de]??"UNKNOWN")})),we=X.getRows(),ce=we.length>n||!X.done,re=we.slice(0,n).map((h)=>{let de={};for(let z=0;z<x.length;z++)de[x[z]]=Qr(h[z]);return de}),b=i.map((h)=>({table:h.table,path:h.path,format:h.format}));return{columns:w,rows:re,rowCount:re.length,truncated:ce,files:b,elapsedMs:Date.now()-r}}catch(_){if(_ instanceof G)throw _;throw Jb(_,g,o)}}finally{if(m)clearTimeout(m);try{u?.closeSync()}catch{}try{l?.closeSync()}catch{}if(c)await Cu(c,{recursive:!0,force:!0}).catch(()=>{})}}async function Qb(e,t,r,n,o){let s=new Map,i=await e.create(":memory:"),a=await i.connect();o(a);try{await a.run("INSTALL sqlite"),await a.run("LOAD sqlite");for(let c=0;c<t.length;c++){let l=t[c];try{n(),await a.run(`ATTACH ${Ve(l.localFile)} AS src (TYPE sqlite, READ_ONLY)`);let p=(await a.runAndReadAll("SELECT table_name FROM duckdb_tables() WHERE database_name = 'src'")).getRowObjectsJson().map((g)=>String(g.table_name));if(p.length===0)throw new G(`No tables found in ${l.path}`);let m=[];for(let g=0;g<p.length;g++){n();let v=Hs(r,`sq_${c}_${g}.parquet`);await a.run(`COPY (SELECT * FROM src.${ke(p[g])}) TO ${Ve(v)} (FORMAT parquet)`),m.push({table:p[g],parquetFile:v})}s.set(l.table,m),await a.run("DETACH src")}catch(u){if(u instanceof G)throw u;n();let p=u instanceof Error?u.message:String(u);throw new G(`Failed to load ${l.path} as sqlite: ${p}`)}}}finally{o(null);try{a.closeSync()}catch{}try{i.closeSync()}catch{}}return s}var Bb=1000,qb,Kb,Du,Vb,Xb,Lu;var Uu=f(()=>{Z();ye();pe();qb={csv:"csv",tsv:"tsv",tab:"tsv",parquet:"parquet",xlsx:"xlsx",json:"json",jsonl:"ndjson",ndjson:"ndjson",db:"sqlite",sqlite:"sqlite",sqlite3:"sqlite",duckdb:"duckdb"},Kb=new Set(["csv","tsv","parquet","xlsx","json","ndjson"]),Du=new Set(["csv","tsv","json","ndjson"]),Vb={csv:".csv",tsv:".tsv",parquet:".parquet",xlsx:".xlsx",json:".json",ndjson:".ndjson",sqlite:".db",duckdb:".duckdb"};Xb=/^[A-Za-z_][A-Za-z0-9_]*$/,Lu=/\b(from|join)\s+(['"])([^'"]+\.[A-Za-z0-9]+(?:\.gz)?)\2/gi});function Zr(e,t,r,n){let o=n.startsWith("/")?n.slice(1):n;return`${e}/file/~/${t}/${r}/${o}`}async function Mu(e,t){let r=ft(t.path),n=L(e.orgId,e.driveId,r),o=t.expiresIn??86400;try{await e.s3.headObject(n)}catch(c){if(c?.name==="NotFound"||c?.name==="NoSuchKey"||c?.$metadata?.httpStatusCode===404)throw new U(`File not found: ${r}`,{path:r});throw c}if(!e.s3.capabilities.presignedUrls){if(!e.appUrl)throw new qe("signed-url",void 0,{suggestion:"This storage backend cannot mint presigned URLs and no app URL is configured to fall back to."});return{url:Zr(e.appUrl,e.orgId,e.driveId,r),path:r,expiresIn:0,expiresAt:"",kind:"app"}}let s=Vn(be(r)),i=r.split("/").pop()??"download";return{url:await e.s3.getPresignedUrl(n,o,s!=="application/octet-stream"?s:void 0,`attachment; filename*=UTF-8''${Gn(i)}`),path:r,expiresIn:o,expiresAt:new Date(Date.now()+o*1000).toISOString(),kind:"presigned"}}var Fu=f(()=>{ye();pe();Ue()});import{eq as F,and as Ge,sql as Bs,desc as ju,ne as Zb}from"drizzle-orm";function qs(e,t){e.db.insert(d.events).values({id:crypto.randomUUID(),orgId:e.orgId,type:t.type,resourceType:t.resourceType,resourceId:t.resourceId,actor:e.userId,target:t.target??null,status:"created",metadata:t.metadata?JSON.stringify(t.metadata):null,createdAt:new Date}).run()}function ew(e,t){let r=e.db.select({userId:d.driveMembers.userId}).from(d.driveMembers).where(Ge(F(d.driveMembers.driveId,e.driveId),Zb(d.driveMembers.userId,e.userId))).all();if(r.length===0)return;e.db.insert(d.events).values(r.map(({userId:n})=>({id:crypto.randomUUID(),orgId:e.orgId,type:"comment_notification",resourceType:"comment",resourceId:t.commentId,actor:e.userId,target:n,status:"created",metadata:JSON.stringify({path:t.path,parentId:t.parentId}),createdAt:t.createdAt}))).run()}function en(e,t){return e.db.select().from(d.comments).where(Ge(F(d.comments.id,t),F(d.comments.orgId,e.orgId),F(d.comments.driveId,e.driveId),F(d.comments.isDeleted,!1))).get()}function Yn(e){return{id:e.id,parentId:e.parentId??void 0,path:e.path,lineStart:e.lineStart??void 0,lineEnd:e.lineEnd??void 0,quotedContent:e.quotedContent??void 0,body:e.body,author:e.author,resolved:e.resolved??!1,resolvedBy:e.resolvedBy??void 0,resolvedAt:e.resolvedAt??void 0,fileVersionId:e.fileVersionId??void 0,replyCount:e.replyCount??0,createdAt:e.createdAt,updatedAt:e.updatedAt}}async function Jn(e,t){let r=new Date,n=crypto.randomUUID(),o=t.path;if(t.parentId){let i=en(e,t.parentId);if(!i)throw new U("Parent comment not found",{suggestion:"Check that the parent comment ID is correct and not deleted"});if(i.parentId)throw new G("Cannot reply to a reply \u2014 only root comments accept replies",{suggestion:"Reply to the root comment instead"});if(!o)o=i.path}if(!o)throw new G("path is required for root comments",{field:"path"});let s=e.db.select({id:d.fileVersions.id}).from(d.fileVersions).where(Ge(F(d.fileVersions.path,o),F(d.fileVersions.driveId,e.driveId))).orderBy(ju(d.fileVersions.id)).limit(1).get();return e.db.insert(d.comments).values({id:n,parentId:t.parentId??null,orgId:e.orgId,driveId:e.driveId,path:o,lineStart:t.lineStart??null,lineEnd:t.lineEnd??null,quotedContent:t.quotedContent??null,fileVersionId:s?.id??null,body:t.body,author:e.userId,resolved:!1,createdAt:r,updatedAt:r,isDeleted:!1}).run(),qs(e,{type:"comment_created",resourceType:"comment",resourceId:n,metadata:{path:o,parentId:t.parentId}}),ew(e,{commentId:n,path:o,parentId:t.parentId,createdAt:r}),{id:n,path:o,body:t.body,parentId:t.parentId,lineStart:t.lineStart,lineEnd:t.lineEnd,author:e.userId,createdAt:r}}async function Qn(e,t){let r=[F(d.comments.orgId,e.orgId),F(d.comments.driveId,e.driveId),F(d.comments.isDeleted,!1)];if(t.path)r.push(F(d.comments.path,t.path));if(t.parentId)r.push(F(d.comments.parentId,t.parentId));else if(t.parentId===void 0&&!t.resolved)r.push(Bs`${d.comments.parentId} IS NULL`),r.push(F(d.comments.resolved,!1));else if(t.parentId===void 0&&t.resolved)r.push(Bs`${d.comments.parentId} IS NULL`);if(t.orgId)r.push(F(d.comments.orgId,t.orgId));let n=t.limit??50,o=t.offset??0;return{comments:e.db.select().from(d.comments).where(Ge(...r)).orderBy(ju(d.comments.createdAt)).limit(n).offset(o).all().map((a)=>{let l=e.db.select().from(d.comments).where(Ge(F(d.comments.parentId,a.id),F(d.comments.orgId,e.orgId),F(d.comments.driveId,e.driveId),F(d.comments.isDeleted,!1))).orderBy(d.comments.createdAt).all().map((u)=>Yn({...u,replyCount:0}));return{...Yn({...a,replyCount:l.length}),replies:l}})}}async function Zn(e,t){let r=en(e,t.id);if(!r)throw new U("Comment not found",{suggestion:"Check that the comment ID is correct"});let n=e.db.select({count:Bs`count(*)`}).from(d.comments).where(Ge(F(d.comments.parentId,r.id),F(d.comments.orgId,e.orgId),F(d.comments.driveId,e.driveId),F(d.comments.isDeleted,!1))).get(),o=Yn({...r,replyCount:n?.count??0}),i=e.db.select().from(d.comments).where(Ge(F(d.comments.parentId,t.id),F(d.comments.orgId,e.orgId),F(d.comments.driveId,e.driveId),F(d.comments.isDeleted,!1))).orderBy(d.comments.createdAt).all().map((a)=>Yn({...a,replyCount:0}));return{comment:o,replies:i}}async function eo(e,t){let r=en(e,t.id);if(!r)throw new U("Comment not found",{suggestion:"Check that the comment ID is correct"});if(r.author!==e.userId)throw new Se("You can only edit your own comments",{suggestion:"Only the comment author can update it"});let n=new Date;return e.db.update(d.comments).set({body:t.body,updatedAt:n}).where(Ge(F(d.comments.id,t.id),F(d.comments.orgId,e.orgId),F(d.comments.driveId,e.driveId))).run(),{id:t.id,body:t.body,updatedAt:n}}async function to(e,t){let r=en(e,t.id);if(!r)throw new U("Comment not found",{suggestion:"Check that the comment ID is correct"});if(r.author!==e.userId)throw new Se("You can only delete your own comments",{suggestion:"Only the comment author can delete it"});let n=new Date;if(e.db.update(d.comments).set({isDeleted:!0,updatedAt:n}).where(Ge(F(d.comments.id,t.id),F(d.comments.orgId,e.orgId),F(d.comments.driveId,e.driveId))).run(),!r.parentId)e.db.update(d.comments).set({isDeleted:!0,updatedAt:n}).where(Ge(F(d.comments.parentId,t.id),F(d.comments.orgId,e.orgId),F(d.comments.driveId,e.driveId))).run();return qs(e,{type:"comment_deleted",resourceType:"comment",resourceId:t.id}),{deleted:!0}}async function ro(e,t){let r=en(e,t.id);if(!r)throw new U("Comment not found",{suggestion:"Check that the comment ID is correct"});if(r.parentId)throw new G("Cannot resolve a reply \u2014 only root comments can be resolved",{suggestion:"Resolve the parent comment instead"});let n=new Date,o=t.resolved?n:null,s=t.resolved?e.userId:null;return e.db.update(d.comments).set({resolved:t.resolved,resolvedBy:s,resolvedAt:o,updatedAt:n}).where(Ge(F(d.comments.id,t.id),F(d.comments.orgId,e.orgId),F(d.comments.driveId,e.driveId))).run(),qs(e,{type:t.resolved?"comment_resolved":"comment_reopened",resourceType:"comment",resourceId:t.id}),{id:t.id,resolved:t.resolved,resolvedBy:s??void 0,resolvedAt:o??void 0}}var Hu=f(()=>{Z();pe()});import{and as $t,count as tw,desc as rw,eq as me,inArray as Bu,ne as nw,sql as ow}from"drizzle-orm";function Ks(e){return[me(d.events.orgId,e.orgId),me(d.events.type,Ku),me(d.events.resourceType,"comment"),me(d.events.target,e.userId),me(d.comments.orgId,e.orgId),me(d.comments.driveId,e.driveId),me(d.comments.isDeleted,!1)]}async function Vu(e,t){let r=[...Ks(e),nw(d.events.status,"deleted")];if(t.unreadOnly)r.push(me(d.events.status,"created"));let n=e.db.select({id:d.events.id,commentId:d.comments.id,parentId:d.comments.parentId,path:d.comments.path,body:d.comments.body,actor:d.events.actor,createdAt:d.events.createdAt,status:d.events.status}).from(d.events).innerJoin(d.comments,$t(me(d.events.resourceId,d.comments.id),me(d.events.resourceType,"comment"))).where($t(...r)).orderBy(ow`CASE WHEN ${d.events.status} = 'created' THEN 0 ELSE 1 END`,rw(d.events.createdAt)).limit(t.limit??sw).offset(t.offset??0).all(),o=e.db.select({value:tw()}).from(d.events).innerJoin(d.comments,$t(me(d.events.resourceId,d.comments.id),me(d.events.resourceType,"comment"))).where($t(...Ks(e),me(d.events.status,"created"))).get();return{notifications:n.map((i)=>({id:i.id,commentId:i.commentId,parentId:i.parentId??void 0,path:i.path,body:i.body,actor:i.actor,createdAt:i.createdAt,read:i.status==="ack"})),unreadCount:Number(o?.value??0)}}async function Gu(e,t){if(t.all===!0&&t.ids&&t.ids.length>0)throw new G("Provide notification IDs or set all=true, not both",{suggestion:"Remove ids to mark all notifications, or omit all to mark selected IDs"});if(t.all!==!0&&(!t.ids||t.ids.length===0))throw new G("Provide notification IDs or set all=true",{suggestion:"Pass ids: [...] to mark selected notifications, or all: true"});let r=[...Ks(e),me(d.events.status,"created")];if(!t.all){let s=t.ids??[];if(s.length===0)return{markedRead:0};r.push(Bu(d.events.id,s))}let n=e.db.select({id:d.events.id}).from(d.events).innerJoin(d.comments,$t(me(d.events.resourceId,d.comments.id),me(d.events.resourceType,"comment"))).where($t(...r)).all().map((s)=>s.id),o=0;for(let s=0;s<n.length;s+=qu){let i=n.slice(s,s+qu),a=e.db.update(d.events).set({status:"ack"}).where($t(Bu(d.events.id,i),me(d.events.orgId,e.orgId),me(d.events.target,e.userId),me(d.events.type,Ku),me(d.events.status,"created"))).returning({id:d.events.id}).all();o+=a.length}return{markedRead:o}}var Ku="comment_notification",sw=50,qu=500;var zu=f(()=>{Z();pe()});import{z as y}from"zod";async function Re(e,t,r,n){let o=Vs[t];if(!o)throw Error(`Unknown operation: ${t}`);if(!n?.skipAuth){let a=Kr(t);Gr(e.db,{userId:e.userId,driveId:e.driveId,requiredRole:a})}let s=o.schema.parse(r),i=await o.handler(e,s);if(e.appUrl&&i&&typeof i==="object"){if("path"in i)i.appUrl=Zr(e.appUrl,e.orgId,e.driveId,i.path);else if("to"in i)i.appUrl=Zr(e.appUrl,e.orgId,e.driveId,i.to)}return i}function vr(){return Object.keys(Vs)}function ct(e){return Vs[e]}var Vs;var Gs=f(()=>{Xr();kl();Dl();$l();Ml();Hl();Kl();Gl();Wl();Jl();Zl();ru();su();du();pu();fu();hu();vu();wu();Iu();Ru();Tu();Uu();Fu();Hu();zu();Vs={write:{description:"Write or overwrite a file. Creates the file if it doesn't exist, or creates a new version. Use expectedVersion for optimistic concurrency. Returns { version, path, size }.",handler:Xn,schema:y.object({path:y.string(),content:y.string(),message:y.string().optional(),expectedVersion:y.number().int().optional()})},cat:{description:"Read file content with optional pagination via offset/limit; defaults to the first 200 lines when limit is omitted. Returns { content, totalLines, truncated } \u2014 always check `truncated` before trusting a row/line count. For a complete, byte-exact read (e.g. before parsing as CSV/JSON), use `download` instead.",handler:Nl,schema:y.object({path:y.string(),offset:y.number().int().min(0).optional(),limit:y.number().int().min(1).optional()})},edit:{description:"Replace a specific string in a file (surgical find-and-replace). Captures the edit intent as a diff summary in version history. Returns { version, path, changes }.",handler:Ll,schema:y.object({path:y.string(),old_string:y.string(),new_string:y.string(),message:y.string().optional(),expectedVersion:y.number().int().optional()})},append:{description:"Append content to the end of an existing file. Creates a new version. Returns { version, size }.",handler:Ul,schema:y.object({path:y.string(),content:y.string(),message:y.string().optional(),expectedVersion:y.number().int().optional()})},ls:{description:"List immediate children of a directory. Returns { entries } where each entry has name, type (file/directory), size, author, modifiedAt.",handler:jl,schema:y.object({path:y.string().optional()})},stat:{description:"Get file metadata without reading content. Returns path, size, contentType, author, currentVersion, createdAt, modifiedAt, isDeleted, embeddingStatus.",handler:ql,schema:y.object({path:y.string()})},rm:{description:"Delete a file. Removes from S3, cleans up FTS5 index and vector embeddings. Returns { path, deleted }.",handler:Vl,schema:y.object({path:y.string(),expectedVersion:y.number().int().optional()})},mv:{description:"Move or rename a file. Preserves version history at the new path. Returns { from, to, version }.",handler:Xl,schema:y.object({from:y.string(),to:y.string(),message:y.string().optional(),expectedVersion:y.number().int().optional()})},cp:{description:"Copy a file using server-side S3 copy. Creates a new version at the destination. Returns { from, to, version }.",handler:Yl,schema:y.object({from:y.string(),to:y.string(),expectedVersion:y.number().int().optional()})},tail:{description:"Read the last N lines of a file (default 20). Returns { content, totalLines, truncated }.",handler:Ql,schema:y.object({path:y.string(),lines:y.number().int().min(1).optional()})},log:{description:"Show version history for a file. Returns { versions } with version number, author, timestamp, operation type, message, and diff summary.",handler:tu,schema:y.object({path:y.string(),limit:y.number().int().min(1).optional()})},diff:{description:"Show the diff between two versions of a file. Specify v1 and v2 version numbers. Returns { changes } as add/remove/context hunks.",handler:ou,schema:y.object({path:y.string(),v1:y.number().int(),v2:y.number().int()})},revert:{description:"Revert a file to a previous version. Creates a new version with the old content. Returns { version, revertedTo }.",handler:cu,schema:y.object({path:y.string(),version:y.number().int(),expectedVersion:y.number().int().optional()})},recent:{description:"Show recent activity across the drive. Optionally filter by path prefix and time window (since). Returns { entries } with path and version details.",handler:uu,schema:y.object({path:y.string().optional(),since:y.coerce.date().optional(),limit:y.number().int().min(1).optional()})},grep:{description:"Search file content using regex pattern within a specific path. Returns matching lines with line numbers. Searches the FTS5 index, not S3 directly.",handler:mu,schema:y.object({pattern:y.string(),path:y.string()})},fts:{description:"Full-text search across all file content using FTS5 tokens. Different from grep (regex) and search (semantic). Returns { matches } with path, snippet, and rank.",handler:gu,schema:y.object({pattern:y.string(),path:y.string().optional()})},search:{description:"Hybrid search combining semantic (vector) and keyword (FTS5) matching. Best for natural language queries. Degrades to keyword-only without an embedding provider.",handler:bu,schema:y.object({query:y.string(),limit:y.number().int().min(1).optional()})},"vec-search":{description:"Vector-only semantic search using embeddings. Returns results ranked by cosine similarity. Requires an embedding provider (OPENAI_API_KEY, GEMINI_API_KEY, or local).",handler:yu,schema:y.object({query:y.string(),limit:y.number().int().min(1).optional()})},reindex:{description:"Re-index files with failed or missing FTS5/embedding entries. Optionally scope to a path prefix. Use after bulk writes or provider changes.",handler:Eu,schema:y.object({path:y.string().optional()})},tree:{description:"Recursively list all files and directories. Use depth to limit recursion. Returns a nested tree structure with name, type, size, and children.",handler:Au,schema:y.object({path:y.string().optional(),depth:y.number().int().min(1).optional()})},glob:{description:"Find files by name pattern. Use `*.md` for root-level files only, `**/*.md` for recursive matching across all subdirectories. Supports `*` (any chars except /), `?` (single char), `**` (any path depth). Optionally scope to a path prefix. Returns { matches } with path, size, and modifiedAt.",handler:_u,schema:y.object({pattern:y.string(),path:y.string().optional()})},sql:{description:"Run a DuckDB SQL query over documents stored in the drive. Reference documents directly by path string literal (e.g. SELECT * FROM '/data/sales.csv') or bind them as named tables via `tables` ({ name: path } or { name: { path, format } } to override format detection). Supports csv, tsv, parquet, xlsx, json, ndjson/jsonl (each also .gz except parquet/xlsx), sqlite (.db/.sqlite/.sqlite3, tables exposed as name.tablename), and .duckdb files. Queries run sandboxed: no filesystem or network access beyond the bound documents. Returns { columns, rows, rowCount, truncated, files, elapsedMs }.",handler:$u,schema:y.object({query:y.string(),tables:y.record(y.union([y.string(),y.object({path:y.string(),format:y.enum(["csv","tsv","parquet","xlsx","json","ndjson","sqlite","duckdb"]).optional()})])).optional(),maxRows:y.number().int().min(1).max(1e4).optional()})},"signed-url":{description:"Generate a temporary presigned URL for direct file download. Default expiry is 24 hours (86400 seconds). The URL requires no authentication. Returns { url, path, expiresIn, expiresAt }.",handler:Mu,schema:y.object({path:y.string(),expiresIn:y.number().int().min(60).max(604800).optional()})},"comment-add":{description:"Add a comment to a file. Supports line ranges and threading via parentId. Replies auto-resolve path from parent. Returns { id, path, body, author, createdAt }.",handler:Jn,schema:y.object({path:y.string().optional(),body:y.string(),parentId:y.string().optional(),lineStart:y.number().int().optional(),lineEnd:y.number().int().optional(),quotedContent:y.string().optional()})},"comment-list":{description:"List comments on a file. Filter by path, resolved state, or parentId. Defaults to unresolved root comments. Returns { comments } with inline replies.",handler:Qn,schema:y.object({path:y.string().optional(),parentId:y.string().optional(),resolved:y.boolean().optional(),orgId:y.string().optional(),limit:y.number().int().min(1).optional(),offset:y.number().int().min(0).optional()})},"comment-get":{description:"Get a single comment by ID with all its replies. Returns { comment, replies }.",handler:Zn,schema:y.object({id:y.string()})},"comment-update":{description:"Update a comment's body. Only the original author can update. Returns { id, body, updatedAt }.",handler:eo,schema:y.object({id:y.string(),body:y.string()})},"comment-delete":{description:"Soft-delete a comment. Only the original author can delete. Deleting a root comment also soft-deletes its replies. Returns { deleted }.",handler:to,schema:y.object({id:y.string()})},"comment-resolve":{description:"Resolve or reopen a root comment. Set resolved=true to resolve, resolved=false to reopen. Only root comments can be resolved. Returns { id, resolved, resolvedBy, resolvedAt }.",handler:ro,schema:y.object({id:y.string(),resolved:y.boolean()})},"comment-notification-list":{description:"List comment notifications for the current user in the active drive. Returns { notifications, unreadCount }.",handler:Vu,schema:y.object({unreadOnly:y.boolean().optional(),limit:y.number().int().min(1).max(100).optional(),offset:y.number().int().min(0).optional()})},"comment-notification-read":{description:"Mark selected comment notification IDs, or all comment notifications in the active drive, as read. Returns { markedRead }.",handler:Gu,schema:y.object({ids:y.array(y.string()).min(1).max(100).optional(),all:y.literal(!0).optional()})}}});import{eq as xe,and as tn}from"drizzle-orm";function Ut(e,t){let r=crypto.randomUUID(),n=new Date;if(e.insert(d.drives).values({id:r,orgId:t.orgId,name:t.name,isDefault:t.isDefault??!1,createdAt:n}).run(),t.creatorUserId)e.insert(d.driveMembers).values({driveId:r,userId:t.creatorUserId,role:"admin"}).run();return{id:r,name:t.name}}function zs(e,t){return e.select().from(d.drives).where(xe(d.drives.orgId,t)).all().map((r)=>({id:r.id,name:r.name,isDefault:r.isDefault}))}function ze(e,t,r){return e.select({id:d.drives.id,name:d.drives.name,isDefault:d.drives.isDefault}).from(d.drives).innerJoin(d.driveMembers,xe(d.driveMembers.driveId,d.drives.id)).where(tn(xe(d.drives.orgId,t),xe(d.driveMembers.userId,r))).all().map((n)=>({id:n.id,name:n.name,isDefault:n.isDefault}))}function Xs(e,t){let r=e.select().from(d.drives).where(xe(d.drives.id,t)).get();if(!r)return null;return{id:r.id,name:r.name,orgId:r.orgId,isDefault:r.isDefault}}function Mt(e,t){return e.select({userId:d.driveMembers.userId,email:d.users.email,role:d.driveMembers.role}).from(d.driveMembers).innerJoin(d.users,xe(d.driveMembers.userId,d.users.id)).where(xe(d.driveMembers.driveId,t)).all()}function Ft(e,t){if(!e.select({role:d.driveMembers.role}).from(d.driveMembers).where(tn(xe(d.driveMembers.driveId,t.driveId),xe(d.driveMembers.userId,t.userId))).get())throw Error("Member not found in drive");e.update(d.driveMembers).set({role:t.role}).where(tn(xe(d.driveMembers.driveId,t.driveId),xe(d.driveMembers.userId,t.userId))).run()}function jt(e,t){if(!e.select({role:d.driveMembers.role}).from(d.driveMembers).where(tn(xe(d.driveMembers.driveId,t.driveId),xe(d.driveMembers.userId,t.userId))).get())throw Error("Member not found in drive");e.delete(d.driveMembers).where(tn(xe(d.driveMembers.driveId,t.driveId),xe(d.driveMembers.userId,t.userId))).run()}function Ws(e,t){e.insert(d.driveMembers).values({driveId:t.driveId,userId:t.userId,role:t.role}).onConflictDoUpdate({target:[d.driveMembers.driveId,d.driveMembers.userId],set:{role:t.role}}).run()}var Ys=f(()=>{Z()});import{eq as oe,and as Rt,sql as Xu}from"drizzle-orm";function Ht(e,t){let r=crypto.randomUUID(),n=new Date;return e.insert(d.orgs).values({id:r,name:t.name,isPersonal:t.isPersonal??!1,createdAt:n}).run(),e.insert(d.orgMembers).values({orgId:r,userId:t.userId,role:"admin"}).run(),Ut(e,{orgId:r,name:"default",isDefault:!0,creatorUserId:t.userId}),{id:r,name:t.name}}function ve(e,t){return e.select({orgId:d.orgMembers.orgId,role:d.orgMembers.role,name:d.orgs.name,isPersonal:d.orgs.isPersonal}).from(d.orgMembers).innerJoin(d.orgs,oe(d.orgMembers.orgId,d.orgs.id)).where(oe(d.orgMembers.userId,t)).all().map((n)=>({id:n.orgId,name:n.name,role:n.role,isPersonal:n.isPersonal}))}function rn(e,t){let r=e.select().from(d.orgs).where(oe(d.orgs.id,t)).get();if(!r)return null;return{id:r.id,name:r.name,isPersonal:r.isPersonal}}function Bt(e,t){return e.select({userId:d.orgMembers.userId,email:d.users.email,role:d.orgMembers.role}).from(d.orgMembers).innerJoin(d.users,oe(d.orgMembers.userId,d.users.id)).where(oe(d.orgMembers.orgId,t)).all()}function qt(e,t){let r=e.select({role:d.orgMembers.role}).from(d.orgMembers).where(Rt(oe(d.orgMembers.orgId,t.orgId),oe(d.orgMembers.userId,t.userId))).get();if(!r)throw Error("Member not found in org");if(r.role==="admin"&&t.role!=="admin"){if(e.select({count:Xu`count(*)`}).from(d.orgMembers).where(Rt(oe(d.orgMembers.orgId,t.orgId),oe(d.orgMembers.role,"admin"))).get().count<=1)throw Error("Cannot remove the last admin from the org")}e.update(d.orgMembers).set({role:t.role}).where(Rt(oe(d.orgMembers.orgId,t.orgId),oe(d.orgMembers.userId,t.userId))).run()}function Kt(e,t){if(e.select({isPersonal:d.orgs.isPersonal}).from(d.orgs).where(oe(d.orgs.id,t.orgId)).get()?.isPersonal)throw Error("Cannot remove members from a personal org");let n=e.select({role:d.orgMembers.role}).from(d.orgMembers).where(Rt(oe(d.orgMembers.orgId,t.orgId),oe(d.orgMembers.userId,t.userId))).get();if(!n)throw Error("Member not found in org");if(n.role==="admin"){if(e.select({count:Xu`count(*)`}).from(d.orgMembers).where(Rt(oe(d.orgMembers.orgId,t.orgId),oe(d.orgMembers.role,"admin"))).get().count<=1)throw Error("Cannot remove the last admin from the org")}let o=e.select({id:d.drives.id}).from(d.drives).where(oe(d.drives.orgId,t.orgId)).all();for(let s of o)e.delete(d.driveMembers).where(Rt(oe(d.driveMembers.driveId,s.id),oe(d.driveMembers.userId,t.userId))).run();e.delete(d.orgMembers).where(Rt(oe(d.orgMembers.orgId,t.orgId),oe(d.orgMembers.userId,t.userId))).run()}function Vt(e,t){let r=e.select().from(d.users).where(oe(d.users.email,t.email)).get();if(!r)throw Error(`User with email ${t.email} not found`);e.insert(d.orgMembers).values({orgId:t.orgId,userId:r.id,role:t.role}).onConflictDoUpdate({target:[d.orgMembers.orgId,d.orgMembers.userId],set:{role:t.role}}).run();let n=e.select().from(d.drives).where(Rt(oe(d.drives.orgId,t.orgId),oe(d.drives.isDefault,!0))).get();if(n)e.insert(d.driveMembers).values({driveId:n.id,userId:r.id,role:t.role}).onConflictDoUpdate({target:[d.driveMembers.driveId,d.driveMembers.userId],set:{role:t.role}}).run()}var Js=f(()=>{Z();Ys()});import{eq as nn}from"drizzle-orm";function no(e){let t=new Bun.CryptoHasher("sha256");return t.update(e),t.digest("hex")}function Qs(){let e=new Uint8Array(32);return crypto.getRandomValues(e),`af_${Array.from(e,(r)=>r.toString(16).padStart(2,"0")).join("")}`}function iw(){return crypto.randomUUID()}function Xe(e,t){let r=iw(),n=Qs(),o=no(n),s=new Date;return e.insert(d.users).values({id:r,email:t.email,apiKeyHash:o,createdAt:s}).run(),Ht(e,{name:t.email.split("@")[0],userId:r,isPersonal:!0}),{user:{id:r,email:t.email},apiKey:n}}function Gt(e,t){let r=e.select().from(d.users).where(nn(d.users.id,t.userId)).get();if(!r)throw new U("User not found",{suggestion:"Check the user id"});let n=Qs(),o=no(n),s=new Date;return e.transaction((i)=>{i.update(d.users).set({apiKeyHash:o}).where(nn(d.users.id,t.userId)).run(),i.insert(d.events).values({id:crypto.randomUUID(),orgId:t.orgId,type:"api_key_reset",resourceType:"user",resourceId:t.userId,actor:t.actorId,target:t.userId,status:"created",metadata:JSON.stringify({method:t.actorId===t.userId?"self":"admin"}),createdAt:s}).run()}),{user:{id:r.id,email:r.email},apiKey:n}}function on(e,t){let r=Qs(),n=no(r);return e.transaction((o)=>{o.update(d.users).set({apiKeyHash:n}).where(nn(d.users.id,t)).run()}),{apiKey:r}}function We(e,t){let r=no(t),n=e.select().from(d.users).where(nn(d.users.apiKeyHash,r)).get();if(!n)return null;return{id:n.id,email:n.email}}function br(e,t){let r=e.select().from(d.users).where(nn(d.users.email,t)).get();if(!r)return null;return{id:r.id,email:r.email}}var Zs=f(()=>{Z();Js();pe()});import{eq as xt,and as ei}from"drizzle-orm";function Ce(e,t){if(t.driveId){let s=e.select().from(d.drives).where(xt(d.drives.id,t.driveId)).get();if(!s||t.orgId&&s.orgId!==t.orgId)throw new U(`Drive not found: ${t.driveId}`,{suggestion:t.orgId?"Check the driveId belongs to the org you are addressing":void 0});let i=Ke(e,t.userId,t.driveId);if(!i)throw new U(`Drive not found: ${t.driveId}`,{suggestion:t.orgId?"Check the driveId belongs to the org you are addressing":void 0});return{orgId:s.orgId,driveId:t.driveId,role:i}}if(t.orgId){let s=e.select().from(d.drives).where(ei(xt(d.drives.orgId,t.orgId),xt(d.drives.isDefault,!0))).get();if(!s)throw new U(`No default drive for org: ${t.orgId}`);let i=Ke(e,t.userId,s.id);if(!i)throw new U(`No default drive for org: ${t.orgId}`);return{orgId:t.orgId,driveId:s.id,role:i}}let r=e.select({orgId:d.orgMembers.orgId}).from(d.orgMembers).innerJoin(d.orgs,xt(d.orgMembers.orgId,d.orgs.id)).where(ei(xt(d.orgMembers.userId,t.userId),xt(d.orgs.isPersonal,!0))).get();if(!r)throw Error("No personal org found for user");let n=e.select().from(d.drives).where(ei(xt(d.drives.orgId,r.orgId),xt(d.drives.isDefault,!0))).get();if(!n)throw Error("No default drive found");let o=Ke(e,t.userId,n.id);if(!o)throw Error("You do not have access to your default drive");return{orgId:r.orgId,driveId:n.id,role:o}}var Wu=f(()=>{Z();pe();Xr()});function sn(e){let t=q();if(t.auth.apiKey){if(We(e,t.auth.apiKey))return{apiKey:t.auth.apiKey}}console.error("[agent-fs] No local user found, creating one...");let r=Xe(e,{email:"local@agent-fs.local"});return N("auth.apiKey",r.apiKey),console.error("[agent-fs] Local user created automatically."),{apiKey:r.apiKey}}var Yu=f(()=>{Pt();Zs()});var Ju=f(()=>{Zs();Js();Ys();Xr();Wu();Yu()});var Zu;var Qu=f(()=>{Zu={name:"agent-fs",version:"0.13.4",packageManager:"bun@1.4.0",private:!0,workspaces:["packages/*"],scripts:{typecheck:"tsc --build",test:"bun test packages/*/src/ live/src/lib/","test:coverage":"bun test --coverage packages/*/src/ live/src/lib/",build:"cd packages/cli && bun run build:npm","install-local":"bun run build && cd packages/cli && bun link","uninstall-local":"bun remove -g @desplega.ai/agent-fs && rm -f ~/.bun/bin/agent-fs","deploy:fly":"fly deploy -a agent-fs-taras"},devDependencies:{"@duckdb/node-api":"1.5.3-r.3","bun-types":"^1.4.0",msgpackr:"^1",typescript:"^5.7.0",yaml:"^2.8.2","zod-to-json-schema":"^3.25.1"},overrides:{chromadb:"npm:empty-npm-package@1.0.0","chromadb-default-embed":"npm:empty-npm-package@1.0.0","@xenova/transformers":"npm:empty-npm-package@1.0.0","tree-sitter-wasms":"npm:empty-npm-package@1.0.0","web-tree-sitter":"npm:empty-npm-package@1.0.0","cohere-ai":"npm:empty-npm-package@1.0.0",voyageai:"npm:empty-npm-package@1.0.0",ollama:"npm:empty-npm-package@1.0.0"}}});var Oe;var ti=f(()=>{Qu();Oe=Zu.version});var tp={};Jt(tp,{LocalEmbeddingProvider:()=>ep});import{join as cw}from"path";import{mkdirSync as dw,existsSync as lw}from"fs";class ep{name="local";dimensions=768;llama=null;model=null;embeddingContext=null;initPromise=null;async init(){if(this.embeddingContext)return;if(this.initPromise)return this.initPromise;return this.initPromise=this._doInit(),this.initPromise}async _doInit(){let{getLlama:e,resolveModelFile:t}=await import("node-llama-cpp");this.llama=await e();let r=cw(le(),"models");if(!lw(r))dw(r,{recursive:!0});console.error("[agent-fs] Resolving local embedding model...");let n=await t(uw,r);console.error("[agent-fs] Model ready:",n),this.model=await this.llama.loadModel({modelPath:n}),this.embeddingContext=await this.model.createEmbeddingContext()}async embed(e){await this.init();let t=await this.embeddingContext.getEmbeddingFor(e);return Array.from(t.vector)}async embedBatch(e){await this.init();let t=[];for(let r of e){let n=await this.embeddingContext.getEmbeddingFor(r);t.push(Array.from(n.vector))}return t}async dispose(){if(this.embeddingContext)await this.embeddingContext.dispose(),this.embeddingContext=null;if(this.model)await this.model.dispose(),this.model=null;this.initPromise=null}}var uw="hf:nomic-ai/nomic-embed-text-v1.5-GGUF:Q8_0";var rp=f(()=>{Pt()});var ri={};Jt(ri,{OpenAIEmbeddingProvider:()=>np});import pw from"openai";class np{name="openai";dimensions=768;client;constructor(e){this.client=new pw({apiKey:e})}async embed(e){return(await this.client.embeddings.create({model:"text-embedding-3-small",input:e,dimensions:768})).data[0].embedding}async embedBatch(e){return(await this.client.embeddings.create({model:"text-embedding-3-small",input:e,dimensions:768})).data.sort((r,n)=>r.index-n.index).map((r)=>r.embedding)}}var ni=()=>{};var oi={};Jt(oi,{GeminiEmbeddingProvider:()=>op});import{GoogleGenAI as mw}from"@google/genai";class op{name="gemini";dimensions=768;client;constructor(e){this.client=new mw({apiKey:e})}async embed(e){return(await this.client.models.embedContent({model:"gemini-embedding-001",contents:e,config:{outputDimensionality:768}})).embeddings[0].values}async embedBatch(e){let t=[];for(let r of e){let n=await this.client.models.embedContent({model:"gemini-embedding-001",contents:r,config:{outputDimensionality:768}});t.push(n.embeddings[0].values)}return t}}var si=()=>{};async function sp(e){switch(e.provider){case"local":{let{LocalEmbeddingProvider:t}=await Promise.resolve().then(() => (rp(),tp));return new t}case"openai":{if(!e.apiKey)throw Error("OpenAI API key required. Set embedding.apiKey in config.");let{OpenAIEmbeddingProvider:t}=await Promise.resolve().then(() => (ni(),ri));return new t(e.apiKey)}case"gemini":{if(!e.apiKey)throw Error("Gemini API key required. Set embedding.apiKey in config.");let{GeminiEmbeddingProvider:t}=await Promise.resolve().then(() => (si(),oi));return new t(e.apiKey)}default:throw Error(`Unknown embedding provider: ${e.provider}`)}}async function wr(e){if(process.env.OPENAI_API_KEY)try{let{OpenAIEmbeddingProvider:t}=await Promise.resolve().then(() => (ni(),ri));return new t(process.env.OPENAI_API_KEY)}catch(t){console.error("[agent-fs] Failed to load OpenAI provider:",t)}if(process.env.GEMINI_API_KEY)try{let{GeminiEmbeddingProvider:t}=await Promise.resolve().then(() => (si(),oi));return new t(process.env.GEMINI_API_KEY)}catch(t){console.error("[agent-fs] Failed to load Gemini provider:",t)}if(e?.provider&&e.provider!=="local"&&e.apiKey)try{return await sp(e)}catch(t){console.error("[agent-fs] Failed to create embedding provider from config:",t)}if(e?.provider==="local")try{return await sp(e)}catch(t){console.error("[agent-fs] Failed to load local embedding provider:",t)}return null}var ap,ip,cp=(e)=>typeof e==="string"?{...ip,name:e}:{...ip,...e};var oo=f(()=>{ap=Symbol("Let zodToJsonSchema decide on which parser to use"),ip={name:void 0,$refStrategy:"root",basePath:["#"],effectStrategy:"input",pipeStrategy:"all",dateStrategy:"format:date-time",mapStrategy:"entries",removeAdditionalStrategy:"passthrough",allowedAdditionalProperties:!0,rejectedAdditionalProperties:!1,definitionPath:"definitions",target:"jsonSchema7",strictUnions:!1,definitions:{},errorMessages:!1,markdownDescription:!1,patternStrategy:"escape",applyRegexFlags:!1,emailStrategy:"format:email",base64Strategy:"contentEncoding:base64",nameStrategy:"ref",openAiAnyTypeName:"OpenAiAnyType"}});var dp=(e)=>{let t=cp(e),r=t.name!==void 0?[...t.basePath,t.definitionPath,t.name]:t.basePath;return{...t,flags:{hasReferencedOpenAiAnyType:!1},currentPath:r,propertyPath:void 0,seen:new Map(Object.entries(t.definitions).map(([n,o])=>[o._def,{def:o._def,path:[...t.basePath,t.definitionPath,n],jsonSchema:void 0}]))}};var ii=f(()=>{oo()});function ai(e,t,r,n){if(!n?.errorMessages)return;if(r)e.errorMessage={...e.errorMessage,[t]:r}}function K(e,t,r,n,o){e[t]=r,ai(e,t,n,o)}var so=(e,t)=>{let r=0;for(;r<e.length&&r<t.length;r++)if(e[r]!==t[r])break;return[(e.length-r).toString(),...t.slice(r)].join("/")};function se(e){if(e.target!=="openAi")return{};let t=[...e.basePath,e.definitionPath,e.openAiAnyTypeName];return e.flags.hasReferencedOpenAiAnyType=!0,{$ref:e.$refStrategy==="relative"?so(t,e.currentPath):t.join("/")}}var Fe=()=>{};import{ZodFirstPartyTypeKind as fw}from"zod/v3";function lp(e,t){let r={type:"array"};if(e.type?._def&&e.type?._def?.typeName!==fw.ZodAny)r.items=O(e.type._def,{...t,currentPath:[...t.currentPath,"items"]});if(e.minLength)K(r,"minItems",e.minLength.value,e.minLength.message,t);if(e.maxLength)K(r,"maxItems",e.maxLength.value,e.maxLength.message,t);if(e.exactLength)K(r,"minItems",e.exactLength.value,e.exactLength.message,t),K(r,"maxItems",e.exactLength.value,e.exactLength.message,t);return r}var ci=f(()=>{fe()});function up(e,t){let r={type:"integer",format:"int64"};if(!e.checks)return r;for(let n of e.checks)switch(n.kind){case"min":if(t.target==="jsonSchema7")if(n.inclusive)K(r,"minimum",n.value,n.message,t);else K(r,"exclusiveMinimum",n.value,n.message,t);else{if(!n.inclusive)r.exclusiveMinimum=!0;K(r,"minimum",n.value,n.message,t)}break;case"max":if(t.target==="jsonSchema7")if(n.inclusive)K(r,"maximum",n.value,n.message,t);else K(r,"exclusiveMaximum",n.value,n.message,t);else{if(!n.inclusive)r.exclusiveMaximum=!0;K(r,"maximum",n.value,n.message,t)}break;case"multipleOf":K(r,"multipleOf",n.value,n.message,t);break}return r}var di=()=>{};function pp(){return{type:"boolean"}}function io(e,t){return O(e.type._def,t)}var ao=f(()=>{fe()});var mp=(e,t)=>O(e.innerType._def,t);var li=f(()=>{fe()});function ui(e,t,r){let n=r??t.dateStrategy;if(Array.isArray(n))return{anyOf:n.map((o,s)=>ui(e,t,o))};switch(n){case"string":case"format:date-time":return{type:"string",format:"date-time"};case"format:date":return{type:"string",format:"date"};case"integer":return gw(e,t)}}var gw=(e,t)=>{let r={type:"integer",format:"unix-time"};if(t.target==="openApi3")return r;for(let n of e.checks)switch(n.kind){case"min":K(r,"minimum",n.value,n.message,t);break;case"max":K(r,"maximum",n.value,n.message,t);break}return r};var pi=()=>{};function fp(e,t){return{...O(e.innerType._def,t),default:e.defaultValue()}}var mi=f(()=>{fe()});function gp(e,t){return t.effectStrategy==="input"?O(e.schema._def,t):se(t)}var fi=f(()=>{fe();Fe()});function hp(e){return{type:"string",enum:Array.from(e.values)}}function yp(e,t){let r=[O(e.left._def,{...t,currentPath:[...t.currentPath,"allOf","0"]}),O(e.right._def,{...t,currentPath:[...t.currentPath,"allOf","1"]})].filter((s)=>!!s),n=t.target==="jsonSchema2019-09"?{unevaluatedProperties:!1}:void 0,o=[];return r.forEach((s)=>{if(hw(s)){if(o.push(...s.allOf),s.unevaluatedProperties===void 0)n=void 0}else{let i=s;if("additionalProperties"in s&&s.additionalProperties===!1){let{additionalProperties:a,...c}=s;i=c}else n=void 0;o.push(i)}}),o.length?{allOf:o,...n}:void 0}var hw=(e)=>{if("type"in e&&e.type==="string")return!1;return"allOf"in e};var gi=f(()=>{fe()});function vp(e,t){let r=typeof e.value;if(r!=="bigint"&&r!=="number"&&r!=="boolean"&&r!=="string")return{type:Array.isArray(e.value)?"array":"object"};if(t.target==="openApi3")return{type:r==="bigint"?"integer":r,enum:[e.value]};return{type:r==="bigint"?"integer":r,const:e.value}}function co(e,t){let r={type:"string"};if(e.checks)for(let n of e.checks)switch(n.kind){case"min":K(r,"minLength",typeof r.minLength==="number"?Math.max(r.minLength,n.value):n.value,n.message,t);break;case"max":K(r,"maxLength",typeof r.maxLength==="number"?Math.min(r.maxLength,n.value):n.value,n.message,t);break;case"email":switch(t.emailStrategy){case"format:email":Je(r,"email",n.message,t);break;case"format:idn-email":Je(r,"idn-email",n.message,t);break;case"pattern:zod":_e(r,Ye.email,n.message,t);break}break;case"url":Je(r,"uri",n.message,t);break;case"uuid":Je(r,"uuid",n.message,t);break;case"regex":_e(r,n.regex,n.message,t);break;case"cuid":_e(r,Ye.cuid,n.message,t);break;case"cuid2":_e(r,Ye.cuid2,n.message,t);break;case"startsWith":_e(r,RegExp(`^${yi(n.value,t)}`),n.message,t);break;case"endsWith":_e(r,RegExp(`${yi(n.value,t)}$`),n.message,t);break;case"datetime":Je(r,"date-time",n.message,t);break;case"date":Je(r,"date",n.message,t);break;case"time":Je(r,"time",n.message,t);break;case"duration":Je(r,"duration",n.message,t);break;case"length":K(r,"minLength",typeof r.minLength==="number"?Math.max(r.minLength,n.value):n.value,n.message,t),K(r,"maxLength",typeof r.maxLength==="number"?Math.min(r.maxLength,n.value):n.value,n.message,t);break;case"includes":{_e(r,RegExp(yi(n.value,t)),n.message,t);break}case"ip":{if(n.version!=="v6")Je(r,"ipv4",n.message,t);if(n.version!=="v4")Je(r,"ipv6",n.message,t);break}case"base64url":_e(r,Ye.base64url,n.message,t);break;case"jwt":_e(r,Ye.jwt,n.message,t);break;case"cidr":{if(n.version!=="v6")_e(r,Ye.ipv4Cidr,n.message,t);if(n.version!=="v4")_e(r,Ye.ipv6Cidr,n.message,t);break}case"emoji":_e(r,Ye.emoji(),n.message,t);break;case"ulid":{_e(r,Ye.ulid,n.message,t);break}case"base64":{switch(t.base64Strategy){case"format:binary":{Je(r,"binary",n.message,t);break}case"contentEncoding:base64":{K(r,"contentEncoding","base64",n.message,t);break}case"pattern:zod":{_e(r,Ye.base64,n.message,t);break}}break}case"nanoid":_e(r,Ye.nanoid,n.message,t);case"toLowerCase":case"toUpperCase":case"trim":break;default:((o)=>{})(n)}return r}function yi(e,t){return t.patternStrategy==="escape"?vw(e):e}function vw(e){let t="";for(let r=0;r<e.length;r++){if(!yw.has(e[r]))t+="\\";t+=e[r]}return t}function Je(e,t,r,n){if(e.format||e.anyOf?.some((o)=>o.format)){if(!e.anyOf)e.anyOf=[];if(e.format){if(e.anyOf.push({format:e.format,...e.errorMessage&&n.errorMessages&&{errorMessage:{format:e.errorMessage.format}}}),delete e.format,e.errorMessage){if(delete e.errorMessage.format,Object.keys(e.errorMessage).length===0)delete e.errorMessage}}e.anyOf.push({format:t,...r&&n.errorMessages&&{errorMessage:{format:r}}})}else K(e,"format",t,r,n)}function _e(e,t,r,n){if(e.pattern||e.allOf?.some((o)=>o.pattern)){if(!e.allOf)e.allOf=[];if(e.pattern){if(e.allOf.push({pattern:e.pattern,...e.errorMessage&&n.errorMessages&&{errorMessage:{pattern:e.errorMessage.pattern}}}),delete e.pattern,e.errorMessage){if(delete e.errorMessage.pattern,Object.keys(e.errorMessage).length===0)delete e.errorMessage}}e.allOf.push({pattern:bp(t,n),...r&&n.errorMessages&&{errorMessage:{pattern:r}}})}else K(e,"pattern",bp(t,n),r,n)}function bp(e,t){if(!t.applyRegexFlags||!e.flags)return e.source;let r={i:e.flags.includes("i"),m:e.flags.includes("m"),s:e.flags.includes("s")},n=r.i?e.source.toLowerCase():e.source,o="",s=!1,i=!1,a=!1;for(let c=0;c<n.length;c++){if(s){o+=n[c],s=!1;continue}if(r.i){if(i){if(n[c].match(/[a-z]/)){if(a)o+=n[c],o+=`${n[c-2]}-${n[c]}`.toUpperCase(),a=!1;else if(n[c+1]==="-"&&n[c+2]?.match(/[a-z]/))o+=n[c],a=!0;else o+=`${n[c]}${n[c].toUpperCase()}`;continue}}else if(n[c].match(/[a-z]/)){o+=`[${n[c]}${n[c].toUpperCase()}]`;continue}}if(r.m){if(n[c]==="^"){o+=`(^|(?<=[\r
216
216
  ]))`;continue}else if(n[c]==="$"){o+=`($|(?=[\r
217
217
  ]))`;continue}}if(r.s&&n[c]==="."){o+=i?`${n[c]}\r
218
218
  `:`[${n[c]}\r
219
219
  ]`;continue}if(o+=n[c],n[c]==="\\")s=!0;else if(i&&n[c]==="]")i=!1;else if(!i&&n[c]==="[")i=!0}try{new RegExp(o)}catch{return console.warn(`Could not convert regex pattern at ${t.currentPath.join("/")} to a flag-independent form! Falling back to the flag-ignorant source`),e.source}return o}var hi=void 0,Ye,yw;var lo=f(()=>{Ye={cuid:/^[cC][^\s-]{8,}$/,cuid2:/^[0-9a-z]+$/,ulid:/^[0-9A-HJKMNP-TV-Z]{26}$/,email:/^(?!\.)(?!.*\.\.)([a-zA-Z0-9_'+\-\.]*)[a-zA-Z0-9_+-]@([a-zA-Z0-9][a-zA-Z0-9\-]*\.)+[a-zA-Z]{2,}$/,emoji:()=>{if(hi===void 0)hi=RegExp("^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$","u");return hi},uuid:/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/,ipv4:/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,ipv4Cidr:/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,ipv6:/^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/,ipv6Cidr:/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,base64:/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,base64url:/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,nanoid:/^[a-zA-Z0-9_-]{21}$/,jwt:/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/};yw=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789")});import{ZodFirstPartyTypeKind as an}from"zod/v3";function uo(e,t){if(t.target==="openAi")console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead.");if(t.target==="openApi3"&&e.keyType?._def.typeName===an.ZodEnum)return{type:"object",required:e.keyType._def.values,properties:e.keyType._def.values.reduce((n,o)=>({...n,[o]:O(e.valueType._def,{...t,currentPath:[...t.currentPath,"properties",o]})??se(t)}),{}),additionalProperties:t.rejectedAdditionalProperties};let r={type:"object",additionalProperties:O(e.valueType._def,{...t,currentPath:[...t.currentPath,"additionalProperties"]})??t.allowedAdditionalProperties};if(t.target==="openApi3")return r;if(e.keyType?._def.typeName===an.ZodString&&e.keyType._def.checks?.length){let{type:n,...o}=co(e.keyType._def,t);return{...r,propertyNames:o}}else if(e.keyType?._def.typeName===an.ZodEnum)return{...r,propertyNames:{enum:e.keyType._def.values}};else if(e.keyType?._def.typeName===an.ZodBranded&&e.keyType._def.type._def.typeName===an.ZodString&&e.keyType._def.type._def.checks?.length){let{type:n,...o}=io(e.keyType._def,t);return{...r,propertyNames:o}}return r}var po=f(()=>{fe();lo();ao();Fe()});function wp(e,t){if(t.mapStrategy==="record")return uo(e,t);let r=O(e.keyType._def,{...t,currentPath:[...t.currentPath,"items","items","0"]})||se(t),n=O(e.valueType._def,{...t,currentPath:[...t.currentPath,"items","items","1"]})||se(t);return{type:"array",maxItems:125,items:{type:"array",items:[r,n],minItems:2,maxItems:2}}}var vi=f(()=>{fe();po();Fe()});function Ep(e){let t=e.values,n=Object.keys(e.values).filter((s)=>typeof t[t[s]]!=="number").map((s)=>t[s]),o=Array.from(new Set(n.map((s)=>typeof s)));return{type:o.length===1?o[0]==="string"?"string":"number":["string","number"],enum:n}}function Ip(e){return e.target==="openAi"?void 0:{not:se({...e,currentPath:[...e.currentPath,"not"]})}}var bi=f(()=>{Fe()});function Sp(e){return e.target==="openApi3"?{enum:["null"],nullable:!0}:{type:"null"}}function Rp(e,t){if(t.target==="openApi3")return Ap(e,t);let r=e.options instanceof Map?Array.from(e.options.values()):e.options;if(r.every((n)=>(n._def.typeName in cn)&&(!n._def.checks||!n._def.checks.length))){let n=r.reduce((o,s)=>{let i=cn[s._def.typeName];return i&&!o.includes(i)?[...o,i]:o},[]);return{type:n.length>1?n:n[0]}}else if(r.every((n)=>n._def.typeName==="ZodLiteral"&&!n.description)){let n=r.reduce((o,s)=>{let i=typeof s._def.value;switch(i){case"string":case"number":case"boolean":return[...o,i];case"bigint":return[...o,"integer"];case"object":if(s._def.value===null)return[...o,"null"];case"symbol":case"undefined":case"function":default:return o}},[]);if(n.length===r.length){let o=n.filter((s,i,a)=>a.indexOf(s)===i);return{type:o.length>1?o:o[0],enum:r.reduce((s,i)=>s.includes(i._def.value)?s:[...s,i._def.value],[])}}}else if(r.every((n)=>n._def.typeName==="ZodEnum"))return{type:"string",enum:r.reduce((n,o)=>[...n,...o._def.values.filter((s)=>!n.includes(s))],[])};return Ap(e,t)}var cn,Ap=(e,t)=>{let r=(e.options instanceof Map?Array.from(e.options.values()):e.options).map((n,o)=>O(n._def,{...t,currentPath:[...t.currentPath,"anyOf",`${o}`]})).filter((n)=>!!n&&(!t.strictUnions||typeof n==="object"&&Object.keys(n).length>0));return r.length?{anyOf:r}:void 0};var mo=f(()=>{fe();cn={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"}});function xp(e,t){if(["ZodString","ZodNumber","ZodBigInt","ZodBoolean","ZodNull"].includes(e.innerType._def.typeName)&&(!e.innerType._def.checks||!e.innerType._def.checks.length)){if(t.target==="openApi3")return{type:cn[e.innerType._def.typeName],nullable:!0};return{type:[cn[e.innerType._def.typeName],"null"]}}if(t.target==="openApi3"){let n=O(e.innerType._def,{...t,currentPath:[...t.currentPath]});if(n&&"$ref"in n)return{allOf:[n],nullable:!0};return n&&{...n,nullable:!0}}let r=O(e.innerType._def,{...t,currentPath:[...t.currentPath,"anyOf","0"]});return r&&{anyOf:[r,{type:"null"}]}}var wi=f(()=>{fe();mo()});function _p(e,t){let r={type:"number"};if(!e.checks)return r;for(let n of e.checks)switch(n.kind){case"int":r.type="integer",ai(r,"type",n.message,t);break;case"min":if(t.target==="jsonSchema7")if(n.inclusive)K(r,"minimum",n.value,n.message,t);else K(r,"exclusiveMinimum",n.value,n.message,t);else{if(!n.inclusive)r.exclusiveMinimum=!0;K(r,"minimum",n.value,n.message,t)}break;case"max":if(t.target==="jsonSchema7")if(n.inclusive)K(r,"maximum",n.value,n.message,t);else K(r,"exclusiveMaximum",n.value,n.message,t);else{if(!n.inclusive)r.exclusiveMaximum=!0;K(r,"maximum",n.value,n.message,t)}break;case"multipleOf":K(r,"multipleOf",n.value,n.message,t);break}return r}var Ei=()=>{};function Tp(e,t){let r=t.target==="openAi",n={type:"object",properties:{}},o=[],s=e.shape();for(let a in s){let c=s[a];if(c===void 0||c._def===void 0)continue;let l=ww(c);if(l&&r){if(c._def.typeName==="ZodOptional")c=c._def.innerType;if(!c.isNullable())c=c.nullable();l=!1}let u=O(c._def,{...t,currentPath:[...t.currentPath,"properties",a],propertyPath:[...t.currentPath,"properties",a]});if(u===void 0)continue;if(n.properties[a]=u,!l)o.push(a)}if(o.length)n.required=o;let i=bw(e,t);if(i!==void 0)n.additionalProperties=i;return n}function bw(e,t){if(e.catchall._def.typeName!=="ZodNever")return O(e.catchall._def,{...t,currentPath:[...t.currentPath,"additionalProperties"]});switch(e.unknownKeys){case"passthrough":return t.allowedAdditionalProperties;case"strict":return t.rejectedAdditionalProperties;case"strip":return t.removeAdditionalStrategy==="strict"?t.allowedAdditionalProperties:t.rejectedAdditionalProperties}}function ww(e){try{return e.isOptional()}catch{return!0}}var Ii=f(()=>{fe()});var Cp=(e,t)=>{if(t.currentPath.toString()===t.propertyPath?.toString())return O(e.innerType._def,t);let r=O(e.innerType._def,{...t,currentPath:[...t.currentPath,"anyOf","1"]});return r?{anyOf:[{not:se(t)},r]}:se(t)};var Si=f(()=>{fe();Fe()});var Op=(e,t)=>{if(t.pipeStrategy==="input")return O(e.in._def,t);else if(t.pipeStrategy==="output")return O(e.out._def,t);let r=O(e.in._def,{...t,currentPath:[...t.currentPath,"allOf","0"]}),n=O(e.out._def,{...t,currentPath:[...t.currentPath,"allOf",r?"1":"0"]});return{allOf:[r,n].filter((o)=>o!==void 0)}};var Ai=f(()=>{fe()});function Pp(e,t){return O(e.type._def,t)}var Ri=f(()=>{fe()});function kp(e,t){let n={type:"array",uniqueItems:!0,items:O(e.valueType._def,{...t,currentPath:[...t.currentPath,"items"]})};if(e.minSize)K(n,"minItems",e.minSize.value,e.minSize.message,t);if(e.maxSize)K(n,"maxItems",e.maxSize.value,e.maxSize.message,t);return n}var xi=f(()=>{fe()});function Np(e,t){if(e.rest)return{type:"array",minItems:e.items.length,items:e.items.map((r,n)=>O(r._def,{...t,currentPath:[...t.currentPath,"items",`${n}`]})).reduce((r,n)=>n===void 0?r:[...r,n],[]),additionalItems:O(e.rest._def,{...t,currentPath:[...t.currentPath,"additionalItems"]})};else return{type:"array",minItems:e.items.length,maxItems:e.items.length,items:e.items.map((r,n)=>O(r._def,{...t,currentPath:[...t.currentPath,"items",`${n}`]})).reduce((r,n)=>n===void 0?r:[...r,n],[])}}var _i=f(()=>{fe()});function Dp(e){return{not:se(e)}}var Ti=f(()=>{Fe()});function Lp(e){return se(e)}var Ci=f(()=>{Fe()});var $p=(e,t)=>O(e.innerType._def,t);var Oi=f(()=>{fe()});import{ZodFirstPartyTypeKind as B}from"zod/v3";var Up=(e,t,r)=>{switch(t){case B.ZodString:return co(e,r);case B.ZodNumber:return _p(e,r);case B.ZodObject:return Tp(e,r);case B.ZodBigInt:return up(e,r);case B.ZodBoolean:return pp();case B.ZodDate:return ui(e,r);case B.ZodUndefined:return Dp(r);case B.ZodNull:return Sp(r);case B.ZodArray:return lp(e,r);case B.ZodUnion:case B.ZodDiscriminatedUnion:return Rp(e,r);case B.ZodIntersection:return yp(e,r);case B.ZodTuple:return Np(e,r);case B.ZodRecord:return uo(e,r);case B.ZodLiteral:return vp(e,r);case B.ZodEnum:return hp(e);case B.ZodNativeEnum:return Ep(e);case B.ZodNullable:return xp(e,r);case B.ZodOptional:return Cp(e,r);case B.ZodMap:return wp(e,r);case B.ZodSet:return kp(e,r);case B.ZodLazy:return()=>e.getter()._def;case B.ZodPromise:return Pp(e,r);case B.ZodNaN:case B.ZodNever:return Ip(r);case B.ZodEffects:return gp(e,r);case B.ZodAny:return se(r);case B.ZodUnknown:return Lp(r);case B.ZodDefault:return fp(e,r);case B.ZodBranded:return io(e,r);case B.ZodReadonly:return $p(e,r);case B.ZodCatch:return mp(e,r);case B.ZodPipeline:return Op(e,r);case B.ZodFunction:case B.ZodVoid:case B.ZodSymbol:return;default:return((n)=>{return})(t)}};var Pi=f(()=>{Fe();ci();di();ao();li();pi();mi();fi();gi();vi();bi();wi();Ei();Ii();Si();Ai();Ri();po();xi();lo();_i();Ti();mo();Ci();Oi()});function O(e,t,r=!1){let n=t.seen.get(e);if(t.override){let a=t.override?.(e,t,n,r);if(a!==ap)return a}if(n&&!r){let a=Ew(n,t);if(a!==void 0)return a}let o={def:e,path:t.currentPath,jsonSchema:void 0};t.seen.set(e,o);let s=Up(e,e.typeName,t),i=typeof s==="function"?O(s(),t):s;if(i)Iw(e,t,i);if(t.postProcess){let a=t.postProcess(i,e,t);return o.jsonSchema=i,a}return o.jsonSchema=i,i}var Ew=(e,t)=>{switch(t.$refStrategy){case"root":return{$ref:e.path.join("/")};case"relative":return{$ref:so(t.currentPath,e.path)};case"none":case"seen":{if(e.path.length<t.currentPath.length&&e.path.every((r,n)=>t.currentPath[n]===r))return console.warn(`Recursive reference detected at ${t.currentPath.join("/")}! Defaulting to any`),se(t);return t.$refStrategy==="seen"?se(t):void 0}}},Iw=(e,t,r)=>{if(e.description){if(r.description=e.description,t.markdownDescription)r.markdownDescription=e.description}return r};var fe=f(()=>{oo();Pi();Fe()});var Mp=()=>{};var ki=(e,t)=>{let r=dp(t),n=typeof t==="object"&&t.definitions?Object.entries(t.definitions).reduce((c,[l,u])=>({...c,[l]:O(u._def,{...r,currentPath:[...r.basePath,r.definitionPath,l]},!0)??se(r)}),{}):void 0,o=typeof t==="string"?t:t?.nameStrategy==="title"?void 0:t?.name,s=O(e._def,o===void 0?r:{...r,currentPath:[...r.basePath,r.definitionPath,o]},!1)??se(r),i=typeof t==="object"&&t.name!==void 0&&t.nameStrategy==="title"?t.name:void 0;if(i!==void 0)s.title=i;if(r.flags.hasReferencedOpenAiAnyType){if(!n)n={};if(!n[r.openAiAnyTypeName])n[r.openAiAnyTypeName]={type:["string","number","integer","boolean","array","null"],items:{$ref:r.$refStrategy==="relative"?"1":[...r.basePath,r.definitionPath,r.openAiAnyTypeName].join("/")}}}let a=o===void 0?n?{...s,[r.definitionPath]:n}:s:{$ref:[...r.$refStrategy==="relative"?[]:r.basePath,r.definitionPath,o].join("/"),[r.definitionPath]:{...n,[o]:s}};if(r.target==="jsonSchema7")a.$schema="http://json-schema.org/draft-07/schema#";else if(r.target==="jsonSchema2019-09"||r.target==="openAi")a.$schema="https://json-schema.org/draft/2019-09/schema#";if(r.target==="openAi"&&(("anyOf"in a)||("oneOf"in a)||("allOf"in a)||("type"in a)&&Array.isArray(a.type)))console.warn("Warning: OpenAI may not support schemas with unions as roots! Try wrapping it in an object property.");return a};var Ni=f(()=>{fe();ii();Fe()});var Fp=f(()=>{Ni();oo();ii();fe();Mp();Fe();ci();di();ao();li();pi();mi();fi();gi();vi();bi();wi();Ei();Ii();Si();Ai();Ri();Oi();po();xi();lo();_i();Ti();mo();Ci();Pi();Ni()});function fo(){let e=vr(),t={},r={};for(let o of e){let s=ct(o),i=ki(s.schema,{target:"openApi3"}),{$schema:a,...c}=i;t[o]=c,r[o]=s.description}let n=e.map((o)=>({type:"object",title:o,description:r[o],required:["op",...t[o].required||[]],properties:{op:{type:"string",const:o},driveId:{type:"string",description:"Target drive ID (optional, uses default drive)"},...t[o].properties||{}},additionalProperties:!1}));return{openapi:"3.1.0",info:{title:"agent-fs API",version:Oe,description:"A persistent, searchable filesystem for AI agents. agent-fs is to files what agentmail is to email.",license:{name:"MIT",url:"https://github.com/desplega-ai/agent-fs/blob/main/LICENSE"}},servers:[{url:"http://localhost:7433",description:"Local development server"}],paths:{"/health":{get:{summary:"Health check",operationId:"health",tags:["System"],security:[],responses:{"200":{description:"Server is healthy",content:{"application/json":{schema:{type:"object",properties:{ok:{type:"boolean",const:!0},version:{type:"string"}},required:["ok","version"]}}}}}}},"/auth/register":{post:{summary:"Register a new user",operationId:"register",tags:["Auth"],security:[],requestBody:{required:!0,content:{"application/json":{schema:{type:"object",properties:{email:{type:"string",format:"email"}},required:["email"]}}}},responses:{"200":{description:"User registered",content:{"application/json":{schema:{type:"object",properties:{userId:{type:"string"},orgId:{type:"string"},driveId:{type:"string"},apiKey:{type:"string"}},required:["userId","orgId","driveId","apiKey"]}}}}}}},"/auth/me":{get:{summary:"Get current user info",operationId:"me",tags:["Auth"],responses:{"200":{description:"Current user",content:{"application/json":{schema:{type:"object",properties:{id:{type:"string"},email:{type:"string"},createdAt:{type:"string",format:"date-time"}},required:["id","email","createdAt"]}}}}}}},"/auth/reset-key":{post:{summary:"Reset your own API key",description:"Rotates the caller's API key. The old key stops working immediately. Records an api_key_reset audit event.",operationId:"resetApiKey",tags:["Auth"],responses:{"200":{description:"API key reset",content:{"application/json":{schema:{type:"object",properties:{apiKey:{type:"string"}},required:["apiKey"]}}}},"401":{description:"Unauthorized",content:{"application/json":{schema:{$ref:"#/components/schemas/Error"}}}}}}},"/orgs/{orgId}/members/{userId}/reset-key":{post:{summary:"Reset a member's API key (org admin only)",description:"Org admins can rotate a member's API key on their behalf, e.g. to recover a locked-out user. The old key stops working immediately. Records an api_key_reset audit event with the admin as actor.",operationId:"resetMemberApiKey",tags:["Auth"],parameters:[{name:"orgId",in:"path",required:!0,schema:{type:"string"},description:"Organization ID"},{name:"userId",in:"path",required:!0,schema:{type:"string"},description:"ID of the member whose key to reset"}],responses:{"200":{description:"Member's API key reset",content:{"application/json":{schema:{type:"object",properties:{apiKey:{type:"string"},userId:{type:"string"},email:{type:"string"}},required:["apiKey","userId","email"]}}}},"401":{description:"Unauthorized",content:{"application/json":{schema:{$ref:"#/components/schemas/Error"}}}},"403":{description:"Caller is not an org admin",content:{"application/json":{schema:{$ref:"#/components/schemas/Error"}}}},"404":{description:"Org not found, or userId is not a member of the org",content:{"application/json":{schema:{$ref:"#/components/schemas/Error"}}}}}}},"/orgs/{orgId}/ops":{post:{summary:"Dispatch a file operation",operationId:"dispatchOp",tags:["Operations"],description:"All file operations go through this single endpoint. The `op` field determines which operation to execute.",parameters:[{name:"orgId",in:"path",required:!0,schema:{type:"string"},description:"Organization ID"}],requestBody:{required:!0,content:{"application/json":{schema:{oneOf:n,discriminator:{propertyName:"op"}}}}},responses:{"200":{description:"Operation result (varies by op)",content:{"application/json":{schema:{type:"object",description:"Response shape depends on the operation. See each op's description for details."}}}},"400":{description:"Validation error",content:{"application/json":{schema:{$ref:"#/components/schemas/Error"}}}},"401":{description:"Unauthorized",content:{"application/json":{schema:{$ref:"#/components/schemas/Error"}}}},"403":{description:"Permission denied (RBAC)",content:{"application/json":{schema:{$ref:"#/components/schemas/Error"}}}},"404":{description:"File or resource not found",content:{"application/json":{schema:{$ref:"#/components/schemas/Error"}}}}}}}},components:{securitySchemes:{bearerAuth:{type:"http",scheme:"bearer",description:"API key obtained from /auth/register"}},schemas:{Error:{type:"object",properties:{error:{type:"string"},message:{type:"string"}},required:["error","message"]}}},security:[{bearerAuth:[]}]}}var jp=f(()=>{Fp();Gs();ti()});var Hp={};Jt(Hp,{AgentFSError:()=>He,AgentS3Client:()=>tr,EditConflictError:()=>Be,IndexingInProgressError:()=>Br,LocalStorageAdapter:()=>qr,NotFoundError:()=>U,PermissionDeniedError:()=>Se,UnsupportedOperation:()=>qe,VERSION:()=>Oe,ValidationError:()=>G,assertDriveInOrg:()=>mt,assertExpectedVersion:()=>Ae,checkPermission:()=>Gr,commentAdd:()=>Jn,commentDelete:()=>to,commentGet:()=>Zn,commentList:()=>Qn,commentResolve:()=>ro,commentUpdate:()=>eo,createDatabase:()=>Et,createDrive:()=>Ut,createEmbeddingProviderFromEnv:()=>wr,createOrg:()=>Ht,createStorageAdapter:()=>sr,createUser:()=>Xe,createVersion:()=>Ee,dispatchOp:()=>Re,ensureLocalUser:()=>sn,generateOpenAPISpec:()=>fo,getConfig:()=>q,getConfigPath:()=>Le,getDbPath:()=>Ot,getDrive:()=>Xs,getHeadContentHash:()=>Kn,getHeadVersionRow:()=>dr,getHome:()=>le,getNextVersion:()=>qn,getOpDefinition:()=>ct,getOrg:()=>rn,getRegisteredOps:()=>vr,getRequiredRole:()=>Kr,getS3Key:()=>L,getUserByApiKey:()=>We,getUserByEmail:()=>br,getUserDriveRole:()=>Ke,getUserOrgRole:()=>Lt,hasLegacyFts:()=>wt,inviteToOrg:()=>Vt,isLocalStorageConfig:()=>tt,listDriveMembers:()=>Mt,listDrives:()=>zs,listDrivesForUser:()=>ze,listOrgMembers:()=>Bt,listUserOrgs:()=>ve,prepareFtsMigration:()=>En,removeDriveMember:()=>jt,removeOrgMember:()=>Kt,requireDriveAdmin:()=>pt,requireDriveRole:()=>cr,requireOrgRole:()=>zr,resetApiKey:()=>Gt,resetApiKeyOrgless:()=>on,resolveContext:()=>Ce,roleAtLeast:()=>Vr,runFtsMigration:()=>In,schema:()=>d,setConfig:()=>yn,setConfigValue:()=>N,setDriveMember:()=>Ws,updateDriveMemberRole:()=>Ft,updateOrgMemberRole:()=>qt,write:()=>Xn,writeRaw:()=>gt});var Y=f(()=>{Z();_r();Pt();Pt();Rd();Cs();Sl();pe();Gs();ye();Ju();ti();jp()});var ho={};Jt(ho,{daemonStatus:()=>sE,startDaemon:()=>nE,stopDaemon:()=>oE});import{spawn as Zw}from"child_process";import{readFileSync as Ui,writeFileSync as eE,unlinkSync as go,existsSync as un,openSync as tE}from"fs";import{join as Mi}from"path";function Fi(){return Mi(le(),"agent-fs.pid")}function rE(){return Mi(le(),"agent-fs.log")}function Xp(){return Mi(le(),"agent-fs.sock")}function nE(){let e=Fi();if(un(e)){let s=parseInt(Ui(e,"utf-8").trim());try{process.kill(s,0),console.log(`Daemon already running (PID: ${s})`);return}catch{go(e);let i=Xp();if(un(i))try{go(i)}catch{}}}let t=rE(),r=tE(t,"a"),n=process.argv[1];if(!n)throw Error("Cannot determine entry script (process.argv[1] is empty). Daemon start aborted.");let o=Zw(process.execPath,[n,"server"],{detached:!0,stdio:["ignore",r,r]});if(o.unref(),o.pid)eE(e,String(o.pid)),console.log(`Daemon started (PID: ${o.pid})`),console.log(`Logs: ${t}`)}function oE(){let e=Fi();if(!un(e)){console.log("Daemon is not running");return}let t=parseInt(Ui(e,"utf-8").trim());try{process.kill(t,"SIGTERM"),console.log(`Daemon stopped (PID: ${t})`)}catch{console.log(`Process ${t} not found (already stopped)`)}go(e);let r=Xp();if(un(r))try{go(r)}catch{}}function sE(){let e=Fi();if(!un(e))return{running:!1};let t=parseInt(Ui(e,"utf-8").trim());try{return process.kill(t,0),{running:!0,pid:t}}catch{return{running:!1}}}var yo=f(()=>{Y()});var nI={};import{Server as WE}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport as YE}from"@modelcontextprotocol/sdk/server/stdio.js";import{Client as JE}from"@modelcontextprotocol/sdk/client/index.js";import{StreamableHTTPClientTransport as QE}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{ListToolsRequestSchema as ZE,CallToolRequestSchema as eI}from"@modelcontextprotocol/sdk/types.js";var pn,Ki,Em,tI,Vi,Gi,rI;var Im=f(async()=>{Y();pn=q(),Ki=process.env.AGENT_FS_API_URL??pn.apiUrl??`http://${pn.server.host}:${pn.server.port}`,Em=process.env.AGENT_FS_API_KEY??pn.apiKey??pn.auth?.apiKey;if(!Em)console.error("Error: No API key. Register with `agent-fs auth register` or set AGENT_FS_API_KEY."),process.exit(1);tI=new QE(new URL(`${Ki}/mcp`),{requestInit:{headers:{Authorization:`Bearer ${Em}`}}}),Vi=new JE({name:"agent-fs-proxy",version:Oe});try{await Vi.connect(tI)}catch(e){console.error(`Cannot connect to agent-fs at ${Ki}.
220
- Start a daemon with \`agent-fs daemon start\` or set AGENT_FS_API_URL to connect to a remote server.`),process.exit(1)}Gi=new WE({name:"agent-fs",version:Oe},{capabilities:{tools:{}}});Gi.setRequestHandler(ZE,async()=>await Vi.listTools());Gi.setRequestHandler(eI,async(e)=>await Vi.callTool(e.params));rI=new YE;await Gi.connect(rI);console.error("[agent-fs] MCP proxy connected to "+Ki)});import{z as Sm}from"zod";function Am(e,t){let r=vr();for(let n of r){let o=ct(n);if(!o)continue;e.tool(n,o.description,o.schema instanceof Sm.ZodObject?o.schema.shape:{params:Sm.any()},async(s,i)=>{let a=t(i);try{let c=await Re(a,n,s);return{content:[{type:"text",text:JSON.stringify(c,null,2)}]}}catch(c){return{content:[{type:"text",text:JSON.stringify({error:c?.code??"ERROR",message:c?.message??String(c),...c?.suggestion&&{suggestion:c.suggestion}},null,2)}],isError:!0}}})}}var Rm=f(()=>{Y()});import{McpServer as oI}from"@modelcontextprotocol/sdk/server/mcp.js";import{z as Tt}from"zod";function xm(e){let{db:t,s3:r,embeddingProvider:n,appUrl:o}=e,s=new oI({name:"agent-fs",version:Oe}),i=(a)=>{let c=a.authInfo;if(!c?.extra?.user)throw Error("No auth context \u2014 MCP must be accessed through the HTTP server");let l=c.extra.user,u=Ce(t,{userId:l.id});return{db:t,s3:r,orgId:u.orgId,driveId:u.driveId,userId:l.id,embeddingProvider:n,appUrl:o}};return Am(s,i),s.tool("health","Check agent-fs system health: database, S3, embeddings, version.",{},async(a,c)=>{let l={version:Oe};try{let u=i(c),p=await Re(u,"ls",{path:"/"},{skipAuth:!0});l.database={ok:!0,rootEntries:p.entries?.length??0}}catch(u){l.database={ok:!1,error:u.message}}try{await r.listObjects("",{delimiter:"/"}),l.s3={ok:!0}}catch(u){l.s3={ok:!1,error:u.message}}return l.embeddings={configured:!!n},{content:[{type:"text",text:JSON.stringify(l,null,2)}]}}),sI(s,{db:t,getContext:i}),s}function sI(e,t){let{db:r,getContext:n}=t,o=(s,i)=>{if(i)mt(r,{driveId:i,orgId:s.orgId}),pt(r,{userId:s.userId,driveId:i});else zr(r,{userId:s.userId,orgId:s.orgId,requiredRole:"admin"})};e.tool("whoami","Get current user identity, org memberships, and drive roles.",{},async(s,i)=>{let a=n(i),c=a.userId,u=ve(r,c).map((g)=>{let v=ze(r,g.id,c);return{orgId:g.id,orgName:g.name,drives:v.map((E)=>({driveId:E.id,driveName:E.name,role:Ke(r,c,E.id)}))}}),p=i.authInfo?.extra?.user?.email,m={userId:c,...p?{email:p}:{},activeOrg:a.orgId,activeDrive:a.driveId,memberships:u};return{content:[{type:"text",text:JSON.stringify(m,null,2)}]}}),e.tool("member-list","List members of the current org (requires org admin), or a specific drive in the current org (requires drive admin or org admin) if driveId is provided.",{driveId:Tt.string().optional().describe("Drive ID to list members for. Omit for org members.")},async(s,i)=>{let a=n(i);try{o(a,s.driveId);let c=s.driveId?Mt(r,s.driveId):Bt(r,a.orgId);return{content:[{type:"text",text:JSON.stringify({members:c},null,2)}]}}catch(c){return{content:[{type:"text",text:JSON.stringify({error:c.message},null,2)}],isError:!0}}}),e.tool("member-invite","Invite a user to the current org by email (requires org admin). The user must already have an agent-fs account.",{email:Tt.string().describe("Email of the user to invite"),role:Tt.enum(["viewer","editor","admin"]).describe("Role to assign")},async(s,i)=>{let a=n(i);try{return o(a),Vt(r,{orgId:a.orgId,email:s.email,role:s.role}),{content:[{type:"text",text:JSON.stringify({ok:!0,invited:s.email,role:s.role},null,2)}]}}catch(c){return{content:[{type:"text",text:JSON.stringify({error:c.message},null,2)}],isError:!0}}}),e.tool("member-update-role","Update a member's role in the current org (requires org admin) or a specific drive in the current org (requires drive admin or org admin).",{email:Tt.string().describe("Email of the member"),role:Tt.enum(["viewer","editor","admin"]).describe("New role"),driveId:Tt.string().optional().describe("Drive ID to update role for. Omit for org role.")},async(s,i)=>{let a=n(i);try{o(a,s.driveId);let c=br(r,s.email);if(!c)throw Error(`User with email ${s.email} not found`);if(s.driveId)Ft(r,{driveId:s.driveId,userId:c.id,role:s.role});else qt(r,{orgId:a.orgId,userId:c.id,role:s.role});return{content:[{type:"text",text:JSON.stringify({ok:!0,email:s.email,role:s.role},null,2)}]}}catch(c){return{content:[{type:"text",text:JSON.stringify({error:c.message},null,2)}],isError:!0}}}),e.tool("member-remove","Remove a member from the current org (cascades to all drives; requires org admin) or from a specific drive in the current org only (requires drive admin or org admin).",{email:Tt.string().describe("Email of the member to remove"),driveId:Tt.string().optional().describe("Drive ID to remove from. Omit to remove from org.")},async(s,i)=>{let a=n(i);try{o(a,s.driveId);let c=br(r,s.email);if(!c)throw Error(`User with email ${s.email} not found`);if(s.driveId)jt(r,{driveId:s.driveId,userId:c.id});else Kt(r,{orgId:a.orgId,userId:c.id});return{content:[{type:"text",text:JSON.stringify({ok:!0,removed:s.email},null,2)}]}}catch(c){return{content:[{type:"text",text:JSON.stringify({error:c.message},null,2)}],isError:!0}}})}var _m=f(()=>{Y();Rm()});function Tm(e){return async(t,r)=>{let n=new URL(t.req.url).pathname;if(iI.some((a)=>n===a||n.startsWith(a)))return r();let o=t.req.header("Authorization");if(!o?.startsWith("Bearer "))return t.json({error:"UNAUTHORIZED",message:"Missing or invalid Authorization header",suggestion:"Include 'Authorization: Bearer <api_key>' header"},401);let s=o.slice(7),i=We(e,s);if(!i)return t.json({error:"UNAUTHORIZED",message:"Invalid API key",suggestion:"Register with POST /auth/register"},401);return t.set("user",i),r()}}var iI;var Cm=f(()=>{Y();iI=["/auth/register","/health"]});function aI(e){if(e instanceof U)return 404;if(e instanceof Se)return 403;if(e instanceof Be)return 409;if(e instanceof Br)return 503;if(e instanceof G)return 400;if(e instanceof qe)return 422;if("code"in e)return 400;return 500}function Om(e,t){let r=aI(e);if("toJSON"in e&&typeof e.toJSON==="function")return t.json(e.toJSON(),r);return t.json({error:"INTERNAL_ERROR",message:e.message},r)}var Pm=f(()=>{Y()});function bo(e){let t=new Map;return setInterval(()=>{let r=Date.now()-60000;for(let[n,o]of t){let s=o.filter((i)=>i>r);if(s.length===0)t.delete(n);else t.set(n,s)}},300000).unref(),async(r,n)=>{let o=r.req.header("authorization")??"",s=o.startsWith("Bearer ")?o.slice(7):r.req.header("x-forwarded-for")??"unknown",i=Date.now(),a=i-60000,c=(t.get(s)??[]).filter((l)=>l>a);if(c.length>=e){let l=c[0],u=Math.ceil((l+60000-i)/1000);return r.header("Retry-After",String(u)),r.json({error:"RATE_LIMITED",message:"Too many requests"},429)}c.push(i),t.set(s,c),await n()}}function km(){let e=0;return async(t,r)=>{let n=t.req.path;if(n==="/health")return r();let o=++e,s=performance.now();console.log(`--> #${o} ${t.req.method} ${n}`);try{await r()}finally{let i=Math.round(performance.now()-s),a=t.get("user")?.email??"-",c=i>=2000?" SLOW":"";console.log(`<-- #${o} ${t.req.method} ${n} ${t.res.status} ${i}ms user=${a}${c}`)}}}import{Hono as cI}from"hono";function Nm(e){let t=new cI;return t.post("/register",async(r)=>{let{email:n}=await r.req.json();if(!n||typeof n!=="string")return r.json({error:"VALIDATION_ERROR",message:"email is required"},400);try{let o=Xe(e,{email:n}),s=ve(e,o.user.id);return r.json({apiKey:o.apiKey,userId:o.user.id,orgId:s[0]?.id})}catch(o){if(o instanceof Error&&o.message.includes("UNIQUE"))return r.json({error:"CONFLICT",message:"User with this email already exists"},409);throw o}}),t.get("/me",(r)=>{let n=r.get("user");try{let o=Ce(e,{userId:n.id});return r.json({userId:n.id,email:n.email,defaultOrgId:o.orgId,defaultDriveId:o.driveId})}catch{return r.json({userId:n.id,email:n.email,defaultOrgId:null,defaultDriveId:null})}}),t.post("/reset-key",(r)=>{let n=r.get("user"),o=ve(e,n.id);if(o.length===0){console.warn(`api key reset for user ${n.id} with no orgs; no audit event recorded`);let{apiKey:a}=on(e,n.id);return r.json({apiKey:a})}let s=o.find((a)=>a.isPersonal)??o[0],i=Gt(e,{userId:n.id,actorId:n.id,orgId:s.id});return r.json({apiKey:i.apiKey})}),t}var Dm=f(()=>{Y()});import{Hono as dI}from"hono";function Lm(e,t,r=null,n){let o=new dI;return o.post("/:orgId/ops",async(s)=>{let i=s.get("user"),a=s.req.param("orgId"),c=await s.req.json(),{op:l,...u}=c;if(!l)return s.json({error:"VALIDATION_ERROR",message:"op is required in request body"},400);let p=u.driveId||u.drive_id;delete u.driveId,delete u.drive_id;let m=Ce(e,{userId:i.id,orgId:a,driveId:p}),g={db:e,s3:t,orgId:m.orgId,driveId:m.driveId,userId:i.id,embeddingProvider:r,appUrl:n},v=await Re(g,l,u);return s.json(v)}),o}var $m=f(()=>{Y()});import{Hono as lI}from"hono";function wo(e,t,r){let n=Lt(e,t,r);if(!n)throw new U(`Org not found: ${r}`,{suggestion:"Check the org id or ask an org admin for access"});return n}function Ir(e,t,r){let n=wo(e,t,r);if(!Vr(n,"admin"))throw new Se("This operation requires 'admin' role in the org",{requiredRole:"admin",yourRole:n,suggestion:"Ask an org admin to perform this operation"});return n}function Um(e){let t=new lI;return t.get("/",(r)=>{let n=r.get("user"),o=ve(e,n.id);return r.json({orgs:o})}),t.post("/",async(r)=>{let n=r.get("user"),{name:o}=await r.req.json(),s=Ht(e,{name:o,userId:n.id});return r.json(s,201)}),t.get("/:orgId",(r)=>{let n=r.get("user"),o=r.req.param("orgId");wo(e,n.id,o);let s=rn(e,o);if(!s)return r.json({error:"NOT_FOUND",message:"Org not found"},404);return r.json(s)}),t.get("/:orgId/drives",(r)=>{let n=r.get("user"),o=r.req.param("orgId");wo(e,n.id,o);let s=ze(e,o,n.id);return r.json({drives:s})}),t.post("/:orgId/drives",async(r)=>{let n=r.get("user"),o=r.req.param("orgId");Ir(e,n.id,o);let{name:s}=await r.req.json(),i=Ut(e,{orgId:o,name:s,creatorUserId:n.id});return r.json(i,201)}),t.post("/:orgId/members/invite",async(r)=>{let n=r.get("user"),o=r.req.param("orgId");Ir(e,n.id,o);let{email:s,role:i}=await r.req.json();return Vt(e,{orgId:o,email:s,role:i}),r.json({ok:!0})}),t.get("/:orgId/members",(r)=>{let n=r.get("user"),o=r.req.param("orgId");Ir(e,n.id,o);let s=Bt(e,o);return r.json({members:s})}),t.patch("/:orgId/members/:userId",async(r)=>{let n=r.get("user"),o=r.req.param("orgId"),s=r.req.param("userId");Ir(e,n.id,o);let{role:i}=await r.req.json();try{return qt(e,{orgId:o,userId:s,role:i}),r.json({ok:!0})}catch(a){return r.json({error:"BAD_REQUEST",message:a.message},400)}}),t.post("/:orgId/members/:userId/reset-key",(r)=>{let n=r.get("user"),o=r.req.param("orgId"),s=r.req.param("userId");Ir(e,n.id,o),wo(e,s,o);let i=Gt(e,{userId:s,actorId:n.id,orgId:o});return r.json({apiKey:i.apiKey,userId:i.user.id,email:i.user.email})}),t.delete("/:orgId/members/:userId",(r)=>{let n=r.get("user"),o=r.req.param("orgId"),s=r.req.param("userId");Ir(e,n.id,o);try{return Kt(e,{orgId:o,userId:s}),r.json({ok:!0})}catch(i){return r.json({error:"BAD_REQUEST",message:i.message},400)}}),t.get("/:orgId/drives/:driveId/members",(r)=>{let n=r.get("user"),o=r.req.param("orgId"),s=r.req.param("driveId");mt(e,{driveId:s,orgId:o}),pt(e,{userId:n.id,driveId:s});let i=Mt(e,s);return r.json({members:i})}),t.patch("/:orgId/drives/:driveId/members/:userId",async(r)=>{let n=r.get("user"),o=r.req.param("orgId"),s=r.req.param("driveId"),i=r.req.param("userId");mt(e,{driveId:s,orgId:o}),pt(e,{userId:n.id,driveId:s});let{role:a}=await r.req.json();try{return Ft(e,{driveId:s,userId:i,role:a}),r.json({ok:!0})}catch(c){return r.json({error:"BAD_REQUEST",message:c.message},400)}}),t.delete("/:orgId/drives/:driveId/members/:userId",(r)=>{let n=r.get("user"),o=r.req.param("orgId"),s=r.req.param("driveId"),i=r.req.param("userId");mt(e,{driveId:s,orgId:o}),pt(e,{userId:n.id,driveId:s});try{return jt(e,{driveId:s,userId:i}),r.json({ok:!0})}catch(a){return r.json({error:"BAD_REQUEST",message:a.message},400)}}),t}var Mm=f(()=>{Y()});import{Hono as uI}from"hono";function Fm(){let e=new uI;return e.get("/openapi.json",(t)=>t.json(fo())),e}var jm=f(()=>{Y()});import{Hono as pI}from"hono";function Hm(e,t,r=null,n){let o=new pI;return o.get("/:orgId/drives/:driveId/files/:filePath{.+}/raw",async(s)=>{let i=s.get("user"),a=s.req.param("orgId"),c=s.req.param("driveId"),l=Ce(e,{userId:i.id,orgId:a,driveId:c}),p=new URL(s.req.url).pathname.match(/\/files\/(.+)\/raw$/);if(!p)return s.json({error:"VALIDATION_ERROR",message:"Invalid file path"},400);let m=ft(decodeURIComponent(p[1])),g=L(l.orgId,l.driveId,m);try{let v=await t.getObject(g),E=Vn(v.contentType||"application/octet-stream"),I=dr({db:e,driveId:l.driveId},m),R={"Content-Type":E,"Content-Length":String(v.body.length),"Content-Disposition":`attachment; filename*=UTF-8''${Gn(m.split("/").pop()??"download")}`,"Cache-Control":"private, max-age=60"};if(I){if(R.ETag=`"${I.version}"`,R["X-Agent-FS-Version"]=String(I.version),I.contentHash)R["X-Agent-FS-Content-Hash"]=I.contentHash;if(I.createdAt)R["Last-Modified"]=new Date(I.createdAt).toUTCString()}return new Response(v.body.slice(),{status:200,headers:R})}catch(v){if(v?.name==="NoSuchKey"||v?.$metadata?.httpStatusCode===404)return s.json({error:"NOT_FOUND",message:`File not found: ${m}`},404);throw v}}),o.put("/:orgId/drives/:driveId/files/:filePath{.+}/raw",async(s)=>{let i=s.get("user"),a=s.req.param("orgId"),c=s.req.param("driveId");if((s.req.header("Content-Type")??"").toLowerCase().startsWith("application/json"))return s.json({error:"VALIDATION_ERROR",message:"PUT /raw expects a binary body; use POST /ops with op=write for JSON-encoded content"},415);let u=Ce(e,{userId:i.id,orgId:a,driveId:c}),m=new URL(s.req.url).pathname.match(/\/files\/(.+)\/raw$/);if(!m)return s.json({error:"VALIDATION_ERROR",message:"Invalid file path"},400);let g=ft(decodeURIComponent(m[1])),v,E=s.req.header("If-None-Match"),I=s.req.header("If-Match");if(E==="*")v=0;else if(I!==void 0){let x=I.replace(/^"|"$/g,""),k=Number(x);if(!Number.isInteger(k)||k<0)return s.json({error:"VALIDATION_ERROR",message:`If-Match must be a non-negative integer version, got: ${I}`},400);v=k}let R=s.req.header("X-Agent-FS-Message"),P=s.req.header("X-Agent-FS-Message-Encoding"),ee;if(R!==void 0)if(P==="percent")try{ee=decodeURIComponent(R)}catch{ee=R}else ee=R;let _=await s.req.arrayBuffer(),D=new Uint8Array(_),X={db:e,s3:t,orgId:u.orgId,driveId:u.driveId,userId:i.id,embeddingProvider:r,appUrl:n},W=await gt(X,{path:g,bytes:D,message:ee,expectedVersion:v});return new Response(JSON.stringify(W),{status:200,headers:{"Content-Type":"application/json",ETag:`"${W.version}"`,"X-Agent-FS-Version":String(W.version),...W.contentHash&&{"X-Agent-FS-Content-Hash":W.contentHash},"X-Agent-FS-Deduped":W.deduped?"1":"0"}})}),o}var Bm=f(()=>{Y();Ue()});import{Hono as mI}from"hono";import{cors as qm}from"hono/cors";import{bodyLimit as fI}from"hono/body-limit";import{WebStandardStreamableHTTPServerTransport as gI}from"@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js";function Km(e,t,r=null){let n=new mI,o=q(),s=o.server?.cors?.origins??["*"];if(s.length===1&&s[0]==="*")n.use("*",qm());else n.use("*",qm({origin:s}));n.use("*",km()),n.use("*",fI({maxSize:52428800})),n.use("*",Tm(e));let i=o.server?.rateLimit?.requestsPerMinute??1200;if(i>0)n.use("/orgs/*",bo(i)),n.use("/auth/*",bo(i)),n.use("/mcp",bo(i));return n.onError((a,c)=>Om(a,c)),n.get("/health",(a)=>a.json({ok:!0,version:Oe})),n.all("/mcp",async(a)=>{let c=a.get("user"),l=new gI({sessionIdGenerator:void 0,enableJsonResponse:!0});return await xm({db:e,s3:t,embeddingProvider:r,appUrl:o.appUrl}).connect(l),l.handleRequest(a.req.raw,{authInfo:{token:a.req.header("Authorization")?.slice(7)??"",clientId:c.id,scopes:[],extra:{user:{id:c.id,email:c.email}}}})}),n.route("/auth",Nm(e)),n.route("/orgs",Um(e)),n.route("/orgs",Lm(e,t,r,o.appUrl)),n.route("/docs",Fm()),n.route("/orgs",Hm(e,t,r,o.appUrl)),n}var Vm=f(()=>{Y();_m();Cm();Pm();Dm();$m();Mm();jm();Bm()});function dt(e,t,r){return{error:{http_status:e,code:t,message:r}}}function hI(e){let t=String(e?.name??""),r=String(e?.message??e??"unknown error");if(t==="EditConflictError")return dt(409,"EDIT_CONFLICT",r);if(t==="NotFoundError")return dt(404,"NOT_FOUND",r);if(t==="PermissionDeniedError")return dt(403,"PERMISSION_DENIED",r);if(t==="ValidationError")return dt(415,"VALIDATION",r);if(t==="IndexingInProgressError")return dt(503,"INDEXING_IN_PROGRESS",r);if(/no.*api.*key|no.*user/i.test(r))return dt(401,"AUTH_MISSING",r);return dt(500,"INTERNAL",r)}function je(e){let t=e.resolveApiKey();if(!t){let n=Error("daemon has no API key configured");throw n.name="AuthError",n}let r=We(e.db,t);if(!r){let n=Error("API key did not resolve to a user");throw n.name="AuthError",n}return{userId:r.id,email:r.email}}function yt(e,t,r){try{let s=Ce(e.db,{userId:t,driveId:r});return{orgId:s.orgId,driveId:s.driveId}}catch{}let n=ve(e.db,t);for(let s of n){let a=ze(e.db,s.id,t).find((c)=>c.name===r);if(a)return{orgId:s.id,driveId:a.id}}let o=Error(`Drive not found: ${r}`);throw o.name="NotFoundError",o}function Ct(e,t,r,n){return{db:e.db,s3:e.s3,orgId:r,driveId:n,userId:t.userId,embeddingProvider:e.embeddingProvider,appUrl:e.appUrl}}async function Gm(e,t){if(!t||typeof t!=="object")return dt(400,"VALIDATION","request body must be an object");let r=t;try{return await yI(e,r)}catch(n){return hI(n)}}async function yI(e,t){switch(t.op){case"ping":return"pong";case"hello":return"ok";case"list_drives":{let r=je(e),n=ve(e.db,r.userId),o=[];for(let s of n){let i=ze(e.db,s.id,r.userId);for(let a of i)o.push({slug:a.name,id:a.id,org_id:s.id})}return{drives:o}}case"default_drive_slug":{let r=je(e),n=ve(e.db,r.userId);for(let o of n){let s=ze(e.db,o.id,r.userId),i=s.find((a)=>a.isDefault)??s[0];if(i)return{default_drive_slug:i.name}}return{default_drive_slug:null}}case"get_attr":{let r=je(e),{orgId:n,driveId:o}=yt(e,r.userId,t.drive),s=t.path,i=Ct(e,r,n,o);try{let a=await Re(i,"stat",{path:s});return{attr:{kind:"File",size:a.size,mtime_unix:Math.floor(new Date(a.modifiedAt).getTime()/1000),version:a.currentVersion??null,content_hash:null}}}catch(a){if(String(a?.name)==="NotFoundError")try{let c=await Re(i,"ls",{path:s});if(c&&Array.isArray(c.entries)&&c.entries.length>0)return{attr:{kind:"Dir",size:0,mtime_unix:0,version:null,content_hash:null}}}catch{}throw a}}case"read_dir":{let r=je(e),{orgId:n,driveId:o}=yt(e,r.userId,t.drive),s=t.path??"/",i=Ct(e,r,n,o);return{dir_entries:((await Re(i,"ls",{path:s}))?.entries??[]).map((l)=>({name:l.name,kind:l.type==="directory"?"Dir":"File",size:l.size??0,mtime_unix:l.modifiedAt?Math.floor(new Date(l.modifiedAt).getTime()/1000):0,version:null,content_hash:null}))}}case"open_read":{let r=je(e),{orgId:n,driveId:o}=yt(e,r.userId,t.drive),s=t.path,i=L(n,o,s),a=await e.s3.getObject(i),c=dr({db:e.db,driveId:o},s);return{open_read:{bytes:a.body,version:c?.version??0,content_hash:c?.contentHash??"",size:a.body.length,mtime_unix:c?.createdAt?Math.floor(new Date(c.createdAt).getTime()/1000):0}}}case"open_write":{let r=je(e),{orgId:n,driveId:o}=yt(e,r.userId,t.drive),s=t.path,i=Ct(e,r,n,o),a=vI(t.bytes),c=await gt(i,{path:s,bytes:a,expectedVersion:t.base_version??void 0});return{open_write:{version:c.version,content_hash:c.contentHash??"",deduped:c.deduped??!1}}}case"create_file":{let r=je(e),{orgId:n,driveId:o}=yt(e,r.userId,t.drive),s=t.path,i=Ct(e,r,n,o),a=await gt(i,{path:s,bytes:new Uint8Array(0),expectedVersion:0});return{open_write:{version:a.version,content_hash:a.contentHash??"",deduped:a.deduped??!1}}}case"truncate":{let r=je(e),{orgId:n,driveId:o}=yt(e,r.userId,t.drive),s=t.path,i=t.size??0,a=Ct(e,r,n,o),c=L(n,o,s),l=(await e.s3.getObject(c)).body,u=l.subarray(0,Math.min(i,l.length)),p=await gt(a,{path:s,bytes:u});return{open_write:{version:p.version,content_hash:p.contentHash??"",deduped:p.deduped??!1}}}case"unlink":{let r=je(e),{orgId:n,driveId:o}=yt(e,r.userId,t.drive),s=t.path,i=Ct(e,r,n,o);return await Re(i,"rm",{path:s}),"ok"}case"rename":{let r=je(e),{orgId:n,driveId:o}=yt(e,r.userId,t.drive),s=t.from_path,i=t.to_path,a=Ct(e,r,n,o);return await Re(a,"mv",{from:s,to:i}),"ok"}case"mkdir":return je(e),"ok";case"rmdir":{let r=je(e),{orgId:n,driveId:o}=yt(e,r.userId,t.drive),s=t.path,i=Ct(e,r,n,o);if((await Re(i,"ls",{path:s}))?.entries?.length>0)return dt(409,"VALIDATION","directory not empty");return"ok"}case"record_conflict":return console.warn("[agent-fs ipc] conflict:",JSON.stringify({drive:t.drive,path:t.path,base_version:t.base_version,head_version:t.head_version,bytes:t.bytes})),"ok";case"write_status":return console.warn("[agent-fs ipc] status:",t.line),"ok";default:return dt(400,"VALIDATION",`unknown op: ${t.op}`)}}function vI(e){if(e instanceof Uint8Array)return e;if(e instanceof ArrayBuffer)return new Uint8Array(e);if(Array.isArray(e))return new Uint8Array(e);if(e==null)return new Uint8Array(0);if(typeof e==="string")return new TextEncoder().encode(e);if(typeof Buffer<"u"&&Buffer.isBuffer(e))return new Uint8Array(e);return new Uint8Array(0)}var zm=f(()=>{Y()});import{unlinkSync as Xm,existsSync as bI,chmodSync as wI}from"fs";import{Packr as EI,Unpackr as II}from"msgpackr";function Wm(e,t){if(bI(e))try{Xm(e)}catch{}let r=Bun.listen({unix:e,socket:{open(n){n.data={buf:Buffer.alloc(0)}},data(n,o){n.data.buf=Buffer.concat([n.data.buf,o]),xI(n,t).catch((s)=>{console.error("[agent-fs ipc] frame drain failed:",s),n.end()})},close(n){n.data.buf=Buffer.alloc(0)},error(n,o){console.error("[agent-fs ipc] socket error:",o)}}});try{wI(e,384)}catch{}return{socketPath:e,stop:()=>{r.stop(!0);try{Xm(e)}catch{}}}}async function xI(e,t){while(!0){let r=e.data;if(r.buf.length<4)return;let n=r.buf.readUInt32BE(0);if(n===0||n>SI){console.error(`[agent-fs ipc] implausible frame length ${n}; closing`),e.end();return}if(r.buf.length<4+n)return;let o=r.buf.subarray(4,4+n);r.buf=r.buf.subarray(4+n);let s;try{s=RI.unpack(o)}catch(i){console.error("[agent-fs ipc] decode failed:",i),e.end();return}_I(e,t,s)}}async function _I(e,t,r){let n;try{n=await Gm(t,r.body)}catch(a){n={Error:{http_status:0,code:null,message:String(a?.message??a)}}}let o={id:r.id,body:n},s=AI.pack(o),i=Buffer.alloc(4);i.writeUInt32BE(s.length,0),e.write(Buffer.concat([i,s]))}var SI=67108864,AI,RI;var Ym=f(()=>{zm();AI=new EI({useRecords:!1}),RI=new II({useRecords:!1})});var PI={};import{join as TI}from"path";function ef(){if(console.log("Shutting down..."),zi.stop(),Xi)Xi.stop();process.exit(0)}var mn,Wi,Zm,CI,Eo,Yi=null,OI,zi,Jm,Qm,Xi=null;var tf=f(async()=>{Y();Vm();Ym();mn=q(),Wi=Et(),Zm=Wi.$client,CI=En(Zm),Eo=sr(mn.s3);try{Eo.versioningEnabled=await Eo.checkVersioningEnabled()}catch(e){console.warn("Could not reconcile storage versioning capability:",e)}try{Yi=await wr(mn.embedding)}catch(e){console.warn("Embedding provider unavailable, semantic search disabled:",e)}OI=Km(Wi,Eo,Yi),zi=Bun.serve({fetch:OI.fetch,port:mn.server.port,hostname:mn.server.host});console.log(`agent-fs daemon running on http://${zi.hostname}:${zi.port}`);if(CI)In(Zm,{log:(e)=>console.log(e)}).catch((e)=>{console.error("search index migration failed (will resume on next start):",e)});Jm=performance.now();setInterval(()=>{let e=performance.now(),t=e-Jm-1000;if(t>5000)console.error(`event-loop was blocked for ~${(t/1000).toFixed(1)}s (rss=${Math.round(process.memoryUsage.rss()/1024/1024)}MB)`);Jm=e},1000).unref();Qm=TI(le(),"agent-fs.sock");try{Xi=Wm(Qm,{db:Wi,s3:Eo,embeddingProvider:Yi,appUrl:mn.appUrl,resolveApiKey:()=>q().auth?.apiKey??null}),console.log(`agent-fs IPC listening on ${Qm}`)}catch(e){console.warn("IPC listener unavailable:",e)}process.on("SIGTERM",ef);process.on("SIGINT",ef)});Y();import{Command as kI}from"commander";Y();class Di{baseUrl;apiKey;constructor(){let e=q();this.baseUrl=process.env.AGENT_FS_API_URL??e.apiUrl??`http://${e.server.host}:${e.server.port}`,this.apiKey=process.env.AGENT_FS_API_KEY??e.apiKey??e.auth.apiKey}async request(e,t){let r=new Headers(t?.headers);if(this.apiKey)r.set("Authorization",`Bearer ${this.apiKey}`);r.set("Content-Type","application/json");let n;try{n=await fetch(`${this.baseUrl}${e}`,{...t,headers:r})}catch(s){throw Error(`Cannot connect to agent-fs daemon at ${this.baseUrl}. Is it running? Start with: agent-fs daemon start`)}let o;try{o=await n.json()}catch{let s=await n.text().catch(()=>"");throw Error(`Unexpected response from daemon (${n.status}): ${s||"empty"}`)}if(!n.ok){let s=o.message??o.error??"Request failed",i=o.suggestion?`
220
+ Start a daemon with \`agent-fs daemon start\` or set AGENT_FS_API_URL to connect to a remote server.`),process.exit(1)}Gi=new WE({name:"agent-fs",version:Oe},{capabilities:{tools:{}}});Gi.setRequestHandler(ZE,async()=>await Vi.listTools());Gi.setRequestHandler(eI,async(e)=>await Vi.callTool(e.params));rI=new YE;await Gi.connect(rI);console.error("[agent-fs] MCP proxy connected to "+Ki)});import{z as Sm}from"zod";function Am(e,t){let r=vr();for(let n of r){let o=ct(n);if(!o)continue;e.tool(n,o.description,o.schema instanceof Sm.ZodObject?o.schema.shape:{params:Sm.any()},async(s,i)=>{let a=t(i);try{let c=await Re(a,n,s);return{content:[{type:"text",text:JSON.stringify(c,null,2)}]}}catch(c){return{content:[{type:"text",text:JSON.stringify({error:c?.code??"ERROR",message:c?.message??String(c),...c?.suggestion&&{suggestion:c.suggestion}},null,2)}],isError:!0}}})}}var Rm=f(()=>{Y()});import{McpServer as oI}from"@modelcontextprotocol/sdk/server/mcp.js";import{z as Tt}from"zod";function xm(e){let{db:t,s3:r,embeddingProvider:n,appUrl:o}=e,s=new oI({name:"agent-fs",version:Oe}),i=(a)=>{let c=a.authInfo;if(!c?.extra?.user)throw Error("No auth context \u2014 MCP must be accessed through the HTTP server");let l=c.extra.user,u=Ce(t,{userId:l.id});return{db:t,s3:r,orgId:u.orgId,driveId:u.driveId,userId:l.id,embeddingProvider:n,appUrl:o}};return Am(s,i),s.tool("health","Check agent-fs system health: database, S3, embeddings, version.",{},async(a,c)=>{let l={version:Oe};try{let u=i(c),p=await Re(u,"ls",{path:"/"},{skipAuth:!0});l.database={ok:!0,rootEntries:p.entries?.length??0}}catch(u){l.database={ok:!1,error:u.message}}try{await r.listObjects("",{delimiter:"/"}),l.s3={ok:!0}}catch(u){l.s3={ok:!1,error:u.message}}return l.embeddings={configured:!!n},{content:[{type:"text",text:JSON.stringify(l,null,2)}]}}),sI(s,{db:t,getContext:i}),s}function sI(e,t){let{db:r,getContext:n}=t,o=(s,i)=>{if(i)mt(r,{driveId:i,orgId:s.orgId}),pt(r,{userId:s.userId,driveId:i});else zr(r,{userId:s.userId,orgId:s.orgId,requiredRole:"admin"})};e.tool("whoami","Get current user identity, org memberships, and drive roles.",{},async(s,i)=>{let a=n(i),c=a.userId,u=ve(r,c).map((g)=>{let v=ze(r,g.id,c);return{orgId:g.id,orgName:g.name,drives:v.map((E)=>({driveId:E.id,driveName:E.name,role:Ke(r,c,E.id)}))}}),p=i.authInfo?.extra?.user?.email,m={userId:c,...p?{email:p}:{},activeOrg:a.orgId,activeDrive:a.driveId,memberships:u};return{content:[{type:"text",text:JSON.stringify(m,null,2)}]}}),e.tool("member-list","List members of the current org (requires org admin), or a specific drive in the current org (requires drive admin or org admin) if driveId is provided.",{driveId:Tt.string().optional().describe("Drive ID to list members for. Omit for org members.")},async(s,i)=>{let a=n(i);try{o(a,s.driveId);let c=s.driveId?Mt(r,s.driveId):Bt(r,a.orgId);return{content:[{type:"text",text:JSON.stringify({members:c},null,2)}]}}catch(c){return{content:[{type:"text",text:JSON.stringify({error:c.message},null,2)}],isError:!0}}}),e.tool("member-invite","Invite a user to the current org by email (requires org admin). The user must already have an agent-fs account.",{email:Tt.string().describe("Email of the user to invite"),role:Tt.enum(["viewer","editor","admin"]).describe("Role to assign")},async(s,i)=>{let a=n(i);try{return o(a),Vt(r,{orgId:a.orgId,email:s.email,role:s.role}),{content:[{type:"text",text:JSON.stringify({ok:!0,invited:s.email,role:s.role},null,2)}]}}catch(c){return{content:[{type:"text",text:JSON.stringify({error:c.message},null,2)}],isError:!0}}}),e.tool("member-update-role","Update a member's role in the current org (requires org admin) or a specific drive in the current org (requires drive admin or org admin).",{email:Tt.string().describe("Email of the member"),role:Tt.enum(["viewer","editor","admin"]).describe("New role"),driveId:Tt.string().optional().describe("Drive ID to update role for. Omit for org role.")},async(s,i)=>{let a=n(i);try{o(a,s.driveId);let c=br(r,s.email);if(!c)throw Error(`User with email ${s.email} not found`);if(s.driveId)Ft(r,{driveId:s.driveId,userId:c.id,role:s.role});else qt(r,{orgId:a.orgId,userId:c.id,role:s.role});return{content:[{type:"text",text:JSON.stringify({ok:!0,email:s.email,role:s.role},null,2)}]}}catch(c){return{content:[{type:"text",text:JSON.stringify({error:c.message},null,2)}],isError:!0}}}),e.tool("member-remove","Remove a member from the current org (cascades to all drives; requires org admin) or from a specific drive in the current org only (requires drive admin or org admin).",{email:Tt.string().describe("Email of the member to remove"),driveId:Tt.string().optional().describe("Drive ID to remove from. Omit to remove from org.")},async(s,i)=>{let a=n(i);try{o(a,s.driveId);let c=br(r,s.email);if(!c)throw Error(`User with email ${s.email} not found`);if(s.driveId)jt(r,{driveId:s.driveId,userId:c.id});else Kt(r,{orgId:a.orgId,userId:c.id});return{content:[{type:"text",text:JSON.stringify({ok:!0,removed:s.email},null,2)}]}}catch(c){return{content:[{type:"text",text:JSON.stringify({error:c.message},null,2)}],isError:!0}}})}var _m=f(()=>{Y();Rm()});function Tm(e){return async(t,r)=>{let n=new URL(t.req.url).pathname;if(iI.some((a)=>n===a||n.startsWith(a)))return r();let o=t.req.header("Authorization");if(!o?.startsWith("Bearer "))return t.json({error:"UNAUTHORIZED",message:"Missing or invalid Authorization header",suggestion:"Include 'Authorization: Bearer <api_key>' header"},401);let s=o.slice(7),i=We(e,s);if(!i)return t.json({error:"UNAUTHORIZED",message:"Invalid API key",suggestion:"Register with POST /auth/register"},401);return t.set("user",i),r()}}var iI;var Cm=f(()=>{Y();iI=["/auth/register","/health"]});function aI(e){if(e instanceof U)return 404;if(e instanceof Se)return 403;if(e instanceof Be)return 409;if(e instanceof Br)return 503;if(e instanceof G)return 400;if(e instanceof qe)return 422;if("code"in e)return 400;return 500}function Om(e,t){let r=aI(e);if("toJSON"in e&&typeof e.toJSON==="function")return t.json(e.toJSON(),r);return t.json({error:"INTERNAL_ERROR",message:e.message},r)}var Pm=f(()=>{Y()});function bo(e){let t=new Map;return setInterval(()=>{let r=Date.now()-60000;for(let[n,o]of t){let s=o.filter((i)=>i>r);if(s.length===0)t.delete(n);else t.set(n,s)}},300000).unref(),async(r,n)=>{let o=r.req.header("authorization")??"",s=o.startsWith("Bearer ")?o.slice(7):r.req.header("x-forwarded-for")??"unknown",i=Date.now(),a=i-60000,c=(t.get(s)??[]).filter((l)=>l>a);if(c.length>=e){let l=c[0],u=Math.ceil((l+60000-i)/1000);return r.header("Retry-After",String(u)),r.json({error:"RATE_LIMITED",message:"Too many requests"},429)}c.push(i),t.set(s,c),await n()}}function km(){let e=0;return async(t,r)=>{let n=t.req.path;if(n==="/health")return r();let o=++e,s=performance.now();console.log(`--> #${o} ${t.req.method} ${n}`);try{await r()}finally{let i=Math.round(performance.now()-s),a=t.get("user")?.email??"-",c=i>=2000?" SLOW":"";console.log(`<-- #${o} ${t.req.method} ${n} ${t.res.status} ${i}ms user=${a}${c}`)}}}import{Hono as cI}from"hono";function Nm(e){let t=new cI;return t.post("/register",async(r)=>{let{email:n}=await r.req.json();if(!n||typeof n!=="string")return r.json({error:"VALIDATION_ERROR",message:"email is required"},400);try{let o=Xe(e,{email:n}),s=ve(e,o.user.id);return r.json({apiKey:o.apiKey,userId:o.user.id,orgId:s[0]?.id})}catch(o){if(o instanceof Error&&o.message.includes("UNIQUE"))return r.json({error:"CONFLICT",message:"User with this email already exists"},409);throw o}}),t.get("/me",(r)=>{let n=r.get("user");try{let o=Ce(e,{userId:n.id});return r.json({userId:n.id,email:n.email,defaultOrgId:o.orgId,defaultDriveId:o.driveId})}catch{return r.json({userId:n.id,email:n.email,defaultOrgId:null,defaultDriveId:null})}}),t.post("/reset-key",(r)=>{let n=r.get("user"),o=ve(e,n.id);if(o.length===0){console.warn(`api key reset for user ${n.id} with no orgs; no audit event recorded`);let{apiKey:a}=on(e,n.id);return r.json({apiKey:a})}let s=o.find((a)=>a.isPersonal)??o[0],i=Gt(e,{userId:n.id,actorId:n.id,orgId:s.id});return r.json({apiKey:i.apiKey})}),t}var Dm=f(()=>{Y()});import{Hono as dI}from"hono";function Lm(e,t,r=null,n){let o=new dI;return o.post("/:orgId/ops",async(s)=>{let i=s.get("user"),a=s.req.param("orgId"),c=await s.req.json(),{op:l,...u}=c;if(!l)return s.json({error:"VALIDATION_ERROR",message:"op is required in request body"},400);let p=u.driveId||u.drive_id;delete u.driveId,delete u.drive_id;let m=Ce(e,{userId:i.id,orgId:a,driveId:p}),g={db:e,s3:t,orgId:m.orgId,driveId:m.driveId,userId:i.id,embeddingProvider:r,appUrl:n},v=await Re(g,l,u);return s.json(v)}),o}var $m=f(()=>{Y()});import{Hono as lI}from"hono";function wo(e,t,r){let n=Lt(e,t,r);if(!n)throw new U(`Org not found: ${r}`,{suggestion:"Check the org id or ask an org admin for access"});return n}function Ir(e,t,r){let n=wo(e,t,r);if(!Vr(n,"admin"))throw new Se("This operation requires 'admin' role in the org",{requiredRole:"admin",yourRole:n,suggestion:"Ask an org admin to perform this operation"});return n}function Um(e){let t=new lI;return t.get("/",(r)=>{let n=r.get("user"),o=ve(e,n.id);return r.json({orgs:o})}),t.post("/",async(r)=>{let n=r.get("user"),{name:o}=await r.req.json(),s=Ht(e,{name:o,userId:n.id});return r.json(s,201)}),t.get("/:orgId",(r)=>{let n=r.get("user"),o=r.req.param("orgId");wo(e,n.id,o);let s=rn(e,o);if(!s)return r.json({error:"NOT_FOUND",message:"Org not found"},404);return r.json(s)}),t.get("/:orgId/drives",(r)=>{let n=r.get("user"),o=r.req.param("orgId");wo(e,n.id,o);let s=ze(e,o,n.id);return r.json({drives:s})}),t.post("/:orgId/drives",async(r)=>{let n=r.get("user"),o=r.req.param("orgId");Ir(e,n.id,o);let{name:s}=await r.req.json(),i=Ut(e,{orgId:o,name:s,creatorUserId:n.id});return r.json(i,201)}),t.post("/:orgId/members/invite",async(r)=>{let n=r.get("user"),o=r.req.param("orgId");Ir(e,n.id,o);let{email:s,role:i}=await r.req.json();return Vt(e,{orgId:o,email:s,role:i}),r.json({ok:!0})}),t.get("/:orgId/members",(r)=>{let n=r.get("user"),o=r.req.param("orgId");Ir(e,n.id,o);let s=Bt(e,o);return r.json({members:s})}),t.patch("/:orgId/members/:userId",async(r)=>{let n=r.get("user"),o=r.req.param("orgId"),s=r.req.param("userId");Ir(e,n.id,o);let{role:i}=await r.req.json();try{return qt(e,{orgId:o,userId:s,role:i}),r.json({ok:!0})}catch(a){return r.json({error:"BAD_REQUEST",message:a.message},400)}}),t.post("/:orgId/members/:userId/reset-key",(r)=>{let n=r.get("user"),o=r.req.param("orgId"),s=r.req.param("userId");Ir(e,n.id,o),wo(e,s,o);let i=Gt(e,{userId:s,actorId:n.id,orgId:o});return r.json({apiKey:i.apiKey,userId:i.user.id,email:i.user.email})}),t.delete("/:orgId/members/:userId",(r)=>{let n=r.get("user"),o=r.req.param("orgId"),s=r.req.param("userId");Ir(e,n.id,o);try{return Kt(e,{orgId:o,userId:s}),r.json({ok:!0})}catch(i){return r.json({error:"BAD_REQUEST",message:i.message},400)}}),t.get("/:orgId/drives/:driveId/members",(r)=>{let n=r.get("user"),o=r.req.param("orgId"),s=r.req.param("driveId");mt(e,{driveId:s,orgId:o}),pt(e,{userId:n.id,driveId:s});let i=Mt(e,s);return r.json({members:i})}),t.patch("/:orgId/drives/:driveId/members/:userId",async(r)=>{let n=r.get("user"),o=r.req.param("orgId"),s=r.req.param("driveId"),i=r.req.param("userId");mt(e,{driveId:s,orgId:o}),pt(e,{userId:n.id,driveId:s});let{role:a}=await r.req.json();try{return Ft(e,{driveId:s,userId:i,role:a}),r.json({ok:!0})}catch(c){return r.json({error:"BAD_REQUEST",message:c.message},400)}}),t.delete("/:orgId/drives/:driveId/members/:userId",(r)=>{let n=r.get("user"),o=r.req.param("orgId"),s=r.req.param("driveId"),i=r.req.param("userId");mt(e,{driveId:s,orgId:o}),pt(e,{userId:n.id,driveId:s});try{return jt(e,{driveId:s,userId:i}),r.json({ok:!0})}catch(a){return r.json({error:"BAD_REQUEST",message:a.message},400)}}),t}var Mm=f(()=>{Y()});import{Hono as uI}from"hono";function Fm(){let e=new uI;return e.get("/openapi.json",(t)=>t.json(fo())),e}var jm=f(()=>{Y()});import{Hono as pI}from"hono";function Hm(e,t,r=null,n){let o=new pI;return o.get("/:orgId/drives/:driveId/files/*",async(s)=>{let i=s.get("user"),a=s.req.param("orgId"),c=s.req.param("driveId"),l=Ce(e,{userId:i.id,orgId:a,driveId:c}),p=new URL(s.req.url).pathname.match(/\/files\/(.+)\/raw$/);if(!p)return s.json({error:"VALIDATION_ERROR",message:"Invalid file path"},400);let m=ft(decodeURIComponent(p[1])),g=L(l.orgId,l.driveId,m);try{let v=await t.getObject(g),E=Vn(v.contentType||"application/octet-stream"),I=dr({db:e,driveId:l.driveId},m),R={"Content-Type":E,"Content-Length":String(v.body.length),"Content-Disposition":`attachment; filename*=UTF-8''${Gn(m.split("/").pop()??"download")}`,"Cache-Control":"private, max-age=60"};if(I){if(R.ETag=`"${I.version}"`,R["X-Agent-FS-Version"]=String(I.version),I.contentHash)R["X-Agent-FS-Content-Hash"]=I.contentHash;if(I.createdAt)R["Last-Modified"]=new Date(I.createdAt).toUTCString()}return new Response(v.body.slice(),{status:200,headers:R})}catch(v){if(v?.name==="NoSuchKey"||v?.$metadata?.httpStatusCode===404)return s.json({error:"NOT_FOUND",message:`File not found: ${m}`},404);throw v}}),o.put("/:orgId/drives/:driveId/files/*",async(s)=>{let i=s.get("user"),a=s.req.param("orgId"),c=s.req.param("driveId");if((s.req.header("Content-Type")??"").toLowerCase().startsWith("application/json"))return s.json({error:"VALIDATION_ERROR",message:"PUT /raw expects a binary body; use POST /ops with op=write for JSON-encoded content"},415);let u=Ce(e,{userId:i.id,orgId:a,driveId:c}),m=new URL(s.req.url).pathname.match(/\/files\/(.+)\/raw$/);if(!m)return s.json({error:"VALIDATION_ERROR",message:"Invalid file path"},400);let g=ft(decodeURIComponent(m[1])),v,E=s.req.header("If-None-Match"),I=s.req.header("If-Match");if(E==="*")v=0;else if(I!==void 0){let x=I.replace(/^"|"$/g,""),k=Number(x);if(!Number.isInteger(k)||k<0)return s.json({error:"VALIDATION_ERROR",message:`If-Match must be a non-negative integer version, got: ${I}`},400);v=k}let R=s.req.header("X-Agent-FS-Message"),P=s.req.header("X-Agent-FS-Message-Encoding"),ee;if(R!==void 0)if(P==="percent")try{ee=decodeURIComponent(R)}catch{ee=R}else ee=R;let _=await s.req.arrayBuffer(),D=new Uint8Array(_),X={db:e,s3:t,orgId:u.orgId,driveId:u.driveId,userId:i.id,embeddingProvider:r,appUrl:n},W=await gt(X,{path:g,bytes:D,message:ee,expectedVersion:v});return new Response(JSON.stringify(W),{status:200,headers:{"Content-Type":"application/json",ETag:`"${W.version}"`,"X-Agent-FS-Version":String(W.version),...W.contentHash&&{"X-Agent-FS-Content-Hash":W.contentHash},"X-Agent-FS-Deduped":W.deduped?"1":"0"}})}),o}var Bm=f(()=>{Y();Ue()});import{Hono as mI}from"hono";import{cors as qm}from"hono/cors";import{bodyLimit as fI}from"hono/body-limit";import{WebStandardStreamableHTTPServerTransport as gI}from"@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js";function Km(e,t,r=null){let n=new mI,o=q(),s=o.server?.cors?.origins??["*"];if(s.length===1&&s[0]==="*")n.use("*",qm());else n.use("*",qm({origin:s}));n.use("*",km()),n.use("*",fI({maxSize:52428800})),n.use("*",Tm(e));let i=o.server?.rateLimit?.requestsPerMinute??1200;if(i>0)n.use("/orgs/*",bo(i)),n.use("/auth/*",bo(i)),n.use("/mcp",bo(i));return n.onError((a,c)=>Om(a,c)),n.get("/health",(a)=>a.json({ok:!0,version:Oe})),n.all("/mcp",async(a)=>{let c=a.get("user"),l=new gI({sessionIdGenerator:void 0,enableJsonResponse:!0});return await xm({db:e,s3:t,embeddingProvider:r,appUrl:o.appUrl}).connect(l),l.handleRequest(a.req.raw,{authInfo:{token:a.req.header("Authorization")?.slice(7)??"",clientId:c.id,scopes:[],extra:{user:{id:c.id,email:c.email}}}})}),n.route("/auth",Nm(e)),n.route("/orgs",Um(e)),n.route("/orgs",Lm(e,t,r,o.appUrl)),n.route("/docs",Fm()),n.route("/orgs",Hm(e,t,r,o.appUrl)),n}var Vm=f(()=>{Y();_m();Cm();Pm();Dm();$m();Mm();jm();Bm()});function dt(e,t,r){return{error:{http_status:e,code:t,message:r}}}function hI(e){let t=String(e?.name??""),r=String(e?.message??e??"unknown error");if(t==="EditConflictError")return dt(409,"EDIT_CONFLICT",r);if(t==="NotFoundError")return dt(404,"NOT_FOUND",r);if(t==="PermissionDeniedError")return dt(403,"PERMISSION_DENIED",r);if(t==="ValidationError")return dt(415,"VALIDATION",r);if(t==="IndexingInProgressError")return dt(503,"INDEXING_IN_PROGRESS",r);if(/no.*api.*key|no.*user/i.test(r))return dt(401,"AUTH_MISSING",r);return dt(500,"INTERNAL",r)}function je(e){let t=e.resolveApiKey();if(!t){let n=Error("daemon has no API key configured");throw n.name="AuthError",n}let r=We(e.db,t);if(!r){let n=Error("API key did not resolve to a user");throw n.name="AuthError",n}return{userId:r.id,email:r.email}}function yt(e,t,r){try{let s=Ce(e.db,{userId:t,driveId:r});return{orgId:s.orgId,driveId:s.driveId}}catch{}let n=ve(e.db,t);for(let s of n){let a=ze(e.db,s.id,t).find((c)=>c.name===r);if(a)return{orgId:s.id,driveId:a.id}}let o=Error(`Drive not found: ${r}`);throw o.name="NotFoundError",o}function Ct(e,t,r,n){return{db:e.db,s3:e.s3,orgId:r,driveId:n,userId:t.userId,embeddingProvider:e.embeddingProvider,appUrl:e.appUrl}}async function Gm(e,t){if(!t||typeof t!=="object")return dt(400,"VALIDATION","request body must be an object");let r=t;try{return await yI(e,r)}catch(n){return hI(n)}}async function yI(e,t){switch(t.op){case"ping":return"pong";case"hello":return"ok";case"list_drives":{let r=je(e),n=ve(e.db,r.userId),o=[];for(let s of n){let i=ze(e.db,s.id,r.userId);for(let a of i)o.push({slug:a.name,id:a.id,org_id:s.id})}return{drives:o}}case"default_drive_slug":{let r=je(e),n=ve(e.db,r.userId);for(let o of n){let s=ze(e.db,o.id,r.userId),i=s.find((a)=>a.isDefault)??s[0];if(i)return{default_drive_slug:i.name}}return{default_drive_slug:null}}case"get_attr":{let r=je(e),{orgId:n,driveId:o}=yt(e,r.userId,t.drive),s=t.path,i=Ct(e,r,n,o);try{let a=await Re(i,"stat",{path:s});return{attr:{kind:"File",size:a.size,mtime_unix:Math.floor(new Date(a.modifiedAt).getTime()/1000),version:a.currentVersion??null,content_hash:null}}}catch(a){if(String(a?.name)==="NotFoundError")try{let c=await Re(i,"ls",{path:s});if(c&&Array.isArray(c.entries)&&c.entries.length>0)return{attr:{kind:"Dir",size:0,mtime_unix:0,version:null,content_hash:null}}}catch{}throw a}}case"read_dir":{let r=je(e),{orgId:n,driveId:o}=yt(e,r.userId,t.drive),s=t.path??"/",i=Ct(e,r,n,o);return{dir_entries:((await Re(i,"ls",{path:s}))?.entries??[]).map((l)=>({name:l.name,kind:l.type==="directory"?"Dir":"File",size:l.size??0,mtime_unix:l.modifiedAt?Math.floor(new Date(l.modifiedAt).getTime()/1000):0,version:null,content_hash:null}))}}case"open_read":{let r=je(e),{orgId:n,driveId:o}=yt(e,r.userId,t.drive),s=t.path,i=L(n,o,s),a=await e.s3.getObject(i),c=dr({db:e.db,driveId:o},s);return{open_read:{bytes:a.body,version:c?.version??0,content_hash:c?.contentHash??"",size:a.body.length,mtime_unix:c?.createdAt?Math.floor(new Date(c.createdAt).getTime()/1000):0}}}case"open_write":{let r=je(e),{orgId:n,driveId:o}=yt(e,r.userId,t.drive),s=t.path,i=Ct(e,r,n,o),a=vI(t.bytes),c=await gt(i,{path:s,bytes:a,expectedVersion:t.base_version??void 0});return{open_write:{version:c.version,content_hash:c.contentHash??"",deduped:c.deduped??!1}}}case"create_file":{let r=je(e),{orgId:n,driveId:o}=yt(e,r.userId,t.drive),s=t.path,i=Ct(e,r,n,o),a=await gt(i,{path:s,bytes:new Uint8Array(0),expectedVersion:0});return{open_write:{version:a.version,content_hash:a.contentHash??"",deduped:a.deduped??!1}}}case"truncate":{let r=je(e),{orgId:n,driveId:o}=yt(e,r.userId,t.drive),s=t.path,i=t.size??0,a=Ct(e,r,n,o),c=L(n,o,s),l=(await e.s3.getObject(c)).body,u=l.subarray(0,Math.min(i,l.length)),p=await gt(a,{path:s,bytes:u});return{open_write:{version:p.version,content_hash:p.contentHash??"",deduped:p.deduped??!1}}}case"unlink":{let r=je(e),{orgId:n,driveId:o}=yt(e,r.userId,t.drive),s=t.path,i=Ct(e,r,n,o);return await Re(i,"rm",{path:s}),"ok"}case"rename":{let r=je(e),{orgId:n,driveId:o}=yt(e,r.userId,t.drive),s=t.from_path,i=t.to_path,a=Ct(e,r,n,o);return await Re(a,"mv",{from:s,to:i}),"ok"}case"mkdir":return je(e),"ok";case"rmdir":{let r=je(e),{orgId:n,driveId:o}=yt(e,r.userId,t.drive),s=t.path,i=Ct(e,r,n,o);if((await Re(i,"ls",{path:s}))?.entries?.length>0)return dt(409,"VALIDATION","directory not empty");return"ok"}case"record_conflict":return console.warn("[agent-fs ipc] conflict:",JSON.stringify({drive:t.drive,path:t.path,base_version:t.base_version,head_version:t.head_version,bytes:t.bytes})),"ok";case"write_status":return console.warn("[agent-fs ipc] status:",t.line),"ok";default:return dt(400,"VALIDATION",`unknown op: ${t.op}`)}}function vI(e){if(e instanceof Uint8Array)return e;if(e instanceof ArrayBuffer)return new Uint8Array(e);if(Array.isArray(e))return new Uint8Array(e);if(e==null)return new Uint8Array(0);if(typeof e==="string")return new TextEncoder().encode(e);if(typeof Buffer<"u"&&Buffer.isBuffer(e))return new Uint8Array(e);return new Uint8Array(0)}var zm=f(()=>{Y()});import{unlinkSync as Xm,existsSync as bI,chmodSync as wI}from"fs";import{Packr as EI,Unpackr as II}from"msgpackr";function Wm(e,t){if(bI(e))try{Xm(e)}catch{}let r=Bun.listen({unix:e,socket:{open(n){n.data={buf:Buffer.alloc(0)}},data(n,o){n.data.buf=Buffer.concat([n.data.buf,o]),xI(n,t).catch((s)=>{console.error("[agent-fs ipc] frame drain failed:",s),n.end()})},close(n){n.data.buf=Buffer.alloc(0)},error(n,o){console.error("[agent-fs ipc] socket error:",o)}}});try{wI(e,384)}catch{}return{socketPath:e,stop:()=>{r.stop(!0);try{Xm(e)}catch{}}}}async function xI(e,t){while(!0){let r=e.data;if(r.buf.length<4)return;let n=r.buf.readUInt32BE(0);if(n===0||n>SI){console.error(`[agent-fs ipc] implausible frame length ${n}; closing`),e.end();return}if(r.buf.length<4+n)return;let o=r.buf.subarray(4,4+n);r.buf=r.buf.subarray(4+n);let s;try{s=RI.unpack(o)}catch(i){console.error("[agent-fs ipc] decode failed:",i),e.end();return}_I(e,t,s)}}async function _I(e,t,r){let n;try{n=await Gm(t,r.body)}catch(a){n={Error:{http_status:0,code:null,message:String(a?.message??a)}}}let o={id:r.id,body:n},s=AI.pack(o),i=Buffer.alloc(4);i.writeUInt32BE(s.length,0),e.write(Buffer.concat([i,s]))}var SI=67108864,AI,RI;var Ym=f(()=>{zm();AI=new EI({useRecords:!1}),RI=new II({useRecords:!1})});var PI={};import{join as TI}from"path";function ef(){if(console.log("Shutting down..."),zi.stop(),Xi)Xi.stop();process.exit(0)}var mn,Wi,Zm,CI,Eo,Yi=null,OI,zi,Jm,Qm,Xi=null;var tf=f(async()=>{Y();Vm();Ym();mn=q(),Wi=Et(),Zm=Wi.$client,CI=En(Zm),Eo=sr(mn.s3);try{Eo.versioningEnabled=await Eo.checkVersioningEnabled()}catch(e){console.warn("Could not reconcile storage versioning capability:",e)}try{Yi=await wr(mn.embedding)}catch(e){console.warn("Embedding provider unavailable, semantic search disabled:",e)}OI=Km(Wi,Eo,Yi),zi=Bun.serve({fetch:OI.fetch,port:mn.server.port,hostname:mn.server.host});console.log(`agent-fs daemon running on http://${zi.hostname}:${zi.port}`);if(CI)In(Zm,{log:(e)=>console.log(e)}).catch((e)=>{console.error("search index migration failed (will resume on next start):",e)});Jm=performance.now();setInterval(()=>{let e=performance.now(),t=e-Jm-1000;if(t>5000)console.error(`event-loop was blocked for ~${(t/1000).toFixed(1)}s (rss=${Math.round(process.memoryUsage.rss()/1024/1024)}MB)`);Jm=e},1000).unref();Qm=TI(le(),"agent-fs.sock");try{Xi=Wm(Qm,{db:Wi,s3:Eo,embeddingProvider:Yi,appUrl:mn.appUrl,resolveApiKey:()=>q().auth?.apiKey??null}),console.log(`agent-fs IPC listening on ${Qm}`)}catch(e){console.warn("IPC listener unavailable:",e)}process.on("SIGTERM",ef);process.on("SIGINT",ef)});Y();import{Command as kI}from"commander";Y();class Di{baseUrl;apiKey;constructor(){let e=q();this.baseUrl=process.env.AGENT_FS_API_URL??e.apiUrl??`http://${e.server.host}:${e.server.port}`,this.apiKey=process.env.AGENT_FS_API_KEY??e.apiKey??e.auth.apiKey}async request(e,t){let r=new Headers(t?.headers);if(this.apiKey)r.set("Authorization",`Bearer ${this.apiKey}`);r.set("Content-Type","application/json");let n;try{n=await fetch(`${this.baseUrl}${e}`,{...t,headers:r})}catch(s){throw Error(`Cannot connect to agent-fs daemon at ${this.baseUrl}. Is it running? Start with: agent-fs daemon start`)}let o;try{o=await n.json()}catch{let s=await n.text().catch(()=>"");throw Error(`Unexpected response from daemon (${n.status}): ${s||"empty"}`)}if(!n.ok){let s=o.message??o.error??"Request failed",i=o.suggestion?`
221
221
  Suggestion: ${o.suggestion}`:"";throw Error(`${s}${i}`)}return o}async get(e){return this.request(e)}async post(e,t){return this.request(e,{method:"POST",body:JSON.stringify(t)})}async patch(e,t){return this.request(e,{method:"PATCH",body:JSON.stringify(t)})}async del(e){return this.request(e,{method:"DELETE"})}async callOp(e,t,r){return this.post(`/orgs/${e}/ops`,{op:t,...r})}async getMe(){return this.get("/auth/me")}setApiKey(e){this.apiKey=e}async putRaw(e,t,r,n,o={}){let s=new Headers;if(s.set("Content-Type","application/octet-stream"),this.apiKey)s.set("Authorization",`Bearer ${this.apiKey}`);if(o.ifMatch!==void 0)s.set("If-Match",String(o.ifMatch));if(o.contentHash)s.set("X-Agent-FS-Content-Hash",o.contentHash);if(o.message)s.set("X-Agent-FS-Message",encodeURIComponent(o.message)),s.set("X-Agent-FS-Message-Encoding","percent");let i=encodeURI(r.replace(/^\/+/,"")),a=`${this.baseUrl}/orgs/${e}/drives/${t}/files/${i}/raw`,c;try{c=await fetch(a,{method:"PUT",headers:s,body:n})}catch(p){throw Error(`Cannot connect to agent-fs daemon at ${this.baseUrl}. Is it running? Start with: agent-fs daemon start`)}let l,u=await c.text();try{l=JSON.parse(u)}catch{throw Error(`Unexpected response from daemon (${c.status}): ${u||"empty"}`)}if(!c.ok){let p=l.message??l.error??"Request failed",m=l.suggestion?`
222
222
  Suggestion: ${l.suggestion}`:"";throw Error(`${p}${m}`)}return{version:l.version,path:l.path??r,deduped:Boolean(l.deduped),contentHash:c.headers.get("X-Agent-FS-Content-Hash")??l.contentHash??null,size:l.size??n.length}}async getRaw(e,t,r){let n=new Headers;if(this.apiKey)n.set("Authorization",`Bearer ${this.apiKey}`);let o=encodeURI(r.replace(/^\/+/,"")),s=`${this.baseUrl}/orgs/${e}/drives/${t}/files/${o}/raw`,i;try{i=await fetch(s,{method:"GET",headers:n})}catch(a){throw Error(`Cannot connect to agent-fs daemon at ${this.baseUrl}. Is it running? Start with: agent-fs daemon start`)}if(!i.ok){let a,c=await i.text().catch(()=>"");try{a=JSON.parse(c)}catch{throw Error(`Unexpected response from daemon (${i.status}): ${c||"empty"}`)}let l=a.message??a.error??"Request failed",u=a.suggestion?`
223
223
  Suggestion: ${a.suggestion}`:"";throw Error(`${l}${u}`)}return{bytes:new Uint8Array(await i.arrayBuffer()),contentType:i.headers.get("Content-Type"),version:Sw(i.headers.get("X-Agent-FS-Version")),contentHash:i.headers.get("X-Agent-FS-Content-Hash")}}}function Sw(e){if(e===null)return null;let t=Number(e);return Number.isInteger(t)?t:null}Y();import{Command as Xw}from"commander";import{writeSync as Aw}from"fs";function Li(e,t){if(t.length===0)return;let r=Buffer.from(t,"utf-8"),n=0;while(n<r.length)try{n+=Aw(e,r,n,r.length-n)}catch(o){if(o?.code==="EAGAIN")continue;throw o}}var dn={writeStdout(e){Li(1,e.endsWith(`
@@ -1,7 +1,7 @@
1
1
  {
2
- "version": "0.13.3",
2
+ "version": "0.13.4",
3
3
  "binaries": {
4
- "linux-x64": "sha256:e9a0f06bcbf49a626476d12a11b6060be51e579326cb13f0a8c89ca564fdeff8",
5
- "linux-arm64": "sha256:5ef4a034bf7205ad54223ef646c24284b8bc63a1a59fdfbfad7a806fb319e9bc"
4
+ "linux-x64": "sha256:73d1900b9d36d8a79ceda1023f96bdf080800a19dfeafc862d9af02da82a0e6b",
5
+ "linux-arm64": "sha256:1371dc04f60bd9d0871b76e61ec45d0cd3915350166e7b6b64d345445915d5ff"
6
6
  }
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@desplega.ai/agent-fs",
3
- "version": "0.13.3",
3
+ "version": "0.13.4",
4
4
  "type": "module",
5
5
  "description": "Agent-first filesystem backed by S3",
6
6
  "license": "MIT",
@@ -36,8 +36,8 @@
36
36
  "sqlite-vec-linux-arm64": "^0.1.9",
37
37
  "sqlite-vec-linux-x64": "^0.1.9",
38
38
  "sqlite-vec-windows-x64": "^0.1.9",
39
- "@desplega.ai/agent-fs-fuse-linux-x64": "^0.13.3",
40
- "@desplega.ai/agent-fs-fuse-linux-arm64": "^0.13.3"
39
+ "@desplega.ai/agent-fs-fuse-linux-x64": "^0.13.4",
40
+ "@desplega.ai/agent-fs-fuse-linux-arm64": "^0.13.4"
41
41
  },
42
42
  "dependencies": {
43
43
  "@aws-sdk/client-s3": "^3.750.0",