@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.
Files changed (96) hide show
  1. package/CHANGELOG.md +122 -0
  2. package/README.md +5 -2
  3. package/dist/connector-scope.d.ts +7 -4
  4. package/dist/connector-scope.d.ts.map +1 -1
  5. package/dist/connector-scope.js +36 -16
  6. package/dist/connector-scope.js.map +1 -1
  7. package/dist/connectors/remote-mcp.d.ts.map +1 -1
  8. package/dist/connectors/remote-mcp.js +164 -95
  9. package/dist/connectors/remote-mcp.js.map +1 -1
  10. package/dist/credential-health.d.ts +11 -7
  11. package/dist/credential-health.d.ts.map +1 -1
  12. package/dist/credential-health.js +26 -19
  13. package/dist/credential-health.js.map +1 -1
  14. package/dist/execute.d.ts +3 -0
  15. package/dist/execute.d.ts.map +1 -1
  16. package/dist/execute.js +70 -29
  17. package/dist/execute.js.map +1 -1
  18. package/dist/executor-admission.d.ts +53 -0
  19. package/dist/executor-admission.d.ts.map +1 -0
  20. package/dist/executor-admission.js +151 -0
  21. package/dist/executor-admission.js.map +1 -0
  22. package/dist/executor-result.d.ts +13 -0
  23. package/dist/executor-result.d.ts.map +1 -0
  24. package/dist/executor-result.js +57 -0
  25. package/dist/executor-result.js.map +1 -0
  26. package/dist/executors/quickjs-child.d.ts +2 -0
  27. package/dist/executors/quickjs-child.d.ts.map +1 -0
  28. package/dist/executors/quickjs-child.js +131 -0
  29. package/dist/executors/quickjs-child.js.map +1 -0
  30. package/dist/executors/quickjs-protocol.d.ts +55 -0
  31. package/dist/executors/quickjs-protocol.d.ts.map +1 -0
  32. package/dist/executors/quickjs-protocol.js +22 -0
  33. package/dist/executors/quickjs-protocol.js.map +1 -0
  34. package/dist/executors/quickjs-runtime.d.ts +26 -0
  35. package/dist/executors/quickjs-runtime.d.ts.map +1 -0
  36. package/dist/executors/quickjs-runtime.js +383 -0
  37. package/dist/executors/quickjs-runtime.js.map +1 -0
  38. package/dist/executors/quickjs.d.ts +20 -15
  39. package/dist/executors/quickjs.d.ts.map +1 -1
  40. package/dist/executors/quickjs.js +465 -265
  41. package/dist/executors/quickjs.js.map +1 -1
  42. package/dist/index.d.ts +15 -3
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +7 -0
  45. package/dist/index.js.map +1 -1
  46. package/dist/meta-tools.d.ts +4 -0
  47. package/dist/meta-tools.d.ts.map +1 -1
  48. package/dist/meta-tools.js +49 -12
  49. package/dist/meta-tools.js.map +1 -1
  50. package/dist/node.d.ts.map +1 -1
  51. package/dist/node.js +36 -3
  52. package/dist/node.js.map +1 -1
  53. package/dist/registry.d.ts +21 -24
  54. package/dist/registry.d.ts.map +1 -1
  55. package/dist/registry.js +37 -25
  56. package/dist/registry.js.map +1 -1
  57. package/dist/server.d.ts.map +1 -1
  58. package/dist/server.js +19 -9
  59. package/dist/server.js.map +1 -1
  60. package/dist/timeout.d.ts +9 -4
  61. package/dist/timeout.d.ts.map +1 -1
  62. package/dist/timeout.js +34 -4
  63. package/dist/timeout.js.map +1 -1
  64. package/dist/toolkits.d.ts +8 -0
  65. package/dist/toolkits.d.ts.map +1 -1
  66. package/dist/toolkits.js +3 -0
  67. package/dist/toolkits.js.map +1 -1
  68. package/dist/types.d.ts +19 -2
  69. package/dist/types.d.ts.map +1 -1
  70. package/dist/ui.d.ts +13 -1
  71. package/dist/ui.d.ts.map +1 -1
  72. package/dist/ui.js +188 -7
  73. package/dist/ui.js.map +1 -1
  74. package/dist/version.d.ts +1 -1
  75. package/dist/version.js +1 -1
  76. package/package.json +1 -1
  77. package/src/connector-scope.ts +43 -18
  78. package/src/connectors/remote-mcp.ts +184 -102
  79. package/src/credential-health.ts +33 -17
  80. package/src/execute.ts +93 -35
  81. package/src/executor-admission.ts +229 -0
  82. package/src/executor-result.ts +63 -0
  83. package/src/executors/quickjs-child.ts +168 -0
  84. package/src/executors/quickjs-protocol.ts +77 -0
  85. package/src/executors/quickjs-runtime.ts +440 -0
  86. package/src/executors/quickjs.ts +669 -302
  87. package/src/index.ts +30 -5
  88. package/src/meta-tools.ts +84 -27
  89. package/src/node.ts +36 -2
  90. package/src/registry.ts +53 -22
  91. package/src/server.ts +21 -10
  92. package/src/timeout.ts +41 -4
  93. package/src/toolkits.ts +11 -0
  94. package/src/types.ts +19 -2
  95. package/src/ui.ts +218 -12
  96. package/src/version.ts +1 -1
