@openharness/provider-vfs 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/__tests__/vfs-provider.test.d.ts +2 -0
- package/dist/__tests__/vfs-provider.test.d.ts.map +1 -0
- package/dist/__tests__/vfs-provider.test.js +168 -0
- package/dist/__tests__/vfs-provider.test.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/vfs-provider.d.ts +97 -0
- package/dist/vfs-provider.d.ts.map +1 -0
- package/dist/vfs-provider.js +199 -0
- package/dist/vfs-provider.js.map +1 -0
- package/package.json +6 -3
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Max Gfeller
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vfs-provider.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/vfs-provider.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from "vitest";
|
|
2
|
+
import { VfsFsProvider, FileTooLargeError } from "../vfs-provider.js";
|
|
3
|
+
import { MemoryProvider, create } from "@platformatic/vfs";
|
|
4
|
+
// ── Helpers ─────────────────────────────────────────────────────────
|
|
5
|
+
let provider;
|
|
6
|
+
beforeEach(() => {
|
|
7
|
+
const vfs = create(new MemoryProvider(), { moduleHooks: false, virtualCwd: true });
|
|
8
|
+
vfs.mount("/workspace");
|
|
9
|
+
provider = new VfsFsProvider({ vfs, mountPoint: "/workspace" });
|
|
10
|
+
});
|
|
11
|
+
// ── Basic read/write ────────────────────────────────────────────────
|
|
12
|
+
describe("readFile / writeFile", () => {
|
|
13
|
+
it("writes and reads a file", async () => {
|
|
14
|
+
await provider.writeFile("/workspace/hello.txt", "hello world");
|
|
15
|
+
const content = await provider.readFile("/workspace/hello.txt");
|
|
16
|
+
expect(content).toBe("hello world");
|
|
17
|
+
});
|
|
18
|
+
it("creates parent directories on write", async () => {
|
|
19
|
+
await provider.writeFile("/workspace/a/b/c.txt", "nested");
|
|
20
|
+
const content = await provider.readFile("/workspace/a/b/c.txt");
|
|
21
|
+
expect(content).toBe("nested");
|
|
22
|
+
});
|
|
23
|
+
it("overwrites existing files", async () => {
|
|
24
|
+
await provider.writeFile("/workspace/file.txt", "first");
|
|
25
|
+
await provider.writeFile("/workspace/file.txt", "second");
|
|
26
|
+
const content = await provider.readFile("/workspace/file.txt");
|
|
27
|
+
expect(content).toBe("second");
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
// ── Size guard ──────────────────────────────────────────────────────
|
|
31
|
+
describe("maxFileSize", () => {
|
|
32
|
+
it("throws FileTooLargeError for oversized files", async () => {
|
|
33
|
+
const vfs = create(new MemoryProvider(), { moduleHooks: false, virtualCwd: true });
|
|
34
|
+
vfs.mount("/workspace");
|
|
35
|
+
const small = new VfsFsProvider({ vfs, maxFileSize: 10 });
|
|
36
|
+
await small.writeFile("/workspace/big.txt", "a".repeat(100));
|
|
37
|
+
await expect(small.readFile("/workspace/big.txt")).rejects.toThrow(FileTooLargeError);
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
// ── exists ──────────────────────────────────────────────────────────
|
|
41
|
+
describe("exists", () => {
|
|
42
|
+
it("returns false for non-existent paths", async () => {
|
|
43
|
+
expect(await provider.exists("/workspace/nope.txt")).toBe(false);
|
|
44
|
+
});
|
|
45
|
+
it("returns true for existing files", async () => {
|
|
46
|
+
await provider.writeFile("/workspace/yep.txt", "hi");
|
|
47
|
+
expect(await provider.exists("/workspace/yep.txt")).toBe(true);
|
|
48
|
+
});
|
|
49
|
+
it("returns true for existing directories", async () => {
|
|
50
|
+
await provider.mkdir("/workspace/dir");
|
|
51
|
+
expect(await provider.exists("/workspace/dir")).toBe(true);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
// ── stat ────────────────────────────────────────────────────────────
|
|
55
|
+
describe("stat", () => {
|
|
56
|
+
it("returns file stat", async () => {
|
|
57
|
+
await provider.writeFile("/workspace/file.txt", "content");
|
|
58
|
+
const stat = await provider.stat("/workspace/file.txt");
|
|
59
|
+
expect(stat.isFile).toBe(true);
|
|
60
|
+
expect(stat.isDirectory).toBe(false);
|
|
61
|
+
expect(stat.size).toBe(7);
|
|
62
|
+
});
|
|
63
|
+
it("returns directory stat", async () => {
|
|
64
|
+
await provider.mkdir("/workspace/dir");
|
|
65
|
+
const stat = await provider.stat("/workspace/dir");
|
|
66
|
+
expect(stat.isFile).toBe(false);
|
|
67
|
+
expect(stat.isDirectory).toBe(true);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
// ── readdir ─────────────────────────────────────────────────────────
|
|
71
|
+
describe("readdir", () => {
|
|
72
|
+
it("lists directory entries", async () => {
|
|
73
|
+
await provider.writeFile("/workspace/a.txt", "a");
|
|
74
|
+
await provider.writeFile("/workspace/b.txt", "b");
|
|
75
|
+
await provider.mkdir("/workspace/subdir");
|
|
76
|
+
const entries = await provider.readdir("/workspace");
|
|
77
|
+
const names = entries.map((e) => e.name).sort();
|
|
78
|
+
expect(names).toContain("a.txt");
|
|
79
|
+
expect(names).toContain("b.txt");
|
|
80
|
+
expect(names).toContain("subdir");
|
|
81
|
+
const subdir = entries.find((e) => e.name === "subdir");
|
|
82
|
+
expect(subdir.isDirectory).toBe(true);
|
|
83
|
+
expect(subdir.isFile).toBe(false);
|
|
84
|
+
const file = entries.find((e) => e.name === "a.txt");
|
|
85
|
+
expect(file.isFile).toBe(true);
|
|
86
|
+
expect(file.isDirectory).toBe(false);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
// ── mkdir ───────────────────────────────────────────────────────────
|
|
90
|
+
describe("mkdir", () => {
|
|
91
|
+
it("creates a directory", async () => {
|
|
92
|
+
await provider.mkdir("/workspace/newdir");
|
|
93
|
+
const stat = await provider.stat("/workspace/newdir");
|
|
94
|
+
expect(stat.isDirectory).toBe(true);
|
|
95
|
+
});
|
|
96
|
+
it("creates nested directories with recursive", async () => {
|
|
97
|
+
await provider.mkdir("/workspace/a/b/c", { recursive: true });
|
|
98
|
+
const stat = await provider.stat("/workspace/a/b/c");
|
|
99
|
+
expect(stat.isDirectory).toBe(true);
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
// ── remove ──────────────────────────────────────────────────────────
|
|
103
|
+
describe("remove", () => {
|
|
104
|
+
it("removes a file", async () => {
|
|
105
|
+
await provider.writeFile("/workspace/bye.txt", "gone");
|
|
106
|
+
await provider.remove("/workspace/bye.txt");
|
|
107
|
+
expect(await provider.exists("/workspace/bye.txt")).toBe(false);
|
|
108
|
+
});
|
|
109
|
+
it("throws when removing directory without recursive", async () => {
|
|
110
|
+
await provider.mkdir("/workspace/dir");
|
|
111
|
+
await expect(provider.remove("/workspace/dir")).rejects.toThrow(/directory/i);
|
|
112
|
+
});
|
|
113
|
+
it("removes directory recursively", async () => {
|
|
114
|
+
await provider.writeFile("/workspace/dir/a.txt", "a");
|
|
115
|
+
await provider.writeFile("/workspace/dir/sub/b.txt", "b");
|
|
116
|
+
await provider.remove("/workspace/dir", { recursive: true });
|
|
117
|
+
expect(await provider.exists("/workspace/dir")).toBe(false);
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
// ── rename ──────────────────────────────────────────────────────────
|
|
121
|
+
describe("rename", () => {
|
|
122
|
+
it("renames a file", async () => {
|
|
123
|
+
await provider.writeFile("/workspace/old.txt", "content");
|
|
124
|
+
await provider.rename("/workspace/old.txt", "/workspace/new.txt");
|
|
125
|
+
expect(await provider.exists("/workspace/old.txt")).toBe(false);
|
|
126
|
+
const content = await provider.readFile("/workspace/new.txt");
|
|
127
|
+
expect(content).toBe("content");
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
// ── resolvePath ─────────────────────────────────────────────────────
|
|
131
|
+
describe("resolvePath", () => {
|
|
132
|
+
it("returns absolute paths unchanged", () => {
|
|
133
|
+
const resolved = provider.resolvePath("/workspace/file.txt");
|
|
134
|
+
expect(resolved).toBe("/workspace/file.txt");
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
// ── Integration with createFsTools ──────────────────────────────────
|
|
138
|
+
describe("integration with createFsTools", () => {
|
|
139
|
+
it("tools work with VFS provider", async () => {
|
|
140
|
+
// Dynamic import to avoid circular dependency issues at load time
|
|
141
|
+
const { createFsTools } = await import("@openharness/core");
|
|
142
|
+
const tools = createFsTools(provider);
|
|
143
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
144
|
+
const exec = async (tool, input) => tool.execute(input, { toolCallId: "test", messages: [] });
|
|
145
|
+
// Write via tool
|
|
146
|
+
await exec(tools.writeFile, { filePath: "/workspace/test.txt", content: "hello from tools" });
|
|
147
|
+
// Read via tool
|
|
148
|
+
const result = await exec(tools.readFile, { filePath: "/workspace/test.txt" });
|
|
149
|
+
expect(result.content).toContain("hello from tools");
|
|
150
|
+
expect(result.totalLines).toBe(1);
|
|
151
|
+
// Edit via tool
|
|
152
|
+
await exec(tools.editFile, {
|
|
153
|
+
filePath: "/workspace/test.txt",
|
|
154
|
+
oldString: "hello",
|
|
155
|
+
newString: "goodbye",
|
|
156
|
+
replaceAll: false,
|
|
157
|
+
});
|
|
158
|
+
const edited = await exec(tools.readFile, { filePath: "/workspace/test.txt" });
|
|
159
|
+
expect(edited.content).toContain("goodbye from tools");
|
|
160
|
+
// List via tool
|
|
161
|
+
const listed = await exec(tools.listFiles, { dirPath: "/workspace", recursive: false });
|
|
162
|
+
expect(listed.entries.some((e) => e.name === "test.txt")).toBe(true);
|
|
163
|
+
// Delete via tool
|
|
164
|
+
await exec(tools.deleteFile, { filePath: "/workspace/test.txt", recursive: false });
|
|
165
|
+
expect(await provider.exists("/workspace/test.txt")).toBe(false);
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
//# sourceMappingURL=vfs-provider.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vfs-provider.test.js","sourceRoot":"","sources":["../../src/__tests__/vfs-provider.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACnF,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import type { FsProvider, FileStat, DirEntry } from "@openharness/core/providers";
|
|
2
|
+
interface VfsStats {
|
|
3
|
+
isFile(): boolean;
|
|
4
|
+
isDirectory(): boolean;
|
|
5
|
+
size: number;
|
|
6
|
+
}
|
|
7
|
+
interface VfsDirent {
|
|
8
|
+
name: string;
|
|
9
|
+
isFile(): boolean;
|
|
10
|
+
isDirectory(): boolean;
|
|
11
|
+
}
|
|
12
|
+
interface VfsPromisesApi {
|
|
13
|
+
readFile(path: string, options?: {
|
|
14
|
+
encoding?: string;
|
|
15
|
+
} | string): Promise<string | Buffer>;
|
|
16
|
+
writeFile(path: string, data: string | Buffer, options?: {
|
|
17
|
+
encoding?: string;
|
|
18
|
+
} | string): Promise<void>;
|
|
19
|
+
stat(path: string): Promise<VfsStats>;
|
|
20
|
+
readdir(path: string, options?: {
|
|
21
|
+
withFileTypes?: boolean;
|
|
22
|
+
}): Promise<string[] | VfsDirent[]>;
|
|
23
|
+
mkdir(path: string, options?: {
|
|
24
|
+
recursive?: boolean;
|
|
25
|
+
}): Promise<string | undefined>;
|
|
26
|
+
rmdir(path: string): Promise<void>;
|
|
27
|
+
unlink(path: string): Promise<void>;
|
|
28
|
+
rename(oldPath: string, newPath: string): Promise<void>;
|
|
29
|
+
access(path: string, mode?: number): Promise<void>;
|
|
30
|
+
}
|
|
31
|
+
interface VirtualFileSystem {
|
|
32
|
+
promises: VfsPromisesApi;
|
|
33
|
+
existsSync(path: string): boolean;
|
|
34
|
+
resolvePath(path: string): string;
|
|
35
|
+
mount(prefix: string): VirtualFileSystem;
|
|
36
|
+
unmount(): void;
|
|
37
|
+
readonly mounted: boolean;
|
|
38
|
+
}
|
|
39
|
+
interface VfsModule {
|
|
40
|
+
create(provider?: unknown, options?: VfsCreateOptions): VirtualFileSystem;
|
|
41
|
+
create(options?: VfsCreateOptions): VirtualFileSystem;
|
|
42
|
+
MemoryProvider: new () => unknown;
|
|
43
|
+
SqliteProvider: new (path?: string) => unknown;
|
|
44
|
+
RealFSProvider: new (rootPath: string) => unknown;
|
|
45
|
+
}
|
|
46
|
+
interface VfsCreateOptions {
|
|
47
|
+
moduleHooks?: boolean;
|
|
48
|
+
overlay?: boolean;
|
|
49
|
+
virtualCwd?: boolean;
|
|
50
|
+
}
|
|
51
|
+
declare function getVfsModule(): Promise<VfsModule>;
|
|
52
|
+
export interface VfsFsProviderOptions {
|
|
53
|
+
/** A pre-created VirtualFileSystem instance. If provided, provider/vfsOptions/mountPoint are ignored. */
|
|
54
|
+
vfs?: VirtualFileSystem;
|
|
55
|
+
/** VFS provider instance (MemoryProvider, SqliteProvider, RealFSProvider). Defaults to MemoryProvider. */
|
|
56
|
+
provider?: unknown;
|
|
57
|
+
/** Options passed to vfs create(). Defaults to { moduleHooks: false, virtualCwd: true }. */
|
|
58
|
+
vfsOptions?: VfsCreateOptions;
|
|
59
|
+
/** Mount point for the VFS. Defaults to "/workspace". */
|
|
60
|
+
mountPoint?: string;
|
|
61
|
+
/** Maximum file size in bytes that readFile will load. Defaults to 10 MB. */
|
|
62
|
+
maxFileSize?: number;
|
|
63
|
+
}
|
|
64
|
+
export declare class VfsFsProvider implements FsProvider {
|
|
65
|
+
private vfs;
|
|
66
|
+
private initPromise;
|
|
67
|
+
private options;
|
|
68
|
+
private maxFileSize;
|
|
69
|
+
constructor(options?: VfsFsProviderOptions);
|
|
70
|
+
private ensureInitialized;
|
|
71
|
+
private initialize;
|
|
72
|
+
/** Get the underlying VirtualFileSystem instance (initializes lazily if needed). */
|
|
73
|
+
getVfs(): Promise<VirtualFileSystem>;
|
|
74
|
+
resolvePath(filePath: string): string;
|
|
75
|
+
readFile(filePath: string): Promise<string>;
|
|
76
|
+
writeFile(filePath: string, content: string): Promise<void>;
|
|
77
|
+
exists(filePath: string): Promise<boolean>;
|
|
78
|
+
stat(filePath: string): Promise<FileStat>;
|
|
79
|
+
readdir(dirPath: string): Promise<DirEntry[]>;
|
|
80
|
+
mkdir(dirPath: string, options?: {
|
|
81
|
+
recursive?: boolean;
|
|
82
|
+
}): Promise<void>;
|
|
83
|
+
remove(filePath: string, options?: {
|
|
84
|
+
recursive?: boolean;
|
|
85
|
+
}): Promise<void>;
|
|
86
|
+
rename(oldPath: string, newPath: string): Promise<void>;
|
|
87
|
+
/** Recursively remove a directory since VFS lacks `rm`. */
|
|
88
|
+
private removeRecursive;
|
|
89
|
+
}
|
|
90
|
+
export declare class FileTooLargeError extends Error {
|
|
91
|
+
readonly filePath: string;
|
|
92
|
+
readonly fileSize: number;
|
|
93
|
+
readonly maxSize: number;
|
|
94
|
+
constructor(filePath: string, fileSize: number, maxSize: number);
|
|
95
|
+
}
|
|
96
|
+
export { getVfsModule };
|
|
97
|
+
//# sourceMappingURL=vfs-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vfs-provider.d.ts","sourceRoot":"","sources":["../src/vfs-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
// ── Runtime module resolution ───────────────────────────────────────
|
|
2
|
+
let cachedModule;
|
|
3
|
+
async function getVfsModule() {
|
|
4
|
+
if (cachedModule)
|
|
5
|
+
return cachedModule;
|
|
6
|
+
try {
|
|
7
|
+
// Try native node:vfs first (future Node.js versions)
|
|
8
|
+
// @ts-expect-error -- node:vfs does not exist yet; will resolve once Node ships it
|
|
9
|
+
cachedModule = (await import("node:vfs"));
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
try {
|
|
13
|
+
// Fall back to userland @platformatic/vfs
|
|
14
|
+
cachedModule = (await import("@platformatic/vfs"));
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
throw new Error("No VFS module available. Install @platformatic/vfs (requires Node >= 22) " +
|
|
18
|
+
"or use a Node.js version with built-in node:vfs support.");
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return cachedModule;
|
|
22
|
+
}
|
|
23
|
+
// ── VfsFsProvider ───────────────────────────────────────────────────
|
|
24
|
+
const DEFAULT_MAX_FILE_SIZE = 10 * 1024 * 1024; // 10 MB
|
|
25
|
+
export class VfsFsProvider {
|
|
26
|
+
vfs;
|
|
27
|
+
initPromise;
|
|
28
|
+
options;
|
|
29
|
+
maxFileSize;
|
|
30
|
+
constructor(options) {
|
|
31
|
+
this.options = options ?? {};
|
|
32
|
+
this.maxFileSize = options?.maxFileSize ?? DEFAULT_MAX_FILE_SIZE;
|
|
33
|
+
if (options?.vfs) {
|
|
34
|
+
this.vfs = options.vfs;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async ensureInitialized() {
|
|
38
|
+
if (this.vfs)
|
|
39
|
+
return this.vfs;
|
|
40
|
+
if (!this.initPromise) {
|
|
41
|
+
this.initPromise = this.initialize();
|
|
42
|
+
}
|
|
43
|
+
await this.initPromise;
|
|
44
|
+
return this.vfs;
|
|
45
|
+
}
|
|
46
|
+
async initialize() {
|
|
47
|
+
const mod = await getVfsModule();
|
|
48
|
+
const provider = this.options.provider ?? new mod.MemoryProvider();
|
|
49
|
+
const vfsOptions = this.options.vfsOptions ?? {
|
|
50
|
+
moduleHooks: false,
|
|
51
|
+
virtualCwd: true,
|
|
52
|
+
};
|
|
53
|
+
this.vfs = mod.create(provider, vfsOptions);
|
|
54
|
+
const mountPoint = this.options.mountPoint ?? "/workspace";
|
|
55
|
+
if (!this.vfs.mounted) {
|
|
56
|
+
this.vfs.mount(mountPoint);
|
|
57
|
+
}
|
|
58
|
+
// Initialize virtual CWD to the mount point
|
|
59
|
+
if (vfsOptions.virtualCwd !== false) {
|
|
60
|
+
this.vfs.resolvePath(mountPoint);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/** Get the underlying VirtualFileSystem instance (initializes lazily if needed). */
|
|
64
|
+
async getVfs() {
|
|
65
|
+
return this.ensureInitialized();
|
|
66
|
+
}
|
|
67
|
+
resolvePath(filePath) {
|
|
68
|
+
if (!this.vfs) {
|
|
69
|
+
// Before initialization, return the path as-is — the caller should
|
|
70
|
+
// await an operation (which triggers init) before using resolvePath.
|
|
71
|
+
const mountPoint = this.options.mountPoint ?? "/workspace";
|
|
72
|
+
if (filePath.startsWith("/"))
|
|
73
|
+
return filePath;
|
|
74
|
+
return mountPoint + (mountPoint.endsWith("/") ? "" : "/") + filePath;
|
|
75
|
+
}
|
|
76
|
+
return this.vfs.resolvePath(filePath);
|
|
77
|
+
}
|
|
78
|
+
async readFile(filePath) {
|
|
79
|
+
const vfs = await this.ensureInitialized();
|
|
80
|
+
const resolved = vfs.resolvePath(filePath);
|
|
81
|
+
// Size guard
|
|
82
|
+
const stat = await vfs.promises.stat(resolved);
|
|
83
|
+
if (stat.size > this.maxFileSize) {
|
|
84
|
+
throw new FileTooLargeError(resolved, stat.size, this.maxFileSize);
|
|
85
|
+
}
|
|
86
|
+
const content = await vfs.promises.readFile(resolved, "utf-8");
|
|
87
|
+
return typeof content === "string" ? content : content.toString("utf-8");
|
|
88
|
+
}
|
|
89
|
+
async writeFile(filePath, content) {
|
|
90
|
+
const vfs = await this.ensureInitialized();
|
|
91
|
+
const resolved = vfs.resolvePath(filePath);
|
|
92
|
+
// Create parent directories
|
|
93
|
+
const parentDir = dirname(resolved);
|
|
94
|
+
if (parentDir !== resolved) {
|
|
95
|
+
await vfs.promises.mkdir(parentDir, { recursive: true });
|
|
96
|
+
}
|
|
97
|
+
await vfs.promises.writeFile(resolved, content, "utf-8");
|
|
98
|
+
}
|
|
99
|
+
async exists(filePath) {
|
|
100
|
+
const vfs = await this.ensureInitialized();
|
|
101
|
+
const resolved = vfs.resolvePath(filePath);
|
|
102
|
+
try {
|
|
103
|
+
await vfs.promises.access(resolved);
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
async stat(filePath) {
|
|
111
|
+
const vfs = await this.ensureInitialized();
|
|
112
|
+
const resolved = vfs.resolvePath(filePath);
|
|
113
|
+
const stat = await vfs.promises.stat(resolved);
|
|
114
|
+
return {
|
|
115
|
+
isFile: stat.isFile(),
|
|
116
|
+
isDirectory: stat.isDirectory(),
|
|
117
|
+
size: stat.size,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
async readdir(dirPath) {
|
|
121
|
+
const vfs = await this.ensureInitialized();
|
|
122
|
+
const resolved = vfs.resolvePath(dirPath);
|
|
123
|
+
const entries = (await vfs.promises.readdir(resolved, { withFileTypes: true }));
|
|
124
|
+
return entries.map((e) => ({
|
|
125
|
+
name: e.name,
|
|
126
|
+
isFile: e.isFile(),
|
|
127
|
+
isDirectory: e.isDirectory(),
|
|
128
|
+
}));
|
|
129
|
+
}
|
|
130
|
+
async mkdir(dirPath, options) {
|
|
131
|
+
const vfs = await this.ensureInitialized();
|
|
132
|
+
const resolved = vfs.resolvePath(dirPath);
|
|
133
|
+
await vfs.promises.mkdir(resolved, { recursive: options?.recursive });
|
|
134
|
+
}
|
|
135
|
+
async remove(filePath, options) {
|
|
136
|
+
const vfs = await this.ensureInitialized();
|
|
137
|
+
const resolved = vfs.resolvePath(filePath);
|
|
138
|
+
const stat = await vfs.promises.stat(resolved);
|
|
139
|
+
if (stat.isDirectory()) {
|
|
140
|
+
if (!options?.recursive) {
|
|
141
|
+
throw new Error(`Path is a directory. Set recursive to true to delete it: ${resolved}`);
|
|
142
|
+
}
|
|
143
|
+
await this.removeRecursive(vfs, resolved);
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
await vfs.promises.unlink(resolved);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
async rename(oldPath, newPath) {
|
|
150
|
+
const vfs = await this.ensureInitialized();
|
|
151
|
+
await vfs.promises.rename(vfs.resolvePath(oldPath), vfs.resolvePath(newPath));
|
|
152
|
+
}
|
|
153
|
+
// ── Private helpers ─────────────────────────────────────────────
|
|
154
|
+
/** Recursively remove a directory since VFS lacks `rm`. */
|
|
155
|
+
async removeRecursive(vfs, dirPath) {
|
|
156
|
+
const entries = (await vfs.promises.readdir(dirPath, { withFileTypes: true }));
|
|
157
|
+
for (const entry of entries) {
|
|
158
|
+
const fullPath = dirPath + "/" + entry.name;
|
|
159
|
+
if (entry.isDirectory()) {
|
|
160
|
+
await this.removeRecursive(vfs, fullPath);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
await vfs.promises.unlink(fullPath);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
await vfs.promises.rmdir(dirPath);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// ── Errors ──────────────────────────────────────────────────────────
|
|
170
|
+
export class FileTooLargeError extends Error {
|
|
171
|
+
filePath;
|
|
172
|
+
fileSize;
|
|
173
|
+
maxSize;
|
|
174
|
+
constructor(filePath, fileSize, maxSize) {
|
|
175
|
+
super(`File too large: ${filePath} is ${formatBytes(fileSize)} (limit: ${formatBytes(maxSize)}). ` +
|
|
176
|
+
`Use offset and limit parameters to read a portion of the file, or use grep to search it.`);
|
|
177
|
+
this.filePath = filePath;
|
|
178
|
+
this.fileSize = fileSize;
|
|
179
|
+
this.maxSize = maxSize;
|
|
180
|
+
this.name = "FileTooLargeError";
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// ── Utilities ───────────────────────────────────────────────────────
|
|
184
|
+
function dirname(filePath) {
|
|
185
|
+
const lastSlash = filePath.lastIndexOf("/");
|
|
186
|
+
if (lastSlash <= 0)
|
|
187
|
+
return "/";
|
|
188
|
+
return filePath.slice(0, lastSlash);
|
|
189
|
+
}
|
|
190
|
+
function formatBytes(bytes) {
|
|
191
|
+
if (bytes < 1024)
|
|
192
|
+
return `${bytes} B`;
|
|
193
|
+
if (bytes < 1024 * 1024)
|
|
194
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
195
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
196
|
+
}
|
|
197
|
+
// ── Convenience: re-export getVfsModule for advanced usage ──────────
|
|
198
|
+
export { getVfsModule };
|
|
199
|
+
//# sourceMappingURL=vfs-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vfs-provider.js","sourceRoot":"","sources":["../src/vfs-provider.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openharness/provider-vfs",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Virtual filesystem provider for @openharness/core — sandboxed, in-memory, or SQLite-backed file access for AI agents",
|
|
6
6
|
"exports": {
|
|
@@ -13,6 +13,9 @@
|
|
|
13
13
|
"dist",
|
|
14
14
|
"README.md"
|
|
15
15
|
],
|
|
16
|
+
"publishConfig": {
|
|
17
|
+
"access": "public"
|
|
18
|
+
},
|
|
16
19
|
"keywords": [
|
|
17
20
|
"agent",
|
|
18
21
|
"ai",
|
|
@@ -21,9 +24,9 @@
|
|
|
21
24
|
"sandbox",
|
|
22
25
|
"openharness"
|
|
23
26
|
],
|
|
24
|
-
"license": "
|
|
27
|
+
"license": "MIT",
|
|
25
28
|
"dependencies": {
|
|
26
|
-
"@openharness/core": "0.
|
|
29
|
+
"@openharness/core": "^0.5.3"
|
|
27
30
|
},
|
|
28
31
|
"peerDependencies": {
|
|
29
32
|
"@platformatic/vfs": ">=0.3.0"
|