@stablemodels/durable-bash 0.1.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.
@@ -0,0 +1,175 @@
1
+ import { normalizePath } from "./fs-object.js";
2
+ /**
3
+ * IFileSystem implementation backed by a Durable Object.
4
+ * Every filesystem operation is delegated to the FsObject DO over RPC.
5
+ *
6
+ * Use the static `create()` factory for easy setup:
7
+ * ```ts
8
+ * const fs = await DurableFs.create(env.FS, "my-agent");
9
+ * ```
10
+ */
11
+ export class DurableFs {
12
+ stub;
13
+ cwd;
14
+ _cachedPaths = new Set();
15
+ constructor(stub, cwd = "/") {
16
+ this.stub = stub;
17
+ this.cwd = cwd;
18
+ }
19
+ /**
20
+ * Create a ready-to-use DurableFs from a DO namespace and instance name.
21
+ * Handles stub creation and initial sync in one call.
22
+ */
23
+ static async create(namespace, name, cwd = "/") {
24
+ const id = namespace.idFromName(name);
25
+ const stub = namespace.get(id);
26
+ const fs = new DurableFs(stub, cwd);
27
+ await fs.sync();
28
+ return fs;
29
+ }
30
+ /**
31
+ * Refresh the local path cache from the DO.
32
+ * Called automatically by `create()`. Only needed if you modify
33
+ * the DO outside of this DurableFs instance.
34
+ */
35
+ async sync() {
36
+ const paths = await this.stub.getAllPaths();
37
+ this._cachedPaths = new Set(paths);
38
+ }
39
+ async readFile(path, _options) {
40
+ const result = await this.stub.readFile(this.resolve(path));
41
+ return result.content;
42
+ }
43
+ async readFileBuffer(path) {
44
+ const result = await this.stub.readFileBuffer(this.resolve(path));
45
+ return result.content;
46
+ }
47
+ async writeFile(path, content, _options) {
48
+ const resolved = this.resolve(path);
49
+ await this.stub.writeFile(resolved, content);
50
+ this.addToCache(resolved);
51
+ }
52
+ async appendFile(path, content, _options) {
53
+ const resolved = this.resolve(path);
54
+ await this.stub.appendFile(resolved, content);
55
+ this.addToCache(resolved);
56
+ }
57
+ async exists(path) {
58
+ return this.stub.exists(this.resolve(path));
59
+ }
60
+ async stat(path) {
61
+ const data = await this.stub.stat(this.resolve(path));
62
+ return toFsStat(data);
63
+ }
64
+ async lstat(path) {
65
+ const data = await this.stub.lstat(this.resolve(path));
66
+ return toFsStat(data);
67
+ }
68
+ async mkdir(path, options) {
69
+ const resolved = this.resolve(path);
70
+ await this.stub.mkdir(resolved, options);
71
+ this.addToCache(resolved);
72
+ }
73
+ async readdir(path) {
74
+ return this.stub.readdir(this.resolve(path));
75
+ }
76
+ async readdirWithFileTypes(path) {
77
+ const entries = await this.stub.readdirWithFileTypes(this.resolve(path));
78
+ return entries.map((e) => ({
79
+ name: e.name,
80
+ isFile: e.isFile,
81
+ isDirectory: e.isDirectory,
82
+ isSymbolicLink: e.isSymlink,
83
+ }));
84
+ }
85
+ async rm(path, options) {
86
+ const resolved = this.resolve(path);
87
+ await this.stub.rm(resolved, options);
88
+ this.removeFromCache(resolved);
89
+ }
90
+ async cp(src, dest, options) {
91
+ await this.stub.cp(this.resolve(src), this.resolve(dest), options);
92
+ // Re-sync cache since cp can create many paths
93
+ await this.sync();
94
+ }
95
+ async mv(src, dest) {
96
+ await this.stub.mv(this.resolve(src), this.resolve(dest));
97
+ // Re-sync cache since mv can move many paths
98
+ await this.sync();
99
+ }
100
+ resolvePath(base, path) {
101
+ if (path.startsWith("/"))
102
+ return normalizePath(path);
103
+ return normalizePath(`${base}/${path}`);
104
+ }
105
+ getAllPaths() {
106
+ return [...this._cachedPaths].sort();
107
+ }
108
+ async chmod(path, mode) {
109
+ await this.stub.chmod(this.resolve(path), mode);
110
+ }
111
+ async symlink(target, linkPath) {
112
+ const resolved = this.resolve(linkPath);
113
+ await this.stub.symlink(target, resolved);
114
+ this.addToCache(resolved);
115
+ }
116
+ async link(existingPath, newPath) {
117
+ const resolvedNew = this.resolve(newPath);
118
+ await this.stub.link(this.resolve(existingPath), resolvedNew);
119
+ this.addToCache(resolvedNew);
120
+ }
121
+ async readlink(path) {
122
+ return this.stub.readlink(this.resolve(path));
123
+ }
124
+ async realpath(path) {
125
+ return this.stub.realpath(this.resolve(path));
126
+ }
127
+ async utimes(path, atime, mtime) {
128
+ await this.stub.utimes(this.resolve(path), atime.getTime(), mtime.getTime());
129
+ }
130
+ // --- Private helpers ---
131
+ resolve(path) {
132
+ return this.resolvePath(this.cwd, path);
133
+ }
134
+ /**
135
+ * Add a path and all its ancestor directories to the cache.
136
+ * The DO auto-creates parent dirs on write, so the cache must reflect them.
137
+ */
138
+ addToCache(path) {
139
+ this._cachedPaths.add(path);
140
+ let dir = path;
141
+ while (true) {
142
+ const idx = dir.lastIndexOf("/");
143
+ if (idx <= 0) {
144
+ this._cachedPaths.add("/");
145
+ break;
146
+ }
147
+ dir = dir.substring(0, idx);
148
+ if (this._cachedPaths.has(dir))
149
+ break;
150
+ this._cachedPaths.add(dir);
151
+ }
152
+ }
153
+ removeFromCache(path) {
154
+ this._cachedPaths.delete(path);
155
+ const prefix = `${path}/`;
156
+ // Safe to delete during Set iteration per ES spec — the iterator
157
+ // will not visit deleted entries but will complete correctly.
158
+ for (const p of this._cachedPaths) {
159
+ if (p.startsWith(prefix)) {
160
+ this._cachedPaths.delete(p);
161
+ }
162
+ }
163
+ }
164
+ }
165
+ function toFsStat(data) {
166
+ return {
167
+ isFile: !data.isDir && !data.isSymlink,
168
+ isDirectory: data.isDir,
169
+ isSymbolicLink: data.isSymlink,
170
+ mode: data.mode,
171
+ size: data.size,
172
+ mtime: new Date(data.mtimeMs),
173
+ };
174
+ }
175
+ //# sourceMappingURL=durable-fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durable-fs.js","sourceRoot":"","sources":["../src/durable-fs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export declare class FsError extends Error {
2
+ readonly code: string;
3
+ readonly path?: string | undefined;
4
+ constructor(code: string, message: string, path?: string | undefined);
5
+ }
6
+ export declare const ENOENT: (path: string) => FsError;
7
+ export declare const EEXIST: (path: string) => FsError;
8
+ export declare const EISDIR: (path: string) => FsError;
9
+ export declare const ENOTDIR: (path: string) => FsError;
10
+ export declare const ENOTEMPTY: (path: string) => FsError;
11
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,OAAQ,SAAQ,KAAK;aAEhB,IAAI,EAAE,MAAM;aAEZ,IAAI,CAAC,EAAE,MAAM;gBAFb,IAAI,EAAE,MAAM,EAC5B,OAAO,EAAE,MAAM,EACC,IAAI,CAAC,EAAE,MAAM,YAAA;CAK9B;AAED,eAAO,MAAM,MAAM,GAAI,MAAM,MAAM,YACsB,CAAC;AAC1D,eAAO,MAAM,MAAM,GAAI,MAAM,MAAM,YACgB,CAAC;AACpD,eAAO,MAAM,MAAM,GAAI,MAAM,MAAM,YAC6B,CAAC;AACjE,eAAO,MAAM,OAAO,GAAI,MAAM,MAAM,YACY,CAAC;AACjD,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,YACgB,CAAC"}
package/dist/errors.js ADDED
@@ -0,0 +1,16 @@
1
+ export class FsError extends Error {
2
+ code;
3
+ path;
4
+ constructor(code, message, path) {
5
+ super(`${code}: ${message}${path ? `, '${path}'` : ""}`);
6
+ this.code = code;
7
+ this.path = path;
8
+ this.name = "FsError";
9
+ }
10
+ }
11
+ export const ENOENT = (path) => new FsError("ENOENT", "no such file or directory", path);
12
+ export const EEXIST = (path) => new FsError("EEXIST", "file already exists", path);
13
+ export const EISDIR = (path) => new FsError("EISDIR", "illegal operation on a directory", path);
14
+ export const ENOTDIR = (path) => new FsError("ENOTDIR", "not a directory", path);
15
+ export const ENOTEMPTY = (path) => new FsError("ENOTEMPTY", "directory not empty", path);
16
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,OAAQ,SAAQ,KAAK;IAEhB;IAEA;IAHjB,YACiB,IAAY,EAC5B,OAAe,EACC,IAAa;QAE7B,KAAK,CAAC,GAAG,IAAI,KAAK,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAJzC,SAAI,GAAJ,IAAI,CAAQ;QAEZ,SAAI,GAAJ,IAAI,CAAS;QAG7B,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;IACvB,CAAC;CACD;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE,CACtC,IAAI,OAAO,CAAC,QAAQ,EAAE,2BAA2B,EAAE,IAAI,CAAC,CAAC;AAC1D,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE,CACtC,IAAI,OAAO,CAAC,QAAQ,EAAE,qBAAqB,EAAE,IAAI,CAAC,CAAC;AACpD,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE,CACtC,IAAI,OAAO,CAAC,QAAQ,EAAE,kCAAkC,EAAE,IAAI,CAAC,CAAC;AACjE,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,EAAE,CACvC,IAAI,OAAO,CAAC,SAAS,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC;AACjD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAE,CACzC,IAAI,OAAO,CAAC,WAAW,EAAE,qBAAqB,EAAE,IAAI,CAAC,CAAC"}
@@ -0,0 +1,68 @@
1
+ import { DurableObject } from "cloudflare:workers";
2
+ import type { DirentData, FsStatData } from "./types.js";
3
+ /**
4
+ * Normalize a path: resolve `.` and `..`, remove trailing slashes, ensure leading `/`.
5
+ */
6
+ export declare function normalizePath(p: string): string;
7
+ export declare class FsObject extends DurableObject<any> {
8
+ private sql;
9
+ constructor(ctx: DurableObjectState, env: Record<string, unknown>);
10
+ private getRow;
11
+ private resolveSymlinks;
12
+ /**
13
+ * Resolve path through symlinks if it exists and is a symlink, otherwise return as-is.
14
+ */
15
+ private resolveTarget;
16
+ private ensureParentDirs;
17
+ private childPrefix;
18
+ private toBytes;
19
+ private bufferToString;
20
+ private bufferToUint8Array;
21
+ private extractChildName;
22
+ private ensureDirRow;
23
+ /**
24
+ * Insert or update a file entry.
25
+ */
26
+ private upsertFile;
27
+ readFile(path: string): {
28
+ content: string;
29
+ encoding: string;
30
+ };
31
+ readFileBuffer(path: string): {
32
+ content: Uint8Array;
33
+ };
34
+ writeFile(path: string, content: string | Uint8Array, opts?: {
35
+ mode?: number;
36
+ }): void;
37
+ appendFile(path: string, content: string | Uint8Array): void;
38
+ exists(path: string): boolean;
39
+ stat(path: string): FsStatData;
40
+ lstat(path: string): FsStatData;
41
+ mkdir(path: string, opts?: {
42
+ recursive?: boolean;
43
+ }): void;
44
+ readdir(path: string): string[];
45
+ readdirWithFileTypes(path: string): DirentData[];
46
+ rm(path: string, opts?: {
47
+ recursive?: boolean;
48
+ force?: boolean;
49
+ }): void;
50
+ cp(src: string, dest: string, opts?: {
51
+ recursive?: boolean;
52
+ }): void;
53
+ mv(src: string, dest: string): void;
54
+ chmod(path: string, mode: number): void;
55
+ symlink(target: string, linkPath: string): void;
56
+ /**
57
+ * Create a hard link. Note: this copies content at call time rather than
58
+ * sharing underlying storage — subsequent writes to one path will not
59
+ * update the other. This matches the IFileSystem contract but differs
60
+ * from POSIX hard link semantics.
61
+ */
62
+ link(existingPath: string, newPath: string): void;
63
+ readlink(path: string): string;
64
+ realpath(path: string): string;
65
+ utimes(path: string, _atimeMs: number, mtimeMs: number): void;
66
+ getAllPaths(): string[];
67
+ }
68
+ //# sourceMappingURL=fs-object.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-object.d.ts","sourceRoot":"","sources":["../src/fs-object.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AASnD,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAMzD;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAa/C;AA6BD,qBAAa,QAAS,SAAQ,aAAa,CAAC,GAAG,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAa;gBAEZ,GAAG,EAAE,kBAAkB,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IA4BjE,OAAO,CAAC,MAAM;IAQd,OAAO,CAAC,eAAe;IAcvB;;OAEG;IACH,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,YAAY;IAKpB;;OAEG;IACH,OAAO,CAAC,UAAU;IAwClB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;IAQ7D,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,UAAU,CAAA;KAAE;IAQrD,SAAS,CACR,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GAAG,UAAU,EAC5B,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GACtB,IAAI;IAsBP,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAmC5D,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI7B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU;IAa9B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU;IAa/B,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IA0BzD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAsB/B,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE;IA4ChD,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAwBvE,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IA6CnE,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IA0CnC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAOvC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAe/C;;;;;OAKG;IACH,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAsBjD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAU9B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAI9B,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAW7D,WAAW,IAAI,MAAM,EAAE;CAMvB"}