@soulcraft/brainy 0.23.0 → 0.25.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 +22 -16
- package/dist/brainy.js +4574 -4691
- package/dist/brainy.min.js +750 -750
- package/dist/brainyData.d.ts +86 -10
- package/dist/coreTypes.d.ts +11 -0
- package/dist/storage/adapters/fileSystemStorage.d.ts +78 -29
- package/dist/storage/adapters/fileSystemStorage.d.ts.map +1 -1
- package/dist/storage/adapters/memoryStorage.d.ts.map +1 -1
- package/dist/storage/fileSystemStorage.d.ts +2 -15
- package/dist/storage/fileSystemStorage.d.ts.map +1 -1
- package/dist/storage/opfsStorage.d.ts +3 -66
- package/dist/storage/opfsStorage.d.ts.map +1 -1
- package/dist/storage/s3CompatibleStorage.d.ts +2 -14
- package/dist/storage/s3CompatibleStorage.d.ts.map +1 -1
- package/dist/testing/prettyReporter.d.ts +23 -0
- package/dist/testing/prettySummaryReporter.d.ts +22 -0
- package/dist/types/tensorflowTypes.d.ts +0 -8
- package/dist/types/tensorflowTypes.d.ts.map +1 -1
- package/dist/unified.d.ts +4 -0
- package/dist/unified.js +846 -297
- package/dist/unified.min.js +528 -528
- package/dist/utils/embedding.d.ts +7 -0
- package/dist/utils/embedding.d.ts.map +1 -1
- package/dist/utils/logger.d.ts +99 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/textEncoding.d.ts +0 -7
- package/dist/utils/textEncoding.d.ts.map +1 -1
- package/dist/utils/version.d.ts +1 -1
- package/package.json +14 -3
- package/dist/augmentations/conduitAugmentations.js +0 -1158
- package/dist/augmentations/conduitAugmentations.js.map +0 -1
- package/dist/augmentations/memoryAugmentations.js +0 -255
- package/dist/augmentations/memoryAugmentations.js.map +0 -1
- package/dist/augmentations/serverSearchAugmentations.js +0 -531
- package/dist/augmentations/serverSearchAugmentations.js.map +0 -1
- package/dist/examples/basicUsage.js +0 -128
- package/dist/examples/basicUsage.js.map +0 -1
- package/dist/hnsw/hnswIndex.js +0 -550
- package/dist/hnsw/hnswIndex.js.map +0 -1
- package/dist/hnsw/hnswIndexOptimized.js +0 -441
- package/dist/hnsw/hnswIndexOptimized.js.map +0 -1
- package/dist/mcp/brainyMCPAdapter.js +0 -142
- package/dist/mcp/brainyMCPAdapter.js.map +0 -1
- package/dist/mcp/brainyMCPService.js +0 -248
- package/dist/mcp/brainyMCPService.js.map +0 -1
- package/dist/mcp/index.js +0 -17
- package/dist/mcp/index.js.map +0 -1
- package/dist/mcp/mcpAugmentationToolset.js +0 -180
- package/dist/mcp/mcpAugmentationToolset.js.map +0 -1
- package/dist/storage/adapters/baseStorageAdapter.js +0 -233
- package/dist/storage/adapters/baseStorageAdapter.js.map +0 -1
- package/dist/storage/adapters/fileSystemStorage.js +0 -568
- package/dist/storage/adapters/fileSystemStorage.js.map +0 -1
- package/dist/storage/adapters/memoryStorage.js +0 -300
- package/dist/storage/adapters/memoryStorage.js.map +0 -1
- package/dist/storage/adapters/opfsStorage.js +0 -778
- package/dist/storage/adapters/opfsStorage.js.map +0 -1
- package/dist/storage/adapters/s3CompatibleStorage.js +0 -1021
- package/dist/storage/adapters/s3CompatibleStorage.js.map +0 -1
- package/dist/storage/baseStorage.js +0 -126
- package/dist/storage/baseStorage.js.map +0 -1
- package/dist/storage/storageFactory.js +0 -183
- package/dist/storage/storageFactory.js.map +0 -1
- package/dist/types/augmentations.js +0 -16
- package/dist/types/augmentations.js.map +0 -1
- package/dist/types/brainyDataInterface.js +0 -8
- package/dist/types/brainyDataInterface.js.map +0 -1
- package/dist/types/fileSystemTypes.js +0 -8
- package/dist/types/fileSystemTypes.js.map +0 -1
- package/dist/types/graphTypes.js +0 -36
- package/dist/types/graphTypes.js.map +0 -1
- package/dist/types/mcpTypes.js +0 -22
- package/dist/types/mcpTypes.js.map +0 -1
- package/dist/types/pipelineTypes.js +0 -7
- package/dist/types/pipelineTypes.js.map +0 -1
- package/dist/types/tensorflowTypes.js +0 -6
- package/dist/types/tensorflowTypes.js.map +0 -1
- package/dist/utils/distance.js +0 -239
- package/dist/utils/distance.js.map +0 -1
- package/dist/utils/embedding.js +0 -622
- package/dist/utils/embedding.js.map +0 -1
- package/dist/utils/environment.js +0 -75
- package/dist/utils/environment.js.map +0 -1
- package/dist/utils/index.js +0 -5
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/statistics.js +0 -25
- package/dist/utils/statistics.js.map +0 -1
- package/dist/utils/tensorflowUtils.js +0 -25
- package/dist/utils/tensorflowUtils.js.map +0 -1
- package/dist/utils/textEncoding.js +0 -281
- package/dist/utils/textEncoding.js.map +0 -1
- package/dist/utils/workerUtils.js +0 -458
- package/dist/utils/workerUtils.js.map +0 -1
|
@@ -1,568 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* File System Storage Adapter
|
|
3
|
-
* File system storage adapter for Node.js environments
|
|
4
|
-
*/
|
|
5
|
-
import { BaseStorage, NOUNS_DIR, VERBS_DIR, METADATA_DIR, INDEX_DIR, STATISTICS_KEY } from '../baseStorage.js';
|
|
6
|
-
// Node.js modules - dynamically imported to avoid issues in browser environments
|
|
7
|
-
let fs;
|
|
8
|
-
let path;
|
|
9
|
-
// Try to load Node.js modules
|
|
10
|
-
try {
|
|
11
|
-
// Using dynamic imports to avoid issues in browser environments
|
|
12
|
-
const fsPromise = import('fs');
|
|
13
|
-
const pathPromise = import('path');
|
|
14
|
-
Promise.all([fsPromise, pathPromise]).then(([fsModule, pathModule]) => {
|
|
15
|
-
fs = fsModule;
|
|
16
|
-
path = pathModule.default;
|
|
17
|
-
}).catch(error => {
|
|
18
|
-
console.error('Failed to load Node.js modules:', error);
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
catch (error) {
|
|
22
|
-
console.error('FileSystemStorage: Failed to load Node.js modules. This adapter is not supported in this environment.', error);
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* File system storage adapter for Node.js environments
|
|
26
|
-
* Uses the file system to store data in the specified directory structure
|
|
27
|
-
*/
|
|
28
|
-
export class FileSystemStorage extends BaseStorage {
|
|
29
|
-
/**
|
|
30
|
-
* Initialize the storage adapter
|
|
31
|
-
* @param rootDirectory The root directory for storage
|
|
32
|
-
*/
|
|
33
|
-
constructor(rootDirectory) {
|
|
34
|
-
super();
|
|
35
|
-
this.rootDir = rootDirectory;
|
|
36
|
-
this.nounsDir = path.join(this.rootDir, NOUNS_DIR);
|
|
37
|
-
this.verbsDir = path.join(this.rootDir, VERBS_DIR);
|
|
38
|
-
this.metadataDir = path.join(this.rootDir, METADATA_DIR);
|
|
39
|
-
this.indexDir = path.join(this.rootDir, INDEX_DIR);
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Initialize the storage adapter
|
|
43
|
-
*/
|
|
44
|
-
async init() {
|
|
45
|
-
if (this.isInitialized) {
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
// Check if Node.js modules are available
|
|
49
|
-
if (!fs || !path) {
|
|
50
|
-
throw new Error('FileSystemStorage requires a Node.js environment, but `fs` and `path` modules could not be loaded.');
|
|
51
|
-
}
|
|
52
|
-
try {
|
|
53
|
-
// Create the root directory if it doesn't exist
|
|
54
|
-
await this.ensureDirectoryExists(this.rootDir);
|
|
55
|
-
// Create the nouns directory if it doesn't exist
|
|
56
|
-
await this.ensureDirectoryExists(this.nounsDir);
|
|
57
|
-
// Create the verbs directory if it doesn't exist
|
|
58
|
-
await this.ensureDirectoryExists(this.verbsDir);
|
|
59
|
-
// Create the metadata directory if it doesn't exist
|
|
60
|
-
await this.ensureDirectoryExists(this.metadataDir);
|
|
61
|
-
// Create the index directory if it doesn't exist
|
|
62
|
-
await this.ensureDirectoryExists(this.indexDir);
|
|
63
|
-
this.isInitialized = true;
|
|
64
|
-
}
|
|
65
|
-
catch (error) {
|
|
66
|
-
console.error('Error initializing FileSystemStorage:', error);
|
|
67
|
-
throw error;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Ensure a directory exists, creating it if necessary
|
|
72
|
-
*/
|
|
73
|
-
async ensureDirectoryExists(dirPath) {
|
|
74
|
-
try {
|
|
75
|
-
await fs.promises.mkdir(dirPath, { recursive: true });
|
|
76
|
-
}
|
|
77
|
-
catch (error) {
|
|
78
|
-
// Ignore EEXIST error, which means the directory already exists
|
|
79
|
-
if (error.code !== 'EEXIST') {
|
|
80
|
-
throw error;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Save a node to storage
|
|
86
|
-
*/
|
|
87
|
-
async saveNode(node) {
|
|
88
|
-
await this.ensureInitialized();
|
|
89
|
-
// Convert connections Map to a serializable format
|
|
90
|
-
const serializableNode = {
|
|
91
|
-
...node,
|
|
92
|
-
connections: this.mapToObject(node.connections, (set) => Array.from(set))
|
|
93
|
-
};
|
|
94
|
-
const filePath = path.join(this.nounsDir, `${node.id}.json`);
|
|
95
|
-
await fs.promises.writeFile(filePath, JSON.stringify(serializableNode, null, 2));
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Get a node from storage
|
|
99
|
-
*/
|
|
100
|
-
async getNode(id) {
|
|
101
|
-
await this.ensureInitialized();
|
|
102
|
-
const filePath = path.join(this.nounsDir, `${id}.json`);
|
|
103
|
-
try {
|
|
104
|
-
const data = await fs.promises.readFile(filePath, 'utf-8');
|
|
105
|
-
const parsedNode = JSON.parse(data);
|
|
106
|
-
// Convert serialized connections back to Map<number, Set<string>>
|
|
107
|
-
const connections = new Map();
|
|
108
|
-
for (const [level, nodeIds] of Object.entries(parsedNode.connections)) {
|
|
109
|
-
connections.set(Number(level), new Set(nodeIds));
|
|
110
|
-
}
|
|
111
|
-
return {
|
|
112
|
-
id: parsedNode.id,
|
|
113
|
-
vector: parsedNode.vector,
|
|
114
|
-
connections
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
catch (error) {
|
|
118
|
-
if (error.code !== 'ENOENT') {
|
|
119
|
-
console.error(`Error reading node ${id}:`, error);
|
|
120
|
-
}
|
|
121
|
-
return null;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Get all nodes from storage
|
|
126
|
-
*/
|
|
127
|
-
async getAllNodes() {
|
|
128
|
-
await this.ensureInitialized();
|
|
129
|
-
const allNodes = [];
|
|
130
|
-
try {
|
|
131
|
-
const files = await fs.promises.readdir(this.nounsDir);
|
|
132
|
-
for (const file of files) {
|
|
133
|
-
if (file.endsWith('.json')) {
|
|
134
|
-
const filePath = path.join(this.nounsDir, file);
|
|
135
|
-
const data = await fs.promises.readFile(filePath, 'utf-8');
|
|
136
|
-
const parsedNode = JSON.parse(data);
|
|
137
|
-
// Convert serialized connections back to Map<number, Set<string>>
|
|
138
|
-
const connections = new Map();
|
|
139
|
-
for (const [level, nodeIds] of Object.entries(parsedNode.connections)) {
|
|
140
|
-
connections.set(Number(level), new Set(nodeIds));
|
|
141
|
-
}
|
|
142
|
-
allNodes.push({
|
|
143
|
-
id: parsedNode.id,
|
|
144
|
-
vector: parsedNode.vector,
|
|
145
|
-
connections
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
catch (error) {
|
|
151
|
-
if (error.code !== 'ENOENT') {
|
|
152
|
-
console.error(`Error reading directory ${this.nounsDir}:`, error);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
return allNodes;
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* Get nodes by noun type
|
|
159
|
-
* @param nounType The noun type to filter by
|
|
160
|
-
* @returns Promise that resolves to an array of nodes of the specified noun type
|
|
161
|
-
*/
|
|
162
|
-
async getNodesByNounType(nounType) {
|
|
163
|
-
await this.ensureInitialized();
|
|
164
|
-
const nouns = [];
|
|
165
|
-
try {
|
|
166
|
-
const files = await fs.promises.readdir(this.nounsDir);
|
|
167
|
-
for (const file of files) {
|
|
168
|
-
if (file.endsWith('.json')) {
|
|
169
|
-
const filePath = path.join(this.nounsDir, file);
|
|
170
|
-
const data = await fs.promises.readFile(filePath, 'utf-8');
|
|
171
|
-
const parsedNode = JSON.parse(data);
|
|
172
|
-
// Filter by noun type using metadata
|
|
173
|
-
const nodeId = parsedNode.id;
|
|
174
|
-
const metadata = await this.getMetadata(nodeId);
|
|
175
|
-
if (metadata && metadata.noun === nounType) {
|
|
176
|
-
// Convert serialized connections back to Map<number, Set<string>>
|
|
177
|
-
const connections = new Map();
|
|
178
|
-
for (const [level, nodeIds] of Object.entries(parsedNode.connections)) {
|
|
179
|
-
connections.set(Number(level), new Set(nodeIds));
|
|
180
|
-
}
|
|
181
|
-
nouns.push({
|
|
182
|
-
id: parsedNode.id,
|
|
183
|
-
vector: parsedNode.vector,
|
|
184
|
-
connections
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
catch (error) {
|
|
191
|
-
if (error.code !== 'ENOENT') {
|
|
192
|
-
console.error(`Error reading directory ${this.nounsDir}:`, error);
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
return nouns;
|
|
196
|
-
}
|
|
197
|
-
/**
|
|
198
|
-
* Delete a node from storage
|
|
199
|
-
*/
|
|
200
|
-
async deleteNode(id) {
|
|
201
|
-
await this.ensureInitialized();
|
|
202
|
-
const filePath = path.join(this.nounsDir, `${id}.json`);
|
|
203
|
-
try {
|
|
204
|
-
await fs.promises.unlink(filePath);
|
|
205
|
-
}
|
|
206
|
-
catch (error) {
|
|
207
|
-
if (error.code !== 'ENOENT') {
|
|
208
|
-
console.error(`Error deleting node file ${filePath}:`, error);
|
|
209
|
-
throw error;
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
/**
|
|
214
|
-
* Save an edge to storage
|
|
215
|
-
*/
|
|
216
|
-
async saveEdge(edge) {
|
|
217
|
-
await this.ensureInitialized();
|
|
218
|
-
// Convert connections Map to a serializable format
|
|
219
|
-
const serializableEdge = {
|
|
220
|
-
...edge,
|
|
221
|
-
connections: this.mapToObject(edge.connections, (set) => Array.from(set))
|
|
222
|
-
};
|
|
223
|
-
const filePath = path.join(this.verbsDir, `${edge.id}.json`);
|
|
224
|
-
await fs.promises.writeFile(filePath, JSON.stringify(serializableEdge, null, 2));
|
|
225
|
-
}
|
|
226
|
-
/**
|
|
227
|
-
* Get an edge from storage
|
|
228
|
-
*/
|
|
229
|
-
async getEdge(id) {
|
|
230
|
-
await this.ensureInitialized();
|
|
231
|
-
const filePath = path.join(this.verbsDir, `${id}.json`);
|
|
232
|
-
try {
|
|
233
|
-
const data = await fs.promises.readFile(filePath, 'utf-8');
|
|
234
|
-
const parsedEdge = JSON.parse(data);
|
|
235
|
-
// Convert serialized connections back to Map<number, Set<string>>
|
|
236
|
-
const connections = new Map();
|
|
237
|
-
for (const [level, nodeIds] of Object.entries(parsedEdge.connections)) {
|
|
238
|
-
connections.set(Number(level), new Set(nodeIds));
|
|
239
|
-
}
|
|
240
|
-
return {
|
|
241
|
-
id: parsedEdge.id,
|
|
242
|
-
vector: parsedEdge.vector,
|
|
243
|
-
connections,
|
|
244
|
-
sourceId: parsedEdge.sourceId,
|
|
245
|
-
targetId: parsedEdge.targetId,
|
|
246
|
-
type: parsedEdge.type,
|
|
247
|
-
weight: parsedEdge.weight,
|
|
248
|
-
metadata: parsedEdge.metadata
|
|
249
|
-
};
|
|
250
|
-
}
|
|
251
|
-
catch (error) {
|
|
252
|
-
if (error.code !== 'ENOENT') {
|
|
253
|
-
console.error(`Error reading edge ${id}:`, error);
|
|
254
|
-
}
|
|
255
|
-
return null;
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
/**
|
|
259
|
-
* Get all edges from storage
|
|
260
|
-
*/
|
|
261
|
-
async getAllEdges() {
|
|
262
|
-
await this.ensureInitialized();
|
|
263
|
-
const allEdges = [];
|
|
264
|
-
try {
|
|
265
|
-
const files = await fs.promises.readdir(this.verbsDir);
|
|
266
|
-
for (const file of files) {
|
|
267
|
-
if (file.endsWith('.json')) {
|
|
268
|
-
const filePath = path.join(this.verbsDir, file);
|
|
269
|
-
const data = await fs.promises.readFile(filePath, 'utf-8');
|
|
270
|
-
const parsedEdge = JSON.parse(data);
|
|
271
|
-
// Convert serialized connections back to Map<number, Set<string>>
|
|
272
|
-
const connections = new Map();
|
|
273
|
-
for (const [level, nodeIds] of Object.entries(parsedEdge.connections)) {
|
|
274
|
-
connections.set(Number(level), new Set(nodeIds));
|
|
275
|
-
}
|
|
276
|
-
allEdges.push({
|
|
277
|
-
id: parsedEdge.id,
|
|
278
|
-
vector: parsedEdge.vector,
|
|
279
|
-
connections,
|
|
280
|
-
sourceId: parsedEdge.sourceId,
|
|
281
|
-
targetId: parsedEdge.targetId,
|
|
282
|
-
type: parsedEdge.type,
|
|
283
|
-
weight: parsedEdge.weight,
|
|
284
|
-
metadata: parsedEdge.metadata
|
|
285
|
-
});
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
catch (error) {
|
|
290
|
-
if (error.code !== 'ENOENT') {
|
|
291
|
-
console.error(`Error reading directory ${this.verbsDir}:`, error);
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
return allEdges;
|
|
295
|
-
}
|
|
296
|
-
/**
|
|
297
|
-
* Get edges by source
|
|
298
|
-
*/
|
|
299
|
-
async getEdgesBySource(sourceId) {
|
|
300
|
-
const edges = await this.getAllEdges();
|
|
301
|
-
return edges.filter((edge) => edge.sourceId === sourceId);
|
|
302
|
-
}
|
|
303
|
-
/**
|
|
304
|
-
* Get edges by target
|
|
305
|
-
*/
|
|
306
|
-
async getEdgesByTarget(targetId) {
|
|
307
|
-
const edges = await this.getAllEdges();
|
|
308
|
-
return edges.filter((edge) => edge.targetId === targetId);
|
|
309
|
-
}
|
|
310
|
-
/**
|
|
311
|
-
* Get edges by type
|
|
312
|
-
*/
|
|
313
|
-
async getEdgesByType(type) {
|
|
314
|
-
const edges = await this.getAllEdges();
|
|
315
|
-
return edges.filter((edge) => edge.type === type);
|
|
316
|
-
}
|
|
317
|
-
/**
|
|
318
|
-
* Delete an edge from storage
|
|
319
|
-
*/
|
|
320
|
-
async deleteEdge(id) {
|
|
321
|
-
await this.ensureInitialized();
|
|
322
|
-
const filePath = path.join(this.verbsDir, `${id}.json`);
|
|
323
|
-
try {
|
|
324
|
-
await fs.promises.unlink(filePath);
|
|
325
|
-
}
|
|
326
|
-
catch (error) {
|
|
327
|
-
if (error.code !== 'ENOENT') {
|
|
328
|
-
console.error(`Error deleting edge file ${filePath}:`, error);
|
|
329
|
-
throw error;
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
/**
|
|
334
|
-
* Save metadata to storage
|
|
335
|
-
*/
|
|
336
|
-
async saveMetadata(id, metadata) {
|
|
337
|
-
await this.ensureInitialized();
|
|
338
|
-
const filePath = path.join(this.metadataDir, `${id}.json`);
|
|
339
|
-
await fs.promises.writeFile(filePath, JSON.stringify(metadata, null, 2));
|
|
340
|
-
}
|
|
341
|
-
/**
|
|
342
|
-
* Get metadata from storage
|
|
343
|
-
*/
|
|
344
|
-
async getMetadata(id) {
|
|
345
|
-
await this.ensureInitialized();
|
|
346
|
-
const filePath = path.join(this.metadataDir, `${id}.json`);
|
|
347
|
-
try {
|
|
348
|
-
const data = await fs.promises.readFile(filePath, 'utf-8');
|
|
349
|
-
return JSON.parse(data);
|
|
350
|
-
}
|
|
351
|
-
catch (error) {
|
|
352
|
-
if (error.code !== 'ENOENT') {
|
|
353
|
-
console.error(`Error reading metadata ${id}:`, error);
|
|
354
|
-
}
|
|
355
|
-
return null;
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
/**
|
|
359
|
-
* Clear all data from storage
|
|
360
|
-
*/
|
|
361
|
-
async clear() {
|
|
362
|
-
await this.ensureInitialized();
|
|
363
|
-
// Helper function to remove all files in a directory
|
|
364
|
-
const removeDirectoryContents = async (dirPath) => {
|
|
365
|
-
try {
|
|
366
|
-
const files = await fs.promises.readdir(dirPath);
|
|
367
|
-
for (const file of files) {
|
|
368
|
-
const filePath = path.join(dirPath, file);
|
|
369
|
-
const stats = await fs.promises.stat(filePath);
|
|
370
|
-
if (stats.isDirectory()) {
|
|
371
|
-
await removeDirectoryContents(filePath);
|
|
372
|
-
await fs.promises.rmdir(filePath);
|
|
373
|
-
}
|
|
374
|
-
else {
|
|
375
|
-
await fs.promises.unlink(filePath);
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
catch (error) {
|
|
380
|
-
if (error.code !== 'ENOENT') {
|
|
381
|
-
console.error(`Error removing directory contents ${dirPath}:`, error);
|
|
382
|
-
throw error;
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
};
|
|
386
|
-
// Remove all files in the nouns directory
|
|
387
|
-
await removeDirectoryContents(this.nounsDir);
|
|
388
|
-
// Remove all files in the verbs directory
|
|
389
|
-
await removeDirectoryContents(this.verbsDir);
|
|
390
|
-
// Remove all files in the metadata directory
|
|
391
|
-
await removeDirectoryContents(this.metadataDir);
|
|
392
|
-
// Remove all files in the index directory
|
|
393
|
-
await removeDirectoryContents(this.indexDir);
|
|
394
|
-
}
|
|
395
|
-
/**
|
|
396
|
-
* Get information about storage usage and capacity
|
|
397
|
-
*/
|
|
398
|
-
async getStorageStatus() {
|
|
399
|
-
await this.ensureInitialized();
|
|
400
|
-
try {
|
|
401
|
-
// Calculate the total size of all files in the storage directories
|
|
402
|
-
let totalSize = 0;
|
|
403
|
-
// Helper function to calculate directory size
|
|
404
|
-
const calculateSize = async (dirPath) => {
|
|
405
|
-
let size = 0;
|
|
406
|
-
try {
|
|
407
|
-
const files = await fs.promises.readdir(dirPath);
|
|
408
|
-
for (const file of files) {
|
|
409
|
-
const filePath = path.join(dirPath, file);
|
|
410
|
-
const stats = await fs.promises.stat(filePath);
|
|
411
|
-
if (stats.isDirectory()) {
|
|
412
|
-
size += await calculateSize(filePath);
|
|
413
|
-
}
|
|
414
|
-
else {
|
|
415
|
-
size += stats.size;
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
catch (error) {
|
|
420
|
-
if (error.code !== 'ENOENT') {
|
|
421
|
-
console.error(`Error calculating size for directory ${dirPath}:`, error);
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
return size;
|
|
425
|
-
};
|
|
426
|
-
// Calculate size for each directory
|
|
427
|
-
const nounsDirSize = await calculateSize(this.nounsDir);
|
|
428
|
-
const verbsDirSize = await calculateSize(this.verbsDir);
|
|
429
|
-
const metadataDirSize = await calculateSize(this.metadataDir);
|
|
430
|
-
const indexDirSize = await calculateSize(this.indexDir);
|
|
431
|
-
totalSize = nounsDirSize + verbsDirSize + metadataDirSize + indexDirSize;
|
|
432
|
-
// Count files in each directory
|
|
433
|
-
const nounsCount = (await fs.promises.readdir(this.nounsDir)).filter((file) => file.endsWith('.json')).length;
|
|
434
|
-
const verbsCount = (await fs.promises.readdir(this.verbsDir)).filter((file) => file.endsWith('.json')).length;
|
|
435
|
-
const metadataCount = (await fs.promises.readdir(this.metadataDir)).filter((file) => file.endsWith('.json')).length;
|
|
436
|
-
// Count nouns by type using metadata
|
|
437
|
-
const nounTypeCounts = {};
|
|
438
|
-
const metadataFiles = await fs.promises.readdir(this.metadataDir);
|
|
439
|
-
for (const file of metadataFiles) {
|
|
440
|
-
if (file.endsWith('.json')) {
|
|
441
|
-
try {
|
|
442
|
-
const filePath = path.join(this.metadataDir, file);
|
|
443
|
-
const data = await fs.promises.readFile(filePath, 'utf-8');
|
|
444
|
-
const metadata = JSON.parse(data);
|
|
445
|
-
if (metadata.noun) {
|
|
446
|
-
nounTypeCounts[metadata.noun] = (nounTypeCounts[metadata.noun] || 0) + 1;
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
catch (error) {
|
|
450
|
-
console.error(`Error reading metadata file ${file}:`, error);
|
|
451
|
-
}
|
|
452
|
-
}
|
|
453
|
-
}
|
|
454
|
-
return {
|
|
455
|
-
type: 'filesystem',
|
|
456
|
-
used: totalSize,
|
|
457
|
-
quota: null, // File system doesn't provide quota information
|
|
458
|
-
details: {
|
|
459
|
-
rootDirectory: this.rootDir,
|
|
460
|
-
nounsCount,
|
|
461
|
-
verbsCount,
|
|
462
|
-
metadataCount,
|
|
463
|
-
nounsDirSize,
|
|
464
|
-
verbsDirSize,
|
|
465
|
-
metadataDirSize,
|
|
466
|
-
indexDirSize,
|
|
467
|
-
nounTypes: nounTypeCounts
|
|
468
|
-
}
|
|
469
|
-
};
|
|
470
|
-
}
|
|
471
|
-
catch (error) {
|
|
472
|
-
console.error('Failed to get storage status:', error);
|
|
473
|
-
return {
|
|
474
|
-
type: 'filesystem',
|
|
475
|
-
used: 0,
|
|
476
|
-
quota: null,
|
|
477
|
-
details: { error: String(error) }
|
|
478
|
-
};
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
/**
|
|
482
|
-
* Save statistics data to storage
|
|
483
|
-
* @param statistics The statistics data to save
|
|
484
|
-
*/
|
|
485
|
-
async saveStatisticsData(statistics) {
|
|
486
|
-
await this.ensureInitialized();
|
|
487
|
-
try {
|
|
488
|
-
// Get the current date for time-based partitioning
|
|
489
|
-
const now = new Date();
|
|
490
|
-
const year = now.getUTCFullYear();
|
|
491
|
-
const month = String(now.getUTCMonth() + 1).padStart(2, '0');
|
|
492
|
-
const day = String(now.getUTCDate()).padStart(2, '0');
|
|
493
|
-
const dateStr = `${year}${month}${day}`;
|
|
494
|
-
// Save to the current day's file
|
|
495
|
-
const currentFilePath = path.join(this.indexDir, `${STATISTICS_KEY}_${dateStr}.json`);
|
|
496
|
-
await fs.promises.writeFile(currentFilePath, JSON.stringify(statistics, null, 2));
|
|
497
|
-
// Also update the legacy file for backward compatibility (less frequently)
|
|
498
|
-
if (Math.random() < 0.1) {
|
|
499
|
-
const legacyFilePath = path.join(this.indexDir, `${STATISTICS_KEY}.json`);
|
|
500
|
-
await fs.promises.writeFile(legacyFilePath, JSON.stringify(statistics, null, 2));
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
catch (error) {
|
|
504
|
-
console.error('Failed to save statistics data:', error);
|
|
505
|
-
throw new Error(`Failed to save statistics data: ${error}`);
|
|
506
|
-
}
|
|
507
|
-
}
|
|
508
|
-
/**
|
|
509
|
-
* Get statistics data from storage
|
|
510
|
-
* @returns Promise that resolves to the statistics data or null if not found
|
|
511
|
-
*/
|
|
512
|
-
async getStatisticsData() {
|
|
513
|
-
await this.ensureInitialized();
|
|
514
|
-
try {
|
|
515
|
-
// Try to get statistics from today's file first
|
|
516
|
-
const now = new Date();
|
|
517
|
-
const year = now.getUTCFullYear();
|
|
518
|
-
const month = String(now.getUTCMonth() + 1).padStart(2, '0');
|
|
519
|
-
const day = String(now.getUTCDate()).padStart(2, '0');
|
|
520
|
-
const dateStr = `${year}${month}${day}`;
|
|
521
|
-
const currentFilePath = path.join(this.indexDir, `${STATISTICS_KEY}_${dateStr}.json`);
|
|
522
|
-
try {
|
|
523
|
-
const data = await fs.promises.readFile(currentFilePath, 'utf-8');
|
|
524
|
-
return JSON.parse(data);
|
|
525
|
-
}
|
|
526
|
-
catch (currentError) {
|
|
527
|
-
// If today's file doesn't exist, try yesterday's file
|
|
528
|
-
if (currentError.code === 'ENOENT') {
|
|
529
|
-
const yesterday = new Date();
|
|
530
|
-
yesterday.setDate(yesterday.getDate() - 1);
|
|
531
|
-
const yesterdayYear = yesterday.getUTCFullYear();
|
|
532
|
-
const yesterdayMonth = String(yesterday.getUTCMonth() + 1).padStart(2, '0');
|
|
533
|
-
const yesterdayDay = String(yesterday.getUTCDate()).padStart(2, '0');
|
|
534
|
-
const yesterdayDateStr = `${yesterdayYear}${yesterdayMonth}${yesterdayDay}`;
|
|
535
|
-
const yesterdayFilePath = path.join(this.indexDir, `${STATISTICS_KEY}_${yesterdayDateStr}.json`);
|
|
536
|
-
try {
|
|
537
|
-
const yesterdayData = await fs.promises.readFile(yesterdayFilePath, 'utf-8');
|
|
538
|
-
return JSON.parse(yesterdayData);
|
|
539
|
-
}
|
|
540
|
-
catch (yesterdayError) {
|
|
541
|
-
// If yesterday's file doesn't exist, try the legacy file
|
|
542
|
-
if (yesterdayError.code === 'ENOENT') {
|
|
543
|
-
const legacyFilePath = path.join(this.indexDir, `${STATISTICS_KEY}.json`);
|
|
544
|
-
try {
|
|
545
|
-
const legacyData = await fs.promises.readFile(legacyFilePath, 'utf-8');
|
|
546
|
-
return JSON.parse(legacyData);
|
|
547
|
-
}
|
|
548
|
-
catch (legacyError) {
|
|
549
|
-
// If the legacy file doesn't exist either, return null
|
|
550
|
-
if (legacyError.code === 'ENOENT') {
|
|
551
|
-
return null;
|
|
552
|
-
}
|
|
553
|
-
throw legacyError;
|
|
554
|
-
}
|
|
555
|
-
}
|
|
556
|
-
throw yesterdayError;
|
|
557
|
-
}
|
|
558
|
-
}
|
|
559
|
-
throw currentError;
|
|
560
|
-
}
|
|
561
|
-
}
|
|
562
|
-
catch (error) {
|
|
563
|
-
console.error('Error getting statistics data:', error);
|
|
564
|
-
throw error;
|
|
565
|
-
}
|
|
566
|
-
}
|
|
567
|
-
}
|
|
568
|
-
//# sourceMappingURL=fileSystemStorage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fileSystemStorage.js","sourceRoot":"","sources":["../../../src/storage/adapters/fileSystemStorage.ts"],"names":[],"mappings":"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"}
|