@desplega.ai/agent-fs 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
- var ZT=Object.defineProperty;var $T=(t)=>t;function BT(t,n){this[t]=$T.bind(null,n)}var At=(t,n)=>{for(var o in n)ZT(t,o,{get:n[o],enumerable:!0,configurable:!0,set:BT.bind(n,o)})};var O=(t,n)=>()=>(t&&(n=t(t=0)),n);var An=import.meta.require;import{Database as MT}from"bun:sqlite";import{platform as JT}from"os";import{existsSync as YT}from"fs";function GT(){if(Yo)return;if(Yo=!0,JT()!=="darwin")return;let t=["/opt/homebrew/opt/sqlite/lib/libsqlite3.dylib","/usr/local/opt/sqlite3/lib/libsqlite3.dylib"];for(let n of t)if(YT(n)){try{MT.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 Yo=!1;var Go=O(()=>{GT()});import{mkdirSync as FT,readFileSync as CT,writeFileSync as ln,existsSync as Co}from"fs";import{join as Vt}from"path";function QT(){let t=process.env.AGENT_FS_HOME??Vt(process.env.HOME??"/tmp",".agent-fs");if(t.startsWith("~/"))return Vt(process.env.HOME??"/tmp",t.slice(2));return t}function m(){return QT()}function x(){return Vt(m(),"config.json")}function gt(){return Vt(m(),"agent-fs.db")}function PT(){let t=m();if(!Co(t))FT(t,{recursive:!0})}function HT(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 Fo(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.SERVER_PORT)t.server.port=parseInt(n.SERVER_PORT,10);if(n.SERVER_HOST)t.server.host=n.SERVER_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;return t}function Z(){PT();let t=x();if(!Co(t))return ln(t,JSON.stringify(Un,null,2)),Fo(structuredClone(Un));let n=CT(t,"utf-8"),o=JSON.parse(n);return Fo(HT(Un,o))}function Qo(t,n){let o=Z();o[t]=n,ln(x(),JSON.stringify(o,null,2))}function l(t,n){let o=Z(),i=t.split("."),u=o;for(let T=0;T<i.length-1;T++)u=u[i[T]];u[i[i.length-1]]=n,ln(x(),JSON.stringify(o,null,2))}var Un;var Zt=O(()=>{Un={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:60}},auth:{apiKey:""},minio:{containerId:"",managed:!0}}});var e={};At(e,{users:()=>$t,orgs:()=>Bt,orgMembers:()=>WT,files:()=>fT,fileVersions:()=>VT,events:()=>kT,drives:()=>qt,driveMembers:()=>KT,contentChunks:()=>jT,comments:()=>qT});import{sqliteTable as c,text as R,integer as X,primaryKey as Sn}from"drizzle-orm/sqlite-core";var $t,Bt,WT,qt,KT,fT,VT,qT,kT,jT;var Po=O(()=>{$t=c("users",{id:R("id").primaryKey(),email:R("email").notNull().unique(),apiKeyHash:R("api_key_hash").notNull(),createdAt:X("created_at",{mode:"timestamp"}).notNull()}),Bt=c("orgs",{id:R("id").primaryKey(),name:R("name").notNull(),isPersonal:X("is_personal",{mode:"boolean"}).notNull().default(!1),createdAt:X("created_at",{mode:"timestamp"}).notNull()}),WT=c("org_members",{orgId:R("org_id").notNull().references(()=>Bt.id),userId:R("user_id").notNull().references(()=>$t.id),role:R("role",{enum:["viewer","editor","admin"]}).notNull()},(t)=>({pk:Sn({columns:[t.orgId,t.userId]})})),qt=c("drives",{id:R("id").primaryKey(),orgId:R("org_id").notNull().references(()=>Bt.id),name:R("name").notNull(),isDefault:X("is_default",{mode:"boolean"}).notNull().default(!1),createdAt:X("created_at",{mode:"timestamp"}).notNull()}),KT=c("drive_members",{driveId:R("drive_id").notNull().references(()=>qt.id),userId:R("user_id").notNull().references(()=>$t.id),role:R("role",{enum:["viewer","editor","admin"]}).notNull()},(t)=>({pk:Sn({columns:[t.driveId,t.userId]})})),fT=c("files",{path:R("path").notNull(),driveId:R("drive_id").notNull().references(()=>qt.id),size:X("size").notNull(),contentType:R("content_type"),author:R("author").notNull(),currentVersionId:R("current_version_id"),createdAt:X("created_at",{mode:"timestamp"}).notNull(),modifiedAt:X("modified_at",{mode:"timestamp"}).notNull(),isDeleted:X("is_deleted",{mode:"boolean"}).notNull().default(!1),embeddingStatus:R("embedding_status",{enum:["pending","indexed","failed"]}).default("pending")},(t)=>({pk:Sn({columns:[t.path,t.driveId]})})),VT=c("file_versions",{id:X("id").primaryKey({autoIncrement:!0}),path:R("path").notNull(),driveId:R("drive_id").notNull(),version:X("version").notNull(),s3VersionId:R("s3_version_id").notNull(),author:R("author").notNull(),operation:R("operation",{enum:["write","edit","append","delete","revert"]}).notNull(),message:R("message"),diffSummary:R("diff_summary"),size:X("size"),etag:R("etag"),createdAt:X("created_at",{mode:"timestamp"}).notNull()}),qT=c("comments",{id:R("id").primaryKey(),parentId:R("parent_id"),orgId:R("org_id").notNull().references(()=>Bt.id),driveId:R("drive_id").notNull().references(()=>qt.id),path:R("path").notNull(),lineStart:X("line_start"),lineEnd:X("line_end"),quotedContent:R("quoted_content"),fileVersionId:X("file_version_id"),body:R("body").notNull(),author:R("author").notNull().references(()=>$t.id),resolved:X("resolved",{mode:"boolean"}).notNull().default(!1),resolvedBy:R("resolved_by"),resolvedAt:X("resolved_at",{mode:"timestamp"}),createdAt:X("created_at",{mode:"timestamp"}).notNull(),updatedAt:X("updated_at",{mode:"timestamp"}).notNull(),isDeleted:X("is_deleted",{mode:"boolean"}).notNull().default(!1)}),kT=c("events",{id:R("id").primaryKey(),orgId:R("org_id").notNull().references(()=>Bt.id),type:R("type").notNull(),resourceType:R("resource_type").notNull(),resourceId:R("resource_id").notNull(),actor:R("actor").notNull().references(()=>$t.id),target:R("target"),status:R("status",{enum:["created","ack","deleted"]}).notNull().default("created"),metadata:R("metadata"),createdAt:X("created_at",{mode:"timestamp"}).notNull()}),jT=c("content_chunks",{id:X("id").primaryKey({autoIncrement:!0}),filePath:R("file_path").notNull(),driveId:R("drive_id").notNull(),chunkIndex:X("chunk_index").notNull(),content:R("content").notNull(),charOffset:X("char_offset").notNull(),tokenCount:X("token_count").notNull()})});var Ho=`
3
+ var FE=Object.defineProperty;var PE=(t)=>t;function WE(t,n){this[t]=PE.bind(null,n)}var Ut=(t,n)=>{for(var o in n)FE(t,o,{get:n[o],enumerable:!0,configurable:!0,set:WE.bind(n,o)})};var D=(t,n)=>()=>(t&&(n=t(t=0)),n);var Sn=import.meta.require;import{Database as HE}from"bun:sqlite";import{platform as CE}from"os";import{existsSync as vE}from"fs";function gE(){if(Wo)return;if(Wo=!0,CE()!=="darwin")return;let t=["/opt/homebrew/opt/sqlite/lib/libsqlite3.dylib","/usr/local/opt/sqlite3/lib/libsqlite3.dylib"];for(let n of t)if(vE(n)){try{HE.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 Wo=!1;var Ho=D(()=>{gE()});import{mkdirSync as KE,readFileSync as eE,writeFileSync as Zn,existsSync as vo}from"fs";import{join as ft}from"path";function VE(){let t=process.env.AGENT_FS_HOME??ft(process.env.HOME??"/tmp",".agent-fs");if(t.startsWith("~/"))return ft(process.env.HOME??"/tmp",t.slice(2));return t}function m(){return VE()}function x(){return ft(m(),"config.json")}function It(){return ft(m(),"agent-fs.db")}function lE(){let t=m();if(!vo(t))KE(t,{recursive:!0})}function qE(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 Co(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.SERVER_PORT)t.server.port=parseInt(n.SERVER_PORT,10);if(n.SERVER_HOST)t.server.host=n.SERVER_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;return t}function B(){lE();let t=x();if(!vo(t))return Zn(t,JSON.stringify(Xn,null,2)),Co(structuredClone(Xn));let n=eE(t,"utf-8"),o=JSON.parse(n);return Co(qE(Xn,o))}function go(t,n){let o=B();o[t]=n,Zn(x(),JSON.stringify(o,null,2))}function S(t,n){let o=B(),i=t.split("."),T=o;for(let E=0;E<i.length-1;E++)T=T[i[E]];T[i[i.length-1]]=n,Zn(x(),JSON.stringify(o,null,2))}var Xn;var Gt=D(()=>{Xn={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:60}},auth:{apiKey:""},minio:{containerId:"",managed:!0}}});var u={};Ut(u,{users:()=>Qt,orgs:()=>Ft,orgMembers:()=>dE,files:()=>fE,fileVersions:()=>jE,events:()=>bE,drives:()=>jt,driveMembers:()=>kE,contentChunks:()=>pE,comments:()=>zE});import{sqliteTable as c,text as A,integer as Y,primaryKey as wn}from"drizzle-orm/sqlite-core";var Qt,Ft,dE,jt,kE,fE,jE,zE,bE,pE;var Ko=D(()=>{Qt=c("users",{id:A("id").primaryKey(),email:A("email").notNull().unique(),apiKeyHash:A("api_key_hash").notNull(),createdAt:Y("created_at",{mode:"timestamp"}).notNull()}),Ft=c("orgs",{id:A("id").primaryKey(),name:A("name").notNull(),isPersonal:Y("is_personal",{mode:"boolean"}).notNull().default(!1),createdAt:Y("created_at",{mode:"timestamp"}).notNull()}),dE=c("org_members",{orgId:A("org_id").notNull().references(()=>Ft.id),userId:A("user_id").notNull().references(()=>Qt.id),role:A("role",{enum:["viewer","editor","admin"]}).notNull()},(t)=>({pk:wn({columns:[t.orgId,t.userId]})})),jt=c("drives",{id:A("id").primaryKey(),orgId:A("org_id").notNull().references(()=>Ft.id),name:A("name").notNull(),isDefault:Y("is_default",{mode:"boolean"}).notNull().default(!1),createdAt:Y("created_at",{mode:"timestamp"}).notNull()}),kE=c("drive_members",{driveId:A("drive_id").notNull().references(()=>jt.id),userId:A("user_id").notNull().references(()=>Qt.id),role:A("role",{enum:["viewer","editor","admin"]}).notNull()},(t)=>({pk:wn({columns:[t.driveId,t.userId]})})),fE=c("files",{path:A("path").notNull(),driveId:A("drive_id").notNull().references(()=>jt.id),size:Y("size").notNull(),contentType:A("content_type"),author:A("author").notNull(),currentVersionId:A("current_version_id"),createdAt:Y("created_at",{mode:"timestamp"}).notNull(),modifiedAt:Y("modified_at",{mode:"timestamp"}).notNull(),isDeleted:Y("is_deleted",{mode:"boolean"}).notNull().default(!1),embeddingStatus:A("embedding_status",{enum:["pending","indexed","failed"]}).default("pending")},(t)=>({pk:wn({columns:[t.path,t.driveId]})})),jE=c("file_versions",{id:Y("id").primaryKey({autoIncrement:!0}),path:A("path").notNull(),driveId:A("drive_id").notNull(),version:Y("version").notNull(),s3VersionId:A("s3_version_id").notNull(),author:A("author").notNull(),operation:A("operation",{enum:["write","edit","append","delete","revert"]}).notNull(),message:A("message"),diffSummary:A("diff_summary"),size:Y("size"),etag:A("etag"),createdAt:Y("created_at",{mode:"timestamp"}).notNull()}),zE=c("comments",{id:A("id").primaryKey(),parentId:A("parent_id"),orgId:A("org_id").notNull().references(()=>Ft.id),driveId:A("drive_id").notNull().references(()=>jt.id),path:A("path").notNull(),lineStart:Y("line_start"),lineEnd:Y("line_end"),quotedContent:A("quoted_content"),fileVersionId:Y("file_version_id"),body:A("body").notNull(),author:A("author").notNull().references(()=>Qt.id),resolved:Y("resolved",{mode:"boolean"}).notNull().default(!1),resolvedBy:A("resolved_by"),resolvedAt:Y("resolved_at",{mode:"timestamp"}),createdAt:Y("created_at",{mode:"timestamp"}).notNull(),updatedAt:Y("updated_at",{mode:"timestamp"}).notNull(),isDeleted:Y("is_deleted",{mode:"boolean"}).notNull().default(!1)}),bE=c("events",{id:A("id").primaryKey(),orgId:A("org_id").notNull().references(()=>Ft.id),type:A("type").notNull(),resourceType:A("resource_type").notNull(),resourceId:A("resource_id").notNull(),actor:A("actor").notNull().references(()=>Qt.id),target:A("target"),status:A("status",{enum:["created","ack","deleted"]}).notNull().default("created"),metadata:A("metadata"),createdAt:Y("created_at",{mode:"timestamp"}).notNull()}),pE=c("content_chunks",{id:Y("id").primaryKey({autoIncrement:!0}),filePath:A("file_path").notNull(),driveId:A("drive_id").notNull(),chunkIndex:Y("chunk_index").notNull(),content:A("content").notNull(),charOffset:Y("char_offset").notNull(),tokenCount:Y("token_count").notNull()})});var eo=`
5
5
  CREATE TABLE IF NOT EXISTS users (
6
6
  id TEXT PRIMARY KEY,
7
7
  email TEXT NOT NULL UNIQUE,
@@ -116,7 +116,7 @@ CREATE TABLE IF NOT EXISTS content_chunks (
116
116
  char_offset INTEGER NOT NULL,
117
117
  token_count INTEGER NOT NULL
118
118
  );
119
- `,Wo=`
119
+ `,Vo=`
120
120
  -- FTS5 full-text index (internal content storage)
121
121
  CREATE VIRTUAL TABLE IF NOT EXISTS files_fts USING fts5(
122
122
  path, content, drive_id UNINDEXED
@@ -127,78 +127,79 @@ CREATE VIRTUAL TABLE IF NOT EXISTS chunk_vectors USING vec0(
127
127
  chunk_id INTEGER PRIMARY KEY,
128
128
  embedding float[768]
129
129
  );
130
- `;import{Database as pT}from"bun:sqlite";import{drizzle as bT}from"drizzle-orm/bun-sqlite";import*as Ko from"sqlite-vec";import{existsSync as hT,mkdirSync as zT}from"fs";import{dirname as mT}from"path";function xT(t){Ko.load(t)}function a(t){let n=t??gt(),o=mT(n);if(!hT(o))zT(o,{recursive:!0});let i=new pT(n);return xT(i),i.exec("PRAGMA journal_mode=WAL;"),i.exec("PRAGMA foreign_keys=ON;"),i.exec(Ho),i.exec(Wo),bT(i,{schema:e})}var B=O(()=>{Go();Zt();Po()});import{S3Client as cT,PutObjectCommand as aT,GetObjectCommand as sT,DeleteObjectCommand as te,CopyObjectCommand as ne,ListObjectsV2Command as oe,HeadObjectCommand as ie,ListObjectVersionsCommand as ue,GetBucketVersioningCommand as Te,PutBucketVersioningCommand as ee}from"@aws-sdk/client-s3";class et{client;bucket;versioningEnabled=!1;constructor(t){this.bucket=t.bucket,this.client=new cT({region:t.region,endpoint:t.endpoint,credentials:{accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey},forcePathStyle:!0}),this.versioningEnabled=t.versioningEnabled??!1}async putObject(t,n,o){let i=await this.client.send(new aT({Bucket:this.bucket,Key:t,Body:typeof n==="string"?Buffer.from(n):n,Metadata:o}));return{etag:i.ETag,versionId:i.VersionId}}async getObject(t,n){let o=await this.client.send(new sT({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 te({Bucket:this.bucket,Key:t}))}async copyObject(t,n){let o=await this.client.send(new ne({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 oe({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 ie({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 ue({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 Te({Bucket:this.bucket}))).Status==="Enabled"}catch{return!1}}async enableVersioning(){try{return await this.client.send(new ee({Bucket:this.bucket,VersioningConfiguration:{Status:"Enabled"}})),this.versioningEnabled=!0,!0}catch{return!1}}}var fo=()=>{};var Vo=O(()=>{fo()});var s,d,k,tt,Mt,j;var f=O(()=>{s=class s 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}}}};d=class d extends s{path;constructor(t,n){super("NOT_FOUND",t,n?.suggestion);this.path=n?.path}toJSON(){return{...super.toJSON(),...this.path&&{path:this.path}}}};k=class k extends s{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}}}};tt=class tt extends s{path;constructor(t,n){super("EDIT_CONFLICT",t,n?.suggestion);this.path=n?.path}toJSON(){return{...super.toJSON(),...this.path&&{path:this.path}}}};Mt=class Mt extends s{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}}}};j=class j extends s{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 qo,and as Ee}from"drizzle-orm";function Jt(t){return Ne[t]??"admin"}function nt(t,n,o){return t.select().from(e.driveMembers).where(Ee(qo(e.driveMembers.driveId,o),qo(e.driveMembers.userId,n))).get()?.role??null}function Yt(t,n){let o=nt(t,n.userId,n.driveId);if(!o)throw new k("You do not have access to this drive",{requiredRole:n.requiredRole,yourRole:"none",suggestion:"Request access from the drive admin"});if(ko[o]<ko[n.requiredRole])throw new k(`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 ko,Ne;var kt=O(()=>{B();f();ko={viewer:0,editor:1,admin:2},Ne={ls:"viewer",cat:"viewer",tail:"viewer",stat:"viewer",grep:"viewer",fts:"viewer",search:"viewer",log:"viewer",diff:"viewer",recent:"viewer",tree:"viewer",glob:"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 Et(t){let n=t;if(!n.startsWith("/"))n="/"+n;if(!n.endsWith("/"))n+="/";return n}function jo(t){return t.startsWith("/")?t.slice(1):t}import{eq as Ut,and as rn,sql as ye}from"drizzle-orm";function S(t,n,o){let i=jo(o);return`${t}/drives/${n}/${i}`}async function Xn(t,n){return(t.db.select({maxVersion:ye`MAX(version)`}).from(e.fileVersions).where(rn(Ut(e.fileVersions.path,n),Ut(e.fileVersions.driveId,t.driveId))).get()?.maxVersion??0)+1}async function Q(t,n){let o=await Xn(t,n.path),i=new Date;t.db.insert(e.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,createdAt:i}).run();let u=t.db.select().from(e.files).where(rn(Ut(e.files.path,n.path),Ut(e.files.driveId,t.driveId))).get();if(u)t.db.update(e.files).set({size:n.size??u.size,author:t.userId,currentVersionId:String(o),modifiedAt:i,isDeleted:n.operation==="delete"}).where(rn(Ut(e.files.path,n.path),Ut(e.files.driveId,t.driveId))).run();else t.db.insert(e.files).values({path:n.path,driveId:t.driveId,size:n.size??0,author:t.userId,currentVersionId:String(o),createdAt:i,modifiedAt:i,isDeleted:n.operation==="delete"}).run();return o}var Y=O(()=>{B()});function wn(t){return t.$client}function Nt(t,n){let o=wn(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 po(t,n){wn(t).prepare("DELETE FROM files_fts WHERE path = ? AND drive_id = ?").run(n.path,n.driveId)}function bo(t,n){let o=wn(t),i,u;if(n.pathPrefix)i=`
130
+ `;import{Database as hE}from"bun:sqlite";import{drizzle as rE}from"drizzle-orm/bun-sqlite";import*as lo from"sqlite-vec";import{existsSync as mE,mkdirSync as xE}from"fs";import{dirname as cE}from"path";function aE(t){lo.load(t)}function it(t){let n=t??It(),o=cE(n);if(!mE(o))xE(o,{recursive:!0});let i=new hE(n);return aE(i),i.exec("PRAGMA journal_mode=WAL;"),i.exec("PRAGMA foreign_keys=ON;"),i.exec(eo),i.exec(Vo),rE(i,{schema:u})}var P=D(()=>{Ho();Gt();Ko()});import{S3Client as sE,PutObjectCommand as tu,GetObjectCommand as nu,DeleteObjectCommand as ou,CopyObjectCommand as iu,ListObjectsV2Command as Tu,HeadObjectCommand as Eu,ListObjectVersionsCommand as uu,GetBucketVersioningCommand as Nu,PutBucketVersioningCommand as yu}from"@aws-sdk/client-s3";class Tt{client;bucket;versioningEnabled=!1;constructor(t){this.bucket=t.bucket,this.client=new sE({region:t.region,endpoint:t.endpoint,credentials:{accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey},forcePathStyle:!0}),this.versioningEnabled=t.versioningEnabled??!1}async putObject(t,n,o){let i=await this.client.send(new tu({Bucket:this.bucket,Key:t,Body:typeof n==="string"?Buffer.from(n):n,Metadata:o}));return{etag:i.ETag,versionId:i.VersionId}}async getObject(t,n){let o=await this.client.send(new nu({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 ou({Bucket:this.bucket,Key:t}))}async copyObject(t,n){let o=await this.client.send(new iu({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 Tu({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 Eu({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 uu({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 Nu({Bucket:this.bucket}))).Status==="Enabled"}catch{return!1}}async enableVersioning(){try{return await this.client.send(new yu({Bucket:this.bucket,VersioningConfiguration:{Status:"Enabled"}})),this.versioningEnabled=!0,!0}catch{return!1}}}var qo=()=>{};var ko=D(()=>{qo()});var a,G,j,s,Pt,z;var d=D(()=>{a=class a 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}}}};G=class G extends a{path;constructor(t,n){super("NOT_FOUND",t,n?.suggestion);this.path=n?.path}toJSON(){return{...super.toJSON(),...this.path&&{path:this.path}}}};j=class j extends a{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}}}};s=class s extends a{path;constructor(t,n){super("EDIT_CONFLICT",t,n?.suggestion);this.path=n?.path}toJSON(){return{...super.toJSON(),...this.path&&{path:this.path}}}};Pt=class Pt extends a{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}}}};z=class z extends a{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 fo,and as Lu}from"drizzle-orm";function Wt(t){return Ru[t]??"admin"}function tt(t,n,o){return t.select().from(u.driveMembers).where(Lu(fo(u.driveMembers.driveId,o),fo(u.driveMembers.userId,n))).get()?.role??null}function Ht(t,n){let o=tt(t,n.userId,n.driveId);if(!o)throw new j("You do not have access to this drive",{requiredRole:n.requiredRole,yourRole:"none",suggestion:"Request access from the drive admin"});if(jo[o]<jo[n.requiredRole])throw new j(`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 jo,Ru;var zt=D(()=>{P();d();jo={viewer:0,editor:1,admin:2},Ru={ls:"viewer",cat:"viewer",tail:"viewer",stat:"viewer",grep:"viewer",fts:"viewer",search:"viewer",log:"viewer",diff:"viewer",recent:"viewer",tree:"viewer",glob:"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 Et(t){let n=t;if(!n.startsWith("/"))n="/"+n;if(!n.endsWith("/"))n+="/";return n}function zo(t){return t.startsWith("/")?t.slice(1):t}import{eq as St,and as $n,sql as Iu}from"drizzle-orm";function $(t,n,o){let i=zo(o);return`${t}/drives/${n}/${i}`}async function Bn(t,n){return(t.db.select({maxVersion:Iu`MAX(version)`}).from(u.fileVersions).where($n(St(u.fileVersions.path,n),St(u.fileVersions.driveId,t.driveId))).get()?.maxVersion??0)+1}async function K(t,n){let o=await Bn(t,n.path),i=new Date;t.db.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,createdAt:i}).run();let T=t.db.select().from(u.files).where($n(St(u.files.path,n.path),St(u.files.driveId,t.driveId))).get();if(T)t.db.update(u.files).set({size:n.size??T.size,author:t.userId,currentVersionId:String(o),modifiedAt:i,isDeleted:n.operation==="delete"}).where($n(St(u.files.path,n.path),St(u.files.driveId,t.driveId))).run();else t.db.insert(u.files).values({path:n.path,driveId:t.driveId,size:n.size??0,author:t.userId,currentVersionId:String(o),createdAt:i,modifiedAt:i,isDeleted:n.operation==="delete"}).run();return o}var C=D(()=>{P()});function Mn(t){return t.$client}function ut(t,n){let o=Mn(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 bo(t,n){Mn(t).prepare("DELETE FROM files_fts WHERE path = ? AND drive_id = ?").run(n.path,n.driveId)}function po(t,n){let o=Mn(t),i,T;if(n.pathPrefix)i=`
131
131
  SELECT path, snippet(files_fts, 1, '<b>', '</b>', '...', 32) as snippet, rank
132
132
  FROM files_fts
133
133
  WHERE content MATCH ? AND drive_id = ? AND path LIKE ?
134
134
  ORDER BY rank
135
135
  LIMIT 50
136
- `,u=[n.pattern,n.driveId,n.pathPrefix+"%"];else i=`
136
+ `,T=[n.pattern,n.driveId,n.pathPrefix+"%"];else i=`
137
137
  SELECT path, snippet(files_fts, 1, '<b>', '</b>', '...', 32) as snippet, rank
138
138
  FROM files_fts
139
139
  WHERE content MATCH ? AND drive_id = ?
140
140
  ORDER BY rank
141
141
  LIMIT 50
142
- `,u=[n.pattern,n.driveId];return o.prepare(i).all(...u)}async function ho(t){try{let{RecursiveChunker:n}=await import("chonkie");return(await(await n.create({chunkSize:900})).chunk(t)).map((u)=>({content:u.text,charOffset:u.startIndex??0,tokenCount:u.tokenCount??Math.ceil(u.text.length/4)}))}catch{return Ie(t)}}function Ie(t){let i=[];if(t.length<=3600)return[{content:t,charOffset:0,tokenCount:Math.ceil(t.length/4)}];let u=0;while(u<t.length){let T=Math.min(u+3600,t.length),E=t.slice(u,T);if(T<t.length){let y=E.lastIndexOf(`
143
-
144
- `);if(y>1800)E=E.slice(0,y)}if(i.push({content:E,charOffset:u,tokenCount:Math.ceil(E.length/4)}),u+=E.length-512,u<=i[i.length-1].charOffset)u=i[i.length-1].charOffset+E.length}return i}import{eq as yt,and as jt}from"drizzle-orm";function Oe(t){return t.$client}class zo{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 dn(t,n,o){let i=Oe(t);try{let u=await ho(o.content),T=t.select({id:e.contentChunks.id}).from(e.contentChunks).where(jt(yt(e.contentChunks.filePath,o.path),yt(e.contentChunks.driveId,o.driveId))).all();for(let g of T)i.prepare("DELETE FROM chunk_vectors WHERE chunk_id = ?").run(g.id);t.delete(e.contentChunks).where(jt(yt(e.contentChunks.filePath,o.path),yt(e.contentChunks.driveId,o.driveId))).run();let E=[];for(let g=0;g<u.length;g++){let D=t.insert(e.contentChunks).values({filePath:o.path,driveId:o.driveId,chunkIndex:g,content:u[g].content,charOffset:u[g].charOffset,tokenCount:u[g].tokenCount}).returning({id:e.contentChunks.id}).get();E.push(D.id)}let y=u.map((g)=>g.content),N=await n.embedBatch(y),I=i.prepare("INSERT INTO chunk_vectors(chunk_id, embedding) VALUES (?, ?)");for(let g=0;g<E.length;g++){let D=new Float32Array(N[g]);I.run(E[g],D)}t.update(e.files).set({embeddingStatus:"indexed"}).where(jt(yt(e.files.path,o.path),yt(e.files.driveId,o.driveId))).run()}catch(u){throw t.update(e.files).set({embeddingStatus:"failed"}).where(jt(yt(e.files.path,o.path),yt(e.files.driveId,o.driveId))).run(),u}}function lt(t,n,o){if(!n)return;Le.acquire().then(async(i)=>{try{await dn(t,n,o)}catch(u){console.error("Embedding failed",{path:o.path,error:u})}finally{i()}})}var Le;var Gt=O(()=>{B();Le=new zo(2)});async function mo(t,n){let o=S(t.orgId,t.driveId,n.path),i=n.content,u=Buffer.byteLength(i);if(u>ge)throw new j(`File size ${(u/1024/1024).toFixed(1)}MB exceeds the 10MB limit`,{field:"content",suggestion:"Split large files into smaller chunks"});if(n.expectedVersion!==void 0){let N=await Xn(t,n.path)-1;if(N!==n.expectedVersion)throw new tt(`Expected version ${n.expectedVersion} but file is at version ${N}`,{path:n.path,suggestion:"Re-read the file to get the current version and retry"})}let T=await t.s3.putObject(o,i),E=await Q(t,{path:n.path,s3VersionId:T.versionId??"",operation:"write",message:n.message,size:u,etag:T.etag});return Nt(t.db,{path:n.path,driveId:t.driveId,content:i}),lt(t.db,t.embeddingProvider??null,{path:n.path,driveId:t.driveId,content:i}),{version:E,path:n.path,size:u}}var ge=10485760;var xo=O(()=>{Y();Y();Gt();f()});async function co(t,n){let o=S(t.orgId,t.driveId,n.path),i;try{i=(await t.s3.getObject(o)).body}catch(D){if(D?.name==="NoSuchKey"||D?.$metadata?.httpStatusCode===404)throw new d(`File not found: ${n.path}`,{path:n.path});throw D}let T=new TextDecoder().decode(i).split(`
145
- `),E=T.length,y=n.offset??0,N=n.limit??De,I=T.slice(y,y+N),g=y+N<E;return{content:I.join(`
146
- `),totalLines:E,truncated:g}}var De=200;var ao=O(()=>{Y();f()});async function so(t,n){let o=S(t.orgId,t.driveId,n.path),i;try{i=(await t.s3.getObject(o)).body}catch(D){if(D?.name==="NoSuchKey"||D?.$metadata?.httpStatusCode===404)throw new d(`File not found: ${n.path}`,{path:n.path});throw D}let u=new TextDecoder().decode(i),T=u.split(n.old_string).length-1;if(T===0)throw new tt(`old_string not found in ${n.path}`,{path:n.path,suggestion:"Verify the exact text you want to replace"});if(T>1)throw new tt(`old_string found ${T} times in ${n.path}, expected exactly 1`,{path:n.path,suggestion:"Provide more surrounding context to make the match unique"});let E=u.replace(n.old_string,n.new_string),y=Buffer.byteLength(E),N=await t.s3.putObject(o,E),I=JSON.stringify({old:n.old_string,new:n.new_string}),g=await Q(t,{path:n.path,s3VersionId:N.versionId??"",operation:"edit",message:n.message,diffSummary:I,size:y,etag:N.etag});return Nt(t.db,{path:n.path,driveId:t.driveId,content:E}),lt(t.db,t.embeddingProvider??null,{path:n.path,driveId:t.driveId,content:E}),{version:g,path:n.path,changes:1}}var ti=O(()=>{Y();f();Gt()});async function ni(t,n){let o=S(t.orgId,t.driveId,n.path),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 d(`File not found: ${n.path}`,{path:n.path});throw N}let u=i+n.content,T=Buffer.byteLength(u),E=await t.s3.putObject(o,u),y=await Q(t,{path:n.path,s3VersionId:E.versionId??"",operation:"append",message:n.message,size:T,etag:E.etag});return Nt(t.db,{path:n.path,driveId:t.driveId,content:u}),lt(t.db,t.embeddingProvider??null,{path:n.path,driveId:t.driveId,content:u}),{version:y,size:T}}var oi=O(()=>{Y();f();Gt()});import{eq as ii,and as Re,like as _e}from"drizzle-orm";async function ui(t,n){let o=Et(n.path??"/"),i=S(t.orgId,t.driveId,o),{objects:u,prefixes:T}=await t.s3.listObjects(i,{delimiter:"/"}),E=t.db.select().from(e.files).where(Re(ii(e.files.driveId,t.driveId),_e(e.files.path,o+"%"),ii(e.files.isDeleted,!1))).all(),y=new Map(E.map((I)=>[I.path,I])),N=[];for(let I of T){let g=I.slice(i.length).replace(/\/$/,"");if(g)N.push({name:g,type:"directory",size:0})}for(let I of u){let g=I.key.slice(i.length);if(!g)continue;let D=g.endsWith("/"),$=D?g.slice(0,-1):g;if(D)N.push({name:$,type:"directory",size:0});else{let C=o+$,K=y.get(C);N.push({name:$,type:"file",size:K?.size??I.size,author:K?.author,modifiedAt:K?.modifiedAt??I.lastModified})}}return{entries:N}}var Ti=O(()=>{B();Y()});import{eq as ei,and as Ae}from"drizzle-orm";async function Ei(t,n){let o=S(t.orgId,t.driveId,n.path),i;try{i=await t.s3.headObject(o)}catch(T){if(T?.name==="NotFound"||T?.$metadata?.httpStatusCode===404)throw new d(`File not found: ${n.path}`,{path:n.path});throw T}let u=t.db.select().from(e.files).where(Ae(ei(e.files.path,n.path),ei(e.files.driveId,t.driveId))).get();return{path:n.path,size:i.size,contentType:i.contentType,author:u?.author??"unknown",currentVersion:u?.currentVersionId?parseInt(u.currentVersionId):void 0,createdAt:u?.createdAt??new Date,modifiedAt:u?.modifiedAt??i.lastModified??new Date,isDeleted:u?.isDeleted??!1,embeddingStatus:u?.embeddingStatus??void 0}}var Ni=O(()=>{B();Y();f()});import{eq as St,and as vn}from"drizzle-orm";async function yi(t,n){let o=S(t.orgId,t.driveId,n.path);await t.s3.deleteObject(o),await Q(t,{path:n.path,s3VersionId:"",operation:"delete"}),po(t.db,{path:n.path,driveId:t.driveId});let i=t.db.select({id:e.contentChunks.id}).from(e.contentChunks).where(vn(St(e.contentChunks.filePath,n.path),St(e.contentChunks.driveId,t.driveId))).all();if(i.length>0){let u=t.db.$client;for(let T of i)u.prepare("DELETE FROM chunk_vectors WHERE chunk_id = ?").run(T.id);t.db.delete(e.contentChunks).where(vn(St(e.contentChunks.filePath,n.path),St(e.contentChunks.driveId,t.driveId))).run()}return t.db.update(e.comments).set({isDeleted:!0,updatedAt:new Date}).where(vn(St(e.comments.path,n.path),St(e.comments.driveId,t.driveId))).run(),{path:n.path,deleted:!0}}var Ii=O(()=>{B();Y()});async function Oi(t,n){let o=S(t.orgId,t.driveId,n.from),i=S(t.orgId,t.driveId,n.to),u=await t.s3.copyObject(o,i),T=await t.s3.headObject(i),E=await Q(t,{path:n.to,s3VersionId:u.versionId??"",operation:"write",message:n.message??`Moved from ${n.from}`,size:T.size,etag:u.etag});return await t.s3.deleteObject(o),await Q(t,{path:n.from,s3VersionId:"",operation:"delete",message:`Moved to ${n.to}`}),{from:n.from,to:n.to,version:E}}var Li=O(()=>{Y()});async function gi(t,n){let o=S(t.orgId,t.driveId,n.from),i=S(t.orgId,t.driveId,n.to),u=await t.s3.copyObject(o,i),T=await t.s3.headObject(i),E=await Q(t,{path:n.to,s3VersionId:u.versionId??"",operation:"write",message:`Copied from ${n.from}`,size:T.size,etag:u.etag});return{from:n.from,to:n.to,version:E}}var Di=O(()=>{Y()});async function Ri(t,n){let o=S(t.orgId,t.driveId,n.path),i=n.lines??Ue,u;try{u=(await t.s3.getObject(o)).body}catch(D){if(D?.name==="NoSuchKey"||D?.$metadata?.httpStatusCode===404)throw new d(`File not found: ${n.path}`,{path:n.path});throw D}let E=new TextDecoder().decode(u).split(`
147
- `),y=E.length,N=Math.max(0,y-i),I=E.slice(N),g=N>0;return{content:I.join(`
148
- `),totalLines:y,truncated:g}}var Ue=20;var _i=O(()=>{Y();f()});import{eq as Ai,and as le,desc as Se}from"drizzle-orm";async function Ui(t,n){let o=n.limit??50;return{versions:t.db.select().from(e.fileVersions).where(le(Ai(e.fileVersions.path,n.path),Ai(e.fileVersions.driveId,t.driveId))).orderBy(Se(e.fileVersions.version)).limit(o).all().map((u)=>({version:u.version,author:u.author,createdAt:u.createdAt,operation:u.operation,message:u.message??void 0,diffSummary:u.diffSummary??void 0,size:u.size??void 0}))}}var li=O(()=>{B()});import{eq as rt,and as Si}from"drizzle-orm";import{structuredPatch as re}from"diff";async function ri(t,n){let o=t.db.select().from(e.fileVersions).where(Si(rt(e.fileVersions.path,n.path),rt(e.fileVersions.driveId,t.driveId),rt(e.fileVersions.version,n.v1))).get(),i=t.db.select().from(e.fileVersions).where(Si(rt(e.fileVersions.path,n.path),rt(e.fileVersions.driveId,t.driveId),rt(e.fileVersions.version,n.v2))).get();if(!o||!i)throw new d(`Version ${!o?n.v1:n.v2} not found for ${n.path}`,{path:n.path});if(o.s3VersionId&&i.s3VersionId){let T=S(t.orgId,t.driveId,n.path);try{let[E,y]=await Promise.all([t.s3.getObject(T,o.s3VersionId),t.s3.getObject(T,i.s3VersionId)]),N=new TextDecoder().decode(E.body),I=new TextDecoder().decode(y.body),g=re(n.path,n.path,N,I),D=[];for(let $ of g.hunks)for(let C of $.lines){let K=C.startsWith("+")?"add":C.startsWith("-")?"remove":"context";D.push({type:K,content:C.slice(1)})}return{changes:D}}catch{}}let u=[];if(i.diffSummary)try{let T=JSON.parse(i.diffSummary);if(T.old)u.push({type:"remove",content:T.old});if(T.new)u.push({type:"add",content:T.new})}catch{u.push({type:"context",content:i.diffSummary})}return{changes:u}}var Xi=O(()=>{B();Y();f()});import{eq as Zn,and as Xe}from"drizzle-orm";async function wi(t,n){let o=t.db.select().from(e.fileVersions).where(Xe(Zn(e.fileVersions.path,n.path),Zn(e.fileVersions.driveId,t.driveId),Zn(e.fileVersions.version,n.version))).get();if(!o)throw new d(`Version ${n.version} not found for ${n.path}`,{path:n.path});if(!o.s3VersionId)throw new s("VERSIONING_REQUIRED","S3 versioning required for revert","Enable S3 versioning on the bucket");let i=S(t.orgId,t.driveId,n.path),u=await t.s3.getObject(i,o.s3VersionId),T=await t.s3.putObject(i,u.body),E=u.body.length;return{version:await Q(t,{path:n.path,s3VersionId:T.versionId??"",operation:"revert",message:`Reverted to version ${n.version}`,size:E,etag:T.etag}),revertedTo:n.version}}var di=O(()=>{B();Y();f()});import{eq as $n,and as vi,desc as we,gte as de,like as ve}from"drizzle-orm";async function Zi(t,n){let o=n.limit??50,i=t.db.select().from(e.fileVersions).where($n(e.fileVersions.driveId,t.driveId)).$dynamic();if(n.path)i=i.where(vi($n(e.fileVersions.driveId,t.driveId),ve(e.fileVersions.path,n.path+"%")));if(n.since)i=i.where(vi($n(e.fileVersions.driveId,t.driveId),de(e.fileVersions.createdAt,n.since)));return{entries:i.orderBy(we(e.fileVersions.createdAt)).limit(o).all().map((T)=>({path:T.path,version:T.version,author:T.author,createdAt:T.createdAt,operation:T.operation,message:T.message??void 0,diffSummary:T.diffSummary??void 0,size:T.size??void 0}))}}var $i=O(()=>{B()});async function Bi(t,n){let o=new RegExp(n.pattern),i=Et(n.path),T=t.db.$client.prepare("SELECT path, content FROM files_fts WHERE drive_id = ? AND path LIKE ?").all(t.driveId,i+"%"),E=[];for(let y of T){let N=y.content.split(`
149
- `);for(let I=0;I<N.length;I++)if(o.test(N[I]))E.push({path:y.path,lineNumber:I+1,content:N[I]})}return{matches:E}}var Mi=()=>{};async function Ji(t,n){let i=bo(t.db,{pattern:n.pattern,driveId:t.driveId,pathPrefix:n.path}).map((u)=>({path:u.path,snippet:u.snippet,rank:u.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 Yi=()=>{};import{eq as Bn,and as Ze}from"drizzle-orm";async function Gi(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,u=await o.embed(n.query),T=new Float32Array(u),y=t.db.$client.prepare(`SELECT chunk_id, distance
142
+ `,T=[n.pattern,n.driveId];return o.prepare(i).all(...T)}async function ho(t){try{let{RecursiveChunker:n}=await import("chonkie");return(await(await n.create({chunkSize:900})).chunk(t)).map((T)=>({content:T.text,charOffset:T.startIndex??0,tokenCount:T.tokenCount??Math.ceil(T.text.length/4)}))}catch{return Du(t)}}function Du(t){let i=[];if(t.length<=3600)return[{content:t,charOffset:0,tokenCount:Math.ceil(t.length/4)}];let T=0;while(T<t.length){let E=Math.min(T+3600,t.length),N=t.slice(T,E);if(E<t.length){let L=N.lastIndexOf(`
143
+
144
+ `);if(L>1800)N=N.slice(0,L)}if(i.push({content:N,charOffset:T,tokenCount:Math.ceil(N.length/4)}),T+=N.length-512,T<=i[i.length-1].charOffset)T=i[i.length-1].charOffset+N.length}return i}import{eq as Nt,and as bt}from"drizzle-orm";function Ou(t){return t.$client}class ro{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 Yn(t,n,o){let i=Ou(t);try{let T=await ho(o.content),E=t.select({id:u.contentChunks.id}).from(u.contentChunks).where(bt(Nt(u.contentChunks.filePath,o.path),Nt(u.contentChunks.driveId,o.driveId))).all();for(let I of E)i.prepare("DELETE FROM chunk_vectors WHERE chunk_id = ?").run(I.id);t.delete(u.contentChunks).where(bt(Nt(u.contentChunks.filePath,o.path),Nt(u.contentChunks.driveId,o.driveId))).run();let N=[];for(let I=0;I<T.length;I++){let _=t.insert(u.contentChunks).values({filePath:o.path,driveId:o.driveId,chunkIndex:I,content:T[I].content,charOffset:T[I].charOffset,tokenCount:T[I].tokenCount}).returning({id:u.contentChunks.id}).get();N.push(_.id)}let L=T.map((I)=>I.content),y=await n.embedBatch(L),R=i.prepare("INSERT INTO chunk_vectors(chunk_id, embedding) VALUES (?, ?)");for(let I=0;I<N.length;I++){let _=new Float32Array(y[I]);R.run(N[I],_)}t.update(u.files).set({embeddingStatus:"indexed"}).where(bt(Nt(u.files.path,o.path),Nt(u.files.driveId,o.driveId))).run()}catch(T){throw t.update(u.files).set({embeddingStatus:"failed"}).where(bt(Nt(u.files.path,o.path),Nt(u.files.driveId,o.driveId))).run(),T}}function Xt(t,n,o){if(!n)return;_u.acquire().then(async(i)=>{try{await Yn(t,n,o)}catch(T){console.error("Embedding failed",{path:o.path,error:T})}finally{i()}})}var _u;var Ct=D(()=>{P();_u=new ro(2)});async function mo(t,n){let o=$(t.orgId,t.driveId,n.path),i=n.content,T=Buffer.byteLength(i);if(T>Au)throw new z(`File size ${(T/1024/1024).toFixed(1)}MB exceeds the 10MB limit`,{field:"content",suggestion:"Split large files into smaller chunks"});if(n.expectedVersion!==void 0){let y=await Bn(t,n.path)-1;if(y!==n.expectedVersion)throw new s(`Expected version ${n.expectedVersion} but file is at version ${y}`,{path:n.path,suggestion:"Re-read the file to get the current version and retry"})}let E=await t.s3.putObject(o,i),N=await K(t,{path:n.path,s3VersionId:E.versionId??"",operation:"write",message:n.message,size:T,etag:E.etag});return ut(t.db,{path:n.path,driveId:t.driveId,content:i}),Xt(t.db,t.embeddingProvider??null,{path:n.path,driveId:t.driveId,content:i}),{version:N,path:n.path,size:T}}var Au=10485760;var xo=D(()=>{C();C();Ct();d()});async function co(t,n){let o=$(t.orgId,t.driveId,n.path),i;try{i=(await t.s3.getObject(o)).body}catch(_){if(_?.name==="NoSuchKey"||_?.$metadata?.httpStatusCode===404)throw new G(`File not found: ${n.path}`,{path:n.path});throw _}let E=new TextDecoder().decode(i).split(`
145
+ `),N=E.length,L=n.offset??0,y=n.limit??Uu,R=E.slice(L,L+y),I=L+y<N;return{content:R.join(`
146
+ `),totalLines:N,truncated:I}}var Uu=200;var ao=D(()=>{C();d()});async function so(t,n){let o=$(t.orgId,t.driveId,n.path),i;try{i=(await t.s3.getObject(o)).body}catch(_){if(_?.name==="NoSuchKey"||_?.$metadata?.httpStatusCode===404)throw new G(`File not found: ${n.path}`,{path:n.path});throw _}let T=new TextDecoder().decode(i),E=T.split(n.old_string).length-1;if(E===0)throw new s(`old_string not found in ${n.path}`,{path:n.path,suggestion:"Verify the exact text you want to replace"});if(E>1)throw new s(`old_string found ${E} times in ${n.path}, expected exactly 1`,{path:n.path,suggestion:"Provide more surrounding context to make the match unique"});let N=T.replace(n.old_string,n.new_string),L=Buffer.byteLength(N),y=await t.s3.putObject(o,N),R=JSON.stringify({old:n.old_string,new:n.new_string}),I=await K(t,{path:n.path,s3VersionId:y.versionId??"",operation:"edit",message:n.message,diffSummary:R,size:L,etag:y.etag});return ut(t.db,{path:n.path,driveId:t.driveId,content:N}),Xt(t.db,t.embeddingProvider??null,{path:n.path,driveId:t.driveId,content:N}),{version:I,path:n.path,changes:1}}var ti=D(()=>{C();d();Ct()});async function ni(t,n){let o=$(t.orgId,t.driveId,n.path),i="";try{let y=await t.s3.getObject(o);i=new TextDecoder().decode(y.body)}catch(y){if(y?.name==="NoSuchKey"||y?.$metadata?.httpStatusCode===404)throw new G(`File not found: ${n.path}`,{path:n.path});throw y}let T=i+n.content,E=Buffer.byteLength(T),N=await t.s3.putObject(o,T),L=await K(t,{path:n.path,s3VersionId:N.versionId??"",operation:"append",message:n.message,size:E,etag:N.etag});return ut(t.db,{path:n.path,driveId:t.driveId,content:T}),Xt(t.db,t.embeddingProvider??null,{path:n.path,driveId:t.driveId,content:T}),{version:L,size:E}}var oi=D(()=>{C();d();Ct()});import{eq as ii,and as Su,like as Xu}from"drizzle-orm";async function Ti(t,n){let o=Et(n.path??"/"),i=$(t.orgId,t.driveId,o),{objects:T,prefixes:E}=await t.s3.listObjects(i,{delimiter:"/"}),N=t.db.select().from(u.files).where(Su(ii(u.files.driveId,t.driveId),Xu(u.files.path,o+"%"),ii(u.files.isDeleted,!1))).all(),L=new Map(N.map((R)=>[R.path,R])),y=[];for(let R of E){let I=R.slice(i.length).replace(/\/$/,"");if(I)y.push({name:I,type:"directory",size:0})}for(let R of T){let I=R.key.slice(i.length);if(!I)continue;let _=I.endsWith("/"),Z=_?I.slice(0,-1):I;if(_)y.push({name:Z,type:"directory",size:0});else{let H=o+Z,q=L.get(H);y.push({name:Z,type:"file",size:q?.size??R.size,author:q?.author,modifiedAt:q?.modifiedAt??R.lastModified})}}return{entries:y}}var Ei=D(()=>{P();C()});import{eq as ui,and as Zu}from"drizzle-orm";async function Ni(t,n){let o=$(t.orgId,t.driveId,n.path),i;try{i=await t.s3.headObject(o)}catch(E){if(E?.name==="NotFound"||E?.$metadata?.httpStatusCode===404)throw new G(`File not found: ${n.path}`,{path:n.path});throw E}let T=t.db.select().from(u.files).where(Zu(ui(u.files.path,n.path),ui(u.files.driveId,t.driveId))).get();return{path:n.path,size:i.size,contentType:i.contentType,author:T?.author??"unknown",currentVersion:T?.currentVersionId?parseInt(T.currentVersionId):void 0,createdAt:T?.createdAt??new Date,modifiedAt:T?.modifiedAt??i.lastModified??new Date,isDeleted:T?.isDeleted??!1,embeddingStatus:T?.embeddingStatus??void 0}}var yi=D(()=>{P();C();d()});import{eq as Zt,and as Jn}from"drizzle-orm";async function Li(t,n){let o=$(t.orgId,t.driveId,n.path);await t.s3.deleteObject(o),await K(t,{path:n.path,s3VersionId:"",operation:"delete"}),bo(t.db,{path:n.path,driveId:t.driveId});let i=t.db.select({id:u.contentChunks.id}).from(u.contentChunks).where(Jn(Zt(u.contentChunks.filePath,n.path),Zt(u.contentChunks.driveId,t.driveId))).all();if(i.length>0){let T=t.db.$client;for(let E of i)T.prepare("DELETE FROM chunk_vectors WHERE chunk_id = ?").run(E.id);t.db.delete(u.contentChunks).where(Jn(Zt(u.contentChunks.filePath,n.path),Zt(u.contentChunks.driveId,t.driveId))).run()}return t.db.update(u.comments).set({isDeleted:!0,updatedAt:new Date}).where(Jn(Zt(u.comments.path,n.path),Zt(u.comments.driveId,t.driveId))).run(),{path:n.path,deleted:!0}}var Ri=D(()=>{P();C()});async function Ii(t,n){let o=$(t.orgId,t.driveId,n.from),i=$(t.orgId,t.driveId,n.to),T=await t.s3.copyObject(o,i),E=await t.s3.headObject(i),N=await K(t,{path:n.to,s3VersionId:T.versionId??"",operation:"write",message:n.message??`Moved from ${n.from}`,size:E.size,etag:T.etag});return await t.s3.deleteObject(o),await K(t,{path:n.from,s3VersionId:"",operation:"delete",message:`Moved to ${n.to}`}),{from:n.from,to:n.to,version:N}}var Di=D(()=>{C()});async function Oi(t,n){let o=$(t.orgId,t.driveId,n.from),i=$(t.orgId,t.driveId,n.to),T=await t.s3.copyObject(o,i),E=await t.s3.headObject(i),N=await K(t,{path:n.to,s3VersionId:T.versionId??"",operation:"write",message:`Copied from ${n.from}`,size:E.size,etag:T.etag});return{from:n.from,to:n.to,version:N}}var _i=D(()=>{C()});async function Ai(t,n){let o=$(t.orgId,t.driveId,n.path),i=n.lines??wu,T;try{T=(await t.s3.getObject(o)).body}catch(_){if(_?.name==="NoSuchKey"||_?.$metadata?.httpStatusCode===404)throw new G(`File not found: ${n.path}`,{path:n.path});throw _}let N=new TextDecoder().decode(T).split(`
147
+ `),L=N.length,y=Math.max(0,L-i),R=N.slice(y),I=y>0;return{content:R.join(`
148
+ `),totalLines:L,truncated:I}}var wu=20;var Ui=D(()=>{C();d()});import{eq as Si,and as $u,desc as Bu}from"drizzle-orm";async function Xi(t,n){let o=n.limit??50;return{versions:t.db.select().from(u.fileVersions).where($u(Si(u.fileVersions.path,n.path),Si(u.fileVersions.driveId,t.driveId))).orderBy(Bu(u.fileVersions.version)).limit(o).all().map((T)=>({version:T.version,author:T.author,createdAt:T.createdAt,operation:T.operation,message:T.message??void 0,diffSummary:T.diffSummary??void 0,size:T.size??void 0}))}}var Zi=D(()=>{P()});import{eq as wt,and as wi}from"drizzle-orm";import{structuredPatch as Mu}from"diff";async function $i(t,n){let o=t.db.select().from(u.fileVersions).where(wi(wt(u.fileVersions.path,n.path),wt(u.fileVersions.driveId,t.driveId),wt(u.fileVersions.version,n.v1))).get(),i=t.db.select().from(u.fileVersions).where(wi(wt(u.fileVersions.path,n.path),wt(u.fileVersions.driveId,t.driveId),wt(u.fileVersions.version,n.v2))).get();if(!o||!i)throw new G(`Version ${!o?n.v1:n.v2} not found for ${n.path}`,{path:n.path});if(o.s3VersionId&&i.s3VersionId){let E=$(t.orgId,t.driveId,n.path);try{let[N,L]=await Promise.all([t.s3.getObject(E,o.s3VersionId),t.s3.getObject(E,i.s3VersionId)]),y=new TextDecoder().decode(N.body),R=new TextDecoder().decode(L.body),I=Mu(n.path,n.path,y,R),_=[];for(let Z of I.hunks)for(let H of Z.lines){let q=H.startsWith("+")?"add":H.startsWith("-")?"remove":"context";_.push({type:q,content:H.slice(1)})}return{changes:_}}catch{}}let T=[];if(i.diffSummary)try{let E=JSON.parse(i.diffSummary);if(E.old)T.push({type:"remove",content:E.old});if(E.new)T.push({type:"add",content:E.new})}catch{T.push({type:"context",content:i.diffSummary})}return{changes:T}}var Bi=D(()=>{P();C();d()});import{eq as Gn,and as Yu}from"drizzle-orm";async function Mi(t,n){let o=t.db.select().from(u.fileVersions).where(Yu(Gn(u.fileVersions.path,n.path),Gn(u.fileVersions.driveId,t.driveId),Gn(u.fileVersions.version,n.version))).get();if(!o)throw new G(`Version ${n.version} not found for ${n.path}`,{path:n.path});if(!o.s3VersionId)throw new a("VERSIONING_REQUIRED","S3 versioning required for revert","Enable S3 versioning on the bucket");let i=$(t.orgId,t.driveId,n.path),T=await t.s3.getObject(i,o.s3VersionId),E=await t.s3.putObject(i,T.body),N=T.body.length;return{version:await K(t,{path:n.path,s3VersionId:E.versionId??"",operation:"revert",message:`Reverted to version ${n.version}`,size:N,etag:E.etag}),revertedTo:n.version}}var Yi=D(()=>{P();C();d()});import{eq as Qn,and as Ji,desc as Ju,gte as Gu,like as Qu}from"drizzle-orm";async function Gi(t,n){let o=n.limit??50,i=t.db.select().from(u.fileVersions).where(Qn(u.fileVersions.driveId,t.driveId)).$dynamic();if(n.path)i=i.where(Ji(Qn(u.fileVersions.driveId,t.driveId),Qu(u.fileVersions.path,n.path+"%")));if(n.since)i=i.where(Ji(Qn(u.fileVersions.driveId,t.driveId),Gu(u.fileVersions.createdAt,n.since)));return{entries:i.orderBy(Ju(u.fileVersions.createdAt)).limit(o).all().map((E)=>({path:E.path,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 Qi=D(()=>{P()});async function Fi(t,n){let o=new RegExp(n.pattern),i=Et(n.path),E=t.db.$client.prepare("SELECT path, content FROM files_fts WHERE drive_id = ? AND path LIKE ?").all(t.driveId,i+"%"),N=[];for(let L of E){let y=L.content.split(`
149
+ `);for(let R=0;R<y.length;R++)if(o.test(y[R]))N.push({path:L.path,lineNumber:R+1,content:y[R]})}return{matches:N}}var Pi=()=>{};async function Wi(t,n){let i=po(t.db,{pattern:n.pattern,driveId:t.driveId,pathPrefix:n.path}).map((T)=>({path:T.path,snippet:T.snippet,rank:T.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 Hi=()=>{};import{eq as Fn,and as Fu}from"drizzle-orm";async function Ci(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,T=await o.embed(n.query),E=new Float32Array(T),L=t.db.$client.prepare(`SELECT chunk_id, distance
150
150
  FROM chunk_vectors
151
151
  WHERE embedding MATCH ?
152
152
  ORDER BY distance
153
- LIMIT ?`).all(T,i*2);if(y.length===0)return{results:[]};let N=[],I=new Set;for(let g of y){let D=t.db.select().from(e.contentChunks).where(Bn(e.contentChunks.id,g.chunk_id)).get();if(!D)continue;if(D.driveId!==t.driveId)continue;if(I.has(D.filePath))continue;I.add(D.filePath);let $=t.db.select().from(e.files).where(Ze(Bn(e.files.path,D.filePath),Bn(e.files.driveId,t.driveId))).get();if(N.push({path:D.filePath,score:1/(1+g.distance),snippet:D.content.slice(0,200),author:$?.author,modifiedAt:$?.modifiedAt}),N.length>=i)break}return{results:N}}var Fi=O(()=>{B()});import{eq as pt,and as $e,or as Be,isNull as Me}from"drizzle-orm";async function Ci(t,n){let o=[pt(e.files.driveId,t.driveId),pt(e.files.isDeleted,!1),Be(pt(e.files.embeddingStatus,"failed"),Me(e.files.embeddingStatus),pt(e.files.embeddingStatus,"pending"))];if(n.path){let{like:y}=await import("drizzle-orm"),N=n.path.endsWith("/")?n.path:n.path+"/";o.push(y(e.files.path,N+"%"))}let i=t.db.select({path:e.files.path}).from(e.files).where($e(...o)).all(),u=0,T=0,E=0;for(let y of i){let N=S(t.orgId,t.driveId,y.path);try{let I=await t.s3.getObject(N),g=new TextDecoder().decode(I.body);if(Nt(t.db,{path:y.path,driveId:t.driveId,content:g}),t.embeddingProvider)await dn(t.db,t.embeddingProvider,{path:y.path,driveId:t.driveId,content:g});else{E++;continue}u++}catch(I){console.error(`Reindex failed for ${y.path}:`,I),T++}}return{reindexed:u,failed:T,skipped:E}}var Qi=O(()=>{B();Y();Gt()});import{eq as Pi,and as Je,like as Ye}from"drizzle-orm";async function Hi(t,n){let o=Et(n.path??"/"),i=S(t.orgId,t.driveId,o),{objects:u}=await t.s3.listObjects(i),T=t.db.select().from(e.files).where(Je(Pi(e.files.driveId,t.driveId),Ye(e.files.path,o+"%"),Pi(e.files.isDeleted,!1))).all(),E=new Map(T.map((N)=>[N.path,N])),y=[];for(let N of u){let I=N.key.slice(i.length);if(!I)continue;let g=I.split("/").filter(Boolean);if(g.length===0)continue;if(n.depth!==void 0&&g.length>n.depth)continue;let D=y;for(let $=0;$<g.length;$++){let C=g[$],K=$===g.length-1,ft=!K||I.endsWith("/");if(ft&&!K){let G=D.find((q)=>q.name===C&&q.type==="directory");if(!G)G={name:C,type:"directory",children:[]},D.push(G);if(!G.children)G.children=[];D=G.children}else if(ft&&K){let G=D.find((q)=>q.name===C&&q.type==="directory");if(!G)G={name:C,type:"directory",children:[]},D.push(G)}else{let G=o+g.slice(0,$+1).join("/"),q=E.get(G),_n={name:C,type:"file",size:q?.size??N.size};if(q?.author)_n.author=q.author;if(q?.modifiedAt??N.lastModified)_n.modifiedAt=q?.modifiedAt??N.lastModified;D.push(_n)}}}return{tree:y}}var Wi=O(()=>{B();Y()});import{eq as Ki,and as Ge,like as Fe}from"drizzle-orm";function Ce(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 fi(t,n){let o=n.path?Et(n.path):"/",i=S(t.orgId,t.driveId,o),{objects:u}=await t.s3.listObjects(i),T=t.db.select().from(e.files).where(Ge(Ki(e.files.driveId,t.driveId),Fe(e.files.path,o+"%"),Ki(e.files.isDeleted,!1))).all(),E=new Map(T.map((I)=>[I.path,I])),y=Ce(n.pattern),N=[];for(let I of u){let g=I.key.slice(i.length);if(!g||g.endsWith("/"))continue;if(y.test(g)){let D=o+g,$=E.get(D);N.push({path:D,size:$?.size??I.size,modifiedAt:$?.modifiedAt??I.lastModified})}}return{matches:N}}var Vi=O(()=>{B();Y()});import{eq as r,and as ot,sql as Mn,desc as qi}from"drizzle-orm";function Jn(t,n){t.db.insert(e.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 bt(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,replyCount:t.replyCount??0,createdAt:t.createdAt,updatedAt:t.updatedAt}}async function ht(t,n){let o=new Date,i=crypto.randomUUID(),u=n.path;if(n.parentId){let E=t.db.select().from(e.comments).where(ot(r(e.comments.id,n.parentId),r(e.comments.isDeleted,!1))).get();if(!E)throw new d("Parent comment not found",{suggestion:"Check that the parent comment ID is correct and not deleted"});if(E.parentId)throw new j("Cannot reply to a reply \u2014 only root comments accept replies",{suggestion:"Reply to the root comment instead"});if(!u)u=E.path}if(!u)throw new j("path is required for root comments",{field:"path"});let T=t.db.select({id:e.fileVersions.id}).from(e.fileVersions).where(ot(r(e.fileVersions.path,u),r(e.fileVersions.driveId,t.driveId))).orderBy(qi(e.fileVersions.id)).limit(1).get();return t.db.insert(e.comments).values({id:i,parentId:n.parentId??null,orgId:t.orgId,driveId:t.driveId,path:u,lineStart:n.lineStart??null,lineEnd:n.lineEnd??null,quotedContent:n.quotedContent??null,fileVersionId:T?.id??null,body:n.body,author:t.userId,resolved:!1,createdAt:o,updatedAt:o,isDeleted:!1}).run(),Jn(t,{type:"comment_created",resourceType:"comment",resourceId:i,metadata:{path:u,parentId:n.parentId}}),{id:i,path:u,body:n.body,parentId:n.parentId,lineStart:n.lineStart,lineEnd:n.lineEnd,author:t.userId,createdAt:o}}async function zt(t,n){let o=[r(e.comments.driveId,t.driveId),r(e.comments.isDeleted,!1)];if(n.path)o.push(r(e.comments.path,n.path));if(n.parentId)o.push(r(e.comments.parentId,n.parentId));else if(n.parentId===void 0&&!n.resolved)o.push(Mn`${e.comments.parentId} IS NULL`),o.push(r(e.comments.resolved,!1));else if(n.parentId===void 0&&n.resolved)o.push(Mn`${e.comments.parentId} IS NULL`);if(n.orgId)o.push(r(e.comments.orgId,n.orgId));let i=n.limit??50,u=n.offset??0;return{comments:t.db.select().from(e.comments).where(ot(...o)).orderBy(qi(e.comments.createdAt)).limit(i).offset(u).all().map((y)=>{let I=t.db.select().from(e.comments).where(ot(r(e.comments.parentId,y.id),r(e.comments.isDeleted,!1))).orderBy(e.comments.createdAt).all().map((g)=>bt({...g,replyCount:0}));return{...bt({...y,replyCount:I.length}),replies:I}})}}async function mt(t,n){let o=t.db.select().from(e.comments).where(ot(r(e.comments.id,n.id),r(e.comments.isDeleted,!1))).get();if(!o)throw new d("Comment not found",{suggestion:"Check that the comment ID is correct"});let i=t.db.select({count:Mn`count(*)`}).from(e.comments).where(ot(r(e.comments.parentId,o.id),r(e.comments.isDeleted,!1))).get(),u=bt({...o,replyCount:i?.count??0}),E=t.db.select().from(e.comments).where(ot(r(e.comments.parentId,n.id),r(e.comments.isDeleted,!1))).orderBy(e.comments.createdAt).all().map((y)=>bt({...y,replyCount:0}));return{comment:u,replies:E}}async function xt(t,n){let o=t.db.select().from(e.comments).where(ot(r(e.comments.id,n.id),r(e.comments.isDeleted,!1))).get();if(!o)throw new d("Comment not found",{suggestion:"Check that the comment ID is correct"});if(o.author!==t.userId)throw new k("You can only edit your own comments",{suggestion:"Only the comment author can update it"});let i=new Date;return t.db.update(e.comments).set({body:n.body,updatedAt:i}).where(r(e.comments.id,n.id)).run(),{id:n.id,body:n.body,updatedAt:i}}async function ct(t,n){let o=t.db.select().from(e.comments).where(ot(r(e.comments.id,n.id),r(e.comments.isDeleted,!1))).get();if(!o)throw new d("Comment not found",{suggestion:"Check that the comment ID is correct"});if(o.author!==t.userId)throw new k("You can only delete your own comments",{suggestion:"Only the comment author can delete it"});let i=new Date;if(t.db.update(e.comments).set({isDeleted:!0,updatedAt:i}).where(r(e.comments.id,n.id)).run(),!o.parentId)t.db.update(e.comments).set({isDeleted:!0,updatedAt:i}).where(r(e.comments.parentId,n.id)).run();return Jn(t,{type:"comment_deleted",resourceType:"comment",resourceId:n.id}),{deleted:!0}}async function at(t,n){let o=t.db.select().from(e.comments).where(ot(r(e.comments.id,n.id),r(e.comments.isDeleted,!1))).get();if(!o)throw new d("Comment not found",{suggestion:"Check that the comment ID is correct"});if(o.parentId)throw new j("Cannot resolve a reply \u2014 only root comments can be resolved",{suggestion:"Resolve the parent comment instead"});let i=new Date,u=n.resolved?i:null,T=n.resolved?t.userId:null;return t.db.update(e.comments).set({resolved:n.resolved,resolvedBy:T,resolvedAt:u,updatedAt:i}).where(r(e.comments.id,n.id)).run(),Jn(t,{type:n.resolved?"comment_resolved":"comment_reopened",resourceType:"comment",resourceId:n.id}),{id:n.id,resolved:n.resolved,resolvedBy:T??void 0,resolvedAt:u??void 0}}var ki=O(()=>{B();f()});import{z as L}from"zod";async function It(t,n,o,i){let u=Yn[n];if(!u)throw Error(`Unknown operation: ${n}`);if(!i?.skipAuth){let E=Jt(n);Yt(t.db,{userId:t.userId,driveId:t.driveId,requiredRole:E})}let T=u.schema.parse(o);return u.handler(t,T)}function Xt(){return Object.keys(Yn)}function Ot(t){return Yn[t]}var Yn;var Gn=O(()=>{kt();xo();ao();ti();oi();Ti();Ni();Ii();Li();Di();_i();li();Xi();di();$i();Mi();Yi();Fi();Qi();Wi();Vi();ki();Yn={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:mo,schema:L.object({path:L.string(),content:L.string(),message:L.string().optional(),expectedVersion:L.number().int().optional()})},cat:{description:"Read file content with optional pagination via offset/limit. Returns { content, totalLines, truncated }.",handler:co,schema:L.object({path:L.string(),offset:L.number().int().min(0).optional(),limit:L.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:so,schema:L.object({path:L.string(),old_string:L.string(),new_string:L.string(),message:L.string().optional()})},append:{description:"Append content to the end of an existing file. Creates a new version. Returns { version, size }.",handler:ni,schema:L.object({path:L.string(),content:L.string(),message:L.string().optional()})},ls:{description:"List immediate children of a directory. Returns { entries } where each entry has name, type (file/directory), size, author, modifiedAt.",handler:ui,schema:L.object({path:L.string().optional()})},stat:{description:"Get file metadata without reading content. Returns path, size, contentType, author, currentVersion, createdAt, modifiedAt, isDeleted, embeddingStatus.",handler:Ei,schema:L.object({path:L.string()})},rm:{description:"Delete a file. Removes from S3, cleans up FTS5 index and vector embeddings. Returns { path, deleted }.",handler:yi,schema:L.object({path:L.string()})},mv:{description:"Move or rename a file. Preserves version history at the new path. Returns { from, to, version }.",handler:Oi,schema:L.object({from:L.string(),to:L.string(),message:L.string().optional()})},cp:{description:"Copy a file using server-side S3 copy. Creates a new version at the destination. Returns { from, to, version }.",handler:gi,schema:L.object({from:L.string(),to:L.string()})},tail:{description:"Read the last N lines of a file (default 20). Returns { content, totalLines, truncated }.",handler:Ri,schema:L.object({path:L.string(),lines:L.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:Ui,schema:L.object({path:L.string(),limit:L.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:ri,schema:L.object({path:L.string(),v1:L.number().int(),v2:L.number().int()})},revert:{description:"Revert a file to a previous version. Creates a new version with the old content. Returns { version, revertedTo }.",handler:wi,schema:L.object({path:L.string(),version:L.number().int()})},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:Zi,schema:L.object({path:L.string().optional(),since:L.coerce.date().optional(),limit:L.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:Bi,schema:L.object({pattern:L.string(),path:L.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:Ji,schema:L.object({pattern:L.string(),path:L.string().optional()})},search:{description:"Semantic/vector search using natural language queries. Requires an embedding provider (OPENAI_API_KEY or GEMINI_API_KEY). Returns { results } ranked by relevance.",handler:Gi,schema:L.object({query:L.string(),limit:L.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:Ci,schema:L.object({path:L.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:Hi,schema:L.object({path:L.string().optional(),depth:L.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:fi,schema:L.object({pattern:L.string(),path:L.string().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:ht,schema:L.object({path:L.string().optional(),body:L.string(),parentId:L.string().optional(),lineStart:L.number().int().optional(),lineEnd:L.number().int().optional(),quotedContent:L.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:zt,schema:L.object({path:L.string().optional(),parentId:L.string().optional(),resolved:L.boolean().optional(),orgId:L.string().optional(),limit:L.number().int().min(1).optional(),offset:L.number().int().min(0).optional()})},"comment-get":{description:"Get a single comment by ID with all its replies. Returns { comment, replies }.",handler:mt,schema:L.object({id:L.string()})},"comment-update":{description:"Update a comment's body. Only the original author can update. Returns { id, body, updatedAt }.",handler:xt,schema:L.object({id:L.string(),body:L.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:ct,schema:L.object({id:L.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:at,schema:L.object({id:L.string(),resolved:L.boolean()})}}});import{eq as ji}from"drizzle-orm";function ut(t,n){let o=crypto.randomUUID(),i=new Date;return t.insert(e.drives).values({id:o,orgId:n.orgId,name:n.name,isDefault:n.isDefault??!1,createdAt:i}).run(),{id:o,name:n.name}}function it(t,n){return t.select().from(e.drives).where(ji(e.drives.orgId,n)).all().map((o)=>({id:o.id,name:o.name,isDefault:o.isDefault}))}function Fn(t,n){let o=t.select().from(e.drives).where(ji(e.drives.id,n)).get();if(!o)return null;return{id:o.id,name:o.name,orgId:o.orgId,isDefault:o.isDefault}}function Cn(t,n){t.insert(e.driveMembers).values({driveId:n.driveId,userId:n.userId,role:n.role}).onConflictDoUpdate({target:[e.driveMembers.driveId,e.driveMembers.userId],set:{role:n.role}}).run()}var Qn=O(()=>{B()});import{eq as Ft}from"drizzle-orm";function Dt(t,n){let o=crypto.randomUUID(),i=new Date;t.insert(e.orgs).values({id:o,name:n.name,isPersonal:n.isPersonal??!1,createdAt:i}).run(),t.insert(e.orgMembers).values({orgId:o,userId:n.userId,role:"admin"}).run();let u=ut(t,{orgId:o,name:"default",isDefault:!0});return t.insert(e.driveMembers).values({driveId:u.id,userId:n.userId,role:"admin"}).run(),{id:o,name:n.name}}function F(t,n){return t.select({orgId:e.orgMembers.orgId,role:e.orgMembers.role,name:e.orgs.name,isPersonal:e.orgs.isPersonal}).from(e.orgMembers).innerJoin(e.orgs,Ft(e.orgMembers.orgId,e.orgs.id)).where(Ft(e.orgMembers.userId,n)).all().map((i)=>({id:i.orgId,name:i.name,role:i.role,isPersonal:i.isPersonal}))}function Ct(t,n){let o=t.select().from(e.orgs).where(Ft(e.orgs.id,n)).get();if(!o)return null;return{id:o.id,name:o.name,isPersonal:o.isPersonal}}function Rt(t,n){let o=t.select().from(e.users).where(Ft(e.users.email,n.email)).get();if(!o)throw Error(`User with email ${n.email} not found`);t.insert(e.orgMembers).values({orgId:n.orgId,userId:o.id,role:n.role}).onConflictDoUpdate({target:[e.orgMembers.orgId,e.orgMembers.userId],set:{role:n.role}}).run();let i=t.select().from(e.drives).where(Ft(e.drives.orgId,n.orgId)).get();if(i)t.insert(e.driveMembers).values({driveId:i.id,userId:o.id,role:n.role}).onConflictDoUpdate({target:[e.driveMembers.driveId,e.driveMembers.userId],set:{role:n.role}}).run()}var Pn=O(()=>{B();Qn()});import{eq as pi}from"drizzle-orm";function bi(t){let n=new Bun.CryptoHasher("sha256");return n.update(t),n.digest("hex")}function Qe(){let t=new Uint8Array(32);return crypto.getRandomValues(t),`af_${Array.from(t,(o)=>o.toString(16).padStart(2,"0")).join("")}`}function Pe(){return crypto.randomUUID()}function p(t,n){let o=Pe(),i=Qe(),u=bi(i),T=new Date;return t.insert(e.users).values({id:o,email:n.email,apiKeyHash:u,createdAt:T}).run(),Dt(t,{name:n.email.split("@")[0],userId:o,isPersonal:!0}),{user:{id:o,email:n.email},apiKey:i}}function b(t,n){let o=bi(n),i=t.select().from(e.users).where(pi(e.users.apiKeyHash,o)).get();if(!i)return null;return{id:i.id,email:i.email}}function Hn(t,n){let o=t.select().from(e.users).where(pi(e.users.email,n)).get();if(!o)return null;return{id:o.id,email:o.email}}var Wn=O(()=>{B();Pn()});import{eq as Lt,and as Kn}from"drizzle-orm";function Tt(t,n){if(n.driveId){let T=t.select().from(e.drives).where(Lt(e.drives.id,n.driveId)).get();if(!T)throw Error(`Drive not found: ${n.driveId}`);let E=nt(t,n.userId,n.driveId);if(!E)throw Error("You do not have access to this drive");return{orgId:T.orgId,driveId:n.driveId,role:E}}if(n.orgId){let T=t.select().from(e.drives).where(Kn(Lt(e.drives.orgId,n.orgId),Lt(e.drives.isDefault,!0))).get();if(!T)throw Error(`No default drive for org: ${n.orgId}`);let E=nt(t,n.userId,T.id);if(!E)throw Error("You do not have access to this drive");return{orgId:n.orgId,driveId:T.id,role:E}}let o=t.select({orgId:e.orgMembers.orgId}).from(e.orgMembers).innerJoin(e.orgs,Lt(e.orgMembers.orgId,e.orgs.id)).where(Kn(Lt(e.orgMembers.userId,n.userId),Lt(e.orgs.isPersonal,!0))).get();if(!o)throw Error("No personal org found for user");let i=t.select().from(e.drives).where(Kn(Lt(e.drives.orgId,o.orgId),Lt(e.drives.isDefault,!0))).get();if(!i)throw Error("No default drive found");let u=nt(t,n.userId,i.id);if(!u)throw Error("You do not have access to your default drive");return{orgId:o.orgId,driveId:i.id,role:u}}var hi=O(()=>{B();kt()});function Qt(t){let n=Z();if(n.auth.apiKey){if(b(t,n.auth.apiKey))return{apiKey:n.auth.apiKey}}console.error("[agent-fs] No local user found, creating one...");let o=p(t,{email:"local@agent-fs.local"});return l("auth.apiKey",o.apiKey),console.error("[agent-fs] Local user created automatically."),{apiKey:o.apiKey}}var zi=O(()=>{Zt();Wn()});var mi=O(()=>{Wn();Pn();Qn();kt();hi();zi()});var ci;var xi=O(()=>{ci={name:"agent-fs",version:"0.2.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"},devDependencies:{"bun-types":"^1.2.0",typescript:"^5.7.0",yaml:"^2.8.2","zod-to-json-schema":"^3.25.1"}}});var W;var fn=O(()=>{xi();W=ci.version});var si={};At(si,{LocalEmbeddingProvider:()=>ai});import{join as We}from"path";import{mkdirSync as Ke,existsSync as fe}from"fs";class ai{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=We(m(),"models");if(!fe(o))Ke(o,{recursive:!0});console.error("[agent-fs] Resolving local embedding model...");let i=await n(Ve,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 Ve="hf:nomic-ai/nomic-embed-text-v1.5-GGUF:Q8_0";var tu=O(()=>{Zt()});var Vn={};At(Vn,{OpenAIEmbeddingProvider:()=>nu});import qe from"openai";class nu{name="openai";dimensions=768;client;constructor(t){this.client=new qe({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 qn=()=>{};var kn={};At(kn,{GeminiEmbeddingProvider:()=>ou});import{GoogleGenAI as ke}from"@google/genai";class ou{name="gemini";dimensions=768;client;constructor(t){this.client=new ke({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 jn=()=>{};async function iu(t){switch(t.provider){case"local":{let{LocalEmbeddingProvider:n}=await Promise.resolve().then(() => (tu(),si));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(() => (qn(),Vn));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(() => (jn(),kn));return new n(t.apiKey)}default:throw Error(`Unknown embedding provider: ${t.provider}`)}}async function wt(t){if(process.env.OPENAI_API_KEY)try{let{OpenAIEmbeddingProvider:n}=await Promise.resolve().then(() => (qn(),Vn));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(() => (jn(),kn));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 iu(t)}catch(n){console.error("[agent-fs] Failed to create embedding provider from config:",n)}if(t?.provider==="local")try{return await iu(t)}catch(n){console.error("[agent-fs] Failed to load local embedding provider:",n)}return null}var Tu,uu,eu=(t)=>typeof t==="string"?{...uu,name:t}:{...uu,...t};var st=O(()=>{Tu=Symbol("Let zodToJsonSchema decide on which parser to use"),uu={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 Eu=(t)=>{let n=eu(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,u])=>[u._def,{def:u._def,path:[...n.basePath,n.definitionPath,i],jsonSchema:void 0}]))}};var pn=O(()=>{st()});function bn(t,n,o,i){if(!i?.errorMessages)return;if(o)t.errorMessage={...t.errorMessage,[n]:o}}function U(t,n,o,i,u){t[n]=o,bn(t,n,i,u)}var tn=(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 v(t){if(t.target!=="openAi")return{};let n=[...t.basePath,t.definitionPath,t.openAiAnyTypeName];return t.flags.hasReferencedOpenAiAnyType=!0,{$ref:t.$refStrategy==="relative"?tn(n,t.currentPath):n.join("/")}}var V=()=>{};import{ZodFirstPartyTypeKind as je}from"zod/v3";function Nu(t,n){let o={type:"array"};if(t.type?._def&&t.type?._def?.typeName!==je.ZodAny)o.items=_(t.type._def,{...n,currentPath:[...n.currentPath,"items"]});if(t.minLength)U(o,"minItems",t.minLength.value,t.minLength.message,n);if(t.maxLength)U(o,"maxItems",t.maxLength.value,t.maxLength.message,n);if(t.exactLength)U(o,"minItems",t.exactLength.value,t.exactLength.message,n),U(o,"maxItems",t.exactLength.value,t.exactLength.message,n);return o}var hn=O(()=>{J()});function yu(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)U(o,"minimum",i.value,i.message,n);else U(o,"exclusiveMinimum",i.value,i.message,n);else{if(!i.inclusive)o.exclusiveMinimum=!0;U(o,"minimum",i.value,i.message,n)}break;case"max":if(n.target==="jsonSchema7")if(i.inclusive)U(o,"maximum",i.value,i.message,n);else U(o,"exclusiveMaximum",i.value,i.message,n);else{if(!i.inclusive)o.exclusiveMaximum=!0;U(o,"maximum",i.value,i.message,n)}break;case"multipleOf":U(o,"multipleOf",i.value,i.message,n);break}return o}var zn=()=>{};function Iu(){return{type:"boolean"}}function nn(t,n){return _(t.type._def,n)}var on=O(()=>{J()});var Ou=(t,n)=>{return _(t.innerType._def,n)};var mn=O(()=>{J()});function xn(t,n,o){let i=o??n.dateStrategy;if(Array.isArray(i))return{anyOf:i.map((u,T)=>xn(t,n,u))};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 pe(t,n)}}var pe=(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":U(o,"minimum",i.value,i.message,n);break;case"max":U(o,"maximum",i.value,i.message,n);break}return o};var cn=()=>{};function Lu(t,n){return{..._(t.innerType._def,n),default:t.defaultValue()}}var an=O(()=>{J()});function gu(t,n){return n.effectStrategy==="input"?_(t.schema._def,n):v(n)}var sn=O(()=>{J();V()});function Du(t){return{type:"string",enum:Array.from(t.values)}}function Ru(t,n){let o=[_(t.left._def,{...n,currentPath:[...n.currentPath,"allOf","0"]}),_(t.right._def,{...n,currentPath:[...n.currentPath,"allOf","1"]})].filter((T)=>!!T),i=n.target==="jsonSchema2019-09"?{unevaluatedProperties:!1}:void 0,u=[];return o.forEach((T)=>{if(be(T)){if(u.push(...T.allOf),T.unevaluatedProperties===void 0)i=void 0}else{let E=T;if("additionalProperties"in T&&T.additionalProperties===!1){let{additionalProperties:y,...N}=T;E=N}else i=void 0;u.push(E)}}),u.length?{allOf:u,...i}:void 0}var be=(t)=>{if("type"in t&&t.type==="string")return!1;return"allOf"in t};var to=O(()=>{J()});function _u(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 un(t,n){let o={type:"string"};if(t.checks)for(let i of t.checks)switch(i.kind){case"min":U(o,"minLength",typeof o.minLength==="number"?Math.max(o.minLength,i.value):i.value,i.message,n);break;case"max":U(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":z(o,"email",i.message,n);break;case"format:idn-email":z(o,"idn-email",i.message,n);break;case"pattern:zod":P(o,h.email,i.message,n);break}break;case"url":z(o,"uri",i.message,n);break;case"uuid":z(o,"uuid",i.message,n);break;case"regex":P(o,i.regex,i.message,n);break;case"cuid":P(o,h.cuid,i.message,n);break;case"cuid2":P(o,h.cuid2,i.message,n);break;case"startsWith":P(o,RegExp(`^${oo(i.value,n)}`),i.message,n);break;case"endsWith":P(o,RegExp(`${oo(i.value,n)}$`),i.message,n);break;case"datetime":z(o,"date-time",i.message,n);break;case"date":z(o,"date",i.message,n);break;case"time":z(o,"time",i.message,n);break;case"duration":z(o,"duration",i.message,n);break;case"length":U(o,"minLength",typeof o.minLength==="number"?Math.max(o.minLength,i.value):i.value,i.message,n),U(o,"maxLength",typeof o.maxLength==="number"?Math.min(o.maxLength,i.value):i.value,i.message,n);break;case"includes":{P(o,RegExp(oo(i.value,n)),i.message,n);break}case"ip":{if(i.version!=="v6")z(o,"ipv4",i.message,n);if(i.version!=="v4")z(o,"ipv6",i.message,n);break}case"base64url":P(o,h.base64url,i.message,n);break;case"jwt":P(o,h.jwt,i.message,n);break;case"cidr":{if(i.version!=="v6")P(o,h.ipv4Cidr,i.message,n);if(i.version!=="v4")P(o,h.ipv6Cidr,i.message,n);break}case"emoji":P(o,h.emoji(),i.message,n);break;case"ulid":{P(o,h.ulid,i.message,n);break}case"base64":{switch(n.base64Strategy){case"format:binary":{z(o,"binary",i.message,n);break}case"contentEncoding:base64":{U(o,"contentEncoding","base64",i.message,n);break}case"pattern:zod":{P(o,h.base64,i.message,n);break}}break}case"nanoid":P(o,h.nanoid,i.message,n);case"toLowerCase":case"toUpperCase":case"trim":break;default:((u)=>{})(i)}return o}function oo(t,n){return n.patternStrategy==="escape"?ze(t):t}function ze(t){let n="";for(let o=0;o<t.length;o++){if(!he.has(t[o]))n+="\\";n+=t[o]}return n}function z(t,n,o,i){if(t.format||t.anyOf?.some((u)=>u.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 U(t,"format",n,o,i)}function P(t,n,o,i){if(t.pattern||t.allOf?.some((u)=>u.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:Au(n,i),...o&&i.errorMessages&&{errorMessage:{pattern:o}}})}else U(t,"pattern",Au(n,i),o,i)}function Au(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,u="",T=!1,E=!1,y=!1;for(let N=0;N<i.length;N++){if(T){u+=i[N],T=!1;continue}if(o.i){if(E){if(i[N].match(/[a-z]/)){if(y)u+=i[N],u+=`${i[N-2]}-${i[N]}`.toUpperCase(),y=!1;else if(i[N+1]==="-"&&i[N+2]?.match(/[a-z]/))u+=i[N],y=!0;else u+=`${i[N]}${i[N].toUpperCase()}`;continue}}else if(i[N].match(/[a-z]/)){u+=`[${i[N]}${i[N].toUpperCase()}]`;continue}}if(o.m){if(i[N]==="^"){u+=`(^|(?<=[\r
154
- ]))`;continue}else if(i[N]==="$"){u+=`($|(?=[\r
155
- ]))`;continue}}if(o.s&&i[N]==="."){u+=E?`${i[N]}\r
156
- `:`[${i[N]}\r
157
- ]`;continue}if(u+=i[N],i[N]==="\\")T=!0;else if(E&&i[N]==="]")E=!1;else if(!E&&i[N]==="[")E=!0}try{new RegExp(u)}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 u}var no=void 0,h,he;var Tn=O(()=>{h={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(no===void 0)no=RegExp("^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$","u");return no},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-_]*$/};he=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789")});import{ZodFirstPartyTypeKind as Pt}from"zod/v3";function en(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===Pt.ZodEnum)return{type:"object",required:t.keyType._def.values,properties:t.keyType._def.values.reduce((i,u)=>({...i,[u]:_(t.valueType._def,{...n,currentPath:[...n.currentPath,"properties",u]})??v(n)}),{}),additionalProperties:n.rejectedAdditionalProperties};let o={type:"object",additionalProperties:_(t.valueType._def,{...n,currentPath:[...n.currentPath,"additionalProperties"]})??n.allowedAdditionalProperties};if(n.target==="openApi3")return o;if(t.keyType?._def.typeName===Pt.ZodString&&t.keyType._def.checks?.length){let{type:i,...u}=un(t.keyType._def,n);return{...o,propertyNames:u}}else if(t.keyType?._def.typeName===Pt.ZodEnum)return{...o,propertyNames:{enum:t.keyType._def.values}};else if(t.keyType?._def.typeName===Pt.ZodBranded&&t.keyType._def.type._def.typeName===Pt.ZodString&&t.keyType._def.type._def.checks?.length){let{type:i,...u}=nn(t.keyType._def,n);return{...o,propertyNames:u}}return o}var En=O(()=>{J();Tn();on();V()});function Uu(t,n){if(n.mapStrategy==="record")return en(t,n);let o=_(t.keyType._def,{...n,currentPath:[...n.currentPath,"items","items","0"]})||v(n),i=_(t.valueType._def,{...n,currentPath:[...n.currentPath,"items","items","1"]})||v(n);return{type:"array",maxItems:125,items:{type:"array",items:[o,i],minItems:2,maxItems:2}}}var io=O(()=>{J();En();V()});function lu(t){let n=t.values,i=Object.keys(t.values).filter((T)=>{return typeof n[n[T]]!=="number"}).map((T)=>n[T]),u=Array.from(new Set(i.map((T)=>typeof T)));return{type:u.length===1?u[0]==="string"?"string":"number":["string","number"],enum:i}}function Su(t){return t.target==="openAi"?void 0:{not:v({...t,currentPath:[...t.currentPath,"not"]})}}var uo=O(()=>{V()});function ru(t){return t.target==="openApi3"?{enum:["null"],nullable:!0}:{type:"null"}}function wu(t,n){if(n.target==="openApi3")return Xu(t,n);let o=t.options instanceof Map?Array.from(t.options.values()):t.options;if(o.every((i)=>(i._def.typeName in Ht)&&(!i._def.checks||!i._def.checks.length))){let i=o.reduce((u,T)=>{let E=Ht[T._def.typeName];return E&&!u.includes(E)?[...u,E]:u},[]);return{type:i.length>1?i:i[0]}}else if(o.every((i)=>i._def.typeName==="ZodLiteral"&&!i.description)){let i=o.reduce((u,T)=>{let E=typeof T._def.value;switch(E){case"string":case"number":case"boolean":return[...u,E];case"bigint":return[...u,"integer"];case"object":if(T._def.value===null)return[...u,"null"];case"symbol":case"undefined":case"function":default:return u}},[]);if(i.length===o.length){let u=i.filter((T,E,y)=>y.indexOf(T)===E);return{type:u.length>1?u:u[0],enum:o.reduce((T,E)=>{return T.includes(E._def.value)?T:[...T,E._def.value]},[])}}}else if(o.every((i)=>i._def.typeName==="ZodEnum"))return{type:"string",enum:o.reduce((i,u)=>[...i,...u._def.values.filter((T)=>!i.includes(T))],[])};return Xu(t,n)}var Ht,Xu=(t,n)=>{let o=(t.options instanceof Map?Array.from(t.options.values()):t.options).map((i,u)=>_(i._def,{...n,currentPath:[...n.currentPath,"anyOf",`${u}`]})).filter((i)=>!!i&&(!n.strictUnions||typeof i==="object"&&Object.keys(i).length>0));return o.length?{anyOf:o}:void 0};var Nn=O(()=>{J();Ht={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"}});function du(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:Ht[t.innerType._def.typeName],nullable:!0};return{type:[Ht[t.innerType._def.typeName],"null"]}}if(n.target==="openApi3"){let i=_(t.innerType._def,{...n,currentPath:[...n.currentPath]});if(i&&"$ref"in i)return{allOf:[i],nullable:!0};return i&&{...i,nullable:!0}}let o=_(t.innerType._def,{...n,currentPath:[...n.currentPath,"anyOf","0"]});return o&&{anyOf:[o,{type:"null"}]}}var To=O(()=>{J();Nn()});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",bn(o,"type",i.message,n);break;case"min":if(n.target==="jsonSchema7")if(i.inclusive)U(o,"minimum",i.value,i.message,n);else U(o,"exclusiveMinimum",i.value,i.message,n);else{if(!i.inclusive)o.exclusiveMinimum=!0;U(o,"minimum",i.value,i.message,n)}break;case"max":if(n.target==="jsonSchema7")if(i.inclusive)U(o,"maximum",i.value,i.message,n);else U(o,"exclusiveMaximum",i.value,i.message,n);else{if(!i.inclusive)o.exclusiveMaximum=!0;U(o,"maximum",i.value,i.message,n)}break;case"multipleOf":U(o,"multipleOf",i.value,i.message,n);break}return o}var eo=()=>{};function Zu(t,n){let o=n.target==="openAi",i={type:"object",properties:{}},u=[],T=t.shape();for(let y in T){let N=T[y];if(N===void 0||N._def===void 0)continue;let I=xe(N);if(I&&o){if(N._def.typeName==="ZodOptional")N=N._def.innerType;if(!N.isNullable())N=N.nullable();I=!1}let g=_(N._def,{...n,currentPath:[...n.currentPath,"properties",y],propertyPath:[...n.currentPath,"properties",y]});if(g===void 0)continue;if(i.properties[y]=g,!I)u.push(y)}if(u.length)i.required=u;let E=me(t,n);if(E!==void 0)i.additionalProperties=E;return i}function me(t,n){if(t.catchall._def.typeName!=="ZodNever")return _(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 xe(t){try{return t.isOptional()}catch{return!0}}var Eo=O(()=>{J()});var $u=(t,n)=>{if(n.currentPath.toString()===n.propertyPath?.toString())return _(t.innerType._def,n);let o=_(t.innerType._def,{...n,currentPath:[...n.currentPath,"anyOf","1"]});return o?{anyOf:[{not:v(n)},o]}:v(n)};var No=O(()=>{J();V()});var Bu=(t,n)=>{if(n.pipeStrategy==="input")return _(t.in._def,n);else if(n.pipeStrategy==="output")return _(t.out._def,n);let o=_(t.in._def,{...n,currentPath:[...n.currentPath,"allOf","0"]}),i=_(t.out._def,{...n,currentPath:[...n.currentPath,"allOf",o?"1":"0"]});return{allOf:[o,i].filter((u)=>u!==void 0)}};var yo=O(()=>{J()});function Mu(t,n){return _(t.type._def,n)}var Io=O(()=>{J()});function Ju(t,n){let i={type:"array",uniqueItems:!0,items:_(t.valueType._def,{...n,currentPath:[...n.currentPath,"items"]})};if(t.minSize)U(i,"minItems",t.minSize.value,t.minSize.message,n);if(t.maxSize)U(i,"maxItems",t.maxSize.value,t.maxSize.message,n);return i}var Oo=O(()=>{J()});function Yu(t,n){if(t.rest)return{type:"array",minItems:t.items.length,items:t.items.map((o,i)=>_(o._def,{...n,currentPath:[...n.currentPath,"items",`${i}`]})).reduce((o,i)=>i===void 0?o:[...o,i],[]),additionalItems:_(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)=>_(o._def,{...n,currentPath:[...n.currentPath,"items",`${i}`]})).reduce((o,i)=>i===void 0?o:[...o,i],[])}}var Lo=O(()=>{J()});function Gu(t){return{not:v(t)}}var go=O(()=>{V()});function Fu(t){return v(t)}var Do=O(()=>{V()});var Cu=(t,n)=>{return _(t.innerType._def,n)};var Ro=O(()=>{J()});import{ZodFirstPartyTypeKind as A}from"zod/v3";var Qu=(t,n,o)=>{switch(n){case A.ZodString:return un(t,o);case A.ZodNumber:return vu(t,o);case A.ZodObject:return Zu(t,o);case A.ZodBigInt:return yu(t,o);case A.ZodBoolean:return Iu();case A.ZodDate:return xn(t,o);case A.ZodUndefined:return Gu(o);case A.ZodNull:return ru(o);case A.ZodArray:return Nu(t,o);case A.ZodUnion:case A.ZodDiscriminatedUnion:return wu(t,o);case A.ZodIntersection:return Ru(t,o);case A.ZodTuple:return Yu(t,o);case A.ZodRecord:return en(t,o);case A.ZodLiteral:return _u(t,o);case A.ZodEnum:return Du(t);case A.ZodNativeEnum:return lu(t);case A.ZodNullable:return du(t,o);case A.ZodOptional:return $u(t,o);case A.ZodMap:return Uu(t,o);case A.ZodSet:return Ju(t,o);case A.ZodLazy:return()=>t.getter()._def;case A.ZodPromise:return Mu(t,o);case A.ZodNaN:case A.ZodNever:return Su(o);case A.ZodEffects:return gu(t,o);case A.ZodAny:return v(o);case A.ZodUnknown:return Fu(o);case A.ZodDefault:return Lu(t,o);case A.ZodBranded:return nn(t,o);case A.ZodReadonly:return Cu(t,o);case A.ZodCatch:return Ou(t,o);case A.ZodPipeline:return Bu(t,o);case A.ZodFunction:case A.ZodVoid:case A.ZodSymbol:return;default:return((i)=>{return})(n)}};var _o=O(()=>{V();hn();zn();on();mn();cn();an();sn();to();io();uo();To();eo();Eo();No();yo();Io();En();Oo();Tn();Lo();go();Nn();Do();Ro()});function _(t,n,o=!1){let i=n.seen.get(t);if(n.override){let y=n.override?.(t,n,i,o);if(y!==Tu)return y}if(i&&!o){let y=ce(i,n);if(y!==void 0)return y}let u={def:t,path:n.currentPath,jsonSchema:void 0};n.seen.set(t,u);let T=Qu(t,t.typeName,n),E=typeof T==="function"?_(T(),n):T;if(E)ae(t,n,E);if(n.postProcess){let y=n.postProcess(E,t,n);return u.jsonSchema=E,y}return u.jsonSchema=E,E}var ce=(t,n)=>{switch(n.$refStrategy){case"root":return{$ref:t.path.join("/")};case"relative":return{$ref:tn(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`),v(n);return n.$refStrategy==="seen"?v(n):void 0}}},ae=(t,n,o)=>{if(t.description){if(o.description=t.description,n.markdownDescription)o.markdownDescription=t.description}return o};var J=O(()=>{st();_o();V()});var Pu=()=>{};var Ao=(t,n)=>{let o=Eu(n),i=typeof n==="object"&&n.definitions?Object.entries(n.definitions).reduce((N,[I,g])=>({...N,[I]:_(g._def,{...o,currentPath:[...o.basePath,o.definitionPath,I]},!0)??v(o)}),{}):void 0,u=typeof n==="string"?n:n?.nameStrategy==="title"?void 0:n?.name,T=_(t._def,u===void 0?o:{...o,currentPath:[...o.basePath,o.definitionPath,u]},!1)??v(o),E=typeof n==="object"&&n.name!==void 0&&n.nameStrategy==="title"?n.name:void 0;if(E!==void 0)T.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 y=u===void 0?i?{...T,[o.definitionPath]:i}:T:{$ref:[...o.$refStrategy==="relative"?[]:o.basePath,o.definitionPath,u].join("/"),[o.definitionPath]:{...i,[u]:T}};if(o.target==="jsonSchema7")y.$schema="http://json-schema.org/draft-07/schema#";else if(o.target==="jsonSchema2019-09"||o.target==="openAi")y.$schema="https://json-schema.org/draft/2019-09/schema#";if(o.target==="openAi"&&(("anyOf"in y)||("oneOf"in y)||("allOf"in y)||("type"in y)&&Array.isArray(y.type)))console.warn("Warning: OpenAI may not support schemas with unions as roots! Try wrapping it in an object property.");return y};var Uo=O(()=>{J();pn();V()});var Hu=O(()=>{Uo();st();pn();J();Pu();V();hn();zn();on();mn();cn();an();sn();to();io();uo();To();eo();Eo();No();yo();Io();Ro();En();Oo();Tn();Lo();go();Nn();Do();_o();Uo()});function yn(){let t=Xt(),n={},o={};for(let u of t){let T=Ot(u),E=Ao(T.schema,{target:"openApi3"}),{$schema:y,...N}=E;n[u]=N,o[u]=T.description}let i=t.map((u)=>({type:"object",title:u,description:o[u],required:["op",...n[u].required||[]],properties:{op:{type:"string",const:u},driveId:{type:"string",description:"Target drive ID (optional, uses default drive)"},...n[u].properties||{}},additionalProperties:!1}));return{openapi:"3.1.0",info:{title:"agent-fs API",version:W,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 Wu=O(()=>{Hu();Gn();fn()});var Ku={};At(Ku,{setDriveMember:()=>Cn,setConfigValue:()=>l,setConfig:()=>Qo,schema:()=>e,resolveContext:()=>Tt,listUserOrgs:()=>F,listDrives:()=>it,inviteToOrg:()=>Rt,getUserDriveRole:()=>nt,getUserByEmail:()=>Hn,getUserByApiKey:()=>b,getRequiredRole:()=>Jt,getRegisteredOps:()=>Xt,getOrg:()=>Ct,getOpDefinition:()=>Ot,getHome:()=>m,getDrive:()=>Fn,getDbPath:()=>gt,getConfigPath:()=>x,getConfig:()=>Z,generateOpenAPISpec:()=>yn,ensureLocalUser:()=>Qt,dispatchOp:()=>It,createUser:()=>p,createOrg:()=>Dt,createEmbeddingProviderFromEnv:()=>wt,createDrive:()=>ut,createDatabase:()=>a,commentUpdate:()=>xt,commentResolve:()=>at,commentList:()=>zt,commentGet:()=>mt,commentDelete:()=>ct,commentAdd:()=>ht,checkPermission:()=>Yt,ValidationError:()=>j,VERSION:()=>W,PermissionDeniedError:()=>k,NotFoundError:()=>d,IndexingInProgressError:()=>Mt,EditConflictError:()=>tt,AgentS3Client:()=>et,AgentFSError:()=>s});var M=O(()=>{B();Zt();Vo();f();Gn();mi();fn();Wu()});var In={};At(In,{stopDaemon:()=>BE,startDaemon:()=>$E,daemonStatus:()=>ME});import{spawn as wE}from"child_process";import{readFileSync as ro,writeFileSync as dE,unlinkSync as pu,existsSync as Xo,openSync as vE}from"fs";import{join as wo}from"path";function vo(){return wo(m(),"agent-fs.pid")}function ZE(){return wo(m(),"agent-fs.log")}function $E(){let t=vo();if(Xo(t)){let y=parseInt(ro(t,"utf-8").trim());try{process.kill(y,0),console.log(`Daemon already running (PID: ${y})`);return}catch{pu(t)}}let n=ZE(),o=vE(n,"a"),i=!import.meta.dir.startsWith("/")||import.meta.dir.startsWith("/$bunfs"),u=i?process.execPath:"bun",T=i?["server"]:["run",wo(import.meta.dir,"index.ts")],E=wE(u,T,{detached:!0,stdio:["ignore",o,o]});if(E.unref(),E.pid)dE(t,String(E.pid)),console.log(`Daemon started (PID: ${E.pid})`),console.log(`Logs: ${n}`)}function BE(){let t=vo();if(!Xo(t)){console.log("Daemon is not running");return}let n=parseInt(ro(t,"utf-8").trim());try{process.kill(n,"SIGTERM"),console.log(`Daemon stopped (PID: ${n})`)}catch{console.log(`Process ${n} not found (already stopped)`)}pu(t)}function ME(){let t=vo();if(!Xo(t))return{running:!1};let n=parseInt(ro(t,"utf-8").trim());try{return process.kill(n,0),{running:!0,pid:n}}catch{return{running:!1}}}var On=O(()=>{M()});var cE={};import{Server as kE}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport as jE}from"@modelcontextprotocol/sdk/server/stdio.js";import{Client as pE}from"@modelcontextprotocol/sdk/client/index.js";import{StreamableHTTPClientTransport as bE}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{ListToolsRequestSchema as hE,CallToolRequestSchema as zE}from"@modelcontextprotocol/sdk/types.js";var Zo,$o,tT,mE,Bo,Mo,xE;var nT=O(async()=>{M();Zo=Z(),$o=process.env.AGENT_FS_API_URL??`http://${Zo.server.host}:${Zo.server.port}`,tT=process.env.AGENT_FS_API_KEY??Zo.auth?.apiKey;if(!tT)console.error("Error: No API key. Register with `agent-fs auth register` or set AGENT_FS_API_KEY."),process.exit(1);mE=new bE(new URL(`${$o}/mcp`),{requestInit:{headers:{Authorization:`Bearer ${tT}`}}}),Bo=new pE({name:"agent-fs-proxy",version:W});try{await Bo.connect(mE)}catch(t){console.error(`Cannot connect to agent-fs at ${$o}.
158
- Start a daemon with \`agent-fs daemon start\` or set AGENT_FS_API_URL to connect to a remote server.`),process.exit(1)}Mo=new kE({name:"agent-fs",version:W},{capabilities:{tools:{}}});Mo.setRequestHandler(hE,async()=>{return await Bo.listTools()});Mo.setRequestHandler(zE,async(t)=>{return await Bo.callTool(t.params)});xE=new jE;await Mo.connect(xE);console.error("[agent-fs] MCP proxy connected to "+$o)});import{z as oT}from"zod";function iT(t,n){let o=Xt();for(let i of o){let u=Ot(i);if(!u)continue;t.tool(i,u.description,u.schema instanceof oT.ZodObject?u.schema.shape:{params:oT.any()},async(T,E)=>{let y=n(E),N=await It(y,i,T);return{content:[{type:"text",text:JSON.stringify(N,null,2)}]}})}}var uT=O(()=>{M()});import{McpServer as aE}from"@modelcontextprotocol/sdk/server/mcp.js";function TT(t){let{db:n,s3:o,embeddingProvider:i}=t,u=new aE({name:"agent-fs",version:W}),T=(E)=>{let y=E.authInfo;if(!y?.extra?.user)throw Error("No auth context \u2014 MCP must be accessed through the HTTP server");let N=y.extra.user,I=Tt(n,{userId:N.id});return{db:n,s3:o,orgId:I.orgId,driveId:I.driveId,userId:N.id,embeddingProvider:i}};return iT(u,T),u.tool("health","Check agent-fs system health: database, S3, embeddings, version.",{},async(E,y)=>{let N={version:W};try{let I=T(y),g=await It(I,"ls",{path:"/"},{skipAuth:!0});N.database={ok:!0,rootEntries:g.entries?.length??0}}catch(I){N.database={ok:!1,error:I.message}}try{await o.listObjects("",{delimiter:"/"}),N.s3={ok:!0}}catch(I){N.s3={ok:!1,error:I.message}}return N.embeddings={configured:!!i},{content:[{type:"text",text:JSON.stringify(N,null,2)}]}}),u.tool("whoami","Get current user identity, org memberships, and drive roles.",{},async(E,y)=>{let N=T(y),I=N.userId,D=F(n,I).map((K)=>{let ft=it(n,K.id);return{orgId:K.id,orgName:K.name,drives:ft.map((G)=>({driveId:G.id,driveName:G.name,role:nt(n,I,G.id)}))}}),$=y.authInfo?.extra?.user?.email,C={userId:I,...$?{email:$}:{},activeOrg:N.orgId,activeDrive:N.driveId,memberships:D};return{content:[{type:"text",text:JSON.stringify(C,null,2)}]}}),u}var eT=O(()=>{M();uT()});function ET(t){return async(n,o)=>{let i=new URL(n.req.url).pathname;if(sE.some((y)=>i===y||i.startsWith(y)))return o();let u=n.req.header("Authorization");if(!u?.startsWith("Bearer "))return n.json({error:"UNAUTHORIZED",message:"Missing or invalid Authorization header",suggestion:"Include 'Authorization: Bearer <api_key>' header"},401);let T=u.slice(7),E=b(t,T);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 sE;var NT=O(()=>{M();sE=["/auth/register","/health"]});function tN(t){if(t instanceof d)return 404;if(t instanceof k)return 403;if(t instanceof tt)return 409;if(t instanceof Mt)return 503;if(t instanceof j)return 400;if("code"in t)return 400;return 500}function yT(t,n){let o=tN(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 IT=O(()=>{M()});function Dn(t){let n=new Map;return setInterval(()=>{let o=Date.now()-60000;for(let[i,u]of n){let T=u.filter((E)=>E>o);if(T.length===0)n.delete(i);else n.set(i,T)}},300000).unref(),async(o,i)=>{let u=o.req.header("authorization")??"",T=u.startsWith("Bearer ")?u.slice(7):o.req.header("x-forwarded-for")??"unknown",E=Date.now(),y=E-60000,N=(n.get(T)??[]).filter((I)=>I>y);if(N.length>=t){let I=N[0],g=Math.ceil((I+60000-E)/1000);return o.header("Retry-After",String(g)),o.json({error:"RATE_LIMITED",message:"Too many requests"},429)}N.push(E),n.set(T,N),await i()}}import{Hono as nN}from"hono";function OT(t){let n=new nN;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 u=p(t,{email:i}),T=F(t,u.user.id);return o.json({apiKey:u.apiKey,userId:u.user.id,orgId:T[0]?.id})}catch(u){if(u instanceof Error&&u.message.includes("UNIQUE"))return o.json({error:"CONFLICT",message:"User with this email already exists"},409);throw u}}),n.get("/me",(o)=>{let i=o.get("user");try{let u=Tt(t,{userId:i.id});return o.json({userId:i.id,email:i.email,defaultOrgId:u.orgId,defaultDriveId:u.driveId})}catch{return o.json({userId:i.id,email:i.email,defaultOrgId:null,defaultDriveId:null})}}),n}var LT=O(()=>{M()});import{Hono as oN}from"hono";function gT(t,n,o=null){let i=new oN;return i.post("/:orgId/ops",async(u)=>{let T=u.get("user"),E=u.req.param("orgId"),y=await u.req.json(),{op:N,...I}=y;if(!N)return u.json({error:"VALIDATION_ERROR",message:"op is required in request body"},400);let g=I.driveId||I.drive_id;delete I.driveId,delete I.drive_id;let D=Tt(t,{userId:T.id,orgId:E,driveId:g}),$={db:t,s3:n,orgId:D.orgId,driveId:D.driveId,userId:T.id,embeddingProvider:o},C=await It($,N,I);return u.json(C)}),i}var DT=O(()=>{M()});import{Hono as iN}from"hono";function RT(t){let n=new iN;return n.get("/",(o)=>{let i=o.get("user"),u=F(t,i.id);return o.json({orgs:u})}),n.post("/",async(o)=>{let i=o.get("user"),{name:u}=await o.req.json(),T=Dt(t,{name:u,userId:i.id});return o.json(T,201)}),n.get("/:orgId",(o)=>{let i=o.req.param("orgId"),u=Ct(t,i);if(!u)return o.json({error:"NOT_FOUND",message:"Org not found"},404);return o.json(u)}),n.get("/:orgId/drives",(o)=>{let i=o.req.param("orgId"),u=it(t,i);return o.json({drives:u})}),n.post("/:orgId/drives",async(o)=>{let i=o.req.param("orgId"),{name:u}=await o.req.json(),T=ut(t,{orgId:i,name:u});return o.json(T,201)}),n.post("/:orgId/members/invite",async(o)=>{let i=o.req.param("orgId"),{email:u,role:T}=await o.req.json();return Rt(t,{orgId:i,email:u,role:T}),o.json({ok:!0})}),n}var _T=O(()=>{M()});import{Hono as uN}from"hono";function AT(){let t=new uN;return t.get("/openapi.json",(n)=>{return n.json(yn())}),t}var UT=O(()=>{M()});import{Hono as TN}from"hono";import{cors as lT}from"hono/cors";import{bodyLimit as eN}from"hono/body-limit";import{WebStandardStreamableHTTPServerTransport as EN}from"@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js";function ST(t,n,o=null){let i=new TN,u=Z(),T=u.server?.cors?.origins??["*"];if(T.length===1&&T[0]==="*")i.use("*",lT());else i.use("*",lT({origin:T}));i.use("*",eN({maxSize:52428800})),i.use("*",ET(t));let E=u.server?.rateLimit?.requestsPerMinute??60;if(E>0)i.use("/orgs/*",Dn(E)),i.use("/auth/*",Dn(E)),i.use("/mcp",Dn(E));return i.onError((y,N)=>yT(y,N)),i.get("/health",(y)=>y.json({ok:!0,version:W})),i.all("/mcp",async(y)=>{let N=y.get("user"),I=new EN({sessionIdGenerator:void 0,enableJsonResponse:!0});return await TT({db:t,s3:n,embeddingProvider:o}).connect(I),I.handleRequest(y.req.raw,{authInfo:{token:y.req.header("Authorization")?.slice(7)??"",clientId:N.id,scopes:[],extra:{user:{id:N.id,email:N.email}}}})}),i.route("/auth",OT(t)),i.route("/orgs",RT(t)),i.route("/orgs",gT(t,n,o)),i.route("/docs",AT()),i}var rT=O(()=>{M();eT();NT();IT();LT();DT();_T();UT()});var ON={};function wT(){console.log("Shutting down..."),Jo.stop(),process.exit(0)}var Rn,NN,yN,XT=null,IN,Jo;var dT=O(async()=>{M();rT();Rn=Z(),NN=a(),yN=new et(Rn.s3);try{XT=await wt(Rn.embedding)}catch(t){console.warn("Embedding provider unavailable, semantic search disabled:",t)}IN=ST(NN,yN,XT),Jo=Bun.serve({fetch:IN.fetch,port:Rn.server.port,hostname:Rn.server.host});console.log(`agent-fs daemon running on http://${Jo.hostname}:${Jo.port}`);process.on("SIGTERM",wT);process.on("SIGINT",wT)});M();import{Command as LN}from"commander";M();class lo{baseUrl;apiKey;constructor(){let t=Z();this.baseUrl=process.env.AGENT_FS_API_URL??`http://${t.server.host}:${t.server.port}`,this.apiKey=process.env.AGENT_FS_API_KEY??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(T){throw Error(`Cannot connect to agent-fs daemon at ${this.baseUrl}. Is it running? Start with: agent-fs daemon start`)}let u;try{u=await i.json()}catch{let T=await i.text().catch(()=>"");throw Error(`Unexpected response from daemon (${i.status}): ${T||"empty"}`)}if(!i.ok){let T=u.message??u.error??"Request failed",E=u.suggestion?`
159
- Suggestion: ${u.suggestion}`:"";throw Error(`${T}${E}`)}return u}async get(t){return this.request(t)}async post(t,n){return this.request(t,{method:"POST",body:JSON.stringify(n)})}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}}M();import{Command as SE}from"commander";function dt(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 vt(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 Wt(t,n){return t.length>=n?t:t+" ".repeat(n-t.length)}function So(t,n){return t.length>=n?t:" ".repeat(n-t.length)+t}function se(t){let n=t.entries??[];if(n.length===0)return"(empty directory)";let o=Math.max(4,...n.map((y)=>String(y.name).length)),i=Math.max(4,...n.map((y)=>String(y.type).length)),u=Math.max(4,...n.map((y)=>dt(y.size??0).length)),T=Wt("NAME",o)+" "+Wt("TYPE",i)+" "+So("SIZE",u)+" MODIFIED",E=n.map((y)=>Wt(y.name,o)+" "+Wt(y.type,i)+" "+So(dt(y.size??0),u)+" "+vt(y.modifiedAt));return[T,...E].join(`
160
- `)}function fu(t){let o=(t.content??"").split(`
161
- `);if(o.length>0&&o[o.length-1]==="")o.pop();let i=t.offset??1,u=String(i+o.length-1).length;return o.map((T,E)=>`${So(String(i+E),u)} ${T}`).join(`
162
- `)}function tE(t){let n=[["Path",t.path??"-"],["Size",dt(t.size??0)],["Content-Type",t.contentType??"-"],["Author",t.author??"-"],["Version",t.currentVersion!=null?String(t.currentVersion):"-"],["Created",vt(t.createdAt)],["Modified",vt(t.modifiedAt)],["Deleted",t.isDeleted?"yes":"no"]];if(t.embeddingStatus)n.push(["Embedding",t.embeddingStatus]);let o=Math.max(...n.map(([i])=>i.length));return n.map(([i,u])=>`${Wt(i+":",o+1)} ${u}`).join(`
163
- `)}function nE(t){let n=t.versions??[];if(n.length===0)return"(no version history)";return n.map((o)=>{let i=[`v${o.version} ${vt(o.createdAt)} ${o.author??"-"} [${o.operation}]`];if(o.message)i.push(` ${o.message}`);if(o.diffSummary)i.push(` ${o.diffSummary}`);return i.join(`
153
+ LIMIT ?`).all(E,i*2);if(L.length===0)return{results:[]};let y=[],R=new Set;for(let I of L){let _=t.db.select().from(u.contentChunks).where(Fn(u.contentChunks.id,I.chunk_id)).get();if(!_)continue;if(_.driveId!==t.driveId)continue;if(R.has(_.filePath))continue;R.add(_.filePath);let Z=t.db.select().from(u.files).where(Fu(Fn(u.files.path,_.filePath),Fn(u.files.driveId,t.driveId))).get();if(y.push({path:_.filePath,score:1/(1+I.distance),snippet:_.content.slice(0,200),author:Z?.author,modifiedAt:Z?.modifiedAt}),y.length>=i)break}return{results:y}}var vi=D(()=>{P()});import{eq as pt,and as Pu,or as Wu,isNull as Hu}from"drizzle-orm";async function gi(t,n){let o=[pt(u.files.driveId,t.driveId),pt(u.files.isDeleted,!1),Wu(pt(u.files.embeddingStatus,"failed"),Hu(u.files.embeddingStatus),pt(u.files.embeddingStatus,"pending"))];if(n.path){let{like:L}=await import("drizzle-orm"),y=n.path.endsWith("/")?n.path:n.path+"/";o.push(L(u.files.path,y+"%"))}let i=t.db.select({path:u.files.path}).from(u.files).where(Pu(...o)).all(),T=0,E=0,N=0;for(let L of i){let y=$(t.orgId,t.driveId,L.path);try{let R=await t.s3.getObject(y),I=new TextDecoder().decode(R.body);if(ut(t.db,{path:L.path,driveId:t.driveId,content:I}),t.embeddingProvider)await Yn(t.db,t.embeddingProvider,{path:L.path,driveId:t.driveId,content:I});else{N++;continue}T++}catch(R){console.error(`Reindex failed for ${L.path}:`,R),E++}}return{reindexed:T,failed:E,skipped:N}}var Ki=D(()=>{P();C();Ct()});import{eq as ei,and as Cu,like as vu}from"drizzle-orm";async function Vi(t,n){let o=Et(n.path??"/"),i=$(t.orgId,t.driveId,o),{objects:T}=await t.s3.listObjects(i),E=t.db.select().from(u.files).where(Cu(ei(u.files.driveId,t.driveId),vu(u.files.path,o+"%"),ei(u.files.isDeleted,!1))).all(),N=new Map(E.map((y)=>[y.path,y])),L=[];for(let y of T){let R=y.key.slice(i.length);if(!R)continue;let I=R.split("/").filter(Boolean);if(I.length===0)continue;if(n.depth!==void 0&&I.length>n.depth)continue;let _=L;for(let Z=0;Z<I.length;Z++){let H=I[Z],q=Z===I.length-1,kt=!q||R.endsWith("/");if(kt&&!q){let v=_.find((f)=>f.name===H&&f.type==="directory");if(!v)v={name:H,type:"directory",children:[]},_.push(v);if(!v.children)v.children=[];_=v.children}else if(kt&&q){let v=_.find((f)=>f.name===H&&f.type==="directory");if(!v)v={name:H,type:"directory",children:[]},_.push(v)}else{let v=o+I.slice(0,Z+1).join("/"),f=N.get(v),Un={name:H,type:"file",size:f?.size??y.size};if(f?.author)Un.author=f.author;if(f?.modifiedAt??y.lastModified)Un.modifiedAt=f?.modifiedAt??y.lastModified;_.push(Un)}}}return{tree:L}}var li=D(()=>{P();C()});import{eq as qi,and as gu,like as Ku}from"drizzle-orm";function eu(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 di(t,n){let o=n.path?Et(n.path):"/",i=$(t.orgId,t.driveId,o),{objects:T}=await t.s3.listObjects(i),E=t.db.select().from(u.files).where(gu(qi(u.files.driveId,t.driveId),Ku(u.files.path,o+"%"),qi(u.files.isDeleted,!1))).all(),N=new Map(E.map((R)=>[R.path,R])),L=eu(n.pattern),y=[];for(let R of T){let I=R.key.slice(i.length);if(!I||I.endsWith("/"))continue;if(L.test(I)){let _=o+I,Z=N.get(_);y.push({path:_,size:Z?.size??R.size,modifiedAt:Z?.modifiedAt??R.lastModified})}}return{matches:y}}var ki=D(()=>{P();C()});import{eq as M,and as nt,sql as Pn,desc as fi}from"drizzle-orm";function Wn(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 ht(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 rt(t,n){let o=new Date,i=crypto.randomUUID(),T=n.path;if(n.parentId){let N=t.db.select().from(u.comments).where(nt(M(u.comments.id,n.parentId),M(u.comments.isDeleted,!1))).get();if(!N)throw new G("Parent comment not found",{suggestion:"Check that the parent comment ID is correct and not deleted"});if(N.parentId)throw new z("Cannot reply to a reply \u2014 only root comments accept replies",{suggestion:"Reply to the root comment instead"});if(!T)T=N.path}if(!T)throw new z("path is required for root comments",{field:"path"});let E=t.db.select({id:u.fileVersions.id}).from(u.fileVersions).where(nt(M(u.fileVersions.path,T),M(u.fileVersions.driveId,t.driveId))).orderBy(fi(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:T,lineStart:n.lineStart??null,lineEnd:n.lineEnd??null,quotedContent:n.quotedContent??null,fileVersionId:E?.id??null,body:n.body,author:t.userId,resolved:!1,createdAt:o,updatedAt:o,isDeleted:!1}).run(),Wn(t,{type:"comment_created",resourceType:"comment",resourceId:i,metadata:{path:T,parentId:n.parentId}}),{id:i,path:T,body:n.body,parentId:n.parentId,lineStart:n.lineStart,lineEnd:n.lineEnd,author:t.userId,createdAt:o}}async function mt(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(Pn`${u.comments.parentId} IS NULL`),o.push(M(u.comments.resolved,!1));else if(n.parentId===void 0&&n.resolved)o.push(Pn`${u.comments.parentId} IS NULL`);if(n.orgId)o.push(M(u.comments.orgId,n.orgId));let i=n.limit??50,T=n.offset??0;return{comments:t.db.select().from(u.comments).where(nt(...o)).orderBy(fi(u.comments.createdAt)).limit(i).offset(T).all().map((L)=>{let R=t.db.select().from(u.comments).where(nt(M(u.comments.parentId,L.id),M(u.comments.isDeleted,!1))).orderBy(u.comments.createdAt).all().map((I)=>ht({...I,replyCount:0}));return{...ht({...L,replyCount:R.length}),replies:R}})}}async function xt(t,n){let o=t.db.select().from(u.comments).where(nt(M(u.comments.id,n.id),M(u.comments.isDeleted,!1))).get();if(!o)throw new G("Comment not found",{suggestion:"Check that the comment ID is correct"});let i=t.db.select({count:Pn`count(*)`}).from(u.comments).where(nt(M(u.comments.parentId,o.id),M(u.comments.isDeleted,!1))).get(),T=ht({...o,replyCount:i?.count??0}),N=t.db.select().from(u.comments).where(nt(M(u.comments.parentId,n.id),M(u.comments.isDeleted,!1))).orderBy(u.comments.createdAt).all().map((L)=>ht({...L,replyCount:0}));return{comment:T,replies:N}}async function ct(t,n){let o=t.db.select().from(u.comments).where(nt(M(u.comments.id,n.id),M(u.comments.isDeleted,!1))).get();if(!o)throw new G("Comment not found",{suggestion:"Check that the comment ID is correct"});if(o.author!==t.userId)throw new j("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 at(t,n){let o=t.db.select().from(u.comments).where(nt(M(u.comments.id,n.id),M(u.comments.isDeleted,!1))).get();if(!o)throw new G("Comment not found",{suggestion:"Check that the comment ID is correct"});if(o.author!==t.userId)throw new j("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 Wn(t,{type:"comment_deleted",resourceType:"comment",resourceId:n.id}),{deleted:!0}}async function st(t,n){let o=t.db.select().from(u.comments).where(nt(M(u.comments.id,n.id),M(u.comments.isDeleted,!1))).get();if(!o)throw new G("Comment not found",{suggestion:"Check that the comment ID is correct"});if(o.parentId)throw new z("Cannot resolve a reply \u2014 only root comments can be resolved",{suggestion:"Resolve the parent comment instead"});let i=new Date,T=n.resolved?i:null,E=n.resolved?t.userId:null;return t.db.update(u.comments).set({resolved:n.resolved,resolvedBy:E,resolvedAt:T,updatedAt:i}).where(M(u.comments.id,n.id)).run(),Wn(t,{type:n.resolved?"comment_resolved":"comment_reopened",resourceType:"comment",resourceId:n.id}),{id:n.id,resolved:n.resolved,resolvedBy:E??void 0,resolvedAt:T??void 0}}var ji=D(()=>{P();d()});import{z as O}from"zod";async function yt(t,n,o,i){let T=Hn[n];if(!T)throw Error(`Unknown operation: ${n}`);if(!i?.skipAuth){let N=Wt(n);Ht(t.db,{userId:t.userId,driveId:t.driveId,requiredRole:N})}let E=T.schema.parse(o);return T.handler(t,E)}function $t(){return Object.keys(Hn)}function Lt(t){return Hn[t]}var Hn;var Cn=D(()=>{zt();xo();ao();ti();oi();Ei();yi();Ri();Di();_i();Ui();Zi();Bi();Yi();Qi();Pi();Hi();vi();Ki();li();ki();ji();Hn={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:mo,schema:O.object({path:O.string(),content:O.string(),message:O.string().optional(),expectedVersion:O.number().int().optional()})},cat:{description:"Read file content with optional pagination via offset/limit. Returns { content, totalLines, truncated }.",handler:co,schema:O.object({path:O.string(),offset:O.number().int().min(0).optional(),limit:O.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:so,schema:O.object({path:O.string(),old_string:O.string(),new_string:O.string(),message:O.string().optional()})},append:{description:"Append content to the end of an existing file. Creates a new version. Returns { version, size }.",handler:ni,schema:O.object({path:O.string(),content:O.string(),message:O.string().optional()})},ls:{description:"List immediate children of a directory. Returns { entries } where each entry has name, type (file/directory), size, author, modifiedAt.",handler:Ti,schema:O.object({path:O.string().optional()})},stat:{description:"Get file metadata without reading content. Returns path, size, contentType, author, currentVersion, createdAt, modifiedAt, isDeleted, embeddingStatus.",handler:Ni,schema:O.object({path:O.string()})},rm:{description:"Delete a file. Removes from S3, cleans up FTS5 index and vector embeddings. Returns { path, deleted }.",handler:Li,schema:O.object({path:O.string()})},mv:{description:"Move or rename a file. Preserves version history at the new path. Returns { from, to, version }.",handler:Ii,schema:O.object({from:O.string(),to:O.string(),message:O.string().optional()})},cp:{description:"Copy a file using server-side S3 copy. Creates a new version at the destination. Returns { from, to, version }.",handler:Oi,schema:O.object({from:O.string(),to:O.string()})},tail:{description:"Read the last N lines of a file (default 20). Returns { content, totalLines, truncated }.",handler:Ai,schema:O.object({path:O.string(),lines:O.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:Xi,schema:O.object({path:O.string(),limit:O.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:$i,schema:O.object({path:O.string(),v1:O.number().int(),v2:O.number().int()})},revert:{description:"Revert a file to a previous version. Creates a new version with the old content. Returns { version, revertedTo }.",handler:Mi,schema:O.object({path:O.string(),version:O.number().int()})},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:Gi,schema:O.object({path:O.string().optional(),since:O.coerce.date().optional(),limit:O.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:Fi,schema:O.object({pattern:O.string(),path:O.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:Wi,schema:O.object({pattern:O.string(),path:O.string().optional()})},search:{description:"Semantic/vector search using natural language queries. Requires an embedding provider (OPENAI_API_KEY or GEMINI_API_KEY). Returns { results } ranked by relevance.",handler:Ci,schema:O.object({query:O.string(),limit:O.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:gi,schema:O.object({path:O.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:Vi,schema:O.object({path:O.string().optional(),depth:O.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:di,schema:O.object({pattern:O.string(),path:O.string().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:rt,schema:O.object({path:O.string().optional(),body:O.string(),parentId:O.string().optional(),lineStart:O.number().int().optional(),lineEnd:O.number().int().optional(),quotedContent:O.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:mt,schema:O.object({path:O.string().optional(),parentId:O.string().optional(),resolved:O.boolean().optional(),orgId:O.string().optional(),limit:O.number().int().min(1).optional(),offset:O.number().int().min(0).optional()})},"comment-get":{description:"Get a single comment by ID with all its replies. Returns { comment, replies }.",handler:xt,schema:O.object({id:O.string()})},"comment-update":{description:"Update a comment's body. Only the original author can update. Returns { id, body, updatedAt }.",handler:ct,schema:O.object({id:O.string(),body:O.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:at,schema:O.object({id:O.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:st,schema:O.object({id:O.string(),resolved:O.boolean()})}}});import{eq as zi}from"drizzle-orm";function Dt(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 Ot(t,n){return t.select().from(u.drives).where(zi(u.drives.orgId,n)).all().map((o)=>({id:o.id,name:o.name,isDefault:o.isDefault}))}function vn(t,n){let o=t.select().from(u.drives).where(zi(u.drives.id,n)).get();if(!o)return null;return{id:o.id,name:o.name,orgId:o.orgId,isDefault:o.isDefault}}function gn(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 Kn=D(()=>{P()});import{eq as vt}from"drizzle-orm";function _t(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 T=Dt(t,{orgId:o,name:"default",isDefault:!0});return t.insert(u.driveMembers).values({driveId:T.id,userId:n.userId,role:"admin"}).run(),{id:o,name:n.name}}function V(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,vt(u.orgMembers.orgId,u.orgs.id)).where(vt(u.orgMembers.userId,n)).all().map((i)=>({id:i.orgId,name:i.name,role:i.role,isPersonal:i.isPersonal}))}function gt(t,n){let o=t.select().from(u.orgs).where(vt(u.orgs.id,n)).get();if(!o)return null;return{id:o.id,name:o.name,isPersonal:o.isPersonal}}function Kt(t,n){let o=t.select().from(u.users).where(vt(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(vt(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 en=D(()=>{P();Kn()});import{eq as bi}from"drizzle-orm";function pi(t){let n=new Bun.CryptoHasher("sha256");return n.update(t),n.digest("hex")}function Vu(){let t=new Uint8Array(32);return crypto.getRandomValues(t),`af_${Array.from(t,(o)=>o.toString(16).padStart(2,"0")).join("")}`}function lu(){return crypto.randomUUID()}function b(t,n){let o=lu(),i=Vu(),T=pi(i),E=new Date;return t.insert(u.users).values({id:o,email:n.email,apiKeyHash:T,createdAt:E}).run(),_t(t,{name:n.email.split("@")[0],userId:o,isPersonal:!0}),{user:{id:o,email:n.email},apiKey:i}}function ot(t,n){let o=pi(n),i=t.select().from(u.users).where(bi(u.users.apiKeyHash,o)).get();if(!i)return null;return{id:i.id,email:i.email}}function Vn(t,n){let o=t.select().from(u.users).where(bi(u.users.email,n)).get();if(!o)return null;return{id:o.id,email:o.email}}var ln=D(()=>{P();en()});import{eq as Rt,and as qn}from"drizzle-orm";function p(t,n){if(n.driveId){let E=t.select().from(u.drives).where(Rt(u.drives.id,n.driveId)).get();if(!E)throw Error(`Drive not found: ${n.driveId}`);let N=tt(t,n.userId,n.driveId);if(!N)throw Error("You do not have access to this drive");return{orgId:E.orgId,driveId:n.driveId,role:N}}if(n.orgId){let E=t.select().from(u.drives).where(qn(Rt(u.drives.orgId,n.orgId),Rt(u.drives.isDefault,!0))).get();if(!E)throw Error(`No default drive for org: ${n.orgId}`);let N=tt(t,n.userId,E.id);if(!N)throw Error("You do not have access to this drive");return{orgId:n.orgId,driveId:E.id,role:N}}let o=t.select({orgId:u.orgMembers.orgId}).from(u.orgMembers).innerJoin(u.orgs,Rt(u.orgMembers.orgId,u.orgs.id)).where(qn(Rt(u.orgMembers.userId,n.userId),Rt(u.orgs.isPersonal,!0))).get();if(!o)throw Error("No personal org found for user");let i=t.select().from(u.drives).where(qn(Rt(u.drives.orgId,o.orgId),Rt(u.drives.isDefault,!0))).get();if(!i)throw Error("No default drive found");let T=tt(t,n.userId,i.id);if(!T)throw Error("You do not have access to your default drive");return{orgId:o.orgId,driveId:i.id,role:T}}var hi=D(()=>{P();zt()});function et(t){let n=B();if(n.auth.apiKey){if(ot(t,n.auth.apiKey))return{apiKey:n.auth.apiKey}}console.error("[agent-fs] No local user found, creating one...");let o=b(t,{email:"local@agent-fs.local"});return S("auth.apiKey",o.apiKey),console.error("[agent-fs] Local user created automatically."),{apiKey:o.apiKey}}var ri=D(()=>{Gt();ln()});var mi=D(()=>{ln();en();Kn();zt();hi();ri()});var ci;var xi=D(()=>{ci={name:"agent-fs",version:"0.3.0",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"},devDependencies:{"bun-types":"^1.2.0",typescript:"^5.7.0",yaml:"^2.8.2","zod-to-json-schema":"^3.25.1"}}});var l;var dn=D(()=>{xi();l=ci.version});var si={};Ut(si,{LocalEmbeddingProvider:()=>ai});import{join as du}from"path";import{mkdirSync as ku,existsSync as fu}from"fs";class ai{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=du(m(),"models");if(!fu(o))ku(o,{recursive:!0});console.error("[agent-fs] Resolving local embedding model...");let i=await n(ju,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 ju="hf:nomic-ai/nomic-embed-text-v1.5-GGUF:Q8_0";var tT=D(()=>{Gt()});var kn={};Ut(kn,{OpenAIEmbeddingProvider:()=>nT});import zu from"openai";class nT{name="openai";dimensions=768;client;constructor(t){this.client=new zu({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 fn=()=>{};var jn={};Ut(jn,{GeminiEmbeddingProvider:()=>oT});import{GoogleGenAI as bu}from"@google/genai";class oT{name="gemini";dimensions=768;client;constructor(t){this.client=new bu({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 zn=()=>{};async function iT(t){switch(t.provider){case"local":{let{LocalEmbeddingProvider:n}=await Promise.resolve().then(() => (tT(),si));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(() => (fn(),kn));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(() => (zn(),jn));return new n(t.apiKey)}default:throw Error(`Unknown embedding provider: ${t.provider}`)}}async function Bt(t){if(process.env.OPENAI_API_KEY)try{let{OpenAIEmbeddingProvider:n}=await Promise.resolve().then(() => (fn(),kn));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(() => (zn(),jn));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 iT(t)}catch(n){console.error("[agent-fs] Failed to create embedding provider from config:",n)}if(t?.provider==="local")try{return await iT(t)}catch(n){console.error("[agent-fs] Failed to load local embedding provider:",n)}return null}var ET,TT,uT=(t)=>typeof t==="string"?{...TT,name:t}:{...TT,...t};var tn=D(()=>{ET=Symbol("Let zodToJsonSchema decide on which parser to use"),TT={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 NT=(t)=>{let n=uT(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,T])=>[T._def,{def:T._def,path:[...n.basePath,n.definitionPath,i],jsonSchema:void 0}]))}};var bn=D(()=>{tn()});function pn(t,n,o,i){if(!i?.errorMessages)return;if(o)t.errorMessage={...t.errorMessage,[n]:o}}function w(t,n,o,i,T){t[n]=o,pn(t,n,i,T)}var nn=(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 Q(t){if(t.target!=="openAi")return{};let n=[...t.basePath,t.definitionPath,t.openAiAnyTypeName];return t.flags.hasReferencedOpenAiAnyType=!0,{$ref:t.$refStrategy==="relative"?nn(n,t.currentPath):n.join("/")}}var k=()=>{};import{ZodFirstPartyTypeKind as pu}from"zod/v3";function yT(t,n){let o={type:"array"};if(t.type?._def&&t.type?._def?.typeName!==pu.ZodAny)o.items=U(t.type._def,{...n,currentPath:[...n.currentPath,"items"]});if(t.minLength)w(o,"minItems",t.minLength.value,t.minLength.message,n);if(t.maxLength)w(o,"maxItems",t.maxLength.value,t.maxLength.message,n);if(t.exactLength)w(o,"minItems",t.exactLength.value,t.exactLength.message,n),w(o,"maxItems",t.exactLength.value,t.exactLength.message,n);return o}var hn=D(()=>{W()});function LT(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)w(o,"minimum",i.value,i.message,n);else w(o,"exclusiveMinimum",i.value,i.message,n);else{if(!i.inclusive)o.exclusiveMinimum=!0;w(o,"minimum",i.value,i.message,n)}break;case"max":if(n.target==="jsonSchema7")if(i.inclusive)w(o,"maximum",i.value,i.message,n);else w(o,"exclusiveMaximum",i.value,i.message,n);else{if(!i.inclusive)o.exclusiveMaximum=!0;w(o,"maximum",i.value,i.message,n)}break;case"multipleOf":w(o,"multipleOf",i.value,i.message,n);break}return o}var rn=()=>{};function RT(){return{type:"boolean"}}function on(t,n){return U(t.type._def,n)}var Tn=D(()=>{W()});var IT=(t,n)=>{return U(t.innerType._def,n)};var mn=D(()=>{W()});function xn(t,n,o){let i=o??n.dateStrategy;if(Array.isArray(i))return{anyOf:i.map((T,E)=>xn(t,n,T))};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 hu(t,n)}}var hu=(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":w(o,"minimum",i.value,i.message,n);break;case"max":w(o,"maximum",i.value,i.message,n);break}return o};var cn=()=>{};function DT(t,n){return{...U(t.innerType._def,n),default:t.defaultValue()}}var an=D(()=>{W()});function OT(t,n){return n.effectStrategy==="input"?U(t.schema._def,n):Q(n)}var sn=D(()=>{W();k()});function _T(t){return{type:"string",enum:Array.from(t.values)}}function AT(t,n){let o=[U(t.left._def,{...n,currentPath:[...n.currentPath,"allOf","0"]}),U(t.right._def,{...n,currentPath:[...n.currentPath,"allOf","1"]})].filter((E)=>!!E),i=n.target==="jsonSchema2019-09"?{unevaluatedProperties:!1}:void 0,T=[];return o.forEach((E)=>{if(ru(E)){if(T.push(...E.allOf),E.unevaluatedProperties===void 0)i=void 0}else{let N=E;if("additionalProperties"in E&&E.additionalProperties===!1){let{additionalProperties:L,...y}=E;N=y}else i=void 0;T.push(N)}}),T.length?{allOf:T,...i}:void 0}var ru=(t)=>{if("type"in t&&t.type==="string")return!1;return"allOf"in t};var to=D(()=>{W()});function UT(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 En(t,n){let o={type:"string"};if(t.checks)for(let i of t.checks)switch(i.kind){case"min":w(o,"minLength",typeof o.minLength==="number"?Math.max(o.minLength,i.value):i.value,i.message,n);break;case"max":w(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":r(o,"email",i.message,n);break;case"format:idn-email":r(o,"idn-email",i.message,n);break;case"pattern:zod":e(o,h.email,i.message,n);break}break;case"url":r(o,"uri",i.message,n);break;case"uuid":r(o,"uuid",i.message,n);break;case"regex":e(o,i.regex,i.message,n);break;case"cuid":e(o,h.cuid,i.message,n);break;case"cuid2":e(o,h.cuid2,i.message,n);break;case"startsWith":e(o,RegExp(`^${oo(i.value,n)}`),i.message,n);break;case"endsWith":e(o,RegExp(`${oo(i.value,n)}$`),i.message,n);break;case"datetime":r(o,"date-time",i.message,n);break;case"date":r(o,"date",i.message,n);break;case"time":r(o,"time",i.message,n);break;case"duration":r(o,"duration",i.message,n);break;case"length":w(o,"minLength",typeof o.minLength==="number"?Math.max(o.minLength,i.value):i.value,i.message,n),w(o,"maxLength",typeof o.maxLength==="number"?Math.min(o.maxLength,i.value):i.value,i.message,n);break;case"includes":{e(o,RegExp(oo(i.value,n)),i.message,n);break}case"ip":{if(i.version!=="v6")r(o,"ipv4",i.message,n);if(i.version!=="v4")r(o,"ipv6",i.message,n);break}case"base64url":e(o,h.base64url,i.message,n);break;case"jwt":e(o,h.jwt,i.message,n);break;case"cidr":{if(i.version!=="v6")e(o,h.ipv4Cidr,i.message,n);if(i.version!=="v4")e(o,h.ipv6Cidr,i.message,n);break}case"emoji":e(o,h.emoji(),i.message,n);break;case"ulid":{e(o,h.ulid,i.message,n);break}case"base64":{switch(n.base64Strategy){case"format:binary":{r(o,"binary",i.message,n);break}case"contentEncoding:base64":{w(o,"contentEncoding","base64",i.message,n);break}case"pattern:zod":{e(o,h.base64,i.message,n);break}}break}case"nanoid":e(o,h.nanoid,i.message,n);case"toLowerCase":case"toUpperCase":case"trim":break;default:((T)=>{})(i)}return o}function oo(t,n){return n.patternStrategy==="escape"?xu(t):t}function xu(t){let n="";for(let o=0;o<t.length;o++){if(!mu.has(t[o]))n+="\\";n+=t[o]}return n}function r(t,n,o,i){if(t.format||t.anyOf?.some((T)=>T.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 w(t,"format",n,o,i)}function e(t,n,o,i){if(t.pattern||t.allOf?.some((T)=>T.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:ST(n,i),...o&&i.errorMessages&&{errorMessage:{pattern:o}}})}else w(t,"pattern",ST(n,i),o,i)}function ST(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,T="",E=!1,N=!1,L=!1;for(let y=0;y<i.length;y++){if(E){T+=i[y],E=!1;continue}if(o.i){if(N){if(i[y].match(/[a-z]/)){if(L)T+=i[y],T+=`${i[y-2]}-${i[y]}`.toUpperCase(),L=!1;else if(i[y+1]==="-"&&i[y+2]?.match(/[a-z]/))T+=i[y],L=!0;else T+=`${i[y]}${i[y].toUpperCase()}`;continue}}else if(i[y].match(/[a-z]/)){T+=`[${i[y]}${i[y].toUpperCase()}]`;continue}}if(o.m){if(i[y]==="^"){T+=`(^|(?<=[\r
154
+ ]))`;continue}else if(i[y]==="$"){T+=`($|(?=[\r
155
+ ]))`;continue}}if(o.s&&i[y]==="."){T+=N?`${i[y]}\r
156
+ `:`[${i[y]}\r
157
+ ]`;continue}if(T+=i[y],i[y]==="\\")E=!0;else if(N&&i[y]==="]")N=!1;else if(!N&&i[y]==="[")N=!0}try{new RegExp(T)}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 T}var no=void 0,h,mu;var un=D(()=>{h={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(no===void 0)no=RegExp("^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$","u");return no},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-_]*$/};mu=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789")});import{ZodFirstPartyTypeKind as Vt}from"zod/v3";function Nn(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===Vt.ZodEnum)return{type:"object",required:t.keyType._def.values,properties:t.keyType._def.values.reduce((i,T)=>({...i,[T]:U(t.valueType._def,{...n,currentPath:[...n.currentPath,"properties",T]})??Q(n)}),{}),additionalProperties:n.rejectedAdditionalProperties};let o={type:"object",additionalProperties:U(t.valueType._def,{...n,currentPath:[...n.currentPath,"additionalProperties"]})??n.allowedAdditionalProperties};if(n.target==="openApi3")return o;if(t.keyType?._def.typeName===Vt.ZodString&&t.keyType._def.checks?.length){let{type:i,...T}=En(t.keyType._def,n);return{...o,propertyNames:T}}else if(t.keyType?._def.typeName===Vt.ZodEnum)return{...o,propertyNames:{enum:t.keyType._def.values}};else if(t.keyType?._def.typeName===Vt.ZodBranded&&t.keyType._def.type._def.typeName===Vt.ZodString&&t.keyType._def.type._def.checks?.length){let{type:i,...T}=on(t.keyType._def,n);return{...o,propertyNames:T}}return o}var yn=D(()=>{W();un();Tn();k()});function XT(t,n){if(n.mapStrategy==="record")return Nn(t,n);let o=U(t.keyType._def,{...n,currentPath:[...n.currentPath,"items","items","0"]})||Q(n),i=U(t.valueType._def,{...n,currentPath:[...n.currentPath,"items","items","1"]})||Q(n);return{type:"array",maxItems:125,items:{type:"array",items:[o,i],minItems:2,maxItems:2}}}var io=D(()=>{W();yn();k()});function ZT(t){let n=t.values,i=Object.keys(t.values).filter((E)=>{return typeof n[n[E]]!=="number"}).map((E)=>n[E]),T=Array.from(new Set(i.map((E)=>typeof E)));return{type:T.length===1?T[0]==="string"?"string":"number":["string","number"],enum:i}}function wT(t){return t.target==="openAi"?void 0:{not:Q({...t,currentPath:[...t.currentPath,"not"]})}}var To=D(()=>{k()});function $T(t){return t.target==="openApi3"?{enum:["null"],nullable:!0}:{type:"null"}}function MT(t,n){if(n.target==="openApi3")return BT(t,n);let o=t.options instanceof Map?Array.from(t.options.values()):t.options;if(o.every((i)=>(i._def.typeName in lt)&&(!i._def.checks||!i._def.checks.length))){let i=o.reduce((T,E)=>{let N=lt[E._def.typeName];return N&&!T.includes(N)?[...T,N]:T},[]);return{type:i.length>1?i:i[0]}}else if(o.every((i)=>i._def.typeName==="ZodLiteral"&&!i.description)){let i=o.reduce((T,E)=>{let N=typeof E._def.value;switch(N){case"string":case"number":case"boolean":return[...T,N];case"bigint":return[...T,"integer"];case"object":if(E._def.value===null)return[...T,"null"];case"symbol":case"undefined":case"function":default:return T}},[]);if(i.length===o.length){let T=i.filter((E,N,L)=>L.indexOf(E)===N);return{type:T.length>1?T:T[0],enum:o.reduce((E,N)=>{return E.includes(N._def.value)?E:[...E,N._def.value]},[])}}}else if(o.every((i)=>i._def.typeName==="ZodEnum"))return{type:"string",enum:o.reduce((i,T)=>[...i,...T._def.values.filter((E)=>!i.includes(E))],[])};return BT(t,n)}var lt,BT=(t,n)=>{let o=(t.options instanceof Map?Array.from(t.options.values()):t.options).map((i,T)=>U(i._def,{...n,currentPath:[...n.currentPath,"anyOf",`${T}`]})).filter((i)=>!!i&&(!n.strictUnions||typeof i==="object"&&Object.keys(i).length>0));return o.length?{anyOf:o}:void 0};var Ln=D(()=>{W();lt={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"}});function YT(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:lt[t.innerType._def.typeName],nullable:!0};return{type:[lt[t.innerType._def.typeName],"null"]}}if(n.target==="openApi3"){let i=U(t.innerType._def,{...n,currentPath:[...n.currentPath]});if(i&&"$ref"in i)return{allOf:[i],nullable:!0};return i&&{...i,nullable:!0}}let o=U(t.innerType._def,{...n,currentPath:[...n.currentPath,"anyOf","0"]});return o&&{anyOf:[o,{type:"null"}]}}var Eo=D(()=>{W();Ln()});function JT(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",pn(o,"type",i.message,n);break;case"min":if(n.target==="jsonSchema7")if(i.inclusive)w(o,"minimum",i.value,i.message,n);else w(o,"exclusiveMinimum",i.value,i.message,n);else{if(!i.inclusive)o.exclusiveMinimum=!0;w(o,"minimum",i.value,i.message,n)}break;case"max":if(n.target==="jsonSchema7")if(i.inclusive)w(o,"maximum",i.value,i.message,n);else w(o,"exclusiveMaximum",i.value,i.message,n);else{if(!i.inclusive)o.exclusiveMaximum=!0;w(o,"maximum",i.value,i.message,n)}break;case"multipleOf":w(o,"multipleOf",i.value,i.message,n);break}return o}var uo=()=>{};function GT(t,n){let o=n.target==="openAi",i={type:"object",properties:{}},T=[],E=t.shape();for(let L in E){let y=E[L];if(y===void 0||y._def===void 0)continue;let R=au(y);if(R&&o){if(y._def.typeName==="ZodOptional")y=y._def.innerType;if(!y.isNullable())y=y.nullable();R=!1}let I=U(y._def,{...n,currentPath:[...n.currentPath,"properties",L],propertyPath:[...n.currentPath,"properties",L]});if(I===void 0)continue;if(i.properties[L]=I,!R)T.push(L)}if(T.length)i.required=T;let N=cu(t,n);if(N!==void 0)i.additionalProperties=N;return i}function cu(t,n){if(t.catchall._def.typeName!=="ZodNever")return U(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 au(t){try{return t.isOptional()}catch{return!0}}var No=D(()=>{W()});var QT=(t,n)=>{if(n.currentPath.toString()===n.propertyPath?.toString())return U(t.innerType._def,n);let o=U(t.innerType._def,{...n,currentPath:[...n.currentPath,"anyOf","1"]});return o?{anyOf:[{not:Q(n)},o]}:Q(n)};var yo=D(()=>{W();k()});var FT=(t,n)=>{if(n.pipeStrategy==="input")return U(t.in._def,n);else if(n.pipeStrategy==="output")return U(t.out._def,n);let o=U(t.in._def,{...n,currentPath:[...n.currentPath,"allOf","0"]}),i=U(t.out._def,{...n,currentPath:[...n.currentPath,"allOf",o?"1":"0"]});return{allOf:[o,i].filter((T)=>T!==void 0)}};var Lo=D(()=>{W()});function PT(t,n){return U(t.type._def,n)}var Ro=D(()=>{W()});function WT(t,n){let i={type:"array",uniqueItems:!0,items:U(t.valueType._def,{...n,currentPath:[...n.currentPath,"items"]})};if(t.minSize)w(i,"minItems",t.minSize.value,t.minSize.message,n);if(t.maxSize)w(i,"maxItems",t.maxSize.value,t.maxSize.message,n);return i}var Io=D(()=>{W()});function HT(t,n){if(t.rest)return{type:"array",minItems:t.items.length,items:t.items.map((o,i)=>U(o._def,{...n,currentPath:[...n.currentPath,"items",`${i}`]})).reduce((o,i)=>i===void 0?o:[...o,i],[]),additionalItems:U(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)=>U(o._def,{...n,currentPath:[...n.currentPath,"items",`${i}`]})).reduce((o,i)=>i===void 0?o:[...o,i],[])}}var Do=D(()=>{W()});function CT(t){return{not:Q(t)}}var Oo=D(()=>{k()});function vT(t){return Q(t)}var _o=D(()=>{k()});var gT=(t,n)=>{return U(t.innerType._def,n)};var Ao=D(()=>{W()});import{ZodFirstPartyTypeKind as X}from"zod/v3";var KT=(t,n,o)=>{switch(n){case X.ZodString:return En(t,o);case X.ZodNumber:return JT(t,o);case X.ZodObject:return GT(t,o);case X.ZodBigInt:return LT(t,o);case X.ZodBoolean:return RT();case X.ZodDate:return xn(t,o);case X.ZodUndefined:return CT(o);case X.ZodNull:return $T(o);case X.ZodArray:return yT(t,o);case X.ZodUnion:case X.ZodDiscriminatedUnion:return MT(t,o);case X.ZodIntersection:return AT(t,o);case X.ZodTuple:return HT(t,o);case X.ZodRecord:return Nn(t,o);case X.ZodLiteral:return UT(t,o);case X.ZodEnum:return _T(t);case X.ZodNativeEnum:return ZT(t);case X.ZodNullable:return YT(t,o);case X.ZodOptional:return QT(t,o);case X.ZodMap:return XT(t,o);case X.ZodSet:return WT(t,o);case X.ZodLazy:return()=>t.getter()._def;case X.ZodPromise:return PT(t,o);case X.ZodNaN:case X.ZodNever:return wT(o);case X.ZodEffects:return OT(t,o);case X.ZodAny:return Q(o);case X.ZodUnknown:return vT(o);case X.ZodDefault:return DT(t,o);case X.ZodBranded:return on(t,o);case X.ZodReadonly:return gT(t,o);case X.ZodCatch:return IT(t,o);case X.ZodPipeline:return FT(t,o);case X.ZodFunction:case X.ZodVoid:case X.ZodSymbol:return;default:return((i)=>{return})(n)}};var Uo=D(()=>{k();hn();rn();Tn();mn();cn();an();sn();to();io();To();Eo();uo();No();yo();Lo();Ro();yn();Io();un();Do();Oo();Ln();_o();Ao()});function U(t,n,o=!1){let i=n.seen.get(t);if(n.override){let L=n.override?.(t,n,i,o);if(L!==ET)return L}if(i&&!o){let L=su(i,n);if(L!==void 0)return L}let T={def:t,path:n.currentPath,jsonSchema:void 0};n.seen.set(t,T);let E=KT(t,t.typeName,n),N=typeof E==="function"?U(E(),n):E;if(N)tN(t,n,N);if(n.postProcess){let L=n.postProcess(N,t,n);return T.jsonSchema=N,L}return T.jsonSchema=N,N}var su=(t,n)=>{switch(n.$refStrategy){case"root":return{$ref:t.path.join("/")};case"relative":return{$ref:nn(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`),Q(n);return n.$refStrategy==="seen"?Q(n):void 0}}},tN=(t,n,o)=>{if(t.description){if(o.description=t.description,n.markdownDescription)o.markdownDescription=t.description}return o};var W=D(()=>{tn();Uo();k()});var eT=()=>{};var So=(t,n)=>{let o=NT(n),i=typeof n==="object"&&n.definitions?Object.entries(n.definitions).reduce((y,[R,I])=>({...y,[R]:U(I._def,{...o,currentPath:[...o.basePath,o.definitionPath,R]},!0)??Q(o)}),{}):void 0,T=typeof n==="string"?n:n?.nameStrategy==="title"?void 0:n?.name,E=U(t._def,T===void 0?o:{...o,currentPath:[...o.basePath,o.definitionPath,T]},!1)??Q(o),N=typeof n==="object"&&n.name!==void 0&&n.nameStrategy==="title"?n.name:void 0;if(N!==void 0)E.title=N;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 L=T===void 0?i?{...E,[o.definitionPath]:i}:E:{$ref:[...o.$refStrategy==="relative"?[]:o.basePath,o.definitionPath,T].join("/"),[o.definitionPath]:{...i,[T]:E}};if(o.target==="jsonSchema7")L.$schema="http://json-schema.org/draft-07/schema#";else if(o.target==="jsonSchema2019-09"||o.target==="openAi")L.$schema="https://json-schema.org/draft/2019-09/schema#";if(o.target==="openAi"&&(("anyOf"in L)||("oneOf"in L)||("allOf"in L)||("type"in L)&&Array.isArray(L.type)))console.warn("Warning: OpenAI may not support schemas with unions as roots! Try wrapping it in an object property.");return L};var Xo=D(()=>{W();bn();k()});var VT=D(()=>{Xo();tn();bn();W();eT();k();hn();rn();Tn();mn();cn();an();sn();to();io();To();Eo();uo();No();yo();Lo();Ro();Ao();yn();Io();un();Do();Oo();Ln();_o();Uo();Xo()});function Rn(){let t=$t(),n={},o={};for(let T of t){let E=Lt(T),N=So(E.schema,{target:"openApi3"}),{$schema:L,...y}=N;n[T]=y,o[T]=E.description}let i=t.map((T)=>({type:"object",title:T,description:o[T],required:["op",...n[T].required||[]],properties:{op:{type:"string",const:T},driveId:{type:"string",description:"Target drive ID (optional, uses default drive)"},...n[T].properties||{}},additionalProperties:!1}));return{openapi:"3.1.0",info:{title:"agent-fs API",version:l,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 lT=D(()=>{VT();Cn();dn()});var qT={};Ut(qT,{setDriveMember:()=>gn,setConfigValue:()=>S,setConfig:()=>go,schema:()=>u,resolveContext:()=>p,listUserOrgs:()=>V,listDrives:()=>Ot,inviteToOrg:()=>Kt,getUserDriveRole:()=>tt,getUserByEmail:()=>Vn,getUserByApiKey:()=>ot,getRequiredRole:()=>Wt,getRegisteredOps:()=>$t,getOrg:()=>gt,getOpDefinition:()=>Lt,getHome:()=>m,getDrive:()=>vn,getDbPath:()=>It,getConfigPath:()=>x,getConfig:()=>B,generateOpenAPISpec:()=>Rn,ensureLocalUser:()=>et,dispatchOp:()=>yt,createUser:()=>b,createOrg:()=>_t,createEmbeddingProviderFromEnv:()=>Bt,createDrive:()=>Dt,createDatabase:()=>it,commentUpdate:()=>ct,commentResolve:()=>st,commentList:()=>mt,commentGet:()=>xt,commentDelete:()=>at,commentAdd:()=>rt,checkPermission:()=>Ht,ValidationError:()=>z,VERSION:()=>l,PermissionDeniedError:()=>j,NotFoundError:()=>G,IndexingInProgressError:()=>Pt,EditConflictError:()=>s,AgentS3Client:()=>Tt,AgentFSError:()=>a});var F=D(()=>{P();Gt();ko();d();Cn();mi();dn();lT()});var In={};Ut(In,{stopDaemon:()=>WN,startDaemon:()=>PN,daemonStatus:()=>HN});import{spawn as JN}from"child_process";import{readFileSync as $o,writeFileSync as GN,unlinkSync as bT,existsSync as Bo,openSync as QN}from"fs";import{join as Mo}from"path";function Yo(){return Mo(m(),"agent-fs.pid")}function FN(){return Mo(m(),"agent-fs.log")}function PN(){let t=Yo();if(Bo(t)){let L=parseInt($o(t,"utf-8").trim());try{process.kill(L,0),console.log(`Daemon already running (PID: ${L})`);return}catch{bT(t)}}let n=FN(),o=QN(n,"a"),i=!import.meta.dir.startsWith("/")||import.meta.dir.startsWith("/$bunfs"),T=i?process.execPath:"bun",E=i?["server"]:["run",Mo(import.meta.dir,"index.ts")],N=JN(T,E,{detached:!0,stdio:["ignore",o,o]});if(N.unref(),N.pid)GN(t,String(N.pid)),console.log(`Daemon started (PID: ${N.pid})`),console.log(`Logs: ${n}`)}function WN(){let t=Yo();if(!Bo(t)){console.log("Daemon is not running");return}let n=parseInt($o(t,"utf-8").trim());try{process.kill(n,"SIGTERM"),console.log(`Daemon stopped (PID: ${n})`)}catch{console.log(`Process ${n} not found (already stopped)`)}bT(t)}function HN(){let t=Yo();if(!Bo(t))return{running:!1};let n=parseInt($o(t,"utf-8").trim());try{return process.kill(n,0),{running:!0,pid:n}}catch{return{running:!1}}}var Dn=D(()=>{F()});var ty={};import{Server as pN}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport as hN}from"@modelcontextprotocol/sdk/server/stdio.js";import{Client as rN}from"@modelcontextprotocol/sdk/client/index.js";import{StreamableHTTPClientTransport as mN}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{ListToolsRequestSchema as xN,CallToolRequestSchema as cN}from"@modelcontextprotocol/sdk/types.js";var dt,Jo,nE,aN,Go,Qo,sN;var oE=D(async()=>{F();dt=B(),Jo=process.env.AGENT_FS_API_URL??dt.apiUrl??`http://${dt.server.host}:${dt.server.port}`,nE=process.env.AGENT_FS_API_KEY??dt.apiKey??dt.auth?.apiKey;if(!nE)console.error("Error: No API key. Register with `agent-fs auth register` or set AGENT_FS_API_KEY."),process.exit(1);aN=new mN(new URL(`${Jo}/mcp`),{requestInit:{headers:{Authorization:`Bearer ${nE}`}}}),Go=new rN({name:"agent-fs-proxy",version:l});try{await Go.connect(aN)}catch(t){console.error(`Cannot connect to agent-fs at ${Jo}.
158
+ Start a daemon with \`agent-fs daemon start\` or set AGENT_FS_API_URL to connect to a remote server.`),process.exit(1)}Qo=new pN({name:"agent-fs",version:l},{capabilities:{tools:{}}});Qo.setRequestHandler(xN,async()=>{return await Go.listTools()});Qo.setRequestHandler(cN,async(t)=>{return await Go.callTool(t.params)});sN=new hN;await Qo.connect(sN);console.error("[agent-fs] MCP proxy connected to "+Jo)});import{z as iE}from"zod";function TE(t,n){let o=$t();for(let i of o){let T=Lt(i);if(!T)continue;t.tool(i,T.description,T.schema instanceof iE.ZodObject?T.schema.shape:{params:iE.any()},async(E,N)=>{let L=n(N),y=await yt(L,i,E);return{content:[{type:"text",text:JSON.stringify(y,null,2)}]}})}}var EE=D(()=>{F()});import{McpServer as ny}from"@modelcontextprotocol/sdk/server/mcp.js";function uE(t){let{db:n,s3:o,embeddingProvider:i}=t,T=new ny({name:"agent-fs",version:l}),E=(N)=>{let L=N.authInfo;if(!L?.extra?.user)throw Error("No auth context \u2014 MCP must be accessed through the HTTP server");let y=L.extra.user,R=p(n,{userId:y.id});return{db:n,s3:o,orgId:R.orgId,driveId:R.driveId,userId:y.id,embeddingProvider:i}};return TE(T,E),T.tool("health","Check agent-fs system health: database, S3, embeddings, version.",{},async(N,L)=>{let y={version:l};try{let R=E(L),I=await yt(R,"ls",{path:"/"},{skipAuth:!0});y.database={ok:!0,rootEntries:I.entries?.length??0}}catch(R){y.database={ok:!1,error:R.message}}try{await o.listObjects("",{delimiter:"/"}),y.s3={ok:!0}}catch(R){y.s3={ok:!1,error:R.message}}return y.embeddings={configured:!!i},{content:[{type:"text",text:JSON.stringify(y,null,2)}]}}),T.tool("whoami","Get current user identity, org memberships, and drive roles.",{},async(N,L)=>{let y=E(L),R=y.userId,_=V(n,R).map((q)=>{let kt=Ot(n,q.id);return{orgId:q.id,orgName:q.name,drives:kt.map((v)=>({driveId:v.id,driveName:v.name,role:tt(n,R,v.id)}))}}),Z=L.authInfo?.extra?.user?.email,H={userId:R,...Z?{email:Z}:{},activeOrg:y.orgId,activeDrive:y.driveId,memberships:_};return{content:[{type:"text",text:JSON.stringify(H,null,2)}]}}),T}var NE=D(()=>{F();EE()});function yE(t){return async(n,o)=>{let i=new URL(n.req.url).pathname;if(oy.some((L)=>i===L||i.startsWith(L)))return o();let T=n.req.header("Authorization");if(!T?.startsWith("Bearer "))return n.json({error:"UNAUTHORIZED",message:"Missing or invalid Authorization header",suggestion:"Include 'Authorization: Bearer <api_key>' header"},401);let E=T.slice(7),N=ot(t,E);if(!N)return n.json({error:"UNAUTHORIZED",message:"Invalid API key",suggestion:"Register with POST /auth/register"},401);return n.set("user",N),o()}}var oy;var LE=D(()=>{F();oy=["/auth/register","/health"]});function iy(t){if(t instanceof G)return 404;if(t instanceof j)return 403;if(t instanceof s)return 409;if(t instanceof Pt)return 503;if(t instanceof z)return 400;if("code"in t)return 400;return 500}function RE(t,n){let o=iy(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 IE=D(()=>{F()});function _n(t){let n=new Map;return setInterval(()=>{let o=Date.now()-60000;for(let[i,T]of n){let E=T.filter((N)=>N>o);if(E.length===0)n.delete(i);else n.set(i,E)}},300000).unref(),async(o,i)=>{let T=o.req.header("authorization")??"",E=T.startsWith("Bearer ")?T.slice(7):o.req.header("x-forwarded-for")??"unknown",N=Date.now(),L=N-60000,y=(n.get(E)??[]).filter((R)=>R>L);if(y.length>=t){let R=y[0],I=Math.ceil((R+60000-N)/1000);return o.header("Retry-After",String(I)),o.json({error:"RATE_LIMITED",message:"Too many requests"},429)}y.push(N),n.set(E,y),await i()}}import{Hono as Ty}from"hono";function DE(t){let n=new Ty;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 T=b(t,{email:i}),E=V(t,T.user.id);return o.json({apiKey:T.apiKey,userId:T.user.id,orgId:E[0]?.id})}catch(T){if(T instanceof Error&&T.message.includes("UNIQUE"))return o.json({error:"CONFLICT",message:"User with this email already exists"},409);throw T}}),n.get("/me",(o)=>{let i=o.get("user");try{let T=p(t,{userId:i.id});return o.json({userId:i.id,email:i.email,defaultOrgId:T.orgId,defaultDriveId:T.driveId})}catch{return o.json({userId:i.id,email:i.email,defaultOrgId:null,defaultDriveId:null})}}),n}var OE=D(()=>{F()});import{Hono as Ey}from"hono";function _E(t,n,o=null){let i=new Ey;return i.post("/:orgId/ops",async(T)=>{let E=T.get("user"),N=T.req.param("orgId"),L=await T.req.json(),{op:y,...R}=L;if(!y)return T.json({error:"VALIDATION_ERROR",message:"op is required in request body"},400);let I=R.driveId||R.drive_id;delete R.driveId,delete R.drive_id;let _=p(t,{userId:E.id,orgId:N,driveId:I}),Z={db:t,s3:n,orgId:_.orgId,driveId:_.driveId,userId:E.id,embeddingProvider:o},H=await yt(Z,y,R);return T.json(H)}),i}var AE=D(()=>{F()});import{Hono as uy}from"hono";function UE(t){let n=new uy;return n.get("/",(o)=>{let i=o.get("user"),T=V(t,i.id);return o.json({orgs:T})}),n.post("/",async(o)=>{let i=o.get("user"),{name:T}=await o.req.json(),E=_t(t,{name:T,userId:i.id});return o.json(E,201)}),n.get("/:orgId",(o)=>{let i=o.req.param("orgId"),T=gt(t,i);if(!T)return o.json({error:"NOT_FOUND",message:"Org not found"},404);return o.json(T)}),n.get("/:orgId/drives",(o)=>{let i=o.req.param("orgId"),T=Ot(t,i);return o.json({drives:T})}),n.post("/:orgId/drives",async(o)=>{let i=o.req.param("orgId"),{name:T}=await o.req.json(),E=Dt(t,{orgId:i,name:T});return o.json(E,201)}),n.post("/:orgId/members/invite",async(o)=>{let i=o.req.param("orgId"),{email:T,role:E}=await o.req.json();return Kt(t,{orgId:i,email:T,role:E}),o.json({ok:!0})}),n}var SE=D(()=>{F()});import{Hono as Ny}from"hono";function XE(){let t=new Ny;return t.get("/openapi.json",(n)=>{return n.json(Rn())}),t}var ZE=D(()=>{F()});import{Hono as yy}from"hono";function wE(t,n){let o=new yy;return o.get("/:orgId/drives/:driveId/files/*/raw",async(i)=>{let T=i.get("user"),E=i.req.param("orgId"),N=i.req.param("driveId"),L=p(t,{userId:T.id,orgId:E,driveId:N}),R=new URL(i.req.url).pathname.match(/\/files\/(.+)\/raw$/);if(!R)return i.json({error:"VALIDATION_ERROR",message:"Invalid file path"},400);let I=decodeURIComponent(R[1]),_=$(L.orgId,L.driveId,I);try{let Z=await n.getObject(_),H=Z.contentType||"application/octet-stream";return new Response(Z.body.buffer,{status:200,headers:{"Content-Type":H,"Content-Length":String(Z.body.length),"Cache-Control":"private, max-age=60"}})}catch(Z){if(Z?.name==="NoSuchKey"||Z?.$metadata?.httpStatusCode===404)return i.json({error:"NOT_FOUND",message:`File not found: ${I}`},404);throw Z}}),o}var $E=D(()=>{F();C()});import{Hono as Ly}from"hono";import{cors as BE}from"hono/cors";import{bodyLimit as Ry}from"hono/body-limit";import{WebStandardStreamableHTTPServerTransport as Iy}from"@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js";function ME(t,n,o=null){let i=new Ly,T=B(),E=T.server?.cors?.origins??["*"];if(E.length===1&&E[0]==="*")i.use("*",BE());else i.use("*",BE({origin:E}));i.use("*",Ry({maxSize:52428800})),i.use("*",yE(t));let N=T.server?.rateLimit?.requestsPerMinute??60;if(N>0)i.use("/orgs/*",_n(N)),i.use("/auth/*",_n(N)),i.use("/mcp",_n(N));return i.onError((L,y)=>RE(L,y)),i.get("/health",(L)=>L.json({ok:!0,version:l})),i.all("/mcp",async(L)=>{let y=L.get("user"),R=new Iy({sessionIdGenerator:void 0,enableJsonResponse:!0});return await uE({db:t,s3:n,embeddingProvider:o}).connect(R),R.handleRequest(L.req.raw,{authInfo:{token:L.req.header("Authorization")?.slice(7)??"",clientId:y.id,scopes:[],extra:{user:{id:y.id,email:y.email}}}})}),i.route("/auth",DE(t)),i.route("/orgs",UE(t)),i.route("/orgs",_E(t,n,o)),i.route("/docs",XE()),i.route("/orgs",wE(t,n)),i}var YE=D(()=>{F();NE();LE();IE();OE();AE();SE();ZE();$E()});var Ay={};function GE(){console.log("Shutting down..."),Fo.stop(),process.exit(0)}var An,Dy,Oy,JE=null,_y,Fo;var QE=D(async()=>{F();YE();An=B(),Dy=it(),Oy=new Tt(An.s3);try{JE=await Bt(An.embedding)}catch(t){console.warn("Embedding provider unavailable, semantic search disabled:",t)}_y=ME(Dy,Oy,JE),Fo=Bun.serve({fetch:_y.fetch,port:An.server.port,hostname:An.server.host});console.log(`agent-fs daemon running on http://${Fo.hostname}:${Fo.port}`);process.on("SIGTERM",GE);process.on("SIGINT",GE)});F();import{Command as Uy}from"commander";F();class Zo{baseUrl;apiKey;constructor(){let t=B();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(E){throw Error(`Cannot connect to agent-fs daemon at ${this.baseUrl}. Is it running? Start with: agent-fs daemon start`)}let T;try{T=await i.json()}catch{let E=await i.text().catch(()=>"");throw Error(`Unexpected response from daemon (${i.status}): ${E||"empty"}`)}if(!i.ok){let E=T.message??T.error??"Request failed",N=T.suggestion?`
159
+ Suggestion: ${T.suggestion}`:"";throw Error(`${E}${N}`)}return T}async get(t){return this.request(t)}async post(t,n){return this.request(t,{method:"POST",body:JSON.stringify(n)})}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}}F();import{Command as BN}from"commander";function Mt(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 Yt(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 qt(t,n){return t.length>=n?t:t+" ".repeat(n-t.length)}function wo(t,n){return t.length>=n?t:" ".repeat(n-t.length)+t}function nN(t){let n=t.entries??[];if(n.length===0)return"(empty directory)";let o=Math.max(4,...n.map((L)=>String(L.name).length)),i=Math.max(4,...n.map((L)=>String(L.type).length)),T=Math.max(4,...n.map((L)=>Mt(L.size??0).length)),E=qt("NAME",o)+" "+qt("TYPE",i)+" "+wo("SIZE",T)+" MODIFIED",N=n.map((L)=>qt(L.name,o)+" "+qt(L.type,i)+" "+wo(Mt(L.size??0),T)+" "+Yt(L.modifiedAt));return[E,...N].join(`
160
+ `)}function dT(t){let o=(t.content??"").split(`
161
+ `);if(o.length>0&&o[o.length-1]==="")o.pop();let i=t.offset??1,T=String(i+o.length-1).length;return o.map((E,N)=>`${wo(String(i+N),T)} ${E}`).join(`
162
+ `)}function oN(t){let n=[["Path",t.path??"-"],["Size",Mt(t.size??0)],["Content-Type",t.contentType??"-"],["Author",t.author??"-"],["Version",t.currentVersion!=null?String(t.currentVersion):"-"],["Created",Yt(t.createdAt)],["Modified",Yt(t.modifiedAt)],["Deleted",t.isDeleted?"yes":"no"]];if(t.embeddingStatus)n.push(["Embedding",t.embeddingStatus]);let o=Math.max(...n.map(([i])=>i.length));return n.map(([i,T])=>`${qt(i+":",o+1)} ${T}`).join(`
163
+ `)}function iN(t){let n=t.versions??[];if(n.length===0)return"(no version history)";return n.map((o)=>{let i=[`v${o.version} ${Yt(o.createdAt)} ${o.author??"-"} [${o.operation}]`];if(o.message)i.push(` ${o.message}`);if(o.diffSummary)i.push(` ${o.diffSummary}`);return i.join(`
164
164
  `)}).join(`
165
165
 
166
- `)}function oE(t){return`\u2713 wrote ${t.path} (v${t.version}, ${dt(t.size??0)})`}function iE(t){return`\u2713 edited ${t.path} (v${t.version}, ${t.changes} change${t.changes!==1?"s":""})`}function uE(t){return`\u2713 appended (v${t.version}, ${dt(t.size??0)})`}function TE(t){return t.deleted?`\u2713 deleted ${t.path}`:`(not found: ${t.path})`}function eE(t){return`\u2713 moved ${t.from} -> ${t.to} (v${t.version})`}function EE(t){return`\u2713 copied ${t.from} -> ${t.to} (v${t.version})`}function NE(t){let n=t.tree??[];if(n.length===0)return"(empty)";let o=[];function i(u,T){for(let E=0;E<u.length;E++){let y=u[E],N=E===u.length-1,I=N?"\u2514\u2500\u2500 ":"\u251C\u2500\u2500 ",g=y.type==="directory"?"/":"";if(o.push(`${T}${I}${y.name}${g}`),y.children&&y.children.length>0){let D=T+(N?" ":"\u2502 ");i(y.children,D)}}}return i(n,""),o.join(`
167
- `)}function yE(t){let n=t.matches??[];if(n.length===0)return"(no matches)";return n.map((o)=>`${o.path}:${o.lineNumber}: ${o.content}`).join(`
168
- `)}function IE(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})
166
+ `)}function TN(t){return`\u2713 wrote ${t.path} (v${t.version}, ${Mt(t.size??0)})`}function EN(t){return`\u2713 edited ${t.path} (v${t.version}, ${t.changes} change${t.changes!==1?"s":""})`}function uN(t){return`\u2713 appended (v${t.version}, ${Mt(t.size??0)})`}function NN(t){return t.deleted?`\u2713 deleted ${t.path}`:`(not found: ${t.path})`}function yN(t){return`\u2713 moved ${t.from} -> ${t.to} (v${t.version})`}function LN(t){return`\u2713 copied ${t.from} -> ${t.to} (v${t.version})`}function RN(t){let n=t.tree??[];if(n.length===0)return"(empty)";let o=[];function i(T,E){for(let N=0;N<T.length;N++){let L=T[N],y=N===T.length-1,R=y?"\u2514\u2500\u2500 ":"\u251C\u2500\u2500 ",I=L.type==="directory"?"/":"";if(o.push(`${E}${R}${L.name}${I}`),L.children&&L.children.length>0){let _=E+(y?" ":"\u2502 ");i(L.children,_)}}}return i(n,""),o.join(`
167
+ `)}function IN(t){let n=t.matches??[];if(n.length===0)return"(no matches)";return n.map((o)=>`${o.path}:${o.lineNumber}: ${o.content}`).join(`
168
+ `)}function DN(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})
169
169
  ${i.snippet}`);if(t.hint)o.push(`
170
170
  hint: ${t.hint}`);return o.join(`
171
171
 
172
- `)}function OE(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}`:"")+`
172
+ `)}function ON(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}`:"")+`
173
173
  ${o.snippet}`).join(`
174
174
 
175
- `)}function LE(t){let n=t.matches??[];if(n.length===0)return"(no matches)";return n.map((o)=>`${o.path} ${dt(o.size??0)} ${vt(o.modifiedAt)}`).join(`
176
- `)}function gE(t){let n=t.changes??[];if(n.length===0)return"(no changes)";return n.map((o)=>{let i=o.type==="add"?"+":o.type==="remove"?"-":" ",u=o.lineNumber!=null?`${o.lineNumber}: `:"";return`${i} ${u}${o.content}`}).join(`
177
- `)}function DE(t){return fu(t)}function RE(t){return`\u2713 reverted to v${t.revertedTo} (new version: v${t.version})`}function _E(t){let n=t.entries??[];if(n.length===0)return"(no recent activity)";return n.map((o)=>`${o.path} v${o.version} ${vt(o.createdAt)} ${o.author??"-"} [${o.operation}]`+(o.message?`
175
+ `)}function _N(t){let n=t.matches??[];if(n.length===0)return"(no matches)";return n.map((o)=>`${o.path} ${Mt(o.size??0)} ${Yt(o.modifiedAt)}`).join(`
176
+ `)}function AN(t){let n=t.changes??[];if(n.length===0)return"(no changes)";return n.map((o)=>{let i=o.type==="add"?"+":o.type==="remove"?"-":" ",T=o.lineNumber!=null?`${o.lineNumber}: `:"";return`${i} ${T}${o.content}`}).join(`
177
+ `)}function UN(t){return dT(t)}function SN(t){return`\u2713 reverted to v${t.revertedTo} (new version: v${t.version})`}function XN(t){let n=t.entries??[];if(n.length===0)return"(no recent activity)";return n.map((o)=>`${o.path} v${o.version} ${Yt(o.createdAt)} ${o.author??"-"} [${o.operation}]`+(o.message?`
178
178
  ${o.message}`:"")).join(`
179
179
 
180
- `)}function AE(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(", ")}var UE={ls:se,cat:fu,stat:tE,log:nE,write:oE,edit:iE,append:uE,rm:TE,mv:eE,cp:EE,tree:NE,grep:yE,fts:IE,search:OE,glob:LE,diff:gE,tail:DE,revert:RE,recent:_E,reindex:AE};function lE(t,n){let o=UE[t];if(o)return o(n);return JSON.stringify(n,null,2)}function Vu(t,n,o){if(o)console.log(JSON.stringify(n,null,2));else console.log(lE(t,n))}var rE=[{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:"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"}]}];function qu(t,n,o){for(let i of rE){let u=Ot(i.name),T=new SE(i.name).description(u?.description??i.name);for(let E of i.args)if(E.required)T.argument(`<${E.name}>`);else T.argument(`[${E.name}]`);for(let E of i.options)T.option(E.flag,E.description);T.action(async(...E)=>{let N={...E[E.length-2]};for(let I=0;I<i.args.length;I++)if(E[I]!==void 0)N[i.args[I].name]=E[I];if((i.name==="write"||i.name==="append")&&!N.content)if(!process.stdin.isTTY)N.content=await Bun.stdin.text();else console.error("Error: --content required (or pipe content via stdin)"),process.exit(1);if(N["expected-version"]!==void 0)N.expectedVersion=N["expected-version"],delete N["expected-version"];if(N.old!==void 0)N.old_string=N.old,delete N.old;if(N.new!==void 0)N.new_string=N.new,delete N.new;if(i.name==="revert"&&N.to!==void 0)N.version=N.to,delete N.to;for(let I of["offset","limit","lines","v1","v2","version","expectedVersion","depth"])if(N[I]!==void 0)N[I]=parseInt(N[I]);try{let I=await n.callOp(await o(),i.name,N);Vu(i.name,I,t.opts().json)}catch(I){if(I?.cause?.code==="ECONNREFUSED"||I?.message?.includes("fetch failed"))console.error(`Cannot connect to agent-fs daemon.
180
+ `)}function ZN(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(", ")}var wN={ls:nN,cat:dT,stat:oN,log:iN,write:TN,edit:EN,append:uN,rm:NN,mv:yN,cp:LN,tree:RN,grep:IN,fts:DN,search:ON,glob:_N,diff:AN,tail:UN,revert:SN,recent:XN,reindex:ZN};function $N(t,n){let o=wN[t];if(o)return o(n);return JSON.stringify(n,null,2)}function kT(t,n,o){if(o)console.log(JSON.stringify(n,null,2));else console.log($N(t,n))}var MN=[{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:"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"}]}];function fT(t,n,o){for(let i of MN){let T=Lt(i.name),E=new BN(i.name).description(T?.description??i.name);for(let N of i.args)if(N.required)E.argument(`<${N.name}>`);else E.argument(`[${N.name}]`);for(let N of i.options)E.option(N.flag,N.description);E.action(async(...N)=>{let y={...N[N.length-2]};for(let R=0;R<i.args.length;R++)if(N[R]!==void 0)y[i.args[R].name]=N[R];if((i.name==="write"||i.name==="append")&&!y.content)if(!process.stdin.isTTY)y.content=await Bun.stdin.text();else console.error("Error: --content required (or pipe content via stdin)"),process.exit(1);if(y["expected-version"]!==void 0)y.expectedVersion=y["expected-version"],delete y["expected-version"];if(y.old!==void 0)y.old_string=y.old,delete y.old;if(y.new!==void 0)y.new_string=y.new,delete y.new;if(i.name==="revert"&&y.to!==void 0)y.version=y.to,delete y.to;for(let R of["offset","limit","lines","v1","v2","version","expectedVersion","depth"])if(y[R]!==void 0)y[R]=parseInt(y[R]);try{let R=await n.callOp(await o(),i.name,y);kT(i.name,R,t.opts().json)}catch(R){if(R?.cause?.code==="ECONNREFUSED"||R?.message?.includes("fetch failed"))console.error(`Cannot connect to agent-fs daemon.
181
181
  Start with: agent-fs daemon start
182
- Or set AGENT_FS_API_URL to connect to a remote server.`),process.exit(1);console.error(`Error: ${I.message}`),process.exit(1)}}),t.addCommand(T)}}M();import{Command as XE}from"commander";function ju(t){let n=new XE("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});ku(i,t)}catch{try{let i=a(),u=p(i,{email:o}),T=F(i,u.user.id);ku({apiKey:u.apiKey,userId:u.user.id,orgId:T[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:u,listUserOrgs:T}=await Promise.resolve().then(() => (M(),Ku)),E=o();if(!E.auth.apiKey)console.error("Not logged in. Run: agent-fs auth register <email>"),process.exit(1);let y=u(),N=i(y,E.auth.apiKey);if(!N)console.error("Invalid API key in config."),process.exit(1);let I=T(y,N.id);console.log(JSON.stringify({...N,orgs:I},null,2))}catch(o){console.error(`Error: ${o.message}`),process.exit(1)}}}),n}function ku(t,n){console.log("Registered successfully!"),console.log(`API Key: ${t.apiKey}`),console.log(`User ID: ${t.userId}`),console.log(`Org ID: ${t.orgId}`),l("auth.apiKey",t.apiKey),n.setApiKey(t.apiKey),console.log(`
183
- API key saved to config.`)}import{Command as JE}from"commander";function bu(){let t=new JE("daemon").description("Daemon lifecycle management");return t.command("start").description("Start the agent-fs daemon").action(async()=>{let{startDaemon:n}=await Promise.resolve().then(() => (On(),In));n()}),t.command("stop").description("Stop the agent-fs daemon").action(async()=>{let{stopDaemon:n}=await Promise.resolve().then(() => (On(),In));n()}),t.command("status").description("Check daemon status").action(async()=>{let{daemonStatus:n}=await Promise.resolve().then(() => (On(),In)),o=n();if(o.running)console.log(`Daemon running (PID: ${o.pid})`);else console.log("Daemon is not running")}),t}M();import{Command as YE}from"commander";import{existsSync as hu}from"fs";function zu(){let t=new YE("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=Z(),i=n.split("."),u=o;for(let T of i)u=u?.[T];if(u===void 0)console.error(`Key not found: ${n}`),process.exit(1);console.log(typeof u==="object"?JSON.stringify(u,null,2):String(u))}),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{}l(n,i),console.log(`Set ${n} = ${JSON.stringify(i)}`)}),t.command("list").description("Show all config").action(()=>{console.log(JSON.stringify(Z(),null,2))}),t.command("validate").description("Check that config, database, S3, and embeddings are healthy").action(async()=>{let n=[],o=Z(),i=hu(x());n.push({name:"Config file",ok:i,message:i?x():"Not found \u2014 run `agent-fs onboard`"});let T=["endpoint","bucket","accessKeyId","secretAccessKey"].filter((g)=>!o.s3[g]);if(n.push({name:"S3 config",ok:T.length===0,message:T.length===0?`${o.s3.provider} \u2192 ${o.s3.endpoint}/${o.s3.bucket}`:`Missing: ${T.join(", ")}`}),T.length===0)try{await new et(o.s3).listObjects(""),n.push({name:"S3 connectivity",ok:!0,message:"Connected"})}catch(g){n.push({name:"S3 connectivity",ok:!1,message:g.message||"Connection failed"})}let E=hu(gt());n.push({name:"Database",ok:E,message:E?gt():"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 y=o.embedding.provider,N=!!o.embedding.apiKey||!!process.env.OPENAI_API_KEY||!!process.env.GEMINI_API_KEY;if(y==="openai"||y==="gemini")if(N)try{let g=await wt(o.embedding);n.push({name:"Embeddings",ok:!!g,message:g?`${y} ready`:`${y} configured but failed to init`})}catch(g){n.push({name:"Embeddings",ok:!1,message:g.message})}else n.push({name:"Embeddings",ok:!1,message:`${y} selected but no API key`});else n.push({name:"Embeddings",ok:!0,message:"local/disabled (semantic search may be unavailable)"});console.log(`
182
+ Or set AGENT_FS_API_URL to connect to a remote server.`),process.exit(1);console.error(`Error: ${R.message}`),process.exit(1)}}),t.addCommand(E)}}F();import{Command as YN}from"commander";function zT(t){let n=new YN("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});jT(i,t)}catch{try{let i=it(),T=b(i,{email:o}),E=V(i,T.user.id);jT({apiKey:T.apiKey,userId:T.user.id,orgId:E[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:T,listUserOrgs:E}=await Promise.resolve().then(() => (F(),qT)),N=o();if(!N.auth.apiKey)console.error("Not logged in. Run: agent-fs auth register <email>"),process.exit(1);let L=T(),y=i(L,N.auth.apiKey);if(!y)console.error("Invalid API key in config."),process.exit(1);let R=E(L,y.id);console.log(JSON.stringify({...y,orgs:R},null,2))}catch(o){console.error(`Error: ${o.message}`),process.exit(1)}}}),n}function jT(t,n){console.log("Registered successfully!"),console.log(`API Key: ${t.apiKey}`),console.log(`User ID: ${t.userId}`),console.log(`Org ID: ${t.orgId}`),S("auth.apiKey",t.apiKey),n.setApiKey(t.apiKey),console.log(`
183
+ API key saved to config.`)}import{Command as CN}from"commander";function pT(){let t=new CN("daemon").description("Daemon lifecycle management");return t.command("start").description("Start the agent-fs daemon").action(async()=>{let{startDaemon:n}=await Promise.resolve().then(() => (Dn(),In));n()}),t.command("stop").description("Stop the agent-fs daemon").action(async()=>{let{stopDaemon:n}=await Promise.resolve().then(() => (Dn(),In));n()}),t.command("status").description("Check daemon status").action(async()=>{let{daemonStatus:n}=await Promise.resolve().then(() => (Dn(),In)),o=n();if(o.running)console.log(`Daemon running (PID: ${o.pid})`);else console.log("Daemon is not running")}),t}F();import{Command as vN}from"commander";import{existsSync as hT}from"fs";function rT(){let t=new vN("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=B(),i=n.split("."),T=o;for(let E of i)T=T?.[E];if(T===void 0)console.error(`Key not found: ${n}`),process.exit(1);console.log(typeof T==="object"?JSON.stringify(T,null,2):String(T))}),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{}S(n,i),console.log(`Set ${n} = ${JSON.stringify(i)}`)}),t.command("list").description("Show all config").action(()=>{console.log(JSON.stringify(B(),null,2))}),t.command("validate").description("Check that config, database, S3, and embeddings are healthy").action(async()=>{let n=[],o=B(),i=hT(x());n.push({name:"Config file",ok:i,message:i?x():"Not found \u2014 run `agent-fs onboard`"});let E=["endpoint","bucket","accessKeyId","secretAccessKey"].filter((I)=>!o.s3[I]);if(n.push({name:"S3 config",ok:E.length===0,message:E.length===0?`${o.s3.provider} \u2192 ${o.s3.endpoint}/${o.s3.bucket}`:`Missing: ${E.join(", ")}`}),E.length===0)try{await new Tt(o.s3).listObjects(""),n.push({name:"S3 connectivity",ok:!0,message:"Connected"})}catch(I){n.push({name:"S3 connectivity",ok:!1,message:I.message||"Connection failed"})}let N=hT(It());n.push({name:"Database",ok:N,message:N?It():"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 L=o.embedding.provider,y=!!o.embedding.apiKey||!!process.env.OPENAI_API_KEY||!!process.env.GEMINI_API_KEY;if(L==="openai"||L==="gemini")if(y)try{let I=await Bt(o.embedding);n.push({name:"Embeddings",ok:!!I,message:I?`${L} ready`:`${L} configured but failed to init`})}catch(I){n.push({name:"Embeddings",ok:!1,message:I.message})}else n.push({name:"Embeddings",ok:!1,message:`${L} selected but no API key`});else n.push({name:"Embeddings",ok:!0,message:"local/disabled (semantic search may be unavailable)"});console.log(`
184
184
  agent-fs health check
185
- `);let I=!0;for(let g of n){let D=g.ok?"\u2713":"\u2717";if(console.log(` ${D} ${g.name}: ${g.message}`),!g.ok)I=!1}if(console.log(),I)console.log("All checks passed.");else console.log("Some checks failed. Fix the issues above and re-run."),process.exit(1)}),t}M();import{Command as GE}from"commander";function mu(t){let n=new GE("drive").description("Drive management");return n.command("list").description("List drives in current org").action(async()=>{try{let{db:o,orgId:i}=Ln(),u=it(o,i);console.log(JSON.stringify({drives:u},null,2))}catch(o){console.error(`Error: ${o.message}`),process.exit(1)}}),n.command("create").argument("<name>","Drive name").description("Create a new drive").action(async(o)=>{try{let{db:i,orgId:u}=Ln(),T=ut(i,{orgId:u,name:o});console.log(JSON.stringify(T,null,2))}catch(i){console.error(`Error: ${i.message}`),process.exit(1)}}),n.command("current").description("Show current drive context").action(async()=>{try{let{db:o,orgId:i,userId:u}=Ln(),T=it(o,i),E=T.find((y)=>y.isDefault);console.log(JSON.stringify({orgId:i,drive:E??T[0]??null},null,2))}catch(o){console.error(`Error: ${o.message}`),process.exit(1)}}),n.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",`
186
- 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(o,i)=>{try{let{db:u,orgId:T}=Ln();Rt(u,{orgId:T,email:o,role:i.role}),console.log(`Invited ${o} as ${i.role}`)}catch(u){console.error(`Error: ${u.message}`),process.exit(1)}}),n}function Ln(){let t=Z();if(!t.auth.apiKey)throw Error("Not logged in. Run: agent-fs auth register <email>");let n=a(),o=b(n,t.auth.apiKey);if(!o)throw Error("Invalid API key in config.");let i=F(n,o.id);if(i.length===0)throw Error("No orgs found.");return{db:n,orgId:i[0].id,userId:o.id}}import{Command as KE}from"commander";M();import{Command as FE}from"commander";import{execSync as _t}from"child_process";import{existsSync as CE}from"fs";function gn(){return new FE("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.
185
+ `);let R=!0;for(let I of n){let _=I.ok?"\u2713":"\u2717";if(console.log(` ${_} ${I.name}: ${I.message}`),!I.ok)R=!1}if(console.log(),R)console.log("All checks passed.");else console.log("Some checks failed. Fix the issues above and re-run."),process.exit(1)}),t}F();import{Command as gN}from"commander";function mT(t,n){let o=new gN("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 T=o.parent?.opts().org;if(T){let L=await t.get(`/orgs/${T}/drives`);if(i){console.log(JSON.stringify(L,null,2));return}for(let y of L.drives){let R=y.isDefault?" (default)":"";console.log(`${y.id} ${y.name}${R}`)}return}let{orgs:E}=await t.get("/orgs");if(i){let L=[];for(let y of E){let{drives:R}=await t.get(`/orgs/${y.id}/drives`);L.push({orgId:y.id,orgName:y.name,drives:R})}console.log(JSON.stringify(L,null,2));return}if(!E||E.length===0){console.log("(no orgs)");return}let N=B();for(let L of E){let y=[];if(L.isPersonal)y.push("personal");if(N.defaultOrg===L.id)y.push("active");let R=y.length>0?` (${y.join(", ")})`:"";console.log(`
186
+ ${L.name} [${L.role}]${R}`);let{drives:I}=await t.get(`/orgs/${L.id}/drives`);for(let _ of I){let Z=[];if(_.isDefault)Z.push("default");if(N.defaultDrive===_.id)Z.push("active");let H=Z.length>0?` (${Z.join(", ")})`:"";console.log(` ${_.id} ${_.name}${H}`)}}}catch(T){console.error(`Error: ${T.message}`),process.exit(1)}}),o.command("create").argument("<name>","Drive name").description("Create a new drive").action(async(i)=>{try{let T=await n(),E=await t.post(`/orgs/${T}/drives`,{name:i});console.log(JSON.stringify(E,null,2))}catch(T){console.error(`Error: ${T.message}`),process.exit(1)}}),o.command("current").description("Show current drive context").action(async()=>{let i=o.parent?.opts().json;try{let T=B(),E=await t.getMe(),N=T.defaultOrg??E.defaultOrgId;if(!N)console.error("Error: No org context. Run 'agent-fs auth register' first."),process.exit(1);let{drives:L}=await t.get(`/orgs/${N}/drives`),y;if(T.defaultDrive)y=L.find((I)=>I.id===T.defaultDrive);if(!y)y=L.find((I)=>I.isDefault)??L[0]??null;let R=T.defaultOrg?"config (org switch)":"server default";if(i)console.log(JSON.stringify({orgId:N,drive:y,source:R},null,2));else console.log(`org: ${N}`),console.log(`drive: ${y?.id??"(none)"} ${y?.name??""}`),console.log(`source: ${R}`)}catch(T){console.error(`Error: ${T.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:T}=await t.get("/orgs"),E=null,N=null;for(let L of T){let{drives:y}=await t.get(`/orgs/${L.id}/drives`),R=y.find((I)=>I.id===i);if(R){E=R,N=L;break}}if(!E)console.error(`Error: Drive ${i} not found in any of your orgs.`),process.exit(1);S("defaultOrg",N.id),S("defaultDrive",i),console.log(`Switched to drive: ${E.name} (org: ${N.name})`)}catch(T){console.error(`Error: ${T.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",`
187
+ 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,T)=>{try{let E=await n();await t.post(`/orgs/${E}/members/invite`,{email:i,role:T.role}),console.log(`Invited ${i} as ${T.role}`)}catch(E){console.error(`Error: ${E.message}`),process.exit(1)}}),o}F();import{Command as KN}from"commander";function xT(t){let n=new KN("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 T=B();for(let E of i){let N=[];if(E.isPersonal)N.push("personal");if(T.defaultOrg===E.id)N.push("active");let L=N.length>0?` (${N.join(", ")})`:"";console.log(`${E.id} ${E.name} [${E.role}]${L}`)}}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=B(),T=await t.getMe(),E=i.defaultOrg??T.defaultOrgId;if(!E)console.error("Error: No org context. Run 'agent-fs auth register' first."),process.exit(1);let N=await t.get(`/orgs/${E}`),L=i.defaultOrg?"config (org switch)":"server default";if(o)console.log(JSON.stringify({...N,source:L},null,2));else console.log(`${N.id} ${N.name}${N.isPersonal?" (personal)":""}`),console.log(`source: ${L}`)}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}`);S("defaultOrg",o),S("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 fN}from"commander";F();import{Command as eN}from"commander";import{execSync as At}from"child_process";import{existsSync as VN}from"fs";function On(){return new eN("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.
187
188
  To connect to a remote server, configure manually:
188
189
  agent-fs config set api.url "`+n.remote+`"
189
- agent-fs config set api.key "<your-api-key>"`),process.exit(1);let o=x();if(CE(o)){if(Z().auth.apiKey&&!n.yes)console.log("Existing configuration found at "+o),console.log(`Re-running onboard will update settings. Use -y to accept defaults.
190
+ agent-fs config set api.key "<your-api-key>"`),process.exit(1);let o=x();if(VN(o)){if(B().auth.apiKey&&!n.yes)console.log("Existing configuration found at "+o),console.log(`Re-running onboard will update settings. Use -y to accept defaults.
190
191
  `)}console.log(`Setting up agent-fs...
191
- `);let u=!(n.s3Endpoint||n.s3Bucket||n.s3AccessKey||n.s3SecretKey);if(n.s3Endpoint){if(l("s3.endpoint",n.s3Endpoint),n.s3Bucket)l("s3.bucket",n.s3Bucket);if(n.s3AccessKey)l("s3.accessKeyId",n.s3AccessKey);if(n.s3SecretKey)l("s3.secretAccessKey",n.s3SecretKey);if(n.s3Region)l("s3.region",n.s3Region);l("s3.provider","s3"),console.log("S3 configured from flags.")}else if(u)await PE(!!n.yes);else await HE();let T=n.embeddings??(n.yes?"none":void 0);if(T)QE(T,n);else if(!n.yes)console.log(`
192
+ `);let T=!(n.s3Endpoint||n.s3Bucket||n.s3AccessKey||n.s3SecretKey);if(n.s3Endpoint){if(S("s3.endpoint",n.s3Endpoint),n.s3Bucket)S("s3.bucket",n.s3Bucket);if(n.s3AccessKey)S("s3.accessKeyId",n.s3AccessKey);if(n.s3SecretKey)S("s3.secretAccessKey",n.s3SecretKey);if(n.s3Region)S("s3.region",n.s3Region);S("s3.provider","s3"),console.log("S3 configured from flags.")}else if(T)await qN(!!n.yes);else await dN();let E=n.embeddings??(n.yes?"none":void 0);if(E)lN(E,n);else if(!n.yes)console.log(`
192
193
  Embedding provider not specified. Skipping (semantic search disabled).`),console.log("Configure later: agent-fs config set embedding.provider openai");console.log(`
193
- Initializing database...`);let E=a();if(console.log("Database ready."),u||n.yes){let{apiKey:y}=Qt(E),N=b(E,y),I=F(E,N.id);console.log(`
194
- User registered: ${N.email}`),console.log(`API Key: ${y}`),console.log(`Org ID: ${I[0]?.id}`)}else{let y=await WE();try{let N=p(E,{email:y}),I=F(E,N.user.id);l("auth.apiKey",N.apiKey),console.log(`
195
- User registered: ${y}`),console.log(`API Key: ${N.apiKey}`),console.log(`Org ID: ${I[0]?.id}`)}catch(N){if(N.message?.includes("UNIQUE"))console.log(`User ${y} already exists.`);else throw N}}console.log("\nSetup complete! Run `agent-fs daemon start` to begin."),console.log("Or use MCP directly: agent-fs mcp")})}function QE(t,n){switch(t){case"openai":if(l("embedding.provider","openai"),l("embedding.model","text-embedding-3-small"),n.openaiKey)l("embedding.apiKey",n.openaiKey);console.log("Embeddings: OpenAI (text-embedding-3-small)");break;case"gemini":if(l("embedding.provider","gemini"),l("embedding.model","text-embedding-004"),n.geminiKey)l("embedding.apiKey",n.geminiKey);console.log("Embeddings: Google Gemini (text-embedding-004)");break;case"local":l("embedding.provider","local"),console.log("Embeddings: local llama.cpp");break;case"none":l("embedding.provider","local"),l("embedding.model",""),l("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 PE(t){try{_t("which docker",{stdio:"ignore"}),_t("docker info",{stdio:"ignore"})}catch{console.error(`Docker is required for local mode (MinIO).
194
+ Initializing database...`);let N=it();if(console.log("Database ready."),T||n.yes){let{apiKey:L}=et(N),y=ot(N,L),R=V(N,y.id);console.log(`
195
+ User registered: ${y.email}`),console.log(`API Key: ${L}`),console.log(`Org ID: ${R[0]?.id}`)}else{let L=await kN();try{let y=b(N,{email:L}),R=V(N,y.user.id);S("auth.apiKey",y.apiKey),console.log(`
196
+ User registered: ${L}`),console.log(`API Key: ${y.apiKey}`),console.log(`Org ID: ${R[0]?.id}`)}catch(y){if(y.message?.includes("UNIQUE"))console.log(`User ${L} already exists.`);else throw y}}console.log("\nSetup complete! Run `agent-fs daemon start` to begin."),console.log("Or use MCP directly: agent-fs mcp")})}function lN(t,n){switch(t){case"openai":if(S("embedding.provider","openai"),S("embedding.model","text-embedding-3-small"),n.openaiKey)S("embedding.apiKey",n.openaiKey);console.log("Embeddings: OpenAI (text-embedding-3-small)");break;case"gemini":if(S("embedding.provider","gemini"),S("embedding.model","text-embedding-004"),n.geminiKey)S("embedding.apiKey",n.geminiKey);console.log("Embeddings: Google Gemini (text-embedding-004)");break;case"local":S("embedding.provider","local"),console.log("Embeddings: local llama.cpp");break;case"none":S("embedding.provider","local"),S("embedding.model",""),S("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 qN(t){try{At("which docker",{stdio:"ignore"}),At("docker info",{stdio:"ignore"})}catch{console.error(`Docker is required for local mode (MinIO).
196
197
  Install Docker: https://docs.docker.com/get-docker/
197
- Or use 'agent-fs onboard --s3-endpoint <url>' to configure your own S3 bucket.`),process.exit(1)}let n=_t("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:u}=await i.read();i.releaseLock();let T=new TextDecoder().decode(u).trim().toLowerCase();if(T==="n"||T==="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")_t("docker start agent-fs-minio",{stdio:"inherit"}),console.log("MinIO container started.");else _t('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{_t("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=_t("docker inspect --format='{{.Id}}' agent-fs-minio",{encoding:"utf-8"}).trim();l("minio.containerId",o),l("minio.managed",!0)}catch(o){console.error(`Failed to set up MinIO: ${o.message}`),process.exit(1)}l("s3.provider","minio"),l("s3.endpoint","http://localhost:9000"),l("s3.bucket","agentfs"),l("s3.region","us-east-1"),l("s3.accessKeyId","minioadmin"),l("s3.secretAccessKey","minioadmin"),console.log("MinIO configured.")}async function HE(){let t=Z();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(`
198
- Edit with: agent-fs config set s3.endpoint <url>`)}async function WE(){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 xu(){let t=gn(),n=new KE("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'.
199
- `),await t.parseAsync(i.args,{from:"user"})});for(let o of t.options)n.addOption(o);return n}import{Command as fE}from"commander";function cu(t,n){let o=new fE("comment").description("Document comments");async function i(u,T){try{return await t.callOp(await n(),u,T)}catch(E){if(E?.cause?.code==="ECONNREFUSED"||E?.message?.includes("fetch failed"))console.error(`Cannot connect to agent-fs daemon.
198
+ Or use 'agent-fs onboard --s3-endpoint <url>' to configure your own S3 bucket.`),process.exit(1)}let n=At("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:T}=await i.read();i.releaseLock();let E=new TextDecoder().decode(T).trim().toLowerCase();if(E==="n"||E==="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")At("docker start agent-fs-minio",{stdio:"inherit"}),console.log("MinIO container started.");else At('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{At("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=At("docker inspect --format='{{.Id}}' agent-fs-minio",{encoding:"utf-8"}).trim();S("minio.containerId",o),S("minio.managed",!0)}catch(o){console.error(`Failed to set up MinIO: ${o.message}`),process.exit(1)}S("s3.provider","minio"),S("s3.endpoint","http://localhost:9000"),S("s3.bucket","agentfs"),S("s3.region","us-east-1"),S("s3.accessKeyId","minioadmin"),S("s3.secretAccessKey","minioadmin"),console.log("MinIO configured.")}async function dN(){let t=B();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(`
199
+ Edit with: agent-fs config set s3.endpoint <url>`)}async function kN(){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 cT(){let t=On(),n=new fN("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'.
200
+ `),await t.parseAsync(i.args,{from:"user"})});for(let o of t.options)n.addOption(o);return n}import{Command as jN}from"commander";function aT(t,n){let o=new jN("comment").description("Document comments");async function i(T,E){try{return await t.callOp(await n(),T,E)}catch(N){if(N?.cause?.code==="ECONNREFUSED"||N?.message?.includes("fetch failed"))console.error(`Cannot connect to agent-fs daemon.
200
201
  Start with: agent-fs daemon start
201
- 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(u,T)=>{try{let E={path:u,body:T.body};if(T.quotedContent)E.quotedContent=T.quotedContent;if(T.line)E.lineStart=parseInt(T.line),E.lineEnd=parseInt(T.line);if(T.lineStart)E.lineStart=parseInt(T.lineStart);if(T.lineEnd)E.lineEnd=parseInt(T.lineEnd);let y=await i("comment-add",E);console.log(JSON.stringify(y,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(u,T)=>{try{let E=await i("comment-add",{parentId:u,body:T.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(u,T)=>{try{let E={};if(u)E.path=u;if(T.resolved)E.resolved=!0;if(T.limit)E.limit=parseInt(T.limit);if(T.offset)E.offset=parseInt(T.offset);let y=await i("comment-list",E);console.log(JSON.stringify(y,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(u)=>{try{let T=await i("comment-get",{id:u});console.log(JSON.stringify(T,null,2))}catch(T){console.error(`Error: ${T.message}`),process.exit(1)}}),o.command("update").argument("<id>","Comment ID").requiredOption("--body <text>","New comment body").description("Update a comment").action(async(u,T)=>{try{let E=await i("comment-update",{id:u,body:T.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(u)=>{try{let T=await i("comment-delete",{id:u});console.log(JSON.stringify(T,null,2))}catch(T){console.error(`Error: ${T.message}`),process.exit(1)}}),o.command("resolve").argument("<id>","Comment ID").description("Resolve a comment").action(async(u)=>{try{let T=await i("comment-resolve",{id:u,resolved:!0});console.log(JSON.stringify(T,null,2))}catch(T){console.error(`Error: ${T.message}`),process.exit(1)}}),o.command("reopen").argument("<id>","Comment ID").description("Reopen a resolved comment").action(async(u)=>{try{let T=await i("comment-resolve",{id:u,resolved:!1});console.log(JSON.stringify(T,null,2))}catch(T){console.error(`Error: ${T.message}`),process.exit(1)}}),o}import{Command as qE}from"commander";var au=`---
202
+ Or set AGENT_FS_API_URL to connect to a remote server.`),process.exit(1);throw N}}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(T,E)=>{try{let N={path:T,body:E.body};if(E.quotedContent)N.quotedContent=E.quotedContent;if(E.line)N.lineStart=parseInt(E.line),N.lineEnd=parseInt(E.line);if(E.lineStart)N.lineStart=parseInt(E.lineStart);if(E.lineEnd)N.lineEnd=parseInt(E.lineEnd);let L=await i("comment-add",N);console.log(JSON.stringify(L,null,2))}catch(N){console.error(`Error: ${N.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(T,E)=>{try{let N=await i("comment-add",{parentId:T,body:E.body});console.log(JSON.stringify(N,null,2))}catch(N){console.error(`Error: ${N.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(T,E)=>{try{let N={};if(T)N.path=T;if(E.resolved)N.resolved=!0;if(E.limit)N.limit=parseInt(E.limit);if(E.offset)N.offset=parseInt(E.offset);let L=await i("comment-list",N);console.log(JSON.stringify(L,null,2))}catch(N){console.error(`Error: ${N.message}`),process.exit(1)}}),o.command("get").argument("<id>","Comment ID").description("Get a comment with its replies").action(async(T)=>{try{let E=await i("comment-get",{id:T});console.log(JSON.stringify(E,null,2))}catch(E){console.error(`Error: ${E.message}`),process.exit(1)}}),o.command("update").argument("<id>","Comment ID").requiredOption("--body <text>","New comment body").description("Update a comment").action(async(T,E)=>{try{let N=await i("comment-update",{id:T,body:E.body});console.log(JSON.stringify(N,null,2))}catch(N){console.error(`Error: ${N.message}`),process.exit(1)}}),o.command("delete").argument("<id>","Comment ID").description("Delete a comment (soft delete)").action(async(T)=>{try{let E=await i("comment-delete",{id:T});console.log(JSON.stringify(E,null,2))}catch(E){console.error(`Error: ${E.message}`),process.exit(1)}}),o.command("resolve").argument("<id>","Comment ID").description("Resolve a comment").action(async(T)=>{try{let E=await i("comment-resolve",{id:T,resolved:!0});console.log(JSON.stringify(E,null,2))}catch(E){console.error(`Error: ${E.message}`),process.exit(1)}}),o.command("reopen").argument("<id>","Comment ID").description("Reopen a resolved comment").action(async(T)=>{try{let E=await i("comment-resolve",{id:T,resolved:!1});console.log(JSON.stringify(E,null,2))}catch(E){console.error(`Error: ${E.message}`),process.exit(1)}}),o}import{Command as bN}from"commander";var sT=`---
202
203
  name: agent-fs
203
204
  description: >-
204
205
  Use when the user wants to store, retrieve, search, or manage files in agent-fs \u2014
@@ -431,9 +432,9 @@ agent-fs recent docs/ --since 24h --limit 20
431
432
  \`\`\`bash
432
433
  agent-fs config validate
433
434
  \`\`\`
434
- `;function su(){return new qE("docs").description("Show agent-fs documentation and command reference").action(()=>{let t=au.replace(/^---[\s\S]*?---\n*/,"");console.log(t)})}var H=new LN;H.name("agent-fs").description("Agent-first filesystem backed by S3").version(W).option("--org <orgId>","Override org context").option("--drive <driveId>","Override drive context").option("--json","Output raw JSON");var Kt=new lo;async function vT(){let t=H.opts().org;if(t)return t;try{let n=await Kt.getMe();if(n.defaultOrgId)return n.defaultOrgId}catch(n){if(n?.message?.includes("Cannot connect"))console.error(n.message),process.exit(1)}console.error("Error: No org context. Use --org or run 'agent-fs auth register'"),process.exit(1)}H.addCommand(su());qu(H,Kt,vT);H.addCommand(ju(Kt));H.addCommand(bu());H.addCommand(zu());H.addCommand(mu(Kt));H.addCommand(xu());H.addCommand(gn());H.addCommand(cu(Kt,vT));H.command("mcp").description("Start MCP server (stdio)").action(async()=>{await nT().then(() => cE)});H.command("server").description("Run server in foreground (dev mode)").action(async()=>{await dT().then(() => ON)});var gN=`
435
+ `;function tE(){return new bN("docs").description("Show agent-fs documentation and command reference").action(()=>{let t=sT.replace(/^---[\s\S]*?---\n*/,"");console.log(t)})}var g=new Uy;g.name("agent-fs").description("Agent-first filesystem backed by S3").version(l).option("--org <orgId>","Override org context").option("--drive <driveId>","Override drive context").option("--json","Output raw JSON");var Jt=new Zo;async function Po(){let t=g.opts().org;if(t)return t;let n=B();if(n.defaultOrg)return n.defaultOrg;try{let o=await Jt.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)}g.addCommand(tE());fT(g,Jt,Po);g.addCommand(zT(Jt));g.addCommand(pT());g.addCommand(rT());g.addCommand(mT(Jt,Po));g.addCommand(xT(Jt));g.addCommand(cT());g.addCommand(On());g.addCommand(aT(Jt,Po));g.command("mcp").description("Start MCP server (stdio)").action(async()=>{await oE().then(() => ty)});g.command("server").description("Run server in foreground (dev mode)").action(async()=>{await QE().then(() => Ay)});var Sy=`
435
436
  Global Options:
436
437
  --org <orgId> Override org context
437
438
  --drive <driveId> Override drive context
438
439
  --json Output raw JSON
439
- `;for(let t of H.commands)t.addHelpText("after",gN);H.parse();
440
+ `;for(let t of g.commands)t.addHelpText("after",Sy);g.parse();