@desplega.ai/agent-fs 0.6.1 → 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
- var yN=Object.create;var{getPrototypeOf:lN,defineProperty:Xo,getOwnPropertyNames:_N}=Object;var wN=Object.prototype.hasOwnProperty;function gN(t){return this[t]}var LN,DN,tt=(t,n,o)=>{var i=t!=null&&typeof t==="object";if(i){var e=n?LN??=new WeakMap:DN??=new WeakMap,r=e.get(t);if(r)return r}o=t!=null?yN(lN(t)):{};let E=n||!t||!t.__esModule?Xo(o,"default",{value:t,enumerable:!0}):o;for(let u of _N(t))if(!wN.call(E,u))Xo(E,u,{get:gN.bind(t,u),enumerable:!0});if(i)e.set(t,E);return E};var q=(t,n)=>()=>(n||t((n={exports:{}}).exports,n),n.exports);var ON=(t)=>t;function IN(t,n){this[t]=ON.bind(null,n)}var mt=(t,n)=>{for(var o in n)Xo(t,o,{get:n[o],enumerable:!0,configurable:!0,set:IN.bind(n,o)})};var A=(t,n)=>()=>(t&&(n=t(t=0)),n);var Yn=import.meta.require;import{Database as UN}from"bun:sqlite";import{platform as SN}from"os";import{existsSync as $N}from"fs";function XN(){if($e)return;if($e=!0,SN()!=="darwin")return;let t=["/opt/homebrew/opt/sqlite/lib/libsqlite3.dylib","/usr/local/opt/sqlite3/lib/libsqlite3.dylib"];for(let n of t)if($N(n)){try{UN.setCustomSQLite(n)}catch{}return}console.warn(`Warning: Could not find Homebrew SQLite. Extension loading may fail on macOS.
4
- Install with: brew install sqlite`)}var $e=!1;var Xe=A(()=>{XN()});import{mkdirSync as CN,readFileSync as PN,writeFileSync as Po,existsSync as Pe}from"fs";import{join as Gn}from"path";function vN(){let t=process.env.AGENT_FS_HOME??Gn(process.env.HOME??"/tmp",".agent-fs");if(t.startsWith("~/"))return Gn(process.env.HOME??"/tmp",t.slice(2));return t}function W(){return vN()}function ut(){return Gn(W(),"config.json")}function Yt(){return Gn(W(),"agent-fs.db")}function MN(){let t=W();if(!Pe(t))CN(t,{recursive:!0})}function FN(t,n){let o={...t};for(let i of Object.keys(n))if(n[i]&&typeof n[i]==="object"&&!Array.isArray(n[i]))o[i]={...t[i],...n[i]};else if(n[i]!==void 0)o[i]=n[i];return o}function Ce(t){let n=process.env;if(n.AWS_ENDPOINT_URL_S3||n.S3_ENDPOINT)t.s3.endpoint=n.AWS_ENDPOINT_URL_S3||n.S3_ENDPOINT;if(n.AWS_ACCESS_KEY_ID||n.S3_ACCESS_KEY_ID)t.s3.accessKeyId=n.AWS_ACCESS_KEY_ID||n.S3_ACCESS_KEY_ID;if(n.AWS_SECRET_ACCESS_KEY||n.S3_SECRET_ACCESS_KEY)t.s3.secretAccessKey=n.AWS_SECRET_ACCESS_KEY||n.S3_SECRET_ACCESS_KEY;if(n.BUCKET_NAME||n.S3_BUCKET)t.s3.bucket=n.BUCKET_NAME||n.S3_BUCKET;if(n.AWS_REGION||n.S3_REGION)t.s3.region=n.AWS_REGION||n.S3_REGION;if(n.S3_PROVIDER)t.s3.provider=n.S3_PROVIDER;if(n.S3_PUBLIC_ENDPOINT)t.s3.publicEndpoint=n.S3_PUBLIC_ENDPOINT;if(n.SERVER_PORT||n.PORT)t.server.port=parseInt(n.SERVER_PORT||n.PORT,10);if(n.SERVER_HOST||n.HOST)t.server.host=n.SERVER_HOST||n.HOST;if(n.EMBEDDING_PROVIDER)t.embedding.provider=n.EMBEDDING_PROVIDER;if(n.EMBEDDING_MODEL)t.embedding.model=n.EMBEDDING_MODEL;if(n.EMBEDDING_API_KEY)t.embedding.apiKey=n.EMBEDDING_API_KEY;if(n.AGENT_FS_RATE_LIMIT){if(!t.server.rateLimit)t.server.rateLimit={requestsPerMinute:1200};t.server.rateLimit.requestsPerMinute=parseInt(n.AGENT_FS_RATE_LIMIT,10)}if(n.AGENT_FS_APP_URL)t.appUrl=n.AGENT_FS_APP_URL;return t}function C(){MN();let t=ut();if(!Pe(t))return Po(t,JSON.stringify(Co,null,2)),Ce(structuredClone(Co));let n=PN(t,"utf-8"),o=JSON.parse(n);return Ce(FN(Co,o))}function ve(t,n){let o=C();o[t]=n,Po(ut(),JSON.stringify(o,null,2))}function D(t,n){let o=C(),i=t.split("."),e=o;for(let r=0;r<i.length-1;r++)e=e[i[r]];e[i[i.length-1]]=n,Po(ut(),JSON.stringify(o,null,2))}var Co;var Nn=A(()=>{Co={s3:{provider:"minio",bucket:"agentfs",region:"us-east-1",endpoint:"http://localhost:9000",accessKeyId:"",secretAccessKey:""},embedding:{provider:"local",model:"",apiKey:""},server:{port:7433,host:"127.0.0.1",cors:{origins:["*"]},rateLimit:{requestsPerMinute:1200}},auth:{apiKey:""},minio:{containerId:"",managed:!0}}});var f={};mt(f,{users:()=>Rn,orgs:()=>An,orgMembers:()=>GN,files:()=>HN,fileVersions:()=>QN,events:()=>BN,drives:()=>Zn,driveMembers:()=>ZN,contentChunks:()=>WN,comments:()=>JN});import{sqliteTable as Tt,text as w,integer as M,primaryKey as vo,uniqueIndex as YN}from"drizzle-orm/sqlite-core";var Rn,An,GN,Zn,ZN,HN,QN,JN,BN,WN;var Me=A(()=>{Rn=Tt("users",{id:w("id").primaryKey(),email:w("email").notNull().unique(),apiKeyHash:w("api_key_hash").notNull(),createdAt:M("created_at",{mode:"timestamp"}).notNull()}),An=Tt("orgs",{id:w("id").primaryKey(),name:w("name").notNull(),isPersonal:M("is_personal",{mode:"boolean"}).notNull().default(!1),createdAt:M("created_at",{mode:"timestamp"}).notNull()}),GN=Tt("org_members",{orgId:w("org_id").notNull().references(()=>An.id),userId:w("user_id").notNull().references(()=>Rn.id),role:w("role",{enum:["viewer","editor","admin"]}).notNull()},(t)=>({pk:vo({columns:[t.orgId,t.userId]})})),Zn=Tt("drives",{id:w("id").primaryKey(),orgId:w("org_id").notNull().references(()=>An.id),name:w("name").notNull(),isDefault:M("is_default",{mode:"boolean"}).notNull().default(!1),createdAt:M("created_at",{mode:"timestamp"}).notNull()}),ZN=Tt("drive_members",{driveId:w("drive_id").notNull().references(()=>Zn.id),userId:w("user_id").notNull().references(()=>Rn.id),role:w("role",{enum:["viewer","editor","admin"]}).notNull()},(t)=>({pk:vo({columns:[t.driveId,t.userId]})})),HN=Tt("files",{path:w("path").notNull(),driveId:w("drive_id").notNull().references(()=>Zn.id),size:M("size").notNull(),contentType:w("content_type"),author:w("author").notNull(),currentVersionId:w("current_version_id"),createdAt:M("created_at",{mode:"timestamp"}).notNull(),modifiedAt:M("modified_at",{mode:"timestamp"}).notNull(),isDeleted:M("is_deleted",{mode:"boolean"}).notNull().default(!1),embeddingStatus:w("embedding_status",{enum:["pending","indexed","failed"]}).default("pending")},(t)=>({pk:vo({columns:[t.path,t.driveId]})})),QN=Tt("file_versions",{id:M("id").primaryKey({autoIncrement:!0}),path:w("path").notNull(),driveId:w("drive_id").notNull(),version:M("version").notNull(),s3VersionId:w("s3_version_id").notNull(),author:w("author").notNull(),operation:w("operation",{enum:["write","edit","append","delete","revert"]}).notNull(),message:w("message"),diffSummary:w("diff_summary"),size:M("size"),etag:w("etag"),contentHash:w("content_hash"),createdAt:M("created_at",{mode:"timestamp"}).notNull()},(t)=>({pathDriveVersionUq:YN("file_versions_path_drive_version_uq").on(t.path,t.driveId,t.version)})),JN=Tt("comments",{id:w("id").primaryKey(),parentId:w("parent_id"),orgId:w("org_id").notNull().references(()=>An.id),driveId:w("drive_id").notNull().references(()=>Zn.id),path:w("path").notNull(),lineStart:M("line_start"),lineEnd:M("line_end"),quotedContent:w("quoted_content"),fileVersionId:M("file_version_id"),body:w("body").notNull(),author:w("author").notNull().references(()=>Rn.id),resolved:M("resolved",{mode:"boolean"}).notNull().default(!1),resolvedBy:w("resolved_by"),resolvedAt:M("resolved_at",{mode:"timestamp"}),createdAt:M("created_at",{mode:"timestamp"}).notNull(),updatedAt:M("updated_at",{mode:"timestamp"}).notNull(),isDeleted:M("is_deleted",{mode:"boolean"}).notNull().default(!1)}),BN=Tt("events",{id:w("id").primaryKey(),orgId:w("org_id").notNull().references(()=>An.id),type:w("type").notNull(),resourceType:w("resource_type").notNull(),resourceId:w("resource_id").notNull(),actor:w("actor").notNull().references(()=>Rn.id),target:w("target"),status:w("status",{enum:["created","ack","deleted"]}).notNull().default("created"),metadata:w("metadata"),createdAt:M("created_at",{mode:"timestamp"}).notNull()}),WN=Tt("content_chunks",{id:M("id").primaryKey({autoIncrement:!0}),filePath:w("file_path").notNull(),driveId:w("drive_id").notNull(),chunkIndex:M("chunk_index").notNull(),content:w("content").notNull(),charOffset:M("char_offset").notNull(),tokenCount:M("token_count").notNull()})});var Fe=`
3
+ var Sl=Object.create;var{getPrototypeOf:$l,defineProperty:Fo,getOwnPropertyNames:Xl}=Object;var Cl=Object.prototype.hasOwnProperty;function Pl(t){return this[t]}var Ml,Fl,ot=(t,n,o)=>{var i=t!=null&&typeof t==="object";if(i){var e=n?Ml??=new WeakMap:Fl??=new WeakMap,r=e.get(t);if(r)return r}o=t!=null?Sl($l(t)):{};let E=n||!t||!t.__esModule?Fo(o,"default",{value:t,enumerable:!0}):o;for(let f of Xl(t))if(!Cl.call(E,f))Fo(E,f,{get:Pl.bind(t,f),enumerable:!0});if(i)e.set(t,E);return E};var s=(t,n)=>()=>(n||t((n={exports:{}}).exports,n),n.exports);var vl=(t)=>t;function Yl(t,n){this[t]=vl.bind(null,n)}var bt=(t,n)=>{for(var o in n)Fo(t,o,{get:n[o],enumerable:!0,configurable:!0,set:Yl.bind(n,o)})};var R=(t,n)=>()=>(t&&(n=t(t=0)),n);var Vn=import.meta.require;import{Database as Gl}from"bun:sqlite";import{platform as Hl}from"os";import{existsSync as Zl}from"fs";function Ql(){if(Ge)return;if(Ge=!0,Hl()!=="darwin")return;let t=["/opt/homebrew/opt/sqlite/lib/libsqlite3.dylib","/usr/local/opt/sqlite3/lib/libsqlite3.dylib"];for(let n of t)if(Zl(n)){try{Gl.setCustomSQLite(n)}catch{}return}console.warn(`Warning: Could not find Homebrew SQLite. Extension loading may fail on macOS.
4
+ Install with: brew install sqlite`)}var Ge=!1;var He=R(()=>{Ql()});import{mkdirSync as Jl,readFileSync as Bl,writeFileSync as Yo,existsSync as Qe}from"fs";import{join as Wn}from"path";function Vl(){let t=process.env.AGENT_FS_HOME??Wn(process.env.HOME??"/tmp",".agent-fs");if(t.startsWith("~/"))return Wn(process.env.HOME??"/tmp",t.slice(2));return t}function V(){return Vl()}function x(){return Wn(V(),"config.json")}function Ht(){return Wn(V(),"agent-fs.db")}function Wl(){let t=V();if(!Qe(t))Jl(t,{recursive:!0})}function Kl(t,n){let o={...t};for(let i of Object.keys(n))if(n[i]&&typeof n[i]==="object"&&!Array.isArray(n[i]))o[i]={...t[i],...n[i]};else if(n[i]!==void 0)o[i]=n[i];return o}function Ze(t){let n=process.env;if(n.AWS_ENDPOINT_URL_S3||n.S3_ENDPOINT)t.s3.endpoint=n.AWS_ENDPOINT_URL_S3||n.S3_ENDPOINT;if(n.AWS_ACCESS_KEY_ID||n.S3_ACCESS_KEY_ID)t.s3.accessKeyId=n.AWS_ACCESS_KEY_ID||n.S3_ACCESS_KEY_ID;if(n.AWS_SECRET_ACCESS_KEY||n.S3_SECRET_ACCESS_KEY)t.s3.secretAccessKey=n.AWS_SECRET_ACCESS_KEY||n.S3_SECRET_ACCESS_KEY;if(n.BUCKET_NAME||n.S3_BUCKET)t.s3.bucket=n.BUCKET_NAME||n.S3_BUCKET;if(n.AWS_REGION||n.S3_REGION)t.s3.region=n.AWS_REGION||n.S3_REGION;if(n.S3_PROVIDER)t.s3.provider=n.S3_PROVIDER;if(n.S3_PUBLIC_ENDPOINT)t.s3.publicEndpoint=n.S3_PUBLIC_ENDPOINT;if(n.SERVER_PORT||n.PORT)t.server.port=parseInt(n.SERVER_PORT||n.PORT,10);if(n.SERVER_HOST||n.HOST)t.server.host=n.SERVER_HOST||n.HOST;if(n.EMBEDDING_PROVIDER)t.embedding.provider=n.EMBEDDING_PROVIDER;if(n.EMBEDDING_MODEL)t.embedding.model=n.EMBEDDING_MODEL;if(n.EMBEDDING_API_KEY)t.embedding.apiKey=n.EMBEDDING_API_KEY;if(n.AGENT_FS_RATE_LIMIT){if(!t.server.rateLimit)t.server.rateLimit={requestsPerMinute:1200};t.server.rateLimit.requestsPerMinute=parseInt(n.AGENT_FS_RATE_LIMIT,10)}if(n.AGENT_FS_APP_URL)t.appUrl=n.AGENT_FS_APP_URL;return t}function P(){Wl();let t=x();if(!Qe(t))return Yo(t,JSON.stringify(vo,null,2)),Ze(structuredClone(vo));let n=Bl(t,"utf-8"),o=JSON.parse(n);return Ze(Kl(vo,o))}function Je(t,n){let o=P();o[t]=n,Yo(x(),JSON.stringify(o,null,2))}function U(t,n){let o=P(),i=t.split("."),e=o;for(let r=0;r<i.length-1;r++)e=e[i[r]];e[i[i.length-1]]=n,Yo(x(),JSON.stringify(o,null,2))}var vo;var wn=R(()=>{vo={s3:{provider:"minio",bucket:"agentfs",region:"us-east-1",endpoint:"http://localhost:9000",accessKeyId:"",secretAccessKey:""},embedding:{provider:"local",model:"",apiKey:""},server:{port:7433,host:"127.0.0.1",cors:{origins:["*"]},rateLimit:{requestsPerMinute:1200}},auth:{apiKey:""},minio:{containerId:"",managed:!0}}});var u={};bt(u,{users:()=>yn,orgs:()=>Ln,orgMembers:()=>hl,files:()=>kl,fileVersions:()=>dl,events:()=>zl,drives:()=>Kn,driveMembers:()=>jl,contentChunks:()=>bl,comments:()=>ml});import{sqliteTable as lt,text as y,integer as v,primaryKey as Go,uniqueIndex as pl}from"drizzle-orm/sqlite-core";var yn,Ln,hl,Kn,jl,kl,dl,ml,zl,bl;var Be=R(()=>{yn=lt("users",{id:y("id").primaryKey(),email:y("email").notNull().unique(),apiKeyHash:y("api_key_hash").notNull(),createdAt:v("created_at",{mode:"timestamp"}).notNull()}),Ln=lt("orgs",{id:y("id").primaryKey(),name:y("name").notNull(),isPersonal:v("is_personal",{mode:"boolean"}).notNull().default(!1),createdAt:v("created_at",{mode:"timestamp"}).notNull()}),hl=lt("org_members",{orgId:y("org_id").notNull().references(()=>Ln.id),userId:y("user_id").notNull().references(()=>yn.id),role:y("role",{enum:["viewer","editor","admin"]}).notNull()},(t)=>({pk:Go({columns:[t.orgId,t.userId]})})),Kn=lt("drives",{id:y("id").primaryKey(),orgId:y("org_id").notNull().references(()=>Ln.id),name:y("name").notNull(),isDefault:v("is_default",{mode:"boolean"}).notNull().default(!1),createdAt:v("created_at",{mode:"timestamp"}).notNull()}),jl=lt("drive_members",{driveId:y("drive_id").notNull().references(()=>Kn.id),userId:y("user_id").notNull().references(()=>yn.id),role:y("role",{enum:["viewer","editor","admin"]}).notNull()},(t)=>({pk:Go({columns:[t.driveId,t.userId]})})),kl=lt("files",{path:y("path").notNull(),driveId:y("drive_id").notNull().references(()=>Kn.id),size:v("size").notNull(),contentType:y("content_type"),author:y("author").notNull(),currentVersionId:y("current_version_id"),createdAt:v("created_at",{mode:"timestamp"}).notNull(),modifiedAt:v("modified_at",{mode:"timestamp"}).notNull(),isDeleted:v("is_deleted",{mode:"boolean"}).notNull().default(!1),embeddingStatus:y("embedding_status",{enum:["pending","indexed","failed"]}).default("pending")},(t)=>({pk:Go({columns:[t.path,t.driveId]})})),dl=lt("file_versions",{id:v("id").primaryKey({autoIncrement:!0}),path:y("path").notNull(),driveId:y("drive_id").notNull(),version:v("version").notNull(),s3VersionId:y("s3_version_id").notNull(),author:y("author").notNull(),operation:y("operation",{enum:["write","edit","append","delete","revert"]}).notNull(),message:y("message"),diffSummary:y("diff_summary"),size:v("size"),etag:y("etag"),contentHash:y("content_hash"),createdAt:v("created_at",{mode:"timestamp"}).notNull()},(t)=>({pathDriveVersionUq:pl("file_versions_path_drive_version_uq").on(t.path,t.driveId,t.version)})),ml=lt("comments",{id:y("id").primaryKey(),parentId:y("parent_id"),orgId:y("org_id").notNull().references(()=>Ln.id),driveId:y("drive_id").notNull().references(()=>Kn.id),path:y("path").notNull(),lineStart:v("line_start"),lineEnd:v("line_end"),quotedContent:y("quoted_content"),fileVersionId:v("file_version_id"),body:y("body").notNull(),author:y("author").notNull().references(()=>yn.id),resolved:v("resolved",{mode:"boolean"}).notNull().default(!1),resolvedBy:y("resolved_by"),resolvedAt:v("resolved_at",{mode:"timestamp"}),createdAt:v("created_at",{mode:"timestamp"}).notNull(),updatedAt:v("updated_at",{mode:"timestamp"}).notNull(),isDeleted:v("is_deleted",{mode:"boolean"}).notNull().default(!1)}),zl=lt("events",{id:y("id").primaryKey(),orgId:y("org_id").notNull().references(()=>Ln.id),type:y("type").notNull(),resourceType:y("resource_type").notNull(),resourceId:y("resource_id").notNull(),actor:y("actor").notNull().references(()=>yn.id),target:y("target"),status:y("status",{enum:["created","ack","deleted"]}).notNull().default("created"),metadata:y("metadata"),createdAt:v("created_at",{mode:"timestamp"}).notNull()}),bl=lt("content_chunks",{id:v("id").primaryKey({autoIncrement:!0}),filePath:y("file_path").notNull(),driveId:y("drive_id").notNull(),chunkIndex:v("chunk_index").notNull(),content:y("content").notNull(),charOffset:v("char_offset").notNull(),tokenCount:v("token_count").notNull()})});var Ve=`
5
5
  CREATE TABLE IF NOT EXISTS users (
6
6
  id TEXT PRIMARY KEY,
7
7
  email TEXT NOT NULL UNIQUE,
@@ -120,7 +120,7 @@ CREATE TABLE IF NOT EXISTS content_chunks (
120
120
  char_offset INTEGER NOT NULL,
121
121
  token_count INTEGER NOT NULL
122
122
  );
123
- `,Ye=`
123
+ `,We=`
124
124
  -- FTS5 full-text index (internal content storage)
125
125
  CREATE VIRTUAL TABLE IF NOT EXISTS files_fts USING fts5(
126
126
  path, content, drive_id UNINDEXED
@@ -131,18 +131,18 @@ CREATE VIRTUAL TABLE IF NOT EXISTS chunk_vectors USING vec0(
131
131
  chunk_id INTEGER PRIMARY KEY,
132
132
  embedding float[768]
133
133
  );
134
- `;function Ge(t){if(!t.prepare("PRAGMA table_info(file_versions)").all().some((i)=>i.name==="content_hash"))t.exec("ALTER TABLE file_versions ADD COLUMN content_hash TEXT");t.exec("CREATE UNIQUE INDEX IF NOT EXISTS file_versions_path_drive_version_uq ON file_versions(path, drive_id, version)")}import{Database as VN}from"bun:sqlite";import{drizzle as KN}from"drizzle-orm/bun-sqlite";import*as Ze from"sqlite-vec";import{existsSync as pN,mkdirSync as jN}from"fs";import{dirname as hN}from"path";function kN(t){Ze.load(t)}function Ut(t){let n=t??Yt(),o=hN(n);if(!pN(o))jN(o,{recursive:!0});let i=new VN(n);return kN(i),i.exec("PRAGMA journal_mode=WAL;"),i.exec("PRAGMA foreign_keys=ON;"),i.exec(Fe),i.exec(Ye),Ge(i),KN(i,{schema:f})}var H=A(()=>{Xe();Nn();Me()});var Mo=q((mN)=>{var He=(t)=>encodeURIComponent(t).replace(/[!'()*]/g,zN),zN=(t)=>`%${t.charCodeAt(0).toString(16).toUpperCase()}`,dN=(t)=>t.split("/").map(He).join("/");mN.escapeUri=He;mN.escapeUriPath=dN});var Qe=q((cN)=>{var Fo=Mo();function sN(t){let n=[];for(let o of Object.keys(t).sort()){let i=t[o];if(o=Fo.escapeUri(o),Array.isArray(i))for(let e=0,r=i.length;e<r;e++)n.push(`${o}=${Fo.escapeUri(i[e])}`);else{let e=o;if(i||typeof i==="string")e+=`=${Fo.escapeUri(i)}`;n.push(e)}}return n.join("&")}cN.buildQueryString=sN});function Be(t){let{port:n,query:o}=t,{protocol:i,path:e,hostname:r}=t;if(i&&i.slice(-1)!==":")i+=":";if(n)r+=`:${n}`;if(e&&e.charAt(0)!=="/")e=`/${e}`;let E=o?Je.buildQueryString(o):"";if(E&&E[0]!=="?")E=`?${E}`;let u="";if(t.username!=null||t.password!=null){let N=t.username??"",R=t.password??"";u=`${N}:${R}@`}let T="";if(t.fragment)T=`#${t.fragment}`;return`${i}//${u}${r}${e}${E}${T}`}var Je;var We=A(()=>{Je=tt(Qe(),1)});var Ve=async(t)=>{let n=t?.Bucket||"";if(typeof t.Bucket==="string")t.Bucket=n.replace(/#/g,encodeURIComponent("#")).replace(/\?/g,encodeURIComponent("?"));if(iR(n)){if(t.ForcePathStyle===!0)throw Error("Path-style addressing cannot be used with ARN buckets")}else if(!oR(n)||n.indexOf(".")!==-1&&!String(t.Endpoint).startsWith("http:")||n.toLowerCase()!==n||n.length<3)t.ForcePathStyle=!0;if(t.DisableMultiRegionAccessPoints)t.disableMultiRegionAccessPoints=!0,t.DisableMRAP=!0;return t},aN,tR,nR,oR=(t)=>aN.test(t)&&!tR.test(t)&&!nR.test(t),iR=(t)=>{let[n,o,i,,,e]=t.split(":"),r=n==="arn"&&t.split(":").length>=6,E=Boolean(r&&o&&i&&e);if(r&&!E)throw Error(`Invalid ARN: ${t} was an invalid ARN.`);return E};var Ke=A(()=>{aN=/^[a-z0-9][a-z0-9\.\-]{1,61}[a-z0-9]$/,tR=/(\d+\.){3}\d+/,nR=/\.\./});var pe=A(()=>{Ke()});var je=(t,n,o,i=!1)=>{let e=async()=>{let r;if(i)r=o.clientContextParams?.[t]??o[t]??o[n];else r=o[t]??o[n];if(typeof r==="function")return r();return r};if(t==="credentialScope"||n==="CredentialScope")return async()=>{let r=typeof o.credentials==="function"?await o.credentials():o.credentials;return r?.credentialScope??r?.CredentialScope};if(t==="accountId"||n==="AccountId")return async()=>{let r=typeof o.credentials==="function"?await o.credentials():o.credentials;return r?.accountId??r?.AccountId};if(t==="endpoint"||n==="endpoint")return async()=>{if(o.isCustomEndpoint===!1)return;let r=await e();if(r&&typeof r==="object"){if("url"in r)return r.url.href;if("hostname"in r){let{protocol:E,hostname:u,port:T,path:N}=r;return`${E}//${u}${T?":"+T:""}${N}`}}return r};return e};var yn=q((fR)=>{class bt extends Error{name="ProviderError";tryNextLink;constructor(t,n=!0){let o,i=!0;if(typeof n==="boolean")o=void 0,i=n;else if(n!=null&&typeof n==="object")o=n.logger,i=n.tryNextLink??!0;super(t);this.tryNextLink=i,Object.setPrototypeOf(this,bt.prototype),o?.debug?.(`@smithy/property-provider ${i?"->":"(!)"} ${t}`)}static from(t,n=!0){return Object.assign(new this(t.message,n),t)}}class Yo extends bt{name="CredentialsProviderError";constructor(t,n=!0){super(t,n);Object.setPrototypeOf(this,Yo.prototype)}}class Go extends bt{name="TokenProviderError";constructor(t,n=!0){super(t,n);Object.setPrototypeOf(this,Go.prototype)}}var eR=(...t)=>async()=>{if(t.length===0)throw new bt("No providers in chain");let n;for(let o of t)try{return await o()}catch(i){if(n=i,i?.tryNextLink)continue;throw i}throw n},rR=(t)=>()=>Promise.resolve(t),ER=(t,n,o)=>{let i,e,r,E=!1,u=async()=>{if(!e)e=t();try{i=await e,r=!0,E=!1}finally{e=void 0}return i};if(n===void 0)return async(T)=>{if(!r||T?.forceRefresh)i=await u();return i};return async(T)=>{if(!r||T?.forceRefresh)i=await u();if(E)return i;if(o&&!o(i))return E=!0,i;if(n(i))return await u(),i;return i}};fR.CredentialsProviderError=Yo;fR.ProviderError=bt;fR.TokenProviderError=Go;fR.chain=eR;fR.fromStatic=rR;fR.memoize=ER});function Hn(t){try{let n=new Set(Array.from(t.match(/([A-Z_]){3,}/g)??[]));return n.delete("CONFIG"),n.delete("CONFIG_PREFIX_SEPARATOR"),n.delete("ENV"),[...n].join(", ")}catch(n){return t}}var he,ke=(t,n)=>async()=>{try{let o=t(process.env,n);if(o===void 0)throw Error();return o}catch(o){throw new he.CredentialsProviderError(o.message||`Not found in ENV: ${Hn(t.toString())}`,{logger:n?.logger})}};var ze=A(()=>{he=tt(yn(),1)});import{homedir as lR}from"os";import{sep as _R}from"path";var Zo,wR=()=>{if(process&&process.geteuid)return`${process.geteuid()}`;return"DEFAULT"},qt=()=>{let{HOME:t,USERPROFILE:n,HOMEPATH:o,HOMEDRIVE:i=`C:${_R}`}=process.env;if(t)return t;if(n)return n;if(o)return`${i}${o}`;let e=wR();if(!Zo[e])Zo[e]=lR();return Zo[e]};var ln=A(()=>{Zo={}});var de=(t)=>t.profile||process.env.AWS_PROFILE||"default";var me=()=>{};var wn=q((UR)=>{UR.HttpAuthLocation=void 0;(function(t){t.HEADER="header",t.QUERY="query"})(UR.HttpAuthLocation||(UR.HttpAuthLocation={}));UR.HttpApiKeyAuthLocation=void 0;(function(t){t.HEADER="header",t.QUERY="query"})(UR.HttpApiKeyAuthLocation||(UR.HttpApiKeyAuthLocation={}));UR.EndpointURLScheme=void 0;(function(t){t.HTTP="http",t.HTTPS="https"})(UR.EndpointURLScheme||(UR.EndpointURLScheme={}));UR.AlgorithmId=void 0;(function(t){t.MD5="md5",t.CRC32="crc32",t.CRC32C="crc32c",t.SHA1="sha1",t.SHA256="sha256"})(UR.AlgorithmId||(UR.AlgorithmId={}));var gR=(t)=>{let n=[];if(t.sha256!==void 0)n.push({algorithmId:()=>UR.AlgorithmId.SHA256,checksumConstructor:()=>t.sha256});if(t.md5!=null)n.push({algorithmId:()=>UR.AlgorithmId.MD5,checksumConstructor:()=>t.md5});return{addChecksumAlgorithm(o){n.push(o)},checksumAlgorithms(){return n}}},LR=(t)=>{let n={};return t.checksumAlgorithms().forEach((o)=>{n[o.algorithmId()]=o.checksumConstructor()}),n},DR=(t)=>{return gR(t)},OR=(t)=>{return LR(t)};UR.FieldPosition=void 0;(function(t){t[t.HEADER=0]="HEADER",t[t.TRAILER=1]="TRAILER"})(UR.FieldPosition||(UR.FieldPosition={}));var IR="__smithy_context";UR.IniSectionType=void 0;(function(t){t.PROFILE="profile",t.SSO_SESSION="sso-session",t.SERVICES="services"})(UR.IniSectionType||(UR.IniSectionType={}));UR.RequestHandlerProtocol=void 0;(function(t){t.HTTP_0_9="http/0.9",t.HTTP_1_0="http/1.0",t.TDS_8_0="tds/8.0"})(UR.RequestHandlerProtocol||(UR.RequestHandlerProtocol={}));UR.SMITHY_CONTEXT_KEY=IR;UR.getDefaultClientConfiguration=DR;UR.resolveDefaultRuntimeConfig=OR});var Nt=".";var Ko,be=(t)=>Object.entries(t).filter(([n])=>{let o=n.indexOf(Nt);if(o===-1)return!1;return Object.values(Ko.IniSectionType).includes(n.substring(0,o))}).reduce((n,[o,i])=>{let e=o.indexOf(Nt),r=o.substring(0,e)===Ko.IniSectionType.PROFILE?o.substring(e+1):o;return n[r]=i,n},{...t.default&&{default:t.default}});var qe=A(()=>{Ko=tt(wn(),1)});import{join as CR}from"path";var PR="AWS_CONFIG_FILE",se=()=>process.env[PR]||CR(qt(),".aws","config");var ce=A(()=>{ln()});import{join as vR}from"path";var MR="AWS_SHARED_CREDENTIALS_FILE",xe=()=>process.env[MR]||vR(qt(),".aws","credentials");var ae=A(()=>{ln()});var tr,FR,YR,po=(t)=>{let n={},o,i;for(let e of t.split(/\r?\n/)){let r=e.split(/(^|\s)[;#]/)[0].trim();if(r[0]==="["&&r[r.length-1]==="]"){o=void 0,i=void 0;let u=r.substring(1,r.length-1),T=FR.exec(u);if(T){let[,N,,R]=T;if(Object.values(tr.IniSectionType).includes(N))o=[N,R].join(Nt)}else o=u;if(YR.includes(u))throw Error(`Found invalid profile name "${u}"`)}else if(o){let u=r.indexOf("=");if(![0,-1].includes(u)){let[T,N]=[r.substring(0,u).trim(),r.substring(u+1).trim()];if(N==="")i=T;else{if(i&&e.trimStart()===e)i=void 0;n[o]=n[o]||{};let R=i?[i,T].join(Nt):T;n[o][R]=N}}}}return n};var nr=A(()=>{tr=tt(wn(),1),FR=/^([\w-]+)\s(["'])?([\w-@\+\.%:/]+)\2$/,YR=["__proto__","profile __proto__"]});import{readFile as GR}from"fs/promises";var jo,or,ho=(t,n)=>{if(or[t]!==void 0)return or[t];if(!jo[t]||n?.ignoreCache)jo[t]=GR(t,"utf8");return jo[t]};var ir=A(()=>{jo={},or={}});import{join as er}from"path";var rr=()=>({}),Er=async(t={})=>{let{filepath:n=xe(),configFilepath:o=se()}=t,i=qt(),e="~/",r=n;if(n.startsWith("~/"))r=er(i,n.slice(2));let E=o;if(o.startsWith("~/"))E=er(i,o.slice(2));let u=await Promise.all([ho(E,{ignoreCache:t.ignoreCache}).then(po).then(be).catch(rr),ho(r,{ignoreCache:t.ignoreCache}).then(po).catch(rr)]);return{configFile:u[0],credentialsFile:u[1]}};var fr=A(()=>{qe();ce();ae();ln();nr();ir()});var ur=()=>{};var Tr=()=>{};var Nr=()=>{};var ko=A(()=>{ln();me();fr();ur();Tr();Nr()});var Rr,Ar=(t,{preferredFile:n="config",...o}={})=>async()=>{let i=de(o),{configFile:e,credentialsFile:r}=await Er(o),E=r[i]||{},u=e[i]||{},T=n==="config"?{...E,...u}:{...u,...E};try{let R=t(T,n==="config"?e:r);if(R===void 0)throw Error();return R}catch(N){throw new Rr.CredentialsProviderError(N.message||`Not found in config files w/ profile [${i}]: ${Hn(t.toString())}`,{logger:o.logger})}};var yr=A(()=>{ko();Rr=tt(yn(),1)});var lr,ZR=(t)=>typeof t==="function",_r=(t)=>ZR(t)?async()=>await t():lr.fromStatic(t);var wr=A(()=>{lr=tt(yn(),1)});var Qn,gr=({environmentVariableSelector:t,configFileSelector:n,default:o},i={})=>{let{signingName:e,logger:r}=i;return Qn.memoize(Qn.chain(ke(t,{signingName:e,logger:r}),Ar(n,i),_r(o)))};var Lr=A(()=>{ze();yr();wr();Qn=tt(yn(),1)});var Dr=A(()=>{Lr()});var Or="AWS_ENDPOINT_URL",Ir="endpoint_url",Ur=(t)=>({environmentVariableSelector:(n)=>{let o=t.split(" ").map((r)=>r.toUpperCase()),i=n[[Or,...o].join("_")];if(i)return i;let e=n[Or];if(e)return e;return},configFileSelector:(n,o)=>{if(o&&n.services){let e=o[["services",n.services].join(Nt)];if(e){let r=t.split(" ").map((u)=>u.toLowerCase()),E=e[[r.join("_"),Ir].join(Nt)];if(E)return E}}let i=n[Ir];if(i)return i;return},default:void 0});var Sr=A(()=>{ko()});var $r=async(t)=>gr(Ur(t??""))();var Xr=A(()=>{Dr();Sr()});var Cr=q((QR)=>{function HR(t){let n={};if(t=t.replace(/^\?/,""),t)for(let o of t.split("&")){let[i,e=null]=o.split("=");if(i=decodeURIComponent(i),e)e=decodeURIComponent(e);if(!(i in n))n[i]=e;else if(Array.isArray(n[i]))n[i].push(e);else n[i]=[n[i],e]}return n}QR.parseQueryString=HR});var vr=q((WR)=>{var BR=Cr(),Pr=(t)=>{if(typeof t==="string")return Pr(new URL(t));let{hostname:n,pathname:o,port:i,protocol:e,search:r}=t,E;if(r)E=BR.parseQueryString(r);return{hostname:n,port:i?parseInt(i):void 0,protocol:e,path:o,query:E}};WR.parseUrl=Pr});var zo,Mr=(t)=>{if(typeof t==="object"){if("url"in t){let n=zo.parseUrl(t.url);if(t.headers){n.headers={};for(let[o,i]of Object.entries(t.headers))n.headers[o.toLowerCase()]=i.join(", ")}return n}return t}return zo.parseUrl(t)};var mo=A(()=>{zo=tt(vr(),1)});var Fr=async(t,n,o,i)=>{if(!o.isCustomEndpoint){let E;if(o.serviceConfiguredEndpoint)E=await o.serviceConfiguredEndpoint();else E=await $r(o.serviceId);if(E)o.endpoint=()=>Promise.resolve(Mr(E)),o.isCustomEndpoint=!0}let e=await KR(t,n,o);if(typeof o.endpointProvider!=="function")throw Error("config.endpointProvider is not set.");let r=o.endpointProvider(e,i);if(o.isCustomEndpoint&&o.endpoint){let E=await o.endpoint();if(E?.headers){r.headers??={};for(let[u,T]of Object.entries(E.headers))r.headers[u]=Array.isArray(T)?T:[T]}}return r},KR=async(t,n,o)=>{let i={},e=n?.getEndpointParameterInstructions?.()||{};for(let[r,E]of Object.entries(e))switch(E.type){case"staticContextParams":i[r]=E.value;break;case"contextParams":i[r]=t[E.name];break;case"clientContextParams":case"builtInParams":i[r]=await je(E.name,r,o,E.type!=="builtInParams")();break;case"operationContextParams":i[r]=E.get(t);break;default:throw Error("Unrecognized endpoint parameter instruction: "+JSON.stringify(E))}if(Object.keys(e).length===0)Object.assign(i,o);if(String(o.serviceId).toLowerCase()==="s3")await Ve(i);return i};var Yr=A(()=>{pe();Xr();mo()});var Gr=A(()=>{Yr();mo()});var Hr=q((hR)=>{var Zr=wn(),pR=(t)=>t[Zr.SMITHY_CONTEXT_KEY]||(t[Zr.SMITHY_CONTEXT_KEY]={}),jR=(t)=>{if(typeof t==="function")return t;let n=Promise.resolve(t);return()=>n};hR.getSmithyContext=pR;hR.normalizeProvider=jR});var Qr=()=>{};var bo=q((cR)=>{var dR=wn(),mR=(t)=>{return{setHttpHandler(n){t.httpHandler=n},httpHandler(){return t.httpHandler},updateHttpClientConfig(n,o){t.httpHandler?.updateHttpClientConfig(n,o)},httpHandlerConfigs(){return t.httpHandler.httpHandlerConfigs()}}},bR=(t)=>{return{httpHandler:t.httpHandler()}};class Jr{name;kind;values;constructor({name:t,kind:n=dR.FieldPosition.HEADER,values:o=[]}){this.name=t,this.kind=n,this.values=o}add(t){this.values.push(t)}set(t){this.values=t}remove(t){this.values=this.values.filter((n)=>n!==t)}toString(){return this.values.map((t)=>t.includes(",")||t.includes(" ")?`"${t}"`:t).join(", ")}get(){return this.values}}class Br{entries={};encoding;constructor({fields:t=[],encoding:n="utf-8"}){t.forEach(this.setField.bind(this)),this.encoding=n}setField(t){this.entries[t.name.toLowerCase()]=t}getField(t){return this.entries[t.toLowerCase()]}removeField(t){delete this.entries[t.toLowerCase()]}getByType(t){return Object.values(this.entries).filter((n)=>n.kind===t)}}class Jn{method;protocol;hostname;port;path;query;headers;username;password;fragment;body;constructor(t){this.method=t.method||"GET",this.hostname=t.hostname||"localhost",this.port=t.port,this.query=t.query||{},this.headers=t.headers||{},this.body=t.body,this.protocol=t.protocol?t.protocol.slice(-1)!==":"?`${t.protocol}:`:t.protocol:"https:",this.path=t.path?t.path.charAt(0)!=="/"?`/${t.path}`:t.path:"/",this.username=t.username,this.password=t.password,this.fragment=t.fragment}static clone(t){let n=new Jn({...t,headers:{...t.headers}});if(n.query)n.query=qR(n.query);return n}static isInstance(t){if(!t)return!1;let n=t;return"method"in n&&"protocol"in n&&"hostname"in n&&"path"in n&&typeof n.query==="object"&&typeof n.headers==="object"}clone(){return Jn.clone(this)}}function qR(t){return Object.keys(t).reduce((n,o)=>{let i=t[o];return{...n,[o]:Array.isArray(i)?[...i]:i}},{})}class Wr{statusCode;reason;headers;body;constructor(t){this.statusCode=t.statusCode,this.reason=t.reason,this.headers=t.headers||{},this.body=t.body}static isInstance(t){if(!t)return!1;let n=t;return typeof n.statusCode==="number"&&typeof n.headers==="object"}}function sR(t){return/^[a-z0-9][a-z0-9\.\-]*[a-z0-9]$/.test(t)}cR.Field=Jr;cR.Fields=Br;cR.HttpRequest=Jn;cR.HttpResponse=Wr;cR.getHttpHandlerExtensionConfiguration=mR;cR.isValidHostname=sR;cR.resolveHttpHandlerRuntimeConfig=bR});var Vr=()=>{};var Kr=()=>{};var pr;var jr=A(()=>{pr={name:"serializerMiddleware",step:"serialize",tags:["SERIALIZER"],override:!0}});var hr=A(()=>{Vr();jr();Kr()});var $L;var kr=A(()=>{hr();$L={step:"serialize",tags:["ENDPOINT_PARAMETERS","ENDPOINT_V2","ENDPOINT"],name:"endpointV2Middleware",override:!0,relation:"before",toMiddleware:pr.name}});var zr=()=>{};var dr=()=>{};var mr=A(()=>{Gr();Qr();kr();zr();dr()});var br=()=>{};var qr=()=>{};var sr=()=>{};var cr=()=>{};var ar=q((fA)=>{var xr={},qo={};for(let t=0;t<256;t++){let n=t.toString(16).toLowerCase();if(n.length===1)n=`0${n}`;xr[t]=n,qo[n]=t}function rA(t){if(t.length%2!==0)throw Error("Hex encoded strings must have an even number length");let n=new Uint8Array(t.length/2);for(let o=0;o<t.length;o+=2){let i=t.slice(o,o+2).toLowerCase();if(i in qo)n[o/2]=qo[i];else throw Error(`Cannot decode unrecognized sequence ${i} as hexadecimal`)}return n}function EA(t){let n="";for(let o=0;o<t.byteLength;o++)n+=xr[t[o]];return n}fA.fromHex=rA;fA.toHex=EA});var so=q((RA)=>{var NA=(t)=>typeof ArrayBuffer==="function"&&t instanceof ArrayBuffer||Object.prototype.toString.call(t)==="[object ArrayBuffer]";RA.isArrayBuffer=NA});var tE=q((wA)=>{var yA=so(),co=Yn("buffer"),lA=(t,n=0,o=t.byteLength-n)=>{if(!yA.isArrayBuffer(t))throw TypeError(`The "input" argument must be ArrayBuffer. Received type ${typeof t} (${t})`);return co.Buffer.from(t,n,o)},_A=(t,n)=>{if(typeof t!=="string")throw TypeError(`The "input" argument must be of type string. Received type ${typeof t} (${t})`);return n?co.Buffer.from(t,n):co.Buffer.from(t)};wA.fromArrayBuffer=lA;wA.fromString=_A});var iE=q((IA)=>{var nE=tE(),oE=(t)=>{let n=nE.fromString(t,"utf8");return new Uint8Array(n.buffer,n.byteOffset,n.byteLength/Uint8Array.BYTES_PER_ELEMENT)},DA=(t)=>{if(typeof t==="string")return oE(t);if(ArrayBuffer.isView(t))return new Uint8Array(t.buffer,t.byteOffset,t.byteLength/Uint8Array.BYTES_PER_ELEMENT);return new Uint8Array(t)},OA=(t)=>{if(typeof t==="string")return t;if(typeof t!=="object"||typeof t.byteOffset!=="number"||typeof t.byteLength!=="number")throw Error("@smithy/util-utf8: toUtf8 encoder function only accepts string | Uint8Array.");return nE.fromArrayBuffer(t.buffer,t.byteOffset,t.byteLength).toString("utf8")};IA.fromUtf8=oE;IA.toUint8Array=DA;IA.toUtf8=OA});var ui=q((QA)=>{var St=ar(),Gt=iE(),XA=so(),fE=bo(),eE=Hr(),Bn=Mo(),uE="X-Amz-Algorithm",TE="X-Amz-Credential",ti="X-Amz-Date",NE="X-Amz-SignedHeaders",RE="X-Amz-Expires",ni="X-Amz-Signature",oi="X-Amz-Security-Token",CA="X-Amz-Region-Set",ii="authorization",ei=ti.toLowerCase(),AE="date",yE=[ii,ei,AE],lE=ni.toLowerCase(),jn="x-amz-content-sha256",_E=oi.toLowerCase(),PA="host",wE={authorization:!0,"cache-control":!0,connection:!0,expect:!0,from:!0,"keep-alive":!0,"max-forwards":!0,pragma:!0,referer:!0,te:!0,trailer:!0,"transfer-encoding":!0,upgrade:!0,"user-agent":!0,"x-amzn-trace-id":!0},gE=/^proxy-/,LE=/^sec-/,vA=[/^proxy-/i,/^sec-/i],Wn="AWS4-HMAC-SHA256",MA="AWS4-ECDSA-P256-SHA256",DE="AWS4-HMAC-SHA256-PAYLOAD",OE="UNSIGNED-PAYLOAD",IE=50,ri="aws4_request",UE=604800,st={},Vn=[],Kn=(t,n,o)=>`${t}/${n}/${o}/${ri}`,SE=async(t,n,o,i,e)=>{let r=await rE(t,n.secretAccessKey,n.accessKeyId),E=`${o}:${i}:${e}:${St.toHex(r)}:${n.sessionToken}`;if(E in st)return st[E];Vn.push(E);while(Vn.length>IE)delete st[Vn.shift()];let u=`AWS4${n.secretAccessKey}`;for(let T of[o,i,e,ri])u=await rE(t,u,T);return st[E]=u},FA=()=>{Vn.length=0,Object.keys(st).forEach((t)=>{delete st[t]})},rE=(t,n,o)=>{let i=new t(n);return i.update(Gt.toUint8Array(o)),i.digest()},xo=({headers:t},n,o)=>{let i={};for(let e of Object.keys(t).sort()){if(t[e]==null)continue;let r=e.toLowerCase();if(r in wE||n?.has(r)||gE.test(r)||LE.test(r)){if(!o||o&&!o.has(r))continue}i[r]=t[e].trim().replace(/\s+/g," ")}return i},pn=async({headers:t,body:n},o)=>{for(let i of Object.keys(t))if(i.toLowerCase()===jn)return t[i];if(n==null)return"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";else if(typeof n==="string"||ArrayBuffer.isView(n)||XA.isArrayBuffer(n)){let i=new o;return i.update(Gt.toUint8Array(n)),St.toHex(await i.digest())}return OE};class $E{format(t){let n=[];for(let e of Object.keys(t)){let r=Gt.fromUtf8(e);n.push(Uint8Array.from([r.byteLength]),r,this.formatHeaderValue(t[e]))}let o=new Uint8Array(n.reduce((e,r)=>e+r.byteLength,0)),i=0;for(let e of n)o.set(e,i),i+=e.byteLength;return o}formatHeaderValue(t){switch(t.type){case"boolean":return Uint8Array.from([t.value?0:1]);case"byte":return Uint8Array.from([2,t.value]);case"short":let n=new DataView(new ArrayBuffer(3));return n.setUint8(0,3),n.setInt16(1,t.value,!1),new Uint8Array(n.buffer);case"integer":let o=new DataView(new ArrayBuffer(5));return o.setUint8(0,4),o.setInt32(1,t.value,!1),new Uint8Array(o.buffer);case"long":let i=new Uint8Array(9);return i[0]=5,i.set(t.value.bytes,1),i;case"binary":let e=new DataView(new ArrayBuffer(3+t.value.byteLength));e.setUint8(0,6),e.setUint16(1,t.value.byteLength,!1);let r=new Uint8Array(e.buffer);return r.set(t.value,3),r;case"string":let E=Gt.fromUtf8(t.value),u=new DataView(new ArrayBuffer(3+E.byteLength));u.setUint8(0,7),u.setUint16(1,E.byteLength,!1);let T=new Uint8Array(u.buffer);return T.set(E,3),T;case"timestamp":let N=new Uint8Array(9);return N[0]=8,N.set(Ei.fromNumber(t.value.valueOf()).bytes,1),N;case"uuid":if(!YA.test(t.value))throw Error(`Invalid UUID received: ${t.value}`);let R=new Uint8Array(17);return R[0]=9,R.set(St.fromHex(t.value.replace(/\-/g,"")),1),R}}}var YA=/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/;class Ei{bytes;constructor(t){if(this.bytes=t,t.byteLength!==8)throw Error("Int64 buffers must be exactly 8 bytes")}static fromNumber(t){if(t>9223372036854776000||t<-9223372036854776000)throw Error(`${t} is too large (or, if negative, too small) to represent as an Int64`);let n=new Uint8Array(8);for(let o=7,i=Math.abs(Math.round(t));o>-1&&i>0;o--,i/=256)n[o]=i;if(t<0)EE(n);return new Ei(n)}valueOf(){let t=this.bytes.slice(0),n=t[0]&128;if(n)EE(t);return parseInt(St.toHex(t),16)*(n?-1:1)}toString(){return String(this.valueOf())}}function EE(t){for(let n=0;n<8;n++)t[n]^=255;for(let n=7;n>-1;n--)if(t[n]++,t[n]!==0)break}var XE=(t,n)=>{t=t.toLowerCase();for(let o of Object.keys(n))if(t===o.toLowerCase())return!0;return!1},CE=(t,n={})=>{let{headers:o,query:i={}}=fE.HttpRequest.clone(t);for(let e of Object.keys(o)){let r=e.toLowerCase();if(r.slice(0,6)==="x-amz-"&&!n.unhoistableHeaders?.has(r)||n.hoistableHeaders?.has(r))i[e]=o[e],delete o[e]}return{...t,headers:o,query:i}},ao=(t)=>{t=fE.HttpRequest.clone(t);for(let n of Object.keys(t.headers))if(yE.indexOf(n.toLowerCase())>-1)delete t.headers[n];return t},PE=({query:t={}})=>{let n=[],o={};for(let i of Object.keys(t)){if(i.toLowerCase()===lE)continue;let e=Bn.escapeUri(i);n.push(e);let r=t[i];if(typeof r==="string")o[e]=`${e}=${Bn.escapeUri(r)}`;else if(Array.isArray(r))o[e]=r.slice(0).reduce((E,u)=>E.concat([`${e}=${Bn.escapeUri(u)}`]),[]).sort().join("&")}return n.sort().map((i)=>o[i]).filter((i)=>i).join("&")},GA=(t)=>ZA(t).toISOString().replace(/\.\d{3}Z$/,"Z"),ZA=(t)=>{if(typeof t==="number")return new Date(t*1000);if(typeof t==="string"){if(Number(t))return new Date(Number(t)*1000);return new Date(t)}return t};class fi{service;regionProvider;credentialProvider;sha256;uriEscapePath;applyChecksum;constructor({applyChecksum:t,credentials:n,region:o,service:i,sha256:e,uriEscapePath:r=!0}){this.service=i,this.sha256=e,this.uriEscapePath=r,this.applyChecksum=typeof t==="boolean"?t:!0,this.regionProvider=eE.normalizeProvider(o),this.credentialProvider=eE.normalizeProvider(n)}createCanonicalRequest(t,n,o){let i=Object.keys(n).sort();return`${t.method}
134
+ `;function Ke(t){if(!t.prepare("PRAGMA table_info(file_versions)").all().some((i)=>i.name==="content_hash"))t.exec("ALTER TABLE file_versions ADD COLUMN content_hash TEXT");t.exec("CREATE UNIQUE INDEX IF NOT EXISTS file_versions_path_drive_version_uq ON file_versions(path, drive_id, version)")}import{Database as ql}from"bun:sqlite";import{drizzle as sl}from"drizzle-orm/bun-sqlite";import*as pe from"sqlite-vec";import{existsSync as cl,mkdirSync as xl}from"fs";import{dirname as al}from"path";function tN(t){pe.load(t)}function St(t){let n=t??Ht(),o=al(n);if(!cl(o))xl(o,{recursive:!0});let i=new ql(n);return tN(i),i.exec("PRAGMA journal_mode=WAL;"),i.exec("PRAGMA foreign_keys=ON;"),i.exec(Ve),i.exec(We),Ke(i),sl(i,{schema:u})}var G=R(()=>{He();wn();Be()});var Ho=s((iN)=>{var he=(t)=>encodeURIComponent(t).replace(/[!'()*]/g,nN),nN=(t)=>`%${t.charCodeAt(0).toString(16).toUpperCase()}`,oN=(t)=>t.split("/").map(he).join("/");iN.escapeUri=he;iN.escapeUriPath=oN});var je=s((uN)=>{var Zo=Ho();function EN(t){let n=[];for(let o of Object.keys(t).sort()){let i=t[o];if(o=Zo.escapeUri(o),Array.isArray(i))for(let e=0,r=i.length;e<r;e++)n.push(`${o}=${Zo.escapeUri(i[e])}`);else{let e=o;if(i||typeof i==="string")e+=`=${Zo.escapeUri(i)}`;n.push(e)}}return n.join("&")}uN.buildQueryString=EN});function de(t){let{port:n,query:o}=t,{protocol:i,path:e,hostname:r}=t;if(i&&i.slice(-1)!==":")i+=":";if(n)r+=`:${n}`;if(e&&e.charAt(0)!=="/")e=`/${e}`;let E=o?ke.buildQueryString(o):"";if(E&&E[0]!=="?")E=`?${E}`;let f="";if(t.username!=null||t.password!=null){let l=t.username??"",N=t.password??"";f=`${l}:${N}@`}let T="";if(t.fragment)T=`#${t.fragment}`;return`${i}//${f}${r}${e}${E}${T}`}var ke;var me=R(()=>{ke=ot(je(),1)});var ze=async(t)=>{let n=t?.Bucket||"";if(typeof t.Bucket==="string")t.Bucket=n.replace(/#/g,encodeURIComponent("#")).replace(/\?/g,encodeURIComponent("?"));if(AN(n)){if(t.ForcePathStyle===!0)throw Error("Path-style addressing cannot be used with ARN buckets")}else if(!RN(n)||n.indexOf(".")!==-1&&!String(t.Endpoint).startsWith("http:")||n.toLowerCase()!==n||n.length<3)t.ForcePathStyle=!0;if(t.DisableMultiRegionAccessPoints)t.disableMultiRegionAccessPoints=!0,t.DisableMRAP=!0;return t},TN,lN,NN,RN=(t)=>TN.test(t)&&!lN.test(t)&&!NN.test(t),AN=(t)=>{let[n,o,i,,,e]=t.split(":"),r=n==="arn"&&t.split(":").length>=6,E=Boolean(r&&o&&i&&e);if(r&&!E)throw Error(`Invalid ARN: ${t} was an invalid ARN.`);return E};var be=R(()=>{TN=/^[a-z0-9][a-z0-9\.\-]{1,61}[a-z0-9]$/,lN=/(\d+\.){3}\d+/,NN=/\.\./});var qe=R(()=>{be()});var se=(t,n,o,i=!1)=>{let e=async()=>{let r;if(i)r=o.clientContextParams?.[t]??o[t]??o[n];else r=o[t]??o[n];if(typeof r==="function")return r();return r};if(t==="credentialScope"||n==="CredentialScope")return async()=>{let r=typeof o.credentials==="function"?await o.credentials():o.credentials;return r?.credentialScope??r?.CredentialScope};if(t==="accountId"||n==="AccountId")return async()=>{let r=typeof o.credentials==="function"?await o.credentials():o.credentials;return r?.accountId??r?.AccountId};if(t==="endpoint"||n==="endpoint")return async()=>{if(o.isCustomEndpoint===!1)return;let r=await e();if(r&&typeof r==="object"){if("url"in r)return r.url.href;if("hostname"in r){let{protocol:E,hostname:f,port:T,path:l}=r;return`${E}//${f}${T?":"+T:""}${l}`}}return r};return e};var gn=s((LN)=>{class qt extends Error{name="ProviderError";tryNextLink;constructor(t,n=!0){let o,i=!0;if(typeof n==="boolean")o=void 0,i=n;else if(n!=null&&typeof n==="object")o=n.logger,i=n.tryNextLink??!0;super(t);this.tryNextLink=i,Object.setPrototypeOf(this,qt.prototype),o?.debug?.(`@smithy/property-provider ${i?"->":"(!)"} ${t}`)}static from(t,n=!0){return Object.assign(new this(t.message,n),t)}}class Qo extends qt{name="CredentialsProviderError";constructor(t,n=!0){super(t,n);Object.setPrototypeOf(this,Qo.prototype)}}class Jo extends qt{name="TokenProviderError";constructor(t,n=!0){super(t,n);Object.setPrototypeOf(this,Jo.prototype)}}var _N=(...t)=>async()=>{if(t.length===0)throw new qt("No providers in chain");let n;for(let o of t)try{return await o()}catch(i){if(n=i,i?.tryNextLink)continue;throw i}throw n},wN=(t)=>()=>Promise.resolve(t),yN=(t,n,o)=>{let i,e,r,E=!1,f=async()=>{if(!e)e=t();try{i=await e,r=!0,E=!1}finally{e=void 0}return i};if(n===void 0)return async(T)=>{if(!r||T?.forceRefresh)i=await f();return i};return async(T)=>{if(!r||T?.forceRefresh)i=await f();if(E)return i;if(o&&!o(i))return E=!0,i;if(n(i))return await f(),i;return i}};LN.CredentialsProviderError=Qo;LN.ProviderError=qt;LN.TokenProviderError=Jo;LN.chain=_N;LN.fromStatic=wN;LN.memoize=yN});function pn(t){try{let n=new Set(Array.from(t.match(/([A-Z_]){3,}/g)??[]));return n.delete("CONFIG"),n.delete("CONFIG_PREFIX_SEPARATOR"),n.delete("ENV"),[...n].join(", ")}catch(n){return t}}var ce,xe=(t,n)=>async()=>{try{let o=t(process.env,n);if(o===void 0)throw Error();return o}catch(o){throw new ce.CredentialsProviderError(o.message||`Not found in ENV: ${pn(t.toString())}`,{logger:n?.logger})}};var ae=R(()=>{ce=ot(gn(),1)});import{homedir as $N}from"os";import{sep as XN}from"path";var Bo,CN=()=>{if(process&&process.geteuid)return`${process.geteuid()}`;return"DEFAULT"},st=()=>{let{HOME:t,USERPROFILE:n,HOMEPATH:o,HOMEDRIVE:i=`C:${XN}`}=process.env;if(t)return t;if(n)return n;if(o)return`${i}${o}`;let e=CN();if(!Bo[e])Bo[e]=$N();return Bo[e]};var Dn=R(()=>{Bo={}});var tr=(t)=>t.profile||process.env.AWS_PROFILE||"default";var nr=()=>{};var In=s((GN)=>{GN.HttpAuthLocation=void 0;(function(t){t.HEADER="header",t.QUERY="query"})(GN.HttpAuthLocation||(GN.HttpAuthLocation={}));GN.HttpApiKeyAuthLocation=void 0;(function(t){t.HEADER="header",t.QUERY="query"})(GN.HttpApiKeyAuthLocation||(GN.HttpApiKeyAuthLocation={}));GN.EndpointURLScheme=void 0;(function(t){t.HTTP="http",t.HTTPS="https"})(GN.EndpointURLScheme||(GN.EndpointURLScheme={}));GN.AlgorithmId=void 0;(function(t){t.MD5="md5",t.CRC32="crc32",t.CRC32C="crc32c",t.SHA1="sha1",t.SHA256="sha256"})(GN.AlgorithmId||(GN.AlgorithmId={}));var PN=(t)=>{let n=[];if(t.sha256!==void 0)n.push({algorithmId:()=>GN.AlgorithmId.SHA256,checksumConstructor:()=>t.sha256});if(t.md5!=null)n.push({algorithmId:()=>GN.AlgorithmId.MD5,checksumConstructor:()=>t.md5});return{addChecksumAlgorithm(o){n.push(o)},checksumAlgorithms(){return n}}},MN=(t)=>{let n={};return t.checksumAlgorithms().forEach((o)=>{n[o.algorithmId()]=o.checksumConstructor()}),n},FN=(t)=>{return PN(t)},vN=(t)=>{return MN(t)};GN.FieldPosition=void 0;(function(t){t[t.HEADER=0]="HEADER",t[t.TRAILER=1]="TRAILER"})(GN.FieldPosition||(GN.FieldPosition={}));var YN="__smithy_context";GN.IniSectionType=void 0;(function(t){t.PROFILE="profile",t.SSO_SESSION="sso-session",t.SERVICES="services"})(GN.IniSectionType||(GN.IniSectionType={}));GN.RequestHandlerProtocol=void 0;(function(t){t.HTTP_0_9="http/0.9",t.HTTP_1_0="http/1.0",t.TDS_8_0="tds/8.0"})(GN.RequestHandlerProtocol||(GN.RequestHandlerProtocol={}));GN.SMITHY_CONTEXT_KEY=YN;GN.getDefaultClientConfiguration=FN;GN.resolveDefaultRuntimeConfig=vN});var Nt=".";var ko,or=(t)=>Object.entries(t).filter(([n])=>{let o=n.indexOf(Nt);if(o===-1)return!1;return Object.values(ko.IniSectionType).includes(n.substring(0,o))}).reduce((n,[o,i])=>{let e=o.indexOf(Nt),r=o.substring(0,e)===ko.IniSectionType.PROFILE?o.substring(e+1):o;return n[r]=i,n},{...t.default&&{default:t.default}});var ir=R(()=>{ko=ot(In(),1)});import{join as JN}from"path";var BN="AWS_CONFIG_FILE",er=()=>process.env[BN]||JN(st(),".aws","config");var rr=R(()=>{Dn()});import{join as VN}from"path";var WN="AWS_SHARED_CREDENTIALS_FILE",Er=()=>process.env[WN]||VN(st(),".aws","credentials");var ur=R(()=>{Dn()});var fr,KN,pN,mo=(t)=>{let n={},o,i;for(let e of t.split(/\r?\n/)){let r=e.split(/(^|\s)[;#]/)[0].trim();if(r[0]==="["&&r[r.length-1]==="]"){o=void 0,i=void 0;let f=r.substring(1,r.length-1),T=KN.exec(f);if(T){let[,l,,N]=T;if(Object.values(fr.IniSectionType).includes(l))o=[l,N].join(Nt)}else o=f;if(pN.includes(f))throw Error(`Found invalid profile name "${f}"`)}else if(o){let f=r.indexOf("=");if(![0,-1].includes(f)){let[T,l]=[r.substring(0,f).trim(),r.substring(f+1).trim()];if(l==="")i=T;else{if(i&&e.trimStart()===e)i=void 0;n[o]=n[o]||{};let N=i?[i,T].join(Nt):T;n[o][N]=l}}}}return n};var Tr=R(()=>{fr=ot(In(),1),KN=/^([\w-]+)\s(["'])?([\w-@\+\.%:/]+)\2$/,pN=["__proto__","profile __proto__"]});import{readFile as hN}from"fs/promises";var zo,lr,bo=(t,n)=>{if(lr[t]!==void 0)return lr[t];if(!zo[t]||n?.ignoreCache)zo[t]=hN(t,"utf8");return zo[t]};var Nr=R(()=>{zo={},lr={}});import{join as Rr}from"path";var Ar=()=>({}),_r=async(t={})=>{let{filepath:n=Er(),configFilepath:o=er()}=t,i=st(),e="~/",r=n;if(n.startsWith("~/"))r=Rr(i,n.slice(2));let E=o;if(o.startsWith("~/"))E=Rr(i,o.slice(2));let f=await Promise.all([bo(E,{ignoreCache:t.ignoreCache}).then(mo).then(or).catch(Ar),bo(r,{ignoreCache:t.ignoreCache}).then(mo).catch(Ar)]);return{configFile:f[0],credentialsFile:f[1]}};var wr=R(()=>{ir();rr();ur();Dn();Tr();Nr()});var yr=()=>{};var Lr=()=>{};var gr=()=>{};var qo=R(()=>{Dn();nr();wr();yr();Lr();gr()});var Dr,Or=(t,{preferredFile:n="config",...o}={})=>async()=>{let i=tr(o),{configFile:e,credentialsFile:r}=await _r(o),E=r[i]||{},f=e[i]||{},T=n==="config"?{...E,...f}:{...f,...E};try{let N=t(T,n==="config"?e:r);if(N===void 0)throw Error();return N}catch(l){throw new Dr.CredentialsProviderError(l.message||`Not found in config files w/ profile [${i}]: ${pn(t.toString())}`,{logger:o.logger})}};var Ir=R(()=>{qo();Dr=ot(gn(),1)});var Ur,jN=(t)=>typeof t==="function",Sr=(t)=>jN(t)?async()=>await t():Ur.fromStatic(t);var $r=R(()=>{Ur=ot(gn(),1)});var hn,Xr=({environmentVariableSelector:t,configFileSelector:n,default:o},i={})=>{let{signingName:e,logger:r}=i;return hn.memoize(hn.chain(xe(t,{signingName:e,logger:r}),Or(n,i),Sr(o)))};var Cr=R(()=>{ae();Ir();$r();hn=ot(gn(),1)});var Pr=R(()=>{Cr()});var Mr="AWS_ENDPOINT_URL",Fr="endpoint_url",vr=(t)=>({environmentVariableSelector:(n)=>{let o=t.split(" ").map((r)=>r.toUpperCase()),i=n[[Mr,...o].join("_")];if(i)return i;let e=n[Mr];if(e)return e;return},configFileSelector:(n,o)=>{if(o&&n.services){let e=o[["services",n.services].join(Nt)];if(e){let r=t.split(" ").map((f)=>f.toLowerCase()),E=e[[r.join("_"),Fr].join(Nt)];if(E)return E}}let i=n[Fr];if(i)return i;return},default:void 0});var Yr=R(()=>{qo()});var Gr=async(t)=>Xr(vr(t??""))();var Hr=R(()=>{Pr();Yr()});var Zr=s((dN)=>{function kN(t){let n={};if(t=t.replace(/^\?/,""),t)for(let o of t.split("&")){let[i,e=null]=o.split("=");if(i=decodeURIComponent(i),e)e=decodeURIComponent(e);if(!(i in n))n[i]=e;else if(Array.isArray(n[i]))n[i].push(e);else n[i]=[n[i],e]}return n}dN.parseQueryString=kN});var Jr=s((bN)=>{var zN=Zr(),Qr=(t)=>{if(typeof t==="string")return Qr(new URL(t));let{hostname:n,pathname:o,port:i,protocol:e,search:r}=t,E;if(r)E=zN.parseQueryString(r);return{hostname:n,port:i?parseInt(i):void 0,protocol:e,path:o,query:E}};bN.parseUrl=Qr});var so,Br=(t)=>{if(typeof t==="object"){if("url"in t){let n=so.parseUrl(t.url);if(t.headers){n.headers={};for(let[o,i]of Object.entries(t.headers))n.headers[o.toLowerCase()]=i.join(", ")}return n}return t}return so.parseUrl(t)};var co=R(()=>{so=ot(Jr(),1)});var Vr=async(t,n,o,i)=>{if(!o.isCustomEndpoint){let E;if(o.serviceConfiguredEndpoint)E=await o.serviceConfiguredEndpoint();else E=await Gr(o.serviceId);if(E)o.endpoint=()=>Promise.resolve(Br(E)),o.isCustomEndpoint=!0}let e=await sN(t,n,o);if(typeof o.endpointProvider!=="function")throw Error("config.endpointProvider is not set.");let r=o.endpointProvider(e,i);if(o.isCustomEndpoint&&o.endpoint){let E=await o.endpoint();if(E?.headers){r.headers??={};for(let[f,T]of Object.entries(E.headers))r.headers[f]=Array.isArray(T)?T:[T]}}return r},sN=async(t,n,o)=>{let i={},e=n?.getEndpointParameterInstructions?.()||{};for(let[r,E]of Object.entries(e))switch(E.type){case"staticContextParams":i[r]=E.value;break;case"contextParams":i[r]=t[E.name];break;case"clientContextParams":case"builtInParams":i[r]=await se(E.name,r,o,E.type!=="builtInParams")();break;case"operationContextParams":i[r]=E.get(t);break;default:throw Error("Unrecognized endpoint parameter instruction: "+JSON.stringify(E))}if(Object.keys(e).length===0)Object.assign(i,o);if(String(o.serviceId).toLowerCase()==="s3")await ze(i);return i};var Wr=R(()=>{qe();Hr();co()});var Kr=R(()=>{Wr();co()});var hr=s((aN)=>{var pr=In(),cN=(t)=>t[pr.SMITHY_CONTEXT_KEY]||(t[pr.SMITHY_CONTEXT_KEY]={}),xN=(t)=>{if(typeof t==="function")return t;let n=Promise.resolve(t);return()=>n};aN.getSmithyContext=cN;aN.normalizeProvider=xN});var jr=()=>{};var xo=s((uR)=>{var oR=In(),iR=(t)=>{return{setHttpHandler(n){t.httpHandler=n},httpHandler(){return t.httpHandler},updateHttpClientConfig(n,o){t.httpHandler?.updateHttpClientConfig(n,o)},httpHandlerConfigs(){return t.httpHandler.httpHandlerConfigs()}}},eR=(t)=>{return{httpHandler:t.httpHandler()}};class kr{name;kind;values;constructor({name:t,kind:n=oR.FieldPosition.HEADER,values:o=[]}){this.name=t,this.kind=n,this.values=o}add(t){this.values.push(t)}set(t){this.values=t}remove(t){this.values=this.values.filter((n)=>n!==t)}toString(){return this.values.map((t)=>t.includes(",")||t.includes(" ")?`"${t}"`:t).join(", ")}get(){return this.values}}class dr{entries={};encoding;constructor({fields:t=[],encoding:n="utf-8"}){t.forEach(this.setField.bind(this)),this.encoding=n}setField(t){this.entries[t.name.toLowerCase()]=t}getField(t){return this.entries[t.toLowerCase()]}removeField(t){delete this.entries[t.toLowerCase()]}getByType(t){return Object.values(this.entries).filter((n)=>n.kind===t)}}class jn{method;protocol;hostname;port;path;query;headers;username;password;fragment;body;constructor(t){this.method=t.method||"GET",this.hostname=t.hostname||"localhost",this.port=t.port,this.query=t.query||{},this.headers=t.headers||{},this.body=t.body,this.protocol=t.protocol?t.protocol.slice(-1)!==":"?`${t.protocol}:`:t.protocol:"https:",this.path=t.path?t.path.charAt(0)!=="/"?`/${t.path}`:t.path:"/",this.username=t.username,this.password=t.password,this.fragment=t.fragment}static clone(t){let n=new jn({...t,headers:{...t.headers}});if(n.query)n.query=rR(n.query);return n}static isInstance(t){if(!t)return!1;let n=t;return"method"in n&&"protocol"in n&&"hostname"in n&&"path"in n&&typeof n.query==="object"&&typeof n.headers==="object"}clone(){return jn.clone(this)}}function rR(t){return Object.keys(t).reduce((n,o)=>{let i=t[o];return{...n,[o]:Array.isArray(i)?[...i]:i}},{})}class mr{statusCode;reason;headers;body;constructor(t){this.statusCode=t.statusCode,this.reason=t.reason,this.headers=t.headers||{},this.body=t.body}static isInstance(t){if(!t)return!1;let n=t;return typeof n.statusCode==="number"&&typeof n.headers==="object"}}function ER(t){return/^[a-z0-9][a-z0-9\.\-]*[a-z0-9]$/.test(t)}uR.Field=kr;uR.Fields=dr;uR.HttpRequest=jn;uR.HttpResponse=mr;uR.getHttpHandlerExtensionConfiguration=iR;uR.isValidHostname=ER;uR.resolveHttpHandlerRuntimeConfig=eR});var zr=()=>{};var br=()=>{};var qr;var sr=R(()=>{qr={name:"serializerMiddleware",step:"serialize",tags:["SERIALIZER"],override:!0}});var cr=R(()=>{zr();sr();br()});var hg;var xr=R(()=>{cr();hg={step:"serialize",tags:["ENDPOINT_PARAMETERS","ENDPOINT_V2","ENDPOINT"],name:"endpointV2Middleware",override:!0,relation:"before",toMiddleware:qr.name}});var ar=()=>{};var tE=()=>{};var nE=R(()=>{Kr();jr();xr();ar();tE()});var oE=()=>{};var iE=()=>{};var eE=()=>{};var rE=()=>{};var uE=s((LR)=>{var EE={},ao={};for(let t=0;t<256;t++){let n=t.toString(16).toLowerCase();if(n.length===1)n=`0${n}`;EE[t]=n,ao[n]=t}function wR(t){if(t.length%2!==0)throw Error("Hex encoded strings must have an even number length");let n=new Uint8Array(t.length/2);for(let o=0;o<t.length;o+=2){let i=t.slice(o,o+2).toLowerCase();if(i in ao)n[o/2]=ao[i];else throw Error(`Cannot decode unrecognized sequence ${i} as hexadecimal`)}return n}function yR(t){let n="";for(let o=0;o<t.byteLength;o++)n+=EE[t[o]];return n}LR.fromHex=wR;LR.toHex=yR});var ti=s((IR)=>{var OR=(t)=>typeof ArrayBuffer==="function"&&t instanceof ArrayBuffer||Object.prototype.toString.call(t)==="[object ArrayBuffer]";IR.isArrayBuffer=OR});var fE=s((CR)=>{var SR=ti(),ni=Vn("buffer"),$R=(t,n=0,o=t.byteLength-n)=>{if(!SR.isArrayBuffer(t))throw TypeError(`The "input" argument must be ArrayBuffer. Received type ${typeof t} (${t})`);return ni.Buffer.from(t,n,o)},XR=(t,n)=>{if(typeof t!=="string")throw TypeError(`The "input" argument must be of type string. Received type ${typeof t} (${t})`);return n?ni.Buffer.from(t,n):ni.Buffer.from(t)};CR.fromArrayBuffer=$R;CR.fromString=XR});var NE=s((YR)=>{var TE=fE(),lE=(t)=>{let n=TE.fromString(t,"utf8");return new Uint8Array(n.buffer,n.byteOffset,n.byteLength/Uint8Array.BYTES_PER_ELEMENT)},FR=(t)=>{if(typeof t==="string")return lE(t);if(ArrayBuffer.isView(t))return new Uint8Array(t.buffer,t.byteOffset,t.byteLength/Uint8Array.BYTES_PER_ELEMENT);return new Uint8Array(t)},vR=(t)=>{if(typeof t==="string")return t;if(typeof t!=="object"||typeof t.byteOffset!=="number"||typeof t.byteLength!=="number")throw Error("@smithy/util-utf8: toUtf8 encoder function only accepts string | Uint8Array.");return TE.fromArrayBuffer(t.buffer,t.byteOffset,t.byteLength).toString("utf8")};YR.fromUtf8=lE;YR.toUint8Array=FR;YR.toUtf8=vR});var Ri=s((dR)=>{var $t=uE(),Zt=NE(),QR=ti(),wE=xo(),RE=hr(),kn=Ho(),yE="X-Amz-Algorithm",LE="X-Amz-Credential",ei="X-Amz-Date",gE="X-Amz-SignedHeaders",DE="X-Amz-Expires",ri="X-Amz-Signature",Ei="X-Amz-Security-Token",JR="X-Amz-Region-Set",ui="authorization",fi=ei.toLowerCase(),OE="date",IE=[ui,fi,OE],UE=ri.toLowerCase(),qn="x-amz-content-sha256",SE=Ei.toLowerCase(),BR="host",$E={authorization:!0,"cache-control":!0,connection:!0,expect:!0,from:!0,"keep-alive":!0,"max-forwards":!0,pragma:!0,referer:!0,te:!0,trailer:!0,"transfer-encoding":!0,upgrade:!0,"user-agent":!0,"x-amzn-trace-id":!0},XE=/^proxy-/,CE=/^sec-/,VR=[/^proxy-/i,/^sec-/i],dn="AWS4-HMAC-SHA256",WR="AWS4-ECDSA-P256-SHA256",PE="AWS4-HMAC-SHA256-PAYLOAD",ME="UNSIGNED-PAYLOAD",FE=50,Ti="aws4_request",vE=604800,ct={},mn=[],zn=(t,n,o)=>`${t}/${n}/${o}/${Ti}`,YE=async(t,n,o,i,e)=>{let r=await AE(t,n.secretAccessKey,n.accessKeyId),E=`${o}:${i}:${e}:${$t.toHex(r)}:${n.sessionToken}`;if(E in ct)return ct[E];mn.push(E);while(mn.length>FE)delete ct[mn.shift()];let f=`AWS4${n.secretAccessKey}`;for(let T of[o,i,e,Ti])f=await AE(t,f,T);return ct[E]=f},KR=()=>{mn.length=0,Object.keys(ct).forEach((t)=>{delete ct[t]})},AE=(t,n,o)=>{let i=new t(n);return i.update(Zt.toUint8Array(o)),i.digest()},oi=({headers:t},n,o)=>{let i={};for(let e of Object.keys(t).sort()){if(t[e]==null)continue;let r=e.toLowerCase();if(r in $E||n?.has(r)||XE.test(r)||CE.test(r)){if(!o||o&&!o.has(r))continue}i[r]=t[e].trim().replace(/\s+/g," ")}return i},bn=async({headers:t,body:n},o)=>{for(let i of Object.keys(t))if(i.toLowerCase()===qn)return t[i];if(n==null)return"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";else if(typeof n==="string"||ArrayBuffer.isView(n)||QR.isArrayBuffer(n)){let i=new o;return i.update(Zt.toUint8Array(n)),$t.toHex(await i.digest())}return ME};class GE{format(t){let n=[];for(let e of Object.keys(t)){let r=Zt.fromUtf8(e);n.push(Uint8Array.from([r.byteLength]),r,this.formatHeaderValue(t[e]))}let o=new Uint8Array(n.reduce((e,r)=>e+r.byteLength,0)),i=0;for(let e of n)o.set(e,i),i+=e.byteLength;return o}formatHeaderValue(t){switch(t.type){case"boolean":return Uint8Array.from([t.value?0:1]);case"byte":return Uint8Array.from([2,t.value]);case"short":let n=new DataView(new ArrayBuffer(3));return n.setUint8(0,3),n.setInt16(1,t.value,!1),new Uint8Array(n.buffer);case"integer":let o=new DataView(new ArrayBuffer(5));return o.setUint8(0,4),o.setInt32(1,t.value,!1),new Uint8Array(o.buffer);case"long":let i=new Uint8Array(9);return i[0]=5,i.set(t.value.bytes,1),i;case"binary":let e=new DataView(new ArrayBuffer(3+t.value.byteLength));e.setUint8(0,6),e.setUint16(1,t.value.byteLength,!1);let r=new Uint8Array(e.buffer);return r.set(t.value,3),r;case"string":let E=Zt.fromUtf8(t.value),f=new DataView(new ArrayBuffer(3+E.byteLength));f.setUint8(0,7),f.setUint16(1,E.byteLength,!1);let T=new Uint8Array(f.buffer);return T.set(E,3),T;case"timestamp":let l=new Uint8Array(9);return l[0]=8,l.set(li.fromNumber(t.value.valueOf()).bytes,1),l;case"uuid":if(!pR.test(t.value))throw Error(`Invalid UUID received: ${t.value}`);let N=new Uint8Array(17);return N[0]=9,N.set($t.fromHex(t.value.replace(/\-/g,"")),1),N}}}var pR=/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/;class li{bytes;constructor(t){if(this.bytes=t,t.byteLength!==8)throw Error("Int64 buffers must be exactly 8 bytes")}static fromNumber(t){if(t>9223372036854776000||t<-9223372036854776000)throw Error(`${t} is too large (or, if negative, too small) to represent as an Int64`);let n=new Uint8Array(8);for(let o=7,i=Math.abs(Math.round(t));o>-1&&i>0;o--,i/=256)n[o]=i;if(t<0)_E(n);return new li(n)}valueOf(){let t=this.bytes.slice(0),n=t[0]&128;if(n)_E(t);return parseInt($t.toHex(t),16)*(n?-1:1)}toString(){return String(this.valueOf())}}function _E(t){for(let n=0;n<8;n++)t[n]^=255;for(let n=7;n>-1;n--)if(t[n]++,t[n]!==0)break}var HE=(t,n)=>{t=t.toLowerCase();for(let o of Object.keys(n))if(t===o.toLowerCase())return!0;return!1},ZE=(t,n={})=>{let{headers:o,query:i={}}=wE.HttpRequest.clone(t);for(let e of Object.keys(o)){let r=e.toLowerCase();if(r.slice(0,6)==="x-amz-"&&!n.unhoistableHeaders?.has(r)||n.hoistableHeaders?.has(r))i[e]=o[e],delete o[e]}return{...t,headers:o,query:i}},ii=(t)=>{t=wE.HttpRequest.clone(t);for(let n of Object.keys(t.headers))if(IE.indexOf(n.toLowerCase())>-1)delete t.headers[n];return t},QE=({query:t={}})=>{let n=[],o={};for(let i of Object.keys(t)){if(i.toLowerCase()===UE)continue;let e=kn.escapeUri(i);n.push(e);let r=t[i];if(typeof r==="string")o[e]=`${e}=${kn.escapeUri(r)}`;else if(Array.isArray(r))o[e]=r.slice(0).reduce((E,f)=>E.concat([`${e}=${kn.escapeUri(f)}`]),[]).sort().join("&")}return n.sort().map((i)=>o[i]).filter((i)=>i).join("&")},hR=(t)=>jR(t).toISOString().replace(/\.\d{3}Z$/,"Z"),jR=(t)=>{if(typeof t==="number")return new Date(t*1000);if(typeof t==="string"){if(Number(t))return new Date(Number(t)*1000);return new Date(t)}return t};class Ni{service;regionProvider;credentialProvider;sha256;uriEscapePath;applyChecksum;constructor({applyChecksum:t,credentials:n,region:o,service:i,sha256:e,uriEscapePath:r=!0}){this.service=i,this.sha256=e,this.uriEscapePath=r,this.applyChecksum=typeof t==="boolean"?t:!0,this.regionProvider=RE.normalizeProvider(o),this.credentialProvider=RE.normalizeProvider(n)}createCanonicalRequest(t,n,o){let i=Object.keys(n).sort();return`${t.method}
135
135
  ${this.getCanonicalPath(t)}
136
- ${PE(t)}
136
+ ${QE(t)}
137
137
  ${i.map((e)=>`${e}:${n[e]}`).join(`
138
138
  `)}
139
139
 
140
140
  ${i.join(";")}
141
- ${o}`}async createStringToSign(t,n,o,i){let e=new this.sha256;e.update(Gt.toUint8Array(o));let r=await e.digest();return`${i}
141
+ ${o}`}async createStringToSign(t,n,o,i){let e=new this.sha256;e.update(Zt.toUint8Array(o));let r=await e.digest();return`${i}
142
142
  ${t}
143
143
  ${n}
144
- ${St.toHex(r)}`}getCanonicalPath({path:t}){if(this.uriEscapePath){let n=[];for(let e of t.split("/")){if(e?.length===0)continue;if(e===".")continue;if(e==="..")n.pop();else n.push(e)}let o=`${t?.startsWith("/")?"/":""}${n.join("/")}${n.length>0&&t?.endsWith("/")?"/":""}`;return Bn.escapeUri(o).replace(/%2F/g,"/")}return t}validateResolvedCredentials(t){if(typeof t!=="object"||typeof t.accessKeyId!=="string"||typeof t.secretAccessKey!=="string")throw Error("Resolved credential object is not valid")}formatDate(t){let n=GA(t).replace(/[\-:]/g,"");return{longDate:n,shortDate:n.slice(0,8)}}getCanonicalHeaderList(t){return Object.keys(t).sort().join(";")}}class vE extends fi{headerFormatter=new $E;constructor({applyChecksum:t,credentials:n,region:o,service:i,sha256:e,uriEscapePath:r=!0}){super({applyChecksum:t,credentials:n,region:o,service:i,sha256:e,uriEscapePath:r})}async presign(t,n={}){let{signingDate:o=new Date,expiresIn:i=3600,unsignableHeaders:e,unhoistableHeaders:r,signableHeaders:E,hoistableHeaders:u,signingRegion:T,signingService:N}=n,R=await this.credentialProvider();this.validateResolvedCredentials(R);let l=T??await this.regionProvider(),{longDate:_,shortDate:O}=this.formatDate(o);if(i>UE)return Promise.reject("Signature version 4 presigned URLs must have an expiration date less than one week in the future");let L=Kn(O,l,N??this.service),F=CE(ao(t),{unhoistableHeaders:r,hoistableHeaders:u});if(R.sessionToken)F.query[oi]=R.sessionToken;F.query[uE]=Wn,F.query[TE]=`${R.accessKeyId}/${L}`,F.query[ti]=_,F.query[RE]=i.toString(10);let X=xo(F,e,E);return F.query[NE]=this.getCanonicalHeaderList(X),F.query[ni]=await this.getSignature(_,L,this.getSigningKey(R,l,O,N),this.createCanonicalRequest(F,X,await pn(t,this.sha256))),F}async sign(t,n){if(typeof t==="string")return this.signString(t,n);else if(t.headers&&t.payload)return this.signEvent(t,n);else if(t.message)return this.signMessage(t,n);else return this.signRequest(t,n)}async signEvent({headers:t,payload:n},{signingDate:o=new Date,priorSignature:i,signingRegion:e,signingService:r}){let E=e??await this.regionProvider(),{shortDate:u,longDate:T}=this.formatDate(o),N=Kn(u,E,r??this.service),R=await pn({headers:{},body:n},this.sha256),l=new this.sha256;l.update(t);let _=St.toHex(await l.digest()),O=[DE,T,N,i,_,R].join(`
145
- `);return this.signString(O,{signingDate:o,signingRegion:E,signingService:r})}async signMessage(t,{signingDate:n=new Date,signingRegion:o,signingService:i}){return this.signEvent({headers:this.headerFormatter.format(t.message.headers),payload:t.message.body},{signingDate:n,signingRegion:o,signingService:i,priorSignature:t.priorSignature}).then((r)=>{return{message:t.message,signature:r}})}async signString(t,{signingDate:n=new Date,signingRegion:o,signingService:i}={}){let e=await this.credentialProvider();this.validateResolvedCredentials(e);let r=o??await this.regionProvider(),{shortDate:E}=this.formatDate(n),u=new this.sha256(await this.getSigningKey(e,r,E,i));return u.update(Gt.toUint8Array(t)),St.toHex(await u.digest())}async signRequest(t,{signingDate:n=new Date,signableHeaders:o,unsignableHeaders:i,signingRegion:e,signingService:r}={}){let E=await this.credentialProvider();this.validateResolvedCredentials(E);let u=e??await this.regionProvider(),T=ao(t),{longDate:N,shortDate:R}=this.formatDate(n),l=Kn(R,u,r??this.service);if(T.headers[ei]=N,E.sessionToken)T.headers[_E]=E.sessionToken;let _=await pn(T,this.sha256);if(!XE(jn,T.headers)&&this.applyChecksum)T.headers[jn]=_;let O=xo(T,i,o),L=await this.getSignature(N,l,this.getSigningKey(E,u,R,r),this.createCanonicalRequest(T,O,_));return T.headers[ii]=`${Wn} Credential=${E.accessKeyId}/${l}, SignedHeaders=${this.getCanonicalHeaderList(O)}, Signature=${L}`,T}async getSignature(t,n,o,i){let e=await this.createStringToSign(t,n,i,Wn),r=new this.sha256(await o);return r.update(Gt.toUint8Array(e)),St.toHex(await r.digest())}getSigningKey(t,n,o,i){return SE(this.sha256,t,o,n,i||this.service)}}var HA={SignatureV4a:null};QA.ALGORITHM_IDENTIFIER=Wn;QA.ALGORITHM_IDENTIFIER_V4A=MA;QA.ALGORITHM_QUERY_PARAM=uE;QA.ALWAYS_UNSIGNABLE_HEADERS=wE;QA.AMZ_DATE_HEADER=ei;QA.AMZ_DATE_QUERY_PARAM=ti;QA.AUTH_HEADER=ii;QA.CREDENTIAL_QUERY_PARAM=TE;QA.DATE_HEADER=AE;QA.EVENT_ALGORITHM_IDENTIFIER=DE;QA.EXPIRES_QUERY_PARAM=RE;QA.GENERATED_HEADERS=yE;QA.HOST_HEADER=PA;QA.KEY_TYPE_IDENTIFIER=ri;QA.MAX_CACHE_SIZE=IE;QA.MAX_PRESIGNED_TTL=UE;QA.PROXY_HEADER_PATTERN=gE;QA.REGION_SET_PARAM=CA;QA.SEC_HEADER_PATTERN=LE;QA.SHA256_HEADER=jn;QA.SIGNATURE_HEADER=lE;QA.SIGNATURE_QUERY_PARAM=ni;QA.SIGNED_HEADERS_QUERY_PARAM=NE;QA.SignatureV4=vE;QA.SignatureV4Base=fi;QA.TOKEN_HEADER=_E;QA.TOKEN_QUERY_PARAM=oi;QA.UNSIGNABLE_PATTERNS=vA;QA.UNSIGNED_PAYLOAD=OE;QA.clearCredentialCache=FA;QA.createScope=Kn;QA.getCanonicalHeaders=xo;QA.getCanonicalQuery=PE;QA.getPayloadHash=pn;QA.getSigningKey=SE;QA.hasHeader=XE;QA.moveHeadersToQuery=CE;QA.prepareRequest=ao;QA.signatureV4aContainer=HA});var hn="X-Amz-S3session-Token",Ti;var ME=A(()=>{Ti=hn.toLowerCase()});function FE(t){return{accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey,expiration:t.expiration}}function YE(t,n){let o=setTimeout(()=>{throw Error("SignatureV4S3Express credential override was created but not called.")},10),i=t.credentialProvider,e=()=>{return clearTimeout(o),t.credentialProvider=i,Promise.resolve(n)};t.credentialProvider=e}var GE,kn;var ZE=A(()=>{ME();GE=tt(ui(),1);kn=class kn extends GE.SignatureV4{async signWithCredentials(t,n,o){let i=FE(n);t.headers[Ti]=n.sessionToken;let e=this;return YE(e,i),e.signRequest(t,o??{})}async presignWithCredentials(t,n,o){let i=FE(n);return delete t.headers[Ti],t.headers[hn]=n.sessionToken,t.query=t.query??{},t.query[hn]=n.sessionToken,YE(this,i),this.presign(t,o)}}});var HE=A(()=>{ZE()});var QE=()=>{};var JE=()=>{};var BE=()=>{};var WE=A(()=>{br();qr();sr();cr();HE();QE();JE();BE()});var gn;var Ni=A(()=>{gn={CrtSignerV4:null}});class Ai{sigv4aSigner;sigv4Signer;signerOptions;static sigv4aDependency(){if(typeof gn.CrtSignerV4==="function")return"crt";else if(typeof Ri.signatureV4aContainer.SignatureV4a==="function")return"js";return"none"}constructor(t){this.sigv4Signer=new kn(t),this.signerOptions=t}async sign(t,n={}){if(n.signingRegion==="*")return this.getSigv4aSigner().sign(t,n);return this.sigv4Signer.sign(t,n)}async signWithCredentials(t,n,o={}){if(o.signingRegion==="*"){let i=this.getSigv4aSigner(),e=gn.CrtSignerV4;if(e&&i instanceof e)return i.signWithCredentials(t,n,o);else throw Error(`signWithCredentials with signingRegion '*' is only supported when using the CRT dependency @aws-sdk/signature-v4-crt. Please check whether you have installed the "@aws-sdk/signature-v4-crt" package explicitly. You must also register the package by calling [require("@aws-sdk/signature-v4-crt");] or an ESM equivalent such as [import "@aws-sdk/signature-v4-crt";]. For more information please go to https://github.com/aws/aws-sdk-js-v3#functionality-requiring-aws-common-runtime-crt`)}return this.sigv4Signer.signWithCredentials(t,n,o)}async presign(t,n={}){if(n.signingRegion==="*"){let o=this.getSigv4aSigner(),i=gn.CrtSignerV4;if(i&&o instanceof i)return o.presign(t,n);else throw Error(`presign with signingRegion '*' is only supported when using the CRT dependency @aws-sdk/signature-v4-crt. Please check whether you have installed the "@aws-sdk/signature-v4-crt" package explicitly. You must also register the package by calling [require("@aws-sdk/signature-v4-crt");] or an ESM equivalent such as [import "@aws-sdk/signature-v4-crt";]. For more information please go to https://github.com/aws/aws-sdk-js-v3#functionality-requiring-aws-common-runtime-crt`)}return this.sigv4Signer.presign(t,n)}async presignWithCredentials(t,n,o={}){if(o.signingRegion==="*")throw Error("Method presignWithCredentials is not supported for [signingRegion=*].");return this.sigv4Signer.presignWithCredentials(t,n,o)}getSigv4aSigner(){if(!this.sigv4aSigner){let t=gn.CrtSignerV4,n=Ri.signatureV4aContainer.SignatureV4a;if(this.signerOptions.runtime==="node"){if(!t&&!n)throw Error("Neither CRT nor JS SigV4a implementation is available. Please load either @aws-sdk/signature-v4-crt or @aws-sdk/signature-v4a. For more information please go to https://github.com/aws/aws-sdk-js-v3#functionality-requiring-aws-common-runtime-crt");if(t&&typeof t==="function")this.sigv4aSigner=new t({...this.signerOptions,signingAlgorithm:1});else if(n&&typeof n==="function")this.sigv4aSigner=new n({...this.signerOptions});else throw Error("Available SigV4a implementation is not a valid constructor. Please ensure you've properly imported @aws-sdk/signature-v4-crt or @aws-sdk/signature-v4a.For more information please go to https://github.com/aws/aws-sdk-js-v3#functionality-requiring-aws-common-runtime-crt")}else{if(!n||typeof n!=="function")throw Error("JS SigV4a implementation is not available or not a valid constructor. Please check whether you have installed the @aws-sdk/signature-v4a package explicitly. The CRT implementation is not available for browsers. You must also register the package by calling [require('@aws-sdk/signature-v4a');] or an ESM equivalent such as [import '@aws-sdk/signature-v4a';]. For more information please go to https://github.com/aws/aws-sdk-js-v3#using-javascript-non-crt-implementation-of-sigv4a");this.sigv4aSigner=new n({...this.signerOptions})}}return this.sigv4aSigner}}var Ri;var VE=A(()=>{WE();Ni();Ri=tt(ui(),1)});var KE=A(()=>{VE();Ni()});var pE="UNSIGNED-PAYLOAD",jE="X-Amz-Content-Sha256";class zn{signer;constructor(t){let n={service:t.signingName||t.service||"s3",uriEscapePath:t.uriEscapePath||!1,applyChecksum:t.applyChecksum||!1,...t};this.signer=new Ai(n)}presign(t,{unsignableHeaders:n=new Set,hoistableHeaders:o=new Set,unhoistableHeaders:i=new Set,...e}={}){return this.prepareRequest(t,{unsignableHeaders:n,unhoistableHeaders:i,hoistableHeaders:o}),this.signer.presign(t,{expiresIn:900,unsignableHeaders:n,unhoistableHeaders:i,...e})}presignWithCredentials(t,n,{unsignableHeaders:o=new Set,hoistableHeaders:i=new Set,unhoistableHeaders:e=new Set,...r}={}){return this.prepareRequest(t,{unsignableHeaders:o,unhoistableHeaders:e,hoistableHeaders:i}),this.signer.presignWithCredentials(t,n,{expiresIn:900,unsignableHeaders:o,unhoistableHeaders:e,...r})}prepareRequest(t,{unsignableHeaders:n=new Set,unhoistableHeaders:o=new Set,hoistableHeaders:i=new Set}={}){n.add("content-type"),Object.keys(t.headers).map((u)=>u.toLowerCase()).filter((u)=>u.startsWith("x-amz-server-side-encryption")).forEach((u)=>{if(!i.has(u))o.add(u)}),t.headers[jE]=pE;let e=t.headers.host,r=t.port,E=`${t.hostname}${t.port!=null?":"+r:""}`;if(!e||e===t.hostname&&t.port!=null)t.headers.host=E}}var yi=A(()=>{KE()});var hE,kE=async(t,n,o={})=>{let i,e;if(typeof t.config.endpointProvider==="function"){let _=(await Fr(n.input,n.constructor,t.config)).properties?.authSchemes?.[0];if(_?.name==="sigv4a")e=_?.signingRegionSet?.join(",");else e=_?.signingRegion;i=new zn({...t.config,signingName:_?.signingName,region:async()=>e})}else i=new zn(t.config);let r=(l,_)=>async(O)=>{let{request:L}=O;if(!hE.HttpRequest.isInstance(L))throw Error("Request to be presigned is not an valid HTTP request.");delete L.headers["amz-sdk-invocation-id"],delete L.headers["amz-sdk-request"],delete L.headers["x-amz-user-agent"];let F,X={...o,signingRegion:o.signingRegion??_.signing_region??e,signingService:o.signingService??_.signing_service};if(_.s3ExpressIdentity)F=await i.presignWithCredentials(L,_.s3ExpressIdentity,X);else F=await i.presign(L,X);return{response:{},output:{$metadata:{httpStatusCode:200},presigned:F}}},E="presignInterceptMiddleware",u=t.middlewareStack.clone();u.addRelativeTo(r,{name:E,relation:"before",toMiddleware:"awsAuthMiddleware",override:!0});let T=n.resolveMiddleware(u,t.config,{}),{output:N}=await T({input:n.input}),{presigned:R}=N;return Be(R)};var zE=A(()=>{We();mr();yi();hE=tt(bo(),1)});var dE=A(()=>{zE();yi()});import{S3Client as mE,PutObjectCommand as Iy,GetObjectCommand as bE,DeleteObjectCommand as Uy,CopyObjectCommand as Sy,ListObjectsV2Command as $y,HeadObjectCommand as Xy,ListObjectVersionsCommand as Cy,GetBucketVersioningCommand as Py,PutBucketVersioningCommand as vy}from"@aws-sdk/client-s3";class $t{client;presignClient;bucket;versioningEnabled=!1;constructor(t){this.bucket=t.bucket;let n={accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey};this.client=new mE({region:t.region,endpoint:t.endpoint,credentials:n,forcePathStyle:!0}),this.presignClient=new mE({region:t.region,endpoint:t.publicEndpoint??t.endpoint,credentials:n,forcePathStyle:!0}),this.versioningEnabled=t.versioningEnabled??!1}async putObject(t,n,o,i){let e=await this.client.send(new Iy({Bucket:this.bucket,Key:t,Body:typeof n==="string"?Buffer.from(n):n,Metadata:o,...i&&{ContentType:i}}));return{etag:e.ETag,versionId:e.VersionId}}async getObject(t,n){let o=await this.client.send(new bE({Bucket:this.bucket,Key:t,...n&&{VersionId:n}}));return{body:await o.Body.transformToByteArray(),contentType:o.ContentType,size:o.ContentLength,versionId:o.VersionId,etag:o.ETag}}async deleteObject(t){await this.client.send(new Uy({Bucket:this.bucket,Key:t}))}async copyObject(t,n){let o=await this.client.send(new Sy({Bucket:this.bucket,CopySource:`${this.bucket}/${t}`,Key:n}));return{etag:o.CopyObjectResult?.ETag,versionId:o.VersionId}}async listObjects(t,n){let o=await this.client.send(new $y({Bucket:this.bucket,Prefix:t,...n?.delimiter&&{Delimiter:n.delimiter}}));return{objects:(o.Contents??[]).map((i)=>({key:i.Key,size:i.Size??0,lastModified:i.LastModified??new Date,etag:i.ETag})),prefixes:(o.CommonPrefixes??[]).map((i)=>i.Prefix)}}async headObject(t){let n=await this.client.send(new Xy({Bucket:this.bucket,Key:t}));return{contentType:n.ContentType,size:n.ContentLength??0,lastModified:n.LastModified,etag:n.ETag,versionId:n.VersionId}}async listObjectVersions(t){return((await this.client.send(new Cy({Bucket:this.bucket,Prefix:t}))).Versions??[]).filter((o)=>o.Key===t).map((o)=>({versionId:o.VersionId,lastModified:o.LastModified??new Date,size:o.Size??0,isLatest:o.IsLatest??!1}))}async checkVersioningEnabled(){try{return(await this.client.send(new Py({Bucket:this.bucket}))).Status==="Enabled"}catch{return!1}}async enableVersioning(){try{return await this.client.send(new vy({Bucket:this.bucket,VersioningConfiguration:{Status:"Enabled"}})),this.versioningEnabled=!0,!0}catch{return!1}}async getPresignedUrl(t,n=86400,o){let i=new bE({Bucket:this.bucket,Key:t,...o&&{ResponseContentType:o}});return kE(this.presignClient,i,{expiresIn:n})}}var qE=A(()=>{dE()});var sE=A(()=>{qE()});var Rt,v,nt,ot,Ln,it;var z=A(()=>{Rt=class Rt extends Error{code;suggestion;constructor(t,n,o){super(n);this.name=this.constructor.name,this.code=t,this.suggestion=o}toJSON(){return{error:this.code,message:this.message,...this.suggestion&&{suggestion:this.suggestion}}}};v=class v extends Rt{path;constructor(t,n){super("NOT_FOUND",t,n?.suggestion);this.path=n?.path}toJSON(){return{...super.toJSON(),...this.path&&{path:this.path}}}};nt=class nt extends Rt{requiredRole;yourRole;constructor(t,n){super("PERMISSION_DENIED",t,n?.suggestion);this.requiredRole=n?.requiredRole,this.yourRole=n?.yourRole}toJSON(){return{...super.toJSON(),...this.requiredRole&&{required_role:this.requiredRole},...this.yourRole&&{your_role:this.yourRole}}}};ot=class ot extends Rt{path;constructor(t,n){super("EDIT_CONFLICT",t,n?.suggestion);this.path=n?.path}toJSON(){return{...super.toJSON(),...this.path&&{path:this.path}}}};Ln=class Ln extends Rt{path;constructor(t,n){super("INDEXING_IN_PROGRESS",t,n?.suggestion??"Try again in a moment");this.path=n?.path}toJSON(){return{...super.toJSON(),...this.path&&{path:this.path}}}};it=class it extends Rt{field;constructor(t,n){super("VALIDATION_ERROR",t,n?.suggestion);this.field=n?.field}toJSON(){return{...super.toJSON(),...this.field&&{field:this.field}}}}});import{eq as cE,and as My}from"drizzle-orm";function Dn(t){return Fy[t]??"admin"}function At(t,n,o){return t.select().from(f.driveMembers).where(My(cE(f.driveMembers.driveId,o),cE(f.driveMembers.userId,n))).get()?.role??null}function On(t,n){let o=At(t,n.userId,n.driveId);if(!o)throw new nt("You do not have access to this drive",{requiredRole:n.requiredRole,yourRole:"none",suggestion:"Request access from the drive admin"});if(xE[o]<xE[n.requiredRole])throw new nt(`This operation requires '${n.requiredRole}' role, but you have '${o}'`,{requiredRole:n.requiredRole,yourRole:o,suggestion:n.requiredRole==="editor"?"Ask a drive admin to upgrade your role to editor":"Ask a drive admin to upgrade your role"})}var xE,Fy;var dn=A(()=>{H();z();xE={viewer:0,editor:1,admin:2},Fy={ls:"viewer",cat:"viewer",tail:"viewer",stat:"viewer",grep:"viewer",fts:"viewer",search:"viewer","vec-search":"viewer",log:"viewer",diff:"viewer",recent:"viewer",tree:"viewer",glob:"viewer","signed-url":"viewer",write:"editor",edit:"editor",append:"editor",rm:"editor",mv:"editor",cp:"editor",revert:"editor",reindex:"admin","comment-add":"editor","comment-list":"viewer","comment-get":"viewer","comment-update":"editor","comment-delete":"editor","comment-resolve":"editor"}});function In(t){let n=t;if(!n.startsWith("/"))n="/"+n;if(n.length>1&&n.endsWith("/"))n=n.slice(0,-1);return n}function Xt(t){let n=t;if(!n.startsWith("/"))n="/"+n;if(!n.endsWith("/"))n+="/";return n}function aE(t){return t.startsWith("/")?t.slice(1):t}import{eq as yt,and as Un,sql as Yy,desc as tf}from"drizzle-orm";function U(t,n,o){let i=aE(o);return`${t}/drives/${n}/${i}`}async function mn(t,n){return(t.db.select({maxVersion:Yy`MAX(version)`}).from(f.fileVersions).where(Un(yt(f.fileVersions.path,n),yt(f.fileVersions.driveId,t.driveId))).get()?.maxVersion??0)+1}function ct(t,n){let o=t.db.select({version:f.fileVersions.version,contentHash:f.fileVersions.contentHash,etag:f.fileVersions.etag,createdAt:f.fileVersions.createdAt}).from(f.fileVersions).where(Un(yt(f.fileVersions.path,n),yt(f.fileVersions.driveId,t.driveId))).orderBy(tf(f.fileVersions.version)).limit(1).get();if(!o)return null;return{version:o.version,contentHash:o.contentHash??null,etag:o.etag??null,createdAt:o.createdAt}}async function h(t,n,o){let e=await mn(t,n)-1;if(o!==void 0&&e!==o)throw new ot(`Expected version ${o} but file is at version ${e}`,{path:n,suggestion:"Re-read the file to get the current version and retry"});return e}async function bn(t,n){return t.db.select({contentHash:f.fileVersions.contentHash}).from(f.fileVersions).where(Un(yt(f.fileVersions.path,n),yt(f.fileVersions.driveId,t.driveId))).orderBy(tf(f.fileVersions.version)).limit(1).get()?.contentHash??null}async function p(t,n){let o=await mn(t,n.path),i=new Date;try{t.db.transaction((e)=>{e.insert(f.fileVersions).values({path:n.path,driveId:t.driveId,version:o,s3VersionId:n.s3VersionId,author:t.userId,operation:n.operation,message:n.message??null,diffSummary:n.diffSummary??null,size:n.size??null,etag:n.etag??null,contentHash:n.contentHash??null,createdAt:i}).run();let r=e.select().from(f.files).where(Un(yt(f.files.path,n.path),yt(f.files.driveId,t.driveId))).get();if(r)e.update(f.files).set({size:n.size??r.size,contentType:n.contentType??r.contentType,author:t.userId,currentVersionId:String(o),modifiedAt:i,isDeleted:n.operation==="delete"}).where(Un(yt(f.files.path,n.path),yt(f.files.driveId,t.driveId))).run();else e.insert(f.files).values({path:n.path,driveId:t.driveId,size:n.size??0,contentType:n.contentType??null,author:t.userId,currentVersionId:String(o),createdAt:i,modifiedAt:i,isDeleted:n.operation==="delete"}).run()})}catch(e){let r=String(e?.message??"");if(r.includes("UNIQUE constraint failed")&&r.includes("file_versions"))throw new ot(`Concurrent write detected for ${n.path}: version ${o} already exists`,{path:n.path,suggestion:"Re-read the file to get the current version and retry the write"});throw e}return o}var V=A(()=>{H();z()});function lt(t){let n=t.split(".").pop()?.toLowerCase()??"";return Gy[n]??"application/octet-stream"}var Gy;var xt=A(()=>{Gy={png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",svg:"image/svg+xml",webp:"image/webp",ico:"image/x-icon",pdf:"application/pdf",txt:"text/plain",md:"text/markdown",mdx:"text/markdown",html:"text/html",css:"text/css",csv:"text/csv",xml:"application/xml",json:"application/json",yaml:"application/x-yaml",yml:"application/x-yaml",toml:"application/toml",ts:"text/plain",tsx:"text/plain",js:"text/javascript",jsx:"text/javascript",py:"text/x-python",rb:"text/x-ruby",rs:"text/x-rust",go:"text/x-go",java:"text/x-java",c:"text/x-c",cpp:"text/x-c++",h:"text/x-c",hpp:"text/x-c++",sh:"text/x-shellscript",sql:"text/x-sql",graphql:"text/x-graphql",zip:"application/zip",tar:"application/x-tar",gz:"application/gzip"}});function li(t){return t.$client}function s(t,n){let o=li(t);o.prepare("DELETE FROM files_fts WHERE path = ? AND drive_id = ?").run(n.path,n.driveId),o.prepare("INSERT INTO files_fts(path, content, drive_id) VALUES (?, ?, ?)").run(n.path,n.content,n.driveId)}function qn(t,n){li(t).prepare("DELETE FROM files_fts WHERE path = ? AND drive_id = ?").run(n.path,n.driveId)}function sn(t,n){let o=li(t),i,e;if(n.pathPrefix)i=`
144
+ ${$t.toHex(r)}`}getCanonicalPath({path:t}){if(this.uriEscapePath){let n=[];for(let e of t.split("/")){if(e?.length===0)continue;if(e===".")continue;if(e==="..")n.pop();else n.push(e)}let o=`${t?.startsWith("/")?"/":""}${n.join("/")}${n.length>0&&t?.endsWith("/")?"/":""}`;return kn.escapeUri(o).replace(/%2F/g,"/")}return t}validateResolvedCredentials(t){if(typeof t!=="object"||typeof t.accessKeyId!=="string"||typeof t.secretAccessKey!=="string")throw Error("Resolved credential object is not valid")}formatDate(t){let n=hR(t).replace(/[\-:]/g,"");return{longDate:n,shortDate:n.slice(0,8)}}getCanonicalHeaderList(t){return Object.keys(t).sort().join(";")}}class JE extends Ni{headerFormatter=new GE;constructor({applyChecksum:t,credentials:n,region:o,service:i,sha256:e,uriEscapePath:r=!0}){super({applyChecksum:t,credentials:n,region:o,service:i,sha256:e,uriEscapePath:r})}async presign(t,n={}){let{signingDate:o=new Date,expiresIn:i=3600,unsignableHeaders:e,unhoistableHeaders:r,signableHeaders:E,hoistableHeaders:f,signingRegion:T,signingService:l}=n,N=await this.credentialProvider();this.validateResolvedCredentials(N);let A=T??await this.regionProvider(),{longDate:w,shortDate:g}=this.formatDate(o);if(i>vE)return Promise.reject("Signature version 4 presigned URLs must have an expiration date less than one week in the future");let O=zn(g,A,l??this.service),D=ZE(ii(t),{unhoistableHeaders:r,hoistableHeaders:f});if(N.sessionToken)D.query[Ei]=N.sessionToken;D.query[yE]=dn,D.query[LE]=`${N.accessKeyId}/${O}`,D.query[ei]=w,D.query[DE]=i.toString(10);let C=oi(D,e,E);return D.query[gE]=this.getCanonicalHeaderList(C),D.query[ri]=await this.getSignature(w,O,this.getSigningKey(N,A,g,l),this.createCanonicalRequest(D,C,await bn(t,this.sha256))),D}async sign(t,n){if(typeof t==="string")return this.signString(t,n);else if(t.headers&&t.payload)return this.signEvent(t,n);else if(t.message)return this.signMessage(t,n);else return this.signRequest(t,n)}async signEvent({headers:t,payload:n},{signingDate:o=new Date,priorSignature:i,signingRegion:e,signingService:r}){let E=e??await this.regionProvider(),{shortDate:f,longDate:T}=this.formatDate(o),l=zn(f,E,r??this.service),N=await bn({headers:{},body:n},this.sha256),A=new this.sha256;A.update(t);let w=$t.toHex(await A.digest()),g=[PE,T,l,i,w,N].join(`
145
+ `);return this.signString(g,{signingDate:o,signingRegion:E,signingService:r})}async signMessage(t,{signingDate:n=new Date,signingRegion:o,signingService:i}){return this.signEvent({headers:this.headerFormatter.format(t.message.headers),payload:t.message.body},{signingDate:n,signingRegion:o,signingService:i,priorSignature:t.priorSignature}).then((r)=>{return{message:t.message,signature:r}})}async signString(t,{signingDate:n=new Date,signingRegion:o,signingService:i}={}){let e=await this.credentialProvider();this.validateResolvedCredentials(e);let r=o??await this.regionProvider(),{shortDate:E}=this.formatDate(n),f=new this.sha256(await this.getSigningKey(e,r,E,i));return f.update(Zt.toUint8Array(t)),$t.toHex(await f.digest())}async signRequest(t,{signingDate:n=new Date,signableHeaders:o,unsignableHeaders:i,signingRegion:e,signingService:r}={}){let E=await this.credentialProvider();this.validateResolvedCredentials(E);let f=e??await this.regionProvider(),T=ii(t),{longDate:l,shortDate:N}=this.formatDate(n),A=zn(N,f,r??this.service);if(T.headers[fi]=l,E.sessionToken)T.headers[SE]=E.sessionToken;let w=await bn(T,this.sha256);if(!HE(qn,T.headers)&&this.applyChecksum)T.headers[qn]=w;let g=oi(T,i,o),O=await this.getSignature(l,A,this.getSigningKey(E,f,N,r),this.createCanonicalRequest(T,g,w));return T.headers[ui]=`${dn} Credential=${E.accessKeyId}/${A}, SignedHeaders=${this.getCanonicalHeaderList(g)}, Signature=${O}`,T}async getSignature(t,n,o,i){let e=await this.createStringToSign(t,n,i,dn),r=new this.sha256(await o);return r.update(Zt.toUint8Array(e)),$t.toHex(await r.digest())}getSigningKey(t,n,o,i){return YE(this.sha256,t,o,n,i||this.service)}}var kR={SignatureV4a:null};dR.ALGORITHM_IDENTIFIER=dn;dR.ALGORITHM_IDENTIFIER_V4A=WR;dR.ALGORITHM_QUERY_PARAM=yE;dR.ALWAYS_UNSIGNABLE_HEADERS=$E;dR.AMZ_DATE_HEADER=fi;dR.AMZ_DATE_QUERY_PARAM=ei;dR.AUTH_HEADER=ui;dR.CREDENTIAL_QUERY_PARAM=LE;dR.DATE_HEADER=OE;dR.EVENT_ALGORITHM_IDENTIFIER=PE;dR.EXPIRES_QUERY_PARAM=DE;dR.GENERATED_HEADERS=IE;dR.HOST_HEADER=BR;dR.KEY_TYPE_IDENTIFIER=Ti;dR.MAX_CACHE_SIZE=FE;dR.MAX_PRESIGNED_TTL=vE;dR.PROXY_HEADER_PATTERN=XE;dR.REGION_SET_PARAM=JR;dR.SEC_HEADER_PATTERN=CE;dR.SHA256_HEADER=qn;dR.SIGNATURE_HEADER=UE;dR.SIGNATURE_QUERY_PARAM=ri;dR.SIGNED_HEADERS_QUERY_PARAM=gE;dR.SignatureV4=JE;dR.SignatureV4Base=Ni;dR.TOKEN_HEADER=SE;dR.TOKEN_QUERY_PARAM=Ei;dR.UNSIGNABLE_PATTERNS=VR;dR.UNSIGNED_PAYLOAD=ME;dR.clearCredentialCache=KR;dR.createScope=zn;dR.getCanonicalHeaders=oi;dR.getCanonicalQuery=QE;dR.getPayloadHash=bn;dR.getSigningKey=YE;dR.hasHeader=HE;dR.moveHeadersToQuery=ZE;dR.prepareRequest=ii;dR.signatureV4aContainer=kR});var sn="X-Amz-S3session-Token",Ai;var BE=R(()=>{Ai=sn.toLowerCase()});function VE(t){return{accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey,expiration:t.expiration}}function WE(t,n){let o=setTimeout(()=>{throw Error("SignatureV4S3Express credential override was created but not called.")},10),i=t.credentialProvider,e=()=>{return clearTimeout(o),t.credentialProvider=i,Promise.resolve(n)};t.credentialProvider=e}var KE,cn;var pE=R(()=>{BE();KE=ot(Ri(),1);cn=class cn extends KE.SignatureV4{async signWithCredentials(t,n,o){let i=VE(n);t.headers[Ai]=n.sessionToken;let e=this;return WE(e,i),e.signRequest(t,o??{})}async presignWithCredentials(t,n,o){let i=VE(n);return delete t.headers[Ai],t.headers[sn]=n.sessionToken,t.query=t.query??{},t.query[sn]=n.sessionToken,WE(this,i),this.presign(t,o)}}});var hE=R(()=>{pE()});var jE=()=>{};var kE=()=>{};var dE=()=>{};var mE=R(()=>{oE();iE();eE();rE();hE();jE();kE();dE()});var Un;var _i=R(()=>{Un={CrtSignerV4:null}});class yi{sigv4aSigner;sigv4Signer;signerOptions;static sigv4aDependency(){if(typeof Un.CrtSignerV4==="function")return"crt";else if(typeof wi.signatureV4aContainer.SignatureV4a==="function")return"js";return"none"}constructor(t){this.sigv4Signer=new cn(t),this.signerOptions=t}async sign(t,n={}){if(n.signingRegion==="*")return this.getSigv4aSigner().sign(t,n);return this.sigv4Signer.sign(t,n)}async signWithCredentials(t,n,o={}){if(o.signingRegion==="*"){let i=this.getSigv4aSigner(),e=Un.CrtSignerV4;if(e&&i instanceof e)return i.signWithCredentials(t,n,o);else throw Error(`signWithCredentials with signingRegion '*' is only supported when using the CRT dependency @aws-sdk/signature-v4-crt. Please check whether you have installed the "@aws-sdk/signature-v4-crt" package explicitly. You must also register the package by calling [require("@aws-sdk/signature-v4-crt");] or an ESM equivalent such as [import "@aws-sdk/signature-v4-crt";]. For more information please go to https://github.com/aws/aws-sdk-js-v3#functionality-requiring-aws-common-runtime-crt`)}return this.sigv4Signer.signWithCredentials(t,n,o)}async presign(t,n={}){if(n.signingRegion==="*"){let o=this.getSigv4aSigner(),i=Un.CrtSignerV4;if(i&&o instanceof i)return o.presign(t,n);else throw Error(`presign with signingRegion '*' is only supported when using the CRT dependency @aws-sdk/signature-v4-crt. Please check whether you have installed the "@aws-sdk/signature-v4-crt" package explicitly. You must also register the package by calling [require("@aws-sdk/signature-v4-crt");] or an ESM equivalent such as [import "@aws-sdk/signature-v4-crt";]. For more information please go to https://github.com/aws/aws-sdk-js-v3#functionality-requiring-aws-common-runtime-crt`)}return this.sigv4Signer.presign(t,n)}async presignWithCredentials(t,n,o={}){if(o.signingRegion==="*")throw Error("Method presignWithCredentials is not supported for [signingRegion=*].");return this.sigv4Signer.presignWithCredentials(t,n,o)}getSigv4aSigner(){if(!this.sigv4aSigner){let t=Un.CrtSignerV4,n=wi.signatureV4aContainer.SignatureV4a;if(this.signerOptions.runtime==="node"){if(!t&&!n)throw Error("Neither CRT nor JS SigV4a implementation is available. Please load either @aws-sdk/signature-v4-crt or @aws-sdk/signature-v4a. For more information please go to https://github.com/aws/aws-sdk-js-v3#functionality-requiring-aws-common-runtime-crt");if(t&&typeof t==="function")this.sigv4aSigner=new t({...this.signerOptions,signingAlgorithm:1});else if(n&&typeof n==="function")this.sigv4aSigner=new n({...this.signerOptions});else throw Error("Available SigV4a implementation is not a valid constructor. Please ensure you've properly imported @aws-sdk/signature-v4-crt or @aws-sdk/signature-v4a.For more information please go to https://github.com/aws/aws-sdk-js-v3#functionality-requiring-aws-common-runtime-crt")}else{if(!n||typeof n!=="function")throw Error("JS SigV4a implementation is not available or not a valid constructor. Please check whether you have installed the @aws-sdk/signature-v4a package explicitly. The CRT implementation is not available for browsers. You must also register the package by calling [require('@aws-sdk/signature-v4a');] or an ESM equivalent such as [import '@aws-sdk/signature-v4a';]. For more information please go to https://github.com/aws/aws-sdk-js-v3#using-javascript-non-crt-implementation-of-sigv4a");this.sigv4aSigner=new n({...this.signerOptions})}}return this.sigv4aSigner}}var wi;var zE=R(()=>{mE();_i();wi=ot(Ri(),1)});var bE=R(()=>{zE();_i()});var qE="UNSIGNED-PAYLOAD",sE="X-Amz-Content-Sha256";class xn{signer;constructor(t){let n={service:t.signingName||t.service||"s3",uriEscapePath:t.uriEscapePath||!1,applyChecksum:t.applyChecksum||!1,...t};this.signer=new yi(n)}presign(t,{unsignableHeaders:n=new Set,hoistableHeaders:o=new Set,unhoistableHeaders:i=new Set,...e}={}){return this.prepareRequest(t,{unsignableHeaders:n,unhoistableHeaders:i,hoistableHeaders:o}),this.signer.presign(t,{expiresIn:900,unsignableHeaders:n,unhoistableHeaders:i,...e})}presignWithCredentials(t,n,{unsignableHeaders:o=new Set,hoistableHeaders:i=new Set,unhoistableHeaders:e=new Set,...r}={}){return this.prepareRequest(t,{unsignableHeaders:o,unhoistableHeaders:e,hoistableHeaders:i}),this.signer.presignWithCredentials(t,n,{expiresIn:900,unsignableHeaders:o,unhoistableHeaders:e,...r})}prepareRequest(t,{unsignableHeaders:n=new Set,unhoistableHeaders:o=new Set,hoistableHeaders:i=new Set}={}){n.add("content-type"),Object.keys(t.headers).map((f)=>f.toLowerCase()).filter((f)=>f.startsWith("x-amz-server-side-encryption")).forEach((f)=>{if(!i.has(f))o.add(f)}),t.headers[sE]=qE;let e=t.headers.host,r=t.port,E=`${t.hostname}${t.port!=null?":"+r:""}`;if(!e||e===t.hostname&&t.port!=null)t.headers.host=E}}var Li=R(()=>{bE()});var cE,xE=async(t,n,o={})=>{let i,e;if(typeof t.config.endpointProvider==="function"){let w=(await Vr(n.input,n.constructor,t.config)).properties?.authSchemes?.[0];if(w?.name==="sigv4a")e=w?.signingRegionSet?.join(",");else e=w?.signingRegion;i=new xn({...t.config,signingName:w?.signingName,region:async()=>e})}else i=new xn(t.config);let r=(A,w)=>async(g)=>{let{request:O}=g;if(!cE.HttpRequest.isInstance(O))throw Error("Request to be presigned is not an valid HTTP request.");delete O.headers["amz-sdk-invocation-id"],delete O.headers["amz-sdk-request"],delete O.headers["x-amz-user-agent"];let D,C={...o,signingRegion:o.signingRegion??w.signing_region??e,signingService:o.signingService??w.signing_service};if(w.s3ExpressIdentity)D=await i.presignWithCredentials(O,w.s3ExpressIdentity,C);else D=await i.presign(O,C);return{response:{},output:{$metadata:{httpStatusCode:200},presigned:D}}},E="presignInterceptMiddleware",f=t.middlewareStack.clone();f.addRelativeTo(r,{name:E,relation:"before",toMiddleware:"awsAuthMiddleware",override:!0});let T=n.resolveMiddleware(f,t.config,{}),{output:l}=await T({input:n.input}),{presigned:N}=l;return de(N)};var aE=R(()=>{me();nE();Li();cE=ot(xo(),1)});var tu=R(()=>{aE();Li()});import{S3Client as nu,PutObjectCommand as YA,GetObjectCommand as ou,DeleteObjectCommand as GA,CopyObjectCommand as HA,ListObjectsV2Command as ZA,HeadObjectCommand as QA,ListObjectVersionsCommand as JA,GetBucketVersioningCommand as BA,PutBucketVersioningCommand as VA}from"@aws-sdk/client-s3";class Xt{client;presignClient;bucket;versioningEnabled=!1;constructor(t){this.bucket=t.bucket;let n={accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey};this.client=new nu({region:t.region,endpoint:t.endpoint,credentials:n,forcePathStyle:!0}),this.presignClient=new nu({region:t.region,endpoint:t.publicEndpoint??t.endpoint,credentials:n,forcePathStyle:!0}),this.versioningEnabled=t.versioningEnabled??!1}async putObject(t,n,o,i){let e=await this.client.send(new YA({Bucket:this.bucket,Key:t,Body:typeof n==="string"?Buffer.from(n):n,Metadata:o,...i&&{ContentType:i}}));return{etag:e.ETag,versionId:e.VersionId}}async getObject(t,n){let o=await this.client.send(new ou({Bucket:this.bucket,Key:t,...n&&{VersionId:n}}));return{body:await o.Body.transformToByteArray(),contentType:o.ContentType,size:o.ContentLength,versionId:o.VersionId,etag:o.ETag}}async deleteObject(t){await this.client.send(new GA({Bucket:this.bucket,Key:t}))}async copyObject(t,n){let o=await this.client.send(new HA({Bucket:this.bucket,CopySource:`${this.bucket}/${t}`,Key:n}));return{etag:o.CopyObjectResult?.ETag,versionId:o.VersionId}}async listObjects(t,n){let o=await this.client.send(new ZA({Bucket:this.bucket,Prefix:t,...n?.delimiter&&{Delimiter:n.delimiter}}));return{objects:(o.Contents??[]).map((i)=>({key:i.Key,size:i.Size??0,lastModified:i.LastModified??new Date,etag:i.ETag})),prefixes:(o.CommonPrefixes??[]).map((i)=>i.Prefix)}}async headObject(t){let n=await this.client.send(new QA({Bucket:this.bucket,Key:t}));return{contentType:n.ContentType,size:n.ContentLength??0,lastModified:n.LastModified,etag:n.ETag,versionId:n.VersionId}}async listObjectVersions(t){return((await this.client.send(new JA({Bucket:this.bucket,Prefix:t}))).Versions??[]).filter((o)=>o.Key===t).map((o)=>({versionId:o.VersionId,lastModified:o.LastModified??new Date,size:o.Size??0,isLatest:o.IsLatest??!1}))}async checkVersioningEnabled(){try{return(await this.client.send(new BA({Bucket:this.bucket}))).Status==="Enabled"}catch{return!1}}async enableVersioning(){try{return await this.client.send(new VA({Bucket:this.bucket,VersioningConfiguration:{Status:"Enabled"}})),this.versioningEnabled=!0,!0}catch{return!1}}async getPresignedUrl(t,n=86400,o){let i=new ou({Bucket:this.bucket,Key:t,...o&&{ResponseContentType:o}});return xE(this.presignClient,i,{expiresIn:n})}}var iu=R(()=>{tu()});var eu=R(()=>{iu()});var Rt,F,it,et,Sn,c;var m=R(()=>{Rt=class Rt extends Error{code;suggestion;constructor(t,n,o){super(n);this.name=this.constructor.name,this.code=t,this.suggestion=o}toJSON(){return{error:this.code,message:this.message,...this.suggestion&&{suggestion:this.suggestion}}}};F=class F extends Rt{path;constructor(t,n){super("NOT_FOUND",t,n?.suggestion);this.path=n?.path}toJSON(){return{...super.toJSON(),...this.path&&{path:this.path}}}};it=class it extends Rt{requiredRole;yourRole;constructor(t,n){super("PERMISSION_DENIED",t,n?.suggestion);this.requiredRole=n?.requiredRole,this.yourRole=n?.yourRole}toJSON(){return{...super.toJSON(),...this.requiredRole&&{required_role:this.requiredRole},...this.yourRole&&{your_role:this.yourRole}}}};et=class et extends Rt{path;constructor(t,n){super("EDIT_CONFLICT",t,n?.suggestion);this.path=n?.path}toJSON(){return{...super.toJSON(),...this.path&&{path:this.path}}}};Sn=class Sn extends Rt{path;constructor(t,n){super("INDEXING_IN_PROGRESS",t,n?.suggestion??"Try again in a moment");this.path=n?.path}toJSON(){return{...super.toJSON(),...this.path&&{path:this.path}}}};c=class c extends Rt{field;constructor(t,n){super("VALIDATION_ERROR",t,n?.suggestion);this.field=n?.field}toJSON(){return{...super.toJSON(),...this.field&&{field:this.field}}}}});import{eq as ru,and as WA}from"drizzle-orm";function $n(t){return KA[t]??"admin"}function At(t,n,o){return t.select().from(u.driveMembers).where(WA(ru(u.driveMembers.driveId,o),ru(u.driveMembers.userId,n))).get()?.role??null}function Xn(t,n){let o=At(t,n.userId,n.driveId);if(!o)throw new it("You do not have access to this drive",{requiredRole:n.requiredRole,yourRole:"none",suggestion:"Request access from the drive admin"});if(Eu[o]<Eu[n.requiredRole])throw new it(`This operation requires '${n.requiredRole}' role, but you have '${o}'`,{requiredRole:n.requiredRole,yourRole:o,suggestion:n.requiredRole==="editor"?"Ask a drive admin to upgrade your role to editor":"Ask a drive admin to upgrade your role"})}var Eu,KA;var an=R(()=>{G();m();Eu={viewer:0,editor:1,admin:2},KA={ls:"viewer",cat:"viewer",tail:"viewer",stat:"viewer",grep:"viewer",fts:"viewer",search:"viewer","vec-search":"viewer",log:"viewer",diff:"viewer",recent:"viewer",tree:"viewer",glob:"viewer","signed-url":"viewer",write:"editor",edit:"editor",append:"editor",rm:"editor",mv:"editor",cp:"editor",revert:"editor",reindex:"admin","comment-add":"editor","comment-list":"viewer","comment-get":"viewer","comment-update":"editor","comment-delete":"editor","comment-resolve":"editor"}});function Cn(t){let n=t;if(!n.startsWith("/"))n="/"+n;if(n.length>1&&n.endsWith("/"))n=n.slice(0,-1);return n}function Ct(t){let n=t;if(!n.startsWith("/"))n="/"+n;if(!n.endsWith("/"))n+="/";return n}function uu(t){return t.startsWith("/")?t.slice(1):t}import{eq as _t,and as Pn,sql as pA,desc as fu}from"drizzle-orm";function I(t,n,o){let i=uu(o);return`${t}/drives/${n}/${i}`}async function to(t,n){return(t.db.select({maxVersion:pA`MAX(version)`}).from(u.fileVersions).where(Pn(_t(u.fileVersions.path,n),_t(u.fileVersions.driveId,t.driveId))).get()?.maxVersion??0)+1}function xt(t,n){let o=t.db.select({version:u.fileVersions.version,contentHash:u.fileVersions.contentHash,etag:u.fileVersions.etag,createdAt:u.fileVersions.createdAt}).from(u.fileVersions).where(Pn(_t(u.fileVersions.path,n),_t(u.fileVersions.driveId,t.driveId))).orderBy(fu(u.fileVersions.version)).limit(1).get();if(!o)return null;return{version:o.version,contentHash:o.contentHash??null,etag:o.etag??null,createdAt:o.createdAt}}async function j(t,n,o){let e=await to(t,n)-1;if(o!==void 0&&e!==o)throw new et(`Expected version ${o} but file is at version ${e}`,{path:n,suggestion:"Re-read the file to get the current version and retry"});return e}async function no(t,n){return t.db.select({contentHash:u.fileVersions.contentHash}).from(u.fileVersions).where(Pn(_t(u.fileVersions.path,n),_t(u.fileVersions.driveId,t.driveId))).orderBy(fu(u.fileVersions.version)).limit(1).get()?.contentHash??null}async function h(t,n){let o=await to(t,n.path),i=new Date;try{t.db.transaction((e)=>{e.insert(u.fileVersions).values({path:n.path,driveId:t.driveId,version:o,s3VersionId:n.s3VersionId,author:t.userId,operation:n.operation,message:n.message??null,diffSummary:n.diffSummary??null,size:n.size??null,etag:n.etag??null,contentHash:n.contentHash??null,createdAt:i}).run();let r=e.select().from(u.files).where(Pn(_t(u.files.path,n.path),_t(u.files.driveId,t.driveId))).get();if(r)e.update(u.files).set({size:n.size??r.size,contentType:n.contentType??r.contentType,author:t.userId,currentVersionId:String(o),modifiedAt:i,isDeleted:n.operation==="delete"}).where(Pn(_t(u.files.path,n.path),_t(u.files.driveId,t.driveId))).run();else e.insert(u.files).values({path:n.path,driveId:t.driveId,size:n.size??0,contentType:n.contentType??null,author:t.userId,currentVersionId:String(o),createdAt:i,modifiedAt:i,isDeleted:n.operation==="delete"}).run()})}catch(e){let r=String(e?.message??"");if(r.includes("UNIQUE constraint failed")&&r.includes("file_versions"))throw new et(`Concurrent write detected for ${n.path}: version ${o} already exists`,{path:n.path,suggestion:"Re-read the file to get the current version and retry the write"});throw e}return o}var W=R(()=>{G();m()});function K(t){let n=t.split(".").pop()?.toLowerCase()??"";return hA[n]??"application/octet-stream"}function jA(t){let n=t.split(";")[0]?.trim().toLowerCase()??"";return n.startsWith("text/")||n==="application/json"||n==="application/xml"||n==="application/x-yaml"||n==="application/toml"||n==="image/svg+xml"}function kA(t){try{return new TextDecoder("utf-8",{fatal:!0}).decode(t)}catch{return null}}function Pt(t,n){let o=kA(t);if(o===null)return null;if(jA(n))return o;if(n==="application/octet-stream"&&dA(t))return o;return null}function dA(t){if(t.length===0)return!0;let n=0;for(let o of t){if(o===0)return!1;let i=o===9||o===10||o===12||o===13;if(o<32&&!i)n++}return n/t.length<0.01}var hA;var rt=R(()=>{hA={png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",svg:"image/svg+xml",webp:"image/webp",ico:"image/x-icon",pdf:"application/pdf",txt:"text/plain",md:"text/markdown",mdx:"text/markdown",html:"text/html",css:"text/css",csv:"text/csv",xml:"application/xml",json:"application/json",yaml:"application/x-yaml",yml:"application/x-yaml",toml:"application/toml",ts:"text/plain",tsx:"text/plain",js:"text/javascript",jsx:"text/javascript",py:"text/x-python",rb:"text/x-ruby",rs:"text/x-rust",go:"text/x-go",java:"text/x-java",c:"text/x-c",cpp:"text/x-c++",h:"text/x-c",hpp:"text/x-c++",sh:"text/x-shellscript",sql:"text/x-sql",graphql:"text/x-graphql",zip:"application/zip",tar:"application/x-tar",gz:"application/gzip"}});function gi(t){return t.$client}function wt(t,n){let o=gi(t);o.prepare("DELETE FROM files_fts WHERE path = ? AND drive_id = ?").run(n.path,n.driveId),o.prepare("INSERT INTO files_fts(path, content, drive_id) VALUES (?, ?, ?)").run(n.path,n.content,n.driveId)}function at(t,n){gi(t).prepare("DELETE FROM files_fts WHERE path = ? AND drive_id = ?").run(n.path,n.driveId)}function oo(t,n){let o=gi(t),i,e;if(n.pathPrefix)i=`
146
146
  SELECT path, snippet(files_fts, 1, '<b>', '</b>', '...', 32) as snippet, rank
147
147
  FROM files_fts
148
148
  WHERE content MATCH ? AND drive_id = ? AND path LIKE ?
@@ -154,75 +154,76 @@ ${St.toHex(r)}`}getCanonicalPath({path:t}){if(this.uriEscapePath){let n=[];for(l
154
154
  WHERE content MATCH ? AND drive_id = ?
155
155
  ORDER BY rank
156
156
  LIMIT 50
157
- `,e=[n.pattern,n.driveId];return o.prepare(i).all(...e)}async function nf(t){try{let{RecursiveChunker:n}=await import("chonkie");return(await(await n.create({chunkSize:900})).chunk(t)).map((e)=>({content:e.text,charOffset:e.startIndex??0,tokenCount:e.tokenCount??Math.ceil(e.text.length/4)}))}catch{return Zy(t)}}function Zy(t){let i=[];if(t.length<=3600)return[{content:t,charOffset:0,tokenCount:Math.ceil(t.length/4)}];let e=0;while(e<t.length){let r=Math.min(e+3600,t.length),E=t.slice(e,r);if(r<t.length){let u=E.lastIndexOf(`
158
-
159
- `);if(u>1800)E=E.slice(0,u)}if(i.push({content:E,charOffset:e,tokenCount:Math.ceil(E.length/4)}),e+=E.length-512,e<=i[i.length-1].charOffset)e=i[i.length-1].charOffset+E.length}return i}import{eq as c,and as at}from"drizzle-orm";function Hy(t){return t.$client}class of{permits;waiting=[];constructor(t){this.permits=t}async acquire(){if(this.permits>0)return this.permits--,()=>this.release();return new Promise((t)=>{this.waiting.push(()=>{this.permits--,t(()=>this.release())})})}release(){this.permits++;let t=this.waiting.shift();if(t)t()}}async function _i(t,n,o){let i=Hy(t),e=t.select({isDeleted:f.files.isDeleted}).from(f.files).where(at(c(f.files.path,o.path),c(f.files.driveId,o.driveId))).get();if(!e||e.isDeleted)return;try{let r=await nf(o.content),E=r.map((R)=>R.content),u=await n.embedBatch(E),T=t.select({id:f.contentChunks.id}).from(f.contentChunks).where(at(c(f.contentChunks.filePath,o.path),c(f.contentChunks.driveId,o.driveId))).all();for(let R of T)i.prepare("DELETE FROM chunk_vectors WHERE chunk_id = ?").run(R.id);t.delete(f.contentChunks).where(at(c(f.contentChunks.filePath,o.path),c(f.contentChunks.driveId,o.driveId))).run();let N=i.prepare("INSERT INTO chunk_vectors(chunk_id, embedding) VALUES (?, ?)");for(let R=0;R<r.length;R++){let l=t.insert(f.contentChunks).values({filePath:o.path,driveId:o.driveId,chunkIndex:R,content:r[R].content,charOffset:r[R].charOffset,tokenCount:r[R].tokenCount}).returning({id:f.contentChunks.id}).get(),_=new Float32Array(u[R]);N.run(l.id,_)}t.update(f.files).set({embeddingStatus:"indexed"}).where(at(c(f.files.path,o.path),c(f.files.driveId,o.driveId))).run()}catch(r){throw t.update(f.files).set({embeddingStatus:"failed"}).where(at(c(f.files.path,o.path),c(f.files.driveId,o.driveId))).run(),r}}function Ct(t,n,o){if(!n)return;t.update(f.files).set({embeddingStatus:"pending"}).where(at(c(f.files.path,o.path),c(f.files.driveId,o.driveId))).run(),Qy.acquire().then(async(i)=>{try{await _i(t,n,o)}catch(e){console.error("Embedding failed",{path:o.path,error:e})}finally{i()}})}var Qy;var tn=A(()=>{H();Qy=new of(2)});import{createHash as Jy}from"crypto";async function cn(t,n){return ef(t,n,{maxSize:By})}async function gt(t,n){return ef(t,n,{maxSize:Wy})}async function ef(t,n,o){let i=U(t.orgId,t.driveId,n.path),e=n.content,r=Buffer.byteLength(e);if(r>o.maxSize){let R=(o.maxSize/1024/1024).toFixed(0);throw new it(`File size ${(r/1024/1024).toFixed(1)}MB exceeds the ${R}MB limit`,{field:"content",suggestion:"Split large files into smaller chunks"})}let E=Jy("sha256").update(e).digest("hex");if(n.expectedVersion!==void 0){let R=await h(t,n.path,n.expectedVersion);if(R>0){let l=await bn(t,n.path);if(l!==null&&l===E)return{version:R,path:n.path,size:r,contentHash:E,deduped:!0}}}let u=lt(n.path),T=await t.s3.putObject(i,e,void 0,u),N=await p(t,{path:n.path,s3VersionId:T.versionId??"",operation:"write",message:n.message,size:r,etag:T.etag,contentType:u,contentHash:E});return s(t.db,{path:n.path,driveId:t.driveId,content:e}),Ct(t.db,t.embeddingProvider??null,{path:n.path,driveId:t.driveId,content:e}),{version:N,path:n.path,size:r,contentHash:E,deduped:!1}}var By=10485760,Wy=52428800;var rf=A(()=>{V();xt();tn();z()});async function Ef(t,n){let o=U(t.orgId,t.driveId,n.path),i;try{i=(await t.s3.getObject(o)).body}catch(l){if(l?.name==="NoSuchKey"||l?.$metadata?.httpStatusCode===404)throw new v(`File not found: ${n.path}`,{path:n.path});throw l}let r=new TextDecoder().decode(i).split(`
160
- `),E=r.length,u=n.offset??0,T=n.limit??Vy,N=r.slice(u,u+T),R=u+T<E;return{content:N.join(`
161
- `),totalLines:E,truncated:R}}var Vy=200;var ff=A(()=>{V();z()});import{createHash as Ky}from"crypto";async function uf(t,n){let o=U(t.orgId,t.driveId,n.path);if(n.expectedVersion!==void 0)await h(t,n.path,n.expectedVersion);let i;try{i=(await t.s3.getObject(o)).body}catch(O){if(O?.name==="NoSuchKey"||O?.$metadata?.httpStatusCode===404)throw new v(`File not found: ${n.path}`,{path:n.path});throw O}let e=new TextDecoder().decode(i),r=e.split(n.old_string).length-1;if(r===0)throw new ot(`old_string not found in ${n.path}`,{path:n.path,suggestion:"Verify the exact text you want to replace"});if(r>1)throw new ot(`old_string found ${r} times in ${n.path}, expected exactly 1`,{path:n.path,suggestion:"Provide more surrounding context to make the match unique"});let E=e.replace(n.old_string,n.new_string),u=Buffer.byteLength(E),T=lt(n.path),N=Ky("sha256").update(E).digest("hex"),R=await t.s3.putObject(o,E,void 0,T),l=JSON.stringify({old:n.old_string,new:n.new_string}),_=await p(t,{path:n.path,s3VersionId:R.versionId??"",operation:"edit",message:n.message,diffSummary:l,size:u,etag:R.etag,contentType:T,contentHash:N});return s(t.db,{path:n.path,driveId:t.driveId,content:E}),Ct(t.db,t.embeddingProvider??null,{path:n.path,driveId:t.driveId,content:E}),{version:_,path:n.path,changes:1}}var Tf=A(()=>{V();z();xt();tn()});import{createHash as py}from"crypto";async function Nf(t,n){let o=U(t.orgId,t.driveId,n.path);if(n.expectedVersion!==void 0)await h(t,n.path,n.expectedVersion);let i="";try{let R=await t.s3.getObject(o);i=new TextDecoder().decode(R.body)}catch(R){if(R?.name==="NoSuchKey"||R?.$metadata?.httpStatusCode===404)throw new v(`File not found: ${n.path}`,{path:n.path});throw R}let e=i+n.content,r=Buffer.byteLength(e),E=lt(n.path),u=py("sha256").update(e).digest("hex"),T=await t.s3.putObject(o,e,void 0,E),N=await p(t,{path:n.path,s3VersionId:T.versionId??"",operation:"append",message:n.message,size:r,etag:T.etag,contentType:E,contentHash:u});return s(t.db,{path:n.path,driveId:t.driveId,content:e}),Ct(t.db,t.embeddingProvider??null,{path:n.path,driveId:t.driveId,content:e}),{version:N,size:r}}var Rf=A(()=>{V();z();xt();tn()});import{eq as Af,and as jy,like as hy}from"drizzle-orm";async function yf(t,n){let o=Xt(n.path??"/"),i=U(t.orgId,t.driveId,o),{objects:e,prefixes:r}=await t.s3.listObjects(i,{delimiter:"/"}),E=t.db.select().from(f.files).where(jy(Af(f.files.driveId,t.driveId),hy(f.files.path,o+"%"),Af(f.files.isDeleted,!1))).all(),u=new Map(E.map((N)=>[N.path,N])),T=[];for(let N of r){let R=N.slice(i.length).replace(/\/$/,"");if(R)T.push({name:R,type:"directory",size:0})}for(let N of e){let R=N.key.slice(i.length);if(!R)continue;let l=R.endsWith("/"),_=l?R.slice(0,-1):R;if(l)T.push({name:_,type:"directory",size:0});else{let O=o+_,L=u.get(O);T.push({name:_,type:"file",size:L?.size??N.size,author:L?.author,modifiedAt:L?.modifiedAt??N.lastModified})}}return{entries:T}}var lf=A(()=>{H();V()});import{eq as _f,and as ky}from"drizzle-orm";async function wf(t,n){let o=U(t.orgId,t.driveId,n.path),i;try{i=await t.s3.headObject(o)}catch(r){if(r?.name==="NotFound"||r?.$metadata?.httpStatusCode===404)throw new v(`File not found: ${n.path}`,{path:n.path});throw r}let e=t.db.select().from(f.files).where(ky(_f(f.files.path,n.path),_f(f.files.driveId,t.driveId))).get();return{path:n.path,size:i.size,contentType:i.contentType,author:e?.author??"unknown",currentVersion:e?.currentVersionId?parseInt(e.currentVersionId):void 0,createdAt:e?.createdAt??new Date,modifiedAt:e?.modifiedAt??i.lastModified??new Date,isDeleted:e?.isDeleted??!1,embeddingStatus:e?.embeddingStatus??void 0}}var gf=A(()=>{H();V();z()});import{eq as nn,and as wi}from"drizzle-orm";async function Lf(t,n){let o=U(t.orgId,t.driveId,n.path);if(n.expectedVersion!==void 0)await h(t,n.path,n.expectedVersion);await t.s3.deleteObject(o),await p(t,{path:n.path,s3VersionId:"",operation:"delete"}),qn(t.db,{path:n.path,driveId:t.driveId});let i=t.db.select({id:f.contentChunks.id}).from(f.contentChunks).where(wi(nn(f.contentChunks.filePath,n.path),nn(f.contentChunks.driveId,t.driveId))).all();if(i.length>0){let e=t.db.$client;for(let r of i)e.prepare("DELETE FROM chunk_vectors WHERE chunk_id = ?").run(r.id);t.db.delete(f.contentChunks).where(wi(nn(f.contentChunks.filePath,n.path),nn(f.contentChunks.driveId,t.driveId))).run()}return t.db.update(f.comments).set({isDeleted:!0,updatedAt:new Date}).where(wi(nn(f.comments.path,n.path),nn(f.comments.driveId,t.driveId))).run(),{path:n.path,deleted:!0}}var Df=A(()=>{H();V()});import{eq as Of,and as zy}from"drizzle-orm";import{createHash as dy}from"crypto";async function If(t,n){let o=U(t.orgId,t.driveId,n.from),i=U(t.orgId,t.driveId,n.to);if(n.expectedVersion!==void 0)await h(t,n.from,n.expectedVersion);let e=await t.s3.copyObject(o,i),r=await t.s3.headObject(i),E=await t.s3.getObject(i),u=new TextDecoder().decode(E.body),T=dy("sha256").update(E.body).digest("hex"),N=await p(t,{path:n.to,s3VersionId:e.versionId??"",operation:"write",message:n.message??`Moved from ${n.from}`,size:r.size,etag:e.etag,contentHash:T});return await t.s3.deleteObject(o),await p(t,{path:n.from,s3VersionId:"",operation:"delete",message:`Moved to ${n.to}`}),qn(t.db,{path:n.from,driveId:t.driveId}),s(t.db,{path:n.to,driveId:t.driveId,content:u}),t.db.update(f.contentChunks).set({filePath:n.to}).where(zy(Of(f.contentChunks.filePath,n.from),Of(f.contentChunks.driveId,t.driveId))).run(),{from:n.from,to:n.to,version:N}}var Uf=A(()=>{V();H()});import{createHash as my}from"crypto";async function Sf(t,n){let o=U(t.orgId,t.driveId,n.from),i=U(t.orgId,t.driveId,n.to);if(n.expectedVersion!==void 0)await h(t,n.to,n.expectedVersion);let e=await t.s3.copyObject(o,i),r=await t.s3.headObject(i),E=await t.s3.getObject(i),u=new TextDecoder().decode(E.body),T=my("sha256").update(E.body).digest("hex"),N=await p(t,{path:n.to,s3VersionId:e.versionId??"",operation:"write",message:`Copied from ${n.from}`,size:r.size,etag:e.etag,contentHash:T});return s(t.db,{path:n.to,driveId:t.driveId,content:u}),Ct(t.db,t.embeddingProvider??null,{path:n.to,driveId:t.driveId,content:u}),{from:n.from,to:n.to,version:N}}var $f=A(()=>{V();tn()});async function Xf(t,n){let o=U(t.orgId,t.driveId,n.path),i=n.lines??by,e;try{e=(await t.s3.getObject(o)).body}catch(l){if(l?.name==="NoSuchKey"||l?.$metadata?.httpStatusCode===404)throw new v(`File not found: ${n.path}`,{path:n.path});throw l}let E=new TextDecoder().decode(e).split(`
162
- `),u=E.length,T=Math.max(0,u-i),N=E.slice(T),R=T>0;return{content:N.join(`
163
- `),totalLines:u,truncated:R}}var by=20;var Cf=A(()=>{V();z()});import{eq as Pf,and as qy,desc as sy}from"drizzle-orm";async function vf(t,n){let o=n.limit??50;return{versions:t.db.select().from(f.fileVersions).where(qy(Pf(f.fileVersions.path,n.path),Pf(f.fileVersions.driveId,t.driveId))).orderBy(sy(f.fileVersions.version)).limit(o).all().map((e)=>({version:e.version,author:e.author,createdAt:e.createdAt,operation:e.operation,message:e.message??void 0,diffSummary:e.diffSummary??void 0,size:e.size??void 0}))}}var Mf=A(()=>{H()});import{eq as on,and as Ff}from"drizzle-orm";import{structuredPatch as cy}from"diff";async function Yf(t,n){let o=t.db.select().from(f.fileVersions).where(Ff(on(f.fileVersions.path,n.path),on(f.fileVersions.driveId,t.driveId),on(f.fileVersions.version,n.v1))).get(),i=t.db.select().from(f.fileVersions).where(Ff(on(f.fileVersions.path,n.path),on(f.fileVersions.driveId,t.driveId),on(f.fileVersions.version,n.v2))).get();if(!o||!i)throw new v(`Version ${!o?n.v1:n.v2} not found for ${n.path}`,{path:n.path});if(o.s3VersionId&&i.s3VersionId){let r=U(t.orgId,t.driveId,n.path);try{let[E,u]=await Promise.all([t.s3.getObject(r,o.s3VersionId),t.s3.getObject(r,i.s3VersionId)]),T=new TextDecoder().decode(E.body),N=new TextDecoder().decode(u.body),R=cy(n.path,n.path,T,N),l=[];for(let _ of R.hunks)for(let O of _.lines){let L=O.startsWith("+")?"add":O.startsWith("-")?"remove":"context";l.push({type:L,content:O.slice(1)})}return{changes:l}}catch(E){console.warn(`[diff] S3 content fetch failed for ${n.path}, falling back to diffSummary:`,E)}}let e=[];if(i.diffSummary)try{let r=JSON.parse(i.diffSummary);if(r.old)e.push({type:"remove",content:r.old});if(r.new)e.push({type:"add",content:r.new})}catch{e.push({type:"context",content:i.diffSummary})}return{changes:e}}var Gf=A(()=>{H();V();z()});import{eq as gi,and as xy}from"drizzle-orm";import{createHash as ay}from"crypto";async function Zf(t,n){if(n.expectedVersion!==void 0)await h(t,n.path,n.expectedVersion);let o=t.db.select().from(f.fileVersions).where(xy(gi(f.fileVersions.path,n.path),gi(f.fileVersions.driveId,t.driveId),gi(f.fileVersions.version,n.version))).get();if(!o)throw new v(`Version ${n.version} not found for ${n.path}`,{path:n.path});if(!o.s3VersionId)throw new Rt("VERSIONING_REQUIRED","S3 versioning required for revert","Enable S3 versioning on the bucket");let i=U(t.orgId,t.driveId,n.path),e=await t.s3.getObject(i,o.s3VersionId),r=lt(n.path),E=await t.s3.putObject(i,e.body,void 0,r),u=e.body.length,T=ay("sha256").update(e.body).digest("hex");return{version:await p(t,{path:n.path,s3VersionId:E.versionId??"",operation:"revert",message:`Reverted to version ${n.version}`,size:u,etag:E.etag,contentType:r,contentHash:T}),revertedTo:n.version}}var Hf=A(()=>{H();V();z();xt()});import{eq as Li,and as Qf,desc as tl,gte as nl,like as ol}from"drizzle-orm";async function Jf(t,n){let o=n.limit??50,i=t.db.select().from(f.fileVersions).where(Li(f.fileVersions.driveId,t.driveId)).$dynamic();if(n.path)i=i.where(Qf(Li(f.fileVersions.driveId,t.driveId),ol(f.fileVersions.path,n.path+"%")));if(n.since)i=i.where(Qf(Li(f.fileVersions.driveId,t.driveId),nl(f.fileVersions.createdAt,n.since)));return{entries:i.orderBy(tl(f.fileVersions.createdAt)).limit(o).all().map((r)=>({path:r.path,version:r.version,author:r.author,createdAt:r.createdAt,operation:r.operation,message:r.message??void 0,diffSummary:r.diffSummary??void 0,size:r.size??void 0}))}}var Bf=A(()=>{H()});async function Wf(t,n){let o=new RegExp(n.pattern),i=Xt(n.path),r=t.db.$client.prepare("SELECT path, content FROM files_fts WHERE drive_id = ? AND path LIKE ?").all(t.driveId,i+"%"),E=[];for(let u of r){let T=u.content.split(`
164
- `);for(let N=0;N<T.length;N++)if(o.test(T[N]))E.push({path:u.path,lineNumber:N+1,content:T[N]})}return{matches:E}}var Vf=()=>{};async function Kf(t,n){let i=sn(t.db,{pattern:n.pattern,driveId:t.driveId,pathPrefix:n.path}).map((e)=>({path:e.path,snippet:e.snippet,rank:e.rank}));if(i.length===0)return{matches:i,hint:`No exact token matches for "${n.pattern}". Try 'search' for semantic/fuzzy matching.`};return{matches:i}}var pf=()=>{};import{eq as Di,and as il}from"drizzle-orm";async function jf(t,n){let o=t.embeddingProvider;if(!o)return{results:[],hint:"No embedding provider configured. Set OPENAI_API_KEY or enable local embeddings to use semantic search."};let i=n.limit??10,e=await o.embed(n.query),r=new Float32Array(e),u=t.db.$client.prepare(`SELECT chunk_id, distance
157
+ `,e=[n.pattern,n.driveId];return o.prepare(i).all(...e)}async function Tu(t){try{let{RecursiveChunker:n}=await import("chonkie");return(await(await n.create({chunkSize:900})).chunk(t)).map((e)=>({content:e.text,charOffset:e.startIndex??0,tokenCount:e.tokenCount??Math.ceil(e.text.length/4)}))}catch{return mA(t)}}function mA(t){let i=[];if(t.length<=3600)return[{content:t,charOffset:0,tokenCount:Math.ceil(t.length/4)}];let e=0;while(e<t.length){let r=Math.min(e+3600,t.length),E=t.slice(e,r);if(r<t.length){let f=E.lastIndexOf(`
158
+
159
+ `);if(f>1800)E=E.slice(0,f)}if(i.push({content:E,charOffset:e,tokenCount:Math.ceil(E.length/4)}),e+=E.length-512,e<=i[i.length-1].charOffset)e=i[i.length-1].charOffset+E.length}return i}import{eq as a,and as tn}from"drizzle-orm";function zA(t){return t.$client}class lu{permits;waiting=[];constructor(t){this.permits=t}async acquire(){if(this.permits>0)return this.permits--,()=>this.release();return new Promise((t)=>{this.waiting.push(()=>{this.permits--,t(()=>this.release())})})}release(){this.permits++;let t=this.waiting.shift();if(t)t()}}async function Di(t,n,o){let i=zA(t),e=t.select({isDeleted:u.files.isDeleted}).from(u.files).where(tn(a(u.files.path,o.path),a(u.files.driveId,o.driveId))).get();if(!e||e.isDeleted)return;try{let r=await Tu(o.content),E=r.map((N)=>N.content),f=await n.embedBatch(E),T=t.select({id:u.contentChunks.id}).from(u.contentChunks).where(tn(a(u.contentChunks.filePath,o.path),a(u.contentChunks.driveId,o.driveId))).all();for(let N of T)i.prepare("DELETE FROM chunk_vectors WHERE chunk_id = ?").run(N.id);t.delete(u.contentChunks).where(tn(a(u.contentChunks.filePath,o.path),a(u.contentChunks.driveId,o.driveId))).run();let l=i.prepare("INSERT INTO chunk_vectors(chunk_id, embedding) VALUES (?, ?)");for(let N=0;N<r.length;N++){let A=t.insert(u.contentChunks).values({filePath:o.path,driveId:o.driveId,chunkIndex:N,content:r[N].content,charOffset:r[N].charOffset,tokenCount:r[N].tokenCount}).returning({id:u.contentChunks.id}).get(),w=new Float32Array(f[N]);l.run(A.id,w)}t.update(u.files).set({embeddingStatus:"indexed"}).where(tn(a(u.files.path,o.path),a(u.files.driveId,o.driveId))).run()}catch(r){throw t.update(u.files).set({embeddingStatus:"failed"}).where(tn(a(u.files.path,o.path),a(u.files.driveId,o.driveId))).run(),r}}function nn(t,n,o){if(!n)return;t.update(u.files).set({embeddingStatus:"pending"}).where(tn(a(u.files.path,o.path),a(u.files.driveId,o.driveId))).run(),bA.acquire().then(async(i)=>{try{await Di(t,n,o)}catch(e){console.error("Embedding failed",{path:o.path,error:e})}finally{i()}})}var bA;var Mn=R(()=>{G();bA=new lu(2)});import{eq as on,and as Oi}from"drizzle-orm";function Fn(t,n){at(t.db,{path:n,driveId:t.driveId});let o=t.db.select({id:u.contentChunks.id}).from(u.contentChunks).where(Oi(on(u.contentChunks.filePath,n),on(u.contentChunks.driveId,t.driveId))).all();if(o.length>0){let i=t.db.$client;for(let e of o)i.prepare("DELETE FROM chunk_vectors WHERE chunk_id = ?").run(e.id);t.db.delete(u.contentChunks).where(Oi(on(u.contentChunks.filePath,n),on(u.contentChunks.driveId,t.driveId))).run()}t.db.update(u.files).set({embeddingStatus:null}).where(Oi(on(u.files.path,n),on(u.files.driveId,t.driveId))).run()}function Ii(t,n,o){wt(t.db,{path:n,driveId:t.driveId,content:o}),nn(t.db,t.embeddingProvider??null,{path:n,driveId:t.driveId,content:o})}function en(t,n,o,i){let e=Pt(o,i);if(e===null)return Fn(t,n),null;return Ii(t,n,e),e}var rn=R(()=>{G();Mn();rt()});import{createHash as qA}from"crypto";async function io(t,n){let o=new TextEncoder().encode(n.content);return Nu(t,{...n,bytes:o,indexableText:n.content},{maxSize:sA})}async function Dt(t,n){return Nu(t,n,{maxSize:cA})}async function Nu(t,n,o){let i=I(t.orgId,t.driveId,n.path),e=n.bytes,r=e.byteLength;if(r>o.maxSize){let N=(o.maxSize/1024/1024).toFixed(0);throw new c(`File size ${(r/1024/1024).toFixed(1)}MB exceeds the ${N}MB limit`,{field:"content",suggestion:"Split large files into smaller chunks"})}let E=qA("sha256").update(e).digest("hex");if(n.expectedVersion!==void 0){let N=await j(t,n.path,n.expectedVersion);if(N>0){let A=await no(t,n.path);if(A!==null&&A===E)return{version:N,path:n.path,size:r,contentHash:E,deduped:!0}}}let f=K(n.path),T=await t.s3.putObject(i,e,void 0,f),l=await h(t,{path:n.path,s3VersionId:T.versionId??"",operation:"write",message:n.message,size:r,etag:T.etag,contentType:f,contentHash:E});if(n.indexableText!==void 0)Ii(t,n.path,n.indexableText);else en(t,n.path,e,f);return{version:l,path:n.path,size:r,contentHash:E,deduped:!1}}var sA=10485760,cA=52428800;var Ru=R(()=>{W();rt();m();rn()});async function Au(t,n){let o=I(t.orgId,t.driveId,n.path),i;try{let e=await t.s3.getObject(o);i=e.body;let r=e.contentType??K(n.path),E=Pt(i,r);if(E===null)throw new c(`File is not readable as text: ${n.path}`,{field:"path",suggestion:"Use `agent-fs download` or `agent-fs signed-url` for binary files"});let f=E.split(`
160
+ `),T=f.length,l=n.offset??0,N=n.limit??xA,A=f.slice(l,l+N),w=l+N<T;return{content:A.join(`
161
+ `),totalLines:T,truncated:w}}catch(e){if(e?.name==="NoSuchKey"||e?.$metadata?.httpStatusCode===404)throw new F(`File not found: ${n.path}`,{path:n.path});throw e}}var xA=200;var _u=R(()=>{W();m();rt()});import{createHash as aA}from"crypto";async function wu(t,n){let o=I(t.orgId,t.driveId,n.path);if(n.expectedVersion!==void 0)await j(t,n.path,n.expectedVersion);let i;try{i=(await t.s3.getObject(o)).body}catch(g){if(g?.name==="NoSuchKey"||g?.$metadata?.httpStatusCode===404)throw new F(`File not found: ${n.path}`,{path:n.path});throw g}let e=new TextDecoder().decode(i),r=e.split(n.old_string).length-1;if(r===0)throw new et(`old_string not found in ${n.path}`,{path:n.path,suggestion:"Verify the exact text you want to replace"});if(r>1)throw new et(`old_string found ${r} times in ${n.path}, expected exactly 1`,{path:n.path,suggestion:"Provide more surrounding context to make the match unique"});let E=e.replace(n.old_string,n.new_string),f=Buffer.byteLength(E),T=K(n.path),l=aA("sha256").update(E).digest("hex"),N=await t.s3.putObject(o,E,void 0,T),A=JSON.stringify({old:n.old_string,new:n.new_string}),w=await h(t,{path:n.path,s3VersionId:N.versionId??"",operation:"edit",message:n.message,diffSummary:A,size:f,etag:N.etag,contentType:T,contentHash:l});return wt(t.db,{path:n.path,driveId:t.driveId,content:E}),nn(t.db,t.embeddingProvider??null,{path:n.path,driveId:t.driveId,content:E}),{version:w,path:n.path,changes:1}}var yu=R(()=>{W();m();rt();Mn()});import{createHash as t_}from"crypto";async function Lu(t,n){let o=I(t.orgId,t.driveId,n.path);if(n.expectedVersion!==void 0)await j(t,n.path,n.expectedVersion);let i="";try{let N=await t.s3.getObject(o);i=new TextDecoder().decode(N.body)}catch(N){if(N?.name==="NoSuchKey"||N?.$metadata?.httpStatusCode===404)throw new F(`File not found: ${n.path}`,{path:n.path});throw N}let e=i+n.content,r=Buffer.byteLength(e),E=K(n.path),f=t_("sha256").update(e).digest("hex"),T=await t.s3.putObject(o,e,void 0,E),l=await h(t,{path:n.path,s3VersionId:T.versionId??"",operation:"append",message:n.message,size:r,etag:T.etag,contentType:E,contentHash:f});return wt(t.db,{path:n.path,driveId:t.driveId,content:e}),nn(t.db,t.embeddingProvider??null,{path:n.path,driveId:t.driveId,content:e}),{version:l,size:r}}var gu=R(()=>{W();m();rt();Mn()});import{eq as Du,and as n_,like as o_}from"drizzle-orm";async function Ou(t,n){let o=Ct(n.path??"/"),i=I(t.orgId,t.driveId,o),{objects:e,prefixes:r}=await t.s3.listObjects(i,{delimiter:"/"}),E=t.db.select().from(u.files).where(n_(Du(u.files.driveId,t.driveId),o_(u.files.path,o+"%"),Du(u.files.isDeleted,!1))).all(),f=new Map(E.map((l)=>[l.path,l])),T=[];for(let l of r){let N=l.slice(i.length).replace(/\/$/,"");if(N)T.push({name:N,type:"directory",size:0})}for(let l of e){let N=l.key.slice(i.length);if(!N)continue;let A=N.endsWith("/"),w=A?N.slice(0,-1):N;if(A)T.push({name:w,type:"directory",size:0});else{let g=o+w,O=f.get(g);T.push({name:w,type:"file",size:O?.size??l.size,author:O?.author,modifiedAt:O?.modifiedAt??l.lastModified})}}return{entries:T}}var Iu=R(()=>{G();W()});import{eq as Uu,and as i_}from"drizzle-orm";async function Su(t,n){let o=I(t.orgId,t.driveId,n.path),i;try{i=await t.s3.headObject(o)}catch(r){if(r?.name==="NotFound"||r?.$metadata?.httpStatusCode===404)throw new F(`File not found: ${n.path}`,{path:n.path});throw r}let e=t.db.select().from(u.files).where(i_(Uu(u.files.path,n.path),Uu(u.files.driveId,t.driveId))).get();return{path:n.path,size:i.size,contentType:i.contentType,author:e?.author??"unknown",currentVersion:e?.currentVersionId?parseInt(e.currentVersionId):void 0,createdAt:e?.createdAt??new Date,modifiedAt:e?.modifiedAt??i.lastModified??new Date,isDeleted:e?.isDeleted??!1,embeddingStatus:e?.embeddingStatus??void 0}}var $u=R(()=>{G();W();m()});import{eq as En,and as Ui}from"drizzle-orm";async function Xu(t,n){let o=I(t.orgId,t.driveId,n.path);if(n.expectedVersion!==void 0)await j(t,n.path,n.expectedVersion);await t.s3.deleteObject(o),await h(t,{path:n.path,s3VersionId:"",operation:"delete"}),at(t.db,{path:n.path,driveId:t.driveId});let i=t.db.select({id:u.contentChunks.id}).from(u.contentChunks).where(Ui(En(u.contentChunks.filePath,n.path),En(u.contentChunks.driveId,t.driveId))).all();if(i.length>0){let e=t.db.$client;for(let r of i)e.prepare("DELETE FROM chunk_vectors WHERE chunk_id = ?").run(r.id);t.db.delete(u.contentChunks).where(Ui(En(u.contentChunks.filePath,n.path),En(u.contentChunks.driveId,t.driveId))).run()}return t.db.update(u.comments).set({isDeleted:!0,updatedAt:new Date}).where(Ui(En(u.comments.path,n.path),En(u.comments.driveId,t.driveId))).run(),{path:n.path,deleted:!0}}var Cu=R(()=>{G();W()});import{eq as Pu,and as e_}from"drizzle-orm";import{createHash as r_}from"crypto";async function Mu(t,n){let o=I(t.orgId,t.driveId,n.from),i=I(t.orgId,t.driveId,n.to);if(n.expectedVersion!==void 0)await j(t,n.from,n.expectedVersion);let e=await t.s3.copyObject(o,i),r=await t.s3.headObject(i),E=await t.s3.getObject(i),f=r_("sha256").update(E.body).digest("hex"),T=r.contentType??E.contentType??K(n.to),l=await h(t,{path:n.to,s3VersionId:e.versionId??"",operation:"write",message:n.message??`Moved from ${n.from}`,size:r.size,etag:e.etag,contentType:T,contentHash:f});await t.s3.deleteObject(o),await h(t,{path:n.from,s3VersionId:"",operation:"delete",message:`Moved to ${n.to}`}),at(t.db,{path:n.from,driveId:t.driveId});let N=Pt(E.body,T);if(N===null)Fn(t,n.to);else wt(t.db,{path:n.to,driveId:t.driveId,content:N}),t.db.update(u.contentChunks).set({filePath:n.to}).where(e_(Pu(u.contentChunks.filePath,n.from),Pu(u.contentChunks.driveId,t.driveId))).run();return{from:n.from,to:n.to,version:l}}var Fu=R(()=>{W();G();rt();rn()});import{createHash as E_}from"crypto";async function vu(t,n){let o=I(t.orgId,t.driveId,n.from),i=I(t.orgId,t.driveId,n.to);if(n.expectedVersion!==void 0)await j(t,n.to,n.expectedVersion);let e=await t.s3.copyObject(o,i),r=await t.s3.headObject(i),E=await t.s3.getObject(i),f=E_("sha256").update(E.body).digest("hex"),T=r.contentType??E.contentType??K(n.to),l=await h(t,{path:n.to,s3VersionId:e.versionId??"",operation:"write",message:`Copied from ${n.from}`,size:r.size,etag:e.etag,contentType:T,contentHash:f});return en(t,n.to,E.body,T),{from:n.from,to:n.to,version:l}}var Yu=R(()=>{W();rt();rn()});async function Gu(t,n){let o=I(t.orgId,t.driveId,n.path),i=n.lines??u_,e;try{e=(await t.s3.getObject(o)).body}catch(A){if(A?.name==="NoSuchKey"||A?.$metadata?.httpStatusCode===404)throw new F(`File not found: ${n.path}`,{path:n.path});throw A}let E=new TextDecoder().decode(e).split(`
162
+ `),f=E.length,T=Math.max(0,f-i),l=E.slice(T),N=T>0;return{content:l.join(`
163
+ `),totalLines:f,truncated:N}}var u_=20;var Hu=R(()=>{W();m()});import{eq as Zu,and as f_,desc as T_}from"drizzle-orm";async function Qu(t,n){let o=n.limit??50;return{versions:t.db.select().from(u.fileVersions).where(f_(Zu(u.fileVersions.path,n.path),Zu(u.fileVersions.driveId,t.driveId))).orderBy(T_(u.fileVersions.version)).limit(o).all().map((e)=>({version:e.version,author:e.author,createdAt:e.createdAt,operation:e.operation,message:e.message??void 0,diffSummary:e.diffSummary??void 0,size:e.size??void 0}))}}var Ju=R(()=>{G()});import{eq as un,and as Bu}from"drizzle-orm";import{structuredPatch as l_}from"diff";async function Vu(t,n){let o=t.db.select().from(u.fileVersions).where(Bu(un(u.fileVersions.path,n.path),un(u.fileVersions.driveId,t.driveId),un(u.fileVersions.version,n.v1))).get(),i=t.db.select().from(u.fileVersions).where(Bu(un(u.fileVersions.path,n.path),un(u.fileVersions.driveId,t.driveId),un(u.fileVersions.version,n.v2))).get();if(!o||!i)throw new F(`Version ${!o?n.v1:n.v2} not found for ${n.path}`,{path:n.path});if(o.s3VersionId&&i.s3VersionId){let r=I(t.orgId,t.driveId,n.path);try{let[E,f]=await Promise.all([t.s3.getObject(r,o.s3VersionId),t.s3.getObject(r,i.s3VersionId)]),T=new TextDecoder().decode(E.body),l=new TextDecoder().decode(f.body),N=l_(n.path,n.path,T,l),A=[];for(let w of N.hunks)for(let g of w.lines){let O=g.startsWith("+")?"add":g.startsWith("-")?"remove":"context";A.push({type:O,content:g.slice(1)})}return{changes:A}}catch(E){console.warn(`[diff] S3 content fetch failed for ${n.path}, falling back to diffSummary:`,E)}}let e=[];if(i.diffSummary)try{let r=JSON.parse(i.diffSummary);if(r.old)e.push({type:"remove",content:r.old});if(r.new)e.push({type:"add",content:r.new})}catch{e.push({type:"context",content:i.diffSummary})}return{changes:e}}var Wu=R(()=>{G();W();m()});import{eq as Si,and as N_}from"drizzle-orm";import{createHash as R_}from"crypto";async function Ku(t,n){if(n.expectedVersion!==void 0)await j(t,n.path,n.expectedVersion);let o=t.db.select().from(u.fileVersions).where(N_(Si(u.fileVersions.path,n.path),Si(u.fileVersions.driveId,t.driveId),Si(u.fileVersions.version,n.version))).get();if(!o)throw new F(`Version ${n.version} not found for ${n.path}`,{path:n.path});if(!o.s3VersionId)throw new Rt("VERSIONING_REQUIRED","S3 versioning required for revert","Enable S3 versioning on the bucket");let i=I(t.orgId,t.driveId,n.path),e=await t.s3.getObject(i,o.s3VersionId),r=K(n.path),E=await t.s3.putObject(i,e.body,void 0,r),f=e.body.length,T=R_("sha256").update(e.body).digest("hex"),l=await h(t,{path:n.path,s3VersionId:E.versionId??"",operation:"revert",message:`Reverted to version ${n.version}`,size:f,etag:E.etag,contentType:r,contentHash:T});return en(t,n.path,e.body,r),{version:l,revertedTo:n.version}}var pu=R(()=>{G();W();m();rt();rn()});import{eq as $i,and as hu,desc as A_,gte as __,like as w_}from"drizzle-orm";async function ju(t,n){let o=n.limit??50,i=t.db.select().from(u.fileVersions).where($i(u.fileVersions.driveId,t.driveId)).$dynamic();if(n.path)i=i.where(hu($i(u.fileVersions.driveId,t.driveId),w_(u.fileVersions.path,n.path+"%")));if(n.since)i=i.where(hu($i(u.fileVersions.driveId,t.driveId),__(u.fileVersions.createdAt,n.since)));return{entries:i.orderBy(A_(u.fileVersions.createdAt)).limit(o).all().map((r)=>({path:r.path,version:r.version,author:r.author,createdAt:r.createdAt,operation:r.operation,message:r.message??void 0,diffSummary:r.diffSummary??void 0,size:r.size??void 0}))}}var ku=R(()=>{G()});async function du(t,n){let o=new RegExp(n.pattern),i=Ct(n.path),r=t.db.$client.prepare("SELECT path, content FROM files_fts WHERE drive_id = ? AND path LIKE ?").all(t.driveId,i+"%"),E=[];for(let f of r){let T=f.content.split(`
164
+ `);for(let l=0;l<T.length;l++)if(o.test(T[l]))E.push({path:f.path,lineNumber:l+1,content:T[l]})}return{matches:E}}var mu=()=>{};async function zu(t,n){let i=oo(t.db,{pattern:n.pattern,driveId:t.driveId,pathPrefix:n.path}).map((e)=>({path:e.path,snippet:e.snippet,rank:e.rank}));if(i.length===0)return{matches:i,hint:`No exact token matches for "${n.pattern}". Try 'search' for semantic/fuzzy matching.`};return{matches:i}}var bu=()=>{};import{eq as Xi,and as y_}from"drizzle-orm";async function qu(t,n){let o=t.embeddingProvider;if(!o)return{results:[],hint:"No embedding provider configured. Set OPENAI_API_KEY or enable local embeddings to use semantic search."};let i=n.limit??10,e=await o.embed(n.query),r=new Float32Array(e),f=t.db.$client.prepare(`SELECT chunk_id, distance
165
165
  FROM chunk_vectors
166
166
  WHERE embedding MATCH ?
167
167
  ORDER BY distance
168
- LIMIT ?`).all(r,i*2);if(u.length===0)return{results:[]};let T=[],N=new Set;for(let R of u){let l=t.db.select().from(f.contentChunks).where(Di(f.contentChunks.id,R.chunk_id)).get();if(!l)continue;if(l.driveId!==t.driveId)continue;if(N.has(l.filePath))continue;N.add(l.filePath);let _=t.db.select().from(f.files).where(il(Di(f.files.path,l.filePath),Di(f.files.driveId,t.driveId))).get();if(T.push({path:l.filePath,score:1/(1+R.distance),snippet:l.content.slice(0,200),author:_?.author,modifiedAt:_?.modifiedAt}),T.length>=i)break}return{results:T}}var hf=A(()=>{H()});import{eq as Oi,and as el}from"drizzle-orm";async function kf(t,n){let o=n.limit??10,i=t.embeddingProvider,[e,r]=await Promise.all([i?rl(t,n.query,o*3):[],El(t,n.query,o*3)]);if(e.length===0&&r.length===0)return{results:[],hint:i?`No results found for "${n.query}".`:"No embedding provider configured. Set OPENAI_API_KEY, GEMINI_API_KEY, or enable local embeddings for semantic search. Showing keyword results only."};let E=60,u=new Map;for(let N=0;N<e.length;N++){let R=e[N],l=1/(E+N+1),_=u.get(R.path);if(_)_.score+=l;else u.set(R.path,{score:l,snippet:R.snippet,author:R.author,modifiedAt:R.modifiedAt})}for(let N=0;N<r.length;N++){let R=r[N],l=1/(E+N+1),_=u.get(R.path);if(_){if(_.score+=l,R.snippet)_.snippet=R.snippet}else u.set(R.path,{score:l,snippet:R.snippet})}return{results:Array.from(u.entries()).sort(([,N],[,R])=>R.score-N.score).slice(0,o).map(([N,R])=>({path:N,score:R.score,snippet:R.snippet,author:R.author,modifiedAt:R.modifiedAt})),hint:!i?"Results are keyword-only. Enable embeddings for better semantic matching.":void 0}}async function rl(t,n,o){let e=await t.embeddingProvider.embed(n),r=new Float32Array(e),u=t.db.$client.prepare(`SELECT chunk_id, distance
168
+ LIMIT ?`).all(r,i*2);if(f.length===0)return{results:[]};let T=[],l=new Set;for(let N of f){let A=t.db.select().from(u.contentChunks).where(Xi(u.contentChunks.id,N.chunk_id)).get();if(!A)continue;if(A.driveId!==t.driveId)continue;if(l.has(A.filePath))continue;l.add(A.filePath);let w=t.db.select().from(u.files).where(y_(Xi(u.files.path,A.filePath),Xi(u.files.driveId,t.driveId))).get();if(T.push({path:A.filePath,score:1/(1+N.distance),snippet:A.content.slice(0,200),author:w?.author,modifiedAt:w?.modifiedAt}),T.length>=i)break}return{results:T}}var su=R(()=>{G()});import{eq as Ci,and as L_}from"drizzle-orm";async function cu(t,n){let o=n.limit??10,i=t.embeddingProvider,[e,r]=await Promise.all([i?g_(t,n.query,o*3):[],D_(t,n.query,o*3)]);if(e.length===0&&r.length===0)return{results:[],hint:i?`No results found for "${n.query}".`:"No embedding provider configured. Set OPENAI_API_KEY, GEMINI_API_KEY, or enable local embeddings for semantic search. Showing keyword results only."};let E=60,f=new Map;for(let l=0;l<e.length;l++){let N=e[l],A=1/(E+l+1),w=f.get(N.path);if(w)w.score+=A;else f.set(N.path,{score:A,snippet:N.snippet,author:N.author,modifiedAt:N.modifiedAt})}for(let l=0;l<r.length;l++){let N=r[l],A=1/(E+l+1),w=f.get(N.path);if(w){if(w.score+=A,N.snippet)w.snippet=N.snippet}else f.set(N.path,{score:A,snippet:N.snippet})}return{results:Array.from(f.entries()).sort(([,l],[,N])=>N.score-l.score).slice(0,o).map(([l,N])=>({path:l,score:N.score,snippet:N.snippet,author:N.author,modifiedAt:N.modifiedAt})),hint:!i?"Results are keyword-only. Enable embeddings for better semantic matching.":void 0}}async function g_(t,n,o){let e=await t.embeddingProvider.embed(n),r=new Float32Array(e),f=t.db.$client.prepare(`SELECT chunk_id, distance
169
169
  FROM chunk_vectors
170
170
  WHERE embedding MATCH ?
171
171
  ORDER BY distance
172
- LIMIT ?`).all(r,o),T=[],N=new Set;for(let R of u){let l=t.db.select().from(f.contentChunks).where(Oi(f.contentChunks.id,R.chunk_id)).get();if(!l||l.driveId!==t.driveId)continue;if(N.has(l.filePath))continue;N.add(l.filePath);let _=t.db.select().from(f.files).where(el(Oi(f.files.path,l.filePath),Oi(f.files.driveId,t.driveId))).get();T.push({path:l.filePath,snippet:l.content.slice(0,200),author:_?.author,modifiedAt:_?.modifiedAt})}return T}function El(t,n,o){let i=n.split(/\s+/).filter(Boolean).map((e)=>`"${e}"`).join(" OR ");if(!i)return[];try{return sn(t.db,{pattern:i,driveId:t.driveId}).slice(0,o).map((r)=>({path:r.path,snippet:r.snippet}))}catch{return[]}}var zf=A(()=>{H()});import{eq as xn,and as fl,or as ul,isNull as Tl}from"drizzle-orm";async function df(t,n){let o=[xn(f.files.driveId,t.driveId),xn(f.files.isDeleted,!1),ul(xn(f.files.embeddingStatus,"failed"),Tl(f.files.embeddingStatus),xn(f.files.embeddingStatus,"pending"))];if(n.path){let{like:T}=await import("drizzle-orm"),N=n.path.endsWith("/")?n.path:n.path+"/";o.push(T(f.files.path,N+"%"))}let i=t.db.select({path:f.files.path}).from(f.files).where(fl(...o)).all(),e=0,r=0,E=0,u=3;for(let T=0;T<i.length;T+=u){let N=i.slice(T,T+u),R=await Promise.allSettled(N.map(async(l)=>{let _=U(t.orgId,t.driveId,l.path),O=await t.s3.getObject(_),L=new TextDecoder().decode(O.body);if(s(t.db,{path:l.path,driveId:t.driveId,content:L}),t.embeddingProvider)return await _i(t.db,t.embeddingProvider,{path:l.path,driveId:t.driveId,content:L}),"reindexed";return"skipped"}));for(let l of R)if(l.status==="fulfilled")if(l.value==="reindexed")e++;else E++;else console.error("Reindex failed:",l.reason),r++}return{reindexed:e,failed:r,skipped:E}}var mf=A(()=>{H();V();tn()});import{eq as bf,and as Nl,like as Rl}from"drizzle-orm";async function qf(t,n){let o=Xt(n.path??"/"),i=U(t.orgId,t.driveId,o),{objects:e}=await t.s3.listObjects(i),r=t.db.select().from(f.files).where(Nl(bf(f.files.driveId,t.driveId),Rl(f.files.path,o+"%"),bf(f.files.isDeleted,!1))).all(),E=new Map(r.map((T)=>[T.path,T])),u=[];for(let T of e){let N=T.key.slice(i.length);if(!N)continue;let R=N.split("/").filter(Boolean);if(R.length===0)continue;if(n.depth!==void 0&&R.length>n.depth)continue;let l=u;for(let _=0;_<R.length;_++){let O=R[_],L=_===R.length-1,F=!L||N.endsWith("/");if(F&&!L){let X=l.find((Z)=>Z.name===O&&Z.type==="directory");if(!X)X={name:O,type:"directory",children:[]},l.push(X);if(!X.children)X.children=[];l=X.children}else if(F&&L){let X=l.find((Z)=>Z.name===O&&Z.type==="directory");if(!X)X={name:O,type:"directory",children:[]},l.push(X)}else{let X=o+R.slice(0,_+1).join("/"),Z=E.get(X),Tn={name:O,type:"file",size:Z?.size??T.size};if(Z?.author)Tn.author=Z.author;if(Z?.modifiedAt??T.lastModified)Tn.modifiedAt=Z?.modifiedAt??T.lastModified;l.push(Tn)}}}return{tree:u}}var sf=A(()=>{H();V()});import{eq as cf,and as Al,like as yl}from"drizzle-orm";function ll(t){let n="",o=0;while(o<t.length){let i=t[o];if(i==="*")if(t[o+1]==="*"){if(n+=".*",o+=2,t[o]==="/")o++}else n+="[^/]*",o++;else if(i==="?")n+="[^/]",o++;else if(".+^${}()|[]\\".includes(i))n+="\\"+i,o++;else n+=i,o++}return new RegExp("^"+n+"$")}async function xf(t,n){let o=n.path?Xt(n.path):"/",i=U(t.orgId,t.driveId,o),{objects:e}=await t.s3.listObjects(i),r=t.db.select().from(f.files).where(Al(cf(f.files.driveId,t.driveId),yl(f.files.path,o+"%"),cf(f.files.isDeleted,!1))).all(),E=new Map(r.map((N)=>[N.path,N])),u=ll(n.pattern),T=[];for(let N of e){let R=N.key.slice(i.length);if(!R||R.endsWith("/"))continue;if(u.test(R)){let l=o+R,_=E.get(l);T.push({path:l,size:_?.size??N.size,modifiedAt:_?.modifiedAt??N.lastModified})}}return{matches:T}}var af=A(()=>{H();V()});async function tu(t,n){let o=In(n.path),i=U(t.orgId,t.driveId,o),e=n.expiresIn??86400;try{await t.s3.headObject(i)}catch(u){if(u?.name==="NotFound"||u?.name==="NoSuchKey"||u?.$metadata?.httpStatusCode===404)throw new v(`File not found: ${o}`,{path:o});throw u}let r=lt(o);return{url:await t.s3.getPresignedUrl(i,e,r!=="application/octet-stream"?r:void 0),path:o,expiresIn:e,expiresAt:new Date(Date.now()+e*1000).toISOString()}}var nu=A(()=>{V();z();xt()});function Ii(t,n,o,i){let e=i.startsWith("/")?i.slice(1):i;return`${t}/file/~/${n}/${o}/${e}`}import{eq as P,and as _t,sql as Ui,desc as ou}from"drizzle-orm";function Si(t,n){t.db.insert(f.events).values({id:crypto.randomUUID(),orgId:t.orgId,type:n.type,resourceType:n.resourceType,resourceId:n.resourceId,actor:t.userId,target:n.target??null,status:"created",metadata:n.metadata?JSON.stringify(n.metadata):null,createdAt:new Date}).run()}function an(t){return{id:t.id,parentId:t.parentId??void 0,path:t.path,lineStart:t.lineStart??void 0,lineEnd:t.lineEnd??void 0,quotedContent:t.quotedContent??void 0,body:t.body,author:t.author,resolved:t.resolved??!1,resolvedBy:t.resolvedBy??void 0,resolvedAt:t.resolvedAt??void 0,fileVersionId:t.fileVersionId??void 0,replyCount:t.replyCount??0,createdAt:t.createdAt,updatedAt:t.updatedAt}}async function to(t,n){let o=new Date,i=crypto.randomUUID(),e=n.path;if(n.parentId){let E=t.db.select().from(f.comments).where(_t(P(f.comments.id,n.parentId),P(f.comments.isDeleted,!1))).get();if(!E)throw new v("Parent comment not found",{suggestion:"Check that the parent comment ID is correct and not deleted"});if(E.parentId)throw new it("Cannot reply to a reply \u2014 only root comments accept replies",{suggestion:"Reply to the root comment instead"});if(!e)e=E.path}if(!e)throw new it("path is required for root comments",{field:"path"});let r=t.db.select({id:f.fileVersions.id}).from(f.fileVersions).where(_t(P(f.fileVersions.path,e),P(f.fileVersions.driveId,t.driveId))).orderBy(ou(f.fileVersions.id)).limit(1).get();return t.db.insert(f.comments).values({id:i,parentId:n.parentId??null,orgId:t.orgId,driveId:t.driveId,path:e,lineStart:n.lineStart??null,lineEnd:n.lineEnd??null,quotedContent:n.quotedContent??null,fileVersionId:r?.id??null,body:n.body,author:t.userId,resolved:!1,createdAt:o,updatedAt:o,isDeleted:!1}).run(),Si(t,{type:"comment_created",resourceType:"comment",resourceId:i,metadata:{path:e,parentId:n.parentId}}),{id:i,path:e,body:n.body,parentId:n.parentId,lineStart:n.lineStart,lineEnd:n.lineEnd,author:t.userId,createdAt:o}}async function no(t,n){let o=[P(f.comments.driveId,t.driveId),P(f.comments.isDeleted,!1)];if(n.path)o.push(P(f.comments.path,n.path));if(n.parentId)o.push(P(f.comments.parentId,n.parentId));else if(n.parentId===void 0&&!n.resolved)o.push(Ui`${f.comments.parentId} IS NULL`),o.push(P(f.comments.resolved,!1));else if(n.parentId===void 0&&n.resolved)o.push(Ui`${f.comments.parentId} IS NULL`);if(n.orgId)o.push(P(f.comments.orgId,n.orgId));let i=n.limit??50,e=n.offset??0;return{comments:t.db.select().from(f.comments).where(_t(...o)).orderBy(ou(f.comments.createdAt)).limit(i).offset(e).all().map((u)=>{let N=t.db.select().from(f.comments).where(_t(P(f.comments.parentId,u.id),P(f.comments.isDeleted,!1))).orderBy(f.comments.createdAt).all().map((R)=>an({...R,replyCount:0}));return{...an({...u,replyCount:N.length}),replies:N}})}}async function oo(t,n){let o=t.db.select().from(f.comments).where(_t(P(f.comments.id,n.id),P(f.comments.isDeleted,!1))).get();if(!o)throw new v("Comment not found",{suggestion:"Check that the comment ID is correct"});let i=t.db.select({count:Ui`count(*)`}).from(f.comments).where(_t(P(f.comments.parentId,o.id),P(f.comments.isDeleted,!1))).get(),e=an({...o,replyCount:i?.count??0}),E=t.db.select().from(f.comments).where(_t(P(f.comments.parentId,n.id),P(f.comments.isDeleted,!1))).orderBy(f.comments.createdAt).all().map((u)=>an({...u,replyCount:0}));return{comment:e,replies:E}}async function io(t,n){let o=t.db.select().from(f.comments).where(_t(P(f.comments.id,n.id),P(f.comments.isDeleted,!1))).get();if(!o)throw new v("Comment not found",{suggestion:"Check that the comment ID is correct"});if(o.author!==t.userId)throw new nt("You can only edit your own comments",{suggestion:"Only the comment author can update it"});let i=new Date;return t.db.update(f.comments).set({body:n.body,updatedAt:i}).where(P(f.comments.id,n.id)).run(),{id:n.id,body:n.body,updatedAt:i}}async function eo(t,n){let o=t.db.select().from(f.comments).where(_t(P(f.comments.id,n.id),P(f.comments.isDeleted,!1))).get();if(!o)throw new v("Comment not found",{suggestion:"Check that the comment ID is correct"});if(o.author!==t.userId)throw new nt("You can only delete your own comments",{suggestion:"Only the comment author can delete it"});let i=new Date;if(t.db.update(f.comments).set({isDeleted:!0,updatedAt:i}).where(P(f.comments.id,n.id)).run(),!o.parentId)t.db.update(f.comments).set({isDeleted:!0,updatedAt:i}).where(P(f.comments.parentId,n.id)).run();return Si(t,{type:"comment_deleted",resourceType:"comment",resourceId:n.id}),{deleted:!0}}async function ro(t,n){let o=t.db.select().from(f.comments).where(_t(P(f.comments.id,n.id),P(f.comments.isDeleted,!1))).get();if(!o)throw new v("Comment not found",{suggestion:"Check that the comment ID is correct"});if(o.parentId)throw new it("Cannot resolve a reply \u2014 only root comments can be resolved",{suggestion:"Resolve the parent comment instead"});let i=new Date,e=n.resolved?i:null,r=n.resolved?t.userId:null;return t.db.update(f.comments).set({resolved:n.resolved,resolvedBy:r,resolvedAt:e,updatedAt:i}).where(P(f.comments.id,n.id)).run(),Si(t,{type:n.resolved?"comment_resolved":"comment_reopened",resourceType:"comment",resourceId:n.id}),{id:n.id,resolved:n.resolved,resolvedBy:r??void 0,resolvedAt:e??void 0}}var iu=A(()=>{H();z()});import{z as y}from"zod";async function j(t,n,o,i){let e=$i[n];if(!e)throw Error(`Unknown operation: ${n}`);if(!i?.skipAuth){let u=Dn(n);On(t.db,{userId:t.userId,driveId:t.driveId,requiredRole:u})}let r=e.schema.parse(o),E=await e.handler(t,r);if(t.appUrl&&E&&typeof E==="object"){if("path"in E)E.appUrl=Ii(t.appUrl,t.orgId,t.driveId,E.path);else if("to"in E)E.appUrl=Ii(t.appUrl,t.orgId,t.driveId,E.to)}return E}function en(){return Object.keys($i)}function Pt(t){return $i[t]}var $i;var Xi=A(()=>{dn();rf();ff();Tf();Rf();lf();gf();Df();Uf();$f();Cf();Mf();Gf();Hf();Bf();Vf();pf();hf();zf();mf();sf();af();nu();iu();$i={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:cn,schema:y.object({path:y.string(),content:y.string(),message:y.string().optional(),expectedVersion:y.number().int().optional()})},cat:{description:"Read file content with optional pagination via offset/limit. Returns { content, totalLines, truncated }.",handler:Ef,schema:y.object({path:y.string(),offset:y.number().int().min(0).optional(),limit:y.number().int().min(1).optional()})},edit:{description:"Replace a specific string in a file (surgical find-and-replace). Captures the edit intent as a diff summary in version history. Returns { version, path, changes }.",handler:uf,schema:y.object({path:y.string(),old_string:y.string(),new_string:y.string(),message:y.string().optional(),expectedVersion:y.number().int().optional()})},append:{description:"Append content to the end of an existing file. Creates a new version. Returns { version, size }.",handler:Nf,schema:y.object({path:y.string(),content:y.string(),message:y.string().optional(),expectedVersion:y.number().int().optional()})},ls:{description:"List immediate children of a directory. Returns { entries } where each entry has name, type (file/directory), size, author, modifiedAt.",handler:yf,schema:y.object({path:y.string().optional()})},stat:{description:"Get file metadata without reading content. Returns path, size, contentType, author, currentVersion, createdAt, modifiedAt, isDeleted, embeddingStatus.",handler:wf,schema:y.object({path:y.string()})},rm:{description:"Delete a file. Removes from S3, cleans up FTS5 index and vector embeddings. Returns { path, deleted }.",handler:Lf,schema:y.object({path:y.string(),expectedVersion:y.number().int().optional()})},mv:{description:"Move or rename a file. Preserves version history at the new path. Returns { from, to, version }.",handler:If,schema:y.object({from:y.string(),to:y.string(),message:y.string().optional(),expectedVersion:y.number().int().optional()})},cp:{description:"Copy a file using server-side S3 copy. Creates a new version at the destination. Returns { from, to, version }.",handler:Sf,schema:y.object({from:y.string(),to:y.string(),expectedVersion:y.number().int().optional()})},tail:{description:"Read the last N lines of a file (default 20). Returns { content, totalLines, truncated }.",handler:Xf,schema:y.object({path:y.string(),lines:y.number().int().min(1).optional()})},log:{description:"Show version history for a file. Returns { versions } with version number, author, timestamp, operation type, message, and diff summary.",handler:vf,schema:y.object({path:y.string(),limit:y.number().int().min(1).optional()})},diff:{description:"Show the diff between two versions of a file. Specify v1 and v2 version numbers. Returns { changes } as add/remove/context hunks.",handler:Yf,schema:y.object({path:y.string(),v1:y.number().int(),v2:y.number().int()})},revert:{description:"Revert a file to a previous version. Creates a new version with the old content. Returns { version, revertedTo }.",handler:Zf,schema:y.object({path:y.string(),version:y.number().int(),expectedVersion:y.number().int().optional()})},recent:{description:"Show recent activity across the drive. Optionally filter by path prefix and time window (since). Returns { entries } with path and version details.",handler:Jf,schema:y.object({path:y.string().optional(),since:y.coerce.date().optional(),limit:y.number().int().min(1).optional()})},grep:{description:"Search file content using regex pattern within a specific path. Returns matching lines with line numbers. Searches the FTS5 index, not S3 directly.",handler:Wf,schema:y.object({pattern:y.string(),path:y.string()})},fts:{description:"Full-text search across all file content using FTS5 tokens. Different from grep (regex) and search (semantic). Returns { matches } with path, snippet, and rank.",handler:Kf,schema:y.object({pattern:y.string(),path:y.string().optional()})},search:{description:"Hybrid search combining semantic (vector) and keyword (FTS5) matching. Best for natural language queries. Degrades to keyword-only without an embedding provider.",handler:kf,schema:y.object({query:y.string(),limit:y.number().int().min(1).optional()})},"vec-search":{description:"Vector-only semantic search using embeddings. Returns results ranked by cosine similarity. Requires an embedding provider (OPENAI_API_KEY, GEMINI_API_KEY, or local).",handler:jf,schema:y.object({query:y.string(),limit:y.number().int().min(1).optional()})},reindex:{description:"Re-index files with failed or missing FTS5/embedding entries. Optionally scope to a path prefix. Use after bulk writes or provider changes.",handler:df,schema:y.object({path:y.string().optional()})},tree:{description:"Recursively list all files and directories. Use depth to limit recursion. Returns a nested tree structure with name, type, size, and children.",handler:qf,schema:y.object({path:y.string().optional(),depth:y.number().int().min(1).optional()})},glob:{description:"Find files by name pattern. Use `*.md` for root-level files only, `**/*.md` for recursive matching across all subdirectories. Supports `*` (any chars except /), `?` (single char), `**` (any path depth). Optionally scope to a path prefix. Returns { matches } with path, size, and modifiedAt.",handler:xf,schema:y.object({pattern:y.string(),path:y.string().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:tu,schema:y.object({path:y.string(),expiresIn:y.number().int().min(60).max(604800).optional()})},"comment-add":{description:"Add a comment to a file. Supports line ranges and threading via parentId. Replies auto-resolve path from parent. Returns { id, path, body, author, createdAt }.",handler:to,schema:y.object({path:y.string().optional(),body:y.string(),parentId:y.string().optional(),lineStart:y.number().int().optional(),lineEnd:y.number().int().optional(),quotedContent:y.string().optional()})},"comment-list":{description:"List comments on a file. Filter by path, resolved state, or parentId. Defaults to unresolved root comments. Returns { comments } with inline replies.",handler:no,schema:y.object({path:y.string().optional(),parentId:y.string().optional(),resolved:y.boolean().optional(),orgId:y.string().optional(),limit:y.number().int().min(1).optional(),offset:y.number().int().min(0).optional()})},"comment-get":{description:"Get a single comment by ID with all its replies. Returns { comment, replies }.",handler:oo,schema:y.object({id:y.string()})},"comment-update":{description:"Update a comment's body. Only the original author can update. Returns { id, body, updatedAt }.",handler:io,schema:y.object({id:y.string(),body:y.string()})},"comment-delete":{description:"Soft-delete a comment. Only the original author can delete. Deleting a root comment also soft-deletes its replies. Returns { deleted }.",handler:eo,schema:y.object({id:y.string()})},"comment-resolve":{description:"Resolve or reopen a root comment. Set resolved=true to resolve, resolved=false to reopen. Only root comments can be resolved. Returns { id, resolved, resolvedBy, resolvedAt }.",handler:ro,schema:y.object({id:y.string(),resolved:y.boolean()})}}});import{eq as d,and as Eo}from"drizzle-orm";function Zt(t,n){let o=crypto.randomUUID(),i=new Date;return t.insert(f.drives).values({id:o,orgId:n.orgId,name:n.name,isDefault:n.isDefault??!1,createdAt:i}).run(),{id:o,name:n.name}}function Sn(t,n){return t.select().from(f.drives).where(d(f.drives.orgId,n)).all().map((o)=>({id:o.id,name:o.name,isDefault:o.isDefault}))}function Lt(t,n,o){return t.select().from(f.drives).where(d(f.drives.orgId,n)).all().filter((e)=>{let r=t.select({userId:f.driveMembers.userId}).from(f.driveMembers).where(d(f.driveMembers.driveId,e.id)).all();if(r.length===0)return!0;return r.some((E)=>E.userId===o)}).map((e)=>({id:e.id,name:e.name,isDefault:e.isDefault}))}function Ci(t,n){let o=t.select().from(f.drives).where(d(f.drives.id,n)).get();if(!o)return null;return{id:o.id,name:o.name,orgId:o.orgId,isDefault:o.isDefault}}function Ht(t,n){return t.select({userId:f.driveMembers.userId,email:f.users.email,role:f.driveMembers.role}).from(f.driveMembers).innerJoin(f.users,d(f.driveMembers.userId,f.users.id)).where(d(f.driveMembers.driveId,n)).all()}function Qt(t,n){if(!t.select({role:f.driveMembers.role}).from(f.driveMembers).where(Eo(d(f.driveMembers.driveId,n.driveId),d(f.driveMembers.userId,n.userId))).get())throw Error("Member not found in drive");t.update(f.driveMembers).set({role:n.role}).where(Eo(d(f.driveMembers.driveId,n.driveId),d(f.driveMembers.userId,n.userId))).run()}function Jt(t,n){if(!t.select({role:f.driveMembers.role}).from(f.driveMembers).where(Eo(d(f.driveMembers.driveId,n.driveId),d(f.driveMembers.userId,n.userId))).get())throw Error("Member not found in drive");t.delete(f.driveMembers).where(Eo(d(f.driveMembers.driveId,n.driveId),d(f.driveMembers.userId,n.userId))).run()}function Pi(t,n){t.insert(f.driveMembers).values({driveId:n.driveId,userId:n.userId,role:n.role}).onConflictDoUpdate({target:[f.driveMembers.driveId,f.driveMembers.userId],set:{role:n.role}}).run()}var vi=A(()=>{H()});import{eq as Q,and as Bt,sql as eu}from"drizzle-orm";function Wt(t,n){let o=crypto.randomUUID(),i=new Date;t.insert(f.orgs).values({id:o,name:n.name,isPersonal:n.isPersonal??!1,createdAt:i}).run(),t.insert(f.orgMembers).values({orgId:o,userId:n.userId,role:"admin"}).run();let e=Zt(t,{orgId:o,name:"default",isDefault:!0});return t.insert(f.driveMembers).values({driveId:e.id,userId:n.userId,role:"admin"}).run(),{id:o,name:n.name}}function K(t,n){return t.select({orgId:f.orgMembers.orgId,role:f.orgMembers.role,name:f.orgs.name,isPersonal:f.orgs.isPersonal}).from(f.orgMembers).innerJoin(f.orgs,Q(f.orgMembers.orgId,f.orgs.id)).where(Q(f.orgMembers.userId,n)).all().map((i)=>({id:i.orgId,name:i.name,role:i.role,isPersonal:i.isPersonal}))}function $n(t,n){let o=t.select().from(f.orgs).where(Q(f.orgs.id,n)).get();if(!o)return null;return{id:o.id,name:o.name,isPersonal:o.isPersonal}}function Vt(t,n){return t.select({userId:f.orgMembers.userId,email:f.users.email,role:f.orgMembers.role}).from(f.orgMembers).innerJoin(f.users,Q(f.orgMembers.userId,f.users.id)).where(Q(f.orgMembers.orgId,n)).all()}function Kt(t,n){let o=t.select({role:f.orgMembers.role}).from(f.orgMembers).where(Bt(Q(f.orgMembers.orgId,n.orgId),Q(f.orgMembers.userId,n.userId))).get();if(!o)throw Error("Member not found in org");if(o.role==="admin"&&n.role!=="admin"){if(t.select({count:eu`count(*)`}).from(f.orgMembers).where(Bt(Q(f.orgMembers.orgId,n.orgId),Q(f.orgMembers.role,"admin"))).get().count<=1)throw Error("Cannot remove the last admin from the org")}t.update(f.orgMembers).set({role:n.role}).where(Bt(Q(f.orgMembers.orgId,n.orgId),Q(f.orgMembers.userId,n.userId))).run()}function pt(t,n){if(t.select({isPersonal:f.orgs.isPersonal}).from(f.orgs).where(Q(f.orgs.id,n.orgId)).get()?.isPersonal)throw Error("Cannot remove members from a personal org");let i=t.select({role:f.orgMembers.role}).from(f.orgMembers).where(Bt(Q(f.orgMembers.orgId,n.orgId),Q(f.orgMembers.userId,n.userId))).get();if(!i)throw Error("Member not found in org");if(i.role==="admin"){if(t.select({count:eu`count(*)`}).from(f.orgMembers).where(Bt(Q(f.orgMembers.orgId,n.orgId),Q(f.orgMembers.role,"admin"))).get().count<=1)throw Error("Cannot remove the last admin from the org")}let e=t.select({id:f.drives.id}).from(f.drives).where(Q(f.drives.orgId,n.orgId)).all();for(let r of e)t.delete(f.driveMembers).where(Bt(Q(f.driveMembers.driveId,r.id),Q(f.driveMembers.userId,n.userId))).run();t.delete(f.orgMembers).where(Bt(Q(f.orgMembers.orgId,n.orgId),Q(f.orgMembers.userId,n.userId))).run()}function jt(t,n){let o=t.select().from(f.users).where(Q(f.users.email,n.email)).get();if(!o)throw Error(`User with email ${n.email} not found`);t.insert(f.orgMembers).values({orgId:n.orgId,userId:o.id,role:n.role}).onConflictDoUpdate({target:[f.orgMembers.orgId,f.orgMembers.userId],set:{role:n.role}}).run();let i=t.select().from(f.drives).where(Q(f.drives.orgId,n.orgId)).get();if(i)t.insert(f.driveMembers).values({driveId:i.id,userId:o.id,role:n.role}).onConflictDoUpdate({target:[f.driveMembers.driveId,f.driveMembers.userId],set:{role:n.role}}).run()}var Mi=A(()=>{H();vi()});import{eq as ru}from"drizzle-orm";function Eu(t){let n=new Bun.CryptoHasher("sha256");return n.update(t),n.digest("hex")}function _l(){let t=new Uint8Array(32);return crypto.getRandomValues(t),`af_${Array.from(t,(o)=>o.toString(16).padStart(2,"0")).join("")}`}function wl(){return crypto.randomUUID()}function et(t,n){let o=wl(),i=_l(),e=Eu(i),r=new Date;return t.insert(f.users).values({id:o,email:n.email,apiKeyHash:e,createdAt:r}).run(),Wt(t,{name:n.email.split("@")[0],userId:o,isPersonal:!0}),{user:{id:o,email:n.email},apiKey:i}}function rt(t,n){let o=Eu(n),i=t.select().from(f.users).where(ru(f.users.apiKeyHash,o)).get();if(!i)return null;return{id:i.id,email:i.email}}function rn(t,n){let o=t.select().from(f.users).where(ru(f.users.email,n)).get();if(!o)return null;return{id:o.id,email:o.email}}var Fi=A(()=>{H();Mi()});import{eq as vt,and as Yi}from"drizzle-orm";function m(t,n){if(n.driveId){let r=t.select().from(f.drives).where(vt(f.drives.id,n.driveId)).get();if(!r)throw Error(`Drive not found: ${n.driveId}`);let E=At(t,n.userId,n.driveId);if(!E)throw Error("You do not have access to this drive");return{orgId:r.orgId,driveId:n.driveId,role:E}}if(n.orgId){let r=t.select().from(f.drives).where(Yi(vt(f.drives.orgId,n.orgId),vt(f.drives.isDefault,!0))).get();if(!r)throw Error(`No default drive for org: ${n.orgId}`);let E=At(t,n.userId,r.id);if(!E)throw Error("You do not have access to this drive");return{orgId:n.orgId,driveId:r.id,role:E}}let o=t.select({orgId:f.orgMembers.orgId}).from(f.orgMembers).innerJoin(f.orgs,vt(f.orgMembers.orgId,f.orgs.id)).where(Yi(vt(f.orgMembers.userId,n.userId),vt(f.orgs.isPersonal,!0))).get();if(!o)throw Error("No personal org found for user");let i=t.select().from(f.drives).where(Yi(vt(f.drives.orgId,o.orgId),vt(f.drives.isDefault,!0))).get();if(!i)throw Error("No default drive found");let e=At(t,n.userId,i.id);if(!e)throw Error("You do not have access to your default drive");return{orgId:o.orgId,driveId:i.id,role:e}}var fu=A(()=>{H();dn()});function Xn(t){let n=C();if(n.auth.apiKey){if(rt(t,n.auth.apiKey))return{apiKey:n.auth.apiKey}}console.error("[agent-fs] No local user found, creating one...");let o=et(t,{email:"local@agent-fs.local"});return D("auth.apiKey",o.apiKey),console.error("[agent-fs] Local user created automatically."),{apiKey:o.apiKey}}var uu=A(()=>{Nn();Fi()});var Tu=A(()=>{Fi();Mi();vi();dn();fu();uu()});var Ru;var Nu=A(()=>{Ru={name:"agent-fs",version:"0.6.1",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:{"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 b;var Gi=A(()=>{Nu();b=Ru.version});var yu={};mt(yu,{LocalEmbeddingProvider:()=>Au});import{join as Ll}from"path";import{mkdirSync as Dl,existsSync as Ol}from"fs";class Au{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:t,resolveModelFile:n}=await import("node-llama-cpp");this.llama=await t();let o=Ll(W(),"models");if(!Ol(o))Dl(o,{recursive:!0});console.error("[agent-fs] Resolving local embedding model...");let i=await n(Il,o);console.error("[agent-fs] Model ready:",i),this.model=await this.llama.loadModel({modelPath:i}),this.embeddingContext=await this.model.createEmbeddingContext()}async embed(t){await this.init();let n=await this.embeddingContext.getEmbeddingFor(t);return Array.from(n.vector)}async embedBatch(t){await this.init();let n=[];for(let o of t){let i=await this.embeddingContext.getEmbeddingFor(o);n.push(Array.from(i.vector))}return n}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 Il="hf:nomic-ai/nomic-embed-text-v1.5-GGUF:Q8_0";var lu=A(()=>{Nn()});var Zi={};mt(Zi,{OpenAIEmbeddingProvider:()=>_u});import Ul from"openai";class _u{name="openai";dimensions=768;client;constructor(t){this.client=new Ul({apiKey:t})}async embed(t){return(await this.client.embeddings.create({model:"text-embedding-3-small",input:t,dimensions:768})).data[0].embedding}async embedBatch(t){return(await this.client.embeddings.create({model:"text-embedding-3-small",input:t,dimensions:768})).data.sort((o,i)=>o.index-i.index).map((o)=>o.embedding)}}var Hi=()=>{};var Qi={};mt(Qi,{GeminiEmbeddingProvider:()=>wu});import{GoogleGenAI as Sl}from"@google/genai";class wu{name="gemini";dimensions=768;client;constructor(t){this.client=new Sl({apiKey:t})}async embed(t){return(await this.client.models.embedContent({model:"gemini-embedding-001",contents:t,config:{outputDimensionality:768}})).embeddings[0].values}async embedBatch(t){let n=[];for(let o of t){let i=await this.client.models.embedContent({model:"gemini-embedding-001",contents:o,config:{outputDimensionality:768}});n.push(i.embeddings[0].values)}return n}}var Ji=()=>{};async function gu(t){switch(t.provider){case"local":{let{LocalEmbeddingProvider:n}=await Promise.resolve().then(() => (lu(),yu));return new n}case"openai":{if(!t.apiKey)throw Error("OpenAI API key required. Set embedding.apiKey in config.");let{OpenAIEmbeddingProvider:n}=await Promise.resolve().then(() => (Hi(),Zi));return new n(t.apiKey)}case"gemini":{if(!t.apiKey)throw Error("Gemini API key required. Set embedding.apiKey in config.");let{GeminiEmbeddingProvider:n}=await Promise.resolve().then(() => (Ji(),Qi));return new n(t.apiKey)}default:throw Error(`Unknown embedding provider: ${t.provider}`)}}async function En(t){if(process.env.OPENAI_API_KEY)try{let{OpenAIEmbeddingProvider:n}=await Promise.resolve().then(() => (Hi(),Zi));return new n(process.env.OPENAI_API_KEY)}catch(n){console.error("[agent-fs] Failed to load OpenAI provider:",n)}if(process.env.GEMINI_API_KEY)try{let{GeminiEmbeddingProvider:n}=await Promise.resolve().then(() => (Ji(),Qi));return new n(process.env.GEMINI_API_KEY)}catch(n){console.error("[agent-fs] Failed to load Gemini provider:",n)}if(t?.provider&&t.provider!=="local"&&t.apiKey)try{return await gu(t)}catch(n){console.error("[agent-fs] Failed to create embedding provider from config:",n)}if(t?.provider==="local")try{return await gu(t)}catch(n){console.error("[agent-fs] Failed to load local embedding provider:",n)}return null}var Du,Lu,Ou=(t)=>typeof t==="string"?{...Lu,name:t}:{...Lu,...t};var fo=A(()=>{Du=Symbol("Let zodToJsonSchema decide on which parser to use"),Lu={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 Iu=(t)=>{let n=Ou(t),o=n.name!==void 0?[...n.basePath,n.definitionPath,n.name]:n.basePath;return{...n,flags:{hasReferencedOpenAiAnyType:!1},currentPath:o,propertyPath:void 0,seen:new Map(Object.entries(n.definitions).map(([i,e])=>[e._def,{def:e._def,path:[...n.basePath,n.definitionPath,i],jsonSchema:void 0}]))}};var Bi=A(()=>{fo()});function Wi(t,n,o,i){if(!i?.errorMessages)return;if(o)t.errorMessage={...t.errorMessage,[n]:o}}function $(t,n,o,i,e){t[n]=o,Wi(t,n,i,e)}var uo=(t,n)=>{let o=0;for(;o<t.length&&o<n.length;o++)if(t[o]!==n[o])break;return[(t.length-o).toString(),...n.slice(o)].join("/")};function G(t){if(t.target!=="openAi")return{};let n=[...t.basePath,t.definitionPath,t.openAiAnyTypeName];return t.flags.hasReferencedOpenAiAnyType=!0,{$ref:t.$refStrategy==="relative"?uo(n,t.currentPath):n.join("/")}}var x=()=>{};import{ZodFirstPartyTypeKind as $l}from"zod/v3";function Uu(t,n){let o={type:"array"};if(t.type?._def&&t.type?._def?.typeName!==$l.ZodAny)o.items=g(t.type._def,{...n,currentPath:[...n.currentPath,"items"]});if(t.minLength)$(o,"minItems",t.minLength.value,t.minLength.message,n);if(t.maxLength)$(o,"maxItems",t.maxLength.value,t.maxLength.message,n);if(t.exactLength)$(o,"minItems",t.exactLength.value,t.exactLength.message,n),$(o,"maxItems",t.exactLength.value,t.exactLength.message,n);return o}var Vi=A(()=>{J()});function Su(t,n){let o={type:"integer",format:"int64"};if(!t.checks)return o;for(let i of t.checks)switch(i.kind){case"min":if(n.target==="jsonSchema7")if(i.inclusive)$(o,"minimum",i.value,i.message,n);else $(o,"exclusiveMinimum",i.value,i.message,n);else{if(!i.inclusive)o.exclusiveMinimum=!0;$(o,"minimum",i.value,i.message,n)}break;case"max":if(n.target==="jsonSchema7")if(i.inclusive)$(o,"maximum",i.value,i.message,n);else $(o,"exclusiveMaximum",i.value,i.message,n);else{if(!i.inclusive)o.exclusiveMaximum=!0;$(o,"maximum",i.value,i.message,n)}break;case"multipleOf":$(o,"multipleOf",i.value,i.message,n);break}return o}var Ki=()=>{};function $u(){return{type:"boolean"}}function To(t,n){return g(t.type._def,n)}var No=A(()=>{J()});var Xu=(t,n)=>{return g(t.innerType._def,n)};var pi=A(()=>{J()});function ji(t,n,o){let i=o??n.dateStrategy;if(Array.isArray(i))return{anyOf:i.map((e,r)=>ji(t,n,e))};switch(i){case"string":case"format:date-time":return{type:"string",format:"date-time"};case"format:date":return{type:"string",format:"date"};case"integer":return Xl(t,n)}}var Xl=(t,n)=>{let o={type:"integer",format:"unix-time"};if(n.target==="openApi3")return o;for(let i of t.checks)switch(i.kind){case"min":$(o,"minimum",i.value,i.message,n);break;case"max":$(o,"maximum",i.value,i.message,n);break}return o};var hi=()=>{};function Cu(t,n){return{...g(t.innerType._def,n),default:t.defaultValue()}}var ki=A(()=>{J()});function Pu(t,n){return n.effectStrategy==="input"?g(t.schema._def,n):G(n)}var zi=A(()=>{J();x()});function vu(t){return{type:"string",enum:Array.from(t.values)}}function Mu(t,n){let o=[g(t.left._def,{...n,currentPath:[...n.currentPath,"allOf","0"]}),g(t.right._def,{...n,currentPath:[...n.currentPath,"allOf","1"]})].filter((r)=>!!r),i=n.target==="jsonSchema2019-09"?{unevaluatedProperties:!1}:void 0,e=[];return o.forEach((r)=>{if(Cl(r)){if(e.push(...r.allOf),r.unevaluatedProperties===void 0)i=void 0}else{let E=r;if("additionalProperties"in r&&r.additionalProperties===!1){let{additionalProperties:u,...T}=r;E=T}else i=void 0;e.push(E)}}),e.length?{allOf:e,...i}:void 0}var Cl=(t)=>{if("type"in t&&t.type==="string")return!1;return"allOf"in t};var di=A(()=>{J()});function Fu(t,n){let o=typeof t.value;if(o!=="bigint"&&o!=="number"&&o!=="boolean"&&o!=="string")return{type:Array.isArray(t.value)?"array":"object"};if(n.target==="openApi3")return{type:o==="bigint"?"integer":o,enum:[t.value]};return{type:o==="bigint"?"integer":o,const:t.value}}function Ro(t,n){let o={type:"string"};if(t.checks)for(let i of t.checks)switch(i.kind){case"min":$(o,"minLength",typeof o.minLength==="number"?Math.max(o.minLength,i.value):i.value,i.message,n);break;case"max":$(o,"maxLength",typeof o.maxLength==="number"?Math.min(o.maxLength,i.value):i.value,i.message,n);break;case"email":switch(n.emailStrategy){case"format:email":ft(o,"email",i.message,n);break;case"format:idn-email":ft(o,"idn-email",i.message,n);break;case"pattern:zod":k(o,Et.email,i.message,n);break}break;case"url":ft(o,"uri",i.message,n);break;case"uuid":ft(o,"uuid",i.message,n);break;case"regex":k(o,i.regex,i.message,n);break;case"cuid":k(o,Et.cuid,i.message,n);break;case"cuid2":k(o,Et.cuid2,i.message,n);break;case"startsWith":k(o,RegExp(`^${bi(i.value,n)}`),i.message,n);break;case"endsWith":k(o,RegExp(`${bi(i.value,n)}$`),i.message,n);break;case"datetime":ft(o,"date-time",i.message,n);break;case"date":ft(o,"date",i.message,n);break;case"time":ft(o,"time",i.message,n);break;case"duration":ft(o,"duration",i.message,n);break;case"length":$(o,"minLength",typeof o.minLength==="number"?Math.max(o.minLength,i.value):i.value,i.message,n),$(o,"maxLength",typeof o.maxLength==="number"?Math.min(o.maxLength,i.value):i.value,i.message,n);break;case"includes":{k(o,RegExp(bi(i.value,n)),i.message,n);break}case"ip":{if(i.version!=="v6")ft(o,"ipv4",i.message,n);if(i.version!=="v4")ft(o,"ipv6",i.message,n);break}case"base64url":k(o,Et.base64url,i.message,n);break;case"jwt":k(o,Et.jwt,i.message,n);break;case"cidr":{if(i.version!=="v6")k(o,Et.ipv4Cidr,i.message,n);if(i.version!=="v4")k(o,Et.ipv6Cidr,i.message,n);break}case"emoji":k(o,Et.emoji(),i.message,n);break;case"ulid":{k(o,Et.ulid,i.message,n);break}case"base64":{switch(n.base64Strategy){case"format:binary":{ft(o,"binary",i.message,n);break}case"contentEncoding:base64":{$(o,"contentEncoding","base64",i.message,n);break}case"pattern:zod":{k(o,Et.base64,i.message,n);break}}break}case"nanoid":k(o,Et.nanoid,i.message,n);case"toLowerCase":case"toUpperCase":case"trim":break;default:((e)=>{})(i)}return o}function bi(t,n){return n.patternStrategy==="escape"?vl(t):t}function vl(t){let n="";for(let o=0;o<t.length;o++){if(!Pl.has(t[o]))n+="\\";n+=t[o]}return n}function ft(t,n,o,i){if(t.format||t.anyOf?.some((e)=>e.format)){if(!t.anyOf)t.anyOf=[];if(t.format){if(t.anyOf.push({format:t.format,...t.errorMessage&&i.errorMessages&&{errorMessage:{format:t.errorMessage.format}}}),delete t.format,t.errorMessage){if(delete t.errorMessage.format,Object.keys(t.errorMessage).length===0)delete t.errorMessage}}t.anyOf.push({format:n,...o&&i.errorMessages&&{errorMessage:{format:o}}})}else $(t,"format",n,o,i)}function k(t,n,o,i){if(t.pattern||t.allOf?.some((e)=>e.pattern)){if(!t.allOf)t.allOf=[];if(t.pattern){if(t.allOf.push({pattern:t.pattern,...t.errorMessage&&i.errorMessages&&{errorMessage:{pattern:t.errorMessage.pattern}}}),delete t.pattern,t.errorMessage){if(delete t.errorMessage.pattern,Object.keys(t.errorMessage).length===0)delete t.errorMessage}}t.allOf.push({pattern:Yu(n,i),...o&&i.errorMessages&&{errorMessage:{pattern:o}}})}else $(t,"pattern",Yu(n,i),o,i)}function Yu(t,n){if(!n.applyRegexFlags||!t.flags)return t.source;let o={i:t.flags.includes("i"),m:t.flags.includes("m"),s:t.flags.includes("s")},i=o.i?t.source.toLowerCase():t.source,e="",r=!1,E=!1,u=!1;for(let T=0;T<i.length;T++){if(r){e+=i[T],r=!1;continue}if(o.i){if(E){if(i[T].match(/[a-z]/)){if(u)e+=i[T],e+=`${i[T-2]}-${i[T]}`.toUpperCase(),u=!1;else if(i[T+1]==="-"&&i[T+2]?.match(/[a-z]/))e+=i[T],u=!0;else e+=`${i[T]}${i[T].toUpperCase()}`;continue}}else if(i[T].match(/[a-z]/)){e+=`[${i[T]}${i[T].toUpperCase()}]`;continue}}if(o.m){if(i[T]==="^"){e+=`(^|(?<=[\r
172
+ LIMIT ?`).all(r,o),T=[],l=new Set;for(let N of f){let A=t.db.select().from(u.contentChunks).where(Ci(u.contentChunks.id,N.chunk_id)).get();if(!A||A.driveId!==t.driveId)continue;if(l.has(A.filePath))continue;l.add(A.filePath);let w=t.db.select().from(u.files).where(L_(Ci(u.files.path,A.filePath),Ci(u.files.driveId,t.driveId))).get();T.push({path:A.filePath,snippet:A.content.slice(0,200),author:w?.author,modifiedAt:w?.modifiedAt})}return T}function D_(t,n,o){let i=n.split(/\s+/).filter(Boolean).map((e)=>`"${e}"`).join(" OR ");if(!i)return[];try{return oo(t.db,{pattern:i,driveId:t.driveId}).slice(0,o).map((r)=>({path:r.path,snippet:r.snippet}))}catch{return[]}}var xu=R(()=>{G()});import{eq as eo,and as O_,or as I_,isNull as U_}from"drizzle-orm";async function au(t,n){let o=[eo(u.files.driveId,t.driveId),eo(u.files.isDeleted,!1),I_(eo(u.files.embeddingStatus,"failed"),U_(u.files.embeddingStatus),eo(u.files.embeddingStatus,"pending"))];if(n.path){let{like:T}=await import("drizzle-orm"),l=n.path.endsWith("/")?n.path:n.path+"/";o.push(T(u.files.path,l+"%"))}let i=t.db.select({path:u.files.path}).from(u.files).where(O_(...o)).all(),e=0,r=0,E=0,f=3;for(let T=0;T<i.length;T+=f){let l=i.slice(T,T+f),N=await Promise.allSettled(l.map(async(A)=>{let w=I(t.orgId,t.driveId,A.path),g=await t.s3.getObject(w),O=g.contentType??K(A.path),D=Pt(g.body,O);if(D===null)return Fn(t,A.path),"skipped";if(wt(t.db,{path:A.path,driveId:t.driveId,content:D}),t.embeddingProvider)return await Di(t.db,t.embeddingProvider,{path:A.path,driveId:t.driveId,content:D}),"reindexed";return"skipped"}));for(let A of N)if(A.status==="fulfilled")if(A.value==="reindexed")e++;else E++;else console.error("Reindex failed:",A.reason),r++}return{reindexed:e,failed:r,skipped:E}}var tf=R(()=>{G();W();Mn();rn();rt()});import{eq as nf,and as S_,like as $_}from"drizzle-orm";async function of(t,n){let o=Ct(n.path??"/"),i=I(t.orgId,t.driveId,o),{objects:e}=await t.s3.listObjects(i),r=t.db.select().from(u.files).where(S_(nf(u.files.driveId,t.driveId),$_(u.files.path,o+"%"),nf(u.files.isDeleted,!1))).all(),E=new Map(r.map((T)=>[T.path,T])),f=[];for(let T of e){let l=T.key.slice(i.length);if(!l)continue;let N=l.split("/").filter(Boolean);if(N.length===0)continue;if(n.depth!==void 0&&N.length>n.depth)continue;let A=f;for(let w=0;w<N.length;w++){let g=N[w],O=w===N.length-1,D=!O||l.endsWith("/");if(D&&!O){let C=A.find((Z)=>Z.name===g&&Z.type==="directory");if(!C)C={name:g,type:"directory",children:[]},A.push(C);if(!C.children)C.children=[];A=C.children}else if(D&&O){let C=A.find((Z)=>Z.name===g&&Z.type==="directory");if(!C)C={name:g,type:"directory",children:[]},A.push(C)}else{let C=o+N.slice(0,w+1).join("/"),Z=E.get(C),_n={name:g,type:"file",size:Z?.size??T.size};if(Z?.author)_n.author=Z.author;if(Z?.modifiedAt??T.lastModified)_n.modifiedAt=Z?.modifiedAt??T.lastModified;A.push(_n)}}}return{tree:f}}var ef=R(()=>{G();W()});import{eq as rf,and as X_,like as C_}from"drizzle-orm";function P_(t){let n="",o=0;while(o<t.length){let i=t[o];if(i==="*")if(t[o+1]==="*"){if(n+=".*",o+=2,t[o]==="/")o++}else n+="[^/]*",o++;else if(i==="?")n+="[^/]",o++;else if(".+^${}()|[]\\".includes(i))n+="\\"+i,o++;else n+=i,o++}return new RegExp("^"+n+"$")}async function Ef(t,n){let o=n.path?Ct(n.path):"/",i=I(t.orgId,t.driveId,o),{objects:e}=await t.s3.listObjects(i),r=t.db.select().from(u.files).where(X_(rf(u.files.driveId,t.driveId),C_(u.files.path,o+"%"),rf(u.files.isDeleted,!1))).all(),E=new Map(r.map((l)=>[l.path,l])),f=P_(n.pattern),T=[];for(let l of e){let N=l.key.slice(i.length);if(!N||N.endsWith("/"))continue;if(f.test(N)){let A=o+N,w=E.get(A);T.push({path:A,size:w?.size??l.size,modifiedAt:w?.modifiedAt??l.lastModified})}}return{matches:T}}var uf=R(()=>{G();W()});async function ff(t,n){let o=Cn(n.path),i=I(t.orgId,t.driveId,o),e=n.expiresIn??86400;try{await t.s3.headObject(i)}catch(f){if(f?.name==="NotFound"||f?.name==="NoSuchKey"||f?.$metadata?.httpStatusCode===404)throw new F(`File not found: ${o}`,{path:o});throw f}let r=K(o);return{url:await t.s3.getPresignedUrl(i,e,r!=="application/octet-stream"?r:void 0),path:o,expiresIn:e,expiresAt:new Date(Date.now()+e*1000).toISOString()}}var Tf=R(()=>{W();m();rt()});function Pi(t,n,o,i){let e=i.startsWith("/")?i.slice(1):i;return`${t}/file/~/${n}/${o}/${e}`}import{eq as M,and as yt,sql as Mi,desc as lf}from"drizzle-orm";function Fi(t,n){t.db.insert(u.events).values({id:crypto.randomUUID(),orgId:t.orgId,type:n.type,resourceType:n.resourceType,resourceId:n.resourceId,actor:t.userId,target:n.target??null,status:"created",metadata:n.metadata?JSON.stringify(n.metadata):null,createdAt:new Date}).run()}function ro(t){return{id:t.id,parentId:t.parentId??void 0,path:t.path,lineStart:t.lineStart??void 0,lineEnd:t.lineEnd??void 0,quotedContent:t.quotedContent??void 0,body:t.body,author:t.author,resolved:t.resolved??!1,resolvedBy:t.resolvedBy??void 0,resolvedAt:t.resolvedAt??void 0,fileVersionId:t.fileVersionId??void 0,replyCount:t.replyCount??0,createdAt:t.createdAt,updatedAt:t.updatedAt}}async function Eo(t,n){let o=new Date,i=crypto.randomUUID(),e=n.path;if(n.parentId){let E=t.db.select().from(u.comments).where(yt(M(u.comments.id,n.parentId),M(u.comments.isDeleted,!1))).get();if(!E)throw new F("Parent comment not found",{suggestion:"Check that the parent comment ID is correct and not deleted"});if(E.parentId)throw new c("Cannot reply to a reply \u2014 only root comments accept replies",{suggestion:"Reply to the root comment instead"});if(!e)e=E.path}if(!e)throw new c("path is required for root comments",{field:"path"});let r=t.db.select({id:u.fileVersions.id}).from(u.fileVersions).where(yt(M(u.fileVersions.path,e),M(u.fileVersions.driveId,t.driveId))).orderBy(lf(u.fileVersions.id)).limit(1).get();return t.db.insert(u.comments).values({id:i,parentId:n.parentId??null,orgId:t.orgId,driveId:t.driveId,path:e,lineStart:n.lineStart??null,lineEnd:n.lineEnd??null,quotedContent:n.quotedContent??null,fileVersionId:r?.id??null,body:n.body,author:t.userId,resolved:!1,createdAt:o,updatedAt:o,isDeleted:!1}).run(),Fi(t,{type:"comment_created",resourceType:"comment",resourceId:i,metadata:{path:e,parentId:n.parentId}}),{id:i,path:e,body:n.body,parentId:n.parentId,lineStart:n.lineStart,lineEnd:n.lineEnd,author:t.userId,createdAt:o}}async function uo(t,n){let o=[M(u.comments.driveId,t.driveId),M(u.comments.isDeleted,!1)];if(n.path)o.push(M(u.comments.path,n.path));if(n.parentId)o.push(M(u.comments.parentId,n.parentId));else if(n.parentId===void 0&&!n.resolved)o.push(Mi`${u.comments.parentId} IS NULL`),o.push(M(u.comments.resolved,!1));else if(n.parentId===void 0&&n.resolved)o.push(Mi`${u.comments.parentId} IS NULL`);if(n.orgId)o.push(M(u.comments.orgId,n.orgId));let i=n.limit??50,e=n.offset??0;return{comments:t.db.select().from(u.comments).where(yt(...o)).orderBy(lf(u.comments.createdAt)).limit(i).offset(e).all().map((f)=>{let l=t.db.select().from(u.comments).where(yt(M(u.comments.parentId,f.id),M(u.comments.isDeleted,!1))).orderBy(u.comments.createdAt).all().map((N)=>ro({...N,replyCount:0}));return{...ro({...f,replyCount:l.length}),replies:l}})}}async function fo(t,n){let o=t.db.select().from(u.comments).where(yt(M(u.comments.id,n.id),M(u.comments.isDeleted,!1))).get();if(!o)throw new F("Comment not found",{suggestion:"Check that the comment ID is correct"});let i=t.db.select({count:Mi`count(*)`}).from(u.comments).where(yt(M(u.comments.parentId,o.id),M(u.comments.isDeleted,!1))).get(),e=ro({...o,replyCount:i?.count??0}),E=t.db.select().from(u.comments).where(yt(M(u.comments.parentId,n.id),M(u.comments.isDeleted,!1))).orderBy(u.comments.createdAt).all().map((f)=>ro({...f,replyCount:0}));return{comment:e,replies:E}}async function To(t,n){let o=t.db.select().from(u.comments).where(yt(M(u.comments.id,n.id),M(u.comments.isDeleted,!1))).get();if(!o)throw new F("Comment not found",{suggestion:"Check that the comment ID is correct"});if(o.author!==t.userId)throw new it("You can only edit your own comments",{suggestion:"Only the comment author can update it"});let i=new Date;return t.db.update(u.comments).set({body:n.body,updatedAt:i}).where(M(u.comments.id,n.id)).run(),{id:n.id,body:n.body,updatedAt:i}}async function lo(t,n){let o=t.db.select().from(u.comments).where(yt(M(u.comments.id,n.id),M(u.comments.isDeleted,!1))).get();if(!o)throw new F("Comment not found",{suggestion:"Check that the comment ID is correct"});if(o.author!==t.userId)throw new it("You can only delete your own comments",{suggestion:"Only the comment author can delete it"});let i=new Date;if(t.db.update(u.comments).set({isDeleted:!0,updatedAt:i}).where(M(u.comments.id,n.id)).run(),!o.parentId)t.db.update(u.comments).set({isDeleted:!0,updatedAt:i}).where(M(u.comments.parentId,n.id)).run();return Fi(t,{type:"comment_deleted",resourceType:"comment",resourceId:n.id}),{deleted:!0}}async function No(t,n){let o=t.db.select().from(u.comments).where(yt(M(u.comments.id,n.id),M(u.comments.isDeleted,!1))).get();if(!o)throw new F("Comment not found",{suggestion:"Check that the comment ID is correct"});if(o.parentId)throw new c("Cannot resolve a reply \u2014 only root comments can be resolved",{suggestion:"Resolve the parent comment instead"});let i=new Date,e=n.resolved?i:null,r=n.resolved?t.userId:null;return t.db.update(u.comments).set({resolved:n.resolved,resolvedBy:r,resolvedAt:e,updatedAt:i}).where(M(u.comments.id,n.id)).run(),Fi(t,{type:n.resolved?"comment_resolved":"comment_reopened",resourceType:"comment",resourceId:n.id}),{id:n.id,resolved:n.resolved,resolvedBy:r??void 0,resolvedAt:e??void 0}}var Nf=R(()=>{G();m()});import{z as _}from"zod";async function k(t,n,o,i){let e=vi[n];if(!e)throw Error(`Unknown operation: ${n}`);if(!i?.skipAuth){let f=$n(n);Xn(t.db,{userId:t.userId,driveId:t.driveId,requiredRole:f})}let r=e.schema.parse(o),E=await e.handler(t,r);if(t.appUrl&&E&&typeof E==="object"){if("path"in E)E.appUrl=Pi(t.appUrl,t.orgId,t.driveId,E.path);else if("to"in E)E.appUrl=Pi(t.appUrl,t.orgId,t.driveId,E.to)}return E}function fn(){return Object.keys(vi)}function Mt(t){return vi[t]}var vi;var Yi=R(()=>{an();Ru();_u();yu();gu();Iu();$u();Cu();Fu();Yu();Hu();Ju();Wu();pu();ku();mu();bu();su();xu();tf();ef();uf();Tf();Nf();vi={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:io,schema:_.object({path:_.string(),content:_.string(),message:_.string().optional(),expectedVersion:_.number().int().optional()})},cat:{description:"Read file content with optional pagination via offset/limit. Returns { content, totalLines, truncated }.",handler:Au,schema:_.object({path:_.string(),offset:_.number().int().min(0).optional(),limit:_.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:wu,schema:_.object({path:_.string(),old_string:_.string(),new_string:_.string(),message:_.string().optional(),expectedVersion:_.number().int().optional()})},append:{description:"Append content to the end of an existing file. Creates a new version. Returns { version, size }.",handler:Lu,schema:_.object({path:_.string(),content:_.string(),message:_.string().optional(),expectedVersion:_.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:Ou,schema:_.object({path:_.string().optional()})},stat:{description:"Get file metadata without reading content. Returns path, size, contentType, author, currentVersion, createdAt, modifiedAt, isDeleted, embeddingStatus.",handler:Su,schema:_.object({path:_.string()})},rm:{description:"Delete a file. Removes from S3, cleans up FTS5 index and vector embeddings. Returns { path, deleted }.",handler:Xu,schema:_.object({path:_.string(),expectedVersion:_.number().int().optional()})},mv:{description:"Move or rename a file. Preserves version history at the new path. Returns { from, to, version }.",handler:Mu,schema:_.object({from:_.string(),to:_.string(),message:_.string().optional(),expectedVersion:_.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:vu,schema:_.object({from:_.string(),to:_.string(),expectedVersion:_.number().int().optional()})},tail:{description:"Read the last N lines of a file (default 20). Returns { content, totalLines, truncated }.",handler:Gu,schema:_.object({path:_.string(),lines:_.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:Qu,schema:_.object({path:_.string(),limit:_.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:Vu,schema:_.object({path:_.string(),v1:_.number().int(),v2:_.number().int()})},revert:{description:"Revert a file to a previous version. Creates a new version with the old content. Returns { version, revertedTo }.",handler:Ku,schema:_.object({path:_.string(),version:_.number().int(),expectedVersion:_.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:ju,schema:_.object({path:_.string().optional(),since:_.coerce.date().optional(),limit:_.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:du,schema:_.object({pattern:_.string(),path:_.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:zu,schema:_.object({pattern:_.string(),path:_.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:cu,schema:_.object({query:_.string(),limit:_.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:qu,schema:_.object({query:_.string(),limit:_.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:au,schema:_.object({path:_.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:of,schema:_.object({path:_.string().optional(),depth:_.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:Ef,schema:_.object({pattern:_.string(),path:_.string().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:ff,schema:_.object({path:_.string(),expiresIn:_.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:Eo,schema:_.object({path:_.string().optional(),body:_.string(),parentId:_.string().optional(),lineStart:_.number().int().optional(),lineEnd:_.number().int().optional(),quotedContent:_.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:uo,schema:_.object({path:_.string().optional(),parentId:_.string().optional(),resolved:_.boolean().optional(),orgId:_.string().optional(),limit:_.number().int().min(1).optional(),offset:_.number().int().min(0).optional()})},"comment-get":{description:"Get a single comment by ID with all its replies. Returns { comment, replies }.",handler:fo,schema:_.object({id:_.string()})},"comment-update":{description:"Update a comment's body. Only the original author can update. Returns { id, body, updatedAt }.",handler:To,schema:_.object({id:_.string(),body:_.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:lo,schema:_.object({id:_.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:No,schema:_.object({id:_.string(),resolved:_.boolean()})}}});import{eq as z,and as Ro}from"drizzle-orm";function Qt(t,n){let o=crypto.randomUUID(),i=new Date;return t.insert(u.drives).values({id:o,orgId:n.orgId,name:n.name,isDefault:n.isDefault??!1,createdAt:i}).run(),{id:o,name:n.name}}function vn(t,n){return t.select().from(u.drives).where(z(u.drives.orgId,n)).all().map((o)=>({id:o.id,name:o.name,isDefault:o.isDefault}))}function Ot(t,n,o){return t.select().from(u.drives).where(z(u.drives.orgId,n)).all().filter((e)=>{let r=t.select({userId:u.driveMembers.userId}).from(u.driveMembers).where(z(u.driveMembers.driveId,e.id)).all();if(r.length===0)return!0;return r.some((E)=>E.userId===o)}).map((e)=>({id:e.id,name:e.name,isDefault:e.isDefault}))}function Gi(t,n){let o=t.select().from(u.drives).where(z(u.drives.id,n)).get();if(!o)return null;return{id:o.id,name:o.name,orgId:o.orgId,isDefault:o.isDefault}}function Jt(t,n){return t.select({userId:u.driveMembers.userId,email:u.users.email,role:u.driveMembers.role}).from(u.driveMembers).innerJoin(u.users,z(u.driveMembers.userId,u.users.id)).where(z(u.driveMembers.driveId,n)).all()}function Bt(t,n){if(!t.select({role:u.driveMembers.role}).from(u.driveMembers).where(Ro(z(u.driveMembers.driveId,n.driveId),z(u.driveMembers.userId,n.userId))).get())throw Error("Member not found in drive");t.update(u.driveMembers).set({role:n.role}).where(Ro(z(u.driveMembers.driveId,n.driveId),z(u.driveMembers.userId,n.userId))).run()}function Vt(t,n){if(!t.select({role:u.driveMembers.role}).from(u.driveMembers).where(Ro(z(u.driveMembers.driveId,n.driveId),z(u.driveMembers.userId,n.userId))).get())throw Error("Member not found in drive");t.delete(u.driveMembers).where(Ro(z(u.driveMembers.driveId,n.driveId),z(u.driveMembers.userId,n.userId))).run()}function Hi(t,n){t.insert(u.driveMembers).values({driveId:n.driveId,userId:n.userId,role:n.role}).onConflictDoUpdate({target:[u.driveMembers.driveId,u.driveMembers.userId],set:{role:n.role}}).run()}var Zi=R(()=>{G()});import{eq as Q,and as Wt,sql as Rf}from"drizzle-orm";function Kt(t,n){let o=crypto.randomUUID(),i=new Date;t.insert(u.orgs).values({id:o,name:n.name,isPersonal:n.isPersonal??!1,createdAt:i}).run(),t.insert(u.orgMembers).values({orgId:o,userId:n.userId,role:"admin"}).run();let e=Qt(t,{orgId:o,name:"default",isDefault:!0});return t.insert(u.driveMembers).values({driveId:e.id,userId:n.userId,role:"admin"}).run(),{id:o,name:n.name}}function p(t,n){return t.select({orgId:u.orgMembers.orgId,role:u.orgMembers.role,name:u.orgs.name,isPersonal:u.orgs.isPersonal}).from(u.orgMembers).innerJoin(u.orgs,Q(u.orgMembers.orgId,u.orgs.id)).where(Q(u.orgMembers.userId,n)).all().map((i)=>({id:i.orgId,name:i.name,role:i.role,isPersonal:i.isPersonal}))}function Yn(t,n){let o=t.select().from(u.orgs).where(Q(u.orgs.id,n)).get();if(!o)return null;return{id:o.id,name:o.name,isPersonal:o.isPersonal}}function pt(t,n){return t.select({userId:u.orgMembers.userId,email:u.users.email,role:u.orgMembers.role}).from(u.orgMembers).innerJoin(u.users,Q(u.orgMembers.userId,u.users.id)).where(Q(u.orgMembers.orgId,n)).all()}function ht(t,n){let o=t.select({role:u.orgMembers.role}).from(u.orgMembers).where(Wt(Q(u.orgMembers.orgId,n.orgId),Q(u.orgMembers.userId,n.userId))).get();if(!o)throw Error("Member not found in org");if(o.role==="admin"&&n.role!=="admin"){if(t.select({count:Rf`count(*)`}).from(u.orgMembers).where(Wt(Q(u.orgMembers.orgId,n.orgId),Q(u.orgMembers.role,"admin"))).get().count<=1)throw Error("Cannot remove the last admin from the org")}t.update(u.orgMembers).set({role:n.role}).where(Wt(Q(u.orgMembers.orgId,n.orgId),Q(u.orgMembers.userId,n.userId))).run()}function jt(t,n){if(t.select({isPersonal:u.orgs.isPersonal}).from(u.orgs).where(Q(u.orgs.id,n.orgId)).get()?.isPersonal)throw Error("Cannot remove members from a personal org");let i=t.select({role:u.orgMembers.role}).from(u.orgMembers).where(Wt(Q(u.orgMembers.orgId,n.orgId),Q(u.orgMembers.userId,n.userId))).get();if(!i)throw Error("Member not found in org");if(i.role==="admin"){if(t.select({count:Rf`count(*)`}).from(u.orgMembers).where(Wt(Q(u.orgMembers.orgId,n.orgId),Q(u.orgMembers.role,"admin"))).get().count<=1)throw Error("Cannot remove the last admin from the org")}let e=t.select({id:u.drives.id}).from(u.drives).where(Q(u.drives.orgId,n.orgId)).all();for(let r of e)t.delete(u.driveMembers).where(Wt(Q(u.driveMembers.driveId,r.id),Q(u.driveMembers.userId,n.userId))).run();t.delete(u.orgMembers).where(Wt(Q(u.orgMembers.orgId,n.orgId),Q(u.orgMembers.userId,n.userId))).run()}function kt(t,n){let o=t.select().from(u.users).where(Q(u.users.email,n.email)).get();if(!o)throw Error(`User with email ${n.email} not found`);t.insert(u.orgMembers).values({orgId:n.orgId,userId:o.id,role:n.role}).onConflictDoUpdate({target:[u.orgMembers.orgId,u.orgMembers.userId],set:{role:n.role}}).run();let i=t.select().from(u.drives).where(Q(u.drives.orgId,n.orgId)).get();if(i)t.insert(u.driveMembers).values({driveId:i.id,userId:o.id,role:n.role}).onConflictDoUpdate({target:[u.driveMembers.driveId,u.driveMembers.userId],set:{role:n.role}}).run()}var Qi=R(()=>{G();Zi()});import{eq as Af}from"drizzle-orm";function _f(t){let n=new Bun.CryptoHasher("sha256");return n.update(t),n.digest("hex")}function M_(){let t=new Uint8Array(32);return crypto.getRandomValues(t),`af_${Array.from(t,(o)=>o.toString(16).padStart(2,"0")).join("")}`}function F_(){return crypto.randomUUID()}function Et(t,n){let o=F_(),i=M_(),e=_f(i),r=new Date;return t.insert(u.users).values({id:o,email:n.email,apiKeyHash:e,createdAt:r}).run(),Kt(t,{name:n.email.split("@")[0],userId:o,isPersonal:!0}),{user:{id:o,email:n.email},apiKey:i}}function ut(t,n){let o=_f(n),i=t.select().from(u.users).where(Af(u.users.apiKeyHash,o)).get();if(!i)return null;return{id:i.id,email:i.email}}function Tn(t,n){let o=t.select().from(u.users).where(Af(u.users.email,n)).get();if(!o)return null;return{id:o.id,email:o.email}}var Ji=R(()=>{G();Qi()});import{eq as Ft,and as Bi}from"drizzle-orm";function b(t,n){if(n.driveId){let r=t.select().from(u.drives).where(Ft(u.drives.id,n.driveId)).get();if(!r)throw Error(`Drive not found: ${n.driveId}`);let E=At(t,n.userId,n.driveId);if(!E)throw Error("You do not have access to this drive");return{orgId:r.orgId,driveId:n.driveId,role:E}}if(n.orgId){let r=t.select().from(u.drives).where(Bi(Ft(u.drives.orgId,n.orgId),Ft(u.drives.isDefault,!0))).get();if(!r)throw Error(`No default drive for org: ${n.orgId}`);let E=At(t,n.userId,r.id);if(!E)throw Error("You do not have access to this drive");return{orgId:n.orgId,driveId:r.id,role:E}}let o=t.select({orgId:u.orgMembers.orgId}).from(u.orgMembers).innerJoin(u.orgs,Ft(u.orgMembers.orgId,u.orgs.id)).where(Bi(Ft(u.orgMembers.userId,n.userId),Ft(u.orgs.isPersonal,!0))).get();if(!o)throw Error("No personal org found for user");let i=t.select().from(u.drives).where(Bi(Ft(u.drives.orgId,o.orgId),Ft(u.drives.isDefault,!0))).get();if(!i)throw Error("No default drive found");let e=At(t,n.userId,i.id);if(!e)throw Error("You do not have access to your default drive");return{orgId:o.orgId,driveId:i.id,role:e}}var wf=R(()=>{G();an()});function Gn(t){let n=P();if(n.auth.apiKey){if(ut(t,n.auth.apiKey))return{apiKey:n.auth.apiKey}}console.error("[agent-fs] No local user found, creating one...");let o=Et(t,{email:"local@agent-fs.local"});return U("auth.apiKey",o.apiKey),console.error("[agent-fs] Local user created automatically."),{apiKey:o.apiKey}}var yf=R(()=>{wn();Ji()});var Lf=R(()=>{Ji();Qi();Zi();an();wf();yf()});var Df;var gf=R(()=>{Df={name:"agent-fs",version:"0.7.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:{"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 q;var Vi=R(()=>{gf();q=Df.version});var If={};bt(If,{LocalEmbeddingProvider:()=>Of});import{join as Y_}from"path";import{mkdirSync as G_,existsSync as H_}from"fs";class Of{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:t,resolveModelFile:n}=await import("node-llama-cpp");this.llama=await t();let o=Y_(V(),"models");if(!H_(o))G_(o,{recursive:!0});console.error("[agent-fs] Resolving local embedding model...");let i=await n(Z_,o);console.error("[agent-fs] Model ready:",i),this.model=await this.llama.loadModel({modelPath:i}),this.embeddingContext=await this.model.createEmbeddingContext()}async embed(t){await this.init();let n=await this.embeddingContext.getEmbeddingFor(t);return Array.from(n.vector)}async embedBatch(t){await this.init();let n=[];for(let o of t){let i=await this.embeddingContext.getEmbeddingFor(o);n.push(Array.from(i.vector))}return n}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 Z_="hf:nomic-ai/nomic-embed-text-v1.5-GGUF:Q8_0";var Uf=R(()=>{wn()});var Wi={};bt(Wi,{OpenAIEmbeddingProvider:()=>Sf});import Q_ from"openai";class Sf{name="openai";dimensions=768;client;constructor(t){this.client=new Q_({apiKey:t})}async embed(t){return(await this.client.embeddings.create({model:"text-embedding-3-small",input:t,dimensions:768})).data[0].embedding}async embedBatch(t){return(await this.client.embeddings.create({model:"text-embedding-3-small",input:t,dimensions:768})).data.sort((o,i)=>o.index-i.index).map((o)=>o.embedding)}}var Ki=()=>{};var pi={};bt(pi,{GeminiEmbeddingProvider:()=>$f});import{GoogleGenAI as J_}from"@google/genai";class $f{name="gemini";dimensions=768;client;constructor(t){this.client=new J_({apiKey:t})}async embed(t){return(await this.client.models.embedContent({model:"gemini-embedding-001",contents:t,config:{outputDimensionality:768}})).embeddings[0].values}async embedBatch(t){let n=[];for(let o of t){let i=await this.client.models.embedContent({model:"gemini-embedding-001",contents:o,config:{outputDimensionality:768}});n.push(i.embeddings[0].values)}return n}}var hi=()=>{};async function Xf(t){switch(t.provider){case"local":{let{LocalEmbeddingProvider:n}=await Promise.resolve().then(() => (Uf(),If));return new n}case"openai":{if(!t.apiKey)throw Error("OpenAI API key required. Set embedding.apiKey in config.");let{OpenAIEmbeddingProvider:n}=await Promise.resolve().then(() => (Ki(),Wi));return new n(t.apiKey)}case"gemini":{if(!t.apiKey)throw Error("Gemini API key required. Set embedding.apiKey in config.");let{GeminiEmbeddingProvider:n}=await Promise.resolve().then(() => (hi(),pi));return new n(t.apiKey)}default:throw Error(`Unknown embedding provider: ${t.provider}`)}}async function ln(t){if(process.env.OPENAI_API_KEY)try{let{OpenAIEmbeddingProvider:n}=await Promise.resolve().then(() => (Ki(),Wi));return new n(process.env.OPENAI_API_KEY)}catch(n){console.error("[agent-fs] Failed to load OpenAI provider:",n)}if(process.env.GEMINI_API_KEY)try{let{GeminiEmbeddingProvider:n}=await Promise.resolve().then(() => (hi(),pi));return new n(process.env.GEMINI_API_KEY)}catch(n){console.error("[agent-fs] Failed to load Gemini provider:",n)}if(t?.provider&&t.provider!=="local"&&t.apiKey)try{return await Xf(t)}catch(n){console.error("[agent-fs] Failed to create embedding provider from config:",n)}if(t?.provider==="local")try{return await Xf(t)}catch(n){console.error("[agent-fs] Failed to load local embedding provider:",n)}return null}var Pf,Cf,Mf=(t)=>typeof t==="string"?{...Cf,name:t}:{...Cf,...t};var Ao=R(()=>{Pf=Symbol("Let zodToJsonSchema decide on which parser to use"),Cf={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 Ff=(t)=>{let n=Mf(t),o=n.name!==void 0?[...n.basePath,n.definitionPath,n.name]:n.basePath;return{...n,flags:{hasReferencedOpenAiAnyType:!1},currentPath:o,propertyPath:void 0,seen:new Map(Object.entries(n.definitions).map(([i,e])=>[e._def,{def:e._def,path:[...n.basePath,n.definitionPath,i],jsonSchema:void 0}]))}};var ji=R(()=>{Ao()});function ki(t,n,o,i){if(!i?.errorMessages)return;if(o)t.errorMessage={...t.errorMessage,[n]:o}}function X(t,n,o,i,e){t[n]=o,ki(t,n,i,e)}var _o=(t,n)=>{let o=0;for(;o<t.length&&o<n.length;o++)if(t[o]!==n[o])break;return[(t.length-o).toString(),...n.slice(o)].join("/")};function H(t){if(t.target!=="openAi")return{};let n=[...t.basePath,t.definitionPath,t.openAiAnyTypeName];return t.flags.hasReferencedOpenAiAnyType=!0,{$ref:t.$refStrategy==="relative"?_o(n,t.currentPath):n.join("/")}}var tt=()=>{};import{ZodFirstPartyTypeKind as B_}from"zod/v3";function vf(t,n){let o={type:"array"};if(t.type?._def&&t.type?._def?.typeName!==B_.ZodAny)o.items=L(t.type._def,{...n,currentPath:[...n.currentPath,"items"]});if(t.minLength)X(o,"minItems",t.minLength.value,t.minLength.message,n);if(t.maxLength)X(o,"maxItems",t.maxLength.value,t.maxLength.message,n);if(t.exactLength)X(o,"minItems",t.exactLength.value,t.exactLength.message,n),X(o,"maxItems",t.exactLength.value,t.exactLength.message,n);return o}var di=R(()=>{B()});function Yf(t,n){let o={type:"integer",format:"int64"};if(!t.checks)return o;for(let i of t.checks)switch(i.kind){case"min":if(n.target==="jsonSchema7")if(i.inclusive)X(o,"minimum",i.value,i.message,n);else X(o,"exclusiveMinimum",i.value,i.message,n);else{if(!i.inclusive)o.exclusiveMinimum=!0;X(o,"minimum",i.value,i.message,n)}break;case"max":if(n.target==="jsonSchema7")if(i.inclusive)X(o,"maximum",i.value,i.message,n);else X(o,"exclusiveMaximum",i.value,i.message,n);else{if(!i.inclusive)o.exclusiveMaximum=!0;X(o,"maximum",i.value,i.message,n)}break;case"multipleOf":X(o,"multipleOf",i.value,i.message,n);break}return o}var mi=()=>{};function Gf(){return{type:"boolean"}}function wo(t,n){return L(t.type._def,n)}var yo=R(()=>{B()});var Hf=(t,n)=>{return L(t.innerType._def,n)};var zi=R(()=>{B()});function bi(t,n,o){let i=o??n.dateStrategy;if(Array.isArray(i))return{anyOf:i.map((e,r)=>bi(t,n,e))};switch(i){case"string":case"format:date-time":return{type:"string",format:"date-time"};case"format:date":return{type:"string",format:"date"};case"integer":return V_(t,n)}}var V_=(t,n)=>{let o={type:"integer",format:"unix-time"};if(n.target==="openApi3")return o;for(let i of t.checks)switch(i.kind){case"min":X(o,"minimum",i.value,i.message,n);break;case"max":X(o,"maximum",i.value,i.message,n);break}return o};var qi=()=>{};function Zf(t,n){return{...L(t.innerType._def,n),default:t.defaultValue()}}var si=R(()=>{B()});function Qf(t,n){return n.effectStrategy==="input"?L(t.schema._def,n):H(n)}var ci=R(()=>{B();tt()});function Jf(t){return{type:"string",enum:Array.from(t.values)}}function Bf(t,n){let o=[L(t.left._def,{...n,currentPath:[...n.currentPath,"allOf","0"]}),L(t.right._def,{...n,currentPath:[...n.currentPath,"allOf","1"]})].filter((r)=>!!r),i=n.target==="jsonSchema2019-09"?{unevaluatedProperties:!1}:void 0,e=[];return o.forEach((r)=>{if(W_(r)){if(e.push(...r.allOf),r.unevaluatedProperties===void 0)i=void 0}else{let E=r;if("additionalProperties"in r&&r.additionalProperties===!1){let{additionalProperties:f,...T}=r;E=T}else i=void 0;e.push(E)}}),e.length?{allOf:e,...i}:void 0}var W_=(t)=>{if("type"in t&&t.type==="string")return!1;return"allOf"in t};var xi=R(()=>{B()});function Vf(t,n){let o=typeof t.value;if(o!=="bigint"&&o!=="number"&&o!=="boolean"&&o!=="string")return{type:Array.isArray(t.value)?"array":"object"};if(n.target==="openApi3")return{type:o==="bigint"?"integer":o,enum:[t.value]};return{type:o==="bigint"?"integer":o,const:t.value}}function Lo(t,n){let o={type:"string"};if(t.checks)for(let i of t.checks)switch(i.kind){case"min":X(o,"minLength",typeof o.minLength==="number"?Math.max(o.minLength,i.value):i.value,i.message,n);break;case"max":X(o,"maxLength",typeof o.maxLength==="number"?Math.min(o.maxLength,i.value):i.value,i.message,n);break;case"email":switch(n.emailStrategy){case"format:email":Tt(o,"email",i.message,n);break;case"format:idn-email":Tt(o,"idn-email",i.message,n);break;case"pattern:zod":d(o,ft.email,i.message,n);break}break;case"url":Tt(o,"uri",i.message,n);break;case"uuid":Tt(o,"uuid",i.message,n);break;case"regex":d(o,i.regex,i.message,n);break;case"cuid":d(o,ft.cuid,i.message,n);break;case"cuid2":d(o,ft.cuid2,i.message,n);break;case"startsWith":d(o,RegExp(`^${te(i.value,n)}`),i.message,n);break;case"endsWith":d(o,RegExp(`${te(i.value,n)}$`),i.message,n);break;case"datetime":Tt(o,"date-time",i.message,n);break;case"date":Tt(o,"date",i.message,n);break;case"time":Tt(o,"time",i.message,n);break;case"duration":Tt(o,"duration",i.message,n);break;case"length":X(o,"minLength",typeof o.minLength==="number"?Math.max(o.minLength,i.value):i.value,i.message,n),X(o,"maxLength",typeof o.maxLength==="number"?Math.min(o.maxLength,i.value):i.value,i.message,n);break;case"includes":{d(o,RegExp(te(i.value,n)),i.message,n);break}case"ip":{if(i.version!=="v6")Tt(o,"ipv4",i.message,n);if(i.version!=="v4")Tt(o,"ipv6",i.message,n);break}case"base64url":d(o,ft.base64url,i.message,n);break;case"jwt":d(o,ft.jwt,i.message,n);break;case"cidr":{if(i.version!=="v6")d(o,ft.ipv4Cidr,i.message,n);if(i.version!=="v4")d(o,ft.ipv6Cidr,i.message,n);break}case"emoji":d(o,ft.emoji(),i.message,n);break;case"ulid":{d(o,ft.ulid,i.message,n);break}case"base64":{switch(n.base64Strategy){case"format:binary":{Tt(o,"binary",i.message,n);break}case"contentEncoding:base64":{X(o,"contentEncoding","base64",i.message,n);break}case"pattern:zod":{d(o,ft.base64,i.message,n);break}}break}case"nanoid":d(o,ft.nanoid,i.message,n);case"toLowerCase":case"toUpperCase":case"trim":break;default:((e)=>{})(i)}return o}function te(t,n){return n.patternStrategy==="escape"?p_(t):t}function p_(t){let n="";for(let o=0;o<t.length;o++){if(!K_.has(t[o]))n+="\\";n+=t[o]}return n}function Tt(t,n,o,i){if(t.format||t.anyOf?.some((e)=>e.format)){if(!t.anyOf)t.anyOf=[];if(t.format){if(t.anyOf.push({format:t.format,...t.errorMessage&&i.errorMessages&&{errorMessage:{format:t.errorMessage.format}}}),delete t.format,t.errorMessage){if(delete t.errorMessage.format,Object.keys(t.errorMessage).length===0)delete t.errorMessage}}t.anyOf.push({format:n,...o&&i.errorMessages&&{errorMessage:{format:o}}})}else X(t,"format",n,o,i)}function d(t,n,o,i){if(t.pattern||t.allOf?.some((e)=>e.pattern)){if(!t.allOf)t.allOf=[];if(t.pattern){if(t.allOf.push({pattern:t.pattern,...t.errorMessage&&i.errorMessages&&{errorMessage:{pattern:t.errorMessage.pattern}}}),delete t.pattern,t.errorMessage){if(delete t.errorMessage.pattern,Object.keys(t.errorMessage).length===0)delete t.errorMessage}}t.allOf.push({pattern:Wf(n,i),...o&&i.errorMessages&&{errorMessage:{pattern:o}}})}else X(t,"pattern",Wf(n,i),o,i)}function Wf(t,n){if(!n.applyRegexFlags||!t.flags)return t.source;let o={i:t.flags.includes("i"),m:t.flags.includes("m"),s:t.flags.includes("s")},i=o.i?t.source.toLowerCase():t.source,e="",r=!1,E=!1,f=!1;for(let T=0;T<i.length;T++){if(r){e+=i[T],r=!1;continue}if(o.i){if(E){if(i[T].match(/[a-z]/)){if(f)e+=i[T],e+=`${i[T-2]}-${i[T]}`.toUpperCase(),f=!1;else if(i[T+1]==="-"&&i[T+2]?.match(/[a-z]/))e+=i[T],f=!0;else e+=`${i[T]}${i[T].toUpperCase()}`;continue}}else if(i[T].match(/[a-z]/)){e+=`[${i[T]}${i[T].toUpperCase()}]`;continue}}if(o.m){if(i[T]==="^"){e+=`(^|(?<=[\r
173
173
  ]))`;continue}else if(i[T]==="$"){e+=`($|(?=[\r
174
174
  ]))`;continue}}if(o.s&&i[T]==="."){e+=E?`${i[T]}\r
175
175
  `:`[${i[T]}\r
176
- ]`;continue}if(e+=i[T],i[T]==="\\")r=!0;else if(E&&i[T]==="]")E=!1;else if(!E&&i[T]==="[")E=!0}try{new RegExp(e)}catch{return console.warn(`Could not convert regex pattern at ${n.currentPath.join("/")} to a flag-independent form! Falling back to the flag-ignorant source`),t.source}return e}var mi=void 0,Et,Pl;var Ao=A(()=>{Et={cuid:/^[cC][^\s-]{8,}$/,cuid2:/^[0-9a-z]+$/,ulid:/^[0-9A-HJKMNP-TV-Z]{26}$/,email:/^(?!\.)(?!.*\.\.)([a-zA-Z0-9_'+\-\.]*)[a-zA-Z0-9_+-]@([a-zA-Z0-9][a-zA-Z0-9\-]*\.)+[a-zA-Z]{2,}$/,emoji:()=>{if(mi===void 0)mi=RegExp("^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$","u");return mi},uuid:/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/,ipv4:/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,ipv4Cidr:/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,ipv6:/^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/,ipv6Cidr:/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,base64:/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,base64url:/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,nanoid:/^[a-zA-Z0-9_-]{21}$/,jwt:/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/};Pl=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789")});import{ZodFirstPartyTypeKind as Cn}from"zod/v3";function yo(t,n){if(n.target==="openAi")console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead.");if(n.target==="openApi3"&&t.keyType?._def.typeName===Cn.ZodEnum)return{type:"object",required:t.keyType._def.values,properties:t.keyType._def.values.reduce((i,e)=>({...i,[e]:g(t.valueType._def,{...n,currentPath:[...n.currentPath,"properties",e]})??G(n)}),{}),additionalProperties:n.rejectedAdditionalProperties};let o={type:"object",additionalProperties:g(t.valueType._def,{...n,currentPath:[...n.currentPath,"additionalProperties"]})??n.allowedAdditionalProperties};if(n.target==="openApi3")return o;if(t.keyType?._def.typeName===Cn.ZodString&&t.keyType._def.checks?.length){let{type:i,...e}=Ro(t.keyType._def,n);return{...o,propertyNames:e}}else if(t.keyType?._def.typeName===Cn.ZodEnum)return{...o,propertyNames:{enum:t.keyType._def.values}};else if(t.keyType?._def.typeName===Cn.ZodBranded&&t.keyType._def.type._def.typeName===Cn.ZodString&&t.keyType._def.type._def.checks?.length){let{type:i,...e}=To(t.keyType._def,n);return{...o,propertyNames:e}}return o}var lo=A(()=>{J();Ao();No();x()});function Gu(t,n){if(n.mapStrategy==="record")return yo(t,n);let o=g(t.keyType._def,{...n,currentPath:[...n.currentPath,"items","items","0"]})||G(n),i=g(t.valueType._def,{...n,currentPath:[...n.currentPath,"items","items","1"]})||G(n);return{type:"array",maxItems:125,items:{type:"array",items:[o,i],minItems:2,maxItems:2}}}var qi=A(()=>{J();lo();x()});function Zu(t){let n=t.values,i=Object.keys(t.values).filter((r)=>{return typeof n[n[r]]!=="number"}).map((r)=>n[r]),e=Array.from(new Set(i.map((r)=>typeof r)));return{type:e.length===1?e[0]==="string"?"string":"number":["string","number"],enum:i}}function Hu(t){return t.target==="openAi"?void 0:{not:G({...t,currentPath:[...t.currentPath,"not"]})}}var si=A(()=>{x()});function Qu(t){return t.target==="openApi3"?{enum:["null"],nullable:!0}:{type:"null"}}function Bu(t,n){if(n.target==="openApi3")return Ju(t,n);let o=t.options instanceof Map?Array.from(t.options.values()):t.options;if(o.every((i)=>(i._def.typeName in Pn)&&(!i._def.checks||!i._def.checks.length))){let i=o.reduce((e,r)=>{let E=Pn[r._def.typeName];return E&&!e.includes(E)?[...e,E]:e},[]);return{type:i.length>1?i:i[0]}}else if(o.every((i)=>i._def.typeName==="ZodLiteral"&&!i.description)){let i=o.reduce((e,r)=>{let E=typeof r._def.value;switch(E){case"string":case"number":case"boolean":return[...e,E];case"bigint":return[...e,"integer"];case"object":if(r._def.value===null)return[...e,"null"];case"symbol":case"undefined":case"function":default:return e}},[]);if(i.length===o.length){let e=i.filter((r,E,u)=>u.indexOf(r)===E);return{type:e.length>1?e:e[0],enum:o.reduce((r,E)=>{return r.includes(E._def.value)?r:[...r,E._def.value]},[])}}}else if(o.every((i)=>i._def.typeName==="ZodEnum"))return{type:"string",enum:o.reduce((i,e)=>[...i,...e._def.values.filter((r)=>!i.includes(r))],[])};return Ju(t,n)}var Pn,Ju=(t,n)=>{let o=(t.options instanceof Map?Array.from(t.options.values()):t.options).map((i,e)=>g(i._def,{...n,currentPath:[...n.currentPath,"anyOf",`${e}`]})).filter((i)=>!!i&&(!n.strictUnions||typeof i==="object"&&Object.keys(i).length>0));return o.length?{anyOf:o}:void 0};var _o=A(()=>{J();Pn={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"}});function Wu(t,n){if(["ZodString","ZodNumber","ZodBigInt","ZodBoolean","ZodNull"].includes(t.innerType._def.typeName)&&(!t.innerType._def.checks||!t.innerType._def.checks.length)){if(n.target==="openApi3")return{type:Pn[t.innerType._def.typeName],nullable:!0};return{type:[Pn[t.innerType._def.typeName],"null"]}}if(n.target==="openApi3"){let i=g(t.innerType._def,{...n,currentPath:[...n.currentPath]});if(i&&"$ref"in i)return{allOf:[i],nullable:!0};return i&&{...i,nullable:!0}}let o=g(t.innerType._def,{...n,currentPath:[...n.currentPath,"anyOf","0"]});return o&&{anyOf:[o,{type:"null"}]}}var ci=A(()=>{J();_o()});function Vu(t,n){let o={type:"number"};if(!t.checks)return o;for(let i of t.checks)switch(i.kind){case"int":o.type="integer",Wi(o,"type",i.message,n);break;case"min":if(n.target==="jsonSchema7")if(i.inclusive)$(o,"minimum",i.value,i.message,n);else $(o,"exclusiveMinimum",i.value,i.message,n);else{if(!i.inclusive)o.exclusiveMinimum=!0;$(o,"minimum",i.value,i.message,n)}break;case"max":if(n.target==="jsonSchema7")if(i.inclusive)$(o,"maximum",i.value,i.message,n);else $(o,"exclusiveMaximum",i.value,i.message,n);else{if(!i.inclusive)o.exclusiveMaximum=!0;$(o,"maximum",i.value,i.message,n)}break;case"multipleOf":$(o,"multipleOf",i.value,i.message,n);break}return o}var xi=()=>{};function Ku(t,n){let o=n.target==="openAi",i={type:"object",properties:{}},e=[],r=t.shape();for(let u in r){let T=r[u];if(T===void 0||T._def===void 0)continue;let N=Fl(T);if(N&&o){if(T._def.typeName==="ZodOptional")T=T._def.innerType;if(!T.isNullable())T=T.nullable();N=!1}let R=g(T._def,{...n,currentPath:[...n.currentPath,"properties",u],propertyPath:[...n.currentPath,"properties",u]});if(R===void 0)continue;if(i.properties[u]=R,!N)e.push(u)}if(e.length)i.required=e;let E=Ml(t,n);if(E!==void 0)i.additionalProperties=E;return i}function Ml(t,n){if(t.catchall._def.typeName!=="ZodNever")return g(t.catchall._def,{...n,currentPath:[...n.currentPath,"additionalProperties"]});switch(t.unknownKeys){case"passthrough":return n.allowedAdditionalProperties;case"strict":return n.rejectedAdditionalProperties;case"strip":return n.removeAdditionalStrategy==="strict"?n.allowedAdditionalProperties:n.rejectedAdditionalProperties}}function Fl(t){try{return t.isOptional()}catch{return!0}}var ai=A(()=>{J()});var pu=(t,n)=>{if(n.currentPath.toString()===n.propertyPath?.toString())return g(t.innerType._def,n);let o=g(t.innerType._def,{...n,currentPath:[...n.currentPath,"anyOf","1"]});return o?{anyOf:[{not:G(n)},o]}:G(n)};var te=A(()=>{J();x()});var ju=(t,n)=>{if(n.pipeStrategy==="input")return g(t.in._def,n);else if(n.pipeStrategy==="output")return g(t.out._def,n);let o=g(t.in._def,{...n,currentPath:[...n.currentPath,"allOf","0"]}),i=g(t.out._def,{...n,currentPath:[...n.currentPath,"allOf",o?"1":"0"]});return{allOf:[o,i].filter((e)=>e!==void 0)}};var ne=A(()=>{J()});function hu(t,n){return g(t.type._def,n)}var oe=A(()=>{J()});function ku(t,n){let i={type:"array",uniqueItems:!0,items:g(t.valueType._def,{...n,currentPath:[...n.currentPath,"items"]})};if(t.minSize)$(i,"minItems",t.minSize.value,t.minSize.message,n);if(t.maxSize)$(i,"maxItems",t.maxSize.value,t.maxSize.message,n);return i}var ie=A(()=>{J()});function zu(t,n){if(t.rest)return{type:"array",minItems:t.items.length,items:t.items.map((o,i)=>g(o._def,{...n,currentPath:[...n.currentPath,"items",`${i}`]})).reduce((o,i)=>i===void 0?o:[...o,i],[]),additionalItems:g(t.rest._def,{...n,currentPath:[...n.currentPath,"additionalItems"]})};else return{type:"array",minItems:t.items.length,maxItems:t.items.length,items:t.items.map((o,i)=>g(o._def,{...n,currentPath:[...n.currentPath,"items",`${i}`]})).reduce((o,i)=>i===void 0?o:[...o,i],[])}}var ee=A(()=>{J()});function du(t){return{not:G(t)}}var re=A(()=>{x()});function mu(t){return G(t)}var Ee=A(()=>{x()});var bu=(t,n)=>{return g(t.innerType._def,n)};var fe=A(()=>{J()});import{ZodFirstPartyTypeKind as S}from"zod/v3";var qu=(t,n,o)=>{switch(n){case S.ZodString:return Ro(t,o);case S.ZodNumber:return Vu(t,o);case S.ZodObject:return Ku(t,o);case S.ZodBigInt:return Su(t,o);case S.ZodBoolean:return $u();case S.ZodDate:return ji(t,o);case S.ZodUndefined:return du(o);case S.ZodNull:return Qu(o);case S.ZodArray:return Uu(t,o);case S.ZodUnion:case S.ZodDiscriminatedUnion:return Bu(t,o);case S.ZodIntersection:return Mu(t,o);case S.ZodTuple:return zu(t,o);case S.ZodRecord:return yo(t,o);case S.ZodLiteral:return Fu(t,o);case S.ZodEnum:return vu(t);case S.ZodNativeEnum:return Zu(t);case S.ZodNullable:return Wu(t,o);case S.ZodOptional:return pu(t,o);case S.ZodMap:return Gu(t,o);case S.ZodSet:return ku(t,o);case S.ZodLazy:return()=>t.getter()._def;case S.ZodPromise:return hu(t,o);case S.ZodNaN:case S.ZodNever:return Hu(o);case S.ZodEffects:return Pu(t,o);case S.ZodAny:return G(o);case S.ZodUnknown:return mu(o);case S.ZodDefault:return Cu(t,o);case S.ZodBranded:return To(t,o);case S.ZodReadonly:return bu(t,o);case S.ZodCatch:return Xu(t,o);case S.ZodPipeline:return ju(t,o);case S.ZodFunction:case S.ZodVoid:case S.ZodSymbol:return;default:return((i)=>{return})(n)}};var ue=A(()=>{x();Vi();Ki();No();pi();hi();ki();zi();di();qi();si();ci();xi();ai();te();ne();oe();lo();ie();Ao();ee();re();_o();Ee();fe()});function g(t,n,o=!1){let i=n.seen.get(t);if(n.override){let u=n.override?.(t,n,i,o);if(u!==Du)return u}if(i&&!o){let u=Yl(i,n);if(u!==void 0)return u}let e={def:t,path:n.currentPath,jsonSchema:void 0};n.seen.set(t,e);let r=qu(t,t.typeName,n),E=typeof r==="function"?g(r(),n):r;if(E)Gl(t,n,E);if(n.postProcess){let u=n.postProcess(E,t,n);return e.jsonSchema=E,u}return e.jsonSchema=E,E}var Yl=(t,n)=>{switch(n.$refStrategy){case"root":return{$ref:t.path.join("/")};case"relative":return{$ref:uo(n.currentPath,t.path)};case"none":case"seen":{if(t.path.length<n.currentPath.length&&t.path.every((o,i)=>n.currentPath[i]===o))return console.warn(`Recursive reference detected at ${n.currentPath.join("/")}! Defaulting to any`),G(n);return n.$refStrategy==="seen"?G(n):void 0}}},Gl=(t,n,o)=>{if(t.description){if(o.description=t.description,n.markdownDescription)o.markdownDescription=t.description}return o};var J=A(()=>{fo();ue();x()});var su=()=>{};var Te=(t,n)=>{let o=Iu(n),i=typeof n==="object"&&n.definitions?Object.entries(n.definitions).reduce((T,[N,R])=>({...T,[N]:g(R._def,{...o,currentPath:[...o.basePath,o.definitionPath,N]},!0)??G(o)}),{}):void 0,e=typeof n==="string"?n:n?.nameStrategy==="title"?void 0:n?.name,r=g(t._def,e===void 0?o:{...o,currentPath:[...o.basePath,o.definitionPath,e]},!1)??G(o),E=typeof n==="object"&&n.name!==void 0&&n.nameStrategy==="title"?n.name:void 0;if(E!==void 0)r.title=E;if(o.flags.hasReferencedOpenAiAnyType){if(!i)i={};if(!i[o.openAiAnyTypeName])i[o.openAiAnyTypeName]={type:["string","number","integer","boolean","array","null"],items:{$ref:o.$refStrategy==="relative"?"1":[...o.basePath,o.definitionPath,o.openAiAnyTypeName].join("/")}}}let u=e===void 0?i?{...r,[o.definitionPath]:i}:r:{$ref:[...o.$refStrategy==="relative"?[]:o.basePath,o.definitionPath,e].join("/"),[o.definitionPath]:{...i,[e]:r}};if(o.target==="jsonSchema7")u.$schema="http://json-schema.org/draft-07/schema#";else if(o.target==="jsonSchema2019-09"||o.target==="openAi")u.$schema="https://json-schema.org/draft/2019-09/schema#";if(o.target==="openAi"&&(("anyOf"in u)||("oneOf"in u)||("allOf"in u)||("type"in u)&&Array.isArray(u.type)))console.warn("Warning: OpenAI may not support schemas with unions as roots! Try wrapping it in an object property.");return u};var Ne=A(()=>{J();Bi();x()});var cu=A(()=>{Ne();fo();Bi();J();su();x();Vi();Ki();No();pi();hi();ki();zi();di();qi();si();ci();xi();ai();te();ne();oe();fe();lo();ie();Ao();ee();re();_o();Ee();ue();Ne()});function wo(){let t=en(),n={},o={};for(let e of t){let r=Pt(e),E=Te(r.schema,{target:"openApi3"}),{$schema:u,...T}=E;n[e]=T,o[e]=r.description}let i=t.map((e)=>({type:"object",title:e,description:o[e],required:["op",...n[e].required||[]],properties:{op:{type:"string",const:e},driveId:{type:"string",description:"Target drive ID (optional, uses default drive)"},...n[e].properties||{}},additionalProperties:!1}));return{openapi:"3.1.0",info:{title:"agent-fs API",version:b,description:"A persistent, searchable filesystem for AI agents. agent-fs is to files what agentmail is to email.",license:{name:"MIT",url:"https://github.com/desplega-ai/agent-fs/blob/main/LICENSE"}},servers:[{url:"http://localhost:7433",description:"Local development server"}],paths:{"/health":{get:{summary:"Health check",operationId:"health",tags:["System"],security:[],responses:{"200":{description:"Server is healthy",content:{"application/json":{schema:{type:"object",properties:{ok:{type:"boolean",const:!0},version:{type:"string"}},required:["ok","version"]}}}}}}},"/auth/register":{post:{summary:"Register a new user",operationId:"register",tags:["Auth"],security:[],requestBody:{required:!0,content:{"application/json":{schema:{type:"object",properties:{email:{type:"string",format:"email"}},required:["email"]}}}},responses:{"200":{description:"User registered",content:{"application/json":{schema:{type:"object",properties:{userId:{type:"string"},orgId:{type:"string"},driveId:{type:"string"},apiKey:{type:"string"}},required:["userId","orgId","driveId","apiKey"]}}}}}}},"/auth/me":{get:{summary:"Get current user info",operationId:"me",tags:["Auth"],responses:{"200":{description:"Current user",content:{"application/json":{schema:{type:"object",properties:{id:{type:"string"},email:{type:"string"},createdAt:{type:"string",format:"date-time"}},required:["id","email","createdAt"]}}}}}}},"/orgs/{orgId}/ops":{post:{summary:"Dispatch a file operation",operationId:"dispatchOp",tags:["Operations"],description:"All file operations go through this single endpoint. The `op` field determines which operation to execute.",parameters:[{name:"orgId",in:"path",required:!0,schema:{type:"string"},description:"Organization ID"}],requestBody:{required:!0,content:{"application/json":{schema:{oneOf:i,discriminator:{propertyName:"op"}}}}},responses:{"200":{description:"Operation result (varies by op)",content:{"application/json":{schema:{type:"object",description:"Response shape depends on the operation. See each op's description for details."}}}},"400":{description:"Validation error",content:{"application/json":{schema:{$ref:"#/components/schemas/Error"}}}},"401":{description:"Unauthorized",content:{"application/json":{schema:{$ref:"#/components/schemas/Error"}}}},"403":{description:"Permission denied (RBAC)",content:{"application/json":{schema:{$ref:"#/components/schemas/Error"}}}},"404":{description:"File or resource not found",content:{"application/json":{schema:{$ref:"#/components/schemas/Error"}}}}}}}},components:{securitySchemes:{bearerAuth:{type:"http",scheme:"bearer",description:"API key obtained from /auth/register"}},schemas:{Error:{type:"object",properties:{error:{type:"string"},message:{type:"string"}},required:["error","message"]}}},security:[{bearerAuth:[]}]}}var xu=A(()=>{cu();Xi();Gi()});var au={};mt(au,{writeRaw:()=>gt,write:()=>cn,updateOrgMemberRole:()=>Kt,updateDriveMemberRole:()=>Qt,setDriveMember:()=>Pi,setConfigValue:()=>D,setConfig:()=>ve,schema:()=>f,resolveContext:()=>m,removeOrgMember:()=>pt,removeDriveMember:()=>Jt,listUserOrgs:()=>K,listOrgMembers:()=>Vt,listDrivesForUser:()=>Lt,listDrives:()=>Sn,listDriveMembers:()=>Ht,inviteToOrg:()=>jt,getUserDriveRole:()=>At,getUserByEmail:()=>rn,getUserByApiKey:()=>rt,getS3Key:()=>U,getRequiredRole:()=>Dn,getRegisteredOps:()=>en,getOrg:()=>$n,getOpDefinition:()=>Pt,getNextVersion:()=>mn,getHome:()=>W,getHeadVersionRow:()=>ct,getHeadContentHash:()=>bn,getDrive:()=>Ci,getDbPath:()=>Yt,getConfigPath:()=>ut,getConfig:()=>C,generateOpenAPISpec:()=>wo,ensureLocalUser:()=>Xn,dispatchOp:()=>j,createVersion:()=>p,createUser:()=>et,createOrg:()=>Wt,createEmbeddingProviderFromEnv:()=>En,createDrive:()=>Zt,createDatabase:()=>Ut,commentUpdate:()=>io,commentResolve:()=>ro,commentList:()=>no,commentGet:()=>oo,commentDelete:()=>eo,commentAdd:()=>to,checkPermission:()=>On,assertExpectedVersion:()=>h,ValidationError:()=>it,VERSION:()=>b,PermissionDeniedError:()=>nt,NotFoundError:()=>v,IndexingInProgressError:()=>Ln,EditConflictError:()=>ot,AgentS3Client:()=>$t,AgentFSError:()=>Rt});var Y=A(()=>{H();Nn();sE();z();Xi();V();Tu();Gi();xu()});var Do={};mt(Do,{stopDaemon:()=>u_,startDaemon:()=>f_,daemonStatus:()=>T_});import{spawn as i_}from"child_process";import{readFileSync as ye,writeFileSync as e_,unlinkSync as go,existsSync as Mn,openSync as r_}from"fs";import{join as Lo}from"path";function le(){return Lo(W(),"agent-fs.pid")}function E_(){return Lo(W(),"agent-fs.log")}function ET(){return Lo(W(),"agent-fs.sock")}function f_(){let t=le();if(Mn(t)){let u=parseInt(ye(t,"utf-8").trim());try{process.kill(u,0),console.log(`Daemon already running (PID: ${u})`);return}catch{go(t);let T=ET();if(Mn(T))try{go(T)}catch{}}}let n=E_(),o=r_(n,"a"),i=!import.meta.dir.startsWith("/")||import.meta.dir.startsWith("/$bunfs"),e=i?process.execPath:"bun",r=i?["server"]:["run",Lo(import.meta.dir,"index.ts")],E=i_(e,r,{detached:!0,stdio:["ignore",o,o]});if(E.unref(),E.pid)e_(t,String(E.pid)),console.log(`Daemon started (PID: ${E.pid})`),console.log(`Logs: ${n}`)}function u_(){let t=le();if(!Mn(t)){console.log("Daemon is not running");return}let n=parseInt(ye(t,"utf-8").trim());try{process.kill(n,"SIGTERM"),console.log(`Daemon stopped (PID: ${n})`)}catch{console.log(`Process ${n} not found (already stopped)`)}go(t);let o=ET();if(Mn(o))try{go(o)}catch{}}function T_(){let t=le();if(!Mn(t))return{running:!1};let n=parseInt(ye(t,"utf-8").trim());try{return process.kill(n,0),{running:!0,pid:n}}catch{return{running:!1}}}var Oo=A(()=>{Y()});var z_={};import{Server as B_}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport as W_}from"@modelcontextprotocol/sdk/server/stdio.js";import{Client as V_}from"@modelcontextprotocol/sdk/client/index.js";import{StreamableHTTPClientTransport as K_}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{ListToolsRequestSchema as p_,CallToolRequestSchema as j_}from"@modelcontextprotocol/sdk/types.js";var Fn,Le,MT,h_,De,Oe,k_;var FT=A(async()=>{Y();Fn=C(),Le=process.env.AGENT_FS_API_URL??Fn.apiUrl??`http://${Fn.server.host}:${Fn.server.port}`,MT=process.env.AGENT_FS_API_KEY??Fn.apiKey??Fn.auth?.apiKey;if(!MT)console.error("Error: No API key. Register with `agent-fs auth register` or set AGENT_FS_API_KEY."),process.exit(1);h_=new K_(new URL(`${Le}/mcp`),{requestInit:{headers:{Authorization:`Bearer ${MT}`}}}),De=new V_({name:"agent-fs-proxy",version:b});try{await De.connect(h_)}catch(t){console.error(`Cannot connect to agent-fs at ${Le}.
177
- Start a daemon with \`agent-fs daemon start\` or set AGENT_FS_API_URL to connect to a remote server.`),process.exit(1)}Oe=new B_({name:"agent-fs",version:b},{capabilities:{tools:{}}});Oe.setRequestHandler(p_,async()=>{return await De.listTools()});Oe.setRequestHandler(j_,async(t)=>{return await De.callTool(t.params)});k_=new W_;await Oe.connect(k_);console.error("[agent-fs] MCP proxy connected to "+Le)});import{z as YT}from"zod";function GT(t,n){let o=en();for(let i of o){let e=Pt(i);if(!e)continue;t.tool(i,e.description,e.schema instanceof YT.ZodObject?e.schema.shape:{params:YT.any()},async(r,E)=>{let u=n(E),T=await j(u,i,r);return{content:[{type:"text",text:JSON.stringify(T,null,2)}]}})}}var ZT=A(()=>{Y()});import{McpServer as d_}from"@modelcontextprotocol/sdk/server/mcp.js";import{z as Ft}from"zod";function HT(t){let{db:n,s3:o,embeddingProvider:i,appUrl:e}=t,r=new d_({name:"agent-fs",version:b}),E=(u)=>{let T=u.authInfo;if(!T?.extra?.user)throw Error("No auth context \u2014 MCP must be accessed through the HTTP server");let N=T.extra.user,R=m(n,{userId:N.id});return{db:n,s3:o,orgId:R.orgId,driveId:R.driveId,userId:N.id,embeddingProvider:i,appUrl:e}};return GT(r,E),r.tool("health","Check agent-fs system health: database, S3, embeddings, version.",{},async(u,T)=>{let N={version:b};try{let R=E(T),l=await j(R,"ls",{path:"/"},{skipAuth:!0});N.database={ok:!0,rootEntries:l.entries?.length??0}}catch(R){N.database={ok:!1,error:R.message}}try{await o.listObjects("",{delimiter:"/"}),N.s3={ok:!0}}catch(R){N.s3={ok:!1,error:R.message}}return N.embeddings={configured:!!i},{content:[{type:"text",text:JSON.stringify(N,null,2)}]}}),r.tool("whoami","Get current user identity, org memberships, and drive roles.",{},async(u,T)=>{let N=E(T),R=N.userId,_=K(n,R).map((F)=>{let X=Sn(n,F.id);return{orgId:F.id,orgName:F.name,drives:X.map((Z)=>({driveId:Z.id,driveName:Z.name,role:At(n,R,Z.id)}))}}),O=T.authInfo?.extra?.user?.email,L={userId:R,...O?{email:O}:{},activeOrg:N.orgId,activeDrive:N.driveId,memberships:_};return{content:[{type:"text",text:JSON.stringify(L,null,2)}]}}),r.tool("member-list","List members of the current org, or a specific drive if driveId is provided.",{driveId:Ft.string().optional().describe("Drive ID to list members for. Omit for org members.")},async(u,T)=>{let N=E(T),R=u.driveId?Ht(n,u.driveId):Vt(n,N.orgId);return{content:[{type:"text",text:JSON.stringify({members:R},null,2)}]}}),r.tool("member-invite","Invite a user to the current org by email. The user must already have an agent-fs account.",{email:Ft.string().describe("Email of the user to invite"),role:Ft.enum(["viewer","editor","admin"]).describe("Role to assign")},async(u,T)=>{let N=E(T);try{return jt(n,{orgId:N.orgId,email:u.email,role:u.role}),{content:[{type:"text",text:JSON.stringify({ok:!0,invited:u.email,role:u.role},null,2)}]}}catch(R){return{content:[{type:"text",text:JSON.stringify({error:R.message},null,2)}],isError:!0}}}),r.tool("member-update-role","Update a member's role in the current org or a specific drive.",{email:Ft.string().describe("Email of the member"),role:Ft.enum(["viewer","editor","admin"]).describe("New role"),driveId:Ft.string().optional().describe("Drive ID to update role for. Omit for org role.")},async(u,T)=>{let N=E(T);try{let R=rn(n,u.email);if(!R)throw Error(`User with email ${u.email} not found`);if(u.driveId)Qt(n,{driveId:u.driveId,userId:R.id,role:u.role});else Kt(n,{orgId:N.orgId,userId:R.id,role:u.role});return{content:[{type:"text",text:JSON.stringify({ok:!0,email:u.email,role:u.role},null,2)}]}}catch(R){return{content:[{type:"text",text:JSON.stringify({error:R.message},null,2)}],isError:!0}}}),r.tool("member-remove","Remove a member from the current org (cascades to all drives) or from a specific drive only.",{email:Ft.string().describe("Email of the member to remove"),driveId:Ft.string().optional().describe("Drive ID to remove from. Omit to remove from org.")},async(u,T)=>{let N=E(T);try{let R=rn(n,u.email);if(!R)throw Error(`User with email ${u.email} not found`);if(u.driveId)Jt(n,{driveId:u.driveId,userId:R.id});else pt(n,{orgId:N.orgId,userId:R.id});return{content:[{type:"text",text:JSON.stringify({ok:!0,removed:u.email},null,2)}]}}catch(R){return{content:[{type:"text",text:JSON.stringify({error:R.message},null,2)}],isError:!0}}}),r}var QT=A(()=>{Y();ZT()});function JT(t){return async(n,o)=>{let i=new URL(n.req.url).pathname;if(m_.some((u)=>i===u||i.startsWith(u)))return o();let e=n.req.header("Authorization");if(!e?.startsWith("Bearer "))return n.json({error:"UNAUTHORIZED",message:"Missing or invalid Authorization header",suggestion:"Include 'Authorization: Bearer <api_key>' header"},401);let r=e.slice(7),E=rt(t,r);if(!E)return n.json({error:"UNAUTHORIZED",message:"Invalid API key",suggestion:"Register with POST /auth/register"},401);return n.set("user",E),o()}}var m_;var BT=A(()=>{Y();m_=["/auth/register","/health"]});function b_(t){if(t instanceof v)return 404;if(t instanceof nt)return 403;if(t instanceof ot)return 409;if(t instanceof Ln)return 503;if(t instanceof it)return 400;if("code"in t)return 400;return 500}function WT(t,n){let o=b_(t);if("toJSON"in t&&typeof t.toJSON==="function")return n.json(t.toJSON(),o);return n.json({error:"INTERNAL_ERROR",message:t.message},o)}var VT=A(()=>{Y()});function Uo(t){let n=new Map;return setInterval(()=>{let o=Date.now()-60000;for(let[i,e]of n){let r=e.filter((E)=>E>o);if(r.length===0)n.delete(i);else n.set(i,r)}},300000).unref(),async(o,i)=>{let e=o.req.header("authorization")??"",r=e.startsWith("Bearer ")?e.slice(7):o.req.header("x-forwarded-for")??"unknown",E=Date.now(),u=E-60000,T=(n.get(r)??[]).filter((N)=>N>u);if(T.length>=t){let N=T[0],R=Math.ceil((N+60000-E)/1000);return o.header("Retry-After",String(R)),o.json({error:"RATE_LIMITED",message:"Too many requests"},429)}T.push(E),n.set(r,T),await i()}}import{Hono as q_}from"hono";function KT(t){let n=new q_;return n.post("/register",async(o)=>{let{email:i}=await o.req.json();if(!i||typeof i!=="string")return o.json({error:"VALIDATION_ERROR",message:"email is required"},400);try{let e=et(t,{email:i}),r=K(t,e.user.id);return o.json({apiKey:e.apiKey,userId:e.user.id,orgId:r[0]?.id})}catch(e){if(e instanceof Error&&e.message.includes("UNIQUE"))return o.json({error:"CONFLICT",message:"User with this email already exists"},409);throw e}}),n.get("/me",(o)=>{let i=o.get("user");try{let e=m(t,{userId:i.id});return o.json({userId:i.id,email:i.email,defaultOrgId:e.orgId,defaultDriveId:e.driveId})}catch{return o.json({userId:i.id,email:i.email,defaultOrgId:null,defaultDriveId:null})}}),n}var pT=A(()=>{Y()});import{Hono as s_}from"hono";function jT(t,n,o=null,i){let e=new s_;return e.post("/:orgId/ops",async(r)=>{let E=r.get("user"),u=r.req.param("orgId"),T=await r.req.json(),{op:N,...R}=T;if(!N)return r.json({error:"VALIDATION_ERROR",message:"op is required in request body"},400);let l=R.driveId||R.drive_id;delete R.driveId,delete R.drive_id;let _=m(t,{userId:E.id,orgId:u,driveId:l}),O={db:t,s3:n,orgId:_.orgId,driveId:_.driveId,userId:E.id,embeddingProvider:o,appUrl:i},L=await j(O,N,R);return r.json(L)}),e}var hT=A(()=>{Y()});import{Hono as c_}from"hono";function kT(t){let n=new c_;return n.get("/",(o)=>{let i=o.get("user"),e=K(t,i.id);return o.json({orgs:e})}),n.post("/",async(o)=>{let i=o.get("user"),{name:e}=await o.req.json(),r=Wt(t,{name:e,userId:i.id});return o.json(r,201)}),n.get("/:orgId",(o)=>{let i=o.req.param("orgId"),e=$n(t,i);if(!e)return o.json({error:"NOT_FOUND",message:"Org not found"},404);return o.json(e)}),n.get("/:orgId/drives",(o)=>{let i=o.get("user"),e=o.req.param("orgId"),r=Lt(t,e,i.id);return o.json({drives:r})}),n.post("/:orgId/drives",async(o)=>{let i=o.req.param("orgId"),{name:e}=await o.req.json(),r=Zt(t,{orgId:i,name:e});return o.json(r,201)}),n.post("/:orgId/members/invite",async(o)=>{let i=o.req.param("orgId"),{email:e,role:r}=await o.req.json();return jt(t,{orgId:i,email:e,role:r}),o.json({ok:!0})}),n.get("/:orgId/members",(o)=>{let i=o.req.param("orgId"),e=Vt(t,i);return o.json({members:e})}),n.patch("/:orgId/members/:userId",async(o)=>{let i=o.req.param("orgId"),e=o.req.param("userId"),{role:r}=await o.req.json();try{return Kt(t,{orgId:i,userId:e,role:r}),o.json({ok:!0})}catch(E){return o.json({error:"BAD_REQUEST",message:E.message},400)}}),n.delete("/:orgId/members/:userId",(o)=>{let i=o.req.param("orgId"),e=o.req.param("userId");try{return pt(t,{orgId:i,userId:e}),o.json({ok:!0})}catch(r){return o.json({error:"BAD_REQUEST",message:r.message},400)}}),n.get("/:orgId/drives/:driveId/members",(o)=>{let i=o.req.param("driveId"),e=Ht(t,i);return o.json({members:e})}),n.patch("/:orgId/drives/:driveId/members/:userId",async(o)=>{let i=o.req.param("driveId"),e=o.req.param("userId"),{role:r}=await o.req.json();try{return Qt(t,{driveId:i,userId:e,role:r}),o.json({ok:!0})}catch(E){return o.json({error:"BAD_REQUEST",message:E.message},400)}}),n.delete("/:orgId/drives/:driveId/members/:userId",(o)=>{let i=o.req.param("driveId"),e=o.req.param("userId");try{return Jt(t,{driveId:i,userId:e}),o.json({ok:!0})}catch(r){return o.json({error:"BAD_REQUEST",message:r.message},400)}}),n}var zT=A(()=>{Y()});import{Hono as x_}from"hono";function dT(){let t=new x_;return t.get("/openapi.json",(n)=>{return n.json(wo())}),t}var mT=A(()=>{Y()});import{Hono as a_}from"hono";function bT(t,n,o=null,i){let e=new a_;return e.get("/:orgId/drives/:driveId/files/*/raw",async(r)=>{let E=r.get("user"),u=r.req.param("orgId"),T=r.req.param("driveId"),N=m(t,{userId:E.id,orgId:u,driveId:T}),l=new URL(r.req.url).pathname.match(/\/files\/(.+)\/raw$/);if(!l)return r.json({error:"VALIDATION_ERROR",message:"Invalid file path"},400);let _=In(decodeURIComponent(l[1])),O=U(N.orgId,N.driveId,_);try{let L=await n.getObject(O),F=L.contentType||"application/octet-stream",X=ct({db:t,driveId:N.driveId},_),Z={"Content-Type":F,"Content-Length":String(L.body.length),"Cache-Control":"private, max-age=60"};if(X){if(Z.ETag=`"${X.version}"`,Z["X-Agent-FS-Version"]=String(X.version),X.contentHash)Z["X-Agent-FS-Content-Hash"]=X.contentHash;if(X.createdAt)Z["Last-Modified"]=new Date(X.createdAt).toUTCString()}return new Response(L.body.buffer,{status:200,headers:Z})}catch(L){if(L?.name==="NoSuchKey"||L?.$metadata?.httpStatusCode===404)return r.json({error:"NOT_FOUND",message:`File not found: ${_}`},404);throw L}}),e.put("/:orgId/drives/:driveId/files/*/raw",async(r)=>{let E=r.get("user"),u=r.req.param("orgId"),T=r.req.param("driveId");if((r.req.header("Content-Type")??"").toLowerCase().startsWith("application/json"))return r.json({error:"VALIDATION_ERROR",message:"PUT /raw expects a binary body; use POST /ops with op=write for JSON-encoded content"},415);let R=m(t,{userId:E.id,orgId:u,driveId:T}),_=new URL(r.req.url).pathname.match(/\/files\/(.+)\/raw$/);if(!_)return r.json({error:"VALIDATION_ERROR",message:"Invalid file path"},400);let O=In(decodeURIComponent(_[1])),L,F=r.req.header("If-None-Match"),X=r.req.header("If-Match");if(F==="*")L=0;else if(X!==void 0){let AN=X.replace(/^"|"$/g,""),$o=Number(AN);if(!Number.isInteger($o)||$o<0)return r.json({error:"VALIDATION_ERROR",message:`If-Match must be a non-negative integer version, got: ${X}`},400);L=$o}let Z=r.req.header("X-Agent-FS-Message")??void 0,Tn=await r.req.arrayBuffer(),TN=new Uint8Array(Tn),NN=new TextDecoder("utf-8").decode(TN),RN={db:t,s3:n,orgId:R.orgId,driveId:R.driveId,userId:E.id,embeddingProvider:o,appUrl:i},dt=await gt(RN,{path:O,content:NN,message:Z,expectedVersion:L});return new Response(JSON.stringify(dt),{status:200,headers:{"Content-Type":"application/json",ETag:`"${dt.version}"`,"X-Agent-FS-Version":String(dt.version),...dt.contentHash&&{"X-Agent-FS-Content-Hash":dt.contentHash},"X-Agent-FS-Deduped":dt.deduped?"1":"0"}})}),e}var qT=A(()=>{Y()});import{Hono as tw}from"hono";import{cors as sT}from"hono/cors";import{bodyLimit as nw}from"hono/body-limit";import{WebStandardStreamableHTTPServerTransport as ow}from"@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js";function cT(t,n,o=null){let i=new tw,e=C(),r=e.server?.cors?.origins??["*"];if(r.length===1&&r[0]==="*")i.use("*",sT());else i.use("*",sT({origin:r}));i.use("*",nw({maxSize:52428800})),i.use("*",JT(t));let E=e.server?.rateLimit?.requestsPerMinute??1200;if(E>0)i.use("/orgs/*",Uo(E)),i.use("/auth/*",Uo(E)),i.use("/mcp",Uo(E));return i.onError((u,T)=>WT(u,T)),i.get("/health",(u)=>u.json({ok:!0,version:b})),i.all("/mcp",async(u)=>{let T=u.get("user"),N=new ow({sessionIdGenerator:void 0,enableJsonResponse:!0});return await HT({db:t,s3:n,embeddingProvider:o,appUrl:e.appUrl}).connect(N),N.handleRequest(u.req.raw,{authInfo:{token:u.req.header("Authorization")?.slice(7)??"",clientId:T.id,scopes:[],extra:{user:{id:T.id,email:T.email}}}})}),i.route("/auth",KT(t)),i.route("/orgs",kT(t)),i.route("/orgs",jT(t,n,o,e.appUrl)),i.route("/docs",dT()),i.route("/orgs",bT(t,n,o,e.appUrl)),i}var xT=A(()=>{Y();QT();BT();VT();pT();hT();zT();mT();qT()});function wt(t,n,o){return{error:{http_status:t,code:n,message:o}}}function iw(t){let n=String(t?.name??""),o=String(t?.message??t??"unknown error");if(n==="EditConflictError")return wt(409,"EDIT_CONFLICT",o);if(n==="NotFoundError")return wt(404,"NOT_FOUND",o);if(n==="PermissionDeniedError")return wt(403,"PERMISSION_DENIED",o);if(n==="ValidationError")return wt(415,"VALIDATION",o);if(n==="IndexingInProgressError")return wt(503,"INDEXING_IN_PROGRESS",o);if(/no.*api.*key|no.*user/i.test(o))return wt(401,"AUTH_MISSING",o);return wt(500,"INTERNAL",o)}function a(t){let n=t.resolveApiKey();if(!n){let i=Error("daemon has no API key configured");throw i.name="AuthError",i}let o=rt(t.db,n);if(!o){let i=Error("API key did not resolve to a user");throw i.name="AuthError",i}return{userId:o.id,email:o.email}}function Ot(t,n,o){try{let r=m(t.db,{userId:n,driveId:o});return{orgId:r.orgId,driveId:r.driveId}}catch{}let i=K(t.db,n);for(let r of i){let u=Lt(t.db,r.id,n).find((T)=>T.name===o);if(u)return{orgId:r.id,driveId:u.id}}let e=Error(`Drive not found: ${o}`);throw e.name="NotFoundError",e}function It(t,n,o,i){return{db:t.db,s3:t.s3,orgId:o,driveId:i,userId:n.userId,embeddingProvider:t.embeddingProvider,appUrl:t.appUrl}}async function aT(t,n){if(!n||typeof n!=="object")return wt(400,"VALIDATION","request body must be an object");let o=n;try{return await ew(t,o)}catch(i){return iw(i)}}async function ew(t,n){switch(n.op){case"ping":return"pong";case"hello":return"ok";case"list_drives":{let o=a(t),i=K(t.db,o.userId),e=[];for(let r of i){let E=Lt(t.db,r.id,o.userId);for(let u of E)e.push({slug:u.name,id:u.id,org_id:r.id})}return{drives:e}}case"default_drive_slug":{let o=a(t),i=K(t.db,o.userId);for(let e of i){let r=Lt(t.db,e.id,o.userId),E=r.find((u)=>u.isDefault)??r[0];if(E)return{default_drive_slug:E.name}}return{default_drive_slug:null}}case"get_attr":{let o=a(t),{orgId:i,driveId:e}=Ot(t,o.userId,n.drive),r=n.path,E=It(t,o,i,e);try{let u=await j(E,"stat",{path:r});return{attr:{kind:"File",size:u.size,mtime_unix:Math.floor(new Date(u.modifiedAt).getTime()/1000),version:u.currentVersion??null,content_hash:null}}}catch(u){if(String(u?.name)==="NotFoundError")try{let T=await j(E,"ls",{path:r});if(T&&Array.isArray(T.entries)&&T.entries.length>0)return{attr:{kind:"Dir",size:0,mtime_unix:0,version:null,content_hash:null}}}catch{}throw u}}case"read_dir":{let o=a(t),{orgId:i,driveId:e}=Ot(t,o.userId,n.drive),r=n.path??"/",E=It(t,o,i,e);return{dir_entries:((await j(E,"ls",{path:r}))?.entries??[]).map((N)=>({name:N.name,kind:N.type==="directory"?"Dir":"File",size:N.size??0,mtime_unix:N.modifiedAt?Math.floor(new Date(N.modifiedAt).getTime()/1000):0,version:null,content_hash:null}))}}case"open_read":{let o=a(t),{orgId:i,driveId:e}=Ot(t,o.userId,n.drive),r=n.path,E=It(t,o,i,e),u=await j(E,"cat",{path:r}),T=ct({db:t.db,driveId:e},r),N=u?.content??"",R=new TextEncoder().encode(N);return{open_read:{bytes:R,version:T?.version??0,content_hash:T?.contentHash??"",size:R.length,mtime_unix:T?.createdAt?Math.floor(new Date(T.createdAt).getTime()/1000):0}}}case"open_write":{let o=a(t),{orgId:i,driveId:e}=Ot(t,o.userId,n.drive),r=n.path,E=It(t,o,i,e),u=rw(n.bytes),T=new TextDecoder("utf-8").decode(u),N=await gt(E,{path:r,content:T,expectedVersion:n.base_version??void 0});return{open_write:{version:N.version,content_hash:N.contentHash??"",deduped:N.deduped??!1}}}case"create_file":{let o=a(t),{orgId:i,driveId:e}=Ot(t,o.userId,n.drive),r=n.path,E=It(t,o,i,e),u=await gt(E,{path:r,content:"",expectedVersion:0});return{open_write:{version:u.version,content_hash:u.contentHash??"",deduped:u.deduped??!1}}}case"truncate":{let o=a(t),{orgId:i,driveId:e}=Ot(t,o.userId,n.drive),r=n.path,E=n.size??0,u=It(t,o,i,e),T=await j(u,"cat",{path:r}),N=new TextEncoder().encode(T?.content??""),R=N.subarray(0,Math.min(E,N.length)),l=new TextDecoder("utf-8").decode(R),_=await gt(u,{path:r,content:l});return{open_write:{version:_.version,content_hash:_.contentHash??"",deduped:_.deduped??!1}}}case"unlink":{let o=a(t),{orgId:i,driveId:e}=Ot(t,o.userId,n.drive),r=n.path,E=It(t,o,i,e);return await j(E,"rm",{path:r}),"ok"}case"rename":{let o=a(t),{orgId:i,driveId:e}=Ot(t,o.userId,n.drive),r=n.from_path,E=n.to_path,u=It(t,o,i,e);return await j(u,"mv",{from:r,to:E}),"ok"}case"mkdir":return a(t),"ok";case"rmdir":{let o=a(t),{orgId:i,driveId:e}=Ot(t,o.userId,n.drive),r=n.path,E=It(t,o,i,e);if((await j(E,"ls",{path:r}))?.entries?.length>0)return wt(409,"VALIDATION","directory not empty");return"ok"}case"record_conflict":return console.warn("[agent-fs ipc] conflict:",JSON.stringify({drive:n.drive,path:n.path,base_version:n.base_version,head_version:n.head_version,bytes:n.bytes})),"ok";case"write_status":return console.warn("[agent-fs ipc] status:",n.line),"ok";default:return wt(400,"VALIDATION",`unknown op: ${n.op}`)}}function rw(t){if(t instanceof Uint8Array)return t;if(t instanceof ArrayBuffer)return new Uint8Array(t);if(Array.isArray(t))return new Uint8Array(t);if(t==null)return new Uint8Array(0);if(typeof t==="string")return new TextEncoder().encode(t);if(typeof Buffer<"u"&&Buffer.isBuffer(t))return new Uint8Array(t);return new Uint8Array(0)}var tN=A(()=>{Y()});import{unlinkSync as nN,existsSync as Ew,chmodSync as fw}from"fs";import{Packr as uw,Unpackr as Tw}from"msgpackr";function oN(t,n){if(Ew(t))try{nN(t)}catch{}let o=Bun.listen({unix:t,socket:{open(i){i.data={buf:Buffer.alloc(0)}},data(i,e){i.data.buf=Buffer.concat([i.data.buf,e]),yw(i,n).catch((r)=>{console.error("[agent-fs ipc] frame drain failed:",r),i.end()})},close(i){i.data.buf=Buffer.alloc(0)},error(i,e){console.error("[agent-fs ipc] socket error:",e)}}});try{fw(t,384)}catch{}return{socketPath:t,stop:()=>{o.stop(!0);try{nN(t)}catch{}}}}async function yw(t,n){while(!0){let o=t.data;if(o.buf.length<4)return;let i=o.buf.readUInt32BE(0);if(i===0||i>Nw){console.error(`[agent-fs ipc] implausible frame length ${i}; closing`),t.end();return}if(o.buf.length<4+i)return;let e=o.buf.subarray(4,4+i);o.buf=o.buf.subarray(4+i);let r;try{r=Aw.unpack(e)}catch(E){console.error("[agent-fs ipc] decode failed:",E),t.end();return}lw(t,n,r)}}async function lw(t,n,o){let i;try{i=await aT(n,o.body)}catch(u){i={Error:{http_status:0,code:null,message:String(u?.message??u)}}}let e={id:o.id,body:i},r=Rw.pack(e),E=Buffer.alloc(4);E.writeUInt32BE(r.length,0),t.write(Buffer.concat([E,r]))}var Nw=67108864,Rw,Aw;var iN=A(()=>{tN();Rw=new uw({useRecords:!1}),Aw=new Tw({useRecords:!1})});var gw={};import{join as _w}from"path";function fN(){if(console.log("Shutting down..."),Ie.stop(),Ue)Ue.stop();process.exit(0)}var un,rN,EN,Se=null,ww,Ie,eN,Ue=null;var uN=A(async()=>{Y();xT();iN();un=C(),rN=Ut(),EN=new $t(un.s3);try{Se=await En(un.embedding)}catch(t){console.warn("Embedding provider unavailable, semantic search disabled:",t)}ww=cT(rN,EN,Se),Ie=Bun.serve({fetch:ww.fetch,port:un.server.port,hostname:un.server.host});console.log(`agent-fs daemon running on http://${Ie.hostname}:${Ie.port}`);eN=_w(W(),"agent-fs.sock");try{Ue=oN(eN,{db:rN,s3:EN,embeddingProvider:Se,appUrl:un.appUrl,resolveApiKey:()=>un.auth?.apiKey??null}),console.log(`agent-fs IPC listening on ${eN}`)}catch(t){console.warn("IPC listener unavailable:",t)}process.on("SIGTERM",fN);process.on("SIGINT",fN)});Y();import{Command as Lw}from"commander";Y();class Re{baseUrl;apiKey;constructor(){let t=C();this.baseUrl=process.env.AGENT_FS_API_URL??t.apiUrl??`http://${t.server.host}:${t.server.port}`,this.apiKey=process.env.AGENT_FS_API_KEY??t.apiKey??t.auth.apiKey}async request(t,n){let o=new Headers(n?.headers);if(this.apiKey)o.set("Authorization",`Bearer ${this.apiKey}`);o.set("Content-Type","application/json");let i;try{i=await fetch(`${this.baseUrl}${t}`,{...n,headers:o})}catch(r){throw Error(`Cannot connect to agent-fs daemon at ${this.baseUrl}. Is it running? Start with: agent-fs daemon start`)}let e;try{e=await i.json()}catch{let r=await i.text().catch(()=>"");throw Error(`Unexpected response from daemon (${i.status}): ${r||"empty"}`)}if(!i.ok){let r=e.message??e.error??"Request failed",E=e.suggestion?`
178
- Suggestion: ${e.suggestion}`:"";throw Error(`${r}${E}`)}return e}async get(t){return this.request(t)}async post(t,n){return this.request(t,{method:"POST",body:JSON.stringify(n)})}async patch(t,n){return this.request(t,{method:"PATCH",body:JSON.stringify(n)})}async del(t){return this.request(t,{method:"DELETE"})}async callOp(t,n,o){return this.post(`/orgs/${t}/ops`,{op:n,...o})}async getMe(){return this.get("/auth/me")}setApiKey(t){this.apiKey=t}async putRaw(t,n,o,i,e={}){let r=new Headers;if(r.set("Content-Type","application/octet-stream"),this.apiKey)r.set("Authorization",`Bearer ${this.apiKey}`);if(e.ifMatch!==void 0)r.set("If-Match",String(e.ifMatch));if(e.contentHash)r.set("X-Agent-FS-Content-Hash",e.contentHash);if(e.message)r.set("X-Agent-FS-Message",e.message);let E=encodeURI(o.replace(/^\/+/,"")),u=`${this.baseUrl}/orgs/${t}/drives/${n}/files/${E}/raw`,T;try{T=await fetch(u,{method:"PUT",headers:r,body:i})}catch(l){throw Error(`Cannot connect to agent-fs daemon at ${this.baseUrl}. Is it running? Start with: agent-fs daemon start`)}let N,R=await T.text();try{N=JSON.parse(R)}catch{throw Error(`Unexpected response from daemon (${T.status}): ${R||"empty"}`)}if(!T.ok){let l=N.message??N.error??"Request failed",_=N.suggestion?`
179
- Suggestion: ${N.suggestion}`:"";throw Error(`${l}${_}`)}return{version:N.version,deduped:Boolean(N.deduped),contentHash:T.headers.get("X-Agent-FS-Content-Hash")??N.contentHash??null,size:N.size??i.length}}}Y();import{Command as t_}from"commander";function fn(t){if(t<1024)return`${t} B`;if(t<1048576)return`${(t/1024).toFixed(1)} KB`;if(t<1073741824)return`${(t/1048576).toFixed(1)} MB`;return`${(t/1073741824).toFixed(1)} GB`}function ht(t){if(!t)return"-";let n=typeof t==="string"?new Date(t):t;if(isNaN(n.getTime()))return String(t);return n.toISOString().replace("T"," ").replace(/\.\d{3}Z$/,"Z")}function vn(t,n){return t.length>=n?t:t+" ".repeat(n-t.length)}function Ae(t,n){return t.length>=n?t:" ".repeat(n-t.length)+t}function Zl(t){let n=t.entries??[];if(n.length===0)return"(empty directory)";let o=Math.max(4,...n.map((u)=>String(u.name).length)),i=Math.max(4,...n.map((u)=>String(u.type).length)),e=Math.max(4,...n.map((u)=>fn(u.size??0).length)),r=vn("NAME",o)+" "+vn("TYPE",i)+" "+Ae("SIZE",e)+" MODIFIED",E=n.map((u)=>vn(u.name,o)+" "+vn(u.type,i)+" "+Ae(fn(u.size??0),e)+" "+ht(u.modifiedAt));return[r,...E].join(`
180
- `)}function nT(t){let o=(t.content??"").split(`
181
- `);if(o.length>0&&o[o.length-1]==="")o.pop();let i=t.offset??1,e=String(i+o.length-1).length;return o.map((r,E)=>`${Ae(String(i+E),e)} ${r}`).join(`
182
- `)}function Hl(t){let n=[["Path",t.path??"-"],["Size",fn(t.size??0)],["Content-Type",t.contentType??"-"],["Author",t.author??"-"],["Version",t.currentVersion!=null?String(t.currentVersion):"-"],["Created",ht(t.createdAt)],["Modified",ht(t.modifiedAt)],["Deleted",t.isDeleted?"yes":"no"]];if(t.embeddingStatus)n.push(["Embedding",t.embeddingStatus]);if(t.appUrl)n.push(["App URL",t.appUrl]);let o=Math.max(...n.map(([i])=>i.length));return n.map(([i,e])=>`${vn(i+":",o+1)} ${e}`).join(`
183
- `)}function Ql(t){let n=t.versions??[];if(n.length===0)return"(no version history)";return n.map((o)=>{let i=[`v${o.version} ${ht(o.createdAt)} ${o.author??"-"} [${o.operation}]`];if(o.message)i.push(` ${o.message}`);if(o.diffSummary)i.push(` ${o.diffSummary}`);return i.join(`
176
+ ]`;continue}if(e+=i[T],i[T]==="\\")r=!0;else if(E&&i[T]==="]")E=!1;else if(!E&&i[T]==="[")E=!0}try{new RegExp(e)}catch{return console.warn(`Could not convert regex pattern at ${n.currentPath.join("/")} to a flag-independent form! Falling back to the flag-ignorant source`),t.source}return e}var ai=void 0,ft,K_;var go=R(()=>{ft={cuid:/^[cC][^\s-]{8,}$/,cuid2:/^[0-9a-z]+$/,ulid:/^[0-9A-HJKMNP-TV-Z]{26}$/,email:/^(?!\.)(?!.*\.\.)([a-zA-Z0-9_'+\-\.]*)[a-zA-Z0-9_+-]@([a-zA-Z0-9][a-zA-Z0-9\-]*\.)+[a-zA-Z]{2,}$/,emoji:()=>{if(ai===void 0)ai=RegExp("^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$","u");return ai},uuid:/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/,ipv4:/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,ipv4Cidr:/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,ipv6:/^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/,ipv6Cidr:/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,base64:/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,base64url:/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,nanoid:/^[a-zA-Z0-9_-]{21}$/,jwt:/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/};K_=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789")});import{ZodFirstPartyTypeKind as Hn}from"zod/v3";function Do(t,n){if(n.target==="openAi")console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead.");if(n.target==="openApi3"&&t.keyType?._def.typeName===Hn.ZodEnum)return{type:"object",required:t.keyType._def.values,properties:t.keyType._def.values.reduce((i,e)=>({...i,[e]:L(t.valueType._def,{...n,currentPath:[...n.currentPath,"properties",e]})??H(n)}),{}),additionalProperties:n.rejectedAdditionalProperties};let o={type:"object",additionalProperties:L(t.valueType._def,{...n,currentPath:[...n.currentPath,"additionalProperties"]})??n.allowedAdditionalProperties};if(n.target==="openApi3")return o;if(t.keyType?._def.typeName===Hn.ZodString&&t.keyType._def.checks?.length){let{type:i,...e}=Lo(t.keyType._def,n);return{...o,propertyNames:e}}else if(t.keyType?._def.typeName===Hn.ZodEnum)return{...o,propertyNames:{enum:t.keyType._def.values}};else if(t.keyType?._def.typeName===Hn.ZodBranded&&t.keyType._def.type._def.typeName===Hn.ZodString&&t.keyType._def.type._def.checks?.length){let{type:i,...e}=wo(t.keyType._def,n);return{...o,propertyNames:e}}return o}var Oo=R(()=>{B();go();yo();tt()});function Kf(t,n){if(n.mapStrategy==="record")return Do(t,n);let o=L(t.keyType._def,{...n,currentPath:[...n.currentPath,"items","items","0"]})||H(n),i=L(t.valueType._def,{...n,currentPath:[...n.currentPath,"items","items","1"]})||H(n);return{type:"array",maxItems:125,items:{type:"array",items:[o,i],minItems:2,maxItems:2}}}var ne=R(()=>{B();Oo();tt()});function pf(t){let n=t.values,i=Object.keys(t.values).filter((r)=>{return typeof n[n[r]]!=="number"}).map((r)=>n[r]),e=Array.from(new Set(i.map((r)=>typeof r)));return{type:e.length===1?e[0]==="string"?"string":"number":["string","number"],enum:i}}function hf(t){return t.target==="openAi"?void 0:{not:H({...t,currentPath:[...t.currentPath,"not"]})}}var oe=R(()=>{tt()});function jf(t){return t.target==="openApi3"?{enum:["null"],nullable:!0}:{type:"null"}}function df(t,n){if(n.target==="openApi3")return kf(t,n);let o=t.options instanceof Map?Array.from(t.options.values()):t.options;if(o.every((i)=>(i._def.typeName in Zn)&&(!i._def.checks||!i._def.checks.length))){let i=o.reduce((e,r)=>{let E=Zn[r._def.typeName];return E&&!e.includes(E)?[...e,E]:e},[]);return{type:i.length>1?i:i[0]}}else if(o.every((i)=>i._def.typeName==="ZodLiteral"&&!i.description)){let i=o.reduce((e,r)=>{let E=typeof r._def.value;switch(E){case"string":case"number":case"boolean":return[...e,E];case"bigint":return[...e,"integer"];case"object":if(r._def.value===null)return[...e,"null"];case"symbol":case"undefined":case"function":default:return e}},[]);if(i.length===o.length){let e=i.filter((r,E,f)=>f.indexOf(r)===E);return{type:e.length>1?e:e[0],enum:o.reduce((r,E)=>{return r.includes(E._def.value)?r:[...r,E._def.value]},[])}}}else if(o.every((i)=>i._def.typeName==="ZodEnum"))return{type:"string",enum:o.reduce((i,e)=>[...i,...e._def.values.filter((r)=>!i.includes(r))],[])};return kf(t,n)}var Zn,kf=(t,n)=>{let o=(t.options instanceof Map?Array.from(t.options.values()):t.options).map((i,e)=>L(i._def,{...n,currentPath:[...n.currentPath,"anyOf",`${e}`]})).filter((i)=>!!i&&(!n.strictUnions||typeof i==="object"&&Object.keys(i).length>0));return o.length?{anyOf:o}:void 0};var Io=R(()=>{B();Zn={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"}});function mf(t,n){if(["ZodString","ZodNumber","ZodBigInt","ZodBoolean","ZodNull"].includes(t.innerType._def.typeName)&&(!t.innerType._def.checks||!t.innerType._def.checks.length)){if(n.target==="openApi3")return{type:Zn[t.innerType._def.typeName],nullable:!0};return{type:[Zn[t.innerType._def.typeName],"null"]}}if(n.target==="openApi3"){let i=L(t.innerType._def,{...n,currentPath:[...n.currentPath]});if(i&&"$ref"in i)return{allOf:[i],nullable:!0};return i&&{...i,nullable:!0}}let o=L(t.innerType._def,{...n,currentPath:[...n.currentPath,"anyOf","0"]});return o&&{anyOf:[o,{type:"null"}]}}var ie=R(()=>{B();Io()});function zf(t,n){let o={type:"number"};if(!t.checks)return o;for(let i of t.checks)switch(i.kind){case"int":o.type="integer",ki(o,"type",i.message,n);break;case"min":if(n.target==="jsonSchema7")if(i.inclusive)X(o,"minimum",i.value,i.message,n);else X(o,"exclusiveMinimum",i.value,i.message,n);else{if(!i.inclusive)o.exclusiveMinimum=!0;X(o,"minimum",i.value,i.message,n)}break;case"max":if(n.target==="jsonSchema7")if(i.inclusive)X(o,"maximum",i.value,i.message,n);else X(o,"exclusiveMaximum",i.value,i.message,n);else{if(!i.inclusive)o.exclusiveMaximum=!0;X(o,"maximum",i.value,i.message,n)}break;case"multipleOf":X(o,"multipleOf",i.value,i.message,n);break}return o}var ee=()=>{};function bf(t,n){let o=n.target==="openAi",i={type:"object",properties:{}},e=[],r=t.shape();for(let f in r){let T=r[f];if(T===void 0||T._def===void 0)continue;let l=j_(T);if(l&&o){if(T._def.typeName==="ZodOptional")T=T._def.innerType;if(!T.isNullable())T=T.nullable();l=!1}let N=L(T._def,{...n,currentPath:[...n.currentPath,"properties",f],propertyPath:[...n.currentPath,"properties",f]});if(N===void 0)continue;if(i.properties[f]=N,!l)e.push(f)}if(e.length)i.required=e;let E=h_(t,n);if(E!==void 0)i.additionalProperties=E;return i}function h_(t,n){if(t.catchall._def.typeName!=="ZodNever")return L(t.catchall._def,{...n,currentPath:[...n.currentPath,"additionalProperties"]});switch(t.unknownKeys){case"passthrough":return n.allowedAdditionalProperties;case"strict":return n.rejectedAdditionalProperties;case"strip":return n.removeAdditionalStrategy==="strict"?n.allowedAdditionalProperties:n.rejectedAdditionalProperties}}function j_(t){try{return t.isOptional()}catch{return!0}}var re=R(()=>{B()});var qf=(t,n)=>{if(n.currentPath.toString()===n.propertyPath?.toString())return L(t.innerType._def,n);let o=L(t.innerType._def,{...n,currentPath:[...n.currentPath,"anyOf","1"]});return o?{anyOf:[{not:H(n)},o]}:H(n)};var Ee=R(()=>{B();tt()});var sf=(t,n)=>{if(n.pipeStrategy==="input")return L(t.in._def,n);else if(n.pipeStrategy==="output")return L(t.out._def,n);let o=L(t.in._def,{...n,currentPath:[...n.currentPath,"allOf","0"]}),i=L(t.out._def,{...n,currentPath:[...n.currentPath,"allOf",o?"1":"0"]});return{allOf:[o,i].filter((e)=>e!==void 0)}};var ue=R(()=>{B()});function cf(t,n){return L(t.type._def,n)}var fe=R(()=>{B()});function xf(t,n){let i={type:"array",uniqueItems:!0,items:L(t.valueType._def,{...n,currentPath:[...n.currentPath,"items"]})};if(t.minSize)X(i,"minItems",t.minSize.value,t.minSize.message,n);if(t.maxSize)X(i,"maxItems",t.maxSize.value,t.maxSize.message,n);return i}var Te=R(()=>{B()});function af(t,n){if(t.rest)return{type:"array",minItems:t.items.length,items:t.items.map((o,i)=>L(o._def,{...n,currentPath:[...n.currentPath,"items",`${i}`]})).reduce((o,i)=>i===void 0?o:[...o,i],[]),additionalItems:L(t.rest._def,{...n,currentPath:[...n.currentPath,"additionalItems"]})};else return{type:"array",minItems:t.items.length,maxItems:t.items.length,items:t.items.map((o,i)=>L(o._def,{...n,currentPath:[...n.currentPath,"items",`${i}`]})).reduce((o,i)=>i===void 0?o:[...o,i],[])}}var le=R(()=>{B()});function tT(t){return{not:H(t)}}var Ne=R(()=>{tt()});function nT(t){return H(t)}var Re=R(()=>{tt()});var oT=(t,n)=>{return L(t.innerType._def,n)};var Ae=R(()=>{B()});import{ZodFirstPartyTypeKind as $}from"zod/v3";var iT=(t,n,o)=>{switch(n){case $.ZodString:return Lo(t,o);case $.ZodNumber:return zf(t,o);case $.ZodObject:return bf(t,o);case $.ZodBigInt:return Yf(t,o);case $.ZodBoolean:return Gf();case $.ZodDate:return bi(t,o);case $.ZodUndefined:return tT(o);case $.ZodNull:return jf(o);case $.ZodArray:return vf(t,o);case $.ZodUnion:case $.ZodDiscriminatedUnion:return df(t,o);case $.ZodIntersection:return Bf(t,o);case $.ZodTuple:return af(t,o);case $.ZodRecord:return Do(t,o);case $.ZodLiteral:return Vf(t,o);case $.ZodEnum:return Jf(t);case $.ZodNativeEnum:return pf(t);case $.ZodNullable:return mf(t,o);case $.ZodOptional:return qf(t,o);case $.ZodMap:return Kf(t,o);case $.ZodSet:return xf(t,o);case $.ZodLazy:return()=>t.getter()._def;case $.ZodPromise:return cf(t,o);case $.ZodNaN:case $.ZodNever:return hf(o);case $.ZodEffects:return Qf(t,o);case $.ZodAny:return H(o);case $.ZodUnknown:return nT(o);case $.ZodDefault:return Zf(t,o);case $.ZodBranded:return wo(t,o);case $.ZodReadonly:return oT(t,o);case $.ZodCatch:return Hf(t,o);case $.ZodPipeline:return sf(t,o);case $.ZodFunction:case $.ZodVoid:case $.ZodSymbol:return;default:return((i)=>{return})(n)}};var _e=R(()=>{tt();di();mi();yo();zi();qi();si();ci();xi();ne();oe();ie();ee();re();Ee();ue();fe();Oo();Te();go();le();Ne();Io();Re();Ae()});function L(t,n,o=!1){let i=n.seen.get(t);if(n.override){let f=n.override?.(t,n,i,o);if(f!==Pf)return f}if(i&&!o){let f=k_(i,n);if(f!==void 0)return f}let e={def:t,path:n.currentPath,jsonSchema:void 0};n.seen.set(t,e);let r=iT(t,t.typeName,n),E=typeof r==="function"?L(r(),n):r;if(E)d_(t,n,E);if(n.postProcess){let f=n.postProcess(E,t,n);return e.jsonSchema=E,f}return e.jsonSchema=E,E}var k_=(t,n)=>{switch(n.$refStrategy){case"root":return{$ref:t.path.join("/")};case"relative":return{$ref:_o(n.currentPath,t.path)};case"none":case"seen":{if(t.path.length<n.currentPath.length&&t.path.every((o,i)=>n.currentPath[i]===o))return console.warn(`Recursive reference detected at ${n.currentPath.join("/")}! Defaulting to any`),H(n);return n.$refStrategy==="seen"?H(n):void 0}}},d_=(t,n,o)=>{if(t.description){if(o.description=t.description,n.markdownDescription)o.markdownDescription=t.description}return o};var B=R(()=>{Ao();_e();tt()});var eT=()=>{};var we=(t,n)=>{let o=Ff(n),i=typeof n==="object"&&n.definitions?Object.entries(n.definitions).reduce((T,[l,N])=>({...T,[l]:L(N._def,{...o,currentPath:[...o.basePath,o.definitionPath,l]},!0)??H(o)}),{}):void 0,e=typeof n==="string"?n:n?.nameStrategy==="title"?void 0:n?.name,r=L(t._def,e===void 0?o:{...o,currentPath:[...o.basePath,o.definitionPath,e]},!1)??H(o),E=typeof n==="object"&&n.name!==void 0&&n.nameStrategy==="title"?n.name:void 0;if(E!==void 0)r.title=E;if(o.flags.hasReferencedOpenAiAnyType){if(!i)i={};if(!i[o.openAiAnyTypeName])i[o.openAiAnyTypeName]={type:["string","number","integer","boolean","array","null"],items:{$ref:o.$refStrategy==="relative"?"1":[...o.basePath,o.definitionPath,o.openAiAnyTypeName].join("/")}}}let f=e===void 0?i?{...r,[o.definitionPath]:i}:r:{$ref:[...o.$refStrategy==="relative"?[]:o.basePath,o.definitionPath,e].join("/"),[o.definitionPath]:{...i,[e]:r}};if(o.target==="jsonSchema7")f.$schema="http://json-schema.org/draft-07/schema#";else if(o.target==="jsonSchema2019-09"||o.target==="openAi")f.$schema="https://json-schema.org/draft/2019-09/schema#";if(o.target==="openAi"&&(("anyOf"in f)||("oneOf"in f)||("allOf"in f)||("type"in f)&&Array.isArray(f.type)))console.warn("Warning: OpenAI may not support schemas with unions as roots! Try wrapping it in an object property.");return f};var ye=R(()=>{B();ji();tt()});var rT=R(()=>{ye();Ao();ji();B();eT();tt();di();mi();yo();zi();qi();si();ci();xi();ne();oe();ie();ee();re();Ee();ue();fe();Ae();Oo();Te();go();le();Ne();Io();Re();_e();ye()});function Uo(){let t=fn(),n={},o={};for(let e of t){let r=Mt(e),E=we(r.schema,{target:"openApi3"}),{$schema:f,...T}=E;n[e]=T,o[e]=r.description}let i=t.map((e)=>({type:"object",title:e,description:o[e],required:["op",...n[e].required||[]],properties:{op:{type:"string",const:e},driveId:{type:"string",description:"Target drive ID (optional, uses default drive)"},...n[e].properties||{}},additionalProperties:!1}));return{openapi:"3.1.0",info:{title:"agent-fs API",version:q,description:"A persistent, searchable filesystem for AI agents. agent-fs is to files what agentmail is to email.",license:{name:"MIT",url:"https://github.com/desplega-ai/agent-fs/blob/main/LICENSE"}},servers:[{url:"http://localhost:7433",description:"Local development server"}],paths:{"/health":{get:{summary:"Health check",operationId:"health",tags:["System"],security:[],responses:{"200":{description:"Server is healthy",content:{"application/json":{schema:{type:"object",properties:{ok:{type:"boolean",const:!0},version:{type:"string"}},required:["ok","version"]}}}}}}},"/auth/register":{post:{summary:"Register a new user",operationId:"register",tags:["Auth"],security:[],requestBody:{required:!0,content:{"application/json":{schema:{type:"object",properties:{email:{type:"string",format:"email"}},required:["email"]}}}},responses:{"200":{description:"User registered",content:{"application/json":{schema:{type:"object",properties:{userId:{type:"string"},orgId:{type:"string"},driveId:{type:"string"},apiKey:{type:"string"}},required:["userId","orgId","driveId","apiKey"]}}}}}}},"/auth/me":{get:{summary:"Get current user info",operationId:"me",tags:["Auth"],responses:{"200":{description:"Current user",content:{"application/json":{schema:{type:"object",properties:{id:{type:"string"},email:{type:"string"},createdAt:{type:"string",format:"date-time"}},required:["id","email","createdAt"]}}}}}}},"/orgs/{orgId}/ops":{post:{summary:"Dispatch a file operation",operationId:"dispatchOp",tags:["Operations"],description:"All file operations go through this single endpoint. The `op` field determines which operation to execute.",parameters:[{name:"orgId",in:"path",required:!0,schema:{type:"string"},description:"Organization ID"}],requestBody:{required:!0,content:{"application/json":{schema:{oneOf:i,discriminator:{propertyName:"op"}}}}},responses:{"200":{description:"Operation result (varies by op)",content:{"application/json":{schema:{type:"object",description:"Response shape depends on the operation. See each op's description for details."}}}},"400":{description:"Validation error",content:{"application/json":{schema:{$ref:"#/components/schemas/Error"}}}},"401":{description:"Unauthorized",content:{"application/json":{schema:{$ref:"#/components/schemas/Error"}}}},"403":{description:"Permission denied (RBAC)",content:{"application/json":{schema:{$ref:"#/components/schemas/Error"}}}},"404":{description:"File or resource not found",content:{"application/json":{schema:{$ref:"#/components/schemas/Error"}}}}}}}},components:{securitySchemes:{bearerAuth:{type:"http",scheme:"bearer",description:"API key obtained from /auth/register"}},schemas:{Error:{type:"object",properties:{error:{type:"string"},message:{type:"string"}},required:["error","message"]}}},security:[{bearerAuth:[]}]}}var ET=R(()=>{rT();Yi();Vi()});var uT={};bt(uT,{writeRaw:()=>Dt,write:()=>io,updateOrgMemberRole:()=>ht,updateDriveMemberRole:()=>Bt,setDriveMember:()=>Hi,setConfigValue:()=>U,setConfig:()=>Je,schema:()=>u,resolveContext:()=>b,removeOrgMember:()=>jt,removeDriveMember:()=>Vt,listUserOrgs:()=>p,listOrgMembers:()=>pt,listDrivesForUser:()=>Ot,listDrives:()=>vn,listDriveMembers:()=>Jt,inviteToOrg:()=>kt,getUserDriveRole:()=>At,getUserByEmail:()=>Tn,getUserByApiKey:()=>ut,getS3Key:()=>I,getRequiredRole:()=>$n,getRegisteredOps:()=>fn,getOrg:()=>Yn,getOpDefinition:()=>Mt,getNextVersion:()=>to,getHome:()=>V,getHeadVersionRow:()=>xt,getHeadContentHash:()=>no,getDrive:()=>Gi,getDbPath:()=>Ht,getConfigPath:()=>x,getConfig:()=>P,generateOpenAPISpec:()=>Uo,ensureLocalUser:()=>Gn,dispatchOp:()=>k,createVersion:()=>h,createUser:()=>Et,createOrg:()=>Kt,createEmbeddingProviderFromEnv:()=>ln,createDrive:()=>Qt,createDatabase:()=>St,commentUpdate:()=>To,commentResolve:()=>No,commentList:()=>uo,commentGet:()=>fo,commentDelete:()=>lo,commentAdd:()=>Eo,checkPermission:()=>Xn,assertExpectedVersion:()=>j,ValidationError:()=>c,VERSION:()=>q,PermissionDeniedError:()=>it,NotFoundError:()=>F,IndexingInProgressError:()=>Sn,EditConflictError:()=>et,AgentS3Client:()=>Xt,AgentFSError:()=>Rt});var Y=R(()=>{G();wn();eu();m();Yi();W();Lf();Vi();ET()});var $o={};bt($o,{stopDaemon:()=>Uw,startDaemon:()=>Iw,daemonStatus:()=>Sw});import{spawn as Lw}from"child_process";import{readFileSync as Oe,writeFileSync as gw,unlinkSync as So,existsSync as Jn,openSync as Dw}from"fs";import{join as Ie}from"path";function Ue(){return Ie(V(),"agent-fs.pid")}function Ow(){return Ie(V(),"agent-fs.log")}function AT(){return Ie(V(),"agent-fs.sock")}function Iw(){let t=Ue();if(Jn(t)){let r=parseInt(Oe(t,"utf-8").trim());try{process.kill(r,0),console.log(`Daemon already running (PID: ${r})`);return}catch{So(t);let E=AT();if(Jn(E))try{So(E)}catch{}}}let n=Ow(),o=Dw(n,"a"),i=process.argv[1];if(!i)throw Error("Cannot determine entry script (process.argv[1] is empty). Daemon start aborted.");let e=Lw(process.execPath,[i,"server"],{detached:!0,stdio:["ignore",o,o]});if(e.unref(),e.pid)gw(t,String(e.pid)),console.log(`Daemon started (PID: ${e.pid})`),console.log(`Logs: ${n}`)}function Uw(){let t=Ue();if(!Jn(t)){console.log("Daemon is not running");return}let n=parseInt(Oe(t,"utf-8").trim());try{process.kill(n,"SIGTERM"),console.log(`Daemon stopped (PID: ${n})`)}catch{console.log(`Process ${n} not found (already stopped)`)}So(t);let o=AT();if(Jn(o))try{So(o)}catch{}}function Sw(){let t=Ue();if(!Jn(t))return{running:!1};let n=parseInt(Oe(t,"utf-8").trim());try{return process.kill(n,0),{running:!0,pid:n}}catch{return{running:!1}}}var Xo=R(()=>{Y()});var Ty={};import{Server as ny}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport as oy}from"@modelcontextprotocol/sdk/server/stdio.js";import{Client as iy}from"@modelcontextprotocol/sdk/client/index.js";import{StreamableHTTPClientTransport as ey}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{ListToolsRequestSchema as ry,CallToolRequestSchema as Ey}from"@modelcontextprotocol/sdk/types.js";var Bn,Ce,WT,uy,Pe,Me,fy;var KT=R(async()=>{Y();Bn=P(),Ce=process.env.AGENT_FS_API_URL??Bn.apiUrl??`http://${Bn.server.host}:${Bn.server.port}`,WT=process.env.AGENT_FS_API_KEY??Bn.apiKey??Bn.auth?.apiKey;if(!WT)console.error("Error: No API key. Register with `agent-fs auth register` or set AGENT_FS_API_KEY."),process.exit(1);uy=new ey(new URL(`${Ce}/mcp`),{requestInit:{headers:{Authorization:`Bearer ${WT}`}}}),Pe=new iy({name:"agent-fs-proxy",version:q});try{await Pe.connect(uy)}catch(t){console.error(`Cannot connect to agent-fs at ${Ce}.
177
+ Start a daemon with \`agent-fs daemon start\` or set AGENT_FS_API_URL to connect to a remote server.`),process.exit(1)}Me=new ny({name:"agent-fs",version:q},{capabilities:{tools:{}}});Me.setRequestHandler(ry,async()=>{return await Pe.listTools()});Me.setRequestHandler(Ey,async(t)=>{return await Pe.callTool(t.params)});fy=new oy;await Me.connect(fy);console.error("[agent-fs] MCP proxy connected to "+Ce)});import{z as pT}from"zod";function hT(t,n){let o=fn();for(let i of o){let e=Mt(i);if(!e)continue;t.tool(i,e.description,e.schema instanceof pT.ZodObject?e.schema.shape:{params:pT.any()},async(r,E)=>{let f=n(E),T=await k(f,i,r);return{content:[{type:"text",text:JSON.stringify(T,null,2)}]}})}}var jT=R(()=>{Y()});import{McpServer as ly}from"@modelcontextprotocol/sdk/server/mcp.js";import{z as Yt}from"zod";function kT(t){let{db:n,s3:o,embeddingProvider:i,appUrl:e}=t,r=new ly({name:"agent-fs",version:q}),E=(f)=>{let T=f.authInfo;if(!T?.extra?.user)throw Error("No auth context \u2014 MCP must be accessed through the HTTP server");let l=T.extra.user,N=b(n,{userId:l.id});return{db:n,s3:o,orgId:N.orgId,driveId:N.driveId,userId:l.id,embeddingProvider:i,appUrl:e}};return hT(r,E),r.tool("health","Check agent-fs system health: database, S3, embeddings, version.",{},async(f,T)=>{let l={version:q};try{let N=E(T),A=await k(N,"ls",{path:"/"},{skipAuth:!0});l.database={ok:!0,rootEntries:A.entries?.length??0}}catch(N){l.database={ok:!1,error:N.message}}try{await o.listObjects("",{delimiter:"/"}),l.s3={ok:!0}}catch(N){l.s3={ok:!1,error:N.message}}return l.embeddings={configured:!!i},{content:[{type:"text",text:JSON.stringify(l,null,2)}]}}),r.tool("whoami","Get current user identity, org memberships, and drive roles.",{},async(f,T)=>{let l=E(T),N=l.userId,w=p(n,N).map((D)=>{let C=vn(n,D.id);return{orgId:D.id,orgName:D.name,drives:C.map((Z)=>({driveId:Z.id,driveName:Z.name,role:At(n,N,Z.id)}))}}),g=T.authInfo?.extra?.user?.email,O={userId:N,...g?{email:g}:{},activeOrg:l.orgId,activeDrive:l.driveId,memberships:w};return{content:[{type:"text",text:JSON.stringify(O,null,2)}]}}),r.tool("member-list","List members of the current org, or a specific drive if driveId is provided.",{driveId:Yt.string().optional().describe("Drive ID to list members for. Omit for org members.")},async(f,T)=>{let l=E(T),N=f.driveId?Jt(n,f.driveId):pt(n,l.orgId);return{content:[{type:"text",text:JSON.stringify({members:N},null,2)}]}}),r.tool("member-invite","Invite a user to the current org by email. The user must already have an agent-fs account.",{email:Yt.string().describe("Email of the user to invite"),role:Yt.enum(["viewer","editor","admin"]).describe("Role to assign")},async(f,T)=>{let l=E(T);try{return kt(n,{orgId:l.orgId,email:f.email,role:f.role}),{content:[{type:"text",text:JSON.stringify({ok:!0,invited:f.email,role:f.role},null,2)}]}}catch(N){return{content:[{type:"text",text:JSON.stringify({error:N.message},null,2)}],isError:!0}}}),r.tool("member-update-role","Update a member's role in the current org or a specific drive.",{email:Yt.string().describe("Email of the member"),role:Yt.enum(["viewer","editor","admin"]).describe("New role"),driveId:Yt.string().optional().describe("Drive ID to update role for. Omit for org role.")},async(f,T)=>{let l=E(T);try{let N=Tn(n,f.email);if(!N)throw Error(`User with email ${f.email} not found`);if(f.driveId)Bt(n,{driveId:f.driveId,userId:N.id,role:f.role});else ht(n,{orgId:l.orgId,userId:N.id,role:f.role});return{content:[{type:"text",text:JSON.stringify({ok:!0,email:f.email,role:f.role},null,2)}]}}catch(N){return{content:[{type:"text",text:JSON.stringify({error:N.message},null,2)}],isError:!0}}}),r.tool("member-remove","Remove a member from the current org (cascades to all drives) or from a specific drive only.",{email:Yt.string().describe("Email of the member to remove"),driveId:Yt.string().optional().describe("Drive ID to remove from. Omit to remove from org.")},async(f,T)=>{let l=E(T);try{let N=Tn(n,f.email);if(!N)throw Error(`User with email ${f.email} not found`);if(f.driveId)Vt(n,{driveId:f.driveId,userId:N.id});else jt(n,{orgId:l.orgId,userId:N.id});return{content:[{type:"text",text:JSON.stringify({ok:!0,removed:f.email},null,2)}]}}catch(N){return{content:[{type:"text",text:JSON.stringify({error:N.message},null,2)}],isError:!0}}}),r}var dT=R(()=>{Y();jT()});function mT(t){return async(n,o)=>{let i=new URL(n.req.url).pathname;if(Ny.some((f)=>i===f||i.startsWith(f)))return o();let e=n.req.header("Authorization");if(!e?.startsWith("Bearer "))return n.json({error:"UNAUTHORIZED",message:"Missing or invalid Authorization header",suggestion:"Include 'Authorization: Bearer <api_key>' header"},401);let r=e.slice(7),E=ut(t,r);if(!E)return n.json({error:"UNAUTHORIZED",message:"Invalid API key",suggestion:"Register with POST /auth/register"},401);return n.set("user",E),o()}}var Ny;var zT=R(()=>{Y();Ny=["/auth/register","/health"]});function Ry(t){if(t instanceof F)return 404;if(t instanceof it)return 403;if(t instanceof et)return 409;if(t instanceof Sn)return 503;if(t instanceof c)return 400;if("code"in t)return 400;return 500}function bT(t,n){let o=Ry(t);if("toJSON"in t&&typeof t.toJSON==="function")return n.json(t.toJSON(),o);return n.json({error:"INTERNAL_ERROR",message:t.message},o)}var qT=R(()=>{Y()});function Po(t){let n=new Map;return setInterval(()=>{let o=Date.now()-60000;for(let[i,e]of n){let r=e.filter((E)=>E>o);if(r.length===0)n.delete(i);else n.set(i,r)}},300000).unref(),async(o,i)=>{let e=o.req.header("authorization")??"",r=e.startsWith("Bearer ")?e.slice(7):o.req.header("x-forwarded-for")??"unknown",E=Date.now(),f=E-60000,T=(n.get(r)??[]).filter((l)=>l>f);if(T.length>=t){let l=T[0],N=Math.ceil((l+60000-E)/1000);return o.header("Retry-After",String(N)),o.json({error:"RATE_LIMITED",message:"Too many requests"},429)}T.push(E),n.set(r,T),await i()}}import{Hono as Ay}from"hono";function sT(t){let n=new Ay;return n.post("/register",async(o)=>{let{email:i}=await o.req.json();if(!i||typeof i!=="string")return o.json({error:"VALIDATION_ERROR",message:"email is required"},400);try{let e=Et(t,{email:i}),r=p(t,e.user.id);return o.json({apiKey:e.apiKey,userId:e.user.id,orgId:r[0]?.id})}catch(e){if(e instanceof Error&&e.message.includes("UNIQUE"))return o.json({error:"CONFLICT",message:"User with this email already exists"},409);throw e}}),n.get("/me",(o)=>{let i=o.get("user");try{let e=b(t,{userId:i.id});return o.json({userId:i.id,email:i.email,defaultOrgId:e.orgId,defaultDriveId:e.driveId})}catch{return o.json({userId:i.id,email:i.email,defaultOrgId:null,defaultDriveId:null})}}),n}var cT=R(()=>{Y()});import{Hono as _y}from"hono";function xT(t,n,o=null,i){let e=new _y;return e.post("/:orgId/ops",async(r)=>{let E=r.get("user"),f=r.req.param("orgId"),T=await r.req.json(),{op:l,...N}=T;if(!l)return r.json({error:"VALIDATION_ERROR",message:"op is required in request body"},400);let A=N.driveId||N.drive_id;delete N.driveId,delete N.drive_id;let w=b(t,{userId:E.id,orgId:f,driveId:A}),g={db:t,s3:n,orgId:w.orgId,driveId:w.driveId,userId:E.id,embeddingProvider:o,appUrl:i},O=await k(g,l,N);return r.json(O)}),e}var aT=R(()=>{Y()});import{Hono as wy}from"hono";function tl(t){let n=new wy;return n.get("/",(o)=>{let i=o.get("user"),e=p(t,i.id);return o.json({orgs:e})}),n.post("/",async(o)=>{let i=o.get("user"),{name:e}=await o.req.json(),r=Kt(t,{name:e,userId:i.id});return o.json(r,201)}),n.get("/:orgId",(o)=>{let i=o.req.param("orgId"),e=Yn(t,i);if(!e)return o.json({error:"NOT_FOUND",message:"Org not found"},404);return o.json(e)}),n.get("/:orgId/drives",(o)=>{let i=o.get("user"),e=o.req.param("orgId"),r=Ot(t,e,i.id);return o.json({drives:r})}),n.post("/:orgId/drives",async(o)=>{let i=o.req.param("orgId"),{name:e}=await o.req.json(),r=Qt(t,{orgId:i,name:e});return o.json(r,201)}),n.post("/:orgId/members/invite",async(o)=>{let i=o.req.param("orgId"),{email:e,role:r}=await o.req.json();return kt(t,{orgId:i,email:e,role:r}),o.json({ok:!0})}),n.get("/:orgId/members",(o)=>{let i=o.req.param("orgId"),e=pt(t,i);return o.json({members:e})}),n.patch("/:orgId/members/:userId",async(o)=>{let i=o.req.param("orgId"),e=o.req.param("userId"),{role:r}=await o.req.json();try{return ht(t,{orgId:i,userId:e,role:r}),o.json({ok:!0})}catch(E){return o.json({error:"BAD_REQUEST",message:E.message},400)}}),n.delete("/:orgId/members/:userId",(o)=>{let i=o.req.param("orgId"),e=o.req.param("userId");try{return jt(t,{orgId:i,userId:e}),o.json({ok:!0})}catch(r){return o.json({error:"BAD_REQUEST",message:r.message},400)}}),n.get("/:orgId/drives/:driveId/members",(o)=>{let i=o.req.param("driveId"),e=Jt(t,i);return o.json({members:e})}),n.patch("/:orgId/drives/:driveId/members/:userId",async(o)=>{let i=o.req.param("driveId"),e=o.req.param("userId"),{role:r}=await o.req.json();try{return Bt(t,{driveId:i,userId:e,role:r}),o.json({ok:!0})}catch(E){return o.json({error:"BAD_REQUEST",message:E.message},400)}}),n.delete("/:orgId/drives/:driveId/members/:userId",(o)=>{let i=o.req.param("driveId"),e=o.req.param("userId");try{return Vt(t,{driveId:i,userId:e}),o.json({ok:!0})}catch(r){return o.json({error:"BAD_REQUEST",message:r.message},400)}}),n}var nl=R(()=>{Y()});import{Hono as yy}from"hono";function ol(){let t=new yy;return t.get("/openapi.json",(n)=>{return n.json(Uo())}),t}var il=R(()=>{Y()});import{Hono as Ly}from"hono";function el(t,n,o=null,i){let e=new Ly;return e.get("/:orgId/drives/:driveId/files/:filePath{.+}/raw",async(r)=>{let E=r.get("user"),f=r.req.param("orgId"),T=r.req.param("driveId"),l=b(t,{userId:E.id,orgId:f,driveId:T}),A=new URL(r.req.url).pathname.match(/\/files\/(.+)\/raw$/);if(!A)return r.json({error:"VALIDATION_ERROR",message:"Invalid file path"},400);let w=Cn(decodeURIComponent(A[1])),g=I(l.orgId,l.driveId,w);try{let O=await n.getObject(g),D=O.contentType||"application/octet-stream",C=xt({db:t,driveId:l.driveId},w),Z={"Content-Type":D,"Content-Length":String(O.body.length),"Cache-Control":"private, max-age=60"};if(C){if(Z.ETag=`"${C.version}"`,Z["X-Agent-FS-Version"]=String(C.version),C.contentHash)Z["X-Agent-FS-Content-Hash"]=C.contentHash;if(C.createdAt)Z["Last-Modified"]=new Date(C.createdAt).toUTCString()}return new Response(O.body.slice(),{status:200,headers:Z})}catch(O){if(O?.name==="NoSuchKey"||O?.$metadata?.httpStatusCode===404)return r.json({error:"NOT_FOUND",message:`File not found: ${w}`},404);throw O}}),e.put("/:orgId/drives/:driveId/files/:filePath{.+}/raw",async(r)=>{let E=r.get("user"),f=r.req.param("orgId"),T=r.req.param("driveId");if((r.req.header("Content-Type")??"").toLowerCase().startsWith("application/json"))return r.json({error:"VALIDATION_ERROR",message:"PUT /raw expects a binary body; use POST /ops with op=write for JSON-encoded content"},415);let N=b(t,{userId:E.id,orgId:f,driveId:T}),w=new URL(r.req.url).pathname.match(/\/files\/(.+)\/raw$/);if(!w)return r.json({error:"VALIDATION_ERROR",message:"Invalid file path"},400);let g=Cn(decodeURIComponent(w[1])),O,D=r.req.header("If-None-Match"),C=r.req.header("If-Match");if(D==="*")O=0;else if(C!==void 0){let Ul=C.replace(/^"|"$/g,""),Mo=Number(Ul);if(!Number.isInteger(Mo)||Mo<0)return r.json({error:"VALIDATION_ERROR",message:`If-Match must be a non-negative integer version, got: ${C}`},400);O=Mo}let Z=r.req.header("X-Agent-FS-Message")??void 0,_n=await r.req.arrayBuffer(),Ol=new Uint8Array(_n),Il={db:t,s3:n,orgId:N.orgId,driveId:N.driveId,userId:E.id,embeddingProvider:o,appUrl:i},zt=await Dt(Il,{path:g,bytes:Ol,message:Z,expectedVersion:O});return new Response(JSON.stringify(zt),{status:200,headers:{"Content-Type":"application/json",ETag:`"${zt.version}"`,"X-Agent-FS-Version":String(zt.version),...zt.contentHash&&{"X-Agent-FS-Content-Hash":zt.contentHash},"X-Agent-FS-Deduped":zt.deduped?"1":"0"}})}),e}var rl=R(()=>{Y()});import{Hono as gy}from"hono";import{cors as El}from"hono/cors";import{bodyLimit as Dy}from"hono/body-limit";import{WebStandardStreamableHTTPServerTransport as Oy}from"@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js";function ul(t,n,o=null){let i=new gy,e=P(),r=e.server?.cors?.origins??["*"];if(r.length===1&&r[0]==="*")i.use("*",El());else i.use("*",El({origin:r}));i.use("*",Dy({maxSize:52428800})),i.use("*",mT(t));let E=e.server?.rateLimit?.requestsPerMinute??1200;if(E>0)i.use("/orgs/*",Po(E)),i.use("/auth/*",Po(E)),i.use("/mcp",Po(E));return i.onError((f,T)=>bT(f,T)),i.get("/health",(f)=>f.json({ok:!0,version:q})),i.all("/mcp",async(f)=>{let T=f.get("user"),l=new Oy({sessionIdGenerator:void 0,enableJsonResponse:!0});return await kT({db:t,s3:n,embeddingProvider:o,appUrl:e.appUrl}).connect(l),l.handleRequest(f.req.raw,{authInfo:{token:f.req.header("Authorization")?.slice(7)??"",clientId:T.id,scopes:[],extra:{user:{id:T.id,email:T.email}}}})}),i.route("/auth",sT(t)),i.route("/orgs",tl(t)),i.route("/orgs",xT(t,n,o,e.appUrl)),i.route("/docs",ol()),i.route("/orgs",el(t,n,o,e.appUrl)),i}var fl=R(()=>{Y();dT();zT();qT();cT();aT();nl();il();rl()});function Lt(t,n,o){return{error:{http_status:t,code:n,message:o}}}function Iy(t){let n=String(t?.name??""),o=String(t?.message??t??"unknown error");if(n==="EditConflictError")return Lt(409,"EDIT_CONFLICT",o);if(n==="NotFoundError")return Lt(404,"NOT_FOUND",o);if(n==="PermissionDeniedError")return Lt(403,"PERMISSION_DENIED",o);if(n==="ValidationError")return Lt(415,"VALIDATION",o);if(n==="IndexingInProgressError")return Lt(503,"INDEXING_IN_PROGRESS",o);if(/no.*api.*key|no.*user/i.test(o))return Lt(401,"AUTH_MISSING",o);return Lt(500,"INTERNAL",o)}function nt(t){let n=t.resolveApiKey();if(!n){let i=Error("daemon has no API key configured");throw i.name="AuthError",i}let o=ut(t.db,n);if(!o){let i=Error("API key did not resolve to a user");throw i.name="AuthError",i}return{userId:o.id,email:o.email}}function Ut(t,n,o){try{let r=b(t.db,{userId:n,driveId:o});return{orgId:r.orgId,driveId:r.driveId}}catch{}let i=p(t.db,n);for(let r of i){let f=Ot(t.db,r.id,n).find((T)=>T.name===o);if(f)return{orgId:r.id,driveId:f.id}}let e=Error(`Drive not found: ${o}`);throw e.name="NotFoundError",e}function Gt(t,n,o,i){return{db:t.db,s3:t.s3,orgId:o,driveId:i,userId:n.userId,embeddingProvider:t.embeddingProvider,appUrl:t.appUrl}}async function Tl(t,n){if(!n||typeof n!=="object")return Lt(400,"VALIDATION","request body must be an object");let o=n;try{return await Uy(t,o)}catch(i){return Iy(i)}}async function Uy(t,n){switch(n.op){case"ping":return"pong";case"hello":return"ok";case"list_drives":{let o=nt(t),i=p(t.db,o.userId),e=[];for(let r of i){let E=Ot(t.db,r.id,o.userId);for(let f of E)e.push({slug:f.name,id:f.id,org_id:r.id})}return{drives:e}}case"default_drive_slug":{let o=nt(t),i=p(t.db,o.userId);for(let e of i){let r=Ot(t.db,e.id,o.userId),E=r.find((f)=>f.isDefault)??r[0];if(E)return{default_drive_slug:E.name}}return{default_drive_slug:null}}case"get_attr":{let o=nt(t),{orgId:i,driveId:e}=Ut(t,o.userId,n.drive),r=n.path,E=Gt(t,o,i,e);try{let f=await k(E,"stat",{path:r});return{attr:{kind:"File",size:f.size,mtime_unix:Math.floor(new Date(f.modifiedAt).getTime()/1000),version:f.currentVersion??null,content_hash:null}}}catch(f){if(String(f?.name)==="NotFoundError")try{let T=await k(E,"ls",{path:r});if(T&&Array.isArray(T.entries)&&T.entries.length>0)return{attr:{kind:"Dir",size:0,mtime_unix:0,version:null,content_hash:null}}}catch{}throw f}}case"read_dir":{let o=nt(t),{orgId:i,driveId:e}=Ut(t,o.userId,n.drive),r=n.path??"/",E=Gt(t,o,i,e);return{dir_entries:((await k(E,"ls",{path:r}))?.entries??[]).map((l)=>({name:l.name,kind:l.type==="directory"?"Dir":"File",size:l.size??0,mtime_unix:l.modifiedAt?Math.floor(new Date(l.modifiedAt).getTime()/1000):0,version:null,content_hash:null}))}}case"open_read":{let o=nt(t),{orgId:i,driveId:e}=Ut(t,o.userId,n.drive),r=n.path,E=I(i,e,r),f=await t.s3.getObject(E),T=xt({db:t.db,driveId:e},r);return{open_read:{bytes:f.body,version:T?.version??0,content_hash:T?.contentHash??"",size:f.body.length,mtime_unix:T?.createdAt?Math.floor(new Date(T.createdAt).getTime()/1000):0}}}case"open_write":{let o=nt(t),{orgId:i,driveId:e}=Ut(t,o.userId,n.drive),r=n.path,E=Gt(t,o,i,e),f=Sy(n.bytes),T=await Dt(E,{path:r,bytes:f,expectedVersion:n.base_version??void 0});return{open_write:{version:T.version,content_hash:T.contentHash??"",deduped:T.deduped??!1}}}case"create_file":{let o=nt(t),{orgId:i,driveId:e}=Ut(t,o.userId,n.drive),r=n.path,E=Gt(t,o,i,e),f=await Dt(E,{path:r,bytes:new Uint8Array(0),expectedVersion:0});return{open_write:{version:f.version,content_hash:f.contentHash??"",deduped:f.deduped??!1}}}case"truncate":{let o=nt(t),{orgId:i,driveId:e}=Ut(t,o.userId,n.drive),r=n.path,E=n.size??0,f=Gt(t,o,i,e),T=I(i,e,r),l=(await t.s3.getObject(T)).body,N=l.subarray(0,Math.min(E,l.length)),A=await Dt(f,{path:r,bytes:N});return{open_write:{version:A.version,content_hash:A.contentHash??"",deduped:A.deduped??!1}}}case"unlink":{let o=nt(t),{orgId:i,driveId:e}=Ut(t,o.userId,n.drive),r=n.path,E=Gt(t,o,i,e);return await k(E,"rm",{path:r}),"ok"}case"rename":{let o=nt(t),{orgId:i,driveId:e}=Ut(t,o.userId,n.drive),r=n.from_path,E=n.to_path,f=Gt(t,o,i,e);return await k(f,"mv",{from:r,to:E}),"ok"}case"mkdir":return nt(t),"ok";case"rmdir":{let o=nt(t),{orgId:i,driveId:e}=Ut(t,o.userId,n.drive),r=n.path,E=Gt(t,o,i,e);if((await k(E,"ls",{path:r}))?.entries?.length>0)return Lt(409,"VALIDATION","directory not empty");return"ok"}case"record_conflict":return console.warn("[agent-fs ipc] conflict:",JSON.stringify({drive:n.drive,path:n.path,base_version:n.base_version,head_version:n.head_version,bytes:n.bytes})),"ok";case"write_status":return console.warn("[agent-fs ipc] status:",n.line),"ok";default:return Lt(400,"VALIDATION",`unknown op: ${n.op}`)}}function Sy(t){if(t instanceof Uint8Array)return t;if(t instanceof ArrayBuffer)return new Uint8Array(t);if(Array.isArray(t))return new Uint8Array(t);if(t==null)return new Uint8Array(0);if(typeof t==="string")return new TextEncoder().encode(t);if(typeof Buffer<"u"&&Buffer.isBuffer(t))return new Uint8Array(t);return new Uint8Array(0)}var ll=R(()=>{Y()});import{unlinkSync as Nl,existsSync as $y,chmodSync as Xy}from"fs";import{Packr as Cy,Unpackr as Py}from"msgpackr";function Rl(t,n){if($y(t))try{Nl(t)}catch{}let o=Bun.listen({unix:t,socket:{open(i){i.data={buf:Buffer.alloc(0)}},data(i,e){i.data.buf=Buffer.concat([i.data.buf,e]),Yy(i,n).catch((r)=>{console.error("[agent-fs ipc] frame drain failed:",r),i.end()})},close(i){i.data.buf=Buffer.alloc(0)},error(i,e){console.error("[agent-fs ipc] socket error:",e)}}});try{Xy(t,384)}catch{}return{socketPath:t,stop:()=>{o.stop(!0);try{Nl(t)}catch{}}}}async function Yy(t,n){while(!0){let o=t.data;if(o.buf.length<4)return;let i=o.buf.readUInt32BE(0);if(i===0||i>My){console.error(`[agent-fs ipc] implausible frame length ${i}; closing`),t.end();return}if(o.buf.length<4+i)return;let e=o.buf.subarray(4,4+i);o.buf=o.buf.subarray(4+i);let r;try{r=vy.unpack(e)}catch(E){console.error("[agent-fs ipc] decode failed:",E),t.end();return}Gy(t,n,r)}}async function Gy(t,n,o){let i;try{i=await Tl(n,o.body)}catch(f){i={Error:{http_status:0,code:null,message:String(f?.message??f)}}}let e={id:o.id,body:i},r=Fy.pack(e),E=Buffer.alloc(4);E.writeUInt32BE(r.length,0),t.write(Buffer.concat([E,r]))}var My=67108864,Fy,vy;var Al=R(()=>{ll();Fy=new Cy({useRecords:!1}),vy=new Py({useRecords:!1})});var Qy={};import{join as Hy}from"path";function Ll(){if(console.log("Shutting down..."),Fe.stop(),ve)ve.stop();process.exit(0)}var Rn,wl,yl,Ye=null,Zy,Fe,_l,ve=null;var gl=R(async()=>{Y();fl();Al();Rn=P(),wl=St(),yl=new Xt(Rn.s3);try{Ye=await ln(Rn.embedding)}catch(t){console.warn("Embedding provider unavailable, semantic search disabled:",t)}Zy=ul(wl,yl,Ye),Fe=Bun.serve({fetch:Zy.fetch,port:Rn.server.port,hostname:Rn.server.host});console.log(`agent-fs daemon running on http://${Fe.hostname}:${Fe.port}`);_l=Hy(V(),"agent-fs.sock");try{ve=Rl(_l,{db:wl,s3:yl,embeddingProvider:Ye,appUrl:Rn.appUrl,resolveApiKey:()=>Rn.auth?.apiKey??null}),console.log(`agent-fs IPC listening on ${_l}`)}catch(t){console.warn("IPC listener unavailable:",t)}process.on("SIGTERM",Ll);process.on("SIGINT",Ll)});Y();import{Command as Jy}from"commander";Y();class Le{baseUrl;apiKey;constructor(){let t=P();this.baseUrl=process.env.AGENT_FS_API_URL??t.apiUrl??`http://${t.server.host}:${t.server.port}`,this.apiKey=process.env.AGENT_FS_API_KEY??t.apiKey??t.auth.apiKey}async request(t,n){let o=new Headers(n?.headers);if(this.apiKey)o.set("Authorization",`Bearer ${this.apiKey}`);o.set("Content-Type","application/json");let i;try{i=await fetch(`${this.baseUrl}${t}`,{...n,headers:o})}catch(r){throw Error(`Cannot connect to agent-fs daemon at ${this.baseUrl}. Is it running? Start with: agent-fs daemon start`)}let e;try{e=await i.json()}catch{let r=await i.text().catch(()=>"");throw Error(`Unexpected response from daemon (${i.status}): ${r||"empty"}`)}if(!i.ok){let r=e.message??e.error??"Request failed",E=e.suggestion?`
178
+ Suggestion: ${e.suggestion}`:"";throw Error(`${r}${E}`)}return e}async get(t){return this.request(t)}async post(t,n){return this.request(t,{method:"POST",body:JSON.stringify(n)})}async patch(t,n){return this.request(t,{method:"PATCH",body:JSON.stringify(n)})}async del(t){return this.request(t,{method:"DELETE"})}async callOp(t,n,o){return this.post(`/orgs/${t}/ops`,{op:n,...o})}async getMe(){return this.get("/auth/me")}setApiKey(t){this.apiKey=t}async putRaw(t,n,o,i,e={}){let r=new Headers;if(r.set("Content-Type","application/octet-stream"),this.apiKey)r.set("Authorization",`Bearer ${this.apiKey}`);if(e.ifMatch!==void 0)r.set("If-Match",String(e.ifMatch));if(e.contentHash)r.set("X-Agent-FS-Content-Hash",e.contentHash);if(e.message)r.set("X-Agent-FS-Message",e.message);let E=encodeURI(o.replace(/^\/+/,"")),f=`${this.baseUrl}/orgs/${t}/drives/${n}/files/${E}/raw`,T;try{T=await fetch(f,{method:"PUT",headers:r,body:i})}catch(A){throw Error(`Cannot connect to agent-fs daemon at ${this.baseUrl}. Is it running? Start with: agent-fs daemon start`)}let l,N=await T.text();try{l=JSON.parse(N)}catch{throw Error(`Unexpected response from daemon (${T.status}): ${N||"empty"}`)}if(!T.ok){let A=l.message??l.error??"Request failed",w=l.suggestion?`
179
+ Suggestion: ${l.suggestion}`:"";throw Error(`${A}${w}`)}return{version:l.version,path:l.path??o,deduped:Boolean(l.deduped),contentHash:T.headers.get("X-Agent-FS-Content-Hash")??l.contentHash??null,size:l.size??i.length}}async getRaw(t,n,o){let i=new Headers;if(this.apiKey)i.set("Authorization",`Bearer ${this.apiKey}`);let e=encodeURI(o.replace(/^\/+/,"")),r=`${this.baseUrl}/orgs/${t}/drives/${n}/files/${e}/raw`,E;try{E=await fetch(r,{method:"GET",headers:i})}catch(f){throw Error(`Cannot connect to agent-fs daemon at ${this.baseUrl}. Is it running? Start with: agent-fs daemon start`)}if(!E.ok){let f,T=await E.text().catch(()=>"");try{f=JSON.parse(T)}catch{throw Error(`Unexpected response from daemon (${E.status}): ${T||"empty"}`)}let l=f.message??f.error??"Request failed",N=f.suggestion?`
180
+ Suggestion: ${f.suggestion}`:"";throw Error(`${l}${N}`)}return{bytes:new Uint8Array(await E.arrayBuffer()),contentType:E.headers.get("Content-Type"),version:m_(E.headers.get("X-Agent-FS-Version")),contentHash:E.headers.get("X-Agent-FS-Content-Hash")}}}function m_(t){if(t===null)return null;let n=Number(t);return Number.isInteger(n)?n:null}Y();import{Command as _w}from"commander";function Nn(t){if(t<1024)return`${t} B`;if(t<1048576)return`${(t/1024).toFixed(1)} KB`;if(t<1073741824)return`${(t/1048576).toFixed(1)} MB`;return`${(t/1073741824).toFixed(1)} GB`}function dt(t){if(!t)return"-";let n=typeof t==="string"?new Date(t):t;if(isNaN(n.getTime()))return String(t);return n.toISOString().replace("T"," ").replace(/\.\d{3}Z$/,"Z")}function Qn(t,n){return t.length>=n?t:t+" ".repeat(n-t.length)}function ge(t,n){return t.length>=n?t:" ".repeat(n-t.length)+t}function z_(t){let n=t.entries??[];if(n.length===0)return"(empty directory)";let o=Math.max(4,...n.map((f)=>String(f.name).length)),i=Math.max(4,...n.map((f)=>String(f.type).length)),e=Math.max(4,...n.map((f)=>Nn(f.size??0).length)),r=Qn("NAME",o)+" "+Qn("TYPE",i)+" "+ge("SIZE",e)+" MODIFIED",E=n.map((f)=>Qn(f.name,o)+" "+Qn(f.type,i)+" "+ge(Nn(f.size??0),e)+" "+dt(f.modifiedAt));return[r,...E].join(`
181
+ `)}function TT(t){let o=(t.content??"").split(`
182
+ `);if(o.length>0&&o[o.length-1]==="")o.pop();let i=t.offset??1,e=String(i+o.length-1).length;return o.map((r,E)=>`${ge(String(i+E),e)} ${r}`).join(`
183
+ `)}function b_(t){let n=[["Path",t.path??"-"],["Size",Nn(t.size??0)],["Content-Type",t.contentType??"-"],["Author",t.author??"-"],["Version",t.currentVersion!=null?String(t.currentVersion):"-"],["Created",dt(t.createdAt)],["Modified",dt(t.modifiedAt)],["Deleted",t.isDeleted?"yes":"no"]];if(t.embeddingStatus)n.push(["Embedding",t.embeddingStatus]);if(t.appUrl)n.push(["App URL",t.appUrl]);let o=Math.max(...n.map(([i])=>i.length));return n.map(([i,e])=>`${Qn(i+":",o+1)} ${e}`).join(`
184
+ `)}function q_(t){let n=t.versions??[];if(n.length===0)return"(no version history)";return n.map((o)=>{let i=[`v${o.version} ${dt(o.createdAt)} ${o.author??"-"} [${o.operation}]`];if(o.message)i.push(` ${o.message}`);if(o.diffSummary)i.push(` ${o.diffSummary}`);return i.join(`
184
185
  `)}).join(`
185
186
 
186
- `)}function Jl(t){return`\u2713 wrote ${t.path} (v${t.version}, ${fn(t.size??0)})`}function Bl(t){return`\u2713 edited ${t.path} (v${t.version}, ${t.changes} change${t.changes!==1?"s":""})`}function Wl(t){return`\u2713 appended (v${t.version}, ${fn(t.size??0)})`}function Vl(t){return t.deleted?`\u2713 deleted ${t.path}`:`(not found: ${t.path})`}function Kl(t){return`\u2713 moved ${t.from} -> ${t.to} (v${t.version})`}function pl(t){return`\u2713 copied ${t.from} -> ${t.to} (v${t.version})`}function jl(t){let n=t.tree??[];if(n.length===0)return"(empty)";let o=[];function i(e,r){for(let E=0;E<e.length;E++){let u=e[E],T=E===e.length-1,N=T?"\u2514\u2500\u2500 ":"\u251C\u2500\u2500 ",R=u.type==="directory"?"/":"";if(o.push(`${r}${N}${u.name}${R}`),u.children&&u.children.length>0){let l=r+(T?" ":"\u2502 ");i(u.children,l)}}}return i(n,""),o.join(`
187
- `)}function hl(t){let n=t.matches??[];if(n.length===0)return"(no matches)";return n.map((o)=>`${o.path}:${o.lineNumber}: ${o.content}`).join(`
188
- `)}function kl(t){let n=t.matches??[];if(n.length===0)return t.hint?`(no matches) ${t.hint}`:"(no matches)";let o=n.map((i)=>`${i.path} (rank: ${typeof i.rank==="number"?i.rank.toFixed(2):i.rank})
187
+ `)}function s_(t){return`\u2713 wrote ${t.path} (v${t.version}, ${Nn(t.size??0)})`}function c_(t){return`\u2713 edited ${t.path} (v${t.version}, ${t.changes} change${t.changes!==1?"s":""})`}function x_(t){return`\u2713 appended (v${t.version}, ${Nn(t.size??0)})`}function a_(t){return t.deleted?`\u2713 deleted ${t.path}`:`(not found: ${t.path})`}function tw(t){return`\u2713 moved ${t.from} -> ${t.to} (v${t.version})`}function nw(t){return`\u2713 copied ${t.from} -> ${t.to} (v${t.version})`}function ow(t){let n=t.tree??[];if(n.length===0)return"(empty)";let o=[];function i(e,r){for(let E=0;E<e.length;E++){let f=e[E],T=E===e.length-1,l=T?"\u2514\u2500\u2500 ":"\u251C\u2500\u2500 ",N=f.type==="directory"?"/":"";if(o.push(`${r}${l}${f.name}${N}`),f.children&&f.children.length>0){let A=r+(T?" ":"\u2502 ");i(f.children,A)}}}return i(n,""),o.join(`
188
+ `)}function iw(t){let n=t.matches??[];if(n.length===0)return"(no matches)";return n.map((o)=>`${o.path}:${o.lineNumber}: ${o.content}`).join(`
189
+ `)}function ew(t){let n=t.matches??[];if(n.length===0)return t.hint?`(no matches) ${t.hint}`:"(no matches)";let o=n.map((i)=>`${i.path} (rank: ${typeof i.rank==="number"?i.rank.toFixed(2):i.rank})
189
190
  ${i.snippet}`);if(t.hint)o.push(`
190
191
  hint: ${t.hint}`);return o.join(`
191
192
 
192
- `)}function tT(t){let n=t.results??[];if(n.length===0)return"(no results)";return n.map((o)=>`${o.path} (score: ${typeof o.score==="number"?o.score.toFixed(3):o.score})`+(o.author?` by ${o.author}`:"")+`
193
+ `)}function fT(t){let n=t.results??[];if(n.length===0)return"(no results)";return n.map((o)=>`${o.path} (score: ${typeof o.score==="number"?o.score.toFixed(3):o.score})`+(o.author?` by ${o.author}`:"")+`
193
194
  ${o.snippet}`).join(`
194
195
 
195
- `)}function zl(t){let n=t.matches??[];if(n.length===0)return"(no matches)";return n.map((o)=>`${o.path} ${fn(o.size??0)} ${ht(o.modifiedAt)}`).join(`
196
- `)}function dl(t){let n=t.changes??[];if(n.length===0)return"(no changes)";return n.map((o)=>{let i=o.type==="add"?"+":o.type==="remove"?"-":" ",e=o.lineNumber!=null?`${o.lineNumber}: `:"";return`${i} ${e}${o.content}`}).join(`
197
- `)}function ml(t){return nT(t)}function bl(t){return`\u2713 reverted to v${t.revertedTo} (new version: v${t.version})`}function ql(t){let n=t.entries??[];if(n.length===0)return"(no recent activity)";return n.map((o)=>`${o.path} v${o.version} ${ht(o.createdAt)} ${o.author??"-"} [${o.operation}]`+(o.message?`
196
+ `)}function rw(t){let n=t.matches??[];if(n.length===0)return"(no matches)";return n.map((o)=>`${o.path} ${Nn(o.size??0)} ${dt(o.modifiedAt)}`).join(`
197
+ `)}function Ew(t){let n=t.changes??[];if(n.length===0)return"(no changes)";return n.map((o)=>{let i=o.type==="add"?"+":o.type==="remove"?"-":" ",e=o.lineNumber!=null?`${o.lineNumber}: `:"";return`${i} ${e}${o.content}`}).join(`
198
+ `)}function uw(t){return TT(t)}function fw(t){return`\u2713 reverted to v${t.revertedTo} (new version: v${t.version})`}function Tw(t){let n=t.entries??[];if(n.length===0)return"(no recent activity)";return n.map((o)=>`${o.path} v${o.version} ${dt(o.createdAt)} ${o.author??"-"} [${o.operation}]`+(o.message?`
198
199
  ${o.message}`:"")).join(`
199
200
 
200
- `)}function sl(t){let n=[];if(n.push(`reindexed: ${t.reindexed??0}`),t.failed)n.push(`failed: ${t.failed}`);if(t.skipped)n.push(`skipped: ${t.skipped}`);return n.join(", ")}function cl(t){let n=`${t.url}
201
+ `)}function lw(t){let n=[];if(n.push(`reindexed: ${t.reindexed??0}`),t.failed)n.push(`failed: ${t.failed}`);if(t.skipped)n.push(`skipped: ${t.skipped}`);return n.join(", ")}function Nw(t){let n=`${t.url}
201
202
 
202
- Expires: ${ht(t.expiresAt)} (${t.expiresIn}s)`;if(t.appUrl)n+=`
203
- App: ${t.appUrl}`;return n}var xl={ls:Zl,cat:nT,stat:Hl,log:Ql,write:Jl,edit:Bl,append:Wl,rm:Vl,mv:Kl,cp:pl,tree:jl,grep:hl,fts:kl,search:tT,"vec-search":tT,glob:zl,diff:dl,tail:ml,revert:bl,recent:ql,reindex:sl,"signed-url":cl};function al(t,n){let o=xl[t];if(o)return o(n);return JSON.stringify(n,null,2)}function oT(t,n,o){if(o)console.log(JSON.stringify(n,null,2));else console.log(al(t,n))}var n_=[{name:"write",args:[{name:"path",required:!0}],options:[{flag:"--content <text>",description:"File content (reads stdin if omitted)"},{flag:"-m, --message <msg>",description:"Version message"},{flag:"--expected-version <n>",description:"Fail if file is not at this version (optimistic concurrency)"}]},{name:"cat",args:[{name:"path",required:!0}],options:[{flag:"--offset <n>",description:"Line offset"},{flag:"--limit <n>",description:"Max lines"}]},{name:"edit",args:[{name:"path",required:!0}],options:[{flag:"--old <string>",description:"Text to replace"},{flag:"--new <string>",description:"Replacement text"},{flag:"-m, --message <msg>",description:"Version message"}]},{name:"append",args:[{name:"path",required:!0}],options:[{flag:"--content <text>",description:"Content to append"},{flag:"-m, --message <msg>",description:"Version message"}]},{name:"ls",args:[{name:"path",required:!1}],options:[]},{name:"stat",args:[{name:"path",required:!0}],options:[]},{name:"rm",args:[{name:"path",required:!0}],options:[]},{name:"mv",args:[{name:"from",required:!0},{name:"to",required:!0}],options:[{flag:"-m, --message <msg>",description:"Version message"}]},{name:"cp",args:[{name:"from",required:!0},{name:"to",required:!0}],options:[]},{name:"tail",args:[{name:"path",required:!0}],options:[{flag:"-n, --lines <n>",description:"Number of lines (default: 20)"}]},{name:"log",args:[{name:"path",required:!0}],options:[{flag:"--limit <n>",description:"Max entries"}]},{name:"diff",args:[{name:"path",required:!0}],options:[{flag:"--v1 <n>",description:"First version"},{flag:"--v2 <n>",description:"Second version"}]},{name:"revert",args:[{name:"path",required:!0}],options:[{flag:"--to <n>",description:"Version to revert to"}]},{name:"recent",args:[{name:"path",required:!1}],options:[{flag:"--since <duration>",description:"Time filter (e.g., 1h, 24h)"},{flag:"--limit <n>",description:"Max entries"}]},{name:"grep",args:[{name:"pattern",required:!0},{name:"path",required:!0}],options:[]},{name:"fts",args:[{name:"pattern",required:!0}],options:[{flag:"--path <prefix>",description:"Path prefix filter"}]},{name:"search",args:[{name:"query",required:!0}],options:[{flag:"--limit <n>",description:"Max results"}]},{name:"vec-search",args:[{name:"query",required:!0}],options:[{flag:"--limit <n>",description:"Max results"}]},{name:"reindex",args:[],options:[{flag:"--path <prefix>",description:"Path prefix filter"}]},{name:"tree",args:[{name:"path",required:!1}],options:[{flag:"--depth <n>",description:"Max recursion depth"}]},{name:"glob",args:[{name:"pattern",required:!0}],options:[{flag:"--path <prefix>",description:"Path prefix filter"}]},{name:"signed-url",args:[{name:"path",required:!0}],options:[{flag:"--expires-in <seconds>",description:"Expiry in seconds (default: 86400 = 24h)"}]}];function iT(t,n,o){for(let i of n_){let e=Pt(i.name),r=new t_(i.name).description(e?.description??i.name);for(let E of i.args)if(E.required)r.argument(`<${E.name}>`);else r.argument(`[${E.name}]`);for(let E of i.options)r.option(E.flag,E.description);r.action(async(...E)=>{let T={...E[E.length-2]};for(let N=0;N<i.args.length;N++)if(E[N]!==void 0)T[i.args[N].name]=E[N];if((i.name==="write"||i.name==="append")&&!T.content)if(!process.stdin.isTTY)T.content=await Bun.stdin.text();else console.error("Error: --content required (or pipe content via stdin)"),process.exit(1);if(T["expected-version"]!==void 0)T.expectedVersion=T["expected-version"],delete T["expected-version"];if(T.old!==void 0)T.old_string=T.old,delete T.old;if(T.new!==void 0)T.new_string=T.new,delete T.new;if(i.name==="revert"&&T.to!==void 0)T.version=T.to,delete T.to;if(T["expires-in"]!==void 0)T.expiresIn=T["expires-in"],delete T["expires-in"];for(let N of["offset","limit","lines","v1","v2","version","expectedVersion","depth","expiresIn"])if(T[N]!==void 0)T[N]=parseInt(T[N]);try{let N=await n.callOp(await o(),i.name,T);oT(i.name,N,t.opts().json)}catch(N){if(N?.cause?.code==="ECONNREFUSED"||N?.message?.includes("fetch failed"))console.error(`Cannot connect to agent-fs daemon.
203
+ Expires: ${dt(t.expiresAt)} (${t.expiresIn}s)`;if(t.appUrl)n+=`
204
+ App: ${t.appUrl}`;return n}var Rw={ls:z_,cat:TT,stat:b_,log:q_,write:s_,edit:c_,append:x_,rm:a_,mv:tw,cp:nw,tree:ow,grep:iw,fts:ew,search:fT,"vec-search":fT,glob:rw,diff:Ew,tail:uw,revert:fw,recent:Tw,reindex:lw,"signed-url":Nw};function Aw(t,n){let o=Rw[t];if(o)return o(n);return JSON.stringify(n,null,2)}function De(t,n,o){if(o)console.log(JSON.stringify(n,null,2));else console.log(Aw(t,n))}var ww=[{name:"write",args:[{name:"path",required:!0}],options:[{flag:"--content <text>",description:"File content (reads stdin if omitted)"},{flag:"--file <path>",description:"Read bytes from a local file and upload without text decoding"},{flag:"-m, --message <msg>",description:"Version message"},{flag:"--expected-version <n>",description:"Fail if file is not at this version (optimistic concurrency)"}]},{name:"cat",args:[{name:"path",required:!0}],options:[{flag:"--offset <n>",description:"Line offset"},{flag:"--limit <n>",description:"Max lines"}]},{name:"edit",args:[{name:"path",required:!0}],options:[{flag:"--old <string>",description:"Text to replace"},{flag:"--new <string>",description:"Replacement text"},{flag:"-m, --message <msg>",description:"Version message"}]},{name:"append",args:[{name:"path",required:!0}],options:[{flag:"--content <text>",description:"Content to append"},{flag:"-m, --message <msg>",description:"Version message"}]},{name:"ls",args:[{name:"path",required:!1}],options:[]},{name:"stat",args:[{name:"path",required:!0}],options:[]},{name:"rm",args:[{name:"path",required:!0}],options:[]},{name:"mv",args:[{name:"from",required:!0},{name:"to",required:!0}],options:[{flag:"-m, --message <msg>",description:"Version message"}]},{name:"cp",args:[{name:"from",required:!0},{name:"to",required:!0}],options:[]},{name:"tail",args:[{name:"path",required:!0}],options:[{flag:"-n, --lines <n>",description:"Number of lines (default: 20)"}]},{name:"log",args:[{name:"path",required:!0}],options:[{flag:"--limit <n>",description:"Max entries"}]},{name:"diff",args:[{name:"path",required:!0}],options:[{flag:"--v1 <n>",description:"First version"},{flag:"--v2 <n>",description:"Second version"}]},{name:"revert",args:[{name:"path",required:!0}],options:[{flag:"--to <n>",description:"Version to revert to"}]},{name:"recent",args:[{name:"path",required:!1}],options:[{flag:"--since <duration>",description:"Time filter (e.g., 1h, 24h)"},{flag:"--limit <n>",description:"Max entries"}]},{name:"grep",args:[{name:"pattern",required:!0},{name:"path",required:!0}],options:[]},{name:"fts",args:[{name:"pattern",required:!0}],options:[{flag:"--path <prefix>",description:"Path prefix filter"}]},{name:"search",args:[{name:"query",required:!0}],options:[{flag:"--limit <n>",description:"Max results"}]},{name:"vec-search",args:[{name:"query",required:!0}],options:[{flag:"--limit <n>",description:"Max results"}]},{name:"reindex",args:[],options:[{flag:"--path <prefix>",description:"Path prefix filter"}]},{name:"tree",args:[{name:"path",required:!1}],options:[{flag:"--depth <n>",description:"Max recursion depth"}]},{name:"glob",args:[{name:"pattern",required:!0}],options:[{flag:"--path <prefix>",description:"Path prefix filter"}]},{name:"signed-url",args:[{name:"path",required:!0}],options:[{flag:"--expires-in <seconds>",description:"Expiry in seconds (default: 86400 = 24h)"}]}];function lT(t,n,o,i){for(let e of ww){let r=Mt(e.name),E=new _w(e.name).description(r?.description??e.name);for(let f of e.args)if(f.required)E.argument(`<${f.name}>`);else E.argument(`[${f.name}]`);for(let f of e.options)E.option(f.flag,f.description);E.action(async(...f)=>{let l={...f[f.length-2]},N=null;for(let A=0;A<e.args.length;A++)if(f[A]!==void 0)l[e.args[A].name]=f[A];if(e.name==="write"){if(l.file&&l.content!==void 0)console.error("Error: use either --file or --content, not both"),process.exit(1);if(l.file)N=new Uint8Array(await Bun.file(l.file).arrayBuffer()),delete l.file;else if(l.content===void 0&&!process.stdin.isTTY)N=new Uint8Array(await Bun.stdin.arrayBuffer())}if(e.name==="append"&&l.content===void 0)if(!process.stdin.isTTY)l.content=await Bun.stdin.text();else console.error("Error: --content required (or pipe content via stdin)"),process.exit(1);if(e.name==="write"&&l.content===void 0&&N===null)console.error("Error: --content or --file required (or pipe content via stdin)"),process.exit(1);if(l["expected-version"]!==void 0)l.expectedVersion=l["expected-version"],delete l["expected-version"];if(l.old!==void 0)l.old_string=l.old,delete l.old;if(l.new!==void 0)l.new_string=l.new,delete l.new;if(e.name==="revert"&&l.to!==void 0)l.version=l.to,delete l.to;if(l["expires-in"]!==void 0)l.expiresIn=l["expires-in"],delete l["expires-in"];for(let A of["offset","limit","lines","v1","v2","version","expectedVersion","depth","expiresIn"])if(l[A]!==void 0)l[A]=parseInt(l[A]);try{let A=await o(),w=t.opts().drive??P().defaultDrive;if(w)l.driveId=w;if(e.name==="write"&&N!==null){if(!i)throw Error("Cannot resolve drive context for raw upload");let O=await n.putRaw(A,await i(A),l.path,N,{ifMatch:l.expectedVersion,message:l.message});De(e.name,O,t.opts().json);return}let g=await n.callOp(A,e.name,l);De(e.name,g,t.opts().json)}catch(A){if(A?.cause?.code==="ECONNREFUSED"||A?.message?.includes("fetch failed"))console.error(`Cannot connect to agent-fs daemon.
204
205
  Start with: agent-fs daemon start
205
- Or set AGENT_FS_API_URL to connect to a remote server.`),process.exit(1);console.error(`Error: ${N.message}`),process.exit(1)}}),t.addCommand(r)}}Y();import{Command as o_}from"commander";function rT(t){let n=new o_("auth").description("Authentication commands");return n.command("register").argument("<email>","Email address").description("Register a new user").action(async(o)=>{try{let i=await t.post("/auth/register",{email:o});eT(i,t)}catch{try{let i=Ut(),e=et(i,{email:o}),r=K(i,e.user.id);eT({apiKey:e.apiKey,userId:e.user.id,orgId:r[0]?.id},t)}catch(i){if(i.message?.includes("UNIQUE"))console.error("Error: User with this email already exists.");else console.error(`Error: ${i.message}`);process.exit(1)}}}),n.command("whoami").description("Show current user info").action(async()=>{try{let o=await t.get("/auth/me");console.log(JSON.stringify(o,null,2))}catch{try{let{getConfig:o,getUserByApiKey:i,createDatabase:e,listUserOrgs:r}=await Promise.resolve().then(() => (Y(),au)),E=o();if(!E.auth.apiKey)console.error("Not logged in. Run: agent-fs auth register <email>"),process.exit(1);let u=e(),T=i(u,E.auth.apiKey);if(!T)console.error("Invalid API key in config."),process.exit(1);let N=r(u,T.id);console.log(JSON.stringify({...T,orgs:N},null,2))}catch(o){console.error(`Error: ${o.message}`),process.exit(1)}}}),n}function eT(t,n){console.log("Registered successfully!"),console.log(`API Key: ${t.apiKey}`),console.log(`User ID: ${t.userId}`),console.log(`Org ID: ${t.orgId}`),D("auth.apiKey",t.apiKey),n.setApiKey(t.apiKey),console.log(`
206
- API key saved to config.`)}import{Command as N_}from"commander";function fT(){let t=new N_("daemon").description("Daemon lifecycle management");return t.command("start").description("Start the agent-fs daemon").action(async()=>{let{startDaemon:n}=await Promise.resolve().then(() => (Oo(),Do));n()}),t.command("stop").description("Stop the agent-fs daemon").action(async()=>{let{stopDaemon:n}=await Promise.resolve().then(() => (Oo(),Do));n()}),t.command("status").description("Check daemon status").action(async()=>{let{daemonStatus:n}=await Promise.resolve().then(() => (Oo(),Do)),o=n();if(o.running)console.log(`Daemon running (PID: ${o.pid})`);else console.log("Daemon is not running")}),t}Y();import{Command as R_}from"commander";import{existsSync as uT}from"fs";function TT(){let t=new R_("config").description("Configuration management");return t.command("get").argument("<key>","Config key (dot notation, e.g., s3.bucket)").description("Get a config value").action((n)=>{let o=C(),i=n.split("."),e=o;for(let r of i)e=e?.[r];if(e===void 0)console.error(`Key not found: ${n}`),process.exit(1);console.log(typeof e==="object"?JSON.stringify(e,null,2):String(e))}),t.command("set").argument("<key>","Config key").argument("<value>","Config value").description("Set a config value").action((n,o)=>{let i=o;try{i=JSON.parse(o)}catch{}D(n,i),console.log(`Set ${n} = ${JSON.stringify(i)}`)}),t.command("list").description("Show all config").action(()=>{console.log(JSON.stringify(C(),null,2))}),t.command("validate").description("Check that config, database, S3, and embeddings are healthy").action(async()=>{let n=[],o=C(),i=uT(ut());n.push({name:"Config file",ok:i,message:i?ut():"Not found \u2014 run `agent-fs onboard`"});let r=["endpoint","bucket","accessKeyId","secretAccessKey"].filter((R)=>!o.s3[R]);if(n.push({name:"S3 config",ok:r.length===0,message:r.length===0?`${o.s3.provider} \u2192 ${o.s3.endpoint}/${o.s3.bucket}`:`Missing: ${r.join(", ")}`}),r.length===0)try{await new $t(o.s3).listObjects(""),n.push({name:"S3 connectivity",ok:!0,message:"Connected"})}catch(R){n.push({name:"S3 connectivity",ok:!1,message:R.message||"Connection failed"})}let E=uT(Yt());n.push({name:"Database",ok:E,message:E?Yt():"Not found \u2014 run `agent-fs onboard`"}),n.push({name:"Auth",ok:!!o.auth.apiKey,message:o.auth.apiKey?"API key configured":"No API key \u2014 run `agent-fs onboard`"});let u=o.embedding.provider,T=!!o.embedding.apiKey||!!process.env.OPENAI_API_KEY||!!process.env.GEMINI_API_KEY;if(u==="openai"||u==="gemini")if(T)try{let R=await En(o.embedding);n.push({name:"Embeddings",ok:!!R,message:R?`${u} ready`:`${u} configured but failed to init`})}catch(R){n.push({name:"Embeddings",ok:!1,message:R.message})}else n.push({name:"Embeddings",ok:!1,message:`${u} selected but no API key`});else n.push({name:"Embeddings",ok:!0,message:"local/disabled (semantic search may be unavailable)"});console.log(`
206
+ Or set AGENT_FS_API_URL to connect to a remote server.`),process.exit(1);console.error(`Error: ${A.message}`),process.exit(1)}}),t.addCommand(E)}}Y();import{Command as yw}from"commander";function RT(t){let n=new yw("auth").description("Authentication commands");return n.command("register").argument("<email>","Email address").description("Register a new user").action(async(o)=>{try{let i=await t.post("/auth/register",{email:o});NT(i,t)}catch{try{let i=St(),e=Et(i,{email:o}),r=p(i,e.user.id);NT({apiKey:e.apiKey,userId:e.user.id,orgId:r[0]?.id},t)}catch(i){if(i.message?.includes("UNIQUE"))console.error("Error: User with this email already exists.");else console.error(`Error: ${i.message}`);process.exit(1)}}}),n.command("whoami").description("Show current user info").action(async()=>{try{let o=await t.get("/auth/me");console.log(JSON.stringify(o,null,2))}catch{try{let{getConfig:o,getUserByApiKey:i,createDatabase:e,listUserOrgs:r}=await Promise.resolve().then(() => (Y(),uT)),E=o();if(!E.auth.apiKey)console.error("Not logged in. Run: agent-fs auth register <email>"),process.exit(1);let f=e(),T=i(f,E.auth.apiKey);if(!T)console.error("Invalid API key in config."),process.exit(1);let l=r(f,T.id);console.log(JSON.stringify({...T,orgs:l},null,2))}catch(o){console.error(`Error: ${o.message}`),process.exit(1)}}}),n}function NT(t,n){console.log("Registered successfully!"),console.log(`API Key: ${t.apiKey}`),console.log(`User ID: ${t.userId}`),console.log(`Org ID: ${t.orgId}`),U("auth.apiKey",t.apiKey),n.setApiKey(t.apiKey),console.log(`
207
+ API key saved to config.`)}import{Command as $w}from"commander";function _T(){let t=new $w("daemon").description("Daemon lifecycle management");return t.command("start").description("Start the agent-fs daemon").action(async()=>{let{startDaemon:n}=await Promise.resolve().then(() => (Xo(),$o));n()}),t.command("stop").description("Stop the agent-fs daemon").action(async()=>{let{stopDaemon:n}=await Promise.resolve().then(() => (Xo(),$o));n()}),t.command("status").description("Check daemon status").action(async()=>{let{daemonStatus:n}=await Promise.resolve().then(() => (Xo(),$o)),o=n();if(o.running)console.log(`Daemon running (PID: ${o.pid})`);else console.log("Daemon is not running")}),t}Y();import{Command as Xw}from"commander";import{existsSync as wT}from"fs";function yT(){let t=new Xw("config").description("Configuration management");return t.command("get").argument("<key>","Config key (dot notation, e.g., s3.bucket)").description("Get a config value").action((n)=>{let o=P(),i=n.split("."),e=o;for(let r of i)e=e?.[r];if(e===void 0)console.error(`Key not found: ${n}`),process.exit(1);console.log(typeof e==="object"?JSON.stringify(e,null,2):String(e))}),t.command("set").argument("<key>","Config key").argument("<value>","Config value").description("Set a config value").action((n,o)=>{let i=o;try{i=JSON.parse(o)}catch{}U(n,i),console.log(`Set ${n} = ${JSON.stringify(i)}`)}),t.command("list").description("Show all config").action(()=>{console.log(JSON.stringify(P(),null,2))}),t.command("validate").description("Check that config, database, S3, and embeddings are healthy").action(async()=>{let n=[],o=P(),i=wT(x());n.push({name:"Config file",ok:i,message:i?x():"Not found \u2014 run `agent-fs onboard`"});let r=["endpoint","bucket","accessKeyId","secretAccessKey"].filter((N)=>!o.s3[N]);if(n.push({name:"S3 config",ok:r.length===0,message:r.length===0?`${o.s3.provider} \u2192 ${o.s3.endpoint}/${o.s3.bucket}`:`Missing: ${r.join(", ")}`}),r.length===0)try{await new Xt(o.s3).listObjects(""),n.push({name:"S3 connectivity",ok:!0,message:"Connected"})}catch(N){n.push({name:"S3 connectivity",ok:!1,message:N.message||"Connection failed"})}let E=wT(Ht());n.push({name:"Database",ok:E,message:E?Ht():"Not found \u2014 run `agent-fs onboard`"}),n.push({name:"Auth",ok:!!o.auth.apiKey,message:o.auth.apiKey?"API key configured":"No API key \u2014 run `agent-fs onboard`"});let f=o.embedding.provider,T=!!o.embedding.apiKey||!!process.env.OPENAI_API_KEY||!!process.env.GEMINI_API_KEY;if(f==="openai"||f==="gemini")if(T)try{let N=await ln(o.embedding);n.push({name:"Embeddings",ok:!!N,message:N?`${f} ready`:`${f} configured but failed to init`})}catch(N){n.push({name:"Embeddings",ok:!1,message:N.message})}else n.push({name:"Embeddings",ok:!1,message:`${f} selected but no API key`});else n.push({name:"Embeddings",ok:!0,message:"local/disabled (semantic search may be unavailable)"});console.log(`
207
208
  agent-fs health check
208
- `);let N=!0;for(let R of n){let l=R.ok?"\u2713":"\u2717";if(console.log(` ${l} ${R.name}: ${R.message}`),!R.ok)N=!1}if(console.log(),N)console.log("All checks passed.");else console.log("Some checks failed. Fix the issues above and re-run."),process.exit(1)}),t}Y();import{Command as A_}from"commander";function NT(t,n){let o=new A_("drive").description("Drive management");return o.command("list").description("List drives (all orgs unless --org is set)").action(async()=>{let i=o.parent?.opts().json;try{let e=o.parent?.opts().org;if(e){let u=await t.get(`/orgs/${e}/drives`);if(i){console.log(JSON.stringify(u,null,2));return}for(let T of u.drives){let N=T.isDefault?" (default)":"";console.log(`${T.id} ${T.name}${N}`)}return}let{orgs:r}=await t.get("/orgs");if(i){let u=[];for(let T of r){let{drives:N}=await t.get(`/orgs/${T.id}/drives`);u.push({orgId:T.id,orgName:T.name,drives:N})}console.log(JSON.stringify(u,null,2));return}if(!r||r.length===0){console.log("(no orgs)");return}let E=C();for(let u of r){let T=[];if(u.isPersonal)T.push("personal");if(E.defaultOrg===u.id)T.push("active");let N=T.length>0?` (${T.join(", ")})`:"";console.log(`
209
- ${u.name} [${u.role}]${N}`);let{drives:R}=await t.get(`/orgs/${u.id}/drives`);for(let l of R){let _=[];if(l.isDefault)_.push("default");if(E.defaultDrive===l.id)_.push("active");let O=_.length>0?` (${_.join(", ")})`:"";console.log(` ${l.id} ${l.name}${O}`)}}}catch(e){console.error(`Error: ${e.message}`),process.exit(1)}}),o.command("create").argument("<name>","Drive name").description("Create a new drive").action(async(i)=>{try{let e=await n(),r=await t.post(`/orgs/${e}/drives`,{name:i});console.log(JSON.stringify(r,null,2))}catch(e){console.error(`Error: ${e.message}`),process.exit(1)}}),o.command("current").description("Show current drive context").action(async()=>{let i=o.parent?.opts().json;try{let e=C(),r=await t.getMe(),E=e.defaultOrg??r.defaultOrgId;if(!E)console.error("Error: No org context. Run 'agent-fs auth register' first."),process.exit(1);let{drives:u}=await t.get(`/orgs/${E}/drives`),T;if(e.defaultDrive)T=u.find((R)=>R.id===e.defaultDrive);if(!T)T=u.find((R)=>R.isDefault)??u[0]??null;let N=e.defaultOrg?"config (org switch)":"server default";if(i)console.log(JSON.stringify({orgId:E,drive:T,source:N},null,2));else console.log(`org: ${E}`),console.log(`drive: ${T?.id??"(none)"} ${T?.name??""}`),console.log(`source: ${N}`)}catch(e){console.error(`Error: ${e.message}`),process.exit(1)}}),o.command("switch").argument("<driveId>","Drive ID to switch to").description("Set default drive context").action(async(i)=>{try{let{orgs:e}=await t.get("/orgs"),r=null,E=null;for(let u of e){let{drives:T}=await t.get(`/orgs/${u.id}/drives`),N=T.find((R)=>R.id===i);if(N){r=N,E=u;break}}if(!r)console.error(`Error: Drive ${i} not found in any of your orgs.`),process.exit(1);D("defaultOrg",E.id),D("defaultDrive",i),console.log(`Switched to drive: ${r.name} (org: ${E.name})`)}catch(e){console.error(`Error: ${e.message}`),process.exit(1)}}),o.command("invite").argument("<email>","User email to invite").requiredOption("--role <role>","Role: viewer, editor, or admin").description("Invite a user to the current org").addHelpText("after",`
210
- This invites the user to the organization that owns the current drive. The user will have access to all drives in the org based on their role.`).action(async(i,e)=>{try{let r=await n();await t.post(`/orgs/${r}/members/invite`,{email:i,role:e.role}),console.log(`Invited ${i} as ${e.role}`)}catch(r){console.error(`Error: ${r.message}`),process.exit(1)}}),o}Y();import{Command as y_}from"commander";function RT(t){let n=new y_("org").description("Org management");return n.command("list").description("List orgs you belong to").action(async()=>{let o=n.parent?.opts().json;try{let{orgs:i}=await t.get("/orgs");if(o){console.log(JSON.stringify(i,null,2));return}if(!i||i.length===0){console.log("(no orgs)");return}let e=C();for(let r of i){let E=[];if(r.isPersonal)E.push("personal");if(e.defaultOrg===r.id)E.push("active");let u=E.length>0?` (${E.join(", ")})`:"";console.log(`${r.id} ${r.name} [${r.role}]${u}`)}}catch(i){console.error(`Error: ${i.message}`),process.exit(1)}}),n.command("current").description("Show current org context").action(async()=>{let o=n.parent?.opts().json;try{let i=C(),e=await t.getMe(),r=i.defaultOrg??e.defaultOrgId;if(!r)console.error("Error: No org context. Run 'agent-fs auth register' first."),process.exit(1);let E=await t.get(`/orgs/${r}`),u=i.defaultOrg?"config (org switch)":"server default";if(o)console.log(JSON.stringify({...E,source:u},null,2));else console.log(`${E.id} ${E.name}${E.isPersonal?" (personal)":""}`),console.log(`source: ${u}`)}catch(i){console.error(`Error: ${i.message}`),process.exit(1)}}),n.command("switch").argument("<orgId>","Org ID to switch to").description("Set default org context").action(async(o)=>{try{let i=await t.get(`/orgs/${o}`);D("defaultOrg",o),D("defaultDrive",void 0),console.log(`Switched to org: ${i.name} (${o})`)}catch(i){console.error(`Error: ${i.message}`),process.exit(1)}}),n}import{Command as O_}from"commander";Y();import{Command as l_}from"commander";import{execSync as kt}from"child_process";import{existsSync as __}from"fs";function Io(){return new l_("onboard").description("Set up agent-fs (storage, embeddings, database, first user)").option("--local","Use local MinIO Docker container for S3").option("--remote <url>","Connect to a remote agent-fs server").option("-y, --yes","Accept all defaults without prompts").option("--s3-endpoint <url>","S3 endpoint URL").option("--s3-bucket <name>","S3 bucket name").option("--s3-access-key <key>","S3 access key ID").option("--s3-secret-key <key>","S3 secret access key").option("--s3-region <region>","S3 region").option("--embeddings <provider>","Embedding provider: openai, gemini, local, none").option("--openai-key <key>","OpenAI API key for embeddings").option("--gemini-key <key>","Gemini API key for embeddings").option("--no-daemon","Skip starting the daemon").action(async(n)=>{if(n.remote)console.error(`Remote mode is not yet supported in the onboard wizard.
209
+ `);let l=!0;for(let N of n){let A=N.ok?"\u2713":"\u2717";if(console.log(` ${A} ${N.name}: ${N.message}`),!N.ok)l=!1}if(console.log(),l)console.log("All checks passed.");else console.log("Some checks failed. Fix the issues above and re-run."),process.exit(1)}),t}Y();import{Command as Cw}from"commander";function LT(t,n){let o=new Cw("drive").description("Drive management");return o.command("list").description("List drives (all orgs unless --org is set)").action(async()=>{let i=o.parent?.opts().json;try{let e=o.parent?.opts().org;if(e){let f=await t.get(`/orgs/${e}/drives`);if(i){console.log(JSON.stringify(f,null,2));return}for(let T of f.drives){let l=T.isDefault?" (default)":"";console.log(`${T.id} ${T.name}${l}`)}return}let{orgs:r}=await t.get("/orgs");if(i){let f=[];for(let T of r){let{drives:l}=await t.get(`/orgs/${T.id}/drives`);f.push({orgId:T.id,orgName:T.name,drives:l})}console.log(JSON.stringify(f,null,2));return}if(!r||r.length===0){console.log("(no orgs)");return}let E=P();for(let f of r){let T=[];if(f.isPersonal)T.push("personal");if(E.defaultOrg===f.id)T.push("active");let l=T.length>0?` (${T.join(", ")})`:"";console.log(`
210
+ ${f.name} [${f.role}]${l}`);let{drives:N}=await t.get(`/orgs/${f.id}/drives`);for(let A of N){let w=[];if(A.isDefault)w.push("default");if(E.defaultDrive===A.id)w.push("active");let g=w.length>0?` (${w.join(", ")})`:"";console.log(` ${A.id} ${A.name}${g}`)}}}catch(e){console.error(`Error: ${e.message}`),process.exit(1)}}),o.command("create").argument("<name>","Drive name").description("Create a new drive").action(async(i)=>{try{let e=await n(),r=await t.post(`/orgs/${e}/drives`,{name:i});console.log(JSON.stringify(r,null,2))}catch(e){console.error(`Error: ${e.message}`),process.exit(1)}}),o.command("current").description("Show current drive context").action(async()=>{let i=o.parent?.opts().json;try{let e=P(),r=await t.getMe(),E=e.defaultOrg??r.defaultOrgId;if(!E)console.error("Error: No org context. Run 'agent-fs auth register' first."),process.exit(1);let{drives:f}=await t.get(`/orgs/${E}/drives`),T;if(e.defaultDrive)T=f.find((N)=>N.id===e.defaultDrive);if(!T)T=f.find((N)=>N.isDefault)??f[0]??null;let l=e.defaultOrg?"config (org switch)":"server default";if(i)console.log(JSON.stringify({orgId:E,drive:T,source:l},null,2));else console.log(`org: ${E}`),console.log(`drive: ${T?.id??"(none)"} ${T?.name??""}`),console.log(`source: ${l}`)}catch(e){console.error(`Error: ${e.message}`),process.exit(1)}}),o.command("switch").argument("<driveId>","Drive ID to switch to").description("Set default drive context").action(async(i)=>{try{let{orgs:e}=await t.get("/orgs"),r=null,E=null;for(let f of e){let{drives:T}=await t.get(`/orgs/${f.id}/drives`),l=T.find((N)=>N.id===i);if(l){r=l,E=f;break}}if(!r)console.error(`Error: Drive ${i} not found in any of your orgs.`),process.exit(1);U("defaultOrg",E.id),U("defaultDrive",i),console.log(`Switched to drive: ${r.name} (org: ${E.name})`)}catch(e){console.error(`Error: ${e.message}`),process.exit(1)}}),o.command("invite").argument("<email>","User email to invite").requiredOption("--role <role>","Role: viewer, editor, or admin").description("Invite a user to the current org").addHelpText("after",`
211
+ This invites the user to the organization that owns the current drive. The user will have access to all drives in the org based on their role.`).action(async(i,e)=>{try{let r=await n();await t.post(`/orgs/${r}/members/invite`,{email:i,role:e.role}),console.log(`Invited ${i} as ${e.role}`)}catch(r){console.error(`Error: ${r.message}`),process.exit(1)}}),o}Y();import{Command as Pw}from"commander";function gT(t){let n=new Pw("org").description("Org management");return n.command("list").description("List orgs you belong to").action(async()=>{let o=n.parent?.opts().json;try{let{orgs:i}=await t.get("/orgs");if(o){console.log(JSON.stringify(i,null,2));return}if(!i||i.length===0){console.log("(no orgs)");return}let e=P();for(let r of i){let E=[];if(r.isPersonal)E.push("personal");if(e.defaultOrg===r.id)E.push("active");let f=E.length>0?` (${E.join(", ")})`:"";console.log(`${r.id} ${r.name} [${r.role}]${f}`)}}catch(i){console.error(`Error: ${i.message}`),process.exit(1)}}),n.command("current").description("Show current org context").action(async()=>{let o=n.parent?.opts().json;try{let i=P(),e=await t.getMe(),r=i.defaultOrg??e.defaultOrgId;if(!r)console.error("Error: No org context. Run 'agent-fs auth register' first."),process.exit(1);let E=await t.get(`/orgs/${r}`),f=i.defaultOrg?"config (org switch)":"server default";if(o)console.log(JSON.stringify({...E,source:f},null,2));else console.log(`${E.id} ${E.name}${E.isPersonal?" (personal)":""}`),console.log(`source: ${f}`)}catch(i){console.error(`Error: ${i.message}`),process.exit(1)}}),n.command("switch").argument("<orgId>","Org ID to switch to").description("Set default org context").action(async(o)=>{try{let i=await t.get(`/orgs/${o}`);U("defaultOrg",o),U("defaultDrive",void 0),console.log(`Switched to org: ${i.name} (${o})`)}catch(i){console.error(`Error: ${i.message}`),process.exit(1)}}),n}import{Command as Zw}from"commander";Y();import{Command as Mw}from"commander";import{execSync as mt}from"child_process";import{existsSync as Fw}from"fs";function Co(){return new Mw("onboard").description("Set up agent-fs (storage, embeddings, database, first user)").option("--local","Use local MinIO Docker container for S3").option("--remote <url>","Connect to a remote agent-fs server").option("-y, --yes","Accept all defaults without prompts").option("--s3-endpoint <url>","S3 endpoint URL").option("--s3-bucket <name>","S3 bucket name").option("--s3-access-key <key>","S3 access key ID").option("--s3-secret-key <key>","S3 secret access key").option("--s3-region <region>","S3 region").option("--embeddings <provider>","Embedding provider: openai, gemini, local, none").option("--openai-key <key>","OpenAI API key for embeddings").option("--gemini-key <key>","Gemini API key for embeddings").option("--no-daemon","Skip starting the daemon").action(async(n)=>{if(n.remote)console.error(`Remote mode is not yet supported in the onboard wizard.
211
212
  To connect to a remote server, configure manually:
212
213
  agent-fs config set api.url "`+n.remote+`"
213
- agent-fs config set api.key "<your-api-key>"`),process.exit(1);let o=ut();if(__(o)){if(C().auth.apiKey&&!n.yes)console.log("Existing configuration found at "+o),console.log(`Re-running onboard will update settings. Use -y to accept defaults.
214
+ agent-fs config set api.key "<your-api-key>"`),process.exit(1);let o=x();if(Fw(o)){if(P().auth.apiKey&&!n.yes)console.log("Existing configuration found at "+o),console.log(`Re-running onboard will update settings. Use -y to accept defaults.
214
215
  `)}console.log(`Setting up agent-fs...
215
- `);let e=!(n.s3Endpoint||n.s3Bucket||n.s3AccessKey||n.s3SecretKey);if(n.s3Endpoint){if(D("s3.endpoint",n.s3Endpoint),n.s3Bucket)D("s3.bucket",n.s3Bucket);if(n.s3AccessKey)D("s3.accessKeyId",n.s3AccessKey);if(n.s3SecretKey)D("s3.secretAccessKey",n.s3SecretKey);if(n.s3Region)D("s3.region",n.s3Region);D("s3.provider","s3"),console.log("S3 configured from flags.")}else if(e)await g_(!!n.yes);else await L_();let r=n.embeddings??(n.yes?"none":void 0);if(r)w_(r,n);else if(!n.yes)console.log(`
216
+ `);let e=!(n.s3Endpoint||n.s3Bucket||n.s3AccessKey||n.s3SecretKey);if(n.s3Endpoint){if(U("s3.endpoint",n.s3Endpoint),n.s3Bucket)U("s3.bucket",n.s3Bucket);if(n.s3AccessKey)U("s3.accessKeyId",n.s3AccessKey);if(n.s3SecretKey)U("s3.secretAccessKey",n.s3SecretKey);if(n.s3Region)U("s3.region",n.s3Region);U("s3.provider","s3"),console.log("S3 configured from flags.")}else if(e)await Yw(!!n.yes);else await Gw();let r=n.embeddings??(n.yes?"none":void 0);if(r)vw(r,n);else if(!n.yes)console.log(`
216
217
  Embedding provider not specified. Skipping (semantic search disabled).`),console.log("Configure later: agent-fs config set embedding.provider openai");console.log(`
217
- Initializing database...`);let E=Ut();if(console.log("Database ready."),e||n.yes){let{apiKey:u}=Xn(E),T=rt(E,u),N=K(E,T.id);console.log(`
218
- User registered: ${T.email}`),console.log(`API Key: ${u}`),console.log(`Org ID: ${N[0]?.id}`)}else{let u=await D_();try{let T=et(E,{email:u}),N=K(E,T.user.id);D("auth.apiKey",T.apiKey),console.log(`
219
- User registered: ${u}`),console.log(`API Key: ${T.apiKey}`),console.log(`Org ID: ${N[0]?.id}`)}catch(T){if(T.message?.includes("UNIQUE"))console.log(`User ${u} already exists.`);else throw T}}console.log("\nSetup complete! Run `agent-fs daemon start` to begin."),console.log("Or use MCP directly: agent-fs mcp")})}function w_(t,n){switch(t){case"openai":if(D("embedding.provider","openai"),D("embedding.model","text-embedding-3-small"),n.openaiKey)D("embedding.apiKey",n.openaiKey);console.log("Embeddings: OpenAI (text-embedding-3-small)");break;case"gemini":if(D("embedding.provider","gemini"),D("embedding.model","text-embedding-004"),n.geminiKey)D("embedding.apiKey",n.geminiKey);console.log("Embeddings: Google Gemini (text-embedding-004)");break;case"local":D("embedding.provider","local"),console.log("Embeddings: local llama.cpp");break;case"none":D("embedding.provider","local"),D("embedding.model",""),D("embedding.apiKey",""),console.log("Embeddings: disabled (semantic search unavailable)");break;default:console.error(`Unknown embedding provider: ${t}`),console.error("Valid options: openai, gemini, local, none"),process.exit(1)}}async function g_(t){try{kt("which docker",{stdio:"ignore"}),kt("docker info",{stdio:"ignore"})}catch{console.error(`Docker is required for local mode (MinIO).
218
+ Initializing database...`);let E=St();if(console.log("Database ready."),e||n.yes){let{apiKey:f}=Gn(E),T=ut(E,f),l=p(E,T.id);console.log(`
219
+ User registered: ${T.email}`),console.log(`API Key: ${f}`),console.log(`Org ID: ${l[0]?.id}`)}else{let f=await Hw();try{let T=Et(E,{email:f}),l=p(E,T.user.id);U("auth.apiKey",T.apiKey),console.log(`
220
+ User registered: ${f}`),console.log(`API Key: ${T.apiKey}`),console.log(`Org ID: ${l[0]?.id}`)}catch(T){if(T.message?.includes("UNIQUE"))console.log(`User ${f} already exists.`);else throw T}}console.log("\nSetup complete! Run `agent-fs daemon start` to begin."),console.log("Or use MCP directly: agent-fs mcp")})}function vw(t,n){switch(t){case"openai":if(U("embedding.provider","openai"),U("embedding.model","text-embedding-3-small"),n.openaiKey)U("embedding.apiKey",n.openaiKey);console.log("Embeddings: OpenAI (text-embedding-3-small)");break;case"gemini":if(U("embedding.provider","gemini"),U("embedding.model","text-embedding-004"),n.geminiKey)U("embedding.apiKey",n.geminiKey);console.log("Embeddings: Google Gemini (text-embedding-004)");break;case"local":U("embedding.provider","local"),console.log("Embeddings: local llama.cpp");break;case"none":U("embedding.provider","local"),U("embedding.model",""),U("embedding.apiKey",""),console.log("Embeddings: disabled (semantic search unavailable)");break;default:console.error(`Unknown embedding provider: ${t}`),console.error("Valid options: openai, gemini, local, none"),process.exit(1)}}async function Yw(t){try{mt("which docker",{stdio:"ignore"}),mt("docker info",{stdio:"ignore"})}catch{console.error(`Docker is required for local mode (MinIO).
220
221
  Install Docker: https://docs.docker.com/get-docker/
221
- Or use 'agent-fs onboard --s3-endpoint <url>' to configure your own S3 bucket.`),process.exit(1)}let n=kt("docker ps -a --filter name=agent-fs-minio --format '{{.Names}}'",{encoding:"utf-8"}).trim();if(n==="agent-fs-minio")console.log("Found existing MinIO container (agent-fs-minio).");if(!t){let o=n==="agent-fs-minio"?"start the existing":"create a new";process.stdout.write(`This will ${o} MinIO Docker container. Continue? [Y/n] `);let i=Bun.stdin.stream().getReader(),{value:e}=await i.read();i.releaseLock();let r=new TextDecoder().decode(e).trim().toLowerCase();if(r==="n"||r==="no"){console.log("Skipped MinIO setup. Configure S3 manually:"),console.log(" agent-fs config set s3.endpoint <url>");return}}console.log("Setting up MinIO (local S3)...");try{if(n==="agent-fs-minio")kt("docker start agent-fs-minio",{stdio:"inherit"}),console.log("MinIO container started.");else kt('docker run -d --name agent-fs-minio -p 9000:9000 -p 9001:9001 -v agent-fs-minio-data:/data -e MINIO_ROOT_USER=minioadmin -e MINIO_ROOT_PASSWORD=minioadmin minio/minio server /data --console-address ":9001"',{stdio:"inherit"}),console.log("MinIO container created.");console.log("Waiting for MinIO to be ready..."),await new Promise((i)=>setTimeout(i,2000));try{kt("docker exec agent-fs-minio mc alias set local http://localhost:9000 minioadmin minioadmin && docker exec agent-fs-minio mc mb --ignore-existing local/agentfs",{stdio:"inherit"})}catch{}let o=kt("docker inspect --format='{{.Id}}' agent-fs-minio",{encoding:"utf-8"}).trim();D("minio.containerId",o),D("minio.managed",!0)}catch(o){console.error(`Failed to set up MinIO: ${o.message}`),process.exit(1)}D("s3.provider","minio"),D("s3.endpoint","http://localhost:9000"),D("s3.bucket","agentfs"),D("s3.region","us-east-1"),D("s3.accessKeyId","minioadmin"),D("s3.secretAccessKey","minioadmin"),console.log("MinIO configured.")}async function L_(){let t=C();console.log("Using S3 configuration from ~/.agent-fs/config.json"),console.log(` Provider: ${t.s3.provider}`),console.log(` Endpoint: ${t.s3.endpoint}`),console.log(` Bucket: ${t.s3.bucket}`),console.log(`
222
- Edit with: agent-fs config set s3.endpoint <url>`)}async function D_(){process.stdout.write("Email for first user: ");let t=Bun.stdin.stream().getReader(),{value:n}=await t.read();return t.releaseLock(),new TextDecoder().decode(n).trim()||"local@agent-fs.local"}function AT(){let t=Io(),n=new O_("init").description("Set up agent-fs (alias for 'onboard')").allowUnknownOption(!0).action(async(o,i)=>{console.log(`Note: 'agent-fs init' is now 'agent-fs onboard'.
223
- `),await t.parseAsync(i.args,{from:"user"})});for(let o of t.options)n.addOption(o);return n}import{Command as I_}from"commander";function yT(t,n){let o=new I_("comment").description("Document comments");async function i(e,r){try{return await t.callOp(await n(),e,r)}catch(E){if(E?.cause?.code==="ECONNREFUSED"||E?.message?.includes("fetch failed"))console.error(`Cannot connect to agent-fs daemon.
222
+ Or use 'agent-fs onboard --s3-endpoint <url>' to configure your own S3 bucket.`),process.exit(1)}let n=mt("docker ps -a --filter name=agent-fs-minio --format '{{.Names}}'",{encoding:"utf-8"}).trim();if(n==="agent-fs-minio")console.log("Found existing MinIO container (agent-fs-minio).");if(!t){let o=n==="agent-fs-minio"?"start the existing":"create a new";process.stdout.write(`This will ${o} MinIO Docker container. Continue? [Y/n] `);let i=Bun.stdin.stream().getReader(),{value:e}=await i.read();i.releaseLock();let r=new TextDecoder().decode(e).trim().toLowerCase();if(r==="n"||r==="no"){console.log("Skipped MinIO setup. Configure S3 manually:"),console.log(" agent-fs config set s3.endpoint <url>");return}}console.log("Setting up MinIO (local S3)...");try{if(n==="agent-fs-minio")mt("docker start agent-fs-minio",{stdio:"inherit"}),console.log("MinIO container started.");else mt('docker run -d --name agent-fs-minio -p 9000:9000 -p 9001:9001 -v agent-fs-minio-data:/data -e MINIO_ROOT_USER=minioadmin -e MINIO_ROOT_PASSWORD=minioadmin minio/minio server /data --console-address ":9001"',{stdio:"inherit"}),console.log("MinIO container created.");console.log("Waiting for MinIO to be ready..."),await new Promise((i)=>setTimeout(i,2000));try{mt("docker exec agent-fs-minio mc alias set local http://localhost:9000 minioadmin minioadmin && docker exec agent-fs-minio mc mb --ignore-existing local/agentfs",{stdio:"inherit"})}catch{}let o=mt("docker inspect --format='{{.Id}}' agent-fs-minio",{encoding:"utf-8"}).trim();U("minio.containerId",o),U("minio.managed",!0)}catch(o){console.error(`Failed to set up MinIO: ${o.message}`),process.exit(1)}U("s3.provider","minio"),U("s3.endpoint","http://localhost:9000"),U("s3.bucket","agentfs"),U("s3.region","us-east-1"),U("s3.accessKeyId","minioadmin"),U("s3.secretAccessKey","minioadmin"),console.log("MinIO configured.")}async function Gw(){let t=P();console.log("Using S3 configuration from ~/.agent-fs/config.json"),console.log(` Provider: ${t.s3.provider}`),console.log(` Endpoint: ${t.s3.endpoint}`),console.log(` Bucket: ${t.s3.bucket}`),console.log(`
223
+ Edit with: agent-fs config set s3.endpoint <url>`)}async function Hw(){process.stdout.write("Email for first user: ");let t=Bun.stdin.stream().getReader(),{value:n}=await t.read();return t.releaseLock(),new TextDecoder().decode(n).trim()||"local@agent-fs.local"}function DT(){let t=Co(),n=new Zw("init").description("Set up agent-fs (alias for 'onboard')").allowUnknownOption(!0).action(async(o,i)=>{console.log(`Note: 'agent-fs init' is now 'agent-fs onboard'.
224
+ `),await t.parseAsync(i.args,{from:"user"})});for(let o of t.options)n.addOption(o);return n}import{Command as Qw}from"commander";function OT(t,n){let o=new Qw("comment").description("Document comments");async function i(e,r){try{return await t.callOp(await n(),e,r)}catch(E){if(E?.cause?.code==="ECONNREFUSED"||E?.message?.includes("fetch failed"))console.error(`Cannot connect to agent-fs daemon.
224
225
  Start with: agent-fs daemon start
225
- Or set AGENT_FS_API_URL to connect to a remote server.`),process.exit(1);throw E}}return o.command("add").argument("<path>","File path to comment on").requiredOption("--body <text>","Comment body").option("--line <n>","Line number (sets both line-start and line-end)").option("--line-start <n>","Start line").option("--line-end <n>","End line").option("--quoted-content <text>","Quoted content from the file").description("Add a comment to a file").action(async(e,r)=>{try{let E={path:e,body:r.body};if(r.quotedContent)E.quotedContent=r.quotedContent;if(r.line)E.lineStart=parseInt(r.line),E.lineEnd=parseInt(r.line);if(r.lineStart)E.lineStart=parseInt(r.lineStart);if(r.lineEnd)E.lineEnd=parseInt(r.lineEnd);let u=await i("comment-add",E);console.log(JSON.stringify(u,null,2))}catch(E){console.error(`Error: ${E.message}`),process.exit(1)}}),o.command("reply").argument("<comment-id>","Parent comment ID to reply to").requiredOption("--body <text>","Reply body").description("Reply to a comment").action(async(e,r)=>{try{let E=await i("comment-add",{parentId:e,body:r.body});console.log(JSON.stringify(E,null,2))}catch(E){console.error(`Error: ${E.message}`),process.exit(1)}}),o.command("list").argument("[path]","File path to list comments for").option("--resolved","Show resolved comments").option("--limit <n>","Max results").option("--offset <n>","Skip N results").description("List comments").action(async(e,r)=>{try{let E={};if(e)E.path=e;if(r.resolved)E.resolved=!0;if(r.limit)E.limit=parseInt(r.limit);if(r.offset)E.offset=parseInt(r.offset);let u=await i("comment-list",E);console.log(JSON.stringify(u,null,2))}catch(E){console.error(`Error: ${E.message}`),process.exit(1)}}),o.command("get").argument("<id>","Comment ID").description("Get a comment with its replies").action(async(e)=>{try{let r=await i("comment-get",{id:e});console.log(JSON.stringify(r,null,2))}catch(r){console.error(`Error: ${r.message}`),process.exit(1)}}),o.command("update").argument("<id>","Comment ID").requiredOption("--body <text>","New comment body").description("Update a comment").action(async(e,r)=>{try{let E=await i("comment-update",{id:e,body:r.body});console.log(JSON.stringify(E,null,2))}catch(E){console.error(`Error: ${E.message}`),process.exit(1)}}),o.command("delete").argument("<id>","Comment ID").description("Delete a comment (soft delete)").action(async(e)=>{try{let r=await i("comment-delete",{id:e});console.log(JSON.stringify(r,null,2))}catch(r){console.error(`Error: ${r.message}`),process.exit(1)}}),o.command("resolve").argument("<id>","Comment ID").description("Resolve a comment").action(async(e)=>{try{let r=await i("comment-resolve",{id:e,resolved:!0});console.log(JSON.stringify(r,null,2))}catch(r){console.error(`Error: ${r.message}`),process.exit(1)}}),o.command("reopen").argument("<id>","Comment ID").description("Reopen a resolved comment").action(async(e)=>{try{let r=await i("comment-resolve",{id:e,resolved:!1});console.log(JSON.stringify(r,null,2))}catch(r){console.error(`Error: ${r.message}`),process.exit(1)}}),o}import{Command as U_}from"commander";function _T(t,n){let o=new U_("member").description("Member management (use global --drive to scope to a drive)");return o.command("list").description("List members of an org (or drive if --drive is set)").action(async()=>{let i=o.parent?.opts().json,e=o.parent?.opts().drive;try{let r=await n(),E=e?`/orgs/${r}/drives/${e}/members`:`/orgs/${r}/members`,{members:u}=await t.get(E);if(i){console.log(JSON.stringify(u,null,2));return}if(!u||u.length===0){console.log("(no members)");return}for(let T of u)console.log(`${T.email} [${T.role}]`)}catch(r){console.error(`Error: ${r.message}`),process.exit(1)}}),o.command("invite").argument("<email>","User email to invite").requiredOption("--role <role>","Role: viewer, editor, or admin").description("Invite a user to the current org").action(async(i,e)=>{try{let r=await n();await t.post(`/orgs/${r}/members/invite`,{email:i,role:e.role}),console.log(`Invited ${i} as ${e.role}`)}catch(r){console.error(`Error: ${r.message}`),process.exit(1)}}),o.command("update-role").argument("<email>","User email").requiredOption("--role <role>","New role: viewer, editor, or admin").description("Update a member's role (use global --drive for drive scope)").action(async(i,e)=>{let r=o.parent?.opts().drive;try{let E=await n(),u=await lT(t,E,i,r);if(r)await t.patch(`/orgs/${E}/drives/${r}/members/${u}`,{role:e.role});else await t.patch(`/orgs/${E}/members/${u}`,{role:e.role});let T=r?`drive ${r}`:"org";console.log(`Updated ${i} to ${e.role} (${T})`)}catch(E){console.error(`Error: ${E.message}`),process.exit(1)}}),o.command("remove").argument("<email>","User email to remove").description("Remove a member from org (or drive only if --drive is set)").action(async(i)=>{let e=o.parent?.opts().drive;try{let r=await n(),E=await lT(t,r,i,e);if(e)await t.del(`/orgs/${r}/drives/${e}/members/${E}`),console.log(`Removed ${i} from drive ${e}`);else await t.del(`/orgs/${r}/members/${E}`),console.log(`Removed ${i} from org`)}catch(r){console.error(`Error: ${r.message}`),process.exit(1)}}),o}async function lT(t,n,o,i){let e=i?`/orgs/${n}/drives/${i}/members`:`/orgs/${n}/members`,{members:r}=await t.get(e),E=r.find((u)=>u.email===o);if(!E)throw Error(`Member with email ${o} not found`);return E.userId}import{Command as $_}from"commander";var wT=`---
226
+ Or set AGENT_FS_API_URL to connect to a remote server.`),process.exit(1);throw E}}return o.command("add").argument("<path>","File path to comment on").requiredOption("--body <text>","Comment body").option("--line <n>","Line number (sets both line-start and line-end)").option("--line-start <n>","Start line").option("--line-end <n>","End line").option("--quoted-content <text>","Quoted content from the file").description("Add a comment to a file").action(async(e,r)=>{try{let E={path:e,body:r.body};if(r.quotedContent)E.quotedContent=r.quotedContent;if(r.line)E.lineStart=parseInt(r.line),E.lineEnd=parseInt(r.line);if(r.lineStart)E.lineStart=parseInt(r.lineStart);if(r.lineEnd)E.lineEnd=parseInt(r.lineEnd);let f=await i("comment-add",E);console.log(JSON.stringify(f,null,2))}catch(E){console.error(`Error: ${E.message}`),process.exit(1)}}),o.command("reply").argument("<comment-id>","Parent comment ID to reply to").requiredOption("--body <text>","Reply body").description("Reply to a comment").action(async(e,r)=>{try{let E=await i("comment-add",{parentId:e,body:r.body});console.log(JSON.stringify(E,null,2))}catch(E){console.error(`Error: ${E.message}`),process.exit(1)}}),o.command("list").argument("[path]","File path to list comments for").option("--resolved","Show resolved comments").option("--limit <n>","Max results").option("--offset <n>","Skip N results").description("List comments").action(async(e,r)=>{try{let E={};if(e)E.path=e;if(r.resolved)E.resolved=!0;if(r.limit)E.limit=parseInt(r.limit);if(r.offset)E.offset=parseInt(r.offset);let f=await i("comment-list",E);console.log(JSON.stringify(f,null,2))}catch(E){console.error(`Error: ${E.message}`),process.exit(1)}}),o.command("get").argument("<id>","Comment ID").description("Get a comment with its replies").action(async(e)=>{try{let r=await i("comment-get",{id:e});console.log(JSON.stringify(r,null,2))}catch(r){console.error(`Error: ${r.message}`),process.exit(1)}}),o.command("update").argument("<id>","Comment ID").requiredOption("--body <text>","New comment body").description("Update a comment").action(async(e,r)=>{try{let E=await i("comment-update",{id:e,body:r.body});console.log(JSON.stringify(E,null,2))}catch(E){console.error(`Error: ${E.message}`),process.exit(1)}}),o.command("delete").argument("<id>","Comment ID").description("Delete a comment (soft delete)").action(async(e)=>{try{let r=await i("comment-delete",{id:e});console.log(JSON.stringify(r,null,2))}catch(r){console.error(`Error: ${r.message}`),process.exit(1)}}),o.command("resolve").argument("<id>","Comment ID").description("Resolve a comment").action(async(e)=>{try{let r=await i("comment-resolve",{id:e,resolved:!0});console.log(JSON.stringify(r,null,2))}catch(r){console.error(`Error: ${r.message}`),process.exit(1)}}),o.command("reopen").argument("<id>","Comment ID").description("Reopen a resolved comment").action(async(e)=>{try{let r=await i("comment-resolve",{id:e,resolved:!1});console.log(JSON.stringify(r,null,2))}catch(r){console.error(`Error: ${r.message}`),process.exit(1)}}),o}import{Command as Jw}from"commander";function UT(t,n){let o=new Jw("member").description("Member management (use global --drive to scope to a drive)");return o.command("list").description("List members of an org (or drive if --drive is set)").action(async()=>{let i=o.parent?.opts().json,e=o.parent?.opts().drive;try{let r=await n(),E=e?`/orgs/${r}/drives/${e}/members`:`/orgs/${r}/members`,{members:f}=await t.get(E);if(i){console.log(JSON.stringify(f,null,2));return}if(!f||f.length===0){console.log("(no members)");return}for(let T of f)console.log(`${T.email} [${T.role}]`)}catch(r){console.error(`Error: ${r.message}`),process.exit(1)}}),o.command("invite").argument("<email>","User email to invite").requiredOption("--role <role>","Role: viewer, editor, or admin").description("Invite a user to the current org").action(async(i,e)=>{try{let r=await n();await t.post(`/orgs/${r}/members/invite`,{email:i,role:e.role}),console.log(`Invited ${i} as ${e.role}`)}catch(r){console.error(`Error: ${r.message}`),process.exit(1)}}),o.command("update-role").argument("<email>","User email").requiredOption("--role <role>","New role: viewer, editor, or admin").description("Update a member's role (use global --drive for drive scope)").action(async(i,e)=>{let r=o.parent?.opts().drive;try{let E=await n(),f=await IT(t,E,i,r);if(r)await t.patch(`/orgs/${E}/drives/${r}/members/${f}`,{role:e.role});else await t.patch(`/orgs/${E}/members/${f}`,{role:e.role});let T=r?`drive ${r}`:"org";console.log(`Updated ${i} to ${e.role} (${T})`)}catch(E){console.error(`Error: ${E.message}`),process.exit(1)}}),o.command("remove").argument("<email>","User email to remove").description("Remove a member from org (or drive only if --drive is set)").action(async(i)=>{let e=o.parent?.opts().drive;try{let r=await n(),E=await IT(t,r,i,e);if(e)await t.del(`/orgs/${r}/drives/${e}/members/${E}`),console.log(`Removed ${i} from drive ${e}`);else await t.del(`/orgs/${r}/members/${E}`),console.log(`Removed ${i} from org`)}catch(r){console.error(`Error: ${r.message}`),process.exit(1)}}),o}async function IT(t,n,o,i){let e=i?`/orgs/${n}/drives/${i}/members`:`/orgs/${n}/members`,{members:r}=await t.get(e),E=r.find((f)=>f.email===o);if(!E)throw Error(`Member with email ${o} not found`);return E.userId}import{Command as Vw}from"commander";var ST=`---
226
227
  name: agent-fs
227
228
  description: >-
228
229
  Use when the user wants to store, retrieve, search, or manage files in agent-fs \u2014
@@ -235,8 +236,10 @@ description: >-
235
236
  manage org/drive members, generate presigned URLs, check recent activity, or use
236
237
  semantic search across stored files. Also use when the user wants to mount or
237
238
  unmount agent-fs as a Linux FUSE filesystem ("mount agent-fs", "fuse mount",
238
- "expose drives as files", "use cat/grep/mv on my agent-fs files", "umount the
239
- drive"). If the user mentions agent-fs in any context, always consult this skill.
239
+ "fuse", "remote mount", "sandbox mount", "expose drives as files",
240
+ "use cat/grep/mv on my agent-fs files", "umount the drive", "mount a remote
241
+ drive", "mount from sprite", "mount from e2b", "mount from hetzner"). If the
242
+ user mentions agent-fs in any context, always consult this skill.
240
243
  ---
241
244
 
242
245
  # agent-fs CLI
@@ -261,17 +264,20 @@ For custom S3 (AWS, R2, etc.), use flags: \`agent-fs onboard --s3-endpoint <url>
261
264
 
262
265
  ## Essential Patterns
263
266
 
264
- 1. **All output is JSON** \u2014 always parse CLI output as JSON (except \`daemon status\` and \`auth register\` which print human-readable text).
267
+ 1. **Use JSON for machine output** \u2014 pass \`--json\` when parsing CLI output (except \`download\` without \`-o\`, which writes raw bytes to stdout; \`daemon status\` and \`auth register\` print human-readable text).
265
268
 
266
269
  2. **Auto-detection** \u2014 the CLI automatically detects whether the daemon is running. If it is, commands go via HTTP; otherwise, they use embedded mode directly. No user action needed.
267
270
 
268
- 3. **Stdin piping for content** \u2014 \`write\` and \`append\` accept content via stdin or \`--content\`:
271
+ 3. **Stdin and file upload** \u2014 \`write\` accepts raw bytes from stdin or \`--file\`, and text from \`--content\`; \`append\` accepts text via stdin or \`--content\`:
269
272
  \`\`\`bash
270
- # Preferred for multi-line content
273
+ # Preferred for multi-line text
271
274
  echo "content here" | agent-fs write path/to/file.txt
272
275
 
273
276
  # Inline for short content
274
277
  agent-fs write path/to/file.txt --content "short text"
278
+
279
+ # Binary-safe upload
280
+ agent-fs write assets/screenshot.png --file ./screenshot.png
275
281
  \`\`\`
276
282
 
277
283
  4. **Paths** \u2014 forward-slash separated, no leading slash required. Example: \`docs/notes/meeting.md\`
@@ -293,8 +299,8 @@ For custom S3 (AWS, R2, etc.), use flags: \`agent-fs onboard --s3-endpoint <url>
293
299
 
294
300
  | Command | Usage | Description |
295
301
  |---------|-------|-------------|
296
- | \`write\` | \`agent-fs write <path> [--content <text>] [-m <msg>] [--expected-version <n>]\` | Write content (stdin or --content) |
297
- | \`cat\` | \`agent-fs cat <path> [--offset <n>] [--limit <n>]\` | Read file content |
302
+ | \`write\` | \`agent-fs write <path> [--content <text>] [--file <local-path>] [-m <msg>] [--expected-version <n>]\` | Write text or binary bytes |
303
+ | \`cat\` | \`agent-fs cat <path> [--offset <n>] [--limit <n>]\` | Read text file content |
298
304
  | \`edit\` | \`agent-fs edit <path> --old <text> --new <text> [-m <msg>]\` | Find-and-replace in file |
299
305
  | \`append\` | \`agent-fs append <path> [--content <text>] [-m <msg>]\` | Append to file (stdin or --content) |
300
306
  | \`tail\` | \`agent-fs tail <path> [--lines <n>]\` | Last N lines (default: 20) |
@@ -306,6 +312,7 @@ For custom S3 (AWS, R2, etc.), use flags: \`agent-fs onboard --s3-endpoint <url>
306
312
  | \`mv\` | \`agent-fs mv <from> <to> [-m <msg>]\` | Move or rename a file |
307
313
  | \`cp\` | \`agent-fs cp <from> <to>\` | Copy a file |
308
314
  | \`signed-url\` | \`agent-fs signed-url <path> [--expires-in <seconds>]\` | Generate a presigned URL for direct download (default: 24h, max: 7 days) |
315
+ | \`download\` | \`agent-fs download <path> [-o <local-path>]\` | Download raw bytes |
309
316
 
310
317
  ### Versioning
311
318
 
@@ -389,9 +396,14 @@ The \`--drive\` flag is a global option \u2014 place it before the subcommand: \
389
396
 
390
397
  Expose all org drives as a Linux FUSE filesystem so agents can use plain shell verbs (\`cat\`, \`grep\`, \`mv\`, \`rm\`) against agent-fs content. Requires \`/dev/fuse\` and \`SYS_ADMIN\` cap; not available on macOS or in gVisor-based sandboxes.
391
398
 
399
+ Two topologies are supported:
400
+ - **Local mode** (default): helper talks to a local daemon over a Unix socket. Daemon must be running and have an S3 backend configured.
401
+ - **Remote mode** (\`--remote\`): helper talks directly to a remote agent-fs HTTP API. No local daemon required \u2014 ideal for sandboxes (sprite, E2B, Hetzner VMs, GitHub Actions runners) that can reach a hosted agent-fs but can't run the full daemon stack.
402
+
392
403
  | Command | Usage | Description |
393
404
  |---------|-------|-------------|
394
- | \`mount\` | \`agent-fs mount <path> [--allow-other] [--foreground]\` | Mount drives at \`<path>\` (e.g. \`/mnt/agent-fs/<drive>/\`). Daemon must be running. |
405
+ | \`mount\` | \`agent-fs mount <path> [--allow-other] [--foreground]\` | Mount drives at \`<path>\` via local daemon (e.g. \`/mnt/agent-fs/<drive>/\`). |
406
+ | \`mount --remote\` | \`agent-fs mount <path> --remote [--api-url <url>] [--api-key <key>]\` | Mount against a remote agent-fs HTTP API. Reads \`apiUrl\`/\`apiKey\` from \`~/.agent-fs/config.json\` or \`AGENT_FS_API_URL\`/\`AGENT_FS_API_KEY\` env if flags omitted. Prefer env over \`--api-key\` (the latter exposes the key in \`ps\`). |
395
407
  | \`umount\` | \`agent-fs umount <path>\` | Unmount the FUSE mountpoint. |
396
408
  | \`mount status\` | \`agent-fs mount status\` | Show whether a mount is active and where. |
397
409
 
@@ -519,7 +531,7 @@ agent-fs signed-url docs/report.pdf --json
519
531
 
520
532
  The presigned URL requires no authentication \u2014 anyone with the link can download the file until it expires. Signed URLs serve the correct \`Content-Type\` header based on file extension (e.g., \`application/pdf\` for \`.pdf\`, \`image/png\` for \`.png\`), so browsers render them natively.
521
533
 
522
- **MIME types on upload:** \`write\`, \`edit\`, \`append\`, and \`revert\` automatically detect and set the correct \`Content-Type\` on S3 objects based on file extension. The content type is also stored in the database and visible in \`stat\` output via the \`contentType\` field.
534
+ **MIME types on upload:** \`write\`, \`edit\`, \`append\`, and \`revert\` automatically detect and set the correct \`Content-Type\` on S3 objects based on file extension. The content type is also stored in the database and visible in \`stat\` output via the \`contentType\` field. Raw stdin and \`--file\` uploads preserve bytes exactly; text search/indexing is applied only when the payload is valid, indexable UTF-8 text.
523
535
 
524
536
  ### App URL in responses
525
537
 
@@ -537,15 +549,45 @@ This applies to any op that returns a \`path\` or \`to\` field (write, stat, edi
537
549
  \`\`\`bash
538
550
  agent-fs config validate
539
551
  \`\`\`
540
- `;function gT(){return new $_("docs").description("Show agent-fs documentation and command reference").action(()=>{let t=wT.replace(/^---[\s\S]*?---\n*/,"");console.log(t)})}Y();import{Command as $T}from"commander";import{existsSync as Dt,readFileSync as XT,writeFileSync as v_,unlinkSync as M_,statSync as F_,readdirSync as Y_}from"fs";import{dirname as G_,join as Mt}from"path";import{fileURLToPath as Z_}from"url";import{spawn as OT}from"child_process";import{existsSync as _e}from"fs";import{join as X_}from"path";import{createRequire as C_}from"module";var P_={x64:"@desplega.ai/agent-fs-fuse-linux-x64",arm64:"@desplega.ai/agent-fs-fuse-linux-arm64"};function LT(){let t=process.env.AGENT_FS_FUSE_BIN;if(t){if(!_e(t))throw Error(`AGENT_FS_FUSE_BIN is set to '${t}' but no file exists there. Did you build the helper? Run: cd packages/fuse-helper && cargo build --release`);return{binPath:t,source:"env"}}let n=process.arch,o=P_[n];if(o)try{let r=C_(import.meta.url).resolve(`${o}/package.json`).replace(/[\\/]package\.json$/,""),E=X_(r,"bin","agent-fs-fuse");if(_e(E))return{binPath:E,source:"subpackage"}}catch{}throw Error(`FUSE helper not found.
552
+
553
+ ### Mount a remote drive from a sandbox
554
+
555
+ Use \`--remote\` when the agent is running in a Linux sandbox (sprite, E2B, Hetzner VM, GitHub Actions runner, etc.) that can reach a hosted agent-fs HTTP API but cannot run the full daemon + S3 stack locally.
556
+
557
+ \`\`\`bash
558
+ # Linux prereqs (run once per sandbox)
559
+ sudo apt-get install -y fuse3
560
+ sudo chmod 666 /dev/fuse
561
+ sudo ln -sf /proc/mounts /etc/mtab
562
+ echo user_allow_other | sudo tee -a /etc/fuse.conf
563
+
564
+ # Auth \u2014 either env vars or ~/.agent-fs/config.json
565
+ export AGENT_FS_API_URL=https://agent-fs.example.com
566
+ export AGENT_FS_API_KEY=<key>
567
+
568
+ # Mount \u2014 no local daemon needed
569
+ mkdir -p ~/mnt
570
+ agent-fs mount ~/mnt --remote
571
+
572
+ # Use plain shell verbs against remote content
573
+ ls ~/mnt
574
+ cat ~/mnt/current/docs/spec.md
575
+ echo "edit from sandbox $(date)" > ~/mnt/current/notes.txt
576
+
577
+ # Unmount
578
+ fusermount3 -u ~/mnt
579
+ \`\`\`
580
+
581
+ See \`docs/mounting/\` for per-environment guides (sprite, E2B, Hetzner).
582
+ `;function $T(){return new Vw("docs").description("Show agent-fs documentation and command reference").action(()=>{let t=ST.replace(/^---[\s\S]*?---\n*/,"");console.log(t)})}Y();import{Command as HT}from"commander";import{existsSync as It,readFileSync as ZT,writeFileSync as dw,unlinkSync as mw,statSync as zw,readdirSync as bw}from"fs";import{dirname as qw,join as vt}from"path";import{fileURLToPath as sw}from"url";import{spawn as FT}from"child_process";import{existsSync as Se}from"fs";import{join as Ww}from"path";import{createRequire as Kw}from"module";var pw={x64:"@desplega.ai/agent-fs-fuse-linux-x64",arm64:"@desplega.ai/agent-fs-fuse-linux-arm64"};function XT(){let t=process.env.AGENT_FS_FUSE_BIN;if(t){if(!Se(t))throw Error(`AGENT_FS_FUSE_BIN is set to '${t}' but no file exists there. Did you build the helper? Run: cd packages/fuse-helper && cargo build --release`);return{binPath:t,source:"env"}}let n=process.arch,o=pw[n];if(o)try{let r=Kw(import.meta.url).resolve(`${o}/package.json`).replace(/[\\/]package\.json$/,""),E=Ww(r,"bin","agent-fs-fuse");if(Se(E))return{binPath:E,source:"subpackage"}}catch{}throw Error(`FUSE helper not found.
541
583
  `+" \u2022 Linux: `npm install -g @desplega.ai/agent-fs` should have installed "+`\`${o??"agent-fs-fuse-linux-<arch>"}\` automatically.
542
- `+" \u2022 Local dev: build via `cd packages/fuse-helper && cargo build --release` "+"and set `AGENT_FS_FUSE_BIN=$(pwd)/packages/fuse-helper/target/release/agent-fs-fuse`.")}async function DT(t,n){if(!_e(n))return null;let o=process.arch==="x64"?"linux-x64":`linux-${process.arch}`;try{let e=JSON.parse(await Bun.file(n).text()).binaries?.[o];if(!e)return null;let r=e.replace(/^sha256:/,""),E=new Bun.CryptoHasher("sha256");E.update(await Bun.file(t).bytes());let u=E.digest("hex");if(u!==r)return`binary hash mismatch \u2014 expected ${r}, got ${u}`;return null}catch(i){return`manifest verification failed: ${String(i?.message??i)}`}}function we(){return Mt(W(),"mount.pid")}function IT(){return Mt(W(),"mount.log")}function H_(){return Mt(W(),"agent-fs.sock")}function UT(){let t=(()=>{try{let o=Z_(import.meta.url),i=G_(o),e=[Mt(i,"fuse-bin.manifest.json"),Mt(i,"..","fuse-bin.manifest.json"),Mt(i,"..","..","dist","fuse-bin.manifest.json")];for(let r of e)if(Dt(r))return r;return e[0]}catch{return""}})(),n=Mt(W(),"fuse-bin.manifest.json");if(t&&Dt(t))return t;if(Dt(n))return n;return t||n}function ge(){let t=we();if(!Dt(t))return{running:!1};let n=XT(t,"utf-8").trim(),[o,...i]=n.split(`
584
+ `+" \u2022 Local dev: build via `cd packages/fuse-helper && cargo build --release` "+"and set `AGENT_FS_FUSE_BIN=$(pwd)/packages/fuse-helper/target/release/agent-fs-fuse`.")}async function CT(t,n){if(!Se(n))return null;let o=process.arch==="x64"?"linux-x64":`linux-${process.arch}`;try{let e=JSON.parse(await Bun.file(n).text()).binaries?.[o];if(!e)return null;let r=e.replace(/^sha256:/,""),E=new Bun.CryptoHasher("sha256");E.update(await Bun.file(t).bytes());let f=E.digest("hex");if(f!==r)return`binary hash mismatch \u2014 expected ${r}, got ${f}`;return null}catch(i){return`manifest verification failed: ${String(i?.message??i)}`}}function PT(t){let{mode:n,mountpoint:o,socket:i,apiUrl:e,apiKey:r,allowOther:E,logFile:f}=t;if(!o)throw Error("buildHelperSpawnArgs: mountpoint is required");if(n==="remote"){if(i)throw Error("Cannot combine --remote with --socket \u2014 they select different transports. "+"Drop --socket to use remote HTTP transport.");if(!e||!r)throw Error("--remote requires both an API URL and an API key. Set via --api-url + --api-key, env vars AGENT_FS_API_URL + AGENT_FS_API_KEY, or `apiUrl` + `apiKey` in ~/.agent-fs/config.json.")}else{if(e||r)throw Error("--api-url / --api-key require --remote. Pass --remote to enable HTTP transport, or drop the API flags for local socket mode.");if(!i)throw Error("buildHelperSpawnArgs: socket is required in local mode")}let T=["--mountpoint",o];if(n==="remote")T.push("--api-url",e);else T.push("--socket",i);if(f)T.push("--log-file",f);if(E)T.push("--allow-other");let l={};if(n==="remote")l.AGENT_FS_API_KEY=r;return{argv:T,env:l}}import{existsSync as hw,readFileSync as jw}from"fs";function kw(t){if(!t||!hw(t))return{};try{let n=jw(t,"utf-8");return JSON.parse(n)}catch{return{}}}function MT(t,n,o){let i=kw(n),e=i.apiKey??i.auth?.apiKey,r=t.apiUrl??o.AGENT_FS_API_URL??i.apiUrl,E=t.apiKey??o.AGENT_FS_API_KEY??e;if(!r||!E)return null;let f=t.apiUrl?"flag":o.AGENT_FS_API_URL?"env":"config",T=t.apiKey?"flag":o.AGENT_FS_API_KEY?"env":"config";return{apiUrl:r,apiKey:E,source:{apiUrl:f,apiKey:T}}}function $e(){return vt(V(),"mount.pid")}function vT(){return vt(V(),"mount.log")}function cw(){return vt(V(),"agent-fs.sock")}function YT(){let t=(()=>{try{let o=sw(import.meta.url),i=qw(o),e=[vt(i,"fuse-bin.manifest.json"),vt(i,"..","fuse-bin.manifest.json"),vt(i,"..","..","dist","fuse-bin.manifest.json")];for(let r of e)if(It(r))return r;return e[0]}catch{return""}})(),n=vt(V(),"fuse-bin.manifest.json");if(t&&It(t))return t;if(It(n))return n;return t||n}function Xe(){let t=$e();if(!It(t))return{running:!1};let n=ZT(t,"utf-8").trim(),[o,...i]=n.split(`
543
585
  `),e=parseInt(o,10);if(!Number.isFinite(e))return{running:!1};try{process.kill(e,0)}catch{return{running:!1}}let r=i.join(`
544
- `).trim()||void 0;return{running:!0,pid:e,mountpoint:r}}function ST(t,n){v_(we(),`${t}
586
+ `).trim()||void 0;return{running:!0,pid:e,mountpoint:r}}function GT(t,n){dw($e(),`${t}
545
587
  ${n}
546
- `)}function CT(){let t=we();if(Dt(t))try{M_(t)}catch{}}function PT(){let t=new $T("mount").description("FUSE mount commands for agent-fs (Linux only).").argument("[path]","Directory to mount the agent-fs filesystem at").option("--socket <path>","Path to the daemon's Unix socket").option("--allow-other","Allow other users to access the mount").option("--foreground","Run the helper in the foreground (logs to stdout)").action(async(n,o)=>{if(!n){t.help();return}await Q_(n,o)});return t.command("status").description("Show the current mount's PID and mountpoint").action(async()=>{let n=ge();if(!n.running){console.log("Mount is not running");return}if(console.log(`Mount PID: ${n.pid}`),n.mountpoint)console.log(`Mountpoint: ${n.mountpoint}`);let o=n.mountpoint?Mt(n.mountpoint,".agent-fs","status"):null;if(o&&Dt(o))try{console.log(`Status: ${XT(o,"utf-8").trim()}`)}catch{}}),t}function vT(){return new $T("umount").description("Unmount a previously-mounted agent-fs FUSE filesystem").argument("<path>","Directory the filesystem is mounted at").action(async(t)=>{await J_(t)})}async function Q_(t,n){let o=t;if(process.platform!=="linux")console.error("FUSE mount is Linux-only.\nFor macOS dev: see `packages/fuse-helper/README.md` for the Docker harness."),process.exit(1);if(!Dt(o))console.error(`Mountpoint does not exist: ${o}`),process.exit(1);try{if(!F_(o).isDirectory())console.error(`Mountpoint is not a directory: ${o}`),process.exit(1)}catch(N){console.error(`Cannot stat mountpoint: ${N.message}`),process.exit(1)}try{if(Y_(o).length>0)console.error(`Mountpoint is not empty: ${o}`),process.exit(1)}catch(N){console.error(`Cannot read mountpoint: ${N.message}`),process.exit(1)}let i=ge();if(i.running)console.error(`A mount is already running (PID ${i.pid}`+(i.mountpoint?`, ${i.mountpoint}`:"")+")."),console.error("Run `agent-fs umount <path>` to tear it down first."),process.exit(1);let e=n.socket??H_();if(!Dt(e))console.error(`Daemon socket not found at ${e}.`),console.error("Start the daemon first: agent-fs daemon start"),process.exit(1);let r;try{r=LT()}catch(N){console.error(N.message),process.exit(1)}let E=await DT(r.binPath,UT());if(E)console.error(`Refusing to spawn helper: ${E}`),process.exit(1);if(!Dt(UT()))console.error("Warning: no fuse-bin.manifest.json found \u2014 skipping hash verification.");let u=["--mountpoint",o,"--socket",e,"--log-file",IT()];if(n.allowOther)u.push("--allow-other");if(n.foreground){let N=OT(r.binPath,u,{stdio:"inherit"});if(N.on("exit",(R)=>{CT(),process.exit(R??0)}),N.pid)ST(N.pid,o);return}let T=OT(r.binPath,u,{detached:!0,stdio:"ignore"});if(T.pid===void 0)console.error("Failed to spawn FUSE helper."),process.exit(1);ST(T.pid,o),T.unref(),console.log(`Mount started (PID: ${T.pid}, ${r.source})`),console.log(`Mountpoint: ${o}`),console.log(`Logs: ${IT()}`)}async function J_(t){if(process.platform!=="linux")console.error("FUSE umount is Linux-only."),process.exit(1);let n=ge();if(n.running&&n.pid!==void 0)try{process.kill(n.pid,"SIGTERM"),console.log(`Sent SIGTERM to mount helper (PID: ${n.pid})`)}catch(o){console.error(`Failed to signal helper: ${o.message}`)}else console.log("No running mount PID recorded.");for(let o of["fusermount3","fusermount"])try{if(Bun.spawnSync({cmd:[o,"-u",t]}).exitCode===0){console.log(`Unmounted ${t} (via ${o})`);break}}catch{}CT()}var B=new Lw;B.name("agent-fs").description("Agent-first filesystem backed by S3").version(b).option("--org <orgId>","Override org context").option("--drive <driveId>","Override drive context").option("--json","Output raw JSON");var zt=new Re;async function So(){let t=B.opts().org;if(t)return t;let n=C();if(n.defaultOrg)return n.defaultOrg;try{let o=await zt.getMe();if(o.defaultOrgId)return o.defaultOrgId}catch(o){if(o?.message?.includes("Cannot connect"))console.error(o.message),process.exit(1)}console.error("Error: No org context. Use --org or run 'agent-fs auth register'"),process.exit(1)}B.addCommand(gT());iT(B,zt,So);B.addCommand(rT(zt));B.addCommand(fT());B.addCommand(TT());B.addCommand(NT(zt,So));B.addCommand(RT(zt));B.addCommand(AT());B.addCommand(Io());B.addCommand(yT(zt,So));B.addCommand(_T(zt,So));B.addCommand(PT());B.addCommand(vT());B.command("mcp").description("Start MCP server (stdio)").action(async()=>{await FT().then(() => z_)});B.command("server").description("Run server in foreground (dev mode)").action(async()=>{await uN().then(() => gw)});var Dw=`
588
+ `)}function QT(){let t=$e();if(It(t))try{mw(t)}catch{}}function JT(){let t=new HT("mount").description("FUSE mount commands for agent-fs (Linux only).").argument("[path]","Directory to mount the agent-fs filesystem at").option("--socket <path>","Path to the daemon's Unix socket (local mode)").option("--remote","Mount against a remote agent-fs HTTP API (no local daemon required)").option("--api-url <url>","Remote agent-fs API base URL (implies --remote)").option("--api-key <key>","Remote API key (DEPRECATED \u2014 prefer AGENT_FS_API_KEY env or config)").option("--allow-other","Allow other users to access the mount").option("--foreground","Run the helper in the foreground (logs to stdout)").action(async(n,o)=>{if(!n){t.help();return}await xw(n,o)});return t.command("status").description("Show the current mount's PID and mountpoint").action(async()=>{let n=Xe();if(!n.running){console.log("Mount is not running");return}if(console.log(`Mount PID: ${n.pid}`),n.mountpoint)console.log(`Mountpoint: ${n.mountpoint}`);let o=n.mountpoint?vt(n.mountpoint,".agent-fs","status"):null;if(o&&It(o))try{console.log(`Status: ${ZT(o,"utf-8").trim()}`)}catch{}}),t}function BT(){return new HT("umount").description("Unmount a previously-mounted agent-fs FUSE filesystem").argument("<path>","Directory the filesystem is mounted at").action(async(t)=>{await aw(t)})}async function xw(t,n){let o=t;if(process.platform!=="linux")console.error("FUSE mount is Linux-only.\nFor macOS dev: see `packages/fuse-helper/README.md` for the Docker harness."),process.exit(1);if(!It(o))console.error(`Mountpoint does not exist: ${o}`),process.exit(1);try{if(!zw(o).isDirectory())console.error(`Mountpoint is not a directory: ${o}`),process.exit(1)}catch(D){console.error(`Cannot stat mountpoint: ${D.message}`),process.exit(1)}try{if(bw(o).length>0)console.error(`Mountpoint is not empty: ${o}`),process.exit(1)}catch(D){console.error(`Cannot read mountpoint: ${D.message}`),process.exit(1)}let i=Xe();if(i.running)console.error(`A mount is already running (PID ${i.pid}`+(i.mountpoint?`, ${i.mountpoint}`:"")+")."),console.error("Run `agent-fs umount <path>` to tear it down first."),process.exit(1);let e=Boolean(n.remote||n.apiUrl||n.apiKey);if(e&&n.socket)console.error("Cannot combine --remote with --socket \u2014 they select different transports."),console.error("Drop --socket to use remote HTTP transport."),process.exit(1);let r="local",E,f,T;if(e){if(n.apiKey)console.error("Warning: --api-key on the command line is deprecated and leaks via shell history. Prefer the AGENT_FS_API_KEY env var or the `apiKey` field in ~/.agent-fs/config.json.");let D=MT({apiUrl:n.apiUrl,apiKey:n.apiKey},x(),{AGENT_FS_API_URL:process.env.AGENT_FS_API_URL,AGENT_FS_API_KEY:process.env.AGENT_FS_API_KEY});if(!D)console.error("--remote requires both an API URL and an API key. Set via --api-url + --api-key, env vars AGENT_FS_API_URL + AGENT_FS_API_KEY, or `apiUrl` + `apiKey` in ~/.agent-fs/config.json."),process.exit(1);r="remote",E=D.apiUrl,f=D.apiKey}else if(T=n.socket??cw(),!It(T))console.error(`Daemon socket not found at ${T}.`),console.error("Start the daemon first: agent-fs daemon start"),console.error("Or pass --remote to mount against a remote agent-fs HTTP API."),process.exit(1);let l;try{l=XT()}catch(D){console.error(D.message),process.exit(1)}let N=await CT(l.binPath,YT());if(N)console.error(`Refusing to spawn helper: ${N}`),process.exit(1);if(!It(YT()))console.error("Warning: no fuse-bin.manifest.json found \u2014 skipping hash verification.");let A;try{A=PT({mode:r,mountpoint:o,socket:T,apiUrl:E,apiKey:f,allowOther:n.allowOther,foreground:n.foreground,logFile:vT()})}catch(D){console.error(D.message),process.exit(1)}let w={...process.env,...A.env};if(n.foreground){let D=FT(l.binPath,A.argv,{stdio:"inherit",env:w});if(D.on("exit",(C)=>{QT(),process.exit(C??0)}),D.pid)GT(D.pid,o);return}let g=FT(l.binPath,A.argv,{detached:!0,stdio:"ignore",env:w});if(g.pid===void 0)console.error("Failed to spawn FUSE helper."),process.exit(1);GT(g.pid,o),g.unref();let O=r==="remote"?`remote: ${E}`:`socket: ${T}`;console.log(`Mount started (PID: ${g.pid}, ${l.source}, ${O})`),console.log(`Mountpoint: ${o}`),console.log(`Logs: ${vT()}`)}async function aw(t){if(process.platform!=="linux")console.error("FUSE umount is Linux-only."),process.exit(1);let n=Xe();if(n.running&&n.pid!==void 0)try{process.kill(n.pid,"SIGTERM"),console.log(`Sent SIGTERM to mount helper (PID: ${n.pid})`)}catch(o){console.error(`Failed to signal helper: ${o.message}`)}else console.log("No running mount PID recorded.");for(let o of["fusermount3","fusermount"])try{if(Bun.spawnSync({cmd:[o,"-u",t]}).exitCode===0){console.log(`Unmounted ${t} (via ${o})`);break}}catch{}QT()}import{Command as ty}from"commander";function VT(t,n,o){let i=new ty("download").description("Download raw file bytes to stdout or a local file").argument("<path>","agent-fs file path").option("-o, --output <file>","Write to a local file instead of stdout").action(async(e,r)=>{try{let E=await n(),f=await o(E),T=await t.getRaw(E,f,e);if(r.output){if(await Bun.write(r.output,T.bytes),i.parent?.opts().json)console.log(JSON.stringify({path:e,output:r.output,size:T.bytes.byteLength,contentType:T.contentType,version:T.version,contentHash:T.contentHash},null,2));else console.log(`wrote ${r.output} (${T.bytes.byteLength} bytes)`);return}process.stdout.write(Buffer.from(T.bytes))}catch(E){console.error(`Error: ${E.message}`),process.exit(1)}});return i}var J=new Jy;J.name("agent-fs").description("Agent-first filesystem backed by S3").version(q).option("--org <orgId>","Override org context").option("--drive <driveId>","Override drive context").option("--json","Output raw JSON");var gt=new Le;async function An(){let t=J.opts().org;if(t)return t;let n=P();if(n.defaultOrg)return n.defaultOrg;try{let o=await gt.getMe();if(o.defaultOrgId)return o.defaultOrgId}catch(o){if(o?.message?.includes("Cannot connect"))console.error(o.message),process.exit(1)}console.error("Error: No org context. Use --org or run 'agent-fs auth register'"),process.exit(1)}async function Dl(t){let n=J.opts().drive;if(n)return n;let o=P();if(o.defaultDrive)return o.defaultDrive;let i=t??await An(),e=await gt.getMe();if(e.defaultOrgId===i&&e.defaultDriveId)return e.defaultDriveId;let{drives:r}=await gt.get(`/orgs/${i}/drives`),E=r.find((f)=>f.isDefault)??r[0];if(!E)console.error("Error: No drive context. Use --drive or run 'agent-fs drive create'."),process.exit(1);return E.id}J.addCommand($T());lT(J,gt,An,Dl);J.addCommand(VT(gt,An,Dl));J.addCommand(RT(gt));J.addCommand(_T());J.addCommand(yT());J.addCommand(LT(gt,An));J.addCommand(gT(gt));J.addCommand(DT());J.addCommand(Co());J.addCommand(OT(gt,An));J.addCommand(UT(gt,An));J.addCommand(JT());J.addCommand(BT());J.command("mcp").description("Start MCP server (stdio)").action(async()=>{await KT().then(() => Ty)});J.command("server").description("Run server in foreground (dev mode)").action(async()=>{await gl().then(() => Qy)});var By=`
547
589
  Global Options:
548
590
  --org <orgId> Override org context
549
591
  --drive <driveId> Override drive context
550
592
  --json Output raw JSON
551
- `;for(let t of B.commands)t.addHelpText("after",Dw);B.parse();
593
+ `;for(let t of J.commands)t.addHelpText("after",By);J.parse();