mcard-js 2.1.49 → 2.1.50
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/CardCollection-ORGE2XBG.js +10 -0
- package/dist/EngineRegistry-EIOT4MUZ.js +17 -0
- package/dist/IndexedDBEngine-RD4447IS.js +12 -0
- package/dist/LLMRuntime-CQ7X43QR.js +17 -0
- package/dist/LLMRuntime-PD45COKE.js +17 -0
- package/dist/LambdaRuntime-HSREEYQG.js +19 -0
- package/dist/LambdaRuntime-IH7NVG6Z.js +19 -0
- package/dist/Loader-W22AEM6F.js +12 -0
- package/dist/OllamaProvider-ABEEFX7M.js +9 -0
- package/dist/chunk-2APJYBH4.js +368 -0
- package/dist/chunk-5HRZV4R3.js +217 -0
- package/dist/chunk-7TXIPJI2.js +2360 -0
- package/dist/chunk-CHXIVTQV.js +364 -0
- package/dist/chunk-ETJWXHKZ.js +246 -0
- package/dist/chunk-GIKMCG4D.js +497 -0
- package/dist/chunk-IJKS3LGK.js +428 -0
- package/dist/chunk-JUQ2VQZA.js +428 -0
- package/dist/chunk-NOPYSBOQ.js +2360 -0
- package/dist/chunk-VJPXJVEH.js +299 -0
- package/dist/chunk-VW3KBDK5.js +74 -0
- package/dist/chunk-XETU7TV4.js +112 -0
- package/dist/chunk-ZMK2HTZ5.js +275 -0
- package/dist/constants-CLB7B6MN.js +101 -0
- package/dist/index.browser.cjs +5 -5
- package/dist/index.browser.js +12 -12
- package/dist/index.cjs +253 -87
- package/dist/index.d.cts +15 -5
- package/dist/index.d.ts +15 -5
- package/dist/index.js +76 -99
- package/dist/storage/SqliteNodeEngine.cjs +5 -5
- package/dist/storage/SqliteNodeEngine.js +4 -4
- package/dist/storage/SqliteWasmEngine.cjs +5 -5
- package/dist/storage/SqliteWasmEngine.js +4 -4
- package/package.json +1 -1
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ContentTypeInterpreter,
|
|
3
|
+
MCard
|
|
4
|
+
} from "./chunk-GGQCF7ZK.js";
|
|
5
|
+
import {
|
|
6
|
+
MAX_FILE_SIZE,
|
|
7
|
+
READ_TIMEOUT_MS
|
|
8
|
+
} from "./chunk-ETJWXHKZ.js";
|
|
9
|
+
import {
|
|
10
|
+
__export
|
|
11
|
+
} from "./chunk-PNKVD2UK.js";
|
|
12
|
+
|
|
13
|
+
// src/Loader.ts
|
|
14
|
+
var Loader_exports = {};
|
|
15
|
+
__export(Loader_exports, {
|
|
16
|
+
loadFileToCollection: () => loadFileToCollection,
|
|
17
|
+
processAndStoreFile: () => processAndStoreFile
|
|
18
|
+
});
|
|
19
|
+
import * as fs2 from "fs/promises";
|
|
20
|
+
import * as path2 from "path";
|
|
21
|
+
|
|
22
|
+
// src/FileIO.ts
|
|
23
|
+
var FileIO_exports = {};
|
|
24
|
+
__export(FileIO_exports, {
|
|
25
|
+
isProblematicFile: () => isProblematicFile,
|
|
26
|
+
listFiles: () => listFiles,
|
|
27
|
+
processFileContent: () => processFileContent,
|
|
28
|
+
readFileSafely: () => readFileSafely,
|
|
29
|
+
streamReadNormalizedText: () => streamReadNormalizedText
|
|
30
|
+
});
|
|
31
|
+
import * as crypto from "crypto";
|
|
32
|
+
import * as fs from "fs/promises";
|
|
33
|
+
import * as path from "path";
|
|
34
|
+
async function streamReadNormalizedText(filePath, options) {
|
|
35
|
+
const { byteCap, wrapWidth } = options;
|
|
36
|
+
const sha = crypto.createHash("sha256");
|
|
37
|
+
let totalSize = 0;
|
|
38
|
+
let producedText = "";
|
|
39
|
+
let currentLen = 0;
|
|
40
|
+
const handle = await fs.open(filePath, "r");
|
|
41
|
+
try {
|
|
42
|
+
const buffer = new Uint8Array(8192);
|
|
43
|
+
let remaining = byteCap;
|
|
44
|
+
const decoder = new TextDecoder("utf-8", { fatal: false });
|
|
45
|
+
let position = 0;
|
|
46
|
+
while (remaining > 0) {
|
|
47
|
+
const { bytesRead } = await handle.read(buffer, 0, Math.min(buffer.length, remaining), position);
|
|
48
|
+
if (bytesRead === 0) break;
|
|
49
|
+
position += bytesRead;
|
|
50
|
+
const chunk = buffer.subarray(0, bytesRead);
|
|
51
|
+
sha.update(chunk);
|
|
52
|
+
totalSize += bytesRead;
|
|
53
|
+
remaining -= bytesRead;
|
|
54
|
+
const s2 = decoder.decode(chunk, { stream: true });
|
|
55
|
+
for (const ch of s2) {
|
|
56
|
+
if (ch === "\r") continue;
|
|
57
|
+
producedText += ch;
|
|
58
|
+
if (ch === "\n") {
|
|
59
|
+
currentLen = 0;
|
|
60
|
+
} else {
|
|
61
|
+
currentLen++;
|
|
62
|
+
if (wrapWidth > 0 && currentLen >= wrapWidth) {
|
|
63
|
+
producedText += "\n";
|
|
64
|
+
currentLen = 0;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
const s = decoder.decode();
|
|
70
|
+
for (const ch of s) {
|
|
71
|
+
if (ch === "\r") continue;
|
|
72
|
+
producedText += ch;
|
|
73
|
+
if (ch === "\n") {
|
|
74
|
+
currentLen = 0;
|
|
75
|
+
} else {
|
|
76
|
+
currentLen++;
|
|
77
|
+
if (wrapWidth > 0 && currentLen >= wrapWidth) {
|
|
78
|
+
producedText += "\n";
|
|
79
|
+
currentLen = 0;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
} finally {
|
|
84
|
+
await handle.close();
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
text: producedText,
|
|
88
|
+
originalSize: totalSize,
|
|
89
|
+
originalSha256Prefix: sha.digest("hex").substring(0, 16)
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
var MAX_FILE_SIZE2 = MAX_FILE_SIZE;
|
|
93
|
+
var READ_TIMEOUT_MS2 = READ_TIMEOUT_MS;
|
|
94
|
+
async function isProblematicFile(filePath) {
|
|
95
|
+
try {
|
|
96
|
+
const stats = await fs.stat(filePath);
|
|
97
|
+
if (stats.size === 0) return false;
|
|
98
|
+
if (path.basename(filePath).startsWith(".")) return true;
|
|
99
|
+
if (stats.size > MAX_FILE_SIZE2) return true;
|
|
100
|
+
const ext = path.extname(filePath);
|
|
101
|
+
const isKnownType = ContentTypeInterpreter.isKnownLongLineExtension(ext);
|
|
102
|
+
if (isKnownType && stats.size > 1024 * 1024) return true;
|
|
103
|
+
const handle = await fs.open(filePath, "r");
|
|
104
|
+
try {
|
|
105
|
+
const buffer = new Uint8Array(32 * 1024);
|
|
106
|
+
const { bytesRead } = await handle.read(buffer, 0, buffer.length, 0);
|
|
107
|
+
const sample = buffer.subarray(0, bytesRead);
|
|
108
|
+
if (ContentTypeInterpreter.isUnstructuredBinary(sample)) return true;
|
|
109
|
+
if (ContentTypeInterpreter.hasPathologicalLines(sample, isKnownType)) return true;
|
|
110
|
+
} finally {
|
|
111
|
+
await handle.close();
|
|
112
|
+
}
|
|
113
|
+
return false;
|
|
114
|
+
} catch {
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
async function readFileSafely(filePath, options = {}) {
|
|
119
|
+
const stats = await fs.stat(filePath);
|
|
120
|
+
if (stats.size > MAX_FILE_SIZE2) throw new Error(`File too large: ${stats.size}`);
|
|
121
|
+
const controller = new AbortController();
|
|
122
|
+
const timeout = setTimeout(() => controller.abort(), READ_TIMEOUT_MS2);
|
|
123
|
+
try {
|
|
124
|
+
const handle = await fs.open(filePath, "r");
|
|
125
|
+
try {
|
|
126
|
+
const buffer = new Uint8Array(stats.size);
|
|
127
|
+
await handle.read(buffer, 0, stats.size, 0);
|
|
128
|
+
return buffer;
|
|
129
|
+
} finally {
|
|
130
|
+
await handle.close();
|
|
131
|
+
}
|
|
132
|
+
} catch (e) {
|
|
133
|
+
const error = e;
|
|
134
|
+
if (error.name === "AbortError") throw new Error(`Read timeout for ${filePath}`);
|
|
135
|
+
throw e;
|
|
136
|
+
} finally {
|
|
137
|
+
clearTimeout(timeout);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
async function listFiles(dirPath, recursive = false) {
|
|
141
|
+
let files = [];
|
|
142
|
+
try {
|
|
143
|
+
const entries = await fs.readdir(dirPath, { withFileTypes: true });
|
|
144
|
+
for (const entry of entries) {
|
|
145
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
146
|
+
if (entry.name.startsWith(".")) continue;
|
|
147
|
+
if (entry.isDirectory()) {
|
|
148
|
+
if (recursive) {
|
|
149
|
+
files = files.concat(await listFiles(fullPath, true));
|
|
150
|
+
}
|
|
151
|
+
} else if (entry.isFile()) {
|
|
152
|
+
if (!await isProblematicFile(fullPath)) {
|
|
153
|
+
files.push(fullPath);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
} catch (e) {
|
|
158
|
+
console.warn(`Error listing directory ${dirPath}:`, e);
|
|
159
|
+
}
|
|
160
|
+
return files;
|
|
161
|
+
}
|
|
162
|
+
async function processFileContent(filePath, options = {}) {
|
|
163
|
+
const rawContent = await readFileSafely(filePath, { allowPathological: options.allowPathological, maxBytes: options.maxBytes });
|
|
164
|
+
const sample = rawContent.subarray(0, 1024 * 1024);
|
|
165
|
+
const detection = ContentTypeInterpreter.detectContentType(sample, path.extname(filePath));
|
|
166
|
+
let isBinary = ContentTypeInterpreter.isBinaryContent(sample, detection.mimeType);
|
|
167
|
+
if (options.forceBinary) isBinary = true;
|
|
168
|
+
let content = rawContent;
|
|
169
|
+
if (!isBinary) {
|
|
170
|
+
try {
|
|
171
|
+
content = new TextDecoder("utf-8", { fatal: true }).decode(rawContent);
|
|
172
|
+
} catch {
|
|
173
|
+
content = new TextDecoder("utf-8", { fatal: false }).decode(rawContent);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return {
|
|
177
|
+
content,
|
|
178
|
+
filename: path.basename(filePath),
|
|
179
|
+
mimeType: detection.mimeType,
|
|
180
|
+
extension: detection.extension,
|
|
181
|
+
isBinary,
|
|
182
|
+
size: rawContent.length
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// src/Loader.ts
|
|
187
|
+
var DEFAULT_MAX_PROBLEM_BYTES = 2 * 1024 * 1024;
|
|
188
|
+
var WRAP_WIDTH_KNOWN = 1e3;
|
|
189
|
+
var WRAP_WIDTH_DEFAULT = 80;
|
|
190
|
+
var Logger = {
|
|
191
|
+
info: (...args) => console.log("[Loader]", ...args),
|
|
192
|
+
warn: (...args) => console.warn("[Loader]", ...args),
|
|
193
|
+
error: (...args) => console.error("[Loader]", ...args),
|
|
194
|
+
debug: (...args) => {
|
|
195
|
+
if (process.env.DEBUG) console.log("[Loader]", ...args);
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
async function processAndStoreFile(filePath, collection, options = {}) {
|
|
199
|
+
const {
|
|
200
|
+
allowProblematic = false,
|
|
201
|
+
maxBytesOnProblem = DEFAULT_MAX_PROBLEM_BYTES,
|
|
202
|
+
metadataOnly = false,
|
|
203
|
+
rootPath
|
|
204
|
+
} = options;
|
|
205
|
+
try {
|
|
206
|
+
let fileInfo;
|
|
207
|
+
if (await isProblematicFile(filePath)) {
|
|
208
|
+
if (!allowProblematic) {
|
|
209
|
+
Logger.warn(`Skipping problematic file: ${filePath}`);
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
const extension = path2.extname(filePath).toLowerCase();
|
|
213
|
+
const isKnownType = ContentTypeInterpreter.isKnownLongLineExtension(extension);
|
|
214
|
+
const wrapWidth = isKnownType ? WRAP_WIDTH_KNOWN : WRAP_WIDTH_DEFAULT;
|
|
215
|
+
Logger.warn(`Problematic file detected, processing as safe text: ${filePath}`);
|
|
216
|
+
try {
|
|
217
|
+
const streamed = await streamReadNormalizedText(filePath, {
|
|
218
|
+
byteCap: maxBytesOnProblem,
|
|
219
|
+
wrapWidth
|
|
220
|
+
});
|
|
221
|
+
fileInfo = {
|
|
222
|
+
content: streamed.text,
|
|
223
|
+
filename: path2.basename(filePath),
|
|
224
|
+
mimeType: "text/plain",
|
|
225
|
+
extension,
|
|
226
|
+
isBinary: false,
|
|
227
|
+
size: streamed.text.length,
|
|
228
|
+
originalSize: streamed.originalSize,
|
|
229
|
+
originalSha256Prefix: streamed.originalSha256Prefix,
|
|
230
|
+
normalized: true,
|
|
231
|
+
wrapWidth
|
|
232
|
+
};
|
|
233
|
+
} catch (e) {
|
|
234
|
+
Logger.warn(`Safe text processing failed, falling back to capped binary: ${filePath}`, e);
|
|
235
|
+
fileInfo = await processFileContent(filePath, {
|
|
236
|
+
forceBinary: true,
|
|
237
|
+
allowPathological: true,
|
|
238
|
+
maxBytes: maxBytesOnProblem
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
} else {
|
|
242
|
+
Logger.info(`Processing file: ${filePath}`);
|
|
243
|
+
fileInfo = await processFileContent(filePath);
|
|
244
|
+
}
|
|
245
|
+
if (!fileInfo) return null;
|
|
246
|
+
const content = fileInfo.content;
|
|
247
|
+
if (!content || typeof content === "string" && content.length === 0 || content instanceof Uint8Array && content.length === 0) {
|
|
248
|
+
Logger.debug(`Skipping empty file: ${filePath} (empty files cannot be stored as MCards)`);
|
|
249
|
+
return {
|
|
250
|
+
hash: "",
|
|
251
|
+
contentType: fileInfo.mimeType,
|
|
252
|
+
isBinary: fileInfo.isBinary,
|
|
253
|
+
filename: fileInfo.filename,
|
|
254
|
+
size: 0,
|
|
255
|
+
filePath
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
let mcard = null;
|
|
259
|
+
const isProblematic = await isProblematicFile(filePath);
|
|
260
|
+
if (metadataOnly && isProblematic) {
|
|
261
|
+
mcard = null;
|
|
262
|
+
} else {
|
|
263
|
+
mcard = await MCard.create(fileInfo.content);
|
|
264
|
+
const handle = path2.basename(filePath);
|
|
265
|
+
try {
|
|
266
|
+
await collection.addWithHandle(mcard, handle);
|
|
267
|
+
} catch (e) {
|
|
268
|
+
let registered = false;
|
|
269
|
+
if (rootPath) {
|
|
270
|
+
const relPath = path2.relative(rootPath, filePath);
|
|
271
|
+
if (relPath !== handle) {
|
|
272
|
+
try {
|
|
273
|
+
await collection.addWithHandle(mcard, relPath);
|
|
274
|
+
registered = true;
|
|
275
|
+
} catch (e2) {
|
|
276
|
+
Logger.debug(
|
|
277
|
+
`Handle name '${handle}' already in use (common for files like README.md, LICENSE). MCard stored successfully with hash ${mcard.hash.slice(0, 8)}... (accessible by hash, not by handle)`
|
|
278
|
+
);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
if (!registered) {
|
|
283
|
+
try {
|
|
284
|
+
await collection.add(mcard);
|
|
285
|
+
} catch (e3) {
|
|
286
|
+
Logger.warn(`Hash fallback also failed for ${handle}:`, e3);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
const result = {
|
|
292
|
+
hash: mcard ? mcard.hash : "METADATA_ONLY",
|
|
293
|
+
contentType: fileInfo.mimeType,
|
|
294
|
+
isBinary: fileInfo.isBinary,
|
|
295
|
+
filename: fileInfo.filename,
|
|
296
|
+
size: fileInfo.size,
|
|
297
|
+
filePath
|
|
298
|
+
};
|
|
299
|
+
if (fileInfo.originalSize !== void 0) result.originalSize = fileInfo.originalSize;
|
|
300
|
+
if (fileInfo.originalSha256Prefix) result.originalSha256Prefix = fileInfo.originalSha256Prefix;
|
|
301
|
+
if (metadataOnly && isProblematic) result.metadataOnly = true;
|
|
302
|
+
return result;
|
|
303
|
+
} catch (e) {
|
|
304
|
+
Logger.error(`Error processing ${filePath}:`, e);
|
|
305
|
+
return null;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
async function loadFileToCollection(targetPath, collection, options = {}) {
|
|
309
|
+
const {
|
|
310
|
+
recursive = false,
|
|
311
|
+
includeProblematic = false,
|
|
312
|
+
maxBytesOnProblem = DEFAULT_MAX_PROBLEM_BYTES,
|
|
313
|
+
metadataOnly = false
|
|
314
|
+
} = options;
|
|
315
|
+
const resolvedPath = path2.resolve(targetPath);
|
|
316
|
+
const stats = await fs2.stat(resolvedPath);
|
|
317
|
+
const results = [];
|
|
318
|
+
let files = [];
|
|
319
|
+
let rootPath = resolvedPath;
|
|
320
|
+
if (stats.isFile()) {
|
|
321
|
+
files = [resolvedPath];
|
|
322
|
+
rootPath = path2.dirname(resolvedPath);
|
|
323
|
+
} else if (stats.isDirectory()) {
|
|
324
|
+
files = await listFiles(resolvedPath, recursive);
|
|
325
|
+
rootPath = resolvedPath;
|
|
326
|
+
} else {
|
|
327
|
+
throw new Error(`Path ${targetPath} is not a file or directory`);
|
|
328
|
+
}
|
|
329
|
+
const uniqueDirs = /* @__PURE__ */ new Set();
|
|
330
|
+
let maxDepth = 0;
|
|
331
|
+
for (const file of files) {
|
|
332
|
+
const dir = path2.dirname(file);
|
|
333
|
+
if (dir.startsWith(rootPath)) {
|
|
334
|
+
uniqueDirs.add(dir);
|
|
335
|
+
const rel = path2.relative(rootPath, file);
|
|
336
|
+
const parts = rel.split(path2.sep);
|
|
337
|
+
const depth = parts.length - 1;
|
|
338
|
+
if (depth > maxDepth) maxDepth = depth;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
const metrics = {
|
|
342
|
+
filesCount: files.length,
|
|
343
|
+
directoriesCount: uniqueDirs.size,
|
|
344
|
+
directoryLevels: maxDepth
|
|
345
|
+
};
|
|
346
|
+
Logger.info(`About to process ${files.length} files`);
|
|
347
|
+
for (const file of files) {
|
|
348
|
+
const result = await processAndStoreFile(file, collection, {
|
|
349
|
+
allowProblematic: includeProblematic,
|
|
350
|
+
maxBytesOnProblem,
|
|
351
|
+
metadataOnly,
|
|
352
|
+
rootPath
|
|
353
|
+
});
|
|
354
|
+
if (result) results.push(result);
|
|
355
|
+
}
|
|
356
|
+
return { metrics, results };
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
export {
|
|
360
|
+
FileIO_exports,
|
|
361
|
+
processAndStoreFile,
|
|
362
|
+
loadFileToCollection,
|
|
363
|
+
Loader_exports
|
|
364
|
+
};
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
// ../config/app_config.json
|
|
2
|
+
var app_config_default = {
|
|
3
|
+
network: {
|
|
4
|
+
default_ws_host: "127.0.0.1",
|
|
5
|
+
default_ws_port: 5321,
|
|
6
|
+
default_api_port: 5320,
|
|
7
|
+
default_python_api_port: 28302,
|
|
8
|
+
default_js_api_port: 28303,
|
|
9
|
+
default_server_host: "0.0.0.0",
|
|
10
|
+
cors_origins: [
|
|
11
|
+
"http://localhost:3000",
|
|
12
|
+
"http://localhost:8000",
|
|
13
|
+
"https://localhost:3000",
|
|
14
|
+
"https://localhost:8000",
|
|
15
|
+
"http://localhost:8080",
|
|
16
|
+
"https://example.com"
|
|
17
|
+
]
|
|
18
|
+
},
|
|
19
|
+
web: {
|
|
20
|
+
api_key_header_name: "X-API-Key"
|
|
21
|
+
},
|
|
22
|
+
identity: {
|
|
23
|
+
provider: "sqlite",
|
|
24
|
+
space_path: "./data/agent_identities.db",
|
|
25
|
+
api_endpoint: null,
|
|
26
|
+
default_vapid_contact: "mailto:developer@example.com"
|
|
27
|
+
},
|
|
28
|
+
storage: {
|
|
29
|
+
default_db_path: "./data/content_memory.db",
|
|
30
|
+
test_db_path: "./tests/data/test_mcard.db",
|
|
31
|
+
default_data_root_dirname: "data",
|
|
32
|
+
default_data_user: "guest",
|
|
33
|
+
default_seed_dirname: "seed",
|
|
34
|
+
default_artifacts_dirname: "artifacts",
|
|
35
|
+
default_server_memory_db: "servermemory.db",
|
|
36
|
+
default_mcard_db: "mcard.db",
|
|
37
|
+
default_server_log_db: "server_log.db",
|
|
38
|
+
default_push_subscriptions_file: "subscriptions.json",
|
|
39
|
+
default_execution_log_path: "./data/execution_log.db"
|
|
40
|
+
},
|
|
41
|
+
services: {
|
|
42
|
+
default_ollama_base_url: "http://localhost:11434",
|
|
43
|
+
default_otlp_endpoint: "http://localhost:4317",
|
|
44
|
+
default_vllm_base_url: "http://localhost:8000",
|
|
45
|
+
default_lmstudio_base_url: "http://localhost:1234"
|
|
46
|
+
},
|
|
47
|
+
env: {
|
|
48
|
+
api_port: "MCARD_API_PORT",
|
|
49
|
+
ws_port: "MCARD_WS_PORT",
|
|
50
|
+
ws_host: "VITE_WS_HOST",
|
|
51
|
+
vite_ws_port: "VITE_WS_PORT",
|
|
52
|
+
identity_provider: "MCARD_IDENTITY_PROVIDER",
|
|
53
|
+
identity_space_path: "IDENTITY_SPACE_PATH",
|
|
54
|
+
identity_api_endpoint: "MCARD_IDENTITY_API_ENDPOINT",
|
|
55
|
+
data_root: "DATA_ROOT",
|
|
56
|
+
data_user: "DATA_USER",
|
|
57
|
+
artifacts_dir: "ARTIFACTS_DIR",
|
|
58
|
+
mcard_db_path: "MCARD_DB_PATH",
|
|
59
|
+
mcard_storage_path: "MCARD_STORAGE_PATH",
|
|
60
|
+
execution_logs_db_path: "EXECUTION_LOGS_DB_PATH",
|
|
61
|
+
server_log_db_path: "SERVER_LOG_DB_PATH",
|
|
62
|
+
server_memory_db_path: "SERVER_MEMORY_DB_PATH",
|
|
63
|
+
servermemory_db_path: "SERVERMEMORY_DB_PATH",
|
|
64
|
+
seeding_memory_db_path: "SEEDING_MEMORY_DB_PATH",
|
|
65
|
+
push_subscriptions_path: "PUSH_SUBSCRIPTIONS_PATH",
|
|
66
|
+
vapid_contact_email: "VAPID_CONTACT_EMAIL",
|
|
67
|
+
vapid_contact: "VAPID_CONTACT",
|
|
68
|
+
ollama_base_url: "OLLAMA_BASE_URL",
|
|
69
|
+
otlp_endpoint: "OTLP_ENDPOINT",
|
|
70
|
+
vllm_base_url: "VLLM_BASE_URL",
|
|
71
|
+
lmstudio_base_url: "LMSTUDIO_BASE_URL",
|
|
72
|
+
api_key_header_name: "X-API-Key"
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
// src/config/constants.ts
|
|
77
|
+
var network = app_config_default.network ?? {};
|
|
78
|
+
var identity = app_config_default.identity ?? {};
|
|
79
|
+
var services = app_config_default.services ?? {};
|
|
80
|
+
var web = app_config_default.web ?? {};
|
|
81
|
+
var DEFAULT_PAGE_SIZE = 10;
|
|
82
|
+
var MAX_PAGE_SIZE = 1e3;
|
|
83
|
+
var MIN_PAGE_SIZE = 1;
|
|
84
|
+
var DETECTION_SAMPLE_CAP = 8192;
|
|
85
|
+
var MAX_FILE_SIZE = typeof process !== "undefined" && process.env.MCARD_MAX_SIZE_BYTES ? parseInt(process.env.MCARD_MAX_SIZE_BYTES, 10) : 150 * 1024 * 1024;
|
|
86
|
+
var READ_TIMEOUT_MS = 5e3;
|
|
87
|
+
var READ_CHUNK_SIZE = 8192;
|
|
88
|
+
var KNOWN_TYPE_SIZE_LIMIT = 1024 * 1024;
|
|
89
|
+
var BINARY_CHECK_SAMPLE_SIZE = 32 * 1024;
|
|
90
|
+
var CONTENT_DETECTION_SAMPLE_SIZE = 1024 * 1024;
|
|
91
|
+
var MAX_VECTOR_CONTENT_CHARS = 1e4;
|
|
92
|
+
var DEFAULT_MAX_PROBLEM_BYTES = 2 * 1024 * 1024;
|
|
93
|
+
var WRAP_WIDTH_KNOWN = 1e3;
|
|
94
|
+
var INDEXEDDB_DEFAULT_DB_NAME = "mcard-db";
|
|
95
|
+
var INDEXEDDB_DEFAULT_DB_VERSION = 1;
|
|
96
|
+
var SQLITE_BUSY_TIMEOUT_MS = 5e3;
|
|
97
|
+
var DEFAULT_IDENTITY_PROVIDER = String(identity.provider ?? "sqlite");
|
|
98
|
+
var DEFAULT_IDENTITY_SPACE_PATH = String(identity.space_path ?? "./data/agent_identities.db");
|
|
99
|
+
var DEFAULT_EXECUTION_LOG_PATH = String(app_config_default.storage?.default_execution_log_path ?? "./data/execution_log.db");
|
|
100
|
+
var DEFAULT_API_PORT = Number(network.default_api_port ?? 5320);
|
|
101
|
+
var DEFAULT_PYTHON_API_PORT = Number(network.default_python_api_port ?? 28302);
|
|
102
|
+
var DEFAULT_JS_API_PORT = Number(network.default_js_api_port ?? 28303);
|
|
103
|
+
var ENV_API_PORT = "MCARD_API_PORT";
|
|
104
|
+
var DEFAULT_WS_PORT = Number(network.default_ws_port ?? 5321);
|
|
105
|
+
var DEFAULT_WS_HOST = String(network.default_ws_host ?? "127.0.0.1");
|
|
106
|
+
var DEFAULT_SERVER_HOST = String(network.default_server_host ?? "0.0.0.0");
|
|
107
|
+
var CORS_ORIGINS = Array.isArray(network.cors_origins) ? network.cors_origins : [];
|
|
108
|
+
var ENV_WS_PORT = "MCARD_WS_PORT";
|
|
109
|
+
var getEnvUrl = (key, fallback) => {
|
|
110
|
+
try {
|
|
111
|
+
if (typeof process !== "undefined" && process.env && process.env[key]) {
|
|
112
|
+
return process.env[key];
|
|
113
|
+
}
|
|
114
|
+
} catch (e) {
|
|
115
|
+
}
|
|
116
|
+
return fallback;
|
|
117
|
+
};
|
|
118
|
+
var API_KEY_HEADER_NAME = String(web.api_key_header_name ?? "X-API-Key");
|
|
119
|
+
var DEFAULT_OLLAMA_BASE_URL = getEnvUrl(
|
|
120
|
+
"OLLAMA_BASE_URL",
|
|
121
|
+
String(services.default_ollama_base_url ?? "http://localhost:11434")
|
|
122
|
+
);
|
|
123
|
+
var DEFAULT_OTLP_ENDPOINT = getEnvUrl(
|
|
124
|
+
"OTLP_ENDPOINT",
|
|
125
|
+
String(services.default_otlp_endpoint ?? "http://localhost:4317")
|
|
126
|
+
);
|
|
127
|
+
var DEFAULT_VLLM_BASE_URL = getEnvUrl(
|
|
128
|
+
"VLLM_BASE_URL",
|
|
129
|
+
String(services.default_vllm_base_url ?? "http://localhost:8000")
|
|
130
|
+
);
|
|
131
|
+
var DEFAULT_LMSTUDIO_BASE_URL = getEnvUrl(
|
|
132
|
+
"LMSTUDIO_BASE_URL",
|
|
133
|
+
String(services.default_lmstudio_base_url ?? "http://localhost:1234")
|
|
134
|
+
);
|
|
135
|
+
var DEFAULT_SQLJS_WASM_URL = "https://sql.js.org/dist/";
|
|
136
|
+
var EMBEDDING_MODELS = {
|
|
137
|
+
"nomic-embed-text": {
|
|
138
|
+
dimensions: 768,
|
|
139
|
+
provider: "ollama",
|
|
140
|
+
max_tokens: 8192,
|
|
141
|
+
description: "High quality, general purpose embeddings"
|
|
142
|
+
},
|
|
143
|
+
"bge-m3": {
|
|
144
|
+
dimensions: 1024,
|
|
145
|
+
provider: "ollama",
|
|
146
|
+
max_tokens: 8192,
|
|
147
|
+
description: "Multi-lingual, multi-granularity embeddings"
|
|
148
|
+
},
|
|
149
|
+
"mxbai-embed-large": {
|
|
150
|
+
dimensions: 1024,
|
|
151
|
+
provider: "ollama",
|
|
152
|
+
max_tokens: 512,
|
|
153
|
+
description: "High quality embeddings for retrieval"
|
|
154
|
+
},
|
|
155
|
+
"all-minilm": {
|
|
156
|
+
dimensions: 384,
|
|
157
|
+
provider: "ollama",
|
|
158
|
+
max_tokens: 256,
|
|
159
|
+
description: "Fast, lightweight embeddings"
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
var DEFAULT_EMBEDDING_MODEL = "nomic-embed-text";
|
|
163
|
+
var VISION_MODELS = {
|
|
164
|
+
"moondream": {
|
|
165
|
+
size: "1.7GB",
|
|
166
|
+
description: "Moondream - Tiny, high-performance vision language model",
|
|
167
|
+
capabilities: ["image_description", "visual_qa"]
|
|
168
|
+
},
|
|
169
|
+
"llama3.2-vision": {
|
|
170
|
+
size: "7.9GB",
|
|
171
|
+
description: "Llama 3.2 Vision - 11B multimodal model with strong OCR",
|
|
172
|
+
capabilities: ["image_description", "ocr", "visual_qa"]
|
|
173
|
+
},
|
|
174
|
+
"llava": {
|
|
175
|
+
size: "4.7GB",
|
|
176
|
+
description: "LLaVA - Large Language and Vision Assistant",
|
|
177
|
+
capabilities: ["image_description", "visual_qa"]
|
|
178
|
+
},
|
|
179
|
+
"minicpm-v": {
|
|
180
|
+
size: "5.6GB",
|
|
181
|
+
description: "MiniCPM-V - Efficient vision-language model",
|
|
182
|
+
capabilities: ["image_description", "ocr", "multi_image"]
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
var DEFAULT_VISION_MODEL = "moondream";
|
|
186
|
+
var DEFAULT_SANDBOX_TIMEOUT_MS = 5e3;
|
|
187
|
+
var DEFAULT_CLM_TIMEOUT_MS = 5e3;
|
|
188
|
+
var DEFAULT_VM_EXECUTION_TIMEOUT_MS = 5e3;
|
|
189
|
+
var LLM_DEFAULT_TIMEOUT_SECS = 120;
|
|
190
|
+
var LLM_DEFAULT_RETRY_COUNT = 3;
|
|
191
|
+
var LLM_DEFAULT_RETRY_DELAY_SECS = 1;
|
|
192
|
+
var DEFAULT_WS_RECONNECT_MS = 3e3;
|
|
193
|
+
var DEFAULT_MAX_REDUCTION_STEPS = 1e3;
|
|
194
|
+
var DEFAULT_MAX_ETA_STEPS = 100;
|
|
195
|
+
var DEFAULT_MAX_INTROSPECTION_DEPTH = 100;
|
|
196
|
+
|
|
197
|
+
export {
|
|
198
|
+
DEFAULT_PAGE_SIZE,
|
|
199
|
+
MAX_PAGE_SIZE,
|
|
200
|
+
MIN_PAGE_SIZE,
|
|
201
|
+
DETECTION_SAMPLE_CAP,
|
|
202
|
+
MAX_FILE_SIZE,
|
|
203
|
+
READ_TIMEOUT_MS,
|
|
204
|
+
READ_CHUNK_SIZE,
|
|
205
|
+
KNOWN_TYPE_SIZE_LIMIT,
|
|
206
|
+
BINARY_CHECK_SAMPLE_SIZE,
|
|
207
|
+
CONTENT_DETECTION_SAMPLE_SIZE,
|
|
208
|
+
MAX_VECTOR_CONTENT_CHARS,
|
|
209
|
+
DEFAULT_MAX_PROBLEM_BYTES,
|
|
210
|
+
WRAP_WIDTH_KNOWN,
|
|
211
|
+
INDEXEDDB_DEFAULT_DB_NAME,
|
|
212
|
+
INDEXEDDB_DEFAULT_DB_VERSION,
|
|
213
|
+
SQLITE_BUSY_TIMEOUT_MS,
|
|
214
|
+
DEFAULT_IDENTITY_PROVIDER,
|
|
215
|
+
DEFAULT_IDENTITY_SPACE_PATH,
|
|
216
|
+
DEFAULT_EXECUTION_LOG_PATH,
|
|
217
|
+
DEFAULT_API_PORT,
|
|
218
|
+
DEFAULT_PYTHON_API_PORT,
|
|
219
|
+
DEFAULT_JS_API_PORT,
|
|
220
|
+
ENV_API_PORT,
|
|
221
|
+
DEFAULT_WS_PORT,
|
|
222
|
+
DEFAULT_WS_HOST,
|
|
223
|
+
DEFAULT_SERVER_HOST,
|
|
224
|
+
CORS_ORIGINS,
|
|
225
|
+
ENV_WS_PORT,
|
|
226
|
+
API_KEY_HEADER_NAME,
|
|
227
|
+
DEFAULT_OLLAMA_BASE_URL,
|
|
228
|
+
DEFAULT_OTLP_ENDPOINT,
|
|
229
|
+
DEFAULT_VLLM_BASE_URL,
|
|
230
|
+
DEFAULT_LMSTUDIO_BASE_URL,
|
|
231
|
+
DEFAULT_SQLJS_WASM_URL,
|
|
232
|
+
EMBEDDING_MODELS,
|
|
233
|
+
DEFAULT_EMBEDDING_MODEL,
|
|
234
|
+
VISION_MODELS,
|
|
235
|
+
DEFAULT_VISION_MODEL,
|
|
236
|
+
DEFAULT_SANDBOX_TIMEOUT_MS,
|
|
237
|
+
DEFAULT_CLM_TIMEOUT_MS,
|
|
238
|
+
DEFAULT_VM_EXECUTION_TIMEOUT_MS,
|
|
239
|
+
LLM_DEFAULT_TIMEOUT_SECS,
|
|
240
|
+
LLM_DEFAULT_RETRY_COUNT,
|
|
241
|
+
LLM_DEFAULT_RETRY_DELAY_SECS,
|
|
242
|
+
DEFAULT_WS_RECONNECT_MS,
|
|
243
|
+
DEFAULT_MAX_REDUCTION_STEPS,
|
|
244
|
+
DEFAULT_MAX_ETA_STEPS,
|
|
245
|
+
DEFAULT_MAX_INTROSPECTION_DEPTH
|
|
246
|
+
};
|