@@ -0,0 +1,383 @@
1
+ // QuickJS-in-WebAssembly runtime used inside the disposable child process.
2
+ //
3
+ // Model-written code runs inside a QuickJS interpreter compiled to WASM:
4
+ // memory-safe, no ambient authority — the guest has no fetch, filesystem,
5
+ // env, timers, or imports. The only bridge to the host is `__call`, which
6
+ // returns a QuickJS promise that the host resolves with a JSON payload after
7
+ // running the provider function; `executePendingJobs` drives guest
8
+ // continuations from a host-side loop. Values cross the boundary as JSON, so
9
+ // provider args/results must be JSON-serializable.
10
+ import { getQuickJS, } from "quickjs-emscripten";
11
+ /** Load and compile the shared QuickJS WASM module before a run budget starts. */
12
+ export async function prepareQuickJs() {
13
+ await getQuickJS();
14
+ }
15
+ const MAX_LOG_ENTRIES = 200;
16
+ // Cap each entry AND the cumulative buffer at capture time so untrusted guest
17
+ // code can't retain unbounded host memory: a single `console.log("x".repeat(N))`
18
+ // otherwise copies the whole N-char guest string into a host array we hold for
19
+ // the entire execution. 8k chars/entry is generous for glue-code logging (the
20
+ // join in execute.ts trims the assembled log to 4k anyway), and 256k total
21
+ // keeps the worst case — 200 maxed-out entries — bounded well under a MiB.
22
+ const MAX_LOG_ENTRY_CHARS = 8_000;
23
+ const MAX_LOG_TOTAL_CHARS = 256_000;
24
+ // Keep one host result below the range where quickjs-emscripten@0.32.0 can
25
+ // nondeterministically fail during runtime disposal under concurrent load.
26
+ // This still lets guest code reduce data more than ten times larger than
27
+ // connecta's final response budget.
28
+ const MAX_HOST_RESULT_BYTES = 256 * 1024;
29
+ function msg(err) {
30
+ return err instanceof Error ? err.message : String(err);
31
+ }
32
+ function exceedsUtf8ByteLimit(value, limit) {
33
+ let bytes = 0;
34
+ for (let index = 0; index < value.length; index += 1) {
35
+ const code = value.charCodeAt(index);
36
+ if (code <= 0x7f)
37
+ bytes += 1;
38
+ else if (code <= 0x7ff)
39
+ bytes += 2;
40
+ else if (code >= 0xd800 &&
41
+ code <= 0xdbff &&
42
+ index + 1 < value.length &&
43
+ value.charCodeAt(index + 1) >= 0xdc00 &&
44
+ value.charCodeAt(index + 1) <= 0xdfff) {
45
+ bytes += 4;
46
+ index += 1;
47
+ }
48
+ else {
49
+ bytes += 3;
50
+ }
51
+ if (bytes > limit)
52
+ return true;
53
+ }
54
+ return false;
55
+ }
56
+ /** Normalize model output into an async-arrow expression: strip markdown fences, wrap bare bodies. */
57
+ export function normalizeCode(code) {
58
+ let c = code.trim();
59
+ const fence = /^```[\w-]*\s*\n([\s\S]*?)\n?```$/.exec(c);
60
+ if (fence)
61
+ c = fence[1].trim();
62
+ // Sniff for an existing function expression past any leading comments/blank
63
+ // lines — models routinely prefix their code with a `//` or `/* */` note,
64
+ // which would otherwise defeat the detection and wrap the whole thing.
65
+ const head = c.replace(/^(?:\s+|\/\/[^\n]*|\/\*[\s\S]*?\*\/)+/, "");
66
+ if (/^async\b/.test(head) || head.startsWith("("))
67
+ return c;
68
+ return `async () => {\n${c}\n}`;
69
+ }
70
+ /**
71
+ * Constant-size guest prelude: one lazy namespace Proxy per provider, never one
72
+ * generated closure per visible tool. Unknown properties cross the host bridge
73
+ * and fail closed there.
74
+ */
75
+ function setupScript(providers) {
76
+ const lines = [
77
+ `globalThis.console = (() => {
78
+ const fmt = (x) => { if (typeof x === "string") return x; try { return JSON.stringify(x); } catch { return String(x); } };
79
+ const emit = (...a) => __log(a.map(fmt).join(" "));
80
+ return { log: emit, info: emit, warn: emit, error: emit, debug: emit };
81
+ })();`,
82
+ `globalThis.__invoke = async (ns, fn, args) => {
83
+ const r = JSON.parse(await __call(ns, fn, JSON.stringify(args)));
84
+ if (!r.ok) throw new Error(r.error);
85
+ return r.value;
86
+ };`,
87
+ `globalThis.__namespace = (ns) => Object.freeze(new Proxy(Object.create(null), {
88
+ get: (_target, key) => typeof key === "string" ? (...args) => __invoke(ns, key, args) : undefined
89
+ }));`,
90
+ ];
91
+ for (const p of providers) {
92
+ const ns = JSON.stringify(p.name);
93
+ lines.push(`globalThis[${ns}] = __namespace(${ns});`);
94
+ }
95
+ lines.push(`delete globalThis.__namespace;`);
96
+ return lines.join("\n");
97
+ }
98
+ /** True when a dumped error is QuickJS's deadline-interrupt signal. */
99
+ function isInterrupt(dumped) {
100
+ if (!dumped || typeof dumped !== "object")
101
+ return false;
102
+ const e = dumped;
103
+ return e.name === "InternalError" && e.message === "interrupted";
104
+ }
105
+ function formatGuestError(dumped) {
106
+ if (dumped && typeof dumped === "object") {
107
+ const e = dumped;
108
+ if (e.message != null) {
109
+ return e.name != null && e.name !== "Error"
110
+ ? `${String(e.name)}: ${String(e.message)}`
111
+ : String(e.message);
112
+ }
113
+ }
114
+ return typeof dumped === "string" ? dumped : JSON.stringify(dumped);
115
+ }
116
+ function armWake(bridge) {
117
+ bridge.waitForSettle = new Promise((resolve) => {
118
+ bridge.wake = resolve;
119
+ });
120
+ }
121
+ function waitForHostOrDeadline(waitForSettle, remainingMs) {
122
+ return new Promise((resolve) => {
123
+ let done = false;
124
+ const timer = setTimeout(() => {
125
+ done = true;
126
+ resolve(false);
127
+ }, remainingMs);
128
+ void waitForSettle.then(() => {
129
+ if (done)
130
+ return;
131
+ done = true;
132
+ clearTimeout(timer);
133
+ resolve(true);
134
+ });
135
+ });
136
+ }
137
+ function installBridge(ctx, providers, logs) {
138
+ const bridge = {
139
+ pending: 0,
140
+ aborted: false,
141
+ wake: () => { },
142
+ waitForSettle: Promise.resolve(),
143
+ };
144
+ armWake(bridge);
145
+ // Running total of chars actually retained in `logs`; once the cumulative
146
+ // budget is spent we push one marker and drop the rest, so a flood of large
147
+ // entries can't grow the host array without bound.
148
+ let logTotalChars = 0;
149
+ let logBudgetSpent = false;
150
+ const logFn = ctx.newFunction("__log", (h) => {
151
+ if (logs.length >= MAX_LOG_ENTRIES) {
152
+ if (logs.length === MAX_LOG_ENTRIES) {
153
+ logs.push(`[log truncated after ${MAX_LOG_ENTRIES} entries]`);
154
+ }
155
+ return;
156
+ }
157
+ if (logBudgetSpent)
158
+ return;
159
+ // Cap the entry before retaining it: `getString` yields a transient copy,
160
+ // but slicing here keeps only a bounded string alive in `logs`.
161
+ let entry = ctx.getString(h);
162
+ if (entry.length > MAX_LOG_ENTRY_CHARS) {
163
+ entry = `${entry.slice(0, MAX_LOG_ENTRY_CHARS)}…[entry truncated]`;
164
+ }
165
+ if (logTotalChars + entry.length > MAX_LOG_TOTAL_CHARS) {
166
+ logs.push("[log truncated: size budget exceeded]");
167
+ logBudgetSpent = true;
168
+ return;
169
+ }
170
+ logs.push(entry);
171
+ logTotalChars += entry.length;
172
+ });
173
+ ctx.setProp(ctx.global, "__log", logFn);
174
+ logFn.dispose();
175
+ const byName = new Map(providers.map((p) => [p.name, p]));
176
+ const invoke = async (ns, fn, argsJson) => {
177
+ try {
178
+ const provider = byName.get(ns);
179
+ const f = provider && Object.hasOwn(provider.fns, fn)
180
+ ? provider.fns[fn]
181
+ : undefined;
182
+ if (!f)
183
+ throw new Error(`Unknown function ${ns}.${fn}`);
184
+ const args = JSON.parse(argsJson);
185
+ const value = await f(...args);
186
+ let json;
187
+ try {
188
+ json = JSON.stringify({ ok: true, value });
189
+ }
190
+ catch (err) {
191
+ throw new Error(`Host result from ${ns}.${fn} could not be serialized: ${msg(err)}`);
192
+ }
193
+ if (exceedsUtf8ByteLimit(json, MAX_HOST_RESULT_BYTES)) {
194
+ throw new Error(`Host result from ${ns}.${fn} exceeds the ${MAX_HOST_RESULT_BYTES}-byte serialized bridge limit.`);
195
+ }
196
+ return json;
197
+ }
198
+ catch (err) {
199
+ return JSON.stringify({ ok: false, error: msg(err) });
200
+ }
201
+ };
202
+ const callFn = ctx.newFunction("__call", (nsH, fnH, argsH) => {
203
+ const ns = ctx.getString(nsH);
204
+ const fn = ctx.getString(fnH);
205
+ const argsJson = ctx.getString(argsH);
206
+ const deferred = ctx.newPromise();
207
+ bridge.pending++;
208
+ void invoke(ns, fn, argsJson).then((json) => {
209
+ bridge.pending--;
210
+ if (bridge.aborted) {
211
+ // Context is (about to be) torn down — settle nothing, free our handles.
212
+ deferred.dispose();
213
+ }
214
+ else {
215
+ const h = ctx.newString(json);
216
+ deferred.resolve(h);
217
+ h.dispose();
218
+ }
219
+ bridge.wake();
220
+ });
221
+ return deferred.handle;
222
+ });
223
+ ctx.setProp(ctx.global, "__call", callFn);
224
+ callFn.dispose();
225
+ return bridge;
226
+ }
227
+ /**
228
+ * Execute one program inside the child. Wall time includes host waits; guest
229
+ * CPU accumulates only while evalCode/executePendingJobs is synchronously
230
+ * driving QuickJS, so a slow downstream does not consume the short CPU budget.
231
+ */
232
+ export async function executeQuickJs(code, providers, options) {
233
+ const { timeoutMs, cpuTimeMs, memoryLimitBytes, maxStackSizeBytes } = options;
234
+ const QuickJS = await getQuickJS();
235
+ const ctx = QuickJS.newContext();
236
+ const deadline = Date.now() + timeoutMs;
237
+ const timeoutError = `Execution timed out after ${timeoutMs}ms.`;
238
+ const cpuTimeoutError = `Execution exceeded the ${cpuTimeMs}ms guest CPU budget.`;
239
+ let cpuUsedMs = 0;
240
+ let segmentStarted = 0;
241
+ let inGuest = false;
242
+ let cpuInterrupted = false;
243
+ let wallInterrupted = false;
244
+ const runGuest = (operation) => {
245
+ segmentStarted = Date.now();
246
+ inGuest = true;
247
+ try {
248
+ return operation();
249
+ }
250
+ finally {
251
+ cpuUsedMs += Date.now() - segmentStarted;
252
+ inGuest = false;
253
+ }
254
+ };
255
+ ctx.runtime.setMemoryLimit(memoryLimitBytes);
256
+ ctx.runtime.setMaxStackSize(maxStackSizeBytes);
257
+ ctx.runtime.setInterruptHandler(() => {
258
+ if (!inGuest)
259
+ return false;
260
+ wallInterrupted = Date.now() >= deadline;
261
+ cpuInterrupted =
262
+ cpuUsedMs + (Date.now() - segmentStarted) >= cpuTimeMs;
263
+ return wallInterrupted || cpuInterrupted;
264
+ });
265
+ const logs = [];
266
+ const bridge = installBridge(ctx, providers, logs);
267
+ const finish = (r) => {
268
+ bridge.aborted = true;
269
+ // Outstanding host calls still hold deferred-promise handles; their
270
+ // callbacks free them and wake the drain, which disposes the context
271
+ // once the last straggler settles. Re-arm before every wait so the
272
+ // deferred never resolves-and-stays-resolved between settles — that
273
+ // would spin the microtask queue and starve the very timers the
274
+ // stragglers are waiting on. Arming before the pending check (and
275
+ // synchronously, before the first await) closes the settle-before-arm
276
+ // window: any settle after this point resolves the promise we await.
277
+ if (bridge.pending === 0)
278
+ ctx.dispose();
279
+ else {
280
+ void (async () => {
281
+ armWake(bridge);
282
+ while (bridge.pending > 0) {
283
+ await bridge.waitForSettle;
284
+ armWake(bridge);
285
+ }
286
+ ctx.dispose();
287
+ })();
288
+ }
289
+ return logs.length > 0 ? { ...r, logs } : r;
290
+ };
291
+ const fail = (error) => finish({ result: undefined, error });
292
+ const timedOut = () => ({
293
+ result: undefined,
294
+ error: timeoutError,
295
+ timedOut: true,
296
+ });
297
+ const setup = runGuest(() => ctx.evalCode(setupScript(providers)));
298
+ if (setup.error) {
299
+ const detail = formatGuestError(ctx.dump(setup.error));
300
+ setup.error.dispose();
301
+ if (wallInterrupted)
302
+ return finish(timedOut());
303
+ if (cpuInterrupted)
304
+ return fail(cpuTimeoutError);
305
+ return fail(`Sandbox setup failed: ${detail}`);
306
+ }
307
+ setup.value.dispose();
308
+ const evaluated = runGuest(() => ctx.evalCode(`Promise.resolve((\n${normalizeCode(code)}\n)())`));
309
+ if (evaluated.error) {
310
+ const dumped = ctx.dump(evaluated.error);
311
+ evaluated.error.dispose();
312
+ if (isInterrupt(dumped) && wallInterrupted)
313
+ return finish(timedOut());
314
+ if (isInterrupt(dumped) && cpuInterrupted)
315
+ return fail(cpuTimeoutError);
316
+ return fail(formatGuestError(dumped));
317
+ }
318
+ const promiseHandle = evaluated.value;
319
+ // Drive the guest: run microtask jobs, inspect the result promise,
320
+ // sleep until a host call settles (or the budget runs out), repeat.
321
+ // Returns without touching the context lifecycle; disposal happens below.
322
+ const drive = async () => {
323
+ for (;;) {
324
+ if (Date.now() >= deadline) {
325
+ return timedOut();
326
+ }
327
+ const jobs = runGuest(() => ctx.runtime.executePendingJobs());
328
+ if (jobs.error) {
329
+ const dumped = ctx.dump(jobs.error);
330
+ jobs.error.dispose();
331
+ if (isInterrupt(dumped) && wallInterrupted) {
332
+ return timedOut();
333
+ }
334
+ if (isInterrupt(dumped) && cpuInterrupted) {
335
+ return { result: undefined, error: cpuTimeoutError };
336
+ }
337
+ return { result: undefined, error: formatGuestError(dumped) };
338
+ }
339
+ const state = ctx.getPromiseState(promiseHandle);
340
+ if (state.type === "fulfilled") {
341
+ const result = runGuest(() => ctx.dump(state.value));
342
+ state.value.dispose();
343
+ return { result };
344
+ }
345
+ if (state.type === "rejected") {
346
+ const dumped = ctx.dump(state.error);
347
+ state.error.dispose();
348
+ if (isInterrupt(dumped) && wallInterrupted) {
349
+ return timedOut();
350
+ }
351
+ if (isInterrupt(dumped) && cpuInterrupted) {
352
+ return { result: undefined, error: cpuTimeoutError };
353
+ }
354
+ return { result: undefined, error: formatGuestError(dumped) };
355
+ }
356
+ if (bridge.pending === 0) {
357
+ return {
358
+ result: undefined,
359
+ error: "Execution stalled: code awaits something that can never settle.",
360
+ };
361
+ }
362
+ const remaining = deadline - Date.now();
363
+ if (remaining <= 0) {
364
+ return timedOut();
365
+ }
366
+ const settled = await waitForHostOrDeadline(bridge.waitForSettle, remaining);
367
+ if (settled)
368
+ armWake(bridge);
369
+ else {
370
+ return timedOut();
371
+ }
372
+ }
373
+ };
374
+ let outcome;
375
+ try {
376
+ outcome = await drive();
377
+ }
378
+ finally {
379
+ promiseHandle.dispose();
380
+ }
381
+ return finish(outcome);
382
+ }
383
+ //# sourceMappingURL=quickjs-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quickjs-runtime.js","sourceRoot":"","sources":["../../src/executors/quickjs-runtime.ts"],"names":[],"mappings":"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"}
@@ -1,26 +1,31 @@
1
- import type { Executor } from "../types.js";
1
+ import type { AdmittingExecutor } from "../types.js";
2
+ export { normalizeCode } from "./quickjs-runtime.js";
2
3
  export interface QuickJsExecutorOptions {
3
4
  /**
4
- * Wall-clock budget for the whole execution, host tool calls included
5
- * (same wall-clock-budget semantics as codemode's DynamicWorkerExecutor).
6
- * Default 30s — intentionally tighter than codemode's 60s default: connecta
7
- * sandbox code is tool-call glue, not compute, so a shorter leash surfaces
8
- * hung downstreams sooner. Raise it here if a workload legitimately needs it.
5
+ * Wall-clock budget for the whole execution, host tool calls included.
6
+ * Default 30s.
9
7
  */
10
8
  timeoutMs?: number;
11
- /** Guest heap limit. Default 64 MiB. */
9
+ /**
10
+ * Cumulative time spent synchronously driving guest JavaScript. Host waits do
11
+ * not consume it. Default 250ms.
12
+ */
13
+ cpuTimeMs?: number;
14
+ /** Guest heap limit per child execution. Default 64 MiB. */
12
15
  memoryLimitBytes?: number;
13
16
  /** Guest stack limit. Default 1 MiB. */
14
17
  maxStackSizeBytes?: number;
18
+ /** Maximum simultaneous executions/child processes. Default 1. */
19
+ concurrency?: number;
20
+ /** Maximum callers waiting before provider construction. Default 32. */
21
+ maxQueueSize?: number;
22
+ /** Maximum admission wait. Default 5s. */
23
+ queueTimeoutMs?: number;
15
24
  }
