sdkwork-browser-agent 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +228 -0
- package/README.zh.md +228 -0
- package/dist/agent-Bpxmkz8W.d.ts +197 -0
- package/dist/agent-kexkkI13.d.cts +197 -0
- package/dist/browser/agent-Bpxmkz8W.d.ts +197 -0
- package/dist/browser/chunk-7W2JJCSS.js +276 -0
- package/dist/browser/chunk-7W2JJCSS.js.map +1 -0
- package/dist/browser/chunk-BHRFRGR7.js +144 -0
- package/dist/browser/chunk-BHRFRGR7.js.map +1 -0
- package/dist/browser/chunk-CLP6UNSV.js +285 -0
- package/dist/browser/chunk-CLP6UNSV.js.map +1 -0
- package/dist/browser/chunk-HXLRBB7S.js +1569 -0
- package/dist/browser/chunk-HXLRBB7S.js.map +1 -0
- package/dist/browser/chunk-VJEFLRZT.js +1720 -0
- package/dist/browser/chunk-VJEFLRZT.js.map +1 -0
- package/dist/browser/index.d.ts +842 -0
- package/dist/browser/index.js +3293 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/llm/index.d.ts +235 -0
- package/dist/browser/llm/index.js +29 -0
- package/dist/browser/llm/index.js.map +1 -0
- package/dist/browser/mcp/index.d.ts +63 -0
- package/dist/browser/mcp/index.js +9 -0
- package/dist/browser/mcp/index.js.map +1 -0
- package/dist/browser/provider-Dna36xA-.d.ts +105 -0
- package/dist/browser/skills/index.d.ts +401 -0
- package/dist/browser/skills/index.js +31 -0
- package/dist/browser/skills/index.js.map +1 -0
- package/dist/browser/storage/index.d.ts +64 -0
- package/dist/browser/storage/index.js +15 -0
- package/dist/browser/storage/index.js.map +1 -0
- package/dist/browser/tools/index.d.ts +45 -0
- package/dist/browser/tools/index.js +15 -0
- package/dist/browser/tools/index.js.map +1 -0
- package/dist/browser/types-CG5I-byI.d.ts +30 -0
- package/dist/chunk-56J3IBXZ.js +144 -0
- package/dist/chunk-56J3IBXZ.js.map +1 -0
- package/dist/chunk-5XTVS5MB.js +1720 -0
- package/dist/chunk-5XTVS5MB.js.map +1 -0
- package/dist/chunk-6AYIRBGI.js +166 -0
- package/dist/chunk-6AYIRBGI.js.map +1 -0
- package/dist/chunk-C2EYJHXW.cjs +276 -0
- package/dist/chunk-C2EYJHXW.cjs.map +1 -0
- package/dist/chunk-HOZQ445W.cjs +166 -0
- package/dist/chunk-HOZQ445W.cjs.map +1 -0
- package/dist/chunk-KZNZ6CGD.cjs +144 -0
- package/dist/chunk-KZNZ6CGD.cjs.map +1 -0
- package/dist/chunk-XFMT5ZA4.js +276 -0
- package/dist/chunk-XFMT5ZA4.js.map +1 -0
- package/dist/chunk-XPGICLEJ.cjs +1720 -0
- package/dist/chunk-XPGICLEJ.cjs.map +1 -0
- package/dist/index.cjs +1311 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +395 -0
- package/dist/index.d.ts +395 -0
- package/dist/index.js +1311 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/index.cjs +29 -0
- package/dist/llm/index.cjs.map +1 -0
- package/dist/llm/index.d.cts +235 -0
- package/dist/llm/index.d.ts +235 -0
- package/dist/llm/index.js +29 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/mcp/index.cjs +9 -0
- package/dist/mcp/index.cjs.map +1 -0
- package/dist/mcp/index.d.cts +63 -0
- package/dist/mcp/index.d.ts +63 -0
- package/dist/mcp/index.js +9 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/node/agent-Bpxmkz8W.d.ts +197 -0
- package/dist/node/agent-kexkkI13.d.cts +197 -0
- package/dist/node/chunk-7W2JJCSS.js +276 -0
- package/dist/node/chunk-7W2JJCSS.js.map +1 -0
- package/dist/node/chunk-BHRFRGR7.js +144 -0
- package/dist/node/chunk-BHRFRGR7.js.map +1 -0
- package/dist/node/chunk-CLP6UNSV.js +285 -0
- package/dist/node/chunk-CLP6UNSV.js.map +1 -0
- package/dist/node/chunk-HXLRBB7S.js +1569 -0
- package/dist/node/chunk-HXLRBB7S.js.map +1 -0
- package/dist/node/chunk-IYG37UN3.cjs +144 -0
- package/dist/node/chunk-IYG37UN3.cjs.map +1 -0
- package/dist/node/chunk-JF33ZOMB.cjs +285 -0
- package/dist/node/chunk-JF33ZOMB.cjs.map +1 -0
- package/dist/node/chunk-KXXS33G3.cjs +276 -0
- package/dist/node/chunk-KXXS33G3.cjs.map +1 -0
- package/dist/node/chunk-MTFOABGC.cjs +1720 -0
- package/dist/node/chunk-MTFOABGC.cjs.map +1 -0
- package/dist/node/chunk-VJEFLRZT.js +1720 -0
- package/dist/node/chunk-VJEFLRZT.js.map +1 -0
- package/dist/node/chunk-YDHQCPSN.cjs +1569 -0
- package/dist/node/chunk-YDHQCPSN.cjs.map +1 -0
- package/dist/node/index.cjs +3293 -0
- package/dist/node/index.cjs.map +1 -0
- package/dist/node/index.d.cts +842 -0
- package/dist/node/index.d.ts +842 -0
- package/dist/node/index.js +3293 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node/llm/index.cjs +29 -0
- package/dist/node/llm/index.cjs.map +1 -0
- package/dist/node/llm/index.d.cts +235 -0
- package/dist/node/llm/index.d.ts +235 -0
- package/dist/node/llm/index.js +29 -0
- package/dist/node/llm/index.js.map +1 -0
- package/dist/node/mcp/index.cjs +9 -0
- package/dist/node/mcp/index.cjs.map +1 -0
- package/dist/node/mcp/index.d.cts +63 -0
- package/dist/node/mcp/index.d.ts +63 -0
- package/dist/node/mcp/index.js +9 -0
- package/dist/node/mcp/index.js.map +1 -0
- package/dist/node/provider-Dna36xA-.d.cts +105 -0
- package/dist/node/provider-Dna36xA-.d.ts +105 -0
- package/dist/node/skills/index.cjs +31 -0
- package/dist/node/skills/index.cjs.map +1 -0
- package/dist/node/skills/index.d.cts +401 -0
- package/dist/node/skills/index.d.ts +401 -0
- package/dist/node/skills/index.js +31 -0
- package/dist/node/skills/index.js.map +1 -0
- package/dist/node/storage/index.cjs +15 -0
- package/dist/node/storage/index.cjs.map +1 -0
- package/dist/node/storage/index.d.cts +64 -0
- package/dist/node/storage/index.d.ts +64 -0
- package/dist/node/storage/index.js +15 -0
- package/dist/node/storage/index.js.map +1 -0
- package/dist/node/tools/index.cjs +15 -0
- package/dist/node/tools/index.cjs.map +1 -0
- package/dist/node/tools/index.d.cts +45 -0
- package/dist/node/tools/index.d.ts +45 -0
- package/dist/node/tools/index.js +15 -0
- package/dist/node/tools/index.js.map +1 -0
- package/dist/node/types-CG5I-byI.d.cts +30 -0
- package/dist/node/types-CG5I-byI.d.ts +30 -0
- package/dist/provider-Dna36xA-.d.cts +105 -0
- package/dist/provider-Dna36xA-.d.ts +105 -0
- package/dist/skills/index.cjs +15 -0
- package/dist/skills/index.cjs.map +1 -0
- package/dist/skills/index.d.cts +43 -0
- package/dist/skills/index.d.ts +43 -0
- package/dist/skills/index.js +15 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/tools/index.cjs +15 -0
- package/dist/tools/index.cjs.map +1 -0
- package/dist/tools/index.d.cts +45 -0
- package/dist/tools/index.d.ts +45 -0
- package/dist/tools/index.js +15 -0
- package/dist/tools/index.js.map +1 -0
- package/package.json +150 -0
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
// src/storage/browser-adapter.ts
|
|
2
|
+
var BrowserStorageAdapter = class {
|
|
3
|
+
name = "browser";
|
|
4
|
+
isAvailable = typeof window !== "undefined";
|
|
5
|
+
dbName;
|
|
6
|
+
dbVersion = 1;
|
|
7
|
+
storeName = "files";
|
|
8
|
+
db = null;
|
|
9
|
+
constructor(config = {}) {
|
|
10
|
+
this.dbName = config.prefix ? `${config.prefix}_agent_storage` : "agent_storage";
|
|
11
|
+
}
|
|
12
|
+
async getDB() {
|
|
13
|
+
if (this.db) return this.db;
|
|
14
|
+
return new Promise((resolve, reject) => {
|
|
15
|
+
const request = indexedDB.open(this.dbName, this.dbVersion);
|
|
16
|
+
request.onerror = () => reject(request.error);
|
|
17
|
+
request.onsuccess = () => {
|
|
18
|
+
this.db = request.result;
|
|
19
|
+
resolve(this.db);
|
|
20
|
+
};
|
|
21
|
+
request.onupgradeneeded = () => {
|
|
22
|
+
const db = request.result;
|
|
23
|
+
if (!db.objectStoreNames.contains(this.storeName)) {
|
|
24
|
+
const store = db.createObjectStore(this.storeName, { keyPath: "path" });
|
|
25
|
+
store.createIndex("path", "path", { unique: true });
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
async readFile(path) {
|
|
31
|
+
try {
|
|
32
|
+
const db = await this.getDB();
|
|
33
|
+
return new Promise((resolve, reject) => {
|
|
34
|
+
const transaction = db.transaction([this.storeName], "readonly");
|
|
35
|
+
const store = transaction.objectStore(this.storeName);
|
|
36
|
+
const request = store.get(path);
|
|
37
|
+
request.onerror = () => reject(request.error);
|
|
38
|
+
request.onsuccess = () => {
|
|
39
|
+
const file = request.result;
|
|
40
|
+
resolve(file ? file.content : null);
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
} catch {
|
|
44
|
+
try {
|
|
45
|
+
const response = await fetch(path);
|
|
46
|
+
if (!response.ok) return null;
|
|
47
|
+
return await response.text();
|
|
48
|
+
} catch {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async writeFile(path, content) {
|
|
54
|
+
const db = await this.getDB();
|
|
55
|
+
const file = {
|
|
56
|
+
path,
|
|
57
|
+
content,
|
|
58
|
+
createdAt: /* @__PURE__ */ new Date(),
|
|
59
|
+
modifiedAt: /* @__PURE__ */ new Date(),
|
|
60
|
+
size: new Blob([content]).size
|
|
61
|
+
};
|
|
62
|
+
return new Promise((resolve, reject) => {
|
|
63
|
+
const transaction = db.transaction([this.storeName], "readwrite");
|
|
64
|
+
const store = transaction.objectStore(this.storeName);
|
|
65
|
+
const request = store.put(file);
|
|
66
|
+
request.onerror = () => reject(request.error);
|
|
67
|
+
request.onsuccess = () => resolve();
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
async deleteFile(path) {
|
|
71
|
+
const db = await this.getDB();
|
|
72
|
+
return new Promise((resolve, reject) => {
|
|
73
|
+
const transaction = db.transaction([this.storeName], "readwrite");
|
|
74
|
+
const store = transaction.objectStore(this.storeName);
|
|
75
|
+
const request = store.delete(path);
|
|
76
|
+
request.onerror = () => reject(request.error);
|
|
77
|
+
request.onsuccess = () => resolve();
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
async exists(path) {
|
|
81
|
+
try {
|
|
82
|
+
const db = await this.getDB();
|
|
83
|
+
return new Promise((resolve, reject) => {
|
|
84
|
+
const transaction = db.transaction([this.storeName], "readonly");
|
|
85
|
+
const store = transaction.objectStore(this.storeName);
|
|
86
|
+
const request = store.count(path);
|
|
87
|
+
request.onerror = () => reject(request.error);
|
|
88
|
+
request.onsuccess = () => resolve(request.result > 0);
|
|
89
|
+
});
|
|
90
|
+
} catch {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async listDirectory(path) {
|
|
95
|
+
try {
|
|
96
|
+
const db = await this.getDB();
|
|
97
|
+
return new Promise((resolve, reject) => {
|
|
98
|
+
const transaction = db.transaction([this.storeName], "readonly");
|
|
99
|
+
const store = transaction.objectStore(this.storeName);
|
|
100
|
+
const request = store.getAll();
|
|
101
|
+
request.onerror = () => reject(request.error);
|
|
102
|
+
request.onsuccess = () => {
|
|
103
|
+
const files = request.result;
|
|
104
|
+
const filtered = files.filter((file) => file.path.startsWith(path)).map((file) => file.path.replace(path, "").replace(/^\//, "")).filter((name) => !name.includes("/"));
|
|
105
|
+
resolve(filtered);
|
|
106
|
+
};
|
|
107
|
+
});
|
|
108
|
+
} catch {
|
|
109
|
+
return [];
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
async createDirectory(path) {
|
|
113
|
+
await this.writeFile(`${path}/.directory`, "");
|
|
114
|
+
}
|
|
115
|
+
async deleteDirectory(path) {
|
|
116
|
+
try {
|
|
117
|
+
const db = await this.getDB();
|
|
118
|
+
return new Promise((resolve, reject) => {
|
|
119
|
+
const transaction = db.transaction([this.storeName], "readwrite");
|
|
120
|
+
const store = transaction.objectStore(this.storeName);
|
|
121
|
+
const request = store.getAll();
|
|
122
|
+
request.onerror = () => reject(request.error);
|
|
123
|
+
request.onsuccess = () => {
|
|
124
|
+
const files = request.result;
|
|
125
|
+
const toDelete = files.filter((file) => file.path.startsWith(path));
|
|
126
|
+
Promise.all(toDelete.map(
|
|
127
|
+
(file) => new Promise((res, rej) => {
|
|
128
|
+
const delReq = store.delete(file.path);
|
|
129
|
+
delReq.onerror = () => rej(delReq.error);
|
|
130
|
+
delReq.onsuccess = () => res();
|
|
131
|
+
})
|
|
132
|
+
)).then(() => resolve()).catch(reject);
|
|
133
|
+
};
|
|
134
|
+
});
|
|
135
|
+
} catch {
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
async getMetadata(path) {
|
|
139
|
+
try {
|
|
140
|
+
const db = await this.getDB();
|
|
141
|
+
return new Promise((resolve, reject) => {
|
|
142
|
+
const transaction = db.transaction([this.storeName], "readonly");
|
|
143
|
+
const store = transaction.objectStore(this.storeName);
|
|
144
|
+
const request = store.get(path);
|
|
145
|
+
request.onerror = () => reject(request.error);
|
|
146
|
+
request.onsuccess = () => {
|
|
147
|
+
const file = request.result;
|
|
148
|
+
if (!file) {
|
|
149
|
+
resolve(null);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
resolve({
|
|
153
|
+
path: file.path,
|
|
154
|
+
size: file.size,
|
|
155
|
+
createdAt: file.createdAt,
|
|
156
|
+
modifiedAt: file.modifiedAt,
|
|
157
|
+
isDirectory: path.endsWith("/.directory") || path.endsWith("/")
|
|
158
|
+
});
|
|
159
|
+
};
|
|
160
|
+
});
|
|
161
|
+
} catch {
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
// src/storage/node-adapter.ts
|
|
168
|
+
var NodeStorageAdapter = class {
|
|
169
|
+
constructor(config = {}) {
|
|
170
|
+
this.config = config;
|
|
171
|
+
}
|
|
172
|
+
name = "node";
|
|
173
|
+
isAvailable = typeof window === "undefined";
|
|
174
|
+
resolvePath(path) {
|
|
175
|
+
if (this.config.basePath) {
|
|
176
|
+
return `${this.config.basePath}/${path}`.replace(/\/+/g, "/");
|
|
177
|
+
}
|
|
178
|
+
return path;
|
|
179
|
+
}
|
|
180
|
+
async readFile(path) {
|
|
181
|
+
try {
|
|
182
|
+
const fs = await import("fs/promises");
|
|
183
|
+
const resolvedPath = this.resolvePath(path);
|
|
184
|
+
return await fs.readFile(resolvedPath, "utf-8");
|
|
185
|
+
} catch {
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
async writeFile(path, content) {
|
|
190
|
+
const fs = await import("fs/promises");
|
|
191
|
+
const resolvedPath = this.resolvePath(path);
|
|
192
|
+
const dir = resolvedPath.substring(0, resolvedPath.lastIndexOf("/"));
|
|
193
|
+
if (dir) {
|
|
194
|
+
await fs.mkdir(dir, { recursive: true });
|
|
195
|
+
}
|
|
196
|
+
await fs.writeFile(resolvedPath, content, "utf-8");
|
|
197
|
+
}
|
|
198
|
+
async deleteFile(path) {
|
|
199
|
+
try {
|
|
200
|
+
const fs = await import("fs/promises");
|
|
201
|
+
const resolvedPath = this.resolvePath(path);
|
|
202
|
+
await fs.unlink(resolvedPath);
|
|
203
|
+
} catch {
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
async exists(path) {
|
|
207
|
+
try {
|
|
208
|
+
const fs = await import("fs/promises");
|
|
209
|
+
const resolvedPath = this.resolvePath(path);
|
|
210
|
+
await fs.access(resolvedPath);
|
|
211
|
+
return true;
|
|
212
|
+
} catch {
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
async listDirectory(path) {
|
|
217
|
+
try {
|
|
218
|
+
const fs = await import("fs/promises");
|
|
219
|
+
const resolvedPath = this.resolvePath(path);
|
|
220
|
+
const entries = await fs.readdir(resolvedPath, { withFileTypes: true });
|
|
221
|
+
return entries.filter((e) => e.isFile()).map((e) => e.name);
|
|
222
|
+
} catch {
|
|
223
|
+
return [];
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
async createDirectory(path) {
|
|
227
|
+
try {
|
|
228
|
+
const fs = await import("fs/promises");
|
|
229
|
+
const resolvedPath = this.resolvePath(path);
|
|
230
|
+
await fs.mkdir(resolvedPath, { recursive: true });
|
|
231
|
+
} catch {
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
async deleteDirectory(path) {
|
|
235
|
+
try {
|
|
236
|
+
const fs = await import("fs/promises");
|
|
237
|
+
const resolvedPath = this.resolvePath(path);
|
|
238
|
+
await fs.rm(resolvedPath, { recursive: true, force: true });
|
|
239
|
+
} catch {
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
async getMetadata(path) {
|
|
243
|
+
try {
|
|
244
|
+
const fs = await import("fs/promises");
|
|
245
|
+
const resolvedPath = this.resolvePath(path);
|
|
246
|
+
const stats = await fs.stat(resolvedPath);
|
|
247
|
+
return {
|
|
248
|
+
path: resolvedPath,
|
|
249
|
+
size: stats.size,
|
|
250
|
+
createdAt: stats.birthtime,
|
|
251
|
+
modifiedAt: stats.mtime,
|
|
252
|
+
isDirectory: stats.isDirectory()
|
|
253
|
+
};
|
|
254
|
+
} catch {
|
|
255
|
+
return null;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
// src/storage/index.ts
|
|
261
|
+
function createStorage(config) {
|
|
262
|
+
if (typeof window !== "undefined") {
|
|
263
|
+
return new BrowserStorageAdapter(config);
|
|
264
|
+
}
|
|
265
|
+
return new NodeStorageAdapter(config);
|
|
266
|
+
}
|
|
267
|
+
var defaultStorage = null;
|
|
268
|
+
function getDefaultStorage(config) {
|
|
269
|
+
if (!defaultStorage) {
|
|
270
|
+
defaultStorage = createStorage(config);
|
|
271
|
+
}
|
|
272
|
+
return defaultStorage;
|
|
273
|
+
}
|
|
274
|
+
function resetDefaultStorage() {
|
|
275
|
+
defaultStorage = null;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
export {
|
|
279
|
+
BrowserStorageAdapter,
|
|
280
|
+
NodeStorageAdapter,
|
|
281
|
+
createStorage,
|
|
282
|
+
getDefaultStorage,
|
|
283
|
+
resetDefaultStorage
|
|
284
|
+
};
|
|
285
|
+
//# sourceMappingURL=chunk-CLP6UNSV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/storage/browser-adapter.ts","../../src/storage/node-adapter.ts","../../src/storage/index.ts"],"sourcesContent":["/**\r\n * Browser Storage Adapter\r\n * Uses IndexedDB for file-like storage and fetch for remote resources\r\n */\r\n\r\nimport { StorageAdapter, FileMetadata, StorageConfig } from './types';\r\n\r\ninterface IndexedDBFile {\r\n path: string;\r\n content: string;\r\n createdAt: Date;\r\n modifiedAt: Date;\r\n size: number;\r\n}\r\n\r\nexport class BrowserStorageAdapter implements StorageAdapter {\r\n readonly name = 'browser';\r\n readonly isAvailable = typeof window !== 'undefined';\r\n \r\n private dbName: string;\r\n private dbVersion = 1;\r\n private storeName = 'files';\r\n private db: IDBDatabase | null = null;\r\n\r\n constructor(config: StorageConfig = {}) {\r\n this.dbName = config.prefix ? `${config.prefix}_agent_storage` : 'agent_storage';\r\n }\r\n\r\n private async getDB(): Promise<IDBDatabase> {\r\n if (this.db) return this.db;\r\n\r\n return new Promise((resolve, reject) => {\r\n const request = indexedDB.open(this.dbName, this.dbVersion);\r\n \r\n request.onerror = () => reject(request.error);\r\n request.onsuccess = () => {\r\n this.db = request.result;\r\n resolve(this.db);\r\n };\r\n \r\n request.onupgradeneeded = () => {\r\n const db = request.result;\r\n if (!db.objectStoreNames.contains(this.storeName)) {\r\n const store = db.createObjectStore(this.storeName, { keyPath: 'path' });\r\n store.createIndex('path', 'path', { unique: true });\r\n }\r\n };\r\n });\r\n }\r\n\r\n async readFile(path: string): Promise<string | null> {\r\n try {\r\n // Try local storage first\r\n const db = await this.getDB();\r\n return new Promise((resolve, reject) => {\r\n const transaction = db.transaction([this.storeName], 'readonly');\r\n const store = transaction.objectStore(this.storeName);\r\n const request = store.get(path);\r\n \r\n request.onerror = () => reject(request.error);\r\n request.onsuccess = () => {\r\n const file = request.result as IndexedDBFile | undefined;\r\n resolve(file ? file.content : null);\r\n };\r\n });\r\n } catch {\r\n // Fallback to fetch for remote resources\r\n try {\r\n const response = await fetch(path);\r\n if (!response.ok) return null;\r\n return await response.text();\r\n } catch {\r\n return null;\r\n }\r\n }\r\n }\r\n\r\n async writeFile(path: string, content: string): Promise<void> {\r\n const db = await this.getDB();\r\n const file: IndexedDBFile = {\r\n path,\r\n content,\r\n createdAt: new Date(),\r\n modifiedAt: new Date(),\r\n size: new Blob([content]).size,\r\n };\r\n\r\n return new Promise((resolve, reject) => {\r\n const transaction = db.transaction([this.storeName], 'readwrite');\r\n const store = transaction.objectStore(this.storeName);\r\n const request = store.put(file);\r\n \r\n request.onerror = () => reject(request.error);\r\n request.onsuccess = () => resolve();\r\n });\r\n }\r\n\r\n async deleteFile(path: string): Promise<void> {\r\n const db = await this.getDB();\r\n return new Promise((resolve, reject) => {\r\n const transaction = db.transaction([this.storeName], 'readwrite');\r\n const store = transaction.objectStore(this.storeName);\r\n const request = store.delete(path);\r\n \r\n request.onerror = () => reject(request.error);\r\n request.onsuccess = () => resolve();\r\n });\r\n }\r\n\r\n async exists(path: string): Promise<boolean> {\r\n try {\r\n const db = await this.getDB();\r\n return new Promise((resolve, reject) => {\r\n const transaction = db.transaction([this.storeName], 'readonly');\r\n const store = transaction.objectStore(this.storeName);\r\n const request = store.count(path);\r\n \r\n request.onerror = () => reject(request.error);\r\n request.onsuccess = () => resolve(request.result > 0);\r\n });\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n async listDirectory(path: string): Promise<string[]> {\r\n try {\r\n const db = await this.getDB();\r\n return new Promise((resolve, reject) => {\r\n const transaction = db.transaction([this.storeName], 'readonly');\r\n const store = transaction.objectStore(this.storeName);\r\n const request = store.getAll();\r\n \r\n request.onerror = () => reject(request.error);\r\n request.onsuccess = () => {\r\n const files = request.result as IndexedDBFile[];\r\n const filtered = files\r\n .filter(file => file.path.startsWith(path))\r\n .map(file => file.path.replace(path, '').replace(/^\\//, ''))\r\n .filter(name => !name.includes('/'));\r\n resolve(filtered);\r\n };\r\n });\r\n } catch {\r\n return [];\r\n }\r\n }\r\n\r\n async createDirectory(path: string): Promise<void> {\r\n // In IndexedDB, directories are implicit from file paths\r\n // We create a placeholder file to mark the directory\r\n await this.writeFile(`${path}/.directory`, '');\r\n }\r\n\r\n async deleteDirectory(path: string): Promise<void> {\r\n try {\r\n const db = await this.getDB();\r\n return new Promise((resolve, reject) => {\r\n const transaction = db.transaction([this.storeName], 'readwrite');\r\n const store = transaction.objectStore(this.storeName);\r\n const request = store.getAll();\r\n \r\n request.onerror = () => reject(request.error);\r\n request.onsuccess = () => {\r\n const files = request.result as IndexedDBFile[];\r\n const toDelete = files.filter(file => file.path.startsWith(path));\r\n \r\n Promise.all(toDelete.map(file => \r\n new Promise<void>((res, rej) => {\r\n const delReq = store.delete(file.path);\r\n delReq.onerror = () => rej(delReq.error);\r\n delReq.onsuccess = () => res();\r\n })\r\n )).then(() => resolve()).catch(reject);\r\n };\r\n });\r\n } catch {\r\n // Ignore errors\r\n }\r\n }\r\n\r\n async getMetadata(path: string): Promise<FileMetadata | null> {\r\n try {\r\n const db = await this.getDB();\r\n return new Promise((resolve, reject) => {\r\n const transaction = db.transaction([this.storeName], 'readonly');\r\n const store = transaction.objectStore(this.storeName);\r\n const request = store.get(path);\r\n \r\n request.onerror = () => reject(request.error);\r\n request.onsuccess = () => {\r\n const file = request.result as IndexedDBFile | undefined;\r\n if (!file) {\r\n resolve(null);\r\n return;\r\n }\r\n \r\n resolve({\r\n path: file.path,\r\n size: file.size,\r\n createdAt: file.createdAt,\r\n modifiedAt: file.modifiedAt,\r\n isDirectory: path.endsWith('/.directory') || path.endsWith('/'),\r\n });\r\n };\r\n });\r\n } catch {\r\n return null;\r\n }\r\n }\r\n}","/**\r\n * Node.js Storage Adapter\r\n * Uses native fs module for file operations\r\n */\r\n\r\nimport { StorageAdapter, FileMetadata, StorageConfig } from './types';\r\n\r\nexport class NodeStorageAdapter implements StorageAdapter {\r\n readonly name = 'node';\r\n readonly isAvailable = typeof window === 'undefined';\r\n\r\n constructor(private config: StorageConfig = {}) {}\r\n\r\n private resolvePath(path: string): string {\r\n if (this.config.basePath) {\r\n return `${this.config.basePath}/${path}`.replace(/\\/+/g, '/');\r\n }\r\n return path;\r\n }\r\n\r\n async readFile(path: string): Promise<string | null> {\r\n try {\r\n const fs = await import('fs/promises');\r\n const resolvedPath = this.resolvePath(path);\r\n return await fs.readFile(resolvedPath, 'utf-8');\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n async writeFile(path: string, content: string): Promise<void> {\r\n const fs = await import('fs/promises');\r\n const resolvedPath = this.resolvePath(path);\r\n \r\n // Ensure directory exists\r\n const dir = resolvedPath.substring(0, resolvedPath.lastIndexOf('/'));\r\n if (dir) {\r\n await fs.mkdir(dir, { recursive: true });\r\n }\r\n \r\n await fs.writeFile(resolvedPath, content, 'utf-8');\r\n }\r\n\r\n async deleteFile(path: string): Promise<void> {\r\n try {\r\n const fs = await import('fs/promises');\r\n const resolvedPath = this.resolvePath(path);\r\n await fs.unlink(resolvedPath);\r\n } catch {\r\n // Ignore errors\r\n }\r\n }\r\n\r\n async exists(path: string): Promise<boolean> {\r\n try {\r\n const fs = await import('fs/promises');\r\n const resolvedPath = this.resolvePath(path);\r\n await fs.access(resolvedPath);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n async listDirectory(path: string): Promise<string[]> {\r\n try {\r\n const fs = await import('fs/promises');\r\n const resolvedPath = this.resolvePath(path);\r\n const entries = await fs.readdir(resolvedPath, { withFileTypes: true });\r\n return entries.filter(e => e.isFile()).map(e => e.name);\r\n } catch {\r\n return [];\r\n }\r\n }\r\n\r\n async createDirectory(path: string): Promise<void> {\r\n try {\r\n const fs = await import('fs/promises');\r\n const resolvedPath = this.resolvePath(path);\r\n await fs.mkdir(resolvedPath, { recursive: true });\r\n } catch {\r\n // Ignore errors\r\n }\r\n }\r\n\r\n async deleteDirectory(path: string): Promise<void> {\r\n try {\r\n const fs = await import('fs/promises');\r\n const resolvedPath = this.resolvePath(path);\r\n await fs.rm(resolvedPath, { recursive: true, force: true });\r\n } catch {\r\n // Ignore errors\r\n }\r\n }\r\n\r\n async getMetadata(path: string): Promise<FileMetadata | null> {\r\n try {\r\n const fs = await import('fs/promises');\r\n const resolvedPath = this.resolvePath(path);\r\n const stats = await fs.stat(resolvedPath);\r\n \r\n return {\r\n path: resolvedPath,\r\n size: stats.size,\r\n createdAt: stats.birthtime,\r\n modifiedAt: stats.mtime,\r\n isDirectory: stats.isDirectory(),\r\n };\r\n } catch {\r\n return null;\r\n }\r\n }\r\n}\r\n","/**\r\n * Storage Module\r\n * Unified storage interface for browser and Node.js environments\r\n */\r\n\r\nimport { StorageAdapter, StorageConfig } from './types';\r\nimport { BrowserStorageAdapter } from './browser-adapter';\r\nimport { NodeStorageAdapter } from './node-adapter';\r\n\r\nexport * from './types';\r\nexport { BrowserStorageAdapter } from './browser-adapter';\r\nexport { NodeStorageAdapter } from './node-adapter';\r\n\r\n/**\r\n * Create the appropriate storage adapter for the current environment\r\n */\r\nexport function createStorage(config?: StorageConfig): StorageAdapter {\r\n if (typeof window !== 'undefined') {\r\n return new BrowserStorageAdapter(config);\r\n }\r\n return new NodeStorageAdapter(config);\r\n}\r\n\r\n/**\r\n * Get the default storage adapter singleton\r\n */\r\nlet defaultStorage: StorageAdapter | null = null;\r\n\r\nexport function getDefaultStorage(config?: StorageConfig): StorageAdapter {\r\n if (!defaultStorage) {\r\n defaultStorage = createStorage(config);\r\n }\r\n return defaultStorage;\r\n}\r\n\r\n/**\r\n * Reset the default storage adapter (useful for testing)\r\n */\r\nexport function resetDefaultStorage(): void {\r\n defaultStorage = null;\r\n}\r\n"],"mappings":"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","names":[]}
|