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