@desplega.ai/agent-fs 0.3.1 → 0.5.1

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.
Files changed (3) hide show
  1. package/README.md +6 -0
  2. package/dist/cli.js +149 -61
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -14,6 +14,8 @@
14
14
 
15
15
  Agent FS gives AI agents a structured filesystem with built-in semantic search, versioning, and identity management. It runs as a CLI and an HTTP server with integrated MCP support — so any AI coding assistant can use it as a long-term memory and file store.
16
16
 
17
+ agent-fs was built to power the shared filesystem in [agent-swarm](https://github.com/desplega-ai/agent-swarm) — a multi-agent coordination framework. While it was designed for swarm agents to share files, search content, and collaborate, it works as a standalone filesystem for any AI agent.
18
+
17
19
  ## Key Features
18
20
 
19
21
  - **Semantic search** — Index and search files using vector embeddings (OpenAI, Google GenAI, or local llama.cpp)
@@ -97,6 +99,10 @@ bun run scripts/fly-deploy.ts
97
99
 
98
100
  See [DEPLOYMENT.md](./DEPLOYMENT.md) for Docker, BYOK storage, and manual setup options.
99
101
 
102
+ ## Live Viewer
103
+
104
+ **[live.agent-fs.dev](https://live.agent-fs.dev)** — A stateless browser UI (local storage only) for inspecting any agent-fs deployment. Point it at your server URL to browse files and search content — nothing is stored server-side.
105
+
100
106
  ## Contributing
101
107
 
102
108
  We welcome contributions! Whether it's bug reports, feature requests, docs improvements, or code — all are welcome.
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
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=`
3
+ var Dl=Object.create;var{getPrototypeOf:Ll,defineProperty:rn,getOwnPropertyNames:vl}=Object;var Ol=Object.prototype.hasOwnProperty;function Sl(t){return this[t]}var Ul,hl,k=(t,e,n)=>{var o=t!=null&&typeof t==="object";if(o){var i=e?Ul??=new WeakMap:hl??=new WeakMap,r=i.get(t);if(r)return r}n=t!=null?Dl(Ll(t)):{};let u=e||!t||!t.__esModule?rn(n,"default",{value:t,enumerable:!0}):n;for(let E of vl(t))if(!Ol.call(u,E))rn(u,E,{get:Sl.bind(t,E),enumerable:!0});if(o)i.set(t,u);return u};var Q=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var $l=(t)=>t;function Pl(t,e){this[t]=$l.bind(null,e)}var Ft=(t,e)=>{for(var n in e)rn(t,n,{get:e[n],enumerable:!0,configurable:!0,set:Pl.bind(e,n)})};var g=(t,e)=>()=>(t&&(e=t(t=0)),e);var Re=import.meta.require;import{Database as al}from"bun:sqlite";import{platform as ml}from"os";import{existsSync as Cl}from"fs";function Ml(){if(oi)return;if(oi=!0,ml()!=="darwin")return;let t=["/opt/homebrew/opt/sqlite/lib/libsqlite3.dylib","/usr/local/opt/sqlite3/lib/libsqlite3.dylib"];for(let e of t)if(Cl(e)){try{al.setCustomSQLite(e)}catch{}return}console.warn(`Warning: Could not find Homebrew SQLite. Extension loading may fail on macOS.
4
+ Install with: brew install sqlite`)}var oi=!1;var ii=g(()=>{Ml()});import{mkdirSync as cl,readFileSync as Xl,writeFileSync as fn,existsSync as ui}from"fs";import{join as de}from"path";function Fl(){let t=process.env.AGENT_FS_HOME??de(process.env.HOME??"/tmp",".agent-fs");if(t.startsWith("~/"))return de(process.env.HOME??"/tmp",t.slice(2));return t}function nt(){return Fl()}function ot(){return de(nt(),"config.json")}function pt(){return de(nt(),"agent-fs.db")}function Hl(){let t=nt();if(!ui(t))cl(t,{recursive:!0})}function Yl(t,e){let n={...t};for(let o of Object.keys(e))if(e[o]&&typeof e[o]==="object"&&!Array.isArray(e[o]))n[o]={...t[o],...e[o]};else if(e[o]!==void 0)n[o]=e[o];return n}function ri(t){let e=process.env;if(e.AWS_ENDPOINT_URL_S3||e.S3_ENDPOINT)t.s3.endpoint=e.AWS_ENDPOINT_URL_S3||e.S3_ENDPOINT;if(e.AWS_ACCESS_KEY_ID||e.S3_ACCESS_KEY_ID)t.s3.accessKeyId=e.AWS_ACCESS_KEY_ID||e.S3_ACCESS_KEY_ID;if(e.AWS_SECRET_ACCESS_KEY||e.S3_SECRET_ACCESS_KEY)t.s3.secretAccessKey=e.AWS_SECRET_ACCESS_KEY||e.S3_SECRET_ACCESS_KEY;if(e.BUCKET_NAME||e.S3_BUCKET)t.s3.bucket=e.BUCKET_NAME||e.S3_BUCKET;if(e.AWS_REGION||e.S3_REGION)t.s3.region=e.AWS_REGION||e.S3_REGION;if(e.S3_PROVIDER)t.s3.provider=e.S3_PROVIDER;if(e.SERVER_PORT||e.PORT)t.server.port=parseInt(e.SERVER_PORT||e.PORT,10);if(e.SERVER_HOST||e.HOST)t.server.host=e.SERVER_HOST||e.HOST;if(e.EMBEDDING_PROVIDER)t.embedding.provider=e.EMBEDDING_PROVIDER;if(e.EMBEDDING_MODEL)t.embedding.model=e.EMBEDDING_MODEL;if(e.EMBEDDING_API_KEY)t.embedding.apiKey=e.EMBEDDING_API_KEY;if(e.AGENT_FS_RATE_LIMIT){if(!t.server.rateLimit)t.server.rateLimit={requestsPerMinute:1200};t.server.rateLimit.requestsPerMinute=parseInt(e.AGENT_FS_RATE_LIMIT,10)}if(e.AGENT_FS_APP_URL)t.appUrl=e.AGENT_FS_APP_URL;return t}function v(){Hl();let t=ot();if(!ui(t))return fn(t,JSON.stringify(un,null,2)),ri(structuredClone(un));let e=Xl(t,"utf-8"),n=JSON.parse(e);return ri(Yl(un,n))}function fi(t,e){let n=v();n[t]=e,fn(ot(),JSON.stringify(n,null,2))}function w(t,e){let n=v(),o=t.split("."),i=n;for(let r=0;r<o.length-1;r++)i=i[o[r]];i[o[o.length-1]]=e,fn(ot(),JSON.stringify(n,null,2))}var un;var zt=g(()=>{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:1200}},auth:{apiKey:""},minio:{containerId:"",managed:!0}}});var f={};Ft(f,{users:()=>qt,orgs:()=>xt,orgMembers:()=>Gl,files:()=>Bl,fileVersions:()=>Ql,events:()=>Jl,drives:()=>Ae,driveMembers:()=>Zl,contentChunks:()=>Wl,comments:()=>Vl});import{sqliteTable as it,text as A,integer as h,primaryKey as En}from"drizzle-orm/sqlite-core";var qt,xt,Gl,Ae,Zl,Bl,Ql,Vl,Jl,Wl;var Ei=g(()=>{qt=it("users",{id:A("id").primaryKey(),email:A("email").notNull().unique(),apiKeyHash:A("api_key_hash").notNull(),createdAt:h("created_at",{mode:"timestamp"}).notNull()}),xt=it("orgs",{id:A("id").primaryKey(),name:A("name").notNull(),isPersonal:h("is_personal",{mode:"boolean"}).notNull().default(!1),createdAt:h("created_at",{mode:"timestamp"}).notNull()}),Gl=it("org_members",{orgId:A("org_id").notNull().references(()=>xt.id),userId:A("user_id").notNull().references(()=>qt.id),role:A("role",{enum:["viewer","editor","admin"]}).notNull()},(t)=>({pk:En({columns:[t.orgId,t.userId]})})),Ae=it("drives",{id:A("id").primaryKey(),orgId:A("org_id").notNull().references(()=>xt.id),name:A("name").notNull(),isDefault:h("is_default",{mode:"boolean"}).notNull().default(!1),createdAt:h("created_at",{mode:"timestamp"}).notNull()}),Zl=it("drive_members",{driveId:A("drive_id").notNull().references(()=>Ae.id),userId:A("user_id").notNull().references(()=>qt.id),role:A("role",{enum:["viewer","editor","admin"]}).notNull()},(t)=>({pk:En({columns:[t.driveId,t.userId]})})),Bl=it("files",{path:A("path").notNull(),driveId:A("drive_id").notNull().references(()=>Ae.id),size:h("size").notNull(),contentType:A("content_type"),author:A("author").notNull(),currentVersionId:A("current_version_id"),createdAt:h("created_at",{mode:"timestamp"}).notNull(),modifiedAt:h("modified_at",{mode:"timestamp"}).notNull(),isDeleted:h("is_deleted",{mode:"boolean"}).notNull().default(!1),embeddingStatus:A("embedding_status",{enum:["pending","indexed","failed"]}).default("pending")},(t)=>({pk:En({columns:[t.path,t.driveId]})})),Ql=it("file_versions",{id:h("id").primaryKey({autoIncrement:!0}),path:A("path").notNull(),driveId:A("drive_id").notNull(),version:h("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:h("size"),etag:A("etag"),createdAt:h("created_at",{mode:"timestamp"}).notNull()}),Vl=it("comments",{id:A("id").primaryKey(),parentId:A("parent_id"),orgId:A("org_id").notNull().references(()=>xt.id),driveId:A("drive_id").notNull().references(()=>Ae.id),path:A("path").notNull(),lineStart:h("line_start"),lineEnd:h("line_end"),quotedContent:A("quoted_content"),fileVersionId:h("file_version_id"),body:A("body").notNull(),author:A("author").notNull().references(()=>qt.id),resolved:h("resolved",{mode:"boolean"}).notNull().default(!1),resolvedBy:A("resolved_by"),resolvedAt:h("resolved_at",{mode:"timestamp"}),createdAt:h("created_at",{mode:"timestamp"}).notNull(),updatedAt:h("updated_at",{mode:"timestamp"}).notNull(),isDeleted:h("is_deleted",{mode:"boolean"}).notNull().default(!1)}),Jl=it("events",{id:A("id").primaryKey(),orgId:A("org_id").notNull().references(()=>xt.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:h("created_at",{mode:"timestamp"}).notNull()}),Wl=it("content_chunks",{id:h("id").primaryKey({autoIncrement:!0}),filePath:A("file_path").notNull(),driveId:A("drive_id").notNull(),chunkIndex:h("chunk_index").notNull(),content:A("content").notNull(),charOffset:h("char_offset").notNull(),tokenCount:h("token_count").notNull()})});var li=`
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
- `,Vo=`
119
+ `,yi=`
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,89 +127,109 @@ 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 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=`
130
+ `;import{Database as Kl}from"bun:sqlite";import{drizzle as bl}from"drizzle-orm/bun-sqlite";import*as si from"sqlite-vec";import{existsSync as kl,mkdirSync as jl}from"fs";import{dirname as zl}from"path";function ql(t){si.load(t)}function gt(t){let e=t??pt(),n=zl(e);if(!kl(n))jl(n,{recursive:!0});let o=new Kl(e);return ql(o),o.exec("PRAGMA journal_mode=WAL;"),o.exec("PRAGMA foreign_keys=ON;"),o.exec(li),o.exec(yi),bl(o,{schema:f})}var P=g(()=>{ii();zt();Ei()});var ln=Q((ey)=>{var gi=(t)=>encodeURIComponent(t).replace(/[!'()*]/g,xl),xl=(t)=>`%${t.charCodeAt(0).toString(16).toUpperCase()}`,ty=(t)=>t.split("/").map(gi).join("/");ey.escapeUri=gi;ey.escapeUriPath=ty});var Ti=Q((ry)=>{var yn=ln();function iy(t){let e=[];for(let n of Object.keys(t).sort()){let o=t[n];if(n=yn.escapeUri(n),Array.isArray(o))for(let i=0,r=o.length;i<r;i++)e.push(`${n}=${yn.escapeUri(o[i])}`);else{let i=n;if(o||typeof o==="string")i+=`=${yn.escapeUri(o)}`;e.push(i)}}return e.join("&")}ry.buildQueryString=iy});function di(t){let{port:e,query:n}=t,{protocol:o,path:i,hostname:r}=t;if(o&&o.slice(-1)!==":")o+=":";if(e)r+=`:${e}`;if(i&&i.charAt(0)!=="/")i=`/${i}`;let u=n?Ri.buildQueryString(n):"";if(u&&u[0]!=="?")u=`?${u}`;let E="";if(t.username!=null||t.password!=null){let y=t.username??"",s=t.password??"";E=`${y}:${s}@`}let l="";if(t.fragment)l=`#${t.fragment}`;return`${o}//${E}${r}${i}${u}${l}`}var Ri;var Ai=g(()=>{Ri=k(Ti(),1)});var Ni=async(t)=>{let e=t?.Bucket||"";if(typeof t.Bucket==="string")t.Bucket=e.replace(/#/g,encodeURIComponent("#")).replace(/\?/g,encodeURIComponent("?"));if(sy(e)){if(t.ForcePathStyle===!0)throw Error("Path-style addressing cannot be used with ARN buckets")}else if(!yy(e)||e.indexOf(".")!==-1&&!String(t.Endpoint).startsWith("http:")||e.toLowerCase()!==e||e.length<3)t.ForcePathStyle=!0;if(t.DisableMultiRegionAccessPoints)t.disableMultiRegionAccessPoints=!0,t.DisableMRAP=!0;return t},fy,Ey,ly,yy=(t)=>fy.test(t)&&!Ey.test(t)&&!ly.test(t),sy=(t)=>{let[e,n,o,,,i]=t.split(":"),r=e==="arn"&&t.split(":").length>=6,u=Boolean(r&&n&&o&&i);if(r&&!u)throw Error(`Invalid ARN: ${t} was an invalid ARN.`);return u};var wi=g(()=>{fy=/^[a-z0-9][a-z0-9\.\-]{1,61}[a-z0-9]$/,Ey=/(\d+\.){3}\d+/,ly=/\.\./});var Ii=g(()=>{wi()});var _i=(t,e,n,o=!1)=>{let i=async()=>{let r;if(o)r=n.clientContextParams?.[t]??n[t]??n[e];else r=n[t]??n[e];if(typeof r==="function")return r();return r};if(t==="credentialScope"||e==="CredentialScope")return async()=>{let r=typeof n.credentials==="function"?await n.credentials():n.credentials;return r?.credentialScope??r?.CredentialScope};if(t==="accountId"||e==="AccountId")return async()=>{let r=typeof n.credentials==="function"?await n.credentials():n.credentials;return r?.accountId??r?.AccountId};if(t==="endpoint"||e==="endpoint")return async()=>{if(n.isCustomEndpoint===!1)return;let r=await i();if(r&&typeof r==="object"){if("url"in r)return r.url.href;if("hostname"in r){let{protocol:u,hostname:E,port:l,path:y}=r;return`${u}//${E}${l?":"+l:""}${y}`}}return r};return i};var te=Q((dy)=>{class Ht extends Error{name="ProviderError";tryNextLink;constructor(t,e=!0){let n,o=!0;if(typeof e==="boolean")n=void 0,o=e;else if(e!=null&&typeof e==="object")n=e.logger,o=e.tryNextLink??!0;super(t);this.tryNextLink=o,Object.setPrototypeOf(this,Ht.prototype),n?.debug?.(`@smithy/property-provider ${o?"->":"(!)"} ${t}`)}static from(t,e=!0){return Object.assign(new this(t.message,e),t)}}class sn extends Ht{name="CredentialsProviderError";constructor(t,e=!0){super(t,e);Object.setPrototypeOf(this,sn.prototype)}}class gn extends Ht{name="TokenProviderError";constructor(t,e=!0){super(t,e);Object.setPrototypeOf(this,gn.prototype)}}var gy=(...t)=>async()=>{if(t.length===0)throw new Ht("No providers in chain");let e;for(let n of t)try{return await n()}catch(o){if(e=o,o?.tryNextLink)continue;throw o}throw e},Ty=(t)=>()=>Promise.resolve(t),Ry=(t,e,n)=>{let o,i,r,u=!1,E=async()=>{if(!i)i=t();try{o=await i,r=!0,u=!1}finally{i=void 0}return o};if(e===void 0)return async(l)=>{if(!r||l?.forceRefresh)o=await E();return o};return async(l)=>{if(!r||l?.forceRefresh)o=await E();if(u)return o;if(n&&!n(o))return u=!0,o;if(e(o))return await E(),o;return o}};dy.CredentialsProviderError=sn;dy.ProviderError=Ht;dy.TokenProviderError=gn;dy.chain=gy;dy.fromStatic=Ty;dy.memoize=Ry});function Ne(t){try{let e=new Set(Array.from(t.match(/([A-Z_]){3,}/g)??[]));return e.delete("CONFIG"),e.delete("CONFIG_PREFIX_SEPARATOR"),e.delete("ENV"),[...e].join(", ")}catch(e){return t}}var pi,Di=(t,e)=>async()=>{try{let n=t(process.env,e);if(n===void 0)throw Error();return n}catch(n){throw new pi.CredentialsProviderError(n.message||`Not found in ENV: ${Ne(t.toString())}`,{logger:e?.logger})}};var Li=g(()=>{pi=k(te(),1)});import{homedir as Dy}from"os";import{sep as Ly}from"path";var Tn,vy=()=>{if(process&&process.geteuid)return`${process.geteuid()}`;return"DEFAULT"},Yt=()=>{let{HOME:t,USERPROFILE:e,HOMEPATH:n,HOMEDRIVE:o=`C:${Ly}`}=process.env;if(t)return t;if(e)return e;if(n)return`${o}${n}`;let i=vy();if(!Tn[i])Tn[i]=Dy();return Tn[i]};var ee=g(()=>{Tn={}});var vi=(t)=>t.profile||process.env.AWS_PROFILE||"default";var Oi=()=>{};var oe=Q((Py)=>{Py.HttpAuthLocation=void 0;(function(t){t.HEADER="header",t.QUERY="query"})(Py.HttpAuthLocation||(Py.HttpAuthLocation={}));Py.HttpApiKeyAuthLocation=void 0;(function(t){t.HEADER="header",t.QUERY="query"})(Py.HttpApiKeyAuthLocation||(Py.HttpApiKeyAuthLocation={}));Py.EndpointURLScheme=void 0;(function(t){t.HTTP="http",t.HTTPS="https"})(Py.EndpointURLScheme||(Py.EndpointURLScheme={}));Py.AlgorithmId=void 0;(function(t){t.MD5="md5",t.CRC32="crc32",t.CRC32C="crc32c",t.SHA1="sha1",t.SHA256="sha256"})(Py.AlgorithmId||(Py.AlgorithmId={}));var Oy=(t)=>{let e=[];if(t.sha256!==void 0)e.push({algorithmId:()=>Py.AlgorithmId.SHA256,checksumConstructor:()=>t.sha256});if(t.md5!=null)e.push({algorithmId:()=>Py.AlgorithmId.MD5,checksumConstructor:()=>t.md5});return{addChecksumAlgorithm(n){e.push(n)},checksumAlgorithms(){return e}}},Sy=(t)=>{let e={};return t.checksumAlgorithms().forEach((n)=>{e[n.algorithmId()]=n.checksumConstructor()}),e},Uy=(t)=>{return Oy(t)},hy=(t)=>{return Sy(t)};Py.FieldPosition=void 0;(function(t){t[t.HEADER=0]="HEADER",t[t.TRAILER=1]="TRAILER"})(Py.FieldPosition||(Py.FieldPosition={}));var $y="__smithy_context";Py.IniSectionType=void 0;(function(t){t.PROFILE="profile",t.SSO_SESSION="sso-session",t.SERVICES="services"})(Py.IniSectionType||(Py.IniSectionType={}));Py.RequestHandlerProtocol=void 0;(function(t){t.HTTP_0_9="http/0.9",t.HTTP_1_0="http/1.0",t.TDS_8_0="tds/8.0"})(Py.RequestHandlerProtocol||(Py.RequestHandlerProtocol={}));Py.SMITHY_CONTEXT_KEY=$y;Py.getDefaultClientConfiguration=Uy;Py.resolveDefaultRuntimeConfig=hy});var rt=".";var _n,Si=(t)=>Object.entries(t).filter(([e])=>{let n=e.indexOf(rt);if(n===-1)return!1;return Object.values(_n.IniSectionType).includes(e.substring(0,n))}).reduce((e,[n,o])=>{let i=n.indexOf(rt),r=n.substring(0,i)===_n.IniSectionType.PROFILE?n.substring(i+1):n;return e[r]=o,e},{...t.default&&{default:t.default}});var Ui=g(()=>{_n=k(oe(),1)});import{join as My}from"path";var cy="AWS_CONFIG_FILE",hi=()=>process.env[cy]||My(Yt(),".aws","config");var $i=g(()=>{ee()});import{join as Xy}from"path";var Fy="AWS_SHARED_CREDENTIALS_FILE",Pi=()=>process.env[Fy]||Xy(Yt(),".aws","credentials");var ai=g(()=>{ee()});var mi,Hy,Yy,pn=(t)=>{let e={},n,o;for(let i of t.split(/\r?\n/)){let r=i.split(/(^|\s)[;#]/)[0].trim();if(r[0]==="["&&r[r.length-1]==="]"){n=void 0,o=void 0;let E=r.substring(1,r.length-1),l=Hy.exec(E);if(l){let[,y,,s]=l;if(Object.values(mi.IniSectionType).includes(y))n=[y,s].join(rt)}else n=E;if(Yy.includes(E))throw Error(`Found invalid profile name "${E}"`)}else if(n){let E=r.indexOf("=");if(![0,-1].includes(E)){let[l,y]=[r.substring(0,E).trim(),r.substring(E+1).trim()];if(y==="")o=l;else{if(o&&i.trimStart()===i)o=void 0;e[n]=e[n]||{};let s=o?[o,l].join(rt):l;e[n][s]=y}}}}return e};var Ci=g(()=>{mi=k(oe(),1),Hy=/^([\w-]+)\s(["'])?([\w-@\+\.%:/]+)\2$/,Yy=["__proto__","profile __proto__"]});import{readFile as Gy}from"fs/promises";var Dn,Mi,Ln=(t,e)=>{if(Mi[t]!==void 0)return Mi[t];if(!Dn[t]||e?.ignoreCache)Dn[t]=Gy(t,"utf8");return Dn[t]};var ci=g(()=>{Dn={},Mi={}});import{join as Xi}from"path";var Fi=()=>({}),Hi=async(t={})=>{let{filepath:e=Pi(),configFilepath:n=hi()}=t,o=Yt(),i="~/",r=e;if(e.startsWith("~/"))r=Xi(o,e.slice(2));let u=n;if(n.startsWith("~/"))u=Xi(o,n.slice(2));let E=await Promise.all([Ln(u,{ignoreCache:t.ignoreCache}).then(pn).then(Si).catch(Fi),Ln(r,{ignoreCache:t.ignoreCache}).then(pn).catch(Fi)]);return{configFile:E[0],credentialsFile:E[1]}};var Yi=g(()=>{Ui();$i();ai();ee();Ci();ci()});var Gi=()=>{};var Zi=()=>{};var Bi=()=>{};var vn=g(()=>{ee();Oi();Yi();Gi();Zi();Bi()});var Qi,Vi=(t,{preferredFile:e="config",...n}={})=>async()=>{let o=vi(n),{configFile:i,credentialsFile:r}=await Hi(n),u=r[o]||{},E=i[o]||{},l=e==="config"?{...u,...E}:{...E,...u};try{let s=t(l,e==="config"?i:r);if(s===void 0)throw Error();return s}catch(y){throw new Qi.CredentialsProviderError(y.message||`Not found in config files w/ profile [${o}]: ${Ne(t.toString())}`,{logger:n.logger})}};var Ji=g(()=>{vn();Qi=k(te(),1)});var Wi,Zy=(t)=>typeof t==="function",Ki=(t)=>Zy(t)?async()=>await t():Wi.fromStatic(t);var bi=g(()=>{Wi=k(te(),1)});var we,ki=({environmentVariableSelector:t,configFileSelector:e,default:n},o={})=>{let{signingName:i,logger:r}=o;return we.memoize(we.chain(Di(t,{signingName:i,logger:r}),Vi(e,o),Ki(n)))};var ji=g(()=>{Li();Ji();bi();we=k(te(),1)});var zi=g(()=>{ji()});var qi="AWS_ENDPOINT_URL",xi="endpoint_url",tr=(t)=>({environmentVariableSelector:(e)=>{let n=t.split(" ").map((r)=>r.toUpperCase()),o=e[[qi,...n].join("_")];if(o)return o;let i=e[qi];if(i)return i;return},configFileSelector:(e,n)=>{if(n&&e.services){let i=n[["services",e.services].join(rt)];if(i){let r=t.split(" ").map((E)=>E.toLowerCase()),u=i[[r.join("_"),xi].join(rt)];if(u)return u}}let o=e[xi];if(o)return o;return},default:void 0});var er=g(()=>{vn()});var nr=async(t)=>ki(tr(t??""))();var or=g(()=>{zi();er()});var ir=Q((Qy)=>{function By(t){let e={};if(t=t.replace(/^\?/,""),t)for(let n of t.split("&")){let[o,i=null]=n.split("=");if(o=decodeURIComponent(o),i)i=decodeURIComponent(i);if(!(o in e))e[o]=i;else if(Array.isArray(e[o]))e[o].push(i);else e[o]=[e[o],i]}return e}Qy.parseQueryString=By});var ur=Q((Wy)=>{var Jy=ir(),rr=(t)=>{if(typeof t==="string")return rr(new URL(t));let{hostname:e,pathname:n,port:o,protocol:i,search:r}=t,u;if(r)u=Jy.parseQueryString(r);return{hostname:e,port:o?parseInt(o):void 0,protocol:i,path:n,query:u}};Wy.parseUrl=rr});var On,fr=(t)=>{if(typeof t==="object"){if("url"in t){let e=On.parseUrl(t.url);if(t.headers){e.headers={};for(let[n,o]of Object.entries(t.headers))e.headers[n.toLowerCase()]=o.join(", ")}return e}return t}return On.parseUrl(t)};var Sn=g(()=>{On=k(ur(),1)});var Er=async(t,e,n,o)=>{if(!n.isCustomEndpoint){let u;if(n.serviceConfiguredEndpoint)u=await n.serviceConfiguredEndpoint();else u=await nr(n.serviceId);if(u)n.endpoint=()=>Promise.resolve(fr(u)),n.isCustomEndpoint=!0}let i=await by(t,e,n);if(typeof n.endpointProvider!=="function")throw Error("config.endpointProvider is not set.");let r=n.endpointProvider(i,o);if(n.isCustomEndpoint&&n.endpoint){let u=await n.endpoint();if(u?.headers){r.headers??={};for(let[E,l]of Object.entries(u.headers))r.headers[E]=Array.isArray(l)?l:[l]}}return r},by=async(t,e,n)=>{let o={},i=e?.getEndpointParameterInstructions?.()||{};for(let[r,u]of Object.entries(i))switch(u.type){case"staticContextParams":o[r]=u.value;break;case"contextParams":o[r]=t[u.name];break;case"clientContextParams":case"builtInParams":o[r]=await _i(u.name,r,n,u.type!=="builtInParams")();break;case"operationContextParams":o[r]=u.get(t);break;default:throw Error("Unrecognized endpoint parameter instruction: "+JSON.stringify(u))}if(Object.keys(i).length===0)Object.assign(o,n);if(String(n.serviceId).toLowerCase()==="s3")await Ni(o);return o};var lr=g(()=>{Ii();or();Sn()});var yr=g(()=>{lr();Sn()});var gr=Q((zy)=>{var sr=oe(),ky=(t)=>t[sr.SMITHY_CONTEXT_KEY]||(t[sr.SMITHY_CONTEXT_KEY]={}),jy=(t)=>{if(typeof t==="function")return t;let e=Promise.resolve(t);return()=>e};zy.getSmithyContext=ky;zy.normalizeProvider=jy});var Tr=()=>{};var Un=Q((rs)=>{var ts=oe(),es=(t)=>{return{setHttpHandler(e){t.httpHandler=e},httpHandler(){return t.httpHandler},updateHttpClientConfig(e,n){t.httpHandler?.updateHttpClientConfig(e,n)},httpHandlerConfigs(){return t.httpHandler.httpHandlerConfigs()}}},ns=(t)=>{return{httpHandler:t.httpHandler()}};class Rr{name;kind;values;constructor({name:t,kind:e=ts.FieldPosition.HEADER,values:n=[]}){this.name=t,this.kind=e,this.values=n}add(t){this.values.push(t)}set(t){this.values=t}remove(t){this.values=this.values.filter((e)=>e!==t)}toString(){return this.values.map((t)=>t.includes(",")||t.includes(" ")?`"${t}"`:t).join(", ")}get(){return this.values}}class dr{entries={};encoding;constructor({fields:t=[],encoding:e="utf-8"}){t.forEach(this.setField.bind(this)),this.encoding=e}setField(t){this.entries[t.name.toLowerCase()]=t}getField(t){return this.entries[t.toLowerCase()]}removeField(t){delete this.entries[t.toLowerCase()]}getByType(t){return Object.values(this.entries).filter((e)=>e.kind===t)}}class Ie{method;protocol;hostname;port;path;query;headers;username;password;fragment;body;constructor(t){this.method=t.method||"GET",this.hostname=t.hostname||"localhost",this.port=t.port,this.query=t.query||{},this.headers=t.headers||{},this.body=t.body,this.protocol=t.protocol?t.protocol.slice(-1)!==":"?`${t.protocol}:`:t.protocol:"https:",this.path=t.path?t.path.charAt(0)!=="/"?`/${t.path}`:t.path:"/",this.username=t.username,this.password=t.password,this.fragment=t.fragment}static clone(t){let e=new Ie({...t,headers:{...t.headers}});if(e.query)e.query=os(e.query);return e}static isInstance(t){if(!t)return!1;let e=t;return"method"in e&&"protocol"in e&&"hostname"in e&&"path"in e&&typeof e.query==="object"&&typeof e.headers==="object"}clone(){return Ie.clone(this)}}function os(t){return Object.keys(t).reduce((e,n)=>{let o=t[n];return{...e,[n]:Array.isArray(o)?[...o]:o}},{})}class Ar{statusCode;reason;headers;body;constructor(t){this.statusCode=t.statusCode,this.reason=t.reason,this.headers=t.headers||{},this.body=t.body}static isInstance(t){if(!t)return!1;let e=t;return typeof e.statusCode==="number"&&typeof e.headers==="object"}}function is(t){return/^[a-z0-9][a-z0-9\.\-]*[a-z0-9]$/.test(t)}rs.Field=Rr;rs.Fields=dr;rs.HttpRequest=Ie;rs.HttpResponse=Ar;rs.getHttpHandlerExtensionConfiguration=es;rs.isValidHostname=is;rs.resolveHttpHandlerRuntimeConfig=ns});var Nr=()=>{};var wr=()=>{};var Ir;var _r=g(()=>{Ir={name:"serializerMiddleware",step:"serialize",tags:["SERIALIZER"],override:!0}});var pr=g(()=>{Nr();_r();wr()});var eN;var Dr=g(()=>{pr();eN={step:"serialize",tags:["ENDPOINT_PARAMETERS","ENDPOINT_V2","ENDPOINT"],name:"endpointV2Middleware",override:!0,relation:"before",toMiddleware:Ir.name}});var Lr=()=>{};var vr=()=>{};var Or=g(()=>{yr();Tr();Dr();Lr();vr()});var Sr=()=>{};var Ur=()=>{};var hr=()=>{};var $r=()=>{};var ar=Q((ds)=>{var Pr={},hn={};for(let t=0;t<256;t++){let e=t.toString(16).toLowerCase();if(e.length===1)e=`0${e}`;Pr[t]=e,hn[e]=t}function Ts(t){if(t.length%2!==0)throw Error("Hex encoded strings must have an even number length");let e=new Uint8Array(t.length/2);for(let n=0;n<t.length;n+=2){let o=t.slice(n,n+2).toLowerCase();if(o in hn)e[n/2]=hn[o];else throw Error(`Cannot decode unrecognized sequence ${o} as hexadecimal`)}return e}function Rs(t){let e="";for(let n=0;n<t.byteLength;n++)e+=Pr[t[n]];return e}ds.fromHex=Ts;ds.toHex=Rs});var $n=Q((Is)=>{var ws=(t)=>typeof ArrayBuffer==="function"&&t instanceof ArrayBuffer||Object.prototype.toString.call(t)==="[object ArrayBuffer]";Is.isArrayBuffer=ws});var mr=Q((vs)=>{var ps=$n(),Pn=Re("buffer"),Ds=(t,e=0,n=t.byteLength-e)=>{if(!ps.isArrayBuffer(t))throw TypeError(`The "input" argument must be ArrayBuffer. Received type ${typeof t} (${t})`);return Pn.Buffer.from(t,e,n)},Ls=(t,e)=>{if(typeof t!=="string")throw TypeError(`The "input" argument must be of type string. Received type ${typeof t} (${t})`);return e?Pn.Buffer.from(t,e):Pn.Buffer.from(t)};vs.fromArrayBuffer=Ds;vs.fromString=Ls});var cr=Q(($s)=>{var Cr=mr(),Mr=(t)=>{let e=Cr.fromString(t,"utf8");return new Uint8Array(e.buffer,e.byteOffset,e.byteLength/Uint8Array.BYTES_PER_ELEMENT)},Us=(t)=>{if(typeof t==="string")return Mr(t);if(ArrayBuffer.isView(t))return new Uint8Array(t.buffer,t.byteOffset,t.byteLength/Uint8Array.BYTES_PER_ELEMENT);return new Uint8Array(t)},hs=(t)=>{if(typeof t==="string")return t;if(typeof t!=="object"||typeof t.byteOffset!=="number"||typeof t.byteLength!=="number")throw Error("@smithy/util-utf8: toUtf8 encoder function only accepts string | Uint8Array.");return Cr.fromArrayBuffer(t.buffer,t.byteOffset,t.byteLength).toString("utf8")};$s.fromUtf8=Mr;$s.toUint8Array=Us;$s.toUtf8=hs});var Zn=Q((Qs)=>{var Tt=ar(),Dt=cr(),Cs=$n(),Yr=Un(),Xr=gr(),_e=ln(),Gr="X-Amz-Algorithm",Zr="X-Amz-Credential",Cn="X-Amz-Date",Br="X-Amz-SignedHeaders",Qr="X-Amz-Expires",Mn="X-Amz-Signature",cn="X-Amz-Security-Token",Ms="X-Amz-Region-Set",Xn="authorization",Fn=Cn.toLowerCase(),Vr="date",Jr=[Xn,Fn,Vr],Wr=Mn.toLowerCase(),Oe="x-amz-content-sha256",Kr=cn.toLowerCase(),cs="host",br={authorization:!0,"cache-control":!0,connection:!0,expect:!0,from:!0,"keep-alive":!0,"max-forwards":!0,pragma:!0,referer:!0,te:!0,trailer:!0,"transfer-encoding":!0,upgrade:!0,"user-agent":!0,"x-amzn-trace-id":!0},kr=/^proxy-/,jr=/^sec-/,Xs=[/^proxy-/i,/^sec-/i],pe="AWS4-HMAC-SHA256",Fs="AWS4-ECDSA-P256-SHA256",zr="AWS4-HMAC-SHA256-PAYLOAD",qr="UNSIGNED-PAYLOAD",xr=50,Hn="aws4_request",tu=604800,Gt={},De=[],Le=(t,e,n)=>`${t}/${e}/${n}/${Hn}`,eu=async(t,e,n,o,i)=>{let r=await Fr(t,e.secretAccessKey,e.accessKeyId),u=`${n}:${o}:${i}:${Tt.toHex(r)}:${e.sessionToken}`;if(u in Gt)return Gt[u];De.push(u);while(De.length>xr)delete Gt[De.shift()];let E=`AWS4${e.secretAccessKey}`;for(let l of[n,o,i,Hn])E=await Fr(t,E,l);return Gt[u]=E},Hs=()=>{De.length=0,Object.keys(Gt).forEach((t)=>{delete Gt[t]})},Fr=(t,e,n)=>{let o=new t(e);return o.update(Dt.toUint8Array(n)),o.digest()},an=({headers:t},e,n)=>{let o={};for(let i of Object.keys(t).sort()){if(t[i]==null)continue;let r=i.toLowerCase();if(r in br||e?.has(r)||kr.test(r)||jr.test(r)){if(!n||n&&!n.has(r))continue}o[r]=t[i].trim().replace(/\s+/g," ")}return o},ve=async({headers:t,body:e},n)=>{for(let o of Object.keys(t))if(o.toLowerCase()===Oe)return t[o];if(e==null)return"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";else if(typeof e==="string"||ArrayBuffer.isView(e)||Cs.isArrayBuffer(e)){let o=new n;return o.update(Dt.toUint8Array(e)),Tt.toHex(await o.digest())}return qr};class nu{format(t){let e=[];for(let i of Object.keys(t)){let r=Dt.fromUtf8(i);e.push(Uint8Array.from([r.byteLength]),r,this.formatHeaderValue(t[i]))}let n=new Uint8Array(e.reduce((i,r)=>i+r.byteLength,0)),o=0;for(let i of e)n.set(i,o),o+=i.byteLength;return n}formatHeaderValue(t){switch(t.type){case"boolean":return Uint8Array.from([t.value?0:1]);case"byte":return Uint8Array.from([2,t.value]);case"short":let e=new DataView(new ArrayBuffer(3));return e.setUint8(0,3),e.setInt16(1,t.value,!1),new Uint8Array(e.buffer);case"integer":let n=new DataView(new ArrayBuffer(5));return n.setUint8(0,4),n.setInt32(1,t.value,!1),new Uint8Array(n.buffer);case"long":let o=new Uint8Array(9);return o[0]=5,o.set(t.value.bytes,1),o;case"binary":let i=new DataView(new ArrayBuffer(3+t.value.byteLength));i.setUint8(0,6),i.setUint16(1,t.value.byteLength,!1);let r=new Uint8Array(i.buffer);return r.set(t.value,3),r;case"string":let u=Dt.fromUtf8(t.value),E=new DataView(new ArrayBuffer(3+u.byteLength));E.setUint8(0,7),E.setUint16(1,u.byteLength,!1);let l=new Uint8Array(E.buffer);return l.set(u,3),l;case"timestamp":let y=new Uint8Array(9);return y[0]=8,y.set(Yn.fromNumber(t.value.valueOf()).bytes,1),y;case"uuid":if(!Ys.test(t.value))throw Error(`Invalid UUID received: ${t.value}`);let s=new Uint8Array(17);return s[0]=9,s.set(Tt.fromHex(t.value.replace(/\-/g,"")),1),s}}}var Ys=/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/;class Yn{bytes;constructor(t){if(this.bytes=t,t.byteLength!==8)throw Error("Int64 buffers must be exactly 8 bytes")}static fromNumber(t){if(t>9223372036854776000||t<-9223372036854776000)throw Error(`${t} is too large (or, if negative, too small) to represent as an Int64`);let e=new Uint8Array(8);for(let n=7,o=Math.abs(Math.round(t));n>-1&&o>0;n--,o/=256)e[n]=o;if(t<0)Hr(e);return new Yn(e)}valueOf(){let t=this.bytes.slice(0),e=t[0]&128;if(e)Hr(t);return parseInt(Tt.toHex(t),16)*(e?-1:1)}toString(){return String(this.valueOf())}}function Hr(t){for(let e=0;e<8;e++)t[e]^=255;for(let e=7;e>-1;e--)if(t[e]++,t[e]!==0)break}var ou=(t,e)=>{t=t.toLowerCase();for(let n of Object.keys(e))if(t===n.toLowerCase())return!0;return!1},iu=(t,e={})=>{let{headers:n,query:o={}}=Yr.HttpRequest.clone(t);for(let i of Object.keys(n)){let r=i.toLowerCase();if(r.slice(0,6)==="x-amz-"&&!e.unhoistableHeaders?.has(r)||e.hoistableHeaders?.has(r))o[i]=n[i],delete n[i]}return{...t,headers:n,query:o}},mn=(t)=>{t=Yr.HttpRequest.clone(t);for(let e of Object.keys(t.headers))if(Jr.indexOf(e.toLowerCase())>-1)delete t.headers[e];return t},ru=({query:t={}})=>{let e=[],n={};for(let o of Object.keys(t)){if(o.toLowerCase()===Wr)continue;let i=_e.escapeUri(o);e.push(i);let r=t[o];if(typeof r==="string")n[i]=`${i}=${_e.escapeUri(r)}`;else if(Array.isArray(r))n[i]=r.slice(0).reduce((u,E)=>u.concat([`${i}=${_e.escapeUri(E)}`]),[]).sort().join("&")}return e.sort().map((o)=>n[o]).filter((o)=>o).join("&")},Gs=(t)=>Zs(t).toISOString().replace(/\.\d{3}Z$/,"Z"),Zs=(t)=>{if(typeof t==="number")return new Date(t*1000);if(typeof t==="string"){if(Number(t))return new Date(Number(t)*1000);return new Date(t)}return t};class Gn{service;regionProvider;credentialProvider;sha256;uriEscapePath;applyChecksum;constructor({applyChecksum:t,credentials:e,region:n,service:o,sha256:i,uriEscapePath:r=!0}){this.service=o,this.sha256=i,this.uriEscapePath=r,this.applyChecksum=typeof t==="boolean"?t:!0,this.regionProvider=Xr.normalizeProvider(n),this.credentialProvider=Xr.normalizeProvider(e)}createCanonicalRequest(t,e,n){let o=Object.keys(e).sort();return`${t.method}
131
+ ${this.getCanonicalPath(t)}
132
+ ${ru(t)}
133
+ ${o.map((i)=>`${i}:${e[i]}`).join(`
134
+ `)}
135
+
136
+ ${o.join(";")}
137
+ ${n}`}async createStringToSign(t,e,n,o){let i=new this.sha256;i.update(Dt.toUint8Array(n));let r=await i.digest();return`${o}
138
+ ${t}
139
+ ${e}
140
+ ${Tt.toHex(r)}`}getCanonicalPath({path:t}){if(this.uriEscapePath){let e=[];for(let i of t.split("/")){if(i?.length===0)continue;if(i===".")continue;if(i==="..")e.pop();else e.push(i)}let n=`${t?.startsWith("/")?"/":""}${e.join("/")}${e.length>0&&t?.endsWith("/")?"/":""}`;return _e.escapeUri(n).replace(/%2F/g,"/")}return t}validateResolvedCredentials(t){if(typeof t!=="object"||typeof t.accessKeyId!=="string"||typeof t.secretAccessKey!=="string")throw Error("Resolved credential object is not valid")}formatDate(t){let e=Gs(t).replace(/[\-:]/g,"");return{longDate:e,shortDate:e.slice(0,8)}}getCanonicalHeaderList(t){return Object.keys(t).sort().join(";")}}class uu extends Gn{headerFormatter=new nu;constructor({applyChecksum:t,credentials:e,region:n,service:o,sha256:i,uriEscapePath:r=!0}){super({applyChecksum:t,credentials:e,region:n,service:o,sha256:i,uriEscapePath:r})}async presign(t,e={}){let{signingDate:n=new Date,expiresIn:o=3600,unsignableHeaders:i,unhoistableHeaders:r,signableHeaders:u,hoistableHeaders:E,signingRegion:l,signingService:y}=e,s=await this.credentialProvider();this.validateResolvedCredentials(s);let R=l??await this.regionProvider(),{longDate:d,shortDate:L}=this.formatDate(n);if(o>tu)return Promise.reject("Signature version 4 presigned URLs must have an expiration date less than one week in the future");let O=Le(L,R,y??this.service),C=iu(mn(t),{unhoistableHeaders:r,hoistableHeaders:E});if(s.sessionToken)C.query[cn]=s.sessionToken;C.query[Gr]=pe,C.query[Zr]=`${s.accessKeyId}/${O}`,C.query[Cn]=d,C.query[Qr]=o.toString(10);let M=an(C,i,u);return C.query[Br]=this.getCanonicalHeaderList(M),C.query[Mn]=await this.getSignature(d,O,this.getSigningKey(s,R,L,y),this.createCanonicalRequest(C,M,await ve(t,this.sha256))),C}async sign(t,e){if(typeof t==="string")return this.signString(t,e);else if(t.headers&&t.payload)return this.signEvent(t,e);else if(t.message)return this.signMessage(t,e);else return this.signRequest(t,e)}async signEvent({headers:t,payload:e},{signingDate:n=new Date,priorSignature:o,signingRegion:i,signingService:r}){let u=i??await this.regionProvider(),{shortDate:E,longDate:l}=this.formatDate(n),y=Le(E,u,r??this.service),s=await ve({headers:{},body:e},this.sha256),R=new this.sha256;R.update(t);let d=Tt.toHex(await R.digest()),L=[zr,l,y,o,d,s].join(`
141
+ `);return this.signString(L,{signingDate:n,signingRegion:u,signingService:r})}async signMessage(t,{signingDate:e=new Date,signingRegion:n,signingService:o}){return this.signEvent({headers:this.headerFormatter.format(t.message.headers),payload:t.message.body},{signingDate:e,signingRegion:n,signingService:o,priorSignature:t.priorSignature}).then((r)=>{return{message:t.message,signature:r}})}async signString(t,{signingDate:e=new Date,signingRegion:n,signingService:o}={}){let i=await this.credentialProvider();this.validateResolvedCredentials(i);let r=n??await this.regionProvider(),{shortDate:u}=this.formatDate(e),E=new this.sha256(await this.getSigningKey(i,r,u,o));return E.update(Dt.toUint8Array(t)),Tt.toHex(await E.digest())}async signRequest(t,{signingDate:e=new Date,signableHeaders:n,unsignableHeaders:o,signingRegion:i,signingService:r}={}){let u=await this.credentialProvider();this.validateResolvedCredentials(u);let E=i??await this.regionProvider(),l=mn(t),{longDate:y,shortDate:s}=this.formatDate(e),R=Le(s,E,r??this.service);if(l.headers[Fn]=y,u.sessionToken)l.headers[Kr]=u.sessionToken;let d=await ve(l,this.sha256);if(!ou(Oe,l.headers)&&this.applyChecksum)l.headers[Oe]=d;let L=an(l,o,n),O=await this.getSignature(y,R,this.getSigningKey(u,E,s,r),this.createCanonicalRequest(l,L,d));return l.headers[Xn]=`${pe} Credential=${u.accessKeyId}/${R}, SignedHeaders=${this.getCanonicalHeaderList(L)}, Signature=${O}`,l}async getSignature(t,e,n,o){let i=await this.createStringToSign(t,e,o,pe),r=new this.sha256(await n);return r.update(Dt.toUint8Array(i)),Tt.toHex(await r.digest())}getSigningKey(t,e,n,o){return eu(this.sha256,t,n,e,o||this.service)}}var Bs={SignatureV4a:null};Qs.ALGORITHM_IDENTIFIER=pe;Qs.ALGORITHM_IDENTIFIER_V4A=Fs;Qs.ALGORITHM_QUERY_PARAM=Gr;Qs.ALWAYS_UNSIGNABLE_HEADERS=br;Qs.AMZ_DATE_HEADER=Fn;Qs.AMZ_DATE_QUERY_PARAM=Cn;Qs.AUTH_HEADER=Xn;Qs.CREDENTIAL_QUERY_PARAM=Zr;Qs.DATE_HEADER=Vr;Qs.EVENT_ALGORITHM_IDENTIFIER=zr;Qs.EXPIRES_QUERY_PARAM=Qr;Qs.GENERATED_HEADERS=Jr;Qs.HOST_HEADER=cs;Qs.KEY_TYPE_IDENTIFIER=Hn;Qs.MAX_CACHE_SIZE=xr;Qs.MAX_PRESIGNED_TTL=tu;Qs.PROXY_HEADER_PATTERN=kr;Qs.REGION_SET_PARAM=Ms;Qs.SEC_HEADER_PATTERN=jr;Qs.SHA256_HEADER=Oe;Qs.SIGNATURE_HEADER=Wr;Qs.SIGNATURE_QUERY_PARAM=Mn;Qs.SIGNED_HEADERS_QUERY_PARAM=Br;Qs.SignatureV4=uu;Qs.SignatureV4Base=Gn;Qs.TOKEN_HEADER=Kr;Qs.TOKEN_QUERY_PARAM=cn;Qs.UNSIGNABLE_PATTERNS=Xs;Qs.UNSIGNED_PAYLOAD=qr;Qs.clearCredentialCache=Hs;Qs.createScope=Le;Qs.getCanonicalHeaders=an;Qs.getCanonicalQuery=ru;Qs.getPayloadHash=ve;Qs.getSigningKey=eu;Qs.hasHeader=ou;Qs.moveHeadersToQuery=iu;Qs.prepareRequest=mn;Qs.signatureV4aContainer=Bs});var Se="X-Amz-S3session-Token",Bn;var fu=g(()=>{Bn=Se.toLowerCase()});function Eu(t){return{accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey,expiration:t.expiration}}function lu(t,e){let n=setTimeout(()=>{throw Error("SignatureV4S3Express credential override was created but not called.")},10),o=t.credentialProvider,i=()=>{return clearTimeout(n),t.credentialProvider=o,Promise.resolve(e)};t.credentialProvider=i}var yu,Ue;var su=g(()=>{fu();yu=k(Zn(),1);Ue=class Ue extends yu.SignatureV4{async signWithCredentials(t,e,n){let o=Eu(e);t.headers[Bn]=e.sessionToken;let i=this;return lu(i,o),i.signRequest(t,n??{})}async presignWithCredentials(t,e,n){let o=Eu(e);return delete t.headers[Bn],t.headers[Se]=e.sessionToken,t.query=t.query??{},t.query[Se]=e.sessionToken,lu(this,o),this.presign(t,n)}}});var gu=g(()=>{su()});var Tu=()=>{};var Ru=()=>{};var du=()=>{};var Au=g(()=>{Sr();Ur();hr();$r();gu();Tu();Ru();du()});var ie;var Qn=g(()=>{ie={CrtSignerV4:null}});class Jn{sigv4aSigner;sigv4Signer;signerOptions;static sigv4aDependency(){if(typeof ie.CrtSignerV4==="function")return"crt";else if(typeof Vn.signatureV4aContainer.SignatureV4a==="function")return"js";return"none"}constructor(t){this.sigv4Signer=new Ue(t),this.signerOptions=t}async sign(t,e={}){if(e.signingRegion==="*")return this.getSigv4aSigner().sign(t,e);return this.sigv4Signer.sign(t,e)}async signWithCredentials(t,e,n={}){if(n.signingRegion==="*"){let o=this.getSigv4aSigner(),i=ie.CrtSignerV4;if(i&&o instanceof i)return o.signWithCredentials(t,e,n);else throw Error(`signWithCredentials with signingRegion '*' is only supported when using the CRT dependency @aws-sdk/signature-v4-crt. Please check whether you have installed the "@aws-sdk/signature-v4-crt" package explicitly. You must also register the package by calling [require("@aws-sdk/signature-v4-crt");] or an ESM equivalent such as [import "@aws-sdk/signature-v4-crt";]. For more information please go to https://github.com/aws/aws-sdk-js-v3#functionality-requiring-aws-common-runtime-crt`)}return this.sigv4Signer.signWithCredentials(t,e,n)}async presign(t,e={}){if(e.signingRegion==="*"){let n=this.getSigv4aSigner(),o=ie.CrtSignerV4;if(o&&n instanceof o)return n.presign(t,e);else throw Error(`presign with signingRegion '*' is only supported when using the CRT dependency @aws-sdk/signature-v4-crt. Please check whether you have installed the "@aws-sdk/signature-v4-crt" package explicitly. You must also register the package by calling [require("@aws-sdk/signature-v4-crt");] or an ESM equivalent such as [import "@aws-sdk/signature-v4-crt";]. For more information please go to https://github.com/aws/aws-sdk-js-v3#functionality-requiring-aws-common-runtime-crt`)}return this.sigv4Signer.presign(t,e)}async presignWithCredentials(t,e,n={}){if(n.signingRegion==="*")throw Error("Method presignWithCredentials is not supported for [signingRegion=*].");return this.sigv4Signer.presignWithCredentials(t,e,n)}getSigv4aSigner(){if(!this.sigv4aSigner){let t=ie.CrtSignerV4,e=Vn.signatureV4aContainer.SignatureV4a;if(this.signerOptions.runtime==="node"){if(!t&&!e)throw Error("Neither CRT nor JS SigV4a implementation is available. Please load either @aws-sdk/signature-v4-crt or @aws-sdk/signature-v4a. For more information please go to https://github.com/aws/aws-sdk-js-v3#functionality-requiring-aws-common-runtime-crt");if(t&&typeof t==="function")this.sigv4aSigner=new t({...this.signerOptions,signingAlgorithm:1});else if(e&&typeof e==="function")this.sigv4aSigner=new e({...this.signerOptions});else throw Error("Available SigV4a implementation is not a valid constructor. Please ensure you've properly imported @aws-sdk/signature-v4-crt or @aws-sdk/signature-v4a.For more information please go to https://github.com/aws/aws-sdk-js-v3#functionality-requiring-aws-common-runtime-crt")}else{if(!e||typeof e!=="function")throw Error("JS SigV4a implementation is not available or not a valid constructor. Please check whether you have installed the @aws-sdk/signature-v4a package explicitly. The CRT implementation is not available for browsers. You must also register the package by calling [require('@aws-sdk/signature-v4a');] or an ESM equivalent such as [import '@aws-sdk/signature-v4a';]. For more information please go to https://github.com/aws/aws-sdk-js-v3#using-javascript-non-crt-implementation-of-sigv4a");this.sigv4aSigner=new e({...this.signerOptions})}}return this.sigv4aSigner}}var Vn;var Nu=g(()=>{Au();Qn();Vn=k(Zn(),1)});var wu=g(()=>{Nu();Qn()});var Iu="UNSIGNED-PAYLOAD",_u="X-Amz-Content-Sha256";class he{signer;constructor(t){let e={service:t.signingName||t.service||"s3",uriEscapePath:t.uriEscapePath||!1,applyChecksum:t.applyChecksum||!1,...t};this.signer=new Jn(e)}presign(t,{unsignableHeaders:e=new Set,hoistableHeaders:n=new Set,unhoistableHeaders:o=new Set,...i}={}){return this.prepareRequest(t,{unsignableHeaders:e,unhoistableHeaders:o,hoistableHeaders:n}),this.signer.presign(t,{expiresIn:900,unsignableHeaders:e,unhoistableHeaders:o,...i})}presignWithCredentials(t,e,{unsignableHeaders:n=new Set,hoistableHeaders:o=new Set,unhoistableHeaders:i=new Set,...r}={}){return this.prepareRequest(t,{unsignableHeaders:n,unhoistableHeaders:i,hoistableHeaders:o}),this.signer.presignWithCredentials(t,e,{expiresIn:900,unsignableHeaders:n,unhoistableHeaders:i,...r})}prepareRequest(t,{unsignableHeaders:e=new Set,unhoistableHeaders:n=new Set,hoistableHeaders:o=new Set}={}){e.add("content-type"),Object.keys(t.headers).map((E)=>E.toLowerCase()).filter((E)=>E.startsWith("x-amz-server-side-encryption")).forEach((E)=>{if(!o.has(E))n.add(E)}),t.headers[_u]=Iu;let i=t.headers.host,r=t.port,u=`${t.hostname}${t.port!=null?":"+r:""}`;if(!i||i===t.hostname&&t.port!=null)t.headers.host=u}}var Wn=g(()=>{wu()});var pu,Du=async(t,e,n={})=>{let o,i;if(typeof t.config.endpointProvider==="function"){let d=(await Er(e.input,e.constructor,t.config)).properties?.authSchemes?.[0];if(d?.name==="sigv4a")i=d?.signingRegionSet?.join(",");else i=d?.signingRegion;o=new he({...t.config,signingName:d?.signingName,region:async()=>i})}else o=new he(t.config);let r=(R,d)=>async(L)=>{let{request:O}=L;if(!pu.HttpRequest.isInstance(O))throw Error("Request to be presigned is not an valid HTTP request.");delete O.headers["amz-sdk-invocation-id"],delete O.headers["amz-sdk-request"],delete O.headers["x-amz-user-agent"];let C,M={...n,signingRegion:n.signingRegion??d.signing_region??i,signingService:n.signingService??d.signing_service};if(d.s3ExpressIdentity)C=await o.presignWithCredentials(O,d.s3ExpressIdentity,M);else C=await o.presign(O,M);return{response:{},output:{$metadata:{httpStatusCode:200},presigned:C}}},u="presignInterceptMiddleware",E=t.middlewareStack.clone();E.addRelativeTo(r,{name:u,relation:"before",toMiddleware:"awsAuthMiddleware",override:!0});let l=e.resolveMiddleware(E,t.config,{}),{output:y}=await l({input:e.input}),{presigned:s}=y;return di(s)};var Lu=g(()=>{Ai();Or();Wn();pu=k(Un(),1)});var vu=g(()=>{Lu();Wn()});import{S3Client as $g,PutObjectCommand as Pg,GetObjectCommand as Ou,DeleteObjectCommand as ag,CopyObjectCommand as mg,ListObjectsV2Command as Cg,HeadObjectCommand as Mg,ListObjectVersionsCommand as cg,GetBucketVersioningCommand as Xg,PutBucketVersioningCommand as Fg}from"@aws-sdk/client-s3";class Rt{client;bucket;versioningEnabled=!1;constructor(t){this.bucket=t.bucket,this.client=new $g({region:t.region,endpoint:t.endpoint,credentials:{accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey},forcePathStyle:!0}),this.versioningEnabled=t.versioningEnabled??!1}async putObject(t,e,n,o){let i=await this.client.send(new Pg({Bucket:this.bucket,Key:t,Body:typeof e==="string"?Buffer.from(e):e,Metadata:n,...o&&{ContentType:o}}));return{etag:i.ETag,versionId:i.VersionId}}async getObject(t,e){let n=await this.client.send(new Ou({Bucket:this.bucket,Key:t,...e&&{VersionId:e}}));return{body:await n.Body.transformToByteArray(),contentType:n.ContentType,size:n.ContentLength,versionId:n.VersionId,etag:n.ETag}}async deleteObject(t){await this.client.send(new ag({Bucket:this.bucket,Key:t}))}async copyObject(t,e){let n=await this.client.send(new mg({Bucket:this.bucket,CopySource:`${this.bucket}/${t}`,Key:e}));return{etag:n.CopyObjectResult?.ETag,versionId:n.VersionId}}async listObjects(t,e){let n=await this.client.send(new Cg({Bucket:this.bucket,Prefix:t,...e?.delimiter&&{Delimiter:e.delimiter}}));return{objects:(n.Contents??[]).map((o)=>({key:o.Key,size:o.Size??0,lastModified:o.LastModified??new Date,etag:o.ETag})),prefixes:(n.CommonPrefixes??[]).map((o)=>o.Prefix)}}async headObject(t){let e=await this.client.send(new Mg({Bucket:this.bucket,Key:t}));return{contentType:e.ContentType,size:e.ContentLength??0,lastModified:e.LastModified,etag:e.ETag,versionId:e.VersionId}}async listObjectVersions(t){return((await this.client.send(new cg({Bucket:this.bucket,Prefix:t}))).Versions??[]).filter((n)=>n.Key===t).map((n)=>({versionId:n.VersionId,lastModified:n.LastModified??new Date,size:n.Size??0,isLatest:n.IsLatest??!1}))}async checkVersioningEnabled(){try{return(await this.client.send(new Xg({Bucket:this.bucket}))).Status==="Enabled"}catch{return!1}}async enableVersioning(){try{return await this.client.send(new Fg({Bucket:this.bucket,VersioningConfiguration:{Status:"Enabled"}})),this.versioningEnabled=!0,!0}catch{return!1}}async getPresignedUrl(t,e=86400,n){let o=new Ou({Bucket:this.bucket,Key:t,...n&&{ResponseContentType:n}});return Du(this.client,o,{expiresIn:e})}}var Su=g(()=>{vu()});var Uu=g(()=>{Su()});var ut,U,j,ft,re,z;var V=g(()=>{ut=class ut extends Error{code;suggestion;constructor(t,e,n){super(e);this.name=this.constructor.name,this.code=t,this.suggestion=n}toJSON(){return{error:this.code,message:this.message,...this.suggestion&&{suggestion:this.suggestion}}}};U=class U extends ut{path;constructor(t,e){super("NOT_FOUND",t,e?.suggestion);this.path=e?.path}toJSON(){return{...super.toJSON(),...this.path&&{path:this.path}}}};j=class j extends ut{requiredRole;yourRole;constructor(t,e){super("PERMISSION_DENIED",t,e?.suggestion);this.requiredRole=e?.requiredRole,this.yourRole=e?.yourRole}toJSON(){return{...super.toJSON(),...this.requiredRole&&{required_role:this.requiredRole},...this.yourRole&&{your_role:this.yourRole}}}};ft=class ft extends ut{path;constructor(t,e){super("EDIT_CONFLICT",t,e?.suggestion);this.path=e?.path}toJSON(){return{...super.toJSON(),...this.path&&{path:this.path}}}};re=class re extends ut{path;constructor(t,e){super("INDEXING_IN_PROGRESS",t,e?.suggestion??"Try again in a moment");this.path=e?.path}toJSON(){return{...super.toJSON(),...this.path&&{path:this.path}}}};z=class z extends ut{field;constructor(t,e){super("VALIDATION_ERROR",t,e?.suggestion);this.field=e?.field}toJSON(){return{...super.toJSON(),...this.field&&{field:this.field}}}}});import{eq as hu,and as Hg}from"drizzle-orm";function ue(t){return Yg[t]??"admin"}function Et(t,e,n){return t.select().from(f.driveMembers).where(Hg(hu(f.driveMembers.driveId,n),hu(f.driveMembers.userId,e))).get()?.role??null}function fe(t,e){let n=Et(t,e.userId,e.driveId);if(!n)throw new j("You do not have access to this drive",{requiredRole:e.requiredRole,yourRole:"none",suggestion:"Request access from the drive admin"});if($u[n]<$u[e.requiredRole])throw new j(`This operation requires '${e.requiredRole}' role, but you have '${n}'`,{requiredRole:e.requiredRole,yourRole:n,suggestion:e.requiredRole==="editor"?"Ask a drive admin to upgrade your role to editor":"Ask a drive admin to upgrade your role"})}var $u,Yg;var $e=g(()=>{P();V();$u={viewer:0,editor:1,admin:2},Yg={ls:"viewer",cat:"viewer",tail:"viewer",stat:"viewer",grep:"viewer",fts:"viewer",search:"viewer","vec-search":"viewer",log:"viewer",diff:"viewer",recent:"viewer",tree:"viewer",glob:"viewer","signed-url":"viewer",write:"editor",edit:"editor",append:"editor",rm:"editor",mv:"editor",cp:"editor",revert:"editor",reindex:"admin","comment-add":"editor","comment-list":"viewer","comment-get":"viewer","comment-update":"editor","comment-delete":"editor","comment-resolve":"editor"}});function Pu(t){let e=t;if(!e.startsWith("/"))e="/"+e;if(e.length>1&&e.endsWith("/"))e=e.slice(0,-1);return e}function dt(t){let e=t;if(!e.startsWith("/"))e="/"+e;if(!e.endsWith("/"))e+="/";return e}function au(t){return t.startsWith("/")?t.slice(1):t}import{eq as Zt,and as Kn,sql as Gg}from"drizzle-orm";function _(t,e,n){let o=au(n);return`${t}/drives/${e}/${o}`}async function bn(t,e){return(t.db.select({maxVersion:Gg`MAX(version)`}).from(f.fileVersions).where(Kn(Zt(f.fileVersions.path,e),Zt(f.fileVersions.driveId,t.driveId))).get()?.maxVersion??0)+1}async function Y(t,e){let n=await bn(t,e.path),o=new Date;t.db.insert(f.fileVersions).values({path:e.path,driveId:t.driveId,version:n,s3VersionId:e.s3VersionId,author:t.userId,operation:e.operation,message:e.message??null,diffSummary:e.diffSummary??null,size:e.size??null,etag:e.etag??null,createdAt:o}).run();let i=t.db.select().from(f.files).where(Kn(Zt(f.files.path,e.path),Zt(f.files.driveId,t.driveId))).get();if(i)t.db.update(f.files).set({size:e.size??i.size,contentType:e.contentType??i.contentType,author:t.userId,currentVersionId:String(n),modifiedAt:o,isDeleted:e.operation==="delete"}).where(Kn(Zt(f.files.path,e.path),Zt(f.files.driveId,t.driveId))).run();else t.db.insert(f.files).values({path:e.path,driveId:t.driveId,size:e.size??0,contentType:e.contentType??null,author:t.userId,currentVersionId:String(n),createdAt:o,modifiedAt:o,isDeleted:e.operation==="delete"}).run();return n}var X=g(()=>{P()});function lt(t){let e=t.split(".").pop()?.toLowerCase()??"";return Zg[e]??"application/octet-stream"}var Zg;var Bt=g(()=>{Zg={png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",svg:"image/svg+xml",webp:"image/webp",ico:"image/x-icon",pdf:"application/pdf",txt:"text/plain",md:"text/markdown",mdx:"text/markdown",html:"text/html",css:"text/css",csv:"text/csv",xml:"application/xml",json:"application/json",yaml:"application/x-yaml",yml:"application/x-yaml",toml:"application/toml",ts:"text/plain",tsx:"text/plain",js:"text/javascript",jsx:"text/javascript",py:"text/x-python",rb:"text/x-ruby",rs:"text/x-rust",go:"text/x-go",java:"text/x-java",c:"text/x-c",cpp:"text/x-c++",h:"text/x-c",hpp:"text/x-c++",sh:"text/x-shellscript",sql:"text/x-sql",graphql:"text/x-graphql",zip:"application/zip",tar:"application/x-tar",gz:"application/gzip"}});function kn(t){return t.$client}function J(t,e){let n=kn(t);n.prepare("DELETE FROM files_fts WHERE path = ? AND drive_id = ?").run(e.path,e.driveId),n.prepare("INSERT INTO files_fts(path, content, drive_id) VALUES (?, ?, ?)").run(e.path,e.content,e.driveId)}function Pe(t,e){kn(t).prepare("DELETE FROM files_fts WHERE path = ? AND drive_id = ?").run(e.path,e.driveId)}function ae(t,e){let n=kn(t),o,i;if(e.pathPrefix)o=`
131
142
  SELECT path, snippet(files_fts, 1, '<b>', '</b>', '...', 32) as snippet, rank
132
143
  FROM files_fts
133
144
  WHERE content MATCH ? AND drive_id = ? AND path LIKE ?
134
145
  ORDER BY rank
135
146
  LIMIT 50
136
- `,T=[n.pattern,n.driveId,n.pathPrefix+"%"];else i=`
147
+ `,i=[e.pattern,e.driveId,e.pathPrefix+"%"];else o=`
137
148
  SELECT path, snippet(files_fts, 1, '<b>', '</b>', '...', 32) as snippet, rank
138
149
  FROM files_fts
139
150
  WHERE content MATCH ? AND drive_id = ?
140
151
  ORDER BY rank
141
152
  LIMIT 50
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
153
+ `,i=[e.pattern,e.driveId];return n.prepare(o).all(...i)}async function mu(t){try{let{RecursiveChunker:e}=await import("chonkie");return(await(await e.create({chunkSize:900})).chunk(t)).map((i)=>({content:i.text,charOffset:i.startIndex??0,tokenCount:i.tokenCount??Math.ceil(i.text.length/4)}))}catch{return Bg(t)}}function Bg(t){let o=[];if(t.length<=3600)return[{content:t,charOffset:0,tokenCount:Math.ceil(t.length/4)}];let i=0;while(i<t.length){let r=Math.min(i+3600,t.length),u=t.slice(i,r);if(r<t.length){let E=u.lastIndexOf(`
154
+
155
+ `);if(E>1800)u=u.slice(0,E)}if(o.push({content:u,charOffset:i,tokenCount:Math.ceil(u.length/4)}),i+=u.length-512,i<=o[o.length-1].charOffset)i=o[o.length-1].charOffset+u.length}return o}import{eq as W,and as Qt}from"drizzle-orm";function Qg(t){return t.$client}class Cu{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 jn(t,e,n){let o=Qg(t),i=t.select({isDeleted:f.files.isDeleted}).from(f.files).where(Qt(W(f.files.path,n.path),W(f.files.driveId,n.driveId))).get();if(!i||i.isDeleted)return;try{let r=await mu(n.content),u=r.map((s)=>s.content),E=await e.embedBatch(u),l=t.select({id:f.contentChunks.id}).from(f.contentChunks).where(Qt(W(f.contentChunks.filePath,n.path),W(f.contentChunks.driveId,n.driveId))).all();for(let s of l)o.prepare("DELETE FROM chunk_vectors WHERE chunk_id = ?").run(s.id);t.delete(f.contentChunks).where(Qt(W(f.contentChunks.filePath,n.path),W(f.contentChunks.driveId,n.driveId))).run();let y=o.prepare("INSERT INTO chunk_vectors(chunk_id, embedding) VALUES (?, ?)");for(let s=0;s<r.length;s++){let R=t.insert(f.contentChunks).values({filePath:n.path,driveId:n.driveId,chunkIndex:s,content:r[s].content,charOffset:r[s].charOffset,tokenCount:r[s].tokenCount}).returning({id:f.contentChunks.id}).get(),d=new Float32Array(E[s]);y.run(R.id,d)}t.update(f.files).set({embeddingStatus:"indexed"}).where(Qt(W(f.files.path,n.path),W(f.files.driveId,n.driveId))).run()}catch(r){throw t.update(f.files).set({embeddingStatus:"failed"}).where(Qt(W(f.files.path,n.path),W(f.files.driveId,n.driveId))).run(),r}}function At(t,e,n){if(!e)return;t.update(f.files).set({embeddingStatus:"pending"}).where(Qt(W(f.files.path,n.path),W(f.files.driveId,n.driveId))).run(),Vg.acquire().then(async(o)=>{try{await jn(t,e,n)}catch(i){console.error("Embedding failed",{path:n.path,error:i})}finally{o()}})}var Vg;var Vt=g(()=>{P();Vg=new Cu(2)});async function Mu(t,e){let n=_(t.orgId,t.driveId,e.path),o=e.content,i=Buffer.byteLength(o);if(i>Jg)throw new z(`File size ${(i/1024/1024).toFixed(1)}MB exceeds the 10MB limit`,{field:"content",suggestion:"Split large files into smaller chunks"});if(e.expectedVersion!==void 0){let y=await bn(t,e.path)-1;if(y!==e.expectedVersion)throw new ft(`Expected version ${e.expectedVersion} but file is at version ${y}`,{path:e.path,suggestion:"Re-read the file to get the current version and retry"})}let r=lt(e.path),u=await t.s3.putObject(n,o,void 0,r),E=await Y(t,{path:e.path,s3VersionId:u.versionId??"",operation:"write",message:e.message,size:i,etag:u.etag,contentType:r});return J(t.db,{path:e.path,driveId:t.driveId,content:o}),At(t.db,t.embeddingProvider??null,{path:e.path,driveId:t.driveId,content:o}),{version:E,path:e.path,size:i}}var Jg=10485760;var cu=g(()=>{X();X();Bt();Vt();V()});async function Xu(t,e){let n=_(t.orgId,t.driveId,e.path),o;try{o=(await t.s3.getObject(n)).body}catch(R){if(R?.name==="NoSuchKey"||R?.$metadata?.httpStatusCode===404)throw new U(`File not found: ${e.path}`,{path:e.path});throw R}let r=new TextDecoder().decode(o).split(`
156
+ `),u=r.length,E=e.offset??0,l=e.limit??Wg,y=r.slice(E,E+l),s=E+l<u;return{content:y.join(`
157
+ `),totalLines:u,truncated:s}}var Wg=200;var Fu=g(()=>{X();V()});async function Hu(t,e){let n=_(t.orgId,t.driveId,e.path),o;try{o=(await t.s3.getObject(n)).body}catch(d){if(d?.name==="NoSuchKey"||d?.$metadata?.httpStatusCode===404)throw new U(`File not found: ${e.path}`,{path:e.path});throw d}let i=new TextDecoder().decode(o),r=i.split(e.old_string).length-1;if(r===0)throw new ft(`old_string not found in ${e.path}`,{path:e.path,suggestion:"Verify the exact text you want to replace"});if(r>1)throw new ft(`old_string found ${r} times in ${e.path}, expected exactly 1`,{path:e.path,suggestion:"Provide more surrounding context to make the match unique"});let u=i.replace(e.old_string,e.new_string),E=Buffer.byteLength(u),l=lt(e.path),y=await t.s3.putObject(n,u,void 0,l),s=JSON.stringify({old:e.old_string,new:e.new_string}),R=await Y(t,{path:e.path,s3VersionId:y.versionId??"",operation:"edit",message:e.message,diffSummary:s,size:E,etag:y.etag,contentType:l});return J(t.db,{path:e.path,driveId:t.driveId,content:u}),At(t.db,t.embeddingProvider??null,{path:e.path,driveId:t.driveId,content:u}),{version:R,path:e.path,changes:1}}var Yu=g(()=>{X();V();Bt();Vt()});async function Gu(t,e){let n=_(t.orgId,t.driveId,e.path),o="";try{let y=await t.s3.getObject(n);o=new TextDecoder().decode(y.body)}catch(y){if(y?.name==="NoSuchKey"||y?.$metadata?.httpStatusCode===404)throw new U(`File not found: ${e.path}`,{path:e.path});throw y}let i=o+e.content,r=Buffer.byteLength(i),u=lt(e.path),E=await t.s3.putObject(n,i,void 0,u),l=await Y(t,{path:e.path,s3VersionId:E.versionId??"",operation:"append",message:e.message,size:r,etag:E.etag,contentType:u});return J(t.db,{path:e.path,driveId:t.driveId,content:i}),At(t.db,t.embeddingProvider??null,{path:e.path,driveId:t.driveId,content:i}),{version:l,size:r}}var Zu=g(()=>{X();V();Bt();Vt()});import{eq as Bu,and as Kg,like as bg}from"drizzle-orm";async function Qu(t,e){let n=dt(e.path??"/"),o=_(t.orgId,t.driveId,n),{objects:i,prefixes:r}=await t.s3.listObjects(o,{delimiter:"/"}),u=t.db.select().from(f.files).where(Kg(Bu(f.files.driveId,t.driveId),bg(f.files.path,n+"%"),Bu(f.files.isDeleted,!1))).all(),E=new Map(u.map((y)=>[y.path,y])),l=[];for(let y of r){let s=y.slice(o.length).replace(/\/$/,"");if(s)l.push({name:s,type:"directory",size:0})}for(let y of i){let s=y.key.slice(o.length);if(!s)continue;let R=s.endsWith("/"),d=R?s.slice(0,-1):s;if(R)l.push({name:d,type:"directory",size:0});else{let L=n+d,O=E.get(L);l.push({name:d,type:"file",size:O?.size??y.size,author:O?.author,modifiedAt:O?.modifiedAt??y.lastModified})}}return{entries:l}}var Vu=g(()=>{P();X()});import{eq as Ju,and as kg}from"drizzle-orm";async function Wu(t,e){let n=_(t.orgId,t.driveId,e.path),o;try{o=await t.s3.headObject(n)}catch(r){if(r?.name==="NotFound"||r?.$metadata?.httpStatusCode===404)throw new U(`File not found: ${e.path}`,{path:e.path});throw r}let i=t.db.select().from(f.files).where(kg(Ju(f.files.path,e.path),Ju(f.files.driveId,t.driveId))).get();return{path:e.path,size:o.size,contentType:o.contentType,author:i?.author??"unknown",currentVersion:i?.currentVersionId?parseInt(i.currentVersionId):void 0,createdAt:i?.createdAt??new Date,modifiedAt:i?.modifiedAt??o.lastModified??new Date,isDeleted:i?.isDeleted??!1,embeddingStatus:i?.embeddingStatus??void 0}}var Ku=g(()=>{P();X();V()});import{eq as Jt,and as zn}from"drizzle-orm";async function bu(t,e){let n=_(t.orgId,t.driveId,e.path);await t.s3.deleteObject(n),await Y(t,{path:e.path,s3VersionId:"",operation:"delete"}),Pe(t.db,{path:e.path,driveId:t.driveId});let o=t.db.select({id:f.contentChunks.id}).from(f.contentChunks).where(zn(Jt(f.contentChunks.filePath,e.path),Jt(f.contentChunks.driveId,t.driveId))).all();if(o.length>0){let i=t.db.$client;for(let r of o)i.prepare("DELETE FROM chunk_vectors WHERE chunk_id = ?").run(r.id);t.db.delete(f.contentChunks).where(zn(Jt(f.contentChunks.filePath,e.path),Jt(f.contentChunks.driveId,t.driveId))).run()}return t.db.update(f.comments).set({isDeleted:!0,updatedAt:new Date}).where(zn(Jt(f.comments.path,e.path),Jt(f.comments.driveId,t.driveId))).run(),{path:e.path,deleted:!0}}var ku=g(()=>{P();X()});import{eq as ju,and as jg}from"drizzle-orm";async function zu(t,e){let n=_(t.orgId,t.driveId,e.from),o=_(t.orgId,t.driveId,e.to),i=await t.s3.copyObject(n,o),r=await t.s3.headObject(o),u=await Y(t,{path:e.to,s3VersionId:i.versionId??"",operation:"write",message:e.message??`Moved from ${e.from}`,size:r.size,etag:i.etag});await t.s3.deleteObject(n),await Y(t,{path:e.from,s3VersionId:"",operation:"delete",message:`Moved to ${e.to}`});let E=await t.s3.getObject(o),l=new TextDecoder().decode(E.body);return Pe(t.db,{path:e.from,driveId:t.driveId}),J(t.db,{path:e.to,driveId:t.driveId,content:l}),t.db.update(f.contentChunks).set({filePath:e.to}).where(jg(ju(f.contentChunks.filePath,e.from),ju(f.contentChunks.driveId,t.driveId))).run(),{from:e.from,to:e.to,version:u}}var qu=g(()=>{X();P()});async function xu(t,e){let n=_(t.orgId,t.driveId,e.from),o=_(t.orgId,t.driveId,e.to),i=await t.s3.copyObject(n,o),r=await t.s3.headObject(o),u=await Y(t,{path:e.to,s3VersionId:i.versionId??"",operation:"write",message:`Copied from ${e.from}`,size:r.size,etag:i.etag}),E=await t.s3.getObject(o),l=new TextDecoder().decode(E.body);return J(t.db,{path:e.to,driveId:t.driveId,content:l}),At(t.db,t.embeddingProvider??null,{path:e.to,driveId:t.driveId,content:l}),{from:e.from,to:e.to,version:u}}var tf=g(()=>{X();Vt()});async function ef(t,e){let n=_(t.orgId,t.driveId,e.path),o=e.lines??zg,i;try{i=(await t.s3.getObject(n)).body}catch(R){if(R?.name==="NoSuchKey"||R?.$metadata?.httpStatusCode===404)throw new U(`File not found: ${e.path}`,{path:e.path});throw R}let u=new TextDecoder().decode(i).split(`
158
+ `),E=u.length,l=Math.max(0,E-o),y=u.slice(l),s=l>0;return{content:y.join(`
159
+ `),totalLines:E,truncated:s}}var zg=20;var nf=g(()=>{X();V()});import{eq as of,and as qg,desc as xg}from"drizzle-orm";async function rf(t,e){let n=e.limit??50;return{versions:t.db.select().from(f.fileVersions).where(qg(of(f.fileVersions.path,e.path),of(f.fileVersions.driveId,t.driveId))).orderBy(xg(f.fileVersions.version)).limit(n).all().map((i)=>({version:i.version,author:i.author,createdAt:i.createdAt,operation:i.operation,message:i.message??void 0,diffSummary:i.diffSummary??void 0,size:i.size??void 0}))}}var uf=g(()=>{P()});import{eq as Wt,and as ff}from"drizzle-orm";import{structuredPatch as tT}from"diff";async function Ef(t,e){let n=t.db.select().from(f.fileVersions).where(ff(Wt(f.fileVersions.path,e.path),Wt(f.fileVersions.driveId,t.driveId),Wt(f.fileVersions.version,e.v1))).get(),o=t.db.select().from(f.fileVersions).where(ff(Wt(f.fileVersions.path,e.path),Wt(f.fileVersions.driveId,t.driveId),Wt(f.fileVersions.version,e.v2))).get();if(!n||!o)throw new U(`Version ${!n?e.v1:e.v2} not found for ${e.path}`,{path:e.path});if(n.s3VersionId&&o.s3VersionId){let r=_(t.orgId,t.driveId,e.path);try{let[u,E]=await Promise.all([t.s3.getObject(r,n.s3VersionId),t.s3.getObject(r,o.s3VersionId)]),l=new TextDecoder().decode(u.body),y=new TextDecoder().decode(E.body),s=tT(e.path,e.path,l,y),R=[];for(let d of s.hunks)for(let L of d.lines){let O=L.startsWith("+")?"add":L.startsWith("-")?"remove":"context";R.push({type:O,content:L.slice(1)})}return{changes:R}}catch(u){console.warn(`[diff] S3 content fetch failed for ${e.path}, falling back to diffSummary:`,u)}}let i=[];if(o.diffSummary)try{let r=JSON.parse(o.diffSummary);if(r.old)i.push({type:"remove",content:r.old});if(r.new)i.push({type:"add",content:r.new})}catch{i.push({type:"context",content:o.diffSummary})}return{changes:i}}var lf=g(()=>{P();X();V()});import{eq as qn,and as eT}from"drizzle-orm";async function yf(t,e){let n=t.db.select().from(f.fileVersions).where(eT(qn(f.fileVersions.path,e.path),qn(f.fileVersions.driveId,t.driveId),qn(f.fileVersions.version,e.version))).get();if(!n)throw new U(`Version ${e.version} not found for ${e.path}`,{path:e.path});if(!n.s3VersionId)throw new ut("VERSIONING_REQUIRED","S3 versioning required for revert","Enable S3 versioning on the bucket");let o=_(t.orgId,t.driveId,e.path),i=await t.s3.getObject(o,n.s3VersionId),r=lt(e.path),u=await t.s3.putObject(o,i.body,void 0,r),E=i.body.length;return{version:await Y(t,{path:e.path,s3VersionId:u.versionId??"",operation:"revert",message:`Reverted to version ${e.version}`,size:E,etag:u.etag,contentType:r}),revertedTo:e.version}}var sf=g(()=>{P();X();V();Bt()});import{eq as xn,and as gf,desc as nT,gte as oT,like as iT}from"drizzle-orm";async function Tf(t,e){let n=e.limit??50,o=t.db.select().from(f.fileVersions).where(xn(f.fileVersions.driveId,t.driveId)).$dynamic();if(e.path)o=o.where(gf(xn(f.fileVersions.driveId,t.driveId),iT(f.fileVersions.path,e.path+"%")));if(e.since)o=o.where(gf(xn(f.fileVersions.driveId,t.driveId),oT(f.fileVersions.createdAt,e.since)));return{entries:o.orderBy(nT(f.fileVersions.createdAt)).limit(n).all().map((r)=>({path:r.path,version:r.version,author:r.author,createdAt:r.createdAt,operation:r.operation,message:r.message??void 0,diffSummary:r.diffSummary??void 0,size:r.size??void 0}))}}var Rf=g(()=>{P()});async function df(t,e){let n=new RegExp(e.pattern),o=dt(e.path),r=t.db.$client.prepare("SELECT path, content FROM files_fts WHERE drive_id = ? AND path LIKE ?").all(t.driveId,o+"%"),u=[];for(let E of r){let l=E.content.split(`
160
+ `);for(let y=0;y<l.length;y++)if(n.test(l[y]))u.push({path:E.path,lineNumber:y+1,content:l[y]})}return{matches:u}}var Af=()=>{};async function Nf(t,e){let o=ae(t.db,{pattern:e.pattern,driveId:t.driveId,pathPrefix:e.path}).map((i)=>({path:i.path,snippet:i.snippet,rank:i.rank}));if(o.length===0)return{matches:o,hint:`No exact token matches for "${e.pattern}". Try 'search' for semantic/fuzzy matching.`};return{matches:o}}var wf=()=>{};import{eq as to,and as rT}from"drizzle-orm";async function If(t,e){let n=t.embeddingProvider;if(!n)return{results:[],hint:"No embedding provider configured. Set OPENAI_API_KEY or enable local embeddings to use semantic search."};let o=e.limit??10,i=await n.embed(e.query),r=new Float32Array(i),E=t.db.$client.prepare(`SELECT chunk_id, distance
150
161
  FROM chunk_vectors
151
162
  WHERE embedding MATCH ?
152
163
  ORDER BY distance
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.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 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
+ LIMIT ?`).all(r,o*2);if(E.length===0)return{results:[]};let l=[],y=new Set;for(let s of E){let R=t.db.select().from(f.contentChunks).where(to(f.contentChunks.id,s.chunk_id)).get();if(!R)continue;if(R.driveId!==t.driveId)continue;if(y.has(R.filePath))continue;y.add(R.filePath);let d=t.db.select().from(f.files).where(rT(to(f.files.path,R.filePath),to(f.files.driveId,t.driveId))).get();if(l.push({path:R.filePath,score:1/(1+s.distance),snippet:R.content.slice(0,200),author:d?.author,modifiedAt:d?.modifiedAt}),l.length>=o)break}return{results:l}}var _f=g(()=>{P()});import{eq as eo,and as uT}from"drizzle-orm";async function pf(t,e){let n=e.limit??10,o=t.embeddingProvider,[i,r]=await Promise.all([o?fT(t,e.query,n*3):[],ET(t,e.query,n*3)]);if(i.length===0&&r.length===0)return{results:[],hint:o?`No results found for "${e.query}".`:"No embedding provider configured. Set OPENAI_API_KEY, GEMINI_API_KEY, or enable local embeddings for semantic search. Showing keyword results only."};let u=60,E=new Map;for(let y=0;y<i.length;y++){let s=i[y],R=1/(u+y+1),d=E.get(s.path);if(d)d.score+=R;else E.set(s.path,{score:R,snippet:s.snippet,author:s.author,modifiedAt:s.modifiedAt})}for(let y=0;y<r.length;y++){let s=r[y],R=1/(u+y+1),d=E.get(s.path);if(d){if(d.score+=R,s.snippet)d.snippet=s.snippet}else E.set(s.path,{score:R,snippet:s.snippet})}return{results:Array.from(E.entries()).sort(([,y],[,s])=>s.score-y.score).slice(0,n).map(([y,s])=>({path:y,score:s.score,snippet:s.snippet,author:s.author,modifiedAt:s.modifiedAt})),hint:!o?"Results are keyword-only. Enable embeddings for better semantic matching.":void 0}}async function fT(t,e,n){let i=await t.embeddingProvider.embed(e),r=new Float32Array(i),E=t.db.$client.prepare(`SELECT chunk_id, distance
165
+ FROM chunk_vectors
166
+ WHERE embedding MATCH ?
167
+ ORDER BY distance
168
+ LIMIT ?`).all(r,n),l=[],y=new Set;for(let s of E){let R=t.db.select().from(f.contentChunks).where(eo(f.contentChunks.id,s.chunk_id)).get();if(!R||R.driveId!==t.driveId)continue;if(y.has(R.filePath))continue;y.add(R.filePath);let d=t.db.select().from(f.files).where(uT(eo(f.files.path,R.filePath),eo(f.files.driveId,t.driveId))).get();l.push({path:R.filePath,snippet:R.content.slice(0,200),author:d?.author,modifiedAt:d?.modifiedAt})}return l}function ET(t,e,n){let o=e.split(/\s+/).filter(Boolean).map((i)=>`"${i}"`).join(" OR ");if(!o)return[];try{return ae(t.db,{pattern:o,driveId:t.driveId}).slice(0,n).map((r)=>({path:r.path,snippet:r.snippet}))}catch{return[]}}var Df=g(()=>{P()});import{eq as me,and as lT,or as yT,isNull as sT}from"drizzle-orm";async function Lf(t,e){let n=[me(f.files.driveId,t.driveId),me(f.files.isDeleted,!1),yT(me(f.files.embeddingStatus,"failed"),sT(f.files.embeddingStatus),me(f.files.embeddingStatus,"pending"))];if(e.path){let{like:l}=await import("drizzle-orm"),y=e.path.endsWith("/")?e.path:e.path+"/";n.push(l(f.files.path,y+"%"))}let o=t.db.select({path:f.files.path}).from(f.files).where(lT(...n)).all(),i=0,r=0,u=0,E=3;for(let l=0;l<o.length;l+=E){let y=o.slice(l,l+E),s=await Promise.allSettled(y.map(async(R)=>{let d=_(t.orgId,t.driveId,R.path),L=await t.s3.getObject(d),O=new TextDecoder().decode(L.body);if(J(t.db,{path:R.path,driveId:t.driveId,content:O}),t.embeddingProvider)return await jn(t.db,t.embeddingProvider,{path:R.path,driveId:t.driveId,content:O}),"reindexed";return"skipped"}));for(let R of s)if(R.status==="fulfilled")if(R.value==="reindexed")i++;else u++;else console.error("Reindex failed:",R.reason),r++}return{reindexed:i,failed:r,skipped:u}}var vf=g(()=>{P();X();Vt()});import{eq as Of,and as gT,like as TT}from"drizzle-orm";async function Sf(t,e){let n=dt(e.path??"/"),o=_(t.orgId,t.driveId,n),{objects:i}=await t.s3.listObjects(o),r=t.db.select().from(f.files).where(gT(Of(f.files.driveId,t.driveId),TT(f.files.path,n+"%"),Of(f.files.isDeleted,!1))).all(),u=new Map(r.map((l)=>[l.path,l])),E=[];for(let l of i){let y=l.key.slice(o.length);if(!y)continue;let s=y.split("/").filter(Boolean);if(s.length===0)continue;if(e.depth!==void 0&&s.length>e.depth)continue;let R=E;for(let d=0;d<s.length;d++){let L=s[d],O=d===s.length-1,C=!O||y.endsWith("/");if(C&&!O){let M=R.find((H)=>H.name===L&&H.type==="directory");if(!M)M={name:L,type:"directory",children:[]},R.push(M);if(!M.children)M.children=[];R=M.children}else if(C&&O){let M=R.find((H)=>H.name===L&&H.type==="directory");if(!M)M={name:L,type:"directory",children:[]},R.push(M)}else{let M=n+s.slice(0,d+1).join("/"),H=u.get(M),on={name:L,type:"file",size:H?.size??l.size};if(H?.author)on.author=H.author;if(H?.modifiedAt??l.lastModified)on.modifiedAt=H?.modifiedAt??l.lastModified;R.push(on)}}}return{tree:E}}var Uf=g(()=>{P();X()});import{eq as hf,and as RT,like as dT}from"drizzle-orm";function AT(t){let e="",n=0;while(n<t.length){let o=t[n];if(o==="*")if(t[n+1]==="*"){if(e+=".*",n+=2,t[n]==="/")n++}else e+="[^/]*",n++;else if(o==="?")e+="[^/]",n++;else if(".+^${}()|[]\\".includes(o))e+="\\"+o,n++;else e+=o,n++}return new RegExp("^"+e+"$")}async function $f(t,e){let n=e.path?dt(e.path):"/",o=_(t.orgId,t.driveId,n),{objects:i}=await t.s3.listObjects(o),r=t.db.select().from(f.files).where(RT(hf(f.files.driveId,t.driveId),dT(f.files.path,n+"%"),hf(f.files.isDeleted,!1))).all(),u=new Map(r.map((y)=>[y.path,y])),E=AT(e.pattern),l=[];for(let y of i){let s=y.key.slice(o.length);if(!s||s.endsWith("/"))continue;if(E.test(s)){let R=n+s,d=u.get(R);l.push({path:R,size:d?.size??y.size,modifiedAt:d?.modifiedAt??y.lastModified})}}return{matches:l}}var Pf=g(()=>{P();X()});async function af(t,e){let n=Pu(e.path),o=_(t.orgId,t.driveId,n),i=e.expiresIn??86400;try{await t.s3.headObject(o)}catch(E){if(E?.name==="NotFound"||E?.name==="NoSuchKey"||E?.$metadata?.httpStatusCode===404)throw new U(`File not found: ${n}`,{path:n});throw E}let r=lt(n);return{url:await t.s3.getPresignedUrl(o,i,r!=="application/octet-stream"?r:void 0),path:n,expiresIn:i,expiresAt:new Date(Date.now()+i*1000).toISOString()}}var mf=g(()=>{X();V();Bt()});function no(t,e,n,o){let i=o.startsWith("/")?o.slice(1):o;return`${t}/file/~/${e}/${n}/${i}`}import{eq as S,and as yt,sql as oo,desc as Cf}from"drizzle-orm";function io(t,e){t.db.insert(f.events).values({id:crypto.randomUUID(),orgId:t.orgId,type:e.type,resourceType:e.resourceType,resourceId:e.resourceId,actor:t.userId,target:e.target??null,status:"created",metadata:e.metadata?JSON.stringify(e.metadata):null,createdAt:new Date}).run()}function Ce(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 Me(t,e){let n=new Date,o=crypto.randomUUID(),i=e.path;if(e.parentId){let u=t.db.select().from(f.comments).where(yt(S(f.comments.id,e.parentId),S(f.comments.isDeleted,!1))).get();if(!u)throw new U("Parent comment not found",{suggestion:"Check that the parent comment ID is correct and not deleted"});if(u.parentId)throw new z("Cannot reply to a reply \u2014 only root comments accept replies",{suggestion:"Reply to the root comment instead"});if(!i)i=u.path}if(!i)throw new z("path is required for root comments",{field:"path"});let r=t.db.select({id:f.fileVersions.id}).from(f.fileVersions).where(yt(S(f.fileVersions.path,i),S(f.fileVersions.driveId,t.driveId))).orderBy(Cf(f.fileVersions.id)).limit(1).get();return t.db.insert(f.comments).values({id:o,parentId:e.parentId??null,orgId:t.orgId,driveId:t.driveId,path:i,lineStart:e.lineStart??null,lineEnd:e.lineEnd??null,quotedContent:e.quotedContent??null,fileVersionId:r?.id??null,body:e.body,author:t.userId,resolved:!1,createdAt:n,updatedAt:n,isDeleted:!1}).run(),io(t,{type:"comment_created",resourceType:"comment",resourceId:o,metadata:{path:i,parentId:e.parentId}}),{id:o,path:i,body:e.body,parentId:e.parentId,lineStart:e.lineStart,lineEnd:e.lineEnd,author:t.userId,createdAt:n}}async function ce(t,e){let n=[S(f.comments.driveId,t.driveId),S(f.comments.isDeleted,!1)];if(e.path)n.push(S(f.comments.path,e.path));if(e.parentId)n.push(S(f.comments.parentId,e.parentId));else if(e.parentId===void 0&&!e.resolved)n.push(oo`${f.comments.parentId} IS NULL`),n.push(S(f.comments.resolved,!1));else if(e.parentId===void 0&&e.resolved)n.push(oo`${f.comments.parentId} IS NULL`);if(e.orgId)n.push(S(f.comments.orgId,e.orgId));let o=e.limit??50,i=e.offset??0;return{comments:t.db.select().from(f.comments).where(yt(...n)).orderBy(Cf(f.comments.createdAt)).limit(o).offset(i).all().map((E)=>{let y=t.db.select().from(f.comments).where(yt(S(f.comments.parentId,E.id),S(f.comments.isDeleted,!1))).orderBy(f.comments.createdAt).all().map((s)=>Ce({...s,replyCount:0}));return{...Ce({...E,replyCount:y.length}),replies:y}})}}async function Xe(t,e){let n=t.db.select().from(f.comments).where(yt(S(f.comments.id,e.id),S(f.comments.isDeleted,!1))).get();if(!n)throw new U("Comment not found",{suggestion:"Check that the comment ID is correct"});let o=t.db.select({count:oo`count(*)`}).from(f.comments).where(yt(S(f.comments.parentId,n.id),S(f.comments.isDeleted,!1))).get(),i=Ce({...n,replyCount:o?.count??0}),u=t.db.select().from(f.comments).where(yt(S(f.comments.parentId,e.id),S(f.comments.isDeleted,!1))).orderBy(f.comments.createdAt).all().map((E)=>Ce({...E,replyCount:0}));return{comment:i,replies:u}}async function Fe(t,e){let n=t.db.select().from(f.comments).where(yt(S(f.comments.id,e.id),S(f.comments.isDeleted,!1))).get();if(!n)throw new U("Comment not found",{suggestion:"Check that the comment ID is correct"});if(n.author!==t.userId)throw new j("You can only edit your own comments",{suggestion:"Only the comment author can update it"});let o=new Date;return t.db.update(f.comments).set({body:e.body,updatedAt:o}).where(S(f.comments.id,e.id)).run(),{id:e.id,body:e.body,updatedAt:o}}async function He(t,e){let n=t.db.select().from(f.comments).where(yt(S(f.comments.id,e.id),S(f.comments.isDeleted,!1))).get();if(!n)throw new U("Comment not found",{suggestion:"Check that the comment ID is correct"});if(n.author!==t.userId)throw new j("You can only delete your own comments",{suggestion:"Only the comment author can delete it"});let o=new Date;if(t.db.update(f.comments).set({isDeleted:!0,updatedAt:o}).where(S(f.comments.id,e.id)).run(),!n.parentId)t.db.update(f.comments).set({isDeleted:!0,updatedAt:o}).where(S(f.comments.parentId,e.id)).run();return io(t,{type:"comment_deleted",resourceType:"comment",resourceId:e.id}),{deleted:!0}}async function Ye(t,e){let n=t.db.select().from(f.comments).where(yt(S(f.comments.id,e.id),S(f.comments.isDeleted,!1))).get();if(!n)throw new U("Comment not found",{suggestion:"Check that the comment ID is correct"});if(n.parentId)throw new z("Cannot resolve a reply \u2014 only root comments can be resolved",{suggestion:"Resolve the parent comment instead"});let o=new Date,i=e.resolved?o:null,r=e.resolved?t.userId:null;return t.db.update(f.comments).set({resolved:e.resolved,resolvedBy:r,resolvedAt:i,updatedAt:o}).where(S(f.comments.id,e.id)).run(),io(t,{type:e.resolved?"comment_resolved":"comment_reopened",resourceType:"comment",resourceId:e.id}),{id:e.id,resolved:e.resolved,resolvedBy:r??void 0,resolvedAt:i??void 0}}var Mf=g(()=>{P();V()});import{z as T}from"zod";async function Nt(t,e,n,o){let i=ro[e];if(!i)throw Error(`Unknown operation: ${e}`);if(!o?.skipAuth){let E=ue(e);fe(t.db,{userId:t.userId,driveId:t.driveId,requiredRole:E})}let r=i.schema.parse(n),u=await i.handler(t,r);if(t.appUrl&&u&&typeof u==="object"){if("path"in u)u.appUrl=no(t.appUrl,t.orgId,t.driveId,u.path);else if("to"in u)u.appUrl=no(t.appUrl,t.orgId,t.driveId,u.to)}return u}function Kt(){return Object.keys(ro)}function wt(t){return ro[t]}var ro;var uo=g(()=>{$e();cu();Fu();Yu();Zu();Vu();Ku();ku();qu();tf();nf();uf();lf();sf();Rf();Af();wf();_f();Df();vf();Uf();Pf();mf();Mf();ro={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:Mu,schema:T.object({path:T.string(),content:T.string(),message:T.string().optional(),expectedVersion:T.number().int().optional()})},cat:{description:"Read file content with optional pagination via offset/limit. Returns { content, totalLines, truncated }.",handler:Xu,schema:T.object({path:T.string(),offset:T.number().int().min(0).optional(),limit:T.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:Hu,schema:T.object({path:T.string(),old_string:T.string(),new_string:T.string(),message:T.string().optional()})},append:{description:"Append content to the end of an existing file. Creates a new version. Returns { version, size }.",handler:Gu,schema:T.object({path:T.string(),content:T.string(),message:T.string().optional()})},ls:{description:"List immediate children of a directory. Returns { entries } where each entry has name, type (file/directory), size, author, modifiedAt.",handler:Qu,schema:T.object({path:T.string().optional()})},stat:{description:"Get file metadata without reading content. Returns path, size, contentType, author, currentVersion, createdAt, modifiedAt, isDeleted, embeddingStatus.",handler:Wu,schema:T.object({path:T.string()})},rm:{description:"Delete a file. Removes from S3, cleans up FTS5 index and vector embeddings. Returns { path, deleted }.",handler:bu,schema:T.object({path:T.string()})},mv:{description:"Move or rename a file. Preserves version history at the new path. Returns { from, to, version }.",handler:zu,schema:T.object({from:T.string(),to:T.string(),message:T.string().optional()})},cp:{description:"Copy a file using server-side S3 copy. Creates a new version at the destination. Returns { from, to, version }.",handler:xu,schema:T.object({from:T.string(),to:T.string()})},tail:{description:"Read the last N lines of a file (default 20). Returns { content, totalLines, truncated }.",handler:ef,schema:T.object({path:T.string(),lines:T.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:rf,schema:T.object({path:T.string(),limit:T.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:Ef,schema:T.object({path:T.string(),v1:T.number().int(),v2:T.number().int()})},revert:{description:"Revert a file to a previous version. Creates a new version with the old content. Returns { version, revertedTo }.",handler:yf,schema:T.object({path:T.string(),version:T.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:Tf,schema:T.object({path:T.string().optional(),since:T.coerce.date().optional(),limit:T.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:df,schema:T.object({pattern:T.string(),path:T.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:Nf,schema:T.object({pattern:T.string(),path:T.string().optional()})},search:{description:"Hybrid search combining semantic (vector) and keyword (FTS5) matching. Best for natural language queries. Degrades to keyword-only without an embedding provider.",handler:pf,schema:T.object({query:T.string(),limit:T.number().int().min(1).optional()})},"vec-search":{description:"Vector-only semantic search using embeddings. Returns results ranked by cosine similarity. Requires an embedding provider (OPENAI_API_KEY, GEMINI_API_KEY, or local).",handler:If,schema:T.object({query:T.string(),limit:T.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:Lf,schema:T.object({path:T.string().optional()})},tree:{description:"Recursively list all files and directories. Use depth to limit recursion. Returns a nested tree structure with name, type, size, and children.",handler:Sf,schema:T.object({path:T.string().optional(),depth:T.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:$f,schema:T.object({pattern:T.string(),path:T.string().optional()})},"signed-url":{description:"Generate a temporary presigned URL for direct file download. Default expiry is 24 hours (86400 seconds). The URL requires no authentication. Returns { url, path, expiresIn, expiresAt }.",handler:af,schema:T.object({path:T.string(),expiresIn:T.number().int().min(60).max(604800).optional()})},"comment-add":{description:"Add a comment to a file. Supports line ranges and threading via parentId. Replies auto-resolve path from parent. Returns { id, path, body, author, createdAt }.",handler:Me,schema:T.object({path:T.string().optional(),body:T.string(),parentId:T.string().optional(),lineStart:T.number().int().optional(),lineEnd:T.number().int().optional(),quotedContent:T.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:ce,schema:T.object({path:T.string().optional(),parentId:T.string().optional(),resolved:T.boolean().optional(),orgId:T.string().optional(),limit:T.number().int().min(1).optional(),offset:T.number().int().min(0).optional()})},"comment-get":{description:"Get a single comment by ID with all its replies. Returns { comment, replies }.",handler:Xe,schema:T.object({id:T.string()})},"comment-update":{description:"Update a comment's body. Only the original author can update. Returns { id, body, updatedAt }.",handler:Fe,schema:T.object({id:T.string(),body:T.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:He,schema:T.object({id:T.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:Ye,schema:T.object({id:T.string(),resolved:T.boolean()})}}});import{eq as K,and as Ge}from"drizzle-orm";function Lt(t,e){let n=crypto.randomUUID(),o=new Date;return t.insert(f.drives).values({id:n,orgId:e.orgId,name:e.name,isDefault:e.isDefault??!1,createdAt:o}).run(),{id:n,name:e.name}}function vt(t,e){return t.select().from(f.drives).where(K(f.drives.orgId,e)).all().map((n)=>({id:n.id,name:n.name,isDefault:n.isDefault}))}function fo(t,e){let n=t.select().from(f.drives).where(K(f.drives.id,e)).get();if(!n)return null;return{id:n.id,name:n.name,orgId:n.orgId,isDefault:n.isDefault}}function Ot(t,e){return t.select({userId:f.driveMembers.userId,email:f.users.email,role:f.driveMembers.role}).from(f.driveMembers).innerJoin(f.users,K(f.driveMembers.userId,f.users.id)).where(K(f.driveMembers.driveId,e)).all()}function St(t,e){if(!t.select({role:f.driveMembers.role}).from(f.driveMembers).where(Ge(K(f.driveMembers.driveId,e.driveId),K(f.driveMembers.userId,e.userId))).get())throw Error("Member not found in drive");t.update(f.driveMembers).set({role:e.role}).where(Ge(K(f.driveMembers.driveId,e.driveId),K(f.driveMembers.userId,e.userId))).run()}function Ut(t,e){if(!t.select({role:f.driveMembers.role}).from(f.driveMembers).where(Ge(K(f.driveMembers.driveId,e.driveId),K(f.driveMembers.userId,e.userId))).get())throw Error("Member not found in drive");t.delete(f.driveMembers).where(Ge(K(f.driveMembers.driveId,e.driveId),K(f.driveMembers.userId,e.userId))).run()}function Eo(t,e){t.insert(f.driveMembers).values({driveId:e.driveId,userId:e.userId,role:e.role}).onConflictDoUpdate({target:[f.driveMembers.driveId,f.driveMembers.userId],set:{role:e.role}}).run()}var lo=g(()=>{P()});import{eq as a,and as ht,sql as cf}from"drizzle-orm";function $t(t,e){let n=crypto.randomUUID(),o=new Date;t.insert(f.orgs).values({id:n,name:e.name,isPersonal:e.isPersonal??!1,createdAt:o}).run(),t.insert(f.orgMembers).values({orgId:n,userId:e.userId,role:"admin"}).run();let i=Lt(t,{orgId:n,name:"default",isDefault:!0});return t.insert(f.driveMembers).values({driveId:i.id,userId:e.userId,role:"admin"}).run(),{id:n,name:e.name}}function Z(t,e){return t.select({orgId:f.orgMembers.orgId,role:f.orgMembers.role,name:f.orgs.name,isPersonal:f.orgs.isPersonal}).from(f.orgMembers).innerJoin(f.orgs,a(f.orgMembers.orgId,f.orgs.id)).where(a(f.orgMembers.userId,e)).all().map((o)=>({id:o.orgId,name:o.name,role:o.role,isPersonal:o.isPersonal}))}function Ee(t,e){let n=t.select().from(f.orgs).where(a(f.orgs.id,e)).get();if(!n)return null;return{id:n.id,name:n.name,isPersonal:n.isPersonal}}function Pt(t,e){return t.select({userId:f.orgMembers.userId,email:f.users.email,role:f.orgMembers.role}).from(f.orgMembers).innerJoin(f.users,a(f.orgMembers.userId,f.users.id)).where(a(f.orgMembers.orgId,e)).all()}function at(t,e){let n=t.select({role:f.orgMembers.role}).from(f.orgMembers).where(ht(a(f.orgMembers.orgId,e.orgId),a(f.orgMembers.userId,e.userId))).get();if(!n)throw Error("Member not found in org");if(n.role==="admin"&&e.role!=="admin"){if(t.select({count:cf`count(*)`}).from(f.orgMembers).where(ht(a(f.orgMembers.orgId,e.orgId),a(f.orgMembers.role,"admin"))).get().count<=1)throw Error("Cannot remove the last admin from the org")}t.update(f.orgMembers).set({role:e.role}).where(ht(a(f.orgMembers.orgId,e.orgId),a(f.orgMembers.userId,e.userId))).run()}function mt(t,e){if(t.select({isPersonal:f.orgs.isPersonal}).from(f.orgs).where(a(f.orgs.id,e.orgId)).get()?.isPersonal)throw Error("Cannot remove members from a personal org");let o=t.select({role:f.orgMembers.role}).from(f.orgMembers).where(ht(a(f.orgMembers.orgId,e.orgId),a(f.orgMembers.userId,e.userId))).get();if(!o)throw Error("Member not found in org");if(o.role==="admin"){if(t.select({count:cf`count(*)`}).from(f.orgMembers).where(ht(a(f.orgMembers.orgId,e.orgId),a(f.orgMembers.role,"admin"))).get().count<=1)throw Error("Cannot remove the last admin from the org")}let i=t.select({id:f.drives.id}).from(f.drives).where(a(f.drives.orgId,e.orgId)).all();for(let r of i)t.delete(f.driveMembers).where(ht(a(f.driveMembers.driveId,r.id),a(f.driveMembers.userId,e.userId))).run();t.delete(f.orgMembers).where(ht(a(f.orgMembers.orgId,e.orgId),a(f.orgMembers.userId,e.userId))).run()}function Ct(t,e){let n=t.select().from(f.users).where(a(f.users.email,e.email)).get();if(!n)throw Error(`User with email ${e.email} not found`);t.insert(f.orgMembers).values({orgId:e.orgId,userId:n.id,role:e.role}).onConflictDoUpdate({target:[f.orgMembers.orgId,f.orgMembers.userId],set:{role:e.role}}).run();let o=t.select().from(f.drives).where(a(f.drives.orgId,e.orgId)).get();if(o)t.insert(f.driveMembers).values({driveId:o.id,userId:n.id,role:e.role}).onConflictDoUpdate({target:[f.driveMembers.driveId,f.driveMembers.userId],set:{role:e.role}}).run()}var yo=g(()=>{P();lo()});import{eq as Xf}from"drizzle-orm";function Ff(t){let e=new Bun.CryptoHasher("sha256");return e.update(t),e.digest("hex")}function NT(){let t=new Uint8Array(32);return crypto.getRandomValues(t),`af_${Array.from(t,(n)=>n.toString(16).padStart(2,"0")).join("")}`}function wT(){return crypto.randomUUID()}function q(t,e){let n=wT(),o=NT(),i=Ff(o),r=new Date;return t.insert(f.users).values({id:n,email:e.email,apiKeyHash:i,createdAt:r}).run(),$t(t,{name:e.email.split("@")[0],userId:n,isPersonal:!0}),{user:{id:n,email:e.email},apiKey:o}}function st(t,e){let n=Ff(e),o=t.select().from(f.users).where(Xf(f.users.apiKeyHash,n)).get();if(!o)return null;return{id:o.id,email:o.email}}function bt(t,e){let n=t.select().from(f.users).where(Xf(f.users.email,e)).get();if(!n)return null;return{id:n.id,email:n.email}}var so=g(()=>{P();yo()});import{eq as It,and as go}from"drizzle-orm";function x(t,e){if(e.driveId){let r=t.select().from(f.drives).where(It(f.drives.id,e.driveId)).get();if(!r)throw Error(`Drive not found: ${e.driveId}`);let u=Et(t,e.userId,e.driveId);if(!u)throw Error("You do not have access to this drive");return{orgId:r.orgId,driveId:e.driveId,role:u}}if(e.orgId){let r=t.select().from(f.drives).where(go(It(f.drives.orgId,e.orgId),It(f.drives.isDefault,!0))).get();if(!r)throw Error(`No default drive for org: ${e.orgId}`);let u=Et(t,e.userId,r.id);if(!u)throw Error("You do not have access to this drive");return{orgId:e.orgId,driveId:r.id,role:u}}let n=t.select({orgId:f.orgMembers.orgId}).from(f.orgMembers).innerJoin(f.orgs,It(f.orgMembers.orgId,f.orgs.id)).where(go(It(f.orgMembers.userId,e.userId),It(f.orgs.isPersonal,!0))).get();if(!n)throw Error("No personal org found for user");let o=t.select().from(f.drives).where(go(It(f.drives.orgId,n.orgId),It(f.drives.isDefault,!0))).get();if(!o)throw Error("No default drive found");let i=Et(t,e.userId,o.id);if(!i)throw Error("You do not have access to your default drive");return{orgId:n.orgId,driveId:o.id,role:i}}var Hf=g(()=>{P();$e()});function le(t){let e=v();if(e.auth.apiKey){if(st(t,e.auth.apiKey))return{apiKey:e.auth.apiKey}}console.error("[agent-fs] No local user found, creating one...");let n=q(t,{email:"local@agent-fs.local"});return w("auth.apiKey",n.apiKey),console.error("[agent-fs] Local user created automatically."),{apiKey:n.apiKey}}var Yf=g(()=>{zt();so()});var Gf=g(()=>{so();yo();lo();$e();Hf();Yf()});var Bf;var Zf=g(()=>{Bf={name:"agent-fs",version:"0.5.1",private:!0,workspaces:["packages/*"],scripts:{typecheck:"tsc --build",test:"bun test packages/*/src/","test:coverage":"bun test --coverage packages/*/src/",build:"cd packages/cli && bun run build:npm","install-local":"bun run build && cd packages/cli && bun link","uninstall-local":"bun remove -g @desplega.ai/agent-fs && rm -f ~/.bun/bin/agent-fs","deploy:fly":"fly deploy -a agent-fs-taras"},devDependencies:{"bun-types":"^1.2.0",typescript:"^5.7.0",yaml:"^2.8.2","zod-to-json-schema":"^3.25.1"}}});var B;var To=g(()=>{Zf();B=Bf.version});var Vf={};Ft(Vf,{LocalEmbeddingProvider:()=>Qf});import{join as _T}from"path";import{mkdirSync as pT,existsSync as DT}from"fs";class Qf{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:e}=await import("node-llama-cpp");this.llama=await t();let n=_T(nt(),"models");if(!DT(n))pT(n,{recursive:!0});console.error("[agent-fs] Resolving local embedding model...");let o=await e(LT,n);console.error("[agent-fs] Model ready:",o),this.model=await this.llama.loadModel({modelPath:o}),this.embeddingContext=await this.model.createEmbeddingContext()}async embed(t){await this.init();let e=await this.embeddingContext.getEmbeddingFor(t);return Array.from(e.vector)}async embedBatch(t){await this.init();let e=[];for(let n of t){let o=await this.embeddingContext.getEmbeddingFor(n);e.push(Array.from(o.vector))}return e}async dispose(){if(this.embeddingContext)await this.embeddingContext.dispose(),this.embeddingContext=null;if(this.model)await this.model.dispose(),this.model=null;this.initPromise=null}}var LT="hf:nomic-ai/nomic-embed-text-v1.5-GGUF:Q8_0";var Jf=g(()=>{zt()});var Ro={};Ft(Ro,{OpenAIEmbeddingProvider:()=>Wf});import vT from"openai";class Wf{name="openai";dimensions=768;client;constructor(t){this.client=new vT({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((n,o)=>n.index-o.index).map((n)=>n.embedding)}}var Ao=()=>{};var No={};Ft(No,{GeminiEmbeddingProvider:()=>Kf});import{GoogleGenAI as OT}from"@google/genai";class Kf{name="gemini";dimensions=768;client;constructor(t){this.client=new OT({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 e=[];for(let n of t){let o=await this.client.models.embedContent({model:"gemini-embedding-001",contents:n,config:{outputDimensionality:768}});e.push(o.embeddings[0].values)}return e}}var wo=()=>{};async function bf(t){switch(t.provider){case"local":{let{LocalEmbeddingProvider:e}=await Promise.resolve().then(() => (Jf(),Vf));return new e}case"openai":{if(!t.apiKey)throw Error("OpenAI API key required. Set embedding.apiKey in config.");let{OpenAIEmbeddingProvider:e}=await Promise.resolve().then(() => (Ao(),Ro));return new e(t.apiKey)}case"gemini":{if(!t.apiKey)throw Error("Gemini API key required. Set embedding.apiKey in config.");let{GeminiEmbeddingProvider:e}=await Promise.resolve().then(() => (wo(),No));return new e(t.apiKey)}default:throw Error(`Unknown embedding provider: ${t.provider}`)}}async function kt(t){if(process.env.OPENAI_API_KEY)try{let{OpenAIEmbeddingProvider:e}=await Promise.resolve().then(() => (Ao(),Ro));return new e(process.env.OPENAI_API_KEY)}catch(e){console.error("[agent-fs] Failed to load OpenAI provider:",e)}if(process.env.GEMINI_API_KEY)try{let{GeminiEmbeddingProvider:e}=await Promise.resolve().then(() => (wo(),No));return new e(process.env.GEMINI_API_KEY)}catch(e){console.error("[agent-fs] Failed to load Gemini provider:",e)}if(t?.provider&&t.provider!=="local"&&t.apiKey)try{return await bf(t)}catch(e){console.error("[agent-fs] Failed to create embedding provider from config:",e)}if(t?.provider==="local")try{return await bf(t)}catch(e){console.error("[agent-fs] Failed to load local embedding provider:",e)}return null}var jf,kf,zf=(t)=>typeof t==="string"?{...kf,name:t}:{...kf,...t};var Ze=g(()=>{jf=Symbol("Let zodToJsonSchema decide on which parser to use"),kf={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 qf=(t)=>{let e=zf(t),n=e.name!==void 0?[...e.basePath,e.definitionPath,e.name]:e.basePath;return{...e,flags:{hasReferencedOpenAiAnyType:!1},currentPath:n,propertyPath:void 0,seen:new Map(Object.entries(e.definitions).map(([o,i])=>[i._def,{def:i._def,path:[...e.basePath,e.definitionPath,o],jsonSchema:void 0}]))}};var Io=g(()=>{Ze()});function _o(t,e,n,o){if(!o?.errorMessages)return;if(n)t.errorMessage={...t.errorMessage,[e]:n}}function D(t,e,n,o,i){t[e]=n,_o(t,e,o,i)}var Be=(t,e)=>{let n=0;for(;n<t.length&&n<e.length;n++)if(t[n]!==e[n])break;return[(t.length-n).toString(),...e.slice(n)].join("/")};function $(t){if(t.target!=="openAi")return{};let e=[...t.basePath,t.definitionPath,t.openAiAnyTypeName];return t.flags.hasReferencedOpenAiAnyType=!0,{$ref:t.$refStrategy==="relative"?Be(e,t.currentPath):e.join("/")}}var b=()=>{};import{ZodFirstPartyTypeKind as ST}from"zod/v3";function xf(t,e){let n={type:"array"};if(t.type?._def&&t.type?._def?.typeName!==ST.ZodAny)n.items=N(t.type._def,{...e,currentPath:[...e.currentPath,"items"]});if(t.minLength)D(n,"minItems",t.minLength.value,t.minLength.message,e);if(t.maxLength)D(n,"maxItems",t.maxLength.value,t.maxLength.message,e);if(t.exactLength)D(n,"minItems",t.exactLength.value,t.exactLength.message,e),D(n,"maxItems",t.exactLength.value,t.exactLength.message,e);return n}var po=g(()=>{c()});function tE(t,e){let n={type:"integer",format:"int64"};if(!t.checks)return n;for(let o of t.checks)switch(o.kind){case"min":if(e.target==="jsonSchema7")if(o.inclusive)D(n,"minimum",o.value,o.message,e);else D(n,"exclusiveMinimum",o.value,o.message,e);else{if(!o.inclusive)n.exclusiveMinimum=!0;D(n,"minimum",o.value,o.message,e)}break;case"max":if(e.target==="jsonSchema7")if(o.inclusive)D(n,"maximum",o.value,o.message,e);else D(n,"exclusiveMaximum",o.value,o.message,e);else{if(!o.inclusive)n.exclusiveMaximum=!0;D(n,"maximum",o.value,o.message,e)}break;case"multipleOf":D(n,"multipleOf",o.value,o.message,e);break}return n}var Do=()=>{};function eE(){return{type:"boolean"}}function Qe(t,e){return N(t.type._def,e)}var Ve=g(()=>{c()});var nE=(t,e)=>{return N(t.innerType._def,e)};var Lo=g(()=>{c()});function vo(t,e,n){let o=n??e.dateStrategy;if(Array.isArray(o))return{anyOf:o.map((i,r)=>vo(t,e,i))};switch(o){case"string":case"format:date-time":return{type:"string",format:"date-time"};case"format:date":return{type:"string",format:"date"};case"integer":return UT(t,e)}}var UT=(t,e)=>{let n={type:"integer",format:"unix-time"};if(e.target==="openApi3")return n;for(let o of t.checks)switch(o.kind){case"min":D(n,"minimum",o.value,o.message,e);break;case"max":D(n,"maximum",o.value,o.message,e);break}return n};var Oo=()=>{};function oE(t,e){return{...N(t.innerType._def,e),default:t.defaultValue()}}var So=g(()=>{c()});function iE(t,e){return e.effectStrategy==="input"?N(t.schema._def,e):$(e)}var Uo=g(()=>{c();b()});function rE(t){return{type:"string",enum:Array.from(t.values)}}function uE(t,e){let n=[N(t.left._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),N(t.right._def,{...e,currentPath:[...e.currentPath,"allOf","1"]})].filter((r)=>!!r),o=e.target==="jsonSchema2019-09"?{unevaluatedProperties:!1}:void 0,i=[];return n.forEach((r)=>{if(hT(r)){if(i.push(...r.allOf),r.unevaluatedProperties===void 0)o=void 0}else{let u=r;if("additionalProperties"in r&&r.additionalProperties===!1){let{additionalProperties:E,...l}=r;u=l}else o=void 0;i.push(u)}}),i.length?{allOf:i,...o}:void 0}var hT=(t)=>{if("type"in t&&t.type==="string")return!1;return"allOf"in t};var ho=g(()=>{c()});function fE(t,e){let n=typeof t.value;if(n!=="bigint"&&n!=="number"&&n!=="boolean"&&n!=="string")return{type:Array.isArray(t.value)?"array":"object"};if(e.target==="openApi3")return{type:n==="bigint"?"integer":n,enum:[t.value]};return{type:n==="bigint"?"integer":n,const:t.value}}function Je(t,e){let n={type:"string"};if(t.checks)for(let o of t.checks)switch(o.kind){case"min":D(n,"minLength",typeof n.minLength==="number"?Math.max(n.minLength,o.value):o.value,o.message,e);break;case"max":D(n,"maxLength",typeof n.maxLength==="number"?Math.min(n.maxLength,o.value):o.value,o.message,e);break;case"email":switch(e.emailStrategy){case"format:email":et(n,"email",o.message,e);break;case"format:idn-email":et(n,"idn-email",o.message,e);break;case"pattern:zod":G(n,tt.email,o.message,e);break}break;case"url":et(n,"uri",o.message,e);break;case"uuid":et(n,"uuid",o.message,e);break;case"regex":G(n,o.regex,o.message,e);break;case"cuid":G(n,tt.cuid,o.message,e);break;case"cuid2":G(n,tt.cuid2,o.message,e);break;case"startsWith":G(n,RegExp(`^${Po(o.value,e)}`),o.message,e);break;case"endsWith":G(n,RegExp(`${Po(o.value,e)}$`),o.message,e);break;case"datetime":et(n,"date-time",o.message,e);break;case"date":et(n,"date",o.message,e);break;case"time":et(n,"time",o.message,e);break;case"duration":et(n,"duration",o.message,e);break;case"length":D(n,"minLength",typeof n.minLength==="number"?Math.max(n.minLength,o.value):o.value,o.message,e),D(n,"maxLength",typeof n.maxLength==="number"?Math.min(n.maxLength,o.value):o.value,o.message,e);break;case"includes":{G(n,RegExp(Po(o.value,e)),o.message,e);break}case"ip":{if(o.version!=="v6")et(n,"ipv4",o.message,e);if(o.version!=="v4")et(n,"ipv6",o.message,e);break}case"base64url":G(n,tt.base64url,o.message,e);break;case"jwt":G(n,tt.jwt,o.message,e);break;case"cidr":{if(o.version!=="v6")G(n,tt.ipv4Cidr,o.message,e);if(o.version!=="v4")G(n,tt.ipv6Cidr,o.message,e);break}case"emoji":G(n,tt.emoji(),o.message,e);break;case"ulid":{G(n,tt.ulid,o.message,e);break}case"base64":{switch(e.base64Strategy){case"format:binary":{et(n,"binary",o.message,e);break}case"contentEncoding:base64":{D(n,"contentEncoding","base64",o.message,e);break}case"pattern:zod":{G(n,tt.base64,o.message,e);break}}break}case"nanoid":G(n,tt.nanoid,o.message,e);case"toLowerCase":case"toUpperCase":case"trim":break;default:((i)=>{})(o)}return n}function Po(t,e){return e.patternStrategy==="escape"?PT(t):t}function PT(t){let e="";for(let n=0;n<t.length;n++){if(!$T.has(t[n]))e+="\\";e+=t[n]}return e}function et(t,e,n,o){if(t.format||t.anyOf?.some((i)=>i.format)){if(!t.anyOf)t.anyOf=[];if(t.format){if(t.anyOf.push({format:t.format,...t.errorMessage&&o.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:e,...n&&o.errorMessages&&{errorMessage:{format:n}}})}else D(t,"format",e,n,o)}function G(t,e,n,o){if(t.pattern||t.allOf?.some((i)=>i.pattern)){if(!t.allOf)t.allOf=[];if(t.pattern){if(t.allOf.push({pattern:t.pattern,...t.errorMessage&&o.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:EE(e,o),...n&&o.errorMessages&&{errorMessage:{pattern:n}}})}else D(t,"pattern",EE(e,o),n,o)}function EE(t,e){if(!e.applyRegexFlags||!t.flags)return t.source;let n={i:t.flags.includes("i"),m:t.flags.includes("m"),s:t.flags.includes("s")},o=n.i?t.source.toLowerCase():t.source,i="",r=!1,u=!1,E=!1;for(let l=0;l<o.length;l++){if(r){i+=o[l],r=!1;continue}if(n.i){if(u){if(o[l].match(/[a-z]/)){if(E)i+=o[l],i+=`${o[l-2]}-${o[l]}`.toUpperCase(),E=!1;else if(o[l+1]==="-"&&o[l+2]?.match(/[a-z]/))i+=o[l],E=!0;else i+=`${o[l]}${o[l].toUpperCase()}`;continue}}else if(o[l].match(/[a-z]/)){i+=`[${o[l]}${o[l].toUpperCase()}]`;continue}}if(n.m){if(o[l]==="^"){i+=`(^|(?<=[\r
169
+ ]))`;continue}else if(o[l]==="$"){i+=`($|(?=[\r
170
+ ]))`;continue}}if(n.s&&o[l]==="."){i+=u?`${o[l]}\r
171
+ `:`[${o[l]}\r
172
+ ]`;continue}if(i+=o[l],o[l]==="\\")r=!0;else if(u&&o[l]==="]")u=!1;else if(!u&&o[l]==="[")u=!0}try{new RegExp(i)}catch{return console.warn(`Could not convert regex pattern at ${e.currentPath.join("/")} to a flag-independent form! Falling back to the flag-ignorant source`),t.source}return i}var $o=void 0,tt,$T;var We=g(()=>{tt={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($o===void 0)$o=RegExp("^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$","u");return $o},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-_]*$/};$T=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789")});import{ZodFirstPartyTypeKind as ye}from"zod/v3";function Ke(t,e){if(e.target==="openAi")console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead.");if(e.target==="openApi3"&&t.keyType?._def.typeName===ye.ZodEnum)return{type:"object",required:t.keyType._def.values,properties:t.keyType._def.values.reduce((o,i)=>({...o,[i]:N(t.valueType._def,{...e,currentPath:[...e.currentPath,"properties",i]})??$(e)}),{}),additionalProperties:e.rejectedAdditionalProperties};let n={type:"object",additionalProperties:N(t.valueType._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]})??e.allowedAdditionalProperties};if(e.target==="openApi3")return n;if(t.keyType?._def.typeName===ye.ZodString&&t.keyType._def.checks?.length){let{type:o,...i}=Je(t.keyType._def,e);return{...n,propertyNames:i}}else if(t.keyType?._def.typeName===ye.ZodEnum)return{...n,propertyNames:{enum:t.keyType._def.values}};else if(t.keyType?._def.typeName===ye.ZodBranded&&t.keyType._def.type._def.typeName===ye.ZodString&&t.keyType._def.type._def.checks?.length){let{type:o,...i}=Qe(t.keyType._def,e);return{...n,propertyNames:i}}return n}var be=g(()=>{c();We();Ve();b()});function lE(t,e){if(e.mapStrategy==="record")return Ke(t,e);let n=N(t.keyType._def,{...e,currentPath:[...e.currentPath,"items","items","0"]})||$(e),o=N(t.valueType._def,{...e,currentPath:[...e.currentPath,"items","items","1"]})||$(e);return{type:"array",maxItems:125,items:{type:"array",items:[n,o],minItems:2,maxItems:2}}}var ao=g(()=>{c();be();b()});function yE(t){let e=t.values,o=Object.keys(t.values).filter((r)=>{return typeof e[e[r]]!=="number"}).map((r)=>e[r]),i=Array.from(new Set(o.map((r)=>typeof r)));return{type:i.length===1?i[0]==="string"?"string":"number":["string","number"],enum:o}}function sE(t){return t.target==="openAi"?void 0:{not:$({...t,currentPath:[...t.currentPath,"not"]})}}var mo=g(()=>{b()});function gE(t){return t.target==="openApi3"?{enum:["null"],nullable:!0}:{type:"null"}}function RE(t,e){if(e.target==="openApi3")return TE(t,e);let n=t.options instanceof Map?Array.from(t.options.values()):t.options;if(n.every((o)=>(o._def.typeName in se)&&(!o._def.checks||!o._def.checks.length))){let o=n.reduce((i,r)=>{let u=se[r._def.typeName];return u&&!i.includes(u)?[...i,u]:i},[]);return{type:o.length>1?o:o[0]}}else if(n.every((o)=>o._def.typeName==="ZodLiteral"&&!o.description)){let o=n.reduce((i,r)=>{let u=typeof r._def.value;switch(u){case"string":case"number":case"boolean":return[...i,u];case"bigint":return[...i,"integer"];case"object":if(r._def.value===null)return[...i,"null"];case"symbol":case"undefined":case"function":default:return i}},[]);if(o.length===n.length){let i=o.filter((r,u,E)=>E.indexOf(r)===u);return{type:i.length>1?i:i[0],enum:n.reduce((r,u)=>{return r.includes(u._def.value)?r:[...r,u._def.value]},[])}}}else if(n.every((o)=>o._def.typeName==="ZodEnum"))return{type:"string",enum:n.reduce((o,i)=>[...o,...i._def.values.filter((r)=>!o.includes(r))],[])};return TE(t,e)}var se,TE=(t,e)=>{let n=(t.options instanceof Map?Array.from(t.options.values()):t.options).map((o,i)=>N(o._def,{...e,currentPath:[...e.currentPath,"anyOf",`${i}`]})).filter((o)=>!!o&&(!e.strictUnions||typeof o==="object"&&Object.keys(o).length>0));return n.length?{anyOf:n}:void 0};var ke=g(()=>{c();se={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"}});function dE(t,e){if(["ZodString","ZodNumber","ZodBigInt","ZodBoolean","ZodNull"].includes(t.innerType._def.typeName)&&(!t.innerType._def.checks||!t.innerType._def.checks.length)){if(e.target==="openApi3")return{type:se[t.innerType._def.typeName],nullable:!0};return{type:[se[t.innerType._def.typeName],"null"]}}if(e.target==="openApi3"){let o=N(t.innerType._def,{...e,currentPath:[...e.currentPath]});if(o&&"$ref"in o)return{allOf:[o],nullable:!0};return o&&{...o,nullable:!0}}let n=N(t.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","0"]});return n&&{anyOf:[n,{type:"null"}]}}var Co=g(()=>{c();ke()});function AE(t,e){let n={type:"number"};if(!t.checks)return n;for(let o of t.checks)switch(o.kind){case"int":n.type="integer",_o(n,"type",o.message,e);break;case"min":if(e.target==="jsonSchema7")if(o.inclusive)D(n,"minimum",o.value,o.message,e);else D(n,"exclusiveMinimum",o.value,o.message,e);else{if(!o.inclusive)n.exclusiveMinimum=!0;D(n,"minimum",o.value,o.message,e)}break;case"max":if(e.target==="jsonSchema7")if(o.inclusive)D(n,"maximum",o.value,o.message,e);else D(n,"exclusiveMaximum",o.value,o.message,e);else{if(!o.inclusive)n.exclusiveMaximum=!0;D(n,"maximum",o.value,o.message,e)}break;case"multipleOf":D(n,"multipleOf",o.value,o.message,e);break}return n}var Mo=()=>{};function NE(t,e){let n=e.target==="openAi",o={type:"object",properties:{}},i=[],r=t.shape();for(let E in r){let l=r[E];if(l===void 0||l._def===void 0)continue;let y=mT(l);if(y&&n){if(l._def.typeName==="ZodOptional")l=l._def.innerType;if(!l.isNullable())l=l.nullable();y=!1}let s=N(l._def,{...e,currentPath:[...e.currentPath,"properties",E],propertyPath:[...e.currentPath,"properties",E]});if(s===void 0)continue;if(o.properties[E]=s,!y)i.push(E)}if(i.length)o.required=i;let u=aT(t,e);if(u!==void 0)o.additionalProperties=u;return o}function aT(t,e){if(t.catchall._def.typeName!=="ZodNever")return N(t.catchall._def,{...e,currentPath:[...e.currentPath,"additionalProperties"]});switch(t.unknownKeys){case"passthrough":return e.allowedAdditionalProperties;case"strict":return e.rejectedAdditionalProperties;case"strip":return e.removeAdditionalStrategy==="strict"?e.allowedAdditionalProperties:e.rejectedAdditionalProperties}}function mT(t){try{return t.isOptional()}catch{return!0}}var co=g(()=>{c()});var wE=(t,e)=>{if(e.currentPath.toString()===e.propertyPath?.toString())return N(t.innerType._def,e);let n=N(t.innerType._def,{...e,currentPath:[...e.currentPath,"anyOf","1"]});return n?{anyOf:[{not:$(e)},n]}:$(e)};var Xo=g(()=>{c();b()});var IE=(t,e)=>{if(e.pipeStrategy==="input")return N(t.in._def,e);else if(e.pipeStrategy==="output")return N(t.out._def,e);let n=N(t.in._def,{...e,currentPath:[...e.currentPath,"allOf","0"]}),o=N(t.out._def,{...e,currentPath:[...e.currentPath,"allOf",n?"1":"0"]});return{allOf:[n,o].filter((i)=>i!==void 0)}};var Fo=g(()=>{c()});function _E(t,e){return N(t.type._def,e)}var Ho=g(()=>{c()});function pE(t,e){let o={type:"array",uniqueItems:!0,items:N(t.valueType._def,{...e,currentPath:[...e.currentPath,"items"]})};if(t.minSize)D(o,"minItems",t.minSize.value,t.minSize.message,e);if(t.maxSize)D(o,"maxItems",t.maxSize.value,t.maxSize.message,e);return o}var Yo=g(()=>{c()});function DE(t,e){if(t.rest)return{type:"array",minItems:t.items.length,items:t.items.map((n,o)=>N(n._def,{...e,currentPath:[...e.currentPath,"items",`${o}`]})).reduce((n,o)=>o===void 0?n:[...n,o],[]),additionalItems:N(t.rest._def,{...e,currentPath:[...e.currentPath,"additionalItems"]})};else return{type:"array",minItems:t.items.length,maxItems:t.items.length,items:t.items.map((n,o)=>N(n._def,{...e,currentPath:[...e.currentPath,"items",`${o}`]})).reduce((n,o)=>o===void 0?n:[...n,o],[])}}var Go=g(()=>{c()});function LE(t){return{not:$(t)}}var Zo=g(()=>{b()});function vE(t){return $(t)}var Bo=g(()=>{b()});var OE=(t,e)=>{return N(t.innerType._def,e)};var Qo=g(()=>{c()});import{ZodFirstPartyTypeKind as p}from"zod/v3";var SE=(t,e,n)=>{switch(e){case p.ZodString:return Je(t,n);case p.ZodNumber:return AE(t,n);case p.ZodObject:return NE(t,n);case p.ZodBigInt:return tE(t,n);case p.ZodBoolean:return eE();case p.ZodDate:return vo(t,n);case p.ZodUndefined:return LE(n);case p.ZodNull:return gE(n);case p.ZodArray:return xf(t,n);case p.ZodUnion:case p.ZodDiscriminatedUnion:return RE(t,n);case p.ZodIntersection:return uE(t,n);case p.ZodTuple:return DE(t,n);case p.ZodRecord:return Ke(t,n);case p.ZodLiteral:return fE(t,n);case p.ZodEnum:return rE(t);case p.ZodNativeEnum:return yE(t);case p.ZodNullable:return dE(t,n);case p.ZodOptional:return wE(t,n);case p.ZodMap:return lE(t,n);case p.ZodSet:return pE(t,n);case p.ZodLazy:return()=>t.getter()._def;case p.ZodPromise:return _E(t,n);case p.ZodNaN:case p.ZodNever:return sE(n);case p.ZodEffects:return iE(t,n);case p.ZodAny:return $(n);case p.ZodUnknown:return vE(n);case p.ZodDefault:return oE(t,n);case p.ZodBranded:return Qe(t,n);case p.ZodReadonly:return OE(t,n);case p.ZodCatch:return nE(t,n);case p.ZodPipeline:return IE(t,n);case p.ZodFunction:case p.ZodVoid:case p.ZodSymbol:return;default:return((o)=>{return})(e)}};var Vo=g(()=>{b();po();Do();Ve();Lo();Oo();So();Uo();ho();ao();mo();Co();Mo();co();Xo();Fo();Ho();be();Yo();We();Go();Zo();ke();Bo();Qo()});function N(t,e,n=!1){let o=e.seen.get(t);if(e.override){let E=e.override?.(t,e,o,n);if(E!==jf)return E}if(o&&!n){let E=CT(o,e);if(E!==void 0)return E}let i={def:t,path:e.currentPath,jsonSchema:void 0};e.seen.set(t,i);let r=SE(t,t.typeName,e),u=typeof r==="function"?N(r(),e):r;if(u)MT(t,e,u);if(e.postProcess){let E=e.postProcess(u,t,e);return i.jsonSchema=u,E}return i.jsonSchema=u,u}var CT=(t,e)=>{switch(e.$refStrategy){case"root":return{$ref:t.path.join("/")};case"relative":return{$ref:Be(e.currentPath,t.path)};case"none":case"seen":{if(t.path.length<e.currentPath.length&&t.path.every((n,o)=>e.currentPath[o]===n))return console.warn(`Recursive reference detected at ${e.currentPath.join("/")}! Defaulting to any`),$(e);return e.$refStrategy==="seen"?$(e):void 0}}},MT=(t,e,n)=>{if(t.description){if(n.description=t.description,e.markdownDescription)n.markdownDescription=t.description}return n};var c=g(()=>{Ze();Vo();b()});var UE=()=>{};var Jo=(t,e)=>{let n=qf(e),o=typeof e==="object"&&e.definitions?Object.entries(e.definitions).reduce((l,[y,s])=>({...l,[y]:N(s._def,{...n,currentPath:[...n.basePath,n.definitionPath,y]},!0)??$(n)}),{}):void 0,i=typeof e==="string"?e:e?.nameStrategy==="title"?void 0:e?.name,r=N(t._def,i===void 0?n:{...n,currentPath:[...n.basePath,n.definitionPath,i]},!1)??$(n),u=typeof e==="object"&&e.name!==void 0&&e.nameStrategy==="title"?e.name:void 0;if(u!==void 0)r.title=u;if(n.flags.hasReferencedOpenAiAnyType){if(!o)o={};if(!o[n.openAiAnyTypeName])o[n.openAiAnyTypeName]={type:["string","number","integer","boolean","array","null"],items:{$ref:n.$refStrategy==="relative"?"1":[...n.basePath,n.definitionPath,n.openAiAnyTypeName].join("/")}}}let E=i===void 0?o?{...r,[n.definitionPath]:o}:r:{$ref:[...n.$refStrategy==="relative"?[]:n.basePath,n.definitionPath,i].join("/"),[n.definitionPath]:{...o,[i]:r}};if(n.target==="jsonSchema7")E.$schema="http://json-schema.org/draft-07/schema#";else if(n.target==="jsonSchema2019-09"||n.target==="openAi")E.$schema="https://json-schema.org/draft/2019-09/schema#";if(n.target==="openAi"&&(("anyOf"in E)||("oneOf"in E)||("allOf"in E)||("type"in E)&&Array.isArray(E.type)))console.warn("Warning: OpenAI may not support schemas with unions as roots! Try wrapping it in an object property.");return E};var Wo=g(()=>{c();Io();b()});var hE=g(()=>{Wo();Ze();Io();c();UE();b();po();Do();Ve();Lo();Oo();So();Uo();ho();ao();mo();Co();Mo();co();Xo();Fo();Ho();Qo();be();Yo();We();Go();Zo();ke();Bo();Vo();Wo()});function je(){let t=Kt(),e={},n={};for(let i of t){let r=wt(i),u=Jo(r.schema,{target:"openApi3"}),{$schema:E,...l}=u;e[i]=l,n[i]=r.description}let o=t.map((i)=>({type:"object",title:i,description:n[i],required:["op",...e[i].required||[]],properties:{op:{type:"string",const:i},driveId:{type:"string",description:"Target drive ID (optional, uses default drive)"},...e[i].properties||{}},additionalProperties:!1}));return{openapi:"3.1.0",info:{title:"agent-fs API",version:B,description:"A persistent, searchable filesystem for AI agents. agent-fs is to files what agentmail is to email.",license:{name:"MIT",url:"https://github.com/desplega-ai/agent-fs/blob/main/LICENSE"}},servers:[{url:"http://localhost:7433",description:"Local development server"}],paths:{"/health":{get:{summary:"Health check",operationId:"health",tags:["System"],security:[],responses:{"200":{description:"Server is healthy",content:{"application/json":{schema:{type:"object",properties:{ok:{type:"boolean",const:!0},version:{type:"string"}},required:["ok","version"]}}}}}}},"/auth/register":{post:{summary:"Register a new user",operationId:"register",tags:["Auth"],security:[],requestBody:{required:!0,content:{"application/json":{schema:{type:"object",properties:{email:{type:"string",format:"email"}},required:["email"]}}}},responses:{"200":{description:"User registered",content:{"application/json":{schema:{type:"object",properties:{userId:{type:"string"},orgId:{type:"string"},driveId:{type:"string"},apiKey:{type:"string"}},required:["userId","orgId","driveId","apiKey"]}}}}}}},"/auth/me":{get:{summary:"Get current user info",operationId:"me",tags:["Auth"],responses:{"200":{description:"Current user",content:{"application/json":{schema:{type:"object",properties:{id:{type:"string"},email:{type:"string"},createdAt:{type:"string",format:"date-time"}},required:["id","email","createdAt"]}}}}}}},"/orgs/{orgId}/ops":{post:{summary:"Dispatch a file operation",operationId:"dispatchOp",tags:["Operations"],description:"All file operations go through this single endpoint. The `op` field determines which operation to execute.",parameters:[{name:"orgId",in:"path",required:!0,schema:{type:"string"},description:"Organization ID"}],requestBody:{required:!0,content:{"application/json":{schema:{oneOf:o,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 $E=g(()=>{hE();uo();To()});var PE={};Ft(PE,{updateOrgMemberRole:()=>at,updateDriveMemberRole:()=>St,setDriveMember:()=>Eo,setConfigValue:()=>w,setConfig:()=>fi,schema:()=>f,resolveContext:()=>x,removeOrgMember:()=>mt,removeDriveMember:()=>Ut,listUserOrgs:()=>Z,listOrgMembers:()=>Pt,listDrives:()=>vt,listDriveMembers:()=>Ot,inviteToOrg:()=>Ct,getUserDriveRole:()=>Et,getUserByEmail:()=>bt,getUserByApiKey:()=>st,getRequiredRole:()=>ue,getRegisteredOps:()=>Kt,getOrg:()=>Ee,getOpDefinition:()=>wt,getHome:()=>nt,getDrive:()=>fo,getDbPath:()=>pt,getConfigPath:()=>ot,getConfig:()=>v,generateOpenAPISpec:()=>je,ensureLocalUser:()=>le,dispatchOp:()=>Nt,createUser:()=>q,createOrg:()=>$t,createEmbeddingProviderFromEnv:()=>kt,createDrive:()=>Lt,createDatabase:()=>gt,commentUpdate:()=>Fe,commentResolve:()=>Ye,commentList:()=>ce,commentGet:()=>Xe,commentDelete:()=>He,commentAdd:()=>Me,checkPermission:()=>fe,ValidationError:()=>z,VERSION:()=>B,PermissionDeniedError:()=>j,NotFoundError:()=>U,IndexingInProgressError:()=>re,EditConflictError:()=>ft,AgentS3Client:()=>Rt,AgentFSError:()=>ut});var m=g(()=>{P();zt();Uu();V();uo();Gf();To();$E()});var ze={};Ft(ze,{stopDaemon:()=>yR,startDaemon:()=>lR,daemonStatus:()=>sR});import{spawn as rR}from"child_process";import{readFileSync as ko,writeFileSync as uR,unlinkSync as FE,existsSync as jo,openSync as fR}from"fs";import{join as zo}from"path";function qo(){return zo(nt(),"agent-fs.pid")}function ER(){return zo(nt(),"agent-fs.log")}function lR(){let t=qo();if(jo(t)){let E=parseInt(ko(t,"utf-8").trim());try{process.kill(E,0),console.log(`Daemon already running (PID: ${E})`);return}catch{FE(t)}}let e=ER(),n=fR(e,"a"),o=!import.meta.dir.startsWith("/")||import.meta.dir.startsWith("/$bunfs"),i=o?process.execPath:"bun",r=o?["server"]:["run",zo(import.meta.dir,"index.ts")],u=rR(i,r,{detached:!0,stdio:["ignore",n,n]});if(u.unref(),u.pid)uR(t,String(u.pid)),console.log(`Daemon started (PID: ${u.pid})`),console.log(`Logs: ${e}`)}function yR(){let t=qo();if(!jo(t)){console.log("Daemon is not running");return}let e=parseInt(ko(t,"utf-8").trim());try{process.kill(e,"SIGTERM"),console.log(`Daemon stopped (PID: ${e})`)}catch{console.log(`Process ${e} not found (already stopped)`)}FE(t)}function sR(){let t=qo();if(!jo(t))return{running:!1};let e=parseInt(ko(t,"utf-8").trim());try{return process.kill(e,0),{running:!0,pid:e}}catch{return{running:!1}}}var qe=g(()=>{m()});var cR={};import{Server as UR}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport as hR}from"@modelcontextprotocol/sdk/server/stdio.js";import{Client as $R}from"@modelcontextprotocol/sdk/client/index.js";import{StreamableHTTPClientTransport as PR}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{ListToolsRequestSchema as aR,CallToolRequestSchema as mR}from"@modelcontextprotocol/sdk/types.js";var Te,xo,kE,CR,ti,ei,MR;var jE=g(async()=>{m();Te=v(),xo=process.env.AGENT_FS_API_URL??Te.apiUrl??`http://${Te.server.host}:${Te.server.port}`,kE=process.env.AGENT_FS_API_KEY??Te.apiKey??Te.auth?.apiKey;if(!kE)console.error("Error: No API key. Register with `agent-fs auth register` or set AGENT_FS_API_KEY."),process.exit(1);CR=new PR(new URL(`${xo}/mcp`),{requestInit:{headers:{Authorization:`Bearer ${kE}`}}}),ti=new $R({name:"agent-fs-proxy",version:B});try{await ti.connect(CR)}catch(t){console.error(`Cannot connect to agent-fs at ${xo}.
173
+ Start a daemon with \`agent-fs daemon start\` or set AGENT_FS_API_URL to connect to a remote server.`),process.exit(1)}ei=new UR({name:"agent-fs",version:B},{capabilities:{tools:{}}});ei.setRequestHandler(aR,async()=>{return await ti.listTools()});ei.setRequestHandler(mR,async(t)=>{return await ti.callTool(t.params)});MR=new hR;await ei.connect(MR);console.error("[agent-fs] MCP proxy connected to "+xo)});import{z as zE}from"zod";function qE(t,e){let n=Kt();for(let o of n){let i=wt(o);if(!i)continue;t.tool(o,i.description,i.schema instanceof zE.ZodObject?i.schema.shape:{params:zE.any()},async(r,u)=>{let E=e(u),l=await Nt(E,o,r);return{content:[{type:"text",text:JSON.stringify(l,null,2)}]}})}}var xE=g(()=>{m()});import{McpServer as XR}from"@modelcontextprotocol/sdk/server/mcp.js";import{z as _t}from"zod";function tl(t){let{db:e,s3:n,embeddingProvider:o,appUrl:i}=t,r=new XR({name:"agent-fs",version:B}),u=(E)=>{let l=E.authInfo;if(!l?.extra?.user)throw Error("No auth context \u2014 MCP must be accessed through the HTTP server");let y=l.extra.user,s=x(e,{userId:y.id});return{db:e,s3:n,orgId:s.orgId,driveId:s.driveId,userId:y.id,embeddingProvider:o,appUrl:i}};return qE(r,u),r.tool("health","Check agent-fs system health: database, S3, embeddings, version.",{},async(E,l)=>{let y={version:B};try{let s=u(l),R=await Nt(s,"ls",{path:"/"},{skipAuth:!0});y.database={ok:!0,rootEntries:R.entries?.length??0}}catch(s){y.database={ok:!1,error:s.message}}try{await n.listObjects("",{delimiter:"/"}),y.s3={ok:!0}}catch(s){y.s3={ok:!1,error:s.message}}return y.embeddings={configured:!!o},{content:[{type:"text",text:JSON.stringify(y,null,2)}]}}),r.tool("whoami","Get current user identity, org memberships, and drive roles.",{},async(E,l)=>{let y=u(l),s=y.userId,d=Z(e,s).map((C)=>{let M=vt(e,C.id);return{orgId:C.id,orgName:C.name,drives:M.map((H)=>({driveId:H.id,driveName:H.name,role:Et(e,s,H.id)}))}}),L=l.authInfo?.extra?.user?.email,O={userId:s,...L?{email:L}:{},activeOrg:y.orgId,activeDrive:y.driveId,memberships:d};return{content:[{type:"text",text:JSON.stringify(O,null,2)}]}}),r.tool("member-list","List members of the current org, or a specific drive if driveId is provided.",{driveId:_t.string().optional().describe("Drive ID to list members for. Omit for org members.")},async(E,l)=>{let y=u(l),s=E.driveId?Ot(e,E.driveId):Pt(e,y.orgId);return{content:[{type:"text",text:JSON.stringify({members:s},null,2)}]}}),r.tool("member-invite","Invite a user to the current org by email. The user must already have an agent-fs account.",{email:_t.string().describe("Email of the user to invite"),role:_t.enum(["viewer","editor","admin"]).describe("Role to assign")},async(E,l)=>{let y=u(l);try{return Ct(e,{orgId:y.orgId,email:E.email,role:E.role}),{content:[{type:"text",text:JSON.stringify({ok:!0,invited:E.email,role:E.role},null,2)}]}}catch(s){return{content:[{type:"text",text:JSON.stringify({error:s.message},null,2)}],isError:!0}}}),r.tool("member-update-role","Update a member's role in the current org or a specific drive.",{email:_t.string().describe("Email of the member"),role:_t.enum(["viewer","editor","admin"]).describe("New role"),driveId:_t.string().optional().describe("Drive ID to update role for. Omit for org role.")},async(E,l)=>{let y=u(l);try{let s=bt(e,E.email);if(!s)throw Error(`User with email ${E.email} not found`);if(E.driveId)St(e,{driveId:E.driveId,userId:s.id,role:E.role});else at(e,{orgId:y.orgId,userId:s.id,role:E.role});return{content:[{type:"text",text:JSON.stringify({ok:!0,email:E.email,role:E.role},null,2)}]}}catch(s){return{content:[{type:"text",text:JSON.stringify({error:s.message},null,2)}],isError:!0}}}),r.tool("member-remove","Remove a member from the current org (cascades to all drives) or from a specific drive only.",{email:_t.string().describe("Email of the member to remove"),driveId:_t.string().optional().describe("Drive ID to remove from. Omit to remove from org.")},async(E,l)=>{let y=u(l);try{let s=bt(e,E.email);if(!s)throw Error(`User with email ${E.email} not found`);if(E.driveId)Ut(e,{driveId:E.driveId,userId:s.id});else mt(e,{orgId:y.orgId,userId:s.id});return{content:[{type:"text",text:JSON.stringify({ok:!0,removed:E.email},null,2)}]}}catch(s){return{content:[{type:"text",text:JSON.stringify({error:s.message},null,2)}],isError:!0}}}),r}var el=g(()=>{m();xE()});function nl(t){return async(e,n)=>{let o=new URL(e.req.url).pathname;if(FR.some((E)=>o===E||o.startsWith(E)))return n();let i=e.req.header("Authorization");if(!i?.startsWith("Bearer "))return e.json({error:"UNAUTHORIZED",message:"Missing or invalid Authorization header",suggestion:"Include 'Authorization: Bearer <api_key>' header"},401);let r=i.slice(7),u=st(t,r);if(!u)return e.json({error:"UNAUTHORIZED",message:"Invalid API key",suggestion:"Register with POST /auth/register"},401);return e.set("user",u),n()}}var FR;var ol=g(()=>{m();FR=["/auth/register","/health"]});function HR(t){if(t instanceof U)return 404;if(t instanceof j)return 403;if(t instanceof ft)return 409;if(t instanceof re)return 503;if(t instanceof z)return 400;if("code"in t)return 400;return 500}function il(t,e){let n=HR(t);if("toJSON"in t&&typeof t.toJSON==="function")return e.json(t.toJSON(),n);return e.json({error:"INTERNAL_ERROR",message:t.message},n)}var rl=g(()=>{m()});function tn(t){let e=new Map;return setInterval(()=>{let n=Date.now()-60000;for(let[o,i]of e){let r=i.filter((u)=>u>n);if(r.length===0)e.delete(o);else e.set(o,r)}},300000).unref(),async(n,o)=>{let i=n.req.header("authorization")??"",r=i.startsWith("Bearer ")?i.slice(7):n.req.header("x-forwarded-for")??"unknown",u=Date.now(),E=u-60000,l=(e.get(r)??[]).filter((y)=>y>E);if(l.length>=t){let y=l[0],s=Math.ceil((y+60000-u)/1000);return n.header("Retry-After",String(s)),n.json({error:"RATE_LIMITED",message:"Too many requests"},429)}l.push(u),e.set(r,l),await o()}}import{Hono as YR}from"hono";function ul(t){let e=new YR;return e.post("/register",async(n)=>{let{email:o}=await n.req.json();if(!o||typeof o!=="string")return n.json({error:"VALIDATION_ERROR",message:"email is required"},400);try{let i=q(t,{email:o}),r=Z(t,i.user.id);return n.json({apiKey:i.apiKey,userId:i.user.id,orgId:r[0]?.id})}catch(i){if(i instanceof Error&&i.message.includes("UNIQUE"))return n.json({error:"CONFLICT",message:"User with this email already exists"},409);throw i}}),e.get("/me",(n)=>{let o=n.get("user");try{let i=x(t,{userId:o.id});return n.json({userId:o.id,email:o.email,defaultOrgId:i.orgId,defaultDriveId:i.driveId})}catch{return n.json({userId:o.id,email:o.email,defaultOrgId:null,defaultDriveId:null})}}),e}var fl=g(()=>{m()});import{Hono as GR}from"hono";function El(t,e,n=null,o){let i=new GR;return i.post("/:orgId/ops",async(r)=>{let u=r.get("user"),E=r.req.param("orgId"),l=await r.req.json(),{op:y,...s}=l;if(!y)return r.json({error:"VALIDATION_ERROR",message:"op is required in request body"},400);let R=s.driveId||s.drive_id;delete s.driveId,delete s.drive_id;let d=x(t,{userId:u.id,orgId:E,driveId:R}),L={db:t,s3:e,orgId:d.orgId,driveId:d.driveId,userId:u.id,embeddingProvider:n,appUrl:o},O=await Nt(L,y,s);return r.json(O)}),i}var ll=g(()=>{m()});import{Hono as ZR}from"hono";function yl(t){let e=new ZR;return e.get("/",(n)=>{let o=n.get("user"),i=Z(t,o.id);return n.json({orgs:i})}),e.post("/",async(n)=>{let o=n.get("user"),{name:i}=await n.req.json(),r=$t(t,{name:i,userId:o.id});return n.json(r,201)}),e.get("/:orgId",(n)=>{let o=n.req.param("orgId"),i=Ee(t,o);if(!i)return n.json({error:"NOT_FOUND",message:"Org not found"},404);return n.json(i)}),e.get("/:orgId/drives",(n)=>{let o=n.req.param("orgId"),i=vt(t,o);return n.json({drives:i})}),e.post("/:orgId/drives",async(n)=>{let o=n.req.param("orgId"),{name:i}=await n.req.json(),r=Lt(t,{orgId:o,name:i});return n.json(r,201)}),e.post("/:orgId/members/invite",async(n)=>{let o=n.req.param("orgId"),{email:i,role:r}=await n.req.json();return Ct(t,{orgId:o,email:i,role:r}),n.json({ok:!0})}),e.get("/:orgId/members",(n)=>{let o=n.req.param("orgId"),i=Pt(t,o);return n.json({members:i})}),e.patch("/:orgId/members/:userId",async(n)=>{let o=n.req.param("orgId"),i=n.req.param("userId"),{role:r}=await n.req.json();try{return at(t,{orgId:o,userId:i,role:r}),n.json({ok:!0})}catch(u){return n.json({error:"BAD_REQUEST",message:u.message},400)}}),e.delete("/:orgId/members/:userId",(n)=>{let o=n.req.param("orgId"),i=n.req.param("userId");try{return mt(t,{orgId:o,userId:i}),n.json({ok:!0})}catch(r){return n.json({error:"BAD_REQUEST",message:r.message},400)}}),e.get("/:orgId/drives/:driveId/members",(n)=>{let o=n.req.param("driveId"),i=Ot(t,o);return n.json({members:i})}),e.patch("/:orgId/drives/:driveId/members/:userId",async(n)=>{let o=n.req.param("driveId"),i=n.req.param("userId"),{role:r}=await n.req.json();try{return St(t,{driveId:o,userId:i,role:r}),n.json({ok:!0})}catch(u){return n.json({error:"BAD_REQUEST",message:u.message},400)}}),e.delete("/:orgId/drives/:driveId/members/:userId",(n)=>{let o=n.req.param("driveId"),i=n.req.param("userId");try{return Ut(t,{driveId:o,userId:i}),n.json({ok:!0})}catch(r){return n.json({error:"BAD_REQUEST",message:r.message},400)}}),e}var sl=g(()=>{m()});import{Hono as BR}from"hono";function gl(){let t=new BR;return t.get("/openapi.json",(e)=>{return e.json(je())}),t}var Tl=g(()=>{m()});import{Hono as QR}from"hono";function Rl(t,e){let n=new QR;return n.get("/:orgId/drives/:driveId/files/*/raw",async(o)=>{let i=o.get("user"),r=o.req.param("orgId"),u=o.req.param("driveId"),E=x(t,{userId:i.id,orgId:r,driveId:u}),y=new URL(o.req.url).pathname.match(/\/files\/(.+)\/raw$/);if(!y)return o.json({error:"VALIDATION_ERROR",message:"Invalid file path"},400);let s=decodeURIComponent(y[1]),R=_(E.orgId,E.driveId,s);try{let d=await e.getObject(R),L=d.contentType||"application/octet-stream";return new Response(d.body.buffer,{status:200,headers:{"Content-Type":L,"Content-Length":String(d.body.length),"Cache-Control":"private, max-age=60"}})}catch(d){if(d?.name==="NoSuchKey"||d?.$metadata?.httpStatusCode===404)return o.json({error:"NOT_FOUND",message:`File not found: ${s}`},404);throw d}}),n}var dl=g(()=>{m();X()});import{Hono as VR}from"hono";import{cors as Al}from"hono/cors";import{bodyLimit as JR}from"hono/body-limit";import{WebStandardStreamableHTTPServerTransport as WR}from"@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js";function Nl(t,e,n=null){let o=new VR,i=v(),r=i.server?.cors?.origins??["*"];if(r.length===1&&r[0]==="*")o.use("*",Al());else o.use("*",Al({origin:r}));o.use("*",JR({maxSize:52428800})),o.use("*",nl(t));let u=i.server?.rateLimit?.requestsPerMinute??1200;if(u>0)o.use("/orgs/*",tn(u)),o.use("/auth/*",tn(u)),o.use("/mcp",tn(u));return o.onError((E,l)=>il(E,l)),o.get("/health",(E)=>E.json({ok:!0,version:B})),o.all("/mcp",async(E)=>{let l=E.get("user"),y=new WR({sessionIdGenerator:void 0,enableJsonResponse:!0});return await tl({db:t,s3:e,embeddingProvider:n,appUrl:i.appUrl}).connect(y),y.handleRequest(E.req.raw,{authInfo:{token:E.req.header("Authorization")?.slice(7)??"",clientId:l.id,scopes:[],extra:{user:{id:l.id,email:l.email}}}})}),o.route("/auth",ul(t)),o.route("/orgs",yl(t)),o.route("/orgs",El(t,e,n,i.appUrl)),o.route("/docs",gl()),o.route("/orgs",Rl(t,e)),o}var wl=g(()=>{m();el();ol();rl();fl();ll();sl();Tl();dl()});var jR={};function _l(){console.log("Shutting down..."),ni.stop(),process.exit(0)}var en,KR,bR,Il=null,kR,ni;var pl=g(async()=>{m();wl();en=v(),KR=gt(),bR=new Rt(en.s3);try{Il=await kt(en.embedding)}catch(t){console.warn("Embedding provider unavailable, semantic search disabled:",t)}kR=Nl(KR,bR,Il),ni=Bun.serve({fetch:kR.fetch,port:en.server.port,hostname:en.server.host});console.log(`agent-fs daemon running on http://${ni.hostname}:${ni.port}`);process.on("SIGTERM",_l);process.on("SIGINT",_l)});m();import{Command as zR}from"commander";m();class Ko{baseUrl;apiKey;constructor(){let t=v();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,e){let n=new Headers(e?.headers);if(this.apiKey)n.set("Authorization",`Bearer ${this.apiKey}`);n.set("Content-Type","application/json");let o;try{o=await fetch(`${this.baseUrl}${t}`,{...e,headers:n})}catch(r){throw Error(`Cannot connect to agent-fs daemon at ${this.baseUrl}. Is it running? Start with: agent-fs daemon start`)}let i;try{i=await o.json()}catch{let r=await o.text().catch(()=>"");throw Error(`Unexpected response from daemon (${o.status}): ${r||"empty"}`)}if(!o.ok){let r=i.message??i.error??"Request failed",u=i.suggestion?`
174
+ Suggestion: ${i.suggestion}`:"";throw Error(`${r}${u}`)}return i}async get(t){return this.request(t)}async post(t,e){return this.request(t,{method:"POST",body:JSON.stringify(e)})}async patch(t,e){return this.request(t,{method:"PATCH",body:JSON.stringify(e)})}async del(t){return this.request(t,{method:"DELETE"})}async callOp(t,e,n){return this.post(`/orgs/${t}/ops`,{op:e,...n})}async getMe(){return this.get("/auth/me")}setApiKey(t){this.apiKey=t}}m();import{Command as nR}from"commander";function jt(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 Mt(t){if(!t)return"-";let e=typeof t==="string"?new Date(t):t;if(isNaN(e.getTime()))return String(t);return e.toISOString().replace("T"," ").replace(/\.\d{3}Z$/,"Z")}function ge(t,e){return t.length>=e?t:t+" ".repeat(e-t.length)}function bo(t,e){return t.length>=e?t:" ".repeat(e-t.length)+t}function cT(t){let e=t.entries??[];if(e.length===0)return"(empty directory)";let n=Math.max(4,...e.map((E)=>String(E.name).length)),o=Math.max(4,...e.map((E)=>String(E.type).length)),i=Math.max(4,...e.map((E)=>jt(E.size??0).length)),r=ge("NAME",n)+" "+ge("TYPE",o)+" "+bo("SIZE",i)+" MODIFIED",u=e.map((E)=>ge(E.name,n)+" "+ge(E.type,o)+" "+bo(jt(E.size??0),i)+" "+Mt(E.modifiedAt));return[r,...u].join(`
175
+ `)}function mE(t){let n=(t.content??"").split(`
176
+ `);if(n.length>0&&n[n.length-1]==="")n.pop();let o=t.offset??1,i=String(o+n.length-1).length;return n.map((r,u)=>`${bo(String(o+u),i)} ${r}`).join(`
177
+ `)}function XT(t){let e=[["Path",t.path??"-"],["Size",jt(t.size??0)],["Content-Type",t.contentType??"-"],["Author",t.author??"-"],["Version",t.currentVersion!=null?String(t.currentVersion):"-"],["Created",Mt(t.createdAt)],["Modified",Mt(t.modifiedAt)],["Deleted",t.isDeleted?"yes":"no"]];if(t.embeddingStatus)e.push(["Embedding",t.embeddingStatus]);if(t.appUrl)e.push(["App URL",t.appUrl]);let n=Math.max(...e.map(([o])=>o.length));return e.map(([o,i])=>`${ge(o+":",n+1)} ${i}`).join(`
178
+ `)}function FT(t){let e=t.versions??[];if(e.length===0)return"(no version history)";return e.map((n)=>{let o=[`v${n.version} ${Mt(n.createdAt)} ${n.author??"-"} [${n.operation}]`];if(n.message)o.push(` ${n.message}`);if(n.diffSummary)o.push(` ${n.diffSummary}`);return o.join(`
164
179
  `)}).join(`
165
180
 
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
- ${i.snippet}`);if(t.hint)o.push(`
170
- hint: ${t.hint}`);return o.join(`
181
+ `)}function HT(t){return`\u2713 wrote ${t.path} (v${t.version}, ${jt(t.size??0)})`}function YT(t){return`\u2713 edited ${t.path} (v${t.version}, ${t.changes} change${t.changes!==1?"s":""})`}function GT(t){return`\u2713 appended (v${t.version}, ${jt(t.size??0)})`}function ZT(t){return t.deleted?`\u2713 deleted ${t.path}`:`(not found: ${t.path})`}function BT(t){return`\u2713 moved ${t.from} -> ${t.to} (v${t.version})`}function QT(t){return`\u2713 copied ${t.from} -> ${t.to} (v${t.version})`}function VT(t){let e=t.tree??[];if(e.length===0)return"(empty)";let n=[];function o(i,r){for(let u=0;u<i.length;u++){let E=i[u],l=u===i.length-1,y=l?"\u2514\u2500\u2500 ":"\u251C\u2500\u2500 ",s=E.type==="directory"?"/":"";if(n.push(`${r}${y}${E.name}${s}`),E.children&&E.children.length>0){let R=r+(l?" ":"\u2502 ");o(E.children,R)}}}return o(e,""),n.join(`
182
+ `)}function JT(t){let e=t.matches??[];if(e.length===0)return"(no matches)";return e.map((n)=>`${n.path}:${n.lineNumber}: ${n.content}`).join(`
183
+ `)}function WT(t){let e=t.matches??[];if(e.length===0)return t.hint?`(no matches) ${t.hint}`:"(no matches)";let n=e.map((o)=>`${o.path} (rank: ${typeof o.rank==="number"?o.rank.toFixed(2):o.rank})
184
+ ${o.snippet}`);if(t.hint)n.push(`
185
+ hint: ${t.hint}`);return n.join(`
171
186
 
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
- ${o.snippet}`).join(`
187
+ `)}function aE(t){let e=t.results??[];if(e.length===0)return"(no results)";return e.map((n)=>`${n.path} (score: ${typeof n.score==="number"?n.score.toFixed(3):n.score})`+(n.author?` by ${n.author}`:"")+`
188
+ ${n.snippet}`).join(`
174
189
 
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
- ${o.message}`:"")).join(`
190
+ `)}function KT(t){let e=t.matches??[];if(e.length===0)return"(no matches)";return e.map((n)=>`${n.path} ${jt(n.size??0)} ${Mt(n.modifiedAt)}`).join(`
191
+ `)}function bT(t){let e=t.changes??[];if(e.length===0)return"(no changes)";return e.map((n)=>{let o=n.type==="add"?"+":n.type==="remove"?"-":" ",i=n.lineNumber!=null?`${n.lineNumber}: `:"";return`${o} ${i}${n.content}`}).join(`
192
+ `)}function kT(t){return mE(t)}function jT(t){return`\u2713 reverted to v${t.revertedTo} (new version: v${t.version})`}function zT(t){let e=t.entries??[];if(e.length===0)return"(no recent activity)";return e.map((n)=>`${n.path} v${n.version} ${Mt(n.createdAt)} ${n.author??"-"} [${n.operation}]`+(n.message?`
193
+ ${n.message}`:"")).join(`
179
194
 
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.
195
+ `)}function qT(t){let e=[];if(e.push(`reindexed: ${t.reindexed??0}`),t.failed)e.push(`failed: ${t.failed}`);if(t.skipped)e.push(`skipped: ${t.skipped}`);return e.join(", ")}function xT(t){let e=`${t.url}
196
+
197
+ Expires: ${Mt(t.expiresAt)} (${t.expiresIn}s)`;if(t.appUrl)e+=`
198
+ App: ${t.appUrl}`;return e}var tR={ls:cT,cat:mE,stat:XT,log:FT,write:HT,edit:YT,append:GT,rm:ZT,mv:BT,cp:QT,tree:VT,grep:JT,fts:WT,search:aE,"vec-search":aE,glob:KT,diff:bT,tail:kT,revert:jT,recent:zT,reindex:qT,"signed-url":xT};function eR(t,e){let n=tR[t];if(n)return n(e);return JSON.stringify(e,null,2)}function CE(t,e,n){if(n)console.log(JSON.stringify(e,null,2));else console.log(eR(t,e))}var oR=[{name:"write",args:[{name:"path",required:!0}],options:[{flag:"--content <text>",description:"File content (reads stdin if omitted)"},{flag:"-m, --message <msg>",description:"Version message"},{flag:"--expected-version <n>",description:"Fail if file is not at this version (optimistic concurrency)"}]},{name:"cat",args:[{name:"path",required:!0}],options:[{flag:"--offset <n>",description:"Line offset"},{flag:"--limit <n>",description:"Max lines"}]},{name:"edit",args:[{name:"path",required:!0}],options:[{flag:"--old <string>",description:"Text to replace"},{flag:"--new <string>",description:"Replacement text"},{flag:"-m, --message <msg>",description:"Version message"}]},{name:"append",args:[{name:"path",required:!0}],options:[{flag:"--content <text>",description:"Content to append"},{flag:"-m, --message <msg>",description:"Version message"}]},{name:"ls",args:[{name:"path",required:!1}],options:[]},{name:"stat",args:[{name:"path",required:!0}],options:[]},{name:"rm",args:[{name:"path",required:!0}],options:[]},{name:"mv",args:[{name:"from",required:!0},{name:"to",required:!0}],options:[{flag:"-m, --message <msg>",description:"Version message"}]},{name:"cp",args:[{name:"from",required:!0},{name:"to",required:!0}],options:[]},{name:"tail",args:[{name:"path",required:!0}],options:[{flag:"-n, --lines <n>",description:"Number of lines (default: 20)"}]},{name:"log",args:[{name:"path",required:!0}],options:[{flag:"--limit <n>",description:"Max entries"}]},{name:"diff",args:[{name:"path",required:!0}],options:[{flag:"--v1 <n>",description:"First version"},{flag:"--v2 <n>",description:"Second version"}]},{name:"revert",args:[{name:"path",required:!0}],options:[{flag:"--to <n>",description:"Version to revert to"}]},{name:"recent",args:[{name:"path",required:!1}],options:[{flag:"--since <duration>",description:"Time filter (e.g., 1h, 24h)"},{flag:"--limit <n>",description:"Max entries"}]},{name:"grep",args:[{name:"pattern",required:!0},{name:"path",required:!0}],options:[]},{name:"fts",args:[{name:"pattern",required:!0}],options:[{flag:"--path <prefix>",description:"Path prefix filter"}]},{name:"search",args:[{name:"query",required:!0}],options:[{flag:"--limit <n>",description:"Max results"}]},{name:"vec-search",args:[{name:"query",required:!0}],options:[{flag:"--limit <n>",description:"Max results"}]},{name:"reindex",args:[],options:[{flag:"--path <prefix>",description:"Path prefix filter"}]},{name:"tree",args:[{name:"path",required:!1}],options:[{flag:"--depth <n>",description:"Max recursion depth"}]},{name:"glob",args:[{name:"pattern",required:!0}],options:[{flag:"--path <prefix>",description:"Path prefix filter"}]},{name:"signed-url",args:[{name:"path",required:!0}],options:[{flag:"--expires-in <seconds>",description:"Expiry in seconds (default: 86400 = 24h)"}]}];function ME(t,e,n){for(let o of oR){let i=wt(o.name),r=new nR(o.name).description(i?.description??o.name);for(let u of o.args)if(u.required)r.argument(`<${u.name}>`);else r.argument(`[${u.name}]`);for(let u of o.options)r.option(u.flag,u.description);r.action(async(...u)=>{let l={...u[u.length-2]};for(let y=0;y<o.args.length;y++)if(u[y]!==void 0)l[o.args[y].name]=u[y];if((o.name==="write"||o.name==="append")&&!l.content)if(!process.stdin.isTTY)l.content=await Bun.stdin.text();else console.error("Error: --content required (or pipe content via stdin)"),process.exit(1);if(l["expected-version"]!==void 0)l.expectedVersion=l["expected-version"],delete l["expected-version"];if(l.old!==void 0)l.old_string=l.old,delete l.old;if(l.new!==void 0)l.new_string=l.new,delete l.new;if(o.name==="revert"&&l.to!==void 0)l.version=l.to,delete l.to;if(l["expires-in"]!==void 0)l.expiresIn=l["expires-in"],delete l["expires-in"];for(let y of["offset","limit","lines","v1","v2","version","expectedVersion","depth","expiresIn"])if(l[y]!==void 0)l[y]=parseInt(l[y]);try{let y=await e.callOp(await n(),o.name,l);CE(o.name,y,t.opts().json)}catch(y){if(y?.cause?.code==="ECONNREFUSED"||y?.message?.includes("fetch failed"))console.error(`Cannot connect to agent-fs daemon.
181
199
  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: ${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(`
200
+ Or set AGENT_FS_API_URL to connect to a remote server.`),process.exit(1);console.error(`Error: ${y.message}`),process.exit(1)}}),t.addCommand(r)}}m();import{Command as iR}from"commander";function XE(t){let e=new iR("auth").description("Authentication commands");return e.command("register").argument("<email>","Email address").description("Register a new user").action(async(n)=>{try{let o=await t.post("/auth/register",{email:n});cE(o,t)}catch{try{let o=gt(),i=q(o,{email:n}),r=Z(o,i.user.id);cE({apiKey:i.apiKey,userId:i.user.id,orgId:r[0]?.id},t)}catch(o){if(o.message?.includes("UNIQUE"))console.error("Error: User with this email already exists.");else console.error(`Error: ${o.message}`);process.exit(1)}}}),e.command("whoami").description("Show current user info").action(async()=>{try{let n=await t.get("/auth/me");console.log(JSON.stringify(n,null,2))}catch{try{let{getConfig:n,getUserByApiKey:o,createDatabase:i,listUserOrgs:r}=await Promise.resolve().then(() => (m(),PE)),u=n();if(!u.auth.apiKey)console.error("Not logged in. Run: agent-fs auth register <email>"),process.exit(1);let E=i(),l=o(E,u.auth.apiKey);if(!l)console.error("Invalid API key in config."),process.exit(1);let y=r(E,l.id);console.log(JSON.stringify({...l,orgs:y},null,2))}catch(n){console.error(`Error: ${n.message}`),process.exit(1)}}}),e}function cE(t,e){console.log("Registered successfully!"),console.log(`API Key: ${t.apiKey}`),console.log(`User ID: ${t.userId}`),console.log(`Org ID: ${t.orgId}`),w("auth.apiKey",t.apiKey),e.setApiKey(t.apiKey),console.log(`
201
+ API key saved to config.`)}import{Command as gR}from"commander";function HE(){let t=new gR("daemon").description("Daemon lifecycle management");return t.command("start").description("Start the agent-fs daemon").action(async()=>{let{startDaemon:e}=await Promise.resolve().then(() => (qe(),ze));e()}),t.command("stop").description("Stop the agent-fs daemon").action(async()=>{let{stopDaemon:e}=await Promise.resolve().then(() => (qe(),ze));e()}),t.command("status").description("Check daemon status").action(async()=>{let{daemonStatus:e}=await Promise.resolve().then(() => (qe(),ze)),n=e();if(n.running)console.log(`Daemon running (PID: ${n.pid})`);else console.log("Daemon is not running")}),t}m();import{Command as TR}from"commander";import{existsSync as YE}from"fs";function GE(){let t=new TR("config").description("Configuration management");return t.command("get").argument("<key>","Config key (dot notation, e.g., s3.bucket)").description("Get a config value").action((e)=>{let n=v(),o=e.split("."),i=n;for(let r of o)i=i?.[r];if(i===void 0)console.error(`Key not found: ${e}`),process.exit(1);console.log(typeof i==="object"?JSON.stringify(i,null,2):String(i))}),t.command("set").argument("<key>","Config key").argument("<value>","Config value").description("Set a config value").action((e,n)=>{let o=n;try{o=JSON.parse(n)}catch{}w(e,o),console.log(`Set ${e} = ${JSON.stringify(o)}`)}),t.command("list").description("Show all config").action(()=>{console.log(JSON.stringify(v(),null,2))}),t.command("validate").description("Check that config, database, S3, and embeddings are healthy").action(async()=>{let e=[],n=v(),o=YE(ot());e.push({name:"Config file",ok:o,message:o?ot():"Not found \u2014 run `agent-fs onboard`"});let r=["endpoint","bucket","accessKeyId","secretAccessKey"].filter((s)=>!n.s3[s]);if(e.push({name:"S3 config",ok:r.length===0,message:r.length===0?`${n.s3.provider} \u2192 ${n.s3.endpoint}/${n.s3.bucket}`:`Missing: ${r.join(", ")}`}),r.length===0)try{await new Rt(n.s3).listObjects(""),e.push({name:"S3 connectivity",ok:!0,message:"Connected"})}catch(s){e.push({name:"S3 connectivity",ok:!1,message:s.message||"Connection failed"})}let u=YE(pt());e.push({name:"Database",ok:u,message:u?pt():"Not found \u2014 run `agent-fs onboard`"}),e.push({name:"Auth",ok:!!n.auth.apiKey,message:n.auth.apiKey?"API key configured":"No API key \u2014 run `agent-fs onboard`"});let E=n.embedding.provider,l=!!n.embedding.apiKey||!!process.env.OPENAI_API_KEY||!!process.env.GEMINI_API_KEY;if(E==="openai"||E==="gemini")if(l)try{let s=await kt(n.embedding);e.push({name:"Embeddings",ok:!!s,message:s?`${E} ready`:`${E} configured but failed to init`})}catch(s){e.push({name:"Embeddings",ok:!1,message:s.message})}else e.push({name:"Embeddings",ok:!1,message:`${E} selected but no API key`});else e.push({name:"Embeddings",ok:!0,message:"local/disabled (semantic search may be unavailable)"});console.log(`
184
202
  agent-fs health check
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.
203
+ `);let y=!0;for(let s of e){let R=s.ok?"\u2713":"\u2717";if(console.log(` ${R} ${s.name}: ${s.message}`),!s.ok)y=!1}if(console.log(),y)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 RR}from"commander";function ZE(t,e){let n=new RR("drive").description("Drive management");return n.command("list").description("List drives (all orgs unless --org is set)").action(async()=>{let o=n.parent?.opts().json;try{let i=n.parent?.opts().org;if(i){let E=await t.get(`/orgs/${i}/drives`);if(o){console.log(JSON.stringify(E,null,2));return}for(let l of E.drives){let y=l.isDefault?" (default)":"";console.log(`${l.id} ${l.name}${y}`)}return}let{orgs:r}=await t.get("/orgs");if(o){let E=[];for(let l of r){let{drives:y}=await t.get(`/orgs/${l.id}/drives`);E.push({orgId:l.id,orgName:l.name,drives:y})}console.log(JSON.stringify(E,null,2));return}if(!r||r.length===0){console.log("(no orgs)");return}let u=v();for(let E of r){let l=[];if(E.isPersonal)l.push("personal");if(u.defaultOrg===E.id)l.push("active");let y=l.length>0?` (${l.join(", ")})`:"";console.log(`
204
+ ${E.name} [${E.role}]${y}`);let{drives:s}=await t.get(`/orgs/${E.id}/drives`);for(let R of s){let d=[];if(R.isDefault)d.push("default");if(u.defaultDrive===R.id)d.push("active");let L=d.length>0?` (${d.join(", ")})`:"";console.log(` ${R.id} ${R.name}${L}`)}}}catch(i){console.error(`Error: ${i.message}`),process.exit(1)}}),n.command("create").argument("<name>","Drive name").description("Create a new drive").action(async(o)=>{try{let i=await e(),r=await t.post(`/orgs/${i}/drives`,{name:o});console.log(JSON.stringify(r,null,2))}catch(i){console.error(`Error: ${i.message}`),process.exit(1)}}),n.command("current").description("Show current drive context").action(async()=>{let o=n.parent?.opts().json;try{let i=v(),r=await t.getMe(),u=i.defaultOrg??r.defaultOrgId;if(!u)console.error("Error: No org context. Run 'agent-fs auth register' first."),process.exit(1);let{drives:E}=await t.get(`/orgs/${u}/drives`),l;if(i.defaultDrive)l=E.find((s)=>s.id===i.defaultDrive);if(!l)l=E.find((s)=>s.isDefault)??E[0]??null;let y=i.defaultOrg?"config (org switch)":"server default";if(o)console.log(JSON.stringify({orgId:u,drive:l,source:y},null,2));else console.log(`org: ${u}`),console.log(`drive: ${l?.id??"(none)"} ${l?.name??""}`),console.log(`source: ${y}`)}catch(i){console.error(`Error: ${i.message}`),process.exit(1)}}),n.command("switch").argument("<driveId>","Drive ID to switch to").description("Set default drive context").action(async(o)=>{try{let{orgs:i}=await t.get("/orgs"),r=null,u=null;for(let E of i){let{drives:l}=await t.get(`/orgs/${E.id}/drives`),y=l.find((s)=>s.id===o);if(y){r=y,u=E;break}}if(!r)console.error(`Error: Drive ${o} not found in any of your orgs.`),process.exit(1);w("defaultOrg",u.id),w("defaultDrive",o),console.log(`Switched to drive: ${r.name} (org: ${u.name})`)}catch(i){console.error(`Error: ${i.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",`
205
+ 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 r=await e();await t.post(`/orgs/${r}/members/invite`,{email:o,role:i.role}),console.log(`Invited ${o} as ${i.role}`)}catch(r){console.error(`Error: ${r.message}`),process.exit(1)}}),n}m();import{Command as dR}from"commander";function BE(t){let e=new dR("org").description("Org management");return e.command("list").description("List orgs you belong to").action(async()=>{let n=e.parent?.opts().json;try{let{orgs:o}=await t.get("/orgs");if(n){console.log(JSON.stringify(o,null,2));return}if(!o||o.length===0){console.log("(no orgs)");return}let i=v();for(let r of o){let u=[];if(r.isPersonal)u.push("personal");if(i.defaultOrg===r.id)u.push("active");let E=u.length>0?` (${u.join(", ")})`:"";console.log(`${r.id} ${r.name} [${r.role}]${E}`)}}catch(o){console.error(`Error: ${o.message}`),process.exit(1)}}),e.command("current").description("Show current org context").action(async()=>{let n=e.parent?.opts().json;try{let o=v(),i=await t.getMe(),r=o.defaultOrg??i.defaultOrgId;if(!r)console.error("Error: No org context. Run 'agent-fs auth register' first."),process.exit(1);let u=await t.get(`/orgs/${r}`),E=o.defaultOrg?"config (org switch)":"server default";if(n)console.log(JSON.stringify({...u,source:E},null,2));else console.log(`${u.id} ${u.name}${u.isPersonal?" (personal)":""}`),console.log(`source: ${E}`)}catch(o){console.error(`Error: ${o.message}`),process.exit(1)}}),e.command("switch").argument("<orgId>","Org ID to switch to").description("Set default org context").action(async(n)=>{try{let o=await t.get(`/orgs/${n}`);w("defaultOrg",n),w("defaultDrive",void 0),console.log(`Switched to org: ${o.name} (${n})`)}catch(o){console.error(`Error: ${o.message}`),process.exit(1)}}),e}import{Command as DR}from"commander";m();import{Command as AR}from"commander";import{execSync as ct}from"child_process";import{existsSync as NR}from"fs";function xe(){return new AR("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(e)=>{if(e.remote)console.error(`Remote mode is not yet supported in the onboard wizard.
188
206
  To connect to a remote server, configure manually:
189
- agent-fs config set api.url "`+n.remote+`"
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.
207
+ agent-fs config set api.url "`+e.remote+`"
208
+ agent-fs config set api.key "<your-api-key>"`),process.exit(1);let n=ot();if(NR(n)){if(v().auth.apiKey&&!e.yes)console.log("Existing configuration found at "+n),console.log(`Re-running onboard will update settings. Use -y to accept defaults.
191
209
  `)}console.log(`Setting up agent-fs...
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(`
210
+ `);let i=!(e.s3Endpoint||e.s3Bucket||e.s3AccessKey||e.s3SecretKey);if(e.s3Endpoint){if(w("s3.endpoint",e.s3Endpoint),e.s3Bucket)w("s3.bucket",e.s3Bucket);if(e.s3AccessKey)w("s3.accessKeyId",e.s3AccessKey);if(e.s3SecretKey)w("s3.secretAccessKey",e.s3SecretKey);if(e.s3Region)w("s3.region",e.s3Region);w("s3.provider","s3"),console.log("S3 configured from flags.")}else if(i)await IR(!!e.yes);else await _R();let r=e.embeddings??(e.yes?"none":void 0);if(r)wR(r,e);else if(!e.yes)console.log(`
193
211
  Embedding provider not specified. Skipping (semantic search disabled).`),console.log("Configure later: agent-fs config set embedding.provider openai");console.log(`
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).
212
+ Initializing database...`);let u=gt();if(console.log("Database ready."),i||e.yes){let{apiKey:E}=le(u),l=st(u,E),y=Z(u,l.id);console.log(`
213
+ User registered: ${l.email}`),console.log(`API Key: ${E}`),console.log(`Org ID: ${y[0]?.id}`)}else{let E=await pR();try{let l=q(u,{email:E}),y=Z(u,l.user.id);w("auth.apiKey",l.apiKey),console.log(`
214
+ User registered: ${E}`),console.log(`API Key: ${l.apiKey}`),console.log(`Org ID: ${y[0]?.id}`)}catch(l){if(l.message?.includes("UNIQUE"))console.log(`User ${E} already exists.`);else throw l}}console.log("\nSetup complete! Run `agent-fs daemon start` to begin."),console.log("Or use MCP directly: agent-fs mcp")})}function wR(t,e){switch(t){case"openai":if(w("embedding.provider","openai"),w("embedding.model","text-embedding-3-small"),e.openaiKey)w("embedding.apiKey",e.openaiKey);console.log("Embeddings: OpenAI (text-embedding-3-small)");break;case"gemini":if(w("embedding.provider","gemini"),w("embedding.model","text-embedding-004"),e.geminiKey)w("embedding.apiKey",e.geminiKey);console.log("Embeddings: Google Gemini (text-embedding-004)");break;case"local":w("embedding.provider","local"),console.log("Embeddings: local llama.cpp");break;case"none":w("embedding.provider","local"),w("embedding.model",""),w("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 IR(t){try{ct("which docker",{stdio:"ignore"}),ct("docker info",{stdio:"ignore"})}catch{console.error(`Docker is required for local mode (MinIO).
197
215
  Install Docker: https://docs.docker.com/get-docker/
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.
216
+ Or use 'agent-fs onboard --s3-endpoint <url>' to configure your own S3 bucket.`),process.exit(1)}let e=ct("docker ps -a --filter name=agent-fs-minio --format '{{.Names}}'",{encoding:"utf-8"}).trim();if(e==="agent-fs-minio")console.log("Found existing MinIO container (agent-fs-minio).");if(!t){let n=e==="agent-fs-minio"?"start the existing":"create a new";process.stdout.write(`This will ${n} MinIO Docker container. Continue? [Y/n] `);let o=Bun.stdin.stream().getReader(),{value:i}=await o.read();o.releaseLock();let r=new TextDecoder().decode(i).trim().toLowerCase();if(r==="n"||r==="no"){console.log("Skipped MinIO setup. Configure S3 manually:"),console.log(" agent-fs config set s3.endpoint <url>");return}}console.log("Setting up MinIO (local S3)...");try{if(e==="agent-fs-minio")ct("docker start agent-fs-minio",{stdio:"inherit"}),console.log("MinIO container started.");else ct('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((o)=>setTimeout(o,2000));try{ct("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 n=ct("docker inspect --format='{{.Id}}' agent-fs-minio",{encoding:"utf-8"}).trim();w("minio.containerId",n),w("minio.managed",!0)}catch(n){console.error(`Failed to set up MinIO: ${n.message}`),process.exit(1)}w("s3.provider","minio"),w("s3.endpoint","http://localhost:9000"),w("s3.bucket","agentfs"),w("s3.region","us-east-1"),w("s3.accessKeyId","minioadmin"),w("s3.secretAccessKey","minioadmin"),console.log("MinIO configured.")}async function _R(){let t=v();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(`
217
+ Edit with: agent-fs config set s3.endpoint <url>`)}async function pR(){process.stdout.write("Email for first user: ");let t=Bun.stdin.stream().getReader(),{value:e}=await t.read();return t.releaseLock(),new TextDecoder().decode(e).trim()||"local@agent-fs.local"}function QE(){let t=xe(),e=new DR("init").description("Set up agent-fs (alias for 'onboard')").allowUnknownOption(!0).action(async(n,o)=>{console.log(`Note: 'agent-fs init' is now 'agent-fs onboard'.
218
+ `),await t.parseAsync(o.args,{from:"user"})});for(let n of t.options)e.addOption(n);return e}import{Command as LR}from"commander";function VE(t,e){let n=new LR("comment").description("Document comments");async function o(i,r){try{return await t.callOp(await e(),i,r)}catch(u){if(u?.cause?.code==="ECONNREFUSED"||u?.message?.includes("fetch failed"))console.error(`Cannot connect to agent-fs daemon.
201
219
  Start with: agent-fs daemon start
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=`---
220
+ Or set AGENT_FS_API_URL to connect to a remote server.`),process.exit(1);throw u}}return n.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(i,r)=>{try{let u={path:i,body:r.body};if(r.quotedContent)u.quotedContent=r.quotedContent;if(r.line)u.lineStart=parseInt(r.line),u.lineEnd=parseInt(r.line);if(r.lineStart)u.lineStart=parseInt(r.lineStart);if(r.lineEnd)u.lineEnd=parseInt(r.lineEnd);let E=await o("comment-add",u);console.log(JSON.stringify(E,null,2))}catch(u){console.error(`Error: ${u.message}`),process.exit(1)}}),n.command("reply").argument("<comment-id>","Parent comment ID to reply to").requiredOption("--body <text>","Reply body").description("Reply to a comment").action(async(i,r)=>{try{let u=await o("comment-add",{parentId:i,body:r.body});console.log(JSON.stringify(u,null,2))}catch(u){console.error(`Error: ${u.message}`),process.exit(1)}}),n.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(i,r)=>{try{let u={};if(i)u.path=i;if(r.resolved)u.resolved=!0;if(r.limit)u.limit=parseInt(r.limit);if(r.offset)u.offset=parseInt(r.offset);let E=await o("comment-list",u);console.log(JSON.stringify(E,null,2))}catch(u){console.error(`Error: ${u.message}`),process.exit(1)}}),n.command("get").argument("<id>","Comment ID").description("Get a comment with its replies").action(async(i)=>{try{let r=await o("comment-get",{id:i});console.log(JSON.stringify(r,null,2))}catch(r){console.error(`Error: ${r.message}`),process.exit(1)}}),n.command("update").argument("<id>","Comment ID").requiredOption("--body <text>","New comment body").description("Update a comment").action(async(i,r)=>{try{let u=await o("comment-update",{id:i,body:r.body});console.log(JSON.stringify(u,null,2))}catch(u){console.error(`Error: ${u.message}`),process.exit(1)}}),n.command("delete").argument("<id>","Comment ID").description("Delete a comment (soft delete)").action(async(i)=>{try{let r=await o("comment-delete",{id:i});console.log(JSON.stringify(r,null,2))}catch(r){console.error(`Error: ${r.message}`),process.exit(1)}}),n.command("resolve").argument("<id>","Comment ID").description("Resolve a comment").action(async(i)=>{try{let r=await o("comment-resolve",{id:i,resolved:!0});console.log(JSON.stringify(r,null,2))}catch(r){console.error(`Error: ${r.message}`),process.exit(1)}}),n.command("reopen").argument("<id>","Comment ID").description("Reopen a resolved comment").action(async(i)=>{try{let r=await o("comment-resolve",{id:i,resolved:!1});console.log(JSON.stringify(r,null,2))}catch(r){console.error(`Error: ${r.message}`),process.exit(1)}}),n}import{Command as vR}from"commander";function WE(t,e){let n=new vR("member").description("Member management (use global --drive to scope to a drive)");return n.command("list").description("List members of an org (or drive if --drive is set)").action(async()=>{let o=n.parent?.opts().json,i=n.parent?.opts().drive;try{let r=await e(),u=i?`/orgs/${r}/drives/${i}/members`:`/orgs/${r}/members`,{members:E}=await t.get(u);if(o){console.log(JSON.stringify(E,null,2));return}if(!E||E.length===0){console.log("(no members)");return}for(let l of E)console.log(`${l.email} [${l.role}]`)}catch(r){console.error(`Error: ${r.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").action(async(o,i)=>{try{let r=await e();await t.post(`/orgs/${r}/members/invite`,{email:o,role:i.role}),console.log(`Invited ${o} as ${i.role}`)}catch(r){console.error(`Error: ${r.message}`),process.exit(1)}}),n.command("update-role").argument("<email>","User email").requiredOption("--role <role>","New role: viewer, editor, or admin").description("Update a member's role (use global --drive for drive scope)").action(async(o,i)=>{let r=n.parent?.opts().drive;try{let u=await e(),E=await JE(t,u,o,r);if(r)await t.patch(`/orgs/${u}/drives/${r}/members/${E}`,{role:i.role});else await t.patch(`/orgs/${u}/members/${E}`,{role:i.role});let l=r?`drive ${r}`:"org";console.log(`Updated ${o} to ${i.role} (${l})`)}catch(u){console.error(`Error: ${u.message}`),process.exit(1)}}),n.command("remove").argument("<email>","User email to remove").description("Remove a member from org (or drive only if --drive is set)").action(async(o)=>{let i=n.parent?.opts().drive;try{let r=await e(),u=await JE(t,r,o,i);if(i)await t.del(`/orgs/${r}/drives/${i}/members/${u}`),console.log(`Removed ${o} from drive ${i}`);else await t.del(`/orgs/${r}/members/${u}`),console.log(`Removed ${o} from org`)}catch(r){console.error(`Error: ${r.message}`),process.exit(1)}}),n}async function JE(t,e,n,o){let i=o?`/orgs/${e}/drives/${o}/members`:`/orgs/${e}/members`,{members:r}=await t.get(i),u=r.find((E)=>E.email===n);if(!u)throw Error(`Member with email ${n} not found`);return u.userId}import{Command as SR}from"commander";var KE=`---
203
221
  name: agent-fs
204
222
  description: >-
205
223
  Use when the user wants to store, retrieve, search, or manage files in agent-fs \u2014
206
224
  an agent-first filesystem backed by S3. Triggers on: "save this to agent-fs",
207
225
  "find that file", "store this document", "search agent-fs", "list my files",
208
- "show version history", "revert file", "set up agent-fs", file persistence for
209
- agents, shared agent filesystem, or any mention of the agent-fs CLI. Also use
210
- when the user needs to manage drives, check recent activity, or use semantic
211
- search across stored files. If the user mentions agent-fs in any context, always
212
- consult this skill.
226
+ "show version history", "revert file", "set up agent-fs", "get a signed url",
227
+ "share this file", "manage members", "invite user", "list members", "remove member",
228
+ "update role", file persistence for agents, shared agent filesystem, or any
229
+ mention of the agent-fs CLI. Also use when the user needs to manage drives,
230
+ manage org/drive members, generate presigned URLs, check recent activity, or use
231
+ semantic search across stored files. If the user mentions agent-fs in any context,
232
+ always consult this skill.
213
233
  ---
214
234
 
215
235
  # agent-fs CLI
@@ -278,6 +298,7 @@ For custom S3 (AWS, R2, etc.), use flags: \`agent-fs onboard --s3-endpoint <url>
278
298
  | \`rm\` | \`agent-fs rm <path>\` | Delete a file |
279
299
  | \`mv\` | \`agent-fs mv <from> <to> [-m <msg>]\` | Move or rename a file |
280
300
  | \`cp\` | \`agent-fs cp <from> <to>\` | Copy a file |
301
+ | \`signed-url\` | \`agent-fs signed-url <path> [--expires-in <seconds>]\` | Generate a presigned URL for direct download (default: 24h, max: 7 days) |
281
302
 
282
303
  ### Versioning
283
304
 
@@ -293,14 +314,16 @@ For custom S3 (AWS, R2, etc.), use flags: \`agent-fs onboard --s3-endpoint <url>
293
314
  |---------|-------|-------------|
294
315
  | \`grep\` | \`agent-fs grep <pattern> <path>\` | Regex search in file content |
295
316
  | \`fts\` | \`agent-fs fts <pattern> [path]\` | Full-text search (FTS5) across all files |
296
- | \`search\` | \`agent-fs search <query> [--limit <n>]\` | Semantic search using embeddings |
317
+ | \`search\` | \`agent-fs search <query> [--limit <n>]\` | Hybrid search (semantic + keyword, best for general queries) |
318
+ | \`vec-search\` | \`agent-fs vec-search <query> [--limit <n>]\` | Vector-only semantic search using embeddings |
297
319
  | \`recent\` | \`agent-fs recent [path] [--since <duration>] [--limit <n>]\` | Recent activity (e.g., \`--since 24h\`) |
298
320
  | \`reindex\` | \`agent-fs reindex [path]\` | Re-index files with failed/missing embeddings |
299
321
 
300
322
  **When to use which:**
301
323
  - \`grep\` \u2014 you know the exact pattern and path (regex)
302
324
  - \`fts\` \u2014 keyword search across all files (fast, FTS5-based)
303
- - \`search\` \u2014 conceptual/semantic search ("find things about X")
325
+ - \`search\` \u2014 general-purpose search combining keywords and meaning (recommended default)
326
+ - \`vec-search\` \u2014 pure semantic search when you want conceptual matches only
304
327
 
305
328
  ### Comments
306
329
 
@@ -323,6 +346,17 @@ For custom S3 (AWS, R2, etc.), use flags: \`agent-fs onboard --s3-endpoint <url>
323
346
  | \`auth register\` | \`agent-fs auth register <email>\` | Register a new user |
324
347
  | \`auth whoami\` | \`agent-fs auth whoami\` | Show current user info |
325
348
 
349
+ ### Member Management
350
+
351
+ | Command | Usage | Description |
352
+ |---------|-------|-------------|
353
+ | \`member list\` | \`agent-fs member list\` | List org members (use \`--drive <id>\` for drive members) |
354
+ | \`member invite\` | \`agent-fs member invite <email> --role <role>\` | Invite user to org (viewer/editor/admin) |
355
+ | \`member update-role\` | \`agent-fs member update-role <email> --role <role>\` | Update org role (use \`--drive <id>\` for drive role) |
356
+ | \`member remove\` | \`agent-fs member remove <email>\` | Remove from org (use \`--drive <id>\` for drive only) |
357
+
358
+ The \`--drive\` flag is a global option \u2014 place it before the subcommand: \`agent-fs --drive <id> member list\`.
359
+
326
360
  ### Drive Management
327
361
 
328
362
  | Command | Usage | Description |
@@ -371,8 +405,11 @@ agent-fs grep "revenue|growth" reports/
371
405
  # Full-text search across all files (FTS5 \u2014 fast keyword matching)
372
406
  agent-fs fts "quarterly revenue"
373
407
 
374
- # Semantic search (finds conceptually related content)
408
+ # Hybrid search (combines keyword + semantic matching \u2014 recommended default)
375
409
  agent-fs search "financial performance metrics" --limit 5
410
+
411
+ # Vector-only semantic search (conceptual matches only)
412
+ agent-fs vec-search "financial performance metrics" --limit 5
376
413
  \`\`\`
377
414
 
378
415
  ### Review and revert changes
@@ -417,6 +454,28 @@ agent-fs drive invite alice@company.com --role editor
417
454
  agent-fs drive current
418
455
  \`\`\`
419
456
 
457
+ ### Manage members
458
+
459
+ \`\`\`bash
460
+ # List org members
461
+ agent-fs member list
462
+
463
+ # List drive members
464
+ agent-fs --drive <driveId> member list
465
+
466
+ # Invite a user
467
+ agent-fs member invite alice@company.com --role editor
468
+
469
+ # Change role
470
+ agent-fs member update-role alice@company.com --role admin
471
+
472
+ # Remove from org (cascades to all drives)
473
+ agent-fs member remove alice@company.com
474
+
475
+ # Remove from a specific drive only (keeps org membership)
476
+ agent-fs --drive <driveId> member remove alice@company.com
477
+ \`\`\`
478
+
420
479
  ### Check recent activity
421
480
 
422
481
  \`\`\`bash
@@ -427,14 +486,43 @@ agent-fs recent --since 1h
427
486
  agent-fs recent docs/ --since 24h --limit 20
428
487
  \`\`\`
429
488
 
489
+ ### Generate a shareable download link
490
+
491
+ \`\`\`bash
492
+ # Default expiry (24 hours)
493
+ agent-fs signed-url docs/report.pdf
494
+
495
+ # Custom expiry (1 hour)
496
+ agent-fs signed-url docs/report.pdf --expires-in 3600
497
+
498
+ # JSON output (useful for agents)
499
+ agent-fs signed-url docs/report.pdf --json
500
+ # \u2192 { "url": "https://...", "path": "/docs/report.pdf", "expiresIn": 86400, "expiresAt": "2026-03-20T..." }
501
+ \`\`\`
502
+
503
+ The presigned URL requires no authentication \u2014 anyone with the link can download the file until it expires. Signed URLs serve the correct \`Content-Type\` header based on file extension (e.g., \`application/pdf\` for \`.pdf\`, \`image/png\` for \`.png\`), so browsers render them natively.
504
+
505
+ **MIME types on upload:** \`write\`, \`edit\`, \`append\`, and \`revert\` automatically detect and set the correct \`Content-Type\` on S3 objects based on file extension. The content type is also stored in the database and visible in \`stat\` output via the \`contentType\` field.
506
+
507
+ ### App URL in responses
508
+
509
+ When \`AGENT_FS_APP_URL\` is set (e.g., \`https://live.agent-fs.dev\`), file-related ops automatically include an \`appUrl\` field pointing to the file in the live web app:
510
+
511
+ \`\`\`bash
512
+ AGENT_FS_APP_URL=https://live.agent-fs.dev agent-fs stat docs/report.pdf --json
513
+ # \u2192 { ..., "appUrl": "https://live.agent-fs.dev/file/~/org-id/drive-id/docs/report.pdf" }
514
+ \`\`\`
515
+
516
+ This applies to any op that returns a \`path\` or \`to\` field (write, stat, edit, append, rm, cp, mv, signed-url, etc.).
517
+
430
518
  ### Validate your setup
431
519
 
432
520
  \`\`\`bash
433
521
  agent-fs config validate
434
522
  \`\`\`
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=`
523
+ `;function bE(){return new SR("docs").description("Show agent-fs documentation and command reference").action(()=>{let t=KE.replace(/^---[\s\S]*?---\n*/,"");console.log(t)})}var F=new zR;F.name("agent-fs").description("Agent-first filesystem backed by S3").version(B).option("--org <orgId>","Override org context").option("--drive <driveId>","Override drive context").option("--json","Output raw JSON");var Xt=new Ko;async function nn(){let t=F.opts().org;if(t)return t;let e=v();if(e.defaultOrg)return e.defaultOrg;try{let n=await Xt.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)}F.addCommand(bE());ME(F,Xt,nn);F.addCommand(XE(Xt));F.addCommand(HE());F.addCommand(GE());F.addCommand(ZE(Xt,nn));F.addCommand(BE(Xt));F.addCommand(QE());F.addCommand(xe());F.addCommand(VE(Xt,nn));F.addCommand(WE(Xt,nn));F.command("mcp").description("Start MCP server (stdio)").action(async()=>{await jE().then(() => cR)});F.command("server").description("Run server in foreground (dev mode)").action(async()=>{await pl().then(() => jR)});var qR=`
436
524
  Global Options:
437
525
  --org <orgId> Override org context
438
526
  --drive <driveId> Override drive context
439
527
  --json Output raw JSON
440
- `;for(let t of g.commands)t.addHelpText("after",Sy);g.parse();
528
+ `;for(let t of F.commands)t.addHelpText("after",qR);F.parse();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@desplega.ai/agent-fs",
3
- "version": "0.3.1",
3
+ "version": "0.5.1",
4
4
  "type": "module",
5
5
  "description": "Agent-first filesystem backed by S3",
6
6
  "license": "MIT",