@moltos/sdk 0.5.0 → 0.5.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/dist/index.d.ts +12 -144
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -243
- package/dist/index.js.map +1 -1
- package/dist/lib/api.d.ts +32 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +80 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/arbitra.d.ts +302 -0
- package/dist/lib/arbitra.d.ts.map +1 -0
- package/dist/lib/arbitra.js +486 -0
- package/dist/lib/arbitra.js.map +1 -0
- package/dist/lib/clawfs.d.ts +277 -0
- package/dist/lib/clawfs.d.ts.map +1 -0
- package/dist/lib/clawfs.js +628 -0
- package/dist/lib/clawfs.js.map +1 -0
- package/dist/lib/clawid.d.ts +189 -0
- package/dist/lib/clawid.d.ts.map +1 -0
- package/dist/lib/clawid.js +455 -0
- package/dist/lib/clawid.js.map +1 -0
- package/dist/lib/config.d.ts +23 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +29 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/tap.d.ts +208 -0
- package/dist/lib/tap.d.ts.map +1 -0
- package/dist/lib/tap.js +549 -0
- package/dist/lib/tap.js.map +1 -0
- package/package.json +6 -2
- package/README.md +0 -67
- package/dist/arbitra.d.ts +0 -3
- package/dist/arbitra.d.ts.map +0 -1
- package/dist/arbitra.js +0 -198
- package/dist/arbitra.js.map +0 -1
- package/dist/attack-sim.d.ts +0 -3
- package/dist/attack-sim.d.ts.map +0 -1
- package/dist/attack-sim.js +0 -101
- package/dist/attack-sim.js.map +0 -1
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -379
- package/dist/cli.js.map +0 -1
- package/dist/protocols/arbitra/voting.d.ts +0 -43
- package/dist/protocols/arbitra/voting.d.ts.map +0 -1
- package/dist/protocols/arbitra/voting.js +0 -42
- package/dist/protocols/arbitra/voting.js.map +0 -1
- package/dist/protocols/clawforge/control-plane.d.ts +0 -4
- package/dist/protocols/clawforge/control-plane.d.ts.map +0 -1
- package/dist/protocols/clawforge/control-plane.js +0 -11
- package/dist/protocols/clawforge/control-plane.js.map +0 -1
- package/dist/protocols/clawid/clawid-token.d.ts +0 -9
- package/dist/protocols/clawid/clawid-token.d.ts.map +0 -1
- package/dist/protocols/clawid/clawid-token.js +0 -20
- package/dist/protocols/clawid/clawid-token.js.map +0 -1
- package/dist/protocols/clawkernel/kernel.d.ts +0 -4
- package/dist/protocols/clawkernel/kernel.d.ts.map +0 -1
- package/dist/protocols/clawkernel/kernel.js +0 -11
- package/dist/protocols/clawkernel/kernel.js.map +0 -1
- package/dist/protocols/clawlink/handoff.d.ts +0 -64
- package/dist/protocols/clawlink/handoff.d.ts.map +0 -1
- package/dist/protocols/clawlink/handoff.js +0 -31
- package/dist/protocols/clawlink/handoff.js.map +0 -1
- package/dist/types.d.ts +0 -65
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -27
- package/dist/types.js.map +0 -1
- package/dist/vm.d.ts +0 -3
- package/dist/vm.d.ts.map +0 -1
- package/dist/vm.js +0 -173
- package/dist/vm.js.map +0 -1
|
@@ -0,0 +1,628 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ClawFS - Persistent File System for MoltOS SDK
|
|
4
|
+
*
|
|
5
|
+
* A content-addressed, merkle-backed storage system with tiered storage
|
|
6
|
+
* and agent-native permissions. Designed to survive VM crashes and host moves.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.SearchIndex = exports.MemoryStorageBackend = exports.ClawFSClient = exports.StorageTierError = exports.PermissionDeniedError = exports.FileNotFoundError = exports.ClawFSError = exports.Permission = exports.StorageTier = void 0;
|
|
10
|
+
exports.computeCID = computeCID;
|
|
11
|
+
exports.computeMerkleRoot = computeMerkleRoot;
|
|
12
|
+
exports.chunkData = chunkData;
|
|
13
|
+
const crypto_1 = require("crypto");
|
|
14
|
+
/** Storage tier indicating access pattern and persistence level */
|
|
15
|
+
var StorageTier;
|
|
16
|
+
(function (StorageTier) {
|
|
17
|
+
/** Hot: Frequently accessed, memory-cached, local SSD */
|
|
18
|
+
StorageTier["HOT"] = "hot";
|
|
19
|
+
/** Warm: Occasionally accessed, local disk */
|
|
20
|
+
StorageTier["WARM"] = "warm";
|
|
21
|
+
/** Cold: Rarely accessed, replicated remote storage */
|
|
22
|
+
StorageTier["COLD"] = "cold";
|
|
23
|
+
})(StorageTier || (exports.StorageTier = StorageTier = {}));
|
|
24
|
+
/** Permission levels for file access */
|
|
25
|
+
var Permission;
|
|
26
|
+
(function (Permission) {
|
|
27
|
+
/** Read-only access */
|
|
28
|
+
Permission["READ"] = "read";
|
|
29
|
+
/** Write access (includes read) */
|
|
30
|
+
Permission["WRITE"] = "write";
|
|
31
|
+
/** Admin access (includes read, write, delete, share) */
|
|
32
|
+
Permission["ADMIN"] = "admin";
|
|
33
|
+
})(Permission || (exports.Permission = Permission = {}));
|
|
34
|
+
// ============================================================================
|
|
35
|
+
// ERROR CLASSES
|
|
36
|
+
// ============================================================================
|
|
37
|
+
class ClawFSError extends Error {
|
|
38
|
+
code;
|
|
39
|
+
constructor(message, code) {
|
|
40
|
+
super(message);
|
|
41
|
+
this.code = code;
|
|
42
|
+
this.name = 'ClawFSError';
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
exports.ClawFSError = ClawFSError;
|
|
46
|
+
class FileNotFoundError extends ClawFSError {
|
|
47
|
+
constructor(cid) {
|
|
48
|
+
super(`File not found: ${cid}`, 'FILE_NOT_FOUND');
|
|
49
|
+
this.name = 'FileNotFoundError';
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
exports.FileNotFoundError = FileNotFoundError;
|
|
53
|
+
class PermissionDeniedError extends ClawFSError {
|
|
54
|
+
constructor(agentId, cid, required) {
|
|
55
|
+
super(`Agent ${agentId} lacks ${required} permission for ${cid}`, 'PERMISSION_DENIED');
|
|
56
|
+
this.name = 'PermissionDeniedError';
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
exports.PermissionDeniedError = PermissionDeniedError;
|
|
60
|
+
class StorageTierError extends ClawFSError {
|
|
61
|
+
constructor(message) {
|
|
62
|
+
super(message, 'STORAGE_TIER_ERROR');
|
|
63
|
+
this.name = 'StorageTierError';
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.StorageTierError = StorageTierError;
|
|
67
|
+
// ============================================================================
|
|
68
|
+
// UTILITY FUNCTIONS
|
|
69
|
+
// ============================================================================
|
|
70
|
+
/** Compute SHA-256 CID for content */
|
|
71
|
+
function computeCID(data) {
|
|
72
|
+
return (0, crypto_1.createHash)('sha256').update(data).digest('hex');
|
|
73
|
+
}
|
|
74
|
+
/** Compute Merkle tree root from blocks */
|
|
75
|
+
function computeMerkleRoot(blocks) {
|
|
76
|
+
if (blocks.length === 0) {
|
|
77
|
+
return (0, crypto_1.createHash)('sha256').update('').digest('hex');
|
|
78
|
+
}
|
|
79
|
+
// Build tree bottom-up
|
|
80
|
+
let level = blocks.map(hash => ({ hash }));
|
|
81
|
+
while (level.length > 1) {
|
|
82
|
+
const nextLevel = [];
|
|
83
|
+
for (let i = 0; i < level.length; i += 2) {
|
|
84
|
+
const left = level[i];
|
|
85
|
+
const right = level[i + 1] || left; // Duplicate last if odd
|
|
86
|
+
const combined = (0, crypto_1.createHash)('sha256')
|
|
87
|
+
.update(left.hash + right.hash)
|
|
88
|
+
.digest('hex');
|
|
89
|
+
nextLevel.push({ hash: combined, left, right });
|
|
90
|
+
}
|
|
91
|
+
level = nextLevel;
|
|
92
|
+
}
|
|
93
|
+
return level[0].hash;
|
|
94
|
+
}
|
|
95
|
+
/** Chunk data into blocks for storage */
|
|
96
|
+
function chunkData(data, blockSize = 1024 * 1024) {
|
|
97
|
+
const chunks = [];
|
|
98
|
+
for (let i = 0; i < data.length; i += blockSize) {
|
|
99
|
+
chunks.push(data.subarray(i, i + blockSize));
|
|
100
|
+
}
|
|
101
|
+
return chunks.length > 0 ? chunks : [Buffer.alloc(0)];
|
|
102
|
+
}
|
|
103
|
+
// ============================================================================
|
|
104
|
+
// MEMORY BACKEND (for demo/testing - production would use persistent storage)
|
|
105
|
+
// ============================================================================
|
|
106
|
+
class MemoryStorageBackend {
|
|
107
|
+
hot = new Map();
|
|
108
|
+
warm = new Map();
|
|
109
|
+
cold = new Map();
|
|
110
|
+
accessStats = new Map();
|
|
111
|
+
async get(cid) {
|
|
112
|
+
for (const tier of [this.hot, this.warm, this.cold]) {
|
|
113
|
+
if (tier.has(cid)) {
|
|
114
|
+
const stats = this.accessStats.get(cid) || { count: 0, lastAccessed: new Date() };
|
|
115
|
+
stats.count++;
|
|
116
|
+
stats.lastAccessed = new Date();
|
|
117
|
+
this.accessStats.set(cid, stats);
|
|
118
|
+
return tier.get(cid);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
async put(cid, data, tier) {
|
|
124
|
+
const target = tier === StorageTier.HOT ? this.hot : tier === StorageTier.WARM ? this.warm : this.cold;
|
|
125
|
+
target.set(cid, Buffer.from(data)); // Copy to prevent external mutation
|
|
126
|
+
this.accessStats.set(cid, { count: 0, lastAccessed: new Date() });
|
|
127
|
+
}
|
|
128
|
+
async delete(cid) {
|
|
129
|
+
this.hot.delete(cid);
|
|
130
|
+
this.warm.delete(cid);
|
|
131
|
+
this.cold.delete(cid);
|
|
132
|
+
this.accessStats.delete(cid);
|
|
133
|
+
}
|
|
134
|
+
async exists(cid) {
|
|
135
|
+
return this.hot.has(cid) || this.warm.has(cid) || this.cold.has(cid);
|
|
136
|
+
}
|
|
137
|
+
async promote(cid, toTier) {
|
|
138
|
+
const data = await this.get(cid);
|
|
139
|
+
if (!data)
|
|
140
|
+
throw new FileNotFoundError(cid);
|
|
141
|
+
// Remove from all tiers
|
|
142
|
+
this.hot.delete(cid);
|
|
143
|
+
this.warm.delete(cid);
|
|
144
|
+
this.cold.delete(cid);
|
|
145
|
+
// Put in target tier
|
|
146
|
+
await this.put(cid, data, toTier);
|
|
147
|
+
}
|
|
148
|
+
async demote(cid, toTier) {
|
|
149
|
+
await this.promote(cid, toTier); // Same logic: remove + re-add
|
|
150
|
+
}
|
|
151
|
+
getTier(cid) {
|
|
152
|
+
if (this.hot.has(cid))
|
|
153
|
+
return StorageTier.HOT;
|
|
154
|
+
if (this.warm.has(cid))
|
|
155
|
+
return StorageTier.WARM;
|
|
156
|
+
if (this.cold.has(cid))
|
|
157
|
+
return StorageTier.COLD;
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
getStats(cid) {
|
|
161
|
+
return this.accessStats.get(cid);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
exports.MemoryStorageBackend = MemoryStorageBackend;
|
|
165
|
+
// ============================================================================
|
|
166
|
+
// SEARCH INDEX
|
|
167
|
+
// ============================================================================
|
|
168
|
+
class SearchIndex {
|
|
169
|
+
index = new Map(); // term -> CIDs
|
|
170
|
+
metadata = new Map();
|
|
171
|
+
indexFile(cid, metadata, content) {
|
|
172
|
+
this.metadata.set(cid, metadata);
|
|
173
|
+
// Index metadata fields
|
|
174
|
+
const terms = new Set();
|
|
175
|
+
metadata.name.toLowerCase().split(/\s+/).forEach(t => terms.add(t));
|
|
176
|
+
metadata.tags.forEach(tag => tag.toLowerCase().split(/\s+/).forEach(t => terms.add(t)));
|
|
177
|
+
// Index content if provided (simplified - production would use vector embeddings)
|
|
178
|
+
if (content) {
|
|
179
|
+
content.toLowerCase().split(/\s+/).forEach(t => {
|
|
180
|
+
if (t.length > 2)
|
|
181
|
+
terms.add(t);
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
terms.forEach(term => {
|
|
185
|
+
const cids = this.index.get(term) || [];
|
|
186
|
+
if (!cids.includes(cid)) {
|
|
187
|
+
cids.push(cid);
|
|
188
|
+
this.index.set(term, cids);
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
removeFile(cid) {
|
|
193
|
+
this.metadata.delete(cid);
|
|
194
|
+
this.index.forEach((cids, term) => {
|
|
195
|
+
const filtered = cids.filter(c => c !== cid);
|
|
196
|
+
if (filtered.length === 0) {
|
|
197
|
+
this.index.delete(term);
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
this.index.set(term, filtered);
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
search(query, limit = 10) {
|
|
205
|
+
const queryTerms = query.toLowerCase().split(/\s+/).filter(t => t.length > 0);
|
|
206
|
+
const scores = new Map();
|
|
207
|
+
const highlights = new Map();
|
|
208
|
+
queryTerms.forEach(term => {
|
|
209
|
+
this.index.forEach((cids, indexedTerm) => {
|
|
210
|
+
if (indexedTerm.includes(term) || term.includes(indexedTerm)) {
|
|
211
|
+
cids.forEach(cid => {
|
|
212
|
+
const score = (scores.get(cid) || 0) + (indexedTerm === term ? 2 : 1);
|
|
213
|
+
scores.set(cid, score);
|
|
214
|
+
const hl = highlights.get(cid) || new Set();
|
|
215
|
+
hl.add(indexedTerm);
|
|
216
|
+
highlights.set(cid, hl);
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
return Array.from(scores.entries())
|
|
222
|
+
.sort((a, b) => b[1] - a[1])
|
|
223
|
+
.slice(0, limit)
|
|
224
|
+
.map(([cid, score]) => ({
|
|
225
|
+
cid,
|
|
226
|
+
score,
|
|
227
|
+
highlights: Array.from(highlights.get(cid) || []),
|
|
228
|
+
metadata: this.metadata.get(cid),
|
|
229
|
+
}));
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
exports.SearchIndex = SearchIndex;
|
|
233
|
+
// ============================================================================
|
|
234
|
+
// CLAWFS CLIENT
|
|
235
|
+
// ============================================================================
|
|
236
|
+
class ClawFSClient {
|
|
237
|
+
agentId;
|
|
238
|
+
backend;
|
|
239
|
+
fileIndex = new Map();
|
|
240
|
+
snapshots = [];
|
|
241
|
+
searchIndex = new SearchIndex();
|
|
242
|
+
config;
|
|
243
|
+
constructor(config, backend) {
|
|
244
|
+
this.config = config;
|
|
245
|
+
this.agentId = config.agentId;
|
|
246
|
+
this.backend = backend || new MemoryStorageBackend();
|
|
247
|
+
}
|
|
248
|
+
// ==========================================================================
|
|
249
|
+
// CORE OPERATIONS
|
|
250
|
+
// ==========================================================================
|
|
251
|
+
/**
|
|
252
|
+
* Store a file and return its Content Identifier (CID)
|
|
253
|
+
*
|
|
254
|
+
* @param data - File content as Buffer
|
|
255
|
+
* @param metadata - File metadata
|
|
256
|
+
* @param options - Storage options
|
|
257
|
+
* @returns The CID of the stored file
|
|
258
|
+
*/
|
|
259
|
+
async write(data, metadata = {}, options = {}) {
|
|
260
|
+
const tier = options.tier || this.inferTier(data.length);
|
|
261
|
+
const now = new Date();
|
|
262
|
+
// Chunk data
|
|
263
|
+
const chunks = chunkData(data);
|
|
264
|
+
const blockCIDs = [];
|
|
265
|
+
// Store each chunk
|
|
266
|
+
for (const chunk of chunks) {
|
|
267
|
+
const blockCID = computeCID(chunk);
|
|
268
|
+
if (!(await this.backend.exists(blockCID))) {
|
|
269
|
+
await this.backend.put(blockCID, chunk, tier);
|
|
270
|
+
}
|
|
271
|
+
blockCIDs.push(blockCID);
|
|
272
|
+
}
|
|
273
|
+
// Compute root CID from full data
|
|
274
|
+
const cid = computeCID(data);
|
|
275
|
+
const merkleRoot = computeMerkleRoot(blockCIDs);
|
|
276
|
+
// Build file entry
|
|
277
|
+
const fileEntry = {
|
|
278
|
+
cid,
|
|
279
|
+
owner: this.agentId,
|
|
280
|
+
metadata: {
|
|
281
|
+
name: metadata.name || 'unnamed',
|
|
282
|
+
mimeType: metadata.mimeType || 'application/octet-stream',
|
|
283
|
+
size: data.length,
|
|
284
|
+
createdAt: metadata.createdAt || now,
|
|
285
|
+
modifiedAt: now,
|
|
286
|
+
tags: metadata.tags || [],
|
|
287
|
+
encryptionKeyId: options.encrypt ? this.generateKeyId() : undefined,
|
|
288
|
+
compression: options.compress ? 'gzip' : undefined,
|
|
289
|
+
},
|
|
290
|
+
tier,
|
|
291
|
+
accessControl: [{
|
|
292
|
+
agentId: this.agentId,
|
|
293
|
+
permission: Permission.ADMIN,
|
|
294
|
+
grantedAt: now,
|
|
295
|
+
grantedBy: this.agentId,
|
|
296
|
+
}],
|
|
297
|
+
merkleRoot,
|
|
298
|
+
blocks: blockCIDs,
|
|
299
|
+
replicationFactor: options.replicationFactor || this.config.replicationFactor,
|
|
300
|
+
lastAccessedAt: now,
|
|
301
|
+
accessCount: 0,
|
|
302
|
+
};
|
|
303
|
+
// Index file
|
|
304
|
+
this.fileIndex.set(cid, fileEntry);
|
|
305
|
+
this.searchIndex.indexFile(cid, fileEntry.metadata);
|
|
306
|
+
return cid;
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Retrieve a file by its CID
|
|
310
|
+
*
|
|
311
|
+
* @param cid - Content Identifier
|
|
312
|
+
* @param requesterAgentId - Optional agent ID for permission check (defaults to current agent)
|
|
313
|
+
* @returns File content as Buffer
|
|
314
|
+
*/
|
|
315
|
+
async read(cid, requesterAgentId) {
|
|
316
|
+
const agentId = requesterAgentId || this.agentId;
|
|
317
|
+
const entry = this.fileIndex.get(cid);
|
|
318
|
+
if (!entry) {
|
|
319
|
+
throw new FileNotFoundError(cid);
|
|
320
|
+
}
|
|
321
|
+
// Check permission
|
|
322
|
+
if (!this.hasPermission(agentId, entry, Permission.READ)) {
|
|
323
|
+
throw new PermissionDeniedError(agentId, cid, Permission.READ);
|
|
324
|
+
}
|
|
325
|
+
// Retrieve blocks
|
|
326
|
+
const chunks = [];
|
|
327
|
+
for (const blockCID of entry.blocks) {
|
|
328
|
+
const chunk = await this.backend.get(blockCID);
|
|
329
|
+
if (!chunk) {
|
|
330
|
+
throw new ClawFSError(`Block ${blockCID} missing for file ${cid}`, 'BLOCK_MISSING');
|
|
331
|
+
}
|
|
332
|
+
chunks.push(chunk);
|
|
333
|
+
}
|
|
334
|
+
// Update access stats
|
|
335
|
+
entry.lastAccessedAt = new Date();
|
|
336
|
+
entry.accessCount++;
|
|
337
|
+
// Auto-promote hot files
|
|
338
|
+
if (entry.tier !== StorageTier.HOT && entry.accessCount > 10) {
|
|
339
|
+
await this.promoteToTier(cid, StorageTier.HOT);
|
|
340
|
+
}
|
|
341
|
+
return Buffer.concat(chunks);
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Share a file with other agents
|
|
345
|
+
*
|
|
346
|
+
* @param cid - Content Identifier
|
|
347
|
+
* @param agentIds - Array of agent IDs to share with
|
|
348
|
+
* @param permission - Permission level to grant
|
|
349
|
+
* @returns The updated FileEntry
|
|
350
|
+
*/
|
|
351
|
+
async share(cid, agentIds, permission = Permission.READ) {
|
|
352
|
+
const entry = this.fileIndex.get(cid);
|
|
353
|
+
if (!entry) {
|
|
354
|
+
throw new FileNotFoundError(cid);
|
|
355
|
+
}
|
|
356
|
+
// Check current agent has admin permission
|
|
357
|
+
if (!this.hasPermission(this.agentId, entry, Permission.ADMIN)) {
|
|
358
|
+
throw new PermissionDeniedError(this.agentId, cid, Permission.ADMIN);
|
|
359
|
+
}
|
|
360
|
+
const now = new Date();
|
|
361
|
+
for (const agentId of agentIds) {
|
|
362
|
+
// Remove existing permission for this agent
|
|
363
|
+
entry.accessControl = entry.accessControl.filter(ac => ac.agentId !== agentId);
|
|
364
|
+
// Add new permission
|
|
365
|
+
entry.accessControl.push({
|
|
366
|
+
agentId,
|
|
367
|
+
permission,
|
|
368
|
+
grantedAt: now,
|
|
369
|
+
grantedBy: this.agentId,
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
return entry;
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* List files accessible to the current agent
|
|
376
|
+
*
|
|
377
|
+
* @param options - Filter options
|
|
378
|
+
* @returns Array of FileEntry objects
|
|
379
|
+
*/
|
|
380
|
+
async list(options = {}) {
|
|
381
|
+
let files = Array.from(this.fileIndex.values());
|
|
382
|
+
// Filter by ownership if requested
|
|
383
|
+
if (options.ownedOnly) {
|
|
384
|
+
files = files.filter(f => f.owner === this.agentId);
|
|
385
|
+
}
|
|
386
|
+
else {
|
|
387
|
+
// Filter by permission
|
|
388
|
+
files = files.filter(f => this.hasPermission(this.agentId, f, Permission.READ));
|
|
389
|
+
}
|
|
390
|
+
// Filter by tier
|
|
391
|
+
if (options.tier) {
|
|
392
|
+
files = files.filter(f => f.tier === options.tier);
|
|
393
|
+
}
|
|
394
|
+
// Filter by tags
|
|
395
|
+
if (options.tags && options.tags.length > 0) {
|
|
396
|
+
files = files.filter(f => options.tags.some(tag => f.metadata.tags.includes(tag)));
|
|
397
|
+
}
|
|
398
|
+
// Sort by last accessed (most recent first)
|
|
399
|
+
files.sort((a, b) => b.lastAccessedAt.getTime() - a.lastAccessedAt.getTime());
|
|
400
|
+
// Apply pagination
|
|
401
|
+
const offset = options.offset || 0;
|
|
402
|
+
const limit = options.limit || files.length;
|
|
403
|
+
return files.slice(offset, offset + limit);
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Create a Merkle-backed snapshot of the current file system state
|
|
407
|
+
*
|
|
408
|
+
* @param options - Snapshot options
|
|
409
|
+
* @returns The created Snapshot
|
|
410
|
+
*/
|
|
411
|
+
async snapshot(options = {}) {
|
|
412
|
+
let files = Array.from(this.fileIndex.values());
|
|
413
|
+
// Apply filters
|
|
414
|
+
if (options.includeFiles) {
|
|
415
|
+
const includeSet = new Set(options.includeFiles);
|
|
416
|
+
files = files.filter(f => includeSet.has(f.cid));
|
|
417
|
+
}
|
|
418
|
+
if (options.excludeFiles) {
|
|
419
|
+
const excludeSet = new Set(options.excludeFiles);
|
|
420
|
+
files = files.filter(f => !excludeSet.has(f.cid));
|
|
421
|
+
}
|
|
422
|
+
// Build snapshot Merkle tree
|
|
423
|
+
const fileRoots = files.map(f => f.merkleRoot).sort();
|
|
424
|
+
const merkleRoot = computeMerkleRoot(fileRoots);
|
|
425
|
+
const snapshot = {
|
|
426
|
+
id: (0, crypto_1.randomUUID)(),
|
|
427
|
+
timestamp: new Date(),
|
|
428
|
+
merkleRoot,
|
|
429
|
+
fileCount: files.length,
|
|
430
|
+
totalSize: files.reduce((sum, f) => sum + f.metadata.size, 0),
|
|
431
|
+
previousSnapshot: this.snapshots.length > 0
|
|
432
|
+
? this.snapshots[this.snapshots.length - 1].id
|
|
433
|
+
: undefined,
|
|
434
|
+
includedFiles: files.map(f => f.cid),
|
|
435
|
+
};
|
|
436
|
+
this.snapshots.push(snapshot);
|
|
437
|
+
return snapshot;
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* Semantic search across files
|
|
441
|
+
*
|
|
442
|
+
* @param query - Search query string
|
|
443
|
+
* @param options - Search options
|
|
444
|
+
* @returns Array of SearchResult objects
|
|
445
|
+
*/
|
|
446
|
+
async search(query, options = {}) {
|
|
447
|
+
const limit = options.limit || 10;
|
|
448
|
+
// Get search results
|
|
449
|
+
let results = this.searchIndex.search(query, limit * 2); // Get extra for filtering
|
|
450
|
+
// Filter by tags if specified
|
|
451
|
+
if (options.tags && options.tags.length > 0) {
|
|
452
|
+
results = results.filter(r => options.tags.some(tag => r.metadata.tags.includes(tag)));
|
|
453
|
+
}
|
|
454
|
+
// Filter to only files we have permission to read
|
|
455
|
+
results = results.filter(r => {
|
|
456
|
+
const entry = this.fileIndex.get(r.cid);
|
|
457
|
+
return entry && this.hasPermission(this.agentId, entry, Permission.READ);
|
|
458
|
+
});
|
|
459
|
+
return results.slice(0, limit);
|
|
460
|
+
}
|
|
461
|
+
// ==========================================================================
|
|
462
|
+
// ADVANCED OPERATIONS
|
|
463
|
+
// ==========================================================================
|
|
464
|
+
/**
|
|
465
|
+
* Change the storage tier of a file
|
|
466
|
+
*
|
|
467
|
+
* @param cid - Content Identifier
|
|
468
|
+
* @param tier - Target storage tier
|
|
469
|
+
*/
|
|
470
|
+
async setTier(cid, tier) {
|
|
471
|
+
const entry = this.fileIndex.get(cid);
|
|
472
|
+
if (!entry) {
|
|
473
|
+
throw new FileNotFoundError(cid);
|
|
474
|
+
}
|
|
475
|
+
if (!this.hasPermission(this.agentId, entry, Permission.WRITE)) {
|
|
476
|
+
throw new PermissionDeniedError(this.agentId, cid, Permission.WRITE);
|
|
477
|
+
}
|
|
478
|
+
for (const blockCID of entry.blocks) {
|
|
479
|
+
await this.backend.promote(blockCID, tier);
|
|
480
|
+
}
|
|
481
|
+
entry.tier = tier;
|
|
482
|
+
}
|
|
483
|
+
/**
|
|
484
|
+
* Delete a file (requires ADMIN permission)
|
|
485
|
+
*
|
|
486
|
+
* @param cid - Content Identifier
|
|
487
|
+
*/
|
|
488
|
+
async delete(cid) {
|
|
489
|
+
const entry = this.fileIndex.get(cid);
|
|
490
|
+
if (!entry) {
|
|
491
|
+
throw new FileNotFoundError(cid);
|
|
492
|
+
}
|
|
493
|
+
if (!this.hasPermission(this.agentId, entry, Permission.ADMIN)) {
|
|
494
|
+
throw new PermissionDeniedError(this.agentId, cid, Permission.ADMIN);
|
|
495
|
+
}
|
|
496
|
+
// Delete blocks
|
|
497
|
+
for (const blockCID of entry.blocks) {
|
|
498
|
+
// Check if block is used by other files before deleting
|
|
499
|
+
const usedByOthers = Array.from(this.fileIndex.values()).some(f => f.cid !== cid && f.blocks.includes(blockCID));
|
|
500
|
+
if (!usedByOthers) {
|
|
501
|
+
await this.backend.delete(blockCID);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
// Remove from indices
|
|
505
|
+
this.fileIndex.delete(cid);
|
|
506
|
+
this.searchIndex.removeFile(cid);
|
|
507
|
+
}
|
|
508
|
+
/**
|
|
509
|
+
* Get file entry metadata without reading content
|
|
510
|
+
*
|
|
511
|
+
* @param cid - Content Identifier
|
|
512
|
+
* @returns FileEntry if found and accessible
|
|
513
|
+
*/
|
|
514
|
+
async stat(cid) {
|
|
515
|
+
const entry = this.fileIndex.get(cid);
|
|
516
|
+
if (!entry)
|
|
517
|
+
return null;
|
|
518
|
+
if (!this.hasPermission(this.agentId, entry, Permission.READ)) {
|
|
519
|
+
return null;
|
|
520
|
+
}
|
|
521
|
+
return entry;
|
|
522
|
+
}
|
|
523
|
+
/**
|
|
524
|
+
* Get all snapshots
|
|
525
|
+
*
|
|
526
|
+
* @returns Array of snapshots
|
|
527
|
+
*/
|
|
528
|
+
async getSnapshots() {
|
|
529
|
+
return [...this.snapshots];
|
|
530
|
+
}
|
|
531
|
+
/**
|
|
532
|
+
* Verify file integrity using Merkle tree
|
|
533
|
+
*
|
|
534
|
+
* @param cid - Content Identifier
|
|
535
|
+
* @returns True if file is valid
|
|
536
|
+
*/
|
|
537
|
+
async verify(cid) {
|
|
538
|
+
const entry = this.fileIndex.get(cid);
|
|
539
|
+
if (!entry)
|
|
540
|
+
return false;
|
|
541
|
+
try {
|
|
542
|
+
const blockHashes = [];
|
|
543
|
+
for (const blockCID of entry.blocks) {
|
|
544
|
+
const chunk = await this.backend.get(blockCID);
|
|
545
|
+
if (!chunk)
|
|
546
|
+
return false;
|
|
547
|
+
blockHashes.push(computeCID(chunk)); // Verify block CID matches content
|
|
548
|
+
}
|
|
549
|
+
const computedRoot = computeMerkleRoot(blockHashes);
|
|
550
|
+
return computedRoot === entry.merkleRoot;
|
|
551
|
+
}
|
|
552
|
+
catch {
|
|
553
|
+
return false;
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
// ==========================================================================
|
|
557
|
+
// PRIVATE HELPERS
|
|
558
|
+
// ==========================================================================
|
|
559
|
+
inferTier(size) {
|
|
560
|
+
if (size < 1024 * 1024)
|
|
561
|
+
return StorageTier.HOT; // < 1MB
|
|
562
|
+
if (size < 100 * 1024 * 1024)
|
|
563
|
+
return StorageTier.WARM; // < 100MB
|
|
564
|
+
return StorageTier.COLD;
|
|
565
|
+
}
|
|
566
|
+
hasPermission(agentId, entry, required) {
|
|
567
|
+
const ac = entry.accessControl.find(a => a.agentId === agentId);
|
|
568
|
+
if (!ac)
|
|
569
|
+
return false;
|
|
570
|
+
// Check expiration
|
|
571
|
+
if (ac.expiresAt && ac.expiresAt < new Date()) {
|
|
572
|
+
return false;
|
|
573
|
+
}
|
|
574
|
+
const levels = [Permission.READ, Permission.WRITE, Permission.ADMIN];
|
|
575
|
+
const requiredIdx = levels.indexOf(required);
|
|
576
|
+
const grantedIdx = levels.indexOf(ac.permission);
|
|
577
|
+
return grantedIdx >= requiredIdx;
|
|
578
|
+
}
|
|
579
|
+
async promoteToTier(cid, tier) {
|
|
580
|
+
const entry = this.fileIndex.get(cid);
|
|
581
|
+
if (!entry || entry.tier === tier)
|
|
582
|
+
return;
|
|
583
|
+
for (const blockCID of entry.blocks) {
|
|
584
|
+
await this.backend.promote(blockCID, tier);
|
|
585
|
+
}
|
|
586
|
+
entry.tier = tier;
|
|
587
|
+
}
|
|
588
|
+
generateKeyId() {
|
|
589
|
+
return `key-${(0, crypto_1.randomUUID)()}`;
|
|
590
|
+
}
|
|
591
|
+
// ==========================================================================
|
|
592
|
+
// PERSISTENCE (for crash recovery)
|
|
593
|
+
// ==========================================================================
|
|
594
|
+
/**
|
|
595
|
+
* Export file system state for persistence
|
|
596
|
+
*
|
|
597
|
+
* @returns Serialized state
|
|
598
|
+
*/
|
|
599
|
+
exportState() {
|
|
600
|
+
return {
|
|
601
|
+
agentId: this.agentId,
|
|
602
|
+
files: Array.from(this.fileIndex.entries()),
|
|
603
|
+
snapshots: this.snapshots,
|
|
604
|
+
config: this.config,
|
|
605
|
+
exportedAt: new Date().toISOString(),
|
|
606
|
+
};
|
|
607
|
+
}
|
|
608
|
+
/**
|
|
609
|
+
* Import file system state (for recovery after crash)
|
|
610
|
+
*
|
|
611
|
+
* @param state - Serialized state
|
|
612
|
+
*/
|
|
613
|
+
importState(state) {
|
|
614
|
+
this.fileIndex = new Map(state.files);
|
|
615
|
+
this.snapshots = state.snapshots;
|
|
616
|
+
// Rebuild search index
|
|
617
|
+
this.searchIndex = new SearchIndex();
|
|
618
|
+
for (const [cid, entry] of this.fileIndex.entries()) {
|
|
619
|
+
this.searchIndex.indexFile(cid, entry.metadata);
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
exports.ClawFSClient = ClawFSClient;
|
|
624
|
+
// ============================================================================
|
|
625
|
+
// EXPORTS
|
|
626
|
+
// ============================================================================
|
|
627
|
+
exports.default = ClawFSClient;
|
|
628
|
+
//# sourceMappingURL=clawfs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clawfs.js","sourceRoot":"","sources":["../../src/lib/clawfs.ts"],"names":[],"mappings":"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"}
|