@desplega.ai/agent-fs 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/dist/cli.js +137 -58
- package/package.json +2 -2
- package/dist/__tests__/api-client.test.d.ts +0 -2
- package/dist/__tests__/api-client.test.d.ts.map +0 -1
- package/dist/__tests__/api-client.test.js +0 -86
- package/dist/__tests__/api-client.test.js.map +0 -1
- package/dist/__tests__/param-mapping.test.d.ts +0 -2
- package/dist/__tests__/param-mapping.test.d.ts.map +0 -1
- package/dist/__tests__/param-mapping.test.js +0 -53
- package/dist/__tests__/param-mapping.test.js.map +0 -1
- package/dist/api-client.d.ts +0 -17
- package/dist/api-client.d.ts.map +0 -1
- package/dist/api-client.js +0 -63
- package/dist/api-client.js.map +0 -1
- package/dist/commands/auth.d.ts +0 -4
- package/dist/commands/auth.d.ts.map +0 -1
- package/dist/commands/auth.js +0 -81
- package/dist/commands/auth.js.map +0 -1
- package/dist/commands/comment.d.ts +0 -4
- package/dist/commands/comment.d.ts.map +0 -1
- package/dist/commands/comment.js +0 -165
- package/dist/commands/comment.js.map +0 -1
- package/dist/commands/config-cmd.d.ts +0 -3
- package/dist/commands/config-cmd.d.ts.map +0 -1
- package/dist/commands/config-cmd.js +0 -147
- package/dist/commands/config-cmd.js.map +0 -1
- package/dist/commands/daemon.d.ts +0 -3
- package/dist/commands/daemon.d.ts.map +0 -1
- package/dist/commands/daemon.js +0 -33
- package/dist/commands/daemon.js.map +0 -1
- package/dist/commands/docs.d.ts +0 -3
- package/dist/commands/docs.d.ts.map +0 -1
- package/dist/commands/docs.js +0 -13
- package/dist/commands/docs.js.map +0 -1
- package/dist/commands/drive.d.ts +0 -4
- package/dist/commands/drive.d.ts.map +0 -1
- package/dist/commands/drive.js +0 -171
- package/dist/commands/drive.js.map +0 -1
- package/dist/commands/init.d.ts +0 -3
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js +0 -20
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/onboard.d.ts +0 -3
- package/dist/commands/onboard.d.ts.map +0 -1
- package/dist/commands/onboard.js +0 -229
- package/dist/commands/onboard.js.map +0 -1
- package/dist/commands/ops.d.ts +0 -4
- package/dist/commands/ops.d.ts.map +0 -1
- package/dist/commands/ops.js +0 -100
- package/dist/commands/ops.js.map +0 -1
- package/dist/commands/org.d.ts +0 -4
- package/dist/commands/org.d.ts.map +0 -1
- package/dist/commands/org.js +0 -84
- package/dist/commands/org.js.map +0 -1
- package/dist/formatters.d.ts +0 -11
- package/dist/formatters.d.ts.map +0 -1
- package/dist/formatters.js +0 -257
- package/dist/formatters.js.map +0 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -83
- package/dist/index.js.map +0 -1
package/dist/cli.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
// @bun
|
|
3
|
-
var
|
|
4
|
-
Install with: brew install sqlite`)}var
|
|
3
|
+
var Nl=Object.create;var{getPrototypeOf:wl,defineProperty:nn,getOwnPropertyNames:pl}=Object;var _l=Object.prototype.hasOwnProperty;function Il(t){return this[t]}var Dl,Sl,K=(t,e,n)=>{var o=t!=null&&typeof t==="object";if(o){var i=e?Dl??=new WeakMap:Sl??=new WeakMap,r=i.get(t);if(r)return r}n=t!=null?Nl(wl(t)):{};let u=e||!t||!t.__esModule?nn(n,"default",{value:t,enumerable:!0}):n;for(let E of pl(t))if(!_l.call(u,E))nn(u,E,{get:Il.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 vl=(t)=>t;function Ll(t,e){this[t]=vl.bind(null,e)}var Xt=(t,e)=>{for(var n in e)nn(t,n,{get:e[n],enumerable:!0,configurable:!0,set:Ll.bind(e,n)})};var g=(t,e)=>()=>(t&&(e=t(t=0)),e);var de=import.meta.require;import{Database as Ol}from"bun:sqlite";import{platform as al}from"os";import{existsSync as hl}from"fs";function Ul(){if(ti)return;if(ti=!0,al()!=="darwin")return;let t=["/opt/homebrew/opt/sqlite/lib/libsqlite3.dylib","/usr/local/opt/sqlite3/lib/libsqlite3.dylib"];for(let e of t)if(hl(e)){try{Ol.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 ti=!1;var ei=g(()=>{Ul()});import{mkdirSync as ml,readFileSync as cl,writeFileSync as rn,existsSync as oi}from"fs";import{join as Te}from"path";function Pl(){let t=process.env.AGENT_FS_HOME??Te(process.env.HOME??"/tmp",".agent-fs");if(t.startsWith("~/"))return Te(process.env.HOME??"/tmp",t.slice(2));return t}function tt(){return Pl()}function et(){return Te(tt(),"config.json")}function _t(){return Te(tt(),"agent-fs.db")}function $l(){let t=tt();if(!oi(t))ml(t,{recursive:!0})}function Cl(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 ni(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(){$l();let t=et();if(!oi(t))return rn(t,JSON.stringify(on,null,2)),ni(structuredClone(on));let e=cl(t,"utf-8"),n=JSON.parse(e);return ni(Cl(on,n))}function ii(t,e){let n=v();n[t]=e,rn(et(),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,rn(et(),JSON.stringify(n,null,2))}var on;var kt=g(()=>{on={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={};Xt(f,{users:()=>jt,orgs:()=>zt,orgMembers:()=>Ml,files:()=>Fl,fileVersions:()=>Hl,events:()=>Gl,drives:()=>Re,driveMembers:()=>Xl,contentChunks:()=>Zl,comments:()=>Yl});import{sqliteTable as nt,text as A,integer as a,primaryKey as un}from"drizzle-orm/sqlite-core";var jt,zt,Ml,Re,Xl,Fl,Hl,Yl,Gl,Zl;var ri=g(()=>{jt=nt("users",{id:A("id").primaryKey(),email:A("email").notNull().unique(),apiKeyHash:A("api_key_hash").notNull(),createdAt:a("created_at",{mode:"timestamp"}).notNull()}),zt=nt("orgs",{id:A("id").primaryKey(),name:A("name").notNull(),isPersonal:a("is_personal",{mode:"boolean"}).notNull().default(!1),createdAt:a("created_at",{mode:"timestamp"}).notNull()}),Ml=nt("org_members",{orgId:A("org_id").notNull().references(()=>zt.id),userId:A("user_id").notNull().references(()=>jt.id),role:A("role",{enum:["viewer","editor","admin"]}).notNull()},(t)=>({pk:un({columns:[t.orgId,t.userId]})})),Re=nt("drives",{id:A("id").primaryKey(),orgId:A("org_id").notNull().references(()=>zt.id),name:A("name").notNull(),isDefault:a("is_default",{mode:"boolean"}).notNull().default(!1),createdAt:a("created_at",{mode:"timestamp"}).notNull()}),Xl=nt("drive_members",{driveId:A("drive_id").notNull().references(()=>Re.id),userId:A("user_id").notNull().references(()=>jt.id),role:A("role",{enum:["viewer","editor","admin"]}).notNull()},(t)=>({pk:un({columns:[t.driveId,t.userId]})})),Fl=nt("files",{path:A("path").notNull(),driveId:A("drive_id").notNull().references(()=>Re.id),size:a("size").notNull(),contentType:A("content_type"),author:A("author").notNull(),currentVersionId:A("current_version_id"),createdAt:a("created_at",{mode:"timestamp"}).notNull(),modifiedAt:a("modified_at",{mode:"timestamp"}).notNull(),isDeleted:a("is_deleted",{mode:"boolean"}).notNull().default(!1),embeddingStatus:A("embedding_status",{enum:["pending","indexed","failed"]}).default("pending")},(t)=>({pk:un({columns:[t.path,t.driveId]})})),Hl=nt("file_versions",{id:a("id").primaryKey({autoIncrement:!0}),path:A("path").notNull(),driveId:A("drive_id").notNull(),version:a("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:a("size"),etag:A("etag"),createdAt:a("created_at",{mode:"timestamp"}).notNull()}),Yl=nt("comments",{id:A("id").primaryKey(),parentId:A("parent_id"),orgId:A("org_id").notNull().references(()=>zt.id),driveId:A("drive_id").notNull().references(()=>Re.id),path:A("path").notNull(),lineStart:a("line_start"),lineEnd:a("line_end"),quotedContent:A("quoted_content"),fileVersionId:a("file_version_id"),body:A("body").notNull(),author:A("author").notNull().references(()=>jt.id),resolved:a("resolved",{mode:"boolean"}).notNull().default(!1),resolvedBy:A("resolved_by"),resolvedAt:a("resolved_at",{mode:"timestamp"}),createdAt:a("created_at",{mode:"timestamp"}).notNull(),updatedAt:a("updated_at",{mode:"timestamp"}).notNull(),isDeleted:a("is_deleted",{mode:"boolean"}).notNull().default(!1)}),Gl=nt("events",{id:A("id").primaryKey(),orgId:A("org_id").notNull().references(()=>zt.id),type:A("type").notNull(),resourceType:A("resource_type").notNull(),resourceId:A("resource_id").notNull(),actor:A("actor").notNull().references(()=>jt.id),target:A("target"),status:A("status",{enum:["created","ack","deleted"]}).notNull().default("created"),metadata:A("metadata"),createdAt:a("created_at",{mode:"timestamp"}).notNull()}),Zl=nt("content_chunks",{id:a("id").primaryKey({autoIncrement:!0}),filePath:A("file_path").notNull(),driveId:A("drive_id").notNull(),chunkIndex:a("chunk_index").notNull(),content:A("content").notNull(),charOffset:a("char_offset").notNull(),tokenCount:a("token_count").notNull()})});var ui=`
|
|
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
|
-
`,
|
|
119
|
+
`,fi=`
|
|
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,105 @@ 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 Bl}from"bun:sqlite";import{drizzle as Ql}from"drizzle-orm/bun-sqlite";import*as Ei from"sqlite-vec";import{existsSync as Vl,mkdirSync as Jl}from"fs";import{dirname as Wl}from"path";function Kl(t){Ei.load(t)}function st(t){let e=t??_t(),n=Wl(e);if(!Vl(n))Jl(n,{recursive:!0});let o=new Bl(e);return Kl(o),o.exec("PRAGMA journal_mode=WAL;"),o.exec("PRAGMA foreign_keys=ON;"),o.exec(ui),o.exec(fi),Ql(o,{schema:f})}var $=g(()=>{ei();kt();ri()});var fn=Q((jl)=>{var li=(t)=>encodeURIComponent(t).replace(/[!'()*]/g,bl),bl=(t)=>`%${t.charCodeAt(0).toString(16).toUpperCase()}`,kl=(t)=>t.split("/").map(li).join("/");jl.escapeUri=li;jl.escapeUriPath=kl});var si=Q((ts)=>{var En=fn();function xl(t){let e=[];for(let n of Object.keys(t).sort()){let o=t[n];if(n=En.escapeUri(n),Array.isArray(o))for(let i=0,r=o.length;i<r;i++)e.push(`${n}=${En.escapeUri(o[i])}`);else{let i=n;if(o||typeof o==="string")i+=`=${En.escapeUri(o)}`;e.push(i)}}return e.join("&")}ts.buildQueryString=xl});function gi(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?yi.buildQueryString(n):"";if(u&&u[0]!=="?")u=`?${u}`;let E="";if(t.username!=null||t.password!=null){let s=t.username??"",y=t.password??"";E=`${s}:${y}@`}let l="";if(t.fragment)l=`#${t.fragment}`;return`${o}//${E}${r}${i}${u}${l}`}var yi;var di=g(()=>{yi=K(si(),1)});var Ti=async(t)=>{let e=t?.Bucket||"";if(typeof t.Bucket==="string")t.Bucket=e.replace(/#/g,encodeURIComponent("#")).replace(/\?/g,encodeURIComponent("?"));if(us(e)){if(t.ForcePathStyle===!0)throw Error("Path-style addressing cannot be used with ARN buckets")}else if(!rs(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},ns,os,is,rs=(t)=>ns.test(t)&&!os.test(t)&&!is.test(t),us=(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 Ri=g(()=>{ns=/^[a-z0-9][a-z0-9\.\-]{1,61}[a-z0-9]$/,os=/(\d+\.){3}\d+/,is=/\.\./});var Ai=g(()=>{Ri()});var Ni=(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:s}=r;return`${u}//${E}${l?":"+l:""}${s}`}}return r};return i};var qt=Q((ss)=>{class Ft 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,Ft.prototype),n?.debug?.(`@smithy/property-provider ${o?"->":"(!)"} ${t}`)}static from(t,e=!0){return Object.assign(new this(t.message,e),t)}}class ln extends Ft{name="CredentialsProviderError";constructor(t,e=!0){super(t,e);Object.setPrototypeOf(this,ln.prototype)}}class sn extends Ft{name="TokenProviderError";constructor(t,e=!0){super(t,e);Object.setPrototypeOf(this,sn.prototype)}}var fs=(...t)=>async()=>{if(t.length===0)throw new Ft("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},Es=(t)=>()=>Promise.resolve(t),ls=(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}};ss.CredentialsProviderError=ln;ss.ProviderError=Ft;ss.TokenProviderError=sn;ss.chain=fs;ss.fromStatic=Es;ss.memoize=ls});function Ae(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 wi,pi=(t,e)=>async()=>{try{let n=t(process.env,e);if(n===void 0)throw Error();return n}catch(n){throw new wi.CredentialsProviderError(n.message||`Not found in ENV: ${Ae(t.toString())}`,{logger:e?.logger})}};var _i=g(()=>{wi=K(qt(),1)});import{homedir as Ns}from"os";import{sep as ws}from"path";var yn,ps=()=>{if(process&&process.geteuid)return`${process.geteuid()}`;return"DEFAULT"},Ht=()=>{let{HOME:t,USERPROFILE:e,HOMEPATH:n,HOMEDRIVE:o=`C:${ws}`}=process.env;if(t)return t;if(e)return e;if(n)return`${o}${n}`;let i=ps();if(!yn[i])yn[i]=Ns();return yn[i]};var xt=g(()=>{yn={}});var Ii=(t)=>t.profile||process.env.AWS_PROFILE||"default";var Di=()=>{};var ee=Q((Ls)=>{Ls.HttpAuthLocation=void 0;(function(t){t.HEADER="header",t.QUERY="query"})(Ls.HttpAuthLocation||(Ls.HttpAuthLocation={}));Ls.HttpApiKeyAuthLocation=void 0;(function(t){t.HEADER="header",t.QUERY="query"})(Ls.HttpApiKeyAuthLocation||(Ls.HttpApiKeyAuthLocation={}));Ls.EndpointURLScheme=void 0;(function(t){t.HTTP="http",t.HTTPS="https"})(Ls.EndpointURLScheme||(Ls.EndpointURLScheme={}));Ls.AlgorithmId=void 0;(function(t){t.MD5="md5",t.CRC32="crc32",t.CRC32C="crc32c",t.SHA1="sha1",t.SHA256="sha256"})(Ls.AlgorithmId||(Ls.AlgorithmId={}));var _s=(t)=>{let e=[];if(t.sha256!==void 0)e.push({algorithmId:()=>Ls.AlgorithmId.SHA256,checksumConstructor:()=>t.sha256});if(t.md5!=null)e.push({algorithmId:()=>Ls.AlgorithmId.MD5,checksumConstructor:()=>t.md5});return{addChecksumAlgorithm(n){e.push(n)},checksumAlgorithms(){return e}}},Is=(t)=>{let e={};return t.checksumAlgorithms().forEach((n)=>{e[n.algorithmId()]=n.checksumConstructor()}),e},Ds=(t)=>{return _s(t)},Ss=(t)=>{return Is(t)};Ls.FieldPosition=void 0;(function(t){t[t.HEADER=0]="HEADER",t[t.TRAILER=1]="TRAILER"})(Ls.FieldPosition||(Ls.FieldPosition={}));var vs="__smithy_context";Ls.IniSectionType=void 0;(function(t){t.PROFILE="profile",t.SSO_SESSION="sso-session",t.SERVICES="services"})(Ls.IniSectionType||(Ls.IniSectionType={}));Ls.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"})(Ls.RequestHandlerProtocol||(Ls.RequestHandlerProtocol={}));Ls.SMITHY_CONTEXT_KEY=vs;Ls.getDefaultClientConfiguration=Ds;Ls.resolveDefaultRuntimeConfig=Ss});var ot=".";var wn,Si=(t)=>Object.entries(t).filter(([e])=>{let n=e.indexOf(ot);if(n===-1)return!1;return Object.values(wn.IniSectionType).includes(e.substring(0,n))}).reduce((e,[n,o])=>{let i=n.indexOf(ot),r=n.substring(0,i)===wn.IniSectionType.PROFILE?n.substring(i+1):n;return e[r]=o,e},{...t.default&&{default:t.default}});var vi=g(()=>{wn=K(ee(),1)});import{join as Us}from"path";var ms="AWS_CONFIG_FILE",Li=()=>process.env[ms]||Us(Ht(),".aws","config");var Oi=g(()=>{xt()});import{join as cs}from"path";var Ps="AWS_SHARED_CREDENTIALS_FILE",ai=()=>process.env[Ps]||cs(Ht(),".aws","credentials");var hi=g(()=>{xt()});var Ui,$s,Cs,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=$s.exec(E);if(l){let[,s,,y]=l;if(Object.values(Ui.IniSectionType).includes(s))n=[s,y].join(ot)}else n=E;if(Cs.includes(E))throw Error(`Found invalid profile name "${E}"`)}else if(n){let E=r.indexOf("=");if(![0,-1].includes(E)){let[l,s]=[r.substring(0,E).trim(),r.substring(E+1).trim()];if(s==="")o=l;else{if(o&&i.trimStart()===i)o=void 0;e[n]=e[n]||{};let y=o?[o,l].join(ot):l;e[n][y]=s}}}}return e};var mi=g(()=>{Ui=K(ee(),1),$s=/^([\w-]+)\s(["'])?([\w-@\+\.%:/]+)\2$/,Cs=["__proto__","profile __proto__"]});import{readFile as Ms}from"fs/promises";var _n,ci,In=(t,e)=>{if(ci[t]!==void 0)return ci[t];if(!_n[t]||e?.ignoreCache)_n[t]=Ms(t,"utf8");return _n[t]};var Pi=g(()=>{_n={},ci={}});import{join as $i}from"path";var Ci=()=>({}),Mi=async(t={})=>{let{filepath:e=ai(),configFilepath:n=Li()}=t,o=Ht(),i="~/",r=e;if(e.startsWith("~/"))r=$i(o,e.slice(2));let u=n;if(n.startsWith("~/"))u=$i(o,n.slice(2));let E=await Promise.all([In(u,{ignoreCache:t.ignoreCache}).then(pn).then(Si).catch(Ci),In(r,{ignoreCache:t.ignoreCache}).then(pn).catch(Ci)]);return{configFile:E[0],credentialsFile:E[1]}};var Xi=g(()=>{vi();Oi();hi();xt();mi();Pi()});var Fi=()=>{};var Hi=()=>{};var Yi=()=>{};var Dn=g(()=>{xt();Di();Xi();Fi();Hi();Yi()});var Gi,Zi=(t,{preferredFile:e="config",...n}={})=>async()=>{let o=Ii(n),{configFile:i,credentialsFile:r}=await Mi(n),u=r[o]||{},E=i[o]||{},l=e==="config"?{...u,...E}:{...E,...u};try{let y=t(l,e==="config"?i:r);if(y===void 0)throw Error();return y}catch(s){throw new Gi.CredentialsProviderError(s.message||`Not found in config files w/ profile [${o}]: ${Ae(t.toString())}`,{logger:n.logger})}};var Bi=g(()=>{Dn();Gi=K(qt(),1)});var Qi,Xs=(t)=>typeof t==="function",Vi=(t)=>Xs(t)?async()=>await t():Qi.fromStatic(t);var Ji=g(()=>{Qi=K(qt(),1)});var Ne,Wi=({environmentVariableSelector:t,configFileSelector:e,default:n},o={})=>{let{signingName:i,logger:r}=o;return Ne.memoize(Ne.chain(pi(t,{signingName:i,logger:r}),Zi(e,o),Vi(n)))};var Ki=g(()=>{_i();Bi();Ji();Ne=K(qt(),1)});var bi=g(()=>{Ki()});var ki="AWS_ENDPOINT_URL",ji="endpoint_url",zi=(t)=>({environmentVariableSelector:(e)=>{let n=t.split(" ").map((r)=>r.toUpperCase()),o=e[[ki,...n].join("_")];if(o)return o;let i=e[ki];if(i)return i;return},configFileSelector:(e,n)=>{if(n&&e.services){let i=n[["services",e.services].join(ot)];if(i){let r=t.split(" ").map((E)=>E.toLowerCase()),u=i[[r.join("_"),ji].join(ot)];if(u)return u}}let o=e[ji];if(o)return o;return},default:void 0});var qi=g(()=>{Dn()});var xi=async(t)=>Wi(zi(t??""))();var tr=g(()=>{bi();qi()});var er=Q((Hs)=>{function Fs(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}Hs.parseQueryString=Fs});var or=Q((Zs)=>{var Gs=er(),nr=(t)=>{if(typeof t==="string")return nr(new URL(t));let{hostname:e,pathname:n,port:o,protocol:i,search:r}=t,u;if(r)u=Gs.parseQueryString(r);return{hostname:e,port:o?parseInt(o):void 0,protocol:i,path:n,query:u}};Zs.parseUrl=nr});var Sn,ir=(t)=>{if(typeof t==="object"){if("url"in t){let e=Sn.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 Sn.parseUrl(t)};var vn=g(()=>{Sn=K(or(),1)});var rr=async(t,e,n,o)=>{if(!n.isCustomEndpoint){let u;if(n.serviceConfiguredEndpoint)u=await n.serviceConfiguredEndpoint();else u=await xi(n.serviceId);if(u)n.endpoint=()=>Promise.resolve(ir(u)),n.isCustomEndpoint=!0}let i=await Qs(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},Qs=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 Ni(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 Ti(o);return o};var ur=g(()=>{Ai();tr();vn()});var fr=g(()=>{ur();vn()});var lr=Q((Ws)=>{var Er=ee(),Vs=(t)=>t[Er.SMITHY_CONTEXT_KEY]||(t[Er.SMITHY_CONTEXT_KEY]={}),Js=(t)=>{if(typeof t==="function")return t;let e=Promise.resolve(t);return()=>e};Ws.getSmithyContext=Vs;Ws.normalizeProvider=Js});var sr=()=>{};var Ln=Q((ty)=>{var ks=ee(),js=(t)=>{return{setHttpHandler(e){t.httpHandler=e},httpHandler(){return t.httpHandler},updateHttpClientConfig(e,n){t.httpHandler?.updateHttpClientConfig(e,n)},httpHandlerConfigs(){return t.httpHandler.httpHandlerConfigs()}}},zs=(t)=>{return{httpHandler:t.httpHandler()}};class yr{name;kind;values;constructor({name:t,kind:e=ks.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 gr{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 we{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 we({...t,headers:{...t.headers}});if(e.query)e.query=qs(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 we.clone(this)}}function qs(t){return Object.keys(t).reduce((e,n)=>{let o=t[n];return{...e,[n]:Array.isArray(o)?[...o]:o}},{})}class dr{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 xs(t){return/^[a-z0-9][a-z0-9\.\-]*[a-z0-9]$/.test(t)}ty.Field=yr;ty.Fields=gr;ty.HttpRequest=we;ty.HttpResponse=dr;ty.getHttpHandlerExtensionConfiguration=js;ty.isValidHostname=xs;ty.resolveHttpHandlerRuntimeConfig=zs});var Tr=()=>{};var Rr=()=>{};var Ar;var Nr=g(()=>{Ar={name:"serializerMiddleware",step:"serialize",tags:["SERIALIZER"],override:!0}});var wr=g(()=>{Tr();Nr();Rr()});var KA;var pr=g(()=>{wr();KA={step:"serialize",tags:["ENDPOINT_PARAMETERS","ENDPOINT_V2","ENDPOINT"],name:"endpointV2Middleware",override:!0,relation:"before",toMiddleware:Ar.name}});var _r=()=>{};var Ir=()=>{};var Dr=g(()=>{fr();sr();pr();_r();Ir()});var Sr=()=>{};var vr=()=>{};var Lr=()=>{};var Or=()=>{};var hr=Q((sy)=>{var ar={},On={};for(let t=0;t<256;t++){let e=t.toString(16).toLowerCase();if(e.length===1)e=`0${e}`;ar[t]=e,On[e]=t}function Ey(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 On)e[n/2]=On[o];else throw Error(`Cannot decode unrecognized sequence ${o} as hexadecimal`)}return e}function ly(t){let e="";for(let n=0;n<t.byteLength;n++)e+=ar[t[n]];return e}sy.fromHex=Ey;sy.toHex=ly});var an=Q((Ty)=>{var dy=(t)=>typeof ArrayBuffer==="function"&&t instanceof ArrayBuffer||Object.prototype.toString.call(t)==="[object ArrayBuffer]";Ty.isArrayBuffer=dy});var Ur=Q((py)=>{var Ay=an(),hn=de("buffer"),Ny=(t,e=0,n=t.byteLength-e)=>{if(!Ay.isArrayBuffer(t))throw TypeError(`The "input" argument must be ArrayBuffer. Received type ${typeof t} (${t})`);return hn.Buffer.from(t,e,n)},wy=(t,e)=>{if(typeof t!=="string")throw TypeError(`The "input" argument must be of type string. Received type ${typeof t} (${t})`);return e?hn.Buffer.from(t,e):hn.Buffer.from(t)};py.fromArrayBuffer=Ny;py.fromString=wy});var Pr=Q((vy)=>{var mr=Ur(),cr=(t)=>{let e=mr.fromString(t,"utf8");return new Uint8Array(e.buffer,e.byteOffset,e.byteLength/Uint8Array.BYTES_PER_ELEMENT)},Dy=(t)=>{if(typeof t==="string")return cr(t);if(ArrayBuffer.isView(t))return new Uint8Array(t.buffer,t.byteOffset,t.byteLength/Uint8Array.BYTES_PER_ELEMENT);return new Uint8Array(t)},Sy=(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 mr.fromArrayBuffer(t.buffer,t.byteOffset,t.byteLength).toString("utf8")};vy.fromUtf8=cr;vy.toUint8Array=Dy;vy.toUtf8=Sy});var Yn=Q((Hy)=>{var yt=hr(),It=Pr(),hy=an(),Xr=Ln(),$r=lr(),pe=fn(),Fr="X-Amz-Algorithm",Hr="X-Amz-Credential",cn="X-Amz-Date",Yr="X-Amz-SignedHeaders",Gr="X-Amz-Expires",Pn="X-Amz-Signature",$n="X-Amz-Security-Token",Uy="X-Amz-Region-Set",Cn="authorization",Mn=cn.toLowerCase(),Zr="date",Br=[Cn,Mn,Zr],Qr=Pn.toLowerCase(),ve="x-amz-content-sha256",Vr=$n.toLowerCase(),my="host",Jr={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},Wr=/^proxy-/,Kr=/^sec-/,cy=[/^proxy-/i,/^sec-/i],_e="AWS4-HMAC-SHA256",Py="AWS4-ECDSA-P256-SHA256",br="AWS4-HMAC-SHA256-PAYLOAD",kr="UNSIGNED-PAYLOAD",jr=50,Xn="aws4_request",zr=604800,Yt={},Ie=[],De=(t,e,n)=>`${t}/${e}/${n}/${Xn}`,qr=async(t,e,n,o,i)=>{let r=await Cr(t,e.secretAccessKey,e.accessKeyId),u=`${n}:${o}:${i}:${yt.toHex(r)}:${e.sessionToken}`;if(u in Yt)return Yt[u];Ie.push(u);while(Ie.length>jr)delete Yt[Ie.shift()];let E=`AWS4${e.secretAccessKey}`;for(let l of[n,o,i,Xn])E=await Cr(t,E,l);return Yt[u]=E},$y=()=>{Ie.length=0,Object.keys(Yt).forEach((t)=>{delete Yt[t]})},Cr=(t,e,n)=>{let o=new t(e);return o.update(It.toUint8Array(n)),o.digest()},Un=({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 Jr||e?.has(r)||Wr.test(r)||Kr.test(r)){if(!n||n&&!n.has(r))continue}o[r]=t[i].trim().replace(/\s+/g," ")}return o},Se=async({headers:t,body:e},n)=>{for(let o of Object.keys(t))if(o.toLowerCase()===ve)return t[o];if(e==null)return"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";else if(typeof e==="string"||ArrayBuffer.isView(e)||hy.isArrayBuffer(e)){let o=new n;return o.update(It.toUint8Array(e)),yt.toHex(await o.digest())}return kr};class xr{format(t){let e=[];for(let i of Object.keys(t)){let r=It.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=It.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 s=new Uint8Array(9);return s[0]=8,s.set(Fn.fromNumber(t.value.valueOf()).bytes,1),s;case"uuid":if(!Cy.test(t.value))throw Error(`Invalid UUID received: ${t.value}`);let y=new Uint8Array(17);return y[0]=9,y.set(yt.fromHex(t.value.replace(/\-/g,"")),1),y}}}var Cy=/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/;class Fn{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)Mr(e);return new Fn(e)}valueOf(){let t=this.bytes.slice(0),e=t[0]&128;if(e)Mr(t);return parseInt(yt.toHex(t),16)*(e?-1:1)}toString(){return String(this.valueOf())}}function Mr(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 tu=(t,e)=>{t=t.toLowerCase();for(let n of Object.keys(e))if(t===n.toLowerCase())return!0;return!1},eu=(t,e={})=>{let{headers:n,query:o={}}=Xr.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=Xr.HttpRequest.clone(t);for(let e of Object.keys(t.headers))if(Br.indexOf(e.toLowerCase())>-1)delete t.headers[e];return t},nu=({query:t={}})=>{let e=[],n={};for(let o of Object.keys(t)){if(o.toLowerCase()===Qr)continue;let i=pe.escapeUri(o);e.push(i);let r=t[o];if(typeof r==="string")n[i]=`${i}=${pe.escapeUri(r)}`;else if(Array.isArray(r))n[i]=r.slice(0).reduce((u,E)=>u.concat([`${i}=${pe.escapeUri(E)}`]),[]).sort().join("&")}return e.sort().map((o)=>n[o]).filter((o)=>o).join("&")},My=(t)=>Xy(t).toISOString().replace(/\.\d{3}Z$/,"Z"),Xy=(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 Hn{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=$r.normalizeProvider(n),this.credentialProvider=$r.normalizeProvider(e)}createCanonicalRequest(t,e,n){let o=Object.keys(e).sort();return`${t.method}
|
|
131
|
+
${this.getCanonicalPath(t)}
|
|
132
|
+
${nu(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(It.toUint8Array(n));let r=await i.digest();return`${o}
|
|
138
|
+
${t}
|
|
139
|
+
${e}
|
|
140
|
+
${yt.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 pe.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=My(t).replace(/[\-:]/g,"");return{longDate:e,shortDate:e.slice(0,8)}}getCanonicalHeaderList(t){return Object.keys(t).sort().join(";")}}class ou extends Hn{headerFormatter=new xr;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:s}=e,y=await this.credentialProvider();this.validateResolvedCredentials(y);let T=l??await this.regionProvider(),{longDate:R,shortDate:S}=this.formatDate(n);if(o>zr)return Promise.reject("Signature version 4 presigned URLs must have an expiration date less than one week in the future");let h=De(S,T,s??this.service),P=eu(mn(t),{unhoistableHeaders:r,hoistableHeaders:E});if(y.sessionToken)P.query[$n]=y.sessionToken;P.query[Fr]=_e,P.query[Hr]=`${y.accessKeyId}/${h}`,P.query[cn]=R,P.query[Gr]=o.toString(10);let C=Un(P,i,u);return P.query[Yr]=this.getCanonicalHeaderList(C),P.query[Pn]=await this.getSignature(R,h,this.getSigningKey(y,T,S,s),this.createCanonicalRequest(P,C,await Se(t,this.sha256))),P}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),s=De(E,u,r??this.service),y=await Se({headers:{},body:e},this.sha256),T=new this.sha256;T.update(t);let R=yt.toHex(await T.digest()),S=[br,l,s,o,R,y].join(`
|
|
141
|
+
`);return this.signString(S,{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(It.toUint8Array(t)),yt.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:s,shortDate:y}=this.formatDate(e),T=De(y,E,r??this.service);if(l.headers[Mn]=s,u.sessionToken)l.headers[Vr]=u.sessionToken;let R=await Se(l,this.sha256);if(!tu(ve,l.headers)&&this.applyChecksum)l.headers[ve]=R;let S=Un(l,o,n),h=await this.getSignature(s,T,this.getSigningKey(u,E,y,r),this.createCanonicalRequest(l,S,R));return l.headers[Cn]=`${_e} Credential=${u.accessKeyId}/${T}, SignedHeaders=${this.getCanonicalHeaderList(S)}, Signature=${h}`,l}async getSignature(t,e,n,o){let i=await this.createStringToSign(t,e,o,_e),r=new this.sha256(await n);return r.update(It.toUint8Array(i)),yt.toHex(await r.digest())}getSigningKey(t,e,n,o){return qr(this.sha256,t,n,e,o||this.service)}}var Fy={SignatureV4a:null};Hy.ALGORITHM_IDENTIFIER=_e;Hy.ALGORITHM_IDENTIFIER_V4A=Py;Hy.ALGORITHM_QUERY_PARAM=Fr;Hy.ALWAYS_UNSIGNABLE_HEADERS=Jr;Hy.AMZ_DATE_HEADER=Mn;Hy.AMZ_DATE_QUERY_PARAM=cn;Hy.AUTH_HEADER=Cn;Hy.CREDENTIAL_QUERY_PARAM=Hr;Hy.DATE_HEADER=Zr;Hy.EVENT_ALGORITHM_IDENTIFIER=br;Hy.EXPIRES_QUERY_PARAM=Gr;Hy.GENERATED_HEADERS=Br;Hy.HOST_HEADER=my;Hy.KEY_TYPE_IDENTIFIER=Xn;Hy.MAX_CACHE_SIZE=jr;Hy.MAX_PRESIGNED_TTL=zr;Hy.PROXY_HEADER_PATTERN=Wr;Hy.REGION_SET_PARAM=Uy;Hy.SEC_HEADER_PATTERN=Kr;Hy.SHA256_HEADER=ve;Hy.SIGNATURE_HEADER=Qr;Hy.SIGNATURE_QUERY_PARAM=Pn;Hy.SIGNED_HEADERS_QUERY_PARAM=Yr;Hy.SignatureV4=ou;Hy.SignatureV4Base=Hn;Hy.TOKEN_HEADER=Vr;Hy.TOKEN_QUERY_PARAM=$n;Hy.UNSIGNABLE_PATTERNS=cy;Hy.UNSIGNED_PAYLOAD=kr;Hy.clearCredentialCache=$y;Hy.createScope=De;Hy.getCanonicalHeaders=Un;Hy.getCanonicalQuery=nu;Hy.getPayloadHash=Se;Hy.getSigningKey=qr;Hy.hasHeader=tu;Hy.moveHeadersToQuery=eu;Hy.prepareRequest=mn;Hy.signatureV4aContainer=Fy});var Le="X-Amz-S3session-Token",Gn;var iu=g(()=>{Gn=Le.toLowerCase()});function ru(t){return{accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey,expiration:t.expiration}}function uu(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 fu,Oe;var Eu=g(()=>{iu();fu=K(Yn(),1);Oe=class Oe extends fu.SignatureV4{async signWithCredentials(t,e,n){let o=ru(e);t.headers[Gn]=e.sessionToken;let i=this;return uu(i,o),i.signRequest(t,n??{})}async presignWithCredentials(t,e,n){let o=ru(e);return delete t.headers[Gn],t.headers[Le]=e.sessionToken,t.query=t.query??{},t.query[Le]=e.sessionToken,uu(this,o),this.presign(t,n)}}});var lu=g(()=>{Eu()});var su=()=>{};var yu=()=>{};var gu=()=>{};var du=g(()=>{Sr();vr();Lr();Or();lu();su();yu();gu()});var ne;var Zn=g(()=>{ne={CrtSignerV4:null}});class Qn{sigv4aSigner;sigv4Signer;signerOptions;static sigv4aDependency(){if(typeof ne.CrtSignerV4==="function")return"crt";else if(typeof Bn.signatureV4aContainer.SignatureV4a==="function")return"js";return"none"}constructor(t){this.sigv4Signer=new Oe(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=ne.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=ne.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=ne.CrtSignerV4,e=Bn.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 Bn;var Tu=g(()=>{du();Zn();Bn=K(Yn(),1)});var Ru=g(()=>{Tu();Zn()});var Au="UNSIGNED-PAYLOAD",Nu="X-Amz-Content-Sha256";class ae{signer;constructor(t){let e={service:t.signingName||t.service||"s3",uriEscapePath:t.uriEscapePath||!1,applyChecksum:t.applyChecksum||!1,...t};this.signer=new Qn(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[Nu]=Au;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 Vn=g(()=>{Ru()});var wu,pu=async(t,e,n={})=>{let o,i;if(typeof t.config.endpointProvider==="function"){let R=(await rr(e.input,e.constructor,t.config)).properties?.authSchemes?.[0];if(R?.name==="sigv4a")i=R?.signingRegionSet?.join(",");else i=R?.signingRegion;o=new ae({...t.config,signingName:R?.signingName,region:async()=>i})}else o=new ae(t.config);let r=(T,R)=>async(S)=>{let{request:h}=S;if(!wu.HttpRequest.isInstance(h))throw Error("Request to be presigned is not an valid HTTP request.");delete h.headers["amz-sdk-invocation-id"],delete h.headers["amz-sdk-request"],delete h.headers["x-amz-user-agent"];let P,C={...n,signingRegion:n.signingRegion??R.signing_region??i,signingService:n.signingService??R.signing_service};if(R.s3ExpressIdentity)P=await o.presignWithCredentials(h,R.s3ExpressIdentity,C);else P=await o.presign(h,C);return{response:{},output:{$metadata:{httpStatusCode:200},presigned:P}}},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:s}=await l({input:e.input}),{presigned:y}=s;return gi(y)};var _u=g(()=>{di();Dr();Vn();wu=K(Ln(),1)});var Iu=g(()=>{_u();Vn()});import{S3Client as vg,PutObjectCommand as Lg,GetObjectCommand as Du,DeleteObjectCommand as Og,CopyObjectCommand as ag,ListObjectsV2Command as hg,HeadObjectCommand as Ug,ListObjectVersionsCommand as mg,GetBucketVersioningCommand as cg,PutBucketVersioningCommand as Pg}from"@aws-sdk/client-s3";class gt{client;bucket;versioningEnabled=!1;constructor(t){this.bucket=t.bucket,this.client=new vg({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 Lg({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 Du({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 Og({Bucket:this.bucket,Key:t}))}async copyObject(t,e){let n=await this.client.send(new ag({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 hg({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 Ug({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 mg({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 cg({Bucket:this.bucket}))).Status==="Enabled"}catch{return!1}}async enableVersioning(){try{return await this.client.send(new Pg({Bucket:this.bucket,VersioningConfiguration:{Status:"Enabled"}})),this.versioningEnabled=!0,!0}catch{return!1}}async getPresignedUrl(t,e=86400,n){let o=new Du({Bucket:this.bucket,Key:t,...n&&{ResponseContentType:n}});return pu(this.client,o,{expiresIn:e})}}var Su=g(()=>{Iu()});var vu=g(()=>{Su()});var it,O,b,rt,oe,k;var V=g(()=>{it=class it 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}}}};O=class O extends it{path;constructor(t,e){super("NOT_FOUND",t,e?.suggestion);this.path=e?.path}toJSON(){return{...super.toJSON(),...this.path&&{path:this.path}}}};b=class b extends it{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}}}};rt=class rt extends it{path;constructor(t,e){super("EDIT_CONFLICT",t,e?.suggestion);this.path=e?.path}toJSON(){return{...super.toJSON(),...this.path&&{path:this.path}}}};oe=class oe extends it{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}}}};k=class k extends it{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 Lu,and as $g}from"drizzle-orm";function ie(t){return Cg[t]??"admin"}function ut(t,e,n){return t.select().from(f.driveMembers).where($g(Lu(f.driveMembers.driveId,n),Lu(f.driveMembers.userId,e))).get()?.role??null}function re(t,e){let n=ut(t,e.userId,e.driveId);if(!n)throw new b("You do not have access to this drive",{requiredRole:e.requiredRole,yourRole:"none",suggestion:"Request access from the drive admin"});if(Ou[n]<Ou[e.requiredRole])throw new b(`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 Ou,Cg;var he=g(()=>{$();V();Ou={viewer:0,editor:1,admin:2},Cg={ls:"viewer",cat:"viewer",tail:"viewer",stat:"viewer",grep:"viewer",fts:"viewer",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 au(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 hu(t){return t.startsWith("/")?t.slice(1):t}import{eq as Gt,and as Jn,sql as Mg}from"drizzle-orm";function _(t,e,n){let o=hu(n);return`${t}/drives/${e}/${o}`}async function Wn(t,e){return(t.db.select({maxVersion:Mg`MAX(version)`}).from(f.fileVersions).where(Jn(Gt(f.fileVersions.path,e),Gt(f.fileVersions.driveId,t.driveId))).get()?.maxVersion??0)+1}async function Y(t,e){let n=await Wn(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(Jn(Gt(f.files.path,e.path),Gt(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(Jn(Gt(f.files.path,e.path),Gt(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(()=>{$()});function ft(t){let e=t.split(".").pop()?.toLowerCase()??"";return Xg[e]??"application/octet-stream"}var Xg;var Zt=g(()=>{Xg={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 Tt(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 Uu(t,e){Kn(t).prepare("DELETE FROM files_fts WHERE path = ? AND drive_id = ?").run(e.path,e.driveId)}function mu(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
|
-
`,
|
|
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
|
-
`,
|
|
143
|
-
|
|
144
|
-
`);if(
|
|
145
|
-
`),
|
|
146
|
-
`),totalLines:
|
|
147
|
-
`),
|
|
148
|
-
`),totalLines:
|
|
149
|
-
`);for(let
|
|
153
|
+
`,i=[e.pattern,e.driveId];return n.prepare(o).all(...i)}async function cu(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 Fg(t)}}function Fg(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 Rt,and as Ue}from"drizzle-orm";function Hg(t){return t.$client}class Pu{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 bn(t,e,n){let o=Hg(t);try{let i=await cu(n.content),r=t.select({id:f.contentChunks.id}).from(f.contentChunks).where(Ue(Rt(f.contentChunks.filePath,n.path),Rt(f.contentChunks.driveId,n.driveId))).all();for(let y of r)o.prepare("DELETE FROM chunk_vectors WHERE chunk_id = ?").run(y.id);t.delete(f.contentChunks).where(Ue(Rt(f.contentChunks.filePath,n.path),Rt(f.contentChunks.driveId,n.driveId))).run();let u=[];for(let y=0;y<i.length;y++){let T=t.insert(f.contentChunks).values({filePath:n.path,driveId:n.driveId,chunkIndex:y,content:i[y].content,charOffset:i[y].charOffset,tokenCount:i[y].tokenCount}).returning({id:f.contentChunks.id}).get();u.push(T.id)}let E=i.map((y)=>y.content),l=await e.embedBatch(E),s=o.prepare("INSERT INTO chunk_vectors(chunk_id, embedding) VALUES (?, ?)");for(let y=0;y<u.length;y++){let T=new Float32Array(l[y]);s.run(u[y],T)}t.update(f.files).set({embeddingStatus:"indexed"}).where(Ue(Rt(f.files.path,n.path),Rt(f.files.driveId,n.driveId))).run()}catch(i){throw t.update(f.files).set({embeddingStatus:"failed"}).where(Ue(Rt(f.files.path,n.path),Rt(f.files.driveId,n.driveId))).run(),i}}function Bt(t,e,n){if(!e)return;Yg.acquire().then(async(o)=>{try{await bn(t,e,n)}catch(i){console.error("Embedding failed",{path:n.path,error:i})}finally{o()}})}var Yg;var ue=g(()=>{$();Yg=new Pu(2)});async function $u(t,e){let n=_(t.orgId,t.driveId,e.path),o=e.content,i=Buffer.byteLength(o);if(i>Gg)throw new k(`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 s=await Wn(t,e.path)-1;if(s!==e.expectedVersion)throw new rt(`Expected version ${e.expectedVersion} but file is at version ${s}`,{path:e.path,suggestion:"Re-read the file to get the current version and retry"})}let r=ft(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 Tt(t.db,{path:e.path,driveId:t.driveId,content:o}),Bt(t.db,t.embeddingProvider??null,{path:e.path,driveId:t.driveId,content:o}),{version:E,path:e.path,size:i}}var Gg=10485760;var Cu=g(()=>{X();X();Zt();ue();V()});async function Mu(t,e){let n=_(t.orgId,t.driveId,e.path),o;try{o=(await t.s3.getObject(n)).body}catch(T){if(T?.name==="NoSuchKey"||T?.$metadata?.httpStatusCode===404)throw new O(`File not found: ${e.path}`,{path:e.path});throw T}let r=new TextDecoder().decode(o).split(`
|
|
156
|
+
`),u=r.length,E=e.offset??0,l=e.limit??Zg,s=r.slice(E,E+l),y=E+l<u;return{content:s.join(`
|
|
157
|
+
`),totalLines:u,truncated:y}}var Zg=200;var Xu=g(()=>{X();V()});async function Fu(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 O(`File not found: ${e.path}`,{path:e.path});throw R}let i=new TextDecoder().decode(o),r=i.split(e.old_string).length-1;if(r===0)throw new rt(`old_string not found in ${e.path}`,{path:e.path,suggestion:"Verify the exact text you want to replace"});if(r>1)throw new rt(`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=ft(e.path),s=await t.s3.putObject(n,u,void 0,l),y=JSON.stringify({old:e.old_string,new:e.new_string}),T=await Y(t,{path:e.path,s3VersionId:s.versionId??"",operation:"edit",message:e.message,diffSummary:y,size:E,etag:s.etag,contentType:l});return Tt(t.db,{path:e.path,driveId:t.driveId,content:u}),Bt(t.db,t.embeddingProvider??null,{path:e.path,driveId:t.driveId,content:u}),{version:T,path:e.path,changes:1}}var Hu=g(()=>{X();V();Zt();ue()});async function Yu(t,e){let n=_(t.orgId,t.driveId,e.path),o="";try{let s=await t.s3.getObject(n);o=new TextDecoder().decode(s.body)}catch(s){if(s?.name==="NoSuchKey"||s?.$metadata?.httpStatusCode===404)throw new O(`File not found: ${e.path}`,{path:e.path});throw s}let i=o+e.content,r=Buffer.byteLength(i),u=ft(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 Tt(t.db,{path:e.path,driveId:t.driveId,content:i}),Bt(t.db,t.embeddingProvider??null,{path:e.path,driveId:t.driveId,content:i}),{version:l,size:r}}var Gu=g(()=>{X();V();Zt();ue()});import{eq as Zu,and as Bg,like as Qg}from"drizzle-orm";async function Bu(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(Bg(Zu(f.files.driveId,t.driveId),Qg(f.files.path,n+"%"),Zu(f.files.isDeleted,!1))).all(),E=new Map(u.map((s)=>[s.path,s])),l=[];for(let s of r){let y=s.slice(o.length).replace(/\/$/,"");if(y)l.push({name:y,type:"directory",size:0})}for(let s of i){let y=s.key.slice(o.length);if(!y)continue;let T=y.endsWith("/"),R=T?y.slice(0,-1):y;if(T)l.push({name:R,type:"directory",size:0});else{let S=n+R,h=E.get(S);l.push({name:R,type:"file",size:h?.size??s.size,author:h?.author,modifiedAt:h?.modifiedAt??s.lastModified})}}return{entries:l}}var Qu=g(()=>{$();X()});import{eq as Vu,and as Vg}from"drizzle-orm";async function Ju(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 O(`File not found: ${e.path}`,{path:e.path});throw r}let i=t.db.select().from(f.files).where(Vg(Vu(f.files.path,e.path),Vu(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 Wu=g(()=>{$();X();V()});import{eq as Qt,and as kn}from"drizzle-orm";async function Ku(t,e){let n=_(t.orgId,t.driveId,e.path);await t.s3.deleteObject(n),await Y(t,{path:e.path,s3VersionId:"",operation:"delete"}),Uu(t.db,{path:e.path,driveId:t.driveId});let o=t.db.select({id:f.contentChunks.id}).from(f.contentChunks).where(kn(Qt(f.contentChunks.filePath,e.path),Qt(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(kn(Qt(f.contentChunks.filePath,e.path),Qt(f.contentChunks.driveId,t.driveId))).run()}return t.db.update(f.comments).set({isDeleted:!0,updatedAt:new Date}).where(kn(Qt(f.comments.path,e.path),Qt(f.comments.driveId,t.driveId))).run(),{path:e.path,deleted:!0}}var bu=g(()=>{$();X()});async function ku(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});return await t.s3.deleteObject(n),await Y(t,{path:e.from,s3VersionId:"",operation:"delete",message:`Moved to ${e.to}`}),{from:e.from,to:e.to,version:u}}var ju=g(()=>{X()});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:`Copied from ${e.from}`,size:r.size,etag:i.etag});return{from:e.from,to:e.to,version:u}}var qu=g(()=>{X()});async function xu(t,e){let n=_(t.orgId,t.driveId,e.path),o=e.lines??Jg,i;try{i=(await t.s3.getObject(n)).body}catch(T){if(T?.name==="NoSuchKey"||T?.$metadata?.httpStatusCode===404)throw new O(`File not found: ${e.path}`,{path:e.path});throw T}let u=new TextDecoder().decode(i).split(`
|
|
158
|
+
`),E=u.length,l=Math.max(0,E-o),s=u.slice(l),y=l>0;return{content:s.join(`
|
|
159
|
+
`),totalLines:E,truncated:y}}var Jg=20;var tf=g(()=>{X();V()});import{eq as ef,and as Wg,desc as Kg}from"drizzle-orm";async function nf(t,e){let n=e.limit??50;return{versions:t.db.select().from(f.fileVersions).where(Wg(ef(f.fileVersions.path,e.path),ef(f.fileVersions.driveId,t.driveId))).orderBy(Kg(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 of=g(()=>{$()});import{eq as Vt,and as rf}from"drizzle-orm";import{structuredPatch as bg}from"diff";async function uf(t,e){let n=t.db.select().from(f.fileVersions).where(rf(Vt(f.fileVersions.path,e.path),Vt(f.fileVersions.driveId,t.driveId),Vt(f.fileVersions.version,e.v1))).get(),o=t.db.select().from(f.fileVersions).where(rf(Vt(f.fileVersions.path,e.path),Vt(f.fileVersions.driveId,t.driveId),Vt(f.fileVersions.version,e.v2))).get();if(!n||!o)throw new O(`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),s=new TextDecoder().decode(E.body),y=bg(e.path,e.path,l,s),T=[];for(let R of y.hunks)for(let S of R.lines){let h=S.startsWith("+")?"add":S.startsWith("-")?"remove":"context";T.push({type:h,content:S.slice(1)})}return{changes:T}}catch{}}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 ff=g(()=>{$();X();V()});import{eq as jn,and as kg}from"drizzle-orm";async function Ef(t,e){let n=t.db.select().from(f.fileVersions).where(kg(jn(f.fileVersions.path,e.path),jn(f.fileVersions.driveId,t.driveId),jn(f.fileVersions.version,e.version))).get();if(!n)throw new O(`Version ${e.version} not found for ${e.path}`,{path:e.path});if(!n.s3VersionId)throw new it("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=ft(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 lf=g(()=>{$();X();V();Zt()});import{eq as zn,and as sf,desc as jg,gte as zg,like as qg}from"drizzle-orm";async function yf(t,e){let n=e.limit??50,o=t.db.select().from(f.fileVersions).where(zn(f.fileVersions.driveId,t.driveId)).$dynamic();if(e.path)o=o.where(sf(zn(f.fileVersions.driveId,t.driveId),qg(f.fileVersions.path,e.path+"%")));if(e.since)o=o.where(sf(zn(f.fileVersions.driveId,t.driveId),zg(f.fileVersions.createdAt,e.since)));return{entries:o.orderBy(jg(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 gf=g(()=>{$()});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 s=0;s<l.length;s++)if(n.test(l[s]))u.push({path:E.path,lineNumber:s+1,content:l[s]})}return{matches:u}}var Tf=()=>{};async function Rf(t,e){let o=mu(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 Af=()=>{};import{eq as qn,and as xg}from"drizzle-orm";async function Nf(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.0",private:!0,workspaces:["packages/*"],scripts:{typecheck:"tsc --build",test:"bun test packages/*/src/","test:coverage":"bun test --coverage packages/*/src/",build:"cd packages/cli && bun run build:npm"},devDependencies:{"bun-types":"^1.2.0",typescript:"^5.7.0",yaml:"^2.8.2","zod-to-json-schema":"^3.25.1"}}});var l;var dn=D(()=>{xi();l=ci.version});var si={};Ut(si,{LocalEmbeddingProvider:()=>ai});import{join as du}from"path";import{mkdirSync as ku,existsSync as fu}from"fs";class ai{name="local";dimensions=768;llama=null;model=null;embeddingContext=null;initPromise=null;async init(){if(this.embeddingContext)return;if(this.initPromise)return this.initPromise;return this.initPromise=this._doInit(),this.initPromise}async _doInit(){let{getLlama:t,resolveModelFile:n}=await import("node-llama-cpp");this.llama=await t();let o=du(m(),"models");if(!fu(o))ku(o,{recursive:!0});console.error("[agent-fs] Resolving local embedding model...");let i=await n(ju,o);console.error("[agent-fs] Model ready:",i),this.model=await this.llama.loadModel({modelPath:i}),this.embeddingContext=await this.model.createEmbeddingContext()}async embed(t){await this.init();let n=await this.embeddingContext.getEmbeddingFor(t);return Array.from(n.vector)}async embedBatch(t){await this.init();let n=[];for(let o of t){let i=await this.embeddingContext.getEmbeddingFor(o);n.push(Array.from(i.vector))}return n}async dispose(){if(this.embeddingContext)await this.embeddingContext.dispose(),this.embeddingContext=null;if(this.model)await this.model.dispose(),this.model=null;this.initPromise=null}}var ju="hf:nomic-ai/nomic-embed-text-v1.5-GGUF:Q8_0";var tT=D(()=>{Gt()});var kn={};Ut(kn,{OpenAIEmbeddingProvider:()=>nT});import zu from"openai";class nT{name="openai";dimensions=768;client;constructor(t){this.client=new zu({apiKey:t})}async embed(t){return(await this.client.embeddings.create({model:"text-embedding-3-small",input:t,dimensions:768})).data[0].embedding}async embedBatch(t){return(await this.client.embeddings.create({model:"text-embedding-3-small",input:t,dimensions:768})).data.sort((o,i)=>o.index-i.index).map((o)=>o.embedding)}}var fn=()=>{};var jn={};Ut(jn,{GeminiEmbeddingProvider:()=>oT});import{GoogleGenAI as bu}from"@google/genai";class oT{name="gemini";dimensions=768;client;constructor(t){this.client=new bu({apiKey:t})}async embed(t){return(await this.client.models.embedContent({model:"gemini-embedding-001",contents:t,config:{outputDimensionality:768}})).embeddings[0].values}async embedBatch(t){let n=[];for(let o of t){let i=await this.client.models.embedContent({model:"gemini-embedding-001",contents:o,config:{outputDimensionality:768}});n.push(i.embeddings[0].values)}return n}}var zn=()=>{};async function iT(t){switch(t.provider){case"local":{let{LocalEmbeddingProvider:n}=await Promise.resolve().then(() => (tT(),si));return new n}case"openai":{if(!t.apiKey)throw Error("OpenAI API key required. Set embedding.apiKey in config.");let{OpenAIEmbeddingProvider:n}=await Promise.resolve().then(() => (fn(),kn));return new n(t.apiKey)}case"gemini":{if(!t.apiKey)throw Error("Gemini API key required. Set embedding.apiKey in config.");let{GeminiEmbeddingProvider:n}=await Promise.resolve().then(() => (zn(),jn));return new n(t.apiKey)}default:throw Error(`Unknown embedding provider: ${t.provider}`)}}async function Bt(t){if(process.env.OPENAI_API_KEY)try{let{OpenAIEmbeddingProvider:n}=await Promise.resolve().then(() => (fn(),kn));return new n(process.env.OPENAI_API_KEY)}catch(n){console.error("[agent-fs] Failed to load OpenAI provider:",n)}if(process.env.GEMINI_API_KEY)try{let{GeminiEmbeddingProvider:n}=await Promise.resolve().then(() => (zn(),jn));return new n(process.env.GEMINI_API_KEY)}catch(n){console.error("[agent-fs] Failed to load Gemini provider:",n)}if(t?.provider&&t.provider!=="local"&&t.apiKey)try{return await iT(t)}catch(n){console.error("[agent-fs] Failed to create embedding provider from config:",n)}if(t?.provider==="local")try{return await iT(t)}catch(n){console.error("[agent-fs] Failed to load local embedding provider:",n)}return null}var ET,TT,uT=(t)=>typeof t==="string"?{...TT,name:t}:{...TT,...t};var tn=D(()=>{ET=Symbol("Let zodToJsonSchema decide on which parser to use"),TT={name:void 0,$refStrategy:"root",basePath:["#"],effectStrategy:"input",pipeStrategy:"all",dateStrategy:"format:date-time",mapStrategy:"entries",removeAdditionalStrategy:"passthrough",allowedAdditionalProperties:!0,rejectedAdditionalProperties:!1,definitionPath:"definitions",target:"jsonSchema7",strictUnions:!1,definitions:{},errorMessages:!1,markdownDescription:!1,patternStrategy:"escape",applyRegexFlags:!1,emailStrategy:"format:email",base64Strategy:"contentEncoding:base64",nameStrategy:"ref",openAiAnyTypeName:"OpenAiAnyType"}});var NT=(t)=>{let n=uT(t),o=n.name!==void 0?[...n.basePath,n.definitionPath,n.name]:n.basePath;return{...n,flags:{hasReferencedOpenAiAnyType:!1},currentPath:o,propertyPath:void 0,seen:new Map(Object.entries(n.definitions).map(([i,T])=>[T._def,{def:T._def,path:[...n.basePath,n.definitionPath,i],jsonSchema:void 0}]))}};var bn=D(()=>{tn()});function pn(t,n,o,i){if(!i?.errorMessages)return;if(o)t.errorMessage={...t.errorMessage,[n]:o}}function w(t,n,o,i,T){t[n]=o,pn(t,n,i,T)}var nn=(t,n)=>{let o=0;for(;o<t.length&&o<n.length;o++)if(t[o]!==n[o])break;return[(t.length-o).toString(),...n.slice(o)].join("/")};function Q(t){if(t.target!=="openAi")return{};let n=[...t.basePath,t.definitionPath,t.openAiAnyTypeName];return t.flags.hasReferencedOpenAiAnyType=!0,{$ref:t.$refStrategy==="relative"?nn(n,t.currentPath):n.join("/")}}var k=()=>{};import{ZodFirstPartyTypeKind as pu}from"zod/v3";function yT(t,n){let o={type:"array"};if(t.type?._def&&t.type?._def?.typeName!==pu.ZodAny)o.items=U(t.type._def,{...n,currentPath:[...n.currentPath,"items"]});if(t.minLength)w(o,"minItems",t.minLength.value,t.minLength.message,n);if(t.maxLength)w(o,"maxItems",t.maxLength.value,t.maxLength.message,n);if(t.exactLength)w(o,"minItems",t.exactLength.value,t.exactLength.message,n),w(o,"maxItems",t.exactLength.value,t.exactLength.message,n);return o}var hn=D(()=>{W()});function LT(t,n){let o={type:"integer",format:"int64"};if(!t.checks)return o;for(let i of t.checks)switch(i.kind){case"min":if(n.target==="jsonSchema7")if(i.inclusive)w(o,"minimum",i.value,i.message,n);else w(o,"exclusiveMinimum",i.value,i.message,n);else{if(!i.inclusive)o.exclusiveMinimum=!0;w(o,"minimum",i.value,i.message,n)}break;case"max":if(n.target==="jsonSchema7")if(i.inclusive)w(o,"maximum",i.value,i.message,n);else w(o,"exclusiveMaximum",i.value,i.message,n);else{if(!i.inclusive)o.exclusiveMaximum=!0;w(o,"maximum",i.value,i.message,n)}break;case"multipleOf":w(o,"multipleOf",i.value,i.message,n);break}return o}var rn=()=>{};function RT(){return{type:"boolean"}}function on(t,n){return U(t.type._def,n)}var Tn=D(()=>{W()});var IT=(t,n)=>{return U(t.innerType._def,n)};var mn=D(()=>{W()});function xn(t,n,o){let i=o??n.dateStrategy;if(Array.isArray(i))return{anyOf:i.map((T,E)=>xn(t,n,T))};switch(i){case"string":case"format:date-time":return{type:"string",format:"date-time"};case"format:date":return{type:"string",format:"date"};case"integer":return hu(t,n)}}var hu=(t,n)=>{let o={type:"integer",format:"unix-time"};if(n.target==="openApi3")return o;for(let i of t.checks)switch(i.kind){case"min":w(o,"minimum",i.value,i.message,n);break;case"max":w(o,"maximum",i.value,i.message,n);break}return o};var cn=()=>{};function DT(t,n){return{...U(t.innerType._def,n),default:t.defaultValue()}}var an=D(()=>{W()});function OT(t,n){return n.effectStrategy==="input"?U(t.schema._def,n):Q(n)}var sn=D(()=>{W();k()});function _T(t){return{type:"string",enum:Array.from(t.values)}}function AT(t,n){let o=[U(t.left._def,{...n,currentPath:[...n.currentPath,"allOf","0"]}),U(t.right._def,{...n,currentPath:[...n.currentPath,"allOf","1"]})].filter((E)=>!!E),i=n.target==="jsonSchema2019-09"?{unevaluatedProperties:!1}:void 0,T=[];return o.forEach((E)=>{if(ru(E)){if(T.push(...E.allOf),E.unevaluatedProperties===void 0)i=void 0}else{let N=E;if("additionalProperties"in E&&E.additionalProperties===!1){let{additionalProperties:L,...y}=E;N=y}else i=void 0;T.push(N)}}),T.length?{allOf:T,...i}:void 0}var ru=(t)=>{if("type"in t&&t.type==="string")return!1;return"allOf"in t};var to=D(()=>{W()});function UT(t,n){let o=typeof t.value;if(o!=="bigint"&&o!=="number"&&o!=="boolean"&&o!=="string")return{type:Array.isArray(t.value)?"array":"object"};if(n.target==="openApi3")return{type:o==="bigint"?"integer":o,enum:[t.value]};return{type:o==="bigint"?"integer":o,const:t.value}}function En(t,n){let o={type:"string"};if(t.checks)for(let i of t.checks)switch(i.kind){case"min":w(o,"minLength",typeof o.minLength==="number"?Math.max(o.minLength,i.value):i.value,i.message,n);break;case"max":w(o,"maxLength",typeof o.maxLength==="number"?Math.min(o.maxLength,i.value):i.value,i.message,n);break;case"email":switch(n.emailStrategy){case"format:email":r(o,"email",i.message,n);break;case"format:idn-email":r(o,"idn-email",i.message,n);break;case"pattern:zod":e(o,h.email,i.message,n);break}break;case"url":r(o,"uri",i.message,n);break;case"uuid":r(o,"uuid",i.message,n);break;case"regex":e(o,i.regex,i.message,n);break;case"cuid":e(o,h.cuid,i.message,n);break;case"cuid2":e(o,h.cuid2,i.message,n);break;case"startsWith":e(o,RegExp(`^${oo(i.value,n)}`),i.message,n);break;case"endsWith":e(o,RegExp(`${oo(i.value,n)}$`),i.message,n);break;case"datetime":r(o,"date-time",i.message,n);break;case"date":r(o,"date",i.message,n);break;case"time":r(o,"time",i.message,n);break;case"duration":r(o,"duration",i.message,n);break;case"length":w(o,"minLength",typeof o.minLength==="number"?Math.max(o.minLength,i.value):i.value,i.message,n),w(o,"maxLength",typeof o.maxLength==="number"?Math.min(o.maxLength,i.value):i.value,i.message,n);break;case"includes":{e(o,RegExp(oo(i.value,n)),i.message,n);break}case"ip":{if(i.version!=="v6")r(o,"ipv4",i.message,n);if(i.version!=="v4")r(o,"ipv6",i.message,n);break}case"base64url":e(o,h.base64url,i.message,n);break;case"jwt":e(o,h.jwt,i.message,n);break;case"cidr":{if(i.version!=="v6")e(o,h.ipv4Cidr,i.message,n);if(i.version!=="v4")e(o,h.ipv6Cidr,i.message,n);break}case"emoji":e(o,h.emoji(),i.message,n);break;case"ulid":{e(o,h.ulid,i.message,n);break}case"base64":{switch(n.base64Strategy){case"format:binary":{r(o,"binary",i.message,n);break}case"contentEncoding:base64":{w(o,"contentEncoding","base64",i.message,n);break}case"pattern:zod":{e(o,h.base64,i.message,n);break}}break}case"nanoid":e(o,h.nanoid,i.message,n);case"toLowerCase":case"toUpperCase":case"trim":break;default:((T)=>{})(i)}return o}function oo(t,n){return n.patternStrategy==="escape"?xu(t):t}function xu(t){let n="";for(let o=0;o<t.length;o++){if(!mu.has(t[o]))n+="\\";n+=t[o]}return n}function r(t,n,o,i){if(t.format||t.anyOf?.some((T)=>T.format)){if(!t.anyOf)t.anyOf=[];if(t.format){if(t.anyOf.push({format:t.format,...t.errorMessage&&i.errorMessages&&{errorMessage:{format:t.errorMessage.format}}}),delete t.format,t.errorMessage){if(delete t.errorMessage.format,Object.keys(t.errorMessage).length===0)delete t.errorMessage}}t.anyOf.push({format:n,...o&&i.errorMessages&&{errorMessage:{format:o}}})}else w(t,"format",n,o,i)}function e(t,n,o,i){if(t.pattern||t.allOf?.some((T)=>T.pattern)){if(!t.allOf)t.allOf=[];if(t.pattern){if(t.allOf.push({pattern:t.pattern,...t.errorMessage&&i.errorMessages&&{errorMessage:{pattern:t.errorMessage.pattern}}}),delete t.pattern,t.errorMessage){if(delete t.errorMessage.pattern,Object.keys(t.errorMessage).length===0)delete t.errorMessage}}t.allOf.push({pattern:ST(n,i),...o&&i.errorMessages&&{errorMessage:{pattern:o}}})}else w(t,"pattern",ST(n,i),o,i)}function ST(t,n){if(!n.applyRegexFlags||!t.flags)return t.source;let o={i:t.flags.includes("i"),m:t.flags.includes("m"),s:t.flags.includes("s")},i=o.i?t.source.toLowerCase():t.source,T="",E=!1,N=!1,L=!1;for(let y=0;y<i.length;y++){if(E){T+=i[y],E=!1;continue}if(o.i){if(N){if(i[y].match(/[a-z]/)){if(L)T+=i[y],T+=`${i[y-2]}-${i[y]}`.toUpperCase(),L=!1;else if(i[y+1]==="-"&&i[y+2]?.match(/[a-z]/))T+=i[y],L=!0;else T+=`${i[y]}${i[y].toUpperCase()}`;continue}}else if(i[y].match(/[a-z]/)){T+=`[${i[y]}${i[y].toUpperCase()}]`;continue}}if(o.m){if(i[y]==="^"){T+=`(^|(?<=[\r
|
|
154
|
-
]))`;continue}else if(
|
|
155
|
-
]))`;continue}}if(
|
|
156
|
-
`:`[${
|
|
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: ${
|
|
160
|
-
`)}function
|
|
161
|
-
`);if(
|
|
162
|
-
`)}function
|
|
163
|
-
`)}function
|
|
164
|
+
LIMIT ?`).all(r,o*2);if(E.length===0)return{results:[]};let l=[],s=new Set;for(let y of E){let T=t.db.select().from(f.contentChunks).where(qn(f.contentChunks.id,y.chunk_id)).get();if(!T)continue;if(T.driveId!==t.driveId)continue;if(s.has(T.filePath))continue;s.add(T.filePath);let R=t.db.select().from(f.files).where(xg(qn(f.files.path,T.filePath),qn(f.files.driveId,t.driveId))).get();if(l.push({path:T.filePath,score:1/(1+y.distance),snippet:T.content.slice(0,200),author:R?.author,modifiedAt:R?.modifiedAt}),l.length>=o)break}return{results:l}}var wf=g(()=>{$()});import{eq as me,and as td,or as ed,isNull as nd}from"drizzle-orm";async function pf(t,e){let n=[me(f.files.driveId,t.driveId),me(f.files.isDeleted,!1),ed(me(f.files.embeddingStatus,"failed"),nd(f.files.embeddingStatus),me(f.files.embeddingStatus,"pending"))];if(e.path){let{like:E}=await import("drizzle-orm"),l=e.path.endsWith("/")?e.path:e.path+"/";n.push(E(f.files.path,l+"%"))}let o=t.db.select({path:f.files.path}).from(f.files).where(td(...n)).all(),i=0,r=0,u=0;for(let E of o){let l=_(t.orgId,t.driveId,E.path);try{let s=await t.s3.getObject(l),y=new TextDecoder().decode(s.body);if(Tt(t.db,{path:E.path,driveId:t.driveId,content:y}),t.embeddingProvider)await bn(t.db,t.embeddingProvider,{path:E.path,driveId:t.driveId,content:y});else{u++;continue}i++}catch(s){console.error(`Reindex failed for ${E.path}:`,s),r++}}return{reindexed:i,failed:r,skipped:u}}var _f=g(()=>{$();X();ue()});import{eq as If,and as od,like as id}from"drizzle-orm";async function Df(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(od(If(f.files.driveId,t.driveId),id(f.files.path,n+"%"),If(f.files.isDeleted,!1))).all(),u=new Map(r.map((l)=>[l.path,l])),E=[];for(let l of i){let s=l.key.slice(o.length);if(!s)continue;let y=s.split("/").filter(Boolean);if(y.length===0)continue;if(e.depth!==void 0&&y.length>e.depth)continue;let T=E;for(let R=0;R<y.length;R++){let S=y[R],h=R===y.length-1,P=!h||s.endsWith("/");if(P&&!h){let C=T.find((H)=>H.name===S&&H.type==="directory");if(!C)C={name:S,type:"directory",children:[]},T.push(C);if(!C.children)C.children=[];T=C.children}else if(P&&h){let C=T.find((H)=>H.name===S&&H.type==="directory");if(!C)C={name:S,type:"directory",children:[]},T.push(C)}else{let C=n+y.slice(0,R+1).join("/"),H=u.get(C),en={name:S,type:"file",size:H?.size??l.size};if(H?.author)en.author=H.author;if(H?.modifiedAt??l.lastModified)en.modifiedAt=H?.modifiedAt??l.lastModified;T.push(en)}}}return{tree:E}}var Sf=g(()=>{$();X()});import{eq as vf,and as rd,like as ud}from"drizzle-orm";function fd(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 Lf(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(rd(vf(f.files.driveId,t.driveId),ud(f.files.path,n+"%"),vf(f.files.isDeleted,!1))).all(),u=new Map(r.map((s)=>[s.path,s])),E=fd(e.pattern),l=[];for(let s of i){let y=s.key.slice(o.length);if(!y||y.endsWith("/"))continue;if(E.test(y)){let T=n+y,R=u.get(T);l.push({path:T,size:R?.size??s.size,modifiedAt:R?.modifiedAt??s.lastModified})}}return{matches:l}}var Of=g(()=>{$();X()});async function af(t,e){let n=au(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 O(`File not found: ${n}`,{path:n});throw E}let r=ft(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 hf=g(()=>{X();V();Zt()});function xn(t,e,n,o){let i=o.startsWith("/")?o.slice(1):o;return`${t}/file/~/${e}/${n}/${i}`}import{eq as L,and as Et,sql as to,desc as Uf}from"drizzle-orm";function eo(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 Pe(t,e){let n=new Date,o=crypto.randomUUID(),i=e.path;if(e.parentId){let u=t.db.select().from(f.comments).where(Et(L(f.comments.id,e.parentId),L(f.comments.isDeleted,!1))).get();if(!u)throw new O("Parent comment not found",{suggestion:"Check that the parent comment ID is correct and not deleted"});if(u.parentId)throw new k("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 k("path is required for root comments",{field:"path"});let r=t.db.select({id:f.fileVersions.id}).from(f.fileVersions).where(Et(L(f.fileVersions.path,i),L(f.fileVersions.driveId,t.driveId))).orderBy(Uf(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(),eo(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 $e(t,e){let n=[L(f.comments.driveId,t.driveId),L(f.comments.isDeleted,!1)];if(e.path)n.push(L(f.comments.path,e.path));if(e.parentId)n.push(L(f.comments.parentId,e.parentId));else if(e.parentId===void 0&&!e.resolved)n.push(to`${f.comments.parentId} IS NULL`),n.push(L(f.comments.resolved,!1));else if(e.parentId===void 0&&e.resolved)n.push(to`${f.comments.parentId} IS NULL`);if(e.orgId)n.push(L(f.comments.orgId,e.orgId));let o=e.limit??50,i=e.offset??0;return{comments:t.db.select().from(f.comments).where(Et(...n)).orderBy(Uf(f.comments.createdAt)).limit(o).offset(i).all().map((E)=>{let s=t.db.select().from(f.comments).where(Et(L(f.comments.parentId,E.id),L(f.comments.isDeleted,!1))).orderBy(f.comments.createdAt).all().map((y)=>ce({...y,replyCount:0}));return{...ce({...E,replyCount:s.length}),replies:s}})}}async function Ce(t,e){let n=t.db.select().from(f.comments).where(Et(L(f.comments.id,e.id),L(f.comments.isDeleted,!1))).get();if(!n)throw new O("Comment not found",{suggestion:"Check that the comment ID is correct"});let o=t.db.select({count:to`count(*)`}).from(f.comments).where(Et(L(f.comments.parentId,n.id),L(f.comments.isDeleted,!1))).get(),i=ce({...n,replyCount:o?.count??0}),u=t.db.select().from(f.comments).where(Et(L(f.comments.parentId,e.id),L(f.comments.isDeleted,!1))).orderBy(f.comments.createdAt).all().map((E)=>ce({...E,replyCount:0}));return{comment:i,replies:u}}async function Me(t,e){let n=t.db.select().from(f.comments).where(Et(L(f.comments.id,e.id),L(f.comments.isDeleted,!1))).get();if(!n)throw new O("Comment not found",{suggestion:"Check that the comment ID is correct"});if(n.author!==t.userId)throw new b("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(L(f.comments.id,e.id)).run(),{id:e.id,body:e.body,updatedAt:o}}async function Xe(t,e){let n=t.db.select().from(f.comments).where(Et(L(f.comments.id,e.id),L(f.comments.isDeleted,!1))).get();if(!n)throw new O("Comment not found",{suggestion:"Check that the comment ID is correct"});if(n.author!==t.userId)throw new b("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(L(f.comments.id,e.id)).run(),!n.parentId)t.db.update(f.comments).set({isDeleted:!0,updatedAt:o}).where(L(f.comments.parentId,e.id)).run();return eo(t,{type:"comment_deleted",resourceType:"comment",resourceId:e.id}),{deleted:!0}}async function Fe(t,e){let n=t.db.select().from(f.comments).where(Et(L(f.comments.id,e.id),L(f.comments.isDeleted,!1))).get();if(!n)throw new O("Comment not found",{suggestion:"Check that the comment ID is correct"});if(n.parentId)throw new k("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(L(f.comments.id,e.id)).run(),eo(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(()=>{$();V()});import{z as d}from"zod";async function At(t,e,n,o){let i=no[e];if(!i)throw Error(`Unknown operation: ${e}`);if(!o?.skipAuth){let E=ie(e);re(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=xn(t.appUrl,t.orgId,t.driveId,u.path);else if("to"in u)u.appUrl=xn(t.appUrl,t.orgId,t.driveId,u.to)}return u}function Jt(){return Object.keys(no)}function Nt(t){return no[t]}var no;var oo=g(()=>{he();Cu();Xu();Hu();Gu();Qu();Wu();bu();ju();qu();tf();of();ff();lf();gf();Tf();Af();wf();_f();Sf();Of();hf();mf();no={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:$u,schema:d.object({path:d.string(),content:d.string(),message:d.string().optional(),expectedVersion:d.number().int().optional()})},cat:{description:"Read file content with optional pagination via offset/limit. Returns { content, totalLines, truncated }.",handler:Mu,schema:d.object({path:d.string(),offset:d.number().int().min(0).optional(),limit:d.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:Fu,schema:d.object({path:d.string(),old_string:d.string(),new_string:d.string(),message:d.string().optional()})},append:{description:"Append content to the end of an existing file. Creates a new version. Returns { version, size }.",handler:Yu,schema:d.object({path:d.string(),content:d.string(),message:d.string().optional()})},ls:{description:"List immediate children of a directory. Returns { entries } where each entry has name, type (file/directory), size, author, modifiedAt.",handler:Bu,schema:d.object({path:d.string().optional()})},stat:{description:"Get file metadata without reading content. Returns path, size, contentType, author, currentVersion, createdAt, modifiedAt, isDeleted, embeddingStatus.",handler:Ju,schema:d.object({path:d.string()})},rm:{description:"Delete a file. Removes from S3, cleans up FTS5 index and vector embeddings. Returns { path, deleted }.",handler:Ku,schema:d.object({path:d.string()})},mv:{description:"Move or rename a file. Preserves version history at the new path. Returns { from, to, version }.",handler:ku,schema:d.object({from:d.string(),to:d.string(),message:d.string().optional()})},cp:{description:"Copy a file using server-side S3 copy. Creates a new version at the destination. Returns { from, to, version }.",handler:zu,schema:d.object({from:d.string(),to:d.string()})},tail:{description:"Read the last N lines of a file (default 20). Returns { content, totalLines, truncated }.",handler:xu,schema:d.object({path:d.string(),lines:d.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:nf,schema:d.object({path:d.string(),limit:d.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:uf,schema:d.object({path:d.string(),v1:d.number().int(),v2:d.number().int()})},revert:{description:"Revert a file to a previous version. Creates a new version with the old content. Returns { version, revertedTo }.",handler:Ef,schema:d.object({path:d.string(),version:d.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:yf,schema:d.object({path:d.string().optional(),since:d.coerce.date().optional(),limit:d.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:d.object({pattern:d.string(),path:d.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:Rf,schema:d.object({pattern:d.string(),path:d.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:Nf,schema:d.object({query:d.string(),limit:d.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:pf,schema:d.object({path:d.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:Df,schema:d.object({path:d.string().optional(),depth:d.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:Lf,schema:d.object({pattern:d.string(),path:d.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:d.object({path:d.string(),expiresIn:d.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:Pe,schema:d.object({path:d.string().optional(),body:d.string(),parentId:d.string().optional(),lineStart:d.number().int().optional(),lineEnd:d.number().int().optional(),quotedContent:d.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:$e,schema:d.object({path:d.string().optional(),parentId:d.string().optional(),resolved:d.boolean().optional(),orgId:d.string().optional(),limit:d.number().int().min(1).optional(),offset:d.number().int().min(0).optional()})},"comment-get":{description:"Get a single comment by ID with all its replies. Returns { comment, replies }.",handler:Ce,schema:d.object({id:d.string()})},"comment-update":{description:"Update a comment's body. Only the original author can update. Returns { id, body, updatedAt }.",handler:Me,schema:d.object({id:d.string(),body:d.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:Xe,schema:d.object({id:d.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:Fe,schema:d.object({id:d.string(),resolved:d.boolean()})}}});import{eq as J,and as He}from"drizzle-orm";function Dt(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 St(t,e){return t.select().from(f.drives).where(J(f.drives.orgId,e)).all().map((n)=>({id:n.id,name:n.name,isDefault:n.isDefault}))}function io(t,e){let n=t.select().from(f.drives).where(J(f.drives.id,e)).get();if(!n)return null;return{id:n.id,name:n.name,orgId:n.orgId,isDefault:n.isDefault}}function vt(t,e){return t.select({userId:f.driveMembers.userId,email:f.users.email,role:f.driveMembers.role}).from(f.driveMembers).innerJoin(f.users,J(f.driveMembers.userId,f.users.id)).where(J(f.driveMembers.driveId,e)).all()}function Lt(t,e){if(!t.select({role:f.driveMembers.role}).from(f.driveMembers).where(He(J(f.driveMembers.driveId,e.driveId),J(f.driveMembers.userId,e.userId))).get())throw Error("Member not found in drive");t.update(f.driveMembers).set({role:e.role}).where(He(J(f.driveMembers.driveId,e.driveId),J(f.driveMembers.userId,e.userId))).run()}function Ot(t,e){if(!t.select({role:f.driveMembers.role}).from(f.driveMembers).where(He(J(f.driveMembers.driveId,e.driveId),J(f.driveMembers.userId,e.userId))).get())throw Error("Member not found in drive");t.delete(f.driveMembers).where(He(J(f.driveMembers.driveId,e.driveId),J(f.driveMembers.userId,e.userId))).run()}function ro(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 uo=g(()=>{$()});import{eq as m,and as at,sql as cf}from"drizzle-orm";function ht(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=Dt(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,m(f.orgMembers.orgId,f.orgs.id)).where(m(f.orgMembers.userId,e)).all().map((o)=>({id:o.orgId,name:o.name,role:o.role,isPersonal:o.isPersonal}))}function fe(t,e){let n=t.select().from(f.orgs).where(m(f.orgs.id,e)).get();if(!n)return null;return{id:n.id,name:n.name,isPersonal:n.isPersonal}}function Ut(t,e){return t.select({userId:f.orgMembers.userId,email:f.users.email,role:f.orgMembers.role}).from(f.orgMembers).innerJoin(f.users,m(f.orgMembers.userId,f.users.id)).where(m(f.orgMembers.orgId,e)).all()}function mt(t,e){let n=t.select({role:f.orgMembers.role}).from(f.orgMembers).where(at(m(f.orgMembers.orgId,e.orgId),m(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(at(m(f.orgMembers.orgId,e.orgId),m(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(at(m(f.orgMembers.orgId,e.orgId),m(f.orgMembers.userId,e.userId))).run()}function ct(t,e){if(t.select({isPersonal:f.orgs.isPersonal}).from(f.orgs).where(m(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(at(m(f.orgMembers.orgId,e.orgId),m(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(at(m(f.orgMembers.orgId,e.orgId),m(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(m(f.drives.orgId,e.orgId)).all();for(let r of i)t.delete(f.driveMembers).where(at(m(f.driveMembers.driveId,r.id),m(f.driveMembers.userId,e.userId))).run();t.delete(f.orgMembers).where(at(m(f.orgMembers.orgId,e.orgId),m(f.orgMembers.userId,e.userId))).run()}function Pt(t,e){let n=t.select().from(f.users).where(m(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(m(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 fo=g(()=>{$();uo()});import{eq as Pf}from"drizzle-orm";function $f(t){let e=new Bun.CryptoHasher("sha256");return e.update(t),e.digest("hex")}function Ed(){let t=new Uint8Array(32);return crypto.getRandomValues(t),`af_${Array.from(t,(n)=>n.toString(16).padStart(2,"0")).join("")}`}function ld(){return crypto.randomUUID()}function j(t,e){let n=ld(),o=Ed(),i=$f(o),r=new Date;return t.insert(f.users).values({id:n,email:e.email,apiKeyHash:i,createdAt:r}).run(),ht(t,{name:e.email.split("@")[0],userId:n,isPersonal:!0}),{user:{id:n,email:e.email},apiKey:o}}function lt(t,e){let n=$f(e),o=t.select().from(f.users).where(Pf(f.users.apiKeyHash,n)).get();if(!o)return null;return{id:o.id,email:o.email}}function Wt(t,e){let n=t.select().from(f.users).where(Pf(f.users.email,e)).get();if(!n)return null;return{id:n.id,email:n.email}}var Eo=g(()=>{$();fo()});import{eq as wt,and as lo}from"drizzle-orm";function z(t,e){if(e.driveId){let r=t.select().from(f.drives).where(wt(f.drives.id,e.driveId)).get();if(!r)throw Error(`Drive not found: ${e.driveId}`);let u=ut(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(lo(wt(f.drives.orgId,e.orgId),wt(f.drives.isDefault,!0))).get();if(!r)throw Error(`No default drive for org: ${e.orgId}`);let u=ut(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,wt(f.orgMembers.orgId,f.orgs.id)).where(lo(wt(f.orgMembers.userId,e.userId),wt(f.orgs.isPersonal,!0))).get();if(!n)throw Error("No personal org found for user");let o=t.select().from(f.drives).where(lo(wt(f.drives.orgId,n.orgId),wt(f.drives.isDefault,!0))).get();if(!o)throw Error("No default drive found");let i=ut(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 Cf=g(()=>{$();he()});function Ee(t){let e=v();if(e.auth.apiKey){if(lt(t,e.auth.apiKey))return{apiKey:e.auth.apiKey}}console.error("[agent-fs] No local user found, creating one...");let n=j(t,{email:"local@agent-fs.local"});return w("auth.apiKey",n.apiKey),console.error("[agent-fs] Local user created automatically."),{apiKey:n.apiKey}}var Mf=g(()=>{kt();Eo()});var Xf=g(()=>{Eo();fo();uo();he();Cf();Mf()});var Hf;var Ff=g(()=>{Hf={name:"agent-fs",version:"0.4.0",private:!0,workspaces:["packages/*"],scripts:{typecheck:"tsc --build",test:"bun test packages/*/src/","test:coverage":"bun test --coverage packages/*/src/",build:"cd packages/cli && bun run build:npm"},devDependencies:{"bun-types":"^1.2.0",typescript:"^5.7.0",yaml:"^2.8.2","zod-to-json-schema":"^3.25.1"}}});var B;var so=g(()=>{Ff();B=Hf.version});var Gf={};Xt(Gf,{LocalEmbeddingProvider:()=>Yf});import{join as yd}from"path";import{mkdirSync as gd,existsSync as dd}from"fs";class Yf{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=yd(tt(),"models");if(!dd(n))gd(n,{recursive:!0});console.error("[agent-fs] Resolving local embedding model...");let o=await e(Td,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 Td="hf:nomic-ai/nomic-embed-text-v1.5-GGUF:Q8_0";var Zf=g(()=>{kt()});var yo={};Xt(yo,{OpenAIEmbeddingProvider:()=>Bf});import Rd from"openai";class Bf{name="openai";dimensions=768;client;constructor(t){this.client=new Rd({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 go=()=>{};var To={};Xt(To,{GeminiEmbeddingProvider:()=>Qf});import{GoogleGenAI as Ad}from"@google/genai";class Qf{name="gemini";dimensions=768;client;constructor(t){this.client=new Ad({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 Ro=()=>{};async function Vf(t){switch(t.provider){case"local":{let{LocalEmbeddingProvider:e}=await Promise.resolve().then(() => (Zf(),Gf));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(() => (go(),yo));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(() => (Ro(),To));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(() => (go(),yo));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(() => (Ro(),To));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 Vf(t)}catch(e){console.error("[agent-fs] Failed to create embedding provider from config:",e)}if(t?.provider==="local")try{return await Vf(t)}catch(e){console.error("[agent-fs] Failed to load local embedding provider:",e)}return null}var Wf,Jf,Kf=(t)=>typeof t==="string"?{...Jf,name:t}:{...Jf,...t};var Ye=g(()=>{Wf=Symbol("Let zodToJsonSchema decide on which parser to use"),Jf={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 bf=(t)=>{let e=Kf(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 Ao=g(()=>{Ye()});function No(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,No(t,e,o,i)}var Ge=(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 U(t){if(t.target!=="openAi")return{};let e=[...t.basePath,t.definitionPath,t.openAiAnyTypeName];return t.flags.hasReferencedOpenAiAnyType=!0,{$ref:t.$refStrategy==="relative"?Ge(e,t.currentPath):e.join("/")}}var W=()=>{};import{ZodFirstPartyTypeKind as Nd}from"zod/v3";function kf(t,e){let n={type:"array"};if(t.type?._def&&t.type?._def?.typeName!==Nd.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 wo=g(()=>{M()});function jf(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 po=()=>{};function zf(){return{type:"boolean"}}function Ze(t,e){return N(t.type._def,e)}var Be=g(()=>{M()});var qf=(t,e)=>{return N(t.innerType._def,e)};var _o=g(()=>{M()});function Io(t,e,n){let o=n??e.dateStrategy;if(Array.isArray(o))return{anyOf:o.map((i,r)=>Io(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 wd(t,e)}}var wd=(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 Do=()=>{};function xf(t,e){return{...N(t.innerType._def,e),default:t.defaultValue()}}var So=g(()=>{M()});function tE(t,e){return e.effectStrategy==="input"?N(t.schema._def,e):U(e)}var vo=g(()=>{M();W()});function eE(t){return{type:"string",enum:Array.from(t.values)}}function nE(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(pd(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 pd=(t)=>{if("type"in t&&t.type==="string")return!1;return"allOf"in t};var Lo=g(()=>{M()});function oE(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 Qe(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":x(n,"email",o.message,e);break;case"format:idn-email":x(n,"idn-email",o.message,e);break;case"pattern:zod":G(n,q.email,o.message,e);break}break;case"url":x(n,"uri",o.message,e);break;case"uuid":x(n,"uuid",o.message,e);break;case"regex":G(n,o.regex,o.message,e);break;case"cuid":G(n,q.cuid,o.message,e);break;case"cuid2":G(n,q.cuid2,o.message,e);break;case"startsWith":G(n,RegExp(`^${ao(o.value,e)}`),o.message,e);break;case"endsWith":G(n,RegExp(`${ao(o.value,e)}$`),o.message,e);break;case"datetime":x(n,"date-time",o.message,e);break;case"date":x(n,"date",o.message,e);break;case"time":x(n,"time",o.message,e);break;case"duration":x(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(ao(o.value,e)),o.message,e);break}case"ip":{if(o.version!=="v6")x(n,"ipv4",o.message,e);if(o.version!=="v4")x(n,"ipv6",o.message,e);break}case"base64url":G(n,q.base64url,o.message,e);break;case"jwt":G(n,q.jwt,o.message,e);break;case"cidr":{if(o.version!=="v6")G(n,q.ipv4Cidr,o.message,e);if(o.version!=="v4")G(n,q.ipv6Cidr,o.message,e);break}case"emoji":G(n,q.emoji(),o.message,e);break;case"ulid":{G(n,q.ulid,o.message,e);break}case"base64":{switch(e.base64Strategy){case"format:binary":{x(n,"binary",o.message,e);break}case"contentEncoding:base64":{D(n,"contentEncoding","base64",o.message,e);break}case"pattern:zod":{G(n,q.base64,o.message,e);break}}break}case"nanoid":G(n,q.nanoid,o.message,e);case"toLowerCase":case"toUpperCase":case"trim":break;default:((i)=>{})(o)}return n}function ao(t,e){return e.patternStrategy==="escape"?Id(t):t}function Id(t){let e="";for(let n=0;n<t.length;n++){if(!_d.has(t[n]))e+="\\";e+=t[n]}return e}function x(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:iE(e,o),...n&&o.errorMessages&&{errorMessage:{pattern:n}}})}else D(t,"pattern",iE(e,o),n,o)}function iE(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
|
|
165
|
+
]))`;continue}else if(o[l]==="$"){i+=`($|(?=[\r
|
|
166
|
+
]))`;continue}}if(n.s&&o[l]==="."){i+=u?`${o[l]}\r
|
|
167
|
+
`:`[${o[l]}\r
|
|
168
|
+
]`;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 Oo=void 0,q,_d;var Ve=g(()=>{q={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(Oo===void 0)Oo=RegExp("^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$","u");return Oo},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-_]*$/};_d=new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789")});import{ZodFirstPartyTypeKind as le}from"zod/v3";function Je(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===le.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]})??U(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===le.ZodString&&t.keyType._def.checks?.length){let{type:o,...i}=Qe(t.keyType._def,e);return{...n,propertyNames:i}}else if(t.keyType?._def.typeName===le.ZodEnum)return{...n,propertyNames:{enum:t.keyType._def.values}};else if(t.keyType?._def.typeName===le.ZodBranded&&t.keyType._def.type._def.typeName===le.ZodString&&t.keyType._def.type._def.checks?.length){let{type:o,...i}=Ze(t.keyType._def,e);return{...n,propertyNames:i}}return n}var We=g(()=>{M();Ve();Be();W()});function rE(t,e){if(e.mapStrategy==="record")return Je(t,e);let n=N(t.keyType._def,{...e,currentPath:[...e.currentPath,"items","items","0"]})||U(e),o=N(t.valueType._def,{...e,currentPath:[...e.currentPath,"items","items","1"]})||U(e);return{type:"array",maxItems:125,items:{type:"array",items:[n,o],minItems:2,maxItems:2}}}var ho=g(()=>{M();We();W()});function uE(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 fE(t){return t.target==="openAi"?void 0:{not:U({...t,currentPath:[...t.currentPath,"not"]})}}var Uo=g(()=>{W()});function EE(t){return t.target==="openApi3"?{enum:["null"],nullable:!0}:{type:"null"}}function sE(t,e){if(e.target==="openApi3")return lE(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 lE(t,e)}var se,lE=(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(()=>{M();se={ZodString:"string",ZodNumber:"number",ZodBigInt:"integer",ZodBoolean:"boolean",ZodNull:"null"}});function yE(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 mo=g(()=>{M();Ke()});function gE(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",No(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 co=()=>{};function dE(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 s=Sd(l);if(s&&n){if(l._def.typeName==="ZodOptional")l=l._def.innerType;if(!l.isNullable())l=l.nullable();s=!1}let y=N(l._def,{...e,currentPath:[...e.currentPath,"properties",E],propertyPath:[...e.currentPath,"properties",E]});if(y===void 0)continue;if(o.properties[E]=y,!s)i.push(E)}if(i.length)o.required=i;let u=Dd(t,e);if(u!==void 0)o.additionalProperties=u;return o}function Dd(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 Sd(t){try{return t.isOptional()}catch{return!0}}var Po=g(()=>{M()});var TE=(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:U(e)},n]}:U(e)};var $o=g(()=>{M();W()});var RE=(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 Co=g(()=>{M()});function AE(t,e){return N(t.type._def,e)}var Mo=g(()=>{M()});function NE(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 Xo=g(()=>{M()});function wE(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 Fo=g(()=>{M()});function pE(t){return{not:U(t)}}var Ho=g(()=>{W()});function _E(t){return U(t)}var Yo=g(()=>{W()});var IE=(t,e)=>{return N(t.innerType._def,e)};var Go=g(()=>{M()});import{ZodFirstPartyTypeKind as I}from"zod/v3";var DE=(t,e,n)=>{switch(e){case I.ZodString:return Qe(t,n);case I.ZodNumber:return gE(t,n);case I.ZodObject:return dE(t,n);case I.ZodBigInt:return jf(t,n);case I.ZodBoolean:return zf();case I.ZodDate:return Io(t,n);case I.ZodUndefined:return pE(n);case I.ZodNull:return EE(n);case I.ZodArray:return kf(t,n);case I.ZodUnion:case I.ZodDiscriminatedUnion:return sE(t,n);case I.ZodIntersection:return nE(t,n);case I.ZodTuple:return wE(t,n);case I.ZodRecord:return Je(t,n);case I.ZodLiteral:return oE(t,n);case I.ZodEnum:return eE(t);case I.ZodNativeEnum:return uE(t);case I.ZodNullable:return yE(t,n);case I.ZodOptional:return TE(t,n);case I.ZodMap:return rE(t,n);case I.ZodSet:return NE(t,n);case I.ZodLazy:return()=>t.getter()._def;case I.ZodPromise:return AE(t,n);case I.ZodNaN:case I.ZodNever:return fE(n);case I.ZodEffects:return tE(t,n);case I.ZodAny:return U(n);case I.ZodUnknown:return _E(n);case I.ZodDefault:return xf(t,n);case I.ZodBranded:return Ze(t,n);case I.ZodReadonly:return IE(t,n);case I.ZodCatch:return qf(t,n);case I.ZodPipeline:return RE(t,n);case I.ZodFunction:case I.ZodVoid:case I.ZodSymbol:return;default:return((o)=>{return})(e)}};var Zo=g(()=>{W();wo();po();Be();_o();Do();So();vo();Lo();ho();Uo();mo();co();Po();$o();Co();Mo();We();Xo();Ve();Fo();Ho();Ke();Yo();Go()});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!==Wf)return E}if(o&&!n){let E=vd(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=DE(t,t.typeName,e),u=typeof r==="function"?N(r(),e):r;if(u)Ld(t,e,u);if(e.postProcess){let E=e.postProcess(u,t,e);return i.jsonSchema=u,E}return i.jsonSchema=u,u}var vd=(t,e)=>{switch(e.$refStrategy){case"root":return{$ref:t.path.join("/")};case"relative":return{$ref:Ge(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`),U(e);return e.$refStrategy==="seen"?U(e):void 0}}},Ld=(t,e,n)=>{if(t.description){if(n.description=t.description,e.markdownDescription)n.markdownDescription=t.description}return n};var M=g(()=>{Ye();Zo();W()});var SE=()=>{};var Bo=(t,e)=>{let n=bf(e),o=typeof e==="object"&&e.definitions?Object.entries(e.definitions).reduce((l,[s,y])=>({...l,[s]:N(y._def,{...n,currentPath:[...n.basePath,n.definitionPath,s]},!0)??U(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)??U(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 Qo=g(()=>{M();Ao();W()});var vE=g(()=>{Qo();Ye();Ao();M();SE();W();wo();po();Be();_o();Do();So();vo();Lo();ho();Uo();mo();co();Po();$o();Co();Mo();Go();We();Xo();Ve();Fo();Ho();Ke();Yo();Zo();Qo()});function be(){let t=Jt(),e={},n={};for(let i of t){let r=Nt(i),u=Bo(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 LE=g(()=>{vE();oo();so()});var OE={};Xt(OE,{updateOrgMemberRole:()=>mt,updateDriveMemberRole:()=>Lt,setDriveMember:()=>ro,setConfigValue:()=>w,setConfig:()=>ii,schema:()=>f,resolveContext:()=>z,removeOrgMember:()=>ct,removeDriveMember:()=>Ot,listUserOrgs:()=>Z,listOrgMembers:()=>Ut,listDrives:()=>St,listDriveMembers:()=>vt,inviteToOrg:()=>Pt,getUserDriveRole:()=>ut,getUserByEmail:()=>Wt,getUserByApiKey:()=>lt,getRequiredRole:()=>ie,getRegisteredOps:()=>Jt,getOrg:()=>fe,getOpDefinition:()=>Nt,getHome:()=>tt,getDrive:()=>io,getDbPath:()=>_t,getConfigPath:()=>et,getConfig:()=>v,generateOpenAPISpec:()=>be,ensureLocalUser:()=>Ee,dispatchOp:()=>At,createUser:()=>j,createOrg:()=>ht,createEmbeddingProviderFromEnv:()=>Kt,createDrive:()=>Dt,createDatabase:()=>st,commentUpdate:()=>Me,commentResolve:()=>Fe,commentList:()=>$e,commentGet:()=>Ce,commentDelete:()=>Xe,commentAdd:()=>Pe,checkPermission:()=>re,ValidationError:()=>k,VERSION:()=>B,PermissionDeniedError:()=>b,NotFoundError:()=>O,IndexingInProgressError:()=>oe,EditConflictError:()=>rt,AgentS3Client:()=>gt,AgentFSError:()=>it});var c=g(()=>{$();kt();vu();V();oo();Xf();so();LE()});var ke={};Xt(ke,{stopDaemon:()=>nT,startDaemon:()=>eT,daemonStatus:()=>oT});import{spawn as zd}from"child_process";import{readFileSync as Wo,writeFileSync as qd,unlinkSync as PE,existsSync as Ko,openSync as xd}from"fs";import{join as bo}from"path";function ko(){return bo(tt(),"agent-fs.pid")}function tT(){return bo(tt(),"agent-fs.log")}function eT(){let t=ko();if(Ko(t)){let E=parseInt(Wo(t,"utf-8").trim());try{process.kill(E,0),console.log(`Daemon already running (PID: ${E})`);return}catch{PE(t)}}let e=tT(),n=xd(e,"a"),o=!import.meta.dir.startsWith("/")||import.meta.dir.startsWith("/$bunfs"),i=o?process.execPath:"bun",r=o?["server"]:["run",bo(import.meta.dir,"index.ts")],u=zd(i,r,{detached:!0,stdio:["ignore",n,n]});if(u.unref(),u.pid)qd(t,String(u.pid)),console.log(`Daemon started (PID: ${u.pid})`),console.log(`Logs: ${e}`)}function nT(){let t=ko();if(!Ko(t)){console.log("Daemon is not running");return}let e=parseInt(Wo(t,"utf-8").trim());try{process.kill(e,"SIGTERM"),console.log(`Daemon stopped (PID: ${e})`)}catch{console.log(`Process ${e} not found (already stopped)`)}PE(t)}function oT(){let t=ko();if(!Ko(t))return{running:!1};let e=parseInt(Wo(t,"utf-8").trim());try{return process.kill(e,0),{running:!0,pid:e}}catch{return{running:!1}}}var je=g(()=>{c()});var aT={};import{Server as pT}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport as _T}from"@modelcontextprotocol/sdk/server/stdio.js";import{Client as IT}from"@modelcontextprotocol/sdk/client/index.js";import{StreamableHTTPClientTransport as DT}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{ListToolsRequestSchema as ST,CallToolRequestSchema as vT}from"@modelcontextprotocol/sdk/types.js";var ge,jo,VE,LT,zo,qo,OT;var JE=g(async()=>{c();ge=v(),jo=process.env.AGENT_FS_API_URL??ge.apiUrl??`http://${ge.server.host}:${ge.server.port}`,VE=process.env.AGENT_FS_API_KEY??ge.apiKey??ge.auth?.apiKey;if(!VE)console.error("Error: No API key. Register with `agent-fs auth register` or set AGENT_FS_API_KEY."),process.exit(1);LT=new DT(new URL(`${jo}/mcp`),{requestInit:{headers:{Authorization:`Bearer ${VE}`}}}),zo=new IT({name:"agent-fs-proxy",version:B});try{await zo.connect(LT)}catch(t){console.error(`Cannot connect to agent-fs at ${jo}.
|
|
169
|
+
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 pT({name:"agent-fs",version:B},{capabilities:{tools:{}}});qo.setRequestHandler(ST,async()=>{return await zo.listTools()});qo.setRequestHandler(vT,async(t)=>{return await zo.callTool(t.params)});OT=new _T;await qo.connect(OT);console.error("[agent-fs] MCP proxy connected to "+jo)});import{z as WE}from"zod";function KE(t,e){let n=Jt();for(let o of n){let i=Nt(o);if(!i)continue;t.tool(o,i.description,i.schema instanceof WE.ZodObject?i.schema.shape:{params:WE.any()},async(r,u)=>{let E=e(u),l=await At(E,o,r);return{content:[{type:"text",text:JSON.stringify(l,null,2)}]}})}}var bE=g(()=>{c()});import{McpServer as hT}from"@modelcontextprotocol/sdk/server/mcp.js";import{z as pt}from"zod";function kE(t){let{db:e,s3:n,embeddingProvider:o,appUrl:i}=t,r=new hT({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 s=l.extra.user,y=z(e,{userId:s.id});return{db:e,s3:n,orgId:y.orgId,driveId:y.driveId,userId:s.id,embeddingProvider:o,appUrl:i}};return KE(r,u),r.tool("health","Check agent-fs system health: database, S3, embeddings, version.",{},async(E,l)=>{let s={version:B};try{let y=u(l),T=await At(y,"ls",{path:"/"},{skipAuth:!0});s.database={ok:!0,rootEntries:T.entries?.length??0}}catch(y){s.database={ok:!1,error:y.message}}try{await n.listObjects("",{delimiter:"/"}),s.s3={ok:!0}}catch(y){s.s3={ok:!1,error:y.message}}return s.embeddings={configured:!!o},{content:[{type:"text",text:JSON.stringify(s,null,2)}]}}),r.tool("whoami","Get current user identity, org memberships, and drive roles.",{},async(E,l)=>{let s=u(l),y=s.userId,R=Z(e,y).map((P)=>{let C=St(e,P.id);return{orgId:P.id,orgName:P.name,drives:C.map((H)=>({driveId:H.id,driveName:H.name,role:ut(e,y,H.id)}))}}),S=l.authInfo?.extra?.user?.email,h={userId:y,...S?{email:S}:{},activeOrg:s.orgId,activeDrive:s.driveId,memberships:R};return{content:[{type:"text",text:JSON.stringify(h,null,2)}]}}),r.tool("member-list","List members of the current org, or a specific drive if driveId is provided.",{driveId:pt.string().optional().describe("Drive ID to list members for. Omit for org members.")},async(E,l)=>{let s=u(l),y=E.driveId?vt(e,E.driveId):Ut(e,s.orgId);return{content:[{type:"text",text:JSON.stringify({members:y},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:pt.string().describe("Email of the user to invite"),role:pt.enum(["viewer","editor","admin"]).describe("Role to assign")},async(E,l)=>{let s=u(l);try{return Pt(e,{orgId:s.orgId,email:E.email,role:E.role}),{content:[{type:"text",text:JSON.stringify({ok:!0,invited:E.email,role:E.role},null,2)}]}}catch(y){return{content:[{type:"text",text:JSON.stringify({error:y.message},null,2)}],isError:!0}}}),r.tool("member-update-role","Update a member's role in the current org or a specific drive.",{email:pt.string().describe("Email of the member"),role:pt.enum(["viewer","editor","admin"]).describe("New role"),driveId:pt.string().optional().describe("Drive ID to update role for. Omit for org role.")},async(E,l)=>{let s=u(l);try{let y=Wt(e,E.email);if(!y)throw Error(`User with email ${E.email} not found`);if(E.driveId)Lt(e,{driveId:E.driveId,userId:y.id,role:E.role});else mt(e,{orgId:s.orgId,userId:y.id,role:E.role});return{content:[{type:"text",text:JSON.stringify({ok:!0,email:E.email,role:E.role},null,2)}]}}catch(y){return{content:[{type:"text",text:JSON.stringify({error:y.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:pt.string().describe("Email of the member to remove"),driveId:pt.string().optional().describe("Drive ID to remove from. Omit to remove from org.")},async(E,l)=>{let s=u(l);try{let y=Wt(e,E.email);if(!y)throw Error(`User with email ${E.email} not found`);if(E.driveId)Ot(e,{driveId:E.driveId,userId:y.id});else ct(e,{orgId:s.orgId,userId:y.id});return{content:[{type:"text",text:JSON.stringify({ok:!0,removed:E.email},null,2)}]}}catch(y){return{content:[{type:"text",text:JSON.stringify({error:y.message},null,2)}],isError:!0}}}),r}var jE=g(()=>{c();bE()});function zE(t){return async(e,n)=>{let o=new URL(e.req.url).pathname;if(UT.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=lt(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 UT;var qE=g(()=>{c();UT=["/auth/register","/health"]});function mT(t){if(t instanceof O)return 404;if(t instanceof b)return 403;if(t instanceof rt)return 409;if(t instanceof oe)return 503;if(t instanceof k)return 400;if("code"in t)return 400;return 500}function xE(t,e){let n=mT(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 tl=g(()=>{c()});function qe(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((s)=>s>E);if(l.length>=t){let s=l[0],y=Math.ceil((s+60000-u)/1000);return n.header("Retry-After",String(y)),n.json({error:"RATE_LIMITED",message:"Too many requests"},429)}l.push(u),e.set(r,l),await o()}}import{Hono as cT}from"hono";function el(t){let e=new cT;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=j(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=z(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 nl=g(()=>{c()});import{Hono as PT}from"hono";function ol(t,e,n=null,o){let i=new PT;return i.post("/:orgId/ops",async(r)=>{let u=r.get("user"),E=r.req.param("orgId"),l=await r.req.json(),{op:s,...y}=l;if(!s)return r.json({error:"VALIDATION_ERROR",message:"op is required in request body"},400);let T=y.driveId||y.drive_id;delete y.driveId,delete y.drive_id;let R=z(t,{userId:u.id,orgId:E,driveId:T}),S={db:t,s3:e,orgId:R.orgId,driveId:R.driveId,userId:u.id,embeddingProvider:n,appUrl:o},h=await At(S,s,y);return r.json(h)}),i}var il=g(()=>{c()});import{Hono as $T}from"hono";function rl(t){let e=new $T;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=ht(t,{name:i,userId:o.id});return n.json(r,201)}),e.get("/:orgId",(n)=>{let o=n.req.param("orgId"),i=fe(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=St(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=Dt(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 Pt(t,{orgId:o,email:i,role:r}),n.json({ok:!0})}),e.get("/:orgId/members",(n)=>{let o=n.req.param("orgId"),i=Ut(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 mt(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 ct(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=vt(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 Lt(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 Ot(t,{driveId:o,userId:i}),n.json({ok:!0})}catch(r){return n.json({error:"BAD_REQUEST",message:r.message},400)}}),e}var ul=g(()=>{c()});import{Hono as CT}from"hono";function fl(){let t=new CT;return t.get("/openapi.json",(e)=>{return e.json(be())}),t}var El=g(()=>{c()});import{Hono as MT}from"hono";function ll(t,e){let n=new MT;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=z(t,{userId:i.id,orgId:r,driveId:u}),s=new URL(o.req.url).pathname.match(/\/files\/(.+)\/raw$/);if(!s)return o.json({error:"VALIDATION_ERROR",message:"Invalid file path"},400);let y=decodeURIComponent(s[1]),T=_(E.orgId,E.driveId,y);try{let R=await e.getObject(T),S=R.contentType||"application/octet-stream";return new Response(R.body.buffer,{status:200,headers:{"Content-Type":S,"Content-Length":String(R.body.length),"Cache-Control":"private, max-age=60"}})}catch(R){if(R?.name==="NoSuchKey"||R?.$metadata?.httpStatusCode===404)return o.json({error:"NOT_FOUND",message:`File not found: ${y}`},404);throw R}}),n}var sl=g(()=>{c();X()});import{Hono as XT}from"hono";import{cors as yl}from"hono/cors";import{bodyLimit as FT}from"hono/body-limit";import{WebStandardStreamableHTTPServerTransport as HT}from"@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js";function gl(t,e,n=null){let o=new XT,i=v(),r=i.server?.cors?.origins??["*"];if(r.length===1&&r[0]==="*")o.use("*",yl());else o.use("*",yl({origin:r}));o.use("*",FT({maxSize:52428800})),o.use("*",zE(t));let u=i.server?.rateLimit?.requestsPerMinute??1200;if(u>0)o.use("/orgs/*",qe(u)),o.use("/auth/*",qe(u)),o.use("/mcp",qe(u));return o.onError((E,l)=>xE(E,l)),o.get("/health",(E)=>E.json({ok:!0,version:B})),o.all("/mcp",async(E)=>{let l=E.get("user"),s=new HT({sessionIdGenerator:void 0,enableJsonResponse:!0});return await kE({db:t,s3:e,embeddingProvider:n,appUrl:i.appUrl}).connect(s),s.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",el(t)),o.route("/orgs",rl(t)),o.route("/orgs",ol(t,e,n,i.appUrl)),o.route("/docs",fl()),o.route("/orgs",ll(t,e)),o}var dl=g(()=>{c();jE();qE();tl();nl();il();ul();El();sl()});var BT={};function Rl(){console.log("Shutting down..."),xo.stop(),process.exit(0)}var xe,YT,GT,Tl=null,ZT,xo;var Al=g(async()=>{c();dl();xe=v(),YT=st(),GT=new gt(xe.s3);try{Tl=await Kt(xe.embedding)}catch(t){console.warn("Embedding provider unavailable, semantic search disabled:",t)}ZT=gl(YT,GT,Tl),xo=Bun.serve({fetch:ZT.fetch,port:xe.server.port,hostname:xe.server.host});console.log(`agent-fs daemon running on http://${xo.hostname}:${xo.port}`);process.on("SIGTERM",Rl);process.on("SIGINT",Rl)});c();import{Command as QT}from"commander";c();class Vo{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?`
|
|
170
|
+
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}}c();import{Command as bd}from"commander";function bt(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 $t(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 ye(t,e){return t.length>=e?t:t+" ".repeat(e-t.length)}function Jo(t,e){return t.length>=e?t:" ".repeat(e-t.length)+t}function Od(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)=>bt(E.size??0).length)),r=ye("NAME",n)+" "+ye("TYPE",o)+" "+Jo("SIZE",i)+" MODIFIED",u=e.map((E)=>ye(E.name,n)+" "+ye(E.type,o)+" "+Jo(bt(E.size??0),i)+" "+$t(E.modifiedAt));return[r,...u].join(`
|
|
171
|
+
`)}function aE(t){let n=(t.content??"").split(`
|
|
172
|
+
`);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)=>`${Jo(String(o+u),i)} ${r}`).join(`
|
|
173
|
+
`)}function ad(t){let e=[["Path",t.path??"-"],["Size",bt(t.size??0)],["Content-Type",t.contentType??"-"],["Author",t.author??"-"],["Version",t.currentVersion!=null?String(t.currentVersion):"-"],["Created",$t(t.createdAt)],["Modified",$t(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])=>`${ye(o+":",n+1)} ${i}`).join(`
|
|
174
|
+
`)}function hd(t){let e=t.versions??[];if(e.length===0)return"(no version history)";return e.map((n)=>{let o=[`v${n.version} ${$t(n.createdAt)} ${n.author??"-"} [${n.operation}]`];if(n.message)o.push(` ${n.message}`);if(n.diffSummary)o.push(` ${n.diffSummary}`);return o.join(`
|
|
164
175
|
`)}).join(`
|
|
165
176
|
|
|
166
|
-
`)}function
|
|
167
|
-
`)}function
|
|
168
|
-
`)}function
|
|
169
|
-
${
|
|
170
|
-
hint: ${t.hint}`);return
|
|
177
|
+
`)}function Ud(t){return`\u2713 wrote ${t.path} (v${t.version}, ${bt(t.size??0)})`}function md(t){return`\u2713 edited ${t.path} (v${t.version}, ${t.changes} change${t.changes!==1?"s":""})`}function cd(t){return`\u2713 appended (v${t.version}, ${bt(t.size??0)})`}function Pd(t){return t.deleted?`\u2713 deleted ${t.path}`:`(not found: ${t.path})`}function $d(t){return`\u2713 moved ${t.from} -> ${t.to} (v${t.version})`}function Cd(t){return`\u2713 copied ${t.from} -> ${t.to} (v${t.version})`}function Md(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,s=l?"\u2514\u2500\u2500 ":"\u251C\u2500\u2500 ",y=E.type==="directory"?"/":"";if(n.push(`${r}${s}${E.name}${y}`),E.children&&E.children.length>0){let T=r+(l?" ":"\u2502 ");o(E.children,T)}}}return o(e,""),n.join(`
|
|
178
|
+
`)}function Xd(t){let e=t.matches??[];if(e.length===0)return"(no matches)";return e.map((n)=>`${n.path}:${n.lineNumber}: ${n.content}`).join(`
|
|
179
|
+
`)}function Fd(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})
|
|
180
|
+
${o.snippet}`);if(t.hint)n.push(`
|
|
181
|
+
hint: ${t.hint}`);return n.join(`
|
|
171
182
|
|
|
172
|
-
`)}function
|
|
173
|
-
${
|
|
183
|
+
`)}function Hd(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}`:"")+`
|
|
184
|
+
${n.snippet}`).join(`
|
|
174
185
|
|
|
175
|
-
`)}function
|
|
176
|
-
`)}function
|
|
177
|
-
`)}function
|
|
178
|
-
${
|
|
186
|
+
`)}function Yd(t){let e=t.matches??[];if(e.length===0)return"(no matches)";return e.map((n)=>`${n.path} ${bt(n.size??0)} ${$t(n.modifiedAt)}`).join(`
|
|
187
|
+
`)}function Gd(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(`
|
|
188
|
+
`)}function Zd(t){return aE(t)}function Bd(t){return`\u2713 reverted to v${t.revertedTo} (new version: v${t.version})`}function Qd(t){let e=t.entries??[];if(e.length===0)return"(no recent activity)";return e.map((n)=>`${n.path} v${n.version} ${$t(n.createdAt)} ${n.author??"-"} [${n.operation}]`+(n.message?`
|
|
189
|
+
${n.message}`:"")).join(`
|
|
179
190
|
|
|
180
|
-
`)}function
|
|
191
|
+
`)}function Vd(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 Jd(t){let e=`${t.url}
|
|
192
|
+
|
|
193
|
+
Expires: ${$t(t.expiresAt)} (${t.expiresIn}s)`;if(t.appUrl)e+=`
|
|
194
|
+
App: ${t.appUrl}`;return e}var Wd={ls:Od,cat:aE,stat:ad,log:hd,write:Ud,edit:md,append:cd,rm:Pd,mv:$d,cp:Cd,tree:Md,grep:Xd,fts:Fd,search:Hd,glob:Yd,diff:Gd,tail:Zd,revert:Bd,recent:Qd,reindex:Vd,"signed-url":Jd};function Kd(t,e){let n=Wd[t];if(n)return n(e);return JSON.stringify(e,null,2)}function hE(t,e,n){if(n)console.log(JSON.stringify(e,null,2));else console.log(Kd(t,e))}var kd=[{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"}]},{name:"signed-url",args:[{name:"path",required:!0}],options:[{flag:"--expires-in <seconds>",description:"Expiry in seconds (default: 86400 = 24h)"}]}];function UE(t,e,n){for(let o of kd){let i=Nt(o.name),r=new bd(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 s=0;s<o.args.length;s++)if(u[s]!==void 0)l[o.args[s].name]=u[s];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 s of["offset","limit","lines","v1","v2","version","expectedVersion","depth","expiresIn"])if(l[s]!==void 0)l[s]=parseInt(l[s]);try{let s=await e.callOp(await n(),o.name,l);hE(o.name,s,t.opts().json)}catch(s){if(s?.cause?.code==="ECONNREFUSED"||s?.message?.includes("fetch failed"))console.error(`Cannot connect to agent-fs daemon.
|
|
181
195
|
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: ${
|
|
183
|
-
API key saved to config.`)}import{Command as
|
|
196
|
+
Or set AGENT_FS_API_URL to connect to a remote server.`),process.exit(1);console.error(`Error: ${s.message}`),process.exit(1)}}),t.addCommand(r)}}c();import{Command as jd}from"commander";function cE(t){let e=new jd("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});mE(o,t)}catch{try{let o=st(),i=j(o,{email:n}),r=Z(o,i.user.id);mE({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(() => (c(),OE)),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 s=r(E,l.id);console.log(JSON.stringify({...l,orgs:s},null,2))}catch(n){console.error(`Error: ${n.message}`),process.exit(1)}}}),e}function mE(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(`
|
|
197
|
+
API key saved to config.`)}import{Command as iT}from"commander";function $E(){let t=new iT("daemon").description("Daemon lifecycle management");return t.command("start").description("Start the agent-fs daemon").action(async()=>{let{startDaemon:e}=await Promise.resolve().then(() => (je(),ke));e()}),t.command("stop").description("Stop the agent-fs daemon").action(async()=>{let{stopDaemon:e}=await Promise.resolve().then(() => (je(),ke));e()}),t.command("status").description("Check daemon status").action(async()=>{let{daemonStatus:e}=await Promise.resolve().then(() => (je(),ke)),n=e();if(n.running)console.log(`Daemon running (PID: ${n.pid})`);else console.log("Daemon is not running")}),t}c();import{Command as rT}from"commander";import{existsSync as CE}from"fs";function ME(){let t=new rT("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=CE(et());e.push({name:"Config file",ok:o,message:o?et():"Not found \u2014 run `agent-fs onboard`"});let r=["endpoint","bucket","accessKeyId","secretAccessKey"].filter((y)=>!n.s3[y]);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 gt(n.s3).listObjects(""),e.push({name:"S3 connectivity",ok:!0,message:"Connected"})}catch(y){e.push({name:"S3 connectivity",ok:!1,message:y.message||"Connection failed"})}let u=CE(_t());e.push({name:"Database",ok:u,message:u?_t():"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 y=await Kt(n.embedding);e.push({name:"Embeddings",ok:!!y,message:y?`${E} ready`:`${E} configured but failed to init`})}catch(y){e.push({name:"Embeddings",ok:!1,message:y.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
198
|
agent-fs health check
|
|
185
|
-
`);let
|
|
186
|
-
${
|
|
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
|
|
199
|
+
`);let s=!0;for(let y of e){let T=y.ok?"\u2713":"\u2717";if(console.log(` ${T} ${y.name}: ${y.message}`),!y.ok)s=!1}if(console.log(),s)console.log("All checks passed.");else console.log("Some checks failed. Fix the issues above and re-run."),process.exit(1)}),t}c();import{Command as uT}from"commander";function XE(t,e){let n=new uT("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 s=l.isDefault?" (default)":"";console.log(`${l.id} ${l.name}${s}`)}return}let{orgs:r}=await t.get("/orgs");if(o){let E=[];for(let l of r){let{drives:s}=await t.get(`/orgs/${l.id}/drives`);E.push({orgId:l.id,orgName:l.name,drives:s})}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 s=l.length>0?` (${l.join(", ")})`:"";console.log(`
|
|
200
|
+
${E.name} [${E.role}]${s}`);let{drives:y}=await t.get(`/orgs/${E.id}/drives`);for(let T of y){let R=[];if(T.isDefault)R.push("default");if(u.defaultDrive===T.id)R.push("active");let S=R.length>0?` (${R.join(", ")})`:"";console.log(` ${T.id} ${T.name}${S}`)}}}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((y)=>y.id===i.defaultDrive);if(!l)l=E.find((y)=>y.isDefault)??E[0]??null;let s=i.defaultOrg?"config (org switch)":"server default";if(o)console.log(JSON.stringify({orgId:u,drive:l,source:s},null,2));else console.log(`org: ${u}`),console.log(`drive: ${l?.id??"(none)"} ${l?.name??""}`),console.log(`source: ${s}`)}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`),s=l.find((y)=>y.id===o);if(s){r=s,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",`
|
|
201
|
+
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}c();import{Command as fT}from"commander";function FE(t){let e=new fT("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 TT}from"commander";c();import{Command as ET}from"commander";import{execSync as Ct}from"child_process";import{existsSync as lT}from"fs";function ze(){return new ET("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
202
|
To connect to a remote server, configure manually:
|
|
189
|
-
agent-fs config set api.url "`+
|
|
190
|
-
agent-fs config set api.key "<your-api-key>"`),process.exit(1);let
|
|
203
|
+
agent-fs config set api.url "`+e.remote+`"
|
|
204
|
+
agent-fs config set api.key "<your-api-key>"`),process.exit(1);let n=et();if(lT(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
205
|
`)}console.log(`Setting up agent-fs...
|
|
192
|
-
`);let
|
|
206
|
+
`);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 yT(!!e.yes);else await gT();let r=e.embeddings??(e.yes?"none":void 0);if(r)sT(r,e);else if(!e.yes)console.log(`
|
|
193
207
|
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
|
|
195
|
-
User registered: ${
|
|
196
|
-
User registered: ${
|
|
208
|
+
Initializing database...`);let u=st();if(console.log("Database ready."),i||e.yes){let{apiKey:E}=Ee(u),l=lt(u,E),s=Z(u,l.id);console.log(`
|
|
209
|
+
User registered: ${l.email}`),console.log(`API Key: ${E}`),console.log(`Org ID: ${s[0]?.id}`)}else{let E=await dT();try{let l=j(u,{email:E}),s=Z(u,l.user.id);w("auth.apiKey",l.apiKey),console.log(`
|
|
210
|
+
User registered: ${E}`),console.log(`API Key: ${l.apiKey}`),console.log(`Org ID: ${s[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 sT(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 yT(t){try{Ct("which docker",{stdio:"ignore"}),Ct("docker info",{stdio:"ignore"})}catch{console.error(`Docker is required for local mode (MinIO).
|
|
197
211
|
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
|
|
199
|
-
Edit with: agent-fs config set s3.endpoint <url>`)}async function
|
|
200
|
-
`),await t.parseAsync(
|
|
212
|
+
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 gT(){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(`
|
|
213
|
+
Edit with: agent-fs config set s3.endpoint <url>`)}async function dT(){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 HE(){let t=ze(),e=new TT("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'.
|
|
214
|
+
`),await t.parseAsync(o.args,{from:"user"})});for(let n of t.options)e.addOption(n);return e}import{Command as RT}from"commander";function YE(t,e){let n=new RT("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
215
|
Start with: agent-fs daemon start
|
|
202
|
-
Or set AGENT_FS_API_URL to connect to a remote server.`),process.exit(1);throw
|
|
216
|
+
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 AT}from"commander";function ZE(t,e){let n=new AT("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 GE(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 GE(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 GE(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 wT}from"commander";var BE=`---
|
|
203
217
|
name: agent-fs
|
|
204
218
|
description: >-
|
|
205
219
|
Use when the user wants to store, retrieve, search, or manage files in agent-fs \u2014
|
|
206
220
|
an agent-first filesystem backed by S3. Triggers on: "save this to agent-fs",
|
|
207
221
|
"find that file", "store this document", "search agent-fs", "list my files",
|
|
208
|
-
"show version history", "revert file", "set up agent-fs",
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
222
|
+
"show version history", "revert file", "set up agent-fs", "get a signed url",
|
|
223
|
+
"share this file", "manage members", "invite user", "list members", "remove member",
|
|
224
|
+
"update role", file persistence for agents, shared agent filesystem, or any
|
|
225
|
+
mention of the agent-fs CLI. Also use when the user needs to manage drives,
|
|
226
|
+
manage org/drive members, generate presigned URLs, check recent activity, or use
|
|
227
|
+
semantic search across stored files. If the user mentions agent-fs in any context,
|
|
228
|
+
always consult this skill.
|
|
213
229
|
---
|
|
214
230
|
|
|
215
231
|
# agent-fs CLI
|
|
@@ -278,6 +294,7 @@ For custom S3 (AWS, R2, etc.), use flags: \`agent-fs onboard --s3-endpoint <url>
|
|
|
278
294
|
| \`rm\` | \`agent-fs rm <path>\` | Delete a file |
|
|
279
295
|
| \`mv\` | \`agent-fs mv <from> <to> [-m <msg>]\` | Move or rename a file |
|
|
280
296
|
| \`cp\` | \`agent-fs cp <from> <to>\` | Copy a file |
|
|
297
|
+
| \`signed-url\` | \`agent-fs signed-url <path> [--expires-in <seconds>]\` | Generate a presigned URL for direct download (default: 24h, max: 7 days) |
|
|
281
298
|
|
|
282
299
|
### Versioning
|
|
283
300
|
|
|
@@ -323,6 +340,17 @@ For custom S3 (AWS, R2, etc.), use flags: \`agent-fs onboard --s3-endpoint <url>
|
|
|
323
340
|
| \`auth register\` | \`agent-fs auth register <email>\` | Register a new user |
|
|
324
341
|
| \`auth whoami\` | \`agent-fs auth whoami\` | Show current user info |
|
|
325
342
|
|
|
343
|
+
### Member Management
|
|
344
|
+
|
|
345
|
+
| Command | Usage | Description |
|
|
346
|
+
|---------|-------|-------------|
|
|
347
|
+
| \`member list\` | \`agent-fs member list\` | List org members (use \`--drive <id>\` for drive members) |
|
|
348
|
+
| \`member invite\` | \`agent-fs member invite <email> --role <role>\` | Invite user to org (viewer/editor/admin) |
|
|
349
|
+
| \`member update-role\` | \`agent-fs member update-role <email> --role <role>\` | Update org role (use \`--drive <id>\` for drive role) |
|
|
350
|
+
| \`member remove\` | \`agent-fs member remove <email>\` | Remove from org (use \`--drive <id>\` for drive only) |
|
|
351
|
+
|
|
352
|
+
The \`--drive\` flag is a global option \u2014 place it before the subcommand: \`agent-fs --drive <id> member list\`.
|
|
353
|
+
|
|
326
354
|
### Drive Management
|
|
327
355
|
|
|
328
356
|
| Command | Usage | Description |
|
|
@@ -417,6 +445,28 @@ agent-fs drive invite alice@company.com --role editor
|
|
|
417
445
|
agent-fs drive current
|
|
418
446
|
\`\`\`
|
|
419
447
|
|
|
448
|
+
### Manage members
|
|
449
|
+
|
|
450
|
+
\`\`\`bash
|
|
451
|
+
# List org members
|
|
452
|
+
agent-fs member list
|
|
453
|
+
|
|
454
|
+
# List drive members
|
|
455
|
+
agent-fs --drive <driveId> member list
|
|
456
|
+
|
|
457
|
+
# Invite a user
|
|
458
|
+
agent-fs member invite alice@company.com --role editor
|
|
459
|
+
|
|
460
|
+
# Change role
|
|
461
|
+
agent-fs member update-role alice@company.com --role admin
|
|
462
|
+
|
|
463
|
+
# Remove from org (cascades to all drives)
|
|
464
|
+
agent-fs member remove alice@company.com
|
|
465
|
+
|
|
466
|
+
# Remove from a specific drive only (keeps org membership)
|
|
467
|
+
agent-fs --drive <driveId> member remove alice@company.com
|
|
468
|
+
\`\`\`
|
|
469
|
+
|
|
420
470
|
### Check recent activity
|
|
421
471
|
|
|
422
472
|
\`\`\`bash
|
|
@@ -427,14 +477,43 @@ agent-fs recent --since 1h
|
|
|
427
477
|
agent-fs recent docs/ --since 24h --limit 20
|
|
428
478
|
\`\`\`
|
|
429
479
|
|
|
480
|
+
### Generate a shareable download link
|
|
481
|
+
|
|
482
|
+
\`\`\`bash
|
|
483
|
+
# Default expiry (24 hours)
|
|
484
|
+
agent-fs signed-url docs/report.pdf
|
|
485
|
+
|
|
486
|
+
# Custom expiry (1 hour)
|
|
487
|
+
agent-fs signed-url docs/report.pdf --expires-in 3600
|
|
488
|
+
|
|
489
|
+
# JSON output (useful for agents)
|
|
490
|
+
agent-fs signed-url docs/report.pdf --json
|
|
491
|
+
# \u2192 { "url": "https://...", "path": "/docs/report.pdf", "expiresIn": 86400, "expiresAt": "2026-03-20T..." }
|
|
492
|
+
\`\`\`
|
|
493
|
+
|
|
494
|
+
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.
|
|
495
|
+
|
|
496
|
+
**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.
|
|
497
|
+
|
|
498
|
+
### App URL in responses
|
|
499
|
+
|
|
500
|
+
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:
|
|
501
|
+
|
|
502
|
+
\`\`\`bash
|
|
503
|
+
AGENT_FS_APP_URL=https://live.agent-fs.dev agent-fs stat docs/report.pdf --json
|
|
504
|
+
# \u2192 { ..., "appUrl": "https://live.agent-fs.dev/file/~/org-id/drive-id/docs/report.pdf" }
|
|
505
|
+
\`\`\`
|
|
506
|
+
|
|
507
|
+
This applies to any op that returns a \`path\` or \`to\` field (write, stat, edit, append, rm, cp, mv, signed-url, etc.).
|
|
508
|
+
|
|
430
509
|
### Validate your setup
|
|
431
510
|
|
|
432
511
|
\`\`\`bash
|
|
433
512
|
agent-fs config validate
|
|
434
513
|
\`\`\`
|
|
435
|
-
`;function
|
|
514
|
+
`;function QE(){return new wT("docs").description("Show agent-fs documentation and command reference").action(()=>{let t=BE.replace(/^---[\s\S]*?---\n*/,"");console.log(t)})}var F=new QT;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 Mt=new Vo;async function tn(){let t=F.opts().org;if(t)return t;let e=v();if(e.defaultOrg)return e.defaultOrg;try{let n=await Mt.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(QE());UE(F,Mt,tn);F.addCommand(cE(Mt));F.addCommand($E());F.addCommand(ME());F.addCommand(XE(Mt,tn));F.addCommand(FE(Mt));F.addCommand(HE());F.addCommand(ze());F.addCommand(YE(Mt,tn));F.addCommand(ZE(Mt,tn));F.command("mcp").description("Start MCP server (stdio)").action(async()=>{await JE().then(() => aT)});F.command("server").description("Run server in foreground (dev mode)").action(async()=>{await Al().then(() => BT)});var VT=`
|
|
436
515
|
Global Options:
|
|
437
516
|
--org <orgId> Override org context
|
|
438
517
|
--drive <driveId> Override drive context
|
|
439
518
|
--json Output raw JSON
|
|
440
|
-
`;for(let t of
|
|
519
|
+
`;for(let t of F.commands)t.addHelpText("after",VT);F.parse();
|