isol8 0.12.0-alpha.0 → 0.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js
CHANGED
|
@@ -6318,7 +6318,7 @@ var require_bcrypt_pbkdf = __commonJS((exports, module) => {
|
|
|
6318
6318
|
|
|
6319
6319
|
// node_modules/cpu-features/build/Release/cpufeatures.node
|
|
6320
6320
|
var require_cpufeatures = __commonJS((exports, module) => {
|
|
6321
|
-
module.exports = __require("./cpufeatures-
|
|
6321
|
+
module.exports = __require("./cpufeatures-tjjrgpt7.node");
|
|
6322
6322
|
});
|
|
6323
6323
|
|
|
6324
6324
|
// node_modules/cpu-features/lib/index.js
|
|
@@ -6931,12 +6931,12 @@ var require_utils2 = __commonJS((exports, module) => {
|
|
|
6931
6931
|
|
|
6932
6932
|
// node_modules/ssh2/lib/protocol/crypto/build/Release/sshcrypto.node
|
|
6933
6933
|
var require_sshcrypto = __commonJS((exports, module) => {
|
|
6934
|
-
module.exports = __require("./sshcrypto-
|
|
6934
|
+
module.exports = __require("./sshcrypto-0209sx47.node");
|
|
6935
6935
|
});
|
|
6936
6936
|
|
|
6937
6937
|
// node_modules/ssh2/lib/protocol/crypto/poly1305.js
|
|
6938
6938
|
var require_poly1305 = __commonJS((exports, module) => {
|
|
6939
|
-
var __dirname = "/
|
|
6939
|
+
var __dirname = "/home/runner/work/isol8/isol8/node_modules/ssh2/lib/protocol/crypto", __filename = "/home/runner/work/isol8/isol8/node_modules/ssh2/lib/protocol/crypto/poly1305.js";
|
|
6940
6940
|
var createPoly1305 = function() {
|
|
6941
6941
|
var _scriptDir = typeof document !== "undefined" && document.currentScript ? document.currentScript.src : undefined;
|
|
6942
6942
|
if (typeof __filename !== "undefined")
|
|
@@ -8681,7 +8681,7 @@ ${formatted}-----END ${type} KEY-----`;
|
|
|
8681
8681
|
}
|
|
8682
8682
|
return Buffer.from(hex, "hex");
|
|
8683
8683
|
}
|
|
8684
|
-
return function
|
|
8684
|
+
return function genOpenSSLRSAPriv2(n, e, d, iqmp, p, q) {
|
|
8685
8685
|
const bn_d = bigIntFromBuffer(d);
|
|
8686
8686
|
const dmp1 = bigIntToBuffer(bn_d % (bigIntFromBuffer(p) - 1n));
|
|
8687
8687
|
const dmq1 = bigIntToBuffer(bn_d % (bigIntFromBuffer(q) - 1n));
|
|
@@ -9709,7 +9709,7 @@ ${formatted}-----END ${type} KEY-----`;
|
|
|
9709
9709
|
|
|
9710
9710
|
// node_modules/ssh2/lib/agent.js
|
|
9711
9711
|
var require_agent = __commonJS((exports, module) => {
|
|
9712
|
-
var __dirname = "/
|
|
9712
|
+
var __dirname = "/home/runner/work/isol8/isol8/node_modules/ssh2/lib";
|
|
9713
9713
|
var { Socket } = __require("net");
|
|
9714
9714
|
var { Duplex } = __require("stream");
|
|
9715
9715
|
var { resolve } = __require("path");
|
|
@@ -21682,7 +21682,7 @@ var require__stream_writable = __commonJS((exports, module) => {
|
|
|
21682
21682
|
}
|
|
21683
21683
|
});
|
|
21684
21684
|
} else {
|
|
21685
|
-
realHasInstance = function
|
|
21685
|
+
realHasInstance = function realHasInstance2(object) {
|
|
21686
21686
|
return object instanceof this;
|
|
21687
21687
|
};
|
|
21688
21688
|
}
|
|
@@ -22480,28 +22480,28 @@ var require_end_of_stream = __commonJS((exports, module) => {
|
|
|
22480
22480
|
callback = once(callback || noop);
|
|
22481
22481
|
var readable = opts.readable || opts.readable !== false && stream.readable;
|
|
22482
22482
|
var writable = opts.writable || opts.writable !== false && stream.writable;
|
|
22483
|
-
var onlegacyfinish = function
|
|
22483
|
+
var onlegacyfinish = function onlegacyfinish2() {
|
|
22484
22484
|
if (!stream.writable)
|
|
22485
22485
|
onfinish();
|
|
22486
22486
|
};
|
|
22487
22487
|
var writableEnded = stream._writableState && stream._writableState.finished;
|
|
22488
|
-
var onfinish = function
|
|
22488
|
+
var onfinish = function onfinish2() {
|
|
22489
22489
|
writable = false;
|
|
22490
22490
|
writableEnded = true;
|
|
22491
22491
|
if (!readable)
|
|
22492
22492
|
callback.call(stream);
|
|
22493
22493
|
};
|
|
22494
22494
|
var readableEnded = stream._readableState && stream._readableState.endEmitted;
|
|
22495
|
-
var onend = function
|
|
22495
|
+
var onend = function onend2() {
|
|
22496
22496
|
readable = false;
|
|
22497
22497
|
readableEnded = true;
|
|
22498
22498
|
if (!writable)
|
|
22499
22499
|
callback.call(stream);
|
|
22500
22500
|
};
|
|
22501
|
-
var onerror = function
|
|
22501
|
+
var onerror = function onerror2(err) {
|
|
22502
22502
|
callback.call(stream, err);
|
|
22503
22503
|
};
|
|
22504
|
-
var onclose = function
|
|
22504
|
+
var onclose = function onclose2() {
|
|
22505
22505
|
var err;
|
|
22506
22506
|
if (readable && !readableEnded) {
|
|
22507
22507
|
if (!stream._readableState || !stream._readableState.ended)
|
|
@@ -22514,7 +22514,7 @@ var require_end_of_stream = __commonJS((exports, module) => {
|
|
|
22514
22514
|
return callback.call(stream, err);
|
|
22515
22515
|
}
|
|
22516
22516
|
};
|
|
22517
|
-
var onrequest = function
|
|
22517
|
+
var onrequest = function onrequest2() {
|
|
22518
22518
|
stream.req.on("finish", onfinish);
|
|
22519
22519
|
};
|
|
22520
22520
|
if (isRequest(stream)) {
|
|
@@ -22671,7 +22671,7 @@ var require_async_iterator = __commonJS((exports, module) => {
|
|
|
22671
22671
|
});
|
|
22672
22672
|
});
|
|
22673
22673
|
}), _Object$setPrototypeO), AsyncIteratorPrototype);
|
|
22674
|
-
var createReadableStreamAsyncIterator = function
|
|
22674
|
+
var createReadableStreamAsyncIterator = function createReadableStreamAsyncIterator2(stream) {
|
|
22675
22675
|
var _Object$create;
|
|
22676
22676
|
var iterator = Object.create(ReadableStreamAsyncIteratorPrototype, (_Object$create = {}, _defineProperty(_Object$create, kStream, {
|
|
22677
22677
|
value: stream,
|
|
@@ -22860,7 +22860,7 @@ var require__stream_readable = __commonJS((exports, module) => {
|
|
|
22860
22860
|
var Duplex;
|
|
22861
22861
|
Readable.ReadableState = ReadableState;
|
|
22862
22862
|
var EE = __require("events").EventEmitter;
|
|
22863
|
-
var EElistenerCount = function
|
|
22863
|
+
var EElistenerCount = function EElistenerCount2(emitter, type) {
|
|
22864
22864
|
return emitter.listeners(type).length;
|
|
22865
22865
|
};
|
|
22866
22866
|
var Stream = __require("stream");
|
|
@@ -22877,7 +22877,7 @@ var require__stream_readable = __commonJS((exports, module) => {
|
|
|
22877
22877
|
if (debugUtil && debugUtil.debuglog) {
|
|
22878
22878
|
debug = debugUtil.debuglog("stream");
|
|
22879
22879
|
} else {
|
|
22880
|
-
debug = function
|
|
22880
|
+
debug = function debug2() {};
|
|
22881
22881
|
}
|
|
22882
22882
|
var BufferList = require_buffer_list();
|
|
22883
22883
|
var destroyImpl = require_destroy();
|
|
@@ -25535,14 +25535,14 @@ var require_BufferList = __commonJS((exports, module) => {
|
|
|
25535
25535
|
if (srcEnd <= 0) {
|
|
25536
25536
|
return dst || Buffer2.alloc(0);
|
|
25537
25537
|
}
|
|
25538
|
-
const
|
|
25538
|
+
const copy2 = !!dst;
|
|
25539
25539
|
const off = this._offset(srcStart);
|
|
25540
25540
|
const len = srcEnd - srcStart;
|
|
25541
25541
|
let bytes = len;
|
|
25542
|
-
let bufoff =
|
|
25542
|
+
let bufoff = copy2 && dstStart || 0;
|
|
25543
25543
|
let start = off[1];
|
|
25544
25544
|
if (srcStart === 0 && srcEnd === this.length) {
|
|
25545
|
-
if (!
|
|
25545
|
+
if (!copy2) {
|
|
25546
25546
|
return this._bufs.length === 1 ? this._bufs[0] : Buffer2.concat(this._bufs, this.length);
|
|
25547
25547
|
}
|
|
25548
25548
|
for (let i = 0;i < this._bufs.length; i++) {
|
|
@@ -25552,9 +25552,9 @@ var require_BufferList = __commonJS((exports, module) => {
|
|
|
25552
25552
|
return dst;
|
|
25553
25553
|
}
|
|
25554
25554
|
if (bytes <= this._bufs[off[0]].length - start) {
|
|
25555
|
-
return
|
|
25555
|
+
return copy2 ? this._bufs[off[0]].copy(dst, dstStart, start, start + bytes) : this._bufs[off[0]].slice(start, start + bytes);
|
|
25556
25556
|
}
|
|
25557
|
-
if (!
|
|
25557
|
+
if (!copy2) {
|
|
25558
25558
|
dst = Buffer2.allocUnsafe(len);
|
|
25559
25559
|
}
|
|
25560
25560
|
for (let i = off[0];i < this._bufs.length; i++) {
|
|
@@ -25776,7 +25776,7 @@ var require_bl = __commonJS((exports, module) => {
|
|
|
25776
25776
|
}
|
|
25777
25777
|
if (typeof callback === "function") {
|
|
25778
25778
|
this._callback = callback;
|
|
25779
|
-
const piper = function
|
|
25779
|
+
const piper = function piper2(err) {
|
|
25780
25780
|
if (this._callback) {
|
|
25781
25781
|
this._callback(err);
|
|
25782
25782
|
this._callback = null;
|
|
@@ -34839,7 +34839,7 @@ var require_writer2 = __commonJS((exports, module) => {
|
|
|
34839
34839
|
this.tail = this.head;
|
|
34840
34840
|
this.states = null;
|
|
34841
34841
|
}
|
|
34842
|
-
var create = function
|
|
34842
|
+
var create = function create2() {
|
|
34843
34843
|
return util.Buffer ? function create_buffer_setup() {
|
|
34844
34844
|
return (Writer.create = function create_buffer() {
|
|
34845
34845
|
return new BufferWriter;
|
|
@@ -35063,12 +35063,12 @@ var require_reader2 = __commonJS((exports, module) => {
|
|
|
35063
35063
|
if (buffer instanceof Uint8Array || Array.isArray(buffer))
|
|
35064
35064
|
return new Reader(buffer);
|
|
35065
35065
|
throw Error("illegal buffer");
|
|
35066
|
-
} : function
|
|
35066
|
+
} : function create_array2(buffer) {
|
|
35067
35067
|
if (Array.isArray(buffer))
|
|
35068
35068
|
return new Reader(buffer);
|
|
35069
35069
|
throw Error("illegal buffer");
|
|
35070
35070
|
};
|
|
35071
|
-
var create = function
|
|
35071
|
+
var create = function create2() {
|
|
35072
35072
|
return util.Buffer ? function create_buffer_setup(buffer) {
|
|
35073
35073
|
return (Reader.create = function create_buffer(buffer2) {
|
|
35074
35074
|
return util.Buffer.isBuffer(buffer2) ? new BufferReader(buffer2) : create_array(buffer2);
|
|
@@ -35494,10 +35494,10 @@ var require_fetch = __commonJS((exports, module) => {
|
|
|
35494
35494
|
// node_modules/@protobufjs/path/index.js
|
|
35495
35495
|
var require_path = __commonJS((exports) => {
|
|
35496
35496
|
var path = exports;
|
|
35497
|
-
var isAbsolute = path.isAbsolute = function
|
|
35497
|
+
var isAbsolute = path.isAbsolute = function isAbsolute2(path2) {
|
|
35498
35498
|
return /^(?:\/|\w+:)/.test(path2);
|
|
35499
35499
|
};
|
|
35500
|
-
var normalize = path.normalize = function
|
|
35500
|
+
var normalize = path.normalize = function normalize2(path2) {
|
|
35501
35501
|
path2 = path2.replace(/\\/g, "/").replace(/\/{2,}/g, "/");
|
|
35502
35502
|
var parts = path2.split("/"), absolute = isAbsolute(path2), prefix = "";
|
|
35503
35503
|
if (absolute)
|
|
@@ -35662,7 +35662,7 @@ var require_namespace = __commonJS((exports, module) => {
|
|
|
35662
35662
|
object.onRemove(this);
|
|
35663
35663
|
return clearCache(this);
|
|
35664
35664
|
};
|
|
35665
|
-
Namespace.prototype.define = function
|
|
35665
|
+
Namespace.prototype.define = function define2(path, json) {
|
|
35666
35666
|
if (util.isString(path))
|
|
35667
35667
|
path = path.split(".");
|
|
35668
35668
|
else if (!Array.isArray(path))
|
|
@@ -42478,7 +42478,7 @@ var require_src3 = __commonJS((exports) => {
|
|
|
42478
42478
|
|
|
42479
42479
|
// node_modules/@grpc/grpc-js/build/src/channelz.js
|
|
42480
42480
|
var require_channelz = __commonJS((exports) => {
|
|
42481
|
-
var __dirname = "/
|
|
42481
|
+
var __dirname = "/home/runner/work/isol8/isol8/node_modules/@grpc/grpc-js/build/src";
|
|
42482
42482
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42483
42483
|
exports.registerChannelzSocket = exports.registerChannelzServer = exports.registerChannelzSubchannel = exports.registerChannelzChannel = exports.ChannelzCallTrackerStub = exports.ChannelzCallTracker = exports.ChannelzChildrenTrackerStub = exports.ChannelzChildrenTracker = exports.ChannelzTrace = exports.ChannelzTraceStub = undefined;
|
|
42484
42484
|
exports.unregisterChannelzRef = unregisterChannelzRef;
|
|
@@ -47881,7 +47881,7 @@ var require_duration = __commonJS((exports) => {
|
|
|
47881
47881
|
|
|
47882
47882
|
// node_modules/@grpc/grpc-js/build/src/orca.js
|
|
47883
47883
|
var require_orca = __commonJS((exports) => {
|
|
47884
|
-
var __dirname = "/
|
|
47884
|
+
var __dirname = "/home/runner/work/isol8/isol8/node_modules/@grpc/grpc-js/build/src";
|
|
47885
47885
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47886
47886
|
exports.OrcaOobMetricsSubchannelWrapper = exports.GRPC_METRICS_HEADER = exports.ServerMetricRecorder = exports.PerRequestMetricRecorder = undefined;
|
|
47887
47887
|
exports.createOrcaClient = createOrcaClient;
|
|
@@ -53270,7 +53270,7 @@ var require_dist = __commonJS((exports) => {
|
|
|
53270
53270
|
|
|
53271
53271
|
// node_modules/dockerode/lib/session.js
|
|
53272
53272
|
var require_session = __commonJS((exports, module) => {
|
|
53273
|
-
var __dirname = "/
|
|
53273
|
+
var __dirname = "/home/runner/work/isol8/isol8/node_modules/dockerode/lib";
|
|
53274
53274
|
var grpc = require_src4();
|
|
53275
53275
|
var protoLoader = require_src5();
|
|
53276
53276
|
var path = __require("path");
|
|
@@ -54496,7 +54496,7 @@ var require_docker = __commonJS((exports, module) => {
|
|
|
54496
54496
|
stream: true,
|
|
54497
54497
|
stdout: true,
|
|
54498
54498
|
stderr: true
|
|
54499
|
-
}, function
|
|
54499
|
+
}, function handler2(err2, stream) {
|
|
54500
54500
|
if (err2)
|
|
54501
54501
|
return callback(err2, null, container);
|
|
54502
54502
|
hub.emit("stream", stream);
|
|
@@ -55592,15 +55592,6 @@ function validatePackageName(name) {
|
|
|
55592
55592
|
}
|
|
55593
55593
|
|
|
55594
55594
|
// src/engine/image-builder.ts
|
|
55595
|
-
var exports_image_builder = {};
|
|
55596
|
-
__export(exports_image_builder, {
|
|
55597
|
-
normalizePackages: () => normalizePackages,
|
|
55598
|
-
imageExists: () => imageExists,
|
|
55599
|
-
getCustomImageTag: () => getCustomImageTag,
|
|
55600
|
-
ensureImages: () => ensureImages,
|
|
55601
|
-
buildCustomImages: () => buildCustomImages,
|
|
55602
|
-
buildBaseImages: () => buildBaseImages
|
|
55603
|
-
});
|
|
55604
55595
|
import { createHash as createHash2 } from "node:crypto";
|
|
55605
55596
|
import { existsSync as existsSync3, readFileSync as readFileSync2 } from "node:fs";
|
|
55606
55597
|
import { join as join3 } from "node:path";
|
|
@@ -55659,9 +55650,8 @@ async function removeImage(docker, imageId) {
|
|
|
55659
55650
|
logger.debug(`[ImageBuilder] Could not remove image ${imageId.slice(0, 12)}: ${err}`);
|
|
55660
55651
|
}
|
|
55661
55652
|
}
|
|
55662
|
-
async function buildBaseImages(docker, onProgress, force = false
|
|
55663
|
-
const
|
|
55664
|
-
const runtimes = onlyRuntimes ? allRuntimes.filter((r) => onlyRuntimes.includes(r.name)) : allRuntimes;
|
|
55653
|
+
async function buildBaseImages(docker, onProgress, force = false) {
|
|
55654
|
+
const runtimes = RuntimeRegistry.list();
|
|
55665
55655
|
const dockerHash = computeDockerDirHash();
|
|
55666
55656
|
logger.debug(`[ImageBuilder] Docker directory hash: ${dockerHash.slice(0, 16)}...`);
|
|
55667
55657
|
for (const adapter of runtimes) {
|
|
@@ -55811,26 +55801,6 @@ ${installCmd}
|
|
|
55811
55801
|
}
|
|
55812
55802
|
onProgress?.({ runtime, status: "done" });
|
|
55813
55803
|
}
|
|
55814
|
-
async function imageExists(docker, imageName) {
|
|
55815
|
-
try {
|
|
55816
|
-
await docker.getImage(imageName).inspect();
|
|
55817
|
-
return true;
|
|
55818
|
-
} catch {
|
|
55819
|
-
return false;
|
|
55820
|
-
}
|
|
55821
|
-
}
|
|
55822
|
-
async function ensureImages(docker, onProgress) {
|
|
55823
|
-
const runtimes = RuntimeRegistry.list();
|
|
55824
|
-
const missing = [];
|
|
55825
|
-
for (const adapter of runtimes) {
|
|
55826
|
-
if (!await imageExists(docker, adapter.image)) {
|
|
55827
|
-
missing.push(adapter.name);
|
|
55828
|
-
}
|
|
55829
|
-
}
|
|
55830
|
-
if (missing.length > 0) {
|
|
55831
|
-
await buildBaseImages(docker, onProgress, false, missing);
|
|
55832
|
-
}
|
|
55833
|
-
}
|
|
55834
55804
|
var DOCKERFILE_DIR, LABELS, DOCKER_BUILD_FILES;
|
|
55835
55805
|
var init_image_builder = __esm(() => {
|
|
55836
55806
|
init_runtime();
|
|
@@ -56729,26 +56699,6 @@ class DockerIsol8 {
|
|
|
56729
56699
|
resolvedImage = legacyCustomTag;
|
|
56730
56700
|
} catch {}
|
|
56731
56701
|
}
|
|
56732
|
-
try {
|
|
56733
|
-
await this.docker.getImage(resolvedImage).inspect();
|
|
56734
|
-
} catch {
|
|
56735
|
-
logger.debug(`[ImageBuilder] Image ${resolvedImage} not found. Building...`);
|
|
56736
|
-
const { buildBaseImages: buildBaseImages2, buildCustomImages: buildCustomImages2 } = await Promise.resolve().then(() => (init_image_builder(), exports_image_builder));
|
|
56737
|
-
if (resolvedImage !== adapter.image && normalizedDeps.length > 0) {
|
|
56738
|
-
try {
|
|
56739
|
-
await this.docker.getImage(adapter.image).inspect();
|
|
56740
|
-
} catch {
|
|
56741
|
-
logger.debug(`[ImageBuilder] Base image ${adapter.image} missing. Building...`);
|
|
56742
|
-
await buildBaseImages2(this.docker, undefined, false, [adapter.name]);
|
|
56743
|
-
}
|
|
56744
|
-
logger.debug(`[ImageBuilder] Building custom image for ${adapter.name}...`);
|
|
56745
|
-
const dummyConfig = { dependencies: { [adapter.name]: normalizedDeps } };
|
|
56746
|
-
await buildCustomImages2(this.docker, dummyConfig, undefined, false);
|
|
56747
|
-
} else {
|
|
56748
|
-
logger.debug(`[ImageBuilder] Building base image for ${adapter.name}...`);
|
|
56749
|
-
await buildBaseImages2(this.docker, undefined, false, [adapter.name]);
|
|
56750
|
-
}
|
|
56751
|
-
}
|
|
56752
56702
|
this.imageCache.set(cacheKey, resolvedImage);
|
|
56753
56703
|
return resolvedImage;
|
|
56754
56704
|
}
|
|
@@ -57306,7 +57256,6 @@ class DockerIsol8 {
|
|
|
57306
57256
|
}
|
|
57307
57257
|
var import_dockerode, SANDBOX_WORKDIR = "/sandbox", MAX_OUTPUT_BYTES, PROXY_PORT = 8118, PROXY_STARTUP_TIMEOUT_MS = 5000, PROXY_POLL_INTERVAL_MS = 100;
|
|
57308
57258
|
var init_docker = __esm(() => {
|
|
57309
|
-
import_dockerode = __toESM(require_docker(), 1);
|
|
57310
57259
|
init_runtime();
|
|
57311
57260
|
init_logger();
|
|
57312
57261
|
init_audit();
|
|
@@ -57314,6 +57263,7 @@ var init_docker = __esm(() => {
|
|
|
57314
57263
|
init_default_seccomp_profile();
|
|
57315
57264
|
init_image_builder();
|
|
57316
57265
|
init_pool();
|
|
57266
|
+
import_dockerode = __toESM(require_docker(), 1);
|
|
57317
57267
|
MAX_OUTPUT_BYTES = 1024 * 1024;
|
|
57318
57268
|
});
|
|
57319
57269
|
|
|
@@ -57322,7 +57272,7 @@ var package_default;
|
|
|
57322
57272
|
var init_package = __esm(() => {
|
|
57323
57273
|
package_default = {
|
|
57324
57274
|
name: "isol8",
|
|
57325
|
-
version: "0.12.0
|
|
57275
|
+
version: "0.12.0",
|
|
57326
57276
|
description: "Secure code execution engine for AI agents",
|
|
57327
57277
|
author: "Illusion47586",
|
|
57328
57278
|
license: "MIT",
|
|
@@ -59954,7 +59904,7 @@ onetime.callCount = (function_) => {
|
|
|
59954
59904
|
};
|
|
59955
59905
|
var onetime_default = onetime;
|
|
59956
59906
|
|
|
59957
|
-
// node_modules/
|
|
59907
|
+
// node_modules/signal-exit/dist/mjs/signals.js
|
|
59958
59908
|
var signals = [];
|
|
59959
59909
|
signals.push("SIGHUP", "SIGINT", "SIGTERM");
|
|
59960
59910
|
if (process.platform !== "win32") {
|
|
@@ -59964,7 +59914,7 @@ if (process.platform === "linux") {
|
|
|
59964
59914
|
signals.push("SIGIO", "SIGPOLL", "SIGPWR", "SIGSTKFLT");
|
|
59965
59915
|
}
|
|
59966
59916
|
|
|
59967
|
-
// node_modules/
|
|
59917
|
+
// node_modules/signal-exit/dist/mjs/index.js
|
|
59968
59918
|
var processOk = (process3) => !!process3 && typeof process3 === "object" && typeof process3.removeListener === "function" && typeof process3.emit === "function" && typeof process3.reallyExit === "function" && typeof process3.listeners === "function" && typeof process3.kill === "function" && typeof process3.pid === "number" && typeof process3.on === "function";
|
|
59969
59919
|
var kExitEmitter = Symbol.for("signal-exit emitter");
|
|
59970
59920
|
var global2 = globalThis;
|
|
@@ -63080,7 +63030,13 @@ async function downloadServerBinary(binaryPath) {
|
|
|
63080
63030
|
logger.debug(`[Serve] Download URL: ${url}`);
|
|
63081
63031
|
const spinner = ora(`Downloading isol8 server v${VERSION}...`).start();
|
|
63082
63032
|
try {
|
|
63083
|
-
|
|
63033
|
+
let response = await fetch(url, { redirect: "follow" });
|
|
63034
|
+
if (response.status === 404) {
|
|
63035
|
+
const fallbackUrl = `https://github.com/Illusion47586/isol8/releases/latest/download/${binaryName}`;
|
|
63036
|
+
logger.debug(`[Serve] Binary not found for v${VERSION}, trying latest from ${fallbackUrl}`);
|
|
63037
|
+
spinner.text = `v${VERSION} not found, downloading latest available version...`;
|
|
63038
|
+
response = await fetch(fallbackUrl, { redirect: "follow" });
|
|
63039
|
+
}
|
|
63084
63040
|
if (!response.ok) {
|
|
63085
63041
|
spinner.fail(`Failed to download server binary (HTTP ${response.status})`);
|
|
63086
63042
|
if (response.status === 404) {
|
|
@@ -63615,4 +63571,4 @@ if (!process.argv.slice(2).length) {
|
|
|
63615
63571
|
}
|
|
63616
63572
|
program2.parse();
|
|
63617
63573
|
|
|
63618
|
-
//# debugId=
|
|
63574
|
+
//# debugId=0B5A0E438410953564756E2164756E21
|
package/dist/index.js
CHANGED
|
@@ -1,20 +1,4 @@
|
|
|
1
|
-
import { createRequire } from "node:module";
|
|
2
|
-
var __create = Object.create;
|
|
3
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
4
1
|
var __defProp = Object.defineProperty;
|
|
5
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
-
var __toESM = (mod, isNodeMode, target) => {
|
|
8
|
-
target = mod != null ? __create(__getProtoOf(mod)) : {};
|
|
9
|
-
const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
|
|
10
|
-
for (let key of __getOwnPropNames(mod))
|
|
11
|
-
if (!__hasOwnProp.call(to, key))
|
|
12
|
-
__defProp(to, key, {
|
|
13
|
-
get: () => mod[key],
|
|
14
|
-
enumerable: true
|
|
15
|
-
});
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
2
|
var __export = (target, all) => {
|
|
19
3
|
for (var name in all)
|
|
20
4
|
__defProp(target, name, {
|
|
@@ -25,7 +9,6 @@ var __export = (target, all) => {
|
|
|
25
9
|
});
|
|
26
10
|
};
|
|
27
11
|
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
28
|
-
var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
29
12
|
|
|
30
13
|
// src/runtime/adapter.ts
|
|
31
14
|
var adapters, extensionMap, RuntimeRegistry;
|
|
@@ -630,124 +613,9 @@ var init_default_seccomp_profile = __esm(() => {
|
|
|
630
613
|
});
|
|
631
614
|
});
|
|
632
615
|
|
|
633
|
-
// src/engine/utils.ts
|
|
634
|
-
var exports_utils = {};
|
|
635
|
-
__export(exports_utils, {
|
|
636
|
-
validatePackageName: () => validatePackageName,
|
|
637
|
-
truncateOutput: () => truncateOutput,
|
|
638
|
-
parseMemoryLimit: () => parseMemoryLimit,
|
|
639
|
-
maskSecrets: () => maskSecrets,
|
|
640
|
-
extractFromTar: () => extractFromTar,
|
|
641
|
-
createTarBuffer: () => createTarBuffer
|
|
642
|
-
});
|
|
643
|
-
function parseMemoryLimit(limit) {
|
|
644
|
-
const match = limit.match(/^(\d+(?:\.\d+)?)\s*([kmgt]?)b?$/i);
|
|
645
|
-
if (!match) {
|
|
646
|
-
throw new Error(`Invalid memory limit format: "${limit}". Use e.g. "512m", "1g".`);
|
|
647
|
-
}
|
|
648
|
-
const value = Number.parseFloat(match[1]);
|
|
649
|
-
const unit = (match[2] || "b").toLowerCase();
|
|
650
|
-
const multipliers = {
|
|
651
|
-
b: 1,
|
|
652
|
-
k: 1024,
|
|
653
|
-
m: 1024 ** 2,
|
|
654
|
-
g: 1024 ** 3,
|
|
655
|
-
t: 1024 ** 4
|
|
656
|
-
};
|
|
657
|
-
return Math.floor(value * (multipliers[unit] ?? 1));
|
|
658
|
-
}
|
|
659
|
-
function truncateOutput(output, maxBytes) {
|
|
660
|
-
const encoder = new TextEncoder;
|
|
661
|
-
const bytes = encoder.encode(output);
|
|
662
|
-
if (bytes.length <= maxBytes) {
|
|
663
|
-
return { text: output, truncated: false };
|
|
664
|
-
}
|
|
665
|
-
const decoder = new TextDecoder("utf-8", { fatal: false });
|
|
666
|
-
const truncated = decoder.decode(bytes.slice(0, maxBytes));
|
|
667
|
-
return {
|
|
668
|
-
text: `${truncated}
|
|
669
|
-
|
|
670
|
-
--- OUTPUT TRUNCATED (${bytes.length} bytes, limit: ${maxBytes}) ---`,
|
|
671
|
-
truncated: true
|
|
672
|
-
};
|
|
673
|
-
}
|
|
674
|
-
function maskSecrets(text, secrets) {
|
|
675
|
-
let result = text;
|
|
676
|
-
for (const value of Object.values(secrets)) {
|
|
677
|
-
if (value.length > 0) {
|
|
678
|
-
result = result.replaceAll(value, "***");
|
|
679
|
-
}
|
|
680
|
-
}
|
|
681
|
-
return result;
|
|
682
|
-
}
|
|
683
|
-
function createTarBuffer(filePath, content) {
|
|
684
|
-
const data = typeof content === "string" ? Buffer.from(content, "utf-8") : content;
|
|
685
|
-
const headerSize = 512;
|
|
686
|
-
const dataBlocks = Math.ceil(data.length / 512);
|
|
687
|
-
const totalSize = headerSize + dataBlocks * 512 + 1024;
|
|
688
|
-
const buf = Buffer.alloc(totalSize);
|
|
689
|
-
buf.write(filePath.replace(/^\//, ""), 0, 100, "utf-8");
|
|
690
|
-
buf.write("0000644\x00", 100, 8, "utf-8");
|
|
691
|
-
buf.write("0000000\x00", 108, 8, "utf-8");
|
|
692
|
-
buf.write("0000000\x00", 116, 8, "utf-8");
|
|
693
|
-
buf.write(`${data.length.toString(8).padStart(11, "0")}\x00`, 124, 12, "utf-8");
|
|
694
|
-
buf.write(`${Math.floor(Date.now() / 1000).toString(8).padStart(11, "0")}\x00`, 136, 12, "utf-8");
|
|
695
|
-
buf.write("0", 156, 1, "utf-8");
|
|
696
|
-
buf.write("ustar\x00", 257, 6, "utf-8");
|
|
697
|
-
buf.write("00", 263, 2, "utf-8");
|
|
698
|
-
buf.write(" ", 148, 8, "utf-8");
|
|
699
|
-
let checksum = 0;
|
|
700
|
-
for (let i = 0;i < headerSize; i++) {
|
|
701
|
-
checksum += buf[i];
|
|
702
|
-
}
|
|
703
|
-
buf.write(`${checksum.toString(8).padStart(6, "0")}\x00 `, 148, 8, "utf-8");
|
|
704
|
-
data.copy(buf, headerSize);
|
|
705
|
-
return buf;
|
|
706
|
-
}
|
|
707
|
-
function extractFromTar(tarBuffer, targetPath) {
|
|
708
|
-
const normalizedTarget = targetPath.replace(/^\//, "");
|
|
709
|
-
const basename = targetPath.split("/").pop() ?? targetPath;
|
|
710
|
-
let offset = 0;
|
|
711
|
-
while (offset < tarBuffer.length - 512) {
|
|
712
|
-
const nameEnd = tarBuffer.indexOf(0, offset);
|
|
713
|
-
const name = tarBuffer.subarray(offset, Math.min(nameEnd, offset + 100)).toString("utf-8");
|
|
714
|
-
if (name.length === 0) {
|
|
715
|
-
break;
|
|
716
|
-
}
|
|
717
|
-
const sizeStr = tarBuffer.subarray(offset + 124, offset + 136).toString("utf-8").trim();
|
|
718
|
-
const size = Number.parseInt(sizeStr, 8);
|
|
719
|
-
if (Number.isNaN(size)) {
|
|
720
|
-
break;
|
|
721
|
-
}
|
|
722
|
-
const dataStart = offset + 512;
|
|
723
|
-
const dataBlocks = Math.ceil(size / 512);
|
|
724
|
-
if (name === normalizedTarget || name.endsWith(`/${normalizedTarget}`) || name === basename) {
|
|
725
|
-
return Buffer.from(tarBuffer.subarray(dataStart, dataStart + size));
|
|
726
|
-
}
|
|
727
|
-
offset = dataStart + dataBlocks * 512;
|
|
728
|
-
}
|
|
729
|
-
throw new Error(`File "${targetPath}" not found in tar archive`);
|
|
730
|
-
}
|
|
731
|
-
function validatePackageName(name) {
|
|
732
|
-
if (!/^[@a-zA-Z0-9_./\-=]+$/.test(name)) {
|
|
733
|
-
throw new Error(`Invalid package name: "${name}". Only alphanumeric, -, _, ., /, @, and = are allowed.`);
|
|
734
|
-
}
|
|
735
|
-
return name;
|
|
736
|
-
}
|
|
737
|
-
|
|
738
616
|
// src/engine/image-builder.ts
|
|
739
|
-
var exports_image_builder = {};
|
|
740
|
-
__export(exports_image_builder, {
|
|
741
|
-
normalizePackages: () => normalizePackages,
|
|
742
|
-
imageExists: () => imageExists,
|
|
743
|
-
getCustomImageTag: () => getCustomImageTag,
|
|
744
|
-
ensureImages: () => ensureImages,
|
|
745
|
-
buildCustomImages: () => buildCustomImages,
|
|
746
|
-
buildBaseImages: () => buildBaseImages
|
|
747
|
-
});
|
|
748
617
|
import { createHash as createHash2 } from "node:crypto";
|
|
749
618
|
import { existsSync as existsSync3, readFileSync as readFileSync2 } from "node:fs";
|
|
750
|
-
import { join as join3 } from "node:path";
|
|
751
619
|
function resolveDockerDir() {
|
|
752
620
|
const fromBundled = new URL("./docker", import.meta.url).pathname;
|
|
753
621
|
if (existsSync3(fromBundled)) {
|
|
@@ -755,19 +623,6 @@ function resolveDockerDir() {
|
|
|
755
623
|
}
|
|
756
624
|
return new URL("../../docker", import.meta.url).pathname;
|
|
757
625
|
}
|
|
758
|
-
function computeDockerDirHash() {
|
|
759
|
-
const hash = createHash2("sha256");
|
|
760
|
-
const files = [...DOCKER_BUILD_FILES].sort();
|
|
761
|
-
for (const file of files) {
|
|
762
|
-
const filePath = join3(DOCKERFILE_DIR, file);
|
|
763
|
-
if (existsSync3(filePath)) {
|
|
764
|
-
const content = readFileSync2(filePath);
|
|
765
|
-
hash.update(file);
|
|
766
|
-
hash.update(content);
|
|
767
|
-
}
|
|
768
|
-
}
|
|
769
|
-
return hash.digest("hex");
|
|
770
|
-
}
|
|
771
626
|
function computeDepsHash(runtime, packages) {
|
|
772
627
|
const hash = createHash2("sha256");
|
|
773
628
|
hash.update(runtime);
|
|
@@ -785,206 +640,11 @@ function getCustomImageTag(runtime, packages) {
|
|
|
785
640
|
const shortHash = depsHash.slice(0, 12);
|
|
786
641
|
return `isol8:${runtime}-custom-${shortHash}`;
|
|
787
642
|
}
|
|
788
|
-
|
|
789
|
-
try {
|
|
790
|
-
const image = docker.getImage(imageName);
|
|
791
|
-
const inspect = await image.inspect();
|
|
792
|
-
return inspect.Config?.Labels ?? {};
|
|
793
|
-
} catch {
|
|
794
|
-
return null;
|
|
795
|
-
}
|
|
796
|
-
}
|
|
797
|
-
async function removeImage(docker, imageId) {
|
|
798
|
-
try {
|
|
799
|
-
const image = docker.getImage(imageId);
|
|
800
|
-
await image.remove();
|
|
801
|
-
logger.debug(`[ImageBuilder] Removed old image: ${imageId.slice(0, 12)}`);
|
|
802
|
-
} catch (err) {
|
|
803
|
-
logger.debug(`[ImageBuilder] Could not remove image ${imageId.slice(0, 12)}: ${err}`);
|
|
804
|
-
}
|
|
805
|
-
}
|
|
806
|
-
async function buildBaseImages(docker, onProgress, force = false, onlyRuntimes) {
|
|
807
|
-
const allRuntimes = RuntimeRegistry.list();
|
|
808
|
-
const runtimes = onlyRuntimes ? allRuntimes.filter((r) => onlyRuntimes.includes(r.name)) : allRuntimes;
|
|
809
|
-
const dockerHash = computeDockerDirHash();
|
|
810
|
-
logger.debug(`[ImageBuilder] Docker directory hash: ${dockerHash.slice(0, 16)}...`);
|
|
811
|
-
for (const adapter of runtimes) {
|
|
812
|
-
const target = adapter.name;
|
|
813
|
-
const imageName = adapter.image;
|
|
814
|
-
if (!force) {
|
|
815
|
-
const labels = await getImageLabels(docker, imageName);
|
|
816
|
-
if (labels && labels[LABELS.dockerHash] === dockerHash) {
|
|
817
|
-
logger.debug(`[ImageBuilder] Base image ${target} is up to date, skipping build`);
|
|
818
|
-
onProgress?.({ runtime: target, status: "done", message: "Up to date" });
|
|
819
|
-
continue;
|
|
820
|
-
}
|
|
821
|
-
}
|
|
822
|
-
let oldImageId = null;
|
|
823
|
-
try {
|
|
824
|
-
const oldImage = await docker.getImage(imageName).inspect();
|
|
825
|
-
oldImageId = oldImage.Id;
|
|
826
|
-
logger.debug(`[ImageBuilder] Existing image ${target} ID: ${oldImageId.slice(0, 12)}`);
|
|
827
|
-
} catch {
|
|
828
|
-
logger.debug(`[ImageBuilder] No existing image for ${target}`);
|
|
829
|
-
}
|
|
830
|
-
onProgress?.({ runtime: target, status: "building" });
|
|
831
|
-
try {
|
|
832
|
-
const stream = await docker.buildImage({ context: DOCKERFILE_DIR, src: DOCKER_BUILD_FILES }, {
|
|
833
|
-
t: imageName,
|
|
834
|
-
target,
|
|
835
|
-
dockerfile: "Dockerfile",
|
|
836
|
-
labels: {
|
|
837
|
-
[LABELS.dockerHash]: dockerHash
|
|
838
|
-
}
|
|
839
|
-
});
|
|
840
|
-
await new Promise((resolve2, reject) => {
|
|
841
|
-
docker.modem.followProgress(stream, (err) => {
|
|
842
|
-
if (err) {
|
|
843
|
-
reject(err);
|
|
844
|
-
} else {
|
|
845
|
-
resolve2();
|
|
846
|
-
}
|
|
847
|
-
});
|
|
848
|
-
});
|
|
849
|
-
if (oldImageId) {
|
|
850
|
-
await removeImage(docker, oldImageId);
|
|
851
|
-
}
|
|
852
|
-
onProgress?.({ runtime: target, status: "done" });
|
|
853
|
-
} catch (err) {
|
|
854
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
855
|
-
onProgress?.({ runtime: target, status: "error", message });
|
|
856
|
-
throw new Error(`Failed to build image for ${target}: ${message}`);
|
|
857
|
-
}
|
|
858
|
-
}
|
|
859
|
-
}
|
|
860
|
-
async function buildCustomImages(docker, config, onProgress, force = false) {
|
|
861
|
-
const deps = config.dependencies;
|
|
862
|
-
const python = deps.python ? normalizePackages(deps.python) : [];
|
|
863
|
-
const node = deps.node ? normalizePackages(deps.node) : [];
|
|
864
|
-
const bun = deps.bun ? normalizePackages(deps.bun) : [];
|
|
865
|
-
const deno = deps.deno ? normalizePackages(deps.deno) : [];
|
|
866
|
-
const bash = deps.bash ? normalizePackages(deps.bash) : [];
|
|
867
|
-
if (python.length) {
|
|
868
|
-
await buildCustomImage(docker, "python", python, onProgress, force);
|
|
869
|
-
}
|
|
870
|
-
if (node.length) {
|
|
871
|
-
await buildCustomImage(docker, "node", node, onProgress, force);
|
|
872
|
-
}
|
|
873
|
-
if (bun.length) {
|
|
874
|
-
await buildCustomImage(docker, "bun", bun, onProgress, force);
|
|
875
|
-
}
|
|
876
|
-
if (deno.length) {
|
|
877
|
-
await buildCustomImage(docker, "deno", deno, onProgress, force);
|
|
878
|
-
}
|
|
879
|
-
if (bash.length) {
|
|
880
|
-
await buildCustomImage(docker, "bash", bash, onProgress, force);
|
|
881
|
-
}
|
|
882
|
-
}
|
|
883
|
-
async function buildCustomImage(docker, runtime, packages, onProgress, force = false) {
|
|
884
|
-
const normalizedPackages = normalizePackages(packages);
|
|
885
|
-
const tag = getCustomImageTag(runtime, normalizedPackages);
|
|
886
|
-
const depsHash = computeDepsHash(runtime, normalizedPackages);
|
|
887
|
-
logger.debug(`[ImageBuilder] ${runtime} custom deps hash: ${depsHash.slice(0, 16)}...`);
|
|
888
|
-
if (!force) {
|
|
889
|
-
const labels = await getImageLabels(docker, tag);
|
|
890
|
-
if (labels && labels[LABELS.depsHash] === depsHash) {
|
|
891
|
-
logger.debug(`[ImageBuilder] Custom image ${runtime} is up to date, skipping build`);
|
|
892
|
-
onProgress?.({ runtime, status: "done", message: "Up to date" });
|
|
893
|
-
return;
|
|
894
|
-
}
|
|
895
|
-
}
|
|
896
|
-
let oldImageId = null;
|
|
897
|
-
try {
|
|
898
|
-
const oldImage = await docker.getImage(tag).inspect();
|
|
899
|
-
oldImageId = oldImage.Id;
|
|
900
|
-
logger.debug(`[ImageBuilder] Existing custom image ${runtime} ID: ${oldImageId.slice(0, 12)}`);
|
|
901
|
-
} catch {
|
|
902
|
-
logger.debug(`[ImageBuilder] No existing custom image for ${runtime}`);
|
|
903
|
-
}
|
|
904
|
-
onProgress?.({
|
|
905
|
-
runtime,
|
|
906
|
-
status: "building",
|
|
907
|
-
message: `Custom: ${normalizedPackages.join(", ")}`
|
|
908
|
-
});
|
|
909
|
-
let installCmd;
|
|
910
|
-
switch (runtime) {
|
|
911
|
-
case "python":
|
|
912
|
-
installCmd = `RUN pip install --no-cache-dir ${normalizedPackages.join(" ")}`;
|
|
913
|
-
break;
|
|
914
|
-
case "node":
|
|
915
|
-
installCmd = `RUN npm install -g ${normalizedPackages.join(" ")}`;
|
|
916
|
-
break;
|
|
917
|
-
case "bun":
|
|
918
|
-
installCmd = `RUN bun install -g ${normalizedPackages.join(" ")}`;
|
|
919
|
-
break;
|
|
920
|
-
case "deno":
|
|
921
|
-
installCmd = normalizedPackages.map((p) => `RUN deno cache ${p}`).join(`
|
|
922
|
-
`);
|
|
923
|
-
break;
|
|
924
|
-
case "bash":
|
|
925
|
-
installCmd = `RUN apk add --no-cache ${normalizedPackages.join(" ")}`;
|
|
926
|
-
break;
|
|
927
|
-
default:
|
|
928
|
-
throw new Error(`Unknown runtime: ${runtime}`);
|
|
929
|
-
}
|
|
930
|
-
const dockerfileContent = `FROM isol8:${runtime}
|
|
931
|
-
${installCmd}
|
|
932
|
-
`;
|
|
933
|
-
const { createTarBuffer: createTarBuffer2, validatePackageName: validatePackageName2 } = await Promise.resolve().then(() => exports_utils);
|
|
934
|
-
const { Readable } = await import("node:stream");
|
|
935
|
-
normalizedPackages.forEach(validatePackageName2);
|
|
936
|
-
const tarBuffer = createTarBuffer2("Dockerfile", dockerfileContent);
|
|
937
|
-
const stream = await docker.buildImage(Readable.from(tarBuffer), {
|
|
938
|
-
t: tag,
|
|
939
|
-
dockerfile: "Dockerfile",
|
|
940
|
-
labels: {
|
|
941
|
-
[LABELS.depsHash]: depsHash
|
|
942
|
-
}
|
|
943
|
-
});
|
|
944
|
-
await new Promise((resolve2, reject) => {
|
|
945
|
-
docker.modem.followProgress(stream, (err) => {
|
|
946
|
-
if (err) {
|
|
947
|
-
reject(err);
|
|
948
|
-
} else {
|
|
949
|
-
resolve2();
|
|
950
|
-
}
|
|
951
|
-
});
|
|
952
|
-
});
|
|
953
|
-
if (oldImageId) {
|
|
954
|
-
await removeImage(docker, oldImageId);
|
|
955
|
-
}
|
|
956
|
-
onProgress?.({ runtime, status: "done" });
|
|
957
|
-
}
|
|
958
|
-
async function imageExists(docker, imageName) {
|
|
959
|
-
try {
|
|
960
|
-
await docker.getImage(imageName).inspect();
|
|
961
|
-
return true;
|
|
962
|
-
} catch {
|
|
963
|
-
return false;
|
|
964
|
-
}
|
|
965
|
-
}
|
|
966
|
-
async function ensureImages(docker, onProgress) {
|
|
967
|
-
const runtimes = RuntimeRegistry.list();
|
|
968
|
-
const missing = [];
|
|
969
|
-
for (const adapter of runtimes) {
|
|
970
|
-
if (!await imageExists(docker, adapter.image)) {
|
|
971
|
-
missing.push(adapter.name);
|
|
972
|
-
}
|
|
973
|
-
}
|
|
974
|
-
if (missing.length > 0) {
|
|
975
|
-
await buildBaseImages(docker, onProgress, false, missing);
|
|
976
|
-
}
|
|
977
|
-
}
|
|
978
|
-
var DOCKERFILE_DIR, LABELS, DOCKER_BUILD_FILES;
|
|
643
|
+
var DOCKERFILE_DIR;
|
|
979
644
|
var init_image_builder = __esm(() => {
|
|
980
645
|
init_runtime();
|
|
981
646
|
init_logger();
|
|
982
647
|
DOCKERFILE_DIR = resolveDockerDir();
|
|
983
|
-
LABELS = {
|
|
984
|
-
dockerHash: "org.isol8.build.hash",
|
|
985
|
-
depsHash: "org.isol8.deps.hash"
|
|
986
|
-
};
|
|
987
|
-
DOCKER_BUILD_FILES = ["Dockerfile", "proxy.sh", "proxy-handler.sh"];
|
|
988
648
|
});
|
|
989
649
|
|
|
990
650
|
// src/engine/pool.ts
|
|
@@ -1266,6 +926,96 @@ function calculateResourceDelta(before, after) {
|
|
|
1266
926
|
};
|
|
1267
927
|
}
|
|
1268
928
|
|
|
929
|
+
// src/engine/utils.ts
|
|
930
|
+
function parseMemoryLimit(limit) {
|
|
931
|
+
const match = limit.match(/^(\d+(?:\.\d+)?)\s*([kmgt]?)b?$/i);
|
|
932
|
+
if (!match) {
|
|
933
|
+
throw new Error(`Invalid memory limit format: "${limit}". Use e.g. "512m", "1g".`);
|
|
934
|
+
}
|
|
935
|
+
const value = Number.parseFloat(match[1]);
|
|
936
|
+
const unit = (match[2] || "b").toLowerCase();
|
|
937
|
+
const multipliers = {
|
|
938
|
+
b: 1,
|
|
939
|
+
k: 1024,
|
|
940
|
+
m: 1024 ** 2,
|
|
941
|
+
g: 1024 ** 3,
|
|
942
|
+
t: 1024 ** 4
|
|
943
|
+
};
|
|
944
|
+
return Math.floor(value * (multipliers[unit] ?? 1));
|
|
945
|
+
}
|
|
946
|
+
function truncateOutput(output, maxBytes) {
|
|
947
|
+
const encoder = new TextEncoder;
|
|
948
|
+
const bytes = encoder.encode(output);
|
|
949
|
+
if (bytes.length <= maxBytes) {
|
|
950
|
+
return { text: output, truncated: false };
|
|
951
|
+
}
|
|
952
|
+
const decoder = new TextDecoder("utf-8", { fatal: false });
|
|
953
|
+
const truncated = decoder.decode(bytes.slice(0, maxBytes));
|
|
954
|
+
return {
|
|
955
|
+
text: `${truncated}
|
|
956
|
+
|
|
957
|
+
--- OUTPUT TRUNCATED (${bytes.length} bytes, limit: ${maxBytes}) ---`,
|
|
958
|
+
truncated: true
|
|
959
|
+
};
|
|
960
|
+
}
|
|
961
|
+
function maskSecrets(text, secrets) {
|
|
962
|
+
let result = text;
|
|
963
|
+
for (const value of Object.values(secrets)) {
|
|
964
|
+
if (value.length > 0) {
|
|
965
|
+
result = result.replaceAll(value, "***");
|
|
966
|
+
}
|
|
967
|
+
}
|
|
968
|
+
return result;
|
|
969
|
+
}
|
|
970
|
+
function createTarBuffer(filePath, content) {
|
|
971
|
+
const data = typeof content === "string" ? Buffer.from(content, "utf-8") : content;
|
|
972
|
+
const headerSize = 512;
|
|
973
|
+
const dataBlocks = Math.ceil(data.length / 512);
|
|
974
|
+
const totalSize = headerSize + dataBlocks * 512 + 1024;
|
|
975
|
+
const buf = Buffer.alloc(totalSize);
|
|
976
|
+
buf.write(filePath.replace(/^\//, ""), 0, 100, "utf-8");
|
|
977
|
+
buf.write("0000644\x00", 100, 8, "utf-8");
|
|
978
|
+
buf.write("0000000\x00", 108, 8, "utf-8");
|
|
979
|
+
buf.write("0000000\x00", 116, 8, "utf-8");
|
|
980
|
+
buf.write(`${data.length.toString(8).padStart(11, "0")}\x00`, 124, 12, "utf-8");
|
|
981
|
+
buf.write(`${Math.floor(Date.now() / 1000).toString(8).padStart(11, "0")}\x00`, 136, 12, "utf-8");
|
|
982
|
+
buf.write("0", 156, 1, "utf-8");
|
|
983
|
+
buf.write("ustar\x00", 257, 6, "utf-8");
|
|
984
|
+
buf.write("00", 263, 2, "utf-8");
|
|
985
|
+
buf.write(" ", 148, 8, "utf-8");
|
|
986
|
+
let checksum = 0;
|
|
987
|
+
for (let i = 0;i < headerSize; i++) {
|
|
988
|
+
checksum += buf[i];
|
|
989
|
+
}
|
|
990
|
+
buf.write(`${checksum.toString(8).padStart(6, "0")}\x00 `, 148, 8, "utf-8");
|
|
991
|
+
data.copy(buf, headerSize);
|
|
992
|
+
return buf;
|
|
993
|
+
}
|
|
994
|
+
function extractFromTar(tarBuffer, targetPath) {
|
|
995
|
+
const normalizedTarget = targetPath.replace(/^\//, "");
|
|
996
|
+
const basename = targetPath.split("/").pop() ?? targetPath;
|
|
997
|
+
let offset = 0;
|
|
998
|
+
while (offset < tarBuffer.length - 512) {
|
|
999
|
+
const nameEnd = tarBuffer.indexOf(0, offset);
|
|
1000
|
+
const name = tarBuffer.subarray(offset, Math.min(nameEnd, offset + 100)).toString("utf-8");
|
|
1001
|
+
if (name.length === 0) {
|
|
1002
|
+
break;
|
|
1003
|
+
}
|
|
1004
|
+
const sizeStr = tarBuffer.subarray(offset + 124, offset + 136).toString("utf-8").trim();
|
|
1005
|
+
const size = Number.parseInt(sizeStr, 8);
|
|
1006
|
+
if (Number.isNaN(size)) {
|
|
1007
|
+
break;
|
|
1008
|
+
}
|
|
1009
|
+
const dataStart = offset + 512;
|
|
1010
|
+
const dataBlocks = Math.ceil(size / 512);
|
|
1011
|
+
if (name === normalizedTarget || name.endsWith(`/${normalizedTarget}`) || name === basename) {
|
|
1012
|
+
return Buffer.from(tarBuffer.subarray(dataStart, dataStart + size));
|
|
1013
|
+
}
|
|
1014
|
+
offset = dataStart + dataBlocks * 512;
|
|
1015
|
+
}
|
|
1016
|
+
throw new Error(`File "${targetPath}" not found in tar archive`);
|
|
1017
|
+
}
|
|
1018
|
+
|
|
1269
1019
|
// src/engine/docker.ts
|
|
1270
1020
|
var exports_docker = {};
|
|
1271
1021
|
__export(exports_docker, {
|
|
@@ -1874,26 +1624,6 @@ class DockerIsol8 {
|
|
|
1874
1624
|
resolvedImage = legacyCustomTag;
|
|
1875
1625
|
} catch {}
|
|
1876
1626
|
}
|
|
1877
|
-
try {
|
|
1878
|
-
await this.docker.getImage(resolvedImage).inspect();
|
|
1879
|
-
} catch {
|
|
1880
|
-
logger.debug(`[ImageBuilder] Image ${resolvedImage} not found. Building...`);
|
|
1881
|
-
const { buildBaseImages: buildBaseImages2, buildCustomImages: buildCustomImages2 } = await Promise.resolve().then(() => (init_image_builder(), exports_image_builder));
|
|
1882
|
-
if (resolvedImage !== adapter.image && normalizedDeps.length > 0) {
|
|
1883
|
-
try {
|
|
1884
|
-
await this.docker.getImage(adapter.image).inspect();
|
|
1885
|
-
} catch {
|
|
1886
|
-
logger.debug(`[ImageBuilder] Base image ${adapter.image} missing. Building...`);
|
|
1887
|
-
await buildBaseImages2(this.docker, undefined, false, [adapter.name]);
|
|
1888
|
-
}
|
|
1889
|
-
logger.debug(`[ImageBuilder] Building custom image for ${adapter.name}...`);
|
|
1890
|
-
const dummyConfig = { dependencies: { [adapter.name]: normalizedDeps } };
|
|
1891
|
-
await buildCustomImages2(this.docker, dummyConfig, undefined, false);
|
|
1892
|
-
} else {
|
|
1893
|
-
logger.debug(`[ImageBuilder] Building base image for ${adapter.name}...`);
|
|
1894
|
-
await buildBaseImages2(this.docker, undefined, false, [adapter.name]);
|
|
1895
|
-
}
|
|
1896
|
-
}
|
|
1897
1627
|
this.imageCache.set(cacheKey, resolvedImage);
|
|
1898
1628
|
return resolvedImage;
|
|
1899
1629
|
}
|
|
@@ -2715,7 +2445,7 @@ init_logger();
|
|
|
2715
2445
|
// package.json
|
|
2716
2446
|
var package_default = {
|
|
2717
2447
|
name: "isol8",
|
|
2718
|
-
version: "0.12.0
|
|
2448
|
+
version: "0.12.0",
|
|
2719
2449
|
description: "Secure code execution engine for AI agents",
|
|
2720
2450
|
author: "Illusion47586",
|
|
2721
2451
|
license: "MIT",
|
|
@@ -3148,4 +2878,4 @@ export {
|
|
|
3148
2878
|
BunAdapter
|
|
3149
2879
|
};
|
|
3150
2880
|
|
|
3151
|
-
//# debugId=
|
|
2881
|
+
//# debugId=3AEBA9C5B41F55B064756E2164756E21
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../../src/engine/docker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,MAAM,MAAM,WAAW,CAAC;AAG/B,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EAEf,WAAW,EAEX,YAAY,EAKZ,YAAY,EACZ,WAAW,EACZ,MAAM,UAAU,CAAC;AAuWlB,2HAA2H;AAC3H,MAAM,WAAW,kBAAmB,SAAQ,YAAY;IACtD,oFAAoF;IACpF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,WAAY,YAAW,WAAW;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAY;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;IACtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAsB;IACrD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;IACrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoB;IACjD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4C;IACrE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoB;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAc;IAC3C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IAEpD,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,iBAAiB,CAA+B;IACxD,OAAO,CAAC,IAAI,CAA8B;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;YAE1C,uBAAuB;IA6BrC;;;OAGG;gBACS,OAAO,GAAE,kBAAuB,EAAE,aAAa,SAAK;IA4ChE;;;;;OAKG;IACG,KAAK,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsCtD,kFAAkF;IAC5E,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB3B;;;OAGG;IACG,OAAO,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAgB9D;;OAEG;YACW,WAAW;IAoDzB;;OAEG;YACW,qBAAqB;IA8CnC;;OAEG;YACW,kBAAkB;IA+DhC;;;;;;;OAOG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYpE;;;;;;OAMG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmB5C,6GAA6G;IAC7G,IAAI,WAAW,IAAI,MAAM,GAAG,IAAI,CAE/B;IAED;;;OAGG;IACI,aAAa,CAAC,GAAG,EAAE,gBAAgB,GAAG,aAAa,CAAC,WAAW,CAAC;YAuFzD,YAAY;
|
|
1
|
+
{"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../../src/engine/docker.ts"],"names":[],"mappings":"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"}
|
|
@@ -43,7 +43,7 @@ type ProgressCallback = (progress: BuildProgress) => void;
|
|
|
43
43
|
* @param onProgress - Optional callback for build progress updates.
|
|
44
44
|
* @param force - If true, always rebuild even if image is up to date.
|
|
45
45
|
*/
|
|
46
|
-
export declare function buildBaseImages(docker: Docker, onProgress?: ProgressCallback, force?: boolean
|
|
46
|
+
export declare function buildBaseImages(docker: Docker, onProgress?: ProgressCallback, force?: boolean): Promise<void>;
|
|
47
47
|
/**
|
|
48
48
|
* Builds custom images with user-specified dependencies layered on top of
|
|
49
49
|
* the base images. Reads package lists from the config's `dependencies` field.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-builder.d.ts","sourceRoot":"","sources":["../../../src/engine/image-builder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,MAAM,MAAM,WAAW,CAAC;AAEpC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAmE5C;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAE9D;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAK7E;AAkCD,mDAAmD;AACnD,UAAU,aAAa;IACrB,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,4BAA4B;IAC5B,MAAM,EAAE,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC;IACtC,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,KAAK,gBAAgB,GAAG,CAAC,QAAQ,EAAE,aAAa,KAAK,IAAI,CAAC;AAE1D;;;;;;;;;;;GAWG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,gBAAgB,EAC7B,KAAK,UAAQ,
|
|
1
|
+
{"version":3,"file":"image-builder.d.ts","sourceRoot":"","sources":["../../../src/engine/image-builder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,MAAM,MAAM,WAAW,CAAC;AAEpC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAmE5C;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAE9D;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAK7E;AAkCD,mDAAmD;AACnD,UAAU,aAAa;IACrB,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,4BAA4B;IAC5B,MAAM,EAAE,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC;IACtC,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,KAAK,gBAAgB,GAAG,CAAC,QAAQ,EAAE,aAAa,KAAK,IAAI,CAAC;AAE1D;;;;;;;;;;;GAWG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,gBAAgB,EAC7B,KAAK,UAAQ,GACZ,OAAO,CAAC,IAAI,CAAC,CAoEf;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,WAAW,EACnB,UAAU,CAAC,EAAE,gBAAgB,EAC7B,KAAK,UAAQ,GACZ,OAAO,CAAC,IAAI,CAAC,CAwBf;AAqGD;;GAEG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOrF;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAa/F"}
|
package/package.json
CHANGED