cvm-server 0.4.1 → 0.4.3
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/main.cjs +1384 -0
- package/package.json +6 -6
package/main.cjs
ADDED
|
@@ -0,0 +1,1384 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const mcp_js = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
3
|
+
const stdio_js = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
4
|
+
const zod = require("zod");
|
|
5
|
+
const s$1 = require("typescript");
|
|
6
|
+
const fs = require("fs");
|
|
7
|
+
const c$1 = require("path");
|
|
8
|
+
const mongodb = require("mongodb");
|
|
9
|
+
const dotenv = require("dotenv");
|
|
10
|
+
const url = require("url");
|
|
11
|
+
var _documentCurrentScript = typeof document !== "undefined" ? document.currentScript : null;
|
|
12
|
+
function _interopNamespaceDefault(e) {
|
|
13
|
+
const n2 = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
|
|
14
|
+
if (e) {
|
|
15
|
+
for (const k2 in e) {
|
|
16
|
+
if (k2 !== "default") {
|
|
17
|
+
const d = Object.getOwnPropertyDescriptor(e, k2);
|
|
18
|
+
Object.defineProperty(n2, k2, d.get ? d : {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
get: () => e[k2]
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
n2.default = e;
|
|
26
|
+
return Object.freeze(n2);
|
|
27
|
+
}
|
|
28
|
+
const s__namespace = /* @__PURE__ */ _interopNamespaceDefault(s$1);
|
|
29
|
+
const c__namespace = /* @__PURE__ */ _interopNamespaceDefault(c$1);
|
|
30
|
+
const dotenv__namespace = /* @__PURE__ */ _interopNamespaceDefault(dotenv);
|
|
31
|
+
var S = Object.defineProperty;
|
|
32
|
+
var p$1 = (i2, a2, e) => a2 in i2 ? S(i2, a2, { enumerable: true, configurable: true, writable: true, value: e }) : i2[a2] = e;
|
|
33
|
+
var E$1 = (i2, a2, e) => p$1(i2, typeof a2 != "symbol" ? a2 + "" : a2, e);
|
|
34
|
+
var n$1 = /* @__PURE__ */ ((i2) => (i2.PUSH = "PUSH", i2.POP = "POP", i2.LOAD = "LOAD", i2.STORE = "STORE", i2.CONCAT = "CONCAT", i2.ARRAY_NEW = "ARRAY_NEW", i2.ARRAY_PUSH = "ARRAY_PUSH", i2.ARRAY_GET = "ARRAY_GET", i2.ARRAY_SET = "ARRAY_SET", i2.ARRAY_LEN = "ARRAY_LEN", i2.STRING_LEN = "STRING_LEN", i2.LENGTH = "LENGTH", i2.JSON_PARSE = "JSON_PARSE", i2.TYPEOF = "TYPEOF", i2.ADD = "ADD", i2.SUB = "SUB", i2.MUL = "MUL", i2.DIV = "DIV", i2.MOD = "MOD", i2.EQ = "EQ", i2.NEQ = "NEQ", i2.LT = "LT", i2.GT = "GT", i2.LTE = "LTE", i2.GTE = "GTE", i2.EQ_STRICT = "EQ_STRICT", i2.NEQ_STRICT = "NEQ_STRICT", i2.JUMP = "JUMP", i2.JUMP_IF = "JUMP_IF", i2.JUMP_IF_FALSE = "JUMP_IF_FALSE", i2.JUMP_IF_TRUE = "JUMP_IF_TRUE", i2.CALL = "CALL", i2.RETURN = "RETURN", i2.AND = "AND", i2.OR = "OR", i2.NOT = "NOT", i2.BREAK = "BREAK", i2.CONTINUE = "CONTINUE", i2.ITER_START = "ITER_START", i2.ITER_NEXT = "ITER_NEXT", i2.ITER_END = "ITER_END", i2.FS_LIST_FILES = "FS_LIST_FILES", i2.CC = "CC", i2.PRINT = "PRINT", i2.HALT = "HALT", i2))(n$1 || {});
|
|
35
|
+
function A(i2) {
|
|
36
|
+
const a2 = [], e = [];
|
|
37
|
+
let x = false, m2 = false;
|
|
38
|
+
const c2 = s__namespace.createSourceFile(
|
|
39
|
+
"program.ts",
|
|
40
|
+
i2,
|
|
41
|
+
s__namespace.ScriptTarget.Latest,
|
|
42
|
+
true
|
|
43
|
+
);
|
|
44
|
+
function t2(r2) {
|
|
45
|
+
if (s__namespace.isFunctionDeclaration(r2) && r2.name && r2.name.text === "main" && (x = true, r2.parameters.length > 0 && a2.push("main() must not have parameters")), s__namespace.isExpressionStatement(r2) && r2.parent === c2) {
|
|
46
|
+
const l2 = r2.expression;
|
|
47
|
+
s__namespace.isCallExpression(l2) && s__namespace.isIdentifier(l2.expression) && l2.expression.text === "main" && (m2 = true);
|
|
48
|
+
}
|
|
49
|
+
if (s__namespace.isCallExpression(r2) && s__namespace.isIdentifier(r2.expression)) {
|
|
50
|
+
const l2 = r2.expression.text;
|
|
51
|
+
["setTimeout", "fetch", "require", "import"].includes(l2) && a2.push(`Unsupported function: ${l2}`);
|
|
52
|
+
}
|
|
53
|
+
s__namespace.forEachChild(r2, t2);
|
|
54
|
+
}
|
|
55
|
+
return t2(c2), x || a2.push("Program must have a main() function"), x && !m2 && a2.push("main() must be called at the top level"), a2.length === 0 && e.push({ op: n$1.HALT }), {
|
|
56
|
+
bytecode: e,
|
|
57
|
+
errors: a2,
|
|
58
|
+
hasMain: x
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
let h$1 = class h {
|
|
62
|
+
constructor() {
|
|
63
|
+
E$1(this, "bytecode", []);
|
|
64
|
+
E$1(this, "contextStack", []);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Emit an instruction and return its index
|
|
68
|
+
*/
|
|
69
|
+
emit(a2, e) {
|
|
70
|
+
const x = this.bytecode.length;
|
|
71
|
+
return this.bytecode.push({ op: a2, arg: e }), x;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get the current address (next instruction index)
|
|
75
|
+
*/
|
|
76
|
+
currentAddress() {
|
|
77
|
+
return this.bytecode.length;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Patch a jump instruction with the target address
|
|
81
|
+
*/
|
|
82
|
+
patchJump(a2, e) {
|
|
83
|
+
a2 >= 0 && a2 < this.bytecode.length && (this.bytecode[a2].arg = e);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Patch multiple jump instructions with the same target
|
|
87
|
+
*/
|
|
88
|
+
patchJumps(a2, e) {
|
|
89
|
+
a2.forEach((x) => this.patchJump(x, e));
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Push a new jump context onto the stack
|
|
93
|
+
*/
|
|
94
|
+
pushContext(a2) {
|
|
95
|
+
this.contextStack.push(a2);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Pop the current jump context from the stack
|
|
99
|
+
*/
|
|
100
|
+
popContext() {
|
|
101
|
+
return this.contextStack.pop() || null;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Get the current context without removing it
|
|
105
|
+
*/
|
|
106
|
+
getCurrentContext() {
|
|
107
|
+
return this.contextStack.length > 0 ? this.contextStack[this.contextStack.length - 1] : null;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Find the nearest loop context (for break/continue)
|
|
111
|
+
*/
|
|
112
|
+
findLoopContext() {
|
|
113
|
+
for (let a2 = this.contextStack.length - 1; a2 >= 0; a2--)
|
|
114
|
+
if (this.contextStack[a2].type === "loop")
|
|
115
|
+
return this.contextStack[a2];
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Get the final bytecode array
|
|
120
|
+
*/
|
|
121
|
+
getBytecode() {
|
|
122
|
+
return this.bytecode;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Check if compilation is in a valid state
|
|
126
|
+
*/
|
|
127
|
+
isValid() {
|
|
128
|
+
return this.contextStack.length === 0;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Get any unclosed contexts (for error reporting)
|
|
132
|
+
*/
|
|
133
|
+
getUnclosedContexts() {
|
|
134
|
+
return [...this.contextStack];
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
function k(i2) {
|
|
138
|
+
const a2 = A(i2);
|
|
139
|
+
if (a2.errors.length > 0)
|
|
140
|
+
return {
|
|
141
|
+
success: false,
|
|
142
|
+
bytecode: [],
|
|
143
|
+
errors: a2.errors
|
|
144
|
+
};
|
|
145
|
+
const e = new h$1(), x = s__namespace.createSourceFile("program.ts", i2, s__namespace.ScriptTarget.Latest, true);
|
|
146
|
+
function m2(t2) {
|
|
147
|
+
if (s__namespace.isIfStatement(t2)) {
|
|
148
|
+
c2(t2.expression);
|
|
149
|
+
const r2 = e.emit(n$1.JUMP_IF_FALSE, -1), l2 = {
|
|
150
|
+
type: "if",
|
|
151
|
+
endTargets: []
|
|
152
|
+
};
|
|
153
|
+
if (t2.elseStatement ? l2.elseTarget = r2 : l2.endTargets.push(r2), e.pushContext(l2), m2(t2.thenStatement), t2.elseStatement) {
|
|
154
|
+
const o2 = e.emit(n$1.JUMP, -1);
|
|
155
|
+
l2.endTargets.push(o2);
|
|
156
|
+
const u2 = e.currentAddress();
|
|
157
|
+
e.patchJump(r2, u2), m2(t2.elseStatement);
|
|
158
|
+
}
|
|
159
|
+
const T2 = e.popContext();
|
|
160
|
+
if (T2) {
|
|
161
|
+
const o2 = e.currentAddress();
|
|
162
|
+
e.patchJumps(T2.endTargets, o2);
|
|
163
|
+
}
|
|
164
|
+
} else if (s__namespace.isWhileStatement(t2)) {
|
|
165
|
+
const r2 = e.currentAddress();
|
|
166
|
+
c2(t2.expression);
|
|
167
|
+
const T2 = {
|
|
168
|
+
type: "loop",
|
|
169
|
+
breakTargets: [e.emit(n$1.JUMP_IF_FALSE, -1)],
|
|
170
|
+
continueTargets: [],
|
|
171
|
+
endTargets: [],
|
|
172
|
+
startAddress: r2
|
|
173
|
+
};
|
|
174
|
+
e.pushContext(T2), m2(t2.statement), e.emit(n$1.JUMP, r2);
|
|
175
|
+
const o2 = e.popContext();
|
|
176
|
+
if (o2) {
|
|
177
|
+
const u2 = e.currentAddress();
|
|
178
|
+
e.patchJumps(o2.breakTargets || [], u2);
|
|
179
|
+
}
|
|
180
|
+
} else if (s__namespace.isBlock(t2))
|
|
181
|
+
t2.statements.forEach((r2) => {
|
|
182
|
+
m2(r2);
|
|
183
|
+
});
|
|
184
|
+
else if (s__namespace.isExpressionStatement(t2)) {
|
|
185
|
+
const r2 = t2.expression;
|
|
186
|
+
if (s__namespace.isCallExpression(r2) && s__namespace.isPropertyAccessExpression(r2.expression) && r2.expression.expression.getText() === "console" && r2.expression.name.getText() === "log")
|
|
187
|
+
r2.arguments.forEach((l2) => {
|
|
188
|
+
c2(l2);
|
|
189
|
+
}), e.emit(n$1.PRINT);
|
|
190
|
+
else if (s__namespace.isCallExpression(r2) && s__namespace.isIdentifier(r2.expression) && r2.expression.text === "CC")
|
|
191
|
+
r2.arguments.length > 0 && c2(r2.arguments[0]), e.emit(n$1.CC), e.emit(n$1.POP);
|
|
192
|
+
else if (s__namespace.isCallExpression(r2) && s__namespace.isPropertyAccessExpression(r2.expression) && r2.expression.name.getText() === "push")
|
|
193
|
+
c2(r2.expression.expression), r2.arguments.length > 0 && c2(r2.arguments[0]), e.emit(n$1.ARRAY_PUSH);
|
|
194
|
+
else if (s__namespace.isBinaryExpression(r2) && r2.operatorToken.kind === s__namespace.SyntaxKind.EqualsToken) {
|
|
195
|
+
if (c2(r2.right), s__namespace.isIdentifier(r2.left))
|
|
196
|
+
e.emit(n$1.STORE, r2.left.text);
|
|
197
|
+
else if (s__namespace.isElementAccessExpression(r2.left)) {
|
|
198
|
+
const l2 = `__temp_${e.getBytecode().length}`;
|
|
199
|
+
e.emit(n$1.STORE, l2), c2(r2.left.expression), c2(r2.left.argumentExpression), e.emit(n$1.LOAD, l2), e.emit(n$1.ARRAY_SET);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
} else if (s__namespace.isVariableStatement(t2)) {
|
|
203
|
+
const r2 = t2.declarationList.declarations[0];
|
|
204
|
+
r2.initializer && (c2(r2.initializer), e.emit(n$1.STORE, r2.name.getText()));
|
|
205
|
+
} else s__namespace.isReturnStatement(t2) && (t2.expression ? c2(t2.expression) : e.emit(n$1.PUSH, null), e.emit(n$1.RETURN));
|
|
206
|
+
}
|
|
207
|
+
function c2(t2) {
|
|
208
|
+
if (s__namespace.isStringLiteral(t2))
|
|
209
|
+
e.emit(n$1.PUSH, t2.text);
|
|
210
|
+
else if (s__namespace.isNumericLiteral(t2))
|
|
211
|
+
e.emit(n$1.PUSH, Number(t2.text));
|
|
212
|
+
else if (t2.kind === s__namespace.SyntaxKind.TrueKeyword)
|
|
213
|
+
e.emit(n$1.PUSH, true);
|
|
214
|
+
else if (t2.kind === s__namespace.SyntaxKind.FalseKeyword)
|
|
215
|
+
e.emit(n$1.PUSH, false);
|
|
216
|
+
else if (t2.kind === s__namespace.SyntaxKind.NullKeyword)
|
|
217
|
+
e.emit(n$1.PUSH, null);
|
|
218
|
+
else if (s__namespace.isArrayLiteralExpression(t2))
|
|
219
|
+
e.emit(n$1.ARRAY_NEW), t2.elements.forEach((r2) => {
|
|
220
|
+
c2(r2), e.emit(n$1.ARRAY_PUSH);
|
|
221
|
+
});
|
|
222
|
+
else if (s__namespace.isElementAccessExpression(t2))
|
|
223
|
+
c2(t2.expression), t2.argumentExpression && c2(t2.argumentExpression), e.emit(n$1.ARRAY_GET);
|
|
224
|
+
else if (s__namespace.isPropertyAccessExpression(t2) && t2.name.text === "length")
|
|
225
|
+
c2(t2.expression), e.emit(n$1.LENGTH);
|
|
226
|
+
else if (s__namespace.isIdentifier(t2))
|
|
227
|
+
e.emit(n$1.LOAD, t2.text);
|
|
228
|
+
else if (s__namespace.isCallExpression(t2))
|
|
229
|
+
s__namespace.isPropertyAccessExpression(t2.expression) && s__namespace.isIdentifier(t2.expression.expression) && t2.expression.expression.text === "JSON" && t2.expression.name.text === "parse" ? (t2.arguments.length > 0 && c2(t2.arguments[0]), e.emit(n$1.JSON_PARSE)) : s__namespace.isIdentifier(t2.expression) && t2.expression.text === "CC" && (t2.arguments.length > 0 && c2(t2.arguments[0]), e.emit(n$1.CC));
|
|
230
|
+
else if (s__namespace.isParenthesizedExpression(t2))
|
|
231
|
+
c2(t2.expression);
|
|
232
|
+
else if (s__namespace.isBinaryExpression(t2)) {
|
|
233
|
+
const r2 = t2.operatorToken.kind;
|
|
234
|
+
switch (c2(t2.left), c2(t2.right), r2) {
|
|
235
|
+
case s__namespace.SyntaxKind.PlusToken:
|
|
236
|
+
f$1(t2.left, t2.right) ? e.emit(n$1.CONCAT) : e.emit(n$1.ADD);
|
|
237
|
+
break;
|
|
238
|
+
case s__namespace.SyntaxKind.MinusToken:
|
|
239
|
+
e.emit(n$1.SUB);
|
|
240
|
+
break;
|
|
241
|
+
case s__namespace.SyntaxKind.AsteriskToken:
|
|
242
|
+
e.emit(n$1.MUL);
|
|
243
|
+
break;
|
|
244
|
+
case s__namespace.SyntaxKind.SlashToken:
|
|
245
|
+
e.emit(n$1.DIV);
|
|
246
|
+
break;
|
|
247
|
+
case s__namespace.SyntaxKind.PercentToken:
|
|
248
|
+
e.emit(n$1.MOD);
|
|
249
|
+
break;
|
|
250
|
+
case s__namespace.SyntaxKind.EqualsEqualsToken:
|
|
251
|
+
e.emit(n$1.EQ);
|
|
252
|
+
break;
|
|
253
|
+
case s__namespace.SyntaxKind.ExclamationEqualsToken:
|
|
254
|
+
e.emit(n$1.NEQ);
|
|
255
|
+
break;
|
|
256
|
+
case s__namespace.SyntaxKind.LessThanToken:
|
|
257
|
+
e.emit(n$1.LT);
|
|
258
|
+
break;
|
|
259
|
+
case s__namespace.SyntaxKind.GreaterThanToken:
|
|
260
|
+
e.emit(n$1.GT);
|
|
261
|
+
break;
|
|
262
|
+
case s__namespace.SyntaxKind.LessThanEqualsToken:
|
|
263
|
+
e.emit(n$1.LTE);
|
|
264
|
+
break;
|
|
265
|
+
case s__namespace.SyntaxKind.GreaterThanEqualsToken:
|
|
266
|
+
e.emit(n$1.GTE);
|
|
267
|
+
break;
|
|
268
|
+
case s__namespace.SyntaxKind.EqualsEqualsEqualsToken:
|
|
269
|
+
e.emit(n$1.EQ_STRICT);
|
|
270
|
+
break;
|
|
271
|
+
case s__namespace.SyntaxKind.ExclamationEqualsEqualsToken:
|
|
272
|
+
e.emit(n$1.NEQ_STRICT);
|
|
273
|
+
break;
|
|
274
|
+
case s__namespace.SyntaxKind.AmpersandAmpersandToken:
|
|
275
|
+
e.emit(n$1.AND);
|
|
276
|
+
break;
|
|
277
|
+
case s__namespace.SyntaxKind.BarBarToken:
|
|
278
|
+
e.emit(n$1.OR);
|
|
279
|
+
break;
|
|
280
|
+
}
|
|
281
|
+
} else if (s__namespace.isPrefixUnaryExpression(t2))
|
|
282
|
+
switch (t2.operator) {
|
|
283
|
+
case s__namespace.SyntaxKind.ExclamationToken:
|
|
284
|
+
c2(t2.operand), e.emit(n$1.NOT);
|
|
285
|
+
break;
|
|
286
|
+
}
|
|
287
|
+
else s__namespace.isTypeOfExpression(t2) && (c2(t2.expression), e.emit(n$1.TYPEOF));
|
|
288
|
+
}
|
|
289
|
+
return x.forEachChild((t2) => {
|
|
290
|
+
var r2;
|
|
291
|
+
s__namespace.isFunctionDeclaration(t2) && ((r2 = t2.name) == null ? void 0 : r2.text) === "main" && t2.body && t2.body.statements.forEach((l2) => {
|
|
292
|
+
m2(l2);
|
|
293
|
+
});
|
|
294
|
+
}), e.emit(n$1.HALT), {
|
|
295
|
+
success: true,
|
|
296
|
+
bytecode: e.getBytecode(),
|
|
297
|
+
errors: []
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
function f$1(i2, a2) {
|
|
301
|
+
return !!(s__namespace.isStringLiteral(i2) || s__namespace.isStringLiteral(a2) || s__namespace.isBinaryExpression(i2) && i2.operatorToken.kind === s__namespace.SyntaxKind.PlusToken && f$1(i2.left, i2.right) || s__namespace.isBinaryExpression(a2) && a2.operatorToken.kind === s__namespace.SyntaxKind.PlusToken && f$1(a2.left, a2.right));
|
|
302
|
+
}
|
|
303
|
+
function n(r2) {
|
|
304
|
+
return typeof r2 == "string";
|
|
305
|
+
}
|
|
306
|
+
function t(r2) {
|
|
307
|
+
return typeof r2 == "number";
|
|
308
|
+
}
|
|
309
|
+
function i$1(r2) {
|
|
310
|
+
return typeof r2 == "boolean";
|
|
311
|
+
}
|
|
312
|
+
function f(r2) {
|
|
313
|
+
return r2 === null;
|
|
314
|
+
}
|
|
315
|
+
function o$1(r2) {
|
|
316
|
+
return r2 !== null && typeof r2 == "object" && "type" in r2 && r2.type === "array";
|
|
317
|
+
}
|
|
318
|
+
function u$1(r2) {
|
|
319
|
+
return n(r2) ? r2 : t(r2) || i$1(r2) ? r2.toString() : f(r2) ? "null" : o$1(r2) ? `[array:${r2.elements.length}]` : String(r2);
|
|
320
|
+
}
|
|
321
|
+
function c(r2) {
|
|
322
|
+
return i$1(r2) ? r2 : f(r2) ? false : t(r2) ? r2 !== 0 : n(r2) ? r2 !== "" : o$1(r2) ? true : !!r2;
|
|
323
|
+
}
|
|
324
|
+
function m(r2) {
|
|
325
|
+
return n(r2) ? "string" : t(r2) ? "number" : i$1(r2) ? "boolean" : f(r2) ? "null" : o$1(r2) ? "array" : "unknown";
|
|
326
|
+
}
|
|
327
|
+
function y(r2) {
|
|
328
|
+
if (t(r2)) return r2;
|
|
329
|
+
if (i$1(r2)) return r2 ? 1 : 0;
|
|
330
|
+
if (f(r2)) return 0;
|
|
331
|
+
if (n(r2)) {
|
|
332
|
+
const e = r2.trim();
|
|
333
|
+
return e === "" ? NaN : Number(e);
|
|
334
|
+
}
|
|
335
|
+
return o$1(r2) ? NaN : Number(r2);
|
|
336
|
+
}
|
|
337
|
+
function s(r2 = []) {
|
|
338
|
+
return { type: "array", elements: r2 };
|
|
339
|
+
}
|
|
340
|
+
var l = Object.defineProperty;
|
|
341
|
+
var u = (s2, t2, n2) => t2 in s2 ? l(s2, t2, { enumerable: true, configurable: true, writable: true, value: n2 }) : s2[t2] = n2;
|
|
342
|
+
var r = (s2, t2, n2) => u(s2, typeof t2 != "symbol" ? t2 + "" : t2, n2);
|
|
343
|
+
class h2 {
|
|
344
|
+
constructor(t2) {
|
|
345
|
+
r(this, "connected", false);
|
|
346
|
+
r(this, "programsDir");
|
|
347
|
+
r(this, "executionsDir");
|
|
348
|
+
r(this, "outputsDir");
|
|
349
|
+
this.dataDir = t2, this.programsDir = c__namespace.join(t2, "programs"), this.executionsDir = c__namespace.join(t2, "executions"), this.outputsDir = c__namespace.join(t2, "outputs");
|
|
350
|
+
}
|
|
351
|
+
async connect() {
|
|
352
|
+
await fs.promises.mkdir(this.dataDir, { recursive: true }), await fs.promises.mkdir(this.programsDir, { recursive: true }), await fs.promises.mkdir(this.executionsDir, { recursive: true }), await fs.promises.mkdir(this.outputsDir, { recursive: true }), this.connected = true;
|
|
353
|
+
}
|
|
354
|
+
async disconnect() {
|
|
355
|
+
this.connected = false;
|
|
356
|
+
}
|
|
357
|
+
isConnected() {
|
|
358
|
+
return this.connected;
|
|
359
|
+
}
|
|
360
|
+
async saveProgram(t2) {
|
|
361
|
+
if (!this.connected) throw new Error("Not connected");
|
|
362
|
+
const n2 = c__namespace.join(this.programsDir, `${t2.id}.json`), e = JSON.stringify(t2, null, 2);
|
|
363
|
+
await fs.promises.writeFile(n2, e, "utf-8");
|
|
364
|
+
}
|
|
365
|
+
async getProgram(t2) {
|
|
366
|
+
if (!this.connected) throw new Error("Not connected");
|
|
367
|
+
const n2 = c__namespace.join(this.programsDir, `${t2}.json`);
|
|
368
|
+
try {
|
|
369
|
+
const e = await fs.promises.readFile(n2, "utf-8"), o2 = JSON.parse(e);
|
|
370
|
+
return o2.created = new Date(o2.created), o2.updated && (o2.updated = new Date(o2.updated)), o2;
|
|
371
|
+
} catch (e) {
|
|
372
|
+
if (e.code === "ENOENT")
|
|
373
|
+
return null;
|
|
374
|
+
throw e;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
async saveExecution(t2) {
|
|
378
|
+
if (!this.connected) throw new Error("Not connected");
|
|
379
|
+
const n2 = c__namespace.join(this.executionsDir, `${t2.id}.json`), e = JSON.stringify(t2, null, 2);
|
|
380
|
+
await fs.promises.writeFile(n2, e, "utf-8");
|
|
381
|
+
}
|
|
382
|
+
async getExecution(t2) {
|
|
383
|
+
if (!this.connected) throw new Error("Not connected");
|
|
384
|
+
const n2 = c__namespace.join(this.executionsDir, `${t2}.json`);
|
|
385
|
+
try {
|
|
386
|
+
const e = await fs.promises.readFile(n2, "utf-8"), o2 = JSON.parse(e);
|
|
387
|
+
return o2.created = new Date(o2.created), o2.updated && (o2.updated = new Date(o2.updated)), o2;
|
|
388
|
+
} catch (e) {
|
|
389
|
+
if (e.code === "ENOENT")
|
|
390
|
+
return null;
|
|
391
|
+
throw e;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
async appendOutput(t2, n2) {
|
|
395
|
+
if (!this.connected) throw new Error("Not connected");
|
|
396
|
+
const e = c__namespace.join(this.outputsDir, `${t2}.output`), o2 = n2.join(`
|
|
397
|
+
`) + `
|
|
398
|
+
`;
|
|
399
|
+
await fs.promises.appendFile(e, o2, "utf-8");
|
|
400
|
+
}
|
|
401
|
+
async getOutput(t2) {
|
|
402
|
+
if (!this.connected) throw new Error("Not connected");
|
|
403
|
+
const n2 = c__namespace.join(this.outputsDir, `${t2}.output`);
|
|
404
|
+
try {
|
|
405
|
+
return (await fs.promises.readFile(n2, "utf-8")).split(`
|
|
406
|
+
`).filter((o2) => o2.length > 0);
|
|
407
|
+
} catch (e) {
|
|
408
|
+
if (e.code === "ENOENT")
|
|
409
|
+
return [];
|
|
410
|
+
throw e;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
class p {
|
|
415
|
+
constructor(t2) {
|
|
416
|
+
r(this, "client");
|
|
417
|
+
r(this, "db", null);
|
|
418
|
+
r(this, "connected", false);
|
|
419
|
+
this.connectionString = t2, this.client = new mongodb.MongoClient(t2);
|
|
420
|
+
}
|
|
421
|
+
async connect() {
|
|
422
|
+
var o2;
|
|
423
|
+
await this.client.connect();
|
|
424
|
+
const t2 = ((o2 = this.connectionString.split("/").pop()) == null ? void 0 : o2.split("?")[0]) || "cvm";
|
|
425
|
+
this.db = this.client.db(t2), this.connected = true;
|
|
426
|
+
const e = (await this.db.listCollections().toArray()).map((a2) => a2.name);
|
|
427
|
+
e.includes("programs") || await this.db.createCollection("programs"), e.includes("executions") || await this.db.createCollection("executions"), e.includes("outputs") || await this.db.createCollection("outputs");
|
|
428
|
+
}
|
|
429
|
+
async disconnect() {
|
|
430
|
+
await this.client.close(), this.connected = false, this.db = null;
|
|
431
|
+
}
|
|
432
|
+
isConnected() {
|
|
433
|
+
return this.connected;
|
|
434
|
+
}
|
|
435
|
+
async getCollections() {
|
|
436
|
+
if (!this.db) throw new Error("Not connected to database");
|
|
437
|
+
return (await this.db.listCollections().toArray()).map((n2) => n2.name);
|
|
438
|
+
}
|
|
439
|
+
getCollection(t2) {
|
|
440
|
+
if (!this.db) throw new Error("Not connected to database");
|
|
441
|
+
return this.db.collection(t2);
|
|
442
|
+
}
|
|
443
|
+
async saveProgram(t2) {
|
|
444
|
+
await this.getCollection("programs").replaceOne(
|
|
445
|
+
{ id: t2.id },
|
|
446
|
+
t2,
|
|
447
|
+
{ upsert: true }
|
|
448
|
+
);
|
|
449
|
+
}
|
|
450
|
+
async getProgram(t2) {
|
|
451
|
+
return await this.getCollection("programs").findOne({ id: t2 });
|
|
452
|
+
}
|
|
453
|
+
async saveExecution(t2) {
|
|
454
|
+
await this.getCollection("executions").replaceOne(
|
|
455
|
+
{ id: t2.id },
|
|
456
|
+
t2,
|
|
457
|
+
{ upsert: true }
|
|
458
|
+
);
|
|
459
|
+
}
|
|
460
|
+
async getExecution(t2) {
|
|
461
|
+
return await this.getCollection("executions").findOne({ id: t2 });
|
|
462
|
+
}
|
|
463
|
+
async appendOutput(t2, n2) {
|
|
464
|
+
const e = this.getCollection("outputs");
|
|
465
|
+
await e.findOne({ executionId: t2 }) ? await e.updateOne(
|
|
466
|
+
{ executionId: t2 },
|
|
467
|
+
{ $push: { lines: { $each: n2 } } }
|
|
468
|
+
) : await e.insertOne({ executionId: t2, lines: n2 });
|
|
469
|
+
}
|
|
470
|
+
async getOutput(t2) {
|
|
471
|
+
const e = await this.getCollection("outputs").findOne({ executionId: t2 });
|
|
472
|
+
return (e == null ? void 0 : e.lines) || [];
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
class g {
|
|
476
|
+
static create(t2) {
|
|
477
|
+
const n2 = (t2 == null ? void 0 : t2.type) || process.env.CVM_STORAGE_TYPE || "file";
|
|
478
|
+
switch (n2) {
|
|
479
|
+
case "file": {
|
|
480
|
+
const e = (t2 == null ? void 0 : t2.dataDir) || process.env.CVM_DATA_DIR || ".cvm";
|
|
481
|
+
return new h2(e);
|
|
482
|
+
}
|
|
483
|
+
case "mongodb": {
|
|
484
|
+
const e = (t2 == null ? void 0 : t2.mongoUri) || process.env.MONGODB_URI || "mongodb://localhost:27017/cvm";
|
|
485
|
+
return new p(e);
|
|
486
|
+
}
|
|
487
|
+
default:
|
|
488
|
+
throw new Error(`Unsupported storage type: ${n2}`);
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
var R = Object.defineProperty;
|
|
493
|
+
var T = (d, a2, s2) => a2 in d ? R(d, a2, { enumerable: true, configurable: true, writable: true, value: s2 }) : d[a2] = s2;
|
|
494
|
+
var v$1 = (d, a2, s2) => T(d, typeof a2 != "symbol" ? a2 + "" : a2, s2);
|
|
495
|
+
class E {
|
|
496
|
+
execute(a2, s$12) {
|
|
497
|
+
const r2 = {
|
|
498
|
+
pc: (s$12 == null ? void 0 : s$12.pc) ?? 0,
|
|
499
|
+
stack: (s$12 == null ? void 0 : s$12.stack) ?? [],
|
|
500
|
+
variables: (s$12 == null ? void 0 : s$12.variables) ?? /* @__PURE__ */ new Map(),
|
|
501
|
+
status: "running",
|
|
502
|
+
output: (s$12 == null ? void 0 : s$12.output) ?? [],
|
|
503
|
+
iterators: (s$12 == null ? void 0 : s$12.iterators) ?? [],
|
|
504
|
+
...s$12
|
|
505
|
+
};
|
|
506
|
+
for (; r2.status === "running" && r2.pc < a2.length; ) {
|
|
507
|
+
const i2 = a2[r2.pc];
|
|
508
|
+
switch (i2.op) {
|
|
509
|
+
case n$1.HALT:
|
|
510
|
+
r2.status = "complete";
|
|
511
|
+
break;
|
|
512
|
+
case n$1.PUSH:
|
|
513
|
+
r2.stack.push(i2.arg), r2.pc++;
|
|
514
|
+
break;
|
|
515
|
+
case n$1.POP:
|
|
516
|
+
r2.stack.pop(), r2.pc++;
|
|
517
|
+
break;
|
|
518
|
+
case n$1.LOAD: {
|
|
519
|
+
const t2 = i2.arg;
|
|
520
|
+
if (!r2.variables.has(t2)) {
|
|
521
|
+
r2.status = "error", r2.error = `LOAD: Variable '${t2}' is not defined`;
|
|
522
|
+
break;
|
|
523
|
+
}
|
|
524
|
+
r2.stack.push(r2.variables.get(t2)), r2.pc++;
|
|
525
|
+
break;
|
|
526
|
+
}
|
|
527
|
+
case n$1.STORE:
|
|
528
|
+
const f2 = r2.stack.pop();
|
|
529
|
+
if (f2 === void 0) {
|
|
530
|
+
r2.status = "error", r2.error = "STORE: Stack underflow";
|
|
531
|
+
break;
|
|
532
|
+
}
|
|
533
|
+
r2.variables.set(i2.arg, f2), r2.pc++;
|
|
534
|
+
break;
|
|
535
|
+
case n$1.CONCAT:
|
|
536
|
+
const u2 = r2.stack.pop(), k2 = r2.stack.pop();
|
|
537
|
+
if (k2 === void 0 || u2 === void 0) {
|
|
538
|
+
r2.status = "error", r2.error = "CONCAT: Stack underflow";
|
|
539
|
+
break;
|
|
540
|
+
}
|
|
541
|
+
r2.stack.push(u$1(k2) + u$1(u2)), r2.pc++;
|
|
542
|
+
break;
|
|
543
|
+
case n$1.PRINT:
|
|
544
|
+
const w = r2.stack.pop();
|
|
545
|
+
w !== void 0 && r2.output.push(u$1(w)), r2.pc++;
|
|
546
|
+
break;
|
|
547
|
+
case n$1.CC: {
|
|
548
|
+
const t2 = r2.stack.pop();
|
|
549
|
+
if (t2 === void 0) {
|
|
550
|
+
r2.status = "error", r2.error = "CC: Stack underflow";
|
|
551
|
+
break;
|
|
552
|
+
}
|
|
553
|
+
r2.ccPrompt = u$1(t2), r2.status = "waiting_cc";
|
|
554
|
+
break;
|
|
555
|
+
}
|
|
556
|
+
// Array operations
|
|
557
|
+
case n$1.ARRAY_NEW:
|
|
558
|
+
r2.stack.push(s()), r2.pc++;
|
|
559
|
+
break;
|
|
560
|
+
case n$1.ARRAY_PUSH: {
|
|
561
|
+
const t2 = r2.stack.pop(), e = r2.stack.pop();
|
|
562
|
+
if (t2 === void 0 || e === void 0) {
|
|
563
|
+
r2.status = "error", r2.error = "ARRAY_PUSH: Stack underflow";
|
|
564
|
+
break;
|
|
565
|
+
}
|
|
566
|
+
if (!o$1(e)) {
|
|
567
|
+
r2.status = "error", r2.error = "ARRAY_PUSH requires an array";
|
|
568
|
+
break;
|
|
569
|
+
}
|
|
570
|
+
e.elements.push(t2), r2.stack.push(e), r2.pc++;
|
|
571
|
+
break;
|
|
572
|
+
}
|
|
573
|
+
case n$1.ARRAY_GET: {
|
|
574
|
+
const t$1 = r2.stack.pop(), e = r2.stack.pop();
|
|
575
|
+
if (t$1 === void 0 || e === void 0) {
|
|
576
|
+
r2.status = "error", r2.error = "ARRAY_GET: Stack underflow";
|
|
577
|
+
break;
|
|
578
|
+
}
|
|
579
|
+
if (!o$1(e)) {
|
|
580
|
+
r2.status = "error", r2.error = "ARRAY_GET requires an array";
|
|
581
|
+
break;
|
|
582
|
+
}
|
|
583
|
+
if (!t(t$1)) {
|
|
584
|
+
r2.status = "error", r2.error = "ARRAY_GET requires numeric index";
|
|
585
|
+
break;
|
|
586
|
+
}
|
|
587
|
+
const c2 = e.elements[t$1] ?? null;
|
|
588
|
+
r2.stack.push(c2), r2.pc++;
|
|
589
|
+
break;
|
|
590
|
+
}
|
|
591
|
+
case n$1.ARRAY_SET: {
|
|
592
|
+
const t$1 = r2.stack.pop(), e = r2.stack.pop(), c2 = r2.stack.pop();
|
|
593
|
+
if (t$1 === void 0 || e === void 0 || c2 === void 0) {
|
|
594
|
+
r2.status = "error", r2.error = "ARRAY_SET: Stack underflow";
|
|
595
|
+
break;
|
|
596
|
+
}
|
|
597
|
+
if (!o$1(c2)) {
|
|
598
|
+
r2.status = "error", r2.error = "ARRAY_SET requires an array";
|
|
599
|
+
break;
|
|
600
|
+
}
|
|
601
|
+
if (!t(e)) {
|
|
602
|
+
r2.status = "error", r2.error = "ARRAY_SET requires numeric index";
|
|
603
|
+
break;
|
|
604
|
+
}
|
|
605
|
+
const n2 = Math.floor(e);
|
|
606
|
+
if (n2 < 0) {
|
|
607
|
+
r2.status = "error", r2.error = "ARRAY_SET: Negative index not allowed";
|
|
608
|
+
break;
|
|
609
|
+
}
|
|
610
|
+
c2.elements[n2] = t$1, r2.pc++;
|
|
611
|
+
break;
|
|
612
|
+
}
|
|
613
|
+
case n$1.ARRAY_LEN: {
|
|
614
|
+
const t2 = r2.stack.pop();
|
|
615
|
+
if (t2 === void 0) {
|
|
616
|
+
r2.status = "error", r2.error = "ARRAY_LEN: Stack underflow";
|
|
617
|
+
break;
|
|
618
|
+
}
|
|
619
|
+
if (!o$1(t2)) {
|
|
620
|
+
r2.status = "error", r2.error = "ARRAY_LEN requires an array";
|
|
621
|
+
break;
|
|
622
|
+
}
|
|
623
|
+
r2.stack.push(t2.elements.length), r2.pc++;
|
|
624
|
+
break;
|
|
625
|
+
}
|
|
626
|
+
case n$1.STRING_LEN: {
|
|
627
|
+
const t2 = r2.stack.pop();
|
|
628
|
+
if (t2 === void 0) {
|
|
629
|
+
r2.status = "error", r2.error = "STRING_LEN: Stack underflow";
|
|
630
|
+
break;
|
|
631
|
+
}
|
|
632
|
+
if (!n(t2)) {
|
|
633
|
+
r2.status = "error", r2.error = "STRING_LEN requires a string";
|
|
634
|
+
break;
|
|
635
|
+
}
|
|
636
|
+
r2.stack.push(t2.length), r2.pc++;
|
|
637
|
+
break;
|
|
638
|
+
}
|
|
639
|
+
case n$1.LENGTH: {
|
|
640
|
+
const t2 = r2.stack.pop();
|
|
641
|
+
if (t2 === void 0) {
|
|
642
|
+
r2.status = "error", r2.error = "LENGTH: Stack underflow";
|
|
643
|
+
break;
|
|
644
|
+
}
|
|
645
|
+
if (n(t2))
|
|
646
|
+
r2.stack.push(t2.length);
|
|
647
|
+
else if (o$1(t2))
|
|
648
|
+
r2.stack.push(t2.elements.length);
|
|
649
|
+
else {
|
|
650
|
+
r2.status = "error", r2.error = "LENGTH requires a string or array";
|
|
651
|
+
break;
|
|
652
|
+
}
|
|
653
|
+
r2.pc++;
|
|
654
|
+
break;
|
|
655
|
+
}
|
|
656
|
+
case n$1.JSON_PARSE: {
|
|
657
|
+
const t2 = r2.stack.pop();
|
|
658
|
+
if (t2 === void 0) {
|
|
659
|
+
r2.status = "error", r2.error = "JSON_PARSE: Stack underflow";
|
|
660
|
+
break;
|
|
661
|
+
}
|
|
662
|
+
if (!n(t2)) {
|
|
663
|
+
r2.status = "error", r2.error = "JSON_PARSE requires a string";
|
|
664
|
+
break;
|
|
665
|
+
}
|
|
666
|
+
try {
|
|
667
|
+
const e = JSON.parse(t2);
|
|
668
|
+
Array.isArray(e) ? r2.stack.push(s(e)) : r2.stack.push(s());
|
|
669
|
+
} catch {
|
|
670
|
+
r2.stack.push(s());
|
|
671
|
+
}
|
|
672
|
+
r2.pc++;
|
|
673
|
+
break;
|
|
674
|
+
}
|
|
675
|
+
case n$1.TYPEOF: {
|
|
676
|
+
const t2 = r2.stack.pop();
|
|
677
|
+
if (t2 === void 0) {
|
|
678
|
+
r2.status = "error", r2.error = "TYPEOF: Stack underflow";
|
|
679
|
+
break;
|
|
680
|
+
}
|
|
681
|
+
r2.stack.push(m(t2)), r2.pc++;
|
|
682
|
+
break;
|
|
683
|
+
}
|
|
684
|
+
// Arithmetic operations
|
|
685
|
+
case n$1.ADD: {
|
|
686
|
+
const t2 = r2.stack.pop(), e = r2.stack.pop();
|
|
687
|
+
if (e === void 0 || t2 === void 0) {
|
|
688
|
+
r2.status = "error", r2.error = "ADD: Stack underflow";
|
|
689
|
+
break;
|
|
690
|
+
}
|
|
691
|
+
const c2 = y(e), n2 = y(t2);
|
|
692
|
+
r2.stack.push(c2 + n2), r2.pc++;
|
|
693
|
+
break;
|
|
694
|
+
}
|
|
695
|
+
case n$1.SUB: {
|
|
696
|
+
const t2 = r2.stack.pop(), e = r2.stack.pop();
|
|
697
|
+
if (e === void 0 || t2 === void 0) {
|
|
698
|
+
r2.status = "error", r2.error = "SUB: Stack underflow";
|
|
699
|
+
break;
|
|
700
|
+
}
|
|
701
|
+
const c2 = y(e), n2 = y(t2);
|
|
702
|
+
r2.stack.push(c2 - n2), r2.pc++;
|
|
703
|
+
break;
|
|
704
|
+
}
|
|
705
|
+
case n$1.MUL: {
|
|
706
|
+
const t2 = r2.stack.pop(), e = r2.stack.pop();
|
|
707
|
+
if (e === void 0 || t2 === void 0) {
|
|
708
|
+
r2.status = "error", r2.error = "MUL: Stack underflow";
|
|
709
|
+
break;
|
|
710
|
+
}
|
|
711
|
+
const c2 = y(e), n2 = y(t2);
|
|
712
|
+
r2.stack.push(c2 * n2), r2.pc++;
|
|
713
|
+
break;
|
|
714
|
+
}
|
|
715
|
+
case n$1.DIV: {
|
|
716
|
+
const t2 = r2.stack.pop(), e = r2.stack.pop();
|
|
717
|
+
if (e === void 0 || t2 === void 0) {
|
|
718
|
+
r2.status = "error", r2.error = "DIV: Stack underflow";
|
|
719
|
+
break;
|
|
720
|
+
}
|
|
721
|
+
const c2 = y(e), n2 = y(t2);
|
|
722
|
+
if (n2 === 0) {
|
|
723
|
+
r2.status = "error", r2.error = "Division by zero";
|
|
724
|
+
break;
|
|
725
|
+
}
|
|
726
|
+
r2.stack.push(c2 / n2), r2.pc++;
|
|
727
|
+
break;
|
|
728
|
+
}
|
|
729
|
+
case n$1.MOD: {
|
|
730
|
+
const t2 = r2.stack.pop(), e = r2.stack.pop();
|
|
731
|
+
if (e === void 0 || t2 === void 0) {
|
|
732
|
+
r2.status = "error", r2.error = "MOD: Stack underflow";
|
|
733
|
+
break;
|
|
734
|
+
}
|
|
735
|
+
const c2 = y(e), n2 = y(t2);
|
|
736
|
+
r2.stack.push(c2 % n2), r2.pc++;
|
|
737
|
+
break;
|
|
738
|
+
}
|
|
739
|
+
// Comparison operations
|
|
740
|
+
case n$1.EQ: {
|
|
741
|
+
const t2 = r2.stack.pop(), e = r2.stack.pop();
|
|
742
|
+
if (e === void 0 || t2 === void 0) {
|
|
743
|
+
r2.status = "error", r2.error = "EQ: Stack underflow";
|
|
744
|
+
break;
|
|
745
|
+
}
|
|
746
|
+
const c2 = y(e), n2 = y(t2);
|
|
747
|
+
!isNaN(c2) && !isNaN(n2) ? r2.stack.push(c2 === n2) : r2.stack.push(u$1(e) === u$1(t2)), r2.pc++;
|
|
748
|
+
break;
|
|
749
|
+
}
|
|
750
|
+
case n$1.NEQ: {
|
|
751
|
+
const t2 = r2.stack.pop(), e = r2.stack.pop();
|
|
752
|
+
if (e === void 0 || t2 === void 0) {
|
|
753
|
+
r2.status = "error", r2.error = "NEQ: Stack underflow";
|
|
754
|
+
break;
|
|
755
|
+
}
|
|
756
|
+
const c2 = y(e), n2 = y(t2);
|
|
757
|
+
!isNaN(c2) && !isNaN(n2) ? r2.stack.push(c2 !== n2) : r2.stack.push(u$1(e) !== u$1(t2)), r2.pc++;
|
|
758
|
+
break;
|
|
759
|
+
}
|
|
760
|
+
case n$1.LT: {
|
|
761
|
+
const t2 = r2.stack.pop(), e = r2.stack.pop();
|
|
762
|
+
if (e === void 0 || t2 === void 0) {
|
|
763
|
+
r2.status = "error", r2.error = "LT: Stack underflow";
|
|
764
|
+
break;
|
|
765
|
+
}
|
|
766
|
+
const c2 = y(e), n2 = y(t2);
|
|
767
|
+
r2.stack.push(c2 < n2), r2.pc++;
|
|
768
|
+
break;
|
|
769
|
+
}
|
|
770
|
+
case n$1.GT: {
|
|
771
|
+
const t2 = r2.stack.pop(), e = r2.stack.pop();
|
|
772
|
+
if (e === void 0 || t2 === void 0) {
|
|
773
|
+
r2.status = "error", r2.error = "GT: Stack underflow";
|
|
774
|
+
break;
|
|
775
|
+
}
|
|
776
|
+
const c2 = y(e), n2 = y(t2);
|
|
777
|
+
r2.stack.push(c2 > n2), r2.pc++;
|
|
778
|
+
break;
|
|
779
|
+
}
|
|
780
|
+
case n$1.LTE: {
|
|
781
|
+
const t2 = r2.stack.pop(), e = r2.stack.pop();
|
|
782
|
+
if (e === void 0 || t2 === void 0) {
|
|
783
|
+
r2.status = "error", r2.error = "LTE: Stack underflow";
|
|
784
|
+
break;
|
|
785
|
+
}
|
|
786
|
+
const c2 = y(e), n2 = y(t2);
|
|
787
|
+
r2.stack.push(c2 <= n2), r2.pc++;
|
|
788
|
+
break;
|
|
789
|
+
}
|
|
790
|
+
case n$1.GTE: {
|
|
791
|
+
const t2 = r2.stack.pop(), e = r2.stack.pop();
|
|
792
|
+
if (e === void 0 || t2 === void 0) {
|
|
793
|
+
r2.status = "error", r2.error = "GTE: Stack underflow";
|
|
794
|
+
break;
|
|
795
|
+
}
|
|
796
|
+
const c2 = y(e), n2 = y(t2);
|
|
797
|
+
r2.stack.push(c2 >= n2), r2.pc++;
|
|
798
|
+
break;
|
|
799
|
+
}
|
|
800
|
+
case n$1.EQ_STRICT: {
|
|
801
|
+
const t2 = r2.stack.pop(), e = r2.stack.pop();
|
|
802
|
+
if (e === void 0 || t2 === void 0) {
|
|
803
|
+
r2.status = "error", r2.error = "EQ_STRICT: Stack underflow";
|
|
804
|
+
break;
|
|
805
|
+
}
|
|
806
|
+
r2.stack.push(e === t2), r2.pc++;
|
|
807
|
+
break;
|
|
808
|
+
}
|
|
809
|
+
case n$1.NEQ_STRICT: {
|
|
810
|
+
const t2 = r2.stack.pop(), e = r2.stack.pop();
|
|
811
|
+
if (e === void 0 || t2 === void 0) {
|
|
812
|
+
r2.status = "error", r2.error = "NEQ_STRICT: Stack underflow";
|
|
813
|
+
break;
|
|
814
|
+
}
|
|
815
|
+
r2.stack.push(e !== t2), r2.pc++;
|
|
816
|
+
break;
|
|
817
|
+
}
|
|
818
|
+
// Jump operations
|
|
819
|
+
case n$1.JUMP: {
|
|
820
|
+
if (i2.arg === void 0) {
|
|
821
|
+
r2.status = "error", r2.error = "JUMP requires a target address";
|
|
822
|
+
break;
|
|
823
|
+
}
|
|
824
|
+
const t2 = i2.arg;
|
|
825
|
+
if (t2 < 0 || t2 >= a2.length) {
|
|
826
|
+
r2.status = "error", r2.error = `Invalid jump target: ${t2}`;
|
|
827
|
+
break;
|
|
828
|
+
}
|
|
829
|
+
r2.pc = t2;
|
|
830
|
+
break;
|
|
831
|
+
}
|
|
832
|
+
case n$1.JUMP_IF_FALSE: {
|
|
833
|
+
const t2 = r2.stack.pop();
|
|
834
|
+
if (t2 === void 0) {
|
|
835
|
+
r2.status = "error", r2.error = "JUMP_IF_FALSE: Stack underflow";
|
|
836
|
+
break;
|
|
837
|
+
}
|
|
838
|
+
if (i2.arg === void 0) {
|
|
839
|
+
r2.status = "error", r2.error = "JUMP_IF_FALSE requires a target address";
|
|
840
|
+
break;
|
|
841
|
+
}
|
|
842
|
+
const e = i2.arg;
|
|
843
|
+
if (e < 0 || e >= a2.length) {
|
|
844
|
+
r2.status = "error", r2.error = `Invalid jump target: ${e}`;
|
|
845
|
+
break;
|
|
846
|
+
}
|
|
847
|
+
c(t2) ? r2.pc++ : r2.pc = e;
|
|
848
|
+
break;
|
|
849
|
+
}
|
|
850
|
+
case n$1.ITER_START: {
|
|
851
|
+
if (r2.stack.length === 0) {
|
|
852
|
+
r2.status = "error", r2.error = "ITER_START: Stack underflow";
|
|
853
|
+
break;
|
|
854
|
+
}
|
|
855
|
+
const t2 = r2.stack.pop();
|
|
856
|
+
if (t2 == null) {
|
|
857
|
+
r2.status = "error", r2.error = "TypeError: Cannot iterate over null or undefined";
|
|
858
|
+
break;
|
|
859
|
+
}
|
|
860
|
+
if (!o$1(t2)) {
|
|
861
|
+
r2.status = "error", r2.error = "TypeError: Cannot iterate over non-array value";
|
|
862
|
+
break;
|
|
863
|
+
}
|
|
864
|
+
if (r2.iterators.length >= 10) {
|
|
865
|
+
r2.status = "error", r2.error = "RuntimeError: Maximum iterator depth exceeded";
|
|
866
|
+
break;
|
|
867
|
+
}
|
|
868
|
+
const e = s([...t2.elements]);
|
|
869
|
+
r2.iterators.push({
|
|
870
|
+
array: e,
|
|
871
|
+
index: 0
|
|
872
|
+
}), r2.pc++;
|
|
873
|
+
break;
|
|
874
|
+
}
|
|
875
|
+
case n$1.ITER_NEXT: {
|
|
876
|
+
if (r2.iterators.length === 0) {
|
|
877
|
+
r2.status = "error", r2.error = "ITER_NEXT: No active iterator";
|
|
878
|
+
break;
|
|
879
|
+
}
|
|
880
|
+
const t2 = r2.iterators[r2.iterators.length - 1];
|
|
881
|
+
t2.index < t2.array.elements.length ? (r2.stack.push(t2.array.elements[t2.index]), r2.stack.push(true), t2.index++) : (r2.stack.push(null), r2.stack.push(false)), r2.pc++;
|
|
882
|
+
break;
|
|
883
|
+
}
|
|
884
|
+
case n$1.ITER_END: {
|
|
885
|
+
if (r2.iterators.length === 0) {
|
|
886
|
+
r2.status = "error", r2.error = "ITER_END: No active iterator";
|
|
887
|
+
break;
|
|
888
|
+
}
|
|
889
|
+
r2.iterators.pop(), r2.pc++;
|
|
890
|
+
break;
|
|
891
|
+
}
|
|
892
|
+
// Logical operators
|
|
893
|
+
case n$1.AND: {
|
|
894
|
+
const t2 = r2.stack.pop(), e = r2.stack.pop();
|
|
895
|
+
if (e === void 0 || t2 === void 0) {
|
|
896
|
+
r2.status = "error", r2.error = "AND: Stack underflow";
|
|
897
|
+
break;
|
|
898
|
+
}
|
|
899
|
+
c(e) ? r2.stack.push(t2) : r2.stack.push(e), r2.pc++;
|
|
900
|
+
break;
|
|
901
|
+
}
|
|
902
|
+
case n$1.OR: {
|
|
903
|
+
const t2 = r2.stack.pop(), e = r2.stack.pop();
|
|
904
|
+
if (e === void 0 || t2 === void 0) {
|
|
905
|
+
r2.status = "error", r2.error = "OR: Stack underflow";
|
|
906
|
+
break;
|
|
907
|
+
}
|
|
908
|
+
c(e) ? r2.stack.push(e) : r2.stack.push(t2), r2.pc++;
|
|
909
|
+
break;
|
|
910
|
+
}
|
|
911
|
+
case n$1.NOT: {
|
|
912
|
+
const t2 = r2.stack.pop();
|
|
913
|
+
if (t2 === void 0) {
|
|
914
|
+
r2.status = "error", r2.error = "NOT: Stack underflow";
|
|
915
|
+
break;
|
|
916
|
+
}
|
|
917
|
+
r2.stack.push(!c(t2)), r2.pc++;
|
|
918
|
+
break;
|
|
919
|
+
}
|
|
920
|
+
case n$1.RETURN: {
|
|
921
|
+
const t2 = r2.stack.pop() ?? null;
|
|
922
|
+
r2.returnValue = t2, r2.status = "complete";
|
|
923
|
+
break;
|
|
924
|
+
}
|
|
925
|
+
default:
|
|
926
|
+
r2.status = "error", r2.error = `Unknown opcode: ${i2.op} (type: ${typeof i2.op})`;
|
|
927
|
+
}
|
|
928
|
+
}
|
|
929
|
+
return r2;
|
|
930
|
+
}
|
|
931
|
+
resume(a2, s2, r2) {
|
|
932
|
+
if (a2.status !== "waiting_cc")
|
|
933
|
+
throw new Error("Cannot resume: VM not waiting for CC");
|
|
934
|
+
const i2 = {
|
|
935
|
+
...a2,
|
|
936
|
+
stack: [...a2.stack, s2],
|
|
937
|
+
status: "running",
|
|
938
|
+
ccPrompt: void 0,
|
|
939
|
+
pc: a2.pc + 1
|
|
940
|
+
};
|
|
941
|
+
return this.execute(r2, i2);
|
|
942
|
+
}
|
|
943
|
+
}
|
|
944
|
+
class L {
|
|
945
|
+
constructor(a2) {
|
|
946
|
+
v$1(this, "vms", /* @__PURE__ */ new Map());
|
|
947
|
+
v$1(this, "storage");
|
|
948
|
+
a2 ? this.storage = a2 : this.storage = g.create();
|
|
949
|
+
}
|
|
950
|
+
/**
|
|
951
|
+
* Initialize the VMManager (connect to database)
|
|
952
|
+
*/
|
|
953
|
+
async initialize() {
|
|
954
|
+
await this.storage.connect();
|
|
955
|
+
}
|
|
956
|
+
/**
|
|
957
|
+
* Cleanup resources
|
|
958
|
+
*/
|
|
959
|
+
async dispose() {
|
|
960
|
+
await this.storage.disconnect(), this.vms.clear();
|
|
961
|
+
}
|
|
962
|
+
/**
|
|
963
|
+
* Load and compile a program from source code
|
|
964
|
+
*/
|
|
965
|
+
async loadProgram(a2, s2) {
|
|
966
|
+
const r2 = k(s2);
|
|
967
|
+
if (!r2.success)
|
|
968
|
+
throw new Error(`Compilation failed: ${r2.errors.join(", ")}`);
|
|
969
|
+
const i2 = {
|
|
970
|
+
id: a2,
|
|
971
|
+
name: a2,
|
|
972
|
+
source: s2,
|
|
973
|
+
bytecode: r2.bytecode,
|
|
974
|
+
// VM decides internal format
|
|
975
|
+
created: /* @__PURE__ */ new Date()
|
|
976
|
+
};
|
|
977
|
+
await this.storage.saveProgram(i2);
|
|
978
|
+
}
|
|
979
|
+
/**
|
|
980
|
+
* Start execution of a loaded program
|
|
981
|
+
*/
|
|
982
|
+
async startExecution(a2, s2) {
|
|
983
|
+
if (!await this.storage.getProgram(a2))
|
|
984
|
+
throw new Error(`Program not found: ${a2}`);
|
|
985
|
+
const i2 = {
|
|
986
|
+
id: s2,
|
|
987
|
+
programId: a2,
|
|
988
|
+
state: "READY",
|
|
989
|
+
pc: 0,
|
|
990
|
+
stack: [],
|
|
991
|
+
variables: {},
|
|
992
|
+
created: /* @__PURE__ */ new Date()
|
|
993
|
+
};
|
|
994
|
+
await this.storage.saveExecution(i2);
|
|
995
|
+
const f2 = new E();
|
|
996
|
+
this.vms.set(s2, f2);
|
|
997
|
+
}
|
|
998
|
+
/**
|
|
999
|
+
* Get next action from execution (Claude polls this)
|
|
1000
|
+
* This is READ-ONLY - just returns current state
|
|
1001
|
+
*/
|
|
1002
|
+
async getNext(a2) {
|
|
1003
|
+
const s2 = await this.storage.getExecution(a2);
|
|
1004
|
+
if (!s2)
|
|
1005
|
+
throw new Error(`Execution not found: ${a2}`);
|
|
1006
|
+
if (s2.state === "READY") {
|
|
1007
|
+
const r2 = await this.storage.getProgram(s2.programId);
|
|
1008
|
+
if (!r2)
|
|
1009
|
+
throw new Error(`Program not found: ${s2.programId}`);
|
|
1010
|
+
let i2 = this.vms.get(a2);
|
|
1011
|
+
i2 || (i2 = new E(), this.vms.set(a2, i2));
|
|
1012
|
+
const f2 = {
|
|
1013
|
+
pc: 0,
|
|
1014
|
+
stack: [],
|
|
1015
|
+
variables: /* @__PURE__ */ new Map(),
|
|
1016
|
+
output: []
|
|
1017
|
+
}, u2 = i2.execute(r2.bytecode, f2);
|
|
1018
|
+
if (u2.output.length > 0 && await this.storage.appendOutput(a2, u2.output), s2.pc = u2.pc, s2.stack = u2.stack, s2.variables = Object.fromEntries(u2.variables), u2.status === "complete")
|
|
1019
|
+
return s2.state = "COMPLETED", u2.returnValue !== void 0 && (s2.returnValue = u2.returnValue), await this.storage.saveExecution(s2), this.vms.delete(a2), {
|
|
1020
|
+
type: "completed",
|
|
1021
|
+
message: "Execution completed",
|
|
1022
|
+
result: u2.returnValue
|
|
1023
|
+
};
|
|
1024
|
+
if (u2.status === "waiting_cc")
|
|
1025
|
+
return s2.state = "AWAITING_COGNITIVE_RESULT", s2.ccPrompt = u2.ccPrompt, await this.storage.saveExecution(s2), {
|
|
1026
|
+
type: "waiting",
|
|
1027
|
+
message: u2.ccPrompt || "Waiting for input"
|
|
1028
|
+
};
|
|
1029
|
+
if (u2.status === "error")
|
|
1030
|
+
return s2.state = "ERROR", s2.error = u2.error, await this.storage.saveExecution(s2), this.vms.delete(a2), {
|
|
1031
|
+
type: "error",
|
|
1032
|
+
error: u2.error
|
|
1033
|
+
};
|
|
1034
|
+
}
|
|
1035
|
+
if (s2.state === "COMPLETED")
|
|
1036
|
+
return {
|
|
1037
|
+
type: "completed",
|
|
1038
|
+
message: "Execution completed"
|
|
1039
|
+
};
|
|
1040
|
+
if (s2.state === "ERROR")
|
|
1041
|
+
return {
|
|
1042
|
+
type: "error",
|
|
1043
|
+
error: s2.error || "Unknown error"
|
|
1044
|
+
};
|
|
1045
|
+
if (s2.state === "AWAITING_COGNITIVE_RESULT")
|
|
1046
|
+
return {
|
|
1047
|
+
type: "waiting",
|
|
1048
|
+
message: s2.ccPrompt || "Waiting for input"
|
|
1049
|
+
};
|
|
1050
|
+
throw new Error(`Unexpected execution state: ${s2.state}`);
|
|
1051
|
+
}
|
|
1052
|
+
/**
|
|
1053
|
+
* Report result from cognitive operation and continue execution
|
|
1054
|
+
*/
|
|
1055
|
+
async reportCCResult(a2, s2) {
|
|
1056
|
+
const r2 = await this.storage.getExecution(a2);
|
|
1057
|
+
if (!r2)
|
|
1058
|
+
throw new Error(`Execution not found: ${a2}`);
|
|
1059
|
+
const i2 = await this.storage.getProgram(r2.programId);
|
|
1060
|
+
if (!i2)
|
|
1061
|
+
throw new Error(`Program not found: ${r2.programId}`);
|
|
1062
|
+
let f2 = this.vms.get(a2);
|
|
1063
|
+
f2 || (f2 = new E(), this.vms.set(a2, f2));
|
|
1064
|
+
const u2 = {
|
|
1065
|
+
pc: r2.pc,
|
|
1066
|
+
stack: r2.stack,
|
|
1067
|
+
variables: new Map(Object.entries(r2.variables)),
|
|
1068
|
+
status: "waiting_cc",
|
|
1069
|
+
output: [],
|
|
1070
|
+
// Start with empty output for resumed execution
|
|
1071
|
+
ccPrompt: void 0,
|
|
1072
|
+
iterators: []
|
|
1073
|
+
// TODO: persist iterators in future
|
|
1074
|
+
}, k2 = f2.resume(u2, s2, i2.bytecode);
|
|
1075
|
+
k2.output.length > 0 && await this.storage.appendOutput(a2, k2.output), r2.pc = k2.pc, r2.stack = k2.stack, r2.variables = Object.fromEntries(k2.variables), k2.status === "complete" ? (r2.state = "COMPLETED", k2.returnValue !== void 0 && (r2.returnValue = k2.returnValue), this.vms.delete(a2)) : k2.status === "error" ? (r2.state = "ERROR", r2.error = k2.error, this.vms.delete(a2)) : k2.status === "waiting_cc" ? (r2.state = "AWAITING_COGNITIVE_RESULT", r2.ccPrompt = k2.ccPrompt) : r2.state = "RUNNING", await this.storage.saveExecution(r2);
|
|
1076
|
+
}
|
|
1077
|
+
/**
|
|
1078
|
+
* Get current execution status
|
|
1079
|
+
*/
|
|
1080
|
+
async getExecutionStatus(a2) {
|
|
1081
|
+
const s2 = await this.storage.getExecution(a2);
|
|
1082
|
+
if (!s2)
|
|
1083
|
+
throw new Error(`Execution not found: ${a2}`);
|
|
1084
|
+
return {
|
|
1085
|
+
id: s2.id,
|
|
1086
|
+
state: s2.state,
|
|
1087
|
+
pc: s2.pc,
|
|
1088
|
+
stack: s2.stack,
|
|
1089
|
+
variables: s2.variables
|
|
1090
|
+
};
|
|
1091
|
+
}
|
|
1092
|
+
/**
|
|
1093
|
+
* Get output for an execution
|
|
1094
|
+
*/
|
|
1095
|
+
async getExecutionOutput(a2) {
|
|
1096
|
+
return await this.storage.getOutput(a2);
|
|
1097
|
+
}
|
|
1098
|
+
}
|
|
1099
|
+
var i = Object.defineProperty;
|
|
1100
|
+
var a = (s2, r2, t2) => r2 in s2 ? i(s2, r2, { enumerable: true, configurable: true, writable: true, value: t2 }) : s2[r2] = t2;
|
|
1101
|
+
var o = (s2, r2, t2) => a(s2, typeof r2 != "symbol" ? r2 + "" : r2, t2);
|
|
1102
|
+
class v {
|
|
1103
|
+
constructor(r2 = "0.0.1") {
|
|
1104
|
+
o(this, "server");
|
|
1105
|
+
o(this, "transport", null);
|
|
1106
|
+
o(this, "vmManager");
|
|
1107
|
+
o(this, "version");
|
|
1108
|
+
this.version = r2, this.vmManager = new L(), this.server = new mcp_js.McpServer({
|
|
1109
|
+
name: "cvm-server",
|
|
1110
|
+
version: this.version
|
|
1111
|
+
}), this.setupTools();
|
|
1112
|
+
}
|
|
1113
|
+
getName() {
|
|
1114
|
+
return "cvm-server";
|
|
1115
|
+
}
|
|
1116
|
+
getVersion() {
|
|
1117
|
+
return this.version;
|
|
1118
|
+
}
|
|
1119
|
+
setupTools() {
|
|
1120
|
+
this.server.tool(
|
|
1121
|
+
"load",
|
|
1122
|
+
{
|
|
1123
|
+
programId: zod.z.string(),
|
|
1124
|
+
source: zod.z.string()
|
|
1125
|
+
},
|
|
1126
|
+
async ({ programId: r2, source: t2 }) => {
|
|
1127
|
+
try {
|
|
1128
|
+
return await this.vmManager.loadProgram(r2, t2), {
|
|
1129
|
+
content: [{ type: "text", text: `Program loaded successfully: ${r2}` }]
|
|
1130
|
+
};
|
|
1131
|
+
} catch (e) {
|
|
1132
|
+
return {
|
|
1133
|
+
content: [{ type: "text", text: `Error: ${e instanceof Error ? e.message : "Unknown error"}` }],
|
|
1134
|
+
isError: true
|
|
1135
|
+
};
|
|
1136
|
+
}
|
|
1137
|
+
}
|
|
1138
|
+
), this.server.tool(
|
|
1139
|
+
"start",
|
|
1140
|
+
{
|
|
1141
|
+
programId: zod.z.string(),
|
|
1142
|
+
executionId: zod.z.string()
|
|
1143
|
+
},
|
|
1144
|
+
async ({ programId: r2, executionId: t2 }) => {
|
|
1145
|
+
try {
|
|
1146
|
+
return await this.vmManager.startExecution(r2, t2), {
|
|
1147
|
+
content: [{ type: "text", text: `Execution started: ${t2}` }]
|
|
1148
|
+
};
|
|
1149
|
+
} catch (e) {
|
|
1150
|
+
return {
|
|
1151
|
+
content: [{ type: "text", text: `Error: ${e instanceof Error ? e.message : "Unknown error"}` }],
|
|
1152
|
+
isError: true
|
|
1153
|
+
};
|
|
1154
|
+
}
|
|
1155
|
+
}
|
|
1156
|
+
), this.server.tool(
|
|
1157
|
+
"getTask",
|
|
1158
|
+
{
|
|
1159
|
+
executionId: zod.z.string()
|
|
1160
|
+
},
|
|
1161
|
+
async ({ executionId: r2 }) => {
|
|
1162
|
+
try {
|
|
1163
|
+
const t2 = await this.vmManager.getNext(r2);
|
|
1164
|
+
return t2.type === "completed" ? {
|
|
1165
|
+
content: [{ type: "text", text: t2.result !== void 0 ? `Execution completed with result: ${JSON.stringify(t2.result)}` : "Execution completed" }]
|
|
1166
|
+
} : t2.type === "waiting" ? {
|
|
1167
|
+
content: [{ type: "text", text: t2.message || "Waiting for input" }]
|
|
1168
|
+
} : t2.type === "error" ? {
|
|
1169
|
+
content: [{ type: "text", text: `Error: ${t2.error}` }],
|
|
1170
|
+
isError: true
|
|
1171
|
+
} : {
|
|
1172
|
+
content: [{ type: "text", text: "Unexpected state" }],
|
|
1173
|
+
isError: true
|
|
1174
|
+
};
|
|
1175
|
+
} catch (t2) {
|
|
1176
|
+
return {
|
|
1177
|
+
content: [{ type: "text", text: `Error: ${t2 instanceof Error ? t2.message : "Unknown error"}` }],
|
|
1178
|
+
isError: true
|
|
1179
|
+
};
|
|
1180
|
+
}
|
|
1181
|
+
}
|
|
1182
|
+
), this.server.tool(
|
|
1183
|
+
"submitTask",
|
|
1184
|
+
{
|
|
1185
|
+
executionId: zod.z.string(),
|
|
1186
|
+
result: zod.z.string()
|
|
1187
|
+
},
|
|
1188
|
+
async ({ executionId: r2, result: t2 }) => {
|
|
1189
|
+
try {
|
|
1190
|
+
return await this.vmManager.reportCCResult(r2, t2), {
|
|
1191
|
+
content: [{ type: "text", text: "Execution resumed" }]
|
|
1192
|
+
};
|
|
1193
|
+
} catch (e) {
|
|
1194
|
+
return {
|
|
1195
|
+
content: [{ type: "text", text: `Error: ${e instanceof Error ? e.message : "Unknown error"}` }],
|
|
1196
|
+
isError: true
|
|
1197
|
+
};
|
|
1198
|
+
}
|
|
1199
|
+
}
|
|
1200
|
+
), this.server.tool(
|
|
1201
|
+
"status",
|
|
1202
|
+
{
|
|
1203
|
+
executionId: zod.z.string()
|
|
1204
|
+
},
|
|
1205
|
+
async ({ executionId: r2 }) => {
|
|
1206
|
+
try {
|
|
1207
|
+
const t2 = await this.vmManager.getExecutionStatus(r2);
|
|
1208
|
+
return {
|
|
1209
|
+
content: [{ type: "text", text: JSON.stringify(t2, null, 2) }]
|
|
1210
|
+
};
|
|
1211
|
+
} catch (t2) {
|
|
1212
|
+
return {
|
|
1213
|
+
content: [{ type: "text", text: `Error: ${t2 instanceof Error ? t2.message : "Unknown error"}` }],
|
|
1214
|
+
isError: true
|
|
1215
|
+
};
|
|
1216
|
+
}
|
|
1217
|
+
}
|
|
1218
|
+
);
|
|
1219
|
+
}
|
|
1220
|
+
async start(r2) {
|
|
1221
|
+
await this.vmManager.initialize(), this.transport = r2 || new stdio_js.StdioServerTransport(), await this.server.connect(this.transport);
|
|
1222
|
+
}
|
|
1223
|
+
async stop() {
|
|
1224
|
+
this.transport && (await this.transport.close(), this.transport = null), await this.vmManager.dispose();
|
|
1225
|
+
}
|
|
1226
|
+
// For testing - expose VMManager for direct testing
|
|
1227
|
+
getVMManager() {
|
|
1228
|
+
return this.vmManager;
|
|
1229
|
+
}
|
|
1230
|
+
}
|
|
1231
|
+
dotenv__namespace.config({ path: c$1.resolve(__dirname, "../../../.env") });
|
|
1232
|
+
function loadConfig() {
|
|
1233
|
+
const env = process.env.NODE_ENV || "development";
|
|
1234
|
+
const storageType = process.env.CVM_STORAGE_TYPE || "file";
|
|
1235
|
+
const mongoUri = process.env.MONGODB_URI;
|
|
1236
|
+
const dataDir = process.env.CVM_DATA_DIR;
|
|
1237
|
+
if (storageType === "mongodb" && !mongoUri) {
|
|
1238
|
+
throw new Error("MONGODB_URI environment variable is required when CVM_STORAGE_TYPE is mongodb");
|
|
1239
|
+
}
|
|
1240
|
+
const logLevel = process.env.CVM_LOG_LEVEL || "info";
|
|
1241
|
+
const validLogLevels = ["debug", "info", "warn", "error"];
|
|
1242
|
+
if (!validLogLevels.includes(logLevel)) {
|
|
1243
|
+
throw new Error(`Invalid CVM_LOG_LEVEL: ${logLevel}. Must be one of: ${validLogLevels.join(", ")}`);
|
|
1244
|
+
}
|
|
1245
|
+
const maxExecutionTime = parseInt(process.env.CVM_MAX_EXECUTION_TIME || "300000", 10);
|
|
1246
|
+
const maxStackSize = parseInt(process.env.CVM_MAX_STACK_SIZE || "1000", 10);
|
|
1247
|
+
const maxOutputSize = parseInt(process.env.CVM_MAX_OUTPUT_SIZE || "1048576", 10);
|
|
1248
|
+
return {
|
|
1249
|
+
storage: {
|
|
1250
|
+
type: storageType,
|
|
1251
|
+
mongoUri,
|
|
1252
|
+
dataDir
|
|
1253
|
+
},
|
|
1254
|
+
logging: {
|
|
1255
|
+
level: logLevel
|
|
1256
|
+
},
|
|
1257
|
+
execution: {
|
|
1258
|
+
maxExecutionTime,
|
|
1259
|
+
maxStackSize,
|
|
1260
|
+
maxOutputSize
|
|
1261
|
+
},
|
|
1262
|
+
env
|
|
1263
|
+
};
|
|
1264
|
+
}
|
|
1265
|
+
const LOG_LEVELS = {
|
|
1266
|
+
debug: 0,
|
|
1267
|
+
info: 1,
|
|
1268
|
+
warn: 2,
|
|
1269
|
+
error: 3
|
|
1270
|
+
};
|
|
1271
|
+
class Logger {
|
|
1272
|
+
levelValue;
|
|
1273
|
+
constructor(level) {
|
|
1274
|
+
this.levelValue = LOG_LEVELS[level];
|
|
1275
|
+
}
|
|
1276
|
+
log(level, message, ...args) {
|
|
1277
|
+
if (LOG_LEVELS[level] >= this.levelValue) {
|
|
1278
|
+
const timestamp = (/* @__PURE__ */ new Date()).toISOString();
|
|
1279
|
+
const prefix = `[${timestamp}] [${level.toUpperCase()}]`;
|
|
1280
|
+
if (args.length > 0) {
|
|
1281
|
+
console.error(prefix, message, ...args);
|
|
1282
|
+
} else {
|
|
1283
|
+
console.error(prefix, message);
|
|
1284
|
+
}
|
|
1285
|
+
}
|
|
1286
|
+
}
|
|
1287
|
+
debug(message, ...args) {
|
|
1288
|
+
this.log("debug", message, ...args);
|
|
1289
|
+
}
|
|
1290
|
+
info(message, ...args) {
|
|
1291
|
+
this.log("info", message, ...args);
|
|
1292
|
+
}
|
|
1293
|
+
warn(message, ...args) {
|
|
1294
|
+
this.log("warn", message, ...args);
|
|
1295
|
+
}
|
|
1296
|
+
error(message, ...args) {
|
|
1297
|
+
this.log("error", message, ...args);
|
|
1298
|
+
}
|
|
1299
|
+
}
|
|
1300
|
+
let logger;
|
|
1301
|
+
function initLogger(level) {
|
|
1302
|
+
logger = new Logger(level);
|
|
1303
|
+
return logger;
|
|
1304
|
+
}
|
|
1305
|
+
function getLogger() {
|
|
1306
|
+
if (!logger) {
|
|
1307
|
+
throw new Error("Logger not initialized. Call initLogger() first.");
|
|
1308
|
+
}
|
|
1309
|
+
return logger;
|
|
1310
|
+
}
|
|
1311
|
+
const __filename$1 = url.fileURLToPath(typeof document === "undefined" ? require("url").pathToFileURL(__filename).href : _documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === "SCRIPT" && _documentCurrentScript.src || new URL("main.cjs", document.baseURI).href);
|
|
1312
|
+
const __dirname$1 = c$1.dirname(__filename$1);
|
|
1313
|
+
async function main() {
|
|
1314
|
+
let cvmServer;
|
|
1315
|
+
try {
|
|
1316
|
+
const config = loadConfig();
|
|
1317
|
+
initLogger(config.logging.level);
|
|
1318
|
+
const logger2 = getLogger();
|
|
1319
|
+
let version = "0.4.3";
|
|
1320
|
+
const possiblePaths = [
|
|
1321
|
+
c$1.join(__dirname$1, "..", "package.json"),
|
|
1322
|
+
// Development
|
|
1323
|
+
c$1.join(__dirname$1, "package.json"),
|
|
1324
|
+
// Bundled dist
|
|
1325
|
+
c$1.join(process.cwd(), "package.json")
|
|
1326
|
+
// Current directory
|
|
1327
|
+
];
|
|
1328
|
+
for (const packageJsonPath of possiblePaths) {
|
|
1329
|
+
try {
|
|
1330
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
|
|
1331
|
+
if (packageJson.name === "cvm-server" && packageJson.version) {
|
|
1332
|
+
version = packageJson.version;
|
|
1333
|
+
break;
|
|
1334
|
+
}
|
|
1335
|
+
} catch (e) {
|
|
1336
|
+
}
|
|
1337
|
+
}
|
|
1338
|
+
logger2.info("Starting CVM Server...", {
|
|
1339
|
+
env: config.env,
|
|
1340
|
+
logLevel: config.logging.level,
|
|
1341
|
+
version
|
|
1342
|
+
});
|
|
1343
|
+
if (config.storage.type === "file") {
|
|
1344
|
+
const dataDir = config.storage.dataDir || ".cvm";
|
|
1345
|
+
const fullPath = c$1.resolve(process.cwd(), dataDir);
|
|
1346
|
+
logger2.info(`[CVM] Initializing file storage in: ${fullPath}`);
|
|
1347
|
+
logger2.warn(`[CVM] ⚠️ Remember to add '${dataDir}/' to your .gitignore file!`);
|
|
1348
|
+
} else {
|
|
1349
|
+
logger2.info("[CVM] Using MongoDB storage");
|
|
1350
|
+
}
|
|
1351
|
+
cvmServer = new v(version);
|
|
1352
|
+
await cvmServer.start();
|
|
1353
|
+
logger2.info("CVM Server is running and ready to accept MCP connections");
|
|
1354
|
+
process.on("SIGINT", async () => {
|
|
1355
|
+
logger2.info("Received SIGINT, shutting down gracefully...");
|
|
1356
|
+
await shutdown();
|
|
1357
|
+
});
|
|
1358
|
+
process.on("SIGTERM", async () => {
|
|
1359
|
+
logger2.info("Received SIGTERM, shutting down gracefully...");
|
|
1360
|
+
await shutdown();
|
|
1361
|
+
});
|
|
1362
|
+
} catch (error) {
|
|
1363
|
+
console.error("Fatal error starting CVM Server:", error);
|
|
1364
|
+
process.exit(1);
|
|
1365
|
+
}
|
|
1366
|
+
async function shutdown() {
|
|
1367
|
+
const logger2 = getLogger();
|
|
1368
|
+
try {
|
|
1369
|
+
logger2.info("Closing connections...");
|
|
1370
|
+
if (cvmServer) {
|
|
1371
|
+
await cvmServer.stop();
|
|
1372
|
+
}
|
|
1373
|
+
logger2.info("Shutdown complete");
|
|
1374
|
+
process.exit(0);
|
|
1375
|
+
} catch (error) {
|
|
1376
|
+
logger2.error("Error during shutdown:", error);
|
|
1377
|
+
process.exit(1);
|
|
1378
|
+
}
|
|
1379
|
+
}
|
|
1380
|
+
}
|
|
1381
|
+
main().catch((error) => {
|
|
1382
|
+
console.error("Unhandled error:", error);
|
|
1383
|
+
process.exit(1);
|
|
1384
|
+
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cvm-server",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.3",
|
|
4
4
|
"description": "Cognitive Virtual Machine (CVM) - A deterministic bytecode VM with AI cognitive operations",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"mcp",
|
|
@@ -39,10 +39,10 @@
|
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
41
|
"@modelcontextprotocol/sdk": "^1.12.2",
|
|
42
|
-
"zod": "^3.25.64",
|
|
43
|
-
"mongodb": "^6.17.0",
|
|
44
42
|
"dotenv": "^16.0.0",
|
|
45
|
-
"
|
|
43
|
+
"mongodb": "^6.17.0",
|
|
44
|
+
"typescript": "^5.7.3",
|
|
45
|
+
"zod": "^3.25.64"
|
|
46
46
|
},
|
|
47
47
|
"type": "module",
|
|
48
48
|
"nx": {
|
|
@@ -95,7 +95,7 @@
|
|
|
95
95
|
],
|
|
96
96
|
"options": {
|
|
97
97
|
"commands": [
|
|
98
|
-
"cd apps/cvm-server/dist && npm publish"
|
|
98
|
+
"cd apps/cvm-server/dist && npm publish --otp={args.otp}"
|
|
99
99
|
]
|
|
100
100
|
}
|
|
101
101
|
},
|
|
@@ -111,4 +111,4 @@
|
|
|
111
111
|
}
|
|
112
112
|
}
|
|
113
113
|
}
|
|
114
|
-
}
|
|
114
|
+
}
|