@zackbart/connecta 0.7.1 → 0.7.4
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/CHANGELOG.md +122 -0
- package/README.md +5 -2
- package/dist/connector-scope.d.ts +7 -4
- package/dist/connector-scope.d.ts.map +1 -1
- package/dist/connector-scope.js +36 -16
- package/dist/connector-scope.js.map +1 -1
- package/dist/connectors/remote-mcp.d.ts.map +1 -1
- package/dist/connectors/remote-mcp.js +164 -95
- package/dist/connectors/remote-mcp.js.map +1 -1
- package/dist/credential-health.d.ts +11 -7
- package/dist/credential-health.d.ts.map +1 -1
- package/dist/credential-health.js +26 -19
- package/dist/credential-health.js.map +1 -1
- package/dist/execute.d.ts +3 -0
- package/dist/execute.d.ts.map +1 -1
- package/dist/execute.js +70 -29
- package/dist/execute.js.map +1 -1
- package/dist/executor-admission.d.ts +53 -0
- package/dist/executor-admission.d.ts.map +1 -0
- package/dist/executor-admission.js +151 -0
- package/dist/executor-admission.js.map +1 -0
- package/dist/executor-result.d.ts +13 -0
- package/dist/executor-result.d.ts.map +1 -0
- package/dist/executor-result.js +57 -0
- package/dist/executor-result.js.map +1 -0
- package/dist/executors/quickjs-child.d.ts +2 -0
- package/dist/executors/quickjs-child.d.ts.map +1 -0
- package/dist/executors/quickjs-child.js +131 -0
- package/dist/executors/quickjs-child.js.map +1 -0
- package/dist/executors/quickjs-protocol.d.ts +55 -0
- package/dist/executors/quickjs-protocol.d.ts.map +1 -0
- package/dist/executors/quickjs-protocol.js +22 -0
- package/dist/executors/quickjs-protocol.js.map +1 -0
- package/dist/executors/quickjs-runtime.d.ts +26 -0
- package/dist/executors/quickjs-runtime.d.ts.map +1 -0
- package/dist/executors/quickjs-runtime.js +383 -0
- package/dist/executors/quickjs-runtime.js.map +1 -0
- package/dist/executors/quickjs.d.ts +20 -15
- package/dist/executors/quickjs.d.ts.map +1 -1
- package/dist/executors/quickjs.js +465 -265
- package/dist/executors/quickjs.js.map +1 -1
- package/dist/index.d.ts +15 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/meta-tools.d.ts +4 -0
- package/dist/meta-tools.d.ts.map +1 -1
- package/dist/meta-tools.js +49 -12
- package/dist/meta-tools.js.map +1 -1
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +36 -3
- package/dist/node.js.map +1 -1
- package/dist/registry.d.ts +21 -24
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +37 -25
- package/dist/registry.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +19 -9
- package/dist/server.js.map +1 -1
- package/dist/timeout.d.ts +9 -4
- package/dist/timeout.d.ts.map +1 -1
- package/dist/timeout.js +34 -4
- package/dist/timeout.js.map +1 -1
- package/dist/toolkits.d.ts +8 -0
- package/dist/toolkits.d.ts.map +1 -1
- package/dist/toolkits.js +3 -0
- package/dist/toolkits.js.map +1 -1
- package/dist/types.d.ts +19 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/ui.d.ts +13 -1
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +188 -7
- package/dist/ui.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/src/connector-scope.ts +43 -18
- package/src/connectors/remote-mcp.ts +184 -102
- package/src/credential-health.ts +33 -17
- package/src/execute.ts +93 -35
- package/src/executor-admission.ts +229 -0
- package/src/executor-result.ts +63 -0
- package/src/executors/quickjs-child.ts +168 -0
- package/src/executors/quickjs-protocol.ts +77 -0
- package/src/executors/quickjs-runtime.ts +440 -0
- package/src/executors/quickjs.ts +669 -302
- package/src/index.ts +30 -5
- package/src/meta-tools.ts +84 -27
- package/src/node.ts +36 -2
- package/src/registry.ts +53 -22
- package/src/server.ts +21 -10
- package/src/timeout.ts +41 -4
- package/src/toolkits.ts +11 -0
- package/src/types.ts +19 -2
- package/src/ui.ts +218 -12
- package/src/version.ts +1 -1
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A stable, machine-readable admission failure. Overload is retryable; caller
|
|
3
|
+
* cancellation and shutdown are terminal for this invocation.
|
|
4
|
+
*/
|
|
5
|
+
export class ExecutorAdmissionError extends Error {
|
|
6
|
+
code;
|
|
7
|
+
retryable;
|
|
8
|
+
retryAfterMs;
|
|
9
|
+
constructor(code, message, opts = {}) {
|
|
10
|
+
super(message);
|
|
11
|
+
this.code = code;
|
|
12
|
+
this.name = "ExecutorAdmissionError";
|
|
13
|
+
this.retryable = code === "executor_overloaded";
|
|
14
|
+
if (opts.retryAfterMs !== undefined &&
|
|
15
|
+
Number.isFinite(opts.retryAfterMs) &&
|
|
16
|
+
opts.retryAfterMs >= 0) {
|
|
17
|
+
this.retryAfterMs = Math.trunc(opts.retryAfterMs);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function positiveWhole(value, name) {
|
|
22
|
+
if (!Number.isFinite(value) || !Number.isInteger(value) || value < 1) {
|
|
23
|
+
throw new TypeError(`${name} must be a positive whole number.`);
|
|
24
|
+
}
|
|
25
|
+
return value;
|
|
26
|
+
}
|
|
27
|
+
function nonNegativeWhole(value, name) {
|
|
28
|
+
if (!Number.isFinite(value) || !Number.isInteger(value) || value < 0) {
|
|
29
|
+
throw new TypeError(`${name} must be a non-negative whole number.`);
|
|
30
|
+
}
|
|
31
|
+
return value;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Runtime-portable bounded admission. It deliberately owns no executor or
|
|
35
|
+
* request state: queued requests retain only a resolver and AbortSignal, while
|
|
36
|
+
* provider catalogs are constructed after the returned lease is granted.
|
|
37
|
+
*/
|
|
38
|
+
export class AdmissionController {
|
|
39
|
+
concurrency;
|
|
40
|
+
maxQueueSize;
|
|
41
|
+
queueTimeoutMs;
|
|
42
|
+
retryAfterMs;
|
|
43
|
+
active = 0;
|
|
44
|
+
closed = false;
|
|
45
|
+
waiters = [];
|
|
46
|
+
constructor(options) {
|
|
47
|
+
this.concurrency = positiveWhole(options.concurrency, "concurrency");
|
|
48
|
+
this.maxQueueSize = nonNegativeWhole(options.maxQueueSize, "maxQueueSize");
|
|
49
|
+
this.queueTimeoutMs = positiveWhole(options.queueTimeoutMs, "queueTimeoutMs");
|
|
50
|
+
this.retryAfterMs = nonNegativeWhole(options.retryAfterMs ?? this.queueTimeoutMs, "retryAfterMs");
|
|
51
|
+
}
|
|
52
|
+
get activeCount() {
|
|
53
|
+
return this.active;
|
|
54
|
+
}
|
|
55
|
+
get queuedCount() {
|
|
56
|
+
return this.waiters.length;
|
|
57
|
+
}
|
|
58
|
+
acquire(options = {}) {
|
|
59
|
+
if (this.closed) {
|
|
60
|
+
return Promise.reject(new ExecutorAdmissionError("executor_closed", "Executor is shutting down."));
|
|
61
|
+
}
|
|
62
|
+
if (options.signal?.aborted) {
|
|
63
|
+
return Promise.reject(new ExecutorAdmissionError("executor_cancelled", "Execution was cancelled before admission."));
|
|
64
|
+
}
|
|
65
|
+
if (this.active < this.concurrency) {
|
|
66
|
+
this.active++;
|
|
67
|
+
return Promise.resolve(this.makeLease());
|
|
68
|
+
}
|
|
69
|
+
if (this.waiters.length >= this.maxQueueSize) {
|
|
70
|
+
return Promise.reject(this.overloaded("Executor queue is full."));
|
|
71
|
+
}
|
|
72
|
+
return new Promise((resolve, reject) => {
|
|
73
|
+
const waiter = {
|
|
74
|
+
resolve,
|
|
75
|
+
reject,
|
|
76
|
+
...(options.signal ? { signal: options.signal } : {}),
|
|
77
|
+
};
|
|
78
|
+
waiter.onAbort = () => {
|
|
79
|
+
if (!this.remove(waiter))
|
|
80
|
+
return;
|
|
81
|
+
this.cleanup(waiter);
|
|
82
|
+
reject(new ExecutorAdmissionError("executor_cancelled", "Execution was cancelled while queued."));
|
|
83
|
+
};
|
|
84
|
+
options.signal?.addEventListener("abort", waiter.onAbort, { once: true });
|
|
85
|
+
waiter.timer = setTimeout(() => {
|
|
86
|
+
if (!this.remove(waiter))
|
|
87
|
+
return;
|
|
88
|
+
this.cleanup(waiter);
|
|
89
|
+
reject(this.overloaded(`Executor admission timed out after ${this.queueTimeoutMs}ms.`));
|
|
90
|
+
}, this.queueTimeoutMs);
|
|
91
|
+
this.waiters.push(waiter);
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
close() {
|
|
95
|
+
if (this.closed)
|
|
96
|
+
return;
|
|
97
|
+
this.closed = true;
|
|
98
|
+
for (const waiter of this.waiters.splice(0)) {
|
|
99
|
+
this.cleanup(waiter);
|
|
100
|
+
waiter.reject(new ExecutorAdmissionError("executor_closed", "Executor is shutting down."));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
overloaded(message) {
|
|
104
|
+
return new ExecutorAdmissionError("executor_overloaded", message, {
|
|
105
|
+
retryAfterMs: this.retryAfterMs,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
makeLease() {
|
|
109
|
+
let released = false;
|
|
110
|
+
return {
|
|
111
|
+
release: () => {
|
|
112
|
+
if (released)
|
|
113
|
+
return;
|
|
114
|
+
released = true;
|
|
115
|
+
this.release();
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
release() {
|
|
120
|
+
if (this.active > 0)
|
|
121
|
+
this.active--;
|
|
122
|
+
if (this.closed)
|
|
123
|
+
return;
|
|
124
|
+
const waiter = this.waiters.shift();
|
|
125
|
+
if (!waiter)
|
|
126
|
+
return;
|
|
127
|
+
this.cleanup(waiter);
|
|
128
|
+
this.active++;
|
|
129
|
+
waiter.resolve(this.makeLease());
|
|
130
|
+
}
|
|
131
|
+
remove(waiter) {
|
|
132
|
+
const index = this.waiters.indexOf(waiter);
|
|
133
|
+
if (index < 0)
|
|
134
|
+
return false;
|
|
135
|
+
this.waiters.splice(index, 1);
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
cleanup(waiter) {
|
|
139
|
+
if (waiter.timer !== undefined)
|
|
140
|
+
clearTimeout(waiter.timer);
|
|
141
|
+
if (waiter.onAbort) {
|
|
142
|
+
waiter.signal?.removeEventListener("abort", waiter.onAbort);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/** Preserve the one-method Workers seam while recognizing richer Node executors. */
|
|
147
|
+
export function isAdmittingExecutor(executor) {
|
|
148
|
+
return ("acquire" in executor &&
|
|
149
|
+
typeof executor.acquire === "function");
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=executor-admission.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor-admission.js","sourceRoot":"","sources":["../src/executor-admission.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ExecuteResult } from "./types.js";
|
|
2
|
+
/** ~6k tokens. Sandbox code should filter data down before returning. */
|
|
3
|
+
export declare const MAX_EXECUTE_RESULT_CHARS = 24000;
|
|
4
|
+
export declare const MAX_EXECUTE_LOG_CHARS = 4000;
|
|
5
|
+
export declare function serializeExecuteValue(value: unknown): string;
|
|
6
|
+
export declare function guardExecuteResultValue(value: unknown): unknown;
|
|
7
|
+
export declare function truncateExecuteText(text: string, max: number): string;
|
|
8
|
+
/**
|
|
9
|
+
* Apply the public execute_code result/log policy before a child result enters
|
|
10
|
+
* IPC. The parent repeats the guard for third-party Executor implementations.
|
|
11
|
+
*/
|
|
12
|
+
export declare function prepareExecuteResultForTransport(outcome: ExecuteResult): ExecuteResult;
|
|
13
|
+
//# sourceMappingURL=executor-result.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor-result.d.ts","sourceRoot":"","sources":["../src/executor-result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,yEAAyE;AACzE,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAC/C,eAAO,MAAM,qBAAqB,OAAQ,CAAC;AAM3C,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAG5D;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAS/D;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGrE;AAED;;;GAGG;AACH,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,aAAa,GACrB,aAAa,CAyBf"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/** ~6k tokens. Sandbox code should filter data down before returning. */
|
|
2
|
+
export const MAX_EXECUTE_RESULT_CHARS = 24_000;
|
|
3
|
+
export const MAX_EXECUTE_LOG_CHARS = 4_000;
|
|
4
|
+
function msg(err) {
|
|
5
|
+
return err instanceof Error ? err.message : String(err);
|
|
6
|
+
}
|
|
7
|
+
export function serializeExecuteValue(value) {
|
|
8
|
+
const serialized = JSON.stringify(value, null, 2);
|
|
9
|
+
return serialized === undefined ? String(value) : serialized;
|
|
10
|
+
}
|
|
11
|
+
export function guardExecuteResultValue(value) {
|
|
12
|
+
const text = serializeExecuteValue(value);
|
|
13
|
+
if (text.length <= MAX_EXECUTE_RESULT_CHARS)
|
|
14
|
+
return value;
|
|
15
|
+
return {
|
|
16
|
+
truncated: true,
|
|
17
|
+
preview: text.slice(0, MAX_EXECUTE_RESULT_CHARS),
|
|
18
|
+
totalChars: text.length,
|
|
19
|
+
hint: "filter/map/slice data inside execute_code and return only what you need",
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export function truncateExecuteText(text, max) {
|
|
23
|
+
if (text.length <= max)
|
|
24
|
+
return text;
|
|
25
|
+
return `${text.slice(0, max)}\n--- TRUNCATED (${text.length} chars total) — filter/map/slice data inside your code and return only what you need ---`;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Apply the public execute_code result/log policy before a child result enters
|
|
29
|
+
* IPC. The parent repeats the guard for third-party Executor implementations.
|
|
30
|
+
*/
|
|
31
|
+
export function prepareExecuteResultForTransport(outcome) {
|
|
32
|
+
// QuickJS already bounds captured logs at source (entries + cumulative
|
|
33
|
+
// characters). Preserve that Executor-level shape; createExecuteTool applies
|
|
34
|
+
// the smaller model-facing 4k presentation cap in the parent.
|
|
35
|
+
const logs = outcome.logs && outcome.logs.length > 0 ? outcome.logs : undefined;
|
|
36
|
+
if (outcome.error) {
|
|
37
|
+
return {
|
|
38
|
+
result: undefined,
|
|
39
|
+
error: outcome.error,
|
|
40
|
+
...(logs ? { logs } : {}),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
return {
|
|
45
|
+
result: guardExecuteResultValue(outcome.result),
|
|
46
|
+
...(logs ? { logs } : {}),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
return {
|
|
51
|
+
result: undefined,
|
|
52
|
+
error: `result is not JSON-serializable: ${msg(err)}`,
|
|
53
|
+
...(logs ? { logs } : {}),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=executor-result.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor-result.js","sourceRoot":"","sources":["../src/executor-result.ts"],"names":[],"mappings":"AAEA,yEAAyE;AACzE,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC;AAC/C,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC;AAE3C,SAAS,GAAG,CAAC,GAAY;IACvB,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAClD,OAAO,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,MAAM,IAAI,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,IAAI,CAAC,MAAM,IAAI,wBAAwB;QAAE,OAAO,KAAK,CAAC;IAC1D,OAAO;QACL,SAAS,EAAE,IAAI;QACf,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,wBAAwB,CAAC;QAChD,UAAU,EAAE,IAAI,CAAC,MAAM;QACvB,IAAI,EAAE,yEAAyE;KAChF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,GAAW;IAC3D,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,oBAAoB,IAAI,CAAC,MAAM,0FAA0F,CAAC;AACxJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gCAAgC,CAC9C,OAAsB;IAEtB,uEAAuE;IACvE,6EAA6E;IAC7E,8DAA8D;IAC9D,MAAM,IAAI,GACR,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACrE,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1B,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,OAAO;YACL,MAAM,EAAE,uBAAuB,CAAC,OAAO,CAAC,MAAM,CAAC;YAC/C,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1B,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,MAAM,EAAE,SAAS;YACjB,KAAK,EAAE,oCAAoC,GAAG,CAAC,GAAG,CAAC,EAAE;YACrD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1B,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quickjs-child.d.ts","sourceRoot":"","sources":["../../src/executors/quickjs-child.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { prepareExecuteResultForTransport } from "../executor-result.js";
|
|
2
|
+
import { MAX_QUICKJS_IPC_BYTES, MAX_QUICKJS_HOST_RPC_BYTES, serializedBytes, stringifyBounded, } from "./quickjs-protocol.js";
|
|
3
|
+
import { executeQuickJs, prepareQuickJs } from "./quickjs-runtime.js";
|
|
4
|
+
let activeJobId;
|
|
5
|
+
let nextCallId = 1;
|
|
6
|
+
const pending = new Map();
|
|
7
|
+
function msg(err) {
|
|
8
|
+
return err instanceof Error ? err.message : String(err);
|
|
9
|
+
}
|
|
10
|
+
function send(message) {
|
|
11
|
+
if (!process.send)
|
|
12
|
+
throw new Error("QuickJS child IPC channel is unavailable.");
|
|
13
|
+
// Bound the actual process.send envelope, not only its nested payloadJson.
|
|
14
|
+
// Guest-controlled strings must be rejected while they are still isolated
|
|
15
|
+
// in this disposable process, before Node materializes them in the parent.
|
|
16
|
+
stringifyBounded(message, "QuickJS child IPC envelope");
|
|
17
|
+
process.send(message);
|
|
18
|
+
}
|
|
19
|
+
function provider(name, jobId) {
|
|
20
|
+
const functions = new Proxy(Object.create(null), {
|
|
21
|
+
get: (_target, key) => {
|
|
22
|
+
if (typeof key !== "string")
|
|
23
|
+
return undefined;
|
|
24
|
+
return async (...args) => {
|
|
25
|
+
const callId = nextCallId++;
|
|
26
|
+
const payloadJson = stringifyBounded({
|
|
27
|
+
namespace: name,
|
|
28
|
+
functionName: key,
|
|
29
|
+
args,
|
|
30
|
+
}, "Host call payload", MAX_QUICKJS_HOST_RPC_BYTES);
|
|
31
|
+
const result = new Promise((resolve, reject) => {
|
|
32
|
+
pending.set(callId, { resolve, reject });
|
|
33
|
+
});
|
|
34
|
+
send({
|
|
35
|
+
type: "host-call",
|
|
36
|
+
jobId,
|
|
37
|
+
callId,
|
|
38
|
+
payloadJson,
|
|
39
|
+
});
|
|
40
|
+
return result;
|
|
41
|
+
};
|
|
42
|
+
},
|
|
43
|
+
getOwnPropertyDescriptor: (_target, key) => typeof key === "string"
|
|
44
|
+
? { configurable: true, enumerable: false }
|
|
45
|
+
: undefined,
|
|
46
|
+
});
|
|
47
|
+
return { name, fns: functions };
|
|
48
|
+
}
|
|
49
|
+
function fixedTransportFailure(message) {
|
|
50
|
+
return {
|
|
51
|
+
outcome: {
|
|
52
|
+
result: undefined,
|
|
53
|
+
error: message.slice(0, 4_000),
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
async function run(payload) {
|
|
58
|
+
if (activeJobId !== undefined) {
|
|
59
|
+
throw new Error("QuickJS child received overlapping executions.");
|
|
60
|
+
}
|
|
61
|
+
activeJobId = payload.id;
|
|
62
|
+
try {
|
|
63
|
+
const providers = payload.providerNames.map((name) => provider(name, payload.id));
|
|
64
|
+
const raw = await executeQuickJs(payload.code, providers, payload.options);
|
|
65
|
+
const prepared = {
|
|
66
|
+
outcome: prepareExecuteResultForTransport(raw),
|
|
67
|
+
...(raw.timedOut ? { timedOut: true } : {}),
|
|
68
|
+
};
|
|
69
|
+
let payloadJson;
|
|
70
|
+
try {
|
|
71
|
+
payloadJson = stringifyBounded(prepared, "QuickJS execution result");
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
payloadJson = JSON.stringify(fixedTransportFailure(`QuickJS execution result exceeded the ${MAX_QUICKJS_IPC_BYTES}-byte IPC limit: ${msg(err)}`));
|
|
75
|
+
}
|
|
76
|
+
send({ type: "result", jobId: payload.id, payloadJson });
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
activeJobId = undefined;
|
|
80
|
+
for (const request of pending.values()) {
|
|
81
|
+
request.reject(new Error("Execution ended before the host call settled."));
|
|
82
|
+
}
|
|
83
|
+
pending.clear();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
process.on("message", (message) => {
|
|
87
|
+
if (!message || typeof message !== "object")
|
|
88
|
+
return;
|
|
89
|
+
if (message.type === "host-result") {
|
|
90
|
+
if (message.jobId !== activeJobId)
|
|
91
|
+
return;
|
|
92
|
+
const request = pending.get(message.callId);
|
|
93
|
+
if (!request)
|
|
94
|
+
return;
|
|
95
|
+
pending.delete(message.callId);
|
|
96
|
+
if (serializedBytes(message.payloadJson) > MAX_QUICKJS_HOST_RPC_BYTES) {
|
|
97
|
+
request.reject(new Error("Host result exceeded the IPC limit."));
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
try {
|
|
101
|
+
const result = JSON.parse(message.payloadJson);
|
|
102
|
+
if (result.ok)
|
|
103
|
+
request.resolve(result.value);
|
|
104
|
+
else
|
|
105
|
+
request.reject(new Error(result.error));
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
request.reject(new Error(`Invalid host result: ${msg(err)}`));
|
|
109
|
+
}
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (message.type !== "run")
|
|
113
|
+
return;
|
|
114
|
+
if (serializedBytes(message.payloadJson) > MAX_QUICKJS_IPC_BYTES) {
|
|
115
|
+
throw new Error("Run payload exceeded the IPC limit.");
|
|
116
|
+
}
|
|
117
|
+
const payload = JSON.parse(message.payloadJson);
|
|
118
|
+
void run(payload).catch((err) => {
|
|
119
|
+
const payloadJson = JSON.stringify(fixedTransportFailure(`QuickJS child failed: ${msg(err)}`));
|
|
120
|
+
send({ type: "result", jobId: payload.id, payloadJson });
|
|
121
|
+
activeJobId = undefined;
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
process.on("disconnect", () => process.exit(0));
|
|
125
|
+
// The parent does not start an execution's wall budget until the trusted WASM
|
|
126
|
+
// module is loaded. This keeps cold-start latency from being misclassified as
|
|
127
|
+
// guest CPU/wall failure while the parent's startup timeout still bounds a
|
|
128
|
+
// child that never becomes ready.
|
|
129
|
+
await prepareQuickJs();
|
|
130
|
+
send({ type: "ready" });
|
|
131
|
+
//# sourceMappingURL=quickjs-child.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quickjs-child.js","sourceRoot":"","sources":["../../src/executors/quickjs-child.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gCAAgC,EAAE,MAAM,uBAAuB,CAAC;AAEzE,OAAO,EACL,qBAAqB,EACrB,0BAA0B,EAO1B,eAAe,EACf,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtE,IAAI,WAA+B,CAAC;AACpC,IAAI,UAAU,GAAG,CAAC,CAAC;AACnB,MAAM,OAAO,GAAG,IAAI,GAAG,EAMpB,CAAC;AAEJ,SAAS,GAAG,CAAC,GAAY;IACvB,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,IAAI,CAAC,OAA6B;IACzC,IAAI,CAAC,OAAO,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAChF,2EAA2E;IAC3E,0EAA0E;IAC1E,2EAA2E;IAC3E,gBAAgB,CAAC,OAAO,EAAE,4BAA4B,CAAC,CAAC;IACxD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,KAAa;IAC3C,MAAM,SAAS,GAAG,IAAI,KAAK,CACzB,MAAM,CAAC,MAAM,CAAC,IAAI,CAA4B,EAC9C;QACE,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE;YACpB,IAAI,OAAO,GAAG,KAAK,QAAQ;gBAAE,OAAO,SAAS,CAAC;YAC9C,OAAO,KAAK,EAAE,GAAG,IAAe,EAAoB,EAAE;gBACpD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;gBAC5B,MAAM,WAAW,GAAG,gBAAgB,CAClC;oBACE,SAAS,EAAE,IAAI;oBACf,YAAY,EAAE,GAAG;oBACjB,IAAI;iBACqB,EAC3B,mBAAmB,EACnB,0BAA0B,CAC3B,CAAC;gBACF,MAAM,MAAM,GAAG,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;oBACtD,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC3C,CAAC,CAAC,CAAC;gBACH,IAAI,CAAC;oBACH,IAAI,EAAE,WAAW;oBACjB,KAAK;oBACL,MAAM;oBACN,WAAW;iBACZ,CAAC,CAAC;gBACH,OAAO,MAAM,CAAC;YAChB,CAAC,CAAC;QACJ,CAAC;QACD,wBAAwB,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,CACzC,OAAO,GAAG,KAAK,QAAQ;YACrB,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE;YAC3C,CAAC,CAAC,SAAS;KAChB,CACF,CAAC;IACF,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAe;IAC5C,OAAO;QACL,OAAO,EAAE;YACP,MAAM,EAAE,SAAS;YACjB,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;SAC/B;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,GAAG,CAAC,OAAmB;IACpC,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IACD,WAAW,GAAG,OAAO,CAAC,EAAE,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACnD,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC,CAC3B,CAAC;QACF,MAAM,GAAG,GAAG,MAAM,cAAc,CAC9B,OAAO,CAAC,IAAI,EACZ,SAAS,EACT,OAAO,CAAC,OAAO,CAChB,CAAC;QACF,MAAM,QAAQ,GAAqB;YACjC,OAAO,EAAE,gCAAgC,CAAC,GAAG,CAAC;YAC9C,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5C,CAAC;QACF,IAAI,WAAmB,CAAC;QACxB,IAAI,CAAC;YACH,WAAW,GAAG,gBAAgB,CAAC,QAAQ,EAAE,0BAA0B,CAAC,CAAC;QACvE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,GAAG,IAAI,CAAC,SAAS,CAC1B,qBAAqB,CACnB,yCAAyC,qBAAqB,oBAAoB,GAAG,CAAC,GAAG,CAAC,EAAE,CAC7F,CACF,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;IAC3D,CAAC;YAAS,CAAC;QACT,WAAW,GAAG,SAAS,CAAC;QACxB,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACvC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;AACH,CAAC;AAED,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAA6B,EAAE,EAAE;IACtD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO;IACpD,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QACnC,IAAI,OAAO,CAAC,KAAK,KAAK,WAAW;YAAE,OAAO;QAC1C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC/B,IACE,eAAe,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,0BAA0B,EACjE,CAAC;YACD,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC,CAAC;YACjE,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAsB,CAAC;YACpE,IAAI,MAAM,CAAC,EAAE;gBAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;;gBACxC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,wBAAwB,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAChE,CAAC;QACD,OAAO;IACT,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO;IACnC,IAAI,eAAe,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,qBAAqB,EAAE,CAAC;QACjE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAe,CAAC;IAC9D,KAAK,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QAC9B,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAChC,qBAAqB,CAAC,yBAAyB,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAC3D,CAAC;QACF,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;QACzD,WAAW,GAAG,SAAS,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAEhD,8EAA8E;AAC9E,8EAA8E;AAC9E,2EAA2E;AAC3E,kCAAkC;AAClC,MAAM,cAAc,EAAE,CAAC;AACvB,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { ExecuteResult } from "../types.js";
|
|
2
|
+
import type { QuickJsRuntimeOptions } from "./quickjs-runtime.js";
|
|
3
|
+
export declare const MAX_QUICKJS_IPC_BYTES: number;
|
|
4
|
+
/** Preserve #84's stopgap before a host value enters the child/WASM process. */
|
|
5
|
+
export declare const MAX_QUICKJS_HOST_RPC_BYTES: number;
|
|
6
|
+
export interface RunPayload {
|
|
7
|
+
id: number;
|
|
8
|
+
code: string;
|
|
9
|
+
providerNames: string[];
|
|
10
|
+
options: QuickJsRuntimeOptions;
|
|
11
|
+
}
|
|
12
|
+
export type ParentToChildMessage = {
|
|
13
|
+
type: "run";
|
|
14
|
+
payloadJson: string;
|
|
15
|
+
} | {
|
|
16
|
+
type: "host-result";
|
|
17
|
+
jobId: number;
|
|
18
|
+
callId: number;
|
|
19
|
+
payloadJson: string;
|
|
20
|
+
};
|
|
21
|
+
export type ChildToParentMessage = {
|
|
22
|
+
type: "ready";
|
|
23
|
+
} | {
|
|
24
|
+
type: "host-call";
|
|
25
|
+
jobId: number;
|
|
26
|
+
callId: number;
|
|
27
|
+
payloadJson: string;
|
|
28
|
+
} | {
|
|
29
|
+
type: "result";
|
|
30
|
+
jobId: number;
|
|
31
|
+
payloadJson: string;
|
|
32
|
+
};
|
|
33
|
+
export interface HostCallPayload {
|
|
34
|
+
namespace: string;
|
|
35
|
+
functionName: string;
|
|
36
|
+
args: unknown[];
|
|
37
|
+
}
|
|
38
|
+
export type HostResultPayload = {
|
|
39
|
+
ok: true;
|
|
40
|
+
value: unknown;
|
|
41
|
+
} | {
|
|
42
|
+
ok: false;
|
|
43
|
+
error: string;
|
|
44
|
+
};
|
|
45
|
+
export interface ExecutionPayload {
|
|
46
|
+
outcome: ExecuteResult;
|
|
47
|
+
/**
|
|
48
|
+
* Set by the runtime on wall-clock expiry. The parent recycles the child on
|
|
49
|
+
* this flag, never on error text a guest can fabricate.
|
|
50
|
+
*/
|
|
51
|
+
timedOut?: boolean;
|
|
52
|
+
}
|
|
53
|
+
export declare function serializedBytes(text: string): number;
|
|
54
|
+
export declare function stringifyBounded(value: unknown, label: string, limit?: number): string;
|
|
55
|
+
//# sourceMappingURL=quickjs-protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quickjs-protocol.d.ts","sourceRoot":"","sources":["../../src/executors/quickjs-protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAMlE,eAAO,MAAM,qBAAqB,QAAc,CAAC;AACjD,gFAAgF;AAChF,eAAO,MAAM,0BAA0B,QAAa,CAAC;AAErD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,EAAE,qBAAqB,CAAC;CAChC;AAED,MAAM,MAAM,oBAAoB,GAC5B;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACpC;IACE,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEN,MAAM,MAAM,oBAAoB,GAC5B;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IACE,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB,GACD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,OAAO,EAAE,CAAC;CACjB;AAED,MAAM,MAAM,iBAAiB,GACzB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAC5B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjC,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,aAAa,CAAC;IACvB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,EACb,KAAK,SAAwB,GAC5B,MAAM,CAYR"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// The guest result is shaped to 24k characters before transport and QuickJS
|
|
2
|
+
// capture already bounds logs to 256k characters. Every complete message is
|
|
3
|
+
// measured against this ceiling before process.send; one MiB leaves room for
|
|
4
|
+
// multibyte log text and envelope escaping while remaining a hard IPC bound.
|
|
5
|
+
export const MAX_QUICKJS_IPC_BYTES = 1024 * 1024;
|
|
6
|
+
/** Preserve #84's stopgap before a host value enters the child/WASM process. */
|
|
7
|
+
export const MAX_QUICKJS_HOST_RPC_BYTES = 256 * 1024;
|
|
8
|
+
export function serializedBytes(text) {
|
|
9
|
+
return new TextEncoder().encode(text).length;
|
|
10
|
+
}
|
|
11
|
+
export function stringifyBounded(value, label, limit = MAX_QUICKJS_IPC_BYTES) {
|
|
12
|
+
const json = JSON.stringify(value);
|
|
13
|
+
if (json === undefined) {
|
|
14
|
+
throw new TypeError(`${label} is not JSON-serializable.`);
|
|
15
|
+
}
|
|
16
|
+
const bytes = serializedBytes(json);
|
|
17
|
+
if (bytes > limit) {
|
|
18
|
+
throw new RangeError(`${label} is ${bytes} UTF-8 bytes, over the ${limit}-byte IPC limit.`);
|
|
19
|
+
}
|
|
20
|
+
return json;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=quickjs-protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quickjs-protocol.js","sourceRoot":"","sources":["../../src/executors/quickjs-protocol.ts"],"names":[],"mappings":"AAGA,4EAA4E;AAC5E,4EAA4E;AAC5E,6EAA6E;AAC7E,6EAA6E;AAC7E,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,GAAG,IAAI,CAAC;AACjD,gFAAgF;AAChF,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,GAAG,IAAI,CAAC;AA+CrD,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,KAAc,EACd,KAAa,EACb,KAAK,GAAG,qBAAqB;IAE7B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,4BAA4B,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,KAAK,GAAG,KAAK,EAAE,CAAC;QAClB,MAAM,IAAI,UAAU,CAClB,GAAG,KAAK,OAAO,KAAK,0BAA0B,KAAK,kBAAkB,CACtE,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ExecuteResult, ExecutorProvider } from "../types.js";
|
|
2
|
+
export interface QuickJsRuntimeOptions {
|
|
3
|
+
timeoutMs: number;
|
|
4
|
+
cpuTimeMs: number;
|
|
5
|
+
memoryLimitBytes: number;
|
|
6
|
+
maxStackSizeBytes: number;
|
|
7
|
+
}
|
|
8
|
+
/** Load and compile the shared QuickJS WASM module before a run budget starts. */
|
|
9
|
+
export declare function prepareQuickJs(): Promise<void>;
|
|
10
|
+
/** Normalize model output into an async-arrow expression: strip markdown fences, wrap bare bodies. */
|
|
11
|
+
export declare function normalizeCode(code: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* ExecuteResult plus a structural wall-expiry marker. Guest errors flow through
|
|
14
|
+
* formatGuestError verbatim, so the timeout message text is forgeable; this
|
|
15
|
+
* flag is set only by the return sites below and never from guest values.
|
|
16
|
+
*/
|
|
17
|
+
export interface QuickJsExecutionResult extends ExecuteResult {
|
|
18
|
+
timedOut?: boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Execute one program inside the child. Wall time includes host waits; guest
|
|
22
|
+
* CPU accumulates only while evalCode/executePendingJobs is synchronously
|
|
23
|
+
* driving QuickJS, so a slow downstream does not consume the short CPU budget.
|
|
24
|
+
*/
|
|
25
|
+
export declare function executeQuickJs(code: string, providers: ExecutorProvider[], options: QuickJsRuntimeOptions): Promise<QuickJsExecutionResult>;
|
|
26
|
+
//# sourceMappingURL=quickjs-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quickjs-runtime.d.ts","sourceRoot":"","sources":["../../src/executors/quickjs-runtime.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEnE,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,kFAAkF;AAClF,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAEpD;AA4CD,sGAAsG;AACtG,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAUlD;AAyLD;;;;GAIG;AACH,MAAM,WAAW,sBAAuB,SAAQ,aAAa;IAC3D,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,gBAAgB,EAAE,EAC7B,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,sBAAsB,CAAC,CA0JjC"}
|