@desplega.ai/agent-fs 0.12.2 → 0.13.0
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/README.md +6 -4
- package/dist/cli.js +1 -1
- package/dist/fuse-bin.manifest.json +3 -3
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -146,11 +146,13 @@ See [CONTRIBUTING.md](./CONTRIBUTING.md) for the full development guide.
|
|
|
146
146
|
|
|
147
147
|
## Releasing
|
|
148
148
|
|
|
149
|
-
|
|
150
|
-
2. Commit the version bump
|
|
151
|
-
3. Run `./scripts/release.sh`
|
|
149
|
+
Releases are automatic — a version change landing on `main` tags and publishes.
|
|
152
150
|
|
|
153
|
-
|
|
151
|
+
```bash
|
|
152
|
+
./scripts/release.sh 0.13.0
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
See [RELEASING.md](./RELEASING.md) for the full process, version-sync rules, and recovery steps.
|
|
154
156
|
|
|
155
157
|
## Deploy to Fly.io
|
|
156
158
|
|
package/dist/cli.js
CHANGED
|
@@ -171,7 +171,7 @@ ${IE.toHex(D)}`}getCanonicalPath({path:N}){if(this.uriEscapePath){let E=[];for(l
|
|
|
171
171
|
FROM chunk_vectors
|
|
172
172
|
WHERE embedding MATCH ?
|
|
173
173
|
ORDER BY distance
|
|
174
|
-
LIMIT ?`).all(D,T),A=[],R=new Set;for(let L of _){let X=N.db.select().from(f.contentChunks).where(W0(f.contentChunks.id,L.chunk_id)).get();if(!X||X.driveId!==N.driveId)continue;if(R.has(X.filePath))continue;R.add(X.filePath);let Y=N.db.select().from(f.files).where(sY(W0(f.files.path,X.filePath),W0(f.files.driveId,N.driveId))).get();A.push({path:X.filePath,snippet:X.content.slice(0,200),author:Y?.author,modifiedAt:Y?.modifiedAt})}return A}function EZ(N,E,T){let w=E.split(/\s+/).filter(Boolean).map(($)=>`"${$}"`).join(" OR ");if(!w)return[];try{return qw(N.db,{pattern:w,driveId:N.driveId}).slice(0,T).map((D)=>({path:D.path,snippet:D.snippet}))}catch{return[]}}var tf=Z(()=>{a()});import{eq as iw,and as TZ,or as wZ,isNull as $Z}from"drizzle-orm";async function rf(N,E){let T=[iw(f.files.driveId,N.driveId),iw(f.files.isDeleted,!1),wZ(iw(f.files.embeddingStatus,"failed"),$Z(f.files.embeddingStatus),iw(f.files.embeddingStatus,"pending"))];if(E.path){let{like:A}=await import("drizzle-orm"),R=E.path.endsWith("/")?E.path:E.path+"/";T.push(A(f.files.path,R+"%"))}let w=N.db.select({path:f.files.path}).from(f.files).where(TZ(...T)).all(),$=0,D=0,U=0,_=3;for(let A=0;A<w.length;A+=_){let R=w.slice(A,A+_),L=await Promise.allSettled(R.map(async(X)=>{let Y=g(N.orgId,N.driveId,X.path),Q=await N.s3.getObject(Y),M=Q.contentType??GN(X.path),n=ME(Q.body,M);if(n===null)return dT(N,X.path),"skipped";if($E(N.db,{path:X.path,driveId:N.driveId,content:n}),N.embeddingProvider)return await X0(N.db,N.embeddingProvider,{path:X.path,driveId:N.driveId,content:n}),"reindexed";return"skipped"}));for(let X of L)if(X.status==="fulfilled")if(X.value==="reindexed")$++;else U++;else console.error("Reindex failed:",X.reason),D++}return{reindexed:$,failed:D,skipped:U}}var af=Z(()=>{a();JN();mT();RT();iN()});import{eq as ef,and as DZ,like as UZ}from"drizzle-orm";async function sf(N,E){let T=WE(E.path??"/"),w=g(N.orgId,N.driveId,T),{objects:$}=await N.s3.listObjects(w),D=N.db.select().from(f.files).where(DZ(ef(f.files.driveId,N.driveId),UZ(f.files.path,T+"%"),ef(f.files.isDeleted,!1))).all(),U=new Map(D.map((A)=>[A.path,A])),_=[];for(let A of $){let R=A.key.slice(w.length);if(!R)continue;let L=R.split("/").filter(Boolean);if(L.length===0)continue;if(E.depth!==void 0&&L.length>E.depth)continue;let X=_;for(let Y=0;Y<L.length;Y++){let Q=L[Y],M=Y===L.length-1,n=!M||R.endsWith("/");if(n&&!M){let C=X.find((O)=>O.name===Q&&O.type==="directory");if(!C)C={name:Q,type:"directory",children:[]},X.push(C);if(!C.children)C.children=[];X=C.children}else if(n&&M){let C=X.find((O)=>O.name===Q&&O.type==="directory");if(!C)C={name:Q,type:"directory",children:[]},X.push(C)}else{let C=T+L.slice(0,Y+1).join("/"),O=U.get(C),z={name:Q,type:"file",size:O?.size??A.size};if(O?.author)z.author=O.author;if(O?.modifiedAt??A.lastModified)z.modifiedAt=O?.modifiedAt??A.lastModified;X.push(z)}}}return{tree:_}}var N1=Z(()=>{a();JN()});import{eq as E1,and as _Z,like as AZ}from"drizzle-orm";function fZ(N){let E="",T=0;while(T<N.length){let w=N[T];if(w==="*")if(N[T+1]==="*"){if(E+=".*",T+=2,N[T]==="/")T++}else E+="[^/]*",T++;else if(w==="?")E+="[^/]",T++;else if(".+^${}()|[]\\".includes(w))E+="\\"+w,T++;else E+=w,T++}return new RegExp("^"+E+"$")}async function T1(N,E){let T=E.path?WE(E.path):"/",w=g(N.orgId,N.driveId,T),{objects:$}=await N.s3.listObjects(w),D=N.db.select().from(f.files).where(_Z(E1(f.files.driveId,N.driveId),AZ(f.files.path,T+"%"),E1(f.files.isDeleted,!1))).all(),U=new Map(D.map((R)=>[R.path,R])),_=fZ(E.pattern),A=[];for(let R of $){let L=R.key.slice(w.length);if(!L||L.endsWith("/"))continue;if(_.test(L)){let X=T+L,Y=U.get(X);A.push({path:X,size:Y?.size??R.size,modifiedAt:Y?.modifiedAt??R.lastModified})}}return{matches:A}}var w1=Z(()=>{a();JN()});import{mkdtemp as RZ,rm as $1,writeFile as LZ}from"fs/promises";import{tmpdir as XZ}from"os";import{join as n0}from"path";import{eq as M0,and as YZ}from"drizzle-orm";function D1(N){let T=(N.toLowerCase().split("/").pop()??"").split(".");if(T.length<2)return null;let w=!1,$=T.pop();if($==="gz"&&T.length>=2)w=!0,$=T.pop();let D=QZ[$];if(!D)return null;if(w&&!f1.has(D))return null;return{format:D,gzip:w}}function U1(N,E){let T=process.env[N];if(!T)return E;let w=parseInt(T,10);return Number.isFinite(w)&&w>0?w:E}function IZ(){let N=process.env.AGENT_FS_SQL_MEMORY_LIMIT?.trim();if(N&&/^[0-9]+(\.[0-9]+)?\s*(B|KB|MB|GB|TB|KiB|MiB|GiB)?$/i.test(N))return N;return"512MB"}function mN(N){return`'${N.replace(/'/g,"''")}'`}function jN(N){return`"${N.replace(/"/g,'""')}"`}function WZ(N,E){switch(N){case"csv":return`read_csv(${mN(E)})`;case"tsv":return`read_csv(${mN(E)}, delim=E'\\t')`;case"parquet":return`read_parquet(${mN(E)})`;case"json":case"ndjson":return`read_json_auto(${mN(E)})`;case"xlsx":return`read_xlsx(${mN(E)})`;default:throw new d(`Format ${N} is not file-readable`)}}function nZ(N,E){return/\.gz$/i.test(N)&&f1.has(E)}function _1(N,E){return N.db.select({path:f.files.path,size:f.files.size}).from(f.files).where(YZ(M0(f.files.driveId,N.driveId),M0(f.files.path,E),M0(f.files.isDeleted,!1))).get()??null}function A1(N,E){let T=_1(N,E);if(T)return T;let w=E.startsWith("/")?E.slice(1):"/"+E;return _1(N,w)}function VZ(N,E){let T=[],w=new Set;for(let[U,_]of Object.entries(E.tables??{})){if(!MZ.test(U))throw new d(`Invalid table name: ${U}`,{field:"tables",suggestion:"Table names must match [A-Za-z_][A-Za-z0-9_]*"});if(w.has(U.toLowerCase()))throw new d(`Duplicate table name: ${U}`,{field:"tables"});w.add(U.toLowerCase());let A=LE(typeof _==="string"?_:_.path),R=typeof _==="string"?void 0:_.format,L=D1(A),X=R??L?.format;if(!X)throw new d(`Cannot infer format for ${A}`,{field:"tables",suggestion:'Pass an explicit format: { path, format: "csv" | "tsv" | "parquet" | "xlsx" | "json" | "ndjson" | "sqlite" | "duckdb" }'});let Y=A1(N,A);if(!Y)throw new y(`File not found: ${A}`,{path:A});T.push({table:U,path:A,format:X,gzip:nZ(A,X),size:Y.size})}let $=new Set,D=1;for(let U of E.query.matchAll(R1)){let _=U[3],A=D1(_);if(!A||!JZ.has(A.format))continue;let R=LE(_);if($.has(R))continue;$.add(R);let L=A1(N,R);if(!L)continue;let X=`doc_${D++}`;while(w.has(X))X=`doc_${D++}`;w.add(X),T.push({table:X,path:R,format:A.format,gzip:A.gzip,autoBound:!0,size:L.size})}return T}function oT(N){if(N===null||N===void 0)return null;let E=typeof N;if(E==="bigint"){let w=N;return w>=BigInt(Number.MIN_SAFE_INTEGER)&&w<=BigInt(Number.MAX_SAFE_INTEGER)?Number(w):w.toString()}if(E==="number"||E==="string"||E==="boolean")return N;if(N instanceof Uint8Array)return`<blob ${N.byteLength} bytes>`;let T=N;if(typeof T.toDouble==="function")return T.toDouble();if(T.bytes instanceof Uint8Array)return`<blob ${T.bytes.byteLength} bytes>`;if(Array.isArray(T.items))return T.items.map(oT);if(Array.isArray(T.entries))return T.entries.map((w)=>({key:oT(w.key),value:oT(w.value)}));if(T.entries&&typeof T.entries==="object"){let w={};for(let[$,D]of Object.entries(T.entries))w[$]=oT(D);return w}return String(N)}function BZ(N,E,T){if(E)return new d(`Query timed out after ${T}ms`,{suggestion:"Simplify the query or reduce the amount of data it scans"});let w=N instanceof Error?N.message:String(N);if(/disabled by configuration|has been locked|external access/i.test(w))return new d(w,{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 d(w)}async function L1(N,E){let T=Date.now(),w=E.maxRows??ZZ,$=U1("AGENT_FS_SQL_TIMEOUT_MS",30000),D=U1("AGENT_FS_SQL_MAX_FILE_BYTES",268435456),U=VZ(N,E);for(let C of U)if(C.size>D)throw new d(`File too large for SQL: ${C.path} (${C.size} bytes, limit ${D})`,{suggestion:"Raise AGENT_FS_SQL_MAX_FILE_BYTES on the server if needed"});let{DuckDBInstance:_}=await import("@duckdb/node-api"),A=null,R=null,L=null,X=null,Y=null,Q=!1,M=new AbortController;Y=setTimeout(()=>{Q=!0,M.abort();for(let C of[L,X])try{C?.interrupt()}catch{}},$);let n=()=>{if(Q)throw new d(`Query timed out after ${$}ms`,{suggestion:"Reduce the amount of data the query loads or scans"})};try{if(U.length>0){A=await RZ(n0(XZ(),"agent-fs-sql-"));for(let H=0;H<U.length;H++){let j=U[H],c=GZ[j.format]+(j.gzip?".gz":""),p=n0(A,`t${H}${c}`);try{let S=await N.s3.getObject(g(N.orgId,N.driveId,j.path),void 0,{abortSignal:M.signal});await LZ(p,S.body)}catch(S){n();let q=S;if(q?.name==="NoSuchKey"||q?.$metadata?.httpStatusCode===404)throw new y(`File not found: ${j.path}`,{path:j.path});throw S}j.localFile=p,n()}}if(R=await _.create(":memory:"),L=await R.connect(),await L.run(`SET memory_limit=${mN(IZ())}`),U.some((H)=>H.format==="xlsx"))await L.run("INSTALL excel"),await L.run("LOAD excel");let C=U.filter((H)=>H.format==="sqlite"),O=new Map;if(C.length>0&&A)O=await CZ(_,C,A,n,(H)=>{X=H});n();for(let H of U)try{if(H.format==="sqlite"){await L.run(`CREATE SCHEMA ${jN(H.table)}`);for(let{table:j,parquetFile:c}of O.get(H.table)??[])await L.run(`CREATE TABLE ${jN(H.table)}.${jN(j)} AS SELECT * FROM read_parquet(${mN(c)})`)}else if(H.format==="duckdb"){let j=`src_${H.table}`;await L.run(`ATTACH ${mN(H.localFile)} AS ${jN(j)} (READ_ONLY)`);let p=(await L.runAndReadAll(`SELECT table_name FROM duckdb_tables() WHERE database_name = ${mN(j)} AND schema_name = 'main'`)).getRowObjectsJson().map((S)=>String(S.table_name));if(p.length===0)throw new d(`No tables found in ${H.path}`);await L.run(`CREATE SCHEMA ${jN(H.table)}`);for(let S of p)await L.run(`CREATE TABLE ${jN(H.table)}.${jN(S)} AS SELECT * FROM ${jN(j)}.main.${jN(S)}`);await L.run(`DETACH ${jN(j)}`)}else await L.run(`CREATE TABLE ${jN(H.table)} AS SELECT * FROM ${WZ(H.format,H.localFile)}`)}catch(j){if(j instanceof d)throw j;n();let c=j instanceof Error?j.message:String(j);throw new d(`Failed to load ${H.path} as ${H.format}: ${c}`)}if(n(),await L.run("SET enable_external_access=false"),await L.run("SET disabled_filesystems='LocalFileSystem'"),await L.run("SET lock_configuration=true"),A)await $1(A,{recursive:!0,force:!0}),A=null;let z=new Map(U.filter((H)=>H.autoBound).map((H)=>[H.path,H.table])),UN=E.query.replace(R1,(H,j,c,p)=>{let S=z.get(LE(p));return S?`${j} ${jN(S)}`:H});try{let H=await L.extractStatements(UN);if(H.count===0)throw new d("Query contains no statements",{field:"query"});for(let J=0;J<H.count-1;J++)await(await H.prepare(J)).run();let c=await(await H.prepare(H.count-1)).runAndReadUntil(w+1),p=new Map,S=c.columnNames().map((J)=>{let AN=p.get(J)??0;return p.set(J,AN+1),AN===0?J:`${J}_${AN+1}`}),q=c.columnTypes(),W=S.map((J,AN)=>({name:J,type:String(q[AN]??"UNKNOWN")})),WN=c.getRows(),_N=WN.length>w||!c.done,NN=WN.slice(0,w).map((J)=>{let AN={};for(let o=0;o<S.length;o++)AN[S[o]]=oT(J[o]);return AN}),I=U.map((J)=>({table:J.table,path:J.path,format:J.format}));return{columns:W,rows:NN,rowCount:NN.length,truncated:_N,files:I,elapsedMs:Date.now()-T}}catch(H){if(H instanceof d)throw H;throw BZ(H,Q,$)}}finally{if(Y)clearTimeout(Y);try{L?.closeSync()}catch{}try{R?.closeSync()}catch{}if(A)await $1(A,{recursive:!0,force:!0}).catch(()=>{})}}async function CZ(N,E,T,w,$){let D=new Map,U=await N.create(":memory:"),_=await U.connect();$(_);try{await _.run("INSTALL sqlite"),await _.run("LOAD sqlite");for(let A=0;A<E.length;A++){let R=E[A];try{w(),await _.run(`ATTACH ${mN(R.localFile)} AS src (TYPE sqlite, READ_ONLY)`);let X=(await _.runAndReadAll("SELECT table_name FROM duckdb_tables() WHERE database_name = 'src'")).getRowObjectsJson().map((Q)=>String(Q.table_name));if(X.length===0)throw new d(`No tables found in ${R.path}`);let Y=[];for(let Q=0;Q<X.length;Q++){w();let M=n0(T,`sq_${A}_${Q}.parquet`);await _.run(`COPY (SELECT * FROM src.${jN(X[Q])}) TO ${mN(M)} (FORMAT parquet)`),Y.push({table:X[Q],parquetFile:M})}D.set(R.table,Y),await _.run("DETACH src")}catch(L){if(L instanceof d)throw L;w();let X=L instanceof Error?L.message:String(L);throw new d(`Failed to load ${R.path} as sqlite: ${X}`)}}}finally{$(null);try{_.closeSync()}catch{}try{U.closeSync()}catch{}}return D}var ZZ=1000,QZ,JZ,f1,GZ,MZ,R1;var X1=Z(()=>{a();JN();QN();QZ={csv:"csv",tsv:"tsv",tab:"tsv",parquet:"parquet",xlsx:"xlsx",json:"json",jsonl:"ndjson",ndjson:"ndjson",db:"sqlite",sqlite:"sqlite",sqlite3:"sqlite",duckdb:"duckdb"},JZ=new Set(["csv","tsv","parquet","xlsx","json","ndjson"]),f1=new Set(["csv","tsv","json","ndjson"]),GZ={csv:".csv",tsv:".tsv",parquet:".parquet",xlsx:".xlsx",json:".json",ndjson:".ndjson",sqlite:".db",duckdb:".duckdb"};MZ=/^[A-Za-z_][A-Za-z0-9_]*$/,R1=/\b(from|join)\s+(['"])([^'"]+\.[A-Za-z0-9]+(?:\.gz)?)\2/gi});function cT(N,E,T,w){let $=w.startsWith("/")?w.slice(1):w;return`${N}/file/~/${E}/${T}/${$}`}async function Y1(N,E){let T=LE(E.path),w=g(N.orgId,N.driveId,T),$=E.expiresIn??86400;try{await N.s3.headObject(w)}catch(A){if(A?.name==="NotFound"||A?.name==="NoSuchKey"||A?.$metadata?.httpStatusCode===404)throw new y(`File not found: ${T}`,{path:T});throw A}if(!N.s3.capabilities.presignedUrls){if(!N.appUrl)throw new lN("signed-url",void 0,{suggestion:"This storage backend cannot mint presigned URLs and no app URL is configured to fall back to."});return{url:cT(N.appUrl,N.orgId,N.driveId,T),path:T,expiresIn:0,expiresAt:"",kind:"app"}}let D=zw(GN(T)),U=T.split("/").pop()??"download";return{url:await N.s3.getPresignedUrl(w,$,D!=="application/octet-stream"?D:void 0,`attachment; filename*=UTF-8''${gw(U)}`),path:T,expiresIn:$,expiresAt:new Date(Date.now()+$*1000).toISOString(),kind:"presigned"}}var Z1=Z(()=>{JN();QN();iN()});import{eq as u,and as dN,sql as V0,desc as Q1,ne as SZ}from"drizzle-orm";function B0(N,E){N.db.insert(f.events).values({id:crypto.randomUUID(),orgId:N.orgId,type:E.type,resourceType:E.resourceType,resourceId:E.resourceId,actor:N.userId,target:E.target??null,status:"created",metadata:E.metadata?JSON.stringify(E.metadata):null,createdAt:new Date}).run()}function HZ(N,E){let T=N.db.select({userId:f.driveMembers.userId}).from(f.driveMembers).where(dN(u(f.driveMembers.driveId,N.driveId),SZ(f.driveMembers.userId,N.userId))).all();if(T.length===0)return;N.db.insert(f.events).values(T.map(({userId:w})=>({id:crypto.randomUUID(),orgId:N.orgId,type:"comment_notification",resourceType:"comment",resourceId:E.commentId,actor:N.userId,target:w,status:"created",metadata:JSON.stringify({path:E.path,parentId:E.parentId}),createdAt:E.createdAt}))).run()}function pT(N,E){return N.db.select().from(f.comments).where(dN(u(f.comments.id,E),u(f.comments.orgId,N.orgId),u(f.comments.driveId,N.driveId),u(f.comments.isDeleted,!1))).get()}function yw(N){return{id:N.id,parentId:N.parentId??void 0,path:N.path,lineStart:N.lineStart??void 0,lineEnd:N.lineEnd??void 0,quotedContent:N.quotedContent??void 0,body:N.body,author:N.author,resolved:N.resolved??!1,resolvedBy:N.resolvedBy??void 0,resolvedAt:N.resolvedAt??void 0,fileVersionId:N.fileVersionId??void 0,replyCount:N.replyCount??0,createdAt:N.createdAt,updatedAt:N.updatedAt}}async function uw(N,E){let T=new Date,w=crypto.randomUUID(),$=E.path;if(E.parentId){let U=pT(N,E.parentId);if(!U)throw new y("Parent comment not found",{suggestion:"Check that the parent comment ID is correct and not deleted"});if(U.parentId)throw new d("Cannot reply to a reply \u2014 only root comments accept replies",{suggestion:"Reply to the root comment instead"});if(!$)$=U.path}if(!$)throw new d("path is required for root comments",{field:"path"});let D=N.db.select({id:f.fileVersions.id}).from(f.fileVersions).where(dN(u(f.fileVersions.path,$),u(f.fileVersions.driveId,N.driveId))).orderBy(Q1(f.fileVersions.id)).limit(1).get();return N.db.insert(f.comments).values({id:w,parentId:E.parentId??null,orgId:N.orgId,driveId:N.driveId,path:$,lineStart:E.lineStart??null,lineEnd:E.lineEnd??null,quotedContent:E.quotedContent??null,fileVersionId:D?.id??null,body:E.body,author:N.userId,resolved:!1,createdAt:T,updatedAt:T,isDeleted:!1}).run(),B0(N,{type:"comment_created",resourceType:"comment",resourceId:w,metadata:{path:$,parentId:E.parentId}}),HZ(N,{commentId:w,path:$,parentId:E.parentId,createdAt:T}),{id:w,path:$,body:E.body,parentId:E.parentId,lineStart:E.lineStart,lineEnd:E.lineEnd,author:N.userId,createdAt:T}}async function kw(N,E){let T=[u(f.comments.orgId,N.orgId),u(f.comments.driveId,N.driveId),u(f.comments.isDeleted,!1)];if(E.path)T.push(u(f.comments.path,E.path));if(E.parentId)T.push(u(f.comments.parentId,E.parentId));else if(E.parentId===void 0&&!E.resolved)T.push(V0`${f.comments.parentId} IS NULL`),T.push(u(f.comments.resolved,!1));else if(E.parentId===void 0&&E.resolved)T.push(V0`${f.comments.parentId} IS NULL`);if(E.orgId)T.push(u(f.comments.orgId,E.orgId));let w=E.limit??50,$=E.offset??0;return{comments:N.db.select().from(f.comments).where(dN(...T)).orderBy(Q1(f.comments.createdAt)).limit(w).offset($).all().map((_)=>{let R=N.db.select().from(f.comments).where(dN(u(f.comments.parentId,_.id),u(f.comments.orgId,N.orgId),u(f.comments.driveId,N.driveId),u(f.comments.isDeleted,!1))).orderBy(f.comments.createdAt).all().map((L)=>yw({...L,replyCount:0}));return{...yw({..._,replyCount:R.length}),replies:R}})}}async function hw(N,E){let T=pT(N,E.id);if(!T)throw new y("Comment not found",{suggestion:"Check that the comment ID is correct"});let w=N.db.select({count:V0`count(*)`}).from(f.comments).where(dN(u(f.comments.parentId,T.id),u(f.comments.orgId,N.orgId),u(f.comments.driveId,N.driveId),u(f.comments.isDeleted,!1))).get(),$=yw({...T,replyCount:w?.count??0}),U=N.db.select().from(f.comments).where(dN(u(f.comments.parentId,E.id),u(f.comments.orgId,N.orgId),u(f.comments.driveId,N.driveId),u(f.comments.isDeleted,!1))).orderBy(f.comments.createdAt).all().map((_)=>yw({..._,replyCount:0}));return{comment:$,replies:U}}async function xw(N,E){let T=pT(N,E.id);if(!T)throw new y("Comment not found",{suggestion:"Check that the comment ID is correct"});if(T.author!==N.userId)throw new VN("You can only edit your own comments",{suggestion:"Only the comment author can update it"});let w=new Date;return N.db.update(f.comments).set({body:E.body,updatedAt:w}).where(dN(u(f.comments.id,E.id),u(f.comments.orgId,N.orgId),u(f.comments.driveId,N.driveId))).run(),{id:E.id,body:E.body,updatedAt:w}}async function lw(N,E){let T=pT(N,E.id);if(!T)throw new y("Comment not found",{suggestion:"Check that the comment ID is correct"});if(T.author!==N.userId)throw new VN("You can only delete your own comments",{suggestion:"Only the comment author can delete it"});let w=new Date;if(N.db.update(f.comments).set({isDeleted:!0,updatedAt:w}).where(dN(u(f.comments.id,E.id),u(f.comments.orgId,N.orgId),u(f.comments.driveId,N.driveId))).run(),!T.parentId)N.db.update(f.comments).set({isDeleted:!0,updatedAt:w}).where(dN(u(f.comments.parentId,E.id),u(f.comments.orgId,N.orgId),u(f.comments.driveId,N.driveId))).run();return B0(N,{type:"comment_deleted",resourceType:"comment",resourceId:E.id}),{deleted:!0}}async function bw(N,E){let T=pT(N,E.id);if(!T)throw new y("Comment not found",{suggestion:"Check that the comment ID is correct"});if(T.parentId)throw new d("Cannot resolve a reply \u2014 only root comments can be resolved",{suggestion:"Resolve the parent comment instead"});let w=new Date,$=E.resolved?w:null,D=E.resolved?N.userId:null;return N.db.update(f.comments).set({resolved:E.resolved,resolvedBy:D,resolvedAt:$,updatedAt:w}).where(dN(u(f.comments.id,E.id),u(f.comments.orgId,N.orgId),u(f.comments.driveId,N.driveId))).run(),B0(N,{type:E.resolved?"comment_resolved":"comment_reopened",resourceType:"comment",resourceId:E.id}),{id:E.id,resolved:E.resolved,resolvedBy:D??void 0,resolvedAt:$??void 0}}var J1=Z(()=>{a();QN()});import{and as zE,count as OZ,desc as FZ,eq as LN,inArray as G1,ne as PZ,sql as KZ}from"drizzle-orm";function C0(N){return[LN(f.events.orgId,N.orgId),LN(f.events.type,W1),LN(f.events.resourceType,"comment"),LN(f.events.target,N.userId),LN(f.comments.orgId,N.orgId),LN(f.comments.driveId,N.driveId),LN(f.comments.isDeleted,!1)]}async function M1(N,E){let T=[...C0(N),PZ(f.events.status,"deleted")];if(E.unreadOnly)T.push(LN(f.events.status,"created"));let w=N.db.select({id:f.events.id,commentId:f.comments.id,parentId:f.comments.parentId,path:f.comments.path,body:f.comments.body,actor:f.events.actor,createdAt:f.events.createdAt,status:f.events.status}).from(f.events).innerJoin(f.comments,zE(LN(f.events.resourceId,f.comments.id),LN(f.events.resourceType,"comment"))).where(zE(...T)).orderBy(KZ`CASE WHEN ${f.events.status} = 'created' THEN 0 ELSE 1 END`,FZ(f.events.createdAt)).limit(E.limit??jZ).offset(E.offset??0).all(),$=N.db.select({value:OZ()}).from(f.events).innerJoin(f.comments,zE(LN(f.events.resourceId,f.comments.id),LN(f.events.resourceType,"comment"))).where(zE(...C0(N),LN(f.events.status,"created"))).get();return{notifications:w.map((U)=>({id:U.id,commentId:U.commentId,parentId:U.parentId??void 0,path:U.path,body:U.body,actor:U.actor,createdAt:U.createdAt,read:U.status==="ack"})),unreadCount:Number($?.value??0)}}async function n1(N,E){if(E.all===!0&&E.ids&&E.ids.length>0)throw new d("Provide notification IDs or set all=true, not both",{suggestion:"Remove ids to mark all notifications, or omit all to mark selected IDs"});if(E.all!==!0&&(!E.ids||E.ids.length===0))throw new d("Provide notification IDs or set all=true",{suggestion:"Pass ids: [...] to mark selected notifications, or all: true"});let T=[...C0(N),LN(f.events.status,"created")];if(!E.all){let D=E.ids??[];if(D.length===0)return{markedRead:0};T.push(G1(f.events.id,D))}let w=N.db.select({id:f.events.id}).from(f.events).innerJoin(f.comments,zE(LN(f.events.resourceId,f.comments.id),LN(f.events.resourceType,"comment"))).where(zE(...T)).all().map((D)=>D.id),$=0;for(let D=0;D<w.length;D+=I1){let U=w.slice(D,D+I1),_=N.db.update(f.events).set({status:"ack"}).where(zE(G1(f.events.id,U),LN(f.events.orgId,N.orgId),LN(f.events.target,N.userId),LN(f.events.type,W1),LN(f.events.status,"created"))).returning({id:f.events.id}).all();$+=_.length}return{markedRead:$}}var W1="comment_notification",jZ=50,I1=500;var V1=Z(()=>{a();QN()});import{z as G}from"zod";async function CN(N,E,T,w){let $=S0[E];if(!$)throw Error(`Unknown operation: ${E}`);if(!w?.skipAuth){let _=uT(E);hT(N.db,{userId:N.userId,driveId:N.driveId,requiredRole:_})}let D=$.schema.parse(T),U=await $.handler(N,D);if(N.appUrl&&U&&typeof U==="object"){if("path"in U)U.appUrl=cT(N.appUrl,N.orgId,N.driveId,U.path);else if("to"in U)U.appUrl=cT(N.appUrl,N.orgId,N.driveId,U.to)}return U}function YT(){return Object.keys(S0)}function DE(N){return S0[N]}var S0;var H0=Z(()=>{lT();Uf();Af();Rf();Xf();Qf();If();Mf();Bf();Sf();Of();Kf();gf();uf();xf();bf();df();cf();tf();af();N1();w1();X1();Z1();J1();V1();S0={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:vw,schema:G.object({path:G.string(),content:G.string(),message:G.string().optional(),expectedVersion:G.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:_f,schema:G.object({path:G.string(),offset:G.number().int().min(0).optional(),limit:G.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:ff,schema:G.object({path:G.string(),old_string:G.string(),new_string:G.string(),message:G.string().optional(),expectedVersion:G.number().int().optional()})},append:{description:"Append content to the end of an existing file. Creates a new version. Returns { version, size }.",handler:Lf,schema:G.object({path:G.string(),content:G.string(),message:G.string().optional(),expectedVersion:G.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:Zf,schema:G.object({path:G.string().optional()})},stat:{description:"Get file metadata without reading content. Returns path, size, contentType, author, currentVersion, createdAt, modifiedAt, isDeleted, embeddingStatus.",handler:Gf,schema:G.object({path:G.string()})},rm:{description:"Delete a file. Removes from S3, cleans up FTS5 index and vector embeddings. Returns { path, deleted }.",handler:Wf,schema:G.object({path:G.string(),expectedVersion:G.number().int().optional()})},mv:{description:"Move or rename a file. Preserves version history at the new path. Returns { from, to, version }.",handler:Vf,schema:G.object({from:G.string(),to:G.string(),message:G.string().optional(),expectedVersion:G.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:Cf,schema:G.object({from:G.string(),to:G.string(),expectedVersion:G.number().int().optional()})},tail:{description:"Read the last N lines of a file (default 20). Returns { content, totalLines, truncated }.",handler:Hf,schema:G.object({path:G.string(),lines:G.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:Pf,schema:G.object({path:G.string(),limit:G.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:zf,schema:G.object({path:G.string(),v1:G.number().int(),v2:G.number().int()})},revert:{description:"Revert a file to a previous version. Creates a new version with the old content. Returns { version, revertedTo }.",handler:yf,schema:G.object({path:G.string(),version:G.number().int(),expectedVersion:G.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:hf,schema:G.object({path:G.string().optional(),since:G.coerce.date().optional(),limit:G.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:lf,schema:G.object({pattern:G.string(),path:G.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:mf,schema:G.object({pattern:G.string(),path:G.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:pf,schema:G.object({query:G.string(),limit:G.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:of,schema:G.object({query:G.string(),limit:G.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:rf,schema:G.object({path:G.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:sf,schema:G.object({path:G.string().optional(),depth:G.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:T1,schema:G.object({pattern:G.string(),path:G.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:L1,schema:G.object({query:G.string(),tables:G.record(G.union([G.string(),G.object({path:G.string(),format:G.enum(["csv","tsv","parquet","xlsx","json","ndjson","sqlite","duckdb"]).optional()})])).optional(),maxRows:G.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:Y1,schema:G.object({path:G.string(),expiresIn:G.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:uw,schema:G.object({path:G.string().optional(),body:G.string(),parentId:G.string().optional(),lineStart:G.number().int().optional(),lineEnd:G.number().int().optional(),quotedContent:G.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:kw,schema:G.object({path:G.string().optional(),parentId:G.string().optional(),resolved:G.boolean().optional(),orgId:G.string().optional(),limit:G.number().int().min(1).optional(),offset:G.number().int().min(0).optional()})},"comment-get":{description:"Get a single comment by ID with all its replies. Returns { comment, replies }.",handler:hw,schema:G.object({id:G.string()})},"comment-update":{description:"Update a comment's body. Only the original author can update. Returns { id, body, updatedAt }.",handler:xw,schema:G.object({id:G.string(),body:G.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:lw,schema:G.object({id:G.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:bw,schema:G.object({id:G.string(),resolved:G.boolean()})},"comment-notification-list":{description:"List comment notifications for the current user in the active drive. Returns { notifications, unreadCount }.",handler:M1,schema:G.object({unreadOnly:G.boolean().optional(),limit:G.number().int().min(1).max(100).optional(),offset:G.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:n1,schema:G.object({ids:G.array(G.string()).min(1).max(100).optional(),all:G.literal(!0).optional()})}}});import{eq as SN,and as tT}from"drizzle-orm";function gE(N,E){let T=crypto.randomUUID(),w=new Date;if(N.insert(f.drives).values({id:T,orgId:E.orgId,name:E.name,isDefault:E.isDefault??!1,createdAt:w}).run(),E.creatorUserId)N.insert(f.driveMembers).values({driveId:T,userId:E.creatorUserId,role:"admin"}).run();return{id:T,name:E.name}}function O0(N,E){return N.select().from(f.drives).where(SN(f.drives.orgId,E)).all().map((T)=>({id:T.id,name:T.name,isDefault:T.isDefault}))}function oN(N,E,T){return N.select({id:f.drives.id,name:f.drives.name,isDefault:f.drives.isDefault}).from(f.drives).innerJoin(f.driveMembers,SN(f.driveMembers.driveId,f.drives.id)).where(tT(SN(f.drives.orgId,E),SN(f.driveMembers.userId,T))).all().map((w)=>({id:w.id,name:w.name,isDefault:w.isDefault}))}function F0(N,E){let T=N.select().from(f.drives).where(SN(f.drives.id,E)).get();if(!T)return null;return{id:T.id,name:T.name,orgId:T.orgId,isDefault:T.isDefault}}function qE(N,E){return N.select({userId:f.driveMembers.userId,email:f.users.email,role:f.driveMembers.role}).from(f.driveMembers).innerJoin(f.users,SN(f.driveMembers.userId,f.users.id)).where(SN(f.driveMembers.driveId,E)).all()}function vE(N,E){if(!N.select({role:f.driveMembers.role}).from(f.driveMembers).where(tT(SN(f.driveMembers.driveId,E.driveId),SN(f.driveMembers.userId,E.userId))).get())throw Error("Member not found in drive");N.update(f.driveMembers).set({role:E.role}).where(tT(SN(f.driveMembers.driveId,E.driveId),SN(f.driveMembers.userId,E.userId))).run()}function iE(N,E){if(!N.select({role:f.driveMembers.role}).from(f.driveMembers).where(tT(SN(f.driveMembers.driveId,E.driveId),SN(f.driveMembers.userId,E.userId))).get())throw Error("Member not found in drive");N.delete(f.driveMembers).where(tT(SN(f.driveMembers.driveId,E.driveId),SN(f.driveMembers.userId,E.userId))).run()}function P0(N,E){N.insert(f.driveMembers).values({driveId:E.driveId,userId:E.userId,role:E.role}).onConflictDoUpdate({target:[f.driveMembers.driveId,f.driveMembers.userId],set:{role:E.role}}).run()}var K0=Z(()=>{a()});import{eq as TN,and as nE,sql as B1}from"drizzle-orm";function yE(N,E){let T=crypto.randomUUID(),w=new Date;return N.insert(f.orgs).values({id:T,name:E.name,isPersonal:E.isPersonal??!1,createdAt:w}).run(),N.insert(f.orgMembers).values({orgId:T,userId:E.userId,role:"admin"}).run(),gE(N,{orgId:T,name:"default",isDefault:!0,creatorUserId:E.userId}),{id:T,name:E.name}}function IN(N,E){return N.select({orgId:f.orgMembers.orgId,role:f.orgMembers.role,name:f.orgs.name,isPersonal:f.orgs.isPersonal}).from(f.orgMembers).innerJoin(f.orgs,TN(f.orgMembers.orgId,f.orgs.id)).where(TN(f.orgMembers.userId,E)).all().map((w)=>({id:w.orgId,name:w.name,role:w.role,isPersonal:w.isPersonal}))}function rT(N,E){let T=N.select().from(f.orgs).where(TN(f.orgs.id,E)).get();if(!T)return null;return{id:T.id,name:T.name,isPersonal:T.isPersonal}}function uE(N,E){return N.select({userId:f.orgMembers.userId,email:f.users.email,role:f.orgMembers.role}).from(f.orgMembers).innerJoin(f.users,TN(f.orgMembers.userId,f.users.id)).where(TN(f.orgMembers.orgId,E)).all()}function kE(N,E){let T=N.select({role:f.orgMembers.role}).from(f.orgMembers).where(nE(TN(f.orgMembers.orgId,E.orgId),TN(f.orgMembers.userId,E.userId))).get();if(!T)throw Error("Member not found in org");if(T.role==="admin"&&E.role!=="admin"){if(N.select({count:B1`count(*)`}).from(f.orgMembers).where(nE(TN(f.orgMembers.orgId,E.orgId),TN(f.orgMembers.role,"admin"))).get().count<=1)throw Error("Cannot remove the last admin from the org")}N.update(f.orgMembers).set({role:E.role}).where(nE(TN(f.orgMembers.orgId,E.orgId),TN(f.orgMembers.userId,E.userId))).run()}function hE(N,E){if(N.select({isPersonal:f.orgs.isPersonal}).from(f.orgs).where(TN(f.orgs.id,E.orgId)).get()?.isPersonal)throw Error("Cannot remove members from a personal org");let w=N.select({role:f.orgMembers.role}).from(f.orgMembers).where(nE(TN(f.orgMembers.orgId,E.orgId),TN(f.orgMembers.userId,E.userId))).get();if(!w)throw Error("Member not found in org");if(w.role==="admin"){if(N.select({count:B1`count(*)`}).from(f.orgMembers).where(nE(TN(f.orgMembers.orgId,E.orgId),TN(f.orgMembers.role,"admin"))).get().count<=1)throw Error("Cannot remove the last admin from the org")}let $=N.select({id:f.drives.id}).from(f.drives).where(TN(f.drives.orgId,E.orgId)).all();for(let D of $)N.delete(f.driveMembers).where(nE(TN(f.driveMembers.driveId,D.id),TN(f.driveMembers.userId,E.userId))).run();N.delete(f.orgMembers).where(nE(TN(f.orgMembers.orgId,E.orgId),TN(f.orgMembers.userId,E.userId))).run()}function xE(N,E){let T=N.select().from(f.users).where(TN(f.users.email,E.email)).get();if(!T)throw Error(`User with email ${E.email} not found`);N.insert(f.orgMembers).values({orgId:E.orgId,userId:T.id,role:E.role}).onConflictDoUpdate({target:[f.orgMembers.orgId,f.orgMembers.userId],set:{role:E.role}}).run();let w=N.select().from(f.drives).where(nE(TN(f.drives.orgId,E.orgId),TN(f.drives.isDefault,!0))).get();if(w)N.insert(f.driveMembers).values({driveId:w.id,userId:T.id,role:E.role}).onConflictDoUpdate({target:[f.driveMembers.driveId,f.driveMembers.userId],set:{role:E.role}}).run()}var j0=Z(()=>{a();K0()});import{eq as C1}from"drizzle-orm";function S1(N){let E=new Bun.CryptoHasher("sha256");return E.update(N),E.digest("hex")}function zZ(){let N=new Uint8Array(32);return crypto.getRandomValues(N),`af_${Array.from(N,(T)=>T.toString(16).padStart(2,"0")).join("")}`}function gZ(){return crypto.randomUUID()}function cN(N,E){let T=gZ(),w=zZ(),$=S1(w),D=new Date;return N.insert(f.users).values({id:T,email:E.email,apiKeyHash:$,createdAt:D}).run(),yE(N,{name:E.email.split("@")[0],userId:T,isPersonal:!0}),{user:{id:T,email:E.email},apiKey:w}}function pN(N,E){let T=S1(E),w=N.select().from(f.users).where(C1(f.users.apiKeyHash,T)).get();if(!w)return null;return{id:w.id,email:w.email}}function ZT(N,E){let T=N.select().from(f.users).where(C1(f.users.email,E)).get();if(!T)return null;return{id:T.id,email:T.email}}var z0=Z(()=>{a();j0()});import{eq as VE,and as g0}from"drizzle-orm";function FN(N,E){if(E.driveId){let D=N.select().from(f.drives).where(VE(f.drives.id,E.driveId)).get();if(!D||E.orgId&&D.orgId!==E.orgId)throw new y(`Drive not found: ${E.driveId}`,{suggestion:E.orgId?"Check the driveId belongs to the org you are addressing":void 0});let U=bN(N,E.userId,E.driveId);if(!U)throw new y(`Drive not found: ${E.driveId}`,{suggestion:E.orgId?"Check the driveId belongs to the org you are addressing":void 0});return{orgId:D.orgId,driveId:E.driveId,role:U}}if(E.orgId){let D=N.select().from(f.drives).where(g0(VE(f.drives.orgId,E.orgId),VE(f.drives.isDefault,!0))).get();if(!D)throw new y(`No default drive for org: ${E.orgId}`);let U=bN(N,E.userId,D.id);if(!U)throw new y(`No default drive for org: ${E.orgId}`);return{orgId:E.orgId,driveId:D.id,role:U}}let T=N.select({orgId:f.orgMembers.orgId}).from(f.orgMembers).innerJoin(f.orgs,VE(f.orgMembers.orgId,f.orgs.id)).where(g0(VE(f.orgMembers.userId,E.userId),VE(f.orgs.isPersonal,!0))).get();if(!T)throw Error("No personal org found for user");let w=N.select().from(f.drives).where(g0(VE(f.drives.orgId,T.orgId),VE(f.drives.isDefault,!0))).get();if(!w)throw Error("No default drive found");let $=bN(N,E.userId,w.id);if(!$)throw Error("You do not have access to your default drive");return{orgId:T.orgId,driveId:w.id,role:$}}var H1=Z(()=>{a();QN();lT()});function aT(N){let E=b();if(E.auth.apiKey){if(pN(N,E.auth.apiKey))return{apiKey:E.auth.apiKey}}console.error("[agent-fs] No local user found, creating one...");let T=cN(N,{email:"local@agent-fs.local"});return i("auth.apiKey",T.apiKey),console.error("[agent-fs] Local user created automatically."),{apiKey:T.apiKey}}var O1=Z(()=>{OE();z0()});var F1=Z(()=>{z0();j0();K0();lT();H1();O1()});var K1;var P1=Z(()=>{K1={name:"agent-fs",version:"0.12.2",private:!0,workspaces:["packages/*"],scripts:{typecheck:"tsc --build",test:"bun test packages/*/src/","test:coverage":"bun test --coverage packages/*/src/",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.2.0",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 PN;var q0=Z(()=>{P1();PN=K1.version});var z1={};oE(z1,{LocalEmbeddingProvider:()=>j1});import{join as vZ}from"path";import{mkdirSync as iZ,existsSync as yZ}from"fs";class j1{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:N,resolveModelFile:E}=await import("node-llama-cpp");this.llama=await N();let T=vZ(fN(),"models");if(!yZ(T))iZ(T,{recursive:!0});console.error("[agent-fs] Resolving local embedding model...");let w=await E(uZ,T);console.error("[agent-fs] Model ready:",w),this.model=await this.llama.loadModel({modelPath:w}),this.embeddingContext=await this.model.createEmbeddingContext()}async embed(N){await this.init();let E=await this.embeddingContext.getEmbeddingFor(N);return Array.from(E.vector)}async embedBatch(N){await this.init();let E=[];for(let T of N){let w=await this.embeddingContext.getEmbeddingFor(T);E.push(Array.from(w.vector))}return E}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 uZ="hf:nomic-ai/nomic-embed-text-v1.5-GGUF:Q8_0";var g1=Z(()=>{OE()});var v0={};oE(v0,{OpenAIEmbeddingProvider:()=>q1});import kZ from"openai";class q1{name="openai";dimensions=768;client;constructor(N){this.client=new kZ({apiKey:N})}async embed(N){return(await this.client.embeddings.create({model:"text-embedding-3-small",input:N,dimensions:768})).data[0].embedding}async embedBatch(N){return(await this.client.embeddings.create({model:"text-embedding-3-small",input:N,dimensions:768})).data.sort((T,w)=>T.index-w.index).map((T)=>T.embedding)}}var i0=()=>{};var y0={};oE(y0,{GeminiEmbeddingProvider:()=>v1});import{GoogleGenAI as hZ}from"@google/genai";class v1{name="gemini";dimensions=768;client;constructor(N){this.client=new hZ({apiKey:N})}async embed(N){return(await this.client.models.embedContent({model:"gemini-embedding-001",contents:N,config:{outputDimensionality:768}})).embeddings[0].values}async embedBatch(N){let E=[];for(let T of N){let w=await this.client.models.embedContent({model:"gemini-embedding-001",contents:T,config:{outputDimensionality:768}});E.push(w.embeddings[0].values)}return E}}var u0=()=>{};async function i1(N){switch(N.provider){case"local":{let{LocalEmbeddingProvider:E}=await Promise.resolve().then(() => (g1(),z1));return new E}case"openai":{if(!N.apiKey)throw Error("OpenAI API key required. Set embedding.apiKey in config.");let{OpenAIEmbeddingProvider:E}=await Promise.resolve().then(() => (i0(),v0));return new E(N.apiKey)}case"gemini":{if(!N.apiKey)throw Error("Gemini API key required. Set embedding.apiKey in config.");let{GeminiEmbeddingProvider:E}=await Promise.resolve().then(() => (u0(),y0));return new E(N.apiKey)}default:throw Error(`Unknown embedding provider: ${N.provider}`)}}async function QT(N){if(process.env.OPENAI_API_KEY)try{let{OpenAIEmbeddingProvider:E}=await Promise.resolve().then(() => (i0(),v0));return new E(process.env.OPENAI_API_KEY)}catch(E){console.error("[agent-fs] Failed to load OpenAI provider:",E)}if(process.env.GEMINI_API_KEY)try{let{GeminiEmbeddingProvider:E}=await Promise.resolve().then(() => (u0(),y0));return new E(process.env.GEMINI_API_KEY)}catch(E){console.error("[agent-fs] Failed to load Gemini provider:",E)}if(N?.provider&&N.provider!=="local"&&N.apiKey)try{return await i1(N)}catch(E){console.error("[agent-fs] Failed to create embedding provider from config:",E)}if(N?.provider==="local")try{return await i1(N)}catch(E){console.error("[agent-fs] Failed to load local embedding provider:",E)}return null}var u1,y1,k1=(N)=>typeof N==="string"?{...y1,name:N}:{...y1,...N};var mw=Z(()=>{u1=Symbol("Let zodToJsonSchema decide on which parser to use"),y1={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 h1=(N)=>{let E=k1(N),T=E.name!==void 0?[...E.basePath,E.definitionPath,E.name]:E.basePath;return{...E,flags:{hasReferencedOpenAiAnyType:!1},currentPath:T,propertyPath:void 0,seen:new Map(Object.entries(E.definitions).map(([w,$])=>[$._def,{def:$._def,path:[...E.basePath,E.definitionPath,w],jsonSchema:void 0}]))}};var k0=Z(()=>{mw()});function h0(N,E,T,w){if(!w?.errorMessages)return;if(T)N.errorMessage={...N.errorMessage,[E]:T}}function l(N,E,T,w,$){N[E]=T,h0(N,E,w,$)}var dw=(N,E)=>{let T=0;for(;T<N.length&&T<E.length;T++)if(N[T]!==E[T])break;return[(N.length-T).toString(),...E.slice(T)].join("/")};function wN(N){if(N.target!=="openAi")return{};let E=[...N.basePath,N.definitionPath,N.openAiAnyTypeName];return N.flags.hasReferencedOpenAiAnyType=!0,{$ref:N.$refStrategy==="relative"?dw(E,N.currentPath):E.join("/")}}var uN=()=>{};import{ZodFirstPartyTypeKind as xZ}from"zod/v3";function x1(N,E){let T={type:"array"};if(N.type?._def&&N.type?._def?.typeName!==xZ.ZodAny)T.items=K(N.type._def,{...E,currentPath:[...E.currentPath,"items"]});if(N.minLength)l(T,"minItems",N.minLength.value,N.minLength.message,E);if(N.maxLength)l(T,"maxItems",N.maxLength.value,N.maxLength.message,E);if(N.exactLength)l(T,"minItems",N.exactLength.value,N.exactLength.message,E),l(T,"maxItems",N.exactLength.value,N.exactLength.message,E);return T}var x0=Z(()=>{XN()});function l1(N,E){let T={type:"integer",format:"int64"};if(!N.checks)return T;for(let w of N.checks)switch(w.kind){case"min":if(E.target==="jsonSchema7")if(w.inclusive)l(T,"minimum",w.value,w.message,E);else l(T,"exclusiveMinimum",w.value,w.message,E);else{if(!w.inclusive)T.exclusiveMinimum=!0;l(T,"minimum",w.value,w.message,E)}break;case"max":if(E.target==="jsonSchema7")if(w.inclusive)l(T,"maximum",w.value,w.message,E);else l(T,"exclusiveMaximum",w.value,w.message,E);else{if(!w.inclusive)T.exclusiveMaximum=!0;l(T,"maximum",w.value,w.message,E)}break;case"multipleOf":l(T,"multipleOf",w.value,w.message,E);break}return T}var l0=()=>{};function b1(){return{type:"boolean"}}function ow(N,E){return K(N.type._def,E)}var cw=Z(()=>{XN()});var m1=(N,E)=>{return K(N.innerType._def,E)};var b0=Z(()=>{XN()});function m0(N,E,T){let w=T??E.dateStrategy;if(Array.isArray(w))return{anyOf:w.map(($,D)=>m0(N,E,$))};switch(w){case"string":case"format:date-time":return{type:"string",format:"date-time"};case"format:date":return{type:"string",format:"date"};case"integer":return lZ(N,E)}}var lZ=(N,E)=>{let T={type:"integer",format:"unix-time"};if(E.target==="openApi3")return T;for(let w of N.checks)switch(w.kind){case"min":l(T,"minimum",w.value,w.message,E);break;case"max":l(T,"maximum",w.value,w.message,E);break}return T};var d0=()=>{};function d1(N,E){return{...K(N.innerType._def,E),default:N.defaultValue()}}var o0=Z(()=>{XN()});function o1(N,E){return E.effectStrategy==="input"?K(N.schema._def,E):wN(E)}var c0=Z(()=>{XN();uN()});function c1(N){return{type:"string",enum:Array.from(N.values)}}function p1(N,E){let T=[K(N.left._def,{...E,currentPath:[...E.currentPath,"allOf","0"]}),K(N.right._def,{...E,currentPath:[...E.currentPath,"allOf","1"]})].filter((D)=>!!D),w=E.target==="jsonSchema2019-09"?{unevaluatedProperties:!1}:void 0,$=[];return T.forEach((D)=>{if(bZ(D)){if($.push(...D.allOf),D.unevaluatedProperties===void 0)w=void 0}else{let U=D;if("additionalProperties"in D&&D.additionalProperties===!1){let{additionalProperties:_,...A}=D;U=A}else w=void 0;$.push(U)}}),$.length?{allOf:$,...w}:void 0}var bZ=(N)=>{if("type"in N&&N.type==="string")return!1;return"allOf"in N};var p0=Z(()=>{XN()});function t1(N,E){let T=typeof N.value;if(T!=="bigint"&&T!=="number"&&T!=="boolean"&&T!=="string")return{type:Array.isArray(N.value)?"array":"object"};if(E.target==="openApi3")return{type:T==="bigint"?"integer":T,enum:[N.value]};return{type:T==="bigint"?"integer":T,const:N.value}}function pw(N,E){let T={type:"string"};if(N.checks)for(let w of N.checks)switch(w.kind){case"min":l(T,"minLength",typeof T.minLength==="number"?Math.max(T.minLength,w.value):w.value,w.message,E);break;case"max":l(T,"maxLength",typeof T.maxLength==="number"?Math.min(T.maxLength,w.value):w.value,w.message,E);break;case"email":switch(E.emailStrategy){case"format:email":rN(T,"email",w.message,E);break;case"format:idn-email":rN(T,"idn-email",w.message,E);break;case"pattern:zod":HN(T,tN.email,w.message,E);break}break;case"url":rN(T,"uri",w.message,E);break;case"uuid":rN(T,"uuid",w.message,E);break;case"regex":HN(T,w.regex,w.message,E);break;case"cuid":HN(T,tN.cuid,w.message,E);break;case"cuid2":HN(T,tN.cuid2,w.message,E);break;case"startsWith":HN(T,RegExp(`^${r0(w.value,E)}`),w.message,E);break;case"endsWith":HN(T,RegExp(`${r0(w.value,E)}$`),w.message,E);break;case"datetime":rN(T,"date-time",w.message,E);break;case"date":rN(T,"date",w.message,E);break;case"time":rN(T,"time",w.message,E);break;case"duration":rN(T,"duration",w.message,E);break;case"length":l(T,"minLength",typeof T.minLength==="number"?Math.max(T.minLength,w.value):w.value,w.message,E),l(T,"maxLength",typeof T.maxLength==="number"?Math.min(T.maxLength,w.value):w.value,w.message,E);break;case"includes":{HN(T,RegExp(r0(w.value,E)),w.message,E);break}case"ip":{if(w.version!=="v6")rN(T,"ipv4",w.message,E);if(w.version!=="v4")rN(T,"ipv6",w.message,E);break}case"base64url":HN(T,tN.base64url,w.message,E);break;case"jwt":HN(T,tN.jwt,w.message,E);break;case"cidr":{if(w.version!=="v6")HN(T,tN.ipv4Cidr,w.message,E);if(w.version!=="v4")HN(T,tN.ipv6Cidr,w.message,E);break}case"emoji":HN(T,tN.emoji(),w.message,E);break;case"ulid":{HN(T,tN.ulid,w.message,E);break}case"base64":{switch(E.base64Strategy){case"format:binary":{rN(T,"binary",w.message,E);break}case"contentEncoding:base64":{l(T,"contentEncoding","base64",w.message,E);break}case"pattern:zod":{HN(T,tN.base64,w.message,E);break}}break}case"nanoid":HN(T,tN.nanoid,w.message,E);case"toLowerCase":case"toUpperCase":case"trim":break;default:(($)=>{})(w)}return T}function r0(N,E){return E.patternStrategy==="escape"?dZ(N):N}function dZ(N){let E="";for(let T=0;T<N.length;T++){if(!mZ.has(N[T]))E+="\\";E+=N[T]}return E}function rN(N,E,T,w){if(N.format||N.anyOf?.some(($)=>$.format)){if(!N.anyOf)N.anyOf=[];if(N.format){if(N.anyOf.push({format:N.format,...N.errorMessage&&w.errorMessages&&{errorMessage:{format:N.errorMessage.format}}}),delete N.format,N.errorMessage){if(delete N.errorMessage.format,Object.keys(N.errorMessage).length===0)delete N.errorMessage}}N.anyOf.push({format:E,...T&&w.errorMessages&&{errorMessage:{format:T}}})}else l(N,"format",E,T,w)}function HN(N,E,T,w){if(N.pattern||N.allOf?.some(($)=>$.pattern)){if(!N.allOf)N.allOf=[];if(N.pattern){if(N.allOf.push({pattern:N.pattern,...N.errorMessage&&w.errorMessages&&{errorMessage:{pattern:N.errorMessage.pattern}}}),delete N.pattern,N.errorMessage){if(delete N.errorMessage.pattern,Object.keys(N.errorMessage).length===0)delete N.errorMessage}}N.allOf.push({pattern:r1(E,w),...T&&w.errorMessages&&{errorMessage:{pattern:T}}})}else l(N,"pattern",r1(E,w),T,w)}function r1(N,E){if(!E.applyRegexFlags||!N.flags)return N.source;let T={i:N.flags.includes("i"),m:N.flags.includes("m"),s:N.flags.includes("s")},w=T.i?N.source.toLowerCase():N.source,$="",D=!1,U=!1,_=!1;for(let A=0;A<w.length;A++){if(D){$+=w[A],D=!1;continue}if(T.i){if(U){if(w[A].match(/[a-z]/)){if(_)$+=w[A],$+=`${w[A-2]}-${w[A]}`.toUpperCase(),_=!1;else if(w[A+1]==="-"&&w[A+2]?.match(/[a-z]/))$+=w[A],_=!0;else $+=`${w[A]}${w[A].toUpperCase()}`;continue}}else if(w[A].match(/[a-z]/)){$+=`[${w[A]}${w[A].toUpperCase()}]`;continue}}if(T.m){if(w[A]==="^"){$+=`(^|(?<=[\r
|
|
174
|
+
LIMIT ?`).all(D,T),A=[],R=new Set;for(let L of _){let X=N.db.select().from(f.contentChunks).where(W0(f.contentChunks.id,L.chunk_id)).get();if(!X||X.driveId!==N.driveId)continue;if(R.has(X.filePath))continue;R.add(X.filePath);let Y=N.db.select().from(f.files).where(sY(W0(f.files.path,X.filePath),W0(f.files.driveId,N.driveId))).get();A.push({path:X.filePath,snippet:X.content.slice(0,200),author:Y?.author,modifiedAt:Y?.modifiedAt})}return A}function EZ(N,E,T){let w=E.split(/\s+/).filter(Boolean).map(($)=>`"${$}"`).join(" OR ");if(!w)return[];try{return qw(N.db,{pattern:w,driveId:N.driveId}).slice(0,T).map((D)=>({path:D.path,snippet:D.snippet}))}catch{return[]}}var tf=Z(()=>{a()});import{eq as iw,and as TZ,or as wZ,isNull as $Z}from"drizzle-orm";async function rf(N,E){let T=[iw(f.files.driveId,N.driveId),iw(f.files.isDeleted,!1),wZ(iw(f.files.embeddingStatus,"failed"),$Z(f.files.embeddingStatus),iw(f.files.embeddingStatus,"pending"))];if(E.path){let{like:A}=await import("drizzle-orm"),R=E.path.endsWith("/")?E.path:E.path+"/";T.push(A(f.files.path,R+"%"))}let w=N.db.select({path:f.files.path}).from(f.files).where(TZ(...T)).all(),$=0,D=0,U=0,_=3;for(let A=0;A<w.length;A+=_){let R=w.slice(A,A+_),L=await Promise.allSettled(R.map(async(X)=>{let Y=g(N.orgId,N.driveId,X.path),Q=await N.s3.getObject(Y),M=Q.contentType??GN(X.path),n=ME(Q.body,M);if(n===null)return dT(N,X.path),"skipped";if($E(N.db,{path:X.path,driveId:N.driveId,content:n}),N.embeddingProvider)return await X0(N.db,N.embeddingProvider,{path:X.path,driveId:N.driveId,content:n}),"reindexed";return"skipped"}));for(let X of L)if(X.status==="fulfilled")if(X.value==="reindexed")$++;else U++;else console.error("Reindex failed:",X.reason),D++}return{reindexed:$,failed:D,skipped:U}}var af=Z(()=>{a();JN();mT();RT();iN()});import{eq as ef,and as DZ,like as UZ}from"drizzle-orm";async function sf(N,E){let T=WE(E.path??"/"),w=g(N.orgId,N.driveId,T),{objects:$}=await N.s3.listObjects(w),D=N.db.select().from(f.files).where(DZ(ef(f.files.driveId,N.driveId),UZ(f.files.path,T+"%"),ef(f.files.isDeleted,!1))).all(),U=new Map(D.map((A)=>[A.path,A])),_=[];for(let A of $){let R=A.key.slice(w.length);if(!R)continue;let L=R.split("/").filter(Boolean);if(L.length===0)continue;if(E.depth!==void 0&&L.length>E.depth)continue;let X=_;for(let Y=0;Y<L.length;Y++){let Q=L[Y],M=Y===L.length-1,n=!M||R.endsWith("/");if(n&&!M){let C=X.find((O)=>O.name===Q&&O.type==="directory");if(!C)C={name:Q,type:"directory",children:[]},X.push(C);if(!C.children)C.children=[];X=C.children}else if(n&&M){let C=X.find((O)=>O.name===Q&&O.type==="directory");if(!C)C={name:Q,type:"directory",children:[]},X.push(C)}else{let C=T+L.slice(0,Y+1).join("/"),O=U.get(C),z={name:Q,type:"file",size:O?.size??A.size};if(O?.author)z.author=O.author;if(O?.modifiedAt??A.lastModified)z.modifiedAt=O?.modifiedAt??A.lastModified;X.push(z)}}}return{tree:_}}var N1=Z(()=>{a();JN()});import{eq as E1,and as _Z,like as AZ}from"drizzle-orm";function fZ(N){let E="",T=0;while(T<N.length){let w=N[T];if(w==="*")if(N[T+1]==="*"){if(E+=".*",T+=2,N[T]==="/")T++}else E+="[^/]*",T++;else if(w==="?")E+="[^/]",T++;else if(".+^${}()|[]\\".includes(w))E+="\\"+w,T++;else E+=w,T++}return new RegExp("^"+E+"$")}async function T1(N,E){let T=E.path?WE(E.path):"/",w=g(N.orgId,N.driveId,T),{objects:$}=await N.s3.listObjects(w),D=N.db.select().from(f.files).where(_Z(E1(f.files.driveId,N.driveId),AZ(f.files.path,T+"%"),E1(f.files.isDeleted,!1))).all(),U=new Map(D.map((R)=>[R.path,R])),_=fZ(E.pattern),A=[];for(let R of $){let L=R.key.slice(w.length);if(!L||L.endsWith("/"))continue;if(_.test(L)){let X=T+L,Y=U.get(X);A.push({path:X,size:Y?.size??R.size,modifiedAt:Y?.modifiedAt??R.lastModified})}}return{matches:A}}var w1=Z(()=>{a();JN()});import{mkdtemp as RZ,rm as $1,writeFile as LZ}from"fs/promises";import{tmpdir as XZ}from"os";import{join as n0}from"path";import{eq as M0,and as YZ}from"drizzle-orm";function D1(N){let T=(N.toLowerCase().split("/").pop()??"").split(".");if(T.length<2)return null;let w=!1,$=T.pop();if($==="gz"&&T.length>=2)w=!0,$=T.pop();let D=QZ[$];if(!D)return null;if(w&&!f1.has(D))return null;return{format:D,gzip:w}}function U1(N,E){let T=process.env[N];if(!T)return E;let w=parseInt(T,10);return Number.isFinite(w)&&w>0?w:E}function IZ(){let N=process.env.AGENT_FS_SQL_MEMORY_LIMIT?.trim();if(N&&/^[0-9]+(\.[0-9]+)?\s*(B|KB|MB|GB|TB|KiB|MiB|GiB)?$/i.test(N))return N;return"512MB"}function mN(N){return`'${N.replace(/'/g,"''")}'`}function jN(N){return`"${N.replace(/"/g,'""')}"`}function WZ(N,E){switch(N){case"csv":return`read_csv(${mN(E)})`;case"tsv":return`read_csv(${mN(E)}, delim=E'\\t')`;case"parquet":return`read_parquet(${mN(E)})`;case"json":case"ndjson":return`read_json_auto(${mN(E)})`;case"xlsx":return`read_xlsx(${mN(E)})`;default:throw new d(`Format ${N} is not file-readable`)}}function nZ(N,E){return/\.gz$/i.test(N)&&f1.has(E)}function _1(N,E){return N.db.select({path:f.files.path,size:f.files.size}).from(f.files).where(YZ(M0(f.files.driveId,N.driveId),M0(f.files.path,E),M0(f.files.isDeleted,!1))).get()??null}function A1(N,E){let T=_1(N,E);if(T)return T;let w=E.startsWith("/")?E.slice(1):"/"+E;return _1(N,w)}function VZ(N,E){let T=[],w=new Set;for(let[U,_]of Object.entries(E.tables??{})){if(!MZ.test(U))throw new d(`Invalid table name: ${U}`,{field:"tables",suggestion:"Table names must match [A-Za-z_][A-Za-z0-9_]*"});if(w.has(U.toLowerCase()))throw new d(`Duplicate table name: ${U}`,{field:"tables"});w.add(U.toLowerCase());let A=LE(typeof _==="string"?_:_.path),R=typeof _==="string"?void 0:_.format,L=D1(A),X=R??L?.format;if(!X)throw new d(`Cannot infer format for ${A}`,{field:"tables",suggestion:'Pass an explicit format: { path, format: "csv" | "tsv" | "parquet" | "xlsx" | "json" | "ndjson" | "sqlite" | "duckdb" }'});let Y=A1(N,A);if(!Y)throw new y(`File not found: ${A}`,{path:A});T.push({table:U,path:A,format:X,gzip:nZ(A,X),size:Y.size})}let $=new Set,D=1;for(let U of E.query.matchAll(R1)){let _=U[3],A=D1(_);if(!A||!JZ.has(A.format))continue;let R=LE(_);if($.has(R))continue;$.add(R);let L=A1(N,R);if(!L)continue;let X=`doc_${D++}`;while(w.has(X))X=`doc_${D++}`;w.add(X),T.push({table:X,path:R,format:A.format,gzip:A.gzip,autoBound:!0,size:L.size})}return T}function oT(N){if(N===null||N===void 0)return null;let E=typeof N;if(E==="bigint"){let w=N;return w>=BigInt(Number.MIN_SAFE_INTEGER)&&w<=BigInt(Number.MAX_SAFE_INTEGER)?Number(w):w.toString()}if(E==="number"||E==="string"||E==="boolean")return N;if(N instanceof Uint8Array)return`<blob ${N.byteLength} bytes>`;let T=N;if(typeof T.toDouble==="function")return T.toDouble();if(T.bytes instanceof Uint8Array)return`<blob ${T.bytes.byteLength} bytes>`;if(Array.isArray(T.items))return T.items.map(oT);if(Array.isArray(T.entries))return T.entries.map((w)=>({key:oT(w.key),value:oT(w.value)}));if(T.entries&&typeof T.entries==="object"){let w={};for(let[$,D]of Object.entries(T.entries))w[$]=oT(D);return w}return String(N)}function BZ(N,E,T){if(E)return new d(`Query timed out after ${T}ms`,{suggestion:"Simplify the query or reduce the amount of data it scans"});let w=N instanceof Error?N.message:String(N);if(/disabled by configuration|has been locked|external access/i.test(w))return new d(w,{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 d(w)}async function L1(N,E){let T=Date.now(),w=E.maxRows??ZZ,$=U1("AGENT_FS_SQL_TIMEOUT_MS",30000),D=U1("AGENT_FS_SQL_MAX_FILE_BYTES",268435456),U=VZ(N,E);for(let C of U)if(C.size>D)throw new d(`File too large for SQL: ${C.path} (${C.size} bytes, limit ${D})`,{suggestion:"Raise AGENT_FS_SQL_MAX_FILE_BYTES on the server if needed"});let{DuckDBInstance:_}=await import("@duckdb/node-api"),A=null,R=null,L=null,X=null,Y=null,Q=!1,M=new AbortController;Y=setTimeout(()=>{Q=!0,M.abort();for(let C of[L,X])try{C?.interrupt()}catch{}},$);let n=()=>{if(Q)throw new d(`Query timed out after ${$}ms`,{suggestion:"Reduce the amount of data the query loads or scans"})};try{if(U.length>0){A=await RZ(n0(XZ(),"agent-fs-sql-"));for(let H=0;H<U.length;H++){let j=U[H],c=GZ[j.format]+(j.gzip?".gz":""),p=n0(A,`t${H}${c}`);try{let S=await N.s3.getObject(g(N.orgId,N.driveId,j.path),void 0,{abortSignal:M.signal});await LZ(p,S.body)}catch(S){n();let q=S;if(q?.name==="NoSuchKey"||q?.$metadata?.httpStatusCode===404)throw new y(`File not found: ${j.path}`,{path:j.path});throw S}j.localFile=p,n()}}if(R=await _.create(":memory:"),L=await R.connect(),await L.run(`SET memory_limit=${mN(IZ())}`),U.some((H)=>H.format==="xlsx"))await L.run("INSTALL excel"),await L.run("LOAD excel");let C=U.filter((H)=>H.format==="sqlite"),O=new Map;if(C.length>0&&A)O=await CZ(_,C,A,n,(H)=>{X=H});n();for(let H of U)try{if(H.format==="sqlite"){await L.run(`CREATE SCHEMA ${jN(H.table)}`);for(let{table:j,parquetFile:c}of O.get(H.table)??[])await L.run(`CREATE TABLE ${jN(H.table)}.${jN(j)} AS SELECT * FROM read_parquet(${mN(c)})`)}else if(H.format==="duckdb"){let j=`src_${H.table}`;await L.run(`ATTACH ${mN(H.localFile)} AS ${jN(j)} (READ_ONLY)`);let p=(await L.runAndReadAll(`SELECT table_name FROM duckdb_tables() WHERE database_name = ${mN(j)} AND schema_name = 'main'`)).getRowObjectsJson().map((S)=>String(S.table_name));if(p.length===0)throw new d(`No tables found in ${H.path}`);await L.run(`CREATE SCHEMA ${jN(H.table)}`);for(let S of p)await L.run(`CREATE TABLE ${jN(H.table)}.${jN(S)} AS SELECT * FROM ${jN(j)}.main.${jN(S)}`);await L.run(`DETACH ${jN(j)}`)}else await L.run(`CREATE TABLE ${jN(H.table)} AS SELECT * FROM ${WZ(H.format,H.localFile)}`)}catch(j){if(j instanceof d)throw j;n();let c=j instanceof Error?j.message:String(j);throw new d(`Failed to load ${H.path} as ${H.format}: ${c}`)}if(n(),await L.run("SET enable_external_access=false"),await L.run("SET disabled_filesystems='LocalFileSystem'"),await L.run("SET lock_configuration=true"),A)await $1(A,{recursive:!0,force:!0}),A=null;let z=new Map(U.filter((H)=>H.autoBound).map((H)=>[H.path,H.table])),UN=E.query.replace(R1,(H,j,c,p)=>{let S=z.get(LE(p));return S?`${j} ${jN(S)}`:H});try{let H=await L.extractStatements(UN);if(H.count===0)throw new d("Query contains no statements",{field:"query"});for(let J=0;J<H.count-1;J++)await(await H.prepare(J)).run();let c=await(await H.prepare(H.count-1)).runAndReadUntil(w+1),p=new Map,S=c.columnNames().map((J)=>{let AN=p.get(J)??0;return p.set(J,AN+1),AN===0?J:`${J}_${AN+1}`}),q=c.columnTypes(),W=S.map((J,AN)=>({name:J,type:String(q[AN]??"UNKNOWN")})),WN=c.getRows(),_N=WN.length>w||!c.done,NN=WN.slice(0,w).map((J)=>{let AN={};for(let o=0;o<S.length;o++)AN[S[o]]=oT(J[o]);return AN}),I=U.map((J)=>({table:J.table,path:J.path,format:J.format}));return{columns:W,rows:NN,rowCount:NN.length,truncated:_N,files:I,elapsedMs:Date.now()-T}}catch(H){if(H instanceof d)throw H;throw BZ(H,Q,$)}}finally{if(Y)clearTimeout(Y);try{L?.closeSync()}catch{}try{R?.closeSync()}catch{}if(A)await $1(A,{recursive:!0,force:!0}).catch(()=>{})}}async function CZ(N,E,T,w,$){let D=new Map,U=await N.create(":memory:"),_=await U.connect();$(_);try{await _.run("INSTALL sqlite"),await _.run("LOAD sqlite");for(let A=0;A<E.length;A++){let R=E[A];try{w(),await _.run(`ATTACH ${mN(R.localFile)} AS src (TYPE sqlite, READ_ONLY)`);let X=(await _.runAndReadAll("SELECT table_name FROM duckdb_tables() WHERE database_name = 'src'")).getRowObjectsJson().map((Q)=>String(Q.table_name));if(X.length===0)throw new d(`No tables found in ${R.path}`);let Y=[];for(let Q=0;Q<X.length;Q++){w();let M=n0(T,`sq_${A}_${Q}.parquet`);await _.run(`COPY (SELECT * FROM src.${jN(X[Q])}) TO ${mN(M)} (FORMAT parquet)`),Y.push({table:X[Q],parquetFile:M})}D.set(R.table,Y),await _.run("DETACH src")}catch(L){if(L instanceof d)throw L;w();let X=L instanceof Error?L.message:String(L);throw new d(`Failed to load ${R.path} as sqlite: ${X}`)}}}finally{$(null);try{_.closeSync()}catch{}try{U.closeSync()}catch{}}return D}var ZZ=1000,QZ,JZ,f1,GZ,MZ,R1;var X1=Z(()=>{a();JN();QN();QZ={csv:"csv",tsv:"tsv",tab:"tsv",parquet:"parquet",xlsx:"xlsx",json:"json",jsonl:"ndjson",ndjson:"ndjson",db:"sqlite",sqlite:"sqlite",sqlite3:"sqlite",duckdb:"duckdb"},JZ=new Set(["csv","tsv","parquet","xlsx","json","ndjson"]),f1=new Set(["csv","tsv","json","ndjson"]),GZ={csv:".csv",tsv:".tsv",parquet:".parquet",xlsx:".xlsx",json:".json",ndjson:".ndjson",sqlite:".db",duckdb:".duckdb"};MZ=/^[A-Za-z_][A-Za-z0-9_]*$/,R1=/\b(from|join)\s+(['"])([^'"]+\.[A-Za-z0-9]+(?:\.gz)?)\2/gi});function cT(N,E,T,w){let $=w.startsWith("/")?w.slice(1):w;return`${N}/file/~/${E}/${T}/${$}`}async function Y1(N,E){let T=LE(E.path),w=g(N.orgId,N.driveId,T),$=E.expiresIn??86400;try{await N.s3.headObject(w)}catch(A){if(A?.name==="NotFound"||A?.name==="NoSuchKey"||A?.$metadata?.httpStatusCode===404)throw new y(`File not found: ${T}`,{path:T});throw A}if(!N.s3.capabilities.presignedUrls){if(!N.appUrl)throw new lN("signed-url",void 0,{suggestion:"This storage backend cannot mint presigned URLs and no app URL is configured to fall back to."});return{url:cT(N.appUrl,N.orgId,N.driveId,T),path:T,expiresIn:0,expiresAt:"",kind:"app"}}let D=zw(GN(T)),U=T.split("/").pop()??"download";return{url:await N.s3.getPresignedUrl(w,$,D!=="application/octet-stream"?D:void 0,`attachment; filename*=UTF-8''${gw(U)}`),path:T,expiresIn:$,expiresAt:new Date(Date.now()+$*1000).toISOString(),kind:"presigned"}}var Z1=Z(()=>{JN();QN();iN()});import{eq as u,and as dN,sql as V0,desc as Q1,ne as SZ}from"drizzle-orm";function B0(N,E){N.db.insert(f.events).values({id:crypto.randomUUID(),orgId:N.orgId,type:E.type,resourceType:E.resourceType,resourceId:E.resourceId,actor:N.userId,target:E.target??null,status:"created",metadata:E.metadata?JSON.stringify(E.metadata):null,createdAt:new Date}).run()}function HZ(N,E){let T=N.db.select({userId:f.driveMembers.userId}).from(f.driveMembers).where(dN(u(f.driveMembers.driveId,N.driveId),SZ(f.driveMembers.userId,N.userId))).all();if(T.length===0)return;N.db.insert(f.events).values(T.map(({userId:w})=>({id:crypto.randomUUID(),orgId:N.orgId,type:"comment_notification",resourceType:"comment",resourceId:E.commentId,actor:N.userId,target:w,status:"created",metadata:JSON.stringify({path:E.path,parentId:E.parentId}),createdAt:E.createdAt}))).run()}function pT(N,E){return N.db.select().from(f.comments).where(dN(u(f.comments.id,E),u(f.comments.orgId,N.orgId),u(f.comments.driveId,N.driveId),u(f.comments.isDeleted,!1))).get()}function yw(N){return{id:N.id,parentId:N.parentId??void 0,path:N.path,lineStart:N.lineStart??void 0,lineEnd:N.lineEnd??void 0,quotedContent:N.quotedContent??void 0,body:N.body,author:N.author,resolved:N.resolved??!1,resolvedBy:N.resolvedBy??void 0,resolvedAt:N.resolvedAt??void 0,fileVersionId:N.fileVersionId??void 0,replyCount:N.replyCount??0,createdAt:N.createdAt,updatedAt:N.updatedAt}}async function uw(N,E){let T=new Date,w=crypto.randomUUID(),$=E.path;if(E.parentId){let U=pT(N,E.parentId);if(!U)throw new y("Parent comment not found",{suggestion:"Check that the parent comment ID is correct and not deleted"});if(U.parentId)throw new d("Cannot reply to a reply \u2014 only root comments accept replies",{suggestion:"Reply to the root comment instead"});if(!$)$=U.path}if(!$)throw new d("path is required for root comments",{field:"path"});let D=N.db.select({id:f.fileVersions.id}).from(f.fileVersions).where(dN(u(f.fileVersions.path,$),u(f.fileVersions.driveId,N.driveId))).orderBy(Q1(f.fileVersions.id)).limit(1).get();return N.db.insert(f.comments).values({id:w,parentId:E.parentId??null,orgId:N.orgId,driveId:N.driveId,path:$,lineStart:E.lineStart??null,lineEnd:E.lineEnd??null,quotedContent:E.quotedContent??null,fileVersionId:D?.id??null,body:E.body,author:N.userId,resolved:!1,createdAt:T,updatedAt:T,isDeleted:!1}).run(),B0(N,{type:"comment_created",resourceType:"comment",resourceId:w,metadata:{path:$,parentId:E.parentId}}),HZ(N,{commentId:w,path:$,parentId:E.parentId,createdAt:T}),{id:w,path:$,body:E.body,parentId:E.parentId,lineStart:E.lineStart,lineEnd:E.lineEnd,author:N.userId,createdAt:T}}async function kw(N,E){let T=[u(f.comments.orgId,N.orgId),u(f.comments.driveId,N.driveId),u(f.comments.isDeleted,!1)];if(E.path)T.push(u(f.comments.path,E.path));if(E.parentId)T.push(u(f.comments.parentId,E.parentId));else if(E.parentId===void 0&&!E.resolved)T.push(V0`${f.comments.parentId} IS NULL`),T.push(u(f.comments.resolved,!1));else if(E.parentId===void 0&&E.resolved)T.push(V0`${f.comments.parentId} IS NULL`);if(E.orgId)T.push(u(f.comments.orgId,E.orgId));let w=E.limit??50,$=E.offset??0;return{comments:N.db.select().from(f.comments).where(dN(...T)).orderBy(Q1(f.comments.createdAt)).limit(w).offset($).all().map((_)=>{let R=N.db.select().from(f.comments).where(dN(u(f.comments.parentId,_.id),u(f.comments.orgId,N.orgId),u(f.comments.driveId,N.driveId),u(f.comments.isDeleted,!1))).orderBy(f.comments.createdAt).all().map((L)=>yw({...L,replyCount:0}));return{...yw({..._,replyCount:R.length}),replies:R}})}}async function hw(N,E){let T=pT(N,E.id);if(!T)throw new y("Comment not found",{suggestion:"Check that the comment ID is correct"});let w=N.db.select({count:V0`count(*)`}).from(f.comments).where(dN(u(f.comments.parentId,T.id),u(f.comments.orgId,N.orgId),u(f.comments.driveId,N.driveId),u(f.comments.isDeleted,!1))).get(),$=yw({...T,replyCount:w?.count??0}),U=N.db.select().from(f.comments).where(dN(u(f.comments.parentId,E.id),u(f.comments.orgId,N.orgId),u(f.comments.driveId,N.driveId),u(f.comments.isDeleted,!1))).orderBy(f.comments.createdAt).all().map((_)=>yw({..._,replyCount:0}));return{comment:$,replies:U}}async function xw(N,E){let T=pT(N,E.id);if(!T)throw new y("Comment not found",{suggestion:"Check that the comment ID is correct"});if(T.author!==N.userId)throw new VN("You can only edit your own comments",{suggestion:"Only the comment author can update it"});let w=new Date;return N.db.update(f.comments).set({body:E.body,updatedAt:w}).where(dN(u(f.comments.id,E.id),u(f.comments.orgId,N.orgId),u(f.comments.driveId,N.driveId))).run(),{id:E.id,body:E.body,updatedAt:w}}async function lw(N,E){let T=pT(N,E.id);if(!T)throw new y("Comment not found",{suggestion:"Check that the comment ID is correct"});if(T.author!==N.userId)throw new VN("You can only delete your own comments",{suggestion:"Only the comment author can delete it"});let w=new Date;if(N.db.update(f.comments).set({isDeleted:!0,updatedAt:w}).where(dN(u(f.comments.id,E.id),u(f.comments.orgId,N.orgId),u(f.comments.driveId,N.driveId))).run(),!T.parentId)N.db.update(f.comments).set({isDeleted:!0,updatedAt:w}).where(dN(u(f.comments.parentId,E.id),u(f.comments.orgId,N.orgId),u(f.comments.driveId,N.driveId))).run();return B0(N,{type:"comment_deleted",resourceType:"comment",resourceId:E.id}),{deleted:!0}}async function bw(N,E){let T=pT(N,E.id);if(!T)throw new y("Comment not found",{suggestion:"Check that the comment ID is correct"});if(T.parentId)throw new d("Cannot resolve a reply \u2014 only root comments can be resolved",{suggestion:"Resolve the parent comment instead"});let w=new Date,$=E.resolved?w:null,D=E.resolved?N.userId:null;return N.db.update(f.comments).set({resolved:E.resolved,resolvedBy:D,resolvedAt:$,updatedAt:w}).where(dN(u(f.comments.id,E.id),u(f.comments.orgId,N.orgId),u(f.comments.driveId,N.driveId))).run(),B0(N,{type:E.resolved?"comment_resolved":"comment_reopened",resourceType:"comment",resourceId:E.id}),{id:E.id,resolved:E.resolved,resolvedBy:D??void 0,resolvedAt:$??void 0}}var J1=Z(()=>{a();QN()});import{and as zE,count as OZ,desc as FZ,eq as LN,inArray as G1,ne as PZ,sql as KZ}from"drizzle-orm";function C0(N){return[LN(f.events.orgId,N.orgId),LN(f.events.type,W1),LN(f.events.resourceType,"comment"),LN(f.events.target,N.userId),LN(f.comments.orgId,N.orgId),LN(f.comments.driveId,N.driveId),LN(f.comments.isDeleted,!1)]}async function M1(N,E){let T=[...C0(N),PZ(f.events.status,"deleted")];if(E.unreadOnly)T.push(LN(f.events.status,"created"));let w=N.db.select({id:f.events.id,commentId:f.comments.id,parentId:f.comments.parentId,path:f.comments.path,body:f.comments.body,actor:f.events.actor,createdAt:f.events.createdAt,status:f.events.status}).from(f.events).innerJoin(f.comments,zE(LN(f.events.resourceId,f.comments.id),LN(f.events.resourceType,"comment"))).where(zE(...T)).orderBy(KZ`CASE WHEN ${f.events.status} = 'created' THEN 0 ELSE 1 END`,FZ(f.events.createdAt)).limit(E.limit??jZ).offset(E.offset??0).all(),$=N.db.select({value:OZ()}).from(f.events).innerJoin(f.comments,zE(LN(f.events.resourceId,f.comments.id),LN(f.events.resourceType,"comment"))).where(zE(...C0(N),LN(f.events.status,"created"))).get();return{notifications:w.map((U)=>({id:U.id,commentId:U.commentId,parentId:U.parentId??void 0,path:U.path,body:U.body,actor:U.actor,createdAt:U.createdAt,read:U.status==="ack"})),unreadCount:Number($?.value??0)}}async function n1(N,E){if(E.all===!0&&E.ids&&E.ids.length>0)throw new d("Provide notification IDs or set all=true, not both",{suggestion:"Remove ids to mark all notifications, or omit all to mark selected IDs"});if(E.all!==!0&&(!E.ids||E.ids.length===0))throw new d("Provide notification IDs or set all=true",{suggestion:"Pass ids: [...] to mark selected notifications, or all: true"});let T=[...C0(N),LN(f.events.status,"created")];if(!E.all){let D=E.ids??[];if(D.length===0)return{markedRead:0};T.push(G1(f.events.id,D))}let w=N.db.select({id:f.events.id}).from(f.events).innerJoin(f.comments,zE(LN(f.events.resourceId,f.comments.id),LN(f.events.resourceType,"comment"))).where(zE(...T)).all().map((D)=>D.id),$=0;for(let D=0;D<w.length;D+=I1){let U=w.slice(D,D+I1),_=N.db.update(f.events).set({status:"ack"}).where(zE(G1(f.events.id,U),LN(f.events.orgId,N.orgId),LN(f.events.target,N.userId),LN(f.events.type,W1),LN(f.events.status,"created"))).returning({id:f.events.id}).all();$+=_.length}return{markedRead:$}}var W1="comment_notification",jZ=50,I1=500;var V1=Z(()=>{a();QN()});import{z as G}from"zod";async function CN(N,E,T,w){let $=S0[E];if(!$)throw Error(`Unknown operation: ${E}`);if(!w?.skipAuth){let _=uT(E);hT(N.db,{userId:N.userId,driveId:N.driveId,requiredRole:_})}let D=$.schema.parse(T),U=await $.handler(N,D);if(N.appUrl&&U&&typeof U==="object"){if("path"in U)U.appUrl=cT(N.appUrl,N.orgId,N.driveId,U.path);else if("to"in U)U.appUrl=cT(N.appUrl,N.orgId,N.driveId,U.to)}return U}function YT(){return Object.keys(S0)}function DE(N){return S0[N]}var S0;var H0=Z(()=>{lT();Uf();Af();Rf();Xf();Qf();If();Mf();Bf();Sf();Of();Kf();gf();uf();xf();bf();df();cf();tf();af();N1();w1();X1();Z1();J1();V1();S0={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:vw,schema:G.object({path:G.string(),content:G.string(),message:G.string().optional(),expectedVersion:G.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:_f,schema:G.object({path:G.string(),offset:G.number().int().min(0).optional(),limit:G.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:ff,schema:G.object({path:G.string(),old_string:G.string(),new_string:G.string(),message:G.string().optional(),expectedVersion:G.number().int().optional()})},append:{description:"Append content to the end of an existing file. Creates a new version. Returns { version, size }.",handler:Lf,schema:G.object({path:G.string(),content:G.string(),message:G.string().optional(),expectedVersion:G.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:Zf,schema:G.object({path:G.string().optional()})},stat:{description:"Get file metadata without reading content. Returns path, size, contentType, author, currentVersion, createdAt, modifiedAt, isDeleted, embeddingStatus.",handler:Gf,schema:G.object({path:G.string()})},rm:{description:"Delete a file. Removes from S3, cleans up FTS5 index and vector embeddings. Returns { path, deleted }.",handler:Wf,schema:G.object({path:G.string(),expectedVersion:G.number().int().optional()})},mv:{description:"Move or rename a file. Preserves version history at the new path. Returns { from, to, version }.",handler:Vf,schema:G.object({from:G.string(),to:G.string(),message:G.string().optional(),expectedVersion:G.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:Cf,schema:G.object({from:G.string(),to:G.string(),expectedVersion:G.number().int().optional()})},tail:{description:"Read the last N lines of a file (default 20). Returns { content, totalLines, truncated }.",handler:Hf,schema:G.object({path:G.string(),lines:G.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:Pf,schema:G.object({path:G.string(),limit:G.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:zf,schema:G.object({path:G.string(),v1:G.number().int(),v2:G.number().int()})},revert:{description:"Revert a file to a previous version. Creates a new version with the old content. Returns { version, revertedTo }.",handler:yf,schema:G.object({path:G.string(),version:G.number().int(),expectedVersion:G.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:hf,schema:G.object({path:G.string().optional(),since:G.coerce.date().optional(),limit:G.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:lf,schema:G.object({pattern:G.string(),path:G.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:mf,schema:G.object({pattern:G.string(),path:G.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:pf,schema:G.object({query:G.string(),limit:G.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:of,schema:G.object({query:G.string(),limit:G.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:rf,schema:G.object({path:G.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:sf,schema:G.object({path:G.string().optional(),depth:G.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:T1,schema:G.object({pattern:G.string(),path:G.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:L1,schema:G.object({query:G.string(),tables:G.record(G.union([G.string(),G.object({path:G.string(),format:G.enum(["csv","tsv","parquet","xlsx","json","ndjson","sqlite","duckdb"]).optional()})])).optional(),maxRows:G.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:Y1,schema:G.object({path:G.string(),expiresIn:G.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:uw,schema:G.object({path:G.string().optional(),body:G.string(),parentId:G.string().optional(),lineStart:G.number().int().optional(),lineEnd:G.number().int().optional(),quotedContent:G.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:kw,schema:G.object({path:G.string().optional(),parentId:G.string().optional(),resolved:G.boolean().optional(),orgId:G.string().optional(),limit:G.number().int().min(1).optional(),offset:G.number().int().min(0).optional()})},"comment-get":{description:"Get a single comment by ID with all its replies. Returns { comment, replies }.",handler:hw,schema:G.object({id:G.string()})},"comment-update":{description:"Update a comment's body. Only the original author can update. Returns { id, body, updatedAt }.",handler:xw,schema:G.object({id:G.string(),body:G.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:lw,schema:G.object({id:G.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:bw,schema:G.object({id:G.string(),resolved:G.boolean()})},"comment-notification-list":{description:"List comment notifications for the current user in the active drive. Returns { notifications, unreadCount }.",handler:M1,schema:G.object({unreadOnly:G.boolean().optional(),limit:G.number().int().min(1).max(100).optional(),offset:G.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:n1,schema:G.object({ids:G.array(G.string()).min(1).max(100).optional(),all:G.literal(!0).optional()})}}});import{eq as SN,and as tT}from"drizzle-orm";function gE(N,E){let T=crypto.randomUUID(),w=new Date;if(N.insert(f.drives).values({id:T,orgId:E.orgId,name:E.name,isDefault:E.isDefault??!1,createdAt:w}).run(),E.creatorUserId)N.insert(f.driveMembers).values({driveId:T,userId:E.creatorUserId,role:"admin"}).run();return{id:T,name:E.name}}function O0(N,E){return N.select().from(f.drives).where(SN(f.drives.orgId,E)).all().map((T)=>({id:T.id,name:T.name,isDefault:T.isDefault}))}function oN(N,E,T){return N.select({id:f.drives.id,name:f.drives.name,isDefault:f.drives.isDefault}).from(f.drives).innerJoin(f.driveMembers,SN(f.driveMembers.driveId,f.drives.id)).where(tT(SN(f.drives.orgId,E),SN(f.driveMembers.userId,T))).all().map((w)=>({id:w.id,name:w.name,isDefault:w.isDefault}))}function F0(N,E){let T=N.select().from(f.drives).where(SN(f.drives.id,E)).get();if(!T)return null;return{id:T.id,name:T.name,orgId:T.orgId,isDefault:T.isDefault}}function qE(N,E){return N.select({userId:f.driveMembers.userId,email:f.users.email,role:f.driveMembers.role}).from(f.driveMembers).innerJoin(f.users,SN(f.driveMembers.userId,f.users.id)).where(SN(f.driveMembers.driveId,E)).all()}function vE(N,E){if(!N.select({role:f.driveMembers.role}).from(f.driveMembers).where(tT(SN(f.driveMembers.driveId,E.driveId),SN(f.driveMembers.userId,E.userId))).get())throw Error("Member not found in drive");N.update(f.driveMembers).set({role:E.role}).where(tT(SN(f.driveMembers.driveId,E.driveId),SN(f.driveMembers.userId,E.userId))).run()}function iE(N,E){if(!N.select({role:f.driveMembers.role}).from(f.driveMembers).where(tT(SN(f.driveMembers.driveId,E.driveId),SN(f.driveMembers.userId,E.userId))).get())throw Error("Member not found in drive");N.delete(f.driveMembers).where(tT(SN(f.driveMembers.driveId,E.driveId),SN(f.driveMembers.userId,E.userId))).run()}function P0(N,E){N.insert(f.driveMembers).values({driveId:E.driveId,userId:E.userId,role:E.role}).onConflictDoUpdate({target:[f.driveMembers.driveId,f.driveMembers.userId],set:{role:E.role}}).run()}var K0=Z(()=>{a()});import{eq as TN,and as nE,sql as B1}from"drizzle-orm";function yE(N,E){let T=crypto.randomUUID(),w=new Date;return N.insert(f.orgs).values({id:T,name:E.name,isPersonal:E.isPersonal??!1,createdAt:w}).run(),N.insert(f.orgMembers).values({orgId:T,userId:E.userId,role:"admin"}).run(),gE(N,{orgId:T,name:"default",isDefault:!0,creatorUserId:E.userId}),{id:T,name:E.name}}function IN(N,E){return N.select({orgId:f.orgMembers.orgId,role:f.orgMembers.role,name:f.orgs.name,isPersonal:f.orgs.isPersonal}).from(f.orgMembers).innerJoin(f.orgs,TN(f.orgMembers.orgId,f.orgs.id)).where(TN(f.orgMembers.userId,E)).all().map((w)=>({id:w.orgId,name:w.name,role:w.role,isPersonal:w.isPersonal}))}function rT(N,E){let T=N.select().from(f.orgs).where(TN(f.orgs.id,E)).get();if(!T)return null;return{id:T.id,name:T.name,isPersonal:T.isPersonal}}function uE(N,E){return N.select({userId:f.orgMembers.userId,email:f.users.email,role:f.orgMembers.role}).from(f.orgMembers).innerJoin(f.users,TN(f.orgMembers.userId,f.users.id)).where(TN(f.orgMembers.orgId,E)).all()}function kE(N,E){let T=N.select({role:f.orgMembers.role}).from(f.orgMembers).where(nE(TN(f.orgMembers.orgId,E.orgId),TN(f.orgMembers.userId,E.userId))).get();if(!T)throw Error("Member not found in org");if(T.role==="admin"&&E.role!=="admin"){if(N.select({count:B1`count(*)`}).from(f.orgMembers).where(nE(TN(f.orgMembers.orgId,E.orgId),TN(f.orgMembers.role,"admin"))).get().count<=1)throw Error("Cannot remove the last admin from the org")}N.update(f.orgMembers).set({role:E.role}).where(nE(TN(f.orgMembers.orgId,E.orgId),TN(f.orgMembers.userId,E.userId))).run()}function hE(N,E){if(N.select({isPersonal:f.orgs.isPersonal}).from(f.orgs).where(TN(f.orgs.id,E.orgId)).get()?.isPersonal)throw Error("Cannot remove members from a personal org");let w=N.select({role:f.orgMembers.role}).from(f.orgMembers).where(nE(TN(f.orgMembers.orgId,E.orgId),TN(f.orgMembers.userId,E.userId))).get();if(!w)throw Error("Member not found in org");if(w.role==="admin"){if(N.select({count:B1`count(*)`}).from(f.orgMembers).where(nE(TN(f.orgMembers.orgId,E.orgId),TN(f.orgMembers.role,"admin"))).get().count<=1)throw Error("Cannot remove the last admin from the org")}let $=N.select({id:f.drives.id}).from(f.drives).where(TN(f.drives.orgId,E.orgId)).all();for(let D of $)N.delete(f.driveMembers).where(nE(TN(f.driveMembers.driveId,D.id),TN(f.driveMembers.userId,E.userId))).run();N.delete(f.orgMembers).where(nE(TN(f.orgMembers.orgId,E.orgId),TN(f.orgMembers.userId,E.userId))).run()}function xE(N,E){let T=N.select().from(f.users).where(TN(f.users.email,E.email)).get();if(!T)throw Error(`User with email ${E.email} not found`);N.insert(f.orgMembers).values({orgId:E.orgId,userId:T.id,role:E.role}).onConflictDoUpdate({target:[f.orgMembers.orgId,f.orgMembers.userId],set:{role:E.role}}).run();let w=N.select().from(f.drives).where(nE(TN(f.drives.orgId,E.orgId),TN(f.drives.isDefault,!0))).get();if(w)N.insert(f.driveMembers).values({driveId:w.id,userId:T.id,role:E.role}).onConflictDoUpdate({target:[f.driveMembers.driveId,f.driveMembers.userId],set:{role:E.role}}).run()}var j0=Z(()=>{a();K0()});import{eq as C1}from"drizzle-orm";function S1(N){let E=new Bun.CryptoHasher("sha256");return E.update(N),E.digest("hex")}function zZ(){let N=new Uint8Array(32);return crypto.getRandomValues(N),`af_${Array.from(N,(T)=>T.toString(16).padStart(2,"0")).join("")}`}function gZ(){return crypto.randomUUID()}function cN(N,E){let T=gZ(),w=zZ(),$=S1(w),D=new Date;return N.insert(f.users).values({id:T,email:E.email,apiKeyHash:$,createdAt:D}).run(),yE(N,{name:E.email.split("@")[0],userId:T,isPersonal:!0}),{user:{id:T,email:E.email},apiKey:w}}function pN(N,E){let T=S1(E),w=N.select().from(f.users).where(C1(f.users.apiKeyHash,T)).get();if(!w)return null;return{id:w.id,email:w.email}}function ZT(N,E){let T=N.select().from(f.users).where(C1(f.users.email,E)).get();if(!T)return null;return{id:T.id,email:T.email}}var z0=Z(()=>{a();j0()});import{eq as VE,and as g0}from"drizzle-orm";function FN(N,E){if(E.driveId){let D=N.select().from(f.drives).where(VE(f.drives.id,E.driveId)).get();if(!D||E.orgId&&D.orgId!==E.orgId)throw new y(`Drive not found: ${E.driveId}`,{suggestion:E.orgId?"Check the driveId belongs to the org you are addressing":void 0});let U=bN(N,E.userId,E.driveId);if(!U)throw new y(`Drive not found: ${E.driveId}`,{suggestion:E.orgId?"Check the driveId belongs to the org you are addressing":void 0});return{orgId:D.orgId,driveId:E.driveId,role:U}}if(E.orgId){let D=N.select().from(f.drives).where(g0(VE(f.drives.orgId,E.orgId),VE(f.drives.isDefault,!0))).get();if(!D)throw new y(`No default drive for org: ${E.orgId}`);let U=bN(N,E.userId,D.id);if(!U)throw new y(`No default drive for org: ${E.orgId}`);return{orgId:E.orgId,driveId:D.id,role:U}}let T=N.select({orgId:f.orgMembers.orgId}).from(f.orgMembers).innerJoin(f.orgs,VE(f.orgMembers.orgId,f.orgs.id)).where(g0(VE(f.orgMembers.userId,E.userId),VE(f.orgs.isPersonal,!0))).get();if(!T)throw Error("No personal org found for user");let w=N.select().from(f.drives).where(g0(VE(f.drives.orgId,T.orgId),VE(f.drives.isDefault,!0))).get();if(!w)throw Error("No default drive found");let $=bN(N,E.userId,w.id);if(!$)throw Error("You do not have access to your default drive");return{orgId:T.orgId,driveId:w.id,role:$}}var H1=Z(()=>{a();QN();lT()});function aT(N){let E=b();if(E.auth.apiKey){if(pN(N,E.auth.apiKey))return{apiKey:E.auth.apiKey}}console.error("[agent-fs] No local user found, creating one...");let T=cN(N,{email:"local@agent-fs.local"});return i("auth.apiKey",T.apiKey),console.error("[agent-fs] Local user created automatically."),{apiKey:T.apiKey}}var O1=Z(()=>{OE();z0()});var F1=Z(()=>{z0();j0();K0();lT();H1();O1()});var K1;var P1=Z(()=>{K1={name:"agent-fs",version:"0.13.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.2.0",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 PN;var q0=Z(()=>{P1();PN=K1.version});var z1={};oE(z1,{LocalEmbeddingProvider:()=>j1});import{join as vZ}from"path";import{mkdirSync as iZ,existsSync as yZ}from"fs";class j1{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:N,resolveModelFile:E}=await import("node-llama-cpp");this.llama=await N();let T=vZ(fN(),"models");if(!yZ(T))iZ(T,{recursive:!0});console.error("[agent-fs] Resolving local embedding model...");let w=await E(uZ,T);console.error("[agent-fs] Model ready:",w),this.model=await this.llama.loadModel({modelPath:w}),this.embeddingContext=await this.model.createEmbeddingContext()}async embed(N){await this.init();let E=await this.embeddingContext.getEmbeddingFor(N);return Array.from(E.vector)}async embedBatch(N){await this.init();let E=[];for(let T of N){let w=await this.embeddingContext.getEmbeddingFor(T);E.push(Array.from(w.vector))}return E}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 uZ="hf:nomic-ai/nomic-embed-text-v1.5-GGUF:Q8_0";var g1=Z(()=>{OE()});var v0={};oE(v0,{OpenAIEmbeddingProvider:()=>q1});import kZ from"openai";class q1{name="openai";dimensions=768;client;constructor(N){this.client=new kZ({apiKey:N})}async embed(N){return(await this.client.embeddings.create({model:"text-embedding-3-small",input:N,dimensions:768})).data[0].embedding}async embedBatch(N){return(await this.client.embeddings.create({model:"text-embedding-3-small",input:N,dimensions:768})).data.sort((T,w)=>T.index-w.index).map((T)=>T.embedding)}}var i0=()=>{};var y0={};oE(y0,{GeminiEmbeddingProvider:()=>v1});import{GoogleGenAI as hZ}from"@google/genai";class v1{name="gemini";dimensions=768;client;constructor(N){this.client=new hZ({apiKey:N})}async embed(N){return(await this.client.models.embedContent({model:"gemini-embedding-001",contents:N,config:{outputDimensionality:768}})).embeddings[0].values}async embedBatch(N){let E=[];for(let T of N){let w=await this.client.models.embedContent({model:"gemini-embedding-001",contents:T,config:{outputDimensionality:768}});E.push(w.embeddings[0].values)}return E}}var u0=()=>{};async function i1(N){switch(N.provider){case"local":{let{LocalEmbeddingProvider:E}=await Promise.resolve().then(() => (g1(),z1));return new E}case"openai":{if(!N.apiKey)throw Error("OpenAI API key required. Set embedding.apiKey in config.");let{OpenAIEmbeddingProvider:E}=await Promise.resolve().then(() => (i0(),v0));return new E(N.apiKey)}case"gemini":{if(!N.apiKey)throw Error("Gemini API key required. Set embedding.apiKey in config.");let{GeminiEmbeddingProvider:E}=await Promise.resolve().then(() => (u0(),y0));return new E(N.apiKey)}default:throw Error(`Unknown embedding provider: ${N.provider}`)}}async function QT(N){if(process.env.OPENAI_API_KEY)try{let{OpenAIEmbeddingProvider:E}=await Promise.resolve().then(() => (i0(),v0));return new E(process.env.OPENAI_API_KEY)}catch(E){console.error("[agent-fs] Failed to load OpenAI provider:",E)}if(process.env.GEMINI_API_KEY)try{let{GeminiEmbeddingProvider:E}=await Promise.resolve().then(() => (u0(),y0));return new E(process.env.GEMINI_API_KEY)}catch(E){console.error("[agent-fs] Failed to load Gemini provider:",E)}if(N?.provider&&N.provider!=="local"&&N.apiKey)try{return await i1(N)}catch(E){console.error("[agent-fs] Failed to create embedding provider from config:",E)}if(N?.provider==="local")try{return await i1(N)}catch(E){console.error("[agent-fs] Failed to load local embedding provider:",E)}return null}var u1,y1,k1=(N)=>typeof N==="string"?{...y1,name:N}:{...y1,...N};var mw=Z(()=>{u1=Symbol("Let zodToJsonSchema decide on which parser to use"),y1={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 h1=(N)=>{let E=k1(N),T=E.name!==void 0?[...E.basePath,E.definitionPath,E.name]:E.basePath;return{...E,flags:{hasReferencedOpenAiAnyType:!1},currentPath:T,propertyPath:void 0,seen:new Map(Object.entries(E.definitions).map(([w,$])=>[$._def,{def:$._def,path:[...E.basePath,E.definitionPath,w],jsonSchema:void 0}]))}};var k0=Z(()=>{mw()});function h0(N,E,T,w){if(!w?.errorMessages)return;if(T)N.errorMessage={...N.errorMessage,[E]:T}}function l(N,E,T,w,$){N[E]=T,h0(N,E,w,$)}var dw=(N,E)=>{let T=0;for(;T<N.length&&T<E.length;T++)if(N[T]!==E[T])break;return[(N.length-T).toString(),...E.slice(T)].join("/")};function wN(N){if(N.target!=="openAi")return{};let E=[...N.basePath,N.definitionPath,N.openAiAnyTypeName];return N.flags.hasReferencedOpenAiAnyType=!0,{$ref:N.$refStrategy==="relative"?dw(E,N.currentPath):E.join("/")}}var uN=()=>{};import{ZodFirstPartyTypeKind as xZ}from"zod/v3";function x1(N,E){let T={type:"array"};if(N.type?._def&&N.type?._def?.typeName!==xZ.ZodAny)T.items=K(N.type._def,{...E,currentPath:[...E.currentPath,"items"]});if(N.minLength)l(T,"minItems",N.minLength.value,N.minLength.message,E);if(N.maxLength)l(T,"maxItems",N.maxLength.value,N.maxLength.message,E);if(N.exactLength)l(T,"minItems",N.exactLength.value,N.exactLength.message,E),l(T,"maxItems",N.exactLength.value,N.exactLength.message,E);return T}var x0=Z(()=>{XN()});function l1(N,E){let T={type:"integer",format:"int64"};if(!N.checks)return T;for(let w of N.checks)switch(w.kind){case"min":if(E.target==="jsonSchema7")if(w.inclusive)l(T,"minimum",w.value,w.message,E);else l(T,"exclusiveMinimum",w.value,w.message,E);else{if(!w.inclusive)T.exclusiveMinimum=!0;l(T,"minimum",w.value,w.message,E)}break;case"max":if(E.target==="jsonSchema7")if(w.inclusive)l(T,"maximum",w.value,w.message,E);else l(T,"exclusiveMaximum",w.value,w.message,E);else{if(!w.inclusive)T.exclusiveMaximum=!0;l(T,"maximum",w.value,w.message,E)}break;case"multipleOf":l(T,"multipleOf",w.value,w.message,E);break}return T}var l0=()=>{};function b1(){return{type:"boolean"}}function ow(N,E){return K(N.type._def,E)}var cw=Z(()=>{XN()});var m1=(N,E)=>{return K(N.innerType._def,E)};var b0=Z(()=>{XN()});function m0(N,E,T){let w=T??E.dateStrategy;if(Array.isArray(w))return{anyOf:w.map(($,D)=>m0(N,E,$))};switch(w){case"string":case"format:date-time":return{type:"string",format:"date-time"};case"format:date":return{type:"string",format:"date"};case"integer":return lZ(N,E)}}var lZ=(N,E)=>{let T={type:"integer",format:"unix-time"};if(E.target==="openApi3")return T;for(let w of N.checks)switch(w.kind){case"min":l(T,"minimum",w.value,w.message,E);break;case"max":l(T,"maximum",w.value,w.message,E);break}return T};var d0=()=>{};function d1(N,E){return{...K(N.innerType._def,E),default:N.defaultValue()}}var o0=Z(()=>{XN()});function o1(N,E){return E.effectStrategy==="input"?K(N.schema._def,E):wN(E)}var c0=Z(()=>{XN();uN()});function c1(N){return{type:"string",enum:Array.from(N.values)}}function p1(N,E){let T=[K(N.left._def,{...E,currentPath:[...E.currentPath,"allOf","0"]}),K(N.right._def,{...E,currentPath:[...E.currentPath,"allOf","1"]})].filter((D)=>!!D),w=E.target==="jsonSchema2019-09"?{unevaluatedProperties:!1}:void 0,$=[];return T.forEach((D)=>{if(bZ(D)){if($.push(...D.allOf),D.unevaluatedProperties===void 0)w=void 0}else{let U=D;if("additionalProperties"in D&&D.additionalProperties===!1){let{additionalProperties:_,...A}=D;U=A}else w=void 0;$.push(U)}}),$.length?{allOf:$,...w}:void 0}var bZ=(N)=>{if("type"in N&&N.type==="string")return!1;return"allOf"in N};var p0=Z(()=>{XN()});function t1(N,E){let T=typeof N.value;if(T!=="bigint"&&T!=="number"&&T!=="boolean"&&T!=="string")return{type:Array.isArray(N.value)?"array":"object"};if(E.target==="openApi3")return{type:T==="bigint"?"integer":T,enum:[N.value]};return{type:T==="bigint"?"integer":T,const:N.value}}function pw(N,E){let T={type:"string"};if(N.checks)for(let w of N.checks)switch(w.kind){case"min":l(T,"minLength",typeof T.minLength==="number"?Math.max(T.minLength,w.value):w.value,w.message,E);break;case"max":l(T,"maxLength",typeof T.maxLength==="number"?Math.min(T.maxLength,w.value):w.value,w.message,E);break;case"email":switch(E.emailStrategy){case"format:email":rN(T,"email",w.message,E);break;case"format:idn-email":rN(T,"idn-email",w.message,E);break;case"pattern:zod":HN(T,tN.email,w.message,E);break}break;case"url":rN(T,"uri",w.message,E);break;case"uuid":rN(T,"uuid",w.message,E);break;case"regex":HN(T,w.regex,w.message,E);break;case"cuid":HN(T,tN.cuid,w.message,E);break;case"cuid2":HN(T,tN.cuid2,w.message,E);break;case"startsWith":HN(T,RegExp(`^${r0(w.value,E)}`),w.message,E);break;case"endsWith":HN(T,RegExp(`${r0(w.value,E)}$`),w.message,E);break;case"datetime":rN(T,"date-time",w.message,E);break;case"date":rN(T,"date",w.message,E);break;case"time":rN(T,"time",w.message,E);break;case"duration":rN(T,"duration",w.message,E);break;case"length":l(T,"minLength",typeof T.minLength==="number"?Math.max(T.minLength,w.value):w.value,w.message,E),l(T,"maxLength",typeof T.maxLength==="number"?Math.min(T.maxLength,w.value):w.value,w.message,E);break;case"includes":{HN(T,RegExp(r0(w.value,E)),w.message,E);break}case"ip":{if(w.version!=="v6")rN(T,"ipv4",w.message,E);if(w.version!=="v4")rN(T,"ipv6",w.message,E);break}case"base64url":HN(T,tN.base64url,w.message,E);break;case"jwt":HN(T,tN.jwt,w.message,E);break;case"cidr":{if(w.version!=="v6")HN(T,tN.ipv4Cidr,w.message,E);if(w.version!=="v4")HN(T,tN.ipv6Cidr,w.message,E);break}case"emoji":HN(T,tN.emoji(),w.message,E);break;case"ulid":{HN(T,tN.ulid,w.message,E);break}case"base64":{switch(E.base64Strategy){case"format:binary":{rN(T,"binary",w.message,E);break}case"contentEncoding:base64":{l(T,"contentEncoding","base64",w.message,E);break}case"pattern:zod":{HN(T,tN.base64,w.message,E);break}}break}case"nanoid":HN(T,tN.nanoid,w.message,E);case"toLowerCase":case"toUpperCase":case"trim":break;default:(($)=>{})(w)}return T}function r0(N,E){return E.patternStrategy==="escape"?dZ(N):N}function dZ(N){let E="";for(let T=0;T<N.length;T++){if(!mZ.has(N[T]))E+="\\";E+=N[T]}return E}function rN(N,E,T,w){if(N.format||N.anyOf?.some(($)=>$.format)){if(!N.anyOf)N.anyOf=[];if(N.format){if(N.anyOf.push({format:N.format,...N.errorMessage&&w.errorMessages&&{errorMessage:{format:N.errorMessage.format}}}),delete N.format,N.errorMessage){if(delete N.errorMessage.format,Object.keys(N.errorMessage).length===0)delete N.errorMessage}}N.anyOf.push({format:E,...T&&w.errorMessages&&{errorMessage:{format:T}}})}else l(N,"format",E,T,w)}function HN(N,E,T,w){if(N.pattern||N.allOf?.some(($)=>$.pattern)){if(!N.allOf)N.allOf=[];if(N.pattern){if(N.allOf.push({pattern:N.pattern,...N.errorMessage&&w.errorMessages&&{errorMessage:{pattern:N.errorMessage.pattern}}}),delete N.pattern,N.errorMessage){if(delete N.errorMessage.pattern,Object.keys(N.errorMessage).length===0)delete N.errorMessage}}N.allOf.push({pattern:r1(E,w),...T&&w.errorMessages&&{errorMessage:{pattern:T}}})}else l(N,"pattern",r1(E,w),T,w)}function r1(N,E){if(!E.applyRegexFlags||!N.flags)return N.source;let T={i:N.flags.includes("i"),m:N.flags.includes("m"),s:N.flags.includes("s")},w=T.i?N.source.toLowerCase():N.source,$="",D=!1,U=!1,_=!1;for(let A=0;A<w.length;A++){if(D){$+=w[A],D=!1;continue}if(T.i){if(U){if(w[A].match(/[a-z]/)){if(_)$+=w[A],$+=`${w[A-2]}-${w[A]}`.toUpperCase(),_=!1;else if(w[A+1]==="-"&&w[A+2]?.match(/[a-z]/))$+=w[A],_=!0;else $+=`${w[A]}${w[A].toUpperCase()}`;continue}}else if(w[A].match(/[a-z]/)){$+=`[${w[A]}${w[A].toUpperCase()}]`;continue}}if(T.m){if(w[A]==="^"){$+=`(^|(?<=[\r
|
|
175
175
|
]))`;continue}else if(w[A]==="$"){$+=`($|(?=[\r
|
|
176
176
|
]))`;continue}}if(T.s&&w[A]==="."){$+=U?`${w[A]}\r
|
|
177
177
|
`:`[${w[A]}\r
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.
|
|
2
|
+
"version": "0.13.0",
|
|
3
3
|
"binaries": {
|
|
4
|
-
"linux-x64": "sha256:
|
|
5
|
-
"linux-arm64": "sha256:
|
|
4
|
+
"linux-x64": "sha256:06b47bd7b7da104648d29cf6b1365f0c606395cea85aa01ce7f1df0c660e9668",
|
|
5
|
+
"linux-arm64": "sha256:28d8419bcfa992bdb2e27d180d68c9114f44f49e0b1ae0454c32b9bdda1de8cd"
|
|
6
6
|
}
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@desplega.ai/agent-fs",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.0",
|
|
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.
|
|
40
|
-
"@desplega.ai/agent-fs-fuse-linux-arm64": "^0.
|
|
39
|
+
"@desplega.ai/agent-fs-fuse-linux-x64": "^0.13.0",
|
|
40
|
+
"@desplega.ai/agent-fs-fuse-linux-arm64": "^0.13.0"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
43
|
"@aws-sdk/client-s3": "^3.750.0",
|