16
- /** Normalize model output into an async-arrow expression: strip markdown fences, wrap bare bodies. */
17
- export declare function normalizeCode(code: string): string;
18
25
  /**
19
- * Sandbox executor for Node (or any JS runtime) built on quickjs-emscripten.
20
- * Suits connecta's execute_code: code is tool-call glue, so an interpreter's
21
- * speed is irrelevant while its isolation (plain WASM, zero native deps) is
22
- * the point. One fresh QuickJS context per execution; the WASM module itself
23
- * is cached across calls by quickjs-emscripten.
26
+ * Bounded Node QuickJS executor. Admission is acquired before connecta builds
27
+ * providers; one lease maps to one child and carries execution, avoiding a
28
+ * double-acquire deadlock at concurrency 1.
24
29
  */
25
- export declare function quickJsExecutor(options?: QuickJsExecutorOptions): Executor;
30
+ export declare function quickJsExecutor(options?: QuickJsExecutorOptions): AdmittingExecutor;
26
31
  //# sourceMappingURL=quickjs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"quickjs.d.ts","sourceRoot":"","sources":["../../src/executors/quickjs.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAiB,QAAQ,EAAoB,MAAM,aAAa,CAAC;AAE7E,MAAM,WAAW,sBAAsB;IACrC;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,wCAAwC;IACxC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAgBD,sGAAsG;AACtG,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAUlD;AAwJD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,OAAO,GAAE,sBAA2B,GACnC,QAAQ,CAiIV"}
1
+ {"version":3,"file":"quickjs.d.ts","sourceRoot":"","sources":["../../src/executors/quickjs.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,iBAAiB,EAIlB,MAAM,aAAa,CAAC;AAerB,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,wCAAwC;IACxC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kEAAkE;IAClE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0CAA0C;IAC1C,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AA6oBD;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,OAAO,GAAE,sBAA2B,GACnC,iBAAiB,CAEnB"}